Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/java/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/java/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/java/README.txt	(revision 1126)
@@ -0,0 +1,8 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+For each class you are going to test, create one Test class with the same
+name as the class to test, ending with Test.
+
+For example, the unit tests of the "ExampleLibrary" class are performed
+by the "ExampleLibraryTest" class.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/resources/log4j.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/resources/log4j.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/resources/log4j.xml	(revision 1126)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- 
+Log4J configuration file for unit tests execution.
+ -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appender configuration to show logging messages through the console -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
+		</layout>
+	</appender>
+
+	<!-- 
+	Activate logging messages of DEBUG level of higher only for the
+	DefaultExampleManager class.
+	You can put full classes names or packages instead, to configure
+	logging for all the classes and subpackages of the package.
+	-->
+	<category name="org.gvsig.scripting.impl.DefaultExampleManager">
+		<priority value="DEBUG" />
+	</category>
+
+	<!-- 
+	By default, show only logging messages of INFO level or higher, 
+	through the previously configured CONSOLE appender. 
+	-->
+	<root>
+		<priority value="INFO" />
+		<appender-ref ref="CONSOLE" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/test/resources/README.txt	(revision 1126)
@@ -0,0 +1,11 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+Put into this folder the resources needed by your test classes.
+
+This folder is added to the Tests classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, in this folder you can find an example of log4j configuration,
+prepared to log messages through the console, so logging works when you
+run your tests classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/javadoc/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/javadoc/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/javadoc/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/impl/scripts/Test.groovy
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/impl/scripts/Test.groovy	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/impl/scripts/Test.groovy	(revision 1126)
@@ -0,0 +1,14 @@
+/**
+ * package com.disid.groovygis 
+ */
+
+
+/**
+ *
+ */
+class Test {
+
+	static main(args) {
+		println "Hello world"
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/scolab-logo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/scolab-logo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/iver-logo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/iver-logo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/scolab.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/scolab.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/scolab.html	(revision 1126)
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+<img src="scolab-logo.png"><br>
+
+<h2>Software Colaborativo</h2>
+<br>
+
+<p>EN CONSTRUCCION</p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gvsig-logo1-association.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gvsig-logo1-association.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/iver.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/iver.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/iver.html	(revision 1126)
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+<img src="iver-logo.png"><br>
+
+<h2>IVER</h2>
+<br>
+
+<p>EN CONSTRUCCION</p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/csgis-logo.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/csgis-logo.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/csgis.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/csgis.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/csgis.html	(revision 1126)
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+<img src="csgis-logo.gif"><br>
+
+<h2>CSGIS</h2>
+<br>
+
+<p>EN CONSTRUCCION</p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/disid-logo.jpeg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/disid-logo.jpeg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gva-logo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gva-logo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/disid.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/disid.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/disid.html	(revision 1126)
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+<img src="disid-logo.jpeg"><br>
+
+<h2>DiSiD Technologies</h2>
+<br>
+
+<p>EN CONSTRUCCION</p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gva.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gva.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gva.html	(revision 1126)
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+<img src="gva-logo_horiz_bicolor.png"><br>
+
+<h2>GVA</h2>
+<br>
+
+<p>EN CONSTRUCCION</p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/prodevelop-logo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/prodevelop-logo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gva-logo_horiz_bicolor.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gva-logo_horiz_bicolor.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gvsig.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gvsig.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/gvsig.html	(revision 1126)
@@ -0,0 +1,45 @@
+<html>
+<body>
+
+<img src="gvsig-logo1-association.jpg"><br>
+<h2>gvSIG desktop</h2>
+<p>
+A Geographic Information System (GIS) for desktop environments<br>
+<br>
+Version: %(version)<br>
+Build: %(build)<br>
+&copy; Copyright gvSIG Association. All rights reserved.<br>
+<br>
+For more information, contact:<a href="http://www.gvsig.com/contact-info">http://www.gvsig.com/contact-info</a><br>
+Or visit <a href="http://www.gvsig.org">http://www.gvsig.org</a>
+</p>
+<br>
+<br>
+<br>
+<font face="Arial, Helvetica, sans-serif"> 
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+<br>
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more dlogo.jpgetails.<br>
+<br>
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
+<br>
+
+<p>Agradecimientos:</p>
+<ul>
+	<li><a target="blank" href="http://www.gvsig.org/web/community/agradecimientos/traductores/">Traductores</a></li>
+	<li><a target="blank" href="http://www.gvsig.org/web/community/agradecimientos/testers/">Testers</a></li>
+	<li><a target="blank" href="http://www.gvsig.org/web/community/agradecimientos/otras-colaboraciones/">Otras colaboraciones</a></li>
+</ul>
+      
+
+</font>
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/prodevelop.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/prodevelop.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/main/prodevelop.html	(revision 1126)
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+<img src="prodevelop-logo.png"><br>
+
+<h2>PRODEVELOP</h2>
+<br>
+
+<p>EN CONSTRUCCION</p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/help.hs
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/help.hs	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/help.hs	(revision 1126)
@@ -0,0 +1,57 @@
+<?xml version='1.0' encoding='ISO-8859-1' ?>
+<!DOCTYPE helpset
+  PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp HelpSet Version 1.0//EN"
+ 		  "http://java.sun.com/products/javahelp/helpset_1_0.dtd">
+
+<?TestTarget this is data for the test target ?>
+
+<helpset version="1.0">
+
+  <!-- title -->
+  <title>ScriptingFramework</title>
+
+  <!-- maps -->
+  <maps>
+     <homeID>main</homeID>
+     <mapref location="help.jhm"/>
+  </maps>
+
+  <!-- views -->
+  <view>
+    <name>TOC</name>
+    <label>TOC</label>
+    <type>javax.help.TOCView</type>
+    <data>toc.xml</data>
+  </view>
+  <!--
+  <view> <name>Index</name>
+	 <label>Indice</label>
+	 <type>javax.help.IndexView</type>
+	 <data>index.xml</data>
+	</view>
+  
+  <view>
+	 <name>Search</name>
+	 <label>Busqueda</label>
+	 <type>javax.help.SearchView</type>
+  </view>
+  
+  -->
+  <view>
+    <name>Favorites</name>
+    <label>Favoritos</label>
+    <type>javax.help.FavoritesView</type>
+  </view>
+
+  <presentation default="true" displayviewimages="false">
+     <name>main window</name>
+     <size width="700" height="400" />
+     <location x="200" y="200" />
+     <title>gvSIG - Ayuda en linea</title>
+     <image>toplevelfolder</image>
+     <toolbar>
+       <helpaction image="action.back">javax.help.BackAction</helpaction>
+       <helpaction image="action.forward">javax.help.ForwardAction</helpaction>
+     </toolbar>
+  </presentation>
+</helpset>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/introduction.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/introduction.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/introduction.html	(revision 1126)
@@ -0,0 +1,3 @@
+<html>
+<h1>Hola</h1>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/toc.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/toc.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/toc.xml	(revision 1126)
@@ -0,0 +1,9 @@
+<!DOCTYPE toc
+  PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp TOC Version 1.0//EN"
+             "http://java.sun.com/products/javahelp/toc_1_0.dtd">
+
+<toc version="1.0">
+	<tocitem text="gvSIG scripting framework">
+		<tocitem text="Introduction" target="introduction.html"/>
+	</tocitem>
+</toc>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/help.jhm
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/help.jhm	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/org/gvsig/scripting/help/help.jhm	(revision 1126)
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='ISO-8859-1' ?>
+<!DOCTYPE map
+  PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN"
+         "http://java.sun.com/products/javahelp/map_1_0.dtd">
+
+<map version="1.0">
+	<mapID target="introduction.html" url="introduction.html" />
+</map>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/README.txt	(revision 1126)
@@ -0,0 +1,7 @@
+Put into this folder the resources needed by your library classes.
+
+This folder is added to the runtime classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, into this folder you can find some examples of resource bundle 
+property files that may be used by your library classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/log4j.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/log4j.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/resources/log4j.xml	(revision 1126)
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- 
+Log4J configuration file for unit tests execution.
+ -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appender configuration to show logging messages through the console -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
+		</layout>
+	</appender>
+
+	<!-- 
+	Activate logging messages of DEBUG level of higher only for the
+	org.gvsig.tools packages.
+	You can put full classes names or packages instead, to configure
+	logging for all the classes and subpackages of the package.
+	-->
+	<category name="org.gvsig.tools">
+		<priority value="DEBUG" />
+	</category>
+	<category name="org.gvsig.scripting">
+		<priority value="DEBUG" />
+	</category>
+
+	<!-- 
+	By default, show only logging messages of INFO level or higher, 
+	through the previously configured CONSOLE appender. 
+	-->
+	<root>
+		<priority value="INFO" />
+		<appender-ref ref="CONSOLE" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/java/org/gvsig/scripting/main/Main.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/java/org/gvsig/scripting/main/Main.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/src/main/java/org/gvsig/scripting/main/Main.java	(revision 1126)
@@ -0,0 +1,239 @@
+package org.gvsig.scripting.main;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.net.URL;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import javax.swing.JComponent;
+
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.WindowConstants;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+import org.gvsig.about.AboutLocator;
+import org.gvsig.about.AboutManager;
+import org.gvsig.scripting.ScriptingDialog;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
+
+public class Main {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -6853523688803006280L;
+	ScriptingUIManager uimanager;
+	AboutManager aboutManager;
+	ScriptingManager manager;
+
+	public static void main(String args[]) {
+		Main main = new Main();
+		main.doMain(args);
+	}
+
+	private void initializeAbout() {
+		aboutManager = AboutLocator.getManager();
+
+		Map<String, String> gvsig_vars = new HashMap<String, String>();
+		gvsig_vars.put("version", "2.0.0");
+		gvsig_vars.put("build", "2020");
+		aboutManager.setProject("gvSIG Desktop", getResource("gvsig.html"),
+				null, gvsig_vars);
+		aboutManager.getProject().set("build", "2021");
+
+		aboutManager.addSponsor("Generalitat Valenciana",
+				getResource("gva.html"), 1);
+
+		aboutManager.addDeveloper("gvSIG Asocicion",
+				getResource("gvSIG-asociacion.html"), 2);
+
+	}
+
+	private void registerPluginFolders(File pluginsFolder) {
+
+	    File[] folders = pluginsFolder.listFiles();
+	    for (File folder : folders) {
+		    File scriptsFolder = new File(folder,"scripting/scripts");
+		    if( scriptsFolder.exists() ) {
+		    	manager.registerSystemFolder(folder.getName(), scriptsFolder);
+		    }
+		    File libFolder = new File(folder,"scripting/lib");
+		    if( libFolder.exists() ) {
+		    	manager.addLibFolder(libFolder);
+		    }
+		}
+	}
+	
+	public void doMain(String args[]) {
+
+		new DefaultLibrariesInitializer().fullInitialize();
+
+		initializeAbout();
+
+		uimanager = ScriptingSwingLocator.getUIManager();
+		manager = uimanager.getManager();
+
+		Options options = new Options();
+		options.addOption("l", "show-launcher", false,
+				"Show the launcher window");
+		options.addOption("c", "show-composer", false,
+				"Show the composer window");
+		options.addOption("r", "run", true, "Run the specified script");
+		options.addOption("f", "plugins-folder", true, "Register scripts and libs folder in the plugins located in this location");
+		options.addOption("s", "show", true, "Show the specified dialog");
+		options.addOption("h", "home", true,
+				"Specify for the home of the script framework");
+		CommandLineParser parser = new PosixParser();
+		CommandLine line = null;
+		try {
+			line = parser.parse(options, args);
+			if (line.hasOption("home")) {
+				manager.setHomeFolder(new File(line.getOptionValue("home")));
+			}
+			if (line.hasOption("plugins-folder")) {
+				registerPluginFolders(new File(line.getOptionValue("plugins-folder")));
+			}
+			if (line.hasOption("show-launcher")) {
+				showLauncher();
+			}
+			if (line.hasOption("show-composer")) {
+				showComposer();
+			}
+			if (line.hasOption("run")) {
+				manager.getScript(new File(line.getOptionValue("run"))).run();
+			}
+			if (line.hasOption("show")) {
+				showDialog(line.getOptionValue("show"));
+				if ( !(line.hasOption("show-launcher") || line.hasOption("show-composer")) ) {
+					System.exit(0);
+				}
+			}
+		} catch (ParseException exp) {
+			System.out.println("Unexpected exception:" + exp.getMessage());
+		}
+		String[] moreArgs = line.getArgs();
+		if( moreArgs.length > 0 ) {
+			showDialog(moreArgs[0]);
+			System.exit(0);
+		}
+		showLauncher();
+	}
+
+	private void showDialog(String name) {
+		if (!name.endsWith(".dlg")) {
+			name = name + ".dlg";
+		}
+		ScriptingDialog dlg = (ScriptingDialog) manager
+				.getScript(new File(name));
+		dlg.setShowMode(ScriptingDialog.MODE_DIALOG);
+		dlg.run();
+	}
+
+	private void showLauncher() {
+		JFrame frame = new JFrame("gvSIG's Script Framework");
+		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+
+		// Create the menu bar.
+		JMenuBar menuBar = new JMenuBar();
+
+		// Build the menu.
+		JMenu menu_file = new JMenu("File");
+
+		JMenuItem menuItem_composer = new JMenuItem("Composer");
+		menuItem_composer.addActionListener(new ActionListener() {
+
+			public void actionPerformed(ActionEvent e) {
+				showComposer();
+			}
+		});
+		menu_file.add(menuItem_composer);
+
+		JMenuItem menuItem_installer = new JMenuItem("Install package");
+		menuItem_installer.addActionListener(new ActionListener() {
+
+			public void actionPerformed(ActionEvent e) {
+				showPackageInstaller(manager);
+			}
+		});
+		menu_file.add(menuItem_installer);
+
+		JMenuItem menuItem_installPackage = new JMenuItem("Build package");
+		menuItem_installer.addActionListener(new ActionListener() {
+
+			public void actionPerformed(ActionEvent e) {
+				showPackageBuilder(manager);
+			}
+		});
+		menu_file.add(menuItem_installPackage);
+
+		menu_file.addSeparator();
+
+		JMenuItem menuItem_exit = new JMenuItem("Exit");
+		menuItem_exit.addActionListener(new ActionListener() {
+
+			public void actionPerformed(ActionEvent e) {
+				System.exit(0);
+			}
+		});
+		menu_file.add(menuItem_exit);
+
+		menuBar.add(menu_file);
+
+		frame.add(menuBar, BorderLayout.NORTH);
+		frame.add(uimanager.createLauncher().asJComponent(), BorderLayout.CENTER);
+
+		// Display the window.
+		frame.pack();
+		frame.setVisible(true);
+
+	}
+
+	@SuppressWarnings("unused")
+	private Date getDate(int year, int month, int day) {
+		Calendar cal = Calendar.getInstance();
+		cal.set(year, month, day);
+		return cal.getTime();
+	}
+
+	private URL getResource(String name) {
+		URL resource = this.getClass().getResource(name);
+		return resource;
+	}
+
+	private void showComposer() {
+		showWindow(uimanager.createComposer().asJComponent(), "Scripting Composer");
+	}
+
+	private void showPackageInstaller(ScriptingManager manager) {
+		// not implemented
+	}
+
+	private void showPackageBuilder(ScriptingManager manager) {
+		// not implemented
+	}
+
+	private void showWindow(JComponent component, String title) {
+		JFrame frame = new JFrame(title);
+		frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+
+		frame.setContentPane(component);
+
+		// Display the window.
+		frame.pack();
+		frame.setVisible(true);
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main/pom.xml	(revision 1126)
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.gvsig.scripting.main</artifactId>
+	<packaging>jar</packaging>
+	<name>${project.artifactId}</name>
+	<parent>
+		<groupId>org.gvsig</groupId>
+		<artifactId>org.gvsig.scripting</artifactId>
+		<version>2.3.75</version>
+	</parent>
+	<dependencies>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.tools.swing.api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.tools.swing.impl</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.about.api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.about.impl</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.scripting.lib.api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.scripting.lib.impl</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.scripting.swing.api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.scripting.swing.impl</artifactId>
+			<scope>compile</scope>
+		</dependency>
+                <!--
+		<dependency>
+			<groupId>com.jgoodies</groupId>
+			<artifactId>jgoodies-looks</artifactId>
+			<scope>compile</scope>
+		</dependency>
+                -->
+		<dependency>
+			<groupId>commons-cli</groupId>
+			<artifactId>commons-cli</artifactId>
+			<scope>compile</scope>
+		</dependency>
+	</dependencies>
+</project>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.main
___________________________________________________________________
Added: svn:ignore
   + .classpath
.project
target
.settings


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/pom.xml	(revision 1126)
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.gvsig.scripting</artifactId>
+    <packaging>pom</packaging>
+    <version>2.3.75</version>
+    <name>${project.artifactId}</name>
+    <description>Scripting Framework for gvSIG</description>
+    <url>http://devel.gvsig.org/sites/org.gvsig.scripting/${project.version}</url>
+
+    <parent>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.desktop</artifactId>
+        <version>2.0.247</version>
+    </parent>
+
+    <scm>
+        <connection>scm:svn:https://devel.gvsig.org/svn/gvsig-scripting/org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75</connection>
+        <developerConnection>scm:svn:https://devel.gvsig.org/svn/gvsig-scripting/org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75</developerConnection>
+        <url>https://devel.gvsig.org/svn/gvsig-scripting/org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75</url>
+    </scm>
+    <developers>
+        <developer>
+            <id>jjdelcerro</id>
+            <name>Joaquín José del Cerro</name>
+            <email>jjdelcerro@gvsig.org</email>
+            <roles>
+                <role>Architect</role>
+                <role>Developer</role>
+            </roles>
+        </developer>
+        <developer>
+            <id>jbadia</id>
+            <name>José Badía</name>
+            <email>badia_jos@gva.es</email>
+            <roles>
+                <role>Developer</role>
+            </roles>
+        </developer>
+    </developers>
+
+    <distributionManagement>
+        <site>
+            <id>gvsig-repository</id>
+            <url>dav:https://devel.gvsig.org/sites/org.gvsig.scripting/${project.version}</url>
+        </site>
+    </distributionManagement>
+    <repositories>
+        <repository>
+            <id>gvsig-public-http-repository</id>
+            <name>gvSIG maven public HTTP repository</name>
+            <url>http://devel.gvsig.org/m2repo/j2se</url>
+            <releases>
+                <enabled>true</enabled>
+                <updatePolicy>daily</updatePolicy>
+                <checksumPolicy>warn</checksumPolicy>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>daily</updatePolicy>
+                <checksumPolicy>warn</checksumPolicy>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>bedatadriven</id>
+            <name>bedatadriven public repo</name>
+            <url>http://nexus.bedatadriven.com/content/groups/public/</url>
+        </repository>
+    </repositories>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-release-plugin</artifactId>
+                <configuration>
+                    <tagBase>https://devel.gvsig.org/svn/gvsig-scripting/org.gvsig.scripting/tags</tagBase>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.gvsig</groupId>
+                <artifactId>org.gvsig.scripting.lib.api</artifactId>
+                <version>2.3.75</version>
+            </dependency>
+            <dependency>
+                <groupId>org.gvsig</groupId>
+                <artifactId>org.gvsig.scripting.swing.api</artifactId>
+                <version>2.3.75</version>
+            </dependency>
+            <dependency>
+                <groupId>org.gvsig</groupId>
+                <artifactId>org.gvsig.scripting.lib.impl</artifactId>
+                <version>2.3.75</version>
+            </dependency>
+            <dependency>
+                <groupId>org.gvsig</groupId>
+                <artifactId>org.gvsig.scripting.swing.impl</artifactId>
+                <version>2.3.75</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.gvsig</groupId>
+                <artifactId>org.gvsig.scripting.main</artifactId>
+                <version>2.3.75</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.gvsig</groupId>
+                <artifactId>org.gvsig.scripting.thing</artifactId>
+                <version>2.3.75</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.gvsig</groupId>
+                <artifactId>org.gvsig.scripting.app.mainplugin</artifactId>
+                <version>2.3.75</version>
+            </dependency>
+
+            <dependency>
+              <groupId>com.github.tbekolay.jnumeric</groupId>
+              <artifactId>jnumeric</artifactId>
+              <version>0.1</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.renjin</groupId>
+                <artifactId>renjin-script-engine</artifactId>
+                <version>0.9.2644</version>
+                <classifier>jar-with-dependencies</classifier>
+            </dependency>
+            
+            <!--
+            <dependency>
+                <groupId>org.scala-lang</groupId>
+                <artifactId>scala-dist</artifactId>
+                <version>2.12.0-M2</version>
+                <scope>runtime</scope>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.scala-lang</groupId>
+                        <artifactId>scala-library-all</artifactId>
+                    </exclusion>
+                </exclusions>            
+            </dependency>
+            <dependency>
+                <groupId>org.scala-lang</groupId>
+                <artifactId>scala-compiler</artifactId>
+                <version>2.12.0-M2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.scala-lang</groupId>
+                <artifactId>scala-library</artifactId>
+                <version>2.12.0-M2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.scala-lang</groupId>
+                <artifactId>scala-reflect</artifactId>
+                <version>2.12.0-M2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.scala-lang</groupId>
+                <artifactId>scalap</artifactId>
+                <version>2.12.0-M2</version>
+            </dependency>
+            <dependency>
+                <groupId>jline</groupId>
+                <artifactId>jline</artifactId>
+                <version>2.12.1</version>
+            </dependency>
+            -->
+            
+            <dependency>
+                <groupId>com.jeta</groupId>
+                <artifactId>abeille</artifactId>
+                <version>2.1.0.M3</version>
+                <type>tar.gz</type>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.tika</groupId>
+                <artifactId>tika-core</artifactId>
+                <version>1.12</version>
+            </dependency>            
+            <dependency>
+                <groupId>net.sf.cssbox</groupId>
+                <artifactId>swingbox</artifactId>
+                <version>1.1</version>
+            </dependency>
+            <dependency>
+                <groupId>net.sf.cssbox</groupId>
+                <artifactId>cssbox</artifactId>
+                <version>4.7</version>
+            </dependency>
+            <dependency>
+                <groupId>net.sourceforge.nekohtml</groupId>
+                <artifactId>nekohtml</artifactId>
+                <version>1.9.21</version>
+            </dependency>
+            <dependency>
+                <groupId>net.sf.cssbox</groupId>
+                <artifactId>jstyleparser</artifactId>
+                <version>1.18</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jgit</groupId>
+                <artifactId>org.eclipse.jgit</artifactId>
+                <version>4.9.0.201710071750-r</version>
+            </dependency>                    
+                            
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>org.gvsig.scripting.thing</module>
+        <module>org.gvsig.scripting.lib</module>
+        <module>org.gvsig.scripting.swing</module>
+        <module>org.gvsig.scripting.main</module>
+        <module>org.gvsig.scripting.app</module>
+    </modules>
+</project>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/resources/README.txt	(revision 1126)
@@ -0,0 +1,11 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+Put into this folder the resources needed by your test classes.
+
+This folder is added to the Tests classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, in this folder you can find an example of log4j configuration,
+prepared to log messages through the console, so logging works when you
+run your tests classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/resources/log4j.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/resources/log4j.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/resources/log4j.xml	(revision 1126)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- 
+Log4J configuration file for unit tests execution.
+ -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appender configuration to show logging messages through the console -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
+		</layout>
+	</appender>
+
+	<!-- 
+	Activate logging messages of DEBUG level of higher only for the
+	DefaultExampleManager class.
+	You can put full classes names or packages instead, to configure
+	logging for all the classes and subpackages of the package.
+	-->
+	<category name="org.gvsig.scripting.impl.DefaultExampleManager">
+		<priority value="DEBUG" />
+	</category>
+
+	<!-- 
+	By default, show only logging messages of INFO level or higher, 
+	through the previously configured CONSOLE appender. 
+	-->
+	<root>
+		<priority value="INFO" />
+		<appender-ref ref="CONSOLE" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestManager.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestManager.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestManager.java	(revision 1126)
@@ -0,0 +1,91 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.Assert;
+
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public abstract class TestManager extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+	
+	@Override
+	protected void doSetUp() throws Exception {
+		manager = ScriptingLocator.getManager();
+	}
+	
+	public void setWorkingFolder(){
+		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home").getFile());
+//		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+//		manager.setRootUserFolder(file.getAbsolutePath());
+	}
+	
+	public void deleteFolderContent(ScriptingFolder folder){
+		List<ScriptingUnit> units = folder.getUnits();
+        Iterator<ScriptingUnit> it = units.iterator();
+		while(it.hasNext()){
+			ScriptingUnit unit = it.next();
+			if(unit instanceof ScriptingFolder){
+				deleteFolderContent((ScriptingFolder)unit);
+				folder.remove(unit);
+			}else{
+				folder.remove(unit);
+			}
+		}
+	}
+	
+	public void deleteWorkingFolderContent(){
+		setWorkingFolder();
+		ScriptingFolder folder = manager.getUserFolder();
+		deleteFolderContent(folder);
+	}
+	
+	public void testUserFolderPath(){
+		setWorkingFolder();
+		Assert.assertEquals(manager.getRootUserFolder().getAbsolutePath(), manager.getUserFolder().getFile().getAbsolutePath());
+	}
+	
+	public void testExistsScriptId(){
+		setWorkingFolder();
+		manager.createUnit(ScriptingManager.UNIT_SCRIPT,manager.getUserFolder(),"test_script.py");
+		
+		Assert.assertEquals(false, manager.validateUnitId(manager.getUserFolder(),"test_script"));
+		Assert.assertEquals(true, manager.validateUnitId(manager.getUserFolder(),"test_script2"));
+		deleteWorkingFolderContent();
+	}
+
+
+	public void checkUnitValues(ScriptingUnit unit1, ScriptingUnit unit2){
+		Assert.assertEquals(unit1.getId(),unit2.getId());
+		Assert.assertEquals(unit1.getName(),unit2.getName());
+	}
+	
+	public void testRegisteringSystemFolders(){
+		ScriptingFolder folder_parent = (ScriptingFolder) manager.createUnit(ScriptingManager.UNIT_FOLDER,manager.getUserFolder(), "test");
+		ScriptingFolder folder = (ScriptingFolder) manager.createUnit(ScriptingManager.UNIT_FOLDER,folder_parent, "test");
+		ScriptingScript script = (ScriptingScript)manager.createUnit(ScriptingManager.UNIT_SCRIPT,folder, "test_script.py");
+		
+		manager.registerSystemFolder("test", folder.getFile());
+		
+		List<ScriptingUnit> units = manager.getSystemFolder().getUnits();
+
+        Iterator<ScriptingUnit> it = units.iterator();
+		ScriptingUnit unit = null;
+		while(it.hasNext()){
+			unit = it.next();
+			checkUnitValues(unit, folder);
+		}
+		Assert.assertNotNull(unit);
+		
+		ScriptingScript script2 = (ScriptingScript) manager.getScript(new File(((ScriptingFolder)unit).getFile(),script.getId()+".py"));
+		checkUnitValues(script,script2);
+		deleteWorkingFolderContent();
+	}
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestFolder.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestFolder.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestFolder.java	(revision 1126)
@@ -0,0 +1,113 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public abstract class TestFolder extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+	
+	@Override
+	protected void doSetUp() throws Exception {
+		manager = ScriptingLocator.getManager();
+	}
+	
+	public void setWorkingFolder(){
+		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home").getFile());
+		if(file.exists()){
+			file.mkdir();
+		}
+//		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+//		manager.setRootUserFolder(file.getAbsolutePath());
+	}
+	
+	public void deleteFolderContent(ScriptingFolder folder){
+		List<ScriptingUnit> units = folder.getUnits();
+        Iterator<ScriptingUnit> it = units.iterator();
+		while(it.hasNext()){
+			ScriptingUnit unit = it.next();
+			if(unit instanceof ScriptingFolder){
+				deleteFolderContent((ScriptingFolder)unit);
+				folder.remove(unit);
+			}else{
+				folder.remove(unit);
+			}
+		}
+	}
+	
+	public void deleteWorkingFolderContent(){
+		setWorkingFolder();
+		ScriptingFolder folder = manager.getUserFolder();
+		deleteFolderContent(folder);
+	}
+	
+	public File getFile(ScriptingFolder folder, String name){
+		return new File(folder.getFile(),name);
+	}
+	
+	public void checkFolder(ScriptingFolder folder, String fName){
+		File ffolder = getFile(folder, fName);
+		Assert.assertTrue(ffolder.exists());
+		Assert.assertTrue(ffolder.isDirectory());
+	}
+	
+	public void checkScriptDefaultValues(ScriptingScript script){
+		Assert.assertEquals("test_script", script.getId());
+		Assert.assertEquals("test_script", script.getName());
+		Assert.assertEquals("python", script.getLangName());
+		Assert.assertEquals("main", script.getMainName());
+	}
+
+	public void testCreation(){
+		deleteWorkingFolderContent();
+		ScriptingFolder folder = (ScriptingFolder) manager.createUnit(ScriptingManager.UNIT_FOLDER,manager.getUserFolder(),"test_folder");
+		
+		checkFolder(manager.getUserFolder(),folder.getId());
+	}
+
+	public void testList(){
+		testCreation();
+		ScriptingFolder folder = manager.getFolder(getFile(manager.getUserFolder(),"test_folder"));
+
+		ScriptingScript script = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT,folder, "test_script.py");
+		
+        List<ScriptingUnit> units = folder.getUnits();
+        Iterator<ScriptingUnit> it = units.iterator();
+		while(it.hasNext()){
+			ScriptingUnit unit = it.next();
+			checkScriptDefaultValues((ScriptingScript) unit);
+		}
+		
+		folder.remove(script);
+		Assert.assertTrue(folder.getUnits().isEmpty());
+	}
+	
+	public void testRename(){
+		testCreation();
+		ScriptingFolder folder = manager.getFolder(getFile(manager.getUserFolder(),"test_folder"));
+		
+		Assert.assertFalse(folder.rename("test_folder"));
+		Assert.assertTrue(folder.rename("test_folder2"));
+		
+		Assert.assertEquals("test_folder2", folder.getName());
+		deleteWorkingFolderContent();
+	}
+	
+	public void testMove(){
+		testCreation();
+		ScriptingScript script = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT,manager.getUserFolder(), "test_script.py");	
+		ScriptingFolder folder = manager.getFolder(getFile(manager.getUserFolder(),"test_folder"));
+		Assert.assertEquals(script.getParent().getFile().getAbsolutePath(),manager.getUserFolder().getFile().getAbsolutePath());
+		
+		folder.add(script);
+		Assert.assertEquals(script.getParent(),folder);
+		deleteWorkingFolderContent();
+	}
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestDialog.java	(revision 1126)
@@ -0,0 +1,170 @@
+package org.gvsig.scripting;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public abstract class TestDialog extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+	
+	@Override
+	protected void doSetUp() throws Exception {
+		manager = ScriptingLocator.getManager();
+	}
+	
+	public void setWorkingFolder(){
+		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home").getFile());
+		
+//		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+//		manager.setRootUserFolder(file.getAbsolutePath());
+	}
+	
+	public File getFile(String name){
+		return new File(manager.getRootUserFolder()+File.separator+name);
+	}
+	
+	public void deleteFolderContent(ScriptingFolder folder){
+		List<ScriptingUnit> units = folder.getUnits();
+        Iterator<ScriptingUnit> it = units.iterator();
+		while(it.hasNext()){
+			ScriptingUnit unit = it.next();
+			if(unit instanceof ScriptingFolder){
+				deleteFolderContent((ScriptingFolder)unit);
+				folder.remove(unit);
+			}else{
+				folder.remove(unit);
+			}
+		}
+	}
+	
+	public void deleteWorkingFolderContent(){
+		setWorkingFolder();
+		ScriptingFolder folder = manager.getUserFolder();
+		deleteFolderContent(folder);
+	}
+	
+	public void checkFile(String fName){
+		File fscript = getFile(fName);
+		Assert.assertTrue(fscript.exists());
+	}
+	
+	public void checkScriptDefaultValues(ScriptingDialog script){
+		Assert.assertEquals("test_dialog", script.getId());
+		Assert.assertEquals("test_dialog", script.getName());
+		Assert.assertEquals("python", script.getLangName());
+		Assert.assertEquals("main", script.getMainName());
+	}
+	
+	public void checkScriptNewValues(ScriptingDialog script){
+		Assert.assertEquals("test_dialog", script.getId());
+		Assert.assertEquals("TestDialog", script.getName());
+		Assert.assertEquals("Tests sobre dialogs", script.getDescription());
+		Assert.assertEquals("python", script.getLangName());
+		Assert.assertEquals("main", script.getMainName());
+		Assert.assertEquals("creator", script.getCreatedBy());
+		Assert.assertEquals("v1.0", script.getVersion());
+		Assert.assertEquals("def hola():\n  return 'hola mundo'\n",script.getCode());
+	}
+	
+	public void testCreation(){
+		deleteWorkingFolderContent();
+		setWorkingFolder();
+		ScriptingDialog script = (ScriptingDialog) manager.createUnit(ScriptingManager.UNIT_DIALOG,manager.getUserFolder(),"test_dialog.py");
+		
+		script.save();
+		checkFile("test_dialog.py");
+		checkFile("test_dialog.dlg");
+		checkFile("test_dialog.inf");
+		
+		checkScriptDefaultValues(script);
+	}
+
+	public void testOpen(){
+		testCreation();
+		ScriptingDialog script = (ScriptingDialog) manager.getScript(getFile("test_dialog.py"));
+		
+		checkScriptDefaultValues(script);
+		deleteWorkingFolderContent();
+	}
+	
+	public void testSave(){
+		testCreation();
+		ScriptingDialog script = (ScriptingDialog) manager.getScript(getFile("test_dialog.py"));
+		
+		script.setName("TestDialog");
+		script.setDescription("Tests sobre dialogs");
+		script.setCode("def hola():\n  return 'hola mundo'\n");
+		script.setCreatedBy("creator");
+		script.setVersion("v1.0");
+		script.save();
+		
+		File f = script.getDialogFile();
+		try {
+			BufferedWriter bw = new BufferedWriter(new FileWriter(f));
+			bw.write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" + 
+					"<panel columns=\"1\">\n" +
+					"\t<button action=\"hola\" text=\"press\"/>\n" + 
+					"</panel>");
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		script = (ScriptingDialog) manager.getScript(getFile("test_dialog.py"));
+		checkScriptNewValues(script);
+		
+	}
+	
+	public void testRename(){
+		deleteWorkingFolderContent();
+		testCreation();
+		ScriptingDialog script = (ScriptingDialog) manager.getScript(getFile("test_dialog.py"));
+		
+		Assert.assertFalse(script.rename("test_dialog"));
+		Assert.assertTrue(script.rename("test_dialog2"));
+		
+		script = (ScriptingDialog) manager.getScript(getFile("test_dialog2.py"));
+		Assert.assertEquals("test_dialog2", script.getId());
+		
+		File f = getFile("test_dialog.py");
+		Assert.assertFalse(f.exists());
+		f = getFile("test_dialog2.py");
+		Assert.assertTrue(f.exists());
+		
+		deleteWorkingFolderContent();
+	}
+	
+	public void testMove(){
+		testCreation();
+		ScriptingFolder folderDestination = (ScriptingFolder) manager.createUnit(ScriptingManager.UNIT_FOLDER,manager.getUserFolder(), "other folder");
+		checkFile("other folder");
+		ScriptingDialog script = (ScriptingDialog) manager.getScript(getFile("test_dialog.py"));	
+		
+		script.move(folderDestination);
+		Assert.assertEquals(script.getParent().getFile().getAbsolutePath(),folderDestination.getFile().getAbsolutePath());
+		deleteWorkingFolderContent();
+	}
+	
+	public void testRun(){
+	/*	testSave();
+		ScriptingDialog script = (ScriptingDialog) manager.getScript(getFile("test_dialog.py"));		
+		
+		Assert.assertEquals("hola mundo", script.run());
+		
+		//setMainName
+		
+		//invokeMethod
+		
+		//invokeFunction
+		deleteWorkingFolderContent();*/
+	}
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestScript.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestScript.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/org/gvsig/scripting/TestScript.java	(revision 1126)
@@ -0,0 +1,171 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public abstract class TestScript extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+	
+	@Override
+	protected void doSetUp() throws Exception {
+		ScriptingLocator locator = new ScriptingLocator();
+		Assert.assertNotNull(locator);
+		manager = ScriptingLocator.getManager();
+		Assert.assertNotNull(manager);
+	}
+	
+	public void setWorkingFolder(){
+		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home").getFile());
+		if(file.exists()){
+			file.mkdir();
+		}
+//		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+//		manager.setRootUserFolder(file.getAbsolutePath());
+	}
+	
+	public void deleteFolderContent(ScriptingFolder folder){
+		List<ScriptingUnit> units = folder.getUnits();
+        Iterator<ScriptingUnit> it = units.iterator();
+		while(it.hasNext()){
+			ScriptingUnit unit = it.next();
+			if(unit instanceof ScriptingFolder){
+				deleteFolderContent((ScriptingFolder)unit);
+				folder.remove(unit);
+			}else{
+				folder.remove(unit);
+			}
+		}
+	}
+	
+	public void deleteWorkingFolderContent(){
+		setWorkingFolder();
+		ScriptingFolder folder = manager.getUserFolder();
+		deleteFolderContent(folder);
+	}
+	
+	public File getFile(ScriptingFolder folder, String name){
+		return new File(folder.getFile(),name);
+	}
+	
+	public void checkFile(ScriptingFolder folder, String fName){
+		File fscript = getFile(folder, fName);
+		Assert.assertTrue(fscript.exists());
+	}
+	
+	public void checkScriptDefaultValues(ScriptingScript script){
+		Assert.assertEquals(manager.getUserFolder().getFile().getAbsolutePath(), script.getParent().getFile().getAbsolutePath());
+		
+		Assert.assertEquals("test_script", script.getId());
+		Assert.assertEquals("test_script", script.getName());
+		Assert.assertEquals("python", script.getLangName());
+		Assert.assertEquals("main", script.getMainName());
+	}
+	
+	public void checkScriptNewValues(ScriptingScript script){
+		Assert.assertEquals("test_script", script.getId());
+		Assert.assertEquals("TestScript", script.getName());
+		Assert.assertEquals("Tests sobre scripts", script.getDescription());
+		Assert.assertEquals("python", script.getLangName());
+		Assert.assertEquals("main", script.getMainName());
+		Assert.assertEquals("creator", script.getCreatedBy());
+		Assert.assertEquals("v1.0", script.getVersion());
+		Assert.assertEquals("def main():\n  return 'hola mundo'\n",script.getCode());
+	}
+	
+	public void testCreation(){
+		setWorkingFolder();
+		ScriptingScript previous = (ScriptingScript) manager.getScript(new File(manager.getRootUserFolder()+File.separator+"test_script.py"));
+		if (previous!=null){
+			manager.getUserFolder().remove(previous);
+		}
+		ScriptingScript script = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT,manager.getUserFolder(),"test_script.py");
+		
+		script.save();
+		
+		checkFile(manager.getUserFolder(),"test_script.py");
+		checkFile(manager.getUserFolder(),"test_script.inf");
+		
+		checkScriptDefaultValues(script);
+	}
+
+	public void testOpen(){
+		testCreation();
+		ScriptingScript script = (ScriptingScript) manager.getScript(getFile(manager.getUserFolder(),"test_script.py"));
+		
+		checkScriptDefaultValues(script);
+		deleteWorkingFolderContent();
+	}
+	
+	public void testSave(){
+		testCreation();
+		ScriptingScript script = (ScriptingScript) manager.getScript(getFile(manager.getUserFolder(),"test_script.py"));
+		
+		script.setName("TestScript");
+		script.setDescription("Tests sobre scripts");
+		script.setCode("def main():\n  return 'hola mundo'\n");
+		script.setCreatedBy("creator");
+		script.setVersion("v1.0");
+		script.save();
+		
+		script = (ScriptingScript) manager.getScript(getFile(manager.getUserFolder(),"test_script.py"));
+		checkScriptNewValues(script);
+	}
+	
+	public void testRename(){
+		testSave();
+		ScriptingScript script = (ScriptingScript) manager.getScript(getFile(manager.getUserFolder(),"test_script.py"));
+		
+		Assert.assertFalse(script.rename("test_script"));
+		Assert.assertTrue(script.rename("test_script2"));
+		
+		script = (ScriptingScript) manager.getScript(getFile(manager.getUserFolder(),"test_script2.py"));
+		
+		Assert.assertEquals("test_script2", script.getId());
+		deleteWorkingFolderContent();
+	}
+	
+	public void testMove(){
+		setWorkingFolder();
+		ScriptingFolder folderDestination = (ScriptingFolder) manager.createUnit(ScriptingManager.UNIT_FOLDER,manager.getUserFolder(), "other folder");
+		checkFile(manager.getUserFolder(),"other folder");
+		
+		ScriptingScript previous = (ScriptingScript) manager.getScript(new File(folderDestination.getFile(),"test_script.py"));
+		if (previous!=null){
+			folderDestination.remove(previous);
+		}
+		
+		testSave();
+		ScriptingScript script = (ScriptingScript) manager.getScript(getFile(manager.getUserFolder(),"test_script.py"));	
+		
+		script.move(folderDestination);
+		System.out.println(script.getParent() + " " + folderDestination);
+		Assert.assertEquals(script.getParent(),folderDestination);
+		deleteWorkingFolderContent();
+	}
+	
+	public void testRun() throws NoSuchMethodException{
+		testSave();
+		ScriptingScript script = (ScriptingScript) manager.getScript(getFile(manager.getUserFolder(),"test_script.py"));		
+		Assert.assertEquals("hola mundo", script.run());
+		
+		script.setCode("def hola():\n  return 'hola mundo'\n");
+		//setMainName
+		script.setMainName("hola");
+		Assert.assertEquals("hola mundo", script.run());
+		
+		//invokeMethod
+		
+		//invokeFunction
+		Assert.assertEquals("hola mundo", script.invokeFunction("hola", null));
+		deleteWorkingFolderContent();
+		
+	}
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/test/java/README.txt	(revision 1126)
@@ -0,0 +1,8 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+For each class you are going to test, create one Test class with the same
+name as the class to test, ending with Test.
+
+For example, the unit tests of the "ExampleLibrary" class are performed
+by the "ExampleLibraryTest" class.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/javadoc/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/javadoc/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/javadoc/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/README.txt	(revision 1126)
@@ -0,0 +1,7 @@
+Put into this folder the resources needed by your library classes.
+
+This folder is added to the runtime classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, into this folder you can find some examples of resource bundle 
+property files that may be used by your library classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 1126)
@@ -0,0 +1 @@
+org.gvsig.scripting.ScriptingLibrary
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/org/gvsig/scripting/i18n/text.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/org/gvsig/scripting/i18n/text.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/org/gvsig/scripting/i18n/text.properties	(revision 1126)
@@ -0,0 +1,2 @@
+# Resource bundle texts for the Spanish language locale (es)
+Example.returns_value=devuelve el valor
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/org/gvsig/scripting/i18n/text_en.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/org/gvsig/scripting/i18n/text_en.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/resources/org/gvsig/scripting/i18n/text_en.properties	(revision 1126)
@@ -0,0 +1,2 @@
+# Resource bundle texts for the English language locale (en)
+Example.returns_value=returns value
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/DataFolderFound.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/DataFolderFound.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/DataFolderFound.java	(revision 1126)
@@ -0,0 +1,28 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+import org.gvsig.tools.packageutils.Version;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public interface DataFolderFound {
+
+    ScriptingFolder getApplicationFolder();
+
+    String getApplicationName();
+
+    String getDataFolderId();
+
+    File getNewDataFolder();
+
+    File getOldDataFolder();
+
+    Version getOldDataFolderVersion();
+
+    void leave();
+
+    void restore();
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingUnit.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingUnit.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingUnit.java	(revision 1126)
@@ -0,0 +1,162 @@
+package org.gvsig.scripting;
+
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p> Interface that represents the elements used in the ScriptingFramework.</p>
+ * 
+ * @see ScriptingBaseScript
+ * @see ScriptingFolder
+ */
+public interface ScriptingUnit {
+	
+	/**
+	 * Returns the ScriptingUnit's ID
+	 * 
+	 * @return a String containing the ScriptingUnit's ID
+	 */
+	public String getId();
+	
+	/**
+	 * Returns the ScriptingUnit's name
+	 * 
+	 * @return a String containing the ScriptingUnit's name
+	 */
+	public String getName();
+	
+	/**
+	 * Returns the ScriptingUnit's description
+	 * 
+	 * @return a String containing the ScriptingUnit's description
+	 */
+	public String getDescription();
+	
+	/**
+	 * Returns information about the ScriptingUnit's creator
+	 * 
+	 * @return a String containing the ScriptingUnit's creator
+	 */
+	public String getCreatedBy();
+	
+	/**
+	 * Returns the ScriptingUnit's version
+	 * 
+	 * @return a String containing the ScriptingUnit's version
+	 */
+	public String getVersion();
+	
+	/**
+	 * Returns the ScriptingUnit's parent
+	 * 
+	 * @return a {@link ScriptingFolder} where is contained the ScriptingUnit
+	 */
+	public ScriptingFolder getParent();
+	
+    public String getUserPath();
+	/**
+	 * Sets a new name to the ScriptingUnit.
+	 *
+	 * @param name
+	 *            String that contains the new name.
+	 */
+	public void setName(String name);
+	
+	/**
+	 * Sets a new description to the ScriptingUnit.
+	 *
+	 * @param description
+	 *            String that contains the new description.
+	 */
+	public void setDescription(String description);
+	
+	/**
+	 * Sets a new information about the ScriptingUnit's creator.
+	 *
+	 * @param createdBy
+	 *            String that contains the new creator's information.
+	 */
+	public void setCreatedBy(String createdBy);
+	
+	/**
+	 * Sets a new version value to the ScriptingUnit.
+	 *
+	 * @param version
+	 *            String that contains the new version.
+	 */
+	public void setVersion(String version);
+        
+    public void reload();
+    
+	/**
+	 * Changes the ID of a ScriptingUnit and the name of the files and/or directories associated
+	 *
+	 * @param newId
+	 *            String that contains the new Id.
+	 *            
+	 * @return true if it's succesful, false if not.
+	 */
+	public boolean rename(String newId);
+	
+	public boolean remove();
+	
+	/**
+	 * Moves a ScriptingUnitfrom the current directory to the new location.
+	 *
+	 * @param target
+	 *            {@link ScriptingFolder} that represents the destination..
+	 *            
+	 * @return true if it's succesful, false if not.
+	 */
+	public boolean move(ScriptingFolder target);
+	
+	/**
+	 * Gets the name of the icons associated to the ScriptingUnit type.
+	 *            
+	 * @return a String array with the identificators of the icons associated.
+	 */
+	public String[] getIconNames();
+	
+	public String getTypeName();
+	
+	/**
+	 * Gets a File with the ScriptUnit path name.
+	 *
+	 * @return a string with the path name of the ScriptUnit (inf/folder).
+	 */
+	public File getFile();
+        
+        /**
+         * Return a list of the files that use this unit with out the inf file.
+         * @return list of files of the unit.
+         */
+        public List<File> getFiles();
+        
+        public void addPropertyChangeListener(PropertyChangeListener listener);
+
+        /**
+         * Sets the unit current status with the saved version.
+         *
+         * @param saved Indicate if the unit is up-to-date or not.
+         */
+        public void setSaved(boolean saved);
+        
+        /**
+         * Indicates if the ScriptBaseScript is modified from last saved version.
+         *
+         * @return true if current version is up-to-date, false if not.
+         */
+        public boolean isSaved();     
+        
+        public String getProperty(String name);
+        
+        public void setProperty(String name, String value);
+        
+        public Map<String,String> getProperties();
+        
+        public boolean isASystemUnit();
+        
+        public File getFileResource(String extension);
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingExternalFile.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingExternalFile.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingExternalFile.java	(revision 1126)
@@ -0,0 +1,15 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+
+
+public interface ScriptingExternalFile extends ScriptingUnit {
+    
+    public File getExternalFile();
+
+    public String getMimeType();
+
+    public void setContents(String text);
+
+    public String getContentsAsText();
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingNotification.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingNotification.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingNotification.java	(revision 1126)
@@ -0,0 +1,38 @@
+package org.gvsig.scripting;
+
+/**
+ * Interface to support the notifications in the application 
+ *
+ */
+public interface ScriptingNotification {
+
+	/**
+	 * Gets the type of ScriptingNotification
+	 * 
+	 * @return An integer with the type.
+	 */
+	public int getType();
+	
+	/**
+	 * Gets the ScriptingNotification's id
+	 * 
+	 * @return a String with the id
+	 */
+	public String getId();
+	
+	/**
+	 * Get the {@link ScriptingUnit} which send the notification
+	 * 
+	 * @return {@link ScriptingUnit
+	 */
+	public ScriptingUnit getUnit();
+	
+	/**
+	 * Gets the cause of the ScriptingNotification
+	 * 
+	 * @return Exception
+	 */
+	public Exception getException();
+	
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/package.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/package.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/package.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library description.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#packagecomment">Javadoc Tool documentation about the package file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/CompileErrorException.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/CompileErrorException.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/CompileErrorException.java	(revision 1126)
@@ -0,0 +1,25 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+
+public class CompileErrorException extends ScriptingErrorException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -7829204331513125285L;
+
+	public CompileErrorException(String msg, File name, int line, int column) {
+		super(msg, name, line, column);
+	}
+	
+	public CompileErrorException(String msg, File name, int line, int column, Throwable cause) {
+		this(msg, name, line, column);
+		this.initCause(cause);
+	}
+	
+	public CompileErrorException(String msg, File name, Throwable cause) {
+		this(msg, name, -1, -1);
+		this.initCause(cause);
+	}
+}

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/CompileErrorException.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingBaseScript.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingBaseScript.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingBaseScript.java	(revision 1126)
@@ -0,0 +1,88 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+import java.io.Writer;
+
+import org.gvsig.tools.observer.WeakReferencingObservable;
+
+/**
+ * <p>
+ * Interface that represents Scripting elements.</p>
+ *
+ * @see ScriptingUnit
+ *
+ * @see ScriptingScript
+ * @see ScriptingDialog
+ * @see ScriptingProject
+ */
+public interface ScriptingBaseScript extends ScriptingUnit, WeakReferencingObservable {
+
+    public static final int ISOLATION_LOW = 0;
+    public static final int ISOLATION_HIGH = 10;
+    
+    /**
+     * Check if the script execution is enabled.
+     *
+     * @return if the script is enabled.
+     */
+    public boolean isEnabled();
+
+    /**
+     * Enable or disable the sript execution.
+     *
+     * @param enabled
+     */
+    public void setEnabled(boolean enabled);
+
+    /**
+     * Executes the code of a ScriptBaseScript.
+     *
+     * @return
+     */
+    public Object run();
+
+    /**
+     * Executes the code of a ScriptBaseScript.
+     *
+     * @param args Contains the input parameters to run the ScriptBaseScript.
+     * @return
+     */
+    public Object run(Object args[]);
+
+    /**
+     * Executes the code of a ScriptBaseScript in a separated thread
+     *
+     * @param args Contains the input parameters to run the ScriptBaseScript.
+     */
+    public void runAsTask(Object args[]);
+
+    public void compile() throws ScriptingRunningException;
+
+    public void put(String name, Object value);
+
+    /**
+     * Return a resource File that is beside this script.
+     *
+     * @param filename
+     * @return the file which is beside this script
+     */
+    public File getResource(String filename);
+
+    public File getScriptFile();
+  
+    public String getLibrarySuffix();
+
+    public void setLibrarySuffix(String librarySuffix);    
+    
+    public void addStdoutWriter(Writer out);
+    
+    public void addStderrWriter(Writer err);
+    
+    public void removeStdoutWriter(Writer out);
+    
+    public void removeStderrWriter(Writer err);
+    
+    public void setIsolationGroup(String group);
+    
+    public String getIsolationGroup();
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingDialog.java	(revision 1126)
@@ -0,0 +1,38 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+
+/**
+ * <p> Interface that represents a single script with window dialog.</p>
+ * 
+ * @see ScriptingUnit
+ * @see ScriptingBaseScript
+ */
+public interface ScriptingDialog extends ScriptingScript{
+
+	public static final int MODE_DIALOG=1;
+	public static final int MODE_WINDOW=2;
+	public static final int MODE_TOOL=3;
+	
+	/**
+	 * Returns the file where is the window dialog's gui.  
+	 * 
+	 * @return a File with the code of the window dialog.
+	 */
+	public File getDialogFile();
+
+	/**
+	 * Returns the type of the window dialog associated with the ScriptingDialog.  
+	 * 
+	 * @return an int with the window mode.
+	 */
+	public int getShowMode();
+	
+	/**
+	 * Sets the window mode associated with a ScriptingDialog.
+	 *
+	 * @param mode
+	 *            int that contains the window mode.
+	 */
+	public void setShowMode(int mode);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingRunningException.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingRunningException.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingRunningException.java	(revision 1126)
@@ -0,0 +1,42 @@
+package org.gvsig.scripting;
+
+public class ScriptingRunningException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 4327337186862453971L;
+
+	private String message;
+	private String fileName;
+	private int lineNunber;
+	private int columnNumber;
+
+	public ScriptingRunningException(String message, String fileName,
+			int lineNumber, int columnNumber) {
+		this.message = message;
+		this.fileName = fileName;
+		this.lineNunber = lineNumber;
+		this.columnNumber = columnNumber;
+	}
+
+	public ScriptingRunningException(String message, String fileName) {
+		this(message, fileName, -1, -1);
+	}
+
+	public int getLineNumber() {
+		return this.lineNunber;
+	}
+
+	public int getColumnNumber() {
+		return this.columnNumber;
+	}
+
+	public String getFileName() {
+		return this.fileName;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+}

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingRunningException.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingLocator.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingLocator.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingLocator.java	(revision 1126)
@@ -0,0 +1,62 @@
+package org.gvsig.scripting;
+
+import org.gvsig.tools.locator.BaseLocator;
+import org.gvsig.tools.locator.Locator;
+import org.gvsig.tools.locator.LocatorException;
+
+public class ScriptingLocator extends BaseLocator {
+
+	private static final String LOCATOR_NAME = "ScriptingLocator";
+
+	public static final String MANAGER_NAME = "scriptinglocator.manager";
+
+	public static final String MANAGER_DESCRIPTION = "Scripting Manager";
+
+	/**
+	 * Unique instance.
+	 */
+	private static final ScriptingLocator instance = new ScriptingLocator();
+
+	/**
+	 * Return the singleton instance.
+	 *
+	 * @return the singleton instance
+	 */
+	public static ScriptingLocator getInstance() {
+		return instance;
+	}
+
+	/**
+	 * Return the Locator's name
+	 *
+	 * @return a String with the Locator's name
+	 */
+	@Override
+    public String getLocatorName() {
+		return LOCATOR_NAME;
+	}
+
+    /**
+     * Return a reference to ScriptManager.
+     * 
+     * @return a reference to ScriptManager
+     * @throws LocatorException
+     *             if there is no access to the class or the class cannot be
+     *             instantiated
+     * @see Locator#get(String)
+     */
+	public static ScriptingManager getManager() throws LocatorException {
+		return (ScriptingManager) getInstance().get(MANAGER_NAME);
+	}
+
+    /**
+     * Registers the Class implementing the ScriptManager interface.
+     * 
+     * @param clazz
+     *            implementing the ScriptManager interface
+     */
+    public static void registerManager(Class<? extends ScriptingManager> clazz) {
+		getInstance().register(MANAGER_NAME, MANAGER_DESCRIPTION, clazz);
+	}
+	
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingLibrary.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingLibrary.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingLibrary.java	(revision 1126)
@@ -0,0 +1,30 @@
+package org.gvsig.scripting;
+
+import org.gvsig.tools.library.AbstractLibrary;
+import org.gvsig.tools.library.LibraryException;
+import org.gvsig.tools.locator.ReferenceNotRegisteredException;
+
+public class ScriptingLibrary extends AbstractLibrary {
+
+    @Override
+    public void doRegistration() {
+        registerAsAPI(ScriptingLibrary.class);
+    }
+
+    @Override
+    protected void doInitialize() throws LibraryException {
+        // Nothing to do
+    }
+
+    @Override
+    protected void doPostInitialize() throws LibraryException {
+        // Validate there is any implementation registered.
+        ScriptingManager manager = ScriptingLocator.getManager();
+
+        if (manager == null) {
+            throw new ReferenceNotRegisteredException(
+                ScriptingLocator.MANAGER_NAME, ScriptingLocator.getInstance());
+        }
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingScript.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingScript.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingScript.java	(revision 1126)
@@ -0,0 +1,86 @@
+package org.gvsig.scripting;
+
+import org.gvsig.tools.script.Script;
+
+
+/**
+ * <p> Interface that represents a single script without window dialog.</p>
+ * 
+ * @see ScriptingUnit
+ * @see ScriptingBaseScript
+ */
+public interface ScriptingScript extends ScriptingBaseScript, Script {
+
+	/**
+	 * Returns the languange in which the ScriptingScript is written.
+	 * 
+	 * @return a String containing the name of the language
+	 */
+	public String getLangName();
+
+	/**
+	 * Returns the ScriptingScript's code.
+	 * 
+	 * @return a String with the code of the script.
+	 */
+        @Override
+	public String getCode();
+
+	/**
+	 * Sets a the code associated with a ScriptingScript.
+	 *
+	 * @param code
+	 *            String that contains the new code.
+	 */
+	public void setCode(String code);
+
+	/**
+	 * Returns the name of the main function in the ScriptingScript's code
+	 * 
+	 * @return a String with main function (default main name is 'main').
+	 */
+	public String getMainName();
+
+	/**
+	 * Stablishes a new main main function in the ScriptingScript's code.
+	 *
+	 * @param mainName
+	 *            String that contains the new main function name.
+	 */
+	public void setMainName(String mainName);
+
+	/**
+	 * Persists the current status of a ScriptingScript with the content associated.
+	 */
+	public void save();
+	
+	/**
+	 * Executes a method from the Script's code
+	 * 
+	 * @param obj this Object represents the script's code
+	 * @param name method's name to execute
+	 * @param args input parameters of the method 
+	 * 
+	 * @return An Object that represents the execution
+	 * 
+	 * @throws NoSuchMethodException If there isn't a main function to begin the execution
+	 */
+	public Object invokeMethod(Object obj, String name, Object[] args) throws NoSuchMethodException;
+	
+	/**
+	 * Executes a function from the Script's code
+	 * 
+	 * @param name method's name to execute
+	 * @param args input parameters of the method 
+	 * 
+	 * @return An Object that represents the execution
+	 * 
+	 * @throws NoSuchMethodException If there isn't a main function to begin the execution
+	 */
+        @Override
+	public Object invokeFunction(String name, Object[] args) throws NoSuchMethodException;
+	
+        public String getMimeType();
+        
+        public void registerDataFolder(String id);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ExecuteErrorException.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ExecuteErrorException.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ExecuteErrorException.java	(revision 1126)
@@ -0,0 +1,26 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+
+public class ExecuteErrorException extends ScriptingErrorException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 3733567933742742587L;
+
+	public ExecuteErrorException(String msg, File name, int line, int column) {
+		super(msg, name, line, column);
+	}
+	
+	public ExecuteErrorException(String msg, File name, int line, int column, Throwable cause) {
+		this(msg, name, line, column);
+		this.initCause(cause);
+	}
+	
+	public ExecuteErrorException(String msg, File name, Throwable cause) {
+		this(msg, name, -1, -1);
+		this.initCause(cause);
+	}
+	
+}

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ExecuteErrorException.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingErrorException.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingErrorException.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingErrorException.java	(revision 1126)
@@ -0,0 +1,43 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.gvsig.scripting;
+
+import java.io.File;
+import org.apache.commons.io.FilenameUtils;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public class ScriptingErrorException extends RuntimeException {
+    private static final long serialVersionUID = -3489829775437358107L;
+    private final File name;
+    private final int line;
+    private final int column;
+
+    public ScriptingErrorException(String msg, File name, int line, int column) {
+        super(msg);
+        this.name = name;
+        this.line = line;
+        this.column = column;
+    }
+
+    public int getLineNumber() {
+        return this.line;
+    }
+
+    public int getColumnNumber() {
+        return this.column;
+    }
+
+    public String getScriptName() {
+        return FilenameUtils.getBaseName(this.name.getName());
+    }
+   
+    public File getScriptFile() {
+        return this.name;
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingManager.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingManager.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingManager.java	(revision 1126)
@@ -0,0 +1,238 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.gvsig.tools.packageutils.Version;
+import org.gvsig.tools.service.spi.ProviderFactory;
+import org.gvsig.tools.script.ScriptManager;
+import org.gvsig.tools.util.FolderSet;
+
+/**
+ * There are two top level management roles within ScriptingFramework: logical
+ * and User's Interface (UI) management.
+ *
+ * This class is responsible of the logical role. It provides all the services
+ * to manage the information used in ScriptingFramework.
+ */
+public interface ScriptingManager extends ScriptManager {
+
+    public static final String INSTALLER_PROVIDER_NAME = "Script";
+    public static final String INSTALLER_PROVIDER_DESCRIPTION = "Provider to install scripts";
+
+    public static final String PYTHON_LANGUAGE_NAME = "python";
+//    public static final String SCALA_LANGUAGE_NAME = "scala";
+    public static final String DEFAULT_ISOLATION_GROUP = "default";
+    
+    public static final String UNIT_SCRIPT = "Script";
+    public static final String UNIT_DIALOG = "Dialog";
+    public static final String UNIT_FOLDER = "Folder";
+    public static final String UNIT_EXTERNALFILE = "ExternalFile";
+
+    public void setHomeFolder(File home);
+
+    public File getHomeFolder();
+
+    public File getDataFolder(String id);
+    
+    public void registerDataFolder(ScriptingFolder folderScript, String id);
+    
+    public List<DataFolderFound> searchOldVersions(Version currentVersion, FolderSet folder);
+    
+    /**
+     * Returns the System's Folder
+     *
+     * @return a {@link ScriptingFolder} with the System's Folder.
+     */
+    public ScriptingFolder getSystemFolder();
+
+    /**
+     * Returns the User's Folder
+     *
+     * @return a {@link ScriptingFolder} with the User's Folder.
+     */
+    public ScriptingFolder getUserFolder();
+
+    public List<ScriptingFolder> getAlternativeUserFolders();
+
+    public void addAlternativeUserFolder(File f, String name, String description);
+
+    public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id);
+
+    public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id, String language);
+    
+    public List<String> getUnitTypes();
+
+    /**
+     * Returns the {@link ScriptingBaseScript} associated with the file
+     * specified
+     *
+     * @param file File where is contained the {@link ScriptingBaseScript}'s
+     * information
+     *
+     * @return {@link ScriptingBaseScript}
+     */
+    public ScriptingBaseScript getScript(File file);
+
+    public ScriptingBaseScript getScript(String name);
+
+    /**
+     * Returns the {@link ScriptingFolder} associated with the file specified
+     *
+     * @param file File where is contained the {@link ScriptingFolder}'s
+     * information
+     *
+     * @return {@link ScriptingFolder}
+     */
+    public ScriptingFolder getFolder(File file);
+    
+    /**
+     * Return the {@link ScriptingUnit} associated with the path specified.
+     * 
+     * the path should start with "User" or "System".
+     * 
+     * @param pathName
+     * 
+     * @return the required {@link ScriptingUnit}
+     */
+    public ScriptingUnit getUnit(String pathName);
+
+
+    /**
+     * Returns the path of the User's Folder
+     *
+     * @return a String with the path of the User's Folder
+     */
+//    public String getRootUserFolder();
+    /**
+     * Registers a File System with {@link ScriptingUnit}s in the SystemFolder
+     *
+     * @param name String with the identificator name of the File System
+     * registered
+     * @param folder File with the root of the File System to register
+     */
+    public void registerSystemFolder(String name, File folder);
+
+    public List<String> getSupportedLanguages();
+
+    public String getExtensionOfLanguage(String language);
+
+    public String getEngineNameByLanguage(String langName);
+    
+    public Set<String> getEnginesIsolationGroups();
+
+    /**
+     * Checks if an id is unique in a determinate folder
+     *
+     * @param folder {
+     * @ScriptingFolder} with the directory to verify the id
+     * @param id String with the id to validate
+     *
+     * @return true if there isn't another {@link ScriptingUnit} with the same
+     * id, and false in the other case
+     */
+    public boolean validateUnitId(ScriptingFolder folder, String id);
+
+    /**
+     * Sets a key/value pair in the state of the ScriptingManager that may
+     * either create a Java Language Binding to be used in the execution of
+     * scripts
+     *
+     * @param key The name of named value to add
+     * @param value The value of named value to add.
+     */
+    public void put(String key, Object value);
+
+    /**
+     * Retrieves a value set in the state of this ScriptingManager
+     *
+     * @param key The key whose value is to be returned
+     *
+     * @return an Object with the value corresponding to the key
+     */
+    public Object get(String key);
+
+    public void addLibFolder(File lib);
+
+    public File getRootUserFolder();
+    
+    public ProviderFactory getInstallerFactory();
+    
+    /**
+     * Devuelbe la carpeta en la que se encuentran los paquetes
+     * de la aplicacion.
+     * 
+     * @return 
+     */
+    public File getPackagesFolder();
+    
+    /**
+     * Establece la carpeta en la que se encuentran los paquetes
+     * de la aplicacion.
+     * @param folder 
+     */
+    public void setPackagesFolder(File folder);
+    
+    /**
+     * Search the available engines and initialize the manager.
+     */
+    public void loadEngines();
+    
+    public List<File> getLibFolders();
+    
+    /**
+     * Return a map with the label and suffix of the library versions.
+     * 
+     * For each value of map, the value is the name of the version (a label) and
+     * the key is the suffix for that version.
+     * 
+     * @return a map with suffix and labels of library versions. 
+     */
+    public Map<String,String> getLibFoldersVersions();
+    
+    /**
+     * <p>
+     * Returns a reference to an object (property) associated to this layer.</p>
+     *
+     * <p>
+     * For example, you can attach a network definition to key "network" and
+     * check
+     * if a layer has a network loaded using
+     * <i>getAssociatedObject("network")</i> and
+     * that it's not null.</p>
+     *
+     * @param key the key associated to the property
+     *
+     * @return <code>null</code> if key is not found
+     *
+     * @see #getExtendedProperties()
+     * @see #setProperty(Object, Object)
+     */
+    public Object getProperty(Object key);
+
+    /**
+     * Inserts an object as a property to this layer.
+     *
+     * @param key the key associated to the property
+     * @param obj the property
+     *
+     * @see #getProperty(Object)
+     * @see #getExtendedProperties()
+     */
+    public void setProperty(Object key, Object obj);
+
+    /**
+     * Returns a hash map with all new properties associated to this layer.
+     *
+     * @return hash table with the added properties
+     *
+     * @see #getProperty(Object)
+     * @see #setProperty(Object, Object)
+     */
+    public Map getExtendedProperties();   
+    
+    public ScriptingFolder createLink(String name, File link, String targetPathName);
+
+    public ScriptingFolder createLink(String name, ScriptingFolder link, String targetPathName);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingFolder.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingFolder.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/src/main/java/org/gvsig/scripting/ScriptingFolder.java	(revision 1126)
@@ -0,0 +1,69 @@
+package org.gvsig.scripting;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.function.Predicate;
+import org.gvsig.tools.exception.BaseException;
+import org.gvsig.tools.visitor.Visitable;
+import org.gvsig.tools.visitor.Visitor;
+
+/**
+ * <p>
+ * Interface that represents a directory in the ScriptingFramework.</p>
+ *
+ * @see ScriptingUnit
+ */
+public interface ScriptingFolder extends ScriptingUnit, Visitable {
+
+    /**
+     * Adds a {@link ScriptingUnit} to the ScriptingFolder.
+     *
+     * @param unit {@link ScriptingUnit} to include.
+     */
+    public void add(ScriptingUnit unit);
+
+    /**
+     * Removes a {@link ScriptingUnit} from the ScriptingFolder.
+     *
+     * @param unit {@link ScriptingUnit} to delete.
+     */
+    public void remove(ScriptingUnit unit);
+
+    /**
+     * Returns the {@link ScriptingUnit} associated with a File.
+     *
+     * @param file File of the data origin.
+     *
+     * @return a {@link ScriptingUnit} with the content extracted from the file.
+     */
+    public ScriptingUnit getUnit(File file);
+    
+    public ScriptingUnit getUnit(String path);
+
+    /**
+     * Gets all the {@link ScriptingUnit}s contained in a ScriptingFolder.
+     *
+     * @return a List with the {@link ScriptingUnit}s.
+     *
+     */
+    public List<ScriptingUnit> getUnits();
+
+    public List<ScriptingFolder> getUnitFolders();
+
+    public boolean isLink();
+
+    public void accept(Visitor visitor, Predicate<ScriptingUnit> includeFilter) throws BaseException;
+
+    public void save();
+
+    public String getRawInf();
+
+    public void setRawInf(String rawInf);
+
+    public String getProperty(String group, String name);
+
+    public void setProperty(String group, String name, String value);
+    
+    public void setIconNames(String iconName, String iconNameOpen);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api/pom.xml	(revision 1126)
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.gvsig.scripting.lib.api</artifactId>
+	<packaging>jar</packaging>
+	<name>org.gvsig.scripting.lib.api</name>
+	<parent>
+		<groupId>org.gvsig</groupId>
+		<artifactId>org.gvsig.scripting.lib</artifactId>
+		<version>2.3.75</version>
+	</parent>
+	<dependencies>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.tools.lib</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.tools.lib</artifactId>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.i18n</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.help</groupId>
+			<artifactId>javahelp</artifactId>
+			<scope>compile</scope>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<configuration>
+				</configuration>
+				<executions>
+					<!--
+						Generates a jar file only with the test classes
+					-->
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.api
___________________________________________________________________
Added: svn:ignore
   + .classpath
.project
.settings
target

bin


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/pom.xml	(revision 1126)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.gvsig.scripting.lib</artifactId>
+	<packaging>pom</packaging>
+	<name>${project.artifactId}</name>
+	<parent>
+		<groupId>org.gvsig</groupId>
+		<artifactId>org.gvsig.scripting</artifactId>
+		<version>2.3.75</version>
+	</parent>
+
+	<modules>
+		<module>org.gvsig.scripting.lib.api</module>
+		<module>org.gvsig.scripting.lib.impl</module>
+	</modules>
+</project>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/README.txt	(revision 1126)
@@ -0,0 +1,11 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+Put into this folder the resources needed by your test classes.
+
+This folder is added to the Tests classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, in this folder you can find an example of log4j configuration,
+prepared to log messages through the console, so logging works when you
+run your tests classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/log4j.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/log4j.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/log4j.xml	(revision 1126)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- 
+Log4J configuration file for unit tests execution.
+ -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appender configuration to show logging messages through the console -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
+		</layout>
+	</appender>
+
+	<!-- 
+	Activate logging messages of DEBUG level of higher only for the
+	DefaultExampleManager class.
+	You can put full classes names or packages instead, to configure
+	logging for all the classes and subpackages of the package.
+	-->
+	<category name="org.gvsig.scripting.impl.DefaultExampleManager">
+		<priority value="DEBUG" />
+	</category>
+
+	<!-- 
+	By default, show only logging messages of INFO level or higher, 
+	through the previously configured CONSOLE appender. 
+	-->
+	<root>
+		<priority value="INFO" />
+		<appender-ref ref="CONSOLE" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola.py	(revision 1126)
@@ -0,0 +1,10 @@
+
+
+def main():
+  print 'hola'
+ 
+def hola(name):
+  return 'hola %s' % name
+  
+def adios():
+  print 'adios'
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola2.dlg
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola2.dlg	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola2.dlg	(revision 1126)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- generated by ThinG, the Thinlet GUI editor -->
+<panel>
+    <button text="hola" action="click"/>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/resources/org/gvsig/scripting/impl/scripts/hola2.py	(revision 1126)
@@ -0,0 +1,13 @@
+
+
+def click():
+  print 'click'
+
+def main():
+  print 'hola'
+ 
+def hola(name):
+  return 'hola %s' % name
+  
+def adios():
+  print 'adios'
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/java/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/java/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/test/java/README.txt	(revision 1126)
@@ -0,0 +1,8 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+For each class you are going to test, create one Test class with the same
+name as the class to test, ending with Test.
+
+For example, the unit tests of the "ExampleLibrary" class are performed
+by the "ExampleLibraryTest" class.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/javadoc/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/javadoc/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/javadoc/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 1126)
@@ -0,0 +1 @@
+org.gvsig.scripting.impl.ScriptingDefaultImplLibrary
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/api.hs
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/api.hs	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/api.hs	(revision 1126)
@@ -0,0 +1,60 @@
+<?xml version='1.0' encoding='ISO-8859-1' ?>
+<!DOCTYPE helpset
+  PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp HelpSet Version 1.0//EN"
+ 		  "http://java.sun.com/products/javahelp/helpset_1_0.dtd">
+
+<?TestTarget this is data for the test target ?>
+
+<helpset version="1.0">
+
+  <!-- title -->
+  <title>ScriptingFramework API</title>
+
+  <!-- maps -->
+  <maps>
+     <homeID>main</homeID>
+     <mapref location="api.jhm"/>
+  </maps>
+
+  <!-- views -->
+  <view>
+    <name>TOC</name>
+    <label>TOC</label>
+    <type>javax.help.TOCView</type>
+    <data>toc.xml</data>
+  </view>
+  
+  <view> <name>Index</name>
+	 <label>Indice</label>
+	 <type>javax.help.IndexView</type>
+	 <data>index.xml</data>
+	</view>
+  
+  <view>
+	 <name>Search</name>
+	 <label>Busqueda</label>
+	 <type>javax.help.SearchView</type>
+  </view>
+  
+  
+  <view>
+    <name>Favorites</name>
+    <label>Favoritos</label>
+    <type>javax.help.FavoritesView</type>
+  </view>
+
+  <presentation default="true" displayviewimages="false">
+     <name>main window</name>
+     <size width="700" height="400" />
+     <location x="200" y="200" />
+     <title>gvSIG - Ayuda en linea</title>
+     <image>toplevelfolder</image>
+     <toolbar>
+       <helpaction image="action.back">javax.help.BackAction</helpaction>
+       <helpaction image="action.forward">javax.help.ForwardAction</helpaction>
+       <helpaction image="homeIcon">javax.help.HomeAction</helpaction>
+       <helpaction image="reloadIcon">javax.help.ReloadAction</helpaction>
+       <helpaction image="addBookmarkIcon">javax.help.FavoritesAction</helpaction>         
+     </toolbar>
+  </presentation>
+</helpset>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/package-list
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/toc.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/toc.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/toc.xml	(revision 1126)
@@ -0,0 +1,7 @@
+<!DOCTYPE toc
+  PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp TOC Version 1.0//EN"
+             "http://java.sun.com/products/javahelp/toc_1_0.dtd">
+
+<toc version="1.0">
+
+</toc>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/api.jhm
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/api.jhm	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/api.jhm	(revision 1126)
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='ISO-8859-1' ?>
+<!DOCTYPE map
+  PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN"
+         "http://java.sun.com/products/javahelp/map_1_0.dtd">
+
+<map version="1.0">
+</map>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/index.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/index.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/apihelp/index.xml	(revision 1126)
@@ -0,0 +1,5 @@
+<!DOCTYPE index
+ PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Index Version 1.0//EN"
+      "http://java.sun.com/products/javahelp/index_1_0.dtd">
+<index version="1.0">
+</index>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/scala/new_template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/scala/new_template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/scala/new_template.txt	(revision 1126)
@@ -0,0 +1,8 @@
+
+import java.lang.Runnable
+
+new Runnable() { 
+  def run() { 
+    println("Hello, World!") 
+  }
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/groovy/new_template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/groovy/new_template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/groovy/new_template.txt	(revision 1126)
@@ -0,0 +1,8 @@
+
+
+def main() {
+
+  printf "hola\n"
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/ecmascript/new_template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/ecmascript/new_template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/ecmascript/new_template.txt	(revision 1126)
@@ -0,0 +1,8 @@
+
+
+
+function main() {
+
+  print("hola\n");
+  
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/python/init.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/python/init.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/python/init.txt	(revision 1126)
@@ -0,0 +1,2 @@
+
+__file__ = script.getResource(script.getId()+".py").getAbsolutePath()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/python/new_template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/python/new_template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/python/new_template.txt	(revision 1126)
@@ -0,0 +1,11 @@
+# encoding: utf-8
+
+import gvsig
+
+def main(*args):
+
+    #Remove this lines and add here your code
+
+    print "hola mundo"
+    pass
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/r/new_template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/r/new_template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/org/gvsig/scripting/langs/r/new_template.txt	(revision 1126)
@@ -0,0 +1,7 @@
+
+main <- function() {
+
+    cat( "Hello\n" );
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/componentchooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/componentchooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/componentchooser.xml	(revision 1126)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel bottom="12" columns="1" left="12" right="12" top="12" weightx="1" weighty="1">
+    <list colspan="2" name="list" line="false" weightx="1" weighty="1" action="selectionChanged(this, lSelected)" perform="close()"/>
+    <panel gap="6" top="12" weightx="1">
+        <label text="Selected:"/>
+        <label name="lSelected" text="null"/>
+        <panel weightx="1"/>
+        <button name="bOk" text="Ok" icon="icons/ok.gif" mnemonic="0" type="default" action="ok()"/>
+        <button name="bCancel" text="Cancel" icon="icons/cancel.gif" mnemonic="0" type="cancel" action="close()"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/thing.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/thing.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/thing.xml	(revision 1126)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: -->
+
+<panel columns="1" gap="4">
+
+	<menubar weightx="1">
+		<menu text="File" mnemonic="0">
+			<menuitem text="New" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl N" action="menu_file_new()"/>
+			<menuitem text="Open..." mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl O" action="menu_file_open()"/>
+			<separator/>
+			<menuitem text="Reload" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl R" action="menu_file_reload()"/>
+			<separator/>
+			<menuitem text="Save" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl S" action="menu_file_save()"/>
+			<menuitem text="Save As..." mnemonic="5" icon="icons/empty_menu.gif" action="menu_file_save_as()"/>
+			<separator/>
+			<menuitem text="Exit" mnemonic="0" icon="icons/empty_menu.gif" accelerator="alt F4" action="menu_file_exit()"/>
+		</menu>
+		<menu text="Edit" mnemonic="0">
+			<menuitem text="Cut" name="menu_edit_cut" mnemonic="0" accelerator="ctrl X" icon="icons/edit_cut.gif" action="menu_edit_cut()"/>
+			<menuitem text="Copy" name="menu_edit_copy" mnemonic="1" accelerator="ctrl C" icon="icons/edit_copy.gif" action="menu_edit_copy()"/>
+			<menuitem text="Paste" name="menu_edit_paste" mnemonic="0" accelerator="ctrl V" icon="icons/edit_paste.gif" action="menu_edit_paste()"/>
+			<menuitem text="Paste from system clipboard" name="menu_edit_paste_systemcb" mnemonic="1" accelerator="ctrl shift V" icon="icons/empty_menu.gif" action="menu_edit_paste_systemcb()"/>
+			<menuitem text="Delete" name="menu_edit_delete" mnemonic="0" icon="icons/edit_delete.gif" action="menu_edit_delete()"/>
+			<separator/>
+			<menuitem text="Settings..." mnemonic="0" icon="icons/empty_menu.gif" action="menu_edit_settings()"/>
+		</menu>
+		<menu text="Tools" mnemonic="0">
+			<menuitem text="Generate Handler Stub Source..." name="menu_tools_generate" mnemonic="0" accelerator="ctrl G" icon="icons/empty_menu.gif" action="menu_tools_generate()"/>
+		</menu>
+		<menu text="Help" mnemonic="0">
+			<menuitem text="About Thing..." mnemonic="0" icon="icons/thing_small.gif" action="menu_help_about()"/>
+		</menu>
+	</menubar>
+
+	<panel name="toolbar" weightx="1" gap="-1">
+
+		<!-- top level components -->
+		<button name="tb_add_panel" property="classname=panel" icon="icons/panel.gif" tooltip="Create new panel" action="addComponent(this)"/>
+		<button name="tb_add_dialog" property="classname=dialog" icon="icons/dialog.gif" tooltip="Create new dialog" action="addComponent(this)"/>
+		<button name="tb_add_desktop" property="classname=desktop" icon="icons/desktop.gif" tooltip="Create new desktop" action="addComponent(this)"/>
+		<button name="tb_add_splitpane" property="classname=splitpane" icon="icons/splitpane.gif" tooltip="Create new splitpane" action="addComponent(this)"/>
+		<button name="tb_add_tabbedpane" property="classname=tabbedpane" icon="icons/tabbedpane.gif" tooltip="Create new tabbedpane" action="addComponent(this)"/>
+
+		<!-- menu components -->
+		<button name="tb_add_menubar" property="classname=menubar" icon="icons/menubar.gif" tooltip="Create new menubar" action="addComponent(this)"/>
+		<button name="tb_add_menu" property="classname=menu" icon="icons/menu.gif" tooltip="Create new menu" action="addComponent(this)"/>
+		<button name="tb_add_menuitem" property="classname=menuitem" icon="icons/menuitem.gif" tooltip="Create new menuitem" action="addComponent(this)"/>
+		<button name="tb_add_checkboxmenuitem" property="classname=checkboxmenuitem" icon="icons/checkboxmenuitem.gif" tooltip="Create new checkboxmenuitem" action="addComponent(this)"/>
+
+		<!-- components -->
+		<button name="tb_add_label" property="classname=label" icon="icons/label.gif" tooltip="Create new label" action="addComponent(this)"/>
+		<button name="tb_add_button" property="classname=button" icon="icons/button.gif" tooltip="Create new button" action="addComponent(this)"/>
+		<button name="tb_add_togglebutton" property="classname=togglebutton" icon="icons/togglebutton.gif" tooltip="Create new togglebutton" action="addComponent(this)"/>
+		<button name="tb_add_checkbox" property="classname=checkbox" icon="icons/checkbox.gif" tooltip="Create new checkbox" action="addComponent(this)"/>
+		<button name="tb_add_textfield" property="classname=textfield" icon="icons/textfield.gif" tooltip="Create new textfield" action="addComponent(this)"/>
+		<button name="tb_add_combobox" property="classname=combobox" icon="icons/combobox.gif" tooltip="Create new combobox" action="addComponent(this)"/>
+		<button name="tb_add_passwordfield" property="classname=passwordfield" icon="icons/passwordfield.gif" tooltip="Create new passwordfield" action="addComponent(this)"/>
+		<button name="tb_add_spinbox" property="classname=spinbox" icon="icons/spinbox.gif" tooltip="Create new spinbox" action="addComponent(this)"/>
+		<button name="tb_add_progressbar" property="classname=progressbar" icon="icons/progressbar.gif" tooltip="Create new progressbar" action="addComponent(this)"/>
+		<button name="tb_add_slider" property="classname=slider" icon="icons/slider.gif" tooltip="Create new slider" action="addComponent(this)"/>
+		<button name="tb_add_separator" property="classname=separator" icon="icons/separator.gif" tooltip="Create new separator" action="addComponent(this)"/>
+		<button name="tb_add_list" property="classname=list" icon="icons/list.gif" tooltip="Create new list" action="addComponent(this)"/>
+		<button name="tb_add_table" property="classname=table" icon="icons/table.gif" tooltip="Create new table" action="addComponent(this)"/>
+		<button name="tb_add_textarea" property="classname=textarea" icon="icons/textarea.gif" tooltip="Create new textarea" action="addComponent(this)"/>
+		<button name="tb_add_tree" property="classname=tree" icon="icons/tree.gif" tooltip="Create new tree" action="addComponent(this)"/>
+
+		<!-- list items -->
+		<button name="tb_add_choice" property="classname=choice" icon="icons/choice.gif" tooltip="Create new choice" action="addComponent(this)"/>
+		<button name="tb_add_item" property="classname=item" icon="icons/item.gif" tooltip="Create new item" action="addComponent(this)"/>
+		<button name="tb_add_node" property="classname=node" icon="icons/node.gif" tooltip="Create new node" action="addComponent(this)"/>
+		<button name="tb_add_tab" property="classname=tab" icon="icons/tab.gif" tooltip="Create new tab" action="addComponent(this)"/>
+
+		<!-- table components -->
+		<button name="tb_add_row" property="classname=row" icon="icons/row.gif" tooltip="Create new row" action="addComponent(this)"/>
+		<button name="tb_add_cell" property="classname=cell" icon="icons/cell.gif" tooltip="Create new cell" action="addComponent(this)"/>
+		<button name="tb_add_header" property="classname=header" icon="icons/header.gif" tooltip="Create new header" action="addComponent(this)"/>
+		<button name="tb_add_column" property="classname=column" icon="icons/column.gif" tooltip="Create new column" action="addComponent(this)"/>
+
+		<!-- other -->
+		<button name="tb_add_popupmenu" property="classname=popupmenu" icon="icons/popupmenu.gif" tooltip="Create new popupmenu" action="addComponent(this)"/>
+
+		<!-- later -->
+		<!--
+		<button name="tb_add_bean" property="classname=bean" icon="icons/bean.gif" tooltip="Create new bean" action="addComponent(this)" enabled="false"/>
+		-->
+
+		<!-- placeholder in case there are no buttons add all -->
+		<separator height="30" width="1"/>
+	</panel>
+
+	<!-- main workarea -->
+	<panel left="4" right="4" weightx="1" weighty="1">
+		<splitpane orientation="horizontal" divider="200" weightx="1" weighty="1">
+
+			<!-- left splitpane: component tree and properties table -->
+			<splitpane orientation="vertical">
+				<panel columns="1" weightx="1" weighty="1">
+					<tree name="tree" angle="true" line="false" selection="single" weightx="1" weighty="1" action="treeSelectionChanged()"/>
+					<panel top="3" bottom="3" gap="2" scrollable="true">
+						<button name="tb_edit_copy" icon="icons/edit_copy.gif" tooltip="Copy selected component to internal ThinG clipboard and system clipboard" action="menu_edit_copy()"/>
+						<button name="tb_edit_cut" icon="icons/edit_cut.gif" tooltip="Cut selected component to internal ThinG clipboard and system clipboard" action="menu_edit_cut()"/>
+						<button name="tb_edit_paste" icon="icons/edit_paste.gif" tooltip="Paste component from internal ThinG clipboard below selected component" action="menu_edit_paste()"/>
+						<button name="tb_edit_delete" icon="icons/edit_delete.gif" tooltip="Remove selected component" action="menu_edit_delete()"/>
+						<separator/>
+						<button name="tb_edit_moveup" icon="icons/edit_moveup.gif" tooltip="Move selected component up" action="moveComponentUp()"/>
+						<button name="tb_edit_movedown" icon="icons/edit_movedown.gif" tooltip="Move selected component down" action="moveComponentDown()"/>
+					</panel>
+				</panel>
+				<panel columns="1" gap="5">
+					<table name="props" selection="single" weightx="1" weighty="1" action="tableSelectionChanged()">
+						<header>
+							<column name="props_key" text="Property" width="80" sort="ascent"/>
+							<column name="props_value" text="Value"/>
+						</header>
+					</table>
+					<panel name="propedit" columns="3" gap="5" weightx="1" border="true" top="5" left="5" bottom="5" right="5">
+						<label name="propedit_name" text=""/>
+						<panel name="propedit_panel" gap="5" weightx="1"/>
+						<button name="propedit_reset" text="Reset" tooltip="Reset to default value" font="10" valign="center" enabled="false" action="propEditReset()"/>
+					</panel>
+				</panel>
+			</splitpane>
+
+			<!-- right splitpane: preview panel -->
+			<tabbedpane name="tabs" placement="top" selected="1" action="tabSelected(this.selected)">
+				<!-- Attention: because of an obscure bug in Thinlet.getNextFocusable(), -->
+				<!-- the tab "XML" must be the first one! If it is not the first panel, Thinlet -->
+				<!-- runs into an endless loop when the user navigates from the "Preview" tab -->
+				<!-- to the "XML" tab, trying to set the next focusable component. -->
+				<tab text="XML" mnemonic="0">
+					<panel weightx="1" weighty="1">
+						<textarea name="serialize" editable="false" weightx="1" weighty="1"/>
+					</panel>
+				</tab>
+				<tab text="Preview" mnemonic="0">
+					<panel name="preview" border="true" scrollable="true" weightx="1" weighty="1"/>
+				</tab>
+			</tabbedpane>
+
+		</splitpane>
+	</panel>
+
+	<!-- status bar at bottom -->
+	<textfield name="statusbar" editable="false" text="ThinG" weightx="1"/>
+
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/generate.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/generate.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/generate.xml	(revision 1126)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel columns="1"
+    bottom="12" left="12" right="12" top="12" gap="12"
+    init="init(cbGenerateInterface, cbGenerateHandler, cbGenerateAsThinlet, cbGenerateMain, tInterfaceName, tHandlerName, tPackageName, tOutputDir, tPreview, bOk)"
+    weightx="1" weighty="1"
+>
+    <panel border="true" bottom="6" columns="3" font=" bold" gap="6" left="6" right="6" text="Generate" top="6" weightx="1">
+        <checkbox action="checkboxChanged(this)" mnemonic="0" name="cbGenerateInterface" text="Interface for Handler class" weightx="1"/>
+        <label for="tInterfaceName" mnemonic="1" text="Interface Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tInterfaceName" weightx="4"/>
+        <checkbox action="checkboxChanged(this)" mnemonic="0" name="cbGenerateHandler" selected="true" text="Handler class" weightx="1"/>
+        <label for="tHandlerName" mnemonic="1" text="Class Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tHandlerName" weightx="4"/>
+        <panel/>
+        <label for="tPackageName" mnemonic="0" text="Package Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tPackageName" weightx="4"/>
+        <panel colspan="3" gap="6" weightx="1">
+            <label for="tOutputDir" mnemonic="7" text="Output Directory:"/>
+            <textfield name="tOutputDir" weightx="1"/>
+            <button action="buttonOutputDirClicked()" text="..." tooltip="Select Output Directory"/>
+        </panel>
+    </panel>
+    <panel border="true" bottom="6" columns="1" font=" bold" gap="6" left="6" right="6" text="Handler Options" top="6">
+        <checkbox action="checkboxChanged(this)" mnemonic="13" name="cbGenerateAsThinlet" text="Handler is a Thinlet"/>
+        <checkbox action="checkboxChanged(this)" mnemonic="9" name="cbGenerateMain" text="Generate main()"/>
+    </panel>
+    <panel border="true" bottom="6" font=" bold" gap="6" left="6" right="6" text="Preview" top="6" weightx="1" weighty="1">
+        <textarea editable="false" font="Monospaced 11" name="tPreview" weightx="1" weighty="1"/>
+    </panel>
+    <panel gap="6" halign="right" weightx="1">
+        <button action="ok()" icon="icons/ok.gif" mnemonic="0" name="bOk" text="Ok" valign="bottom" weighty="1"/>
+        <button action="close()" icon="icons/cancel.gif" mnemonic="0" name="bCancel" text="Cancel" type="cancel" valign="bottom" weighty="1"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/settings.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/settings.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/settings.xml	(revision 1126)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel border="true" bottom="12" columns="2" gap="20" left="12" right="12" top="12" weightx="1" weighty="1">
+    <label icon="icons/thing.gif" rowspan="3" valign="top"/>
+    <panel border="true" bottom="6" font="bold" gap="6" left="6" right="6" text="Icons" top="6">
+        <label for="tIconpath" mnemonic="0" text="Icon Path:"/>
+        <textfield name="tIconpath" weightx="1"/>
+        <button action="chooseDir(tIconpath, tIconpath.text)" name="bChoose" text="..." tooltip="Choose directory"/>
+    </panel>
+    <panel border="true" bottom="6" columns="3" font="bold" gap="6" left="6" right="6" text="XML Output" top="6" weightx="1" weighty="1">
+        <label for="rbIndentSpace" mnemonic="1" text="Indent Char:"/>
+        <checkbox group="indentChar" halign="left" name="rbIndentSpace" selected="true" text="Space"/>
+        <checkbox group="indentChar" halign="left" name="rbIndentTab" text="Tab"/>
+        <label for="spIndentSize" mnemonic="7" text="Indent Size:"/>
+        <spinbox colspan="2" end="1" halign="left" maximum="100" minimum="1" name="spIndentSize" start="1" text="4"/>
+        <label for="tCustomHeader" mnemonic="7" text="Custom Header:" valign="top"/>
+        <textarea colspan="3" height="80" name="tCustomHeader" weightx="1" weighty="1" width="300"/>
+    </panel>
+    <panel gap="6" halign="right" weightx="1">
+        <button action="ok(tIconpath.text, spIndentSize.text, rbIndentSpace.selected, rbIndentTab.selected, tCustomHeader.text)" icon="icons/ok.gif" mnemonic="0" name="bOk" text="Ok" valign="bottom" weighty="1"/>
+        <button action="close()" icon="icons/cancel.gif" mnemonic="0" name="bCancel" text="Cancel" type="cancel" valign="bottom" weighty="1"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/version.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/version.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/version.properties	(revision 1126)
@@ -0,0 +1,3 @@
+# ThinG version number
+version=0.1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/generator.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/generator.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/thing/generator.properties	(revision 1126)
@@ -0,0 +1,142 @@
+# jEdit settings:
+# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1:
+#
+# Templates for the ThinG Generator.
+#
+# Important:
+# When changing any of the templates, please keep in mind:
+# - leading whitespace must be enclosed in quotes '...'
+# - brackets '{' and '}' must be enclosed in quotes unless they denote a parameter
+# - end-of-lines are always denoted with '\n'. The generator may change this
+#   into the OS specific line separator such as '\r\n' on Windows or '\r' on Mac.
+
+
+# 0: current date (java.util.Date instance)
+file.header.firstline=\
+	// Generated by ThinG on {0,date} {0,time}.\n\
+	\n
+
+
+# 0: "<package-spec>", e.g. "foo.bar.baz"
+file.header.package=\
+	package {0};\n\
+	\n
+
+
+# 0: additional import statement, e.g. "import thinlet.FrameLauncher;" or ""
+# 1: JavaDoc comment
+file.header=\
+	import thinlet.Thinlet;\n\
+	{0}\
+	\n\
+	\n\
+	/**\n\
+	' '* {1}\n\
+	' '*/\n
+
+
+file.footer=\
+	'}'\n
+
+
+# 0: "<classname>"
+# 1: "[ extends Thinlet]"
+# 2: "[ implements <interfacename>]"
+handler.signature=\
+	public class {0}{1}{2}\n\
+	'{'\n
+
+
+# 0: "<interfacename>"
+interface.signature=\
+	public interface {0}\n\
+	'{'\n
+
+
+# 0: "<classname>"
+# 1: "<thinlet-filename>"
+class.asThinlet.constructor=\
+	\n\
+	'    '/**\n\
+	'     '* Create a new {0} instance.\n\
+	'     '*/\n\
+	'    'public {0}() throws java.io.IOException\n\
+	'    {'\n\
+	'        'add(parse("{1}"));\n\
+	'    }'\n\
+	\n
+
+
+# 0: JavaDoc comment for the method.
+method.javadoc.header=\
+	\n\
+	'    '/**\n\
+	'     '* {0}\n
+
+
+method.javadoc.param.intro=\
+	'     '*\n
+
+
+# 1: "<parameter-name>"
+# 2: JavaDoc comment for the parameter
+method.javadoc.param=\
+	'     '* @param {0} {1}\n
+
+
+method.javadoc.footer=\
+	'     '*/\n
+
+
+# 0: full method signature, e.g. "mymethod(String param1, int param2)"
+method.body.interface=\
+	'    'public void {0};\n\
+	\n
+
+
+# 0: full method signature, e.g. "mymethod(String param1, int param2)"
+method.body.handler=\
+	'    'public void {0}\n\
+	'    {'\n\
+	'    }'\n\
+	\n
+
+
+# 0: "<classname>"
+main.asThinlet=\
+	\n\
+	'    '/**\n\
+	'     '* Show a test frame with the Thinlet contents.\n\
+	'     '*\n\
+	'     '* @param args  ignored.\n\
+	'     '*/\n\
+	'    'public static void main(String[] args) throws java.io.IOException\n\
+	'    {'\n\
+	'        'new FrameLauncher("{0}", new {0}(), 400, 400);\n\
+	'    }'\n\
+	\n
+
+
+# 0: "<classname>"
+# 1: "<thinlet-filename>"
+main.notAsThinlet=\
+	\n\
+	'    '/**\n\
+	'     '* Show a test frame with the Thinlet contents.\n\
+	'     '*\n\
+	'     '* @param args  ignored.\n\
+	'     '*/\n\
+	'    'public static void main(String[] args) throws java.io.IOException\n\
+	'    {'\n\
+	'        'class MyThinlet extends Thinlet\n\
+	'        {'\n\
+	'            'public MyThinlet() throws java.io.IOException\n\
+	'            {'\n\
+	'                'add(parse("{1}", new {0}()));\n\
+	'            }'\n\
+	'        };'\n\
+	'        'new FrameLauncher("{0}", new MyThinlet(), 400, 400);\n\
+	'    }'\n\
+	\n
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/resources/README.txt	(revision 1126)
@@ -0,0 +1,7 @@
+Put into this folder the resources needed by your library classes.
+
+This folder is added to the runtime classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, into this folder you can find some examples of resource bundle 
+property files that may be used by your library classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/package.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/package.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/package.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting.impl package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library default implementation description.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#packagecomment">Javadoc Tool documentation about the package file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingDefaultImplLibrary.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingDefaultImplLibrary.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingDefaultImplLibrary.java	(revision 1126)
@@ -0,0 +1,27 @@
+package org.gvsig.scripting.impl;
+
+import org.gvsig.scripting.ScriptingLibrary;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.library.AbstractLibrary;
+import org.gvsig.tools.library.LibraryException;
+
+public class ScriptingDefaultImplLibrary extends AbstractLibrary{
+
+    @Override
+    public void doRegistration() {
+        registerAsImplementationOf(ScriptingLibrary.class);
+    }
+
+    @Override
+    protected void doInitialize() throws LibraryException {
+            ScriptingLocator.registerManager(DefaultScriptingManager.class);
+            ToolsLocator.registerScriptManager(DefaultScriptingManager.class);
+    }
+
+    @Override
+    protected void doPostInitialize() throws LibraryException {
+        // Do nothing
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/Unit.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/Unit.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/Unit.java	(revision 1126)
@@ -0,0 +1,14 @@
+package org.gvsig.scripting.impl;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingUnit;
+
+public interface Unit extends ScriptingUnit {
+
+	public void load(ScriptingFolder folder, String id);
+
+	public void setId(String id);
+	
+	public void create(ScriptingFolder folder, String id, String language);
+
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/SystemFolder.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/SystemFolder.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/SystemFolder.java	(revision 1126)
@@ -0,0 +1,78 @@
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.impl.DefaultScriptingManager.RegisterSystemFolder;
+
+public class SystemFolder extends DefaultScriptingFolder {
+
+    public final static String ID = "SystemFolder";
+    
+    @SuppressWarnings("OverridableMethodCallInConstructor")
+    public SystemFolder(ScriptingManager manager) {
+        super(manager);
+        this.setName("System");
+        this.setId(ID);
+        this.setDescription("Scripts del Sistema");
+    }
+
+    @Override
+    public ScriptingFolder getParent() {
+        return null;
+    }
+
+    @Override
+    public File getFileResource(String extension) {
+        return new File(folder.getParentFile(), folder.getName() + extension).getAbsoluteFile();
+    }
+
+    @Override
+    public String toString() {
+        return this.description;
+    }
+
+    @Override
+    public String[] getIconNames() {
+        return new String[]{"scripting-icon-folder-system", "scripting-icon-folder-system"};
+    }
+
+    @Override
+    public Unit getUnit(File afile) {
+        Unit unit;
+        String path = afile.getPath();
+        if (path.startsWith("/")) {
+            path = path.substring(1);
+        }
+
+        List<RegisterSystemFolder> folders = this.manager.getSystemFolders();
+        for (int i = 0; i < folders.size(); i++) {
+            RegisterSystemFolder systemfolder = folders.get(i);
+            DefaultScriptingFolder theFolder = new DefaultScriptingFolder(this, manager, systemfolder.folder.getAbsoluteFile());
+            if (path.startsWith(theFolder.getId() + "/")) {
+                unit = theFolder.getUnit(new File(path.substring(theFolder.getId().length() + 1)));
+                if (unit != null) {
+                    return unit;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<ScriptingUnit> getUnits() {
+        List<ScriptingUnit> ol = new ArrayList<>();
+        List<RegisterSystemFolder> folders = this.manager.getSystemFolders();
+        for (int i = 0; i < folders.size(); i++) {
+            RegisterSystemFolder systemfolder = folders.get(i);
+            DefaultScriptingFolder theFolder = new DefaultScriptingFolder(this, manager, systemfolder.folder.getAbsoluteFile());
+            theFolder.setName(systemfolder.name);
+            ol.add(theFolder);
+        }
+        return ol;
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingInstallerProviderFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingInstallerProviderFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingInstallerProviderFactory.java	(revision 1126)
@@ -0,0 +1,68 @@
+/* gvSIG. Geographic Information System of the Valencian Government
+ *
+ * Copyright (C) 2007-2008 Infrastructures and Transports Department
+ * of the Valencian Government (CIT)
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+ * MA  02110-1301, USA.
+ * 
+ */
+
+package org.gvsig.scripting.impl;
+
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.dynobject.DynClass;
+import org.gvsig.tools.dynobject.DynObject;
+import org.gvsig.tools.dynobject.DynObjectManager;
+import org.gvsig.tools.service.spi.AbstractProviderFactory;
+import org.gvsig.tools.service.spi.Provider;
+import org.gvsig.tools.service.spi.ProviderServices;
+
+public class ScriptingInstallerProviderFactory extends
+    AbstractProviderFactory {
+
+    private DynClass parametersDefinition = null;
+
+    @Override
+    protected DynClass createParametersDynClass() {
+        if (parametersDefinition == null) {
+            initialize();
+        }
+        return parametersDefinition;
+    }
+
+    @Override
+    protected Provider doCreate(DynObject parameters, ProviderServices services) {
+        return new ScriptingInstallerProvider(services);
+    }
+
+    @Override
+    public void initialize() {
+        if (parametersDefinition == null) {
+            DynObjectManager dynObjectManager = ToolsLocator.getDynObjectManager();
+            if( dynObjectManager.has(ScriptingManager.INSTALLER_PROVIDER_NAME) ) {
+                parametersDefinition =  dynObjectManager.get(ScriptingManager.INSTALLER_PROVIDER_NAME);
+            } else {
+                parametersDefinition =  dynObjectManager.createDynClass(
+                        ScriptingManager.INSTALLER_PROVIDER_NAME,
+                	ScriptingManager.INSTALLER_PROVIDER_DESCRIPTION
+                );
+                dynObjectManager.add(parametersDefinition);
+            }
+        }
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/BaseScriptingNotifycation.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/BaseScriptingNotifycation.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/BaseScriptingNotifycation.java	(revision 1126)
@@ -0,0 +1,39 @@
+package org.gvsig.scripting.impl;
+
+import org.gvsig.scripting.ScriptingNotification;
+import org.gvsig.scripting.ScriptingUnit;
+
+public class BaseScriptingNotifycation implements ScriptingNotification {
+
+	public static final int RUNTIME_ERROR_NOTIFICATION = 1;
+	public static final int COMPILE_ERROR_NOTIFICATION = 2;
+	
+	private ScriptingUnit unit;
+	private int type;
+	private String id;
+	private Exception exception;
+
+	public BaseScriptingNotifycation(ScriptingUnit unit, int type, String id, Exception ex) {
+		this.unit = unit;
+		this.type = type;
+		this.id = id;
+		this.exception = ex;
+	}
+	
+	public Exception getException() {
+		return this.exception;
+	}
+
+	public String getId() {
+		return this.id;
+	}
+
+	public ScriptingUnit getUnit() {
+		return this.unit;
+	}
+
+	public int getType() {
+		return this.type;
+	}
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingDialog.java	(revision 1126)
@@ -0,0 +1,214 @@
+package org.gvsig.scripting.impl;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.gvsig.scripting.ExecuteErrorException;
+import org.gvsig.scripting.ScriptingDialog;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.swing.api.JThinlet;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.ini4j.Ini;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultScriptingDialog extends DefaultScriptingScript implements ScriptingDialog, ActionListener {
+
+    private static final Logger logger = LoggerFactory.getLogger(DefaultScriptingDialog.class);
+    private int showMode;
+
+    public DefaultScriptingDialog(ScriptingFolder parent, ScriptingManager manager, String id) {
+        super(parent, ScriptingManager.UNIT_DIALOG, manager, id);
+        this.setMainName("onload");
+        this.showMode = MODE_WINDOW;
+    }
+
+    @Override
+    public void runAsTask(Object[] args) {
+        // Los dialogos no se ejecutan en otro hilo.
+        this.run(args);
+    }
+
+    @Override
+    public Object run(Object args[]) {
+        ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+
+        JThinlet thinlet = uimanager.createJThinlet();
+        thinlet.addActionListener(this);
+        thinlet.load(this.getFileResource(".dlg"));
+
+        this.put("dialog", thinlet.getThinlet());
+
+        this.compile();
+        try {
+            this.invokeFunction(this.getMainName(), args);
+        } catch (ExecuteErrorException ex) {
+            Throwable e = ex.getCause();
+            if (e instanceof NoSuchMethodException) {
+                // When running from the composer messages of stdout shows in the console tab.
+                System.out.println("Code of dialog do not has function '" + this.getMainName() + "'.");
+            } else {
+                throw ex;
+            }
+        }
+
+        switch (this.getShowMode()) {
+            case MODE_WINDOW:
+                // When running from the composer messages of stdout shows in the console tab.
+                System.out.println("Showing dialog as window " + this.getName() + ".");
+                uimanager.showWindow(thinlet, this.getName());
+                break;
+            case MODE_TOOL:
+                // When running from the composer messages of stdout shows in the console tab.
+                System.out.println("Showing dialog as tool " + this.getName() + ".");
+                uimanager.showTool(thinlet, this.getName());
+                break;
+            default:
+                // When running from the composer messages of stdout shows in the console tab.
+                System.out.println("Showing dialog as dialog " + this.getName() + ".");
+                uimanager.showDialog(thinlet, this.getName());
+                break;
+        }
+        return null;
+    }
+
+    @Override
+    protected void loadInf(Ini prefs) {
+        super.loadInf(prefs);
+        this.showMode = Integer.parseInt(getInfValue(prefs, "Dialog", "showMode", MODE_WINDOW).toString());
+    }
+
+    @Override
+    protected void save(Ini prefs) {
+        super.save(prefs);
+        prefs.put("Dialog", "showMode", this.showMode);
+    }
+
+    @Override
+    public String[] getIconNames() {
+        return new String[]{
+            "scripting-icon-dialog",
+            "scripting-icon-dialog"
+        };
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent arg0) {
+        try {
+            this.invokeFunction(arg0.getActionCommand(), null);
+        } catch (Throwable e) {
+            // Ignore, invokeFunction handle error it self.
+        }
+    }
+
+    @Override
+    public File getDialogFile() {
+        return this.getFileResource(".dlg");
+    }
+
+    @Override
+    public List<File> getFiles() {
+        List<File> l = new ArrayList<>();
+        l.add(this.getResource(".dlg"));
+        l.add(this.getResource(this.getExtension()));
+        return l;
+    }
+
+    @Override
+    public int getShowMode() {
+        return this.showMode;
+    }
+
+    @Override
+    public void setShowMode(int mode) {
+        this.showMode = mode;
+    }
+
+    @Override
+    public boolean remove() {
+        boolean r = super.remove();
+        File folder = this.getParent().getFile();
+        File f = new File(folder, this.getId() + ".dlg");
+        try {
+            FileUtils.forceDelete(f);
+        } catch (IOException e) {
+            logger.warn("Can't remove dialog file '" + f.getAbsolutePath() + "'.", e);
+            r = false;
+        }
+        return r;
+    }
+
+    @Override
+    public void create(ScriptingFolder folder, String id, String language) {
+        super.create(folder, id, language);
+
+        File fileDlg = this.getResource(this.getId() + ".dlg");
+        try {
+            fileDlg.createNewFile();
+        } catch (IOException e) {
+            logger.warn("Can't create the dialog in '" + fileDlg.getAbsolutePath() + "'.", e);
+        }
+
+        // Escribimos en el fichero '.dlg' lo mi�nimo para que pueda ejecutarse
+        Writer output;
+        try {
+            output = new BufferedWriter(new FileWriter(fileDlg));
+            output.write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<panel/>");
+            output.close();
+        } catch (IOException e) {
+            logger.warn("Can't write xml code of the dialog to '" + fileDlg.getAbsolutePath() + "'.", e);
+        }
+
+        this.save();
+    }
+
+    @Override
+    public String getMimeType() {
+        return "text";
+    }
+
+    @Override
+    public boolean move(ScriptingFolder target) {
+        File dlgfile = this.getFileResource(".dlg");
+        if( !super.move(target) ) {
+            return false;
+        }
+        try {
+            FileUtils.moveFileToDirectory(dlgfile, target.getFile(),true);
+        } catch (IOException ex) {
+            logger.info("Can't move script '"+this.getId()+"' to '"+target.getFile().getAbsolutePath()+"', "+ex.getMessage(),ex);
+            return false;
+        }        
+        return true;
+    }
+
+    @Override
+    public boolean rename(String newId) {
+        File dlgfile = this.getFileResource(".dlg");
+        if( !super.rename(newId) ) {
+            return false;
+        }
+        try {
+            ScriptingFolder target = this.getParent();
+            FileUtils.moveFile(dlgfile, new File(target.getFile(),newId+".dlg"));
+        } catch (IOException ex) {
+            logger.info("Can't rename script '"+this.getId()+"' to '"+newId+"', "+ex.getMessage(),ex);
+            return false;
+        }        
+        return true;
+        
+    }
+
+    
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/AbstractScript.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/AbstractScript.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/AbstractScript.java	(revision 1126)
@@ -0,0 +1,65 @@
+package org.gvsig.scripting.impl;
+
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.ScriptingBaseScript;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.ini4j.Ini;
+
+public abstract class AbstractScript extends AbstractUnit implements ScriptingBaseScript{
+        protected boolean enabled;
+        protected String isolationGroup;
+        
+        public AbstractScript(ScriptingFolder parent, String typename, ScriptingManager manager, String id) {
+           super(parent, typename, manager, id);
+           this.enabled = true;
+           this.isolationGroup = null;
+        }
+            
+        @Override
+        public boolean isEnabled() {
+            return this.enabled;
+        }
+
+        @Override
+        public void setEnabled(boolean enabled) {
+            firePropertyChangeListener("enabled", enabled, this.enabled);
+            this.enabled = enabled;
+        }
+
+        
+        @Override
+        public String getIsolationGroup() {
+            return this.isolationGroup;
+        }
+
+        @Override
+        public void setIsolationGroup(String group) {
+            firePropertyChangeListener("isolationGroup", group, this.isolationGroup);
+            this.isolationGroup = group;
+        }
+
+        @Override
+	protected void save(Ini prefs){
+                prefs.put("Script", "enable", BooleanUtils.toStringTrueFalse(this.enabled));
+                prefs.put("Script", "isolationGroup", this.isolationGroup);
+		super.save(prefs);
+	}
+
+        @Override
+	protected void loadInf(Ini prefs){
+		super.loadInf(prefs);
+                this.enabled = this.getInfBoolean(prefs,"Script","enable", true);
+                this.isolationGroup = this.getInfString(prefs,"Script","isolationGroup", null);
+                if( StringUtils.isEmpty(this.isolationGroup) ) {
+                    this.isolationGroup = null;
+                }
+        }
+	
+
+        public void registerDataFolder(String id) {
+            this.getManager().registerDataFolder(this.getParent(), id);
+        }
+       
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/MutableURLClassLoader.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/MutableURLClassLoader.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/MutableURLClassLoader.java	(revision 1126)
@@ -0,0 +1,96 @@
+
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class MutableURLClassLoader extends URLClassLoader {
+    protected static final Logger logger = LoggerFactory.getLogger(MutableURLClassLoader.class);
+    
+    public MutableURLClassLoader(List<URL> urls, ClassLoader parent) {
+        super(urls.toArray(new URL[urls.size()]),parent);
+    }
+    
+    public void addUrls(List<URL> urls) {
+        List<URL> currentsURLs = new ArrayList<>();
+        currentsURLs.addAll(Arrays.asList(this.getURLs()));
+        
+        for (URL url : urls) {
+            if( ! currentsURLs.contains(url) ) {
+                this.addURL(url);
+                currentsURLs.add(url);
+            }
+        }
+    }
+
+    public boolean needRecompile(String name, URL url) {
+        if( url!=null && name.endsWith("$py.class") ) {
+            if( StringUtils.equalsIgnoreCase(url.getProtocol(),"file") ) {
+                String path = url.getPath();
+                File binary = new File(path);
+                File source = new File(StringUtils.left(path, path.length()-9)+".py");
+                if( !binary.exists() || org.apache.commons.io.FileUtils.isFileNewer(source, binary) ) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    @Override
+    public URL getResource(String name) {
+        // Para acceder a esto desde python
+        // import sys
+        // print sys.getClassLoader().getResource("pylint/utils$py.class")
+
+        URL x = super.getResource(name); 
+        if( needRecompile(name, x) ) {
+            logger.trace("getResoure("+name+") -> null (need recompile).");
+            return null;
+        }
+        logger.trace("getResoure("+name+") -> "+x);
+        return x;
+    }
+
+    @Override
+    public InputStream getResourceAsStream(String name) {
+        URL url = super.getResource(name); 
+        if( needRecompile(name, url) ) {
+            logger.trace("getResourceAsStream("+name+") -> null (need recompile).");
+            return null;
+        }
+        InputStream x = super.getResourceAsStream(name); 
+        logger.trace("getResourceAsStream("+name+") -> "+(x==null? "null":"(stream)"));
+        return x;
+    }
+
+    @Override
+    public Enumeration<URL> getResources(String name) throws IOException {
+        Enumeration<URL> urls = super.getResources(name); 
+        logger.info("getResources("+name+") -> "+(urls==null? "null":urls));
+        return urls;
+    }
+    
+    public String getResourcePath(String name) {
+        if( name.startsWith("__pyclasspath__/") ) {
+            name = name.substring(16);
+        }
+        URL url = this.getResource(name);
+        if( url == null ) {
+            return name;
+        }
+        File f = org.apache.commons.io.FileUtils.toFile(url);
+        return f.getAbsolutePath();
+    }    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingInstallerProvider.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingInstallerProvider.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptingInstallerProvider.java	(revision 1126)
@@ -0,0 +1,103 @@
+/* gvSIG. Geographic Information System of the Valencian Government
+ *
+ * Copyright (C) 2007-2008 Infrastructures and Transports Department
+ * of the Valencian Government (CIT)
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+ * MA  02110-1301, USA.
+ * 
+ */
+
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import org.apache.commons.io.FileUtils;
+
+import org.gvsig.installer.lib.api.PackageInfo;
+import org.gvsig.installer.lib.api.execution.InstallPackageServiceException;
+import org.gvsig.installer.lib.spi.InstallPackageProviderServices;
+import org.gvsig.installer.lib.spi.InstallerProviderLocator;
+import org.gvsig.installer.lib.spi.InstallerProviderManager;
+import org.gvsig.installer.lib.spi.execution.InstallPackageProvider;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.tools.service.spi.AbstractProvider;
+import org.gvsig.tools.service.spi.ProviderServices;
+
+public class ScriptingInstallerProvider extends AbstractProvider
+    implements InstallPackageProvider {
+
+    public ScriptingInstallerProvider(ProviderServices providerServices) {
+        super(providerServices);
+    }
+
+    public void install(File applicationDirectory, InputStream inputStream,
+        PackageInfo packageInfo) throws InstallPackageServiceException {
+
+    	ScriptingManager scriptingManager = ScriptingLocator.getManager();
+    	
+    	File target = scriptingManager.getRootUserFolder();
+        target = new File(target,"addons");
+    	
+        try {
+            if( ! target.exists() ) {
+                FileUtils.forceMkdir(target);
+            }
+            InstallerProviderManager installerProviderManager =
+                InstallerProviderLocator.getProviderManager();
+            InstallPackageProviderServices installerProviderServices =
+                installerProviderManager.createInstallerProviderServices();
+
+            installerProviderServices.decompress(inputStream, target);
+            
+            // Ajustamos las fechas de modificacion de los ficheros de forma que
+            // los fuentes sean mas nuevos que los binarios.
+            // Esto forzara que se recompilen la primera vez que se ejecuten.
+            // Si no hacemos esto y las fecha de los binarios son futuras, aunque
+            // se editen y cambien los fuentes nunca se reccompilaran.
+            Iterator<File> it = FileUtils.iterateFiles(target, new String[] {"class"}, true);
+            while( it.hasNext() ) {
+                File f = it.next();
+                try {
+                    FileUtils.touch(f);
+                } catch (IOException e) {
+                    // Do nothing
+                }
+            }
+            it = FileUtils.iterateFiles(target, new String[] {"py","r","scala","groovy"}, true);
+            while( it.hasNext() ) {
+                File f = it.next();
+                try {
+                    FileUtils.touch(f);
+                } catch (IOException e) {
+                    // Do nothing
+                }
+            }
+
+        } catch (Exception e) {
+            throw new InstallPackageServiceException(e);
+        }
+    }
+
+    public void installLater(File applicationDirectory,
+        InputStream inputStream, PackageInfo packageInfo)
+        throws InstallPackageServiceException, IOException {
+        // TODO Auto-generated method stub
+
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingScript.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingScript.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingScript.java	(revision 1126)
@@ -0,0 +1,953 @@
+package org.gvsig.scripting.impl;
+
+import groovy.lang.GroovyClassLoader;
+import groovy.util.GroovyScriptEngine;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.Invocable;
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.gvsig.scripting.CompileErrorException;
+import org.gvsig.scripting.ExecuteErrorException;
+import org.gvsig.scripting.Main;
+import org.gvsig.scripting.ScriptingBaseScript;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.dispose.Disposable;
+import org.gvsig.tools.observer.Observer;
+import org.gvsig.tools.observer.impl.DelegateWeakReferencingObservable;
+import org.gvsig.tools.task.AbstractMonitorableTask;
+import org.ini4j.Ini;
+import org.python.core.Py;
+import org.python.core.PyException;
+import org.python.core.PyString;
+import org.python.core.PySystemState;
+import org.python.core.PyTraceback;
+import org.python.core.imp;
+import org.python.jsr223.MyPyScriptEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("EqualsAndHashcode")
+public class DefaultScriptingScript extends AbstractScript implements
+        ScriptingScript {
+
+    @SuppressWarnings("FieldNameHidesFieldInSuperclass")
+    private static final Logger logger = LoggerFactory.getLogger(DefaultScriptingScript.class);
+    protected String langName;
+    protected String extension = null;
+    protected String librarySuffix = null;
+    protected ScriptEngine engine = null;
+    protected CompiledScript compiledCode;
+    protected boolean useSysPath;
+
+    private String code = null;
+    private String mainName = "main";
+    private final DelegateWeakReferencingObservable delegatedObservable;
+    private OutputWriter stdout;
+    private OutputWriter stderr;
+
+    public static class OutputWriter extends Writer {
+
+        private final Set<Writer> writers = new HashSet<>();
+        private final PrintStream out;
+
+        private OutputWriter(PrintStream out) {
+            this.out = out;
+        }
+
+        @Override
+        public void write(char[] cbuf, int off, int len) throws IOException {
+            try {
+                byte[] buf = new String(cbuf).getBytes(Charset.forName("UTF-8"));
+                out.write(buf, off, len);
+            } catch (Exception ex) {
+                logger.warn("Can't output",ex);
+            }
+            for (Writer writer : writers) {
+                try {
+                    writer.write(cbuf, off, len);
+                } catch (Exception ex) {
+                    logger.warn("Can't output",ex);
+                }
+            }
+        }
+
+        @Override
+        public void flush() throws IOException {
+            try {
+                out.flush();
+            } catch (Exception ex) {
+                logger.warn("Can't flush",ex);
+            }
+            for (Writer writer : writers) {
+                try {
+                    writer.flush();
+                } catch (Exception ex) {
+                    logger.warn("Can't flush",ex);
+                }
+            }
+        }
+
+        @Override
+        public void close() throws IOException {
+        }
+
+        private void addWriter(Writer out) {
+            this.writers.add(out);
+        }
+
+        private void removeWriter(Writer out) {
+            this.writers.remove(out);
+        }
+
+    }
+
+    @SuppressWarnings("OverridableMethodCallInConstructor")
+    protected DefaultScriptingScript(ScriptingFolder parent, String typename, ScriptingManager manager, String id) {
+        super(parent, typename, manager, id);
+        this.useSysPath = false;
+        this.setLangName("python");
+        this.setSaved(true);
+        this.delegatedObservable = new DelegateWeakReferencingObservable(this);
+        this.stdout = new OutputWriter(System.out);
+        this.stderr = new OutputWriter(System.err);
+    }
+
+    public DefaultScriptingScript(ScriptingFolder parent, ScriptingManager manager, String id) {
+        this(parent, ScriptingManager.UNIT_SCRIPT, manager, id);
+    }
+
+    public DefaultScriptingScript(ScriptingFolder parent, ScriptingManager manager, String id, String langName) {
+        this(parent, ScriptingManager.UNIT_SCRIPT, manager, id);
+        if( !StringUtils.isBlank(langName) ) {
+            this.setLangName(langName);
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        File f = this.getFile();
+        if( f!=null ) {
+            return "#$FILE$#".hashCode() + f.getAbsolutePath().hashCode();
+        }
+        String s = this.getId();
+        if( s != null ) {
+            return "#$ID$#".hashCode() + s.hashCode();
+        }
+        s = this.getCode();
+        if( s != null ) {
+            return "#$CODE$#".hashCode() + s.hashCode();
+        }
+        return super.hashCode();
+    }
+    @Override
+    public void addStdoutWriter(Writer out) {
+        this.stdout.addWriter(out);
+    }
+    
+    @Override
+    public void addStderrWriter(Writer err) {
+        this.stderr.addWriter(err);
+    }
+    
+    @Override
+    public void removeStdoutWriter(Writer out) {
+        this.stdout.removeWriter(out);
+    }
+    
+    @Override
+    public void removeStderrWriter(Writer err) {
+        this.stdout.removeWriter(err);
+    }
+    
+    public Object __getattr__(String name) {
+        try {
+            ScriptEngine theEngine = this.getEngine();
+            this.compile();
+            return theEngine.get(name);
+        } catch(Exception ex) {
+            return null;
+        }
+    }
+
+    public void __setattr__(String name, Object value) {
+        ScriptEngine theEngine = this.getEngine();
+        this.compile();
+        theEngine.put(name, value);
+    }
+
+    public Object __call__() {
+        return this.run();
+    }
+
+    public Object __call__(Object[] args) {
+        return this.run(args);
+    }
+
+    public OutputWriter getStdout() {
+        return this.stdout;
+    }
+    
+    public OutputWriter getStderr() {
+        return this.stderr;
+    }
+    
+    protected void notifyErrors(Exception exception, String command) {
+        this.delegatedObservable.notifyObservers(new BaseScriptingNotifycation(
+                this, BaseScriptingNotifycation.RUNTIME_ERROR_NOTIFICATION,
+                command, exception));
+    }
+
+
+    @Override
+    public String getCode() {
+        if (this.code == null) {
+            File f = null;
+            try {
+                f = this.getFileResource(this.extension);
+                this.code = FileUtils.readFileToString(f);
+            } catch (IOException e) {
+                String fname = (f == null) ? "(null)" : f.getAbsolutePath();
+                logger.warn("Can't load code from file '" + fname + "'.");
+            }
+        }
+        return this.code;
+    }
+
+    @Override
+    public void setCode(String code) {
+        this.code = code;
+        this.engine = null;
+        this.compiledCode = null;
+        this.setSaved(false);
+    }
+    
+    @Override
+    public String getLibrarySuffix() {
+        return this.librarySuffix;
+    }
+
+    @Override
+    public void setLibrarySuffix(String librarySuffix) {
+        this.librarySuffix = librarySuffix;
+    }
+    
+    public List<File> getLibFolders() {
+        List<File> folders = this.manager.getLibFolders();
+        String suffix = this.getLibrarySuffix();
+        if( suffix == null ) {
+            return folders;
+        }
+        for( int i=0; i<folders.size(); i++) {
+            File folder = folders.get(i);
+            File f = new File(folder.getParentFile(),folder.getName()+suffix);
+            if( f.exists() ) {
+                folders.set(i, f);
+            }
+        }
+        return folders;
+    }
+    
+    protected String getCodeToInitializeEngine() {
+        String initName = "org/gvsig/scripting/langs/"+this.getLangName().toLowerCase()+"/init.txt";
+        try {
+            InputStream template = this.getClass().getClassLoader().getResourceAsStream(initName);
+            if( template == null ) {
+                return null;
+            }
+            List<String> lines = IOUtils.readLines(template);
+            return StringUtils.join(lines, "\n");
+        } catch (Exception ex) {
+            logger.warn("Can't load code to initialize the script from '"+initName+".",ex);
+            return null;
+        }
+    }
+
+    private List<URL> getClassPath() {
+        Set<URL> classPath = new HashSet<>();
+        
+        try {
+//            ClassLoader myloader = this.getClass().getClassLoader();
+//            if( myloader instanceof URLClassLoader) {
+//                classPath.addAll(Arrays.asList(((URLClassLoader) myloader).getURLs()));
+//            }
+            URL url;
+            if( StringUtils.isEmpty(this.getIsolationGroup()) ) {
+                url = this.getFile().getParentFile().getCanonicalFile().toURI().toURL();
+                classPath.add(url);
+            }
+            
+            url = this.getManager().getUserFolder().getFile().getCanonicalFile().toURI().toURL();
+            classPath.add(url);
+
+            List<File> folders = getLibFolders();
+            if( folders!=null ) {
+                for (File folder : folders) {
+                    url = folder.getAbsoluteFile().toURI().toURL();
+                    classPath.add(url);
+                }
+            }
+            
+            ScriptingFolder folders2 = getManager().getSystemFolder();
+            if( folders2!=null ) {
+                for (ScriptingUnit folder : folders2.getUnits()) {
+                    url = folder.getFile().getCanonicalFile().toURI().toURL();
+                    classPath.add(url);
+                }
+            }
+        } catch(Exception ex) {
+            
+        }
+        return new ArrayList<>(classPath);
+    }
+    
+    private void addClassPathToEngine(ScriptEngine engine, List<URL> classPath) {
+        if( engine instanceof MyPyScriptEngine ) {
+            PySystemState sys = Py.getSystemState();
+            if( this.useSysPath ) {
+//                logger.info("Running without sys.classLoader, "+ this.getFile().getAbsolutePath()+".");
+//                ReentrantLock importLock =sys.getImportLock();
+//                importLock.lock();
+//                try {
+                    Set<PyString> paths = new LinkedHashSet<>();
+                    for( int i=0; i<sys.path.size(); i++) {
+                        String path = (String) sys.path.get(i);
+                        if( !(path.equals("__pyclasspath__/") || path.equals("__classpath__")) ) {
+                            paths.add(Py.newString(path));
+                        }
+                    }
+                    for (URL url : classPath) {
+                        String path = FileUtils.toFile(url).getAbsolutePath();
+                        paths.add(Py.newString(path));
+                    }
+                    paths.add(Py.newString("__classpath__"));
+                    paths.add(Py.newString("__pyclasspath__/"));
+                    sys.path.addAll(paths);
+                    
+//                } finally {
+//                    importLock.unlock();
+//                }
+            } else {
+                ClassLoader loader = sys.getClassLoader();
+                if( loader == null ) {
+                    ClassLoader parentClassLoader = imp.getParentClassLoader();
+                    loader = new MutableURLClassLoader(classPath, parentClassLoader);
+                    sys.setClassLoader(loader);
+                } else if( loader instanceof MutableURLClassLoader ) {
+                    ((MutableURLClassLoader) loader).addUrls(classPath);
+                }
+            }
+
+        } else if( engine instanceof GroovyScriptEngine ) {
+            GroovyClassLoader loader = ((GroovyScriptEngine)engine).getGroovyClassLoader();
+            Set<URL> urls = new HashSet(); 
+            urls.addAll(Arrays.asList(loader.getURLs()));
+            for (URL url : classPath) {
+                if( ! urls.contains(url) ) {
+                    loader.addURL(url);
+                }
+            }
+        }
+    }
+
+    public ScriptEngine getEngine() {
+        if (this.engine == null) {
+            synchronized(this.getManager()) {
+                ScriptEngine scriptEngine = this.manager.getEngineByLanguage(langName, this.getIsolationGroup());
+                addClassPathToEngine(scriptEngine,getClassPath());
+                
+                scriptEngine.put("script", this);
+                scriptEngine.put("Main", Main.class);
+                scriptEngine.getContext().setWriter(stdout);
+                scriptEngine.getContext().setErrorWriter(stderr);
+
+                this.engine = scriptEngine;
+                String theCode = this.getCodeToInitializeEngine();
+                if (theCode != null) {
+                    try {
+                        this.engine.eval(theCode);
+                    } catch (Exception ex) {
+                        logger.warn("Can't initialize engine with the code:\n" + theCode, ex);
+                    }
+                }
+            }
+        }
+        return this.engine;
+    }
+
+    @Override
+    protected void loadInf(Ini prefs) {
+        super.loadInf(prefs);
+
+        this.setMainName((String) getInfValue(prefs, "Script", "main", "main"));
+        this.setLangName((String) getInfValue(prefs, "Script", "Lang",this.getLangName()));
+        this.setLibrarySuffix((String) getInfValue(prefs, "Script", "LibraryVersion",null));
+        this.useSysPath = getInfBoolean(prefs, "Script", "useSysPath", false);
+    }
+
+    @Override
+    public void load(ScriptingFolder folder, String id) {
+        this.setId(id);
+        this.setParent(folder);
+
+        String theExtension = FilenameUtils.getExtension(id);
+        if( theExtension != null ) {
+            String language = this.manager.getLanguageOfExtension(theExtension);
+            if( language != null ) {
+                this.setLangName(language);
+            }
+            this.setExtension(theExtension);
+        }
+        File f = getFileResource(".inf");
+        if (f.isFile()) {
+            Ini prefs = null;
+            try {
+                prefs = new Ini(f);
+            } catch (Exception e) {
+                logger.warn("Can't load 'inf' file '" + f.getAbsolutePath() + "'.", e);
+            }
+            loadInf(prefs);
+        }
+        this.setCode(null);
+        this.setSaved(true);
+    }
+
+    @Override
+    public void save() {
+        this.saveInfo();
+        // Guardo el codigo en el fichero
+        File fcode = this.getFileResource(this.getExtension());
+        try {
+            FileUtils.write(fcode, this.getCode());
+        } catch (Exception e) {
+            logger.warn("Can't write code to file '" + fcode.getAbsolutePath() + "'.", e);
+        }
+        this.setSaved(true);
+    }
+
+    private void saveInfo() {
+        File f = getFileResource(".inf");
+        if (!f.isFile()) {
+            try {
+                f.createNewFile();
+            } catch (Exception e) {
+                logger.warn("Can't create 'inf' file '" + f.getAbsolutePath() + "'.", e);
+            }
+        }
+        Ini prefs = null;
+        try {
+            prefs = new Ini(f);
+        } catch (Exception e) {
+            logger.warn("Can't load 'inf' file '" + f.getAbsolutePath() + "'.", e);
+        }
+        save(prefs);
+    }
+    
+    @Override
+    protected void save(Ini prefs) {
+        super.save(prefs);
+        prefs.put("Script", "main", this.getMainName());
+        prefs.put("Script", "Lang", this.getLangName());
+        if( this.useSysPath ) {
+            prefs.put("Script", "useSysPath", this.useSysPath);
+        }
+        try {
+            prefs.store();
+        } catch (IOException e) {
+            String fname = (prefs.getFile() == null) ? "(null)" : prefs.getFile().getAbsolutePath();
+            logger.warn("Can't save inf file (" + fname + ").", e);
+        }
+
+    }
+
+    @Override
+    public String getLangName() {
+        return this.langName;
+    }
+
+    protected void setLangName(final String langName) {
+        if( langName == null ) {
+            return;
+        }
+        this.langName = langName;
+        this.setExtension(this.manager.getExtensionOfLanguage(this.langName));
+    }
+
+    @Override
+    public String[] getIconNames() {
+        return new String[]{
+            "scripting-icon-" + this.getLangName().toLowerCase(),
+            "scripting-icon-" + this.getLangName().toLowerCase() + "-open"
+        };
+    }
+
+    @Override
+    public String getMainName() {
+        return this.mainName;
+    }
+
+    @Override
+    public void setMainName(final String mainName) {
+        this.mainName = mainName;
+    }
+    
+    @Override
+    public List<File> getFiles() {
+        List<File> l = new ArrayList<>();
+        l.add(this.getScriptFile());
+        return l;
+    }
+
+    public String getExtension() {
+        return this.extension;
+    }
+
+    public void setExtension(final String extension) {
+        if (!extension.startsWith(".")) {
+            this.extension = "." + extension;
+        } else {
+            this.extension = extension;
+        }
+    }
+
+    @Override
+    public void addObserver(final Observer o) {
+        this.delegatedObservable.addObserver(o);
+    }
+
+    @Override
+    public void deleteObserver(final Observer o) {
+        this.delegatedObservable.deleteObserver(o);
+    }
+
+    @Override
+    public void deleteObservers() {
+        this.delegatedObservable.deleteObservers();
+    }
+
+    @Override
+    public void put(final String name, final Object value) {
+        this.getEngine().put(name, value);
+    }
+
+    @Override
+    public void compile() {
+        if (this.compiledCode == null) {
+            ScriptEngine theEngine = this.getEngine();
+            if (theEngine instanceof Compilable) {
+                try {
+                    Compilable compilable = (Compilable) theEngine;
+                    String theCode = this.getCode();
+                    if( "python".equalsIgnoreCase(this.getLangName()) ) {
+                        // If a Unicode string with a coding declaration is passed to compile(),
+                        // a SyntaxError will be raised, but this is necessary to import from 
+                        // another module, so we remove it.
+                        // http://bugs.jython.org/issue1696
+                        theCode = theCode.replaceFirst("^\\s*#([^:\\n]*)coding:","#$1 c-o-d-i-n-g:");
+                    }
+                    this.compiledCode = compilable.compile(theCode);
+                    if( theEngine instanceof Invocable) {
+                        this.compiledCode.eval();
+                    }
+                } catch (ScriptException e) {
+                    Object[] location = this.getLocation(e);
+                    CompileErrorException ce = new CompileErrorException(
+                            e.getMessage(), 
+                            (File) location[0], 
+                            (int) location[1], 
+                            (int) location[2], 
+                            e
+                    );
+                    notifyErrors(ce, "compile");
+                    throw ce;
+                } catch (Throwable e) {
+                    CompileErrorException ce = new CompileErrorException(e.getMessage(), this.getScriptFile(), e);
+                    notifyErrors(new Exception(e), "compile");
+                    throw ce;
+                }
+            } else {
+                String theCode = this.getCode();
+                try {
+                    theEngine.eval(theCode);
+                } catch (ScriptException e) {
+                    Object[] location = this.getLocation(e);
+                    CompileErrorException ce = new CompileErrorException(
+                            e.getMessage(), 
+                            (File) location[0], 
+                            (int) location[1], 
+                            (int) location[2], 
+                            e
+                    );                    
+                    notifyErrors(ce, "compile");
+                    throw ce;
+                }
+            }
+        }
+    }
+
+    public void addDisposable(Disposable disposable) {
+        //pass
+    }
+
+    /**
+     * Run the main function of this script.
+     * This method is created by familiarity when running the script from another script.
+     * @return 
+     */
+    public Object main() {
+        return this.run(null);
+    }
+
+    /**
+     * Run the main function of this script.
+     * This method is created by familiarity when running the script from another script.
+     * @param args
+     * @return 
+     */
+    public Object main(Object... args) {
+        return this.run(args);
+    }
+
+        
+    @Override
+    public Object run() {
+        return this.run(null);
+    }
+
+    @Override
+    public Object run(Object args[]) {
+        if( !this.isEnabled() ) {
+            System.err.printf("The script '"+this.getName()+"' is not enabled, see properties page to change.\n");
+            return null;
+        }
+        if (args == null) {
+            args = new Object[]{};
+        }
+        this.compile();
+        return this.invokeFunction(this.getMainName(), args);
+    }
+
+    @Override
+    public Object invokeFunction(final String name, Object args[]) {
+        try {
+            if (this.getEngine() instanceof Invocable) {
+                Invocable invocable = (Invocable) this.getEngine();
+                this.compile();
+                if (args == null) {
+                    args = new Object[]{};
+                }
+                return invocable.invokeFunction(name, args);
+            } else {
+                if (this.compiledCode != null) {
+                    Object x = this.compiledCode.eval();
+                    if( x instanceof Main ) {
+                        return ((Main) x).main(args);
+                    } else if(x instanceof Runnable) {
+                        ((Runnable) x).run();
+                    }
+                }
+                return null;
+            }
+        } catch (ScriptException e) {
+            Object[] location = this.getLocation(e);
+            ExecuteErrorException ee = new ExecuteErrorException(
+                    e.getMessage(), 
+                    (File) location[0], 
+                    (int) location[1], 
+                    (int) location[2], 
+                    e
+            );
+            notifyErrors(ee, "invoke");
+            throw ee;
+
+        } catch (Error | Exception e) {
+            ExecuteErrorException ee = new ExecuteErrorException(e.getMessage(), this.getScriptFile(), e);
+            notifyErrors(ee, "invoke");
+            throw ee;
+        }
+    }
+
+    @Override
+    public File getScriptFile() {
+        return this.getFileResource(extension);
+    }
+
+    private Object[] getLocation(ScriptException e) {
+        Throwable[] es = ExceptionUtils.getThrowables(e);
+        Exception dbgex; // Para debug con mas comodidad
+        for( Throwable t : es) {
+            if( t instanceof PyException ) {
+                try {
+                    PyException pyex = (PyException)t;
+                    PyTraceback tb = pyex.traceback;
+                    if( tb!=null ) {
+                        while( tb.tb_next!=null ) {
+                            tb = (PyTraceback) tb.tb_next;
+                        }
+                        String s = tb.tb_frame.f_globals.__getitem__(new PyString("__file__")).asString();
+                        if( s.endsWith("$py.class") ) {
+                            s = s.substring(0, s.length()-9) + ".py";
+                            File resource = new File(s);
+                            return new Object[] { resource, tb.tb_lineno, 0};
+                        }
+                        return new Object[] { this.getScriptFile(), tb.tb_lineno, 0};
+                    }
+                } catch(Exception ex) {
+                    // Pass
+                    dbgex = ex;
+                }
+            }
+        }        
+        int column = e.getColumnNumber();
+        if( column < 0 ) {
+            column = 0;
+        }
+        return new Object[] { this.getScriptFile(), e.getLineNumber(), column };
+    }
+    
+    
+    @Override
+    public Object invokeMethod(final Object obj, final String name, Object[] args)
+            throws NoSuchMethodException {
+
+        if (this.getEngine() instanceof Invocable) {
+            Invocable invocable = (Invocable) this.getEngine();
+            this.compile();
+            if (args == null) {
+                args = new Object[]{};
+            }
+            try {
+                return invocable.invokeMethod(obj, name, args);
+            } catch (ScriptException e) {
+                ExecuteErrorException ee = new ExecuteErrorException(e.getMessage(), this.getScriptFile(), e.getLineNumber(), e.getColumnNumber(), e);
+                notifyErrors(ee, "invoke");
+                throw ee;
+            } catch (Throwable e) {
+                ExecuteErrorException ee = new ExecuteErrorException(e.getMessage(), this.getScriptFile(), e);
+                notifyErrors(ee, "invoke");
+                throw ee;
+            }
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public File getResource(String filename) {
+        return new File(this.getParent().getFile(), filename);
+    }
+
+    @Override
+    public String getMimeType() {
+        return "text/"+ this.getLangName();
+    }
+
+    @Override
+    protected void console_println(String s) {
+        super.console_println(s);
+        try {
+            this.stdout.write(s+"\n");
+        } catch (IOException ex) {
+        }
+    }
+
+    class ScriptTask extends AbstractMonitorableTask {
+
+        ScriptingBaseScript script = null;
+        Object[] args = null;
+
+        protected ScriptTask(ScriptingBaseScript script, Object[] args) {
+            super(script.getName(), false);
+            this.args = args;
+            this.script = script;
+            this.script.put("task", this);
+            this.script.put("taskStatus", this.getTaskStatus());
+        }
+
+        @Override
+        public void run() {
+            try {
+                console_println("Running script " + this.script.getName() + ".");
+                script.run(this.args);
+                console_println("Script " + this.script.getName() + " terminated.");
+            } catch (Throwable e) {
+                console_println("Stript " + this.script.getName() + " aborted.");
+            } finally {
+                this.taskStatus.terminate();
+                try {
+                    Thread.sleep(3000);
+                } catch (InterruptedException e) {
+                    // Ignore
+                }
+                this.taskStatus.remove();
+            }
+        }
+
+        public void showTaskStatus() {
+            this.taskStatus.add();
+        }
+    }
+
+    @Override
+    public void runAsTask(Object[] args) {
+        if( !this.isEnabled() ) {
+            System.err.printf("The script '"+this.getName()+"' is not enabled, see properties page to change.\n");
+            return;
+        }
+        ScriptTask task = new ScriptTask(this, args);
+        task.start();
+    }
+
+    @Override
+    public boolean remove() {
+        boolean r = true;
+        File folder = this.getParent().getFile();
+        File f = new File(folder, this.getId() + ".inf");
+        try {
+            FileUtils.forceDelete(f);
+        } catch (IOException e) {
+            logger.warn("Can't remove inf file '" + f.getAbsolutePath() + "'.", e);
+            r = false;
+        }
+        try {
+            f = new File(folder, this.getId() + this.getExtension());
+            FileUtils.forceDelete(f);
+        } catch (IOException e) {
+            logger.warn("Can't remove code file '" + f.getAbsolutePath() + "'.", e);
+            r = false;
+        }
+        return r;
+    }
+
+    @Override
+    public void create(ScriptingFolder folder, String id, String language) {
+        this.setParent(folder);
+        this.setId(id);
+        if (language == null) {
+            this.setLangName("python");
+        } else {
+            this.setLangName(language);
+        }
+        this.setExtension(this.manager.getExtensionOfLanguage(getLangName()));
+
+        File file = new File(folder.getFile(), id + ".inf");
+        try {
+            file.createNewFile();
+        } catch (IOException e) {
+            logger.warn("Can't create file of the dialog in '" + file.getAbsolutePath() + "'.", e);
+        }
+        File fcode = this.getFileResource(this.getExtension());
+        if( fcode.exists() ) {
+            this.saveInfo();
+        } else {
+            String template = this.getNewTemplate();
+            if( template != null ) {
+                this.setCode(template);
+            }
+            this.save();
+        }
+    }
+
+    public String getNewTemplate() {
+        String theTemplateName = "org/gvsig/scripting/langs/"+this.getLangName().toLowerCase()+"/new_template.txt";
+        try {
+            InputStream template = this.getClass().getClassLoader().getResourceAsStream(theTemplateName);
+            if( template == null ) {
+                return null;
+            }
+            List<String> lines = IOUtils.readLines(template);
+            return StringUtils.join(lines, "\n");
+        } catch (Exception ex) {
+            logger.warn("Can't load new-template from '"+theTemplateName+"'.",ex);
+            return null;
+        }
+    }
+    
+    public ScriptingUnit get(String name) {
+        return this.manager.getScript(name);
+    }
+
+    public ScriptingUnit get(File file) {
+        return this.manager.getScript(file);
+    }
+
+    @Override
+    public boolean move(ScriptingFolder target) {
+        if (! manager.validateUnitId(target, this.getId()) ) {
+            logger.info("Can't move script '"+this.getId()+"' to '"+target.getFile().getAbsolutePath()+"', is not valid.");
+            return false;
+        }
+        if( !this.isSaved() ) {
+            logger.info("Can't move script '"+this.getId()+"', is not saved.");
+            return false;
+        }
+        try {
+            File codefile = this.getFileResource(this.extension);
+            FileUtils.moveFileToDirectory(this.getFile(), target.getFile(),true);
+            FileUtils.moveFileToDirectory(codefile, target.getFile(), true);
+            this.parent = target;
+            this.load(target, id);
+        } catch (IOException ex) {
+            logger.info("Can't move script '"+this.getId()+"' to '"+target.getFile().getAbsolutePath()+"', "+ex.getMessage(),ex);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean rename(String newId) {
+        if (! manager.validateUnitId(this.getParent(), newId) ) {
+            logger.info("Can't rename script '"+this.getId()+"', target id '"+newId+"' is not valid.");
+            return false;
+        }
+        if( !this.isSaved() ) {
+            logger.info("Can't rename script '"+this.getId()+"', is not saved.");
+            return false;
+        }
+        try {
+            ScriptingFolder target = this.getParent();
+            File codefile = this.getFileResource(this.extension);
+            FileUtils.moveFile(this.getFile(),  new File(target.getFile(),newId+".inf") );
+            FileUtils.moveFile(codefile, new File(target.getFile(),newId+this.extension));
+            this.setId(newId);
+            this.saveInfo();
+            this.load(target, id);
+        } catch (IOException ex) {
+            logger.info("Can't rename script '"+this.getId()+"' to '"+newId+"', "+ex.getMessage(),ex);
+            return false;
+        }        
+        return true;
+    }
+
+    @Override
+    public List<String> getNames() {
+        ScriptEngine theEngine = this.getEngine();
+        if( theEngine instanceof MyPyScriptEngine ) {
+            return ((MyPyScriptEngine) theEngine).getLocalNames();
+        }
+        return null;
+    }    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DataFolderManager.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DataFolderManager.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DataFolderManager.java	(revision 1126)
@@ -0,0 +1,327 @@
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.DataFolderFound;
+import org.gvsig.tools.packageutils.Version;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.packageutils.PackageManager;
+import org.gvsig.tools.util.FolderSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+@SuppressWarnings("UseSpecificCatch")
+public class DataFolderManager {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DataFolderManager.class);
+    
+    private static final String DATAFOLDER_FILENAME = "data";
+
+    private class DataFolderRegisterEntry {
+        public String folderId;
+        public String folderPath;
+        public boolean processed;
+    }
+
+    private class DataFolderRegister implements Iterable<DataFolderRegisterEntry> {
+
+        private static final String DATAFOLDER_REGISTER_FILENAME = "data.properties";
+
+        private static final String ID_KEY_SUFFIX = ".id";
+        private static final String PATH_KEY_SUFFIX = ".path";
+        private static final String PROCESSED_KEY_SUFFIX = ".processed";
+
+        private Properties props;
+
+        public DataFolderRegister() {
+            File f = FileUtils.getFile(getHomeFolder(), DATAFOLDER_REGISTER_FILENAME);
+            this.props = new Properties();
+            if (f.exists()) {
+                FileInputStream inStream = null;
+                try {
+                    inStream = new FileInputStream(f);
+                    props.load(inStream);
+                } catch (Exception ex) {
+
+                } finally {
+                    IOUtils.closeQuietly(inStream);
+                }
+            }
+        }
+
+        private String getPathKey(String id) {
+            return id + PATH_KEY_SUFFIX;
+        }
+
+        private String getProcessedKey(String id) {
+            return id + PROCESSED_KEY_SUFFIX;
+        }
+
+        private String getIdKey(String id) {
+            return id + ID_KEY_SUFFIX;
+        }
+
+        private void save() {
+            File f = FileUtils.getFile(getHomeFolder(), DATAFOLDER_REGISTER_FILENAME);
+            FileOutputStream out = null;
+            try {
+                out = new FileOutputStream(f);
+                this.props.store(out, "");
+            } catch (Exception ex) {
+
+            } finally {
+                IOUtils.closeQuietly(out);
+            }
+        }
+
+        public Iterator<DataFolderRegisterEntry> iterator() {
+            Set<String> ids = new HashSet<>();
+            for (Object key : props.keySet()) {
+                if (StringUtils.endsWith((String) key, ID_KEY_SUFFIX)) {
+                    ids.add(props.getProperty((String) key));
+                }
+            }
+            final Iterator<String> it = ids.iterator();
+            return new Iterator<DataFolderRegisterEntry>() {
+                @Override
+                public boolean hasNext() {
+                    return it.hasNext();
+                }
+
+                @Override
+                public DataFolderRegisterEntry next() {
+                    String id = it.next();
+                    return get(id);
+                }
+            };
+        }
+        
+        public DataFolderRegisterEntry get(String id) {
+            if( !this.props.containsKey(getIdKey(id)) ) {
+                return null;
+            }
+            DataFolderRegisterEntry entry = new DataFolderRegisterEntry();
+            entry.folderId = id;
+            entry.folderPath = props.getProperty(getPathKey(id));
+            entry.processed = BooleanUtils.toBoolean(props.getProperty(getProcessedKey(id)));
+            return entry;
+        }
+
+        public  void put(DataFolderRegisterEntry entry) {
+            this.put( entry.folderId, entry.folderPath,entry.processed);
+        }
+
+        public  void put(String id, String path, boolean processed) {
+            this.props.setProperty(getIdKey(id), id);
+            this.props.setProperty(getPathKey(id), path);
+            this.props.setProperty(getProcessedKey(id), 
+                    BooleanUtils.toStringTrueFalse(processed));
+        }
+    }
+
+    private class DefaultDataFolderFound implements DataFolderFound {
+
+        private final String dataFolderId;
+        private final ScriptingFolder applicationFolder;
+        private final File newDataFolder;
+        private final File oldDataFolder;
+        private final Version oldDataFolderVersion;
+
+        public DefaultDataFolderFound(
+                String dataFolderId,
+                ScriptingFolder applicationFolder,
+                File newDataFolder,
+                File oldDataFolder,
+                Version oldDataFolderVersion
+        ) {
+            this.dataFolderId = dataFolderId;
+            this.applicationFolder = applicationFolder;
+            this.newDataFolder = newDataFolder;
+            this.oldDataFolder = oldDataFolder;
+            this.oldDataFolderVersion = oldDataFolderVersion;
+        }
+
+        @Override
+        public String getDataFolderId() {
+            return this.dataFolderId;
+        }
+
+        @Override
+        public ScriptingFolder getApplicationFolder() {
+            return this.applicationFolder;
+        }
+
+        @Override
+        public String getApplicationName() {
+            return this.applicationFolder.getName();
+        }
+
+        @Override
+        public File getNewDataFolder() {
+            return this.newDataFolder;
+        }
+
+        @Override
+        public File getOldDataFolder() {
+            return this.oldDataFolder;
+        }
+
+        @Override
+        public Version getOldDataFolderVersion() {
+            return this.oldDataFolderVersion;
+        }
+
+        @Override
+        public void restore() {
+            try {
+                FileUtils.copyDirectory(this.oldDataFolder, this.newDataFolder);
+                DataFolderRegister register = new DataFolderRegister();
+                DataFolderRegisterEntry entry = register.get(this.dataFolderId);
+                entry.processed = true;
+                register.put(entry);
+                register.save();
+            } catch (IOException ex) {
+                throw new RuntimeException("Can't restore data folder found.", ex);
+            }
+        }
+
+        @Override
+        public void leave() {
+            DataFolderRegister register = new DataFolderRegister();
+            DataFolderRegisterEntry entry = register.get(this.dataFolderId);
+            entry.processed = true;
+            register.put(entry);
+            register.save();
+        }
+    }
+
+    private final ScriptingManager manager;
+
+    public DataFolderManager(ScriptingManager manager) {
+        this.manager = manager;
+    }
+
+    private File getHomeFolder() {
+        return this.manager.getHomeFolder();
+    }
+
+    private void createFolder(File f) {
+        if (!f.exists()) {
+            try {
+                FileUtils.forceMkdir(f);
+                LOGGER.info("Created scripting folder '" + f.getAbsolutePath() + "'");
+            } catch (Throwable e) {
+                LOGGER.warn("Can't Create scripting folder '" + f.getAbsolutePath() + "'");
+            }
+        }
+    }
+
+    public File getDataFolder(String id) {
+        File f = FileUtils.getFile(getHomeFolder(), DATAFOLDER_FILENAME, id);
+        createFolder(f);
+        return f;
+    }
+
+    public void registerDataFolder(ScriptingFolder folderScript, String id) {
+        DataFolderRegister register = new DataFolderRegister();
+        DataFolderRegisterEntry entry = register.get(id); 
+        if( entry != null ) {
+            return;
+        }
+        register.put(id, folderScript.getUserPath(), false);
+        register.save();
+    }
+
+    public List<DataFolderFound> searchOldVersions(Version currentVersion, FolderSet folder) {
+        List<DataFolderFound> founds = new ArrayList<>();
+        DataFolderRegister register = new DataFolderRegister();
+        for (DataFolderRegisterEntry entry :  register) {
+            if (!entry.processed) {
+                searchOldVersions(founds, currentVersion, folder, entry.folderId, entry.folderPath);
+            }
+        }
+        if (founds.isEmpty()) {
+            return null;
+        }
+        return founds;
+    }
+
+    private void searchOldVersions(
+            final List<DataFolderFound> founds,
+            final Version currentVersion,
+            final FolderSet folderSet,
+            final String dataFolderId,
+            final String dataFolderName
+    ) {
+        final PackageManager versionFactory = ToolsLocator.getPackageManager();
+        File[] folders = folderSet.listFiles(new FileFilter() {
+            @Override
+            public boolean accept(File pathname) {
+                if (!pathname.isDirectory()) {
+                    return false;
+                }
+                try {
+                    String name = FilenameUtils.getBaseName(pathname.getName());
+
+                    // Falla con una excepcion si "name" no es una version valida
+                    Version version = versionFactory.createVersion(name);
+                    if (currentVersion.compareTo(version) == 0) {
+                        return false;
+                    }
+                    File dataFolder = FileUtils.getFile(pathname, DATAFOLDER_FILENAME, dataFolderId);
+                    if (dataFolder.exists() && dataFolder.isDirectory()) {
+                        return true;
+                    }
+                } catch (Exception ex) {
+                }
+                return false;
+            }
+        });
+        if (ArrayUtils.isEmpty(folders)) {
+            return;
+        }
+
+        File newDataFolder = FileUtils.getFile(getHomeFolder(), DATAFOLDER_FILENAME, dataFolderId);
+        ScriptingFolder applicationFolder = (ScriptingFolder) this.manager.getUnit(dataFolderName);
+        DataFolderFound dataFolderFound = null;
+        for (File folder : folders) {
+            File oldDataFolder = FileUtils.getFile(folder, DATAFOLDER_FILENAME, dataFolderId);
+            Version oldDataFolderVersion = versionFactory.createVersion(
+                    FilenameUtils.getBaseName(folder.getName())
+            );
+            if (dataFolderFound == null
+                    || oldDataFolderVersion.compareTo(dataFolderFound.getOldDataFolderVersion()) > 0) {
+                dataFolderFound = new DefaultDataFolderFound(
+                        dataFolderId,
+                        applicationFolder,
+                        newDataFolder,
+                        oldDataFolder,
+                        oldDataFolderVersion
+                );
+            }
+        }
+        if (dataFolderFound != null) {
+            founds.add(dataFolderFound);
+        }
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/FileUtils.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/FileUtils.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/FileUtils.java	(revision 1126)
@@ -0,0 +1,102 @@
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import org.apache.commons.io.FilenameUtils;
+
+public class FileUtils {
+
+    public static String getRealPath(File file) {
+        try {
+            return file.getCanonicalPath();
+        } catch (IOException ex) {
+            return FilenameUtils.normalizeNoEndSeparator(file.getAbsolutePath(), true);
+        }
+    }
+    
+    public static File getRealFile(File file) {
+        try {
+            return file.getCanonicalFile();
+        } catch (IOException ex) {
+            return new File(FilenameUtils.normalizeNoEndSeparator(file.getAbsolutePath(), true));
+        }
+    }
+    
+    public static File getAbsoluteFile(File file) {
+        return new File(FilenameUtils.normalizeNoEndSeparator(file.getAbsolutePath(), true));
+    }
+    
+    public static File getAbsoluteFile(String pathname) {
+        File file = new File(pathname);
+        return new File(FilenameUtils.normalizeNoEndSeparator(file.getAbsolutePath(), true));
+    }
+    
+    public static String getBaseName(File f) {
+        return FilenameUtils.getBaseName(f.getName());
+    }
+    
+    public static boolean isRootFile(File f) {
+        String pathname = getRealPath(f);
+        String prefix = FilenameUtils.getPrefix(pathname);
+        return pathname.equals(prefix);
+    }
+    
+    public static boolean isSameFile(File f1, File f2) {
+        String f1Path = getRealPath(f1);
+        String f2Path = getRealPath(f2);
+        return f1Path.equals(f2Path);
+    }
+
+    public static boolean isSubfolder(File folder, File file) {
+        String folderPath = getRealPath(folder)+"/";
+        String filePath = getRealPath(file);
+        return filePath.startsWith(folderPath);
+    }
+
+    public static File removeExtension(File f) {
+        String pathname = FilenameUtils.removeExtension(f.getPath());
+        return getAbsoluteFile(pathname);
+    }
+    
+    static void forceMkdir(File f) throws IOException {
+        org.apache.commons.io.FileUtils.forceMkdir(f);
+    }
+
+    static File getFile(File folder, String... names) {
+        return org.apache.commons.io.FileUtils.getFile(folder, names);
+    }
+
+    static List<String> readLines(File file) throws IOException {
+        return org.apache.commons.io.FileUtils.readLines(file);
+    }
+
+    static void writeStringToFile(File file, String contents) throws IOException {
+        org.apache.commons.io.FileUtils.writeStringToFile(file, contents);
+    }
+
+    static void forceDelete(File f) throws IOException {
+        org.apache.commons.io.FileUtils.forceDelete(f);
+    }
+
+    static void moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) throws IOException {
+        org.apache.commons.io.FileUtils.moveFileToDirectory(srcFile, destDir, createDestDir);
+    }
+
+    static void moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) throws IOException {
+        org.apache.commons.io.FileUtils.moveDirectoryToDirectory(src, destDir, createDestDir);
+    }
+
+    static void moveFile(File srcFile, File destFile) throws IOException {
+        org.apache.commons.io.FileUtils.moveFile(srcFile, destFile);
+    }
+
+    static void moveDirectory(File srcDir, File destDir) throws IOException {
+        org.apache.commons.io.FileUtils.moveDirectory(srcDir, destDir);
+    }
+    
+    static void copyDirectory(File srcDir, File destDir) throws IOException {
+        org.apache.commons.io.FileUtils.copyDirectory(srcDir, destDir);
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptNotFoundException.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptNotFoundException.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/ScriptNotFoundException.java	(revision 1126)
@@ -0,0 +1,13 @@
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+
+public class ScriptNotFoundException extends RuntimeException {
+	private File f = null;
+	public ScriptNotFoundException(File f) {
+		this.f = f;
+	}
+	public String getMessage() {
+		return "Script not found: '"+ f.getPath()+"'.";
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingManager.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingManager.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingManager.java	(revision 1126)
@@ -0,0 +1,840 @@
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngineManager;
+import javax.script.SimpleBindings;
+import javax.swing.ImageIcon;
+import org.apache.commons.io.IOUtils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.DataFolderFound;
+import org.gvsig.scripting.ScriptingBaseScript;
+import org.gvsig.scripting.ScriptingDialog;
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.packageutils.Version;
+import org.gvsig.tools.resourcesstorage.ResourcesStorage;
+import org.gvsig.tools.script.Script;
+import org.gvsig.tools.service.spi.ProviderFactory;
+import org.gvsig.tools.util.FolderSet;
+import org.python.jsr223.MyPyScriptEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@SuppressWarnings("UseSpecificCatch")
+public class DefaultScriptingManager implements ScriptingManager {
+
+    public static class RegisterSystemFolder {
+
+        public String name;
+        public File folder;
+
+        public RegisterSystemFolder(String name, File folder) {
+            this.name = name;
+            this.folder = folder;
+        }
+    }
+
+    static final Logger LOG = LoggerFactory
+            .getLogger(DefaultScriptingManager.class);
+    
+    protected Map<String, ImageIcon> icons;
+    protected List<RegisterSystemFolder> systemFolders = new ArrayList<>();
+    protected ScriptEngineManager engineManager = null;
+    private final SimpleBindings bindings = new SimpleBindings();
+    private List<String> unitTypes = null;
+    private ClassLoader classLoader = null;
+    private final List<File> libFolders = new ArrayList<>();
+    private File home = null;
+    private final List<ScriptingFolder> alternativeUserFolders = new ArrayList<>();
+    private Map<String, String> extensionOfLanguage = null;
+    private Map<String, String> languageOfExtension = null;
+    private File packagesFolder;
+    private final Map properties = new HashMap();
+    private final Map<String,ScriptEngine> engineGroups = new HashMap<>();
+    private DataFolderManager dataFolderManager = null;
+    private ScriptingFolder userFolder = null;
+    private ScriptingFolder systemFolder = null;
+    
+    @SuppressWarnings({"OverridableMethodCallInConstructor", "LeakingThisInConstructor"})
+    public DefaultScriptingManager() {
+        this.classLoader = getClass().getClassLoader();
+        this.setHomeFolder(null);
+        this.bindings.put("ScriptingManager", this);
+    }
+
+    public DefaultScriptingManager(ClassLoader classLoader) {
+        this();
+        this.classLoader = classLoader;
+    }
+
+    @Override
+    public Object getProperty(Object key) {
+        return properties.get(key);
+    }
+
+    @Override
+    public void setProperty(Object key, Object val) {
+        properties.put(key, val);
+    }
+
+    @Override
+    public Map getExtendedProperties() {
+        return properties;
+    }
+
+    private void createFolder(File f) {
+        if (!f.exists()) {
+            try {
+                FileUtils.forceMkdir(f);
+                LOG.info("Created scripting folder '" + f.getAbsolutePath() + "'");
+            } catch (Throwable e) {
+                LOG.warn("Can't Create scripting folder '" + f.getAbsolutePath() + "'");
+            }
+        }
+    }
+
+    private void createDefaultFolders(File home) {
+        createFolder(new File(home, "scripts"));
+        createFolder(new File(home, "lib"));
+        createFolder(new File(home, "data"));
+    }
+
+    @Override
+    public File getHomeFolder() {
+        if (!this.home.exists()) {
+            createFolder(home);
+            createDefaultFolders(home);
+        }
+        return this.home;
+    }
+
+    @Override
+    public void setHomeFolder(File home) {
+        if (home == null) {
+            this.home = new File(System.getProperty("user.home"), ".gvsig-scripting");
+        } else {
+            this.home = home;
+        }
+        createDefaultFolders(this.home);
+        LOG.info("Set scripting home to '" + this.home.getAbsolutePath() + "'");
+        this.addLibFolder(new File(this.home, "lib"));
+    }
+    
+    private DataFolderManager getDataFolderManager() {
+        if( this.dataFolderManager==null ) {
+            this.dataFolderManager = new DataFolderManager(this);
+        }
+        return this.dataFolderManager;
+    }
+    
+    @Override
+    public File getDataFolder(String id) {
+        return this.getDataFolderManager().getDataFolder(id);
+    }
+
+    public void registerDataFolder(ScriptingFolder folderScript, String id ) {
+        this.getDataFolderManager().registerDataFolder(folderScript, id);
+    }
+
+    @Override
+    public List<DataFolderFound> searchOldVersions(Version currentVersion, FolderSet folder) {
+        return this.getDataFolderManager().searchOldVersions(currentVersion, folder);
+    }
+    
+    protected synchronized ScriptEngineManager getEngineManager() {
+        if (this.engineManager == null) {
+            this.engineManager
+                    = classLoader == null ? new ScriptEngineManager()
+                            : new ScriptEngineManager(classLoader);
+            showEnginesInfo(engineManager);
+        }
+        return this.engineManager;
+    }
+
+    private void showEnginesInfo(ScriptEngineManager mgr) {
+        if (LOG.isInfoEnabled()) {
+            List<ScriptEngineFactory> factories = mgr.getEngineFactories();
+            StringBuilder buffer = new StringBuilder();
+            List<Object> values = new ArrayList<>();
+            buffer.append("Scripting engines available:");
+            for (ScriptEngineFactory factory : factories) {
+
+                // Main engine info
+                buffer
+                        .append("\n- {}: version = {}, language = {}, langVersion = {}");
+                values.add(factory.getEngineName());
+                values.add(factory.getEngineVersion());
+                values.add(factory.getLanguageName());
+                values.add(factory.getLanguageVersion());
+
+                // Aliases
+                buffer.append("\n\t- Aliases: ");
+                List<String> engNames = factory.getNames();
+                int size = engNames.size();
+                for (String name : engNames) {
+                    size--;
+                    buffer.append("{}");
+                    if (size > 0) {
+                        buffer.append(", ");
+                    }
+                    values.add(name);
+                }
+                buffer.append("\n\t- File extensions: ");
+                List<String> extNames = factory.getExtensions();
+                size = extNames.size();
+                for (String name : extNames) {
+                    size--;
+                    buffer.append("{}");
+                    if (size > 0) {
+                        buffer.append(", ");
+                    }
+                    values.add(name);
+                }
+                buffer.append("\n\t- Mime types: ");
+                List<String> mimeNames = factory.getMimeTypes();
+                size = mimeNames.size();
+                for (String name : mimeNames) {
+                    size--;
+                    buffer.append("{}");
+                    if (size > 0) {
+                        buffer.append(", ");
+                    }
+                    values.add(name);
+                }
+
+            }
+            LOG.info(buffer.toString(), values.toArray());
+        }
+    }
+
+    @Override
+    public synchronized void loadEngines() {
+        this.getEngineManager();
+    }
+    
+    private ScriptEngine createJythonEngine() {
+        ScriptEngineFactory factory = this.getEngineFactoryByLanguage(PYTHON_LANGUAGE_NAME);
+        ScriptEngine engine = new MyPyScriptEngine(factory);
+        return engine;
+    }
+    
+    public ImageIcon getIcon(String name) {
+        return this.icons.get(name);
+    }
+
+    @Override
+    public String getEngineNameByLanguage(String langName) {
+        ScriptEngineFactory factory = this.getEngineFactoryByLanguage(langName);
+        if( factory == null ) {
+            return null;
+        }
+        return factory.getEngineName();
+    }
+    
+    public ScriptEngine getEngineByLanguage(String langName) {
+        return this.getEngineByLanguage(langName, null);
+    }
+    
+    public synchronized ScriptEngine getEngineByLanguage(String langName, String isolationGroup) {
+        ScriptEngine engine = null;
+        if( !StringUtils.isEmpty(isolationGroup) ) {
+            isolationGroup += "-" + langName;
+            engine = this.engineGroups.get(isolationGroup.toLowerCase());
+        } 
+        if( engine == null ) {
+            if( PYTHON_LANGUAGE_NAME.equalsIgnoreCase(langName) ) {
+                engine = createJythonEngine();
+            } else {
+                ScriptEngineFactory factory = this.getEngineFactoryByLanguage(langName);
+                if( factory == null ) {
+                    return null;
+                }
+                engine = factory.getScriptEngine();
+            }
+//            if( SCALA_LANGUAGE_NAME.equalsIgnoreCase(langName) ) {
+//                try {
+//                    // https://gist.github.com/takawitter/5479445
+//                    Object settings = engine.getClass().getMethod("settings", new Class[0]).invoke(engine, new Object[0]);
+//                    settings.getClass().getMethod("processArgumentString", new Class[] { String.class }).invoke(settings, new String[] { "-usejavacp"});
+//                } catch(Throwable th) {
+//                    LOG.warn("Can't initialice scala setting -usejavacp",th);
+//                }
+//            }            
+            if( !StringUtils.isEmpty(isolationGroup) ) {
+                this.engineGroups.put(isolationGroup.toLowerCase(), engine);
+            }
+        }
+        engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(bindings);
+        return engine;
+    }
+
+    @Override
+    public synchronized Set<String> getEnginesIsolationGroups() {
+        return this.engineGroups.keySet();
+    }
+    
+    public ScriptEngineFactory getEngineFactoryByLanguage(String langName) {
+        List<ScriptEngineFactory> factories
+                = getEngineManager().getEngineFactories();
+
+        for (ScriptEngineFactory factory : factories) {
+            if (factory.getLanguageName().equalsIgnoreCase(langName)) {
+                return factory;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean validateUnitId(ScriptingFolder folder, String id) {
+        File f = new File(folder.getFile(),id+".inf");
+        return !f.exists();
+    }
+
+    public ScriptingScript createScript(ScriptingFolder folder, String id) {
+        return this.createScript(folder, id, null);
+    }
+    
+    @Override
+    public Script createScript(String name, String code, String languaje) {
+        ScriptingScript script = new DefaultScriptingScript(this.getUserFolder(), this, name, languaje);
+        script.setCode(code);
+        script.setSaved(true);
+        return script;        
+    }
+
+    private ScriptingScript createScript(ScriptingFolder folder, String id, String language) {
+        DefaultScriptingScript script = new DefaultScriptingScript(folder, this, id);
+        if (!script.getFile().exists()) {
+            script.create(folder, id, language);
+        } else {
+            script.load(folder, id);
+        }
+        return script;
+    }
+
+    public ScriptingDialog createDialog(ScriptingFolder folder, String id) {
+        return this.createDialog(folder, id, null);
+    }
+
+    private ScriptingDialog createDialog(ScriptingFolder folder, String id, String language) {
+        DefaultScriptingDialog dialog = new DefaultScriptingDialog(folder, this, id);
+        if (!dialog.getFile().exists()) {
+            dialog.create(folder, id, language);
+        } else {
+            dialog.load(folder, id);
+        }
+        return dialog;
+    }
+
+    public ScriptingFolder createFolder(ScriptingFolder folder, String id) {
+        DefaultScriptingFolder unit = new DefaultScriptingFolder(folder, this, new File(folder.getFile(), id));
+        unit.load(folder, id);
+        if (!unit.getFile().exists()) {
+            unit.create(folder, id);
+        }
+        return unit;
+    }
+
+    public ScriptingExternalFile createExternalFile(ScriptingFolder folder, String id) {
+        DefaultScriptingExternalFile unit = new DefaultScriptingExternalFile(folder, this, id);
+        if( unit.getExternalFile()!=null && !unit.getExternalFile().exists() ) {
+            unit.create(folder, id);
+        }
+        return unit;
+    }
+    
+    @Override
+    public ScriptingBaseScript getScript(File file) {
+        ScriptingBaseScript script = (ScriptingBaseScript) this.getUnit(file);
+        if (script == null) {
+            throw new ScriptNotFoundException(file);
+        }
+        return script;
+    }
+    
+    @Override
+    public Script loadScript(URI uri) {
+        File f = new File(uri);
+        try {
+            return (Script) this.getScript(f);
+        } catch(ScriptNotFoundException ex) {
+            throw ex;
+        } catch(Throwable th) {
+            throw new ScriptNotFoundException(f);
+        }
+    }
+
+    private static final Pattern RE_LANG = Pattern.compile(".*lang[:]\\s*([a-zA-Z_][a-zA-Z_0-9]*)");
+    private static final Pattern RE_ENCODING = Pattern.compile(".*encoding[:]\\s*([a-zA-Z_][a-zA-Z_0-9]*)");
+    
+    public Script loadScript(ResourcesStorage storage, String name) {
+        ResourcesStorage.Resource res = null;
+        try {
+            if( storage==null ) {
+                return null;
+            }
+            res = storage.getResource(name);
+            if( res == null || !res.exists() ) {
+                return null;
+            }
+            byte[] head_bytes = new byte[500];
+            IOUtils.read(res.asInputStream(), head_bytes);
+            IOUtils.closeQuietly(res);
+            String head = new String(head_bytes);
+            if( StringUtils.isEmpty(head) ) {
+                return null;
+            }
+            head = StringUtils.split("\n")[0];
+            
+            String lang = "python";
+            String encoding = null;
+            Matcher m = RE_LANG.matcher(head);
+            if( m.groupCount()==1 ) {
+                String s = m.group(1);
+                if( !StringUtils.isBlank(s) ) {
+                    lang = s;
+                }
+            }
+            m = RE_ENCODING.matcher(head);
+            if( m.groupCount()==1 ) {
+                String s = m.group(1);
+                if( !StringUtils.isBlank(s) ) {
+                    encoding = s;
+                }
+            }
+
+            String source;
+            if( StringUtils.isBlank(encoding) ) {
+                source = IOUtils.toString(res.asInputStream());
+            } else {
+                source = IOUtils.toString(res.asInputStream(), encoding);
+            }
+            Script script = this.createScript(name, source, lang);
+            return script;
+        } catch (Exception ex) {
+            LOG.warn("Can't load script from resources storage.", ex);
+            return null;
+        } finally {
+            IOUtils.closeQuietly(res);
+        }
+    }
+    
+    @Override
+    public ScriptingFolder getFolder(File file) {
+        if( file == null ) {
+            throw new IllegalArgumentException("file argument can't be null");
+        }
+        file = this.getLinkSource(file);
+        if( FileUtils.isSameFile(this.getRootUserFolder(),file) ) {
+            return this.getUserFolder();
+        }
+        
+        ScriptingFolder folder = (ScriptingFolder) this.getUnit(file);
+        if (folder == null) {
+            throw new IllegalArgumentException("Can't get ScriptFolder from '"+file.getAbsolutePath()+"'.");
+        }
+        return folder;
+    }
+
+    public ScriptingUnit getUnit(String pathName) {
+        ScriptingUnit unit = null;
+        String[] parts = StringUtils.split(pathName, '/');
+        if( parts[0].equals(this.getUserFolder().getName()) ) {
+            unit = this.getUserFolder().getUnit( 
+                    StringUtils.join(parts, "/", 1, parts.length) 
+            );
+        } else if( parts[0].equals(this.getSystemFolder().getName()) ) {
+            unit = this.getSystemFolder().getUnit( 
+                    StringUtils.join(parts, "/", 1, parts.length) 
+            );
+        } 
+        return unit;
+    }
+    
+    public ScriptingUnit getUnit(File file) {
+        ScriptingFolder folder;
+        ScriptingUnit unit;
+
+        if (file.isAbsolute()) {
+            if( FileUtils.isSameFile(this.getRootUserFolder(), file.getParentFile()) ) {
+                folder = this.getUserFolder();
+                // FIXME: que pasa si esta en SystemFolder ???
+            } else {
+                folder = new DefaultScriptingFolder(null, this, file.getParentFile());
+            }
+            unit = folder.getUnit(file);
+            return unit;
+        } else {
+            folder = this.getUserFolder();
+            unit = folder.getUnit(file);
+            if (unit != null) {
+                return unit;
+            }
+
+            folder = this.getSystemFolder();
+            unit = folder.getUnit(file);
+            if (unit != null) {
+                return unit;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public ScriptingFolder getSystemFolder() {
+        if( this.systemFolder == null ) {
+            this.systemFolder = new SystemFolder(this);
+        }
+        return  this.systemFolder;
+    }
+
+    @Override
+    public ScriptingFolder getUserFolder() {
+        if( this.userFolder == null ) {
+            this.userFolder = new UserFolder(this, this.getRootUserFolder());
+        }
+        return  this.userFolder;
+    }
+
+    @Override
+    public ScriptingBaseScript getScript(String name) {
+        return (ScriptingBaseScript) findScript(null, name);
+    }
+
+    @Override
+    public Script locateScript(String name) {
+        ScriptingUnit script = findScript(null, name);
+        if( script instanceof Script ) {
+            return (Script) script;
+        }
+        return null;
+    }
+    
+    private ScriptingUnit findScript(ScriptingFolder folder, String name) {
+        if (name == null) {
+            return null;
+        }
+        if (name.trim().length() == 0) {
+            return null;
+        }
+        ScriptingUnit unit;
+        if (folder == null) {
+            unit = findScript(this.getUserFolder(), name);
+            if (unit != null) {
+                return unit;
+            }
+            unit = findScript(this.getSystemFolder(), name);
+            return unit;
+        }
+        List<ScriptingUnit> units = folder.getUnits();
+        Iterator<ScriptingUnit> it = units.iterator();
+        while (it.hasNext()) {
+            unit = it.next();
+            if (unit instanceof ScriptingFolder) {
+                unit = findScript((ScriptingFolder) unit, name);
+                if (unit != null) {
+                    return unit;
+                }
+            } else if (unit instanceof ScriptingBaseScript) {
+                if (name.equalsIgnoreCase(unit.getId())) {
+                    return unit;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public File getRootUserFolder() {
+        return new File(this.getHomeFolder(), "scripts");
+    }
+
+    @Override
+    public void registerSystemFolder(String name, File folder) {
+        this.systemFolders.add(new RegisterSystemFolder(name, folder));
+        LOG.info("Register system folder name '" + name + "' folder " + folder.getAbsolutePath() + "'");
+
+    }
+
+    public List<RegisterSystemFolder> getSystemFolders() {
+        return this.systemFolders;
+    }
+
+    @Override
+    public List<ScriptingFolder> getAlternativeUserFolders() {
+        return this.alternativeUserFolders;
+    }
+
+    @Override
+    public void addAlternativeUserFolder(File f, String name, String description) {
+        UserFolder x = new UserFolder(this, f);
+        x.setName(name);
+        x.setDescription(description);
+        x.setId("UserFolder_" + this.alternativeUserFolders.size() + 1);
+        this.alternativeUserFolders.add(x);
+    }
+    
+    private void initLanguages() {
+        if (this.extensionOfLanguage == null) {
+            Map<String, String> theExtensionOfLanguage = new HashMap<>();
+            List<ScriptEngineFactory> factories = getEngineManager().getEngineFactories();
+            for (ScriptEngineFactory factory : factories) {
+                if( "ognl".equals(factory.getLanguageName()) ) {
+                    continue;
+                }
+                List<String> extensions = factory.getExtensions();
+                if (extensions != null && !extensions.isEmpty()) {
+                    theExtensionOfLanguage.put(
+                            factory.getLanguageName().toLowerCase(),
+                            extensions.get(0).toLowerCase()
+                    );
+                }
+            }
+            this.extensionOfLanguage = theExtensionOfLanguage;
+        }
+        if (this.languageOfExtension == null) {
+            Map<String, String> theLanguageOfExtension = new HashMap<>();
+            List<ScriptEngineFactory> factories = getEngineManager().getEngineFactories();
+            for (ScriptEngineFactory factory : factories) {
+                if( "ognl".equals(factory.getLanguageName()) ) {
+                    continue;
+                }
+                List<String> extensions = factory.getExtensions();
+                if (extensions != null) {
+                    for (String extension1 : extensions) {
+                        theLanguageOfExtension.put(
+                                extension1.toLowerCase(),
+                                factory.getLanguageName().toLowerCase()
+                        );
+                    }
+                }
+            }
+            this.languageOfExtension = theLanguageOfExtension;
+        }
+    }
+
+    @Override
+    public String getExtensionOfLanguage(String langName) {
+        if (langName == null) {
+            return null;
+        }
+        langName = langName.toLowerCase();
+        initLanguages();
+        return this.extensionOfLanguage.get(langName);
+    }
+
+    @Override
+    public List<String> getSupportedLanguages() {
+        List<String> languages = new ArrayList<>();
+
+        initLanguages();
+        languages.addAll(this.extensionOfLanguage.keySet());
+        Collections.sort(languages);
+        return languages;
+    }
+
+    public String getLanguageOfExtension(String extension) {
+        if (extension == null) {
+            return null;
+        }
+        extension = extension.toLowerCase();
+        if (extension.startsWith(".")) {
+            extension = extension.substring(1);
+        }
+        initLanguages();
+        return this.languageOfExtension.get(extension);
+    }
+
+    @Override
+    public Object get(String key) {
+        return this.bindings.get(key);
+    }
+
+    @Override
+    public void put(String key, Object value) {
+        this.bindings.put(key, value);
+
+    }
+
+    @Override
+    public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id) {
+        return createUnit(unitType, folder, id, null);
+    }
+
+    @Override
+    public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id, String language) {
+        if (unitType.equals(UNIT_SCRIPT)) {
+            return this.createScript(folder, id, language);
+        }
+        if (unitType.equals(UNIT_DIALOG)) {
+            return this.createDialog(folder, id, language);
+        }
+        if (unitType.equals(UNIT_FOLDER)) {
+            return this.createFolder(folder, id);
+        }
+        if (unitType.equals(UNIT_EXTERNALFILE)) {
+            return this.createExternalFile(folder, id);
+        }
+        return null;
+    }
+
+    @Override
+    public List<String> getUnitTypes() {
+        if (this.unitTypes == null) {
+            this.unitTypes = new ArrayList<>();
+            this.unitTypes.add(UNIT_SCRIPT);
+            this.unitTypes.add(UNIT_DIALOG);
+            this.unitTypes.add(UNIT_FOLDER);
+            this.unitTypes.add(UNIT_EXTERNALFILE);
+        }
+        return this.unitTypes;
+    }
+
+    @Override
+    public void addLibFolder(File lib) {
+        if (lib.exists()) {
+            LOG.info("Add scripting lib folder '" + lib.getAbsolutePath() + "'");
+            this.libFolders.add(lib);
+        } else {
+            LOG.info("Skip add scripting lib folder '" + lib.getAbsolutePath() + "', folder don't exist");
+        }
+    }
+
+    @Override
+    public List<File> getLibFolders() {
+        return new ArrayList(this.libFolders);
+    }
+
+    @Override
+    public Map<String, String> getLibFoldersVersions() {
+        Map<String, String>versions = new HashMap<>();
+        List<File> folders = this.getLibFolders();
+        for (File folder : folders) {
+            File parent = folder.getParentFile();
+            File libVersions = new File(parent,folder.getName()+".versions");
+            if( libVersions.exists() ) {
+                this.loadLibVersions(versions, libVersions);
+            }
+        }
+        if( versions.isEmpty() ) {
+            return null;
+        }
+        return versions;
+    }
+
+    private void loadLibVersions(Map<String,String>versions, File file) {
+        List<String> lines;
+        try {
+            lines = FileUtils.readLines(file);
+        } catch (IOException ex) {
+            LOG.warn("Can't load lib versions from '"+file+".",ex);
+            return;
+        }
+        for (String line : lines) {
+            String[] x = line.split("=");
+            if( x.length==2 ) {
+                versions.put(x[0], x[1]);
+            } 
+        }
+    }
+    
+    @Override
+    public ProviderFactory getInstallerFactory() {
+        return new ScriptingInstallerProviderFactory();
+    }
+
+    @Override
+    public File getPackagesFolder() {
+        return this.packagesFolder;
+    }
+
+    @Override
+    public void setPackagesFolder(File folder) {
+        this.packagesFolder = folder;
+    }
+
+    @Override
+    public ScriptingFolder createLink(String name, File link, String targetPathName) {
+        StringBuilder contents = new StringBuilder();        
+        contents.append("[Unit]\n")
+            .append("type = Folder\n")
+            .append("name = ").append(name).append("\n")
+            .append("description =\n")
+            .append("createdBy =\n")
+            .append("version =\n")
+            .append("\n")
+            .append("[Folder]\n")
+            .append("path =").append(targetPathName).append("\n")
+            .append("\n\n");
+
+        if( link.isDirectory() ) {
+            link = new File(link,name+".inf");
+        } else if( !link.getName().endsWith(".inf") ) {
+            link = new File( link.getPath() + ".inf");
+        }
+        if( !link.exists() ) {
+            try {
+                FileUtils.writeStringToFile(link, contents.toString());
+            } catch (IOException ex) {
+                LOG.warn("Can't create ScriptingFolder file in '" + link.getAbsolutePath() + "'.", ex);
+            }
+        }
+        ScriptingFolder folder = this.getFolder(link);
+        return folder;
+    }
+
+    @Override
+    public ScriptingFolder createLink(String name, ScriptingFolder link, String targetPathName) {
+        return this.createLink(name, link.getFile(), targetPathName);
+    }
+
+    private final Map<File,File> links = new HashMap<>();
+    
+    public void addLink(File source, File target) {    
+        this.links.put(FileUtils.getRealFile(target), source);
+    }
+    
+    public File getLinkSource(File target) {
+        File source = this.links.get(FileUtils.getRealFile(target));
+        if( source == null ) {
+            return target;
+        }
+        if( source.exists() ) {
+            return source;
+        }
+        return target;
+    }
+    
+    public boolean isInUserFolder(File f) {
+        if( FileUtils.isSubfolder(this.getRootUserFolder(), f) ) {
+            return true;
+        }
+        for( File file : this.links.keySet()) {
+            if( FileUtils.isSubfolder(file, f) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/AbstractUnit.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/AbstractUnit.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/AbstractUnit.java	(revision 1126)
@@ -0,0 +1,388 @@
+package org.gvsig.scripting.impl;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.ini4j.Ini;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.ini4j.Profile.Section;
+
+public abstract class AbstractUnit implements ScriptingUnit, Unit {
+
+    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractUnit.class);
+
+    protected DefaultScriptingManager manager;
+
+    protected String id;
+    protected String name = null;
+    protected String description;
+    protected String createdBy;
+    protected String version;
+    protected ScriptingFolder parent;
+    protected String typename;
+    protected Set<PropertyChangeListener> changeListener;
+    protected boolean saved;
+    private Map<String,String> properties;
+
+
+    public AbstractUnit(ScriptingFolder parent, String typename, ScriptingManager manager, String id) {
+        this.parent = parent;
+        this.manager = (DefaultScriptingManager) manager;
+        this.typename = typename;
+        this.id = id;
+        this.changeListener = null;
+        this.properties = null;
+    }
+
+    @Override
+    public void addPropertyChangeListener(PropertyChangeListener listener) {
+        if( this.changeListener==null ) {
+            this.changeListener = new HashSet<>();
+        }
+        this.changeListener.add(listener);
+    }
+    
+    public void firePropertyChange(PropertyChangeEvent event) {
+        if( this.changeListener==null ) {
+            return;
+        }
+        for( PropertyChangeListener listener : this.changeListener ) {
+            try {
+                if( listener != null ) {
+                    listener.propertyChange(event);
+                }
+            } catch(Exception ex) {
+                LOGGER.warn("Problems firing PropertyChangeListener to listener "+listener+".",ex);
+            }
+        }
+    }
+    
+    public void firePropertyChangeListener(String name, Object oldValue, Object newValue) {
+        PropertyChangeEvent event = new PropertyChangeEvent(this,name, oldValue, newValue);
+        firePropertyChange(event);
+    }
+            
+    @Override
+    public String getTypeName() {
+        return typename;
+    }
+
+    @Override
+    public abstract void load(ScriptingFolder folder, String id);
+
+    @Override
+    public void reload() {
+        this.load( this.getParent(), this.getId());
+    }
+    
+    @Override
+    public String toString() {
+        if (this.getName() == null) {
+            return "(" + this.getClass().getSimpleName() + ")";
+        }
+        return this.getName();
+    }
+
+    protected void setParent(ScriptingFolder parent) {
+        this.parent = parent;
+    }
+
+    public ScriptingManager getManager() {
+        return this.manager;
+    }
+
+    @Override
+    public File getFileResource(String extension) {
+        return new File(this.getParent().getFile(), this.id + extension).getAbsoluteFile();
+    }
+
+    @Override
+    public String getDescription() {
+        return this.description;
+    }
+
+    @Override
+    public String getCreatedBy() {
+        return this.createdBy;
+    }
+
+    @Override
+    public String getVersion() {
+        return this.version;
+    }
+
+    @Override
+    public String getId() {
+        return this.id;
+    }
+
+    @Override
+    public String getName() {
+        if (this.name == null) {
+            return this.id;
+        }
+        return this.name;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        firePropertyChangeListener("description", description, this.description);
+        this.description = description;
+    }
+
+    @Override
+    public void setCreatedBy(String createdBy) {
+        firePropertyChangeListener("createdBy", createdBy, this.createdBy);
+        this.createdBy = createdBy;
+    }
+
+    @Override
+    public void setVersion(String version) {
+        firePropertyChangeListener("version", version, this.version);
+        this.version = version;
+    }
+
+    @Override
+    public void setId(String id) {
+        firePropertyChangeListener("id", id, this.id);
+        this.id = FilenameUtils.getBaseName(id);
+    }
+
+   @Override
+    public void setName(String name) {
+        firePropertyChangeListener("name", name, this.name);
+        this.name = name;
+    }
+
+    @Override
+    public ScriptingFolder getParent() {
+        return this.parent;
+    }
+
+    @Override
+    public String getUserPath() {
+        List<String> parts = new ArrayList<>();
+        ScriptingUnit unit = this;
+        while( unit!=null ) {
+            parts.add(0, unit.getName());
+            unit = unit.getParent();
+        }
+        return String.join("/", parts);
+    }
+    
+    protected void save(Ini prefs) {
+        prefs.put("Unit", "type", StringUtils.defaultString(this.getTypeName()));
+        prefs.put("Unit", "name", this.getName());
+        prefs.put("Unit", "description", StringUtils.defaultString(this.getDescription()));
+        prefs.put("Unit", "createdBy", StringUtils.defaultString(this.getCreatedBy()));
+        prefs.put("Unit", "version", StringUtils.defaultString(this.getVersion()));
+
+        if( this.properties!=null ) {
+            for (Map.Entry<String, String> property : properties.entrySet()) {
+                String name = property.getKey();
+                String value = property.getValue();
+                prefs.put("properties", name, value);
+            }
+        }
+        try {
+            prefs.store();
+        } catch (IOException e) {
+            File f = prefs.getFile();
+            String fname = (f == null) ? "(null)" : f.getAbsolutePath();
+            String msg = "Can't save inf file '" + fname + "'.";
+            LOGGER.warn(msg);
+            throw new RuntimeException(msg, e);
+        }
+
+    }
+
+    protected void loadInf(Ini prefs) {
+        String typename = getInfString(prefs, "Unit", "type", this.getTypeName());
+        if (!this.getTypeName().equalsIgnoreCase(typename)) {
+            File f = prefs.getFile();
+            String fname = (f == null) ? "(null)" : f.getAbsolutePath();
+            LOGGER.warn("inconsistent type in inf file '" + fname + "'. Curent type '" + this.getTypeName() + "', type from inf file '" + typename + "'.");
+        }
+        this.setName(getInfString(prefs, "Unit", "name", this.getName()));
+        this.setDescription(getInfString(prefs, "Unit", "description", null));
+        this.setCreatedBy(getInfString(prefs, "Unit", "createdBy", null));
+        this.setVersion(getInfString(prefs, "Unit", "version", null));
+        
+        Section sec = prefs.get("properties");
+        if( sec != null ) {
+            for(Map.Entry<String,String> entry : sec.entrySet() ) {
+                this.setProperty(entry.getKey(), entry.getValue());
+            }
+        }
+    }
+
+    protected Object getInfValue(Ini prefs, String section, String option, Object defaultValue) {
+        Object r = prefs.get(section, option);
+        if (r == null) {
+            return defaultValue;
+        } else {
+            return r;
+        }
+    }
+
+    protected String getInfString(Ini prefs, String section, String option, Object defaultValue) {
+        String s = (String) getInfValue(prefs, section, option, defaultValue);
+        if (s != null && s.trim().length() < 1) {
+            return null;
+        }
+        return s;
+    }
+
+    protected int getInfInt(Ini prefs, String section, String option, int defaultValue) {
+        String s = (String) getInfValue(prefs, section, option, String.valueOf(defaultValue));
+        if (s != null && s.trim().length() < 1) {
+            return defaultValue;
+        }
+        return Integer.parseInt(s);
+    }
+
+    protected boolean getInfBoolean(Ini prefs, String section, String option, boolean defaultValue) {
+        String s = (String) prefs.get(section, option);
+        if( s == null ) {
+            return defaultValue;
+        }
+        return BooleanUtils.toBoolean(s);
+    }
+
+    protected void console_println(String s) {
+        LOGGER.info(s);
+    }
+
+    public void create(ScriptingFolder folder, String id) {
+        this.setParent(folder);
+        this.setId(id);
+
+        File file = new File(folder.getFile(), id + ".inf");
+        try {
+            file.createNewFile();
+        } catch (IOException e) {
+            LOGGER.warn("Can't create inf file in '" + file.getAbsolutePath() + "'.", e);
+        }
+    }
+
+    @Override
+    public File getFile() {
+        if (this.getId() == null) {
+            return null;
+        }
+        if (this.getParent() == null) {
+            return null;
+        }
+        if (this.getParent().getFile() == null) {
+            return null;
+        }
+        return new File(getParent().getFile(), this.getId() + ".inf");
+    }
+
+    public URL getURL() {
+        File f = this.getFile();
+        try {
+            return f.toURI().toURL();
+        } catch (MalformedURLException ex) {
+            return null;
+        }
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if( !(obj instanceof Unit) ) {
+            return false;
+        }
+        return this.hashCode() == obj.hashCode();
+    }
+
+    @Override
+    public int hashCode() {
+        File f = this.getFile();
+        if( f!=null ) {
+            return "#$FILE$#".hashCode() + f.getAbsolutePath().hashCode();
+        }
+        if( this.getId()!=null ) {
+            return "#$ID$#".hashCode() + this.getId().hashCode();
+        }
+        return super.hashCode();
+    }
+    
+    @Override
+    public boolean isSaved() {
+        return this.saved;
+    }
+
+    @Override
+    public void setSaved(boolean saved) {
+        this.saved = saved;
+    }
+
+    @Override
+    public void setProperty(String name, String value) {
+        if( this.properties == null ) {
+            this.properties = new HashMap<>();
+        }
+        this.properties.put(name, value);
+    }
+
+    @Override
+    public String getProperty(String name) {
+        if( this.properties == null ) {
+            return null;
+        }
+        return this.properties.get(name);
+    }
+    
+    @Override
+    public Map<String,String> getProperties() {
+        return this.properties;
+    }
+
+    @Override
+    public boolean isASystemUnit() {
+        String pathUnit;
+        try {
+            pathUnit = this.getParent().getFile().getCanonicalPath();
+        } catch (IOException ex) {
+            pathUnit = this.getParent().getFile().getAbsolutePath();
+        }
+        if( !pathUnit.endsWith(File.separator) ) {
+            pathUnit = pathUnit + File.separator;
+        }
+        List<File> libs = this.getManager().getLibFolders();
+        for( File lib : libs ) {
+            String pathLib;
+            try {
+                pathLib = lib.getCanonicalPath();
+            } catch (IOException ex) {
+                pathLib = lib.getAbsolutePath();
+            }
+            if( !pathLib.endsWith(File.separator) ) {
+                pathLib = pathLib + File.separator;
+            }
+            if( pathUnit.startsWith(pathLib) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingFolder.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingFolder.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingFolder.java	(revision 1126)
@@ -0,0 +1,622 @@
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.Predicate;
+import org.apache.commons.io.FilenameUtils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.exception.BaseException;
+import static org.gvsig.tools.util.FileTools.relativizeFile;
+import org.gvsig.tools.visitor.Visitor;
+import org.ini4j.Ini;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultScriptingFolder extends AbstractUnit implements ScriptingFolder {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultScriptingFolder.class);
+    protected File folder;
+    private File configFile;
+    private File linkTarget;
+    private Ini config;
+    private String[] iconNames = null;
+    
+    protected DefaultScriptingFolder(ScriptingManager manager) {
+        super(null, ScriptingManager.UNIT_FOLDER, manager, null);
+    }
+
+    @SuppressWarnings("OverridableMethodCallInConstructor")
+    public DefaultScriptingFolder(ScriptingFolder parent, ScriptingManager manager, File folder) {
+        super(parent, ScriptingManager.UNIT_FOLDER, manager, null);
+        this.folder = new File(FilenameUtils.normalizeNoEndSeparator(folder.getAbsolutePath(),true));
+        if( this.folder.isFile() && !FilenameUtils.isExtension(this.folder.getName(), "inf") ) {
+            throw new IllegalArgumentException("folder argument can be a folder.");
+        }
+        this.load(parent, folder.getName());
+   }
+    
+    @Override
+    public void create(ScriptingFolder folder, String id) {
+        File f = new File(folder.getFile(), id);
+        this.load(folder, id);
+        if( !this.isLink() ) {
+            f.mkdir();
+        }
+    }
+
+    @Override
+    public void create(ScriptingFolder folder, String id, String language) {
+        this.create(folder, id);
+    }
+    
+    @Override
+    public File getFile() {
+        if( this.linkTarget==null ) {
+            return this.folder;
+        }
+        return this.linkTarget;
+    }
+
+    @Override
+    public List<File> getFiles() {
+        List<File> l = new ArrayList<>();
+        l.add(this.folder);
+        if( this.configFile!=null ) {
+            l.add(this.configFile);
+        }
+        return l;
+    }
+
+    @Override
+    public ScriptingFolder getParent() {
+        ScriptingFolder theParent = super.getParent();
+        if( theParent != null ) {
+            return theParent;
+        }
+        File f = this.folder;
+        if( this.isLink() ) {
+            f = this.configFile.getParentFile();
+        }
+        if( FileUtils.isSameFile(this.manager.getRootUserFolder(), f) ) {
+            return null;
+        }
+        if( FileUtils.isRootFile(f) ) {
+            return null;
+        }
+        return manager.getFolder(f.getParentFile());
+    }
+
+    @SuppressWarnings("UseSpecificCatch")
+    private String getTypenameFromInf(File file) {
+        if (file == null) {
+            LOGGER.warn("Can't load 'inf' file, file is null.");
+            return null;
+        }
+        try {
+            Ini inf = new Ini(file);
+            String theTypename = inf.get("Unit", "type");
+            if (theTypename == null) {
+                return ScriptingManager.UNIT_SCRIPT;
+            }
+            return theTypename;
+        } catch (Exception e) {
+            LOGGER.warn("Can't load 'inf' file '" + file.getAbsolutePath() + "'.", e);
+            return null;
+        }
+
+    }
+    
+    public Unit getUnit(String path) {
+        path = FilenameUtils.normalizeNoEndSeparator(path, true);
+        if( path == null ) {
+            return null;
+        }
+        File f;
+        ScriptingUnit unit;
+        String[] path_a = StringUtils.split(path, '/');
+        switch( path_a.length ) {
+            case 0:
+                return null;
+            default:
+                f = new File(this.getFile(), path_a[0]);
+                unit = this.getUnit(f);
+                if( unit instanceof ScriptingFolder ) {
+                    unit = ((ScriptingFolder) unit).getUnit(
+                            StringUtils.join(path_a, '/', 1, path_a.length)
+                    );
+                    return (Unit) unit;
+                }
+                return null;
+            case 1:
+                f = new File(this.getFile(), path_a[0]);
+                unit = this.getUnit(f);
+                return (Unit) unit;
+        }
+        
+    }
+    
+
+    @Override
+    public Unit getUnit(File afile) {
+        Unit unit = null;
+
+        File file;
+        if (afile.isAbsolute()) {
+            file = afile.getAbsoluteFile();
+        } else {
+            file = new File(this.getFile(), afile.getPath());
+        }
+
+        String TheId = FilenameUtils.getBaseName(afile.getAbsolutePath());
+        if( StringUtils.isBlank(TheId) ) {
+            TheId = afile.getName();
+        }
+        ScriptingFolder theParent;
+        if (FilenameUtils.equalsNormalizedOnSystem(this.getFile().getAbsolutePath(), file.getParentFile().getAbsolutePath())) {
+            theParent = this;
+        } else {
+            theParent = new DefaultScriptingFolder(null, manager, file.getParentFile());
+        }
+
+        if (file.isDirectory()) {
+            unit = (Unit) this.manager.createUnit(ScriptingManager.UNIT_FOLDER, theParent, TheId);
+
+        } else if (file.isFile()) {
+            if (!file.getName().endsWith(".inf")) {
+                file = new File(file.getParentFile(),TheId + ".inf");
+            }
+            if (!file.exists()) {
+                LOGGER.warn("Can't get Unit, file '" + file.getAbsolutePath() + "' not exists.");
+                return null;
+            }
+            unit = (Unit) this.manager.createUnit(getTypenameFromInf(file), theParent, TheId);
+        }
+        return unit;
+    }
+
+    private boolean containsAny(Set<File> files, Collection<File> other) {
+        for (File file : other) {
+            if( files.contains(file) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    @Override
+    public List<ScriptingUnit> getUnits() {
+        List<ScriptingUnit> ol = new ArrayList<>();
+        //
+        // Buscamos los directorios y ficheros ".inf".
+        File[] files = this.getFile().listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File arg0, String arg1) {
+                File f = new File(arg0, arg1);
+                if (!f.canRead() || f.isHidden()) {
+                    return false;
+                }
+                if (f.isDirectory()) {
+                    return true;
+                }
+                if( "#folder.inf".equals(f.getName()) ) {
+                    return false;
+                }
+                String ext = FilenameUtils.getExtension(f.getName());
+                return "inf".equalsIgnoreCase(ext);
+            }
+        });
+        Set<File> filesAdded = new HashSet<>();
+        if (files != null) {
+            for (File f : files) {
+                try {
+                    ScriptingUnit unit = this.getUnit(f);
+                    if( !containsAny(filesAdded, unit.getFiles()) ) {
+                        filesAdded.addAll(unit.getFiles());
+                        ol.add(unit);
+                    }
+                } catch (Exception ex) {
+                    LOGGER.warn("Can't create unit from file '" + f.getAbsolutePath() + "'.",ex);
+                }
+            }
+        }
+        
+        
+        // Ahora buscamos los ficheros de tipo ExternalFile, no son 
+        // directorios, no tienen ".inf".
+        files = this.getFile().listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File arg0, String arg1) {
+                File f = new File(arg0, arg1);
+                if (!f.canRead() || f.isHidden()) {
+                    return false;
+                }
+                if (f.isDirectory()) {
+                    return false;
+                }
+                if( "#folder.inf".equals(f.getName()) ) {
+                    return false;
+                }
+                return true;
+            }
+        });
+        if (files != null) {
+            for (File f : files) {
+                try {
+                    String extension = FilenameUtils.getExtension(f.getName());
+                    if( "inf".equalsIgnoreCase(extension) || "class".equalsIgnoreCase(extension) ) {
+                        continue;
+                    }
+                    if( !filesAdded.contains(f) ) {
+                        ScriptingUnit unit = this.manager.createExternalFile(this, f.getName());
+                        filesAdded.addAll(unit.getFiles());
+                        ol.add(unit);
+                    } 
+                } catch (Exception ex) {
+                    LOGGER.warn("Can't create unit from file '" + f.getAbsolutePath() + "'.",ex);
+                }
+            }
+        }
+        Collections.sort(ol, new Comparator<ScriptingUnit>() {
+
+            @Override
+            public int compare(ScriptingUnit o1, ScriptingUnit o2) {
+                if( o1 instanceof ScriptingFolder ) {
+                    if( ! (o2 instanceof ScriptingFolder) ) {
+                        return -1;
+                    }
+                } else if( o2 instanceof ScriptingFolder ) { 
+                    return 1;
+                }
+                return o1.getId().compareToIgnoreCase(o2.getId());
+            }
+        });
+        return ol;
+    }
+
+    @Override
+    public List<ScriptingFolder> getUnitFolders() {
+        List<ScriptingFolder> ol = new ArrayList<>();
+        File[] files = this.getFile().listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File arg0, String arg1) {
+                File f = new File(arg0, arg1);
+                if (!f.canRead() || f.isHidden()) {
+                    return false;
+                }
+                if (f.isDirectory()) {
+                    return true;
+                }
+                String ext = FilenameUtils.getExtension(f.getName());
+                return "inf".equalsIgnoreCase(ext);
+            }
+        });
+        if (files != null) {
+            Arrays.sort(files, new Comparator<File>() {
+                @Override
+                public int compare(File f1, File f2) {
+                    if (f1.isDirectory() && !f2.isDirectory()) {
+                        return -1;
+                    } else if (!f1.isDirectory() && f2.isDirectory()) {
+                        return 1;
+                    } else {
+                        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
+                    }
+                }
+            });
+            for (File f : files) {
+                try {
+                    ScriptingUnit unit = this.getUnit(f);
+                    if( unit instanceof ScriptingFolder ) {
+                        ol.add((ScriptingFolder) unit);
+                    }
+                } catch (Exception ex) {
+                    LOGGER.warn("Can't create unit from file '" + f.getAbsolutePath() + "'.");
+                }
+            }
+        }
+        return ol;
+    }
+
+    @Override
+    public void add(ScriptingUnit unit) {
+        unit.move(this);
+    }
+
+    @Override
+    public void remove(ScriptingUnit unit) {
+        unit.remove();
+    }
+
+    @Override
+    public File getFileResource(String extension) {
+        if( this.isLink() ) {
+            return new File(
+                    this.configFile.getParentFile(), 
+                    FilenameUtils.getBaseName(this.configFile.getName()) + extension
+                ).getAbsoluteFile();
+        }
+        return new File(
+                this.getFile().getParentFile(), 
+                this.getFile().getName() + extension
+            ).getAbsoluteFile();
+    }
+
+    public File getConfigFile() {
+        if( this.configFile == null ) {
+            this.configFile = getFileResource(".inf");
+            if (!this.configFile.isFile()) {
+                this.configFile = new File(this.folder, "#folder.inf");
+            }
+        }
+        return this.configFile;
+    }
+    
+    public Ini getConfig() {
+        File f = this.getConfigFile();
+        return this.getConfig(f);
+    }
+    
+    public Ini getConfig(File f) {
+        if (this.config == null) {
+            Ini theConfig = new Ini();
+            theConfig.setFile(f);
+            if (f.exists()) {
+                try {
+                    theConfig.load();
+                } catch (IOException ex) {
+                    throw new RuntimeException(ex);
+                }
+            }
+            this.config = theConfig;
+        }
+        return this.config;
+    }
+    
+    @Override
+    public String getProperty(String group, String name) {
+        Ini theConfig = this.getConfig();
+        String value = theConfig.get(group, name);
+        return value;
+    }
+    
+    @Override
+    public void setProperty(String group, String name, String value) {
+        Ini theConfig = this.getConfig();
+        theConfig.put(group, name, value);
+    }
+    
+    @Override
+    public void save() {
+        File theConfigFile = this.getConfigFile();
+        try {        
+            Ini theConfig = this.getConfig(theConfigFile);
+            if( this.linkTarget!=null ) {
+                theConfig.put(
+                        ScriptingManager.UNIT_FOLDER, 
+                        "path", 
+                        relativizeFile(this.configFile.getParentFile(), this.linkTarget)
+                );
+            }
+            if( this.iconNames!=null ) {
+                theConfig.put(ScriptingManager.UNIT_FOLDER, "iconName", this.iconNames[0]);
+                theConfig.put(ScriptingManager.UNIT_FOLDER, "iconNameOpen", this.iconNames[1]);
+            }
+            this.save(theConfig);
+        } catch (Throwable e) {
+            String msg = "Can't save 'inf' file '" + theConfigFile.getAbsolutePath() + "'.";
+            LOGGER.warn(msg, e);
+            throw new RuntimeException(msg, e);
+        }
+    }
+    
+    @Override
+    public void load(ScriptingFolder parent, String id) {
+        this.configFile = null;
+        this.config = null;
+        this.linkTarget = null;
+        this.iconNames = new String[]{"scripting-icon-folder", "scripting-icon-folder-open"};
+        this.setId(id);
+        this.setParent(parent);
+
+        File theConfigFile = getConfigFile();
+        try {
+            Ini theConfig = this.getConfig(theConfigFile);
+            loadInf(theConfig);
+            String iconName = getInfString(
+                    theConfig,
+                    ScriptingManager.UNIT_FOLDER,
+                    "iconName",
+                    null
+            );
+            String iconNameOpen = getInfString(
+                    theConfig,
+                    ScriptingManager.UNIT_FOLDER,
+                    "iconNameOpen",
+                    null
+            );
+            if( iconName!=null ) {
+                this.iconNames = new String[] {
+                    iconName,
+                    iconNameOpen==null? iconName:iconNameOpen
+                };
+            }
+            String targetPath = getInfString(
+                    theConfig,
+                    ScriptingManager.UNIT_FOLDER,
+                    "path",
+                    null
+            );
+            if( !StringUtils.isEmpty(targetPath) ) {
+                File target = new File(targetPath);
+                if (target.isAbsolute()) {
+                    this.linkTarget = target;
+                } else {
+                    this.linkTarget = new File(FilenameUtils.concat(theConfigFile.getParent(), targetPath));
+                }
+                this.manager.addLink(this.configFile, this.linkTarget);
+            }
+            this.configFile = FileUtils.getAbsoluteFile(theConfigFile);
+        } catch (Exception e) {
+            LOGGER.warn("Can't load 'inf' file '" + theConfigFile.getAbsolutePath() + "'.", e);
+        }
+
+    }
+
+    @Override
+    public String[] getIconNames() {
+        return this.iconNames;
+    }
+
+    @Override
+    public void setIconNames(String iconName, String iconNameOpen) {
+        this.iconNames = new String[] {
+            iconName,
+            StringUtils.isEmpty(iconNameOpen)? iconName : iconNameOpen
+                
+        };
+    }
+    
+    @Override
+    @SuppressWarnings("UseSpecificCatch")
+    public boolean remove() {
+        File f = this.getFile();
+        try {
+            File infofile = getFileResource(".inf");
+            if( infofile.exists() ) {
+                FileUtils.forceDelete(infofile);
+            }            
+            if( !this.isLink() ) {
+                if( f!=null ) {
+                    FileUtils.forceDelete(this.getFile());
+                }
+            }
+            return true;
+        } catch (Throwable e) {
+            LOGGER.warn("Can't remove folder '" + ((f==null)?"unknown":f.getAbsolutePath()) + "'.", e);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean move(ScriptingFolder target) {
+        if (! manager.validateUnitId(target, this.getId()) ) {
+            LOGGER.info("Can't move folder '"+this.getId()+"' to '"+target.getFile().getAbsolutePath()+"', is not valid.");
+            return false;
+        }
+        try {
+            File infofile = getFileResource(".inf");
+            if( infofile.exists() ) {
+                FileUtils.moveFileToDirectory(infofile, target.getFile(), true);
+            }
+            if( !this.isLink() ) {
+                FileUtils.moveDirectoryToDirectory(this.getFile(), target.getFile(),true);
+            }
+            this.parent = target;
+            this.load(target, id);
+        } catch (IOException ex) {
+            LOGGER.info("Can't move folder '"+this.getId()+"' to '"+target.getFile().getAbsolutePath()+"', "+ex.getMessage(),ex);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean rename(String newId) {
+        if (! manager.validateUnitId(this.getParent(), newId) ) {
+            LOGGER.info("Can't rename folder '"+this.getId()+"', target id '"+newId+"' is not valid.");
+            return false;
+        }
+        try {
+            File target = this.getParent().getFile();
+            File infofile = getFileResource(".inf");
+            if( this.isLink() ) {
+                FileUtils.moveFile(infofile, new File(target,newId));
+            } else {
+                FileUtils.moveDirectory(this.getFile(), new File(target,newId));
+                if( infofile.exists() ) {
+                    FileUtils.moveFile(infofile, new File(target,newId));
+                }
+            }
+            this.setId(newId);
+            this.load(this.getParent(), id);
+        } catch (IOException ex) {
+            LOGGER.info("Can't rename folder '"+this.getId()+"' to '"+newId+"', "+ex.getMessage(),ex);
+            return false;
+        }        
+        return true;
+    }
+
+    @Override
+    public void accept(Visitor visitor) throws BaseException {
+        List<ScriptingUnit> units = this.getUnits();
+        for( ScriptingUnit unit : units ) {
+            if( unit instanceof ScriptingFolder ) {
+                ScriptingFolder theFolder = (ScriptingFolder) unit;
+                theFolder.accept(visitor);
+            } else {
+                visitor.visit(unit);
+            }
+        }
+    }
+    
+    @Override
+    public boolean isLink() {
+        return this.linkTarget!=null;
+    }
+    
+    @Override
+    public void accept(Visitor visitor, Predicate<ScriptingUnit> includeFilter) throws BaseException {
+        List<ScriptingUnit> units = this.getUnits();
+        for( ScriptingUnit unit : units ) {
+            if( includeFilter.test(unit) ) {
+                if( unit instanceof ScriptingFolder ) {
+                    ScriptingFolder theFolder = (ScriptingFolder) unit;
+                    theFolder.accept(visitor);
+                } else {
+                    visitor.visit(unit);
+                }
+            }
+        }
+    }
+
+    @Override
+    @SuppressWarnings("UseSpecificCatch")
+    public String getRawInf() {
+        try {
+            String rawInf = org.apache.commons.io.FileUtils.readFileToString(
+                    this.getConfigFile()
+            );
+            return rawInf;
+        } catch (Exception ex) {
+        }
+        return null;
+    }
+    
+    @Override
+    public void setRawInf(String rawInf) {
+        if( this.configFile == null ) {
+            this.configFile = new File(folder,"#folder.inf");
+        }
+        try {
+            org.apache.commons.io.FileUtils.write(
+                    this.getConfigFile(), rawInf
+            );
+            this.reload();
+        } catch (IOException ex) {
+            // TODO: 
+        }
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/UserFolder.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/UserFolder.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/UserFolder.java	(revision 1126)
@@ -0,0 +1,40 @@
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import org.gvsig.scripting.ScriptingFolder;
+
+import org.gvsig.scripting.ScriptingManager;
+
+public class UserFolder extends DefaultScriptingFolder {
+
+    public final static String ID = "UserFolder";
+    
+    @SuppressWarnings("OverridableMethodCallInConstructor")
+    public UserFolder(ScriptingManager manager, File folder) {
+        super(null, manager, folder);
+        this.setName("User");
+        this.setDescription("Scripts del usuario");
+        this.setId(ID);
+    }
+
+    @Override
+    public File getFileResource(String extension) {
+        return new File(folder.getParentFile(), folder.getName() + extension).getAbsoluteFile();
+    }
+
+    @Override
+    public ScriptingFolder getParent() {
+        return null;
+    }
+
+    @Override
+    public String[] getIconNames() {
+        return new String[]{"scripting-icon-folder-user", "scripting-icon-folder-user"};
+    }
+
+    @Override
+    public String toString() {
+        return this.description;
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingExternalFile.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingExternalFile.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingExternalFile.java	(revision 1126)
@@ -0,0 +1,114 @@
+
+package org.gvsig.scripting.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.io.FileUtils;
+import org.apache.tika.Tika;
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+
+
+public class DefaultScriptingExternalFile extends AbstractUnit implements ScriptingExternalFile  {
+    private File externFile = null;
+    private String mimeType = null;
+    
+    private static Tika tika = null;
+    
+    public DefaultScriptingExternalFile(ScriptingFolder parent, ScriptingManager manager, String id) {
+        super(parent, ScriptingManager.UNIT_EXTERNALFILE, manager, id);
+        this.externFile = new File(parent.getFile(),id);
+    }
+
+    @Override
+    public void load(ScriptingFolder folder, String id) {
+    }
+
+    @Override
+    public boolean rename(String newId) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public void create(ScriptingFolder folder, String id) {
+        File file = this.externFile;
+        try {
+            file.createNewFile();
+        } catch (IOException e) {
+            LOGGER.warn("Can't create inf file in '" + file.getAbsolutePath() + "'.", e);
+        }        
+    }
+    
+    @Override
+    public void create(ScriptingFolder folder, String id, String language) {
+        this.create(folder, id);
+    }
+
+    @Override
+    public boolean remove() {
+        return this.externFile.delete();
+    }
+
+    @Override
+    public boolean move(ScriptingFolder target) {
+        return false;
+    }
+
+    @Override
+    public String[] getIconNames() {
+        return new String[]{
+            "scripting-icon-externalfile",
+            "scripting-icon-externalfile-open"
+        };
+    }
+    
+    public File getExternalFile() {
+        return this.externFile;
+    }
+    
+    @Override
+    public List<File> getFiles() {
+        List<File> l=new ArrayList<>();
+        l.add(this.externFile);
+        return l;
+    }
+
+
+    @Override
+    public String getMimeType() {
+        if( this.mimeType != null ) {
+            return this.mimeType;
+        }
+        if( tika == null ) {
+            tika = new Tika();
+        }
+        try {
+            this.mimeType = tika.detect(externFile);
+        } catch (IOException ex) {
+            return "application/octet-stream";
+        }
+        return this.mimeType;
+    }
+
+    @Override
+    public void setContents(String text) {
+        try {
+            FileUtils.write(externFile, text);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    @Override
+    public String getContentsAsText() {
+        try {
+            return FileUtils.readFileToString(externFile);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/Main.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/Main.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/Main.java	(revision 1126)
@@ -0,0 +1,6 @@
+package org.gvsig.scripting;
+
+
+public interface Main {
+    public Object main(Object args[]);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/python/jsr223/MyPyScriptEngine.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/python/jsr223/MyPyScriptEngine.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/python/jsr223/MyPyScriptEngine.java	(revision 1126)
@@ -0,0 +1,268 @@
+package org.python.jsr223;
+
+import java.lang.reflect.Method;
+import org.python.core.*;
+import java.io.Reader;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.util.List;
+import javax.script.AbstractScriptEngine;
+import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.Invocable;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+import org.python.util.PythonInterpreter;
+
+public class MyPyScriptEngine extends AbstractScriptEngine implements Compilable, Invocable, AutoCloseable {
+
+    //http://stackoverflow.com/questions/29543532/how-to-call-a-function-inside-a-python-script-and-pass-parameters-while-using-sc
+    private final PythonInterpreter interp;
+    private final ScriptEngineFactory factory;
+
+    public MyPyScriptEngine(ScriptEngineFactory factory) {
+        this.factory = factory;
+        interp = PythonInterpreter.threadLocalStateInterpreter(new PyScriptEngineScope(this, context));
+    }
+    
+    public PythonInterpreter getPythonInterpreter() {
+        return this.interp;
+    }
+
+    @Override
+    public Object eval(String script, ScriptContext context) throws ScriptException {
+        return eval(compileScript(script, context), context);
+    }
+
+    private Object eval(PyCode code, ScriptContext context) throws ScriptException {
+        try {
+            interp.setIn(context.getReader());
+            interp.setOut(context.getWriter());
+            interp.setErr(context.getErrorWriter());
+            interp.setLocals(new PyScriptEngineScope(this, context));
+            return interp.eval(code).__tojava__(Object.class);
+        } catch (PyException pye) {
+            throw scriptException(pye);
+        }
+    }
+
+    @Override
+    public Object eval(Reader reader, ScriptContext context) throws ScriptException {
+        return eval(compileScript(reader, context), context);
+    }
+
+    @Override
+    public Bindings createBindings() {
+        return new SimpleBindings();
+    }
+
+    @Override
+    public ScriptEngineFactory getFactory() {
+        return factory;
+    }
+
+    @Override
+    public CompiledScript compile(String script) throws ScriptException {
+        return new PyCompiledScript(compileScript(script, context));
+    }
+
+    @Override
+    public CompiledScript compile(Reader reader) throws ScriptException {
+        return new PyCompiledScript(compileScript(reader, context));
+    }
+
+    private PyCode compileScript(String script, ScriptContext context) throws ScriptException {
+        try {
+            String filename = (String) context.getAttribute(ScriptEngine.FILENAME);
+            if (filename == null) {
+                return interp.compile(script);
+            } else {
+                return interp.compile(script, filename);
+            }
+        } catch (PyException pye) {
+            throw scriptException(pye);
+        }
+    }
+
+    private PyCode compileScript(Reader reader, ScriptContext context) throws ScriptException {
+        try {
+            String filename = (String) context.getAttribute(ScriptEngine.FILENAME);
+            if (filename == null) {
+                return interp.compile(reader);
+            } else {
+                return interp.compile(reader, filename);
+            }
+        } catch (PyException pye) {
+            throw scriptException(pye);
+        }
+    }
+
+    @Override
+    public Object invokeMethod(Object thiz, String name, Object... args) throws ScriptException,
+            NoSuchMethodException {
+        try {
+            interp.setLocals(new PyScriptEngineScope(this, context));
+            if (!(thiz instanceof PyObject)) {
+                thiz = Py.java2py(thiz);
+            }
+            PyObject method = ((PyObject) thiz).__findattr__(name);
+            if (method == null) {
+                throw new NoSuchMethodException(name);
+            }
+            //return method.__call__(Py.javas2pys(args)).__tojava__(Object.class);
+            PyObject result;
+            if(args != null) {
+               result = method.__call__(Py.javas2pys(args));
+            } else {
+               result = method.__call__();
+            }
+            return result.__tojava__(Object.class);
+        } catch (PyException pye) {
+            throw scriptException(pye);
+        }
+    }
+
+    @Override
+    public Object invokeFunction(String name, Object... args) throws ScriptException,
+            NoSuchMethodException {
+        try {
+            interp.setIn(context.getReader());
+            interp.setOut(context.getWriter());
+            interp.setErr(context.getErrorWriter());
+            interp.setLocals(new PyScriptEngineScope(this, context));
+            PyObject function = interp.get(name);
+            if (function == null) {
+                throw new NoSuchMethodException(name);
+            }
+            PyObject result;
+            ThreadState state = new ThreadState(this.interp.getSystemState());
+            if(args != null) {
+                result = function.__call__(state,Py.javas2pys(args));
+            } else {
+                result = function.__call__(state);
+            }
+            return result.__tojava__(Object.class);
+        } catch (PyException pye) {
+            throw scriptException(pye);
+        }
+    }
+
+    @Override
+    public <T> T getInterface(Class<T> clazz) {
+        return getInterface(new PyModule("__jsr223__", interp.getLocals()), clazz);
+    }
+
+    @Override
+    public <T> T getInterface(Object obj, Class<T> clazz) {
+        if (obj == null) {
+            throw new IllegalArgumentException("object expected");
+        }
+        if (clazz == null || !clazz.isInterface()) {
+            throw new IllegalArgumentException("interface expected");
+        }
+        interp.setLocals(new PyScriptEngineScope(this, context));
+        final PyObject thiz = Py.java2py(obj);
+        @SuppressWarnings("unchecked")
+        T proxy = (T) Proxy.newProxyInstance(
+            clazz.getClassLoader(),
+            new Class[] { clazz },
+            new InvocationHandler() {
+                @Override
+                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                    try {
+                        interp.setLocals(new PyScriptEngineScope(MyPyScriptEngine.this, context));
+                        PyObject pyMethod = thiz.__findattr__(method.getName());
+                        if (pyMethod == null)
+                            throw new NoSuchMethodException(method.getName());
+                        PyObject result;
+                        if(args != null) {
+                            result = pyMethod.__call__(Py.javas2pys(args));
+                        } else {
+                            result = pyMethod.__call__();
+                        }
+                        return result.__tojava__(Object.class);
+                    } catch (PyException pye) {
+                        throw scriptException(pye);
+                    }
+                }
+            });
+        return proxy;
+    }
+
+    private static ScriptException scriptException(PyException pye) {
+        ScriptException se;
+        try {
+            pye.normalize();
+
+            PyObject type = pye.type;
+            PyObject value = pye.value;
+            PyTraceback tb = pye.traceback;
+
+            if (__builtin__.isinstance(value, Py.SyntaxError)) {
+                PyObject filename = value.__findattr__("filename");
+                PyObject lineno = value.__findattr__("lineno");
+                PyObject offset = value.__findattr__("offset");
+                value = value.__findattr__("msg");
+
+                se = new ScriptException(
+                        Py.formatException(type, value),
+                        filename == null ? "<script>" : filename.toString(),
+                        lineno == null ? 0 : lineno.asInt(),
+                        offset == null ? 0 : offset.asInt());
+            } else if (tb != null) {
+                String filename;
+                if (tb.tb_frame == null || tb.tb_frame.f_code == null) {
+                    filename = null;
+                } else {
+                    filename = tb.tb_frame.f_code.co_filename;
+                }
+                se = new ScriptException(
+                        Py.formatException(type, value),
+                        filename,
+                        tb.tb_lineno);
+            } else {
+                se = new ScriptException(Py.formatException(type, value));
+            }
+            se.initCause(pye);
+            return se;
+        } catch (Exception ee) {
+            se = new ScriptException(pye);
+        }
+        return se;
+    }
+
+    private class PyCompiledScript extends CompiledScript {
+        private final PyCode code;
+
+        PyCompiledScript(PyCode code) {
+            this.code = code;
+        }
+
+        @Override
+        public ScriptEngine getEngine() {
+            return MyPyScriptEngine.this;
+        }
+
+        @Override
+        public Object eval(ScriptContext ctx) throws ScriptException {
+            return MyPyScriptEngine.this.eval(code, ctx);
+        }
+        
+    }
+
+    @Override
+    public void close() {
+        interp.close();
+    }
+
+    public List<String> getLocalNames() {
+        PyScriptEngineScope locals = (PyScriptEngineScope) interp.getLocals();
+        PyList names = (PyList) locals.scope_keys();
+        return names;
+    }
+        
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/python/jsr223/TestInvokeFunction.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/python/jsr223/TestInvokeFunction.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/python/jsr223/TestInvokeFunction.java	(revision 1126)
@@ -0,0 +1,75 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.python.jsr223;
+
+import java.io.IOException;
+import java.io.Writer;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.Invocable;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+
+public class TestInvokeFunction {
+
+    public static final String code = "print \"module\"\n"
+            + "\n"
+            + "def main(*args):\n"
+            + "    print \"main\"\n";
+
+    public static class Output extends Writer {
+        private final String label;
+
+        public Output(String label) {
+            this.label = label;
+        }
+        @Override
+        public void write(char[] cbuf, int off, int len) throws IOException {
+            String s = new String(cbuf,off,len);
+            System.out.println(label + " " + s);
+        }
+
+        @Override
+        public void flush() throws IOException {
+        }
+
+        @Override
+        public void close() throws IOException {
+        }
+        
+    }
+    
+    public static void main(String[] args) throws Exception {
+        ScriptEngineManager manager = new ScriptEngineManager();
+        ScriptEngine engine = manager.getEngineByName("python");
+        ScriptContext context = engine.getContext();
+        context.setWriter(new Output("[STDOUT]"));
+        context.setErrorWriter(new Output("[STDERR]"));
+        
+        Compilable compilable = (Compilable) engine;
+        CompiledScript compiledCode = compilable.compile(code);
+        compiledCode.eval();
+     
+        final Invocable invocable = (Invocable) engine;
+        Object r = invocable.invokeFunction("main", (Object[]) null);
+
+        Runnable process = new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Object r = invocable.invokeFunction("main", (Object[]) null);
+                } catch (Exception ex) {
+                    ex.printStackTrace();
+                }
+            }
+        };
+        Thread thread = new Thread(process);
+        thread.setDaemon(false);
+        thread.start();
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/pom.xml	(revision 1126)
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.gvsig.scripting.lib.impl</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <parent>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.scripting.lib</artifactId>
+        <version>2.3.75</version>
+    </parent>
+    <dependencies>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.tools.lib</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.lib.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.swing.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.about.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ini4j</groupId>
+            <artifactId>ini4j</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.help</groupId>
+            <artifactId>javahelp</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.installer.lib.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.installer.lib.spi</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.jeta</groupId>
+            <artifactId>formsrt</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.python</groupId>
+            <artifactId>${jython.artifactId}</artifactId>
+            <scope>compile</scope>
+        </dependency>  
+        <dependency>
+            <groupId>org.apache.tika</groupId>
+            <artifactId>tika-core</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-all</artifactId>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <!-- TODO: MAKE TESTS WORK AND REMOVE THIS OPTION -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- Skip compilation tests -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>default-testCompile</id>
+                        <phase>process-test-sources</phase>
+                        <goals>
+                            <goal>testCompile</goal>
+                        </goals>
+                        <configuration>
+                            <skip>true</skip>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+
+        </plugins>
+    </build>
+</project>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/nbactions.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/nbactions.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/nbactions.xml	(revision 1126)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<actions>
+        <action>
+            <actionName>CUSTOM-dependency:tree</actionName>
+            <displayName>dependency:tree</displayName>
+            <recursive>false</recursive>
+            <goals>
+                <goal>dependency:tree</goal>
+            </goals>
+        </action>
+    </actions>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl
___________________________________________________________________
Added: svn:ignore
   + .classpath
.project
.directory
.settings
target



Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.lib
___________________________________________________________________
Added: svn:ignore
   + target
.settings
.project


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/package.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/package.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/package.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library description.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#packagecomment">Javadoc Tool documentation about the package file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/EditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/EditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/EditorFactory.java	(revision 1126)
@@ -0,0 +1,19 @@
+
+package org.gvsig.scripting.swing.api;
+
+import org.gvsig.scripting.ScriptingUnit;
+
+
+public interface EditorFactory {
+    
+    public String getName();
+    
+    public String getDescription();
+    
+    public int getPriority();
+    
+    public JEditor create(ScriptingUnit unit);
+    
+    public boolean canCreate(ScriptingUnit unit);
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JDialogEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JDialogEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JDialogEditor.java	(revision 1126)
@@ -0,0 +1,23 @@
+package org.gvsig.scripting.swing.api;
+
+import org.gvsig.scripting.ScriptingDialog;
+
+/**
+ * <code>JDialogEditor</code> is a component that support edition to a {@link ScriptingDialog).
+ * 
+ * @see JEditor
+ * @see JCodeEditor
+ * 
+ */
+public interface JDialogEditor extends JCodeEditor {
+
+	/**
+	 * Gets the {@link ScriptingDialog} associated with this JDialogEditor
+	 * 
+	 * @return {@link ScriptingDialog}
+	 */
+	public abstract ScriptingDialog getDialog();
+	
+	public abstract void reloadDialog();
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingBrowser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingBrowser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingBrowser.java	(revision 1126)
@@ -0,0 +1,53 @@
+package org.gvsig.scripting.swing.api;
+
+import java.awt.LayoutManager;
+import java.awt.event.ActionListener;
+import javax.swing.tree.TreePath;
+
+import org.gvsig.scripting.ScriptingBaseScript;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.swing.api.Component;
+
+/**
+ * <code>JScriptingBrowser</code> is a component that shows hierachically a
+ * system folder. It launch events on selection or double.clic of each
+ * {@link ScriptingUnit}. In case of {@link ScriptingFolder} a selection will
+ * load the content lazily, and double-clic will expand it. In case of
+ * {@link ScriptingBaseScript} will throw a exception to the
+ * {@link JScriptingLauncher}
+ *
+ * @see JScriptingLauncher
+ *
+ */
+public interface JScriptingBrowser extends Component {
+
+    public static final int DEFAULT_ACTION = 1;
+    public static final int SELECTION_ACTION = 2;
+    public static final int DROPDOWN_ACTION = 3;
+
+    public interface BrowserActionEvent {
+
+        public Object getSource();
+
+        public int getID();
+
+        public String getActionCommand();
+
+        public ScriptingUnit getUnit();
+    }
+
+    public ScriptingManager getManager();
+
+    public ScriptingFolder getRoot();
+
+    public ScriptingUnit getSelectedNode();
+    
+    public TreePath getSelectionPath();
+    
+    public void setSelectionPath(TreePath path);
+    
+    public void addActionListener(ActionListener listener);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JThinlet.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JThinlet.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JThinlet.java	(revision 1126)
@@ -0,0 +1,34 @@
+package org.gvsig.scripting.swing.api;
+
+import java.awt.Dimension;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import javax.swing.JPanel;
+import javax.swing.event.AncestorEvent;
+
+import thinlet.Thinlet;
+
+public abstract class JThinlet extends JPanel {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -1758582617532787515L;
+
+	public abstract void load(File file);
+
+	public abstract Thinlet getThinlet();
+
+	public abstract void invoke(String name);
+	
+	public abstract Dimension getPreferredSize();
+	
+	public abstract void ancestorAdded(AncestorEvent event);
+
+	public abstract void ancestorMoved(AncestorEvent event);
+
+	public abstract void ancestorRemoved(AncestorEvent event);
+	
+	public abstract void addActionListener(ActionListener actionlistener);
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JThinG.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JThinG.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JThinG.java	(revision 1126)
@@ -0,0 +1,43 @@
+package org.gvsig.scripting.swing.api;
+
+import java.io.File;
+
+import javax.swing.JPanel;
+
+import thinlet.Thinlet;
+
+/**
+ * <code>JThinG</code> is a component that provides an interface to edit the dialog window
+ * associated to a {@link ScriptingDialog}.
+ * 
+ * @see JThinlet
+ * 
+ */
+public abstract class JThinG extends JPanel{
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -623339194209238547L;
+
+	/**
+	 * Loads the file with the code of the dialog interface.
+	 * 
+	 * @param file File where is the code of the dialog window of the {@link ScriptingDialog}
+	 */
+	public abstract void load(File file);
+
+	/**
+	 * Saves the file with the code of the dialog interface.
+	 * 
+	 * @param file File where it will be saved the code of the dialog window of the {@link ScriptingDialog}
+	 */
+	public abstract  void save(File file);
+	
+	/**
+	 * Gets the Thinlet Component associated to this.
+	 * 
+	 * @return Thinlet
+	 */
+	public abstract Thinlet getThinlet();
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingComposer.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingComposer.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingComposer.java	(revision 1126)
@@ -0,0 +1,113 @@
+package org.gvsig.scripting.swing.api;
+
+import java.awt.event.ActionListener;
+import java.io.File;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ListSelectionListener;
+import org.gvsig.scripting.ScriptingScript;
+
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.swing.api.Component;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager;
+
+/**
+ * <code>JScriptingComposer</code> provides services to the management and
+ * edition of the {@link ScriptingUnit}s of the ScriptingFramework.
+ *
+ * @see JScriptingLauncher
+ */
+public interface JScriptingComposer extends Component {
+
+    public static final String DOCKED_PROBLEMS = "Problems";
+    public static final String DOCKED_CONSOLE = "Console";
+    public static final String DOCKED_PROJECTS = "Projects";
+    
+    public interface Dock extends Iterable<Dock.DockedPanel> {
+        public static final String DOCK_TOP = "North";
+        public static final String DOCK_BOTTOM = "South";
+        public static final String DOCK_LEFT = "West";
+        public static final String DOCK_RIGHT = "East";
+        public static final String DOCK_CENTER = "Center";
+        
+        public static final String ACTION_ACTIVATE_PANEL = "ActivePanel";
+        public static final String ACTION_CLOSE_PANEL = "ClosePanel";
+        
+        public interface DockedPanel {
+            public String getId();
+            public Component getComponent();
+            public String getTitle();
+            public String getAlign();
+            public boolean isModified();
+            public void setModified(boolean modified);
+            public void remove();
+            public void select();
+        }
+        public DockedPanel add(String id, String title, Component compnent, String align);
+        public void remove(String id);
+        public DockedPanel get(String id);
+        public void select(String id);
+        public DockedPanel getSelected(String align);
+        public void setModified(DockedPanel panel, boolean modified);
+        public boolean getModified(DockedPanel panel);
+        public void addCloseListener(ActionListener listener);
+        public void removeCloseListener(ActionListener listener);
+        public void addActivateListener(ActionListener listener);
+        public void removeActivateListener(ActionListener listener);
+    }    
+    
+    public interface Problems extends Component {
+        public interface Problem {
+            public String getType();
+            public String getMessage();
+            public String getResourceName();
+            public File getResource();
+            public int getLineNumber();
+        }
+        public void addListSelectionListener(ListSelectionListener listener);
+        public Problem getSelect();
+        public int getCount();
+        public Problem get(int n);
+        public void removeAll();
+        public void add(String type, String message, String resource, String location);
+        public void add(String type, String message, String resource, int line, int column);
+        public void add(String type, Exception e) ;
+    }
+        
+    public interface StatusBar extends Component {
+        public void clear();
+        
+        public void message(String message);
+        
+        public void setPosition(int line);
+        
+        public void setPosition(int line, int column);
+    }
+
+    public JPanel getAboutUsDialog();
+
+    public void setWindowManager(WindowManager windowsManager);
+
+    public WindowManager getWindowManager();
+
+    public JEditor getCurrentEditor();
+
+    public ScriptingScript getCurrentScript();
+
+    public Dock getDock();
+    
+    public Problems getProblems();
+    
+    public JScriptingConsole getConsole();
+    
+    public JScriptingLauncher getProjects();
+    
+    public StatusBar getStatusbar();
+    
+    public void addChangeEditorListener(ChangeListener listener);
+    
+    public void removeChangeEditorListener(ChangeListener listener);
+    
+    public void refreshProjects();
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/SyntaxtHighlightTextComponent.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/SyntaxtHighlightTextComponent.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/SyntaxtHighlightTextComponent.java	(revision 1126)
@@ -0,0 +1,48 @@
+package org.gvsig.scripting.swing.api;
+
+import java.awt.Color;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyListener;
+import javax.swing.Icon;
+
+import javax.swing.JScrollPane;
+import javax.swing.text.JTextComponent;
+import org.gvsig.tools.swing.api.Component;
+
+public interface SyntaxtHighlightTextComponent extends Component {
+
+	public interface UpdateCaretPositionActionEvent {
+		public int getLine();
+		public int getColumn();
+		public boolean hasLineAndColumn();
+	}
+	
+	public JTextComponent getJTextComponent();
+	
+	public JScrollPane getJScrollPane();
+	
+	public void setText(String text);
+	
+	public String getText();
+	
+	public void setContentType(String contentType);
+	
+	public String getContentType();
+	
+	public void addUpdateCaretPositionActionListener(ActionListener updateCaretPosition);
+	
+	public void addKeyListener(KeyListener keyListener);
+        
+        public void discardAllEdits();
+	
+        public void removeTrackingIcons();
+
+        public void removeTrackingIcons(String tag);
+
+        public void addLineTrackingIcon(String tag, int line, Icon icon, String tip, Color color);
+        
+        public void addLineTrackingIcon(String tag, int line, Icon icon, String tip);
+        
+        public void gotoline(int line);
+
+}

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/SyntaxtHighlightTextComponent.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JCodeEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JCodeEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JCodeEditor.java	(revision 1126)
@@ -0,0 +1,22 @@
+package org.gvsig.scripting.swing.api;
+
+import java.awt.event.ActionListener;
+import javax.swing.text.JTextComponent;
+import org.gvsig.scripting.ScriptingScript;
+
+
+/**
+ * <code>JCodeEditor</code> is a component that support edition to a {@link ScriptingScript}.
+ * 
+ * @see JEditor
+ * @see JDialogEditor
+ * 
+ */
+public interface JCodeEditor extends JEditor, JTextEditor {
+
+        public ScriptingScript getScript();
+        
+	public void reload();
+
+
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingUIManager.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingUIManager.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingUIManager.java	(revision 1126)
@@ -0,0 +1,240 @@
+package org.gvsig.scripting.swing.api;
+
+import java.net.URL;
+import java.util.Collection;
+import java.util.List;
+import javax.swing.Action;
+
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+import org.gvsig.about.AboutManager;
+import org.gvsig.scripting.ScriptingDialog;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.swing.api.script.ScriptSwingManager;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager;
+
+/**
+ * There are two top level management roles within ScriptingFramework: logical
+ * and User's Interface (UI) management.
+ *
+ * This class is responsible of the UI management role. It provides all the
+ * components shown in the ScriptingFramework.
+ *
+ * @see ScriptingManager
+ *
+ */
+public interface ScriptingUIManager extends ScriptSwingManager {
+    public static final String SCRIPT_COMPOSER_AUTORUN = "scautorun";
+    
+    /**
+     * Creates a new {@link JScriptingLauncher} component.
+     *
+     * @return a new {@link JScriptingLauncher}.
+     *
+     * @see JScriptingLauncher
+     */
+    public JScriptingLauncher createLauncher();
+
+    /**
+     * Creates a new {@link JScriptingComposer} component.
+     *
+     * @return a new {@link JScriptingComposer}.
+     *
+     * @see JScriptingComposer
+     */
+    public JScriptingComposer createComposer();
+
+    /**
+     * Creates a new {@link  JScriptingBrowser} component.
+     *
+     * @param root {@link  ScriptingFolder} that identificates the image.
+     * @param foldersOnly boolean to indicate if only will be shown folders (if
+     * it's true) or it will be shown the ScriptingBaseScript files too (false
+     * value). By default, false
+     *
+     * @return a new {@link  JScriptingBrowser}.
+     *
+     * @see JScriptingBrowser
+     */
+    public JScriptingBrowser createBrowser(ScriptingFolder root, boolean foldersOnly);
+
+    /**
+     * Creates a new {@link  JScriptingBrowser} component.
+     *
+     * @param root {@link  ScriptingFolder} that identificates the image.
+     *
+     * @return a new {@link  JScriptingBrowser}.
+     *
+     * @see JScriptingBrowser
+     */
+    public JScriptingBrowser createBrowser(ScriptingFolder root);
+
+    /**
+     * Creates a new {@link  JScriptingInstaller} component.
+     *
+     * @return a new {@link  JScriptingInstaller}.
+     *
+     * @see JScriptingInstaller
+     */
+    public JPanel createInstaller();
+
+    /**
+     * Creates a new JEditorPane component with syntax highlight.
+     *
+     * @return a new {@link JEditorPaneSyntaxHighlighting}.
+     *
+     * @see JEditorPaneSyntaxHighlighting
+     */
+    public SyntaxtHighlightTextComponent createSyntaxHighlightingPanel();
+
+    /**
+     * Creates a new {@link JCodeEditor} component.
+     * @param script
+     * @return a new {@link JCodeEditor}.
+     *
+     * @see JCodeEditor
+     */
+    public JCodeEditor createJCodeEditor(ScriptingScript script);
+
+    /**
+     * Creates a new {@link JDialogEditor} component.
+     *
+     * @param uimanager
+     * @param script
+     * @return a new {@link JDialogEditor}.
+     *
+     * @see JDialogEditor
+     */
+    public JDialogEditor createJDialogEditor(ScriptingDialog script);
+
+    /**
+     * Creates a new {@link JThinlet} component.
+     *
+     * @return a new {@link JThinlet}.
+     *
+     * @see JThinlet
+     */
+    public JThinlet createJThinlet();
+
+    /**
+     * Creates a new {@link JThinG} component.
+     *
+     * @return a new {@link JThinG}.
+     *
+     * @see JThinG
+     */
+    public JThinG createJThinG();
+
+    /**
+     * Creates a JEditor for the scripting unit passed as parameter.
+     * Return null if not exists an editor for this unit.
+     * 
+     * @param unit
+     * @return 
+     */
+    public JEditor createEditor(ScriptingUnit unit);
+    
+    /**
+     * Returns a ImageIcon associated with the name.
+     *
+     * @param name String that identificates the image.
+     *
+     * @return the ImageIcon identified by the String name.
+     */
+    public ImageIcon getIcon(String name);
+
+    /**
+     * Returns a ImageIcon associated with the name.
+     *
+     * @param name String that identificates the image.
+     * @param size String to specify if the size of the icon would be "small",
+     * "medium" or "big" (default value: "small").
+     *
+     * @return the ImageIcon identified by the String name.
+     */
+    public ImageIcon getIcon(String name, String size);
+
+    /**
+     * Returns the {@link ScriptingManager} of the ScriptingFramework.
+     *
+     * @return {@link ScriptingManager}
+     */
+    public ScriptingManager getManager();
+
+    /**
+     * Returns the {@link AboutManager} to provide services of the 'About Us'
+     * information of the ScriptingFramework.
+     *
+     * @return the {@link AboutManager}
+     *
+     * @see AboutManager
+     */
+    public AboutManager getAboutManager();
+
+    /**
+     * Shows a JPanel in a dialog window with it's own characteristics
+     *
+     * @param panel JPanel included in the dialog's content
+     * @param title String with the dialog's title
+     *
+     */
+    public void showDialog(JComponent panel, String title);
+
+    /**
+     * Shows a JPanel in a window with it's own characteristics
+     *
+     * @param panel JPanel included in the window's content
+     * @param title String with the window's title
+     *
+     */
+    public void showWindow(JComponent panel, String title);
+
+    /**
+     * Shows a JPanel in a tool window with it's own characteristics
+     *
+     * @param panel JPanel included in the tool's content
+     * @param title String with the tool's title
+     *
+     */
+    public void showTool(JComponent panel, String title);
+
+    public String getTranslation(String key);
+
+    public void setWindowManager(WindowManager windowsManager);
+
+    public WindowManager getWindowManager();
+    
+    public JScriptingConsole createJScriptingConsole();
+    
+    public JScriptingConsole createJScriptingConsole(boolean captureOutput);
+        
+    public void addComposerTool(Action action);
+    
+    public void addComposerMenu(String text, Action action);
+    
+    public Collection<Action> getComposerTools();
+    
+    public interface MenuEntry {
+        public String getText();
+        public Action getAction();
+    }
+    public Collection<MenuEntry> getComposerMenus();
+
+    public JScriptingComposer getActiveComposer();
+    
+    public void addCreatedComponentListener(CreateComponentListener listener);
+    
+    public void removeCreatedComponentListener(CreateComponentListener listener);
+    
+    public void registerEditor(EditorFactory factory);
+    
+    public boolean hasEditor(ScriptingUnit unit);
+    
+    public List<EditorFactory> getEditorFactories();
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/CreateComponentListener.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/CreateComponentListener.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/CreateComponentListener.java	(revision 1126)
@@ -0,0 +1,8 @@
+
+package org.gvsig.scripting.swing.api;
+
+import org.gvsig.tools.swing.api.Component;
+
+public interface CreateComponentListener {
+    public void componentCreated(Component component);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingLauncher.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingLauncher.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingLauncher.java	(revision 1126)
@@ -0,0 +1,47 @@
+package org.gvsig.scripting.swing.api;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import org.gvsig.scripting.ScriptingBaseScript;
+import org.gvsig.tools.swing.api.Component;
+
+/**
+ * <code>JScriptingLauncher</code> is a component that contains
+ * {@link JScriptingBrowser}s to navigate for the User's Folder and for System's
+ * Folder. It has a tab for each {@link JScriptingBrowser}. It catches the
+ * exceptions throws by {@link JScriptingBrowser} and it do the associated
+ * action or throw a new exception to the {@link JScriptingComposer} (if it's
+ * included on it)
+ *
+ * @see JScriptingBrowser
+ * @see JScriptingComposer
+ *
+ */
+public interface JScriptingLauncher extends Component {
+
+    public static final int DEFAULT_ACTION = 1;
+    public static final int SELECTION_ACTION = 2;
+    public static final int DROPDOWN_ACTION = 3;
+
+    /**
+     * Reloads the content of the {@link JScriptingBrowser}s
+     *
+     */
+    public void refresh();
+
+    /**
+     * Return the selected browser in this launcher.
+     * 
+     * @return 
+     */
+    public JScriptingBrowser getSelectedBrowser();
+
+    /**
+     * Registra un listener para ser informado cuando se realiza doble click
+     * sobre un ScriptingUnit.
+     *
+     * @param listener
+     */
+    public void addDefaultActionListener(ActionListener listener);
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingSwingLocator.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingSwingLocator.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingSwingLocator.java	(revision 1126)
@@ -0,0 +1,57 @@
+package org.gvsig.scripting.swing.api;
+
+import org.gvsig.tools.locator.BaseLocator;
+
+public class ScriptingSwingLocator extends BaseLocator {
+
+	private static final String LOCATOR_NAME = "ScriptingSwingLocator";
+	
+	public static final String UIMANAGER_NAME = "scriptingswinglocator.uimanager";
+
+	public static final String UIMANAGER_DESCRIPTION = "Scripting UIManager";
+
+	/**
+	 * Unique instance.
+	 */
+	private static final ScriptingSwingLocator instance = new ScriptingSwingLocator();
+
+	/**
+	 * Return the singleton instance.
+	 *
+	 * @return the singleton instance
+	 */
+	public static ScriptingSwingLocator getInstance() {
+		return instance;
+	}
+
+	/**
+	 * Return the Locator's name
+	 *
+	 * @return a String with the Locator's name
+	 */
+	@Override
+    public String getLocatorName() {
+		return LOCATOR_NAME;
+	}
+
+    /**
+     * Registers the Class implementing the ScriptingUIManager interface.
+     * 
+     * @param clazz
+     *            implementing the ScriptingUIManager interface
+     */
+    public static void registerUIManager(
+        Class<? extends ScriptingUIManager> clazz) {
+		getInstance().register(UIMANAGER_NAME, UIMANAGER_DESCRIPTION, clazz);
+	}
+
+	/**
+	 * Gets the instance of the {@link ScriptingUIManager} registered.
+	 *
+	 * @return {@link ScriptingUIManager}
+	 */
+	public static ScriptingUIManager getUIManager() {
+		return (ScriptingUIManager) getInstance().get(UIMANAGER_NAME);
+	}
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingSwingLibrary.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingSwingLibrary.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/ScriptingSwingLibrary.java	(revision 1126)
@@ -0,0 +1,33 @@
+package org.gvsig.scripting.swing.api;
+
+import org.gvsig.scripting.ScriptingLibrary;
+import org.gvsig.tools.library.AbstractLibrary;
+import org.gvsig.tools.library.LibraryException;
+import org.gvsig.tools.locator.ReferenceNotRegisteredException;
+
+public class ScriptingSwingLibrary extends AbstractLibrary {
+
+    @Override
+    public void doRegistration() {
+        registerAsAPI(ScriptingSwingLibrary.class);
+        require(ScriptingLibrary.class);
+    }
+
+    @Override
+    protected void doInitialize() throws LibraryException {
+        // Nothing to do
+    }
+
+    @Override
+    protected void doPostInitialize() throws LibraryException {
+        // Validate there is any implementation registered.
+        ScriptingUIManager manager = ScriptingSwingLocator.getUIManager();
+
+        if (manager == null) {
+            throw new ReferenceNotRegisteredException(
+                ScriptingSwingLocator.UIMANAGER_NAME,
+                ScriptingSwingLocator.getInstance());
+        }
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingConsole.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingConsole.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JScriptingConsole.java	(revision 1126)
@@ -0,0 +1,25 @@
+
+package org.gvsig.scripting.swing.api;
+
+import java.awt.Color;
+import java.io.PrintStream;
+import java.io.Writer;
+import org.gvsig.tools.swing.api.Component;
+
+public interface JScriptingConsole extends Component {
+
+    public void append(String s);
+    
+    public void append(String msg, Color color);
+
+    public void clear();
+
+    public PrintStream errors();
+
+    public PrintStream output();
+    
+    public Writer getOutputWriter();
+
+    public Writer getErrorsWriter();     
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JEditor.java	(revision 1126)
@@ -0,0 +1,33 @@
+package org.gvsig.scripting.swing.api;
+
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeListener;
+
+import org.gvsig.scripting.ScriptingBaseScript;
+
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.swing.api.Component;
+
+/**
+ * <code>AbstractJEditor</code> is a component that provides services to edit the content of
+ * a {@link ScriptingBaseScript}.
+ * 
+ * @see JCodeEditor
+ * @see JDialogEditor
+ * 
+ */
+public interface JEditor  extends Component {
+
+	public ScriptingUnit getUnit();
+	
+	public void addChangeListener(PropertyChangeListener listener);
+	
+	public void save();
+        
+        public boolean isModified();
+        
+        public void set(ScriptingUnit unit);
+
+        public void fetch(ScriptingUnit unit);
+       
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/AbstractEditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/AbstractEditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/AbstractEditorFactory.java	(revision 1126)
@@ -0,0 +1,51 @@
+
+package org.gvsig.scripting.swing.api;
+
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.ScriptingUnit;
+
+
+public abstract class AbstractEditorFactory implements EditorFactory {
+    private final String description;
+    private final String name;
+
+    protected AbstractEditorFactory(String name, String description) {
+        if( StringUtils.isEmpty(name) ) {
+            this.name = this.getClass().getSimpleName();
+        } else {
+            this.name = name;
+        }
+        if( StringUtils.isEmpty(description) ) {
+            this.description = "";
+        } else {
+            this.description = description;
+        }
+        
+    }
+    
+    @Override
+    public String getName() {
+        return this.name;
+    }
+
+    @Override
+    public String getDescription() {
+        return this.description;
+    }
+
+    @Override
+    public int getPriority() {
+        return 1000;
+    }
+
+    @Override
+    public JEditor create(ScriptingUnit unit) {
+        if( this.canCreate(unit) ) {
+            return doCreate(unit);
+        }
+        throw new IllegalArgumentException();
+    }
+
+    protected abstract JEditor doCreate(ScriptingUnit unit);
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JTextEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JTextEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/java/org/gvsig/scripting/swing/api/JTextEditor.java	(revision 1126)
@@ -0,0 +1,20 @@
+
+package org.gvsig.scripting.swing.api;
+
+import java.awt.event.ActionListener;
+import javax.swing.text.JTextComponent;
+
+
+public interface JTextEditor  {
+        public void selectLine(int line);
+        
+        public void gotoline(int line);
+        
+        public int getLineCount();
+	
+	public JTextComponent getJTextComponent();
+        
+        public SyntaxtHighlightTextComponent getSyntaxtHighlightTextComponent();
+        
+        public void addUpdateCaretPositionActionListener(ActionListener actionlistener);        
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/javadoc/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/javadoc/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/javadoc/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 1126)
@@ -0,0 +1 @@
+org.gvsig.scripting.swing.api.ScriptingSwingLibrary
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/org/gvsig/scripting/i18n/text.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/org/gvsig/scripting/i18n/text.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/org/gvsig/scripting/i18n/text.properties	(revision 1126)
@@ -0,0 +1,2 @@
+# Resource bundle texts for the Spanish language locale (es)
+Example.returns_value=devuelve el valor
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/org/gvsig/scripting/i18n/text_en.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/org/gvsig/scripting/i18n/text_en.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/org/gvsig/scripting/i18n/text_en.properties	(revision 1126)
@@ -0,0 +1,2 @@
+# Resource bundle texts for the English language locale (en)
+Example.returns_value=returns value
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/main/resources/README.txt	(revision 1126)
@@ -0,0 +1,7 @@
+Put into this folder the resources needed by your library classes.
+
+This folder is added to the runtime classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, into this folder you can find some examples of resource bundle 
+property files that may be used by your library classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/resources/README.txt	(revision 1126)
@@ -0,0 +1,11 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+Put into this folder the resources needed by your test classes.
+
+This folder is added to the Tests classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, in this folder you can find an example of log4j configuration,
+prepared to log messages through the console, so logging works when you
+run your tests classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/resources/log4j.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/resources/log4j.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/resources/log4j.xml	(revision 1126)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- 
+Log4J configuration file for unit tests execution.
+ -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appender configuration to show logging messages through the console -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
+		</layout>
+	</appender>
+
+	<!-- 
+	Activate logging messages of DEBUG level of higher only for the
+	DefaultExampleManager class.
+	You can put full classes names or packages instead, to configure
+	logging for all the classes and subpackages of the package.
+	-->
+	<category name="org.gvsig.scripting.impl.DefaultExampleManager">
+		<priority value="DEBUG" />
+	</category>
+
+	<!-- 
+	By default, show only logging messages of INFO level or higher, 
+	through the previously configured CONSOLE appender. 
+	-->
+	<root>
+		<priority value="INFO" />
+		<appender-ref ref="CONSOLE" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/java/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/java/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/src/test/java/README.txt	(revision 1126)
@@ -0,0 +1,8 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+For each class you are going to test, create one Test class with the same
+name as the class to test, ending with Test.
+
+For example, the unit tests of the "ExampleLibrary" class are performed
+by the "ExampleLibraryTest" class.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api/pom.xml	(revision 1126)
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.gvsig.scripting.swing.api</artifactId>
+	<packaging>jar</packaging>
+	<name>org.gvsig.scripting.swing.api</name>
+	<parent>
+		<groupId>org.gvsig</groupId>
+		<artifactId>org.gvsig.scripting.swing</artifactId>
+		<version>2.3.75</version>
+	</parent>
+	<dependencies>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.tools.lib</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.tools.swing.api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.i18n</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.scripting.thing</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.about.api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.gvsig</groupId>
+			<artifactId>org.gvsig.scripting.lib.api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.help</groupId>
+			<artifactId>javahelp</artifactId>
+			<scope>compile</scope>
+		</dependency>
+	</dependencies>
+</project>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.api
___________________________________________________________________
Added: svn:ignore
   + .settings
target
.classpath
.project


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/pom.xml	(revision 1126)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.gvsig.scripting.swing</artifactId>
+	<packaging>pom</packaging>
+	<name>${project.artifactId}</name>
+	<parent>
+		<groupId>org.gvsig</groupId>
+		<artifactId>org.gvsig.scripting</artifactId>
+		<version>2.3.75</version>
+	</parent>
+	<modules>
+		<module>org.gvsig.scripting.swing.api</module>
+		<module>org.gvsig.scripting.swing.impl</module>
+	</modules>
+</project>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/README.txt	(revision 1126)
@@ -0,0 +1,8 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+For each class you are going to test, create one Test class with the same
+name as the class to test, ending with Test.
+
+For example, the unit tests of the "ExampleLibrary" class are performed
+by the "ExampleLibraryTest" class.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptableThinG.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptableThinG.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptableThinG.java	(revision 1126)
@@ -0,0 +1,27 @@
+package org.gvsig.scripting;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.gvsig.scripting.swing.impl.DefaultJThinG;
+
+public class MyTestJScriptableThinG {
+
+	public static void main(String[] args) {
+
+		// Creamos el JPanel del thinlet y le
+		// cargamos el xml de pruebas.
+		DefaultJThinG panel = new DefaultJThinG();
+
+		JFrame frame = new JFrame("TEST JScriptableThinlet");
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.setLayout(new BorderLayout());
+		frame.setSize(500, 400);
+		// Añadimos el JPanel del thinlet al frame.
+		frame.add(panel, BorderLayout.CENTER);
+		//frame.pack();
+		frame.setVisible(true);
+
+	}
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptingBrowser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptingBrowser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptingBrowser.java	(revision 1126)
@@ -0,0 +1,71 @@
+package org.gvsig.scripting;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.impl.DefaultJScriptingBrowser;
+
+public class MyTestJScriptingBrowser extends JPanel {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private DefaultJScriptingBrowser treePanel;
+
+	public MyTestJScriptingBrowser() {
+		super(new BorderLayout());
+
+		// Inicializamos las librerías
+		ScriptingLibrary lib = new ScriptingLibrary();
+		lib.initialize();
+		
+
+		//  Asignamos el locator e iniciamos la instancia
+		
+		ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+		ScriptingManager manager = uimanager.getManager();
+		treePanel = new DefaultJScriptingBrowser(uimanager, manager.getUserFolder());
+
+		// Establecemos algunas características del JPanel
+		treePanel.setPreferredSize(new Dimension(500, 800));
+		add(treePanel, BorderLayout.CENTER);
+		;
+	}
+
+	/**
+	 * Create the GUI and show it.  For thread safety,
+	 * this method should be invoked from the
+	 * event-dispatching thread.
+	 */
+	private static void createAndShowGUI() {
+		//Create and set up the window.
+		JFrame frame = new JFrame("TEST ScriptUserBrowser");
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+		//Create and set up the content pane.
+		MyTestJScriptingBrowser newContentPane = new MyTestJScriptingBrowser();
+		newContentPane.setOpaque(true); //content panes must be opaque
+		frame.getContentPane().add(newContentPane, BorderLayout.CENTER);
+		
+		//Display the window.
+		frame.pack();
+		frame.setVisible(true);
+	}
+
+	public static void main(String[] args) {
+
+		//Iniciamos el test
+		javax.swing.SwingUtilities.invokeLater(new Runnable() {
+			public void run() {
+				createAndShowGUI();
+			}
+		});
+	}
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestLauncher.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestLauncher.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestLauncher.java	(revision 1126)
@@ -0,0 +1,47 @@
+package org.gvsig.scripting;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+
+public class MyTestLauncher extends JPanel {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+
+	public static void main( String args[] ) {	  
+		
+		
+
+		// Inicializamos las librerías
+	/*	
+	    ScriptingLibrary lib = new ScriptingLibrary();
+		lib.initialize();
+
+		//  Asignamos el locator e iniciamos la instancia
+		ScriptingUIManager uimanager = ScriptingLocator.getUIManager();
+		ScriptingManager manager = uimanager.getManager();
+
+		URL u = TestLauncher.class.getClassLoader().getResource("org/gvsig/scripting/impl/scripts/");
+		File f = new File(u.getPath());
+		manager.registerSystemFolder("Tests", f);
+	*/
+		
+		JFrame frame = new JFrame("TEST Launcher");
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+		//Create and set up the content pane.
+	//	JScriptingLauncher newContentPane = new JScriptingLauncher(uimanager);
+	//	newContentPane.setOpaque(true); //content panes must be opaque
+	//	frame.setContentPane(newContentPane);
+
+		//Display the window.
+		frame.pack();
+		frame.setSize( 250,400 );
+		frame.setVisible(true);
+		
+	}
+} 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/TestComposer.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/TestComposer.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/TestComposer.java	(revision 1126)
@@ -0,0 +1,29 @@
+package org.gvsig.scripting;
+
+import javax.swing.JPanel;
+
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+
+public class TestComposer extends JPanel {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+
+	public static void main( String args[] ) {	  
+		//  Asignamos el locator e iniciamos la instancia
+		ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+		ScriptingManager manager = uimanager.getManager();
+		
+	/*	URL u = TestLauncher.class.getClassLoader().getResource("org/gvsig/scripting/impl/scripts/");
+		File f = new File(u.getPath());
+		manager.registerSystemFolder("Tests", f);
+		*/
+			
+		uimanager.createComposer();
+			
+	}
+} 
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/syntaxhighlight/MyTest.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/syntaxhighlight/MyTest.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/syntaxhighlight/MyTest.java	(revision 1126)
@@ -0,0 +1,21 @@
+package org.gvsig.scripting.swing.syntaxhighlight;
+
+import javax.swing.JEditorPane;
+import javax.swing.JFrame;
+import javax.swing.JScrollPane;
+
+
+public class MyTest {
+	public static void main(String a[])
+	{
+
+	/*	final JEditorPane edit = new JEditorPaneSyntaxHighlighting();
+		edit.setContentType("text/java");
+
+		JFrame frame = new JFrame("Syntax Highlighting");
+		frame.getContentPane().add( new JScrollPane(edit) );
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.setSize(800,300);
+		frame.setVisible(true);*/
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJRenameModel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJRenameModel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJRenameModel.java	(revision 1126)
@@ -0,0 +1,102 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.io.File;
+
+import junit.framework.Assert;
+
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public class TestJRenameModel extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+	protected JRenameModel model;
+	
+	@Override
+	protected void doSetUp() throws Exception {
+		manager = ScriptingLocator.getManager();
+	}
+	
+	public void setWorkingFolder(){
+		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home").getFile());
+//		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+//		manager.setRootUserFolder(file.getAbsolutePath());
+	}
+	
+	public File getFile(String name){
+		return new File(manager.getRootUserFolder()+File.separator+name);
+	}
+	
+	public void checkExistsFile(String fName){
+		File fscript = getFile(fName);
+		Assert.assertTrue(fscript.exists());
+	}
+	
+	public void checkDoesntExistFile(String fName){
+		File fscript = getFile(fName);
+		Assert.assertFalse(fscript.exists());
+	}
+	
+    public void testRename() {
+		setWorkingFolder();
+		ScriptingScript script = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT, manager.getUserFolder(), "testScript01");
+		checkExistsFile("testScript01.py");
+		checkExistsFile("testScript01.inf");
+		
+		model = new JRenameModel(manager,script);
+		model.setNewName("testScript");
+		try {
+			model.validate();
+		} catch (Exception e) {
+			Assert.fail("The data model is correct. Validation couldn't fail");
+		}
+		Assert.assertTrue(script.rename("testScript"));
+		
+		//Comprobamos que existen los ficheros con el nuevo nombre
+		checkExistsFile("testScript.py");
+		checkExistsFile("testScript.inf");
+		
+		//Confirmamos que han sido renombrados y no copiados
+		checkDoesntExistFile("testScript01.py");
+		checkDoesntExistFile("testScript01.inf");
+	}
+	
+    public void testRenameSameName() {
+		setWorkingFolder();
+		ScriptingScript script1 = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT, manager.getUserFolder(), "testScript01");
+		ScriptingScript script2 = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT, manager.getUserFolder(), "testScript02");
+		
+		checkExistsFile(script2.getId()+".py");
+		checkExistsFile(script2.getId()+".inf");
+		
+		model = new JRenameModel(manager,script1);
+		model.setNewName(script2.getId());
+		try {
+			model.validate();
+		} catch (Exception e) {
+			Assert.assertEquals("This file already exists.\nWrite another name for the script",e.getMessage());
+		}
+		Assert.assertFalse(script1.rename(script2.getId()));
+				
+	}
+	
+    public void testRenameWithEmptyNewName() {
+		setWorkingFolder();
+		ScriptingScript script = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT, manager.getUserFolder(), "testScript01");
+		checkExistsFile("testScript01.py");
+		checkExistsFile("testScript01.inf");
+		
+		model = new JRenameModel(manager,script);
+		model.setNewName("");
+		try {
+			model.validate();
+		} catch (Exception e) {
+			Assert.assertEquals("Name must not be empty.",e.getMessage());
+		}
+		
+		checkExistsFile("testScript01.py");
+		checkExistsFile("testScript01.inf");
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJMoveScriptModel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJMoveScriptModel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJMoveScriptModel.java	(revision 1126)
@@ -0,0 +1,79 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.io.File;
+
+import junit.framework.Assert;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public class TestJMoveScriptModel extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+	protected JMoveScriptModel model;
+	
+	@Override
+	protected void doSetUp() throws Exception {
+		manager = ScriptingLocator.getManager();
+	}
+	
+	public void setWorkingFolder(){
+		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home").getFile());
+//		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+//		manager.setRootUserFolder(file.getAbsolutePath());
+	}
+	
+    public void testMove() {
+		setWorkingFolder();
+		ScriptingFolder folder = (ScriptingFolder) manager.createUnit(ScriptingManager.UNIT_FOLDER, manager.getUserFolder(), "test");
+		ScriptingScript script = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT, manager.getUserFolder(), "testScript01");
+		model = new JMoveScriptModel(manager,script);
+		model.setMoveTo(folder.getFile());
+		try {
+			model.validate();
+		} catch (Exception e) {
+			Assert.fail("The data model is correct. Validation couldn't fail");
+		}
+		script.move(folder);
+		Assert.assertEquals(folder.getFile().getAbsolutePath(), model.getUnit().getParent().getFile().getAbsolutePath());
+		
+	}
+	
+    public void testMoveWithSameName() {
+		setWorkingFolder();
+		ScriptingFolder folder = (ScriptingFolder) manager.createUnit(ScriptingManager.UNIT_FOLDER, manager.getUserFolder(), "test");
+		ScriptingScript script1 = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT, manager.getUserFolder(), "testScript01");
+		manager.createUnit(ScriptingManager.UNIT_SCRIPT, folder, "testScript01");
+		model = new JMoveScriptModel(manager,script1);
+		model.setMoveTo(folder.getFile());
+		try {
+			model.validate();
+		} catch (Exception e) {
+			Assert.assertEquals("This file already exists.\nWrite another name for the script",e.getMessage());
+		}
+		Assert.assertFalse(script1.move(folder));
+	}
+	
+    public void testMoveToAnInvalidDestination() {
+		setWorkingFolder();
+		ScriptingScript script = (ScriptingScript) manager.createUnit(ScriptingManager.UNIT_SCRIPT, manager.getUserFolder(), "testScript01");
+		model = new JMoveScriptModel(manager,script);
+		
+		model.setMoveTo("");
+		try {
+			model.validate();
+		} catch (Exception e) {
+			Assert.assertEquals("Destination must not be empty.",e.getMessage());
+		}
+		
+		model.setMoveTo("/not/a/valid/path");
+		try {
+			model.validate();
+		} catch (Exception e) {
+			Assert.assertEquals("Not a valid destination.",e.getMessage());
+		}
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJNewScriptModel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJNewScriptModel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJNewScriptModel.java	(revision 1126)
@@ -0,0 +1,114 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.io.File;
+
+import junit.framework.Assert;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public class TestJNewScriptModel extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+//	protected JNewScriptModel model;
+//	protected JNewScriptModel model2;
+//	
+	@Override
+	protected void doSetUp() throws Exception {
+		manager = ScriptingLocator.getManager();
+	}
+	
+//	public void setWorkingFolder(){
+//		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home").getFile());
+//        if (!file.exists()) {
+//			file.mkdir();
+//		}
+////		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+////		manager.setRootUserFolder(file.getAbsolutePath());
+//	}
+//	
+//	public void testCreate(){
+//		setWorkingFolder();
+//		model.setType(ScriptingManager.UNIT_SCRIPT);
+//		model.setName("TestScript01");
+//		model.setDescription("Test Script 01");
+//		model.setCreatedBy("Anonymus");
+//		model.setVersion("v0.1");
+//		model.setPath(manager.getRootUserFolder());
+//		try {
+//			model.validate();
+//		} catch (Exception e) {
+//			Assert.fail("The data model is correct. Validation couldn't fail");
+//		}	
+//	}
+//	
+//    public void testCreateWithEmptyName() {
+//		testCreate();
+//		model.setType(ScriptingManager.UNIT_SCRIPT);
+//		model.setName("");
+//		model.setDescription("Test Script 01");
+//		model.setCreatedBy("Anonymus");
+//		model.setVersion("v0.1");
+//		model.setPath(manager.getRootUserFolder());
+//		try {
+//			model.validate();
+//		} catch (Exception e) {
+//			Assert.assertEquals(e.getMessage(), "Name must not be empty.");
+//		}		
+//	}
+//	
+//    public void testCreateWithSameName() {
+//		testCreate();
+//		this.manager.createUnit(
+//				model.getType(),
+//				manager.getFolder(new File(model.getPath())),
+//				model.getName()+model.getExtension()
+//		);
+//		
+//		model.setType(ScriptingManager.UNIT_SCRIPT);
+//		model.setName("TestScript01");
+//		model.setDescription("Test Script 01");
+//		model.setCreatedBy("Anonymus");
+//		model.setVersion("v0.1");
+//		model.setPath(manager.getRootUserFolder());
+//		try {
+//			model.validate();
+//		} catch (Exception e) {
+//			Assert.assertEquals(e.getMessage(), "This file already exists.\nWrite another name for the script");
+//			
+//		}
+//		ScriptingUnit newFolder= this.manager.createUnit(
+//				ScriptingManager.UNIT_FOLDER,
+//				manager.getFolder(new File(model.getPath())),
+//				"scripts"
+//		);
+//		model.setPath(((ScriptingFolder) newFolder).getPath());
+//		try {
+//			model.validate();
+//		} catch (Exception e) {
+//			Assert.fail("The data model is correct. Validation couldn't fail");
+//		}
+//		
+//	}
+//	
+//    public void testCreateProjects() {
+//		testCreate();
+//		
+//		model.setType(ScriptingManager.UNIT_PROJECT);
+//		model.setName("TestScript01");
+//		model.setDescription("Test Script 01");
+//		model.setCreatedBy("Anonymus");
+//		model.setVersion("v0.1");
+//		model.setPath(manager.getRootUserFolder());
+//		try {
+//			model.validate();
+//		} catch (Exception e) {
+//			Assert.assertEquals(e.getMessage(), "Projects will be supported in future versions");
+//			
+//		}		
+//	}
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJRemoveHelpModel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJRemoveHelpModel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/swing/impl/composer/TestJRemoveHelpModel.java	(revision 1126)
@@ -0,0 +1,29 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.io.File;
+
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
+
+public class TestJRemoveHelpModel extends AbstractLibraryAutoInitTestCase {
+
+	protected ScriptingManager manager;
+	protected JMoveScriptModel model;
+	
+	@Override
+	protected void doSetUp() throws Exception {
+		manager = ScriptingLocator.getManager();
+	}
+	
+	public void setWorkingHelpFolder(){
+		File file =new File(this.getClass().getClassLoader().getResource("org/gvsig/scripting/home/help").getFile());
+//		FIXME: hay que sustituirlo por manager.setHomeFolder(home) 
+//		manager.getHelpManager().setFolder(file.getAbsolutePath());
+	}
+	
+    public void testMove() {
+		setWorkingHelpFolder();
+		
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptableThinlet.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptableThinlet.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/MyTestJScriptableThinlet.java	(revision 1126)
@@ -0,0 +1,32 @@
+package org.gvsig.scripting;
+
+import java.awt.BorderLayout;
+import java.io.File;
+
+import javax.swing.JFrame;
+
+import org.gvsig.scripting.swing.api.JThinlet;
+import org.gvsig.scripting.swing.impl.DefaultJThinlet;
+
+public class MyTestJScriptableThinlet {
+
+	public static void main(String[] args) {
+
+		// Creamos el JPanel del thinlet y le
+		// cargamos el xml de pruebas.
+		JThinlet panel = new DefaultJThinlet(new File("/home/jobacas/ScriptFramework/org.gvsig.scripting/src/org/gvsig/scripting/impl/xul/thing.xml"));
+
+		JFrame frame = new JFrame("TEST JScriptableThinlet");
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.setLayout(new BorderLayout());
+		frame.setSize(500, 400);
+		// Añadimos el JPanel del thinlet al frame.
+		frame.add(panel, BorderLayout.CENTER);
+		//frame.pack();
+		frame.setVisible(true);
+
+	}
+}
+
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/impl/MyTestDefaultJThinG.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/impl/MyTestDefaultJThinG.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/java/org/gvsig/scripting/impl/MyTestDefaultJThinG.java	(revision 1126)
@@ -0,0 +1,27 @@
+package org.gvsig.scripting.impl;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.gvsig.scripting.swing.impl.DefaultJThinG;
+
+public class MyTestDefaultJThinG {
+
+	public static void main(String[] args) {
+
+		// Creamos el JPanel del thinlet y le
+		// cargamos el xml de pruebas.
+		DefaultJThinG panel = new DefaultJThinG();
+
+		JFrame frame = new JFrame("TEST JScriptableThinlet");
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.setLayout(new BorderLayout());
+		frame.setSize(500, 400);
+		// Añadimos el JPanel del thinlet al frame.
+		frame.add(panel, BorderLayout.CENTER);
+		frame.pack();
+		frame.setVisible(true);
+
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/resources/README.txt	(revision 1126)
@@ -0,0 +1,11 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+Put into this folder the resources needed by your test classes.
+
+This folder is added to the Tests classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, in this folder you can find an example of log4j configuration,
+prepared to log messages through the console, so logging works when you
+run your tests classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/resources/log4j.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/resources/log4j.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/test/resources/log4j.xml	(revision 1126)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- 
+Log4J configuration file for unit tests execution.
+ -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appender configuration to show logging messages through the console -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
+		</layout>
+	</appender>
+
+	<!-- 
+	Activate logging messages of DEBUG level of higher only for the
+	DefaultExampleManager class.
+	You can put full classes names or packages instead, to configure
+	logging for all the classes and subpackages of the package.
+	-->
+	<category name="org.gvsig.scripting.impl.DefaultExampleManager">
+		<priority value="DEBUG" />
+	</category>
+
+	<!-- 
+	By default, show only logging messages of INFO level or higher, 
+	through the previously configured CONSOLE appender. 
+	-->
+	<root>
+		<priority value="INFO" />
+		<appender-ref ref="CONSOLE" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 1126)
@@ -0,0 +1 @@
+org.gvsig.scripting.swing.impl.ScriptingSwingDefaultSwingLibrary
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/media-floppy.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/media-floppy.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/system-search.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/system-search.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/applications-accessories.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/applications-accessories.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_project.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_project.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-undo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-undo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-copy.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-copy.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/computer.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/computer.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-paste.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-paste.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-find.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-find.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/list-remove.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/list-remove.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_groovy.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_groovy.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/system-log-out.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/system-log-out.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/help-browser.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/help-browser.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/emblem-symbolic-link.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/emblem-symbolic-link.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-redo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-redo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/applications-office.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/applications-office.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_dialog.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_dialog.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/folder-drag-accept.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/folder-drag-accept.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-delete.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-delete.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/application-x-executable.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/application-x-executable.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/image-missing.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/image-missing.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/user-trash.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/user-trash.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/list-add.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/list-add.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/emblem-unreadable.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/emblem-unreadable.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_python.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_python.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_ruby.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_ruby.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/document-new.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/document-new.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/view-refresh.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/view-refresh.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/format-indent-more.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/format-indent-more.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/applications-system.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/applications-system.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/document-properties.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/document-properties.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-select-all.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-select-all.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_project_open.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_project_open.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/folder.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/folder.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-find-replace.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-find-replace.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_ecmascript.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_ecmascript.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/document-open.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/document-open.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-cut.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/edit-cut.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_beanshell.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/scripting_beanshell.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/emblem-system.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/emblem-system.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/preferences-system.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/preferences-system.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/system-users.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/32x32/system-users.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-groovy.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-groovy.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-find-replace.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-find-replace.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/tabclose2.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/tabclose2.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-cut.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-cut.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/applications-office.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/applications-office.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-dialog.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-dialog.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/application-x-executable.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/application-x-executable.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-help.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-help.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-undo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-undo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-package.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-package.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/user-trash.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/user-trash.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-copy.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-copy.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-remove.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-remove.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-closeall.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-closeall.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-show-problems.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-show-problems.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/format-indent-more.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/format-indent-more.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-externalfile-open.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-externalfile-open.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-externalfile.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-externalfile.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/applications-system.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/applications-system.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-about.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-about.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-emblem-symbolic-link.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-emblem-symbolic-link.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-redo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-redo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-ecmascript.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-ecmascript.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-next.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-next.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/preferences-system.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/preferences-system.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-beanshell.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-beanshell.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/emblem-system.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/emblem-system.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-matchcase.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-matchcase.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-save-and-run.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-save-and-run.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-emblem-unreadable.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-emblem-unreadable.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-tabclose-active.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-tabclose-active.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/list-remove.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/list-remove.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-select-all.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-select-all.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/system-log-out.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/system-log-out.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-move.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-move.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-rename.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-rename.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-wholeword.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-wholeword.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-previous.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-previous.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-scala.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-scala.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-r.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-r.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-edit.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-edit.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-refresh.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-refresh.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-paste.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-paste.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-open.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-open.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/list-add.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/list-add.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-find.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-find.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-run.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-run.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-project.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-project.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/view-refresh.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/view-refresh.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-show-projects.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-show-projects.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-python.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-python.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-ruby.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-ruby.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-exit.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-exit.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-wrap.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-wrap.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-user.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-user.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-highlightmatches.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-highlightmatches.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-expresion.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-search-expresion.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-show-console.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-show-console.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-system.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-icon-folder-system.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-delete.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-edit-delete.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/media-floppy.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/media-floppy.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/applications-accessories.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/applications-accessories.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/system-search.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/system-search.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-image-missing.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-image-missing.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-add.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-add.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-tabclose-inactive.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-tabclose-inactive.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-folder-add.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-folder-add.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-save.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-save.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-project.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-project.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-close.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16/scripting-doc-close.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream


Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/images/16x16
___________________________________________________________________
Added: svn:ignore
   + .directory


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/menuitem.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/menuitem.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/checkbox.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/checkbox.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/popupmenu.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/popupmenu.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/textfield.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/textfield.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/menubar.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/menubar.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/checkboxmenuitem.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/checkboxmenuitem.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/choice.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/choice.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/column.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/column.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/empty.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/empty.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/panel.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/panel.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/tree.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/tree.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_cut.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_cut.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/separator.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/separator.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/thing_small.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/thing_small.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/menu.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/menu.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/tab.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/tab.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/combobox.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/combobox.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/desktop.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/desktop.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/thing.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/thing.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/list.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/list.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/textarea.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/textarea.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/togglebutton.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/togglebutton.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_copy.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_copy.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_moveup.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_moveup.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_paste.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_paste.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/empty_menu.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/empty_menu.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/slider.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/slider.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/spinbox.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/spinbox.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/tabbedpane.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/tabbedpane.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/cancel.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/cancel.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/node.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/node.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/table.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/table.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/header.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/header.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/progressbar.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/progressbar.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/item.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/item.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/splitpane.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/splitpane.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/dialog.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/dialog.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_movedown.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_movedown.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/bean.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/bean.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/passwordfield.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/passwordfield.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/row.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/row.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_delete.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/edit_delete.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/ok.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/ok.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/button.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/button.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/label.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/label.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/cell.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/icons/cell.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-previous.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-previous.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/autocompletion_words.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/autocompletion_words.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-next.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-next.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-markall.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-markall.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/autocompletion_keywords.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/autocompletion_keywords.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-matchcase.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-matchcase.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-wrap.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-wrap.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-regex.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-regex.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-wholeword.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/syntaxhighlight/images/search-wholeword.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/settings.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/settings.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/settings.xml	(revision 1126)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel border="true" bottom="12" columns="2" gap="20" left="12" right="12" top="12" weightx="1" weighty="1">
+    <label icon="icons/thing.gif" rowspan="3" valign="top"/>
+    <panel border="true" bottom="6" font="bold" gap="6" left="6" right="6" text="Icons" top="6">
+        <label for="tIconpath" mnemonic="0" text="Icon Path:"/>
+        <textfield name="tIconpath" weightx="1"/>
+        <button action="chooseDir(tIconpath, tIconpath.text)" name="bChoose" text="..." tooltip="Choose directory"/>
+    </panel>
+    <panel border="true" bottom="6" columns="3" font="bold" gap="6" left="6" right="6" text="XML Output" top="6" weightx="1" weighty="1">
+        <label for="rbIndentSpace" mnemonic="1" text="Indent Char:"/>
+        <checkbox group="indentChar" halign="left" name="rbIndentSpace" selected="true" text="Space"/>
+        <checkbox group="indentChar" halign="left" name="rbIndentTab" text="Tab"/>
+        <label for="spIndentSize" mnemonic="7" text="Indent Size:"/>
+        <spinbox colspan="2" end="1" halign="left" maximum="100" minimum="1" name="spIndentSize" start="1" text="4"/>
+        <label for="tCustomHeader" mnemonic="7" text="Custom Header:" valign="top"/>
+        <textarea colspan="3" height="80" name="tCustomHeader" weightx="1" weighty="1" width="300"/>
+    </panel>
+    <panel gap="6" halign="right" weightx="1">
+        <button action="ok(tIconpath.text, spIndentSize.text, rbIndentSpace.selected, rbIndentTab.selected, tCustomHeader.text)" icon="icons/ok.gif" mnemonic="0" name="bOk" text="Ok" valign="bottom" weighty="1"/>
+        <button action="close()" icon="icons/cancel.gif" mnemonic="0" name="bCancel" text="Cancel" type="cancel" valign="bottom" weighty="1"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/version.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/version.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/version.properties	(revision 1126)
@@ -0,0 +1,3 @@
+# ThinG version number
+version=0.1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/generator.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/generator.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/generator.properties	(revision 1126)
@@ -0,0 +1,142 @@
+# jEdit settings:
+# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1:
+#
+# Templates for the ThinG Generator.
+#
+# Important:
+# When changing any of the templates, please keep in mind:
+# - leading whitespace must be enclosed in quotes '...'
+# - brackets '{' and '}' must be enclosed in quotes unless they denote a parameter
+# - end-of-lines are always denoted with '\n'. The generator may change this
+#   into the OS specific line separator such as '\r\n' on Windows or '\r' on Mac.
+
+
+# 0: current date (java.util.Date instance)
+file.header.firstline=\
+	// Generated by ThinG on {0,date} {0,time}.\n\
+	\n
+
+
+# 0: "<package-spec>", e.g. "foo.bar.baz"
+file.header.package=\
+	package {0};\n\
+	\n
+
+
+# 0: additional import statement, e.g. "import thinlet.FrameLauncher;" or ""
+# 1: JavaDoc comment
+file.header=\
+	import thinlet.Thinlet;\n\
+	{0}\
+	\n\
+	\n\
+	/**\n\
+	' '* {1}\n\
+	' '*/\n
+
+
+file.footer=\
+	'}'\n
+
+
+# 0: "<classname>"
+# 1: "[ extends Thinlet]"
+# 2: "[ implements <interfacename>]"
+handler.signature=\
+	public class {0}{1}{2}\n\
+	'{'\n
+
+
+# 0: "<interfacename>"
+interface.signature=\
+	public interface {0}\n\
+	'{'\n
+
+
+# 0: "<classname>"
+# 1: "<thinlet-filename>"
+class.asThinlet.constructor=\
+	\n\
+	'    '/**\n\
+	'     '* Create a new {0} instance.\n\
+	'     '*/\n\
+	'    'public {0}() throws java.io.IOException\n\
+	'    {'\n\
+	'        'add(parse("{1}"));\n\
+	'    }'\n\
+	\n
+
+
+# 0: JavaDoc comment for the method.
+method.javadoc.header=\
+	\n\
+	'    '/**\n\
+	'     '* {0}\n
+
+
+method.javadoc.param.intro=\
+	'     '*\n
+
+
+# 1: "<parameter-name>"
+# 2: JavaDoc comment for the parameter
+method.javadoc.param=\
+	'     '* @param {0} {1}\n
+
+
+method.javadoc.footer=\
+	'     '*/\n
+
+
+# 0: full method signature, e.g. "mymethod(String param1, int param2)"
+method.body.interface=\
+	'    'public void {0};\n\
+	\n
+
+
+# 0: full method signature, e.g. "mymethod(String param1, int param2)"
+method.body.handler=\
+	'    'public void {0}\n\
+	'    {'\n\
+	'    }'\n\
+	\n
+
+
+# 0: "<classname>"
+main.asThinlet=\
+	\n\
+	'    '/**\n\
+	'     '* Show a test frame with the Thinlet contents.\n\
+	'     '*\n\
+	'     '* @param args  ignored.\n\
+	'     '*/\n\
+	'    'public static void main(String[] args) throws java.io.IOException\n\
+	'    {'\n\
+	'        'new FrameLauncher("{0}", new {0}(), 400, 400);\n\
+	'    }'\n\
+	\n
+
+
+# 0: "<classname>"
+# 1: "<thinlet-filename>"
+main.notAsThinlet=\
+	\n\
+	'    '/**\n\
+	'     '* Show a test frame with the Thinlet contents.\n\
+	'     '*\n\
+	'     '* @param args  ignored.\n\
+	'     '*/\n\
+	'    'public static void main(String[] args) throws java.io.IOException\n\
+	'    {'\n\
+	'        'class MyThinlet extends Thinlet\n\
+	'        {'\n\
+	'            'public MyThinlet() throws java.io.IOException\n\
+	'            {'\n\
+	'                'add(parse("{1}", new {0}()));\n\
+	'            }'\n\
+	'        };'\n\
+	'        'new FrameLauncher("{0}", new MyThinlet(), 400, 400);\n\
+	'    }'\n\
+	\n
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/componentchooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/componentchooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/componentchooser.xml	(revision 1126)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel bottom="12" columns="1" left="12" right="12" top="12" weightx="1" weighty="1">
+    <list colspan="2" name="list" line="false" weightx="1" weighty="1" action="selectionChanged(this, lSelected)" perform="close()"/>
+    <panel gap="6" top="12" weightx="1">
+        <label text="Selected:"/>
+        <label name="lSelected" text="null"/>
+        <panel weightx="1"/>
+        <button name="bOk" text="Ok" icon="icons/ok.gif" mnemonic="0" type="default" action="ok()"/>
+        <button name="bCancel" text="Cancel" icon="icons/cancel.gif" mnemonic="0" type="cancel" action="close()"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/thing.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/thing.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/thing.xml	(revision 1126)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: -->
+
+<panel columns="1" gap="4">
+
+	<menubar weightx="1">
+		<menu text="File" mnemonic="0">
+			<menuitem text="New" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl N" action="menu_file_new()"/>
+			<menuitem text="Open..." mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl O" action="menu_file_open()"/>
+			<separator/>
+			<menuitem text="Reload" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl R" action="menu_file_reload()"/>
+			<separator/>
+			<menuitem text="Save" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl S" action="menu_file_save()"/>
+			<menuitem text="Save As..." mnemonic="5" icon="icons/empty_menu.gif" action="menu_file_save_as()"/>
+			<separator/>
+			<menuitem text="Exit" mnemonic="0" icon="icons/empty_menu.gif" accelerator="alt F4" action="menu_file_exit()"/>
+		</menu>
+		<menu text="Edit" mnemonic="0">
+			<menuitem text="Cut" name="menu_edit_cut" mnemonic="0" accelerator="ctrl X" icon="icons/edit_cut.gif" action="menu_edit_cut()"/>
+			<menuitem text="Copy" name="menu_edit_copy" mnemonic="1" accelerator="ctrl C" icon="icons/edit_copy.gif" action="menu_edit_copy()"/>
+			<menuitem text="Paste" name="menu_edit_paste" mnemonic="0" accelerator="ctrl V" icon="icons/edit_paste.gif" action="menu_edit_paste()"/>
+			<menuitem text="Paste from system clipboard" name="menu_edit_paste_systemcb" mnemonic="1" accelerator="ctrl shift V" icon="icons/empty_menu.gif" action="menu_edit_paste_systemcb()"/>
+			<menuitem text="Delete" name="menu_edit_delete" mnemonic="0" icon="icons/edit_delete.gif" action="menu_edit_delete()"/>
+			<separator/>
+			<menuitem text="Settings..." mnemonic="0" icon="icons/empty_menu.gif" action="menu_edit_settings()"/>
+		</menu>
+		<menu text="Tools" mnemonic="0">
+			<menuitem text="Generate Handler Stub Source..." name="menu_tools_generate" mnemonic="0" accelerator="ctrl G" icon="icons/empty_menu.gif" action="menu_tools_generate()"/>
+		</menu>
+		<menu text="Help" mnemonic="0">
+			<menuitem text="About Thing..." mnemonic="0" icon="icons/thing_small.gif" action="menu_help_about()"/>
+		</menu>
+	</menubar>
+
+	<panel name="toolbar" weightx="1" gap="-1">
+
+		<!-- top level components -->
+		<button name="tb_add_panel" property="classname=panel" icon="icons/panel.gif" tooltip="Create new panel" action="addComponent(this)"/>
+		<button name="tb_add_dialog" property="classname=dialog" icon="icons/dialog.gif" tooltip="Create new dialog" action="addComponent(this)"/>
+		<button name="tb_add_desktop" property="classname=desktop" icon="icons/desktop.gif" tooltip="Create new desktop" action="addComponent(this)"/>
+		<button name="tb_add_splitpane" property="classname=splitpane" icon="icons/splitpane.gif" tooltip="Create new splitpane" action="addComponent(this)"/>
+		<button name="tb_add_tabbedpane" property="classname=tabbedpane" icon="icons/tabbedpane.gif" tooltip="Create new tabbedpane" action="addComponent(this)"/>
+
+		<!-- menu components -->
+		<button name="tb_add_menubar" property="classname=menubar" icon="icons/menubar.gif" tooltip="Create new menubar" action="addComponent(this)"/>
+		<button name="tb_add_menu" property="classname=menu" icon="icons/menu.gif" tooltip="Create new menu" action="addComponent(this)"/>
+		<button name="tb_add_menuitem" property="classname=menuitem" icon="icons/menuitem.gif" tooltip="Create new menuitem" action="addComponent(this)"/>
+		<button name="tb_add_checkboxmenuitem" property="classname=checkboxmenuitem" icon="icons/checkboxmenuitem.gif" tooltip="Create new checkboxmenuitem" action="addComponent(this)"/>
+
+		<!-- components -->
+		<button name="tb_add_label" property="classname=label" icon="icons/label.gif" tooltip="Create new label" action="addComponent(this)"/>
+		<button name="tb_add_button" property="classname=button" icon="icons/button.gif" tooltip="Create new button" action="addComponent(this)"/>
+		<button name="tb_add_togglebutton" property="classname=togglebutton" icon="icons/togglebutton.gif" tooltip="Create new togglebutton" action="addComponent(this)"/>
+		<button name="tb_add_checkbox" property="classname=checkbox" icon="icons/checkbox.gif" tooltip="Create new checkbox" action="addComponent(this)"/>
+		<button name="tb_add_textfield" property="classname=textfield" icon="icons/textfield.gif" tooltip="Create new textfield" action="addComponent(this)"/>
+		<button name="tb_add_combobox" property="classname=combobox" icon="icons/combobox.gif" tooltip="Create new combobox" action="addComponent(this)"/>
+		<button name="tb_add_passwordfield" property="classname=passwordfield" icon="icons/passwordfield.gif" tooltip="Create new passwordfield" action="addComponent(this)"/>
+		<button name="tb_add_spinbox" property="classname=spinbox" icon="icons/spinbox.gif" tooltip="Create new spinbox" action="addComponent(this)"/>
+		<button name="tb_add_progressbar" property="classname=progressbar" icon="icons/progressbar.gif" tooltip="Create new progressbar" action="addComponent(this)"/>
+		<button name="tb_add_slider" property="classname=slider" icon="icons/slider.gif" tooltip="Create new slider" action="addComponent(this)"/>
+		<button name="tb_add_separator" property="classname=separator" icon="icons/separator.gif" tooltip="Create new separator" action="addComponent(this)"/>
+		<button name="tb_add_list" property="classname=list" icon="icons/list.gif" tooltip="Create new list" action="addComponent(this)"/>
+		<button name="tb_add_table" property="classname=table" icon="icons/table.gif" tooltip="Create new table" action="addComponent(this)"/>
+		<button name="tb_add_textarea" property="classname=textarea" icon="icons/textarea.gif" tooltip="Create new textarea" action="addComponent(this)"/>
+		<button name="tb_add_tree" property="classname=tree" icon="icons/tree.gif" tooltip="Create new tree" action="addComponent(this)"/>
+
+		<!-- list items -->
+		<button name="tb_add_choice" property="classname=choice" icon="icons/choice.gif" tooltip="Create new choice" action="addComponent(this)"/>
+		<button name="tb_add_item" property="classname=item" icon="icons/item.gif" tooltip="Create new item" action="addComponent(this)"/>
+		<button name="tb_add_node" property="classname=node" icon="icons/node.gif" tooltip="Create new node" action="addComponent(this)"/>
+		<button name="tb_add_tab" property="classname=tab" icon="icons/tab.gif" tooltip="Create new tab" action="addComponent(this)"/>
+
+		<!-- table components -->
+		<button name="tb_add_row" property="classname=row" icon="icons/row.gif" tooltip="Create new row" action="addComponent(this)"/>
+		<button name="tb_add_cell" property="classname=cell" icon="icons/cell.gif" tooltip="Create new cell" action="addComponent(this)"/>
+		<button name="tb_add_header" property="classname=header" icon="icons/header.gif" tooltip="Create new header" action="addComponent(this)"/>
+		<button name="tb_add_column" property="classname=column" icon="icons/column.gif" tooltip="Create new column" action="addComponent(this)"/>
+
+		<!-- other -->
+		<button name="tb_add_popupmenu" property="classname=popupmenu" icon="icons/popupmenu.gif" tooltip="Create new popupmenu" action="addComponent(this)"/>
+
+		<!-- later -->
+		<!--
+		<button name="tb_add_bean" property="classname=bean" icon="icons/bean.gif" tooltip="Create new bean" action="addComponent(this)" enabled="false"/>
+		-->
+
+		<!-- placeholder in case there are no buttons add all -->
+		<separator height="30" width="1"/>
+	</panel>
+
+	<!-- main workarea -->
+	<panel left="4" right="4" weightx="1" weighty="1">
+		<splitpane orientation="horizontal" divider="200" weightx="1" weighty="1">
+
+			<!-- left splitpane: component tree and properties table -->
+			<splitpane orientation="vertical">
+				<panel columns="1" weightx="1" weighty="1">
+					<tree name="tree" angle="true" line="false" selection="single" weightx="1" weighty="1" action="treeSelectionChanged()"/>
+					<panel top="3" bottom="3" gap="2" scrollable="true">
+						<button name="tb_edit_copy" icon="icons/edit_copy.gif" tooltip="Copy selected component to internal ThinG clipboard and system clipboard" action="menu_edit_copy()"/>
+						<button name="tb_edit_cut" icon="icons/edit_cut.gif" tooltip="Cut selected component to internal ThinG clipboard and system clipboard" action="menu_edit_cut()"/>
+						<button name="tb_edit_paste" icon="icons/edit_paste.gif" tooltip="Paste component from internal ThinG clipboard below selected component" action="menu_edit_paste()"/>
+						<button name="tb_edit_delete" icon="icons/edit_delete.gif" tooltip="Remove selected component" action="menu_edit_delete()"/>
+						<separator/>
+						<button name="tb_edit_moveup" icon="icons/edit_moveup.gif" tooltip="Move selected component up" action="moveComponentUp()"/>
+						<button name="tb_edit_movedown" icon="icons/edit_movedown.gif" tooltip="Move selected component down" action="moveComponentDown()"/>
+					</panel>
+				</panel>
+				<panel columns="1" gap="5">
+					<table name="props" selection="single" weightx="1" weighty="1" action="tableSelectionChanged()">
+						<header>
+							<column name="props_key" text="Property" width="80" sort="ascent"/>
+							<column name="props_value" text="Value"/>
+						</header>
+					</table>
+					<panel name="propedit" columns="3" gap="5" weightx="1" border="true" top="5" left="5" bottom="5" right="5">
+						<label name="propedit_name" text=""/>
+						<panel name="propedit_panel" gap="5" weightx="1"/>
+						<button name="propedit_reset" text="Reset" tooltip="Reset to default value" font="10" valign="center" enabled="false" action="propEditReset()"/>
+					</panel>
+				</panel>
+			</splitpane>
+
+			<!-- right splitpane: preview panel -->
+			<tabbedpane name="tabs" placement="top" selected="1" action="tabSelected(this.selected)">
+				<!-- Attention: because of an obscure bug in Thinlet.getNextFocusable(), -->
+				<!-- the tab "XML" must be the first one! If it is not the first panel, Thinlet -->
+				<!-- runs into an endless loop when the user navigates from the "Preview" tab -->
+				<!-- to the "XML" tab, trying to set the next focusable component. -->
+				<tab text="XML" mnemonic="0">
+					<panel weightx="1" weighty="1">
+						<textarea name="serialize" editable="false" weightx="1" weighty="1"/>
+					</panel>
+				</tab>
+				<tab text="Preview" mnemonic="0">
+					<panel name="preview" border="true" scrollable="true" weightx="1" weighty="1"/>
+				</tab>
+			</tabbedpane>
+
+		</splitpane>
+	</panel>
+
+	<!-- status bar at bottom -->
+	<textfield name="statusbar" editable="false" text="ThinG" weightx="1"/>
+
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/generate.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/generate.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/swing/impl/generate.xml	(revision 1126)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel columns="1"
+    bottom="12" left="12" right="12" top="12" gap="12"
+    init="init(cbGenerateInterface, cbGenerateHandler, cbGenerateAsThinlet, cbGenerateMain, tInterfaceName, tHandlerName, tPackageName, tOutputDir, tPreview, bOk)"
+    weightx="1" weighty="1"
+>
+    <panel border="true" bottom="6" columns="3" font=" bold" gap="6" left="6" right="6" text="Generate" top="6" weightx="1">
+        <checkbox action="checkboxChanged(this)" mnemonic="0" name="cbGenerateInterface" text="Interface for Handler class" weightx="1"/>
+        <label for="tInterfaceName" mnemonic="1" text="Interface Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tInterfaceName" weightx="4"/>
+        <checkbox action="checkboxChanged(this)" mnemonic="0" name="cbGenerateHandler" selected="true" text="Handler class" weightx="1"/>
+        <label for="tHandlerName" mnemonic="1" text="Class Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tHandlerName" weightx="4"/>
+        <panel/>
+        <label for="tPackageName" mnemonic="0" text="Package Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tPackageName" weightx="4"/>
+        <panel colspan="3" gap="6" weightx="1">
+            <label for="tOutputDir" mnemonic="7" text="Output Directory:"/>
+            <textfield name="tOutputDir" weightx="1"/>
+            <button action="buttonOutputDirClicked()" text="..." tooltip="Select Output Directory"/>
+        </panel>
+    </panel>
+    <panel border="true" bottom="6" columns="1" font=" bold" gap="6" left="6" right="6" text="Handler Options" top="6">
+        <checkbox action="checkboxChanged(this)" mnemonic="13" name="cbGenerateAsThinlet" text="Handler is a Thinlet"/>
+        <checkbox action="checkboxChanged(this)" mnemonic="9" name="cbGenerateMain" text="Generate main()"/>
+    </panel>
+    <panel border="true" bottom="6" font=" bold" gap="6" left="6" right="6" text="Preview" top="6" weightx="1" weighty="1">
+        <textarea editable="false" font="Monospaced 11" name="tPreview" weightx="1" weighty="1"/>
+    </panel>
+    <panel gap="6" halign="right" weightx="1">
+        <button action="ok()" icon="icons/ok.gif" mnemonic="0" name="bOk" text="Ok" valign="bottom" weighty="1"/>
+        <button action="close()" icon="icons/cancel.gif" mnemonic="0" name="bCancel" text="Cancel" type="cancel" valign="bottom" weighty="1"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/i18n/text.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/i18n/text.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/i18n/text.properties	(revision 1126)
@@ -0,0 +1,2 @@
+# Resource bundle texts for the Spanish language locale (es)
+Example.returns_value=devuelve el valor
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/i18n/text_en.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/i18n/text_en.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/org/gvsig/scripting/i18n/text_en.properties	(revision 1126)
@@ -0,0 +1,2 @@
+# Resource bundle texts for the English language locale (en)
+Example.returns_value=returns value
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/resources/README.txt	(revision 1126)
@@ -0,0 +1,7 @@
+Put into this folder the resources needed by your library classes.
+
+This folder is added to the runtime classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, into this folder you can find some examples of resource bundle 
+property files that may be used by your library classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/package.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/package.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/package.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library description.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#packagecomment">Javadoc Tool documentation about the package file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/JRSyntaxTextArea.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/JRSyntaxTextArea.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/JRSyntaxTextArea.java	(revision 1126)
@@ -0,0 +1,730 @@
+package org.gvsig.scripting.swing.impl.syntaxhighlight;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import javax.swing.JScrollPane;
+import javax.swing.JViewport;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.JTextComponent;
+import org.apache.commons.lang3.StringUtils;
+import org.fife.rsta.ui.CollapsibleSectionPanel;
+import org.fife.rsta.ui.search.FindToolBar;
+import org.fife.rsta.ui.search.ReplaceToolBar;
+import org.fife.rsta.ui.search.SearchEvent;
+import org.fife.rsta.ui.search.SearchListener;
+import org.fife.ui.autocomplete.AutoCompletion;
+import org.fife.ui.autocomplete.BasicCompletion;
+import org.fife.ui.autocomplete.Completion;
+import org.fife.ui.autocomplete.CompletionProvider;
+import org.fife.ui.autocomplete.DefaultCompletionProvider;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+import org.fife.ui.rtextarea.GutterIconInfo;
+import org.fife.ui.rtextarea.RTextScrollPane;
+import org.fife.ui.rtextarea.SearchContext;
+import org.fife.ui.rtextarea.SearchEngine;
+import org.fife.ui.rtextarea.SearchResult;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JRSyntaxTextArea implements SyntaxtHighlightTextComponent, SearchListener {
+
+    private static final Logger logger = LoggerFactory.getLogger(JRSyntaxTextArea.class);
+    
+    public static class MyCheckBox extends JCheckBox {
+
+        private static final String uiClassID = "ToggleButtonUI";
+
+        @Override
+        public String getUIClassID() {
+            return uiClassID;
+        }
+
+    }
+
+    private class MyFindToolBar extends FindToolBar {
+
+        public MyFindToolBar(SearchListener listener) {
+            super(listener);
+        }
+
+        @Override
+        protected JCheckBox createCB(String key) {
+            JCheckBox cb = new MyCheckBox();
+            cb.setToolTipText(searchMsg.getString(key));
+            cb.addActionListener(listener);
+            cb.addMouseListener(listener);
+            cb.setIcon(getIcon("scripting-search-" + key.toLowerCase()));
+            return cb;
+        }
+
+    }
+
+    private class MyReplaceToolBar extends ReplaceToolBar {
+
+        public MyReplaceToolBar(SearchListener listener) {
+            super(listener);
+        }
+
+        @Override
+        protected JCheckBox createCB(String key) {
+            JCheckBox cb = new MyCheckBox();
+            cb.setToolTipText(searchMsg.getString(key));
+            cb.addActionListener(listener);
+            cb.addMouseListener(listener);
+            cb.setIcon(getIcon("scripting-search-" + key.toLowerCase()));
+            return cb;
+        }
+    }
+
+    private class LineTrackerPanel extends JPanel {
+
+        private static final long serialVersionUID = -1923556745197997373L;
+
+        private class Line extends JLabel {
+
+            private static final long serialVersionUID = 8966359978957026490L;
+            private final int lineno;
+            private final String tag;
+
+            public Line(String tag, final int lineno, int posy, Color color, String tooltip) {
+                this.lineno = lineno;
+                this.tag = tag;
+                this.setBackground(color);
+                this.setBounds(0, posy, 15, 2);
+                this.setOpaque(true);
+                this.setToolTipText(tooltip);
+                this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+                this.addMouseListener(new MouseAdapter() {
+
+                    @Override
+                    public void mouseClicked(MouseEvent e) {
+                        gotoline(lineno);
+                    }
+                });
+//                Rectangle r = this.getBounds();
+//                logger.info("LineTracker: created lineno:"+lineno+", tag:"+tag+", x:"+ r.x + ", y:"+ r.y + ", w:"+ r.width+", h:"+ r.height);
+            }
+
+            public int getLineno() {
+                return this.lineno;
+            }
+            
+            public String getTag() {
+                return this.tag;
+            }
+        }
+
+        public LineTrackerPanel() {
+            setLayout(null);
+        }
+
+        @Override
+        public Dimension getPreferredSize() {
+            Dimension d = super.getPreferredSize(); 
+            return new Dimension(15, d.height);
+        }
+        
+        public void addLineTracker(String tag, int lineno, String tooltip, Color color) {
+            int posy = (int) (((float)lineno)*this.getSize().height / textArea.getLineCount());
+            Line line = new Line(tag,lineno,posy,color,tooltip);
+            this.add(line);
+            this.repaint();
+        }
+
+        public void removeLineTrackers() {
+            this.removeAll();
+            this.repaint();
+        }
+
+        public void removeLineTrackers(String tag) {
+            if( StringUtils.isEmpty(tag) ) {
+                return;
+            }
+            List<Line> toremove = new ArrayList<>();
+            for( int i=0; i<this.getComponentCount(); i++ ) {
+                Line line = (Line) this.getComponent(i);
+                if( tag.equalsIgnoreCase(line.getTag()) ) {
+                    toremove.add(line);
+                } 
+            }
+            for (Line line : toremove) {
+                this.remove(line);
+            }
+            this.repaint();
+        }
+    }
+
+    private static class IconsTracker {
+
+        private Map<String,Set<GutterIconInfo>>iconInfos = new HashMap<>();
+        
+        public IconsTracker() {
+            
+        }
+        
+        public void add(String tag, GutterIconInfo x) {
+            Set<GutterIconInfo> set = this.iconInfos.get(tag);
+            if( set == null ) {
+                set = new HashSet<>();
+                this.iconInfos.put(tag, set);
+            }
+            set.add(x);
+        }
+        
+        public void removeAll() {
+            this.iconInfos = new HashMap<>();
+        }
+        
+        public void remove(String tag) {
+            this.iconInfos.remove(tag);
+        }
+        
+        public void remove(String tag, GutterIconInfo x) {
+            Set<GutterIconInfo> set = this.iconInfos.get(tag);
+            if( set == null ) {
+                return;
+            }
+            set.remove(x);
+        }
+        
+        public boolean exists(String tag) {
+            return this.iconInfos.containsKey(tag);
+        }
+        
+        public Set<GutterIconInfo> get(String tag) {
+            Set<GutterIconInfo> set = this.iconInfos.get(tag);
+            return set;
+        }
+    }
+    
+    private final FindToolBar findToolBar;
+    private final ReplaceToolBar replaceToolBar;
+    private final CollapsibleSectionPanel csp;
+
+    public class DefaultUpdateCaretPositionActionEvent extends ActionEvent implements UpdateCaretPositionActionEvent {
+
+        /**
+         *
+         */
+        private static final long serialVersionUID = 8238486105726094074L;
+        int line = -1;
+        int column = -1;
+
+        public DefaultUpdateCaretPositionActionEvent(Object source, int id,
+                String command, int line, int column) {
+            super(source, id, command);
+            this.line = line;
+            this.column = column;
+        }
+
+        public int getLine() {
+            return this.line + 1;
+        }
+
+        public int getColumn() {
+            return this.column;
+        }
+
+        public boolean hasLineAndColumn() {
+            return this.line >= 0 && this.column >= 0;
+        }
+
+    }
+
+    protected ActionListener updateCaretPosition = null;
+    protected RSyntaxTextArea textArea = null;
+    private final RTextScrollPane scrollPanel;
+    private final JPanel panel;
+    private final Map<String, String> contentTypeAlias;
+    private final IconsTracker iconsTracker = new IconsTracker();
+    private LineTrackerPanel lineTrackerPanel;
+    private ScriptingUIManager scriptingUIManager;
+    
+
+    public JRSyntaxTextArea() {
+        this.contentTypeAlias = new HashMap<>();
+        this.contentTypeAlias.put("text/r", SyntaxConstants.SYNTAX_STYLE_C);
+        this.contentTypeAlias.put("text/ecmascript", SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT);
+        this.contentTypeAlias.put("text/cosa", SyntaxConstants.SYNTAX_STYLE_SQL);
+
+        this.textArea = new RSyntaxTextArea(20, 60);
+        
+        this.init();
+        lineTrackerPanel = new LineTrackerPanel();
+        scrollPanel = new RTextScrollPane(this.textArea);
+        scrollPanel.setIconRowHeaderEnabled(true);
+        scrollPanel.setLineNumbersEnabled(true);
+        scrollPanel.setFoldIndicatorEnabled(true);
+        
+        panel = new JPanel();
+        panel.setLayout(new BorderLayout());
+        panel.add(scrollPanel, BorderLayout.CENTER);
+        panel.add(lineTrackerPanel,BorderLayout.EAST);
+        
+        findToolBar = new MyFindToolBar(this);
+        replaceToolBar = new MyReplaceToolBar(this);
+        replaceToolBar.setSearchContext(findToolBar.getSearchContext());
+        csp = new CollapsibleSectionPanel();
+        csp.add(scrollPanel);
+        panel.add(csp, BorderLayout.CENTER);
+        int ctrl = (KeyEvent.CTRL_MASK | KeyEvent.ALT_MASK);
+        KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F, ctrl);
+        csp.addBottomComponent(ks, findToolBar);
+        ks = KeyStroke.getKeyStroke(KeyEvent.VK_H, ctrl);
+        csp.addBottomComponent(ks, replaceToolBar);
+
+        textArea.addKeyListener(new KeyListener() {
+
+            @Override
+            public void keyTyped(KeyEvent ke) {
+            }
+
+            @Override
+            public void keyPressed(KeyEvent ke) {
+                if (ke.getModifiers() == (KeyEvent.CTRL_MASK | KeyEvent.ALT_MASK)) {
+                    if (ke.getKeyCode() == KeyEvent.VK_H) {
+                        csp.showBottomComponent(replaceToolBar);
+                    } else if (ke.getKeyCode() == KeyEvent.VK_F) {
+                        csp.showBottomComponent(findToolBar);
+                    }
+                }
+            }
+
+            @Override
+            public void keyReleased(KeyEvent ke) {
+            }
+        });
+
+    }
+
+    protected void init() {
+        textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_PYTHON);
+        textArea.setCodeFoldingEnabled(true);
+        textArea.setClearWhitespaceLinesEnabled(true);
+        textArea.setAutoIndentEnabled(true);
+        textArea.setCloseCurlyBraces(true);
+        textArea.setWhitespaceVisible(true);
+        textArea.setAnimateBracketMatching(true);
+        textArea.setBracketMatchingEnabled(true);
+        textArea.setAutoIndentEnabled(true);
+        textArea.setTabsEmulated(true);
+        textArea.setTabSize(2);
+        textArea.setAntiAliasingEnabled(true);
+
+        textArea.addCaretListener(new CaretListener() {
+            public void caretUpdate(CaretEvent e) {
+                if (updateCaretPosition == null) {
+                    return;
+                }
+                updateCaretPosition.actionPerformed(
+                        new DefaultUpdateCaretPositionActionEvent(textArea, 1, "position", textArea.getCaretLineNumber(), textArea.getCaretOffsetFromLineStart())
+                );
+            }
+
+        });
+
+        CompletionProvider provider = new MyCompletionProvider(python_keywords);
+        AutoCompletion ac = new AutoCompletion(provider);
+        ac.setListCellRenderer(new MyListCellRenderer());
+        ac.setTriggerKey(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.CTRL_DOWN_MASK));
+        ac.install(textArea);
+    }
+
+    private ScriptingUIManager getUIManager() {
+        if( this.scriptingUIManager==null ) {
+            this.scriptingUIManager = ScriptingSwingLocator.getUIManager();
+        }
+        return this.scriptingUIManager;
+    }
+    
+    private ImageIcon getIcon(String key) {
+        ImageIcon icon = this.getUIManager().getIcon(key);
+        return icon;
+    }
+
+
+    private static class MyListCellRenderer extends DefaultListCellRenderer {
+
+        @Override
+        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+            Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates.
+            ((JLabel) comp).setIcon(((Completion) value).getIcon());
+            return comp;
+        }
+
+    }
+
+    private String[] python_keywords = new String[]{
+        "except",
+        "class",
+        "continue",
+        "else",
+        "finally",
+        "if",
+        "elif",
+        "in",
+        "return",
+        "raise",
+        "try",
+        "while",
+        "def",
+        "print",
+        "globals",
+        "for",
+        "pass",
+        "from",
+        "import",
+        "True",
+        "False",
+        "None",
+        "self",
+        "break",
+        "__init__",
+        "__len__",
+        "__str__",
+        "__repr__",
+        "__call__",
+        "__iter__",
+        "__class__",
+        "__getattr__",
+        "__setattr__",
+        "__delattr__",
+        "__getitem__",
+        "__setitem__",
+        "__delitem__",
+        "__getslice__",
+        "__setslice__",
+        "__delslice__",
+        "__getattribute__",
+        "__setattribute__",
+        "__contains__",
+        "__reduce__",
+        "__cmp__",
+        "__eq__",
+        "__ne__",
+        "__lt__",
+        "__le__",
+        "__gt__",
+        "__ge__",
+        "__mul__",
+        "__imul__",
+        "__rmul__",
+        "__add__",
+        "__iadd__",
+        "__radd__",
+        "__mod__",
+        "__rmod__",
+        "int",
+        "unicode",
+        "str",
+        "float",
+        "long",
+        "list",
+        "tuple",
+        "dict",
+        "iter",
+        "vars",
+        "isinstance",
+        "dir",
+        "repr",
+        "reduce",
+        "zip",
+        "chr",
+        "hex",
+        "id",
+        "max",
+        "min",
+        "oct",
+        "pow",
+        "ord",
+        "unichr",
+        "range",
+        "xrange",
+        "abs",
+        "len",
+        "apply",
+        "open",
+        "getattr",
+        "setattr",
+        "hasattr"
+    };
+
+    private class MyCompletionProvider extends DefaultCompletionProvider {
+
+        private List<Completion> keywords;
+        private Icon keywordIcon;
+        private Icon wordIcon;
+
+        public MyCompletionProvider(String[] keywords) {
+            ClassLoader loader = this.getClass().getClassLoader();
+            URL url = loader.getResource("org/gvsig/scripting/swing/impl/syntaxhighlight/images/autocompletion_keywords.png");
+            if (url != null) {
+                keywordIcon = new ImageIcon(url);
+            }
+            url = loader.getResource("org/gvsig/scripting/swing/impl/syntaxhighlight/images/autocompletion_words.png");
+            if (url != null) {
+                wordIcon = new ImageIcon(url);
+            }
+
+            this.keywords = new ArrayList<>();
+            for (String keyword : keywords) {
+                BasicCompletion completion = new BasicCompletion(this, keyword);
+                completion.setIcon(keywordIcon);
+                this.keywords.add(completion);
+            }
+        }
+
+        
+        
+        @Override
+        protected List<Completion> getCompletionsImpl(JTextComponent comp) {
+            TreeSet all = new TreeSet();
+            all.addAll(this.keywords);
+
+            String s = comp.getText();
+            String[] x = StringUtils.split(s, "\\ \n\t\r!\"><'@#|$%&/()=?�,.;:{}[]*-+");
+            TreeSet<String> words = new TreeSet(new Comparator<String>() {
+                @Override
+                public int compare(String o1, String o2) {
+                    return o1.compareTo(o2);
+                }
+            });
+            words.addAll(Arrays.asList(x));
+            for (String word : words) {
+                BasicCompletion completion = new BasicCompletion(this, word);
+                completion.setIcon(wordIcon);
+                completion.setRelevance(10);
+                all.add(completion);
+            }
+            completions = new ArrayList<>();
+            completions.addAll(all);
+            return super.getCompletionsImpl(comp);
+        }
+
+    }
+
+    private String normalizeContentType(String s) {
+        s = s.toLowerCase();
+        if (this.contentTypeAlias.containsKey(s)) {
+            s = this.contentTypeAlias.get(s);
+        }
+        return s;
+    }
+
+    public void setContentType(String contentType) {
+        this.textArea.setSyntaxEditingStyle(this.normalizeContentType(contentType));
+    }
+
+    public JScrollPane getJScrollPane() {
+        return this.scrollPanel;
+    }
+
+    public JTextComponent getJTextComponent() {
+        return this.textArea;
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this.panel;
+    }
+
+    public String getContentType() {
+        return this.textArea.getSyntaxEditingStyle();
+    }
+
+    public void addUpdateCaretPositionActionListener(ActionListener updateCaretPosition) {
+        this.updateCaretPosition = updateCaretPosition;
+    }
+
+    public void setText(String text) {
+        this.textArea.setText(text);
+    }
+
+    public String getText() {
+        return this.textArea.getText();
+    }
+
+    public void addKeyListener(KeyListener keyListener) {
+        this.textArea.addKeyListener(keyListener);
+    }
+
+    @Override
+    public void searchEvent(SearchEvent e) {
+
+        SearchEvent.Type type = e.getType();
+        SearchContext context = e.getSearchContext();
+        SearchResult result = null;
+
+        switch (type) {
+            default: // Prevent FindBugs warning later
+            case MARK_ALL:
+                result = SearchEngine.markAll(textArea, context);
+                break;
+            case FIND:
+                result = SearchEngine.find(textArea, context);
+                if (!result.wasFound()) {
+                    textArea.getCaret().setDot(0);
+                    result = SearchEngine.find(textArea, context);
+                    if (!result.wasFound()) {
+                        UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+                    }
+                }
+                break;
+            case REPLACE:
+                result = SearchEngine.replace(textArea, context);
+                if (!result.wasFound()) {
+                    UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+                }
+                break;
+            case REPLACE_ALL:
+                result = SearchEngine.replaceAll(textArea, context);
+                JOptionPane.showMessageDialog(null, result.getCount()
+                        + " occurrences replaced.");
+                break;
+        }
+        String text = null;
+        if (result.wasFound()) {
+            text = "Text found; occurrences marked: " + result.getMarkedCount();
+        } else if (type == SearchEvent.Type.MARK_ALL) {
+            if (result.getMarkedCount() > 0) {
+                text = "Occurrences marked: " + result.getMarkedCount();
+            } else {
+                text = "";
+            }
+        } else {
+            text = "Text not found";
+        }
+        //setMessage(text);
+    }
+
+    @Override
+    public String getSelectedText() {
+        return textArea.getSelectedText();
+    }
+
+    /**
+     *
+     */
+    @Override
+    public void discardAllEdits() {
+        this.textArea.discardAllEdits();
+    }
+    
+    @Override
+    public void removeTrackingIcons() {
+        this.scrollPanel.getGutter().removeAllTrackingIcons();
+        this.iconsTracker.removeAll();
+        this.lineTrackerPanel.removeLineTrackers();
+    }
+    
+    @Override
+    public void addLineTrackingIcon(String tag, int line, Icon icon, String tip) {
+        addLineTrackingIcon(tag, line, icon, tip, Color.BLUE.darker());
+    }
+    
+    @Override
+    public void addLineTrackingIcon(String tag, int line, Icon icon, String tip, Color color) {
+        try {
+            GutterIconInfo x = this.scrollPanel.getGutter().addLineTrackingIcon(line,icon,tip);
+            this.iconsTracker.add(tag, x);
+            this.lineTrackerPanel.addLineTracker(tag, line, tip, color);
+        } catch (BadLocationException ex) {
+            throw new RuntimeException("Can't add tracking icon with tag '"+tag+"' in line '"+line+"', tip='"+tip+"'", ex);
+        }
+    }
+    
+    @Override
+    public void removeTrackingIcons(String tag) {
+        Set<GutterIconInfo> icontags = this.iconsTracker.get(tag);
+        if( icontags!=null ) {
+            for (GutterIconInfo icontag : icontags) {
+                this.scrollPanel.getGutter().removeTrackingIcon(icontag);
+            }
+            this.iconsTracker.remove(tag);
+        }
+        this.lineTrackerPanel.removeLineTrackers(tag);
+    }
+
+    @Override
+    public void gotoline(final int line) {
+        JTextComponent component = getJTextComponent();
+        
+        Element root = component.getDocument().getDefaultRootElement();
+        int lineno = Math.max(line, 1);
+        int maxlines = root.getElementCount();
+        lineno = Math.min(lineno, maxlines);
+        int startOfLineOffset = root.getElement( lineno - 1 ).getStartOffset();
+        component.setCaretPosition( startOfLineOffset );
+            
+        Container container = SwingUtilities.getAncestorOfClass(JViewport.class, component);
+        if (container == null) {
+            return;
+        }
+        try {
+            Rectangle r = component.modelToView(component.getCaretPosition());
+            JViewport viewport = (JViewport) container;
+            int extentHeight = viewport.getExtentSize().height;
+            int viewHeight = viewport.getViewSize().height;
+
+            int y = Math.max(0, r.y - ((extentHeight - r.height) / 2));
+            y = Math.min(y, viewHeight - extentHeight);
+
+            viewport.setViewPosition(new Point(0, y));
+        } catch (BadLocationException ble) {
+            ble.printStackTrace();
+        }
+        try {
+            component.setCaretPosition( startOfLineOffset+1 );
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+}

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/JRSyntaxTextArea.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/JEditorPaneSyntaxHighlighting.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/JEditorPaneSyntaxHighlighting.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/JEditorPaneSyntaxHighlighting.java	(revision 1126)
@@ -0,0 +1,225 @@
+package org.gvsig.scripting.swing.impl.syntaxhighlight;
+
+import java.awt.Color;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+
+import javax.swing.JEditorPane;
+import javax.swing.JScrollPane;
+import javax.swing.JViewport;
+import javax.swing.SwingUtilities;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.StyledEditorKit;
+
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent.UpdateCaretPositionActionEvent;
+import org.gvsig.scripting.swing.impl.syntaxhighlight.styles.JavaStyledDocument;
+import org.gvsig.scripting.swing.impl.syntaxhighlight.styles.PythonStyledDocument;
+
+public class JEditorPaneSyntaxHighlighting extends JEditorPane implements SyntaxtHighlightTextComponent {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -4451156833693922180L;
+
+	protected ActionListener updateCaretPosition = null; 
+	
+	public JEditorPaneSyntaxHighlighting() {
+
+		this.setEditorKitForContentType(
+				"text/java",
+				new StyledEditorKit()
+				{
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = 2002618010308466332L;
+
+					public Document createDefaultDocument()
+					{
+						return new JavaStyledDocument();
+					}
+				}
+		);
+		this.setEditorKitForContentType(
+				"text/javascript",
+				new StyledEditorKit()
+				{
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = 830100022798600914L;
+
+					public Document createDefaultDocument()
+					{
+						return new JavaStyledDocument();
+					}
+				}
+		);
+		this.setEditorKitForContentType(
+				"text/python",
+				new StyledEditorKit()
+				{
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = -2728112890159261335L;
+
+					public Document createDefaultDocument()
+					{
+						return new PythonStyledDocument();
+					}
+				}
+		);
+
+		final JEditorPaneSyntaxHighlighting source = this;
+		this.addCaretListener(new CaretListener() {
+			public void caretUpdate(CaretEvent e) {
+				if( updateCaretPosition== null ) {
+					return;
+				}
+				int lineNumber = 1;
+				int columnNumber = 0;
+				int currentPosition = getCaretPosition();
+				Document doc = getDocument();
+				
+				PythonStyledDocument pydoc = null;
+				if( doc instanceof PythonStyledDocument ) {
+					pydoc  = (PythonStyledDocument) doc;
+				}
+				
+				try	{
+					String strText = doc.getText(0, currentPosition);
+					char arrText[] = strText.toCharArray();
+					for(int i=0; i<strText.length(); i++) {
+						if(arrText[i] == '\n') lineNumber++;
+					}
+					columnNumber = currentPosition - strText.lastIndexOf('\n');
+				}
+				catch(BadLocationException ble)	{
+					System.err.println(ble);
+				}
+				if( pydoc != null ) {
+					pydoc.setPosition(lineNumber, columnNumber);
+				}
+				updateCaretPosition.actionPerformed(
+						new DefaultUpdateCaretPositionActionEvent(source, 1, "position", lineNumber, columnNumber));
+			}
+			
+		});
+		
+	}
+	
+	public void addUpdateCaretPositionActionListener(ActionListener updateCaretPosition) {
+		this.updateCaretPosition = updateCaretPosition;  
+	}
+
+	public JScrollPane getJScrollPane() {
+		return  new JScrollPane(this);
+	}
+
+	public JTextComponent getJTextComponent() {
+		return this;
+	}
+
+        
+        @Override
+        public JComponent asJComponent() {
+            return this.getJScrollPane();
+        }
+
+    @Override
+    public void removeTrackingIcons() {
+    }
+
+    @Override
+    public void addLineTrackingIcon(String tag, int line, Icon icon, String tip) {
+    }
+
+        @Override
+    public void addLineTrackingIcon(String tag, int line, Icon icon, String tip, Color color) {
+    }
+
+    @Override
+    public void removeTrackingIcons(String tag) {
+    }
+        
+	public class DefaultUpdateCaretPositionActionEvent extends ActionEvent implements UpdateCaretPositionActionEvent {
+
+		int line = -1;
+		int column = -1;
+		
+		public DefaultUpdateCaretPositionActionEvent(Object source, int id,
+				String command, int line, int column) {
+			super(source, id, command);
+			this.line = line;
+			this.column = column;
+		}
+
+		public int getLine() {
+			return this.line;
+		}
+
+		public int getColumn() {
+			return this.column;
+		}
+
+		public boolean hasLineAndColumn() {
+			return this.line >=0 && this.column >= 0;
+		}
+		
+	}
+        
+    @Override
+    public void discardAllEdits() {
+
+    }
+
+
+        @Override
+    public void gotoline(final int line) {
+        JTextComponent component = getJTextComponent();
+        
+        Element root = component.getDocument().getDefaultRootElement();
+        int lineno = Math.max(line, 1);
+        int maxlines = root.getElementCount();
+        lineno = Math.min(lineno, maxlines);
+        int startOfLineOffset = root.getElement( lineno - 1 ).getStartOffset();
+        component.setCaretPosition( startOfLineOffset );
+            
+        Container container = SwingUtilities.getAncestorOfClass(JViewport.class, component);
+        if (container == null) {
+            return;
+        }
+        try {
+            Rectangle r = component.modelToView(component.getCaretPosition());
+            JViewport viewport = (JViewport) container;
+            int extentHeight = viewport.getExtentSize().height;
+            int viewHeight = viewport.getViewSize().height;
+
+            int y = Math.max(0, r.y - ((extentHeight - r.height) / 2));
+            y = Math.min(y, viewHeight - extentHeight);
+
+            viewport.setViewPosition(new Point(0, y));
+        } catch (BadLocationException ble) {
+            ble.printStackTrace();
+        }
+        try {
+            component.setCaretPosition( startOfLineOffset+1 );
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/styles/JavaStyledDocument.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/styles/JavaStyledDocument.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/styles/JavaStyledDocument.java	(revision 1126)
@@ -0,0 +1,584 @@
+package org.gvsig.scripting.swing.impl.syntaxhighlight.styles;
+
+import java.awt.Color;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.DefaultStyledDocument;
+import javax.swing.text.Element;
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.StyleConstants;
+
+
+public class JavaStyledDocument extends DefaultStyledDocument {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 2859530660266127826L;
+	
+	private final DefaultStyledDocument doc;
+	private final Element rootElement;
+
+	private boolean multiLineComment;
+	private final MutableAttributeSet normal;
+	private final MutableAttributeSet keyword;
+	private final MutableAttributeSet comment;
+	private final MutableAttributeSet quote;
+
+    private final Set<String> keywords;
+
+	public JavaStyledDocument()
+	{
+		doc = this;
+		rootElement = doc.getDefaultRootElement();
+		putProperty( DefaultEditorKit.EndOfLineStringProperty, "\n" );
+
+		normal = new SimpleAttributeSet();
+		StyleConstants.setForeground(normal, Color.black);
+
+		comment = new SimpleAttributeSet();
+		StyleConstants.setForeground(comment, Color.gray);
+		StyleConstants.setItalic(comment, true);
+
+		keyword = new SimpleAttributeSet();
+		StyleConstants.setForeground(keyword, Color.blue);
+
+		quote = new SimpleAttributeSet();
+		StyleConstants.setForeground(quote, Color.red);
+
+        keywords = new HashSet<String>();
+		keywords.add( "abstract" );
+		keywords.add( "boolean" );
+		keywords.add( "break" );
+		keywords.add( "byte" );
+		keywords.add( "byvalue" );
+		keywords.add( "case" );
+		keywords.add( "cast" );
+		keywords.add( "catch" );
+		keywords.add( "char" );
+		keywords.add( "class" );
+		keywords.add( "const" );
+		keywords.add( "continue" );
+		keywords.add( "default" );
+		keywords.add( "do" );
+		keywords.add( "double" );
+		keywords.add( "else" );
+		keywords.add( "extends" );
+		keywords.add( "false" );
+		keywords.add( "final" );
+		keywords.add( "finally" );
+		keywords.add( "float" );
+		keywords.add( "for" );
+		keywords.add( "future" );
+		keywords.add( "generic" );
+		keywords.add( "goto" );
+		keywords.add( "if" );
+		keywords.add( "implements" );
+		keywords.add( "import" );
+		keywords.add( "inner" );
+		keywords.add( "instanceof" );
+		keywords.add( "int" );
+		keywords.add( "interface" );
+		keywords.add( "long" );
+		keywords.add( "native" );
+		keywords.add( "new" );
+		keywords.add( "null" );
+		keywords.add( "operator" );
+		keywords.add( "outer" );
+		keywords.add( "package" );
+		keywords.add( "private" );
+		keywords.add( "protected" );
+		keywords.add( "public" );
+		keywords.add( "rest" );
+		keywords.add( "return" );
+		keywords.add( "short" );
+		keywords.add( "static" );
+		keywords.add( "super" );
+		keywords.add( "switch" );
+		keywords.add( "synchronized" );
+		keywords.add( "this" );
+		keywords.add( "throw" );
+		keywords.add( "throws" );
+		keywords.add( "transient" );
+		keywords.add( "true" );
+		keywords.add( "try" );
+		keywords.add( "var" );
+		keywords.add( "void" );
+		keywords.add( "volatile" );
+		keywords.add( "while" );
+	}
+
+	/*
+	 *  Override to apply syntax highlighting after the document has been updated
+	 */
+	@Override
+    public void insertString(int offset, String str, AttributeSet a) throws BadLocationException
+	{
+		if (str.equals("{"))
+			str = addMatchingBrace(offset);
+
+		super.insertString(offset, str, a);
+		processChangedLines(offset, str.length());
+	}
+
+	/*
+	 *  Override to apply syntax highlighting after the document has been updated
+	 */
+	@Override
+    public void remove(int offset, int length) throws BadLocationException
+	{
+		super.remove(offset, length);
+		processChangedLines(offset, 0);
+	}
+
+	/*
+	 *  Determine how many lines have been changed,
+	 *  then apply highlighting to each line
+	 */
+	public void processChangedLines(int offset, int length)
+		throws BadLocationException
+	{
+		String content = doc.getText(0, doc.getLength());
+
+		//  The lines affected by the latest document update
+
+		int startLine = rootElement.getElementIndex( offset );
+		int endLine = rootElement.getElementIndex( offset + length );
+
+		//  Make sure all comment lines prior to the start line are commented
+		//  and determine if the start line is still in a multi line comment
+
+		setMultiLineComment( commentLinesBefore( content, startLine ) );
+
+		//  Do the actual highlighting
+
+		for (int i = startLine; i <= endLine; i++)
+		{
+			applyHighlighting(content, i);
+		}
+
+		//  Resolve highlighting to the next end multi line delimiter
+
+		if (isMultiLineComment())
+			commentLinesAfter(content, endLine);
+		else
+			highlightLinesAfter(content, endLine);
+	}
+
+	/*
+	 *  Highlight lines when a multi line comment is still 'open'
+	 *  (ie. matching end delimiter has not yet been encountered)
+	 */
+	private boolean commentLinesBefore(String content, int line)
+	{
+		int offset = rootElement.getElement( line ).getStartOffset();
+
+		//  Start of comment not found, nothing to do
+
+		int startDelimiter = lastIndexOf( content, getStartDelimiter(), offset - 2 );
+
+		if (startDelimiter < 0)
+			return false;
+
+		//  Matching start/end of comment found, nothing to do
+
+		int endDelimiter = indexOf( content, getEndDelimiter(), startDelimiter );
+
+		if (endDelimiter < offset & endDelimiter != -1)
+			return false;
+
+		//  End of comment not found, highlight the lines
+
+		doc.setCharacterAttributes(startDelimiter, offset - startDelimiter + 1, comment, false);
+		return true;
+	}
+
+	/*
+	 *  Highlight comment lines to matching end delimiter
+	 */
+	private void commentLinesAfter(String content, int line)
+	{
+		int offset = rootElement.getElement( line ).getEndOffset();
+
+		//  End of comment not found, nothing to do
+
+		int endDelimiter = indexOf( content, getEndDelimiter(), offset );
+
+		if (endDelimiter < 0)
+			return;
+
+		//  Matching start/end of comment found, comment the lines
+
+		int startDelimiter = lastIndexOf( content, getStartDelimiter(), endDelimiter );
+
+		if (startDelimiter < 0 || startDelimiter <= offset)
+		{
+			doc.setCharacterAttributes(offset, endDelimiter - offset + 1, comment, false);
+		}
+	}
+
+	/*
+	 *  Highlight lines to start or end delimiter
+	 */
+	private void highlightLinesAfter(String content, int line)
+		throws BadLocationException
+	{
+		int offset = rootElement.getElement( line ).getEndOffset();
+
+		//  Start/End delimiter not found, nothing to do
+
+		int startDelimiter = indexOf( content, getStartDelimiter(), offset );
+		int endDelimiter = indexOf( content, getEndDelimiter(), offset );
+
+		if (startDelimiter < 0)
+			startDelimiter = content.length();
+
+		if (endDelimiter < 0)
+			endDelimiter = content.length();
+
+		int delimiter = Math.min(startDelimiter, endDelimiter);
+
+		if (delimiter < offset)
+			return;
+
+		//	Start/End delimiter found, reapply highlighting
+
+		int endLine = rootElement.getElementIndex( delimiter );
+
+		for (int i = line + 1; i < endLine; i++)
+		{
+			Element branch = rootElement.getElement( i );
+			Element leaf = doc.getCharacterElement( branch.getStartOffset() );
+			AttributeSet as = leaf.getAttributes();
+
+			if ( as.isEqual(comment) )
+				applyHighlighting(content, i);
+		}
+	}
+
+	/*
+	 *  Parse the line to determine the appropriate highlighting
+	 */
+	private void applyHighlighting(String content, int line)
+		throws BadLocationException
+	{
+		int startOffset = rootElement.getElement( line ).getStartOffset();
+		int endOffset = rootElement.getElement( line ).getEndOffset() - 1;
+
+		int lineLength = endOffset - startOffset;
+		int contentLength = content.length();
+
+		if (endOffset >= contentLength)
+			endOffset = contentLength - 1;
+
+		//  check for multi line comments
+		//  (always set the comment attribute for the entire line)
+
+		if (endingMultiLineComment(content, startOffset, endOffset)
+		||  isMultiLineComment()
+		||  startingMultiLineComment(content, startOffset, endOffset) )
+		{
+			doc.setCharacterAttributes(startOffset, endOffset - startOffset + 1, comment, false);
+			return;
+		}
+
+		//  set normal attributes for the line
+
+		doc.setCharacterAttributes(startOffset, lineLength, normal, true);
+
+		//  check for single line comment
+
+		int index = content.indexOf(getSingleLineDelimiter(), startOffset);
+
+		if ( (index > -1) && (index < endOffset) )
+		{
+			doc.setCharacterAttributes(index, endOffset - index + 1, comment, false);
+			endOffset = index - 1;
+		}
+
+		//  check for tokens
+
+		checkForTokens(content, startOffset, endOffset);
+	}
+
+	/*
+	 *  Does this line contain the start delimiter
+	 */
+	private boolean startingMultiLineComment(String content, int startOffset, int endOffset)
+		throws BadLocationException
+	{
+		int index = indexOf( content, getStartDelimiter(), startOffset );
+
+		if ( (index < 0) || (index > endOffset) )
+			return false;
+		else
+		{
+			setMultiLineComment( true );
+			return true;
+		}
+	}
+
+	/*
+	 *  Does this line contain the end delimiter
+	 */
+	private boolean endingMultiLineComment(String content, int startOffset, int endOffset)
+		throws BadLocationException
+	{
+		int index = indexOf( content, getEndDelimiter(), startOffset );
+
+		if ( (index < 0) || (index > endOffset) )
+			return false;
+		else
+		{
+			setMultiLineComment( false );
+			return true;
+		}
+	}
+
+	/*
+	 *  We have found a start delimiter
+	 *  and are still searching for the end delimiter
+	 */
+	private boolean isMultiLineComment()
+	{
+		return multiLineComment;
+	}
+
+	private void setMultiLineComment(boolean value)
+	{
+		multiLineComment = value;
+	}
+
+	/*
+	 *	Parse the line for tokens to highlight
+	 */
+	private void checkForTokens(String content, int startOffset, int endOffset)
+	{
+		while (startOffset <= endOffset)
+		{
+			//  skip the delimiters to find the start of a new token
+
+			while ( isDelimiter( content.substring(startOffset, startOffset + 1) ) )
+			{
+				if (startOffset < endOffset)
+					startOffset++;
+				else
+					return;
+			}
+
+			//  Extract and process the entire token
+
+			if ( isQuoteDelimiter( content.substring(startOffset, startOffset + 1) ) )
+				startOffset = getQuoteToken(content, startOffset, endOffset);
+			else
+				startOffset = getOtherToken(content, startOffset, endOffset);
+		}
+	}
+
+	/*
+	 *
+	 */
+	private int getQuoteToken(String content, int startOffset, int endOffset)
+	{
+		String quoteDelimiter = content.substring(startOffset, startOffset + 1);
+		String escapeString = getEscapeString(quoteDelimiter);
+
+		int index;
+		int endOfQuote = startOffset;
+
+		//  skip over the escape quotes in this quote
+
+		index = content.indexOf(escapeString, endOfQuote + 1);
+
+		while ( (index > -1) && (index < endOffset) )
+		{
+			endOfQuote = index + 1;
+			index = content.indexOf(escapeString, endOfQuote);
+		}
+
+		// now find the matching delimiter
+
+		index = content.indexOf(quoteDelimiter, endOfQuote + 1);
+
+		if ( (index < 0) || (index > endOffset) )
+			endOfQuote = endOffset;
+		else
+			endOfQuote = index;
+
+		doc.setCharacterAttributes(startOffset, endOfQuote - startOffset + 1, quote, false);
+
+		return endOfQuote + 1;
+	}
+
+	/*
+	 *
+	 */
+	private int getOtherToken(String content, int startOffset, int endOffset)
+	{
+		int endOfToken = startOffset + 1;
+
+		while ( endOfToken <= endOffset )
+		{
+			if ( isDelimiter( content.substring(endOfToken, endOfToken + 1) ) )
+				break;
+
+			endOfToken++;
+		}
+
+		String token = content.substring(startOffset, endOfToken);
+
+		if ( isKeyword( token ) )
+		{
+			doc.setCharacterAttributes(startOffset, endOfToken - startOffset, keyword, false);
+		}
+
+		return endOfToken + 1;
+	}
+
+	/*
+	 *  Assume the needle will the found at the start/end of the line
+	 */
+	private int indexOf(String content, String needle, int offset)
+	{
+		int index;
+
+		while ( (index = content.indexOf(needle, offset)) != -1 )
+		{
+			String text = getLine( content, index ).trim();
+
+			if (text.startsWith(needle) || text.endsWith(needle))
+				break;
+			else
+				offset = index + 1;
+		}
+
+		return index;
+	}
+
+	/*
+	 *  Assume the needle will the found at the start/end of the line
+	 */
+	private int lastIndexOf(String content, String needle, int offset)
+	{
+		int index;
+
+		while ( (index = content.lastIndexOf(needle, offset)) != -1 )
+		{
+			String text = getLine( content, index ).trim();
+
+			if (text.startsWith(needle) || text.endsWith(needle))
+				break;
+			else
+				offset = index - 1;
+		}
+
+		return index;
+	}
+
+	private String getLine(String content, int offset)
+	{
+		int line = rootElement.getElementIndex( offset );
+		Element lineElement = rootElement.getElement( line );
+		int start = lineElement.getStartOffset();
+		int end = lineElement.getEndOffset();
+		return content.substring(start, end - 1);
+	}
+
+	/*
+	 *  Override for other languages
+	 */
+	protected boolean isDelimiter(String character)
+	{
+		String operands = ";:{}()[]+-/%<=>!&|^~*";
+
+		if (Character.isWhitespace( character.charAt(0) ) ||
+			operands.indexOf(character) != -1 )
+			return true;
+		else
+			return false;
+	}
+
+	/*
+	 *  Override for other languages
+	 */
+	protected boolean isQuoteDelimiter(String character)
+	{
+		String quoteDelimiters = "\"'";
+
+		if (quoteDelimiters.indexOf(character) < 0)
+			return false;
+		else
+			return true;
+	}
+
+	/*
+	 *  Override for other languages
+	 */
+	protected boolean isKeyword(String token)
+	{
+		return keywords.contains( token );
+	}
+
+	/*
+	 *  Override for other languages
+	 */
+	protected String getStartDelimiter()
+	{
+		return "/*";
+	}
+
+	/*
+	 *  Override for other languages
+	 */
+	protected String getEndDelimiter()
+	{
+		return "*/";
+	}
+
+	/*
+	 *  Override for other languages
+	 */
+	protected String getSingleLineDelimiter()
+	{
+		return "//";
+	}
+
+	/*
+	 *  Override for other languages
+	 */
+	protected String getEscapeString(String quoteDelimiter)
+	{
+		return "\\" + quoteDelimiter;
+	}
+
+	/*
+	 *
+	 */
+	protected String addMatchingBrace(int offset) throws BadLocationException
+	{
+		StringBuffer whiteSpace = new StringBuffer();
+		int line = rootElement.getElementIndex( offset );
+		int i = rootElement.getElement(line).getStartOffset();
+
+		while (true)
+		{
+			String temp = doc.getText(i, 1);
+
+			if (temp.equals(" ") || temp.equals("\t"))
+			{
+				whiteSpace.append(temp);
+				i++;
+			}
+			else
+				break;
+		}
+
+		return "{\n" + whiteSpace.toString() + "\t\n" + whiteSpace.toString() + "}";
+	}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/styles/PythonStyledDocument.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/styles/PythonStyledDocument.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/syntaxhighlight/styles/PythonStyledDocument.java	(revision 1126)
@@ -0,0 +1,750 @@
+package org.gvsig.scripting.swing.impl.syntaxhighlight.styles;
+
+import java.awt.Color;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.DefaultStyledDocument;
+import javax.swing.text.Element;
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.StyleConstants;
+
+public class PythonStyledDocument extends DefaultStyledDocument {
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 2859530660266127826L;
+
+    private static int TABSIZE = 4;
+    
+    private final DefaultStyledDocument doc;
+    private final Element rootElement;
+
+    private boolean multiLineComment;
+    private final MutableAttributeSet normal;
+    private final MutableAttributeSet keyword1;
+    private final MutableAttributeSet keyword2;
+    private final MutableAttributeSet keyword3;
+    private final MutableAttributeSet keyword4;
+    private final MutableAttributeSet builtin;
+    private final MutableAttributeSet comment;
+    private final MutableAttributeSet quote;
+    private final MutableAttributeSet identifiers;
+    
+    private final Set<String> keywords1;
+    private final Set<String> keywords2;
+    private final Set<String> keywords3;
+    private final Set<String> keywords4;
+    private final Set<String> builtins;
+
+//    private int lineNumber;
+
+    private int columnNumber;
+
+    public PythonStyledDocument() {
+        doc = this;
+        rootElement = doc.getDefaultRootElement();
+        putProperty(DefaultEditorKit.EndOfLineStringProperty, "\n");
+        
+        int fontSize = 14;
+
+        normal = new SimpleAttributeSet();
+        StyleConstants.setForeground(normal, Color.BLACK);
+        StyleConstants.setFontFamily(normal, "monospaced");
+        StyleConstants.setBold(normal, true);
+        StyleConstants.setFontSize(normal, fontSize);
+
+        comment = new SimpleAttributeSet();
+        StyleConstants.setForeground(comment,Color.GRAY);
+        StyleConstants.setItalic(comment, true);
+        StyleConstants.setBold(comment, true);
+        StyleConstants.setFontFamily(comment, "monospaced");
+        StyleConstants.setFontSize(comment, fontSize);
+
+
+        keyword1 = new SimpleAttributeSet();
+        StyleConstants.setForeground(keyword1, Color.BLACK);
+        StyleConstants.setFontFamily(keyword1, "monospaced");
+        StyleConstants.setBold(keyword1, true);
+        StyleConstants.setFontSize(keyword1, fontSize);
+
+        keyword2 = new SimpleAttributeSet();
+        StyleConstants.setForeground(keyword2, Color.CYAN);
+        StyleConstants.setFontFamily(keyword2, "monospaced");
+        StyleConstants.setBold(keyword2, false);
+        StyleConstants.setFontSize(keyword2, fontSize);
+
+        keyword3 = new SimpleAttributeSet();
+        StyleConstants.setForeground(keyword3, Color.GREEN.darker());
+        StyleConstants.setFontFamily(keyword3, "monospaced");
+        StyleConstants.setBold(keyword3, false);
+        StyleConstants.setFontSize(keyword3, fontSize);
+
+        keyword4 = new SimpleAttributeSet();
+        StyleConstants.setForeground(keyword4, Color.BLUE.darker());
+        StyleConstants.setFontFamily(keyword4, "monospaced");
+        StyleConstants.setBold(keyword4, true);
+        StyleConstants.setFontSize(keyword4, fontSize);
+
+        builtin = new SimpleAttributeSet();
+        StyleConstants.setForeground(builtin, Color.RED.darker());
+        StyleConstants.setFontFamily(builtin, "monospaced");
+        StyleConstants.setBold(builtin, false);
+        StyleConstants.setFontSize(builtin, fontSize);
+
+        identifiers = new SimpleAttributeSet();
+        StyleConstants.setForeground(identifiers, Color.BLACK);
+        StyleConstants.setFontFamily(identifiers, "monospaced");
+        StyleConstants.setBold(identifiers, false);
+        StyleConstants.setFontSize(identifiers, fontSize);
+
+        
+        quote = new SimpleAttributeSet();
+        StyleConstants.setForeground(quote,  Color.RED.darker());
+        StyleConstants.setFontFamily(quote, "monospaced");
+        StyleConstants.setBold(quote, true);
+        StyleConstants.setFontSize(quote, fontSize);
+        
+        keywords1 = new HashSet<String>();
+        keywords1.add("except");
+        keywords1.add("class");
+        keywords1.add("continue");
+        keywords1.add("else");
+        keywords1.add("finally");
+        keywords1.add("if");
+        keywords1.add("elif");
+        keywords1.add("in");
+        keywords1.add("return");
+        keywords1.add("raise");
+        keywords1.add("try");
+        keywords1.add("while");
+        keywords1.add("def");
+        keywords1.add("print");
+        keywords1.add("globals");
+        keywords1.add("for");
+        keywords1.add("pass");
+
+        keywords2 = new HashSet<String>();
+        keywords2.add("from");
+        keywords2.add("import");
+
+        keywords3 = new HashSet<String>();
+        keywords3.add("True");
+        keywords3.add("False");
+        keywords3.add("None");
+        keywords3.add("self");
+
+        keywords4 = new HashSet<String>();
+        keywords4.add("__init__");
+        keywords4.add("__len__");
+        keywords4.add("__str__");
+        keywords4.add("__repr__");
+        keywords4.add("__call__");
+        keywords4.add("__iter__");
+        keywords4.add("__class__");
+
+        keywords4.add("__getattr__");
+        keywords4.add("__setattr__");
+        keywords4.add("__delattr__");
+
+        keywords4.add("__getitem__");
+        keywords4.add("__setitem__");
+        keywords4.add("__delitem__");
+
+        keywords4.add("__getslice__");
+        keywords4.add("__setslice__");
+        keywords4.add("__delslice__");
+
+        keywords4.add("__getattribute__");
+        keywords4.add("__setattribute__");
+
+        keywords4.add("__contains__");
+        keywords4.add("__reduce__");
+        keywords4.add("__cmp__");
+        keywords4.add("__eq__");
+        keywords4.add("__ne__");
+        keywords4.add("__lt__");
+        keywords4.add("__le__");
+        keywords4.add("__gt__");
+        keywords4.add("__ge__");
+        keywords4.add("__mul__");
+        keywords4.add("__imul__");
+        keywords4.add("__rmul__");
+        keywords4.add("__add__");
+        keywords4.add("__iadd__");
+        keywords4.add("__radd__");
+        keywords4.add("__mod__");
+        keywords4.add("__rmod__");
+
+        builtins = new HashSet<String>();
+        builtins.add("int");
+        builtins.add("unicode");
+        builtins.add("str");
+        builtins.add("float");
+        builtins.add("long");
+        builtins.add("list");
+        builtins.add("tuple");
+        builtins.add("dict");
+        builtins.add("iter");
+        builtins.add("vars");
+        builtins.add("isinstance");
+        builtins.add("dir");
+        builtins.add("repr");
+        builtins.add("reduce");
+        builtins.add("zip");
+        builtins.add("chr");
+        builtins.add("hex");
+        builtins.add("id");
+        builtins.add("max");
+        builtins.add("min");
+        builtins.add("oct");
+        builtins.add("pow");
+        builtins.add("ord");
+        builtins.add("unichr");
+        builtins.add("range");
+        builtins.add("xrange");
+        builtins.add("abs");
+        builtins.add("len");
+        builtins.add("apply");
+        builtins.add("open");
+        builtins.add("getattr");
+        builtins.add("setattr");
+        builtins.add("hasattr");
+
+    }
+
+    private static class DelegatedIterator<T> implements Iterator<T> {
+        private final Iterator<T>[] iterators;
+        private int cur;
+
+        private DelegatedIterator(Iterator<T>[] iterators) {
+            this.iterators = iterators;
+            this.cur = 0;
+        }
+
+        @Override
+        public boolean hasNext() {
+            while( this.iterators.length<this.cur ) {
+                boolean x = this.iterators[this.cur].hasNext();
+                if( x ) {
+                    return true;
+                }
+                this.cur++;
+            }
+            return false;
+        }
+
+        @Override
+        public T next() {
+            return this.iterators[this.cur].next();
+        }
+
+        @Override
+        public void remove() {
+            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        }
+    
+    }
+    
+    public Iterator<String> keywords() {
+
+        return new DelegatedIterator<>(
+                new Iterator[] {
+                    this.keywords1.iterator(),
+                    this.keywords2.iterator(),
+                    this.keywords3.iterator(),
+                    this.keywords4.iterator(),
+                    this.builtins.iterator()
+                }
+        ) ;
+    }
+    
+    /*
+     * Override to apply syntax highlighting after the document has been updated
+     */
+    @Override
+    public void insertString(int offset, String str, AttributeSet a)
+            throws BadLocationException {
+        super.insertString(offset, processTab(offset, str, a), a);
+        processChangedLines(offset, str.length());
+    }
+
+    public void setPosition(int lineNumber, int columnNumber) {
+//        this.lineNumber= lineNumber;
+        this.columnNumber= columnNumber; 
+    }
+
+    private String processTab(int offset, String str, AttributeSet a ) {
+        if( !"\t".equals(str)) {
+            return str;
+        }
+        try {
+            int numberOfSpacesToInsert = (TABSIZE -((this.columnNumber -1)%TABSIZE));
+            
+            str = "                                                   ".substring(0, numberOfSpacesToInsert);
+        } catch (Exception e) {
+            return  "                    ".substring(0, TABSIZE);
+        }
+        return str; 
+    }
+    
+    /*
+     * Override to apply syntax highlighting after the document has been updated
+     */
+    @Override
+    public void remove(int offset, int length) throws BadLocationException {
+        super.remove(offset, length);
+        processChangedLines(offset, 0);
+    }
+
+    /*
+     * Determine how many lines have been changed, then apply highlighting to
+     * each line
+     */
+    public void processChangedLines(int offset, int length)
+            throws BadLocationException {
+        String content = doc.getText(0, doc.getLength());
+
+        // The lines affected by the latest document update
+
+        int startLine = rootElement.getElementIndex(offset);
+        int endLine = rootElement.getElementIndex(offset + length);
+
+        // Make sure all comment lines prior to the start line are commented
+        // and determine if the start line is still in a multi line comment
+
+        setMultiLineComment(commentLinesBefore(content, startLine));
+
+        // Do the actual highlighting
+
+        for (int i = startLine; i <= endLine; i++) {
+            applyHighlighting(content, i);
+        }
+
+        // Resolve highlighting to the next end multi line delimiter
+
+        if (isMultiLineComment())
+            commentLinesAfter(content, endLine);
+        else
+            highlightLinesAfter(content, endLine);
+    }
+
+    /*
+     * Highlight lines when a multi line comment is still 'open' (ie. matching
+     * end delimiter has not yet been encountered)
+     */
+    private boolean commentLinesBefore(String content, int line) {
+        int offset = rootElement.getElement(line).getStartOffset();
+
+        // Start of comment not found, nothing to do
+
+        int startDelimiter = lastIndexOf(content, getStartDelimiter(),
+                offset - 2);
+
+        if (startDelimiter < 0)
+            return false;
+
+        // Matching start/end of comment found, nothing to do
+
+        int endDelimiter = indexOf(content, getEndDelimiter(), startDelimiter);
+
+        if (endDelimiter < offset & endDelimiter != -1)
+            return false;
+
+        // End of comment not found, highlight the lines
+
+        doc.setCharacterAttributes(startDelimiter, offset - startDelimiter + 1,
+                comment, false);
+        return true;
+    }
+
+    /*
+     * Highlight comment lines to matching end delimiter
+     */
+    private void commentLinesAfter(String content, int line) {
+        int offset = rootElement.getElement(line).getEndOffset();
+
+        // End of comment not found, nothing to do
+
+        int endDelimiter = indexOf(content, getEndDelimiter(), offset);
+
+        if (endDelimiter < 0)
+            return;
+
+        // Matching start/end of comment found, comment the lines
+
+        int startDelimiter = lastIndexOf(content, getStartDelimiter(),
+                endDelimiter);
+
+        if (startDelimiter < 0 || startDelimiter <= offset) {
+            doc.setCharacterAttributes(offset, endDelimiter - offset + 1,
+                    comment, false);
+        }
+    }
+
+    /*
+     * Highlight lines to start or end delimiter
+     */
+    private void highlightLinesAfter(String content, int line)
+            throws BadLocationException {
+        int offset = rootElement.getElement(line).getEndOffset();
+
+        // Start/End delimiter not found, nothing to do
+
+        int startDelimiter = indexOf(content, getStartDelimiter(), offset);
+        int endDelimiter = indexOf(content, getEndDelimiter(), offset);
+
+        if (startDelimiter < 0)
+            startDelimiter = content.length();
+
+        if (endDelimiter < 0)
+            endDelimiter = content.length();
+
+        int delimiter = Math.min(startDelimiter, endDelimiter);
+
+        if (delimiter < offset)
+            return;
+
+        // Start/End delimiter found, reapply highlighting
+
+        int endLine = rootElement.getElementIndex(delimiter);
+
+        for (int i = line + 1; i < endLine; i++) {
+            Element branch = rootElement.getElement(i);
+            Element leaf = doc.getCharacterElement(branch.getStartOffset());
+            AttributeSet as = leaf.getAttributes();
+
+            if (as.isEqual(comment))
+                applyHighlighting(content, i);
+        }
+    }
+
+    /*
+     * Parse the line to determine the appropriate highlighting
+     */
+    private void applyHighlighting(String content, int line)
+            throws BadLocationException {
+        int startOffset = rootElement.getElement(line).getStartOffset();
+        int endOffset = rootElement.getElement(line).getEndOffset() - 1;
+
+        int lineLength = endOffset - startOffset;
+        int contentLength = content.length();
+
+        if (endOffset >= contentLength)
+            endOffset = contentLength - 1;
+
+        // check for multi line comments
+        // (always set the comment attribute for the entire line)
+
+        if (endingMultiLineComment(content, startOffset, endOffset)
+                || isMultiLineComment()
+                || startingMultiLineComment(content, startOffset, endOffset)) {
+            doc.setCharacterAttributes(startOffset,
+                    endOffset - startOffset + 1, comment, false);
+            return;
+        }
+
+        // set normal attributes for the line
+
+        doc.setCharacterAttributes(startOffset, lineLength, normal, true);
+
+        // check for single line comment
+
+        int index = content.indexOf(getSingleLineDelimiter(), startOffset);
+
+        if ((index > -1) && (index < endOffset)) {
+            doc.setCharacterAttributes(index, endOffset - index + 1, comment,
+                    false);
+            endOffset = index - 1;
+        }
+
+        // check for tokens
+
+        checkForTokens(content, startOffset, endOffset);
+    }
+
+    /*
+     * Does this line contain the start delimiter
+     */
+    private boolean startingMultiLineComment(String content, int startOffset,
+            int endOffset) throws BadLocationException {
+        int index = indexOf(content, getStartDelimiter(), startOffset);
+
+        if ((index < 0) || (index > endOffset))
+            return false;
+        else {
+            setMultiLineComment(true);
+            return true;
+        }
+    }
+
+    /*
+     * Does this line contain the end delimiter
+     */
+    private boolean endingMultiLineComment(String content, int startOffset,
+            int endOffset) throws BadLocationException {
+        int index = indexOf(content, getEndDelimiter(), startOffset);
+
+        if ((index < 0) || (index > endOffset))
+            return false;
+        else {
+            setMultiLineComment(false);
+            return true;
+        }
+    }
+
+    /*
+     * We have found a start delimiter and are still searching for the end
+     * delimiter
+     */
+    private boolean isMultiLineComment() {
+        return multiLineComment;
+    }
+
+    private void setMultiLineComment(boolean value) {
+        multiLineComment = value;
+    }
+
+    /*
+     * Parse the line for tokens to highlight
+     */
+    private void checkForTokens(String content, int startOffset, int endOffset) {
+        while (startOffset <= endOffset) {
+            // skip the delimiters to find the start of a new token
+
+            while (isDelimiter(content.substring(startOffset, startOffset + 1))) {
+                if (startOffset < endOffset)
+                    startOffset++;
+                else
+                    return;
+            }
+
+            // Extract and process the entire token
+
+            if (isQuoteDelimiter(content
+                    .substring(startOffset, startOffset + 1)))
+                startOffset = getQuoteToken(content, startOffset, endOffset);
+            else
+                startOffset = getOtherToken(content, startOffset, endOffset);
+        }
+    }
+
+    /*
+     *
+     */
+    private int getQuoteToken(String content, int startOffset, int endOffset) {
+        String quoteDelimiter = content.substring(startOffset, startOffset + 1);
+        String escapeString = getEscapeString(quoteDelimiter);
+
+        int index;
+        int endOfQuote = startOffset;
+
+        // skip over the escape quotes in this quote
+
+        index = content.indexOf(escapeString, endOfQuote + 1);
+
+        while ((index > -1) && (index < endOffset)) {
+            endOfQuote = index + 1;
+            index = content.indexOf(escapeString, endOfQuote);
+        }
+
+        // now find the matching delimiter
+
+        index = content.indexOf(quoteDelimiter, endOfQuote + 1);
+
+        if ((index < 0) || (index > endOffset))
+            endOfQuote = endOffset;
+        else
+            endOfQuote = index;
+
+        doc.setCharacterAttributes(startOffset, endOfQuote - startOffset + 1,
+                quote, false);
+
+        return endOfQuote + 1;
+    }
+
+    /*
+     *
+     */
+    private int getOtherToken(String content, int startOffset, int endOffset) {
+        int endOfToken = startOffset + 1;
+
+        while (endOfToken <= endOffset) {
+            if (isDelimiter(content.substring(endOfToken, endOfToken + 1)))
+                break;
+
+            endOfToken++;
+        }
+
+        String token = content.substring(startOffset, endOfToken);
+
+        if (isKeyword(token)) {
+            doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
+                    keyword1, false);
+
+        } else if ( keywords2.contains(token) ) {
+            doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
+                    keyword2, false);
+
+        } else if ( keywords3.contains(token) ) {
+            doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
+                    keyword3, false);
+
+        } else if ( keywords4.contains(token) ) {
+            doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
+                    keyword4, false);
+
+        } else if (isBuiltin(token)) {
+            doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
+                builtin, false);
+        } else if (isIdentifier(token)) {
+            doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
+                identifiers, false);
+        }
+                
+
+        return endOfToken + 1;
+    }
+
+    private boolean isIdentifier(String token) {
+        return token.matches("[A-Za-z_][A-Za-z0-9_]*");
+    }
+
+    /*
+     * Assume the needle will the found at the start/end of the line
+     */
+    private int indexOf(String content, String needle, int offset) {
+        int index;
+
+        while ((index = content.indexOf(needle, offset)) != -1) {
+            String text = getLine(content, index).trim();
+
+            if (text.startsWith(needle) || text.endsWith(needle))
+                break;
+            else
+                offset = index + 1;
+        }
+
+        return index;
+    }
+
+    /*
+     * Assume the needle will the found at the start/end of the line
+     */
+    private int lastIndexOf(String content, String needle, int offset) {
+        int index;
+
+        while ((index = content.lastIndexOf(needle, offset)) != -1) {
+            String text = getLine(content, index).trim();
+
+            if (text.startsWith(needle) || text.endsWith(needle))
+                break;
+            else
+                offset = index - 1;
+        }
+
+        return index;
+    }
+
+    private String getLine(String content, int offset) {
+        int line = rootElement.getElementIndex(offset);
+        Element lineElement = rootElement.getElement(line);
+        int start = lineElement.getStartOffset();
+        int end = lineElement.getEndOffset();
+        return content.substring(start, end - 1);
+    }
+
+    /*
+     * Override for other languages
+     */
+    protected boolean isDelimiter(String character) {
+        String operands = ";:()[]+-/%<=>!&|^~*.,";
+
+        if (Character.isWhitespace(character.charAt(0))
+                || operands.indexOf(character) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    /*
+     * Override for other languages
+     */
+    protected boolean isQuoteDelimiter(String character) {
+        String quoteDelimiters = "\"'";
+
+        if (quoteDelimiters.indexOf(character) < 0)
+            return false;
+        else
+            return true;
+    }
+
+    /*
+     * Override for other languages
+     */
+    protected boolean isKeyword(String token) {
+        return keywords1.contains(token);
+    }
+
+    protected boolean isBuiltin(String token) {
+        return builtins.contains(token);
+    }
+
+    /*
+     * Override for other languages
+     */
+    protected String getStartDelimiter() {
+        return "\"\"\"";
+    }
+
+    /*
+     * Override for other languages
+     */
+    protected String getEndDelimiter() {
+        return "\"\"\"";
+    }
+
+    /*
+     * Override for other languages
+     */
+    protected String getSingleLineDelimiter() {
+        return "#";
+    }
+
+    /*
+     * Override for other languages
+     */
+    protected String getEscapeString(String quoteDelimiter) {
+        return "\\" + quoteDelimiter;
+    }
+
+    /*
+     *
+    protected String addMatchingBrace(int offset) throws BadLocationException {
+        StringBuffer whiteSpace = new StringBuffer();
+        int line = rootElement.getElementIndex(offset);
+        int i = rootElement.getElement(line).getStartOffset();
+
+        while (true) {
+            String temp = doc.getText(i, 1);
+
+            if (temp.equals(" ") || temp.equals("\t")) {
+                whiteSpace.append(temp);
+                i++;
+            } else
+                break;
+        }
+
+        return "{\n" + whiteSpace.toString() + "\t\n" + whiteSpace.toString()
+                + "}";
+    }
+     */
+
+}
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DialogPanel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DialogPanel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DialogPanel.java	(revision 1126)
@@ -0,0 +1,22 @@
+package org.gvsig.scripting.swing.impl;
+
+import javax.swing.JComponent;
+
+public interface DialogPanel  {
+
+	public JComponent getJComponent();
+	
+    public abstract void actionAccept();
+	
+	public abstract void actionCancel();
+	
+	public abstract void actionApply();
+	
+	public abstract boolean isVisibleAccept();
+	
+	public abstract boolean isVisibleCancel();
+	
+	public abstract boolean isVisibleApply();
+	
+	
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultScriptingUIManager.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultScriptingUIManager.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultScriptingUIManager.java	(revision 1126)
@@ -0,0 +1,450 @@
+package org.gvsig.scripting.swing.impl;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import org.gvsig.about.AboutLocator;
+import org.gvsig.about.AboutManager;
+import org.gvsig.scripting.ScriptingDialog;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.CreateComponentListener;
+import org.gvsig.scripting.swing.api.EditorFactory;
+import org.gvsig.scripting.swing.api.JCodeEditor;
+import org.gvsig.scripting.swing.api.JDialogEditor;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.scripting.swing.api.JScriptingBrowser;
+import org.gvsig.scripting.swing.api.JScriptingComposer;
+import org.gvsig.scripting.swing.api.JScriptingConsole;
+import org.gvsig.scripting.swing.api.JScriptingLauncher;
+import org.gvsig.scripting.swing.api.JThinG;
+import org.gvsig.scripting.swing.api.JThinlet;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.api.ScriptingUIManager.MenuEntry;
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
+import org.gvsig.scripting.swing.impl.composer.DefaultJScriptingComposer;
+import org.gvsig.scripting.swing.impl.composer.editors.DialogEditor;
+import org.gvsig.scripting.swing.impl.composer.editors.DialogEditorFactory;
+import org.gvsig.scripting.swing.impl.composer.editors.ExternalFileEditorFactory;
+import org.gvsig.scripting.swing.impl.composer.editors.FolderEditorFactory;
+import org.gvsig.scripting.swing.impl.composer.editors.PropertiesEditorFactory;
+import org.gvsig.scripting.swing.impl.composer.editors.ScriptUnitEditor;
+import org.gvsig.scripting.swing.impl.composer.editors.ScriptUnitEditorFactory;
+import org.gvsig.scripting.swing.impl.composer.editors.SimpleScriptEditor;
+import org.gvsig.scripting.swing.impl.composer.editors.TextEditorFactory;
+import org.gvsig.scripting.swing.impl.syntaxhighlight.JEditorPaneSyntaxHighlighting;
+import org.gvsig.scripting.swing.impl.syntaxhighlight.JRSyntaxTextArea;
+import org.gvsig.scripting.swing.impl.tools.DefaultScriptChooserPanel;
+import org.gvsig.scripting.swing.impl.tools.ScriptListPickerController;
+import org.gvsig.scripting.swing.impl.tools.ScriptPickerController;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.script.Script;
+import org.gvsig.tools.swing.api.Component;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.pickercontroller.PickerController;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultScriptingUIManager 
+        implements ScriptingUIManager
+    {
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(DefaultScriptingUIManager.class);
+    
+    private final ScriptingManager manager;
+    private final Map<String, URL> userHelps = new HashMap<>();
+    private I18nManager i18nManager;
+    private WindowManager windowsManager = null;
+    private final Map<String,Action> composerTools = new LinkedHashMap<>();
+    private final Map<String,MenuEntry> composerMenus = new LinkedHashMap<>();
+    private JScriptingComposer activeComposer;
+    private Set<CreateComponentListener> createComponentListeners;    
+    private final Map<String,EditorFactory> editorFactories = new HashMap<>();
+    private List<EditorFactory> editorFactoriesOrderer = null;
+    
+    private static class DefaultMenuEntry implements MenuEntry {
+        private final Action action;
+        private final String text;
+
+        public DefaultMenuEntry(String text, Action action) {
+            this.text = text;
+            this.action = action;
+        }
+
+        @Override
+        public String getText() {
+            return this.text;
+        }
+
+        @Override
+        public Action getAction() {
+            return this.action;
+        }
+        
+    }
+    public DefaultScriptingUIManager() {
+
+        this.manager = ScriptingLocator.getManager();
+        this.manager.put("ScriptingUIManager", this); // ??????
+        
+        this.i18nManager = ToolsLocator.getI18nManager();
+        this.init();
+    }
+    
+    private void init() {
+        this.registerEditor(new DialogEditorFactory());
+        this.registerEditor(new ScriptUnitEditorFactory());
+        this.registerEditor(new TextEditorFactory());
+        this.registerEditor(new ExternalFileEditorFactory());
+        this.registerEditor(new PropertiesEditorFactory());
+        this.registerEditor(new FolderEditorFactory());
+    }
+    
+    @Override
+    public void addCreatedComponentListener(CreateComponentListener listener) {
+        if( this.createComponentListeners==null ) {
+            this.createComponentListeners = new HashSet<>();
+        }
+        this.createComponentListeners.add(listener);
+    }
+    
+    @Override
+    public void removeCreatedComponentListener(CreateComponentListener listener) {
+        if( this.createComponentListeners==null ) {
+            return;
+        }
+        this.createComponentListeners.remove(listener);
+    }
+    
+    public void fireCreateComponent(Component component) {
+        if (this.createComponentListeners == null) {
+            return;
+        }
+        for (CreateComponentListener listener : this.createComponentListeners) {
+            try {
+                listener.componentCreated(component);
+            } catch (Throwable th) {
+                String s = "unknow";
+                try {
+                    s = component.getClass().getName();
+                } catch(Throwable th1) {
+                }
+                LOGGER.warn("Problems call listener",th);
+            }
+        }
+    }
+    
+    @Override
+    public JScriptingComposer createComposer() {
+        JScriptingComposer composer = new DefaultJScriptingComposer(this);
+        fireCreateComponent(composer);
+        return composer;
+    }
+
+    @Override
+    public JPanel createInstaller() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public JScriptingLauncher createLauncher() {
+        JScriptingLauncher launcher = new DefaultJScriptingLauncher(this);
+        fireCreateComponent(launcher);
+        return launcher;
+    }
+
+    @Override
+    public ImageIcon getIcon(String name) {
+        return this.getIcon(name, null);
+    }
+
+    @Override
+    public ImageIcon getIcon(String name, String size) {
+        if (name == null) {
+            return new ImageIcon();
+        }
+        String tamanyo = "16x16/";
+        if (size != null && size.equals("big")) {
+            tamanyo = "32x32/";
+        }
+        ClassLoader loader = this.getClass().getClassLoader();
+        URL url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + name + ".png");
+        if (url == null) {
+            url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + "scripting-image-missing.png");
+        }
+        if (url == null) {
+            return new ImageIcon();
+        }
+        return new ImageIcon(url);
+    }
+
+    @Override
+    public ScriptingManager getManager() {
+        return this.manager;
+    }
+
+    public String[] getPrerreferedLanguages() {
+        String curr = Locale.getDefault().getLanguage().toLowerCase();
+        if (curr.equals("gl")) {
+            return new String[]{"gl", "es", "en"};
+        }
+        if (curr.equals("ca")) {
+            return new String[]{"ca", "es", "en"};
+        }
+        if (curr.equals("eu")) {
+            return new String[]{"eu", "es", "en"};
+        }
+        if (curr.equals("va")) {
+            return new String[]{"va", "ca", "es", "en"};
+        }
+        return new String[]{curr, "en", "es"};
+    }
+
+    @Override
+    public AboutManager getAboutManager() {
+        return AboutLocator.getManager();
+    }
+
+    private void showWindow(JComponent panel, String title, WindowManager.MODE mode) {
+        WindowManager winmanager = this.getWindowManager();
+        if( winmanager instanceof WindowManager_v2 ) {
+            ((WindowManager_v2)winmanager).showWindow(panel, title, mode, getIcon("scripting-icon-python").getImage());
+        } else {
+            winmanager.showWindow(panel, title, mode);
+        }
+    }
+    
+    @Override
+    public void showDialog(JComponent panel, String title) {
+        this.showWindow(panel, title, WindowManager.MODE.DIALOG);
+    }
+
+    @Override
+    public void showWindow(JComponent panel, String title) {
+        this.showWindow(panel, title, WindowManager.MODE.WINDOW);
+    }
+
+    @Override
+    public void showTool(JComponent panel, String title) {
+        this.showWindow(panel, title, WindowManager.MODE.TOOL);
+    }
+
+    @Override
+    public JScriptingBrowser createBrowser(ScriptingFolder root, boolean foldersOnly) {
+        JScriptingBrowser browser = new DefaultJScriptingBrowser(this, root, foldersOnly);
+        fireCreateComponent(browser);
+        return browser;
+    }
+
+    @Override
+    public JScriptingBrowser createBrowser(ScriptingFolder root) {
+        return this.createBrowser(root,false);
+    }
+
+    @Override
+    public JCodeEditor createJCodeEditor(ScriptingScript script) {
+        JCodeEditor editor = new ScriptUnitEditor(this, script);
+        fireCreateComponent(editor);
+        return editor;
+    }
+
+    @Override
+    public JDialogEditor createJDialogEditor(ScriptingDialog script) {
+        return new DialogEditor(this, script);
+    }
+
+    @Override
+    public JThinG createJThinG() {
+        JThinG thing = new DefaultJThinG();
+        return thing;
+    }
+
+    @Override
+    public JThinlet createJThinlet() {
+        JThinlet thinlet = new DefaultJThinlet();
+        return thinlet;
+    }
+
+    @Override
+    public SyntaxtHighlightTextComponent createSyntaxHighlightingPanel() {
+        try {
+            return new JRSyntaxTextArea();
+        } catch (Throwable t) {
+            LOGGER.info("Can't create advanced SyntaxHighlightingPanel.", t);
+            return new JEditorPaneSyntaxHighlighting();
+        }
+    }
+
+    @Override
+    public String getTranslation(String key) {
+        if (this.i18nManager == null) {
+            this.i18nManager = ToolsLocator.getI18nManager();
+        }
+        return i18nManager.getTranslation(key);
+    }
+
+    @Override
+    public WindowManager getWindowManager() {
+        if( this.windowsManager==null ) {
+            this.windowsManager = ToolsSwingLocator.getWindowManager();
+        }
+        return this.windowsManager;
+    }
+
+    @Override
+    public void setWindowManager(WindowManager windowsManager) {
+        this.windowsManager = windowsManager;
+    }
+
+    @Override
+    public JScriptingConsole createJScriptingConsole() {
+        return this.createJScriptingConsole(true);
+    }
+
+    @Override
+    public JScriptingConsole createJScriptingConsole(boolean captureOutput) {
+        JScriptingConsole console = new DefaultJScriptingConsole(captureOutput);
+        fireCreateComponent(console);
+        return console;
+    }
+
+    @Override
+    public void addComposerMenu(String text, Action action) {
+        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
+        this.composerMenus.put(name,new DefaultMenuEntry(text,action));
+    }
+
+    @Override
+    public void addComposerTool(Action action) {
+        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
+        this.composerTools.put(name,action);
+    }
+
+    @Override
+    public Collection<MenuEntry> getComposerMenus() {
+        return this.composerMenus.values();
+    }
+
+    @Override
+    public Collection<Action> getComposerTools() {
+        return this.composerTools.values();
+    }
+    
+    @Override
+    public JEditor createEditor(ScriptingUnit unit) {
+        JEditor editor = null;
+        for (EditorFactory factory : this.getEditorFactories() ) {
+            try {
+                if( factory.canCreate(unit) ) {
+                    editor = factory.create(unit);
+                    fireCreateComponent(editor);
+                    break;
+                }
+            } catch(Exception ex) {
+                LOGGER.warn("Can't create an editor with factory '"+factory.getClass().getName()+"' for '"+unit.getClass().getName()+"'.",ex);
+            }
+        }
+        return editor;
+    }
+
+    @Override
+    public boolean hasEditor(ScriptingUnit unit) {
+        if( unit == null ) {
+            return false;
+        }
+        for (EditorFactory factory : this.getEditorFactories() ) {
+            try {
+                if( factory.canCreate(unit) ) {
+                    return true;
+                }
+            } catch(Exception ex) {
+                LOGGER.warn("Can't check if factory '"+factory.getClass().getName()+"' can create an editor for '"+unit.getClass().getName()+"'.",ex);
+            }
+        }
+        return false;
+    }
+
+    public void setActiveComposer(JScriptingComposer composer) {
+        this.activeComposer = composer;
+    }
+    
+    @Override
+    public JScriptingComposer getActiveComposer() {
+        return this.activeComposer;
+    }
+
+    @Override
+    public void registerEditor(EditorFactory factory) {
+        this.editorFactories.put(factory.getName(), factory);
+        this.editorFactoriesOrderer = null;
+    }
+    
+    @Override
+    public List<EditorFactory> getEditorFactories() {
+        if( this.editorFactoriesOrderer == null ) {
+            this.editorFactoriesOrderer = new ArrayList<>(this.editorFactories.values());
+            Collections.sort(editorFactoriesOrderer, new Comparator<EditorFactory>() {
+
+                @Override
+                public int compare(EditorFactory o1, EditorFactory o2) {
+                    return o2.getPriority() - o1.getPriority();
+                }
+            });
+        }
+        return editorFactoriesOrderer;
+    }
+
+    @Override
+    public ScriptChooserPanel createScriptChooserPanel() {
+        return new DefaultScriptChooserPanel(this);
+    }
+
+    @Override
+    public PickerController<Script> createScriptPickerController(JTextField text, JButton chooser) {
+        ScriptPickerController x = new ScriptPickerController(text, chooser);
+        return x;
+    }
+
+    @Override
+    public PickerController<List<Script>> createListScriptPickerController(JComboBox combo, JButton remove, JButton chooser) {
+        ScriptListPickerController x = new ScriptListPickerController(combo, remove, chooser);
+        return x;
+    }
+
+    @Override
+    public PickerController<List<Script>> createListScriptPickerController(JList list, JButton remove, JButton chooser) {
+        ScriptListPickerController x = new ScriptListPickerController(list, remove, chooser);
+        return x;
+    }
+
+    @Override
+    public SimpleScriptEditor createScriptEditor() {
+        SimpleScriptEditor x = new SimpleScriptEditor();
+        return x;
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/ScriptListPickerController.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/ScriptListPickerController.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/ScriptListPickerController.java	(revision 1126)
@@ -0,0 +1,331 @@
+package org.gvsig.scripting.swing.impl.tools;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.tools.script.Script;
+import org.gvsig.tools.swing.api.ListElement;
+import org.gvsig.tools.swing.api.pickercontroller.AbstractPickerController;
+import org.gvsig.tools.swing.api.script.ScriptSwingManager;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public class ScriptListPickerController extends AbstractPickerController<List<Script>> {
+
+    private class ListComponent {
+
+        private final JComboBox combo;
+        private final JList list;
+
+        public ListComponent(JComboBox combo) {
+            this.list = null;
+            this.combo = combo;
+        }
+
+        public ListComponent(JList list) {
+            this.list = list;
+            this.combo = null;
+        }
+
+        public void setEnabled(boolean b) {
+            if (this.list == null) {
+                this.combo.setEnabled(b);
+            } else {
+                this.list.setEnabled(b);
+            }
+        }
+
+        public int getSelectedIndex() {
+            if (this.list == null) {
+                return this.combo.getSelectedIndex();
+            } else {
+                return this.list.getSelectedIndex();
+            }
+        }
+
+        public void clearElements() {
+            if (this.list == null) {
+                this.combo.setModel(new DefaultComboBoxModel());
+            } else {
+                this.list.setModel(new DefaultListModel());
+            }
+        }
+
+        public void addElement(ListElement element) {
+            if (this.list == null) {
+                this.combo.addItem(element);
+            } else {
+                ((DefaultListModel) (this.list.getModel())).addElement(element);
+            }
+        }
+
+        public void addSelectionListener(final ActionListener listener) {
+            if (this.combo != null) {
+                this.combo.addItemListener(new ItemListener() {
+                    @Override
+                    public void itemStateChanged(ItemEvent e) {
+                        ActionEvent event = new ActionEvent(this, 1, "ItemChanged");
+                        listener.actionPerformed(event);
+                    }
+                });
+            }
+            if (this.list != null) {
+                this.list.addListSelectionListener(new ListSelectionListener() {
+                    @Override
+                    public void valueChanged(ListSelectionEvent e) {
+                        ActionEvent event = new ActionEvent(this, 1, "ItemChanged");
+                        listener.actionPerformed(event);
+                    }
+                });
+            }
+        }
+        
+        public void addKeyListener(KeyListener listener) {
+            if( this.list!=null ) {
+                this.list.addKeyListener(listener);
+            }
+        }
+
+        private void setSelectedIndex(int n) {
+            if (this.list == null) {
+                this.combo.setSelectedIndex(n);
+            } else {
+                this.list.setSelectedIndex(n);
+            }
+        }
+    }
+
+    private List<Script> scripts;
+    private final ListComponent list;
+    private final JButton btnRemove;
+    private final JButton btnChooser;
+
+    public ScriptListPickerController(JComboBox combo, JButton remove, JButton chooser) {
+        this.scripts = new ArrayList<>();
+        this.list = new ListComponent(combo);
+        this.btnChooser = chooser;
+        this.btnRemove = remove;
+
+        this.initComponents();
+    }
+
+    public ScriptListPickerController(JList list, JButton remove, JButton chooser) {
+        this.scripts = new ArrayList<>();
+        this.list = new ListComponent(list);
+        this.btnChooser = chooser;
+        this.btnRemove = remove;
+
+        this.initComponents();
+    }
+
+    private void initComponents() {
+        this.list.setEnabled(true);
+
+        this.btnRemove.setEnabled(false);
+        this.btnRemove.setIcon(this.getIcon("picker-script-remove"));
+        this.btnRemove.setText("");
+        this.btnChooser.setEnabled(true);
+        this.btnChooser.setIcon(this.getIcon("picker-script"));
+        this.btnChooser.setText("");
+        this.btnChooser.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                doChooseScript();
+            }
+        });
+        this.btnRemove.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                doRemoveScript();
+            }
+        });
+
+        this.list.addSelectionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                doSelectionChanged();
+            }
+        });
+        this.list.addKeyListener(new KeyListener() {
+            @Override
+            public void keyTyped(KeyEvent e) {
+                if( (e.getModifiers() & KeyEvent.CTRL_MASK) == KeyEvent.CTRL_MASK) {
+                    doMoveCurrentScript(e.getKeyCode());
+                }
+            }
+
+            @Override
+            public void keyPressed(KeyEvent e) {
+                if( (e.getModifiers() & KeyEvent.CTRL_MASK) == KeyEvent.CTRL_MASK) {
+                    doMoveCurrentScript(e.getKeyCode());
+                }
+            }
+
+            @Override
+            public void keyReleased(KeyEvent e) {
+            }
+        });
+    }
+
+    private void doMoveCurrentScript(int keyCode) {
+        int n = this.list.getSelectedIndex();
+        if( n<0 ) {
+            return;
+        }
+        if( keyCode ==KeyEvent.VK_UP) {
+            if( n<1 ) {
+                return;
+            }
+            Script sc = this.scripts.get(n);
+            this.scripts.remove(n);
+            this.scripts.add(n-1, sc);
+            this.list.setSelectedIndex(n-1);
+            this.rebuildList();
+            return;
+        }
+        if( keyCode ==KeyEvent.VK_DOWN) {
+            if( n>=this.scripts.size()-1 ) {
+                return;
+            }
+            Script sc = this.scripts.get(n);
+            this.scripts.remove(n);
+            this.scripts.add(n+1, sc);
+            this.list.setSelectedIndex(n+1);
+            this.rebuildList();
+        }
+        
+    }
+    
+    private void doSelectionChanged() {
+        if (this.list.getSelectedIndex() >= 0) {
+            this.btnRemove.setEnabled(true);
+        } else {
+            this.btnRemove.setEnabled(false);
+        }
+    }
+
+    private void doChooseScript() {
+        ScriptingUIManager manager = ScriptingSwingLocator.getUIManager();
+        ScriptSwingManager.ScriptChooserPanel chooser = manager.createScriptChooserPanel();
+        chooser.showDialog();
+        if (chooser.getAction() == WindowManager_v2.BUTTON_OK) {
+            Script theScript = chooser.getScript();
+            if (theScript != null) {
+                this.add(theScript);
+                this.fireChangeEvent();
+            }
+        }
+    }
+
+    private void doRemoveScript() {
+        int index = this.list.getSelectedIndex();
+        if (index < 0) {
+            return;
+        }
+        this.scripts.remove(index);
+        rebuildList();
+    }
+
+    private void add(Script script) {
+        this.scripts.add(script);
+        this.rebuildList();
+    }
+
+    @Override
+    public List<Script> get() {
+        return this.scripts;
+    }
+
+    @Override
+    public void set(List<Script> value) {
+        this.scripts = value;
+        this.rebuildList();
+    }
+
+    @Override
+    public void coerceAndSet(Object value) {
+        if (value instanceof List) {
+            this.set((List<Script>) value);
+            return;
+        }
+        String s = "null";
+        if (value != null) {
+            s = value.getClass().getName();
+        }
+        throw new IllegalArgumentException("Can't coerce '" + s + "' to List of scripts.");
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        this.btnChooser.setEnabled(enabled?this.isEditable():false);
+        this.list.setEnabled(enabled);
+        if (enabled) {
+            if (this.list.getSelectedIndex() >= 0) {
+                this.btnRemove.setEnabled(this.isEditable());
+            } else {
+                this.btnRemove.setEnabled(false);
+            }
+        } else {
+            this.btnRemove.setEnabled(false);
+        }
+    }
+
+    @Override
+    public void setEditable(boolean editable) {
+        super.setEditable(editable); 
+        this.btnChooser.setEnabled(editable);
+        this.btnRemove.setEnabled(editable);
+    }
+    
+    @Override
+    public boolean isEnabled() {
+        return this.btnChooser.isEnabled();
+    }
+
+    private void rebuildList() {
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                int n = list.getSelectedIndex();
+                list.clearElements();
+                if (scripts != null) {
+                    String label;
+                    for (Script script : scripts) {
+                        if (script instanceof ScriptingUnit) {
+                            label = ((ScriptingUnit) script).getUserPath();
+                        } else {
+                            label = script.getName();
+                        }
+                        list.addElement(new ListElement(label, script));
+                    }
+                }
+                if( n>=0 && n<scripts.size() ) {
+                    btnRemove.setEnabled(true);
+                    list.setSelectedIndex(n);
+                } else {
+                    btnRemove.setEnabled(false);
+                }
+            }
+        });
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/ScriptPickerController.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/ScriptPickerController.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/ScriptPickerController.java	(revision 1126)
@@ -0,0 +1,127 @@
+package org.gvsig.scripting.swing.impl.tools;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import javax.swing.JButton;
+import javax.swing.JTextField;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.tools.script.Script;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.ToolsSwingManager;
+import org.gvsig.tools.swing.api.pickercontroller.AbstractPickerController;
+import org.gvsig.tools.swing.api.script.ScriptSwingManager.ScriptChooserPanel;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public class ScriptPickerController extends AbstractPickerController<Script> {
+    private Script script;
+    private final JTextField txtText;
+    private final JButton btnChooser;
+    
+    public ScriptPickerController(JTextField text, JButton chooser) {
+        this.txtText = text;
+        this.btnChooser = chooser;
+        
+        this.txtText.setEditable(false);
+        this.btnChooser.setEnabled(true);
+        this.btnChooser.setIcon(this.getIcon("picker-script"));
+        this.btnChooser.setText("");
+        this.btnChooser.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                doChooseScript();
+            }
+        });
+        this.txtText.addKeyListener(new KeyAdapter() {
+            @Override
+            public void keyPressed(KeyEvent e) {
+                if( e.getKeyChar()==' ' || e.getKeyChar()==127 ) {
+                    doClearScriptSelection();
+                }
+            }
+        });
+        ToolsSwingManager manager = ToolsSwingLocator.getToolsSwingManager();
+        manager.addClearButton(this.txtText, new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                doClearScriptSelection();
+            }
+        });
+        manager.setDefaultPopupMenu(this.txtText, "Script");
+    }
+    
+    private void doClearScriptSelection() {
+        this.set(null);
+        this.fireChangeEvent();
+    }
+    
+    private void doChooseScript() {
+        ScriptingUIManager manager = ScriptingSwingLocator.getUIManager();
+        ScriptChooserPanel chooser = manager.createScriptChooserPanel();
+        chooser.showDialog();
+        if( chooser.getAction()==WindowManager_v2.BUTTON_OK ) {
+            Script theScript = chooser.getScript();
+            if( theScript!=null ) {
+                this.set(theScript);
+                this.fireChangeEvent();
+            }
+        }
+    }
+    
+    @Override
+    public Script get() {
+        return this.script;
+    }
+
+    @Override
+    public void set(Script value) {
+        this.script = value;
+        if( value == null ) {
+            this.txtText.setText("");
+        } else {
+            if( this.script instanceof ScriptingUnit ) {
+                this.txtText.setText(((ScriptingUnit)script).getUserPath());
+            } else {
+                this.txtText.setText(script.getName());
+            }
+        }
+    }
+
+    @Override
+    public void coerceAndSet(Object value) {
+        if( value instanceof Script ) {
+            this.set((Script) value);
+            return;
+        }
+        String s = "null";
+        if( value != null ) {
+            s = value.getClass().getName();
+        }
+        throw new IllegalArgumentException("Can't coerce '"+s+"' to Script.");
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        this.btnChooser.setEnabled(enabled);
+        this.txtText.setEnabled(enabled);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return this.btnChooser.isEnabled();
+    }
+
+    @Override
+    public void setEditable(boolean editable) {
+        super.setEditable(editable); 
+        this.btnChooser.setEnabled(editable);
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/DefaultScriptChooserPanel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/DefaultScriptChooserPanel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/tools/DefaultScriptChooserPanel.java	(revision 1126)
@@ -0,0 +1,106 @@
+package org.gvsig.scripting.swing.impl.tools;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JScriptingBrowser;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.impl.DefaultJScriptingBrowser;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.script.Script;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.script.ScriptSwingManager.ScriptChooserPanel;
+import org.gvsig.tools.swing.api.windowmanager.Dialog;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public class DefaultScriptChooserPanel 
+        extends JPanel
+        implements ScriptChooserPanel 
+    {
+
+    private final ScriptingUIManager uimanager;
+    private JTabbedPane pestana;
+    private int action;
+
+    public DefaultScriptChooserPanel(ScriptingUIManager uimanager) {
+        this.uimanager = uimanager;
+        this.action = WindowManager_v2.BUTTON_CANCEL;
+    }
+    
+    private void initComponents() {
+        if( this.pestana != null ) {
+            return;
+        }
+        ScriptingManager manager = uimanager.getManager();
+
+        List<ScriptingFolder> folders = new ArrayList<>();
+        folders.add(manager.getUserFolder());
+        folders.addAll(manager.getAlternativeUserFolders());
+        folders.add(manager.getSystemFolder());
+        this.pestana = new JTabbedPane();
+        for (ScriptingFolder folder : folders) {
+            DefaultJScriptingBrowser browser = new DefaultJScriptingBrowser(uimanager, folder);
+            pestana.addTab(uimanager.getTranslation(folder.getName()), browser);
+        }
+        this.setLayout(new BorderLayout());
+        this.add(pestana, BorderLayout.CENTER);
+        this.setPreferredSize(new Dimension(260, 300));
+    }
+    
+    @Override
+    public int showDialog() {
+        I18nManager i18n = ToolsLocator.getI18nManager();
+        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
+        Dialog dialog = winManager.createDialog(
+                this.asJComponent(),
+                i18n.getTranslation("_Select_a_script"),
+                null, 
+                WindowManager_v2.BUTTONS_OK_CANCEL
+        );
+        dialog.show(WindowManager.MODE.DIALOG);
+        this.action = dialog.getAction();
+        return this.action;      
+    }
+
+    @Override
+    public Script getScript() {
+        if( this.action != WindowManager_v2.BUTTON_OK ) {
+            return null;
+        }
+        JScriptingBrowser browser = (JScriptingBrowser) this.pestana.getSelectedComponent();
+        if( browser == null ) {
+            return null;
+        }
+        ScriptingUnit x = browser.getSelectedNode();
+        if( x instanceof Script ) {
+            return (Script) x;
+        }
+        return null;
+    }
+
+    @Override
+    public int getAction() {
+        return this.action;
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        this.initComponents();
+        return this;
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingLauncher.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingLauncher.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingLauncher.java	(revision 1126)
@@ -0,0 +1,123 @@
+package org.gvsig.scripting.swing.impl;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+import javax.swing.JTabbedPane;
+import org.gvsig.scripting.ScriptingBaseScript;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingRunningException;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JScriptingBrowser;
+import org.gvsig.scripting.swing.api.JScriptingBrowser.BrowserActionEvent;
+import org.gvsig.scripting.swing.api.JScriptingLauncher;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.impl.DefaultJScriptingBrowser.DefaultBrowserActionEvent;
+import org.gvsig.tools.swing.api.ActionListenerSupport;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.util.CancelledException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultJScriptingLauncher extends JPanel implements JScriptingLauncher, ActionListener {
+
+    private static final Logger LOG = LoggerFactory.getLogger(DefaultJScriptingLauncher.class);
+
+    private static final long serialVersionUID = -2612734398104678920L;
+
+    
+    protected ActionListenerSupport defaultActionlisteners = null;
+    JTabbedPane pestana;
+    ScriptingUIManager uimanager;
+    ScriptingManager manager;
+
+    public DefaultJScriptingLauncher(ScriptingUIManager uimanager) {
+        this.uimanager = uimanager;
+        this.manager = uimanager.getManager();
+
+        this.defaultActionlisteners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
+        List<ScriptingFolder> folders = new ArrayList<>();
+        folders.add(manager.getUserFolder());
+        folders.addAll(manager.getAlternativeUserFolders());
+        folders.add(manager.getSystemFolder());
+        pestana = new JTabbedPane();
+        for (ScriptingFolder folder : folders) {
+            DefaultJScriptingBrowser browser = new DefaultJScriptingBrowser(uimanager, folder);
+            browser.addActionListener(this);
+            pestana.addTab(uimanager.getTranslation(folder.getName()), browser);
+        }
+        this.setLayout(new BorderLayout());
+        this.add(pestana, BorderLayout.CENTER);
+        this.setPreferredSize(new Dimension(260, 300));
+    }
+
+
+    @Override
+    public JScriptingBrowser getSelectedBrowser() {
+        return (JScriptingBrowser) this.pestana.getSelectedComponent();
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+    @Override
+    public void refresh() {
+        for (int i = 0; i < pestana.getTabCount(); i++) {
+            DefaultJScriptingBrowser browser = (DefaultJScriptingBrowser) (pestana.getComponentAt(i));
+            browser.refresh();
+        }
+        pestana.repaint();
+    }
+
+    @Override
+    public void addDefaultActionListener(ActionListener actionlistener) {
+        this.defaultActionlisteners.addActionListener(actionlistener);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        try {
+            BrowserActionEvent e2 = (BrowserActionEvent) e;
+            switch (e.getID()) {
+                case DefaultJScriptingBrowser.DEFAULT_ACTION:
+                    if( this.defaultActionlisteners.hasActionListeners() ) {
+                        this.defaultActionlisteners.fireActionEvent(
+                            new DefaultBrowserActionEvent(this, DEFAULT_ACTION, "default", e2.getUnit())
+                        );
+                    } else {
+                        ScriptingUnit unit = e2.getUnit();
+                        if( unit instanceof ScriptingBaseScript ) {
+                            ScriptingBaseScript script = (ScriptingBaseScript) unit;
+                            try {
+                                script.compile();
+                                script.runAsTask(null);
+                            } catch (ScriptingRunningException ex) {
+                                LOG.warn("Problems launching script '" + script.getName() + "'", ex);
+                            }
+                        }
+                    }
+                    break;
+                case DefaultJScriptingBrowser.DROPDOWN_ACTION:
+                case DefaultJScriptingBrowser.SELECTION_ACTION:
+                    this.defaultActionlisteners.fireActionEvent(
+                            new DefaultBrowserActionEvent(this, e.getID(), "default", e2.getUnit())
+                    );
+                    break;
+            }
+        } catch( CancelledException ex) {
+            // Do norhing
+        } catch(Throwable th) {
+            LOG.warn("",th);
+        }
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingConsole.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingConsole.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingConsole.java	(revision 1126)
@@ -0,0 +1,139 @@
+package org.gvsig.scripting.swing.impl;
+
+import org.gvsig.scripting.swing.api.JScriptingConsole;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Font;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.Writer;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextPane;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.StyleContext;
+import org.apache.commons.io.output.WriterOutputStream;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.ToolsSwingManager;
+
+public class DefaultJScriptingConsole extends JPanel implements JScriptingConsole {
+
+    private static final long serialVersionUID = -2060450772889689371L;
+
+    private static class OutputWriter extends Writer {
+
+        private final Color color;
+        private final JTextPane textPanel;
+
+        public OutputWriter(JTextPane textPanel, Color color) {
+            this.color = color;
+            this.textPanel = textPanel;
+        }
+
+        public void append(String msg) {
+            append(msg,color);
+        }
+        
+        public void append(String msg, Color color) {
+            StyleContext sc = StyleContext.getDefaultStyleContext();
+            AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, color);
+
+            int len = textPanel.getDocument().getLength();
+            textPanel.setCaretPosition(len);
+            textPanel.setCharacterAttributes(aset, false);
+            textPanel.replaceSelection(msg);
+        }
+
+        @Override
+        public void write(char[] cbuf, int off, int len) throws IOException {
+            String s = new String(cbuf, off, len);
+            append(s);
+        }
+
+        @Override
+        public void flush() throws IOException {
+        }
+
+        @Override
+        public void close() throws IOException {
+        }
+
+    }
+
+    private JTextPane console;
+    private final OutputWriter output;
+    private final OutputWriter errors;
+    private PrintStream outputStream = null;
+    private PrintStream errorsStream = null;
+
+    public DefaultJScriptingConsole(boolean captureOutput) {
+        
+        this.initComponents();
+        this.output = new OutputWriter(console, Color.BLACK);
+        this.errors = new OutputWriter(console, Color.RED.darker());
+        
+    }
+
+    private void initComponents() {
+        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
+        this.setLayout(new BorderLayout());
+        console = new JTextPane();
+        toolsSwingManager.setDefaultPopupMenu(console);
+        console.setFont(new Font("monospaced", Font.PLAIN, 13));
+        JScrollPane scrollConsole = new JScrollPane(console);
+        this.add(scrollConsole, BorderLayout.CENTER);
+    }
+
+    @Override
+    public void clear() {
+        this.console.setText("");
+    }
+
+    @Override
+    public void append(String s) {
+        this.output.append(s);
+    }
+
+    @Override
+    public void append(String msg, Color color) {
+        this.output.append(msg, color);
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+    @Override
+    public Writer getOutputWriter() {
+        return this.output;
+    }
+    
+    @Override
+    public Writer getErrorsWriter() {
+        return this.errors;
+    }    
+
+    @Override
+    public PrintStream output() {
+        if( this.outputStream == null ) {
+            WriterOutputStream xx = new WriterOutputStream(output);
+            this.outputStream = new PrintStream(xx);
+        }
+        return this.outputStream;
+    }
+
+    @Override
+    public PrintStream errors() {
+        if( this.errorsStream == null ) {
+            WriterOutputStream xx = new WriterOutputStream(errors);
+            this.errorsStream = new PrintStream(xx);
+        }
+        return this.errorsStream;
+    }    
+}
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/JDialogContent.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/JDialogContent.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/JDialogContent.java	(revision 1126)
@@ -0,0 +1,143 @@
+package org.gvsig.scripting.swing.impl;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+
+
+public class JDialogContent extends JPanel implements ComponentListener{
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	protected JPanel PanelDialog = null;
+	static JLabel status;
+	protected ScriptingUIManager uimanager;
+	protected JButton accept = null;
+	private String title;
+
+	public JDialogContent(ScriptingUIManager uimanager, String icon, String title, String description, final DialogPanel content){
+		this.uimanager = uimanager;
+		this.setLayout(new BorderLayout());
+		
+		this.title = title;
+
+		// Cabecera
+        JLabel titleLabel = new JLabel(title);
+		titleLabel.setFont(new Font("Serif",Font.BOLD,15));
+		
+		JLabel descriptionLabel = new JLabel(description);
+		descriptionLabel.setFont(new Font("Serif",Font.PLAIN,12));
+		
+		JPanel titlePane = new JPanel(new BorderLayout());
+		titlePane.add(titleLabel, BorderLayout.CENTER);
+		titlePane.add(descriptionLabel, BorderLayout.SOUTH);
+		titlePane.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 120));
+		
+        JLabel picture = new JLabel(uimanager.getIcon(icon,"big"));
+        picture.setPreferredSize(new Dimension(50,50));
+       
+        JPanel header = new JPanel(new BorderLayout());
+		header.add(picture, BorderLayout.EAST);
+		header.add(titlePane, BorderLayout.CENTER);
+		header.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 10));
+
+		
+		// Contenedor central
+		JPanel contentPane = new JPanel(new BorderLayout());
+		contentPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
+		content.getJComponent().setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, new Color(220,220,220)));
+		contentPane.add(content.getJComponent(), BorderLayout.CENTER);
+		
+		JPanel buttons = new JPanel(new BorderLayout());
+		
+		JPanel optionsPane = new JPanel();
+		optionsPane.setLayout(new BoxLayout(optionsPane, BoxLayout.LINE_AXIS));
+		optionsPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+		optionsPane.add(Box.createHorizontalGlue());
+	
+		content.getJComponent().addComponentListener(this);
+		
+		if(content.isVisibleAccept()){
+			accept = new JButton(this.uimanager.getTranslation("Accept"));
+			accept.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent arg0) {
+					content.actionAccept();
+				}
+			});
+			
+			optionsPane.add(accept);
+			optionsPane.add(Box.createRigidArea(new Dimension(10, 0)));
+		}
+		
+		if(content.isVisibleCancel()){
+			JButton cancel = new JButton(this.uimanager.getTranslation("Cancel"));
+			cancel.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent arg0) {
+					 content.actionCancel();
+				}
+			});
+			
+			optionsPane.add(cancel);
+			optionsPane.add(Box.createRigidArea(new Dimension(10, 0)));
+		}
+		
+		if( content.isVisibleApply()){
+			JButton apply = new JButton(this.uimanager.getTranslation("Apply"));
+			apply.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent arg0) {
+					content.actionApply();
+				}
+			});
+			
+			optionsPane.add(apply);
+		}
+        
+		buttons.add(optionsPane, BorderLayout.EAST);
+		
+		
+		// Integramos en el frame
+		this.add(header, BorderLayout.NORTH);
+		this.add(contentPane, BorderLayout.CENTER);
+		this.add(buttons, BorderLayout.SOUTH);
+		
+		
+		//this.uimanager.showDialog(this, title);		
+	}
+
+	public void showDialog(){
+		this.uimanager.showDialog(this, title);	
+	}
+
+	public void componentHidden(ComponentEvent arg0) {
+		this.setVisible(false);
+		
+	}
+
+	public void componentMoved(ComponentEvent arg0) {
+		
+	}
+
+	public void componentResized(ComponentEvent arg0) {
+		
+	}
+
+	public void componentShown(ComponentEvent arg0) {
+		
+	}
+
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingBrowser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingBrowser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJScriptingBrowser.java	(revision 1126)
@@ -0,0 +1,477 @@
+package org.gvsig.scripting.swing.impl;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import javax.swing.AbstractAction;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTree;
+import javax.swing.KeyStroke;
+import javax.swing.UIManager;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.TreeCellRenderer;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JScriptingBrowser;
+import static org.gvsig.scripting.swing.api.JScriptingBrowser.DEFAULT_ACTION;
+import static org.gvsig.scripting.swing.api.JScriptingBrowser.SELECTION_ACTION;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.tools.swing.api.ActionListenerSupport;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+
+public class DefaultJScriptingBrowser extends JPanel implements JScriptingBrowser {
+
+    private static final Logger logger = LoggerFactory.getLogger(DefaultJScriptingBrowser.class);
+    private static final long serialVersionUID = 3140698910497806258L;
+
+    protected ScriptingUIManager uimanager;
+    protected ScriptingManager manager;
+    protected TreeModel treeModel;
+    protected JTree tree;
+    protected ScriptingFolder root;
+    protected ActionListenerSupport actionlisteners = null;
+    private final boolean foldersOnly;
+
+    public static class DefaultBrowserActionEvent extends ActionEvent implements BrowserActionEvent {
+
+        /**
+         *
+         */
+        private static final long serialVersionUID = -1474410768278633364L;
+        private ScriptingUnit unit = null;
+
+        public DefaultBrowserActionEvent(Object source, int id, String command,
+                ScriptingUnit unit) {
+            super(source, id, command);
+            this.unit = unit;
+        }
+
+        @Override
+        public ScriptingUnit getUnit() {
+            return this.unit;
+        }
+    }
+
+    class ScriptingFolderTreeModel implements TreeModel {
+
+        protected final ScriptingFolder root;
+
+        protected final List<TreeModelListener> listeners = new ArrayList();
+
+        public ScriptingFolderTreeModel(ScriptingFolder root) {
+            this.root = root;
+        }
+
+        @Override
+        public Object getRoot() {
+            return root;
+        }
+
+        @Override
+        public Object getChild(Object parent, int index) {
+            ScriptingFolder folder = (ScriptingFolder) parent;
+            List<ScriptingUnit> children = folder.getUnits();
+            return children.get(index);
+        }
+
+        @Override
+        public int getChildCount(Object parent) {
+            if (!(parent instanceof ScriptingFolder)) {
+                return 0;
+            }
+            ScriptingFolder folder = (ScriptingFolder) parent;
+            return folder.getUnits().size();
+        }
+
+        @Override
+        public boolean isLeaf(Object node) {
+            return !(node instanceof ScriptingFolder);
+        }
+
+        @Override
+        public int getIndexOfChild(Object parent, Object child) {
+            String childPath = ((ScriptingUnit) child).getFile().getAbsolutePath();
+            ScriptingFolder folder = (ScriptingFolder) parent;
+            List<ScriptingUnit> children = folder.getUnits();
+            for (int i = 0; i < children.size(); i++) {
+                ScriptingUnit aChild = children.get(i);
+                if (aChild.getFile().getAbsolutePath().equals(childPath)) {
+                    return i;
+                }
+            }
+            return -1;
+        }
+
+        @Override
+        public void valueForPathChanged(TreePath path, Object value) {
+        }
+
+        @Override
+        public void addTreeModelListener(TreeModelListener listener) {
+            listeners.add(listener);
+        }
+
+        @Override
+        public void removeTreeModelListener(TreeModelListener listener) {
+            listeners.remove(listener);
+        }
+
+        public void reload() {
+            TreeModelEvent event = new TreeModelEvent(this, new TreePath(this.root));
+            Iterator<TreeModelListener> iterator = listeners.iterator();
+            TreeModelListener listener;
+            while (iterator.hasNext()) {
+                listener = iterator.next();
+                listener.treeStructureChanged(event);
+            }
+        }
+    }
+
+    class ScriptingFolderTreeModelFoldersOnly extends ScriptingFolderTreeModel {
+
+        public ScriptingFolderTreeModelFoldersOnly(ScriptingFolder root) {
+            super(root);
+        }
+
+        @Override
+        public Object getChild(Object parent, int index) {
+            ScriptingFolder folder = (ScriptingFolder) parent;
+            List<ScriptingFolder> children = folder.getUnitFolders();
+            return children.get(index);
+        }
+
+        @Override
+        public int getChildCount(Object parent) {
+            if (!(parent instanceof ScriptingFolder)) {
+                return 0;
+            }
+            ScriptingFolder folder = (ScriptingFolder) parent;
+            return folder.getUnitFolders().size();
+        }
+
+        @Override
+        public int getIndexOfChild(Object parent, Object child) {
+            String childPath = ((ScriptingFolder) child).getFile().getAbsolutePath();
+            ScriptingFolder folder = (ScriptingFolder) parent;
+            List<ScriptingFolder> children = folder.getUnitFolders();
+            for (int i = 0; i < children.size(); i++) {
+                ScriptingUnit aChild = children.get(i);
+                if (aChild.getFile().getAbsolutePath().equals(childPath)) {
+                    return i;
+                }
+            }
+            return -1;
+        }
+
+    }
+
+    public DefaultJScriptingBrowser(ScriptingUIManager uimanager,
+            ScriptingFolder root) {
+        this(uimanager, root, false);
+    }
+
+    public DefaultJScriptingBrowser(ScriptingUIManager uimanager,
+            ScriptingFolder root, boolean foldersOnly) {
+        super(new GridLayout(1, 2));
+        this.actionlisteners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
+        this.foldersOnly = foldersOnly;
+        this.uimanager = uimanager;
+        this.manager = uimanager.getManager();
+        this.root = root;
+        this.makeUI();
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+    public void refresh() {
+        Enumeration<TreePath> x = tree.getExpandedDescendants(new TreePath(treeModel.getRoot()));
+        ((ScriptingFolderTreeModel) this.treeModel).reload();
+        if (x != null) {
+            while (x.hasMoreElements()) {
+                try {
+                    TreePath treePath = (TreePath) x.nextElement();
+                    tree.expandPath(treePath);
+                } catch(Throwable th) {
+                    
+                }
+            }
+        }        
+    }
+
+    
+    @Override
+    public ScriptingManager getManager() {
+        return this.manager;
+    }
+
+    @Override
+    public ScriptingFolder getRoot() {
+        return this.root;
+    }
+
+    @Override
+    public void addActionListener(ActionListener actionlistener) {
+        this.actionlisteners.addActionListener(actionlistener);
+    }
+
+    private void makeUI() {
+        if (this.foldersOnly) {
+            treeModel = new ScriptingFolderTreeModelFoldersOnly(root);
+        } else {
+            treeModel = new ScriptingFolderTreeModel(root);
+        }
+
+        tree = new JTree(treeModel);
+        tree.setCellRenderer(new IconCellRenderer());
+        tree.setEditable(false);
+        tree.setShowsRootHandles(true);
+        tree.getSelectionModel().setSelectionMode(
+                TreeSelectionModel.SINGLE_TREE_SELECTION);
+
+        tree.addTreeSelectionListener(new TreeSelectionListener() {
+            @Override
+            public void valueChanged(TreeSelectionEvent e) {
+                JTree tree = (JTree) e.getSource();
+                if (!tree.isSelectionEmpty()) {
+                    fireSelectAction(tree.getSelectionPath());
+                }
+            }
+        });
+        tree.addMouseListener(new MouseListener() {
+            @Override
+            public void mouseClicked(MouseEvent arg0) {
+                if (arg0.getClickCount() == 2) {
+                    JTree tree = (JTree) arg0.getSource();
+                    if (!tree.isSelectionEmpty()) {
+                        fireDefaultAction(tree.getSelectionPath());
+                    }
+                }
+            }
+
+            @Override
+            public void mouseEntered(MouseEvent arg0) {
+            }
+
+            @Override
+            public void mouseExited(MouseEvent arg0) {
+            }
+
+            @Override
+            public void mousePressed(MouseEvent arg0) {
+            }
+
+            @Override
+            public void mouseReleased(MouseEvent arg0) {
+            }
+        });
+        tree.getActionMap().put(
+                KeyStroke.getKeyStroke("+"),
+                new ExpandSelectedNodeAction()
+        );
+        tree.getActionMap().put(
+                KeyStroke.getKeyStroke("SPACE"),
+                new ExpandSelectedNodeAction()
+        );
+        tree.getActionMap().put(
+                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
+                new EnterAction()
+        );
+        
+        JScrollPane scrollPane = new JScrollPane(tree);
+        add(scrollPane);
+    }
+
+    @Override
+    public TreePath getSelectionPath() {
+        return this.tree.getSelectionPath();
+    }
+    
+    @Override
+    public void setSelectionPath(TreePath path) {
+        if( path == null ) {
+            this.tree.clearSelection();
+        } else {
+            this.tree.setSelectionPath(path);
+        }
+    }
+    
+    @Override
+    public ScriptingUnit getSelectedNode() {
+        ScriptingUnit unit;
+        if (tree.getSelectionPath() != null) {
+            unit = (ScriptingUnit) tree.getSelectionPath().getLastPathComponent();
+        } else {
+            unit = (ScriptingUnit) this.treeModel.getRoot();
+        }
+        return unit;
+    }
+
+    private void fireDefaultAction(TreePath path) {
+        ScriptingUnit unit = (ScriptingUnit) path.getLastPathComponent();
+        unit.reload();
+        ActionEvent ae = new DefaultBrowserActionEvent(
+                this,
+                DEFAULT_ACTION,
+                "default",
+                unit
+        );
+        this.actionlisteners.fireActionEvent(ae);
+    }
+
+    private void fireSelectAction(TreePath path) {
+        ScriptingUnit unit = (ScriptingUnit) path.getLastPathComponent();
+        ActionEvent ae = new DefaultJScriptingBrowser.DefaultBrowserActionEvent(
+                this,
+                SELECTION_ACTION,
+                "select",
+                unit
+        );
+        this.actionlisteners.fireActionEvent(ae);
+    }
+
+    private class EnterAction extends AbstractAction {
+        private static final long serialVersionUID = -3673546098243190397L;
+
+        @Override
+        public void actionPerformed(ActionEvent ae) {
+            TreePath selected = tree.getSelectionPath();
+            fireDefaultAction(selected);
+        }
+        
+    }
+
+    private class ExpandSelectedNodeAction extends AbstractAction {
+        private static final long serialVersionUID = -4121272513454221967L;
+
+        @Override
+        public void actionPerformed(ActionEvent ae) {
+            try {
+                TreePath selected = tree.getSelectionPath();
+                if( tree.isCollapsed(selected) ) {
+                    tree.expandPath(selected);
+                } else {
+                    tree.collapsePath(selected);
+                }
+            } catch(Throwable th) {
+                // Do nothing, ignore errors
+            }
+        }
+        
+    }
+    
+    private class IconCellRenderer extends JLabel implements TreeCellRenderer {
+
+        /**
+         *
+         */
+        private static final long serialVersionUID = 1L;
+        protected Color m_textSelectionColor;
+        protected Color m_textNonSelectionColor;
+        protected Color m_bkSelectionColor;
+        protected Color m_bkNonSelectionColor;
+        protected Color m_borderSelectionColor;
+
+        protected boolean m_selected;
+
+        public IconCellRenderer() {
+            super();
+            m_textSelectionColor = UIManager
+                    .getColor("Tree.selectionForeground");
+            m_textNonSelectionColor = UIManager.getColor("Tree.textForeground");
+            m_bkSelectionColor = UIManager.getColor("Tree.selectionBackground");
+            m_bkNonSelectionColor = UIManager.getColor("Tree.textBackground");
+            m_borderSelectionColor = UIManager
+                    .getColor("Tree.selectionBorderColor");
+            setOpaque(false);
+        }
+
+        private final Map<String, ImageIcon> icons = new HashMap<>();
+
+        private ImageIcon getIcon(String iconName) {
+            ImageIcon img = this.icons.get(iconName);
+            if (img == null) {
+                img = uimanager.getIcon(iconName);
+                this.icons.put(iconName, img);
+            }
+            return img;
+        }
+
+        private ImageIcon getExpandedIcon(ScriptingUnit unit) {
+            return getIcon(unit.getIconNames()[1]);
+        }
+
+        private ImageIcon getCollapsedIcon(ScriptingUnit unit) {
+            return getIcon(unit.getIconNames()[0]);
+        }
+
+        @Override
+        public Component getTreeCellRendererComponent(JTree tree, Object value,
+                boolean sel, boolean expanded, boolean leaf, int row,
+                boolean hasFocus) {
+            ScriptingUnit unit = (ScriptingUnit) value;
+            setText(unit.getName());
+            if (expanded) {
+                setIcon(this.getExpandedIcon(unit));
+            } else {
+                setIcon(this.getCollapsedIcon(unit));
+            }
+
+            setFont(tree.getFont());
+            setForeground(sel ? m_textSelectionColor : m_textNonSelectionColor);
+            setBackground(sel ? m_bkSelectionColor : m_bkNonSelectionColor);
+            m_selected = sel;
+            return this;
+        }
+
+        @Override
+        public void paintComponent(Graphics g) {
+            Color bColor = getBackground();
+            Icon icon = getIcon();
+
+            g.setColor(bColor);
+            int offset = 0;
+            if (icon != null && getText() != null) {
+                offset = (icon.getIconWidth() + getIconTextGap());
+            }
+            g.fillRect(offset, 0, getWidth() - 1 - offset, getHeight() - 1);
+
+            if (m_selected) {
+                g.setColor(m_borderSelectionColor);
+                g.drawRect(offset, 0, getWidth() - 1 - offset, getHeight() - 1);
+            }
+            super.paintComponent(g);
+        }
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJThinlet.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJThinlet.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJThinlet.java	(revision 1126)
@@ -0,0 +1,145 @@
+package org.gvsig.scripting.swing.impl;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringBufferInputStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+
+import org.gvsig.scripting.swing.api.JThinlet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import thinlet.Thinlet;
+
+public class DefaultJThinlet extends JThinlet implements AncestorListener{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 5130602761126860652L;
+	
+	private static final Logger logger = LoggerFactory.getLogger(DefaultJThinlet.class);
+	
+	static final Pattern pattern = Pattern.compile(" action=\\s*\"([^\"]*)\"");
+
+	protected Thinlet thinlet;
+	protected ActionListener actionlistener = null;
+
+	public DefaultJThinlet(){
+		super();
+		this.setLayout(new BorderLayout());
+		this.addAncestorListener(this);
+		this.thinlet = null;		
+	}
+	
+	public DefaultJThinlet(File file){
+		this();
+		if (file!=null){
+			this.load(file);
+		}
+	}
+
+    static String readFileAsString(File file) throws java.io.IOException{
+        StringBuffer fileData = new StringBuffer(1000);
+        BufferedReader reader = new BufferedReader(
+                new FileReader(file));
+        char[] buf = new char[1024];
+        int numRead=0;
+        while((numRead=reader.read(buf)) != -1){
+            String readData = String.valueOf(buf, 0, numRead);
+            fileData.append(readData);
+            buf = new char[1024];
+        }
+        reader.close();
+        return fileData.toString();
+    }
+
+    class ThinletWrapper extends Thinlet {
+		public void setVisible(boolean b) {
+    		super.setVisible(b);
+    		if( !b ) { 
+    			hideThinlet();
+    		}
+    	}
+    }
+	
+	public void load(File file){
+		String xml = null;
+		InputStream input=null;
+		Object component=null;
+		// Creamos el thinlet
+		Thinlet thinlet = new ThinletWrapper();
+
+		try {
+			xml = readFileAsString(file);
+		} catch (IOException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+		
+		Matcher match = pattern.matcher(xml);
+		xml = match.replaceAll(" action=\"invoke('$1')\"");
+		input = new StringBufferInputStream(xml);
+
+		try {
+			// parseamos el xml, creamos los componentes y los devolvemos.
+			component = thinlet.parse(input,this);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		// Cargamos los componentes en el thinlet
+		if (component != null)
+			thinlet.add(component);
+		// A�adimos el thinlet al JPanel.
+		this.add(thinlet, BorderLayout.CENTER);
+		this.thinlet = thinlet;
+	}
+	
+	private void hideThinlet() {
+		this.setVisible(false);
+	}
+
+	public void invoke(String name){
+		//System.out.println("JThinlet.invoke: name="+name.toString());
+		if (this.actionlistener != null){
+			ActionEvent event = new ActionEvent(this, 1, (String)name);
+			this.actionlistener.actionPerformed(event);
+		}
+	}
+	
+	public Thinlet getThinlet(){
+		return this.thinlet;
+	}
+
+	public Dimension getPreferredSize(){ 
+		return this.getThinlet().getPreferredSize();
+	}
+
+	public void ancestorAdded(AncestorEvent event) {
+		if (this.getThinlet() == null)
+			this.getThinlet().repaint();
+	}
+
+	public void ancestorMoved(AncestorEvent event) {
+		if (this.getThinlet() == null)
+			this.getThinlet().repaint();
+	}
+
+	public void ancestorRemoved(AncestorEvent event) {
+	}
+
+	public void addActionListener(ActionListener actionlistener) {
+		this.actionlistener = actionlistener;  
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/ChangeListenerSupport.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/ChangeListenerSupport.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/ChangeListenerSupport.java	(revision 1126)
@@ -0,0 +1,44 @@
+
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.HashSet;
+import java.util.Set;
+
+
+public class ChangeListenerSupport {
+    protected Set<PropertyChangeListener> changeListeners;
+    protected boolean enabled = true;
+    
+    public void addChangeListener(PropertyChangeListener listener) {
+        if( this.changeListeners == null ) {
+            this.changeListeners = new HashSet<>();
+        }
+        this.changeListeners.add(listener);
+    }
+    
+    public void fireChange(PropertyChangeEvent evt) {
+        if( this.changeListeners == null || !enabled ) {
+            return;
+        }
+        for (PropertyChangeListener listener : this.changeListeners) {
+            listener.propertyChange(evt);
+        }
+    }
+
+    public void fireChange(String name, Object newValue) {
+        PropertyChangeEvent evt = new PropertyChangeEvent(this, name, "", newValue);
+        this.fireChange(evt);
+    }
+    
+    public boolean isEnabled() {
+        return this.enabled;
+    }
+    
+    public boolean setEnabled(boolean enabled) {
+        boolean prev = this.enabled;
+        this.enabled = enabled;
+        return prev;
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditor.java	(revision 1126)
@@ -0,0 +1,90 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeListener;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import org.gvsig.desktopopen.DesktopOpen;
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.tools.util.ToolsUtilLocator;
+
+public class ExternalFileEditor extends ExternalFileEditorView implements JEditor {
+
+    private static final long serialVersionUID = 8464025131135752977L;
+    private ScriptingExternalFile unit;
+
+    public ExternalFileEditor() {
+        this.initComponents();
+    }
+
+    public ExternalFileEditor(ScriptingUnit unit) {
+        this();
+        this.set(unit);
+    }
+
+    private void initComponents() {
+        // TODO: translations
+        this.btnOpenWithSystemEditor.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                doOpenWithSystemEditor();
+            }
+        });
+    }
+
+    private void doOpenWithSystemEditor() {
+        DesktopOpen desktop = ToolsUtilLocator.getToolsUtilManager().createDesktopOpen();
+        desktop.browse(this.unit.getExternalFile().toURI());
+    }
+    
+    @Override
+    public ScriptingUnit getUnit() {
+        return this.unit;
+    }
+
+    @Override
+    public void addChangeListener(PropertyChangeListener listener) {
+    }
+
+    @Override
+    public void save() {
+    }
+
+    @Override
+    public boolean isModified() {
+        return false;
+    }
+
+    @Override
+    public void set(ScriptingUnit unit) {
+        this.unit = (ScriptingExternalFile) unit;
+        if( this.unit == null ) {
+            this.txtMimeType.setText("");
+            this.txtName.setText("");
+        } else { 
+            this.txtMimeType.setText(this.unit.getMimeType());
+            this.txtName.setText(this.unit.getName());
+        }
+    }
+
+    @Override
+    public void fetch(ScriptingUnit unit) {
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+    public JPanel getAdditionalPanel() {
+        return this.addtionalPanel;
+    }
+    
+    public void addPanel(String name, JComponent panel) {
+        this.tabEditor.addTab(name, panel);
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/PropertiesEditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/PropertiesEditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/PropertiesEditorFactory.java	(revision 1126)
@@ -0,0 +1,35 @@
+
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.io.File;
+import org.apache.commons.io.FilenameUtils;
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.AbstractEditorFactory;
+import org.gvsig.scripting.swing.api.JEditor;
+
+
+public class PropertiesEditorFactory extends AbstractEditorFactory {
+
+    public PropertiesEditorFactory() {
+        super("PropertiesEditor","Editor for Properties file");
+    }
+    
+    @Override
+    protected JEditor doCreate(ScriptingUnit unit) {
+        return new PropertiesEditor((ScriptingExternalFile)unit);
+    }
+
+    @Override
+    public boolean canCreate(ScriptingUnit unit) {
+        if( unit instanceof ScriptingExternalFile ) {
+            File f = ((ScriptingExternalFile)unit).getExternalFile();
+            String extension = FilenameUtils.getExtension(f.getName());
+            if( "properties".equalsIgnoreCase(extension) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/TextEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/TextEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/TextEditor.java	(revision 1126)
@@ -0,0 +1,165 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.text.JTextComponent;
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.scripting.swing.api.JTextEditor;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
+import org.gvsig.scripting.swing.impl.composer.ChangeListenerSupport;
+
+public class TextEditor extends JPanel implements JTextEditor, JEditor {
+    private static final long serialVersionUID = 9189395063548155843L;
+    
+    protected ScriptingExternalFile unit;
+    protected boolean modified;
+    private JTabbedPane tabs;
+    protected BaseTextEditor textEditor;
+    protected ExternalFileEditor propertiesPanel;
+    protected final ChangeListenerSupport changeListeners;
+    private final ScriptingUIManager uimanager;
+
+    public TextEditor(final ScriptingExternalFile unit) {
+        this.changeListeners = new ChangeListenerSupport();
+        this.uimanager = ScriptingSwingLocator.getUIManager();
+        this.initComponents();
+        this.set(unit);
+    }
+
+    @Override
+    public ScriptingUnit getUnit() {
+        return this.unit;
+    }
+
+    protected void setUnit(ScriptingUnit unit) {
+        this.unit = (ScriptingExternalFile) unit;
+    }
+    
+    protected void setModified(boolean modified) {
+        this.modified = modified;
+    }
+            
+    protected BaseTextEditor getTextEditor() {
+        return this.textEditor;
+    }
+    
+    protected JTabbedPane getTabbedPane() {
+        return this.tabs;
+    }
+    
+    protected JPanel getAdditionalPropetiesPanel() {
+        return this.propertiesPanel.getAdditionalPanel();
+    }
+    
+    protected ExternalFileEditor getPropertiesPanel() {
+        return this.propertiesPanel;
+    }
+    
+    protected ChangeListenerSupport getChangeListeners() {
+        return this.changeListeners;
+    }
+    
+    private void initComponents() {
+        this.textEditor = new BaseTextEditor();
+        this.textEditor.addChangeListener(new PropertyChangeListener() {
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                modified = true;
+                changeListeners.fireChange(evt);
+            }
+        });
+
+        this.propertiesPanel = new ExternalFileEditor(this.unit);
+
+        this.tabs = new JTabbedPane();
+        this.tabs.setTabPlacement(JTabbedPane.BOTTOM);
+        this.tabs.addTab(this.uimanager.getTranslation("Contents"), this.textEditor);
+        this.tabs.addTab(this.uimanager.getTranslation("Properties"), this.propertiesPanel);
+        this.setLayout(new BorderLayout());
+        this.add(BorderLayout.CENTER, tabs);
+
+    }
+    
+    protected JTabbedPane getTabs() {
+        return this.tabs;
+    }
+
+    @Override
+    public boolean isModified() {
+        return this.modified;
+    }
+
+    @Override
+    public void save() {
+        this.fetch(unit);
+    }    
+
+    @Override
+    public void addChangeListener(PropertyChangeListener listener) {
+        this.changeListeners.addChangeListener(listener);
+    }
+    
+    @Override
+    public void set(ScriptingUnit unit) {
+        this.unit = (ScriptingExternalFile) unit;
+        this.propertiesPanel.set(unit);
+        this.textEditor.setText(this.unit.getMimeType(), this.unit.getContentsAsText());
+        if( unit.isASystemUnit() ) {
+            this.textEditor.getJTextComponent().setEditable(false);
+        } else {
+            this.textEditor.getJTextComponent().setEditable(true);            
+        }
+    }
+
+
+    @Override
+    public void fetch(ScriptingUnit unit) {
+        ((ScriptingExternalFile) unit).setContents(this.textEditor.getText());
+        this.modified = false;
+    }
+
+    
+    @Override
+    public JTextComponent getJTextComponent() {
+        return this.textEditor.getJTextComponent();
+    }
+
+    @Override
+    public SyntaxtHighlightTextComponent getSyntaxtHighlightTextComponent() {
+        return this.textEditor.getSyntaxtHighlightTextComponent();
+    }
+
+    @Override
+    public void selectLine(int line) {
+        this.textEditor.selectLine(line);
+    }
+
+    @Override
+    public int getLineCount() {
+        return this.textEditor.getLineCount();
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+    @Override
+    public void gotoline(int line) {
+        this.textEditor.gotoline(line);
+    }
+
+    @Override
+    public void addUpdateCaretPositionActionListener(ActionListener actionlistener) {
+        this.textEditor.addUpdateCaretPositionActionListener(actionlistener);
+    }    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/DialogEditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/DialogEditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/DialogEditorFactory.java	(revision 1126)
@@ -0,0 +1,34 @@
+
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import org.gvsig.scripting.ScriptingDialog;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.AbstractEditorFactory;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+
+
+public class DialogEditorFactory extends AbstractEditorFactory {
+    
+    public DialogEditorFactory() {
+        super("DialogEditor","This factory can create editors for dialogs");
+    }
+
+    @Override
+    public JEditor doCreate(ScriptingUnit unit) {
+        return ScriptingSwingLocator.getUIManager().createJDialogEditor((ScriptingDialog) unit);
+    }
+
+    @Override
+    public boolean canCreate(ScriptingUnit unit) {
+        return unit instanceof ScriptingDialog;
+    }
+
+
+    @Override
+    public int getPriority() {
+        return 100;
+    }
+        
+        
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorView.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorView.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorView.xml	(revision 1126)
@@ -0,0 +1,744 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/datos/devel/org.gvsig.scripting/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorView.xml</at>
+   <at name="rowspecs">FILL:DEFAULT:GROW(1.0)</at>
+   <at name="colspecs">FILL:DEFAULT:GROW(1.0)</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">1</at>
+           <at name="row">1</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormContainerComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTabbedPane</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTabbedPane</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="tabPlacement">3</at>
+            <at name="name">tabEditor</at>
+            <at name="tabs">
+             <object classname="com.jeta.forms.store.properties.TabbedPaneProperties">
+              <at name="name">tabs</at>
+              <at name="items">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.TabProperty">
+                   <at name="name">tab</at>
+                   <at name="title">Properties</at>
+                   <at name="icon">
+                    <object classname="com.jeta.forms.store.properties.IconProperty">
+                     <at name="embedded">false</at>
+                     <at name="width">0</at>
+                     <at name="height">0</at>
+                    </object>
+                   </at>
+                   <at name="form">
+                    <object classname="com.jeta.forms.store.memento.FormMemento">
+                     <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                      <at name="cellconstraints">
+                       <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                        <at name="column">1</at>
+                        <at name="row">1</at>
+                        <at name="colspan">1</at>
+                        <at name="rowspan">1</at>
+                        <at name="halign">default</at>
+                        <at name="valign">default</at>
+                        <at name="insets" object="insets">0,0,0,0</at>
+                       </object>
+                      </at>
+                      <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+                     </super>
+                     <at name="id">embedded.484358629</at>
+                     <at name="rowspecs">CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE</at>
+                     <at name="colspecs">FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE</at>
+                     <at name="components">
+                      <object classname="java.util.LinkedList">
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">6</at>
+                             <at name="colspan">3</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JPanel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JPanel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="name">addtionalPanel</at>
+                              <at name="width">812</at>
+                              <at name="height">268</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">4</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">lblMimeType</at>
+                              <at name="width">58</at>
+                              <at name="text">Mime type</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">4</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextField</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextField</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="background" object="color">236,233,216</at>
+                              <at name="editable">false</at>
+                              <at name="name">txtMimeType</at>
+                              <at name="width">743</at>
+                              <at name="height">20</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">2</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextField</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextField</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="background" object="color">236,233,216</at>
+                              <at name="editable">false</at>
+                              <at name="name">txtName</at>
+                              <at name="width">743</at>
+                              <at name="height">20</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">2</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">lblName</at>
+                              <at name="width">58</at>
+                              <at name="text">Name</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.FormMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">8</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+                          </super>
+                          <at name="id">embedded.737951868</at>
+                          <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+                          <at name="colspecs">FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE</at>
+                          <at name="components">
+                           <object classname="java.util.LinkedList">
+                            <item >
+                             <at name="value">
+                              <object classname="com.jeta.forms.store.memento.BeanMemento">
+                               <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                                <at name="cellconstraints">
+                                 <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                                  <at name="column">2</at>
+                                  <at name="row">1</at>
+                                  <at name="colspan">1</at>
+                                  <at name="rowspan">1</at>
+                                  <at name="halign">default</at>
+                                  <at name="valign">default</at>
+                                  <at name="insets" object="insets">0,0,0,0</at>
+                                 </object>
+                                </at>
+                                <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                               </super>
+                               <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                               <at name="beanclass">javax.swing.JButton</at>
+                               <at name="beanproperties">
+                                <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                                 <at name="classname">javax.swing.JButton</at>
+                                 <at name="properties">
+                                  <object classname="com.jeta.forms.store.support.PropertyMap">
+                                   <at name="border">
+                                    <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                     <at name="borders">
+                                      <object classname="java.util.LinkedList">
+                                       <item >
+                                        <at name="value">
+                                         <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                          <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                           <at name="name">border</at>
+                                          </super>
+                                         </object>
+                                        </at>
+                                       </item>
+                                      </object>
+                                     </at>
+                                    </object>
+                                   </at>
+                                   <at name="actionCommand">Open with system editor</at>
+                                   <at name="name">btnOpenWithSystemEditor</at>
+                                   <at name="width">172</at>
+                                   <at name="text">Open with system editor</at>
+                                   <at name="height">22</at>
+                                  </object>
+                                 </at>
+                                </object>
+                               </at>
+                              </object>
+                             </at>
+                            </item>
+                           </object>
+                          </at>
+                          <at name="properties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.gui.form.GridView</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList"/>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name"/>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="scollBars">
+                               <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                                <at name="name">scollBars</at>
+                                <at name="verticalpolicy">21</at>
+                                <at name="horizontalpolicy">31</at>
+                                <at name="border">
+                                 <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                  <at name="borders">
+                                   <object classname="java.util.LinkedList">
+                                    <item >
+                                     <at name="value">
+                                      <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                       <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                        <at name="name">border</at>
+                                       </super>
+                                      </object>
+                                     </at>
+                                    </item>
+                                   </object>
+                                  </at>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                          <at name="cellpainters">
+                           <object classname="com.jeta.forms.store.support.Matrix">
+                            <at name="rows">
+                             <object classname="[Ljava.lang.Object;" size="1">
+                              <at name="item" index="0">
+                               <object classname="[Ljava.lang.Object;" size="2"/>
+                              </at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                          <at name="rowgroups">
+                           <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                            <at name="groups">
+                             <object classname="java.util.HashMap"/>
+                            </at>
+                           </object>
+                          </at>
+                          <at name="colgroups">
+                           <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                            <at name="groups">
+                             <object classname="java.util.HashMap"/>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                      </object>
+                     </at>
+                     <at name="properties">
+                      <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                       <at name="classname">com.jeta.forms.gui.form.GridView</at>
+                       <at name="properties">
+                        <object classname="com.jeta.forms.store.support.PropertyMap">
+                         <at name="border">
+                          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                           <super classname="com.jeta.forms.store.properties.BorderProperty">
+                            <at name="name">border</at>
+                           </super>
+                           <at name="borders">
+                            <object classname="java.util.LinkedList"/>
+                           </at>
+                          </object>
+                         </at>
+                         <at name="name"/>
+                         <at name="fill">
+                          <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                           <at name="name">fill</at>
+                          </object>
+                         </at>
+                         <at name="scollBars">
+                          <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                           <at name="name">scollBars</at>
+                           <at name="verticalpolicy">21</at>
+                           <at name="horizontalpolicy">31</at>
+                           <at name="border">
+                            <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                             <super classname="com.jeta.forms.store.properties.BorderProperty">
+                              <at name="name">border</at>
+                             </super>
+                             <at name="borders">
+                              <object classname="java.util.LinkedList">
+                               <item >
+                                <at name="value">
+                                 <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                 </object>
+                                </at>
+                               </item>
+                              </object>
+                             </at>
+                            </object>
+                           </at>
+                          </object>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="cellpainters">
+                      <object classname="com.jeta.forms.store.support.Matrix">
+                       <at name="rows">
+                        <object classname="[Ljava.lang.Object;" size="9">
+                         <at name="item" index="0">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="1">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="2">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="3">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="4">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="5">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="6">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="7">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="8">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="rowgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="colgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">857</at>
+            <at name="height">476</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"/>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="1">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="1"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/PropertiesEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/PropertiesEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/PropertiesEditor.java	(revision 1126)
@@ -0,0 +1,75 @@
+
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingUnit;
+
+
+public class PropertiesEditor extends TextEditor {
+    private static final long serialVersionUID = -1201748764869858488L;
+
+    public PropertiesEditor(ScriptingExternalFile unit) {
+        super(unit);
+    }
+
+    @Override
+    public ScriptingExternalFile getUnit() {
+        return (ScriptingExternalFile) super.getUnit();
+    }
+    
+    @Override
+    public void set(ScriptingUnit unit) {
+        this.setUnit(unit);
+        this.getPropertiesPanel().set(unit);
+        Properties props = new Properties();
+        File f = this.getUnit().getExternalFile();
+        
+        try (FileInputStream fis = new FileInputStream(f)) {
+            props.load(fis);
+        } catch (Exception ex) {
+            throw new RuntimeException("Can't load properties file.",ex);
+        }
+        StringBuilder builder = new StringBuilder();
+                
+        List<String>names = new ArrayList<>(props.stringPropertyNames());
+        Collections.sort(names);
+        for (String name : names) {
+            String value = props.getProperty(name);
+            builder.append(name).append("=").append(value).append("\n");
+        }
+        this.getTextEditor().setText(getUnit().getMimeType(),builder.toString());
+    } 
+       
+    @Override
+    public void save() {
+        String text = this.getTextEditor().getText();
+        String[] lines = text.split("\n");
+        Properties props = new Properties();
+        String comments = "";
+        for (String line : lines) {
+            line = line.trim();
+            if( line.startsWith("#") ) {
+                comments += line.substring(1) + " ";
+            } else if( line.contains("=") ) {
+                String[] parts = line.split("=");
+                props.setProperty(parts[0].trim(), parts[1]);
+            }
+        }
+
+        File f = this.getUnit().getExternalFile();
+        try (FileOutputStream fout = new FileOutputStream(f)) {
+            props.store(fout,comments);
+        } catch (Exception ex) {
+            throw new RuntimeException("Can't save properties file.",ex);
+        }
+        this.setModified(false);    
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ScriptUnitEditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ScriptUnitEditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ScriptUnitEditorFactory.java	(revision 1126)
@@ -0,0 +1,34 @@
+
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.AbstractEditorFactory;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+
+
+public class ScriptUnitEditorFactory  extends AbstractEditorFactory {
+
+    public ScriptUnitEditorFactory() {
+        super("ScriptUnitEditor","This factory can create editors for scripts");
+    }
+
+    @Override
+    public JEditor doCreate(ScriptingUnit unit) {
+        return ScriptingSwingLocator.getUIManager().createJCodeEditor((ScriptingScript) unit);
+    }
+
+    @Override
+    public boolean canCreate(ScriptingUnit unit) {
+        return unit instanceof ScriptingScript;
+    }
+    
+
+    @Override
+    public int getPriority() {
+        return 100;
+    }
+        
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/DialogEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/DialogEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/DialogEditor.java	(revision 1126)
@@ -0,0 +1,56 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import org.gvsig.scripting.ScriptingDialog;
+import org.gvsig.scripting.swing.api.JDialogEditor;
+import org.gvsig.scripting.swing.api.JThinG;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+
+public class DialogEditor extends ScriptUnitEditor implements JDialogEditor {
+
+    private static final long serialVersionUID = 5032349017514086800L;
+    private JThinG thing;
+
+    public DialogEditor(ScriptingUIManager uimanager, ScriptingDialog script) {
+        super(uimanager, script);
+        initComponents();
+    }
+
+    private void initComponents() {
+        getTabs().addTab(this.uimanager.getTranslation("Dialog"), getDialogPanel());
+    }
+
+    @Override
+    public ScriptingDialog getDialog() {
+        return (ScriptingDialog) this.script;
+    }
+
+    @Override
+    public void save() {
+        super.save();
+        thing.save(this.getDialog().getDialogFile());
+    }
+
+    private JPanel getDialogPanel() {
+        JPanel panel = new JPanel();
+        panel.setLayout(new BorderLayout());
+
+        thing = this.uimanager.createJThinG();
+        thing.load(this.getDialog().getDialogFile());
+
+        panel.add(new JScrollPane(thing), BorderLayout.CENTER);
+        panel.setVisible(true);
+
+        return panel;
+    }
+
+    @Override
+    public void reloadDialog() {
+
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/AbstractEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/AbstractEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/AbstractEditor.java	(revision 1126)
@@ -0,0 +1,42 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.beans.PropertyChangeListener;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JEditor;
+
+public abstract class AbstractEditor implements JEditor {
+
+    private ScriptingUnit unit;
+    
+    protected AbstractEditor() {
+        
+    }
+    
+    @Override
+    public ScriptingUnit getUnit() {
+        return this.unit;
+    }
+
+    @Override
+    public void set(ScriptingUnit unit) {
+        this.unit = unit;
+    }
+
+    @Override
+    public void addChangeListener(PropertyChangeListener listener) {
+    }
+
+    @Override
+    public void save() {
+    }
+
+    @Override
+    public boolean isModified() {
+        return false;
+    }
+
+    @Override
+    public void fetch(ScriptingUnit unit) {
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/FolderEditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/FolderEditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/FolderEditorFactory.java	(revision 1126)
@@ -0,0 +1,35 @@
+
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.AbstractEditorFactory;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+
+
+public class FolderEditorFactory  extends AbstractEditorFactory {
+
+    public FolderEditorFactory() {
+        super("FolderEditor","This factory can create editors for folders");
+    }
+
+    @Override
+    public JEditor doCreate(ScriptingUnit unit) {
+        return new FolderEditor((ScriptingFolder) unit);
+    }
+
+    @Override
+    public boolean canCreate(ScriptingUnit unit) {
+        return unit instanceof ScriptingFolder;
+    }
+    
+
+    @Override
+    public int getPriority() {
+        return 100;
+    }
+        
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ScriptUnitEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ScriptUnitEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ScriptUnitEditor.java	(revision 1126)
@@ -0,0 +1,183 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.text.JTextComponent;
+
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JCodeEditor;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
+import org.gvsig.scripting.swing.impl.composer.ChangeListenerSupport;
+import org.gvsig.scripting.swing.impl.composer.JPropertiesScript;
+import org.gvsig.tools.script.Script;
+
+public class ScriptUnitEditor extends JPanel implements JCodeEditor {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 5191252525229037754L;
+
+    private JTabbedPane tabs;
+
+    protected ScriptingScript script;
+    protected final ScriptingUIManager uimanager;
+    protected final ChangeListenerSupport changeListeners;
+    protected BaseTextEditor textEditor;
+    protected JPropertiesScript propertiesPanel;
+    protected boolean modified;
+
+    public ScriptUnitEditor(ScriptingUIManager uimanager) {
+        this(uimanager, null);
+    }
+
+    public ScriptUnitEditor(ScriptingUIManager uimanager, Script script) {
+        this.script = (ScriptingScript) script;
+        this.uimanager = uimanager;
+        this.modified = false;
+        this.changeListeners = new ChangeListenerSupport();
+        initComponents();
+        if( this.script!=null ) {
+            this.set(this.script);
+        }
+    }
+
+    @Override
+    public ScriptingScript getScript() {
+        return (ScriptingScript) this.script;
+    }
+
+    @Override
+    public ScriptingUnit getUnit() {
+        return this.script;
+    }
+
+    private void initComponents() {
+        this.textEditor = new BaseTextEditor();
+        this.textEditor.addChangeListener(new PropertyChangeListener() {
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                modified = true;
+                fireChangeEvent(evt);
+            }
+        });
+
+        this.propertiesPanel = new JPropertiesScript(this.script);
+        this.propertiesPanel.addChangeListener(new PropertyChangeListener() {
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                modified = true;
+                fireChangeEvent(evt);
+            }
+        });
+
+        this.tabs = new JTabbedPane();
+        this.tabs.setTabPlacement(JTabbedPane.BOTTOM);
+        this.tabs.addTab(this.uimanager.getTranslation("Code"), this.textEditor);
+        this.tabs.addTab(this.uimanager.getTranslation("Properties"), this.propertiesPanel);
+        this.setLayout(new BorderLayout());
+        this.add(BorderLayout.CENTER, tabs);
+
+    }
+    
+    protected JTabbedPane getTabs() {
+        return this.tabs;
+    }
+
+    @Override
+    public boolean isModified() {
+        return this.modified;
+    }
+
+    @Override
+    public void save() {
+        if (this.propertiesPanel != null) {
+            this.propertiesPanel.fectch(script);
+        }
+        if (this.textEditor != null) {
+            script.setCode(this.textEditor.getText());
+        }
+        script.save();
+        this.modified = false;
+    }
+
+    @Override
+    public void reload() {
+
+    }
+
+    @Override
+    public void addChangeListener(PropertyChangeListener listener) {
+        this.changeListeners.addChangeListener(listener);
+    }
+
+    public void fireChangeEvent(String name, Object oldValue) {
+        this.changeListeners.fireChange(name, oldValue);
+    }
+
+    public void fireChangeEvent(PropertyChangeEvent evt) {
+        this.changeListeners.fireChange(evt);
+    }
+        
+    @Override
+    public void set(ScriptingUnit unit) {
+        this.script = (ScriptingScript) unit;
+        this.propertiesPanel.set(unit);
+        this.textEditor.setText(this.script.getMimeType(), this.script.getCode());
+        if( unit.isASystemUnit() ) {
+            this.textEditor.getJTextComponent().setEditable(false);
+        } else {
+            this.textEditor.getJTextComponent().setEditable(true);            
+        }
+    }
+
+    @Override
+    public void fetch(ScriptingUnit unit) {
+        ScriptingScript script = (ScriptingScript) unit;
+        this.propertiesPanel.fectch(unit);
+        script.setCode(this.textEditor.getText());
+    }
+
+    @Override
+    public JTextComponent getJTextComponent() {
+        return this.textEditor.getJTextComponent();
+    }
+
+    @Override
+    public SyntaxtHighlightTextComponent getSyntaxtHighlightTextComponent() {
+        return this.textEditor.getSyntaxtHighlightTextComponent();
+    }
+
+    @Override
+    public void selectLine(int line) {
+        this.textEditor.selectLine(line);
+    }
+
+    @Override
+    public int getLineCount() {
+        return this.textEditor.getLineCount();
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+    @Override
+    public void gotoline(int line) {
+        this.textEditor.gotoline(line);
+    }
+
+    @Override
+    public void addUpdateCaretPositionActionListener(ActionListener actionlistener) {
+        this.textEditor.addUpdateCaretPositionActionListener(actionlistener);
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorFactory.java	(revision 1126)
@@ -0,0 +1,32 @@
+
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.AbstractEditorFactory;
+import org.gvsig.scripting.swing.api.JEditor;
+
+
+public class ExternalFileEditorFactory extends AbstractEditorFactory {
+
+    public ExternalFileEditorFactory() {
+        super("ExternalFileEditor","This factory can create editors for external files");
+    }
+
+    @Override
+    public JEditor doCreate(ScriptingUnit unit) {
+        return new ExternalFileEditor((ScriptingExternalFile) unit);
+    }
+
+    @Override
+    public boolean canCreate(ScriptingUnit unit) {
+        return unit instanceof ScriptingExternalFile;
+    }
+
+    @Override
+    public int getPriority() {
+        return 10;
+    }
+    
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/FolderEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/FolderEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/FolderEditor.java	(revision 1126)
@@ -0,0 +1,95 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+import javax.swing.JComponent;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.ScriptingFolder;
+
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.scripting.swing.impl.composer.ChangeListenerSupport;
+import org.gvsig.scripting.swing.impl.composer.JPropertiesFolder;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.i18n.I18nManager;
+
+public class FolderEditor extends JPropertiesFolder implements JEditor {
+
+    protected ScriptingFolder folder;
+    protected final ChangeListenerSupport changeListeners;
+
+    public FolderEditor(ScriptingFolder folder) {
+        super(folder);
+        this.folder = folder;
+        this.changeListeners = new ChangeListenerSupport();
+        initComponents();
+        this.set(folder);
+    }
+
+    @Override
+    public ScriptingFolder getUnit() {
+        return this.folder;
+    }
+
+    private void initComponents() {
+        I18nManager i18n = ToolsLocator.getI18nManager();
+
+        this.addChangeListener(new PropertyChangeListener() {
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                fireChangeEvent(evt);
+            }
+        });
+
+    }
+
+    @Override
+    public boolean isModified() {
+        return this.isChanged();
+    }
+
+    @Override
+    public void save() {
+        this.fectch(folder);        
+        this.folder.save();
+    }
+
+    @Override
+    public void addChangeListener(PropertyChangeListener listener) {
+        this.changeListeners.addChangeListener(listener);
+    }
+
+    public void fireChangeEvent(String name, Object oldValue) {
+        this.changeListeners.fireChange(name, oldValue);
+    }
+
+    public void fireChangeEvent(PropertyChangeEvent evt) {
+        this.changeListeners.fireChange(evt);
+    }
+
+    @Override
+    public void set(ScriptingFolder unit) {
+        this.folder = unit;
+        super.set(this.folder);
+    }
+    
+    @Override
+    public void set(ScriptingUnit unit) {
+        this.set((ScriptingFolder)unit);
+    }
+
+    @Override
+    public void fetch(ScriptingUnit unit) {
+        ScriptingFolder theFolder = (ScriptingFolder) unit;
+        super.fectch(theFolder);
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/TextEditorFactory.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/TextEditorFactory.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/TextEditorFactory.java	(revision 1126)
@@ -0,0 +1,36 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import org.gvsig.scripting.ScriptingExternalFile;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.AbstractEditorFactory;
+import org.gvsig.scripting.swing.api.JEditor;
+
+public class TextEditorFactory  extends AbstractEditorFactory {
+
+    public TextEditorFactory() {
+        super("TextEditor","This factory can create editors for external text files");
+    }
+
+    @Override
+    public JEditor doCreate(ScriptingUnit unit) {
+        return new TextEditor((ScriptingExternalFile) unit);
+    }
+
+    @Override
+    public boolean canCreate(ScriptingUnit unit) {
+        if (unit instanceof ScriptingExternalFile) {            
+            String mimeType = ((ScriptingExternalFile) unit).getMimeType();
+            if( mimeType.startsWith("text/") || mimeType.endsWith("/xml")) {
+                return true;            
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int getPriority() {
+        return 100;
+    }
+        
+        
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorView.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorView.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/ExternalFileEditorView.java	(revision 1126)
@@ -0,0 +1,193 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import com.jeta.open.i18n.I18NUtils;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Container;
+import java.awt.Dimension;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextField;
+
+
+public class ExternalFileEditorView extends JPanel
+{
+   JTabbedPane tabEditor = new JTabbedPane();
+   JPanel addtionalPanel = new JPanel();
+   JLabel lblMimeType = new JLabel();
+   JTextField txtMimeType = new JTextField();
+   JTextField txtName = new JTextField();
+   JLabel lblName = new JLabel();
+   JButton btnOpenWithSystemEditor = new JButton();
+
+   /**
+    * Default constructor
+    */
+   public ExternalFileEditorView()
+   {
+      initializePanel();
+   }
+
+   /**
+    * Adds fill components to empty cells in the first row and first column of the grid.
+    * This ensures that the grid spacing will be the same as shown in the designer.
+    * @param cols an array of column indices in the first row where fill components should be added.
+    * @param rows an array of row indices in the first column where fill components should be added.
+    */
+   void addFillComponents( Container panel, int[] cols, int[] rows )
+   {
+      Dimension filler = new Dimension(10,10);
+
+      boolean filled_cell_11 = false;
+      CellConstraints cc = new CellConstraints();
+      if ( cols.length > 0 && rows.length > 0 )
+      {
+         if ( cols[0] == 1 && rows[0] == 1 )
+         {
+            /** add a rigid area  */
+            panel.add( Box.createRigidArea( filler ), cc.xy(1,1) );
+            filled_cell_11 = true;
+         }
+      }
+
+      for( int index = 0; index < cols.length; index++ )
+      {
+         if ( cols[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) );
+      }
+
+      for( int index = 0; index < rows.length; index++ )
+      {
+         if ( rows[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) );
+      }
+
+   }
+
+   /**
+    * Helper method to load an image file from the CLASSPATH
+    * @param imageName the package and name of the file to load relative to the CLASSPATH
+    * @return an ImageIcon instance with the specified image file
+    * @throws IllegalArgumentException if the image resource cannot be loaded.
+    */
+   public ImageIcon loadImage( String imageName )
+   {
+      try
+      {
+         ClassLoader classloader = getClass().getClassLoader();
+         java.net.URL url = classloader.getResource( imageName );
+         if ( url != null )
+         {
+            ImageIcon icon = new ImageIcon( url );
+            return icon;
+         }
+      }
+      catch( Exception e )
+      {
+         e.printStackTrace();
+      }
+      throw new IllegalArgumentException( "Unable to load image: " + imageName );
+   }
+
+   /**
+    * Method for recalculating the component orientation for 
+    * right-to-left Locales.
+    * @param orientation the component orientation to be applied
+    */
+   public void applyComponentOrientation( ComponentOrientation orientation )
+   {
+      // Not yet implemented...
+      // I18NUtils.applyComponentOrientation(this, orientation);
+      super.applyComponentOrientation(orientation);
+   }
+
+   public JPanel createPanel()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0)","FILL:DEFAULT:GROW(1.0)");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      tabEditor.setName("tabEditor");
+      tabEditor.setTabPlacement(JTabbedPane.BOTTOM);
+      tabEditor.addTab("Properties",null,createPanel1());
+      jpanel1.add(tabEditor,cc.xy(1,1));
+
+      addFillComponents(jpanel1,new int[0],new int[0]);
+      return jpanel1;
+   }
+
+   public JPanel createPanel1()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE","CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      addtionalPanel.setName("addtionalPanel");
+      jpanel1.add(addtionalPanel,cc.xywh(2,6,3,1));
+
+      lblMimeType.setName("lblMimeType");
+      lblMimeType.setText("Mime type");
+      jpanel1.add(lblMimeType,cc.xy(2,4));
+
+      txtMimeType.setBackground(new Color(236,233,216));
+      txtMimeType.setEditable(false);
+      txtMimeType.setName("txtMimeType");
+      jpanel1.add(txtMimeType,cc.xy(4,4));
+
+      txtName.setBackground(new Color(236,233,216));
+      txtName.setEditable(false);
+      txtName.setName("txtName");
+      jpanel1.add(txtName,cc.xy(4,2));
+
+      lblName.setName("lblName");
+      lblName.setText("Name");
+      jpanel1.add(lblName,cc.xy(2,2));
+
+      jpanel1.add(createPanel2(),cc.xy(4,8));
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3,4,5,6,7,8,9 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel2()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      btnOpenWithSystemEditor.setActionCommand("Open with system editor");
+      btnOpenWithSystemEditor.setName("btnOpenWithSystemEditor");
+      btnOpenWithSystemEditor.setText("Open with system editor");
+      jpanel1.add(btnOpenWithSystemEditor,cc.xy(2,1));
+
+      addFillComponents(jpanel1,new int[]{ 1 },new int[]{ 1 });
+      return jpanel1;
+   }
+
+   /**
+    * Initializer
+    */
+   protected void initializePanel()
+   {
+      setLayout(new BorderLayout());
+      add(createPanel(), BorderLayout.CENTER);
+   }
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/SimpleScriptEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/SimpleScriptEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/SimpleScriptEditor.java	(revision 1126)
@@ -0,0 +1,42 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import javax.swing.JComponent;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.tools.script.Script;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public class SimpleScriptEditor 
+        extends BaseTextEditor 
+        implements org.gvsig.tools.swing.api.script.ScriptSwingManager.ScriptEditor 
+    {
+    
+    public SimpleScriptEditor() {
+        super();
+    }
+    
+    @Override
+    public void set(Script script) {
+        ScriptingScript theScript = (ScriptingScript)script;
+        this.setText(theScript.getMimeType(), theScript.getCode());
+    }
+
+    @Override
+    public void fetch(Script script) {
+        ScriptingScript theScript = (ScriptingScript)script;
+        theScript.setCode(this.getText());
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+        
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/BaseTextEditor.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/BaseTextEditor.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/editors/BaseTextEditor.java	(revision 1126)
@@ -0,0 +1,158 @@
+package org.gvsig.scripting.swing.impl.composer.editors;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.beans.PropertyChangeListener;
+import javax.swing.JPanel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.JTextComponent;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.gvsig.scripting.swing.api.JTextEditor;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
+import org.gvsig.scripting.swing.impl.composer.ChangeListenerSupport;
+
+public class BaseTextEditor extends JPanel implements JTextEditor {
+
+    private static final long serialVersionUID = -4217823183731699721L;
+
+    private final ChangeListenerSupport changeListeners;
+    final ScriptingUIManager uimanager;
+    private SyntaxtHighlightTextComponent editorText;
+    private final int menuShortcutKeyMask;
+
+    
+    public BaseTextEditor() {
+        this.menuShortcutKeyMask = getToolkit().getMenuShortcutKeyMask();
+        this.uimanager = ScriptingSwingLocator.getUIManager();
+        this.changeListeners = new ChangeListenerSupport();
+        this.initComponent();
+    }
+
+    public ChangeListenerSupport getChangeListenerSupport() {
+        return this.changeListeners;
+    }
+    
+    @Override
+    public void addUpdateCaretPositionActionListener(ActionListener actionlistener) {
+        editorText.addUpdateCaretPositionActionListener(actionlistener);
+    }
+
+    public void addChangeListener(PropertyChangeListener listener) {
+        this.changeListeners.addChangeListener(listener);
+    }
+
+    private void initComponent() {
+        this.setLayout(new BorderLayout());
+        editorText = (SyntaxtHighlightTextComponent) uimanager.createSyntaxHighlightingPanel();
+//        editorText.addKeyListener(new KeyListener() {
+//
+//            @Override
+//            public void keyTyped(KeyEvent e) {
+//                doKeyTyped(e);
+//            }
+//
+//            @Override
+//            public void keyPressed(KeyEvent e) {
+//            }
+//
+//            @Override
+//            public void keyReleased(KeyEvent e) {
+//            }
+//        });
+        editorText.getJTextComponent().getDocument().addDocumentListener(new DocumentListener() {
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                changeListeners.fireChange("code", null);
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {
+                changeListeners.fireChange("code", null);
+            }
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {
+                changeListeners.fireChange("code", null);
+            }
+        });
+        this.add(editorText.asJComponent(), BorderLayout.CENTER);
+    }
+
+//    public void doKeyTyped(KeyEvent e) {
+//        if (e.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
+//            return;
+//        }
+//        if ((e.getModifiers() & this.menuShortcutKeyMask) == this.menuShortcutKeyMask) {
+//            return;
+//        }
+//        this.changeListeners.fireChange("code", null);
+//    }
+
+    public void setText(String mimeType, String text) {
+        boolean enabled = this.changeListeners.setEnabled(false);
+        try {
+            editorText.setContentType(mimeType);
+            editorText.setText(text);
+            editorText.discardAllEdits();
+        } finally {
+            this.changeListeners.setEnabled(enabled);
+        }
+    }
+    
+    public String getText() {
+        return this.editorText.getText();
+    }
+
+    @Override
+    public JTextComponent getJTextComponent() {
+        return this.editorText.getJTextComponent();
+    }
+
+    @Override
+    public void selectLine(int line) {
+        JTextComponent editor = this.getJTextComponent();
+        editor.requestFocusInWindow();
+
+        String code = editor.getText();
+        int lineCounter = 0;
+        int initialSelection = 0;
+        int finalSelection = 0;
+        for (int j = 0; j < code.length(); j++) {
+            if (code.charAt(j) == '\n') {
+                lineCounter++;
+                if (lineCounter == line - 1) {
+                    initialSelection = j;
+                }
+                if (lineCounter == line || (finalSelection == 0 && j == code.length() - 1)) {
+                    finalSelection = j;
+                }
+            }
+        }
+
+        editor.select(initialSelection, finalSelection);
+    }
+    
+    @Override
+    public SyntaxtHighlightTextComponent getSyntaxtHighlightTextComponent() {
+        return this.editorText;
+    }
+
+    @Override
+    public void gotoline(int line) {
+        getSyntaxtHighlightTextComponent().gotoline(line);
+    }
+
+    @Override
+    public int getLineCount() {
+        JTextComponent textComponent = this.getJTextComponent();
+        if( textComponent instanceof RSyntaxTextArea ) {
+            return ((RSyntaxTextArea)textComponent).getLineCount();
+        }
+        return 0; 
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/MenuBarHelper.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/MenuBarHelper.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/MenuBarHelper.java	(revision 1126)
@@ -0,0 +1,105 @@
+
+package org.gvsig.scripting.swing.impl.composer;
+
+import javax.swing.Action;
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.tools.swing.api.Component;
+
+
+public class MenuBarHelper implements Component {
+    private final JMenuBar menu;
+    
+    public MenuBarHelper(JMenuBar menu) {
+        this.menu = menu;
+    }
+    
+    public MenuBarHelper() {
+        this(new JMenuBar());
+    }
+    
+    public JMenuBar getMenuBar() {
+        return this.menu;
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this.menu;
+    }
+    
+    public JMenuItem add(String text) {
+        return this.add(text, null, null);
+    }
+    
+    public JMenuItem add(String parent, Action action, Object context) {
+        String[] sparent = parent.split("/");
+        JMenu entry;
+        for( int i=0; i<this.menu.getMenuCount(); i++ ) {
+            entry = this.menu.getMenu(i);
+            if( entry.getText().equalsIgnoreCase(sparent[0]) ) {
+                return this.add(entry,sparent,1, action, context);
+            }
+        }
+        entry = new JMenu(sparent[0]);
+        this.menu.add(entry);
+        return this.add(entry, sparent, 1, action, context);
+    }
+    
+    private JMenuItem add(JMenu entry, String parent, Action action, Object context) {
+        String[] sparent = parent.split("/");
+        return this.add(entry, sparent, 1, action, context);
+    }
+
+    private JMenuItem add(JMenu menu, String parent[], int level, Action action, Object context) {
+        JMenuItem entry = null;
+        if( parent.length == level ) {
+            for( int i=0; i<menu.getItemCount(); i++ ) {
+                entry = menu.getItem(i);
+                if( entry instanceof JMenuItemWithContext ) {
+                    String entry_name = (String) entry.getAction().getValue(Action.NAME);
+                    String action_name = (String) action.getValue(Action.NAME);
+                    if( StringUtils.equalsIgnoreCase(entry_name, action_name) ) {
+                        menu.remove(entry);
+                    }
+                }
+            }
+            if( action != null ) {
+                entry = new JMenuItemWithContext(action, context);
+                menu.add(entry);
+            }
+            return entry;            
+        }
+        for( int i=0; i<menu.getItemCount(); i++ ) {
+            entry = menu.getItem(i);
+            if( entry instanceof JMenu && entry.getText().equalsIgnoreCase(parent[level]) ) {
+                entry = this.add((JMenu) entry,parent,level+1, action, context);
+                return entry;
+            }
+        }
+        if( "-".equals(parent[level]) ) {
+            menu.addSeparator();
+        } else {
+            entry = new JMenu(parent[level]);
+            menu.add(entry);
+            entry = this.add((JMenu) entry, parent, level+1, action, context);
+        }
+        return entry;
+    } 
+    
+    public static class JMenuItemWithContext extends JMenuItem {
+        private static final long serialVersionUID = -1147590044079747644L;
+        private final Object context;
+
+        private JMenuItemWithContext(Action action, Object context) {
+            super(action);
+            this.context = context;
+        }
+        
+        public Object getContext() {
+            return this.context;
+        }
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/DefaultJScriptingComposer.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/DefaultJScriptingComposer.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/DefaultJScriptingComposer.java	(revision 1126)
@@ -0,0 +1,2607 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import static javax.swing.Action.ACCELERATOR_KEY;
+import static javax.swing.Action.ACTION_COMMAND_KEY;
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTable;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+import javax.swing.text.JTextComponent;
+import org.fife.rsta.ui.GoToDialog;
+import org.fife.rsta.ui.search.FindDialog;
+import org.fife.rsta.ui.search.ReplaceDialog;
+import org.fife.rsta.ui.search.SearchEvent;
+import org.fife.rsta.ui.search.SearchListener;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rtextarea.SearchContext;
+import org.fife.ui.rtextarea.SearchEngine;
+import org.fife.ui.rtextarea.SearchResult;
+import org.gvsig.installer.swing.api.SwingInstallerLocator;
+import org.gvsig.installer.swing.api.SwingInstallerManager;
+import org.gvsig.installer.swing.api.packagebuilder.PackageBuildder;
+import org.gvsig.scripting.CompileErrorException;
+import org.gvsig.scripting.ExecuteErrorException;
+import org.gvsig.scripting.ScriptingBaseScript;
+import org.gvsig.scripting.ScriptingErrorException;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingNotification;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JCodeEditor;
+import org.gvsig.scripting.swing.api.JEditor;
+import org.gvsig.scripting.swing.api.JScriptingBrowser;
+import org.gvsig.scripting.swing.api.JScriptingBrowser.BrowserActionEvent;
+import org.gvsig.scripting.swing.api.JScriptingComposer;
+import static org.gvsig.scripting.swing.api.JScriptingComposer.DOCKED_PROBLEMS;
+import org.gvsig.scripting.swing.api.JScriptingComposer.Dock.DockedPanel;
+import org.gvsig.scripting.swing.api.JScriptingComposer.Problems;
+import org.gvsig.scripting.swing.api.JScriptingComposer.Problems.Problem;
+import org.gvsig.scripting.swing.api.JScriptingConsole;
+import org.gvsig.scripting.swing.api.JScriptingLauncher;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.api.ScriptingUIManager.MenuEntry;
+import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent.UpdateCaretPositionActionEvent;
+import org.gvsig.scripting.swing.impl.DefaultJScriptingConsole;
+import org.gvsig.scripting.swing.impl.DefaultScriptingUIManager;
+import org.gvsig.scripting.swing.impl.JDialogContent;
+import org.gvsig.scripting.swing.impl.composer.DefaultJScriptingComposer.DefaultProblems.ProblemsTableMode.DefaultProblem;
+import org.gvsig.scripting.swing.impl.composer.editors.ScriptUnitEditor;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.observer.Observable;
+import org.gvsig.tools.observer.Observer;
+import org.gvsig.tools.packageutils.PackageInfo;
+import org.gvsig.tools.packageutils.PackageManager;
+import org.gvsig.tools.packageutils.Version;
+import org.gvsig.tools.swing.api.ActionListenerSupport;
+import org.gvsig.tools.swing.api.Component;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultJScriptingComposer extends JPanel implements JScriptingComposer, Observer, ActionListener {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultJScriptingComposer.class);
+
+    public static final int CLOSE_ACTION = 1;
+
+    private final ScriptingUIManager uimanager;
+    private final ScriptingManager manager;
+    private final ClassLoader loader;
+
+    private JSplitPane mainPanel;
+    private Dock dock;
+
+    private Map<String, ToolEntry> menus;
+    private JMenuBar menuBar;
+
+    private Map<String, ToolEntry> tools;
+    private JToolBar toolBar;
+
+    private StatusBar statusBar;
+
+    private FindDialog findDialog;
+    private ReplaceDialog replaceDialog;
+    private GoToDialog gotoDialog;
+
+    private ActionListener defaultActionlistener = null;
+
+    private Set<ChangeListener> changeEditorListeners = null;
+
+    private class GoToLineAction extends AbstractAction {
+
+        private static final long serialVersionUID = -7353913671104893812L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public GoToLineAction() {
+            super(uimanager.getTranslation("go_to_line_Xhorizontal_ellipsisX"));
+            int c = getToolkit().getMenuShortcutKeyMask();
+            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_L, c));
+            putValue(ACTION_COMMAND_KEY, "GotoLine");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            JEditor editor = getCurrentEditor();
+            if (!(editor instanceof JCodeEditor)) {
+                return;
+            }
+            JCodeEditor codeEditor = (JCodeEditor) editor;
+            if (findDialog.isVisible()) {
+                findDialog.setVisible(false);
+            }
+            if (replaceDialog.isVisible()) {
+                replaceDialog.setVisible(false);
+            }
+            gotoDialog.setMaxLineNumberAllowed(codeEditor.getLineCount());
+            gotoDialog.setVisible(true);
+            int line = gotoDialog.getLineNumber();
+
+            if (line > 0) {
+                codeEditor.selectLine(line);
+            }
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null && panel.getComponent() instanceof JCodeEditor;
+        }
+    }
+
+    private class ShowFindDialogAction extends AbstractAction {
+
+        private static final long serialVersionUID = -7840632153011361661L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ShowFindDialogAction() {
+            super(uimanager.getTranslation("find_Xhorizontal_ellipsisX"));
+            int c = getToolkit().getMenuShortcutKeyMask();
+            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F, c));
+            putValue(ACTION_COMMAND_KEY, "ShowFindDialog");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (replaceDialog.isVisible()) {
+                replaceDialog.setVisible(false);
+            }
+            findDialog.setVisible(true);
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null && panel.getComponent() instanceof JCodeEditor;
+        }
+    }
+
+    private class ShowReplaceDialogAction extends AbstractAction {
+
+        private static final long serialVersionUID = 7209167803487996060L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ShowReplaceDialogAction() {
+            super(uimanager.getTranslation("replace_Xhorizontal_ellipsisX"));
+            int c = getToolkit().getMenuShortcutKeyMask();
+            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, c));
+            putValue(ACTION_COMMAND_KEY, "ShowReplaceDialog");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (findDialog.isVisible()) {
+                findDialog.setVisible(false);
+            }
+            replaceDialog.setVisible(true);
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null && panel.getComponent() instanceof JCodeEditor;
+        }
+    }
+
+    private class LauncherAction extends AbstractAction {
+
+        private static final long serialVersionUID = 6257776255757689286L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public LauncherAction() {
+            super(uimanager.getTranslation("Launcher"));
+            putValue(ACTION_COMMAND_KEY, "ShowLauncher");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            getWindowManager().showWindow(
+                    uimanager.createLauncher().asJComponent(),
+                    uimanager.getTranslation("Scripting_Launcher"),
+                    WindowManager.MODE.TOOL
+            );
+        }
+
+    }
+
+    private class SelectAllAction extends AbstractAction {
+
+        private static final long serialVersionUID = 2725549699989067383L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public SelectAllAction() {
+            super(uimanager.getTranslation("Select_all"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-edit-select-all"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Select_all"));
+            putValue(ACTION_COMMAND_KEY, "DocumentSelectAll");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptSelectAll();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null && panel.getComponent() instanceof JCodeEditor;
+        }
+
+    }
+
+    private class PackageScriptAction extends AbstractAction {
+
+        private static final long serialVersionUID = 8020393562984016720L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public PackageScriptAction() {
+            super(uimanager.getTranslation("_Package_script"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-package"));
+            putValue(ACTION_COMMAND_KEY, "PackageScript");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            createScriptPackage();
+        }
+
+    }
+
+    private class AboutAction extends AbstractAction {
+
+        private static final long serialVersionUID = -4928359535828269502L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public AboutAction() {
+            super(uimanager.getTranslation("About_scripts_editor"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-about"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("About_scripts_editor"));
+            putValue(ACTION_COMMAND_KEY, "About");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            getWindowManager().showWindow(
+                    getAboutUsDialog(),
+                    uimanager.getTranslation("About_scripts_editor"),
+                    WindowManager.MODE.WINDOW
+            );
+        }
+
+    }
+
+    private class CutAction extends AbstractAction {
+
+        private static final long serialVersionUID = -8549655706085425411L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public CutAction() {
+            super(uimanager.getTranslation("Cut"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-edit-cut"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Cut"));
+            putValue(ACTION_COMMAND_KEY, "DocumentCut");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptCut();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null && panel.getComponent() instanceof JCodeEditor;
+        }
+
+    }
+
+    private class CopyAction extends AbstractAction {
+
+        private static final long serialVersionUID = -6870773810752024874L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public CopyAction() {
+            super(uimanager.getTranslation("Copy"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-edit-copy"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Copy"));
+            putValue(ACTION_COMMAND_KEY, "DocumentCopy");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptCopy();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null && panel.getComponent() instanceof JCodeEditor;
+        }
+
+    }
+
+    private class PasteAction extends AbstractAction {
+
+        private static final long serialVersionUID = -5829551248494873061L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public PasteAction() {
+            super(uimanager.getTranslation("Paste"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-edit-paste"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Paste"));
+            putValue(ACTION_COMMAND_KEY, "DocumentPaste");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptPaste();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null && panel.getComponent() instanceof JCodeEditor;
+        }
+
+    }
+
+    private class ExitAction extends AbstractAction {
+
+        private static final long serialVersionUID = 9165363564675325925L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ExitAction() {
+            super(uimanager.getTranslation("Close"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-exit"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Close"));
+            putValue(ACTION_COMMAND_KEY, "CloseComposer");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            closeAllScripts();
+            closeWindow();
+            if (defaultActionlistener != null) {
+                ActionEvent event = new ActionEvent(this, CLOSE_ACTION, "close");
+                defaultActionlistener.actionPerformed(event);
+            }
+        }
+
+    }
+
+    private class SaveAction extends AbstractAction {
+
+        private static final long serialVersionUID = -870379961486387727L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public SaveAction() {
+            super(uimanager.getTranslation("Save"));
+            int c = getToolkit().getMenuShortcutKeyMask();
+            putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, c));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-save"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Save"));
+            putValue(ACTION_COMMAND_KEY, "DocumentSave");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptSave();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null;
+        }
+    }
+
+    private class RunAction extends AbstractAction {
+
+        private static final long serialVersionUID = 4851968883766990149L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public RunAction() {
+            super(uimanager.getTranslation("Run"));
+            int c = getToolkit().getMenuShortcutKeyMask();
+//            putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-run"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Run"));
+            putValue(ACTION_COMMAND_KEY, "DocumentRun");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptExecute();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null;
+        }
+    }
+
+    private class SaveAndRunAction extends AbstractAction {
+
+        private static final long serialVersionUID = 4851968883766990149L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public SaveAndRunAction() {
+            super(uimanager.getTranslation("Save and run"));
+            int c = getToolkit().getMenuShortcutKeyMask();
+            putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-save-and-run"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Save and run"));
+            putValue(ACTION_COMMAND_KEY, "DocumentSaveAndRun");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptSave();
+            currentScriptExecute();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null;
+        }
+    }
+
+    private class CloseAllAction extends AbstractAction {
+
+        private static final long serialVersionUID = 3385142920283598457L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public CloseAllAction() {
+            super(uimanager.getTranslation("Close_all_documents"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-closeall"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Close_all_documents"));
+            putValue(ACTION_COMMAND_KEY, "CloseAll");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            closeAllScripts();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null;
+        }
+
+    }
+
+    private class CloseDocumentAction extends AbstractAction {
+
+        private static final long serialVersionUID = 4152188500446249755L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public CloseDocumentAction() {
+            super(uimanager.getTranslation("Close_document"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-close"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Close_current_tab"));
+            putValue(ACTION_COMMAND_KEY, "DocumentClose");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            currentScriptClose();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            DockedPanel panel = dock.getSelected(Dock.DOCK_CENTER);
+            return panel != null;
+        }
+
+    }
+
+    private class ShowConsoleAction extends AbstractAction {
+
+        private static final long serialVersionUID = -7545333555439711068L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ShowConsoleAction() {
+            super(uimanager.getTranslation("Console"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-show-console"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Show_console_panel"));
+            putValue(ACTION_COMMAND_KEY, "ShowConsole");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            addConsolePanel();
+        }
+    }
+
+    private class ShowProblemsAction extends AbstractAction {
+
+        private static final long serialVersionUID = 5276964996914550830L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ShowProblemsAction() {
+            super(uimanager.getTranslation("Problems"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-show-problems"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Show_problems_panel"));
+            putValue(ACTION_COMMAND_KEY, "ShowProblems");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            addProblemsPanel();
+        }
+    }
+
+    private class ShowProjectsAction extends AbstractAction {
+
+        private static final long serialVersionUID = 5873598740133693862L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ShowProjectsAction() {
+            super(uimanager.getTranslation("Projects"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-show-projects"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Show_projects_panel"));
+            putValue(ACTION_COMMAND_KEY, "ShowProjects");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            addProjectsPanel();
+        }
+    }
+
+    private class NewDocumentAction extends AbstractAction {
+
+        private static final long serialVersionUID = 7889613706183211620L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public NewDocumentAction() {
+            super(uimanager.getTranslation("New"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-add"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("New"));
+            putValue(ACTION_COMMAND_KEY, "DocumentNew");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                scriptNew();
+            } catch (Exception e1) {
+                LOGGER.warn("Can't create a new document", e1);
+            }
+        }
+
+    }
+    
+    private class NewFolderAction extends AbstractAction {
+
+        private static final long serialVersionUID = 7889613706183211620L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public NewFolderAction() {
+            super(uimanager.getTranslation("New folder"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-folder-add"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("New folder"));
+            putValue(ACTION_COMMAND_KEY, "FolderNew");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                FolderNew();
+            } catch (Exception e1) {
+                LOGGER.warn("Can't create a new folder", e1);
+            }
+        }
+
+    }    
+
+    private class ProjectEditAction extends AbstractAction {
+
+        private static final long serialVersionUID = -3393464285985649074L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ProjectEditAction() {
+            super(uimanager.getTranslation("Edit"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-edit"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Open_edition_mode"));
+            putValue(ACTION_COMMAND_KEY, "DocumentEdit");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                ScriptingUnit selectedItem = getLauncherSelectedScript();
+                if( uimanager.hasEditor(selectedItem) ) {
+                    scriptEdit(selectedItem);
+                }
+            } catch (Exception e1) {
+                LOGGER.warn("Can't edit document", e1);
+            }
+        }
+    }
+
+    private class ProjectRefreshAction extends AbstractAction {
+
+        private static final long serialVersionUID = 1944121660002532563L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ProjectRefreshAction() {
+            super(uimanager.getTranslation("Refresh"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-refresh"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Refresh_directories"));
+            putValue(ACTION_COMMAND_KEY, "ProjectsRefresh");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            refreshProjects();
+        }
+
+    }
+
+    private class ProjectRenameAction extends AbstractAction {
+
+        private static final long serialVersionUID = 7469858242486966790L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ProjectRenameAction() {
+            super(uimanager.getTranslation("Rename"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-rename"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Set_file_properties"));
+            putValue(ACTION_COMMAND_KEY, "Rename");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                scriptRename(getLauncherSelectedScript());
+            } catch (Exception e1) {
+                LOGGER.warn("Can't rename document", e1);
+            }
+        }
+    }
+
+    private class ProjectMoveAction extends AbstractAction {
+
+        private static final long serialVersionUID = -8857101021126773295L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ProjectMoveAction() {
+            super(uimanager.getTranslation("Move"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-move"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Move_files"));
+            putValue(ACTION_COMMAND_KEY, "Move");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                scriptMove(getLauncherSelectedScript());
+            } catch (Exception e1) {
+                LOGGER.warn("Can't move document", e1);
+            }
+        }
+    }
+
+    private class ProjectDeleteAction extends AbstractAction {
+
+        private static final long serialVersionUID = 9039455504757742743L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ProjectDeleteAction() {
+            super(uimanager.getTranslation("Delete"));
+            putValue(Action.SMALL_ICON, uimanager.getIcon("scripting-doc-remove"));
+            putValue(Action.SHORT_DESCRIPTION, uimanager.getTranslation("Delete_selected_script"));
+            putValue(ACTION_COMMAND_KEY, "Delete");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                scriptDelete(getLauncherSelectedScript(), false);
+            } catch (Exception e1) {
+                LOGGER.warn("Can't delete document", e1);
+            }
+        }
+    }
+
+    /**
+     * Instanciacion de un JComposer con todos sus elementos y acciones
+     *
+     * @param uimanager
+     */
+    public DefaultJScriptingComposer(final ScriptingUIManager uimanager) {
+        loader = this.getClass().getClassLoader();
+        this.uimanager = uimanager;
+        this.manager = uimanager.getManager();
+        synchronized(this.manager) {
+            initComponents();
+        }
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this;
+    }
+
+    @Override
+    public WindowManager getWindowManager() {
+        return ((DefaultScriptingUIManager) (this.uimanager)).getWindowManager();
+    }
+
+    @Override
+    public void setWindowManager(WindowManager windowsManager) {
+        ((DefaultScriptingUIManager) (this.uimanager)).setWindowManager(windowsManager);
+    }
+
+    private void initComponents() {
+
+        this.addAncestorListener(new AncestorListener() {
+
+            @Override
+            public void ancestorAdded(AncestorEvent event) {
+                ((DefaultScriptingUIManager) uimanager).setActiveComposer(DefaultJScriptingComposer.this);
+            }
+
+            @Override
+            public void ancestorRemoved(AncestorEvent event) {
+                ((DefaultScriptingUIManager) uimanager).setActiveComposer(null);
+            }
+
+            @Override
+            public void ancestorMoved(AncestorEvent event) {
+            }
+        });
+        SearchListener findReplaceSearchListener = new FindReplaceSearchListener();
+
+        findDialog = new FindDialog((Dialog) null, findReplaceSearchListener);
+        replaceDialog = new ReplaceDialog((Dialog) null, findReplaceSearchListener);
+        gotoDialog = new GoToDialog((Dialog) null);
+
+        SearchContext searchContext = findDialog.getSearchContext();
+        replaceDialog.setSearchContext(searchContext);
+
+        this.menuBar = new JMenuBar();
+        this.toolBar = new JToolBar();
+
+        this.menus = new LinkedHashMap<>();
+        this.tools = new LinkedHashMap<>();
+
+        String _File = this.uimanager.getTranslation("File");
+        String _Edit = this.uimanager.getTranslation("Edit");
+        String _Projects = this.uimanager.getTranslation("Projects");
+        String _Tools = this.uimanager.getTranslation("Tools");
+        String _Help = this.uimanager.getTranslation("Help");
+        String _View = this.uimanager.getTranslation("Show");
+
+        this.addMenu(_File, null);
+        this.addMenu(_File, new NewDocumentAction());
+        this.addMenu(_File, new NewFolderAction());
+        this.addMenuSeparator(_File);
+        this.addMenu(_File, new CloseDocumentAction());
+        this.addMenu(_File, new CloseAllAction());
+        this.addMenuSeparator(_File);
+        this.addMenu(_File, new RunAction());
+        this.addMenu(_File, new SaveAndRunAction());
+        this.addMenuSeparator(_File);
+        this.addMenu(_File, new SaveAction());
+        this.addMenuSeparator(_File);
+        this.addMenu(_File, new ExitAction());
+
+        this.addMenu(_Edit, null);
+        this.addMenu(_Edit, new CutAction());
+        this.addMenu(_Edit, new CopyAction());
+        this.addMenu(_Edit, new PasteAction());
+        this.addMenuSeparator(_Edit);
+        this.addMenu(_Edit, new SelectAllAction());
+        this.addMenuSeparator(_Edit);
+        this.addMenu(_Edit, new ShowFindDialogAction());
+        this.addMenu(_Edit, new ShowReplaceDialogAction());
+        this.addMenu(_Edit, new GoToLineAction());
+
+        this.addMenu(_View, null);
+        this.addMenu(_View, new ShowProjectsAction());
+        this.addMenu(_View, new ShowProblemsAction());
+        this.addMenu(_View, new ShowConsoleAction());
+
+        this.addMenu(_Projects, null);
+        this.addMenu(_Projects, new ProjectEditAction());
+        this.addMenuSeparator(_Projects);
+        this.addMenu(_Projects, new ProjectRefreshAction());
+        this.addMenuSeparator(_Projects);
+        this.addMenu(_Projects, new ProjectRenameAction());
+        this.addMenu(_Projects, new ProjectMoveAction());
+        this.addMenu(_Projects, new ProjectDeleteAction());
+
+        this.addMenu(_Tools, null);
+        this.addMenu(_Tools, new LauncherAction());
+        this.addMenuSeparator(_Tools);
+        this.addMenu(_Tools, new PackageScriptAction());
+
+        this.addMenu(_Help, null);
+        this.addMenu(_Help, new AboutAction());
+
+        this.addTool(new NewDocumentAction());
+        this.addTool(new SaveAction());
+        this.addTool(new CutAction());
+        this.addTool(new CopyAction());
+        this.addTool(new PasteAction());
+        this.addTool(new RunAction());
+        this.addTool(new SaveAndRunAction());
+
+        JTabbedPaneClosable tabbedPanelLeft = new JTabbedPaneClosable(uimanager);
+        JTabbedPaneClosable tabbedPanelBottom = new JTabbedPaneClosable(uimanager);
+        JTabbedPaneClosable tabbedPanelCenter = new JTabbedPaneClosable(uimanager);
+
+        tabbedPanelLeft.setTabPlacement(JTabbedPane.BOTTOM);
+        tabbedPanelCenter.setPreferredSize(new Dimension(500, 300));
+        tabbedPanelCenter.addChangeListener(new ChangeListener() {
+
+            @Override
+            public void stateChanged(ChangeEvent e) {
+                updateMenusAndTools();
+                try {
+                    ((ScriptUnitEditor)((JTabbedPane)e.getSource()).getSelectedComponent()).getJTextComponent().requestFocusInWindow();
+                } catch(Throwable th) {
+                    LOGGER.debug("Can't set focus in the editor", th);
+                }
+            }
+        });
+
+        this.dock = new DefaultDock(
+                tabbedPanelLeft,
+                tabbedPanelBottom,
+                tabbedPanelCenter
+        );
+        this.dock.addCloseListener(new ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                DockedPanel panel = (DockedPanel) e.getSource();
+                scriptClose(panel);
+            }
+        });
+        //tabbedPanelBottom.setPreferredSize(new Dimension(450, 100));
+
+        this.addProjectsPanel();
+        this.addConsolePanel();
+        this.addProblemsPanel();
+
+        this.dock.select(DOCKED_CONSOLE);
+        this.dock.select(DOCKED_PROJECTS);
+
+        JSplitPane centerPanel = new JSplitPane(
+                JSplitPane.VERTICAL_SPLIT,
+                tabbedPanelCenter,
+                tabbedPanelBottom
+        );
+        centerPanel.setResizeWeight(0.8);
+        centerPanel.setOneTouchExpandable(true);
+
+        mainPanel = new JSplitPane(
+                JSplitPane.HORIZONTAL_SPLIT,
+                tabbedPanelLeft,
+                centerPanel
+        );
+        mainPanel.setOneTouchExpandable(true);
+
+        statusBar = new DefaultStatusBar(uimanager);
+
+        updateMenusAndTools();
+
+        JPanel buttons = new JPanel();
+        buttons.setLayout(new BorderLayout());
+        buttons.add(BorderLayout.NORTH, this.menuBar);
+        buttons.add(BorderLayout.SOUTH, this.toolBar);
+
+        this.setLayout(new BorderLayout());
+        this.add(BorderLayout.NORTH, buttons);
+        this.add(BorderLayout.CENTER, mainPanel);
+        this.add(BorderLayout.SOUTH, statusBar.asJComponent());
+        this.setPreferredSize(new Dimension(800, 600));
+    }
+
+    public void addMenu(String text, Action action) {
+        String name;
+        if (action == null) {
+            name = String.format("Menu%x", new Date().getTime());
+        } else {
+            name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
+        }
+        this.menus.put(name, new ToolEntry(name, action, text));
+    }
+
+    public void addMenuSeparator(String text) {
+        String name = String.format("Sep%x", new Date().getTime());
+        this.menus.put(name, new ToolEntry(name, null, text + "/-"));
+    }
+
+    public void addTool(Action action) {
+        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
+        this.tools.put(name, new ToolEntry(name, action));
+    }
+
+    public void updateMenusAndTools() {
+
+        this.menuBar.removeAll();
+        this.toolBar.removeAll();
+        for (MenuEntry entry : this.uimanager.getComposerMenus()) {
+            this.addMenu(entry.getText(), entry.getAction());
+        }
+        for (Action action : this.uimanager.getComposerTools()) {
+            this.addTool(action);
+        }
+
+        MenuBarHelper menuBarHelper = new MenuBarHelper(menuBar);
+        for (ToolEntry entry : menus.values()) {
+            try {
+                JMenuItem menu = menuBarHelper.add(entry.getText(), entry.getAction(), this);
+                entry.setComponent(menu);
+            } catch(Throwable th) {
+                LOGGER.warn("Can't add entry '"+entry.getName()+"' to the toolbar.", th);
+            }
+        }
+
+        for (ToolEntry entry : tools.values()) {
+            try {
+                JButton button = new ButtonWithContext(entry.getAction());
+                this.toolBar.add(button);
+                entry.setComponent(button);
+            } catch(Throwable th) {
+                LOGGER.warn("Can't add entry '"+entry.getName()+"' to the toolbar.", th);
+            }
+            
+        }
+        this.menuBar.repaint();
+        this.toolBar.repaint();
+    }
+
+    public void addProblemsPanel() {
+        DockedPanel panel = this.dock.get(DOCKED_PROBLEMS);
+        if (panel != null) {
+            panel.select();
+            return;
+        }
+        final Problems problems = new DefaultProblems(this.uimanager);
+        problems.addListSelectionListener(new ListSelectionListener() {
+
+            @Override
+            public void valueChanged(ListSelectionEvent e) {
+                if (e.getValueIsAdjusting()) {
+                    return;
+                }
+                Problem row = problems.getSelect();
+                if (row != null) {
+                    JEditor editor;
+                    int lineno = row.getLineNumber();
+                    if( row.getResource() == null ) {
+                        editor = getCurrentEditor();
+                    } else {
+                        String id = row.getResource().getAbsolutePath();
+                        DockedPanel panel = getDock().get(id);
+                        if( panel == null ) {
+                            ScriptingBaseScript script = manager.getScript(row.getResource());
+                            scriptEdit(script);
+                            panel = getDock().get(id);
+                            if( panel == null ) {
+                                LOGGER.warn("Can't load script '"+id+"'.");
+                                return;
+                            }
+                        } 
+                        panel.select();
+                        editor = (JEditor) panel.getComponent();
+                    }
+                    if ( editor instanceof JCodeEditor) {
+                        ((JCodeEditor) editor).gotoline(lineno);
+                    }
+                }
+            }
+        });
+        this.dock.add(
+                DOCKED_PROBLEMS,
+                this.uimanager.getTranslation("Problems"),
+                problems,
+                Dock.DOCK_BOTTOM
+        );
+        this.dock.select(DOCKED_PROBLEMS);
+    }
+
+    public void addConsolePanel() {
+        DockedPanel panel = this.dock.get(DOCKED_CONSOLE);
+        if (panel != null) {
+            panel.select();
+            return;
+        }
+        DefaultJScriptingConsole console = new DefaultJScriptingConsole(true);
+        this.dock.add(
+                DOCKED_CONSOLE,
+                this.uimanager.getTranslation("Console"),
+                console,
+                Dock.DOCK_BOTTOM
+        );
+        this.dock.select(DOCKED_CONSOLE);
+    }
+
+    public void addProjectsPanel() {
+        DockedPanel panel = this.dock.get(DOCKED_PROJECTS);
+        if (panel != null) {
+            panel.select();
+            return;
+        }
+        JScriptingLauncher launcher = uimanager.createLauncher();
+        launcher.addDefaultActionListener(new ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                BrowserActionEvent e2 = (BrowserActionEvent) e;
+                switch (e.getID()) {
+                    case JScriptingBrowser.DEFAULT_ACTION:
+                        ScriptingUnit unit = e2.getUnit();
+                        if( unit instanceof ScriptingFolder ) {
+                            return;
+                        }
+                        if( uimanager.hasEditor(unit) ) {
+                            scriptEdit(unit);
+                        }
+                        break;
+                    case JScriptingBrowser.DROPDOWN_ACTION:
+                    case JScriptingBrowser.SELECTION_ACTION:
+                        break;
+                }
+            }
+        });
+        launcher.asJComponent().setPreferredSize(new Dimension(200, 450));
+
+        this.dock.add(
+                DOCKED_PROJECTS,
+                this.uimanager.getTranslation("Projects"),
+                launcher,
+                Dock.DOCK_LEFT
+        );
+        this.dock.select(DOCKED_PROJECTS);
+    }
+
+    @Override
+    public Problems getProblems() {
+        DockedPanel panel = this.dock.get(DOCKED_PROBLEMS);
+        if (panel == null) {
+            return null;
+        }
+        return (Problems) panel.getComponent();
+    }
+
+    @Override
+    public JScriptingLauncher getProjects() {
+        DockedPanel panel = this.dock.get(DOCKED_PROJECTS);
+        if (panel == null) {
+            return null;
+        }
+        return (JScriptingLauncher) panel.getComponent();
+    }
+
+    @Override
+    public Dock getDock() {
+        return dock;
+    }
+
+    @Override
+    public JScriptingConsole getConsole() {
+        DockedPanel panel = this.dock.get(DOCKED_CONSOLE);
+        if (panel == null) {
+            return null;
+        }
+        return (JScriptingConsole) panel.getComponent();
+    }
+
+    @Override
+    public void addChangeEditorListener(ChangeListener listener) {
+        if (this.changeEditorListeners == null) {
+            this.changeEditorListeners = new HashSet<>();
+        }
+        this.changeEditorListeners.add(listener);
+    }
+    
+    @Override
+    public void removeChangeEditorListener(ChangeListener listener) {
+        if (this.changeEditorListeners == null) {
+            return;
+        }
+        this.changeEditorListeners.remove(listener);
+    }
+
+    public void fireChangeEditor(ChangeEvent e) {
+        if (this.changeEditorListeners == null) {
+            return;
+        }
+        for (ChangeListener listener : this.changeEditorListeners) {
+            try {
+                listener.stateChanged(e);
+            } catch (Throwable th) {
+
+            }
+        }
+    }
+
+    private void createScriptPackage() {
+        I18nManager i18nManager = ToolsLocator.getI18nManager();
+        SwingInstallerManager installerManager = SwingInstallerLocator.getSwingInstallerManager();
+        PackageBuildder packager = installerManager.createPackagerPanel(
+                ScriptingManager.INSTALLER_PROVIDER_NAME,
+                manager.getRootUserFolder(),
+                manager.getPackagesFolder()
+        );
+        PackageInfo packageInfo = packager.getPackageInfo();
+        packageInfo.setArchitecture(PackageManager.ARCH.ALL);
+        packageInfo.setJavaVM(PackageManager.JVM.J1_7);
+        packageInfo.setOperatingSystem(PackageManager.OS.ALL);
+        packageInfo.setOfficial(false);
+        packageInfo.setState(PackageManager.STATE.TESTING);
+        packageInfo.setType(ScriptingManager.INSTALLER_PROVIDER_NAME);
+        Version version = ToolsLocator.getPackageManager().createVersion();
+        version.parse("1.0.0");
+        packageInfo.setVersion(version);
+        this.uimanager.showWindow(
+                (JPanel) packager.asJComponent(),
+                i18nManager.getTranslation("_Scripting_packager")
+        );
+    }
+
+//    private void setEditorSelection(String name, int line) {
+//        for (int i = 0; i < scriptEditors.getTabCount(); i++) {
+//
+//            if (((JEditor) scriptEditors.getComponent(i)).getScript().getId().equals(name)) {
+//                scriptEditors.setSelectedIndex(i);
+//
+//                JCodeEditor editor = ((JCodeEditor) scriptEditors.getComponent(i));
+//                editor.selectLine(line);
+//            }
+//        }xxxxxxxxxxxxxxxxxxxxxxxx
+//    }
+    public void addDefaultActionListener(ActionListener actionlistener) {
+        this.defaultActionlistener = actionlistener;
+    }
+
+    /**
+     * Funci�n para obtener el elemento seleccionado del Launcher
+     *
+     * @return Selected ScriptingUnit on the tree
+     */
+    private ScriptingUnit getLauncherSelectedScript() {
+        JScriptingBrowser browser = this.getCurrentBrowser();
+        ScriptingUnit unit = browser.getSelectedNode();
+        return unit;
+    }
+    
+    private JScriptingBrowser getCurrentBrowser() {
+        JScriptingLauncher launcher = this.getProjects();
+        JScriptingBrowser browser = launcher.getSelectedBrowser();
+        return browser;
+    }
+
+//    /**
+//     * Lanza la ejecuci�n de un ScriptingBaseScript
+//     *
+//     * @param unit
+//     */
+//    private void scriptExecute(ScriptingUnit unit) {
+//        if (unit instanceof ScriptingBaseScript) {
+//            ((ScriptingBaseScript) unit).run();
+//        }
+//    }
+
+    public void scriptEdit(ScriptingUnit unit) {
+        String id = unit.getFile().getAbsolutePath();
+        DockedPanel x = this.dock.get(id);
+        if (x != null) {
+            x.select();
+            return;
+        }
+        final JEditor editor = this.uimanager.createEditor(unit);
+        if (editor == null) {
+            JOptionPane.showMessageDialog(null, this.uimanager.getTranslation("Error_opening_in_edition_mode"), this.uimanager.getTranslation("Error_opening_in_edition_mode_title"), JOptionPane.INFORMATION_MESSAGE);
+            return;
+        }
+        final DockedPanel panel = this.dock.add(id, unit.getName(), editor, Dock.DOCK_CENTER);
+        panel.select();
+        editor.addChangeListener(new PropertyChangeListener() {
+
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                panel.setModified(true);
+                fireChangeEditor(new ChangeEvent(editor));
+            }
+        });
+        if (editor instanceof JCodeEditor) {
+            ((JCodeEditor) editor).addUpdateCaretPositionActionListener(new ActionListener() {
+
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    UpdateCaretPositionActionEvent event = (UpdateCaretPositionActionEvent) e;
+                    getStatusbar().setPosition(
+                            event.getLine(),
+                            event.getColumn()
+                    );
+                }
+            });
+        }
+        ScriptingUnit xx = editor.getUnit();
+        if (xx instanceof ScriptingScript ) {
+            ((ScriptingScript)xx).addObserver(this);
+        }
+    }
+
+    /**
+     * Ventana para creaci�n de nuevos ScriptingBaseScripts
+     *
+     * @throws Exception
+     *
+     */
+    public void scriptNew() throws Exception {
+        this.unitNew(false);
+    }
+
+    public void FolderNew() throws Exception {
+        this.unitNew(true);
+    }
+
+    public void unitNew(boolean folder) throws Exception {
+        JNewScriptModel model = new JNewScriptModel(manager);
+        model.setSelectionPath(this.getCurrentBrowser().getSelectionPath());
+        JDialogContent dialog = new JDialogContent(
+                uimanager,
+                "document-new",
+                this.uimanager.getTranslation("New_Script"),
+                this.uimanager.getTranslation("New_Script_Description"),
+                new JNewScriptPanel(uimanager, model,folder)
+        );
+        dialog.showDialog();
+        if (model.getAction() == JNewScriptModel.ACTION_ACCEPT) {
+            model.validate();
+            ScriptingUnit unit = this.manager.createUnit(
+                    model.getType(),
+                    manager.getFolder(model.getPath()),
+                    model.getName(),
+                    model.getLanguage()
+            );
+            if (unit instanceof ScriptingBaseScript) {
+                this.scriptEdit((ScriptingBaseScript) unit);
+            }
+
+            this.refreshProjects();
+        }
+    }
+
+
+    public void scriptClose(DockedPanel panel) {
+        if (!panel.isModified()) {
+            panel.remove();
+            return;
+        }
+        panel.select();
+        I18nManager i18nManager = ToolsLocator.getI18nManager();
+        int respuesta = JOptionPane.showConfirmDialog(
+                this,
+                i18nManager.getTranslation("_The_script_XscriptnameX_is_modified",
+                        new String[]{panel.getTitle()})
+                + "\n\n"
+                + i18nManager.getTranslation("_Do_you_want_to_save_changes_XquestionX"),
+                i18nManager.getTranslation("_Save_changes_XquestionX"),
+                JOptionPane.YES_NO_CANCEL_OPTION
+        );
+        switch (respuesta) {
+            case JOptionPane.YES_OPTION:
+                currentScriptSave();
+                panel.remove();
+                break;
+            case JOptionPane.NO_OPTION:
+                panel.remove();
+                break;
+            default:
+            case JOptionPane.CANCEL_OPTION:
+                break;
+        }
+    }
+
+    public void scriptMove(final ScriptingUnit theUnit) throws Exception {
+        if (theUnit.getParent() == null) {
+            JOptionPane.showMessageDialog(null, "Please, select first the file to move on the tree directory", "Error", JOptionPane.ERROR_MESSAGE);
+        } else {
+            JMoveScriptModel model = new JMoveScriptModel(manager, theUnit);
+            JDialogContent dialog = new JDialogContent(
+                    uimanager,
+                    "format-indent-more",
+                    this.uimanager.getTranslation("Move") + " '" + theUnit.getName() + "' " + this.uimanager.getTranslation("script_filesystem"),
+                    this.uimanager.getTranslation("move_desc"),
+                    new JMoveScriptPanel(uimanager, model)
+            );
+            dialog.showDialog();
+            if (model.getAction() == JMoveScriptModel.ACTION_ACCEPT) {
+                model.validate();
+                ScriptingFolder folderDest = manager.getFolder(model.getMoveTo());
+                if (model.getUnit().move(folderDest)) {
+                    JOptionPane.showMessageDialog(null,
+                            this.uimanager.getTranslation("Moving_succesfully"),
+                            this.uimanager.getTranslation("Success"), JOptionPane.INFORMATION_MESSAGE);
+                    this.refreshProjects();
+                } else {
+                    JOptionPane.showMessageDialog(null,
+                            this.uimanager.getTranslation("Error_moving"),
+                            this.uimanager.getTranslation("Error"), JOptionPane.ERROR_MESSAGE);
+                }
+            }
+        }
+
+    }
+
+    public void scriptRename(ScriptingUnit theUnit) throws Exception {
+        if (theUnit.getParent() == null) {
+            JOptionPane.showMessageDialog(null,
+                    this.uimanager.getTranslation("Select_first"),
+                    this.uimanager.getTranslation("Error"), JOptionPane.ERROR_MESSAGE);
+        } else {
+            JRenameModel model = new JRenameModel(manager, theUnit);
+            JDialogContent dialog = new JDialogContent(
+                    uimanager,
+                    "preferences-system",
+                    this.uimanager.getTranslation("Rename") + " '" + theUnit.getName() + "' " + this.uimanager.getTranslation("script_filesystem"),
+                    this.uimanager.getTranslation("rename_desc"),
+                    new JRenamePanel(uimanager, model)
+            );
+            dialog.showDialog();
+            if (model.getAction() == JRenameModel.ACTION_ACCEPT) {
+                model.validate();
+                ScriptingUnit unit = model.getUnit();
+                if (!model.getNewName().equals(unit.getId())) {
+                    if (unit.rename(model.getNewName())) {
+                        JOptionPane.showMessageDialog(null,
+                                this.uimanager.getTranslation("Rename_succesfully"),
+                                this.uimanager.getTranslation("Success"), JOptionPane.INFORMATION_MESSAGE);
+                        this.refreshProjects();
+                    } else {
+                        JOptionPane.showMessageDialog(null,
+                                this.uimanager.getTranslation(this.uimanager.getTranslation("Error_renaming")),
+                                this.uimanager.getTranslation("Error"), JOptionPane.ERROR_MESSAGE);
+                    }
+                    if (unit instanceof ScriptingScript) {
+                        ((ScriptingScript) unit).save();
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public JPanel getAboutUsDialog() {
+        return new JDialogContent(uimanager,
+                "system-users",
+                this.uimanager.getTranslation("About_us"),
+                this.uimanager.getTranslation("About_us_title"),
+                new JDefaultDialog(uimanager, this, uimanager.getAboutManager().getAboutPanel()));
+    }
+
+    public void scriptDelete(final ScriptingUnit unit, boolean isRecursive) {
+        int n = 0;
+        if (!isRecursive) {
+            n = JOptionPane.showConfirmDialog(
+                    this.getRootPane(),
+                    this.uimanager.getTranslation("Delete_all_message"),
+                    this.uimanager.getTranslation("Delete_all_title"),
+                    JOptionPane.YES_NO_OPTION);
+        }
+        if (n == 0) {
+            //Si es un folder borramos recursivamente sus subdirectorios
+            if (unit instanceof ScriptingFolder) {
+                List<ScriptingUnit> subunits
+                        = ((ScriptingFolder) unit).getUnits();
+                Iterator<ScriptingUnit> it = subunits.iterator();
+                while (it.hasNext()) {
+                    ScriptingUnit subunit = it.next();
+                    scriptDelete(subunit, true);
+                }
+            }
+            // Por �ltimo borramos el nodo seleccionado
+            unit.getParent().remove(unit);
+            this.refreshProjects();
+
+        }
+    }
+
+    /**
+     * Funci�n que cierra la pesta�a de edici�n actual
+     *
+     */
+    public void currentScriptClose() {
+        DockedPanel panel = this.dock.getSelected(Dock.DOCK_CENTER);
+        if (panel == null) {
+            return;
+        }
+        scriptClose(panel);
+    }
+
+    /**
+     * Close all editor tabs of the composer
+     */
+    public void closeAllScripts() {
+        List<DockedPanel> modifiedPanels = new ArrayList<>();
+        List<DockedPanel> toRemove = new ArrayList<>();
+
+        for (DockedPanel panel : this.dock) {
+            if (Dock.DOCK_CENTER.equals(panel.getAlign())) {
+                if (panel.isModified()) {
+                    modifiedPanels.add(panel);
+                } else {
+                    toRemove.add(panel);
+                }
+            }
+        }
+        if (modifiedPanels.isEmpty() && toRemove.isEmpty()) {
+            return;
+        }
+        int action = JOptionPane.showConfirmDialog(
+                this,
+                this.uimanager.getTranslation("projects_modified"),
+                this.uimanager.getTranslation("projects_modified_title"),
+                JOptionPane.YES_NO_CANCEL_OPTION
+        );
+        switch (action) {
+            case JOptionPane.CANCEL_OPTION:
+                return;
+            case JOptionPane.YES_OPTION:
+                for (DockedPanel panel : modifiedPanels) {
+                    JEditor editor = (JEditor) panel.getComponent();
+                    if (editor.getUnit()!= null) {
+                        editor.getUnit().setSaved(true);
+                    }
+                    editor.save();
+                    toRemove.add(panel);
+                }
+                break;
+            case JOptionPane.NO_OPTION:
+                for (DockedPanel panel : modifiedPanels) {
+                    JEditor editor = (JEditor) panel.getComponent();
+                    if (editor.getUnit() != null) {
+                        editor.getUnit().setSaved(true);
+                    }
+                    toRemove.add(panel);
+                }
+        }
+        if( toRemove.isEmpty() ) {
+            return;
+        }
+        for (DockedPanel panel : toRemove) {
+            panel.remove();
+        }
+    }
+
+    /**
+     * Funci�n que ejecuta el ScriptingBaseScript de la pesta�a actual
+     *
+     */
+    @SuppressWarnings("UseSpecificCatch")
+    public void currentScriptExecute() {
+        ScriptingScript script = this.getCurrentScript();
+        if (script != null) {
+            Problems problems = this.getProblems();
+            if (problems != null) {
+                problems.removeAll();
+            }
+            JScriptingConsole console = this.getConsole();
+            if (console == null) {
+                addConsolePanel();
+            } else {
+                console.clear();
+            }
+            script.addObserver(this);
+            script.addStdoutWriter(this.getConsole().getOutputWriter());
+            script.addStderrWriter(this.getConsole().getErrorsWriter());
+            try {
+                script.compile();
+                script.runAsTask(null);
+            } catch (Throwable e) {
+                LOGGER.info("Can't execute script", e);
+            }
+        }
+    }
+
+    /**
+     * Funciones de 'cortar', 'copiar', 'pegar' y 'seleccionar todo' para los
+     * JEditors
+     *
+     */
+    public void currentScriptCopy() {
+        DockedPanel panel = this.dock.getSelected(Dock.DOCK_CENTER);
+        if (panel.getComponent().asJComponent() instanceof JCodeEditor) {
+            JCodeEditor editor = (JCodeEditor) panel.getComponent().asJComponent();
+            editor.getJTextComponent().copy();
+        }
+    }
+
+    public void currentScriptCut() {
+        DockedPanel panel = this.dock.getSelected(Dock.DOCK_CENTER);
+        if (panel.getComponent().asJComponent() instanceof JCodeEditor) {
+            JCodeEditor editor = (JCodeEditor) panel.getComponent().asJComponent();
+            editor.getJTextComponent().cut();
+            panel.setModified(true);
+        }
+    }
+
+    public void currentScriptPaste() {
+        DockedPanel panel = this.dock.getSelected(Dock.DOCK_CENTER);
+        if (panel.getComponent().asJComponent() instanceof JCodeEditor) {
+            JCodeEditor editor = (JCodeEditor) panel.getComponent().asJComponent();
+            editor.getJTextComponent().paste();
+            panel.setModified(true);
+        }
+    }
+
+    public void currentScriptSelectAll() {
+        DockedPanel panel = this.dock.getSelected(Dock.DOCK_CENTER);
+        if (panel.getComponent().asJComponent() instanceof JCodeEditor) {
+            JCodeEditor editor = (JCodeEditor) panel.getComponent().asJComponent();
+            editor.getJTextComponent().selectAll();
+        }
+    }
+
+    /**
+     * Funci�n para el guardado del ScriptingBaseScript de la pesta�a actual
+     *
+     */
+    public void currentScriptSave() {
+        DockedPanel panel = this.dock.getSelected(Dock.DOCK_CENTER);
+        if (panel.getComponent().asJComponent() instanceof JEditor) {
+            JEditor editor = (JEditor) panel.getComponent().asJComponent();
+            editor.save();
+            panel.setModified(false);
+        }
+    }
+
+    @Override
+    public JEditor getCurrentEditor() {
+        DockedPanel panel = this.dock.getSelected(Dock.DOCK_CENTER);
+        if (panel == null) {
+            return null;
+        }
+        if (panel.getComponent().asJComponent() instanceof JEditor) {
+            return (JEditor) panel.getComponent().asJComponent();
+        }
+        return null;
+    }
+
+    @Override
+    public ScriptingScript getCurrentScript() {
+        JEditor editor = this.getCurrentEditor();
+        if (editor == null) {
+            return null;
+        }
+        ScriptingUnit unit = editor.getUnit();
+        if( unit instanceof ScriptingScript ) {
+            return (ScriptingScript) unit;
+        }
+        return null;
+    }
+
+    private RSyntaxTextArea getCurrentRSyntaxTextArea() {
+        JEditor editor = getCurrentEditor();
+        if (editor instanceof JCodeEditor) {
+            JTextComponent textComponent = ((JCodeEditor) editor).getJTextComponent();
+            if (textComponent instanceof RSyntaxTextArea) {
+                return (RSyntaxTextArea) textComponent;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void refreshProjects() {
+        try {
+            this.getProjects().refresh();
+        } catch (Exception ex) {
+            // Ignore
+        }
+    }
+
+    @Override
+    public StatusBar getStatusbar() {
+        return this.statusBar;
+    }
+
+    /**
+     *
+     * @param e
+     */
+    @Override
+    public void actionPerformed(ActionEvent e) {
+
+        if (e instanceof UpdateCaretPositionActionEvent) {
+            UpdateCaretPositionActionEvent e2 = (UpdateCaretPositionActionEvent) e;
+
+            if (e2.hasLineAndColumn()) {
+                this.getStatusbar().setPosition(e2.getLine(), e2.getColumn());
+            } else {
+                this.getStatusbar().setPosition(0, 0);
+            }
+        }
+    }
+
+    @Override
+    public void update(final Observable observable, final Object notification) {
+        if (!SwingUtilities.isEventDispatchThread()) {
+            SwingUtilities.invokeLater(new Runnable() {
+                @Override
+                public void run() {
+                    update(observable, notification);
+                }
+            });
+            return;
+        }
+        if (notification instanceof ScriptingNotification) {
+            ScriptingNotification e = (ScriptingNotification) notification;
+
+            if (e.getException() instanceof CompileErrorException) {
+                CompileErrorException ce = (CompileErrorException) e.getException();
+                Problems problems = this.getProblems();
+                if (problems != null) {
+                    problems.add("Error", ce);
+                    this.dock.select(DOCKED_PROBLEMS);
+                }
+
+            } else if (e.getException() instanceof ExecuteErrorException) {
+                ExecuteErrorException ee = (ExecuteErrorException) e.getException();
+                Problems problems = this.getProblems();
+                if (problems != null) {
+                    problems.add("Error",ee);
+                    this.dock.select(DOCKED_PROBLEMS);
+                }
+                JScriptingConsole console = this.getConsole();
+                if (console != null) {
+                    console.append(ee.getMessage(), Color.RED.darker());
+                    ee.printStackTrace(console.errors());
+                }
+
+            } else {
+                Exception ex = e.getException();
+                Problems problems = this.getProblems();
+                if (problems != null) {
+                    problems.add("Error",ex); 
+                    this.dock.select(DOCKED_PROBLEMS);
+                }
+                JScriptingConsole console = this.getConsole();
+                if (console != null) {
+                    console.append(ex.getMessage(), Color.RED.darker());
+                    ex.printStackTrace(console.errors());
+                }
+            }
+        }
+    }
+
+    public void closeWindow() {
+        this.setVisible(false);
+    }
+
+    private static class DefaultStatusBar extends JPanel implements StatusBar {
+
+        private static final long serialVersionUID = -6135634992327170084L;
+
+        private JLabel message;
+        private JLabel position;
+        private final ScriptingUIManager uimanager;
+
+        public DefaultStatusBar(ScriptingUIManager uimanager) {
+            this.uimanager = uimanager;
+            this.initComponents();
+        }
+
+        private void initComponents() {
+            this.message = new JLabel(this.uimanager.getTranslation("Welcome_message"));
+            this.position = new JLabel("Line 0:0");
+
+            this.setLayout(new BorderLayout());
+
+            this.add(this.message, BorderLayout.WEST);
+            this.add(this.position, BorderLayout.EAST);
+        }
+
+        @Override
+        public void clear() {
+            this.message.setText("");
+        }
+
+        @Override
+        public void message(String message) {
+            this.message.setText(message);
+        }
+
+        @Override
+        public void setPosition(int line) {
+            this.setPosition(line, -1);
+        }
+
+        @Override
+        public void setPosition(int line, int column) {
+            if (line < 0) {
+                this.position.setText("");
+                return;
+            }
+            if (column < 0) {
+                this.position.setText(this.uimanager.getTranslation("Line") + " " + line + ":0");
+            } else {
+                this.position.setText(this.uimanager.getTranslation("Line") + " " + line + ":" + column);
+            }
+        }
+
+        @Override
+        public JComponent asJComponent() {
+            return this;
+        }
+    }
+
+    public static class JTabbedPaneClosable extends JTabbedPane {
+
+        private static final long serialVersionUID = -3995298424891579555L;
+
+        private final ActionListenerSupport closeTabListeners;
+        private ScriptingUIManager uimanager;
+
+        private class TabTitleComponent extends JPanel {
+
+            private static final long serialVersionUID = -1061417669527944341L;
+            private final JLabel label;
+            private final JButton button;
+            private boolean changed = false;
+            private final Font fontNormal;
+            private final Font fontBold;
+
+            @SuppressWarnings("OverridableMethodCallInConstructor")
+            public TabTitleComponent(String title, final ActionListener onclose) {
+                this.setOpaque(true);
+                this.label = new JLabel(title + " ");
+                this.label.setOpaque(true);
+                this.label.setBackground(UIManager.getColor("TabbedPane.tabAreaBackground"));
+                this.label.setVerticalTextPosition(SwingConstants.CENTER);
+                this.fontNormal = this.label.getFont();
+                this.fontBold = new Font(this.fontNormal.getFontName(), Font.BOLD, this.fontNormal.getSize());
+
+                this.button = new JButton();
+                this.button.setText("");
+                this.button.setToolTipText(uimanager.getTranslation("Close_tab"));
+                this.button.setBackground(UIManager.getColor("TabbedPane.tabAreaBackground"));
+                this.button.setBorder(BorderFactory.createEmptyBorder());
+                this.button.setBorderPainted(false);
+                this.button.setFocusPainted(false);
+                this.button.setContentAreaFilled(false);
+                this.button.setCursor(new Cursor(Cursor.HAND_CURSOR));
+                this.button.setRolloverEnabled(true);
+                this.button.setIcon(uimanager.getIcon("scripting-tabclose-inactive"));
+                this.button.setRolloverIcon(uimanager.getIcon("scripting-tabclose-active"));
+                this.button.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent ae) {
+                        ae.setSource(TabTitleComponent.this);
+                        onclose.actionPerformed(ae);
+                    }
+                });
+                this.setLayout(new BorderLayout());
+                this.add(this.label, BorderLayout.CENTER);
+                this.add(this.button, BorderLayout.EAST);
+            }
+
+            public void setTitle(String title) {
+                this.label.setText(title);
+            }
+
+            public String getTitle() {
+                return this.label.getText();
+            }
+
+            public void setChanged(boolean changed) {
+                if (changed) {
+                    this.label.setFont(this.fontBold);
+                } else {
+                    this.label.setFont(this.fontNormal);
+                }
+                this.changed = changed;
+            }
+
+            public boolean isChanged() {
+                return this.changed;
+            }
+        }
+
+        public JTabbedPaneClosable(ScriptingUIManager uimanager) {
+            super();
+            this.uimanager = uimanager;
+            this.closeTabListeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
+        }
+
+        @Override
+        public String getTitleAt(int index) {
+            TabTitleComponent title = (TabTitleComponent) this.getTabComponentAt(index);
+            if (title == null) {
+                return null;
+            }
+            return title.getTitle();
+        }
+
+        @Override
+        public void setTitleAt(int index, String title) {
+            TabTitleComponent titleComponent = (TabTitleComponent) this.getTabComponentAt(index);
+            titleComponent.setTitle(title);
+        }
+
+        @Override
+        public void addTab(String title, java.awt.Component component) {
+            super.addTab(null, component);
+            int index = getTabCount() - 1;
+            TabTitleComponent tabcomponent = new TabTitleComponent(title, new ActionListener() {
+
+                @Override
+                public void actionPerformed(ActionEvent ae) {
+                    TabTitleComponent tabTitleComponent = (TabTitleComponent) ae.getSource();
+                    int index = indexOfTabComponent(tabTitleComponent);
+                    setSelectedIndex(index);
+                    ae.setSource(JTabbedPaneClosable.this);
+                    closeTabListeners.fireActionEvent(ae);
+                }
+            });
+            super.setTabComponentAt(index, tabcomponent);
+        }
+
+        public void addCloseTabListener(ActionListener remove) {
+            this.closeTabListeners.addActionListener(remove);
+        }
+
+        public void removeCloseTabListener(ActionListener remove) {
+            this.closeTabListeners.removeActionListener(remove);
+        }
+
+        public ActionListener[] getCloseTabListeners() {
+            return this.closeTabListeners.getActionListeners();
+        }
+
+        public boolean isTabModified(int index) {
+            TabTitleComponent comp = (TabTitleComponent) this.getTabComponentAt(index);
+            if (comp == null) {
+                return false;
+            }
+            return comp.isChanged();
+        }
+
+        public void setTabModified(int index, boolean changed) {
+            TabTitleComponent comp = (TabTitleComponent) this.getTabComponentAt(index);
+            if (comp != null) {
+                comp.setChanged(changed);
+            }
+        }
+    }
+
+    public static class DefaultProblems extends JPanel implements Problems {
+
+        private static final long serialVersionUID = 7728033081188167969L;
+
+        private static final int COLUMN_TYPE = 0;
+        private static final int COLUMN_MESSAGE = 1;
+        private static final int COLUMN_RESOURCE = 2;
+        private static final int COLUMN_LOCATION = 3;
+        private static final int NUM_COLUMNS = 4;
+
+        private JTable table;
+        private ProblemsTableMode tableModel;
+        private final ScriptingUIManager uimanager;
+        private Set<ListSelectionListener> selectionListeners; 
+
+        public static class ProblemsTableMode extends DefaultTableModel implements TableModel {
+            private static final long serialVersionUID = -3294067602561419422L;
+
+            public static class DefaultProblem implements Problem {
+
+                String[] row;
+                private File resource;
+
+                public DefaultProblem() {
+                    this.row = new String[NUM_COLUMNS];
+                }
+
+                public DefaultProblem(String[] row) {
+                    this.row = row;
+                }
+
+                public DefaultProblem(String type, String message, String resourceName, String location, File resource) {
+                    String[] theRow = new String[NUM_COLUMNS];
+                    theRow[COLUMN_TYPE] = type;
+                    theRow[COLUMN_MESSAGE] = message;
+                    theRow[COLUMN_RESOURCE] = resourceName;
+                    theRow[COLUMN_LOCATION] = location;
+                    this.resource = resource;
+                    this.row = theRow;
+                }
+
+                public String get(int index) {
+                    return row[index];
+                }
+
+                public String getValue(int index) {
+                    return row[index];
+                }
+
+                public void setValue(int index, String value) {
+                    row[index] = value;
+                }
+
+                @Override
+                public String getType() {
+                    return this.row[COLUMN_TYPE];
+                }
+
+                @Override
+                public String getMessage() {
+                    return this.row[COLUMN_MESSAGE];
+                }
+
+                @Override
+                public String getResourceName() {
+                    return this.row[COLUMN_RESOURCE];
+                }
+
+                @Override
+                public File getResource() {
+                    return this.resource;
+                }
+
+                @Override
+                @SuppressWarnings("UseSpecificCatch")
+                public int getLineNumber() {
+                    try {
+                        String[] lineAndColumn = this.row[COLUMN_LOCATION].split(":");
+                        if (lineAndColumn.length > 0) {
+                            int lineno = Integer.parseInt(lineAndColumn[0].trim());
+                            return lineno;
+                        }
+                    } catch (Exception e) {
+                        // Do nothing
+                    }
+                    return -1;
+                }
+
+            }
+            private final ScriptingUIManager uimanager;
+            private List<DefaultProblem> data;
+            private String[] columnNames;
+
+            public ProblemsTableMode(ScriptingUIManager uimanager) {
+                this.uimanager = uimanager;
+                this.columnNames = new String[]{
+                    this.uimanager.getTranslation("Category"),
+                    this.uimanager.getTranslation("Description"),
+                    this.uimanager.getTranslation("Resource"),
+                    this.uimanager.getTranslation("Location")
+                };
+
+            }
+            
+            private List<DefaultProblem> getData() {
+                if( this.data == null ) {
+                    this.data = new ArrayList<>();
+                }
+                return this.data;
+            }
+
+            public void add(DefaultProblem row) {
+                this.getData().add(row);
+                this.fireTableDataChanged();
+            }
+
+            private void add(String type, String message, String resourceName, String location, File resource) {
+                DefaultProblem problem = new DefaultProblem(type, message, resourceName, location, resource);
+                this.add(problem);
+            }
+
+            @Override
+            public int getRowCount() {
+                return this.getData().size();
+            }
+
+            @Override
+            public int getColumnCount() {
+                return NUM_COLUMNS;
+            }
+
+            @Override
+            public String getColumnName(int columnIndex) {
+                return columnNames[columnIndex];
+            }
+
+            @Override
+            public Class<?> getColumnClass(int columnIndex) {
+                return String.class;
+            }
+
+            @Override
+            public boolean isCellEditable(int rowIndex, int columnIndex) {
+                return false;
+            }
+
+            @Override
+            public Object getValueAt(int rowIndex, int columnIndex) {
+                return this.getData().get(rowIndex).get(columnIndex);
+            }
+            
+            public Problem getProblem(int rowIndex) {
+                return this.getData().get(rowIndex);
+            }
+
+            @Override
+            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
+                this.getData().get(rowIndex).setValue(columnIndex, (String) aValue);
+            }
+
+            public void removeAll() {
+                this.getData().clear();
+            }
+        }
+
+        public DefaultProblems(ScriptingUIManager uimanager) {
+            this.uimanager = uimanager;
+            this.initComponents();
+        }
+
+        private void initComponents() {
+            this.selectionListeners = new HashSet<>();
+            tableModel = new ProblemsTableMode(this.uimanager);
+            table = new JTable(tableModel);
+            table.getColumnModel().getColumn(1).setPreferredWidth(300);
+
+            table.setRowSelectionAllowed(true);
+            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+            JScrollPane scrollProblems = new JScrollPane(table);
+            scrollProblems.setAutoscrolls(true);
+
+            this.setLayout(new BorderLayout());
+            this.add(scrollProblems, BorderLayout.CENTER);
+            
+            // Si ya hay seleccionada una linea y vuelvo a clickar sobre ella 
+            // para que me lleve a la linea del editor que toque, con el
+            // addSelectionListener no me vuelve a lanzar el evento, asi que
+            // me apalanco en el mouseClicked tambien.
+            table.addMouseListener(new MouseAdapter(){
+                @Override
+                public void mouseClicked(MouseEvent evnt) {
+                    if (evnt.getClickCount() == 1) {
+                        fireSelectionListeners();
+                     }
+                 }
+            });
+        }
+
+        @Override
+        public void addListSelectionListener(ListSelectionListener listener) {
+            this.table.getSelectionModel().addListSelectionListener(listener);
+            this.selectionListeners.add(listener);
+        }
+
+        private void fireSelectionListeners() {
+            int row = this.table.getSelectedRow();
+            for( ListSelectionListener listener : this.selectionListeners ) {
+                try {
+                    listener.valueChanged(new ListSelectionEvent(this, row, row, false));
+                } catch(Exception th) {
+                    
+                }
+            }
+        }
+        
+        @Override
+        public void removeAll() {
+            this.tableModel.removeAll();
+            this.table.updateUI();
+        }
+
+        @Override
+        public void add(String type, String message, String resource, String location) {
+            this.tableModel.add(type, message, resource, location, null);
+        }
+
+        @Override
+        public void add(String type, String message, String resource, int line, int column) {
+            this.add(type, message, resource, line + ":" + column);
+        }
+        
+        public void add(String type, String message, String resourceName, int line, int column, File resource) {
+            this.tableModel.add(type, message, resourceName, line + ":" + column, resource);
+        }
+                
+        @Override
+        public void add(String type, Exception e) {
+            if (e  instanceof ScriptingErrorException) {
+                ScriptingErrorException se = (ScriptingErrorException) e;
+                    this.add(
+                        "Error",
+                        se.getMessage(),
+                        se.getScriptName(),
+                        se.getLineNumber(),
+                        se.getColumnNumber(),
+                        se.getScriptFile()
+                    );
+
+            } else {
+                    this.add("Error", 
+                        "Error",
+                        e.getMessage(),
+                        null
+                    );
+            }            
+        }
+
+        @Override
+        public Problem getSelect() {
+            int row = this.table.getSelectedRow();
+            if (row < 0) {
+                return null;
+            }
+            return this.get(row);
+        }
+
+        @Override
+        public int getCount() {
+            return this.tableModel.getRowCount();
+        }
+
+        @Override
+        public Problem get(int row) {
+            return this.tableModel.getProblem(row);
+        }
+
+        @Override
+        public JComponent asJComponent() {
+            return this;
+        }
+
+    }
+
+    public static class DefaultDock extends JPanel implements Dock {
+
+        private static final long serialVersionUID = 4899734277977456625L;
+
+        public class DefaultDockedPanel implements DockedPanel {
+
+            String id;
+            String title;
+            Component component;
+            private final String align;
+
+            public DefaultDockedPanel(String id, String title, Component component, String align) {
+                this.id = id;
+                this.title = title;
+                this.component = component;
+                this.align = align;
+            }
+
+            @Override
+            public String getId() {
+                return this.id;
+            }
+
+            @Override
+            public String getAlign() {
+                return this.align;
+            }
+
+            @Override
+            public Component getComponent() {
+                return this.component;
+            }
+
+            @Override
+            public String getTitle() {
+                return this.title;
+            }
+
+            @Override
+            public boolean isModified() {
+                return getModified(this);
+            }
+
+            @Override
+            public void setModified(boolean modified) {
+                DefaultDock.this.setModified(this, modified);
+            }
+
+            @Override
+            public void remove() {
+                DefaultDock.this.remove(this.getId());
+            }
+
+            @Override
+            public void select() {
+                DefaultDock.this.select(this.getId());
+            }
+        }
+
+        private final Map<String, Dock.DockedPanel> panels;
+        private final JTabbedPaneClosable tabbedPanelLeft;
+        private final JTabbedPaneClosable tabbedPanelBottom;
+        private final JTabbedPaneClosable tabbedPanelCenter;
+        private Set<ActionListener> closeListeners;
+        private Set<ActionListener> activePanelListeners;
+
+        public DefaultDock(JTabbedPaneClosable tabbedPanelLeft, JTabbedPaneClosable tabbedPanelBottom, JTabbedPaneClosable tabbedPanelCenter) {
+            this.panels = new HashMap<>();
+            this.tabbedPanelBottom = tabbedPanelBottom;
+            this.tabbedPanelLeft = tabbedPanelLeft;
+            this.tabbedPanelCenter = tabbedPanelCenter;
+
+            ActionListener onCloseTab = new ActionListener() {
+
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    JTabbedPaneClosable tabbedPanel = (JTabbedPaneClosable) e.getSource();
+                    java.awt.Component component = tabbedPanel.getSelectedComponent();
+                    if (component != null) {
+                        DockedPanel panel = getDockedPanel(component);
+                        if (panel != null) {
+                            fireCloseListener(new ActionEvent(panel, 0, ACTION_CLOSE_PANEL));
+                        }
+//                        panels.remove(panel.getId());
+//                        tabbedPanel.remove(panel.getComponent().asJComponent());
+                    }
+                }
+            };
+            ChangeListener onChangeTab = new ChangeListener() {
+
+                @Override
+                public void stateChanged(ChangeEvent e) {
+                    
+                    fireChangeListener(new ActionEvent(DefaultDock.this, 0, ACTION_ACTIVATE_PANEL));
+                }
+            };
+            this.tabbedPanelCenter.addChangeListener(onChangeTab);
+            this.tabbedPanelBottom.addChangeListener(onChangeTab);
+            this.tabbedPanelLeft.addChangeListener(onChangeTab);
+            
+            this.tabbedPanelBottom.addCloseTabListener(onCloseTab);
+            this.tabbedPanelLeft.addCloseTabListener(onCloseTab);
+            this.tabbedPanelCenter.addCloseTabListener(onCloseTab);
+
+        }
+
+        /**
+         *
+         * @param listener
+         */
+        @Override
+        public void addCloseListener(ActionListener listener) {
+            if (this.closeListeners == null) {
+                this.closeListeners = new HashSet<>();
+            }
+            this.closeListeners.add(listener);
+        }
+        
+        @Override
+        public void removeCloseListener(ActionListener listener) {
+            if (this.closeListeners == null) {
+                return;
+            }
+            this.closeListeners.remove(listener);
+        }
+
+        @Override
+        public void addActivateListener(ActionListener listener) {
+            if (this.activePanelListeners == null) {
+                this.activePanelListeners = new HashSet<>();
+            }
+            this.activePanelListeners.add(listener);
+        }
+        
+        @Override
+        public void removeActivateListener(ActionListener listener) {
+            if (this.activePanelListeners == null) {
+                return;
+            }
+            this.activePanelListeners.remove(listener);
+        }
+                
+
+        public void fireCloseListener(ActionEvent e) {
+            if (this.closeListeners == null) {
+                return;
+            }
+            for (ActionListener listener : this.closeListeners) {
+                try {
+                    listener.actionPerformed(e);
+                } catch (Exception ex) {
+
+                }
+            }
+        }
+
+        public void fireChangeListener(ActionEvent e) {
+            if (this.activePanelListeners == null) {
+                return;
+            }
+            for (ActionListener listener : this.activePanelListeners) {
+                try {
+                    listener.actionPerformed(e);
+                } catch (Exception ex) {
+
+                }
+            }
+        }
+
+        private JTabbedPaneClosable getTabbedPanel(String align) {
+            switch (align) {
+                case Dock.DOCK_LEFT:
+                    return this.tabbedPanelLeft;
+                case Dock.DOCK_CENTER:
+                    return this.tabbedPanelCenter;
+                default:
+                case Dock.DOCK_BOTTOM:
+                    return this.tabbedPanelBottom;
+            }
+        }
+
+        private DockedPanel getDockedPanel(java.awt.Component component) {
+            for (DockedPanel panel : this.panels.values()) {
+                if (panel.getComponent().asJComponent() == component) {
+                    return panel;
+                }
+            }
+            return null;
+        }
+
+        private int getIndex(DockedPanel panel) {
+            final JTabbedPaneClosable tabbedPanel = getTabbedPanel(panel.getAlign());
+            for (int i = 0; i < tabbedPanel.getTabCount(); i++) {
+                java.awt.Component component = tabbedPanel.getComponentAt(i);
+                if (component == panel.getComponent().asJComponent()) {
+                    return i;
+                }
+            }
+            return -1;
+        }
+
+        @Override
+        public void setModified(DockedPanel panel, boolean modified) {
+            final int index = this.getIndex(panel);
+            if (index < 0) {
+                return;
+            }
+            final JTabbedPaneClosable tabbedPanel = getTabbedPanel(panel.getAlign());
+            tabbedPanel.setTabModified(index, modified);
+        }
+
+        @Override
+        public boolean getModified(DockedPanel panel) {
+            final int index = this.getIndex(panel);
+            if (index < 0) {
+                return false;
+            }
+            final JTabbedPaneClosable tabbedPanel = getTabbedPanel(panel.getAlign());
+            return tabbedPanel.isTabModified(index);
+        }
+
+        @Override
+        public DockedPanel getSelected(String align) {
+            final JTabbedPaneClosable tabbedPanel = getTabbedPanel(align);
+            java.awt.Component selected = tabbedPanel.getSelectedComponent();
+            return this.getDockedPanel(selected);
+        }
+
+        @Override
+        public DockedPanel add(String id, String title, final Component component, String align) {
+            final JTabbedPaneClosable tabbedPanel = getTabbedPanel(align);
+            DockedPanel panel = this.panels.get(id);
+            if (panel != null) {
+                tabbedPanel.remove(panel.getComponent().asJComponent());
+            }
+            panel = new DefaultDockedPanel(id, title, component, align);
+            this.panels.put(id, panel);
+            tabbedPanel.add(panel.getTitle(), panel.getComponent().asJComponent());
+            return panel;
+        }
+
+        @Override
+        public void remove(String id) {
+            DockedPanel panel = this.panels.get(id);
+            if (panel != null) {
+                final JTabbedPaneClosable tabbedPanel = getTabbedPanel(panel.getAlign());
+                tabbedPanel.remove(panel.getComponent().asJComponent());
+                this.panels.remove(id);
+            }
+        }
+
+        @Override
+        public DockedPanel get(String id) {
+            DockedPanel panel = this.panels.get(id);
+            return panel;
+        }
+
+        @Override
+        public void select(String id) {
+            DockedPanel panel = this.panels.get(id);
+            if (panel != null) {
+                final JTabbedPaneClosable tabbedPanel = getTabbedPanel(panel.getAlign());
+                tabbedPanel.setSelectedComponent(panel.getComponent().asJComponent());
+            }
+        }
+
+        @Override
+        public Iterator<DockedPanel> iterator() {
+            return this.panels.values().iterator();
+        }
+
+    }
+
+    private static class ToolEntry {
+
+        private String name;
+        private String text;
+        private Action action;
+        private JComponent component;
+
+        public ToolEntry(String name, Action action, String text) {
+            this.name = name;
+            this.action = action;
+            this.text = text;
+        }
+
+        public ToolEntry(String name, Action action) {
+            this(name, action, null);
+        }
+
+        public String getName() {
+            return this.name;
+        }
+
+        public String getText() {
+            return this.text;
+        }
+
+        public Action getAction() {
+            return this.action;
+        }
+
+        public JComponent getComponent() {
+            return this.component;
+        }
+
+        public void setComponent(JComponent component) {
+            this.component = component;
+        }
+    }
+
+    public class ButtonWithContext extends JButton {
+
+        private static final long serialVersionUID = -7434255417630073101L;
+
+        @SuppressWarnings("OverridableMethodCallInConstructor")
+        public ButtonWithContext(Action action) {
+            super(action);
+            this.setBorderPainted(false);
+            this.setText("");
+        }
+
+        public Object getContext() {
+            return DefaultJScriptingComposer.this;
+        }
+    }
+
+    private class FindReplaceSearchListener implements SearchListener {
+
+        @Override
+        public void searchEvent(SearchEvent e) {
+
+            RSyntaxTextArea textArea = getCurrentRSyntaxTextArea();
+            if (textArea == null) {
+                return;
+            }
+
+            SearchEvent.Type type = e.getType();
+            SearchContext context = e.getSearchContext();
+            SearchResult result;
+
+            switch (type) {
+                default: // Prevent FindBugs warning later
+                case MARK_ALL:
+                    result = SearchEngine.markAll(textArea, context);
+                    break;
+                case FIND:
+                    result = SearchEngine.find(textArea, context);
+                    if (!result.wasFound()) {
+                        UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+                    }
+                    break;
+                case REPLACE:
+                    result = SearchEngine.replace(textArea, context);
+                    if (!result.wasFound()) {
+                        UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+                    }
+                    break;
+                case REPLACE_ALL:
+                    result = SearchEngine.replaceAll(textArea, context);
+                    JOptionPane.showMessageDialog(null, result.getCount()
+                            + " occurrences replaced.");
+                    break;
+            }
+            String text;
+            if (result.wasFound()) {
+                text = "Text found; occurrences marked: " + result.getMarkedCount();
+            } else if (type == SearchEvent.Type.MARK_ALL) {
+                if (result.getMarkedCount() > 0) {
+                    text = "Occurrences marked: " + result.getMarkedCount();
+                } else {
+                    text = "";
+                }
+            } else {
+                text = "Text not found";
+            }
+            getStatusbar().message(text);
+        }
+
+        @Override
+        public String getSelectedText() {
+            RSyntaxTextArea textArea = getCurrentRSyntaxTextArea();
+            if (textArea == null) {
+                return "";
+            }
+            return textArea.getSelectedText();
+        }
+
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScript.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScript.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScript.java	(revision 1126)
@@ -0,0 +1,173 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.beans.PropertyChangeListener;
+import java.util.Map;
+
+import javax.swing.text.JTextComponent;
+import org.apache.commons.lang3.StringUtils;
+
+import org.gvsig.scripting.ScriptingBaseScript;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+
+public class JPropertiesScript extends JPropertiesScriptView {
+
+    private static final long serialVersionUID = 1503322333448146954L;
+
+    private final ScriptingUIManager uimanager;
+    private final ChangeListenerSupport changeListeners;
+
+    private class MyKeyListener implements KeyListener {
+
+        private final String name;
+        private final JTextComponent text;
+
+        public MyKeyListener(String name, JTextComponent text) {
+            this.name = name;
+            this.text = text;
+        }
+
+        @Override
+        public void keyTyped(KeyEvent e) {
+            changeListeners.fireChange(this.name, this.text.getText());
+        }
+
+        @Override
+        public void keyPressed(KeyEvent e) {
+        }
+
+        @Override
+        public void keyReleased(KeyEvent e) {
+        }
+
+    };
+
+    public JPropertiesScript(final ScriptingUnit unit) {
+        this.uimanager = ScriptingSwingLocator.getUIManager();
+        this.changeListeners = new ChangeListenerSupport();
+        this.initComponents();
+        if( unit!=null ) {
+            this.set(unit);
+        }
+    }
+
+    private void initComponents() {
+        this.txtName.addKeyListener(new MyKeyListener("name", txtName));
+        this.txtDescription.addKeyListener(new MyKeyListener("description", txtDescription));
+        this.txtCreatedBy.addKeyListener(new MyKeyListener("createdBy", txtCreatedBy));
+        this.txtVersion.addKeyListener(new MyKeyListener("version", txtVersion));
+        this.txtIsolationGroup.addKeyListener(new MyKeyListener("isolation", txtIsolationGroup));
+        this.chkEnabled.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                changeListeners.fireChange("enabled", chkEnabled.isSelected());
+            }
+        });
+    }
+
+    public final void set(ScriptingUnit unit) {
+        boolean enabled = this.changeListeners.setEnabled(false);
+        try {
+            if (unit instanceof ScriptingFolder) {
+                this.txtName.setEditable(false);
+                this.txtDescription.setEditable(false);
+                this.txtCreatedBy.setEditable(false);
+                this.txtVersion.setEditable(false);
+            } else {
+                this.txtName.setEditable(true);
+                this.txtDescription.setEditable(true);
+                this.txtCreatedBy.setEditable(true);
+                this.txtVersion.setEditable(true);
+            }
+            this.cboLibraryVersion.setEnabled(false);
+
+            this.txtName.setText(unit.getName());
+            this.txtDescription.setText(unit.getDescription());
+            this.txtCreatedBy.setText(unit.getCreatedBy());
+            this.txtVersion.setText(unit.getVersion());
+            if (unit instanceof ScriptingBaseScript) {
+                ScriptingBaseScript script = (ScriptingBaseScript) unit;
+                this.chkEnabled.setEnabled(true);
+                this.chkEnabled.setSelected(script.isEnabled());
+                this.cboLibraryVersion.removeAllItems();
+                ScriptingManager manager = ScriptingLocator.getManager();
+                Map<String, String> versions = manager.getLibFoldersVersions();
+                if( versions != null ) {
+                    this.cboLibraryVersion.setEnabled(true);
+                    this.cboLibraryVersion.addItem(new VersionItem(null,"Current version"));
+                    this.cboLibraryVersion.setSelectedIndex(0);
+                    for (Map.Entry<String, String> entrySet : versions.entrySet()) {
+                        String suffix = entrySet.getKey();
+                        String label = entrySet.getValue();
+                        this.cboLibraryVersion.addItem(new VersionItem(suffix,label));
+                        if( StringUtils.equals(suffix, script.getLibrarySuffix()) ) {
+                            this.cboLibraryVersion.setSelectedIndex(this.cboLibraryVersion.getItemCount()-1);
+                        }
+                    }
+                }
+                if( StringUtils.isEmpty(script.getIsolationGroup()) ) {
+                    this.txtIsolationGroup.setText("");
+                } else {
+                    this.txtIsolationGroup.setText(script.getIsolationGroup());
+                }
+            } else {
+                this.chkEnabled.setEnabled(false);
+                this.chkEnabled.setSelected(false);
+            }
+        } finally {
+            this.changeListeners.setEnabled(enabled);
+        }
+    }
+    
+    private static class VersionItem {
+        private final String suffix;
+        private final String label;
+        
+        VersionItem(String suffix, String label) {
+            this.suffix = suffix;
+            this.label = label;
+        }
+        public String getSuffix() {
+            return this.suffix;
+        }
+
+        @Override
+        public String toString() {
+            return this.label;
+        }
+    }
+
+    public void fectch(ScriptingUnit unit) {
+        unit.setName(this.txtName.getText());
+        unit.setDescription(this.txtDescription.getText());
+        unit.setCreatedBy(this.txtCreatedBy.getText());
+        unit.setVersion(this.txtVersion.getText());
+        if (unit instanceof ScriptingBaseScript) {
+            ScriptingBaseScript script = (ScriptingBaseScript) unit;
+            script.setEnabled(this.chkEnabled.isSelected());
+            VersionItem version = (VersionItem) this.cboLibraryVersion.getSelectedItem();
+            if( version!=null ) {
+                script.setLibrarySuffix(version.suffix);
+            } 
+            String s = this.txtIsolationGroup.getText();
+            if( StringUtils.isEmpty(s) ) {
+                script.setIsolationGroup(null);
+            } else {
+                script.setIsolationGroup(s.trim());
+            }
+        }
+    }
+
+    public void addChangeListener(PropertyChangeListener listener) {
+        this.changeListeners.addChangeListener(listener);
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolderView.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolderView.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolderView.java	(revision 1126)
@@ -0,0 +1,245 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import com.jeta.open.i18n.I18NUtils;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.ComponentOrientation;
+import java.awt.Container;
+import java.awt.Dimension;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+
+
+public class JPropertiesFolderView extends JPanel
+{
+   JTabbedPane jtabbedpane1 = new JTabbedPane();
+   JLabel lblName = new JLabel();
+   JTextField txtName = new JTextField();
+   JLabel lblCreatedBy = new JLabel();
+   JTextField txtCreatedBy = new JTextField();
+   JButton btnFile = new JButton();
+   JTextField txtFile = new JTextField();
+   JLabel lblDescription = new JLabel();
+   JTextArea txtDescription = new JTextArea();
+   JTextField txtIconName = new JTextField();
+   JTextField txtIconNameOpen = new JTextField();
+   JTextArea txtRaw = new JTextArea();
+
+   /**
+    * Default constructor
+    */
+   public JPropertiesFolderView()
+   {
+      initializePanel();
+   }
+
+   /**
+    * Adds fill components to empty cells in the first row and first column of the grid.
+    * This ensures that the grid spacing will be the same as shown in the designer.
+    * @param cols an array of column indices in the first row where fill components should be added.
+    * @param rows an array of row indices in the first column where fill components should be added.
+    */
+   void addFillComponents( Container panel, int[] cols, int[] rows )
+   {
+      Dimension filler = new Dimension(10,10);
+
+      boolean filled_cell_11 = false;
+      CellConstraints cc = new CellConstraints();
+      if ( cols.length > 0 && rows.length > 0 )
+      {
+         if ( cols[0] == 1 && rows[0] == 1 )
+         {
+            /** add a rigid area  */
+            panel.add( Box.createRigidArea( filler ), cc.xy(1,1) );
+            filled_cell_11 = true;
+         }
+      }
+
+      for( int index = 0; index < cols.length; index++ )
+      {
+         if ( cols[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) );
+      }
+
+      for( int index = 0; index < rows.length; index++ )
+      {
+         if ( rows[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) );
+      }
+
+   }
+
+   /**
+    * Helper method to load an image file from the CLASSPATH
+    * @param imageName the package and name of the file to load relative to the CLASSPATH
+    * @return an ImageIcon instance with the specified image file
+    * @throws IllegalArgumentException if the image resource cannot be loaded.
+    */
+   public ImageIcon loadImage( String imageName )
+   {
+      try
+      {
+         ClassLoader classloader = getClass().getClassLoader();
+         java.net.URL url = classloader.getResource( imageName );
+         if ( url != null )
+         {
+            ImageIcon icon = new ImageIcon( url );
+            return icon;
+         }
+      }
+      catch( Exception e )
+      {
+         e.printStackTrace();
+      }
+      throw new IllegalArgumentException( "Unable to load image: " + imageName );
+   }
+
+   /**
+    * Method for recalculating the component orientation for 
+    * right-to-left Locales.
+    * @param orientation the component orientation to be applied
+    */
+   public void applyComponentOrientation( ComponentOrientation orientation )
+   {
+      // Not yet implemented...
+      // I18NUtils.applyComponentOrientation(this, orientation);
+      super.applyComponentOrientation(orientation);
+   }
+
+   public JPanel createPanel()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE","CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      jtabbedpane1.setTabPlacement(JTabbedPane.BOTTOM);
+      jtabbedpane1.addTab("Properties",null,createPanel1());
+      jtabbedpane1.addTab("Raw",null,createPanel3());
+      jpanel1.add(jtabbedpane1,cc.xy(2,2));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,2,3 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel1()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE","CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      lblName.setName("lblName");
+      lblName.setText("Name");
+      jpanel1.add(lblName,cc.xy(2,2));
+
+      txtName.setName("txtName");
+      jpanel1.add(txtName,cc.xy(4,2));
+
+      lblCreatedBy.setName("lblCreatedBy");
+      lblCreatedBy.setText("Created by");
+      jpanel1.add(lblCreatedBy,cc.xy(2,4));
+
+      txtCreatedBy.setName("txtCreatedBy");
+      jpanel1.add(txtCreatedBy,cc.xy(4,4));
+
+      JLabel jlabel1 = new JLabel();
+      jlabel1.setText("Location");
+      jpanel1.add(jlabel1,cc.xy(2,6));
+
+      jpanel1.add(createPanel2(),cc.xy(4,6));
+      lblDescription.setName("lblDescription");
+      lblDescription.setText("Description");
+      jpanel1.add(lblDescription,cc.xy(2,12));
+
+      txtDescription.setName("txtDescription");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(txtDescription);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xywh(2,14,3,1));
+
+      txtIconName.setName("txtIconName");
+      jpanel1.add(txtIconName,cc.xy(4,8));
+
+      txtIconNameOpen.setName("txtIconNameOpen");
+      jpanel1.add(txtIconNameOpen,cc.xy(4,10));
+
+      JLabel jlabel2 = new JLabel();
+      jlabel2.setText("Icon name");
+      jpanel1.add(jlabel2,cc.xy(2,8));
+
+      JLabel jlabel3 = new JLabel();
+      jlabel3.setText("Icon name open");
+      jpanel1.add(jlabel3,cc.xy(2,10));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel2()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE,FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      btnFile.setActionCommand("...");
+      btnFile.setName("btnFile");
+      btnFile.setText("...");
+      EmptyBorder emptyborder1 = new EmptyBorder(2,2,2,2);
+      btnFile.setBorder(emptyborder1);
+      jpanel1.add(btnFile,cc.xy(3,1));
+
+      txtFile.setName("txtFile");
+      jpanel1.add(txtFile,cc.xy(1,1));
+
+      addFillComponents(jpanel1,new int[]{ 2 },new int[0]);
+      return jpanel1;
+   }
+
+   public JPanel createPanel3()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE","CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      txtRaw.setName("txtRaw");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(txtRaw);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xy(2,2));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,2,3 });
+      return jpanel1;
+   }
+
+   /**
+    * Initializer
+    */
+   protected void initializePanel()
+   {
+      setLayout(new BorderLayout());
+      add(createPanel(), BorderLayout.CENTER);
+   }
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JRenamePanel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JRenamePanel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JRenamePanel.java	(revision 1126)
@@ -0,0 +1,140 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.awt.BorderLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.border.TitledBorder;
+
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.impl.DialogPanel;
+
+public class JRenamePanel extends JPanel implements DialogPanel {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private ScriptingUIManager uimanager;
+	//private ScriptingManager manager;
+	private JRenameModel model;
+	private ScriptingUnit unit;
+	
+	JTextField oldName = null;
+	JTextField newName =null;
+	JPropertiesScript jProperties = null;
+		
+	public JRenamePanel(ScriptingUIManager uimanager, JRenameModel model){
+		this.uimanager = uimanager;
+		//this.manager = this.uimanager.getManager();
+		this.model= model;
+		this.unit = model.getUnit();
+		
+		model.setAction(JNewScriptModel.ACTION_CANCEL);
+		
+		setLayout(new BorderLayout());
+		
+		JPanel panel = new JPanel();
+		panel.setLayout(new GridBagLayout());
+		GridBagConstraints gbc = new GridBagConstraints();
+
+		gbc.insets = new Insets(25,10,0,5);
+		gbc.weightx = 0.5;
+		gbc.fill = GridBagConstraints.HORIZONTAL;
+		gbc.gridx = 0;
+		gbc.gridy = 0;	
+		panel.add(new JLabel(this.uimanager.getTranslation("current_name")+": "),gbc);
+		gbc.gridx = 1;
+		oldName = new JTextField(20);
+		oldName.setText(unit.getId());
+		oldName.setEditable(false);
+		panel.add(oldName, gbc);
+		
+		gbc.insets = new Insets(10,10,25,5);
+		gbc.gridx = 0;
+		gbc.gridy = 1;
+		panel.add(new JLabel(this.uimanager.getTranslation("new_name")+": "),gbc);
+		gbc.gridx = 1;
+		newName = new JTextField(20);
+		newName.setText(unit.getId());
+		panel.add(newName, gbc);
+		
+		TitledBorder title;
+		title = BorderFactory.createTitledBorder(this.uimanager.getTranslation("rename_name_title"));
+		panel.setBorder(title);
+
+		jProperties = new JPropertiesScript(this.unit);
+		TitledBorder title2;
+		title2 = BorderFactory.createTitledBorder(this.uimanager.getTranslation("more_properties"));
+		jProperties.setBorder(title2);
+		
+		add(panel,BorderLayout.NORTH);
+		add(jProperties,BorderLayout.CENTER);
+	}
+
+	public void actionAccept() {
+		model.setNewName(newName.getText().trim());
+                jProperties.fectch(unit);
+		model.setUnit(this.unit);
+		
+		try {
+			model.validate();
+		} catch (Exception e) {
+			JOptionPane.showMessageDialog(null, e.getMessage(), "Info", JOptionPane.INFORMATION_MESSAGE);
+			return;
+		}
+		
+		model.setAction(JRenameModel.ACTION_ACCEPT);
+		setVisible(false);
+		
+//		boolean success = true;
+//		if (!newName.getText().equals("") && !newName.getText().equals(oldName.getText())){
+//			if(unit.rename(newName.getText())){
+//				JOptionPane.showMessageDialog(null, "Rename succesfully", "Info", JOptionPane.INFORMATION_MESSAGE);
+//				composer.launcherRefresh();
+//			}else{
+//				JOptionPane.showMessageDialog(null, "There're another file with the same name on the final directory\nRename the file or select another destiny.", "Error", JOptionPane.ERROR_MESSAGE);
+//				success = false;
+//			}
+//		}
+//		unit.setName(jProperties.name.getText());
+//		unit.setDescription(jProperties.description.getText());
+//		unit.setCreatedBy(jProperties.createdBy.getText());
+//		unit.setVersion(jProperties.version.getText());
+//		if(unit instanceof ScriptingScript){
+//			((ScriptingScript)unit).save();
+//		}
+//		if(success)
+//			setVisible(false);
+	}
+
+	public void actionApply() {
+	}
+
+	public void actionCancel() {
+		setVisible(false);
+	}
+
+	public boolean isVisibleAccept() {
+		return true;
+	}
+
+	public boolean isVisibleApply() {
+		return false;
+	}
+
+	public boolean isVisibleCancel() {
+		return true;
+	}
+	public JComponent getJComponent() {
+		return this;
+	}
+	
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolder.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolder.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolder.java	(revision 1126)
@@ -0,0 +1,162 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.beans.PropertyChangeListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+import javax.swing.text.JTextComponent;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.pickercontroller.FolderPickerController;
+
+public class JPropertiesFolder extends JPropertiesFolderView {
+
+//    private final ScriptingUIManager uimanager;
+    private final ChangeListenerSupport changeListeners;
+    private FolderPickerController folderPicker;
+    private boolean changed;
+    private boolean rawChanges;
+
+    private class DocumentChangeListener implements DocumentListener {
+
+        private final String name;
+        private final JTextComponent text;
+
+        public DocumentChangeListener(String name, JTextComponent text) {
+            this.name = name;
+            this.text = text;
+        }
+
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                doChange(name, text.getText());
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {
+                doChange(name, text.getText());
+            }
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {
+                doChange(name, text.getText());
+            }
+    };
+
+    @SuppressWarnings("OverridableMethodCallInConstructor")
+    public JPropertiesFolder(final ScriptingFolder folder) {
+//        this.uimanager = ScriptingSwingLocator.getUIManager();
+        this.changeListeners = new ChangeListenerSupport();
+        this.initComponents();
+        this.set(folder);
+    }
+
+    private void initComponents() {
+        this.txtName.getDocument().addDocumentListener(new DocumentChangeListener("name", txtName));
+        this.txtDescription.getDocument().addDocumentListener(new DocumentChangeListener("description", txtDescription));
+        this.txtCreatedBy.getDocument().addDocumentListener(new DocumentChangeListener("createdBy", txtCreatedBy));
+        this.txtRaw.getDocument().addDocumentListener(new DocumentChangeListener("raw", txtRaw));
+        this.txtFile.getDocument().addDocumentListener(new DocumentChangeListener("file", txtFile));
+        this.folderPicker = ToolsSwingLocator.getToolsSwingManager().createFolderPickerController(txtFile, btnFile);
+    }
+
+    private void doChange(String name, Object value) {
+        this.changed = true;
+        switch(name) {
+            case "name":
+                this.txtRaw.setEditable(false);
+                this.changeListeners.fireChange(name, value);
+                break;
+            case "description":
+                this.txtRaw.setEditable(false);
+                this.changeListeners.fireChange(name, value);
+                break;
+            case "createdBy":
+                this.txtRaw.setEditable(false);
+                this.changeListeners.fireChange(name, value);
+                break;
+            case "file":
+                this.txtRaw.setEditable(false);
+                this.changeListeners.fireChange(name, value);
+                break;
+            case "raw":
+                this.txtCreatedBy.setEditable(false);
+                this.txtDescription.setEditable(false);
+                this.txtName.setEditable(false);
+                this.folderPicker.setEditable(false);
+                this.changeListeners.fireChange(name, value);
+                this.rawChanges = true;
+                break;
+        }
+    }
+    
+    public void set(ScriptingFolder unit) {
+        boolean enabled = this.changeListeners.setEnabled(false);
+        try {
+            this.txtName.setEditable(true);
+            this.txtDescription.setEditable(true);
+            this.txtCreatedBy.setEditable(true);
+
+            this.txtName.setText(unit.getName());
+            this.txtDescription.setText(unit.getDescription());
+            this.txtCreatedBy.setText(unit.getCreatedBy());
+            
+            this.txtRaw.setText(unit.getRawInf());
+            
+            this.folderPicker.set(unit.getFile());
+            this.folderPicker.setEditable(unit.isLink());
+
+            this.txtIconName.setText(unit.getIconNames()[0]);
+            this.txtIconNameOpen.setText(unit.getIconNames()[1]);
+
+            this.setChanged(false);
+            
+        } finally {
+            this.changeListeners.setEnabled(enabled);
+        }
+    }
+    
+    public void fectch(ScriptingFolder unit) {
+        if( this.hasRawChanges() ) {
+            unit.setRawInf(this.txtRaw.getText());
+        } else {
+            unit.setName(this.txtName.getText());
+            unit.setDescription(this.txtDescription.getText());
+            unit.setCreatedBy(this.txtCreatedBy.getText());
+            unit.setIconNames(
+                this.txtIconName.getText(), 
+                this.txtIconNameOpen.getText()
+            );
+        }
+    }
+
+    public void addChangeListener(PropertyChangeListener listener) {
+        this.changeListeners.addChangeListener(listener);
+    }
+
+    public boolean isChanged() {
+        return this.changed;
+    }
+
+    public void setChanged(boolean hasChanges) {
+        this.changed = hasChanges;
+        this.rawChanges = hasChanges;
+        if( !hasChanges ) {            
+            this.txtName.setEnabled(true);
+            this.txtDescription.setEnabled(true);
+            this.txtCreatedBy.setEnabled(true);
+            this.txtRaw.setEnabled(true);
+            this.folderPicker.setEnabled(true);
+
+            this.txtName.setEditable(true);
+            this.txtDescription.setEditable(true);
+            this.txtCreatedBy.setEditable(true);
+            this.txtRaw.setEditable(true);
+        }
+    }
+
+    private boolean hasRawChanges() {
+        return this.rawChanges;
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JRenameModel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JRenameModel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JRenameModel.java	(revision 1126)
@@ -0,0 +1,58 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+
+public class JRenameModel {
+
+	public final static int ACTION_CANCEL = 0;
+	public final static int ACTION_ACCEPT = 1;
+	
+	private ScriptingUnit unit;
+	private String newName;
+	private int action;
+	private ScriptingManager manager;
+	
+	public JRenameModel(ScriptingManager manager, ScriptingUnit unit){
+		this.manager = manager;
+		this.setUnit(unit);
+	}
+	
+	public void validate() throws Exception{
+		if(this.getNewName().length()==0){
+			throw new Exception("Name must not be empty.");
+		}
+		
+		ScriptingFolder folder = this.getUnit().getParent();
+		if(!manager.validateUnitId(folder,this.getNewName())){
+			throw new Exception("This file already exists.\nWrite another name for the script");
+		}
+		
+	}
+	
+	public void setAction(int action) {
+		this.action = action;
+	}
+	
+	public int getAction() {
+		return action;
+	}
+
+	public void setNewName(String newName) {
+		this.newName = newName;
+	}
+
+	public String getNewName() {
+		return newName;
+	}
+
+	public void setUnit(ScriptingUnit unit) {
+		this.unit = unit;
+	}
+
+	public ScriptingUnit getUnit() {
+		return unit;
+	}
+	
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScriptView.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScriptView.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScriptView.xml	(revision 1126)
@@ -0,0 +1,1059 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/datos/devel/org.gvsig.scripting/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScriptView.xml</at>
+   <at name="rowspecs">CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblName</at>
+            <at name="width">125</at>
+            <at name="text">Name</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblEnabled</at>
+            <at name="width">125</at>
+            <at name="text">Enabled</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblCreatedBy</at>
+            <at name="width">125</at>
+            <at name="text">Created by</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblVersion</at>
+            <at name="width">125</at>
+            <at name="text">Version</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">16</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblDescription</at>
+            <at name="width">125</at>
+            <at name="text">Description</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtName</at>
+            <at name="width">566</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JCheckBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JCheckBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">chkEnabled</at>
+            <at name="width">566</at>
+            <at name="height">15</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtCreatedBy</at>
+            <at name="width">566</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtVersion</at>
+            <at name="width">566</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">18</at>
+           <at name="colspan">3</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextArea</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextArea</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="scrollableTracksViewportHeight">true</at>
+            <at name="scrollableTracksViewportWidth">true</at>
+            <at name="name">txtDescription</at>
+            <at name="width">709</at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">20</at>
+              <at name="horizontalpolicy">30</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="height">171</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">10</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblLibraryVersion</at>
+            <at name="width">125</at>
+            <at name="text">Library version to use</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">10</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JComboBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JComboBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">cboLibraryVersion</at>
+            <at name="width">566</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">12</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblIsolationGroup</at>
+            <at name="width">125</at>
+            <at name="text">Isolation group</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">12</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtIsolationGroup</at>
+            <at name="width">566</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">14</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name"></at>
+            <at name="width">566</at>
+            <at name="text">Leave this box blank if you are not clear what to put in it.</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"/>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="19">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="9">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="10">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="11">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="12">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="13">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="14">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="15">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="16">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="17">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="18">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.java	(revision 1126)
@@ -0,0 +1,200 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import com.jeta.open.i18n.I18NUtils;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Container;
+import java.awt.Dimension;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+
+
+public class JNewScriptPanelLayout extends JPanel
+{
+   JLabel Name_ = new JLabel();
+   JTextField name = new JTextField();
+   JTextArea description = new JTextArea();
+   JComboBox units = new JComboBox();
+   JComboBox languages = new JComboBox();
+   JPanel saveToPanel = new JPanel();
+   JTextField createdBy = new JTextField();
+   JTextField version = new JTextField();
+   JTextField saveTo = new JTextField();
+
+   /**
+    * Default constructor
+    */
+   public JNewScriptPanelLayout()
+   {
+      initializePanel();
+   }
+
+   /**
+    * Adds fill components to empty cells in the first row and first column of the grid.
+    * This ensures that the grid spacing will be the same as shown in the designer.
+    * @param cols an array of column indices in the first row where fill components should be added.
+    * @param rows an array of row indices in the first column where fill components should be added.
+    */
+   void addFillComponents( Container panel, int[] cols, int[] rows )
+   {
+      Dimension filler = new Dimension(10,10);
+
+      boolean filled_cell_11 = false;
+      CellConstraints cc = new CellConstraints();
+      if ( cols.length > 0 && rows.length > 0 )
+      {
+         if ( cols[0] == 1 && rows[0] == 1 )
+         {
+            /** add a rigid area  */
+            panel.add( Box.createRigidArea( filler ), cc.xy(1,1) );
+            filled_cell_11 = true;
+         }
+      }
+
+      for( int index = 0; index < cols.length; index++ )
+      {
+         if ( cols[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) );
+      }
+
+      for( int index = 0; index < rows.length; index++ )
+      {
+         if ( rows[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) );
+      }
+
+   }
+
+   /**
+    * Helper method to load an image file from the CLASSPATH
+    * @param imageName the package and name of the file to load relative to the CLASSPATH
+    * @return an ImageIcon instance with the specified image file
+    * @throws IllegalArgumentException if the image resource cannot be loaded.
+    */
+   public ImageIcon loadImage( String imageName )
+   {
+      try
+      {
+         ClassLoader classloader = getClass().getClassLoader();
+         java.net.URL url = classloader.getResource( imageName );
+         if ( url != null )
+         {
+            ImageIcon icon = new ImageIcon( url );
+            return icon;
+         }
+      }
+      catch( Exception e )
+      {
+         e.printStackTrace();
+      }
+      throw new IllegalArgumentException( "Unable to load image: " + imageName );
+   }
+
+   /**
+    * Method for recalculating the component orientation for 
+    * right-to-left Locales.
+    * @param orientation the component orientation to be applied
+    */
+   public void applyComponentOrientation( ComponentOrientation orientation )
+   {
+      // Not yet implemented...
+      // I18NUtils.applyComponentOrientation(this, orientation);
+      super.applyComponentOrientation(orientation);
+   }
+
+   public JPanel createPanel()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:MIN(12DLU;DEFAULT):GROW(1.0),FILL:4DLU:NONE","CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(0.1),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(0.9),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      Name_.setName("Name:");
+      Name_.setText("Name:");
+      jpanel1.add(Name_,cc.xy(2,2));
+
+      JLabel jlabel1 = new JLabel();
+      jlabel1.setText("Description:");
+      jpanel1.add(jlabel1,new CellConstraints(2,4,1,1,CellConstraints.DEFAULT,CellConstraints.TOP));
+
+      JLabel jlabel2 = new JLabel();
+      jlabel2.setText("Type:");
+      jpanel1.add(jlabel2,cc.xy(2,6));
+
+      JLabel jlabel3 = new JLabel();
+      jlabel3.setText("Language:");
+      jpanel1.add(jlabel3,cc.xy(2,8));
+
+      JLabel jlabel4 = new JLabel();
+      jlabel4.setText("Save on:");
+      jpanel1.add(jlabel4,cc.xy(2,10));
+
+      JLabel jlabel5 = new JLabel();
+      jlabel5.setText("Author:");
+      jpanel1.add(jlabel5,cc.xy(2,13));
+
+      JLabel jlabel6 = new JLabel();
+      jlabel6.setText("Version:");
+      jpanel1.add(jlabel6,cc.xy(2,15));
+
+      name.setName("name");
+      jpanel1.add(name,cc.xy(3,2));
+
+      description.setName("description");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(description);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xy(3,4));
+
+      units.setName("units");
+      jpanel1.add(units,cc.xy(3,6));
+
+      languages.setName("languages");
+      jpanel1.add(languages,cc.xy(3,8));
+
+      saveToPanel.setName("saveToPanel");
+      jpanel1.add(saveToPanel,cc.xy(3,11));
+
+      createdBy.setName("createdBy");
+      jpanel1.add(createdBy,cc.xy(3,13));
+
+      version.setName("version");
+      jpanel1.add(version,cc.xy(3,15));
+
+      saveTo.setBackground(new Color(236,233,216));
+      saveTo.setEditable(false);
+      saveTo.setName("saveTo");
+      jpanel1.add(saveTo,cc.xy(3,10));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 });
+      return jpanel1;
+   }
+
+   /**
+    * Initializer
+    */
+   protected void initializePanel()
+   {
+      setLayout(new BorderLayout());
+      add(createPanel(), BorderLayout.CENTER);
+   }
+
+
+}

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanel.java	(revision 1126)
@@ -0,0 +1,180 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.KeyboardFocusManager;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.KeyStroke;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JScriptingBrowser;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.impl.DefaultJScriptingBrowser;
+import org.gvsig.scripting.swing.impl.DialogPanel;
+import org.gvsig.tools.swing.api.ListElement;
+
+public class JNewScriptPanel extends JNewScriptPanelLayout implements DialogPanel {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -3455272930442207085L;
+    private final ScriptingUIManager uimanager;
+    private final ScriptingManager manager;
+    private final JNewScriptModel model;
+    private final DefaultJScriptingBrowser jbrowser;
+    private File saveToFile;
+
+    public JNewScriptPanel(ScriptingUIManager uimanager, JNewScriptModel model, boolean folder) {
+        super();
+        this.uimanager = uimanager;
+        this.manager = this.uimanager.getManager();
+        this.model = model;
+//        this.setBackground(Color.RED);
+        model.setAction(JNewScriptModel.ACTION_CANCEL);
+
+        this.description.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
+        this.description.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
+        
+        Set forwardKeys = getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);        
+        Set newForwardKeys = new HashSet(forwardKeys);
+        newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
+        setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,newForwardKeys);
+
+        List<String> langs = manager.getSupportedLanguages();
+        DefaultComboBoxModel languagesModel = new DefaultComboBoxModel();
+        int selected = 0;
+        for( int i=0; i<langs.size(); i++) {
+            String lang = langs.get(i);
+            if( lang.equalsIgnoreCase("r")  ) {
+                languagesModel.addElement(new ListElement(lang,lang));
+            } else if( lang.equalsIgnoreCase("python") ) {
+                languagesModel.addElement(new ListElement(lang,lang));
+                selected = i;
+            } else {
+                languagesModel.addElement(new ListElement(lang + " (without support)",lang));
+            }
+        }
+        languages.setModel(languagesModel);
+        languages.setSelectedIndex(selected);
+
+        units.setModel(new DefaultComboBoxModel(manager.getUnitTypes().toArray()));
+        units.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                if (((JComboBox) arg0.getSource()).getSelectedItem().equals("Folder")) {
+                    languages.setEnabled(false);
+                    createdBy.setEditable(false);
+                    version.setEditable(false);
+                } else {
+                    languages.setEnabled(true);
+                    createdBy.setEditable(true);
+                    version.setEditable(true);
+                }
+            }
+        });
+
+        saveToFile = this.manager.getRootUserFolder();
+        saveTo.setText(this.manager.getUserFolder().getUserPath());
+        jbrowser = new DefaultJScriptingBrowser(this.uimanager, this.manager.getUserFolder(), true);
+        jbrowser.setPreferredSize(new Dimension(250, 100));
+        saveToPanel.setLayout(new BorderLayout());
+        saveToPanel.add(jbrowser, BorderLayout.CENTER);
+        jbrowser.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                if( arg0.getID() == JScriptingBrowser.SELECTION_ACTION ) {
+                    doFolderSelection();
+                }
+            }
+        });
+        jbrowser.setSelectionPath(this.model.getSelectionPath());
+        doFolderSelection();
+        if( folder ) {
+            this.units.setSelectedItem(ScriptingManager.UNIT_FOLDER);
+            this.languages.setSelectedIndex(-1);
+            this.units.setEnabled(false);
+            this.languages.setEnabled(false);
+            this.createdBy.setEditable(false);
+            this.version.setEditable(false);            
+        }
+    }
+    
+    private void doFolderSelection() {
+        ScriptingUnit node = jbrowser.getSelectedNode();
+        if (node instanceof ScriptingFolder) {
+            ScriptingFolder selectedFolder = (ScriptingFolder) node;
+            saveToFile = selectedFolder.getFile();
+            saveTo.setText(selectedFolder.getUserPath());
+        }
+    }
+
+    @Override
+    public void actionAccept() {
+
+        model.setType((String) units.getSelectedItem());
+        model.setName(name.getText().trim());
+        model.setDescription(description.getText().trim());
+        model.setCreatedBy(createdBy.getText().trim());
+        model.setVersion(version.getText().trim());
+        model.setPath(saveToFile);
+        if (!model.getType().equals(ScriptingManager.UNIT_FOLDER)) {
+            ListElement item = (ListElement)languages.getSelectedItem();
+            if( item!=null ) {
+                model.setLanguage((String) item.getValue());
+            }
+        }
+        try {
+            model.validate();
+        } catch (Exception e) {
+            JOptionPane.showMessageDialog(null, "Can't create the script\n" + e.getMessage(), "Info", JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+        model.setAction(JNewScriptModel.ACTION_ACCEPT);
+        setVisible(false);
+
+    }
+
+    @Override
+    public void actionApply() {
+    }
+
+    @Override
+    public void actionCancel() {
+        setVisible(false);
+    }
+
+    @Override
+    public boolean isVisibleAccept() {
+        return true;
+    }
+
+    @Override
+    public boolean isVisibleApply() {
+        return false;
+    }
+
+    @Override
+    public boolean isVisibleCancel() {
+        return true;
+    }
+
+    @Override
+    public JComponent getJComponent() {
+        return this;
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptModel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptModel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptModel.java	(revision 1126)
@@ -0,0 +1,101 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.io.File;
+import javax.swing.tree.TreePath;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+
+public class JNewScriptModel {
+
+	public final static int ACTION_CANCEL = 0;
+	public final static int ACTION_ACCEPT = 1;
+	
+	private String type;
+	private String name;
+	private String description;
+	private String language;
+	private File path;
+	private String createdBy;
+	private String version;
+	private int action;
+	private final ScriptingManager manager;
+        private TreePath initialSelectedPath = null;
+	
+	public JNewScriptModel(ScriptingManager manager){
+		this.manager = manager;
+	}
+	
+	public void validate() throws Exception{
+		if(this.getName().length()==0){
+			throw new Exception( "Name must not be empty.");
+		}
+		
+		ScriptingFolder folder = manager.getFolder(this.getPath());
+		if(!manager.validateUnitId(folder,this.getName())){
+			throw new Exception("This file already exists.\nWrite another name for the script");
+		}
+	}
+	
+	public String getExtension(){
+            return manager.getExtensionOfLanguage(this.getLanguage());
+	}
+	
+	public void setVersion(String version) {
+		this.version = version;
+	}
+	public String getVersion() {
+		return version;
+	}
+	public void setCreatedBy(String createdBy) {
+		this.createdBy = createdBy;
+	}
+	public String getCreatedBy() {
+		return createdBy;
+	}
+	public void setPath(File path) {
+		this.path = path.getAbsoluteFile();
+	}
+	public File getPath() {
+		return path;
+	}
+	public void setLanguage(String language) {
+		this.language = language;
+	}
+	public String getLanguage() {
+		return language;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setAction(int action) {
+		this.action = action;
+	}
+	public int getAction() {
+		return action;
+	}
+
+        void setSelectionPath(TreePath path) {
+            this.initialSelectedPath = path;
+        }
+
+        TreePath getSelectionPath() {
+            return this.initialSelectedPath;
+        }
+	
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolderView.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolderView.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolderView.xml	(revision 1126)
@@ -0,0 +1,1427 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/datos/devel/org.gvsig.scripting/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesFolderView.xml</at>
+   <at name="rowspecs">CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE</at>
+   <at name="colspecs">FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormContainerComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTabbedPane</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTabbedPane</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="componentCount">2</at>
+            <at name="tabPlacement">3</at>
+            <at name="tabs">
+             <object classname="com.jeta.forms.store.properties.TabbedPaneProperties">
+              <at name="name">tabs</at>
+              <at name="items">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.TabProperty">
+                   <at name="name">tab</at>
+                   <at name="title">Properties</at>
+                   <at name="icon">
+                    <object classname="com.jeta.forms.store.properties.IconProperty">
+                     <at name="embedded">false</at>
+                     <at name="width">0</at>
+                     <at name="height">0</at>
+                    </object>
+                   </at>
+                   <at name="form">
+                    <object classname="com.jeta.forms.store.memento.FormMemento">
+                     <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                      <at name="cellconstraints">
+                       <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                        <at name="column">1</at>
+                        <at name="row">1</at>
+                        <at name="colspan">1</at>
+                        <at name="rowspan">1</at>
+                        <at name="halign">default</at>
+                        <at name="valign">default</at>
+                        <at name="insets" object="insets">0,0,0,0</at>
+                       </object>
+                      </at>
+                      <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+                     </super>
+                     <at name="id">embedded.1413630777</at>
+                     <at name="rowspecs">CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE</at>
+                     <at name="colspecs">FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE</at>
+                     <at name="components">
+                      <object classname="java.util.LinkedList">
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">2</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">lblName</at>
+                              <at name="width">91</at>
+                              <at name="text">Name</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">2</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextField</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextField</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">txtName</at>
+                              <at name="width">782</at>
+                              <at name="height">20</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">4</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">lblCreatedBy</at>
+                              <at name="width">91</at>
+                              <at name="text">Created by</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">4</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextField</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextField</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">txtCreatedBy</at>
+                              <at name="width">782</at>
+                              <at name="height">20</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">6</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="width">91</at>
+                              <at name="name"/>
+                              <at name="text">Location</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.FormMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">6</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+                          </super>
+                          <at name="id">embedded.594897224</at>
+                          <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+                          <at name="colspecs">FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE,FILL:DEFAULT:NONE</at>
+                          <at name="components">
+                           <object classname="java.util.LinkedList">
+                            <item >
+                             <at name="value">
+                              <object classname="com.jeta.forms.store.memento.BeanMemento">
+                               <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                                <at name="cellconstraints">
+                                 <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                                  <at name="column">3</at>
+                                  <at name="row">1</at>
+                                  <at name="colspan">1</at>
+                                  <at name="rowspan">1</at>
+                                  <at name="halign">default</at>
+                                  <at name="valign">default</at>
+                                  <at name="insets" object="insets">0,0,0,0</at>
+                                 </object>
+                                </at>
+                                <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                               </super>
+                               <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                               <at name="beanclass">javax.swing.JButton</at>
+                               <at name="beanproperties">
+                                <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                                 <at name="classname">javax.swing.JButton</at>
+                                 <at name="properties">
+                                  <object classname="com.jeta.forms.store.support.PropertyMap">
+                                   <at name="border">
+                                    <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                     <at name="borders">
+                                      <object classname="java.util.LinkedList">
+                                       <item >
+                                        <at name="value">
+                                         <object classname="com.jeta.forms.store.properties.EmptyBorderProperty">
+                                          <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                           <at name="name">border</at>
+                                          </super>
+                                          <at name="top">2</at>
+                                          <at name="left">2</at>
+                                          <at name="bottom">2</at>
+                                          <at name="right">2</at>
+                                         </object>
+                                        </at>
+                                       </item>
+                                      </object>
+                                     </at>
+                                    </object>
+                                   </at>
+                                   <at name="actionCommand">...</at>
+                                   <at name="name">btnFile</at>
+                                   <at name="width">16</at>
+                                   <at name="text">...</at>
+                                   <at name="height">18</at>
+                                  </object>
+                                 </at>
+                                </object>
+                               </at>
+                              </object>
+                             </at>
+                            </item>
+                            <item >
+                             <at name="value">
+                              <object classname="com.jeta.forms.store.memento.BeanMemento">
+                               <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                                <at name="cellconstraints">
+                                 <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                                  <at name="column">1</at>
+                                  <at name="row">1</at>
+                                  <at name="colspan">1</at>
+                                  <at name="rowspan">1</at>
+                                  <at name="halign">default</at>
+                                  <at name="valign">default</at>
+                                  <at name="insets" object="insets">0,0,0,0</at>
+                                 </object>
+                                </at>
+                                <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                               </super>
+                               <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                               <at name="beanclass">javax.swing.JTextField</at>
+                               <at name="beanproperties">
+                                <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                                 <at name="classname">javax.swing.JTextField</at>
+                                 <at name="properties">
+                                  <object classname="com.jeta.forms.store.support.PropertyMap">
+                                   <at name="border">
+                                    <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                     <at name="borders">
+                                      <object classname="java.util.LinkedList">
+                                       <item >
+                                        <at name="value">
+                                         <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                          <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                           <at name="name">border</at>
+                                          </super>
+                                         </object>
+                                        </at>
+                                       </item>
+                                      </object>
+                                     </at>
+                                    </object>
+                                   </at>
+                                   <at name="name">txtFile</at>
+                                   <at name="width">750</at>
+                                   <at name="height">20</at>
+                                  </object>
+                                 </at>
+                                </object>
+                               </at>
+                              </object>
+                             </at>
+                            </item>
+                           </object>
+                          </at>
+                          <at name="properties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.gui.form.GridView</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList"/>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name"/>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="scollBars">
+                               <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                                <at name="name">scollBars</at>
+                                <at name="verticalpolicy">21</at>
+                                <at name="horizontalpolicy">31</at>
+                                <at name="border">
+                                 <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                  <at name="borders">
+                                   <object classname="java.util.LinkedList">
+                                    <item >
+                                     <at name="value">
+                                      <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                       <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                        <at name="name">border</at>
+                                       </super>
+                                      </object>
+                                     </at>
+                                    </item>
+                                   </object>
+                                  </at>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                          <at name="cellpainters">
+                           <object classname="com.jeta.forms.store.support.Matrix">
+                            <at name="rows">
+                             <object classname="[Ljava.lang.Object;" size="1">
+                              <at name="item" index="0">
+                               <object classname="[Ljava.lang.Object;" size="3"/>
+                              </at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                          <at name="rowgroups">
+                           <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                            <at name="groups">
+                             <object classname="java.util.HashMap"/>
+                            </at>
+                           </object>
+                          </at>
+                          <at name="colgroups">
+                           <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                            <at name="groups">
+                             <object classname="java.util.HashMap"/>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">12</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">lblDescription</at>
+                              <at name="width">91</at>
+                              <at name="text">Description</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">14</at>
+                             <at name="colspan">3</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextArea</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextArea</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="scrollableTracksViewportHeight">true</at>
+                              <at name="scrollableTracksViewportWidth">true</at>
+                              <at name="name">txtDescription</at>
+                              <at name="width">882</at>
+                              <at name="scollBars">
+                               <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                                <at name="name">scollBars</at>
+                                <at name="verticalpolicy">20</at>
+                                <at name="horizontalpolicy">30</at>
+                                <at name="border">
+                                 <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                  <at name="borders">
+                                   <object classname="java.util.LinkedList">
+                                    <item >
+                                     <at name="value">
+                                      <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                       <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                        <at name="name">border</at>
+                                       </super>
+                                      </object>
+                                     </at>
+                                    </item>
+                                   </object>
+                                  </at>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="height">270</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">8</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextField</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextField</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">txtIconName</at>
+                              <at name="width">782</at>
+                              <at name="height">20</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">4</at>
+                             <at name="row">10</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextField</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextField</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name">txtIconNameOpen</at>
+                              <at name="width">782</at>
+                              <at name="height">20</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">8</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name"></at>
+                              <at name="width">91</at>
+                              <at name="text">Icon name</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">10</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="name"></at>
+                              <at name="width">91</at>
+                              <at name="text">Icon name open</at>
+                              <at name="fill">
+                               <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                                <at name="name">fill</at>
+                               </object>
+                              </at>
+                              <at name="height">14</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                      </object>
+                     </at>
+                     <at name="properties">
+                      <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                       <at name="classname">com.jeta.forms.gui.form.GridView</at>
+                       <at name="properties">
+                        <object classname="com.jeta.forms.store.support.PropertyMap">
+                         <at name="border">
+                          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                           <super classname="com.jeta.forms.store.properties.BorderProperty">
+                            <at name="name">border</at>
+                           </super>
+                           <at name="borders">
+                            <object classname="java.util.LinkedList"/>
+                           </at>
+                          </object>
+                         </at>
+                         <at name="name"/>
+                         <at name="fill">
+                          <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                           <at name="name">fill</at>
+                          </object>
+                         </at>
+                         <at name="scollBars">
+                          <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                           <at name="name">scollBars</at>
+                           <at name="verticalpolicy">21</at>
+                           <at name="horizontalpolicy">31</at>
+                           <at name="border">
+                            <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                             <super classname="com.jeta.forms.store.properties.BorderProperty">
+                              <at name="name">border</at>
+                             </super>
+                             <at name="borders">
+                              <object classname="java.util.LinkedList">
+                               <item >
+                                <at name="value">
+                                 <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                 </object>
+                                </at>
+                               </item>
+                              </object>
+                             </at>
+                            </object>
+                           </at>
+                          </object>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="cellpainters">
+                      <object classname="com.jeta.forms.store.support.Matrix">
+                       <at name="rows">
+                        <object classname="[Ljava.lang.Object;" size="15">
+                         <at name="item" index="0">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="1">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="2">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="3">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="4">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="5">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="6">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="7">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="8">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="9">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="10">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="11">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="12">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="13">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                         <at name="item" index="14">
+                          <object classname="[Ljava.lang.Object;" size="5"/>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="rowgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="colgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </item>
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.TabProperty">
+                   <at name="name">tab</at>
+                   <at name="title">Raw</at>
+                   <at name="icon">
+                    <object classname="com.jeta.forms.store.properties.IconProperty">
+                     <at name="embedded">false</at>
+                     <at name="width">0</at>
+                     <at name="height">0</at>
+                    </object>
+                   </at>
+                   <at name="form">
+                    <object classname="com.jeta.forms.store.memento.FormMemento">
+                     <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                      <at name="cellconstraints">
+                       <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                        <at name="column">1</at>
+                        <at name="row">1</at>
+                        <at name="colspan">1</at>
+                        <at name="rowspan">1</at>
+                        <at name="halign">default</at>
+                        <at name="valign">default</at>
+                        <at name="insets" object="insets">0,0,0,0</at>
+                       </object>
+                      </at>
+                      <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+                     </super>
+                     <at name="id">embedded.377421646</at>
+                     <at name="rowspecs">CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE</at>
+                     <at name="colspecs">FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE</at>
+                     <at name="components">
+                      <object classname="java.util.LinkedList">
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">2</at>
+                             <at name="row">2</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextArea</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextArea</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="scrollableTracksViewportHeight">true</at>
+                              <at name="scrollableTracksViewportWidth">true</at>
+                              <at name="name">txtRaw</at>
+                              <at name="width">882</at>
+                              <at name="scollBars">
+                               <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                                <at name="name">scollBars</at>
+                                <at name="verticalpolicy">20</at>
+                                <at name="horizontalpolicy">30</at>
+                                <at name="border">
+                                 <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                  <at name="borders">
+                                   <object classname="java.util.LinkedList">
+                                    <item >
+                                     <at name="value">
+                                      <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                       <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                        <at name="name">border</at>
+                                       </super>
+                                      </object>
+                                     </at>
+                                    </item>
+                                   </object>
+                                  </at>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="height">453</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                      </object>
+                     </at>
+                     <at name="properties">
+                      <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                       <at name="classname">com.jeta.forms.gui.form.GridView</at>
+                       <at name="properties">
+                        <object classname="com.jeta.forms.store.support.PropertyMap">
+                         <at name="border">
+                          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                           <super classname="com.jeta.forms.store.properties.BorderProperty">
+                            <at name="name">border</at>
+                           </super>
+                           <at name="borders">
+                            <object classname="java.util.LinkedList"/>
+                           </at>
+                          </object>
+                         </at>
+                         <at name="name"/>
+                         <at name="fill">
+                          <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                           <at name="name">fill</at>
+                          </object>
+                         </at>
+                         <at name="scollBars">
+                          <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                           <at name="name">scollBars</at>
+                           <at name="verticalpolicy">21</at>
+                           <at name="horizontalpolicy">31</at>
+                           <at name="border">
+                            <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                             <super classname="com.jeta.forms.store.properties.BorderProperty">
+                              <at name="name">border</at>
+                             </super>
+                             <at name="borders">
+                              <object classname="java.util.LinkedList">
+                               <item >
+                                <at name="value">
+                                 <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                 </object>
+                                </at>
+                               </item>
+                              </object>
+                             </at>
+                            </object>
+                           </at>
+                          </object>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="cellpainters">
+                      <object classname="com.jeta.forms.store.support.Matrix">
+                       <at name="rows">
+                        <object classname="[Ljava.lang.Object;" size="3">
+                         <at name="item" index="0">
+                          <object classname="[Ljava.lang.Object;" size="3"/>
+                         </at>
+                         <at name="item" index="1">
+                          <object classname="[Ljava.lang.Object;" size="3"/>
+                         </at>
+                         <at name="item" index="2">
+                          <object classname="[Ljava.lang.Object;" size="3"/>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="rowgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="colgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">929</at>
+            <at name="name"/>
+            <at name="tabCount">2</at>
+            <at name="height">538</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"/>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="3">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JDefaultDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JDefaultDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JDefaultDialog.java	(revision 1126)
@@ -0,0 +1,59 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.impl.DialogPanel;
+
+
+public class JDefaultDialog extends JPanel implements DialogPanel, ActionListener{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5690150555730322101L;
+	//private ScriptingUIManager uimanager;
+
+	public JDefaultDialog(ScriptingUIManager uimanager, DefaultJScriptingComposer composer, JPanel panel){
+		//this.uimanager = uimanager;
+		setLayout(new BorderLayout());
+		add(panel,BorderLayout.CENTER);
+			
+	}
+
+	public void actionAccept() {
+		setVisible(false);
+	}
+
+	public void actionApply() {
+	}
+
+	public void actionCancel() {
+	}
+
+	public boolean isVisibleAccept() {
+		return true;
+	}
+
+	public boolean isVisibleApply() {
+		return false;
+	}
+
+	public boolean isVisibleCancel() {
+		return false;
+	}
+
+	public void actionPerformed(ActionEvent arg0) {
+
+	}
+
+	public JComponent getJComponent() {
+		return this;
+	}
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JMoveScriptPanel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JMoveScriptPanel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JMoveScriptPanel.java	(revision 1126)
@@ -0,0 +1,160 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.JViewport;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.swing.api.JScriptingBrowser;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.scripting.swing.impl.DefaultJScriptingBrowser;
+import org.gvsig.scripting.swing.impl.DialogPanel;
+
+public class JMoveScriptPanel extends JPanel implements DialogPanel, ActionListener{
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private ScriptingUIManager uimanager;
+	private ScriptingManager manager;
+	//private DefaultJScriptingComposer composer;
+	private ScriptingUnit unit;
+	private JMoveScriptModel model;
+	
+	JTextField from = null;
+	JTextField moveTo =null;
+		
+	public JMoveScriptPanel(ScriptingUIManager uimanager, JMoveScriptModel model){
+		this.uimanager = uimanager;
+		this.manager = this.uimanager.getManager();
+		this.model= model;
+		this.unit = model.getUnit();
+		
+		model.setAction(JNewScriptModel.ACTION_CANCEL);
+		
+		setLayout(new GridBagLayout());
+		GridBagConstraints gbc = new GridBagConstraints();
+
+		gbc.insets = new Insets(25,10,0,5);
+		gbc.weightx = 0.5;
+		gbc.fill = GridBagConstraints.HORIZONTAL;
+		gbc.gridx = 0;
+		gbc.gridy = 0;	
+		add(new JLabel(this.uimanager.getTranslation("Move_from")+": "),gbc);
+		gbc.gridx = 1;
+		from = new JTextField(20);
+		from.setText(unit.getParent().getFile().getAbsolutePath());
+		from.setEditable(false);
+		add(from, gbc);
+		
+		gbc.gridx = 0;
+		gbc.gridy = 1;
+		add(new JLabel(this.uimanager.getTranslation("Move_to")+": "),gbc);
+		gbc.gridx = 1;
+		moveTo = new JTextField(20);
+		moveTo.setEditable(false);
+		moveTo.setText(this.manager.getRootUserFolder().getAbsolutePath());
+		add(moveTo, gbc);
+		
+		gbc.insets = new Insets(10,10,25,5);
+		gbc.gridx = 0;
+		gbc.gridy = 2;
+		gbc.gridwidth = 2;
+		DefaultJScriptingBrowser jbrowser = new DefaultJScriptingBrowser(this.uimanager,this.manager.getUserFolder(),true);
+		jbrowser.setPreferredSize(new Dimension(250,100));
+		jbrowser.addActionListener(this);
+		add(jbrowser,gbc);
+		
+	}
+
+	public void actionAccept() {
+		model.setMoveTo(new File(moveTo.getText().trim()));
+		
+//		if(model.getMoveTo().length()==0){
+//			JOptionPane.showMessageDialog(null, "Name must not be empty.", "Error", JOptionPane.ERROR_MESSAGE);
+//			return;
+//		}
+//		
+//		File file = new File(model.getMoveTo());
+//		if(!file.exists() || !file.canWrite()){
+//			JOptionPane.showMessageDialog(null, "Not a valid destination.", "Error", JOptionPane.ERROR_MESSAGE);
+//			return;
+//		}
+//		ScriptingFolder folder = manager.getFolder(file);
+//		if(!manager.validateUnitId(folder,unit.getId())){
+//			JOptionPane.showMessageDialog(null, "There're another file with the same name on the final directory\nRename the file or select another destiny.", "Error", JOptionPane.ERROR_MESSAGE);
+//			return;
+//		}
+		
+		try {
+			model.validate();
+		} catch (Exception e) {
+			JOptionPane.showMessageDialog(null, e.getMessage(), "Info", JOptionPane.INFORMATION_MESSAGE);
+			return;
+		}
+		
+		model.setAction(JNewScriptModel.ACTION_ACCEPT);
+		setVisible(false);
+		
+//		if(manager.validateUnitId(folder,unit.getId())){
+//			if (unit.move(folder)){
+//				JOptionPane.showMessageDialog(null, "File moved succesfully.", "Info", JOptionPane.INFORMATION_MESSAGE);
+//				setVisible(false);
+//				composer.launcherRefresh();
+//			}else{
+//				JOptionPane.showMessageDialog(null, "Unexpected error moving the file", "Error", JOptionPane.ERROR_MESSAGE);
+//			}
+//		}
+//		else
+//			JOptionPane.showMessageDialog(null, "There're another file with the same name on the final directory\nRename the file or select another destiny.", "Error", JOptionPane.ERROR_MESSAGE);
+	}
+
+	public void actionApply() {
+	}
+
+	public void actionCancel() {
+		setVisible(false);
+	}
+
+	public boolean isVisibleAccept() {
+		return true;
+	}
+
+	public boolean isVisibleApply() {
+		return false;
+	}
+
+	public boolean isVisibleCancel() {
+		return true;
+	}
+
+	public void actionPerformed(ActionEvent arg0) {
+        if( arg0.getID() == JScriptingBrowser.SELECTION_ACTION ) {
+            JViewport jView = (JViewport)arg0.getSource();
+            JScrollPane jScroll = (JScrollPane)jView.getParent();
+            DefaultJScriptingBrowser jBrowser = (DefaultJScriptingBrowser)jScroll.getParent();
+            if(jBrowser.getSelectedNode() instanceof ScriptingFolder){
+                ScriptingFolder selectedFolder = (ScriptingFolder)jBrowser.getSelectedNode();
+                moveTo.setText(selectedFolder.getFile().getAbsolutePath());
+            }
+        }
+	}
+	public JComponent getJComponent() {
+		return this;
+	}
+	
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.xml	(revision 1126)
@@ -0,0 +1,1031 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/datos/devel/org.gvsig.scripting/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.xml</at>
+   <at name="rowspecs">CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(0.1),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(0.9),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE</at>
+   <at name="colspecs">FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:MIN(12DLU;DEFAULT):GROW(1.0),FILL:4DLU:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">Name:</at>
+            <at name="width">68</at>
+            <at name="text">Name:</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">top</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">68</at>
+            <at name="name"/>
+            <at name="text">Description:</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">68</at>
+            <at name="name"/>
+            <at name="text">Type:</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">68</at>
+            <at name="name"/>
+            <at name="text">Language:</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">10</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">68</at>
+            <at name="name"/>
+            <at name="text">Save on:</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">13</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">68</at>
+            <at name="name"/>
+            <at name="text">Author:</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">15</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">68</at>
+            <at name="name"/>
+            <at name="text">Version:</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">name</at>
+            <at name="width">505</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextArea</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextArea</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="scrollableTracksViewportHeight">true</at>
+            <at name="scrollableTracksViewportWidth">true</at>
+            <at name="name">description</at>
+            <at name="width">503</at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">20</at>
+              <at name="horizontalpolicy">30</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="height">99</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JComboBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JComboBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">units</at>
+            <at name="width">505</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JComboBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JComboBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">languages</at>
+            <at name="width">505</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">11</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JPanel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JPanel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="name">saveToPanel</at>
+            <at name="width">505</at>
+            <at name="height">203</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">13</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">createdBy</at>
+            <at name="width">505</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">15</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">version</at>
+            <at name="width">505</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">10</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="background" object="color">236,233,216</at>
+            <at name="editable">false</at>
+            <at name="name">saveTo</at>
+            <at name="width">505</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"/>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="16">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="9">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="10">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="11">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="12">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="13">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="14">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+       <at name="item" index="15">
+        <object classname="[Ljava.lang.Object;" size="4"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JNewScriptPanelLayout.xml
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JMoveScriptModel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JMoveScriptModel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JMoveScriptModel.java	(revision 1126)
@@ -0,0 +1,64 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import java.io.File;
+
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingUnit;
+
+public class JMoveScriptModel {
+
+	public final static int ACTION_CANCEL = 0;
+	public final static int ACTION_ACCEPT = 1;
+	
+	private ScriptingUnit unit;
+	private File moveTo;
+	private int action;
+	private ScriptingManager manager;
+	
+	public JMoveScriptModel(ScriptingManager manager, ScriptingUnit unit){
+		this.manager = manager;
+		this.unit = unit;
+	}
+	
+	public void validate() throws Exception{
+		File file = this.getMoveTo();
+		if(file==null){
+			throw new Exception("Destination must not be empty.");
+		}
+		
+		if(!file.exists() || !file.canWrite()){
+			throw new Exception("Not a valid destination.");
+		}
+		
+		ScriptingFolder folder = manager.getFolder(file);
+		if(!manager.validateUnitId(folder,this.getUnit().getId())){
+			throw new Exception("This file already exists.\nWrite another name for the script");
+		}
+	}
+	
+	public void setAction(int action) {
+		this.action = action;
+	}
+	
+	public int getAction() {
+		return action;
+	}
+
+	public void setMoveTo(File moveTo) {
+		this.moveTo = moveTo;
+	}
+
+	public void setMoveTo(String moveTo) {
+		this.moveTo = new File(moveTo);
+	}
+
+	public File getMoveTo() {
+		return moveTo;
+	}
+
+	public ScriptingUnit getUnit() {
+		return unit;
+	}
+	
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScriptView.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScriptView.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/composer/JPropertiesScriptView.java	(revision 1126)
@@ -0,0 +1,204 @@
+package org.gvsig.scripting.swing.impl.composer;
+
+import com.jeta.open.i18n.I18NUtils;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.ComponentOrientation;
+import java.awt.Container;
+import java.awt.Dimension;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+
+
+public class JPropertiesScriptView extends JPanel
+{
+   JLabel lblName = new JLabel();
+   JLabel lblEnabled = new JLabel();
+   JLabel lblCreatedBy = new JLabel();
+   JLabel lblVersion = new JLabel();
+   JLabel lblDescription = new JLabel();
+   JTextField txtName = new JTextField();
+   JCheckBox chkEnabled = new JCheckBox();
+   JTextField txtCreatedBy = new JTextField();
+   JTextField txtVersion = new JTextField();
+   JTextArea txtDescription = new JTextArea();
+   JLabel lblLibraryVersion = new JLabel();
+   JComboBox cboLibraryVersion = new JComboBox();
+   JLabel lblIsolationGroup = new JLabel();
+   JTextField txtIsolationGroup = new JTextField();
+
+   /**
+    * Default constructor
+    */
+   public JPropertiesScriptView()
+   {
+      initializePanel();
+   }
+
+   /**
+    * Adds fill components to empty cells in the first row and first column of the grid.
+    * This ensures that the grid spacing will be the same as shown in the designer.
+    * @param cols an array of column indices in the first row where fill components should be added.
+    * @param rows an array of row indices in the first column where fill components should be added.
+    */
+   void addFillComponents( Container panel, int[] cols, int[] rows )
+   {
+      Dimension filler = new Dimension(10,10);
+
+      boolean filled_cell_11 = false;
+      CellConstraints cc = new CellConstraints();
+      if ( cols.length > 0 && rows.length > 0 )
+      {
+         if ( cols[0] == 1 && rows[0] == 1 )
+         {
+            /** add a rigid area  */
+            panel.add( Box.createRigidArea( filler ), cc.xy(1,1) );
+            filled_cell_11 = true;
+         }
+      }
+
+      for( int index = 0; index < cols.length; index++ )
+      {
+         if ( cols[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) );
+      }
+
+      for( int index = 0; index < rows.length; index++ )
+      {
+         if ( rows[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) );
+      }
+
+   }
+
+   /**
+    * Helper method to load an image file from the CLASSPATH
+    * @param imageName the package and name of the file to load relative to the CLASSPATH
+    * @return an ImageIcon instance with the specified image file
+    * @throws IllegalArgumentException if the image resource cannot be loaded.
+    */
+   public ImageIcon loadImage( String imageName )
+   {
+      try
+      {
+         ClassLoader classloader = getClass().getClassLoader();
+         java.net.URL url = classloader.getResource( imageName );
+         if ( url != null )
+         {
+            ImageIcon icon = new ImageIcon( url );
+            return icon;
+         }
+      }
+      catch( Exception e )
+      {
+         e.printStackTrace();
+      }
+      throw new IllegalArgumentException( "Unable to load image: " + imageName );
+   }
+
+   /**
+    * Method for recalculating the component orientation for 
+    * right-to-left Locales.
+    * @param orientation the component orientation to be applied
+    */
+   public void applyComponentOrientation( ComponentOrientation orientation )
+   {
+      // Not yet implemented...
+      // I18NUtils.applyComponentOrientation(this, orientation);
+      super.applyComponentOrientation(orientation);
+   }
+
+   public JPanel createPanel()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE","CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      lblName.setName("lblName");
+      lblName.setText("Name");
+      jpanel1.add(lblName,cc.xy(2,2));
+
+      lblEnabled.setName("lblEnabled");
+      lblEnabled.setText("Enabled");
+      jpanel1.add(lblEnabled,cc.xy(2,4));
+
+      lblCreatedBy.setName("lblCreatedBy");
+      lblCreatedBy.setText("Created by");
+      jpanel1.add(lblCreatedBy,cc.xy(2,6));
+
+      lblVersion.setName("lblVersion");
+      lblVersion.setText("Version");
+      jpanel1.add(lblVersion,cc.xy(2,8));
+
+      lblDescription.setName("lblDescription");
+      lblDescription.setText("Description");
+      jpanel1.add(lblDescription,cc.xy(2,16));
+
+      txtName.setName("txtName");
+      jpanel1.add(txtName,cc.xy(4,2));
+
+      chkEnabled.setName("chkEnabled");
+      jpanel1.add(chkEnabled,cc.xy(4,4));
+
+      txtCreatedBy.setName("txtCreatedBy");
+      jpanel1.add(txtCreatedBy,cc.xy(4,6));
+
+      txtVersion.setName("txtVersion");
+      jpanel1.add(txtVersion,cc.xy(4,8));
+
+      txtDescription.setName("txtDescription");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(txtDescription);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xywh(2,18,3,1));
+
+      lblLibraryVersion.setName("lblLibraryVersion");
+      lblLibraryVersion.setText("Library version to use");
+      jpanel1.add(lblLibraryVersion,cc.xy(2,10));
+
+      cboLibraryVersion.setName("cboLibraryVersion");
+      jpanel1.add(cboLibraryVersion,cc.xy(4,10));
+
+      lblIsolationGroup.setName("lblIsolationGroup");
+      lblIsolationGroup.setText("Isolation group");
+      jpanel1.add(lblIsolationGroup,cc.xy(2,12));
+
+      txtIsolationGroup.setName("txtIsolationGroup");
+      jpanel1.add(txtIsolationGroup,cc.xy(4,12));
+
+      JLabel jlabel1 = new JLabel();
+      jlabel1.setText("Leave this box blank if you are not clear what to put in it.");
+      jpanel1.add(jlabel1,cc.xy(4,14));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 });
+      return jpanel1;
+   }
+
+   /**
+    * Initializer
+    */
+   protected void initializePanel()
+   {
+      setLayout(new BorderLayout());
+      add(createPanel(), BorderLayout.CENTER);
+   }
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJThinG.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJThinG.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/DefaultJThinG.java	(revision 1126)
@@ -0,0 +1,66 @@
+package org.gvsig.scripting.swing.impl;
+
+import java.awt.BorderLayout;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.gvsig.scripting.swing.api.JThinG;
+
+import thing.gvSIGHandler;
+import thinlet.Thinlet;
+
+public class DefaultJThinG extends JThinG{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 3055671299132201898L;
+	gvSIGHandler handler;
+	protected Thinlet thinlet;
+
+	public DefaultJThinG() {
+		super();
+		setLayout(new BorderLayout());
+		MyThinlet thinlet = new MyThinlet();
+		handler = new gvSIGHandler((Thinlet)thinlet);
+		Object components[] = thinlet.getItems(thinlet.root);
+		thinlet.setBoolean(components[0], "visible", false);
+		thinlet.setBoolean(components[components.length-1], "visible", false);
+		this.add(thinlet, BorderLayout.CENTER);
+		this.thinlet = thinlet;
+	}
+	
+	public void load(File file){
+		handler.load(file);
+	}
+	
+	public void save(File dialogFile) {
+		handler.save(dialogFile);
+	}
+	
+	public Thinlet getThinlet() {
+		return this.thinlet;
+	}
+	
+	static public class MyThinlet extends Thinlet{
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = -2084146460159813832L;
+		Object root;
+		
+		public Object parse(InputStream arg0, Object arg1) throws IOException {
+			root = super.parse(arg0, arg1);
+			return root;
+		}
+		
+		public Object getRoot(){
+			return this.root;
+		}
+	}
+
+	
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/ScriptingSwingDefaultSwingLibrary.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/ScriptingSwingDefaultSwingLibrary.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/java/org/gvsig/scripting/swing/impl/ScriptingSwingDefaultSwingLibrary.java	(revision 1126)
@@ -0,0 +1,27 @@
+package org.gvsig.scripting.swing.impl;
+
+import org.gvsig.scripting.swing.api.ScriptingSwingLibrary;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.tools.library.AbstractLibrary;
+import org.gvsig.tools.library.LibraryException;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+
+public class ScriptingSwingDefaultSwingLibrary extends AbstractLibrary {
+
+    @Override
+    public void doRegistration() {
+        registerAsImplementationOf(ScriptingSwingLibrary.class);
+    }
+
+    @Override
+    protected void doInitialize() throws LibraryException {
+        ScriptingSwingLocator.registerUIManager(DefaultScriptingUIManager.class);
+        ToolsSwingLocator.registerScriptSwingManager(DefaultScriptingUIManager.class);
+    }
+
+    @Override
+    protected void doPostInitialize() throws LibraryException {
+        // Nothing to do
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/javadoc/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/javadoc/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/src/main/javadoc/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl/pom.xml	(revision 1126)
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.gvsig.scripting.swing.impl</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <parent>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.scripting.swing</artifactId>
+        <version>2.3.75</version>
+    </parent>
+    <dependencies>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.tools.swing.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.thing</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.about.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.lib.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.lib.impl</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.swing.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.help</groupId>
+            <artifactId>javahelp</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.fifesoft</groupId>
+            <artifactId>rsyntaxtextarea</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.fifesoft</groupId>
+            <artifactId>rstaui</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.installer.lib.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.installer.lib.spi</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.jeta</groupId>
+            <artifactId>formsrt</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.jgoodies</groupId>
+            <artifactId>jgoodies-forms</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.tools.lib</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.ui</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.installer.swing.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.tools.util.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <!-- TODO: MAKE TESTS WORK AND REMOVE THIS OPTION -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing/org.gvsig.scripting.swing.impl
___________________________________________________________________
Added: svn:ignore
   + .settings
target
.classpath
.project

bin



Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.swing
___________________________________________________________________
Added: svn:ignore
   + target
.settings
.project


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/resources/README.txt	(revision 1126)
@@ -0,0 +1,11 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+Put into this folder the resources needed by your test classes.
+
+This folder is added to the Tests classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, in this folder you can find an example of log4j configuration,
+prepared to log messages through the console, so logging works when you
+run your tests classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/resources/log4j.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/resources/log4j.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/resources/log4j.xml	(revision 1126)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- 
+Log4J configuration file for unit tests execution.
+ -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appender configuration to show logging messages through the console -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
+		</layout>
+	</appender>
+
+	<!-- 
+	Activate logging messages of DEBUG level of higher only for the
+	DefaultExampleManager class.
+	You can put full classes names or packages instead, to configure
+	logging for all the classes and subpackages of the package.
+	-->
+	<category name="org.gvsig.scripting.impl.DefaultExampleManager">
+		<priority value="DEBUG" />
+	</category>
+
+	<!-- 
+	By default, show only logging messages of INFO level or higher, 
+	through the previously configured CONSOLE appender. 
+	-->
+	<root>
+		<priority value="INFO" />
+		<appender-ref ref="CONSOLE" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/java/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/java/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/test/java/README.txt	(revision 1126)
@@ -0,0 +1,8 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+For each class you are going to test, create one Test class with the same
+name as the class to test, ending with Test.
+
+For example, the unit tests of the "ExampleLibrary" class are performed
+by the "ExampleLibraryTest" class.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Settings.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Settings.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Settings.java	(revision 1126)
@@ -0,0 +1,96 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.util.prefs.Preferences;
+
+
+/**
+ * Get and set user preferences for ThinG, using the JDK 1.4 preferences API.
+ *
+ * @author Dirk Moebius
+ */
+public class Settings
+{
+
+    private static final String KEY_PREFS = "thing";
+    private static final String KEY_ICON_DIR = "iconDir";
+    private static final String KEY_LAST_DIR = "lastDir";
+    private static final String KEY_SERIALIZE_INDENT_CHAR = "serializeIndentChar";
+    private static final String KEY_SERIALIZE_INDENT_SIZE = "serializeIndentSize";
+    private static final String KEY_SERIALIZE_HEADER = "serializeHeader";
+
+
+    public static final String getIconDir()
+    {
+        return getPreferences().get(KEY_ICON_DIR, ".");
+    }
+
+
+    public static final void setIconDir(String iconDir)
+    {
+        getPreferences().put(KEY_ICON_DIR, iconDir);
+    }
+
+
+    public static final String getLastDir()
+    {
+        return getPreferences().get(KEY_LAST_DIR, System.getProperty("user.home"));
+    }
+
+
+    public static final void setLastDir(String lastDir)
+    {
+        getPreferences().put(KEY_LAST_DIR, lastDir);
+    }
+
+
+    public static final char getSerializeIndentChar()
+    {
+        return (char) getPreferences().getInt(KEY_SERIALIZE_INDENT_CHAR, (int) ' ');
+    }
+
+
+    public static final void setSerializeIndentChar(char indentChar)
+    {
+        getPreferences().putInt(KEY_SERIALIZE_INDENT_CHAR, (int) indentChar);
+    }
+
+
+    public static final int getSerializeIndentSize()
+    {
+        return getPreferences().getInt(KEY_SERIALIZE_INDENT_SIZE, 4);
+    }
+
+
+    public static final void setSerializeIndentSize(int indentSize)
+    {
+        getPreferences().putInt(KEY_SERIALIZE_INDENT_SIZE, indentSize);
+    }
+
+
+    public static final String getSerializeHeader()
+    {
+        return getPreferences().get(KEY_SERIALIZE_HEADER,
+            "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"
+            + System.getProperty("line.separator")
+            + "<!-- generated by ThinG, the Thinlet GUI editor -->"
+            + System.getProperty("line.separator"));
+    }
+
+
+    public static final void setSerializeHeader(String serializeHeader)
+    {
+        getPreferences().put(KEY_SERIALIZE_HEADER, serializeHeader);
+    }
+
+
+    private static Preferences getPreferences()
+    {
+        return Preferences.userRoot().node(KEY_PREFS);
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/SettingsDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/SettingsDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/SettingsDialog.java	(revision 1126)
@@ -0,0 +1,106 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.awt.Frame;
+import java.io.File;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+import thinletcommons.AntiAliasedThinlet;
+import thinletcommons.DirChooser;
+import thinletcommons.ThinletDialog;
+
+
+/**
+ * Dialog "Edit Settings".
+ *
+ * @author Dirk Moebius
+ */
+public class SettingsDialog
+{
+
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private ThinletDialog dialog;
+    private Thinlet thinlet;
+
+
+    public SettingsDialog(Frame owner)
+    {
+        this.dialog = new ThinletDialog(owner, "Settings");
+        this.thinlet = new AntiAliasedThinlet();
+
+        try
+        {
+            Object panel = thinlet.parse("/thing/settings.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing settings.xml", e);
+        }
+
+        dialog.setContent(thinlet);
+    }
+
+
+    public void show()
+    {
+        String iconpath = Settings.getIconDir();
+        if(iconpath.equals("."))
+            iconpath = "";
+
+        thinlet.setString(thinlet.find("tIconpath"), "text", iconpath);
+        thinlet.setString(thinlet.find("spIndentSize"), "text", String.valueOf(Settings.getSerializeIndentSize()));
+        thinlet.setString(thinlet.find("tCustomHeader"), "text", Settings.getSerializeHeader());
+        thinlet.setBoolean(thinlet.find("rbIndentSpace"), "selected", Settings.getSerializeIndentChar() == ' ');
+        thinlet.setBoolean(thinlet.find("rbIndentTab"), "selected", Settings.getSerializeIndentChar() == '\t');
+
+        dialog.pack();
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+    }
+
+
+    public void chooseDir(Object tIconpath, String iconpath)
+    {
+        DirChooser chooser = new DirChooser(dialog, "Choose Directory...");
+        if(iconpath != null && iconpath.trim().length() > 0)
+            chooser.setSelectedDirectory(new File(iconpath));
+        chooser.show();
+        File dir = chooser.getSelectedDirectory();
+        if(debug()) log.fine("selected: " + dir);
+        if(dir != null)
+            thinlet.setString(tIconpath, "text", dir.getAbsolutePath());
+    }
+
+
+    public void ok(String iconpath, String indentSize, boolean indentSpace, boolean indentTab, String customHeader)
+    {
+        String path = iconpath.trim();
+        Settings.setIconDir((path.length() == 0) ? "." : path);
+
+        Settings.setSerializeIndentChar(indentSpace ? ' ' : '\t');
+        Settings.setSerializeIndentSize(Integer.parseInt(indentSize));
+        Settings.setSerializeHeader(customHeader);
+
+        close();
+    }
+
+
+    public void close()
+    {
+        dialog.setVisible(false);
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletDTD.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletDTD.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletDTD.java	(revision 1126)
@@ -0,0 +1,650 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+/**
+ * This class encapsulates the DTD for Thinlet DTD.
+ *
+ * <p>
+ * The DTD structure is copied from <code>Thinlet.java</code>. It must be
+ * adapted whenever the original structure in <code>Thinlet.java</code>
+ * changes.
+ * </p>
+ * <p>
+ * The other classes and methods in this class provide some handy accessors for
+ * the contents of the DTD. See {@link ThinletDTD.Widget} and
+ * {@link ThinletDTD.Property}.
+ *
+ *
+ * Note: 
+ * 	Eliminated attribute i18n to support Thinlet 2005/03/28
+ * 
+ * 	gvSIG Team
+ * 
+ * 
+ *
+ *
+ * @author Dirk Moebius
+ */
+public class ThinletDTD
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    //{{{ copied from Thinlet.java
+    private static final Object[] dtd;
+    static
+    {
+        Integer integer_1 = new Integer(-1);
+        Integer integer0 = new Integer(0);
+        Integer integer1 = new Integer(1);
+        String[] orientation = { "horizontal", "vertical" };
+        String[] leftcenterright = { "left", "center", "right" };
+        String[] selections = { "single", "interval", "multiple" }; //+none
+        dtd = new Object[] {
+            "component", null, new Object[][] {
+                { "string", "name", null, null },
+                { "boolean", "enabled", "paint", Boolean.TRUE },
+                { "boolean", "visible", "parent", Boolean.TRUE },
+                //{ "boolean", "i18n", "validate", Boolean.FALSE }, // for I18N
+                { "string", "tooltip", null, null },
+                { "font", "font", "validate", null },
+                { "color", "foreground", "paint", null },
+                { "color", "background", "paint", null },
+                { "integer", "width", "validate", integer0 },
+                { "integer", "height", "validate", integer0 },
+                { "integer", "colspan", "validate", integer1 },
+                { "integer", "rowspan", "validate", integer1 },
+                { "integer", "weightx", "validate", integer0 },
+                { "integer", "weighty", "validate", integer0 },
+                { "choice", "halign", "validate",
+                    new String[] { "fill", "center", "left", "right" } },
+                { "choice", "valign", "validate",
+                new String[] { "fill", "center", "top", "bottom" } },
+                // component class String null*
+                // parent Object null
+                // (bounds) Rectangle 0 0 0 0
+                { "property", "property", null, null },
+                { "method", "init" },
+                { "method", "focuslost" },
+                { "method", "focusgained" } },
+            "label", "component", new Object[][] {
+                { "string", "text", "validate", null },
+                { "icon", "icon", "validate", null },
+                { "choice", "alignment", "validate", leftcenterright },
+                { "integer", "mnemonic", "paint", integer_1 },
+                { "component", "for", null, null } },
+            "button", "label", new Object[][] {
+                { "choice", "alignment", "validate", new String[] { "center", "left", "right" } },
+                { "method", "action" },
+                { "choice", "type", "paint", new String[] { "normal", "default", "cancel", "link" } } },
+            "checkbox", "label", new Object[][] {
+                { "boolean", "selected", "paint", Boolean.FALSE }, //...group
+                { "string", "group", "paint", null }, //...group
+                { "method", "action" } },
+            "togglebutton", "checkbox", null,
+            "combobox", "textfield", new Object[][] {
+                { "icon", "icon", "validate", null },
+                { "integer", "selected", "layout", integer_1 } },
+            "choice", null, new Object[][] {
+                { "string", "name", null, null },
+                { "boolean", "enabled", "paint", Boolean.TRUE },
+                { "boolean", "i18n", "validate", Boolean.FALSE }, // for I18N
+                { "string", "text", "parent", null },
+                { "icon", "icon", "parent", null },
+                { "choice", "alignment", "parent", leftcenterright },
+                { "string", "tooltip", null, null },
+                { "font", "font", "validate", null },
+                { "color", "foreground", "paint", null },
+                { "color", "background", "paint", null },
+                { "property", "property", null, null } },
+            "textfield", "component", new Object[][] {
+                { "string", "text", "layout", "" },
+                { "integer", "columns", "validate", integer0 },
+                { "boolean", "editable", "paint", Boolean.TRUE },
+                { "integer", "start", "layout", integer0 },
+                { "integer", "end", "layout", integer0 },
+                { "method", "action" },
+                { "method", "insert" },
+                { "method", "remove" },
+                { "method", "caret" },
+                { "method", "perform" } },
+            "passwordfield", "textfield", null,
+            "textarea", "textfield", new Object[][] {
+                { "integer", "rows", "validate", integer0 },
+                { "boolean", "border", "validate", Boolean.TRUE },
+                { "boolean", "wrap", "layout", Boolean.FALSE } },
+            "tabbedpane", "component", new Object[][] {
+                { "choice", "placement", "validate",
+                    new String[] { "top", "left", "bottom", "right", "stacked" } },
+                { "integer", "selected", "paint", integer0 },
+                { "method", "action" } }, //...focus
+            "tab", "choice", new Object[][] {
+                { "integer", "mnemonic", "paint", integer_1 } },
+            "panel", "component", new Object[][] {
+                { "integer", "columns", "validate", integer0 },
+                { "integer", "top", "validate", integer0 },
+                { "integer", "left", "validate", integer0 },
+                { "integer", "bottom", "validate", integer0 },
+                { "integer", "right", "validate", integer0 },
+                { "integer", "gap", "validate", integer0 },
+                { "string", "text", "validate", null },
+                { "icon", "icon", "validate", null },
+                { "boolean", "border", "validate", Boolean.FALSE },
+                { "boolean", "scrollable", "validate", Boolean.FALSE } },
+            "desktop", "component", null,
+            "dialog", "panel", new Object[][] {
+                { "boolean", "modal", null, Boolean.FALSE },
+                { "boolean", "resizable", null, Boolean.FALSE },
+                { "method", "close" },
+                { "boolean", "maximizable", "paint", Boolean.FALSE },
+                { "boolean", "iconifiable", "paint", Boolean.FALSE },
+                // closable allowed but deprecated, cannot be edited
+                { "boolean", "closable", null, Boolean.FALSE } },
+            "spinbox", "textfield", new Object[][] {
+                { "integer", "minimum", null, new Integer(Integer.MIN_VALUE) },
+                { "integer", "maximum", null, new Integer(Integer.MAX_VALUE) },
+                { "integer", "step", null, integer1 },
+                { "integer", "value", null, integer0 } }, // == text? deprecated
+            "progressbar", "component", new Object[][] {
+                { "choice", "orientation", "validate", orientation },
+                { "integer", "minimum", "paint", integer0 }, //...checkvalue
+                { "integer", "maximum", "paint", new Integer(100) },
+                { "integer", "value", "paint", integer0 } },
+                // change stringpainted
+            "slider", "progressbar", new Object[][] {
+                { "integer", "unit", null, new Integer(5) },
+                { "integer", "block", null, new Integer(25) },
+                { "method", "action" } },
+                // minor/majortickspacing
+                // inverted
+                // labelincrement labelstart
+            "splitpane", "component", new Object[][] {
+                { "choice", "orientation", "validate", orientation },
+                { "integer", "divider", "layout", integer_1 } },
+            "list", "component", new Object[][] {
+                { "choice", "selection", "paint", selections },
+                { "method", "action" },
+                { "method", "perform" },
+                { "boolean", "line", "validate", Boolean.TRUE } },
+            "item", "choice", new Object[][] {
+                { "boolean", "selected", null, Boolean.FALSE } },
+            "table", "list", new Object[][] {
+                /*{ "choice", "selection",
+                    new String[] { "singlerow", "rowinterval", "multiplerow",
+                        "cell", "cellinterval",
+                        "singlecolumn", "columninterval", "multiplecolumn" } }*/ },
+            "header", null, new Object[][] {
+                { "method", "action" },
+                { "boolean", "resizable", null, Boolean.TRUE } },
+                // reordering allowed
+                // autoresize mode: off next (column boundries) subsequents last all columns
+                // column row selection
+                // selection row column cell
+                // editing row/column
+            "column", "choice", new Object[][] {
+                { "integer", "width", null, new Integer(80) },
+                { "choice", "sort", null, new String[] { "none", "ascent", "descent" } },
+                { "boolean", "selected", null, Boolean.FALSE } },
+            "row", null, new Object[][] {
+                { "boolean", "selected", null, Boolean.FALSE } },
+            "cell", "choice", null,
+            "tree", "list", new Object[][] {
+                { "boolean", "angle", null, Boolean.FALSE },
+                { "method", "expand" },
+                { "method", "collapse" } },
+            "node", "choice", new Object[][] {
+                { "boolean", "selected", null, Boolean.FALSE },
+                { "boolean", "expanded", null, Boolean.TRUE } },
+            "separator", "component", null,
+            "menubar", "component", new Object[][] {
+                { "choice", "placement", "validate", new String[] { "top", "bottom" } } },
+            "menu", "choice", new Object[][] {
+                { "integer", "mnemonic", "paint", integer_1 } },
+            "menuitem", "choice", new Object[][] {
+                { "keystroke", "accelerator", null, null },
+                { "method", "action" },
+                { "integer", "mnemonic", "paint", integer_1 } },
+            "checkboxmenuitem", "menuitem", new Object[][] {
+                { "boolean", "selected", "paint", Boolean.FALSE }, //...group
+                { "string", "group", "paint", null } }, //...group
+            "popupmenu", "component", new Object[][] {
+                { "method", "menushown" } }, // Post menu: Shift+F10
+            "bean", "component", new Object[][] {
+                { "bean", "bean", null, null } }
+        };
+    }
+    //}}}
+
+
+    //{{{ class initialization
+    private static final String[] components =
+    {
+        "bean",  "button",  "checkbox",  "combobox",  "desktop",  "dialog",
+        "label",  "list",  "menubar",  "panel",  "passwordfield",  "popupmenu",
+        "progressbar",  "separator",  "slider",  "spinbox",  "splitpane",
+        "tabbedpane",  "table",  "textarea",  "textfield",  "togglebutton",
+        "tree"
+    };
+
+    private static final Object[] allowedSubWidgets =
+    {
+        // component        add allowed for...
+        // ---------------- ---------------------------------------------------
+        "bean",             new String[] { "popupmenu" },
+        "button",           new String[] { "popupmenu" },
+        "cell",             new String[] { },
+        "checkbox",         new String[] { "popupmenu" },
+        "checkboxmenuitem", new String[] { },
+        "choice",           new String[] { },
+        "column",           new String[] { },
+        "combobox",         new String[] { "choice", "popupmenu" },
+        "desktop",          components,
+        "dialog",           components,
+        "header",           new String[] { "column" },
+        "item",             new String[] { },
+        "label",            new String[] { "popupmenu" },
+        "list",             new String[] { "item", "popupmenu" },
+        "menu",             new String[] { "menu", "menuitem", "checkboxmenuitem", "separator" },
+        "menubar",          new String[] { "menu" },
+        "menuitem",         new String[] { },
+        "node",             new String[] { "node" },
+        "panel",            components,
+        "passwordfield",    new String[] { "popupmenu" },
+        "popupmenu",        new String[] { "menu", "menuitem", "checkboxmenuitem", "separator" },
+        "progressbar",      new String[] { "popupmenu" },
+        "row",              new String[] { "cell" },
+        "separator",        new String[] { "popupmenu" },
+        "slider",           new String[] { "popupmenu" },
+        "spinbox",          new String[] { "popupmenu" },
+        "splitpane",        components,
+        "tab",              components,
+        "tabbedpane",       new String[] { "tab", "popupmenu" },
+        "table",            new String[] { "row", "header", "popupmenu" },
+        "textarea",         new String[] { "popupmenu" },
+        "textfield",        new String[] { "popupmenu" },
+        "togglebutton",     new String[] { "popupmenu" },
+        "tree",             new String[] { "node", "popupmenu" }
+    };
+
+
+    private static final HashMap widgets;
+
+    static
+    {
+        widgets = new HashMap();
+
+        for(int i = 0; i < dtd.length; i += 3)
+        {
+            // create Widget
+            String classname = (String) dtd[i];
+            Widget widget = new Widget(classname);
+            widgets.put(classname, widget);
+            // add properties
+            Object[][] propDefs = (Object[][]) dtd[i + 2];
+            Property[] properties = new Property[0];
+            if(propDefs != null)
+            {
+                TreeSet props = new TreeSet();
+                for(int j = 0; j < propDefs.length; ++j)
+                {
+                    String type = (String) propDefs[j][0];
+                    String name = (String) propDefs[j][1];
+                    Object defaultValue = (propDefs[j].length > 3) ? propDefs[j][3] : null;
+                    props.add(new Property(widget, name, type, defaultValue));
+                }
+                properties = (Property[]) props.toArray(new Property[props.size()]);
+            }
+            widget.setProperties(properties);
+        }
+
+        // set parent-child relationship
+        for(int i = 0; i < dtd.length; i += 3)
+        {
+            String classname = (String) dtd[i];
+            String parentclassname = (String) dtd[i + 1];
+            Widget widget = (Widget) widgets.get(classname);
+            Widget parentWidget = (Widget) widgets.get(parentclassname);
+            widget.setParent(parentWidget);
+        }
+
+        // set add-allowed relationship
+        for(int i = 0; i < allowedSubWidgets.length; i += 2)
+        {
+            String classname = (String) allowedSubWidgets[i];
+            String[] allowed = (String[]) allowedSubWidgets[i + 1];
+            if(allowed.length > 0)
+            {
+                Widget widget = (Widget) widgets.get(classname);
+                for(int j = 0; j < allowed.length; ++j)
+                {
+                    Widget allowedWidget = (Widget) widgets.get(allowed[j]);
+                    widget.addAllowedSubWidget(allowedWidget);
+                }
+            }
+        }
+    }
+    //}}}
+
+
+    public static Widget getWidget(String classname)
+    {
+        Widget widget = (Widget) widgets.get(classname);
+        if(widget == null)
+            throw new IllegalArgumentException("unknown classname: " + classname);
+        else
+            return widget;
+    }
+
+
+    public static Property[] getProperties(String classname)
+    {
+        return getWidget(classname).getProperties();
+    }
+
+
+    public static Property getProperty(String classname, String propName)
+    {
+        Property property = getWidget(classname).getProperty(propName);
+        if(property != null)
+            return property;
+        else
+            throw new IllegalArgumentException("unknown property: " + propName + " in class: " + classname);
+    }
+
+
+    //{{{ class Widget
+    /**
+     * A Widget represents a Thinlet component, such as "button" or "label".
+     *
+     * <p>
+     * Note that Widgets are comparable. The default sort order is to sort by
+     * name.
+     * </p>
+     */
+    public static class Widget implements Comparable
+    {
+        private String classname;
+        private Widget parent;
+        private Property[] properties;
+        private ArrayList allowedSubWidgets = new ArrayList();
+        private boolean allPropertiesCalculated = false;
+        private HashMap propMap = new HashMap();
+
+        Widget(String classname)
+        {
+            this.classname = classname;
+        }
+
+        void setProperties(Property[] properties)
+        {
+            this.properties = properties;
+        }
+
+        void setParent(Widget parent)
+        {
+            this.parent = parent;
+        }
+
+        void addAllowedSubWidget(Widget w)
+        {
+            this.allowedSubWidgets.add(w);
+        }
+
+        public String getClassname()
+        {
+            return classname;
+        }
+
+        public Widget getParent()
+        {
+            return parent;
+        }
+
+        public String getParentClassname()
+        {
+            return getParent() != null ? getParent().getClassname() : null;
+        }
+
+        public Property getProperty(String propName)
+        {
+            calculateAllProperties();
+            return (Property) this.propMap.get(propName);
+        }
+
+        public boolean hasProperty(String propName)
+        {
+            return getProperty(propName) != null;
+        }
+
+        public Property[] getProperties()
+        {
+            calculateAllProperties();
+            return properties;
+        }
+
+        public Widget[] getAllowedSubWidgets()
+        {
+            return (Widget[]) allowedSubWidgets.toArray(new Widget[allowedSubWidgets.size()]);
+        }
+
+        public boolean isSubWidgetAllowed(Widget subWidget)
+        {
+            return isSubWidgetAllowed(subWidget.getClassname());
+        }
+
+        public boolean isSubWidgetAllowed(String classname)
+        {
+            for(Iterator it = allowedSubWidgets.iterator(); it.hasNext(); )
+                if(classname.equals(((Widget)it.next()).getClassname()))
+                    return true;
+            return false;
+        }
+
+        /**
+         * Checks whether the class of this Widget is derived from the Widget
+         * with the specified classname, by checking the parents of this
+         * Widget.
+         */
+        public boolean isInstanceOf(String classname)
+        {
+            if(classname.equals(getClassname()))
+                return true;
+            if(getParent() == null)
+                return false;
+            return getParent().isInstanceOf(classname);
+        }
+
+        //{{{ Comparable interface
+        public boolean equals(Object obj)
+        {
+            if(obj instanceof Widget)
+                return getClassname().equals(((Widget)obj).getClassname());
+            else
+                return false;
+        }
+
+        public int hashCode()
+        {
+            return getClassname().hashCode() + 7;
+        }
+
+        public int compareTo(Object obj)
+        {
+            Widget other = (Widget) obj;
+            return this.getClassname().compareTo(other.getClassname());
+        }
+        //}}}
+
+        public String toString()
+        {
+            return getClassname();
+        }
+
+        private void calculateAllProperties()
+        {
+            if(!this.allPropertiesCalculated)
+            {
+                // add all parent properties recursively to this.properties
+                // using a TreeSet, so that the properties are sorted.
+                TreeSet set = new TreeSet();
+                Widget widget = this;
+                while(widget != null)
+                {
+                    set.addAll(Arrays.asList(widget.properties));
+                    widget = widget.getParent();
+                }
+                this.properties = (Property[]) set.toArray(new Property[set.size()]);
+
+                // build map for fast access by property name
+                for(int i=0; i < this.properties.length; ++i)
+                    this.propMap.put(this.properties[i].getName(), this.properties[i]);
+
+                this.allPropertiesCalculated = true;
+            }
+        }
+    }
+    //}}}
+
+
+    //{{{ class Property
+    /**
+     * A Property represents an attribute of a Thinlet component, such as
+     * "width", "name" or "action".
+     *
+     * <p>
+     * Note that Properties are comparable. The default sort order is to sort
+     * by its parenting widget first, then by name.
+     * </p>
+     */
+    public static class Property implements Comparable
+    {
+        public static final int STRING = 0;
+        public static final int INTEGER = 1;
+        public static final int BOOLEAN = 2;
+        public static final int CHOICE = 3;
+        public static final int COLOR = 4;
+        public static final int ICON = 5;
+        public static final int FONT = 6;
+        public static final int KEYSTROKE = 7;
+        public static final int METHOD = 8;
+        public static final int BEAN = 9;
+        public static final int PROPERTY = 10;
+        public static final int COMPONENT = 11; // see "label.for" property
+
+        private static final String[] allTypes = { "string", "integer",
+            "boolean", "choice", "color", "icon", "font", "keystroke",
+            "method", "bean", "property", "component" };
+
+        private Widget widget;
+        private String name;
+        private int type;
+        private Object defaultValue;
+
+        Property(Widget widget, String name, String type, Object defaultValue)
+        {
+            this.widget = widget;
+            this.name = name;
+            this.defaultValue = defaultValue;
+            this.type = -1;
+
+            for(int i = 0; i < allTypes.length; ++i)
+            {
+                if(allTypes[i].equals(type))
+                {
+                    this.type = i;
+                    break;
+                }
+            }
+
+            if(this.type == -1)
+                throw new IllegalArgumentException("unknown property type: " + type);
+        }
+
+        public Widget getWidget()
+        {
+            return widget;
+        }
+
+        public int getType()
+        {
+            return type;
+        }
+
+        public String getName()
+        {
+            return name;
+        }
+
+        public Object getDefaultValue()
+        {
+            return (type == CHOICE) ? getChoices()[0] : defaultValue;
+        }
+
+        /**
+         * If this property is of type {@link #CHOICE} then return the possible
+         * choices, otherwise return null.
+         */
+        public String[] getChoices()
+        {
+            return (type == CHOICE) ? (String[]) defaultValue : null;
+        }
+
+        public String getTypeName()
+        {
+            return getTypeName(getType());
+        }
+
+        public static String getTypeName(int type)
+        {
+            return allTypes[type];
+        }
+
+        //{{{ Comparable interface
+        public boolean equals(Object obj)
+        {
+            if(obj instanceof Property)
+            {
+                Property prop = (Property)obj;
+                return this.getWidget().equals(prop.getWidget())
+                    && this.getName().equals(prop.getName());
+            }
+            else
+                return false;
+        }
+
+        public int hashCode()
+        {
+            return getWidget().hashCode() * 3 + getName().hashCode() + 7;
+        }
+
+        public int compareTo(Object obj)
+        {
+            Property other = (Property) obj;
+            return this.getName().compareTo(other.getName());
+        }
+        //}}}
+
+        public String toString()
+        {
+            return getName();
+        }
+    }
+    //}}}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Main.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Main.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Main.java	(revision 1126)
@@ -0,0 +1,186 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.awt.Image;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.LogManager;
+
+import thinlet.FrameLauncher;
+
+import thinletcommons.AntiAliasedThinlet;
+
+import utils.AWTUtils;
+
+
+/**
+ * ThinG main class.
+ *
+ * @author Dirk Moebius
+ */
+public class Main extends AntiAliasedThinlet
+{
+
+    private static Logger log;
+
+    private Handler handler;
+
+
+    Main()
+    {
+        this.handler = new Handler(this);
+    }
+
+
+    /**
+     * Called by <code>thinlet.FrameLauncher</code> when the user tries to
+     * close the frame containing the thinlet. Overridden to check for unsaved
+     * changes in the editor.
+     *
+     * @return true if the application should exit.
+     */
+    public boolean destroy()
+    {
+        return handler.exit();
+    }
+
+
+    /**
+     * The ThinG main method.
+     */
+    public static void main(String[] args)
+    {
+        initLogging(args);
+        log.info("Creating ThinG main application window...");
+        Main main = new Main();
+        Image icon = AWTUtils.getIcon(main, "icons/thing.gif");
+        //new FrameLauncher("ThinG - [Untitled]", icon, main, 800, 600, true);
+        log.info("ThinG started.");
+    }
+
+
+    static String getVersion()
+    {
+        Properties props = new Properties();
+
+        try
+        {
+            props.load(Main.class.getResourceAsStream("version.properties"));
+            return props.getProperty("version", "#unknown#");
+        }
+        catch(IOException e)
+        {
+            log.log(Level.SEVERE, "error get version from version.properties", e);
+        }
+
+        return "#unknown#";
+    }
+
+
+    private static void initLogging(String[] args)
+    {
+        // get default logger (console handler)
+        log = Logger.getLogger("thing");
+
+        // read logging configuration
+        boolean success = false;
+        // 1. try to read from file $HOME/.thing.logging.properties if that exists
+        File file = new File(System.getProperty("user.home"), ".thing.logging.properties");
+        success = success || readLoggingProperties(file, "Error reading logging properties from file: " + file);
+        // 2. try to read from /logging.properties inside thing.jar (should exist)
+        InputStream is = Main.class.getResourceAsStream("/logging.properties");
+        success = success || readLoggingProperties(is, "Error reading /logging.properties from classpath");
+        if(!success)
+            log.log(Level.SEVERE, "Using default logger.");
+
+        if(isOptionSet(args, "--debug"))
+            setLoggingDebugLevel();
+    }
+
+
+    private static boolean isOptionSet(String[] args, String option)
+    {
+        for(int i = 0; i < args.length; ++i)
+            if(args[i].equals(option))
+                return true;
+        return false;
+    }
+
+
+    /** set all handlers to log level FINEST */
+    private static void setLoggingDebugLevel()
+    {
+        log.log(Level.INFO, "--debug option set; FINEST logging level selected.");
+        Enumeration loggerNames = LogManager.getLogManager().getLoggerNames();
+        while(loggerNames.hasMoreElements())
+        {
+            String loggerName = (String) loggerNames.nextElement();
+            Logger logger = LogManager.getLogManager().getLogger(loggerName);
+            if(logger != null)
+            {
+                java.util.logging.Handler[] handlers = logger.getHandlers();
+                for(int j = 0; j < handlers.length; ++j)
+                    handlers[j].setLevel(Level.FINEST);
+            }
+        }
+    }
+
+
+    private static boolean readLoggingProperties(File file, String errorMsg)
+    {
+        if(file.exists() && file.canRead())
+        {
+            try
+            {
+                InputStream is = new BufferedInputStream(new FileInputStream(file));
+                return readLoggingProperties(is, errorMsg);
+            }
+            catch(IOException e)
+            {
+                log.log(Level.SEVERE, errorMsg, e);
+            }
+        }
+        return false;
+    }
+
+
+    private static boolean readLoggingProperties(InputStream is, String errorMsg)
+    {
+        if(is != null)
+        {
+            try
+            {
+                LogManager.getLogManager().readConfiguration(is);
+                // replace default logger
+                log = Logger.getLogger("thing");
+                return true;
+            }
+            catch(IOException e)
+            {
+                log.log(Level.SEVERE, errorMsg, e);
+            }
+            finally
+            {
+                try { is.close(); } catch(IOException ignore) {}
+            }
+        }
+        else
+        {
+            log.log(Level.SEVERE, errorMsg);
+            log.log(Level.SEVERE, "InputStream is null.");
+        }
+        return false;
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ComponentChooser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ComponentChooser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ComponentChooser.java	(revision 1126)
@@ -0,0 +1,177 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+import thinletcommons.AntiAliasedThinlet;
+import thinletcommons.ThinletDialog;
+
+
+/**
+ * A simple modal dialog that shows all named components in the given
+ * Thinlet component tree and lets the user select a named component.
+ *
+ * The dialog is modal and blocks the calling frame/dialog. It is therefore
+ * displayed in a separate window.
+ *
+ * @author Dirk Moebius
+ */
+public class ComponentChooser
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private ThinletDialog dialog;
+    private Thinlet thinlet;
+    private boolean isCancelled = true;
+
+
+    public ComponentChooser(Frame owner, String title, Object topComponent, String omitName)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        this.thinlet = new AntiAliasedThinlet();
+
+        try
+        {
+            Object panel = thinlet.parse("/thing/componentchooser.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing componentchooser.xml", e);
+        }
+
+        dialog.setContent(thinlet);
+
+        // fill list
+        Object list = thinlet.find("list");
+        String[] names = getAllNames(thinlet, topComponent, omitName);
+        for(int i = 0; i < names.length; ++i)
+        {
+            Object item = Thinlet.create("item");
+            thinlet.setString(item, "text", names[i]);
+            thinlet.add(list, item);
+        }
+    }
+
+
+    /**
+     * Show the modal dialog.
+     * This halts the application until the user dismisses the dialog.
+     */
+    public void show()
+    {
+        dialog.setSize(new Dimension(300,300));
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+    }
+
+
+    public void setSelectedComponent(String name)
+    {
+        Object lSelected = thinlet.find("lSelected");
+
+        if(name == null || name.length() == 0)
+        {
+            thinlet.setString(lSelected, "text", "null");
+            return;
+        }
+
+        Object list = thinlet.find("list");
+        Object[] items = thinlet.getItems(list);
+        boolean found = false;
+
+        for(int i = 0; i < items.length; ++i)
+        {
+            String text = thinlet.getString(items[i], "text");
+            found = text.equals(name);
+            if(found)
+            {
+                thinlet.setBoolean(items[i], "selected", true);
+                break;
+            }
+        }
+
+        thinlet.setString(lSelected, "text", found ? name : (name + "?"));
+    }
+
+
+    public String getSelectedComponent()
+    {
+         Object item = thinlet.getSelectedItem(thinlet.find("list"));
+         if(item != null)
+             return thinlet.getString(item, "text");
+         else
+             return null;
+    }
+
+
+    public boolean isCancelled()
+    {
+        return !dialog.isVisible() && isCancelled;
+    }
+
+
+    //{{{ callbacks for componentchooser.xml
+    /** Thinlet callback. */
+    public void selectionChanged(Object list, Object lSelected)
+    {
+        Object item = thinlet.getSelectedItem(list);
+        thinlet.setString(lSelected, "text", item != null ? thinlet.getString(item, "text") : "null");
+    }
+
+
+    /** Thinlet callback. */
+    public void ok()
+    {
+        isCancelled = false;
+        close();
+    }
+
+
+    public void close()
+    {
+        dialog.setVisible(false);
+    }
+    //}}}
+
+
+    //{{{ private methods
+    private static String[] getAllNames(final Thinlet thinlet, final Object topComponent, final String omitName)
+    {
+        final TreeSet names = new TreeSet();
+        ComponentWalker walker = new ComponentWalker();
+        walker.walk(thinlet, topComponent, new ComponentWalker.Visitor()
+        {
+            public boolean visit(Object component, int depth)
+            {
+                ThinletDTD.Widget widget = ThinletDTD.getWidget(Thinlet.getClass(component));
+                if(widget.hasProperty("name"))
+                {
+                    String name = thinlet.getString(component, "name");
+                    if(name != null && name.length() > 0 && !name.equals(omitName))
+                        names.add(name);
+                }
+                return true;
+            }
+            public void leave(Object component, int depth) {}
+        });
+
+        return (String[]) names.toArray(new String[names.size()]);
+    }
+    //}}}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Generator.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Generator.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Generator.java	(revision 1126)
@@ -0,0 +1,907 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Writer;
+import java.text.DateFormat;
+import java.text.MessageFormat;
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.TreeSet;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.LogManager;
+
+import thinlet.Thinlet;
+
+
+/**
+ * TODO: needs documentation.
+ *
+ * @author Dirk Moebius
+ */
+public class Generator
+{
+
+    //{{{ logging
+    private static Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private static final ResourceBundle res = ResourceBundle.getBundle("thing.generator");
+
+
+    private String handlerClassname;
+    private String interfaceName;
+    private String packageName;
+    private boolean asThinlet = false;
+    private boolean generateMain = false;
+    private boolean generateFirstLine = true;
+    private File outputDir;
+    private Writer interfaceWriter;
+    private Writer handlerWriter;
+    private TreeSet methods;
+
+
+    public Generator()
+    {
+    }
+
+
+    public void setHandlerClassname(String name)
+    {
+        if(name != null && name.toLowerCase().endsWith(".java"))
+            this.handlerClassname = name.substring(0, name.length() - 5);
+        else
+            this.handlerClassname = name;
+    }
+
+
+    public void setInterfaceName(String name)
+    {
+        if(name != null && name.toLowerCase().endsWith(".java"))
+            this.interfaceName = name.substring(0, name.length() - 5);
+        else
+            this.interfaceName = name;
+    }
+
+
+    public void setPackageName(String name)
+    {
+        this.packageName = name;
+    }
+
+
+    public void setGenerateAsThinlet(boolean asThinlet)
+    {
+        this.asThinlet = asThinlet;
+    }
+
+
+    public void setGenerateMain(boolean generateMain)
+    {
+        this.generateMain = generateMain;
+    }
+
+
+    public void setOutputDirectory(File outputDir)
+    {
+        this.outputDir = outputDir;
+        if(debug()) log.fine("output directory set to: " + (outputDir == null ? "null" : outputDir.getAbsolutePath()));
+    }
+
+
+    public void setWriterForInterface(Writer writer)
+    {
+        if(debug()) log.fine("using custom writer for interface");
+        this.interfaceWriter = writer;
+    }
+
+
+    public void setWriterForHandler(Writer writer)
+    {
+        if(debug()) log.fine("using custom writer for handler class");
+        this.handlerWriter = writer;
+    }
+
+
+    public void setGenerateFirstLine(boolean generateFirstLine)
+    {
+        this.generateFirstLine = generateFirstLine;
+    }
+
+
+    public void generate(
+        final Thinlet thinlet,
+        final Object startComponent,
+        final PropertyManager propmgr,
+        final String thinletfilename)
+        throws IOException
+    {
+        setup();
+        begin(thinletfilename);
+
+        ComponentWalker walker = new ComponentWalker();
+        walker.walk(thinlet, startComponent, new ComponentWalker.Visitor()
+        {
+            public boolean visit(Object component, int depth)
+            {
+                String componentclassname = Thinlet.getClass(component);
+                ThinletDTD.Widget widget = ThinletDTD.getWidget(componentclassname);
+                ThinletDTD.Property[] props = widget.getProperties();
+                for(int i = 0; i < props.length; ++i)
+                {
+                    if(props[i].getType() == ThinletDTD.Property.METHOD)
+                    {
+                        String methodDecl = propmgr.getValueString(component, props[i]);
+                        if(methodDecl != null && methodDecl.length() > 0)
+                        {
+                            String componentname = propmgr.getValueString(component, "name");
+                            try
+                            {
+                                method(methodDecl, props[i].getName(), componentname, componentclassname,
+                                    new HashMap()
+                                    {
+                                        public Object get(Object key)
+                                        {
+                                            String name = (String) key;
+                                            Object component = thinlet.find(startComponent, name);
+                                            if(component == null)
+                                                return null;
+                                            String classname = Thinlet.getClass(component);
+                                            return ThinletDTD.getWidget(classname);
+                                        }
+                                    });
+                            }
+                            catch(IOException e)
+                            {
+                                throw new RuntimeException("I/O Error", e);
+                            }
+                        }
+                    }
+                }
+                return true;
+            }
+
+            public void leave(Object component, int depth) {}
+        });
+
+        finish(thinletfilename);
+    }
+
+
+    public void generate(File thinletFile) throws IOException, ParseException
+    {
+        if(debug()) log.fine("thinletFile: " + thinletFile.getAbsolutePath() + " exists: " + thinletFile.exists());
+
+        if(outputDir == null)
+            outputDir = thinletFile.getParentFile();
+
+        // 1st pass: parse thinlet file for named widgets
+        final HashMap namedWidgets = getNamedWidgets(thinletFile);
+
+        setup();
+        begin(thinletFile.getName());
+
+        // 2nd pass: parse thinlet file for methods:
+        FileReader fileReader = new FileReader(thinletFile);
+        ThinletReader thinletReader = new ThinletReader();
+        thinletReader.parse(fileReader, new ThinletReader.SAXHandler()
+        {
+            public void startElement(String componentclassname, Hashtable attributelist)
+            {
+                ThinletDTD.Widget widget = ThinletDTD.getWidget(componentclassname);
+                ThinletDTD.Property[] props = widget.getProperties();
+                for(int i = 0; i < props.length; ++i)
+                {
+                    if(props[i].getType() == ThinletDTD.Property.METHOD)
+                    {
+                        String methodDecl = (String) attributelist.get(props[i].getName());
+                        if(methodDecl != null && methodDecl.length() > 0)
+                        {
+                            String componentname = (String) attributelist.get("name");
+                            try
+                            {
+                                method(methodDecl, props[i].getName(), componentname,
+                                    componentclassname, namedWidgets);
+                            }
+                            catch(IOException e)
+                            {
+                                throw new RuntimeException("I/O Error", e);
+                            }
+                        }
+                    }
+                }
+            }
+
+            public void endElement() {}
+        });
+        fileReader.close();
+
+        finish(thinletFile.getName());
+    }
+
+
+    private HashMap getNamedWidgets(File thinletFile) throws IOException, ParseException
+    {
+        final HashMap namedWidgets = new HashMap();
+        FileReader fileReader = new FileReader(thinletFile);
+        ThinletReader thinletReader = new ThinletReader();
+        thinletReader.parse(fileReader, new ThinletReader.SAXHandler()
+        {
+            public void startElement(String componentclassname, Hashtable attributelist)
+            {
+                String name = (String) attributelist.get("name");
+                if(name != null)
+                {
+                    ThinletDTD.Widget widget = ThinletDTD.getWidget(componentclassname);
+                    namedWidgets.put(name, widget);
+                }
+            }
+
+            public void endElement() {}
+        });
+        fileReader.close();
+        if(debug()) log.fine("named widgets: " + namedWidgets);
+        return namedWidgets;
+    }
+
+
+    /**
+     * Visit a method.
+     *
+     * @param methodpropertyname  the property for the method, e.g. "action", "init", "perform" etc.
+     */
+    private void method(
+        String methodDecl,
+        String methodpropertyname,
+        String componentname,
+        String componentclassname,
+        HashMap namedWidgets)
+        throws IOException
+    {
+        if(componentname != null && componentname.length() == 0)
+            componentname = null;
+
+        MethodInfo info = MethodInfo.parseMethodDecl(methodDecl, methodpropertyname,
+            componentname, componentclassname, namedWidgets);
+
+        if(methods.contains(info))
+        {
+            if(debug()) log.fine("method already in set: " + info);
+            info.generalize();
+            methods.remove(info);
+            methods.add(info);
+        }
+        else
+        {
+            if(debug()) log.fine("adding method \"" + info.getSignature(true) + "\" from " + info.toString());
+            methods.add(info);
+        }
+    }
+
+
+    private void setup() throws IOException
+    {
+        if(handlerClassname == null && interfaceName == null)
+            throw new IllegalArgumentException("specify either handlerClassname or interfaceName, or both");
+        if(handlerClassname == null && asThinlet)
+            throw new IllegalArgumentException("option asThinlet only valid for handler generation");
+        if(handlerClassname == null && generateMain)
+            throw new IllegalArgumentException("option generateMain only valid for handler generation");
+
+        if(interfaceName != null && interfaceWriter == null)
+        {
+            if(outputDir == null)
+                throw new IllegalArgumentException("specify either outputDir or interfaceWriter");
+            interfaceWriter = new FileWriter(new File(outputDir, interfaceName + ".java"));
+        }
+
+        if(handlerClassname != null && handlerWriter == null)
+        {
+            if(outputDir == null)
+                throw new IllegalArgumentException("specify either outputDir or handlerWriter");
+            handlerWriter = new FileWriter(new File(outputDir, handlerClassname + ".java"));
+        }
+
+        methods = new TreeSet();
+    }
+
+
+    private void begin(String thinletFilename) throws IOException
+    {
+        if(interfaceWriter != null)
+            writeInterfaceHeader(thinletFilename);
+        if(handlerWriter != null)
+            writeHandlerHeader(thinletFilename);
+    }
+
+
+    private void writeInterfaceHeader(String thinletFilename) throws IOException
+    {
+        String javadoc = "Interface for the callback methods in \"<code>" + thinletFilename + "</code>\".";
+        writeHeader(interfaceWriter, javadoc, "");
+        interfaceWriter.write(msg("interface.signature", interfaceName));
+    }
+
+
+    private void writeHandlerHeader(String thinletFilename) throws IOException
+    {
+        String additionalImport = generateMain ? "import thinlet.FrameLauncher;" : "";
+        String javadoc = asThinlet ?
+            ("A thinlet with the contents of \"<code>" + thinletFilename + "</code>\".")
+            : ("Callback handler class for the methods in \"<code>" + thinletFilename + "</code>\".");
+        writeHeader(handlerWriter, javadoc, additionalImport);
+
+        String extendsClause = asThinlet ? " extends Thinlet" : "";
+        String implementsClause =  (interfaceName != null) ? (" implements " + interfaceName) : "";
+
+        handlerWriter.write(msg("handler.signature", handlerClassname, extendsClause, implementsClause));
+
+        if(asThinlet)
+            handlerWriter.write(msg("class.asThinlet.constructor", handlerClassname, thinletFilename));
+    }
+
+
+    private void writeHeader(Writer writer, String javadocComment, String additionalImport) throws IOException
+    {
+        if(generateFirstLine)
+            writer.write(msg("file.header.firstline", new Date()));
+
+        if(packageName != null)
+            writer.write(msg("file.header.package", packageName));
+
+        writer.write(msg("file.header", additionalImport, javadocComment));
+    }
+
+
+    private void writeMethods(Writer writer, boolean asInterface) throws IOException
+    {
+        for(Iterator it = methods.iterator(); it.hasNext(); )
+            writeMethod(writer, (MethodInfo) it.next(), asInterface);
+    }
+
+
+    private void writeMethod(Writer writer, MethodInfo info, boolean asInterface) throws IOException
+    {
+        writer.write(info.getJavaDocComment());
+        if(asInterface)
+            writer.write(msg("method.body.interface", info.getSignature(true)));
+        else
+            writer.write(msg("method.body.handler", info.getSignature(true)));
+    }
+
+
+    private void writeFooter(Writer writer) throws IOException
+    {
+        writer.write(msg("file.footer"));
+        writer.flush();
+        writer.close();
+    }
+
+
+    private void finish(String thinletFilename) throws IOException
+    {
+        if(interfaceWriter != null)
+        {
+            writeMethods(interfaceWriter, true);
+            writeFooter(interfaceWriter);
+            interfaceWriter = null;
+        }
+        if(handlerWriter != null)
+        {
+            writeMethods(handlerWriter, false);
+            if(generateMain)
+                if(asThinlet)
+                    handlerWriter.write(msg("main.asThinlet", handlerClassname));
+                else
+                    handlerWriter.write(msg("main.notAsThinlet", handlerClassname, thinletFilename));
+            writeFooter(handlerWriter);
+            handlerWriter = null;
+        }
+    }
+
+
+    private static String capitalize(String s)
+    {
+        if(s == null) return null;
+        if(s.length() == 0) return s;
+        if(s.length() == 1) return s.toUpperCase();
+        return s.substring(0, 1).toUpperCase() + s.substring(1);
+    }
+
+
+    private static String msg(String key) { return msg(key, null, null, null, null, null); }
+    private static String msg(String key, Object arg0) { return msg(key, arg0, null, null, null, null); }
+    private static String msg(String key, Object arg0, Object arg1) { return msg(key, arg0, arg1, null, null, null); }
+    private static String msg(String key, Object arg0, Object arg1, Object arg2) { return msg(key, arg0, arg1, arg2, null, null); }
+    private static String msg(String key, Object arg0, Object arg1, Object arg2, Object arg3) { return msg(key, arg0, arg1, arg2, arg3, null); }
+
+
+    private static String msg(String key, Object arg0, Object arg1, Object arg2, Object arg3, Object arg4)
+    {
+        try
+        {
+            String template = res.getString(key);
+            return MessageFormat.format(template, new Object[] { arg0, arg1, arg2, arg3, arg4 });
+        }
+        catch(MissingResourceException e)
+        {
+            return "###missing resource key '" + key + "', args=['" + arg0
+                + "','" + arg1 + "','" + arg2 + "','" + arg3 + "','" + arg4 + "']###";
+        }
+    }
+
+
+    //{{{ inner classes
+    private static class ArgInfo
+    {
+        String paramclassname;
+        String paramname;
+        String componentclassname;
+        boolean isThinlet = false;
+        boolean isItem = false;
+        boolean isObject = false;
+        String reference;
+        String propertyname;
+        String itemclassname;
+        int nameDuplicateCount = 0;
+
+
+        public String getParamName()
+        {
+            return (nameDuplicateCount == 0) ? paramname : (paramname + nameDuplicateCount);
+        }
+
+
+        public String getSignature(boolean withParamNames)
+        {
+            StringBuffer buf = new StringBuffer(paramclassname);
+            if(withParamNames)
+                buf.append(' ').append(getParamName());
+            return buf.toString();
+        }
+
+
+        public String getJavaDocComment()
+        {
+            if(isThinlet)
+                return "the thinlet.";
+            else
+            {
+                StringBuffer buf = new StringBuffer();
+                if(!isObject)
+                    buf.append("the ").append(propertyname).append(" property of ");
+                if(isItem)
+                    buf.append("the selected ").append(itemclassname);
+                else
+                    if(reference != null)
+                        buf.append("the ").append(componentclassname)
+                            .append(" named '").append(reference).append("'");
+                    else
+                        buf.append("a ").append(componentclassname);
+                buf.append('.');
+                return buf.toString();
+            }
+        }
+
+
+        public void generalize()
+        {
+            reference = null;
+            if(isItem)
+                paramname = "a" + capitalize(itemclassname);
+            else
+                paramname = "a" + capitalize(componentclassname);
+            if(!isObject)
+                paramname += capitalize(propertyname);
+        }
+
+
+        public String toString()
+        {
+            return new StringBuffer("ArgInfo[paramclassname=").append(paramclassname)
+                .append(", paramname=").append(getParamName())
+                .append(", componentclassname=").append(componentclassname)
+                .append(", isThinlet=").append(isThinlet)
+                .append(", isObject=").append(isObject)
+                .append(", isItem=").append(isItem)
+                .append(", reference=").append(reference)
+                .append(", propertyname=").append(propertyname)
+                .append(", itemclassname=").append(itemclassname).append("]")
+                .toString();
+        }
+    }
+
+
+    private static class MethodInfo implements Comparable
+    {
+        private String methodDecl;
+        private String methodpropertyname;
+        private String componentname;
+        private String componentclassname;
+        private String methodname;
+        private ArgInfo[] args;
+
+
+        private static MethodInfo parseMethodDecl(
+            String methodDecl,
+            String methodpropertyname,
+            String componentname,
+            String componentclassname,
+            HashMap namedWidgets)
+        {
+            MethodInfo info = new MethodInfo();
+            info.methodDecl = methodDecl;
+            info.methodpropertyname = methodpropertyname;
+            info.componentname = componentname;
+            info.componentclassname = componentclassname;
+
+            StringTokenizer st = new StringTokenizer(methodDecl, "(, \r\n\t)");
+            int n = st.countTokens();
+            info.methodname = st.nextToken();
+            info.args = new ArgInfo[n - 1];
+
+            for(int i = 0; st.hasMoreTokens(); ++i)
+            {
+                String arg = st.nextToken();
+                info.args[i] = new ArgInfo();
+                if("thinlet".equals(arg))
+                {
+                    info.args[i].isThinlet = true;
+                    info.args[i].paramclassname = "Thinlet";
+                    info.args[i].paramname = "thinlet";
+                }
+                else
+                {
+                    int dot = arg.indexOf('.');
+                    String compname = (dot == -1) ? arg : arg.substring(0, dot);
+                    ThinletDTD.Widget widget;
+                    if("item".equals(compname))
+                    {
+                        info.args[i].componentclassname = componentclassname;
+                        info.args[i].isItem = true;
+                        info.args[i].paramname = ((componentname != null)
+                            ? componentname
+                            : "a" + capitalize(componentclassname))
+                            + "Item";
+                        if ("list".equals(componentclassname))
+                            info.args[i].itemclassname = "item";
+                        else if ("tree".equals(componentclassname))
+                            info.args[i].itemclassname = "node";
+                        else if ("table".equals(componentclassname))
+                            info.args[i].itemclassname = "row";
+                        else if ("combobox".equals(componentclassname))
+                            info.args[i].itemclassname = "choice";
+                        else if ("tabbedpane".equals(componentclassname))
+                            info.args[i].itemclassname = "tab";
+                        else
+                            throw new IllegalArgumentException(componentclassname + " has no item");
+                        widget = ThinletDTD.getWidget(info.args[i].itemclassname);
+                    }
+                    else
+                    {
+                        if("this".equals(compname))
+                        {
+                            widget = ThinletDTD.getWidget(componentclassname);
+                            info.args[i].componentclassname = componentclassname;
+                            info.args[i].paramname = (componentname != null ? componentname
+                                : ("a" + capitalize(componentclassname)));
+                            info.args[i].reference = componentname;
+                        }
+                        else
+                        {
+                            // named widget
+                            widget = (ThinletDTD.Widget) namedWidgets.get(compname);
+                            if(widget == null)
+                                throw new IllegalArgumentException("named component not found: " + compname + ", in method: " + methodDecl);
+                            info.args[i].componentclassname = widget.getClassname();
+                            info.args[i].paramname = compname;
+                            info.args[i].reference = compname;
+                        }
+                    }
+                    if(dot == -1)
+                    {
+                        info.args[i].isObject = true;
+                        info.args[i].paramclassname = "Object";
+                    }
+                    else
+                    {
+                        String propName = arg.substring(dot + 1);
+                        info.args[i].propertyname = propName;
+                        ThinletDTD.Property property = widget.getProperty(propName);
+                        if(property == null)
+                            throw new IllegalArgumentException("property not found: " + propName + ", at token: " + arg + ", in method: " + methodDecl);
+                        info.args[i].paramname += capitalize(property.getName());
+                        switch(property.getType())
+                        {
+                            case ThinletDTD.Property.STRING:
+                            case ThinletDTD.Property.CHOICE:
+                                info.args[i].paramclassname = "String";
+                                break;
+                            case ThinletDTD.Property.INTEGER:
+                                info.args[i].paramclassname = "int";
+                                break;
+                            case ThinletDTD.Property.BOOLEAN:
+                                info.args[i].paramclassname = "boolean";
+                                break;
+                            case ThinletDTD.Property.ICON:
+                                info.args[i].paramclassname = "java.awt.Image";
+                                break;
+                            default:
+                                throw new IllegalArgumentException("unsupported property type: " + property.getTypeName());
+                        }
+                    }
+                }
+            } // for
+
+            info.makeParamNamesUnique();
+            return info;
+        }
+
+
+        private void makeParamNamesUnique()
+        {
+            HashSet names = new HashSet();
+            for(int i = 0; i < args.length; ++i)
+            {
+                while(names.contains(args[i].getParamName()))
+                    args[i].nameDuplicateCount++;
+                names.add(args[i].getParamName());
+            }
+        }
+
+
+        public void generalize()
+        {
+            componentclassname = null;
+            methodpropertyname = null;
+            componentname = null;
+            for(int i = 0; i < args.length; ++i)
+                args[i].generalize();
+        }
+
+
+        public String getSignature(boolean withParamNames)
+        {
+            StringBuffer buf = new StringBuffer(methodname).append("(");
+            for(int i = 0; i < args.length; ++i)
+            {
+                if(i > 0) buf.append(", ");
+                buf.append(args[i].getSignature(withParamNames));
+            }
+            buf.append(")");
+            return buf.toString();
+        }
+
+
+        public String getJavaDocComment()
+        {
+            // JavaDoc header
+            StringBuffer buf = new StringBuffer();
+            buf.append("Callback handler");
+            if(methodpropertyname != null)
+            {
+                // "for the 'action' method of button 'bOk'" or
+                // "for the 'action' method of an unnamed button"
+                buf.append(" for the '").append(methodpropertyname).append("' method of ");
+                if(componentname != null)
+                    buf.append(componentclassname).append(" '").append(componentname).append("'");
+                else
+                    buf.append("an unnamed ").append(componentclassname);
+            }
+            buf.append(".");
+
+            StringBuffer javadoc = new StringBuffer();
+            javadoc.append(msg("method.javadoc.header", buf.toString()));
+
+            // @param arguments
+            if(args.length > 0)
+            {
+                javadoc.append(msg("method.javadoc.param.intro"));
+                for(int i = 0; i < args.length; ++i)
+                {
+                    javadoc.append(msg("method.javadoc.param",
+                        args[i].getParamName(),
+                        args[i].getJavaDocComment()));
+                }
+            }
+
+            // " */"
+            javadoc.append(msg("method.javadoc.footer"));
+
+            return javadoc.toString();
+        }
+
+
+        public int compareTo(Object obj)
+        {
+            MethodInfo other = (MethodInfo) obj;
+            return getSignature(false).compareTo(other.getSignature(false));
+        }
+
+
+        public boolean equals(Object obj)
+        {
+            if(obj instanceof MethodInfo)
+                return getSignature(false).equals(((MethodInfo)obj).getSignature(false));
+            else
+                return false;
+        }
+
+
+        public int hashCode()
+        {
+            return getSignature(false).hashCode();
+        }
+
+
+        public String toString()
+        {
+            return new StringBuffer("MethodInfo[methodDecl=").append(methodDecl)
+                .append(", methodpropertyname=").append(methodpropertyname)
+                .append(", componentname=").append(componentname)
+                .append(", componentclassname=").append(componentclassname)
+                .append(", methodname=").append(methodname)
+                .append(", args=").append(Arrays.asList(args)).append("]")
+                .toString();
+        }
+
+    }
+    //}}}
+
+
+    //{{{ main method (and helper methods for main())
+    public static void main(String[] args) throws IOException, ParseException
+    {
+        initLogging();
+
+        String filename = null;
+        String handlerClassname = null;
+        String interfaceName = null;
+        String packageName = null;
+        boolean asThinlet = false;
+        boolean generateMain = false;
+
+        for(int i = 0; i < args.length; ++i)
+        {
+            String arg = args[i];
+            if(arg.startsWith("--"))
+            {
+                if(arg.equals("--handler"))
+                    if(i < args.length - 1)
+                        handlerClassname = args[++i];
+                    else
+                        error("option --handler must be followed by a class name");
+                else if(arg.equals("--interface"))
+                    if(i < args.length - 1)
+                        interfaceName = args[++i];
+                    else
+                        error("option --interface must be followed by a class name");
+                else if(arg.equals("--package"))
+                    if(i < args.length - 1)
+                        packageName = args[++i];
+                    else
+                        error("option --package must be followed by a package name");
+                else if(arg.equals("--asThinlet"))
+                    asThinlet = true;
+                else if(arg.equals("--generateMain"))
+                    generateMain = true;
+                else if(arg.equals("--help"))
+                    usage(0);
+                else
+                    error("unknown option: " + arg);
+            }
+            else if(arg.startsWith("-"))
+                error("unknown option: " + arg);
+            else
+                if(filename != null)
+                    error("specify exactly one thinlet file");
+                else
+                    filename = arg;
+        }
+
+        if(filename == null)
+            error("no thinlet file given");
+        if(handlerClassname == null && interfaceName == null)
+            error("specify either --handler or --interface, or both");
+        if(handlerClassname == null && asThinlet)
+            error("option --asThinlet only valid for --handler generation");
+        if(handlerClassname == null && generateMain)
+            error("option --generateMain only valid for --handler generation");
+
+        File thinletFile = new File(filename);
+        if(!thinletFile.isAbsolute())
+            thinletFile = new File(System.getProperty("user.dir"), filename);
+        File outputDir = thinletFile.getParentFile();
+
+        Generator generator = new Generator();
+        generator.setHandlerClassname(handlerClassname);
+        generator.setInterfaceName(interfaceName);
+        generator.setPackageName(packageName);
+        generator.setGenerateAsThinlet(asThinlet);
+        generator.setGenerateMain(generateMain);
+        generator.setOutputDirectory(outputDir);
+        generator.generate(thinletFile);
+
+        System.exit(0);
+    }
+
+
+    private static void error(String msg)
+    {
+        System.err.println("Error: " + msg);
+        System.err.println();
+        System.exit(2);
+    }
+
+
+    private static void usage(int exitStatus)
+    {
+        System.out.println("ThinG Generator");
+        System.out.println("Usage: java thing.Generator [options] thinlet-file");
+        System.out.println("Options:");
+        System.out.println("  --handler name     Generate handler class <name>");
+        System.out.println("  --interface name   Generate interface <name> for handler class");
+        System.out.println("  --package name     Generated code is in package <name>");
+        System.out.println("  --asThinlet        Handler class is a Thinlet");
+        System.out.println("  --generateMain     Generate main()");
+        System.out.println();
+        System.out.println("  Either --handler or --interface must be specified, or both.");
+        System.out.println("  Options --asThinlet and --generateMain are only valid if --handler is set.");
+        System.out.println();
+        System.exit(exitStatus);
+    }
+
+
+    private static void initLogging()
+    {
+        // get default logger (console handler)
+        log = Logger.getLogger("thing");
+
+        // read logging configuration
+        InputStream is = Main.class.getResourceAsStream("/logging.properties");
+        if(is != null)
+        {
+            try
+            {
+                LogManager.getLogManager().readConfiguration(is);
+                // replace default logger
+                log = Logger.getLogger("thing");
+            }
+            catch(IOException e)
+            {
+                log.log(Level.SEVERE, "Error reading /logging.properties from classpath", e);
+                log.log(Level.SEVERE, "Using default logger.");
+            }
+            finally
+            {
+                try { is.close(); } catch(IOException ignore) {}
+            }
+        }
+        else
+        {
+            log.log(Level.SEVERE, "Error reading /logging.properties from classpath; could not find /logging.properties");
+            log.log(Level.SEVERE, "Using default logger.");
+        }
+    }
+    //}}}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletWorkarounds.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletWorkarounds.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletWorkarounds.java	(revision 1126)
@@ -0,0 +1,300 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.awt.AWTKeyStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.HashSet;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import thinlet.Thinlet;
+
+
+/**
+ * This class encapsulates workarounds for missing functionality in
+ * Thinlet.java.
+ * <p>
+ * Some of Thinlet's private methods needed by ThinG are copied here and have
+ * at times been sligtly modified. This methods need to be adapted when
+ * their counterparts in Thinlet.java changes.
+ * <p>
+ * Some other helper methods are here, that should better be put into
+ * Thinlet.java.
+ *
+ * @author Dirk Moebius
+ */
+public class ThinletWorkarounds
+{
+    //{{{ private methods copied from Thinlet.java
+    /**
+     * Copied from <code>Thinlet.java</code>:
+     * Get a specified sub-component or component part. Key is e.g. "header" (table header),
+     * ":parent" (parent component), ":comp" (head of a component list),
+     * ":next" (next component in a list), "popupmenu" is a popupmenu, etc ...
+     */
+    static Object get(Object component, String key) {
+        for (Object[] entry = (Object[]) component; entry != null;
+        entry = (Object[]) entry[2]) {
+            if (key.equals((String)entry[0])) {
+                return entry[1];
+            }
+        }
+        return null;
+    }
+    //}}}
+
+
+    //{{{ methods missing in Thinlet.java
+    /**
+     * Gets the property value of the given component by the property key.
+     * This method should really be in Thinlet.java.
+     */
+    public static Color getColor(Object component, String key)
+    {
+        return (Color) get(component, key);
+    }
+
+
+    /**
+     * Gets the font of the given component, or the font of the thinlet, if
+     * the font of the component has not been set explicitely.
+     * This method should really be in Thinlet.java.
+     */
+    public static Font getFont(Thinlet thinlet, Object component, String key)
+    {
+        Font font = getFont(component, key);
+        return font == null ? thinlet.getFont() : font;
+    }
+
+
+    /**
+     * Gets the property value of the given component by the property key,
+     * in this case, a font. In most cases, the property key is "font".
+     * This method should really be in Thinlet.java.
+     */
+    public static Font getFont(Object component, String key)
+    {
+        return (Font) get(component, key);
+    }
+
+
+    /**
+     *
+     */
+    public static AWTKeyStroke getKeystroke(Object component, String key)
+    {
+        Object value = get(component, key);
+        if (value != null) {
+            long keystroke = ((Long) value).longValue();
+            int modifiers = (int) (keystroke >> 32);
+            int keycode = (int) (keystroke & 0xffff);
+            return AWTKeyStroke.getAWTKeyStroke(keycode, modifiers);
+        }
+        return null;
+    }
+
+
+    /**
+     * Ripped off <code>Thinlet.addAttribute()</code>: returns a <code>Color</code>
+     * object for a color description such as "#A0A0A0" or "0xA0A0A0" or
+     * "240,240,240".
+     */
+    public static Color string2color(String value)
+    {
+        if(value == null) return null;
+        if(value.length() == 0) return null;
+        int color = 0;
+        if (value.startsWith("#")) { color = Integer.parseInt(value.substring(1), 16); }
+        else if (value.startsWith("0x")) { color = Integer.parseInt(value.substring(2), 16); }
+        else { // three separated integer including red, green, and blue
+            StringTokenizer st = new StringTokenizer(value, " \r\n\t,");
+            color = 0xff000000 | ((Integer.parseInt(st.nextToken()) & 0xff) << 16) |
+            ((Integer.parseInt(st.nextToken()) & 0xff) << 8) |
+            (Integer.parseInt(st.nextToken()) & 0xff);
+        }
+        return new Color(color);
+    }
+
+
+    /**
+     * Ripped off <code>Thinlet.addAttribute()</code>: returns a <code>Font</code>
+     * object for a thinlet font description such as "Serif 10 bold italic".
+     */
+    public static Font string2font(Thinlet thinlet, String value)
+    {
+        Font font = thinlet.getFont(); // default thinlet font
+        String name = null;
+        boolean bold = false; boolean italic = false;
+        int size = 0;
+        StringTokenizer st = new StringTokenizer(value);
+        while (st.hasMoreTokens()) {
+            String token = st.nextToken();
+            if ("bold".equalsIgnoreCase(token)) { bold = true; }
+            else if ("italic".equalsIgnoreCase(token)) { italic = true; }
+            else {
+                try {
+                    size = Integer.parseInt(token);
+                } catch (NumberFormatException nfe) {
+                    name = (name == null) ? token : (name + " " + token);
+                }
+            }
+        }
+        if (name == null) { name = font.getName(); }
+        if (size == 0) { size = font.getSize(); }
+        return new Font(name,
+            (bold ? Font.BOLD : 0) | (italic ? Font.ITALIC : 0), size);
+    }
+
+
+    /**
+     * Returns an enumeration of all client property keys defined in the
+     * specified component.
+     * This method should really be in Thinlet.java.
+     */
+    public static Enumeration getPropertyKeys(Object component)
+    {
+        Object table = get(component, ":bind");
+        if(table != null)
+            return ((Hashtable) table).keys();
+        else
+        {
+            return new Enumeration()
+            {
+                public boolean hasMoreElements() { return false; }
+                public Object nextElement() { throw new NoSuchElementException("empty enumeration"); }
+            };
+        }
+    }
+
+
+    /**
+     * Gets all the components in this container.
+     * <p>
+     * The difference between <code>Thinlet.getItems(Object component)</code>
+     * is the following: If the container is a tree, then recursively get
+     * <i>all</i> nodes of the tree. (The Thinlet method only returns the
+     * nodes of the top level).
+     */
+    public static Object[] getItems(Thinlet thinlet, Object component)
+    {
+        String classname = Thinlet.getClass(component);
+        if(classname.equals("tree"))
+        {
+            Set result = new HashSet();
+            getAllTreeItems(thinlet, component, result);
+            return (Object[]) result.toArray(new Object[result.size()]);
+        }
+        else
+            return thinlet.getItems(component);
+    }
+
+
+    /**
+     * Returns the index of the specified item in the item list of the
+     * specified component.
+     * Note that trees are <i>not</i> searched recursively.
+     * This method should really be in Thinlet.java.
+     *
+     * @param thinlet  the Thinlet
+     * @param component  the component; this should be a component that
+     *   has sub-items such as tree, table, node etc.
+     * @param item  the item to search for.
+     * @return the index of the item, or -1 if the item cannot be found.
+     */
+    public static int getIndexOfItem(Thinlet thinlet, Object component, Object item)
+    {
+        Object[] items = thinlet.getItems(component);
+        for(int i = 0; i < items.length; ++i)
+            if(item == items[i])
+                return i;
+        return -1;
+    }
+
+
+    /**
+     * Sets the selected item of the specified component, deselects all others.
+     * This method should really be in Thinlet.java.
+     */
+    public static void setSelectedItem(Thinlet thinlet, Object component, Object item)
+    {
+        Object[] items = getItems(thinlet, component);
+        if(items != null)
+        {
+            for(int i = 0; i < items.length; ++i)
+                thinlet.setBoolean(items[i], "selected", items[i] == item);
+        }
+    }
+
+
+    /**
+     * Returns the total count of all sub-components of the specified
+     * components, including the children's children, recursively.
+     */
+    public static int getTotalCount(Thinlet thinlet, Object component)
+    {
+        class CountVisitor implements ComponentWalker.Visitor
+        {
+            int count = 0;
+            public boolean visit(Object component, int depth) { count++; return true; }
+            public void leave(Object component, int depth) {}
+        }
+
+        CountVisitor visitor = new CountVisitor();
+        new ComponentWalker().walk(thinlet, component, visitor);
+        return visitor.count;
+    }
+
+
+    /**
+     * Returns a short string representation of the specified component,
+     * for example "button:btnOk". Useful for debugging output.
+     *
+     * @param component  the component. If it is null, the string "null" is
+     *                   returned.
+     * @return a string representation of the component.
+     */
+    public static String toString(Object component)
+    {
+        if(component == null)
+            return "null";
+        StringBuffer buf = new StringBuffer("[");
+        String classname = Thinlet.getClass(component);
+        if(classname == null)
+            buf.append("not a component: ").append(component.toString());
+        else
+        {
+            buf.append(classname);
+            String name = (String) get(component, "name");
+            if(name != null)
+                buf.append(':').append(name);
+        }
+        buf.append(']');
+        return buf.toString();
+    }
+    //}}}
+
+
+    //{{{ private helper methods
+    private static void getAllTreeItems(Thinlet thinlet, Object component, Set result)
+    {
+        Object[] items = thinlet.getItems(component);
+        result.addAll(Arrays.asList(items));
+        for(int i = 0; i < items.length; ++i)
+        {
+            String classname = Thinlet.getClass(items[i]);
+            if(classname.equals("node"))
+                getAllTreeItems(thinlet, items[i], result);
+        }
+    }
+    //}}}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ComponentWalker.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ComponentWalker.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ComponentWalker.java	(revision 1126)
@@ -0,0 +1,109 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import thinlet.Thinlet;
+
+
+/**
+ * A depth-first tree walker for Thinlet components.
+ *
+ * @author Dirk Moebius
+ */
+public class ComponentWalker
+{
+
+    /**
+     * A visitor interface for the {@link ComponentWalker}.
+     */
+    public interface Visitor
+    {
+        /**
+         * Called if the tree walker visits a new component.
+         *
+         * @return if <code>false</code>, the tree walk will stop at the
+         *   given component and not visit any further components.
+         */
+        public boolean visit(Object component, int depth);
+
+        /**
+         * Called when the tree walker has visited all childs of the component.
+         */
+        public void leave(Object component, int depth);
+    }
+
+
+    /**
+     * Create a new ComponentWalker.
+     */
+    public ComponentWalker()
+    {
+    }
+
+
+    /**
+     * Walk the component hierarchy starting at <code>component</code>.
+     *
+     * @param thinlet  the Thinlet that contains the components.
+     * @param component  where to start the walk.
+     * @param visitor  a visitor that is called each time a new component is visited.
+     * @return <code>false</code> if the tree walk has ended prematurely
+     *   before all children have been visited, because the visitor returned
+     *   <code>false</code> on a call to {@link Visitor#visit(Object,int)}.
+     */
+    public boolean walk(Thinlet thinlet, Object component, Visitor visitor)
+    {
+        return _walk(thinlet, component, visitor, 0);
+    }
+
+
+    private boolean _walk(Thinlet thinlet, Object component, Visitor visitor, int depth)
+    {
+        if(!visitor.visit(component, depth))
+        {
+            visitor.leave(component, depth);
+            return false;
+        }
+
+        // always visit "header" first.
+        Object header = thinlet.getWidget(component, "header");
+        if(header != null)
+        {
+            if(!_walk(thinlet, header, visitor, depth + 1))
+            {
+                visitor.leave(component, depth);
+                return false;
+            }
+        }
+
+        // visit other items. Note that "header" and "popupmenu" is _not_
+        // returned by thinlet.getItems().
+        Object[] items = thinlet.getItems(component);
+        for(int i = 0; i < items.length; ++i)
+        {
+            if(!_walk(thinlet, items[i], visitor, depth + 1))
+            {
+                visitor.leave(component, depth);
+                return false;
+            }
+        }
+
+        // always visit "popupmenu" last.
+        Object popupmenu = thinlet.getWidget(component, "popupmenu");
+        if(popupmenu != null)
+        {
+            if(!_walk(thinlet, popupmenu, visitor, depth + 1))
+            {
+                visitor.leave(component, depth);
+                return false;
+            }
+        }
+
+        visitor.leave(component, depth);
+        return true;
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Serializer.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Serializer.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Serializer.java	(revision 1126)
@@ -0,0 +1,114 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+
+/**
+ * A serializer that serializes a tree of Thinlet components to a string
+ * containing Thinlet XML.
+ *
+ * @author Dirk Moebius
+ */
+public class Serializer
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private Thinlet thinlet;
+    private PropertyManager propertyMgr;
+
+
+    public Serializer(Thinlet thinlet, PropertyManager propertyMgr)
+    {
+        this.thinlet = thinlet;
+        this.propertyMgr = propertyMgr;
+    }
+
+
+    public String serialize(Object component, int indentSize, char indentChar, String xmlheader)
+    {
+        StringBuffer buf = new StringBuffer(xmlheader);
+        ComponentWalker walker = new ComponentWalker();
+        walker.walk(thinlet, component, new SerializeVisitor(buf, indentSize, indentChar));
+
+        return buf.toString();
+    }
+
+
+    private class SerializeVisitor implements ComponentWalker.Visitor
+    {
+        private StringBuffer buf;
+        private int indentSize;
+        private char indentChar;
+
+        public SerializeVisitor(StringBuffer buf, int indentSize, char indentChar)
+        {
+            this.buf = buf;
+            this.indentSize = indentSize;
+            this.indentChar = indentChar;
+        }
+
+        public boolean visit(Object component, int depth)
+        {
+            indent(depth, buf);
+            buf.append('<');
+            String classname = Thinlet.getClass(component);
+            buf.append(classname);
+
+            ThinletDTD.Property[] props = ThinletDTD.getProperties(classname);
+            for(int i = 0; i < props.length; ++i)
+            {
+                String componentValue = propertyMgr.getValueString(component, props[i]);
+                if(componentValue != null)
+                {
+                    String defaultValue = propertyMgr.getDefaultValueString(props[i]);
+                    if(!componentValue.equals(defaultValue))
+                        buf.append(' ').append(props[i].getName()).append("=\"")
+                            .append(componentValue).append('"');
+                }
+            }
+
+            if(hasSubItems(component))
+                buf.append('>');
+            else
+                buf.append("/>");
+
+            buf.append(System.getProperty("line.separator"));
+            return true;
+        }
+
+        public void leave(Object component, int depth)
+        {
+            if(hasSubItems(component))
+                indent(depth, buf).append("</")
+                    .append(Thinlet.getClass(component))
+                    .append('>').append(System.getProperty("line.separator"));
+        }
+
+        private boolean hasSubItems(Object component)
+        {
+            if(thinlet.getWidget(component, "popupmenu") != null) return true;
+            if(thinlet.getWidget(component, "header") != null) return true;
+            return thinlet.getCount(component) > 0;
+        }
+
+        private StringBuffer indent(int indentLevel, StringBuffer buf)
+        {
+            for(int i = indentSize * indentLevel; i > 0; --i)
+                buf.append(indentChar);
+            return buf;
+        }
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/GenerateDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/GenerateDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/GenerateDialog.java	(revision 1126)
@@ -0,0 +1,350 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+import thinletcommons.AntiAliasedThinlet;
+import thinletcommons.DirChooser;
+import thinletcommons.MessageDialog;
+import thinletcommons.ThinletDialog;
+
+
+/**
+ * Dialog "Generate".
+ *
+ * @author Dirk Moebius
+ */
+public class GenerateDialog
+{
+
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private ThinletDialog dialog;
+    private Thinlet thinlet;
+    private Handler thingHandler;
+
+    // components
+    private Object cbGenerateInterface, cbGenerateHandler, cbGenerateAsThinlet,
+        cbGenerateMain, tInterfaceName, tHandlerName, tPackageName, tOutputDir,
+        tPreview, bOk;
+
+
+    public GenerateDialog(Frame owner, Handler thingHandler)
+    {
+        this.dialog = new ThinletDialog(owner, "Generate Handler Stub Source");
+        this.thinlet = new AntiAliasedThinlet();
+        this.thingHandler = thingHandler;
+
+        try
+        {
+            Object panel = thinlet.parse("/thing/generate.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing generate.xml", e);
+        }
+
+        dialog.setContent(thinlet);
+    }
+
+
+    public void show()
+    {
+        dialog.setSize(new Dimension(500, 460));
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+    }
+
+
+    //{{{ callbacks
+    public void init(Object cbGenerateInterface, Object cbGenerateHandler,
+        Object cbGenerateAsThinlet, Object cbGenerateMain, Object tInterfaceName,
+        Object tHandlerName, Object tPackageName, Object tOutputDir,
+        Object tPreview, Object bOk)
+    {
+        this.cbGenerateInterface = cbGenerateInterface;
+        this.cbGenerateHandler = cbGenerateHandler;
+        this.cbGenerateAsThinlet = cbGenerateAsThinlet;
+        this.cbGenerateMain = cbGenerateMain;
+        this.tInterfaceName = tInterfaceName;
+        this.tHandlerName = tHandlerName;
+        this.tPackageName = tPackageName;
+        this.tOutputDir = tOutputDir;
+        this.tPreview = tPreview;
+        this.bOk = bOk;
+
+        thinlet.setString(tHandlerName, "text", getHandlerClassname());
+        thinlet.setString(tInterfaceName, "text", getInterfaceName());
+
+        // output directory: directory of thinlet file, or last dir, or user dir
+        String outputDir = null;
+        if(thingHandler.getCurrentFile() != null)
+            outputDir = thingHandler.getCurrentFile().getParentFile().getAbsolutePath();
+        else
+            outputDir = Settings.getLastDir();
+        thinlet.setString(tOutputDir, "text", outputDir);
+
+        updateGui();
+    }
+
+
+    public void checkboxChanged(Object checkbox)
+    {
+        updateGui();
+    }
+
+
+    public void textfieldChanged(Object textfield)
+    {
+        updatePreview();
+    }
+
+
+    public void buttonOutputDirClicked()
+    {
+        String outputDir = thinlet.getString(tOutputDir, "text");
+        DirChooser chooser = new DirChooser(dialog, "Choose Directory...");
+        chooser.setSelectedDirectory(new File(outputDir));
+        chooser.show();
+        File dir = chooser.getSelectedDirectory();
+        if(dir != null)
+            thinlet.setString(tOutputDir, "text", dir.getAbsolutePath());
+    }
+
+
+    public void ok()
+    {
+        if(generate())
+            close();
+    }
+
+
+    public void close()
+    {
+        dialog.setVisible(false);
+    }
+    //}}}
+
+
+    //{{{ private methods
+    private String getHandlerClassname()
+    {
+        String handlerName = thinlet.getString(tHandlerName, "text");
+        if(handlerName == null || handlerName.trim().length() == 0)
+            if(thingHandler.getCurrentFile() != null)
+                return capitalize(getBaseName(thingHandler.getCurrentFile().getName())) + "Handler";
+            else
+                return "UnnamedHandler";
+        else
+            return getBaseName(handlerName.trim());
+    }
+
+
+    private String getInterfaceName()
+    {
+        String interfaceName = thinlet.getString(tInterfaceName, "text");
+        if(interfaceName == null || interfaceName.trim().length() == 0)
+            return "I" + getHandlerClassname();
+        else
+            return getBaseName(interfaceName.trim());
+    }
+
+
+    private String getPackageName()
+    {
+        String packageName = thinlet.getString(tPackageName, "text");
+        if(packageName == null || packageName.trim().length() == 0)
+            return null;
+        else
+            return packageName.trim();
+    }
+
+
+    private File getOutputFile(File dir, String filename)
+    {
+        File f = new File(dir, filename);
+        if(f.exists())
+        {
+            thingHandler.setStatusText("File " + f.getAbsolutePath() + " exists.");
+            int answer = new MessageDialog(dialog, "File Exists", "File "
+                + f.getAbsolutePath() + "\nexists. Overwrite?",
+                MessageDialog.MODE_YES_NO).show();
+            if(answer != MessageDialog.ACTION_YES)
+                return null;
+            if(!f.canWrite())
+            {
+                thingHandler.setStatusText("Cannot write to file " + f.getAbsolutePath() + ". (write protected?)");
+                new MessageDialog(dialog, "Write Error", "Cannot write to file\n"
+                    + f.getAbsolutePath() + "\n(write protected?)").show();
+                return null;
+            }
+        }
+        return f;
+    }
+
+
+    private boolean generate()
+    {
+        boolean generateHandler = thinlet.getBoolean(cbGenerateHandler, "selected");
+        boolean generateInterface = thinlet.getBoolean(cbGenerateInterface, "selected");
+
+        if(!generateHandler && !generateInterface)
+            return true;
+
+        File outputDir = new File(thinlet.getString(tOutputDir, "text"));
+        if(!outputDir.exists())
+        {
+            new MessageDialog(dialog, "Generate Error", "The output directory\n"
+                + outputDir.getAbsolutePath() + "\ndoes not exist.").show();
+            return false;
+        }
+
+        Settings.setLastDir(outputDir.getAbsolutePath());
+
+        try
+        {
+            Generator generator = new Generator();
+            generator.setPackageName(getPackageName());
+            generator.setGenerateFirstLine(true);
+            if(generateHandler)
+            {
+                File handlerFile = getOutputFile(outputDir, getHandlerClassname() + ".java");
+                if(handlerFile == null)
+                    return false;
+                generator.setWriterForHandler(new FileWriter(handlerFile));
+                generator.setHandlerClassname(getHandlerClassname());
+                generator.setGenerateAsThinlet(thinlet.getBoolean(cbGenerateAsThinlet, "selected"));
+                generator.setGenerateMain(thinlet.getBoolean(cbGenerateMain, "selected"));
+            }
+            if(generateInterface)
+            {
+                File interfaceFile = getOutputFile(outputDir, getInterfaceName() + ".java");
+                if(interfaceFile == null)
+                    return false;
+                generator.setWriterForInterface(new FileWriter(interfaceFile));
+                generator.setInterfaceName(getInterfaceName());
+            }
+
+            String thinletFilename = (thingHandler.getCurrentFile() != null) ?
+                thingHandler.getCurrentFile().getName() : "untitled.xml";
+
+            generator.generate(thingHandler.getThinlet(), thingHandler.getTopComponent(),
+                thingHandler.getPropertyManager(), thinletFilename);
+
+            thingHandler.setStatusText("Code generated successfully to directory " + outputDir.getAbsolutePath());
+            new MessageDialog(dialog, "Success", "Code generated successfully.").show();
+            return true;
+        }
+        catch(IOException e)
+        {
+            log.log(Level.SEVERE, "Error generating java code to disk", e);
+            thingHandler.setStatusText("I/O Error during generate.");
+            new MessageDialog(dialog, "I/O Error", "An I/O error occurred during generate:\n\n"
+                + e.toString() + "\n\nSee log for details.").show();
+        }
+
+        return false;
+    }
+
+
+    private void updateGui()
+    {
+        boolean generateHandler = thinlet.getBoolean(cbGenerateHandler, "selected");
+        boolean generateInterface = thinlet.getBoolean(cbGenerateInterface, "selected");
+        thinlet.setBoolean(tHandlerName, "enabled", generateHandler);
+        thinlet.setBoolean(tInterfaceName, "enabled", generateInterface);
+        thinlet.setBoolean(cbGenerateAsThinlet, "enabled", generateHandler);
+        thinlet.setBoolean(cbGenerateMain, "enabled", generateHandler);
+        thinlet.setBoolean(tPackageName, "enabled", generateHandler || generateInterface);
+        thinlet.setBoolean(tPreview, "enabled", generateHandler || generateInterface);
+        thinlet.setBoolean(bOk, "enabled", generateHandler || generateInterface);
+
+        updatePreview();
+    }
+
+
+    private void updatePreview()
+    {
+        boolean generateHandler = thinlet.getBoolean(cbGenerateHandler, "selected");
+        boolean generateInterface = thinlet.getBoolean(cbGenerateInterface, "selected");
+
+        if(!generateHandler && !generateInterface)
+            return;
+
+        // a writer for the preview string
+        StringWriter sw = new StringWriter();
+
+        Generator generator = new Generator();
+        generator.setPackageName(getPackageName());
+        generator.setGenerateFirstLine(false);
+        if(generateHandler)
+        {
+            generator.setHandlerClassname(getHandlerClassname());
+            generator.setGenerateAsThinlet(thinlet.getBoolean(cbGenerateAsThinlet, "selected"));
+            generator.setGenerateMain(thinlet.getBoolean(cbGenerateMain, "selected"));
+            generator.setWriterForHandler(sw);
+        }
+        if(generateInterface)
+        {
+            generator.setInterfaceName(getInterfaceName());
+            // if we're generating the handler too, then write the interface
+            // code to nirvana, otherwise write it to the preview string
+            generator.setWriterForInterface(generateHandler ? new StringWriter() : sw);
+        }
+
+        String thinletFilename = (thingHandler.getCurrentFile() != null) ?
+            thingHandler.getCurrentFile().getName() : "untitled.xml";
+
+        try
+        {
+            generator.generate(thingHandler.getThinlet(), thingHandler.getTopComponent(),
+                thingHandler.getPropertyManager(), thinletFilename);
+            thinlet.setString(tPreview, "text", sw.toString());
+        }
+        catch(IOException e)
+        {
+            // unlikely
+            log.log(Level.SEVERE, "Error generating preview", e);
+            thinlet.setString(tPreview, "text", e.toString());
+        }
+    }
+
+
+    private static String capitalize(String s)
+    {
+        if(s == null) return null;
+        if(s.length() == 0) return s;
+        if(s.length() == 1) return s.toUpperCase();
+        return s.substring(0, 1).toUpperCase() + s.substring(1);
+    }
+
+
+    /**
+     * Return the base name of the given filename, without the extension.
+     */
+    private static String getBaseName(String filename)
+    {
+        int dotpos = filename.indexOf('.');
+        return dotpos > 0 ? filename.substring(0, dotpos) : filename;
+    }
+    //}}} private methods
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletReader.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletReader.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/ThinletReader.java	(revision 1126)
@@ -0,0 +1,127 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.text.ParseException;
+import java.util.Hashtable;
+
+import thinlet.Thinlet;
+
+import utils.ReaderInputStream;
+
+
+/**
+ * A SAX parser for Thinlet XML.
+ * It is actually a thin wrapper around the <code>parse()</code> methods of
+ * the <code>Thinlet</code> class.
+ *
+ * @author Dirk Moebius
+ */
+public class ThinletReader
+{
+
+    /**
+     * A callback handler for the {@link ThinletReader}.
+     */
+    public static interface SAXHandler
+    {
+        /**
+         * Called when the {@link ThinletReader} visits a new element, before
+         * visiting all of its children.
+         *
+         * @param name  the name of the element.
+         * @param attributelist  the attributes of the element.
+         */
+        public void startElement(String name, Hashtable attributelist);
+
+        /**
+         * Called when the {@link ThinletReader} has finished visiting all
+         * children of the current element. {@link ThinletReader} calls this
+         * method in opposite order of the calls to
+         * {@link #startElement(String,Hashtable)}. Implementors of this
+         * interface must keep track of the element that has been finished
+         * themselves, by using a stack for example.
+         */
+        public void endElement();
+    }
+
+
+    public ThinletReader()
+    {
+    }
+
+
+    public void parse(String xml, SAXHandler handler) throws ParseException
+    {
+        parse(new StringReader(xml), handler);
+    }
+
+
+    public void parse(Reader reader, SAXHandler handler) throws ParseException
+    {
+        LineNumberReader lnr = new LineNumberReader(reader);
+        try
+        {
+            ThinletParser parser = new ThinletParser(handler);
+            parser.parse(new ReaderInputStream(lnr));
+        }
+        catch(Exception e)
+        {
+            String msg = e.getMessage();
+            if(msg == null || msg.length() == 0)
+                msg = e.getClass().getName();
+            ParseException pe = new ParseException(msg, lnr.getLineNumber());
+            pe.setStackTrace(e.getStackTrace());
+            throw pe;
+        }
+    }
+
+
+    private static class ThinletParser extends Thinlet
+    {
+        private SAXHandler saxhandler;
+
+        public ThinletParser(SAXHandler saxhandler)
+        {
+            this.saxhandler = saxhandler;
+        }
+
+        /**
+         * Overridden to use <code>Thinlet.parseXML(InputStream)</code>
+         * (the Thinlet SAX parser) instead of parsing with full validation and
+         * creation of elements.
+         *
+         * @param is  the input stream.
+         * @param handler  ignored.
+         * @return <code>null</code>; use {@link SAXHandler#startElement(String,Hashtable)}
+         * and {@link SAXHandler#endElement()} to be notified of the parsed
+         * elements.
+         */
+        public Object parse(InputStream is, Object handler) throws IOException
+        {
+            super.parseXML(is);
+            return null;
+        }
+
+        protected void startElement(String name, Hashtable attributelist)
+        {
+            if(attributelist == null)
+                attributelist = new Hashtable();
+            this.saxhandler.startElement(name, attributelist);
+        }
+
+        protected void endElement()
+        {
+            this.saxhandler.endElement();
+        }
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Handler.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Handler.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/Handler.java	(revision 1126)
@@ -0,0 +1,1594 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Image;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.text.ParseException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Stack;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+import utils.AWTUtils;
+
+import thinletcommons.ColorChooser;
+import thinletcommons.FileChooser;
+import thinletcommons.FileFilter;
+import thinletcommons.ExtensionFileFilter;
+import thinletcommons.FontChooser;
+import thinletcommons.MessageDialog;
+
+
+/**
+ * ThinG GUI logic handler/controller.
+ *
+ * @author Dirk Moebius
+ */
+public class Handler
+{
+
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    //{{{ constants
+    private static final int TAB_XML = 0;
+    private static final int TAB_PREVIEW = 1;
+    //}}}
+
+
+    //{{{ private members
+    private Thinlet thinlet;
+    private HashMap components = new HashMap();
+    private PropertyManager propmgr;
+    private File file;
+    private boolean isChanged = false;
+    private String clipboard;
+
+    // components of main panel
+    private Object root;
+    private Object preview;
+    private Object tree;
+    private Object props;
+    private Object tabs;
+    private Object statusbar;
+    private Object toolbar;
+    //}}}
+
+
+    //{{{ constructor Handler(Thinlet thinlet)
+    Handler(Thinlet thinlet)
+    {
+        this.thinlet = thinlet;
+        init();
+        setStatusText("ThinG v" + Main.getVersion() + " - created by Dirk Moebius (dmoebius@gmx.net)");
+    }
+    //}}}
+
+
+    //{{{ public handler callbacks
+
+    //{{{ public void menu_file_new()
+    public void menu_file_new()
+    {
+        if(!checkForChanges())
+            return;
+        setSelectedFile(null);
+        init();
+        setChanged(false);
+        setStatusText("New gui created.");
+    }
+    //}}}
+
+
+    //{{{ public void menu_file_open()
+    public void menu_file_open()
+    {
+        if(!checkForChanges())
+            return;
+        File selectedFile = getFile(FileChooser.MODE_OPEN, "Load Thinlet XML file...", thinlet, this.file);
+        if(selectedFile != null)
+        {
+            setSelectedFile(selectedFile);
+            load();
+        }
+    }
+    //}}}
+
+
+    //{{{ public void menu_file_reload()
+    public void menu_file_reload()
+    {
+        if(!checkForChanges())
+            return;
+        if(this.file != null)
+            load();
+    }
+    //}}}
+
+
+    //{{{ public void menu_file_save()
+    public void menu_file_save()
+    {
+        save(false);
+    }
+    //}}}
+
+
+    //{{{ public void menu_file_save_as()
+    public void menu_file_save_as()
+    {
+        save(true);
+    }
+    //}}}
+
+
+    //{{{ public void menu_file_exit()
+    public void menu_file_exit()
+    {
+        if(exit())
+            System.exit(0);
+    }
+    //}}}
+
+
+    //{{{ public void menu_edit_copy()
+    public void menu_edit_copy()
+    {
+        Object component = getSelectedComponent();
+        if(component != null)
+        {
+            // serialize selected component tree to Thinlet XML
+            this.clipboard = serialize(component);
+            // insert xml string into system clipboard
+            StringSelection selection = new StringSelection(this.clipboard);
+            thinlet.getToolkit().getSystemClipboard().setContents(selection, selection);
+            updateToolbar(component);
+            setStatusText("" + ThinletWorkarounds.getTotalCount(thinlet, component)
+                + " components copied to system clipboard.");
+        }
+    }
+    //}}}
+
+
+    //{{{ public void menu_edit_cut()
+    public void menu_edit_cut()
+    {
+        menu_edit_copy();
+        menu_edit_delete();
+    }
+    //}}}
+
+
+    //{{{ public void menu_edit_paste()
+    public void menu_edit_paste()
+    {
+        if(this.clipboard != null)
+        {
+            Object parentTreenode = getSelectedTreeNode(); // note: may be null
+            addComponents(parentTreenode, -1, this.clipboard);
+            setStatusText("Pasted components from internal clipboard.");
+        }
+    }
+    //}}}
+
+
+    //{{{ public void menu_edit_paste_systemcb()
+    public void menu_edit_paste_systemcb()
+    {
+        // get access to system clipboard
+        Transferable transferable = thinlet.getToolkit().getSystemClipboard().getContents(thinlet);
+        if(transferable == null)
+        {
+            if(debug()) log.fine("paste from system clipboard: clipboard is empty");
+            setStatusText("Note: clipboard is empty");
+            return;
+        }
+        if(!transferable.isDataFlavorSupported(DataFlavor.stringFlavor))
+        {
+            log.warning("paste from system clipboard: clipboard contains something that is not a string");
+            messagebox("Clipboard Error", "System clipboard does not contain a string.");
+            return;
+        }
+
+        // get string contents of system clipboard
+        String text = null;
+        try
+        {
+            text = (String) transferable.getTransferData(DataFlavor.stringFlavor);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error getting clipboard contents", e);
+            setStatusText("Error getting clipboard contents: " + e
+                + "   See log for details.");
+        }
+
+        // try to add string, assuming it contains Thinlet XML
+        if(text != null)
+        {
+            Object parentTreenode = getSelectedTreeNode(); // note: may be null
+            addComponents(parentTreenode, -1, text);
+            setStatusText("Pasted components from system clipboard.");
+        }
+    }
+    //}}}
+
+
+    //{{{ public void menu_edit_delete()
+    public void menu_edit_delete()
+    {
+        removeSelectedComponent();
+    }
+    //}}}
+
+
+    //{{{ public void menu_edit_settings()
+    public void menu_edit_settings()
+    {
+        new SettingsDialog(AWTUtils.getFrame(thinlet)).show();
+    }
+    //}}}
+
+
+    //{{{ public void menu_tools_generate()
+    public void menu_tools_generate()
+    {
+        if(isEmpty())
+            messagebox("Error", "Nothing to generate.\nPlease add components first.");
+        else
+            new GenerateDialog(AWTUtils.getFrame(thinlet), this).show();
+    }
+    //}}}
+
+
+    //{{{ public void menu_help_about()
+    public void menu_help_about()
+    {
+        MessageDialog dlg = new MessageDialog(AWTUtils.getFrame(thinlet),
+            "About ThinG",
+            AWTUtils.getIcon(thinlet, "/thing/icons/thing.gif"),
+            "ThinG v" + Main.getVersion() + "\n"
+            + "\n"
+            + "Created by Dirk Moebius (dmoebius@gmx.net)\n"
+            + "\n"
+            + "ThinG is free software, and you are welcome to redistribute it\n"
+            + "under the terms of the GNU General Public License, Version 2.\n"
+            + "See the license file doc/COPYING.txt for details.\n"
+            + "\n"
+            + "Many thanks to:\n"
+            + "    Robert Bajzat (Thinlet inventor)\n"
+            + "    Wolf Paulus (inventor of the best Thinlet RAD tool available:\n"
+            + "        Theodore, see http://www.carlsbadcubes.com/theodore/)\n");
+        dlg.show();
+    }
+    //}}}
+
+
+    //{{{ public void addComponent(Object toolbarButton)
+    public void addComponent(Object toolbarButton)
+    {
+        String classname = getToolbarButtonClassname(toolbarButton);
+        Object newNode = null;
+
+        if(isEmpty())
+        {
+            // no elements in tree: add component at top/first element
+            newNode = addComponentImpl(classname, null, -1, null);
+        }
+        else
+        {
+            Object parentTreenode = getSelectedTreeNode();
+            if(parentTreenode != null)
+            {
+                // create new tree node below currently selected tree node
+                newNode = addComponentImpl(classname, parentTreenode, -1, null);
+            }
+        }
+
+        setSelectedTreeNode(newNode);
+    }
+    //}}}
+
+
+    //{{{ public void moveComponentUp()
+    public void moveComponentUp()
+    {
+        moveSelectedComponent(-1);
+    }
+    //}}}
+
+
+    //{{{ public void moveComponentDown()
+    public void moveComponentDown()
+    {
+        moveSelectedComponent(1);
+    }
+    //}}}
+
+
+    //{{{ public void treeSelectionChanged()
+    public void treeSelectionChanged()
+    {
+        thinlet.removeAll(props);
+
+        Object component = getSelectedComponent();
+        if(component != null)
+            addTableProperties(component);
+
+        updateToolbar(component);
+        updatePropertyEditor(component, null);
+    }
+    //}}}
+
+
+    //{{{ public void tableSelectionChanged()
+    public void tableSelectionChanged()
+    {
+        Object component = getSelectedComponent();
+        String propName = getSelectedPropertyName();
+        if(component != null)
+            updatePropertyEditor(component, propName);
+    }
+    //}}}
+
+
+    //{{{ public void propEditBooleanChanged(String text, boolean isSelected)
+    public void propEditBooleanChanged(String text, boolean isSelected)
+    {
+        boolean value = (text.equals("true") && isSelected);
+        Object component = getSelectedComponent();
+        String propName = getSelectedPropertyName();
+        if(component != null && propName != null)
+        {
+            propmgr.setValue(component, propName, Boolean.toString(value));
+            updateTableProperty(component, propName);
+            if(debug()) log.fine("property " + propName + " for component "
+                + ThinletWorkarounds.toString(component) + " changed to " + value);
+            setStatusText("Component " + ThinletWorkarounds.toString(component)
+                + ": Property " + propName + " changed to " + value);
+        }
+    }
+    //}}}
+
+
+    //{{{ public void propEditIntegerChanged(String value)
+    public void propEditIntegerChanged(String value)
+    {
+        if(value.length() == 0)
+            return;
+
+        Object component = getSelectedComponent();
+        String propName = getSelectedPropertyName();
+        if(component != null && propName != null)
+        {
+            propmgr.setValue(component, propName, value);
+            updateTableProperty(component, propName);
+            if(debug()) log.fine("property " + propName + " for component "
+                + ThinletWorkarounds.toString(component) + " changed to " + value);
+            setStatusText("Component " + ThinletWorkarounds.toString(component)
+                + ": Property " + propName + " changed to " + value);
+        }
+    }
+    //}}}
+
+
+    //{{{ public void propEditChoiceChanged(Object combobox, int selected)
+    public void propEditChoiceChanged(Object combobox, int selected)
+    {
+        String choice = thinlet.getString(thinlet.getItem(combobox, selected), "text");
+        Object component = getSelectedComponent();
+        String propName = getSelectedPropertyName();
+        if(component != null && propName != null && choice != null)
+        {
+            propmgr.setValue(component, propName, choice);
+            updateTableProperty(component, propName);
+            if(debug()) log.fine("property " + propName + " for component "
+                + ThinletWorkarounds.toString(component) + " changed to " + choice);
+            setStatusText("Component " + ThinletWorkarounds.toString(component)
+                + ": Property " + propName + " changed to " + choice);
+        }
+    }
+    //}}}
+
+
+    //{{{ public void propEditStringChanged(String text)
+    public void propEditStringChanged(String text)
+    {
+        Object component = getSelectedComponent();
+        String propName = getSelectedPropertyName();
+
+        if(component != null && propName != null && text != null)
+        {
+            String classname = Thinlet.getClass(component);
+            ThinletDTD.Property property = ThinletDTD.getProperty(classname, propName);
+            try
+            {
+                switch(property.getType())
+                {
+                    case ThinletDTD.Property.STRING:
+                        propmgr.setValue(component, property, text);
+                        if(propName.equals("name"))
+                        {
+                            // update tree node text
+                            String nodeText = classname;
+                            if(text.length() > 0) nodeText += " [" + text + "]";
+                            thinlet.setString(getSelectedTreeNode(), "text", nodeText);
+                        }
+                        break;
+                    case ThinletDTD.Property.PROPERTY:
+                        // check input
+                        StringTokenizer st = new StringTokenizer(text, ";");
+                        while (st.hasMoreTokens()) {
+                            String token = st.nextToken();
+                            int equals = token.indexOf('=');
+                            if(equals < 0)
+                            {
+                                messagebox("Input Error", "Token '" + token + "'\nis missing the '=' character.");
+                                return;
+                            }
+                        }
+                        // remove all existing properties
+                        Enumeration enumx = ThinletWorkarounds.getPropertyKeys(component);
+                        while(enumx.hasMoreElements())
+                            thinlet.putProperty(component, (String)enumx.nextElement(), null);
+                        // set new properties
+                        propmgr.setValue(component, property, text);
+                        break;
+                    case ThinletDTD.Property.KEYSTROKE:
+                        propmgr.setValue(component, property, text);
+                        break;
+                    case ThinletDTD.Property.METHOD:
+                        propmgr.setValue(component, property, text);
+                        break;
+                    case ThinletDTD.Property.ICON:
+                        propmgr.setValue(component, property, text);
+                        break;
+                    default:
+                        throw new IllegalArgumentException("illegal property type: " + property.getType());
+                }
+            }
+            catch(IllegalArgumentException e)
+            {
+                StringBuffer errmsg = new StringBuffer("Illegal argument value");
+                String exmsg = e.getMessage();
+                if(exmsg != null && exmsg.length() > 0)
+                    errmsg.append(" (").append(exmsg).append(").");
+                else
+                    errmsg.append(".");
+                messagebox("Input Error", errmsg.toString());
+                return;
+            }
+
+            updateTableProperty(component, propName);
+            if(debug()) log.fine("property " + propName + " for component "
+                + ThinletWorkarounds.toString(component) + " changed to "
+                + (text.length() > 20 ? (text.substring(0,20) + "...") : text));
+            setStatusText("Component " + ThinletWorkarounds.toString(component)
+                + ": Property " + propName + " changed to "
+                + (text.length() > 20 ? (text.substring(0,20) + "...") : text));
+        }
+    }
+    //}}}
+
+
+    //{{{ public void propEditChooseButtonClicked()
+    public void propEditChooseButtonClicked()
+    {
+        Object component = getSelectedComponent();
+        String propName = getSelectedPropertyName();
+
+        if(component != null && propName != null)
+        {
+            String classname = Thinlet.getClass(component);
+            ThinletDTD.Property property = ThinletDTD.getProperty(classname, propName);
+            switch(property.getType())
+            {
+                case ThinletDTD.Property.FONT:
+                    FontChooser fontchooser = new FontChooser(AWTUtils.getFrame(thinlet), "Please choose font:");
+                    fontchooser.setSelectedFont(ThinletWorkarounds.getFont(thinlet, component, propName));
+                    fontchooser.show();
+                    Font font = fontchooser.getSelectedFont();
+                    if(font != null)
+                        thinlet.setFont(component, propName, font);
+                    break;
+                case ThinletDTD.Property.COLOR:
+                    ColorChooser colorchooser = new ColorChooser(AWTUtils.getFrame(thinlet), "Please choose color:");
+                    colorchooser.setSelectedColor(ThinletWorkarounds.getColor(component, propName));
+                    colorchooser.show();
+                    Color color = colorchooser.getSelectedColor();
+                    if(color != null)
+                        thinlet.setColor(component, propName, color);
+                    break;
+                case ThinletDTD.Property.COMPONENT:
+                    ComponentChooser compchooser = new ComponentChooser(
+                        AWTUtils.getFrame(thinlet), "Please select a named component:",
+                        getTopComponent(), propmgr.getValueString(component, "name"));
+                    compchooser.setSelectedComponent(propmgr.getValueString(component, property));
+                    compchooser.show();
+                    if(!compchooser.isCancelled())
+                        propmgr.setValue(component, property, compchooser.getSelectedComponent());
+                    break;
+                default:
+                    throw new IllegalArgumentException("unexpected property type: " + property.getType());
+            }
+
+            updateTableProperty(component, propName);
+            if(debug()) log.fine("property " + propName + " for component "
+                + ThinletWorkarounds.toString(component) + " changed to "
+                + propmgr.getValueString(component, propName));
+            setStatusText("Component " + ThinletWorkarounds.toString(component)
+                + ": Property " + propName + " changed.");
+        }
+    }
+    //}}}
+
+
+    //{{{ public void propEditReset()
+    public void propEditReset()
+    {
+        Object component = getSelectedComponent();
+        String propName = getSelectedPropertyName();
+
+        if(component != null && propName != null)
+        {
+            ThinletDTD.Property property = PropertyManager.getProperty(component, propName);
+            String defaultValue = PropertyManager.getDefaultValueString(property);
+            propmgr.setValue(component, property, defaultValue);
+            updateTableProperty(component, propName);
+            updatePropertyEditor(component, propName);
+            setStatusText("Component " + ThinletWorkarounds.toString(component)
+                + ": Property " + propName + " reset to default value \"" + defaultValue + "\".");
+        }
+    }
+    //}}}
+
+
+    //{{{ public void tabSelected(int tabNo)
+    /**
+     * serialize the current components tree every time the user switches
+     * to the XML panel.
+     */
+    public void tabSelected(int tabNo)
+    {
+        if(debug()) log.fine("tab selected: " + tabNo);
+        if(tabNo == TAB_XML)
+        {
+            Object component = getTopComponent();
+            Object xmltext = thinlet.find("serialize");
+            if(component != null)
+                thinlet.setString(xmltext, "text", serialize(component));
+            else
+                thinlet.setString(xmltext, "text", "");
+        }
+    }
+    //}}}
+
+
+    //{{{ public void focusgained(Object component)
+    public void focusgained(Object component)
+    {
+        Object treenode = getTreeNodeForComponent(component);
+        setSelectedTreeNode(treenode);
+    }
+    //}}}
+
+    //}}} handler actions
+
+
+    //{{{ package protected methods
+
+    //{{{ boolean exit()
+    /**
+     * Perform the "Exit" action.
+     *
+     * @return true if the application should exit.
+     */
+    boolean exit()
+    {
+        boolean stateOk = checkForChanges();
+        if(stateOk)
+            log.info("ThinG exits.");
+        return stateOk;
+    }
+    //}}}
+
+
+    //{{{ Object getTopComponent()
+    Object getTopComponent()
+    {
+        Object treenode = thinlet.getItem(tree, 0);
+        return (treenode != null) ? getComponentForNode(treenode) : null;
+    }
+    //}}}
+
+
+    //{{{ Thinlet getThinlet()
+    Thinlet getThinlet()
+    {
+        return thinlet;
+    }
+    //}}}
+
+
+    //{{{ PropertyManager getPropertyManager()
+    PropertyManager getPropertyManager()
+    {
+        return propmgr;
+    }
+    //}}}
+
+
+    //{{{ File getCurrentFile()
+    File getCurrentFile()
+    {
+        return file;
+    }
+    //}}}
+
+
+    //{{{ void setStatusText(String text)
+    void setStatusText(String text)
+    {
+        thinlet.setString(statusbar, "text", text);
+    }
+    //}}}
+
+    //}}} package protected methods
+
+
+    //{{{ private methods
+
+    //{{{ private Object addComponentImpl(String classname, Object parentTreenode, int index, Hashtable attributes)
+    /**
+     * Add a component.
+     *
+     * @param attributes  a key-value list of attributes for the new component.
+     *     Keys and elements should be Strings.
+     * @return the newly created tree node
+     */
+    private Object addComponentImpl(String classname, Object parentTreenode, int index, Hashtable attributes)
+    {
+        if(classname.equals("bean"))
+            throw new IllegalArgumentException("Sorry, the <bean> element is not support yet.");
+
+        Object newNode = Thinlet.create("node");
+        Object newComponent = Thinlet.create(classname);
+
+        if(parentTreenode == null)
+        {
+            if(!isAddAllowed(classname, null))
+                throw new IllegalArgumentException("<" + classname
+                    + "> may not be added add top-level.");
+            // add new component to preview panel
+            thinlet.add(this.preview, newComponent);
+            // no elements in tree: add component at top/first element
+            thinlet.add(this.tree, newNode);
+        }
+        else
+        {
+            // add new component to preview panel
+            Object containerComponent = getComponentForNode(parentTreenode);
+            if(!isAddAllowed(classname, containerComponent))
+                throw new IllegalArgumentException("<" + classname
+                    + "> may not be added to <"
+                    + Thinlet.getClass(containerComponent) + ">");
+            if("header".equals(classname))
+                index = 0; // header is always added as first child
+            else if("popupmenu".equals(classname))
+                index = -1; // popupmenu is always added as last child
+            else if(index == 0 || index == -1)
+            {
+                // trying to add normal component as first or last child
+                int count = thinlet.getCount(parentTreenode);
+                if(count > 0)
+                {
+                    // check if first child is "header", if yes, add after that
+                    // check if last child is "popupmenu", if yes, add before that
+                    if(index == 0 && Thinlet.getClass(getComponentForNode(
+                        thinlet.getItem(parentTreenode, index))).equals("header"))
+                    {
+                        index++;
+                        if(index >= count) index = -1;
+                    }
+                    else if(index == -1 && Thinlet.getClass(getComponentForNode(
+                        thinlet.getItem(parentTreenode, count - 1))).equals("popupmenu"))
+                    {
+                        index = count - 1;
+                    }
+                }
+            }
+            thinlet.add(containerComponent, newComponent, index);
+            // create new tree node below current tree node
+            thinlet.add(parentTreenode, newNode, index);
+        }
+
+        // store tree node/component pair
+        components.put(newNode, newComponent);
+
+        // set node text
+        String nodeText = classname;
+        if(attributes != null && attributes.get("name") != null)
+            nodeText += " [" + attributes.get("name") + "]";
+        thinlet.setString(newNode, "text", nodeText);
+
+        // mark view as changed
+        setChanged(true);
+
+        // set attributes
+        if(attributes != null)
+        {
+            for(Enumeration keys = attributes.keys(); keys.hasMoreElements(); )
+            {
+                String key = (String) keys.nextElement();
+                String value = (String) attributes.get(key);
+                propmgr.setValue(newComponent, key, value);
+            }
+        }
+
+        ThinletDTD.Widget widget = ThinletDTD.getWidget(classname);
+        if(widget.isInstanceOf("component"))
+            thinlet.setMethod(newComponent, "focusgained", "focusgained(this)", root, this);
+
+        return newNode;
+    }
+    //}}}
+
+
+    //{{{ private void updatePropertyEditor(Object component, String propName)
+    private void updatePropertyEditor(Object component, String propName)
+    {
+        Object propedit_panel = thinlet.find("propedit_panel");
+        thinlet.removeAll(propedit_panel);
+
+        if(propName == null)
+        {
+            thinlet.setString(thinlet.find("propedit_name"), "text", "");
+            thinlet.setBoolean(thinlet.find("propedit_reset"), "enabled", false);
+            return;
+        }
+
+        String classname = Thinlet.getClass(component);
+        ThinletDTD.Property property = ThinletDTD.getProperty(classname, propName);
+        Object value = propmgr.getValue(component, property);
+        if(debug()) log.fine("setup property: " + propName + " for component: " + ThinletWorkarounds.toString(component));
+
+        thinlet.setString(thinlet.find("propedit_name"), "text", propName + ":");
+        thinlet.setBoolean(thinlet.find("propedit_reset"), "enabled", true);
+
+        switch(property.getType())
+        {
+            case ThinletDTD.Property.STRING:
+            case ThinletDTD.Property.ICON:
+            case ThinletDTD.Property.KEYSTROKE:
+            case ThinletDTD.Property.METHOD:
+            case ThinletDTD.Property.PROPERTY:
+                Object textfield = Thinlet.create("textfield");
+                thinlet.add(propedit_panel, textfield);
+                thinlet.setString(textfield, "text", propmgr.getValueString(component, property));
+                thinlet.setChoice(textfield, "valign", "center");
+                thinlet.setInteger(textfield, "weightx", 1);
+                thinlet.setInteger(textfield, "weighty", 1);
+                thinlet.setMethod(textfield, "perform", "propEditStringChanged(this.text)", root, this);
+                break;
+            case ThinletDTD.Property.BOOLEAN:
+                Object boolTrue = Thinlet.create("checkbox");
+                Object boolFalse = Thinlet.create("checkbox");
+                thinlet.add(propedit_panel, boolTrue);
+                thinlet.add(propedit_panel, boolFalse);
+                thinlet.setString(boolTrue, "text", "true");
+                thinlet.setString(boolTrue, "group", "propedit_panel");
+                thinlet.setChoice(boolTrue, "valign", "center");
+                thinlet.setInteger(boolTrue, "weighty", 1);
+                thinlet.setInteger(boolTrue, "mnemonic", 0);
+                thinlet.setMethod(boolTrue, "action", "propEditBooleanChanged(this.text, this.selected)", root, this);
+                thinlet.setString(boolFalse, "text", "false");
+                thinlet.setString(boolFalse, "group", "propedit_panel");
+                thinlet.setChoice(boolFalse, "valign", "center");
+                thinlet.setInteger(boolFalse, "weighty", 1);
+                thinlet.setInteger(boolFalse, "mnemonic", 0);
+                thinlet.setMethod(boolFalse, "action", "propEditBooleanChanged(this.text, this.selected)", root, this);
+                if(((Boolean)value).booleanValue())
+                    thinlet.setBoolean(boolTrue, "selected", true);
+                else
+                    thinlet.setBoolean(boolFalse, "selected", true);
+                break;
+            case ThinletDTD.Property.INTEGER:
+                Object spinbox = Thinlet.create("spinbox");
+                thinlet.add(propedit_panel, spinbox);
+                thinlet.setString(spinbox, "text", ((Integer)value).toString());
+                thinlet.setChoice(spinbox, "valign", "center");
+                thinlet.setInteger(spinbox, "weightx", 1);
+                thinlet.setInteger(spinbox, "weighty", 1);
+                thinlet.setMethod(spinbox, "action", "propEditIntegerChanged(this.text)", root, this);
+                break;
+            case ThinletDTD.Property.CHOICE:
+                Object combobox = Thinlet.create("combobox");
+                thinlet.add(propedit_panel, combobox);
+                thinlet.setString(combobox, "text", (String)value);
+                thinlet.setBoolean(combobox, "editable", false);
+                thinlet.setChoice(combobox, "valign", "center");
+                thinlet.setInteger(combobox, "weightx", 1);
+                thinlet.setInteger(combobox, "weighty", 1);
+                thinlet.setMethod(combobox, "action", "propEditChoiceChanged(this, this.selected)", root, this);
+                String[] choices = property.getChoices();
+                for(int i = 0; i < choices.length; ++i)
+                {
+                    Object choice = Thinlet.create("choice");
+                    thinlet.add(combobox, choice);
+                    thinlet.setString(choice, "text", choices[i]);
+                    if(((String)value).equals(choices[i]))
+                        thinlet.setInteger(combobox, "selected", i);
+                }
+                break;
+            case ThinletDTD.Property.COLOR:
+            case ThinletDTD.Property.FONT:
+            case ThinletDTD.Property.COMPONENT:
+                Object button = Thinlet.create("button");
+                thinlet.add(propedit_panel, button);
+                thinlet.setString(button, "text", "Choose...");
+                thinlet.setInteger(button, "mnemonic", 0);
+                thinlet.setMethod(button, "action", "propEditChooseButtonClicked()", root, this);
+                Font font = ThinletWorkarounds.getFont(thinlet, button, "font");
+                font = font.deriveFont(10.0f);
+                thinlet.setFont(button, font);
+                //thinlet.setChoice(button, "valign", "center");
+                //thinlet.setInteger(button, "weighty", 1);
+                break;
+            case ThinletDTD.Property.BEAN:
+                // only display, not changeable
+                Object label = Thinlet.create("label");
+                thinlet.add(propedit_panel, label);
+                thinlet.setString(label, "text", propmgr.getValueString(component, property));
+                thinlet.setChoice(label, "valign", "center");
+                thinlet.setInteger(label, "weightx", 1);
+                thinlet.setInteger(label, "weighty", 1);
+                break;
+            default:
+                throw new IllegalArgumentException("unexpected property type: " + property.getType());
+        }
+    }
+    //}}}
+
+
+    //{{{ private void addTableProperties(Object component)
+    private void addTableProperties(Object component)
+    {
+        String classname = Thinlet.getClass(component);
+        ThinletDTD.Property[] properties = ThinletDTD.getProperties(classname);
+        if(debug()) log.fine("add table properties for component: " + ThinletWorkarounds.toString(component));
+        for(int i = 0; i < properties.length; i++)
+            if(shouldShowProperty(classname, properties[i].getName()))
+                addTableProperty(component, properties[i]);
+    }
+    //}}}
+
+
+    //{{{ private void addTableProperty(Object component, ThinletDTD.Property property)
+    private void addTableProperty(Object component, ThinletDTD.Property property)
+    {
+        Object row = Thinlet.create("row");
+        Object cellName = Thinlet.create("cell");
+        Object cellValue = Thinlet.create("cell");
+        thinlet.add(props, row);
+        thinlet.add(row, cellName);
+        thinlet.add(row, cellValue);
+        thinlet.setString(cellName, "text", property.getName());
+        thinlet.setString(cellValue, "text", propmgr.getValueString(component, property));
+    }
+    //}}}
+
+
+    //{{{ private void removeSelectedComponent()
+    private void removeSelectedComponent()
+    {
+        Object treenode = getSelectedTreeNode();
+        Object component = getSelectedComponent();
+        if(treenode != null && component != null)
+        {
+            thinlet.remove(treenode);
+            thinlet.remove(component);
+            propmgr.removeComponent(component);
+            components.remove(treenode);
+            // later FIXME: recursively remove all subcomponents of 'component'
+            // from 'propmgr' and 'components' hashmap.
+            treeSelectionChanged();
+            setChanged(true);
+        }
+    }
+    //}}}
+
+
+    //{{{ private void updateTableProperty(Object component, String propName)
+    private void updateTableProperty(Object component, String propName)
+    {
+        Object cellValue = getSelectedTableCell(1);
+        thinlet.setString(cellValue, "text", propmgr.getValueString(component, propName));
+        setChanged(true);
+    }
+    //}}}
+
+
+    //{{{ private static boolean shouldShowProperty(String classname, String prop)
+    private static boolean shouldShowProperty(String classname, String prop)
+    {
+        if("for".equals(prop))
+        {
+            // show property "for" only for labels, but not it's subclasses
+            // such as button, checkbox, togglebutton
+            return classname.equals("label");
+        }
+        else if("closable".equals(prop) && "dialog".equals(classname))
+        {
+            // don't show property "closable" (it has been replaced by "close")
+            return false;
+        }
+        else
+            return true;
+    }
+    //}}}
+
+
+    //{{{ private Object getComponentForNode(Object treenode)
+    private Object getComponentForNode(Object treenode)
+    {
+        Object component = components.get(treenode);
+        if(component == null)
+            throw new IllegalArgumentException("something is wrong, no component stored for tree node: "
+                + ThinletWorkarounds.toString(treenode));
+        else
+            return component;
+    }
+    //}}}
+
+
+    //{{{ private Object getTreeNodeForComponent(Object component)
+    private Object getTreeNodeForComponent(Object component)
+    {
+        for(Iterator it = components.entrySet().iterator(); it.hasNext(); )
+        {
+            Map.Entry entry = (Map.Entry) it.next();
+            if(entry.getValue() == component)
+                return entry.getKey();
+        }
+        throw new IllegalArgumentException("something is wrong, no tree node stored for component: "
+            + ThinletWorkarounds.toString(component));
+    }
+    //}}}
+
+
+    //{{{ private void setSelectedTreeNode(Object treenode)
+    private void setSelectedTreeNode(Object treenode)
+    {
+        // selects the treenode, deselects all others
+        ThinletWorkarounds.setSelectedItem(thinlet, tree, treenode);
+        treeSelectionChanged();
+    }
+    //}}}
+
+
+    //{{{ private Object getSelectedTreeNode()
+    private Object getSelectedTreeNode()
+    {
+        Object treenode = thinlet.getSelectedItem(tree);
+        return treenode;
+    }
+    //}}}
+
+
+    //{{{ private Object getSelectedComponent()
+    private Object getSelectedComponent()
+    {
+        Object treenode = getSelectedTreeNode();
+        return (treenode != null) ? getComponentForNode(treenode) : null;
+    }
+    //}}}
+
+
+    //{{{ private String getSelectedPropertyName()
+    private String getSelectedPropertyName()
+    {
+        Object cell = getSelectedTableCell(0);
+        if(cell != null)
+            return thinlet.getString(cell, "text");
+        return null;
+    }
+    //}}}
+
+
+    //{{{ private String getSelectedPropertyValue()
+    private String getSelectedPropertyValue()
+    {
+        Object cell = getSelectedTableCell(1);
+        if(cell != null)
+            return thinlet.getString(cell, "text");
+        return null;
+    }
+    //}}}
+
+
+    //{{{ private Object getSelectedTableCell(int cellNo)
+    private Object getSelectedTableCell(int cellNo)
+    {
+        Object treenode = getSelectedTreeNode();
+        if(treenode != null)
+        {
+            Object row = thinlet.getSelectedItem(props);
+            if(row != null)
+                return thinlet.getItem(row, cellNo);
+        }
+        return null;
+    }
+    //}}}
+
+
+    //{{{ private String getToolbarButtonClassname(Object toolbarButton)
+    private String getToolbarButtonClassname(Object toolbarButton)
+    {
+        if("separator".equals(Thinlet.getClass(toolbarButton)))
+            return null;
+
+        String classname = (String) thinlet.getProperty(toolbarButton, "classname");
+        if(classname == null)
+        {
+            String name = thinlet.getString(toolbarButton, "name");
+            throw new IllegalArgumentException("toolbar button " + name + ": missing classname property");
+        }
+        return classname;
+    }
+    //}}}
+
+
+    //{{{ private void updateToolbar(Object selectedComponent)
+    private void updateToolbar(Object selectedComponent)
+    {
+        ThinletDTD.Widget selectedWidget = null;
+        if(selectedComponent != null)
+            selectedWidget = ThinletDTD.getWidget(Thinlet.getClass(selectedComponent));
+
+        Object[] items = thinlet.getItems(toolbar);
+        for(int i = 0; i < items.length; ++i)
+        {
+            String classname = getToolbarButtonClassname(items[i]);
+            if(classname != null)
+            {
+                boolean addAllowed = isAddAllowed(classname, selectedComponent, selectedWidget);
+                thinlet.setBoolean(items[i], "visible", addAllowed);
+            }
+        }
+
+        // buttons & menus "Cut"/"Copy"/"Delete"/"Paste"
+        thinlet.setBoolean(thinlet.find("tb_edit_cut"), "enabled", selectedComponent != null);
+        thinlet.setBoolean(thinlet.find("tb_edit_copy"), "enabled", selectedComponent != null);
+        thinlet.setBoolean(thinlet.find("tb_edit_delete"), "enabled", selectedComponent != null);
+        thinlet.setBoolean(thinlet.find("menu_edit_cut"), "enabled", selectedComponent != null);
+        thinlet.setBoolean(thinlet.find("menu_edit_copy"), "enabled", selectedComponent != null);
+        thinlet.setBoolean(thinlet.find("menu_edit_delete"), "enabled", selectedComponent != null);
+        thinlet.setBoolean(thinlet.find("tb_edit_paste"), "enabled", this.clipboard != null);
+        thinlet.setBoolean(thinlet.find("menu_edit_paste"), "enabled", this.clipboard != null);
+
+        // buttons "Move Up"/"Move Down"
+        thinlet.setBoolean(thinlet.find("tb_edit_moveup"), "enabled", false);
+        thinlet.setBoolean(thinlet.find("tb_edit_movedown"), "enabled", false);
+        if(selectedComponent != null)
+        {
+            String classname = Thinlet.getClass(selectedComponent);
+            if(!("popupmenu".equals(classname)) && !("header".equals(classname)))
+            {
+                Object treenode = getSelectedTreeNode();
+                Object parentTreenode = thinlet.getParent(treenode);
+                int count = thinlet.getCount(parentTreenode);
+                int index = ThinletWorkarounds.getIndexOfItem(thinlet, parentTreenode, treenode);
+                String firstNode = (count > 0) ? Thinlet.getClass(getComponentForNode(thinlet.getItem(parentTreenode, 0))) : "";
+                String lastNode = (count > 0) ? Thinlet.getClass(getComponentForNode(thinlet.getItem(parentTreenode, count - 1))) : "";
+                // move up is allowed if pos > 0, and item at pos 0 is not a header
+                thinlet.setBoolean(thinlet.find("tb_edit_moveup"), "enabled",
+                    index > 0 && !(index == 1 && firstNode.equals("header")));
+                // move down is allowed if pos < last pos, and item at last pos is not a popupmenu
+                thinlet.setBoolean(thinlet.find("tb_edit_movedown"), "enabled",
+                    index < count-1 && !(index == count - 2 && lastNode.equals("popupmenu")));
+            }
+        }
+    }
+    //}}}
+
+
+    //{{{ private void updateTitle()
+    private void updateTitle()
+    {
+        Frame frame = AWTUtils.getFrame(thinlet);
+        // frame may be null at startup time
+        if(frame != null)
+        {
+            StringBuffer title = new StringBuffer("ThinG - ");
+            if(file == null)
+                title.append("[untitled]");
+            else
+                title.append(file.getName());
+            if(isChanged)
+                title.append(" [modified]");
+            frame.setTitle(title.toString());
+        }
+    }
+    //}}}
+
+
+    //{{{ private boolean isAddAllowed(String classname, Object container)
+    /**
+     * Check the dtd whether it is allowed to add the widget of the specified
+     * classname to the specified container object.
+     *
+     * @param container  the container; may be <code>null</code>, in which
+     *  case the methods checks allowance for top-level objects such as
+     *  <code>panel</code> etc.
+     */
+    private boolean isAddAllowed(String classname, Object container)
+    {
+        ThinletDTD.Widget containerWidget = null;
+        if(container != null)
+            containerWidget = ThinletDTD.getWidget(Thinlet.getClass(container));
+        return isAddAllowed(classname, container, containerWidget);
+    }
+    //}}}
+
+
+    //{{{ private boolean isAddAllowed(String classname, Object container, ThinletDTD.Widget containerWidget)
+    /**
+     * Check the dtd whether it is allowed to add the widget of the specified
+     * classname to the specified container object.
+     * Use this method instead of {@link #isAddAllowed(String,Object), if you
+     * have already determined the {@link ThinletDTD.Widget widget} for the
+     * container object, in order to speed up performance.
+     *
+     * @param container  the container; may be <code>null</code>, in which
+     *  case the methods checks allowance for top-level objects such as
+     *  <code>panel</code> etc.
+     */
+    private boolean isAddAllowed(String classname, Object container, ThinletDTD.Widget containerWidget)
+    {
+        if(container == null)
+        {
+            // no container selected: only top-level elements allowed
+            if(thinlet.getCount(tree) > 0)
+                return false;
+            return "panel".equals(classname)
+                || "desktop".equals(classname)
+                || "dialog".equals(classname)
+                || "splitpane".equals(classname)
+                || "tabbedpane".equals(classname);
+        }
+        else
+        {
+            boolean allowed = containerWidget.isSubWidgetAllowed(classname);
+            if(!allowed)
+                return false;
+
+            // special case for "popupmenu" and "header"
+            if("popupmenu".equals(classname) || "header".equals(classname))
+                return (thinlet.getWidget(container, classname) == null);
+            else
+                return true;
+        }
+    }
+    //}}}
+
+
+    //{{{ private void init()
+    private void init()
+    {
+        propmgr = new PropertyManager(thinlet);
+
+        try
+        {
+            if(root != null)
+                thinlet.remove(root);
+            root = thinlet.parse("thing.xml", this);
+            if(debug()) log.fine("Successfully parsed thing.xml");
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing thing.xml", e);
+        }
+
+        components.clear();
+
+        thinlet.add(root);
+        thinlet.repaint(root);
+
+        preview = thinlet.find(root, "preview");
+        tree = thinlet.find(root, "tree");
+        props = thinlet.find(root, "props");
+        tabs = thinlet.find(root, "tabs");
+        statusbar = thinlet.find(root, "statusbar");
+        toolbar = thinlet.find(root, "toolbar");
+
+        updateToolbar(null);
+        updateTitle();
+    }
+    //}}}
+
+
+    //{{{ private void load()
+    protected void load()
+    {
+        init();
+
+        // use a FileReader to read from the file. No need to use a
+        // BufferedReader, because Thinlet.parse() uses a buffered stream
+        // anyway.
+        FileReader reader = null;
+        try
+        {
+            reader = new FileReader(this.file);
+            addComponents(null, -1, reader);
+            setChanged(false);
+            setStatusText(this.file.getAbsolutePath() + " loaded.");
+        }
+        catch(ParseException e)
+        {
+            log.log(Level.SEVERE, "Error loading file " + this.file.getAbsolutePath()
+                + ", at line: " + e.getErrorOffset(), e);
+            messagebox("I/O Error", "Error loading file\n" + this.file.getAbsolutePath()
+                + ":\n\n" + e.getMessage() + "\nat line: " + e.getErrorOffset()
+                + "\n\nSee log for details.");
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error loading file " + this.file.getAbsolutePath(), e);
+            messagebox("I/O Error", "Error loading file\n" + this.file.getAbsolutePath()
+                + ":\n\n" + e.toString() + "\n\nSee log for details.");
+        }
+        finally
+        {
+            if(reader != null)
+            {
+                try { reader.close(); }
+                catch(IOException e) { log.log(Level.SEVERE, "Error closing file " + this.file.getAbsolutePath(), e); }
+            }
+        }
+    }
+    //}}}
+
+
+    //{{{ private void addComponents(Object parentTreenode, int index, String xml)
+    private void addComponents(Object parentTreenode, int index, String xml)
+    {
+        try
+        {
+            addComponents(parentTreenode, index, new StringReader(xml));
+        }
+        catch(ParseException e)
+        {
+            String text = xml.substring(0, Math.min(100, xml.length())) + (xml.length() >= 100 ? "..." : "");
+            log.log(Level.SEVERE, "Error adding components from text, at line: "
+                + e.getErrorOffset() + "\ntext(0,100):\n" + text, e);
+            messagebox("Error", "Error adding components:\n\n" + e.getMessage()
+                + "\n\nError is at line " + e.getErrorOffset() + " of:\n" + text
+                + "\n\nSee log for details.");
+        }
+        catch(Exception e)
+        {
+            String text = xml.substring(0, Math.min(100, xml.length())) + (xml.length() >= 100 ? "..." : "");
+            log.log(Level.SEVERE, "Error adding components from text\ntext(0,100):\n" + text, e);
+            messagebox("Error", "Error adding components:\n\n" + e.toString()
+                + "\n\nXML:\n" + text
+                + "\n\nSee log for details.");
+        }
+    }
+    //}}}
+
+
+    //{{{ private void addComponents(Object parentTreenode, int index, Reader reader) throws Exception
+    private void addComponents(Object parentTreenode, int index, Reader reader) throws Exception
+    {
+        // create a handler that adds the elements
+        ThinletReaderHandler handler = new ThinletReaderHandler(parentTreenode, index);
+        // parse from reader, using the handler
+        ThinletReader thinletreader = new ThinletReader();
+        thinletreader.parse(reader, handler);
+        updateToolbar(getSelectedComponent());
+    }
+    //}}}
+
+
+    //{{{ private void save(boolean askForFile)
+    /**
+     * Save the current document.
+     *
+     * @param askForFile  if true present a "Save As" dialog.
+     * @return true  if the file has been saved, false if the save operation
+     *    has been cancelled because of an error or user interaction.
+     */
+    protected boolean save(boolean askForFile)
+    {
+        if(isEmpty())
+        {
+            messagebox("Save Error", "Cannot save empty document.\nPlease add components first.");
+            return false;
+        }
+
+        File newFile = this.file;
+        if(askForFile || this.file == null)
+            newFile = getFile(FileChooser.MODE_SAVE, "Save As...", thinlet, this.file);
+        if(newFile == null)
+            return false;
+
+        if(newFile.exists() && !newFile.equals(this.file))
+        {
+            int answer = new MessageDialog(AWTUtils.getFrame(thinlet), "File exists",
+                "File exists.\nOverwrite existing file?", MessageDialog.MODE_YES_NO).show();
+            if(answer != MessageDialog.ACTION_YES)
+                return false;
+        }
+
+        setSelectedFile(newFile);
+
+        if(this.file.exists() && !this.file.canWrite())
+        {
+            log.severe("Cannot write to file: " + this.file.getAbsolutePath());
+            messagebox("I/O Error", "Cannot write to file\n" + file.getAbsolutePath());
+            return false;
+        }
+
+        String text = serialize(getTopComponent());
+
+        BufferedWriter writer = null;
+        try
+        {
+            writer = new BufferedWriter(new FileWriter(this.file));
+            writer.write(text);
+            setChanged(false);
+            setStatusText(this.file.getAbsolutePath() + " saved.");
+            return true;
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error saving file " + this.file.getAbsolutePath(), e);
+            messagebox("I/O Error", "Error saving file\n" + this.file.getAbsolutePath()
+                + ":\n\n" + e.toString() + "\n\nSee log for details.");
+        }
+        finally
+        {
+            if(writer != null)
+            {
+                try { writer.close(); }
+                catch(IOException e) { log.log(Level.SEVERE, "Error closing file " + this.file.getAbsolutePath(), e); }
+            }
+        }
+
+        // if we come here it's because of an exception
+        return false;
+    }
+    //}}}
+
+
+    //{{{ private void setSelectedFile(File selectedFile)
+    protected void setSelectedFile(File selectedFile)
+    {
+        this.file = selectedFile;
+    }
+    //}}}
+
+
+    //{{{ private void setChanged(boolean isChanged)
+    private void setChanged(boolean isChanged)
+    {
+        if(this.isChanged != isChanged)
+        {
+            this.isChanged = isChanged;
+            updateTitle();
+        }
+
+        // update XML preview, if the tab is currently selected
+        int tabNo = thinlet.getInteger(tabs, "selected");
+        if(tabNo == TAB_XML)
+        {
+            Object component = getTopComponent();
+            if(component != null)
+                thinlet.setString(thinlet.find("serialize"), "text", serialize(component));
+        }
+    }
+    //}}}
+
+
+    //{{{ private boolean checkForChanges()
+    /**
+     * Check whether the current document is changed. If yes, ask to save the
+     * file with a message box saying "Save changes? YES/NO/CANCEL".
+     *
+     * @return false if the user cancelled the operation, either by clicking
+     *    on CANCEL, or by cancelling the "Save As" dialog, otherwise true.
+     */
+    private boolean checkForChanges()
+    {
+        if(isChanged)
+        {
+            String msg = (this.file == null) ? "Save changes?"
+                : "Save changes to " + file.getName() + "?";
+            int answer = new MessageDialog(AWTUtils.getFrame(thinlet),
+                "File not saved", msg, MessageDialog.MODE_YES_NO_CANCEL).show();
+            if(answer == MessageDialog.ACTION_CANCEL)
+                return false;
+            else if(answer == MessageDialog.ACTION_YES)
+                return save(false);
+        }
+        return true;
+    }
+    //}}}
+
+
+    //{{{ private static File getFile(int mode, String title, Thinlet thinlet, File defaultFile)
+    private static File getFile(int mode, String title, Thinlet thinlet, File defaultFile)
+    {
+        FileChooser chooser = new FileChooser(AWTUtils.getFrame(thinlet), title, mode);
+        chooser.setFileFilters(new FileFilter[]
+        {
+            new ExtensionFileFilter("xml", "XML files (*.xml)"),
+            new FileFilter()
+            {
+                public boolean accept(File dir) { return true; }
+                public String getDescription() { return "All files (*.*)"; }
+            }
+        });
+        if(defaultFile != null)
+            chooser.setSelectedFile(defaultFile);
+        else
+        {
+            String lastDir = Settings.getLastDir();
+            if(lastDir != null)
+                chooser.setSelectedFile(new File(lastDir));
+        }
+
+        // show file dialog
+        chooser.show();
+
+        File selectedFile = chooser.getSelectedFile();
+        if(selectedFile == null)
+            return null;
+
+        File dir = selectedFile.isDirectory() ? selectedFile : selectedFile.getParentFile();
+        Settings.setLastDir(dir.getAbsolutePath());
+
+        return selectedFile;
+    }
+    //}}}
+
+
+    //{{{ private void moveSelectedComponent(int offset)
+    private void moveSelectedComponent(int offset)
+    {
+        Object treenode = getSelectedTreeNode();
+        if(treenode == null)
+        {
+            setStatusText("No selection.");
+            return;
+        }
+        Object parentTreenode = thinlet.getParent(treenode);
+        // remember position of selected treenode
+        int index = ThinletWorkarounds.getIndexOfItem(thinlet, parentTreenode, treenode);
+        // remember selected component tree (as serialized string)
+        String xml = serialize(getSelectedComponent());
+        // remove selected component tree
+        removeSelectedComponent();
+        // add remembered component tree one index above
+        addComponents(parentTreenode, index + offset, xml);
+        // select component at new position
+        treenode = thinlet.getItem(parentTreenode, index + offset);
+        setSelectedTreeNode(treenode);
+        if(offset > 0)
+            setStatusText("Moved selected component(s) down.");
+        else
+            setStatusText("Moved selected component(s) up.");
+    }
+    //}}}
+
+
+    //{{{ private boolean isEmpty()
+    private boolean isEmpty()
+    {
+        return (thinlet.getCount(tree) == 0);
+    }
+    //}}}
+
+
+    //{{{ private String serialize(Object component, boolean addCustomHeader)
+    private String serialize(Object component)
+    {
+        if(debug()) log.fine("serializing " + ThinletWorkarounds.toString(component) + " ...");
+        long start = System.currentTimeMillis();
+        String text = new Serializer(thinlet, propmgr).serialize(component, Settings.getSerializeIndentSize(), Settings.getSerializeIndentChar(), Settings.getSerializeHeader());
+        long stop = System.currentTimeMillis();
+        if(debug()) log.fine("serialize took " + (stop-start) + "ms.");
+        return text;
+    }
+    //}}}
+
+
+    //{{{ private void messagebox(String title, String msg)
+    private void messagebox(String title, String msg)
+    {
+        setStatusText(title + ": " + msg.replace('\n', ' ').replace('\r', ' '));
+        new MessageDialog(AWTUtils.getFrame(thinlet), title, msg).show();
+    }
+    //}}}
+
+    //}}} private methods
+
+
+    //{{{ inner classes
+
+    //{{{ inner class ThinletReaderHandler
+    /**
+     * A parser handler that adds components to the preview.
+     */
+    private class ThinletReaderHandler implements ThinletReader.SAXHandler
+    {
+        private Stack stack = new Stack();
+        private int index = -1;
+
+        /**
+         * Create a new handler that starts adding at top-level.
+         */
+        public ThinletReaderHandler()
+        {
+        }
+
+        /**
+         * Create a new handler that starts adding at the specified parent
+         * tree node.
+         *
+         * @param parentTreenode  the parent tree node.
+         * @param index  where to add below the parent tree node.
+         */
+        public ThinletReaderHandler(Object parentTreenode, int index)
+        {
+            this.index = index;
+            stack.push(parentTreenode);
+        }
+
+        public void startElement(String name, Hashtable attributelist)
+        {
+            if(debug()) log.fine("add <" + name + "> " + attributelist);
+            Object parentTreenode = stack.empty() ? null : stack.peek();
+            Object newTreeNode = addComponentImpl(name, parentTreenode, index, attributelist);
+            stack.push(newTreeNode);
+            // add at end from now on
+            this.index = -1;
+        }
+
+        public void endElement()
+        {
+            Object treenode = stack.pop();
+        }
+    }
+    //}}}
+
+    //}}} inner classes
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/gvSIGHandler.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/gvSIGHandler.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/gvSIGHandler.java	(revision 1126)
@@ -0,0 +1,22 @@
+package thing;
+
+import java.io.File;
+
+import thinlet.Thinlet;
+
+public class gvSIGHandler extends Handler {
+
+	public gvSIGHandler(Thinlet arg0) {
+		super(arg0);
+	}
+
+	public void load(File file){
+		this.setSelectedFile(file);
+		this.load();
+	}
+	
+	public void save(File file){
+		this.setSelectedFile(file);
+		this.save(false);
+	}
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/package.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/package.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/package.html	(revision 1126)
@@ -0,0 +1,6 @@
+<body>
+<p>
+This package contains the <b>ThinG</b> application.
+</p>
+</body>
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/PropertyManager.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/PropertyManager.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thing/PropertyManager.java	(revision 1126)
@@ -0,0 +1,401 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thing;
+
+
+import java.awt.AWTKeyStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Image;
+import java.awt.MediaTracker;
+import java.awt.Toolkit;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+import utils.AWTUtils;
+
+
+/**
+ * An instance of this class maintains the properties of the components
+ * contained in a given Thinlet.
+ *
+ * @author Dirk Moebius
+ */
+public class PropertyManager
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thing");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private Thinlet thinlet;
+    private PropertyMap map = new PropertyMap();
+
+
+    public PropertyManager(Thinlet thinlet)
+    {
+        this.thinlet = thinlet;
+    }
+
+
+    public Object getValue(Object component, ThinletDTD.Property property)
+    {
+        String key = property.getName();
+        switch(property.getType())
+        {
+            case ThinletDTD.Property.STRING:
+                return thinlet.getString(component, key);
+            case ThinletDTD.Property.BOOLEAN:
+                if(property == ThinletDTD.getProperty("dialog", "modal"))
+                {
+                    Object value = map.getValue(component, property);
+                    return value != null ? value : Boolean.FALSE;
+                }
+                else if(property == ThinletDTD.getProperty("dialog", "closable"))
+                    return property.getDefaultValue();
+                else {
+                	try {
+                		return new Boolean(thinlet.getBoolean(component, key));
+                	} catch(Throwable e) {
+                		log.warning("getValue() can't access to boolean property '"+key+"'.");
+                		return Boolean.FALSE;
+                	}
+                }
+            case ThinletDTD.Property.INTEGER:
+                return new Integer(thinlet.getInteger(component, key));
+            case ThinletDTD.Property.CHOICE:
+                return thinlet.getChoice(component, key);
+            case ThinletDTD.Property.COLOR:
+                return ThinletWorkarounds.getColor(component, key);
+            case ThinletDTD.Property.ICON:
+                return thinlet.getIcon(component, key);
+            case ThinletDTD.Property.FONT:
+                Font font = ThinletWorkarounds.getFont(component, key);
+                return font != null ? AWTUtils.getFontString(font, thinlet.getFont()) : "";
+            case ThinletDTD.Property.KEYSTROKE:
+                AWTKeyStroke keystroke = ThinletWorkarounds.getKeystroke(component, key);
+                return keystroke != null ? AWTUtils.getAWTKeyStrokeDescription(keystroke) : null;
+            case ThinletDTD.Property.PROPERTY:
+                StringBuffer buf = new StringBuffer();
+                Enumeration enumx = ThinletWorkarounds.getPropertyKeys(component);
+                while(enumx.hasMoreElements())
+                {
+                    String propkey = (String)enumx.nextElement();
+                    String value = thinlet.getProperty(component, propkey).toString();
+                    buf.append(propkey).append('=').append(value);
+                    if(enumx.hasMoreElements()) buf.append(';');
+                }
+                return buf.toString();
+            case ThinletDTD.Property.METHOD:
+            case ThinletDTD.Property.COMPONENT:
+                return map.getValueString(component, property);
+            case ThinletDTD.Property.BEAN: // later
+                return "";
+            default:
+                throw new IllegalArgumentException("unknown property type: " + property.getType());
+        }
+    }
+
+
+    public Object getValue(Object component, String propName)
+    {
+        return getValue(component, getProperty(component, propName));
+    }
+
+
+    public String getValueString(Object component, ThinletDTD.Property property)
+    {
+        if(property.getType() == ThinletDTD.Property.ICON)
+            return map.getValueString(component, property);
+        else
+        {
+            Object obj = getValue(component, property);
+            return value2string(obj);
+        }
+    }
+
+
+    public String getValueString(Object component, String propName)
+    {
+        return getValueString(component, getProperty(component, propName));
+    }
+
+
+    public void setValue(Object component, String propName, String value)
+    {
+        setValue(component, getProperty(component, propName), value);
+    }
+
+
+    /**
+     * Set a property value for the specified component.
+     *
+     * <p>
+     * <b>Note:</b> The implementation of this method is similar to the
+     * private method <code>Thinlet.addAttribute()</code>.
+     *
+     * @throws IllegalArgumentException  if the string value cannot be cast into
+     *   a property value of appropiate type.
+     */
+    public void setValue(Object component, ThinletDTD.Property property, String value)
+    {
+        String key = property.getName();
+        switch(property.getType())
+        {
+            case ThinletDTD.Property.STRING:
+                thinlet.setString(component, key, value);
+                break;
+            case ThinletDTD.Property.BOOLEAN:
+                boolean b = false;
+                if("true".equals(value))
+                    b = true;
+                else if("false".equals(value))
+                    b = false;
+                else
+                    throw new IllegalArgumentException("value not allowed for boolean property "
+                        + key + ": " + value);
+                // special case: widget "dialog", property "modal"
+                if(property == ThinletDTD.getProperty("dialog", "modal"))
+                {
+                    map.put(component, property, new Boolean(b), value);
+                    b = false;
+                }
+                // special case: widget "dialog", property "closable" (deprecated)
+                if(property != ThinletDTD.getProperty("dialog", "closable"))
+                    thinlet.setBoolean(component, key, b);
+                break;
+            case ThinletDTD.Property.INTEGER:
+                thinlet.setInteger(component, key, Integer.parseInt(value));
+                break;
+            case ThinletDTD.Property.CHOICE:
+                thinlet.setChoice(component, key, value);
+                break;
+            case ThinletDTD.Property.COLOR:
+                thinlet.setColor(component, key, ThinletWorkarounds.string2color(value));
+                break;
+            case ThinletDTD.Property.ICON:
+                Image icon = loadIcon(value);
+                thinlet.setIcon(component, key, icon);
+                map.put(component, property, icon, value);
+                break;
+            case ThinletDTD.Property.FONT:
+                thinlet.setFont(component, key, ThinletWorkarounds.string2font(thinlet, value));
+                break;
+            case ThinletDTD.Property.KEYSTROKE:
+                thinlet.setKeystroke(component, key, value);
+                break;
+            case ThinletDTD.Property.PROPERTY:
+                StringTokenizer st = new StringTokenizer(value, ";");
+                while(st.hasMoreTokens())
+                {
+                    String token = st.nextToken();
+                    int equals = token.indexOf('=');
+                    if (equals == -1)
+                        throw new IllegalArgumentException("property " + token + ": no '=' char");
+                    thinlet.putProperty(component, token.substring(0, equals), token.substring(equals + 1));
+                }
+                break;
+            case ThinletDTD.Property.METHOD:
+            case ThinletDTD.Property.COMPONENT:
+                // simply store property text only
+                map.put(component, property, value, value);
+                break;
+            case ThinletDTD.Property.BEAN: // later
+                break;
+            default:
+                throw new IllegalArgumentException("unknown property type: " + property.getType());
+        }
+    }
+
+
+    private Image loadIcon(String path)
+    {
+        Image image = null;
+        try
+        {
+            image = Toolkit.getDefaultToolkit().getImage(new URL(path));
+        }
+        catch(MalformedURLException e)
+        {
+            String iconDir = Settings.getIconDir();
+            File file = new File(iconDir, path);
+            if(file.exists())
+            {
+                try
+                {
+                    FileInputStream is = new FileInputStream(file);
+                    byte[] data = new byte[is.available()];
+                    is.read(data, 0, data.length);
+                    image = thinlet.getToolkit().createImage(data);
+                    is.close();
+                }
+                catch(FileNotFoundException ignore)
+                {
+                    if(debug()) log.fine("icon file not found: " + file);
+                }
+                catch(IOException ioex)
+                {
+                    log.log(Level.SEVERE, "IOException during load of " + file, ioex);
+                }
+            }
+            else
+                if(debug()) log.fine("icon file not found: " + file);
+        }
+
+        if(image != null)
+        {
+            // load image using media tracker
+            MediaTracker mediatracker = new MediaTracker(thinlet);
+            mediatracker.addImage(image, 1);
+            try
+            {
+                mediatracker.waitForID(1, 5000);
+            }
+            catch (InterruptedException ie)
+            {
+                log.warning("loading of image " + path + " has been interrupted!");
+            }
+        }
+
+        return image;
+    }
+
+
+    public void removeComponent(Object component)
+    {
+        map.removeAll(component);
+    }
+
+
+    public static String getDefaultValueString(ThinletDTD.Property property)
+    {
+        Object obj = property.getDefaultValue();
+        return value2string(obj);
+    }
+
+
+    public static ThinletDTD.Property getProperty(Object component, String propName)
+    {
+        String classname = Thinlet.getClass(component);
+        ThinletDTD.Property property = ThinletDTD.getProperty(classname, propName);
+        return property;
+    }
+
+
+    private static String value2string(Object obj)
+    {
+        if(obj == null)
+            return "";
+        else if(obj instanceof String)
+            return (String) obj;
+        else if(obj instanceof Boolean)
+            return ((Boolean)obj).toString();
+        else if(obj instanceof Integer)
+            return ((Integer)obj).toString();
+        else if(obj instanceof Color)
+            return AWTUtils.getColorString((Color)obj);
+        else if(obj instanceof Image)
+            return "";
+        else if(obj instanceof Font)
+            return AWTUtils.getFontString((Font)obj);
+        else
+            throw new IllegalArgumentException("unexpected property type class: " + obj.getClass().getName());
+    }
+
+
+    private static class PropertyMap
+    {
+        private static class Key
+        {
+            Object component;
+            ThinletDTD.Property property;
+
+            public Key(Object component, ThinletDTD.Property property)
+            {
+                this.component = component;
+                this.property = property;
+            }
+
+            public boolean equals(Object other)
+            {
+                Key otherkey = (Key)other;
+                return (this.component == otherkey.component)
+                    && (this.property == otherkey.property);
+            }
+
+            public int hashCode()
+            {
+                return component.hashCode() + 3 * property.hashCode() + 7;
+            }
+        }
+
+        private static class Value
+        {
+            Object value;
+            String valueString;
+
+            public Value(Object value, String valueString)
+            {
+                this.value = value;
+                this.valueString = valueString;
+            }
+        }
+
+
+        private HashMap map = new HashMap();
+
+
+        public PropertyMap()
+        {
+        }
+
+        public void put(Object component, ThinletDTD.Property property, Object value, String valueString)
+        {
+            map.put(new Key(component, property), new Value(value, valueString));
+        }
+
+        public Object getValue(Object component, ThinletDTD.Property property)
+        {
+            Value value = (Value) map.get(new Key(component, property));
+            return value != null ? value.value : null;
+        }
+
+        public String getValueString(Object component, ThinletDTD.Property property)
+        {
+            Value value = (Value) map.get(new Key(component, property));
+            return value != null ? value.valueString : null;
+        }
+
+        public void remove(Object component, ThinletDTD.Property property)
+        {
+            map.remove(new Key(component, property));
+        }
+
+        public void removeAll(Object component)
+        {
+            Iterator it = map.keySet().iterator();
+            while(it.hasNext())
+            {
+                Key key = (Key)it.next();
+                if(key.component == component)
+                    it.remove();
+            }
+        }
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/AWTUtils.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/AWTUtils.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/AWTUtils.java	(revision 1126)
@@ -0,0 +1,272 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package utils;
+
+
+import java.awt.AWTKeyStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.MediaTracker;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextLayout;
+import java.awt.geom.Rectangle2D;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+/**
+ * Misc helper methods for AWT that don't require Thinlet.
+ *
+ * @author Dirk Moebius
+ */
+public class AWTUtils
+{
+
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private static HashMap keyDescriptions = new HashMap();
+
+
+    static
+    {
+        // initialize HashMap keyDescriptions
+        Field[] fields = KeyEvent.class.getDeclaredFields();
+        for(int i = 0; i < fields.length; ++i)
+        {
+            Field field = fields[i];
+            int modifiers = field.getModifiers();
+            if(((modifiers & (Modifier.STATIC | Modifier.PUBLIC)) != 0)
+                && field.getName().startsWith("VK_"))
+            {
+                try
+                {
+                    int keyCode = field.getInt(null);
+                    String keyDescription = field.getName().substring(3);
+                    keyDescriptions.put(new Integer(keyCode), keyDescription);
+                }
+                catch(IllegalAccessException e)
+                {
+                    log.log(Level.SEVERE, "can't get value of field " + field, e);
+                }
+            }
+        }
+    }
+
+
+    public static String getColorString(Color c)
+    {
+        int red = c.getRed();
+        int green = c.getGreen();
+        int blue = c.getBlue();
+        StringBuffer s = new StringBuffer("#");
+        if(red < 10) s.append("0");
+        s.append(Integer.toHexString(red));
+        if(green < 10) s.append("0");
+        s.append(Integer.toHexString(green));
+        if(blue < 10) s.append("0");
+        s.append(Integer.toHexString(blue));
+        return s.toString();
+    }
+
+
+    /**
+     * Returns a thinlet font description for the given font.
+     *
+     * @param font  the font
+     * @return a thinlet font description such as "Serif 10 bold italic"
+     */
+    public static String getFontString(Font font)
+    {
+        StringBuffer s = new StringBuffer();
+        s.append(font.getFamily());
+        s.append(" ");
+        s.append(font.getSize());
+        if(font.isItalic())
+            s.append(" italic");
+        if(font.isBold())
+            s.append(" bold");
+        return s.toString();
+    }
+
+
+    /**
+     * Returns a thinlet font description for the given font, containing only
+     * the font properties that <i>differ</i> from the given default font.
+     *
+     * @param font  the font
+     * @param defaultFont  the default font
+     * @return a thinlet font description such as "serif 10 bold italic"
+     */
+    public static String getFontString(Font font, Font defaultFont)
+    {
+        StringBuffer s = new StringBuffer();
+        if(!font.getFamily().equals(defaultFont.getFamily()))
+            s.append(font.getFamily());
+        if(font.getSize() != defaultFont.getSize())
+        {
+            if(s.length() > 0) s.append(' ');
+            s.append(font.getSize());
+        }
+        if(font.isItalic() != defaultFont.isItalic())
+        {
+            if(s.length() > 0) s.append(' ');
+            s.append("italic");
+        }
+        if(font.isBold() != defaultFont.isBold())
+        {
+            if(s.length() > 0) s.append(' ');
+            s.append("bold");
+        }
+        return s.toString();
+    }
+
+
+    /**
+     * Get the frame that the specified component resides in, or null if
+     * the component has no ancestor of type <code>Frame</code>.
+     */
+    public static Frame getFrame(Component comp)
+    {
+        while(comp != null && !(Frame.class.isInstance(comp)))
+            comp = comp.getParent();
+        return (Frame)comp;
+    }
+
+
+    /**
+     * Returns the dimension of the specified text string, if it would be
+     * rendered with the font and the rendering context of the specified
+     * component.
+     */
+    public static Dimension getBounds(String text, Component component)
+    {
+        Graphics2D graphics = (Graphics2D)component.getGraphics();
+        StringTokenizer st = new StringTokenizer(text, "\n", true);
+        Dimension dim = new Dimension(0, 0);
+        while(st.hasMoreTokens())
+        {
+            String token = st.nextToken();
+            if(token.equals("\n"))
+                token = "W";
+            TextLayout textLayout = new TextLayout(token, component.getFont(),
+                (graphics != null) ? graphics.getFontRenderContext()
+                    : new FontRenderContext(null, true, false));
+            Rectangle2D rect = textLayout.getBounds();
+            dim.height += (int)rect.getHeight();
+            dim.width = Math.max(dim.width, (int)rect.getWidth());
+        }
+        return dim;
+    }
+
+
+    /**
+     * Load an icon. Use a MediaTracker synchronizing on the specified
+     * component to wait for the icon to load.
+     *
+     * @param component  the component that the MediaTracker uses to control
+     *   the loading of the icon.
+     * @param path  the path relative to the package path of the class of
+     *   the component, e.g. "icons/icon.gif".
+     */
+    public static Image getIcon(Component component, String path)
+    {
+        URL url = component.getClass().getResource(path);
+        return getIcon(component, url);
+    }
+
+
+    /**
+     * Load an icon. Use a MediaTracker synchronizing on the specified
+     * component to wait for the icon to load.
+     *
+     * @param component  the component that the MediaTracker uses to control
+     *   the loading of the icon.
+     * @param url  the URL of the icon.
+     */
+    public static Image getIcon(Component component, URL url)
+    {
+        if(debug()) log.fine("loading icon url=" + url + "...");
+
+        Image icon = component.getToolkit().getImage(url);
+
+        MediaTracker mediatracker = new MediaTracker(component);
+        mediatracker.addImage(icon, 1);
+        try
+        {
+            mediatracker.waitForID(1);
+        }
+        catch(InterruptedException e)
+        {
+            log.warning("loading of icon " + url + " has been interrupted!");
+        }
+
+        return icon;
+    }
+
+
+    /**
+     * Given an AWTKeyStroke, returns a keystroke description that can be
+     * parsed by <code>AWTKeyStroke.getAWTKeyStroke(String s)</code>.
+     * <p>
+     * Examples: "ctrl O", "alt shift F4", "altGraph Q"
+     */
+    public static String getAWTKeyStrokeDescription(AWTKeyStroke k)
+    {
+        StringBuffer buf = new StringBuffer();
+
+        int mod = k.getModifiers();
+        if((mod & InputEvent.ALT_DOWN_MASK) != 0 || (mod & InputEvent.ALT_MASK) != 0)
+            buf.append("alt ");
+        if((mod & InputEvent.ALT_GRAPH_DOWN_MASK) != 0 || (mod & InputEvent.ALT_GRAPH_MASK) != 0)
+            buf.append("altGraph ");
+        if((mod & InputEvent.META_DOWN_MASK) != 0 || (mod & InputEvent.META_MASK) != 0)
+            buf.append("meta ");
+        if((mod & InputEvent.CTRL_DOWN_MASK) != 0 || (mod & InputEvent.CTRL_MASK) != 0)
+            buf.append("ctrl ");
+        if((mod & InputEvent.SHIFT_DOWN_MASK) != 0 || (mod & InputEvent.SHIFT_MASK) != 0)
+            buf.append("shift ");
+
+        buf.append(getKeyText(k.getKeyCode()));
+
+        return buf.toString();
+    }
+
+
+    /**
+     * Return the key description for a key code, according to the key names
+     * in <code>java.awt.event.KeyEvent</code>, omitting the prefix "VK_".
+     * For example the strings returned may be "A" - "Z", "F1" - "F24" "RIGHT",
+     * "BACK_SPACE", "DEAD_TILDE" and so on.
+     */
+    public static String getKeyText(int keyCode)
+    {
+        String desc = (String) keyDescriptions.get(new Integer(keyCode));
+        if(desc == null)
+        {
+            log.warning("KeyEvent field for keyCode " + keyCode + " not found!"
+                + " Returning default description.");
+            return KeyEvent.getKeyText(keyCode);
+        }
+        else
+            return desc;
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/ReaderInputStream.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/ReaderInputStream.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/ReaderInputStream.java	(revision 1126)
@@ -0,0 +1,74 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package utils;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+
+/**
+ * This class is the opposite of <code>java.io.InputStreamReader</code>: it
+ * provides a bridge from (new) character streams (<i>Reader</i>) to (old)
+ * byte streams (<i>InputStream</i>). It reads characters and converts them
+ * into bytes.
+ *
+ * @author Dirk Moebius
+ */
+public class ReaderInputStream extends InputStream
+{
+
+    protected Reader reader;
+
+
+    public ReaderInputStream(Reader reader)
+    {
+        this.reader = reader;
+    }
+
+
+    public int available() throws IOException
+    {
+        return reader.ready() ? 1 : 0;
+    }
+
+
+    public void close() throws IOException
+    {
+        reader.close();
+    }
+
+
+    public void mark(int readAheadLimit)
+    {
+        try { reader.mark(readAheadLimit); } catch(IOException ignore) {}
+    }
+
+
+    public boolean markSupported()
+    {
+        return reader.markSupported();
+    }
+
+
+    public int read() throws IOException
+    {
+        return reader.read();
+    }
+
+
+    public void reset() throws IOException
+    {
+        reader.reset();
+    }
+
+
+    public long skip(long n) throws IOException
+    {
+        return reader.skip(n);
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/package.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/package.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/utils/package.html	(revision 1126)
@@ -0,0 +1,6 @@
+<body>
+<p>
+This package contains some common utilities not dependent on Thinlet.
+</p>
+</body>
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ExtensionFileFilter.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ExtensionFileFilter.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ExtensionFileFilter.java	(revision 1126)
@@ -0,0 +1,59 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.io.File;
+
+
+/**
+ * A file filter for {@link FileChooser} that accepts files based on file
+ * name endings (<i>extensions</i>).
+ *
+ * <p>
+ * Note that the file filter is case sensitive. That is a file filter instance
+ * created with <code>new ExtensionFileFilter("xml", "XML files")</code>
+ * accepts <code>file.xml</code> but not <code>FILE.XML</code>.
+ *
+ * @author Dirk Moebius
+ */
+public class ExtensionFileFilter implements FileFilter
+{
+
+    private String extension;
+    private String description;
+
+
+    /**
+     * Create a new ExceptionFileFilter.
+     *
+     * @param extension  the extention, for example "xml", "jpg", etc.
+     * @param description  the description.
+     */
+    public ExtensionFileFilter(String extension, String description)
+    {
+        this.extension = "." + extension;
+        this.description = description;
+    }
+
+
+    /**
+     * Whether the given file is accepted by this filter.
+     */
+    public boolean accept(File file)
+    {
+        return file.getName().endsWith(extension);
+    }
+
+
+    /**
+     * A human readable description of this file filter.
+     */
+    public String getDescription()
+    {
+        return description;
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/messagedialog.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/messagedialog.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/messagedialog.xml	(revision 1126)
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: -->
+
+<panel
+	columns="2"
+	gap="12" top="12" left="12" right="12" bottom="12"
+	init="init(iconLabel, message, button1, button2, button3)"
+>
+	<label
+		name="iconLabel"
+		icon="/thinletcommons/icons/inform.gif"
+		valign="top"
+		rowspan="2"
+	/>
+	<textarea
+		name="message"
+		editable="false"
+		border="false"
+		wrap="true"
+		weightx="1"
+		weighty="1"
+	/>
+	<panel gap="12" halign="right">
+		<button name="button1" text="..." action="buttonPressed(this)"/>
+		<button name="button2" text="..." action="buttonPressed(this)"/>
+		<button name="button3" text="..." action="buttonPressed(this)"/>
+	</panel>
+</panel>
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FileFilter.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FileFilter.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FileFilter.java	(revision 1126)
@@ -0,0 +1,27 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.io.File;
+
+
+/**
+ * A file filter for {@link FileChooser}.
+ *
+ * @author Dirk Moebius
+ */
+public interface FileFilter
+{
+    /**
+     * Whether the given file is accepted by this filter.
+     */
+    public boolean accept(File file);
+
+    /**
+     * A human readable description of this file filter.
+     */
+    public String getDescription();
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ThinletDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ThinletDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ThinletDialog.java	(revision 1126)
@@ -0,0 +1,157 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+
+/**
+ * <code>ThinletDialog</code> is a <i>modal</i> double buffered dialog
+ * containing a <i>thinlet</i> component.
+ *
+ * @author Dirk Moebius
+ */
+public class ThinletDialog extends Dialog
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private transient Thinlet content;
+    private transient Image doublebuffer;
+
+
+    public ThinletDialog(Frame owner)
+    {
+        super(owner, true);
+        addWindowListener(new WindowHandler());
+    }
+
+
+    public ThinletDialog(Frame owner, String title)
+    {
+        super(owner, title, true);
+        addWindowListener(new WindowHandler());
+    }
+
+
+    public ThinletDialog(Dialog owner)
+    {
+        super(owner);
+        setModal(true);
+        addWindowListener(new WindowHandler());
+    }
+
+
+    public ThinletDialog(Dialog owner, String title)
+    {
+        super(owner, title, true);
+        addWindowListener(new WindowHandler());
+    }
+
+
+    public void setContent(Thinlet content)
+    {
+        this.content = content;
+        removeAll();
+        setLayout(new BorderLayout());
+        _addImpl(content, BorderLayout.CENTER);
+        pack();
+    }
+
+
+    public Thinlet getContent()
+    {
+        return content;
+    }
+
+
+    /**
+     * Call the paint method to redraw this component without painting a
+     * background rectangle.
+     */
+    public void update(Graphics g)
+    {
+        paint(g);
+    }
+
+
+    /**
+     * Create a double buffer if needed, the <i>thinlet</i> component paints
+     * the content.
+     */
+    public void paint(Graphics g)
+    {
+        if(doublebuffer == null)
+        {
+            Dimension d = getSize();
+            doublebuffer = createImage(d.width, d.height);
+        }
+        Graphics dg = doublebuffer.getGraphics();
+        dg.setClip(g.getClipBounds());
+        super.paint(dg);
+        dg.dispose();
+        g.drawImage(doublebuffer, 0, 0, this);
+    }
+
+
+    /**
+     * Clear the double buffer image (because the frame has been resized), the
+     * overriden method lays out its components (centers the <i>thinlet</i>
+     * component).
+     */
+    public void doLayout()
+    {
+        if(doublebuffer != null)
+        {
+            doublebuffer.flush();
+            doublebuffer = null;
+        }
+        super.doLayout();
+    }
+
+
+    /**
+     * Redirects all calls to <code>add(...)</code> to
+     * {@link #setContent(Thinlet)}.
+     */
+    protected void addImpl(Component comp, Object constraints, int index)
+    {
+        setContent((Thinlet)comp);
+    }
+
+
+    private void _addImpl(Component comp, String constraints)
+    {
+        super.addImpl(comp, constraints, -1);
+    }
+
+
+    private class WindowHandler extends WindowAdapter
+    {
+        public void windowClosing(WindowEvent e)
+        {
+            // dialog stays visible if the thinlet returns 'false' in destroy(),
+            // otherwise it is closed and control is returned to calling frame.
+            setVisible(content != null && !content.destroy());
+        }
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/thing.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/thing.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/thing.xml	(revision 1126)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: -->
+
+<panel columns="1" gap="4">
+
+	<menubar weightx="1">
+		<menu text="File" mnemonic="0">
+			<menuitem text="New" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl N" action="menu_file_new()"/>
+			<menuitem text="Open..." mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl O" action="menu_file_open()"/>
+			<separator/>
+			<menuitem text="Reload" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl R" action="menu_file_reload()"/>
+			<separator/>
+			<menuitem text="Save" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl S" action="menu_file_save()"/>
+			<menuitem text="Save As..." mnemonic="5" icon="icons/empty_menu.gif" action="menu_file_save_as()"/>
+			<separator/>
+			<menuitem text="Exit" mnemonic="0" icon="icons/empty_menu.gif" accelerator="alt F4" action="menu_file_exit()"/>
+		</menu>
+		<menu text="Edit" mnemonic="0">
+			<menuitem text="Cut" name="menu_edit_cut" mnemonic="0" accelerator="ctrl X" icon="icons/edit_cut.gif" action="menu_edit_cut()"/>
+			<menuitem text="Copy" name="menu_edit_copy" mnemonic="1" accelerator="ctrl C" icon="icons/edit_copy.gif" action="menu_edit_copy()"/>
+			<menuitem text="Paste" name="menu_edit_paste" mnemonic="0" accelerator="ctrl V" icon="icons/edit_paste.gif" action="menu_edit_paste()"/>
+			<menuitem text="Paste from system clipboard" name="menu_edit_paste_systemcb" mnemonic="1" accelerator="ctrl shift V" icon="icons/empty_menu.gif" action="menu_edit_paste_systemcb()"/>
+			<menuitem text="Delete" name="menu_edit_delete" mnemonic="0" icon="icons/edit_delete.gif" action="menu_edit_delete()"/>
+			<separator/>
+			<menuitem text="Settings..." mnemonic="0" icon="icons/empty_menu.gif" action="menu_edit_settings()"/>
+		</menu>
+		<menu text="Tools" mnemonic="0">
+			<menuitem text="Generate Handler Stub Source..." name="menu_tools_generate" mnemonic="0" accelerator="ctrl G" icon="icons/empty_menu.gif" action="menu_tools_generate()"/>
+		</menu>
+		<menu text="Help" mnemonic="0">
+			<menuitem text="About Thing..." mnemonic="0" icon="icons/thing_small.gif" action="menu_help_about()"/>
+		</menu>
+	</menubar>
+
+	<panel name="toolbar" weightx="1" gap="-1">
+
+		<!-- top level components -->
+		<button name="tb_add_panel" property="classname=panel" icon="icons/panel.gif" tooltip="Create new panel" action="addComponent(this)"/>
+		<button name="tb_add_dialog" property="classname=dialog" icon="icons/dialog.gif" tooltip="Create new dialog" action="addComponent(this)"/>
+		<button name="tb_add_desktop" property="classname=desktop" icon="icons/desktop.gif" tooltip="Create new desktop" action="addComponent(this)"/>
+		<button name="tb_add_splitpane" property="classname=splitpane" icon="icons/splitpane.gif" tooltip="Create new splitpane" action="addComponent(this)"/>
+		<button name="tb_add_tabbedpane" property="classname=tabbedpane" icon="icons/tabbedpane.gif" tooltip="Create new tabbedpane" action="addComponent(this)"/>
+
+		<!-- menu components -->
+		<button name="tb_add_menubar" property="classname=menubar" icon="icons/menubar.gif" tooltip="Create new menubar" action="addComponent(this)"/>
+		<button name="tb_add_menu" property="classname=menu" icon="icons/menu.gif" tooltip="Create new menu" action="addComponent(this)"/>
+		<button name="tb_add_menuitem" property="classname=menuitem" icon="icons/menuitem.gif" tooltip="Create new menuitem" action="addComponent(this)"/>
+		<button name="tb_add_checkboxmenuitem" property="classname=checkboxmenuitem" icon="icons/checkboxmenuitem.gif" tooltip="Create new checkboxmenuitem" action="addComponent(this)"/>
+
+		<!-- components -->
+		<button name="tb_add_label" property="classname=label" icon="icons/label.gif" tooltip="Create new label" action="addComponent(this)"/>
+		<button name="tb_add_button" property="classname=button" icon="icons/button.gif" tooltip="Create new button" action="addComponent(this)"/>
+		<button name="tb_add_togglebutton" property="classname=togglebutton" icon="icons/togglebutton.gif" tooltip="Create new togglebutton" action="addComponent(this)"/>
+		<button name="tb_add_checkbox" property="classname=checkbox" icon="icons/checkbox.gif" tooltip="Create new checkbox" action="addComponent(this)"/>
+		<button name="tb_add_textfield" property="classname=textfield" icon="icons/textfield.gif" tooltip="Create new textfield" action="addComponent(this)"/>
+		<button name="tb_add_combobox" property="classname=combobox" icon="icons/combobox.gif" tooltip="Create new combobox" action="addComponent(this)"/>
+		<button name="tb_add_passwordfield" property="classname=passwordfield" icon="icons/passwordfield.gif" tooltip="Create new passwordfield" action="addComponent(this)"/>
+		<button name="tb_add_spinbox" property="classname=spinbox" icon="icons/spinbox.gif" tooltip="Create new spinbox" action="addComponent(this)"/>
+		<button name="tb_add_progressbar" property="classname=progressbar" icon="icons/progressbar.gif" tooltip="Create new progressbar" action="addComponent(this)"/>
+		<button name="tb_add_slider" property="classname=slider" icon="icons/slider.gif" tooltip="Create new slider" action="addComponent(this)"/>
+		<button name="tb_add_separator" property="classname=separator" icon="icons/separator.gif" tooltip="Create new separator" action="addComponent(this)"/>
+		<button name="tb_add_list" property="classname=list" icon="icons/list.gif" tooltip="Create new list" action="addComponent(this)"/>
+		<button name="tb_add_table" property="classname=table" icon="icons/table.gif" tooltip="Create new table" action="addComponent(this)"/>
+		<button name="tb_add_textarea" property="classname=textarea" icon="icons/textarea.gif" tooltip="Create new textarea" action="addComponent(this)"/>
+		<button name="tb_add_tree" property="classname=tree" icon="icons/tree.gif" tooltip="Create new tree" action="addComponent(this)"/>
+
+		<!-- list items -->
+		<button name="tb_add_choice" property="classname=choice" icon="icons/choice.gif" tooltip="Create new choice" action="addComponent(this)"/>
+		<button name="tb_add_item" property="classname=item" icon="icons/item.gif" tooltip="Create new item" action="addComponent(this)"/>
+		<button name="tb_add_node" property="classname=node" icon="icons/node.gif" tooltip="Create new node" action="addComponent(this)"/>
+		<button name="tb_add_tab" property="classname=tab" icon="icons/tab.gif" tooltip="Create new tab" action="addComponent(this)"/>
+
+		<!-- table components -->
+		<button name="tb_add_row" property="classname=row" icon="icons/row.gif" tooltip="Create new row" action="addComponent(this)"/>
+		<button name="tb_add_cell" property="classname=cell" icon="icons/cell.gif" tooltip="Create new cell" action="addComponent(this)"/>
+		<button name="tb_add_header" property="classname=header" icon="icons/header.gif" tooltip="Create new header" action="addComponent(this)"/>
+		<button name="tb_add_column" property="classname=column" icon="icons/column.gif" tooltip="Create new column" action="addComponent(this)"/>
+
+		<!-- other -->
+		<button name="tb_add_popupmenu" property="classname=popupmenu" icon="icons/popupmenu.gif" tooltip="Create new popupmenu" action="addComponent(this)"/>
+
+		<!-- later -->
+		<!--
+		<button name="tb_add_bean" property="classname=bean" icon="icons/bean.gif" tooltip="Create new bean" action="addComponent(this)" enabled="false"/>
+		-->
+
+		<!-- placeholder in case there are no buttons add all -->
+		<separator height="30" width="1"/>
+	</panel>
+
+	<!-- main workarea -->
+	<panel left="4" right="4" weightx="1" weighty="1">
+		<splitpane orientation="horizontal" divider="200" weightx="1" weighty="1">
+
+			<!-- left splitpane: component tree and properties table -->
+			<splitpane orientation="vertical">
+				<panel columns="1" weightx="1" weighty="1">
+					<tree name="tree" angle="true" line="false" selection="single" weightx="1" weighty="1" action="treeSelectionChanged()"/>
+					<panel top="3" bottom="3" gap="2" scrollable="true">
+						<button name="tb_edit_copy" icon="icons/edit_copy.gif" tooltip="Copy selected component to internal ThinG clipboard and system clipboard" action="menu_edit_copy()"/>
+						<button name="tb_edit_cut" icon="icons/edit_cut.gif" tooltip="Cut selected component to internal ThinG clipboard and system clipboard" action="menu_edit_cut()"/>
+						<button name="tb_edit_paste" icon="icons/edit_paste.gif" tooltip="Paste component from internal ThinG clipboard below selected component" action="menu_edit_paste()"/>
+						<button name="tb_edit_delete" icon="icons/edit_delete.gif" tooltip="Remove selected component" action="menu_edit_delete()"/>
+						<separator/>
+						<button name="tb_edit_moveup" icon="icons/edit_moveup.gif" tooltip="Move selected component up" action="moveComponentUp()"/>
+						<button name="tb_edit_movedown" icon="icons/edit_movedown.gif" tooltip="Move selected component down" action="moveComponentDown()"/>
+					</panel>
+				</panel>
+				<panel columns="1" gap="5">
+					<table name="props" selection="single" weightx="1" weighty="1" action="tableSelectionChanged()">
+						<header>
+							<column name="props_key" text="Property" width="80" sort="ascent"/>
+							<column name="props_value" text="Value"/>
+						</header>
+					</table>
+					<panel name="propedit" columns="3" gap="5" weightx="1" border="true" top="5" left="5" bottom="5" right="5">
+						<label name="propedit_name" text=""/>
+						<panel name="propedit_panel" gap="5" weightx="1"/>
+						<button name="propedit_reset" text="Reset" tooltip="Reset to default value" font="10" valign="center" enabled="false" action="propEditReset()"/>
+					</panel>
+				</panel>
+			</splitpane>
+
+			<!-- right splitpane: preview panel -->
+			<tabbedpane name="tabs" placement="top" selected="1" action="tabSelected(this.selected)">
+				<!-- Attention: because of an obscure bug in Thinlet.getNextFocusable(), -->
+				<!-- the tab "XML" must be the first one! If it is not the first panel, Thinlet -->
+				<!-- runs into an endless loop when the user navigates from the "Preview" tab -->
+				<!-- to the "XML" tab, trying to set the next focusable component. -->
+				<tab text="XML" mnemonic="0">
+					<panel weightx="1" weighty="1">
+						<textarea name="serialize" editable="false" weightx="1" weighty="1"/>
+					</panel>
+				</tab>
+				<tab text="Preview" mnemonic="0">
+					<panel name="preview" border="true" scrollable="true" weightx="1" weighty="1"/>
+				</tab>
+			</tabbedpane>
+
+		</splitpane>
+	</panel>
+
+	<!-- status bar at bottom -->
+	<textfield name="statusbar" editable="false" text="ThinG" weightx="1"/>
+
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FontChooser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FontChooser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FontChooser.java	(revision 1126)
@@ -0,0 +1,194 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.GraphicsEnvironment;
+import java.util.Arrays;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+
+/**
+ * A Thinlet font chooser dialog.
+ *
+ * <p>
+ * The dialog is modal and blocks the calling frame/dialog. It is therefore
+ * displayed in a separate window.
+ *
+ * @author Dirk Moebius
+ */
+public class FontChooser
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private ThinletDialog dialog;
+    private Thinlet thinlet;
+    private Font selectedFont;
+
+
+    public FontChooser(Frame owner, String title)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init();
+    }
+
+
+    public FontChooser(Dialog owner, String title)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init();
+    }
+
+
+    private void init()
+    {
+        thinlet = new AntiAliasedThinlet();
+
+        try
+        {
+            Object panel = thinlet.parse("/thinletcommons/fontchooser.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing fontchooser.xml", e);
+        }
+
+        dialog.setContent(thinlet);
+    }
+
+
+    /**
+     * Show the modal dialog.
+     * This halts the application until the user dismisses the dialog.
+     */
+    public void show()
+    {
+        dialog.setSize(new Dimension(320, 360));
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+    }
+
+
+    public void setSelectedFont(Font font)
+    {
+        String family = null;
+        int size = 12;
+        boolean isBold = false;
+        boolean isItalic = false;
+
+        if(font != null)
+        {
+            family = font.getFamily();
+            size = font.getSize();
+            isBold = font.isBold();
+            isItalic = font.isItalic();
+            thinlet.setFont(thinlet.find("preview"), "font", font);
+        }
+
+        thinlet.setString(thinlet.find("fontsize"), "text", String.valueOf(size));
+        thinlet.setBoolean(thinlet.find("cb_bold"), "selected", isBold);
+        thinlet.setBoolean(thinlet.find("cb_italic"), "selected", isItalic);
+
+        Object fontlist = thinlet.find("fontlist");
+        Object[] items = thinlet.getItems(fontlist);
+        for(int i = 0; i < items.length; ++i)
+        {
+            String text = thinlet.getString(items[i], "text");
+            thinlet.setBoolean(items[i], "selected", text.equals(family));
+        }
+
+        thinlet.setBoolean(thinlet.find("b_ok"), "enabled", font != null);
+    }
+
+
+    public Font getSelectedFont()
+    {
+        return selectedFont;
+    }
+
+
+    //{{{ callbacks for fontchooser.xml
+    /** Thinlet callback. */
+    public void init(Object fontlist)
+    {
+        if(debug()) log.fine("in init()");
+        String[] names = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
+        Arrays.sort(names);
+        for(int i = 0; i < names.length; ++i)
+        {
+            Object item = Thinlet.create("item");
+            thinlet.add(fontlist, item);
+            thinlet.setString(item, "text", names[i]);
+        }
+    }
+
+
+    /** Thinlet callback. */
+    public void ok(Object fontlist, Object fontsize, Object cbBold, Object cbItalic)
+    {
+        this.selectedFont = getFont(fontlist, fontsize, cbBold, cbItalic);
+        if(debug()) log.fine("selected: " + this.selectedFont);
+        dialog.setVisible(false);
+    }
+
+
+    /** Thinlet callback. */
+    public void close()
+    {
+        dialog.setVisible(false);
+    }
+
+
+    /** Thinlet callback. */
+    public void fontChanged(Object fontlist, Object fontsize, Object cbBold, Object cbItalic, Object preview, Object bOk)
+    {
+        Font font = getFont(fontlist, fontsize, cbBold, cbItalic);
+        if(font == null)
+            thinlet.setBoolean(bOk, "enabled", false);
+        else
+        {
+            thinlet.setBoolean(bOk, "enabled", true);
+            thinlet.setFont(preview, "font", font);
+        }
+    }
+    //}}}
+
+
+    //{{{ private methods
+    private Font getFont(Object fontlist, Object fontsize, Object cbBold, Object cbItalic)
+    {
+        Object item = thinlet.getSelectedItem(fontlist);
+        if(item == null)
+            return null;
+
+        String family = thinlet.getString(item, "text");
+        int size = 12;
+        String fontsizeText = thinlet.getString(fontsize, "text");
+        if(fontsizeText.length() > 0)
+            size = Integer.parseInt(fontsizeText);
+        boolean isBold = thinlet.getBoolean(cbBold, "selected");
+        boolean isItalic = thinlet.getBoolean(cbItalic, "selected");
+
+        Font font = new Font(family,
+            isBold ? (isItalic ? Font.BOLD|Font.ITALIC : Font.BOLD)
+                : (isItalic ? Font.ITALIC : Font.PLAIN), size);
+
+        return font;
+    }
+    //}}}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ThinletTester.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ThinletTester.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ThinletTester.java	(revision 1126)
@@ -0,0 +1,150 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import thinlet.FrameLauncher;
+import thinlet.Thinlet;
+
+
+public class ThinletTester
+{
+
+    private static String file = null;
+    private static String thinletClassname = "thinlet.Thinlet";
+    private static String handlerClassname = null;
+
+
+    public static void main(String[] args) throws Throwable
+    {
+        getArgs(args);
+        run();
+    }
+
+
+    private static void getArgs(String[] args)
+    {
+        if(args.length < 1 || args.length > 5)
+            usage();
+
+        for(int i = 0; i < args.length; ++i)
+        {
+            if(args[i].equals("--help"))
+                usage();
+            else if(args[i].equals("--thinlet"))
+            {
+                if(i == args.length - 1)
+                    usage();
+                else
+                    thinletClassname = args[++i];
+            }
+            else if(args[i].equals("--handler"))
+            {
+                if(i == args.length - 1)
+                    usage();
+                else
+                    handlerClassname = args[++i];
+            }
+            else if(file == null)
+                file = args[i];
+            else
+                usage();
+        }
+
+        if(file == null)
+            usage();
+    }
+
+
+    private static void usage()
+    {
+        System.out.println("ThinletTester, version 1.0");
+        System.out.println();
+        System.out.println("Usage: java [-cp <classpath>] thinletcommons.ThinletTester [--thinlet <classname>]");
+        System.out.println("         [--handler <classname>] thinletfile.xml");
+        System.out.println();
+        System.out.println("  --thinlet  Thinlet classname, e.g. thinlet.Thinlet");
+        System.out.println("  --handler  Handler classname, e.g. foo.bar.MyHandler");
+        System.out.println();
+        System.out.println("  The classpath must include both the Thinlet class and the handler class (if");
+        System.out.println("  given on the commandline) as well as thinlet.jar.");
+        System.out.println("  The specified Thinlet class and Handler class must have a default");
+        System.out.println("  constructor.");
+        System.out.println();
+        System.exit(1);
+    }
+
+
+    private static void run() throws Throwable
+    {
+        // create Thinlet instance
+        Class thinletClass = Class.forName(thinletClassname);
+        Object thinlet = thinletClass.newInstance();
+
+        if(!Thinlet.class.isInstance(thinlet))
+        {
+            System.err.println("error: " + thinletClassname + " is not a Thinlet class.");
+            System.exit(2);
+        }
+
+        System.out.println("using thinlet class: " + thinletClass.getName());
+
+        // create Handler instance
+        Object handler = thinlet;
+        if(handlerClassname != null)
+        {
+            Class handlerClass = Class.forName(handlerClassname);
+            handler = handlerClass.newInstance();
+            System.out.println("using handler class: " + handlerClass.getName());
+        }
+
+        InputStream is = getInputStream(file);
+        System.out.println("parsing file " + file + " ...");
+
+        // "Object result = thinlet.parse(is, handler);"
+        Method parseMethod = thinletClass.getMethod("parse", new Class[] { InputStream.class, Object.class });
+        Object result;
+        try
+        {
+            result = parseMethod.invoke(thinlet, new Object[] { is, handler });
+        }
+        catch(InvocationTargetException e)
+        {
+            throw e.getTargetException();
+        }
+
+        // "thinlet.add(result);"
+        Method addMethod = thinletClass.getMethod("add", new Class[] { Object.class });
+        try
+        {
+            addMethod.invoke(thinlet, new Object[] { result });
+        }
+        catch(InvocationTargetException e)
+        {
+            throw e.getTargetException();
+        }
+
+        System.out.println("showing frame...");
+
+        /*FrameLauncher frame = new FrameLauncher("ThinletTester", null, (Thinlet)thinlet, 400, 400, false);
+        frame.pack();
+        frame.setVisible(true);
+*/
+        System.out.println("done.");
+    }
+
+
+    private static InputStream getInputStream(String filename) throws Exception
+    {
+        return new BufferedInputStream(new FileInputStream(filename));
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ColorChooser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ColorChooser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/ColorChooser.java	(revision 1126)
@@ -0,0 +1,207 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.awt.Color;
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+
+/**
+ * A Thinlet color chooser dialog.
+ *
+ * <p>
+ * The dialog is modal and blocks the calling frame/dialog. It is therefore
+ * displayed in a separate window.
+ *
+ * @author Dirk Moebius
+ */
+public class ColorChooser
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private ThinletDialog dialog;
+    private Thinlet thinlet;
+    private Color selectedColor;
+
+    // components
+    private Object sl_red, sl_green, sl_blue;
+    private Object sb_red, sb_green, sb_blue;
+    private Object tf_hue, tf_saturation, tf_brightness;
+    private Object pb_hue, pb_saturation, pb_brightness;
+    private Object rgb_label;
+
+
+    public ColorChooser(Frame owner, String title)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init();
+    }
+
+
+    public ColorChooser(Dialog owner, String title)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init();
+    }
+
+
+    private void init()
+    {
+        thinlet = new AntiAliasedThinlet();
+
+        try
+        {
+            Object panel = thinlet.parse("/thinletcommons/colorchooser.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing colorchooser.xml", e);
+        }
+
+        dialog.setContent(thinlet);
+    }
+
+
+    /**
+     * Show the modal dialog.
+     * This halts the application until the user dismisses the dialog.
+     */
+    public void show()
+    {
+        if(debug()) log.fine("in show");
+        dialog.pack();
+        dialog.setResizable(false);
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+    }
+
+
+    public void setSelectedColor(Color color)
+    {
+        int red = 0, green = 0, blue = 0;
+        if(color != null)
+        {
+            red = color.getRed();
+            green = color.getGreen();
+            blue = color.getBlue();
+            thinlet.setInteger(sl_red, "value", red);
+            thinlet.setInteger(sl_green, "value", green);
+            thinlet.setInteger(sl_blue, "value", blue);
+            thinlet.setString(sb_red, "text", String.valueOf(red));
+            thinlet.setString(sb_green, "text", String.valueOf(green));
+            thinlet.setString(sb_blue, "text", String.valueOf(blue));
+            hsbChanged();
+        }
+    }
+
+
+    public Color getSelectedColor()
+    {
+        return selectedColor;
+    }
+
+
+    //{{{ callbacks for colorchooser.xml
+    /** Thinlet callback. */
+    public void init(Object sl_red, Object sl_green, Object sl_blue,
+        Object sb_red, Object sb_green, Object sb_blue,
+        Object tf_hue, Object tf_saturation, Object tf_brightness,
+        Object pb_hue, Object pb_saturation, Object pb_brightness,
+        Object rgb_label)
+    {
+        if(debug()) log.fine("in init");
+        this.sl_red = sl_red;
+        this.sl_green = sl_green;
+        this.sl_blue = sl_blue;
+        this.sb_red = sb_red;
+        this.sb_green = sb_green;
+        this.sb_blue = sb_blue;
+        this.tf_hue = tf_hue;
+        this.tf_saturation = tf_saturation;
+        this.tf_brightness = tf_brightness;
+        this.pb_hue = pb_hue;
+        this.pb_saturation = pb_saturation;
+        this.pb_brightness = pb_brightness;
+        this.rgb_label = rgb_label;
+    }
+
+
+    /** Thinlet callback. */
+    public void sliderChanged(int value, Object spinbox)
+    {
+        thinlet.setString(spinbox, "text", String.valueOf(value));
+        hsbChanged();
+    }
+
+
+    /** Thinlet callback. */
+    public void spinboxChanged(String text, Object slider)
+    {
+        try
+        {
+            int value = Integer.parseInt(text);
+            if(value >= 0 && value <= 255)
+            {
+                thinlet.setInteger(slider, "value", value);
+                hsbChanged();
+            }
+        }
+        catch (NumberFormatException ignore)
+        {
+        }
+    }
+
+
+    /** Thinlet callback. */
+    public void ok()
+    {
+        int red = thinlet.getInteger(sl_red, "value");
+        int green = thinlet.getInteger(sl_green, "value");
+        int blue = thinlet.getInteger(sl_blue, "value");
+        this.selectedColor = new Color(red, green, blue);
+        dialog.setVisible(false);
+    }
+
+
+    /** Thinlet callback. */
+    public void close()
+    {
+        dialog.setVisible(false);
+    }
+    //}}}
+
+
+    //{{{ private methods
+    private void hsbChanged()
+    {
+        int red = thinlet.getInteger(sl_red, "value");
+        int green = thinlet.getInteger(sl_green, "value");
+        int blue = thinlet.getInteger(sl_blue, "value");
+
+        float[] hsb = Color.RGBtoHSB(red, green, blue, null);
+
+        thinlet.setColor(rgb_label, "background", new Color(red, green, blue));
+        thinlet.setString(tf_hue, "text", String.valueOf(hsb[0]));
+        thinlet.setString(tf_saturation, "text", String.valueOf(hsb[1]));
+        thinlet.setString(tf_brightness, "text", String.valueOf(hsb[2]));
+
+        thinlet.setInteger(pb_hue, "value", (int) (100f * hsb[0]));
+        thinlet.setInteger(pb_saturation, "value", (int) (100f * hsb[1]));
+        thinlet.setInteger(pb_brightness, "value", (int) (100f * hsb[2]));
+    }
+    //}}}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/DirChooser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/DirChooser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/DirChooser.java	(revision 1126)
@@ -0,0 +1,315 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.text.Collator;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Stack;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.filechooser.FileSystemView;
+
+import thinlet.Thinlet;
+
+
+/**
+ * A Thinlet directory chooser dialog.
+ *
+ * <p>
+ * The dialog is modal and blocks the calling frame/dialog. It is therefore
+ * displayed in a separate window.
+ *
+ * <p>
+ * <b>TODO:</b>
+ * <ul>
+ *   <li>Button "Create directory"</li>
+ * </ul>
+ *
+ * <p>
+ * <b>Implementation note:</b> This implementation uses
+ * <code>javax.swing.filechooser.FileSystemView</code>, because it provides
+ * directory information that looks more "native". This introduces a dependency
+ * on Swing, but since ThinG requires JDK 1.4, Swing should be there anyway.
+ * Only a minimal set of Swing classes is loaded while using
+ * <code>javax.swing.filechooser.FileSystemView</code>; alas, the loading
+ * of <code>javax.swing.UIManager</code> and <code>javax.swing.LookAndFeel</code>
+ * can <i>not</i> be avoided, although no Swing beans are actually used.
+ *
+ * @author Dirk Moebius
+ */
+public class DirChooser
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    private ThinletDialog dialog;
+    private Thinlet thinlet;
+    private File selectedDir;
+    private File expandDir;
+    private boolean isInitialized = false;
+    private FileSystemView fsv = FileSystemView.getFileSystemView();
+
+
+    public DirChooser(Frame owner, String title)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init();
+    }
+
+
+    public DirChooser(Dialog owner, String title)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init();
+    }
+
+
+    private void init()
+    {
+        thinlet = new AntiAliasedThinlet();
+
+        try
+        {
+            Object panel = thinlet.parse("/thinletcommons/dirchooser.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing dirchooser.xml", e);
+        }
+
+        dialog.setContent(thinlet);
+    }
+
+
+    /**
+     * Show the modal dialog.
+     * This halts the application until the user dismisses the dialog.
+     */
+    public void show()
+    {
+        selectedDir = null;
+        if(expandDir != null)
+        {
+            expandTreeTo(expandDir);
+            expandDir = null;
+        }
+        dialog.pack();
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+    }
+
+
+    public void setSelectedDirectory(File dir)
+    {
+        this.expandDir = dir;
+    }
+
+
+    public File getSelectedDirectory()
+    {
+        return selectedDir;
+    }
+
+
+    //{{{ callbacks for dirchooser.xml
+    /** Thinlet callback. */
+    public void init(Object tree)
+    {
+        if(debug()) log.fine("in init()");
+        if(!isInitialized)
+        {
+            addFiles(fsv.getRoots(), tree);
+            isInitialized = true;
+        }
+    }
+
+
+    /** Thinlet callback. */
+    public void ok(Object tree)
+    {
+        Object node = thinlet.getSelectedItem(tree);
+        if(node != null)
+            selectedDir = (File) thinlet.getProperty(node, "file");
+        close();
+    }
+
+
+    /** Thinlet callback. */
+    public void close()
+    {
+        dialog.setVisible(false);
+    }
+
+
+    /** Thinlet callback. */
+    public void nodeExpanded(Object tree, Object node)
+    {
+        File file = (File) thinlet.getProperty(node, "file");
+        // remove all existing nodes below the selected node (including
+        // dummy placeholder nodes)
+        thinlet.removeAll(node);
+        // re-add subdirectory nodes below current node
+        File[] files = fsv.getFiles(file, false);
+        addFiles(files, node);
+    }
+    //}}}
+
+
+    //{{{ private methods
+    private void addFiles(File[] files, Object parent)
+    {
+        sort(files);
+
+        for(int i = 0; i < files.length; ++i)
+        {
+            File file = files[i];
+            if(fsv.isTraversable(file).booleanValue())
+            {
+                // it's  directory; create a node for it
+                Object node = createNode(file);
+                thinlet.setBoolean(node, "expanded", false);
+                thinlet.add(parent, node);
+
+                // create a placeholder node for the (possible) children of
+                // the directory
+                Object placeholder = Thinlet.create("node");
+                thinlet.setBoolean(placeholder, "expanded", false);
+                thinlet.setString(placeholder, "text", "#Placeholder#");
+                thinlet.add(node, placeholder);
+                //thinlet.putProperty(node, "hasDummyChild", Boolean.TRUE);
+            }
+        }
+    }
+
+
+    private Object createNode(File file)
+    {
+        Object node = Thinlet.create("node");
+        thinlet.setString(node, "text", fsv.getSystemDisplayName(file));
+
+        Icon icon = fsv.getSystemIcon(file);
+        if(icon != null)
+            thinlet.setIcon(node, "icon", convertIconToImage(thinlet, icon));
+
+        thinlet.putProperty(node, "file", file);
+        return node;
+    }
+
+
+    private void sort(File[] files)
+    {
+        if(files.length == 0)
+            return;
+
+        // don't sort if first file is a special (non-disc) file
+        File firstFile = files[0];
+        if(fsv.isComputerNode(firstFile) || fsv.isDrive(firstFile)
+            || fsv.isFileSystemRoot(firstFile) || fsv.isFloppyDrive(firstFile)
+            || fsv.isRoot(firstFile))
+            return;
+
+        Arrays.sort(files, new Comparator()
+        {
+            private  Collator collator = Collator.getInstance();
+
+            public int compare(Object obj1, Object obj2)
+            {
+                return collator.compare(
+                    fsv.getSystemDisplayName((File)obj1),
+                    fsv.getSystemDisplayName((File)obj2)
+                );
+            }
+
+            public boolean equals(Object other)
+            {
+                // unused
+                return false;
+            }
+        });
+    }
+
+
+    private void expandTreeTo(File file)
+    {
+        Stack stack = new Stack();
+        stack.push(file);
+        File root = null;
+        File parent = file;
+
+        // find root, fill stack
+        do
+        {
+            parent = fsv.getParentDirectory(parent);
+            if(parent != null)
+            {
+                stack.push(parent);
+                root = parent;
+            }
+        } while(parent != null);
+
+        if(root == null)
+        {
+            log.warning("cannot expand to directory '" + file + "' because parent not found!");
+            return;
+        }
+
+        Object tree = thinlet.find("tree");
+        _expandTreeTo(tree, stack);
+    }
+
+
+    private void _expandTreeTo(Object node, Stack stack)
+    {
+        File currentDir = (File) stack.pop();
+        Object[] nodes = thinlet.getItems(node);
+        boolean found = false;
+
+        for(int i = 0; i < nodes.length; ++i)
+        {
+            Object subnode = nodes[i];
+
+            File file = (File) thinlet.getProperty(subnode, "file");
+            if(!found && file.equals(currentDir))
+            {
+                thinlet.removeAll(subnode);
+                File[] subfiles = fsv.getFiles(file, false);
+                addFiles(subfiles, subnode);
+                if(stack.empty())
+                    thinlet.setBoolean(subnode, "selected", true);
+                else
+                {
+                    thinlet.setBoolean(subnode, "expanded", true);
+                    _expandTreeTo(subnode, stack);
+                    found = true;
+                }
+            }
+        }
+    }
+
+
+    private static Image convertIconToImage(Thinlet thinlet, Icon icon)
+    {
+        BufferedImage image = new BufferedImage(icon.getIconWidth(),
+            icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
+        icon.paintIcon(thinlet, image.getGraphics(), 0, 0);
+        return image;
+    }
+    //}}}
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FileChooser.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FileChooser.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/FileChooser.java	(revision 1126)
@@ -0,0 +1,618 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.text.Collator;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.filechooser.FileSystemView;
+
+import thinlet.Thinlet;
+
+
+/**
+ * A Thinlet file chooser dialog.
+ *
+ * <p>
+ * The dialog is modal and blocks the calling frame/dialog. It is therefore
+ * displayed in a separate window.
+ *
+ * <p>
+ * <b>TODO:</b>
+ * <ul>
+ *   <li>For mode OPEN: multiple selection</li>
+ *   <li>Button "Create directory"</li>
+ * </ul>
+ *
+ * <p>
+ * <b>Implementation note:</b> This implementation uses
+ * <code>javax.swing.filechooser.FileSystemView</code>, because it provides
+ * directory information that looks more "native". This introduces a dependency
+ * on Swing, but since ThinG requires JDK 1.4, Swing should be there anyway.
+ * Only a minimal set of Swing classes is loaded while using
+ * <code>javax.swing.filechooser.FileSystemView</code>; alas, the loading
+ * of <code>javax.swing.UIManager</code> and <code>javax.swing.LookAndFeel</code>
+ * can <i>not</i> be avoided, although no Swing beans are actually used.
+ *
+ * @author Dirk Moebius
+ */
+public class FileChooser
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    public static final int MODE_OPEN = 0;
+    public static final int MODE_SAVE = 1;
+
+    private static final FileSystemView fsv = FileSystemView.getFileSystemView();
+    private static final DecimalFormat decimalFormat = new DecimalFormat("#,##0.0");
+    private static final DecimalFormat integerFormat = new DecimalFormat("###,###,###,###,###,###,###,###,###,###");
+    private static final DateFormat dateFormat = DateFormat.getInstance();
+
+    private ThinletDialog dialog;
+    private Thinlet thinlet;
+    private File selectedFile;
+    private File showFile;
+    private File currentDir;
+    private int mode;
+    private boolean showHiddenFiles = false;
+    private int sortColumn = 0;
+    private boolean sortAscending = true;
+    private FileFilter[] filters;
+    private FileFilter selectedFilter;
+
+    // components
+    private Object cbPath, bUp, bShowHidden, tbFilelist, tFilename, bOk, cbFilter;
+
+
+    public FileChooser(Frame owner, String title, int mode)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        this.mode = mode;
+        init();
+    }
+
+
+    public FileChooser(Dialog owner, String title, int mode)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        this.mode = mode;
+        init();
+    }
+
+
+    private void init()
+    {
+        thinlet = new AntiAliasedThinlet();
+
+        try
+        {
+            Object panel = thinlet.parse("/thinletcommons/filechooser.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing filechooser.xml", e);
+        }
+
+        tbFilelist = thinlet.find("tbFilelist");
+        cbPath = thinlet.find("cbPath");
+        bUp = thinlet.find("bUp");
+        bShowHidden = thinlet.find("bShowHidden");
+        bOk = thinlet.find("bOk");
+        tFilename = thinlet.find("tFilename");
+        cbFilter = thinlet.find("cbFilter");
+
+        dialog.setContent(thinlet);
+    }
+
+
+    /**
+     * Show the modal dialog.
+     * This halts the application until the user dismisses the dialog.
+     */
+    public void show()
+    {
+        selectedFile = null;
+
+        setupFileFilters();
+
+        if(showFile == null || !showFile.exists())
+            showFile = fsv.getHomeDirectory();
+        addFiles(showFile);
+        showFile = null;
+
+        thinlet.setString(thinlet.find("bOk"), "text", mode == MODE_OPEN ? "Open" : "Save");
+        thinlet.setBoolean(thinlet.find("bShowHidden"), "selected", showHiddenFiles);
+        thinlet.requestFocus(thinlet.find("tbFilelist"));
+
+        dialog.pack();
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+    }
+
+
+    public void setSelectedFile(File file)
+    {
+        this.showFile = file;
+    }
+
+
+    public File getSelectedFile()
+    {
+        return selectedFile;
+    }
+
+
+    public void setShowHiddenFiles(boolean showHiddenFiles)
+    {
+        this.showHiddenFiles = showHiddenFiles;
+    }
+
+
+    public boolean getShowHiddenFiles()
+    {
+        return showHiddenFiles;
+    }
+
+
+    /**
+     * Set the list of choosable file filters.
+     * <p>
+     * This replaces the default filter "All files", so care must be taken to
+     * include an all file filter in the list, if you don't want the "All files"
+     * filter to be removed.
+     * <p>
+     * To restore the "All files" filter and remove all custom filter, call
+     * this method with argument <code>null</code>.
+     *
+     * @param filters  the list of choosable file filters, or <code>null</code>.
+     */
+    public void setFileFilters(FileFilter[] filters)
+    {
+        this.filters = filters;
+    }
+
+
+    public FileFilter getSelectedFileFilter()
+    {
+        return selectedFilter;
+    }
+
+
+    //{{{ callbacks for filechooser.xml
+    /** Thinlet callback. */
+    public void ok()
+    {
+        String filename = thinlet.getString(tFilename, "text");
+        if(filename == null || filename.trim().length() == 0)
+            new MessageDialog(dialog, "No selection", "Please select a file.").show();
+        else
+        {
+            File file = new File(currentDir, filename);
+            if(fsv.isTraversable(file).booleanValue())
+                addFiles(file);
+            else
+            {
+                selectedFile = file;
+                close();
+            }
+        }
+    }
+
+
+    /** Thinlet callback. */
+    public void close()
+    {
+        dialog.setVisible(false);
+    }
+
+
+    /** Thinlet callback. */
+    public void goUp()
+    {
+        if(currentDir != null)
+        {
+            File parent = fsv.getParentDirectory(currentDir);
+            if(parent != null)
+                addFiles(parent);
+        }
+    }
+
+
+    /** Thinlet callback. */
+    public void goHome()
+    {
+        // Workaround: FileSystemView.getHomeDirectory() returns wrong directory
+        // on Windows; using system property "user.home" instead:
+        //File home = fsv.getHomeDirectory();
+        File home = new File(System.getProperty("user.home"));
+        addFiles(home);
+    }
+
+
+    /** Thinlet callback. */
+    public void toggleShowHiddenFiles(boolean showHidden)
+    {
+        this.showHiddenFiles = showHidden;
+        addFiles(currentDir);
+    }
+
+
+    /** Thinlet callback. */
+    public void tableRowDoubleClicked()
+    {
+        File file = getSelectedTableRowFile();
+        if(file != null && fsv.isTraversable(file).booleanValue())
+            addFiles(file);
+        else
+        {
+            selectedFile = file;
+            close();
+        }
+    }
+
+
+    /** Thinlet callback. */
+    public void tableRowSelected()
+    {
+        thinlet.setString(tFilename, "text", getSelectedTableRowFilename());
+    }
+
+
+    /** Thinlet callback. */
+    public void tableHeaderChanged(Object colName, Object colType, Object colSize, Object colMod)
+    {
+        final Object[] column = { colName, colType, colSize, colMod };
+        for(int i = 0; i < column.length; ++i)
+        {
+            String sort = thinlet.getChoice(column[i], "sort");
+            if(!sort.equals("none"))
+            {
+                this.sortColumn = i;
+                this.sortAscending = sort.equals("ascent");
+                break;
+            }
+        }
+        addFiles(currentDir);
+    }
+
+
+    /** Thinlet callback. */
+    public void cbPathChanged()
+    {
+        Object item = thinlet.getSelectedItem(cbPath);
+        if(item != null)
+        {
+            File dir = (File) thinlet.getProperty(item, "file");
+            addFiles(dir);
+        }
+    }
+
+
+    /** Thinlet callback. */
+    public void cbFilterChanged(int index)
+    {
+        if(filters != null)
+        {
+            selectedFilter = filters[index];
+            addFiles(currentDir);
+        }
+    }
+    //}}}
+
+
+    //{{{ private methods
+    private void addFiles(File file)
+    {
+        currentDir = file;
+        if(fsv.isTraversable(file).booleanValue())
+            thinlet.setString(tFilename, "text", "");
+        else
+        {
+            thinlet.setString(tFilename, "text", fsv.getSystemDisplayName(file));
+            currentDir = fsv.getParentDirectory(file);
+        }
+
+        // fill table
+        File[] files = fsv.getFiles(currentDir, false);
+        sort(files, sortColumn, sortAscending);
+        thinlet.removeAll(tbFilelist);
+        for(int i = 0; i < files.length; ++i)
+            if(acceptFile(files[i]))
+                thinlet.add(tbFilelist, createTableRow(files[i]));
+
+        // fill path combobox
+        thinlet.removeAll(cbPath);
+        File dir = currentDir;
+        while(dir != null)
+        {
+            Object item = Thinlet.create("choice");
+            thinlet.setString(item, "text", fsv.getSystemDisplayName(dir));
+            thinlet.putProperty(item, "file", dir);
+            setFileIcon(item, dir);
+            thinlet.add(cbPath, item, 0);
+            dir = fsv.getParentDirectory(dir);
+        }
+        thinlet.setInteger(cbPath, "selected", thinlet.getCount(cbPath) - 1);
+
+        // configure "Up" button
+        thinlet.setBoolean(bUp, "enabled", fsv.getParentDirectory(currentDir) != null);
+    }
+
+
+    private boolean acceptFile(File file)
+    {
+        // don't show hidden files
+        if(!showHiddenFiles && fsv.isHiddenFile(file)) return false;
+        // always show directories
+        if(fsv.isTraversable(file).booleanValue()) return true;
+        // "All files" filter accepts all
+        if(selectedFilter == null) return true;
+        // Use selected file filter
+        return selectedFilter.accept(file);
+    }
+
+
+    private void setupFileFilters()
+    {
+        thinlet.removeAll(cbFilter);
+        if(filters == null)
+        {
+            addFileFilter("All files (*.*)");
+            selectedFilter = null;
+        }
+        else
+        {
+            for(int i = 0; i < filters.length; ++i)
+                addFileFilter(filters[i].getDescription());
+            selectedFilter = filters[0];
+        }
+        thinlet.setInteger(cbFilter, "selected", 0);
+    }
+
+
+    private void addFileFilter(String description)
+    {
+        Object choice = Thinlet.create("choice");
+        thinlet.setString(choice, "text", description);
+        thinlet.add(cbFilter, choice);
+    }
+
+
+    private Object createTableRow(File file)
+    {
+        Object row = Thinlet.create("row");
+        Object cellName = Thinlet.create("cell");
+        Object cellType = Thinlet.create("cell");
+        Object cellSize = Thinlet.create("cell");
+        Object cellMod = Thinlet.create("cell");
+        thinlet.add(row, cellName);
+        thinlet.add(row, cellType);
+        thinlet.add(row, cellSize);
+        thinlet.add(row, cellMod);
+        thinlet.setString(cellName, "text", fsv.getSystemDisplayName(file));
+        thinlet.setString(cellType, "text", formatTypeString(file));
+        thinlet.setString(cellMod, "text", formatDateString(file.lastModified()));
+        thinlet.setString(cellSize, "text", fsv.isTraversable(file).booleanValue() ? "" : formatByteString(file.length()));
+        thinlet.setChoice(cellSize, "alignment", "right");
+        setFileIcon(cellName, file);
+        thinlet.putProperty(row, "file", file);
+        return row;
+    }
+
+
+    private static void sort(File[] files, int sortColumn, boolean sortAscending)
+    {
+        if(files.length == 0)
+            return;
+
+        // don't sort if first file is a special (non-disc) file
+        File firstFile = files[0];
+        if(fsv.isComputerNode(firstFile) || fsv.isDrive(firstFile)
+            || fsv.isFileSystemRoot(firstFile) || fsv.isFloppyDrive(firstFile)
+            || fsv.isRoot(firstFile))
+            return;
+
+        Arrays.sort(files, new FileComparator(sortColumn, sortAscending));
+    }
+
+
+    private File getSelectedTableRowFile()
+    {
+        Object row = thinlet.getSelectedItem(tbFilelist);
+        if(row != null)
+            return (File) thinlet.getProperty(row, "file");
+        else
+            return null;
+    }
+
+
+    private String getSelectedTableRowFilename()
+    {
+        File file = getSelectedTableRowFile();
+        if(file != null)
+            return fsv.getSystemDisplayName(file);
+        else
+            return "";
+    }
+
+
+    private void setFileIcon(Object component, File file)
+    {
+        Icon icon = fsv.getSystemIcon(file);
+        if(icon != null)
+            thinlet.setIcon(component, "icon", convertIconToImage(thinlet, icon));
+    }
+
+
+    private static String formatTypeString(File file)
+    {
+        String desc = fsv.getSystemTypeDescription(file);
+        if(desc == null || desc.length() == 0)
+        {
+            if(fsv.isComputerNode(file))
+                desc = "Computer";
+            else if(fsv.isDrive(file))
+                desc = "Disk";
+            else if(fsv.isFloppyDrive(file))
+                desc = "Floppy";
+            else if(fsv.isTraversable(file).booleanValue())
+                desc = "Directory";
+            else
+                desc = "Unknown";
+        }
+        return desc;
+    }
+
+
+    private static String formatByteString(long size)
+    {
+        double d = size;
+        int magnitude = 0;
+        for(; d >= 1024.0; ++magnitude)
+            d = d / 1024.0;
+        switch(magnitude)
+        {
+            case 1: return decimalFormat.format(d) + " KB";
+            case 2: return decimalFormat.format(d) + " MB";
+            case 3: return decimalFormat.format(d) + " GB";
+            case 4: return decimalFormat.format(d) + " TB";
+            default: return integerFormat.format(size);
+        }
+    }
+
+
+    private static String formatDateString(long date)
+    {
+        return dateFormat.format(new Date(date));
+    }
+
+
+    private static Image convertIconToImage(Thinlet thinlet, Icon icon)
+    {
+        BufferedImage image = new BufferedImage(icon.getIconWidth(),
+            icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
+        icon.paintIcon(thinlet, image.getGraphics(), 0, 0);
+        return image;
+    }
+    //}}}
+
+
+    //{{{ inner class FileComparator
+    /** A comparator for files and directories. */
+    private static class FileComparator implements Comparator
+    {
+        private Collator collator = Collator.getInstance();
+        private int sortColumn;
+        private boolean sortAscending;
+
+        public FileComparator(int sortColumn, boolean sortAscending)
+        {
+            this.sortColumn = sortColumn;
+            this.sortAscending = sortAscending;
+        }
+
+        /**
+         * Compares the two objects assuming they are files (or
+         * directories). Directories are always sorted before files.
+         */
+        public int compare(Object obj1, Object obj2)
+        {
+            File f1 = (File) obj1;
+            File f2 = (File) obj2;
+            boolean f1Traversable = fsv.isTraversable(f1).booleanValue();
+            boolean f2Traversable = fsv.isTraversable(f2).booleanValue();
+
+            if(f1Traversable && !f2Traversable)
+                return sortAscending ? Integer.MIN_VALUE : Integer.MAX_VALUE;
+            else if(!f1Traversable && f2Traversable)
+                return sortAscending ? Integer.MAX_VALUE : Integer.MIN_VALUE;
+            else
+            {
+                int retval = 0;
+                switch(sortColumn)
+                {
+                    case 0: // Column "Name"
+                        retval = collator.compare(
+                            fsv.getSystemDisplayName(f1),
+                            fsv.getSystemDisplayName(f2));
+                        break;
+                    case 1: // Column "Type"
+                        retval = collator.compare(
+                            fsv.getSystemTypeDescription(f1),
+                            fsv.getSystemTypeDescription(f2));
+                        break;
+                    case 2: // Column "Size"
+                        retval = f1.length() > f2.length() ? 1
+                            : f1.length() < f2.length() ? -1 : 0;
+                        break;
+                    case 3: // Column "Last Modified"
+                        retval = f1.lastModified() > f2.lastModified() ? 1
+                            : f1.lastModified() < f2.lastModified() ? -1 : 0;
+                        break;
+                    default:
+                        throw new IllegalArgumentException("unexpected column: " + sortColumn);
+                }
+
+                if(retval == 0 && sortColumn != 0)
+                    retval = collator.compare(
+                        fsv.getSystemDisplayName(f1),
+                        fsv.getSystemDisplayName(f2));
+
+                return sortAscending ? retval : (-1 * retval);
+            }
+        }
+
+        /** not used; returns false. */
+        public boolean equals(Object other)
+        {
+            return false;
+        }
+    }
+    //}}}
+
+
+    /**
+     * Test method.
+     */
+    public static void main(String[] args)
+    {
+        FileChooser chooser = new FileChooser(new Frame(), "Choose File...", FileChooser.MODE_OPEN);
+        if(args.length > 0)
+            chooser.setSelectedFile(new File(args[0]));
+        chooser.setFileFilters(new FileFilter[]
+        {
+            new ExtensionFileFilter("xml", "XML files (*.xml)"),
+            new ExtensionFileFilter("java", "Java source code (*.java)"),
+            new FileFilter()
+            {
+                public boolean accept(File file) { return true; }
+                public String getDescription() { return "All files (*.*)"; }
+            }
+        });
+        chooser.show();
+        System.out.println("File selected: " + chooser.getSelectedFile());
+        System.exit(0);
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/MessageDialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/MessageDialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/MessageDialog.java	(revision 1126)
@@ -0,0 +1,262 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.awt.BorderLayout;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.Image;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+import utils.AWTUtils;
+
+
+/**
+ * A Thinlet message dialog with configurable OK/CANCEL/YES/NO-Buttons.
+ *
+ * <p>
+ * The dialog is modal and blocks the calling frame/dialog. It is therefore
+ * displayed in a separate window.
+ *
+ * <p>
+ * <b>TODO:</b>
+ * <ul>
+ *   <li>make message type configurable (ERROR/WARN/INFO)</li>
+ * </ul>
+ *
+ * @author Dirk Moebius
+ */
+public class MessageDialog
+{
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    public static final int MODE_OK = 0;
+    public static final int MODE_OK_CANCEL = 1;
+    public static final int MODE_YES_NO = 2;
+    public static final int MODE_YES_NO_CANCEL = 3;
+
+    public static final int ACTION_OK = 0;
+    public static final int ACTION_CANCEL = 1;
+    public static final int ACTION_YES = 2;
+    public static final int ACTION_NO = 3;
+
+
+    private Thinlet thinlet;
+    private ThinletDialog dialog;
+    private String msg;
+    private Image icon;
+    private int mode;
+    private int returnValue;
+
+
+    /**
+     * Show a simple message dialog with an "Ok" button.
+     */
+    public MessageDialog(Dialog owner, String title, String msg)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, null, MODE_OK);
+    }
+
+
+    /**
+     * Show a simple message dialog with an "Ok" button and a custom icon.
+     */
+    public MessageDialog(Dialog owner, String title, Image icon, String msg)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, icon, MODE_OK);
+    }
+
+
+    /**
+     * Show a simple message dialog with an "Ok" button.
+     */
+    public MessageDialog(Frame owner, String title, String msg)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, null, MODE_OK);
+    }
+
+
+    /**
+     * Show a simple message dialog with an "Ok" button and a custom icon.
+     */
+    public MessageDialog(Frame owner, String title, Image icon, String msg)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, icon, MODE_OK);
+    }
+
+
+    public MessageDialog(Dialog owner, String title, String msg, int mode)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, null, mode);
+    }
+
+
+    public MessageDialog(Dialog owner, String title, Image icon, String msg, int mode)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, icon, mode);
+    }
+
+
+    public MessageDialog(Frame owner, String title, String msg, int mode)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, null, mode);
+    }
+
+
+    public MessageDialog(Frame owner, String title, Image icon, String msg, int mode)
+    {
+        this.dialog = new ThinletDialog(owner, title);
+        init(msg, icon, mode);
+    }
+
+
+    private void init(String msg, Image icon, int mode)
+    {
+        this.thinlet = new AntiAliasedThinlet();
+        this.msg = msg;
+        this.mode = mode;
+        this.icon = icon;
+
+        try
+        {
+            Object panel = thinlet.parse("/thinletcommons/messagedialog.xml", this);
+            thinlet.add(panel);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Error parsing messagedialog.xml", e);
+        }
+
+        this.dialog.setContent(thinlet);
+    }
+
+
+    /**
+     * Show the modal message dialog.
+     * This halts the application until the user dismisses the dialog.
+     *
+     * @return the action selected by user; one of {@link #ACTION_OK},
+     *     {@link #ACTION_CANCEL}, {@link #ACTION_YES} or {@link #ACTION_NO}.
+     */
+    public int show()
+    {
+        try
+        {
+            Dimension dim = AWTUtils.getBounds(msg, dialog);
+            if(debug()) log.fine("msg width=" + dim.getWidth() + " height=" + dim.getHeight());
+            Object message = thinlet.find("message");
+            thinlet.setInteger(message, "width", (int)dim.getWidth() + 30);
+            thinlet.setInteger(message, "height", (int)dim.getHeight() + 30);
+        }
+        catch(Exception e)
+        {
+            log.log(Level.SEVERE, "Exception getting bounds", e);
+        }
+
+        returnValue = ACTION_CANCEL;
+
+        dialog.pack();
+        dialog.setLocationRelativeTo(dialog.getOwner());
+        dialog.setVisible(true);
+
+        return returnValue;
+    }
+
+
+    //{{{ callback methods for messagedialog.xml
+    /** Thinlet callback. */
+    public void init(Object iconLabel, Object textarea, Object button1, Object button2, Object button3)
+    {
+        thinlet.setString(textarea, "text", this.msg);
+
+        if(this.icon != null)
+            thinlet.setIcon(iconLabel, "icon", this.icon);
+
+        final Object defaultButton;
+
+        switch(this.mode)
+        {
+            case MODE_OK:
+                hideButton(button1);
+                hideButton(button2);
+                showButton(button3, "cancel", "Ok", 0, "ok.gif", ACTION_OK);
+                defaultButton = button3;
+                break;
+            case MODE_OK_CANCEL:
+                hideButton(button1);
+                showButton(button2, "default", "Ok", 0, "ok.gif", ACTION_OK);
+                showButton(button3, "cancel", "Cancel", 0, "cancel.gif", ACTION_CANCEL);
+                defaultButton = button3;
+                break;
+            case MODE_YES_NO:
+                hideButton(button1);
+                showButton(button2, "normal", "Yes", 0, "ok.gif", ACTION_YES);
+                showButton(button3, "normal", "No", 0, "cancel.gif", ACTION_NO);
+                defaultButton = button3;
+                break;
+            case MODE_YES_NO_CANCEL:
+                showButton(button1, "normal", "Yes", 0, "ok.gif", ACTION_YES);
+                showButton(button2, "normal", "No", 0, "cancel.gif", ACTION_NO);
+                showButton(button3, "cancel", "Cancel", 0, null, ACTION_CANCEL);
+                defaultButton = button3;
+                break;
+            default:
+                throw new IllegalArgumentException("illegal message dialog mode: " + this.mode);
+        }
+
+        EventQueue.invokeLater(new Runnable()
+        {
+            public void run()
+            {
+                thinlet.requestFocus(defaultButton);
+            }
+        });
+    }
+
+
+    /** Thinlet callback. */
+    public void buttonPressed(Object button)
+    {
+        returnValue = Integer.parseInt((String)thinlet.getProperty(button, "action"));
+        dialog.setVisible(false);
+    }
+    //}}}
+
+
+    private void hideButton(Object button)
+    {
+        thinlet.setBoolean(button, "visible", false);
+        thinlet.setChoice(button, "type", "normal");
+    }
+
+
+    private void showButton(Object button, String type, String text, int mnemonic, String icon, int action)
+    {
+        thinlet.setChoice(button, "type", type);
+        thinlet.setString(button, "text", text);
+        thinlet.setInteger(button, "mnemonic", mnemonic);
+        if(icon != null)
+            thinlet.setIcon(button, "icon", AWTUtils.getIcon(dialog, "/thinletcommons/icons/" + icon));
+        thinlet.putProperty(button, "action", Integer.toString(action));
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/AntiAliasedThinlet.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/AntiAliasedThinlet.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/AntiAliasedThinlet.java	(revision 1126)
@@ -0,0 +1,39 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+
+
+/**
+ * A <code>Thinlet</code> component that is painted with anti-aliased fonts
+ * and lines.
+ *
+ * @author Dirk Moebius
+ */
+public class AntiAliasedThinlet extends LoggingThinlet
+{
+
+    public AntiAliasedThinlet()
+    {
+        super();
+    }
+
+
+    public void paint(Graphics g)
+    {
+        ((Graphics2D) g).setRenderingHint(
+            RenderingHints.KEY_ANTIALIASING,
+            RenderingHints.VALUE_ANTIALIAS_ON);
+        ((Graphics2D) g).setRenderingHint(
+            RenderingHints.KEY_TEXT_ANTIALIASING,
+            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        super.paint(g);
+    }
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/fontchooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/fontchooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/fontchooser.xml	(revision 1126)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel bottom="12" columns="3" gap="10" left="12" right="12" top="12" weightx="1" weighty="1" init="init(fontlist)">
+    <label colspan="3" for="fontlist" text="Font:" mnemonic="0" valign="bottom"/>
+    <list action="fontChanged(this, fontsize, cb_bold, cb_italic, preview, b_ok)" line="false" name="fontlist" rowspan="3" weightx="4" weighty="4"/>
+    <label for="fontsize" text="Size:" mnemonic="0" />
+    <spinbox action="fontChanged(fontlist, this, cb_bold, cb_italic, preview, b_ok)" maximum="200" minimum="0" name="fontsize" perform="fontChanged(fontlist, this, cb_bold, cb_italic, preview, b_ok)" text="12" weightx="0"/>
+    <panel/>
+    <checkbox action="fontChanged(fontlist, fontsize, this, cb_italic, preview, b_ok)" mnemonic="0" name="cb_bold" text="Bold"/>
+    <panel/>
+    <checkbox action="fontChanged(fontlist, fontsize, cb_bold, this, preview, b_ok)" mnemonic="0" name="cb_italic" text="Italic" valign="top"/>
+    <panel border="true" bottom="5" colspan="3" left="3" right="3" text="Preview" top="5" weightx="1" weighty="1">
+        <textarea border="false" editable="false" end="35" height="30" name="preview" start="35" text="The quick brown fox jumps over the lazy dog." weightx="1" weighty="1" width="100" wrap="true"/>
+    </panel>
+    <panel colspan="3" gap="10" halign="right" weightx="1">
+        <button action="ok(fontlist, fontsize, cb_bold, cb_italic)" icon="/thinletcommons/icons/ok.gif" enabled="false" mnemonic="0" name="b_ok" text="Ok" type="default"/>
+        <button action="close()" icon="/thinletcommons/icons/cancel.gif" mnemonic="0" name="b_cancel" text="Cancel" type="cancel"/>
+    </panel>
+</panel>
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/package.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/package.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/package.html	(revision 1126)
@@ -0,0 +1,17 @@
+<body>
+<p>
+This package contains some common gui widgets such as a directory chooser,
+a font chooser, a generic message dialog box etc.
+</p>
+
+<p>
+All widgets are Thinlet widgets.
+</p>
+
+<p>
+Note that the <code>thinletcommons</code> package does not depend on the
+<code>thing</code> package, so these widgets could be used in other
+applications.
+</p>
+</body>
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/LoggingThinlet.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/LoggingThinlet.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/LoggingThinlet.java	(revision 1126)
@@ -0,0 +1,47 @@
+// jEdit settings:
+// :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1:
+
+package thinletcommons;
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import thinlet.Thinlet;
+
+
+/**
+ * A <code>Thinlet</code> component that logs exceptions to the JDK logging
+ * facility.
+ *
+ * @author Dirk Moebius
+ */
+public class LoggingThinlet extends Thinlet
+{
+
+    //{{{ logging
+    private static final Logger log = Logger.getLogger("thinletcommons");
+    private static final boolean debug() { return log.isLoggable(Level.FINE); }
+    //}}}
+
+
+    public LoggingThinlet()
+    {
+        super();
+    }
+
+
+    /**
+     * Log exceptions to a logger named "thinletcommons" with log level SEVERE.
+     *
+     * @param throwable the thrown exception by the bussiness logic
+     */
+    protected void handleException(Throwable throwable)
+    {
+        log.log(Level.SEVERE, "Exception in business logic", throwable);
+        //throw new RuntimeException("Exception in business logic", throwable);
+    }
+
+
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/colorchooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/colorchooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/colorchooser.xml	(revision 1126)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: -->
+
+<panel columns="3" top="10" left="10" right="10" bottom="10" gap="4" init="init(sl_red, sl_green, sl_blue, sb_red, sb_green, sb_blue, tf_hue, tf_saturation, tf_brightness, pb_hue, pb_saturation, pb_brightness, rgb_label)">
+	<label text="Red, green, and blue values" colspan="3" />
+
+	<label text="Red:" alignment="right" for="sb_red" mnemonic="0" />
+	<slider name="sl_red" minimum="0" maximum="255" valign="center" action="sliderChanged(this.value, sb_red)" />
+	<spinbox name="sb_red" minimum="0" maximum="255" text="0" columns="3" action="spinboxChanged(this.text, sl_red)" />
+
+	<label text="Green:" alignment="right" for="sb_green" mnemonic="0" />
+	<slider name="sl_green" minimum="0" maximum="255" valign="center" action="sliderChanged(this.value, sb_green)" />
+	<spinbox name="sb_green" minimum="0" maximum="255" text="0" columns="3" action="spinboxChanged(this.text, sl_green)" />
+
+	<label text="Blue:" alignment="right" for="sb_blue" mnemonic="0" />
+	<slider name="sl_blue" minimum="0" maximum="255" valign="center" action="sliderChanged(this.value, sb_blue)" />
+	<spinbox name="sb_blue" minimum="0" maximum="255" text="0" columns="3" action="spinboxChanged(this.text, sl_blue)" />
+
+	<separator colspan="3" />
+
+	<label text="Hue, saturation, and brightness values" colspan="3" />
+
+	<label text="Hue:" alignment="right" />
+	<textfield name="tf_hue" text="0.0" editable="false" />
+	<progressbar name="pb_hue" valign="center" />
+
+	<label text="Saturation:" alignment="right" />
+	<textfield name="tf_saturation" text="0.0" editable="false" />
+	<progressbar name="pb_saturation" valign="center" />
+
+	<label text="Brightness:" alignment="right" />
+	<textfield name="tf_brightness" text="0.0" editable="false" />
+	<progressbar name="pb_brightness" valign="center" />
+
+	<separator colspan="3"/>
+
+	<label colspan="3" name="rgb_label" valign="fill" weighty="1" background="#000000" text="ThinG!" font="40 bold italic" alignment="center"/>
+
+    <panel colspan="3" gap="10" halign="right" top="12" weightx="1">
+        <button action="ok()" icon="/thinletcommons/icons/ok.gif" mnemonic="0" name="b_ok" text="Ok" type="default"/>
+        <button action="close()" icon="/thinletcommons/icons/cancel.gif" mnemonic="0" name="b_cancel" text="Cancel" type="cancel"/>
+    </panel>
+
+</panel>
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/dirchooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/dirchooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/dirchooser.xml	(revision 1126)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: -->
+
+<panel
+	columns="1"
+	gap="6"
+	top="6"
+	left="6"
+	right="6"
+	bottom="6"
+	width="300"
+	height="400"
+	init="init(tree)"
+>
+	<tree
+		name="tree"
+		angle="true"
+		line="false"
+		weightx="1"
+		weighty="1"
+		perform="ok(this)"
+		expand="nodeExpanded(this, item)"
+	/>
+	<panel gap="6" top="12" weightx="1">
+		<panel weightx="1"/>
+		<button name="ok" text="Ok" icon="/thinletcommons/icons/ok.gif" mnemonic="0" type="default" action="ok(tree)"/>
+		<button name="cancel" text="Cancel" icon="/thinletcommons/icons/cancel.gif" mnemonic="0" type="cancel" action="close()"/>
+	</panel>
+</panel>
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/filechooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/filechooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/java/thinletcommons/filechooser.xml	(revision 1126)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel bottom="12" columns="1" gap="12" left="12" right="12" top="12" weightx="1" weighty="1">
+    <panel gap="6" weightx="1">
+        <label for="cbPath" mnemonic="0" text="Look In:"/>
+        <combobox action="cbPathChanged()" editable="false" name="cbPath" weightx="1"/>
+        <button action="goUp()" icon="/thinletcommons/icons/up.gif" name="bUp" tooltip="Go to parent directory"/>
+        <button action="goHome()" icon="/thinletcommons/icons/home.gif" name="bHome" tooltip="Go to home directory"/>
+        <togglebutton action="toggleShowHiddenFiles(this.selected)" icon="/thinletcommons/icons/hidden_files.gif" name="bShowHidden" tooltip="Toggle display of hidden files."/>
+    </panel>
+
+    <table action="tableRowSelected()" height="300" line="false" name="tbFilelist" perform="tableRowDoubleClicked()" weightx="1" weighty="1" width="420">
+        <header action="tableHeaderChanged(colName, colType, colSize, colMod)">
+            <column name="colName" sort="ascent" text="Name" width="170"/>
+            <column name="colType" text="Type" width="140"/>
+            <column name="colSize" text="Size" width="80"/>
+            <column name="colMod" text="Last Modified" width="120"/>
+        </header>
+    </table>
+
+    <panel columns="4" gap="6">
+        <label for="tFilename" mnemonic="0" text="File name:"/>
+        <textfield name="tFilename" perform="ok()" weightx="1"/>
+
+        <!-- some free space between filename field and ok/cancel buttons -->
+        <panel left="12" rowspan="2"/>
+
+        <button action="ok()" icon="/thinletcommons/icons/ok.gif" mnemonic="0" name="bOk" text="Ok" type="default"/>
+        <label for="cbFilter" halign="right" mnemonic="1" text="Filter:"/>
+        <combobox action="cbFilterChanged(this.selected)" editable="false" name="cbFilter" weightx="1"/>
+        <button action="close()" icon="/thinletcommons/icons/cancel.gif" mnemonic="0" name="bCancel" text="Cancel" type="cancel"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/javadoc/overview.html
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/javadoc/overview.html	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/javadoc/overview.html	(revision 1126)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>org.gvsig.scripting package documentation</title>
+</head>
+<body>
+
+	<p>TODO: Example library overview.</p>
+	
+	<p>See the <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html#overviewcomment">Javadoc Tool documentation about the overview file</a></p>
+
+</body>
+</html>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/README.txt	(revision 1126)
@@ -0,0 +1,7 @@
+Put into this folder the resources needed by your library classes.
+
+This folder is added to the runtime classpath, so you can load any resources 
+through the ClassLoader.
+
+By default, into this folder you can find some examples of resource bundle 
+property files that may be used by your library classes.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/thing_small.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/thing_small.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/up.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/up.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/cancel.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/cancel.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/home.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/home.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/ok.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/ok.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/thing.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/thing.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/inform.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/inform.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/hidden_files.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thinletcommons/icons/hidden_files.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/settings.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/settings.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/settings.xml	(revision 1126)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel border="true" bottom="12" columns="2" gap="20" left="12" right="12" top="12" weightx="1" weighty="1">
+    <label icon="icons/thing.gif" rowspan="3" valign="top"/>
+    <panel border="true" bottom="6" font="bold" gap="6" left="6" right="6" text="Icons" top="6">
+        <label for="tIconpath" mnemonic="0" text="Icon Path:"/>
+        <textfield name="tIconpath" weightx="1"/>
+        <button action="chooseDir(tIconpath, tIconpath.text)" name="bChoose" text="..." tooltip="Choose directory"/>
+    </panel>
+    <panel border="true" bottom="6" columns="3" font="bold" gap="6" left="6" right="6" text="XML Output" top="6" weightx="1" weighty="1">
+        <label for="rbIndentSpace" mnemonic="1" text="Indent Char:"/>
+        <checkbox group="indentChar" halign="left" name="rbIndentSpace" selected="true" text="Space"/>
+        <checkbox group="indentChar" halign="left" name="rbIndentTab" text="Tab"/>
+        <label for="spIndentSize" mnemonic="7" text="Indent Size:"/>
+        <spinbox colspan="2" end="1" halign="left" maximum="100" minimum="1" name="spIndentSize" start="1" text="4"/>
+        <label for="tCustomHeader" mnemonic="7" text="Custom Header:" valign="top"/>
+        <textarea colspan="3" height="80" name="tCustomHeader" weightx="1" weighty="1" width="300"/>
+    </panel>
+    <panel gap="6" halign="right" weightx="1">
+        <button action="ok(tIconpath.text, spIndentSize.text, rbIndentSpace.selected, rbIndentTab.selected, tCustomHeader.text)" icon="icons/ok.gif" mnemonic="0" name="bOk" text="Ok" valign="bottom" weighty="1"/>
+        <button action="close()" icon="icons/cancel.gif" mnemonic="0" name="bCancel" text="Cancel" type="cancel" valign="bottom" weighty="1"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/version.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/version.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/version.properties	(revision 1126)
@@ -0,0 +1,3 @@
+# ThinG version number
+version=0.1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/generator.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/generator.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/generator.properties	(revision 1126)
@@ -0,0 +1,142 @@
+# jEdit settings:
+# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1:
+#
+# Templates for the ThinG Generator.
+#
+# Important:
+# When changing any of the templates, please keep in mind:
+# - leading whitespace must be enclosed in quotes '...'
+# - brackets '{' and '}' must be enclosed in quotes unless they denote a parameter
+# - end-of-lines are always denoted with '\n'. The generator may change this
+#   into the OS specific line separator such as '\r\n' on Windows or '\r' on Mac.
+
+
+# 0: current date (java.util.Date instance)
+file.header.firstline=\
+	// Generated by ThinG on {0,date} {0,time}.\n\
+	\n
+
+
+# 0: "<package-spec>", e.g. "foo.bar.baz"
+file.header.package=\
+	package {0};\n\
+	\n
+
+
+# 0: additional import statement, e.g. "import thinlet.FrameLauncher;" or ""
+# 1: JavaDoc comment
+file.header=\
+	import thinlet.Thinlet;\n\
+	{0}\
+	\n\
+	\n\
+	/**\n\
+	' '* {1}\n\
+	' '*/\n
+
+
+file.footer=\
+	'}'\n
+
+
+# 0: "<classname>"
+# 1: "[ extends Thinlet]"
+# 2: "[ implements <interfacename>]"
+handler.signature=\
+	public class {0}{1}{2}\n\
+	'{'\n
+
+
+# 0: "<interfacename>"
+interface.signature=\
+	public interface {0}\n\
+	'{'\n
+
+
+# 0: "<classname>"
+# 1: "<thinlet-filename>"
+class.asThinlet.constructor=\
+	\n\
+	'    '/**\n\
+	'     '* Create a new {0} instance.\n\
+	'     '*/\n\
+	'    'public {0}() throws java.io.IOException\n\
+	'    {'\n\
+	'        'add(parse("{1}"));\n\
+	'    }'\n\
+	\n
+
+
+# 0: JavaDoc comment for the method.
+method.javadoc.header=\
+	\n\
+	'    '/**\n\
+	'     '* {0}\n
+
+
+method.javadoc.param.intro=\
+	'     '*\n
+
+
+# 1: "<parameter-name>"
+# 2: JavaDoc comment for the parameter
+method.javadoc.param=\
+	'     '* @param {0} {1}\n
+
+
+method.javadoc.footer=\
+	'     '*/\n
+
+
+# 0: full method signature, e.g. "mymethod(String param1, int param2)"
+method.body.interface=\
+	'    'public void {0};\n\
+	\n
+
+
+# 0: full method signature, e.g. "mymethod(String param1, int param2)"
+method.body.handler=\
+	'    'public void {0}\n\
+	'    {'\n\
+	'    }'\n\
+	\n
+
+
+# 0: "<classname>"
+main.asThinlet=\
+	\n\
+	'    '/**\n\
+	'     '* Show a test frame with the Thinlet contents.\n\
+	'     '*\n\
+	'     '* @param args  ignored.\n\
+	'     '*/\n\
+	'    'public static void main(String[] args) throws java.io.IOException\n\
+	'    {'\n\
+	'        'new FrameLauncher("{0}", new {0}(), 400, 400);\n\
+	'    }'\n\
+	\n
+
+
+# 0: "<classname>"
+# 1: "<thinlet-filename>"
+main.notAsThinlet=\
+	\n\
+	'    '/**\n\
+	'     '* Show a test frame with the Thinlet contents.\n\
+	'     '*\n\
+	'     '* @param args  ignored.\n\
+	'     '*/\n\
+	'    'public static void main(String[] args) throws java.io.IOException\n\
+	'    {'\n\
+	'        'class MyThinlet extends Thinlet\n\
+	'        {'\n\
+	'            'public MyThinlet() throws java.io.IOException\n\
+	'            {'\n\
+	'                'add(parse("{1}", new {0}()));\n\
+	'            }'\n\
+	'        };'\n\
+	'        'new FrameLauncher("{0}", new MyThinlet(), 400, 400);\n\
+	'    }'\n\
+	\n
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/componentchooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/componentchooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/componentchooser.xml	(revision 1126)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel bottom="12" columns="1" left="12" right="12" top="12" weightx="1" weighty="1">
+    <list colspan="2" name="list" line="false" weightx="1" weighty="1" action="selectionChanged(this, lSelected)" perform="close()"/>
+    <panel gap="6" top="12" weightx="1">
+        <label text="Selected:"/>
+        <label name="lSelected" text="null"/>
+        <panel weightx="1"/>
+        <button name="bOk" text="Ok" icon="icons/ok.gif" mnemonic="0" type="default" action="ok()"/>
+        <button name="bCancel" text="Cancel" icon="icons/cancel.gif" mnemonic="0" type="cancel" action="close()"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/thing.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/thing.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/thing.xml	(revision 1126)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: -->
+
+<panel columns="1" gap="4">
+
+	<menubar weightx="1">
+		<menu text="File" mnemonic="0">
+			<menuitem text="New" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl N" action="menu_file_new()"/>
+			<menuitem text="Open..." mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl O" action="menu_file_open()"/>
+			<separator/>
+			<menuitem text="Reload" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl R" action="menu_file_reload()"/>
+			<separator/>
+			<menuitem text="Save" mnemonic="0" icon="icons/empty_menu.gif" accelerator="ctrl S" action="menu_file_save()"/>
+			<menuitem text="Save As..." mnemonic="5" icon="icons/empty_menu.gif" action="menu_file_save_as()"/>
+			<separator/>
+			<menuitem text="Exit" mnemonic="0" icon="icons/empty_menu.gif" accelerator="alt F4" action="menu_file_exit()"/>
+		</menu>
+		<menu text="Edit" mnemonic="0">
+			<menuitem text="Cut" name="menu_edit_cut" mnemonic="0" accelerator="ctrl X" icon="icons/edit_cut.gif" action="menu_edit_cut()"/>
+			<menuitem text="Copy" name="menu_edit_copy" mnemonic="1" accelerator="ctrl C" icon="icons/edit_copy.gif" action="menu_edit_copy()"/>
+			<menuitem text="Paste" name="menu_edit_paste" mnemonic="0" accelerator="ctrl V" icon="icons/edit_paste.gif" action="menu_edit_paste()"/>
+			<menuitem text="Paste from system clipboard" name="menu_edit_paste_systemcb" mnemonic="1" accelerator="ctrl shift V" icon="icons/empty_menu.gif" action="menu_edit_paste_systemcb()"/>
+			<menuitem text="Delete" name="menu_edit_delete" mnemonic="0" icon="icons/edit_delete.gif" action="menu_edit_delete()"/>
+			<separator/>
+			<menuitem text="Settings..." mnemonic="0" icon="icons/empty_menu.gif" action="menu_edit_settings()"/>
+		</menu>
+		<menu text="Tools" mnemonic="0">
+			<menuitem text="Generate Handler Stub Source..." name="menu_tools_generate" mnemonic="0" accelerator="ctrl G" icon="icons/empty_menu.gif" action="menu_tools_generate()"/>
+		</menu>
+		<menu text="Help" mnemonic="0">
+			<menuitem text="About Thing..." mnemonic="0" icon="icons/thing_small.gif" action="menu_help_about()"/>
+		</menu>
+	</menubar>
+
+	<panel name="toolbar" weightx="1" gap="-1">
+
+		<!-- top level components -->
+		<button name="tb_add_panel" property="classname=panel" icon="icons/panel.gif" tooltip="Create new panel" action="addComponent(this)"/>
+		<button name="tb_add_dialog" property="classname=dialog" icon="icons/dialog.gif" tooltip="Create new dialog" action="addComponent(this)"/>
+		<button name="tb_add_desktop" property="classname=desktop" icon="icons/desktop.gif" tooltip="Create new desktop" action="addComponent(this)"/>
+		<button name="tb_add_splitpane" property="classname=splitpane" icon="icons/splitpane.gif" tooltip="Create new splitpane" action="addComponent(this)"/>
+		<button name="tb_add_tabbedpane" property="classname=tabbedpane" icon="icons/tabbedpane.gif" tooltip="Create new tabbedpane" action="addComponent(this)"/>
+
+		<!-- menu components -->
+		<button name="tb_add_menubar" property="classname=menubar" icon="icons/menubar.gif" tooltip="Create new menubar" action="addComponent(this)"/>
+		<button name="tb_add_menu" property="classname=menu" icon="icons/menu.gif" tooltip="Create new menu" action="addComponent(this)"/>
+		<button name="tb_add_menuitem" property="classname=menuitem" icon="icons/menuitem.gif" tooltip="Create new menuitem" action="addComponent(this)"/>
+		<button name="tb_add_checkboxmenuitem" property="classname=checkboxmenuitem" icon="icons/checkboxmenuitem.gif" tooltip="Create new checkboxmenuitem" action="addComponent(this)"/>
+
+		<!-- components -->
+		<button name="tb_add_label" property="classname=label" icon="icons/label.gif" tooltip="Create new label" action="addComponent(this)"/>
+		<button name="tb_add_button" property="classname=button" icon="icons/button.gif" tooltip="Create new button" action="addComponent(this)"/>
+		<button name="tb_add_togglebutton" property="classname=togglebutton" icon="icons/togglebutton.gif" tooltip="Create new togglebutton" action="addComponent(this)"/>
+		<button name="tb_add_checkbox" property="classname=checkbox" icon="icons/checkbox.gif" tooltip="Create new checkbox" action="addComponent(this)"/>
+		<button name="tb_add_textfield" property="classname=textfield" icon="icons/textfield.gif" tooltip="Create new textfield" action="addComponent(this)"/>
+		<button name="tb_add_combobox" property="classname=combobox" icon="icons/combobox.gif" tooltip="Create new combobox" action="addComponent(this)"/>
+		<button name="tb_add_passwordfield" property="classname=passwordfield" icon="icons/passwordfield.gif" tooltip="Create new passwordfield" action="addComponent(this)"/>
+		<button name="tb_add_spinbox" property="classname=spinbox" icon="icons/spinbox.gif" tooltip="Create new spinbox" action="addComponent(this)"/>
+		<button name="tb_add_progressbar" property="classname=progressbar" icon="icons/progressbar.gif" tooltip="Create new progressbar" action="addComponent(this)"/>
+		<button name="tb_add_slider" property="classname=slider" icon="icons/slider.gif" tooltip="Create new slider" action="addComponent(this)"/>
+		<button name="tb_add_separator" property="classname=separator" icon="icons/separator.gif" tooltip="Create new separator" action="addComponent(this)"/>
+		<button name="tb_add_list" property="classname=list" icon="icons/list.gif" tooltip="Create new list" action="addComponent(this)"/>
+		<button name="tb_add_table" property="classname=table" icon="icons/table.gif" tooltip="Create new table" action="addComponent(this)"/>
+		<button name="tb_add_textarea" property="classname=textarea" icon="icons/textarea.gif" tooltip="Create new textarea" action="addComponent(this)"/>
+		<button name="tb_add_tree" property="classname=tree" icon="icons/tree.gif" tooltip="Create new tree" action="addComponent(this)"/>
+
+		<!-- list items -->
+		<button name="tb_add_choice" property="classname=choice" icon="icons/choice.gif" tooltip="Create new choice" action="addComponent(this)"/>
+		<button name="tb_add_item" property="classname=item" icon="icons/item.gif" tooltip="Create new item" action="addComponent(this)"/>
+		<button name="tb_add_node" property="classname=node" icon="icons/node.gif" tooltip="Create new node" action="addComponent(this)"/>
+		<button name="tb_add_tab" property="classname=tab" icon="icons/tab.gif" tooltip="Create new tab" action="addComponent(this)"/>
+
+		<!-- table components -->
+		<button name="tb_add_row" property="classname=row" icon="icons/row.gif" tooltip="Create new row" action="addComponent(this)"/>
+		<button name="tb_add_cell" property="classname=cell" icon="icons/cell.gif" tooltip="Create new cell" action="addComponent(this)"/>
+		<button name="tb_add_header" property="classname=header" icon="icons/header.gif" tooltip="Create new header" action="addComponent(this)"/>
+		<button name="tb_add_column" property="classname=column" icon="icons/column.gif" tooltip="Create new column" action="addComponent(this)"/>
+
+		<!-- other -->
+		<button name="tb_add_popupmenu" property="classname=popupmenu" icon="icons/popupmenu.gif" tooltip="Create new popupmenu" action="addComponent(this)"/>
+
+		<!-- later -->
+		<!--
+		<button name="tb_add_bean" property="classname=bean" icon="icons/bean.gif" tooltip="Create new bean" action="addComponent(this)" enabled="false"/>
+		-->
+
+		<!-- placeholder in case there are no buttons add all -->
+		<separator height="30" width="1"/>
+	</panel>
+
+	<!-- main workarea -->
+	<panel left="4" right="4" weightx="1" weighty="1">
+		<splitpane orientation="horizontal" divider="200" weightx="1" weighty="1">
+
+			<!-- left splitpane: component tree and properties table -->
+			<splitpane orientation="vertical">
+				<panel columns="1" weightx="1" weighty="1">
+					<tree name="tree" angle="true" line="false" selection="single" weightx="1" weighty="1" action="treeSelectionChanged()"/>
+					<panel top="3" bottom="3" gap="2" scrollable="true">
+						<button name="tb_edit_copy" icon="icons/edit_copy.gif" tooltip="Copy selected component to internal ThinG clipboard and system clipboard" action="menu_edit_copy()"/>
+						<button name="tb_edit_cut" icon="icons/edit_cut.gif" tooltip="Cut selected component to internal ThinG clipboard and system clipboard" action="menu_edit_cut()"/>
+						<button name="tb_edit_paste" icon="icons/edit_paste.gif" tooltip="Paste component from internal ThinG clipboard below selected component" action="menu_edit_paste()"/>
+						<button name="tb_edit_delete" icon="icons/edit_delete.gif" tooltip="Remove selected component" action="menu_edit_delete()"/>
+						<separator/>
+						<button name="tb_edit_moveup" icon="icons/edit_moveup.gif" tooltip="Move selected component up" action="moveComponentUp()"/>
+						<button name="tb_edit_movedown" icon="icons/edit_movedown.gif" tooltip="Move selected component down" action="moveComponentDown()"/>
+					</panel>
+				</panel>
+				<panel columns="1" gap="5">
+					<table name="props" selection="single" weightx="1" weighty="1" action="tableSelectionChanged()">
+						<header>
+							<column name="props_key" text="Property" width="80" sort="ascent"/>
+							<column name="props_value" text="Value"/>
+						</header>
+					</table>
+					<panel name="propedit" columns="3" gap="5" weightx="1" border="true" top="5" left="5" bottom="5" right="5">
+						<label name="propedit_name" text=""/>
+						<panel name="propedit_panel" gap="5" weightx="1"/>
+						<button name="propedit_reset" text="Reset" tooltip="Reset to default value" font="10" valign="center" enabled="false" action="propEditReset()"/>
+					</panel>
+				</panel>
+			</splitpane>
+
+			<!-- right splitpane: preview panel -->
+			<tabbedpane name="tabs" placement="top" selected="1" action="tabSelected(this.selected)">
+				<!-- Attention: because of an obscure bug in Thinlet.getNextFocusable(), -->
+				<!-- the tab "XML" must be the first one! If it is not the first panel, Thinlet -->
+				<!-- runs into an endless loop when the user navigates from the "Preview" tab -->
+				<!-- to the "XML" tab, trying to set the next focusable component. -->
+				<tab text="XML" mnemonic="0">
+					<panel weightx="1" weighty="1">
+						<textarea name="serialize" editable="false" weightx="1" weighty="1"/>
+					</panel>
+				</tab>
+				<tab text="Preview" mnemonic="0">
+					<panel name="preview" border="true" scrollable="true" weightx="1" weighty="1"/>
+				</tab>
+			</tabbedpane>
+
+		</splitpane>
+	</panel>
+
+	<!-- status bar at bottom -->
+	<textfield name="statusbar" editable="false" text="ThinG" weightx="1"/>
+
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/generate.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/generate.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/generate.xml	(revision 1126)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel columns="1"
+    bottom="12" left="12" right="12" top="12" gap="12"
+    init="init(cbGenerateInterface, cbGenerateHandler, cbGenerateAsThinlet, cbGenerateMain, tInterfaceName, tHandlerName, tPackageName, tOutputDir, tPreview, bOk)"
+    weightx="1" weighty="1"
+>
+    <panel border="true" bottom="6" columns="3" font=" bold" gap="6" left="6" right="6" text="Generate" top="6" weightx="1">
+        <checkbox action="checkboxChanged(this)" mnemonic="0" name="cbGenerateInterface" text="Interface for Handler class" weightx="1"/>
+        <label for="tInterfaceName" mnemonic="1" text="Interface Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tInterfaceName" weightx="4"/>
+        <checkbox action="checkboxChanged(this)" mnemonic="0" name="cbGenerateHandler" selected="true" text="Handler class" weightx="1"/>
+        <label for="tHandlerName" mnemonic="1" text="Class Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tHandlerName" weightx="4"/>
+        <panel/>
+        <label for="tPackageName" mnemonic="0" text="Package Name:"/>
+        <textfield perform="textfieldChanged(this)" name="tPackageName" weightx="4"/>
+        <panel colspan="3" gap="6" weightx="1">
+            <label for="tOutputDir" mnemonic="7" text="Output Directory:"/>
+            <textfield name="tOutputDir" weightx="1"/>
+            <button action="buttonOutputDirClicked()" text="..." tooltip="Select Output Directory"/>
+        </panel>
+    </panel>
+    <panel border="true" bottom="6" columns="1" font=" bold" gap="6" left="6" right="6" text="Handler Options" top="6">
+        <checkbox action="checkboxChanged(this)" mnemonic="13" name="cbGenerateAsThinlet" text="Handler is a Thinlet"/>
+        <checkbox action="checkboxChanged(this)" mnemonic="9" name="cbGenerateMain" text="Generate main()"/>
+    </panel>
+    <panel border="true" bottom="6" font=" bold" gap="6" left="6" right="6" text="Preview" top="6" weightx="1" weighty="1">
+        <textarea editable="false" font="Monospaced 11" name="tPreview" weightx="1" weighty="1"/>
+    </panel>
+    <panel gap="6" halign="right" weightx="1">
+        <button action="ok()" icon="icons/ok.gif" mnemonic="0" name="bOk" text="Ok" valign="bottom" weighty="1"/>
+        <button action="close()" icon="icons/cancel.gif" mnemonic="0" name="bCancel" text="Cancel" type="cancel" valign="bottom" weighty="1"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_moveup.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_moveup.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/spinbox.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/spinbox.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/menuitem.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/menuitem.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/checkbox.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/checkbox.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/table.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/table.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/progressbar.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/progressbar.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/checkboxmenuitem.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/checkboxmenuitem.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/choice.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/choice.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/column.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/column.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/splitpane.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/splitpane.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/tree.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/tree.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_cut.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_cut.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_movedown.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_movedown.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/menu.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/menu.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/passwordfield.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/passwordfield.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_delete.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_delete.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/row.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/row.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/combobox.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/combobox.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/list.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/list.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/textarea.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/textarea.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/togglebutton.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/togglebutton.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/label.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/label.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/componentchooser.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/componentchooser.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/componentchooser.xml	(revision 1126)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- jEdit settings: :tabSize=4:indentSize=4:noTabs=true:folding=explicit:collapseFolds=1: -->
+
+<panel bottom="12" columns="1" left="12" right="12" top="12" weightx="1" weighty="1">
+    <list colspan="2" name="list" line="false" weightx="1" weighty="1" action="selectionChanged(this, lSelected)" perform="close()"/>
+    <panel gap="6" top="12" weightx="1">
+        <label text="Selected:"/>
+        <label name="lSelected" text="null"/>
+        <panel weightx="1"/>
+        <button name="bOk" text="Ok" icon="icons/ok.gif" mnemonic="0" type="default" action="ok()"/>
+        <button name="bCancel" text="Cancel" icon="icons/cancel.gif" mnemonic="0" type="cancel" action="close()"/>
+    </panel>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_paste.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_paste.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/empty_menu.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/empty_menu.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/slider.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/slider.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/tabbedpane.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/tabbedpane.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/cancel.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/cancel.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/node.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/node.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/textfield.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/textfield.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/header.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/header.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/popupmenu.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/popupmenu.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/menubar.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/menubar.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/empty.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/empty.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/item.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/item.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/dialog.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/dialog.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/panel.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/panel.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/separator.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/separator.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/thing_small.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/thing_small.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/bean.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/bean.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/tab.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/tab.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/desktop.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/desktop.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/ok.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/ok.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/thing.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/thing.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/button.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/button.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/cell.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/cell.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_copy.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/src/main/resources/thing/icons/edit_copy.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing/pom.xml	(revision 1126)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.gvsig.scripting.thing</artifactId>
+	<packaging>jar</packaging>
+	<name>${project.artifactId}</name>
+	<parent>
+		<groupId>org.gvsig</groupId>
+		<artifactId>org.gvsig.scripting</artifactId>
+		<version>2.3.75</version>
+	</parent>
+	<dependencies>
+		<dependency>
+			<groupId>net.sourceforge.thinlet</groupId>
+			<artifactId>thinlet</artifactId>
+			<scope>compile</scope>
+		</dependency>
+	</dependencies>
+</project>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.thing
___________________________________________________________________
Added: svn:ignore
   + .classpath
.project
target
.settings


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/buildNumber.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/buildNumber.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/buildNumber.properties	(revision 1126)
@@ -0,0 +1,2 @@
+#Sat Oct 05 19:31:13 CEST 2019
+buildNumber=155
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml	(revision 1126)
@@ -0,0 +1,188 @@
+<assembly>
+  <id>gvsig-plugin-package</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <baseDirectory>${project.artifactId}</baseDirectory>
+  <includeBaseDirectory>true</includeBaseDirectory>
+  <files>
+    <file>
+      <source>target/${project.artifactId}-${project.version}.jar</source>
+      <outputDirectory>lib</outputDirectory>
+    </file>
+    <file>
+      <source>target/package.info</source>
+    </file>
+  </files>
+
+  <fileSets>
+    <fileSet>
+      <directory>src/main/resources-plugin</directory>
+      <outputDirectory>.</outputDirectory>
+    </fileSet>
+        <fileSet>
+            <directory>target/abeille</directory>
+            <outputDirectory>.</outputDirectory>
+        </fileSet>
+  </fileSets>
+
+  <dependencySets>
+
+    <dependencySet>
+      <useProjectArtifact>false</useProjectArtifact>
+      <useTransitiveDependencies>false</useTransitiveDependencies>
+      <outputDirectory>lib</outputDirectory>
+      <includes>
+        <!--
+            Plugin libraries
+        -->  
+        <include>org.ini4j:ini4j</include>
+        <include>net.sourceforge.thinlet:thinlet</include>
+        <include>org.gvsig:org.gvsig.scripting.thing</include>
+        <include>org.gvsig:org.gvsig.scripting.lib.api</include>
+        <include>org.gvsig:org.gvsig.scripting.swing.api</include>
+        <include>org.gvsig:org.gvsig.scripting.lib.impl</include>
+        <include>org.gvsig:org.gvsig.scripting.swing.impl</include>
+        <include>org.apache.tika:tika-core</include>        
+        
+        <!--
+            Utility libraries
+        -->
+        <!-- JOpenDocument -->    
+        <include>org.jopendocument:jOpenDocument</include>
+        
+        <!-- CSSBox webbrowser -->
+        <include>net.sf.cssbox:cssbox</include>
+        <include>net.sf.cssbox:swingbox</include>
+        <include>net.sf.cssbox:jstyleparser</include>
+        <include>net.sourceforge.nekohtml:nekohtml</include>
+        <include>org.antlr:antlr-runtime</include>
+                                
+        <!--
+            Script engines libraries
+        -->
+
+        <include>org.codehaus.groovy:groovy-all</include>
+
+        <!--
+        <include>org.renjin:renjin-script-engine:jar:jar-with-dependencies</include>
+        -->
+        
+        <include>org.python:${jython.artifactId}</include>
+        <include>com.github.tbekolay.jnumeric:jnumeric</include>
+        
+        <!--
+        JRuby doesn't work by default on gvSIG, maybe the problems are
+        related to the PluginClassLoader or to the way JRuby sets its
+        internal classpath, so maybe setting the system property
+        "org.jruby.embed.class.path" may solve the problem.
+        See:
+        http://kenai.com/projects/jruby/pages/RedBridge#Class_Path_%28Load_Path%29
+        <include>org.jruby:jruby</include>
+        -->
+
+        <!--
+            Scala doesn't work. When try to run a scala script show the message:
+            Failed to initialize compiler: object scala in compiler mirror not found.
+            ** Note that as of 2.8 scala does not assume use of the java classpath.
+            ** For the old behavior pass -usejavacp to scala, or if using a Settings
+            ** object programmatically, settings.usejavacp.value = true.
+        
+ 
+        <include>org.scala-lang:scala-dist</include>
+        <include>org.scala-lang:scala-compiler</include>
+        <include>org.scala-lang:scala-library</include>
+        <include>org.scala-lang:scala-reflect</include>
+        <include>org.scala-lang:scalap</include>
+        -->
+        <!--
+        <include>jline:jline</include>
+        -->
+
+      </includes>
+    </dependencySet>
+
+    <dependencySet>
+      <useProjectArtifact>false</useProjectArtifact>
+      <useTransitiveDependencies>true</useTransitiveDependencies>
+      <outputDirectory>lib</outputDirectory>
+      <includes>
+        <!--
+            JGit support runtime libraries
+        -->        
+        <include>org.eclipse.jgit:org.eclipse.jgit</include>
+        <include>com.jcraft:jsch</include>
+        <include>com.googlecode.javaewah:JavaEWAH</include>
+        <include>org.apache.httpcomponents:httpclient</include>
+        <include>org.apache.httpcomponents:httpcore</include>
+      </includes>
+    </dependencySet>
+
+    <dependencySet>
+      <useProjectArtifact>false</useProjectArtifact>
+      <useTransitiveDependencies>true</useTransitiveDependencies>
+      <outputDirectory>lib</outputDirectory>
+      <includes>
+        <!--
+            ICEPDF support runtime libraries
+        -->        
+        <include>org.icepdf.os:icepdf-viewer</include>
+        <include>org.icepdf.os:icepdf-core</include>
+      </includes>
+    </dependencySet>
+
+    <dependencySet>
+      <useProjectArtifact>false</useProjectArtifact>
+      <useTransitiveDependencies>true</useTransitiveDependencies>
+      <outputDirectory>lib</outputDirectory>
+      <includes>
+        <!--
+            flexmark-java, Markdown support libreries
+        -->        
+        <include>com.vladsch.flexmark:flexmark-all</include>
+        <include>com.vladsch.flexmark:flexmark</include>
+        <include>com.vladsch.flexmark:flexmark-ext-abbreviation</include>
+        <include>com.vladsch.flexmark:flexmark-ext-anchorlink</include>
+        <include>com.vladsch.flexmark:flexmark-ext-aside</include>
+        <include>com.vladsch.flexmark:flexmark-ext-autolink</include>
+        <include>org.nibor.autolink:autolink</include>
+        <include>com.vladsch.flexmark:flexmark-ext-definition</include>
+        <include>com.vladsch.flexmark:flexmark-ext-emoji</include>
+        <include>com.vladsch.flexmark:flexmark-ext-escaped-character</include>
+        <include>com.vladsch.flexmark:flexmark-ext-footnotes</include>
+        <include>com.vladsch.flexmark:flexmark-ext-gfm-issues</include>
+        <include>com.vladsch.flexmark:flexmark-ext-gfm-strikethrough</include>
+        <include>com.vladsch.flexmark:flexmark-ext-gfm-tables</include>
+        <include>com.vladsch.flexmark:flexmark-ext-gfm-tasklist</include>
+        <include>com.vladsch.flexmark:flexmark-ext-gfm-users</include>
+        <include>com.vladsch.flexmark:flexmark-ext-jekyll-front-matter</include>
+        <include>com.vladsch.flexmark:flexmark-ext-jekyll-tag</include>
+        <include>com.vladsch.flexmark:flexmark-ext-ins</include>
+        <include>com.vladsch.flexmark:flexmark-ext-xwiki-macros</include>
+        <include>com.vladsch.flexmark:flexmark-ext-superscript</include>
+        <include>com.vladsch.flexmark:flexmark-ext-tables</include>
+        <include>com.vladsch.flexmark:flexmark-ext-toc</include>
+        <include>com.vladsch.flexmark:flexmark-ext-typographic</include>
+        <include>com.vladsch.flexmark:flexmark-ext-wikilink</include>
+        <include>com.vladsch.flexmark:flexmark-ext-yaml-front-matter</include>
+        <include>com.vladsch.flexmark:flexmark-formatter</include>
+        <include>com.vladsch.flexmark:flexmark-html-parser</include>
+        <include>org.jsoup:jsoup</include>
+        <include>com.vladsch.flexmark:flexmark-jira-converter</include>
+        <include>com.vladsch.flexmark:flexmark-pdf-converter</include>
+        <include>com.openhtmltopdf:openhtmltopdf-core</include>
+        <include>com.openhtmltopdf:openhtmltopdf-pdfbox</include>
+        <include>org.apache.pdfbox:pdfbox</include>
+        <include>org.apache.pdfbox:fontbox</include>
+        <include>com.openhtmltopdf:openhtmltopdf-rtl-support</include>
+        <include>com.ibm.icu:icu4j</include>
+        <include>com.openhtmltopdf:openhtmltopdf-jsoup-dom-converter</include>
+        <include>com.vladsch.flexmark:flexmark-profile-pegdown</include>
+        <include>com.vladsch.flexmark:flexmark-util</include>
+        <include>com.vladsch.flexmark:flexmark-youtrack-converter</include>        
+      </includes>
+    </dependencySet>
+    
+  </dependencySets>
+
+</assembly>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/InstallCert.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/InstallCert.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/InstallCert.java	(revision 1126)
@@ -0,0 +1,248 @@
+package org.gvsig.scripting.app;
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Sun Microsystems nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/**
+ * Originally from:
+ * http://blogs.sun.com/andreas/resource/InstallCert.java
+ * Use:
+ * java InstallCert hostname
+ * Example:
+ *% java InstallCert ecc.fedora.redhat.com
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.security.KeyStore;
+import java.security.MessageDigest;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+
+/**
+ * Class used to add the server's certificate to the KeyStore
+ * with your trusted certificates.
+ * 
+ * NOTE: modified to install the certificate always into the main cacerts
+ * keystore.
+ */
+public class InstallCert {
+
+    public static void install(String host, Integer port, String passphrase) throws Exception {
+        if( passphrase==null ) {
+            passphrase = "changeit";
+        }
+        if( port == null || port <1) {
+            port = 443;
+        }
+        main(
+            new String[] {
+                host +":"+port,
+                passphrase
+            }
+        );
+    }
+    
+    public static void main(String[] args) throws Exception {
+        String host;
+        int port;
+        char[] passphrase;
+        if ((args.length == 1) || (args.length == 2)) {
+            String[] c = args[0].split(":");
+            host = c[0];
+            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
+            String p = (args.length == 1) ? "changeit" : args[1];
+            passphrase = p.toCharArray();
+        } else {
+            System.out.println("Usage: java InstallCert [:port] [passphrase]");
+            return;
+        }
+
+        File file = null;
+        // File file = new File("jssecacerts");
+        // if (file.isFile() == false) {
+        char SEP = File.separatorChar;
+        File dir =
+            new File(System.getProperty("java.home") + SEP + "lib" + SEP
+                + "security");
+        // file = new File(dir, "jssecacerts");
+        // if (file.isFile() == false) {
+                file = new File(dir, "cacerts");
+
+        if (!file.canWrite()) {
+            System.err
+                .println("Unable to write in the file "
+                    + file
+                + ".\nRun InstallCert as an administrator or a user with "
+                + "privileges to write in the cacerts file");
+
+            System.exit(-1);
+        }
+        // }
+        // }
+        System.out.println("Loading KeyStore " + file + "...");
+        InputStream in = new FileInputStream(file);
+        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
+        ks.load(in, passphrase);
+        in.close();
+
+        SSLContext context = SSLContext.getInstance("TLS");
+        TrustManagerFactory tmf =
+            TrustManagerFactory.getInstance(TrustManagerFactory
+                .getDefaultAlgorithm());
+        tmf.init(ks);
+        X509TrustManager defaultTrustManager =
+            (X509TrustManager) tmf.getTrustManagers()[0];
+        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
+        context.init(null, new TrustManager[] { tm }, null);
+        SSLSocketFactory factory = context.getSocketFactory();
+
+        System.out
+            .println("Opening connection to " + host + ":" + port + "...");
+        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
+        socket.setSoTimeout(10000);
+        try {
+            System.out.println("Starting SSL handshake...");
+            socket.startHandshake();
+            socket.close();
+            System.out.println();
+            System.out.println("No errors, certificate is already trusted");
+        } catch (SSLException e) {
+            System.out.println();
+            e.printStackTrace(System.out);
+        }
+
+        X509Certificate[] chain = tm.chain;
+        if (chain == null) {
+            System.out.println("Could not obtain server certificate chain");
+            return;
+        }
+
+        BufferedReader reader =
+            new BufferedReader(new InputStreamReader(System.in));
+
+        System.out.println();
+        System.out.println("Server sent " + chain.length + " certificate(s):");
+        System.out.println();
+        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
+        MessageDigest md5 = MessageDigest.getInstance("MD5");
+        for (int i = 0; i < chain.length; i++) {
+            X509Certificate cert = chain[i];
+            System.out.println(" " + (i + 1) + " Subject "
+                + cert.getSubjectDN());
+            System.out.println("   Issuer  " + cert.getIssuerDN());
+            sha1.update(cert.getEncoded());
+            System.out.println("   sha1    " + toHexString(sha1.digest()));
+            md5.update(cert.getEncoded());
+            System.out.println("   md5     " + toHexString(md5.digest()));
+            System.out.println();
+        }
+
+//        int k=0;
+//        System.out
+//            .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
+//        String line = reader.readLine().trim();
+//        try {
+//            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
+//        } catch (NumberFormatException e) {
+//            System.out.println("KeyStore not changed");
+//            return;
+//        }
+
+        for( int k=0; k<chain.length; k++ ) {
+            X509Certificate cert = chain[k];
+            String alias = host + "-" + (k + 1);
+            ks.setCertificateEntry(alias, cert);
+
+            // OutputStream out = new FileOutputStream("jssecacerts");
+            OutputStream out = new FileOutputStream(file);
+            ks.store(out, passphrase);
+            out.close();
+
+            System.out.println();
+            System.out.println(cert);
+            System.out.println();
+            System.out
+                .println("Added certificate to keystore '" +
+                        file + "' using alias '" + alias + "'");
+        }
+    }
+
+    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
+
+    private static String toHexString(byte[] bytes) {
+        StringBuilder sb = new StringBuilder(bytes.length * 3);
+        for (int b : bytes) {
+            b &= 0xff;
+            sb.append(HEXDIGITS[b >> 4]);
+            sb.append(HEXDIGITS[b & 15]);
+            sb.append(' ');
+        }
+        return sb.toString();
+    }
+
+    private static class SavingTrustManager implements X509TrustManager {
+
+        private final X509TrustManager tm;
+        private X509Certificate[] chain;
+
+        SavingTrustManager(X509TrustManager tm) {
+            this.tm = tm;
+        }
+
+        public X509Certificate[] getAcceptedIssuers() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void checkClientTrusted(X509Certificate[] chain, String authType)
+            throws CertificateException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void checkServerTrusted(X509Certificate[] chain, String authType)
+            throws CertificateException {
+            this.chain = chain;
+            tm.checkServerTrusted(chain, authType);
+        }
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanelView.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanelView.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanelView.java	(revision 1126)
@@ -0,0 +1,189 @@
+package org.gvsig.scripting.app.extension;
+
+import com.jeta.open.i18n.I18NUtils;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.ComponentOrientation;
+import java.awt.Container;
+import java.awt.Dimension;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+
+
+public class DataFoldersRecoverPanelView extends JPanel
+{
+   JLabel lblMsg1 = new JLabel();
+   JLabel lblMsg2 = new JLabel();
+   JList lstDataFolders = new JList();
+   JTextField txtOldFolder = new JTextField();
+   JLabel lblRestoreFromFolder = new JLabel();
+   JLabel lblApplication = new JLabel();
+   JTextField txtApplication = new JTextField();
+   JTextField txtPath = new JTextField();
+   JLabel lblPath = new JLabel();
+   JLabel lblPath1 = new JLabel();
+   JTextField txtPreferencias = new JTextField();
+
+   /**
+    * Default constructor
+    */
+   public DataFoldersRecoverPanelView()
+   {
+      initializePanel();
+   }
+
+   /**
+    * Adds fill components to empty cells in the first row and first column of the grid.
+    * This ensures that the grid spacing will be the same as shown in the designer.
+    * @param cols an array of column indices in the first row where fill components should be added.
+    * @param rows an array of row indices in the first column where fill components should be added.
+    */
+   void addFillComponents( Container panel, int[] cols, int[] rows )
+   {
+      Dimension filler = new Dimension(10,10);
+
+      boolean filled_cell_11 = false;
+      CellConstraints cc = new CellConstraints();
+      if ( cols.length > 0 && rows.length > 0 )
+      {
+         if ( cols[0] == 1 && rows[0] == 1 )
+         {
+            /** add a rigid area  */
+            panel.add( Box.createRigidArea( filler ), cc.xy(1,1) );
+            filled_cell_11 = true;
+         }
+      }
+
+      for( int index = 0; index < cols.length; index++ )
+      {
+         if ( cols[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) );
+      }
+
+      for( int index = 0; index < rows.length; index++ )
+      {
+         if ( rows[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) );
+      }
+
+   }
+
+   /**
+    * Helper method to load an image file from the CLASSPATH
+    * @param imageName the package and name of the file to load relative to the CLASSPATH
+    * @return an ImageIcon instance with the specified image file
+    * @throws IllegalArgumentException if the image resource cannot be loaded.
+    */
+   public ImageIcon loadImage( String imageName )
+   {
+      try
+      {
+         ClassLoader classloader = getClass().getClassLoader();
+         java.net.URL url = classloader.getResource( imageName );
+         if ( url != null )
+         {
+            ImageIcon icon = new ImageIcon( url );
+            return icon;
+         }
+      }
+      catch( Exception e )
+      {
+         e.printStackTrace();
+      }
+      throw new IllegalArgumentException( "Unable to load image: " + imageName );
+   }
+
+   /**
+    * Method for recalculating the component orientation for 
+    * right-to-left Locales.
+    * @param orientation the component orientation to be applied
+    */
+   public void applyComponentOrientation( ComponentOrientation orientation )
+   {
+      // Not yet implemented...
+      // I18NUtils.applyComponentOrientation(this, orientation);
+      super.applyComponentOrientation(orientation);
+   }
+
+   public JPanel createPanel()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE","CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      lblMsg1.setName("lblMsg1");
+      lblMsg1.setText("<html>Han sido encontradas preferencias de versiones anteriores para algunos complementos.</html>");
+      jpanel1.add(lblMsg1,cc.xy(2,2));
+
+      lblMsg2.setName("lblMsg2");
+      lblMsg2.setText("<html>Seleccione los complementos para los que desea recuperar las preferencias de versiones anteriores</html>");
+      jpanel1.add(lblMsg2,cc.xy(2,4));
+
+      lstDataFolders.setName("lstDataFolders");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(lstDataFolders);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xy(2,6));
+
+      txtOldFolder.setEnabled(false);
+      txtOldFolder.setName("txtOldFolder");
+      jpanel1.add(txtOldFolder,cc.xy(2,22));
+
+      lblRestoreFromFolder.setName("lblRestoreFromFolder");
+      lblRestoreFromFolder.setText("Recuperar desde la carpeta");
+      jpanel1.add(lblRestoreFromFolder,cc.xy(2,20));
+
+      lblApplication.setName("lblApplication");
+      lblApplication.setText("Applicacion");
+      jpanel1.add(lblApplication,cc.xy(2,8));
+
+      txtApplication.setEnabled(false);
+      txtApplication.setName("txtApplication");
+      jpanel1.add(txtApplication,cc.xy(2,10));
+
+      txtPath.setEnabled(false);
+      txtPath.setName("txtPath");
+      jpanel1.add(txtPath,cc.xy(2,18));
+
+      lblPath.setName("lblPath");
+      lblPath.setText("Ruta");
+      jpanel1.add(lblPath,cc.xy(2,16));
+
+      lblPath1.setName("lblPath");
+      lblPath1.setText("Preferencias");
+      jpanel1.add(lblPath1,cc.xy(2,12));
+
+      txtPreferencias.setEnabled(false);
+      txtPreferencias.setName("txtPreferencias");
+      jpanel1.add(txtPreferencias,cc.xy(2,14));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 });
+      return jpanel1;
+   }
+
+   /**
+    * Initializer
+    */
+   protected void initializePanel()
+   {
+      setLayout(new BorderLayout());
+      add(createPanel(), BorderLayout.CENTER);
+   }
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptsInstallerInitializer.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptsInstallerInitializer.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptsInstallerInitializer.java	(revision 1126)
@@ -0,0 +1,63 @@
+package org.gvsig.scripting.app.extension;
+
+import java.io.File;
+import org.apache.commons.io.FileUtils;
+import org.gvsig.andami.PluginServices;
+import org.gvsig.andami.PluginsLocator;
+import org.gvsig.andami.PluginsManager;
+import org.gvsig.installer.lib.api.InstallerLocator;
+import org.gvsig.installer.lib.api.InstallerManager;
+import org.gvsig.installer.lib.spi.InstallerProviderLocator;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.tools.service.spi.ProviderFactory;
+import org.gvsig.tools.service.spi.ProviderManager;
+import org.gvsig.tools.util.Invocable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ScriptsInstallerInitializer implements Invocable {
+
+    public static final String VERSION_FORMAT = "%M.%m.%r";
+    
+    private static final Logger LOG = LoggerFactory.getLogger(ScriptsInstallerInitializer.class);
+   
+    @Override
+    public Object call(Object... args) {
+        // Cuando se hace la llamada a este metodo, aun no esta inicializado gvSIG.
+        // Los servicios que ofrece el PluginsManager no son completos, solo algunos
+        // de ellos estan disponibles. La lista de plugins aun no se ha cargado.
+        try {
+            String pluginName = (String) args[0];
+            
+            ProviderManager providerManager = InstallerProviderLocator.getProviderManager();            
+            PluginsManager pluginManager = PluginsLocator.getManager();
+            ScriptingManager manager = ScriptingLocator.getManager();
+            InstallerManager installerManager = InstallerLocator.getInstallerManager();
+            File pluginHomeFolder = pluginManager.getPluginHomeFolder(pluginName);
+            
+            String gvsigversion = pluginManager.getApplicationVersion().format(VERSION_FORMAT) ;
+            File home = ScriptingUtils.getScriptsHomeFolder(pluginHomeFolder, gvsigversion);
+            
+            manager.setHomeFolder(home);
+            manager.setPackagesFolder(pluginManager.getInstallFolder());
+            
+            File localAddonRepositoryFolder = new File(manager.getRootUserFolder(), "addons");
+            
+            ProviderFactory factory = manager.getInstallerFactory();
+            providerManager.addProviderFactory(factory);
+            
+            installerManager.setDefaultLocalAddonRepository(
+                    localAddonRepositoryFolder,
+                    factory.getName()
+            );
+            
+            return true;
+            
+        } catch (Exception ex) {
+            LOG.warn("Problems initializing scripts installer.",ex);
+            return false;
+        }
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWaitView.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWaitView.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWaitView.xml	(revision 1126)
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/datos/devel/org.gvsig.scripting/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWaitView.xml</at>
+   <at name="rowspecs">CENTER:4DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE</at>
+   <at name="colspecs">FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">left</at>
+           <at name="valign">top</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblMsg</at>
+            <at name="width">12</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">12</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">right</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="actionCommand">_Cancel</at>
+            <at name="name">btnCancel</at>
+            <at name="width">76</at>
+            <at name="text">_Cancel</at>
+            <at name="height">22</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">center</at>
+           <at name="valign">top</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblIcon</at>
+            <at name="width">12</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">12</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="5">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWaitView.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWaitView.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWaitView.java	(revision 1126)
@@ -0,0 +1,143 @@
+package org.gvsig.scripting.app.extension.messagewait;
+
+import com.jeta.open.i18n.I18NUtils;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.ComponentOrientation;
+import java.awt.Container;
+import java.awt.Dimension;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+
+public class MessageWaitView extends JPanel
+{
+   JLabel lblMsg = new JLabel();
+   JButton btnCancel = new JButton();
+   JLabel lblIcon = new JLabel();
+
+   /**
+    * Default constructor
+    */
+   public MessageWaitView()
+   {
+      initializePanel();
+   }
+
+   /**
+    * Adds fill components to empty cells in the first row and first column of the grid.
+    * This ensures that the grid spacing will be the same as shown in the designer.
+    * @param cols an array of column indices in the first row where fill components should be added.
+    * @param rows an array of row indices in the first column where fill components should be added.
+    */
+   void addFillComponents( Container panel, int[] cols, int[] rows )
+   {
+      Dimension filler = new Dimension(10,10);
+
+      boolean filled_cell_11 = false;
+      CellConstraints cc = new CellConstraints();
+      if ( cols.length > 0 && rows.length > 0 )
+      {
+         if ( cols[0] == 1 && rows[0] == 1 )
+         {
+            /** add a rigid area  */
+            panel.add( Box.createRigidArea( filler ), cc.xy(1,1) );
+            filled_cell_11 = true;
+         }
+      }
+
+      for( int index = 0; index < cols.length; index++ )
+      {
+         if ( cols[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) );
+      }
+
+      for( int index = 0; index < rows.length; index++ )
+      {
+         if ( rows[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) );
+      }
+
+   }
+
+   /**
+    * Helper method to load an image file from the CLASSPATH
+    * @param imageName the package and name of the file to load relative to the CLASSPATH
+    * @return an ImageIcon instance with the specified image file
+    * @throws IllegalArgumentException if the image resource cannot be loaded.
+    */
+   public ImageIcon loadImage( String imageName )
+   {
+      try
+      {
+         ClassLoader classloader = getClass().getClassLoader();
+         java.net.URL url = classloader.getResource( imageName );
+         if ( url != null )
+         {
+            ImageIcon icon = new ImageIcon( url );
+            return icon;
+         }
+      }
+      catch( Exception e )
+      {
+         e.printStackTrace();
+      }
+      throw new IllegalArgumentException( "Unable to load image: " + imageName );
+   }
+
+   /**
+    * Method for recalculating the component orientation for 
+    * right-to-left Locales.
+    * @param orientation the component orientation to be applied
+    */
+   public void applyComponentOrientation( ComponentOrientation orientation )
+   {
+      // Not yet implemented...
+      // I18NUtils.applyComponentOrientation(this, orientation);
+      super.applyComponentOrientation(orientation);
+   }
+
+   public JPanel createPanel()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE","CENTER:4DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      lblMsg.setName("lblMsg");
+      jpanel1.add(lblMsg,new CellConstraints(4,2,1,1,CellConstraints.LEFT,CellConstraints.TOP));
+
+      btnCancel.setActionCommand("_Cancel");
+      btnCancel.setName("btnCancel");
+      btnCancel.setText("_Cancel");
+      jpanel1.add(btnCancel,new CellConstraints(4,4,1,1,CellConstraints.RIGHT,CellConstraints.DEFAULT));
+
+      lblIcon.setName("lblIcon");
+      jpanel1.add(lblIcon,new CellConstraints(2,2,1,1,CellConstraints.CENTER,CellConstraints.TOP));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3,4,5 });
+      return jpanel1;
+   }
+
+   /**
+    * Initializer
+    */
+   protected void initializePanel()
+   {
+      setLayout(new BorderLayout());
+      add(createPanel(), BorderLayout.CENTER);
+   }
+
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWait.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWait.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/messagewait/MessageWait.java	(revision 1126)
@@ -0,0 +1,99 @@
+package org.gvsig.scripting.app.extension.messagewait;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.net.URL;
+import javax.swing.ImageIcon;
+import javax.swing.SwingUtilities;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager;
+
+
+public class MessageWait extends MessageWaitView {
+    
+    private static final long serialVersionUID = 6668980523307140920L;
+    private WaitingCondition condition;
+    private int seconds = 3;
+    private boolean cancelled = false;
+    private Runnable action;
+    
+    public interface WaitingCondition {
+        
+        public boolean stopWaiting();
+    }
+    
+    public MessageWait() {
+        this.btnCancel.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                cancelled = true;
+                setVisible(false);
+            }
+        });
+        URL url = this.getClass().getResource("/images/spinner.gif");
+        ImageIcon icon = new ImageIcon(url);
+        this.lblIcon.setIcon(icon);
+        I18nManager i18n = ToolsLocator.getI18nManager();
+        this.btnCancel.setText(i18n.getTranslation("Cancel"));
+    }
+    
+    public void showMessage(String title, String msg, WaitingCondition condition, Runnable action) {
+        this.showMessage(title, msg, condition, action, 300, -1, 3);
+    }
+
+    public void showMessage(String title, String msg, WaitingCondition condition, Runnable action, int width, int height, int seconds) {
+        if( condition.stopWaiting() ) {
+            SwingUtilities.invokeLater(action);
+            return;
+        }
+        this.setVisible(true);
+        this.condition = condition;
+        this.seconds = seconds;
+        this.action = action;
+        this.cancelled = false;
+        this.lblMsg.setText("<html>"+msg.replace("\n", "<br>\n")+"</html>");
+        Dimension d = this.getPreferredSize();
+        if( height<d.height ) {
+            height = d.height;
+        }
+        if( width<d.width ) {
+            width = d.width;
+        }
+        this.setPreferredSize(new Dimension(width, height));
+        WindowManager winmgr = ToolsSwingLocator.getWindowManager();
+        winmgr.showWindow(this, title, WindowManager.MODE.TOOL);
+        Thread th = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                doWait();
+            }
+        }, "MessageWait");
+        th.start();
+    }
+    
+    private void doWait() {
+        while( true ) {
+            if( this.condition.stopWaiting() ) {
+                break;
+            }
+            try {
+                Thread.sleep(this.seconds*1000);
+            } catch (InterruptedException ex) {
+
+            }
+        }
+        if( this.cancelled ) {
+            return;
+        }
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                setVisible(false);
+                action.run();
+            }
+        });
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptLaunchExtension.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptLaunchExtension.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptLaunchExtension.java	(revision 1126)
@@ -0,0 +1,134 @@
+package org.gvsig.scripting.app.extension;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import javax.swing.JOptionPane;
+import org.gvsig.andami.PluginsLocator;
+import org.gvsig.andami.PluginsManager;
+import org.gvsig.andami.plugins.Extension;
+import org.gvsig.app.ApplicationLocator;
+import org.gvsig.app.ApplicationManager;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ScriptLaunchExtension extends Extension {
+
+    private static final Logger logger = LoggerFactory.getLogger(ScriptLaunchExtension.class);
+
+    @Override
+    public void initialize() {
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean isVisible() {
+        return true;
+    }
+
+    @Override
+    public boolean canQueryByAction() {
+        return true;
+    }
+
+    @Override
+    public void execute(String action) {
+        ApplicationManager application = ApplicationLocator.getManager();
+        ScriptingScript script = getScript(action);
+        if( script == null ) {
+            application.messageDialog(
+                    "Can't locate script '"+action+"'", 
+                    "Warning", 
+                    JOptionPane.WARNING_MESSAGE
+            );
+            return;
+        }
+        try {
+            script.runAsTask(null);
+        } catch (Throwable th) {
+            logger.warn("Can't execute '" + action + "' script.", th);
+        }
+    }
+
+    @Override
+    public void execute(String action, Object[] args) {
+        ApplicationManager application = ApplicationLocator.getManager();
+        ScriptingScript script = getScript(action);
+        if( script == null ) {
+            application.messageDialog(
+                    "Can't locate script '"+action+"'", 
+                    "Warning", 
+                    JOptionPane.WARNING_MESSAGE
+            );
+            return;
+        }
+        try {
+            script.runAsTask(args);
+        } catch (Throwable th) {
+            logger.warn("Can't execute '" + action + "' script.", th);
+        }
+    }
+
+    @Override
+    public boolean isVisible(String action) {
+        ScriptingScript script = getScript(action);
+        try {
+            Boolean value = (Boolean) script.invokeFunction("isVisible", null);
+            return value;
+        } catch (Throwable th) {
+            logger.warn("Can't execute isVisible in '" + action + "' script.", th);
+        }
+        return false;
+    }
+
+    @Override
+    public boolean isEnabled(String action) {
+        ScriptingScript script = getScript(action);
+        try {
+            Boolean value = (Boolean) script.invokeFunction("isEnabled", null);
+            return value;
+        } catch (Throwable th) {
+            logger.warn("Can't execute isEnabled in '" + action + "' script.", th);
+        }
+        return false;
+    }
+
+    private ScriptingScript getScript(String scriptpathname) {
+        final ScriptingManager manager = ScriptingLocator.getManager();
+        final PluginsManager pluginManager = PluginsLocator.getManager();
+
+        File scriptfile;
+        ScriptingScript script;
+        
+        String s = manager.getRootUserFolder().getAbsolutePath().replace("\\", "/");
+        scriptfile = new File(s+"/"+scriptpathname);
+        if (scriptfile.exists()) {
+            script = (ScriptingScript) manager.getScript(scriptfile);
+            return script;
+        }
+                
+        final List<File> pluginsFolders = new ArrayList<>();
+        for (File f : pluginManager.getPluginsFolders()) {
+            pluginsFolders.addAll(Arrays.asList(f.listFiles()));
+        }
+
+        for (File pluginFolder : pluginsFolders) {
+            s = pluginFolder.getAbsolutePath().replace("\\", "/");
+            scriptfile = new File(s+"/scripting/scripts/"+scriptpathname);
+            if (scriptfile.exists()) {
+                script = (ScriptingScript) manager.getScript(scriptfile);
+                return script;
+            }
+        }
+        return (ScriptingScript) manager.getScript(scriptpathname);
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanel.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanel.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanel.java	(revision 1126)
@@ -0,0 +1,80 @@
+package org.gvsig.scripting.app.extension;
+
+import java.awt.Dimension;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.DefaultListModel;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import org.gvsig.scripting.DataFolderFound;
+import org.gvsig.tools.swing.api.JListWithCheckbox;
+import org.gvsig.tools.swing.api.ListElement;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.ToolsSwingManager;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public class DataFoldersRecoverPanel extends DataFoldersRecoverPanelView {
+
+    private final List<DataFolderFound> dataFoldersFound;
+    private JListWithCheckbox lstCheckedDataFolders;
+
+    public DataFoldersRecoverPanel(List<DataFolderFound> dataFoldersFound) {
+        this.dataFoldersFound = dataFoldersFound;
+        this.initComponents();
+    }
+
+    private void initComponents() {
+        ToolsSwingManager manager = ToolsSwingLocator.getToolsSwingManager();
+        this.lstCheckedDataFolders = manager.createJListWithCheckbox(lstDataFolders);
+        DefaultListModel model = new DefaultListModel();
+        for (DataFolderFound dataFolderFound : dataFoldersFound) {
+            model.addElement(
+                new ListElement<>(
+                    dataFolderFound.getApplicationName() + " ("+dataFolderFound.getDataFolderId()+")", 
+                    dataFolderFound
+                )
+            );
+        }
+        this.lstDataFolders.setModel(model);
+        this.lstDataFolders.addListSelectionListener(new ListSelectionListener() {
+            @Override
+            public void valueChanged(ListSelectionEvent e) {
+                if( e.getValueIsAdjusting() ) {
+                    return;
+                }
+                updateInterfaceData();
+            }
+        });
+
+        this.setPreferredSize(new Dimension(500, 420));
+    }
+
+    private void updateInterfaceData() {
+        DataFolderFound dataFolder = (DataFolderFound) ListElement.getSelected(this.lstDataFolders);
+        if (dataFolder == null) {
+            return;
+        }
+        this.txtApplication.setText(dataFolder.getApplicationName());
+        this.txtPreferencias.setText(dataFolder.getDataFolderId());
+        this.txtPath.setText(dataFolder.getApplicationFolder().getUserPath());
+        String path = dataFolder.getOldDataFolder().getAbsolutePath();
+        this.txtOldFolder.setText(path);
+        this.txtOldFolder.setCaretPosition(path.length());
+    }
+
+    public List<DataFolderFound> getSelectedDataFolders() {
+        List<DataFolderFound> r = new ArrayList<>();
+        ListSelectionModel checkedModel = this.lstCheckedDataFolders.getCheckedModel();
+        for (int i = 0; i < dataFoldersFound.size(); i++) {
+            if (checkedModel.isSelectedIndex(i)) {
+                r.add(dataFoldersFound.get(i));
+            }
+        }
+        return r;
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingExtension.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingExtension.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingExtension.java	(revision 1126)
@@ -0,0 +1,233 @@
+/* gvSIG. Geographic Information System of the Valencian Government
+ *
+ * Copyright (C) 2007-2008 Infrastructures and Transports Department
+ * of the Valencian Government (CIT)
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+ * MA  02110-1301, USA.
+ * 
+ */
+package org.gvsig.scripting.app.extension;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import org.gvsig.andami.IconThemeHelper;
+import org.gvsig.andami.PluginServices;
+import org.gvsig.andami.PluginsLocator;
+import org.gvsig.andami.PluginsManager;
+import org.gvsig.andami.plugins.Extension;
+import org.gvsig.andami.plugins.PluginClassLoader;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.tools.dynobject.DynObject;
+import org.gvsig.tools.swing.impl.windowmanager.DefaultWindowManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.gvsig.tools.script.Script;
+import org.gvsig.tools.util.Invocable;
+
+@SuppressWarnings("UseSpecificCatch")
+public class ScriptingExtension extends Extension {
+
+    @SuppressWarnings("FieldNameHidesFieldInSuperclass")
+    private static final Logger LOGGER = LoggerFactory.getLogger(ScriptingExtension.class);
+
+    private ScriptingUtils utils;
+    
+    @Deprecated
+    public static void log(String message) {
+        ScriptingUtils.log(ScriptingUtils.INFO, message, null);
+    }
+
+    @Deprecated
+    public static void log(int level, String message) {
+        ScriptingUtils.log(level, message, null);
+    }
+
+    @Deprecated
+    public static void log(int level, String message, Throwable th) {
+        ScriptingUtils.log(level, message, th);
+    }
+    
+    @Override
+    public void initialize() {
+        IconThemeHelper.registerIcon("action", "tools-scripting-launcher", this);
+        IconThemeHelper.registerIcon("action", "tools-scripting-composer", this);
+        IconThemeHelper.registerIcon("action", "tools-scripting-console-jython", this);
+
+        PluginsManager pluginManager = PluginsLocator.getManager();
+        this.utils = new ScriptingUtils();
+
+        this.utils.initializaPaths(
+                pluginManager.getPluginsFolders(), 
+                pluginManager.getInstallFolder(), 
+                this.getPlugin().getPluginHomeFolder(), 
+                pluginManager.getApplicationVersion().format(ScriptsInstallerInitializer.VERSION_FORMAT)
+        );
+        
+        Thread th = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                preloadPythonEngine();
+            }
+        }, "ScriptEnginesInitializer");
+        th.start();
+        try {
+            th.join(1000); // force change to other thread
+        } catch (InterruptedException ex) {
+            // Ignore.
+        }
+    }
+
+    @Override
+    public void execute(String actionCommand) {
+        this.execute(actionCommand, null);
+    }
+
+    @Override
+    public void execute(String command, Object[] args) {
+
+
+        if( "tools-scripting-launcher".equalsIgnoreCase(command) ) {
+            utils.runLauncher();
+            
+        } else if( "tools-scripting-composer".equalsIgnoreCase(command) ) {
+
+            DynObject preferences = getPlugin().getPluginProperties();
+            Boolean composerUseHisWindowManager = (Boolean) preferences.getDynValue("ComposerUseHisWindowManager");
+            if( composerUseHisWindowManager ) {
+                DefaultWindowManager winmanager = new DefaultWindowManager();
+                ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+                uimanager.setWindowManager(winmanager);
+            }
+            utils.runComposer();
+
+        } else {
+            utils.runScript(command, args);
+        }
+    }
+
+    private void preloadPythonEngine() {
+        ScriptingManager manager = (ScriptingManager) ScriptingLocator.getManager();
+        synchronized (manager) {
+            String respath = "/scripting/langs/python/preload.py";
+            InputStream res = this.getClass().getResourceAsStream(respath);
+            if( res != null ) {
+                LOGGER.info("Scan for script engines");
+                List<String> lines;
+                try {
+                    lines = IOUtils.readLines(res);
+                    String code = StringUtils.join(lines, "\n");
+                    LOGGER.info("Preload python script engine");
+                    Script script = manager.createScript(
+                        "preload",
+                        code,
+                        ScriptingManager.PYTHON_LANGUAGE_NAME
+                    );
+                    LOGGER.info("Preload python modules");
+                    script.invokeFunction("main", null);
+
+                } catch (Exception ex) {
+                    LOGGER.warn("Can't run preload script for python.", ex);
+                }
+                LOGGER.info("Preload of script engines finished");
+            }
+        }
+    }
+
+    
+    @Override
+    public void postInitialize() {
+        super.postInitialize();
+                        
+        PluginsManager pluginManager = PluginsLocator.getManager();
+
+        pluginManager.addStartupTask(
+            "ExecuteAutorunScripts",
+            utils.getAutorunScriptsOnStartup(pluginManager.getPluginsFolders()),
+            false,
+            200
+        );
+
+        Invocable initializer = new ScriptsInstallerInitializer();
+        initializer.call(this.getPlugin().getPluginName());
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean isVisible() {
+        return true;
+    }
+
+    public static void add_classpath(URL url) {
+        if( url==null ) {
+            LOGGER.warn("Can't add to the plugin classloader a null URL.");
+            return;
+        }
+        try {
+            PluginsManager manager = PluginsLocator.getManager();
+            PluginServices thePlugin = manager.getPlugin(ScriptingExtension.class);
+            PluginClassLoader loader = thePlugin.getClassLoader();
+            loader.addURL(url);
+        } catch(Throwable th) {
+            LOGGER.warn("Can't add the url '"+url.toString()+"' to the plugin classloader.",th);
+        }
+    }
+    
+    public static void add_classpath(File path) {
+        if( path==null ) {
+            LOGGER.warn("Can't create a url from a null file.");
+            return;
+        }
+        try {
+            URL url = path.toURI().toURL();
+            add_classpath(url);
+        } catch (MalformedURLException ex) {
+            LOGGER.warn("Can't create a url from the path '"+path+"'.", ex);
+        }
+    }
+    
+    public static void add_classpath(String path) {
+        if( path==null ) {
+            LOGGER.warn("Can't create a url from a null path.");
+            return;
+        }
+        File f = new File(path);
+        add_classpath(f);
+    }
+
+    @Override
+    public PluginServices getPlugin() {
+        PluginServices thePlugin = super.getPlugin();
+        if (thePlugin == null) {
+            thePlugin = PluginsLocator.getManager().getPlugin(ScriptingExtension.class);
+            this.setPlugin(thePlugin);
+        }
+        return thePlugin;
+    }
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingUtils.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingUtils.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingUtils.java	(revision 1126)
@@ -0,0 +1,583 @@
+package org.gvsig.scripting.app.extension;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import static java.nio.file.FileVisitOption.FOLLOW_LINKS;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.function.Predicate;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOCase;
+import org.apache.commons.lang3.BooleanUtils;
+import org.gvsig.scripting.DataFolderFound;
+import org.gvsig.scripting.ScriptingBaseScript;
+import org.gvsig.scripting.ScriptingFolder;
+import org.gvsig.scripting.ScriptingLocator;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.ScriptingScript;
+import org.gvsig.scripting.ScriptingUnit;
+import org.gvsig.scripting.app.extension.messagewait.MessageWait;
+import org.gvsig.scripting.swing.api.JScriptingComposer;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import static org.gvsig.scripting.swing.api.ScriptingUIManager.SCRIPT_COMPOSER_AUTORUN;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.exception.BaseException;
+import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.packageutils.PackageManager;
+import org.gvsig.tools.packageutils.Version;
+import org.gvsig.tools.swing.api.ToolsSwingLocator;
+import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
+import org.gvsig.tools.swing.api.windowmanager.Dialog;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager;
+import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
+import org.gvsig.tools.task.SimpleTaskStatus;
+import org.gvsig.tools.visitor.VisitCanceledException;
+import org.gvsig.tools.visitor.Visitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.gvsig.tools.util.FolderSet;
+import org.gvsig.tools.util.impl.DefaultFolderSet;
+/**
+ *
+ * @author jjdelcerro
+ */
+@SuppressWarnings("UseSpecificCatch")
+public class ScriptingUtils {
+    
+    public static final String SKIP_AUTORUNS = "skipAutoruns";
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(ScriptingExtension.class);
+
+    private boolean executingAutorunScripts = false;
+    private static boolean composer_initialized = false;
+    private final MessageWait message;
+
+    /*
+     * la funcion log y las constantes estan pensadas para usarlas desde los scripts.
+     */
+    public static final int INFO = 0;
+    public static final int TRACE = 1;
+    public static final int WARN = 2;
+    public static final int ERROR = 3;
+
+    public static void log(String message) {
+        log(INFO, message, null);
+    }
+
+    public static void log(int level, String message) {
+        log(level, message, null);
+    }
+
+    public static void log(int level, String message, Throwable th) {
+        switch( level ) {
+        case TRACE:
+            LOGGER.trace(message, th);
+            break;
+        case ERROR:
+            LOGGER.error(message, th);
+            break;
+        case WARN:
+            LOGGER.warn(message, th);
+            break;
+        default:
+        case INFO:
+            LOGGER.info(message, th);
+            break;
+        }
+    }
+    private String appversion;
+    private File pluginHomeFolder;
+
+    public ScriptingUtils() {
+        message = new MessageWait();
+    }
+    
+    public static File getScriptsHomeFolder(File pluginHomeFolder, String appversion) {
+        File scriptsHomeFolder;
+        File f = FileUtils.getFile(pluginHomeFolder, "scripts-folder.txt");
+        if( f.exists() ) {
+            try {
+                List<String> lines = FileUtils.readLines(f);
+                for( String line : lines ) {
+                    line = line.trim();
+                    if( !line.startsWith("#") ) {
+                        scriptsHomeFolder = new File(line);
+                        if( !scriptsHomeFolder.isAbsolute() ) {
+                            scriptsHomeFolder = new File(pluginHomeFolder, line);
+                        }
+                        scriptsHomeFolder = new File(
+                            FilenameUtils.normalizeNoEndSeparator(
+                                scriptsHomeFolder.getAbsolutePath(),
+                                true
+                            )
+                        );
+                        if( scriptsHomeFolder.exists() ) {
+                            return scriptsHomeFolder;
+                        }
+                    }
+                }
+            } catch (IOException ex) {
+            }
+        } else {
+            try {
+                FileUtils.touch(f);
+            } catch (IOException ex) {
+            }
+        }
+        scriptsHomeFolder = FileUtils.getFile(pluginHomeFolder, appversion) ;
+        return scriptsHomeFolder;
+    }
+    
+    public void initializaPaths(List<File> pluginsFolder, File installFolder, File pluginHoneFolder, String appversion) {
+
+        this.appversion = appversion;
+        this.pluginHomeFolder = pluginHoneFolder;
+        ScriptingManager manager = ScriptingLocator.getManager();
+        manager.setHomeFolder(getScriptsHomeFolder(pluginHoneFolder, appversion));
+
+        ScriptingFolder folder = manager.createLink(
+            "Common",
+            manager.getUserFolder(), 
+            "../../scripts"
+        );
+        folder.setProperty(ScriptingUtils.SKIP_AUTORUNS, BooleanUtils.toStringTrueFalse(true));
+        folder.save();
+//        manager.createLink(
+//            "Previous version",
+//            manager.getUserFolder(), 
+//            "../../../org.gvsig.scripting.app.extension/scripts"
+//        );
+
+        List<File> pluginsFolders = new ArrayList<>();
+        for( File f : pluginsFolder ) {
+            pluginsFolders.addAll(Arrays.asList(f.listFiles()));
+        }
+
+        for( File pluginFolder : pluginsFolders ) {
+            File scriptsFolder = new File(pluginFolder, "scripting/scripts");
+            if( scriptsFolder.exists() ) {
+                manager.registerSystemFolder(pluginFolder.getName(), scriptsFolder);
+            }
+            File libFolder = new File(pluginFolder, "scripting/lib");
+            if( libFolder.exists() ) {
+                manager.addLibFolder(libFolder);
+            }
+        }
+        manager.setPackagesFolder(installFolder);
+
+        File localAddonRepositoryFolder = new File(manager.getRootUserFolder(), "addons");
+        if( !localAddonRepositoryFolder.exists() ) {
+            try {
+                FileUtils.forceMkdir(localAddonRepositoryFolder);
+            } catch (IOException ex) {
+                LOGGER.info("Can't create addons folder in '" + localAddonRepositoryFolder.getAbsolutePath() + "'.", ex);
+            }
+        }
+        File initAddonFile = new File(localAddonRepositoryFolder, "__init__.py");
+        if( !initAddonFile.exists() ) {
+            try {
+                FileUtils.touch(initAddonFile);
+            } catch (IOException ex) {
+                LOGGER.info("Can't create addons __init__ file in '" + localAddonRepositoryFolder.getAbsolutePath() + "'.", ex);
+            }
+        }
+    }
+    
+    
+    public void runScript(String name, Object[] args) {
+        ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+        WindowManager winmanager = ToolsSwingLocator.getWindowManager();        
+
+        ScriptingBaseScript script = uimanager.getManager().getScript(name);
+        if( script != null ) {
+            script.run(args);
+        } else {
+            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
+            dialogs.messageDialog(
+                    "Can't locate script '" + name + "'.", 
+                    "ScriptLaunch", 
+                    JOptionPane.OK_OPTION
+            );
+        }
+    }
+    
+    public void runLauncher() {
+        ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+        WindowManager winmanager = ToolsSwingLocator.getWindowManager();        
+        winmanager.showWindow(uimanager.createLauncher().asJComponent(), uimanager.getTranslation("Scripting_Launcher"), WindowManager.MODE.TOOL);        
+    }
+    
+    public void runComposer() {
+        I18nManager i18n = ToolsLocator.getI18nManager();
+        message.showMessage(
+                i18n.getTranslation("_notice"),
+                i18n.getTranslation("_Initializing_the_scripting_plugin_Xhorizontal_ellipsisX") + "\n"
+                + i18n.getTranslation("_Waiting_to_terminate"),
+                new MessageWait.WaitingCondition() {
+            private Thread th = null;
+
+            @Override
+            public boolean stopWaiting() {
+                if (executingAutorunScripts) {
+                    return false;
+                }
+                if (composer_initialized) {
+                    return true;
+                }
+                if (th == null) {
+                    th = new Thread(new ExecuteScriptsFromScriptingFolders(null, "scautorun", SCRIPT_COMPOSER_AUTORUN), "StartupScriptingComposer");
+                    th.start();
+                }
+                return false;
+            }
+        },
+                new Runnable() {
+            @Override
+            public void run() {
+                showScriptingComposer();
+            }
+        }
+        );
+
+    }
+    
+    public Runnable getAutorunScriptsOnStartup(List<File> pluginsFolders) {
+        return new ExecuteAutorunScriptsOnStartup(pluginsFolders);
+    }
+    
+    private void showScriptingComposer() {
+        ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+        JScriptingComposer composer = uimanager.createComposer();
+        uimanager.showWindow(
+            composer.asJComponent(),
+            uimanager.getTranslation("Scripting_Composer")
+        );
+    }
+
+    private class ExecuteScriptsFromScriptingFolders extends AbstractExecuteScripts {
+        
+        public ExecuteScriptsFromScriptingFolders(List<File> pluginsFolders, String title, String patternName) {
+            super(pluginsFolders, title, patternName);
+        }
+        
+        @Override
+        public void run() {            
+            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
+            SimpleTaskStatus status = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("Scripts startup");
+            status.setIndeterminate();
+            status.setAutoremove(true);
+            status.add();
+            final I18nManager i18nManager = ToolsLocator.getI18nManager();            
+            try {
+                LOGGER.info("Searching "+title+" scripts...");
+                dialogs.message(
+                    i18nManager.getTranslation("_Searching_autorun_scripts_Xhorizontal_ellipsisX"),
+                    JOptionPane.INFORMATION_MESSAGE
+                );
+                ScriptingManager manager = ScriptingLocator.getManager();
+                final List<ScriptingScript> scripts = new ArrayList<>();
+                
+                Visitor visitor = new Visitor() {
+                    @Override
+                    public void visit(Object o) throws VisitCanceledException, BaseException {
+                        ScriptingUnit unit = (ScriptingUnit) o;
+                        if( unit instanceof ScriptingScript && 
+                            FilenameUtils.wildcardMatch(unit.getName(), patternName, IOCase.INSENSITIVE) ) {
+                            ScriptingScript script = (ScriptingScript) unit;
+                            if( script.isEnabled() ) {
+                                scripts.add(script);
+                            } else {
+                                LOGGER.info("Skip "+title+" script '" + script.getFile().getAbsolutePath() + "'.");
+                            }
+                        }
+                    }
+                };
+                Predicate<ScriptingUnit> includeFilter = new Predicate<ScriptingUnit>() {
+                    @Override
+                    public boolean test(ScriptingUnit unit) {
+                        if( unit instanceof ScriptingFolder ) {
+                            return !BooleanUtils.toBoolean(unit.getProperty(SKIP_AUTORUNS));
+                        }
+                        return false;
+                    }
+                };
+                manager.getSystemFolder().accept(visitor, includeFilter);
+                manager.getUserFolder().accept(visitor, includeFilter);
+                sortScripts(scripts);
+                executeScripts(scripts, status);
+            } catch(Throwable th) {
+                
+            } finally {
+                composer_initialized = true;
+                LOGGER.info("Running "+title+" scripts terminated.");
+                dialogs.message("", JOptionPane.INFORMATION_MESSAGE);
+                status.terminate();
+            }
+        }
+    }
+
+    public class ExecuteAutorunScriptsOnStartup implements Runnable {
+
+        private final List<File> pluginsFolders;
+
+        public ExecuteAutorunScriptsOnStartup(List<File> pluginsFolders) {
+            this.pluginsFolders = pluginsFolders;
+        }
+        
+        @Override
+        public void run() {
+            Runnable process = new ExecuteScriptsFromFilesystem(
+                    this.pluginsFolders,
+                    "autotun", 
+                    "autorun.inf"
+            );
+            process.run();
+        }
+    }
+
+    private abstract class AbstractExecuteScripts implements Runnable {
+
+        protected String patternName;
+        protected String title;
+        private final List<File> pluginsFolders;
+
+        public AbstractExecuteScripts(List<File> pluginsFolders, String title, String patternName) {
+            if( pluginsFolders==null ) {
+                this.pluginsFolders = Collections.EMPTY_LIST;
+            } else {
+                this.pluginsFolders = pluginsFolders;
+            }
+            this.patternName = patternName;
+            this.title = title;
+        }
+        
+        protected List<File> getPluginsFolders() {
+            return this.pluginsFolders;
+        }
+        
+        private String getScriptOrderKey(ScriptingBaseScript o) {
+            int groupOrder = 500;
+            String groupName = "default";
+            int scriptOrder = 500;
+            String s = o.getProperty("autorun.group.order");
+            if (s != null) {
+                try {
+                    groupOrder = Integer.parseInt(s);
+                } catch (Exception ex) {
+                    // Do nothing.
+                }
+            }
+            s = o.getProperty("autorun.group.name");
+            if (s != null) {
+                groupName = s;
+            }
+            s = o.getProperty("autorun.order");
+            if (s != null) {
+                try {
+                    scriptOrder = Integer.parseInt(s);
+                } catch (Exception ex) {
+                    // Do nothing.
+                }
+            }
+            String key = MessageFormat.format(
+                    "{0,number,000000}.{1}.{2,number,000000}",
+                    groupOrder,
+                    groupName,
+                    scriptOrder
+            );
+            return key;
+        }
+
+        protected void sortScripts(List<ScriptingScript> scripts) {
+            Collections.sort(scripts, new Comparator<ScriptingBaseScript>() {
+
+                @Override
+                public int compare(ScriptingBaseScript o1, ScriptingBaseScript o2) {
+                    return getScriptOrderKey(o2).compareToIgnoreCase(getScriptOrderKey(o1));
+                }
+            });
+        }
+
+        protected void executeScripts(List<ScriptingScript> scripts, SimpleTaskStatus status) {
+            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
+            final I18nManager i18nManager = ToolsLocator.getI18nManager();
+            if (scripts != null && !scripts.isEmpty()) {
+                if (status != null) {
+                    status.setRangeOfValues(0, scripts.size());
+                }
+                int n = 0;
+                for (ScriptingBaseScript script : scripts) {
+                    if (status != null) {
+                        status.setCurValue(n++);
+                    }
+                    try {
+                        LOGGER.info("running " + title + " script '" + script.getFile().getAbsolutePath() + "' (" + getScriptOrderKey(script) + ", " + script.getIsolationGroup() + ").");
+                        dialogs.message(
+                                i18nManager.getTranslation(
+                                        "_Running_autorun_script_from_XnameX",
+                                        new String[]{
+                                            script.getFile().getParentFile().getName()}
+                                ),
+                                JOptionPane.INFORMATION_MESSAGE
+                        );
+                    } catch (Exception ex) {
+                        // Ignore it
+                    }
+                    try {
+                        // Hacemos un reload por si un sript deshabilito a otro.
+                        script.reload();
+                        if( script.isEnabled() ) {
+                            script.run();
+                        } else {
+                            LOGGER.info("Skip " + title + " script '" + script.getFile().getAbsolutePath() + "' (" + getScriptOrderKey(script) + ", " + script.getIsolationGroup() + ").");
+                        }
+                    } catch (Exception ex) {
+                        LOGGER.warn("Can't execute " + title + " from '" + script.getFile().getAbsolutePath() + "'.", ex);
+                    }
+                }
+            }
+
+        }
+    }
+
+    private class ExecuteScriptsFromFilesystem extends AbstractExecuteScripts {
+
+        public ExecuteScriptsFromFilesystem(List<File> pluginsFolder, String title, String patternName) {
+            super(pluginsFolder, title, patternName);
+        }
+
+        @Override
+        public void run() {
+            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
+            executingAutorunScripts = true;
+            try {
+                final ScriptingManager manager = ScriptingLocator.getManager();
+                manager.loadEngines();
+
+//                final PluginsManager pluginManager = PluginsLocator.getManager();
+                final I18nManager i18nManager = ToolsLocator.getI18nManager();
+
+                final List<ScriptingScript> scripts = new ArrayList<>();
+
+                List<File> pluginsFolders = new ArrayList<>();
+                for (File pluginsFolders2 : this.getPluginsFolders()) {
+                    for (File pluginFolder : pluginsFolders2.listFiles()) {
+                        File f = FileUtils.getFile(pluginFolder, "scripting", "scripts");
+                        if (f.exists()) {
+                            pluginsFolders.add(f);
+                        }
+                    }
+                }
+
+                dialogs.message(
+                        i18nManager.getTranslation("_Searching_autorun_scripts_Xhorizontal_ellipsisX"),
+                        JOptionPane.INFORMATION_MESSAGE
+                );
+
+                SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
+                    @Override
+                    public FileVisitResult visitFile(Path path, BasicFileAttributes bfa) throws IOException {
+                        File file = path.toFile();
+                        if (FilenameUtils.wildcardMatch(file.getName(), patternName, IOCase.INSENSITIVE)) {
+                            if (file.exists()) {
+                                ScriptingScript script = (ScriptingScript) manager.getScript(file);
+                                if (script.isEnabled()) {
+                                    scripts.add(script);
+                                } else {
+                                    LOGGER.info("Skip " + title + " script '" + file.getAbsolutePath() + "'.");
+                                }
+                            }
+                        }
+                        return FileVisitResult.CONTINUE;
+                    }
+                };
+                try {
+                    EnumSet<FileVisitOption> opts = EnumSet.of(FOLLOW_LINKS);
+                    for (File pluginFolder : pluginsFolders) {
+                        Files.walkFileTree(Paths.get(pluginFolder.toURI()), opts, Integer.MAX_VALUE, visitor);
+                    }
+                    Files.walkFileTree(Paths.get(manager.getRootUserFolder().toURI()), opts, Integer.MAX_VALUE, visitor);
+                    List<ScriptingFolder> folders = manager.getAlternativeUserFolders();
+                    for (ScriptingFolder folder : folders) {
+                        Files.walkFileTree(Paths.get(folder.getFile().toURI()), opts, Integer.MAX_VALUE, visitor);
+                    }
+                } catch (Exception ex) {
+                    LOGGER.warn("Can't execute " + title + " in home.", ex);
+                }
+                sortScripts(scripts);
+                executeScripts(scripts, null);
+
+            } finally {
+                LOGGER.info("Running " + title + " scripts terminated.");
+                dialogs.message("", JOptionPane.INFORMATION_MESSAGE);
+                executingAutorunScripts = false;
+            }
+            checkDataFoldersVersions();
+        }
+
+    }
+    
+    private void checkDataFoldersVersions() {
+        final ScriptingManager manager = ScriptingLocator.getManager();
+        PackageManager versionFactory = ToolsLocator.getPackageManager();
+        Version currentVersion = versionFactory.createVersion(this.appversion);
+        FolderSet folders = new DefaultFolderSet();
+        folders.add(this.pluginHomeFolder);
+        final List<DataFolderFound> dataFoldersFound = manager.searchOldVersions(currentVersion, folders);
+        if( dataFoldersFound == null || dataFoldersFound.isEmpty() ) {
+            return;
+        }
+        Runnable askUser = new Runnable() {
+            @Override
+            public void run() {
+                WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
+                final DataFoldersRecoverPanel panel = new DataFoldersRecoverPanel(dataFoldersFound);
+                final Dialog dialog = winManager.createDialog(
+                        panel,
+                        "Recuperacion de preferencias",
+                        null,
+                        WindowManager_v2.BUTTONS_OK_CANCEL
+                );
+                dialog.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
+                            List<DataFolderFound> toRestore = panel.getSelectedDataFolders();
+                            for (DataFolderFound dataFolderFound : dataFoldersFound) {
+                                if (toRestore.contains(dataFolderFound)) {
+                                    dataFolderFound.restore();
+                                } else {
+                                    dataFolderFound.leave();
+                                }
+                            }
+                        }
+                    }
+                });
+                dialog.show(WindowManager.MODE.WINDOW);
+            }
+        };
+        if( SwingUtilities.isEventDispatchThread() ) {
+            askUser.run();
+        } else {
+            SwingUtilities.invokeLater(askUser);
+        }
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingMain.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingMain.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/ScriptingMain.java	(revision 1126)
@@ -0,0 +1,202 @@
+package org.gvsig.scripting.app.extension;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.swing.UIManager;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.PosixParser;
+import org.apache.commons.io.FileUtils;
+import org.gvsig.about.AboutLocator;
+import org.gvsig.about.AboutManager;
+import org.gvsig.scripting.ScriptingManager;
+import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
+import org.gvsig.scripting.swing.api.ScriptingUIManager;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.exception.BaseException;
+import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
+import org.gvsig.tools.packageutils.PackageInfo;
+import org.gvsig.tools.packageutils.PackageManager;
+import org.gvsig.tools.packageutils.Version;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+public class ScriptingMain {
+
+    private File applicationFolder = null;
+    private Version applicacionVersion = null;
+    private List<File> pluginsFolder = null;
+    private File applicationHomeFolder;
+    private File installFolder;
+    private int applicacionBuildNumber;
+
+    private ScriptingUtils utils;
+
+    public static void main(String args[]) throws Exception {
+        ScriptingMain main = new ScriptingMain();
+        main.doMain(args);
+    }
+    
+    public File getApplicationFolder() {
+        if (applicationFolder == null) {
+            applicationFolder = new File(System.getProperty("user.dir"));
+        }
+        return applicationFolder;
+    }
+
+    public File getApplicationHomeFolder() {
+        if (applicationHomeFolder == null) {
+            applicationHomeFolder = new File(System.getProperty("user.home"));
+        }
+        return applicationHomeFolder;
+    }
+
+    public File getInstallFolder() {
+        if (installFolder == null) {
+            installFolder = FileUtils.getFile(getApplicationFolder(), "install");
+        }
+        return this.installFolder;
+    }
+
+    public Version getApplicationVersion() throws BaseException {
+        if (applicacionVersion == null) {
+            PackageManager packageManager = ToolsLocator.getPackageManager();
+            PackageInfo packageInfo = packageManager.createPackageInfo(
+                    new File(this.applicationFolder, "package.info")
+            );
+            applicacionVersion = (Version) packageInfo.getVersion();
+        }
+        return applicacionVersion;
+    }
+
+    public int getApplicationBuildNumber() throws BaseException {
+        if (applicacionBuildNumber == 0) {
+            applicacionBuildNumber = getApplicationVersion().getBuild();
+        }
+        return this.applicacionBuildNumber;
+    }
+
+    public List<File> getPluginsFolder() {
+        List<File> folders = new ArrayList<>();
+        folders.add(FileUtils.getFile(this.getApplicationFolder(), "gvSIG", "extensiones"));
+        folders.add(FileUtils.getFile(this.getApplicationHomeFolder(), "gvSIG", "installation", "gvSIG", "extensiones"));
+        return folders;
+    }
+
+    public File getPluginHomeFolder() {
+        File f = this.getApplicationHomeFolder();
+        f = FileUtils.getFile(f, "gvSIG", "plugins", "org.gvsig.scripting.app.mainplugin");
+        return f;
+    }
+
+    private void initializeAbout() throws Exception {
+        AboutManager aboutManager = AboutLocator.getManager();
+
+        String build = String.valueOf(this.getApplicationBuildNumber());
+        String version = this.getApplicationVersion().toString();
+        
+        Map<String, String> gvsig_vars = new HashMap<>();
+        gvsig_vars.put("version", version);
+        gvsig_vars.put("build", build);
+        aboutManager.setProject(
+                "gvSIG Desktop", 
+                getResource("gvsig.html"),
+                null, 
+                gvsig_vars);
+        aboutManager.getProject().set("build", build);
+
+        aboutManager.addSponsor(
+                "Generalitat Valenciana",
+                getResource("gva.html"), 
+                1);
+
+        aboutManager.addDeveloper(
+                "gvSIG Asocicion",
+                getResource("gvSIG-asociacion.html"), 
+                2);
+
+    }
+
+    public void doMain(String args[]) throws Exception {
+
+        String lookAndFeel = "com.jgoodies.looks.plastic.PlasticXPLookAndFeel";
+        try {
+            UIManager.setLookAndFeel(lookAndFeel);
+        } catch(Throwable th) {
+            
+        }
+        
+        new DefaultLibrariesInitializer().fullInitialize();
+
+        initializeAbout();
+
+        this.utils = new ScriptingUtils();
+        this.utils.initializaPaths(
+                this.getPluginsFolder(),
+                this.getInstallFolder(),
+                this.getPluginHomeFolder(),
+                this.getApplicationVersion().format("%M.%m.%r")
+        );
+
+        ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
+        ScriptingManager manager = uimanager.getManager();
+
+        Options options = new Options();
+        options.addOption("d",
+                "debug",
+                false,
+                "");
+        options.addOption("p",
+                "pause",
+                false,
+                "");
+        options.addOption("l",
+                "launcher",
+                false,
+                "Show the launcher window");
+        options.addOption("c",
+                "composer",
+                false,
+                "Show the composer window");
+        options.addOption("r",
+                "run",
+                true,
+                "Run the specified script");
+        options.addOption("h",
+                "home",
+                true,
+                "Specify for the home of the script framework");
+        CommandLineParser parser = new PosixParser();
+        CommandLine line = null;
+        boolean runLauncherAtEnd = true;
+        
+        line = parser.parse(options, args);
+        if (line.hasOption("home")) {
+            manager.setHomeFolder(new File(line.getOptionValue("home")));
+        }
+        if (line.hasOption("composer")) {
+            runLauncherAtEnd = false;
+            utils.runComposer();
+        }
+        if (line.hasOption("run")) {
+            runLauncherAtEnd = false;
+            utils.runScript(line.getOptionValue("run"), line.getArgs());
+        }
+        if( runLauncherAtEnd ) {
+            utils.runLauncher();
+        }
+    }
+
+    private URL getResource(String name) {
+        URL resource = this.getClass().getResource(name);
+        return resource;
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanelView.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanelView.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanelView.xml	(revision 1126)
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/datos/devel/org.gvsig.scripting/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension/DataFoldersRecoverPanelView.xml</at>
+   <at name="rowspecs">CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblMsg1</at>
+            <at name="width">583</at>
+            <at name="text">&lt;html&gt;Han sido encontradas preferencias de versiones anteriores para algunos complementos.&lt;/html&gt;</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblMsg2</at>
+            <at name="width">583</at>
+            <at name="text">&lt;html&gt;Seleccione los complementos para los que desea recuperar las preferencias de versiones anteriores&lt;/html&gt;</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JList</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JList</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="scrollableTracksViewportHeight">true</at>
+            <at name="scrollableTracksViewportWidth">true</at>
+            <at name="name">lstDataFolders</at>
+            <at name="width">581</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">20</at>
+              <at name="horizontalpolicy">30</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="height">289</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">22</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtOldFolder</at>
+            <at name="width">583</at>
+            <at name="enabled">false</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">20</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblRestoreFromFolder</at>
+            <at name="width">583</at>
+            <at name="text">Recuperar desde la carpeta</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblApplication</at>
+            <at name="width">583</at>
+            <at name="text">Applicacion</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">10</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtApplication</at>
+            <at name="width">583</at>
+            <at name="enabled">false</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">18</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtPath</at>
+            <at name="width">583</at>
+            <at name="enabled">false</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">16</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblPath</at>
+            <at name="width">583</at>
+            <at name="text">Ruta</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">12</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblPath</at>
+            <at name="width">583</at>
+            <at name="text">Preferencias</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">14</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtPreferencias</at>
+            <at name="width">583</at>
+            <at name="enabled">false</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="23">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="9">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="10">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="11">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="12">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="13">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="14">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="15">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="16">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="17">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="18">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="19">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="20">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="21">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="22">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/java/org/gvsig/scripting/app/extension
___________________________________________________________________
Added: svn:ignore
   + .directory


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/gvsigsh
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/gvsigsh	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/gvsigsh	(revision 1126)
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+#set -x
+
+cd $(dirname $0)
+
+if [ -f lib/org.gvsig.andami-2* ] ; then
+  GVSIG_INSTALL_FOLDER=`dirname "$0"`
+else
+  if [ -f lib/org.gvsig.scripting.app.mainplugin-* ] ; then
+    GVSIG_INSTALL_FOLDER=`dirname "$0"`/../../..
+  else
+    echo "Can't locate gvSIG installation folder"
+    exit 1
+  fi
+fi
+
+cd "${GVSIG_INSTALL_FOLDER}"
+
+GVSIG_INSTALL_FOLDER="$PWD"
+
+. ./gvSIG.sh --lib $@
+
+for pluginName in \
+    org.gvsig.app.document.table.app.mainplugin \
+    org.gvsig.app.mainplugin \
+    org.gvsig.csv.app.mainplugin \
+    org.gvsig.geodb.app.mainplugin \
+    org.gvsig.geometry.app.jts \
+    org.gvsig.h2spatial.app.mainplugin \
+    org.gvsig.installer.app.mainplugin \
+    org.gvsig.labeling.app.mainplugin \
+    org.gvsig.projection.app.proj4j \
+    org.gvsig.scripting.app.mainplugin \
+    org.gvsig.shp.app.mainplugin \
+    org.gvsig.snapping.app.mainplugin \
+    ;
+    do
+    for i in "$GVSIG_INSTALL_FOLDER/gvSIG/extensiones/$pluginName/lib/"*.jar ; do
+      if [ "$i" != "$GVSIG_INSTALL_FOLDER/gvSIG/extensiones/$pluginName/lib/*.jar" -a "$i" != "" ]; then
+        add_classpath "$i"
+      fi
+    done
+    for i in "$GVSIG_INSTALL_FOLDER/gvSIG/extensiones/$pluginName/lib/"*.zip ; do
+      if [ "$i" != "$GVSIG_INSTALL_FOLDER/gvSIG/extensiones/$pluginName/lib/*.zip" -a "$i" != "" ]; then
+        add_classpath "$i"
+      fi
+    done
+done
+
+GVSIG_LAUNCHER=org.gvsig.scripting.app.extension.ScriptingMain
+GVSIG_PARAMS="$@"
+
+launch_gvSIG
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/plugin-persistence.def
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/plugin-persistence.def	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/plugin-persistence.def	(revision 1126)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!--
+Definitions of plugin persistence org.gvsig.scripting.app.mainplugin.
+ -->
+<definitions>
+  <version>1.0.0</version>
+  <classes>
+    <class name="org.gvsig.scripting.app.mainplugin">
+      <description>Persistence of scripting plugin</description>
+      <fields>
+        <field name="ComposerUseHisWindowManager" type="boolean" mandatory="true" defaultValue="true">
+          <description>When true the composer use his window manager instead of the gvSIG Window manager.</description>
+        </field>
+      </fields>
+    </class>
+  </classes>
+</definitions>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/i18n/text.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/i18n/text.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/i18n/text.properties	(revision 1126)
@@ -0,0 +1,142 @@
+_Scripting=Scripting
+_Show_scripting_launcher=Abrir lanzador de scripts
+_Show_scripting_composer=Abrir editor de scripts
+_Show_scripting_jython_console=Abrir consola Jython
+
+User=Usuario
+System=Sistema
+
+Accept=Aceptar
+Cancel=Cancelar
+Apply=Aplicar
+
+Retrieving_data=Recibiendo datos...
+
+File=Fichero
+New=Nuevo
+Close_document=Cerrar documento
+Close_all_documents=Cerrar todos los documentos
+Run=Ejecutar
+Save=Guardar
+Close=Cerrar
+Close_current_tab=Cerrar pesta\u00f1a actual
+Open_edition_mode=Abrir modo edici\u00f3n
+Run_selected_script=Ejecutar script seleccionado
+Delete_selected_script=Borrar script seleccionado
+Refresh_directories=Actualizar carpetas
+Move_files=Mover ficheros
+Set_file_preferences=Editar preferencias de fichero
+
+
+Edit=Editar
+Cut=Cortar
+Copy=Copiar
+Paste=Pegar
+Select_all=Seleccionar todo
+
+Tools=Herramientas
+Launcher=Lanzador de scripts
+Scripting_Launcher=Lanzador de scripts
+Scripting_Composer=Editor de scripts
+Jython_Console=Consola Jython
+Import_JavaDoc=Importar JavaDoc
+JavaDoc=Ayuda de Java (JavaDoc)
+Remove_JavaDoc=Eliminar JavaDoc
+Help_contents=Contenido de la ayuda
+About_scripts_editor=Acerca del editor de scripts
+Get_help=Ayuda
+Help=Ayuda
+_Package_script=Empaquetar script...
+_Package_help=Empaquetar ayuda...
+
+Problems=Errores
+Console=Consola
+
+Description=Descripci\u00f3n
+Resource=Recurso
+Location=Ubicaci\u00f3n
+
+no_line=sin l\u00ednea
+Line=L\u00ednea
+
+Welcome_message=Bienvenido al entorno de scripting
+
+Error_opening_in_edition_mode_title=Error al abrir fichero
+Error_opening_in_edition_mode=No se pudo abrir el fichero en modo edici\u00f3n
+
+New_Script=Nuevo elemento
+New_Script_Description=Crea un nuevo script, di\u00e1logo, proyecto, directorio
+
+Deleting_JavaDocs_successfully_title=Operaci\u00f3n realizada con \u00e9xito
+Deleting_JavaDocs_successfully=Eliminaci\u00f3n de los JavaDocs exitosa
+
+Import_JavaDoc_title=Importar JavaDocs desde los directorios de sistema al ScriptingFramework JavaDoc
+Remove_JavaDoc_title=Eliminar JavaDocs del ScriptingFramework JavaDoc
+
+projects_modified_title=Proyectos sin guardar
+projects_modified=Algunos proyectos han sido modificados.\u00bfSalvar cambios?
+project_modified=ha sido modificado.\u00bfSalvar cambios?
+
+Delete_all_title=Borrar el documento
+Delete_all_message=Esta acci\u00f3n elimina el documento o el directorio con todo su contenido. \u00bf Desea continuar ?
+
+About_us_title=Informaci\u00f3n de todos los contribuidores al proyecto gvSIG
+
+Success=Operaci\u00f3n realizada con \u00e9xito
+Error=Error
+Error_renaming=Inesperado error renombrando el fichero
+Error_moving=Inesperado error moviendo el fichero
+Error_help=Selecciona una ayuda
+Rename_succesfully=Renombrado del fichero realizado con \u00e9xito
+Select_first=Debe seleccionar un fichero primero
+help_key=No hay ayuda para el texto
+
+
+script_filesystem=script en el \u00e1rbol de directorio
+Move=Mover
+move_desc=Cambia la ubicaci\u00f3n del fichero seleccionado
+Rename=Renombrar
+rename_desc=Cambia el nombre y otras propiedades del fichero seleccionado
+Moving_succesfully=Reubicaci\u00f3n del fichero realizado con \u00e9xito
+
+Dialog=Di\u00e1logo
+Code=C\u00f3digo
+Properties=Propiedades
+
+current_name=Nombre actual
+new_name=Nuevo name
+rename_name_title=Cambiar el nombre del fichero
+more_properties=M\u00e1s propiedades
+
+Javadoc_remove=Selecciona el JavaDoc a eliminar
+no_Javadoc_remove=No hay JavaDoc para eliminar
+
+Name=Nombre
+Version=Versi\u00f3n
+Created_by=Creado por
+Description=Descripci\u00f3n
+Type=Tipo
+Language=Lenguaje
+Author=Autor
+Move_from=Mover desde
+Move_to=Destino
+Browse=Abrir
+Import_from=Importar desde
+
+Name_blank=El nombre no puede estar en blanco
+Name_exists=Este nombre ya existe. Debe elegir otro
+Import_success=Los JavaDocs se han importado satisfactoriamente
+JavaDoc_Error=Selecciona JavaDoc a importar
+
+go_to_line_Xhorizontal_ellipsisX=Ir a la l\u00ednea\u2026
+find_Xhorizontal_ellipsisX=Buscar\u2026
+replace_Xhorizontal_ellipsisX=Reemplazar\u2026
+_Searching_autorun_scripts_Xhorizontal_ellipsisX=Buscando scripts de autoarranque...
+_Running_autorun_script_from_XnameX=Ejecutando script de autoarranque desde "{0}"
+_The_script_XscriptnameX_is_modified=El script "{0}" ha sido modificado.
+_Save_changes_XquestionX=\u00bf Guardar cambios ?
+_Do_you_want_to_save_changes_XquestionX=\u00bf Desea guardar los cambios ?
+
+_notice=Aviso
+_Initializing_the_scripting_plugin_Xhorizontal_ellipsisX=Inicializando el plugin de scripting...
+_Waiting_to_terminate=Esperando que termine.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties	(revision 1126)
@@ -0,0 +1,144 @@
+_Scripting=Scripting
+_Show_scripting_launcher=Show scripting launcher
+_Show_scripting_composer=Show scripting composer
+_Show_scripting_jython_console=Show Jython console
+
+User=User
+System=System
+
+Accept=Accept
+Cancel=Cancel
+Apply=Apply
+
+Retrieving_data=Retrieving data...
+
+File=File
+New=New
+Close_document=Close document
+Close_all_documents=Cloase all documents
+Run=Run
+Save=Save
+Close=Close
+Close_current_tab=Close current tab
+Open_edition_mode=Open edition mode
+Run_selected_script=Run selected script
+Delete_selected_script=Delete selected script
+Refresh_directories=Refresh directories
+Move_files=Move files
+Set_file_preferences=Set file preferences
+_Running_autorun_script_from_XnameX=Running autorun script from {0}
+
+Edit=Edit
+Cut=Cut
+Copy=Copy
+Paste=Paste
+Select_all=Select all
+
+Tools=Tools
+Launcher=Scripting Launcher
+Scripting_Launcher=Scripting Launcher
+Scripting_Composer=Scripting Composer
+Jython_Console=Jython console
+Import_JavaDoc=Import JavaDoc
+JavaDoc=Java Help (JavaDoc)
+Remove_JavaDoc=Remove JavaDoc
+Help_contents=Help contents
+About_scripts_editor=About scripts editor
+Get_help=Help
+Help=Help
+_Package_script=Package script...
+_Package_help=Package help...
+
+Problems=Errors
+Console=Console
+
+Description=Description
+Resource=Resource
+Location=Location
+
+no_line=no line
+Line=Line
+
+Welcome_message=Welcome to the scripting framework
+
+Error_opening_in_edition_mode_title=Error opening file in edition mode
+Error_opening_in_edition_mode=The file can't be opened in edition mode
+
+New_Script=New element
+New_Script_Description=Create a new script, dialog, project, directory
+
+Deleting_JavaDocs_successfully_title=Operation successful
+Deleting_JavaDocs_successfully=Deleting JavaDocs successfully
+
+Import_JavaDoc_title=Import JavaDocs from filesystem to ScriptingFramework JavaDoc
+Remove_JavaDoc_title=Remove JavaDocs from ScriptingFramework JavaDoc
+
+projects_modified_title=Projects without saving
+projects_modified=Some projects have been modified. Save changes?
+project_modified=has been modified. Save changes?
+
+Delete_all_title=Delete document
+Delete_all_message=This action removes the document or directory with all its content. Do you wish to continue ?
+
+About_us_title=Information about all the gvSIG's contributors
+
+Success=Operation done successfully
+Error=Error
+Error_renaming=Unexpected error renaming the file
+Error_moving=Unexpected error moving the file
+Error_help=Select help
+Rename_succesfully=Renaming successfully
+Select_first=Select a file first
+help_key=There isn't any help to this text
+
+
+script_filesystem=script filesystem
+Move=Move
+move_desc=Change location of selected file
+Rename=Rename
+rename_desc=Change the name and more properties of the selected file
+Moving_succesfully=File moved succesfully
+
+Dialog=Dialog
+Code=Code
+Properties=Properties
+
+current_name=Current name
+new_name=New name
+rename_name_title=Change filename
+more_properties=more properties
+
+Javadoc_remove=Choose JavaDoc to delete
+no_Javadoc_remove=There's no JavaDoc to delete
+
+Name=Name
+Version=Version
+Created_by=Create by
+Description=Description
+Type=Type
+Language=Language
+Author=Author
+Move_from=Move from
+Move_to=Move to
+Browse=Browse
+Import_from=Import from
+
+Name_blank=Name can't be blank
+Name_exists=This name already exists. Choose another one
+Import_success=JavaDocs imported successfully
+JavaDoc_Error=Select JavaDoc to import
+
+
+go_to_line_Xhorizontal_ellipsisX=Go To Line\u2026
+find_Xhorizontal_ellipsisX=Find\u2026
+replace_Xhorizontal_ellipsisX=Replace\u2026
+
+_Searching_autorun_scripts_Xhorizontal_ellipsisX=Searching autorun scripts...
+_Running_autorun_script_from_XnameX=Running autorun script from "{0}"
+_The_script_XscriptnameX_is_modified=The script "{0}" has been modified.
+_Save_changes_XquestionX=Save changes ?
+_Do_you_want_to_save_changes_XquestionX=Do you want to save changes ?
+
+_notice=Notice
+_Initializing_the_scripting_plugin_Xhorizontal_ellipsisX=Initializing the scripting plugin...
+_Waiting_to_terminate=Waiting to terminate.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/License_Chalkwork_icons.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/License_Chalkwork_icons.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/License_Chalkwork_icons.txt	(revision 1126)
@@ -0,0 +1,188 @@
+----------------------------------------------
+CHALKWORK BASIC
+by Dave Shea
+mezzoblue.com/icons/chalkwork/basic
+----------------------------------------------
+CHALKWORK COMMERCE
+by Dave Shea
+mezzoblue.com/icons/chalkwork/commerce
+----------------------------------------------
+CHALKWORK EDITING CONTROLS
+by Dave Shea
+mezzoblue.com/icons/chalkwork/editing-controls
+----------------------------------------------
+CHALKWORK INFORMATION MANAGEMENT
+by Dave Shea
+mezzoblue.com/icons/chalkwork/information-management
+----------------------------------------------
+CHALKWORK HTML (Free Version)
+by Dave Shea
+mezzoblue.com/icons/chalkwork/html
+----------------------------------------------
+
+Thanks for your interest in the Chalkwork Family. Please consider subscribing to the Chalkwork news feed, which will announce new releases in the family as well as inform existing users of updates if any occur.
+
+	http://mezzoblue.com/icons/chalkwork/news.xml
+
+- Dave Shea
+  mezzoblue.com
+  @mezzoblue on Twitter
+
+
+
+
+LICENSE AGREEMENT
+----------------------------------------------
+By downloading this icon set, you agree to abide by the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License under which these icons are being made available for non-commercial use.
+
+	Applicable Creative Commons License: http://creativecommons.org/licenses/by-nc-sa/3.0/
+	Attribution and additional license information: http://www.mezzoblue.com/icons/license/#license-cc
+
+By purchasing a Chalkwork Commercial License, you agree to abide by the Chalkwork Royalty-Free Stock Icon License Agreement under which these icons are being made available for commercial use.
+
+	Chalkwork Commercial License: http://www.mezzoblue.com/icons/license/#license-cc
+
+This notice must be included any time these icons are redistributed.
+
+
+
+
+----------------------------------------------
+ICON FOLDER INDEX
+----------------------------------------------
+The icon files are broken down by file format. Due to some formats resulting in higher quality results, those are considered the preferred files and are located in the folder titled 'High Quality'. This package should contain the following folders in this hierarchy:
+
+High Quality
+    ICNS (Mac)
+    ICO (Windows)
+    PNG
+    TIF
+Lower Quality
+    BMP
+    GIF
+
+Within each of the second-level folders, you'll find 102 further folders, one for each icon and its variations. Depending on the file format, you may find multiple sizes within these folders along with any icon variations that may exist. Please note that ICO and ICNS files contain all applicable sizes within a single file, and that ICNS files do not support the 24x24 icon size.
+
+
+----------------------------------------------
+CHALKWORK INFORMATION MANAGEMENT ICON INDEX
+* indicates that variations of this icon are provided within this set
+---------------------------------------------------------------------
+
+Ad
+	- Ad (Dollars) *
+	- Ad (Euros) *
+	- Ad (Pounds) *
+Address Book *
+Announcement *
+API
+Archive *
+Attachment *
+Authenticate
+Blog *
+Bookmark *
+Briefcase *
+Category *
+Chart (Area) *
+Chart (Bar) *
+Chart (Pie) *
+Collapse
+Colour Palette *
+Continue
+Control Panel
+Conversation *
+Create
+Dashboard *
+Database *
+Dictionary *
+Document (Area Chart) *
+Document (Bar Chart) *
+Document (Blank) *
+Document (Form) *
+Document (Photo) *
+Document (Pie Chart) *
+Document (Secure) *
+Document (Shred)
+Documents (x2) *
+Documents (x3) *
+Download
+Draw
+Entry *
+Excerpt *
+Expand
+Export
+Fax *
+File *
+	- File (Closed)
+	- File (Open)
+Filter *
+Flag *
+Flag (Black) *
+Flag (Blue) *
+Flag (Brown) *
+Flag (Green) *
+Flag (Light Blue) *
+Flag (Orange) *
+Flag (Pink) *
+Flag (Purple) *
+Flag (Red) *
+Flag (White) *
+Flag (Yellow) *
+Formatting
+Hierarchy *
+Import
+Inbox *
+Index *
+List *
+Log *
+Map *
+Mobile Phone *
+Moderate
+Module *
+News *
+Notes *
+Notification *
+Office *
+Package *
+Password
+Phone *
+	- Phone (Batphone) *
+	- Phone (Office) *
+Plugin *
+Preview
+Publish
+Read More
+Rebuild
+Relationship (Data) *
+Relationship (People) *
+Rotate Left
+Rotate Right
+Schedule *
+	- Schedule (Noun)
+	- Schedule (Verb)
+Script *
+Security *
+Sign In
+Sign Out
+Sort Down
+Sort Up
+Spam *
+Statistics *
+Status *
+	- Status (Green)
+	- Status (Off)
+	- Status (On)
+	- Status (Red)
+	- Status (Yellow)
+Support *
+Sync
+Template *
+Ticket *
+Time Zone *
+Tools *
+Trackback
+View (Columns)
+View (Lists)
+View (Thumbnails)
+Weather *
+Write
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/package.rst
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/package.rst	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/package.rst	(revision 1126)
@@ -0,0 +1,44 @@
+
+This plugin provides support for scripting to gvSIG.
+Among other things it contains:
+
+- The gvSIG scripting engine
+- The gvSIG script editor
+- Script engines for:
+   - Jython
+   - Groovy
+   - javascript
+   - Renjin
+
+- The script install module for the add-on manager.
+- Utilities to generate packages of complements with our scripts.
+- Python libraries as:
+   - Six - Utilities for writing code that runs on Python 2 and 3
+   - PyLint - Python source code analyzer
+   - Pygments - syntax highlighting package
+   - CSSUtils - CSS Cascading Style Sheets library
+   - Docutils - Python Documentation Utilities
+   - geopy - client for several popular geocoding web services
+   - PyInliner - CSS-to-inline-styles conversion tool for HTML
+   - Statistics - functions for calculating statistics of data
+   - Cartodb - simple CartoDB client to perform requests against the CartoDB API
+
+- Java libraries to use from scripting as:
+   - Abeille forms deseigner
+   - jOpenDocument
+   - JNumeric
+   - CSSBox
+
+This plugin can be configured to be preinstalled automatically, allowing 
+"Script" type plugins to be installed during the application installation process. 
+To do this, the following entries must be added to the "packages.properties" 
+of gvspks::
+
+    installers=scripts
+    installer.scripts.initializer=org.gvsig.scripting.app.extension.ScriptsInstallerInitializer
+    installer.scripts.package.code=org.gvsig.scripting.app.mainplugin
+    installer.scripts.factory.name=Script
+    installer.scripts.libs=lib
+
+If the "installers" entry already exists, add "scripts" to the end separating 
+it with a space.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/geom.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/geom.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/geom.py	(revision 1126)
@@ -0,0 +1,196 @@
+# -*- coding: utf-8 -*-
+#
+# File: gvsig.py
+#
+# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
+#
+# GNU General Public License (GPL)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+#
+
+"""
+Utility functions to manage gvSIG geometries
+"""
+
+__author__ = """Antonio Carrasco Valero
+Model Driven Development sl and Antonio Carrasco Valero
+<carrasco@modeldd.org>
+Victor Acevedo Royer <vacevedo@gvsig.com> <vacevedor@gmail.com>
+"""
+
+__docformat__ = 'plaintext'
+
+
+from org.gvsig.fmap.geom import Geometry, GeometryLocator
+from org.gvsig.fmap.geom.primitive import Point
+from org.gvsig.tools import ToolsLocator
+
+
+#GeometryTypes
+AGGREGATE = Geometry.TYPES.AGGREGATE
+ARC = Geometry.TYPES.ARC
+CIRCLE = Geometry.TYPES.CIRCLE
+CURVE = Geometry.TYPES.CURVE
+ELLIPSE = Geometry.TYPES.ELLIPSE
+ELLIPTICARC = Geometry.TYPES.ELLIPTICARC
+GEOMETRY = Geometry.TYPES.GEOMETRY
+MULTICURVE = Geometry.TYPES.MULTICURVE
+MULTIPOINT = Geometry.TYPES.MULTIPOINT
+MULTISOLID = Geometry.TYPES.MULTISOLID
+MULTISURFACE = Geometry.TYPES.MULTISURFACE
+NULL = Geometry.TYPES.NULL
+POINT = Geometry.TYPES.POINT
+SOLID =  Geometry.TYPES.SOLID
+SPLINE = Geometry.TYPES.SPLINE
+SURFACE = Geometry.TYPES.SURFACE
+
+# Common named geometry types
+POLYGON = Geometry.TYPES.SURFACE
+LINE = Geometry.TYPES.CURVE
+MULTILINE = Geometry.TYPES.MULTICURVE
+MULTIPOLYGON = Geometry.TYPES.MULTISURFACE
+
+# geometrySubTypes 
+D2 = Geometry.SUBTYPES.GEOM2D
+D2M = Geometry.SUBTYPES.GEOM2DM
+D3 = Geometry.SUBTYPES.GEOM3D
+D3M = Geometry.SUBTYPES.GEOM3DM
+UNKNOWN = Geometry.SUBTYPES.UNKNOWN
+ 
+def createGeometry(type, subtype=D2):
+    """
+    Returns a new geometry with a concrete type and subtype or None if can't 
+    create geometry.
+    :param type: geometry type
+    :type type: string
+    :param subtype: geometry subtype
+    :type type: string
+    :return: geometry
+    :rtype: geometry
+    """
+    try:
+        geometryManager = GeometryLocator.getGeometryManager()
+        geometry = geometryManager.create(type, subtype)
+    except:
+        return None
+    return geometry
+  
+def createPoint(x=0, y=0, subtype=D2):
+    """
+    Returns a new point with a subtype and sets the value for the X and the Y 
+    coordinates (default 0,0) or None if can't create point
+    :param x: X coordinate value 
+    :param y: Y coordinate value
+    :type x: double
+    :type y: double
+    :return: Point
+    :rtype: Point      
+    """
+    try:
+        geometryManager = GeometryLocator.getGeometryManager()
+        point = geometryManager.createPoint(x, y, subtype)
+    except:
+        return None
+        
+    return point
+
+def createMultiPoint(subtype=D2, points=None):
+    """
+    Returns a new multipoint with a subtype from a list of Points instances. 
+    Also values of X and Y tuples like ([x1, y1], [x2, y2], ...., [xn, yn]) are 
+    allowed. If not points returns empty multipoint geometry. If can't create 
+    geometry return None.
+    :param points: list of points
+    :type points: list
+    :return: multipoint
+    :rtype: multipoint
+    """
+    multipoint = createGeometry(MULTIPOINT, subtype)
+    if all(points, multipoint):
+        try:
+            for point in points: 
+                multipoint.addPrimitive(point)
+        except:
+            return None
+    
+    return multipoint 
+
+def createPolygon(subtype=D2, vertexes=None):  
+    """
+    Returns a new polygon with a subtype. Or None if can't create the geometry
+    :return: polygon
+    :rtype: Geometry    
+    """  
+    polygon = createGeometry(SURFACE, subtype)
+    if all(vertexes, polygon):
+        try:
+            for vertex in vertexes:
+                polygon.addPoint(vertex)
+            polygon.closePrimitive()
+        except:
+            return None  
+    return polygon
+
+def createMultiPolygon(subtype=D2, polygons=None):  
+    """
+    Returns a new multipolygon with a subtype. or None if can't create geometry
+    :return: multipolygon
+    :rtype: Geometry
+    """  
+    multipolygon = createGeometry(MULTISURFACE, subtype)
+    return multipolygon  
+  
+def createLine(subtype=D2, vertexes=None):  
+    """
+    Returns a new line with a subtype or None if can't create geometry
+    :return: polygon
+    :rtype: Geometry
+    """  
+    line = createGeometry(CURVE, subtype)
+    return line
+
+def createMultiLine(subtype=D2, lines = None):  
+    """
+    Create a new multiline with a subtype or None if can't create geometry
+    :return: multiline
+    :rtype: Geometry
+    """  
+    multiline = createGeometry(MULTILINE, subtype)
+    return multiline
+  
+def createEnvelope(pointMax=None, pointMin=None, dimension=2):
+    """
+    Returns envelope as a minimum bounding box or rectangle. This envelope is 
+    equivalent to the GM_Envelope specified in ISO 19107. 
+    :param pointMax: 
+    :type pointMax: geometry POINT
+    :param pointMin: 
+    :type pointMin: geometry POINT
+    """
+    geometryManager = GeometryLocator.getGeometryManager()
+  
+    if all((pointMax, pointMin)):
+        envelope = geometryManager.createEnvelope(pointMax, pointMin)
+    else:
+        envelope = geometryManager.createEnvelope()    
+  
+    return envelope
+    
+
+def main():
+  point = createPoint(1,1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/simpleui.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/simpleui.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/simpleui.py	(revision 1126)
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-
+#
+# File: simpleui.py
+#
+# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
+#
+# GNU General Public License (GPL)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+#
+
+__author__ = """Antonio Carrasco Valero
+Model Driven Development sl and Antonio Carrasco Valero
+<carrasco@modeldd.org>"""
+__docformat__ = 'plaintext'
+
+
+from gvsig import *
+
+def loadViewsInCombo(dialog, combo):
+  cleanCombo(dialog, combo)
+  project = currentProject()
+  print "project"
+  views = project.getViews()
+  print "views"
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  print "combo"
+  if combo == None:
+    return
+  print "combo not None"
+  for view in views:
+    print "create view choice"
+    ch = dialog.create("choice")  
+    dialog.setString(ch, "name", view.getName())
+    dialog.setString(ch, "text", view.getName())
+    #FIXME
+    #--------------------
+    
+    dialog.putProperty(ch, "view", View(view))
+    #----------------------
+    dialog.add(combo, ch)
+  print "Finish add combo choices"
+  
+
+def loadLayersInCombo(dialog, combo, viewName):
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  p = currentProject()
+  view = p.getView(viewName)
+
+  if combo == None or view == None:
+    return
+  cleanCombo(dialog, combo)
+  
+  ls = view.getLayers()
+  try:
+    for i in xrange(len(ls)):
+      l = ls.getLayer(i)
+      ch = dialog.create("choice")  
+      dialog.setString(ch, "name", l.getName())
+      dialog.setString(ch, "text", l.getName())    #FIXME
+      #--------------------
+      dialog.putProperty(ch, "layer",Layer(l))
+      #----------------------
+
+      dialog.add(combo, ch)
+  except Exception, ex:
+    print "Error %s"%repr(ex)
+
+  
+  print "Finish add layers combo choices"
+
+def cleanCombo(dialog, combo):
+  print "cleanCombo"
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  if combo == None:
+    return
+  choices = dialog.getItems(combo)
+  if len(choices) >0:
+    for ch in choices:
+      dialog.remove(ch)
+
+def getSelectedView(dialog, combo):
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  choice = dialog.getSelectedItem(combo)
+  if choice == None:
+    return
+  viewName = dialog.getString(choice,"name")
+  #FIXME
+  """
+  project = currentProject()
+  view = project.getView(viewName)
+  """
+  view = dialog.getProperty(choice, "view")
+  return view
+
+def getSelectedViewName(dialog, combo):
+  v = getSelectedView(dialog, combo)
+  return v.getName()
+
+def getSelectedLayer(dialog, combo):
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  choice = dialog.getSelectedItem(combo)
+  if choice == None:
+    return
+  #FIXME
+  """
+  layerName = dialog.getString(choice,"name")
+  project = currentProject()
+  layer = project.getView(layerName)
+  """
+  layer = dialog.getProperty(choice,"layer")
+  print layer.getName()
+  return layer
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/commonsdialog.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/commonsdialog.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/commonsdialog.py	(revision 1126)
@@ -0,0 +1,203 @@
+# -*- coding: utf-8 -*-
+#
+# File: commonsdialog.py
+#
+# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
+#
+# GNU General Public License (GPL)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+#
+
+__author__ = """Antonio Carrasco Valero
+Model Driven Development sl and Antonio Carrasco Valero
+<carrasco@modeldd.org>
+Victor Acevedo Royer <vacevedo@gvsig.com> <vacevedor@gmail.com>
+"""
+__docformat__ = 'plaintext'
+
+
+from javax.swing import JFileChooser
+from javax.swing.filechooser import FileNameExtensionFilter
+
+#from org.gvsig.app import ApplicationLocator      
+
+from org.gvsig.andami.ui.mdiFrame import DefaultThreadSafeDialogs
+
+#====================================
+# SWING
+
+#
+#messageType options
+FORBIDEN = 0
+IDEA= 1
+WARNING= 2
+QUESTION= 3
+
+#
+#Confirmdialog optionType Options
+YES_NO = 0
+YES_NO_CANCEL = 1
+ACEPT_CANCEL = 2
+
+#filechooser options
+OPEN_FILE = 0
+OPEN_DIRECTORY = 1
+SAVE_FILE = 2
+
+#filechooser selectionMode
+FILES_ONLY = JFileChooser.FILES_ONLY
+DIRECTORIES_ONLY = JFileChooser.DIRECTORIES_ONLY
+
+
+def msgbox(message, title="", messageType=IDEA):
+    """Shows a message dialog with ok button only
+    :param message: text to present in the dialog
+    :param title: title of the dialog
+    :param messageType: type of icon to use.
+    """
+    DefaultThreadSafeDialogs().messageDialog(message, title, messageType)
+
+   
+def inputbox(message, title="", messageType=IDEA, initialValue=""):
+    """
+    Shows a input dialog.
+    :param message: text to present in the dialog
+    :param title: title of the dialog
+    :messageType: type of icon to use
+    :initialValue: Initial value of the inputbox  
+    """
+    return DefaultThreadSafeDialogs().inputDialog(message, title, 
+        messageType, initialValue) 
+  
+  
+def confirmDialog(message, title="", optionType=YES_NO, messageType=IDEA):
+    """
+    Create a message dialog with options button
+    :param message: text to present in the dialog
+    :param title: title of the dialog
+    :optionType: bottons to show
+    :param messageType: type of icon to use.    
+    """
+    #0: yes/no option
+    #1: yes/no/cancelar
+    #2: accept/cancel
+    return DefaultThreadSafeDialogs().confirmDialog(message, title, 
+        optionType, messageType) 
+
+def filechooser(option, title="", initialPath=None, 
+        multiselection=False, filter = None, fileHidingEnabled=True):
+    """
+    Allows configuration parameters to filechooser dialogs
+    :int option: file chooser selection mode. Allowed values:
+        OPEN_FILE, OPEN_DIRECTORY, SAVE_FILE
+    :String title: Window title
+    :String initialPath: Initial path to the directory to open in the dialog
+    :boolean multiselection: Allow select more than one object.
+    :String[] filter: list of acepted extension files ("jpg", "png", "gif")
+    :boolean fileHidingEnabled: True if hidden files are not displayed
+    """ 
+    #
+    #Values for open files dialog
+    dialogType = JFileChooser.OPEN_DIALOG
+    selectionMode = FILES_ONLY
+    
+    if option == SAVE_FILE:
+        dialogType = JFileChooser.SAVE_DIALOG
+    elif option == OPEN_DIRECTORY:
+        selectionMode = DIRECTORIES_ONLY
+
+    initialPath = getJavaFile(initialPath)
+   
+    if filter:
+        filter = FileNameExtensionFilter("Files", filter)
+       
+    return DefaultThreadSafeDialogs().showChooserDialog(
+            title,
+            dialogType,
+            selectionMode,
+            multiselection,
+            initialPath,
+            filter,
+            fileHidingEnabled)
+   
+def openFileDialog(title='', initialPath=None):
+    """
+    Shows a window dialog to choose one file. 
+    :param title: Window title. Default ''
+    :type title: string
+    :param initialPath: Initial path to open in window dialog
+    :type initialPath: string
+    """
+  
+    return DefaultThreadSafeDialogs().showOpenFileDialog(
+        title, 
+        getJavaFile(initialPath))
+
+def openFolderDialog(title='', initialPath=None):
+    """
+    Shows a window dialog to choose one folder. 
+    :param title: Window title. Default ''
+    :type title: string
+    :param initialPath: Initial path to open in window dialog
+    :type initialPath: string
+    """    
+  
+    return DefaultThreadSafeDialogs().showOpenDirectoryDialog(
+        title, 
+        getJavaFile(initialPath))
+  
+def saveFileDialog(title='', initialPath=None):
+    """
+    Shows a window dialog to choose one file. 
+    :param title: Window title. Default ''
+    :type title: string
+    :param initialPath: Initial path to open in window dialog
+    :type initialPath: string
+    """    
+    
+    return DefaultThreadSafeDialogs().showSaveFileDialog(
+        title, 
+        getJavaFile(initialPath)
+    )
+  
+def getJavaFile(path):
+    """Returns a java File using parameter path.
+    If path doesn't exists looks for user home folder and if can not find it, 
+    returns path will be gvSIG instance directory.
+    """
+    #
+    #Needs because DefaultThreadSafeDialogs files methods use a java File 
+    #instance as initialPath parameter
+    #
+    import os
+    import java.io.File as JFile  
+  
+    if path:
+        path = os.path.normpath(path)
+        if os.path.exists(path):
+            return JFile(path)
+        
+    if os.environ.has_key('HOME'):
+        return JFile(os.environ.get('HOME', os.getcwd()))
+
+    if os.path.exists(os.path.expanduser("~")):
+        return JFile(os.path.expanduser("~"))
+    
+    return JFile(os.getcwd())
+    
+    
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/dis.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/dis.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/dis.py	(revision 1126)
@@ -0,0 +1,327 @@
+"""Disassembler of Python byte code into mnemonics."""
+
+import sys
+import types
+
+__all__ = ["dis","disassemble","distb","disco","opname","cmp_op",
+           "hasconst","hasname","hasjrel","hasjabs","haslocal",
+           "hascompare", "hasfree"]
+
+def dis(x=None):
+    """Disassemble classes, methods, functions, or code.
+
+    With no argument, disassemble the last traceback.
+
+    """
+    if not x:
+        distb()
+        return
+    if type(x) is types.InstanceType:
+        x = x.__class__
+    if hasattr(x, 'im_func'):
+        x = x.im_func
+    if hasattr(x, 'func_code'):
+        x = x.func_code
+    if hasattr(x, '__dict__'):
+        items = x.__dict__.items()
+        items.sort()
+        for name, x1 in items:
+            if type(x1) in (types.MethodType,
+                            types.FunctionType,
+                            types.CodeType):
+                print "Disassembly of %s:" % name
+                try:
+                    dis(x1)
+                except TypeError, msg:
+                    print "Sorry:", msg
+                print
+    elif hasattr(x, 'co_code'):
+        disassemble(x)
+    else:
+        raise TypeError, \
+              "don't know how to disassemble %s objects" % \
+              type(x).__name__
+
+def distb(tb=None):
+    """Disassemble a traceback (default: last traceback)."""
+    if not tb:
+        try:
+            tb = sys.last_traceback
+        except AttributeError:
+            raise RuntimeError, "no last traceback to disassemble"
+        while tb.tb_next: tb = tb.tb_next
+    disassemble(tb.tb_frame.f_code, tb.tb_lasti)
+
+def disassemble(co, lasti=-1):
+    """Disassemble a code object."""
+    code = co.co_code
+    labels = findlabels(code)
+    n = len(code)
+    i = 0
+    extended_arg = 0
+    free = None
+    while i < n:
+        c = code[i]
+        op = ord(c)
+        if op == SET_LINENO and i > 0: print # Extra blank line
+        if i == lasti: print '-->',
+        else: print '   ',
+        if i in labels: print '>>',
+        else: print '  ',
+        print `i`.rjust(4),
+        print opname[op].ljust(20),
+        i = i+1
+        if op >= HAVE_ARGUMENT:
+            oparg = ord(code[i]) + ord(code[i+1])*256 + extended_arg
+            extended_arg = 0
+            i = i+2
+            if op == EXTENDED_ARG:
+                extended_arg = oparg*65536L
+            print `oparg`.rjust(5),
+            if op in hasconst:
+                print '(' + `co.co_consts[oparg]` + ')',
+            elif op in hasname:
+                print '(' + co.co_names[oparg] + ')',
+            elif op in hasjrel:
+                print '(to ' + `i + oparg` + ')',
+            elif op in haslocal:
+                print '(' + co.co_varnames[oparg] + ')',
+            elif op in hascompare:
+                print '(' + cmp_op[oparg] + ')',
+            elif op in hasfree:
+                if free is None:
+                    free = co.co_cellvars + co.co_freevars
+                print '(' + free[oparg] + ')',
+        print
+
+disco = disassemble                     # XXX For backwards compatibility
+
+def findlabels(code):
+    """Detect all offsets in a byte code which are jump targets.
+
+    Return the list of offsets.
+
+    """
+    labels = []
+    n = len(code)
+    i = 0
+    while i < n:
+        c = code[i]
+        op = ord(c)
+        i = i+1
+        if op >= HAVE_ARGUMENT:
+            oparg = ord(code[i]) + ord(code[i+1])*256
+            i = i+2
+            label = -1
+            if op in hasjrel:
+                label = i+oparg
+            elif op in hasjabs:
+                label = oparg
+            if label >= 0:
+                if label not in labels:
+                    labels.append(label)
+    return labels
+
+cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is',
+        'is not', 'exception match', 'BAD')
+
+hasconst = []
+hasname = []
+hasjrel = []
+hasjabs = []
+haslocal = []
+hascompare = []
+hasfree = []
+
+opname = [''] * 256
+for op in range(256): opname[op] = '<' + `op` + '>'
+
+def def_op(name, op):
+    opname[op] = name
+
+def name_op(name, op):
+    opname[op] = name
+    hasname.append(op)
+
+def jrel_op(name, op):
+    opname[op] = name
+    hasjrel.append(op)
+
+def jabs_op(name, op):
+    opname[op] = name
+    hasjabs.append(op)
+
+# Instruction opcodes for compiled code
+
+def_op('STOP_CODE', 0)
+def_op('POP_TOP', 1)
+def_op('ROT_TWO', 2)
+def_op('ROT_THREE', 3)
+def_op('DUP_TOP', 4)
+def_op('ROT_FOUR', 5)
+
+def_op('UNARY_POSITIVE', 10)
+def_op('UNARY_NEGATIVE', 11)
+def_op('UNARY_NOT', 12)
+def_op('UNARY_CONVERT', 13)
+
+def_op('UNARY_INVERT', 15)
+
+def_op('BINARY_POWER', 19)
+
+def_op('BINARY_MULTIPLY', 20)
+def_op('BINARY_DIVIDE', 21)
+def_op('BINARY_MODULO', 22)
+def_op('BINARY_ADD', 23)
+def_op('BINARY_SUBTRACT', 24)
+def_op('BINARY_SUBSCR', 25)
+def_op('BINARY_FLOOR_DIVIDE', 26)
+def_op('BINARY_TRUE_DIVIDE', 27)
+def_op('INPLACE_FLOOR_DIVIDE', 28)
+def_op('INPLACE_TRUE_DIVIDE', 29)
+
+def_op('SLICE+0', 30)
+def_op('SLICE+1', 31)
+def_op('SLICE+2', 32)
+def_op('SLICE+3', 33)
+
+def_op('STORE_SLICE+0', 40)
+def_op('STORE_SLICE+1', 41)
+def_op('STORE_SLICE+2', 42)
+def_op('STORE_SLICE+3', 43)
+
+def_op('DELETE_SLICE+0', 50)
+def_op('DELETE_SLICE+1', 51)
+def_op('DELETE_SLICE+2', 52)
+def_op('DELETE_SLICE+3', 53)
+
+def_op('INPLACE_ADD', 55)
+def_op('INPLACE_SUBTRACT', 56)
+def_op('INPLACE_MULTIPLY', 57)
+def_op('INPLACE_DIVIDE', 58)
+def_op('INPLACE_MODULO', 59)
+def_op('STORE_SUBSCR', 60)
+def_op('DELETE_SUBSCR', 61)
+
+def_op('BINARY_LSHIFT', 62)
+def_op('BINARY_RSHIFT', 63)
+def_op('BINARY_AND', 64)
+def_op('BINARY_XOR', 65)
+def_op('BINARY_OR', 66)
+def_op('INPLACE_POWER', 67)
+def_op('GET_ITER', 68)
+
+def_op('PRINT_EXPR', 70)
+def_op('PRINT_ITEM', 71)
+def_op('PRINT_NEWLINE', 72)
+def_op('PRINT_ITEM_TO', 73)
+def_op('PRINT_NEWLINE_TO', 74)
+def_op('INPLACE_LSHIFT', 75)
+def_op('INPLACE_RSHIFT', 76)
+def_op('INPLACE_AND', 77)
+def_op('INPLACE_XOR', 78)
+def_op('INPLACE_OR', 79)
+def_op('BREAK_LOOP', 80)
+
+def_op('LOAD_LOCALS', 82)
+def_op('RETURN_VALUE', 83)
+def_op('IMPORT_STAR', 84)
+def_op('EXEC_STMT', 85)
+def_op('YIELD_STMT', 86)
+
+def_op('POP_BLOCK', 87)
+def_op('END_FINALLY', 88)
+def_op('BUILD_CLASS', 89)
+
+HAVE_ARGUMENT = 90              # Opcodes from here have an argument:
+
+name_op('STORE_NAME', 90)       # Index in name list
+name_op('DELETE_NAME', 91)      # ""
+def_op('UNPACK_SEQUENCE', 92)   # Number of tuple items
+jrel_op('FOR_ITER', 93)
+
+name_op('STORE_ATTR', 95)       # Index in name list
+name_op('DELETE_ATTR', 96)      # ""
+name_op('STORE_GLOBAL', 97)     # ""
+name_op('DELETE_GLOBAL', 98)    # ""
+def_op('DUP_TOPX', 99)          # number of items to duplicate
+def_op('LOAD_CONST', 100)       # Index in const list
+hasconst.append(100)
+name_op('LOAD_NAME', 101)       # Index in name list
+def_op('BUILD_TUPLE', 102)      # Number of tuple items
+def_op('BUILD_LIST', 103)       # Number of list items
+def_op('BUILD_MAP', 104)        # Always zero for now
+name_op('LOAD_ATTR', 105)       # Index in name list
+def_op('COMPARE_OP', 106)       # Comparison operator
+hascompare.append(106)
+name_op('IMPORT_NAME', 107)     # Index in name list
+name_op('IMPORT_FROM', 108)     # Index in name list
+
+jrel_op('JUMP_FORWARD', 110)    # Number of bytes to skip
+jrel_op('JUMP_IF_FALSE', 111)   # ""
+jrel_op('JUMP_IF_TRUE', 112)    # ""
+jabs_op('JUMP_ABSOLUTE', 113)   # Target byte offset from beginning of code
+jrel_op('FOR_LOOP', 114)        # Number of bytes to skip
+
+name_op('LOAD_GLOBAL', 116)     # Index in name list
+
+jabs_op('CONTINUE_LOOP', 119)   # Target address
+jrel_op('SETUP_LOOP', 120)      # Distance to target address
+jrel_op('SETUP_EXCEPT', 121)    # ""
+jrel_op('SETUP_FINALLY', 122)   # ""
+
+def_op('LOAD_FAST', 124)        # Local variable number
+haslocal.append(124)
+def_op('STORE_FAST', 125)       # Local variable number
+haslocal.append(125)
+def_op('DELETE_FAST', 126)      # Local variable number
+haslocal.append(126)
+
+def_op('SET_LINENO', 127)       # Current line number
+SET_LINENO = 127
+
+def_op('RAISE_VARARGS', 130)    # Number of raise arguments (1, 2, or 3)
+def_op('CALL_FUNCTION', 131)    # #args + (#kwargs << 8)
+def_op('MAKE_FUNCTION', 132)    # Number of args with default values
+def_op('BUILD_SLICE', 133)      # Number of items
+
+def_op('MAKE_CLOSURE', 134)
+def_op('LOAD_CLOSURE', 135)
+hasfree.append(135)
+def_op('LOAD_DEREF', 136)
+hasfree.append(136)
+def_op('STORE_DEREF', 137)
+hasfree.append(137)
+
+def_op('CALL_FUNCTION_VAR', 140)     # #args + (#kwargs << 8)
+def_op('CALL_FUNCTION_KW', 141)      # #args + (#kwargs << 8)
+def_op('CALL_FUNCTION_VAR_KW', 142)  # #args + (#kwargs << 8)
+
+def_op('EXTENDED_ARG', 143)
+EXTENDED_ARG = 143
+
+def _test():
+    """Simple test program to disassemble a file."""
+    if sys.argv[1:]:
+        if sys.argv[2:]:
+            sys.stderr.write("usage: python dis.py [-|file]\n")
+            sys.exit(2)
+        fn = sys.argv[1]
+        if not fn or fn == "-":
+            fn = None
+    else:
+        fn = None
+    if not fn:
+        f = sys.stdin
+    else:
+        f = open(fn)
+    source = f.read()
+    if fn:
+        f.close()
+    else:
+        fn = "<stdin>"
+    code = compile(source, fn, "exec")
+    dis(code)
+
+if __name__ == "__main__":
+    _test()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/history.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/history.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/history.py	(revision 1126)
@@ -0,0 +1,55 @@
+"""
+ history.py - Handles the History of the jython console
+ Copyright (C) 2001 Carlos Quiroz
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+"""
+#from org.gjt.sp.jedit.gui import HistoryModel
+
+class History:
+    """
+    The class history handles the history management basically wrapping the
+    built-in jEdit's history capabilities
+    """
+
+    def __init__(self, console):
+        self.history = []
+	self.console = console
+	self.index = 0
+	self.last = ""
+
+    def append(self, line):
+        if line == '\n' or len(line) == 0: return
+## 	if line == self.last: # avoid duplicates
+## 	    self.index = len(self.history) - 1
+##          return
+		
+	self.last = line
+	self.history.append(line)
+	self.index = len(self.history) - 1
+
+    def historyUp(self, event):
+        if len(self.history) > 0 and self.console.inLastLine():
+	    self.console.replaceRow(self.history[self.index])
+	    self.index = max(self.index - 1, 0)
+
+    def historyDown(self, event):
+        if len(self.history) > 0 and self.console.inLastLine():
+	    if self.index == len(self.history) - 1:
+	        self.console.replaceRow("")
+	    else:
+	        self.index += 1
+	        self.console.replaceRow(self.history[self.index])
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/console.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/console.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/console.py	(revision 1126)
@@ -0,0 +1,399 @@
+"""
+Jython Console with Code Completion
+
+This uses the basic Jython Interactive Interpreter.
+The UI uses code from Carlos Quiroz's 'Jython Interpreter for JEdit' http://www.jedit.org
+"""
+from javax.swing import JFrame, JScrollPane, JWindow, JTextPane, Action, KeyStroke, WindowConstants
+from javax.swing.text import JTextComponent, TextAction, SimpleAttributeSet, StyleConstants
+from java.awt import Color, Font, FontMetrics, Point
+from java.awt.event import  InputEvent, KeyEvent, WindowAdapter
+
+import jintrospect
+from popup import Popup
+from tip import Tip
+from history import History
+
+import sys
+import traceback
+from code import InteractiveInterpreter
+from org.python.util import InteractiveConsole
+#InteractiveConsole=sys.gvSIG.classForName("org.python.util.InteractiveConsole")
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: console.py 5910 2006-06-20 10:03:31Z jmvivo $"
+
+def debug(name, value=None):
+    if value == None:
+        print >> sys.stderr, name
+    else:
+        print >> sys.stderr, "%s = %s" % (name, value)
+
+
+class Console:
+    PROMPT = sys.ps1
+    PROCESS = sys.ps2
+    BANNER = ["Jython Completion Shell", InteractiveConsole.getDefaultBanner()]
+
+    def __init__(self, frame):
+
+        self.frame = frame # TODO do I need a reference to frame after the constructor?
+        self.history = History(self)
+        self.bs = 0 # what is this?
+
+        # command buffer
+        self.buffer = []
+        self.locals = {}
+        #self.locals = {"gvSIG":sys.gvSIG}
+
+        self.interp = Interpreter(self, self.locals)
+        sys.stdout = StdOutRedirector(self)
+
+        # create a textpane
+        self.output = JTextPane(keyTyped = self.keyTyped, keyPressed = self.keyPressed)
+        # TODO rename output to textpane
+
+        # CTRL UP AND DOWN don't work
+        keyBindings = [
+            (KeyEvent.VK_ENTER, 0, "jython.enter", self.enter),
+            (KeyEvent.VK_DELETE, 0, "jython.delete", self.delete),
+            (KeyEvent.VK_HOME, 0, "jython.home", self.home),
+            (KeyEvent.VK_UP, 0, "jython.up", self.history.historyUp),
+            (KeyEvent.VK_DOWN, 0, "jython.down", self.history.historyDown),
+            (KeyEvent.VK_PERIOD, 0, "jython.showPopup", self.showPopup),
+            (KeyEvent.VK_ESCAPE, 0, "jython.hide", self.hide),
+            
+            ('(', 0, "jython.showTip", self.showTip),
+            (')', 0, "jython.hideTip", self.hideTip),
+            
+            #(KeyEvent.VK_UP, InputEvent.CTRL_MASK, DefaultEditorKit.upAction, self.output.keymap.getAction(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0))),
+            #(KeyEvent.VK_DOWN, InputEvent.CTRL_MASK, DefaultEditorKit.downAction, self.output.keymap.getAction(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)))
+            ]
+        # TODO rename newmap to keymap
+        newmap = JTextComponent.addKeymap("jython", self.output.keymap)
+        for (key, modifier, name, function) in keyBindings:
+            newmap.addActionForKeyStroke(KeyStroke.getKeyStroke(key, modifier), ActionDelegator(name, function))
+
+        self.output.keymap = newmap
+                
+        self.doc = self.output.document
+        #self.panel.add(BorderLayout.CENTER, JScrollPane(self.output))
+        self.__propertiesChanged()
+        self.__inittext()
+        self.initialLocation = self.doc.createPosition(self.doc.length-1)
+
+	# Don't pass frame to popups. JWindows with null owners are not focusable
+	# this fixes the focus problem on Win32, but make the mouse problem worse
+        self.popup = Popup(None, self.output)
+        self.tip = Tip(None)
+
+        # get fontmetrics info so we can position the popup
+        metrics = self.output.getFontMetrics(self.output.getFont())
+        self.dotWidth = metrics.charWidth('.')
+        self.textHeight = metrics.getHeight()
+
+        # add some handles to our objects
+        self.locals['console'] = self
+
+        self.caret = self.output.getCaret()
+
+    # TODO refactor me
+    def getinput(self):
+        offsets = self.__lastLine()
+        text = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+        return text
+
+    def getDisplayPoint(self):
+        """Get the point where the popup window should be displayed"""
+        screenPoint = self.output.getLocationOnScreen()
+        caretPoint = self.output.caret.getMagicCaretPosition()
+
+        # TODO use SwingUtils to do this translation
+        x = screenPoint.getX() + caretPoint.getX() + self.dotWidth 
+        y = screenPoint.getY() + caretPoint.getY() + self.textHeight
+        return Point(int(x),int(y))
+
+    def hide(self, event=None):
+        """Hide the popup or tip window if visible"""
+        if self.popup.visible:
+            self.popup.hide()
+        if self.tip.visible:
+            self.tip.hide()
+
+    def hideTip(self, event=None):
+        self.tip.hide()
+        # TODO this needs to insert ')' at caret!
+        self.write(')')
+
+    def showTip(self, event=None):
+        # get the display point before writing text
+        # otherwise magicCaretPosition is None
+        displayPoint = self.getDisplayPoint()
+
+        if self.popup.visible:
+            self.popup.hide()
+        
+        line = self.getinput()
+        #debug("line", line)
+        # Hack 'o rama
+        line = line[:-1] # remove \n
+        line += '('
+        #debug("line", line)
+
+        # TODO this needs to insert '(' at caret!
+        self.write('(')
+        
+        (name, argspec, tip) = jintrospect.getCallTipJava(line, self.locals)
+        #debug("name", name)
+        #debug("argspec", argspec)
+        #debug("tip", tip)
+
+        if tip:
+            self.tip.setLocation(displayPoint)
+            self.tip.setText(tip)
+            self.tip.show()
+            
+
+    def showPopup(self, event=None):
+
+        line = self.getinput()
+        # this is silly, I have to add the '.' and the other code removes it.
+        line = line[:-1] # remove \n
+        line = line + '.'
+        #print >> sys.stderr, "line:",line
+        
+        # TODO get this code into Popup
+        # TODO handle errors gracefully
+        try:
+            list = jintrospect.getAutoCompleteList(line, self.locals)
+        except Exception, e:
+            # TODO handle this gracefully
+            print >> sys.stderr, e
+            return
+
+        if len(list) == 0:
+            #print >> sys.stderr, "list was empty"
+            return
+
+        self.popup.setLocation(self.getDisplayPoint())
+
+        self.popup.setMethods(list)
+        self.popup.show()
+        self.popup.list.setSelectedIndex(0)
+
+    def inLastLine(self, include = 1):
+        """ Determines whether the cursor is in the last line """
+        limits = self.__lastLine()
+        caret = self.output.caretPosition
+        if self.output.selectedText:
+            caret = self.output.selectionStart
+        if include:
+            return (caret >= limits[0] and caret <= limits[1])
+        else:
+            return (caret > limits[0] and caret <= limits[1])
+
+    def enter(self, event):
+        """ Triggered when enter is pressed """
+        offsets = self.__lastLine()
+        text = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+        text = text[:-1] # chomp \n
+        self.buffer.append(text)
+        source = "\n".join(self.buffer)
+        more = self.interp.runsource(source)
+        if more:
+            self.printOnProcess()
+        else:
+            self.resetbuffer()
+            self.printPrompt()
+        self.history.append(text)
+
+        self.hide()
+
+    def resetbuffer(self):
+        self.buffer = []
+
+    # home key stops after prompt
+    def home(self, event):
+		""" Triggered when HOME is pressed """
+		if self.inLastLine():
+			self.output.caretPosition = self.__lastLine()[0]
+		else:
+			lines = self.doc.rootElements[0].elementCount
+			for i in xrange(0,lines-1):
+				offsets = (self.doc.rootElements[0].getElement(i).startOffset, \
+					self.doc.rootElements[0].getElement(i).endOffset)
+				line = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+				if self.output.caretPosition >= offsets[0] and \
+					self.output.caretPosition <= offsets[1]:
+					if line.startswith(Console.PROMPT) or line.startswith(Console.PROCESS):
+						self.output.caretPosition = offsets[0] + len(Console.PROMPT)
+					else:
+						self.output.caretPosition = offsets[0]
+
+    def replaceRow(self, text):
+        """ Replaces the last line of the textarea with text """
+        offset = self.__lastLine()
+        last = self.doc.getText(offset[0], offset[1]-offset[0])
+        if last != "\n":
+            self.doc.remove(offset[0], offset[1]-offset[0]-1)
+        self.__addOutput(self.infoColor, text)
+
+    # don't allow prompt to be deleted
+    # this will cause problems when history can contain multiple lines
+    def delete(self, event):
+        """ Intercepts delete events only allowing it to work in the last line """
+        if self.inLastLine():
+            if self.output.selectedText:
+                self.doc.remove(self.output.selectionStart, self.output.selectionEnd - self.output.selectionStart)
+            elif self.output.caretPosition < self.doc.length:
+                self.doc.remove(self.output.caretPosition, 1)
+
+    # why is there a keyTyped and a keyPressed?
+    def keyTyped(self, event):
+        #print >> sys.stderr, "keyTyped", event.getKeyCode()
+        if not self.inLastLine():
+            event.consume()
+        if self.bs:
+            event.consume()
+        self.bs=0
+
+    def keyPressed(self, event):
+        if self.popup.visible:
+            self.popup.key(event)
+        #print >> sys.stderr, "keyPressed", event.getKeyCode()
+        if event.keyCode == KeyEvent.VK_BACK_SPACE:
+            offsets = self.__lastLine()
+            if not self.inLastLine(include=0):
+                self.bs = 1
+            else:
+                self.bs = 0
+
+    # TODO refactor me
+    def write(self, text):
+        self.__addOutput(self.infoColor, text)
+
+    def printResult(self, msg):
+        """ Prints the results of an operation """
+        self.__addOutput(self.output.foreground, "\n" + str(msg))
+
+    def printError(self, msg): 
+        self.__addOutput(self.errorColor, "\n" + str(msg))
+
+    def printOnProcess(self):
+        """ Prints the process symbol """
+        self.__addOutput(self.infoColor, "\n" + Console.PROCESS)
+
+    def printPrompt(self):
+        """ Prints the prompt """
+        self.__addOutput(self.infoColor, "\n" + Console.PROMPT)
+		
+    def __addOutput(self, color, msg):
+        """ Adds the output to the text area using a given color """
+        from javax.swing.text import BadLocationException
+        style = SimpleAttributeSet()
+
+        if color:
+            style.addAttribute(StyleConstants.Foreground, color)
+
+        self.doc.insertString(self.doc.length, msg, style)
+        self.output.caretPosition = self.doc.length
+
+    def __propertiesChanged(self):
+        """ Detects when the properties have changed """
+        self.output.background = Color.white #jEdit.getColorProperty("jython.bgColor")
+        self.output.foreground = Color.blue #jEdit.getColorProperty("jython.resultColor")
+        self.infoColor = Color.black #jEdit.getColorProperty("jython.textColor")
+        self.errorColor = Color.red # jEdit.getColorProperty("jython.errorColor")
+
+        family = "Monospaced" # jEdit.getProperty("jython.font", "Monospaced")
+        size = 14 #jEdit.getIntegerProperty("jython.fontsize", 14)
+        style = Font.PLAIN #jEdit.getIntegerProperty("jython.fontstyle", Font.PLAIN)
+        self.output.setFont(Font(family,style,size))
+
+    def __inittext(self):
+        """ Inserts the initial text with the jython banner """
+        self.doc.remove(0, self.doc.length)
+        for line in "\n".join(Console.BANNER):
+            self.__addOutput(self.infoColor, line)
+        self.printPrompt()
+        self.output.requestFocus()
+
+    def __lastLine(self):
+        """ Returns the char offests of the last line """
+        lines = self.doc.rootElements[0].elementCount
+        offsets = (self.doc.rootElements[0].getElement(lines-1).startOffset, \
+                   self.doc.rootElements[0].getElement(lines-1).endOffset)
+        line = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+        if len(line) >= 4 and (line[0:4]==Console.PROMPT or line[0:4]==Console.PROCESS):
+            return (offsets[0] + len(Console.PROMPT), offsets[1])
+        return offsets
+
+
+class ActionDelegator(TextAction):
+	"""
+		Class action delegator encapsulates a TextAction delegating the action
+		event to a simple function
+	"""
+	def __init__(self, name, delegate):
+		TextAction.__init__(self, name)
+		self.delegate = delegate
+
+	def actionPerformed(self, event):
+		if isinstance(self.delegate, Action):
+			self.delegate.actionPerformed(event)
+		else:
+			self.delegate(event)
+
+class Interpreter(InteractiveInterpreter):
+    def __init__(self, console, locals):
+        InteractiveInterpreter.__init__(self, locals)
+        self.console = console
+        
+        
+    def write(self, data):
+        # send all output to the textpane
+        # KLUDGE remove trailing linefeed
+        self.console.printError(data[:-1])
+        
+
+# redirect stdout to the textpane
+class StdOutRedirector:
+    def __init__(self, console):
+        self.console = console
+        
+    def write(self, data):
+        #print >> sys.stderr, ">>%s<<" % data
+        if data != '\n':
+            # This is a sucky hack.  Fix printResult
+            self.console.printResult(data)
+
+class JythonFrame(JFrame):
+    def __init__(self):
+        self.title = "Jython"
+        self.size = (600, 400)
+        try:
+            #No queremos que se salga cuando cerremos la ventana
+            ##self.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)            
+            self.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
+        except:
+            # assume jdk < 1.4
+            self.addWindowListener(KillListener())
+            self.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
+
+class KillListener(WindowAdapter):
+    """
+    Handle EXIT_ON_CLOSE for jdk < 1.4
+    Thanks to James Richards for this method
+    """
+    def windowClosed(self, evt):
+        import java.lang.System as System
+        System.exit(0)
+
+def main():
+    frame = JythonFrame()
+    console = Console(frame)
+    frame.getContentPane().add(JScrollPane(console.output))
+    frame.show()
+    
+if __name__ == "__main__":
+    main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/popup.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/popup.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/popup.py	(revision 1126)
@@ -0,0 +1,130 @@
+from java.lang import Character
+from javax.swing import JWindow, JList, JScrollPane
+from java.awt import Color, Dimension
+from java.awt.event import KeyAdapter
+from java.awt.event import KeyEvent
+import string
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: popup.py 5782 2006-06-12 07:56:49Z jmvivo $"
+
+class Popup(JWindow):
+    """Popup window to display list of methods for completion"""
+    
+    MAX_HEIGHT = 300
+    MIN_WIDTH = 200
+    MAX_WIDTH = 400
+    
+    def __init__(self, frame, textComponent):
+        JWindow.__init__(self, frame)
+        self.textComponent = textComponent
+        self.size = (200,200)
+        self.list = JList(keyPressed=self.key)
+        self.list.setBackground(Color(255,255,225)) # TODO move this color
+        self.getContentPane().add(JScrollPane(self.list))
+        self.list.setSelectedIndex(0)
+
+        self.originalData = ""
+        self.data = ""
+        self.typed = ""
+
+    def key(self, e):
+        # key listener
+        #print "Other Listener"
+        code = e.getKeyCode()
+        #print 'keychar:',e.getKeyChar()
+        
+        if code == KeyEvent.VK_ESCAPE:
+            self.hide()
+
+        elif code == KeyEvent.VK_ENTER or code == KeyEvent.VK_TAB:
+            self.chooseSelected()
+            e.consume()
+
+        elif code == 8: # BACKSPACE
+            self.typed = self.typed[:-1]
+            self.data = filter(self.originalData, self.typed)
+            self.list.setListData(self.data)
+            self.list.setSelectedIndex(0)
+                
+        elif code == KeyEvent.VK_UP:
+            self.previous()
+            # consume event to avoid history previous
+            e.consume()
+            
+        elif code == KeyEvent.VK_DOWN:
+            self.next()
+            # consume event to avoid history next
+            e.consume()
+            
+        else:
+            char = e.getKeyChar()
+            if Character.isJavaLetterOrDigit(char):
+                self.typed += char 
+                self.data = filter(self.data, self.typed)
+                self.list.setListData(self.data)
+                self.list.setSelectedIndex(0)
+                
+    def next(self):
+        index = self.list.getSelectedIndex()
+        max = (self.list.getModel().getSize() - 1)
+        
+        if index < max:
+            index += 1
+            self.list.setSelectedIndex(index)
+            self.list.ensureIndexIsVisible(index)
+        
+    def previous(self):
+        index = self.list.getSelectedIndex()
+
+        if index > 0:
+            index -= 1
+            self.list.setSelectedIndex(index)
+            self.list.ensureIndexIsVisible(index)
+
+    def chooseSelected(self):
+        """Choose the selected value in the list"""
+        value = self.list.getSelectedValue()
+        startPosition = self.dotPosition + 1
+        caretPosition = self.textComponent.getCaretPosition()
+        self.textComponent.select(startPosition, caretPosition) 
+        self.textComponent.replaceSelection(value)
+        self.textComponent.setCaretPosition(startPosition + len(value))
+        self.hide()
+
+    def setMethods(self, methodList):
+        methodList.sort()
+        self.data = methodList
+        self.originalData = methodList
+        self.typed = ""
+        self.list.setListData(methodList)
+
+    def show(self):
+        # when the popup becomes visible, get the cursor
+        # so we know how to replace the selection
+        self.dotPosition = self.textComponent.getCaretPosition()
+        self.setSize(self.getPreferredSize())
+        JWindow.show(self)
+
+    def getPreferredSize(self):
+        # need to add a magic amount to the size to avoid scrollbars
+        # I'm sure there's a better way to do this
+        MAGIC = 20
+        size = self.list.getPreferredScrollableViewportSize()
+        height = size.height + MAGIC
+        width = size.width + MAGIC
+        if height > Popup.MAX_HEIGHT:
+            height = Popup.MAX_HEIGHT
+        if width > Popup.MAX_WIDTH:
+            width = Popup.MAX_WIDTH
+        if width < Popup.MIN_WIDTH:
+            widht = Popup.MIN_WIDTH
+        return Dimension(width, height)
+
+    
+# this needs a list renderer that will hilight the prefix
+def filter(list, prefix):
+    prefix = prefix.lower()
+    list = [eachItem for eachItem in list if str(eachItem).lower().startswith(prefix)]
+    return list
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/jintrospect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/jintrospect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/jintrospect.py	(revision 1126)
@@ -0,0 +1,158 @@
+"""Extend introspect.py for Java based Jython classes."""
+
+from introspect import *
+import string
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: jintrospect.py 5782 2006-06-12 07:56:49Z jmvivo $"
+
+def getAutoCompleteList(command='', locals=None, includeMagic=1, 
+                        includeSingle=1, includeDouble=1):
+    """Return list of auto-completion options for command.
+    
+    The list of options will be based on the locals namespace."""
+    attributes = []
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='.')
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        return attributes
+    
+    if ispython(object):
+        # use existing code
+        attributes = getAttributeNames(object, includeMagic, includeSingle, includeDouble)
+    else:
+        methods = methodsOf(object.__class__)
+        attributes = [eachMethod.__name__ for eachMethod in methods]
+        
+    return attributes
+
+def methodsOf(clazz):
+    """return a list of all the methods in a class"""
+    classMembers = vars(clazz).values()
+    methods = [eachMember for eachMember in classMembers if callable(eachMember)]
+    for eachBase in clazz.__bases__:
+        methods.extend(methodsOf(eachBase))
+    return methods
+
+def getCallTipJava(command='', locals=None):
+    """For a command, return a tuple of object name, argspec, tip text.
+
+    The call tip information will be based on the locals namespace."""
+
+    calltip = ('', '', '')  # object name, argspec, tip text.
+
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='(')
+
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        return calltip
+
+    if ispython(object):
+        # Patrick's code handles python code
+        # TODO fix in future because getCallTip runs eval() again
+        return getCallTip(command, locals)
+
+    name = ''
+    try:
+        name = object.__name__
+    except AttributeError:
+        pass
+    
+    tipList = []
+    argspec = '' # not using argspec for Java
+    
+    if inspect.isbuiltin(object):
+        # inspect.isbuiltin() fails for Jython
+        # Can we get the argspec for Jython builtins?  We can't in Python.
+        pass
+    elif inspect.isclass(object):
+        # get the constructor(s)
+        # TODO consider getting modifiers since jython can access private methods
+        constructors = object.getConstructors()
+        for constructor in constructors:
+            paramList = []
+            paramTypes = constructor.getParameterTypes()
+            # paramTypes is an array of classes, we need Strings
+            # TODO consider list comprehension
+            for param in paramTypes:
+                # TODO translate [B to byte[], [C to char[] etc
+                paramList.append(param.__name__)
+            paramString = string.join(paramList,', ')
+            tip = "%s(%s)" % (constructor.name, paramString)
+            tipList.append(tip)
+             
+    elif inspect.ismethod(object):
+        method = object
+        object = method.im_class
+
+        # java allows overloading so we may have more than one method
+        methodArray = object.getMethods()
+
+        for eachMethod in methodArray:
+            if eachMethod.name == method.__name__:
+                paramList = []
+                for eachParam in eachMethod.parameterTypes:
+                    paramList.append(eachParam.__name__)
+                 
+                paramString = string.join(paramList,', ')
+
+                # create a python style string a la PyCrust
+                # we're showing the parameter type rather than the parameter name, since that's all I can get
+                # we need to show multiple methods for overloading
+                # TODO improve message format
+                # do we want to show the method visibility
+                # how about exceptions?
+                # note: name, return type and exceptions same for EVERY overload method
+
+                tip = "%s(%s) -> %s" % (eachMethod.name, paramString, eachMethod.returnType)
+                tipList.append(tip)
+            
+#    else:
+#        print "Not a java class :("
+
+    calltip = (name, argspec, string.join(tipList,"\n"))
+    return calltip
+                                      
+def ispython(object):
+    """
+    Figure out if this is Python code or Java Code
+
+    """
+    pyclass = 0
+    pycode = 0
+    pyinstance = 0
+    
+    if inspect.isclass(object):
+        try:
+            object.__doc__
+            pyclass = 1
+        except AttributeError:
+            pyclass = 0
+
+    elif inspect.ismethod(object):
+        try:
+            object.__dict__
+            pycode = 1
+        except AttributeError:
+            pycode = 0
+    else: # I guess an instance of an object falls here
+        try:
+            object.__dict__
+            pyinstance = 1
+        except AttributeError:
+            pyinstance = 0
+
+#    print "object", object, "pyclass", pyclass, "pycode", pycode, "returning", pyclass | pycode
+    
+    return pyclass | pycode | pyinstance
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/inspect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/inspect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/inspect.py	(revision 1126)
@@ -0,0 +1,789 @@
+"""Get useful information from live Python objects.
+
+This module encapsulates the interface provided by the internal special
+attributes (func_*, co_*, im_*, tb_*, etc.) in a friendlier fashion.
+It also provides some help for examining source code and class layout.
+
+Here are some of the useful functions provided by this module:
+
+    ismodule(), isclass(), ismethod(), isfunction(), istraceback(),
+        isframe(), iscode(), isbuiltin(), isroutine() - check object types
+    getmembers() - get members of an object that satisfy a given condition
+
+    getfile(), getsourcefile(), getsource() - find an object's source code
+    getdoc(), getcomments() - get documentation on an object
+    getmodule() - determine the module that an object came from
+    getclasstree() - arrange classes so as to represent their hierarchy
+
+    getargspec(), getargvalues() - get info about function arguments
+    formatargspec(), formatargvalues() - format an argument spec
+    getouterframes(), getinnerframes() - get info about frames
+    currentframe() - get the current stack frame
+    stack(), trace() - get info about frames on the stack or in a traceback
+"""
+
+# This module is in the public domain.  No warranties.
+
+__author__ = 'Ka-Ping Yee <ping@lfw.org>'
+__date__ = '1 Jan 2001'
+
+import sys, os, types, string, re, dis, imp, tokenize
+
+# ----------------------------------------------------------- type-checking
+def ismodule(object):
+    """Return true if the object is a module.
+
+    Module objects provide these attributes:
+        __doc__         documentation string
+        __file__        filename (missing for built-in modules)"""
+    return isinstance(object, types.ModuleType)
+
+def isclass(object):
+    """Return true if the object is a class.
+
+    Class objects provide these attributes:
+        __doc__         documentation string
+        __module__      name of module in which this class was defined"""
+    return isinstance(object, types.ClassType) or hasattr(object, '__bases__')
+
+def ismethod(object):
+    """Return true if the object is an instance method.
+
+    Instance method objects provide these attributes:
+        __doc__         documentation string
+        __name__        name with which this method was defined
+        im_class        class object in which this method belongs
+        im_func         function object containing implementation of method
+        im_self         instance to which this method is bound, or None"""
+    return isinstance(object, types.MethodType)
+
+def ismethoddescriptor(object):
+    """Return true if the object is a method descriptor.
+
+    But not if ismethod() or isclass() or isfunction() are true.
+
+    This is new in Python 2.2, and, for example, is true of int.__add__.
+    An object passing this test has a __get__ attribute but not a __set__
+    attribute, but beyond that the set of attributes varies.  __name__ is
+    usually sensible, and __doc__ often is.
+
+    Methods implemented via descriptors that also pass one of the other
+    tests return false from the ismethoddescriptor() test, simply because
+    the other tests promise more -- you can, e.g., count on having the
+    im_func attribute (etc) when an object passes ismethod()."""
+    return (hasattr(object, "__get__")
+            and not hasattr(object, "__set__") # else it's a data descriptor
+            and not ismethod(object)           # mutual exclusion
+            and not isfunction(object)
+            and not isclass(object))
+
+def isfunction(object):
+    """Return true if the object is a user-defined function.
+
+    Function objects provide these attributes:
+        __doc__         documentation string
+        __name__        name with which this function was defined
+        func_code       code object containing compiled function bytecode
+        func_defaults   tuple of any default values for arguments
+        func_doc        (same as __doc__)
+        func_globals    global namespace in which this function was defined
+        func_name       (same as __name__)"""
+    return isinstance(object, types.FunctionType)
+
+def istraceback(object):
+    """Return true if the object is a traceback.
+
+    Traceback objects provide these attributes:
+        tb_frame        frame object at this level
+        tb_lasti        index of last attempted instruction in bytecode
+        tb_lineno       current line number in Python source code
+        tb_next         next inner traceback object (called by this level)"""
+    return isinstance(object, types.TracebackType)
+
+def isframe(object):
+    """Return true if the object is a frame object.
+
+    Frame objects provide these attributes:
+        f_back          next outer frame object (this frame's caller)
+        f_builtins      built-in namespace seen by this frame
+        f_code          code object being executed in this frame
+        f_exc_traceback traceback if raised in this frame, or None
+        f_exc_type      exception type if raised in this frame, or None
+        f_exc_value     exception value if raised in this frame, or None
+        f_globals       global namespace seen by this frame
+        f_lasti         index of last attempted instruction in bytecode
+        f_lineno        current line number in Python source code
+        f_locals        local namespace seen by this frame
+        f_restricted    0 or 1 if frame is in restricted execution mode
+        f_trace         tracing function for this frame, or None"""
+    return isinstance(object, types.FrameType)
+
+def iscode(object):
+    """Return true if the object is a code object.
+
+    Code objects provide these attributes:
+        co_argcount     number of arguments (not including * or ** args)
+        co_code         string of raw compiled bytecode
+        co_consts       tuple of constants used in the bytecode
+        co_filename     name of file in which this code object was created
+        co_firstlineno  number of first line in Python source code
+        co_flags        bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
+        co_lnotab       encoded mapping of line numbers to bytecode indices
+        co_name         name with which this code object was defined
+        co_names        tuple of names of local variables
+        co_nlocals      number of local variables
+        co_stacksize    virtual machine stack space required
+        co_varnames     tuple of names of arguments and local variables"""
+    return isinstance(object, types.CodeType)
+
+def isbuiltin(object):
+    """Return true if the object is a built-in function or method.
+
+    Built-in functions and methods provide these attributes:
+        __doc__         documentation string
+        __name__        original name of this function or method
+        __self__        instance to which a method is bound, or None"""
+    return isinstance(object, types.BuiltinFunctionType)
+
+def isroutine(object):
+    """Return true if the object is any kind of function or method."""
+    return (isbuiltin(object)
+            or isfunction(object)
+            or ismethod(object)
+            or ismethoddescriptor(object))
+
+def getmembers(object, predicate=None):
+    """Return all members of an object as (name, value) pairs sorted by name.
+    Optionally, only return members that satisfy a given predicate."""
+    results = []
+    for key in dir(object):
+        value = getattr(object, key)
+        if not predicate or predicate(value):
+            results.append((key, value))
+    results.sort()
+    return results
+
+def classify_class_attrs(cls):
+    """Return list of attribute-descriptor tuples.
+
+    For each name in dir(cls), the return list contains a 4-tuple
+    with these elements:
+
+        0. The name (a string).
+
+        1. The kind of attribute this is, one of these strings:
+               'class method'    created via classmethod()
+               'static method'   created via staticmethod()
+               'property'        created via property()
+               'method'          any other flavor of method
+               'data'            not a method
+
+        2. The class which defined this attribute (a class).
+
+        3. The object as obtained directly from the defining class's
+           __dict__, not via getattr.  This is especially important for
+           data attributes:  C.data is just a data object, but
+           C.__dict__['data'] may be a data descriptor with additional
+           info, like a __doc__ string.
+    """
+
+    mro = getmro(cls)
+    names = dir(cls)
+    result = []
+    for name in names:
+        # Get the object associated with the name.
+        # Getting an obj from the __dict__ sometimes reveals more than
+        # using getattr.  Static and class methods are dramatic examples.
+        if name in cls.__dict__:
+            obj = cls.__dict__[name]
+        else:
+            obj = getattr(cls, name)
+
+        # Figure out where it was defined.
+        homecls = getattr(obj, "__objclass__", None)
+        if homecls is None:
+            # search the dicts.
+            for base in mro:
+                if name in base.__dict__:
+                    homecls = base
+                    break
+
+        # Get the object again, in order to get it from the defining
+        # __dict__ instead of via getattr (if possible).
+        if homecls is not None and name in homecls.__dict__:
+            obj = homecls.__dict__[name]
+
+        # Also get the object via getattr.
+        obj_via_getattr = getattr(cls, name)
+
+        # Classify the object.
+        if isinstance(obj, staticmethod):
+            kind = "static method"
+        elif isinstance(obj, classmethod):
+            kind = "class method"
+        elif isinstance(obj, property):
+            kind = "property"
+        elif (ismethod(obj_via_getattr) or
+              ismethoddescriptor(obj_via_getattr)):
+            kind = "method"
+        else:
+            kind = "data"
+
+        result.append((name, kind, homecls, obj))
+
+    return result
+
+# ----------------------------------------------------------- class helpers
+def _searchbases(cls, accum):
+    # Simulate the "classic class" search order.
+    if cls in accum:
+        return
+    accum.append(cls)
+    for base in cls.__bases__:
+        _searchbases(base, accum)
+
+def getmro(cls):
+    "Return tuple of base classes (including cls) in method resolution order."
+    if hasattr(cls, "__mro__"):
+        return cls.__mro__
+    else:
+        result = []
+        _searchbases(cls, result)
+        return tuple(result)
+
+# -------------------------------------------------- source code extraction
+def indentsize(line):
+    """Return the indent size, in spaces, at the start of a line of text."""
+    expline = string.expandtabs(line)
+    return len(expline) - len(string.lstrip(expline))
+
+def getdoc(object):
+    """Get the documentation string for an object.
+
+    All tabs are expanded to spaces.  To clean up docstrings that are
+    indented to line up with blocks of code, any whitespace than can be
+    uniformly removed from the second line onwards is removed."""
+
+    try:
+        doc = object.__doc__
+    except AttributeError:
+        return None
+    # Jython doesn't like this syntax
+    # if not isinstance(doc, (str, unicode)):
+    # in Jython UnicodeType == StringType
+    if not isinstance(doc, types.StringType):
+        return None
+    try:
+        lines = string.split(string.expandtabs(doc), '\n')
+    except UnicodeError:
+        return None
+    else:
+        margin = None
+        for line in lines[1:]:
+            content = len(string.lstrip(line))
+            if not content: continue
+            indent = len(line) - content
+            if margin is None: margin = indent
+            else: margin = min(margin, indent)
+        if margin is not None:
+            for i in range(1, len(lines)): lines[i] = lines[i][margin:]
+        return string.join(lines, '\n')
+
+def getfile(object):
+    """Work out which source or compiled file an object was defined in."""
+    if ismodule(object):
+        if hasattr(object, '__file__'):
+            return object.__file__
+        raise TypeError, 'arg is a built-in module'
+    if isclass(object):
+        object = sys.modules.get(object.__module__)
+        if hasattr(object, '__file__'):
+            return object.__file__
+        raise TypeError, 'arg is a built-in class'
+    if ismethod(object):
+        object = object.im_func
+    if isfunction(object):
+        object = object.func_code
+    if istraceback(object):
+        object = object.tb_frame
+    if isframe(object):
+        object = object.f_code
+    if iscode(object):
+        return object.co_filename
+    raise TypeError, 'arg is not a module, class, method, ' \
+                     'function, traceback, frame, or code object'
+
+def getmoduleinfo(path):
+    """Get the module name, suffix, mode, and module type for a given file."""
+    filename = os.path.basename(path)
+    suffixes = map(lambda (suffix, mode, mtype):
+                   (-len(suffix), suffix, mode, mtype), imp.get_suffixes())
+    suffixes.sort() # try longest suffixes first, in case they overlap
+    for neglen, suffix, mode, mtype in suffixes:
+        if filename[neglen:] == suffix:
+            return filename[:neglen], suffix, mode, mtype
+
+def getmodulename(path):
+    """Return the module name for a given file, or None."""
+    info = getmoduleinfo(path)
+    if info: return info[0]
+
+def getsourcefile(object):
+    """Return the Python source file an object was defined in, if it exists."""
+    filename = getfile(object)
+    if string.lower(filename[-4:]) in ['.pyc', '.pyo']:
+        filename = filename[:-4] + '.py'
+    for suffix, mode, kind in imp.get_suffixes():
+        if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
+            # Looks like a binary file.  We want to only return a text file.
+            return None
+    if os.path.exists(filename):
+        return filename
+
+def getabsfile(object):
+    """Return an absolute path to the source or compiled file for an object.
+
+    The idea is for each object to have a unique origin, so this routine
+    normalizes the result as much as possible."""
+    return os.path.normcase(
+        os.path.abspath(getsourcefile(object) or getfile(object)))
+
+modulesbyfile = {}
+
+def getmodule(object):
+    """Return the module an object was defined in, or None if not found."""
+    if ismodule(object):
+        return object
+    if isclass(object):
+        return sys.modules.get(object.__module__)
+    try:
+        file = getabsfile(object)
+    except TypeError:
+        return None
+    if modulesbyfile.has_key(file):
+        return sys.modules[modulesbyfile[file]]
+    for module in sys.modules.values():
+        if hasattr(module, '__file__'):
+            modulesbyfile[getabsfile(module)] = module.__name__
+    if modulesbyfile.has_key(file):
+        return sys.modules[modulesbyfile[file]]
+    main = sys.modules['__main__']
+    if hasattr(main, object.__name__):
+        mainobject = getattr(main, object.__name__)
+        if mainobject is object:
+            return main
+    builtin = sys.modules['__builtin__']
+    if hasattr(builtin, object.__name__):
+        builtinobject = getattr(builtin, object.__name__)
+        if builtinobject is object:
+            return builtin
+
+def findsource(object):
+    """Return the entire source file and starting line number for an object.
+
+    The argument may be a module, class, method, function, traceback, frame,
+    or code object.  The source code is returned as a list of all the lines
+    in the file and the line number indexes a line in that list.  An IOError
+    is raised if the source code cannot be retrieved."""
+    try:
+        file = open(getsourcefile(object))
+    except (TypeError, IOError):
+        raise IOError, 'could not get source code'
+    lines = file.readlines()
+    file.close()
+
+    if ismodule(object):
+        return lines, 0
+
+    if isclass(object):
+        name = object.__name__
+        pat = re.compile(r'^\s*class\s*' + name + r'\b')
+        for i in range(len(lines)):
+            if pat.match(lines[i]): return lines, i
+        else: raise IOError, 'could not find class definition'
+
+    if ismethod(object):
+        object = object.im_func
+    if isfunction(object):
+        object = object.func_code
+    if istraceback(object):
+        object = object.tb_frame
+    if isframe(object):
+        object = object.f_code
+    if iscode(object):
+        if not hasattr(object, 'co_firstlineno'):
+            raise IOError, 'could not find function definition'
+        lnum = object.co_firstlineno - 1
+        pat = re.compile(r'^\s*def\s')
+        while lnum > 0:
+            if pat.match(lines[lnum]): break
+            lnum = lnum - 1
+        return lines, lnum
+    raise IOError, 'could not find code object'
+
+def getcomments(object):
+    """Get lines of comments immediately preceding an object's source code."""
+    try: lines, lnum = findsource(object)
+    except IOError: return None
+
+    if ismodule(object):
+        # Look for a comment block at the top of the file.
+        start = 0
+        if lines and lines[0][:2] == '#!': start = 1
+        while start < len(lines) and string.strip(lines[start]) in ['', '#']:
+            start = start + 1
+        if start < len(lines) and lines[start][:1] == '#':
+            comments = []
+            end = start
+            while end < len(lines) and lines[end][:1] == '#':
+                comments.append(string.expandtabs(lines[end]))
+                end = end + 1
+            return string.join(comments, '')
+
+    # Look for a preceding block of comments at the same indentation.
+    elif lnum > 0:
+        indent = indentsize(lines[lnum])
+        end = lnum - 1
+        if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \
+            indentsize(lines[end]) == indent:
+            comments = [string.lstrip(string.expandtabs(lines[end]))]
+            if end > 0:
+                end = end - 1
+                comment = string.lstrip(string.expandtabs(lines[end]))
+                while comment[:1] == '#' and indentsize(lines[end]) == indent:
+                    comments[:0] = [comment]
+                    end = end - 1
+                    if end < 0: break
+                    comment = string.lstrip(string.expandtabs(lines[end]))
+            while comments and string.strip(comments[0]) == '#':
+                comments[:1] = []
+            while comments and string.strip(comments[-1]) == '#':
+                comments[-1:] = []
+            return string.join(comments, '')
+
+class ListReader:
+    """Provide a readline() method to return lines from a list of strings."""
+    def __init__(self, lines):
+        self.lines = lines
+        self.index = 0
+
+    def readline(self):
+        i = self.index
+        if i < len(self.lines):
+            self.index = i + 1
+            return self.lines[i]
+        else: return ''
+
+class EndOfBlock(Exception): pass
+
+class BlockFinder:
+    """Provide a tokeneater() method to detect the end of a code block."""
+    def __init__(self):
+        self.indent = 0
+        self.started = 0
+        self.last = 0
+
+    def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
+        if not self.started:
+            if type == tokenize.NAME: self.started = 1
+        elif type == tokenize.NEWLINE:
+            self.last = srow
+        elif type == tokenize.INDENT:
+            self.indent = self.indent + 1
+        elif type == tokenize.DEDENT:
+            self.indent = self.indent - 1
+            if self.indent == 0: raise EndOfBlock, self.last
+
+def getblock(lines):
+    """Extract the block of code at the top of the given list of lines."""
+    try:
+        tokenize.tokenize(ListReader(lines).readline, BlockFinder().tokeneater)
+    except EndOfBlock, eob:
+        return lines[:eob.args[0]]
+
+def getsourcelines(object):
+    """Return a list of source lines and starting line number for an object.
+
+    The argument may be a module, class, method, function, traceback, frame,
+    or code object.  The source code is returned as a list of the lines
+    corresponding to the object and the line number indicates where in the
+    original source file the first line of code was found.  An IOError is
+    raised if the source code cannot be retrieved."""
+    lines, lnum = findsource(object)
+
+    if ismodule(object): return lines, 0
+    else: return getblock(lines[lnum:]), lnum + 1
+
+def getsource(object):
+    """Return the text of the source code for an object.
+
+    The argument may be a module, class, method, function, traceback, frame,
+    or code object.  The source code is returned as a single string.  An
+    IOError is raised if the source code cannot be retrieved."""
+    lines, lnum = getsourcelines(object)
+    return string.join(lines, '')
+
+# --------------------------------------------------- class tree extraction
+def walktree(classes, children, parent):
+    """Recursive helper function for getclasstree()."""
+    results = []
+    classes.sort(lambda a, b: cmp(a.__name__, b.__name__))
+    for c in classes:
+        results.append((c, c.__bases__))
+        if children.has_key(c):
+            results.append(walktree(children[c], children, c))
+    return results
+
+def getclasstree(classes, unique=0):
+    """Arrange the given list of classes into a hierarchy of nested lists.
+
+    Where a nested list appears, it contains classes derived from the class
+    whose entry immediately precedes the list.  Each entry is a 2-tuple
+    containing a class and a tuple of its base classes.  If the 'unique'
+    argument is true, exactly one entry appears in the returned structure
+    for each class in the given list.  Otherwise, classes using multiple
+    inheritance and their descendants will appear multiple times."""
+    children = {}
+    roots = []
+    for c in classes:
+        if c.__bases__:
+            for parent in c.__bases__:
+                if not children.has_key(parent):
+                    children[parent] = []
+                children[parent].append(c)
+                if unique and parent in classes: break
+        elif c not in roots:
+            roots.append(c)
+    for parent in children.keys():
+        if parent not in classes:
+            roots.append(parent)
+    return walktree(roots, children, None)
+
+# ------------------------------------------------ argument list extraction
+# These constants are from Python's compile.h.
+CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8
+
+def getargs(co):
+    """Get information about the arguments accepted by a code object.
+
+    Three things are returned: (args, varargs, varkw), where 'args' is
+    a list of argument names (possibly containing nested lists), and
+    'varargs' and 'varkw' are the names of the * and ** arguments or None."""
+
+    if not iscode(co): raise TypeError, 'arg is not a code object'
+
+##     #jython doesn't have co_code
+##     code = co.co_code
+    nargs = co.co_argcount
+    names = co.co_varnames
+    args = list(names[:nargs])
+    step = 0
+
+## We don't have co_code, so skip this for now
+##    
+##     # The following acrobatics are for anonymous (tuple) arguments.
+##     for i in range(nargs):
+##         if args[i][:1] in ['', '.']:
+##             stack, remain, count = [], [], []
+##             while step < len(code):
+##                 op = ord(code[step])
+##                 step = step + 1
+##                 if op >= dis.HAVE_ARGUMENT:
+##                     opname = dis.opname[op]
+##                     value = ord(code[step]) + ord(code[step+1])*256
+##                     step = step + 2
+##                     if opname in ['UNPACK_TUPLE', 'UNPACK_SEQUENCE']:
+##                         remain.append(value)
+##                         count.append(value)
+##                     elif opname == 'STORE_FAST':
+##                         stack.append(names[value])
+##                         remain[-1] = remain[-1] - 1
+##                         while remain[-1] == 0:
+##                             remain.pop()
+##                             size = count.pop()
+##                             stack[-size:] = [stack[-size:]]
+##                             if not remain: break
+##                             remain[-1] = remain[-1] - 1
+##                         if not remain: break
+##             args[i] = stack[0]
+
+    varargs = None
+    if co.co_flags & CO_VARARGS:
+        varargs = co.co_varnames[nargs]
+        nargs = nargs + 1
+    varkw = None
+    if co.co_flags & CO_VARKEYWORDS:
+        varkw = co.co_varnames[nargs]
+    return args, varargs, varkw
+
+def getargspec(func):
+    """Get the names and default values of a function's arguments.
+
+    A tuple of four things is returned: (args, varargs, varkw, defaults).
+    'args' is a list of the argument names (it may contain nested lists).
+    'varargs' and 'varkw' are the names of the * and ** arguments or None.
+    'defaults' is an n-tuple of the default values of the last n arguments."""
+    if not isfunction(func): raise TypeError, 'arg is not a Python function'
+    args, varargs, varkw = getargs(func.func_code)
+    return args, varargs, varkw, func.func_defaults
+
+def getargvalues(frame):
+    """Get information about arguments passed into a particular frame.
+
+    A tuple of four things is returned: (args, varargs, varkw, locals).
+    'args' is a list of the argument names (it may contain nested lists).
+    'varargs' and 'varkw' are the names of the * and ** arguments or None.
+    'locals' is the locals dictionary of the given frame."""
+    args, varargs, varkw = getargs(frame.f_code)
+    return args, varargs, varkw, frame.f_locals
+
+def joinseq(seq):
+    if len(seq) == 1:
+        return '(' + seq[0] + ',)'
+    else:
+        return '(' + string.join(seq, ', ') + ')'
+
+def strseq(object, convert, join=joinseq):
+    """Recursively walk a sequence, stringifying each element."""
+    if type(object) in [types.ListType, types.TupleType]:
+        return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
+    else:
+        return convert(object)
+
+def formatargspec(args, varargs=None, varkw=None, defaults=None,
+                  formatarg=str,
+                  formatvarargs=lambda name: '*' + name,
+                  formatvarkw=lambda name: '**' + name,
+                  formatvalue=lambda value: '=' + repr(value),
+                  join=joinseq):
+    """Format an argument spec from the 4 values returned by getargspec.
+
+    The first four arguments are (args, varargs, varkw, defaults).  The
+    other four arguments are the corresponding optional formatting functions
+    that are called to turn names and values into strings.  The ninth
+    argument is an optional function to format the sequence of arguments."""
+    specs = []
+    if defaults:
+        firstdefault = len(args) - len(defaults)
+    for i in range(len(args)):
+        spec = strseq(args[i], formatarg, join)
+        if defaults and i >= firstdefault:
+            spec = spec + formatvalue(defaults[i - firstdefault])
+        specs.append(spec)
+    if varargs:
+        specs.append(formatvarargs(varargs))
+    if varkw:
+        specs.append(formatvarkw(varkw))
+    return '(' + string.join(specs, ', ') + ')'
+
+def formatargvalues(args, varargs, varkw, locals,
+                    formatarg=str,
+                    formatvarargs=lambda name: '*' + name,
+                    formatvarkw=lambda name: '**' + name,
+                    formatvalue=lambda value: '=' + repr(value),
+                    join=joinseq):
+    """Format an argument spec from the 4 values returned by getargvalues.
+
+    The first four arguments are (args, varargs, varkw, locals).  The
+    next four arguments are the corresponding optional formatting functions
+    that are called to turn names and values into strings.  The ninth
+    argument is an optional function to format the sequence of arguments."""
+    def convert(name, locals=locals,
+                formatarg=formatarg, formatvalue=formatvalue):
+        return formatarg(name) + formatvalue(locals[name])
+    specs = []
+    for i in range(len(args)):
+        specs.append(strseq(args[i], convert, join))
+    if varargs:
+        specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
+    if varkw:
+        specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
+    return '(' + string.join(specs, ', ') + ')'
+
+# -------------------------------------------------- stack frame extraction
+def getframeinfo(frame, context=1):
+    """Get information about a frame or traceback object.
+
+    A tuple of five things is returned: the filename, the line number of
+    the current line, the function name, a list of lines of context from
+    the source code, and the index of the current line within that list.
+    The optional second argument specifies the number of lines of context
+    to return, which are centered around the current line."""
+    if istraceback(frame):
+        frame = frame.tb_frame
+    if not isframe(frame):
+        raise TypeError, 'arg is not a frame or traceback object'
+
+    filename = getsourcefile(frame)
+    lineno = getlineno(frame)
+    if context > 0:
+##         # Jython 2.1 can't handle //
+##         start = lineno - 1 - context//2
+        start = lineno - 1 - context/2
+        try:
+            lines, lnum = findsource(frame)
+        except IOError:
+            lines = index = None
+        else:
+            start = max(start, 1)
+            start = min(start, len(lines) - context)
+            lines = lines[start:start+context]
+            index = lineno - 1 - start
+    else:
+        lines = index = None
+
+    return (filename, lineno, frame.f_code.co_name, lines, index)
+
+def getlineno(frame):
+    """Get the line number from a frame object, allowing for optimization."""
+    # Written by Marc-Andre Lemburg; revised by Jim Hugunin and Fredrik Lundh.
+    lineno = frame.f_lineno
+    code = frame.f_code
+    if hasattr(code, 'co_lnotab'):
+        table = code.co_lnotab
+        lineno = code.co_firstlineno
+        addr = 0
+        for i in range(0, len(table), 2):
+            addr = addr + ord(table[i])
+            if addr > frame.f_lasti: break
+            lineno = lineno + ord(table[i+1])
+    return lineno
+
+def getouterframes(frame, context=1):
+    """Get a list of records for a frame and all higher (calling) frames.
+
+    Each record contains a frame object, filename, line number, function
+    name, a list of lines of context, and index within the context."""
+    framelist = []
+    while frame:
+        framelist.append((frame,) + getframeinfo(frame, context))
+        frame = frame.f_back
+    return framelist
+
+def getinnerframes(tb, context=1):
+    """Get a list of records for a traceback's frame and all lower frames.
+
+    Each record contains a frame object, filename, line number, function
+    name, a list of lines of context, and index within the context."""
+    framelist = []
+    while tb:
+        framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
+        tb = tb.tb_next
+    return framelist
+
+def currentframe():
+    """Return the frame object for the caller's stack frame."""
+    try:
+        raise 'catch me'
+    except:
+        return sys.exc_traceback.tb_frame.f_back
+
+if hasattr(sys, '_getframe'): currentframe = sys._getframe
+
+def stack(context=1):
+    """Return a list of records for the stack above the caller's frame."""
+    return getouterframes(currentframe().f_back, context)
+
+def trace(context=1):
+    """Return a list of records for the stack below the current exception."""
+    return getinnerframes(sys.exc_traceback, context)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/runConsole.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/runConsole.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/runConsole.py	(revision 1126)
@@ -0,0 +1,2 @@
+from console import main
+main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/introspect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/introspect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/introspect.py	(revision 1126)
@@ -0,0 +1,387 @@
+"""Provides a variety of introspective-type support functions for
+things like call tips and command auto completion.
+
+NOTE: this file is a modification of Patrick O'Brien's version 1.62
+"""
+
+#from __future__ import nested_scopes
+
+__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
+__cvsid__ = "$Id: introspect.py 5910 2006-06-20 10:03:31Z jmvivo $"
+__revision__ = "$Revision: 5910 $"[11:-2]
+
+
+import cStringIO
+import inspect
+import sys
+import tokenize
+import types
+
+try:
+    True
+except NameError:
+    True = 1==1
+    False = 1==0
+
+def getAutoCompleteList(command='', locals=None, includeMagic=1, 
+                        includeSingle=1, includeDouble=1):
+    """Return list of auto-completion options for command.
+    
+    The list of options will be based on the locals namespace."""
+    attributes = []
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='.')
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        pass
+    else:
+        attributes = getAttributeNames(object, includeMagic, 
+                                       includeSingle, includeDouble)
+    return attributes
+    
+def getAttributeNames(object, includeMagic=1, includeSingle=1,
+                      includeDouble=1):
+    """Return list of unique attributes, including inherited, for object."""
+    attributes = []
+    dict = {}
+    if not hasattrAlwaysReturnsTrue(object):
+        # Add some attributes that don't always get picked up.  If
+        # they don't apply, they'll get filtered out at the end.
+        attributes += ['__bases__', '__class__', '__dict__', '__name__', 
+                       'func_closure', 'func_code', 'func_defaults', 
+                       'func_dict', 'func_doc', 'func_globals', 'func_name']
+    if includeMagic:
+        try: attributes += object._getAttributeNames()
+        except: pass
+    # Get all attribute names.
+    attrdict = getAllAttributeNames(object)
+    for attrlist in attrdict.values():
+        attributes += attrlist
+    # Remove duplicates from the attribute list.
+    for item in attributes:
+        dict[item] = None
+    attributes = dict.keys()
+    attributes.sort(lambda x, y: cmp(x.upper(), y.upper()))
+    if not includeSingle:
+        attributes = filter(lambda item: item[0]!='_' \
+                            or item[1]=='_', attributes)
+    if not includeDouble:
+        attributes = filter(lambda item: item[:2]!='__', attributes)
+    # Make sure we haven't picked up any bogus attributes somehow.
+    attributes = [attribute for attribute in attributes \
+                  if hasattr(object, attribute)]
+    return attributes
+
+def hasattrAlwaysReturnsTrue(object):
+    return hasattr(object, 'bogu5_123_aTTri8ute')
+
+def getAllAttributeNames(object):
+    """Return dict of all attributes, including inherited, for an object.
+    
+    Recursively walk through a class and all base classes.
+    """
+    #print "getAllAttributeNames  1",repr(object), repr(str(object))
+    attrdict = {}  # (object, technique, count): [list of attributes]
+    # !!!
+    # Do Not use hasattr() as a test anywhere in this function,
+    # because it is unreliable with remote objects: xmlrpc, soap, etc.
+    # They always return true for hasattr().
+    # !!!
+    #print "getAllAttributeNames  2"
+    try:
+        # Yes, this can fail if object is an instance of a class with
+        # __str__ (or __repr__) having a bug or raising an
+        # exception. :-(
+        key = str(object)
+    except:
+        key = 'anonymous'
+    # Wake up sleepy objects - a hack for ZODB objects in "ghost" state.
+    #print "getAllAttributeNames  3"
+    wakeupcall = dir(object)
+    #print "getAllAttributeNames  4"
+    del wakeupcall
+    # Get attributes available through the normal convention.
+    #print "getAllAttributeNames  5"
+    attributes = dir(object)
+    attrdict[(key, 'dir', len(attributes))] = attributes
+    #print "getAllAttributeNames  6"
+    # Get attributes from the object's dictionary, if it has one.
+    try:
+        attributes = object.__dict__.keys()
+        attributes.sort()
+    except:  # Must catch all because object might have __getattr__.
+        pass
+    else:
+        attrdict[(key, '__dict__', len(attributes))] = attributes
+    # For a class instance, get the attributes for the class.
+    #print "getAllAttributeNames  7"
+    try:
+        klass = object.__class__
+    except:  # Must catch all because object might have __getattr__.
+        pass
+    else:
+        if klass is object or klass is type:
+            # Break a circular reference. This happens with extension
+            # classes.
+            pass
+        else:
+            attrdict.update(getAllAttributeNames(klass))
+    #print "getAllAttributeNames  8"
+    # Also get attributes from any and all parent classes.
+    try:
+        bases = object.__bases__
+    except:  # Must catch all because object might have __getattr__.
+        pass
+    else:
+        if isinstance(bases, types.TupleType):
+            for base in bases:
+                if type(base) is types.TypeType:
+                    # Break a circular reference. Happens in Python 2.2.
+                    pass
+                else:
+                    attrdict.update(getAllAttributeNames(base))
+    #print "getAllAttributeNames  attrdict=",repr(attrdict)
+    return attrdict
+
+def getCallTip(command='', locals=None):
+    """For a command, return a tuple of object name, argspec, tip text.
+    
+    The call tip information will be based on the locals namespace."""
+    calltip = ('', '', '')  # object name, argspec, tip text.
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='(')
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        return calltip
+    name = ''
+    object, dropSelf = getBaseObject(object)
+    try:
+        name = object.__name__
+    except AttributeError:
+        pass
+    tip1 = ''
+    argspec = ''
+    if inspect.isbuiltin(object):
+        # Builtin functions don't have an argspec that we can get.
+        pass
+    elif inspect.isfunction(object):
+        # tip1 is a string like: "getCallTip(command='', locals=None)"
+        argspec = apply(inspect.formatargspec, inspect.getargspec(object))
+        if dropSelf:
+            # The first parameter to a method is a reference to an
+            # instance, usually coded as "self", and is usually passed
+            # automatically by Python; therefore we want to drop it.
+            temp = argspec.split(',')
+            if len(temp) == 1:  # No other arguments.
+                argspec = '()'
+            else:  # Drop the first argument.
+                argspec = '(' + ','.join(temp[1:]).lstrip()
+        tip1 = name + argspec
+    doc = ''
+    if callable(object):
+        doc = inspect.getdoc(object)
+    if doc:
+        # tip2 is the first separated line of the docstring, like:
+        # "Return call tip text for a command."
+        # tip3 is the rest of the docstring, like:
+        # "The call tip information will be based on ... <snip>
+        firstline = doc.split('\n')[0].lstrip()
+        if tip1 == firstline:
+            tip1 = ''
+        else:
+            tip1 += '\n\n'
+        docpieces = doc.split('\n\n')
+        tip2 = docpieces[0]
+        tip3 = '\n\n'.join(docpieces[1:])
+        tip = '%s%s\n\n%s' % (tip1, tip2, tip3)
+    else:
+        tip = tip1
+    calltip = (name, argspec[1:-1], tip.strip())
+    return calltip
+
+def getRoot(command, terminator=None):
+    """Return the rightmost root portion of an arbitrary Python command.
+    
+    Return only the root portion that can be eval()'d without side
+    effects.  The command would normally terminate with a '(' or
+    '.'. The terminator and anything after the terminator will be
+    dropped."""
+    command = command.split('\n')[-1]
+    if command.startswith(sys.ps2):
+        command = command[len(sys.ps2):]
+    command = command.lstrip()
+    command = rtrimTerminus(command, terminator)
+    tokens = getTokens(command)
+    if not tokens:
+        return ''
+    if tokens[-1][0] is tokenize.ENDMARKER:
+        # Remove the end marker.
+        del tokens[-1]
+    if not tokens:
+        return ''
+    if terminator == '.' and \
+           (tokens[-1][1] <> '.' or tokens[-1][0] is not tokenize.OP):
+        # Trap decimals in numbers, versus the dot operator.
+        return ''
+    else:
+        # Strip off the terminator.
+        if terminator and command.endswith(terminator):
+            size = 0 - len(terminator)
+            command = command[:size]
+    command = command.rstrip()
+    tokens = getTokens(command)
+    tokens.reverse()
+    line = ''
+    start = None
+    prefix = ''
+    laststring = '.'
+    emptyTypes = ('[]', '()', '{}')
+    for token in tokens:
+        tokentype = token[0]
+        tokenstring = token[1]
+        line = token[4]
+        if tokentype is tokenize.ENDMARKER:
+            continue
+        if tokentype in (tokenize.NAME, tokenize.STRING, tokenize.NUMBER) \
+        and laststring != '.':
+            # We've reached something that's not part of the root.
+            if prefix and line[token[3][1]] != ' ':
+                # If it doesn't have a space after it, remove the prefix.
+                prefix = ''
+            break
+        if tokentype in (tokenize.NAME, tokenize.STRING, tokenize.NUMBER) \
+        or (tokentype is tokenize.OP and tokenstring == '.'):
+            if prefix:
+                # The prefix isn't valid because it comes after a dot.
+                prefix = ''
+                break
+            else:
+                # start represents the last known good point in the line.
+                start = token[2][1]
+        elif len(tokenstring) == 1 and tokenstring in ('[({])}'):
+            # Remember, we're working backwords.
+            # So prefix += tokenstring would be wrong.
+            if prefix in emptyTypes and tokenstring in ('[({'):
+                # We've already got an empty type identified so now we
+                # are in a nested situation and we can break out with
+                # what we've got.
+                break
+            else:
+                prefix = tokenstring + prefix
+        else:
+            # We've reached something that's not part of the root.
+            break
+        laststring = tokenstring
+    if start is None:
+        start = len(line)
+    root = line[start:]
+    if prefix in emptyTypes:
+        # Empty types are safe to be eval()'d and introspected.
+        root = prefix + root
+    return root    
+
+class _EaterTokens:
+  def __init__(self,tokens):
+    self.tokens = tokens
+
+  def __call__(self,*args):
+    self.tokens.append(args)
+
+def getTokens(command):
+    """Return list of token tuples for command."""
+    command = str(command)  # In case the command is unicode, which fails.
+    f = cStringIO.StringIO(command)
+    # tokens is a list of token tuples, each looking like: 
+    # (type, string, (srow, scol), (erow, ecol), line)
+    tokens = []
+    # Can't use list comprehension:
+    #   tokens = [token for token in tokenize.generate_tokens(f.readline)]
+    # because of need to append as much as possible before TokenError.
+    try:
+##        This code wasn't backward compatible with Python 2.1.3.
+##
+##        for token in tokenize.generate_tokens(f.readline):
+##            tokens.append(token)
+        # This works with Python 2.1.3 (with nested_scopes).
+##        def eater(*args):
+##            tokens.append(args)
+##        tokenize.tokenize_loop(f.readline, eater)
+        eater = _EaterTokens(tokens) #Con una lambda no se lo come 
+        tokenize.tokenize_loop(f.readline, eater)
+    except tokenize.TokenError:
+        # This is due to a premature EOF, which we expect since we are
+        # feeding in fragments of Python code.
+        pass
+    return tokens    
+
+def rtrimTerminus(command, terminator=None):
+    """Return command minus anything that follows the final terminator."""
+    if terminator:
+        pieces = command.split(terminator)
+        if len(pieces) > 1:
+            command = terminator.join(pieces[:-1]) + terminator
+    return command
+
+def getBaseObject(object):
+    """Return base object and dropSelf indicator for an object."""
+    if inspect.isbuiltin(object):
+        # Builtin functions don't have an argspec that we can get.
+        dropSelf = 0
+    elif inspect.ismethod(object):
+        # Get the function from the object otherwise
+        # inspect.getargspec() complains that the object isn't a
+        # Python function.
+        try:
+            if object.im_self is None:
+                # This is an unbound method so we do not drop self
+                # from the argspec, since an instance must be passed
+                # as the first arg.
+                dropSelf = 0
+            else:
+                dropSelf = 1
+            object = object.im_func
+        except AttributeError:
+            dropSelf = 0
+    elif inspect.isclass(object):
+        # Get the __init__ method function for the class.
+        constructor = getConstructor(object)
+        if constructor is not None:
+            object = constructor
+            dropSelf = 1
+        else:
+            dropSelf = 0
+    elif callable(object):
+        # Get the __call__ method instead.
+        try:
+            call_method = object.__call__.im_func
+            if call_method.__name__ == '__call__':
+                # unbound jython method end up here, example: string.index(
+                dropSelf = 0
+            else:
+                object = call_method
+                dropSelf = 1
+        except AttributeError:
+            # unbound python methods end up here
+            dropSelf = 0
+    else:
+        dropSelf = 0
+    return object, dropSelf
+
+def getConstructor(object):
+    """Return constructor for class object, or None if there isn't one."""
+    try:
+        return object.__init__.im_func
+    except AttributeError:
+        for base in object.__bases__:
+            constructor = getConstructor(base)
+            if constructor is not None:
+                return constructor
+    return None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/problems.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/problems.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/problems.txt	(revision 1126)
@@ -0,0 +1,23 @@
+==========================
+Known problems
+==========================
+
+You must use the keyboard not the mouse to select methods.  (Due to focus problems.)
+
+python.security.respectJavaAccessibility must be set to true in Jython's registry
+
+You can't insert '(' and ')' in the middle of a line
+
+Method popup displays names multiple times for overloaded methods
+
+Method popup gets abandoned with too many backspaces.  (Use <ESC> to make it go away)
+
+Builtin types don't work, like they do in PyCrust.  This is because they have a null __doc__ string in Jython.
+
+Static methods and properties don't seem to work correctly.
+
+<CTRL>+D (or <CRTL>+Z) to exit is not implemented
+
+History doesn't quite work correctly
+
+$Id: problems.txt 5782 2006-06-12 07:56:49Z jmvivo $
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/testcase.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/testcase.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/testcase.py	(revision 1126)
@@ -0,0 +1,28 @@
+import unittest
+import introspect
+
+class IntrospectTestCase(unittest.TestCase):
+
+    def testUnboundMethod(self):
+        import string
+        method = 'string.index('
+        (name, argspec, tip) = introspect.getCallTip(method, locals())
+
+        self.assertEquals('index', name)
+        self.assertEquals('s, *args', argspec)
+        self.assertEquals('index(s, *args)\n\nindex(s, sub [,start [,end]]) -> int\n\nLike find but raises ValueError when the substring is not found.', tip)
+
+    def testBuiltinFunction(self):
+        method = 'len('
+        print introspect.getCallTip(method, locals())
+        
+        (name, argspec, tip) = introspect.getCallTip(method, locals())
+        
+        self.assertEquals('len', name)
+        # next 2 assertions fail in Jython!
+        self.assertEquals('len(object) -> integer', argspec)
+        self.assertEquals('len(object) -> integer\n\nReturn the number of items of a sequence or mapping', tip)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/tip.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/tip.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/console/tip.py	(revision 1126)
@@ -0,0 +1,45 @@
+from java.awt import Color, Dimension
+from javax.swing import JWindow, JTextArea, JScrollPane
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: tip.py 5782 2006-06-12 07:56:49Z jmvivo $"
+
+class Tip(JWindow):
+    """
+    Window which provides the user with information about the method
+    For Python, this shows arguments, and the documention
+    For Java, this shows the signature(s) and return type
+    """
+    # TODO handle java methods with many overload more gracefully
+    MAX_HEIGHT = 300
+    MAX_WIDTH = 400
+    
+    def __init__(self, frame):
+        JWindow.__init__(self, frame)
+        #self.size = (300,150)
+        self.textarea = JTextArea()
+        # TODO put this color with all the other colors
+        self.textarea.setBackground(Color(225,255,255))
+        self.textarea.setEditable(0)
+        self.jscrollpane = JScrollPane(self.textarea)
+        self.getContentPane().add(self.jscrollpane)
+
+    def setText(self, tip):
+        self.textarea.setText(tip)
+        self.textarea.setCaretPosition(0)
+        #print >> sys.stderr, self.textarea.getPreferredScrollableViewportSize()
+        self.setSize(self.getPreferredSize())
+
+    def getPreferredSize(self):
+        # need to add a magic amount to the size to avoid scrollbars
+        # I'm sure there's a better way to do this
+        MAGIC = 20
+        size = self.textarea.getPreferredScrollableViewportSize()
+        height = size.height + MAGIC
+        width = size.width + MAGIC
+        if height > Tip.MAX_HEIGHT:
+            height = Tip.MAX_HEIGHT
+        if width > Tip.MAX_WIDTH:
+            width = Tip.MAX_WIDTH
+        return Dimension(width, height)
+        
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/gvsig.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/gvsig.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib-2_0_0/gvsig.py	(revision 1126)
@@ -0,0 +1,1098 @@
+# -*- coding: utf-8 -*-
+#
+# File: gvsig.py
+#
+# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
+#
+# GNU General Public License (GPL)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+#
+
+"""
+This module contains classes and functions to manage gvSIG Project, 
+gvSIG DocumentView, gvSIG TableDocument and Layers.
+Also contais functions to manage vectorial data and other utility 
+functions
+"""
+
+__author__ = """Antonio Carrasco Valero
+Model Driven Development sl and Antonio Carrasco Valero
+<carrasco@modeldd.org>
+Victor Acevedo Royer <vacevedor@gvsig.com>, <vacevedor@gmail.com>
+"""
+
+__docformat__ = 'plaintext'
+
+from java.awt import Color
+
+from java.lang import RuntimeException
+from java.lang import Throwable
+import java.lang.IndexOutOfBoundsException
+
+from java.util.prefs import Preferences
+
+from org.gvsig.app import ApplicationLocator
+from org.gvsig.app.project.documents.view import ViewDocument 
+from org.gvsig.app.project.documents.table import TableDocument
+
+from org.gvsig.fmap.crs import CRSFactory
+
+from org.gvsig.fmap.mapcontext import MapContextLocator
+from org.gvsig.fmap.mapcontext.layers import FLayers
+
+from org.gvsig.fmap.dal import DALLocator, DataTypes
+from org.gvsig.fmap.dal.feature import EditableFeature, \
+    EditableFeatureType, FeatureQueryOrder
+from org.gvsig.fmap.dal.feature.impl import DefaultEditableFeature
+
+from org.gvsig.fmap.geom import Geometry
+
+from org.gvsig.tools import ToolsLocator
+
+import thread
+import random
+
+
+def runTask(name, function, *args):
+  manager = ToolsLocator.getTaskStatusManager()
+  status = manager.createDefaultSimpleTaskStatus(name)
+  status.add()
+  args = list(args)
+  args.append(status)
+  try:
+    thread.start_new_thread(function, tuple(args))
+    status.terminate()
+  except Exception,e:
+    status.abort()
+    raise e
+     
+
+class WrapperToJava(object):
+  """Creates a wrapper that allows python object access to the Java object
+  properties and methods
+  """
+  def __init__(self, javaobj):
+    if javaobj == None:
+      raise RuntimeException("Can't create "+ self.__class__.__name__)
+    self._javaobj = javaobj
+
+  def __call__(self):
+    return self._javaobj
+
+  def __getattr__(self,name):
+    return getattr(self._javaobj,name)
+
+class Project(WrapperToJava):
+  """Represents a gvSIG project (org.gvsig.app.project.DefaultProject)"""
+
+  def __init__(self, project):
+    WrapperToJava.__init__(self, project)
+  
+  def getView(self, name=None):
+    """
+    Returns active view, or view called 'name'  or None
+    :param name: view name
+    :type name: string    
+    """
+    if name == None:
+      try:
+        activeDocument = self.getActiveDocument()
+        if activeDocument == None:
+            return None
+        if isinstance(activeDocument, ViewDocument):
+            return View(activeDocument)
+      except Exception, ex:
+        raise Exception("%s"%repr(ex))
+    else:
+      views = self.getViews()
+      if len(views) >0:
+        for view in views:
+          if name == view.getName():
+            return View(view)
+
+    return None
+    
+  def getTable(self, name=None):
+    """
+    Returns active Table Document, or Table Document called 'name'  or None
+    :param name: Table Document name
+    :type name: string
+    """
+    if name == None:
+      try:
+        activeDocument = self.getActiveDocument()
+        if activeDocument == None:
+            return None
+        if isinstance(activeDocument, TableDocument):
+            return Table(activeDocument)
+      except Exception, ex:
+        raise Exception("%s"%repr(ex))
+    else:
+      tables = self.getDocuments("project.document.table")
+      if len(tables) >0:
+        for table in tables:
+          if name == table.getName():
+            return Table(table)
+            
+    return None   
+    
+  def getProjectionCode(self):
+    """Returns Project projection code name string. This value is the 
+    projects default projection that is fixed in Preferences tool, View 
+    options. It's used when no view projection is defined.
+    
+    """
+    return self.getProjection().getFullCode()
+    
+
+class View(WrapperToJava):
+  """
+  Represents gvSIG view document 
+  (org.gvsig.app.project.documents.view.DefaultViewDocument).  
+  """
+  def __init__(self,view):
+    WrapperToJava.__init__(self,view)
+    
+  def getLayer(self, name=None):
+    """
+    Returns one view layer. If name is None returns active 
+    layer if the view has one, if name is not None returns layer called name 
+    else returns None.
+    :param name: view name in Table Of Contents
+    :type name: string
+    :return: View
+    :return: None  
+    """
+    map = self.getMapContext();
+    if name == None:
+      activeLayers = map.getLayers().getActives()
+      if len(activeLayers) != 1 :
+        return None
+      for layer in activeLayers:
+        if not isinstance(layer, FLayers):
+          return Layer(layer)
+      return None
+    
+    ls = self.getLayers()
+    for i in xrange(ls.getLayersCount()):
+      l = ls.getLayer(i)
+      if l.name == name:
+        return Layer(l)
+    
+    return None
+    
+  def getMap(self):
+    # org.gvsig.fmap.mapcontext.MapContext
+    """Returns view mapContext"""
+    return self.getMapContext();
+ 
+  def addLayer(self, layer):
+    """
+    Adds a new layer to the view
+    :param layer: layer to add
+    :type layer: Layer  
+    """
+    if isinstance(layer, Layer):
+      layer =layer()
+    self.getMapContext().getLayers().addLayer(layer)
+  
+  def getLayers(self):
+    """Returns iterable view layers set"""
+    map = self.getMapContext()
+    return Layers(map.getLayers())
+    
+  def getGraphicsLayer(self):
+    """Returns view graphics layer 
+    org.gvsig.fmap.mapcontext.layers.vectorial.impl.DefaultGraphicLayer
+    """
+    return self.getMapContext().getGraphicsLayer()
+    
+  def getProjectionCode(self):
+    """Returns string view projection code name"""
+    return self.getProjection().getFullCode()
+    
+  def isProjected(self):
+    """Returns if view projection is projected."""
+    self.getProjection().isProjected()
+      
+class Layers(WrapperToJava):
+  """Iterable layers set 
+  (org.gvsig.fmap.mapcontext.layers.FLayers)  
+  """
+  def __init__(self,layers):
+    WrapperToJava.__init__(self, layers)
+
+  def __len__(self):
+    return self.getLayersCount()
+
+  def __getitem__(self, index):
+    return self.getLayer(index)
+
+  def __iter__(self):
+    return LayersIterator(self)
+
+class LayersIterator(object):
+
+  def __init__(self,layers):
+    self.__layers = layers
+    self.__index = -1
+
+  def next(self):
+    self.__index+=1
+    if self.__index >= self.__layers.getLayersCount() :
+      raise StopIteration()
+    return Layer(self.__layers.getLayer(self.__index))    
+  
+class Store(WrapperToJava):
+  """Represents gvsig store. It's used as Table/Layer objects store  
+  (org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore)
+  """
+  def __init__(self,store):
+    WrapperToJava.__init__(self, store)
+    #self.data = None
+    self.fset = None
+  
+  def features(self, expresion = None, sortBy="", asc=True):
+    """Returns layer features set (FeatureSet class), with all layer features, 
+    or selected featured if there are (could be empty feature set) or None if
+    gets an Exception.
+    :param expresion: filter to apply to the feature set to select
+        determinates features that match with expression
+    :type expresion: string
+    :param sortBy: name of attribute to sort
+    :type sortby: string
+    :param: asc: order
+    :type asc: boolean
+    :return: FeatureSet
+    """   
+    if expresion == None and sortBy =="":
+      self.fset = self.getFeatureSet()         
+    else:
+      try:
+        application = ApplicationLocator.getManager()
+        datamanager =  application.getDataManager()
+        query = self.createFeatureQuery()
+        if sortBy != "":
+            order = FeatureQueryOrder()
+            order.add(sortBy, asc)
+            query.setOrder(order)
+        if expresion != None:
+            query.setFilter(datamanager.createExpresion(expresion))
+        self.fset = self.getFeatureSet(query)
+      except Exception, e:
+        return None
+    
+    return FeatureSet(self.fset)    
+
+  def edit(self):
+    """Set store in edition mode"""     
+    if not self.isEditing():
+        self().edit() 
+     
+  def append(self, *valuesList, **values):
+    """
+    Creates a new feature from given values and insert it in the feature 
+    set. If an error occurs raises RuntimeException.
+    :param values: dictionary with name property value or list named params
+    :type values: dict
+    """
+    try:
+      if len(valuesList) ==1:
+        values.update(valuesList[0])
+      
+      if not self.isEditing():
+        self.edit() 
+      f = self.createNewFeature()
+      
+      if f == None:
+        raise RuntimeError("Failed to create a new Feature")
+      for k,v in values.iteritems():
+        f.set(k,v)
+        self.insert(f)
+    except Throwable, ex:
+      raise RuntimeException("Can't append values %s to layer %s (%s)" % (
+        repr(values), 
+        self.getName(), 
+        str(ex)
+        )
+      )
+
+  def updateSchema(self, schema):
+    """
+    Updates store FeatureType. If an error occurs raises 
+    RuntimeException.
+    """
+    try:
+      self().update(schema._javaobj)
+    except Throwable, ex:
+      raise RuntimeException(repr(ex))
+    
+  def update(self, feature):
+    """
+    Updates exist feature in the layer featureSet
+    :param editableFeature: editableFeature
+    :type editableFeature: Java editableFeature
+    """
+    if not self.isEditing():
+      self.edit() 
+    
+    if not isinstance(feature, EditableFeature):
+      feature = feature._javaobj
+    self.fset.update(feature)
+  
+  def getSchema(self):
+    """Returns store data attributtes"""
+    return Schema(self.getDefaultFeatureType())
+
+  def commit(self):
+    """
+    Finish store edition saving changes. If an error occurs raises Throwable 
+    Exception.
+    """
+    try:
+      self.finishEditing()          
+    except Throwable, ex:
+      self.abort()
+      raise Throwable("Can't finish layer edition, cancelling changes. %s" % repr(ex))
+  
+  def abort(self):
+    """Finish store edition withoout saving changes and disposes itself"""
+    self.cancelEditing() 
+    self.dispose()
+
+  def getSelection(self):
+    """Returns store features selected set"""
+    return FeatureSet(self().getSelection())
+
+class __DefaultTable__(WrapperToJava):
+  def __init__(self,document, data):
+    self.data = Store(data)
+    WrapperToJava.__init__(self,document)
+    self.selection = None
+
+  def features(self, expresion = None, sortBy="", asc=True):
+    """
+    Returns data features set
+    :param expresion: filter to apply to the feature set to select
+         determinates features that match with expression
+    :type expresion: string
+    :return: FeatureSet
+    """
+    return self.data.features(expresion, sortBy, asc)
+
+  def edit(self):
+    """Sets data in edition mode"""
+     
+    self.data.edit() 
+     
+  def append(self, *valuesList, **values):
+    """
+    Creates a new feature from given values and insert it in the feature set
+    :param values: dictionary with name property value or list named params
+    :type values: dict
+    """
+    self.data.append(*valuesList, **values)
+    
+  def updateSchema(self, schema):
+    """
+    Updates data data attributes properties with the given schema
+    """
+    self.data.updateSchema(schema)
+    
+  def update(self, feature):
+    """
+    Updates exist feature in the featureSet with the given feature
+    :param editableFeature: editableFeature
+    :type editableFeature: Java editableFeature
+    """
+    self.data.update(feature)
+  
+  def getSchema(self):
+    """Returns data attributes definition"""
+    return self.data.getSchema()
+
+  def commit(self):
+    """Finish edition saving changes"""
+    self.data.commit()
+  
+  def abort(self):
+    """Finish edition without saving changes"""
+    self.data.abort()
+    
+  def getSelection(self):
+    """Returns features selected set"""
+    if self.selection == None:
+      self.selection = Selection(self.data.getSelection())
+      
+    return self.selection
+  
+  def select(self, selection):
+    """Inserts features in the features selection set"""
+    self.getSelection().select(selection)
+
+  def deselect(self, selection):
+    """Remove features in the features selection set"""
+    self.getSelection().deselect(selection)
+
+  def isSelected(feature):
+    """Returns True if given feature is selected"""
+    self.getSelection().isSelect(feature)
+
+  def getProjectionCode(self):
+    """Returns projection code name"""
+    return self.getProjection().getFullCode()
+
+
+class Table(__DefaultTable__):
+  """Represents gvsig table document 
+  (org.gvsig.app.project.documents.table.TableDocument)
+  """
+  def __init__(self,table):
+    __DefaultTable__.__init__(self, table, table.getStore())
+    
+  def getAssociatedLayer(self):
+    """Returns table associated layer or None if there're not associated 
+    layer
+    """    
+    if self._javaobj.getAssociatedLayer():
+      return Layer(self._javaobj.getAssociatedLayer())
+        
+    return None
+
+class Layer(__DefaultTable__):
+  """Represents gvsig layer document. It's a wrapper from 
+  org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect class
+  """
+  def __init__(self,layer):
+    __DefaultTable__.__init__(self, layer, layer.getFeatureStore())
+    
+  def getTypeVectorLayer(self):
+    """
+    Returns layer DefaultGeometryType class 
+    To get the geometryType use DefaultGeometryType getType() method
+    To get the geometrySubType use DefaultGeometryType getSubType() method
+    """
+    return self().getTypeVectorLayer()
+        
+class FeatureSet(WrapperToJava):
+  """Represents gvSIG FeatureSet 
+  (org.gvsig.fmap.dal.feature.impl.featureset.DefaultFeatureSet)
+  """
+  def __init__(self,featureSet):
+    WrapperToJava.__init__(self,featureSet)
+    
+  def getCount(self):
+    """Returns the number of elements in the featureSet"""
+    return self.getSize()
+  
+  def update(self, feature):
+    """
+    Updates exist feature in the featureSet
+    :param editableFeature: editableFeature
+    :type editableFeature: Java editableFeature
+    """
+    if not isinstance(feature, EditableFeature) and \
+            not isinstance(feature, DefaultEditableFeature):
+      feature = feature._javaobj
+    self().update(feature)
+  
+  def __iter__(self):
+    return  Iterator(self.fastIterator())
+    
+class Selection(FeatureSet):
+  """Manage selected features set from a store. Represents gvSIG 
+  org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection.  
+  """
+  def __init__(self, featureSet):
+    FeatureSet.__init__(self, featureSet)
+      
+  def select(self, selection):
+    """Inserts features in the features selection set"""
+    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
+      self._javaobj.select(selection._javaobj)
+    else:
+      self._javaobj.select(selection)
+
+  def deselect(self, selection):
+    """Removes features in the features selection set"""
+    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
+      self._javaobj.deselect(selection._javaobj)
+    else:
+      self._javaobj.deselect(selection)
+
+  def isSelected(feature):
+    """Returns True if given feature is selected"""
+    if isinstance(feature, Feature):
+      self._javaobj.isSelect(feature._javaobj)
+    else:
+      self._javaobj.isSelect(feature)
+      
+  def getCount(self):
+    """Returns the number of elements in the selection"""
+    return self.getSelectedCount()
+    
+    
+class Iterator(WrapperToJava):
+
+  def __init__(self,iterator):
+    WrapperToJava.__init__(self,iterator)
+
+  def next(self):
+    if not self.hasNext():
+      raise StopIteration()
+    return Feature(self().next())
+    
+class Feature(WrapperToJava):
+  """Represents feature data It's a wrapper from gvSIG 
+  org.gvsig.fmap.dal.feature.impl.DefaultFeature class
+  """
+  def __init__(self,feature):
+    WrapperToJava.__init__(self,feature)
+    self.featureNoEditable = None
+
+  def geometry(self):
+    """Returns feature geometry"""
+    return self.getDefaultGeometry()
+   
+  def getValues(self):
+    """Returns dictionary with the pair name, value, feature attributes"""
+    descriptor = self.getType()
+    items = dict()
+    for attr in descriptor.getAttributeDescriptors():
+      name = attr.getName()
+      value = self.get(attr.getName())
+      items[name] = value
+    return items 
+  
+  def edit(self):
+    """Returns editable feature instance"""
+    if not isinstance(self._javaobj, EditableFeature):
+      self.featureNoEditable = self._javaobj
+      self._javaobj = self._javaobj.getEditable()
+  
+  def __getitem__(self,key):
+    return self.get(key)
+  
+  def __getattr__(self,name):
+    #
+    #FIX console error when try to introspect feature object
+    if name in ('__methods__'):
+        return dict()
+    elif name in ('__members__'):
+        return self.getValues().keys()
+    elif name == '__dict__':
+        return self.getValues()      
+        
+    try:
+      v = getattr(self._javaobj, name, None)
+      if v == None:
+        v = self().get(name)        
+      return v
+    except Throwable, ex:
+      raise RuntimeException("Can't access to attribute %s of feature (%s)" % (name, str(ex)))    
+
+class Schema(WrapperToJava):
+  """Stores data properties definition. Represents gvSIG FeatureType
+  (org.gvsig.fmap.dal.feature.impl.DefaultFeatureType)
+  """
+
+  def __init__(self, featureType):
+    WrapperToJava.__init__(self,featureType)
+    self.featureTypeNoEditable = None
+  
+  def append(self, name, type, size=None, default=None, precision=4):
+    """Adds new property to feature properties definition. If error occurs 
+    raises RuntimeError.    
+    :param name: Feature property name
+    :type name: String
+    :param type: Feature property type
+    :type name: String
+    :param size: Feature property size
+    :type size: int
+    :param default: Feature property default value
+    :return: new atribute
+    """
+    if not isinstance(self._javaobj, EditableFeatureType):
+        self.modify()
+    
+    if isinstance(type, str):
+      try:
+        application = ApplicationLocator.getManager()
+        datamanager =  application.getDataManager()
+        dataTypes = application.getDataTypesManager()
+        type = dataTypes.getType(type) #dataType constant value from string
+      except:
+        raise RuntimeError(
+            "Feature Property Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
+                type, 
+                name, 
+                type, 
+                size, 
+                default
+            )
+        )
+    if isinstance(type, int):
+      try:
+        type = dataTypes.get(type)
+      except:
+        raise RuntimeError(
+            "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
+                type, 
+                name, 
+                type, 
+                size, 
+                default
+            )
+        )
+      
+    attribute = self.add(name, type.getType())
+ 
+    if size != None: 
+      attribute.setSize(size)
+    
+    if default != None:
+      attribute.setDefaultValue(default)
+      
+    if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
+      attribute.setPrecision(precision)
+    
+    if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
+      self.setDefaultGeometryAttributeName(name)
+    
+    return attribute
+
+  def __getitem__(self, name):
+    try:
+      return self.ftype.getAttributeDescriptor(name)
+    except java.lang.IndexOutOfBoundsException:
+      raise StopIteration
+
+  def get(self, name, default=None):
+    """Returns a feature attribute descriptor that contains information about 
+    one feature attribute, such as its name, data type or precision. 
+    :param name: Attribute name
+    :type name: string
+    :param default: Value to return if no attribute name found. 
+    :return: AttributeDescriptor
+    """
+    x = self.getAttributeDescriptor(name)
+    if x == None:
+      return default
+    return x
+  
+  def getAttrNames(self):
+    """Returns a list with attributes names"""
+    if not self.getAttributeDescriptors():
+      return None
+        
+    return [attr.getName() for attr in self.getAttributeDescriptors()]
+    
+    
+  def getCopy(self):
+    """Returns a itself clone"""
+    return Schema(self().getCopy())
+  
+  def modify(self):
+    """Sets edit mode"""
+    if not isinstance(self._javaobj, EditableFeatureType):
+      self.featureTypeNoEditable = self._javaobj
+      self._javaobj = self._javaobj.getEditable()
+
+      
+#=====================#
+# Vectorial Functions #
+#=====================#
+
+def createSchema(schema = None):
+  """Returns attributes definition. If Schema is recived then makes a copy and 
+  returns editable instance. Otherwise returns empty Schema.
+  :param schema: Schema to make a copy
+  :type schema: Schema
+  """
+  if isinstance(schema, Schema):
+    try:  
+      s = schema.getCopy()
+      s.modify()
+      return s
+    except:
+      pass
+    
+  application = ApplicationLocator.getManager()
+  datamanager =  application.getDataManager()
+  return Schema(datamanager.createFeatureType())
+
+def createLayer(schema, servertype, layertype=None, **parameters):
+  """
+  Returns new layer
+  :param schema: layer data definition
+  :type schema: Schema
+  :param servertype: 
+  :type servertype: string
+  :return: new layer
+  :rtype: Layer
+  :raise: RuntimeException
+  """
+  if layertype == None:
+    layertype = servertype
+    servertype = "FilesystemExplorer"
+
+  if layertype == "Shape" :
+    if schema.get("GEOMETRY",None) == None:
+      raise RuntimeException("Shape need a field named GEOMETRY in the schema")
+    
+  if parameters["geometryType"] == None:
+    raise RuntimeException("Invalid geometry type for new layer")
+      
+  try:
+    application = ApplicationLocator.getManager()
+    datamanager =  application.getDataManager()
+
+    mapcontextmanager = application.getMapContextManager()
+
+    server_parameters = datamanager.createServerExplorerParameters(servertype)
+    copyToDynObject(parameters, server_parameters)
+
+    server = datamanager.openServerExplorer(servertype, server_parameters)
+
+    store_parameters = server.getAddParameters(layertype)
+    copyToDynObject(parameters, store_parameters)
+    store_parameters.setDefaultFeatureType(schema())
+
+    server.add(layertype, store_parameters, True)
+
+    store = datamanager.openStore(layertype, store_parameters)
+
+    layer = mapcontextmanager.createLayer(store.getName(), store)
+
+    return Layer(layer)
+  except Throwable, ex:
+    raise RuntimeException("Can't create layer, "+ str(ex))
+
+def loadShapeFile(shpFile, CRS="CRS:84"):
+    """
+    Add existing shape file to the view. Returns Layer shape file
+    :param shpFile: absolute file path
+    :type: shpFile: string
+    :param CRS: projection code
+    :type CRS: string
+    :return: the shape
+    :type return: Layer
+    """
+    layer = loadLayer('Shape', shpFile=shpFile, CRS=CRS)
+    currentView().addLayer(layer)
+    layer.setActive(True)
+    return Layer(layer)
+    
+def loadLayer(layerType, **parameters):
+    try:
+        application = ApplicationLocator.getManager()
+        datamanager =  application.getDataManager()
+        mapcontextmanager = application.getMapContextManager()
+        store_parameters = datamanager.createStoreParameters(layerType)
+        copyToDynObject(parameters, store_parameters)
+        store = datamanager.openStore(layerType, store_parameters)        
+        layer = mapcontextmanager.createLayer(store.getName(), store)
+    except Throwable, ex:
+        raise RuntimeException("Can't load layer, "+ str(ex))  
+
+    return layer
+    
+def createShape(definition, filename, geometryType, CRS="CRS:84"):
+  """
+  Return new shape layer 
+  :param definition: layer data definition
+  :type definition: Schema
+  :param filename: absolute path for shape files. 
+  :type filename: string
+  :param geometryType: geometry type for shape
+  :type geometryType: string
+  :return: new shape layer
+  :rtype: Layer
+  """
+  return createLayer(
+    definition, 
+    "FilesystemExplorer", 
+    "Shape", 
+    shpFile=filename, 
+    CRS=CRS,
+    geometryType = geometryType
+  )
+
+def createTable(schema, servertype, tableType=None, **parameters):
+  """Creates a new Table document"""
+  if tableType == None:
+    tableType = servertype
+    servertype = "FilesystemExplorer"
+
+  try:
+    application = ApplicationLocator.getManager()
+    datamanager =  application.getDataManager()
+    
+    server_parameters = datamanager.createServerExplorerParameters(servertype)
+    copyToDynObject(parameters, server_parameters)
+
+    server = datamanager.openServerExplorer(servertype, server_parameters)
+    
+    store_parameters = server.getAddParameters(tableType)
+    copyToDynObject(parameters, store_parameters)
+    store_parameters.setDefaultFeatureType(schema())
+    
+    server.add(tableType, store_parameters, True)
+
+    store = datamanager.openStore(tableType, store_parameters)
+    
+    return Table(store)
+  
+  except Throwable, ex:
+    raise RuntimeException("Can't create table, "+ str(ex))
+  
+def createDBF(definition, DbfFile, CRS="CRS:84"):
+  """
+  Creates a new dbf document 
+  :param definition: layer data definition
+  :type definition: Schema
+  :param DbfFile: absolute path for shape files. 
+  :type DbfFile: string
+  :return: new dbf
+  :rtype: Table    
+  """
+  return createTable(
+    definition, 
+    "FilesystemExplorer", 
+    "DBF", 
+    DbfFile=DbfFile, 
+    CRS=CRS,
+  )
+
+#=====================#
+# Documents Functions #
+#=====================#  
+
+def currentProject():
+  """
+  Returns current gvSIG proyect
+  :return: Proyect
+  """
+  application = ApplicationLocator.getManager()
+  project = application.getCurrentProject()
+  return Project(project)
+
+def currentDocument(documentClass = None):
+  """
+  Returns the current active document if it's a DocumentTable or 
+  DocumentView2D return None
+  :return: Active document, None
+  """
+  application = ApplicationLocator.getManager()
+  
+  if documentClass == None:
+    doc = application.getActiveDocument()
+  else:
+    doc = application.getActiveDocument(documentClass)
+  if isinstance(doc, TableDocument):
+    return Table(doc)
+  if isinstance(doc, ViewDocument):
+    return View(doc)  
+
+  return None  
+  
+def currentTable():
+  """
+  Returns active table document or None 
+  :return: Table or None
+  """  
+  return currentDocument(TableDocument)
+  
+def currentView():
+  """
+  Returns the current active view document or None 
+  :return: View or None
+  """ 
+  return currentDocument(ViewDocument)
+
+def currentLayer():
+  """
+  Returns current view active layer or None
+  :return: gvSIG active layer
+  """
+  try:
+    return currentView().getLayer()
+  except:
+    return None
+
+#=====================#
+# Simbology Functions #
+#=====================#  
+COLORS = {
+    'black': Color.black,
+    'blue': Color.blue,
+    'cyan': Color.cyan,
+    'darkGray': Color.darkGray,
+    'gray': Color.gray,
+    'green': Color.green,
+    'lightGray': Color.lightGray,
+    'magenta': Color.magenta,
+    'orange': Color.orange,
+    'pink': Color.pink,
+    'red': Color.red,
+    'white': Color.white,
+    'yellow': Color.yellow,
+}
+  
+def simplePointSymbol(color=None):
+  """
+  Returns simple point symbol using parameter color. If no color 
+  use a ramdom color
+  :param color: String color name or Java awt Color
+  :return: gvSIG point symbol
+  """
+  if isinstance(color, str) and COLORS.has_key(color.lower()):
+    color = COLORS.get(color)
+    
+  if not isinstance(color, Color):
+      color = getDefaultColor()
+      
+  return MapContextLocator.getSymbolManager().createSymbol(
+        Geometry.TYPES.POINT, color)
+
+def simpleLineSymbol(color=None):
+  """
+  Returns simple line symbol using parameter color. If no color use a 
+  ramdom color  
+  :param color: String color name or Java awt Color
+  :return: gvSIG line symbol
+  
+  """
+  if isinstance(color, str) and COLORS.has_key(color.lower()):
+    color = COLORS.get(color)
+
+  if not isinstance(color, Color):
+      color = getDefaultColor()
+      
+  return MapContextLocator.getSymbolManager().createSymbol(
+        Geometry.TYPES.CURVE, color)
+
+def simplePolygonSymbol(color = None):
+  """
+  Returns simple polygon symbol using parameter color. If no color 
+  use a ramdom color.  
+  :param color: String color name or Java awt Color
+  :return: gvSIG polygon symbol
+  """
+  if isinstance(color, str) and COLORS.has_key(color.lower()):
+    color = COLORS.get(color)
+
+  if not isinstance(color, Color):
+      color = getDefaultColor()
+  
+  return MapContextLocator.getSymbolManager().createSymbol(
+        Geometry.TYPES.SURFACE, color)
+  
+
+#=========================================#
+# gvSIG Application Preferences Functions #
+#=========================================#  
+
+def getDataFolder():
+  """
+  Returns gvSIG data folder. This folder is defined in application 
+  preferences. If is not defined returns None.
+  """
+  return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None)
+  
+def getProjectsFolder():
+  """
+  Returns gvSIG projects folder. This folder is defined in application 
+  preferences. If is not defined returns None.
+  """
+  return Preferences.userRoot().node("gvsig.foldering").get(
+        'ProjectsFolder', None)
+
+def getColorFromRGB(r, g, b, a=None):
+  """
+  Returns an sRGB color with the specified red, green, blue, and alpha 
+  (optional) values in the range (0 - 255).
+  """
+  if a:
+    color = Color(r, g, b, a)
+  else:
+    color = Color(r, g, b)
+  
+  return color
+  
+def getDefaultColor(c = None):
+  """Returns gvsig default symbol fill color or ramdom color"""
+  if MapContextLocator.getSymbolManager().isDefaultSymbolFillColorAleatory():
+    color = Color(random.randint(0-255), 
+                random.randint(0-255), 
+                random.randint(0-255)
+            )
+  else:
+    sp = MapContextLocator.getSymbolManager().getSymbolPreferences()
+    color = sp.getDefaultSymbolFillColor()    
+
+  return color  
+  
+#================#
+# OTHER          #
+#================#
+
+def getCRS(crs):
+  """Returns Projection from string code (i.e. CRS:84) if exist or None if 
+  not.  
+  """
+  try:
+    return CRSFactory.getCRS(crs)
+  except:
+    return None
+
+def copyToDynObject(values, target):
+  definition = target.getDynClass();
+  fields = definition.getDynFields();
+  for field in fields:
+    name = field.getName()
+    keys = values.keys()
+    for k in keys:
+      if k.lower() == name.lower():
+        target.setDynValue(name, values[name])
+        break
+# ====================================
+#
+
+def main():
+  layer = currentLayer()
+  schema = createSchema()
+  schema.append("ID", "String", 50)
+  schema.append("GEOMETRY", "Geometry")
+  
+  output = createLayer(
+      schema, 
+      "FilesystemExplorer", 
+      "Shape", 
+      shpFile="/tmp/pp.shp", 
+      CRS="EPSG:23030", 
+      geometryType=POINT
+  )
+  
+  for feature in layer.features():
+    point = feature.geometry().centroid()
+    output.append(ID=feature.ID, GEOMETRY=point)
+      
+  output.commit() 
+  
+  currentView().addLayer(output()) 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/langs/python/preload.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/langs/python/preload.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/langs/python/preload.py	(revision 1126)
@@ -0,0 +1,22 @@
+
+#
+# Force to compile and preload the following modules
+#
+
+def main(*args):
+    import os
+    import os.path
+    import StringIO
+    import sys
+    import fnmatch
+    import time
+    import thread
+    import threading
+    import re
+    import datetime
+
+    import gvsig
+    import gvsig.commonsdialog
+    import gvsig.libs.formpanel
+
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/BeautifulSoup.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/BeautifulSoup.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/BeautifulSoup.py	(revision 1126)
@@ -0,0 +1,2017 @@
+"""Beautiful Soup
+Elixir and Tonic
+"The Screen-Scraper's Friend"
+http://www.crummy.com/software/BeautifulSoup/
+
+Beautiful Soup parses a (possibly invalid) XML or HTML document into a
+tree representation. It provides methods and Pythonic idioms that make
+it easy to navigate, search, and modify the tree.
+
+A well-formed XML/HTML document yields a well-formed data
+structure. An ill-formed XML/HTML document yields a correspondingly
+ill-formed data structure. If your document is only locally
+well-formed, you can use this library to find and process the
+well-formed part of it.
+
+Beautiful Soup works with Python 2.2 and up. It has no external
+dependencies, but you'll have more success at converting data to UTF-8
+if you also install these three packages:
+
+* chardet, for auto-detecting character encodings
+  http://chardet.feedparser.org/
+* cjkcodecs and iconv_codec, which add more encodings to the ones supported
+  by stock Python.
+  http://cjkpython.i18n.org/
+
+Beautiful Soup defines classes for two main parsing strategies:
+
+ * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific
+   language that kind of looks like XML.
+
+ * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid
+   or invalid. This class has web browser-like heuristics for
+   obtaining a sensible parse tree in the face of common HTML errors.
+
+Beautiful Soup also defines a class (UnicodeDammit) for autodetecting
+the encoding of an HTML or XML document, and converting it to
+Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser.
+
+For more than you ever wanted to know about Beautiful Soup, see the
+documentation:
+http://www.crummy.com/software/BeautifulSoup/documentation.html
+
+Here, have some legalese:
+
+Copyright (c) 2004-2010, Leonard Richardson
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above
+    copyright notice, this list of conditions and the following
+    disclaimer in the documentation and/or other materials provided
+    with the distribution.
+
+  * Neither the name of the the Beautiful Soup Consortium and All
+    Night Kosher Bakery nor the names of its contributors may be
+    used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE, DAMMIT.
+
+"""
+from __future__ import generators
+
+__author__ = "Leonard Richardson (leonardr@segfault.org)"
+__version__ = "3.2.1"
+__copyright__ = "Copyright (c) 2004-2012 Leonard Richardson"
+__license__ = "New-style BSD"
+
+from sgmllib import SGMLParser, SGMLParseError
+import codecs
+import markupbase
+import types
+import re
+import sgmllib
+try:
+  from htmlentitydefs import name2codepoint
+except ImportError:
+  name2codepoint = {}
+try:
+    set
+except NameError:
+    from sets import Set as set
+
+#These hacks make Beautiful Soup able to parse XML with namespaces
+sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
+markupbase._declname_match = re.compile(r'[a-zA-Z][-_.:a-zA-Z0-9]*\s*').match
+
+DEFAULT_OUTPUT_ENCODING = "utf-8"
+
+def _match_css_class(str):
+    """Build a RE to match the given CSS class."""
+    return re.compile(r"(^|.*\s)%s($|\s)" % str)
+
+# First, the classes that represent markup elements.
+
+class PageElement(object):
+    """Contains the navigational information for some part of the page
+    (either a tag or a piece of text)"""
+
+    def _invert(h):
+        "Cheap function to invert a hash."
+        i = {}
+        for k,v in h.items():
+            i[v] = k
+        return i
+
+    XML_ENTITIES_TO_SPECIAL_CHARS = { "apos" : "'",
+                                      "quot" : '"',
+                                      "amp" : "&",
+                                      "lt" : "<",
+                                      "gt" : ">" }
+
+    XML_SPECIAL_CHARS_TO_ENTITIES = _invert(XML_ENTITIES_TO_SPECIAL_CHARS)
+
+    def setup(self, parent=None, previous=None):
+        """Sets up the initial relations between this element and
+        other elements."""
+        self.parent = parent
+        self.previous = previous
+        self.next = None
+        self.previousSibling = None
+        self.nextSibling = None
+        if self.parent and self.parent.contents:
+            self.previousSibling = self.parent.contents[-1]
+            self.previousSibling.nextSibling = self
+
+    def replaceWith(self, replaceWith):
+        oldParent = self.parent
+        myIndex = self.parent.index(self)
+        if hasattr(replaceWith, "parent")\
+                  and replaceWith.parent is self.parent:
+            # We're replacing this element with one of its siblings.
+            index = replaceWith.parent.index(replaceWith)
+            if index and index < myIndex:
+                # Furthermore, it comes before this element. That
+                # means that when we extract it, the index of this
+                # element will change.
+                myIndex = myIndex - 1
+        self.extract()
+        oldParent.insert(myIndex, replaceWith)
+
+    def replaceWithChildren(self):
+        myParent = self.parent
+        myIndex = self.parent.index(self)
+        self.extract()
+        reversedChildren = list(self.contents)
+        reversedChildren.reverse()
+        for child in reversedChildren:
+            myParent.insert(myIndex, child)
+
+    def extract(self):
+        """Destructively rips this element out of the tree."""
+        if self.parent:
+            try:
+                del self.parent.contents[self.parent.index(self)]
+            except ValueError:
+                pass
+
+        #Find the two elements that would be next to each other if
+        #this element (and any children) hadn't been parsed. Connect
+        #the two.
+        lastChild = self._lastRecursiveChild()
+        nextElement = lastChild.next
+
+        if self.previous:
+            self.previous.next = nextElement
+        if nextElement:
+            nextElement.previous = self.previous
+        self.previous = None
+        lastChild.next = None
+
+        self.parent = None
+        if self.previousSibling:
+            self.previousSibling.nextSibling = self.nextSibling
+        if self.nextSibling:
+            self.nextSibling.previousSibling = self.previousSibling
+        self.previousSibling = self.nextSibling = None
+        return self
+
+    def _lastRecursiveChild(self):
+        "Finds the last element beneath this object to be parsed."
+        lastChild = self
+        while hasattr(lastChild, 'contents') and lastChild.contents:
+            lastChild = lastChild.contents[-1]
+        return lastChild
+
+    def insert(self, position, newChild):
+        if isinstance(newChild, basestring) \
+            and not isinstance(newChild, NavigableString):
+            newChild = NavigableString(newChild)
+
+        position =  min(position, len(self.contents))
+        if hasattr(newChild, 'parent') and newChild.parent is not None:
+            # We're 'inserting' an element that's already one
+            # of this object's children.
+            if newChild.parent is self:
+                index = self.index(newChild)
+                if index > position:
+                    # Furthermore we're moving it further down the
+                    # list of this object's children. That means that
+                    # when we extract this element, our target index
+                    # will jump down one.
+                    position = position - 1
+            newChild.extract()
+
+        newChild.parent = self
+        previousChild = None
+        if position == 0:
+            newChild.previousSibling = None
+            newChild.previous = self
+        else:
+            previousChild = self.contents[position-1]
+            newChild.previousSibling = previousChild
+            newChild.previousSibling.nextSibling = newChild
+            newChild.previous = previousChild._lastRecursiveChild()
+        if newChild.previous:
+            newChild.previous.next = newChild
+
+        newChildsLastElement = newChild._lastRecursiveChild()
+
+        if position >= len(self.contents):
+            newChild.nextSibling = None
+
+            parent = self
+            parentsNextSibling = None
+            while not parentsNextSibling:
+                parentsNextSibling = parent.nextSibling
+                parent = parent.parent
+                if not parent: # This is the last element in the document.
+                    break
+            if parentsNextSibling:
+                newChildsLastElement.next = parentsNextSibling
+            else:
+                newChildsLastElement.next = None
+        else:
+            nextChild = self.contents[position]
+            newChild.nextSibling = nextChild
+            if newChild.nextSibling:
+                newChild.nextSibling.previousSibling = newChild
+            newChildsLastElement.next = nextChild
+
+        if newChildsLastElement.next:
+            newChildsLastElement.next.previous = newChildsLastElement
+        self.contents.insert(position, newChild)
+
+    def append(self, tag):
+        """Appends the given tag to the contents of this tag."""
+        self.insert(len(self.contents), tag)
+
+    def findNext(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the first item that matches the given criteria and
+        appears after this Tag in the document."""
+        return self._findOne(self.findAllNext, name, attrs, text, **kwargs)
+
+    def findAllNext(self, name=None, attrs={}, text=None, limit=None,
+                    **kwargs):
+        """Returns all items that match the given criteria and appear
+        after this Tag in the document."""
+        return self._findAll(name, attrs, text, limit, self.nextGenerator,
+                             **kwargs)
+
+    def findNextSibling(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the closest sibling to this Tag that matches the
+        given criteria and appears after this Tag in the document."""
+        return self._findOne(self.findNextSiblings, name, attrs, text,
+                             **kwargs)
+
+    def findNextSiblings(self, name=None, attrs={}, text=None, limit=None,
+                         **kwargs):
+        """Returns the siblings of this Tag that match the given
+        criteria and appear after this Tag in the document."""
+        return self._findAll(name, attrs, text, limit,
+                             self.nextSiblingGenerator, **kwargs)
+    fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x
+
+    def findPrevious(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the first item that matches the given criteria and
+        appears before this Tag in the document."""
+        return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs)
+
+    def findAllPrevious(self, name=None, attrs={}, text=None, limit=None,
+                        **kwargs):
+        """Returns all items that match the given criteria and appear
+        before this Tag in the document."""
+        return self._findAll(name, attrs, text, limit, self.previousGenerator,
+                           **kwargs)
+    fetchPrevious = findAllPrevious # Compatibility with pre-3.x
+
+    def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the closest sibling to this Tag that matches the
+        given criteria and appears before this Tag in the document."""
+        return self._findOne(self.findPreviousSiblings, name, attrs, text,
+                             **kwargs)
+
+    def findPreviousSiblings(self, name=None, attrs={}, text=None,
+                             limit=None, **kwargs):
+        """Returns the siblings of this Tag that match the given
+        criteria and appear before this Tag in the document."""
+        return self._findAll(name, attrs, text, limit,
+                             self.previousSiblingGenerator, **kwargs)
+    fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x
+
+    def findParent(self, name=None, attrs={}, **kwargs):
+        """Returns the closest parent of this Tag that matches the given
+        criteria."""
+        # NOTE: We can't use _findOne because findParents takes a different
+        # set of arguments.
+        r = None
+        l = self.findParents(name, attrs, 1)
+        if l:
+            r = l[0]
+        return r
+
+    def findParents(self, name=None, attrs={}, limit=None, **kwargs):
+        """Returns the parents of this Tag that match the given
+        criteria."""
+
+        return self._findAll(name, attrs, None, limit, self.parentGenerator,
+                             **kwargs)
+    fetchParents = findParents # Compatibility with pre-3.x
+
+    #These methods do the real heavy lifting.
+
+    def _findOne(self, method, name, attrs, text, **kwargs):
+        r = None
+        l = method(name, attrs, text, 1, **kwargs)
+        if l:
+            r = l[0]
+        return r
+
+    def _findAll(self, name, attrs, text, limit, generator, **kwargs):
+        "Iterates over a generator looking for things that match."
+
+        if isinstance(name, SoupStrainer):
+            strainer = name
+        # (Possibly) special case some findAll*(...) searches
+        elif text is None and not limit and not attrs and not kwargs:
+            # findAll*(True)
+            if name is True:
+                return [element for element in generator()
+                        if isinstance(element, Tag)]
+            # findAll*('tag-name')
+            elif isinstance(name, basestring):
+                return [element for element in generator()
+                        if isinstance(element, Tag) and
+                        element.name == name]
+            else:
+                strainer = SoupStrainer(name, attrs, text, **kwargs)
+        # Build a SoupStrainer
+        else:
+            strainer = SoupStrainer(name, attrs, text, **kwargs)
+        results = ResultSet(strainer)
+        g = generator()
+        while True:
+            try:
+                i = g.next()
+            except StopIteration:
+                break
+            if i:
+                found = strainer.search(i)
+                if found:
+                    results.append(found)
+                    if limit and len(results) >= limit:
+                        break
+        return results
+
+    #These Generators can be used to navigate starting from both
+    #NavigableStrings and Tags.
+    def nextGenerator(self):
+        i = self
+        while i is not None:
+            i = i.next
+            yield i
+
+    def nextSiblingGenerator(self):
+        i = self
+        while i is not None:
+            i = i.nextSibling
+            yield i
+
+    def previousGenerator(self):
+        i = self
+        while i is not None:
+            i = i.previous
+            yield i
+
+    def previousSiblingGenerator(self):
+        i = self
+        while i is not None:
+            i = i.previousSibling
+            yield i
+
+    def parentGenerator(self):
+        i = self
+        while i is not None:
+            i = i.parent
+            yield i
+
+    # Utility methods
+    def substituteEncoding(self, str, encoding=None):
+        encoding = encoding or "utf-8"
+        return str.replace("%SOUP-ENCODING%", encoding)
+
+    def toEncoding(self, s, encoding=None):
+        """Encodes an object to a string in some encoding, or to Unicode.
+        ."""
+        if isinstance(s, unicode):
+            if encoding:
+                s = s.encode(encoding)
+        elif isinstance(s, str):
+            if encoding:
+                s = s.encode(encoding)
+            else:
+                s = unicode(s)
+        else:
+            if encoding:
+                s  = self.toEncoding(str(s), encoding)
+            else:
+                s = unicode(s)
+        return s
+
+    BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|"
+                                           + "&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)"
+                                           + ")")
+
+    def _sub_entity(self, x):
+        """Used with a regular expression to substitute the
+        appropriate XML entity for an XML special character."""
+        return "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";"
+
+
+class NavigableString(unicode, PageElement):
+
+    def __new__(cls, value):
+        """Create a new NavigableString.
+
+        When unpickling a NavigableString, this method is called with
+        the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be
+        passed in to the superclass's __new__ or the superclass won't know
+        how to handle non-ASCII characters.
+        """
+        if isinstance(value, unicode):
+            return unicode.__new__(cls, value)
+        return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING)
+
+    def __getnewargs__(self):
+        return (NavigableString.__str__(self),)
+
+    def __getattr__(self, attr):
+        """text.string gives you text. This is for backwards
+        compatibility for Navigable*String, but for CData* it lets you
+        get the string without the CData wrapper."""
+        if attr == 'string':
+            return self
+        else:
+            raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr)
+
+    def __unicode__(self):
+        return str(self).decode(DEFAULT_OUTPUT_ENCODING)
+
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        # Substitute outgoing XML entities.
+        data = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, self)
+        if encoding:
+            return data.encode(encoding)
+        else:
+            return data
+
+class CData(NavigableString):
+
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return "<![CDATA[%s]]>" % NavigableString.__str__(self, encoding)
+
+class ProcessingInstruction(NavigableString):
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        output = self
+        if "%SOUP-ENCODING%" in output:
+            output = self.substituteEncoding(output, encoding)
+        return "<?%s?>" % self.toEncoding(output, encoding)
+
+class Comment(NavigableString):
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return "<!--%s-->" % NavigableString.__str__(self, encoding)
+
+class Declaration(NavigableString):
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return "<!%s>" % NavigableString.__str__(self, encoding)
+
+class Tag(PageElement):
+
+    """Represents a found HTML tag with its attributes and contents."""
+
+    def _convertEntities(self, match):
+        """Used in a call to re.sub to replace HTML, XML, and numeric
+        entities with the appropriate Unicode characters. If HTML
+        entities are being converted, any unrecognized entities are
+        escaped."""
+        x = match.group(1)
+        if self.convertHTMLEntities and x in name2codepoint:
+            return unichr(name2codepoint[x])
+        elif x in self.XML_ENTITIES_TO_SPECIAL_CHARS:
+            if self.convertXMLEntities:
+                return self.XML_ENTITIES_TO_SPECIAL_CHARS[x]
+            else:
+                return u'&%s;' % x
+        elif len(x) > 0 and x[0] == '#':
+            # Handle numeric entities
+            if len(x) > 1 and x[1] == 'x':
+                return unichr(int(x[2:], 16))
+            else:
+                return unichr(int(x[1:]))
+
+        elif self.escapeUnrecognizedEntities:
+            return u'&amp;%s;' % x
+        else:
+            return u'&%s;' % x
+
+    def __init__(self, parser, name, attrs=None, parent=None,
+                 previous=None):
+        "Basic constructor."
+
+        # We don't actually store the parser object: that lets extracted
+        # chunks be garbage-collected
+        self.parserClass = parser.__class__
+        self.isSelfClosing = parser.isSelfClosingTag(name)
+        self.name = name
+        if attrs is None:
+            attrs = []
+        elif isinstance(attrs, dict):
+            attrs = attrs.items()
+        self.attrs = attrs
+        self.contents = []
+        self.setup(parent, previous)
+        self.hidden = False
+        self.containsSubstitutions = False
+        self.convertHTMLEntities = parser.convertHTMLEntities
+        self.convertXMLEntities = parser.convertXMLEntities
+        self.escapeUnrecognizedEntities = parser.escapeUnrecognizedEntities
+
+        # Convert any HTML, XML, or numeric entities in the attribute values.
+        convert = lambda(k, val): (k,
+                                   re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);",
+                                          self._convertEntities,
+                                          val))
+        self.attrs = map(convert, self.attrs)
+
+    def getString(self):
+        if (len(self.contents) == 1
+            and isinstance(self.contents[0], NavigableString)):
+            return self.contents[0]
+
+    def setString(self, string):
+        """Replace the contents of the tag with a string"""
+        self.clear()
+        self.append(string)
+
+    string = property(getString, setString)
+
+    def getText(self, separator=u""):
+        if not len(self.contents):
+            return u""
+        stopNode = self._lastRecursiveChild().next
+        strings = []
+        current = self.contents[0]
+        while current is not stopNode:
+            if isinstance(current, NavigableString):
+                strings.append(current.strip())
+            current = current.next
+        return separator.join(strings)
+
+    text = property(getText)
+
+    def get(self, key, default=None):
+        """Returns the value of the 'key' attribute for the tag, or
+        the value given for 'default' if it doesn't have that
+        attribute."""
+        return self._getAttrMap().get(key, default)
+
+    def clear(self):
+        """Extract all children."""
+        for child in self.contents[:]:
+            child.extract()
+
+    def index(self, element):
+        for i, child in enumerate(self.contents):
+            if child is element:
+                return i
+        raise ValueError("Tag.index: element not in tag")
+
+    def has_key(self, key):
+        return self._getAttrMap().has_key(key)
+
+    def __getitem__(self, key):
+        """tag[key] returns the value of the 'key' attribute for the tag,
+        and throws an exception if it's not there."""
+        return self._getAttrMap()[key]
+
+    def __iter__(self):
+        "Iterating over a tag iterates over its contents."
+        return iter(self.contents)
+
+    def __len__(self):
+        "The length of a tag is the length of its list of contents."
+        return len(self.contents)
+
+    def __contains__(self, x):
+        return x in self.contents
+
+    def __nonzero__(self):
+        "A tag is non-None even if it has no contents."
+        return True
+
+    def __setitem__(self, key, value):
+        """Setting tag[key] sets the value of the 'key' attribute for the
+        tag."""
+        self._getAttrMap()
+        self.attrMap[key] = value
+        found = False
+        for i in range(0, len(self.attrs)):
+            if self.attrs[i][0] == key:
+                self.attrs[i] = (key, value)
+                found = True
+        if not found:
+            self.attrs.append((key, value))
+        self._getAttrMap()[key] = value
+
+    def __delitem__(self, key):
+        "Deleting tag[key] deletes all 'key' attributes for the tag."
+        for item in self.attrs:
+            if item[0] == key:
+                self.attrs.remove(item)
+                #We don't break because bad HTML can define the same
+                #attribute multiple times.
+            self._getAttrMap()
+            if self.attrMap.has_key(key):
+                del self.attrMap[key]
+
+    def __call__(self, *args, **kwargs):
+        """Calling a tag like a function is the same as calling its
+        findAll() method. Eg. tag('a') returns a list of all the A tags
+        found within this tag."""
+        return apply(self.findAll, args, kwargs)
+
+    def __getattr__(self, tag):
+        #print "Getattr %s.%s" % (self.__class__, tag)
+        if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3:
+            return self.find(tag[:-3])
+        elif tag.find('__') != 0:
+            return self.find(tag)
+        raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__, tag)
+
+    def __eq__(self, other):
+        """Returns true iff this tag has the same name, the same attributes,
+        and the same contents (recursively) as the given tag.
+
+        NOTE: right now this will return false if two tags have the
+        same attributes in a different order. Should this be fixed?"""
+        if other is self:
+            return True
+        if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other):
+            return False
+        for i in range(0, len(self.contents)):
+            if self.contents[i] != other.contents[i]:
+                return False
+        return True
+
+    def __ne__(self, other):
+        """Returns true iff this tag is not identical to the other tag,
+        as defined in __eq__."""
+        return not self == other
+
+    def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        """Renders this tag as a string."""
+        return self.__str__(encoding)
+
+    def __unicode__(self):
+        return self.__str__(None)
+
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING,
+                prettyPrint=False, indentLevel=0):
+        """Returns a string or Unicode representation of this tag and
+        its contents. To get Unicode, pass None for encoding.
+
+        NOTE: since Python's HTML parser consumes whitespace, this
+        method is not certain to reproduce the whitespace present in
+        the original string."""
+
+        encodedName = self.toEncoding(self.name, encoding)
+
+        attrs = []
+        if self.attrs:
+            for key, val in self.attrs:
+                fmt = '%s="%s"'
+                if isinstance(val, basestring):
+                    if self.containsSubstitutions and '%SOUP-ENCODING%' in val:
+                        val = self.substituteEncoding(val, encoding)
+
+                    # The attribute value either:
+                    #
+                    # * Contains no embedded double quotes or single quotes.
+                    #   No problem: we enclose it in double quotes.
+                    # * Contains embedded single quotes. No problem:
+                    #   double quotes work here too.
+                    # * Contains embedded double quotes. No problem:
+                    #   we enclose it in single quotes.
+                    # * Embeds both single _and_ double quotes. This
+                    #   can't happen naturally, but it can happen if
+                    #   you modify an attribute value after parsing
+                    #   the document. Now we have a bit of a
+                    #   problem. We solve it by enclosing the
+                    #   attribute in single quotes, and escaping any
+                    #   embedded single quotes to XML entities.
+                    if '"' in val:
+                        fmt = "%s='%s'"
+                        if "'" in val:
+                            # TODO: replace with apos when
+                            # appropriate.
+                            val = val.replace("'", "&squot;")
+
+                    # Now we're okay w/r/t quotes. But the attribute
+                    # value might also contain angle brackets, or
+                    # ampersands that aren't part of entities. We need
+                    # to escape those to XML entities too.
+                    val = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, val)
+
+                attrs.append(fmt % (self.toEncoding(key, encoding),
+                                    self.toEncoding(val, encoding)))
+        close = ''
+        closeTag = ''
+        if self.isSelfClosing:
+            close = ' /'
+        else:
+            closeTag = '</%s>' % encodedName
+
+        indentTag, indentContents = 0, 0
+        if prettyPrint:
+            indentTag = indentLevel
+            space = (' ' * (indentTag-1))
+            indentContents = indentTag + 1
+        contents = self.renderContents(encoding, prettyPrint, indentContents)
+        if self.hidden:
+            s = contents
+        else:
+            s = []
+            attributeString = ''
+            if attrs:
+                attributeString = ' ' + ' '.join(attrs)
+            if prettyPrint:
+                s.append(space)
+            s.append('<%s%s%s>' % (encodedName, attributeString, close))
+            if prettyPrint:
+                s.append("\n")
+            s.append(contents)
+            if prettyPrint and contents and contents[-1] != "\n":
+                s.append("\n")
+            if prettyPrint and closeTag:
+                s.append(space)
+            s.append(closeTag)
+            if prettyPrint and closeTag and self.nextSibling:
+                s.append("\n")
+            s = ''.join(s)
+        return s
+
+    def decompose(self):
+        """Recursively destroys the contents of this tree."""
+        self.extract()
+        if len(self.contents) == 0:
+            return
+        current = self.contents[0]
+        while current is not None:
+            next = current.next
+            if isinstance(current, Tag):
+                del current.contents[:]
+            current.parent = None
+            current.previous = None
+            current.previousSibling = None
+            current.next = None
+            current.nextSibling = None
+            current = next
+
+    def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return self.__str__(encoding, True)
+
+    def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
+                       prettyPrint=False, indentLevel=0):
+        """Renders the contents of this tag as a string in the given
+        encoding. If encoding is None, returns a Unicode string.."""
+        s=[]
+        for c in self:
+            text = None
+            if isinstance(c, NavigableString):
+                text = c.__str__(encoding)
+            elif isinstance(c, Tag):
+                s.append(c.__str__(encoding, prettyPrint, indentLevel))
+            if text and prettyPrint:
+                text = text.strip()
+            if text:
+                if prettyPrint:
+                    s.append(" " * (indentLevel-1))
+                s.append(text)
+                if prettyPrint:
+                    s.append("\n")
+        return ''.join(s)
+
+    #Soup methods
+
+    def find(self, name=None, attrs={}, recursive=True, text=None,
+             **kwargs):
+        """Return only the first child of this Tag matching the given
+        criteria."""
+        r = None
+        l = self.findAll(name, attrs, recursive, text, 1, **kwargs)
+        if l:
+            r = l[0]
+        return r
+    findChild = find
+
+    def findAll(self, name=None, attrs={}, recursive=True, text=None,
+                limit=None, **kwargs):
+        """Extracts a list of Tag objects that match the given
+        criteria.  You can specify the name of the Tag and any
+        attributes you want the Tag to have.
+
+        The value of a key-value pair in the 'attrs' map can be a
+        string, a list of strings, a regular expression object, or a
+        callable that takes a string and returns whether or not the
+        string matches for some custom definition of 'matches'. The
+        same is true of the tag name."""
+        generator = self.recursiveChildGenerator
+        if not recursive:
+            generator = self.childGenerator
+        return self._findAll(name, attrs, text, limit, generator, **kwargs)
+    findChildren = findAll
+
+    # Pre-3.x compatibility methods
+    first = find
+    fetch = findAll
+
+    def fetchText(self, text=None, recursive=True, limit=None):
+        return self.findAll(text=text, recursive=recursive, limit=limit)
+
+    def firstText(self, text=None, recursive=True):
+        return self.find(text=text, recursive=recursive)
+
+    #Private methods
+
+    def _getAttrMap(self):
+        """Initializes a map representation of this tag's attributes,
+        if not already initialized."""
+        if not getattr(self, 'attrMap'):
+            self.attrMap = {}
+            for (key, value) in self.attrs:
+                self.attrMap[key] = value
+        return self.attrMap
+
+    #Generator methods
+    def childGenerator(self):
+        # Just use the iterator from the contents
+        return iter(self.contents)
+
+    def recursiveChildGenerator(self):
+        if not len(self.contents):
+            raise StopIteration
+        stopNode = self._lastRecursiveChild().next
+        current = self.contents[0]
+        while current is not stopNode:
+            yield current
+            current = current.next
+
+
+# Next, a couple classes to represent queries and their results.
+class SoupStrainer:
+    """Encapsulates a number of ways of matching a markup element (tag or
+    text)."""
+
+    def __init__(self, name=None, attrs={}, text=None, **kwargs):
+        self.name = name
+        if isinstance(attrs, basestring):
+            kwargs['class'] = _match_css_class(attrs)
+            attrs = None
+        if kwargs:
+            if attrs:
+                attrs = attrs.copy()
+                attrs.update(kwargs)
+            else:
+                attrs = kwargs
+        self.attrs = attrs
+        self.text = text
+
+    def __str__(self):
+        if self.text:
+            return self.text
+        else:
+            return "%s|%s" % (self.name, self.attrs)
+
+    def searchTag(self, markupName=None, markupAttrs={}):
+        found = None
+        markup = None
+        if isinstance(markupName, Tag):
+            markup = markupName
+            markupAttrs = markup
+        callFunctionWithTagData = callable(self.name) \
+                                and not isinstance(markupName, Tag)
+
+        if (not self.name) \
+               or callFunctionWithTagData \
+               or (markup and self._matches(markup, self.name)) \
+               or (not markup and self._matches(markupName, self.name)):
+            if callFunctionWithTagData:
+                match = self.name(markupName, markupAttrs)
+            else:
+                match = True
+                markupAttrMap = None
+                for attr, matchAgainst in self.attrs.items():
+                    if not markupAttrMap:
+                         if hasattr(markupAttrs, 'get'):
+                            markupAttrMap = markupAttrs
+                         else:
+                            markupAttrMap = {}
+                            for k,v in markupAttrs:
+                                markupAttrMap[k] = v
+                    attrValue = markupAttrMap.get(attr)
+                    if not self._matches(attrValue, matchAgainst):
+                        match = False
+                        break
+            if match:
+                if markup:
+                    found = markup
+                else:
+                    found = markupName
+        return found
+
+    def search(self, markup):
+        #print 'looking for %s in %s' % (self, markup)
+        found = None
+        # If given a list of items, scan it for a text element that
+        # matches.
+        if hasattr(markup, "__iter__") \
+                and not isinstance(markup, Tag):
+            for element in markup:
+                if isinstance(element, NavigableString) \
+                       and self.search(element):
+                    found = element
+                    break
+        # If it's a Tag, make sure its name or attributes match.
+        # Don't bother with Tags if we're searching for text.
+        elif isinstance(markup, Tag):
+            if not self.text:
+                found = self.searchTag(markup)
+        # If it's text, make sure the text matches.
+        elif isinstance(markup, NavigableString) or \
+                 isinstance(markup, basestring):
+            if self._matches(markup, self.text):
+                found = markup
+        else:
+            raise Exception, "I don't know how to match against a %s" \
+                  % markup.__class__
+        return found
+
+    def _matches(self, markup, matchAgainst):
+        #print "Matching %s against %s" % (markup, matchAgainst)
+        result = False
+        if matchAgainst is True:
+            result = markup is not None
+        elif callable(matchAgainst):
+            result = matchAgainst(markup)
+        else:
+            #Custom match methods take the tag as an argument, but all
+            #other ways of matching match the tag name as a string.
+            if isinstance(markup, Tag):
+                markup = markup.name
+            if markup and not isinstance(markup, basestring):
+                markup = unicode(markup)
+            #Now we know that chunk is either a string, or None.
+            if hasattr(matchAgainst, 'match'):
+                # It's a regexp object.
+                result = markup and matchAgainst.search(markup)
+            elif hasattr(matchAgainst, '__iter__'): # list-like
+                result = markup in matchAgainst
+            elif hasattr(matchAgainst, 'items'):
+                result = markup.has_key(matchAgainst)
+            elif matchAgainst and isinstance(markup, basestring):
+                if isinstance(markup, unicode):
+                    matchAgainst = unicode(matchAgainst)
+                else:
+                    matchAgainst = str(matchAgainst)
+
+            if not result:
+                result = matchAgainst == markup
+        return result
+
+class ResultSet(list):
+    """A ResultSet is just a list that keeps track of the SoupStrainer
+    that created it."""
+    def __init__(self, source):
+        list.__init__([])
+        self.source = source
+
+# Now, some helper functions.
+
+def buildTagMap(default, *args):
+    """Turns a list of maps, lists, or scalars into a single map.
+    Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and
+    NESTING_RESET_TAGS maps out of lists and partial maps."""
+    built = {}
+    for portion in args:
+        if hasattr(portion, 'items'):
+            #It's a map. Merge it.
+            for k,v in portion.items():
+                built[k] = v
+        elif hasattr(portion, '__iter__'): # is a list
+            #It's a list. Map each item to the default.
+            for k in portion:
+                built[k] = default
+        else:
+            #It's a scalar. Map it to the default.
+            built[portion] = default
+    return built
+
+# Now, the parser classes.
+
+class BeautifulStoneSoup(Tag, SGMLParser):
+
+    """This class contains the basic parser and search code. It defines
+    a parser that knows nothing about tag behavior except for the
+    following:
+
+      You can't close a tag without closing all the tags it encloses.
+      That is, "<foo><bar></foo>" actually means
+      "<foo><bar></bar></foo>".
+
+    [Another possible explanation is "<foo><bar /></foo>", but since
+    this class defines no SELF_CLOSING_TAGS, it will never use that
+    explanation.]
+
+    This class is useful for parsing XML or made-up markup languages,
+    or when BeautifulSoup makes an assumption counter to what you were
+    expecting."""
+
+    SELF_CLOSING_TAGS = {}
+    NESTABLE_TAGS = {}
+    RESET_NESTING_TAGS = {}
+    QUOTE_TAGS = {}
+    PRESERVE_WHITESPACE_TAGS = []
+
+    MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'),
+                       lambda x: x.group(1) + ' />'),
+                      (re.compile('<!\s+([^<>]*)>'),
+                       lambda x: '<!' + x.group(1) + '>')
+                      ]
+
+    ROOT_TAG_NAME = u'[document]'
+
+    HTML_ENTITIES = "html"
+    XML_ENTITIES = "xml"
+    XHTML_ENTITIES = "xhtml"
+    # TODO: This only exists for backwards-compatibility
+    ALL_ENTITIES = XHTML_ENTITIES
+
+    # Used when determining whether a text node is all whitespace and
+    # can be replaced with a single space. A text node that contains
+    # fancy Unicode spaces (usually non-breaking) should be left
+    # alone.
+    STRIP_ASCII_SPACES = { 9: None, 10: None, 12: None, 13: None, 32: None, }
+
+    def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None,
+                 markupMassage=True, smartQuotesTo=XML_ENTITIES,
+                 convertEntities=None, selfClosingTags=None, isHTML=False):
+        """The Soup object is initialized as the 'root tag', and the
+        provided markup (which can be a string or a file-like object)
+        is fed into the underlying parser.
+
+        sgmllib will process most bad HTML, and the BeautifulSoup
+        class has some tricks for dealing with some HTML that kills
+        sgmllib, but Beautiful Soup can nonetheless choke or lose data
+        if your data uses self-closing tags or declarations
+        incorrectly.
+
+        By default, Beautiful Soup uses regexes to sanitize input,
+        avoiding the vast majority of these problems. If the problems
+        don't apply to you, pass in False for markupMassage, and
+        you'll get better performance.
+
+        The default parser massage techniques fix the two most common
+        instances of invalid HTML that choke sgmllib:
+
+         <br/> (No space between name of closing tag and tag close)
+         <! --Comment--> (Extraneous whitespace in declaration)
+
+        You can pass in a custom list of (RE object, replace method)
+        tuples to get Beautiful Soup to scrub your input the way you
+        want."""
+
+        self.parseOnlyThese = parseOnlyThese
+        self.fromEncoding = fromEncoding
+        self.smartQuotesTo = smartQuotesTo
+        self.convertEntities = convertEntities
+        # Set the rules for how we'll deal with the entities we
+        # encounter
+        if self.convertEntities:
+            # It doesn't make sense to convert encoded characters to
+            # entities even while you're converting entities to Unicode.
+            # Just convert it all to Unicode.
+            self.smartQuotesTo = None
+            if convertEntities == self.HTML_ENTITIES:
+                self.convertXMLEntities = False
+                self.convertHTMLEntities = True
+                self.escapeUnrecognizedEntities = True
+            elif convertEntities == self.XHTML_ENTITIES:
+                self.convertXMLEntities = True
+                self.convertHTMLEntities = True
+                self.escapeUnrecognizedEntities = False
+            elif convertEntities == self.XML_ENTITIES:
+                self.convertXMLEntities = True
+                self.convertHTMLEntities = False
+                self.escapeUnrecognizedEntities = False
+        else:
+            self.convertXMLEntities = False
+            self.convertHTMLEntities = False
+            self.escapeUnrecognizedEntities = False
+
+        self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags)
+        SGMLParser.__init__(self)
+
+        if hasattr(markup, 'read'):        # It's a file-type object.
+            markup = markup.read()
+        self.markup = markup
+        self.markupMassage = markupMassage
+        try:
+            self._feed(isHTML=isHTML)
+        except StopParsing:
+            pass
+        self.markup = None                 # The markup can now be GCed
+
+    def convert_charref(self, name):
+        """This method fixes a bug in Python's SGMLParser."""
+        try:
+            n = int(name)
+        except ValueError:
+            return
+        if not 0 <= n <= 127 : # ASCII ends at 127, not 255
+            return
+        return self.convert_codepoint(n)
+
+    def _feed(self, inDocumentEncoding=None, isHTML=False):
+        # Convert the document to Unicode.
+        markup = self.markup
+        if isinstance(markup, unicode):
+            if not hasattr(self, 'originalEncoding'):
+                self.originalEncoding = None
+        else:
+            dammit = UnicodeDammit\
+                     (markup, [self.fromEncoding, inDocumentEncoding],
+                      smartQuotesTo=self.smartQuotesTo, isHTML=isHTML)
+            markup = dammit.unicode
+            self.originalEncoding = dammit.originalEncoding
+            self.declaredHTMLEncoding = dammit.declaredHTMLEncoding
+        if markup:
+            if self.markupMassage:
+                if not hasattr(self.markupMassage, "__iter__"):
+                    self.markupMassage = self.MARKUP_MASSAGE
+                for fix, m in self.markupMassage:
+                    markup = fix.sub(m, markup)
+                # TODO: We get rid of markupMassage so that the
+                # soup object can be deepcopied later on. Some
+                # Python installations can't copy regexes. If anyone
+                # was relying on the existence of markupMassage, this
+                # might cause problems.
+                del(self.markupMassage)
+        self.reset()
+
+        SGMLParser.feed(self, markup)
+        # Close out any unfinished strings and close all the open tags.
+        self.endData()
+        while self.currentTag.name != self.ROOT_TAG_NAME:
+            self.popTag()
+
+    def __getattr__(self, methodName):
+        """This method routes method call requests to either the SGMLParser
+        superclass or the Tag superclass, depending on the method name."""
+        #print "__getattr__ called on %s.%s" % (self.__class__, methodName)
+
+        if methodName.startswith('start_') or methodName.startswith('end_') \
+               or methodName.startswith('do_'):
+            return SGMLParser.__getattr__(self, methodName)
+        elif not methodName.startswith('__'):
+            return Tag.__getattr__(self, methodName)
+        else:
+            raise AttributeError
+
+    def isSelfClosingTag(self, name):
+        """Returns true iff the given string is the name of a
+        self-closing tag according to this parser."""
+        return self.SELF_CLOSING_TAGS.has_key(name) \
+               or self.instanceSelfClosingTags.has_key(name)
+
+    def reset(self):
+        Tag.__init__(self, self, self.ROOT_TAG_NAME)
+        self.hidden = 1
+        SGMLParser.reset(self)
+        self.currentData = []
+        self.currentTag = None
+        self.tagStack = []
+        self.quoteStack = []
+        self.pushTag(self)
+
+    def popTag(self):
+        tag = self.tagStack.pop()
+
+        #print "Pop", tag.name
+        if self.tagStack:
+            self.currentTag = self.tagStack[-1]
+        return self.currentTag
+
+    def pushTag(self, tag):
+        #print "Push", tag.name
+        if self.currentTag:
+            self.currentTag.contents.append(tag)
+        self.tagStack.append(tag)
+        self.currentTag = self.tagStack[-1]
+
+    def endData(self, containerClass=NavigableString):
+        if self.currentData:
+            currentData = u''.join(self.currentData)
+            if (currentData.translate(self.STRIP_ASCII_SPACES) == '' and
+                not set([tag.name for tag in self.tagStack]).intersection(
+                    self.PRESERVE_WHITESPACE_TAGS)):
+                if '\n' in currentData:
+                    currentData = '\n'
+                else:
+                    currentData = ' '
+            self.currentData = []
+            if self.parseOnlyThese and len(self.tagStack) <= 1 and \
+                   (not self.parseOnlyThese.text or \
+                    not self.parseOnlyThese.search(currentData)):
+                return
+            o = containerClass(currentData)
+            o.setup(self.currentTag, self.previous)
+            if self.previous:
+                self.previous.next = o
+            self.previous = o
+            self.currentTag.contents.append(o)
+
+
+    def _popToTag(self, name, inclusivePop=True):
+        """Pops the tag stack up to and including the most recent
+        instance of the given tag. If inclusivePop is false, pops the tag
+        stack up to but *not* including the most recent instqance of
+        the given tag."""
+        #print "Popping to %s" % name
+        if name == self.ROOT_TAG_NAME:
+            return
+
+        numPops = 0
+        mostRecentTag = None
+        for i in range(len(self.tagStack)-1, 0, -1):
+            if name == self.tagStack[i].name:
+                numPops = len(self.tagStack)-i
+                break
+        if not inclusivePop:
+            numPops = numPops - 1
+
+        for i in range(0, numPops):
+            mostRecentTag = self.popTag()
+        return mostRecentTag
+
+    def _smartPop(self, name):
+
+        """We need to pop up to the previous tag of this type, unless
+        one of this tag's nesting reset triggers comes between this
+        tag and the previous tag of this type, OR unless this tag is a
+        generic nesting trigger and another generic nesting trigger
+        comes between this tag and the previous tag of this type.
+
+        Examples:
+         <p>Foo<b>Bar *<p>* should pop to 'p', not 'b'.
+         <p>Foo<table>Bar *<p>* should pop to 'table', not 'p'.
+         <p>Foo<table><tr>Bar *<p>* should pop to 'tr', not 'p'.
+
+         <li><ul><li> *<li>* should pop to 'ul', not the first 'li'.
+         <tr><table><tr> *<tr>* should pop to 'table', not the first 'tr'
+         <td><tr><td> *<td>* should pop to 'tr', not the first 'td'
+        """
+
+        nestingResetTriggers = self.NESTABLE_TAGS.get(name)
+        isNestable = nestingResetTriggers != None
+        isResetNesting = self.RESET_NESTING_TAGS.has_key(name)
+        popTo = None
+        inclusive = True
+        for i in range(len(self.tagStack)-1, 0, -1):
+            p = self.tagStack[i]
+            if (not p or p.name == name) and not isNestable:
+                #Non-nestable tags get popped to the top or to their
+                #last occurance.
+                popTo = name
+                break
+            if (nestingResetTriggers is not None
+                and p.name in nestingResetTriggers) \
+                or (nestingResetTriggers is None and isResetNesting
+                    and self.RESET_NESTING_TAGS.has_key(p.name)):
+
+                #If we encounter one of the nesting reset triggers
+                #peculiar to this tag, or we encounter another tag
+                #that causes nesting to reset, pop up to but not
+                #including that tag.
+                popTo = p.name
+                inclusive = False
+                break
+            p = p.parent
+        if popTo:
+            self._popToTag(popTo, inclusive)
+
+    def unknown_starttag(self, name, attrs, selfClosing=0):
+        #print "Start tag %s: %s" % (name, attrs)
+        if self.quoteStack:
+            #This is not a real tag.
+            #print "<%s> is not real!" % name
+            attrs = ''.join([' %s="%s"' % (x, y) for x, y in attrs])
+            self.handle_data('<%s%s>' % (name, attrs))
+            return
+        self.endData()
+
+        if not self.isSelfClosingTag(name) and not selfClosing:
+            self._smartPop(name)
+
+        if self.parseOnlyThese and len(self.tagStack) <= 1 \
+               and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)):
+            return
+
+        tag = Tag(self, name, attrs, self.currentTag, self.previous)
+        if self.previous:
+            self.previous.next = tag
+        self.previous = tag
+        self.pushTag(tag)
+        if selfClosing or self.isSelfClosingTag(name):
+            self.popTag()
+        if name in self.QUOTE_TAGS:
+            #print "Beginning quote (%s)" % name
+            self.quoteStack.append(name)
+            self.literal = 1
+        return tag
+
+    def unknown_endtag(self, name):
+        #print "End tag %s" % name
+        if self.quoteStack and self.quoteStack[-1] != name:
+            #This is not a real end tag.
+            #print "</%s> is not real!" % name
+            self.handle_data('</%s>' % name)
+            return
+        self.endData()
+        self._popToTag(name)
+        if self.quoteStack and self.quoteStack[-1] == name:
+            self.quoteStack.pop()
+            self.literal = (len(self.quoteStack) > 0)
+
+    def handle_data(self, data):
+        self.currentData.append(data)
+
+    def _toStringSubclass(self, text, subclass):
+        """Adds a certain piece of text to the tree as a NavigableString
+        subclass."""
+        self.endData()
+        self.handle_data(text)
+        self.endData(subclass)
+
+    def handle_pi(self, text):
+        """Handle a processing instruction as a ProcessingInstruction
+        object, possibly one with a %SOUP-ENCODING% slot into which an
+        encoding will be plugged later."""
+        if text[:3] == "xml":
+            text = u"xml version='1.0' encoding='%SOUP-ENCODING%'"
+        self._toStringSubclass(text, ProcessingInstruction)
+
+    def handle_comment(self, text):
+        "Handle comments as Comment objects."
+        self._toStringSubclass(text, Comment)
+
+    def handle_charref(self, ref):
+        "Handle character references as data."
+        if self.convertEntities:
+            data = unichr(int(ref))
+        else:
+            data = '&#%s;' % ref
+        self.handle_data(data)
+
+    def handle_entityref(self, ref):
+        """Handle entity references as data, possibly converting known
+        HTML and/or XML entity references to the corresponding Unicode
+        characters."""
+        data = None
+        if self.convertHTMLEntities:
+            try:
+                data = unichr(name2codepoint[ref])
+            except KeyError:
+                pass
+
+        if not data and self.convertXMLEntities:
+                data = self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref)
+
+        if not data and self.convertHTMLEntities and \
+            not self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref):
+                # TODO: We've got a problem here. We're told this is
+                # an entity reference, but it's not an XML entity
+                # reference or an HTML entity reference. Nonetheless,
+                # the logical thing to do is to pass it through as an
+                # unrecognized entity reference.
+                #
+                # Except: when the input is "&carol;" this function
+                # will be called with input "carol". When the input is
+                # "AT&T", this function will be called with input
+                # "T". We have no way of knowing whether a semicolon
+                # was present originally, so we don't know whether
+                # this is an unknown entity or just a misplaced
+                # ampersand.
+                #
+                # The more common case is a misplaced ampersand, so I
+                # escape the ampersand and omit the trailing semicolon.
+                data = "&amp;%s" % ref
+        if not data:
+            # This case is different from the one above, because we
+            # haven't already gone through a supposedly comprehensive
+            # mapping of entities to Unicode characters. We might not
+            # have gone through any mapping at all. So the chances are
+            # very high that this is a real entity, and not a
+            # misplaced ampersand.
+            data = "&%s;" % ref
+        self.handle_data(data)
+
+    def handle_decl(self, data):
+        "Handle DOCTYPEs and the like as Declaration objects."
+        self._toStringSubclass(data, Declaration)
+
+    def parse_declaration(self, i):
+        """Treat a bogus SGML declaration as raw data. Treat a CDATA
+        declaration as a CData object."""
+        j = None
+        if self.rawdata[i:i+9] == '<![CDATA[':
+             k = self.rawdata.find(']]>', i)
+             if k == -1:
+                 k = len(self.rawdata)
+             data = self.rawdata[i+9:k]
+             j = k+3
+             self._toStringSubclass(data, CData)
+        else:
+            try:
+                j = SGMLParser.parse_declaration(self, i)
+            except SGMLParseError:
+                toHandle = self.rawdata[i:]
+                self.handle_data(toHandle)
+                j = i + len(toHandle)
+        return j
+
+class BeautifulSoup(BeautifulStoneSoup):
+
+    """This parser knows the following facts about HTML:
+
+    * Some tags have no closing tag and should be interpreted as being
+      closed as soon as they are encountered.
+
+    * The text inside some tags (ie. 'script') may contain tags which
+      are not really part of the document and which should be parsed
+      as text, not tags. If you want to parse the text as tags, you can
+      always fetch it and parse it explicitly.
+
+    * Tag nesting rules:
+
+      Most tags can't be nested at all. For instance, the occurance of
+      a <p> tag should implicitly close the previous <p> tag.
+
+       <p>Para1<p>Para2
+        should be transformed into:
+       <p>Para1</p><p>Para2
+
+      Some tags can be nested arbitrarily. For instance, the occurance
+      of a <blockquote> tag should _not_ implicitly close the previous
+      <blockquote> tag.
+
+       Alice said: <blockquote>Bob said: <blockquote>Blah
+        should NOT be transformed into:
+       Alice said: <blockquote>Bob said: </blockquote><blockquote>Blah
+
+      Some tags can be nested, but the nesting is reset by the
+      interposition of other tags. For instance, a <tr> tag should
+      implicitly close the previous <tr> tag within the same <table>,
+      but not close a <tr> tag in another table.
+
+       <table><tr>Blah<tr>Blah
+        should be transformed into:
+       <table><tr>Blah</tr><tr>Blah
+        but,
+       <tr>Blah<table><tr>Blah
+        should NOT be transformed into
+       <tr>Blah<table></tr><tr>Blah
+
+    Differing assumptions about tag nesting rules are a major source
+    of problems with the BeautifulSoup class. If BeautifulSoup is not
+    treating as nestable a tag your page author treats as nestable,
+    try ICantBelieveItsBeautifulSoup, MinimalSoup, or
+    BeautifulStoneSoup before writing your own subclass."""
+
+    def __init__(self, *args, **kwargs):
+        if not kwargs.has_key('smartQuotesTo'):
+            kwargs['smartQuotesTo'] = self.HTML_ENTITIES
+        kwargs['isHTML'] = True
+        BeautifulStoneSoup.__init__(self, *args, **kwargs)
+
+    SELF_CLOSING_TAGS = buildTagMap(None,
+                                    ('br' , 'hr', 'input', 'img', 'meta',
+                                    'spacer', 'link', 'frame', 'base', 'col'))
+
+    PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea'])
+
+    QUOTE_TAGS = {'script' : None, 'textarea' : None}
+
+    #According to the HTML standard, each of these inline tags can
+    #contain another tag of the same type. Furthermore, it's common
+    #to actually use these tags this way.
+    NESTABLE_INLINE_TAGS = ('span', 'font', 'q', 'object', 'bdo', 'sub', 'sup',
+                            'center')
+
+    #According to the HTML standard, these block tags can contain
+    #another tag of the same type. Furthermore, it's common
+    #to actually use these tags this way.
+    NESTABLE_BLOCK_TAGS = ('blockquote', 'div', 'fieldset', 'ins', 'del')
+
+    #Lists can contain other lists, but there are restrictions.
+    NESTABLE_LIST_TAGS = { 'ol' : [],
+                           'ul' : [],
+                           'li' : ['ul', 'ol'],
+                           'dl' : [],
+                           'dd' : ['dl'],
+                           'dt' : ['dl'] }
+
+    #Tables can contain other tables, but there are restrictions.
+    NESTABLE_TABLE_TAGS = {'table' : [],
+                           'tr' : ['table', 'tbody', 'tfoot', 'thead'],
+                           'td' : ['tr'],
+                           'th' : ['tr'],
+                           'thead' : ['table'],
+                           'tbody' : ['table'],
+                           'tfoot' : ['table'],
+                           }
+
+    NON_NESTABLE_BLOCK_TAGS = ('address', 'form', 'p', 'pre')
+
+    #If one of these tags is encountered, all tags up to the next tag of
+    #this type are popped.
+    RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript',
+                                     NON_NESTABLE_BLOCK_TAGS,
+                                     NESTABLE_LIST_TAGS,
+                                     NESTABLE_TABLE_TAGS)
+
+    NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS,
+                                NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS)
+
+    # Used to detect the charset in a META tag; see start_meta
+    CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)", re.M)
+
+    def start_meta(self, attrs):
+        """Beautiful Soup can detect a charset included in a META tag,
+        try to convert the document to that charset, and re-parse the
+        document from the beginning."""
+        httpEquiv = None
+        contentType = None
+        contentTypeIndex = None
+        tagNeedsEncodingSubstitution = False
+
+        for i in range(0, len(attrs)):
+            key, value = attrs[i]
+            key = key.lower()
+            if key == 'http-equiv':
+                httpEquiv = value
+            elif key == 'content':
+                contentType = value
+                contentTypeIndex = i
+
+        if httpEquiv and contentType: # It's an interesting meta tag.
+            match = self.CHARSET_RE.search(contentType)
+            if match:
+                if (self.declaredHTMLEncoding is not None or
+                    self.originalEncoding == self.fromEncoding):
+                    # An HTML encoding was sniffed while converting
+                    # the document to Unicode, or an HTML encoding was
+                    # sniffed during a previous pass through the
+                    # document, or an encoding was specified
+                    # explicitly and it worked. Rewrite the meta tag.
+                    def rewrite(match):
+                        return match.group(1) + "%SOUP-ENCODING%"
+                    newAttr = self.CHARSET_RE.sub(rewrite, contentType)
+                    attrs[contentTypeIndex] = (attrs[contentTypeIndex][0],
+                                               newAttr)
+                    tagNeedsEncodingSubstitution = True
+                else:
+                    # This is our first pass through the document.
+                    # Go through it again with the encoding information.
+                    newCharset = match.group(3)
+                    if newCharset and newCharset != self.originalEncoding:
+                        self.declaredHTMLEncoding = newCharset
+                        self._feed(self.declaredHTMLEncoding)
+                        raise StopParsing
+                    pass
+        tag = self.unknown_starttag("meta", attrs)
+        if tag and tagNeedsEncodingSubstitution:
+            tag.containsSubstitutions = True
+
+class StopParsing(Exception):
+    pass
+
+class ICantBelieveItsBeautifulSoup(BeautifulSoup):
+
+    """The BeautifulSoup class is oriented towards skipping over
+    common HTML errors like unclosed tags. However, sometimes it makes
+    errors of its own. For instance, consider this fragment:
+
+     <b>Foo<b>Bar</b></b>
+
+    This is perfectly valid (if bizarre) HTML. However, the
+    BeautifulSoup class will implicitly close the first b tag when it
+    encounters the second 'b'. It will think the author wrote
+    "<b>Foo<b>Bar", and didn't close the first 'b' tag, because
+    there's no real-world reason to bold something that's already
+    bold. When it encounters '</b></b>' it will close two more 'b'
+    tags, for a grand total of three tags closed instead of two. This
+    can throw off the rest of your document structure. The same is
+    true of a number of other tags, listed below.
+
+    It's much more common for someone to forget to close a 'b' tag
+    than to actually use nested 'b' tags, and the BeautifulSoup class
+    handles the common case. This class handles the not-co-common
+    case: where you can't believe someone wrote what they did, but
+    it's valid HTML and BeautifulSoup screwed up by assuming it
+    wouldn't be."""
+
+    I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \
+     ('em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong',
+      'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b',
+      'big')
+
+    I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ('noscript',)
+
+    NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS,
+                                I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS,
+                                I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS)
+
+class MinimalSoup(BeautifulSoup):
+    """The MinimalSoup class is for parsing HTML that contains
+    pathologically bad markup. It makes no assumptions about tag
+    nesting, but it does know which tags are self-closing, that
+    <script> tags contain Javascript and should not be parsed, that
+    META tags may contain encoding information, and so on.
+
+    This also makes it better for subclassing than BeautifulStoneSoup
+    or BeautifulSoup."""
+
+    RESET_NESTING_TAGS = buildTagMap('noscript')
+    NESTABLE_TAGS = {}
+
+class BeautifulSOAP(BeautifulStoneSoup):
+    """This class will push a tag with only a single string child into
+    the tag's parent as an attribute. The attribute's name is the tag
+    name, and the value is the string child. An example should give
+    the flavor of the change:
+
+    <foo><bar>baz</bar></foo>
+     =>
+    <foo bar="baz"><bar>baz</bar></foo>
+
+    You can then access fooTag['bar'] instead of fooTag.barTag.string.
+
+    This is, of course, useful for scraping structures that tend to
+    use subelements instead of attributes, such as SOAP messages. Note
+    that it modifies its input, so don't print the modified version
+    out.
+
+    I'm not sure how many people really want to use this class; let me
+    know if you do. Mainly I like the name."""
+
+    def popTag(self):
+        if len(self.tagStack) > 1:
+            tag = self.tagStack[-1]
+            parent = self.tagStack[-2]
+            parent._getAttrMap()
+            if (isinstance(tag, Tag) and len(tag.contents) == 1 and
+                isinstance(tag.contents[0], NavigableString) and
+                not parent.attrMap.has_key(tag.name)):
+                parent[tag.name] = tag.contents[0]
+        BeautifulStoneSoup.popTag(self)
+
+#Enterprise class names! It has come to our attention that some people
+#think the names of the Beautiful Soup parser classes are too silly
+#and "unprofessional" for use in enterprise screen-scraping. We feel
+#your pain! For such-minded folk, the Beautiful Soup Consortium And
+#All-Night Kosher Bakery recommends renaming this file to
+#"RobustParser.py" (or, in cases of extreme enterprisiness,
+#"RobustParserBeanInterface.class") and using the following
+#enterprise-friendly class aliases:
+class RobustXMLParser(BeautifulStoneSoup):
+    pass
+class RobustHTMLParser(BeautifulSoup):
+    pass
+class RobustWackAssHTMLParser(ICantBelieveItsBeautifulSoup):
+    pass
+class RobustInsanelyWackAssHTMLParser(MinimalSoup):
+    pass
+class SimplifyingSOAPParser(BeautifulSOAP):
+    pass
+
+######################################################
+#
+# Bonus library: Unicode, Dammit
+#
+# This class forces XML data into a standard format (usually to UTF-8
+# or Unicode).  It is heavily based on code from Mark Pilgrim's
+# Universal Feed Parser. It does not rewrite the XML or HTML to
+# reflect a new encoding: that happens in BeautifulStoneSoup.handle_pi
+# (XML) and BeautifulSoup.start_meta (HTML).
+
+# Autodetects character encodings.
+# Download from http://chardet.feedparser.org/
+try:
+    import chardet
+#    import chardet.constants
+#    chardet.constants._debug = 1
+except ImportError:
+    chardet = None
+
+# cjkcodecs and iconv_codec make Python know about more character encodings.
+# Both are available from http://cjkpython.i18n.org/
+# They're built in if you use Python 2.4.
+try:
+    import cjkcodecs.aliases
+except ImportError:
+    pass
+try:
+    import iconv_codec
+except ImportError:
+    pass
+
+class UnicodeDammit:
+    """A class for detecting the encoding of a *ML document and
+    converting it to a Unicode string. If the source encoding is
+    windows-1252, can replace MS smart quotes with their HTML or XML
+    equivalents."""
+
+    # This dictionary maps commonly seen values for "charset" in HTML
+    # meta tags to the corresponding Python codec names. It only covers
+    # values that aren't in Python's aliases and can't be determined
+    # by the heuristics in find_codec.
+    CHARSET_ALIASES = { "macintosh" : "mac-roman",
+                        "x-sjis" : "shift-jis" }
+
+    def __init__(self, markup, overrideEncodings=[],
+                 smartQuotesTo='xml', isHTML=False):
+        self.declaredHTMLEncoding = None
+        self.markup, documentEncoding, sniffedEncoding = \
+                     self._detectEncoding(markup, isHTML)
+        self.smartQuotesTo = smartQuotesTo
+        self.triedEncodings = []
+        if markup == '' or isinstance(markup, unicode):
+            self.originalEncoding = None
+            self.unicode = unicode(markup)
+            return
+
+        u = None
+        for proposedEncoding in overrideEncodings:
+            u = self._convertFrom(proposedEncoding)
+            if u: break
+        if not u:
+            for proposedEncoding in (documentEncoding, sniffedEncoding):
+                u = self._convertFrom(proposedEncoding)
+                if u: break
+
+        # If no luck and we have auto-detection library, try that:
+        if not u and chardet and not isinstance(self.markup, unicode):
+            u = self._convertFrom(chardet.detect(self.markup)['encoding'])
+
+        # As a last resort, try utf-8 and windows-1252:
+        if not u:
+            for proposed_encoding in ("utf-8", "windows-1252"):
+                u = self._convertFrom(proposed_encoding)
+                if u: break
+
+        self.unicode = u
+        if not u: self.originalEncoding = None
+
+    def _subMSChar(self, orig):
+        """Changes a MS smart quote character to an XML or HTML
+        entity."""
+        sub = self.MS_CHARS.get(orig)
+        if isinstance(sub, tuple):
+            if self.smartQuotesTo == 'xml':
+                sub = '&#x%s;' % sub[1]
+            else:
+                sub = '&%s;' % sub[0]
+        return sub
+
+    def _convertFrom(self, proposed):
+        proposed = self.find_codec(proposed)
+        if not proposed or proposed in self.triedEncodings:
+            return None
+        self.triedEncodings.append(proposed)
+        markup = self.markup
+
+        # Convert smart quotes to HTML if coming from an encoding
+        # that might have them.
+        if self.smartQuotesTo and proposed.lower() in("windows-1252",
+                                                      "iso-8859-1",
+                                                      "iso-8859-2"):
+            markup = re.compile("([\x80-\x9f])").sub \
+                     (lambda(x): self._subMSChar(x.group(1)),
+                      markup)
+
+        try:
+            # print "Trying to convert document to %s" % proposed
+            u = self._toUnicode(markup, proposed)
+            self.markup = u
+            self.originalEncoding = proposed
+        except Exception, e:
+            # print "That didn't work!"
+            # print e
+            return None
+        #print "Correct encoding: %s" % proposed
+        return self.markup
+
+    def _toUnicode(self, data, encoding):
+        '''Given a string and its encoding, decodes the string into Unicode.
+        %encoding is a string recognized by encodings.aliases'''
+
+        # strip Byte Order Mark (if present)
+        if (len(data) >= 4) and (data[:2] == '\xfe\xff') \
+               and (data[2:4] != '\x00\x00'):
+            encoding = 'utf-16be'
+            data = data[2:]
+        elif (len(data) >= 4) and (data[:2] == '\xff\xfe') \
+                 and (data[2:4] != '\x00\x00'):
+            encoding = 'utf-16le'
+            data = data[2:]
+        elif data[:3] == '\xef\xbb\xbf':
+            encoding = 'utf-8'
+            data = data[3:]
+        elif data[:4] == '\x00\x00\xfe\xff':
+            encoding = 'utf-32be'
+            data = data[4:]
+        elif data[:4] == '\xff\xfe\x00\x00':
+            encoding = 'utf-32le'
+            data = data[4:]
+        newdata = unicode(data, encoding)
+        return newdata
+
+    def _detectEncoding(self, xml_data, isHTML=False):
+        """Given a document, tries to detect its XML encoding."""
+        xml_encoding = sniffed_xml_encoding = None
+        try:
+            if xml_data[:4] == '\x4c\x6f\xa7\x94':
+                # EBCDIC
+                xml_data = self._ebcdic_to_ascii(xml_data)
+            elif xml_data[:4] == '\x00\x3c\x00\x3f':
+                # UTF-16BE
+                sniffed_xml_encoding = 'utf-16be'
+                xml_data = unicode(xml_data, 'utf-16be').encode('utf-8')
+            elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') \
+                     and (xml_data[2:4] != '\x00\x00'):
+                # UTF-16BE with BOM
+                sniffed_xml_encoding = 'utf-16be'
+                xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8')
+            elif xml_data[:4] == '\x3c\x00\x3f\x00':
+                # UTF-16LE
+                sniffed_xml_encoding = 'utf-16le'
+                xml_data = unicode(xml_data, 'utf-16le').encode('utf-8')
+            elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and \
+                     (xml_data[2:4] != '\x00\x00'):
+                # UTF-16LE with BOM
+                sniffed_xml_encoding = 'utf-16le'
+                xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8')
+            elif xml_data[:4] == '\x00\x00\x00\x3c':
+                # UTF-32BE
+                sniffed_xml_encoding = 'utf-32be'
+                xml_data = unicode(xml_data, 'utf-32be').encode('utf-8')
+            elif xml_data[:4] == '\x3c\x00\x00\x00':
+                # UTF-32LE
+                sniffed_xml_encoding = 'utf-32le'
+                xml_data = unicode(xml_data, 'utf-32le').encode('utf-8')
+            elif xml_data[:4] == '\x00\x00\xfe\xff':
+                # UTF-32BE with BOM
+                sniffed_xml_encoding = 'utf-32be'
+                xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8')
+            elif xml_data[:4] == '\xff\xfe\x00\x00':
+                # UTF-32LE with BOM
+                sniffed_xml_encoding = 'utf-32le'
+                xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8')
+            elif xml_data[:3] == '\xef\xbb\xbf':
+                # UTF-8 with BOM
+                sniffed_xml_encoding = 'utf-8'
+                xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8')
+            else:
+                sniffed_xml_encoding = 'ascii'
+                pass
+        except:
+            xml_encoding_match = None
+        xml_encoding_match = re.compile(
+            '^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data)
+        if not xml_encoding_match and isHTML:
+            regexp = re.compile('<\s*meta[^>]+charset=([^>]*?)[;\'">]', re.I)
+            xml_encoding_match = regexp.search(xml_data)
+        if xml_encoding_match is not None:
+            xml_encoding = xml_encoding_match.groups()[0].lower()
+            if isHTML:
+                self.declaredHTMLEncoding = xml_encoding
+            if sniffed_xml_encoding and \
+               (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode',
+                                 'iso-10646-ucs-4', 'ucs-4', 'csucs4',
+                                 'utf-16', 'utf-32', 'utf_16', 'utf_32',
+                                 'utf16', 'u16')):
+                xml_encoding = sniffed_xml_encoding
+        return xml_data, xml_encoding, sniffed_xml_encoding
+
+
+    def find_codec(self, charset):
+        return self._codec(self.CHARSET_ALIASES.get(charset, charset)) \
+               or (charset and self._codec(charset.replace("-", ""))) \
+               or (charset and self._codec(charset.replace("-", "_"))) \
+               or charset
+
+    def _codec(self, charset):
+        if not charset: return charset
+        codec = None
+        try:
+            codecs.lookup(charset)
+            codec = charset
+        except (LookupError, ValueError):
+            pass
+        return codec
+
+    EBCDIC_TO_ASCII_MAP = None
+    def _ebcdic_to_ascii(self, s):
+        c = self.__class__
+        if not c.EBCDIC_TO_ASCII_MAP:
+            emap = (0,1,2,3,156,9,134,127,151,141,142,11,12,13,14,15,
+                    16,17,18,19,157,133,8,135,24,25,146,143,28,29,30,31,
+                    128,129,130,131,132,10,23,27,136,137,138,139,140,5,6,7,
+                    144,145,22,147,148,149,150,4,152,153,154,155,20,21,158,26,
+                    32,160,161,162,163,164,165,166,167,168,91,46,60,40,43,33,
+                    38,169,170,171,172,173,174,175,176,177,93,36,42,41,59,94,
+                    45,47,178,179,180,181,182,183,184,185,124,44,37,95,62,63,
+                    186,187,188,189,190,191,192,193,194,96,58,35,64,39,61,34,
+                    195,97,98,99,100,101,102,103,104,105,196,197,198,199,200,
+                    201,202,106,107,108,109,110,111,112,113,114,203,204,205,
+                    206,207,208,209,126,115,116,117,118,119,120,121,122,210,
+                    211,212,213,214,215,216,217,218,219,220,221,222,223,224,
+                    225,226,227,228,229,230,231,123,65,66,67,68,69,70,71,72,
+                    73,232,233,234,235,236,237,125,74,75,76,77,78,79,80,81,
+                    82,238,239,240,241,242,243,92,159,83,84,85,86,87,88,89,
+                    90,244,245,246,247,248,249,48,49,50,51,52,53,54,55,56,57,
+                    250,251,252,253,254,255)
+            import string
+            c.EBCDIC_TO_ASCII_MAP = string.maketrans( \
+            ''.join(map(chr, range(256))), ''.join(map(chr, emap)))
+        return s.translate(c.EBCDIC_TO_ASCII_MAP)
+
+    MS_CHARS = { '\x80' : ('euro', '20AC'),
+                 '\x81' : ' ',
+                 '\x82' : ('sbquo', '201A'),
+                 '\x83' : ('fnof', '192'),
+                 '\x84' : ('bdquo', '201E'),
+                 '\x85' : ('hellip', '2026'),
+                 '\x86' : ('dagger', '2020'),
+                 '\x87' : ('Dagger', '2021'),
+                 '\x88' : ('circ', '2C6'),
+                 '\x89' : ('permil', '2030'),
+                 '\x8A' : ('Scaron', '160'),
+                 '\x8B' : ('lsaquo', '2039'),
+                 '\x8C' : ('OElig', '152'),
+                 '\x8D' : '?',
+                 '\x8E' : ('#x17D', '17D'),
+                 '\x8F' : '?',
+                 '\x90' : '?',
+                 '\x91' : ('lsquo', '2018'),
+                 '\x92' : ('rsquo', '2019'),
+                 '\x93' : ('ldquo', '201C'),
+                 '\x94' : ('rdquo', '201D'),
+                 '\x95' : ('bull', '2022'),
+                 '\x96' : ('ndash', '2013'),
+                 '\x97' : ('mdash', '2014'),
+                 '\x98' : ('tilde', '2DC'),
+                 '\x99' : ('trade', '2122'),
+                 '\x9a' : ('scaron', '161'),
+                 '\x9b' : ('rsaquo', '203A'),
+                 '\x9c' : ('oelig', '153'),
+                 '\x9d' : '?',
+                 '\x9e' : ('#x17E', '17E'),
+                 '\x9f' : ('Yuml', ''),}
+
+#######################################################################
+
+
+#By default, act as an HTML pretty-printer.
+if __name__ == '__main__':
+    import sys
+    soup = BeautifulSoup(sys.stdin)
+    print soup.prettify()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/imports.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/imports.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/imports.py	(revision 1126)
@@ -0,0 +1,158 @@
+from cartodb import CartoDBException
+
+
+class ImportJob(object):
+    """
+    Equivalent to a job process on CartoDB.
+    New jobs have no id until they're "run". Then, they can be updated so that their attributes
+    reflect the current status of the job.
+    """
+    id = None
+
+    def __init__(self, client, type_guessing=True, quoted_fields_guessing=True, content_guessing=False, create_vis=False, **kwargs):
+        """
+        :param client: Client to make authorized requests (currently only CartoDBAPIKey is supported)
+        :param type_guessing: If set to False disables field type guessing (for Excel and CSVs)
+        :param quoted_fields_guessing: If set to False disables type guessing of CSV fields that come inside double quotes
+        :param content_guessing: Set it to True to enable content guessing and automatic geocoding based on results. Currently it only implemenents geocoding of countries.
+        :param create_vis: Set it to true to flag the import so when it finishes, it creates automatically Map after importing the Dataset
+        :param kwargs: Dictionary with the data attributes that come from the Import API response. They will be mapped to real object attributes.
+        :return:
+        """
+        self.client = client
+        self.run_params = {"type_guessing": type_guessing,
+                           "quoted_fields_guessing": quoted_fields_guessing,
+                           "content_guessing": content_guessing,
+                           "create_vis": create_vis}
+
+        self.update_from_dict(kwargs)
+
+    def update_from_dict(self, data_dict):
+        """
+        :param data_dict: Dictionary to be mapped into object attributes
+        :return:
+        """
+        for k, v in data_dict.items():  # More efficient if use 'future.utils.iteritems' or 'six.iteritems'
+            setattr(self, k, v)
+        if "item_queue_id" in data_dict:
+            self.id = data_dict["item_queue_id"]
+
+    def req(self, url, api_params=None, client_params=None):
+        """
+        Make the actual request to the Import API
+        :param url: Endpoint URL
+        :param api_params: Params to be appended to the URL
+        :param client_params: Params to be sent to the client (and, in turn, to requests)
+        :return:
+        """
+        resp = self.client.req(url, params=api_params, **client_params or {})
+        response_data = self.client.get_response_data(resp, True)
+        self.update_from_dict(response_data)
+
+    def run(self):
+        """
+        Creates the job import on the CartoDB server, must be implemented by children classes
+        """
+        raise NotImplementedError
+
+    def update(self):
+        """
+        Updates the information of the import job against the CartoDB server
+        :return:
+        """
+        if self.id is None:
+            raise CartoDBException("Import job needs to be run first!")
+
+        self.req("%s/%s" % (self.client.imports_url, self.id))
+
+
+class FileImport(ImportJob):
+    """
+    This class provides support for uploading and importing local files into CartoDB
+    """
+    def __init__(self, file_name, *args, **kwargs):
+        """
+        :param file_name: File name (paths are supported)
+        :param args: Sent to parent class
+        :param kwargs: Sent to parent class
+        :return:
+        """
+        super(FileImport, self).__init__(*args, **kwargs)
+        self.files = {'file': open(file_name, 'rb')}
+
+    def run(self):
+        """
+        Actually creates the job import on the CartoDB server
+        :return:
+        """
+        self.req(self.client.imports_url, api_params=self.run_params, client_params={"files": self.files, "http_method": "POST"})
+
+
+class URLImport(ImportJob):
+    """
+    This class provides support for uploading and importing remote files into CartoDB
+    No sync support yet
+    """
+    def __init__(self, url, *args, **kwargs):
+        """
+        :param url: Remote URL for the file
+        :param args: Sent to parent class
+        :param kwargs: Sent to parent class
+        :return:
+        """
+        super(URLImport, self).__init__(*args, **kwargs)
+        self.url = url
+
+    def run(self):
+        """
+        Actually creates the job import on the CartoDB server
+        :return:
+        """
+        api_params = self.run_params
+        api_params["url"] = self.url
+
+        self.req(self.client.imports_url, api_params=api_params, client_params={"http_method": "POST"})
+
+
+class ImportManager(object):
+    item_queue_id = None
+
+    def __init__(self, client):
+        """
+        :param client: Client to make authorized requests (currently only CartoDBAPIKey is supported)
+        :return:
+        """
+        self.client = client
+
+    def get(self, id=None, ids_only=False):
+        """
+        Get one import job or a list with all the current (pending) import jobs
+        :param id: If set, only this job will be retrieved. This works no matter the state of the job
+        :param ids_only: If True, a list of IDs is returned; if False, a list of ImportJob objects is returned
+        :return: An import job, a list of import job IDs or a list of import jobs
+        """
+        if id is not None:
+            resp = self.client.req("%s/%s" % (self.client.imports_url, id))
+            response_data = self.client.get_response_data(resp, True)
+            return ImportJob(self.client, **response_data)
+        else:
+            imports = []
+
+            resp = self.client.req(self.client.imports_url)
+            response_data = self.client.get_response_data(resp, True)
+            if response_data["success"] is True:
+                for import_job_id in response_data["imports"]:
+                    if ids_only is True:
+                        imports.append(import_job_id)
+                    else:
+                        imports.append(self.get(import_job_id))
+
+            return imports
+
+    def all(self, ids_only=False):
+        """
+        Get all the current (pending) import jobs
+        :param ids_only: If True, a list of IDs is returned; if False, a list of ImportJob objects is returned
+        :return: A list of import job IDs or a list of import jobs
+        """
+        return self.get(ids_only=ids_only)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/cartodb.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/cartodb.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/cartodb.py	(revision 1126)
@@ -0,0 +1,276 @@
+"""
+  ** CartoDBClient **
+
+    A simple CartoDB client to perform requests against the CartoDB API.
+    Internally it uses OAuth
+
+  * Requirements:
+
+     python 2.6
+     pip install -r requirements.txt
+
+  * Example use:
+        user =  'your@mail.com'
+        password =  'XXXX'
+        CONSUMER_KEY='XXXXXXXXXXXXXXXXXX'
+        CONSUMER_SECRET='YYYYYYYYYYYYYYYYYYYYYYYYYY'
+        cartodb_domain = 'vitorino'
+        cl = CartoDBOAuth(CONSUMER_KEY, CONSUMER_SECRET, user, password, cartodb_domain)
+        print cl.sql('select * from a')
+
+"""
+import httplib2
+import warnings
+import oauth2 as oauth
+import requests
+from requests_oauthlib import OAuth1Session
+
+try:
+    from urllib.parse import urlparse, parse_qsl, urlencode
+except ImportError:
+    # fall back to Python 2.x
+    from urlparse import urlparse, parse_qsl
+    from urllib import urlencode
+
+try:
+    import json
+except ImportError:
+    import simplejson as json
+
+ACCESS_TOKEN_URL = '%(protocol)s://%(user)s.%(domain)s/oauth/access_token'
+RESOURCE_URL = '%(protocol)s://%(user)s.%(domain)s/api/%(api_version)s/sql'
+IMPORTS_URL = '%(protocol)s://%(user)s.%(domain)s/api/%(api_version)s/imports'
+
+
+def proxyinfo2proxies(proxy_info):
+    """
+    Converts ProxyInfo object into a proxies dict
+    :param proxy_info: ProxyInfo object
+    :return: requests' proxies dict
+    """
+    proxies = {}
+
+    if proxy_info.proxy_user and proxy_info.proxy_pass:
+        credentials = "{user}:{password}@".format(user=proxy_info.proxy_user, password=proxy_info.proxy_pass)
+    elif proxy_info.proxy_user:
+        credentials = "{user}@".format(user=proxy_info.proxy_user)
+    else:
+        credentials = ''
+    port = ":{port}".format(port=proxy_info.proxy_port) if proxy_info.proxy_port else ''
+
+    proxy_url = "http://{credentials}{host}{port}".format(credentials=credentials, host=proxy_info.proxy_host, port=port)
+
+    if proxy_info.applies_to("http"):
+        proxies["http"] = proxy_url
+    if proxy_info.applies_to("https"):
+        proxies["https"] = proxy_url
+
+    return proxies
+
+
+def proxies2proxyinfo(proxies):
+    """
+    Converts proxies dict into a ProxyInfo object
+    :param proxies: requests' proxies dict
+    :return: ProxyInfo object
+    """
+    url_components = urlparse(proxies["http"]) if "http" in proxies else urlparse(proxies["https"])
+
+    return httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP_NO_TUNNEL, url_components.hostname, url_components.port,
+                              proxy_user=url_components.username, proxy_pass=url_components.password)
+
+
+class CartoDBException(Exception):
+    pass
+
+
+class CartoDBBase(object):
+    """ basic client to access cartodb api """
+    MAX_GET_QUERY_LEN = 2048
+
+    def __init__(self, cartodb_domain, host='cartodb.com', protocol='https', api_version=None, proxy_info=None, sql_api_version='v2', import_api_version='v1'):
+        """
+        :param cartodb_domain: Subdomain for API requests. It's called "cartodb_domain", but it's just a subdomain and doesn't have to live under cartodb.com
+        :param host: Domain for API requests, even though it's called "host"
+        :param protocol: Just use the default
+        :param sql_api_version: Use default or 'v1' to avoid caching
+        :param import_api_version: Only 'v1' is currently supported
+        :param api_version: SQL API version, kept only for backward compatibility
+        :param proxy_info: httplib2's ProxyInfo object or requests' proxy dict
+        :return:
+        """
+        if api_version is None:
+            api_version = sql_api_version
+        self.resource_url = RESOURCE_URL % {'user': cartodb_domain, 'domain': host, 'protocol': protocol, 'api_version': api_version}
+        self.imports_url = IMPORTS_URL % {'user': cartodb_domain, 'domain': host, 'protocol': protocol, 'api_version': import_api_version}
+        self.host = host
+        self.protocol = protocol
+        self.api_version = api_version
+        # For backwards compatibility, we need to support httplib2's ProxyInfo and requests' proxies objects
+        # And we still need old-style ProxyInfo for the xAuth client
+        if type(proxy_info) == httplib2.ProxyInfo:
+            self.proxy_info = proxy_info
+            self.proxies = proxyinfo2proxies(self.proxy_info)
+        if type(proxy_info) == dict:
+            self.proxies = proxy_info
+            self.proxy_info = proxies2proxyinfo(self.proxies)
+        else:
+            self.proxy_info = None
+            self.proxies = None
+
+    def req(self, url, http_method="GET", http_headers=None, body=None, params=None, files=None):
+        """
+        Subclasses must implement this method, that will be used to send API requests with proper auth
+        :param url: API URL, currently, only SQL API is supported
+        :param http_method: "GET" or "POST"
+        :param http_headers: requests' http_headers
+        :param body: requests' "data"
+        :param params: requests' "params"
+        :param files: requests' "files"
+        :return:
+        """
+        raise NotImplementedError('req method must be implemented')
+
+    def get_response_data(self, resp, parse_json=True):
+        """
+        Get response data or throw an appropiate exception
+        :param resp: requests' response object
+        :param parse_json: if True, response will be parsed as JSON
+        :return: response data, either as json or as a regular response.content object
+        """
+        if resp.status_code == requests.codes.ok:
+            if parse_json:
+                return resp.json()
+            return resp.content
+        elif resp.status_code == requests.codes.bad_request:
+            r = resp.json()
+            raise CartoDBException(r.get('error', False) or r.get('errors', 'Bad Request: ' + resp.text))
+        elif resp.status_code == requests.codes.not_found:
+            raise CartoDBException('Not found: ' + resp.url)
+        elif resp.status_code == requests.codes.internal_server_error:
+            raise CartoDBException('Internal server error')
+        elif resp.status_code == requests.codes.unauthorized or resp.status_code == requests.codes.forbidden:
+            raise CartoDBException('Access denied')
+        else:
+            raise CartoDBException('Unknown error occurred')
+
+    def sql(self, sql, parse_json=True, do_post=True, format=None):
+        """
+        Executes SQL query in a CartoDB server
+        :param sql:
+        :param parse_json: Set it to False if you want raw reponse
+        :param do_post: Set it to True to force post request
+        :param format: Any of the data export formats allowed by CartoDB's SQL API
+        :return: response data, either as json or as a regular response.content object
+        """
+        params = {'q': sql}
+        if format:
+            params['format'] = format
+            if format not in ['json', 'geojson']:
+                parse_json = False
+        url = self.resource_url
+
+        # depending on query size do a POST or GET
+        if len(sql) < self.MAX_GET_QUERY_LEN and not do_post:
+            resp = self.req(url, 'GET', params=params)
+        else:
+            resp = self.req(url, 'POST', body=params)
+
+        return self.get_response_data(resp, parse_json)
+
+
+class CartoDBOAuth(CartoDBBase):
+    """
+    This class provides you with authenticated access to CartoDB's APIs using your XAuth credentials.
+    You can find your API key in https://USERNAME.cartodb.com/your_apps/oauth.
+    """
+    def __init__(self, key, secret, email, password, cartodb_domain, **kwargs):
+        """
+        :param key: XAuth consumer key
+        :param secret: XAuth consumer secret
+        :param email: User name on CartoDB (yes, no email)
+        :param password: User password on CartoDB
+        :param cartodb_domain: Subdomain for API requests. It's called "cartodb_domain", but it's just a subdomain and doesn't have to live under cartodb.com
+        :param kwargs: Any other params to be sent to the parent class
+        :return:
+        """
+        super(CartoDBOAuth, self).__init__(cartodb_domain, **kwargs)
+
+        # Sadly, we xAuth is not supported by requests or any of its modules, so we need to stick to
+        # oauth2 when it comes to getting the access token
+        self.consumer_key = key
+        self.consumer_secret = secret
+        consumer = oauth.Consumer(self.consumer_key, self.consumer_secret)
+
+        client = oauth.Client(consumer, proxy_info=self.proxy_info)
+        client.set_signature_method = oauth.SignatureMethod_HMAC_SHA1()
+
+        params = {}
+        params["x_auth_username"] = email
+        params["x_auth_password"] = password
+        params["x_auth_mode"] = 'client_auth'
+
+        # Get Access Token
+        access_token_url = ACCESS_TOKEN_URL % {'user': cartodb_domain, 'domain': self.host, 'protocol': self.protocol}
+        resp, token = client.request(access_token_url, method="POST", body=urlencode(params))
+        if resp['status'] != '200':
+            raise CartoDBException("%s: %s" % (resp['status'], token))
+        access_token = dict(parse_qsl(token.decode()))
+
+        # Prepare client (now this is requests again!)
+        try:
+            self.client = OAuth1Session(self.consumer_key, client_secret=self.consumer_secret, resource_owner_key=access_token['oauth_token'],
+                                        resource_owner_secret=access_token['oauth_token_secret'])
+        except KeyError:
+            raise CartoDBException('Access denied')
+
+    def req(self, url, http_method="GET", http_headers=None, body=None, params=None, files=None):
+        """
+        Make a XAuth-authorized request
+        :param url: API URL, currently, only SQL API is supported
+        :param http_method: "GET" or "POST"
+        :param http_headers: requests' http_headers
+        :param body: requests' "data"
+        :param params: requests' "params"
+        :param files: requests' "files"
+        :return: requests' response object
+        """
+        return self.client.request(http_method.lower(), url, params=params, data=body, headers=http_headers, proxies=self.proxies, files=files)
+
+
+class CartoDBAPIKey(CartoDBBase):
+    """
+    This class provides you with authenticated access to CartoDB's APIs using your API key.
+    You can find your API key in https://USERNAME.cartodb.com/your_apps/api_key.
+    This method is easier than use the oauth authentification but if less secure, it is recommended to use only using the https endpoint
+    """
+    def __init__(self, api_key, cartodb_domain, **kwargs):
+        """
+        :param api_key: API key
+        :param cartodb_domain: Subdomain for API requests. It's called "cartodb_domain", but it's just a subdomain and doesn't have to live under cartodb.com
+        :param kwargs: Any other params to be sent to the parent class
+        :return:
+        """
+        super(CartoDBAPIKey, self).__init__(cartodb_domain, **kwargs)
+
+        self.api_key = api_key
+        self.client = requests
+
+        if self.protocol != 'https':
+            warnings.warn("You are using unencrypted API key authentication!!!")
+
+    def req(self, url, http_method="GET", http_headers=None, body=None, params=None, files=None):
+        """
+        Make a API-key-authorized request
+        :param url: API URL, currently, only SQL API is supported
+        :param http_method: "GET" or "POST"
+        :param http_headers: requests' http_headers
+        :param body: requests' "data"
+        :param params: requests' "params"
+        :param files: requests' "files"
+        :return: requests' response object
+        """
+        params = params or {}
+        params.update({"api_key": self.api_key})
+
+        return self.client.request(http_method.lower(), url, params=params, data=body, headers=http_headers, proxies=self.proxies, files=files)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cartodb/__init__.py	(revision 1126)
@@ -0,0 +1,4 @@
+from __future__ import absolute_import
+
+from .cartodb import *
+from .imports import *
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/__init__.py	(revision 1126)
@@ -0,0 +1,46 @@
+
+from org.gvsig.app import ApplicationLocator
+
+
+try:
+    from project import currentProject, currentDocument, currentView, currentTable
+    from view import currentLayer
+except:
+    pass # En modo standalone (gvsigsh) no hay proyecto ni vista
+
+import flayers
+import mapcontext
+
+try:
+    import table
+except:
+    pass # En modo standalone (gvsigsh) no hay table
+
+import layervectorial
+import featurestore
+import featureset
+import featureselection
+import feature
+import editablefeature
+import featuretype
+import editablefeaturetype
+import dynobject
+import dataparameter
+import window
+
+del flayers
+del mapcontext
+del table
+del layervectorial
+del featurestore
+del featureset
+del featureselection
+del feature
+del editablefeature
+del featuretype
+del editablefeaturetype
+del dynobject
+del dataparameter
+del window
+
+from utils import getTempFile, createSchema, createFeatureType, createLayer, loadShapeFile, loadRasterFile, loadLayer, createShape, createTable, createDBF, loadDBF, loadTable, COLORS, simplePointSymbol, simpleLineSymbol, simplePolygonSymbol, getDataFolder, getProjectsFolder, getColorFromRGB, getDefaultColor, getCRS, LOGGER_INFO, LOGGER_WARN, LOGGER_ERROR, logger, getResource, openStore
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/utils.py	(revision 1126)
@@ -0,0 +1,503 @@
+
+import os
+import time
+import sys
+import StringIO
+import random
+
+from java.util.prefs import Preferences
+from java.awt import Color
+from java.io import File
+from java.lang import Throwable, RuntimeException
+
+try:
+    from project import currentView, currentProject
+    from org.gvsig.app.project.documents.view import DefaultViewDocument
+    from org.gvsig.andami import Utilities
+    from org.gvsig.app.project.documents.table import TableManager
+except:
+    pass # En modo standalone (gvsigsh) no hay documentos, ni proyecto
+
+from org.gvsig.app import ApplicationLocator
+from org.gvsig.fmap.dal.feature import FeatureType
+from org.gvsig.fmap.mapcontext import MapContextLocator
+from org.gvsig.fmap.crs import CRSFactory
+from org.gvsig.fmap.geom import Geometry
+from org.gvsig.scripting.app.extension import ScriptingUtils
+
+
+
+LOGGER_INFO=ScriptingUtils.INFO
+LOGGER_WARN=ScriptingUtils.WARN
+LOGGER_ERROR=ScriptingUtils.ERROR
+
+
+def logger(msg, mode=LOGGER_INFO, ex=None):
+  if ex != None:
+    try:
+        tb = sys.exc_info()[2]
+        f = StringIO.StringIO()
+        f.write("%s\n" % msg)
+        f.write("Traceback (most recent call last):\n")
+        while tb!=None:
+          code = tb.tb_frame.f_code
+          f.write("  File %r, line %d, %s\n" % (code.co_filename,tb.tb_frame.f_lineno,code.co_name))
+          tb = tb.tb_next
+        f.write("%s\n" % str(ex))
+        msg = f.getvalue()
+    except:
+        pass
+  if isinstance(ex,Throwable):
+      ScriptingUtils.log(mode,msg,ex)
+  else:
+      ScriptingUtils.log(mode,msg,None)
+
+def getResource(*args):
+  base = args[0]
+  if base.startswith("__pyclasspath__/"):
+    try:
+      base = sys.getClassLoader().getResourcePath(base)  
+    except:
+      base = args[0]
+  if os.path.isfile(base):
+    base = os.path.dirname(base)
+  x = [ base,]
+  x.extend(args[1:])
+  x = os.path.join(*x)
+  return x
+
+def openStore(type, **parameters):
+  from gvsig.utils import copyToDynObject
+  application = ApplicationLocator.getManager()
+  datamanager =  application.getDataManager()
+  store_parameters = datamanager.createStoreParameters(type)
+  copyToDynObject(parameters, store_parameters)
+  store = datamanager.openStore(type, store_parameters)
+  return store
+
+def createFeatureType(schema = None):
+  """Returns attributes definition. If Schema is recived then makes a copy and
+  returns editable instance. Otherwise returns empty Schema.
+  :param schema: Schema to make a copy
+  :type schema: Schema
+  """
+  if isinstance(schema, FeatureType):
+    try:
+      s = schema.getCopy().getEditable()
+      return s
+    except:
+      pass
+
+  application = ApplicationLocator.getManager()
+  datamanager =  application.getDataManager()
+  return datamanager.createFeatureType()
+
+createSchema = createFeatureType
+
+def createLayer(schema, servertype, layertype=None, **parameters):
+  """
+  Returns new layer
+  :param schema: layer data feature type
+  :type schema: Schema
+  :param servertype:
+  :type servertype: string
+  :return: new layer
+  :rtype: Layer
+  :raise: RuntimeException
+  """
+  if layertype == None:
+    layertype = servertype
+    servertype = "FilesystemExplorer"
+
+  if layertype == "Shape" :
+    if schema.get("GEOMETRY",None) == None:
+      raise RuntimeException("Shape need a field named GEOMETRY in the schema")
+
+  if parameters["geometryType"] == None:
+    raise RuntimeException("Invalid geometry type for new layer")
+
+  try:
+    application = ApplicationLocator.getManager()
+    datamanager =  application.getDataManager()
+
+    mapcontextmanager = application.getMapContextManager()
+
+    server_parameters = datamanager.createServerExplorerParameters(servertype)
+    copyToDynObject(parameters, server_parameters)
+
+    server = datamanager.openServerExplorer(servertype, server_parameters)
+
+    store_parameters = server.getAddParameters(layertype)
+    copyToDynObject(parameters, store_parameters)
+    store_parameters.setDefaultFeatureType(schema)
+
+    server.add(layertype, store_parameters, True)
+
+    layer = loadLayer(layertype, **parameters)
+    
+    return layer
+
+  except Throwable, ex:
+    logger("Can't create layer of type %s, params=(%s), schema=%s " % (layertype,parameters,schema) , LOGGER_WARN, ex)
+    raise RuntimeException("Can't create layer")
+
+def loadShapeFile(shpFile, **parameters):
+    """
+    Add existing shape file to the view. Returns Layer shape file
+    :param shpFile: absolute file path
+    :type: shpFile: string
+    :param CRS: projection code
+    :type CRS: string
+    :param gvViewName: name of the view where to be loaded
+    :type gvViewName: string
+    :param gvLayerName: name of the layer inside gvsig
+    :type gvLayerName: string
+    :return: the shape
+    :type return: Layer
+    """
+    if parameters.get("CRS",None)==None:
+        try:
+            parameters["CRS"] = currentView().getProjectionCode()
+        except:
+            parameters["CRS"] = "EPSG:4326"
+    parameters["shpFile"]=shpFile
+    layer = loadLayer('Shape', **parameters)
+    viewName = parameters.get("gvViewName",None)
+    if viewName == None:
+        view = currentView()
+    elif isinstance(viewName, DefaultViewDocument):
+        view = viewName
+    else:
+        project = currentProject()
+        view = project.getView(viewName)
+        if view == None:
+            raise RuntimeException("Can't get a view with name: "+str(viewName))
+    view.addLayer(layer)
+    layer.setActive(False)
+    return layer
+
+def loadRasterFile(filename, **parameters):
+    parameters["uri"]= File(filename).toURI()
+    ext = os.path.splitext(filename)
+    #if ext[1].lower() == ".jp2" or ext[1].lower()=="ecw":
+    #  layer = loadLayer("Ermapper Store", **parameters)
+    #else:
+    #  layer = loadLayer('Gdal Store', **parameters)
+    layer = loadLayer('Gdal Store', **parameters)
+    viewName = parameters.get("gvViewName",None)
+    print "parameters:", parameters
+    print viewName
+    if viewName == None:
+        view = currentView()
+    elif isinstance(viewName, DefaultViewDocument):
+        view = viewName
+    else:
+        project = currentProject()
+        view = project.getView(viewName)
+        if view == None:
+            raise RuntimeException("Can't get a view with name: "+str(viewName))
+    view.addLayer(layer)
+    layer.setActive(False)
+    return layer
+
+def loadLayer(layerType, **parameters):
+    try:
+        application = ApplicationLocator.getManager()
+        datamanager =  application.getDataManager()
+        mapcontextmanager = application.getMapContextManager()
+        store_parameters = datamanager.createStoreParameters(layerType)
+        copyToDynObject(parameters, store_parameters)
+        store = datamanager.openStore(layerType, store_parameters)
+        layerName = parameters.get("gvLayerName", store.getName())
+        layer = mapcontextmanager.createLayer(layerName, store)
+    except Throwable, ex:
+	logger("Can't load layer of type %s, params=(%s)" % (layerType,parameters) , LOGGER_WARN, ex)
+        raise RuntimeException("Can't load layer, "+ str(ex))
+
+    return layer
+
+def createShape(schema, filename=None, geometryType=None, CRS=None, prefixname="tmpshp"):
+  """
+  Return new shape layer
+  :param schema: layer data definition
+  :type schema: FeatureType
+  :param filename: absolute path for shape files.
+  :type filename: string
+  :param geometryType: geometry type for shape
+  :type geometryType: string
+  :return: new shape layer
+  :rtype: Layer
+  """
+  if CRS==None:
+    try:
+        CRS = currentView().getProjectionCode()
+    except:
+        CRS = "EPSG:4326"
+  if filename == None:
+            filename = getTempFile(prefixname, ".shp")
+  geomattr = schema.getDefaultGeometryAttribute()
+  if geomattr == None:
+    raise RuntimeException("Can't create a shp without geometry attribute")
+  if geometryType == None :
+    geometryType = geomattr.getGeomType().getType()
+  else:
+    if geometryType != geomattr.getGeomType().getType():
+      raise RuntimeException("Can't create a shp, geoemtry mismatch.")
+
+  return createLayer(
+    schema,
+    "FilesystemExplorer",
+    "Shape",
+    shpFile=filename,
+    CRS=CRS,
+    geometryType = geometryType
+  )
+
+def createTable(schema, servertype, tableType=None, **parameters):
+  """Creates a new Table document"""
+  if tableType == None:
+    tableType = servertype
+    servertype = "FilesystemExplorer"
+
+  try:
+    application = ApplicationLocator.getManager()
+    datamanager =  application.getDataManager()
+
+    server_parameters = datamanager.createServerExplorerParameters(servertype)
+    copyToDynObject(parameters, server_parameters)
+
+    server = datamanager.openServerExplorer(servertype, server_parameters)
+
+    store_parameters = server.getAddParameters(tableType)
+    copyToDynObject(parameters, store_parameters)
+    store_parameters.setDefaultFeatureType(schema())
+
+    server.add(tableType, store_parameters, True)
+
+    store = datamanager.openStore(tableType, store_parameters)
+
+    return store
+
+  except Throwable, ex:
+    logger("Can't create table of type %s, params=(%s), schema=%s." % (tableType,parameters,repr(schema)) , LOGGER_WARN, ex)
+    raise RuntimeException("Can't create table, "+ str(ex))
+
+def createDBF(schema, DbfFile=None, prefixname="tmpdbf", CRS="CRS:84"):
+      """
+      Creates a new dbf document
+      :param schema: layer data feature type
+      :type schema: Schema
+      :param DbfFile: absolute path for shape files.
+      :type DbfFile: string
+      :return: new dbf
+      :rtype: Table
+      """
+      if DbfFile == None:
+            DbfFile = getTempFile(prefixname, ".dbf")
+
+      return createTable(
+        schema,
+        "FilesystemExplorer",
+        "DBF",
+        DbfFile=DbfFile,
+        CRS=CRS,
+      )
+
+def loadTable(format, **parameters):
+
+    try:
+        application = ApplicationLocator.getManager()
+        datamanager =  application.getDataManager()
+
+        # Loding the data store
+        store_parameters = datamanager.createStoreParameters(format)
+        copyToDynObject(parameters, store_parameters)
+        store = datamanager.openStore(format, store_parameters)
+
+        # Creating a Table document and initialize with the data store
+        project = currentProject()
+        table = project().createDocument(TableManager.TYPENAME)
+        table.setStore(store)
+        table.setName(store.getName())
+
+        # Add the Table document to the project
+        project().addDocument(table)
+
+    except Throwable, ex:
+	logger("Can't load table of type %s, params=(%s)" % (format,parameters) , LOGGER_WARN, ex)
+        raise RuntimeException("Can't load table, "+ str(ex))
+
+    return table
+
+def loadDBF(dbffile):
+      table = loadTable(format="DBF",DbfFile=dbffile)
+      return table
+
+#=====================#
+# Simbology Functions #
+#=====================#
+COLORS = {
+    'black': Color.black,
+    'blue': Color.blue,
+    'cyan': Color.cyan,
+    'darkGray': Color.darkGray,
+    'gray': Color.gray,
+    'green': Color.green,
+    'lightGray': Color.lightGray,
+    'magenta': Color.magenta,
+    'orange': Color.orange,
+    'pink': Color.pink,
+    'red': Color.red,
+    'white': Color.white,
+    'yellow': Color.yellow,
+}
+
+def simplePointSymbol(color=None):
+  """
+  Returns simple point symbol using parameter color. If no color
+  use a ramdom color
+  :param color: String color name or Java awt Color
+  :return: gvSIG point symbol
+  """
+  if isinstance(color, str) and COLORS.has_key(color.lower()):
+    color = COLORS.get(color)
+
+  if not isinstance(color, Color):
+      color = getDefaultColor()
+
+  return MapContextLocator.getSymbolManager().createSymbol(
+        Geometry.TYPES.POINT, color)
+
+def simpleLineSymbol(color=None):
+  """
+  Returns simple line symbol using parameter color. If no color use a
+  ramdom color
+  :param color: String color name or Java awt Color
+  :return: gvSIG line symbol
+
+  """
+  if isinstance(color, str) and COLORS.has_key(color.lower()):
+    color = COLORS.get(color)
+
+  if not isinstance(color, Color):
+      color = getDefaultColor()
+
+  return MapContextLocator.getSymbolManager().createSymbol(
+        Geometry.TYPES.CURVE, color)
+
+def simplePolygonSymbol(color = None):
+  """
+  Returns simple polygon symbol using parameter color. If no color
+  use a ramdom color.
+  :param color: String color name or Java awt Color
+  :return: gvSIG polygon symbol
+  """
+  if isinstance(color, str) and COLORS.has_key(color.lower()):
+    color = COLORS.get(color)
+
+  if not isinstance(color, Color):
+      color = getDefaultColor()
+
+  return MapContextLocator.getSymbolManager().createSymbol(
+        Geometry.TYPES.SURFACE, color)
+
+
+#=========================================#
+# gvSIG Application Preferences Functions #
+#=========================================#
+
+def getDataFolder():
+  """
+  Returns gvSIG data folder. This folder is defined in application
+  preferences. If is not defined returns None.
+  """
+  return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None)
+
+def getProjectsFolder():
+  """
+  Returns gvSIG projects folder. This folder is defined in application
+  preferences. If is not defined returns None.
+  """
+  return Preferences.userRoot().node("gvsig.foldering").get(
+        'ProjectsFolder', None)
+
+def getColorFromRGB(r, g, b, a=None):
+  """
+  Returns an sRGB color with the specified red, green, blue, and alpha
+  (optional) values in the range (0 - 255).
+  """
+  if a:
+    color = Color(r, g, b, a)
+  else:
+    color = Color(r, g, b)
+
+  return color
+
+def getDefaultColor():
+  """Returns gvsig default symbol fill color or ramdom color"""
+  if MapContextLocator.getMapContextManager().isDefaultSymbolFillColorAleatory():
+    color = Color(random.randint(0, 255),
+                random.randint(0, 255),
+                random.randint(0, 255)
+            )
+  else:
+    sp = MapContextLocator.getSymbolManager().getSymbolPreferences()
+    color = sp.getDefaultSymbolFillColor()
+
+  return color
+
+#================#
+# OTHER          #
+#================#
+
+def getCRS(crs):
+  """Returns Projection from string code (i.e. CRS:84) if exist or None if
+  not.
+  """
+  try:
+    return CRSFactory.getCRS(crs)
+  except:
+    return None
+
+def copyToDynObject(values, target):
+  keys = values.keys()
+  definition = target.getDynClass();
+  fields = definition.getDynFields();
+  for field in fields:
+    name = field.getName()
+    for k in keys:
+      if k.lower() == name.lower():
+	value = values[k] 
+        target.setDynValue(name, value)
+        break
+# ====================================
+#
+
+"""
+def cloneShape(layer, target=None, expresion = None, sortby="", asc=True):
+  if target==None:
+    #  una capa temporal en el temp de andami
+    #...
+  else:
+    targetfile = File(target)
+    if targetfile.isAbsolute():
+      #La guardamos ahi mismo
+    else:
+     # Al temp de andami con ese nombre.
+
+  # Crear la nueva capa
+
+  return newLayer
+"""
+
+def getTempFile(name, ext, tempdir=None):
+    if tempdir==None:
+        tempdir = Utilities.TEMPDIRECTORYPATH
+    if not os.path.isdir(tempdir):
+      os.makedirs(tempdir)
+    t = time.time()
+    f = os.path.join(
+      tempdir,
+      "%s-%x%x%s" % (name,t,(t-int(t)) * 10000,ext)
+    )
+    return f
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featureselection.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featureselection.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featureselection.py	(revision 1126)
@@ -0,0 +1,35 @@
+
+from org.gvsig.fmap.dal.feature.impl import DefaultFeatureSelection as JDefaultFeatureSelection
+
+class JavaIteratorWraper(object):
+    def __init__(self, jiterator):
+        self._jiterator = jiterator
+
+    def next(self):
+        if self._jiterator.hasNext():
+            return self._jiterator.next()
+        raise StopIteration()
+
+def _features(self):
+    return self.iterator()
+
+def __iter(self):
+    return JavaIteratorWraper(self.iterator())
+
+def _getCount(self):
+    return self.getSize()
+
+def __len(self):
+  return self.getSize()
+
+def __call(self):
+    return self
+
+#
+# Inject new methods in the class JDefaultFeatureSelection
+#
+JDefaultFeatureSelection.getCount = _getCount
+JDefaultFeatureSelection.features = _features
+JDefaultFeatureSelection.__iter__ = __iter
+JDefaultFeatureSelection.__len__ = __len
+JDefaultFeatureSelection.__call__ = __call
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/layeraddlistener.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/layeraddlistener.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/layeraddlistener.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = layeraddlistener
+description =
+createdBy =
+version =
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/timeit.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/timeit.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/timeit.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = timeit
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/relpath.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/relpath.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/relpath.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = relpath
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/formpanel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/formpanel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/formpanel.py	(revision 1126)
@@ -0,0 +1,423 @@
+
+import com.jeta.forms.components.panel.FormPanel
+
+import java.lang.Runnable
+import java.io.FileInputStream
+import java.io.File
+import java.awt.event.ActionListener
+import java.awt.event.MouseListener
+import java.awt.event.ItemListener
+import javax.imageio.ImageIO
+import javax.swing.AbstractButton
+import javax.swing.JButton
+import javax.swing.JComboBox
+import javax.swing.JList
+import javax.swing.JRadioButton
+import javax.swing.JSpinner
+import javax.swing.SwingUtilities
+import javax.swing.ImageIcon
+import javax.swing.text.JTextComponent
+import javax.swing.Timer
+import javax.swing.event.ChangeListener
+import javax.swing.event.DocumentListener
+import javax.swing.event.ListSelectionListener
+
+import os
+import os.path
+import threading
+
+import inspect
+
+from gvsig import getResource
+
+from org.gvsig.tools.swing.api import ToolsSwingLocator
+from org.gvsig.tools.task import TaskStatus
+from org.gvsig.tools.observer import Observer
+from org.gvsig.tools import ToolsLocator
+import org.gvsig.tools.swing.api.Component
+
+from com.jeta.open.registry import JETARegistry
+from com.jeta.open.resources import ResourceLoader
+from com.jeta.open.resources import AppResourceLoader
+from org.gvsig.scripting import ScriptingLocator
+from java.net import URL
+from java.net import URLClassLoader
+from jarray import array
+
+
+class FormPanelResourceLoader(AppResourceLoader):
+  def __init__(self, url):
+    AppResourceLoader.__init__(self)
+    classloader = URLClassLoader(array((url,), URL))
+    self.setClassLoader(classloader)
+
+  def loadImage(self, imageName):
+    url = AppResourceLoader.loadImage(self, imageName)
+    return url
+    
+
+class ListenerAdapter(object):
+  def __init__(self,function,componentName=None):
+    self.function = function
+    self.synchronous  = True
+    if componentName == None:
+      self.componentName = self.function.__name__
+    else:
+      self.componentName = componentName
+    x = getattr(function,"im_func",function)
+    x.setSynchronous = self.setSynchronous
+  def setSynchronous(self, value):
+    self.synchronous = value
+  def __call__(self, *args):
+    if self.synchronous:
+      self.function(*args)
+    else:
+      threading.Thread(target=self.function, name=self.componentName, args=args).start()
+
+#----------------
+# Falla invocar a ListenerAdapter.__init__(self,function,componentName)
+# por que dice que self no es un ListenerAdapter.
+# De momento duplico el codigo de ListenerAdapter incrustandolo en esta clase.
+class ActionListenerAdapter_Upss(ListenerAdapter, java.awt.event.ActionListener):
+  def __init__(self,function,componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def actionPerformed(self,*args):
+    #print "ActionListenerAdapter %s %s" % (self.componentName, args[0])
+    self(*args)
+
+class ActionListenerAdapter(java.awt.event.ActionListener):
+  def __init__(self,function,componentName=None):
+    self.function = function
+    self.synchronous  = True
+    if componentName == None:
+      self.componentName = self.function.__name__
+    else:
+      self.componentName = componentName
+    x = getattr(function,"im_func",function)
+    x.setSynchronous = self.setSynchronous
+  def setSynchronous(self, value):
+    self.synchronous = value
+  def __call__(self, *args):
+    if self.synchronous:
+      self.function(*args)
+    else:
+      threading.Thread(target=self.function, name=self.componentName, args=args).start()
+
+  def actionPerformed(self,*args):
+    #print "ActionListenerAdapter %s %s" % (self.componentName, args[0])
+    self(*args)
+
+
+class ChangeListenerAdapter(ListenerAdapter, javax.swing.event.ChangeListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def stateChanged(self,*args):
+    #print "ChangeListenerAdapter %s %s" % (self.componentName, args[0])
+    self(*args)
+
+class DocumentListenerAdapter(ListenerAdapter, javax.swing.event.DocumentListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def insertUpdate(self,*args):
+    #print "DocumentListenerAdapter %s" % self.componentName
+    self.function(*args)
+  def removeUpdate(self,*args):
+    #print "DocumentListenerAdapter %s" % self.componentName
+    self(*args)
+  def changedUpdate(self,*args):
+    #print "DocumentListenerAdapter %s" % self.componentName
+    self(*args)
+
+class ItemListenerAdapter(ListenerAdapter, java.awt.event.ItemListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def itemStateChanged(self,*args):
+    #print "ItemListenerAdapter %s %s" % (self.componentName, args[0])
+    self(*args)
+
+class ListSelectionListenerAdapter(ListenerAdapter, javax.swing.event.ListSelectionListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def valueChanged(self,*args):
+    #print "ListSelectionListenerAdapter %s %s" % (self.componentName, args[0])
+    self(*args)
+
+class FocusGainedListenerAdapter(ListenerAdapter, java.awt.event.FocusListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def focusGained(self,*args):
+    #print "focusGained %s %s" % (self.componentName, args[0])
+    self(*args)
+  def focusLost(self,*args):
+    #print "focusLost %s %s" % (self.componentName, args[0])
+    pass
+
+class FocusLostListenerAdapter(ListenerAdapter, java.awt.event.FocusListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def focusGained(self,*args):
+    pass
+  def focusLost(self,*args):
+    self(*args)
+
+class MouseListenerAdapter(ListenerAdapter, java.awt.event.MouseListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def mouseClicked(self,*args):
+    self(*args)
+  def mouseEntered(self,*args):
+    self(*args)
+  def mouseExited(self,*args):
+    self(*args)
+  def mousePressed(self,*args):
+    self(*args)
+  def mouseReleased(self,*args):
+    self(*args)
+
+class KeyPressedListenerAdapter(ListenerAdapter, java.awt.event.KeyListener):
+  def __init__(self,function, componentName=None):
+    ListenerAdapter.__init__(self,function,componentName)
+  def keyTyped(self,*args):
+    pass
+  def keyPressed(self,*args):
+    try:
+      self(*args)
+    except java.lang.Throwable, t:
+      pass
+  def keyReleased(self,*args):
+    pass
+
+class FunctionRunnable(java.lang.Runnable):
+  def __init__(self,fn, *args):
+    self.__fn = fn
+    self.__args = args
+
+  def run(self):
+    self.__fn(*self.__args)
+
+  def __call__(self):
+    self.__fn(*self.__args)
+
+
+class ProgressBarWithTaskStatus(Observer):
+  def __init__(self, name, progressBar, labelProgress=None):
+    self.taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus(name)
+    self.progressBar = progressBar
+    self.labelProgress = labelProgress
+    self.progressBar.setMinimum(0)
+    self.progressBar.setMaximum(100)
+    self.progressBar.setValue(0)
+    self.taskStatus.addObserver(self)
+
+  def getTaskStatus(self):
+    return self.taskStatus
+
+  def update(self, taskStatus, notification):
+    if not javax.swing.SwingUtilities.isEventDispatchThread():
+      javax.swing.SwingUtilities.invokeLater(
+        FunctionRunnable(
+          self.updateGUI,
+          taskStatus.isRunning(),
+          taskStatus.getCompleted(),
+          taskStatus.getLabel()
+        )
+      )
+    else:
+      self.updateGUI(
+        taskStatus.isRunning(),
+        taskStatus.getCompleted(),
+        taskStatus.getLabel()
+      )
+
+  def updateGUI(self, isRunning, current, label):
+    if not isRunning:
+        self.progressBar.setIndeterminate(False)
+        self.progressBar.setValue(100)
+        self.labelProgress.setText("")
+        return
+    self.progressBar.setIndeterminate(self.taskStatus.isIndeterminate())
+    self.progressBar.setValue(current)
+    if self.labelProgress != None:
+      self.labelProgress.setText(label)
+
+def load_image(afile):
+  if not isinstance(afile,java.io.File):
+    if isinstance(afile,tuple) or isinstance(afile,list):
+      afile = getResource(*afile)
+    afile = java.io.File(str(afile))
+  return javax.imageio.ImageIO.read(afile)
+
+def load_icon(afile):
+  if not isinstance(afile,java.io.File):
+    if isinstance(afile,tuple) or isinstance(afile,list):
+      afile = getResource(*afile)
+    afile = java.io.File(str(afile))
+  return javax.swing.ImageIcon(javax.imageio.ImageIO.read(afile))
+
+class ComboItem(object):
+  def __init__(self, label="", value=None):
+    self.__label = label
+    self.__value = value
+
+  def getLabel(self):
+    return self.__label
+
+  def getValue(self):
+    return self.__value
+
+  __str__ = getLabel
+  __repr__ = getLabel
+
+class FormComponent(object):
+
+  def load_image(self, afile):
+    return load_image(afile)
+
+  def load_icon(self, afile):
+    return load_icon(afile)
+
+  def autobind(self):
+    members = inspect.getmembers(self)
+    for methodName, method in members:
+      if methodName.endswith("_click"):
+        name = methodName[0:-len("_click")]
+        component = getattr(self,name, None)
+        if isinstance(component, javax.swing.JComboBox):
+          component.addActionListener(ActionListenerAdapter(method,methodName))
+        elif isinstance(component, javax.swing.AbstractButton):
+          component.addActionListener(ActionListenerAdapter(method,methodName))
+
+      elif methodName.endswith("_change"):
+        name = methodName[0:-len("_change")]
+        component = getattr(self,name, None)
+        if isinstance(component, javax.swing.JComboBox):
+          component.addItemListener(ItemListenerAdapter(method,methodName))
+        elif isinstance(component, javax.swing.JList):
+          component.addListSelectionListener(ListSelectionListenerAdapter(method,methodName))
+        elif isinstance(component, javax.swing.JRadioButton):
+          component.addItemListener(ItemListenerAdapter(method,methodName))
+        elif isinstance(component, javax.swing.JSpinner):
+          component.addChangeListener(ChangeListenerAdapter(method,methodName))
+        elif isinstance(component, javax.swing.text.JTextComponent):
+          component.getDocument().addDocumentListener(DocumentListenerAdapter(method,methodName))
+        elif isinstance(component, javax.swing.AbstractButton):
+          component.addActionListener(ActionListenerAdapter(method,methodName))
+
+      elif methodName.endswith("_perform"):
+        name = methodName[0:-len("_perform")]
+        component = getattr(self,name, None)
+        if isinstance(component, javax.swing.Timer):
+          component.addActionListener(ActionListenerAdapter(method,methodName))
+
+      elif methodName.endswith("_focusGained"):
+        name = methodName[0:-len("_focusGained")]
+        component = getattr(self,name, None)
+        if component!=None:
+          addFocusListener = getattr(component,"addFocusListener",None)
+          if addFocusListener !=None:
+            addFocusListener(FocusGainedListenerAdapter(method,methodName))
+
+      elif methodName.endswith("_focusLost"):
+        name = methodName[0:-len("_focusLost")]
+        component = getattr(self,name, None)
+        if component!=None:
+          addFocusListener = getattr(component,"addFocusListener",None)
+          if addFocusListener !=None:
+            addFocusListener(FocusLostListenerAdapter(method,methodName))
+
+      elif methodName.endswith("_mouseClick"):
+        name = methodName[0:-len("_mouseClick")]
+        component = getattr(self,name, None)
+        if component!=None:
+          addMouseListener = getattr(component,"addMouseListener",None)
+          if addMouseListener !=None:
+            addMouseListener(MouseListenerAdapter(method,methodName))
+
+      elif methodName.endswith("_keyPressed"):
+        name = methodName[0:-len("_keyPressed")]
+        component = getattr(self,name, None)
+        if component!=None:
+          addKeyListener = getattr(component,"addKeyListener",None)
+          if addKeyListener != None:
+            addKeyListener(KeyPressedListenerAdapter(method,methodName))
+
+
+def fixFormPanelResourceLoader():
+  appResourceLoader = JETARegistry.lookup(ResourceLoader.COMPONENT_ID)
+  if not isinstance(appResourceLoader,FormPanelResourceLoader):
+    # Ojo, si no llamamos a este initialize, la primera vez
+    # que se carga un formulario no carga los recursos
+    from com.jeta.forms.defaults import DefaultInitializer
+    DefaultInitializer.initialize()
+
+    url = ScriptingLocator.getManager().getUserFolder().getFile().toURL()
+    formPanelResourceLoader = FormPanelResourceLoader(url)
+    JETARegistry.rebind(ResourceLoader.COMPONENT_ID, formPanelResourceLoader)
+
+
+class FormPanel(FormComponent):
+
+  def __init__(self,formfile=None):
+    FormComponent.__init__(self)
+    fixFormPanelResourceLoader()
+    self._panel = None
+    if formfile!=None:
+      self.load(formfile)
+
+  def getRootPane(self):
+    return self.asJComponent().getParent().getParent()
+
+  def getPreferredSize(self):
+    return self.asJComponent().getPreferredSize()
+
+  def setPreferredSize(self, withOrDimension, height=None):
+    if height == None:
+      self.asJComponent().setPreferredSize(withOrDimension)
+    else:
+      self.asJComponent().setPreferredSize(java.awt.Dimension(withOrDimension,height))
+
+  def getPanel(self):
+    return self.asJComponent()
+
+  def asJComponent(self):
+    return self._panel
+
+  def hide(self):
+    self._panel.setVisible(False)
+
+  def __getattr__(self, name):
+    if name in ("__members__", "__methods__"):
+      raise AttributeError("FormPanel",name)
+    attr = self._panel.getComponentByName(name)
+    if attr == None:
+      raise AttributeError("FormPanel",name)
+    return attr
+
+  def load(self, formfile):
+    if not isinstance(formfile,java.io.File):
+      if isinstance(formfile,tuple) or isinstance(formfile,list):
+        formfile = getResource(*formfile)
+      formfile = java.io.File(str(formfile))
+    #print "FormPanel.load(%s)" % formfile
+    self._panel = com.jeta.forms.components.panel.FormPanel( java.io.FileInputStream(formfile) )
+    #print "FormPanel.load: _panel=%s" % self._panel
+    self.autobind()
+
+  def btnClose_click(self,*args):
+    self.hide()
+
+  def showWindow(self, title):
+    self._panel.setVisible(True)
+    windowManager = ToolsSwingLocator.getWindowManager()
+    windowManager.showWindow(self.asJComponent(),title, windowManager.MODE.WINDOW)
+
+  def showTool(self, title):
+    self._panel.setVisible(True)
+    windowManager = ToolsSwingLocator.getWindowManager()
+    windowManager.showWindow(self.asJComponent(),title, windowManager.MODE.TOOL)
+
+  def showDialog(self, title):
+    self._panel.setVisible(True)
+    windowManager = ToolsSwingLocator.getWindowManager()
+    windowManager.showWindow(self._panel,title, windowManager.MODE.DIALOG)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/__init__.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/__init__.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/__init__.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = __init__
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/gvpy.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/gvpy.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/gvpy.py	(revision 1126)
@@ -0,0 +1,862 @@
+
+# File: gvpy.py
+# Version: v0.5
+# 2016/02/10
+
+__author__ = """Oscar Martinez Olmos <masquesig@gmail.com>"""
+
+import gvsig
+from gvsig import geom
+import gvsig_raster
+from org.gvsig.app import ApplicationLocator
+from org.gvsig.fmap.dal import DALLocator
+import os.path
+from org.gvsig.andami import PluginsLocator
+from org.gvsig.fmap.mapcontext import MapContextLocator
+import java.awt
+import java.awt.event
+import java.awt.geom
+from java.io import File
+from java.util import ArrayList
+
+from gvsig import uselib
+uselib.use_plugin("org.gvsig.geoprocess.app.mainplugin")
+uselib.use_plugin("org.gvsig.gdal.app.ogr.mainplugin")
+
+from es.unex.sextante.core import Sextante, OutputFactory, AnalysisExtent
+from es.unex.sextante.outputs import FileOutputChannel
+from es.unex.sextante.gui.core import SextanteGUI
+from es.unex.sextante.dataObjects import IRasterLayer
+from es.unex.sextante.parameters import RasterLayerAndBand
+
+from org.gvsig.geoprocess.lib.sextante.dataObjects import FlyrVectIVectorLayer, FLyrRasterIRasterLayer, TableDocumentITable
+from org.gvsig.fmap.mapcontext.layers import FLayer
+from java.awt.geom import RectangularShape, Rectangle2D
+from org.gvsig.fmap.mapcontext.layers.vectorial import FLyrVect
+from org.gvsig.raster.fmap.layers import DefaultFLyrRaster
+from org.gvsig.app.project.documents.view import DefaultViewDocument
+from org.gvsig.fmap.dal import DALLocator
+from org.gvsig.fmap.mapcontext import MapContextLocator
+
+#Constant
+TYPE_POLYGON = 0
+TYPE_LINE = 1
+TYPE_POINT = 2
+
+#With True will appear a lot of extra info about all steps through the process
+DEV_INFO = False
+
+class Geoprocess:
+    def __init__(self):
+      self.__FlyrVectIVectorLayer = None
+      self.__outputFactory = SextanteGUI.getOutputFactory()
+      self.__algorithms = dict()
+      self.__defaultAE = None #default AExtension
+
+      keySetIterator = Sextante.getAlgorithms().keySet().iterator()
+      while(keySetIterator.hasNext()):
+        key = keySetIterator.next()
+        algorithms = Sextante.getAlgorithms().get(str(key))
+        for name in algorithms.keySet():
+          self.__algorithms[str(name)] = algorithms.get(name)
+
+    def __createSextanteLayer(self, layer):
+        """ gvsig layer -> SEXTANTE """
+        slayer = FlyrVectIVectorLayer()
+        slayer.create(layer)
+        return slayer
+
+    def __createSextanteRaster(self, layer):
+        """ gvsig raster -> SEXTANTE """
+        rlayer = FLyrRasterIRasterLayer()
+        rlayer.create(layer)
+        return rlayer
+
+    def __createSextanteTable(self, layer):
+        """ gvsig table -> SEXTANTE """
+        table = TableDocumentITable()
+        table.create(layer)
+        return table
+
+    def getAlgorithms(self):
+        return self.__algorithms
+
+    def __defineParameters_str2value(self, i, param, kwparams):
+        if param.getParameterName() in kwparams:
+            paramValue = kwparams[param.getParameterName()]
+        else:
+            paramValue = kwparams[i]
+
+        #Input params: Tranform STRING to NUMERIC
+        cond1 = (str(param) == "Numerical Value")
+        cond2 = (str(param) == "Selection")
+        isstr = isinstance(paramValue, str)
+        cond4 = (str(param) == "Boolean")
+        cond5 = (str(param) == "Table Field")
+        if "Multi" in (str(param)):
+            cond6 = True
+        else:
+            cond6 = False
+        cond7 = (str(param) == "Point")
+
+        if isstr:
+            if cond1:
+                paramValue = float(paramValue)
+            elif cond2:
+                paramValue = int(paramValue)
+            elif cond4:
+                paramValue = eval(paramValue.capitalize())
+            elif cond5:
+                paramValue = int(paramValue)
+            elif cond6:
+                #  <type 'java.util.ArrayList'>
+                paramValue = list(paramValue)
+            elif cond7: #Point
+                paramValue = paramValue.split(',')
+                x = float(paramValue[0])
+                y = float(paramValue[1])
+                paramValue = java.awt.geom.Point2D.Double(x, y)
+            else: #is str
+                pass
+        else:
+            if cond7: #punto de gvsig. agregar condicion punto
+                x = paramValue.getX()
+                y = paramValue.getY()
+                paramValue = java.awt.geom.Point2D.Double(x, y)
+        if DEV_INFO:
+            print "Param Name: ", param.getParameterName()
+            print "Param: ", param
+            print "Resulta: ", paramValue, type(paramValue)
+        return paramValue
+
+    def __defineParameters_vector2sextante(self, param, paramValue):
+                if isinstance(paramValue, str):
+                    layer = gvsig.currentView().getLayer(paramValue)
+                    paramValue = self.__createSextanteLayer(layer())
+                else:
+                    paramValue = self.__createSextanteLayer(paramValue())
+
+                if DEV_INFO: print "Extent add"
+                if self.__defaultAE == None:
+                    self.__defaultAE = AnalysisExtent(paramValue)
+                else:
+                    self.__defaultAE.addExtent(AnalysisExtent(paramValue))
+                if DEV_INFO: print "PARAM VALUE 1: ", paramValue
+                return paramValue
+
+    def __defineParameters_multi2sextante(self, param, paramValue):
+                if DEV_INFO: print "PARAM VALUE PRE", paramValue
+                paramValue2 = []
+                for i in paramValue:
+                    if isinstance(i, str):
+                        layer = gvsig.currentView().getLayer(i)
+                        if DEV_INFO: print "--------------- lidar: ", layer
+                        i = self.__createSextanteLayer(layer)
+                        ii = self.__createSextanteLayer(layer)
+
+                    else:
+                        if DEV_INFO: print type(i)
+                        if isinstance(i, tuple): #si dentro de la lista viene una tupla identificamos que es un raster y su banda
+                            rlb = RasterLayerAndBand(self.__createSextanteRaster(i[0]),i[1])  #puesta numero de banda
+                            ii = self.__createSextanteRaster(i[0])
+                            i = rlb
+                            if DEV_INFO: print "RASTERLAYERBAND", rlb
+                        else:
+                            if str(type(i)) == "<type 'org.gvsig.raster.fmap.layers.DefaultFLyrRaster'>":
+                                ii = self.__createSextanteRaster(i)
+                                i = self.__createSextanteRaster(i)
+                            else:
+                                ii = self.__createSextanteLayer(i())
+                                i = self.__createSextanteLayer(i())
+                        if DEV_INFO: print "createStextenatnte Layer i :", i
+                        paramValue2.append(i)
+                    if self.__defaultAE == None:
+                            try:
+                                self.__defaultAE = AnalysisExtent(AnalysisExtent(ii))
+                                self.__defaultAE.setCellSize(0.49) ### test
+                                self.__defaultAE.setCellSizeZ(0.49)  ### test
+                                #self.__defaultAE.addExtent( )
+                                if DEV_INFO: print "----------- ini defaultAE"
+                            except:
+                                try:
+                                    self.__defaultAE = AnalysisExtent(ii())
+                                except:
+                                    self.__defaultAE = AnalysisExtent(ii)
+                    elif self.__defaultAE != None:
+                            try:
+                                ae = self.__defaultAE
+                                #ae.addExtent(AnalysisExtent(ii))
+                                if DEV_INFO: print "------------ diferente defaultAE"
+                            except:
+
+                                self.__defaultAE.addExtent(AnalysisExtent(ii()))
+                    """
+                    if self.__defaultAE == None:
+                        try:
+                            self.__defaultAE = AnalysisExtent(i)
+                        except:
+                            print "excepttttttttttttttt", i
+                            ae = i.getRasterLayer()
+                            self.__defaultAE = AnalysisExtent(ae)
+                    else:
+                        try:
+
+                            self.__defaultAE.addExtent(AnalysisExtent(i))
+                        except:
+                            print 'exceptttttttttttttt 222222222"', i
+                            ae = i.getRasterLayer()
+                            print 'ae',ae
+                            self.__defaultAE.addExtent(AnalysisExtent(ae))
+                            #print self.__defaultAE
+                    """
+
+                paramValue = paramValue2
+
+                if DEV_INFO:
+                    print "PARAM VALUE 2: ", paramValue
+                    print "****************** CONDI6: ", paramValue
+                    print "****************** CONDI6: ", ArrayList(paramValue)
+                newParamValue = ArrayList()
+                for i in paramValue:
+                    newParamValue.add(i)
+                paramValue = newParamValue
+                #print "***************** CONDI6: ", paramValue
+                #from es.unex.sextante.parameters import ParameterMultipleInput
+                #pmi = ParameterMultipleInput()
+                #pmi.setParameterValue(paramValue)
+                #paramValue = pmi
+                if DEV_INFO: print "#####################################################################"
+                return paramValue
+
+    def __defineParameters_raster2sextante(self, param, paramValue):
+                if isinstance(paramValue, str):
+                    layer = gvsig.currentView().getLayer(paramValue)
+                    paramValue = self.__createSextanteRaster(layer)
+                else:
+                    paramValue = self.__createSextanteRaster(paramValue)
+
+                if DEV_INFO: print "** extent add+"
+                if self.__defaultAE == None:
+                    self.__defaultAE = AnalysisExtent(paramValue)
+                else:
+                    self.__defaultAE.addExtent(AnalysisExtent(paramValue))
+                return paramValue
+
+    def __defineParameters_table2sextante(self, param, paramValue):
+                if isinstance(paramValue, str):
+                    layer = gvsig.currentProject().getTable(paramValue)
+                    paramValue = self.__createSextanteTable(layer())
+                else:
+                    paramValue = self.__createSextanteTable(paramValue())
+                return paramValue
+
+    def __defineParameters(self, algorithm, kwparams):
+        """ Define input parameters """
+        params = algorithm.getParameters()
+        if DEV_INFO: print self.__defaultAE
+
+        for i in xrange(0,params.getNumberOfParameters()):
+            param = params.getParameter(i)
+            if DEV_INFO: print "****************************************** PARAMETER *******************************************"
+            #print "********************* ", dir(param)
+            #print "********************* ", type(param)
+            #print "********************* ", param.getParameterName()
+            #print "********************* ", param.getParameterDescription()
+            #print "********************* ", param.getParameterTypeName()
+            #print "********************* ", param.getParameterTooltip()
+            #print "********************* ", param.getParameterClass()
+            #print "********************* ", param.getClass()
+            #print "********************* ", param.parameterName
+            #print "********************* ", param.parameterTypeName
+            paramValue = self.__defineParameters_str2value( i, param, kwparams)
+            #print type(paramValue)
+
+            #Vector to SEXTANTE
+            if DEV_INFO: print  "PARAMETER TYPE: ",param.getParameterTypeName()
+            if param.getParameterTypeName() == "Vector Layer":
+                paramValue = self.__defineParameters_vector2sextante(param, paramValue)
+
+            # Multiple input: Vector and Raster
+            elif param.getParameterTypeName() == "Multiple Input": #para vectores y raster
+                paramValue = self.__defineParameters_multi2sextante(param, paramValue)
+            #Raster to SEXTANTE
+            elif param.getParameterTypeName() == "Raster Layer":
+                paramValue = self.__defineParameters_raster2sextante(param, paramValue)
+            #Table to SEXTANTE
+            elif param.getParameterTypeName() == "Table":
+                paramValue = self.__defineParameters_table2sextante(param, paramValue)
+            #Set parameter value
+            #print  "@@@@@@@@@@@@@@@@@@@@@@@@ cluster error: ", paramValue, type(paramValue)
+            #print "@@@@@@@@@@@@@@@@@@@@@@@@ ", type(param)
+
+            param.setParameterValue(paramValue)
+            #print "@@@@@@@@@@@@@@", dir(param)
+
+            #print "@@@@@@@@@@@@@@", param.isParameterValueCorrect()
+            #print "@@@@@@@@@@@@@@ param:", param
+            #print "@@@@@@@@@@@@@@ ", param.getParameterValueAsArrayList()
+
+
+    def __defineExtent(self, algorithm, kwparams):
+        """ Define Analysis Extent """
+        if self.__defaultAE == None:
+            if DEV_INFO: print "-------- cambiar extent"
+            change=True
+        else:
+            if DEV_INFO: print "-------- no cambiar extent"
+            change = False
+            AExtent = self.__defaultAE
+        changeCell = False
+        if 'EXTENT' in kwparams.keys() and algorithm.getUserCanDefineAnalysisExtent() :
+            changeCell = True
+            frame = kwparams['EXTENT']
+            if isinstance(frame, str): frame = gvsig.currentView().getLayer(frame)
+            #print ("|"+str(frame)+"||"+str(type(frame)))
+            if isinstance(frame, str) or isinstance(frame, DefaultViewDocument):
+                AExtent = AnalysisExtent()
+                if DEV_INFO: print "| EXTENT from VIEW"
+                if isinstance(frame, DefaultViewDocument): view = frame
+                else: view = gvsig.currentProject().getView(frame)
+                envelope = view.getMap().getFullEnvelope()
+                xlow = envelope.getLowerCorner().getX()
+                ylow = envelope.getLowerCorner().getY()
+                xup = envelope.getUpperCorner().getX()
+                yup = envelope.getUpperCorner().getY()
+                AExtent.setXRange(xlow, xup, False)
+                AExtent.setYRange(ylow, yup, False)
+                AExtent.setZRange(0, 0, False)
+            elif isinstance(frame, DefaultFLyrRaster):
+                if DEV_INFO: print "| EXTENT from RASTER"
+                layer = self.__createSextanteRaster(frame)
+                AExtent = AnalysisExtent(layer)
+                changeCell = False
+                #AExtent.setZRange(0, 1, True)
+                if DEV_INFO: print AExtent
+            elif isinstance(frame, list):
+                if DEV_INFO: print "| EXTENT from LIST"
+                AExtent = AnalysisExtent()
+                AExtent.setCellSize(0.49)
+                AExtent.setCellSizeZ(0.49)
+                xlow, ylow, zlow, xup, yup, zup  = frame[0], frame[1], frame[2], frame[3], frame[4], frame[5]
+                AExtent.setXRange(xlow, xup, True)
+                AExtent.setYRange(ylow, yup, True)
+                AExtent.setZRange(zlow, zup, True)
+            elif isinstance(frame, FLayer):
+                if DEV_INFO: print "| EXTENT from Layer"
+                layer = self.__createSextanteLayer(frame())
+                AExtent = AnalysisExtent(layer)
+            else:
+                raise Exception("Not Extent Define")
+            algorithm.setAnalysisExtent(AExtent)
+
+        elif change == True:
+            if DEV_INFO: print ("| Not Extent: No input data")
+            AExtent = AnalysisExtent()
+            changeCell = True
+            if self.__defaultAE != None:
+                if DEV_INFO: print "| Extent from Algorithm Layers"
+                AExtent = self.__defaultAE
+            else:
+                try:
+                    if DEV_INFO: print "| Extent from View"
+                    envelope = gvsig.currentView().getMap().getFullEnvelope()
+                except:
+                    raise Exception("None open View")
+
+                if DEV_INFO: print "| Setting AExtent: ",
+                try: #from view
+                    xlow = envelope.getLowerCorner().getX()
+                    ylow = envelope.getLowerCorner().getY()
+                    zlow = 0
+                    xup = envelope.getUpperCorner().getX()
+                    yup = envelope.getUpperCorner().getY()
+                    zup = 0
+                    if DEV_INFO: print "| View: ",
+                    if DEV_INFO: print xlow, ylow, xup,yup
+                except: # default
+                    xlow, ylow, zlow, xup, yup, zup = 0,0,0,100,100,0
+                    if DEV_INFO: print "| Default:", xlow, ylow, xup, yup
+
+                frame = Rectangle2D.Double(xlow, ylow, xup, yup)
+                AExtent.setXRange(xlow, xup, False)
+                AExtent.setYRange(ylow, yup, False)
+                AExtent.setZRange(zlow, zup, False)
+            algorithm.setAnalysisExtent(AExtent)
+
+        #Set: cellsize
+        if 'CELLSIZE' in kwparams.keys():
+            AExtent.setCellSize(kwparams['CELLSIZE'])
+            if DEV_INFO: print "| New Cellsize: ", kwparams['CELLSIZE'], AExtent.getCellSize()
+        elif changeCell == True:
+            AExtent.setCellSize(AExtent.getCellSize())
+            if DEV_INFO: print "| Cellsize: ", AExtent.getCellSize()
+
+        if 'CELLSIZEZ' in kwparams.keys():
+            AExtent.setCellSizeZ(kwparams['CELLSIZEZ'])
+            if DEV_INFO: print "| New Cellsize Z: ", kwparams['CELLSIZEZ'], AExtent.getCellSizeZ()
+        elif changeCell == True:
+            AExtent.setCellSize(AExtent.getCellSizeZ())
+            if DEV_INFO: print "| CellsizeZ: ", AExtent.getCellSizeZ()
+
+        if DEV_INFO: print "end extent: ", AExtent
+        #AExtent.setZRange(0.0, 0.0, True)
+        algorithm.setAnalysisExtent(AExtent)
+        if DEV_INFO: print ("| Set Extent")
+
+    def __defineOutput(self, algorithm, kwparams):
+      if 'PATH' in kwparams.keys():
+          path = kwparams['PATH']
+          checkFilesExist(path)
+          outputSet = algorithm.getOutputObjects()
+          if outputSet.getOutputDataObjectsCount() == 1:
+              out1 = outputSet.getOutput(0)
+              out1.setOutputChannel(FileOutputChannel("New_name"))
+              out1channel = out1.getOutputChannel()
+              if isinstance(path, str):
+                  out1channel.setFilename(path)
+              elif isinstance(path, list):
+                  out1channel.setFilename(path[0])
+              else:
+                  raise Exception("No valid path")
+              if DEV_INFO: print "| PATH: Good path"
+
+          elif outputSet.getOutputDataObjectsCount() > 1 and isinstance(path, list):
+              for n in xrange(0, outputSet.getOutputDataObjectsCount()):
+                  out1 = outputSet.getOutput(n)
+                  out1.setOutputChannel(FileOutputChannel("New_name"))
+                  out1channel = out1.getOutputChannel()
+                  out1channel.setFilename(path[n])
+                  if DEV_INFO: print "| PATH: Good path"
+          else:
+              raise Exception("Bad path")
+      elif algorithm.getOutputObjects().getOutputObjectsCount()==0:
+          if DEV_INFO: print "| Without output layers"
+      elif algorithm.getOutputObjects().getOutput(0).getOutputChannel():
+          output0 = algorithm.getOutputObjects().getOutput(0)
+          out0 = output0.getOutputChannel()
+          out0.setFilename(None)
+          if DEV_INFO: print "| PATH: Without path"
+
+    def __executeAlgorithm(self, algorithm):
+      """Execute Algorithm"""
+      #Check algorithm
+      correctValues = algorithm.hasCorrectParameterValues()
+      if DEV_INFO: print "| Parameter values:", correctValues
+      if not correctValues: raise Exception("Not correct values")
+      try:
+          if DEV_INFO: print "| Pre-algorithm:", list(algorithm.algorithmAsCommandLineSentences)
+      except:
+          if DEV_INFO: print "| Not - algorithm"
+
+      algorithm.execute( None, self.__outputFactory)
+      print "| Algorithm:", list(algorithm.algorithmAsCommandLineSentences)
+
+    def __getOutputObjects(self, algorithm):
+      """Take outputObjets of the algorithm"""
+      oos = algorithm.getOutputObjects()
+      ret = dict()
+      for i in xrange(0, oos.getOutputObjectsCount()):
+        oo = oos.getOutput(i)
+        value = oo.getOutputObject()
+        if isinstance(value, FlyrVectIVectorLayer):
+            if DEV_INFO: print "| Vector"
+            store = value.getFeatureStore()
+            layer = MapContextLocator.getMapContextManager().createLayer(value.getName(),store)
+            store.dispose()
+            ret[value.getName()] = layer
+            layer.dispose()
+        elif isinstance(value, IRasterLayer):
+            if DEV_INFO: print "| Raster layer"
+            value.postProcess()
+            dalManager = DALLocator.getDataManager()
+            mapContextManager = MapContextLocator.getMapContextManager()
+            params = dalManager.createStoreParameters("Gdal Store")
+            namefile = File(value.getFilename())
+            params.setFile(namefile)
+            dataStore = dalManager.createStore(params)
+            layer = mapContextManager.createLayer(value.getName(), dataStore)
+            ret[value.getName()] = layer
+        else:
+            try:
+                ret[value.getName()] = value
+            except:
+                if not value == None:
+                    x = 0
+                    while True:
+                        field = "value_" + str(x)
+                        if any(field in s for s in ret.keys()):
+                            x += 1
+                        ret[str(x)] = value
+                        break
+      return ret
+
+
+    def __applyOutputLoadParameters(self, layer, kwparams):
+
+        # Filtro
+        if "OUTPUT_FILTER" in kwparams:
+            if kwparams["OUTPUT_FILTER"] in layer.getName():
+                pass
+            else:
+                print "|| Params filter: ", kwparams["OUTPUT_FILTER"], " goes out"
+                return None
+
+        # Name of the output layer
+        if "NAME" in kwparams:
+            layer.setName((kwparams["NAME"]).decode("UTF-8"))
+        elif "TOCNAME" in kwparams:
+            layer.setName((kwparams["TOCNAME"]).decode("UTF-8"))
+        else:
+            layer.setName(layer.getName())
+
+        # Add layer or not
+        if "ADDLAYER" in kwparams:
+            if kwparams["ADDLAYER"]==True:
+                addlayer = True
+            elif kwparams["ADDLAYER"]==False:
+                addlayer = False
+        else:
+            addlayer = True #Default for add results
+
+        # Where to add it
+        if "OUTPUT_VIEW" in kwparams:
+            outputview = (kwparams["OUTPUT_VIEW"]).decode("UTF-8")
+            if isinstance(outputview, str):
+                view = currentProject().getView(outputview)
+            else:
+                view = outputview
+        else:
+            view = gvsig.currentView()
+
+        # Active
+        if "VISIBLE" in kwparams:
+            visible = kwparams["VISIBLE"]
+        else:
+            visible = True
+
+        if addlayer==True:
+            view.addLayer(layer)
+        return layer
+
+    def __applyOutputLoadParametersVectorial(self, layer, kwparams):
+
+        # Filtro
+        if "OUTPUT_FILTER" in kwparams:
+            if kwparams["OUTPUT_FILTER"] in layer.getName():
+                pass
+            else:
+                print "|| Params filter: ", kwparams["OUTPUT_FILTER"], " goes out"
+                return
+
+
+        # Add layer or not
+        if "ADDLAYER" in kwparams:
+            if kwparams["ADDLAYER"]==True:
+                addlayer = True
+            elif kwparams["ADDLAYER"]==False:
+                addlayer = False
+        else:
+            addlayer = True #Default for add results
+
+        # Where to add it
+        if "OUTPUT_VIEW" in kwparams:
+            outputview = (kwparams["OUTPUT_VIEW"]).decode("UTF-8")
+            if isinstance(outputview, str):
+                view = currentProject().getView(outputview)
+            else:
+                view = outputview
+        else:
+            view = gvsig.currentView()
+
+        # Active
+        if "VISIBLE" in kwparams:
+            visible = kwparams["VISIBLE"]
+        else:
+            visible = True
+
+        parameters = {}
+        shpFile = layer.getFeatureStore().getFullName()
+        parametersshp = layer.getFeatureStore().getParameters()
+        parameters["CRS"] = gvsig.currentView().getProjectionCode()
+        parameters["shpFile"]= shpFile #parametersshp.getSHPFileName()
+        layer = gvsig.loadLayer("Shape", **parameters)
+
+        #layer = loadLayer(layer.getFeatureStore().getFullName())
+        if addlayer==True:
+            # Name of the output layer
+            if "NAME" in kwparams:
+                layer.setName((kwparams["NAME"]).decode("UTF-8"))
+            elif "TOCNAME" in kwparams:
+                layer.setName((kwparams["TOCNAME"]).decode("UTF-8"))
+            else:
+                layer.setName(layer.getName())
+            view.addLayer(layer)
+        return layer
+
+    def __returnOutputObjects(self, r, kwparams):
+        if r == None: return
+        outList = []
+        print "| Output layers: "
+        for value in r.values():
+            if isinstance(value, unicode):
+                outList.append(value.encode("UTF-8"))
+                continue
+            elif isinstance(value, FLyrVect):
+                """
+
+                parameters = {}
+
+                parametersshp = value.getFeatureStore().getParameters()
+                try:
+                    parameters["CRS"] = parametersshp.getCRS()
+                except:
+                    parameters["CRS"] = gvsig.currentView().getProjectionCode()
+                shpFile = value.getFeatureStore().getFullName()
+                parameters["shpFile"]= shpFile
+                layer = gvsig.loadLayer("Shape", **parameters)
+
+                """
+
+                print "|\t Value:", value.getName().encode("UTF-8")
+                path = value.getDataStore().getFullName()
+                print "|\t\tPath: ", path
+
+                resultLyr = self.__applyOutputLoadParametersVectorial(value, kwparams)
+
+                if resultLyr!=None:
+                    outList.append(resultLyr)
+
+            elif isinstance(value, FLayer):
+                print "|\t Value:", value.getName()
+                print "|\t\t", value.getFile()
+                value = self.__applyOutputLoadParameters(value, kwparams)
+                if value!=None:
+                    outList.append(value)
+            else:
+                print "|\t Non-type \tValue: ", value
+                outList.append(value)
+                continue
+
+        #Return object or list
+        print "\n"
+        print "OUTLIST: ", outList
+        if len(outList) > 1: return outList
+        elif len(outList) == 1: return outList[0]
+        else: return None
+
+
+    def execute(self, algorithmId, kwparams):
+      """ Execute algorithm """
+      print "| Algoritmo: ", algorithmId
+
+      algorithm = self.getAlgorithms()[algorithmId]
+      #print algorithm.getAlgorithmAsCommandLineSentences()
+
+      #Input params
+      self.__defineParameters(algorithm, kwparams)
+
+      #Analisys Extension
+      self.__defineExtent(algorithm, kwparams)
+
+      #Output files
+      self.__defineOutput(algorithm, kwparams)
+
+      #Exec algorithm
+      self.__executeAlgorithm(algorithm)
+
+      #Output objects
+      ret = self.__getOutputObjects(algorithm)
+      r = self.__returnOutputObjects(ret, kwparams)
+
+      return r
+
+def runalg(algorithmId,*params, **kwparams):
+    for i in range(0,len(params)):
+      kwparams[i]=params[i]
+
+    geoprocess = Geoprocess()
+    r = geoprocess.execute(algorithmId, kwparams)
+    del(geoprocess)
+    return r
+
+def algHelp(geoalgorithmId):
+    geoprocess = Geoprocess()
+    for algorithmId, algorithm in geoprocess.getAlgorithms().items():
+        if algorithmId.encode('UTF-8') == geoalgorithmId.encode('UTF-8') or geoalgorithmId == "All":
+            pass
+        else:
+            continue
+        print "* Algorithm help: ", algorithm.getName().encode('UTF-8')
+        print "*", algorithm.commandLineHelp.encode('UTF-8')
+    del(geoprocess)
+
+def algSearch(strSearch):
+    print "\nInicio de busqueda.."
+    geoprocess = Geoprocess()
+    search = strSearch.lower().encode('ASCII','ignore')
+    for algorithmId, algorithm in geoprocess.getAlgorithms().items():
+        name = (algorithm.getName()).lower().encode('ASCII','ignore')
+        group = (algorithm.getGroup()).lower().encode('ASCII','ignore')
+        con1 = str(name).find(search) >= 0
+        con2 = str(group).find(search) >= 0
+        con3 = algorithmId.encode('ASCII').find(search) >= 0
+        if con1 or con2 or con3:
+            if con1 or con2:
+                print "ID: ", algorithmId, " || GROUP: ", algorithm.getGroup().encode('UTF-8'), " || NAME: ", algorithm.getName().encode('UTF-8')
+            else:
+                print "*", algorithm.commandLineHelp.encode('UTF-8')
+    print "..Busqueda finalizada\n"
+    del(geoprocess)
+
+def getProjectLayer(view,layer):
+    """Get vector layer or raster"""
+
+    try:
+        if isinstance(view, str): view = gvsig.currentProject().getView(view)
+        if isinstance(layer, str):
+            return view.getLayer(layer)
+        else:
+            return layer
+    except: #Bug: Raster problem with getLayer
+        for i in gvsig.currentProject().getView(view).getLayers():
+            if i.name == layer: return i
+
+def getProjectTable(table):
+    """Get table"""
+    return gvsig.currentProject().getTable(table)
+
+def checkFilesExist(files):
+    """Path or Paths of files"""
+    #raise a exception
+
+    if isinstance(files, str):
+        if os.path.isfile(files): raise Exception("File already exist" + files)
+    elif isinstance(files, list):
+        for fname in files:
+            if os.path.isfile(fname): raise Exception("File already exist" + fname)
+
+
+###
+### MODEL TO SCRIPT
+###
+
+
+def model2script(pathXML, pathFile):
+    #eliminar la ultima linea
+    #pathXML = commonsdialog.openFileDialog("Selecciona archivo", 'C:/gsoc/')
+    #pathXML = str(pathXML[0])
+    #pathXML = 'C:/gsoc/test02.model'
+    #pathFILE = 'C:/gsoc/script0002.py'
+    import os.path
+    if os.path.isfile(pathXML)==True:
+        pass
+    else:
+        print "No valid model file path"
+        return
+    fileFile = open(pathXML, 'r')
+    document = fileFile.read()
+    import xml.dom.minidom
+    root = xml.dom.minidom.parseString(document)
+    #root
+    inputObject = {}
+    inputObjectParams = {}
+    dataObject = {}
+    algorithms = {}
+    tab = "    "
+    gvpyFile = open(pathFile, "w")
+    #Cargamos los parametros
+    print "\nData object"
+    for child in root.getElementsByTagName("data_object"):
+        #data_object - Parametros
+        if "INNER" in child.getAttribute("key"):
+            inputObjectParams[child.getAttribute("key")] = child.getAttribute("value")
+        #data_object - result of algorithms
+        else:
+            inputObject[child.getAttribute("key")]=[child.getAttribute("value"), child.getAttribute("description").encode("UTF-8")]
+
+    print "\n Attribute"
+    for child in root.getElementsByTagName("input"):
+        for i in child.getElementsByTagName("attribute"):
+                if i.getAttribute("name")=="default": dataObject[child.getAttribute("name")] = i.getAttribute("value")
+
+    print "\n Algorithm"
+    order = 1
+    for child in reversed(root.getElementsByTagName("algorithm")):
+        print "Algoritmo: ", child
+        keyAlgorithm = child.getAttribute("key")
+        algorithmParams = {}
+        algorithmParams["alg_cmd_line_name"]=child.getAttribute("alg_cmd_line_name")
+        for i in child.getElementsByTagName("assignment"):
+            algorithmParams[i.getAttribute("key")] = i.getAttribute("assigned_to")
+        algorithmParams["result_of_algorithm"] = keyAlgorithm
+        algorithms[order] = algorithmParams
+        order +=1
+
+    print "\n\n******* RESULTADO *******"
+    print "inputObject: ", inputObject
+    print "inputObjectParams: ", inputObjectParams
+    print "algorithms: ", algorithms
+    print "data object: ", dataObject
+
+    #Writing script .py
+    print "\nTransform to gvpy"
+    for i in root.getElementsByTagName("model"):
+        modelName = i.getAttribute("name")
+    gvpyFile.write("# Modelo de SEXTANTE: " + modelName)
+    gvpyFile.write(
+"""
+import gvsig
+from gvsig.libs import gvpy
+from gvsig import geom
+import gvsig_raster
+
+def main(*args):
+""")
+
+    print "gvpy - data_object"
+    listInputObject = []
+    for n in reversed(inputObject.keys()):
+        listInputObject.append([n,inputObject[n][1]])
+
+    print "gvpy - inputObjectParams"
+    for n in (inputObjectParams.keys()):
+        gvpyFile.write( tab + n + ' = "' + inputObjectParams[n] + '"\n' )
+
+    print "gvpy - vars"
+    for n in (dataObject.keys()):
+        gvpyFile.write( tab + n +' = "' + dataObject[n] + '"\n\n' )
+
+
+    print "gvpy - algorithms"
+    #inputObject list of result algorithms names
+    for n in reversed(sorted(algorithms.keys())): #reversed(algorithms.keys()):
+        gvpy= ""
+        alg = algorithms[n]
+        #prefijo: buscar en los data_object el nombre que debe de llevar la capa resultado
+        for i in listInputObject:
+            if alg["result_of_algorithm"] in i[0]:
+                prefix = i[0]
+                description = i[1]
+        #Escribimos el codigo del algoritmo
+        gvpyFile.write( tab + '# '+ description + '\n')
+        gvpy += prefix + '= gvpy.runalg("'+alg["alg_cmd_line_name"]+'"'
+        for i in alg:
+            if i == "alg_cmd_line_name" or i == "result_of_algorithm": continue
+            gvpy += ', '+i+'='+ alg[i] + ''
+        gvpy += ')'
+        gvpyFile.write( tab + gvpy + "\n\n" )
+
+    gvpyFile.close()
+
+def main(*args):
+    checkFilesExist("C:/gvsig/ran10.shp")
+    r = runalg("generaterandomnormal", EXTENT = [0,0,0,500,500,0], MEAN =0.5, STDDEV = 0.5, ADDLAYER=False)
+    #runalg("cluster" , INPUT=[(layer1, 0),(layer2,0)] , NUMCLASS=3)#, CELLSIZE=layer1.getCellSize(), CELLSIZEZ=1)#,EXTENT=layer1)
+    #runalg("mergegrids", [layer1, layer2], "0")
+    #v1 = runalg("randomvector",10, TYPE_POINT, EXTENT=[0,0,0,500,500,0], NAME="Random vector")
+
+    #r = runalg("generaterandomnormal", EXTENT = [0,0,0,500,500,0], MEAN =0.5, STDDEV = 0.5)
+
+    pass
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/toolbox.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/toolbox.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/toolbox.py	(revision 1126)
@@ -0,0 +1,123 @@
+#
+# ==========================================================
+#
+# Declara la clase ToolboxProcess y declara una serie de
+# constantes de utilidad para ser usadas en la creacion
+# de geoprocesos.
+# La clase ToolboxProcess esta pensada para ser usada como
+# clase base para crear procesos desde scripting con python.
+#
+#
+from gvsig.uselib import use_plugin
+
+use_plugin("org.gvsig.geoprocess.app.mainplugin")
+
+from org.gvsig.geoprocess.lib.sextante import AbstractSextanteGeoProcess
+from es.unex.sextante.outputs import OutputVectorLayer
+from es.unex.sextante.dataObjects import IVectorLayer
+from es.unex.sextante.additionalInfo import AdditionalInfoNumericalValue
+from org.gvsig.geoprocess.lib.api import GeoProcessLocator
+from es.unex.sextante.gui.core import SextanteGUI
+from org.gvsig.tools.dispose import DisposeUtils
+from  es.unex.sextante.core import Sextante
+
+
+SHAPE_TYPE_POINT = IVectorLayer.SHAPE_TYPE_POINT
+SHAPE_TYPE_LINE = IVectorLayer.SHAPE_TYPE_LINE
+SHAPE_TYPE_POLYGON = IVectorLayer.SHAPE_TYPE_POLYGON
+SHAPE_TYPE_MIXED = IVectorLayer.SHAPE_TYPE_MIXED
+SHAPE_TYPE_MULTIPOINT = IVectorLayer.SHAPE_TYPE_MULTIPOINT
+SHAPE_TYPE_MULTILINE = IVectorLayer.SHAPE_TYPE_MULTILINE
+SHAPE_TYPE_MULTIPOLYGON = IVectorLayer.SHAPE_TYPE_MULTIPOLYGON
+SHAPE_TYPE_WRONG = IVectorLayer.SHAPE_TYPE_WRONG
+SHAPE_TYPE_UNDEFINED = SHAPE_TYPE_WRONG
+
+NUMERICAL_VALUE_INTEGER = AdditionalInfoNumericalValue.NUMERICAL_VALUE_INTEGER
+NUMERICAL_VALUE_DOUBLE = AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE
+
+class ToolboxProcess(AbstractSextanteGeoProcess):
+
+  def __init__(self):
+    self.__maxrange = 0
+    self.__countrange = 0
+
+  def getCommandLineName(self):
+    """
+Este metodo debe ser sobreescrito en Jython para que funcione correctamente el geoproceso.
+No se debe sobreescribir en nuestro geoproceso.
+    """
+    return self.__class__.__name__
+
+  def getNewInstance(self):
+    """
+Este metodo debe ser sobreescrito en Jython para que funcione correctamente el geoproceso.
+No se debe sobreescribir en nuestro geoproceso.
+    """
+    alg = self.__class__()
+    alg.setName(self.getName())
+    alg.setGroup(self.getGroup())
+
+    alg.setParameters(self.getParameters().getNewInstance())
+    alg.setOutputObjects(self.getOutputObjects().getNewInstance())
+    return alg;
+
+  def setRangeOfValues(self,start,end):
+    """
+Metodo que debe ser invocado para fijar los limites de la iteracion del geoproceso.
+Se encarga de actualizar las barras de progreso asociadas a nuestros geoprocesos.
+    """
+    self.__maxrange = end
+    self.__countrange = 0
+    self.getStatus().setRangeOfValues(1,end)
+    self.setProgress(0, end)
+
+  def next(self):
+    """
+Incrementa el progreso de nuestro proceso.
+    """
+    self.__countrange+=1
+    self.setCurValue(self.__countrange)
+
+  def isCanceled(self):
+    """
+Nos informa si el usuario a cancelado el proceso.
+    """
+    return self.getTaskMonitor().isCanceled()
+
+  def setCurValue(self,current):
+    """
+Fija el progreso de nuestro proceso en el valor indicado como parametro.
+    """
+    self.getStatus().setCurValue(current)
+    self.setProgress(current, self.__maxrange);
+
+  def createNewFeature(self, store, feature=None):
+    """
+Crea una nueva feature o entidad asociada al almacen (store) pasado como parametro.
+Esta nueva feature podra ser insertada en el almancen inficado como parametro.
+Si se ha indicado como parametro una feature, se copiaran los datos de esta sobre la nueva.
+    """
+    newfeature = store.createNewFeature()
+    if feature!=None:
+      for field in newfeature.getType().iterator():
+        try:
+          value = feature.get(field.getName())
+          newfeature.set(field.getName(), value)
+        except:
+          # Ignoramos errores ya que es facil que hayan campo que no existen en una u otra
+          # feature o que no son del mismo tipo.
+          pass
+    return newfeature
+
+  def selfregister(self, groupname):
+    """
+Registra el geoproceso en la lista de geoprocesos disponibles.
+    """
+    Sextante.addGeoalgorithm(groupname,self.__class__())
+
+  def updateToolbox(self):
+    """
+Fuerza que se actualize el interface de usuario de la Toolbox.
+    """
+    SextanteGUI.getGUIFactory().updateToolbox()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/applicationtoolbar.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/applicationtoolbar.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/applicationtoolbar.py	(revision 1126)
@@ -0,0 +1,51 @@
+
+def __createAction(scriptName, label=None, iconName=None, tooltip=None, position= 2009009009):
+  from org.gvsig.andami import PluginsLocator
+  from org.gvsig.scripting.app.extension import ScriptingExtension
+  from javax.imageio import ImageIO
+  from org.gvsig.tools.swing.api import ToolsSwingLocator
+  from java.io import File
+  from org.apache.commons.io import FilenameUtils
+  from javax.swing import ImageIcon
+  
+  if label == None:
+    label = scriptName
+  if iconName == None:
+    iconName = "tools-scripting-launcher"
+  if tooltip == None:
+    tooltip = label
+  if isinstance(iconName,File):
+    iconFile = iconName
+    iconName = FilenameUtils.getBaseName(iconFile.getName())
+    iconImage = ImageIcon(ImageIO.read(iconFile))
+    iconTheme = ToolsSwingLocator.getIconThemeManager().getDefault()
+    iconTheme.registerDefault("scripting", "scripting", iconName, iconImage, None)
+    
+  actionManager = PluginsLocator.getActionInfoManager()
+  actionName = "script-%s" % scriptName
+  action = actionManager.createAction(
+    ScriptingExtension, 
+    actionName, 
+    label, 
+    scriptName, 
+    iconName, 
+    None, 
+    position, 
+    tooltip
+  )
+  action = actionManager.registerAction(action)
+  return action
+
+def toolbar_add(scriptName, label=None, iconName=None, tooltip=None, position=2009009009):
+  application = ApplicationLocator.getManager()
+  action = __createAction(scriptName, label, iconName, tooltip, position)
+  application.addTool(action, "scripting")
+  application.message("added script '%s' to toolbar" % scriptName,1)
+
+def menus_add(scriptName, label=None, menuEntry=None, iconName=None, tooltip=None, position= 2009009009):
+  application = ApplicationLocator.getManager()
+  action = __createAction(scriptName, label, iconName, tooltip, position)
+  if menuEntry == None:
+    menuEntry = "tools/Scripting/%s" % action.getLabel()
+  application.addMenu(action, menuEntry)
+  application.message("added script '%s' to menu '%s'" % (scriptName,menuEntry),1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/load_project.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/load_project.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/load_project.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = load_project
+description =
+createdBy =
+version =
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[script]
+enable = true
+
+[Unit]
+type = Script
+name = browserpanel
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.xml	(revision 1126)
@@ -0,0 +1,858 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/gvSIG/plugins/org.gvsig.scripting.app.mainplugin/scripts/addons/ScriptingComposerTools/javadocviewer/webbrowserpanel/browserpanel.xml</at>
+   <at name="path">addons/ScriptingComposerTools/javadocviewer/webbrowserpanel/browserpanel.xml</at>
+   <at name="rowspecs">CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE</at>
+   <at name="colspecs">FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">8</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtURL</at>
+            <at name="width">843</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">9</at>
+           <at name="rowspan">1</at>
+           <at name="halign">fill</at>
+           <at name="valign">fill</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JPanel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JPanel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="name">containerBrowser</at>
+            <at name="width">935</at>
+            <at name="height">466</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.FormMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">9</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+        </super>
+        <at name="id">embedded.1838006420</at>
+        <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+        <at name="colspecs">FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:MIN(12DLU;DEFAULT):GROW(0.3),FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(0.7)</at>
+        <at name="components">
+         <object classname="java.util.LinkedList">
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">3</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JTextField</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JTextField</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="name">txtSearch</at>
+                 <at name="width">259</at>
+                 <at name="height">20</at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">9</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">fill</at>
+                <at name="valign">fill</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.LineBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                        <at name="thickness">1</at>
+                        <at name="color">
+                         <object classname="com.jeta.forms.store.properties.ColorProperty">
+                          <at name="name">dyncolor</at>
+                          <at name="colorkey">Button.shadow</at>
+                         </object>
+                        </at>
+                        <at name="curved">false</at>
+                       </object>
+                      </at>
+                     </item>
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="name">lblStatus</at>
+                 <at name="width">587</at>
+                 <at name="fill">
+                  <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                   <at name="name">fill</at>
+                  </object>
+                 </at>
+                 <at name="height">20</at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.image.ImageComponent</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.image.ImageComponent</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="name">imgSearch</at>
+                 <at name="width">16</at>
+                 <at name="height">16</at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">5</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.EmptyBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                        <at name="top">0</at>
+                        <at name="left">0</at>
+                        <at name="bottom">0</at>
+                        <at name="right">0</at>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="name">btnSearchNext</at>
+                 <at name="width">12</at>
+                 <at name="height">12</at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">7</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.EmptyBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                        <at name="top">0</at>
+                        <at name="left">0</at>
+                        <at name="bottom">0</at>
+                        <at name="right">0</at>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="name">btnSearchPrevious</at>
+                 <at name="width">12</at>
+                 <at name="height">12</at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+         </object>
+        </at>
+        <at name="properties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.gui.form.GridView</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList"/>
+              </at>
+             </object>
+            </at>
+            <at name="name"/>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">21</at>
+              <at name="horizontalpolicy">31</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="cellpainters">
+         <object classname="com.jeta.forms.store.support.Matrix">
+          <at name="rows">
+           <object classname="[Ljava.lang.Object;" size="1">
+            <at name="item" index="0">
+             <object classname="[Ljava.lang.Object;" size="9"/>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="rowgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+        <at name="colgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">fill</at>
+           <at name="valign">fill</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.EmptyBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="top">0</at>
+                   <at name="left">0</at>
+                   <at name="bottom">0</at>
+                   <at name="right">0</at>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">btnPrevious</at>
+            <at name="width">12</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">fill</at>
+           <at name="valign">fill</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.EmptyBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="top">0</at>
+                   <at name="left">0</at>
+                   <at name="bottom">0</at>
+                   <at name="right">0</at>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">btnNext</at>
+            <at name="width">12</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">6</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">fill</at>
+           <at name="valign">fill</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.EmptyBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="top">0</at>
+                   <at name="left">0</at>
+                   <at name="bottom">0</at>
+                   <at name="right">0</at>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">btnRefresh</at>
+            <at name="width">12</at>
+            <at name="enabled">false</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">10</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">fill</at>
+           <at name="valign">fill</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.EmptyBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="top">0</at>
+                   <at name="left">0</at>
+                   <at name="bottom">0</at>
+                   <at name="right">0</at>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">btnConfig</at>
+            <at name="width">12</at>
+            <at name="enabled">false</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"/>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="7">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="11"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="11"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="11"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="11"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="11"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="11"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="11"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_right.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_right.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/add.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/add.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_refresh.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_refresh.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_up.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_up.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_down.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_down.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_left.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/arrow_left.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/search.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/images/search.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/__init__.py	(revision 1126)
@@ -0,0 +1,3 @@
+# encoding: utf-8
+
+from gvsig.libs.webbroser.browserpanel import BrowserPanel
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/webbrowser.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/webbrowser.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/webbrowser.py	(revision 1126)
@@ -0,0 +1,9 @@
+# encoding: utf-8
+
+from gvsig.libs.webbroser.browserpanel import BrowserPanel
+
+def main(*args):
+  browser = BrowserPanel()
+  browser.showWindow("Browser", scriptEditor=False)
+  if len(args)>0:
+    browser.setPage(args[0])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/__init__.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/__init__.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/__init__.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[script]
+enable = true
+
+[Unit]
+type = Script
+name = __init__
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/webbrowser/browserpanel.py	(revision 1126)
@@ -0,0 +1,243 @@
+# encoding: utf-8
+
+import gvsig
+from gvsig import getResource
+from gvsig.libs.formpanel import FormPanel, load_icon
+
+from time import sleep
+
+from org.gvsig.tools.swing.api import Component
+
+from java.lang import Throwable
+
+import java.lang.Runnable
+from java.awt import BorderLayout
+from javax.swing import JEditorPane
+from javax.swing import JScrollPane
+from javax.swing.event import HyperlinkEvent
+from javax.swing.event import HyperlinkListener
+
+from org.gvsig.scripting.swing.api import ScriptingSwingLocator
+
+
+
+
+class DefaultHyperlinkHandler(HyperlinkListener):
+  def __init__(self, browser):
+    self.__browser = browser
+
+  def hyperlinkUpdate(self, hyperlinkEvent):
+    if hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED :
+      self.__browser.setPage(str(hyperlinkEvent.getURL()))
+
+class BrowserPanel(FormPanel,Component):
+  def __init__(self):
+    FormPanel.__init__(self,getResource(__file__,"browserpanel.xml"))
+    self.__browser = None
+    self.initComponents()
+
+  def __initCSSBox(self):
+    from org.fit.cssbox.swingbox import BrowserPane
+    from org.fit.cssbox.swingbox.util import DefaultHyperlinkHandler
+    self.__browser = BrowserPane()
+    self.__browser.addHyperlinkListener(DefaultHyperlinkHandler())
+    self.containerBrowser.add(JScrollPane(self.__browser),BorderLayout.CENTER)
+
+  def __initJEditorPane(self):
+    self.__browser = JEditorPane()
+    self.__browser.setEditable(False)
+    self.__browser.addHyperlinkListener(DefaultHyperlinkHandler(self))
+    self.containerBrowser.add(JScrollPane(self.__browser),BorderLayout.CENTER)
+
+  def __initJFXBrowser(self):
+    from javafx.embed.swing import JFXPanel
+    import javafx.beans.value.ChangeListener
+    import javafx.event.EventHandler
+
+
+    class Runnable(java.lang.Runnable):
+      def __init__(self,fn, *args):
+        self.__fn = fn
+        self.__args = args
+
+      def run(self):
+        self.__fn(*self.__args)
+
+      def __call__(self):
+        self.__fn(*self.__args)
+
+    class MyEventHandler(javafx.event.EventHandler):
+      def __init__(self, jfxbrowser):
+        self.jfxbrowser = jfxbrowser
+
+      def handle(self,event):
+        #print "handle: ", repr(event.getEventType()), repr(event.getData())
+        if event.getEventType() == event.STATUS_CHANGED:
+          s = event.getData()
+          if s==None:
+            self.jfxbrowser.status.setText("")
+          else:
+            self.jfxbrowser.status.setText(s)
+
+    class MyChangeListener(javafx.beans.value.ChangeListener):
+      def __init__(self, jfxbrowser):
+        self.jfxbrowser = jfxbrowser
+
+      def changed(self, ov, oldState, newState):
+        if newState == newState.SUCCEEDED:
+          self.jfxbrowser.location.setText(self.jfxbrowser.engine.getLocation())
+
+    class JFXBrowser(JFXPanel):
+      def __init__(self, status, location):
+        from javafx.application import Platform
+        self.status = status
+        self.location = location
+        self.view = None
+        self.engine = None
+        self.scene = None
+        self.__runLater = Platform.runLater
+
+        self.__runLater(Runnable(self.__createScene))
+        Platform.setImplicitExit(False)
+        #sleep(1)
+
+      def __createScene(self):
+        from javafx.scene.web import WebView
+        from javafx.scene import Scene
+
+        self.view = WebView()
+        self.engine = self.view.getEngine()
+        self.engine.setOnStatusChanged(MyEventHandler(self))
+        self.engine.getLoadWorker().stateProperty().addListener(MyChangeListener(self))
+        self.engine.setJavaScriptEnabled(True)
+        self.scene = Scene(self.view)
+        self.setScene(self.scene)
+
+      def __load(self, url):
+        #print url.__class__.__name__, repr(str(url))
+        self.engine.load(str(url))
+        self.revalidate()
+
+      def __loadContent(self, content, contentType="text/html"):
+        self.engine.loadContent(str(content),contentType)
+        self.revalidate()
+
+      def __goHistory(self, index):
+        self.engine.getHistory().go(index)
+
+      def call(self,method, *args):
+        self.__runLater(Runnable(method,*args))
+
+      def setPage(self,url):
+        self.call(self.__load,url)
+
+      def setContent(self,content, contentType="text/html"):
+        self.call(self.__loadContent,content, contentType)
+
+      def getPage(self):
+        return self.engine.getLocation()
+
+      def goPrevious(self):
+        self.call(self.__goHistory,-1)
+
+      def goNext(self):
+        self.call(self.__goHistory,1)
+
+      def getTitle(self):
+        return self.engine.getTitle()
+
+      def __executeScript(self, js):
+        return self.engine.executeScript(js);
+
+      def __find(self,text, backwards=False):
+        #if text in (None,""):
+        #  self.engine.executeScript('window.stopFinding()');
+        #else:
+        self.engine.executeScript('window.find("%s",false,%s,true)' % (text,str(backwards).lower()));
+
+      def find(self,text, backwards=False):
+        try:
+          self.call(self.__find,text,backwards);
+        except Throwable, ex:
+          print "find, a petao", ex
+
+    self.__browser = JFXBrowser(self.lblStatus, self.txtURL)
+    self.containerBrowser.add(self.__browser,BorderLayout.CENTER)
+
+  def initComponents(self):
+    self.containerBrowser.setLayout(BorderLayout())
+
+    try:
+      self.__initJFXBrowser()
+    except:
+      try:
+        print "try to use CSSBox as WebBrowser"
+        self.__initCSSBox()
+      except:
+        print "Using JEditorPane as WebBrowser"
+        self.__initJEditorPane()
+
+    self.btnPrevious.setIcon(load_icon(getResource(__file__,"images","arrow_left.png")))
+    self.btnNext.setIcon(load_icon(getResource(__file__,"images","arrow_right.png")))
+    self.btnRefresh.setIcon(load_icon(getResource(__file__,"images","arrow_refresh.png")))
+    self.btnConfig.setIcon(load_icon(getResource(__file__,"images","add.png")))
+    self.btnSearchPrevious.setIcon(load_icon(getResource(__file__,"images","arrow_up.png")))
+    self.btnSearchNext.setIcon(load_icon(getResource(__file__,"images","arrow_down.png")))
+    self.imgSearch.setIcon(load_icon(getResource(__file__,"images","search.png")))
+    self.setPreferredSize(600,500)
+
+  def txtURL_keyPressed(self,keyEvent):
+    if keyEvent.getKeyChar() == "\n":
+      self.setPage(self.txtURL.getText())
+
+  def btnSearchPrevious_click(self,*args):
+    jtext = self.txtSearch
+    self.__browser.find(jtext.getText(),True)
+
+  def btnSearchNext_click(self,*args):
+    jtext = self.txtSearch
+    self.__browser.find(jtext.getText())
+
+  def txtSearch_keyPressed(self,event):
+    jtext = self.txtSearch
+    if event.getKeyChar() == "\x1b" : # ESC
+      jtext.setText("")
+      self.__browser.find("")
+      return
+    if event.getKeyChar() == "\n" :
+      self.__browser.find(jtext.getText())
+      return
+
+  def setPage(self,url):
+    self.txtURL.setText(str(url))
+    self.__browser.setPage(url)
+
+  def getPage(self):
+    return self.__browser.getPage()
+
+  def setContent(self,content, contentType="text/html"):
+    return self.__browser.setContent(content, contentType)
+
+  def btnPrevious_click(self,*args):
+    self.__browser.goPrevious()
+
+  def btnNext_click(self,*args):
+    self.__browser.goNext()
+
+  def getTitle(self):
+    return self.__browser.getTitle()
+
+  def showWindow(self,title="Browser",scriptEditor=True):
+    if scriptEditor:
+      windowManager = ScriptingSwingLocator.getUIManager()
+      windowManager.showWindow(self.asJComponent(),title)
+    else:
+      FormPanel.showWindow(self,title)
+
+def main(*args):
+  browser = BrowserPanel()
+  browser.showWindow("Browser", scriptEditor=False)
+  url = "jar:file:" + getResource(__file__, "..","data","gvsig-2_3_0-javadocs.zip!/html/overview-summary.html")
+  url = "jar:file:" + getResource(__file__, "..", "data","scripting-developers-guide.zip!/html/index.html")
+  url = "http://downloads.gvsig.org/download/web/es/build/html/gvsigsearch_all.html"
+  browser.setPage(url)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/layeraddlistener.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/layeraddlistener.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/layeraddlistener.py	(revision 1126)
@@ -0,0 +1,79 @@
+
+#=================================================
+#
+# Metodo de utilidad para recibir notificaciones cuando
+# se anada una capa al proyecto.
+#
+# Para usarlo:
+#
+# layerAdded_addListener(func)
+#
+# Cada vez que se anada una capa al proyecto se invocara
+# a la funcion "func" pasandole como parametro la capa
+# que ha sido anadida.
+#
+#
+
+
+
+
+from org.gvsig.fmap.mapcontrol import MapControlLocator
+from org.gvsig.fmap.mapcontrol import MapControlCreationListener
+from org.gvsig.fmap.mapcontext.layers import LayerCollectionListener
+
+
+class _LayerAddedListener(MapControlCreationListener,LayerCollectionListener):
+  def __init__(self, callable):
+    self.callable = callable
+
+  def mapControlCreated(self, mapControl):
+    try:
+      self.counter +=1
+      layers = mapControl.getMapContext().getLayers()
+      if layers != None:
+        layers.addLayerCollectionListener(self)
+    except Exception,ex:
+      print "Error in mapcontrolcreated "+ str(ex)
+    return mapControl
+
+  def layerAdded(self, e):
+    try:
+      self.callable(e.getAffectedLayer())
+    except Exception,ex:
+      print "Error in layerAdded "+ str(ex)
+
+  def layerAdding(self, e):
+    pass
+
+  def layerMoved(self, e):
+    pass
+
+  def layerMoving(self, e):
+    pass
+
+  def layerRemoved(self, e):
+    pass
+
+  def layerRemoving(self, e):
+    pass
+
+  def visibilityChanged(self, e):
+    pass
+
+
+def layerAdded_addListener(func):
+  mapControlManager = MapControlLocator.getMapControlManager()
+  mapControlManager.addMapControlCreationListener(_LayerAddedListener(func))
+
+def layerAdded_removeListener(func):
+  pass
+
+
+
+#def myListener(layer):
+#  print "Layer '%s' anadida a una vista."  % layer.getName()
+
+def main(*args):
+  #addListener_layerAdded(myListener)
+  pass
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/timeit.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/timeit.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/timeit.py	(revision 1126)
@@ -0,0 +1,14 @@
+import time                                                
+
+def timeit(method):
+
+    def timed(*args, **kw):
+        ts = time.time()
+        result = method(*args, **kw)
+        te = time.time()
+
+        print '%r (%r, %r) %2.2f sec' % \
+              (method.__name__, args, kw, te-ts)
+        return result
+
+    return timed
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+ 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/relpath.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/relpath.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/relpath.py	(revision 1126)
@@ -0,0 +1,16 @@
+
+def relpath(path, start):
+    """Return a relative version of a path"""
+    if not path:
+        raise ValueError("no path specified")
+    import posixpath
+    from posixpath import curdir, sep, pardir, join
+    start_list = posixpath.abspath(start).split(sep)
+    path_list = posixpath.abspath(path).split(sep)
+    # Work out how much of the filepath is shared by start and path.
+    i = len(posixpath.commonprefix([start_list, path_list]))
+    rel_list = [pardir] * (len(start_list)-i) + path_list[i:]
+    if not rel_list:
+        return curdir
+    return join(*rel_list)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/load_project.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/load_project.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/load_project.py	(revision 1126)
@@ -0,0 +1,16 @@
+
+#
+# ==========================================================
+#
+# Recive un File que apunta a un fichero de proyecto de gvSIG
+# y carga el proyecto.
+#
+
+def load_project(projectFile):
+  from org.gvsig.andami import PluginsLocator
+
+  actionManager = PluginsLocator.getActionInfoManager()
+  action = actionManager.getAction("application-project-open")
+  action.execute(projectFile)
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/formpanel.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/formpanel.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/formpanel.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = formpanel
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/gvpy.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/gvpy.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/gvpy.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = gvpy
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/toolbox.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/toolbox.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/toolbox.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = toolbox
+description =
+createdBy =
+version =
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/applicationtoolbar.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/applicationtoolbar.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs/applicationtoolbar.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = applicationtoolbar
+description =
+createdBy =
+version =
+
+[Script]
+main = main
+Lang = python
+

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/libs
___________________________________________________________________
Added: svn:ignore
   + .directory


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/Project.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/Project.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/Project.java	(revision 1126)
@@ -0,0 +1,56 @@
+package scripting.project;
+
+import java.util.Iterator;
+import org.gvsig.app.project.documents.Document;
+import org.gvsig.app.project.documents.table.TableDocument;
+import org.gvsig.app.project.documents.view.ViewDocument;
+
+/**
+ * Esta clase representa a un proyecto de gvSIG.
+ *
+ *
+ */
+public interface Project extends org.gvsig.app.project.Project {
+
+    /**
+     *
+     * @return
+     */
+    public Iterator<Document> __iter__();
+
+    /**
+     *
+     * @return
+     */
+    public int __len__();
+
+    /**
+     *
+     * @param index
+     * @return
+     */
+    public Document __getitem__(int index);
+
+    /**
+     *
+     * @param name, name of the view to retrieve, is optional
+     *   if name is not passed, return te current view.
+     *
+     * @return
+     */
+    public ViewDocument getView(String name);
+
+    /**
+     *
+     * @param name, optional
+     * @return
+     */
+    public  TableDocument getTable(String name);
+
+    /**
+     *
+     * @return
+     */
+    public String getProjectionCode();
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/table/TableDocument.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/table/TableDocument.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/table/TableDocument.java	(revision 1126)
@@ -0,0 +1,110 @@
+package scripting.project.table;
+
+import java.util.Iterator;
+import org.gvsig.fmap.dal.feature.Feature;
+import org.gvsig.fmap.dal.feature.FeatureSelection;
+import org.gvsig.fmap.dal.feature.FeatureSet;
+import org.gvsig.fmap.dal.feature.FeatureType;
+
+/**
+ *
+ *
+ */
+public class TableDocument extends org.gvsig.app.project.documents.table.TableDocument {
+
+    /**
+     *
+     * @param filterExpresion, optional
+     * @param sortby, optional
+     * @param asc, optional
+     * @return
+     */
+    public FeatureSet features(String filterExpresion, String sortby, boolean asc) { return null; }
+
+    /**
+     * 
+     * @return 
+     */
+    public Iterator<Feature> __iter__();
+
+    /**
+     * 
+     * @return 
+     */
+    public int __len__();
+
+    /**
+     * 
+     */
+    public void edit();
+
+    /**
+     * 
+     */
+    public void append(Object... values);
+
+    /**
+     * 
+     * @param schema 
+     */
+    public void updateSchema(FeatureType schema);
+
+    /**
+     * 
+     * @param feature 
+     */
+    public void update(Feature feature);
+
+    /**
+     * 
+     * @return 
+     */
+    public FeatureType getSchema();
+
+    /**
+     * 
+     */
+    public void commit();
+
+    /**
+     * 
+     */
+    public void abort();
+
+    /**
+     * 
+     * @return 
+     */
+    public FeatureSelection getSelecion();
+
+    /**
+     * 
+     * @param selection 
+     */
+    public void select(FeatureSelection selection);
+
+    /**
+     * 
+     * @param selection 
+     */
+    public void deselect(FeatureSelection selection);
+
+    /**
+     * 
+     * @param feature
+     * @return 
+     */
+    public boolean isSelected(Feature feature);
+
+    /**
+     * Returns the java object associated to this python object. With the
+     * current implementation this is not necessary, don't use now python
+     * wrappers for java objects.
+     *
+     * @return 
+     * @deprecated this method now return self alwais.
+     *
+     */
+    public Object __call__();
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/view/ViewDocument.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/view/ViewDocument.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/view/ViewDocument.java	(revision 1126)
@@ -0,0 +1 @@
+ 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/layout/LayoutContext.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/layout/LayoutContext.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/layout/LayoutContext.java	(revision 1126)
@@ -0,0 +1 @@
+ 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/layout/LayoutDocument.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/layout/LayoutDocument.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/project/layout/LayoutDocument.java	(revision 1126)
@@ -0,0 +1 @@
+ 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/geom.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/geom.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/geom.java	(revision 1126)
@@ -0,0 +1,248 @@
+package scripting;
+
+import org.gvsig.fmap.geom.Geometry;
+import org.gvsig.fmap.geom.primitive.Envelope;
+
+
+
+/**
+ * 
+ * Utility functions to manage gvSIG geometries
+ */
+public class geom {
+    
+    // GeometryTypes
+    public static final int AGGREGATE = Geometry.TYPES.AGGREGATE;
+    public static final int ARC = Geometry.TYPES.ARC;
+    public static final int CIRCLE = Geometry.TYPES.CIRCLE;
+    public static final int CURVE = Geometry.TYPES.CURVE;
+    public static final int ELLIPSE = Geometry.TYPES.ELLIPSE;
+    public static final int ELLIPTICARC = Geometry.TYPES.ELLIPTICARC;
+    public static final int GEOMETRY = Geometry.TYPES.GEOMETRY;
+    public static final int MULTICURVE = Geometry.TYPES.MULTICURVE;
+    public static final int MULTIPOINT = Geometry.TYPES.MULTIPOINT;
+    public static final int MULTISOLID = Geometry.TYPES.MULTISOLID;
+    public static final int MULTISURFACE = Geometry.TYPES.MULTISURFACE;
+    public static final int NULL = Geometry.TYPES.NULL;
+    public static final int POINT = Geometry.TYPES.POINT;
+    public static final int SOLID =  Geometry.TYPES.SOLID;
+    public static final int SPLINE = Geometry.TYPES.SPLINE;
+    public static final int SURFACE = Geometry.TYPES.SURFACE;
+
+    // Common named geometry types
+    public static final int POLYGON = Geometry.TYPES.SURFACE;
+    public static final int LINE = Geometry.TYPES.CURVE;
+    public static final int MULTILINE = Geometry.TYPES.MULTICURVE;
+    public static final int MULTIPOLYGON = Geometry.TYPES.MULTISURFACE;
+
+    // geometrySubTypes 
+    public static final int D2 = Geometry.SUBTYPES.GEOM2D;
+    public static final int D2M = Geometry.SUBTYPES.GEOM2DM;
+    public static final int D3 = Geometry.SUBTYPES.GEOM3D;
+    public static final int D3M = Geometry.SUBTYPES.GEOM3DM;
+    public static final int UNKNOWN = Geometry.SUBTYPES.UNKNOWN;
+
+    /**
+     * Returns a new geometry with a concrete type and subtype or None if can't
+     * create geometry.
+     *
+     * @param type: geometry type
+     * @type type: int
+     * @param subtype, optional: geometry subtype
+     * @type subtype: int
+     * @return geometry
+     * @rtype geometry
+     *
+     */
+    public static Geometry createGeometry(int type, int subtype) {
+        return null;
+    }
+  
+    /**
+     * Create a Point2D. If values of x and y are None, it will create an
+     * empty Point2D geometry
+     *
+     * @param vertexes, optional: vertexes of a new line
+     * @type vertexes, list of coordinates or list of geometry points
+     * @return line geometry
+     */
+    public static Geometry createPoint2D(double x, double y, int subtype) {
+        return null;
+    }
+
+    /**
+     * Create a Line2D. If vertexes value is None it will 
+     * create an empty Line2D geometry.
+     *
+     * @param vertexes, optional: vertexes of a new line
+     * @type vertexes, list of coordinates or list of geometry points
+     * @return line geometry
+     */
+    public static Geometry createLine2D(Object vertexes) {
+        return null;
+    }
+    
+    /**
+     * Create a Polygon2D. If vertexes value is None it will 
+     * create an empty Polygon2D.
+     *
+     * @param vertexes, optional: vertexes of a new line
+     * @type vertexes, list of coordinates or list of geometry points
+     * @return line geometry
+     */
+    public static Geometry createPolygon2D(Object vertexes) {
+        return null;
+    }
+    
+    /**
+     * 
+     * Returns a new point with a subtype and sets the value for the X, Y, Z and M
+     * coordinates (default 0,0,0,0) or None if can't create point or none coordinates
+     * are established.
+     * 
+     * If you pass a point geometry as a parameter, it will return the same geometry point.
+     *
+     *
+     * Examples:
+     *     createPoint(D2, 1, 2) -> Point2D(1, 2)
+     *     createPoint(D2, [1, 2]) -> Point2D(1, 2)
+     *
+     *     createPoint(D3, 1, 2, 3) -> Point3D(1,2,3)
+     *     createPoint(D2M, 1, 2, 4) -> Point (1, 2, 4)
+     *     createPoint(D3M, 1, 2, 3, 4) -> Point (1, 2, 3, 4)
+     *
+     *     createPoint(D2, Point2D(1, 2) -> Point2D(1, 2)
+     *     
+     *
+     * @param subtype, geometry subtype
+     * @type subtype: int
+     * @param coords, list of coordinates or points
+     * @return 
+     */
+    public static Geometry createPoint(int subtype, double... coords)  {
+        return null;
+    }  
+    
+    /**
+     * 
+     * Returns a new multipoint with a subtype from a list of Points instancesor list
+     * of coordinates.
+     * If points are None, returns an empty multipoint geometry. If it can't create
+     * the geometry, return None.
+     *
+     * @param subtype, geometry subtype
+     * @type subtype, int
+     * @param points, list of coordinates or points
+     * @return 
+     */
+    public static Geometry createMultiPoint(int subtype, Object points) {
+        return null;
+    }
+
+    /**
+     * 
+     * Returns a new polygon with a subtype from a list of Points instances or list
+     * of tuples/lists like [[x1, y1], [x2, y2], ...., [xn, yn]] are
+     * allowed. If points are None, returns an empty polygon geometry. If it can't create
+     * the geometry, return None.
+     *
+     * Example:
+     * createPolygon( D2, [point1, point2, [10, 10], point1])
+     *
+     * @param subtype, geometry subtype
+     * @type subtype, int
+     * @param vertexes, list of coordinates or points
+     * @return 
+     */
+    public static Geometry createPolygon(int subtype, Object vertexes) {
+        return null;
+    }
+
+    /**
+     * 
+     * Returns a new multipolygon with a subtype from a list of Polygon instances or list
+     * of coordinates.
+     * If polygons are None, returns an empty multipolygon geometry. If it can't create
+     * the geometry, return None.
+     *
+     * Example:
+     * createMultiPolygon( D2, [polygon1, [[0,0],[10,0],point1,[0,0]], polygon3])
+     *
+     * @param subtype, geometry subtype
+     * @type subtype, int
+     * @param polygons, list of polygons.
+     * @return 
+     */
+    public static Geometry createMultiPolygon(int subtype, Object polygons) {
+        return null;        
+    }  
+    
+    /**
+     * 
+     * Returns a new line with a subtype from a list of Points instances or list 
+     * of coordinates as tuples/lists like ([x1, y1], [x2, y2], ...., [xn, yn]) are
+     * allowed. If points are None, returns an empty line geometry. If it can't create
+     * the geometry, return None.
+     *
+     * Example:
+     * createLine( D2, [point0, [10,0], [10, 10], point0]) 
+     *
+     * @param subtype, geometry subtype
+     * @type subtype, int
+     * @param vertexes, list of coordinates or points
+     * @return 
+     */
+    public static Geometry createLine(int subtype, Object vertexes) {
+        return null;        
+    }  
+    
+    /**
+     * 
+     * Returns a new multiline with a subtype from a list of Line instances or list
+     * of coordinates.
+     * If polygons are None, returns an empty multipolygon geometry. If it can't create
+     * the geometry, return None.
+     *
+     * Example:
+     * createMultiLine( D2, [line1, [[0,0],[10,0],point1], line3])
+     *
+     * @param subtype, geometry subtype
+     * @type subtype, int
+     * @param lines, list of lines.
+     * @return 
+     */
+    public static Geometry createMultiLine(int subtype, Object lines) {
+        return null;        
+    }  
+    
+
+    /**
+     * Returns envelope as a minimum bounding box or rectangle. This envelope is
+     * equivalent to the GM_Envelope specified in ISO 19107. If points are None it will
+     * create an empty Envelope
+     *
+     * @param pointMax, optional, None by default
+     * @type pointMax, list of coordinates or geometry point
+     * @param pointMin, optional, None by default
+     * @type pointMin, list of coordinates or geometry point
+     * @param dimension
+     * @return 
+     */
+    public static Envelope createEnvelope(Object pointMax, Object pointMin, int dimension) {
+        return null;        
+    }  
+        
+    /**
+     * Create geometry from WKT (Well Known Text)
+     *
+     * @param WKT
+     * @type WKT, string
+     * @return 
+     */
+    public static Geometry createGeometryFromWKT(String WKT) {
+        return null;
+    }  
+    
+    
+    
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/simpleui.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/simpleui.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/simpleui.java	(revision 1126)
@@ -0,0 +1 @@
+ 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/commonsdialog.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/commonsdialog.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/commonsdialog.java	(revision 1126)
@@ -0,0 +1,201 @@
+package scripting;
+
+
+import java.awt.Component;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+
+/**
+ * Module with functions to show simple dialogs.
+ *
+ */
+public class commonsdialog {
+
+    /**
+      * msgbox messagetypes
+      */
+    public static final int FORBIDEN = 0;
+    public static final int IDEA = 1;
+    public static final int WARNING = 2;
+    public static final int QUESTION = 3;
+
+
+    /**
+      * Confirmdialog optionType Options
+      */
+    public static final int YES_NO = 0;
+    public static final int YES_NO_CANCEL = 1;
+    public static final int ACCEPT_CANCEL = 2;
+
+
+    /**
+      * Return values for confirmDialog
+      */
+    public static final int YES = 0;
+    public static final int NO = 1;
+    public static final int CANCEL = 2;
+
+    /**
+      * filechooser options
+      */
+    public static final int OPEN_FILE = 0;
+    public static final int OPEN_DIRECTORY = 1;
+    public static final int SAVE_FILE = 2;
+
+    /**
+      * filechooser selectionMode
+      */
+    public static final int FILES_ONLY = JFileChooser.FILES_ONLY;
+    public static final int DIRECTORIES_ONLY = JFileChooser.DIRECTORIES_ONLY;
+
+    /**
+      * Shows a message dialog with ok button only.
+      * <br>
+      * Valid values for messageType are:<br>
+      * <ul>
+      *   <li>FORBIDEN</li>
+      *   <li>IDEA</li>
+      *   <li>WARNING</li>
+      *   <li>QUESTION</li>
+      * </ul>
+      *
+      * @param message
+      * @param title, optional, title of the dialog
+      * @param messageType, optional, default value is IDEA
+      * @param root, optional, parent Component for this dialog, default values is gvSIG main window.
+      *
+     */
+    public static void msgbox(String message, String title, int messageType, Component root) {
+
+    }
+
+    /**
+      * Shows a dialog to request a input to the user.
+      * <br>
+      * Valid values for messageType are:<br>
+      * <ul>
+      *   <li>FORBIDEN</li>
+      *   <li>IDEA</li>
+      *   <li>WARNING</li>
+      *   <li>QUESTION</li>
+      * </ul>
+      *
+      * @param prompt
+      * @param title, optional, title of the dialog
+      * @param messageType, optional, default value is IDEA
+      * @param initialValue, optional, default value is ""
+      * @param root, optional, parent Component for this dialog, default values is gvSIG main window.
+      * @return the string value entered by the user or None.
+      */
+    public static String inputbox(String prompt, String title, int messageType, String initialValue, Component root) {
+      return null;
+    }
+
+    /**
+      * Shows a dialog to request to the user an answer of YES, NO or CANCEL.
+      *
+      * <br>
+      * Valid values for optionType are:<br>
+      * <ul>
+      *   <li>YES_NO</li>
+      *   <li>YES_NO_CANCEL</li>
+      *   <li>ACCEPT_CANCEL</li>
+      * </ul>
+      * <br>
+      * Valid values for messageType are:<br>
+      * <ul>
+      *   <li>FORBIDEN</li>
+      *   <li>IDEA</li>
+      *   <li>WARNING</li>
+      *   <li>QUESTION</li>
+      * </ul>
+      *
+      * @param prompt
+      * @param title, optional, title of the dialog
+      * @param optionType, optional, default value is YES_NO
+      * @param messageType, optional, default value is IDEA
+      * @param root, optional, parent Component for this dialog, default values is gvSIG main window.
+      * @return YES, NO, CANCEL.
+      */
+    public static int confirmDialog(String prompt, String title, int optionType, int messageType, JComponent root) {
+	  return 0;
+    }
+
+    /**
+      * Show an file or folder selector dialog.
+      *
+      * If multiselection is False, the default value, return the path-name of the
+      * selected file or folder. If is True, return a list of the selecteds path-names.
+      * <br>
+      * Return None if the user cancel the action.
+      * <br>
+      * Valid values for mode are:<br>
+      * <ul>
+      *   <li>FILES_ONLY</li>
+      *   <li>DIRECTORIES_ONLY</li>
+      * </ul>
+      *
+      * @param mode
+      * @param title, optional, title of the dialog
+      * @param initialPath, optional, default value is None
+      * @param multiselection, optional, default value is False
+      * @param filter, optional, default value is None
+      * @param fileHidingEnabled, optional, default value is True
+      * @param root, optional, parent Component for this dialog, default values is gvSIG main window.
+      * @return the pathnames selected or None if user cancel.
+      */
+    public static String[] filechooser(int mode, String title, String initialPath,
+       boolean multiselection, String filter, boolean fileHidingEnabled, Component root) {
+	  return null;
+    }
+
+
+    /**
+      * Show a selector dialog for choose a file for reading.
+      * <br>
+      * This is a utility function that call to filechooser.
+      * <br>
+      * Return None if the user cancel the action.
+      *
+      * @param title, optional, title of the dialog
+      * @param initialPath, optional, default value is None
+      * @param root, optional, parent Component for this dialog, default values is gvSIG main window.
+      * @return the pathnames selected or None if user cancel.
+      */
+    public static String[] openFileDialog(String title, String initialPath, Component root) {
+	return null;
+    }
+
+    /**
+      * Show a selector dialog for choose a folder.
+      * <br>
+      * This is a utility function that call to filechooser.
+      * <br>
+      * Return None if the user cancel the action.
+      *
+      * @param title, optional, title of the dialog
+      * @param initialPath, optional, default value is None
+      * @param root, optional, parent Component for this dialog, default values is gvSIG main window.
+      * @return the pathnames selected or None if user cancel.
+      */
+    public static String[] openFolderDialog(String title, String initialPath, Component root) {
+	return null;
+    }
+
+    /**
+      * Show a selector dialog for choose a file for writing.
+      * <br>
+      * This is a utility function that call to filechooser.
+      * <br>
+      * Return None if the user cancel the action.
+      *
+      * @param title, optional, title of the dialog
+      * @param initialPath, optional, default value is None
+      * @param root, optional, parent Component for this dialog, default values is gvSIG main window.
+      * @return the pathnames selected or None if user cancel.
+      */
+    public static String[] saveFileDialog(String title, String initialPath, Component root) {
+	return null;
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/gvsig.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/gvsig.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/gvsig.java	(revision 1126)
@@ -0,0 +1,387 @@
+package scripting;
+
+import org.cresques.cts.IProjection;
+import org.gvsig.fmap.dal.DataStore;
+import org.gvsig.fmap.dal.feature.FeatureType;
+import org.gvsig.fmap.mapcontext.layers.FLayer;
+import org.gvsig.scripting.app.extension.ScriptingExtension;
+
+/**
+ * Representa al modulo python "gvsig".
+ *
+ * Es el modulo base que nos facilita el acceso a todos los componentes de
+ * gvSIG.
+ *
+ */
+public class gvsig {
+
+    public static int LOGGER_INFO = ScriptingExtension.INFO;
+    public static int LOGGER_WARN = ScriptingExtension.WARN;
+    public static int LOGGER_ERROR = ScriptingExtension.ERROR;
+
+    /**
+     * Returns a new and empty attributes definition.
+     *
+     * @return the new FeatureType
+     */
+    public static FeatureType createFeatureType() {
+        return null;
+    }
+
+    /**
+     * Returns a new and empty attributes definition based in an existing
+     * FeatureType.
+     *
+     * All attributes in the feature type pased as parameters are created in the
+     * new definition
+     *
+     * @param featureType from the new attributes are copied
+     * @return The new FeatureType
+     */
+    public static FeatureType createFeatureType(FeatureType featureType) {
+        return null;
+    }
+
+    /**
+     * Create a new layer with the specified parameters.
+     *
+     * The paramaters are used to connect to the server type and create the
+     * layer. These parameters are specific of each type of layer.
+     *
+     * Valid values of server type are:
+     * <ul>
+     * <li>FilesystemExplorer</li>
+     * <li>PostgreSQLExplorer</li>
+     * <li>WFSServerExplorer</li>
+     * <li>Wms Store</li>
+     * <li>...</li>
+     * </ul>
+     *
+     * Valid values of layer type are:
+     * <ul>
+     * <li>Shape</li>
+     * <li>Dbf</li>
+     * <li>DXF</li>
+     * <li>DGN</li>
+     * <li>DWG</li>
+     * <li>JExcel</li>
+     * <li>PostgreSQL</li>
+     * <li>WFSStore</li>
+     * <li>Gdal Store</li>
+     * <li>...</li>
+     * </ul>
+     *
+     * Excamples of use:<br>
+     * <code>
+     * layer = createLayer(schema=schema,
+     *                   servertype="FilesystemExplorer",
+     *                   layertype="Shape",
+     *                   shpFile="/home/osc/temp/test1.shp",
+     *                   CRS="EPSG:25830",
+     *                   geometryType=POINT
+     *                   )
+     * </code>
+     *
+     * @param schema the schema to use to create la layer.
+     * @param serverType The server type (filesystem, BBDD, ...)
+     * @param layerType The layer type to create (Shape, ...)
+     * @param parameters the specific parameters to create the new layer
+     * @return the new created layer
+     *
+     */
+    public static FLayer createLayer(FeatureType schema, String serverType, String layerType, Object... parameters) {
+        return null;
+    }
+
+    /**
+     * Create a new layer with the specified parameters.
+     *
+     * Use as default serverType the "FilesystemExplorer".
+     *
+     * @param schema
+     * @param layerType
+     * @param parameters
+     * @return
+     */
+    public static FLayer createLayer(FeatureType schema, String layerType, Object... parameters) {
+        return null;
+    }
+
+    /**
+     * Create a new shape with the specified parameters. If filename is not established, a temp filename will be set.
+     * If CRS is None, it will be created with the CRS of the current view.
+     *
+     * Example:
+     *     schema = createSchema()
+     *     schema.append("ID", "INTEGER", 10)
+     *     schema.append("GEOMETRY", "GEOMETRY")
+     *     schema.get("GEOMETRY").setGeometryType(POINT, D2)
+     *     newshape = createShape(schema, prefixname="newshape")
+     *
+     *
+     * @param schema
+     * @param filename, string, optional
+     * @param geometryType, optional, integer, established in the schema
+     * @param CRS, optional, string epsg code
+     * @param prefixname, optional, string layer name with a prefix if filename is not established
+     * @return
+     */
+    public static FLayer createShape(FeatureType schema, Object... parameters) {
+        return null;
+    }
+
+    /**
+     * Create a new table with the specified parameters.
+     *
+     * Use as default serverType the "FilesystemExplorer".
+     *
+     * @param schema
+     * @param servertype
+     * @param layerType
+     * @param parameters
+     * @return
+     */
+    public static FLayer createTable(FeatureType schema, String servertype, String layerType, Object... parameters) {
+        return null;
+    }
+    
+    /*
+     * Create a new table with the specified parameters. If DbfFile is not established, a temp filename will be set.
+     *
+     * Example:
+     *     schema = createSchema()
+     *     schema.append("ID", "INTEGER", 10)
+     *     newdbf = createDBF(schema, prefixname="newshape")
+     *
+     *
+     * @param schema
+     * @param DbfFile, optional, string
+     * @param prefixname, optional, string layer name with a prefix if filename is not established
+     * @return
+     */
+    public static FLayer createDBF(FeatureType schema, Object... parameters) {
+        return null;
+    }
+
+    /**
+     * Load an existing table file.
+     *
+     * @param dbffile, string, path to the table file to load
+     * @return
+     *
+     */
+    public static FLayer loadDBF(String dbffile) {
+        return null;
+    }
+
+     /**
+     * Load an existing table file.
+     *
+     * Example:
+     *       table = loadTable(format="DBF",DbfFile=dbffile)
+     *
+     * @param format, string
+     * @param path, string, path to the table file to load
+     * @return
+     *
+     */
+    public static FLayer loadTable(String format, Object... parameters) {
+        return null;
+    }
+
+    /**
+     * Load an existing shape file in the current view.
+     *
+     * @param path path to the shape file to load
+     * @param projection to use to load the shape file
+     * @return
+     *
+     */
+    public static FLayer loadShapeFile(String path, String projection) {
+        return null;
+    }
+
+    /**
+     * Load an existing shape file in the current view.
+     *
+     * Use as default projection "CRS:84"
+     *
+     * @param path path to the shape file to load
+     * @return
+     *
+     */
+    public static FLayer loadShapeFile(String path) {
+        return null;
+    }
+
+    /**
+     * Load an existing raster file in the current view.
+     *
+     * @param path path to the raster file to load
+     * @param projection to use to load the raster file
+     * @return
+     *
+     */
+    public static FLayer loadRasterFile(String path, String projection) {
+        return null;
+    }
+
+    /**
+     * Load an existing raster file in the current view.
+     *
+     * Use as default projection "CRS:84"
+     *
+     * @param path path to the raster file to load
+     * @return
+     *
+     */
+    public static FLayer loadRasterFile(String path) {
+        return null;
+    }
+
+    /**
+     * Load an existing layer and return it.
+     *
+     * Valid values of layer type are: 
+     * - Shape 
+     * - Gdal Store
+     * - TODO
+     *
+     * Examples:
+     *     loadLayer("Shape", shpFile=xfile, CRS="EPSG:25830")
+     *     loadLayer("Gdal Store", uri=raster_uri)
+     *
+     * @param layerType
+     * @param parameters
+     * @return
+     *
+     */
+    public static FLayer loadLayer(String layerType, Object... parameters) {
+        return null;
+    }
+
+    /**
+     * Send a message to the log system.
+     *
+     * The values of mode are:
+     * <ul>
+     * <li>LOGGER_INFO</li>
+     * <li>LOGGER_WARN</li>
+     * <li>LOGGER_ERROR</li>
+     * </ul>
+     *
+     * @param msg to send to log
+     * @param mode message type, is optional with default of LOGGER_INFO.
+     * @param exception an exception to log, is optional.
+     */
+    public static void logger(String msg, int mode, Throwable exception) {
+
+    }
+
+    /**
+     * Create the path to a resource.
+     *
+     * This function runs like the os.path.join, but if the first argument is a
+     * full path name to a file, it only get the dirname of it.
+     *
+     * This is usefull to use with the variable __file__ as the first argument
+     * to get a path name to a resource relative to the current module.
+     *
+     * Explample:<br>
+     * <code>
+     *  pathname = getResource(__file__,"data","icon.png")
+     * </code>
+     *
+     * @param parameters parts of path to the resource.
+     * @return the path name to the resource.
+     */
+    public String getResource(String... parameters) {
+        return null;
+    }
+
+    /**
+     * Open an existen data store an return it.
+     *
+     * The type of store depened of store to be opened. It can be:
+     * <ul>
+     * <li>Shape</li>
+     * <li>Dbf</li>
+     * <li>DXF</li>
+     * <li>DGN</li>
+     * <li>DWG</li>
+     * <li>JExcel</li>
+     * <li>PostgreSQL</li>
+     * <li>WFSStore</li>
+     * <li>Gdal Store</li>
+     * </ul>
+     *
+     * Example with PostgreSQL connection:
+     * <code>
+     * from gvsig.utils import openStore
+     *
+     * os = openStore('PostgreSQL',_entity_='Persistence%3APostgreSQLStoreParameters',
+     *                             port='5432',
+     *                             JDBCDriverClass='org.postgresql.Driver',
+     *                             UseSSL='false',
+     *                             Schema='public',
+     *                             Catalog='',
+     *                             URL='jdbc%3Apostgresql%3A%2F%2Flocalhost%3A5432%2Fej1',
+     *                             BaseOrder='',
+     *                             Workingarea=None,
+     *                             CRS='EPSG:23030',
+     *                             PKFields='gid',
+     *                             BaseFilter='',
+     *                             DefaultGeometryField='geom',
+     *                             Fields='gid%2Cnombre%2Cpoblacion%2Cgeom',
+     *                             Table='ciudades',
+     *                             SQL='',
+     *                             password='postgres',
+     *                             dbname='ej1',
+     *                             host='localhost',
+     *                             dbuser='postgres',
+     *                             ProviderName='PostgreSQL')
+     * </code>
+     *
+     * @param storeType the type of store to open.
+     * @param parameters to open the store.
+     * @return the opened data store
+     */
+    public DataStore openStore(String storeType, Object... parameters) {
+        return null;
+    }
+    
+    /**
+     * Create a new projectionobject associated with the passed name of 
+     * the projection.
+     * 
+     * Usually, the name is the abbreviation of the projection.
+     * 
+     * Is preferable to use this method <code>CRSFactory.getCRS(name)</code> instead.
+     * 
+     * @param name abbreviation of the projection
+     * @return the projection object associated with the name
+     */
+    public IProjection getCRS(String name) {
+        return null;
+    }
+    
+    /**
+     * Return the default data folder of gvSIG.
+     * This is configured in the preferences of gvSIG.
+     * 
+     * @return the data folder of gvSIG
+     */
+    public String getDataFolder() {
+        return null;
+    }
+    
+    /**
+     * Return the default projects folder of gvSIG.
+     * This is configured in the preferences of gvSIG.
+     * 
+     * @return the projects folder of gvSIG.
+     */
+    public String getProjectsFolder() {
+        return null;
+    }
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/EditableFeature.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/EditableFeature.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/EditableFeature.java	(revision 1126)
@@ -0,0 +1,122 @@
+package scripting.dal;
+
+import org.gvsig.fmap.geom.Geometry;
+
+public interface EditableFeature extends org.gvsig.fmap.dal.feature.EditableFeature { 
+
+
+  /**
+   * Gets the value of the default attribute to store the geometry. 
+   *
+   */
+  public Geometry geometry() ;
+
+
+  /**
+   * Create and return a dict and fill it with the name/values of the attributes.
+   *
+   */
+  public dict getValues() ;
+  
+  /**
+   * Enable the edit mode in this feature.
+   *
+   * @deprecated can't use this method, is not jet implemented. Use getEditable instead.
+   */
+  public void edit() ;
+  
+  /**
+   * Gets the value of the attribute name of the feature. 
+   *
+   * This method allow to treat a Feature as a dict.
+   *
+   * @param name of the atttribute to get
+   *
+   */
+  public void __getitem__(String name) ;
+
+  /**
+   * Returns the java object associated to this python object. 
+   * With the current implementation this is not necessary, don't
+   * use now python wrappers for java objects.
+   *
+   * @deprecated this method now return self alwais.
+   *
+   */
+  public void __call__() ;
+
+
+  /**
+   * Gets the number of attributes of the feature. 
+   *
+   * This method allow to use "len(feature)"
+   *
+   */
+  public void __len__() ;
+
+  /**
+   * Allow to iterate ower the name/values of the attributes of the feature. 
+   *
+   */
+  public Generator iteritems() ;
+
+  /**
+   * Allow to iterate ower the values of the attributes of the feature. 
+   *
+   */
+  public Generator itervalues() ;
+
+  /**
+   * Allow to iterate ower the names of the attributes of the feature. 
+   *
+   */
+  public Generator iterkeys() ;
+  
+  /**
+   * Sets the geomtry asociated to the attribute name. 
+   *
+   * @param name of the atttribute to set
+   * @param value geomtry to set in the attribute name
+   *
+   */
+  public void setGeometry(String name, Geometry value) ;
+
+  /**
+   * Sets the geomtry asociated to the attribute name. 
+   *
+   * @param value geomtry to set in the default attribute for the geometry
+   *
+   */
+  public void setGeometry(Geometry value) ;
+
+  /**
+   * Assing the values passed as parameters to the feature.
+   *
+   * If parameters are passed as postion ara assigned in that order
+   * to the attributes of the features.
+   *
+   * If parameters are passed by name ara assigned to the attributes
+   * of the feature by this name.
+   *
+   */
+  public void setValues(Object...values) ;
+  
+  /**
+   * Sets value of the attribute name. 
+   *
+   * @param name of the atttribute to set
+   * @param value to set in the attribute name
+   *
+   */
+  public void __setitem__(String name, Object value) ;
+
+  /**
+   * Sets value of the attribute name. 
+   *
+   * @param name of the atttribute to set
+   * @param value to set in the attribute name
+   *
+   */
+  public void __setattr__(String name, Object value) ;
+
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureSet.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureSet.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureSet.java	(revision 1126)
@@ -0,0 +1,37 @@
+ 
+ 
+package scripting.dal;
+
+import java.util.Iterator;
+import org.gvsig.fmap.dal.feature.Feature;
+
+public interface FeatureSet extends org.gvsig.fmap.dal.feature.FeatureSet { 
+
+
+  /**
+   * Returns the java object associated to this python object. 
+   * With the current implementation this is not necessary, don't
+   * use now python wrappers for java objects.
+   *
+   * @deprecated this method now return self alwais.
+   *
+   */
+  public Object __call__() ;
+
+
+  /**
+   * Gets the number of features of the set. 
+   *
+   * This method allow to use "len(set)"
+   *
+   */
+  public void __len__() ;
+
+  /**
+   * Allow to iterate ower the features of the set. 
+   *
+   */
+  public Iterator<Feature> __iter__() ;
+
+  
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureStore.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureStore.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureStore.java	(revision 1126)
@@ -0,0 +1,76 @@
+ 
+package scripting.dal;
+
+
+import java.util.Iterator;
+import org.gvsig.fmap.dal.feature.Feature;
+import org.gvsig.fmap.dal.feature.FeatureSet;
+import org.gvsig.fmap.dal.feature.FeatureType;
+
+
+public interface FeatureStore extends org.gvsig.fmap.dal.feature.FeatureStore { 
+
+    /**
+     * 
+     * @return 
+     */
+    public FeatureType getSchema();
+
+    /**
+     * 
+     * @param filterExpresion, optional
+     * @param sortby, optional
+     * @param asc, optional
+     * @return 
+     */
+    public FeatureSet features(String filterExpresion, String sortby, boolean asc) ;
+
+    /**
+     * 
+     * @return 
+     */
+    public Iterator<Feature> __iter__();
+
+    /**
+     * 
+     * @return 
+     */
+    public int __len__();
+
+    /**
+     * 
+     */
+    public void append(Object... values) ;
+
+    /**
+     * 
+     * @param feature 
+     */
+    public void update(Feature feature);
+
+    /**
+     * 
+     */
+    public void edit();
+
+    /**
+     * 
+     */
+    public void commit();
+
+    /**
+     * 
+     */
+    public void abort();
+
+  /**
+   * Returns the java object associated to this python object. 
+   * With the current implementation this is not necessary, don't
+   * use now python wrappers for java objects.
+   *
+   * @deprecated this method now return self alwais.
+   *
+   */
+  public Object __call__() ;
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/Feature.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/Feature.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/Feature.java	(revision 1126)
@@ -0,0 +1,77 @@
+ 
+package scripting.dal;
+
+
+import org.gvsig.fmap.geom.Geometry;
+
+
+public interface Feature extends org.gvsig.fmap.dal.feature.Feature { 
+
+  /**
+   * Gets the value of the default attribute to store the geometry. 
+   *
+   */
+  public Geometry geometry() ;
+
+
+  /**
+   * Create and return a dict and fill it with the name/values of the attributes.
+   *
+   */
+  public dict getValues() ;
+  
+  /**
+   * Enable the edit mode in this feature.
+   *
+   * @deprecated can't use this method, is not jet implemented. Use getEditable instead.
+   */
+  public void edit() ;
+  
+  /**
+   * Gets the value of the attribute name of the feature. 
+   *
+   * This method allow to treat a Feature as a dict.
+   *
+   * @param name of the atttribute to get
+   *
+   */
+  public void __getitem__(String name) ;
+
+  /**
+   * Returns the java object associated to this python object. 
+   * With the current implementation this is not necessary, don't
+   * use now python wrappers for java objects.
+   *
+   * @deprecated this method now return self alwais.
+   *
+   */
+  public void __call__() ;
+
+
+  /**
+   * Gets the number of attributes of the feature. 
+   *
+   * This method allow to use "len(feature)"
+   *
+   */
+  public void __len__() ;
+
+  /**
+   * Allow to iterate ower the name/values of the attributes of the feature. 
+   *
+   */
+  public Generator iteritems() ;
+
+  /**
+   * Allow to iterate ower the values of the attributes of the feature. 
+   *
+   */
+  public Generator itervalues() ;
+
+  /**
+   * Allow to iterate ower the names of the attributes of the feature. 
+   *
+   */
+  public Generator iterkeys() ;
+  
+}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureType.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureType.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/dal/FeatureType.java	(revision 1126)
@@ -0,0 +1,57 @@
+package scripting.dal;
+
+import java.util.Iterator;
+import java.util.List;
+import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
+
+/**
+ *
+ *
+ * (Antes era el Schema)
+ */
+public interface FeatureType extends org.gvsig.fmap.dal.feature.FeatureType {
+
+    /**
+     * 
+     * @param name
+     * @return 
+     */
+    public FeatureAttributeDescriptor __getitem__(String name);
+
+    /**
+     * 
+     * @return 
+     */
+    public Iterator<FeatureAttributeDescriptor> __iter__();
+
+    /**
+     * 
+     * @return 
+     */
+    public int __len__();
+
+    /**
+     * 
+     * @param name
+     * @param defaulValue
+     * @return 
+     */
+    public FeatureAttributeDescriptor get(String name, FeatureAttributeDescriptor defaulValue);
+
+    /**
+     * 
+     * @return 
+     */
+    public List<String> getAttrNames();
+
+    /**
+     * Returns the java object associated to this python object. With the
+     * current implementation this is not necessary, don't use now python
+     * wrappers for java objects.
+     *
+     * @deprecated this method now return self alwais.
+     *
+     */
+    public Object __call__();
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/FLyrVect.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/FLyrVect.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/FLyrVect.java	(revision 1126)
@@ -0,0 +1,145 @@
+package scripting.mapcontext;
+
+import java.util.Iterator;
+import org.cresques.cts.IProjection;
+import org.gvsig.fmap.dal.feature.Feature;
+import org.gvsig.fmap.dal.feature.FeatureSelection;
+import org.gvsig.fmap.dal.feature.FeatureSet;
+import org.gvsig.fmap.dal.feature.FeatureType;
+
+/**
+ *
+ *
+ */
+public class FLyrVect extends org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect {
+
+    public IProjection getProjectionCode() {
+        return null;
+    }
+    
+    /**
+     *
+     * @param filterExpresion, optional
+     * @param sortby, optional
+     * @param asc, optional
+     * @return
+     */
+    public FeatureSet features(String filterExpresion, String sortby, boolean asc) {
+        return null;
+    }
+
+    /**
+     * 
+     * @return 
+     */
+    public Iterator<Feature> __iter__() {
+        return null;
+    }
+
+    /**
+     * 
+     * @return 
+     */
+    public int __len__() {
+        return 0;
+    }
+
+    /**
+     * 
+     */
+    public void edit() {
+        
+    }
+
+    /**
+     * 
+     */
+    public void append(Object... values) {
+        
+    }
+
+    /**
+     * 
+     * @param schema 
+     */
+    public void updateSchema(FeatureType schema) {
+        
+    }
+
+    /**
+     * 
+     * @param feature 
+     */
+    public void update(Feature feature) {
+        
+    }
+
+    /**
+     * 
+     * @return 
+     */
+    public FeatureType getSchema() {
+        return null;
+    }
+
+    /**
+     * 
+     */
+    public void commit() {
+        
+    }
+
+    /**
+     * 
+     */
+    public void abort() {
+        
+    }
+
+    /**
+     * 
+     * @return 
+     */
+    public FeatureSelection getSelecion() {
+        return null;
+    }
+
+    /**
+     * 
+     * @param selection 
+     */
+    public void select(FeatureSelection selection) {
+        
+    }
+
+    /**
+     * 
+     * @param selection 
+     */
+    public void deselect(FeatureSelection selection) {
+        
+    }
+
+    /**
+     * 
+     * @param feature
+     * @return 
+     */
+    public boolean isSelected(Feature feature) {
+        return false;
+    }
+
+    /**
+     * Returns the java object associated to this python object. With the
+     * current implementation this is not necessary, don't use now python
+     * wrappers for java objects.
+     *
+     * @return 
+     * @deprecated this method now return self alwais.
+     *
+     */
+    public Object __call__() {
+        return null;
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/MapContext.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/MapContext.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/MapContext.java	(revision 1126)
@@ -0,0 +1,51 @@
+package scripting.mapcontext;
+
+import java.util.Iterator;
+import org.gvsig.fmap.mapcontext.layers.FLayer;
+
+/**
+ *
+ *
+ */
+public class MapContext extends org.gvsig.fmap.mapcontext.MapContext {
+
+    /**
+     * Returns the java object associated to this python object. With the
+     * current implementation this is not necessary, don't use now python
+     * wrappers for java objects.
+     *
+     * @return
+     * @deprecated this method now return self alwais.
+     *
+     */
+    public Object __call__() {
+        return null;
+    }
+
+    /**
+     *
+     * @return
+     */
+    public int __len__() {
+        return 0;
+    }
+
+    /**
+     *
+     * @return
+     */
+    public Iterator<FLayer> __iter__() {
+        return null;
+    }
+
+    /**
+     *
+     * @param index
+     * @return
+     */
+    public FLayer __getitem__(int index) {
+        return null;
+    }
+
+}
+ 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/FLayers.java
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/FLayers.java	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/javadocs/scripting/mapcontext/FLayers.java	(revision 1126)
@@ -0,0 +1,50 @@
+package scripting.mapcontext;
+
+import java.util.Iterator;
+import org.gvsig.fmap.mapcontext.layers.FLayer;
+
+/**
+ *
+ *
+ */
+public class FLayers extends org.gvsig.fmap.mapcontext.layers.FLayers {
+
+    /**
+     * Returns the java object associated to this python object. With the
+     * current implementation this is not necessary, don't use now python
+     * wrappers for java objects.
+     *
+     * @return
+     * @deprecated this method now return self alwais.
+     *
+     */
+    public Object __call__() {
+        return null;
+    }
+
+    /**
+     *
+     * @return
+     */
+    public int __len__() {
+        return 0;
+    }
+
+    /**
+     *
+     * @return
+     */
+    public Iterator<FLayer> __iter__() {
+        return null;
+    }
+
+    /**
+     *
+     * @param index
+     * @return
+     */
+    public FLayer __getitem__(int index) {
+        return null;
+    }
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/flayers.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/flayers.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/flayers.py	(revision 1126)
@@ -0,0 +1,28 @@
+
+
+from org.gvsig.fmap.mapcontext.layers import FLayers as JFLayers
+
+
+def __call(self):
+  return self
+
+def __iter(self):
+  for i in range(0,self.getLayersCount()):
+    layer = self.getLayer(i)
+    yield layer
+
+def __len(self):
+  return self.getLayersCount()
+
+def __getitem(self, index):
+  return self.getLayer(index)
+
+#
+# Inject new methods in the class JFLayers
+#
+
+JFLayers.__call__ = __call
+JFLayers.__iter__ = __iter
+JFLayers.__len__ = __len
+JFLayers.__getitem__ = __getitem
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/project.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/project.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/project.py	(revision 1126)
@@ -0,0 +1,123 @@
+
+
+from org.gvsig.app.project import DefaultProject as JProject
+from org.gvsig.app import ApplicationLocator
+from org.gvsig.app.project.documents.view import ViewDocument
+from org.gvsig.app.project.documents.table import TableDocument
+from org.gvsig.app.project.documents.view import ViewManager
+from org.gvsig.fmap.crs import CRSFactory
+
+def __createView(self, name="View 001", CRS=None):
+    #Get the view manager
+    application = ApplicationLocator.getManager() # Manager app
+    projectManager = application.getProjectManager() # Project manager
+
+    #from org.gvsig.app.project.documents.view import ViewManager
+    viewManager = projectManager.getDocumentManager(ViewManager.TYPENAME)
+
+    p = application.getCurrentProject()
+    view = p.getDocument(name, ViewManager.TYPENAME) #TYPENAME=project.document.view2d
+    if CRS==None:
+        try:
+          CRS = currentProject().getProjectionCode()
+        except:
+          CRS = 'EPSG:4326'
+    crs = CRSFactory.getCRS(CRS)
+    view = viewManager.createDocument()
+    view.setName(name)
+    view.setProjection(crs)
+    p.addDocument(view) #add to project manager
+    return view
+
+def __getView(self, name=None):
+    if name == None:
+        try:
+            activeDocument = self.getActiveDocument()
+            if activeDocument == None:
+                return None
+            if isinstance(activeDocument, ViewDocument):
+                return activeDocument
+            return None
+
+        except Exception, ex:
+            raise Exception("%s" % repr(ex))
+    else:
+        views = self.getViews()
+        if len(views) >0:
+            for view in views:
+                if name == view.getName():
+                    return view
+    return None
+
+def __getTable(self, name=None):
+    if name == None:
+        try:
+            activeDocument = self.getActiveDocument()
+            if activeDocument == None:
+                return None
+            if isinstance(activeDocument, TableDocument):
+                return activeDocument
+            return None
+        except Exception, ex:
+            raise Exception("%s"%repr(ex))
+    else:
+        tables = self.getDocuments("project.document.table")
+        if len(tables) >0:
+            for table in tables:
+                if name == table.getName():
+                    return table
+        return None
+
+def __getProjectionCode(self):
+    return self.getProjection().getFullCode()
+
+def __call(self):
+    return self
+
+def __iter(self):
+    it = self.iterator()
+    while it.hasNext() :
+        doc = it.next()
+        yield doc
+
+def __len(self):
+    return self.getDocuments().size()
+
+def __getitem(self,index):
+    return self.getDocuments().get(index)
+
+def currentProject():
+    application = ApplicationLocator.getManager()
+    project = application.getCurrentProject()
+    return project
+
+def currentDocument(documentClass = None):
+    application = ApplicationLocator.getManager()
+
+    if documentClass == None:
+        doc = application.getActiveDocument()
+    else:
+        doc = application.getActiveDocument(documentClass)
+    return doc
+
+def currentTable():
+    return currentDocument(TableDocument)
+
+def currentView():
+    return currentDocument(ViewDocument)
+
+
+
+
+#
+# Inject new methods in the class JProject
+#
+JProject.getView = __getView
+JProject.getTable = __getTable
+JProject.getProjectionCode = __getProjectionCode
+JProject.__call__ = __call
+JProject.__iter__ = __iter
+JProject.__len__ = __len
+JProject.__getitem__ = __getitem
+JProject.createView = __createView
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featureset.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featureset.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featureset.py	(revision 1126)
@@ -0,0 +1,31 @@
+
+
+from org.gvsig.fmap.dal.feature.impl.featureset import DefaultFeatureSet as JFeatureSet
+
+
+class JavaIteratorWraper(object):
+    def __init__(self, jiterator):
+        self._jiterator = jiterator
+
+    def next(self):
+        if self._jiterator.hasNext():
+            return self._jiterator.next()
+        raise StopIteration()
+
+def __iter(self):
+    return JavaIteratorWraper(self.iterator())
+
+def __len(self):
+  return self.getSize()
+
+def _getCount(self):
+  return self.getSize()
+
+#
+# Inject new methods in the class JFeatureSet
+#
+JFeatureSet.getCount = _getCount
+#JFeatureSet.__iter__ = __iter # Con gvSIG 2.5 no deberia ser necesario.
+JFeatureSet.__len__ = __len
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/window.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/window.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/window.py	(revision 1126)
@@ -0,0 +1,15 @@
+
+from org.gvsig.andami.ui.mdiManager import IWindow
+from javax.swing import JInternalFrame
+
+def __getJInternalFrame(self):
+  x = self.getParent()
+  for n in xrange(200):
+    #print "x: ", x
+    if isinstance(x,JInternalFrame):
+      return x
+    x = x.getParent()
+  return None
+  
+IWindow.getJInternalFrame = __getJInternalFrame
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featurestore.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featurestore.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featurestore.py	(revision 1126)
@@ -0,0 +1,114 @@
+
+from java.lang import RuntimeException
+from org.gvsig.fmap.dal.feature.impl import DefaultFeatureStore as JFeatureStore
+from org.gvsig.fmap.dal.feature import FeatureQueryOrder
+from java.lang import RuntimeException
+from org.gvsig.app import ApplicationLocator
+from org.gvsig.tools.evaluator import Evaluator
+
+#
+# Save methods edit and update that are rewriten in python
+#
+super_edit = JFeatureStore.edit
+super_update = JFeatureStore.update
+
+def __getSchema(self):
+  return self.getDefaultFeatureType()
+
+def __features(self, expresion = None, sortby="", asc=True):
+  if expresion == None and sortby =="":
+    return self.getFeatureSet()
+
+  try:
+    application = ApplicationLocator.getManager()
+    datamanager =  application.getDataManager()
+    query = self.createFeatureQuery()
+    if sortby != "":
+      order = FeatureQueryOrder()
+      order.add(sortby, asc)
+      query.setOrder(order)
+    if expresion != None:
+      if isinstance(expresion,Evaluator):
+        query.setFilter(expresion)
+      else:
+        query.setFilter(datamanager.createExpresion(expresion))
+    fset = self.getFeatureSet(query)
+    return fset
+  except Exception, e:
+    return None
+
+def __iter(self):
+  return self.getFeatureSet().__iter__()
+
+def __len(self):
+  return self.getFeatureSet().getSize()
+
+def __append(self, *args, **kwargs):
+  try:
+    if not self.isEditing():
+      self.edit()
+
+    if len(args) ==1:
+      if not isinstance(args[0], dict):
+        raise ValueError("Argument should be a dict")
+      if kwargs == None:
+        kwargs = args[0]
+      else:
+        kwargs.update(args[0])
+
+    f = self.createNewFeature()
+
+    if f == None:
+      raise RuntimeException("Failed to create a new Feature")
+
+    for k,v in kwargs.iteritems():
+      f.set(k,v)
+    self.insert(f)
+
+  except Exception, ex:
+    raise RuntimeException("Can't append values %s to layer %s (%s)" % (
+      repr(kwargs),
+      self.getName(),
+      str(ex)
+      )
+    )
+
+def __update(self, feature):
+  if not self.isEditing():
+      self.edit()
+  super_update(self, feature)
+
+def __edit(self, mode=JFeatureStore.MODE_FULLEDIT):
+  if not self.isEditing():
+    super_edit(self, mode)
+
+def __commit(self):
+  try:
+    self.finishEditing()
+  except Exception, ex:
+    self.abort()
+    raise RuntimeException("Can't finish layer edition, cancelling changes. %s" % repr(ex))
+
+def __abort(self):
+  self.cancelEditing()
+
+def __call(self):
+  return self
+
+
+#
+# Inject new methods in the class JFeatureStore
+#
+JFeatureStore.getSchema = __getSchema
+JFeatureStore.features = __features
+JFeatureStore.append = __append
+JFeatureStore.update = __update
+JFeatureStore.edit = __edit
+JFeatureStore.commit = __commit
+JFeatureStore.abort = __abort
+JFeatureStore.__call__ = __call
+JFeatureStore.__iter__ = __iter
+JFeatureStore.__len__ = __len
+
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/dataparameter.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/dataparameter.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/dataparameter.py	(revision 1126)
@@ -0,0 +1,20 @@
+
+
+from org.gvsig.fmap.dal.spi import AbstractDataParameters
+
+import dynobject
+
+AbstractDataParameters.setValues = dynobject._setValues
+AbstractDataParameters.getValues = dynobject._getValues
+AbstractDataParameters._get = dynobject._get
+AbstractDataParameters._set = dynobject._set
+
+AbstractDataParameters.__getitem__ = dynobject._getitem
+AbstractDataParameters.__setitem__ = dynobject._setitem
+AbstractDataParameters.__getattr__ = dynobject._getattr
+AbstractDataParameters.__setattr__ = dynobject._setattr
+AbstractDataParameters.__len__ = dynobject._len
+AbstractDataParameters.iteritems = dynobject._iteritems
+AbstractDataParameters.itervalues = dynobject._itervalues
+AbstractDataParameters.iterkeys = dynobject._iterkeys
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/view.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/view.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/view.py	(revision 1126)
@@ -0,0 +1,104 @@
+
+from org.gvsig.app.project.documents.view import DefaultViewDocument as JViewDocument
+from org.gvsig.fmap.mapcontext.layers import FLayers
+from project import currentView, currentProject
+from org.gvsig.app import ApplicationLocator
+from org.gvsig.app.project.documents.view import ViewManager
+from org.gvsig.andami.ui.mdiManager import MDIManager
+
+def __centerView(self, envelope):
+    self.getMapContext().getViewPort().setEnvelope(envelope)
+
+def __showWindow(self, maximize=False, align=None):
+    application = ApplicationLocator.getManager() # Manager app
+    projectManager = application.getProjectManager() # Project manager
+
+    viewManager = projectManager.getDocumentManager(ViewManager.TYPENAME)
+    view = currentProject().getView(self.name)
+    viewin = viewManager.getMainWindow(view, None) #got our view
+    if align==None:
+        application.getUIManager().addWindow(viewin) #open into the project
+    elif isinstance(align, str):
+        attr = getattr(MDIManager, align)
+        application.getUIManager().addWindow(viewin, attr)
+    elif isinstance(align, int):
+        application.getUIManager().addWindow(viewin, align)
+    if maximize:
+        application.getUIManager().setMaximum(viewin, True) #all window size
+
+def __getLayer(self, name=None):
+  layers = self.getMapContext().getLayers()
+  if name != None:
+    return layers.getLayer(name)
+
+  activeLayers = layers.getActives()
+  if len(activeLayers) != 1 :
+    return None
+  for layer in activeLayers:
+    if not isinstance(layer, FLayers):
+      return layer
+  return None
+
+def __getMap(self):
+  return self.getMapContext();
+
+def __addLayer(self, layer):
+  self.getMapContext().getLayers().addLayer(layer)
+
+def __getLayers(self):
+  return self.getMapContext().getLayers()
+
+def __iter(self):
+  return self.getMapContext().getLayers().__iter__()
+
+def __len(self):
+  return self.getMapContext().getLayers().getLayersCount()
+
+def __getitem(self, index):
+  return self.getMapContext().getLayers().getLayer(index)
+
+def __getGraphicsLayer(self):
+  return self.getMapContext().getGraphicsLayer()
+
+def __getProjectionCode(self):
+  return self.getProjection().getFullCode()
+
+def __isProjected(self):
+  self.getProjection().isProjected()
+
+def __call(self):
+  return self
+
+def __getWindowOfView(self):
+    application = ApplicationLocator.getManager()
+    projectManager = application.getProjectManager()
+    viewManager = projectManager.getDocumentManager(ViewManager.TYPENAME)
+    return viewManager.getMainWindow(self,None)
+
+def currentLayer():
+  try:
+    return currentView().getLayer()
+  except:
+    return None
+
+
+#
+# Inject new methods in the class JViewDocument
+#
+JViewDocument.centerView = __centerView
+JViewDocument.showWindow = __showWindow
+JViewDocument.getLayer = __getLayer
+JViewDocument.getLayers = __getLayers
+JViewDocument.getMap = __getMap
+JViewDocument.addLayer = __addLayer
+JViewDocument.getGraphicsLayer = __getGraphicsLayer
+JViewDocument.getProjectionCode = __getProjectionCode
+JViewDocument.isProjected = __isProjected
+JViewDocument.__call__ = __call
+JViewDocument.__iter__ = __iter
+JViewDocument.__len__ = __len
+JViewDocument.__getitem__ = __getitem
+JViewDocument.getWindowOfView = __getWindowOfView
+
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/dynobject.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/dynobject.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/dynobject.py	(revision 1126)
@@ -0,0 +1,101 @@
+
+from org.gvsig.tools.dynobject.impl import DefaultDynObject
+from java.lang import Throwable
+
+def _get(self, name):
+  return self.getDynValue(name)
+
+def _set(self, name, value):
+  self.setDynValue(name, value)
+
+def _setValues(self,*args,**kwargs):
+  if len(args)!=0:
+    if len(args)!=2:
+      raise IllegalArgumentException("Incorrent number of arguments ("+len(args)+"), expected 2.")
+    self.__setitem__(args[0], args[1])
+    return
+  for k,v in kwargs.iteritems():
+    self.__setitem__(k,v)
+
+def _setitem(self,name, value):
+  if self.getDynClass().getDynField(name) == None:
+    raise KeyError(name)
+  self.setDynValue(name, value)
+
+def _setattr(self,name, value):
+  if self.getDynClass().getDynField(name) == None:
+    raise AttributeError(self.__class__.__name__,name)
+  self.setDynValue(name, value)
+
+def _getValues(self):
+  items = dict()
+  for name,value in self.iteritems():
+    items[name] = value
+  return items
+
+def _getitem(self,name):
+  try:
+    return self.getDynValue(name)
+  except Throwable, ex:
+    raise KeyError(name)
+
+def _getattr(self,attributeName):
+  # FIX console error when try to introspect feature object
+  if attributeName == '__methods__':
+      return dict()
+  elif attributeName == '__members__':
+      return self.getValues().keys()
+  elif attributeName == '__dict__':
+      return self.getValues()
+
+  try:
+    #v = getattr(self, attributeName, None)
+    v = self.getDynValue(attributeName)
+    if v == None:
+      v = self.getDynValue(attributeName)
+    return v
+  except Throwable, ex:
+    try:
+        classname = self.getDynClass().getName()
+    except:
+        classname = ""
+    #raise AttributeError(classname,attributeName)
+
+def _len(self):
+  return len(self.getDynClass().getDynFields())
+
+def _iteritems(self):
+  fields = self.getDynClass().getDynFields()
+  for field in fields:
+    name = field.getName()
+    value = self.getDynValue(name)
+    yield name,value
+
+def _itervalues(self):
+  fields = self.getDynClass().getDynFields()
+  for field in fields:
+    name = field.getName()
+    value = self.get(field.getName())
+    yield value
+
+def _iterkeys(self):
+  fields = self.getDynClass().getDynFields()
+  for field in fields:
+    name = field.getName()
+    yield name
+
+#---------
+
+DefaultDynObject.setValues = _setValues
+DefaultDynObject.getValues = _getValues
+DefaultDynObject._get = _get
+DefaultDynObject._set = _set
+
+DefaultDynObject.__getitem__ = _getitem
+DefaultDynObject.__setitem__ = _setitem
+DefaultDynObject.__getattr__ = _getattr
+DefaultDynObject.__setattr__ = _setattr
+DefaultDynObject.__len__ = _len
+DefaultDynObject.iteritems = _iteritems
+DefaultDynObject.itervalues = _itervalues
+DefaultDynObject.iterkeys = _iterkeys
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/mapcontext.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/mapcontext.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/mapcontext.py	(revision 1126)
@@ -0,0 +1,26 @@
+
+
+from org.gvsig.fmap.mapcontext import MapContext as JMapContext
+
+
+def __call(self):
+  return self
+
+def __iter(self):
+    return self.getLayers().__iter__()
+
+def __len(self):
+  return self.getLayers().getLayersCount()
+
+def __getitem(self, index):
+  return self.getLayers().getLayer(index)
+  
+#
+# Inject new methods in the class JMapContext
+#
+
+JMapContext.__call__ = __call
+JMapContext.__iter__ = __iter
+JMapContext.__len__ = __len
+JMapContext.__getitem__ = __getitem
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/uselib.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/uselib.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/uselib.py	(revision 1126)
@@ -0,0 +1,39 @@
+
+
+def use_plugin(pluginName):
+  from org.gvsig.andami import PluginsLocator
+
+  pluginsManager = PluginsLocator.getManager()
+  other = pluginsManager.getPlugin(pluginName)
+  scripting = pluginsManager.getPlugin("org.gvsig.scripting.app.mainplugin")
+  scripting.addDependencyWithPlugin(other)
+
+def use_jar(fname):
+  from org.gvsig.scripting.app.extension import ScriptingExtension
+
+  ScriptingExtension.add_classpath(fname)
+
+def use_libs(folder, isglobal=False):
+  from org.gvsig.scripting import ScriptingLocator
+  import sys
+  if not folder in sys.path:
+    sys.path.append(folder)
+    if isglobal:
+      manager = ScriptingLocator.getManager()
+      global_path = manager.getProperty("jython.global.path")
+      if global_path == None:
+        global_path = list()
+        global_path.append(folder)    
+        manager.setProperty("jython.global.path",global_path)
+      elif not folder in global_path:
+        global_path.append(folder)
+
+def use_jars(base):
+  import os, os.path
+
+  if os.path.isfile(base):
+    base = os.path.dirname(base)
+  for f in os.listdir(base):
+    if f.endswith(".jar"):
+      pathname = os.path.join(base,f)
+      use_jar(pathname)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/editablefeature.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/editablefeature.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/editablefeature.py	(revision 1126)
@@ -0,0 +1,56 @@
+
+from org.gvsig.fmap.dal.feature.impl import DefaultEditableFeature as JEditableFeature
+import feature
+from java.lang import IllegalArgumentException
+from java.lang import RuntimeException
+
+def _setGeometry(self,*args):
+  if len(args)==1:
+    self.setDefaultGeometry(args[0])
+    return
+  if len(args)==2:
+    self.set(args[0],args[1])
+    return
+  raise IllegalArgumentException("Incorrent number of arguments ("+len(args)+"), expected 1 or 2")
+  
+def _setValues(self,*args,**kwargs):
+  if len(args)!=0:
+    if len(args)!=2:
+      raise IllegalArgumentException("Incorrent number of arguments ("+len(args)+"), expected 2.")
+    self.set(args[0],args[1])
+    return
+  for k,v in kwargs.iteritems():
+    self.set(k,v)
+
+def _setitem(self,attributeName, value):
+  return self.set(attributeName,value)
+
+def _setattr(self,attributeName, value):
+  try:
+      self.set(attributeName, value)        
+  except Exception, ex:
+    raise RuntimeException("Can't set the attribute %s of feature (%s)" % (attributeName, str(ex)))    
+
+
+
+#
+# Inject new methods in the class JEditableFeature
+#
+JEditableFeature.getValues = feature._getValues
+JEditableFeature.geometry = feature._geometry
+JEditableFeature.edit = feature._edit
+JEditableFeature.__getitem__ = feature._getitem
+JEditableFeature.__getattr__ = feature._getattr
+JEditableFeature.__call__ = feature._call
+JEditableFeature.__len__ = feature._len
+JEditableFeature.__iter__ = feature._itervalues
+JEditableFeature.itervalues = feature._itervalues
+JEditableFeature.iteritems = feature._iteritems
+JEditableFeature.iterkeys = feature._iterkeys
+
+JEditableFeature.setValues = _setValues
+JEditableFeature.setGeometry = _setGeometry
+JEditableFeature.__setitem__ = _setitem
+JEditableFeature.__setattr__ = _setattr
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/layervectorial.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/layervectorial.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/layervectorial.py	(revision 1126)
@@ -0,0 +1,35 @@
+
+
+from org.gvsig.fmap.mapcontext.layers.vectorial import FLyrVect as JLayerVectorial
+import table
+
+def getProjectionCode(self):
+  projection = self.getProjection()
+  if projection == None:
+    return None
+  return projection.getFullCode()
+
+
+#
+# Inject new methods in the class JLayerVectorial
+#
+JLayerVectorial.createNewFeature = table._createNewFeature
+JLayerVectorial.getProjectionCode = getProjectionCode
+JLayerVectorial.__call__ = table._call
+JLayerVectorial.__iter__ = table._iter_features
+JLayerVectorial.__len__ = table._len_features
+JLayerVectorial.features = table._features
+JLayerVectorial.getSchema = table._getSchema
+JLayerVectorial.updateSchema = table._updateSchema
+JLayerVectorial.append = table._append
+JLayerVectorial.update = table._update
+JLayerVectorial.edit = table._edit
+JLayerVectorial.commit = table._commit
+JLayerVectorial.abort = table._abort
+JLayerVectorial.getSelection = table._getSelection
+JLayerVectorial.select = table._select
+JLayerVectorial.deselect = table._deselect
+JLayerVectorial.isSelected = table._isSelected
+JLayerVectorial.finishEditing = table._commit
+JLayerVectorial.cancelEditing = table._abort
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/table.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/table.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/table.py	(revision 1126)
@@ -0,0 +1,93 @@
+
+
+
+from org.gvsig.app.project.documents.table import TableDocument as JTableDocument
+
+from org.gvsig.fmap.dal import DALLocator
+
+def _features(self, filter = None, sortby="", asc=True):
+  return self.getFeatureStore().features(filter,sortby,asc)
+
+def _iter_features(self):
+  return self.getFeatureStore().getFeatureSet().__iter__()
+
+def _len_features(self):
+  return self.getFeatureStore().getFeatureSet().getSize()
+
+def _edit(self,mode=1):
+  self.getFeatureStore().edit(mode)
+
+def _append(self, *valuesList, **values):
+  self.getFeatureStore().append(*valuesList, **values)
+
+def _updateSchema(self, schema):
+  self.getFeatureStore().update(schema)
+
+def _update(self, feature):
+  self.getFeatureStore().update(feature)
+
+def _getSchema(self):
+  return self.getFeatureStore().getDefaultFeatureType()
+
+def _commit(self):
+  self.getFeatureStore().finishEditing()
+
+def _abort(self):
+  self.getFeatureStore().cancelEditing()
+
+def _getSelection(self):
+  return self.getFeatureStore().getFeatureSelection()
+
+def _select(self, selection):
+  self.getFeatureStore().getFeatureSelection().select(selection)
+
+def _deselect(self, selection):
+  self.getFeatureStore().getFeatureSelection().deselect(selection)
+
+def _isSelected(feature):
+  self.getFeatureStore().getFeatureSelection().isSelect(feature)
+
+def _getFeatureStore(self):
+  return self.getStore()
+
+def _call(self):
+  return self
+
+def _createNewFeature(self, feature=None):
+  if feature == None:
+    return self.getFeatureStore().createNewFeature()
+  else:
+    return self.getFeatureStore().createNewFeature(feature)
+
+def _getWindowOfTable(self):
+    application = ApplicationLocator.getManager()
+    projectManager = application.getProjectManager()
+    tableManager = projectManager.getDocumentManager(TableManager.TYPENAME)
+    return tableManager.getMainWindow(self,None)
+
+
+#
+# Inject new methods in the class JTableDocument
+#
+JTableDocument.createNewFeature = _createNewFeature
+JTableDocument.getFeatureStore = _getFeatureStore
+JTableDocument.__iter__ = _iter_features
+JTableDocument.__len__ = _len_features
+JTableDocument.__call__ = _call
+JTableDocument.features = _features
+JTableDocument.edit = _edit
+JTableDocument.append = _append
+JTableDocument.updateSchema = _updateSchema
+JTableDocument.update = _update
+JTableDocument.getSchema = _getSchema
+JTableDocument.commit = _commit
+JTableDocument.abort = _abort
+JTableDocument.getSelection = _getSelection
+JTableDocument.select = _select
+JTableDocument.deselect = _deselect
+JTableDocument.isSelected = _isSelected
+JTableDocument.finishEditing = _commit
+JTableDocument.cancelEditing = _abort
+JTableDocument.getWindowOfTable = _getWindowOfTable
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/simpleui.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/simpleui.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/simpleui.py	(revision 1126)
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-
+#
+# File: simpleui.py
+#
+# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
+#
+# GNU General Public License (GPL)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+#
+
+__author__ = """Antonio Carrasco Valero
+Model Driven Development sl and Antonio Carrasco Valero
+<carrasco@modeldd.org>"""
+__docformat__ = 'plaintext'
+
+
+from gvsig import *
+
+def loadViewsInCombo(dialog, combo):
+  cleanCombo(dialog, combo)
+  project = currentProject()
+  print "project"
+  views = project.getViews()
+  print "views"
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  print "combo"
+  if combo == None:
+    return
+  print "combo not None"
+  for view in views:
+    print "create view choice"
+    ch = dialog.create("choice")  
+    dialog.setString(ch, "name", view.getName())
+    dialog.setString(ch, "text", view.getName())
+    #FIXME
+    #--------------------
+    
+    dialog.putProperty(ch, "view", View(view))
+    #----------------------
+    dialog.add(combo, ch)
+  print "Finish add combo choices"
+  
+
+def loadLayersInCombo(dialog, combo, viewName):
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  p = currentProject()
+  view = p.getView(viewName)
+
+  if combo == None or view == None:
+    return
+  cleanCombo(dialog, combo)
+  
+  ls = view.getLayers()
+  try:
+    for i in xrange(len(ls)):
+      l = ls.getLayer(i)
+      ch = dialog.create("choice")  
+      dialog.setString(ch, "name", l.getName())
+      dialog.setString(ch, "text", l.getName())    #FIXME
+      #--------------------
+      dialog.putProperty(ch, "layer",Layer(l))
+      #----------------------
+
+      dialog.add(combo, ch)
+  except Exception, ex:
+    print "Error %s"%repr(ex)
+
+  
+  print "Finish add layers combo choices"
+
+def cleanCombo(dialog, combo):
+  print "cleanCombo"
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  if combo == None:
+    return
+  choices = dialog.getItems(combo)
+  if len(choices) >0:
+    for ch in choices:
+      dialog.remove(ch)
+
+def getSelectedView(dialog, combo):
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  choice = dialog.getSelectedItem(combo)
+  if choice == None:
+    return
+  viewName = dialog.getString(choice,"name")
+  #FIXME
+  """
+  project = currentProject()
+  view = project.getView(viewName)
+  """
+  view = dialog.getProperty(choice, "view")
+  return view
+
+def getSelectedViewName(dialog, combo):
+  v = getSelectedView(dialog, combo)
+  return v.getName()
+
+def getSelectedLayer(dialog, combo):
+  if isinstance(combo, str):
+    combo = dialog.find(combo)
+  choice = dialog.getSelectedItem(combo)
+  if choice == None:
+    return
+  #FIXME
+  """
+  layerName = dialog.getString(choice,"name")
+  project = currentProject()
+  layer = project.getView(layerName)
+  """
+  layer = dialog.getProperty(choice,"layer")
+  print layer.getName()
+  return layer
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/editablefeaturetype.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/editablefeaturetype.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/editablefeaturetype.py	(revision 1126)
@@ -0,0 +1,82 @@
+
+
+from org.gvsig.fmap.dal.feature.impl import DefaultEditableFeatureType as JEditableFeatureType
+
+from org.gvsig.fmap.dal import DataTypes
+from org.gvsig.app import ApplicationLocator
+from java.lang import RuntimeException
+
+import featuretype
+
+def _append(self, name, type, size=None, default=None, precision=4):
+  application = ApplicationLocator.getManager()
+  datamanager =  application.getDataManager()
+  dataTypes = application.getDataTypesManager()
+  if isinstance(type, str):
+    try:
+      type = dataTypes.getType(type) # dataType constant value from string
+      type = dataTypes.get(type)
+    except:
+      raise RuntimeError(
+	  "Feature Property Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
+	      type,
+	      name,
+	      type,
+	      size,
+	      default
+	  )
+      )
+  elif isinstance(type, int):
+    try:
+      type = dataTypes.get(type)
+    except:
+      raise RuntimeError(
+	  "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
+	      type,
+	      name,
+	      type,
+	      size,
+	      default
+	  )
+      )
+  elif not isinstance(type,DataType):
+      raise RuntimeError(
+	  "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
+	      type,
+	      name,
+	      type,
+	      size,
+	      default
+	  )
+      )
+
+  attribute = self.add(name, type.getType())
+
+  if size != None:
+    attribute.setSize(size)
+
+  if default != None:
+    attribute.setDefaultValue(default)
+
+  if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
+    attribute.setPrecision(precision)
+
+  if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
+    self.setDefaultGeometryAttributeName(name)
+
+  return attribute
+
+def _setDefaultGeometryType(self, type, dimension):
+    self.getDefaultGeometryAttribute().setGeometryType(type, dimension)
+#
+# Inject new methods in the class JEditableFeatureType
+#
+
+JEditableFeatureType.setDefaultGeometryType = _setDefaultGeometryType
+JEditableFeatureType.__call__ = featuretype._call
+JEditableFeatureType.__iter__ = featuretype._iter
+JEditableFeatureType.__len__ = featuretype._len
+JEditableFeatureType.get = featuretype._get
+JEditableFeatureType.getAttrNames = featuretype._getAttrNames
+JEditableFeatureType.append = _append
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/geom.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/geom.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/geom.py	(revision 1126)
@@ -0,0 +1,339 @@
+# -*- coding: utf-8 -*-
+#
+# File: geom.py
+#
+# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
+#
+# GNU General Public License (GPL)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+#
+
+"""
+Utility functions to manage gvSIG geometries
+"""
+
+__author__ = """Antonio Carrasco Valero
+Model Driven Development sl and Antonio Carrasco Valero
+<carrasco@modeldd.org>
+Victor Acevedo Royer <vacevedo@gvsig.com> <vacevedor@gmail.com>
+"""
+
+__docformat__ = 'plaintext'
+
+
+from org.gvsig.fmap.geom import Geometry, GeometryLocator
+from org.gvsig.tools import ToolsLocator
+from org.gvsig.fmap.geom import Geometry
+from org.gvsig.fmap.geom.primitive import Line, Polygon, Point
+
+#GeometryTypes
+AGGREGATE = Geometry.TYPES.AGGREGATE
+ARC = Geometry.TYPES.ARC
+CIRCLE = Geometry.TYPES.CIRCLE
+CURVE = Geometry.TYPES.CURVE
+ELLIPSE = Geometry.TYPES.ELLIPSE
+ELLIPTICARC = Geometry.TYPES.ELLIPTICARC
+GEOMETRY = Geometry.TYPES.GEOMETRY
+MULTICURVE = Geometry.TYPES.MULTICURVE
+MULTIPOINT = Geometry.TYPES.MULTIPOINT
+MULTISOLID = Geometry.TYPES.MULTISOLID
+MULTISURFACE = Geometry.TYPES.MULTISURFACE
+NULL = Geometry.TYPES.NULL
+POINT = Geometry.TYPES.POINT
+SOLID =  Geometry.TYPES.SOLID
+SPLINE = Geometry.TYPES.SPLINE
+SURFACE = Geometry.TYPES.SURFACE
+
+# Common named geometry types
+POLYGON = Geometry.TYPES.SURFACE
+LINE = Geometry.TYPES.CURVE
+MULTILINE = Geometry.TYPES.MULTICURVE
+MULTIPOLYGON = Geometry.TYPES.MULTISURFACE
+
+# geometrySubTypes
+D2 = Geometry.SUBTYPES.GEOM2D
+D2M = Geometry.SUBTYPES.GEOM2DM
+D3 = Geometry.SUBTYPES.GEOM3D
+D3M = Geometry.SUBTYPES.GEOM3DM
+UNKNOWN = Geometry.SUBTYPES.UNKNOWN
+
+# Dimensions
+DIMENSIONS = Geometry.DIMENSIONS
+
+def createGeometry(type, subtype=D2):
+    """
+    Returns a new geometry with a concrete type and subtype or None if can't
+    create geometry.
+    :param type: geometry type
+    :type type: string
+    :param subtype: geometry subtype
+    :type type: string
+    :return: geometry
+    :rtype: geometry
+    """
+    try:
+        geometryManager = GeometryLocator.getGeometryManager()
+        geometry = geometryManager.create(type, subtype)
+    except:
+        return None
+    return geometry
+
+def createPoint2D(x=None, y=None):
+    if x==None and y==None:
+        return createPoint(D2)
+    elif x==None or y==None:
+        return None
+    else:
+        return createPoint(D2, x, y)
+
+def createLine2D(vertexes=None):
+    if vertexes==None:
+        return createLine(D2)
+    else:
+        return createLine(D2, vertexes)
+
+def createPolygon2D(vertexes=None):
+    if vertexes==None:
+        return createPolygon(D2)
+    else:
+        return createPolygon(D2, vertexes)
+
+
+def createPoint(subtype=D2,*coords):
+    """
+    Returns a new point with a subtype and sets the value for the X, Y, Z and M
+    coordinates (default 0,0,0,0) or None if can't create point
+    :param subtype: geometry type
+    :type subtype: integer
+    :param coords: list of coordinates
+    :type coords: list
+    :return: point
+    :rtype: Geometry
+    """
+
+    geometryManager = GeometryLocator.getGeometryManager()
+    point = geometryManager.create(POINT, subtype)
+
+    try:
+        #If is geometry, transform to a new point type.
+        if len(coords)==0:
+            return point
+        else:
+            # Coords with one parameter
+            # Check if is a Geometry
+
+            if len(coords)==1: #FIXME
+                coords = coords[0]
+
+            if isinstance(coords, Point):
+                return coords
+
+            #Check if object have GET attribute
+            get = getattr(coords,"__getitem__",None)
+            if get != None and len(coords)>=2:
+                if subtype==D2:
+                    point.setCoordinateAt(Geometry.DIMENSIONS.X, get(0))
+                    point.setCoordinateAt(Geometry.DIMENSIONS.Y, get(1))
+                elif subtype==D3:
+                    point.setCoordinateAt(Geometry.DIMENSIONS.X, get(0))
+                    point.setCoordinateAt(Geometry.DIMENSIONS.Y, get(1))
+                    try:
+                        z = get(2)
+                    except:
+                        z = 0
+                    point.setCoordinateAt(Geometry.DIMENSIONS.Z, z)
+                elif subtype==D2M:
+                    point.setCoordinateAt(Geometry.DIMENSIONS.X, get(0))
+                    point.setCoordinateAt(Geometry.DIMENSIONS.Y, get(1))
+                    try:
+                        m = get(2)
+                    except:
+                        m = 0
+                    point.setCoordinateAt(point.getDimension()-1, m)
+                elif subtype==D3M:
+                    point.setCoordinateAt(Geometry.DIMENSIONS.X, get(0))
+                    point.setCoordinateAt(Geometry.DIMENSIONS.Y, get(1))
+                    try:
+                        z = get(2)
+                    except:
+                        z = 0
+                    point.setCoordinateAt(Geometry.DIMENSIONS.Z, z)
+                    try:
+                        m = get(3)
+                    except:
+                        m = 0
+                    point.setCoordinateAt(point.getDimension()-1, m)
+        return point
+    except:
+        return None
+
+
+
+
+
+def createMultiPoint(subtype=D2, points=None):
+    """
+    Returns a new multipoint with a subtype from a list of Points instances.
+    Also values of X and Y tuples like ([x1, y1], [x2, y2], ...., [xn, yn]) are
+    allowed. If not points returns empty multipoint geometry. If can't create
+    geometry return None.
+    :param subtype: geometry type
+    :type subtype: integer
+    :param points: list of points
+    :type points: list
+    :return: multipoint
+    :rtype: multipoint
+    """
+
+    multipoint = createGeometry(MULTIPOINT, subtype)
+    if points!=None:
+        try:
+            for point in points:
+                if isinstance(point, Geometry):
+                    pgeom = point
+                else:
+                    pgeom = createPoint(subtype, point)
+                multipoint.addPrimitive(pgeom)
+        except:
+            return None
+
+    return multipoint
+
+def createPolygon(subtype=D2, vertexes=None):
+    """
+    Returns a new polygon with a subtype. Or None if can't create the geometry
+    :return: polygon
+    :rtype: Geometry
+    """
+    polygon = createGeometry(SURFACE, subtype)
+    if vertexes!= None:
+        try:
+            for vertex in vertexes:
+                vgeom = createPoint(subtype, vertex)
+                polygon.addVertex(vgeom)
+
+        except:
+            return None
+    return polygon
+
+def createMultiPolygon(subtype=D2, polygons=None):
+    """
+    Returns a new multipolygon with a subtype. or None if can't create geometry
+    :return: multipolygon
+    :rtype: Geometry
+    """
+    multipolygon = createGeometry(MULTISURFACE, subtype)
+    if polygons!=None:
+        try:
+            for polygon in polygons:
+                if isinstance(polygon, Polygon): #, Polygon)
+                    pass
+                else:
+                    polygon = createPolygon(subtype=subtype,vertexes=polygon)
+                multipolygon.addPrimitive(polygon)
+        except:
+            return None
+
+    return multipolygon
+
+def createLine(subtype=D2, vertexes=None):
+    """
+    Returns a new line with a subtype or None if can't create geometry
+    :return: polygon
+    :rtype: Geometry
+    """
+    line = createGeometry(CURVE, subtype)
+    if vertexes!=None:
+        try:
+            for vertex in vertexes:
+                v = createPoint(subtype, vertex)
+                line.addVertex(v)
+        except:
+            return None
+
+    return line
+
+def createMultiLine(subtype=D2, lines=None):
+    """
+    Create a new multiline with a subtype or None if can't create geometry
+    :return: multiline
+    :rtype: Geometry
+    """
+    multiline = createGeometry(MULTILINE, subtype)
+    if lines:
+        try:
+            for line in lines:
+                if isinstance(line, Line): #,Line)
+                    pass
+                else:
+                    line = createLine(subtype=subtype, vertexes=line)
+                multiline.addPrimitive(line)
+        except:
+            return None
+
+    return multiline
+
+def createEnvelope(pointMin=None, pointMax=None, dimension=2):
+    """
+    Returns envelope as a minimum bounding box or rectangle. This envelope is
+    equivalent to the GM_Envelope specified in ISO 19107.
+    :param pointMax:
+    :type pointMax: geometry POINT
+    :param pointMin:
+    :type pointMin: geometry POINT
+    :return: envelope
+    :rtype Geometry
+    """
+    # Coord min point
+    get=getattr(pointMin,"__getitem__",None)
+    if get != None:
+        xmin = get(0)
+        ymin = get(1)
+    else:
+        xmin = pointMin.getX()
+        ymin = pointMin.getY()
+
+    # Coord max point
+    get=getattr(pointMax,"__getitem__",None)
+    if get != None:
+        xmax = get(0)
+        ymax = get(1)
+    else:
+        xmax = pointMax.getX()
+        ymax = pointMax.getY()
+
+    geometryManager = GeometryLocator.getGeometryManager()
+    if pointMax!=None and pointMin!=None:
+        envelope = geometryManager.createEnvelope(xmin, ymin, xmax, ymax, dimension)
+    else:
+        envelope = geometryManager.createEnvelope()
+
+    return envelope
+
+
+def createGeometryFromWKT(WKT):
+    """
+    Create geometry from WKT string
+    :param WKT
+    :type WKT: string
+    :return: geometry
+    :rtype: Geometry
+    """
+    geometryManager = GeometryLocator.getGeometryManager()
+    geometry = geometryManager.createFrom(WKT)
+    return geometry
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/commonsdialog.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/commonsdialog.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/commonsdialog.py	(revision 1126)
@@ -0,0 +1,274 @@
+# -*- coding: utf-8 -*-
+#
+# File: commonsdialog.py
+#
+# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
+#
+# GNU General Public License (GPL)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+#
+
+__docformat__ = 'plaintext'
+
+
+from javax.swing import JFileChooser
+from javax.swing.filechooser import FileNameExtensionFilter
+from java.lang import Throwable
+from java.io import File
+
+#from org.gvsig.app import ApplicationLocator
+
+from org.gvsig.andami.ui.mdiFrame import DefaultThreadSafeDialogs
+
+#====================================
+# SWING
+
+#
+#messageType options
+FORBIDEN = 0
+IDEA= 1
+WARNING= 2
+QUESTION= 3
+
+#
+#Confirmdialog optionType Options
+YES_NO = 0
+YES_NO_CANCEL = 1
+ACCEPT_CANCEL = 2
+
+YES = 0
+NO = 1
+CANCEL = 2
+
+#filechooser options
+OPEN_FILE = 0
+OPEN_DIRECTORY = 1
+SAVE_FILE = 2
+
+#filechooser selectionMode
+FILES_ONLY = JFileChooser.FILES_ONLY
+DIRECTORIES_ONLY = JFileChooser.DIRECTORIES_ONLY
+
+
+def msgbox(message, title="", messageType=IDEA, root=None):
+    """Shows a message dialog with ok button only
+    :param message: text to present in the dialog
+    :param title: title of the dialog
+    :param messageType: type of icon to use.
+    """
+    DefaultThreadSafeDialogs(root).messageDialog(message, title, messageType)
+
+
+def inputbox(message, title="", messageType=IDEA, initialValue="", root=None):
+    """
+    Shows a input dialog.
+    :param message: text to present in the dialog
+    :param title: title of the dialog
+    :messageType: type of icon to use
+    :initialValue: Initial value of the inputbox
+    """
+    return DefaultThreadSafeDialogs(root).inputDialog(message, title,
+        messageType, initialValue)
+
+
+def confirmDialog(message, title="", optionType=YES_NO, messageType=IDEA, root=None):
+    """
+    Create a message dialog with options button
+    :param message: text to present in the dialog
+    :param title: title of the dialog
+    :optionType: bottons to show
+    :param messageType: type of icon to use.
+    """
+    #0: yes/no option
+    #1: yes/no/cancelar
+    #2: accept/cancel
+    return DefaultThreadSafeDialogs(root).confirmDialog(message, title,
+        optionType, messageType)
+
+def filechooser(option, title="", initialPath=None,
+        multiselection=False, filter = None, fileHidingEnabled=True, root=None):
+    """
+    Allows configuration parameters to filechooser dialogs
+    :int option: file chooser selection mode. Allowed values:
+        OPEN_FILE, OPEN_DIRECTORY, SAVE_FILE
+    :String title: Window title
+    :String initialPath: Initial path to the directory to open in the dialog
+    :boolean multiselection: Allow select more than one object.
+    :String[] filter: list of acepted extension files ("jpg", "png", "gif")
+    :boolean fileHidingEnabled: True if hidden files are not displayed
+    """
+    #
+    #Values for open files dialog
+    dialogType = JFileChooser.OPEN_DIALOG
+    selectionMode = FILES_ONLY
+
+    if option == SAVE_FILE:
+        dialogType = JFileChooser.SAVE_DIALOG
+    elif option == OPEN_DIRECTORY:
+        selectionMode = DIRECTORIES_ONLY
+
+    initialPath = getJavaFile(initialPath)
+
+    if filter:
+        filter = FileNameExtensionFilter("Files", filter)
+
+    files = DefaultThreadSafeDialogs(root).showChooserDialog(
+            title,
+            dialogType,
+            selectionMode,
+            multiselection,
+            initialPath,
+            filter,
+            fileHidingEnabled)
+
+    try:
+        if files == None:
+            return None
+        elif len(files) <= 0:
+            return None
+        elif multiselection==False:
+            jfile = files[0]
+            if isinstance(jfile, File):
+                return jfile.getAbsolutePath()
+            elif jfile == None:
+                return None
+            else:
+                raise Exception()
+        elif multiselection==True:
+            filePaths = []
+            for jfile in files:
+                if isinstance(jfile, File):
+                    try:
+                        filePaths.append(jfile.getAbsolutePath())
+                    except Throwable, ex:
+                        raise IOError(jfile)
+                else:
+                    raise IOError("Not java.io.File type")
+            return filePaths
+    except Exception, ex:
+        raise IOError(files)
+
+def openFileDialog(title='', initialPath=None, root=None):
+    """
+    Shows a window dialog to choose one file.
+    :param title: Window title. Default ''
+    :type title: string
+    :param initialPath: Initial path to open in window dialog
+    :type initialPath: string
+    """
+
+    files = DefaultThreadSafeDialogs(root).showOpenFileDialog(
+        title,
+        getJavaFile(initialPath))
+
+    if files==None or len(files) <= 0:
+        return None
+
+    filePaths = []
+    for f in files:
+        if isinstance(f, File):
+            filePaths.append(f.getAbsolutePath())
+        else:
+            raise IOError("Not java.io.File type")
+
+    return filePaths
+
+
+def openFolderDialog(title='', initialPath=None, root=None):
+    """
+    Shows a window dialog to choose one folder.
+    :param title: Window title. Default ''
+    :type title: string
+    :param initialPath: Initial path to open in window dialog
+    :type initialPath: string
+    """
+
+    files = DefaultThreadSafeDialogs(None).showOpenDirectoryDialog(
+        title,
+        getJavaFile(initialPath))
+
+    if files==None or len(files) <= 0:
+        return None
+
+    filePaths = []
+    for f in files:
+        if isinstance(f, File):
+            filePaths.append(f.getAbsolutePath())
+        else:
+            raise IOError("Not java.io.File type")
+
+    return filePaths
+
+
+def saveFileDialog(title='', initialPath=None, root=None):
+    """
+    Shows a window dialog to choose one file.
+    :param title: Window title. Default ''
+    :type title: string
+    :param initialPath: Initial path to open in window dialog
+    :type initialPath: string
+    """
+
+    files = DefaultThreadSafeDialogs(root).showSaveFileDialog(
+        title,
+        getJavaFile(initialPath)
+    )
+
+    if files==None or len(files) <= 0:
+        return None
+
+    filePaths = []
+    for f in files:
+        if isinstance(f, File):
+            filePaths.append(f.getAbsolutePath())
+        else:
+            raise IOError("Not java.io.File type")
+
+    return filePaths
+
+
+def getJavaFile(path):
+    """Returns a java File using parameter path.
+    If path doesn't exists looks for user home folder and if can not find it,
+    returns path will be gvSIG instance directory.
+    """
+    #
+    #Needs because DefaultThreadSafeDialogs files methods use a java File
+    #instance as initialPath parameter
+    #
+    import os
+    from java.io import File
+
+    if isinstance(path,File):
+      return path
+
+    if path!=None :
+        path = os.path.normpath(path)
+        if os.path.exists(path):
+            return File(path)
+
+    if os.environ.has_key('HOME'):
+        return File(os.environ.get('HOME', os.getcwd()))
+
+    if os.path.exists(os.path.expanduser("~")):
+        return File(os.path.expanduser("~"))
+
+    return File(os.getcwd())
+
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/feature.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/feature.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/feature.py	(revision 1126)
@@ -0,0 +1,78 @@
+
+
+from org.gvsig.fmap.dal.feature.impl import DefaultFeature as JFeature
+from java.lang import RuntimeException, Throwable
+
+def _geometry(self):
+  return self.getDefaultGeometry()
+
+def _getValues(self):
+  items = dict()
+  for name,value in self.iteritems():
+    items[name] = value
+  return items
+
+def _edit(self):
+  raise Exception("Deprecated method, use import gvSIG_2_0_0 for compatibilitty with gvSIG 2.0.0 or use getEditable method")
+
+def _getitem(self,attributeName):
+  return self.get(attributeName)
+
+def _getattr(self,attributeName):
+  # FIX console error when try to introspect feature object
+  if attributeName in ('__methods__'):
+      return dict()
+  elif attributeName in ('__members__'):
+      return self.getValues().keys()
+  elif attributeName == '__dict__':
+      return self.getValues()
+
+  try:
+    v = self.get(attributeName)
+    return v
+  except Throwable, ex:
+    raise RuntimeException("Can't access to attribute %s of feature (%s)" % (attributeName, str(ex)))
+
+def _call(self):
+  return self
+
+def _len(self):
+  return self.getType().size()
+
+def _iteritems(self):
+  descriptor = self.getType()
+  for attr in descriptor.getAttributeDescriptors():
+    name = attr.getName()
+    value = self.get(attr.getName())
+    yield name,value
+
+def _itervalues(self):
+  descriptor = self.getType()
+  for attr in descriptor.getAttributeDescriptors():
+    name = attr.getName()
+    value = self.get(attr.getName())
+    yield value
+
+def _iterkeys(self):
+  descriptor = self.getType()
+  for attr in descriptor.getAttributeDescriptors():
+    name = attr.getName()
+    yield name
+
+
+#
+# Inject new methods in the class JFeature
+#
+JFeature.getValues = _getValues
+JFeature.geometry = _geometry
+JFeature.edit = _edit
+JFeature.__getitem__ = _getitem
+JFeature.__getattr__ = _getattr
+JFeature.__call__ = _call
+JFeature.__len__ = _len
+JFeature.__iter__ = _itervalues
+JFeature.itervalues = _itervalues
+JFeature.iteritems = _iteritems
+JFeature.iterkeys = _iterkeys
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featuretype.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featuretype.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/gvsig/featuretype.py	(revision 1126)
@@ -0,0 +1,47 @@
+
+
+from org.gvsig.fmap.dal.feature.impl import DefaultFeatureType as JFeatureType
+
+
+def _getitem(self, name):
+  return self.getAttributeDescriptor(name)
+
+def _iter(self):
+  return iter(self.getAttributeDescriptors())
+
+def _len(self):
+  return len(self.getAttributeDescriptors())
+
+def _get(self, name, default=None):
+  x = self.getAttributeDescriptor(name)
+  if x == None:
+    return default
+  return x
+
+def _getAttrNames(self):
+  if not self.getAttributeDescriptors():
+    return None
+
+  return [attr.getName() for attr in self.getAttributeDescriptors()]
+
+def _call(self):
+  return self
+
+def _getDefaultSchemaValues(self):
+    attr = [attr.getName() for attr in self.getAttributeDescriptors()]
+    values = dict.fromkeys(attr)
+    schema = iter(self.getAttributeDescriptors())
+    for s in schema:
+        values[s.name] = s.getDefaultValue()
+    return values
+
+#
+# Inject new methods in the class JFeatureType
+#
+JFeatureType.__call__ = _call
+JFeatureType.__iter__ = _iter
+JFeatureType.__len__ = _len
+JFeatureType.get = _get
+JFeatureType.getAttrNames = _getAttrNames
+JFeatureType.getDefaultSchemaValues = _getDefaultSchemaValues
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/__init__.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""
+pyreverse.extensions
+"""
+
+__revision__ = "$Id $"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/utils.py	(revision 1126)
@@ -0,0 +1,210 @@
+# Copyright (c) 2002-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""
+generic classes/functions for pyreverse core/extensions
+"""
+from __future__ import print_function
+
+import os
+import re
+import sys
+
+########### pyreverse option utils ##############################
+
+
+RCFILE = '.pyreverserc'
+
+def get_default_options():
+    """
+    Read config file and return list of options
+    """
+    options = []
+    home = os.environ.get('HOME', '')
+    if home:
+        rcfile = os.path.join(home, RCFILE)
+        try:
+            options = open(rcfile).read().split()
+        except IOError:
+            pass # ignore if no config file found
+    return options
+
+def insert_default_options():
+    """insert default options to sys.argv
+    """
+    options = get_default_options()
+    options.reverse()
+    for arg in options:
+        sys.argv.insert(1, arg)
+
+
+
+# astroid utilities ###########################################################
+
+SPECIAL = re.compile('^__[A-Za-z0-9]+[A-Za-z0-9_]*__$')
+PRIVATE = re.compile('^__[_A-Za-z0-9]*[A-Za-z0-9]+_?$')
+PROTECTED = re.compile('^_[_A-Za-z0-9]*$')
+
+def get_visibility(name):
+    """return the visibility from a name: public, protected, private or special
+    """
+    if SPECIAL.match(name):
+        visibility = 'special'
+    elif PRIVATE.match(name):
+        visibility = 'private'
+    elif PROTECTED.match(name):
+        visibility = 'protected'
+
+    else:
+        visibility = 'public'
+    return visibility
+
+ABSTRACT = re.compile('^.*Abstract.*')
+FINAL = re.compile('^[A-Z_]*$')
+
+def is_abstract(node):
+    """return true if the given class node correspond to an abstract class
+    definition
+    """
+    return ABSTRACT.match(node.name)
+
+def is_final(node):
+    """return true if the given class/function node correspond to final
+    definition
+    """
+    return FINAL.match(node.name)
+
+def is_interface(node):
+    # bw compat
+    return node.type == 'interface'
+
+def is_exception(node):
+    # bw compat
+    return node.type == 'exception'
+
+
+# Helpers #####################################################################
+
+_CONSTRUCTOR = 1
+_SPECIAL = 2
+_PROTECTED = 4
+_PRIVATE = 8
+MODES = {
+    'ALL'       : 0,
+    'PUB_ONLY'  : _SPECIAL + _PROTECTED + _PRIVATE,
+    'SPECIAL'   : _SPECIAL,
+    'OTHER'     : _PROTECTED + _PRIVATE,
+}
+VIS_MOD = {'special': _SPECIAL, 'protected': _PROTECTED,
+           'private': _PRIVATE, 'public': 0}
+
+
+class FilterMixIn(object):
+    """filter nodes according to a mode and nodes' visibility
+    """
+    def __init__(self, mode):
+        "init filter modes"
+        __mode = 0
+        for nummod in mode.split('+'):
+            try:
+                __mode += MODES[nummod]
+            except KeyError as ex:
+                print('Unknown filter mode %s' % ex, file=sys.stderr)
+        self.__mode = __mode
+
+
+    def show_attr(self, node):
+        """return true if the node should be treated
+        """
+        visibility = get_visibility(getattr(node, 'name', node))
+        return not self.__mode & VIS_MOD[visibility]
+
+
+class ASTWalker(object):
+    """a walker visiting a tree in preorder, calling on the handler:
+
+    * visit_<class name> on entering a node, where class name is the class of
+    the node in lower case
+
+    * leave_<class name> on leaving a node, where class name is the class of
+    the node in lower case
+    """
+
+    def __init__(self, handler):
+        self.handler = handler
+        self._cache = {}
+
+    def walk(self, node, _done=None):
+        """walk on the tree from <node>, getting callbacks from handler"""
+        if _done is None:
+            _done = set()
+        if node in _done:
+            raise AssertionError((id(node), node, node.parent))
+        _done.add(node)
+        self.visit(node)
+        for child_node in node.get_children():
+            assert child_node is not node
+            self.walk(child_node, _done)
+        self.leave(node)
+        assert node.parent is not node
+
+    def get_callbacks(self, node):
+        """get callbacks from handler for the visited node"""
+        klass = node.__class__
+        methods = self._cache.get(klass)
+        if methods is None:
+            handler = self.handler
+            kid = klass.__name__.lower()
+            e_method = getattr(handler, 'visit_%s' % kid,
+                               getattr(handler, 'visit_default', None))
+            l_method = getattr(handler, 'leave_%s' % kid,
+                               getattr(handler, 'leave_default', None))
+            self._cache[klass] = (e_method, l_method)
+        else:
+            e_method, l_method = methods
+        return e_method, l_method
+
+    def visit(self, node):
+        """walk on the tree from <node>, getting callbacks from handler"""
+        method = self.get_callbacks(node)[0]
+        if method is not None:
+            method(node)
+
+    def leave(self, node):
+        """walk on the tree from <node>, getting callbacks from handler"""
+        method = self.get_callbacks(node)[1]
+        if method is not None:
+            method(node)
+
+
+class LocalsVisitor(ASTWalker):
+    """visit a project by traversing the locals dictionary"""
+    def __init__(self):
+        ASTWalker.__init__(self, self)
+        self._visited = {}
+
+    def visit(self, node):
+        """launch the visit starting from the given node"""
+        if node in self._visited:
+            return
+        self._visited[node] = 1 # FIXME: use set ?
+        methods = self.get_callbacks(node)
+        if methods[0] is not None:
+            methods[0](node)
+        if hasattr(node, 'locals'): # skip Instance and other proxy
+            for local_node in node.values():
+                self.visit(local_node)
+        if methods[1] is not None:
+            return methods[1](node)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/vcgutils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/vcgutils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/vcgutils.py	(revision 1126)
@@ -0,0 +1,198 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2008-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# This file was copied from logilab-common with the same license:
+# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+
+"""Functions to generate files readable with Georg Sander's vcg
+(Visualization of Compiler Graphs).
+
+You can download vcg at http://rw4.cs.uni-sb.de/~sander/html/gshome.html
+Note that vcg exists as a debian package.
+
+See vcg's documentation for explanation about the different values that
+maybe used for the functions parameters.
+"""
+
+ATTRS_VAL = {
+    'algos':       ('dfs', 'tree', 'minbackward',
+                    'left_to_right', 'right_to_left',
+                    'top_to_bottom', 'bottom_to_top',
+                    'maxdepth', 'maxdepthslow', 'mindepth', 'mindepthslow',
+                    'mindegree', 'minindegree', 'minoutdegree',
+                    'maxdegree', 'maxindegree', 'maxoutdegree'),
+    'booleans':    ('yes', 'no'),
+    'colors':      ('black', 'white', 'blue', 'red', 'green', 'yellow',
+                    'magenta', 'lightgrey',
+                    'cyan', 'darkgrey', 'darkblue', 'darkred', 'darkgreen',
+                    'darkyellow', 'darkmagenta', 'darkcyan', 'gold',
+                    'lightblue', 'lightred', 'lightgreen', 'lightyellow',
+                    'lightmagenta', 'lightcyan', 'lilac', 'turquoise',
+                    'aquamarine', 'khaki', 'purple', 'yellowgreen', 'pink',
+                    'orange', 'orchid'),
+    'shapes':      ('box', 'ellipse', 'rhomb', 'triangle'),
+    'textmodes':   ('center', 'left_justify', 'right_justify'),
+    'arrowstyles': ('solid', 'line', 'none'),
+    'linestyles':  ('continuous', 'dashed', 'dotted', 'invisible'),
+    }
+
+# meaning of possible values:
+#   O    -> string
+#   1    -> int
+#   list -> value in list
+GRAPH_ATTRS = {
+    'title':              0,
+    'label':              0,
+    'color':               ATTRS_VAL['colors'],
+    'textcolor':           ATTRS_VAL['colors'],
+    'bordercolor':         ATTRS_VAL['colors'],
+    'width':               1,
+    'height':              1,
+    'borderwidth':         1,
+    'textmode':            ATTRS_VAL['textmodes'],
+    'shape':               ATTRS_VAL['shapes'],
+    'shrink':              1,
+    'stretch':             1,
+    'orientation':         ATTRS_VAL['algos'],
+    'vertical_order':      1,
+    'horizontal_order':    1,
+    'xspace':              1,
+    'yspace':              1,
+    'layoutalgorithm':    ATTRS_VAL['algos'],
+    'late_edge_labels':   ATTRS_VAL['booleans'],
+    'display_edge_labels': ATTRS_VAL['booleans'],
+    'dirty_edge_labels':  ATTRS_VAL['booleans'],
+    'finetuning':          ATTRS_VAL['booleans'],
+    'manhattan_edges':     ATTRS_VAL['booleans'],
+    'smanhattan_edges':    ATTRS_VAL['booleans'],
+    'port_sharing':        ATTRS_VAL['booleans'],
+    'edges':               ATTRS_VAL['booleans'],
+    'nodes':               ATTRS_VAL['booleans'],
+    'splines':             ATTRS_VAL['booleans'],
+    }
+NODE_ATTRS = {
+    'title':              0,
+    'label':              0,
+    'color':               ATTRS_VAL['colors'],
+    'textcolor':           ATTRS_VAL['colors'],
+    'bordercolor':         ATTRS_VAL['colors'],
+    'width':               1,
+    'height':              1,
+    'borderwidth':         1,
+    'textmode':            ATTRS_VAL['textmodes'],
+    'shape':               ATTRS_VAL['shapes'],
+    'shrink':              1,
+    'stretch':             1,
+    'vertical_order':      1,
+    'horizontal_order':    1,
+    }
+EDGE_ATTRS = {
+    'sourcename':         0,
+    'targetname':         0,
+    'label':              0,
+    'linestyle':          ATTRS_VAL['linestyles'],
+    'class':              1,
+    'thickness':          0,
+    'color':               ATTRS_VAL['colors'],
+    'textcolor':           ATTRS_VAL['colors'],
+    'arrowcolor':          ATTRS_VAL['colors'],
+    'backarrowcolor':      ATTRS_VAL['colors'],
+    'arrowsize':           1,
+    'backarrowsize':       1,
+    'arrowstyle':          ATTRS_VAL['arrowstyles'],
+    'backarrowstyle':      ATTRS_VAL['arrowstyles'],
+    'textmode':            ATTRS_VAL['textmodes'],
+    'priority':            1,
+    'anchor':              1,
+    'horizontal_order':    1,
+    }
+
+
+# Misc utilities ###############################################################
+
+class VCGPrinter(object):
+    """A vcg graph writer.
+    """
+
+    def __init__(self, output_stream):
+        self._stream = output_stream
+        self._indent = ''
+
+    def open_graph(self, **args):
+        """open a vcg graph
+        """
+        self._stream.write('%sgraph:{\n'%self._indent)
+        self._inc_indent()
+        self._write_attributes(GRAPH_ATTRS, **args)
+
+    def close_graph(self):
+        """close a vcg graph
+        """
+        self._dec_indent()
+        self._stream.write('%s}\n'%self._indent)
+
+
+    def node(self, title, **args):
+        """draw a node
+        """
+        self._stream.write('%snode: {title:"%s"' % (self._indent, title))
+        self._write_attributes(NODE_ATTRS, **args)
+        self._stream.write('}\n')
+
+
+    def edge(self, from_node, to_node, edge_type='', **args):
+        """draw an edge from a node to another.
+        """
+        self._stream.write(
+            '%s%sedge: {sourcename:"%s" targetname:"%s"' % (
+                self._indent, edge_type, from_node, to_node))
+        self._write_attributes(EDGE_ATTRS, **args)
+        self._stream.write('}\n')
+
+
+    # private ##################################################################
+
+    def _write_attributes(self, attributes_dict, **args):
+        """write graph, node or edge attributes
+        """
+        for key, value in args.items():
+            try:
+                _type = attributes_dict[key]
+            except KeyError:
+                raise Exception('''no such attribute %s
+possible attributes are %s''' % (key, attributes_dict.keys()))
+
+            if not _type:
+                self._stream.write('%s%s:"%s"\n' % (self._indent, key, value))
+            elif _type == 1:
+                self._stream.write('%s%s:%s\n' % (self._indent, key,
+                                                  int(value)))
+            elif value in _type:
+                self._stream.write('%s%s:%s\n' % (self._indent, key, value))
+            else:
+                raise Exception('''value %s isn\'t correct for attribute %s
+correct values are %s''' % (value, key, _type))
+
+    def _inc_indent(self):
+        """increment indentation
+        """
+        self._indent = '  %s' % self._indent
+
+    def _dec_indent(self):
+        """decrement indentation
+        """
+        self._indent = self._indent[:-2]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/main.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/main.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/main.py	(revision 1126)
@@ -0,0 +1,147 @@
+# # Copyright (c) 2000-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""
+  %prog [options] <packages>
+
+  create UML diagrams for classes and modules in <packages>
+"""
+from __future__ import print_function
+
+import os
+import subprocess
+import sys
+
+from pylint.config import ConfigurationMixIn
+from pylint.pyreverse.inspector import Linker, project_from_files
+from pylint.pyreverse.diadefslib import DiadefsHandler
+from pylint.pyreverse import writer
+from pylint.pyreverse.utils import insert_default_options
+
+OPTIONS = (
+    ("filter-mode",
+     dict(short='f', default='PUB_ONLY', dest='mode', type='string',
+          action='store', metavar='<mode>',
+          help="""filter attributes and functions according to
+    <mode>. Correct modes are :
+                            'PUB_ONLY' filter all non public attributes
+                                [DEFAULT], equivalent to PRIVATE+SPECIAL_A
+                            'ALL' no filter
+                            'SPECIAL' filter Python special functions
+                                except constructor
+                            'OTHER' filter protected and private
+                                attributes""")),
+
+    ("class",
+     dict(short='c', action="append", metavar="<class>", dest="classes", default=[],
+          help="create a class diagram with all classes related to <class>;\
+ this uses by default the options -ASmy")),
+
+    ("show-ancestors",
+     dict(short="a", action="store", metavar='<ancestor>', type='int',
+          help='show <ancestor> generations of ancestor classes not in <projects>')),
+    ("all-ancestors",
+     dict(short="A", default=None,
+          help="show all ancestors off all classes in <projects>")),
+    ("show-associated",
+     dict(short='s', action="store", metavar='<ass_level>', type='int',
+          help='show <ass_level> levels of associated classes not in <projects>')),
+    ("all-associated",
+     dict(short='S', default=None,
+          help='show recursively all associated off all associated classes')),
+    ("show-builtin",
+     dict(short="b", action="store_true", default=False,
+          help='include builtin objects in representation of classes')),
+
+    ("module-names",
+     dict(short="m", default=None, type='yn', metavar='[yn]',
+          help='include module name in representation of classes')),
+    # TODO : generate dependencies like in pylint
+    # ("package-dependencies",
+    # dict(short="M", action="store", metavar='<package_depth>', type='int',
+    #     help='show <package_depth> module dependencies beyond modules in \
+    # <projects> (for the package diagram)')),
+    ("only-classnames",
+     dict(short='k', action="store_true", default=False,
+          help="don't show attributes and methods in the class boxes; \
+this disables -f values")),
+    ("output", dict(short="o", dest="output_format", action="store",
+                    default="dot", metavar="<format>",
+                    help="create a *.<format> output file if format available.")),
+    ("ignore", {'type' : "csv", 'metavar' : "<file>",
+                'dest' : "black_list", "default" : ('CVS',),
+                'help' : "add <file> (may be a directory) to the black list. "
+                         "It should be a base name, not a path. You may set "
+                         "this option multiple times."}),
+    ("project", {'default': "No Name", 'type' : 'string', 'short': 'p',
+                 'metavar': '<project name>', 'help': 'set the project name.'}),
+)
+# FIXME : quiet mode
+#( ('quiet',
+                #dict(help='run quietly', action='store_true', short='q')), )
+
+def _check_graphviz_available(output_format):
+    """check if we need graphviz for different output format"""
+    try:
+        subprocess.call(['dot', '-V'], stdout=subprocess.PIPE,
+                        stderr=subprocess.PIPE)
+    except OSError:
+        print("The output format '%s' is currently not available.\n"
+              "Please install 'Graphviz' to have other output formats "
+              "than 'dot' or 'vcg'." % output_format)
+        sys.exit(32)
+
+
+
+class Run(ConfigurationMixIn):
+    """base class providing common behaviour for pyreverse commands"""
+
+    options = OPTIONS
+
+    def __init__(self, args):
+        ConfigurationMixIn.__init__(self, usage=__doc__)
+        insert_default_options()
+        args = self.load_command_line_configuration()
+        if self.config.output_format not in ('dot', 'vcg'):
+            _check_graphviz_available(self.config.output_format)
+
+        sys.exit(self.run(args))
+
+    def run(self, args):
+        """checking arguments and run project"""
+        if not args:
+            print(self.help())
+            return 1
+        # insert current working directory to the python path to recognize
+        # dependencies to local modules even if cwd is not in the PYTHONPATH
+        sys.path.insert(0, os.getcwd())
+        try:
+            project = project_from_files(args, project_name=self.config.project,
+                                         black_list=self.config.black_list)
+            linker = Linker(project, tag=True)
+            handler = DiadefsHandler(self.config)
+            diadefs = handler.get_diadefs(project, linker)
+        finally:
+            sys.path.pop(0)
+
+        if self.config.output_format == "vcg":
+            writer.VCGWriter(self.config).write(diadefs)
+        else:
+            writer.DotWriter(self.config).write(diadefs)
+        return 0
+
+
+if __name__ == '__main__':
+    Run(sys.argv[1:])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/diadefslib.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/diadefslib.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/diadefslib.py	(revision 1126)
@@ -0,0 +1,230 @@
+# Copyright (c) 2000-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""handle diagram generation options for class diagram or default diagrams
+"""
+
+from six.moves import builtins
+
+import astroid
+
+from pylint.pyreverse.diagrams import PackageDiagram, ClassDiagram
+from pylint.pyreverse.utils import LocalsVisitor
+
+BUILTINS_NAME = builtins.__name__
+
+# diagram generators ##########################################################
+
+class DiaDefGenerator(object):
+    """handle diagram generation options"""
+
+    def __init__(self, linker, handler):
+        """common Diagram Handler initialization"""
+        self.config = handler.config
+        self._set_default_options()
+        self.linker = linker
+        self.classdiagram = None # defined by subclasses
+
+    def get_title(self, node):
+        """get title for objects"""
+        title = node.name
+        if self.module_names:
+            title = '%s.%s' % (node.root().name, title)
+        return title
+
+    def _set_option(self, option):
+        """activate some options if not explicitly deactivated"""
+        # if we have a class diagram, we want more information by default;
+        # so if the option is None, we return True
+        if option is None:
+            return bool(self.config.classes)
+        return option
+
+    def _set_default_options(self):
+        """set different default options with _default dictionary"""
+        self.module_names = self._set_option(self.config.module_names)
+        all_ancestors = self._set_option(self.config.all_ancestors)
+        all_associated = self._set_option(self.config.all_associated)
+        anc_level, ass_level = (0, 0)
+        if  all_ancestors:
+            anc_level = -1
+        if all_associated:
+            ass_level = -1
+        if self.config.show_ancestors is not None:
+            anc_level = self.config.show_ancestors
+        if self.config.show_associated is not None:
+            ass_level = self.config.show_associated
+        self.anc_level, self.ass_level = anc_level, ass_level
+
+    def _get_levels(self):
+        """help function for search levels"""
+        return self.anc_level, self.ass_level
+
+    def show_node(self, node):
+        """true if builtins and not show_builtins"""
+        if self.config.show_builtin:
+            return True
+        return node.root().name != BUILTINS_NAME
+
+    def add_class(self, node):
+        """visit one class and add it to diagram"""
+        self.linker.visit(node)
+        self.classdiagram.add_object(self.get_title(node), node)
+
+    def get_ancestors(self, node, level):
+        """return ancestor nodes of a class node"""
+        if level == 0:
+            return
+        for ancestor in node.ancestors(recurs=False):
+            if not self.show_node(ancestor):
+                continue
+            yield ancestor
+
+    def get_associated(self, klass_node, level):
+        """return associated nodes of a class node"""
+        if level == 0:
+            return
+        for ass_nodes in list(klass_node.instance_attrs_type.values()) + \
+                         list(klass_node.locals_type.values()):
+            for ass_node in ass_nodes:
+                if isinstance(ass_node, astroid.Instance):
+                    ass_node = ass_node._proxied
+                if not (isinstance(ass_node, astroid.ClassDef)
+                        and self.show_node(ass_node)):
+                    continue
+                yield ass_node
+
+    def extract_classes(self, klass_node, anc_level, ass_level):
+        """extract recursively classes related to klass_node"""
+        if self.classdiagram.has_node(klass_node) or not self.show_node(klass_node):
+            return
+        self.add_class(klass_node)
+
+        for ancestor in self.get_ancestors(klass_node, anc_level):
+            self.extract_classes(ancestor, anc_level-1, ass_level)
+
+        for ass_node in self.get_associated(klass_node, ass_level):
+            self.extract_classes(ass_node, anc_level, ass_level-1)
+
+
+class DefaultDiadefGenerator(LocalsVisitor, DiaDefGenerator):
+    """generate minimum diagram definition for the project :
+
+    * a package diagram including project's modules
+    * a class diagram including project's classes
+    """
+
+    def __init__(self, linker, handler):
+        DiaDefGenerator.__init__(self, linker, handler)
+        LocalsVisitor.__init__(self)
+
+    def visit_project(self, node):
+        """visit an pyreverse.utils.Project node
+
+        create a diagram definition for packages
+        """
+        mode = self.config.mode
+        if len(node.modules) > 1:
+            self.pkgdiagram = PackageDiagram('packages %s' % node.name, mode)
+        else:
+            self.pkgdiagram = None
+        self.classdiagram = ClassDiagram('classes %s' % node.name, mode)
+
+    def leave_project(self, node): # pylint: disable=unused-argument
+        """leave the pyreverse.utils.Project node
+
+        return the generated diagram definition
+        """
+        if self.pkgdiagram:
+            return self.pkgdiagram, self.classdiagram
+        return self.classdiagram,
+
+    def visit_module(self, node):
+        """visit an astroid.Module node
+
+        add this class to the package diagram definition
+        """
+        if self.pkgdiagram:
+            self.linker.visit(node)
+            self.pkgdiagram.add_object(node.name, node)
+
+    def visit_classdef(self, node):
+        """visit an astroid.Class node
+
+        add this class to the class diagram definition
+        """
+        anc_level, ass_level = self._get_levels()
+        self.extract_classes(node, anc_level, ass_level)
+
+    def visit_importfrom(self, node):
+        """visit astroid.From  and catch modules for package diagram
+        """
+        if self.pkgdiagram:
+            self.pkgdiagram.add_from_depend(node, node.modname)
+
+
+class ClassDiadefGenerator(DiaDefGenerator):
+    """generate a class diagram definition including all classes related to a
+    given class
+    """
+
+    def __init__(self, linker, handler):
+        DiaDefGenerator.__init__(self, linker, handler)
+
+    def class_diagram(self, project, klass):
+        """return a class diagram definition for the given klass and its
+        related klasses
+        """
+
+        self.classdiagram = ClassDiagram(klass, self.config.mode)
+        if len(project.modules) > 1:
+            module, klass = klass.rsplit('.', 1)
+            module = project.get_module(module)
+        else:
+            module = project.modules[0]
+            klass = klass.split('.')[-1]
+        klass = next(module.ilookup(klass))
+
+        anc_level, ass_level = self._get_levels()
+        self.extract_classes(klass, anc_level, ass_level)
+        return self.classdiagram
+
+# diagram handler #############################################################
+
+class DiadefsHandler(object):
+    """handle diagram definitions :
+
+    get it from user (i.e. xml files) or generate them
+    """
+
+    def __init__(self, config):
+        self.config = config
+
+    def get_diadefs(self, project, linker):
+        """get the diagrams configuration data
+        :param linker: pyreverse.inspector.Linker(IdGeneratorMixIn, LocalsVisitor)
+        :param project: pyreverse.utils.Project
+        """
+
+        #  read and interpret diagram definitions (Diadefs)
+        diagrams = []
+        generator = ClassDiadefGenerator(linker, self)
+        for klass in self.config.classes:
+            diagrams.append(generator.class_diagram(project, klass))
+        if not diagrams:
+            diagrams = DefaultDiadefGenerator(linker, self).visit(project)
+        for diagram in diagrams:
+            diagram.extract_relationships()
+        return  diagrams
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/inspector.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/inspector.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/inspector.py	(revision 1126)
@@ -0,0 +1,372 @@
+# Copyright (c) 2003-2015 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+# Copyright (c) 2009-2010 Arista Networks, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""
+Visitor doing some postprocessing on the astroid tree.
+Try to resolve definitions (namespace) dictionary, relationship...
+"""
+from __future__ import print_function
+
+import collections
+import os
+import traceback
+
+import astroid
+from astroid import bases
+from astroid import exceptions
+from astroid import manager
+from astroid import modutils
+from astroid import node_classes
+
+
+from pylint.pyreverse import utils
+
+
+def _iface_hdlr(_):
+    """Handler used by interfaces to handle suspicious interface nodes."""
+    return True
+
+
+def _astroid_wrapper(func, modname):
+    print('parsing %s...' % modname)
+    try:
+        return func(modname)
+    except exceptions.AstroidBuildingException as exc:
+        print(exc)
+    except Exception as exc: # pylint: disable=broad-except
+        traceback.print_exc()
+
+
+def interfaces(node, herited=True, handler_func=_iface_hdlr):
+    """Return an iterator on interfaces implemented by the given class node."""
+    # FIXME: what if __implements__ = (MyIFace, MyParent.__implements__)...
+    try:
+        implements = bases.Instance(node).getattr('__implements__')[0]
+    except exceptions.NotFoundError:
+        return
+    if not herited and implements.frame() is not node:
+        return
+    found = set()
+    missing = False
+    for iface in node_classes.unpack_infer(implements):
+        if iface is astroid.YES:
+            missing = True
+            continue
+        if iface not in found and handler_func(iface):
+            found.add(iface)
+            yield iface
+    if missing:
+        raise exceptions.InferenceError()
+
+
+class IdGeneratorMixIn(object):
+    """Mixin adding the ability to generate integer uid."""
+
+    def __init__(self, start_value=0):
+        self.id_count = start_value
+
+    def init_counter(self, start_value=0):
+        """init the id counter
+        """
+        self.id_count = start_value
+
+    def generate_id(self):
+        """generate a new identifier
+        """
+        self.id_count += 1
+        return self.id_count
+
+
+class Linker(IdGeneratorMixIn, utils.LocalsVisitor):
+    """Walk on the project tree and resolve relationships.
+
+    According to options the following attributes may be
+    added to visited nodes:
+
+    * uid,
+      a unique identifier for the node (on astroid.Project, astroid.Module,
+      astroid.Class and astroid.locals_type). Only if the linker
+      has been instantiated with tag=True parameter (False by default).
+
+    * Function
+      a mapping from locals names to their bounded value, which may be a
+      constant like a string or an integer, or an astroid node
+      (on astroid.Module, astroid.Class and astroid.Function).
+
+    * instance_attrs_type
+      as locals_type but for klass member attributes (only on astroid.Class)
+
+    * implements,
+      list of implemented interface _objects_ (only on astroid.Class nodes)
+    """
+
+    def __init__(self, project, inherited_interfaces=0, tag=False):
+        IdGeneratorMixIn.__init__(self)
+        utils.LocalsVisitor.__init__(self)
+        # take inherited interface in consideration or not
+        self.inherited_interfaces = inherited_interfaces
+        # tag nodes or not
+        self.tag = tag
+        # visited project
+        self.project = project
+
+    def visit_project(self, node):
+        """visit an pyreverse.utils.Project node
+
+         * optionally tag the node with a unique id
+        """
+        if self.tag:
+            node.uid = self.generate_id()
+        for module in node.modules:
+            self.visit(module)
+
+    def visit_package(self, node):
+        """visit an astroid.Package node
+
+         * optionally tag the node with a unique id
+        """
+        if self.tag:
+            node.uid = self.generate_id()
+        for subelmt in node.values():
+            self.visit(subelmt)
+
+    def visit_module(self, node):
+        """visit an astroid.Module node
+
+         * set the locals_type mapping
+         * set the depends mapping
+         * optionally tag the node with a unique id
+        """
+        if hasattr(node, 'locals_type'):
+            return
+        node.locals_type = collections.defaultdict(list)
+        node.depends = []
+        if self.tag:
+            node.uid = self.generate_id()
+
+    def visit_classdef(self, node):
+        """visit an astroid.Class node
+
+         * set the locals_type and instance_attrs_type mappings
+         * set the implements list and build it
+         * optionally tag the node with a unique id
+        """
+        if hasattr(node, 'locals_type'):
+            return
+        node.locals_type = collections.defaultdict(list)
+        if self.tag:
+            node.uid = self.generate_id()
+        # resolve ancestors
+        for baseobj in node.ancestors(recurs=False):
+            specializations = getattr(baseobj, 'specializations', [])
+            specializations.append(node)
+            baseobj.specializations = specializations
+        # resolve instance attributes
+        node.instance_attrs_type = collections.defaultdict(list)
+        for assattrs in node.instance_attrs.values():
+            for assattr in assattrs:
+                self.handle_assattr_type(assattr, node)
+        # resolve implemented interface
+        try:
+            node.implements = list(interfaces(node, self.inherited_interfaces))
+        except astroid.InferenceError:
+            node.implements = ()
+
+    def visit_functiondef(self, node):
+        """visit an astroid.Function node
+
+         * set the locals_type mapping
+         * optionally tag the node with a unique id
+        """
+        if hasattr(node, 'locals_type'):
+            return
+        node.locals_type = collections.defaultdict(list)
+        if self.tag:
+            node.uid = self.generate_id()
+
+    link_project = visit_project
+    link_module = visit_module
+    link_class = visit_classdef
+    link_function = visit_functiondef
+
+    def visit_assignname(self, node):
+        """visit an astroid.AssName node
+
+        handle locals_type
+        """
+        # avoid double parsing done by different Linkers.visit
+        # running over the same project:
+        if hasattr(node, '_handled'):
+            return
+        node._handled = True
+        if node.name in node.frame():
+            frame = node.frame()
+        else:
+            # the name has been defined as 'global' in the frame and belongs
+            # there.
+            frame = node.root()
+        try:
+            if not hasattr(frame, 'locals_type'):
+                # If the frame doesn't have a locals_type yet,
+                # it means it wasn't yet visited. Visit it now
+                # to add what's missing from it.
+                if isinstance(frame, astroid.ClassDef):
+                    self.visit_classdef(frame)
+                elif isinstance(frame, astroid.FunctionDef):
+                    self.visit_functiondef(frame)
+                else:
+                    self.visit_module(frame)
+
+            current = frame.locals_type[node.name]
+            values = set(node.infer())
+            frame.locals_type[node.name] = list(set(current) | values)
+        except astroid.InferenceError:
+            pass
+
+    @staticmethod
+    def handle_assattr_type(node, parent):
+        """handle an astroid.AssAttr node
+
+        handle instance_attrs_type
+        """
+        try:
+            values = set(node.infer())
+            current = set(parent.instance_attrs_type[node.attrname])
+            parent.instance_attrs_type[node.attrname] = list(current | values)
+        except astroid.InferenceError:
+            pass
+
+    def visit_import(self, node):
+        """visit an astroid.Import node
+
+        resolve module dependencies
+        """
+        context_file = node.root().file
+        for name in node.names:
+            relative = modutils.is_relative(name[0], context_file)
+            self._imported_module(node, name[0], relative)
+
+    def visit_importfrom(self, node):
+        """visit an astroid.From node
+
+        resolve module dependencies
+        """
+        basename = node.modname
+        context_file = node.root().file
+        if context_file is not None:
+            relative = modutils.is_relative(basename, context_file)
+        else:
+            relative = False
+        for name in node.names:
+            if name[0] == '*':
+                continue
+            # analyze dependencies
+            fullname = '%s.%s' % (basename, name[0])
+            if fullname.find('.') > -1:
+                try:
+                    # TODO: don't use get_module_part,
+                    # missing package precedence
+                    fullname = modutils.get_module_part(fullname,
+                                                        context_file)
+                except ImportError:
+                    continue
+            if fullname != basename:
+                self._imported_module(node, fullname, relative)
+
+    def compute_module(self, context_name, mod_path):
+        """return true if the module should be added to dependencies"""
+        package_dir = os.path.dirname(self.project.path)
+        if context_name == mod_path:
+            return 0
+        elif modutils.is_standard_module(mod_path, (package_dir,)):
+            return 1
+        return 0
+
+    def _imported_module(self, node, mod_path, relative):
+        """Notify an imported module, used to analyze dependencies"""
+        module = node.root()
+        context_name = module.name
+        if relative:
+            mod_path = '%s.%s' % ('.'.join(context_name.split('.')[:-1]),
+                                  mod_path)
+        if self.compute_module(context_name, mod_path):
+            # handle dependencies
+            if not hasattr(module, 'depends'):
+                module.depends = []
+            mod_paths = module.depends
+            if mod_path not in mod_paths:
+                mod_paths.append(mod_path)
+
+
+class Project(object):
+    """a project handle a set of modules / packages"""
+    def __init__(self, name=''):
+        self.name = name
+        self.path = None
+        self.modules = []
+        self.locals = {}
+        self.__getitem__ = self.locals.__getitem__
+        self.__iter__ = self.locals.__iter__
+        self.values = self.locals.values
+        self.keys = self.locals.keys
+        self.items = self.locals.items
+
+    def add_module(self, node):
+        self.locals[node.name] = node
+        self.modules.append(node)
+
+    def get_module(self, name):
+        return self.locals[name]
+
+    def get_children(self):
+        return self.modules
+
+    def __repr__(self):
+        return '<Project %r at %s (%s modules)>' % (self.name, id(self),
+                                                    len(self.modules))
+
+
+def project_from_files(files, func_wrapper=_astroid_wrapper,
+                       project_name="no name",
+                       black_list=('CVS',)):
+    """return a Project from a list of files or modules"""
+    # build the project representation
+    astroid_manager = manager.AstroidManager()
+    project = Project(project_name)
+    for something in files:
+        if not os.path.exists(something):
+            fpath = modutils.file_from_modpath(something.split('.'))
+        elif os.path.isdir(something):
+            fpath = os.path.join(something, '__init__.py')
+        else:
+            fpath = something
+        ast = func_wrapper(astroid_manager.ast_from_file, fpath)
+        if ast is None:
+            continue
+        # XXX why is first file defining the project.path ?
+        project.path = project.path or ast.file
+        project.add_module(ast)
+        base_name = ast.name
+        # recurse in package except if __init__ was explicitly given
+        if ast.package and something.find('__init__') == -1:
+            # recurse on others packages / modules if this is a package
+            for fpath in modutils.get_module_files(os.path.dirname(ast.file),
+                                                   black_list):
+                ast = func_wrapper(astroid_manager.ast_from_file, fpath)
+                if ast is None or ast.name == base_name:
+                    continue
+                project.add_module(ast)
+    return project
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/diagrams.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/diagrams.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/diagrams.py	(revision 1126)
@@ -0,0 +1,258 @@
+# Copyright (c) 2004-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""diagram objects
+"""
+
+import astroid
+from pylint.pyreverse.utils import is_interface, FilterMixIn
+from pylint.checkers.utils import decorated_with_property
+
+
+class Figure(object):
+    """base class for counter handling"""
+
+
+class Relationship(Figure):
+    """a relation ship from an object in the diagram to another
+    """
+    def __init__(self, from_object, to_object, relation_type, name=None):
+        Figure.__init__(self)
+        self.from_object = from_object
+        self.to_object = to_object
+        self.type = relation_type
+        self.name = name
+
+
+class DiagramEntity(Figure):
+    """a diagram object, i.e. a label associated to an astroid node
+    """
+    def __init__(self, title='No name', node=None):
+        Figure.__init__(self)
+        self.title = title
+        self.node = node
+
+
+class ClassDiagram(Figure, FilterMixIn):
+    """main class diagram handling
+    """
+    TYPE = 'class'
+    def __init__(self, title, mode):
+        FilterMixIn.__init__(self, mode)
+        Figure.__init__(self)
+        self.title = title
+        self.objects = []
+        self.relationships = {}
+        self._nodes = {}
+        self.depends = []
+
+    def get_relationships(self, role):
+        # sorted to get predictable (hence testable) results
+        return sorted(self.relationships.get(role, ()),
+                      key=lambda x: (x.from_object.fig_id, x.to_object.fig_id))
+
+    def add_relationship(self, from_object, to_object,
+                         relation_type, name=None):
+        """create a relation ship
+        """
+        rel = Relationship(from_object, to_object, relation_type, name)
+        self.relationships.setdefault(relation_type, []).append(rel)
+
+    def get_relationship(self, from_object, relation_type):
+        """return a relation ship or None
+        """
+        for rel in self.relationships.get(relation_type, ()):
+            if rel.from_object is from_object:
+                return rel
+        raise KeyError(relation_type)
+
+    def get_attrs(self, node):
+        """return visible attributes, possibly with class name"""
+        attrs = []
+        properties = [
+            (n, m) for n, m in node.items()
+            if isinstance(m, astroid.FunctionDef)
+            and decorated_with_property(m)
+        ]
+        for node_name, ass_nodes in list(node.instance_attrs_type.items()) + \
+                                    list(node.locals_type.items()) + properties:
+            if not self.show_attr(node_name):
+                continue
+            names = self.class_names(ass_nodes)
+            if names:
+                node_name = "%s : %s" % (node_name, ", ".join(names))
+            attrs.append(node_name)
+        return sorted(attrs)
+
+    def get_methods(self, node):
+        """return visible methods"""
+        methods = [
+            m for m in node.values()
+            if isinstance(m, astroid.FunctionDef)
+            and not decorated_with_property(m)
+            and self.show_attr(m.name)
+        ]
+        return sorted(methods, key=lambda n: n.name)
+
+    def add_object(self, title, node):
+        """create a diagram object
+        """
+        assert node not in self._nodes
+        ent = DiagramEntity(title, node)
+        self._nodes[node] = ent
+        self.objects.append(ent)
+
+    def class_names(self, nodes):
+        """return class names if needed in diagram"""
+        names = []
+        for ass_node in nodes:
+            if isinstance(ass_node, astroid.Instance):
+                ass_node = ass_node._proxied
+            if isinstance(ass_node, astroid.ClassDef) \
+                and hasattr(ass_node, "name") and not self.has_node(ass_node):
+                if ass_node.name not in names:
+                    ass_name = ass_node.name
+                    names.append(ass_name)
+        return names
+
+    def nodes(self):
+        """return the list of underlying nodes
+        """
+        return self._nodes.keys()
+
+    def has_node(self, node):
+        """return true if the given node is included in the diagram
+        """
+        return node in self._nodes
+
+    def object_from_node(self, node):
+        """return the diagram object mapped to node
+        """
+        return self._nodes[node]
+
+    def classes(self):
+        """return all class nodes in the diagram"""
+        return [o for o in self.objects if isinstance(o.node, astroid.ClassDef)]
+
+    def classe(self, name):
+        """return a class by its name, raise KeyError if not found
+        """
+        for klass in self.classes():
+            if klass.node.name == name:
+                return klass
+        raise KeyError(name)
+
+    def extract_relationships(self):
+        """extract relation ships between nodes in the diagram
+        """
+        for obj in self.classes():
+            node = obj.node
+            obj.attrs = self.get_attrs(node)
+            obj.methods = self.get_methods(node)
+            # shape
+            if is_interface(node):
+                obj.shape = 'interface'
+            else:
+                obj.shape = 'class'
+            # inheritance link
+            for par_node in node.ancestors(recurs=False):
+                try:
+                    par_obj = self.object_from_node(par_node)
+                    self.add_relationship(obj, par_obj, 'specialization')
+                except KeyError:
+                    continue
+            # implements link
+            for impl_node in node.implements:
+                try:
+                    impl_obj = self.object_from_node(impl_node)
+                    self.add_relationship(obj, impl_obj, 'implements')
+                except KeyError:
+                    continue
+            # associations link
+            for name, values in list(node.instance_attrs_type.items()) + \
+                                list(node.locals_type.items()):
+                for value in values:
+                    if value is astroid.YES:
+                        continue
+                    if isinstance(value, astroid.Instance):
+                        value = value._proxied
+                    try:
+                        ass_obj = self.object_from_node(value)
+                        self.add_relationship(ass_obj, obj, 'association', name)
+                    except KeyError:
+                        continue
+
+
+class PackageDiagram(ClassDiagram):
+    """package diagram handling
+    """
+    TYPE = 'package'
+
+    def modules(self):
+        """return all module nodes in the diagram"""
+        return [o for o in self.objects if isinstance(o.node, astroid.Module)]
+
+    def module(self, name):
+        """return a module by its name, raise KeyError if not found
+        """
+        for mod in self.modules():
+            if mod.node.name == name:
+                return mod
+        raise KeyError(name)
+
+    def get_module(self, name, node):
+        """return a module by its name, looking also for relative imports;
+        raise KeyError if not found
+        """
+        for mod in self.modules():
+            mod_name = mod.node.name
+            if mod_name == name:
+                return mod
+            #search for fullname of relative import modules
+            package = node.root().name
+            if mod_name == "%s.%s" % (package, name):
+                return mod
+            if mod_name == "%s.%s" % (package.rsplit('.', 1)[0], name):
+                return mod
+        raise KeyError(name)
+
+    def add_from_depend(self, node, from_module):
+        """add dependencies created by from-imports
+        """
+        mod_name = node.root().name
+        obj = self.module(mod_name)
+        if from_module not in obj.node.depends:
+            obj.node.depends.append(from_module)
+
+    def extract_relationships(self):
+        """extract relation ships between nodes in the diagram
+        """
+        ClassDiagram.extract_relationships(self)
+        for obj in self.classes():
+            # ownership
+            try:
+                mod = self.object_from_node(obj.node.root())
+                self.add_relationship(obj, mod, 'ownership')
+            except KeyError:
+                continue
+        for obj in self.modules():
+            obj.shape = 'package'
+            # dependencies
+            for dep_name in obj.node.depends:
+                try:
+                    dep = self.get_module(dep_name, obj.node)
+                except KeyError:
+                    continue
+                self.add_relationship(obj, dep, 'depends')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/writer.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/writer.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/pyreverse/writer.py	(revision 1126)
@@ -0,0 +1,198 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2008-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Utilities for creating VCG and Dot diagrams"""
+
+from pylint.pyreverse.utils import is_exception
+from pylint.pyreverse.vcgutils import VCGPrinter
+from pylint.graph import DotBackend
+
+class DiagramWriter(object):
+    """base class for writing project diagrams
+    """
+    def __init__(self, config, styles):
+        self.config = config
+        self.pkg_edges, self.inh_edges, self.imp_edges, self.ass_edges = styles
+        self.printer = None # defined in set_printer
+
+    def write(self, diadefs):
+        """write files for <project> according to <diadefs>
+        """
+        for diagram in diadefs:
+            basename = diagram.title.strip().replace(' ', '_')
+            file_name = '%s.%s' % (basename, self.config.output_format)
+            self.set_printer(file_name, basename)
+            if diagram.TYPE == 'class':
+                self.write_classes(diagram)
+            else:
+                self.write_packages(diagram)
+            self.close_graph()
+
+    def write_packages(self, diagram):
+        """write a package diagram"""
+        # sorted to get predictable (hence testable) results
+        for i, obj in enumerate(sorted(diagram.modules(), key=lambda x: x.title)):
+            self.printer.emit_node(i, label=self.get_title(obj), shape='box')
+            obj.fig_id = i
+        # package dependencies
+        for rel in diagram.get_relationships('depends'):
+            self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
+                                   **self.pkg_edges)
+
+    def write_classes(self, diagram):
+        """write a class diagram"""
+        # sorted to get predictable (hence testable) results
+        for i, obj in enumerate(sorted(diagram.objects, key=lambda x: x.title)):
+            self.printer.emit_node(i, **self.get_values(obj))
+            obj.fig_id = i
+        # inheritance links
+        for rel in diagram.get_relationships('specialization'):
+            self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
+                                   **self.inh_edges)
+        # implementation links
+        for rel in diagram.get_relationships('implements'):
+            self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
+                                   **self.imp_edges)
+        # generate associations
+        for rel in diagram.get_relationships('association'):
+            self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
+                                   label=rel.name, **self.ass_edges)
+
+    def set_printer(self, file_name, basename):
+        """set printer"""
+        raise NotImplementedError
+
+    def get_title(self, obj):
+        """get project title"""
+        raise NotImplementedError
+
+    def get_values(self, obj):
+        """get label and shape for classes."""
+        raise NotImplementedError
+
+    def close_graph(self):
+        """finalize the graph"""
+        raise NotImplementedError
+
+
+class DotWriter(DiagramWriter):
+    """write dot graphs from a diagram definition and a project
+    """
+
+    def __init__(self, config):
+        styles = [dict(arrowtail='none', arrowhead="open"),
+                  dict(arrowtail='none', arrowhead='empty'),
+                  dict(arrowtail='node', arrowhead='empty', style='dashed'),
+                  dict(fontcolor='green', arrowtail='none',
+                       arrowhead='diamond', style='solid'),
+                 ]
+        DiagramWriter.__init__(self, config, styles)
+
+    def set_printer(self, file_name, basename):
+        """initialize DotWriter and add options for layout.
+        """
+        layout = dict(rankdir="BT")
+        self.printer = DotBackend(basename, additional_param=layout)
+        self.file_name = file_name
+
+    def get_title(self, obj):
+        """get project title"""
+        return obj.title
+
+    def get_values(self, obj):
+        """get label and shape for classes.
+
+        The label contains all attributes and methods
+        """
+        label = obj.title
+        if obj.shape == 'interface':
+            label = u'«interface»\\n%s' % label
+        if not self.config.only_classnames:
+            label = r'%s|%s\l|' % (label, r'\l'.join(obj.attrs))
+            for func in obj.methods:
+                label = r'%s%s()\l' % (label, func.name)
+            label = '{%s}' % label
+        if is_exception(obj.node):
+            return dict(fontcolor='red', label=label, shape='record')
+        return dict(label=label, shape='record')
+
+    def close_graph(self):
+        """print the dot graph into <file_name>"""
+        self.printer.generate(self.file_name)
+
+
+class VCGWriter(DiagramWriter):
+    """write vcg graphs from a diagram definition and a project
+    """
+    def __init__(self, config):
+        styles = [dict(arrowstyle='solid', backarrowstyle='none',
+                       backarrowsize=0),
+                  dict(arrowstyle='solid', backarrowstyle='none',
+                       backarrowsize=10),
+                  dict(arrowstyle='solid', backarrowstyle='none',
+                       linestyle='dotted', backarrowsize=10),
+                  dict(arrowstyle='solid', backarrowstyle='none',
+                       textcolor='green'),
+                 ]
+        DiagramWriter.__init__(self, config, styles)
+
+    def set_printer(self, file_name, basename):
+        """initialize VCGWriter for a UML graph"""
+        self.graph_file = open(file_name, 'w+')
+        self.printer = VCGPrinter(self.graph_file)
+        self.printer.open_graph(title=basename, layoutalgorithm='dfs',
+                                late_edge_labels='yes', port_sharing='no',
+                                manhattan_edges='yes')
+        self.printer.emit_node = self.printer.node
+        self.printer.emit_edge = self.printer.edge
+
+    def get_title(self, obj):
+        """get project title in vcg format"""
+        return r'\fb%s\fn' % obj.title
+
+    def get_values(self, obj):
+        """get label and shape for classes.
+
+        The label contains all attributes and methods
+        """
+        if is_exception(obj.node):
+            label = r'\fb\f09%s\fn' % obj.title
+        else:
+            label = r'\fb%s\fn' % obj.title
+        if obj.shape == 'interface':
+            shape = 'ellipse'
+        else:
+            shape = 'box'
+        if not self.config.only_classnames:
+            attrs = obj.attrs
+            methods = [func.name for func in obj.methods]
+            # box width for UML like diagram
+            maxlen = max(len(name) for name in [obj.title] + methods + attrs)
+            line = '_' * (maxlen + 2)
+            label = r'%s\n\f%s' % (label, line)
+            for attr in attrs:
+                label = r'%s\n\f08%s' % (label, attr)
+            if attrs:
+                label = r'%s\n\f%s' % (label, line)
+            for func in methods:
+                label = r'%s\n\f10%s()' % (label, func)
+        return dict(label=label, shape=shape)
+
+    def close_graph(self):
+        """close graph and file"""
+        self.printer.close_graph()
+        self.graph_file.close()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/html.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/html.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/html.py	(revision 1126)
@@ -0,0 +1,108 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""HTML reporter"""
+
+import itertools
+import string
+import sys
+
+import six
+
+from pylint.interfaces import IReporter
+from pylint.reporters import BaseReporter
+from pylint.reporters.ureports.html_writer import HTMLWriter
+from pylint.reporters.ureports.nodes import Section, Table
+
+
+class HTMLReporter(BaseReporter):
+    """report messages and layouts in HTML"""
+
+    __implements__ = IReporter
+    name = 'html'
+    extension = 'html'
+
+    def __init__(self, output=sys.stdout):
+        BaseReporter.__init__(self, output)
+        self.msgs = []
+        # Add placeholders for title and parsed messages
+        self.header = None
+        self.msgargs = []
+
+    @staticmethod
+    def _parse_msg_template(msg_template):
+        formatter = string.Formatter()
+        parsed = formatter.parse(msg_template)
+        for item in parsed:
+            if item[1]:
+                yield item[1]
+
+    def _parse_template(self):
+        """Helper function to parse the message template"""
+        self.header = []
+        if self.linter.config.msg_template:
+            msg_template = self.linter.config.msg_template
+        else:
+            msg_template = '{category}{module}{obj}{line}{column}{msg}'
+
+        _header, _msgs = itertools.tee(self._parse_msg_template(msg_template))
+        self.header = list(_header)
+        self.msgargs = list(_msgs)
+
+    def handle_message(self, msg):
+        """manage message of different type and in the context of path"""
+
+        # It would be better to do this in init, but currently we do not
+        # have access to the linter (as it is setup in lint.set_reporter()
+        # Therefore we try to parse just the once.
+        if self.header is None:
+            self._parse_template()
+
+        # We want to add the lines given by the template
+        values = [getattr(msg, field) for field in self.msgargs]
+        self.msgs += [value if isinstance(value, six.text_type) else str(value)
+                      for value in values]
+
+    def set_output(self, output=None):
+        """set output stream
+
+        messages buffered for old output is processed first"""
+        if self.out and self.msgs:
+            self._display(Section())
+        BaseReporter.set_output(self, output)
+
+    def _display(self, layout):
+        """launch layouts display
+
+        overridden from BaseReporter to add insert the messages section
+        (in add_message, message is not displayed, just collected so it
+        can be displayed in an html table)
+        """
+        HTMLWriter().format(layout, self.out)
+
+    def display_messages(self, layout):
+        if self.msgs:
+            # add stored messages to the layout
+            msgs = self.header
+            cols = len(self.header)
+            msgs += self.msgs
+            sect = Section('Messages')
+            layout.append(sect)
+            sect.append(Table(cols=cols, children=msgs, rheaders=1))
+            self.msgs = []
+            self._display(layout)
+
+
+def register(linter):
+    """Register the reporter classes with the linter."""
+    linter.register_reporter(HTMLReporter)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/text.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/text.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/text.py	(revision 1126)
@@ -0,0 +1,237 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Plain text reporters:
+
+:text: the default one grouping messages by module
+:colorized: an ANSI colorized text reporter
+"""
+from __future__ import print_function
+
+import warnings
+import sys
+
+import six
+
+from pylint.interfaces import IReporter
+from pylint.reporters import BaseReporter
+from pylint import utils
+from pylint.reporters.ureports.text_writer import TextWriter
+
+
+TITLE_UNDERLINES = ['', '=', '-', '.']
+
+ANSI_PREFIX = '\033['
+ANSI_END = 'm'
+ANSI_RESET = '\033[0m'
+ANSI_STYLES = {
+    'reset': "0",
+    'bold': "1",
+    'italic': "3",
+    'underline': "4",
+    'blink': "5",
+    'inverse': "7",
+    'strike': "9",
+}
+ANSI_COLORS = {
+    'reset': "0",
+    'black': "30",
+    'red': "31",
+    'green': "32",
+    'yellow': "33",
+    'blue': "34",
+    'magenta': "35",
+    'cyan': "36",
+    'white': "37",
+}
+
+def _get_ansi_code(color=None, style=None):
+    """return ansi escape code corresponding to color and style
+
+    :type color: str or None
+    :param color:
+      the color name (see `ANSI_COLORS` for available values)
+      or the color number when 256 colors are available
+
+    :type style: str or None
+    :param style:
+      style string (see `ANSI_COLORS` for available values). To get
+      several style effects at the same time, use a coma as separator.
+
+    :raise KeyError: if an unexistent color or style identifier is given
+
+    :rtype: str
+    :return: the built escape code
+    """
+    ansi_code = []
+    if style:
+        style_attrs = utils._splitstrip(style)
+        for effect in style_attrs:
+            ansi_code.append(ANSI_STYLES[effect])
+    if color:
+        if color.isdigit():
+            ansi_code.extend(['38', '5'])
+            ansi_code.append(color)
+        else:
+            ansi_code.append(ANSI_COLORS[color])
+    if ansi_code:
+        return ANSI_PREFIX + ';'.join(ansi_code) + ANSI_END
+    return ''
+
+def colorize_ansi(msg, color=None, style=None):
+    """colorize message by wrapping it with ansi escape codes
+
+    :type msg: str or unicode
+    :param msg: the message string to colorize
+
+    :type color: str or None
+    :param color:
+      the color identifier (see `ANSI_COLORS` for available values)
+
+    :type style: str or None
+    :param style:
+      style string (see `ANSI_COLORS` for available values). To get
+      several style effects at the same time, use a coma as separator.
+
+    :raise KeyError: if an unexistent color or style identifier is given
+
+    :rtype: str or unicode
+    :return: the ansi escaped string
+    """
+    # If both color and style are not defined, then leave the text as is
+    if color is None and style is None:
+        return msg
+    escape_code = _get_ansi_code(color, style)
+    # If invalid (or unknown) color, don't wrap msg with ansi codes
+    if escape_code:
+        return '%s%s%s' % (escape_code, msg, ANSI_RESET)
+    return msg
+
+
+class TextReporter(BaseReporter):
+    """reports messages and layouts in plain text"""
+
+    __implements__ = IReporter
+    name = 'text'
+    extension = 'txt'
+    line_format = '{C}:{line:3d},{column:2d}: {msg} ({symbol})'
+
+    def __init__(self, output=None):
+        BaseReporter.__init__(self, output)
+        self._modules = set()
+        self._template = None
+
+    def on_set_current_module(self, module, filepath):
+        self._template = six.text_type(self.linter.config.msg_template or self.line_format)
+
+    def write_message(self, msg):
+        """Convenience method to write a formated message with class default template"""
+        self.writeln(msg.format(self._template))
+
+    def handle_message(self, msg):
+        """manage message of different type and in the context of path"""
+        if msg.module not in self._modules:
+            if msg.module:
+                self.writeln('************* Module %s' % msg.module)
+                self._modules.add(msg.module)
+            else:
+                self.writeln('************* ')
+        self.write_message(msg)
+
+    def _display(self, layout):
+        """launch layouts display"""
+        print(file=self.out)
+        TextWriter().format(layout, self.out)
+
+
+class ParseableTextReporter(TextReporter):
+    """a reporter very similar to TextReporter, but display messages in a form
+    recognized by most text editors :
+
+    <filename>:<linenum>:<msg>
+    """
+    name = 'parseable'
+    line_format = '{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}'
+
+    def __init__(self, output=None):
+        warnings.warn('%s output format is deprecated. This is equivalent '
+                      'to --msg-template=%s' % (self.name, self.line_format),
+                      DeprecationWarning)
+        TextReporter.__init__(self, output)
+
+
+class VSTextReporter(ParseableTextReporter):
+    """Visual studio text reporter"""
+    name = 'msvs'
+    line_format = '{path}({line}): [{msg_id}({symbol}){obj}] {msg}'
+
+
+class ColorizedTextReporter(TextReporter):
+    """Simple TextReporter that colorizes text output"""
+
+    name = 'colorized'
+    COLOR_MAPPING = {
+        "I" : ("green", None),
+        'C' : (None, "bold"),
+        'R' : ("magenta", "bold, italic"),
+        'W' : ("blue", None),
+        'E' : ("red", "bold"),
+        'F' : ("red", "bold, underline"),
+        'S' : ("yellow", "inverse"), # S stands for module Separator
+    }
+
+    def __init__(self, output=None, color_mapping=None):
+        TextReporter.__init__(self, output)
+        self.color_mapping = color_mapping or \
+                             dict(ColorizedTextReporter.COLOR_MAPPING)
+        if sys.platform == 'win32':
+            import colorama
+            self.out = colorama.AnsiToWin32(self.out)
+
+    def _get_decoration(self, msg_id):
+        """Returns the tuple color, style associated with msg_id as defined
+        in self.color_mapping
+        """
+        try:
+            return self.color_mapping[msg_id[0]]
+        except KeyError:
+            return None, None
+
+    def handle_message(self, msg):
+        """manage message of different types, and colorize output
+        using ansi escape codes
+        """
+        if msg.module not in self._modules:
+            color, style = self._get_decoration('S')
+            if msg.module:
+                modsep = colorize_ansi('************* Module %s' % msg.module,
+                                       color, style)
+            else:
+                modsep = colorize_ansi('************* %s' % msg.module,
+                                       color, style)
+            self.writeln(modsep)
+            self._modules.add(msg.module)
+        color, style = self._get_decoration(msg.C)
+
+        msg = msg._replace(
+            **{attr: colorize_ansi(getattr(msg, attr), color, style)
+               for attr in ('msg', 'symbol', 'category', 'C')})
+        self.write_message(msg)
+
+
+def register(linter):
+    """Register the reporter classes with the linter."""
+    linter.register_reporter(TextReporter)
+    linter.register_reporter(ParseableTextReporter)
+    linter.register_reporter(VSTextReporter)
+    linter.register_reporter(ColorizedTextReporter)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/guireporter.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/guireporter.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/guireporter.py	(revision 1126)
@@ -0,0 +1,27 @@
+""" reporter used by gui.py """
+
+import sys
+
+from pylint.interfaces import IReporter
+from pylint.reporters import BaseReporter
+from pylint.reporters.ureports.text_writer import TextWriter
+
+
+class GUIReporter(BaseReporter):
+    """saves messages"""
+
+    __implements__ = IReporter
+    extension = ''
+
+    def __init__(self, gui, output=sys.stdout):
+        """init"""
+        BaseReporter.__init__(self, output)
+        self.gui = gui
+
+    def handle_message(self, msg):
+        """manage message of different type and in the context of path"""
+        self.gui.msg_queue.put(msg)
+
+    def _display(self, layout):
+        """launch layouts display"""
+        TextWriter().format(layout, self.out)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/json.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/json.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/json.py	(revision 1126)
@@ -0,0 +1,64 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""JSON reporter"""
+from __future__ import absolute_import, print_function
+
+import cgi
+import json
+import sys
+
+from pylint.interfaces import IReporter
+from pylint.reporters import BaseReporter
+
+
+class JSONReporter(BaseReporter):
+    """Report messages and layouts in JSON."""
+
+    __implements__ = IReporter
+    name = 'json'
+    extension = 'json'
+
+    def __init__(self, output=sys.stdout):
+        BaseReporter.__init__(self, output)
+        self.messages = []
+
+    def handle_message(self, message):
+        """Manage message of different type and in the context of path."""
+        self.messages.append({
+            'type': message.category,
+            'module': message.module,
+            'obj': message.obj,
+            'line': message.line,
+            'column': message.column,
+            'path': message.path,
+            'symbol': message.symbol,
+            # pylint: disable=deprecated-method; deprecated since 3.2.
+            'message': cgi.escape(message.msg or ''),
+        })
+
+    def display_messages(self, layout):
+        """Launch layouts display"""
+        if self.messages:
+            print(json.dumps(self.messages, indent=4), file=self.out)
+
+    def display_reports(self, _):
+        """Don't do nothing in this reporter."""
+
+    def _display(self, layout):
+        """Don't do nothing."""
+
+
+def register(linter):
+    """Register the reporter classes with the linter."""
+    linter.register_reporter(JSONReporter)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/nodes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/nodes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/nodes.py	(revision 1126)
@@ -0,0 +1,181 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of pylint.
+#
+# pylint is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# pylint is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with pylint.  If not, see <http://www.gnu.org/licenses/>.
+"""Micro reports objects.
+
+A micro report is a tree of layout and content objects.
+"""
+
+from six import string_types
+
+
+class VNode(object):
+
+    def __init__(self, nid=None):
+        self.id = nid
+        # navigation
+        self.parent = None
+        self.children = []
+
+    def __iter__(self):
+        return iter(self.children)
+
+    def append(self, child):
+        """add a node to children"""
+        self.children.append(child)
+        child.parent = self
+
+    def insert(self, index, child):
+        """insert a child node"""
+        self.children.insert(index, child)
+        child.parent = self
+
+    def _get_visit_name(self):
+        """
+        return the visit name for the mixed class. When calling 'accept', the
+        method <'visit_' + name returned by this method> will be called on the
+        visitor
+        """
+        try:
+            return self.TYPE.replace('-', '_')
+        except Exception:
+            return self.__class__.__name__.lower()
+
+    def accept(self, visitor, *args, **kwargs):
+        func = getattr(visitor, 'visit_%s' % self._get_visit_name())
+        return func(self, *args, **kwargs)
+
+    def leave(self, visitor, *args, **kwargs):
+        func = getattr(visitor, 'leave_%s' % self._get_visit_name())
+        return func(self, *args, **kwargs)
+
+
+class BaseLayout(VNode):
+    """base container node
+
+    attributes
+    * children : components in this table (i.e. the table's cells)
+    """
+    def __init__(self, children=(), **kwargs):
+        super(BaseLayout, self).__init__(**kwargs)
+        for child in children:
+            if isinstance(child, VNode):
+                self.append(child)
+            else:
+                self.add_text(child)
+
+    def append(self, child):
+        """overridden to detect problems easily"""
+        assert child not in self.parents()
+        VNode.append(self, child)
+
+    def parents(self):
+        """return the ancestor nodes"""
+        assert self.parent is not self
+        if self.parent is None:
+            return []
+        return [self.parent] + self.parent.parents()
+
+    def add_text(self, text):
+        """shortcut to add text data"""
+        self.children.append(Text(text))
+
+
+# non container nodes #########################################################
+
+class Text(VNode):
+    """a text portion
+
+    attributes :
+    * data : the text value as an encoded or unicode string
+    """
+    def __init__(self, data, escaped=True, **kwargs):
+        super(Text, self).__init__(**kwargs)
+        #if isinstance(data, unicode):
+        #    data = data.encode('ascii')
+        assert isinstance(data, string_types), data.__class__
+        self.escaped = escaped
+        self.data = data
+
+
+class VerbatimText(Text):
+    """a verbatim text, display the raw data
+
+    attributes :
+    * data : the text value as an encoded or unicode string
+    """
+
+# container nodes #############################################################
+
+class Section(BaseLayout):
+    """a section
+
+    attributes :
+    * BaseLayout attributes
+
+    a title may also be given to the constructor, it'll be added
+    as a first element
+    a description may also be given to the constructor, it'll be added
+    as a first paragraph
+    """
+    def __init__(self, title=None, description=None, **kwargs):
+        super(Section, self).__init__(**kwargs)
+        if description:
+            self.insert(0, Paragraph([Text(description)]))
+        if title:
+            self.insert(0, Title(children=(title,)))
+
+
+class Title(BaseLayout):
+    """a title
+
+    attributes :
+    * BaseLayout attributes
+
+    A title must not contains a section nor a paragraph!
+    """
+
+
+class Paragraph(BaseLayout):
+    """a simple text paragraph
+
+    attributes :
+    * BaseLayout attributes
+
+    A paragraph must not contains a section !
+    """
+
+
+class Table(BaseLayout):
+    """some tabular data
+
+    attributes :
+    * BaseLayout attributes
+    * cols : the number of columns of the table (REQUIRED)
+    * rheaders : the first row's elements are table's header
+    * cheaders : the first col's elements are table's header
+    * title : the table's optional title
+    """
+    def __init__(self, cols, title=None,
+                 rheaders=0, cheaders=0,
+                 **kwargs):
+        super(Table, self).__init__(**kwargs)
+        assert isinstance(cols, int)
+        self.cols = cols
+        self.title = title
+        self.rheaders = rheaders
+        self.cheaders = cheaders
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/__init__.py	(revision 1126)
@@ -0,0 +1,106 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of pylint.
+#
+# pylint is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# pylint is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with pylint.  If not, see <http://www.gnu.org/licenses/>.
+"""Universal report objects and some formatting drivers.
+
+A way to create simple reports using python objects, primarily designed to be
+formatted as text and html.
+"""
+import os
+import sys
+
+import six
+
+
+class BaseWriter(object):
+    """base class for ureport writers"""
+
+    def format(self, layout, stream=None, encoding=None):
+        """format and write the given layout into the stream object
+
+        unicode policy: unicode strings may be found in the layout;
+        try to call stream.write with it, but give it back encoded using
+        the given encoding if it fails
+        """
+        if stream is None:
+            stream = sys.stdout
+        if not encoding:
+            encoding = getattr(stream, 'encoding', 'UTF-8')
+        self.encoding = encoding or 'UTF-8'
+        self.out = stream
+        self.begin_format()
+        layout.accept(self)
+        self.end_format()
+
+    def format_children(self, layout):
+        """recurse on the layout children and call their accept method
+        (see the Visitor pattern)
+        """
+        for child in getattr(layout, 'children', ()):
+            child.accept(self)
+
+    def writeln(self, string=u''):
+        """write a line in the output buffer"""
+        self.write(string + os.linesep)
+
+    def write(self, string):
+        """write a string in the output buffer"""
+        self.out.write(string)
+
+    def begin_format(self):
+        """begin to format a layout"""
+        self.section = 0
+
+    def end_format(self):
+        """finished to format a layout"""
+
+    def get_table_content(self, table):
+        """trick to get table content without actually writing it
+
+        return an aligned list of lists containing table cells values as string
+        """
+        result = [[]]
+        cols = table.cols
+        for cell in self.compute_content(table):
+            if cols == 0:
+                result.append([])
+                cols = table.cols
+            cols -= 1
+            result[-1].append(cell)
+        # fill missing cells
+        while len(result[-1]) < cols:
+            result[-1].append(u'')
+        return result
+
+    def compute_content(self, layout):
+        """trick to compute the formatting of children layout before actually
+        writing it
+
+        return an iterator on strings (one for each child element)
+        """
+        # Patch the underlying output stream with a fresh-generated stream,
+        # which is used to store a temporary representation of a child
+        # node.
+        out = self.out
+        try:
+            for child in layout.children:
+                stream = six.StringIO()
+                self.out = stream
+                child.accept(self)
+                yield stream.getvalue()
+        finally:
+            self.out = out
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/html_writer.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/html_writer.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/html_writer.py	(revision 1126)
@@ -0,0 +1,93 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of pylint.
+#
+# pylint is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# pylint is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with pylint.  If not, see <http://www.gnu.org/licenses/>.
+"""HTML formatting drivers for ureports"""
+
+from pylint.reporters.ureports import BaseWriter
+
+
+class HTMLWriter(BaseWriter):
+    """format layouts as HTML"""
+
+    def __init__(self, snippet=None):
+        super(HTMLWriter, self).__init__()
+        self.snippet = snippet
+
+    def begin_format(self):
+        """begin to format a layout"""
+        super(HTMLWriter, self).begin_format()
+        if self.snippet is None:
+            self.writeln(u'<html>')
+            self.writeln(u'<body>')
+
+    def end_format(self):
+        """finished to format a layout"""
+        if self.snippet is None:
+            self.writeln(u'</body>')
+            self.writeln(u'</html>')
+
+    def visit_section(self, layout):
+        """display a section as html, using div + h[section level]"""
+        self.section += 1
+        self.writeln(u'<div>')
+        self.format_children(layout)
+        self.writeln(u'</div>')
+        self.section -= 1
+
+    def visit_title(self, layout):
+        """display a title using <hX>"""
+        self.write(u'<h%s>' % self.section)
+        self.format_children(layout)
+        self.writeln(u'</h%s>' % self.section)
+
+    def visit_table(self, layout):
+        """display a table as html"""
+        self.writeln(u'<table>')
+        table_content = self.get_table_content(layout)
+        for i, row in enumerate(table_content):
+            if i == 0 and layout.rheaders:
+                self.writeln(u'<tr class="header">')
+            else:
+                self.writeln(u'<tr class="%s">' % (u'even' if i % 2 else u'odd'))
+            for j, cell in enumerate(row):
+                cell = cell or u'&#160;'
+                if (layout.rheaders and i == 0) or \
+                   (layout.cheaders and j == 0):
+                    self.writeln(u'<th>%s</th>' % cell)
+                else:
+                    self.writeln(u'<td>%s</td>' % cell)
+            self.writeln(u'</tr>')
+        self.writeln(u'</table>')
+
+    def visit_paragraph(self, layout):
+        """display links (using <p>)"""
+        self.write(u'<p>')
+        self.format_children(layout)
+        self.write(u'</p>')
+
+    def visit_verbatimtext(self, layout):
+        """display verbatim text (using <pre>)"""
+        self.write(u'<pre>')
+        self.write(layout.data.replace(u'&', u'&amp;').replace(u'<', u'&lt;'))
+        self.write(u'</pre>')
+
+    def visit_text(self, layout):
+        """add some text"""
+        data = layout.data
+        if layout.escaped:
+            data = data.replace(u'&', u'&amp;').replace(u'<', u'&lt;')
+        self.write(data)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/text_writer.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/text_writer.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/ureports/text_writer.py	(revision 1126)
@@ -0,0 +1,99 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of logilab-common.
+#
+# pylint is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# pylint is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with pylint.  If not, see <http://www.gnu.org/licenses/>.
+"""Text formatting drivers for ureports"""
+
+from __future__ import print_function
+
+from pylint.reporters.ureports import BaseWriter
+
+
+TITLE_UNDERLINES = [u'', u'=', u'-', u'`', u'.', u'~', u'^']
+BULLETS = [u'*', u'-']
+
+class TextWriter(BaseWriter):
+    """format layouts as text
+    (ReStructured inspiration but not totally handled yet)
+    """
+    def begin_format(self):
+        super(TextWriter, self).begin_format()
+        self.list_level = 0
+
+    def visit_section(self, layout):
+        """display a section as text
+        """
+        self.section += 1
+        self.writeln()
+        self.format_children(layout)
+        self.section -= 1
+        self.writeln()
+
+    def visit_title(self, layout):
+        title = u''.join(list(self.compute_content(layout)))
+        self.writeln(title)
+        try:
+            self.writeln(TITLE_UNDERLINES[self.section] * len(title))
+        except IndexError:
+            print("FIXME TITLE TOO DEEP. TURNING TITLE INTO TEXT")
+
+    def visit_paragraph(self, layout):
+        """enter a paragraph"""
+        self.format_children(layout)
+        self.writeln()
+
+    def visit_table(self, layout):
+        """display a table as text"""
+        table_content = self.get_table_content(layout)
+        # get columns width
+        cols_width = [0]*len(table_content[0])
+        for row in table_content:
+            for index, col in enumerate(row):
+                cols_width[index] = max(cols_width[index], len(col))
+        self.default_table(layout, table_content, cols_width)
+        self.writeln()
+
+    def default_table(self, layout, table_content, cols_width):
+        """format a table"""
+        cols_width = [size+1 for size in cols_width]
+        format_strings = u' '.join([u'%%-%ss'] * len(cols_width))
+        format_strings = format_strings % tuple(cols_width)
+        format_strings = format_strings.split(u' ')
+        table_linesep = u'\n+' + u'+'.join([u'-'*w for w in cols_width]) + u'+\n'
+        headsep = u'\n+' + u'+'.join([u'='*w for w in cols_width]) + u'+\n'
+        # FIXME: layout.cheaders
+        self.write(table_linesep)
+        for index, line in enumerate(table_content):
+            self.write(u'|')
+            for line_index, at_index in enumerate(line):
+                self.write(format_strings[line_index] % at_index)
+                self.write(u'|')
+            if index == 0 and layout.rheaders:
+                self.write(headsep)
+            else:
+                self.write(table_linesep)
+
+    def visit_verbatimtext(self, layout):
+        """display a verbatim layout as text (so difficult ;)
+        """
+        self.writeln(u'::\n')
+        for line in layout.data.splitlines():
+            self.writeln(u'    ' + line)
+        self.writeln()
+
+    def visit_text(self, layout):
+        """add some text"""
+        self.write(u'%s' % layout.data)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/reporters/__init__.py	(revision 1126)
@@ -0,0 +1,149 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""utilities methods and classes for reporters"""
+from __future__ import print_function
+
+import sys
+import locale
+import os
+import warnings
+
+import six
+
+CMPS = ['=', '-', '+']
+
+# py3k has no more cmp builtin
+if sys.version_info >= (3, 0):
+    def cmp(a, b): # pylint: disable=redefined-builtin
+        return (a > b) - (a < b)
+
+def diff_string(old, new):
+    """given a old and new int value, return a string representing the
+    difference
+    """
+    diff = abs(old - new)
+    diff_str = "%s%s" % (CMPS[cmp(old, new)], diff and ('%.2f' % diff) or '')
+    return diff_str
+
+
+class BaseReporter(object):
+    """base class for reporters
+
+    symbols: show short symbolic names for messages.
+    """
+
+    extension = ''
+
+    def __init__(self, output=None):
+        self.linter = None
+        self.section = 0
+        self.out = None
+        self.out_encoding = None
+        self.set_output(output)
+        # Build the path prefix to strip to get relative paths
+        self.path_strip_prefix = os.getcwd() + os.sep
+
+    def handle_message(self, msg):
+        """Handle a new message triggered on the current file.
+
+        Invokes the legacy add_message API by default."""
+        self.add_message(
+            msg.msg_id, (msg.abspath, msg.module, msg.obj, msg.line, msg.column),
+            msg.msg)
+
+    def add_message(self, msg_id, location, msg):
+        """Deprecated, do not use."""
+        # pylint: disable=no-self-use,unused-argument
+        msg = ("This method is deprecated, use handle_message instead. "
+               "It will be removed in Pylint 1.6.")
+        warnings.warn(msg, DeprecationWarning, stacklevel=2)
+
+    def set_output(self, output=None):
+        """set output stream"""
+        self.out = output or sys.stdout
+
+    if six.PY3:
+        encode = lambda self, string: string
+    else:
+        def encode(self, string):
+            if not isinstance(string, six.text_type):
+                return string
+            encoding = (getattr(self.out, 'encoding', None) or
+                        locale.getdefaultlocale()[1] or
+                        sys.getdefaultencoding())
+            # errors=replace, we don't want to crash when attempting to show
+            # source code line that can't be encoded with the current locale
+            # settings
+            return string.encode(encoding, 'replace')
+
+    def writeln(self, string=''):
+        """write a line in the output buffer"""
+        print(self.encode(string), file=self.out)
+
+    def display_reports(self, layout):
+        """display results encapsulated in the layout tree"""
+        self.section = 0
+        if hasattr(layout, 'report_id'):
+            layout.children[0].children[0].data += ' (%s)' % layout.report_id
+        self._display(layout)
+
+    def display_results(self, layout):
+        warnings.warn("display_results is deprecated, use display_reports instead. "
+                      "The former will be removed in Pylint 2.0.",
+                      DeprecationWarning)
+        self.display_reports(layout)
+
+    def _display(self, layout):
+        """display the layout"""
+        raise NotImplementedError()
+
+    def display_messages(self, layout):
+        """Hook for displaying the messages of the reporter
+
+        This will be called whenever the underlying messages
+        needs to be displayed. For some reporters, it probably
+        doesn't make sense to display messages as soon as they
+        are available, so some mechanism of storing them could be used.
+        This method can be implemented to display them after they've
+        been aggregated.
+        """
+
+    # Event callbacks
+
+    def on_set_current_module(self, module, filepath):
+        """Hook called when a module starts to be analysed."""
+
+    def on_close(self, stats, previous_stats):
+        """Hook called when a module finished analyzing."""
+
+
+class CollectingReporter(BaseReporter):
+    """collects messages"""
+
+    name = 'collector'
+
+    def __init__(self):
+        BaseReporter.__init__(self)
+        self.messages = []
+
+    def handle_message(self, msg):
+        self.messages.append(msg)
+
+    _display = None
+
+
+def initialize(linter):
+    """initialize linter with reporters in this package """
+    from pylint import utils
+    utils.register_plugins(linter, __path__[0])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__init__.py	(revision 1126)
@@ -0,0 +1,46 @@
+# Copyright (c) 2003-2012 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+import sys
+
+from .__pkginfo__ import version as __version__
+
+def run_pylint():
+    """run pylint"""
+    from pylint.lint import Run
+    Run(sys.argv[1:])
+
+def run_pylint_gui():
+    """run pylint-gui"""
+    try:
+        from pylint.gui import Run
+        Run(sys.argv[1:])
+    except ImportError:
+        sys.exit('tkinter is not available')
+
+def run_epylint():
+    """run pylint"""
+    from pylint.epylint import Run
+    Run()
+
+def run_pyreverse():
+    """run pyreverse"""
+    from pylint.pyreverse.main import Run
+    Run(sys.argv[1:])
+
+def run_symilar():
+    """run symilar"""
+    from pylint.checkers.similar import Run
+    Run(sys.argv[1:])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/variables.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/variables.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/variables.py	(revision 1126)
@@ -0,0 +1,1189 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""variables checkers for Python code
+"""
+import os
+import sys
+import re
+from copy import copy
+
+import six
+
+import astroid
+from astroid import modutils
+from pylint.interfaces import IAstroidChecker, INFERENCE, INFERENCE_FAILURE, HIGH
+from pylint.utils import get_global_option
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import (
+    PYMETHODS, is_ancestor_name, is_builtin,
+    is_defined_before, is_error, is_func_default, is_func_decorator,
+    assign_parent, check_messages, is_inside_except, clobber_in_except,
+    get_all_elements, has_known_bases, node_ignores_exception,
+    is_inside_abstract_class, is_comprehension, is_iterable,
+    safe_infer)
+
+SPECIAL_OBJ = re.compile("^_{2}[a-z]+_{2}$")
+FUTURE = '__future__'
+PY3K = sys.version_info >= (3, 0)
+
+
+def _is_from_future_import(stmt, name):
+    """Check if the name is a future import from another module."""
+    try:
+        module = stmt.do_import_module(stmt.modname)
+    except astroid.InferenceError:
+        return
+
+    for local_node in module.locals.get(name, []):
+        if (isinstance(local_node, astroid.ImportFrom)
+                and local_node.modname == FUTURE):
+            return True
+
+
+def in_for_else_branch(parent, stmt):
+    """Returns True if stmt in inside the else branch for a parent For stmt."""
+    return (isinstance(parent, astroid.For) and
+            any(else_stmt.parent_of(stmt) for else_stmt in parent.orelse))
+
+def overridden_method(klass, name):
+    """get overridden method if any"""
+    try:
+        parent = next(klass.local_attr_ancestors(name))
+    except (StopIteration, KeyError):
+        return None
+    try:
+        meth_node = parent[name]
+    except KeyError:
+        # We have found an ancestor defining <name> but it's not in the local
+        # dictionary. This may happen with astroid built from living objects.
+        return None
+    if isinstance(meth_node, astroid.FunctionDef):
+        return meth_node
+    return None
+
+def _get_unpacking_extra_info(node, infered):
+    """return extra information to add to the message for unpacking-non-sequence
+    and unbalanced-tuple-unpacking errors
+    """
+    more = ''
+    infered_module = infered.root().name
+    if node.root().name == infered_module:
+        if node.lineno == infered.lineno:
+            more = ' %s' % infered.as_string()
+        elif infered.lineno:
+            more = ' defined at line %s' % infered.lineno
+    elif infered.lineno:
+        more = ' defined at line %s of %s' % (infered.lineno, infered_module)
+    return more
+
+def _detect_global_scope(node, frame, defframe):
+    """ Detect that the given frames shares a global
+    scope.
+
+    Two frames shares a global scope when neither
+    of them are hidden under a function scope, as well
+    as any of parent scope of them, until the root scope.
+    In this case, depending from something defined later on
+    will not work, because it is still undefined.
+
+    Example:
+        class A:
+            # B has the same global scope as `C`, leading to a NameError.
+            class B(C): ...
+        class C: ...
+
+    """
+    def_scope = scope = None
+    if frame and frame.parent:
+        scope = frame.parent.scope()
+    if defframe and defframe.parent:
+        def_scope = defframe.parent.scope()
+    if isinstance(frame, astroid.FunctionDef):
+        # If the parent of the current node is a
+        # function, then it can be under its scope
+        # (defined in, which doesn't concern us) or
+        # the `->` part of annotations. The same goes
+        # for annotations of function arguments, they'll have
+        # their parent the Arguments node.
+        if not isinstance(node.parent,
+                          (astroid.FunctionDef, astroid.Arguments)):
+            return False
+    elif any(not isinstance(f, (astroid.ClassDef, astroid.Module))
+             for f in (frame, defframe)):
+        # Not interested in other frames, since they are already
+        # not in a global scope.
+        return False
+
+    break_scopes = []
+    for s in (scope, def_scope):
+        # Look for parent scopes. If there is anything different
+        # than a module or a class scope, then they frames don't
+        # share a global scope.
+        parent_scope = s
+        while parent_scope:
+            if not isinstance(parent_scope, (astroid.ClassDef, astroid.Module)):
+                break_scopes.append(parent_scope)
+                break
+            if parent_scope.parent:
+                parent_scope = parent_scope.parent.scope()
+            else:
+                break
+    if break_scopes and len(set(break_scopes)) != 1:
+        # Store different scopes than expected.
+        # If the stored scopes are, in fact, the very same, then it means
+        # that the two frames (frame and defframe) shares the same scope,
+        # and we could apply our lineno analysis over them.
+        # For instance, this works when they are inside a function, the node
+        # that uses a definition and the definition itself.
+        return False
+    # At this point, we are certain that frame and defframe shares a scope
+    # and the definition of the first depends on the second.
+    return frame.lineno < defframe.lineno
+
+def _fix_dot_imports(not_consumed):
+    """ Try to fix imports with multiple dots, by returning a dictionary
+    with the import names expanded. The function unflattens root imports,
+    like 'xml' (when we have both 'xml.etree' and 'xml.sax'), to 'xml.etree'
+    and 'xml.sax' respectively.
+    """
+    # TODO: this should be improved in issue astroid #46
+    names = {}
+    for name, stmts in six.iteritems(not_consumed):
+        if any(isinstance(stmt, astroid.AssignName)
+               and isinstance(stmt.assign_type(), astroid.AugAssign)
+               for stmt in stmts):
+            continue
+        for stmt in stmts:
+            if not isinstance(stmt, (astroid.ImportFrom, astroid.Import)):
+                continue
+            for imports in stmt.names:
+                second_name = None
+                if imports[0] == "*":
+                    # In case of wildcard imports,
+                    # pick the name from inside the imported module.
+                    second_name = name
+                else:
+                    if imports[0].find(".") > -1 or name in imports:
+                        # Most likely something like 'xml.etree',
+                        # which will appear in the .locals as 'xml'.
+                        # Only pick the name if it wasn't consumed.
+                        second_name = imports[0]
+                if second_name and second_name not in names:
+                    names[second_name] = stmt
+    return sorted(names.items(), key=lambda a: a[1].fromlineno)
+
+def _find_frame_imports(name, frame):
+    """
+    Detect imports in the frame, with the required
+    *name*. Such imports can be considered assignments.
+    Returns True if an import for the given name was found.
+    """
+    imports = frame.nodes_of_class((astroid.Import, astroid.ImportFrom))
+    for import_node in imports:
+        for import_name, import_alias in import_node.names:
+            # If the import uses an alias, check only that.
+            # Otherwise, check only the import name.
+            if import_alias:
+                if import_alias == name:
+                    return True
+            elif import_name and import_name == name:
+                return True
+
+
+MSGS = {
+    'E0601': ('Using variable %r before assignment',
+              'used-before-assignment',
+              'Used when a local variable is accessed before it\'s \
+              assignment.'),
+    'E0602': ('Undefined variable %r',
+              'undefined-variable',
+              'Used when an undefined variable is accessed.'),
+    'E0603': ('Undefined variable name %r in __all__',
+              'undefined-all-variable',
+              'Used when an undefined variable name is referenced in __all__.'),
+    'E0604': ('Invalid object %r in __all__, must contain only strings',
+              'invalid-all-object',
+              'Used when an invalid (non-string) object occurs in __all__.'),
+    'E0611': ('No name %r in module %r',
+              'no-name-in-module',
+              'Used when a name cannot be found in a module.'),
+
+    'W0601': ('Global variable %r undefined at the module level',
+              'global-variable-undefined',
+              'Used when a variable is defined through the "global" statement \
+              but the variable is not defined in the module scope.'),
+    'W0602': ('Using global for %r but no assignment is done',
+              'global-variable-not-assigned',
+              'Used when a variable is defined through the "global" statement \
+              but no assignment to this variable is done.'),
+    'W0603': ('Using the global statement', # W0121
+              'global-statement',
+              'Used when you use the "global" statement to update a global \
+              variable. Pylint just try to discourage this \
+              usage. That doesn\'t mean you can not use it !'),
+    'W0604': ('Using the global statement at the module level', # W0103
+              'global-at-module-level',
+              'Used when you use the "global" statement at the module level \
+              since it has no effect'),
+    'W0611': ('Unused %s',
+              'unused-import',
+              'Used when an imported module or variable is not used.'),
+    'W0612': ('Unused variable %r',
+              'unused-variable',
+              'Used when a variable is defined but not used.'),
+    'W0613': ('Unused argument %r',
+              'unused-argument',
+              'Used when a function or method argument is not used.'),
+    'W0614': ('Unused import %s from wildcard import',
+              'unused-wildcard-import',
+              'Used when an imported module or variable is not used from a \
+              `\'from X import *\'` style import.'),
+
+    'W0621': ('Redefining name %r from outer scope (line %s)',
+              'redefined-outer-name',
+              'Used when a variable\'s name hide a name defined in the outer \
+              scope.'),
+    'W0622': ('Redefining built-in %r',
+              'redefined-builtin',
+              'Used when a variable or function override a built-in.'),
+    'W0623': ('Redefining name %r from %s in exception handler',
+              'redefine-in-handler',
+              'Used when an exception handler assigns the exception \
+               to an existing name'),
+
+    'W0631': ('Using possibly undefined loop variable %r',
+              'undefined-loop-variable',
+              'Used when an loop variable (i.e. defined by a for loop or \
+              a list comprehension or a generator expression) is used outside \
+              the loop.'),
+
+    'E0632': ('Possible unbalanced tuple unpacking with '
+              'sequence%s: '
+              'left side has %d label(s), right side has %d value(s)',
+              'unbalanced-tuple-unpacking',
+              'Used when there is an unbalanced tuple unpacking in assignment',
+              {'old_names': [('W0632', 'unbalanced-tuple-unpacking')]}),
+
+    'E0633': ('Attempting to unpack a non-sequence%s',
+              'unpacking-non-sequence',
+              'Used when something which is not '
+              'a sequence is used in an unpack assignment',
+              {'old_names': [('W0633', 'unpacking-non-sequence')]}),
+
+    'W0640': ('Cell variable %s defined in loop',
+              'cell-var-from-loop',
+              'A variable used in a closure is defined in a loop. '
+              'This will result in all closures using the same value for '
+              'the closed-over variable.'),
+
+    }
+
+class VariablesChecker(BaseChecker):
+    """checks for
+    * unused variables / imports
+    * undefined variables
+    * redefinition of variable from builtins or from an outer scope
+    * use of variable before assignment
+    * __all__ consistency
+    """
+
+    __implements__ = IAstroidChecker
+
+    name = 'variables'
+    msgs = MSGS
+    priority = -1
+    options = (("init-import",
+                {'default': 0, 'type' : 'yn', 'metavar' : '<y_or_n>',
+                 'help' : 'Tells whether we should check for unused import in \
+__init__ files.'}),
+               ("dummy-variables-rgx",
+                {'default': ('_$|dummy'),
+                 'type' :'regexp', 'metavar' : '<regexp>',
+                 'help' : 'A regular expression matching the name of dummy \
+variables (i.e. expectedly not used).'}),
+               ("additional-builtins",
+                {'default': (), 'type' : 'csv',
+                 'metavar' : '<comma separated list>',
+                 'help' : 'List of additional names supposed to be defined in \
+builtins. Remember that you should avoid to define new builtins when possible.'
+                }),
+               ("callbacks",
+                {'default' : ('cb_', '_cb'), 'type' : 'csv',
+                 'metavar' : '<callbacks>',
+                 'help' : 'List of strings which can identify a callback '
+                          'function by name. A callback name must start or '
+                          'end with one of those strings.'}
+               )
+              )
+    def __init__(self, linter=None):
+        BaseChecker.__init__(self, linter)
+        self._to_consume = None  # list of tuples: (to_consume:dict, consumed:dict, scope_type:str)
+        self._checking_mod_attr = None
+
+    def visit_module(self, node):
+        """visit module : update consumption analysis variable
+        checks globals doesn't overrides builtins
+        """
+        self._to_consume = [(copy(node.locals), {}, 'module')]
+        for name, stmts in six.iteritems(node.locals):
+            if is_builtin(name) and not is_inside_except(stmts[0]):
+                # do not print Redefining builtin for additional builtins
+                self.add_message('redefined-builtin', args=name, node=stmts[0])
+
+    @check_messages('unused-import', 'unused-wildcard-import',
+                    'redefined-builtin', 'undefined-all-variable',
+                    'invalid-all-object')
+    def leave_module(self, node):
+        """leave module: check globals
+        """
+        assert len(self._to_consume) == 1
+        not_consumed = self._to_consume.pop()[0]
+        # attempt to check for __all__ if defined
+        if '__all__' in node.locals:
+            self._check_all(node, not_consumed)
+        # don't check unused imports in __init__ files
+        if not self.config.init_import and node.package:
+            return
+
+        self._check_imports(not_consumed)
+
+    def _check_all(self, node, not_consumed):
+        assigned = next(node.igetattr('__all__'))
+        if assigned is astroid.YES:
+            return
+
+        for elt in getattr(assigned, 'elts', ()):
+            try:
+                elt_name = next(elt.infer())
+            except astroid.InferenceError:
+                continue
+            if elt_name is astroid.YES:
+                continue
+
+            if (not isinstance(elt_name, astroid.Const)
+                    or not isinstance(elt_name.value, six.string_types)):
+                self.add_message('invalid-all-object',
+                                 args=elt.as_string(), node=elt)
+                continue
+
+            elt_name = elt_name.value
+            # If elt is in not_consumed, remove it from not_consumed
+            if elt_name in not_consumed:
+                del not_consumed[elt_name]
+                continue
+
+            if elt_name not in node.locals:
+                if not node.package:
+                    self.add_message('undefined-all-variable',
+                                     args=(elt_name, ),
+                                     node=elt)
+                else:
+                    basename = os.path.splitext(node.file)[0]
+                    if os.path.basename(basename) == '__init__':
+                        name = node.name + "." + elt_name
+                        try:
+                            modutils.file_from_modpath(name.split("."))
+                        except ImportError:
+                            self.add_message('undefined-all-variable',
+                                             args=(elt_name, ),
+                                             node=elt)
+                        except SyntaxError:
+                            # don't yield an syntax-error warning,
+                            # because it will be later yielded
+                            # when the file will be checked
+                            pass
+
+    def _check_imports(self, not_consumed):
+        local_names = _fix_dot_imports(not_consumed)
+        checked = set()
+        for name, stmt in local_names:
+            for imports in stmt.names:
+                real_name = imported_name = imports[0]
+                if imported_name == "*":
+                    real_name = name
+                as_name = imports[1]
+                if real_name in checked:
+                    continue
+                if name not in (real_name, as_name):
+                    continue
+                checked.add(real_name)
+
+                if (isinstance(stmt, astroid.Import) or
+                        (isinstance(stmt, astroid.ImportFrom) and
+                         not stmt.modname)):
+                    if (isinstance(stmt, astroid.ImportFrom) and
+                            SPECIAL_OBJ.search(imported_name)):
+                        # Filter special objects (__doc__, __all__) etc.,
+                        # because they can be imported for exporting.
+                        continue
+                    if as_name is None:
+                        msg = "import %s" % imported_name
+                    else:
+                        msg = "%s imported as %s" % (imported_name, as_name)
+                    self.add_message('unused-import', args=msg, node=stmt)
+                elif (isinstance(stmt, astroid.ImportFrom)
+                      and stmt.modname != FUTURE):
+
+                    if SPECIAL_OBJ.search(imported_name):
+                        # Filter special objects (__doc__, __all__) etc.,
+                        # because they can be imported for exporting.
+                        continue
+
+                    if _is_from_future_import(stmt, name):
+                        # Check if the name is in fact loaded from a
+                        # __future__ import in another module.
+                        continue
+
+                    if imported_name == '*':
+                        self.add_message('unused-wildcard-import',
+                                         args=name, node=stmt)
+                    else:
+                        if as_name is None:
+                            msg = "%s imported from %s" % (imported_name, stmt.modname)
+                        else:
+                            fields = (imported_name, stmt.modname, as_name)
+                            msg = "%s imported from %s as %s" % fields
+                        self.add_message('unused-import', args=msg, node=stmt)
+        del self._to_consume
+
+    def visit_classdef(self, node):
+        """visit class: update consumption analysis variable
+        """
+        self._to_consume.append((copy(node.locals), {}, 'class'))
+
+    def leave_classdef(self, _):
+        """leave class: update consumption analysis variable
+        """
+        # do not check for not used locals here (no sense)
+        self._to_consume.pop()
+
+    def visit_lambda(self, node):
+        """visit lambda: update consumption analysis variable
+        """
+        self._to_consume.append((copy(node.locals), {}, 'lambda'))
+
+    def leave_lambda(self, _):
+        """leave lambda: update consumption analysis variable
+        """
+        # do not check for not used locals here
+        self._to_consume.pop()
+
+    def visit_generatorexp(self, node):
+        """visit genexpr: update consumption analysis variable
+        """
+        self._to_consume.append((copy(node.locals), {}, 'comprehension'))
+
+    def leave_generatorexp(self, _):
+        """leave genexpr: update consumption analysis variable
+        """
+        # do not check for not used locals here
+        self._to_consume.pop()
+
+    def visit_dictcomp(self, node):
+        """visit dictcomp: update consumption analysis variable
+        """
+        self._to_consume.append((copy(node.locals), {}, 'comprehension'))
+
+    def leave_dictcomp(self, _):
+        """leave dictcomp: update consumption analysis variable
+        """
+        # do not check for not used locals here
+        self._to_consume.pop()
+
+    def visit_setcomp(self, node):
+        """visit setcomp: update consumption analysis variable
+        """
+        self._to_consume.append((copy(node.locals), {}, 'comprehension'))
+
+    def leave_setcomp(self, _):
+        """leave setcomp: update consumption analysis variable
+        """
+        # do not check for not used locals here
+        self._to_consume.pop()
+
+    def visit_functiondef(self, node):
+        """visit function: update consumption analysis variable and check locals
+        """
+        self._to_consume.append((copy(node.locals), {}, 'function'))
+        if not (self.linter.is_message_enabled('redefined-outer-name') or
+                self.linter.is_message_enabled('redefined-builtin')):
+            return
+        globs = node.root().globals
+        for name, stmt in node.items():
+            if is_inside_except(stmt):
+                continue
+            if name in globs and not isinstance(stmt, astroid.Global):
+                definition = globs[name][0]
+                if (isinstance(definition, astroid.ImportFrom)
+                        and definition.modname == FUTURE):
+                    # It is a __future__ directive, not a symbol.
+                    continue
+
+                line = definition.fromlineno
+                dummy_rgx = self.config.dummy_variables_rgx
+                if not dummy_rgx.match(name):
+                    self.add_message('redefined-outer-name',
+                                     args=(name, line), node=stmt)
+            elif is_builtin(name):
+                # do not print Redefining builtin for additional builtins
+                self.add_message('redefined-builtin', args=name, node=stmt)
+
+    def leave_functiondef(self, node):
+        """leave function: check function's locals are consumed"""
+        not_consumed = self._to_consume.pop()[0]
+        if not (self.linter.is_message_enabled('unused-variable') or
+                self.linter.is_message_enabled('unused-argument')):
+            return
+        # don't check arguments of function which are only raising an exception
+        if is_error(node):
+            return
+        # don't check arguments of abstract methods or within an interface
+        is_method = node.is_method()
+        klass = node.parent.frame()
+        if is_method and node.is_abstract():
+            return
+        if is_method and isinstance(klass, astroid.ClassDef):
+            confidence = INFERENCE if has_known_bases(klass) else INFERENCE_FAILURE
+        else:
+            confidence = HIGH
+        authorized_rgx = self.config.dummy_variables_rgx
+        called_overridden = False
+        argnames = node.argnames()
+        global_names = set()
+        nonlocal_names = set()
+        for global_stmt in node.nodes_of_class(astroid.Global):
+            global_names.update(set(global_stmt.names))
+        for nonlocal_stmt in node.nodes_of_class(astroid.Nonlocal):
+            nonlocal_names.update(set(nonlocal_stmt.names))
+
+        for name, stmts in six.iteritems(not_consumed):
+            # ignore some special names specified by user configuration
+            if authorized_rgx.match(name):
+                continue
+            # ignore names imported by the global statement
+            # FIXME: should only ignore them if it's assigned latter
+            stmt = stmts[0]
+            if isinstance(stmt, astroid.Global):
+                continue
+            if isinstance(stmt, (astroid.Import, astroid.ImportFrom)):
+                # Detect imports, assigned to global statements.
+                if not global_names:
+                    continue
+                skip = False
+                for import_name, import_alias in stmt.names:
+                    # If the import uses an alias, check only that.
+                    # Otherwise, check only the import name.
+                    if import_alias:
+                        if import_alias in global_names:
+                            skip = True
+                            break
+                    elif import_name in global_names:
+                        skip = True
+                        break
+                if skip:
+                    continue
+
+            # care about functions with unknown argument (builtins)
+            if name in argnames:
+                if is_method:
+                    # don't warn for the first argument of a (non static) method
+                    if node.type != 'staticmethod' and name == argnames[0]:
+                        continue
+                    # don't warn for argument of an overridden method
+                    if not called_overridden:
+                        overridden = overridden_method(klass, node.name)
+                        called_overridden = True
+                    if overridden is not None and name in overridden.argnames():
+                        continue
+                    if node.name in PYMETHODS and node.name not in ('__init__', '__new__'):
+                        continue
+                # don't check callback arguments
+                if any(node.name.startswith(cb) or node.name.endswith(cb)
+                       for cb in self.config.callbacks):
+                    continue
+                self.add_message('unused-argument', args=name, node=stmt,
+                                 confidence=confidence)
+            else:
+                if stmt.parent and isinstance(stmt.parent, astroid.Assign):
+                    if name in nonlocal_names:
+                        continue
+                self.add_message('unused-variable', args=name, node=stmt)
+
+    visit_asyncfunctiondef = visit_functiondef
+    leave_asyncfunctiondef = leave_functiondef
+
+    @check_messages('global-variable-undefined', 'global-variable-not-assigned',
+                    'global-statement', 'global-at-module-level',
+                    'redefined-builtin')
+    def visit_global(self, node):
+        """check names imported exists in the global scope"""
+        frame = node.frame()
+        if isinstance(frame, astroid.Module):
+            self.add_message('global-at-module-level', node=node)
+            return
+        module = frame.root()
+        default_message = True
+        for name in node.names:
+            try:
+                assign_nodes = module.getattr(name)
+            except astroid.NotFoundError:
+                # unassigned global, skip
+                assign_nodes = []
+            for anode in assign_nodes:
+                if anode.parent is None:
+                    # node returned for builtin attribute such as __file__,
+                    # __doc__, etc...
+                    continue
+                if anode.frame() is frame:
+                    # same scope level assignment
+                    break
+            else:
+                if not _find_frame_imports(name, frame):
+                    self.add_message('global-variable-not-assigned',
+                                     args=name, node=node)
+                default_message = False
+            if not assign_nodes:
+                continue
+            for anode in assign_nodes:
+                if anode.parent is None:
+                    self.add_message('redefined-builtin', args=name, node=node)
+                    break
+                if anode.frame() is module:
+                    # module level assignment
+                    break
+            else:
+                # global undefined at the module scope
+                self.add_message('global-variable-undefined', args=name, node=node)
+                default_message = False
+        if default_message:
+            self.add_message('global-statement', node=node)
+
+    def _check_late_binding_closure(self, node, assignment_node):
+        def _is_direct_lambda_call():
+            return (isinstance(node_scope.parent, astroid.Call)
+                    and node_scope.parent.func is node_scope)
+
+        node_scope = node.scope()
+        if not isinstance(node_scope, (astroid.Lambda, astroid.FunctionDef)):
+            return
+        if isinstance(node.parent, astroid.Arguments):
+            return
+
+        if isinstance(assignment_node, astroid.Comprehension):
+            if assignment_node.parent.parent_of(node.scope()):
+                self.add_message('cell-var-from-loop', node=node, args=node.name)
+        else:
+            assign_scope = assignment_node.scope()
+            maybe_for = assignment_node
+            while not isinstance(maybe_for, astroid.For):
+                if maybe_for is assign_scope:
+                    break
+                maybe_for = maybe_for.parent
+            else:
+                if (maybe_for.parent_of(node_scope)
+                        and not _is_direct_lambda_call()
+                        and not isinstance(node_scope.statement(), astroid.Return)):
+                    self.add_message('cell-var-from-loop', node=node, args=node.name)
+
+    def _loopvar_name(self, node, name):
+        # filter variables according to node's scope
+        # XXX used to filter parents but don't remember why, and removing this
+        # fixes a W0631 false positive reported by Paul Hachmann on 2008/12 on
+        # python-projects (added to func_use_for_or_listcomp_var test)
+        #astmts = [stmt for stmt in node.lookup(name)[1]
+        #          if hasattr(stmt, 'ass_type')] and
+        #          not stmt.statement().parent_of(node)]
+        if not self.linter.is_message_enabled('undefined-loop-variable'):
+            return
+        astmts = [stmt for stmt in node.lookup(name)[1]
+                  if hasattr(stmt, 'ass_type')]
+        # filter variables according their respective scope test is_statement
+        # and parent to avoid #74747. This is not a total fix, which would
+        # introduce a mechanism similar to special attribute lookup in
+        # modules. Also, in order to get correct inference in this case, the
+        # scope lookup rules would need to be changed to return the initial
+        # assignment (which does not exist in code per se) as well as any later
+        # modifications.
+        if not astmts or (astmts[0].is_statement or astmts[0].parent) \
+             and astmts[0].statement().parent_of(node):
+            _astmts = []
+        else:
+            _astmts = astmts[:1]
+        for i, stmt in enumerate(astmts[1:]):
+            if (astmts[i].statement().parent_of(stmt)
+                    and not in_for_else_branch(astmts[i].statement(), stmt)):
+                continue
+            _astmts.append(stmt)
+        astmts = _astmts
+        if len(astmts) == 1:
+            assign = astmts[0].assign_type()
+            if (isinstance(assign, (astroid.For, astroid.Comprehension,
+                                    astroid.GeneratorExp))
+                    and assign.statement() is not node.statement()):
+                self.add_message('undefined-loop-variable', args=name, node=node)
+
+    @check_messages('redefine-in-handler')
+    def visit_excepthandler(self, node):
+        for name in get_all_elements(node.name):
+            clobbering, args = clobber_in_except(name)
+            if clobbering:
+                self.add_message('redefine-in-handler', args=args, node=name)
+
+    def visit_assignname(self, node):
+        if isinstance(node.assign_type(), astroid.AugAssign):
+            self.visit_name(node)
+
+    def visit_delname(self, node):
+        self.visit_name(node)
+
+    @staticmethod
+    def _defined_in_function_definition(node, frame):
+        in_annotation_or_default = False
+        if (isinstance(frame, astroid.FunctionDef) and
+                node.statement() is frame):
+            in_annotation_or_default = (
+                (
+                    PY3K and (node in frame.args.annotations
+                              or node is frame.args.varargannotation
+                              or node is frame.args.kwargannotation)
+                )
+                or
+                frame.args.parent_of(node)
+            )
+        return in_annotation_or_default
+
+    @staticmethod
+    def _next_to_consume(node, name, to_consume):
+        # mark the name as consumed if it's defined in this scope
+        found_node = to_consume.get(name)
+        if (found_node
+                and isinstance(node.parent, astroid.Assign)
+                and node.parent == found_node[0].parent):
+            lhs = found_node[0].parent.targets[0]
+            if lhs.name == name: # this name is defined in this very statement
+                found_node = None
+        return found_node
+
+    @staticmethod
+    def _is_variable_violation(node, name, defnode, stmt, defstmt,
+                               frame, defframe, base_scope_type,
+                               recursive_klass):
+        maybee0601 = True
+        annotation_return = False
+        if frame is not defframe:
+            maybee0601 = _detect_global_scope(node, frame, defframe)
+        elif defframe.parent is None:
+            # we are at the module level, check the name is not
+            # defined in builtins
+            if name in defframe.scope_attrs or astroid.builtin_lookup(name)[1]:
+                maybee0601 = False
+        else:
+            # we are in a local scope, check the name is not
+            # defined in global or builtin scope
+            if defframe.root().lookup(name)[1]:
+                maybee0601 = False
+            else:
+                # check if we have a nonlocal
+                if name in defframe.locals:
+                    maybee0601 = not any(isinstance(child, astroid.Nonlocal)
+                                         and name in child.names
+                                         for child in defframe.get_children())
+
+        if (base_scope_type == 'lambda' and
+                isinstance(frame, astroid.ClassDef)
+                and name in frame.locals):
+
+            # This rule verifies that if the definition node of the
+            # checked name is an Arguments node and if the name
+            # is used a default value in the arguments defaults
+            # and the actual definition of the variable label
+            # is happening before the Arguments definition.
+            #
+            # bar = None
+            # foo = lambda bar=bar: bar
+            #
+            # In this case, maybee0601 should be False, otherwise
+            # it should be True.
+            maybee0601 = not (isinstance(defnode, astroid.Arguments) and
+                              node in defnode.defaults and
+                              frame.locals[name][0].fromlineno < defstmt.fromlineno)
+        elif (isinstance(defframe, astroid.ClassDef) and
+              isinstance(frame, astroid.FunctionDef)):
+            # Special rule for function return annotations,
+            # which uses the same name as the class where
+            # the function lives.
+            if (PY3K and node is frame.returns and
+                    defframe.parent_of(frame.returns)):
+                maybee0601 = annotation_return = True
+
+            if (maybee0601 and defframe.name in defframe.locals and
+                    defframe.locals[name][0].lineno < frame.lineno):
+                # Detect class assignments with the same
+                # name as the class. In this case, no warning
+                # should be raised.
+                maybee0601 = False
+            if isinstance(node.parent, astroid.Arguments):
+                maybee0601 = stmt.fromlineno <= defstmt.fromlineno
+        elif recursive_klass:
+            maybee0601 = True
+        else:
+            maybee0601 = maybee0601 and stmt.fromlineno <= defstmt.fromlineno
+        return maybee0601, annotation_return
+
+    def _ignore_class_scope(self, node, name, frame):
+        # Detect if we are in a local class scope, as an assignment.
+        # For example, the following is fair game.
+        #
+        # class A:
+        #    b = 1
+        #    c = lambda b=b: b * b
+        #
+        # class B:
+        #    tp = 1
+        #    def func(self, arg: tp):
+        #        ...
+        # class C:
+        #    tp = 2
+        #    def func(self, arg=tp):
+        #        ...
+
+        in_annotation_or_default = self._defined_in_function_definition(
+            node, frame)
+        if in_annotation_or_default:
+            frame_locals = frame.parent.scope().locals
+        else:
+            frame_locals = frame.locals
+        return not ((isinstance(frame, astroid.ClassDef) or
+                     in_annotation_or_default) and
+                    name in frame_locals)
+
+    @check_messages(*(MSGS.keys()))
+    def visit_name(self, node):
+        """check that a name is defined if the current scope and doesn't
+        redefine a built-in
+        """
+        stmt = node.statement()
+        if stmt.fromlineno is None:
+            # name node from a astroid built from live code, skip
+            assert not stmt.root().file.endswith('.py')
+            return
+        name = node.name
+        frame = stmt.scope()
+        # if the name node is used as a function default argument's value or as
+        # a decorator, then start from the parent frame of the function instead
+        # of the function frame - and thus open an inner class scope
+        if (is_func_default(node) or is_func_decorator(node)
+                or is_ancestor_name(frame, node)):
+            start_index = len(self._to_consume) - 2
+        else:
+            start_index = len(self._to_consume) - 1
+        # iterates through parent scopes, from the inner to the outer
+        base_scope_type = self._to_consume[start_index][-1]
+        # pylint: disable=too-many-nested-blocks; refactoring this block is a pain.
+        for i in range(start_index, -1, -1):
+            to_consume, consumed, scope_type = self._to_consume[i]
+            # if the current scope is a class scope but it's not the inner
+            # scope, ignore it. This prevents to access this scope instead of
+            # the globals one in function members when there are some common
+            # names. The only exception is when the starting scope is a
+            # comprehension and its direct outer scope is a class
+            if scope_type == 'class' and i != start_index and not (
+                    base_scope_type == 'comprehension' and i == start_index-1):
+                if self._ignore_class_scope(node, name, frame):
+                    continue
+
+            # the name has already been consumed, only check it's not a loop
+            # variable used outside the loop
+            if name in consumed:
+                defnode = assign_parent(consumed[name][0])
+                self._check_late_binding_closure(node, defnode)
+                self._loopvar_name(node, name)
+                break
+            found_node = self._next_to_consume(node, name, to_consume)
+            if found_node:
+                consumed[name] = found_node
+            else:
+                continue
+            # checks for use before assignment
+            defnode = assign_parent(to_consume[name][0])
+            if defnode is not None:
+                self._check_late_binding_closure(node, defnode)
+                defstmt = defnode.statement()
+                defframe = defstmt.frame()
+                # The class reuses itself in the class scope.
+                recursive_klass = (frame is defframe and
+                                   defframe.parent_of(node) and
+                                   isinstance(defframe, astroid.ClassDef) and
+                                   node.name == defframe.name)
+
+                maybee0601, annotation_return = self._is_variable_violation(
+                    node, name, defnode, stmt, defstmt,
+                    frame, defframe,
+                    base_scope_type, recursive_klass)
+
+                if (maybee0601
+                        and not is_defined_before(node)
+                        and not astroid.are_exclusive(stmt, defstmt, ('NameError',
+                                                                      'Exception',
+                                                                      'BaseException'))):
+
+                    # Used and defined in the same place, e.g `x += 1` and `del x`
+                    defined_by_stmt = (
+                        defstmt is stmt
+                        and isinstance(node, (astroid.DelName, astroid.AssignName))
+                    )
+
+                    if (recursive_klass
+                            or defined_by_stmt
+                            or annotation_return
+                            or isinstance(defstmt, astroid.Delete)):
+                        if not node_ignores_exception(node, NameError):
+                            self.add_message('undefined-variable', args=name,
+                                             node=node)
+                    elif base_scope_type != 'lambda':
+                        # E0601 may *not* occurs in lambda scope.
+                        self.add_message('used-before-assignment', args=name, node=node)
+                    elif base_scope_type == 'lambda':
+                        # E0601 can occur in class-level scope in lambdas, as in
+                        # the following example:
+                        #   class A:
+                        #      x = lambda attr: f + attr
+                        #      f = 42
+                        if isinstance(frame, astroid.ClassDef) and name in frame.locals:
+                            if isinstance(node.parent, astroid.Arguments):
+                                if stmt.fromlineno <= defstmt.fromlineno:
+                                    # Doing the following is fine:
+                                    #   class A:
+                                    #      x = 42
+                                    #      y = lambda attr=x: attr
+                                    self.add_message('used-before-assignment',
+                                                     args=name, node=node)
+                            else:
+                                self.add_message('undefined-variable',
+                                                 args=name, node=node)
+                        elif scope_type == 'lambda':
+                            self.add_message('undefined-variable',
+                                             node=node, args=name)
+
+            del to_consume[name]
+            # check it's not a loop variable used outside the loop
+            self._loopvar_name(node, name)
+            break
+        else:
+            # we have not found the name, if it isn't a builtin, that's an
+            # undefined name !
+            if not (name in astroid.Module.scope_attrs or is_builtin(name)
+                    or name in self.config.additional_builtins):
+                if not node_ignores_exception(node, NameError):
+                    self.add_message('undefined-variable', args=name, node=node)
+
+    @check_messages('no-name-in-module')
+    def visit_import(self, node):
+        """check modules attribute accesses"""
+        if node_ignores_exception(node, ImportError):
+            # No need to verify this, since ImportError is already
+            # handled by the client code.
+            return
+
+        for name, _ in node.names:
+            parts = name.split('.')
+            try:
+                module = next(node.infer_name_module(parts[0]))
+            except astroid.ResolveError:
+                continue
+            self._check_module_attrs(node, module, parts[1:])
+
+    @check_messages('no-name-in-module')
+    def visit_importfrom(self, node):
+        """check modules attribute accesses"""
+        if node_ignores_exception(node, ImportError):
+            # No need to verify this, since ImportError is already
+            # handled by the client code.
+            return
+
+        name_parts = node.modname.split('.')
+        try:
+            module = node.do_import_module(name_parts[0])
+        except Exception:
+            return
+        module = self._check_module_attrs(node, module, name_parts[1:])
+        if not module:
+            return
+        for name, _ in node.names:
+            if name == '*':
+                continue
+            self._check_module_attrs(node, module, name.split('.'))
+
+    @check_messages('unbalanced-tuple-unpacking', 'unpacking-non-sequence')
+    def visit_assign(self, node):
+        """Check unbalanced tuple unpacking for assignments
+        and unpacking non-sequences.
+        """
+        if not isinstance(node.targets[0], (astroid.Tuple, astroid.List)):
+            return
+
+        targets = node.targets[0].itered()
+        try:
+            infered = safe_infer(node.value)
+            if infered is not None:
+                self._check_unpacking(infered, node, targets)
+        except astroid.InferenceError:
+            return
+
+    def _check_unpacking(self, infered, node, targets):
+        """ Check for unbalanced tuple unpacking
+        and unpacking non sequences.
+        """
+        if is_inside_abstract_class(node):
+            return
+        if is_comprehension(node):
+            return
+        if infered is astroid.YES:
+            return
+        if (isinstance(infered.parent, astroid.Arguments) and
+                isinstance(node.value, astroid.Name) and
+                node.value.name == infered.parent.vararg):
+            # Variable-length argument, we can't determine the length.
+            return
+        if isinstance(infered, (astroid.Tuple, astroid.List)):
+            # attempt to check unpacking is properly balanced
+            values = infered.itered()
+            if len(targets) != len(values):
+                # Check if we have starred nodes.
+                if any(isinstance(target, astroid.Starred)
+                       for target in targets):
+                    return
+                self.add_message('unbalanced-tuple-unpacking', node=node,
+                                 args=(_get_unpacking_extra_info(node, infered),
+                                       len(targets),
+                                       len(values)))
+        # attempt to check unpacking may be possible (ie RHS is iterable)
+        else:
+            if not is_iterable(infered):
+                self.add_message('unpacking-non-sequence', node=node,
+                                 args=(_get_unpacking_extra_info(node, infered),))
+
+
+    def _check_module_attrs(self, node, module, module_names):
+        """check that module_names (list of string) are accessible through the
+        given module
+        if the latest access name corresponds to a module, return it
+        """
+        assert isinstance(module, astroid.Module), module
+        ignored_modules = get_global_option(self, 'ignored-modules',
+                                            default=[])
+        while module_names:
+            name = module_names.pop(0)
+            if name == '__dict__':
+                module = None
+                break
+            try:
+                module = next(module.getattr(name)[0].infer())
+                if module is astroid.YES:
+                    return None
+            except astroid.NotFoundError:
+                if module.name in ignored_modules:
+                    return None
+                self.add_message('no-name-in-module',
+                                 args=(name, module.name), node=node)
+                return None
+            except astroid.InferenceError:
+                return None
+        if module_names:
+            # FIXME: other message if name is not the latest part of
+            # module_names ?
+            modname = module and module.name or '__dict__'
+            self.add_message('no-name-in-module', node=node,
+                             args=('.'.join(module_names), modname))
+            return None
+        if isinstance(module, astroid.Module):
+            return module
+        return None
+
+
+class VariablesChecker3k(VariablesChecker):
+    '''Modified variables checker for 3k'''
+    # listcomp have now also their scope
+
+    def visit_listcomp(self, node):
+        """visit dictcomp: update consumption analysis variable
+        """
+        self._to_consume.append((copy(node.locals), {}, 'comprehension'))
+
+    def leave_listcomp(self, _):
+        """leave dictcomp: update consumption analysis variable
+        """
+        # do not check for not used locals here
+        self._to_consume.pop()
+
+    def leave_module(self, node):
+        """ Update consumption analysis variable
+        for metaclasses.
+        """
+        module_locals = self._to_consume[0][0]
+        module_imports = self._to_consume[0][1]
+        consumed = {}
+
+        for klass in node.nodes_of_class(astroid.ClassDef):
+            found = metaclass = name = None
+            if not klass._metaclass:
+                # Skip if this class doesn't use
+                # explictly a metaclass, but inherits it from ancestors
+                continue
+
+            metaclass = klass.metaclass()
+
+            # Look the name in the already found locals.
+            # If it's not found there, look in the module locals
+            # and in the imported modules.
+            if isinstance(klass._metaclass, astroid.Name):
+                name = klass._metaclass.name
+            elif metaclass:
+                # if it uses a `metaclass=module.Class`
+                name = metaclass.root().name
+
+            if name:
+                found = consumed.setdefault(
+                    name, module_locals.get(name, module_imports.get(name)))
+
+            if found is None and not metaclass:
+                name = None
+                if isinstance(klass._metaclass, astroid.Name):
+                    name = klass._metaclass.name
+                elif isinstance(klass._metaclass, astroid.Attribute):
+                    name = klass._metaclass.as_string()
+
+                if name is not None:
+                    if not (name in astroid.Module.scope_attrs or
+                            is_builtin(name) or
+                            name in self.config.additional_builtins or
+                            name in node.locals):
+                        self.add_message('undefined-variable',
+                                         node=klass,
+                                         args=(name, ))
+        # Pop the consumed items, in order to
+        # avoid having unused-import false positives
+        for name in consumed:
+            module_locals.pop(name, None)
+        super(VariablesChecker3k, self).leave_module(node)
+
+if sys.version_info >= (3, 0):
+    VariablesChecker = VariablesChecker3k
+
+
+def register(linter):
+    """required method to auto register this checker"""
+    linter.register_checker(VariablesChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/base.py	(revision 1126)
@@ -0,0 +1,2010 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+# Copyright (c) 2009-2010 Arista Networks, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""basic checker for Python code"""
+
+import collections
+import itertools
+import sys
+import re
+
+import six
+from six.moves import zip  # pylint: disable=redefined-builtin
+
+import astroid
+import astroid.bases
+import astroid.scoped_nodes
+from astroid import are_exclusive, InferenceError
+
+from pylint.interfaces import (IAstroidChecker, ITokenChecker, INFERENCE,
+                               INFERENCE_FAILURE, HIGH)
+from pylint.utils import EmptyReport, deprecated_option
+from pylint.reporters import diff_string
+from pylint.checkers import BaseChecker, BaseTokenChecker
+from pylint.checkers.utils import (
+    check_messages,
+    clobber_in_except,
+    is_builtin_object,
+    is_inside_except,
+    overrides_a_method,
+    get_argument_from_call,
+    node_frame_class,
+    NoSuchArgumentError,
+    error_of_type,
+    unimplemented_abstract_methods,
+    has_known_bases,
+    safe_infer
+    )
+from pylint.reporters.ureports.nodes import Table
+
+
+# regex for class/function/variable/constant name
+CLASS_NAME_RGX = re.compile('[A-Z_][a-zA-Z0-9]+$')
+MOD_NAME_RGX = re.compile('(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$')
+CONST_NAME_RGX = re.compile('(([A-Z_][A-Z0-9_]*)|(__.*__))$')
+COMP_VAR_RGX = re.compile('[A-Za-z_][A-Za-z0-9_]*$')
+DEFAULT_NAME_RGX = re.compile('[a-z_][a-z0-9_]{2,30}$')
+CLASS_ATTRIBUTE_RGX = re.compile(r'([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$')
+# do not require a doc string on private/system methods
+NO_REQUIRED_DOC_RGX = re.compile('^_')
+REVERSED_PROTOCOL_METHOD = '__reversed__'
+SEQUENCE_PROTOCOL_METHODS = ('__getitem__', '__len__')
+REVERSED_METHODS = (SEQUENCE_PROTOCOL_METHODS,
+                    (REVERSED_PROTOCOL_METHOD, ))
+TYPECHECK_COMPARISON_OPERATORS = frozenset(('is', 'is not', '==',
+                                            '!=', 'in', 'not in'))
+LITERAL_NODE_TYPES = (astroid.Const, astroid.Dict, astroid.List, astroid.Set)
+UNITTEST_CASE = 'unittest.case'
+BUILTINS = six.moves.builtins.__name__
+TYPE_QNAME = "%s.type" % BUILTINS
+PY33 = sys.version_info >= (3, 3)
+PY3K = sys.version_info >= (3, 0)
+PY35 = sys.version_info >= (3, 5)
+BAD_FUNCTIONS = ['map', 'filter']
+if sys.version_info < (3, 0):
+    BAD_FUNCTIONS.append('input')
+
+# Some hints regarding the use of bad builtins.
+BUILTIN_HINTS = {
+    'map': 'Using a list comprehension can be clearer.',
+}
+BUILTIN_HINTS['filter'] = BUILTIN_HINTS['map']
+
+# Name categories that are always consistent with all naming conventions.
+EXEMPT_NAME_CATEGORIES = set(('exempt', 'ignore'))
+
+# A mapping from builtin-qname -> symbol, to be used when generating messages
+# about dangerous default values as arguments
+DEFAULT_ARGUMENT_SYMBOLS = dict(
+    zip(['.'.join([BUILTINS, x]) for x in ('set', 'dict', 'list')],
+        ['set()', '{}', '[]'])
+)
+REVERSED_COMPS = {'<': '>', '<=': '>=', '>': '<', '>=': '<='}
+
+del re
+
+def _redefines_import(node):
+    """ Detect that the given node (AssName) is inside an
+    exception handler and redefines an import from the tryexcept body.
+    Returns True if the node redefines an import, False otherwise.
+    """
+    current = node
+    while current and not isinstance(current.parent, astroid.ExceptHandler):
+        current = current.parent
+    if not current or not error_of_type(current.parent, ImportError):
+        return False
+    try_block = current.parent.parent
+    for import_node in try_block.nodes_of_class((astroid.ImportFrom, astroid.Import)):
+        for name, alias in import_node.names:
+            if alias:
+                if alias == node.name:
+                    return True
+            elif name == node.name:
+                return True
+    return False
+
+def in_loop(node):
+    """return True if the node is inside a kind of for loop"""
+    parent = node.parent
+    while parent is not None:
+        if isinstance(parent, (astroid.For, astroid.ListComp, astroid.SetComp,
+                               astroid.DictComp, astroid.GeneratorExp)):
+            return True
+        parent = parent.parent
+    return False
+
+def in_nested_list(nested_list, obj):
+    """return true if the object is an element of <nested_list> or of a nested
+    list
+    """
+    for elmt in nested_list:
+        if isinstance(elmt, (list, tuple)):
+            if in_nested_list(elmt, obj):
+                return True
+        elif elmt == obj:
+            return True
+    return False
+
+def _loop_exits_early(loop):
+    """Returns true if a loop has a break statement in its body."""
+    loop_nodes = (astroid.For, astroid.While)
+    # Loop over body explicitly to avoid matching break statements
+    # in orelse.
+    for child in loop.body:
+        if isinstance(child, loop_nodes):
+            # break statement may be in orelse of child loop.
+            # pylint: disable=superfluous-parens
+            for orelse in (child.orelse or ()):
+                for _ in orelse.nodes_of_class(astroid.Break, skip_klass=loop_nodes):
+                    return True
+            continue
+        for _ in child.nodes_of_class(astroid.Break, skip_klass=loop_nodes):
+            return True
+    return False
+
+def _is_multi_naming_match(match, node_type, confidence):
+    return (match is not None and
+            match.lastgroup is not None and
+            match.lastgroup not in EXEMPT_NAME_CATEGORIES
+            and (node_type != 'method' or confidence != INFERENCE_FAILURE))
+
+
+if sys.version_info < (3, 0):
+    PROPERTY_CLASSES = set(('__builtin__.property', 'abc.abstractproperty'))
+else:
+    PROPERTY_CLASSES = set(('builtins.property', 'abc.abstractproperty'))
+
+
+def _determine_function_name_type(node):
+    """Determine the name type whose regex the a function's name should match.
+
+    :param node: A function node.
+    :returns: One of ('function', 'method', 'attr')
+    """
+    if not node.is_method():
+        return 'function'
+    if node.decorators:
+        decorators = node.decorators.nodes
+    else:
+        decorators = []
+    for decorator in decorators:
+        # If the function is a property (decorated with @property
+        # or @abc.abstractproperty), the name type is 'attr'.
+        if (isinstance(decorator, astroid.Name) or
+                (isinstance(decorator, astroid.Attribute) and
+                 decorator.attrname == 'abstractproperty')):
+            infered = safe_infer(decorator)
+            if infered and infered.qname() in PROPERTY_CLASSES:
+                return 'attr'
+        # If the function is decorated using the prop_method.{setter,getter}
+        # form, treat it like an attribute as well.
+        elif (isinstance(decorator, astroid.Attribute) and
+              decorator.attrname in ('setter', 'deleter')):
+            return 'attr'
+    return 'method'
+
+
+def _is_none(node):
+    return (node is None or
+            (isinstance(node, astroid.Const) and node.value is None) or
+            (isinstance(node, astroid.Name)  and node.name == 'None')
+           )
+
+
+def _has_abstract_methods(node):
+    """
+    Determine if the given `node` has abstract methods.
+
+    The methods should be made abstract by decorating them
+    with `abc` decorators.
+    """
+    return len(unimplemented_abstract_methods(node)) > 0
+
+
+def report_by_type_stats(sect, stats, old_stats):
+    """make a report of
+
+    * percentage of different types documented
+    * percentage of different types with a bad name
+    """
+    # percentage of different types documented and/or with a bad name
+    nice_stats = {}
+    for node_type in ('module', 'class', 'method', 'function'):
+        try:
+            total = stats[node_type]
+        except KeyError:
+            raise EmptyReport()
+        nice_stats[node_type] = {}
+        if total != 0:
+            try:
+                documented = total - stats['undocumented_'+node_type]
+                percent = (documented * 100.) / total
+                nice_stats[node_type]['percent_documented'] = '%.2f' % percent
+            except KeyError:
+                nice_stats[node_type]['percent_documented'] = 'NC'
+            try:
+                percent = (stats['badname_'+node_type] * 100.) / total
+                nice_stats[node_type]['percent_badname'] = '%.2f' % percent
+            except KeyError:
+                nice_stats[node_type]['percent_badname'] = 'NC'
+    lines = ('type', 'number', 'old number', 'difference',
+             '%documented', '%badname')
+    for node_type in ('module', 'class', 'method', 'function'):
+        new = stats[node_type]
+        old = old_stats.get(node_type, None)
+        if old is not None:
+            diff_str = diff_string(old, new)
+        else:
+            old, diff_str = 'NC', 'NC'
+        lines += (node_type, str(new), str(old), diff_str,
+                  nice_stats[node_type].get('percent_documented', '0'),
+                  nice_stats[node_type].get('percent_badname', '0'))
+    sect.append(Table(children=lines, cols=6, rheaders=1))
+
+def redefined_by_decorator(node):
+    """return True if the object is a method redefined via decorator.
+
+    For example:
+        @property
+        def x(self): return self._x
+        @x.setter
+        def x(self, value): self._x = value
+    """
+    if node.decorators:
+        for decorator in node.decorators.nodes:
+            if (isinstance(decorator, astroid.Attribute) and
+                    getattr(decorator.expr, 'name', None) == node.name):
+                return True
+    return False
+
+
+def _node_type(node):
+    """Return the inferred type for `node`
+
+    If there is more than one possible type, or if inferred type is YES or None,
+    return None
+    """
+    # check there is only one possible type for the assign node. Else we
+    # don't handle it for now
+    types = set()
+    try:
+        for var_type in node.infer():
+            if var_type == astroid.YES or _is_none(var_type):
+                continue
+            types.add(var_type)
+            if len(types) > 1:
+                return
+    except InferenceError:
+        return
+    return types.pop() if types else None
+
+
+class _BasicChecker(BaseChecker):
+    __implements__ = IAstroidChecker
+    name = 'basic'
+
+class BasicErrorChecker(_BasicChecker):
+    msgs = {
+        'E0100': ('__init__ method is a generator',
+                  'init-is-generator',
+                  'Used when the special class method __init__ is turned into a '
+                  'generator by a yield in its body.'),
+        'E0101': ('Explicit return in __init__',
+                  'return-in-init',
+                  'Used when the special class method __init__ has an explicit '
+                  'return value.'),
+        'E0102': ('%s already defined line %s',
+                  'function-redefined',
+                  'Used when a function / class / method is redefined.'),
+        'E0103': ('%r not properly in loop',
+                  'not-in-loop',
+                  'Used when break or continue keywords are used outside a loop.'),
+        'E0104': ('Return outside function',
+                  'return-outside-function',
+                  'Used when a "return" statement is found outside a function or '
+                  'method.'),
+        'E0105': ('Yield outside function',
+                  'yield-outside-function',
+                  'Used when a "yield" statement is found outside a function or '
+                  'method.'),
+        'E0106': ('Return with argument inside generator',
+                  'return-arg-in-generator',
+                  'Used when a "return" statement with an argument is found '
+                  'outside in a generator function or method (e.g. with some '
+                  '"yield" statements).',
+                  {'maxversion': (3, 3)}),
+        'E0107': ("Use of the non-existent %s operator",
+                  'nonexistent-operator',
+                  "Used when you attempt to use the C-style pre-increment or"
+                  "pre-decrement operator -- and ++, which doesn't exist in Python."),
+        'E0108': ('Duplicate argument name %s in function definition',
+                  'duplicate-argument-name',
+                  'Duplicate argument names in function definitions are syntax'
+                  ' errors.'),
+        'E0110': ('Abstract class %r with abstract methods instantiated',
+                  'abstract-class-instantiated',
+                  'Used when an abstract class with `abc.ABCMeta` as metaclass '
+                  'has abstract methods and is instantiated.'),
+        'W0120': ('Else clause on loop without a break statement',
+                  'useless-else-on-loop',
+                  'Loops should only have an else clause if they can exit early '
+                  'with a break statement, otherwise the statements under else '
+                  'should be on the same scope as the loop itself.'),
+        'E0112': ('More than one starred expression in assignment',
+                  'too-many-star-expressions',
+                  'Emitted when there are more than one starred '
+                  'expressions (`*x`) in an assignment. This is a SyntaxError.',
+                  {'minversion': (3, 0)}),
+        'E0113': ('Starred assignment target must be in a list or tuple',
+                  'invalid-star-assignment-target',
+                  'Emitted when a star expression is used as a starred '
+                  'assignment target.',
+                  {'minversion': (3, 0)}),
+        'E0114': ('Can use starred expression only in assignment target',
+                  'star-needs-assignment-target',
+                  'Emitted when a star expression is not used in an '
+                  'assignment target.',
+                  {'minversion': (3, 0)}),
+        'E0115': ('Name %r is nonlocal and global',
+                  'nonlocal-and-global',
+                  'Emitted when a name is both nonlocal and global.',
+                  {'minversion': (3, 0)}),
+        'E0116': ("'continue' not supported inside 'finally' clause",
+                  'continue-in-finally',
+                  'Emitted when the `continue` keyword is found '
+                  'inside a finally clause, which is a SyntaxError.'),
+        'E0117': ("nonlocal name %s found without binding",
+                  'nonlocal-without-binding',
+                  'Emitted when a nonlocal variable does not have an attached '
+                  'name somewhere in the parent scopes',
+                  {'minversion': (3, 0)}),
+        }
+
+    @check_messages('function-redefined')
+    def visit_classdef(self, node):
+        self._check_redefinition('class', node)
+
+    @check_messages('too-many-star-expressions',
+                    'invalid-star-assignment-target')
+    def visit_assign(self, node):
+        starred = list(node.targets[0].nodes_of_class(astroid.Starred))
+        if len(starred) > 1:
+            self.add_message('too-many-star-expressions', node=node)
+
+        # Check *a = b
+        if isinstance(node.targets[0], astroid.Starred):
+            self.add_message('invalid-star-assignment-target', node=node)
+
+    @check_messages('star-needs-assignment-target')
+    def visit_starred(self, node):
+        """Check that a Starred expression is used in an assignment target."""
+        if isinstance(node.parent, astroid.Call):
+            # f(*args) is converted to Call(args=[Starred]), so ignore
+            # them for this check.
+            return
+        if PY35 and isinstance(node.parent,
+                               (astroid.List, astroid.Tuple,
+                                astroid.Set, astroid.Dict)):
+            # PEP 448 unpacking.
+            return
+
+        stmt = node.statement()
+        if not isinstance(stmt, astroid.Assign):
+            return
+
+        if stmt.value is node or stmt.value.parent_of(node):
+            self.add_message('star-needs-assignment-target', node=node)
+
+    @check_messages('init-is-generator', 'return-in-init',
+                    'function-redefined', 'return-arg-in-generator',
+                    'duplicate-argument-name', 'nonlocal-and-global')
+    def visit_functiondef(self, node):
+        self._check_nonlocal_and_global(node)
+        if not redefined_by_decorator(node):
+            self._check_redefinition(node.is_method() and 'method' or 'function', node)
+        # checks for max returns, branch, return in __init__
+        returns = node.nodes_of_class(astroid.Return,
+                                      skip_klass=(astroid.FunctionDef,
+                                                  astroid.ClassDef))
+        if node.is_method() and node.name == '__init__':
+            if node.is_generator():
+                self.add_message('init-is-generator', node=node)
+            else:
+                values = [r.value for r in returns]
+                # Are we returning anything but None from constructors
+                if [v for v in values if not _is_none(v)]:
+                    self.add_message('return-in-init', node=node)
+        elif node.is_generator():
+            # make sure we don't mix non-None returns and yields
+            if not PY33:
+                for retnode in returns:
+                    if isinstance(retnode.value, astroid.Const) and \
+                           retnode.value.value is not None:
+                        self.add_message('return-arg-in-generator', node=node,
+                                         line=retnode.fromlineno)
+        # Check for duplicate names
+        args = set()
+        for name in node.argnames():
+            if name in args:
+                self.add_message('duplicate-argument-name', node=node, args=(name,))
+            else:
+                args.add(name)
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    def _check_nonlocal_and_global(self, node):
+        """Check that a name is both nonlocal and global."""
+        def same_scope(current):
+            return current.scope() is node
+
+        from_iter = itertools.chain.from_iterable
+        nonlocals = set(from_iter(
+            child.names for child in node.nodes_of_class(astroid.Nonlocal)
+            if same_scope(child)))
+        global_vars = set(from_iter(
+            child.names for child in node.nodes_of_class(astroid.Global)
+            if same_scope(child)))
+        for name in nonlocals.intersection(global_vars):
+            self.add_message('nonlocal-and-global',
+                             args=(name, ), node=node)
+
+    @check_messages('return-outside-function')
+    def visit_return(self, node):
+        if not isinstance(node.frame(), astroid.FunctionDef):
+            self.add_message('return-outside-function', node=node)
+
+    @check_messages('yield-outside-function')
+    def visit_yield(self, node):
+        self._check_yield_outside_func(node)
+
+    @check_messages('yield-outside-function')
+    def visit_yieldfrom(self, node):
+        self._check_yield_outside_func(node)
+
+    @check_messages('not-in-loop', 'continue-in-finally')
+    def visit_continue(self, node):
+        self._check_in_loop(node, 'continue')
+
+    @check_messages('not-in-loop')
+    def visit_break(self, node):
+        self._check_in_loop(node, 'break')
+
+    @check_messages('useless-else-on-loop')
+    def visit_for(self, node):
+        self._check_else_on_loop(node)
+
+    @check_messages('useless-else-on-loop')
+    def visit_while(self, node):
+        self._check_else_on_loop(node)
+
+    @check_messages('nonexistent-operator')
+    def visit_unaryop(self, node):
+        """check use of the non-existent ++ and -- operator operator"""
+        if ((node.op in '+-') and
+                isinstance(node.operand, astroid.UnaryOp) and
+                (node.operand.op == node.op)):
+            self.add_message('nonexistent-operator', node=node, args=node.op*2)
+
+    def _check_nonlocal_without_binding(self, node, name):
+        current_scope = node.scope()
+        while True:
+            if current_scope.parent is None:
+                break
+
+            if not isinstance(current_scope, astroid.FunctionDef):
+                self.add_message('nonlocal-without-binding', args=(name, ),
+                                 node=node)
+                return
+            else:
+                if name not in current_scope.locals:
+                    current_scope = current_scope.parent.scope()
+                    continue
+                else:
+                    # Okay, found it.
+                    return
+
+        self.add_message('nonlocal-without-binding', args=(name, ), node=node)
+
+    @check_messages('nonlocal-without-binding')
+    def visit_nonlocal(self, node):
+        for name in node.names:
+            self._check_nonlocal_without_binding(node, name)
+
+    @check_messages('abstract-class-instantiated')
+    def visit_call(self, node):
+        """ Check instantiating abstract class with
+        abc.ABCMeta as metaclass.
+        """
+        try:
+            infered = next(node.func.infer())
+        except astroid.InferenceError:
+            return
+
+        if not isinstance(infered, astroid.ClassDef):
+            return
+
+        klass = node_frame_class(node)
+        if klass is infered:
+            # Don't emit the warning if the class is instantiated
+            # in its own body or if the call is not an instance
+            # creation. If the class is instantiated into its own
+            # body, we're expecting that it knows what it is doing.
+            return
+
+        # __init__ was called
+        metaclass = infered.metaclass()
+        abstract_methods = _has_abstract_methods(infered)
+        if metaclass is None:
+            # Python 3.4 has `abc.ABC`, which won't be detected
+            # by ClassNode.metaclass()
+            for ancestor in infered.ancestors():
+                if ancestor.qname() == 'abc.ABC' and abstract_methods:
+                    self.add_message('abstract-class-instantiated',
+                                     args=(infered.name, ),
+                                     node=node)
+                    break
+            return
+        if metaclass.qname() == 'abc.ABCMeta' and abstract_methods:
+            self.add_message('abstract-class-instantiated',
+                             args=(infered.name, ),
+                             node=node)
+
+    def _check_yield_outside_func(self, node):
+        if not isinstance(node.frame(), (astroid.FunctionDef, astroid.Lambda)):
+            self.add_message('yield-outside-function', node=node)
+
+    def _check_else_on_loop(self, node):
+        """Check that any loop with an else clause has a break statement."""
+        if node.orelse and not _loop_exits_early(node):
+            self.add_message('useless-else-on-loop', node=node,
+                             # This is not optimal, but the line previous
+                             # to the first statement in the else clause
+                             # will usually be the one that contains the else:.
+                             line=node.orelse[0].lineno - 1)
+
+    def _check_in_loop(self, node, node_name):
+        """check that a node is inside a for or while loop"""
+        _node = node.parent
+        while _node:
+            if isinstance(_node, (astroid.For, astroid.While)):
+                if node not in _node.orelse:
+                    return
+
+            if isinstance(_node, (astroid.ClassDef, astroid.FunctionDef)):
+                break
+            if (isinstance(_node, astroid.TryFinally)
+                    and node in _node.finalbody
+                    and isinstance(node, astroid.Continue)):
+                self.add_message('continue-in-finally', node=node)
+
+            _node = _node.parent
+
+        self.add_message('not-in-loop', node=node, args=node_name)
+
+    def _check_redefinition(self, redeftype, node):
+        """check for redefinition of a function / method / class name"""
+        defined_self = node.parent.frame()[node.name]
+        if defined_self is not node and not are_exclusive(node, defined_self):
+            self.add_message('function-redefined', node=node,
+                             args=(redeftype, defined_self.fromlineno))
+
+
+
+class BasicChecker(_BasicChecker):
+    """checks for :
+    * doc strings
+    * number of arguments, local variables, branches, returns and statements in
+functions, methods
+    * required module attributes
+    * dangerous default values as arguments
+    * redefinition of function / method / class
+    * uses of the global statement
+    """
+
+    __implements__ = IAstroidChecker
+
+    name = 'basic'
+    msgs = {
+        'W0101': ('Unreachable code',
+                  'unreachable',
+                  'Used when there is some code behind a "return" or "raise" '
+                  'statement, which will never be accessed.'),
+        'W0102': ('Dangerous default value %s as argument',
+                  'dangerous-default-value',
+                  'Used when a mutable value as list or dictionary is detected in '
+                  'a default value for an argument.'),
+        'W0104': ('Statement seems to have no effect',
+                  'pointless-statement',
+                  'Used when a statement doesn\'t have (or at least seems to) '
+                  'any effect.'),
+        'W0105': ('String statement has no effect',
+                  'pointless-string-statement',
+                  'Used when a string is used as a statement (which of course '
+                  'has no effect). This is a particular case of W0104 with its '
+                  'own message so you can easily disable it if you\'re using '
+                  'those strings as documentation, instead of comments.'),
+        'W0106': ('Expression "%s" is assigned to nothing',
+                  'expression-not-assigned',
+                  'Used when an expression that is not a function call is assigned '
+                  'to nothing. Probably something else was intended.'),
+        'W0108': ('Lambda may not be necessary',
+                  'unnecessary-lambda',
+                  'Used when the body of a lambda expression is a function call '
+                  'on the same argument list as the lambda itself; such lambda '
+                  'expressions are in all but a few cases replaceable with the '
+                  'function being called in the body of the lambda.'),
+        'W0109': ("Duplicate key %r in dictionary",
+                  'duplicate-key',
+                  'Used when a dictionary expression binds the same key multiple '
+                  'times.'),
+        'W0122': ('Use of exec',
+                  'exec-used',
+                  'Used when you use the "exec" statement (function for Python '
+                  '3), to discourage its usage. That doesn\'t '
+                  'mean you can not use it !'),
+        'W0123': ('Use of eval',
+                  'eval-used',
+                  'Used when you use the "eval" function, to discourage its '
+                  'usage. Consider using `ast.literal_eval` for safely evaluating '
+                  'strings containing Python expressions '
+                  'from untrusted sources. '),
+        'W0141': ('Used builtin function %s',
+                  'bad-builtin',
+                  'Used when a black listed builtin function is used (see the '
+                  'bad-function option). Usual black listed functions are the ones '
+                  'like map, or filter , where Python offers now some cleaner '
+                  'alternative like list comprehension.'),
+        'W0150': ("%s statement in finally block may swallow exception",
+                  'lost-exception',
+                  'Used when a break or a return statement is found inside the '
+                  'finally clause of a try...finally block: the exceptions raised '
+                  'in the try clause will be silently swallowed instead of being '
+                  're-raised.'),
+        'W0199': ('Assert called on a 2-uple. Did you mean \'assert x,y\'?',
+                  'assert-on-tuple',
+                  'A call of assert on a tuple will always evaluate to true if '
+                  'the tuple is not empty, and will always evaluate to false if '
+                  'it is.'),
+        'W0124': ('Following "as" with another context manager looks like a tuple.',
+                  'confusing-with-statement',
+                  'Emitted when a `with` statement component returns multiple values '
+                  'and uses name binding with `as` only for a part of those values, '
+                  'as in with ctx() as a, b. This can be misleading, since it\'s not '
+                  'clear if the context manager returns a tuple or if the node without '
+                  'a name binding is another context manager.'),
+        'W0125': ('Using a conditional statement with a constant value',
+                  'using-constant-test',
+                  'Emitted when a conditional statement (If or ternary if) '
+                  'uses a constant value for its test. This might not be what '
+                  'the user intended to do.'),
+        'E0111': ('The first reversed() argument is not a sequence',
+                  'bad-reversed-sequence',
+                  'Used when the first argument to reversed() builtin '
+                  'isn\'t a sequence (does not implement __reversed__, '
+                  'nor __getitem__ and __len__'),
+
+    }
+
+    options = (('required-attributes',
+                deprecated_option(opt_type='csv',
+                                  help_msg="Required attributes for module. "
+                                           "This option is obsolete.")),
+
+               ('bad-functions',
+                {'default' : BAD_FUNCTIONS,
+                 'type' :'csv', 'metavar' : '<builtin function names>',
+                 'help' : 'List of builtins function names that should not be '
+                          'used, separated by a comma'}
+               ),
+              )
+    reports = (('RP0101', 'Statistics by type', report_by_type_stats),)
+
+    def __init__(self, linter):
+        _BasicChecker.__init__(self, linter)
+        self.stats = None
+        self._tryfinallys = None
+
+    def open(self):
+        """initialize visit variables and statistics
+        """
+        self._tryfinallys = []
+        self.stats = self.linter.add_stats(module=0, function=0,
+                                           method=0, class_=0)
+
+    @check_messages('using-constant-test')
+    def visit_if(self, node):
+        self._check_using_constant_test(node, node.test)
+
+    @check_messages('using-constant-test')
+    def visit_ifexp(self, node):
+        self._check_using_constant_test(node, node.test)
+
+    @check_messages('using-constant-test')
+    def visit_comprehension(self, node):
+        if node.ifs:
+            for if_test in node.ifs:
+                self._check_using_constant_test(node, if_test)
+
+    def _check_using_constant_test(self, node, test):
+        const_nodes = (
+            astroid.Module,
+            astroid.scoped_nodes.GeneratorExp,
+            astroid.Lambda, astroid.FunctionDef, astroid.ClassDef,
+            astroid.bases.Generator, astroid.UnboundMethod,
+            astroid.BoundMethod, astroid.Module)
+        structs = (astroid.Dict, astroid.Tuple, astroid.Set)
+
+        # These nodes are excepted, since they are not constant
+        # values, requiring a computation to happen. The only type
+        # of node in this list which doesn't have this property is
+        # Getattr, which is excepted because the conditional statement
+        # can be used to verify that the attribute was set inside a class,
+        # which is definitely a valid use case.
+        except_nodes = (astroid.Attribute, astroid.Call,
+                        astroid.BinOp, astroid.BoolOp, astroid.UnaryOp,
+                        astroid.Subscript)
+        inferred = None
+        emit = isinstance(test, (astroid.Const, ) + structs + const_nodes)
+        if not isinstance(test, except_nodes):
+            inferred = safe_infer(test)
+
+        if emit or isinstance(inferred, const_nodes):
+            self.add_message('using-constant-test', node=node)
+
+    def visit_module(self, _):
+        """check module name, docstring and required arguments
+        """
+        self.stats['module'] += 1
+
+    def visit_classdef(self, node): # pylint: disable=unused-argument
+        """check module name, docstring and redefinition
+        increment branch counter
+        """
+        self.stats['class'] += 1
+
+    @check_messages('pointless-statement', 'pointless-string-statement',
+                    'expression-not-assigned')
+    def visit_expr(self, node):
+        """check for various kind of statements without effect"""
+        expr = node.value
+        if isinstance(expr, astroid.Const) and isinstance(expr.value,
+                                                          six.string_types):
+            # treat string statement in a separated message
+            # Handle PEP-257 attribute docstrings.
+            # An attribute docstring is defined as being a string right after
+            # an assignment at the module level, class level or __init__ level.
+            scope = expr.scope()
+            if isinstance(scope, (astroid.ClassDef, astroid.Module, astroid.FunctionDef)):
+                if isinstance(scope, astroid.FunctionDef) and scope.name != '__init__':
+                    pass
+                else:
+                    sibling = expr.previous_sibling()
+                    if (sibling is not None and sibling.scope() is scope and
+                            isinstance(sibling, astroid.Assign)):
+                        return
+            self.add_message('pointless-string-statement', node=node)
+            return
+        # ignore if this is :
+        # * a direct function call
+        # * the unique child of a try/except body
+        # * a yield (which are wrapped by a discard node in _ast XXX)
+        # warn W0106 if we have any underlying function call (we can't predict
+        # side effects), else pointless-statement
+        if (isinstance(expr, (astroid.Yield, astroid.Await, astroid.Call)) or
+                (isinstance(node.parent, astroid.TryExcept) and
+                 node.parent.body == [node])):
+            return
+        if any(expr.nodes_of_class(astroid.Call)):
+            self.add_message('expression-not-assigned', node=node,
+                             args=expr.as_string())
+        else:
+            self.add_message('pointless-statement', node=node)
+
+    @staticmethod
+    def _filter_vararg(node, call_args):
+        # Return the arguments for the given call which are
+        # not passed as vararg.
+        for arg in call_args:
+            if isinstance(arg, astroid.Starred):
+                if (isinstance(arg.value, astroid.Name)
+                        and arg.value.name != node.args.vararg):
+                    yield arg
+            else:
+                yield arg
+
+    @staticmethod
+    def _has_variadic_argument(args, variadic_name):
+        if not args:
+            return True
+        for arg in args:
+            if isinstance(arg.value, astroid.Name):
+                if arg.value.name != variadic_name:
+                    return True
+            else:
+                return True
+        return False
+
+    @check_messages('unnecessary-lambda')
+    def visit_lambda(self, node):
+        """check whether or not the lambda is suspicious
+        """
+        # if the body of the lambda is a call expression with the same
+        # argument list as the lambda itself, then the lambda is
+        # possibly unnecessary and at least suspicious.
+        if node.args.defaults:
+            # If the arguments of the lambda include defaults, then a
+            # judgment cannot be made because there is no way to check
+            # that the defaults defined by the lambda are the same as
+            # the defaults defined by the function called in the body
+            # of the lambda.
+            return
+        call = node.body
+        if not isinstance(call, astroid.Call):
+            # The body of the lambda must be a function call expression
+            # for the lambda to be unnecessary.
+            return
+        if (isinstance(node.body.func, astroid.Attribute) and
+                isinstance(node.body.func.expr, astroid.Call)):
+            # Chained call, the intermediate call might
+            # return something else (but we don't check that, yet).
+            return
+
+        ordinary_args = list(node.args.args)
+        new_call_args = list(self._filter_vararg(node, call.args))
+        if node.args.kwarg:
+            if self._has_variadic_argument(call.kwargs, node.args.kwarg):
+                return
+        elif call.kwargs or call.keywords:
+            return
+
+        if node.args.vararg:
+            if self._has_variadic_argument(call.starargs, node.args.vararg):
+                return
+        elif call.starargs:
+            return
+
+        # The "ordinary" arguments must be in a correspondence such that:
+        # ordinary_args[i].name == call.args[i].name.
+        if len(ordinary_args) != len(new_call_args):
+            return
+        for arg, passed_arg in zip(ordinary_args, new_call_args):
+            if not isinstance(passed_arg, astroid.Name):
+                return
+            if arg.name != passed_arg.name:
+                return
+
+        self.add_message('unnecessary-lambda', line=node.fromlineno,
+                         node=node)
+
+    @check_messages('dangerous-default-value')
+    def visit_functiondef(self, node):
+        """check function name, docstring, arguments, redefinition,
+        variable names, max locals
+        """
+        self.stats[node.is_method() and 'method' or 'function'] += 1
+        self._check_dangerous_default(node)
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    def _check_dangerous_default(self, node):
+        # check for dangerous default values as arguments
+        is_iterable = lambda n: isinstance(n, (astroid.List,
+                                               astroid.Set,
+                                               astroid.Dict))
+        for default in node.args.defaults:
+            try:
+                value = next(default.infer())
+            except astroid.InferenceError:
+                continue
+
+            if (isinstance(value, astroid.Instance) and
+                    value.qname() in DEFAULT_ARGUMENT_SYMBOLS):
+
+                if value is default:
+                    msg = DEFAULT_ARGUMENT_SYMBOLS[value.qname()]
+                elif isinstance(value, astroid.Instance) or is_iterable(value):
+                    # We are here in the following situation(s):
+                    #   * a dict/set/list/tuple call which wasn't inferred
+                    #     to a syntax node ({}, () etc.). This can happen
+                    #     when the arguments are invalid or unknown to
+                    #     the inference.
+                    #   * a variable from somewhere else, which turns out to be a list
+                    #     or a dict.
+                    if is_iterable(default):
+                        msg = value.pytype()
+                    elif isinstance(default, astroid.Call):
+                        msg = '%s() (%s)' % (value.name, value.qname())
+                    else:
+                        msg = '%s (%s)' % (default.as_string(), value.qname())
+                else:
+                    # this argument is a name
+                    msg = '%s (%s)' % (default.as_string(),
+                                       DEFAULT_ARGUMENT_SYMBOLS[value.qname()])
+                self.add_message('dangerous-default-value',
+                                 node=node,
+                                 args=(msg, ))
+
+    @check_messages('unreachable', 'lost-exception')
+    def visit_return(self, node):
+        """1 - check is the node has a right sibling (if so, that's some
+        unreachable code)
+        2 - check is the node is inside the finally clause of a try...finally
+        block
+        """
+        self._check_unreachable(node)
+        # Is it inside final body of a try...finally bloc ?
+        self._check_not_in_finally(node, 'return', (astroid.FunctionDef,))
+
+    @check_messages('unreachable')
+    def visit_continue(self, node):
+        """check is the node has a right sibling (if so, that's some unreachable
+        code)
+        """
+        self._check_unreachable(node)
+
+    @check_messages('unreachable', 'lost-exception')
+    def visit_break(self, node):
+        """1 - check is the node has a right sibling (if so, that's some
+        unreachable code)
+        2 - check is the node is inside the finally clause of a try...finally
+        block
+        """
+        # 1 - Is it right sibling ?
+        self._check_unreachable(node)
+        # 2 - Is it inside final body of a try...finally bloc ?
+        self._check_not_in_finally(node, 'break', (astroid.For, astroid.While,))
+
+    @check_messages('unreachable')
+    def visit_raise(self, node):
+        """check if the node has a right sibling (if so, that's some unreachable
+        code)
+        """
+        self._check_unreachable(node)
+
+    @check_messages('exec-used')
+    def visit_exec(self, node):
+        """just print a warning on exec statements"""
+        self.add_message('exec-used', node=node)
+
+    @check_messages('bad-builtin', 'eval-used',
+                    'exec-used', 'bad-reversed-sequence')
+    def visit_call(self, node):
+        """visit a CallFunc node -> check if this is not a blacklisted builtin
+        call and check for * or ** use
+        """
+        if isinstance(node.func, astroid.Name):
+            name = node.func.name
+            # ignore the name if it's not a builtin (i.e. not defined in the
+            # locals nor globals scope)
+            if not (name in node.frame() or
+                    name in node.root()):
+                if name == 'exec':
+                    self.add_message('exec-used', node=node)
+                elif name == 'reversed':
+                    self._check_reversed(node)
+                elif name == 'eval':
+                    self.add_message('eval-used', node=node)
+                if name in self.config.bad_functions:
+                    hint = BUILTIN_HINTS.get(name)
+                    if hint:
+                        args = "%r. %s" % (name, hint)
+                    else:
+                        args = repr(name)
+                    self.add_message('bad-builtin', node=node, args=args)
+
+    @check_messages('assert-on-tuple')
+    def visit_assert(self, node):
+        """check the use of an assert statement on a tuple."""
+        if node.fail is None and isinstance(node.test, astroid.Tuple) and \
+                len(node.test.elts) == 2:
+            self.add_message('assert-on-tuple', node=node)
+
+    @check_messages('duplicate-key')
+    def visit_dict(self, node):
+        """check duplicate key in dictionary"""
+        keys = set()
+        for k, _ in node.items:
+            if isinstance(k, astroid.Const):
+                key = k.value
+                if key in keys:
+                    self.add_message('duplicate-key', node=node, args=key)
+                keys.add(key)
+
+    def visit_tryfinally(self, node):
+        """update try...finally flag"""
+        self._tryfinallys.append(node)
+
+    def leave_tryfinally(self, node): # pylint: disable=unused-argument
+        """update try...finally flag"""
+        self._tryfinallys.pop()
+
+    def _check_unreachable(self, node):
+        """check unreachable code"""
+        unreach_stmt = node.next_sibling()
+        if unreach_stmt is not None:
+            self.add_message('unreachable', node=unreach_stmt)
+
+    def _check_not_in_finally(self, node, node_name, breaker_classes=()):
+        """check that a node is not inside a finally clause of a
+        try...finally statement.
+        If we found before a try...finally bloc a parent which its type is
+        in breaker_classes, we skip the whole check."""
+        # if self._tryfinallys is empty, we're not a in try...finally bloc
+        if not self._tryfinallys:
+            return
+        # the node could be a grand-grand...-children of the try...finally
+        _parent = node.parent
+        _node = node
+        while _parent and not isinstance(_parent, breaker_classes):
+            if hasattr(_parent, 'finalbody') and _node in _parent.finalbody:
+                self.add_message('lost-exception', node=node, args=node_name)
+                return
+            _node = _parent
+            _parent = _node.parent
+
+    def _check_reversed(self, node):
+        """ check that the argument to `reversed` is a sequence """
+        try:
+            argument = safe_infer(get_argument_from_call(node, position=0))
+        except NoSuchArgumentError:
+            pass
+        else:
+            if argument is astroid.YES:
+                return
+            if argument is None:
+                # Nothing was infered.
+                # Try to see if we have iter().
+                if isinstance(node.args[0], astroid.Call):
+                    try:
+                        func = next(node.args[0].func.infer())
+                    except InferenceError:
+                        return
+                    if (getattr(func, 'name', None) == 'iter' and
+                            is_builtin_object(func)):
+                        self.add_message('bad-reversed-sequence', node=node)
+                return
+
+            if isinstance(argument, astroid.Instance):
+                if (argument._proxied.name == 'dict' and
+                        is_builtin_object(argument._proxied)):
+                    self.add_message('bad-reversed-sequence', node=node)
+                    return
+                elif any(ancestor.name == 'dict' and is_builtin_object(ancestor)
+                         for ancestor in argument._proxied.ancestors()):
+                    # Mappings aren't accepted by reversed(), unless
+                    # they provide explicitly a __reversed__ method.
+                    try:
+                        argument.locals[REVERSED_PROTOCOL_METHOD]
+                    except KeyError:
+                        self.add_message('bad-reversed-sequence', node=node)
+                    return
+
+                for methods in REVERSED_METHODS:
+                    for meth in methods:
+                        try:
+                            argument.getattr(meth)
+                        except astroid.NotFoundError:
+                            break
+                    else:
+                        break
+                else:
+                    self.add_message('bad-reversed-sequence', node=node)
+            elif not isinstance(argument, (astroid.List, astroid.Tuple)):
+                # everything else is not a proper sequence for reversed()
+                self.add_message('bad-reversed-sequence', node=node)
+
+    @check_messages('confusing-with-statement')
+    def visit_with(self, node):
+        if not PY3K:
+            # in Python 2 a "with" statement with multiple managers coresponds
+            # to multiple nested AST "With" nodes
+            pairs = []
+            parent_node = node.parent
+            if isinstance(parent_node, astroid.With):
+                # we only care about the direct parent, since this method
+                # gets called for each with node anyway
+                pairs.extend(parent_node.items)
+            pairs.extend(node.items)
+        else:
+            # in PY3K a "with" statement with multiple managers coresponds
+            # to one AST "With" node with multiple items
+            pairs = node.items
+        if pairs:
+            for prev_pair, pair in zip(pairs, pairs[1:]):
+                if (isinstance(prev_pair[1], astroid.AssignName) and
+                        (pair[1] is None and not isinstance(pair[0], astroid.Call))):
+                    # don't emit a message if the second is a function call
+                    # there's no way that can be mistaken for a name assignment
+                    if PY3K or node.lineno == node.parent.lineno:
+                        # if the line number doesn't match
+                        # we assume it's a nested "with"
+                        self.add_message('confusing-with-statement', node=node)
+
+
+_NAME_TYPES = {
+    'module': (MOD_NAME_RGX, 'module'),
+    'const': (CONST_NAME_RGX, 'constant'),
+    'class': (CLASS_NAME_RGX, 'class'),
+    'function': (DEFAULT_NAME_RGX, 'function'),
+    'method': (DEFAULT_NAME_RGX, 'method'),
+    'attr': (DEFAULT_NAME_RGX, 'attribute'),
+    'argument': (DEFAULT_NAME_RGX, 'argument'),
+    'variable': (DEFAULT_NAME_RGX, 'variable'),
+    'class_attribute': (CLASS_ATTRIBUTE_RGX, 'class attribute'),
+    'inlinevar': (COMP_VAR_RGX, 'inline iteration'),
+}
+
+def _create_naming_options():
+    name_options = []
+    for name_type, (rgx, human_readable_name) in six.iteritems(_NAME_TYPES):
+        name_type = name_type.replace('_', '-')
+        name_options.append((
+            '%s-rgx' % (name_type,),
+            {'default': rgx, 'type': 'regexp', 'metavar': '<regexp>',
+             'help': 'Regular expression matching correct %s names' % (human_readable_name,)}))
+        name_options.append((
+            '%s-name-hint' % (name_type,),
+            {'default': rgx.pattern, 'type': 'string', 'metavar': '<string>',
+             'help': 'Naming hint for %s names' % (human_readable_name,)}))
+    return tuple(name_options)
+
+class NameChecker(_BasicChecker):
+    msgs = {
+        'C0102': ('Black listed name "%s"',
+                  'blacklisted-name',
+                  'Used when the name is listed in the black list (unauthorized '
+                  'names).'),
+        'C0103': ('Invalid %s name "%s"%s',
+                  'invalid-name',
+                  'Used when the name doesn\'t match the regular expression '
+                  'associated to its type (constant, variable, class...).'),
+    }
+
+    options = (('good-names',
+                {'default' : ('i', 'j', 'k', 'ex', 'Run', '_'),
+                 'type' :'csv', 'metavar' : '<names>',
+                 'help' : 'Good variable names which should always be accepted,'
+                          ' separated by a comma'}
+               ),
+               ('bad-names',
+                {'default' : ('foo', 'bar', 'baz', 'toto', 'tutu', 'tata'),
+                 'type' :'csv', 'metavar' : '<names>',
+                 'help' : 'Bad variable names which should always be refused, '
+                          'separated by a comma'}
+               ),
+               ('name-group',
+                {'default' : (),
+                 'type' :'csv', 'metavar' : '<name1:name2>',
+                 'help' : ('Colon-delimited sets of names that determine each'
+                           ' other\'s naming style when the name regexes'
+                           ' allow several styles.')}
+               ),
+               ('include-naming-hint',
+                {'default': False, 'type' : 'yn', 'metavar' : '<y_or_n>',
+                 'help': 'Include a hint for the correct naming format with invalid-name'}
+               ),
+              ) + _create_naming_options()
+
+
+    def __init__(self, linter):
+        _BasicChecker.__init__(self, linter)
+        self._name_category = {}
+        self._name_group = {}
+        self._bad_names = {}
+
+    def open(self):
+        self.stats = self.linter.add_stats(badname_module=0,
+                                           badname_class=0, badname_function=0,
+                                           badname_method=0, badname_attr=0,
+                                           badname_const=0,
+                                           badname_variable=0,
+                                           badname_inlinevar=0,
+                                           badname_argument=0,
+                                           badname_class_attribute=0)
+        for group in self.config.name_group:
+            for name_type in group.split(':'):
+                self._name_group[name_type] = 'group_%s' % (group,)
+
+    @check_messages('blacklisted-name', 'invalid-name')
+    def visit_module(self, node):
+        self._check_name('module', node.name.split('.')[-1], node)
+        self._bad_names = {}
+
+    def leave_module(self, node): # pylint: disable=unused-argument
+        for all_groups in six.itervalues(self._bad_names):
+            if len(all_groups) < 2:
+                continue
+            groups = collections.defaultdict(list)
+            min_warnings = sys.maxsize
+            for group in six.itervalues(all_groups):
+                groups[len(group)].append(group)
+                min_warnings = min(len(group), min_warnings)
+            if len(groups[min_warnings]) > 1:
+                by_line = sorted(groups[min_warnings],
+                                 key=lambda group: min(warning[0].lineno for warning in group))
+                warnings = itertools.chain(*by_line[1:])
+            else:
+                warnings = groups[min_warnings][0]
+            for args in warnings:
+                self._raise_name_warning(*args)
+
+    @check_messages('blacklisted-name', 'invalid-name')
+    def visit_classdef(self, node):
+        self._check_name('class', node.name, node)
+        for attr, anodes in six.iteritems(node.instance_attrs):
+            if not any(node.instance_attr_ancestors(attr)):
+                self._check_name('attr', attr, anodes[0])
+
+    @check_messages('blacklisted-name', 'invalid-name')
+    def visit_functiondef(self, node):
+        # Do not emit any warnings if the method is just an implementation
+        # of a base class method.
+        confidence = HIGH
+        if node.is_method():
+            if overrides_a_method(node.parent.frame(), node.name):
+                return
+            confidence = (INFERENCE if has_known_bases(node.parent.frame())
+                          else INFERENCE_FAILURE)
+
+        self._check_name(_determine_function_name_type(node),
+                         node.name, node, confidence)
+        # Check argument names
+        args = node.args.args
+        if args is not None:
+            self._recursive_check_names(args, node)
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    @check_messages('blacklisted-name', 'invalid-name')
+    def visit_global(self, node):
+        for name in node.names:
+            self._check_name('const', name, node)
+
+    @check_messages('blacklisted-name', 'invalid-name')
+    def visit_assignname(self, node):
+        """check module level assigned names"""
+        frame = node.frame()
+        ass_type = node.assign_type()
+        if isinstance(ass_type, astroid.Comprehension):
+            self._check_name('inlinevar', node.name, node)
+        elif isinstance(frame, astroid.Module):
+            if isinstance(ass_type, astroid.Assign) and not in_loop(ass_type):
+                if isinstance(safe_infer(ass_type.value), astroid.ClassDef):
+                    self._check_name('class', node.name, node)
+                else:
+                    if not _redefines_import(node):
+                        # Don't emit if the name redefines an import
+                        # in an ImportError except handler.
+                        self._check_name('const', node.name, node)
+            elif isinstance(ass_type, astroid.ExceptHandler):
+                self._check_name('variable', node.name, node)
+        elif isinstance(frame, astroid.FunctionDef):
+            # global introduced variable aren't in the function locals
+            if node.name in frame and node.name not in frame.argnames():
+                if not _redefines_import(node):
+                    self._check_name('variable', node.name, node)
+        elif isinstance(frame, astroid.ClassDef):
+            if not list(frame.local_attr_ancestors(node.name)):
+                self._check_name('class_attribute', node.name, node)
+
+    def _recursive_check_names(self, args, node):
+        """check names in a possibly recursive list <arg>"""
+        for arg in args:
+            if isinstance(arg, astroid.AssignName):
+                self._check_name('argument', arg.name, node)
+            else:
+                self._recursive_check_names(arg.elts, node)
+
+    def _find_name_group(self, node_type):
+        return self._name_group.get(node_type, node_type)
+
+    def _raise_name_warning(self, node, node_type, name, confidence):
+        type_label = _NAME_TYPES[node_type][1]
+        hint = ''
+        if self.config.include_naming_hint:
+            hint = ' (hint: %s)' % (getattr(self.config, node_type + '_name_hint'))
+        self.add_message('invalid-name', node=node, args=(type_label, name, hint),
+                         confidence=confidence)
+        self.stats['badname_' + node_type] += 1
+
+    def _check_name(self, node_type, name, node, confidence=HIGH):
+        """check for a name using the type's regexp"""
+        if is_inside_except(node):
+            clobbering, _ = clobber_in_except(node)
+            if clobbering:
+                return
+        if name in self.config.good_names:
+            return
+        if name in self.config.bad_names:
+            self.stats['badname_' + node_type] += 1
+            self.add_message('blacklisted-name', node=node, args=name)
+            return
+        regexp = getattr(self.config, node_type + '_rgx')
+        match = regexp.match(name)
+
+        if _is_multi_naming_match(match, node_type, confidence):
+            name_group = self._find_name_group(node_type)
+            bad_name_group = self._bad_names.setdefault(name_group, {})
+            warnings = bad_name_group.setdefault(match.lastgroup, [])
+            warnings.append((node, node_type, name, confidence))
+
+        if match is None:
+            self._raise_name_warning(node, node_type, name, confidence)
+
+
+class DocStringChecker(_BasicChecker):
+    msgs = {
+        'C0111': ('Missing %s docstring', # W0131
+                  'missing-docstring',
+                  'Used when a module, function, class or method has no docstring.'
+                  'Some special methods like __init__ doesn\'t necessary require a '
+                  'docstring.'),
+        'C0112': ('Empty %s docstring', # W0132
+                  'empty-docstring',
+                  'Used when a module, function, class or method has an empty '
+                  'docstring (it would be too easy ;).'),
+        }
+    options = (('no-docstring-rgx',
+                {'default' : NO_REQUIRED_DOC_RGX,
+                 'type' : 'regexp', 'metavar' : '<regexp>',
+                 'help' : 'Regular expression which should only match '
+                          'function or class names that do not require a '
+                          'docstring.'}
+               ),
+               ('docstring-min-length',
+                {'default' : -1,
+                 'type' : 'int', 'metavar' : '<int>',
+                 'help': ('Minimum line length for functions/classes that'
+                          ' require docstrings, shorter ones are exempt.')}
+               ),
+              )
+
+
+    def open(self):
+        self.stats = self.linter.add_stats(undocumented_module=0,
+                                           undocumented_function=0,
+                                           undocumented_method=0,
+                                           undocumented_class=0)
+    @check_messages('missing-docstring', 'empty-docstring')
+    def visit_module(self, node):
+        self._check_docstring('module', node)
+
+    @check_messages('missing-docstring', 'empty-docstring')
+    def visit_classdef(self, node):
+        if self.config.no_docstring_rgx.match(node.name) is None:
+            self._check_docstring('class', node)
+
+    @staticmethod
+    def _is_setter_or_deleter(node):
+        names = {'setter', 'deleter'}
+        for decorator in node.decorators.nodes:
+            if (isinstance(decorator, astroid.Attribute)
+                    and decorator.attrname in names):
+                return True
+        return False
+
+    @check_messages('missing-docstring', 'empty-docstring')
+    def visit_functiondef(self, node):
+        if self.config.no_docstring_rgx.match(node.name) is None:
+            ftype = node.is_method() and 'method' or 'function'
+            if node.decorators and self._is_setter_or_deleter(node):
+                return
+
+            if isinstance(node.parent.frame(), astroid.ClassDef):
+                overridden = False
+                confidence = (INFERENCE if has_known_bases(node.parent.frame())
+                              else INFERENCE_FAILURE)
+                # check if node is from a method overridden by its ancestor
+                for ancestor in node.parent.frame().ancestors():
+                    if node.name in ancestor and \
+                       isinstance(ancestor[node.name], astroid.FunctionDef):
+                        overridden = True
+                        break
+                self._check_docstring(ftype, node,
+                                      report_missing=not overridden,
+                                      confidence=confidence)
+            else:
+                self._check_docstring(ftype, node)
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    def _check_docstring(self, node_type, node, report_missing=True,
+                         confidence=HIGH):
+        """check the node has a non empty docstring"""
+        docstring = node.doc
+        if docstring is None:
+            if not report_missing:
+                return
+            if node.body:
+                lines = node.body[-1].lineno - node.body[0].lineno + 1
+            else:
+                lines = 0
+
+            if node_type == 'module' and not lines:
+                # If the module has no body, there's no reason
+                # to require a docstring.
+                return
+            max_lines = self.config.docstring_min_length
+
+            if node_type != 'module' and max_lines > -1 and lines < max_lines:
+                return
+            self.stats['undocumented_'+node_type] += 1
+            if (node.body and isinstance(node.body[0], astroid.Expr) and
+                    isinstance(node.body[0].value, astroid.Call)):
+                # Most likely a string with a format call. Let's see.
+                func = safe_infer(node.body[0].value.func)
+                if (isinstance(func, astroid.BoundMethod)
+                        and isinstance(func.bound, astroid.Instance)):
+                    # Strings in Python 3, others in Python 2.
+                    if PY3K and func.bound.name == 'str':
+                        return
+                    elif func.bound.name in ('str', 'unicode', 'bytes'):
+                        return
+            self.add_message('missing-docstring', node=node, args=(node_type,),
+                             confidence=confidence)
+        elif not docstring.strip():
+            self.stats['undocumented_'+node_type] += 1
+            self.add_message('empty-docstring', node=node, args=(node_type,),
+                             confidence=confidence)
+
+
+class PassChecker(_BasicChecker):
+    """check if the pass statement is really necessary"""
+    msgs = {'W0107': ('Unnecessary pass statement',
+                      'unnecessary-pass',
+                      'Used when a "pass" statement that can be avoided is '
+                      'encountered.'),
+           }
+    @check_messages('unnecessary-pass')
+    def visit_pass(self, node):
+        if len(node.parent.child_sequence(node)) > 1:
+            self.add_message('unnecessary-pass', node=node)
+
+
+class LambdaForComprehensionChecker(_BasicChecker):
+    """check for using a lambda where a comprehension would do.
+
+    See <http://www.artima.com/weblogs/viewpost.jsp?thread=98196>
+    where GvR says comprehensions would be clearer.
+    """
+
+    msgs = {'W0110': ('map/filter on lambda could be replaced by comprehension',
+                      'deprecated-lambda',
+                      'Used when a lambda is the first argument to "map" or '
+                      '"filter". It could be clearer as a list '
+                      'comprehension or generator expression.',
+                      {'maxversion': (3, 0)}),
+           }
+
+    @check_messages('deprecated-lambda')
+    def visit_call(self, node):
+        """visit a CallFunc node, check if map or filter are called with a
+        lambda
+        """
+        if not node.args:
+            return
+        if not isinstance(node.args[0], astroid.Lambda):
+            return
+        infered = safe_infer(node.func)
+        if (is_builtin_object(infered)
+                and infered.name in ['map', 'filter']):
+            self.add_message('deprecated-lambda', node=node)
+
+
+class RecommandationChecker(_BasicChecker):
+    msgs = {'C0200': ('Consider using enumerate instead of iterating with range and len',
+                      'consider-using-enumerate',
+                      'Emitted when code that iterates with range and len is '
+                      'encountered. Such code can be simplified by using the '
+                      'enumerate builtin.'),
+           }
+
+    @staticmethod
+    def _is_builtin(node, function):
+        inferred = safe_infer(node)
+        if not inferred:
+            return False
+        return is_builtin_object(inferred) and inferred.name == function
+
+    @check_messages('consider-using-enumerate')
+    def visit_for(self, node):
+        """Emit a convention whenever range and len are used for indexing."""
+        # Verify that we have a `range(len(...))` call and that the object
+        # which is iterated is used as a subscript in the body of the for.
+
+        # Is it a proper range call?
+        if not isinstance(node.iter, astroid.Call):
+            return
+        if not self._is_builtin(node.iter.func, 'range'):
+            return
+        if len(node.iter.args) != 1:
+            return
+
+        # Is it a proper len call?
+        if not isinstance(node.iter.args[0], astroid.Call):
+            return
+        second_func = node.iter.args[0].func
+        if not self._is_builtin(second_func, 'len'):
+            return
+        len_args = node.iter.args[0].args
+        if not len_args or len(len_args) != 1:
+            return
+        iterating_object = len_args[0]
+        if not isinstance(iterating_object, astroid.Name):
+            return
+
+        # Verify that the body of the for loop uses a subscript
+        # with the object that was iterated. This uses some heuristics
+        # in order to make sure that the same object is used in the
+        # for body.
+        for child in node.body:
+            for subscript in child.nodes_of_class(astroid.Subscript):
+                if not isinstance(subscript.value, astroid.Name):
+                    continue
+                if not isinstance(subscript.slice, astroid.Index):
+                    continue
+                if not isinstance(subscript.slice.value, astroid.Name):
+                    continue
+                if subscript.slice.value.name != node.target.name:
+                    continue
+                if iterating_object.name != subscript.value.name:
+                    continue
+                if subscript.value.scope() != node.scope():
+                    # Ignore this subscript if it's not in the same
+                    # scope. This means that in the body of the for
+                    # loop, another scope was created, where the same
+                    # name for the iterating object was used.
+                    continue
+                self.add_message('consider-using-enumerate', node=node)
+                return
+
+
+def _is_one_arg_pos_call(call):
+    """Is this a call with exactly 1 argument,
+    where that argument is positional?
+    """
+    return (isinstance(call, astroid.Call)
+            and len(call.args) == 1 and not call.keywords)
+
+
+class ComparisonChecker(_BasicChecker):
+    """Checks for comparisons
+
+    - singleton comparison: 'expr == True', 'expr == False' and 'expr == None'
+    - yoda condition: 'const "comp" right' where comp can be '==', '!=', '<',
+      '<=', '>' or '>=', and right can be a variable, an attribute, a method or
+      a function
+    """
+    msgs = {'C0121': ('Comparison to %s should be %s',
+                      'singleton-comparison',
+                      'Used when an expression is compared to singleton '
+                      'values like True, False or None.'),
+            'C0122': ('Comparison should be %s',
+                      'misplaced-comparison-constant',
+                      'Used when the constant is placed on the left side'
+                      'of a comparison. It is usually clearer in intent to '
+                      'place it in the right hand side of the comparison.'),
+            'C0123': ('Using type() instead of isinstance() for a typecheck.',
+                      'unidiomatic-typecheck',
+                      'The idiomatic way to perform an explicit typecheck in '
+                      'Python is to use isinstance(x, Y) rather than '
+                      'type(x) == Y, type(x) is Y. Though there are unusual '
+                      'situations where these give different results.',
+                      {'old_names': [('W0154', 'unidiomatic-typecheck')]}),
+           }
+
+    def _check_singleton_comparison(self, singleton, root_node):
+        if singleton.value is True:
+            suggestion = "just 'expr' or 'expr is True'"
+            self.add_message('singleton-comparison',
+                             node=root_node,
+                             args=(True, suggestion))
+        elif singleton.value is False:
+            suggestion = "'not expr' or 'expr is False'"
+            self.add_message('singleton-comparison',
+                             node=root_node,
+                             args=(False, suggestion))
+        elif singleton.value is None:
+            self.add_message('singleton-comparison',
+                             node=root_node,
+                             args=(None, "'expr is None'"))
+
+    def _check_misplaced_constant(self, node, left, right, operator):
+        if isinstance(right, astroid.Const):
+            return
+        operator = REVERSED_COMPS.get(operator, operator)
+        suggestion = '%s %s %r' % (right.as_string(), operator, left.value)
+        self.add_message('misplaced-comparison-constant', node=node,
+                         args=(suggestion,))
+
+    @check_messages('singleton-comparison', 'misplaced-comparison-constant',
+                    'unidiomatic-typecheck')
+    def visit_compare(self, node):
+        self._check_unidiomatic_typecheck(node)
+        # NOTE: this checker only works with binary comparisons like 'x == 42'
+        # but not 'x == y == 42'
+        if len(node.ops) != 1:
+            return
+        left = node.left
+        operator, right = node.ops[0]
+        if (operator in ('<', '<=', '>', '>=', '!=', '==')
+                and isinstance(left, astroid.Const)):
+            self._check_misplaced_constant(node, left, right, operator)
+
+        if operator == '==':
+            if isinstance(left, astroid.Const):
+                self._check_singleton_comparison(left, node)
+            elif isinstance(right, astroid.Const):
+                self._check_singleton_comparison(right, node)
+
+    def _check_unidiomatic_typecheck(self, node):
+        operator, right = node.ops[0]
+        if operator in TYPECHECK_COMPARISON_OPERATORS:
+            left = node.left
+            if _is_one_arg_pos_call(left):
+                self._check_type_x_is_y(node, left, operator, right)
+
+    def _check_type_x_is_y(self, node, left, operator, right):
+        """Check for expressions like type(x) == Y."""
+        left_func = safe_infer(left.func)
+        if not (isinstance(left_func, astroid.ClassDef)
+                and left_func.qname() == TYPE_QNAME):
+            return
+
+        if operator in ('is', 'is not') and _is_one_arg_pos_call(right):
+            right_func = safe_infer(right.func)
+            if (isinstance(right_func, astroid.ClassDef)
+                    and right_func.qname() == TYPE_QNAME):
+                # type(x) == type(a)
+                right_arg = safe_infer(right.args[0])
+                if not isinstance(right_arg, LITERAL_NODE_TYPES):
+                    # not e.g. type(x) == type([])
+                    return
+        self.add_message('unidiomatic-typecheck', node=node)
+
+
+class ElifChecker(BaseTokenChecker):
+    """Checks needing to distinguish "else if" from "elif"
+
+    This checker mixes the astroid and the token approaches in order to create
+    knowledge about whether a "else if" node is a true "else if" node, or a
+    "elif" node.
+
+    The following checks depend on this implementation:
+        - check for too many nested blocks (if/elif structures aren't considered
+          as nested)
+        - to be continued
+    """
+    __implements__ = (ITokenChecker, IAstroidChecker)
+    name = 'elif'
+    msgs = {'R0101': ('Too many nested blocks (%s/%s)',
+                      'too-many-nested-blocks',
+                      'Used when a function or a method has too many nested '
+                      'blocks. This makes the code less understandable and '
+                      'maintainable.'),
+            'R0102': ('The if statement can be reduced by %s',
+                      'simplifiable-if-statement',
+                      'Used when an if statement can be reduced to a boolean '
+                      'conversion of the statement\'s test. '),
+           }
+    options = (('max-nested-blocks',
+                {'default' : 5, 'type' : 'int', 'metavar' : '<int>',
+                 'help': 'Maximum number of nested blocks for function / '
+                         'method body'}
+               ),)
+
+    def __init__(self, linter=None):
+        BaseTokenChecker.__init__(self, linter)
+        self._init()
+
+    def _init(self):
+        self._nested_blocks = []
+        self._elifs = []
+        self._if_counter = 0
+        self._nested_blocks_msg = None
+
+    @staticmethod
+    def _is_bool_const(node):
+        return (isinstance(node.value, astroid.Const)
+                and isinstance(node.value.value, bool))
+
+    def _is_actual_elif(self, node):
+        """Check if the given node is an actual elif
+
+        This is a problem we're having with the builtin ast module,
+        which splits `elif` branches into a separate if statement.
+        Unfortunately we need to know the exact type in certain
+        cases.
+        """
+
+        if isinstance(node.parent, astroid.If):
+            orelse = node.parent.orelse
+            # current if node must directly follow a "else"
+            if orelse and orelse == [node]:
+                if self._elifs[self._if_counter]:
+                    return True
+        return False
+
+    def _check_simplifiable_if(self, node):
+        """Check if the given if node can be simplified.
+
+        The if statement can be reduced to a boolean expression
+        in some cases. For instance, if there are two branches
+        and both of them return a boolean value that depends on
+        the result of the statement's test, then this can be reduced
+        to `bool(test)` without losing any functionality.
+        """
+
+        if self._is_actual_elif(node):
+            # Not interested in if statements with multiple branches.
+            return
+        if len(node.orelse) != 1 or len(node.body) != 1:
+            return
+
+        # Check if both branches can be reduced.
+        first_branch = node.body[0]
+        else_branch = node.orelse[0]
+        if isinstance(first_branch, astroid.Return):
+            if not isinstance(else_branch, astroid.Return):
+                return
+            first_branch_is_bool = self._is_bool_const(first_branch)
+            else_branch_is_bool = self._is_bool_const(else_branch)
+            reduced_to = "returning bool of test"
+        elif isinstance(first_branch, astroid.Assign):
+            if not isinstance(else_branch, astroid.Assign):
+                return
+            first_branch_is_bool = self._is_bool_const(first_branch)
+            else_branch_is_bool = self._is_bool_const(else_branch)
+            reduced_to = "assigning bool of test"
+        else:
+            return
+
+        if not first_branch_is_bool or not else_branch_is_bool:
+            return
+        if not first_branch.value.value:
+            # This is a case that can't be easily simplified and
+            # if it can be simplified, it will usually result in a
+            # code that's harder to understand and comprehend.
+            # Let's take for instance `arg and arg <= 3`. This could theoretically be
+            # reduced to `not arg or arg > 3`, but the net result is that now the
+            # condition is harder to understand, because it requires understanding of
+            # an extra clause:
+            #   * first, there is the negation of truthness with `not arg`
+            #   * the second clause is `arg > 3`, which occurs when arg has a
+            #     a truth value, but it implies that `arg > 3` is equivalent
+            #     with `arg and arg > 3`, which means that the user must
+            #     think about this assumption when evaluating `arg > 3`.
+            #     The original form is easier to grasp.
+            return
+
+        self.add_message('simplifiable-if-statement', node=node,
+                         args=(reduced_to, ))
+
+    def process_tokens(self, tokens):
+        # Process tokens and look for 'if' or 'elif'
+        for _, token, _, _, _ in tokens:
+            if token == 'elif':
+                self._elifs.append(True)
+            elif token == 'if':
+                self._elifs.append(False)
+
+    def leave_module(self, _):
+        self._init()
+
+    @check_messages('too-many-nested-blocks')
+    def visit_tryexcept(self, node):
+        self._check_nested_blocks(node)
+
+    visit_tryfinally = visit_tryexcept
+    visit_while = visit_tryexcept
+    visit_for = visit_while
+
+    def visit_ifexp(self, _):
+        self._if_counter += 1
+
+    def visit_comprehension(self, node):
+        self._if_counter += len(node.ifs)
+
+    @check_messages('too-many-nested-blocks', 'simplifiable-if-statement')
+    def visit_if(self, node):
+        self._check_simplifiable_if(node)
+        self._check_nested_blocks(node)
+        self._if_counter += 1
+
+    @check_messages('too-many-nested-blocks')
+    def leave_functiondef(self, _):
+        # new scope = reinitialize the stack of nested blocks
+        self._nested_blocks = []
+        # if there is a waiting message left, send it
+        if self._nested_blocks_msg:
+            self.add_message('too-many-nested-blocks',
+                             node=self._nested_blocks_msg[0],
+                             args=self._nested_blocks_msg[1])
+            self._nested_blocks_msg = None
+
+    def _check_nested_blocks(self, node):
+        """Update and check the number of nested blocks
+        """
+        # only check block levels inside functions or methods
+        if not isinstance(node.scope(), astroid.FunctionDef):
+            return
+        # messages are triggered on leaving the nested block. Here we save the
+        # stack in case the current node isn't nested in the previous one
+        nested_blocks = self._nested_blocks[:]
+        if node.parent == node.scope():
+            self._nested_blocks = [node]
+        else:
+            # go through ancestors from the most nested to the less
+            for ancestor_node in reversed(self._nested_blocks):
+                if ancestor_node == node.parent:
+                    break
+                self._nested_blocks.pop()
+            # if the node is a elif, this should not be another nesting level
+            if isinstance(node, astroid.If) and self._elifs[self._if_counter]:
+                if self._nested_blocks:
+                    self._nested_blocks.pop()
+            self._nested_blocks.append(node)
+        # send message only once per group of nested blocks
+        if len(nested_blocks) > self.config.max_nested_blocks:
+            if len(nested_blocks) > len(self._nested_blocks):
+                self.add_message('too-many-nested-blocks', node=nested_blocks[0],
+                                 args=(len(nested_blocks),
+                                       self.config.max_nested_blocks))
+                self._nested_blocks_msg = None
+            else:
+                # if time has not come yet to send the message (ie the stack of
+                # nested nodes is still increasing), save it in case the
+                # current node is the last one of the function
+                self._nested_blocks_msg = (self._nested_blocks[0],
+                                           (len(self._nested_blocks),
+                                            self.config.max_nested_blocks))
+
+class NotChecker(_BasicChecker):
+    """checks for too many not in comparison expressions
+
+    - "not not" should trigger a warning
+    - "not" followed by a comparison should trigger a warning
+    """
+    msgs = {'C0113': ('Consider changing "%s" to "%s"',
+                      'unneeded-not',
+                      'Used when a boolean expression contains an unneeded '
+                      'negation.'),
+           }
+
+    reverse_op = {'<': '>=', '<=': '>', '>': '<=', '>=': '<', '==': '!=',
+                  '!=': '==', 'in': 'not in', 'is': 'is not'}
+    # sets are not ordered, so for example "not set(LEFT_VALS) <= set(RIGHT_VALS)" is
+    # not equivalent to "set(LEFT_VALS) > set(RIGHT_VALS)"
+    skipped_nodes = (astroid.Set, )
+    # 'builtins' py3, '__builtin__' py2
+    skipped_classnames = ['%s.%s' % (six.moves.builtins.__name__, qname)
+                          for qname in ('set', 'frozenset')]
+
+    @check_messages('unneeded-not')
+    def visit_unaryop(self, node):
+        if node.op != 'not':
+            return
+        operand = node.operand
+
+        if isinstance(operand, astroid.UnaryOp) and operand.op == 'not':
+            self.add_message('unneeded-not', node=node,
+                             args=(node.as_string(),
+                                   operand.operand.as_string()))
+        elif isinstance(operand, astroid.Compare):
+            left = operand.left
+            # ignore multiple comparisons
+            if len(operand.ops) > 1:
+                return
+            operator, right = operand.ops[0]
+            if operator not in self.reverse_op:
+                return
+            # Ignore __ne__ as function of __eq__
+            frame = node.frame()
+            if frame.name == '__ne__' and operator == '==':
+                return
+            for _type in (_node_type(left), _node_type(right)):
+                if not _type:
+                    return
+                if isinstance(_type, self.skipped_nodes):
+                    return
+                if (isinstance(_type, astroid.Instance) and
+                        _type.qname() in self.skipped_classnames):
+                    return
+            suggestion = '%s %s %s' % (left.as_string(),
+                                       self.reverse_op[operator],
+                                       right.as_string())
+            self.add_message('unneeded-not', node=node,
+                             args=(node.as_string(), suggestion))
+
+
+class MultipleTypesChecker(BaseChecker):
+    """Checks for variable type redefinitions (NoneType excepted)
+
+    At a function, method, class or module scope
+
+    This rule could be improved:
+    - Currently, if an attribute is set to different types in 2 methods of a
+      same class, it won't be detected (see functional test)
+    - One could improve the support for inference on assignment with tuples,
+      ifexpr, etc. Also it would be great to have support for inference on
+      str.split()
+    """
+    __implements__ = IAstroidChecker
+
+    name = 'multiple_types'
+    msgs = {'R0204': ('Redefinition of %s type from %s to %s',
+                      'redefined-variable-type',
+                      'Used when the type of a variable changes inside a '
+                      'method or a function.'
+                     ),
+           }
+
+    def visit_classdef(self, _):
+        self._assigns.append({})
+
+    @check_messages('redefined-variable-type')
+    def leave_classdef(self, _):
+        self._check_and_add_messages()
+
+    visit_functiondef = visit_classdef
+    leave_functiondef = leave_module = leave_classdef
+
+    def visit_module(self, _):
+        self._assigns = [{}]
+
+    def _check_and_add_messages(self):
+        assigns = self._assigns.pop()
+        for name, args in assigns.items():
+            if len(args) <= 1:
+                continue
+            _, orig_type = args[0]
+            # Check if there is a type in the following nodes that would be
+            # different from orig_type.
+            for redef_node, redef_type in args[1:]:
+                if redef_type != orig_type:
+                    orig_type = orig_type.replace(BUILTINS + ".", '')
+                    redef_type = redef_type.replace(BUILTINS + ".", '')
+                    self.add_message('redefined-variable-type', node=redef_node,
+                                     args=(name, orig_type, redef_type))
+                    break
+
+    def visit_assign(self, node):
+        # we don't handle multiple assignment nor slice assignment
+        target = node.targets[0]
+        if isinstance(target, (astroid.Tuple, astroid.Subscript)):
+            return
+        # ignore NoneType
+        if _is_none(node):
+            return
+        _type = _node_type(node.value)
+        if _type:
+            self._assigns[-1].setdefault(target.as_string(), []).append(
+                (node, _type.pytype()))
+
+
+def register(linter):
+    """required method to auto register this checker"""
+    linter.register_checker(BasicErrorChecker(linter))
+    linter.register_checker(BasicChecker(linter))
+    linter.register_checker(NameChecker(linter))
+    linter.register_checker(DocStringChecker(linter))
+    linter.register_checker(PassChecker(linter))
+    linter.register_checker(LambdaForComprehensionChecker(linter))
+    linter.register_checker(ComparisonChecker(linter))
+    linter.register_checker(NotChecker(linter))
+    linter.register_checker(RecommandationChecker(linter))
+    linter.register_checker(ElifChecker(linter))
+    linter.register_checker(MultipleTypesChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/newstyle.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/newstyle.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/newstyle.py	(revision 1126)
@@ -0,0 +1,169 @@
+# Copyright (c) 2005-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""check for new / old style related problems
+"""
+import sys
+
+import astroid
+
+from pylint.interfaces import IAstroidChecker, INFERENCE, INFERENCE_FAILURE, HIGH
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import (
+    check_messages,
+    node_frame_class,
+    has_known_bases
+)
+
+MSGS = {
+    'E1001': ('Use of __slots__ on an old style class',
+              'slots-on-old-class',
+              'Used when an old style class uses the __slots__ attribute.',
+              {'maxversion': (3, 0)}),
+    'E1002': ('Use of super on an old style class',
+              'super-on-old-class',
+              'Used when an old style class uses the super builtin.',
+              {'maxversion': (3, 0)}),
+    'E1003': ('Bad first argument %r given to super()',
+              'bad-super-call',
+              'Used when another argument than the current class is given as \
+              first argument of the super builtin.'),
+    'E1004': ('Missing argument to super()',
+              'missing-super-argument',
+              'Used when the super builtin didn\'t receive an \
+               argument.',
+              {'maxversion': (3, 0)}),
+    'W1001': ('Use of "property" on an old style class',
+              'property-on-old-class',
+              'Used when Pylint detect the use of the builtin "property" \
+              on an old style class while this is relying on new style \
+              classes features.',
+              {'maxversion': (3, 0)}),
+    'C1001': ('Old-style class defined.',
+              'old-style-class',
+              'Used when a class is defined that does not inherit from another'
+              'class and does not inherit explicitly from "object".',
+              {'maxversion': (3, 0)})
+    }
+
+
+class NewStyleConflictChecker(BaseChecker):
+    """checks for usage of new style capabilities on old style classes and
+    other new/old styles conflicts problems
+    * use of property, __slots__, super
+    * "super" usage
+    """
+
+    __implements__ = (IAstroidChecker,)
+
+    # configuration section name
+    name = 'newstyle'
+    # messages
+    msgs = MSGS
+    priority = -2
+    # configuration options
+    options = ()
+
+    @check_messages('slots-on-old-class', 'old-style-class')
+    def visit_classdef(self, node):
+        """ Check __slots__ in old style classes and old
+        style class definition.
+        """
+        if '__slots__' in node and not node.newstyle:
+            confidence = (INFERENCE if has_known_bases(node)
+                          else INFERENCE_FAILURE)
+            self.add_message('slots-on-old-class', node=node,
+                             confidence=confidence)
+        # The node type could be class, exception, metaclass, or
+        # interface.  Presumably, the non-class-type nodes would always
+        # have an explicit base class anyway.
+        if not node.bases and node.type == 'class' and not node.metaclass():
+            # We use confidence HIGH here because this message should only ever
+            # be emitted for classes at the root of the inheritance hierarchyself.
+            self.add_message('old-style-class', node=node, confidence=HIGH)
+
+    @check_messages('property-on-old-class')
+    def visit_call(self, node):
+        """check property usage"""
+        parent = node.parent.frame()
+        if (isinstance(parent, astroid.ClassDef) and
+                not parent.newstyle and
+                isinstance(node.func, astroid.Name)):
+            confidence = (INFERENCE if has_known_bases(parent)
+                          else INFERENCE_FAILURE)
+            name = node.func.name
+            if name == 'property':
+                self.add_message('property-on-old-class', node=node,
+                                 confidence=confidence)
+
+    @check_messages('super-on-old-class', 'bad-super-call', 'missing-super-argument')
+    def visit_functiondef(self, node):
+        """check use of super"""
+        # ignore actual functions or method within a new style class
+        if not node.is_method():
+            return
+        klass = node.parent.frame()
+        for stmt in node.nodes_of_class(astroid.Call):
+            if node_frame_class(stmt) != node_frame_class(node):
+                # Don't look down in other scopes.
+                continue
+            expr = stmt.func
+            if not isinstance(expr, astroid.Attribute):
+                continue
+            call = expr.expr
+            # skip the test if using super
+            if not (isinstance(call, astroid.Call) and
+                    isinstance(call.func, astroid.Name) and
+                    call.func.name == 'super'):
+                continue
+
+            if not klass.newstyle and has_known_bases(klass):
+                # super should not be used on an old style class
+                self.add_message('super-on-old-class', node=node)
+            else:
+                # super first arg should be the class
+                if not call.args and sys.version_info[0] == 3:
+                    # unless Python 3
+                    continue
+
+                try:
+                    supcls = (call.args and next(call.args[0].infer())
+                              or None)
+                except astroid.InferenceError:
+                    continue
+
+                if supcls is None:
+                    self.add_message('missing-super-argument', node=call)
+                    continue
+
+                if klass is not supcls:
+                    name = None
+                    # if supcls is not YES, then supcls was infered
+                    # and use its name. Otherwise, try to look
+                    # for call.args[0].name
+                    if supcls is not astroid.YES:
+                        name = supcls.name
+                    else:
+                        if hasattr(call.args[0], 'name'):
+                            name = call.args[0].name
+                    if name is not None:
+                        self.add_message('bad-super-call', node=call, args=(name, ))
+
+    visit_asyncfunctiondef = visit_functiondef
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(NewStyleConflictChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/design_analysis.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/design_analysis.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/design_analysis.py	(revision 1126)
@@ -0,0 +1,348 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""check for signs of poor design"""
+
+import re
+from collections import defaultdict
+
+from astroid import If, BoolOp
+
+from pylint.interfaces import IAstroidChecker
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import check_messages
+
+# regexp for ignored argument name
+IGNORED_ARGUMENT_NAMES = re.compile('_.*')
+
+
+MSGS = {
+    'R0901': ('Too many ancestors (%s/%s)',
+              'too-many-ancestors',
+              'Used when class has too many parent classes, try to reduce \
+              this to get a simpler (and so easier to use) class.'),
+    'R0902': ('Too many instance attributes (%s/%s)',
+              'too-many-instance-attributes',
+              'Used when class has too many instance attributes, try to reduce \
+              this to get a simpler (and so easier to use) class.'),
+    'R0903': ('Too few public methods (%s/%s)',
+              'too-few-public-methods',
+              'Used when class has too few public methods, so be sure it\'s \
+              really worth it.'),
+    'R0904': ('Too many public methods (%s/%s)',
+              'too-many-public-methods',
+              'Used when class has too many public methods, try to reduce \
+              this to get a simpler (and so easier to use) class.'),
+
+    'R0911': ('Too many return statements (%s/%s)',
+              'too-many-return-statements',
+              'Used when a function or method has too many return statement, \
+              making it hard to follow.'),
+    'R0912': ('Too many branches (%s/%s)',
+              'too-many-branches',
+              'Used when a function or method has too many branches, \
+              making it hard to follow.'),
+    'R0913': ('Too many arguments (%s/%s)',
+              'too-many-arguments',
+              'Used when a function or method takes too many arguments.'),
+    'R0914': ('Too many local variables (%s/%s)',
+              'too-many-locals',
+              'Used when a function or method has too many local variables.'),
+    'R0915': ('Too many statements (%s/%s)',
+              'too-many-statements',
+              'Used when a function or method has too many statements. You \
+              should then split it in smaller functions / methods.'),
+    'R0916': ('Too many boolean expressions in if statement (%s/%s)',
+              'too-many-boolean-expressions',
+              'Used when a if statement contains too many boolean '
+              'expressions'),
+    }
+
+
+def _count_boolean_expressions(bool_op):
+    """Counts the number of boolean expressions in BoolOp `bool_op` (recursive)
+
+    example: a and (b or c or (d and e)) ==> 5 boolean expressions
+    """
+    nb_bool_expr = 0
+    for bool_expr in bool_op.get_children():
+        if isinstance(bool_expr, BoolOp):
+            nb_bool_expr += _count_boolean_expressions(bool_expr)
+        else:
+            nb_bool_expr += 1
+    return nb_bool_expr
+
+
+class MisdesignChecker(BaseChecker):
+    """checks for sign of poor/misdesign:
+    * number of methods, attributes, local variables...
+    * size, complexity of functions, methods
+    """
+
+    __implements__ = (IAstroidChecker,)
+
+    # configuration section name
+    name = 'design'
+    # messages
+    msgs = MSGS
+    priority = -2
+    # configuration options
+    options = (('max-args',
+                {'default' : 5, 'type' : 'int', 'metavar' : '<int>',
+                 'help': 'Maximum number of arguments for function / method'}
+               ),
+               ('ignored-argument-names',
+                {'default' : IGNORED_ARGUMENT_NAMES,
+                 'type' :'regexp', 'metavar' : '<regexp>',
+                 'help' : 'Argument names that match this expression will be '
+                          'ignored. Default to name with leading underscore'}
+               ),
+               ('max-locals',
+                {'default' : 15, 'type' : 'int', 'metavar' : '<int>',
+                 'help': 'Maximum number of locals for function / method body'}
+               ),
+               ('max-returns',
+                {'default' : 6, 'type' : 'int', 'metavar' : '<int>',
+                 'help': 'Maximum number of return / yield for function / '
+                         'method body'}
+               ),
+               ('max-branches',
+                {'default' : 12, 'type' : 'int', 'metavar' : '<int>',
+                 'help': 'Maximum number of branch for function / method body'}
+               ),
+               ('max-statements',
+                {'default' : 50, 'type' : 'int', 'metavar' : '<int>',
+                 'help': 'Maximum number of statements in function / method '
+                         'body'}
+               ),
+               ('max-parents',
+                {'default' : 7,
+                 'type' : 'int',
+                 'metavar' : '<num>',
+                 'help' : 'Maximum number of parents for a class (see R0901).'}
+               ),
+               ('max-attributes',
+                {'default' : 7,
+                 'type' : 'int',
+                 'metavar' : '<num>',
+                 'help' : 'Maximum number of attributes for a class \
+(see R0902).'}
+               ),
+               ('min-public-methods',
+                {'default' : 2,
+                 'type' : 'int',
+                 'metavar' : '<num>',
+                 'help' : 'Minimum number of public methods for a class \
+(see R0903).'}
+               ),
+               ('max-public-methods',
+                {'default' : 20,
+                 'type' : 'int',
+                 'metavar' : '<num>',
+                 'help' : 'Maximum number of public methods for a class \
+(see R0904).'}
+               ),
+               ('max-bool-expr',
+                {'default': 5,
+                 'type': 'int',
+                 'metavar': '<num>',
+                 'help': 'Maximum number of boolean expressions in a if '
+                         'statement'}
+               ),
+              )
+
+    def __init__(self, linter=None):
+        BaseChecker.__init__(self, linter)
+        self.stats = None
+        self._returns = None
+        self._branches = None
+        self._stmts = 0
+
+    def open(self):
+        """initialize visit variables"""
+        self.stats = self.linter.add_stats()
+        self._returns = []
+        self._branches = defaultdict(int)
+
+    @check_messages('too-many-ancestors', 'too-many-instance-attributes',
+                    'too-few-public-methods', 'too-many-public-methods')
+    def visit_classdef(self, node):
+        """check size of inheritance hierarchy and number of instance attributes
+        """
+        # Is the total inheritance hierarchy is 7 or less?
+        nb_parents = len(list(node.ancestors()))
+        if nb_parents > self.config.max_parents:
+            self.add_message('too-many-ancestors', node=node,
+                             args=(nb_parents, self.config.max_parents))
+        # Does the class contain less than 20 attributes for
+        # non-GUI classes (40 for GUI)?
+        # FIXME detect gui classes
+        if len(node.instance_attrs) > self.config.max_attributes:
+            self.add_message('too-many-instance-attributes', node=node,
+                             args=(len(node.instance_attrs),
+                                   self.config.max_attributes))
+
+    @check_messages('too-few-public-methods', 'too-many-public-methods')
+    def leave_classdef(self, node):
+        """check number of public methods"""
+        my_methods = sum(1 for method in node.mymethods()
+                         if not method.name.startswith('_'))
+        all_methods = sum(1 for method in node.methods()
+                          if not method.name.startswith('_'))
+
+        # Does the class contain less than n public methods ?
+        # This checks only the methods defined in the current class,
+        # since the user might not have control over the classes
+        # from the ancestors. It avoids some false positives
+        # for classes such as unittest.TestCase, which provides
+        # a lot of assert methods. It doesn't make sense to warn
+        # when the user subclasses TestCase to add his own tests.
+        if my_methods > self.config.max_public_methods:
+            self.add_message('too-many-public-methods', node=node,
+                             args=(my_methods,
+                                   self.config.max_public_methods))
+        # stop here for exception, metaclass and interface classes
+        if node.type != 'class':
+            return
+
+        # Does the class contain more than n public methods ?
+        # This checks all the methods defined by ancestors and
+        # by the current class.
+        if all_methods < self.config.min_public_methods:
+            self.add_message('too-few-public-methods', node=node,
+                             args=(all_methods,
+                                   self.config.min_public_methods))
+
+    @check_messages('too-many-return-statements', 'too-many-branches',
+                    'too-many-arguments', 'too-many-locals',
+                    'too-many-statements')
+    def visit_functiondef(self, node):
+        """check function name, docstring, arguments, redefinition,
+        variable names, max locals
+        """
+        # init branch and returns counters
+        self._returns.append(0)
+        # check number of arguments
+        args = node.args.args
+        if args is not None:
+            ignored_args_num = len(
+                [arg for arg in args
+                 if self.config.ignored_argument_names.match(arg.name)])
+            argnum = len(args) - ignored_args_num
+            if  argnum > self.config.max_args:
+                self.add_message('too-many-arguments', node=node,
+                                 args=(len(args), self.config.max_args))
+        else:
+            ignored_args_num = 0
+        # check number of local variables
+        locnum = len(node.locals) - ignored_args_num
+        if locnum > self.config.max_locals:
+            self.add_message('too-many-locals', node=node,
+                             args=(locnum, self.config.max_locals))
+        # init statements counter
+        self._stmts = 1
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    @check_messages('too-many-return-statements', 'too-many-branches',
+                    'too-many-arguments', 'too-many-locals',
+                    'too-many-statements')
+    def leave_functiondef(self, node):
+        """most of the work is done here on close:
+        checks for max returns, branch, return in __init__
+        """
+        returns = self._returns.pop()
+        if returns > self.config.max_returns:
+            self.add_message('too-many-return-statements', node=node,
+                             args=(returns, self.config.max_returns))
+        branches = self._branches[node]
+        if branches > self.config.max_branches:
+            self.add_message('too-many-branches', node=node,
+                             args=(branches, self.config.max_branches))
+        # check number of statements
+        if self._stmts > self.config.max_statements:
+            self.add_message('too-many-statements', node=node,
+                             args=(self._stmts, self.config.max_statements))
+
+    leave_asyncfunctiondef = leave_functiondef
+
+    def visit_return(self, _):
+        """count number of returns"""
+        if not self._returns:
+            return # return outside function, reported by the base checker
+        self._returns[-1] += 1
+
+    def visit_default(self, node):
+        """default visit method -> increments the statements counter if
+        necessary
+        """
+        if node.is_statement:
+            self._stmts += 1
+
+    def visit_tryexcept(self, node):
+        """increments the branches counter"""
+        branches = len(node.handlers)
+        if node.orelse:
+            branches += 1
+        self._inc_branch(node, branches)
+        self._stmts += branches
+
+    def visit_tryfinally(self, node):
+        """increments the branches counter"""
+        self._inc_branch(node, 2)
+        self._stmts += 2
+
+    @check_messages('too-many-boolean-expressions')
+    def visit_if(self, node):
+        """increments the branches counter and checks boolean expressions"""
+        self._check_boolean_expressions(node)
+        branches = 1
+        # don't double count If nodes coming from some 'elif'
+        if node.orelse and (len(node.orelse) > 1 or
+                            not isinstance(node.orelse[0], If)):
+            branches += 1
+        self._inc_branch(node, branches)
+        self._stmts += branches
+
+    def _check_boolean_expressions(self, node):
+        """Go through "if" node `node` and counts its boolean expressions
+
+        if the "if" node test is a BoolOp node
+        """
+        condition = node.test
+        if not isinstance(condition, BoolOp):
+            return
+        nb_bool_expr = _count_boolean_expressions(condition)
+        if nb_bool_expr > self.config.max_bool_expr:
+            self.add_message('too-many-boolean-expressions', node=condition,
+                             args=(nb_bool_expr, self.config.max_bool_expr))
+
+    def visit_while(self, node):
+        """increments the branches counter"""
+        branches = 1
+        if node.orelse:
+            branches += 1
+        self._inc_branch(node, branches)
+
+    visit_for = visit_while
+
+    def _inc_branch(self, node, branchesnum=1):
+        """increments the branches counter"""
+        self._branches[node.scope()] += branchesnum
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(MisdesignChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/async.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/async.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/async.py	(revision 1126)
@@ -0,0 +1,82 @@
+# Copyright (c) 2003-2015 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Checker for anything related to the async protocol (PEP 492)."""
+
+import astroid
+from astroid import exceptions
+
+from pylint import checkers
+from pylint.checkers import utils as checker_utils
+from pylint import interfaces
+from pylint import utils
+
+
+class AsyncChecker(checkers.BaseChecker):
+    __implements__ = interfaces.IAstroidChecker
+    name = 'async'
+    msgs = {
+        'E1700': ('Yield inside async function',
+                  'yield-inside-async-function',
+                  'Used when an `yield` or `yield from` statement is '
+                  'found inside an async function.',
+                  {'minversion': (3, 5)}),
+        'E1701': ("Async context manager '%s' doesn't implement __aenter__ and __aexit__.",
+                  'not-async-context-manager',
+                  'Used when an async context manager is used with an object '
+                  'that does not implement the async context management protocol.',
+                  {'minversion': (3, 5)}),
+    }
+
+    def open(self):
+        self._ignore_mixin_members = utils.get_global_option(self, 'ignore-mixin-members')
+
+    @checker_utils.check_messages('yield-inside-async-function')
+    def visit_asyncfunctiondef(self, node):
+        for child in node.nodes_of_class(astroid.Yield):
+            if child.scope() is node:
+                self.add_message('yield-inside-async-function', node=child)
+
+    @checker_utils.check_messages('not-async-context-manager')
+    def visit_asyncwith(self, node):
+        for ctx_mgr, _ in node.items:
+            infered = checker_utils.safe_infer(ctx_mgr)
+            if infered is None or infered is astroid.YES:
+                continue
+
+            if isinstance(infered, astroid.Instance):
+                try:
+                    infered.getattr('__aenter__')
+                    infered.getattr('__aexit__')
+                except exceptions.NotFoundError:
+                    if isinstance(infered, astroid.Instance):
+                        # If we do not know the bases of this class,
+                        # just skip it.
+                        if not checker_utils.has_known_bases(infered):
+                            continue
+                        # Just ignore mixin classes.
+                        if self._ignore_mixin_members:
+                            if infered.name[-5:].lower() == 'mixin':
+                                continue
+                else:
+                    continue
+
+            self.add_message('not-async-context-manager',
+                             node=node, args=(infered.name, ))
+
+
+def register(linter):
+    """required method to auto register this checker"""
+    linter.register_checker(AsyncChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/spelling.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/spelling.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/spelling.py	(revision 1126)
@@ -0,0 +1,264 @@
+# Copyright 2014 Michal Nowikowski.
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Checker for spelling errors in comments and docstrings.
+"""
+
+import os
+import sys
+import tokenize
+import string
+import re
+
+try:
+    import enchant
+except ImportError:
+    enchant = None
+import six
+
+from pylint.interfaces import ITokenChecker, IAstroidChecker
+from pylint.checkers import BaseTokenChecker
+from pylint.checkers.utils import check_messages
+
+if sys.version_info[0] >= 3:
+    maketrans = str.maketrans
+else:
+    maketrans = string.maketrans
+
+if enchant is not None:
+    br = enchant.Broker()
+    dicts = br.list_dicts()
+    dict_choices = [''] + [d[0] for d in dicts]
+    dicts = ["%s (%s)" % (d[0], d[1].name) for d in dicts]
+    dicts = ", ".join(dicts)
+    instr = ""
+else:
+    dicts = "none"
+    dict_choices = ['']
+    instr = " To make it working install python-enchant package."
+
+table = maketrans("", "")
+
+
+class SpellingChecker(BaseTokenChecker):
+    """Check spelling in comments and docstrings"""
+    __implements__ = (ITokenChecker, IAstroidChecker)
+    name = 'spelling'
+    msgs = {
+        'C0401': ('Wrong spelling of a word \'%s\' in a comment:\n%s\n'
+                  '%s\nDid you mean: \'%s\'?',
+                  'wrong-spelling-in-comment',
+                  'Used when a word in comment is not spelled correctly.'),
+        'C0402': ('Wrong spelling of a word \'%s\' in a docstring:\n%s\n'
+                  '%s\nDid you mean: \'%s\'?',
+                  'wrong-spelling-in-docstring',
+                  'Used when a word in docstring is not spelled correctly.'),
+        'C0403': ('Invalid characters %r in a docstring',
+                  'invalid-characters-in-docstring',
+                  'Used when a word in docstring cannot be checked by enchant.'),
+        }
+    options = (('spelling-dict',
+                {'default' : '', 'type' : 'choice', 'metavar' : '<dict name>',
+                 'choices': dict_choices,
+                 'help' : 'Spelling dictionary name. '
+                          'Available dictionaries: %s.%s' % (dicts, instr)}),
+               ('spelling-ignore-words',
+                {'default' : '',
+                 'type' : 'string',
+                 'metavar' : '<comma separated words>',
+                 'help' : 'List of comma separated words that '
+                          'should not be checked.'}),
+               ('spelling-private-dict-file',
+                {'default' : '',
+                 'type' : 'string',
+                 'metavar' : '<path to file>',
+                 'help' : 'A path to a file that contains private '
+                          'dictionary; one word per line.'}),
+               ('spelling-store-unknown-words',
+                {'default' : 'n', 'type' : 'yn', 'metavar' : '<y_or_n>',
+                 'help' : 'Tells whether to store unknown words to '
+                          'indicated private dictionary in '
+                          '--spelling-private-dict-file option instead of '
+                          'raising a message.'}),
+              )
+
+    def open(self):
+        self.initialized = False
+        self.private_dict_file = None
+
+        if enchant is None:
+            return
+        dict_name = self.config.spelling_dict
+        if not dict_name:
+            return
+
+        self.ignore_list = [w.strip() for w in self.config.spelling_ignore_words.split(",")]
+        # "param" appears in docstring in param description and
+        # "pylint" appears in comments in pylint pragmas.
+        self.ignore_list.extend(["param", "pylint"])
+
+        # Expand tilde to allow e.g. spelling-private-dict-file = ~/.pylintdict
+        if self.config.spelling_private_dict_file:
+            self.config.spelling_private_dict_file = os.path.expanduser(
+                self.config.spelling_private_dict_file)
+
+        if self.config.spelling_private_dict_file:
+            self.spelling_dict = enchant.DictWithPWL(
+                dict_name, self.config.spelling_private_dict_file)
+            self.private_dict_file = open(
+                self.config.spelling_private_dict_file, "a")
+        else:
+            self.spelling_dict = enchant.Dict(dict_name)
+
+        if self.config.spelling_store_unknown_words:
+            self.unknown_words = set()
+
+        # Prepare regex for stripping punctuation signs from text.
+        # ' and _ are treated in a special way.
+        puncts = string.punctuation.replace("'", "").replace("_", "")
+        self.punctuation_regex = re.compile('[%s]' % re.escape(puncts))
+        self.initialized = True
+
+    def close(self):
+        if self.private_dict_file:
+            self.private_dict_file.close()
+
+    def _check_spelling(self, msgid, line, line_num):
+        line2 = line.strip()
+        # Replace ['afadf with afadf (but preserve don't)
+        line2 = re.sub("'([^a-zA-Z]|$)", " ", line2)
+        # Replace afadf'] with afadf (but preserve don't)
+        line2 = re.sub("([^a-zA-Z]|^)'", " ", line2)
+        # Replace punctuation signs with space e.g. and/or -> and or
+        line2 = self.punctuation_regex.sub(' ', line2)
+
+        words = []
+        for word in line2.split():
+            # Skip words with digits.
+            if len(re.findall(r"\d", word)) > 0:
+                continue
+
+            # Skip words with mixed big and small letters,
+            # they are probaly class names.
+            if (len(re.findall("[A-Z]", word)) > 0 and
+                    len(re.findall("[a-z]", word)) > 0 and
+                    len(word) > 2):
+                continue
+
+            # Skip words with _ - they are probably function parameter names.
+            if word.count('_') > 0:
+                continue
+
+            words.append(word)
+
+        # Go through words and check them.
+        for word in words:
+            # Skip words from ignore list.
+            if word in self.ignore_list:
+                continue
+
+            orig_word = word
+            word = word.lower()
+
+            # Strip starting u' from unicode literals and r' from raw strings.
+            if (word.startswith("u'") or
+                    word.startswith('u"') or
+                    word.startswith("r'") or
+                    word.startswith('r"')) and len(word) > 2:
+                word = word[2:]
+
+            # If it is a known word, then continue.
+            try:
+                if self.spelling_dict.check(word):
+                    continue
+            except enchant.errors.Error:
+                # this can only happen in docstrings, not comments
+                self.add_message('invalid-characters-in-docstring',
+                                 line=line_num, args=(word,))
+                continue
+
+            # Store word to private dict or raise a message.
+            if self.config.spelling_store_unknown_words:
+                if word not in self.unknown_words:
+                    self.private_dict_file.write("%s\n" % word)
+                    self.unknown_words.add(word)
+            else:
+                # Present up to 4 suggestions.
+                # TODO: add support for customising this.
+                suggestions = self.spelling_dict.suggest(word)[:4]
+
+                m = re.search(r"(\W|^)(%s)(\W|$)" % word, line.lower())
+                if m:
+                    # Start position of second group in regex.
+                    col = m.regs[2][0]
+                else:
+                    col = line.lower().index(word)
+                indicator = (" " * col) + ("^" * len(word))
+
+                self.add_message(msgid, line=line_num,
+                                 args=(orig_word, line,
+                                       indicator,
+                                       "' or '".join(suggestions)))
+
+    def process_tokens(self, tokens):
+        if not self.initialized:
+            return
+
+        # Process tokens and look for comments.
+        for (tok_type, token, (start_row, _), _, _) in tokens:
+            if tok_type == tokenize.COMMENT:
+                self._check_spelling('wrong-spelling-in-comment',
+                                     token, start_row)
+
+    @check_messages('wrong-spelling-in-docstring')
+    def visit_module(self, node):
+        if not self.initialized:
+            return
+        self._check_docstring(node)
+
+    @check_messages('wrong-spelling-in-docstring')
+    def visit_classdef(self, node):
+        if not self.initialized:
+            return
+        self._check_docstring(node)
+
+    @check_messages('wrong-spelling-in-docstring')
+    def visit_functiondef(self, node):
+        if not self.initialized:
+            return
+        self._check_docstring(node)
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    def _check_docstring(self, node):
+        """check the node has any spelling errors"""
+        docstring = node.doc
+        if not docstring:
+            return
+
+        start_line = node.lineno + 1
+        if six.PY2:
+            encoding = node.root().file_encoding
+            docstring = docstring.decode(encoding or sys.getdefaultencoding(),
+                                         'replace')
+
+        # Go through lines of docstring
+        for idx, line in enumerate(docstring.splitlines()):
+            self._check_spelling('wrong-spelling-in-docstring',
+                                 line, start_line + idx)
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(SpellingChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/raw_metrics.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/raw_metrics.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/raw_metrics.py	(revision 1126)
@@ -0,0 +1,129 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+""" Copyright (c) 2003-2010 LOGILAB S.A. (Paris, FRANCE).
+ http://www.logilab.fr/ -- mailto:contact@logilab.fr
+
+Raw metrics checker
+"""
+
+import tokenize
+
+# pylint now requires pylint >= 2.2, so this is no longer necessary
+#if not hasattr(tokenize, 'NL'):
+#    raise ValueError("tokenize.NL doesn't exist -- tokenize module too old")
+
+from pylint.interfaces import ITokenChecker
+from pylint.utils import EmptyReport
+from pylint.checkers import BaseTokenChecker
+from pylint.reporters import diff_string
+from pylint.reporters.ureports.nodes import Table
+
+
+def report_raw_stats(sect, stats, old_stats):
+    """calculate percentage of code / doc / comment / empty
+    """
+    total_lines = stats['total_lines']
+    if not total_lines:
+        raise EmptyReport()
+    sect.description = '%s lines have been analyzed' % total_lines
+    lines = ('type', 'number', '%', 'previous', 'difference')
+    for node_type in ('code', 'docstring', 'comment', 'empty'):
+        key = node_type + '_lines'
+        total = stats[key]
+        percent = float(total * 100) / total_lines
+        old = old_stats.get(key, None)
+        if old is not None:
+            diff_str = diff_string(old, total)
+        else:
+            old, diff_str = 'NC', 'NC'
+        lines += (node_type, str(total), '%.2f' % percent,
+                  str(old), diff_str)
+    sect.append(Table(children=lines, cols=5, rheaders=1))
+
+
+class RawMetricsChecker(BaseTokenChecker):
+    """does not check anything but gives some raw metrics :
+    * total number of lines
+    * total number of code lines
+    * total number of docstring lines
+    * total number of comments lines
+    * total number of empty lines
+    """
+
+    __implements__ = (ITokenChecker,)
+
+    # configuration section name
+    name = 'metrics'
+    # configuration options
+    options = ()
+    # messages
+    msgs = {}
+    # reports
+    reports = (('RP0701', 'Raw metrics', report_raw_stats),)
+
+    def __init__(self, linter):
+        BaseTokenChecker.__init__(self, linter)
+        self.stats = None
+
+    def open(self):
+        """init statistics"""
+        self.stats = self.linter.add_stats(total_lines=0, code_lines=0,
+                                           empty_lines=0, docstring_lines=0,
+                                           comment_lines=0)
+
+    def process_tokens(self, tokens):
+        """update stats"""
+        i = 0
+        tokens = list(tokens)
+        while i < len(tokens):
+            i, lines_number, line_type = get_type(tokens, i)
+            self.stats['total_lines'] += lines_number
+            self.stats[line_type] += lines_number
+
+
+JUNK = (tokenize.NL, tokenize.INDENT, tokenize.NEWLINE, tokenize.ENDMARKER)
+
+def get_type(tokens, start_index):
+    """return the line type : docstring, comment, code, empty"""
+    i = start_index
+    tok_type = tokens[i][0]
+    start = tokens[i][2]
+    pos = start
+    line_type = None
+    while i < len(tokens) and tokens[i][2][0] == start[0]:
+        tok_type = tokens[i][0]
+        pos = tokens[i][3]
+        if line_type is None:
+            if tok_type == tokenize.STRING:
+                line_type = 'docstring_lines'
+            elif tok_type == tokenize.COMMENT:
+                line_type = 'comment_lines'
+            elif tok_type in JUNK:
+                pass
+            else:
+                line_type = 'code_lines'
+        i += 1
+    if line_type is None:
+        line_type = 'empty_lines'
+    elif i < len(tokens) and tokens[i][0] == tokenize.NEWLINE:
+        i += 1
+    return i, pos[0] - start[0] + 1, line_type
+
+
+def register(linter):
+    """ required method to auto register this checker """
+    linter.register_checker(RawMetricsChecker(linter))
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/typecheck.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/typecheck.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/typecheck.py	(revision 1126)
@@ -0,0 +1,974 @@
+# Copyright (c) 2006-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""try to find more bugs in the code using astroid inference capabilities
+"""
+
+import collections
+import fnmatch
+import re
+import shlex
+import sys
+
+import six
+
+import astroid
+import astroid.context
+import astroid.arguments
+from astroid import exceptions
+from astroid import objects
+from astroid import bases
+
+from pylint.interfaces import IAstroidChecker, INFERENCE, INFERENCE_FAILURE
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import (
+    is_super, check_messages, decorated_with_property,
+    decorated_with, node_ignores_exception,
+    is_iterable, is_mapping, supports_membership_test,
+    is_comprehension, is_inside_abstract_class,
+    supports_subscript,
+    safe_infer,
+    has_known_bases)
+from pylint import utils
+
+
+_ZOPE_DEPRECATED = (
+    "This option is deprecated. Use generated-members instead."
+)
+BUILTINS = six.moves.builtins.__name__
+STR_FORMAT = "%s.str.format" % BUILTINS
+
+
+def _unflatten(iterable):
+    for index, elem in enumerate(iterable):
+        if (isinstance(elem, collections.Sequence) and
+                not isinstance(elem, six.string_types)):
+            for elem in _unflatten(elem):
+                yield elem
+        elif elem and not index:
+            # We're interested only in the first element.
+            yield elem
+
+
+def _is_owner_ignored(owner, name, ignored_classes, ignored_modules):
+    """Check if the given owner should be ignored
+
+    This will verify if the owner's module is in *ignored_modules*
+    or the owner's module fully qualified name is in *ignored_modules*
+    or if the *ignored_modules* contains a pattern which catches
+    the fully qualified name of the module.
+
+    Also, similar checks are done for the owner itself, if its name
+    matches any name from the *ignored_classes* or if its qualified
+    name can be found in *ignored_classes*.
+    """
+    ignored_modules = set(ignored_modules)
+    module_name = owner.root().name
+    module_qname = owner.root().qname()
+    if any(module_name in ignored_modules or
+           module_qname in ignored_modules or
+           fnmatch.fnmatch(module_qname, ignore) for ignore in ignored_modules):
+        return True
+
+    ignored_classes = set(ignored_classes)
+    if hasattr(owner, 'qname'):
+        qname = owner.qname()
+    else:
+        qname = ''
+    return any(name == ignore or qname == ignore for ignore in ignored_classes)
+
+
+MSGS = {
+    'E1101': ('%s %r has no %r member',
+              'no-member',
+              'Used when a variable is accessed for an unexistent member.',
+              {'old_names': [('E1103', 'maybe-no-member')]}),
+    'E1102': ('%s is not callable',
+              'not-callable',
+              'Used when an object being called has been inferred to a non \
+              callable object'),
+    'E1111': ('Assigning to function call which doesn\'t return',
+              'assignment-from-no-return',
+              'Used when an assignment is done on a function call but the \
+              inferred function doesn\'t return anything.'),
+    'E1120': ('No value for argument %s in %s call',
+              'no-value-for-parameter',
+              'Used when a function call passes too few arguments.'),
+    'E1121': ('Too many positional arguments for %s call',
+              'too-many-function-args',
+              'Used when a function call passes too many positional \
+              arguments.'),
+    'E1123': ('Unexpected keyword argument %r in %s call',
+              'unexpected-keyword-arg',
+              'Used when a function call passes a keyword argument that \
+              doesn\'t correspond to one of the function\'s parameter names.'),
+    'E1124': ('Argument %r passed by position and keyword in %s call',
+              'redundant-keyword-arg',
+              'Used when a function call would result in assigning multiple \
+              values to a function parameter, one value from a positional \
+              argument and one from a keyword argument.'),
+    'E1125': ('Missing mandatory keyword argument %r in %s call',
+              'missing-kwoa',
+              ('Used when a function call does not pass a mandatory'
+               ' keyword-only argument.'),
+              {'minversion': (3, 0)}),
+    'E1126': ('Sequence index is not an int, slice, or instance with __index__',
+              'invalid-sequence-index',
+              'Used when a sequence type is indexed with an invalid type. '
+              'Valid types are ints, slices, and objects with an __index__ '
+              'method.'),
+    'E1127': ('Slice index is not an int, None, or instance with __index__',
+              'invalid-slice-index',
+              'Used when a slice index is not an integer, None, or an object \
+               with an __index__ method.'),
+    'E1128': ('Assigning to function call which only returns None',
+              'assignment-from-none',
+              'Used when an assignment is done on a function call but the '
+              'inferred function returns nothing but None.',
+              {'old_names': [('W1111', 'assignment-from-none')]}),
+    'E1129': ("Context manager '%s' doesn't implement __enter__ and __exit__.",
+              'not-context-manager',
+              'Used when an instance in a with statement doesn\'t implement '
+              'the context manager protocol(__enter__/__exit__).'),
+    'E1130': ('%s',
+              'invalid-unary-operand-type',
+              'Emitted when an unary operand is used on an object which does not '
+              'support this type of operation'),
+    'E1131': ('%s',
+              'unsupported-binary-operation',
+              'Emitted when a binary arithmetic operation between two '
+              'operands is not supported.'),
+    'E1132': ('Got multiple values for keyword argument %r in function call',
+              'repeated-keyword',
+              'Emitted when a function call got multiple values for a keyword.'),
+    'E1135': ("Value '%s' doesn't support membership test",
+              'unsupported-membership-test',
+              'Emitted when an instance in membership test expression doesn\'t'
+              'implement membership protocol (__contains__/__iter__/__getitem__)'),
+    'E1136': ("Value '%s' is unsubscriptable",
+              'unsubscriptable-object',
+              "Emitted when a subscripted value doesn't support subscription"
+              "(i.e. doesn't define __getitem__ method)"),
+    }
+
+# builtin sequence types in Python 2 and 3.
+SEQUENCE_TYPES = set(['str', 'unicode', 'list', 'tuple', 'bytearray',
+                      'xrange', 'range', 'bytes', 'memoryview'])
+
+
+def _emit_no_member(node, owner, owner_name, ignored_mixins):
+    """Try to see if no-member should be emitted for the given owner.
+
+    The following cases are ignored:
+
+        * the owner is a function and it has decorators.
+        * the owner is an instance and it has __getattr__, __getattribute__ implemented
+        * the module is explicitly ignored from no-member checks
+        * the owner is a class and the name can be found in its metaclass.
+        * The access node is protected by an except handler, which handles
+          AttributeError, Exception or bare except.
+    """
+    if node_ignores_exception(node, AttributeError):
+        return False
+    # skip None anyway
+    if isinstance(owner, astroid.Const) and owner.value is None:
+        return False
+    if is_super(owner) or getattr(owner, 'type', None) == 'metaclass':
+        return False
+    if ignored_mixins and owner_name[-5:].lower() == 'mixin':
+        return False
+    if isinstance(owner, astroid.FunctionDef) and owner.decorators:
+        return False
+    if isinstance(owner, astroid.Instance):
+        if owner.has_dynamic_getattr() or not has_known_bases(owner):
+            return False
+    if isinstance(owner, objects.Super):
+        # Verify if we are dealing with an invalid Super object.
+        # If it is invalid, then there's no point in checking that
+        # it has the required attribute. Also, don't fail if the
+        # MRO is invalid.
+        try:
+            owner.super_mro()
+        except (exceptions.MroError, exceptions.SuperError):
+            return False
+        if not all(map(has_known_bases, owner.type.mro())):
+            return False
+    return True
+
+
+def _determine_callable(callable_obj):
+    # Ordering is important, since BoundMethod is a subclass of UnboundMethod,
+    # and Function inherits Lambda.
+    if isinstance(callable_obj, astroid.BoundMethod):
+        # Bound methods have an extra implicit 'self' argument.
+        return callable_obj, 1, callable_obj.type
+    elif isinstance(callable_obj, astroid.UnboundMethod):
+        return callable_obj, 0, 'unbound method'
+    elif isinstance(callable_obj, astroid.FunctionDef):
+        return callable_obj, 0, callable_obj.type
+    elif isinstance(callable_obj, astroid.Lambda):
+        return callable_obj, 0, 'lambda'
+    elif isinstance(callable_obj, astroid.ClassDef):
+        # Class instantiation, lookup __new__ instead.
+        # If we only find object.__new__, we can safely check __init__
+        # instead. If __new__ belongs to builtins, then we look
+        # again for __init__ in the locals, since we won't have
+        # argument information for the builtin __new__ function.
+        try:
+            # Use the last definition of __new__.
+            new = callable_obj.local_attr('__new__')[-1]
+        except exceptions.NotFoundError:
+            new = None
+
+        from_object = new and new.parent.scope().name == 'object'
+        from_builtins = new and new.root().name in sys.builtin_module_names
+
+        if not new or from_object or from_builtins:
+            try:
+                # Use the last definition of __init__.
+                callable_obj = callable_obj.local_attr('__init__')[-1]
+            except exceptions.NotFoundError:
+                # do nothing, covered by no-init.
+                raise ValueError
+        else:
+            callable_obj = new
+
+        if not isinstance(callable_obj, astroid.FunctionDef):
+            raise ValueError
+        # both have an extra implicit 'cls'/'self' argument.
+        return callable_obj, 1, 'constructor'
+    else:
+        raise ValueError
+
+class TypeChecker(BaseChecker):
+    """try to find bugs in the code using type inference
+    """
+
+    __implements__ = (IAstroidChecker,)
+
+    # configuration section name
+    name = 'typecheck'
+    # messages
+    msgs = MSGS
+    priority = -1
+    # configuration options
+    options = (('ignore-mixin-members',
+                {'default' : True, 'type' : 'yn', 'metavar': '<y_or_n>',
+                 'help' : 'Tells whether missing members accessed in mixin \
+class should be ignored. A mixin class is detected if its name ends with \
+"mixin" (case insensitive).'}
+               ),
+               ('ignored-modules',
+                {'default': (),
+                 'type': 'csv',
+                 'metavar': '<module names>',
+                 'help': 'List of module names for which member attributes '
+                         'should not be checked (useful for modules/projects '
+                         'where namespaces are manipulated during runtime and '
+                         'thus existing member attributes cannot be '
+                         'deduced by static analysis. It supports qualified '
+                         'module names, as well as Unix pattern matching.'}
+               ),
+               ('ignored-classes',
+                {'default' : (),
+                 'type' : 'csv',
+                 'metavar' : '<members names>',
+                 'help' : 'List of classes names for which member attributes '
+                          'should not be checked (useful for classes with '
+                          'attributes dynamically set). This supports '
+                          'can work with qualified names.'}
+               ),
+
+               ('zope', utils.deprecated_option(opt_type='yn',
+                                                help_msg=_ZOPE_DEPRECATED)),
+
+               ('generated-members',
+                {'default' : (),
+                 'type' : 'string',
+                 'metavar' : '<members names>',
+                 'help' : 'List of members which are set dynamically and \
+missed by pylint inference system, and so shouldn\'t trigger E1101 when \
+accessed. Python regular expressions are accepted.'}
+               ),
+              )
+
+    def open(self):
+        # do this in open since config not fully initialized in __init__
+        # generated_members may contain regular expressions
+        # (surrounded by quote `"` and followed by a comma `,`)
+        # REQUEST,aq_parent,"[a-zA-Z]+_set{1,2}"' =>
+        # ('REQUEST', 'aq_parent', '[a-zA-Z]+_set{1,2}')
+        if isinstance(self.config.generated_members, str):
+            gen = shlex.shlex(self.config.generated_members)
+            gen.whitespace += ','
+            gen.wordchars += '[]-+'
+            self.config.generated_members = tuple(tok.strip('"') for tok in gen)
+
+    def visit_assignattr(self, node):
+        if isinstance(node.assign_type(), astroid.AugAssign):
+            self.visit_attribute(node)
+
+    def visit_delattr(self, node):
+        self.visit_attribute(node)
+
+    @check_messages('no-member')
+    def visit_attribute(self, node):
+        """check that the accessed attribute exists
+
+        to avoid too much false positives for now, we'll consider the code as
+        correct if a single of the inferred nodes has the accessed attribute.
+
+        function/method, super call and metaclasses are ignored
+        """
+        for pattern in self.config.generated_members:
+            # attribute is marked as generated, stop here
+            if re.match(pattern, node.attrname):
+                return
+
+        try:
+            infered = list(node.expr.infer())
+        except exceptions.InferenceError:
+            return
+        # list of (node, nodename) which are missing the attribute
+        missingattr = set()
+        inference_failure = False
+        for owner in infered:
+            # skip yes object
+            if owner is astroid.YES:
+                inference_failure = True
+                continue
+
+            name = getattr(owner, 'name', None)
+            if _is_owner_ignored(owner, name, self.config.ignored_classes,
+                                 self.config.ignored_modules):
+                continue
+
+            try:
+                if not [n for n in owner.getattr(node.attrname)
+                        if not isinstance(n.statement(), astroid.AugAssign)]:
+                    missingattr.add((owner, name))
+                    continue
+            except AttributeError:
+                # XXX method / function
+                continue
+            except exceptions.NotFoundError:
+                # This can't be moved before the actual .getattr call,
+                # because there can be more values inferred and we are
+                # stopping after the first one which has the attribute in question.
+                # The problem is that if the first one has the attribute,
+                # but we continue to the next values which doesn't have the
+                # attribute, then we'll have a false positive.
+                # So call this only after the call has been made.
+                if not _emit_no_member(node, owner, name,
+                                       self.config.ignore_mixin_members):
+                    continue
+                missingattr.add((owner, name))
+                continue
+            # stop on the first found
+            break
+        else:
+            # we have not found any node with the attributes, display the
+            # message for infered nodes
+            done = set()
+            for owner, name in missingattr:
+                if isinstance(owner, astroid.Instance):
+                    actual = owner._proxied
+                else:
+                    actual = owner
+                if actual in done:
+                    continue
+                done.add(actual)
+                confidence = INFERENCE if not inference_failure else INFERENCE_FAILURE
+                self.add_message('no-member', node=node,
+                                 args=(owner.display_type(), name,
+                                       node.attrname),
+                                 confidence=confidence)
+
+    @check_messages('assignment-from-no-return', 'assignment-from-none')
+    def visit_assign(self, node):
+        """check that if assigning to a function call, the function is
+        possibly returning something valuable
+        """
+        if not isinstance(node.value, astroid.Call):
+            return
+        function_node = safe_infer(node.value.func)
+        # skip class, generator and incomplete function definition
+        if not (isinstance(function_node, astroid.FunctionDef) and
+                function_node.root().fully_defined()):
+            return
+        if function_node.is_generator() \
+               or function_node.is_abstract(pass_is_abstract=False):
+            return
+        returns = list(function_node.nodes_of_class(astroid.Return,
+                                                    skip_klass=astroid.FunctionDef))
+        if len(returns) == 0:
+            self.add_message('assignment-from-no-return', node=node)
+        else:
+            for rnode in returns:
+                if not (isinstance(rnode.value, astroid.Const)
+                        and rnode.value.value is None
+                        or rnode.value is None):
+                    break
+            else:
+                self.add_message('assignment-from-none', node=node)
+
+    def _check_uninferable_callfunc(self, node):
+        """
+        Check that the given uninferable CallFunc node does not
+        call an actual function.
+        """
+        if not isinstance(node.func, astroid.Attribute):
+            return
+
+        # Look for properties. First, obtain
+        # the lhs of the Getattr node and search the attribute
+        # there. If that attribute is a property or a subclass of properties,
+        # then most likely it's not callable.
+
+        # TODO: since astroid doesn't understand descriptors very well
+        # we will not handle them here, right now.
+
+        expr = node.func.expr
+        klass = safe_infer(expr)
+        if (klass is None or klass is astroid.YES or
+                not isinstance(klass, astroid.Instance)):
+            return
+
+        try:
+            attrs = klass._proxied.getattr(node.func.attrname)
+        except exceptions.NotFoundError:
+            return
+
+        for attr in attrs:
+            if attr is astroid.YES:
+                continue
+            if not isinstance(attr, astroid.FunctionDef):
+                continue
+
+            # Decorated, see if it is decorated with a property.
+            # Also, check the returns and see if they are callable.
+            if decorated_with_property(attr):
+                if all(return_node.callable()
+                       for return_node in attr.infer_call_result(node)):
+                    continue
+                else:
+                    self.add_message('not-callable', node=node,
+                                     args=node.func.as_string())
+                    break
+
+    @staticmethod
+    def _no_context_variadic(node):
+        """Verify if the given call node has variadic nodes without context
+
+        This is a workaround for handling cases of nested call functions
+        which don't have the specific call context at hand.
+        Variadic arguments (variable positional arguments and variable
+        keyword arguments) are inferred, inherently wrong, by astroid
+        as a Tuple, respectively a Dict with empty elements.
+        This can lead pylint to believe that a function call receives
+        too few arguments.
+        """
+        for arg in node.args:
+            if not isinstance(arg, astroid.Starred):
+                continue
+
+            inferred = safe_infer(arg.value)
+            if isinstance(inferred, astroid.Tuple):
+                length = len(inferred.elts)
+            elif isinstance(inferred, astroid.Dict):
+                length = len(inferred.items)
+            else:
+                return False
+            if not length and isinstance(inferred.statement(), astroid.FunctionDef):
+                return True
+        return False
+
+    @check_messages(*(list(MSGS.keys())))
+    def visit_call(self, node):
+        """check that called functions/methods are inferred to callable objects,
+        and that the arguments passed to the function match the parameters in
+        the inferred function's definition
+        """
+        # Build the set of keyword arguments, checking for duplicate keywords,
+        # and count the positional arguments.
+        call_site = astroid.arguments.CallSite.from_call(node)
+        num_positional_args = len(call_site.positional_arguments)
+        keyword_args = list(call_site.keyword_arguments.keys())
+        no_context_variadic = self._no_context_variadic(node)
+
+        called = safe_infer(node.func)
+        # only function, generator and object defining __call__ are allowed
+        if called is not None and not called.callable():
+            self.add_message('not-callable', node=node,
+                             args=node.func.as_string())
+
+        self._check_uninferable_callfunc(node)
+
+        try:
+            called, implicit_args, callable_name = _determine_callable(called)
+        except ValueError:
+            # Any error occurred during determining the function type, most of
+            # those errors are handled by different warnings.
+            return
+
+        num_positional_args += implicit_args
+        if called.args.args is None:
+            # Built-in functions have no argument information.
+            return
+
+        if len(called.argnames()) != len(set(called.argnames())):
+            # Duplicate parameter name (see duplicate-argument).  We can't really
+            # make sense of the function call in this case, so just return.
+            return
+
+        # Warn about duplicated keyword arguments, such as `f=24, **{'f': 24}`
+        for keyword in call_site.duplicated_keywords:
+            self.add_message('repeated-keyword',
+                             node=node, args=(keyword, ))
+
+        if call_site.has_invalid_arguments() or call_site.has_invalid_keywords():
+            # Can't make sense of this.
+            return
+
+        # Analyze the list of formal parameters.
+        num_mandatory_parameters = len(called.args.args) - len(called.args.defaults)
+        parameters = []
+        parameter_name_to_index = {}
+        for i, arg in enumerate(called.args.args):
+            if isinstance(arg, astroid.Tuple):
+                name = None
+                # Don't store any parameter names within the tuple, since those
+                # are not assignable from keyword arguments.
+            else:
+                assert isinstance(arg, astroid.AssignName)
+                # This occurs with:
+                #    def f( (a), (b) ): pass
+                name = arg.name
+                parameter_name_to_index[name] = i
+            if i >= num_mandatory_parameters:
+                defval = called.args.defaults[i - num_mandatory_parameters]
+            else:
+                defval = None
+            parameters.append([(name, defval), False])
+
+        kwparams = {}
+        for i, arg in enumerate(called.args.kwonlyargs):
+            if isinstance(arg, astroid.Keyword):
+                name = arg.arg
+            else:
+                assert isinstance(arg, astroid.AssignName)
+                name = arg.name
+            kwparams[name] = [called.args.kw_defaults[i], False]
+
+        # Match the supplied arguments against the function parameters.
+
+        # 1. Match the positional arguments.
+        for i in range(num_positional_args):
+            if i < len(parameters):
+                parameters[i][1] = True
+            elif called.args.vararg is not None:
+                # The remaining positional arguments get assigned to the *args
+                # parameter.
+                break
+            else:
+                # Too many positional arguments.
+                self.add_message('too-many-function-args',
+                                 node=node, args=(callable_name,))
+                break
+
+        # 2. Match the keyword arguments.
+        for keyword in keyword_args:
+            if keyword in parameter_name_to_index:
+                i = parameter_name_to_index[keyword]
+                if parameters[i][1]:
+                    # Duplicate definition of function parameter.
+
+                    # Might be too hardcoded, but this can actually
+                    # happen when using str.format and `self` is passed
+                    # by keyword argument, as in `.format(self=self)`.
+                    # It's perfectly valid to so, so we're just skipping
+                    # it if that's the case.
+                    if not (keyword == 'self' and called.qname() == STR_FORMAT):
+                        self.add_message('redundant-keyword-arg',
+                                         node=node, args=(keyword, callable_name))
+                else:
+                    parameters[i][1] = True
+            elif keyword in kwparams:
+                if kwparams[keyword][1]:  # XXX is that even possible?
+                    # Duplicate definition of function parameter.
+                    self.add_message('redundant-keyword-arg', node=node,
+                                     args=(keyword, callable_name))
+                else:
+                    kwparams[keyword][1] = True
+            elif called.args.kwarg is not None:
+                # The keyword argument gets assigned to the **kwargs parameter.
+                pass
+            else:
+                # Unexpected keyword argument.
+                self.add_message('unexpected-keyword-arg', node=node,
+                                 args=(keyword, callable_name))
+
+        # 3. Match the **kwargs, if any.
+        if node.kwargs:
+            for i, [(name, defval), assigned] in enumerate(parameters):
+                # Assume that *kwargs provides values for all remaining
+                # unassigned named parameters.
+                if name is not None:
+                    parameters[i][1] = True
+                else:
+                    # **kwargs can't assign to tuples.
+                    pass
+
+        # Check that any parameters without a default have been assigned
+        # values.
+        for [(name, defval), assigned] in parameters:
+            if (defval is None) and not assigned:
+                if name is None:
+                    display_name = '<tuple>'
+                else:
+                    display_name = repr(name)
+                # TODO(cpopa): this should be removed after PyCQA/astroid/issues/177
+                if not no_context_variadic:
+                    self.add_message('no-value-for-parameter', node=node,
+                                     args=(display_name, callable_name))
+
+        for name in kwparams:
+            defval, assigned = kwparams[name]
+            if defval is None and not assigned:
+                self.add_message('missing-kwoa', node=node,
+                                 args=(name, callable_name))
+
+    @check_messages('invalid-sequence-index')
+    def visit_extslice(self, node):
+        # Check extended slice objects as if they were used as a sequence
+        # index to check if the object being sliced can support them
+        return self.visit_index(node)
+
+    @check_messages('invalid-sequence-index')
+    def visit_index(self, node):
+        if not node.parent or not hasattr(node.parent, "value"):
+            return
+        # Look for index operations where the parent is a sequence type.
+        # If the types can be determined, only allow indices to be int,
+        # slice or instances with __index__.
+        parent_type = safe_infer(node.parent.value)
+        if not isinstance(parent_type, (astroid.ClassDef, astroid.Instance)):
+            return
+
+        # Determine what method on the parent this index will use
+        # The parent of this node will be a Subscript, and the parent of that
+        # node determines if the Subscript is a get, set, or delete operation.
+        operation = node.parent.parent
+        if isinstance(operation, astroid.Assign):
+            methodname = '__setitem__'
+        elif isinstance(operation, astroid.Delete):
+            methodname = '__delitem__'
+        else:
+            methodname = '__getitem__'
+
+        # Check if this instance's __getitem__, __setitem__, or __delitem__, as
+        # appropriate to the statement, is implemented in a builtin sequence
+        # type. This way we catch subclasses of sequence types but skip classes
+        # that override __getitem__ and which may allow non-integer indices.
+        try:
+            methods = parent_type.getattr(methodname)
+            if methods is astroid.YES:
+                return
+            itemmethod = methods[0]
+        except (exceptions.NotFoundError, IndexError):
+            return
+        if not isinstance(itemmethod, astroid.FunctionDef):
+            return
+        if itemmethod.root().name != BUILTINS:
+            return
+        if not itemmethod.parent:
+            return
+        if itemmethod.parent.name not in SEQUENCE_TYPES:
+            return
+
+        # For ExtSlice objects coming from visit_extslice, no further
+        # inference is necessary, since if we got this far the ExtSlice
+        # is an error.
+        if isinstance(node, astroid.ExtSlice):
+            index_type = node
+        else:
+            index_type = safe_infer(node)
+        if index_type is None or index_type is astroid.YES:
+            return
+        # Constants must be of type int
+        if isinstance(index_type, astroid.Const):
+            if isinstance(index_type.value, int):
+                return
+        # Instance values must be int, slice, or have an __index__ method
+        elif isinstance(index_type, astroid.Instance):
+            if index_type.pytype() in (BUILTINS + '.int', BUILTINS + '.slice'):
+                return
+            try:
+                index_type.getattr('__index__')
+                return
+            except exceptions.NotFoundError:
+                pass
+        elif isinstance(index_type, astroid.Slice):
+            # Delegate to visit_slice. A slice can be present
+            # here after inferring the index node, which could
+            # be a `slice(...)` call for instance.
+            return self.visit_slice(index_type)
+
+        # Anything else is an error
+        self.add_message('invalid-sequence-index', node=node)
+
+    @check_messages('invalid-slice-index')
+    def visit_slice(self, node):
+        # Check the type of each part of the slice
+        for index in (node.lower, node.upper, node.step):
+            if index is None:
+                continue
+
+            index_type = safe_infer(index)
+            if index_type is None or index_type is astroid.YES:
+                continue
+
+            # Constants must of type int or None
+            if isinstance(index_type, astroid.Const):
+                if isinstance(index_type.value, (int, type(None))):
+                    continue
+            # Instance values must be of type int, None or an object
+            # with __index__
+            elif isinstance(index_type, astroid.Instance):
+                if index_type.pytype() in (BUILTINS + '.int',
+                                           BUILTINS + '.NoneType'):
+                    continue
+
+                try:
+                    index_type.getattr('__index__')
+                    return
+                except exceptions.NotFoundError:
+                    pass
+
+            # Anything else is an error
+            self.add_message('invalid-slice-index', node=node)
+
+    @check_messages('not-context-manager')
+    def visit_with(self, node):
+        for ctx_mgr, _ in node.items:
+            context = astroid.context.InferenceContext()
+            infered = safe_infer(ctx_mgr, context=context)
+            if infered is None or infered is astroid.YES:
+                continue
+
+            if isinstance(infered, bases.Generator):
+                # Check if we are dealing with a function decorated
+                # with contextlib.contextmanager.
+                if decorated_with(infered.parent, ['contextlib.contextmanager']):
+                    continue
+                # If the parent of the generator is not the context manager itself,
+                # that means that it could have been returned from another
+                # function which was the real context manager.
+                # The following approach is more of a hack rather than a real
+                # solution: walk all the inferred statements for the
+                # given *ctx_mgr* and if you find one function scope
+                # which is decorated, consider it to be the real
+                # manager and give up, otherwise emit not-context-manager.
+                # See the test file for not_context_manager for a couple
+                # of self explaining tests.
+                for path in six.moves.filter(None, _unflatten(context.path)):
+                    scope = path.scope()
+                    if not isinstance(scope, astroid.FunctionDef):
+                        continue
+                    if decorated_with(scope, ['contextlib.contextmanager']):
+                        break
+                else:
+                    self.add_message('not-context-manager',
+                                     node=node, args=(infered.name, ))
+            else:
+                try:
+                    infered.getattr('__enter__')
+                    infered.getattr('__exit__')
+                except exceptions.NotFoundError:
+                    if isinstance(infered, astroid.Instance):
+                        # If we do not know the bases of this class,
+                        # just skip it.
+                        if not has_known_bases(infered):
+                            continue
+                        # Just ignore mixin classes.
+                        if self.config.ignore_mixin_members:
+                            if infered.name[-5:].lower() == 'mixin':
+                                continue
+
+                    self.add_message('not-context-manager',
+                                     node=node, args=(infered.name, ))
+
+    # Disabled until we'll have a more capable astroid.
+    @check_messages('invalid-unary-operand-type')
+    def _visit_unaryop(self, node):
+        """Detect TypeErrors for unary operands."""
+
+        for error in node.type_errors():
+            # Let the error customize its output.
+            self.add_message('invalid-unary-operand-type',
+                             args=str(error), node=node)
+
+    @check_messages('unsupported-binary-operation')
+    def _visit_binop(self, node):
+        """Detect TypeErrors for binary arithmetic operands."""
+        self._check_binop_errors(node)
+
+    @check_messages('unsupported-binary-operation')
+    def _visit_augassign(self, node):
+        """Detect TypeErrors for augmented binary arithmetic operands."""
+        self._check_binop_errors(node)
+
+    def _check_binop_errors(self, node):
+        for error in node.type_errors():
+            # Let the error customize its output.
+            self.add_message('unsupported-binary-operation',
+                             args=str(error), node=node)
+
+    def _check_membership_test(self, node):
+        if is_inside_abstract_class(node):
+            return
+        if is_comprehension(node):
+            return
+        infered = safe_infer(node)
+        if infered is None or infered is astroid.YES:
+            return
+        if not supports_membership_test(infered):
+            self.add_message('unsupported-membership-test',
+                             args=node.as_string(),
+                             node=node)
+
+    @check_messages('unsupported-membership-test')
+    def visit_compare(self, node):
+        if len(node.ops) != 1:
+            return
+        operator, right = node.ops[0]
+        if operator in ['in', 'not in']:
+            self._check_membership_test(right)
+
+    @check_messages('unsubscriptable-object')
+    def visit_subscript(self, node):
+        if isinstance(node.value, (astroid.ListComp, astroid.DictComp)):
+            return
+        if isinstance(node.value, astroid.SetComp):
+            self.add_message('unsubscriptable-object',
+                             args=node.value.as_string(),
+                             node=node.value)
+            return
+
+        infered = safe_infer(node.value)
+        if infered is None or infered is astroid.YES:
+            return
+
+        if is_inside_abstract_class(node):
+            return
+
+        if not supports_subscript(infered):
+            self.add_message('unsubscriptable-object',
+                             args=node.value.as_string(),
+                             node=node.value)
+
+
+
+class IterableChecker(BaseChecker):
+    """
+    Checks for non-iterables used in an iterable context.
+    Contexts include:
+    - for-statement
+    - starargs in function call
+    - `yield from`-statement
+    - list, dict and set comprehensions
+    - generator expressions
+    Also checks for non-mappings in function call kwargs.
+    """
+
+    __implements__ = (IAstroidChecker,)
+    name = 'iterable_check'
+
+    msgs = {'E1133': ('Non-iterable value %s is used in an iterating context',
+                      'not-an-iterable',
+                      'Used when a non-iterable value is used in place where'
+                      'iterable is expected'),
+            'E1134': ('Non-mapping value %s is used in a mapping context',
+                      'not-a-mapping',
+                      'Used when a non-mapping value is used in place where'
+                      'mapping is expected'),
+           }
+
+    def _check_iterable(self, node):
+        if is_inside_abstract_class(node):
+            return
+        if is_comprehension(node):
+            return
+        infered = safe_infer(node)
+        if infered is None or infered is astroid.YES:
+            return
+        if not is_iterable(infered):
+            self.add_message('not-an-iterable',
+                             args=node.as_string(),
+                             node=node)
+
+    def _check_mapping(self, node):
+        if is_inside_abstract_class(node):
+            return
+        if isinstance(node, astroid.DictComp):
+            return
+        infered = safe_infer(node)
+        if infered is None or infered is astroid.YES:
+            return
+        if not is_mapping(infered):
+            self.add_message('not-a-mapping',
+                             args=node.as_string(),
+                             node=node)
+
+    @check_messages('not-an-iterable')
+    def visit_for(self, node):
+        self._check_iterable(node.iter)
+
+    @check_messages('not-an-iterable')
+    def visit_yieldfrom(self, node):
+        self._check_iterable(node.value)
+
+    @check_messages('not-an-iterable', 'not-a-mapping')
+    def visit_call(self, node):
+        for stararg in node.starargs:
+            self._check_iterable(stararg.value)
+        for kwarg in node.kwargs:
+            self._check_mapping(kwarg.value)
+
+    @check_messages('not-an-iterable')
+    def visit_listcomp(self, node):
+        for gen in node.generators:
+            self._check_iterable(gen.iter)
+
+    @check_messages('not-an-iterable')
+    def visit_dictcomp(self, node):
+        for gen in node.generators:
+            self._check_iterable(gen.iter)
+
+    @check_messages('not-an-iterable')
+    def visit_setcomp(self, node):
+        for gen in node.generators:
+            self._check_iterable(gen.iter)
+
+    @check_messages('not-an-iterable')
+    def visit_generatorexp(self, node):
+        for gen in node.generators:
+            self._check_iterable(gen.iter)
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(TypeChecker(linter))
+    linter.register_checker(IterableChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/stdlib.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/stdlib.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/stdlib.py	(revision 1126)
@@ -0,0 +1,280 @@
+# Copyright 2012 Google Inc.
+#
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Checkers for various standard library functions."""
+
+import sys
+
+import six
+
+import astroid
+from astroid.bases import Instance
+from pylint.interfaces import IAstroidChecker
+from pylint.checkers import BaseChecker
+from pylint.checkers import utils
+
+
+OPEN_FILES = {'open', 'file'}
+UNITTEST_CASE = 'unittest.case'
+if sys.version_info >= (3, 0):
+    OPEN_MODULE = '_io'
+else:
+    OPEN_MODULE = '__builtin__'
+
+
+def _check_mode_str(mode):
+    # check type
+    if not isinstance(mode, six.string_types):
+        return False
+    # check syntax
+    modes = set(mode)
+    _mode = "rwatb+U"
+    creating = False
+    if six.PY3:
+        _mode += "x"
+        creating = "x" in modes
+    if modes - set(_mode) or len(mode) > len(modes):
+        return False
+    # check logic
+    reading = "r" in modes
+    writing = "w" in modes
+    appending = "a" in modes
+    text = "t" in modes
+    binary = "b" in modes
+    if "U" in modes:
+        if writing or appending or creating and six.PY3:
+            return False
+        reading = True
+        if not six.PY3:
+            binary = True
+    if text and binary:
+        return False
+    total = reading + writing + appending + (creating if six.PY3 else 0)
+    if total > 1:
+        return False
+    if not (reading or writing or appending or creating and six.PY3):
+        return False
+    # other 2.x constraints
+    if not six.PY3:
+        if "U" in mode:
+            mode = mode.replace("U", "")
+            if "r" not in mode:
+                mode = "r" + mode
+        return mode[0] in ("r", "w", "a", "U")
+    return True
+
+
+class StdlibChecker(BaseChecker):
+    __implements__ = (IAstroidChecker,)
+    name = 'stdlib'
+
+    msgs = {
+        'W1501': ('"%s" is not a valid mode for open.',
+                  'bad-open-mode',
+                  'Python supports: r, w, a[, x] modes with b, +, '
+                  'and U (only with r) options. '
+                  'See http://docs.python.org/2/library/functions.html#open'),
+        'W1502': ('Using datetime.time in a boolean context.',
+                  'boolean-datetime',
+                  'Using datetime.time in a boolean context can hide '
+                  'subtle bugs when the time they represent matches '
+                  'midnight UTC. This behaviour was fixed in Python 3.5. '
+                  'See http://bugs.python.org/issue13936 for reference.',
+                  {'maxversion': (3, 5)}),
+        'W1503': ('Redundant use of %s with constant '
+                  'value %r',
+                  'redundant-unittest-assert',
+                  'The first argument of assertTrue and assertFalse is '
+                  'a condition. If a constant is passed as parameter, that '
+                  'condition will be always true. In this case a warning '
+                  'should be emitted.'),
+        'W1505': ('Using deprecated method %s()',
+                  'deprecated-method',
+                  'The method is marked as deprecated and will be removed in '
+                  'a future version of Python. Consider looking for an '
+                  'alternative in the documentation.'),
+    }
+
+    deprecated = {
+        0: [
+            'cgi.parse_qs', 'cgi.parse_qsl',
+            'ctypes.c_buffer',
+            'distutils.command.register.register.check_metadata',
+            'distutils.command.sdist.sdist.check_metadata',
+            'tkinter.Misc.tk_menuBar',
+            'tkinter.Menu.tk_bindForTraversal',
+        ],
+        2: {
+            (2, 6): [
+                'commands.getstatus',
+                'os.popen2',
+                'os.popen3',
+                'os.popen4',
+                'macostools.touched',
+            ],
+            (2, 7): [
+                'unittest.case.TestCase.assertEquals',
+                'unittest.case.TestCase.assertNotEquals',
+                'unittest.case.TestCase.assertAlmostEquals',
+                'unittest.case.TestCase.assertNotAlmostEquals',
+                'unittest.case.TestCase.assert_',
+                'xml.etree.ElementTree.Element.getchildren',
+                'xml.etree.ElementTree.Element.getiterator',
+                'xml.etree.ElementTree.XMLParser.getiterator',
+                'xml.etree.ElementTree.XMLParser.doctype',
+            ],
+        },
+        3: {
+            (3, 0): [
+                'inspect.getargspec',
+                'unittest.case.TestCase._deprecate.deprecated_func',
+            ],
+            (3, 1): [
+                'base64.encodestring', 'base64.decodestring',
+                'ntpath.splitunc',
+            ],
+            (3, 2): [
+                'cgi.escape',
+                'configparser.RawConfigParser.readfp',
+                'xml.etree.ElementTree.Element.getchildren',
+                'xml.etree.ElementTree.Element.getiterator',
+                'xml.etree.ElementTree.XMLParser.getiterator',
+                'xml.etree.ElementTree.XMLParser.doctype',
+            ],
+            (3, 3): [
+                'inspect.getmoduleinfo', 'inspect.getmodulename',
+                'logging.warn', 'logging.Logger.warn',
+                'logging.LoggerAdapter.warn',
+                'nntplib._NNTPBase.xpath',
+                'platform.popen',
+            ],
+            (3, 4): [
+                'asyncio.tasks.async',
+                'importlib.find_loader',
+                'plistlib.readPlist', 'plistlib.writePlist',
+                'plistlib.readPlistFromBytes',
+                'plistlib.writePlistToBytes',
+                'xml.etree.ElementTree.iterparse',
+            ],
+            (3, 5): [
+                'fractions.gcd',
+                'inspect.getfullargspec', 'inspect.getargvalues',
+                'inspect.formatargspec', 'inspect.formatargvalues',
+                'inspect.getcallargs',
+                'platform.linux_distribution', 'platform.dist',
+            ],
+        },
+    }
+
+    @utils.check_messages('bad-open-mode', 'redundant-unittest-assert',
+                          'deprecated-method')
+    def visit_call(self, node):
+        """Visit a CallFunc node."""
+        try:
+            for inferred in node.func.infer():
+                if inferred.root().name == OPEN_MODULE:
+                    if getattr(node.func, 'name', None) in OPEN_FILES:
+                        self._check_open_mode(node)
+                if inferred.root().name == UNITTEST_CASE:
+                    self._check_redundant_assert(node, inferred)
+                self._check_deprecated_method(node, inferred)
+        except astroid.InferenceError:
+            return
+
+    @utils.check_messages('boolean-datetime')
+    def visit_unaryop(self, node):
+        if node.op == 'not':
+            self._check_datetime(node.operand)
+
+    @utils.check_messages('boolean-datetime')
+    def visit_if(self, node):
+        self._check_datetime(node.test)
+
+    @utils.check_messages('boolean-datetime')
+    def visit_ifexp(self, node):
+        self._check_datetime(node.test)
+
+    @utils.check_messages('boolean-datetime')
+    def visit_boolop(self, node):
+        for value in node.values:
+            self._check_datetime(value)
+
+    def _check_deprecated_method(self, node, inferred):
+        py_vers = sys.version_info[0]
+
+        if isinstance(node.func, astroid.Attribute):
+            func_name = node.func.attrname
+        elif isinstance(node.func, astroid.Name):
+            func_name = node.func.name
+        else:
+            # Not interested in other nodes.
+            return
+
+        # Reject nodes which aren't of interest to us.
+        acceptable_nodes = (astroid.BoundMethod,
+                            astroid.UnboundMethod,
+                            astroid.FunctionDef)
+        if not isinstance(inferred, acceptable_nodes):
+            return
+
+        qname = inferred.qname()
+        if qname in self.deprecated[0]:
+            self.add_message('deprecated-method', node=node,
+                             args=(func_name, ))
+        else:
+            for since_vers, func_list in self.deprecated[py_vers].items():
+                if since_vers <= sys.version_info and qname in func_list:
+                    self.add_message('deprecated-method', node=node,
+                                     args=(func_name, ))
+                    break
+
+    def _check_redundant_assert(self, node, infer):
+        if (isinstance(infer, astroid.BoundMethod) and
+                node.args and isinstance(node.args[0], astroid.Const) and
+                infer.name in ['assertTrue', 'assertFalse']):
+            self.add_message('redundant-unittest-assert',
+                             args=(infer.name, node.args[0].value, ),
+                             node=node)
+
+    def _check_datetime(self, node):
+        """ Check that a datetime was infered.
+        If so, emit boolean-datetime warning.
+        """
+        try:
+            infered = next(node.infer())
+        except astroid.InferenceError:
+            return
+        if (isinstance(infered, Instance) and
+                infered.qname() == 'datetime.time'):
+            self.add_message('boolean-datetime', node=node)
+
+    def _check_open_mode(self, node):
+        """Check that the mode argument of an open or file call is valid."""
+        try:
+            mode_arg = utils.get_argument_from_call(node, position=1,
+                                                    keyword='mode')
+        except utils.NoSuchArgumentError:
+            return
+        if mode_arg:
+            mode_arg = utils.safe_infer(mode_arg)
+            if (isinstance(mode_arg, astroid.Const)
+                    and not _check_mode_str(mode_arg.value)):
+                self.add_message('bad-open-mode', node=node,
+                                 args=mode_arg.value)
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(StdlibChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/exceptions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/exceptions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/exceptions.py	(revision 1126)
@@ -0,0 +1,369 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""exceptions handling (raising, catching, exceptions classes) checker
+"""
+import inspect
+import sys
+
+import six
+from six.moves import builtins
+
+import astroid
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import (
+    is_raising,
+    check_messages,
+    inherit_from_std_ex,
+    EXCEPTIONS_MODULE,
+    safe_infer,
+    has_known_bases)
+from pylint.interfaces import IAstroidChecker
+
+
+def _builtin_exceptions():
+    def predicate(obj):
+        return isinstance(obj, type) and issubclass(obj, BaseException)
+
+    members = inspect.getmembers(six.moves.builtins, predicate)
+    return {exc.__name__ for (_, exc) in members}
+
+
+def _annotated_unpack_infer(stmt, context=None):
+    """
+    Recursively generate nodes inferred by the given statement.
+    If the inferred value is a list or a tuple, recurse on the elements.
+    Returns an iterator which yields tuples in the format
+    ('original node', 'infered node').
+    """
+    if isinstance(stmt, (astroid.List, astroid.Tuple)):
+        for elt in stmt.elts:
+            inferred = safe_infer(elt)
+            if inferred and inferred is not astroid.YES:
+                yield elt, inferred
+        return
+    for infered in stmt.infer(context):
+        if infered is astroid.YES:
+            continue
+        yield stmt, infered
+
+
+PY3K = sys.version_info >= (3, 0)
+OVERGENERAL_EXCEPTIONS = ('Exception',)
+BUILTINS_NAME = builtins.__name__
+
+MSGS = {
+    'E0701': ('Bad except clauses order (%s)',
+              'bad-except-order',
+              'Used when except clauses are not in the correct order (from the '
+              'more specific to the more generic). If you don\'t fix the order, '
+              'some exceptions may not be catched by the most specific handler.'),
+    'E0702': ('Raising %s while only classes or instances are allowed',
+              'raising-bad-type',
+              'Used when something which is neither a class, an instance or a \
+              string is raised (i.e. a `TypeError` will be raised).'),
+    'E0703': ('Exception context set to something which is not an '
+              'exception, nor None',
+              'bad-exception-context',
+              'Used when using the syntax "raise ... from ...", '
+              'where the exception context is not an exception, '
+              'nor None.',
+              {'minversion': (3, 0)}),
+    'E0704': ('The raise statement is not inside an except clause',
+              'misplaced-bare-raise',
+              'Used when a bare raise is not used inside an except clause. '
+              'This generates an error, since there are no active exceptions '
+              'to be reraised. An exception to this rule is represented by '
+              'a bare raise inside a finally clause, which might work, as long '
+              'as an exception is raised inside the try block, but it is '
+              'nevertheless a code smell that must not be relied upon.'),
+    'E0710': ('Raising a new style class which doesn\'t inherit from BaseException',
+              'raising-non-exception',
+              'Used when a new style class which doesn\'t inherit from \
+               BaseException is raised.'),
+    'E0711': ('NotImplemented raised - should raise NotImplementedError',
+              'notimplemented-raised',
+              'Used when NotImplemented is raised instead of \
+              NotImplementedError'),
+    'E0712': ('Catching an exception which doesn\'t inherit from BaseException: %s',
+              'catching-non-exception',
+              'Used when a class which doesn\'t inherit from \
+               BaseException is used as an exception in an except clause.'),
+    'W0702': ('No exception type(s) specified',
+              'bare-except',
+              'Used when an except clause doesn\'t specify exceptions type to \
+              catch.'),
+    'W0703': ('Catching too general exception %s',
+              'broad-except',
+              'Used when an except catches a too general exception, \
+              possibly burying unrelated errors.'),
+    'W0705': ('Catching previously caught exception type %s',
+              'duplicate-except',
+              'Used when an except catches a type that was already caught by '
+              'a previous handler.'),
+    'W0710': ('Exception doesn\'t inherit from standard "Exception" class',
+              'nonstandard-exception',
+              'Used when a custom exception class is raised but doesn\'t \
+              inherit from the builtin "Exception" class.',
+              {'maxversion': (3, 0)}),
+    'W0711': ('Exception to catch is the result of a binary "%s" operation',
+              'binary-op-exception',
+              'Used when the exception to catch is of the form \
+              "except A or B:".  If intending to catch multiple, \
+              rewrite as "except (A, B):"'),
+    }
+
+
+class ExceptionsChecker(BaseChecker):
+    """checks for
+    * excepts without exception filter
+    * type of raise argument : string, Exceptions, other values
+    """
+
+    __implements__ = IAstroidChecker
+
+    name = 'exceptions'
+    msgs = MSGS
+    priority = -4
+    options = (('overgeneral-exceptions',
+                {'default' : OVERGENERAL_EXCEPTIONS,
+                 'type' :'csv', 'metavar' : '<comma-separated class names>',
+                 'help' : 'Exceptions that will emit a warning '
+                          'when being caught. Defaults to "%s"' % (
+                              ', '.join(OVERGENERAL_EXCEPTIONS),)}
+               ),
+              )
+
+    def open(self):
+        self.builtin_exceptions = _builtin_exceptions()
+        super(ExceptionsChecker, self).open()
+
+    @check_messages('nonstandard-exception', 'misplaced-bare-raise',
+                    'raising-bad-type', 'raising-non-exception',
+                    'notimplemented-raised', 'bad-exception-context')
+    def visit_raise(self, node):
+        """visit raise possibly inferring value"""
+        if node.exc is None:
+            self._check_misplaced_bare_raise(node)
+            return
+        if PY3K and node.cause:
+            self._check_bad_exception_context(node)
+
+        expr = node.exc
+        if self._check_raise_value(node, expr):
+            return
+        else:
+            try:
+                value = next(astroid.unpack_infer(expr))
+            except astroid.InferenceError:
+                return
+            self._check_raise_value(node, value)
+
+    def _check_misplaced_bare_raise(self, node):
+        # Filter out if it's present in __exit__.
+        scope = node.scope()
+        if (isinstance(scope, astroid.FunctionDef)
+                and scope.is_method()
+                and scope.name == '__exit__'):
+            return
+
+        current = node
+        # Stop when a new scope is generated or when the raise
+        # statement is found inside a TryFinally.
+        ignores = (astroid.ExceptHandler, astroid.FunctionDef, astroid.TryFinally)
+        while current and not isinstance(current.parent, ignores):
+            current = current.parent
+
+        expected = (astroid.ExceptHandler,)
+        if (not current
+                or not isinstance(current.parent, expected)):
+            self.add_message('misplaced-bare-raise', node=node)
+
+    def _check_bad_exception_context(self, node):
+        """Verify that the exception context is properly set.
+
+        An exception context can be only `None` or an exception.
+        """
+        cause = safe_infer(node.cause)
+        if cause in (astroid.YES, None):
+            return
+        if isinstance(cause, astroid.Const):
+            if cause.value is not None:
+                self.add_message('bad-exception-context',
+                                 node=node)
+        elif (not isinstance(cause, astroid.ClassDef) and
+              not inherit_from_std_ex(cause)):
+            self.add_message('bad-exception-context',
+                             node=node)
+
+    def _check_raise_value(self, node, expr):
+        """check for bad values, string exception and class inheritance
+        """
+        value_found = True
+        if isinstance(expr, astroid.Const):
+            value = expr.value
+            if not isinstance(value, str):
+                # raising-string will be emitted from python3 porting checker.
+                self.add_message('raising-bad-type', node=node,
+                                 args=value.__class__.__name__)
+        elif ((isinstance(expr, astroid.Name) and
+               expr.name in ('None', 'True', 'False')) or
+              isinstance(expr, (astroid.List, astroid.Dict, astroid.Tuple,
+                                astroid.Module, astroid.FunctionDef))):
+            emit = True
+            if not PY3K and isinstance(expr, astroid.Tuple) and expr.elts:
+                # On Python 2, using the following is not an error:
+                #    raise (ZeroDivisionError, None)
+                #    raise (ZeroDivisionError, )
+                # What's left to do is to check that the first
+                # argument is indeed an exception.
+                # Verifying the other arguments is not
+                # the scope of this check.
+                first = expr.elts[0]
+                inferred = safe_infer(first)
+                if isinstance(inferred, astroid.Instance):
+                    # pylint: disable=protected-access
+                    inferred = inferred._proxied
+                if (inferred is astroid.YES or
+                        isinstance(inferred, astroid.ClassDef)
+                        and inherit_from_std_ex(inferred)):
+                    emit = False
+            if emit:
+                self.add_message('raising-bad-type',
+                                 node=node,
+                                 args=expr.name)
+        elif ((isinstance(expr, astroid.Name) and expr.name == 'NotImplemented')
+              or (isinstance(expr, astroid.Call) and
+                  isinstance(expr.func, astroid.Name) and
+                  expr.func.name == 'NotImplemented')):
+            self.add_message('notimplemented-raised', node=node)
+        elif isinstance(expr, (astroid.Instance, astroid.ClassDef)):
+            if isinstance(expr, astroid.Instance):
+                # pylint: disable=protected-access
+                expr = expr._proxied
+            if (isinstance(expr, astroid.ClassDef) and
+                    not inherit_from_std_ex(expr) and
+                    has_known_bases(expr)):
+                if expr.newstyle:
+                    self.add_message('raising-non-exception', node=node)
+                else:
+                    self.add_message('nonstandard-exception', node=node)
+            else:
+                value_found = False
+        else:
+            value_found = False
+        return value_found
+
+    def _check_catching_non_exception(self, handler, exc, part):
+        if isinstance(exc, astroid.Tuple):
+            # Check if it is a tuple of exceptions.
+            inferred = [safe_infer(elt) for elt in exc.elts]
+            if any(node is astroid.YES for node in inferred):
+                # Don't emit if we don't know every component.
+                return
+            if all(node and inherit_from_std_ex(node)
+                   for node in inferred):
+                return
+
+        if not isinstance(exc, astroid.ClassDef):
+            # Don't emit the warning if the infered stmt
+            # is None, but the exception handler is something else,
+            # maybe it was redefined.
+            if (isinstance(exc, astroid.Const) and
+                    exc.value is None):
+                if ((isinstance(handler.type, astroid.Const) and
+                     handler.type.value is None) or
+                        handler.type.parent_of(exc)):
+                    # If the exception handler catches None or
+                    # the exception component, which is None, is
+                    # defined by the entire exception handler, then
+                    # emit a warning.
+                    self.add_message('catching-non-exception',
+                                     node=handler.type,
+                                     args=(part.as_string(), ))
+            else:
+                self.add_message('catching-non-exception',
+                                 node=handler.type,
+                                 args=(part.as_string(), ))
+            return
+
+        if (not inherit_from_std_ex(exc) and
+                exc.name not in self.builtin_exceptions):
+            if has_known_bases(exc):
+                self.add_message('catching-non-exception',
+                                 node=handler.type,
+                                 args=(exc.name, ))
+
+    @check_messages('bare-except', 'broad-except',
+                    'binary-op-exception', 'bad-except-order',
+                    'catching-non-exception', 'duplicate-except')
+    def visit_tryexcept(self, node):
+        """check for empty except"""
+        exceptions_classes = []
+        nb_handlers = len(node.handlers)
+        for index, handler in enumerate(node.handlers):
+            if handler.type is None:
+                if not is_raising(handler.body):
+                    self.add_message('bare-except', node=handler)
+                # check if a "except:" is followed by some other
+                # except
+                if index < (nb_handlers - 1):
+                    msg = 'empty except clause should always appear last'
+                    self.add_message('bad-except-order', node=node, args=msg)
+
+            elif isinstance(handler.type, astroid.BoolOp):
+                self.add_message('binary-op-exception',
+                                 node=handler, args=handler.type.op)
+            else:
+                try:
+                    excs = list(_annotated_unpack_infer(handler.type))
+                except astroid.InferenceError:
+                    continue
+                for part, exc in excs:
+                    if exc is astroid.YES:
+                        continue
+                    if (isinstance(exc, astroid.Instance)
+                            and inherit_from_std_ex(exc)):
+                        # pylint: disable=protected-access
+                        exc = exc._proxied
+
+                    self._check_catching_non_exception(handler, exc, part)
+
+                    if not isinstance(exc, astroid.ClassDef):
+                        continue
+
+                    exc_ancestors = [anc for anc in exc.ancestors()
+                                     if isinstance(anc, astroid.ClassDef)]
+                    for previous_exc in exceptions_classes:
+                        if previous_exc in exc_ancestors:
+                            msg = '%s is an ancestor class of %s' % (
+                                previous_exc.name, exc.name)
+                            self.add_message('bad-except-order',
+                                             node=handler.type, args=msg)
+                    if (exc.name in self.config.overgeneral_exceptions
+                            and exc.root().name == EXCEPTIONS_MODULE
+                            and not is_raising(handler.body)):
+                        self.add_message('broad-except',
+                                         args=exc.name, node=handler.type)
+
+                    if exc in exceptions_classes:
+                        self.add_message('duplicate-except',
+                                         args=exc.name, node=handler.type)
+
+                exceptions_classes += [exc for _, exc in excs]
+
+
+def register(linter):
+    """required method to auto register this checker"""
+    linter.register_checker(ExceptionsChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/logging.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/logging.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/logging.py	(revision 1126)
@@ -0,0 +1,258 @@
+# Copyright (c) 2009-2010 Google, Inc.
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""checker for use of Python logging
+"""
+
+import six
+
+import astroid
+
+from pylint import checkers
+from pylint import interfaces
+from pylint.checkers import utils
+from pylint.checkers.utils import check_messages
+
+
+
+MSGS = {
+    'W1201': ('Specify string format arguments as logging function parameters',
+              'logging-not-lazy',
+              'Used when a logging statement has a call form of '
+              '"logging.<logging method>(format_string % (format_args...))". '
+              'Such calls should leave string interpolation to the logging '
+              'method itself and be written '
+              '"logging.<logging method>(format_string, format_args...)" '
+              'so that the program may avoid incurring the cost of the '
+              'interpolation in those cases in which no message will be '
+              'logged. For more, see '
+              'http://www.python.org/dev/peps/pep-0282/.'),
+    'W1202': ('Use % formatting in logging functions and pass the % '
+              'parameters as arguments',
+              'logging-format-interpolation',
+              'Used when a logging statement has a call form of '
+              '"logging.<logging method>(format_string.format(format_args...))"'
+              '. Such calls should use % formatting instead, but leave '
+              'interpolation to the logging function by passing the parameters '
+              'as arguments.'),
+    'E1200': ('Unsupported logging format character %r (%#02x) at index %d',
+              'logging-unsupported-format',
+              'Used when an unsupported format character is used in a logging\
+              statement format string.'),
+    'E1201': ('Logging format string ends in middle of conversion specifier',
+              'logging-format-truncated',
+              'Used when a logging statement format string terminates before\
+              the end of a conversion specifier.'),
+    'E1205': ('Too many arguments for logging format string',
+              'logging-too-many-args',
+              'Used when a logging format string is given too few arguments.'),
+    'E1206': ('Not enough arguments for logging format string',
+              'logging-too-few-args',
+              'Used when a logging format string is given too many arguments'),
+    }
+
+
+CHECKED_CONVENIENCE_FUNCTIONS = set([
+    'critical', 'debug', 'error', 'exception', 'fatal', 'info', 'warn',
+    'warning'])
+
+def is_method_call(callfunc_node, types=(), methods=()):
+    """Determines if a CallFunc node represents a method call.
+
+    Args:
+      callfunc_node: The CallFunc AST node to check.
+      types: Optional sequence of caller type names to restrict check.
+      methods: Optional sequence of method names to restrict check.
+
+    Returns:
+      True, if the node represents a method call for the given type and
+      method names, False otherwise.
+    """
+    if not isinstance(callfunc_node, astroid.Call):
+        return False
+    func = utils.safe_infer(callfunc_node.func)
+    return (isinstance(func, astroid.BoundMethod)
+            and isinstance(func.bound, astroid.Instance)
+            and (func.bound.name in types if types else True)
+            and (func.name in methods if methods else True))
+
+
+
+class LoggingChecker(checkers.BaseChecker):
+    """Checks use of the logging module."""
+
+    __implements__ = interfaces.IAstroidChecker
+    name = 'logging'
+    msgs = MSGS
+
+    options = (('logging-modules',
+                {'default': ('logging',),
+                 'type': 'csv',
+                 'metavar': '<comma separated list>',
+                 'help': 'Logging modules to check that the string format '
+                         'arguments are in logging function parameter format'}
+               ),
+              )
+
+    def visit_module(self, node): # pylint: disable=unused-argument
+        """Clears any state left in this checker from last module checked."""
+        # The code being checked can just as easily "import logging as foo",
+        # so it is necessary to process the imports and store in this field
+        # what name the logging module is actually given.
+        self._logging_names = set()
+        logging_mods = self.config.logging_modules
+
+        self._logging_modules = set(logging_mods)
+        self._from_imports = {}
+        for logging_mod in logging_mods:
+            parts = logging_mod.rsplit('.', 1)
+            if len(parts) > 1:
+                self._from_imports[parts[0]] = parts[1]
+
+    def visit_importfrom(self, node):
+        """Checks to see if a module uses a non-Python logging module."""
+        try:
+            logging_name = self._from_imports[node.modname]
+            for module, as_name in node.names:
+                if module == logging_name:
+                    self._logging_names.add(as_name or module)
+        except KeyError:
+            pass
+
+    def visit_import(self, node):
+        """Checks to see if this module uses Python's built-in logging."""
+        for module, as_name in node.names:
+            if module in self._logging_modules:
+                self._logging_names.add(as_name or module)
+
+    @check_messages(*(MSGS.keys()))
+    def visit_call(self, node):
+        """Checks calls to logging methods."""
+        def is_logging_name():
+            return (isinstance(node.func, astroid.Attribute) and
+                    isinstance(node.func.expr, astroid.Name) and
+                    node.func.expr.name in self._logging_names)
+
+        def is_logger_class():
+            try:
+                for inferred in node.func.infer():
+                    if isinstance(inferred, astroid.BoundMethod):
+                        parent = inferred._proxied.parent
+                        if (isinstance(parent, astroid.ClassDef) and
+                                (parent.qname() == 'logging.Logger' or
+                                 any(ancestor.qname() == 'logging.Logger'
+                                     for ancestor in parent.ancestors()))):
+                            return True, inferred._proxied.name
+            except astroid.exceptions.InferenceError:
+                pass
+            return False, None
+
+        if is_logging_name():
+            name = node.func.attrname
+        else:
+            result, name = is_logger_class()
+            if not result:
+                return
+        self._check_log_method(node, name)
+
+    def _check_log_method(self, node, name):
+        """Checks calls to logging.log(level, format, *format_args)."""
+        if name == 'log':
+            if node.starargs or node.kwargs or len(node.args) < 2:
+                # Either a malformed call, star args, or double-star args. Beyond
+                # the scope of this checker.
+                return
+            format_pos = 1
+        elif name in CHECKED_CONVENIENCE_FUNCTIONS:
+            if node.starargs or node.kwargs or not node.args:
+                # Either no args, star args, or double-star args. Beyond the
+                # scope of this checker.
+                return
+            format_pos = 0
+        else:
+            return
+
+        if isinstance(node.args[format_pos], astroid.BinOp) and node.args[format_pos].op == '%':
+            self.add_message('logging-not-lazy', node=node)
+        elif isinstance(node.args[format_pos], astroid.Call):
+            self._check_call_func(node.args[format_pos])
+        elif isinstance(node.args[format_pos], astroid.Const):
+            self._check_format_string(node, format_pos)
+
+    def _check_call_func(self, callfunc_node):
+        """Checks that function call is not format_string.format().
+
+        Args:
+          callfunc_node: CallFunc AST node to be checked.
+        """
+        if is_method_call(callfunc_node, ('str', 'unicode'), ('format',)):
+            self.add_message('logging-format-interpolation', node=callfunc_node)
+
+    def _check_format_string(self, node, format_arg):
+        """Checks that format string tokens match the supplied arguments.
+
+        Args:
+          node: AST node to be checked.
+          format_arg: Index of the format string in the node arguments.
+        """
+        num_args = _count_supplied_tokens(node.args[format_arg + 1:])
+        if not num_args:
+            # If no args were supplied, then all format strings are valid -
+            # don't check any further.
+            return
+        format_string = node.args[format_arg].value
+        if not isinstance(format_string, six.string_types):
+            # If the log format is constant non-string (e.g. logging.debug(5)),
+            # ensure there are no arguments.
+            required_num_args = 0
+        else:
+            try:
+                keyword_args, required_num_args = \
+                    utils.parse_format_string(format_string)
+                if keyword_args:
+                    # Keyword checking on logging strings is complicated by
+                    # special keywords - out of scope.
+                    return
+            except utils.UnsupportedFormatCharacter as ex:
+                char = format_string[ex.index]
+                self.add_message('logging-unsupported-format', node=node,
+                                 args=(char, ord(char), ex.index))
+                return
+            except utils.IncompleteFormatString:
+                self.add_message('logging-format-truncated', node=node)
+                return
+        if num_args > required_num_args:
+            self.add_message('logging-too-many-args', node=node)
+        elif num_args < required_num_args:
+            self.add_message('logging-too-few-args', node=node)
+
+
+def _count_supplied_tokens(args):
+    """Counts the number of tokens in an args list.
+
+    The Python log functions allow for special keyword arguments: func,
+    exc_info and extra. To handle these cases correctly, we only count
+    arguments that aren't keywords.
+
+    Args:
+      args: List of AST nodes that are arguments for a log format string.
+
+    Returns:
+      Number of AST nodes that aren't keywords.
+    """
+    return sum(1 for arg in args if not isinstance(arg, astroid.Keyword))
+
+
+def register(linter):
+    """Required method to auto-register this checker."""
+    linter.register_checker(LoggingChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/format.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/format.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/format.py	(revision 1126)
@@ -0,0 +1,993 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Python code format's checker.
+
+By default try to follow Guido's style guide :
+
+http://www.python.org/doc/essays/styleguide.html
+
+Some parts of the process_token method is based from The Tab Nanny std module.
+"""
+
+import keyword
+import sys
+import tokenize
+from functools import reduce # pylint: disable=redefined-builtin
+
+import six
+from six.moves import zip, map, filter # pylint: disable=redefined-builtin
+
+from astroid import nodes
+
+from pylint.interfaces import ITokenChecker, IAstroidChecker, IRawChecker
+from pylint.checkers import BaseTokenChecker
+from pylint.checkers.utils import check_messages
+from pylint.utils import WarningScope, OPTION_RGX
+
+_CONTINUATION_BLOCK_OPENERS = ['elif', 'except', 'for', 'if', 'while', 'def', 'class']
+_KEYWORD_TOKENS = ['assert', 'del', 'elif', 'except', 'for', 'if', 'in', 'not',
+                   'raise', 'return', 'while', 'yield']
+if sys.version_info < (3, 0):
+    _KEYWORD_TOKENS.append('print')
+
+_SPACED_OPERATORS = ['==', '<', '>', '!=', '<>', '<=', '>=',
+                     '+=', '-=', '*=', '**=', '/=', '//=', '&=', '|=', '^=',
+                     '%=', '>>=', '<<=']
+_OPENING_BRACKETS = ['(', '[', '{']
+_CLOSING_BRACKETS = [')', ']', '}']
+_TAB_LENGTH = 8
+
+_EOL = frozenset([tokenize.NEWLINE, tokenize.NL, tokenize.COMMENT])
+_JUNK_TOKENS = (tokenize.COMMENT, tokenize.NL)
+
+# Whitespace checking policy constants
+_MUST = 0
+_MUST_NOT = 1
+_IGNORE = 2
+
+# Whitespace checking config constants
+_DICT_SEPARATOR = 'dict-separator'
+_TRAILING_COMMA = 'trailing-comma'
+_EMPTY_LINE = 'empty-line'
+_NO_SPACE_CHECK_CHOICES = [_TRAILING_COMMA, _DICT_SEPARATOR, _EMPTY_LINE]
+_DEFAULT_NO_SPACE_CHECK_CHOICES = [_TRAILING_COMMA, _DICT_SEPARATOR]
+
+MSGS = {
+    'C0301': ('Line too long (%s/%s)',
+              'line-too-long',
+              'Used when a line is longer than a given number of characters.'),
+    'C0302': ('Too many lines in module (%s/%s)', # was W0302
+              'too-many-lines',
+              'Used when a module has too much lines, reducing its readability.'
+             ),
+    'C0303': ('Trailing whitespace',
+              'trailing-whitespace',
+              'Used when there is whitespace between the end of a line and the '
+              'newline.'),
+    'C0304': ('Final newline missing',
+              'missing-final-newline',
+              'Used when the last line in a file is missing a newline.'),
+    'W0311': ('Bad indentation. Found %s %s, expected %s',
+              'bad-indentation',
+              'Used when an unexpected number of indentation\'s tabulations or '
+              'spaces has been found.'),
+    'C0330': ('Wrong %s indentation%s%s.\n%s%s',
+              'bad-continuation',
+              'TODO'),
+    'W0312': ('Found indentation with %ss instead of %ss',
+              'mixed-indentation',
+              'Used when there are some mixed tabs and spaces in a module.'),
+    'W0301': ('Unnecessary semicolon', # was W0106
+              'unnecessary-semicolon',
+              'Used when a statement is ended by a semi-colon (";"), which \
+              isn\'t necessary (that\'s python, not C ;).'),
+    'C0321': ('More than one statement on a single line',
+              'multiple-statements',
+              'Used when more than on statement are found on the same line.',
+              {'scope': WarningScope.NODE}),
+    'C0325' : ('Unnecessary parens after %r keyword',
+               'superfluous-parens',
+               'Used when a single item in parentheses follows an if, for, or '
+               'other keyword.'),
+    'C0326': ('%s space %s %s %s\n%s',
+              'bad-whitespace',
+              ('Used when a wrong number of spaces is used around an operator, '
+               'bracket or block opener.'),
+              {'old_names': [('C0323', 'no-space-after-operator'),
+                             ('C0324', 'no-space-after-comma'),
+                             ('C0322', 'no-space-before-operator')]}),
+    'W0332': ('Use of "l" as long integer identifier',
+              'lowercase-l-suffix',
+              'Used when a lower case "l" is used to mark a long integer. You '
+              'should use a upper case "L" since the letter "l" looks too much '
+              'like the digit "1"',
+              {'maxversion': (3, 0)}),
+    'C0327': ('Mixed line endings LF and CRLF',
+              'mixed-line-endings',
+              'Used when there are mixed (LF and CRLF) newline signs in a file.'),
+    'C0328': ('Unexpected line ending format. There is \'%s\' while it should be \'%s\'.',
+              'unexpected-line-ending-format',
+              'Used when there is different newline than expected.'),
+    }
+
+
+def _underline_token(token):
+    length = token[3][1] - token[2][1]
+    offset = token[2][1]
+    referenced_line = token[4]
+    # If the referenced line does not end with a newline char, fix it
+    if referenced_line[-1] != '\n':
+        referenced_line += '\n'
+    return referenced_line + (' ' * offset) + ('^' * length)
+
+def _column_distance(token1, token2):
+    if token1 == token2:
+        return 0
+    if token2[3] < token1[3]:
+        token1, token2 = token2, token1
+    if token1[3][0] != token2[2][0]:
+        return None
+    return token2[2][1] - token1[3][1]
+
+
+def _last_token_on_line_is(tokens, line_end, token):
+    return (line_end > 0 and tokens.token(line_end-1) == token or
+            line_end > 1 and tokens.token(line_end-2) == token
+            and tokens.type(line_end-1) == tokenize.COMMENT)
+
+
+def _token_followed_by_eol(tokens, position):
+    return (tokens.type(position+1) == tokenize.NL or
+            tokens.type(position+1) == tokenize.COMMENT and
+            tokens.type(position+2) == tokenize.NL)
+
+
+def _get_indent_length(line):
+    """Return the length of the indentation on the given token's line."""
+    result = 0
+    for char in line:
+        if char == ' ':
+            result += 1
+        elif char == '\t':
+            result += _TAB_LENGTH
+        else:
+            break
+    return result
+
+
+def _get_indent_hint_line(bar_positions, bad_position):
+    """Return a line with |s for each of the positions in the given lists."""
+    if not bar_positions:
+        return ('', '')
+    delta_message = ''
+    markers = [(pos, '|') for pos in bar_positions]
+    if len(markers) == 1:
+        # if we have only one marker we'll provide an extra hint on how to fix
+        expected_position = markers[0][0]
+        delta = abs(expected_position - bad_position)
+        direction = 'add' if expected_position > bad_position else 'remove'
+        delta_message = _CONTINUATION_HINT_MESSAGE % (
+            direction, delta, 's' if delta > 1 else '')
+    markers.append((bad_position, '^'))
+    markers.sort()
+    line = [' '] * (markers[-1][0] + 1)
+    for position, marker in markers:
+        line[position] = marker
+    return (''.join(line), delta_message)
+
+
+class _ContinuedIndent(object):
+    __slots__ = ('valid_outdent_offsets',
+                 'valid_continuation_offsets',
+                 'context_type',
+                 'token',
+                 'position')
+
+    def __init__(self,
+                 context_type,
+                 token,
+                 position,
+                 valid_outdent_offsets,
+                 valid_continuation_offsets):
+        self.valid_outdent_offsets = valid_outdent_offsets
+        self.valid_continuation_offsets = valid_continuation_offsets
+        self.context_type = context_type
+        self.position = position
+        self.token = token
+
+
+# The contexts for hanging indents.
+# A hanging indented dictionary value after :
+HANGING_DICT_VALUE = 'dict-value'
+# Hanging indentation in an expression.
+HANGING = 'hanging'
+# Hanging indentation in a block header.
+HANGING_BLOCK = 'hanging-block'
+# Continued indentation inside an expression.
+CONTINUED = 'continued'
+# Continued indentation in a block header.
+CONTINUED_BLOCK = 'continued-block'
+
+SINGLE_LINE = 'single'
+WITH_BODY = 'multi'
+
+_CONTINUATION_MSG_PARTS = {
+    HANGING_DICT_VALUE: ('hanging', ' in dict value'),
+    HANGING: ('hanging', ''),
+    HANGING_BLOCK: ('hanging', ' before block'),
+    CONTINUED: ('continued', ''),
+    CONTINUED_BLOCK: ('continued', ' before block'),
+}
+
+_CONTINUATION_HINT_MESSAGE = ' (%s %d space%s)'  # Ex: (remove 2 spaces)
+
+def _Offsets(*args):
+    """Valid indentation offsets for a continued line."""
+    return dict((a, None) for a in args)
+
+
+def _BeforeBlockOffsets(single, with_body):
+    """Valid alternative indent offsets for continued lines before blocks.
+
+    :param single: Valid offset for statements on a single logical line.
+    :param with_body: Valid offset for statements on several lines.
+    """
+    return {single: SINGLE_LINE, with_body: WITH_BODY}
+
+
+class TokenWrapper(object):
+    """A wrapper for readable access to token information."""
+
+    def __init__(self, tokens):
+        self._tokens = tokens
+
+    def token(self, idx):
+        return self._tokens[idx][1]
+
+    def type(self, idx):
+        return self._tokens[idx][0]
+
+    def start_line(self, idx):
+        return self._tokens[idx][2][0]
+
+    def start_col(self, idx):
+        return self._tokens[idx][2][1]
+
+    def line(self, idx):
+        return self._tokens[idx][4]
+
+
+class ContinuedLineState(object):
+    """Tracker for continued indentation inside a logical line."""
+
+    def __init__(self, tokens, config):
+        self._line_start = -1
+        self._cont_stack = []
+        self._is_block_opener = False
+        self.retained_warnings = []
+        self._config = config
+        self._tokens = TokenWrapper(tokens)
+
+    @property
+    def has_content(self):
+        return bool(self._cont_stack)
+
+    @property
+    def _block_indent_size(self):
+        return len(self._config.indent_string.replace('\t', ' ' * _TAB_LENGTH))
+
+    @property
+    def _continuation_size(self):
+        return self._config.indent_after_paren
+
+    def handle_line_start(self, pos):
+        """Record the first non-junk token at the start of a line."""
+        if self._line_start > -1:
+            return
+        self._is_block_opener = self._tokens.token(pos) in _CONTINUATION_BLOCK_OPENERS
+        self._line_start = pos
+
+    def next_physical_line(self):
+        """Prepares the tracker for a new physical line (NL)."""
+        self._line_start = -1
+        self._is_block_opener = False
+
+    def next_logical_line(self):
+        """Prepares the tracker for a new logical line (NEWLINE).
+
+        A new logical line only starts with block indentation.
+        """
+        self.next_physical_line()
+        self.retained_warnings = []
+        self._cont_stack = []
+
+    def add_block_warning(self, token_position, state, valid_offsets):
+        self.retained_warnings.append((token_position, state, valid_offsets))
+
+    def get_valid_offsets(self, idx):
+        """Returns the valid offsets for the token at the given position."""
+        # The closing brace on a dict or the 'for' in a dict comprehension may
+        # reset two indent levels because the dict value is ended implicitly
+        stack_top = -1
+        if self._tokens.token(idx) in ('}', 'for') and self._cont_stack[-1].token == ':':
+            stack_top = -2
+        indent = self._cont_stack[stack_top]
+        if self._tokens.token(idx) in _CLOSING_BRACKETS:
+            valid_offsets = indent.valid_outdent_offsets
+        else:
+            valid_offsets = indent.valid_continuation_offsets
+        return indent, valid_offsets.copy()
+
+    def _hanging_indent_after_bracket(self, bracket, position):
+        """Extracts indentation information for a hanging indent."""
+        indentation = _get_indent_length(self._tokens.line(position))
+        if self._is_block_opener and self._continuation_size == self._block_indent_size:
+            return _ContinuedIndent(
+                HANGING_BLOCK,
+                bracket,
+                position,
+                _Offsets(indentation + self._continuation_size, indentation),
+                _BeforeBlockOffsets(indentation + self._continuation_size,
+                                    indentation + self._continuation_size * 2))
+        elif bracket == ':':
+            # If the dict key was on the same line as the open brace, the new
+            # correct indent should be relative to the key instead of the
+            # current indent level
+            paren_align = self._cont_stack[-1].valid_outdent_offsets
+            next_align = self._cont_stack[-1].valid_continuation_offsets.copy()
+            next_align_keys = list(next_align.keys())
+            next_align[next_align_keys[0] + self._continuation_size] = True
+            # Note that the continuation of
+            # d = {
+            #       'a': 'b'
+            #            'c'
+            # }
+            # is handled by the special-casing for hanging continued string indents.
+            return _ContinuedIndent(HANGING_DICT_VALUE, bracket, position, paren_align, next_align)
+        else:
+            return _ContinuedIndent(
+                HANGING,
+                bracket,
+                position,
+                _Offsets(indentation, indentation + self._continuation_size),
+                _Offsets(indentation + self._continuation_size))
+
+    def _continuation_inside_bracket(self, bracket, pos):
+        """Extracts indentation information for a continued indent."""
+        indentation = _get_indent_length(self._tokens.line(pos))
+        token_start = self._tokens.start_col(pos)
+        next_token_start = self._tokens.start_col(pos + 1)
+        if self._is_block_opener and next_token_start - indentation == self._block_indent_size:
+            return _ContinuedIndent(
+                CONTINUED_BLOCK,
+                bracket,
+                pos,
+                _Offsets(token_start),
+                _BeforeBlockOffsets(next_token_start, next_token_start + self._continuation_size))
+        else:
+            return _ContinuedIndent(
+                CONTINUED,
+                bracket,
+                pos,
+                _Offsets(token_start),
+                _Offsets(next_token_start))
+
+    def pop_token(self):
+        self._cont_stack.pop()
+
+    def push_token(self, token, position):
+        """Pushes a new token for continued indentation on the stack.
+
+        Tokens that can modify continued indentation offsets are:
+          * opening brackets
+          * 'lambda'
+          * : inside dictionaries
+
+        push_token relies on the caller to filter out those
+        interesting tokens.
+
+        :param token: The concrete token
+        :param position: The position of the token in the stream.
+        """
+        if _token_followed_by_eol(self._tokens, position):
+            self._cont_stack.append(
+                self._hanging_indent_after_bracket(token, position))
+        else:
+            self._cont_stack.append(
+                self._continuation_inside_bracket(token, position))
+
+
+class FormatChecker(BaseTokenChecker):
+    """checks for :
+    * unauthorized constructions
+    * strict indentation
+    * line length
+    """
+
+    __implements__ = (ITokenChecker, IAstroidChecker, IRawChecker)
+
+    # configuration section name
+    name = 'format'
+    # messages
+    msgs = MSGS
+    # configuration options
+    # for available dict keys/values see the optik parser 'add_option' method
+    options = (('max-line-length',
+                {'default' : 100, 'type' : "int", 'metavar' : '<int>',
+                 'help' : 'Maximum number of characters on a single line.'}),
+               ('ignore-long-lines',
+                {'type': 'regexp', 'metavar': '<regexp>',
+                 'default': r'^\s*(# )?<?https?://\S+>?$',
+                 'help': ('Regexp for a line that is allowed to be longer than '
+                          'the limit.')}),
+               ('single-line-if-stmt',
+                {'default': False, 'type' : 'yn', 'metavar' : '<y_or_n>',
+                 'help' : ('Allow the body of an if to be on the same '
+                           'line as the test if there is no else.')}),
+               ('no-space-check',
+                {'default': ','.join(_DEFAULT_NO_SPACE_CHECK_CHOICES),
+                 'metavar': ','.join(_NO_SPACE_CHECK_CHOICES),
+                 'type': 'multiple_choice',
+                 'choices': _NO_SPACE_CHECK_CHOICES,
+                 'help': ('List of optional constructs for which whitespace '
+                          'checking is disabled. '
+                          '`'+ _DICT_SEPARATOR + '` is used to allow tabulation '
+                          'in dicts, etc.: {1  : 1,\\n222: 2}. '
+                          '`'+ _TRAILING_COMMA + '` allows a space between comma '
+                          'and closing bracket: (a, ). '
+                          '`'+ _EMPTY_LINE + '` allows space-only lines.')}),
+               ('max-module-lines',
+                {'default' : 1000, 'type' : 'int', 'metavar' : '<int>',
+                 'help': 'Maximum number of lines in a module'}
+               ),
+               ('indent-string',
+                {'default' : '    ', 'type' : "string", 'metavar' : '<string>',
+                 'help' : 'String used as indentation unit. This is usually '
+                          '"    " (4 spaces) or "\\t" (1 tab).'}),
+               ('indent-after-paren',
+                {'type': 'int', 'metavar': '<int>', 'default': 4,
+                 'help': 'Number of spaces of indent required inside a hanging '
+                         ' or continued line.'}),
+               ('expected-line-ending-format',
+                {'type': 'choice', 'metavar': '<empty or LF or CRLF>', 'default': '',
+                 'choices': ['', 'LF', 'CRLF'],
+                 'help': ('Expected format of line ending, '
+                          'e.g. empty (any line ending), LF or CRLF.')}),
+              )
+
+    def __init__(self, linter=None):
+        BaseTokenChecker.__init__(self, linter)
+        self._lines = None
+        self._visited_lines = None
+        self._bracket_stack = [None]
+
+    def _pop_token(self):
+        self._bracket_stack.pop()
+        self._current_line.pop_token()
+
+    def _push_token(self, token, idx):
+        self._bracket_stack.append(token)
+        self._current_line.push_token(token, idx)
+
+    def new_line(self, tokens, line_end, line_start):
+        """a new line has been encountered, process it if necessary"""
+        if _last_token_on_line_is(tokens, line_end, ';'):
+            self.add_message('unnecessary-semicolon', line=tokens.start_line(line_end))
+
+        line_num = tokens.start_line(line_start)
+        line = tokens.line(line_start)
+        if tokens.type(line_start) not in _JUNK_TOKENS:
+            self._lines[line_num] = line.split('\n')[0]
+        self.check_lines(line, line_num)
+
+    def process_module(self, module):
+        self._keywords_with_parens = set()
+        if 'print_function' in module.future_imports:
+            self._keywords_with_parens.add('print')
+
+    def _check_keyword_parentheses(self, tokens, start):
+        """Check that there are not unnecessary parens after a keyword.
+
+        Parens are unnecessary if there is exactly one balanced outer pair on a
+        line, and it is followed by a colon, and contains no commas (i.e. is not a
+        tuple).
+
+        Args:
+        tokens: list of Tokens; the entire list of Tokens.
+        start: int; the position of the keyword in the token list.
+        """
+        # If the next token is not a paren, we're fine.
+        if self._inside_brackets(':') and tokens[start][1] == 'for':
+            self._pop_token()
+        if tokens[start+1][1] != '(':
+            return
+
+        found_and_or = False
+        depth = 0
+        keyword_token = tokens[start][1]
+        line_num = tokens[start][2][0]
+
+        for i in range(start, len(tokens) - 1):
+            token = tokens[i]
+
+            # If we hit a newline, then assume any parens were for continuation.
+            if token[0] == tokenize.NL:
+                return
+
+            if token[1] == '(':
+                depth += 1
+            elif token[1] == ')':
+                depth -= 1
+                if depth:
+                    continue
+                # ')' can't happen after if (foo), since it would be a syntax error.
+                if (tokens[i+1][1] in (':', ')', ']', '}', 'in') or
+                        tokens[i+1][0] in (tokenize.NEWLINE,
+                                           tokenize.ENDMARKER,
+                                           tokenize.COMMENT)):
+                    # The empty tuple () is always accepted.
+                    if i == start + 2:
+                        return
+                    if keyword_token == 'not':
+                        if not found_and_or:
+                            self.add_message('superfluous-parens', line=line_num,
+                                             args=keyword_token)
+                    elif keyword_token in ('return', 'yield'):
+                        self.add_message('superfluous-parens', line=line_num,
+                                         args=keyword_token)
+                    elif keyword_token not in self._keywords_with_parens:
+                        if not (tokens[i+1][1] == 'in' and found_and_or):
+                            self.add_message('superfluous-parens', line=line_num,
+                                             args=keyword_token)
+                return
+            elif depth == 1:
+                # This is a tuple, which is always acceptable.
+                if token[1] == ',':
+                    return
+                # 'and' and 'or' are the only boolean operators with lower precedence
+                # than 'not', so parens are only required when they are found.
+                elif token[1] in ('and', 'or'):
+                    found_and_or = True
+                # A yield inside an expression must always be in parentheses,
+                # quit early without error.
+                elif token[1] == 'yield':
+                    return
+                # A generator expression always has a 'for' token in it, and
+                # the 'for' token is only legal inside parens when it is in a
+                # generator expression.  The parens are necessary here, so bail
+                # without an error.
+                elif token[1] == 'for':
+                    return
+
+    def _opening_bracket(self, tokens, i):
+        self._push_token(tokens[i][1], i)
+        # Special case: ignore slices
+        if tokens[i][1] == '[' and tokens[i+1][1] == ':':
+            return
+
+        if (i > 0 and (tokens[i-1][0] == tokenize.NAME and
+                       not (keyword.iskeyword(tokens[i-1][1]))
+                       or tokens[i-1][1] in _CLOSING_BRACKETS)):
+            self._check_space(tokens, i, (_MUST_NOT, _MUST_NOT))
+        else:
+            self._check_space(tokens, i, (_IGNORE, _MUST_NOT))
+
+    def _closing_bracket(self, tokens, i):
+        if self._inside_brackets(':'):
+            self._pop_token()
+        self._pop_token()
+        # Special case: ignore slices
+        if tokens[i-1][1] == ':' and tokens[i][1] == ']':
+            return
+        policy_before = _MUST_NOT
+        if tokens[i][1] in _CLOSING_BRACKETS and tokens[i-1][1] == ',':
+            if _TRAILING_COMMA in self.config.no_space_check:
+                policy_before = _IGNORE
+
+        self._check_space(tokens, i, (policy_before, _IGNORE))
+
+    def _check_equals_spacing(self, tokens, i):
+        """Check the spacing of a single equals sign."""
+        if self._inside_brackets('(') or self._inside_brackets('lambda'):
+            self._check_space(tokens, i, (_MUST_NOT, _MUST_NOT))
+        else:
+            self._check_space(tokens, i, (_MUST, _MUST))
+
+    def _open_lambda(self, tokens, i): # pylint:disable=unused-argument
+        self._push_token('lambda', i)
+
+    def _handle_colon(self, tokens, i):
+        # Special case: ignore slices
+        if self._inside_brackets('['):
+            return
+        if (self._inside_brackets('{') and
+                _DICT_SEPARATOR in self.config.no_space_check):
+            policy = (_IGNORE, _IGNORE)
+        else:
+            policy = (_MUST_NOT, _MUST)
+        self._check_space(tokens, i, policy)
+
+        if self._inside_brackets('lambda'):
+            self._pop_token()
+        elif self._inside_brackets('{'):
+            self._push_token(':', i)
+
+    def _handle_comma(self, tokens, i):
+        # Only require a following whitespace if this is
+        # not a hanging comma before a closing bracket.
+        if tokens[i+1][1] in _CLOSING_BRACKETS:
+            self._check_space(tokens, i, (_MUST_NOT, _IGNORE))
+        else:
+            self._check_space(tokens, i, (_MUST_NOT, _MUST))
+        if self._inside_brackets(':'):
+            self._pop_token()
+
+    def _check_surrounded_by_space(self, tokens, i):
+        """Check that a binary operator is surrounded by exactly one space."""
+        self._check_space(tokens, i, (_MUST, _MUST))
+
+    def _check_space(self, tokens, i, policies):
+        def _policy_string(policy):
+            if policy == _MUST:
+                return 'Exactly one', 'required'
+            else:
+                return 'No', 'allowed'
+
+        def _name_construct(token):
+            if token[1] == ',':
+                return 'comma'
+            elif token[1] == ':':
+                return ':'
+            elif token[1] in '()[]{}':
+                return 'bracket'
+            elif token[1] in ('<', '>', '<=', '>=', '!=', '=='):
+                return 'comparison'
+            else:
+                if self._inside_brackets('('):
+                    return 'keyword argument assignment'
+                else:
+                    return 'assignment'
+
+        good_space = [True, True]
+        token = tokens[i]
+        pairs = [(tokens[i-1], token), (token, tokens[i+1])]
+
+        for other_idx, (policy, token_pair) in enumerate(zip(policies, pairs)):
+            if token_pair[other_idx][0] in _EOL or policy == _IGNORE:
+                continue
+
+            distance = _column_distance(*token_pair)
+            if distance is None:
+                continue
+            good_space[other_idx] = (
+                (policy == _MUST and distance == 1) or
+                (policy == _MUST_NOT and distance == 0))
+
+        warnings = []
+        if not any(good_space) and policies[0] == policies[1]:
+            warnings.append((policies[0], 'around'))
+        else:
+            for ok, policy, position in zip(good_space, policies, ('before', 'after')):
+                if not ok:
+                    warnings.append((policy, position))
+        for policy, position in warnings:
+            construct = _name_construct(token)
+            count, state = _policy_string(policy)
+            self.add_message('bad-whitespace', line=token[2][0],
+                             args=(count, state, position, construct,
+                                   _underline_token(token)))
+
+    def _inside_brackets(self, left):
+        return self._bracket_stack[-1] == left
+
+    def _prepare_token_dispatcher(self):
+        raw = [
+            (_KEYWORD_TOKENS,
+             self._check_keyword_parentheses),
+
+            (_OPENING_BRACKETS, self._opening_bracket),
+
+            (_CLOSING_BRACKETS, self._closing_bracket),
+
+            (['='], self._check_equals_spacing),
+
+            (_SPACED_OPERATORS, self._check_surrounded_by_space),
+
+            ([','], self._handle_comma),
+
+            ([':'], self._handle_colon),
+
+            (['lambda'], self._open_lambda),
+
+            ]
+
+        dispatch = {}
+        for tokens, handler in raw:
+            for token in tokens:
+                dispatch[token] = handler
+        return dispatch
+
+    def process_tokens(self, tokens):
+        """process tokens and search for :
+
+         _ non strict indentation (i.e. not always using the <indent> parameter as
+           indent unit)
+         _ too long lines (i.e. longer than <max_chars>)
+         _ optionally bad construct (if given, bad_construct must be a compiled
+           regular expression).
+        """
+        self._bracket_stack = [None]
+        indents = [0]
+        check_equal = False
+        line_num = 0
+        self._lines = {}
+        self._visited_lines = {}
+        token_handlers = self._prepare_token_dispatcher()
+        self._last_line_ending = None
+
+        self._current_line = ContinuedLineState(tokens, self.config)
+        for idx, (tok_type, token, start, _, line) in enumerate(tokens):
+            if start[0] != line_num:
+                line_num = start[0]
+                # A tokenizer oddity: if an indented line contains a multi-line
+                # docstring, the line member of the INDENT token does not contain
+                # the full line; therefore we check the next token on the line.
+                if tok_type == tokenize.INDENT:
+                    self.new_line(TokenWrapper(tokens), idx-1, idx+1)
+                else:
+                    self.new_line(TokenWrapper(tokens), idx-1, idx)
+
+            if tok_type == tokenize.NEWLINE:
+                # a program statement, or ENDMARKER, will eventually follow,
+                # after some (possibly empty) run of tokens of the form
+                #     (NL | COMMENT)* (INDENT | DEDENT+)?
+                # If an INDENT appears, setting check_equal is wrong, and will
+                # be undone when we see the INDENT.
+                check_equal = True
+                self._process_retained_warnings(TokenWrapper(tokens), idx)
+                self._current_line.next_logical_line()
+                self._check_line_ending(token, line_num)
+            elif tok_type == tokenize.INDENT:
+                check_equal = False
+                self.check_indent_level(token, indents[-1]+1, line_num)
+                indents.append(indents[-1]+1)
+            elif tok_type == tokenize.DEDENT:
+                # there's nothing we need to check here!  what's important is
+                # that when the run of DEDENTs ends, the indentation of the
+                # program statement (or ENDMARKER) that triggered the run is
+                # equal to what's left at the top of the indents stack
+                check_equal = True
+                if len(indents) > 1:
+                    del indents[-1]
+            elif tok_type == tokenize.NL:
+                self._check_continued_indentation(TokenWrapper(tokens), idx+1)
+                self._current_line.next_physical_line()
+            elif tok_type != tokenize.COMMENT:
+                self._current_line.handle_line_start(idx)
+                # This is the first concrete token following a NEWLINE, so it
+                # must be the first token of the next program statement, or an
+                # ENDMARKER; the "line" argument exposes the leading whitespace
+                # for this statement; in the case of ENDMARKER, line is an empty
+                # string, so will properly match the empty string with which the
+                # "indents" stack was seeded
+                if check_equal:
+                    check_equal = False
+                    self.check_indent_level(line, indents[-1], line_num)
+
+            if tok_type == tokenize.NUMBER and token.endswith('l'):
+                self.add_message('lowercase-l-suffix', line=line_num)
+
+            try:
+                handler = token_handlers[token]
+            except KeyError:
+                pass
+            else:
+                handler(tokens, idx)
+
+        line_num -= 1 # to be ok with "wc -l"
+        if line_num > self.config.max_module_lines:
+            # Get the line where the too-many-lines (or its message id)
+            # was disabled or default to 1.
+            symbol = self.linter.msgs_store.check_message_id('too-many-lines')
+            names = (symbol.msgid, 'too-many-lines')
+            line = next(filter(None,
+                               map(self.linter._pragma_lineno.get, names)), 1)
+            self.add_message('too-many-lines',
+                             args=(line_num, self.config.max_module_lines),
+                             line=line)
+
+    def _check_line_ending(self, line_ending, line_num):
+        # check if line endings are mixed
+        if self._last_line_ending is not None:
+            if line_ending != self._last_line_ending:
+                self.add_message('mixed-line-endings', line=line_num)
+
+        self._last_line_ending = line_ending
+
+        # check if line ending is as expected
+        expected = self.config.expected_line_ending_format
+        if expected:
+            # reduce multiple \n\n\n\n to one \n
+            line_ending = reduce(lambda x, y: x + y if x != y else x, line_ending, "")
+            line_ending = 'LF' if line_ending == '\n' else 'CRLF'
+            if line_ending != expected:
+                self.add_message('unexpected-line-ending-format', args=(line_ending, expected),
+                                 line=line_num)
+
+
+    def _process_retained_warnings(self, tokens, current_pos):
+        single_line_block_stmt = not _last_token_on_line_is(tokens, current_pos, ':')
+
+        for indent_pos, state, offsets in self._current_line.retained_warnings:
+            block_type = offsets[tokens.start_col(indent_pos)]
+            hints = dict((k, v) for k, v in six.iteritems(offsets)
+                         if v != block_type)
+            if single_line_block_stmt and block_type == WITH_BODY:
+                self._add_continuation_message(state, hints, tokens, indent_pos)
+            elif not single_line_block_stmt and block_type == SINGLE_LINE:
+                self._add_continuation_message(state, hints, tokens, indent_pos)
+
+    def _check_continued_indentation(self, tokens, next_idx):
+        def same_token_around_nl(token_type):
+            return (tokens.type(next_idx) == token_type and
+                    tokens.type(next_idx-2) == token_type)
+
+        # Do not issue any warnings if the next line is empty.
+        if not self._current_line.has_content or tokens.type(next_idx) == tokenize.NL:
+            return
+
+        state, valid_offsets = self._current_line.get_valid_offsets(next_idx)
+        # Special handling for hanging comments and strings. If the last line ended
+        # with a comment (string) and the new line contains only a comment, the line
+        # may also be indented to the start of the previous token.
+        if same_token_around_nl(tokenize.COMMENT) or same_token_around_nl(tokenize.STRING):
+            valid_offsets[tokens.start_col(next_idx-2)] = True
+
+        # We can only decide if the indentation of a continued line before opening
+        # a new block is valid once we know of the body of the block is on the
+        # same line as the block opener. Since the token processing is single-pass,
+        # emitting those warnings is delayed until the block opener is processed.
+        if (state.context_type in (HANGING_BLOCK, CONTINUED_BLOCK)
+                and tokens.start_col(next_idx) in valid_offsets):
+            self._current_line.add_block_warning(next_idx, state, valid_offsets)
+        elif tokens.start_col(next_idx) not in valid_offsets:
+            self._add_continuation_message(state, valid_offsets, tokens, next_idx)
+
+    def _add_continuation_message(self, state, offsets, tokens, position):
+        readable_type, readable_position = _CONTINUATION_MSG_PARTS[state.context_type]
+        hint_line, delta_message = _get_indent_hint_line(offsets, tokens.start_col(position))
+        self.add_message(
+            'bad-continuation',
+            line=tokens.start_line(position),
+            args=(readable_type, readable_position, delta_message,
+                  tokens.line(position), hint_line))
+
+    @check_messages('multiple-statements')
+    def visit_default(self, node):
+        """check the node line number and check it if not yet done"""
+        if not node.is_statement:
+            return
+        if not node.root().pure_python:
+            return # XXX block visit of child nodes
+        prev_sibl = node.previous_sibling()
+        if prev_sibl is not None:
+            prev_line = prev_sibl.fromlineno
+        else:
+            # The line on which a finally: occurs in a try/finally
+            # is not directly represented in the AST. We infer it
+            # by taking the last line of the body and adding 1, which
+            # should be the line of finally:
+            if (isinstance(node.parent, nodes.TryFinally)
+                    and node in node.parent.finalbody):
+                prev_line = node.parent.body[0].tolineno + 1
+            else:
+                prev_line = node.parent.statement().fromlineno
+        line = node.fromlineno
+        assert line, node
+        if prev_line == line and self._visited_lines.get(line) != 2:
+            self._check_multi_statement_line(node, line)
+            return
+        if line in self._visited_lines:
+            return
+        try:
+            tolineno = node.blockstart_tolineno
+        except AttributeError:
+            tolineno = node.tolineno
+        assert tolineno, node
+        lines = []
+        for line in range(line, tolineno + 1):
+            self._visited_lines[line] = 1
+            try:
+                lines.append(self._lines[line].rstrip())
+            except KeyError:
+                lines.append('')
+
+    def _check_multi_statement_line(self, node, line):
+        """Check for lines containing multiple statements."""
+        # Do not warn about multiple nested context managers
+        # in with statements.
+        if isinstance(node, nodes.With):
+            return
+        # For try... except... finally..., the two nodes
+        # appear to be on the same line due to how the AST is built.
+        if (isinstance(node, nodes.TryExcept) and
+                isinstance(node.parent, nodes.TryFinally)):
+            return
+        if (isinstance(node.parent, nodes.If) and not node.parent.orelse
+                and self.config.single_line_if_stmt):
+            return
+        self.add_message('multiple-statements', node=node)
+        self._visited_lines[line] = 2
+
+    def check_lines(self, lines, i):
+        """check lines have less than a maximum number of characters
+        """
+        max_chars = self.config.max_line_length
+        ignore_long_line = self.config.ignore_long_lines
+
+        for line in lines.splitlines(True):
+            if not line.endswith('\n'):
+                self.add_message('missing-final-newline', line=i)
+            else:
+                stripped_line = line.rstrip()
+                if not stripped_line and _EMPTY_LINE in self.config.no_space_check:
+                    # allow empty lines
+                    pass
+                elif line[len(stripped_line):] not in ('\n', '\r\n'):
+                    self.add_message('trailing-whitespace', line=i)
+                # Don't count excess whitespace in the line length.
+                line = stripped_line
+            mobj = OPTION_RGX.search(line)
+            if mobj and mobj.group(1).split('=', 1)[0].strip() == 'disable':
+                line = line.split('#')[0].rstrip()
+
+            if len(line) > max_chars and not ignore_long_line.search(line):
+                self.add_message('line-too-long', line=i, args=(len(line), max_chars))
+            i += 1
+
+    def check_indent_level(self, string, expected, line_num):
+        """return the indent level of the string
+        """
+        indent = self.config.indent_string
+        if indent == '\\t': # \t is not interpreted in the configuration file
+            indent = '\t'
+        level = 0
+        unit_size = len(indent)
+        while string[:unit_size] == indent:
+            string = string[unit_size:]
+            level += 1
+        suppl = ''
+        while string and string[0] in ' \t':
+            if string[0] != indent[0]:
+                if string[0] == '\t':
+                    args = ('tab', 'space')
+                else:
+                    args = ('space', 'tab')
+                self.add_message('mixed-indentation', args=args, line=line_num)
+                return level
+            suppl += string[0]
+            string = string[1:]
+        if level != expected or suppl:
+            i_type = 'spaces'
+            if indent[0] == '\t':
+                i_type = 'tabs'
+            self.add_message('bad-indentation', line=line_num,
+                             args=(level * unit_size + len(suppl), i_type,
+                                   expected * unit_size))
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(FormatChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/strings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/strings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/strings.py	(revision 1126)
@@ -0,0 +1,618 @@
+# Copyright (c) 2009-2010 Arista Networks, Inc. - James Lingard
+# Copyright (c) 2004-2013 LOGILAB S.A. (Paris, FRANCE).
+# Copyright 2012 Google Inc.
+#
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Checker for string formatting operations.
+"""
+
+import sys
+import tokenize
+import string
+import numbers
+
+import six
+
+import astroid
+from pylint.interfaces import ITokenChecker, IAstroidChecker, IRawChecker
+from pylint.checkers import BaseChecker, BaseTokenChecker
+from pylint.checkers import utils
+from pylint.checkers.utils import check_messages
+
+
+_PY3K = sys.version_info[:2] >= (3, 0)
+_PY27 = sys.version_info[:2] == (2, 7)
+
+MSGS = {
+    'E1300': ("Unsupported format character %r (%#02x) at index %d",
+              "bad-format-character",
+              "Used when a unsupported format character is used in a format\
+              string."),
+    'E1301': ("Format string ends in middle of conversion specifier",
+              "truncated-format-string",
+              "Used when a format string terminates before the end of a \
+              conversion specifier."),
+    'E1302': ("Mixing named and unnamed conversion specifiers in format string",
+              "mixed-format-string",
+              "Used when a format string contains both named (e.g. '%(foo)d') \
+              and unnamed (e.g. '%d') conversion specifiers.  This is also \
+              used when a named conversion specifier contains * for the \
+              minimum field width and/or precision."),
+    'E1303': ("Expected mapping for format string, not %s",
+              "format-needs-mapping",
+              "Used when a format string that uses named conversion specifiers \
+              is used with an argument that is not a mapping."),
+    'W1300': ("Format string dictionary key should be a string, not %s",
+              "bad-format-string-key",
+              "Used when a format string that uses named conversion specifiers \
+              is used with a dictionary whose keys are not all strings."),
+    'W1301': ("Unused key %r in format string dictionary",
+              "unused-format-string-key",
+              "Used when a format string that uses named conversion specifiers \
+              is used with a dictionary that conWtains keys not required by the \
+              format string."),
+    'E1304': ("Missing key %r in format string dictionary",
+              "missing-format-string-key",
+              "Used when a format string that uses named conversion specifiers \
+              is used with a dictionary that doesn't contain all the keys \
+              required by the format string."),
+    'E1305': ("Too many arguments for format string",
+              "too-many-format-args",
+              "Used when a format string that uses unnamed conversion \
+              specifiers is given too many arguments."),
+    'E1306': ("Not enough arguments for format string",
+              "too-few-format-args",
+              "Used when a format string that uses unnamed conversion \
+              specifiers is given too few arguments"),
+    'E1310': ("Suspicious argument in %s.%s call",
+              "bad-str-strip-call",
+              "The argument to a str.{l,r,}strip call contains a"
+              " duplicate character, "),
+    'W1302': ("Invalid format string",
+              "bad-format-string",
+              "Used when a PEP 3101 format string is invalid.",
+              {'minversion': (2, 7)}),
+    'W1303': ("Missing keyword argument %r for format string",
+              "missing-format-argument-key",
+              "Used when a PEP 3101 format string that uses named fields "
+              "doesn't receive one or more required keywords.",
+              {'minversion': (2, 7)}),
+    'W1304': ("Unused format argument %r",
+              "unused-format-string-argument",
+              "Used when a PEP 3101 format string that uses named "
+              "fields is used with an argument that "
+              "is not required by the format string.",
+              {'minversion': (2, 7)}),
+    'W1305': ("Format string contains both automatic field numbering "
+              "and manual field specification",
+              "format-combined-specification",
+              "Usen when a PEP 3101 format string contains both automatic "
+              "field numbering (e.g. '{}') and manual field "
+              "specification (e.g. '{0}').",
+              {'minversion': (2, 7)}),
+    'W1306': ("Missing format attribute %r in format specifier %r",
+              "missing-format-attribute",
+              "Used when a PEP 3101 format string uses an "
+              "attribute specifier ({0.length}), but the argument "
+              "passed for formatting doesn't have that attribute.",
+              {'minversion': (2, 7)}),
+    'W1307': ("Using invalid lookup key %r in format specifier %r",
+              "invalid-format-index",
+              "Used when a PEP 3101 format string uses a lookup specifier "
+              "({a[1]}), but the argument passed for formatting "
+              "doesn't contain or doesn't have that key as an attribute.",
+              {'minversion': (2, 7)})
+    }
+
+OTHER_NODES = (astroid.Const, astroid.List, astroid.Repr,
+               astroid.Lambda, astroid.FunctionDef,
+               astroid.ListComp, astroid.SetComp, astroid.GeneratorExp)
+
+if _PY3K:
+    import _string # pylint: disable=wrong-import-position, wrong-import-order
+
+    def split_format_field_names(format_string):
+        return _string.formatter_field_name_split(format_string)
+else:
+    def _field_iterator_convertor(iterator):
+        for is_attr, key in iterator:
+            if isinstance(key, numbers.Number):
+                yield is_attr, int(key)
+            else:
+                yield is_attr, key
+
+    def split_format_field_names(format_string):
+        keyname, fielditerator = format_string._formatter_field_name_split()
+        # it will return longs, instead of ints, which will complicate
+        # the output
+        return keyname, _field_iterator_convertor(fielditerator)
+
+
+def collect_string_fields(format_string):
+    """ Given a format string, return an iterator
+    of all the valid format fields. It handles nested fields
+    as well.
+    """
+
+    formatter = string.Formatter()
+    try:
+        parseiterator = formatter.parse(format_string)
+        for result in parseiterator:
+            if all(item is None for item in result[1:]):
+                # not a replacement format
+                continue
+            name = result[1]
+            nested = result[2]
+            yield name
+            if nested:
+                for field in collect_string_fields(nested):
+                    yield field
+    except ValueError as exc:
+        # Probably the format string is invalid.
+        if exc.args[0].startswith("cannot switch from manual"):
+            # On Jython, parsing a string with both manual
+            # and automatic positions will fail with a ValueError,
+            # while on CPython it will simply return the fields,
+            # the validation being done in the interpreter (?).
+            # We're just returning two mixed fields in order
+            # to trigger the format-combined-specification check.
+            yield ""
+            yield "1"
+            return
+        raise utils.IncompleteFormatString(format_string)
+
+def parse_format_method_string(format_string):
+    """
+    Parses a PEP 3101 format string, returning a tuple of
+    (keys, num_args, manual_pos_arg),
+    where keys is the set of mapping keys in the format string, num_args
+    is the number of arguments required by the format string and
+    manual_pos_arg is the number of arguments passed with the position.
+    """
+    keys = []
+    num_args = 0
+    manual_pos_arg = set()
+    for name in collect_string_fields(format_string):
+        if name and str(name).isdigit():
+            manual_pos_arg.add(str(name))
+        elif name:
+            keyname, fielditerator = split_format_field_names(name)
+            if isinstance(keyname, numbers.Number):
+                # In Python 2 it will return long which will lead
+                # to different output between 2 and 3
+                manual_pos_arg.add(str(keyname))
+                keyname = int(keyname)
+            keys.append((keyname, list(fielditerator)))
+        else:
+            num_args += 1
+    return keys, num_args, len(manual_pos_arg)
+
+def get_args(callfunc):
+    """Get the arguments from the given `CallFunc` node.
+
+    Return a tuple, where the first element is the
+    number of positional arguments and the second element
+    is the keyword arguments in a dict.
+    """
+    if callfunc.keywords:
+        named = {arg.arg: utils.safe_infer(arg.value)
+                 for arg in callfunc.keywords}
+    else:
+        named = {}
+    positional = len(callfunc.args)
+    return positional, named
+
+def get_access_path(key, parts):
+    """ Given a list of format specifiers, returns
+    the final access path (e.g. a.b.c[0][1]).
+    """
+    path = []
+    for is_attribute, specifier in parts:
+        if is_attribute:
+            path.append(".{}".format(specifier))
+        else:
+            path.append("[{!r}]".format(specifier))
+    return str(key) + "".join(path)
+
+
+class StringFormatChecker(BaseChecker):
+    """Checks string formatting operations to ensure that the format string
+    is valid and the arguments match the format string.
+    """
+
+    __implements__ = (IAstroidChecker,)
+    name = 'string'
+    msgs = MSGS
+
+    @check_messages(*(MSGS.keys()))
+    def visit_binop(self, node):
+        if node.op != '%':
+            return
+        left = node.left
+        args = node.right
+
+        if not (isinstance(left, astroid.Const)
+                and isinstance(left.value, six.string_types)):
+            return
+        format_string = left.value
+        try:
+            required_keys, required_num_args = \
+                utils.parse_format_string(format_string)
+        except utils.UnsupportedFormatCharacter as e:
+            c = format_string[e.index]
+            self.add_message('bad-format-character',
+                             node=node, args=(c, ord(c), e.index))
+            return
+        except utils.IncompleteFormatString:
+            self.add_message('truncated-format-string', node=node)
+            return
+        if required_keys and required_num_args:
+            # The format string uses both named and unnamed format
+            # specifiers.
+            self.add_message('mixed-format-string', node=node)
+        elif required_keys:
+            # The format string uses only named format specifiers.
+            # Check that the RHS of the % operator is a mapping object
+            # that contains precisely the set of keys required by the
+            # format string.
+            if isinstance(args, astroid.Dict):
+                keys = set()
+                unknown_keys = False
+                for k, _ in args.items:
+                    if isinstance(k, astroid.Const):
+                        key = k.value
+                        if isinstance(key, six.string_types):
+                            keys.add(key)
+                        else:
+                            self.add_message('bad-format-string-key',
+                                             node=node, args=key)
+                    else:
+                        # One of the keys was something other than a
+                        # constant.  Since we can't tell what it is,
+                        # supress checks for missing keys in the
+                        # dictionary.
+                        unknown_keys = True
+                if not unknown_keys:
+                    for key in required_keys:
+                        if key not in keys:
+                            self.add_message('missing-format-string-key',
+                                             node=node, args=key)
+                for key in keys:
+                    if key not in required_keys:
+                        self.add_message('unused-format-string-key',
+                                         node=node, args=key)
+            elif isinstance(args, OTHER_NODES + (astroid.Tuple,)):
+                type_name = type(args).__name__
+                self.add_message('format-needs-mapping',
+                                 node=node, args=type_name)
+            # else:
+                # The RHS of the format specifier is a name or
+                # expression.  It may be a mapping object, so
+                # there's nothing we can check.
+        else:
+            # The format string uses only unnamed format specifiers.
+            # Check that the number of arguments passed to the RHS of
+            # the % operator matches the number required by the format
+            # string.
+            if isinstance(args, astroid.Tuple):
+                num_args = len(args.elts)
+            elif isinstance(args, OTHER_NODES + (astroid.Dict, astroid.DictComp)):
+                num_args = 1
+            else:
+                # The RHS of the format specifier is a name or
+                # expression.  It could be a tuple of unknown size, so
+                # there's nothing we can check.
+                num_args = None
+            if num_args is not None:
+                if num_args > required_num_args:
+                    self.add_message('too-many-format-args', node=node)
+                elif num_args < required_num_args:
+                    self.add_message('too-few-format-args', node=node)
+
+
+    @check_messages(*(MSGS.keys()))
+    def visit_call(self, node):
+        func = utils.safe_infer(node.func)
+        if (isinstance(func, astroid.BoundMethod)
+                and isinstance(func.bound, astroid.Instance)
+                and func.bound.name in ('str', 'unicode', 'bytes')):
+            if func.name in ('strip', 'lstrip', 'rstrip') and node.args:
+                arg = utils.safe_infer(node.args[0])
+                if not isinstance(arg, astroid.Const):
+                    return
+                if len(arg.value) != len(set(arg.value)):
+                    self.add_message('bad-str-strip-call', node=node,
+                                     args=(func.bound.name, func.name))
+            elif func.name == 'format':
+                if _PY27 or _PY3K:
+                    self._check_new_format(node, func)
+
+    def _check_new_format(self, node, func):
+        """ Check the new string formatting. """
+        # TODO: skip (for now) format nodes which don't have
+        #       an explicit string on the left side of the format operation.
+        #       We do this because our inference engine can't properly handle
+        #       redefinitions of the original string.
+        #       For more details, see issue 287.
+        #
+        # Note that there may not be any left side at all, if the format method
+        # has been assigned to another variable. See issue 351. For example:
+        #
+        #    fmt = 'some string {}'.format
+        #    fmt('arg')
+        if (isinstance(node.func, astroid.Attribute)
+                and not isinstance(node.func.expr, astroid.Const)):
+            return
+        try:
+            strnode = next(func.bound.infer())
+        except astroid.InferenceError:
+            return
+        if not isinstance(strnode, astroid.Const):
+            return
+        if not isinstance(strnode.value, six.string_types):
+            return
+
+        if node.starargs or node.kwargs:
+            return
+        try:
+            positional, named = get_args(node)
+        except astroid.InferenceError:
+            return
+        try:
+            fields, num_args, manual_pos = parse_format_method_string(strnode.value)
+        except utils.IncompleteFormatString:
+            self.add_message('bad-format-string', node=node)
+            return
+
+        named_fields = set(field[0] for field in fields
+                           if isinstance(field[0], six.string_types))
+        if num_args and manual_pos:
+            self.add_message('format-combined-specification',
+                             node=node)
+            return
+
+        check_args = False
+        # Consider "{[0]} {[1]}" as num_args.
+        num_args += sum(1 for field in named_fields
+                        if field == '')
+        if named_fields:
+            for field in named_fields:
+                if field not in named and field:
+                    self.add_message('missing-format-argument-key',
+                                     node=node,
+                                     args=(field, ))
+            for field in named:
+                if field not in named_fields:
+                    self.add_message('unused-format-string-argument',
+                                     node=node,
+                                     args=(field, ))
+            # num_args can be 0 if manual_pos is not.
+            num_args = num_args or manual_pos
+            if positional or num_args:
+                empty = any(True for field in named_fields
+                            if field == '')
+                if named or empty:
+                    # Verify the required number of positional arguments
+                    # only if the .format got at least one keyword argument.
+                    # This means that the format strings accepts both
+                    # positional and named fields and we should warn
+                    # when one of the them is missing or is extra.
+                    check_args = True
+        else:
+            check_args = True
+        if check_args:
+            # num_args can be 0 if manual_pos is not.
+            num_args = num_args or manual_pos
+            if positional > num_args:
+                self.add_message('too-many-format-args', node=node)
+            elif positional < num_args:
+                self.add_message('too-few-format-args', node=node)
+
+        self._check_new_format_specifiers(node, fields, named)
+
+    def _check_new_format_specifiers(self, node, fields, named):
+        """
+        Check attribute and index access in the format
+        string ("{0.a}" and "{0[a]}").
+        """
+        for key, specifiers in fields:
+            # Obtain the argument. If it can't be obtained
+            # or infered, skip this check.
+            if key == '':
+                # {[0]} will have an unnamed argument, defaulting
+                # to 0. It will not be present in `named`, so use the value
+                # 0 for it.
+                key = 0
+            if isinstance(key, numbers.Number):
+                try:
+                    argname = utils.get_argument_from_call(node, key)
+                except utils.NoSuchArgumentError:
+                    continue
+            else:
+                if key not in named:
+                    continue
+                argname = named[key]
+            if argname in (astroid.YES, None):
+                continue
+            try:
+                argument = next(argname.infer())
+            except astroid.InferenceError:
+                continue
+            if not specifiers or argument is astroid.YES:
+                # No need to check this key if it doesn't
+                # use attribute / item access
+                continue
+            if argument.parent and isinstance(argument.parent, astroid.Arguments):
+                # Ignore any object coming from an argument,
+                # because we can't infer its value properly.
+                continue
+            previous = argument
+            parsed = []
+            for is_attribute, specifier in specifiers:
+                if previous is astroid.YES:
+                    break
+                parsed.append((is_attribute, specifier))
+                if is_attribute:
+                    try:
+                        previous = previous.getattr(specifier)[0]
+                    except astroid.NotFoundError:
+                        if (hasattr(previous, 'has_dynamic_getattr') and
+                                previous.has_dynamic_getattr()):
+                            # Don't warn if the object has a custom __getattr__
+                            break
+                        path = get_access_path(key, parsed)
+                        self.add_message('missing-format-attribute',
+                                         args=(specifier, path),
+                                         node=node)
+                        break
+                else:
+                    warn_error = False
+                    if hasattr(previous, 'getitem'):
+                        try:
+                            previous = previous.getitem(specifier)
+                        except (IndexError, TypeError):
+                            warn_error = True
+                        except astroid.InferenceError:
+                            break
+                    else:
+                        try:
+                            # Lookup __getitem__ in the current node,
+                            # but skip further checks, because we can't
+                            # retrieve the looked object
+                            previous.getattr('__getitem__')
+                            break
+                        except astroid.NotFoundError:
+                            warn_error = True
+                    if warn_error:
+                        path = get_access_path(key, parsed)
+                        self.add_message('invalid-format-index',
+                                         args=(specifier, path),
+                                         node=node)
+                        break
+
+                try:
+                    previous = next(previous.infer())
+                except astroid.InferenceError:
+                    # can't check further if we can't infer it
+                    break
+
+
+
+class StringConstantChecker(BaseTokenChecker):
+    """Check string literals"""
+    __implements__ = (ITokenChecker, IRawChecker)
+    name = 'string_constant'
+    msgs = {
+        'W1401': ('Anomalous backslash in string: \'%s\'. '
+                  'String constant might be missing an r prefix.',
+                  'anomalous-backslash-in-string',
+                  'Used when a backslash is in a literal string but not as an '
+                  'escape.'),
+        'W1402': ('Anomalous Unicode escape in byte string: \'%s\'. '
+                  'String constant might be missing an r or u prefix.',
+                  'anomalous-unicode-escape-in-string',
+                  'Used when an escape like \\u is encountered in a byte '
+                  'string where it has no effect.'),
+        }
+
+    # Characters that have a special meaning after a backslash in either
+    # Unicode or byte strings.
+    ESCAPE_CHARACTERS = 'abfnrtvx\n\r\t\\\'\"01234567'
+
+    # TODO(mbp): Octal characters are quite an edge case today; people may
+    # prefer a separate warning where they occur.  \0 should be allowed.
+
+    # Characters that have a special meaning after a backslash but only in
+    # Unicode strings.
+    UNICODE_ESCAPE_CHARACTERS = 'uUN'
+
+    def process_module(self, module):
+        self._unicode_literals = 'unicode_literals' in module.future_imports
+
+    def process_tokens(self, tokens):
+        for (tok_type, token, (start_row, _), _, _) in tokens:
+            if tok_type == tokenize.STRING:
+                # 'token' is the whole un-parsed token; we can look at the start
+                # of it to see whether it's a raw or unicode string etc.
+                self.process_string_token(token, start_row)
+
+    def process_string_token(self, token, start_row):
+        for i, c in enumerate(token):
+            if c in '\'\"':
+                quote_char = c
+                break
+        # pylint: disable=undefined-loop-variable
+        prefix = token[:i].lower() #  markers like u, b, r.
+        after_prefix = token[i:]
+        if after_prefix[:3] == after_prefix[-3:] == 3 * quote_char:
+            string_body = after_prefix[3:-3]
+        else:
+            string_body = after_prefix[1:-1]  # Chop off quotes
+        # No special checks on raw strings at the moment.
+        if 'r' not in prefix:
+            self.process_non_raw_string_token(prefix, string_body, start_row)
+
+    def process_non_raw_string_token(self, prefix, string_body, start_row):
+        """check for bad escapes in a non-raw string.
+
+        prefix: lowercase string of eg 'ur' string prefix markers.
+        string_body: the un-parsed body of the string, not including the quote
+        marks.
+        start_row: integer line number in the source.
+        """
+        # Walk through the string; if we see a backslash then escape the next
+        # character, and skip over it.  If we see a non-escaped character,
+        # alert, and continue.
+        #
+        # Accept a backslash when it escapes a backslash, or a quote, or
+        # end-of-line, or one of the letters that introduce a special escape
+        # sequence <http://docs.python.org/reference/lexical_analysis.html>
+        #
+        # TODO(mbp): Maybe give a separate warning about the rarely-used
+        # \a \b \v \f?
+        #
+        # TODO(mbp): We could give the column of the problem character, but
+        # add_message doesn't seem to have a way to pass it through at present.
+        i = 0
+        while True:
+            i = string_body.find('\\', i)
+            if i == -1:
+                break
+            # There must be a next character; having a backslash at the end
+            # of the string would be a SyntaxError.
+            next_char = string_body[i+1]
+            match = string_body[i:i+2]
+            if next_char in self.UNICODE_ESCAPE_CHARACTERS:
+                if 'u' in prefix:
+                    pass
+                elif (_PY3K or self._unicode_literals) and 'b' not in prefix:
+                    pass  # unicode by default
+                else:
+                    self.add_message('anomalous-unicode-escape-in-string',
+                                     line=start_row, args=(match, ))
+            elif next_char not in self.ESCAPE_CHARACTERS:
+                self.add_message('anomalous-backslash-in-string',
+                                 line=start_row, args=(match, ))
+            # Whether it was a valid escape or not, backslash followed by
+            # another character can always be consumed whole: the second
+            # character can never be the start of a new backslash escape.
+            i += 2
+
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(StringFormatChecker(linter))
+    linter.register_checker(StringConstantChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/misc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/misc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/misc.py	(revision 1126)
@@ -0,0 +1,105 @@
+# pylint: disable=W0511
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+""" Copyright (c) 2000-2010 LOGILAB S.A. (Paris, FRANCE).
+ http://www.logilab.fr/ -- mailto:contact@logilab.fr
+
+Check source code is ascii only or has an encoding declaration (PEP 263)
+"""
+
+import re
+
+import six
+
+from pylint.interfaces import IRawChecker
+from pylint.checkers import BaseChecker
+
+
+MSGS = {
+    'W0511': ('%s',
+              'fixme',
+              'Used when a warning note as FIXME or XXX is detected.'),
+    'W0512': ('Cannot decode using encoding "%s", unexpected byte at position %d',
+              'invalid-encoded-data',
+              'Used when a source line cannot be decoded using the specified '
+              'source file encoding.',
+              {'maxversion': (3, 0)}),
+}
+
+
+class EncodingChecker(BaseChecker):
+
+    """checks for:
+    * warning notes in the code like FIXME, XXX
+    * encoding issues.
+    """
+    __implements__ = IRawChecker
+
+    # configuration section name
+    name = 'miscellaneous'
+    msgs = MSGS
+
+    options = (('notes',
+                {'type': 'csv', 'metavar': '<comma separated values>',
+                 'default': ('FIXME', 'XXX', 'TODO'),
+                 'help': ('List of note tags to take in consideration, '
+                          'separated by a comma.')}),)
+
+    def _check_note(self, notes, lineno, line):
+        # First, simply check if the notes are in the line at all. This is an
+        # optimisation to prevent using the regular expression on every line,
+        # but rather only on lines which may actually contain one of the notes.
+        # This prevents a pathological problem with lines that are hundreds
+        # of thousands of characters long.
+        for note in self.config.notes:
+            if note in line:
+                break
+        else:
+            return
+
+        match = notes.search(line)
+        if not match:
+            return
+        self.add_message('fixme', args=line[match.start(1):-1], line=lineno)
+
+    def _check_encoding(self, lineno, line, file_encoding):
+        try:
+            return six.text_type(line, file_encoding)
+        except UnicodeDecodeError as ex:
+            self.add_message('invalid-encoded-data', line=lineno,
+                             args=(file_encoding, ex.args[2]))
+
+    def process_module(self, module):
+        """inspect the source file to find encoding problem or fixmes like
+        notes
+        """
+        if self.config.notes:
+            notes = re.compile(
+                r'.*?#\s*(%s)(:*\s*.+)' % "|".join(self.config.notes))
+        else:
+            notes = None
+        if module.file_encoding:
+            encoding = module.file_encoding
+        else:
+            encoding = 'ascii'
+
+        with module.stream() as stream:
+            for lineno, line in enumerate(stream):
+                line = self._check_encoding(lineno + 1, line, encoding)
+                if line is not None and notes:
+                    self._check_note(notes, lineno + 1, line)
+
+
+def register(linter):
+    """required method to auto register this checker"""
+    linter.register_checker(EncodingChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/classes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/classes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/classes.py	(revision 1126)
@@ -0,0 +1,1127 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""classes checker for Python code
+"""
+from __future__ import generators
+
+import sys
+from collections import defaultdict
+
+import six
+
+import astroid
+from astroid.bases import Generator, BUILTINS
+from astroid.exceptions import InconsistentMroError, DuplicateBasesError
+from astroid import objects
+from astroid.scoped_nodes import function_to_method
+from pylint.interfaces import IAstroidChecker
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import (
+    PYMETHODS, SPECIAL_METHODS_PARAMS,
+    overrides_a_method, check_messages, is_attr_private,
+    is_attr_protected, node_frame_class, is_builtin_object,
+    decorated_with_property, unimplemented_abstract_methods,
+    decorated_with, class_is_abstract,
+    safe_infer, has_known_bases)
+from pylint.utils import deprecated_option, get_global_option
+
+
+if sys.version_info >= (3, 0):
+    NEXT_METHOD = '__next__'
+else:
+    NEXT_METHOD = 'next'
+ITER_METHODS = ('__iter__', '__getitem__')
+INVALID_BASE_CLASSES = {'bool', 'range', 'slice', 'memoryview'}
+
+
+def _get_method_args(method):
+    args = method.args.args
+    if method.type in ('classmethod', 'method'):
+        return len(args) - 1
+    return len(args)
+
+
+def _is_invalid_base_class(cls):
+    return cls.name in INVALID_BASE_CLASSES and is_builtin_object(cls)
+
+
+def _has_data_descriptor(cls, attr):
+    attributes = cls.getattr(attr)
+    for attribute in attributes:
+        try:
+            for inferred in attribute.infer():
+                if isinstance(inferred, astroid.Instance):
+                    try:
+                        inferred.getattr('__get__')
+                        inferred.getattr('__set__')
+                    except astroid.NotFoundError:
+                        continue
+                    else:
+                        return True
+        except astroid.InferenceError:
+            # Can't infer, avoid emitting a false positive in this case.
+            return True
+    return False
+
+
+def _called_in_methods(func, klass, methods):
+    """ Check if the func was called in any of the given methods,
+    belonging to the *klass*. Returns True if so, False otherwise.
+    """
+    if not isinstance(func, astroid.FunctionDef):
+        return False
+    for method in methods:
+        try:
+            infered = klass.getattr(method)
+        except astroid.NotFoundError:
+            continue
+        for infer_method in infered:
+            for callfunc in infer_method.nodes_of_class(astroid.Call):
+                try:
+                    bound = next(callfunc.func.infer())
+                except (astroid.InferenceError, StopIteration):
+                    continue
+                if not isinstance(bound, astroid.BoundMethod):
+                    continue
+                func_obj = bound._proxied
+                if isinstance(func_obj, astroid.UnboundMethod):
+                    func_obj = func_obj._proxied
+                if func_obj.name == func.name:
+                    return True
+    return False
+
+
+def _is_attribute_property(name, klass):
+    """ Check if the given attribute *name* is a property
+    in the given *klass*.
+
+    It will look for `property` calls or for functions
+    with the given name, decorated by `property` or `property`
+    subclasses.
+    Returns ``True`` if the name is a property in the given klass,
+    ``False`` otherwise.
+    """
+
+    try:
+        attributes = klass.getattr(name)
+    except astroid.NotFoundError:
+        return False
+    property_name = "{0}.property".format(BUILTINS)
+    for attr in attributes:
+        try:
+            infered = next(attr.infer())
+        except astroid.InferenceError:
+            continue
+        if (isinstance(infered, astroid.FunctionDef) and
+                decorated_with_property(infered)):
+            return True
+        if infered.pytype() == property_name:
+            return True
+    return False
+
+def _has_bare_super_call(fundef_node):
+    for call in fundef_node.nodes_of_class(astroid.Call):
+        func = call.func
+        if (isinstance(func, astroid.Name) and
+                func.name == 'super' and
+                not call.args):
+            return True
+    return False
+
+def _safe_infer_call_result(node, caller, context=None):
+    """
+    Safely infer the return value of a function.
+
+    Returns None if inference failed or if there is some ambiguity (more than
+    one node has been inferred). Otherwise returns infered value.
+    """
+    try:
+        inferit = node.infer_call_result(caller, context=context)
+        value = next(inferit)
+    except astroid.InferenceError:
+        return  # inference failed
+    except StopIteration:
+        return  # no values infered
+    try:
+        next(inferit)
+        return  # there is ambiguity on the inferred node
+    except astroid.InferenceError:
+        return  # there is some kind of ambiguity
+    except StopIteration:
+        return value
+
+MSGS = {
+    'F0202': ('Unable to check methods signature (%s / %s)',
+              'method-check-failed',
+              'Used when Pylint has been unable to check methods signature '
+              'compatibility for an unexpected reason. Please report this kind '
+              'if you don\'t make sense of it.'),
+
+    'E0202': ('An attribute defined in %s line %s hides this method',
+              'method-hidden',
+              'Used when a class defines a method which is hidden by an '
+              'instance attribute from an ancestor class or set by some '
+              'client code.'),
+    'E0203': ('Access to member %r before its definition line %s',
+              'access-member-before-definition',
+              'Used when an instance member is accessed before it\'s actually '
+              'assigned.'),
+    'W0201': ('Attribute %r defined outside __init__',
+              'attribute-defined-outside-init',
+              'Used when an instance attribute is defined outside the __init__ '
+              'method.'),
+
+    'W0212': ('Access to a protected member %s of a client class', # E0214
+              'protected-access',
+              'Used when a protected member (i.e. class member with a name '
+              'beginning with an underscore) is access outside the class or a '
+              'descendant of the class where it\'s defined.'),
+
+    'E0211': ('Method has no argument',
+              'no-method-argument',
+              'Used when a method which should have the bound instance as '
+              'first argument has no argument defined.'),
+    'E0213': ('Method should have "self" as first argument',
+              'no-self-argument',
+              'Used when a method has an attribute different the "self" as '
+              'first argument. This is considered as an error since this is '
+              'a so common convention that you shouldn\'t break it!'),
+    'C0202': ('Class method %s should have %s as first argument',
+              'bad-classmethod-argument',
+              'Used when a class method has a first argument named differently '
+              'than the value specified in valid-classmethod-first-arg option '
+              '(default to "cls"), recommended to easily differentiate them '
+              'from regular instance methods.'),
+    'C0203': ('Metaclass method %s should have %s as first argument',
+              'bad-mcs-method-argument',
+              'Used when a metaclass method has a first agument named '
+              'differently than the value specified in valid-classmethod-first'
+              '-arg option (default to "cls"), recommended to easily '
+              'differentiate them from regular instance methods.'),
+    'C0204': ('Metaclass class method %s should have %s as first argument',
+              'bad-mcs-classmethod-argument',
+              'Used when a metaclass class method has a first argument named '
+              'differently than the value specified in valid-metaclass-'
+              'classmethod-first-arg option (default to "mcs"), recommended to '
+              'easily differentiate them from regular instance methods.'),
+
+    'W0211': ('Static method with %r as first argument',
+              'bad-staticmethod-argument',
+              'Used when a static method has "self" or a value specified in '
+              'valid-classmethod-first-arg option or '
+              'valid-metaclass-classmethod-first-arg option as first argument.'
+             ),
+    'R0201': ('Method could be a function',
+              'no-self-use',
+              'Used when a method doesn\'t use its bound instance, and so could '
+              'be written as a function.'
+             ),
+    'W0221': ('Arguments number differs from %s %r method',
+              'arguments-differ',
+              'Used when a method has a different number of arguments than in '
+              'the implemented interface or in an overridden method.'),
+    'W0222': ('Signature differs from %s %r method',
+              'signature-differs',
+              'Used when a method signature is different than in the '
+              'implemented interface or in an overridden method.'),
+    'W0223': ('Method %r is abstract in class %r but is not overridden',
+              'abstract-method',
+              'Used when an abstract method (i.e. raise NotImplementedError) is '
+              'not overridden in concrete class.'
+             ),
+    'W0231': ('__init__ method from base class %r is not called',
+              'super-init-not-called',
+              'Used when an ancestor class method has an __init__ method '
+              'which is not called by a derived class.'),
+    'W0232': ('Class has no __init__ method',
+              'no-init',
+              'Used when a class has no __init__ method, neither its parent '
+              'classes.'),
+    'W0233': ('__init__ method from a non direct base class %r is called',
+              'non-parent-init-called',
+              'Used when an __init__ method is called on a class which is not '
+              'in the direct ancestors for the analysed class.'),
+    'E0236': ('Invalid object %r in __slots__, must contain '
+              'only non empty strings',
+              'invalid-slots-object',
+              'Used when an invalid (non-string) object occurs in __slots__.'),
+    'E0237': ('Assigning to attribute %r not defined in class slots',
+              'assigning-non-slot',
+              'Used when assigning to an attribute not defined '
+              'in the class slots.'),
+    'E0238': ('Invalid __slots__ object',
+              'invalid-slots',
+              'Used when an invalid __slots__ is found in class. '
+              'Only a string, an iterable or a sequence is permitted.'),
+    'E0239': ('Inheriting %r, which is not a class.',
+              'inherit-non-class',
+              'Used when a class inherits from something which is not a '
+              'class.'),
+    'E0240': ('Inconsistent method resolution order for class %r',
+              'inconsistent-mro',
+              'Used when a class has an inconsistent method resolutin order.'),
+    'E0241': ('Duplicate bases for class %r',
+              'duplicate-bases',
+              'Used when a class has duplicate bases.'),
+    'R0202': ('Consider using a decorator instead of calling classmethod',
+              'no-classmethod-decorator',
+              'Used when a class method is defined without using the decorator '
+              'syntax.'),
+    'R0203': ('Consider using a decorator instead of calling staticmethod',
+              'no-staticmethod-decorator',
+              'Used when a static method is defined without using the decorator '
+              'syntax.'),
+    }
+
+
+class ClassChecker(BaseChecker):
+    """checks for :
+    * methods without self as first argument
+    * overridden methods signature
+    * access only to existent members via self
+    * attributes not defined in the __init__ method
+    * unreachable code
+    """
+
+    __implements__ = (IAstroidChecker,)
+
+    # configuration section name
+    name = 'classes'
+    # messages
+    msgs = MSGS
+    priority = -2
+    # configuration options
+    options = (('ignore-iface-methods',
+                # TODO(cpopa): remove this in Pylint 1.6.
+                deprecated_option(opt_type="csv",
+                                  help_msg="This is deprecated, because "
+                                           "it is not used anymore.")
+               ),
+               ('defining-attr-methods',
+                {'default' : ('__init__', '__new__', 'setUp'),
+                 'type' : 'csv',
+                 'metavar' : '<method names>',
+                 'help' : 'List of method names used to declare (i.e. assign) \
+instance attributes.'}
+               ),
+               ('valid-classmethod-first-arg',
+                {'default' : ('cls',),
+                 'type' : 'csv',
+                 'metavar' : '<argument names>',
+                 'help' : 'List of valid names for the first argument in \
+a class method.'}
+               ),
+               ('valid-metaclass-classmethod-first-arg',
+                {'default' : ('mcs',),
+                 'type' : 'csv',
+                 'metavar' : '<argument names>',
+                 'help' : 'List of valid names for the first argument in \
+a metaclass class method.'}
+               ),
+               ('exclude-protected',
+                {
+                    'default': (
+                        # namedtuple public API.
+                        '_asdict', '_fields', '_replace', '_source', '_make'),
+                    'type': 'csv',
+                    'metavar': '<protected access exclusions>',
+                    'help': ('List of member names, which should be excluded '
+                             'from the protected access warning.')}
+               ))
+
+    def __init__(self, linter=None):
+        BaseChecker.__init__(self, linter)
+        self._accessed = []
+        self._first_attrs = []
+        self._meth_could_be_func = None
+
+    @check_messages('no-init', 'invalid-slots', 'inherit-non-class',
+                    'inconsistent-mro', 'duplicate-bases',
+                    'invalid-slots', 'invalid-slots-object', 'abstract-method',
+                    'access-member-before-definition',
+                    'attribute-defined-outside-init')
+    def visit_classdef(self, node):
+        """init visit variable _accessed
+        """
+        self._accessed.append(defaultdict(list))
+        self._check_bases_classes(node)
+        # if not an exception or a metaclass
+        if node.type == 'class' and has_known_bases(node):
+            try:
+                node.local_attr('__init__')
+            except astroid.NotFoundError:
+                self.add_message('no-init', args=node, node=node)
+        self._check_slots(node)
+        self._check_proper_bases(node)
+        self._check_consistent_mro(node)
+
+    def _check_consistent_mro(self, node):
+        """Detect that a class has a consistent mro or duplicate bases."""
+        try:
+            node.mro()
+        except InconsistentMroError:
+            self.add_message('inconsistent-mro', args=node.name, node=node)
+        except DuplicateBasesError:
+            self.add_message('duplicate-bases', args=node.name, node=node)
+        except NotImplementedError:
+            # Old style class, there's no mro so don't do anything.
+            pass
+
+    def _check_proper_bases(self, node):
+        """
+        Detect that a class inherits something which is not
+        a class or a type.
+        """
+        for base in node.bases:
+            ancestor = safe_infer(base)
+            if ancestor in (astroid.YES, None):
+                continue
+            if (isinstance(ancestor, astroid.Instance) and
+                    ancestor.is_subtype_of('%s.type' % (BUILTINS,))):
+                continue
+
+            if (not isinstance(ancestor, astroid.ClassDef) or
+                    _is_invalid_base_class(ancestor)):
+                self.add_message('inherit-non-class',
+                                 args=base.as_string(), node=node)
+
+    @check_messages('access-member-before-definition',
+                    'attribute-defined-outside-init')
+    def leave_classdef(self, cnode):
+        """close a class node:
+        check that instance attributes are defined in __init__ and check
+        access to existent members
+        """
+        # check access to existent members on non metaclass classes
+        ignore_mixins = get_global_option(self, 'ignore-mixin-members',
+                                          default=True)
+        if ignore_mixins and cnode.name[-5:].lower() == 'mixin':
+            # We are in a mixin class. No need to try to figure out if
+            # something is missing, since it is most likely that it will
+            # miss.
+            return
+
+        accessed = self._accessed.pop()
+        if cnode.type != 'metaclass':
+            self._check_accessed_members(cnode, accessed)
+        # checks attributes are defined in an allowed method such as __init__
+        if not self.linter.is_message_enabled('attribute-defined-outside-init'):
+            return
+        defining_methods = self.config.defining_attr_methods
+        current_module = cnode.root()
+        for attr, nodes in six.iteritems(cnode.instance_attrs):
+            # skip nodes which are not in the current module and it may screw up
+            # the output, while it's not worth it
+            nodes = [n for n in nodes if not
+                     isinstance(n.statement(), (astroid.Delete, astroid.AugAssign))
+                     and n.root() is current_module]
+            if not nodes:
+                continue # error detected by typechecking
+            # check if any method attr is defined in is a defining method
+            if any(node.frame().name in defining_methods
+                   for node in nodes):
+                continue
+
+            # check attribute is defined in a parent's __init__
+            for parent in cnode.instance_attr_ancestors(attr):
+                attr_defined = False
+                # check if any parent method attr is defined in is a defining method
+                for node in parent.instance_attrs[attr]:
+                    if node.frame().name in defining_methods:
+                        attr_defined = True
+                if attr_defined:
+                    # we're done :)
+                    break
+            else:
+                # check attribute is defined as a class attribute
+                try:
+                    cnode.local_attr(attr)
+                except astroid.NotFoundError:
+                    for node in nodes:
+                        if node.frame().name not in defining_methods:
+                            # If the attribute was set by a callfunc in any
+                            # of the defining methods, then don't emit
+                            # the warning.
+                            if _called_in_methods(node.frame(), cnode,
+                                                  defining_methods):
+                                continue
+                            self.add_message('attribute-defined-outside-init',
+                                             args=attr, node=node)
+
+    def visit_functiondef(self, node):
+        """check method arguments, overriding"""
+        # ignore actual functions
+        if not node.is_method():
+            return
+        klass = node.parent.frame()
+        self._meth_could_be_func = True
+        # check first argument is self if this is actually a method
+        self._check_first_arg_for_type(node, klass.type == 'metaclass')
+        if node.name == '__init__':
+            self._check_init(node)
+            return
+        # check signature if the method overloads inherited method
+        for overridden in klass.local_attr_ancestors(node.name):
+            # get astroid for the searched method
+            try:
+                meth_node = overridden[node.name]
+            except KeyError:
+                # we have found the method but it's not in the local
+                # dictionary.
+                # This may happen with astroid build from living objects
+                continue
+            if not isinstance(meth_node, astroid.FunctionDef):
+                continue
+            self._check_signature(node, meth_node, 'overridden', klass)
+            break
+        if node.decorators:
+            for decorator in node.decorators.nodes:
+                if isinstance(decorator, astroid.Attribute) and \
+                        decorator.attrname in ('getter', 'setter', 'deleter'):
+                    # attribute affectation will call this method, not hiding it
+                    return
+                if isinstance(decorator, astroid.Name) and decorator.name == 'property':
+                    # attribute affectation will either call a setter or raise
+                    # an attribute error, anyway not hiding the function
+                    return
+        # check if the method is hidden by an attribute
+        try:
+            overridden = klass.instance_attr(node.name)[0] # XXX
+            overridden_frame = overridden.frame()
+            if (isinstance(overridden_frame, astroid.FunctionDef)
+                    and overridden_frame.type == 'method'):
+                overridden_frame = overridden_frame.parent.frame()
+            if (isinstance(overridden_frame, astroid.ClassDef)
+                    and klass.is_subtype_of(overridden_frame.qname())):
+                args = (overridden.root().name, overridden.fromlineno)
+                self.add_message('method-hidden', args=args, node=node)
+        except astroid.NotFoundError:
+            pass
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    def _check_slots(self, node):
+        if '__slots__' not in node.locals:
+            return
+        for slots in node.igetattr('__slots__'):
+            # check if __slots__ is a valid type
+            for meth in ITER_METHODS:
+                try:
+                    slots.getattr(meth)
+                    break
+                except astroid.NotFoundError:
+                    continue
+            else:
+                self.add_message('invalid-slots', node=node)
+                continue
+
+            if isinstance(slots, astroid.Const):
+                # a string, ignore the following checks
+                continue
+            if not hasattr(slots, 'itered'):
+                # we can't obtain the values, maybe a .deque?
+                continue
+
+            if isinstance(slots, astroid.Dict):
+                values = [item[0] for item in slots.items]
+            else:
+                values = slots.itered()
+            if values is astroid.YES:
+                return
+
+            for elt in values:
+                try:
+                    self._check_slots_elt(elt)
+                except astroid.InferenceError:
+                    continue
+
+    def _check_slots_elt(self, elt):
+        for infered in elt.infer():
+            if infered is astroid.YES:
+                continue
+            if (not isinstance(infered, astroid.Const) or
+                    not isinstance(infered.value, six.string_types)):
+                self.add_message('invalid-slots-object',
+                                 args=infered.as_string(),
+                                 node=elt)
+                continue
+            if not infered.value:
+                self.add_message('invalid-slots-object',
+                                 args=infered.as_string(),
+                                 node=elt)
+
+    def leave_functiondef(self, node):
+        """on method node, check if this method couldn't be a function
+
+        ignore class, static and abstract methods, initializer,
+        methods overridden from a parent class.
+        """
+        if node.is_method():
+            if node.args.args is not None:
+                self._first_attrs.pop()
+            if not self.linter.is_message_enabled('no-self-use'):
+                return
+            class_node = node.parent.frame()
+            if (self._meth_could_be_func and node.type == 'method'
+                    and node.name not in PYMETHODS
+                    and not (node.is_abstract() or
+                             overrides_a_method(class_node, node.name) or
+                             decorated_with_property(node) or
+                             (six.PY3 and _has_bare_super_call(node)))):
+                self.add_message('no-self-use', node=node)
+
+    def visit_attribute(self, node):
+        """check if the getattr is an access to a class member
+        if so, register it. Also check for access to protected
+        class member from outside its class (but ignore __special__
+        methods)
+        """
+        attrname = node.attrname
+        # Check self
+        if self.is_first_attr(node):
+            self._accessed[-1][attrname].append(node)
+            return
+        if not self.linter.is_message_enabled('protected-access'):
+            return
+
+        self._check_protected_attribute_access(node)
+
+    def visit_assignattr(self, node):
+        if isinstance(node.assign_type(), astroid.AugAssign) and self.is_first_attr(node):
+            self._accessed[-1][node.attrname].append(node)
+        self._check_in_slots(node)
+
+    def _check_in_slots(self, node):
+        """ Check that the given assattr node
+        is defined in the class slots.
+        """
+        infered = safe_infer(node.expr)
+        if infered and isinstance(infered, astroid.Instance):
+            klass = infered._proxied
+            if '__slots__' not in klass.locals or not klass.newstyle:
+                return
+
+            slots = klass.slots()
+            if slots is None:
+                return
+            # If any ancestor doesn't use slots, the slots
+            # defined for this class are superfluous.
+            if any('__slots__' not in ancestor.locals and
+                   ancestor.name != 'object'
+                   for ancestor in klass.ancestors()):
+                return
+
+            if not any(slot.value == node.attrname for slot in slots):
+                # If we have a '__dict__' in slots, then
+                # assigning any name is valid.
+                if not any(slot.value == '__dict__' for slot in slots):
+                    if _is_attribute_property(node.attrname, klass):
+                        # Properties circumvent the slots mechanism,
+                        # so we should not emit a warning for them.
+                        return
+                    if (node.attrname in klass.locals
+                            and _has_data_descriptor(klass, node.attrname)):
+                        # Descriptors circumvent the slots mechanism as well.
+                        return
+                    self.add_message('assigning-non-slot',
+                                     args=(node.attrname, ), node=node)
+
+    @check_messages('protected-access', 'no-classmethod-decorator',
+                    'no-staticmethod-decorator')
+    def visit_assign(self, assign_node):
+        self._check_classmethod_declaration(assign_node)
+        node = assign_node.targets[0]
+        if not isinstance(node, astroid.AssignAttr):
+            return
+
+        if self.is_first_attr(node):
+            return
+        self._check_protected_attribute_access(node)
+
+    def _check_classmethod_declaration(self, node):
+        """Checks for uses of classmethod() or staticmethod()
+
+        When a @classmethod or @staticmethod decorator should be used instead.
+        A message will be emitted only if the assignment is at a class scope
+        and only if the classmethod's argument belongs to the class where it
+        is defined.
+        `node` is an assign node.
+        """
+        if not isinstance(node.value, astroid.Call):
+            return
+
+        # check the function called is "classmethod" or "staticmethod"
+        func = node.value.func
+        if (not isinstance(func, astroid.Name) or
+                func.name not in ('classmethod', 'staticmethod')):
+            return
+
+        msg = ('no-classmethod-decorator' if func.name == 'classmethod' else
+               'no-staticmethod-decorator')
+        # assignment must be at a class scope
+        parent_class = node.scope()
+        if not isinstance(parent_class, astroid.ClassDef):
+            return
+
+        # Check if the arg passed to classmethod is a class member
+        classmeth_arg = node.value.args[0]
+        if not isinstance(classmeth_arg, astroid.Name):
+            return
+
+        method_name = classmeth_arg.name
+        if any(method_name == member.name
+               for member in parent_class.mymethods()):
+            self.add_message(msg, node=node.targets[0])
+
+    def _check_protected_attribute_access(self, node):
+        '''Given an attribute access node (set or get), check if attribute
+        access is legitimate. Call _check_first_attr with node before calling
+        this method. Valid cases are:
+        * self._attr in a method or cls._attr in a classmethod. Checked by
+        _check_first_attr.
+        * Klass._attr inside "Klass" class.
+        * Klass2._attr inside "Klass" class when Klass2 is a base class of
+            Klass.
+        '''
+        attrname = node.attrname
+
+        if (is_attr_protected(attrname) and
+                attrname not in self.config.exclude_protected):
+
+            klass = node_frame_class(node)
+
+            # XXX infer to be more safe and less dirty ??
+            # in classes, check we are not getting a parent method
+            # through the class object or through super
+            callee = node.expr.as_string()
+
+            # We are not in a class, no remaining valid case
+            if klass is None:
+                self.add_message('protected-access', node=node, args=attrname)
+                return
+
+            # If the expression begins with a call to super, that's ok.
+            if isinstance(node.expr, astroid.Call) and \
+               isinstance(node.expr.func, astroid.Name) and \
+               node.expr.func.name == 'super':
+                return
+
+            # We are in a class, one remaining valid cases, Klass._attr inside
+            # Klass
+            if not (callee == klass.name or callee in klass.basenames):
+                # Detect property assignments in the body of the class.
+                # This is acceptable:
+                #
+                # class A:
+                #     b = property(lambda: self._b)
+
+                stmt = node.parent.statement()
+                if (isinstance(stmt, astroid.Assign)
+                        and len(stmt.targets) == 1
+                        and isinstance(stmt.targets[0], astroid.AssignName)):
+                    name = stmt.targets[0].name
+                    if _is_attribute_property(name, klass):
+                        return
+
+                self.add_message('protected-access', node=node, args=attrname)
+
+    def visit_name(self, node):
+        """check if the name handle an access to a class member
+        if so, register it
+        """
+        if self._first_attrs and (node.name == self._first_attrs[-1] or
+                                  not self._first_attrs[-1]):
+            self._meth_could_be_func = False
+
+    def _check_accessed_members(self, node, accessed):
+        """check that accessed members are defined"""
+        # XXX refactor, probably much simpler now that E0201 is in type checker
+        excs = ('AttributeError', 'Exception', 'BaseException')
+        for attr, nodes in six.iteritems(accessed):
+            try:
+                # is it a class attribute ?
+                node.local_attr(attr)
+                # yes, stop here
+                continue
+            except astroid.NotFoundError:
+                pass
+            # is it an instance attribute of a parent class ?
+            try:
+                next(node.instance_attr_ancestors(attr))
+                # yes, stop here
+                continue
+            except StopIteration:
+                pass
+            # is it an instance attribute ?
+            try:
+                defstmts = node.instance_attr(attr)
+            except astroid.NotFoundError:
+                pass
+            else:
+                # filter out augment assignment nodes
+                defstmts = [stmt for stmt in defstmts if stmt not in nodes]
+                if not defstmts:
+                    # only augment assignment for this node, no-member should be
+                    # triggered by the typecheck checker
+                    continue
+                # filter defstmts to only pick the first one when there are
+                # several assignments in the same scope
+                scope = defstmts[0].scope()
+                defstmts = [stmt for i, stmt in enumerate(defstmts)
+                            if i == 0 or stmt.scope() is not scope]
+                # if there are still more than one, don't attempt to be smarter
+                # than we can be
+                if len(defstmts) == 1:
+                    defstmt = defstmts[0]
+                    # check that if the node is accessed in the same method as
+                    # it's defined, it's accessed after the initial assignment
+                    frame = defstmt.frame()
+                    lno = defstmt.fromlineno
+                    for _node in nodes:
+                        if _node.frame() is frame and _node.fromlineno < lno \
+                           and not astroid.are_exclusive(_node.statement(), defstmt, excs):
+                            self.add_message('access-member-before-definition',
+                                             node=_node, args=(attr, lno))
+
+    def _check_first_arg_for_type(self, node, metaclass=0):
+        """check the name of first argument, expect:
+
+        * 'self' for a regular method
+        * 'cls' for a class method or a metaclass regular method (actually
+          valid-classmethod-first-arg value)
+        * 'mcs' for a metaclass class method (actually
+          valid-metaclass-classmethod-first-arg)
+        * not one of the above for a static method
+        """
+        # don't care about functions with unknown argument (builtins)
+        if node.args.args is None:
+            return
+        first_arg = node.args.args and node.argnames()[0]
+        self._first_attrs.append(first_arg)
+        first = self._first_attrs[-1]
+        # static method
+        if node.type == 'staticmethod':
+            if (first_arg == 'self' or
+                    first_arg in self.config.valid_classmethod_first_arg or
+                    first_arg in self.config.valid_metaclass_classmethod_first_arg):
+                self.add_message('bad-staticmethod-argument', args=first, node=node)
+                return
+            self._first_attrs[-1] = None
+        # class / regular method with no args
+        elif not node.args.args:
+            self.add_message('no-method-argument', node=node)
+        # metaclass
+        elif metaclass:
+            # metaclass __new__ or classmethod
+            if node.type == 'classmethod':
+                self._check_first_arg_config(
+                    first,
+                    self.config.valid_metaclass_classmethod_first_arg, node,
+                    'bad-mcs-classmethod-argument', node.name)
+            # metaclass regular method
+            else:
+                self._check_first_arg_config(
+                    first,
+                    self.config.valid_classmethod_first_arg, node,
+                    'bad-mcs-method-argument',
+                    node.name)
+        # regular class
+        else:
+            # class method
+            if node.type == 'classmethod':
+                self._check_first_arg_config(
+                    first,
+                    self.config.valid_classmethod_first_arg, node,
+                    'bad-classmethod-argument',
+                    node.name)
+            # regular method without self as argument
+            elif first != 'self':
+                self.add_message('no-self-argument', node=node)
+
+    def _check_first_arg_config(self, first, config, node, message,
+                                method_name):
+        if first not in config:
+            if len(config) == 1:
+                valid = repr(config[0])
+            else:
+                valid = ', '.join(repr(v) for v in config[:-1])
+                valid = '%s or %r' % (valid, config[-1])
+            self.add_message(message, args=(method_name, valid), node=node)
+
+    def _check_bases_classes(self, node):
+        """check that the given class node implements abstract methods from
+        base classes
+        """
+        def is_abstract(method):
+            return method.is_abstract(pass_is_abstract=False)
+
+        # check if this class abstract
+        if class_is_abstract(node):
+            return
+
+        methods = sorted(
+            unimplemented_abstract_methods(node, is_abstract).items(),
+            key=lambda item: item[0],
+        )
+        for name, method in methods:
+            owner = method.parent.frame()
+            if owner is node:
+                continue
+            # owner is not this class, it must be a parent class
+            # check that the ancestor's method is not abstract
+            if name in node.locals:
+                # it is redefined as an attribute or with a descriptor
+                continue
+            self.add_message('abstract-method', node=node,
+                             args=(name, owner.name))
+
+    def _check_init(self, node):
+        """check that the __init__ method call super or ancestors'__init__
+        method
+        """
+        if (not self.linter.is_message_enabled('super-init-not-called') and
+                not self.linter.is_message_enabled('non-parent-init-called')):
+            return
+        klass_node = node.parent.frame()
+        to_call = _ancestors_to_call(klass_node)
+        not_called_yet = dict(to_call)
+        for stmt in node.nodes_of_class(astroid.Call):
+            expr = stmt.func
+            if not isinstance(expr, astroid.Attribute) \
+                   or expr.attrname != '__init__':
+                continue
+            # skip the test if using super
+            if isinstance(expr.expr, astroid.Call) and \
+                   isinstance(expr.expr.func, astroid.Name) and \
+               expr.expr.func.name == 'super':
+                return
+            try:
+                for klass in expr.expr.infer():
+                    if klass is astroid.YES:
+                        continue
+                    # The infered klass can be super(), which was
+                    # assigned to a variable and the `__init__`
+                    # was called later.
+                    #
+                    # base = super()
+                    # base.__init__(...)
+
+                    if (isinstance(klass, astroid.Instance) and
+                            isinstance(klass._proxied, astroid.ClassDef) and
+                            is_builtin_object(klass._proxied) and
+                            klass._proxied.name == 'super'):
+                        return
+                    elif isinstance(klass, objects.Super):
+                        return
+                    try:
+                        del not_called_yet[klass]
+                    except KeyError:
+                        if klass not in to_call:
+                            self.add_message('non-parent-init-called',
+                                             node=expr, args=klass.name)
+            except astroid.InferenceError:
+                continue
+        for klass, method in six.iteritems(not_called_yet):
+            if klass.name == 'object' or method.parent.name == 'object':
+                continue
+            self.add_message('super-init-not-called', args=klass.name, node=node)
+
+    def _check_signature(self, method1, refmethod, class_type, cls):
+        """check that the signature of the two given methods match
+        """
+        if not (isinstance(method1, astroid.FunctionDef)
+                and isinstance(refmethod, astroid.FunctionDef)):
+            self.add_message('method-check-failed',
+                             args=(method1, refmethod), node=method1)
+            return
+
+        instance = cls.instanciate_class()
+        method1 = function_to_method(method1, instance)
+        refmethod = function_to_method(refmethod, instance)
+
+        # Don't care about functions with unknown argument (builtins).
+        if method1.args.args is None or refmethod.args.args is None:
+            return
+        # If we use *args, **kwargs, skip the below checks.
+        if method1.args.vararg or method1.args.kwarg:
+            return
+        # Ignore private to class methods.
+        if is_attr_private(method1.name):
+            return
+        # Ignore setters, they have an implicit extra argument,
+        # which shouldn't be taken in consideration.
+        if method1.decorators:
+            for decorator in method1.decorators.nodes:
+                if (isinstance(decorator, astroid.Attribute) and
+                        decorator.attrname == 'setter'):
+                    return
+
+        method1_args = _get_method_args(method1)
+        refmethod_args = _get_method_args(refmethod)
+        if method1_args != refmethod_args:
+            self.add_message('arguments-differ',
+                             args=(class_type, method1.name),
+                             node=method1)
+        elif len(method1.args.defaults) < len(refmethod.args.defaults):
+            self.add_message('signature-differs',
+                             args=(class_type, method1.name),
+                             node=method1)
+
+    def is_first_attr(self, node):
+        """Check that attribute lookup name use first attribute variable name
+        (self for method, cls for classmethod and mcs for metaclass).
+        """
+        return self._first_attrs and isinstance(node.expr, astroid.Name) and \
+                   node.expr.name == self._first_attrs[-1]
+
+
+class SpecialMethodsChecker(BaseChecker):
+    """Checker which verifies that special methods
+    are implemented correctly.
+    """
+    __implements__ = (IAstroidChecker, )
+    name = 'classes'
+    msgs = {
+        'E0301': ('__iter__ returns non-iterator',
+                  'non-iterator-returned',
+                  'Used when an __iter__ method returns something which is not an '
+                  'iterable (i.e. has no `%s` method)' % NEXT_METHOD,
+                  {'old_names': [('W0234', 'non-iterator-returned'),
+                                 ('E0234', 'non-iterator-returned')]}),
+        'E0302': ('The special method %r expects %s param(s), %d %s given',
+                  'unexpected-special-method-signature',
+                  'Emitted when a special method was defined with an '
+                  'invalid number of parameters. If it has too few or '
+                  'too many, it might not work at all.',
+                  {'old_names': [('E0235', 'bad-context-manager')]}),
+    }
+    priority = -2
+
+    @check_messages('unexpected-special-method-signature',
+                    'non-iterator-returned')
+    def visit_functiondef(self, node):
+        if not node.is_method():
+            return
+        if node.name == '__iter__':
+            self._check_iter(node)
+        if node.name in PYMETHODS:
+            self._check_unexpected_method_signature(node)
+
+    visit_asyncfunctiondef = visit_functiondef
+
+    def _check_unexpected_method_signature(self, node):
+        expected_params = SPECIAL_METHODS_PARAMS[node.name]
+
+        if expected_params is None:
+            # This can support a variable number of parameters.
+            return
+        if not len(node.args.args) and not node.args.vararg:
+            # Method has no parameter, will be catched
+            # by no-method-argument.
+            return
+
+        if decorated_with(node, [BUILTINS + ".staticmethod"]):
+            # We expect to not take in consideration self.
+            all_args = node.args.args
+        else:
+            all_args = node.args.args[1:]
+        mandatory = len(all_args) - len(node.args.defaults)
+        optional = len(node.args.defaults)
+        current_params = mandatory + optional
+
+        if isinstance(expected_params, tuple):
+            # The expected number of parameters can be any value from this
+            # tuple, although the user should implement the method
+            # to take all of them in consideration.
+            emit = mandatory not in expected_params
+            expected_params = "between %d or %d" % expected_params
+        else:
+            # If the number of mandatory parameters doesn't
+            # suffice, the expected parameters for this
+            # function will be deduced from the optional
+            # parameters.
+            rest = expected_params - mandatory
+            if rest == 0:
+                emit = False
+            elif rest < 0:
+                emit = True
+            elif rest > 0:
+                emit = not ((optional - rest) >= 0 or node.args.vararg)
+
+        if emit:
+            verb = "was" if current_params <= 1 else "were"
+            self.add_message('unexpected-special-method-signature',
+                             args=(node.name, expected_params, current_params, verb),
+                             node=node)
+
+    @staticmethod
+    def _is_iterator(node):
+        if node is astroid.YES:
+            # Just ignore YES objects.
+            return True
+        if isinstance(node, Generator):
+            # Generators can be itered.
+            return True
+
+        if isinstance(node, astroid.Instance):
+            try:
+                node.local_attr(NEXT_METHOD)
+                return True
+            except astroid.NotFoundError:
+                pass
+        elif isinstance(node, astroid.ClassDef):
+            metaclass = node.metaclass()
+            if metaclass and isinstance(metaclass, astroid.ClassDef):
+                try:
+                    metaclass.local_attr(NEXT_METHOD)
+                    return True
+                except astroid.NotFoundError:
+                    pass
+        return False
+
+    def _check_iter(self, node):
+        infered = _safe_infer_call_result(node, node)
+        if infered is not None:
+            if not self._is_iterator(infered):
+                self.add_message('non-iterator-returned', node=node)
+
+
+def _ancestors_to_call(klass_node, method='__init__'):
+    """return a dictionary where keys are the list of base classes providing
+    the queried method, and so that should/may be called from the method node
+    """
+    to_call = {}
+    for base_node in klass_node.ancestors(recurs=False):
+        try:
+            to_call[base_node] = next(base_node.igetattr(method))
+        except astroid.InferenceError:
+            continue
+    return to_call
+
+
+def node_method(node, method_name):
+    """get astroid for <method_name> on the given class node, ensuring it
+    is a Function node
+    """
+    for node_attr in node.local_attr(method_name):
+        if isinstance(node_attr, astroid.Function):
+            return node_attr
+    raise astroid.NotFoundError(method_name)
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(ClassChecker(linter))
+    linter.register_checker(SpecialMethodsChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/imports.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/imports.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/imports.py	(revision 1126)
@@ -0,0 +1,654 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""imports checkers for Python code"""
+
+import collections
+from distutils import sysconfig
+import os
+import sys
+
+import six
+
+import astroid
+from astroid import are_exclusive
+from astroid.modutils import (get_module_part, is_standard_module,
+                              file_from_modpath)
+
+from pylint.interfaces import IAstroidChecker
+from pylint.utils import EmptyReport, get_global_option
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import check_messages, node_ignores_exception
+from pylint.graph import get_cycles, DotBackend
+from pylint.reporters.ureports.nodes import VerbatimText, Paragraph
+
+
+def _qualified_names(modname):
+    """Split the names of the given module into subparts
+
+    For example,
+        _qualified_names('pylint.checkers.ImportsChecker')
+    returns
+        ['pylint', 'pylint.checkers', 'pylint.checkers.ImportsChecker']
+    """
+    names = modname.split('.')
+    return ['.'.join(names[0:i+1]) for i in range(len(names))]
+
+
+def _get_import_name(importnode, modname):
+    """Get a prepared module name from the given import node
+
+    In the case of relative imports, this will return the
+    absolute qualified module name, which might be useful
+    for debugging. Otherwise, the initial module name
+    is returned unchanged.
+    """
+    if isinstance(importnode, astroid.ImportFrom):
+        if importnode.level:
+            root = importnode.root()
+            if isinstance(root, astroid.Module):
+                modname = root.relative_to_absolute_name(
+                    modname, level=importnode.level)
+    return modname
+
+
+def _get_first_import(node, context, name, base, level):
+    """return the node where [base.]<name> is imported or None if not found
+    """
+    fullname = '%s.%s' % (base, name) if base else name
+
+    first = None
+    found = False
+    for first in context.body:
+        if first is node:
+            continue
+        if first.scope() is node.scope() and first.fromlineno > node.fromlineno:
+            continue
+        if isinstance(first, astroid.Import):
+            if any(fullname == iname[0] for iname in first.names):
+                found = True
+                break
+        elif isinstance(first, astroid.ImportFrom):
+            if level == first.level and any(
+                    fullname == '%s.%s' % (first.modname, iname[0])
+                    for iname in first.names):
+                found = True
+                break
+    if found and not are_exclusive(first, node):
+        return first
+
+# utilities to represents import dependencies as tree and dot graph ###########
+
+def _make_tree_defs(mod_files_list):
+    """get a list of 2-uple (module, list_of_files_which_import_this_module),
+    it will return a dictionary to represent this as a tree
+    """
+    tree_defs = {}
+    for mod, files in mod_files_list:
+        node = (tree_defs, ())
+        for prefix in mod.split('.'):
+            node = node[0].setdefault(prefix, [{}, []])
+        node[1] += files
+    return tree_defs
+
+
+def _repr_tree_defs(data, indent_str=None):
+    """return a string which represents imports as a tree"""
+    lines = []
+    nodes = data.items()
+    for i, (mod, (sub, files)) in enumerate(sorted(nodes, key=lambda x: x[0])):
+        if not files:
+            files = ''
+        else:
+            files = '(%s)' % ','.join(files)
+        if indent_str is None:
+            lines.append('%s %s' % (mod, files))
+            sub_indent_str = '  '
+        else:
+            lines.append(r'%s\-%s %s' % (indent_str, mod, files))
+            if i == len(nodes)-1:
+                sub_indent_str = '%s  ' % indent_str
+            else:
+                sub_indent_str = '%s| ' % indent_str
+        if sub:
+            lines.append(_repr_tree_defs(sub, sub_indent_str))
+    return '\n'.join(lines)
+
+
+def _dependencies_graph(filename, dep_info):
+    """write dependencies as a dot (graphviz) file
+    """
+    done = {}
+    printer = DotBackend(filename[:-4], rankdir='LR')
+    printer.emit('URL="." node[shape="box"]')
+    for modname, dependencies in sorted(six.iteritems(dep_info)):
+        done[modname] = 1
+        printer.emit_node(modname)
+        for modname in dependencies:
+            if modname not in done:
+                done[modname] = 1
+                printer.emit_node(modname)
+    for depmodname, dependencies in sorted(six.iteritems(dep_info)):
+        for modname in dependencies:
+            printer.emit_edge(modname, depmodname)
+    printer.generate(filename)
+
+
+def _make_graph(filename, dep_info, sect, gtype):
+    """generate a dependencies graph and add some information about it in the
+    report's section
+    """
+    _dependencies_graph(filename, dep_info)
+    sect.append(Paragraph('%simports graph has been written to %s'
+                          % (gtype, filename)))
+
+
+# the import checker itself ###################################################
+
+MSGS = {
+    'E0401': ('Unable to import %s',
+              'import-error',
+              'Used when pylint has been unable to import a module.',
+              {'old_names': [('F0401', 'import-error')]}),
+    'R0401': ('Cyclic import (%s)',
+              'cyclic-import',
+              'Used when a cyclic import between two or more modules is \
+              detected.'),
+
+    'W0401': ('Wildcard import %s',
+              'wildcard-import',
+              'Used when `from module import *` is detected.'),
+    'W0402': ('Uses of a deprecated module %r',
+              'deprecated-module',
+              'Used a module marked as deprecated is imported.'),
+    'W0403': ('Relative import %r, should be %r',
+              'relative-import',
+              'Used when an import relative to the package directory is '
+              'detected.',
+              {'maxversion': (3, 0)}),
+    'W0404': ('Reimport %r (imported line %s)',
+              'reimported',
+              'Used when a module is reimported multiple times.'),
+    'W0406': ('Module import itself',
+              'import-self',
+              'Used when a module is importing itself.'),
+
+    'W0410': ('__future__ import is not the first non docstring statement',
+              'misplaced-future',
+              'Python 2.5 and greater require __future__ import to be the \
+              first non docstring statement in the module.'),
+
+    'C0410': ('Multiple imports on one line (%s)',
+              'multiple-imports',
+              'Used when import statement importing multiple modules is '
+              'detected.'),
+    'C0411': ('%s comes before %s',
+              'wrong-import-order',
+              'Used when PEP8 import order is not respected (standard imports '
+              'first, then third-party libraries, then local imports)'),
+    'C0412': ('Imports from package %s are not grouped',
+              'ungrouped-imports',
+              'Used when imports are not grouped by packages'),
+    'C0413': ('Import "%s" should be placed at the top of the '
+              'module',
+              'wrong-import-position',
+              'Used when code and imports are mixed'),
+    }
+
+class ImportsChecker(BaseChecker):
+    """checks for
+    * external modules dependencies
+    * relative / wildcard imports
+    * cyclic imports
+    * uses of deprecated modules
+    """
+
+    __implements__ = IAstroidChecker
+
+    name = 'imports'
+    msgs = MSGS
+    priority = -2
+
+    if six.PY2:
+        deprecated_modules = ('regsub', 'TERMIOS', 'Bastion', 'rexec')
+    else:
+        deprecated_modules = ('optparse', )
+    options = (('deprecated-modules',
+                {'default' : deprecated_modules,
+                 'type' : 'csv',
+                 'metavar' : '<modules>',
+                 'help' : 'Deprecated modules which should not be used, \
+separated by a comma'}
+               ),
+               ('import-graph',
+                {'default' : '',
+                 'type' : 'string',
+                 'metavar' : '<file.dot>',
+                 'help' : 'Create a graph of every (i.e. internal and \
+external) dependencies in the given file (report RP0402 must not be disabled)'}
+               ),
+               ('ext-import-graph',
+                {'default' : '',
+                 'type' : 'string',
+                 'metavar' : '<file.dot>',
+                 'help' : 'Create a graph of external dependencies in the \
+given file (report RP0402 must not be disabled)'}
+               ),
+               ('int-import-graph',
+                {'default' : '',
+                 'type' : 'string',
+                 'metavar' : '<file.dot>',
+                 'help' : 'Create a graph of internal dependencies in the \
+given file (report RP0402 must not be disabled)'}
+               ),
+              )
+
+    def __init__(self, linter=None):
+        BaseChecker.__init__(self, linter)
+        self.stats = None
+        self.import_graph = None
+        self._imports_stack = []
+        self._first_non_import_node = None
+        self.__int_dep_info = self.__ext_dep_info = None
+        self.reports = (('RP0401', 'External dependencies',
+                         self._report_external_dependencies),
+                        ('RP0402', 'Modules dependencies graph',
+                         self._report_dependencies_graph),
+                       )
+
+        self._site_packages = self._compute_site_packages()
+
+    @staticmethod
+    def _compute_site_packages():
+        def _normalized_path(path):
+            return os.path.normcase(os.path.abspath(path))
+
+        paths = set()
+        real_prefix = getattr(sys, 'real_prefix', None)
+        for prefix in filter(None, (real_prefix, sys.prefix)):
+            path = sysconfig.get_python_lib(prefix=prefix)
+            path = _normalized_path(path)
+            paths.add(path)
+
+        # Handle Debian's derivatives /usr/local.
+        if os.path.isfile("/etc/debian_version"):
+            for prefix in filter(None, (real_prefix, sys.prefix)):
+                libpython = os.path.join(prefix, "local", "lib",
+                                         "python" + sysconfig.get_python_version(),
+                                         "dist-packages")
+                paths.add(libpython)
+        return paths
+
+    def open(self):
+        """called before visiting project (i.e set of modules)"""
+        self.linter.add_stats(dependencies={})
+        self.linter.add_stats(cycles=[])
+        self.stats = self.linter.stats
+        self.import_graph = collections.defaultdict(set)
+        self._ignored_modules = get_global_option(
+            self, 'ignored-modules', default=[])
+
+    def close(self):
+        """called before visiting project (i.e set of modules)"""
+        # don't try to compute cycles if the associated message is disabled
+        if self.linter.is_message_enabled('cyclic-import'):
+            vertices = list(self.import_graph)
+            for cycle in get_cycles(self.import_graph, vertices=vertices):
+                self.add_message('cyclic-import', args=' -> '.join(cycle))
+
+    @check_messages('wrong-import-position', 'multiple-imports',
+                    'relative-import', 'reimported')
+    def visit_import(self, node):
+        """triggered when an import statement is seen"""
+        self._check_reimport(node)
+
+        modnode = node.root()
+        names = [name for name, _ in node.names]
+        if len(names) >= 2:
+            self.add_message('multiple-imports', args=', '.join(names), node=node)
+
+        for name in names:
+            self._check_deprecated_module(node, name)
+            importedmodnode = self.get_imported_module(node, name)
+            if isinstance(node.scope(), astroid.Module):
+                self._check_position(node)
+                self._record_import(node, importedmodnode)
+
+            if importedmodnode is None:
+                continue
+
+            self._check_relative_import(modnode, node, importedmodnode, name)
+            self._add_imported_module(node, importedmodnode.name)
+
+    @check_messages(*(MSGS.keys()))
+    def visit_importfrom(self, node):
+        """triggered when a from statement is seen"""
+        basename = node.modname
+        self._check_misplaced_future(node)
+        self._check_deprecated_module(node, basename)
+        self._check_wildcard_imports(node)
+        self._check_same_line_imports(node)
+        self._check_reimport(node, basename=basename, level=node.level)
+
+        modnode = node.root()
+        importedmodnode = self.get_imported_module(node, basename)
+        if isinstance(node.scope(), astroid.Module):
+            self._check_position(node)
+            self._record_import(node, importedmodnode)
+        if importedmodnode is None:
+            return
+        self._check_relative_import(modnode, node, importedmodnode, basename)
+
+        for name, _ in node.names:
+            if name != '*':
+                self._add_imported_module(node, '%s.%s' % (importedmodnode.name, name))
+
+    @check_messages('wrong-import-order', 'ungrouped-imports',
+                    'wrong-import-position')
+    def leave_module(self, node):
+        # Check imports are grouped by category (standard, 3rd party, local)
+        std_imports, ext_imports, loc_imports = self._check_imports_order(node)
+
+        # Check imports are grouped by package within a given category
+        met = set()
+        current_package = None
+        for import_node, import_name in std_imports + ext_imports + loc_imports:
+            package, _, _ = import_name.partition('.')
+            if current_package and current_package != package and package in met:
+                self.add_message('ungrouped-imports', node=import_node,
+                                 args=package)
+            current_package = package
+            met.add(package)
+
+        self._imports_stack = []
+        self._first_non_import_node = None
+
+    def visit_if(self, node):
+        # if the node does not contain an import instruction, and if it is the
+        # first node of the module, keep a track of it (all the import positions
+        # of the module will be compared to the position of this first
+        # instruction)
+        if self._first_non_import_node:
+            return
+        if not isinstance(node.parent, astroid.Module):
+            return
+        if any(node.nodes_of_class((astroid.Import, astroid.ImportFrom))):
+            return
+        self._first_non_import_node = node
+
+    visit_tryfinally = visit_tryexcept = visit_assignattr = visit_assign \
+            = visit_ifexp = visit_comprehension = visit_if
+
+    def visit_functiondef(self, node):
+        # If it is the first non import instruction of the module, record it.
+        if self._first_non_import_node:
+            return
+
+        # Check if the node belongs to an `If` or a `Try` block. If they
+        # contain imports, skip recording this node.
+        if not isinstance(node.parent.scope(), astroid.Module):
+            return
+
+        root = node
+        while not isinstance(root.parent, astroid.Module):
+            root = root.parent
+
+        if isinstance(root, (astroid.If, astroid.TryFinally, astroid.TryExcept)):
+            if any(root.nodes_of_class((astroid.Import, astroid.ImportFrom))):
+                return
+
+        self._first_non_import_node = node
+
+    visit_classdef = visit_for = visit_while = visit_functiondef
+
+    def _check_misplaced_future(self, node):
+        basename = node.modname
+        if basename == '__future__':
+            # check if this is the first non-docstring statement in the module
+            prev = node.previous_sibling()
+            if prev:
+                # consecutive future statements are possible
+                if not (isinstance(prev, astroid.ImportFrom)
+                        and prev.modname == '__future__'):
+                    self.add_message('misplaced-future', node=node)
+            return
+
+    def _check_same_line_imports(self, node):
+        # Detect duplicate imports on the same line.
+        names = (name for name, _ in node.names)
+        counter = collections.Counter(names)
+        for name, count in counter.items():
+            if count > 1:
+                self.add_message('reimported', node=node,
+                                 args=(name, node.fromlineno))
+
+    def _check_position(self, node):
+        """Check `node` import or importfrom node position is correct
+
+        Send a message  if `node` comes before another instruction
+        """
+        # if a first non-import instruction has already been encountered,
+        # it means the import comes after it and therefore is not well placed
+        if self._first_non_import_node:
+            self.add_message('wrong-import-position', node=node,
+                             args=node.as_string())
+
+    def _record_import(self, node, importedmodnode):
+        """Record the package `node` imports from"""
+        importedname = importedmodnode.name if importedmodnode else None
+        if not importedname:
+            importedname = node.names[0][0].split('.')[0]
+        self._imports_stack.append((node, importedname))
+
+    @staticmethod
+    def _is_fallback_import(node, imports):
+        imports = [import_node for (import_node, _) in imports]
+        return any(astroid.are_exclusive(import_node, node)
+                   for import_node in imports)
+
+    def _check_imports_order(self, node):
+        """Checks imports of module `node` are grouped by category
+
+        Imports must follow this order: standard, 3rd party, local
+        """
+        extern_imports = []
+        local_imports = []
+        std_imports = []
+        for node, modname in self._imports_stack:
+            package = modname.split('.')[0]
+            if is_standard_module(modname):
+                std_imports.append((node, package))
+                wrong_import = extern_imports or local_imports
+                if not wrong_import:
+                    continue
+                if self._is_fallback_import(node, wrong_import):
+                    continue
+                self.add_message('wrong-import-order', node=node,
+                                 args=('standard import "%s"' % node.as_string(),
+                                       '"%s"' % wrong_import[0][0].as_string()))
+            else:
+                try:
+                    filename = file_from_modpath([package])
+                except ImportError:
+                    continue
+                if not filename:
+                    continue
+
+                filename = os.path.normcase(os.path.abspath(filename))
+                if not any(filename.startswith(path) for path in self._site_packages):
+                    local_imports.append((node, package))
+                    continue
+                extern_imports.append((node, package))
+                if not local_imports:
+                    continue
+                self.add_message('wrong-import-order', node=node,
+                                 args=('external import "%s"' % node.as_string(),
+                                       '"%s"' % local_imports[0][0].as_string()))
+        return std_imports, extern_imports, local_imports
+
+    def get_imported_module(self, importnode, modname):
+        try:
+            return importnode.do_import_module(modname)
+        except astroid.InferenceError as ex:
+            dotted_modname = _get_import_name(importnode, modname)
+            if str(ex) != modname:
+                args = '%r (%s)' % (dotted_modname, ex)
+            else:
+                args = repr(dotted_modname)
+
+            for submodule in _qualified_names(modname):
+                if submodule in self._ignored_modules:
+                    return None
+
+            if not node_ignores_exception(importnode, ImportError):
+                self.add_message("import-error", args=args, node=importnode)
+
+    def _check_relative_import(self, modnode, importnode, importedmodnode,
+                               importedasname):
+        """check relative import. node is either an Import or From node, modname
+        the imported module name.
+        """
+        if not self.linter.is_message_enabled('relative-import'):
+            return
+        if importedmodnode.file is None:
+            return False # built-in module
+        if modnode is importedmodnode:
+            return False # module importing itself
+        if modnode.absolute_import_activated() or getattr(importnode, 'level', None):
+            return False
+        if importedmodnode.name != importedasname:
+            # this must be a relative import...
+            self.add_message('relative-import',
+                             args=(importedasname, importedmodnode.name),
+                             node=importnode)
+
+    def _add_imported_module(self, node, importedmodname):
+        """notify an imported module, used to analyze dependencies"""
+        module_file = node.root().file
+        context_name = node.root().name
+        base = os.path.splitext(os.path.basename(module_file))[0]
+
+        # Determine if we have a `from .something import` in a package's
+        # __init__. This means the module will never be able to import
+        # itself using this condition (the level will be bigger or
+        # if the same module is named as the package, it will be different
+        # anyway).
+        if isinstance(node, astroid.ImportFrom):
+            if node.level and node.level > 0 and base == '__init__':
+                return
+
+        try:
+            importedmodname = get_module_part(importedmodname,
+                                              module_file)
+        except ImportError:
+            pass
+
+        if context_name == importedmodname:
+            self.add_message('import-self', node=node)
+        elif not is_standard_module(importedmodname):
+            # handle dependencies
+            importedmodnames = self.stats['dependencies'].setdefault(
+                importedmodname, set())
+            if context_name not in importedmodnames:
+                importedmodnames.add(context_name)
+            # update import graph
+            mgraph = self.import_graph[context_name]
+            if importedmodname not in mgraph:
+                mgraph.add(importedmodname)
+
+    def _check_deprecated_module(self, node, mod_path):
+        """check if the module is deprecated"""
+        for mod_name in self.config.deprecated_modules:
+            if mod_path == mod_name or mod_path.startswith(mod_name + '.'):
+                self.add_message('deprecated-module', node=node, args=mod_path)
+
+    def _check_reimport(self, node, basename=None, level=None):
+        """check if the import is necessary (i.e. not already done)"""
+        if not self.linter.is_message_enabled('reimported'):
+            return
+
+        frame = node.frame()
+        root = node.root()
+        contexts = [(frame, level)]
+        if root is not frame:
+            contexts.append((root, None))
+
+        for context, level in contexts:
+            for name, _ in node.names:
+                first = _get_first_import(node, context, name, basename, level)
+                if first is not None:
+                    self.add_message('reimported', node=node,
+                                     args=(name, first.fromlineno))
+
+    def _report_external_dependencies(self, sect, _, dummy):
+        """return a verbatim layout for displaying dependencies"""
+        dep_info = _make_tree_defs(six.iteritems(self._external_dependencies_info()))
+        if not dep_info:
+            raise EmptyReport()
+        tree_str = _repr_tree_defs(dep_info)
+        sect.append(VerbatimText(tree_str))
+
+    def _report_dependencies_graph(self, sect, _, dummy):
+        """write dependencies as a dot (graphviz) file"""
+        dep_info = self.stats['dependencies']
+        if not dep_info or not (self.config.import_graph
+                                or self.config.ext_import_graph
+                                or self.config.int_import_graph):
+            raise EmptyReport()
+        filename = self.config.import_graph
+        if filename:
+            _make_graph(filename, dep_info, sect, '')
+        filename = self.config.ext_import_graph
+        if filename:
+            _make_graph(filename, self._external_dependencies_info(),
+                        sect, 'external ')
+        filename = self.config.int_import_graph
+        if filename:
+            _make_graph(filename, self._internal_dependencies_info(),
+                        sect, 'internal ')
+
+    def _external_dependencies_info(self):
+        """return cached external dependencies information or build and
+        cache them
+        """
+        if self.__ext_dep_info is None:
+            package = self.linter.current_name
+            self.__ext_dep_info = result = {}
+            for importee, importers in six.iteritems(self.stats['dependencies']):
+                if not importee.startswith(package):
+                    result[importee] = importers
+        return self.__ext_dep_info
+
+    def _internal_dependencies_info(self):
+        """return cached internal dependencies information or build and
+        cache them
+        """
+        if self.__int_dep_info is None:
+            package = self.linter.current_name
+            self.__int_dep_info = result = {}
+            for importee, importers in six.iteritems(self.stats['dependencies']):
+                if importee.startswith(package):
+                    result[importee] = importers
+        return self.__int_dep_info
+
+    def _check_wildcard_imports(self, node):
+        for name, _ in node.names:
+            if name == '*':
+                self.add_message('wildcard-import', args=node.modname, node=node)
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(ImportsChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/__init__.py	(revision 1126)
@@ -0,0 +1,123 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""utilities methods and classes for checkers
+
+Base id of standard checkers (used in msg and report ids):
+01: base
+02: classes
+03: format
+04: import
+05: misc
+06: variables
+07: exceptions
+08: similar
+09: design_analysis
+10: newstyle
+11: typecheck
+12: logging
+13: string_format
+14: string_constant
+15: stdlib
+16: python3
+17-50: not yet used: reserved for future internal checkers.
+51-99: perhaps used: reserved for external checkers
+
+The raw_metrics checker has no number associated since it doesn't emit any
+messages nor reports. XXX not true, emit a 07 report !
+
+"""
+
+import sys
+import tokenize
+import warnings
+
+from pylint.config import OptionsProviderMixIn
+from pylint.reporters import diff_string
+from pylint.utils import register_plugins
+from pylint.interfaces import UNDEFINED
+
+
+def table_lines_from_stats(stats, old_stats, columns):
+    """get values listed in <columns> from <stats> and <old_stats>,
+    and return a formated list of values, designed to be given to a
+    ureport.Table object
+    """
+    lines = []
+    for m_type in columns:
+        new = stats[m_type]
+        format = str # pylint: disable=redefined-builtin
+        if isinstance(new, float):
+            format = lambda num: '%.3f' % num
+        old = old_stats.get(m_type)
+        if old is not None:
+            diff_str = diff_string(old, new)
+            old = format(old)
+        else:
+            old, diff_str = 'NC', 'NC'
+        lines += (m_type.replace('_', ' '), format(new), old, diff_str)
+    return lines
+
+
+class BaseChecker(OptionsProviderMixIn):
+    """base class for checkers"""
+    # checker name (you may reuse an existing one)
+    name = None
+    # options level (0 will be displaying in --help, 1 in --long-help)
+    level = 1
+    # ordered list of options to control the ckecker behaviour
+    options = ()
+    # messages issued by this checker
+    msgs = {}
+    # reports issued by this checker
+    reports = ()
+    # mark this checker as enabled or not.
+    enabled = True
+
+    def __init__(self, linter=None):
+        """checker instances should have the linter as argument
+
+        linter is an object implementing ILinter
+        """
+        self.name = self.name.lower()
+        OptionsProviderMixIn.__init__(self)
+        self.linter = linter
+
+    def add_message(self, msg_id, line=None, node=None, args=None, confidence=UNDEFINED):
+        """add a message of a given type"""
+        self.linter.add_message(msg_id, line, node, args, confidence)
+
+    # dummy methods implementing the IChecker interface
+
+    def open(self):
+        """called before visiting project (i.e set of modules)"""
+
+    def close(self):
+        """called after visiting project (i.e set of modules)"""
+
+
+class BaseTokenChecker(BaseChecker):
+    """Base class for checkers that want to have access to the token stream."""
+
+    def process_tokens(self, tokens):
+        """Should be overridden by subclasses."""
+        raise NotImplementedError()
+
+
+def initialize(linter):
+    """initialize linter with checkers in this package """
+    register_plugins(linter, __path__[0])
+
+__all__ = ('BaseChecker', 'initialize')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/utils.py	(revision 1126)
@@ -0,0 +1,744 @@
+# pylint: disable=W0611
+#
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""some functions that may be useful for various checkers
+"""
+import functools
+import re
+import sys
+import string
+import warnings
+
+import six
+from six.moves import map, builtins # pylint: disable=redefined-builtin
+
+import astroid
+from astroid import scoped_nodes
+
+BUILTINS_NAME = builtins.__name__
+COMP_NODE_TYPES = (astroid.ListComp, astroid.SetComp,
+                   astroid.DictComp, astroid.GeneratorExp)
+PY3K = sys.version_info[0] == 3
+
+if not PY3K:
+    EXCEPTIONS_MODULE = "exceptions"
+else:
+    EXCEPTIONS_MODULE = "builtins"
+ABC_METHODS = set(('abc.abstractproperty', 'abc.abstractmethod',
+                   'abc.abstractclassmethod', 'abc.abstractstaticmethod'))
+ITER_METHOD = '__iter__'
+NEXT_METHOD = 'next' if six.PY2 else '__next__'
+GETITEM_METHOD = '__getitem__'
+CONTAINS_METHOD = '__contains__'
+KEYS_METHOD = 'keys'
+
+# Dictionary which maps the number of expected parameters a
+# special method can have to a set of special methods.
+# The following keys are used to denote the parameters restrictions:
+#
+# * None: variable number of parameters
+# * number: exactly that number of parameters
+# * tuple: this are the odd ones. Basically it means that the function
+#          can work with any number of arguments from that tuple,
+#          although it's best to implement it in order to accept
+#          all of them.
+_SPECIAL_METHODS_PARAMS = {
+    None: ('__new__', '__init__', '__call__'),
+
+    0: ('__del__', '__repr__', '__str__', '__bytes__', '__hash__', '__bool__',
+        '__dir__', '__len__', '__length_hint__', '__iter__', '__reversed__',
+        '__neg__', '__pos__', '__abs__', '__invert__', '__complex__', '__int__',
+        '__float__', '__neg__', '__pos__', '__abs__', '__complex__', '__int__',
+        '__float__', '__index__', '__enter__', '__aenter__', '__getnewargs_ex__',
+        '__getnewargs__', '__getstate__', '__reduce__', '__copy__',
+        '__unicode__', '__nonzero__', '__await__', '__aiter__', '__anext__'),
+
+    1: ('__format__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__',
+        '__ge__', '__getattr__', '__getattribute__', '__delattr__',
+        '__delete__', '__instancecheck__', '__subclasscheck__',
+        '__getitem__', '__missing__', '__delitem__', '__contains__',
+        '__add__', '__sub__', '__mul__', '__truediv__', '__floordiv__',
+        '__mod__', '__divmod__', '__lshift__', '__rshift__', '__and__',
+        '__xor__', '__or__', '__radd__', '__rsub__', '__rmul__', '__rtruediv__',
+        '__rmod__', '__rdivmod__', '__rpow__', '__rlshift__', '__rrshift__',
+        '__rand__', '__rxor__', '__ror__', '__iadd__', '__isub__', '__imul__',
+        '__itruediv__', '__ifloordiv__', '__imod__', '__ilshift__',
+        '__irshift__', '__iand__', '__ixor__', '__ior__', '__ipow__',
+        '__setstate__', '__reduce_ex__', '__deepcopy__', '__cmp__',
+        '__matmul__', '__rmatmul__'),
+
+    2: ('__setattr__', '__get__', '__set__', '__setitem__'),
+
+    3: ('__exit__', '__aexit__'),
+
+    (0, 1): ('__round__', ),
+}
+
+SPECIAL_METHODS_PARAMS = {
+    name: params
+    for params, methods in _SPECIAL_METHODS_PARAMS.items()
+    for name in methods
+}
+PYMETHODS = set(SPECIAL_METHODS_PARAMS)
+
+
+class NoSuchArgumentError(Exception):
+    pass
+
+def is_inside_except(node):
+    """Returns true if node is inside the name of an except handler."""
+    current = node
+    while current and not isinstance(current.parent, astroid.ExceptHandler):
+        current = current.parent
+
+    return current and current is current.parent.name
+
+
+def get_all_elements(node):
+    """Recursively returns all atoms in nested lists and tuples."""
+    if isinstance(node, (astroid.Tuple, astroid.List)):
+        for child in node.elts:
+            for e in get_all_elements(child):
+                yield e
+    else:
+        yield node
+
+
+def clobber_in_except(node):
+    """Checks if an assignment node in an except handler clobbers an existing
+    variable.
+
+    Returns (True, args for W0623) if assignment clobbers an existing variable,
+    (False, None) otherwise.
+    """
+    if isinstance(node, astroid.AssignAttr):
+        return (True, (node.attrname, 'object %r' % (node.expr.as_string(),)))
+    elif isinstance(node, astroid.AssignName):
+        name = node.name
+        if is_builtin(name):
+            return (True, (name, 'builtins'))
+        else:
+            stmts = node.lookup(name)[1]
+            if (stmts and not isinstance(stmts[0].assign_type(),
+                                         (astroid.Assign, astroid.AugAssign,
+                                          astroid.ExceptHandler))):
+                return (True, (name, 'outer scope (line %s)' % stmts[0].fromlineno))
+    return (False, None)
+
+
+def is_super(node):
+    """return True if the node is referencing the "super" builtin function
+    """
+    if getattr(node, 'name', None) == 'super' and \
+           node.root().name == BUILTINS_NAME:
+        return True
+    return False
+
+def is_error(node):
+    """return true if the function does nothing but raising an exception"""
+    for child_node in node.get_children():
+        if isinstance(child_node, astroid.Raise):
+            return True
+        return False
+
+def is_raising(body):
+    """return true if the given statement node raise an exception"""
+    for node in body:
+        if isinstance(node, astroid.Raise):
+            return True
+    return False
+
+builtins = builtins.__dict__.copy()
+SPECIAL_BUILTINS = ('__builtins__',) # '__path__', '__file__')
+
+def is_builtin_object(node):
+    """Returns True if the given node is an object from the __builtin__ module."""
+    return node and node.root().name == BUILTINS_NAME
+
+def is_builtin(name):
+    """return true if <name> could be considered as a builtin defined by python
+    """
+    return name in builtins or name in SPECIAL_BUILTINS
+
+def is_defined_before(var_node):
+    """return True if the variable node is defined by a parent node (list,
+    set, dict, or generator comprehension, lambda) or in a previous sibling
+    node on the same line (statement_defining ; statement_using)
+    """
+    varname = var_node.name
+    _node = var_node.parent
+    while _node:
+        if isinstance(_node, COMP_NODE_TYPES):
+            for ass_node in _node.nodes_of_class(astroid.AssignName):
+                if ass_node.name == varname:
+                    return True
+        elif isinstance(_node, astroid.For):
+            for ass_node in _node.target.nodes_of_class(astroid.AssignName):
+                if ass_node.name == varname:
+                    return True
+        elif isinstance(_node, astroid.With):
+            for expr, ids in _node.items:
+                if expr.parent_of(var_node):
+                    break
+                if (ids and
+                        isinstance(ids, astroid.AssignName) and
+                        ids.name == varname):
+                    return True
+        elif isinstance(_node, (astroid.Lambda, astroid.FunctionDef)):
+            if _node.args.is_argument(varname):
+                # If the name is found inside a default value
+                # of a function, then let the search continue
+                # in the parent's tree.
+                if _node.args.parent_of(var_node):
+                    try:
+                        _node.args.default_value(varname)
+                        _node = _node.parent
+                        continue
+                    except astroid.NoDefault:
+                        pass
+                return True
+            if getattr(_node, 'name', None) == varname:
+                return True
+            break
+        elif isinstance(_node, astroid.ExceptHandler):
+            if isinstance(_node.name, astroid.AssignName):
+                ass_node = _node.name
+                if ass_node.name == varname:
+                    return True
+        _node = _node.parent
+    # possibly multiple statements on the same line using semi colon separator
+    stmt = var_node.statement()
+    _node = stmt.previous_sibling()
+    lineno = stmt.fromlineno
+    while _node and _node.fromlineno == lineno:
+        for ass_node in _node.nodes_of_class(astroid.AssignName):
+            if ass_node.name == varname:
+                return True
+        for imp_node in _node.nodes_of_class((astroid.ImportFrom, astroid.Import)):
+            if varname in [name[1] or name[0] for name in imp_node.names]:
+                return True
+        _node = _node.previous_sibling()
+    return False
+
+def is_func_default(node):
+    """return true if the given Name node is used in function default argument's
+    value
+    """
+    parent = node.scope()
+    if isinstance(parent, astroid.FunctionDef):
+        for default_node in parent.args.defaults:
+            for default_name_node in default_node.nodes_of_class(astroid.Name):
+                if default_name_node is node:
+                    return True
+    return False
+
+def is_func_decorator(node):
+    """return true if the name is used in function decorator"""
+    parent = node.parent
+    while parent is not None:
+        if isinstance(parent, astroid.Decorators):
+            return True
+        if (parent.is_statement or
+                isinstance(parent, astroid.Lambda) or
+                isinstance(parent, (scoped_nodes.ComprehensionScope,
+                                    scoped_nodes.ListComp))):
+            break
+        parent = parent.parent
+    return False
+
+def is_ancestor_name(frame, node):
+    """return True if `frame` is a astroid.Class node with `node` in the
+    subtree of its bases attribute
+    """
+    try:
+        bases = frame.bases
+    except AttributeError:
+        return False
+    for base in bases:
+        if node in base.nodes_of_class(astroid.Name):
+            return True
+    return False
+
+def assign_parent(node):
+    """return the higher parent which is not an AssName, Tuple or List node
+    """
+    while node and isinstance(node, (astroid.AssignName,
+                                     astroid.Tuple,
+                                     astroid.List)):
+        node = node.parent
+    return node
+
+
+def overrides_a_method(class_node, name):
+    """return True if <name> is a method overridden from an ancestor"""
+    for ancestor in class_node.ancestors():
+        if name in ancestor and isinstance(ancestor[name], astroid.FunctionDef):
+            return True
+    return False
+
+def check_messages(*messages):
+    """decorator to store messages that are handled by a checker method"""
+
+    def store_messages(func):
+        func.checks_msgs = messages
+        return func
+    return store_messages
+
+class IncompleteFormatString(Exception):
+    """A format string ended in the middle of a format specifier."""
+    pass
+
+class UnsupportedFormatCharacter(Exception):
+    """A format character in a format string is not one of the supported
+    format characters."""
+    def __init__(self, index):
+        Exception.__init__(self, index)
+        self.index = index
+
+def parse_format_string(format_string):
+    """Parses a format string, returning a tuple of (keys, num_args), where keys
+    is the set of mapping keys in the format string, and num_args is the number
+    of arguments required by the format string.  Raises
+    IncompleteFormatString or UnsupportedFormatCharacter if a
+    parse error occurs."""
+    keys = set()
+    num_args = 0
+    def next_char(i):
+        i += 1
+        if i == len(format_string):
+            raise IncompleteFormatString
+        return (i, format_string[i])
+    i = 0
+    while i < len(format_string):
+        char = format_string[i]
+        if char == '%':
+            i, char = next_char(i)
+            # Parse the mapping key (optional).
+            key = None
+            if char == '(':
+                depth = 1
+                i, char = next_char(i)
+                key_start = i
+                while depth != 0:
+                    if char == '(':
+                        depth += 1
+                    elif char == ')':
+                        depth -= 1
+                    i, char = next_char(i)
+                key_end = i - 1
+                key = format_string[key_start:key_end]
+
+            # Parse the conversion flags (optional).
+            while char in '#0- +':
+                i, char = next_char(i)
+            # Parse the minimum field width (optional).
+            if char == '*':
+                num_args += 1
+                i, char = next_char(i)
+            else:
+                while char in string.digits:
+                    i, char = next_char(i)
+            # Parse the precision (optional).
+            if char == '.':
+                i, char = next_char(i)
+                if char == '*':
+                    num_args += 1
+                    i, char = next_char(i)
+                else:
+                    while char in string.digits:
+                        i, char = next_char(i)
+            # Parse the length modifier (optional).
+            if char in 'hlL':
+                i, char = next_char(i)
+            # Parse the conversion type (mandatory).
+            if PY3K:
+                flags = 'diouxXeEfFgGcrs%a'
+            else:
+                flags = 'diouxXeEfFgGcrs%'
+            if char not in flags:
+                raise UnsupportedFormatCharacter(i)
+            if key:
+                keys.add(key)
+            elif char != '%':
+                num_args += 1
+        i += 1
+    return keys, num_args
+
+
+def is_attr_protected(attrname):
+    """return True if attribute name is protected (start with _ and some other
+    details), False otherwise.
+    """
+    return attrname[0] == '_' and attrname != '_' and not (
+        attrname.startswith('__') and attrname.endswith('__'))
+
+def node_frame_class(node):
+    """return klass node for a method node (or a staticmethod or a
+    classmethod), return null otherwise
+    """
+    klass = node.frame()
+
+    while klass is not None and not isinstance(klass, astroid.ClassDef):
+        if klass.parent is None:
+            klass = None
+        else:
+            klass = klass.parent.frame()
+
+    return klass
+
+
+def is_attr_private(attrname):
+    """Check that attribute name is private (at least two leading underscores,
+    at most one trailing underscore)
+    """
+    regex = re.compile('^_{2,}.*[^_]+_?$')
+    return regex.match(attrname)
+
+def get_argument_from_call(callfunc_node, position=None, keyword=None):
+    """Returns the specified argument from a function call.
+
+    :param callfunc_node: Node representing a function call to check.
+    :param int position: position of the argument.
+    :param str keyword: the keyword of the argument.
+
+    :returns: The node representing the argument, None if the argument is not found.
+    :raises ValueError: if both position and keyword are None.
+    :raises NoSuchArgumentError: if no argument at the provided position or with
+    the provided keyword.
+    """
+    if position is None and keyword is None:
+        raise ValueError('Must specify at least one of: position or keyword.')
+    if position is not None:
+        try:
+            return callfunc_node.args[position]
+        except IndexError:
+            pass
+    if keyword and callfunc_node.keywords:
+        for arg in callfunc_node.keywords:
+            if arg.arg == keyword:
+                return arg.value
+
+    raise NoSuchArgumentError
+
+def inherit_from_std_ex(node):
+    """
+    Return true if the given class node is subclass of
+    exceptions.Exception.
+    """
+    if node.name in ('Exception', 'BaseException') \
+            and node.root().name == EXCEPTIONS_MODULE:
+        return True
+    return any(inherit_from_std_ex(parent)
+               for parent in node.ancestors(recurs=False))
+
+def error_of_type(handler, error_type):
+    """
+    Check if the given exception handler catches
+    the given error_type.
+
+    The *handler* parameter is a node, representing an ExceptHandler node.
+    The *error_type* can be an exception, such as AttributeError, or it
+    can be a tuple of errors.
+    The function will return True if the handler catches any of the
+    given errors.
+    """
+    if not isinstance(error_type, tuple):
+        error_type = (error_type, )
+    expected_errors = {error.__name__ for error in error_type}
+    return handler.catch(expected_errors)
+
+
+def is_import_error(handler):
+    warnings.warn("This function is deprecated in the favour of "
+                  "error_of_type. It will be removed in Pylint 1.6.",
+                  DeprecationWarning, stacklevel=2)
+    return error_of_type(handler, ImportError)
+
+
+def decorated_with_property(node):
+    """ Detect if the given function node is decorated with a property. """
+    if not node.decorators:
+        return False
+    for decorator in node.decorators.nodes:
+        if not isinstance(decorator, astroid.Name):
+            continue
+        try:
+            for infered in decorator.infer():
+                if isinstance(infered, astroid.ClassDef):
+                    if (infered.root().name == BUILTINS_NAME and
+                            infered.name == 'property'):
+                        return True
+                    for ancestor in infered.ancestors():
+                        if (ancestor.name == 'property' and
+                                ancestor.root().name == BUILTINS_NAME):
+                            return True
+        except astroid.InferenceError:
+            pass
+
+
+def decorated_with(func, qnames):
+    """Determine if the `func` node has a decorator with the qualified name `qname`."""
+    decorators = func.decorators.nodes if func.decorators else []
+    for decorator_node in decorators:
+        dec = safe_infer(decorator_node)
+        if dec and dec.qname() in qnames:
+            return True
+
+
+def unimplemented_abstract_methods(node, is_abstract_cb=None):
+    """
+    Get the unimplemented abstract methods for the given *node*.
+
+    A method can be considered abstract if the callback *is_abstract_cb*
+    returns a ``True`` value. The check defaults to verifying that
+    a method is decorated with abstract methods.
+    The function will work only for new-style classes. For old-style
+    classes, it will simply return an empty dictionary.
+    For the rest of them, it will return a dictionary of abstract method
+    names and their inferred objects.
+    """
+    if is_abstract_cb is None:
+        is_abstract_cb = functools.partial(
+            decorated_with, qnames=ABC_METHODS)
+    visited = {}
+    try:
+        mro = reversed(node.mro())
+    except NotImplementedError:
+        # Old style class, it will not have a mro.
+        return {}
+    except astroid.ResolveError:
+        # Probably inconsistent hierarchy, don'try
+        # to figure this out here.
+        return {}
+    for ancestor in mro:
+        for obj in ancestor.values():
+            infered = obj
+            if isinstance(obj, astroid.AssignName):
+                infered = safe_infer(obj)
+                if not infered:
+                    # Might be an abstract function,
+                    # but since we don't have enough information
+                    # in order to take this decision, we're taking
+                    # the *safe* decision instead.
+                    if obj.name in visited:
+                        del visited[obj.name]
+                    continue
+                if not isinstance(infered, astroid.FunctionDef):
+                    if obj.name in visited:
+                        del visited[obj.name]
+            if isinstance(infered, astroid.FunctionDef):
+                # It's critical to use the original name,
+                # since after inferring, an object can be something
+                # else than expected, as in the case of the
+                # following assignment.
+                #
+                # class A:
+                #     def keys(self): pass
+                #     __iter__ = keys
+                abstract = is_abstract_cb(infered)
+                if abstract:
+                    visited[obj.name] = infered
+                elif not abstract and obj.name in visited:
+                    del visited[obj.name]
+    return visited
+
+
+def node_ignores_exception(node, exception):
+    """Check if the node is in a TryExcept which handles the given exception.
+
+    This will also return ``True`` if the node is protected by an `except Exception`
+    or by a bare except clause.
+    """
+    current = node
+    ignores = (astroid.ExceptHandler, astroid.TryExcept)
+    while current and not isinstance(current.parent, ignores):
+        current = current.parent
+
+    func = functools.partial(error_of_type,
+                             error_type=(Exception, exception))
+    if current and isinstance(current.parent, astroid.TryExcept):
+        handles_errors = any(map(func, current.parent.handlers))
+        empty_handlers = any(handler.type is None
+                             for handler in current.parent.handlers)
+        if handles_errors or empty_handlers:
+            return True
+    return False
+
+
+def class_is_abstract(node):
+    """return true if the given class node should be considered as an abstract
+    class
+    """
+    for method in node.methods():
+        if method.parent.frame() is node:
+            if method.is_abstract(pass_is_abstract=False):
+                return True
+    return False
+
+
+def _hasattr(value, attr):
+    try:
+        value.getattr(attr)
+        return True
+    except astroid.NotFoundError:
+        return False
+
+
+def is_comprehension(node):
+    comprehensions = (astroid.ListComp,
+                      astroid.SetComp,
+                      astroid.DictComp,
+                      astroid.GeneratorExp)
+    return isinstance(node, comprehensions)
+
+
+def _supports_mapping_protocol(value):
+    return _hasattr(value, GETITEM_METHOD) and _hasattr(value, KEYS_METHOD)
+
+
+def _supports_membership_test_protocol(value):
+    return _hasattr(value, CONTAINS_METHOD)
+
+
+def _supports_iteration_protocol(value):
+    return _hasattr(value, ITER_METHOD) or _hasattr(value, GETITEM_METHOD)
+
+
+def _supports_subscript_protocol(value):
+    return _hasattr(value, GETITEM_METHOD)
+
+
+def _is_abstract_class_name(name):
+    lname = name.lower()
+    is_mixin = lname.endswith('mixin')
+    is_abstract = lname.startswith('abstract')
+    is_base = lname.startswith('base') or lname.endswith('base')
+    return is_mixin or is_abstract or is_base
+
+
+def is_inside_abstract_class(node):
+    while node is not None:
+        if isinstance(node, astroid.ClassDef):
+            if class_is_abstract(node):
+                return True
+            name = getattr(node, 'name', None)
+            if name is not None and _is_abstract_class_name(name):
+                return True
+        node = node.parent
+    return False
+
+
+def is_iterable(value):
+    if isinstance(value, astroid.ClassDef):
+        if not has_known_bases(value):
+            return True
+        # classobj can only be iterable if it has an iterable metaclass
+        meta = value.metaclass()
+        if meta is not None:
+            if _supports_iteration_protocol(meta):
+                return True
+    if isinstance(value, astroid.Instance):
+        if not has_known_bases(value):
+            return True
+        if _supports_iteration_protocol(value):
+            return True
+    return False
+
+
+def is_mapping(value):
+    if isinstance(value, astroid.ClassDef):
+        if not has_known_bases(value):
+            return True
+        # classobj can only be a mapping if it has a metaclass is mapping
+        meta = value.metaclass()
+        if meta is not None:
+            if _supports_mapping_protocol(meta):
+                return True
+    if isinstance(value, astroid.Instance):
+        if not has_known_bases(value):
+            return True
+        if _supports_mapping_protocol(value):
+            return True
+    return False
+
+
+def supports_membership_test(value):
+    if isinstance(value, astroid.ClassDef):
+        if not has_known_bases(value):
+            return True
+        meta = value.metaclass()
+        if meta is not None and _supports_membership_test_protocol(meta):
+            return True
+    if isinstance(value, astroid.Instance):
+        if not has_known_bases(value):
+            return True
+        if _supports_membership_test_protocol(value):
+            return True
+    return is_iterable(value)
+
+
+def supports_subscript(value):
+    if isinstance(value, astroid.ClassDef):
+        if not has_known_bases(value):
+            return False
+        meta = value.metaclass()
+        if meta is not None and _supports_subscript_protocol(meta):
+            return True
+    if isinstance(value, astroid.Instance):
+        if not has_known_bases(value):
+            return True
+        if _supports_subscript_protocol(value):
+            return True
+    return False
+
+# TODO(cpopa): deprecate these or leave them as aliases?
+def safe_infer(node, context=None):
+    """Return the inferred value for the given node.
+
+    Return None if inference failed or if there is some ambiguity (more than
+    one node has been inferred).
+    """
+    try:
+        inferit = node.infer(context=context)
+        value = next(inferit)
+    except astroid.InferenceError:
+        return
+    try:
+        next(inferit)
+        return # None if there is ambiguity on the inferred node
+    except astroid.InferenceError:
+        return # there is some kind of ambiguity
+    except StopIteration:
+        return value
+
+
+def has_known_bases(klass, context=None):
+    """Return true if all base classes of a class could be inferred."""
+    try:
+        return klass._all_bases_known
+    except AttributeError:
+        pass
+    for base in klass.bases:
+        result = safe_infer(base, context=context)
+        # TODO: check for A->B->A->B pattern in class structure too?
+        if (not isinstance(result, astroid.ClassDef) or
+                result is klass or
+                not has_known_bases(result, context=context)):
+            klass._all_bases_known = False
+            return False
+    klass._all_bases_known = True
+    return True
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/similar.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/similar.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/similar.py	(revision 1126)
@@ -0,0 +1,371 @@
+# pylint: disable=W0622
+# Copyright (c) 2004-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""a similarities / code duplication command line tool and pylint checker
+"""
+from __future__ import print_function
+import sys
+from collections import defaultdict
+
+import six
+from six.moves import zip
+
+from pylint.interfaces import IRawChecker
+from pylint.checkers import BaseChecker, table_lines_from_stats
+from pylint.reporters.ureports.nodes import Table
+
+
+class Similar(object):
+    """finds copy-pasted lines of code in a project"""
+
+    def __init__(self, min_lines=4, ignore_comments=False,
+                 ignore_docstrings=False, ignore_imports=False):
+        self.min_lines = min_lines
+        self.ignore_comments = ignore_comments
+        self.ignore_docstrings = ignore_docstrings
+        self.ignore_imports = ignore_imports
+        self.linesets = []
+
+    def append_stream(self, streamid, stream, encoding=None):
+        """append a file to search for similarities"""
+        if encoding is None:
+            readlines = stream.readlines
+        else:
+            readlines = lambda: [line.decode(encoding) for line in stream]
+        try:
+            self.linesets.append(LineSet(streamid,
+                                         readlines(),
+                                         self.ignore_comments,
+                                         self.ignore_docstrings,
+                                         self.ignore_imports))
+        except UnicodeDecodeError:
+            pass
+
+    def run(self):
+        """start looking for similarities and display results on stdout"""
+        self._display_sims(self._compute_sims())
+
+    def _compute_sims(self):
+        """compute similarities in appended files"""
+        no_duplicates = defaultdict(list)
+        for num, lineset1, idx1, lineset2, idx2 in self._iter_sims():
+            duplicate = no_duplicates[num]
+            for couples in duplicate:
+                if (lineset1, idx1) in couples or (lineset2, idx2) in couples:
+                    couples.add((lineset1, idx1))
+                    couples.add((lineset2, idx2))
+                    break
+            else:
+                duplicate.append(set([(lineset1, idx1), (lineset2, idx2)]))
+        sims = []
+        for num, ensembles in six.iteritems(no_duplicates):
+            for couples in ensembles:
+                sims.append((num, couples))
+        sims.sort()
+        sims.reverse()
+        return sims
+
+    def _display_sims(self, sims):
+        """display computed similarities on stdout"""
+        nb_lignes_dupliquees = 0
+        for num, couples in sims:
+            print()
+            print(num, "similar lines in", len(couples), "files")
+            couples = sorted(couples)
+            for lineset, idx in couples:
+                print("==%s:%s" % (lineset.name, idx))
+            # pylint: disable=W0631
+            for line in lineset._real_lines[idx:idx+num]:
+                print("  ", line.rstrip())
+            nb_lignes_dupliquees += num * (len(couples)-1)
+        nb_total_lignes = sum([len(lineset) for lineset in self.linesets])
+        print("TOTAL lines=%s duplicates=%s percent=%.2f" \
+            % (nb_total_lignes, nb_lignes_dupliquees,
+               nb_lignes_dupliquees*100. / nb_total_lignes))
+
+    def _find_common(self, lineset1, lineset2):
+        """find similarities in the two given linesets"""
+        lines1 = lineset1.enumerate_stripped
+        lines2 = lineset2.enumerate_stripped
+        find = lineset2.find
+        index1 = 0
+        min_lines = self.min_lines
+        while index1 < len(lineset1):
+            skip = 1
+            num = 0
+            for index2 in find(lineset1[index1]):
+                non_blank = 0
+                for num, ((_, line1), (_, line2)) in enumerate(
+                        zip(lines1(index1), lines2(index2))):
+                    if line1 != line2:
+                        if non_blank > min_lines:
+                            yield num, lineset1, index1, lineset2, index2
+                        skip = max(skip, num)
+                        break
+                    if line1:
+                        non_blank += 1
+                else:
+                    # we may have reach the end
+                    num += 1
+                    if non_blank > min_lines:
+                        yield num, lineset1, index1, lineset2, index2
+                    skip = max(skip, num)
+            index1 += skip
+
+    def _iter_sims(self):
+        """iterate on similarities among all files, by making a cartesian
+        product
+        """
+        for idx, lineset in enumerate(self.linesets[:-1]):
+            for lineset2 in self.linesets[idx+1:]:
+                for sim in self._find_common(lineset, lineset2):
+                    yield sim
+
+def stripped_lines(lines, ignore_comments, ignore_docstrings, ignore_imports):
+    """return lines with leading/trailing whitespace and any ignored code
+    features removed
+    """
+
+    strippedlines = []
+    docstring = None
+    for line in lines:
+        line = line.strip()
+        if ignore_docstrings:
+            if not docstring and \
+                   (line.startswith('"""') or line.startswith("'''")):
+                docstring = line[:3]
+                line = line[3:]
+            if docstring:
+                if line.endswith(docstring):
+                    docstring = None
+                line = ''
+        if ignore_imports:
+            if line.startswith("import ") or line.startswith("from "):
+                line = ''
+        if ignore_comments:
+            # XXX should use regex in checkers/format to avoid cutting
+            # at a "#" in a string
+            line = line.split('#', 1)[0].strip()
+        strippedlines.append(line)
+    return strippedlines
+
+
+class LineSet(object):
+    """Holds and indexes all the lines of a single source file"""
+    def __init__(self, name, lines, ignore_comments=False,
+                 ignore_docstrings=False, ignore_imports=False):
+        self.name = name
+        self._real_lines = lines
+        self._stripped_lines = stripped_lines(lines, ignore_comments,
+                                              ignore_docstrings,
+                                              ignore_imports)
+        self._index = self._mk_index()
+
+    def __str__(self):
+        return '<Lineset for %s>' % self.name
+
+    def __len__(self):
+        return len(self._real_lines)
+
+    def __getitem__(self, index):
+        return self._stripped_lines[index]
+
+    def __lt__(self, other):
+        return self.name < other.name
+
+    def __hash__(self):
+        return id(self)
+
+    def enumerate_stripped(self, start_at=0):
+        """return an iterator on stripped lines, starting from a given index
+        if specified, else 0
+        """
+        idx = start_at
+        if start_at:
+            lines = self._stripped_lines[start_at:]
+        else:
+            lines = self._stripped_lines
+        for line in lines:
+            #if line:
+            yield idx, line
+            idx += 1
+
+    def find(self, stripped_line):
+        """return positions of the given stripped line in this set"""
+        return self._index.get(stripped_line, ())
+
+    def _mk_index(self):
+        """create the index for this set"""
+        index = defaultdict(list)
+        for line_no, line in enumerate(self._stripped_lines):
+            if line:
+                index[line].append(line_no)
+        return index
+
+
+MSGS = {'R0801': ('Similar lines in %s files\n%s',
+                  'duplicate-code',
+                  'Indicates that a set of similar lines has been detected \
+                  among multiple file. This usually means that the code should \
+                  be refactored to avoid this duplication.')}
+
+def report_similarities(sect, stats, old_stats):
+    """make a layout with some stats about duplication"""
+    lines = ['', 'now', 'previous', 'difference']
+    lines += table_lines_from_stats(stats, old_stats,
+                                    ('nb_duplicated_lines',
+                                     'percent_duplicated_lines'))
+    sect.append(Table(children=lines, cols=4, rheaders=1, cheaders=1))
+
+
+# wrapper to get a pylint checker from the similar class
+class SimilarChecker(BaseChecker, Similar):
+    """checks for similarities and duplicated code. This computation may be
+    memory / CPU intensive, so you should disable it if you experiment some
+    problems.
+    """
+
+    __implements__ = (IRawChecker,)
+    # configuration section name
+    name = 'similarities'
+    # messages
+    msgs = MSGS
+    # configuration options
+    # for available dict keys/values see the optik parser 'add_option' method
+    options = (('min-similarity-lines',
+                {'default' : 4, 'type' : "int", 'metavar' : '<int>',
+                 'help' : 'Minimum lines number of a similarity.'}),
+               ('ignore-comments',
+                {'default' : True, 'type' : 'yn', 'metavar' : '<y or n>',
+                 'help': 'Ignore comments when computing similarities.'}
+               ),
+               ('ignore-docstrings',
+                {'default' : True, 'type' : 'yn', 'metavar' : '<y or n>',
+                 'help': 'Ignore docstrings when computing similarities.'}
+               ),
+               ('ignore-imports',
+                {'default' : False, 'type' : 'yn', 'metavar' : '<y or n>',
+                 'help': 'Ignore imports when computing similarities.'}
+               ),
+              )
+    # reports
+    reports = (('RP0801', 'Duplication', report_similarities),)
+
+    def __init__(self, linter=None):
+        BaseChecker.__init__(self, linter)
+        Similar.__init__(self, min_lines=4,
+                         ignore_comments=True, ignore_docstrings=True)
+        self.stats = None
+
+    def set_option(self, optname, value, action=None, optdict=None):
+        """method called to set an option (registered in the options list)
+
+        overridden to report options setting to Similar
+        """
+        BaseChecker.set_option(self, optname, value, action, optdict)
+        if optname == 'min-similarity-lines':
+            self.min_lines = self.config.min_similarity_lines
+        elif optname == 'ignore-comments':
+            self.ignore_comments = self.config.ignore_comments
+        elif optname == 'ignore-docstrings':
+            self.ignore_docstrings = self.config.ignore_docstrings
+        elif optname == 'ignore-imports':
+            self.ignore_imports = self.config.ignore_imports
+
+    def open(self):
+        """init the checkers: reset linesets and statistics information"""
+        self.linesets = []
+        self.stats = self.linter.add_stats(nb_duplicated_lines=0,
+                                           percent_duplicated_lines=0)
+
+    def process_module(self, node):
+        """process a module
+
+        the module's content is accessible via the stream object
+
+        stream must implement the readlines method
+        """
+        with node.stream() as stream:
+            self.append_stream(self.linter.current_name,
+                               stream,
+                               node.file_encoding)
+
+    def close(self):
+        """compute and display similarities on closing (i.e. end of parsing)"""
+        total = sum(len(lineset) for lineset in self.linesets)
+        duplicated = 0
+        stats = self.stats
+        for num, couples in self._compute_sims():
+            msg = []
+            for lineset, idx in couples:
+                msg.append("==%s:%s" % (lineset.name, idx))
+            msg.sort()
+            # pylint: disable=W0631
+            for line in lineset._real_lines[idx:idx+num]:
+                msg.append(line.rstrip())
+            self.add_message('R0801', args=(len(couples), '\n'.join(msg)))
+            duplicated += num * (len(couples) - 1)
+        stats['nb_duplicated_lines'] = duplicated
+        stats['percent_duplicated_lines'] = total and duplicated * 100. / total
+
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(SimilarChecker(linter))
+
+def usage(status=0):
+    """display command line usage information"""
+    print("finds copy pasted blocks in a set of files")
+    print()
+    print('Usage: symilar [-d|--duplicates min_duplicated_lines] \
+[-i|--ignore-comments] [--ignore-docstrings] [--ignore-imports] file1...')
+    sys.exit(status)
+
+def Run(argv=None):
+    """standalone command line access point"""
+    if argv is None:
+        argv = sys.argv[1:]
+    from getopt import getopt
+    s_opts = 'hdi'
+    l_opts = ('help', 'duplicates=', 'ignore-comments', 'ignore-imports',
+              'ignore-docstrings')
+    min_lines = 4
+    ignore_comments = False
+    ignore_docstrings = False
+    ignore_imports = False
+    opts, args = getopt(argv, s_opts, l_opts)
+    for opt, val in opts:
+        if opt in ('-d', '--duplicates'):
+            min_lines = int(val)
+        elif opt in ('-h', '--help'):
+            usage()
+        elif opt in ('-i', '--ignore-comments'):
+            ignore_comments = True
+        elif opt in ('--ignore-docstrings',):
+            ignore_docstrings = True
+        elif opt in ('--ignore-imports',):
+            ignore_imports = True
+    if not args:
+        usage(1)
+    sim = Similar(min_lines, ignore_comments, ignore_docstrings, ignore_imports)
+    for filename in args:
+        with open(filename) as stream:
+            sim.append_stream(filename, stream)
+    sim.run()
+    sys.exit(0)
+
+if __name__ == '__main__':
+    Run()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/python3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/python3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/checkers/python3.py	(revision 1126)
@@ -0,0 +1,590 @@
+# Copyright 2014 Google Inc.
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Check Python 2 code for Python 2/3 source-compatible issues."""
+from __future__ import absolute_import, print_function
+
+import re
+import tokenize
+
+import astroid
+from astroid import bases
+
+from pylint import checkers, interfaces
+from pylint.utils import WarningScope
+from pylint.checkers import utils
+
+
+_ZERO = re.compile("^0+$")
+
+def _is_old_octal(literal):
+    if _ZERO.match(literal):
+        return False
+    if re.match('0\d+', literal):
+        try:
+            int(literal, 8)
+        except ValueError:
+            return False
+        return True
+
+def _check_dict_node(node):
+    inferred_types = set()
+    try:
+        inferred = node.infer()
+        for inferred_node in inferred:
+            inferred_types.add(inferred_node)
+    except (astroid.InferenceError, astroid.UnresolvableName):
+        pass
+    return (not inferred_types
+            or any(isinstance(x, astroid.Dict) for x in inferred_types))
+
+def _is_builtin(node):
+    return getattr(node, 'name', None) in ('__builtin__', 'builtins')
+
+_ACCEPTS_ITERATOR = {'iter', 'list', 'tuple', 'sorted', 'set', 'sum', 'any',
+                     'all', 'enumerate', 'dict'}
+
+def _in_iterating_context(node):
+    """Check if the node is being used as an iterator.
+
+    Definition is taken from lib2to3.fixer_util.in_special_context().
+    """
+    parent = node.parent
+    # Since a call can't be the loop variant we only need to know if the node's
+    # parent is a 'for' loop to know it's being used as the iterator for the
+    # loop.
+    if isinstance(parent, astroid.For):
+        return True
+    # Need to make sure the use of the node is in the iterator part of the
+    # comprehension.
+    elif isinstance(parent, astroid.Comprehension):
+        if parent.iter == node:
+            return True
+    # Various built-ins can take in an iterable or list and lead to the same
+    # value.
+    elif isinstance(parent, astroid.Call):
+        if isinstance(parent.func, astroid.Name):
+            parent_scope = parent.func.lookup(parent.func.name)[0]
+            if _is_builtin(parent_scope) and parent.func.name in _ACCEPTS_ITERATOR:
+                return True
+        elif isinstance(parent.func, astroid.Attribute):
+            if parent.func.attrname == 'join':
+                return True
+    # If the call is in an unpacking, there's no need to warn,
+    # since it can be considered iterating.
+    elif (isinstance(parent, astroid.Assign) and
+          isinstance(parent.targets[0], (astroid.List, astroid.Tuple))):
+        if len(parent.targets[0].elts) > 1:
+            return True
+    return False
+
+
+class Python3Checker(checkers.BaseChecker):
+
+    __implements__ = interfaces.IAstroidChecker
+    enabled = False
+    name = 'python3'
+
+    msgs = {
+        # Errors for what will syntactically break in Python 3, warnings for
+        # everything else.
+        'E1601': ('print statement used',
+                  'print-statement',
+                  'Used when a print statement is used '
+                  '(`print` is a function in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'E1602': ('Parameter unpacking specified',
+                  'parameter-unpacking',
+                  'Used when parameter unpacking is specified for a function'
+                  "(Python 3 doesn't allow it)",
+                  {'maxversion': (3, 0)}),
+        'E1603': ('Implicit unpacking of exceptions is not supported '
+                  'in Python 3',
+                  'unpacking-in-except',
+                  'Python3 will not allow implicit unpacking of '
+                  'exceptions in except clauses. '
+                  'See http://www.python.org/dev/peps/pep-3110/',
+                  {'maxversion': (3, 0),
+                   'old_names': [('W0712', 'unpacking-in-except')]}),
+        'E1604': ('Use raise ErrorClass(args) instead of '
+                  'raise ErrorClass, args.',
+                  'old-raise-syntax',
+                  "Used when the alternate raise syntax "
+                  "'raise foo, bar' is used "
+                  "instead of 'raise foo(bar)'.",
+                  {'maxversion': (3, 0),
+                   'old_names': [('W0121', 'old-raise-syntax')]}),
+        'E1605': ('Use of the `` operator',
+                  'backtick',
+                  'Used when the deprecated "``" (backtick) operator is used '
+                  'instead  of the str() function.',
+                  {'scope': WarningScope.NODE,
+                   'maxversion': (3, 0),
+                   'old_names': [('W0333', 'backtick')]}),
+        'E1609': ('Import * only allowed at module level',
+                  'import-star-module-level',
+                  'Used when the import star syntax is used somewhere '
+                  'else than the module level.',
+                  {'maxversion': (3, 0)}),
+        'W1601': ('apply built-in referenced',
+                  'apply-builtin',
+                  'Used when the apply built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1602': ('basestring built-in referenced',
+                  'basestring-builtin',
+                  'Used when the basestring built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1603': ('buffer built-in referenced',
+                  'buffer-builtin',
+                  'Used when the buffer built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1604': ('cmp built-in referenced',
+                  'cmp-builtin',
+                  'Used when the cmp built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1605': ('coerce built-in referenced',
+                  'coerce-builtin',
+                  'Used when the coerce built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1606': ('execfile built-in referenced',
+                  'execfile-builtin',
+                  'Used when the execfile built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1607': ('file built-in referenced',
+                  'file-builtin',
+                  'Used when the file built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1608': ('long built-in referenced',
+                  'long-builtin',
+                  'Used when the long built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1609': ('raw_input built-in referenced',
+                  'raw_input-builtin',
+                  'Used when the raw_input built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1610': ('reduce built-in referenced',
+                  'reduce-builtin',
+                  'Used when the reduce built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1611': ('StandardError built-in referenced',
+                  'standarderror-builtin',
+                  'Used when the StandardError built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1612': ('unicode built-in referenced',
+                  'unicode-builtin',
+                  'Used when the unicode built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1613': ('xrange built-in referenced',
+                  'xrange-builtin',
+                  'Used when the xrange built-in function is referenced '
+                  '(missing from Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1614': ('__coerce__ method defined',
+                  'coerce-method',
+                  'Used when a __coerce__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1615': ('__delslice__ method defined',
+                  'delslice-method',
+                  'Used when a __delslice__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1616': ('__getslice__ method defined',
+                  'getslice-method',
+                  'Used when a __getslice__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1617': ('__setslice__ method defined',
+                  'setslice-method',
+                  'Used when a __setslice__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1618': ('import missing `from __future__ import absolute_import`',
+                  'no-absolute-import',
+                  'Used when an import is not accompanied by '
+                  '``from __future__ import absolute_import`` '
+                  '(default behaviour in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1619': ('division w/o __future__ statement',
+                  'old-division',
+                  'Used for non-floor division w/o a float literal or '
+                  '``from __future__ import division`` '
+                  '(Python 3 returns a float for int division unconditionally)',
+                  {'maxversion': (3, 0)}),
+        'W1620': ('Calling a dict.iter*() method',
+                  'dict-iter-method',
+                  'Used for calls to dict.iterkeys(), itervalues() or iteritems() '
+                  '(Python 3 lacks these methods)',
+                  {'maxversion': (3, 0)}),
+        'W1621': ('Calling a dict.view*() method',
+                  'dict-view-method',
+                  'Used for calls to dict.viewkeys(), viewvalues() or viewitems() '
+                  '(Python 3 lacks these methods)',
+                  {'maxversion': (3, 0)}),
+        'W1622': ('Called a next() method on an object',
+                  'next-method-called',
+                  "Used when an object's next() method is called "
+                  '(Python 3 uses the next() built-in function)',
+                  {'maxversion': (3, 0)}),
+        'W1623': ("Assigning to a class's __metaclass__ attribute",
+                  'metaclass-assignment',
+                  "Used when a metaclass is specified by assigning to __metaclass__ "
+                  '(Python 3 specifies the metaclass as a class statement argument)',
+                  {'maxversion': (3, 0)}),
+        'W1624': ('Indexing exceptions will not work on Python 3',
+                  'indexing-exception',
+                  'Indexing exceptions will not work on Python 3. Use '
+                  '`exception.args[index]` instead.',
+                  {'maxversion': (3, 0),
+                   'old_names': [('W0713', 'indexing-exception')]}),
+        'W1625': ('Raising a string exception',
+                  'raising-string',
+                  'Used when a string exception is raised. This will not '
+                  'work on Python 3.',
+                  {'maxversion': (3, 0),
+                   'old_names': [('W0701', 'raising-string')]}),
+        'W1626': ('reload built-in referenced',
+                  'reload-builtin',
+                  'Used when the reload built-in function is referenced '
+                  '(missing from Python 3). You can use instead imp.reload '
+                  'or importlib.reload.',
+                  {'maxversion': (3, 0)}),
+        'W1627': ('__oct__ method defined',
+                  'oct-method',
+                  'Used when a __oct__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1628': ('__hex__ method defined',
+                  'hex-method',
+                  'Used when a __hex__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1629': ('__nonzero__ method defined',
+                  'nonzero-method',
+                  'Used when a __nonzero__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1630': ('__cmp__ method defined',
+                  'cmp-method',
+                  'Used when a __cmp__ method is defined '
+                  '(method is not used by Python 3)',
+                  {'maxversion': (3, 0)}),
+        # 'W1631': replaced by W1636
+        'W1632': ('input built-in referenced',
+                  'input-builtin',
+                  'Used when the input built-in is referenced '
+                  '(backwards-incompatible semantics in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1633': ('round built-in referenced',
+                  'round-builtin',
+                  'Used when the round built-in is referenced '
+                  '(backwards-incompatible semantics in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1634': ('intern built-in referenced',
+                  'intern-builtin',
+                  'Used when the intern built-in is referenced '
+                  '(Moved to sys.intern in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1635': ('unichr built-in referenced',
+                  'unichr-builtin',
+                  'Used when the unichr built-in is referenced '
+                  '(Use chr in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1636': ('map built-in referenced when not iterating',
+                  'map-builtin-not-iterating',
+                  'Used when the map built-in is referenced in a non-iterating '
+                  'context (returns an iterator in Python 3)',
+                  {'maxversion': (3, 0),
+                   'old_names': [('W1631', 'implicit-map-evaluation')]}),
+        'W1637': ('zip built-in referenced when not iterating',
+                  'zip-builtin-not-iterating',
+                  'Used when the zip built-in is referenced in a non-iterating '
+                  'context (returns an iterator in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1638': ('range built-in referenced when not iterating',
+                  'range-builtin-not-iterating',
+                  'Used when the range built-in is referenced in a non-iterating '
+                  'context (returns an iterator in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1639': ('filter built-in referenced when not iterating',
+                  'filter-builtin-not-iterating',
+                  'Used when the filter built-in is referenced in a non-iterating '
+                  'context (returns an iterator in Python 3)',
+                  {'maxversion': (3, 0)}),
+        'W1640': ('Using the cmp argument for list.sort / sorted',
+                  'using-cmp-argument',
+                  'Using the cmp argument for list.sort or the sorted '
+                  'builtin should be avoided, since it was removed in '
+                  'Python 3. Using either `key` or `functools.cmp_to_key` '
+                  'should be preferred.',
+                  {'maxversion': (3, 0)}),
+    }
+
+    _bad_builtins = frozenset([
+        'apply',
+        'basestring',
+        'buffer',
+        'cmp',
+        'coerce',
+        'execfile',
+        'file',
+        'input',  # Not missing, but incompatible semantics
+        'intern',
+        'long',
+        'raw_input',
+        'reduce',
+        'round',  # Not missing, but incompatible semantics
+        'StandardError',
+        'unichr',
+        'unicode',
+        'xrange',
+        'reload',
+    ])
+
+    _unused_magic_methods = frozenset([
+        '__coerce__',
+        '__delslice__',
+        '__getslice__',
+        '__setslice__',
+        '__oct__',
+        '__hex__',
+        '__nonzero__',
+        '__cmp__',
+    ])
+
+    def __init__(self, *args, **kwargs):
+        self._future_division = False
+        self._future_absolute_import = False
+        super(Python3Checker, self).__init__(*args, **kwargs)
+
+    def visit_module(self, node): # pylint: disable=unused-argument
+        """Clear checker state after previous module."""
+        self._future_division = False
+        self._future_absolute_import = False
+
+    def visit_functiondef(self, node):
+        if node.is_method() and node.name in self._unused_magic_methods:
+            method_name = node.name
+            if node.name.startswith('__'):
+                method_name = node.name[2:-2]
+            self.add_message(method_name + '-method', node=node)
+
+    @utils.check_messages('parameter-unpacking')
+    def visit_arguments(self, node):
+        for arg in node.args:
+            if isinstance(arg, astroid.Tuple):
+                self.add_message('parameter-unpacking', node=arg)
+
+    def visit_name(self, node):
+        """Detect when a "bad" built-in is referenced."""
+        found_node = node.lookup(node.name)[0]
+        if _is_builtin(found_node):
+            if node.name in self._bad_builtins:
+                message = node.name.lower() + '-builtin'
+                self.add_message(message, node=node)
+
+    @utils.check_messages('print-statement')
+    def visit_print(self, node):
+        self.add_message('print-statement', node=node)
+
+    @utils.check_messages('no-absolute-import', 'import-star-module-level')
+    def visit_importfrom(self, node):
+        if node.modname == '__future__':
+            for name, _ in node.names:
+                if name == 'division':
+                    self._future_division = True
+                elif name == 'absolute_import':
+                    self._future_absolute_import = True
+        elif not self._future_absolute_import:
+            self.add_message('no-absolute-import', node=node)
+        if node.names[0][0] == '*':
+            if not isinstance(node.scope(), astroid.Module):
+                self.add_message('import-star-module-level', node=node)
+
+    @utils.check_messages('no-absolute-import')
+    def visit_import(self, node):
+        if not self._future_absolute_import:
+            self.add_message('no-absolute-import', node=node)
+
+    @utils.check_messages('metaclass-assignment')
+    def visit_classdef(self, node):
+        if '__metaclass__' in node.locals:
+            self.add_message('metaclass-assignment', node=node)
+
+    @utils.check_messages('old-division')
+    def visit_binop(self, node):
+        if not self._future_division and node.op == '/':
+            for arg in (node.left, node.right):
+                if isinstance(arg, astroid.Const) and isinstance(arg.value, float):
+                    break
+            else:
+                self.add_message('old-division', node=node)
+
+    def _check_cmp_argument(self, node):
+        # Check that the `cmp` argument is used
+        kwargs = []
+        if (isinstance(node.func, astroid.Attribute)
+                and node.func.attrname == 'sort'):
+            inferred = utils.safe_infer(node.func.expr)
+            if not inferred:
+                return
+
+            builtins_list = "{}.list".format(bases.BUILTINS)
+            if (isinstance(inferred, astroid.List)
+                    or inferred.qname() == builtins_list):
+                kwargs = node.keywords
+
+        elif (isinstance(node.func, astroid.Name)
+              and node.func.name == 'sorted'):
+            inferred = utils.safe_infer(node.func)
+            if not inferred:
+                return
+
+            builtins_sorted = "{}.sorted".format(bases.BUILTINS)
+            if inferred.qname() == builtins_sorted:
+                kwargs = node.keywords
+
+        for kwarg in kwargs or []:
+            if kwarg.arg == 'cmp':
+                self.add_message('using-cmp-argument', node=node)
+                return
+
+    def visit_call(self, node):
+        self._check_cmp_argument(node)
+
+        if isinstance(node.func, astroid.Attribute):
+            if any([node.args, node.keywords]):
+                return
+            if node.func.attrname == 'next':
+                self.add_message('next-method-called', node=node)
+            else:
+                if _check_dict_node(node.func.expr):
+                    if node.func.attrname in ('iterkeys', 'itervalues', 'iteritems'):
+                        self.add_message('dict-iter-method', node=node)
+                    elif node.func.attrname in ('viewkeys', 'viewvalues', 'viewitems'):
+                        self.add_message('dict-view-method', node=node)
+        elif isinstance(node.func, astroid.Name):
+            found_node = node.func.lookup(node.func.name)[0]
+            if _is_builtin(found_node):
+                if node.func.name in ('filter', 'map', 'range', 'zip'):
+                    if not _in_iterating_context(node):
+                        checker = '{}-builtin-not-iterating'.format(node.func.name)
+                        self.add_message(checker, node=node)
+
+
+    @utils.check_messages('indexing-exception')
+    def visit_subscript(self, node):
+        """ Look for indexing exceptions. """
+        try:
+            for infered in node.value.infer():
+                if not isinstance(infered, astroid.Instance):
+                    continue
+                if utils.inherit_from_std_ex(infered):
+                    self.add_message('indexing-exception', node=node)
+        except astroid.InferenceError:
+            return
+
+    @utils.check_messages('unpacking-in-except')
+    def visit_excepthandler(self, node):
+        """Visit an except handler block and check for exception unpacking."""
+        if isinstance(node.name, (astroid.Tuple, astroid.List)):
+            self.add_message('unpacking-in-except', node=node)
+
+    @utils.check_messages('backtick')
+    def visit_repr(self, node):
+        self.add_message('backtick', node=node)
+
+    @utils.check_messages('raising-string', 'old-raise-syntax')
+    def visit_raise(self, node):
+        """Visit a raise statement and check for raising
+        strings or old-raise-syntax.
+        """
+        if (node.exc is not None and
+                node.inst is not None and
+                node.tback is None):
+            self.add_message('old-raise-syntax', node=node)
+
+        # Ignore empty raise.
+        if node.exc is None:
+            return
+        expr = node.exc
+        if self._check_raise_value(node, expr):
+            return
+        else:
+            try:
+                value = next(astroid.unpack_infer(expr))
+            except astroid.InferenceError:
+                return
+            self._check_raise_value(node, value)
+
+    def _check_raise_value(self, node, expr):
+        if isinstance(expr, astroid.Const):
+            value = expr.value
+            if isinstance(value, str):
+                self.add_message('raising-string', node=node)
+                return True
+
+
+class Python3TokenChecker(checkers.BaseTokenChecker):
+    __implements__ = interfaces.ITokenChecker
+    name = 'python3'
+    enabled = False
+
+    msgs = {
+        'E1606': ('Use of long suffix',
+                  'long-suffix',
+                  'Used when "l" or "L" is used to mark a long integer. '
+                  'This will not work in Python 3, since `int` and `long` '
+                  'types have merged.',
+                  {'maxversion': (3, 0)}),
+        'E1607': ('Use of the <> operator',
+                  'old-ne-operator',
+                  'Used when the deprecated "<>" operator is used instead '
+                  'of "!=". This is removed in Python 3.',
+                  {'maxversion': (3, 0),
+                   'old_names': [('W0331', 'old-ne-operator')]}),
+        'E1608': ('Use of old octal literal',
+                  'old-octal-literal',
+                  'Usen when encountering the old octal syntax, '
+                  'removed in Python 3. To use the new syntax, '
+                  'prepend 0o on the number.',
+                  {'maxversion': (3, 0)}),
+    }
+
+    def process_tokens(self, tokens):
+        for idx, (tok_type, token, start, _, _) in enumerate(tokens):
+            if tok_type == tokenize.NUMBER:
+                if token.lower().endswith('l'):
+                    # This has a different semantic than lowercase-l-suffix.
+                    self.add_message('long-suffix', line=start[0])
+                elif _is_old_octal(token):
+                    self.add_message('old-octal-literal', line=start[0])
+            if tokens[idx][1] == '<>':
+                self.add_message('old-ne-operator', line=tokens[idx][2][0])
+
+
+def register(linter):
+    linter.register_checker(Python3Checker(linter))
+    linter.register_checker(Python3TokenChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/testutils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/testutils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/testutils.py	(revision 1126)
@@ -0,0 +1,414 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""functional/non regression tests for pylint"""
+from __future__ import print_function
+
+import collections
+import contextlib
+import functools
+from glob import glob
+import os
+from os import linesep, getcwd, sep
+from os.path import abspath, basename, dirname, isdir, join, splitext
+import sys
+import re
+import unittest
+import tempfile
+import tokenize
+
+import six
+from six.moves import StringIO
+
+import astroid
+from pylint import checkers
+from pylint.utils import PyLintASTWalker
+from pylint.reporters import BaseReporter
+from pylint.interfaces import IReporter
+from pylint.lint import PyLinter
+
+
+
+# Utils
+
+SYS_VERS_STR = '%d%d%d' % sys.version_info[:3]
+TITLE_UNDERLINES = ['', '=', '-', '.']
+PREFIX = abspath(dirname(__file__))
+PY3K = sys.version_info[0] == 3
+
+def fix_path():
+    sys.path.insert(0, PREFIX)
+
+def get_tests_info(input_dir, msg_dir, prefix, suffix):
+    """get python input examples and output messages
+
+    We use following conventions for input files and messages:
+    for different inputs:
+        test for python  >= x.y    ->  input   =  <name>_pyxy.py
+        test for python  <  x.y    ->  input   =  <name>_py_xy.py
+    for one input and different messages:
+        message for python >=  x.y ->  message =  <name>_pyxy.txt
+        lower versions             ->  message with highest num
+    """
+    result = []
+    for fname in glob(join(input_dir, prefix + '*' + suffix)):
+        infile = basename(fname)
+        fbase = splitext(infile)[0]
+        # filter input files :
+        pyrestr = fbase.rsplit('_py', 1)[-1] # like _26 or 26
+        if pyrestr.isdigit(): # '24', '25'...
+            if SYS_VERS_STR < pyrestr:
+                continue
+        if pyrestr.startswith('_') and  pyrestr[1:].isdigit():
+            # skip test for higher python versions
+            if SYS_VERS_STR >= pyrestr[1:]:
+                continue
+        messages = glob(join(msg_dir, fbase + '*.txt'))
+        # the last one will be without ext, i.e. for all or upper versions:
+        if messages:
+            for outfile in sorted(messages, reverse=True):
+                py_rest = outfile.rsplit('_py', 1)[-1][:-4]
+                if py_rest.isdigit() and SYS_VERS_STR >= py_rest:
+                    break
+        else:
+            # This will provide an error message indicating the missing filename.
+            outfile = join(msg_dir, fbase + '.txt')
+        result.append((infile, outfile))
+    return result
+
+
+class TestReporter(BaseReporter):
+    """reporter storing plain text messages"""
+
+    __implements__ = IReporter
+
+    def __init__(self): # pylint: disable=super-init-not-called
+
+        self.message_ids = {}
+        self.reset()
+        self.path_strip_prefix = getcwd() + sep
+
+    def reset(self):
+        self.out = StringIO()
+        self.messages = []
+
+    def add_message(self, msg_id, location, msg):
+        """manage message of different type and in the context of path """
+        _, _, obj, line, _ = location
+        self.message_ids[msg_id] = 1
+        if obj:
+            obj = ':%s' % obj
+        sigle = msg_id[0]
+        if PY3K and linesep != '\n':
+            # 2to3 writes os.linesep instead of using
+            # the previosly used line separators
+            msg = msg.replace('\r\n', '\n')
+        self.messages.append('%s:%3s%s: %s' % (sigle, line, obj, msg))
+
+    def finalize(self):
+        self.messages.sort()
+        for msg in self.messages:
+            print(msg, file=self.out)
+        result = self.out.getvalue()
+        self.reset()
+        return result
+
+    def display_reports(self, layout):
+        """ignore layouts"""
+
+    _display = None
+
+
+class Message(collections.namedtuple('Message',
+                                     ['msg_id', 'line', 'node', 'args'])):
+    def __new__(cls, msg_id, line=None, node=None, args=None):
+        return tuple.__new__(cls, (msg_id, line, node, args))
+
+
+class UnittestLinter(object):
+    """A fake linter class to capture checker messages."""
+    # pylint: disable=unused-argument, no-self-use
+
+    def __init__(self):
+        self._messages = []
+        self.stats = {}
+
+    def release_messages(self):
+        try:
+            return self._messages
+        finally:
+            self._messages = []
+
+    def add_message(self, msg_id, line=None, node=None, args=None,
+                    confidence=None):
+        self._messages.append(Message(msg_id, line, node, args))
+
+    def is_message_enabled(self, *unused_args):
+        return True
+
+    def add_stats(self, **kwargs):
+        for name, value in six.iteritems(kwargs):
+            self.stats[name] = value
+        return self.stats
+
+    @property
+    def options_providers(self):
+        return linter.options_providers
+
+def set_config(**kwargs):
+    """Decorator for setting config values on a checker."""
+    def _wrapper(fun):
+        @functools.wraps(fun)
+        def _forward(self):
+            for key, value in six.iteritems(kwargs):
+                setattr(self.checker.config, key, value)
+            if isinstance(self, CheckerTestCase):
+                # reopen checker in case, it may be interested in configuration change
+                self.checker.open()
+            fun(self)
+
+        return _forward
+    return _wrapper
+
+
+class CheckerTestCase(unittest.TestCase):
+    """A base testcase class for unittesting individual checker classes."""
+    CHECKER_CLASS = None
+    CONFIG = {}
+
+    def setUp(self):
+        self.linter = UnittestLinter()
+        self.checker = self.CHECKER_CLASS(self.linter) # pylint: disable=not-callable
+        for key, value in six.iteritems(self.CONFIG):
+            setattr(self.checker.config, key, value)
+        self.checker.open()
+
+    @contextlib.contextmanager
+    def assertNoMessages(self):
+        """Assert that no messages are added by the given method."""
+        with self.assertAddsMessages():
+            yield
+
+    @contextlib.contextmanager
+    def assertAddsMessages(self, *messages):
+        """Assert that exactly the given method adds the given messages.
+
+        The list of messages must exactly match *all* the messages added by the
+        method. Additionally, we check to see whether the args in each message can
+        actually be substituted into the message string.
+        """
+        yield
+        got = self.linter.release_messages()
+        msg = ('Expected messages did not match actual.\n'
+               'Expected:\n%s\nGot:\n%s' % ('\n'.join(repr(m) for m in messages),
+                                            '\n'.join(repr(m) for m in got)))
+        self.assertEqual(list(messages), got, msg)
+
+    def walk(self, node):
+        """recursive walk on the given node"""
+        walker = PyLintASTWalker(linter)
+        walker.add_checker(self.checker)
+        walker.walk(node)
+
+
+# Init
+test_reporter = TestReporter()
+linter = PyLinter()
+linter.set_reporter(test_reporter)
+linter.config.persistent = 0
+checkers.initialize(linter)
+
+if linesep != '\n':
+    LINE_RGX = re.compile(linesep)
+    def ulines(string):
+        return LINE_RGX.sub('\n', string)
+else:
+    def ulines(string):
+        return string
+
+INFO_TEST_RGX = re.compile(r'^func_i\d\d\d\d$')
+
+def exception_str(self, ex): # pylint: disable=unused-argument
+    """function used to replace default __str__ method of exception instances"""
+    return 'in %s\n:: %s' % (ex.file, ', '.join(ex.args))
+
+# Test classes
+
+class LintTestUsingModule(unittest.TestCase):
+    INPUT_DIR = None
+    DEFAULT_PACKAGE = 'input'
+    package = DEFAULT_PACKAGE
+    linter = linter
+    module = None
+    depends = None
+    output = None
+    _TEST_TYPE = 'module'
+    maxDiff = None
+
+    def shortDescription(self):
+        values = {'mode' : self._TEST_TYPE,
+                  'input': self.module,
+                  'pkg':   self.package,
+                  'cls':   self.__class__.__name__}
+
+        if self.package == self.DEFAULT_PACKAGE:
+            msg = '%(mode)s test of input file "%(input)s" (%(cls)s)'
+        else:
+            msg = '%(mode)s test of input file "%(input)s" in "%(pkg)s" (%(cls)s)'
+        return msg % values
+
+    def test_functionality(self):
+        tocheck = [self.package+'.'+self.module]
+        # pylint: disable=not-an-iterable; can't handle boolean checks for now
+        if self.depends:
+            tocheck += [self.package+'.%s' % name.replace('.py', '')
+                        for name, _ in self.depends]
+        self._test(tocheck)
+
+    def _check_result(self, got):
+        self.assertMultiLineEqual(self._get_expected().strip()+'\n',
+                                  got.strip()+'\n')
+
+    def _test(self, tocheck):
+        if INFO_TEST_RGX.match(self.module):
+            self.linter.enable('I')
+        else:
+            self.linter.disable('I')
+        try:
+            self.linter.check(tocheck)
+        except Exception as ex:
+            # need finalization to restore a correct state
+            self.linter.reporter.finalize()
+            ex.file = tocheck
+            print(ex)
+            ex.__str__ = exception_str
+            raise
+        self._check_result(self.linter.reporter.finalize())
+
+    def _has_output(self):
+        return not self.module.startswith('func_noerror_')
+
+    def _get_expected(self):
+        if self._has_output() and self.output:
+            with open(self.output, 'U') as fobj:
+                return fobj.read().strip() + '\n'
+        else:
+            return ''
+
+class LintTestUsingFile(LintTestUsingModule):
+
+    _TEST_TYPE = 'file'
+
+    def test_functionality(self):
+        importable = join(self.INPUT_DIR, self.module)
+        # python also prefers packages over simple modules.
+        if not isdir(importable):
+            importable += '.py'
+        tocheck = [importable]
+        # pylint: disable=not-an-iterable; can't handle boolean checks for now
+        if self.depends:
+            tocheck += [join(self.INPUT_DIR, name) for name, _ in self.depends]
+        self._test(tocheck)
+
+class LintTestUpdate(LintTestUsingModule):
+
+    _TEST_TYPE = 'update'
+
+    def _check_result(self, got):
+        if self._has_output():
+            try:
+                expected = self._get_expected()
+            except IOError:
+                expected = ''
+            if got != expected:
+                with open(self.output, 'w') as fobj:
+                    fobj.write(got)
+
+# Callback
+
+def cb_test_gen(base_class):
+    def call(input_dir, msg_dir, module_file, messages_file, dependencies):
+        # pylint: disable=no-init
+        class LintTC(base_class):
+            module = module_file.replace('.py', '')
+            output = messages_file
+            depends = dependencies or None
+            INPUT_DIR = input_dir
+            MSG_DIR = msg_dir
+        return LintTC
+    return call
+
+# Main function
+
+def make_tests(input_dir, msg_dir, filter_rgx, callbacks):
+    """generate tests classes from test info
+
+    return the list of generated test classes
+    """
+    if filter_rgx:
+        is_to_run = re.compile(filter_rgx).search
+    else:
+        is_to_run = lambda x: 1
+    tests = []
+    for module_file, messages_file in (
+            get_tests_info(input_dir, msg_dir, 'func_', '')
+    ):
+        if not is_to_run(module_file) or module_file.endswith(('.pyc', "$py.class")):
+            continue
+        base = module_file.replace('func_', '').replace('.py', '')
+
+        dependencies = get_tests_info(input_dir, msg_dir, base, '.py')
+
+        for callback in callbacks:
+            test = callback(input_dir, msg_dir, module_file, messages_file,
+                            dependencies)
+            if test:
+                tests.append(test)
+    return tests
+
+def tokenize_str(code):
+    return list(tokenize.generate_tokens(StringIO(code).readline))
+
+@contextlib.contextmanager
+def create_tempfile(content=None):
+    """Create a new temporary file.
+
+    If *content* parameter is given, then it will be written
+    in the temporary file, before passing it back.
+    This is a context manager and should be used with a *with* statement.
+    """
+    # Can't use tempfile.NamedTemporaryFile here
+    # because on Windows the file must be closed before writing to it,
+    # see http://bugs.python.org/issue14243
+    file_handle, tmp = tempfile.mkstemp()
+    if content:
+        if sys.version_info >= (3, 0):
+            # erff
+            os.write(file_handle, bytes(content, 'ascii'))
+        else:
+            os.write(file_handle, content)
+    try:
+        yield tmp
+    finally:
+        os.close(file_handle)
+        os.remove(tmp)
+
+@contextlib.contextmanager
+def create_file_backed_module(code):
+    """Create an astroid module for the given code, backed by a real file."""
+    with create_tempfile() as temp:
+        module = astroid.parse(code)
+        module.file = temp
+        yield module
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/utils.py	(revision 1126)
@@ -0,0 +1,1151 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""some various utilities and helper classes, most of them used in the
+main pylint class
+"""
+from __future__ import print_function
+
+import collections
+import itertools
+import os
+from os.path import dirname, basename, splitext, exists, isdir, join, normpath
+import re
+import sys
+import tokenize
+import warnings
+import textwrap
+
+import six
+from six.moves import zip  # pylint: disable=redefined-builtin
+
+from astroid import nodes, Module
+from astroid.modutils import modpath_from_file, get_module_files, \
+    file_from_modpath, load_module_from_file
+
+from pylint.interfaces import IRawChecker, ITokenChecker, UNDEFINED, implements
+from pylint.reporters.ureports.nodes import Section
+
+
+class UnknownMessage(Exception):
+    """raised when a unregistered message id is encountered"""
+
+class EmptyReport(Exception):
+    """raised when a report is empty and so should not be displayed"""
+
+
+MSG_TYPES = {
+    'I' : 'info',
+    'C' : 'convention',
+    'R' : 'refactor',
+    'W' : 'warning',
+    'E' : 'error',
+    'F' : 'fatal'
+    }
+MSG_TYPES_LONG = {v: k for k, v in six.iteritems(MSG_TYPES)}
+
+MSG_TYPES_STATUS = {
+    'I' : 0,
+    'C' : 16,
+    'R' : 8,
+    'W' : 4,
+    'E' : 2,
+    'F' : 1
+    }
+
+DEPRECATED_ALIASES = {
+    # New name, deprecated name.
+    'repr': 'backquote',
+    'expr': 'discard',
+    'assignname': 'assname',
+    'assignattr': 'assattr',
+    'attribute': 'getattr',
+    'call': 'callfunc',
+    'importfrom': 'from',
+    'classdef': 'class',
+    'functiondef': 'function',
+    'generatorexp': 'genexpr',
+}
+
+_MSG_ORDER = 'EWRCIF'
+MSG_STATE_SCOPE_CONFIG = 0
+MSG_STATE_SCOPE_MODULE = 1
+MSG_STATE_CONFIDENCE = 2
+
+# Allow stopping after the first semicolon encountered,
+# so that an option can be continued with the reasons
+# why it is active or disabled.
+OPTION_RGX = re.compile(r'\s*#.*\bpylint:\s*([^;]+);{0,1}')
+
+# The line/node distinction does not apply to fatal errors and reports.
+_SCOPE_EXEMPT = 'FR'
+
+class WarningScope(object):
+    LINE = 'line-based-msg'
+    NODE = 'node-based-msg'
+
+_MsgBase = collections.namedtuple(
+    '_MsgBase',
+    ['msg_id', 'symbol', 'msg', 'C', 'category', 'confidence',
+     'abspath', 'path', 'module', 'obj', 'line', 'column'])
+
+
+class Message(_MsgBase):
+    """This class represent a message to be issued by the reporters"""
+    def __new__(cls, msg_id, symbol, location, msg, confidence):
+        return _MsgBase.__new__(
+            cls, msg_id, symbol, msg, msg_id[0], MSG_TYPES[msg_id[0]],
+            confidence, *location)
+
+    def format(self, template):
+        """Format the message according to the given template.
+
+        The template format is the one of the format method :
+        cf. http://docs.python.org/2/library/string.html#formatstrings
+        """
+        # For some reason, _asdict on derived namedtuples does not work with
+        # Python 3.4. Needs some investigation.
+        return template.format(**dict(zip(self._fields, self)))
+
+
+def get_module_and_frameid(node):
+    """return the module name and the frame id in the module"""
+    frame = node.frame()
+    module, obj = '', []
+    while frame:
+        if isinstance(frame, Module):
+            module = frame.name
+        else:
+            obj.append(getattr(frame, 'name', '<lambda>'))
+        try:
+            frame = frame.parent.frame()
+        except AttributeError:
+            frame = None
+    obj.reverse()
+    return module, '.'.join(obj)
+
+def category_id(cid):
+    cid = cid.upper()
+    if cid in MSG_TYPES:
+        return cid
+    return MSG_TYPES_LONG.get(cid)
+
+
+def _decoding_readline(stream, encoding):
+    return lambda: stream.readline().decode(encoding, 'replace')
+
+
+def tokenize_module(module):
+    with module.stream() as stream:
+        readline = stream.readline
+        if sys.version_info < (3, 0):
+            if module.file_encoding is not None:
+                readline = _decoding_readline(stream, module.file_encoding)
+
+            return list(tokenize.generate_tokens(readline))
+        return list(tokenize.tokenize(readline))
+
+def build_message_def(checker, msgid, msg_tuple):
+    if implements(checker, (IRawChecker, ITokenChecker)):
+        default_scope = WarningScope.LINE
+    else:
+        default_scope = WarningScope.NODE
+    options = {}
+    if len(msg_tuple) > 3:
+        (msg, symbol, descr, options) = msg_tuple
+    elif len(msg_tuple) > 2:
+        (msg, symbol, descr) = msg_tuple[:3]
+    else:
+        # messages should have a symbol, but for backward compatibility
+        # they may not.
+        (msg, descr) = msg_tuple
+        warnings.warn("[pylint 0.26] description of message %s doesn't include "
+                      "a symbolic name" % msgid, DeprecationWarning)
+        symbol = None
+    options.setdefault('scope', default_scope)
+    return MessageDefinition(checker, msgid, msg, descr, symbol, **options)
+
+
+class MessageDefinition(object):
+    def __init__(self, checker, msgid, msg, descr, symbol, scope,
+                 minversion=None, maxversion=None, old_names=None):
+        self.checker = checker
+        assert len(msgid) == 5, 'Invalid message id %s' % msgid
+        assert msgid[0] in MSG_TYPES, \
+               'Bad message type %s in %r' % (msgid[0], msgid)
+        self.msgid = msgid
+        self.msg = msg
+        self.descr = descr
+        self.symbol = symbol
+        self.scope = scope
+        self.minversion = minversion
+        self.maxversion = maxversion
+        self.old_names = old_names or []
+
+    def may_be_emitted(self):
+        """return True if message may be emitted using the current interpreter"""
+        if self.minversion is not None and self.minversion > sys.version_info:
+            return False
+        if self.maxversion is not None and self.maxversion <= sys.version_info:
+            return False
+        return True
+
+    def format_help(self, checkerref=False):
+        """return the help string for the given message id"""
+        desc = self.descr
+        if checkerref:
+            desc += ' This message belongs to the %s checker.' % \
+                   self.checker.name
+        title = self.msg
+        if self.symbol:
+            msgid = '%s (%s)' % (self.symbol, self.msgid)
+        else:
+            msgid = self.msgid
+        if self.minversion or self.maxversion:
+            restr = []
+            if self.minversion:
+                restr.append('< %s' % '.'.join([str(n) for n in self.minversion]))
+            if self.maxversion:
+                restr.append('>= %s' % '.'.join([str(n) for n in self.maxversion]))
+            restr = ' or '.join(restr)
+            if checkerref:
+                desc += " It can't be emitted when using Python %s." % restr
+            else:
+                desc += " This message can't be emitted when using Python %s." % restr
+        desc = _normalize_text(' '.join(desc.split()), indent='  ')
+        if title != '%s':
+            title = title.splitlines()[0]
+            return ':%s: *%s*\n%s' % (msgid, title, desc)
+        return ':%s:\n%s' % (msgid, desc)
+
+
+class MessagesHandlerMixIn(object):
+    """a mix-in class containing all the messages related methods for the main
+    lint class
+    """
+
+    def __init__(self):
+        self._msgs_state = {}
+        self.msg_status = 0
+
+    def _checker_messages(self, checker):
+        for checker in self._checkers[checker.lower()]:
+            for msgid in checker.msgs:
+                yield msgid
+
+    def disable(self, msgid, scope='package', line=None, ignore_unknown=False):
+        """don't output message of the given id"""
+        assert scope in ('package', 'module')
+        # handle disable=all by disabling all categories
+        if msgid == 'all':
+            for msgid in MSG_TYPES:
+                self.disable(msgid, scope, line)
+            return
+        # msgid is a category?
+        catid = category_id(msgid)
+        if catid is not None:
+            for _msgid in self.msgs_store._msgs_by_category.get(catid):
+                self.disable(_msgid, scope, line)
+            return
+        # msgid is a checker name?
+        if msgid.lower() in self._checkers:
+            msgs_store = self.msgs_store
+            for checker in self._checkers[msgid.lower()]:
+                for _msgid in checker.msgs:
+                    if _msgid in msgs_store._alternative_names:
+                        self.disable(_msgid, scope, line)
+            return
+        # msgid is report id?
+        if msgid.lower().startswith('rp'):
+            self.disable_report(msgid)
+            return
+
+        try:
+            # msgid is a symbolic or numeric msgid.
+            msg = self.msgs_store.check_message_id(msgid)
+        except UnknownMessage:
+            if ignore_unknown:
+                return
+            raise
+
+        if scope == 'module':
+            self.file_state.set_msg_status(msg, line, False)
+            if msg.symbol != 'locally-disabled':
+                self.add_message('locally-disabled', line=line,
+                                 args=(msg.symbol, msg.msgid))
+
+        else:
+            msgs = self._msgs_state
+            msgs[msg.msgid] = False
+            # sync configuration object
+            self.config.disable = [self._message_symbol(mid)
+                                   for mid, val in six.iteritems(msgs)
+                                   if not val]
+
+    def _message_symbol(self, msgid):
+        """Get the message symbol of the given message id
+
+        Return the original message id if the message does not
+        exist.
+        """
+        try:
+            return self.msgs_store.check_message_id(msgid).symbol
+        except UnknownMessage:
+            return msgid
+
+    def enable(self, msgid, scope='package', line=None, ignore_unknown=False):
+        """reenable message of the given id"""
+        assert scope in ('package', 'module')
+        if msgid == 'all':
+            for msgid_ in MSG_TYPES:
+                self.enable(msgid_, scope=scope, line=line)
+            if not self._python3_porting_mode:
+                # Don't activate the python 3 porting checker if it
+                # wasn't activated explicitly.
+                self.disable('python3')
+            return
+        catid = category_id(msgid)
+        # msgid is a category?
+        if catid is not None:
+            for msgid in self.msgs_store._msgs_by_category.get(catid):
+                self.enable(msgid, scope, line)
+            return
+        # msgid is a checker name?
+        if msgid.lower() in self._checkers:
+            for checker in self._checkers[msgid.lower()]:
+                for msgid_ in checker.msgs:
+                    self.enable(msgid_, scope, line)
+            return
+        # msgid is report id?
+        if msgid.lower().startswith('rp'):
+            self.enable_report(msgid)
+            return
+
+        try:
+            # msgid is a symbolic or numeric msgid.
+            msg = self.msgs_store.check_message_id(msgid)
+        except UnknownMessage:
+            if ignore_unknown:
+                return
+            raise
+
+        if scope == 'module':
+            self.file_state.set_msg_status(msg, line, True)
+            self.add_message('locally-enabled', line=line, args=(msg.symbol, msg.msgid))
+        else:
+            msgs = self._msgs_state
+            msgs[msg.msgid] = True
+            # sync configuration object
+            self.config.enable = [mid for mid, val in six.iteritems(msgs) if val]
+
+    def get_message_state_scope(self, msgid, line=None, confidence=UNDEFINED):
+        """Returns the scope at which a message was enabled/disabled."""
+        if self.config.confidence and confidence.name not in self.config.confidence:
+            return MSG_STATE_CONFIDENCE
+        try:
+            if line in self.file_state._module_msgs_state[msgid]:
+                return MSG_STATE_SCOPE_MODULE
+        except (KeyError, TypeError):
+            return MSG_STATE_SCOPE_CONFIG
+
+    def is_message_enabled(self, msg_descr, line=None, confidence=None):
+        """return true if the message associated to the given message id is
+        enabled
+
+        msgid may be either a numeric or symbolic message id.
+        """
+        if self.config.confidence and confidence:
+            if confidence.name not in self.config.confidence:
+                return False
+        try:
+            msgid = self.msgs_store.check_message_id(msg_descr).msgid
+        except UnknownMessage:
+            # The linter checks for messages that are not registered
+            # due to version mismatch, just treat them as message IDs
+            # for now.
+            msgid = msg_descr
+        if line is None:
+            return self._msgs_state.get(msgid, True)
+        try:
+            return self.file_state._module_msgs_state[msgid][line]
+        except KeyError:
+            return self._msgs_state.get(msgid, True)
+
+    def add_message(self, msg_descr, line=None, node=None, args=None, confidence=UNDEFINED):
+        """Adds a message given by ID or name.
+
+        If provided, the message string is expanded using args
+
+        AST checkers should must the node argument (but may optionally
+        provide line if the line number is different), raw and token checkers
+        must provide the line argument.
+        """
+        msg_info = self.msgs_store.check_message_id(msg_descr)
+        msgid = msg_info.msgid
+        # backward compatibility, message may not have a symbol
+        symbol = msg_info.symbol or msgid
+        # Fatal messages and reports are special, the node/scope distinction
+        # does not apply to them.
+        if msgid[0] not in _SCOPE_EXEMPT:
+            if msg_info.scope == WarningScope.LINE:
+                assert node is None and line is not None, (
+                    'Message %s must only provide line, got line=%s, node=%s' % (msgid, line, node))
+            elif msg_info.scope == WarningScope.NODE:
+                # Node-based warnings may provide an override line.
+                assert node is not None, 'Message %s must provide Node, got None'
+
+        if line is None and node is not None:
+            line = node.fromlineno
+        if hasattr(node, 'col_offset'):
+            col_offset = node.col_offset # XXX measured in bytes for utf-8, divide by two for chars?
+        else:
+            col_offset = None
+        # should this message be displayed
+        if not self.is_message_enabled(msgid, line, confidence):
+            self.file_state.handle_ignored_message(
+                self.get_message_state_scope(msgid, line, confidence),
+                msgid, line, node, args, confidence)
+            return
+        # update stats
+        msg_cat = MSG_TYPES[msgid[0]]
+        self.msg_status |= MSG_TYPES_STATUS[msgid[0]]
+        self.stats[msg_cat] += 1
+        self.stats['by_module'][self.current_name][msg_cat] += 1
+        try:
+            self.stats['by_msg'][symbol] += 1
+        except KeyError:
+            self.stats['by_msg'][symbol] = 1
+        # expand message ?
+        msg = msg_info.msg
+        if args:
+            msg %= args
+        # get module and object
+        if node is None:
+            module, obj = self.current_name, ''
+            abspath = self.current_file
+        else:
+            module, obj = get_module_and_frameid(node)
+            abspath = node.root().file
+        path = abspath.replace(self.reporter.path_strip_prefix, '')
+        # add the message
+        self.reporter.handle_message(
+            Message(msgid, symbol,
+                    (abspath, path, module, obj, line or 1, col_offset or 0), msg, confidence))
+
+    def print_full_documentation(self):
+        """output a full documentation in ReST format"""
+        print("Pylint global options and switches")
+        print("----------------------------------")
+        print("")
+        print("Pylint provides global options and switches.")
+        print("")
+
+        by_checker = {}
+        for checker in self.get_checkers():
+            if checker.name == 'master':
+                if checker.options:
+                    for section, options in checker.options_by_section():
+                        if section is None:
+                            title = 'General options'
+                        else:
+                            title = '%s options' % section.capitalize()
+                        print(title)
+                        print('~' * len(title))
+                        _rest_format_section(sys.stdout, None, options)
+                        print("")
+            else:
+                try:
+                    by_checker[checker.name][0] += checker.options_and_values()
+                    by_checker[checker.name][1].update(checker.msgs)
+                    by_checker[checker.name][2] += checker.reports
+                except KeyError:
+                    by_checker[checker.name] = [list(checker.options_and_values()),
+                                                dict(checker.msgs),
+                                                list(checker.reports)]
+
+        print("Pylint checkers' options and switches")
+        print("-------------------------------------")
+        print("")
+        print("Pylint checkers can provide three set of features:")
+        print("")
+        print("* options that control their execution,")
+        print("* messages that they can raise,")
+        print("* reports that they can generate.")
+        print("")
+        print("Below is a list of all checkers and their features.")
+        print("")
+
+        for checker, (options, msgs, reports) in six.iteritems(by_checker):
+            title = '%s checker' % (checker.replace("_", " ").title())
+            print(title)
+            print('~' * len(title))
+            print("")
+            print("Verbatim name of the checker is ``%s``." % checker)
+            print("")
+            if options:
+                title = 'Options'
+                print(title)
+                print('^' * len(title))
+                _rest_format_section(sys.stdout, None, options)
+                print("")
+            if msgs:
+                title = 'Messages'
+                print(title)
+                print('~' * len(title))
+                for msgid, msg in sorted(six.iteritems(msgs),
+                                         key=lambda kv: (_MSG_ORDER.index(kv[0][0]), kv[1])):
+                    msg = build_message_def(checker, msgid, msg)
+                    print(msg.format_help(checkerref=False))
+                print("")
+            if reports:
+                title = 'Reports'
+                print(title)
+                print('~' * len(title))
+                for report in reports:
+                    print(':%s: %s' % report[:2])
+                print("")
+            print("")
+
+
+class FileState(object):
+    """Hold internal state specific to the currently analyzed file"""
+
+    def __init__(self, modname=None):
+        self.base_name = modname
+        self._module_msgs_state = {}
+        self._raw_module_msgs_state = {}
+        self._ignored_msgs = collections.defaultdict(set)
+        self._suppression_mapping = {}
+
+    def collect_block_lines(self, msgs_store, module_node):
+        """Walk the AST to collect block level options line numbers."""
+        for msg, lines in six.iteritems(self._module_msgs_state):
+            self._raw_module_msgs_state[msg] = lines.copy()
+        orig_state = self._module_msgs_state.copy()
+        self._module_msgs_state = {}
+        self._suppression_mapping = {}
+        self._collect_block_lines(msgs_store, module_node, orig_state)
+
+    def _collect_block_lines(self, msgs_store, node, msg_state):
+        """Recursivly walk (depth first) AST to collect block level options line
+        numbers.
+        """
+        for child in node.get_children():
+            self._collect_block_lines(msgs_store, child, msg_state)
+        first = node.fromlineno
+        last = node.tolineno
+        # first child line number used to distinguish between disable
+        # which are the first child of scoped node with those defined later.
+        # For instance in the code below:
+        #
+        # 1.   def meth8(self):
+        # 2.        """test late disabling"""
+        # 3.        # pylint: disable=E1102
+        # 4.        print self.blip
+        # 5.        # pylint: disable=E1101
+        # 6.        print self.bla
+        #
+        # E1102 should be disabled from line 1 to 6 while E1101 from line 5 to 6
+        #
+        # this is necessary to disable locally messages applying to class /
+        # function using their fromlineno
+        if (isinstance(node, (nodes.Module, nodes.ClassDef, nodes.FunctionDef))
+                and node.body):
+            firstchildlineno = node.body[0].fromlineno
+        else:
+            firstchildlineno = last
+        for msgid, lines in six.iteritems(msg_state):
+            for lineno, state in list(lines.items()):
+                original_lineno = lineno
+                if first > lineno or last < lineno:
+                    continue
+                # Set state for all lines for this block, if the
+                # warning is applied to nodes.
+                if  msgs_store.check_message_id(msgid).scope == WarningScope.NODE:
+                    if lineno > firstchildlineno:
+                        state = True
+                    first_, last_ = node.block_range(lineno)
+                else:
+                    first_ = lineno
+                    last_ = last
+                for line in range(first_, last_+1):
+                    # do not override existing entries
+                    if line in self._module_msgs_state.get(msgid, ()):
+                        continue
+                    if line in lines: # state change in the same block
+                        state = lines[line]
+                        original_lineno = line
+                    if not state:
+                        self._suppression_mapping[(msgid, line)] = original_lineno
+                    try:
+                        self._module_msgs_state[msgid][line] = state
+                    except KeyError:
+                        self._module_msgs_state[msgid] = {line: state}
+                del lines[lineno]
+
+    def set_msg_status(self, msg, line, status):
+        """Set status (enabled/disable) for a given message at a given line"""
+        assert line > 0
+        try:
+            self._module_msgs_state[msg.msgid][line] = status
+        except KeyError:
+            self._module_msgs_state[msg.msgid] = {line: status}
+
+    def handle_ignored_message(self, state_scope, msgid, line,
+                               node, args, confidence): # pylint: disable=unused-argument
+        """Report an ignored message.
+
+        state_scope is either MSG_STATE_SCOPE_MODULE or MSG_STATE_SCOPE_CONFIG,
+        depending on whether the message was disabled locally in the module,
+        or globally. The other arguments are the same as for add_message.
+        """
+        if state_scope == MSG_STATE_SCOPE_MODULE:
+            try:
+                orig_line = self._suppression_mapping[(msgid, line)]
+                self._ignored_msgs[(msgid, orig_line)].add(line)
+            except KeyError:
+                pass
+
+    def iter_spurious_suppression_messages(self, msgs_store):
+        for warning, lines in six.iteritems(self._raw_module_msgs_state):
+            for line, enable in six.iteritems(lines):
+                if not enable and (warning, line) not in self._ignored_msgs:
+                    yield 'useless-suppression', line, \
+                        (msgs_store.get_msg_display_string(warning),)
+        # don't use iteritems here, _ignored_msgs may be modified by add_message
+        for (warning, from_), lines in list(self._ignored_msgs.items()):
+            for line in lines:
+                yield 'suppressed-message', line, \
+                    (msgs_store.get_msg_display_string(warning), from_)
+
+
+class MessagesStore(object):
+    """The messages store knows information about every possible message but has
+    no particular state during analysis.
+    """
+
+    def __init__(self):
+        # Primary registry for all active messages (i.e. all messages
+        # that can be emitted by pylint for the underlying Python
+        # version). It contains the 1:1 mapping from symbolic names
+        # to message definition objects.
+        self._messages = {}
+        # Maps alternative names (numeric IDs, deprecated names) to
+        # message definitions. May contain several names for each definition
+        # object.
+        self._alternative_names = {}
+        self._msgs_by_category = collections.defaultdict(list)
+
+    @property
+    def messages(self):
+        """The list of all active messages."""
+        return six.itervalues(self._messages)
+
+    def add_renamed_message(self, old_id, old_symbol, new_symbol):
+        """Register the old ID and symbol for a warning that was renamed.
+
+        This allows users to keep using the old ID/symbol in suppressions.
+        """
+        msg = self.check_message_id(new_symbol)
+        msg.old_names.append((old_id, old_symbol))
+        self._alternative_names[old_id] = msg
+        self._alternative_names[old_symbol] = msg
+
+    def register_messages(self, checker):
+        """register a dictionary of messages
+
+        Keys are message ids, values are a 2-uple with the message type and the
+        message itself
+
+        message ids should be a string of len 4, where the two first characters
+        are the checker id and the two last the message id in this checker
+        """
+        chkid = None
+        for msgid, msg_tuple in six.iteritems(checker.msgs):
+            msg = build_message_def(checker, msgid, msg_tuple)
+            assert msg.symbol not in self._messages, \
+                    'Message symbol %r is already defined' % msg.symbol
+            # avoid duplicate / malformed ids
+            assert msg.msgid not in self._alternative_names, \
+                   'Message id %r is already defined' % msgid
+            assert chkid is None or chkid == msg.msgid[1:3], \
+                   'Inconsistent checker part in message id %r' % msgid
+            chkid = msg.msgid[1:3]
+            self._messages[msg.symbol] = msg
+            self._alternative_names[msg.msgid] = msg
+            for old_id, old_symbol in msg.old_names:
+                self._alternative_names[old_id] = msg
+                self._alternative_names[old_symbol] = msg
+            self._msgs_by_category[msg.msgid[0]].append(msg.msgid)
+
+    def check_message_id(self, msgid):
+        """returns the Message object for this message.
+
+        msgid may be either a numeric or symbolic id.
+
+        Raises UnknownMessage if the message id is not defined.
+        """
+        if msgid[1:].isdigit():
+            msgid = msgid.upper()
+        for source in (self._alternative_names, self._messages):
+            try:
+                return source[msgid]
+            except KeyError:
+                pass
+        raise UnknownMessage('No such message id %s' % msgid)
+
+    def get_msg_display_string(self, msgid):
+        """Generates a user-consumable representation of a message.
+
+        Can be just the message ID or the ID and the symbol.
+        """
+        return repr(self.check_message_id(msgid).symbol)
+
+    def help_message(self, msgids):
+        """display help messages for the given message identifiers"""
+        for msgid in msgids:
+            try:
+                print(self.check_message_id(msgid).format_help(checkerref=True))
+                print("")
+            except UnknownMessage as ex:
+                print(ex)
+                print("")
+                continue
+
+    def list_messages(self):
+        """output full messages list documentation in ReST format"""
+        msgs = sorted(six.itervalues(self._messages), key=lambda msg: msg.msgid)
+        for msg in msgs:
+            if not msg.may_be_emitted():
+                continue
+            print(msg.format_help(checkerref=False))
+        print("")
+
+
+class ReportsHandlerMixIn(object):
+    """a mix-in class containing all the reports and stats manipulation
+    related methods for the main lint class
+    """
+    def __init__(self):
+        self._reports = collections.defaultdict(list)
+        self._reports_state = {}
+
+    def report_order(self):
+        """ Return a list of reports, sorted in the order
+        in which they must be called.
+        """
+        return list(self._reports)
+
+    def register_report(self, reportid, r_title, r_cb, checker):
+        """register a report
+
+        reportid is the unique identifier for the report
+        r_title the report's title
+        r_cb the method to call to make the report
+        checker is the checker defining the report
+        """
+        reportid = reportid.upper()
+        self._reports[checker].append((reportid, r_title, r_cb))
+
+    def enable_report(self, reportid):
+        """disable the report of the given id"""
+        reportid = reportid.upper()
+        self._reports_state[reportid] = True
+
+    def disable_report(self, reportid):
+        """disable the report of the given id"""
+        reportid = reportid.upper()
+        self._reports_state[reportid] = False
+
+    def report_is_enabled(self, reportid):
+        """return true if the report associated to the given identifier is
+        enabled
+        """
+        return self._reports_state.get(reportid, True)
+
+    def make_reports(self, stats, old_stats):
+        """render registered reports"""
+        sect = Section('Report',
+                       '%s statements analysed.'% (self.stats['statement']))
+        for checker in self.report_order():
+            for reportid, r_title, r_cb in self._reports[checker]:
+                if not self.report_is_enabled(reportid):
+                    continue
+                report_sect = Section(r_title)
+                try:
+                    r_cb(report_sect, stats, old_stats)
+                except EmptyReport:
+                    continue
+                report_sect.report_id = reportid
+                sect.append(report_sect)
+        return sect
+
+    def add_stats(self, **kwargs):
+        """add some stats entries to the statistic dictionary
+        raise an AssertionError if there is a key conflict
+        """
+        for key, value in six.iteritems(kwargs):
+            if key[-1] == '_':
+                key = key[:-1]
+            assert key not in self.stats
+            self.stats[key] = value
+        return self.stats
+
+
+def expand_modules(files_or_modules, black_list):
+    """take a list of files/modules/packages and return the list of tuple
+    (file, module name) which have to be actually checked
+    """
+    result = []
+    errors = []
+    for something in files_or_modules:
+        if exists(something):
+            # this is a file or a directory
+            try:
+                modname = '.'.join(modpath_from_file(something))
+            except ImportError:
+                modname = splitext(basename(something))[0]
+            if isdir(something):
+                filepath = join(something, '__init__.py')
+            else:
+                filepath = something
+        else:
+            # suppose it's a module or package
+            modname = something
+            try:
+                filepath = file_from_modpath(modname.split('.'))
+                if filepath is None:
+                    continue
+            except (ImportError, SyntaxError) as ex:
+                # FIXME p3k : the SyntaxError is a Python bug and should be
+                # removed as soon as possible http://bugs.python.org/issue10588
+                errors.append({'key': 'fatal', 'mod': modname, 'ex': ex})
+                continue
+	if getattr(filepath,"copy",None)==None:
+	  filepath = normpath(filepath)
+	else:
+	  filepath = filepath.copy(normpath(filepath))
+        result.append({'path': filepath, 'name': modname, 'isarg': True,
+                       'basepath': filepath, 'basename': modname})
+        if not (modname.endswith('.__init__') or modname == '__init__') \
+                and '__init__.py' in filepath:
+            for subfilepath in get_module_files(dirname(filepath), black_list):
+                if filepath == subfilepath:
+                    continue
+                submodname = '.'.join(modpath_from_file(subfilepath))
+                result.append({'path': subfilepath, 'name': submodname,
+                               'isarg': False,
+                               'basepath': filepath, 'basename': modname})
+    return result, errors
+
+
+class PyLintASTWalker(object):
+
+    def __init__(self, linter):
+        # callbacks per node types
+        self.nbstatements = 0
+        self.visit_events = collections.defaultdict(list)
+        self.leave_events = collections.defaultdict(list)
+        self.linter = linter
+
+    def _is_method_enabled(self, method):
+        if not hasattr(method, 'checks_msgs'):
+            return True
+        for msg_desc in method.checks_msgs:
+            if self.linter.is_message_enabled(msg_desc):
+                return True
+        return False
+
+    def add_checker(self, checker):
+        """walk to the checker's dir and collect visit and leave methods"""
+        # XXX : should be possible to merge needed_checkers and add_checker
+        vcids = set()
+        lcids = set()
+        visits = self.visit_events
+        leaves = self.leave_events
+        for member in dir(checker):
+            cid = member[6:]
+            if cid == 'default':
+                continue
+            if member.startswith('visit_'):
+                v_meth = getattr(checker, member)
+                # don't use visit_methods with no activated message:
+                if self._is_method_enabled(v_meth):
+                    visits[cid].append(v_meth)
+                    vcids.add(cid)
+            elif member.startswith('leave_'):
+                l_meth = getattr(checker, member)
+                # don't use leave_methods with no activated message:
+                if self._is_method_enabled(l_meth):
+                    leaves[cid].append(l_meth)
+                    lcids.add(cid)
+        visit_default = getattr(checker, 'visit_default', None)
+        if visit_default:
+            for cls in nodes.ALL_NODE_CLASSES:
+                cid = cls.__name__.lower()
+                if cid not in vcids:
+                    visits[cid].append(visit_default)
+        # for now we have no "leave_default" method in Pylint
+
+    def walk(self, astroid):
+        """call visit events of astroid checkers for the given node, recurse on
+        its children, then leave events.
+        """
+        cid = astroid.__class__.__name__.lower()
+
+        # Detect if the node is a new name for a deprecated alias.
+        # In this case, favour the methods for the deprecated
+        # alias if any,  in order to maintain backwards
+        # compatibility.
+        old_cid = DEPRECATED_ALIASES.get(cid)
+        visit_events = ()
+        leave_events = ()
+
+        if old_cid:
+            visit_events = self.visit_events.get(old_cid, ())
+            leave_events = self.leave_events.get(old_cid, ())
+            if visit_events or leave_events:
+                msg = ("Implemented method {meth}_{old} instead of {meth}_{new}. "
+                       "This will be supported until Pylint 2.0.")
+                if visit_events:
+                    warnings.warn(msg.format(meth="visit", old=old_cid, new=cid),
+                                  PendingDeprecationWarning)
+                if leave_events:
+                    warnings.warn(msg.format(meth="leave", old=old_cid, new=cid),
+                                  PendingDeprecationWarning)
+
+        visit_events = itertools.chain(visit_events,
+                                       self.visit_events.get(cid, ()))
+        leave_events = itertools.chain(leave_events,
+                                       self.leave_events.get(cid, ()))
+
+        if astroid.is_statement:
+            self.nbstatements += 1
+        # generate events for this node on each checker
+        for cb in visit_events or ():
+            cb(astroid)
+        # recurse on children
+        for child in astroid.get_children():
+            self.walk(child)
+        for cb in leave_events or ():
+            cb(astroid)
+
+
+PY_EXTS = ('.py', '.pyc', '.pyo', '.pyw', '.so', '.dll')
+
+def register_plugins(linter, directory):
+    """load all module and package in the given directory, looking for a
+    'register' function in each one, used to register pylint checkers
+    """
+    imported = {}
+    for filename in os.listdir(directory):
+        base, extension = splitext(filename)
+        if base in imported or base == '__pycache__':
+            continue
+        if extension in PY_EXTS and base != '__init__' or (
+                not extension and isdir(join(directory, base))):
+            try:
+                module = load_module_from_file(join(directory, filename))
+            except ValueError:
+                # empty module name (usually emacs auto-save files)
+                continue
+            except ImportError as exc:
+                print("Problem importing module %s: %s" % (filename, exc),
+                      file=sys.stderr)
+            else:
+                if hasattr(module, 'register'):
+                    module.register(linter)
+                    imported[base] = 1
+
+def get_global_option(checker, option, default=None):
+    """ Retrieve an option defined by the given *checker* or
+    by all known option providers.
+
+    It will look in the list of all options providers
+    until the given *option* will be found.
+    If the option wasn't found, the *default* value will be returned.
+    """
+    # First, try in the given checker's config.
+    # After that, look in the options providers.
+
+    try:
+        return getattr(checker.config, option.replace("-", "_"))
+    except AttributeError:
+        pass
+    for provider in checker.linter.options_providers:
+        for options in provider.options:
+            if options[0] == option:
+                return getattr(provider.config, option.replace("-", "_"))
+    return default
+
+
+def deprecated_option(shortname=None, opt_type=None, help_msg=None):
+    def _warn_deprecated(option, optname, *args): # pylint: disable=unused-argument
+        msg = ("Warning: option %s is obsolete and "
+               "it is slated for removal in Pylint 1.6.\n")
+        sys.stderr.write(msg % (optname,))
+
+    option = {
+        'help': help_msg,
+        'hide': True,
+        'type': opt_type,
+        'action': 'callback',
+        'callback': _warn_deprecated,
+        'deprecated': True
+    }
+    if shortname:
+        option['shortname'] = shortname
+    return option
+
+
+def _splitstrip(string, sep=','):
+    """return a list of stripped string by splitting the string given as
+    argument on `sep` (',' by default). Empty string are discarded.
+
+    >>> _splitstrip('a, b, c   ,  4,,')
+    ['a', 'b', 'c', '4']
+    >>> _splitstrip('a')
+    ['a']
+    >>>
+
+    :type string: str or unicode
+    :param string: a csv line
+
+    :type sep: str or unicode
+    :param sep: field separator, default to the comma (',')
+
+    :rtype: str or unicode
+    :return: the unquoted string (or the input string if it wasn't quoted)
+    """
+    return [word.strip() for word in string.split(sep) if word.strip()]
+
+
+def _unquote(string):
+    """remove optional quotes (simple or double) from the string
+
+    :type string: str or unicode
+    :param string: an optionally quoted string
+
+    :rtype: str or unicode
+    :return: the unquoted string (or the input string if it wasn't quoted)
+    """
+    if not string:
+        return string
+    if string[0] in '"\'':
+        string = string[1:]
+    if string[-1] in '"\'':
+        string = string[:-1]
+    return string
+
+
+def _normalize_text(text, line_len=80, indent=''):
+    """Wrap the text on the given line length."""
+    return '\n'.join(textwrap.wrap(text, width=line_len, initial_indent=indent,
+                                   subsequent_indent=indent))
+
+
+def _check_csv(value):
+    if isinstance(value, (list, tuple)):
+        return value
+    return _splitstrip(value)
+
+
+if six.PY2:
+    def _encode(string, encoding):
+        # pylint: disable=undefined-variable
+        if isinstance(string, unicode):
+            return string.encode(encoding)
+        return str(string)
+else:
+    def _encode(string, _):
+        return str(string)
+
+def _get_encoding(encoding, stream):
+    encoding = encoding or getattr(stream, 'encoding', None)
+    if not encoding:
+        import locale
+        encoding = locale.getpreferredencoding()
+    return encoding
+
+
+def _comment(string):
+    """return string as a comment"""
+    lines = [line.strip() for line in string.splitlines()]
+    return '# ' + ('%s# ' % os.linesep).join(lines)
+
+
+def _format_option_value(optdict, value):
+    """return the user input's value from a 'compiled' value"""
+    if isinstance(value, (list, tuple)):
+        value = ','.join(value)
+    elif isinstance(value, dict):
+        value = ','.join('%s:%s' % (k, v) for k, v in value.items())
+    elif hasattr(value, 'match'): # optdict.get('type') == 'regexp'
+        # compiled regexp
+        value = value.pattern
+    elif optdict.get('type') == 'yn':
+        value = value and 'yes' or 'no'
+    elif isinstance(value, six.string_types) and value.isspace():
+        value = "'%s'" % value
+    return value
+
+
+def _ini_format_section(stream, section, options, encoding=None, doc=None):
+    """format an options section using the INI format"""
+    encoding = _get_encoding(encoding, stream)
+    if doc:
+        print(_encode(_comment(doc), encoding), file=stream)
+    print('[%s]' % section, file=stream)
+    _ini_format(stream, options, encoding)
+
+
+def _ini_format(stream, options, encoding):
+    """format options using the INI format"""
+    for optname, optdict, value in options:
+        value = _format_option_value(optdict, value)
+        help = optdict.get('help')
+        if help:
+            help = _normalize_text(help, line_len=79, indent='# ')
+            print(file=stream)
+            print(_encode(help, encoding), file=stream)
+        else:
+            print(file=stream)
+        if value is None:
+            print('#%s=' % optname, file=stream)
+        else:
+            value = _encode(value, encoding).strip()
+            print('%s=%s' % (optname, value), file=stream)
+
+format_section = _ini_format_section
+
+
+def _rest_format_section(stream, section, options, encoding=None, doc=None):
+    """format an options section using as ReST formatted output"""
+    encoding = _get_encoding(encoding, stream)
+    if section:
+        print('%s\n%s' % (section, "'"*len(section)), file=stream)
+    if doc:
+        print(_encode(_normalize_text(doc, line_len=79, indent=''), encoding), file=stream)
+        print(file=stream)
+    for optname, optdict, value in options:
+        help = optdict.get('help')
+        print(':%s:' % optname, file=stream)
+        if help:
+            help = _normalize_text(help, line_len=79, indent='  ')
+            print(_encode(help, encoding), file=stream)
+        if value:
+            value = _encode(_format_option_value(optdict, value), encoding)
+            print(file=stream)
+            print('  Default: ``%s``' % value.replace("`` ", "```` ``"), file=stream)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/graph.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/graph.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/graph.py	(revision 1126)
@@ -0,0 +1,179 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# This file was copied from logilab-common with the same license:
+# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+"""Graph manipulation utilities.
+
+(dot generation adapted from pypy/translator/tool/make_dot.py)
+"""
+
+import os.path as osp
+import os
+import sys
+import tempfile
+import codecs
+
+def target_info_from_filename(filename):
+    """Transforms /some/path/foo.png into ('/some/path', 'foo.png', 'png')."""
+    basename = osp.basename(filename)
+    storedir = osp.dirname(osp.abspath(filename))
+    target = filename.split('.')[-1]
+    return storedir, basename, target
+
+
+class DotBackend(object):
+    """Dot File backend."""
+    def __init__(self, graphname, rankdir=None, size=None, ratio=None,
+                 charset='utf-8', renderer='dot', additional_param=None):
+        if additional_param is None:
+            additional_param = {}
+        self.graphname = graphname
+        self.renderer = renderer
+        self.lines = []
+        self._source = None
+        self.emit("digraph %s {" % normalize_node_id(graphname))
+        if rankdir:
+            self.emit('rankdir=%s' % rankdir)
+        if ratio:
+            self.emit('ratio=%s' % ratio)
+        if size:
+            self.emit('size="%s"' % size)
+        if charset:
+            assert charset.lower() in ('utf-8', 'iso-8859-1', 'latin1'), \
+                   'unsupported charset %s' % charset
+            self.emit('charset="%s"' % charset)
+        for param in additional_param.items():
+            self.emit('='.join(param))
+
+    def get_source(self):
+        """returns self._source"""
+        if self._source is None:
+            self.emit("}\n")
+            self._source = '\n'.join(self.lines)
+            del self.lines
+        return self._source
+
+    source = property(get_source)
+
+    def generate(self, outputfile=None, dotfile=None, mapfile=None):
+        """Generates a graph file.
+
+        :param outputfile: filename and path [defaults to graphname.png]
+        :param dotfile: filename and path [defaults to graphname.dot]
+
+        :rtype: str
+        :return: a path to the generated file
+        """
+        import subprocess # introduced in py 2.4
+        name = self.graphname
+        if not dotfile:
+            # if 'outputfile' is a dot file use it as 'dotfile'
+            if outputfile and outputfile.endswith(".dot"):
+                dotfile = outputfile
+            else:
+                dotfile = '%s.dot' % name
+        if outputfile is not None:
+            storedir, _, target = target_info_from_filename(outputfile)
+            if target != "dot":
+                pdot, dot_sourcepath = tempfile.mkstemp(".dot", name)
+                os.close(pdot)
+            else:
+                dot_sourcepath = osp.join(storedir, dotfile)
+        else:
+            target = 'png'
+            pdot, dot_sourcepath = tempfile.mkstemp(".dot", name)
+            ppng, outputfile = tempfile.mkstemp(".png", name)
+            os.close(pdot)
+            os.close(ppng)
+        pdot = codecs.open(dot_sourcepath, 'w', encoding='utf8')
+        pdot.write(self.source)
+        pdot.close()
+        if target != 'dot':
+            use_shell = sys.platform == 'win32'
+            if mapfile:
+                subprocess.call([self.renderer, '-Tcmapx', '-o',
+                                 mapfile, '-T', target, dot_sourcepath,
+                                 '-o', outputfile],
+                                shell=use_shell)
+            else:
+                subprocess.call([self.renderer, '-T', target,
+                                 dot_sourcepath, '-o', outputfile],
+                                shell=use_shell)
+            os.unlink(dot_sourcepath)
+        return outputfile
+
+    def emit(self, line):
+        """Adds <line> to final output."""
+        self.lines.append(line)
+
+    def emit_edge(self, name1, name2, **props):
+        """emit an edge from <name1> to <name2>.
+        edge properties: see http://www.graphviz.org/doc/info/attrs.html
+        """
+        attrs = ['%s="%s"' % (prop, value) for prop, value in props.items()]
+        n_from, n_to = normalize_node_id(name1), normalize_node_id(name2)
+        self.emit('%s -> %s [%s];' % (n_from, n_to, ', '.join(sorted(attrs))))
+
+    def emit_node(self, name, **props):
+        """emit a node with given properties.
+        node properties: see http://www.graphviz.org/doc/info/attrs.html
+        """
+        attrs = ['%s="%s"' % (prop, value) for prop, value in props.items()]
+        self.emit('%s [%s];' % (normalize_node_id(name), ', '.join(sorted(attrs))))
+
+def normalize_node_id(nid):
+    """Returns a suitable DOT node id for `nid`."""
+    return '"%s"' % nid
+
+def get_cycles(graph_dict, vertices=None):
+    '''given a dictionary representing an ordered graph (i.e. key are vertices
+    and values is a list of destination vertices representing edges), return a
+    list of detected cycles
+    '''
+    if not graph_dict:
+        return ()
+    result = []
+    if vertices is None:
+        vertices = graph_dict.keys()
+    for vertice in vertices:
+        _get_cycles(graph_dict, [], set(), result, vertice)
+    return result
+
+def _get_cycles(graph_dict, path, visited, result, vertice):
+    """recursive function doing the real work for get_cycles"""
+    if vertice in path:
+        cycle = [vertice]
+        for node in path[::-1]:
+            if node == vertice:
+                break
+            cycle.insert(0, node)
+        # make a canonical representation
+        start_from = min(cycle)
+        index = cycle.index(start_from)
+        cycle = cycle[index:] + cycle[0:index]
+        # append it to result if not already in
+        if cycle not in result:
+            result.append(cycle)
+        return
+    path.append(vertice)
+    try:
+        for node in graph_dict[vertice]:
+            # don't check already visited nodes again
+            if node not in visited:
+                _get_cycles(graph_dict, path, visited, result, node)
+                visited.add(node)
+    except KeyError:
+        pass
+    path.pop()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/config.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/config.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/config.py	(revision 1126)
@@ -0,0 +1,807 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""utilities for Pylint configuration :
+
+* pylintrc
+* pylint.d (PYLINTHOME)
+"""
+from __future__ import print_function
+
+# TODO(cpopa): this module contains the logic for the
+# configuration parser and for the command line parser,
+# but it's really coupled to optparse's internals.
+# The code was copied almost verbatim from logilab.common,
+# in order to not depend on it anymore and it will definitely
+# need a cleanup. It could be completely reengineered as well.
+
+import contextlib
+import copy
+import optparse
+import os
+import pickle
+import re
+import sys
+import time
+
+from six.moves import configparser
+from six.moves import range
+
+from pylint import utils
+
+
+USER_HOME = os.path.expanduser('~')
+if 'PYLINTHOME' in os.environ:
+    PYLINT_HOME = os.environ['PYLINTHOME']
+    if USER_HOME == '~':
+        USER_HOME = os.path.dirname(PYLINT_HOME)
+elif USER_HOME == '~':
+    PYLINT_HOME = ".pylint.d"
+else:
+    PYLINT_HOME = os.path.join(USER_HOME, '.pylint.d')
+
+
+def _get_pdata_path(base_name, recurs):
+    base_name = base_name.replace(os.sep, '_')
+    return os.path.join(PYLINT_HOME, "%s%s%s"%(base_name, recurs, '.stats'))
+
+
+def load_results(base):
+    data_file = _get_pdata_path(base, 1)
+    try:
+        with open(data_file, _PICK_LOAD) as stream:
+            return pickle.load(stream)
+    except Exception: # pylint: disable=broad-except
+        return {}
+
+if sys.version_info < (3, 0):
+    _PICK_DUMP, _PICK_LOAD = 'w', 'r'
+else:
+    _PICK_DUMP, _PICK_LOAD = 'wb', 'rb'
+
+def save_results(results, base):
+    if not os.path.exists(PYLINT_HOME):
+        try:
+            os.mkdir(PYLINT_HOME)
+        except OSError:
+            print('Unable to create directory %s' % PYLINT_HOME, file=sys.stderr)
+    data_file = _get_pdata_path(base, 1)
+    try:
+        with open(data_file, _PICK_DUMP) as stream:
+            pickle.dump(results, stream)
+    except (IOError, OSError) as ex:
+        print('Unable to create file %s: %s' % (data_file, ex), file=sys.stderr)
+
+
+def find_pylintrc():
+    """search the pylint rc file and return its path if it find it, else None
+    """
+    # is there a pylint rc file in the current directory ?
+    if os.path.exists('pylintrc'):
+        return os.path.abspath('pylintrc')
+    if os.path.exists('.pylintrc'):
+        return os.path.abspath('.pylintrc')
+    if os.path.isfile('__init__.py'):
+        curdir = os.path.abspath(os.getcwd())
+        while os.path.isfile(os.path.join(curdir, '__init__.py')):
+            curdir = os.path.abspath(os.path.join(curdir, '..'))
+            if os.path.isfile(os.path.join(curdir, 'pylintrc')):
+                return os.path.join(curdir, 'pylintrc')
+            if os.path.isfile(os.path.join(curdir, '.pylintrc')):
+                return os.path.join(curdir, '.pylintrc')
+    if 'PYLINTRC' in os.environ and os.path.exists(os.environ['PYLINTRC']):
+        pylintrc = os.environ['PYLINTRC']
+    else:
+        user_home = os.path.expanduser('~')
+        if user_home == '~' or user_home == '/root':
+            pylintrc = ".pylintrc"
+        else:
+            pylintrc = os.path.join(user_home, '.pylintrc')
+            if not os.path.isfile(pylintrc):
+                pylintrc = os.path.join(user_home, '.config', 'pylintrc')
+    if not os.path.isfile(pylintrc):
+        if os.path.isfile('/etc/pylintrc'):
+            pylintrc = '/etc/pylintrc'
+        else:
+            pylintrc = None
+    return pylintrc
+
+PYLINTRC = find_pylintrc()
+
+ENV_HELP = '''
+The following environment variables are used:
+    * PYLINTHOME
+    Path to the directory where the persistent for the run will be stored. If
+not found, it defaults to ~/.pylint.d/ or .pylint.d (in the current working
+directory).
+    * PYLINTRC
+    Path to the configuration file. See the documentation for the method used
+to search for configuration file.
+''' % globals()
+
+
+class UnsupportedAction(Exception):
+    """raised by set_option when it doesn't know what to do for an action"""
+
+
+def _choice_validator(optdict, name, value):
+    if value not in optdict['choices']:
+        msg = "option %s: invalid value: %r, should be in %s"
+        raise optparse.OptionValueError(msg % (name, value, optdict['choices']))
+    return value
+
+
+def _multiple_choice_validator(optdict, name, value):
+    choices = optdict['choices']
+    values = utils._check_csv(value)
+    for value in values:
+        if value not in choices:
+            msg = "option %s: invalid value: %r, should be in %s"
+            raise optparse.OptionValueError(msg % (name, value, choices))
+    return values
+
+
+# pylint: disable=unused-argument
+def _csv_validator(_, name, value):
+    return utils._check_csv(value)
+
+
+# pylint: disable=unused-argument
+def _regexp_validator(_, name, value):
+    if hasattr(value, 'pattern'):
+        return value
+    return re.compile(value)
+
+
+def _yn_validator(opt, _, value):
+    if isinstance(value, int):
+        return bool(value)
+    if value in ('y', 'yes'):
+        return True
+    if value in ('n', 'no'):
+        return False
+    msg = "option %s: invalid yn value %r, should be in (y, yes, n, no)"
+    raise optparse.OptionValueError(msg % (opt, value))
+
+
+VALIDATORS = {
+    'string': utils._unquote,
+    'int': int,
+    'regexp': re.compile,
+    'csv': _csv_validator,
+    'yn': _yn_validator,
+    'choice': _choice_validator,
+    'multiple_choice': _multiple_choice_validator,
+}
+
+def _call_validator(opttype, optdict, option, value):
+    if opttype not in VALIDATORS:
+        raise Exception('Unsupported type "%s"' % opttype)
+    try:
+        return VALIDATORS[opttype](optdict, option, value)
+    except TypeError:
+        try:
+            return VALIDATORS[opttype](value)
+        except Exception:
+            raise optparse.OptionValueError('%s value (%r) should be of type %s' %
+                                            (option, value, opttype))
+
+
+def _validate(value, optdict, name=''):
+    """return a validated value for an option according to its type
+
+    optional argument name is only used for error message formatting
+    """
+    try:
+        _type = optdict['type']
+    except KeyError:
+        # FIXME
+        return value
+    return _call_validator(_type, optdict, name, value)
+
+
+def _level_options(group, outputlevel):
+    return [option for option in group.option_list
+            if (getattr(option, 'level', 0) or 0) <= outputlevel
+            and option.help is not optparse.SUPPRESS_HELP]
+
+
+def _expand_default(self, option):
+    """Patch OptionParser.expand_default with custom behaviour
+
+    This will handle defaults to avoid overriding values in the
+    configuration file.
+    """
+    if self.parser is None or not self.default_tag:
+        return option.help
+    optname = option._long_opts[0][2:]
+    try:
+        provider = self.parser.options_manager._all_options[optname]
+    except KeyError:
+        value = None
+    else:
+        optdict = provider.get_option_def(optname)
+        optname = provider.option_attrname(optname, optdict)
+        value = getattr(provider.config, optname, optdict)
+        value = utils._format_option_value(optdict, value)
+    if value is optparse.NO_DEFAULT or not value:
+        value = self.NO_DEFAULT_VALUE
+    return option.help.replace(self.default_tag, str(value))
+
+
+@contextlib.contextmanager
+def _patch_optparse():
+    orig_default = optparse.HelpFormatter
+    try:
+        optparse.HelpFormatter.expand_default = _expand_default
+        yield
+    finally:
+        optparse.HelpFormatter.expand_default = orig_default
+
+
+class Option(optparse.Option):
+    TYPES = optparse.Option.TYPES + ('regexp', 'csv', 'yn', 'multiple_choice')
+    ATTRS = optparse.Option.ATTRS + ['hide', 'level']
+    TYPE_CHECKER = copy.copy(optparse.Option.TYPE_CHECKER)
+    TYPE_CHECKER['regexp'] = _regexp_validator
+    TYPE_CHECKER['csv'] = _csv_validator
+    TYPE_CHECKER['yn'] = _yn_validator
+    TYPE_CHECKER['multiple_choice'] = _multiple_choice_validator
+
+    def __init__(self, *opts, **attrs):
+        optparse.Option.__init__(self, *opts, **attrs)
+        if hasattr(self, "hide") and self.hide:
+            self.help = optparse.SUPPRESS_HELP
+
+    def _check_choice(self):
+        if self.type in ("choice", "multiple_choice"):
+            if self.choices is None:
+                raise optparse.OptionError(
+                    "must supply a list of choices for type 'choice'", self)
+            elif not isinstance(self.choices, (tuple, list)):
+                raise optparse.OptionError(
+                    "choices must be a list of strings ('%s' supplied)"
+                    % str(type(self.choices)).split("'")[1], self)
+        elif self.choices is not None:
+            raise optparse.OptionError(
+                "must not supply choices for type %r" % self.type, self)
+    optparse.Option.CHECK_METHODS[2] = _check_choice
+
+    def process(self, opt, value, values, parser):
+        # First, convert the value(s) to the right type.  Howl if any
+        # value(s) are bogus.
+        value = self.convert_value(opt, value)
+        if self.type == 'named':
+            existant = getattr(values, self.dest)
+            if existant:
+                existant.update(value)
+                value = existant
+        # And then take whatever action is expected of us.
+        # This is a separate method to make life easier for
+        # subclasses to add new actions.
+        return self.take_action(
+            self.action, self.dest, opt, value, values, parser)
+
+
+class OptionParser(optparse.OptionParser):
+
+    def __init__(self, option_class=Option, *args, **kwargs):
+        optparse.OptionParser.__init__(self, option_class=Option, *args, **kwargs)
+
+    def format_option_help(self, formatter=None):
+        if formatter is None:
+            formatter = self.formatter
+        outputlevel = getattr(formatter, 'output_level', 0)
+        formatter.store_option_strings(self)
+        result = []
+        result.append(formatter.format_heading("Options"))
+        formatter.indent()
+        if self.option_list:
+            result.append(optparse.OptionContainer.format_option_help(self, formatter))
+            result.append("\n")
+        for group in self.option_groups:
+            if group.level <= outputlevel and (
+                    group.description or _level_options(group, outputlevel)):
+                result.append(group.format_help(formatter))
+                result.append("\n")
+        formatter.dedent()
+        # Drop the last "\n", or the header if no options or option groups:
+        return "".join(result[:-1])
+
+    def _match_long_opt(self, opt):
+        """Disable abbreviations."""
+        if opt not in self._long_opt:
+            raise optparse.BadOptionError(opt)
+        return opt
+
+
+# pylint: disable=abstract-method; by design?
+class _ManHelpFormatter(optparse.HelpFormatter):
+
+    def __init__(self, indent_increment=0, max_help_position=24,
+                 width=79, short_first=0):
+        optparse.HelpFormatter.__init__(
+            self, indent_increment, max_help_position, width, short_first)
+
+    def format_heading(self, heading):
+        return '.SH %s\n' % heading.upper()
+
+    def format_description(self, description):
+        return description
+
+    def format_option(self, option):
+        try:
+            optstring = option.option_strings
+        except AttributeError:
+            optstring = self.format_option_strings(option)
+        if option.help:
+            help_text = self.expand_default(option)
+            help = ' '.join([l.strip() for l in help_text.splitlines()])
+        else:
+            help = ''
+        return '''.IP "%s"
+%s
+''' % (optstring, help)
+
+    def format_head(self, optparser, pkginfo, section=1):
+        long_desc = ""
+        try:
+            pgm = optparser._get_prog_name()
+        except AttributeError:
+            # py >= 2.4.X (dunno which X exactly, at least 2)
+            pgm = optparser.get_prog_name()
+        short_desc = self.format_short_description(pgm, pkginfo.description)
+        if hasattr(pkginfo, "long_desc"):
+            long_desc = self.format_long_description(pgm, pkginfo.long_desc)
+        return '%s\n%s\n%s\n%s' % (self.format_title(pgm, section),
+                                   short_desc, self.format_synopsis(pgm),
+                                   long_desc)
+
+    @staticmethod
+    def format_title(pgm, section):
+        date = '-'.join(str(num) for num in time.localtime()[:3])
+        return '.TH %s %s "%s" %s' % (pgm, section, date, pgm)
+
+    @staticmethod
+    def format_short_description(pgm, short_desc):
+        return '''.SH NAME
+.B %s
+\- %s
+''' % (pgm, short_desc.strip())
+
+    @staticmethod
+    def format_synopsis(pgm):
+        return '''.SH SYNOPSIS
+.B  %s
+[
+.I OPTIONS
+] [
+.I <arguments>
+]
+''' % pgm
+
+    @staticmethod
+    def format_long_description(pgm, long_desc):
+        long_desc = '\n'.join(line.lstrip()
+                              for line in long_desc.splitlines())
+        long_desc = long_desc.replace('\n.\n', '\n\n')
+        if long_desc.lower().startswith(pgm):
+            long_desc = long_desc[len(pgm):]
+        return '''.SH DESCRIPTION
+.B %s
+%s
+''' % (pgm, long_desc.strip())
+
+    @staticmethod
+    def format_tail(pkginfo):
+        tail = '''.SH SEE ALSO
+/usr/share/doc/pythonX.Y-%s/
+
+.SH BUGS
+Please report bugs on the project\'s mailing list:
+%s
+
+.SH AUTHOR
+%s <%s>
+''' % (getattr(pkginfo, 'debian_name', pkginfo.modname),
+       pkginfo.mailinglist, pkginfo.author, pkginfo.author_email)
+
+        if hasattr(pkginfo, "copyright"):
+            tail += '''
+.SH COPYRIGHT
+%s
+''' % pkginfo.copyright
+
+        return tail
+
+
+class OptionsManagerMixIn(object):
+    """Handle configuration from both a configuration file and command line options"""
+
+    def __init__(self, usage, config_file=None, version=None, quiet=0):
+        self.config_file = config_file
+        self.reset_parsers(usage, version=version)
+        # list of registered options providers
+        self.options_providers = []
+        # dictionary associating option name to checker
+        self._all_options = {}
+        self._short_options = {}
+        self._nocallback_options = {}
+        self._mygroups = {}
+        # verbosity
+        self.quiet = quiet
+        self._maxlevel = 0
+
+    def reset_parsers(self, usage='', version=None):
+        # configuration file parser
+        self.cfgfile_parser = configparser.ConfigParser()
+        # command line parser
+        self.cmdline_parser = OptionParser(usage=usage, version=version)
+        self.cmdline_parser.options_manager = self
+        self._optik_option_attrs = set(self.cmdline_parser.option_class.ATTRS)
+
+    def register_options_provider(self, provider, own_group=True):
+        """register an options provider"""
+        assert provider.priority <= 0, "provider's priority can't be >= 0"
+        for i in range(len(self.options_providers)):
+            if provider.priority > self.options_providers[i].priority:
+                self.options_providers.insert(i, provider)
+                break
+        else:
+            self.options_providers.append(provider)
+        non_group_spec_options = [option for option in provider.options
+                                  if 'group' not in option[1]]
+        groups = getattr(provider, 'option_groups', ())
+        if own_group and non_group_spec_options:
+            self.add_option_group(provider.name.upper(), provider.__doc__,
+                                  non_group_spec_options, provider)
+        else:
+            for opt, optdict in non_group_spec_options:
+                self.add_optik_option(provider, self.cmdline_parser, opt, optdict)
+        for gname, gdoc in groups:
+            gname = gname.upper()
+            goptions = [option for option in provider.options
+                        if option[1].get('group', '').upper() == gname]
+            self.add_option_group(gname, gdoc, goptions, provider)
+
+    def add_option_group(self, group_name, _, options, provider):
+        # add option group to the command line parser
+        if group_name in self._mygroups:
+            group = self._mygroups[group_name]
+        else:
+            group = optparse.OptionGroup(self.cmdline_parser,
+                                         title=group_name.capitalize())
+            self.cmdline_parser.add_option_group(group)
+            group.level = provider.level
+            self._mygroups[group_name] = group
+            # add section to the config file
+            if group_name != "DEFAULT":
+                self.cfgfile_parser.add_section(group_name)
+        # add provider's specific options
+        for opt, optdict in options:
+            self.add_optik_option(provider, group, opt, optdict)
+
+    def add_optik_option(self, provider, optikcontainer, opt, optdict):
+        args, optdict = self.optik_option(provider, opt, optdict)
+        option = optikcontainer.add_option(*args, **optdict)
+        self._all_options[opt] = provider
+        self._maxlevel = max(self._maxlevel, option.level or 0)
+
+    def optik_option(self, provider, opt, optdict):
+        """get our personal option definition and return a suitable form for
+        use with optik/optparse
+        """
+        optdict = copy.copy(optdict)
+        if 'action' in optdict:
+            self._nocallback_options[provider] = opt
+        else:
+            optdict['action'] = 'callback'
+            optdict['callback'] = self.cb_set_provider_option
+        # default is handled here and *must not* be given to optik if you
+        # want the whole machinery to work
+        if 'default' in optdict:
+            if ('help' in optdict
+                    and optdict.get('default') is not None
+                    and optdict['action'] not in ('store_true', 'store_false')):
+                optdict['help'] += ' [current: %default]'
+            del optdict['default']
+        args = ['--' + str(opt)]
+        if 'short' in optdict:
+            self._short_options[optdict['short']] = opt
+            args.append('-' + optdict['short'])
+            del optdict['short']
+        # cleanup option definition dict before giving it to optik
+        for key in list(optdict.keys()):
+            if key not in self._optik_option_attrs:
+                optdict.pop(key)
+        return args, optdict
+
+    def cb_set_provider_option(self, option, opt, value, parser):
+        """optik callback for option setting"""
+        if opt.startswith('--'):
+            # remove -- on long option
+            opt = opt[2:]
+        else:
+            # short option, get its long equivalent
+            opt = self._short_options[opt[1:]]
+        # trick since we can't set action='store_true' on options
+        if value is None:
+            value = 1
+        self.global_set_option(opt, value)
+
+    def global_set_option(self, opt, value):
+        """set option on the correct option provider"""
+        self._all_options[opt].set_option(opt, value)
+
+    def generate_config(self, stream=None, skipsections=(), encoding=None):
+        """write a configuration file according to the current configuration
+        into the given stream or stdout
+        """
+        options_by_section = {}
+        sections = []
+        for provider in self.options_providers:
+            for section, options in provider.options_by_section():
+                if section is None:
+                    section = provider.name
+                if section in skipsections:
+                    continue
+                options = [(n, d, v) for (n, d, v) in options
+                           if d.get('type') is not None
+                           and not d.get('deprecated')]
+                if not options:
+                    continue
+                if section not in sections:
+                    sections.append(section)
+                alloptions = options_by_section.setdefault(section, [])
+                alloptions += options
+        stream = stream or sys.stdout
+        encoding = utils._get_encoding(encoding, stream)
+        printed = False
+        for section in sections:
+            if printed:
+                print('\n', file=stream)
+            utils.format_section(stream, section.upper(),
+                                 options_by_section[section],
+                                 encoding)
+            printed = True
+
+    def generate_manpage(self, pkginfo, section=1, stream=None):
+        with _patch_optparse():
+            _generate_manpage(self.cmdline_parser, pkginfo,
+                              section, stream=stream or sys.stdout,
+                              level=self._maxlevel)
+
+    def load_provider_defaults(self):
+        """initialize configuration using default values"""
+        for provider in self.options_providers:
+            provider.load_defaults()
+
+    def read_config_file(self, config_file=None):
+        """read the configuration file but do not load it (i.e. dispatching
+        values to each options provider)
+        """
+        helplevel = 1
+        while helplevel <= self._maxlevel:
+            opt = '-'.join(['long'] * helplevel) + '-help'
+            if opt in self._all_options:
+                break # already processed
+            # pylint: disable=unused-argument
+            def helpfunc(option, opt, val, p, level=helplevel):
+                print(self.help(level))
+                sys.exit(0)
+            helpmsg = '%s verbose help.' % ' '.join(['more'] * helplevel)
+            optdict = {'action': 'callback', 'callback': helpfunc,
+                       'help': helpmsg}
+            provider = self.options_providers[0]
+            self.add_optik_option(provider, self.cmdline_parser, opt, optdict)
+            provider.options += ((opt, optdict),)
+            helplevel += 1
+        if config_file is None:
+            config_file = self.config_file
+        if config_file is not None:
+            config_file = os.path.expanduser(config_file)
+        if config_file and os.path.exists(config_file):
+            parser = self.cfgfile_parser
+            parser.read([config_file])
+            # normalize sections'title
+            for sect, values in list(parser._sections.items()):
+                if not sect.isupper() and values:
+                    parser._sections[sect.upper()] = values
+        elif not self.quiet:
+            msg = 'No config file found, using default configuration'
+            #print(msg, file=sys.stderr)
+            return
+
+    def load_config_file(self):
+        """dispatch values previously read from a configuration file to each
+        options provider)
+        """
+        parser = self.cfgfile_parser
+        for section in parser.sections():
+            for option, value in parser.items(section):
+                try:
+                    self.global_set_option(option, value)
+                except (KeyError, optparse.OptionError):
+                    # TODO handle here undeclared options appearing in the config file
+                    continue
+
+    def load_configuration(self, **kwargs):
+        """override configuration according to given parameters"""
+        for opt, opt_value in kwargs.items():
+            opt = opt.replace('_', '-')
+            provider = self._all_options[opt]
+            provider.set_option(opt, opt_value)
+
+    def load_command_line_configuration(self, args=None):
+        """Override configuration according to command line parameters
+
+        return additional arguments
+        """
+        with _patch_optparse():
+            if args is None:
+                args = sys.argv[1:]
+            else:
+                args = list(args)
+            (options, args) = self.cmdline_parser.parse_args(args=args)
+            for provider in self._nocallback_options.keys():
+                config = provider.config
+                for attr in config.__dict__.keys():
+                    value = getattr(options, attr, None)
+                    if value is None:
+                        continue
+                    setattr(config, attr, value)
+            return args
+
+    def add_help_section(self, title, description, level=0):
+        """add a dummy option section for help purpose """
+        group = optparse.OptionGroup(self.cmdline_parser,
+                                     title=title.capitalize(),
+                                     description=description)
+        group.level = level
+        self._maxlevel = max(self._maxlevel, level)
+        self.cmdline_parser.add_option_group(group)
+
+    def help(self, level=0):
+        """return the usage string for available options """
+        self.cmdline_parser.formatter.output_level = level
+        with _patch_optparse():
+            return self.cmdline_parser.format_help()
+
+
+class OptionsProviderMixIn(object):
+    """Mixin to provide options to an OptionsManager"""
+
+    # those attributes should be overridden
+    priority = -1
+    name = 'default'
+    options = ()
+    level = 0
+
+    def __init__(self):
+        self.config = optparse.Values()
+        self.load_defaults()
+
+    def load_defaults(self):
+        """initialize the provider using default values"""
+        for opt, optdict in self.options:
+            action = optdict.get('action')
+            if action != 'callback':
+                # callback action have no default
+                if optdict is None:
+                    optdict = self.get_option_def(opt)
+                default = optdict.get('default')
+                self.set_option(opt, default, action, optdict)
+
+    def option_attrname(self, opt, optdict=None):
+        """get the config attribute corresponding to opt"""
+        if optdict is None:
+            optdict = self.get_option_def(opt)
+        return optdict.get('dest', opt.replace('-', '_'))
+
+    def option_value(self, opt):
+        """get the current value for the given option"""
+        return getattr(self.config, self.option_attrname(opt), None)
+
+    def set_option(self, opt, value, action=None, optdict=None):
+        """method called to set an option (registered in the options list)"""
+        if optdict is None:
+            optdict = self.get_option_def(opt)
+        if value is not None:
+            value = _validate(value, optdict, opt)
+        if action is None:
+            action = optdict.get('action', 'store')
+        if action == 'store':
+            setattr(self.config, self.option_attrname(opt, optdict), value)
+        elif action in ('store_true', 'count'):
+            setattr(self.config, self.option_attrname(opt, optdict), 0)
+        elif action == 'store_false':
+            setattr(self.config, self.option_attrname(opt, optdict), 1)
+        elif action == 'append':
+            opt = self.option_attrname(opt, optdict)
+            _list = getattr(self.config, opt, None)
+            if _list is None:
+                if isinstance(value, (list, tuple)):
+                    _list = value
+                elif value is not None:
+                    _list = []
+                    _list.append(value)
+                setattr(self.config, opt, _list)
+            elif isinstance(_list, tuple):
+                setattr(self.config, opt, _list + (value,))
+            else:
+                _list.append(value)
+        elif action == 'callback':
+            optdict['callback'](None, opt, value, None)
+        else:
+            raise UnsupportedAction(action)
+
+    def get_option_def(self, opt):
+        """return the dictionary defining an option given its name"""
+        assert self.options
+        for option in self.options:
+            if option[0] == opt:
+                return option[1]
+        raise optparse.OptionError('no such option %s in section %r'
+                                   % (opt, self.name), opt)
+
+    def options_by_section(self):
+        """return an iterator on options grouped by section
+
+        (section, [list of (optname, optdict, optvalue)])
+        """
+        sections = {}
+        for optname, optdict in self.options:
+            sections.setdefault(optdict.get('group'), []).append(
+                (optname, optdict, self.option_value(optname)))
+        if None in sections:
+            yield None, sections.pop(None)
+        for section, options in sorted(sections.items()):
+            yield section.upper(), options
+
+    def options_and_values(self, options=None):
+        if options is None:
+            options = self.options
+        for optname, optdict in options:
+            yield (optname, optdict, self.option_value(optname))
+
+
+class ConfigurationMixIn(OptionsManagerMixIn, OptionsProviderMixIn):
+    """basic mixin for simple configurations which don't need the
+    manager / providers model
+    """
+    def __init__(self, *args, **kwargs):
+        if not args:
+            kwargs.setdefault('usage', '')
+        kwargs.setdefault('quiet', 1)
+        OptionsManagerMixIn.__init__(self, *args, **kwargs)
+        OptionsProviderMixIn.__init__(self)
+        if not getattr(self, 'option_groups', None):
+            self.option_groups = []
+            for _, optdict in self.options:
+                try:
+                    gdef = (optdict['group'].upper(), '')
+                except KeyError:
+                    continue
+                if gdef not in self.option_groups:
+                    self.option_groups.append(gdef)
+        self.register_options_provider(self, own_group=False)
+
+
+def _generate_manpage(optparser, pkginfo, section=1,
+                      stream=sys.stdout, level=0):
+    formatter = _ManHelpFormatter()
+    formatter.output_level = level
+    formatter.parser = optparser
+    print(formatter.format_head(optparser, pkginfo, section), file=stream)
+    print(optparser.format_option_help(formatter), file=stream)
+    print(formatter.format_tail(pkginfo), file=stream)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/lint.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/lint.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/lint.py	(revision 1126)
@@ -0,0 +1,1378 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+""" %prog [options] module_or_package
+
+  Check that a module satisfies a coding standard (and more !).
+
+    %prog --help
+
+  Display this help message and exit.
+
+    %prog --help-msg <msg-id>[,<msg-id>]
+
+  Display help messages about given message identifiers and exit.
+"""
+from __future__ import print_function
+
+import collections
+import contextlib
+import operator
+import os
+try:
+    import multiprocessing
+except ImportError:
+    multiprocessing = None
+import sys
+import tokenize
+import warnings
+
+import six
+
+import astroid
+from astroid.__pkginfo__ import version as astroid_version
+from astroid import modutils
+from pylint import checkers
+from pylint import interfaces
+from pylint import reporters
+from pylint import utils
+from pylint import config
+from pylint.__pkginfo__ import version
+from pylint.reporters.ureports import nodes as report_nodes
+
+
+MANAGER = astroid.MANAGER
+INCLUDE_IDS_HELP = ("Deprecated. It was used to include message\'s "
+                    "id in output. Use --msg-template instead.")
+SYMBOLS_HELP = ("Deprecated. It was used to include symbolic ids of "
+                "messages in output. Use --msg-template instead.")
+
+def _get_new_args(message):
+    location = (
+        message.abspath,
+        message.path,
+        message.module,
+        message.obj,
+        message.line,
+        message.column,
+    )
+    return (
+        message.msg_id,
+        message.symbol,
+        location,
+        message.msg,
+        message.confidence,
+    )
+
+def _get_python_path(filepath):
+    dirname = os.path.realpath(os.path.expanduser(filepath))
+    if not os.path.isdir(dirname):
+        dirname = os.path.dirname(dirname)
+    while True:
+        if not os.path.exists(os.path.join(dirname, "__init__.py")):
+            return dirname
+        old_dirname = dirname
+        dirname = os.path.dirname(dirname)
+        if old_dirname == dirname:
+            return os.getcwd()
+
+
+def _merge_stats(stats):
+    merged = {}
+    by_msg = collections.Counter()
+    for stat in stats:
+        message_stats = stat.pop('by_msg', {})
+        by_msg.update(message_stats)
+
+        for key, item in six.iteritems(stat):
+            if key not in merged:
+                merged[key] = item
+            else:
+                if isinstance(item, dict):
+                    merged[key].update(item)
+                else:
+                    merged[key] = merged[key] + item
+
+    merged['by_msg'] = by_msg
+    return merged
+
+
+@contextlib.contextmanager
+def _patch_sysmodules():
+    # Context manager that permits running pylint, on Windows, with -m switch
+    # and with --jobs, as in 'python -2 -m pylint .. --jobs'.
+    # For more details why this is needed,
+    # see Python issue http://bugs.python.org/issue10845.
+
+    mock_main = __name__ != '__main__' # -m switch
+    if mock_main:
+        sys.modules['__main__'] = sys.modules[__name__]
+
+    try:
+        yield
+    finally:
+        if mock_main:
+            sys.modules.pop('__main__')
+
+
+# Python Linter class #########################################################
+
+MSGS = {
+    'F0001': ('%s',
+              'fatal',
+              'Used when an error occurred preventing the analysis of a \
+              module (unable to find it for instance).'),
+    'F0002': ('%s: %s',
+              'astroid-error',
+              'Used when an unexpected error occurred while building the '
+              'Astroid  representation. This is usually accompanied by a '
+              'traceback. Please report such errors !'),
+    'F0010': ('error while code parsing: %s',
+              'parse-error',
+              'Used when an exception occured while building the Astroid '
+              'representation which could be handled by astroid.'),
+
+    'I0001': ('Unable to run raw checkers on built-in module %s',
+              'raw-checker-failed',
+              'Used to inform that a built-in module has not been checked '
+              'using the raw checkers.'),
+
+    'I0010': ('Unable to consider inline option %r',
+              'bad-inline-option',
+              'Used when an inline option is either badly formatted or can\'t '
+              'be used inside modules.'),
+
+    'I0011': ('Locally disabling %s (%s)',
+              'locally-disabled',
+              'Used when an inline option disables a message or a messages '
+              'category.'),
+    'I0012': ('Locally enabling %s (%s)',
+              'locally-enabled',
+              'Used when an inline option enables a message or a messages '
+              'category.'),
+    'I0013': ('Ignoring entire file',
+              'file-ignored',
+              'Used to inform that the file will not be checked'),
+    'I0020': ('Suppressed %s (from line %d)',
+              'suppressed-message',
+              'A message was triggered on a line, but suppressed explicitly '
+              'by a disable= comment in the file. This message is not '
+              'generated for messages that are ignored due to configuration '
+              'settings.'),
+    'I0021': ('Useless suppression of %s',
+              'useless-suppression',
+              'Reported when a message is explicitly disabled for a line or '
+              'a block of code, but never triggered.'),
+    'I0022': ('Pragma "%s" is deprecated, use "%s" instead',
+              'deprecated-pragma',
+              'Some inline pylint options have been renamed or reworked, '
+              'only the most recent form should be used. '
+              'NOTE:skip-all is only available with pylint >= 0.26',
+              {'old_names': [('I0014', 'deprecated-disable-all')]}),
+
+    'E0001': ('%s',
+              'syntax-error',
+              'Used when a syntax error is raised for a module.'),
+
+    'E0011': ('Unrecognized file option %r',
+              'unrecognized-inline-option',
+              'Used when an unknown inline option is encountered.'),
+    'E0012': ('Bad option value %r',
+              'bad-option-value',
+              'Used when a bad value for an inline option is encountered.'),
+    }
+
+
+if multiprocessing is not None:
+    class ChildLinter(multiprocessing.Process):
+        def run(self):
+            # pylint: disable=no-member, unbalanced-tuple-unpacking
+            tasks_queue, results_queue, self._config = self._args
+
+            self._config["jobs"] = 1  # Child does not parallelize any further.
+            self._python3_porting_mode = self._config.pop(
+                'python3_porting_mode', None)
+            self._plugins = self._config.pop('plugins', None)
+
+            # Run linter for received files/modules.
+            for file_or_module in iter(tasks_queue.get, 'STOP'):
+                result = self._run_linter(file_or_module[0])
+                try:
+                    results_queue.put(result)
+                except Exception as ex:
+                    print("internal error with sending report for module %s" %
+                          file_or_module, file=sys.stderr)
+                    print(ex, file=sys.stderr)
+                    results_queue.put({})
+
+        def _run_linter(self, file_or_module):
+            linter = PyLinter()
+
+            # Register standard checkers.
+            linter.load_default_plugins()
+            # Load command line plugins.
+            if self._plugins:
+                linter.load_plugin_modules(self._plugins)
+
+            linter.load_configuration(**self._config)
+            linter.set_reporter(reporters.CollectingReporter())
+
+            # Enable the Python 3 checker mode. This option is
+            # passed down from the parent linter up to here, since
+            # the Python 3 porting flag belongs to the Run class,
+            # instead of the Linter class.
+            if self._python3_porting_mode:
+                linter.python3_porting_mode()
+
+            # Run the checks.
+            linter.check(file_or_module)
+
+            msgs = [_get_new_args(m) for m in linter.reporter.messages]
+            return (file_or_module, linter.file_state.base_name, linter.current_name,
+                    msgs, linter.stats, linter.msg_status)
+
+
+class PyLinter(config.OptionsManagerMixIn,
+               utils.MessagesHandlerMixIn,
+               utils.ReportsHandlerMixIn,
+               checkers.BaseTokenChecker):
+    """lint Python modules using external checkers.
+
+    This is the main checker controlling the other ones and the reports
+    generation. It is itself both a raw checker and an astroid checker in order
+    to:
+    * handle message activation / deactivation at the module level
+    * handle some basic but necessary stats'data (number of classes, methods...)
+
+    IDE plugins developpers: you may have to call
+    `astroid.builder.MANAGER.astroid_cache.clear()` accross run if you want
+    to ensure the latest code version is actually checked.
+    """
+
+    __implements__ = (interfaces.ITokenChecker, )
+
+    name = 'master'
+    priority = 0
+    level = 0
+    msgs = MSGS
+
+    @staticmethod
+    def make_options():
+        return (('ignore',
+                 {'type' : 'csv', 'metavar' : '<file>[,<file>...]',
+                  'dest' : 'black_list', 'default' : ('CVS',),
+                  'help' : 'Add files or directories to the blacklist. '
+                           'They should be base names, not paths.'}),
+                ('persistent',
+                 {'default': True, 'type' : 'yn', 'metavar' : '<y_or_n>',
+                  'level': 1,
+                  'help' : 'Pickle collected data for later comparisons.'}),
+
+                ('load-plugins',
+                 {'type' : 'csv', 'metavar' : '<modules>', 'default' : (),
+                  'level': 1,
+                  'help' : 'List of plugins (as comma separated values of '
+                           'python modules names) to load, usually to register '
+                           'additional checkers.'}),
+
+                ('output-format',
+                 {'default': 'text', 'type': 'string', 'metavar' : '<format>',
+                  'short': 'f',
+                  'group': 'Reports',
+                  'help' : 'Set the output format. Available formats are text,'
+                           ' parseable, colorized, msvs (visual studio) and html. You '
+                           'can also give a reporter class, eg mypackage.mymodule.'
+                           'MyReporterClass.'}),
+
+                ('files-output',
+                 {'default': 0, 'type' : 'yn', 'metavar' : '<y_or_n>',
+                  'group': 'Reports', 'level': 1,
+                  'help' : 'Put messages in a separate file for each module / '
+                           'package specified on the command line instead of printing '
+                           'them on stdout. Reports (if any) will be written in a file '
+                           'name "pylint_global.[txt|html]".'}),
+
+                ('reports',
+                 {'default': 1, 'type' : 'yn', 'metavar' : '<y_or_n>',
+                  'short': 'r',
+                  'group': 'Reports',
+                  'help' : 'Tells whether to display a full report or only the '
+                           'messages'}),
+
+                ('evaluation',
+                 {'type' : 'string', 'metavar' : '<python_expression>',
+                  'group': 'Reports', 'level': 1,
+                  'default': '10.0 - ((float(5 * error + warning + refactor + '
+                             'convention) / statement) * 10)',
+                  'help' : 'Python expression which should return a note less '
+                           'than 10 (10 is the highest note). You have access '
+                           'to the variables errors warning, statement which '
+                           'respectively contain the number of errors / '
+                           'warnings messages and the total number of '
+                           'statements analyzed. This is used by the global '
+                           'evaluation report (RP0004).'}),
+
+                ('comment', utils.deprecated_option(opt_type='yn')),
+
+                ('confidence',
+                 {'type' : 'multiple_choice', 'metavar': '<levels>',
+                  'default': '',
+                  'choices': [c.name for c in interfaces.CONFIDENCE_LEVELS],
+                  'group': 'Messages control',
+                  'help' : 'Only show warnings with the listed confidence levels.'
+                           ' Leave empty to show all. Valid levels: %s' % (
+                               ', '.join(c.name for c in interfaces.CONFIDENCE_LEVELS),)}),
+
+                ('enable',
+                 {'type' : 'csv', 'metavar': '<msg ids>',
+                  'short': 'e',
+                  'group': 'Messages control',
+                  'help' : 'Enable the message, report, category or checker with the '
+                           'given id(s). You can either give multiple identifier '
+                           'separated by comma (,) or put this option multiple time. '
+                           'See also the "--disable" option for examples. '}),
+
+                ('disable',
+                 {'type' : 'csv', 'metavar': '<msg ids>',
+                  'short': 'd',
+                  'group': 'Messages control',
+                  'help' : 'Disable the message, report, category or checker '
+                           'with the given id(s). You can either give multiple identifiers'
+                           ' separated by comma (,) or put this option multiple times '
+                           '(only on the command line, not in the configuration file '
+                           'where it should appear only once).'
+                           'You can also use "--disable=all" to disable everything first '
+                           'and then reenable specific checks. For example, if you want '
+                           'to run only the similarities checker, you can use '
+                           '"--disable=all --enable=similarities". '
+                           'If you want to run only the classes checker, but have no '
+                           'Warning level messages displayed, use'
+                           '"--disable=all --enable=classes --disable=W"'}),
+
+                ('msg-template',
+                 {'type' : 'string', 'metavar': '<template>',
+                  'group': 'Reports',
+                  'help' : ('Template used to display messages. '
+                            'This is a python new-style format string '
+                            'used to format the message information. '
+                            'See doc for all details')
+                 }),
+
+                ('include-ids', utils.deprecated_option('i', 'yn', INCLUDE_IDS_HELP)),
+                ('symbols', utils.deprecated_option('s', 'yn', SYMBOLS_HELP)),
+
+                ('jobs',
+                 {'type' : 'int', 'metavar': '<n-processes>',
+                  'short': 'j',
+                  'default': 1,
+                  'help' : '''Use multiple processes to speed up Pylint.''',
+                 }),
+
+                ('unsafe-load-any-extension',
+                 {'type': 'yn', 'metavar': '<yn>', 'default': False, 'hide': True,
+                  'help': ('Allow loading of arbitrary C extensions. Extensions'
+                           ' are imported into the active Python interpreter and'
+                           ' may run arbitrary code.')}),
+
+                ('extension-pkg-whitelist',
+                 {'type': 'csv', 'metavar': '<pkg[,pkg]>', 'default': [],
+                  'help': ('A comma-separated list of package or module names'
+                           ' from where C extensions may be loaded. Extensions are'
+                           ' loading into the active Python interpreter and may run'
+                           ' arbitrary code')}
+                ),
+
+                ('optimize-ast',
+                 {'type': 'yn', 'metavar': '<yn>', 'default': False,
+                  'help': ('Allow optimization of some AST trees. This will '
+                           'activate a peephole AST optimizer, which will '
+                           'apply various small optimizations. For instance, '
+                           'it can be used to obtain the result of joining '
+                           'multiple strings with the addition operator. '
+                           'Joining a lot of strings can lead to a maximum '
+                           'recursion error in Pylint and this flag can prevent '
+                           'that. It has one side effect, the resulting AST '
+                           'will be different than the one from reality.')}
+                ),
+               )
+
+    option_groups = (
+        ('Messages control', 'Options controling analysis messages'),
+        ('Reports', 'Options related to output formating and reporting'),
+        )
+
+    def __init__(self, options=(), reporter=None, option_groups=(),
+                 pylintrc=None):
+        # some stuff has to be done before ancestors initialization...
+        #
+        # messages store / checkers / reporter / astroid manager
+        self.msgs_store = utils.MessagesStore()
+        self.reporter = None
+        self._reporter_name = None
+        self._reporters = {}
+        self._checkers = collections.defaultdict(list)
+        self._pragma_lineno = {}
+        self._ignore_file = False
+        # visit variables
+        self.file_state = utils.FileState()
+        self.current_name = None
+        self.current_file = None
+        self.stats = None
+        # init options
+        self._external_opts = options
+        self.options = options + PyLinter.make_options()
+        self.option_groups = option_groups + PyLinter.option_groups
+        self._options_methods = {
+            'enable': self.enable,
+            'disable': self.disable}
+        self._bw_options_methods = {'disable-msg': self.disable,
+                                    'enable-msg': self.enable}
+        full_version = '%%prog %s, \nastroid %s\nPython %s' % (
+            version, astroid_version, sys.version)
+        utils.MessagesHandlerMixIn.__init__(self)
+        utils.ReportsHandlerMixIn.__init__(self)
+        super(PyLinter, self).__init__(
+            usage=__doc__,
+            version=full_version,
+            config_file=pylintrc or config.PYLINTRC)
+        checkers.BaseTokenChecker.__init__(self)
+        # provided reports
+        self.reports = (('RP0001', 'Messages by category',
+                         report_total_messages_stats),
+                        ('RP0002', '% errors / warnings by module',
+                         report_messages_by_module_stats),
+                        ('RP0003', 'Messages',
+                         report_messages_stats),
+                        ('RP0004', 'Global evaluation',
+                         self.report_evaluation),
+                       )
+        self.register_checker(self)
+        self._dynamic_plugins = set()
+        self._python3_porting_mode = False
+        self._error_mode = False
+        self.load_provider_defaults()
+        if reporter:
+            self.set_reporter(reporter)
+
+    def load_default_plugins(self):
+        checkers.initialize(self)
+        reporters.initialize(self)
+        # Make sure to load the default reporter, because
+        # the option has been set before the plugins had been loaded.
+        if not self.reporter:
+            self._load_reporter()
+
+    def load_plugin_modules(self, modnames):
+        """take a list of module names which are pylint plugins and load
+        and register them
+        """
+        for modname in modnames:
+            if modname in self._dynamic_plugins:
+                continue
+            self._dynamic_plugins.add(modname)
+            module = modutils.load_module_from_name(modname)
+            module.register(self)
+
+    def _load_reporter(self):
+        name = self._reporter_name.lower()
+        if name in self._reporters:
+            self.set_reporter(self._reporters[name]())
+        else:
+            qname = self._reporter_name
+            module = modutils.load_module_from_name(
+                modutils.get_module_part(qname))
+            class_name = qname.split('.')[-1]
+            reporter_class = getattr(module, class_name)
+            self.set_reporter(reporter_class())
+
+    def set_reporter(self, reporter):
+        """set the reporter used to display messages and reports"""
+        self.reporter = reporter
+        reporter.linter = self
+
+    def set_option(self, optname, value, action=None, optdict=None):
+        """overridden from config.OptionsProviderMixin to handle some
+        special options
+        """
+        if optname in self._options_methods or \
+                optname in self._bw_options_methods:
+            if value:
+                try:
+                    meth = self._options_methods[optname]
+                except KeyError:
+                    meth = self._bw_options_methods[optname]
+                    warnings.warn('%s is deprecated, replace it by %s' % (optname,
+                                                                          optname.split('-')[0]),
+                                  DeprecationWarning)
+                value = utils._check_csv(value)
+                if isinstance(value, (list, tuple)):
+                    for _id in value:
+                        meth(_id, ignore_unknown=True)
+                else:
+                    meth(value)
+                return # no need to call set_option, disable/enable methods do it
+        elif optname == 'output-format':
+            self._reporter_name = value
+            # If the reporters are already available, load
+            # the reporter class.
+            if self._reporters:
+                self._load_reporter()
+
+        try:
+            checkers.BaseTokenChecker.set_option(self, optname,
+                                                 value, action, optdict)
+        except config.UnsupportedAction:
+            print('option %s can\'t be read from config file' % \
+                  optname, file=sys.stderr)
+
+    def register_reporter(self, reporter_class):
+        self._reporters[reporter_class.name] = reporter_class
+
+    def report_order(self):
+        reports = sorted(self._reports, key=lambda x: getattr(x, 'name', ''))
+        try:
+            # Remove the current reporter and add it
+            # at the end of the list.
+            reports.pop(reports.index(self))
+        except ValueError:
+            pass
+        else:
+            reports.append(self)
+        return reports
+
+    # checkers manipulation methods ############################################
+
+    def register_checker(self, checker):
+        """register a new checker
+
+        checker is an object implementing IRawChecker or / and IAstroidChecker
+        """
+        assert checker.priority <= 0, 'checker priority can\'t be >= 0'
+        self._checkers[checker.name].append(checker)
+        for r_id, r_title, r_cb in checker.reports:
+            self.register_report(r_id, r_title, r_cb, checker)
+        self.register_options_provider(checker)
+        if hasattr(checker, 'msgs'):
+            self.msgs_store.register_messages(checker)
+        checker.load_defaults()
+
+        # Register the checker, but disable all of its messages.
+        # TODO(cpopa): we should have a better API for this.
+        if not getattr(checker, 'enabled', True):
+            self.disable(checker.name)
+
+    def disable_noerror_messages(self):
+        for msgcat, msgids in six.iteritems(self.msgs_store._msgs_by_category):
+            if msgcat == 'E':
+                for msgid in msgids:
+                    self.enable(msgid)
+            else:
+                for msgid in msgids:
+                    self.disable(msgid)
+
+    def disable_reporters(self):
+        """disable all reporters"""
+        for _reporters in six.itervalues(self._reports):
+            for report_id, _, _ in _reporters:
+                self.disable_report(report_id)
+
+    def error_mode(self):
+        """error mode: enable only errors; no reports, no persistent"""
+        self._error_mode = True
+        self.disable_noerror_messages()
+        self.disable('miscellaneous')
+        if self._python3_porting_mode:
+            self.disable('all')
+            for msg_id in self._checker_messages('python3'):
+                if msg_id.startswith('E'):
+                    self.enable(msg_id)
+        else:
+            self.disable('python3')
+        self.set_option('reports', False)
+        self.set_option('persistent', False)
+
+    def python3_porting_mode(self):
+        """Disable all other checkers and enable Python 3 warnings."""
+        self.disable('all')
+        self.enable('python3')
+        if self._error_mode:
+            # The error mode was activated, using the -E flag.
+            # So we'll need to enable only the errors from the
+            # Python 3 porting checker.
+            for msg_id in self._checker_messages('python3'):
+                if msg_id.startswith('E'):
+                    self.enable(msg_id)
+                else:
+                    self.disable(msg_id)
+        self._python3_porting_mode = True
+
+    # block level option handling #############################################
+    #
+    # see func_block_disable_msg.py test case for expected behaviour
+
+    def process_tokens(self, tokens):
+        """process tokens from the current module to search for module/block
+        level options
+        """
+        control_pragmas = {'disable', 'enable'}
+        for (tok_type, content, start, _, _) in tokens:
+            if tok_type != tokenize.COMMENT:
+                continue
+            match = utils.OPTION_RGX.search(content)
+            if match is None:
+                continue
+            if match.group(1).strip() == "disable-all" or \
+                    match.group(1).strip() == 'skip-file':
+                if match.group(1).strip() == "disable-all":
+                    self.add_message('deprecated-pragma', line=start[0],
+                                     args=('disable-all', 'skip-file'))
+                self.add_message('file-ignored', line=start[0])
+                self._ignore_file = True
+                return
+            try:
+                opt, value = match.group(1).split('=', 1)
+            except ValueError:
+                self.add_message('bad-inline-option', args=match.group(1).strip(),
+                                 line=start[0])
+                continue
+            opt = opt.strip()
+            if opt in self._options_methods or opt in self._bw_options_methods:
+                try:
+                    meth = self._options_methods[opt]
+                except KeyError:
+                    meth = self._bw_options_methods[opt]
+                    # found a "(dis|en)able-msg" pragma deprecated suppresssion
+                    self.add_message('deprecated-pragma', line=start[0],
+                                     args=(opt, opt.replace('-msg', '')))
+                for msgid in utils._splitstrip(value):
+                    # Add the line where a control pragma was encountered.
+                    if opt in control_pragmas:
+                        self._pragma_lineno[msgid] = start[0]
+
+                    try:
+                        if (opt, msgid) == ('disable', 'all'):
+                            self.add_message('deprecated-pragma', line=start[0],
+                                             args=('disable=all', 'skip-file'))
+                            self.add_message('file-ignored', line=start[0])
+                            self._ignore_file = True
+                            return
+                        meth(msgid, 'module', start[0])
+                    except utils.UnknownMessage:
+                        self.add_message('bad-option-value', args=msgid, line=start[0])
+            else:
+                self.add_message('unrecognized-inline-option', args=opt, line=start[0])
+
+
+    # code checking methods ###################################################
+
+    def get_checkers(self):
+        """return all available checkers as a list"""
+        return [self] + [c for _checkers in six.itervalues(self._checkers)
+                         for c in _checkers if c is not self]
+
+    def prepare_checkers(self):
+        """return checkers needed for activated messages and reports"""
+        if not self.config.reports:
+            self.disable_reporters()
+        # get needed checkers
+        neededcheckers = [self]
+        for checker in self.get_checkers()[1:]:
+            # fatal errors should not trigger enable / disabling a checker
+            messages = set(msg for msg in checker.msgs
+                           if msg[0] != 'F' and self.is_message_enabled(msg))
+            if (messages or
+                    any(self.report_is_enabled(r[0]) for r in checker.reports)):
+                neededcheckers.append(checker)
+        # Sort checkers by priority
+        neededcheckers = sorted(neededcheckers,
+                                key=operator.attrgetter('priority'),
+                                reverse=True)
+        return neededcheckers
+
+    def should_analyze_file(self, modname, path): # pylint: disable=unused-argument, no-self-use
+        """Returns whether or not a module should be checked.
+
+        This implementation returns True for all python source file, indicating
+        that all files should be linted.
+
+        Subclasses may override this method to indicate that modules satisfying
+        certain conditions should not be linted.
+
+        :param str modname: The name of the module to be checked.
+        :param str path: The full path to the source code of the module.
+        :returns: True if the module should be checked.
+        :rtype: bool
+        """
+        return path.endswith('.py')
+
+    def check(self, files_or_modules):
+        """main checking entry: check a list of files or modules from their
+        name.
+        """
+        # initialize msgs_state now that all messages have been registered into
+        # the store
+        for msg in self.msgs_store.messages:
+            if not msg.may_be_emitted():
+                self._msgs_state[msg.msgid] = False
+
+        if not isinstance(files_or_modules, (list, tuple)):
+            files_or_modules = (files_or_modules,)
+
+        if self.config.jobs == 1:
+            self._do_check(files_or_modules)
+        else:
+            with _patch_sysmodules():
+                self._parallel_check(files_or_modules)
+
+    def _get_jobs_config(self):
+        child_config = {}
+        filter_options = {'symbols', 'include-ids', 'long-help'}
+        filter_options.update((opt_name for opt_name, _ in self._external_opts))
+        for opt_providers in six.itervalues(self._all_options):
+            for optname, optdict, val in opt_providers.options_and_values():
+                if optdict.get('deprecated'):
+                    continue
+
+                if optname not in filter_options:
+                    child_config[optname] = utils._format_option_value(
+                        optdict, val)
+        child_config['python3_porting_mode'] = self._python3_porting_mode
+        child_config['plugins'] = self._dynamic_plugins
+        return child_config
+
+    def _parallel_task(self, files_or_modules):
+        # Prepare configuration for child linters.
+        child_config = self._get_jobs_config()
+
+        children = []
+        manager = multiprocessing.Manager()
+        tasks_queue = manager.Queue()
+        results_queue = manager.Queue()
+
+        for _ in range(self.config.jobs):
+            child_linter = ChildLinter(args=(tasks_queue, results_queue,
+                                             child_config))
+            child_linter.start()
+            children.append(child_linter)
+
+        # Send files to child linters.
+        expanded_files = self.expand_files(files_or_modules)
+        for files_or_module in expanded_files:
+            path = files_or_module['path']
+            tasks_queue.put([path])
+
+        # collect results from child linters
+        failed = False
+        for _ in expanded_files:
+            try:
+                result = results_queue.get()
+            except Exception as ex:
+                print("internal error while receiving results from child linter",
+                      file=sys.stderr)
+                print(ex, file=sys.stderr)
+                failed = True
+                break
+            yield result
+
+        # Stop child linters and wait for their completion.
+        for _ in range(self.config.jobs):
+            tasks_queue.put('STOP')
+        for child in children:
+            child.join()
+
+        if failed:
+            print("Error occured, stopping the linter.", file=sys.stderr)
+            sys.exit(32)
+
+    def _parallel_check(self, files_or_modules):
+        # Reset stats.
+        self.open()
+
+        all_stats = []
+        module = None
+        for result in self._parallel_task(files_or_modules):
+            (
+                _,
+                self.file_state.base_name,
+                module,
+                messages,
+                stats,
+                msg_status
+            ) = result
+
+            for msg in messages:
+                msg = utils.Message(*msg)
+                self.set_current_module(module)
+                self.reporter.handle_message(msg)
+
+            all_stats.append(stats)
+            self.msg_status |= msg_status
+
+        self.stats = _merge_stats(all_stats)
+        self.current_name = module
+
+        # Insert stats data to local checkers.
+        for checker in self.get_checkers():
+            if checker is not self:
+                checker.stats = self.stats
+
+    def _do_check(self, files_or_modules):
+        walker = utils.PyLintASTWalker(self)
+        _checkers = self.prepare_checkers()
+        tokencheckers = [c for c in _checkers
+                         if interfaces.implements(c, interfaces.ITokenChecker)
+                         and c is not self]
+        rawcheckers = [c for c in _checkers
+                       if interfaces.implements(c, interfaces.IRawChecker)]
+        # notify global begin
+        for checker in _checkers:
+            checker.open()
+            if interfaces.implements(checker, interfaces.IAstroidChecker):
+                walker.add_checker(checker)
+        # build ast and check modules or packages
+        for descr in self.expand_files(files_or_modules):
+            modname, filepath = descr['name'], descr['path']
+            if not descr['isarg'] and not self.should_analyze_file(modname, filepath):
+                continue
+            if self.config.files_output:
+                reportfile = 'pylint_%s.%s' % (modname, self.reporter.extension)
+                self.reporter.set_output(open(reportfile, 'w'))
+            self.set_current_module(modname, filepath)
+            # get the module representation
+            ast_node = self.get_ast(filepath, modname)
+            if ast_node is None:
+                continue
+            # XXX to be correct we need to keep module_msgs_state for every
+            # analyzed module (the problem stands with localized messages which
+            # are only detected in the .close step)
+            self.file_state = utils.FileState(descr['basename'])
+            self._ignore_file = False
+            # fix the current file (if the source file was not available or
+            # if it's actually a c extension)
+            self.current_file = ast_node.file # pylint: disable=maybe-no-member
+            self.check_astroid_module(ast_node, walker, rawcheckers, tokencheckers)
+            # warn about spurious inline messages handling
+            spurious_messages = self.file_state.iter_spurious_suppression_messages(self.msgs_store)
+            for msgid, line, args in spurious_messages:
+                self.add_message(msgid, line, None, args)
+        # notify global end
+        self.stats['statement'] = walker.nbstatements
+        for checker in reversed(_checkers):
+            checker.close()
+
+    def expand_files(self, modules):
+        """get modules and errors from a list of modules and handle errors
+        """
+        result, errors = utils.expand_modules(modules, self.config.black_list)
+        for error in errors:
+            message = modname = error["mod"]
+            key = error["key"]
+            self.set_current_module(modname)
+            if key == "fatal":
+                message = str(error["ex"]).replace(os.getcwd() + os.sep, '')
+            self.add_message(key, args=message)
+        return result
+
+    def set_current_module(self, modname, filepath=None):
+        """set the name of the currently analyzed module and
+        init statistics for it
+        """
+        if not modname and filepath is None:
+            return
+        self.reporter.on_set_current_module(modname, filepath)
+        self.current_name = modname
+        self.current_file = filepath or modname
+        self.stats['by_module'][modname] = {}
+        self.stats['by_module'][modname]['statement'] = 0
+        for msg_cat in six.itervalues(utils.MSG_TYPES):
+            self.stats['by_module'][modname][msg_cat] = 0
+
+    def get_ast(self, filepath, modname):
+        """return a ast(roid) representation for a module"""
+        try:
+            return MANAGER.ast_from_file(filepath, modname, source=True)
+        except astroid.AstroidBuildingException as ex:
+            if isinstance(ex.args[0], SyntaxError):
+                ex = ex.args[0]
+                self.add_message('syntax-error',
+                                 line=ex.lineno or 0,
+                                 args=ex.msg)
+            else:
+                self.add_message('parse-error', args=ex)
+        except Exception as ex: # pylint: disable=broad-except
+            import traceback
+            traceback.print_exc()
+            self.add_message('astroid-error', args=(ex.__class__, ex))
+
+    def check_astroid_module(self, ast_node, walker,
+                             rawcheckers, tokencheckers):
+        """Check a module from its astroid representation."""
+        try:
+            tokens = utils.tokenize_module(ast_node)
+        except tokenize.TokenError as ex:
+            self.add_message('syntax-error', line=ex.args[1][0], args=ex.args[0])
+            return
+
+        if not ast_node.pure_python:
+            self.add_message('raw-checker-failed', args=ast_node.name)
+        else:
+            #assert astroid.file.endswith('.py')
+            # invoke ITokenChecker interface on self to fetch module/block
+            # level options
+            self.process_tokens(tokens)
+            if self._ignore_file:
+                return False
+            # walk ast to collect line numbers
+            self.file_state.collect_block_lines(self.msgs_store, ast_node)
+            # run raw and tokens checkers
+            for checker in rawcheckers:
+                checker.process_module(ast_node)
+            for checker in tokencheckers:
+                checker.process_tokens(tokens)
+        # generate events to astroid checkers
+        walker.walk(ast_node)
+        return True
+
+    # IAstroidChecker interface #################################################
+
+    def open(self):
+        """initialize counters"""
+        self.stats = {'by_module' : {},
+                      'by_msg' : {},
+                     }
+        MANAGER.optimize_ast = self.config.optimize_ast
+        MANAGER.always_load_extensions = self.config.unsafe_load_any_extension
+        MANAGER.extension_package_whitelist.update(
+            self.config.extension_pkg_whitelist)
+        for msg_cat in six.itervalues(utils.MSG_TYPES):
+            self.stats[msg_cat] = 0
+
+    def generate_reports(self):
+        """close the whole package /module, it's time to make reports !
+
+        if persistent run, pickle results for later comparison
+        """
+        # Display whatever messages are left on the reporter.
+        self.reporter.display_messages(report_nodes.Section())
+
+        if self.file_state.base_name is not None:
+            # load previous results if any
+            previous_stats = config.load_results(self.file_state.base_name)
+            # XXX code below needs refactoring to be more reporter agnostic
+            self.reporter.on_close(self.stats, previous_stats)
+            if self.config.reports:
+                sect = self.make_reports(self.stats, previous_stats)
+                if self.config.files_output:
+                    filename = 'pylint_global.' + self.reporter.extension
+                    self.reporter.set_output(open(filename, 'w'))
+            else:
+                sect = report_nodes.Section()
+            if self.config.reports:
+                self.reporter.display_reports(sect)
+            # save results if persistent run
+            if self.config.persistent:
+                config.save_results(self.stats, self.file_state.base_name)
+        else:
+            self.reporter.on_close(self.stats, {})
+
+    # specific reports ########################################################
+
+    def report_evaluation(self, sect, stats, previous_stats):
+        """make the global evaluation report"""
+        # check with at least check 1 statements (usually 0 when there is a
+        # syntax error preventing pylint from further processing)
+        if stats['statement'] == 0:
+            raise utils.EmptyReport()
+        # get a global note for the code
+        evaluation = self.config.evaluation
+        try:
+            note = eval(evaluation, {}, self.stats) # pylint: disable=eval-used
+        except Exception as ex: # pylint: disable=broad-except
+            msg = 'An exception occurred while rating: %s' % ex
+        else:
+            stats['global_note'] = note
+            msg = 'Your code has been rated at %.2f/10' % note
+            pnote = previous_stats.get('global_note')
+            if pnote is not None:
+                msg += ' (previous run: %.2f/10, %+.2f)' % (pnote, note - pnote)
+        sect.append(report_nodes.Text(msg))
+
+# some reporting functions ####################################################
+
+def report_total_messages_stats(sect, stats, previous_stats):
+    """make total errors / warnings report"""
+    lines = ['type', 'number', 'previous', 'difference']
+    lines += checkers.table_lines_from_stats(stats, previous_stats,
+                                             ('convention', 'refactor',
+                                              'warning', 'error'))
+    sect.append(report_nodes.Table(children=lines, cols=4, rheaders=1))
+
+def report_messages_stats(sect, stats, _):
+    """make messages type report"""
+    if not stats['by_msg']:
+        # don't print this report when we didn't detected any errors
+        raise utils.EmptyReport()
+    in_order = sorted([(value, msg_id)
+                       for msg_id, value in six.iteritems(stats['by_msg'])
+                       if not msg_id.startswith('I')])
+    in_order.reverse()
+    lines = ('message id', 'occurrences')
+    for value, msg_id in in_order:
+        lines += (msg_id, str(value))
+    sect.append(report_nodes.Table(children=lines, cols=2, rheaders=1))
+
+def report_messages_by_module_stats(sect, stats, _):
+    """make errors / warnings by modules report"""
+    if len(stats['by_module']) == 1:
+        # don't print this report when we are analysing a single module
+        raise utils.EmptyReport()
+    by_mod = collections.defaultdict(dict)
+    for m_type in ('fatal', 'error', 'warning', 'refactor', 'convention'):
+        total = stats[m_type]
+        for module in six.iterkeys(stats['by_module']):
+            mod_total = stats['by_module'][module][m_type]
+            if total == 0:
+                percent = 0
+            else:
+                percent = float((mod_total)*100) / total
+            by_mod[module][m_type] = percent
+    sorted_result = []
+    for module, mod_info in six.iteritems(by_mod):
+        sorted_result.append((mod_info['error'],
+                              mod_info['warning'],
+                              mod_info['refactor'],
+                              mod_info['convention'],
+                              module))
+    sorted_result.sort()
+    sorted_result.reverse()
+    lines = ['module', 'error', 'warning', 'refactor', 'convention']
+    for line in sorted_result:
+        # Don't report clean modules.
+        if all(entry == 0 for entry in line[:-1]):
+            continue
+        lines.append(line[-1])
+        for val in line[:-1]:
+            lines.append('%.2f' % val)
+    if len(lines) == 5:
+        raise utils.EmptyReport()
+    sect.append(report_nodes.Table(children=lines, cols=5, rheaders=1))
+
+
+# utilities ###################################################################
+
+
+class ArgumentPreprocessingError(Exception):
+    """Raised if an error occurs during argument preprocessing."""
+
+
+def preprocess_options(args, search_for):
+    """look for some options (keys of <search_for>) which have to be processed
+    before others
+
+    values of <search_for> are callback functions to call when the option is
+    found
+    """
+    i = 0
+    while i < len(args):
+        arg = args[i]
+        if arg.startswith('--'):
+            try:
+                option, val = arg[2:].split('=', 1)
+            except ValueError:
+                option, val = arg[2:], None
+            try:
+                cb, takearg = search_for[option]
+            except KeyError:
+                i += 1
+            else:
+                del args[i]
+                if takearg and val is None:
+                    if i >= len(args) or args[i].startswith('-'):
+                        msg = 'Option %s expects a value' % option
+                        raise ArgumentPreprocessingError(msg)
+                    val = args[i]
+                    del args[i]
+                elif not takearg and val is not None:
+                    msg = "Option %s doesn't expects a value" % option
+                    raise ArgumentPreprocessingError(msg)
+                cb(option, val)
+        else:
+            i += 1
+
+
+@contextlib.contextmanager
+def fix_import_path(args):
+    """Prepare sys.path for running the linter checks.
+
+    Within this context, each of the given arguments is importable.
+    Paths are added to sys.path in corresponding order to the arguments.
+    We avoid adding duplicate directories to sys.path.
+    `sys.path` is reset to its original value upon exitign this context.
+    """
+    orig = list(sys.path)
+    changes = []
+    for arg in args:
+        path = _get_python_path(arg)
+        if path in changes:
+            continue
+        else:
+            changes.append(path)
+    sys.path[:] = changes + sys.path
+    try:
+        yield
+    finally:
+        sys.path[:] = orig
+
+
+class Run(object):
+    """helper class to use as main for pylint :
+
+    run(*sys.argv[1:])
+    """
+    LinterClass = PyLinter
+    option_groups = (
+        ('Commands', 'Options which are actually commands. Options in this \
+group are mutually exclusive.'),
+        )
+
+    def __init__(self, args, reporter=None, exit=True):
+        self._rcfile = None
+        self._plugins = []
+        try:
+            preprocess_options(args, {
+                # option: (callback, takearg)
+                'init-hook':   (cb_init_hook, True),
+                'rcfile':       (self.cb_set_rcfile, True),
+                'load-plugins': (self.cb_add_plugins, True),
+                })
+        except ArgumentPreprocessingError as ex:
+            print(ex, file=sys.stderr)
+            sys.exit(32)
+
+        self.linter = linter = self.LinterClass((
+            ('rcfile',
+             {'action' : 'callback', 'callback' : lambda *args: 1,
+              'type': 'string', 'metavar': '<file>',
+              'help' : 'Specify a configuration file.'}),
+
+            ('init-hook',
+             {'action' : 'callback', 'callback' : lambda *args: 1,
+              'type' : 'string', 'metavar': '<code>',
+              'level': 1,
+              'help' : 'Python code to execute, usually for sys.path '
+                       'manipulation such as pygtk.require().'}),
+
+            ('help-msg',
+             {'action' : 'callback', 'type' : 'string', 'metavar': '<msg-id>',
+              'callback' : self.cb_help_message,
+              'group': 'Commands',
+              'help' : 'Display a help message for the given message id and '
+                       'exit. The value may be a comma separated list of message ids.'}),
+
+            ('list-msgs',
+             {'action' : 'callback', 'metavar': '<msg-id>',
+              'callback' : self.cb_list_messages,
+              'group': 'Commands', 'level': 1,
+              'help' : "Generate pylint's messages."}),
+
+            ('list-conf-levels',
+             {'action' : 'callback',
+              'callback' : cb_list_confidence_levels,
+              'group': 'Commands', 'level': 1,
+              'help' : "Generate pylint's messages."}),
+
+            ('full-documentation',
+             {'action' : 'callback', 'metavar': '<msg-id>',
+              'callback' : self.cb_full_documentation,
+              'group': 'Commands', 'level': 1,
+              'help' : "Generate pylint's full documentation."}),
+
+            ('generate-rcfile',
+             {'action' : 'callback', 'callback' : self.cb_generate_config,
+              'group': 'Commands',
+              'help' : 'Generate a sample configuration file according to '
+                       'the current configuration. You can put other options '
+                       'before this one to get them in the generated '
+                       'configuration.'}),
+
+            ('generate-man',
+             {'action' : 'callback', 'callback' : self.cb_generate_manpage,
+              'group': 'Commands',
+              'help' : "Generate pylint's man page.", 'hide': True}),
+
+            ('errors-only',
+             {'action' : 'callback', 'callback' : self.cb_error_mode,
+              'short': 'E',
+              'help' : 'In error mode, checkers without error messages are '
+                       'disabled and for others, only the ERROR messages are '
+                       'displayed, and no reports are done by default'''}),
+
+            ('py3k',
+             {'action' : 'callback', 'callback' : self.cb_python3_porting_mode,
+              'help' : 'In Python 3 porting mode, all checkers will be '
+                       'disabled and only messages emitted by the porting '
+                       'checker will be displayed'}),
+
+            ('profile', utils.deprecated_option(opt_type='yn')),
+
+            ), option_groups=self.option_groups, pylintrc=self._rcfile)
+        # register standard checkers
+        linter.load_default_plugins()
+        # load command line plugins
+        linter.load_plugin_modules(self._plugins)
+        # add some help section
+        linter.add_help_section('Environment variables', config.ENV_HELP, level=1)
+        # pylint: disable=bad-continuation
+        linter.add_help_section('Output',
+'Using the default text output, the message format is :                          \n'
+'                                                                                \n'
+'        MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE                                \n'
+'                                                                                \n'
+'There are 5 kind of message types :                                             \n'
+'    * (C) convention, for programming standard violation                        \n'
+'    * (R) refactor, for bad code smell                                          \n'
+'    * (W) warning, for python specific problems                                 \n'
+'    * (E) error, for probable bugs in the code                                  \n'
+'    * (F) fatal, if an error occurred which prevented pylint from doing further\n'
+'processing.\n'
+                                , level=1)
+        linter.add_help_section('Output status code',
+'Pylint should leave with following status code:                                 \n'
+'    * 0 if everything went fine                                                 \n'
+'    * 1 if a fatal message was issued                                           \n'
+'    * 2 if an error message was issued                                          \n'
+'    * 4 if a warning message was issued                                         \n'
+'    * 8 if a refactor message was issued                                        \n'
+'    * 16 if a convention message was issued                                     \n'
+'    * 32 on usage error                                                         \n'
+'                                                                                \n'
+'status 1 to 16 will be bit-ORed so you can know which different categories has\n'
+'been issued by analysing pylint output status code\n',
+                                level=1)
+        # read configuration
+        linter.disable('suppressed-message')
+        linter.disable('useless-suppression')
+        linter.read_config_file()
+        config_parser = linter.cfgfile_parser
+        # run init hook, if present, before loading plugins
+        if config_parser.has_option('MASTER', 'init-hook'):
+            cb_init_hook('init-hook',
+                         utils._unquote(config_parser.get('MASTER',
+                                                          'init-hook')))
+        # is there some additional plugins in the file configuration, in
+        if config_parser.has_option('MASTER', 'load-plugins'):
+            plugins = utils._splitstrip(
+                config_parser.get('MASTER', 'load-plugins'))
+            linter.load_plugin_modules(plugins)
+        # now we can load file config and command line, plugins (which can
+        # provide options) have been registered
+        linter.load_config_file()
+        if reporter:
+            # if a custom reporter is provided as argument, it may be overridden
+            # by file parameters, so re-set it here, but before command line
+            # parsing so it's still overrideable by command line option
+            linter.set_reporter(reporter)
+        try:
+            args = linter.load_command_line_configuration(args)
+        except SystemExit as exc:
+            if exc.code == 2: # bad options
+                exc.code = 32
+            raise
+        if not args:
+            print(linter.help())
+            sys.exit(32)
+
+        if linter.config.jobs < 0:
+            print("Jobs number (%d) should be greater than 0"
+                  % linter.config.jobs, file=sys.stderr)
+            sys.exit(32)
+        if linter.config.jobs > 1 or linter.config.jobs == 0:
+            if multiprocessing is None:
+                print("Multiprocessing library is missing, "
+                      "fallback to single process", file=sys.stderr)
+                linter.set_option("jobs", 1)
+            else:
+                if linter.config.jobs == 0:
+                    linter.config.jobs = multiprocessing.cpu_count()
+
+        # insert current working directory to the python path to have a correct
+        # behaviour
+        with fix_import_path(args):
+            linter.check(args)
+            linter.generate_reports()
+        if exit:
+            sys.exit(self.linter.msg_status)
+
+    def cb_set_rcfile(self, name, value):
+        """callback for option preprocessing (i.e. before option parsing)"""
+        self._rcfile = value
+
+    def cb_add_plugins(self, name, value):
+        """callback for option preprocessing (i.e. before option parsing)"""
+        self._plugins.extend(utils._splitstrip(value))
+
+    def cb_error_mode(self, *args, **kwargs):
+        """error mode:
+        * disable all but error messages
+        * disable the 'miscellaneous' checker which can be safely deactivated in
+          debug
+        * disable reports
+        * do not save execution information
+        """
+        self.linter.error_mode()
+
+    def cb_generate_config(self, *args, **kwargs):
+        """optik callback for sample config file generation"""
+        self.linter.generate_config(skipsections=('COMMANDS',))
+        sys.exit(0)
+
+    def cb_generate_manpage(self, *args, **kwargs):
+        """optik callback for sample config file generation"""
+        from pylint import __pkginfo__
+        self.linter.generate_manpage(__pkginfo__)
+        sys.exit(0)
+
+    def cb_help_message(self, option, optname, value, parser):
+        """optik callback for printing some help about a particular message"""
+        self.linter.msgs_store.help_message(utils._splitstrip(value))
+        sys.exit(0)
+
+    def cb_full_documentation(self, option, optname, value, parser):
+        """optik callback for printing full documentation"""
+        self.linter.print_full_documentation()
+        sys.exit(0)
+
+    def cb_list_messages(self, option, optname, value, parser): # FIXME
+        """optik callback for printing available messages"""
+        self.linter.msgs_store.list_messages()
+        sys.exit(0)
+
+    def cb_python3_porting_mode(self, *args, **kwargs):
+        """Activate only the python3 porting checker."""
+        self.linter.python3_porting_mode()
+
+
+def cb_list_confidence_levels(option, optname, value, parser):
+    for level in interfaces.CONFIDENCE_LEVELS:
+        print('%-18s: %s' % level)
+    sys.exit(0)
+
+def cb_init_hook(optname, value):
+    """exec arbitrary code to set sys.path for instance"""
+    exec(value) # pylint: disable=exec-used
+
+
+if __name__ == '__main__':
+    Run(sys.argv[1:])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/extensions/check_docs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/extensions/check_docs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/extensions/check_docs.py	(revision 1126)
@@ -0,0 +1,311 @@
+"""Pylint plugin for parameter documentation checking in Sphinx, Google or
+Numpy style docstrings
+"""
+from __future__ import print_function, division, absolute_import
+
+import re
+
+from pylint.interfaces import IAstroidChecker
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import node_frame_class
+
+
+def space_indentation(s):
+    """The number of leading spaces in a string
+
+    :param str s: input string
+
+    :rtype: int
+    :return: number of leading spaces
+    """
+    return len(s) - len(s.lstrip(' '))
+
+
+class ParamDocChecker(BaseChecker):
+    """Checker for parameter documentation in Sphinx, Google or Numpy style
+    docstrings
+
+    * Check that all function, method and constructor parameters are mentioned
+      in the params and types part of the docstring. By convention,
+      constructor parameters are documented in the class docstring.
+    * Check that there are no naming inconsistencies between the signature and
+      the documentation, i.e. also report documented parameters that are missing
+      in the signature. This is important to find cases where parameters are
+      renamed only in the code, not in the documentation.
+
+    Activate this checker by adding the line::
+
+        load-plugins=pylint.extensions.check_docs
+
+    to the ``MASTER`` section of your ``.pylintrc``.
+
+    :param linter: linter object
+    :type linter: :class:`pylint.lint.PyLinter`
+    """
+    __implements__ = IAstroidChecker
+
+    name = 'param_checks'
+    msgs = {
+        'W9003': ('"%s" missing or differing in parameter documentation',
+                  'missing-param-doc',
+                  'Please add parameter declarations for all parameters.'),
+        'W9004': ('"%s" missing or differing in parameter type documentation',
+                  'missing-type-doc',
+                  'Please add parameter type declarations for all parameters.'),
+    }
+
+    options = (('accept-no-param-doc',
+                {'default': True, 'type' : 'yn', 'metavar' : '<y or n>',
+                 'help': 'Whether to accept totally missing parameter '
+                         'documentation in a docstring of a function that has '
+                         'parameters'
+                }),
+              )
+
+    priority = -2
+
+    def __init__(self, linter=None):
+        BaseChecker.__init__(self, linter)
+
+    constructor_names = set(["__init__", "__new__"])
+
+    def visit_functiondef(self, node):
+        """Called for function and method definitions (def).
+
+        :param node: Node for a function or method definition in the AST
+        :type node: :class:`astroid.scoped_nodes.Function`
+        """
+        if node.name in self.constructor_names:
+            class_node = node_frame_class(node)
+            if class_node is not None:
+                self.check_arguments_in_docstring(
+                    class_node.doc, node.args, class_node)
+                return
+        self.check_arguments_in_docstring(node.doc, node.args, node)
+
+    re_for_parameters_see = re.compile(r"""
+        For\s+the\s+(other)?\s*parameters\s*,\s+see
+        """, re.X | re.S)
+
+    re_sphinx_param_in_docstring = re.compile(r"""
+        :param                  # Sphinx keyword
+        \s+                     # whitespace
+
+        (?:                     # optional type declaration
+        (\w+)
+        \s+
+        )?
+
+        (\w+)                   # Parameter name
+        \s*                     # whitespace
+        :                       # final colon
+        """, re.X | re.S)
+
+    re_sphinx_type_in_docstring = re.compile(r"""
+        :type                   # Sphinx keyword
+        \s+                     # whitespace
+        (\w+)                   # Parameter name
+        \s*                     # whitespace
+        :                       # final colon
+        """, re.X | re.S)
+
+    re_google_param_section = re.compile(r"""
+        ^([ ]*)   Args \s*:   \s*?$   # Google parameter header
+        (  .* )                       # section
+        """, re.X | re.S | re.M)
+
+    re_google_param_line = re.compile(r"""
+        \s*  (\w+)                    # identifier
+        \s*  ( [(] .*? [)] )? \s* :   # optional type declaration
+        \s*  ( \w+ )?                 # beginning of optional description
+    """, re.X)
+
+    re_numpy_param_section = re.compile(r"""
+        ^([ ]*)   Parameters   \s*?$   # Numpy parameters header
+        \s*     [-=]+   \s*?$          # underline
+        (  .* )                        # section
+    """, re.X | re.S | re.M)
+
+    re_numpy_param_line = re.compile(r"""
+        \s*  (\w+)                    # identifier
+        \s*  :                        
+        \s*  ( \w+ )?                 # optional type declaration
+    """, re.X)
+
+    not_needed_param_in_docstring = set(['self', 'cls'])
+
+    def check_arguments_in_docstring(self, doc, arguments_node, warning_node):
+        """Check that all parameters in a function, method or class constructor
+        on the one hand and the parameters mentioned in the parameter
+        documentation (e.g. the Sphinx tags 'param' and 'type') on the other
+        hand are consistent with each other.
+
+        * Undocumented parameters except 'self' are noticed.
+        * Undocumented parameter types except for 'self' and the ``*<args>``
+          and ``**<kwargs>`` parameters are noticed.
+        * Parameters mentioned in the parameter documentation that don't or no
+          longer exist in the function parameter list are noticed.
+        * If the text "For the parameters, see" or "For the other parameters,
+          see" (ignoring additional whitespace) is mentioned in the docstring,
+          missing parameter documentation is tolerated.
+        * If there's no Sphinx style, Google style or NumPy style parameter
+          documentation at all, i.e. ``:param`` is never mentioned etc., the
+          checker assumes that the parameters are documented in another format
+          and the absence is tolerated.
+
+        :param doc: Docstring for the function, method or class.
+        :type doc: str
+
+        :param arguments_node: Arguments node for the function, method or
+            class constructor.
+        :type arguments_node: :class:`astroid.scoped_nodes.Arguments`
+
+        :param warning_node: The node to assign the warnings to
+        :type warning_node: :class:`astroid.scoped_nodes.Node`
+        """
+        # Tolerate missing param or type declarations if there is a link to
+        # another method carrying the same name.
+        if doc is None:
+            return
+
+        doc = doc.expandtabs()
+
+        tolerate_missing_params = self.re_for_parameters_see.search(doc) is not None
+
+        # Collect the function arguments.
+        expected_argument_names = [arg.name for arg in arguments_node.args]
+        expected_argument_names += [arg.name for arg in arguments_node.kwonlyargs]
+        not_needed_type_in_docstring = (
+            self.not_needed_param_in_docstring.copy())
+
+        if arguments_node.vararg is not None:
+            expected_argument_names.append(arguments_node.vararg)
+            not_needed_type_in_docstring.add(arguments_node.vararg)
+        if arguments_node.kwarg is not None:
+            expected_argument_names.append(arguments_node.kwarg)
+            not_needed_type_in_docstring.add(arguments_node.kwarg)
+        params_with_doc, params_with_type = self.match_param_docs(doc)
+
+        # Tolerate no parameter documentation at all.
+        if (not params_with_doc and not params_with_type
+                and self.config.accept_no_param_doc):
+            tolerate_missing_params = True
+
+        def _compare_args(found_argument_names, message_id, not_needed_names):
+            """Compare the found argument names with the expected ones and
+            generate a message if there are inconsistencies.
+
+            :param list found_argument_names: argument names found in the
+                docstring
+
+            :param str message_id: pylint message id
+
+            :param not_needed_names: names that may be omitted
+            :type not_needed_names: set of str
+            """
+            if not tolerate_missing_params:
+                missing_or_differing_argument_names = (
+                    (set(expected_argument_names) ^ set(found_argument_names))
+                    - not_needed_names)
+            else:
+                missing_or_differing_argument_names = (
+                    (set(found_argument_names) - set(expected_argument_names))
+                    - not_needed_names)
+
+            if missing_or_differing_argument_names:
+                self.add_message(
+                    message_id,
+                    args=(', '.join(
+                        sorted(missing_or_differing_argument_names)),),
+                    node=warning_node)
+
+        _compare_args(params_with_doc, 'missing-param-doc',
+                      self.not_needed_param_in_docstring)
+        _compare_args(params_with_type, 'missing-type-doc',
+                      not_needed_type_in_docstring)
+
+    def match_param_docs(self, doc):
+        """Match parameter documentation in docstrings written in Sphinx, Google
+        or NumPy style
+
+        :param str doc: docstring
+
+        :return: tuple of lists of str: params_with_doc, params_with_type
+        """
+        params_with_doc = []
+        params_with_type = []
+
+        if self.re_sphinx_param_in_docstring.search(doc) is not None:
+            # Sphinx param declarations
+            for match in re.finditer(self.re_sphinx_param_in_docstring, doc):
+                name = match.group(2)
+                params_with_doc.append(name)
+                if match.group(1) is not None:
+                    params_with_type.append(name)
+
+            # Sphinx type declarations
+            params_with_type += re.findall(
+                self.re_sphinx_type_in_docstring, doc)
+        else:
+            match = self.re_google_param_section.search(doc)
+            if match is not None:
+                is_google = True
+                re_line = self.re_google_param_line
+            else:
+                match = self.re_numpy_param_section.search(doc)
+                if match is not None:
+                    is_google = False
+                    re_line = self.re_numpy_param_line
+                else:
+                    # some other documentation style
+                    return [], []
+
+            min_indentation = len(match.group(1))
+            if is_google:
+                min_indentation += 1
+
+            prev_param_name = None
+            is_first = True
+            for line in match.group(2).splitlines():
+                if not line.strip():
+                    continue
+                indentation = space_indentation(line)
+                if indentation < min_indentation:
+                    break
+
+                # The first line after the header defines the minimum
+                # indentation.
+                if is_first:
+                    min_indentation = indentation
+                    is_first = False
+
+                if indentation > min_indentation:
+                    # Lines with more than minimum indentation must contain a
+                    # description.
+                    if (not params_with_doc
+                            or params_with_doc[-1] != prev_param_name):
+                        assert prev_param_name is not None
+                        params_with_doc.append(prev_param_name)
+                else:
+                    # Lines with minimum indentation must contain the beginning
+                    # of a new parameter documentation.
+                    match = re_line.match(line)
+                    if match is None:
+                        break
+                    prev_param_name = match.group(1)
+                    if match.group(2) is not None:
+                        params_with_type.append(prev_param_name)
+
+                    if is_google and match.group(3) is not None:
+                        params_with_doc.append(prev_param_name)
+
+        return params_with_doc, params_with_type
+
+
+def register(linter):
+    """Required method to auto register this checker.
+
+    :param linter: Main interface object for Pylint plugins
+    :type linter: Pylint object
+    """
+    linter.register_checker(ParamDocChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/extensions/check_elif.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/extensions/check_elif.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/extensions/check_elif.py	(revision 1126)
@@ -0,0 +1,62 @@
+import astroid
+from pylint.checkers import BaseTokenChecker
+from pylint.checkers.utils import check_messages
+from pylint.interfaces import ITokenChecker, IAstroidChecker
+
+
+class ElseifUsedChecker(BaseTokenChecker):
+    """Checks for use of "else if" when a "elif" could be used
+    """
+
+    __implements__ = (ITokenChecker, IAstroidChecker)
+    name = 'elseifused'
+    msgs = {'R5501': ('Consider using "elif" instead of "else if"',
+                      'else-if-used',
+                      'Used when an else statement is immediately followed by '
+                      'an if statement and does not contain statements that '
+                      'would be unrelated to it.'),
+           }
+
+    def __init__(self, linter=None):
+        BaseTokenChecker.__init__(self, linter)
+        self._init()
+
+    def _init(self):
+        self._elifs = []
+        self._if_counter = 0
+
+    def process_tokens(self, tokens):
+        # Process tokens and look for 'if' or 'elif'
+        for _, token, _, _, _ in tokens:
+            if token == 'elif':
+                self._elifs.append(True)
+            elif token == 'if':
+                self._elifs.append(False)
+
+    def leave_module(self, _):
+        self._init()
+
+    def visit_ifexp(self, _):
+        self._if_counter += 1
+
+    def visit_comprehension(self, node):
+        self._if_counter += len(node.ifs)
+
+    @check_messages('else-if-used')
+    def visit_if(self, node):
+        if isinstance(node.parent, astroid.If):
+            orelse = node.parent.orelse
+            # current if node must directly follow a "else"
+            if orelse and orelse == [node]:
+                if not self._elifs[self._if_counter]:
+                    self.add_message('else-if-used', node=node)
+        self._if_counter += 1
+
+
+def register(linter):
+    """Required method to auto register this checker.
+
+    :param linter: Main interface object for Pylint plugins
+    :type linter: Pylint object
+    """
+    linter.register_checker(ElseifUsedChecker(linter))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/extensions/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__main__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__main__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__main__.py	(revision 1126)
@@ -0,0 +1,3 @@
+#!/usr/bin/env python
+import pylint
+pylint.run_pylint()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/interfaces.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/interfaces.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/interfaces.py	(revision 1126)
@@ -0,0 +1,102 @@
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Interfaces for Pylint objects"""
+from collections import namedtuple
+
+Confidence = namedtuple('Confidence', ['name', 'description'])
+# Warning Certainties
+HIGH = Confidence('HIGH', 'No false positive possible.')
+INFERENCE = Confidence('INFERENCE', 'Warning based on inference result.')
+INFERENCE_FAILURE = Confidence('INFERENCE_FAILURE',
+                               'Warning based on inference with failures.')
+UNDEFINED = Confidence('UNDEFINED',
+                       'Warning without any associated confidence level.')
+
+CONFIDENCE_LEVELS = [HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED]
+
+
+class Interface(object):
+    """Base class for interfaces."""
+    @classmethod
+    def is_implemented_by(cls, instance):
+        return implements(instance, cls)
+
+
+def implements(obj, interface):
+    """Return true if the give object (maybe an instance or class) implements
+    the interface.
+    """
+    kimplements = getattr(obj, '__implements__', ())
+    if not isinstance(kimplements, (list, tuple)):
+        kimplements = (kimplements,)
+    for implementedinterface in kimplements:
+        if issubclass(implementedinterface, interface):
+            return True
+    return False
+
+
+class IChecker(Interface):
+    """This is an base interface, not designed to be used elsewhere than for
+    sub interfaces definition.
+    """
+
+    def open(self):
+        """called before visiting project (i.e set of modules)"""
+
+    def close(self):
+        """called after visiting project (i.e set of modules)"""
+
+
+class IRawChecker(IChecker):
+    """interface for checker which need to parse the raw file
+    """
+
+    def process_module(self, astroid):
+        """ process a module
+
+        the module's content is accessible via astroid.stream
+        """
+
+
+class ITokenChecker(IChecker):
+    """Interface for checkers that need access to the token list."""
+    def process_tokens(self, tokens):
+        """Process a module.
+
+        tokens is a list of all source code tokens in the file.
+        """
+
+
+class IAstroidChecker(IChecker):
+    """ interface for checker which prefers receive events according to
+    statement type
+    """
+
+
+class IReporter(Interface):
+    """ reporter collect messages and display results encapsulated in a layout
+    """
+    def add_message(self, msg_id, location, msg):
+        """add a message of a given type
+
+        msg_id is a message identifier
+        location is a 3-uple (module, object, line)
+        msg is the actual message
+        """
+
+    def display_reports(self, layout):
+        """display results encapsulated in the layout tree
+        """
+
+
+__all__ = ('IRawChecker', 'IAstroidChecker', 'ITokenChecker', 'IReporter')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/epylint.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/epylint.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/epylint.py	(revision 1126)
@@ -0,0 +1,178 @@
+# -*- coding: utf-8; mode: python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4
+# -*- vim:fenc=utf-8:ft=python:et:sw=4:ts=4:sts=4
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Emacs and Flymake compatible Pylint.
+
+This script is for integration with emacs and is compatible with flymake mode.
+
+epylint walks out of python packages before invoking pylint. This avoids
+reporting import errors that occur when a module within a package uses the
+absolute import path to get another module within this package.
+
+For example:
+    - Suppose a package is structured as
+
+        a/__init__.py
+        a/b/x.py
+        a/c/y.py
+
+   - Then if y.py imports x as "from a.b import x" the following produces pylint
+     errors
+
+       cd a/c; pylint y.py
+
+   - The following obviously doesn't
+
+       pylint a/c/y.py
+
+   - As this script will be invoked by emacs within the directory of the file
+     we are checking we need to go out of it to avoid these false positives.
+
+
+You may also use py_run to run pylint with desired options and get back (or not)
+its output.
+"""
+from __future__ import print_function
+
+import os
+import os.path as osp
+import sys
+from subprocess import Popen, PIPE
+
+def _get_env():
+    '''Extracts the environment PYTHONPATH and appends the current sys.path to
+    those.'''
+    env = dict(os.environ)
+    env['PYTHONPATH'] = os.pathsep.join(sys.path)
+    return env
+
+def lint(filename, options=None):
+    """Pylint the given file.
+
+    When run from emacs we will be in the directory of a file, and passed its
+    filename.  If this file is part of a package and is trying to import other
+    modules from within its own package or another package rooted in a directory
+    below it, pylint will classify it as a failed import.
+
+    To get around this, we traverse down the directory tree to find the root of
+    the package this module is in.  We then invoke pylint from this directory.
+
+    Finally, we must correct the filenames in the output generated by pylint so
+    Emacs doesn't become confused (it will expect just the original filename,
+    while pylint may extend it with extra directories if we've traversed down
+    the tree)
+    """
+    # traverse downwards until we are out of a python package
+    full_path = osp.abspath(filename)
+    parent_path = osp.dirname(full_path)
+    child_path = osp.basename(full_path)
+
+    while parent_path != "/" and osp.exists(osp.join(parent_path, '__init__.py')):
+        child_path = osp.join(osp.basename(parent_path), child_path)
+        parent_path = osp.dirname(parent_path)
+
+    # Start pylint
+    # Ensure we use the python and pylint associated with the running epylint
+    from pylint import lint as lint_mod
+    lint_path = lint_mod.__file__
+    options = options or ['--disable=C,R,I']
+    cmd = [sys.executable, lint_path] + options + [
+        '--msg-template', '{path}:{line}: {category} ({msg_id}, {symbol}, {obj}) {msg}',
+        '-r', 'n', child_path]
+    process = Popen(cmd, stdout=PIPE, cwd=parent_path, env=_get_env(),
+                    universal_newlines=True)
+
+    for line in process.stdout:
+        # remove pylintrc warning
+        if line.startswith("No config file found"):
+            continue
+
+        # modify the file name thats output to reverse the path traversal we made
+        parts = line.split(":")
+        if parts and parts[0] == child_path:
+            line = ":".join([filename] + parts[1:])
+        print(line, end=' ')
+
+    process.wait()
+    return process.returncode
+
+
+def py_run(command_options='', return_std=False, stdout=None, stderr=None,
+           script='epylint'):
+    """Run pylint from python
+
+    ``command_options`` is a string containing ``pylint`` command line options;
+    ``return_std`` (boolean) indicates return of created standard output
+    and error (see below);
+    ``stdout`` and ``stderr`` are 'file-like' objects in which standard output
+    could be written.
+
+    Calling agent is responsible for stdout/err management (creation, close).
+    Default standard output and error are those from sys,
+    or standalone ones (``subprocess.PIPE``) are used
+    if they are not set and ``return_std``.
+
+    If ``return_std`` is set to ``True``, this function returns a 2-uple
+    containing standard output and error related to created process,
+    as follows: ``(stdout, stderr)``.
+
+    A trivial usage could be as follows:
+        >>> py_run( '--version')
+        No config file found, using default configuration
+        pylint 0.18.1,
+            ...
+
+    To silently run Pylint on a module, and get its standard output and error:
+        >>> (pylint_stdout, pylint_stderr) = py_run( 'module_name.py', True)
+    """
+    # Create command line to call pylint
+    if os.name == 'nt':
+        script += '.bat'
+    command_line = script + ' ' + command_options
+    # Providing standard output and/or error if not set
+    if stdout is None:
+        if return_std:
+            stdout = PIPE
+        else:
+            stdout = sys.stdout
+    if stderr is None:
+        if return_std:
+            stderr = PIPE
+        else:
+            stderr = sys.stderr
+    # Call pylint in a subprocess
+    process = Popen(command_line, shell=True, stdout=stdout, stderr=stderr,
+                    env=_get_env(), universal_newlines=True)
+    process.wait()
+    # Return standard output and error
+    if return_std:
+        return (process.stdout, process.stderr)
+
+
+def Run():
+    if len(sys.argv) == 1:
+        print("Usage: %s <filename> [options]" % sys.argv[0])
+        sys.exit(1)
+    elif not osp.exists(sys.argv[1]):
+        print("%s does not exist" % sys.argv[1])
+        sys.exit(1)
+    else:
+        sys.exit(lint(sys.argv[1], sys.argv[2:]))
+
+
+if __name__ == '__main__':
+    Run()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/gui.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/gui.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/gui.py	(revision 1126)
@@ -0,0 +1,531 @@
+# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Tkinker gui for pylint"""
+from __future__ import print_function
+
+import os
+import sys
+import re
+from threading import Thread
+
+import six
+
+from six.moves.tkinter import (
+    Tk, Frame, Listbox, Entry, Label, Button, Scrollbar,
+    Checkbutton, Radiobutton, IntVar, StringVar, PanedWindow,
+    TOP, LEFT, RIGHT, BOTTOM, END, X, Y, BOTH, SUNKEN, W,
+    HORIZONTAL, DISABLED, NORMAL,
+)
+from six.moves.tkinter_tkfiledialog import (
+    askopenfilename, askdirectory,
+)
+
+import pylint.lint
+from pylint.reporters.guireporter import GUIReporter
+
+HOME = os.path.expanduser('~/')
+HISTORY = '.pylint-gui-history'
+COLORS = {'(I)':'green',
+          '(C)':'blue', '(R)':'darkblue',
+          '(W)':'black', '(E)':'darkred',
+          '(F)':'red'}
+
+
+def convert_to_string(msg):
+    """make a string representation of a message"""
+    module_object = msg.module
+    if msg.obj:
+        module_object += ".%s" % msg.obj
+    return "(%s) %s [%d]: %s" % (msg.C, module_object, msg.line, msg.msg)
+
+class BasicStream(object):
+    '''
+    used in gui reporter instead of writing to stdout, it is written to
+    this stream and saved in contents
+    '''
+    def __init__(self, gui):
+        """init"""
+        self.curline = ""
+        self.gui = gui
+        self.contents = []
+        self.outdict = {}
+        self.currout = None
+        self.next_title = None
+
+    def write(self, text):
+        """write text to the stream"""
+        if re.match('^--+$', text.strip()) or re.match('^==+$', text.strip()):
+            if self.currout:
+                self.outdict[self.currout].remove(self.next_title)
+                self.outdict[self.currout].pop()
+            self.currout = self.next_title
+            self.outdict[self.currout] = ['']
+
+        if text.strip():
+            self.next_title = text.strip()
+
+        if text.startswith(os.linesep):
+            self.contents.append('')
+            if self.currout:
+                self.outdict[self.currout].append('')
+        self.contents[-1] += text.strip(os.linesep)
+        if self.currout:
+            self.outdict[self.currout][-1] += text.strip(os.linesep)
+        if text.endswith(os.linesep) and text.strip():
+            self.contents.append('')
+            if self.currout:
+                self.outdict[self.currout].append('')
+
+    def fix_contents(self):
+        """finalize what the contents of the dict should look like before output"""
+        for item in self.outdict:
+            num_empty = self.outdict[item].count('')
+            for _ in range(num_empty):
+                self.outdict[item].remove('')
+            if self.outdict[item]:
+                self.outdict[item].pop(0)
+
+    def output_contents(self):
+        """output contents of dict to the gui, and set the rating"""
+        self.fix_contents()
+        self.gui.tabs = self.outdict
+        try:
+            self.gui.rating.set(self.outdict['Global evaluation'][0])
+        except KeyError:
+            self.gui.rating.set('Error')
+        self.gui.refresh_results_window()
+
+        #reset stream variables for next run
+        self.contents = []
+        self.outdict = {}
+        self.currout = None
+        self.next_title = None
+
+
+class LintGui(object):
+    """Build and control a window to interact with pylint"""
+
+    def __init__(self, root=None):
+        """init"""
+        self.root = root or Tk()
+        self.root.title('Pylint')
+        #reporter
+        self.reporter = None
+        #message queue for output from reporter
+        self.msg_queue = six.moves.queue.Queue()
+        self.msgs = []
+        self.visible_msgs = []
+        self.filenames = []
+        self.rating = StringVar()
+        self.tabs = {}
+        self.report_stream = BasicStream(self)
+        #gui objects
+        self.lb_messages = None
+        self.showhistory = None
+        self.results = None
+        self.btnRun = None
+        self.information_box = None
+        self.convention_box = None
+        self.refactor_box = None
+        self.warning_box = None
+        self.error_box = None
+        self.fatal_box = None
+        self.txtModule = None
+        self.status = None
+        self.msg_type_dict = None
+        self.init_gui()
+
+    def init_gui(self):
+        """init helper"""
+
+        window = PanedWindow(self.root, orient="vertical")
+        window.pack(side=TOP, fill=BOTH, expand=True)
+
+        top_pane = Frame(window)
+        window.add(top_pane)
+        mid_pane = Frame(window)
+        window.add(mid_pane)
+        bottom_pane = Frame(window)
+        window.add(bottom_pane)
+
+        #setting up frames
+        top_frame = Frame(top_pane)
+        mid_frame = Frame(top_pane)
+        history_frame = Frame(top_pane)
+        radio_frame = Frame(mid_pane)
+        rating_frame = Frame(mid_pane)
+        res_frame = Frame(mid_pane)
+        check_frame = Frame(bottom_pane)
+        msg_frame = Frame(bottom_pane)
+        btn_frame = Frame(bottom_pane)
+        top_frame.pack(side=TOP, fill=X)
+        mid_frame.pack(side=TOP, fill=X)
+        history_frame.pack(side=TOP, fill=BOTH, expand=True)
+        radio_frame.pack(side=TOP, fill=X)
+        rating_frame.pack(side=TOP, fill=X)
+        res_frame.pack(side=TOP, fill=BOTH, expand=True)
+        check_frame.pack(side=TOP, fill=X)
+        msg_frame.pack(side=TOP, fill=BOTH, expand=True)
+        btn_frame.pack(side=TOP, fill=X)
+
+        # Binding F5 application-wide to run lint
+        self.root.bind('<F5>', self.run_lint)
+
+        #Message ListBox
+        rightscrollbar = Scrollbar(msg_frame)
+        rightscrollbar.pack(side=RIGHT, fill=Y)
+        bottomscrollbar = Scrollbar(msg_frame, orient=HORIZONTAL)
+        bottomscrollbar.pack(side=BOTTOM, fill=X)
+        self.lb_messages = Listbox(
+            msg_frame,
+            yscrollcommand=rightscrollbar.set,
+            xscrollcommand=bottomscrollbar.set,
+            bg="white")
+        self.lb_messages.bind("<Double-Button-1>", self.show_sourcefile)
+        self.lb_messages.pack(expand=True, fill=BOTH)
+        rightscrollbar.config(command=self.lb_messages.yview)
+        bottomscrollbar.config(command=self.lb_messages.xview)
+
+        #History ListBoxes
+        rightscrollbar2 = Scrollbar(history_frame)
+        rightscrollbar2.pack(side=RIGHT, fill=Y)
+        bottomscrollbar2 = Scrollbar(history_frame, orient=HORIZONTAL)
+        bottomscrollbar2.pack(side=BOTTOM, fill=X)
+        self.showhistory = Listbox(
+            history_frame,
+            yscrollcommand=rightscrollbar2.set,
+            xscrollcommand=bottomscrollbar2.set,
+            bg="white")
+        self.showhistory.pack(expand=True, fill=BOTH)
+        rightscrollbar2.config(command=self.showhistory.yview)
+        bottomscrollbar2.config(command=self.showhistory.xview)
+        self.showhistory.bind('<Double-Button-1>', self.select_recent_file)
+        self.set_history_window()
+
+        #status bar
+        self.status = Label(self.root, text="", bd=1, relief=SUNKEN, anchor=W)
+        self.status.pack(side=BOTTOM, fill=X)
+
+        #labelbl_ratingls
+        lbl_rating_label = Label(rating_frame, text='Rating:')
+        lbl_rating_label.pack(side=LEFT)
+        lbl_rating = Label(rating_frame, textvariable=self.rating)
+        lbl_rating.pack(side=LEFT)
+        Label(mid_frame, text='Recently Used:').pack(side=LEFT)
+        Label(top_frame, text='Module or package').pack(side=LEFT)
+
+        #file textbox
+        self.txt_module = Entry(top_frame, background='white')
+        self.txt_module.bind('<Return>', self.run_lint)
+        self.txt_module.pack(side=LEFT, expand=True, fill=X)
+
+        #results box
+        rightscrollbar = Scrollbar(res_frame)
+        rightscrollbar.pack(side=RIGHT, fill=Y)
+        bottomscrollbar = Scrollbar(res_frame, orient=HORIZONTAL)
+        bottomscrollbar.pack(side=BOTTOM, fill=X)
+        self.results = Listbox(
+            res_frame,
+            yscrollcommand=rightscrollbar.set,
+            xscrollcommand=bottomscrollbar.set,
+            bg="white", font="Courier")
+        self.results.pack(expand=True, fill=BOTH, side=BOTTOM)
+        rightscrollbar.config(command=self.results.yview)
+        bottomscrollbar.config(command=self.results.xview)
+
+        #buttons
+        Button(top_frame, text='Open', command=self.file_open).pack(side=LEFT)
+        Button(top_frame, text='Open Package',
+               command=(lambda: self.file_open(package=True))).pack(side=LEFT)
+
+        self.btnRun = Button(top_frame, text='Run', command=self.run_lint)
+        self.btnRun.pack(side=LEFT)
+        Button(btn_frame, text='Quit', command=self.quit).pack(side=BOTTOM)
+
+        #radio buttons
+        self.information_box = IntVar()
+        self.convention_box = IntVar()
+        self.refactor_box = IntVar()
+        self.warning_box = IntVar()
+        self.error_box = IntVar()
+        self.fatal_box = IntVar()
+        i = Checkbutton(check_frame, text="Information", fg=COLORS['(I)'],
+                        variable=self.information_box, command=self.refresh_msg_window)
+        c = Checkbutton(check_frame, text="Convention", fg=COLORS['(C)'],
+                        variable=self.convention_box, command=self.refresh_msg_window)
+        r = Checkbutton(check_frame, text="Refactor", fg=COLORS['(R)'],
+                        variable=self.refactor_box, command=self.refresh_msg_window)
+        w = Checkbutton(check_frame, text="Warning", fg=COLORS['(W)'],
+                        variable=self.warning_box, command=self.refresh_msg_window)
+        e = Checkbutton(check_frame, text="Error", fg=COLORS['(E)'],
+                        variable=self.error_box, command=self.refresh_msg_window)
+        f = Checkbutton(check_frame, text="Fatal", fg=COLORS['(F)'],
+                        variable=self.fatal_box, command=self.refresh_msg_window)
+        i.select()
+        c.select()
+        r.select()
+        w.select()
+        e.select()
+        f.select()
+        i.pack(side=LEFT)
+        c.pack(side=LEFT)
+        r.pack(side=LEFT)
+        w.pack(side=LEFT)
+        e.pack(side=LEFT)
+        f.pack(side=LEFT)
+
+        #check boxes
+        self.box = StringVar()
+        # XXX should be generated
+        report = Radiobutton(
+            radio_frame, text="Report", variable=self.box,
+            value="Report", command=self.refresh_results_window)
+        raw_met = Radiobutton(
+            radio_frame, text="Raw metrics", variable=self.box,
+            value="Raw metrics", command=self.refresh_results_window)
+        dup = Radiobutton(
+            radio_frame, text="Duplication", variable=self.box,
+            value="Duplication", command=self.refresh_results_window)
+        ext = Radiobutton(
+            radio_frame, text="External dependencies",
+            variable=self.box, value="External dependencies",
+            command=self.refresh_results_window)
+        stat = Radiobutton(
+            radio_frame, text="Statistics by type",
+            variable=self.box, value="Statistics by type",
+            command=self.refresh_results_window)
+        msg_cat = Radiobutton(
+            radio_frame, text="Messages by category",
+            variable=self.box, value="Messages by category",
+            command=self.refresh_results_window)
+        msg = Radiobutton(
+            radio_frame, text="Messages", variable=self.box,
+            value="Messages", command=self.refresh_results_window)
+        source_file = Radiobutton(
+            radio_frame, text="Source File", variable=self.box,
+            value="Source File", command=self.refresh_results_window)
+        report.select()
+        report.grid(column=0, row=0, sticky=W)
+        raw_met.grid(column=1, row=0, sticky=W)
+        dup.grid(column=2, row=0, sticky=W)
+        msg.grid(column=3, row=0, sticky=W)
+        stat.grid(column=0, row=1, sticky=W)
+        msg_cat.grid(column=1, row=1, sticky=W)
+        ext.grid(column=2, row=1, sticky=W)
+        source_file.grid(column=3, row=1, sticky=W)
+
+        #dictionary for check boxes and associated error term
+        self.msg_type_dict = {
+            'I': lambda: self.information_box.get() == 1,
+            'C': lambda: self.convention_box.get() == 1,
+            'R': lambda: self.refactor_box.get() == 1,
+            'E': lambda: self.error_box.get() == 1,
+            'W': lambda: self.warning_box.get() == 1,
+            'F': lambda: self.fatal_box.get() == 1
+        }
+        self.txt_module.focus_set()
+
+
+    def select_recent_file(self, event): # pylint: disable=unused-argument
+        """adds the selected file in the history listbox to the Module box"""
+        if not self.showhistory.size():
+            return
+
+        selected = self.showhistory.curselection()
+        item = self.showhistory.get(selected)
+        #update module
+        self.txt_module.delete(0, END)
+        self.txt_module.insert(0, item)
+
+    def refresh_msg_window(self):
+        """refresh the message window with current output"""
+        #clear the window
+        self.lb_messages.delete(0, END)
+        self.visible_msgs = []
+        for msg in self.msgs:
+            if self.msg_type_dict.get(msg.C)():
+                self.visible_msgs.append(msg)
+                msg_str = convert_to_string(msg)
+                self.lb_messages.insert(END, msg_str)
+                fg_color = COLORS.get(msg_str[:3], 'black')
+                self.lb_messages.itemconfigure(END, fg=fg_color)
+
+    def refresh_results_window(self):
+        """refresh the results window with current output"""
+        #clear the window
+        self.results.delete(0, END)
+        try:
+            for res in self.tabs[self.box.get()]:
+                self.results.insert(END, res)
+        except KeyError:
+            pass
+
+    def process_incoming(self):
+        """process the incoming messages from running pylint"""
+        while self.msg_queue.qsize():
+            try:
+                msg = self.msg_queue.get(0)
+                if msg == "DONE":
+                    self.report_stream.output_contents()
+                    return False
+
+                #adding message to list of msgs
+                self.msgs.append(msg)
+
+                #displaying msg if message type is selected in check box
+                if self.msg_type_dict.get(msg.C)():
+                    self.visible_msgs.append(msg)
+                    msg_str = convert_to_string(msg)
+                    self.lb_messages.insert(END, msg_str)
+                    fg_color = COLORS.get(msg_str[:3], 'black')
+                    self.lb_messages.itemconfigure(END, fg=fg_color)
+
+            except six.moves.queue.Empty:
+                pass
+        return True
+
+    def periodic_call(self):
+        """determine when to unlock the run button"""
+        if self.process_incoming():
+            self.root.after(100, self.periodic_call)
+        else:
+            #enabling button so it can be run again
+            self.btnRun.config(state=NORMAL)
+
+    def mainloop(self):
+        """launch the mainloop of the application"""
+        self.root.mainloop()
+
+    def quit(self, _=None):
+        """quit the application"""
+        self.root.quit()
+
+    def halt(self): # pylint: disable=no-self-use
+        """program halt placeholder"""
+        return
+
+    def file_open(self, package=False, _=None):
+        """launch a file browser"""
+        if not package:
+            filename = askopenfilename(parent=self.root,
+                                       filetypes=[('pythonfiles', '*.py'),
+                                                  ('allfiles', '*')],
+                                       title='Select Module')
+        else:
+            filename = askdirectory(title="Select A Folder", mustexist=1)
+
+        if filename == ():
+            return
+
+        self.txt_module.delete(0, END)
+        self.txt_module.insert(0, filename)
+
+    def update_filenames(self):
+        """update the list of recent filenames"""
+        filename = self.txt_module.get()
+        if not filename:
+            filename = os.getcwd()
+        if filename+'\n' in self.filenames:
+            index = self.filenames.index(filename+'\n')
+            self.filenames.pop(index)
+
+        #ensure only 10 most recent are stored
+        if len(self.filenames) == 10:
+            self.filenames.pop()
+        self.filenames.insert(0, filename+'\n')
+
+    def set_history_window(self):
+        """update the history window with info from the history file"""
+        #clear the window
+        self.showhistory.delete(0, END)
+        # keep the last 10 most recent files
+        try:
+            view_history = open(HOME+HISTORY, 'r')
+            for hist in view_history.readlines():
+                if hist not in self.filenames:
+                    self.filenames.append(hist)
+                self.showhistory.insert(END, hist.split('\n')[0])
+            view_history.close()
+        except IOError:
+            # do nothing since history file will be created later
+            return
+
+    def run_lint(self, _=None):
+        """launches pylint"""
+        self.update_filenames()
+        self.root.configure(cursor='watch')
+        self.reporter = GUIReporter(self, output=self.report_stream)
+        module = self.txt_module.get()
+        if not module:
+            module = os.getcwd()
+
+        #cleaning up msgs and windows
+        self.msgs = []
+        self.visible_msgs = []
+        self.lb_messages.delete(0, END)
+        self.tabs = {}
+        self.results.delete(0, END)
+        self.btnRun.config(state=DISABLED)
+
+        #setting up a worker thread to run pylint
+        worker = Thread(target=lint_thread, args=(module, self.reporter, self,))
+        self.periodic_call()
+        worker.start()
+
+        # Overwrite the .pylint-gui-history file with all the new recently added files
+        # in order from filenames but only save last 10 files
+        write_history = open(HOME+HISTORY, 'w')
+        write_history.writelines(self.filenames)
+        write_history.close()
+        self.set_history_window()
+
+        self.root.configure(cursor='')
+
+    def show_sourcefile(self, event=None):  # pylint: disable=unused-argument
+        selected = self.lb_messages.curselection()
+        if not selected:
+            return
+
+        msg = self.visible_msgs[int(selected[0])]
+        scroll = msg.line - 3
+        if scroll < 0:
+            scroll = 0
+
+        self.tabs["Source File"] = open(msg.path, "r").readlines()
+        self.box.set("Source File")
+        self.refresh_results_window()
+        self.results.yview(scroll)
+        self.results.select_set(msg.line - 1)
+
+
+def lint_thread(module, reporter, gui):
+    """thread for pylint"""
+    gui.status.text = "processing module(s)"
+    pylint.lint.Run(args=[module], reporter=reporter, exit=False)
+    gui.msg_queue.put("DONE")
+
+
+def Run(args):
+    """launch pylint gui from args"""
+    if args:
+        print('USAGE: pylint-gui\n launch a simple pylint gui using Tk')
+        sys.exit(1)
+    gui = LintGui()
+    gui.mainloop()
+    sys.exit(0)
+
+if __name__ == '__main__':
+    Run(sys.argv[1:])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checkers_utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checkers_utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checkers_utils.py	(revision 1126)
@@ -0,0 +1,128 @@
+# Copyright (c) 2003-2005 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Tests for the pylint.checkers.utils module."""
+
+import unittest
+import warnings
+
+from astroid import test_utils
+
+from pylint.checkers import utils
+from pylint import __pkginfo__
+
+class UtilsTC(unittest.TestCase):
+
+    def test_is_builtin(self):
+        self.assertEqual(utils.is_builtin('min'), True)
+        self.assertEqual(utils.is_builtin('__builtins__'), True)
+        self.assertEqual(utils.is_builtin('__path__'), False)
+        self.assertEqual(utils.is_builtin('__file__'), False)
+        self.assertEqual(utils.is_builtin('whatever'), False)
+        self.assertEqual(utils.is_builtin('mybuiltin'), False)
+
+    def testGetArgumentFromCall(self):
+        node = test_utils.extract_node('foo(bar=3)')
+        self.assertIsNotNone(utils.get_argument_from_call(node, keyword='bar'))
+        with self.assertRaises(utils.NoSuchArgumentError):
+            node = test_utils.extract_node('foo(3)')
+            utils.get_argument_from_call(node, keyword='bar')
+        with self.assertRaises(utils.NoSuchArgumentError):
+            node = test_utils.extract_node('foo(one=a, two=b, three=c)')
+            utils.get_argument_from_call(node, position=1)
+        node = test_utils.extract_node('foo(a, b, c)')
+        self.assertIsNotNone(utils.get_argument_from_call(node, position=1))
+        node = test_utils.extract_node('foo(a, not_this_one=1, this_one=2)')
+        arg = utils.get_argument_from_call(node, position=2, keyword='this_one')
+        self.assertEqual(2, arg.value)
+        node = test_utils.extract_node('foo(a)')
+        with self.assertRaises(utils.NoSuchArgumentError):
+            utils.get_argument_from_call(node, position=1)
+        with self.assertRaises(ValueError):
+            utils.get_argument_from_call(node, None, None)
+
+        name = utils.get_argument_from_call(node, position=0)
+        self.assertEqual(name.name, 'a')
+
+    def test_is_import_error(self):
+        import_error, not_import_error = test_utils.extract_node("""
+        try:
+            pass
+        except ImportError: #@
+            pass
+
+        try:
+            pass
+        except AttributeError: #@
+            pass
+        """)
+
+        if __pkginfo__.numversion >= (1, 6, 0):
+            with self.assertRaises(AttributeError):
+                utils.is_import_error
+
+        with warnings.catch_warnings(record=True) as cm:
+            warnings.simplefilter("always")
+
+            self.assertTrue(utils.is_import_error(import_error))
+            self.assertFalse(utils.is_import_error(not_import_error))
+
+        self.assertEqual(len(cm), 2)
+        self.assertIsInstance(cm[0].message, DeprecationWarning)
+
+    def test_error_of_type(self):
+        nodes = test_utils.extract_node("""
+        try: pass
+        except AttributeError: #@
+             pass
+        try: pass
+        except Exception: #@
+             pass
+        except: #@
+             pass
+        """)
+        self.assertTrue(utils.error_of_type(nodes[0], AttributeError))
+        self.assertTrue(utils.error_of_type(nodes[0], (AttributeError, )))
+        self.assertFalse(utils.error_of_type(nodes[0], Exception))
+        self.assertTrue(utils.error_of_type(nodes[1], Exception))
+        self.assertTrue(utils.error_of_type(nodes[2], ImportError))
+
+    def test_node_ignores_exception(self):
+        nodes = test_utils.extract_node("""
+        try:
+            1/0 #@
+        except ZeroDivisionError:
+            pass
+        try:
+            1/0 #@
+        except Exception:
+            pass
+        try:
+            1/0 #@
+        except:
+            pass
+        try:
+            1/0 #@
+        except ValueError:
+            pass
+        """)
+        self.assertTrue(utils.node_ignores_exception(nodes[0], ZeroDivisionError))
+        self.assertTrue(utils.node_ignores_exception(nodes[1], ZeroDivisionError))
+        self.assertTrue(utils.node_ignores_exception(nodes[2], ZeroDivisionError))
+        self.assertFalse(utils.node_ignores_exception(nodes[3], ZeroDivisionError))
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_mcs_attr_access.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_mcs_attr_access.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_mcs_attr_access.py	(revision 1126)
@@ -0,0 +1,20 @@
+# pylint: disable=R0903, metaclass-assignment
+"""test attribute access on metaclass"""
+
+
+from __future__ import print_function
+
+class Meta(type):
+    """the meta class"""
+    def __init__(cls, name, bases, dictionary):
+        super(Meta, cls).__init__(name, bases, dictionary)
+        print(cls, cls._meta_args)
+        delattr(cls, '_meta_args')
+
+class Test(object):
+    """metaclassed class"""
+    __metaclass__ = Meta
+    _meta_args = ('foo', 'bar')
+
+    def __init__(self):
+        print('__init__', self)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_overloaded_operator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_overloaded_operator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_overloaded_operator.py	(revision 1126)
@@ -0,0 +1,21 @@
+# pylint: disable=C0111,R0903
+"""#3291"""
+from __future__ import print_function
+
+class Myarray(object):
+    def __init__(self, array):
+        self.array = array
+
+    def __mul__(self, val):
+        return Myarray(val)
+
+    def astype(self):
+        return "ASTYPE", self
+
+def randint(maximum):
+    if maximum is not None:
+        return Myarray([1, 2, 3]) * 2
+    else:
+        return int(5)
+
+print(randint(1).astype()) # we don't wan't an error for astype access
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e12xx.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e12xx.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e12xx.py	(revision 1126)
@@ -0,0 +1,28 @@
+# pylint: disable=E1101, no-absolute-import
+"""Test checking of log format strings
+"""
+
+import logging
+
+__revision__ = ''
+
+
+def pprint():
+    """Test string format in logging statements.
+    """
+    # These should all emit lint errors:
+    logging.info(0, '') # 1205
+    logging.info('', '') # 1205
+    logging.info('%s%', '') # 1201
+    logging.info('%s%s', '') # 1206
+    logging.info('%s%y', '', '') # 1200
+    logging.info('%s%s', '', '', '') # 1205
+
+    # These should be okay:
+    logging.info(1)
+    logging.info(True)
+    logging.info('')
+    logging.info('%s%')
+    logging.info('%s', '')
+    logging.info('%s%%', '')
+    logging.info('%s%s', '', '')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_loopvar_in_dict_comp_py27.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_loopvar_in_dict_comp_py27.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_loopvar_in_dict_comp_py27.py	(revision 1126)
@@ -0,0 +1,8 @@
+"""Tests for loopvar-in-closure."""
+
+__revision__ = 0
+
+
+def bad_case():
+    """Loop variable from dict comprehension."""
+    return {x: lambda: x for x in range(10)}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_e1101_9588_base_attr_aug_assign.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_e1101_9588_base_attr_aug_assign.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_e1101_9588_base_attr_aug_assign.py	(revision 1126)
@@ -0,0 +1,39 @@
+# pylint: disable=R0903
+"""
+False positive case of E1101:
+
+The error is triggered when the attribute set in the base class is
+modified with augmented assignment in a derived class.
+
+http://www.logilab.org/ticket/9588
+"""
+__revision__ = 0
+
+class BaseClass(object):
+    "The base class"
+    def __init__(self):
+        "Set an attribute."
+        self.e1101 = 1
+
+class FalsePositiveClass(BaseClass):
+    "The first derived class which triggers the false positive"
+    def __init__(self):
+        "Augmented assignment triggers E1101."
+        BaseClass.__init__(self)
+        self.e1101 += 1
+
+    def countup(self):
+        "Consequently this also triggers E1101."
+        self.e1101 += 1
+
+class NegativeClass(BaseClass):
+    "The second derived class, which does not trigger the error E1101"
+    def __init__(self):
+        "Ordinary assignment is OK."
+        BaseClass.__init__(self)
+        self.e1101 = self.e1101 + 1
+
+    def countup(self):
+        "No problem."
+        self.e1101 += 1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/w0401_cycle.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/w0401_cycle.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/w0401_cycle.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""w0401 dependency
+"""
+# pylint: disable=print-statement, no-absolute-import
+from __future__ import print_function
+
+from . import func_w0401
+
+if func_w0401:
+    print(input)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/similar1
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/similar1	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/similar1	(revision 1126)
@@ -0,0 +1,22 @@
+import one
+from two import two
+three
+four
+five
+six # comments optionally ignored
+seven
+eight
+nine
+''' ten
+eleven
+twelve '''
+thirteen
+fourteen
+fifteen
+
+
+
+
+sixteen
+seventeen
+eighteen
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0406.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0406.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0406.py	(revision 1126)
@@ -0,0 +1,10 @@
+"""test module importing itself"""
+# pylint: disable=no-absolute-import,using-constant-test
+from __future__ import print_function
+from . import func_w0406
+
+__revision__ = 0
+
+
+if __revision__:
+    print(func_w0406)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_nonregr.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_nonregr.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_nonregr.py	(revision 1126)
@@ -0,0 +1,13 @@
+# pylint: disable=W0106
+"""snippets of codes which have at some point made pylint crash"""
+
+__revision__ = 1
+
+def function1(cbarg=lambda: None):
+    """
+  File "/usr/lib/python2.4/site-packages/logilab/astroid/scoped_nodes.py", line
+391, in mularg_class # this method doesn't exist anymore
+    i = self.args.args.index(argname)
+ValueError: list.index(x): x not in list
+    """
+    cbarg().x
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/similar2
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/similar2	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/similar2	(revision 1126)
@@ -0,0 +1,22 @@
+import one
+from two import two
+three
+four
+five
+six
+seven
+eight
+nine
+''' ten
+ELEVEN
+twelve '''
+thirteen
+fourteen
+FIFTEEN
+
+
+
+
+sixteen
+seventeen
+eighteen
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_raise_return_self.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_raise_return_self.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_raise_return_self.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""see ticket #5672"""
+# pylint: disable=R0903,W0232,C0111,C0103,using-constant-test
+
+__revision__ = 0
+
+class MultiException(Exception):
+    def __init__(self):
+        Exception.__init__(self)
+    def return_self(self):
+        return self
+
+# raise Exception
+if 1:
+    raise MultiException().return_self()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_class_attributes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_class_attributes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_class_attributes.py	(revision 1126)
@@ -0,0 +1,17 @@
+"""Test that valid class attribute doesn't trigger errors"""
+__revision__ = 'sponge bob'
+
+class Clazz(object):
+    "dummy class"
+
+    def __init__(self):
+        self.topic = 5
+        self._data = 45
+
+    def change_type(self, new_class):
+        """Change type"""
+        self.__class__ = new_class
+
+    def do_nothing(self):
+        "I do nothing useful"
+        return self.topic + 56
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0705.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0705.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0705.py	(revision 1126)
@@ -0,0 +1,46 @@
+"""test misordered except
+"""
+
+__revision__ = 1
+
+try:
+    __revision__ += 1
+except Exception:
+    __revision__ = 0
+except TypeError:
+    __revision__ = 0
+
+try:
+    __revision__ += 1
+except LookupError:
+    __revision__ = 0
+except IndexError:
+    __revision__ = 0
+
+try:
+    __revision__ += 1
+except (LookupError, NameError):
+    __revision__ = 0
+except (IndexError, UnboundLocalError):
+    __revision__ = 0
+
+try:
+    __revision__ += 1
+except:
+    pass
+except Exception:
+    pass
+
+try:
+    __revision__ += 1
+except TypeError:
+    __revision__ = 0
+except:
+    __revision__ = 0
+
+try:
+    __revision__ += 1
+except Exception:
+    pass
+except:
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/syntax_error.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/syntax_error.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/syntax_error.py	(revision 1126)
@@ -0,0 +1,2 @@
+if False:
+print('hop')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_use_for_or_listcomp_var.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_use_for_or_listcomp_var.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_use_for_or_listcomp_var.py	(revision 1126)
@@ -0,0 +1,27 @@
+"""test a warning is triggered when using for a lists comprehension variable"""
+from __future__ import print_function
+__revision__ = 'yo'
+
+TEST_LC = [C for C in __revision__ if C.isalpha()]
+print(C) # WARN
+C = 4
+print(C) # this one shouldn't trigger any warning
+
+B = [B for B in  __revision__ if B.isalpha()]
+print(B) # nor this one
+
+for var1, var2 in TEST_LC:
+    var1 = var2 + 4
+print(var1) # WARN
+
+for note in __revision__:
+    note.something()
+for line in __revision__:
+    for note in line:
+        A = note.anotherthing()
+
+
+for x in []:
+    pass
+for x in range(3):
+    print((lambda: x)()) # OK
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_break_or_return_in_try_finally.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_break_or_return_in_try_finally.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_break_or_return_in_try_finally.py	(revision 1126)
@@ -0,0 +1,44 @@
+'Exeptions may be silently swallowed'
+from __future__ import print_function
+__revision__ = None
+# pylint: disable=using-constant-test
+def insidious_break_and_return():
+    """I found you !"""
+    for i in range(0, -5, -1):
+        my_var = 0
+        print(i)
+        try:
+            my_var += 1.0/i
+            if i < -3:
+                break # :D
+            else:
+                return my_var # :D
+        finally:
+            if i > -2:
+                break # :(
+            else:
+                return my_var # :(
+    return None
+
+def break_and_return():
+    """I found you !"""
+    for i in range(0, -5, -1):
+        my_var = 0
+        if i:
+            break # :D
+        try:
+            my_var += 1.0/i
+        finally:
+            for i in range(2):
+                if True:
+                    break # :D
+            else:
+                def strange():
+                    """why not ?"""
+                    if True:
+                        return my_var # :D
+                strange()
+        if i:
+            break # :D
+        else:
+            return # :D
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_yield_return_mix.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_yield_return_mix.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_yield_return_mix.py	(revision 1126)
@@ -0,0 +1,7 @@
+""" module doc """
+__revision__ = None
+
+def somegen():
+    """this kind of mix is OK"""
+    yield 1
+    return
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0601.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0601.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0601.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""test local variable used before assignment
+"""
+from __future__ import print_function
+__revision__ = 0
+
+def function():
+    """dummy"""
+    print(aaaa)
+    aaaa = 1
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/noext
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/noext	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/noext	(revision 1126)
@@ -0,0 +1,4 @@
+#!/usr/bin/env python
+"""a python file without .py extension"""
+
+__revision__ = None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_encoding.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_encoding.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_encoding.py	(revision 1126)
@@ -0,0 +1,6 @@
+# -*- coding: ISO-8859-1 -*-
+""" check correct encoding declaration
+"""
+
+__revision__ = '����'
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0013.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0013.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0013.py	(revision 1126)
@@ -0,0 +1,8 @@
+# pylint: skip-file
+"""disable-all is usable as an inline option"""
+
+# no warning should be issued
+try:
+    import this
+except:
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_excess_escapes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_excess_escapes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_excess_escapes.py	(revision 1126)
@@ -0,0 +1,30 @@
+# pylint:disable=W0105, W0511, misplaced-comparison-constant
+"""Stray backslash escapes may be missing a raw-string prefix."""
+
+__revision__ = '$Id$'
+
+# Bad escape sequences, which probably don't do what you expect.
+A = "\[\]\\"
+assert '\/' == '\\/'
+ESCAPE_BACKSLASH = '\`'
+
+# Valid escape sequences.
+NEWLINE = "\n"
+OLD_ESCAPES = '\a\b\f\n\t\r\v'
+HEX = '\xad\x0a\x0d'
+FALSE_OCTAL = '\o123\o000'  # Not octal in Python
+OCTAL = '\123\000'
+NOT_OCTAL = '\888\999'
+NUL = '\0'
+UNICODE = u'\u1234'
+HIGH_UNICODE = u'\U0000abcd'
+QUOTES = '\'\"'
+LITERAL_NEWLINE = '\
+'
+ESCAPE_UNICODE = "\\\\n"
+
+# Bad docstring
+"""Even in a docstring
+
+You shouldn't have ambiguous text like: C:\Program Files\alpha
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_external_classmethod_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_external_classmethod_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_external_classmethod_crash.py	(revision 1126)
@@ -0,0 +1,21 @@
+# pylint: disable=W0232,R0903,W0613
+"""tagging a function as a class method cause a crash when checking for
+signature overriding
+"""
+
+def fetch_config(mainattr=None):
+    """return a class method"""
+
+    def fetch_order(cls, attr, var):
+        """a class method"""
+        if attr == mainattr:
+            return var
+        return None
+    fetch_order = classmethod(fetch_order)
+    return fetch_order
+
+class Aaa(object):
+    """hop"""
+    fetch_order = fetch_config('A')
+
+__revision__ = None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_init_vars.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_init_vars.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_init_vars.py	(revision 1126)
@@ -0,0 +1,45 @@
+"""Checks that class variables are seen as inherited !
+"""
+# pylint: disable=too-few-public-methods
+from __future__ import print_function
+
+
+class MyClass(object):
+    """Inherits from nothing
+    """
+
+    def __init__(self):
+        self.var = {}
+
+    def met(self):
+        """Checks that base_var is seen as defined outside '__init__'
+        """
+        self.var[1] = 'one'
+        self.base_var = 'one'
+        print(self.base_var, self.var)
+
+    def met2(self):
+        """dummy method"""
+        print(self)
+class MySubClass(MyClass):
+    """Inherits from MyClass
+    """
+    class_attr = 1
+
+    def __init__(self):
+        MyClass.__init__(self)
+        self.var2 = 2
+        print(self.__doc__)
+        print(self.__dict__)
+        print(self.__class__)
+
+    def met2(self):
+        """Checks that var is seen as defined outside '__init__'
+        """
+        self.var[1] = 'one'
+        self.var2 += 1
+        print(self.class_attr)
+
+if __name__ == '__main__':
+    OBJ = MyClass()
+    OBJ.met()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_return_yield_mix_py_33.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_return_yield_mix_py_33.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_return_yield_mix_py_33.py	(revision 1126)
@@ -0,0 +1,16 @@
+"""pylint should detect yield and return mix inside genrators"""
+# pylint: disable=using-constant-test
+def somegen():
+    """this is a bad generator"""
+    if True:
+        return 1
+    else:
+        yield 2
+
+def moregen():
+    """this is another bad generator"""
+    if True:
+        yield 1
+    else:
+        return 2
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_typecheck_callfunc_assigment.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_typecheck_callfunc_assigment.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_typecheck_callfunc_assigment.py	(revision 1126)
@@ -0,0 +1,63 @@
+
+"""check assignment to function call where the function doesn't return
+
+    'E1111': ('Assigning to function call which doesn\'t return',
+              'Used when an assignment is done on a function call but the \
+              infered function doesn\'t return anything.'),
+    'W1111': ('Assigning to function call which only returns None',
+              'Used when an assignment is done on a function call but the \
+              infered function returns nothing but None.'),
+
+"""
+from __future__ import generators, print_function
+
+#pylint: disable=redefined-variable-type
+
+def func_no_return():
+    """function without return"""
+    print('dougloup')
+
+A = func_no_return()
+
+
+def func_return_none():
+    """function returning none"""
+    print('dougloup')
+    return None
+
+A = func_return_none()
+
+
+def func_implicit_return_none():
+    """Function returning None from bare return statement."""
+    return
+
+A = func_implicit_return_none()
+
+
+def func_return_none_and_smth():
+    """function returning none and something else"""
+    print('dougloup')
+    if 2 or 3:
+        return None
+    return 3
+
+A = func_return_none_and_smth()
+
+def generator():
+    """no problemo"""
+    yield 2
+
+A = generator()
+
+class Abstract(object):
+    """bla bla"""
+
+    def abstract_method(self):
+        """use to return something in concrete implementation"""
+        raise NotImplementedError
+
+    def use_abstract(self):
+        """should not issue E1111"""
+        var = self.abstract_method()
+        print(var)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_exception.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_exception.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_exception.py	(revision 1126)
@@ -0,0 +1,7 @@
+""" module doc """
+__revision__ = ''
+
+class MyException(Exception):
+    """a custom exception with its *own* __init__ !!"""
+    def __init__(self, msg):
+        Exception.__init__(self, msg)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_unused_import_py30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_unused_import_py30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_unused_import_py30.py	(revision 1126)
@@ -0,0 +1,21 @@
+"""check unused import for metaclasses
+"""
+# pylint: disable=too-few-public-methods,wrong-import-position,ungrouped-imports
+__revision__ = 1
+import abc
+import sys
+from abc import ABCMeta
+from abc import ABCMeta as SomethingElse
+
+class Meta(metaclass=abc.ABCMeta):
+    """ Test """
+    def __init__(self):
+        self.data = sys.executable
+        self.test = abc
+
+class Meta2(metaclass=ABCMeta):
+    """ Test """
+
+class Meta3(metaclass=SomethingElse):
+    """ test """
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_nameerror_on_string_substitution.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_nameerror_on_string_substitution.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_nameerror_on_string_substitution.py	(revision 1126)
@@ -0,0 +1,8 @@
+"""pylint doesn't see the NameError in this module"""
+
+__revision__ = None
+
+MSG = "hello %s" % MSG
+
+MSG2 = ("hello %s" %
+        MSG2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e13xx.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e13xx.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e13xx.py	(revision 1126)
@@ -0,0 +1,21 @@
+"""test string format error
+"""
+# pylint: disable=print-statement,unsupported-binary-operation
+from __future__ import print_function
+
+PARG_1 = PARG_2 = PARG_3 = 1
+
+def pprint():
+    """Test string format
+    """
+    print("%s %s" % {'PARG_1': 1, 'PARG_2': 2}) # E1306
+    print("%s" % (PARG_1, PARG_2)) # E1305
+    print("%(PARG_1)d %d" % {'PARG_1': 1, 'PARG_2': 2}) # E1302
+    print("%(PARG_1)d %(PARG_2)d" % {'PARG_1': 1}) # E1304
+    print("%(PARG_1)d %(PARG_2)d" % {'PARG_1': 1, 'PARG_2':2, 'PARG_3':3}) #W1301
+    print("%(PARG_1)d %(PARG_2)d" % {'PARG_1': 1, 2:3}) # W1300 E1304
+    print("%(PARG_1)d %(PARG_2)d" % (2, 3)) # 1303
+    print("%(PARG_1)d %(PARG_2)d" % [2, 3]) # 1303
+    print("%2z" % PARG_1)
+    print("strange format %2" % PARG_2)
+    print("works in 3 %a" % 1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_disable_linebased.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_disable_linebased.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_disable_linebased.py	(revision 1126)
@@ -0,0 +1,14 @@
+# This is a very very very very very very very very very very very very very very very very very very very very very long line.
+# pylint: disable=line-too-long
+"""Make sure enable/disable pragmas work for messages that are applied to lines and not syntax nodes.
+
+A disable pragma for a message that applies to nodes is applied to the whole
+block if it comes before the first statement (excluding the docstring). For
+line-based messages, this behavior needs to be altered to really only apply to
+the enclosed lines.
+"""
+# pylint: enable=line-too-long
+
+from __future__ import print_function
+
+print('This is a very long line which the linter will warn about, now that line-too-long has been enabled again.')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""test cyclic import
+"""
+# pylint: disable=no-absolute-import
+from __future__ import print_function
+
+from . import w0401_cycle
+
+if w0401_cycle:
+    print(w0401_cycle)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0233.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0233.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0233.py	(revision 1126)
@@ -0,0 +1,50 @@
+# pylint: disable=R0903,W0212,W0403,W0406,no-absolute-import
+"""test for call to __init__ from a non ancestor class
+"""
+from __future__ import print_function
+from . import func_w0233
+import nonexistant
+__revision__ = '$Id: func_w0233.py,v 1.2 2004-09-29 08:35:13 syt Exp $'
+
+class AAAA(object):
+    """ancestor 1"""
+
+    def __init__(self):
+        print('init', self)
+        BBBBMixin.__init__(self)
+
+class BBBBMixin(object):
+    """ancestor 2"""
+
+    def __init__(self):
+        print('init', self)
+
+class CCC(BBBBMixin, func_w0233.AAAA, func_w0233.BBBB, nonexistant.AClass):
+    """mix different things, some inferable some not"""
+    def __init__(self):
+        BBBBMixin.__init__(self)
+        func_w0233.AAAA.__init__(self)
+        func_w0233.BBBB.__init__(self)
+        nonexistant.AClass.__init__(self)
+
+class DDDD(AAAA):
+    """call superclass constructor in disjunct branches"""
+    def __init__(self, value):
+        if value:
+            AAAA.__init__(self)
+        else:
+            AAAA.__init__(self)
+
+class Super(dict):
+    """ test late binding super() call """
+    def __init__(self):
+        base = super()
+        base.__init__()
+
+class Super2(dict):
+    """ Using the same idiom as Super, but without calling
+    the __init__ method.
+    """
+    def __init__(self):
+        base = super()
+        base.__woohoo__()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0405.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0405.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0405.py	(revision 1126)
@@ -0,0 +1,31 @@
+"""check reimport
+"""
+from __future__ import absolute_import, print_function
+
+# pylint: disable=using-constant-test,ungrouped-imports,wrong-import-position
+import os
+from os.path import join, exists
+import os
+import re as _re
+
+__revision__ = 0
+_re.match('yo', '.*')
+
+if __revision__:
+    print(os)
+    from os.path import exists
+    print(join, exists)
+
+def func(yooo):
+    """reimport in different scope"""
+    import os as ass
+    ass.remove(yooo)
+    import re
+    re.compile('.*')
+
+if 1: # pylint: disable=using-constant-test
+    import sys
+    print(sys.modules)
+else:
+    print('bla')
+    import sys
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0801.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0801.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0801.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""test code similarities
+by defaut docstring are not considered
+"""
+__revision__ = 'id'
+A = 2
+B = 3
+C = A + B
+# need more than X lines to trigger the message
+C *= 2
+A -= B
+# all this should be detected
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_too_many_returns_yields.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_too_many_returns_yields.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_too_many_returns_yields.py	(revision 1126)
@@ -0,0 +1,42 @@
+"""test"""
+
+__revision__ = None
+
+def too_many_returns(arg):
+    """is this real ?"""
+    if arg == 1:
+        return 1
+    elif arg == 2:
+        return 2
+    elif arg == 3:
+        return 3
+    elif arg == 4:
+        return 4
+    elif arg == 5:
+        return 5
+    elif arg == 6:
+        return 6
+    elif arg == 7:
+        return 7
+    elif arg == 8:
+        return 8
+    elif arg == 9:
+        return 9
+    elif arg == 10:
+        return 10
+    return None
+
+def many_yield(text):
+    """not a problem"""
+    if text:
+        yield "    line 1: %s\n" % text
+        yield "    line 2\n"
+        yield "    line 3\n"
+        yield "    line 4\n"
+        yield "    line 5\n"
+    else:
+        yield "    line 6\n"
+        yield "    line 7\n"
+        yield "    line 8\n"
+        yield "    line 9\n"
+        yield "    line 10\n"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0613.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0613.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0613.py	(revision 1126)
@@ -0,0 +1,42 @@
+# pylint: disable=R0903, print-statement
+"""test unused argument
+"""
+from __future__ import print_function
+
+
+def function(arg=1):
+    """ignore arg"""
+
+
+class AAAA(object):
+    """dummy class"""
+
+    def method(self, arg):
+        """dummy method"""
+        print(self)
+    def __init__(self, *unused_args, **unused_kwargs):
+        pass
+
+    @classmethod
+    def selected(cls, *args, **kwargs):
+        """called by the registry when the vobject has been selected.
+        """
+        return cls
+
+    def using_inner_function(self, etype, size=1):
+        """return a fake result set for a particular entity type"""
+        rset = AAAA([('A',)]*size, '%s X' % etype,
+                    description=[(etype,)]*size)
+        def inner(row, col=0, etype=etype, req=self, rset=rset):
+            """inner using all its argument"""
+            # pylint: disable = E1103
+            return req.vreg.etype_class(etype)(req, rset, row, col)
+        # pylint: disable = W0201
+        rset.get_entity = inner
+
+class BBBB(object):
+    """dummy class"""
+
+    def __init__(self, arg):
+        """Constructor with an extra parameter. Should raise a warning"""
+        self.spam = 1
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_decorator_scope.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_decorator_scope.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_decorator_scope.py	(revision 1126)
@@ -0,0 +1,19 @@
+# -*- pylint: disable=W0232,R0903
+"""Test that decorators sees the class namespace - just like
+function default values does but function body doesn't.
+
+https://www.logilab.net/elo/ticket/3711 - bug finding decorator arguments
+https://www.logilab.net/elo/ticket/5626 - name resolution bug inside classes
+"""
+
+from __future__ import print_function
+
+class Test(object):
+    """test class"""
+    ident = lambda x: x
+
+    @ident(ident)
+    def method(self, val=ident(7), func=ident):
+        """hop"""
+        print(self)
+        return func(val)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_except_pass.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_except_pass.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_except_pass.py	(revision 1126)
@@ -0,0 +1,12 @@
+"""
+#3205: W0704 (except doesn't do anything) false positive if some statements
+follow a "pass"
+"""
+from __future__ import print_function
+__revision__ = None
+
+try:
+    A = 2
+except ValueError:
+    pass # pylint: disable=W0107
+    print(A)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0012.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0012.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0012.py	(revision 1126)
@@ -0,0 +1,5 @@
+# pylint:enable=W04044
+"""check unknown option
+"""
+__revision__ = 1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0204.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0204.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0204.py	(revision 1126)
@@ -0,0 +1,19 @@
+"""check for method without self as first argument
+"""
+from __future__ import print_function
+__revision__ = 0
+
+
+class Abcd(object):
+    """dummy class"""
+
+    def __init__(truc):
+        """method without self"""
+        print(1)
+
+    def abdc(yoo):
+        """another test"""
+        print(yoo)
+    def edf(self):
+        """just another method"""
+        print('yapudju in', self)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0012.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0012.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0012.py	(revision 1126)
@@ -0,0 +1,5 @@
+# pylint:enable=W0404
+"""check warning on local enabling
+"""
+__revision__ = 1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_no_dummy_redefined.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_no_dummy_redefined.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_no_dummy_redefined.py	(revision 1126)
@@ -0,0 +1,14 @@
+"""Make sure warnings about redefinitions do not trigger for dummy variables."""
+from __future__ import print_function
+
+
+_, INTERESTING = 'a=b'.split('=')
+
+value = 10
+
+
+def clobbering():
+    """Clobbers a dummy name from the outer scope."""
+    value = 9
+    for _ in range(7):
+        print(value)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0022.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0022.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0022.py	(revision 1126)
@@ -0,0 +1,22 @@
+"""Deprecated suppression style."""
+
+__revision__ = None
+
+a = 1  # pylint: disable=invalid-name
+b = 1  # pylint: disable-msg=invalid-name
+
+# pylint: disable=invalid-name
+c = 1
+# pylint: enable=invalid-name
+
+# pylint: disable-msg=invalid-name
+d = 1
+# pylint: enable-msg=invalid-name
+
+# pylint: disable-msg=C0103
+e = 1
+# pylint: enable-msg=C0103
+
+# pylint: disable=C0103
+f = 1
+# pylint: enable=C0103
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_static_method.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_static_method.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_static_method.py	(revision 1126)
@@ -0,0 +1,28 @@
+"""Checks if static / class methods works fine in Pylint
+"""
+from __future__ import print_function
+__revision__ = ''
+
+#pylint: disable=no-classmethod-decorator, no-staticmethod-decorator
+class MyClass(object):
+    """doc
+    """
+    def __init__(self):
+        pass
+
+    def static_met(var1, var2):
+        """This is a static method
+        """
+        print(var1, var2)
+
+    def class_met(cls, var1):
+        """This is a class method
+        """
+        print(cls, var1)
+
+    static_met = staticmethod(static_met)
+    class_met = classmethod(class_met)
+
+if __name__ == '__main__':
+    MyClass.static_met("var1", "var2")
+    MyClass.class_met("var1")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_inner_classes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_inner_classes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_inner_classes.py	(revision 1126)
@@ -0,0 +1,33 @@
+# pylint: disable=R0903
+"""Backend Base Classes for the schwelm user DB"""
+
+__revision__ = "alpha"
+
+class Aaa(object):
+    """docstring"""
+    def __init__(self):
+        self.__setattr__('a', 'b')
+
+
+    def one_public(self):
+        """docstring"""
+        pass
+
+    def another_public(self):
+        """docstring"""
+        pass
+
+class Bbb(Aaa):
+    """docstring"""
+    pass
+
+class Ccc(Aaa):
+    """docstring"""
+
+    class Ddd(Aaa):
+        """docstring"""
+        pass
+
+    class Eee(Ddd):
+        """docstring"""
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0604.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0604.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0604.py	(revision 1126)
@@ -0,0 +1,13 @@
+"""Test for invalid objects in a module's __all__ variable.
+
+"""
+#  pylint: disable=R0903,R0201,W0612
+
+__revision__ = 0
+
+def some_function():
+    """Just a function."""
+    pass
+
+
+__all__ = [some_function]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/all_the_things.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/all_the_things.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/all_the_things.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""All the things!"""
+# pylint: disable=no-absolute-import
+from .thing1 import THING1
+from .thing2 import THING2
+from .thing2 import THING1_PLUS_THING2
+__revision__ = None
+
+_ = (THING1, THING2, THING1_PLUS_THING2)
+del _
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/thing1.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/thing1.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/thing1.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""The first thing."""
+__revision__ = None
+THING1 = "I am thing1"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/thing2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/thing2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/thing2.py	(revision 1126)
@@ -0,0 +1,7 @@
+"""The second thing."""
+# pylint: disable=no-absolute-import
+from .all_the_things import THING1
+__revision__ = None
+
+THING2 = "I am thing2"
+THING1_PLUS_THING2 = "%s, plus %s" % (THING1, THING2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0401_package/__init__.py	(revision 1126)
@@ -0,0 +1,2 @@
+"""Our big package."""
+__revision__ = None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_logging_not_lazy_with_logger.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_logging_not_lazy_with_logger.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_logging_not_lazy_with_logger.py	(revision 1126)
@@ -0,0 +1,13 @@
+"""Logging warnings using a logger class."""
+from __future__ import absolute_import
+import logging
+
+__revision__ = ''
+
+LOG = logging.getLogger("domain")
+LOG.debug("%s" % "junk")
+LOG.log(logging.DEBUG, "%s" % "junk")
+LOG2 = LOG.debug
+LOG2("%s" % "junk")
+
+logging.getLogger("domain").debug("%s" % "junk")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/w0801_same.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/w0801_same.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/w0801_same.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""test code similarities
+by defaut docstring are not considered
+"""
+__revision__ = 'id'
+A = 2
+B = 3
+C = A + B
+# need more than X lines to trigger the message
+C *= 2
+A -= B
+# all this should be detected
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_kwoa_py30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_kwoa_py30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_kwoa_py30.py	(revision 1126)
@@ -0,0 +1,12 @@
+# pylint: disable=C0102
+'''A little testscript for PEP 3102 and pylint'''
+def function(*, foo):
+    '''A function for testing'''
+    print(foo)
+
+function(foo=1)
+
+foo = 1
+function(foo)
+
+function(1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_variables_unused_name_from_wilcard_import.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_variables_unused_name_from_wilcard_import.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_variables_unused_name_from_wilcard_import.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""check unused import from a wildcard import"""
+# pylint: disable=no-absolute-import
+from input.func_w0611 import *
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0404.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0404.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0404.py	(revision 1126)
@@ -0,0 +1,27 @@
+"""Unittests for W0404 (reimport)"""
+from __future__ import absolute_import, print_function
+
+import sys
+
+import xml.etree.ElementTree
+from xml.etree import ElementTree
+
+from email import encoders
+import email.encoders
+
+import sys  #pylint: disable=ungrouped-imports
+__revision__ = 0
+
+def no_reimport():
+    """docstring"""
+    import os
+    print(os)
+
+
+def reimport():
+    """This function contains a reimport."""
+    import sys
+    del sys
+
+
+del sys, ElementTree, xml.etree.ElementTree, encoders, email.encoders
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_new_style_class_py_30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_new_style_class_py_30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_new_style_class_py_30.py	(revision 1126)
@@ -0,0 +1,45 @@
+"""check builtin data descriptors such as mode and name attributes
+on a file are correctly handled
+
+bug notified by Pierre Rouleau on 2005-04-24
+"""
+from __future__ import print_function
+__revision__ = None
+
+class File(file):  # pylint: disable=file-builtin
+    """ Testing new-style class inheritance from file"""
+
+    #
+    def __init__(self, name, mode="r", buffering=-1, verbose=False):
+        """Constructor"""
+
+        self.was_modified = False
+        self.verbose = verbose
+        super(File, self).__init__(name, mode, buffering)
+        if self.verbose:
+            print("File %s is opened.  The mode is: %s" % (self.name,
+                                                           self.mode))
+
+    #
+    def write(self, a_string):
+        """ Write a string to the file."""
+
+        super(File, self).write(a_string)
+        self.was_modified = True
+
+    #
+    def writelines(self, sequence):
+        """ Write a sequence of strings to the file. """
+
+        super(File, self).writelines(sequence)
+        self.was_modified = True
+
+    #
+    def close(self):
+        """Close the file."""
+
+        if self.verbose:
+            print("Closing file %s" % self.name)
+
+        super(File, self).close()
+        self.was_modified = False
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_3k_removed_stuff_py_30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_3k_removed_stuff_py_30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_3k_removed_stuff_py_30.py	(revision 1126)
@@ -0,0 +1,13 @@
+"""test relative import"""
+# pylint: disable=no-absolute-import
+from __future__ import print_function
+import func_w0401
+__revision__ = filter(None, map(str, (1, 2, 3)))
+
+
+def function():
+    """something"""
+    print(func_w0401)
+    unic = u"unicode"
+    low = unic.looower
+    return low
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0612.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0612.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0612.py	(revision 1126)
@@ -0,0 +1,37 @@
+"""test unused variable
+"""
+# pylint: disable=invalid-name, redefined-outer-name, no-absolute-import
+from __future__ import print_function
+PATH = OS = collections = deque = None
+
+def function(matches):
+    """"yo"""
+    aaaa = 1
+    index = -1
+    for match in matches:
+        index += 1
+        print(match)
+
+def visit_if(self, node):
+    """increments the branches counter"""
+    branches = 1
+    # don't double count If nodes coming from some 'elif'
+    if node.orelse and len(node.orelse) > 1:
+        branches += 1
+    self.inc_branch(branches)
+    self.stmts += branches
+
+def test_global():
+    """ Test various assignments of global
+    variables through imports.
+    """
+    global PATH, OS, collections, deque
+    from os import path as PATH
+    import os as OS
+    import collections
+    from collections import deque
+    # make sure that these triggers unused-variable
+    from sys import platform
+    from sys import version as VERSION
+    import this
+    import re as RE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0703.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0703.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0703.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""check empty except statement
+"""
+from __future__ import print_function
+__revision__ = 0
+
+try:
+    __revision__ += 1
+except Exception:
+    print('error')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_dotted_ancestor.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_dotted_ancestor.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_dotted_ancestor.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""bla"""
+# pylint: disable=no-absolute-import
+
+from input import func_w0233
+
+__revision__ = 'yo'
+
+class Aaaa(func_w0233.AAAA):
+    """test dotted name in ancestors"""
+    def __init__(self):
+        func_w0233.AAAA.__init__(self)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_long_utf8_line.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_long_utf8_line.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_long_utf8_line.py	(revision 1126)
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+"""this utf-8 doc string have some     non ASCII caracters like 'é', or '¢»ß'"""
+### check also comments with some     more non ASCII caracters like 'é' or '¢»ß'
+
+__revision__ = 1100
+
+ASCII = "----------------------------------------------------------------------"
+UTF_8 = "--------------------------------------------------------------------éé"
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_block_disable_msg.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_block_disable_msg.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_block_disable_msg.py	(revision 1126)
@@ -0,0 +1,1026 @@
+# pylint: disable=C0302,bare-except,print-statement
+"""pylint option block-disable"""
+from __future__ import print_function
+
+class Foo(object):
+    """block-disable test"""
+
+    def __init__(self):
+        self._test = "42"
+
+    def meth1(self, arg):
+        """this issues a message"""
+        print(self)
+
+    def meth2(self, arg):
+        """and this one not"""
+        # pylint: disable=W0613
+        print(self._test\
+              + "foo")
+
+    def meth3(self):
+        """test one line disabling"""
+        # no error
+        print(self.bla) # pylint: disable=E1101
+        # error
+        print(self.blop)
+
+    def meth4(self):
+        """test re-enabling"""
+        # pylint: disable=E1101
+        # no error
+        print(self.bla)
+        print(self.blop)
+        # pylint: enable=E1101
+        # error
+        print(self.blip)
+
+    def meth5(self):
+        """test IF sub-block re-enabling"""
+        # pylint: disable=E1101
+        # no error
+        print(self.bla)
+        if self.blop:
+            # pylint: enable=E1101
+            # error
+            print(self.blip)
+        else:
+            # no error
+            print(self.blip)
+        # no error
+        print(self.blip)
+
+    def meth6(self):
+        """test TRY/EXCEPT sub-block re-enabling"""
+        # pylint: disable=E1101
+        # no error
+        print(self.bla)
+        try:
+            # pylint: enable=E1101
+            # error
+            print(self.blip)
+        except UndefinedName: # pylint: disable=E0602
+            # no error
+            print(self.blip)
+        # no error
+        print(self.blip)
+
+    def meth7(self):
+        """test one line block opening disabling"""
+        if self.blop: # pylint: disable=E1101
+            # error
+            print(self.blip)
+        else:
+            # error
+            print(self.blip)
+        # error
+        print(self.blip)
+
+
+    def meth8(self):
+        """test late disabling"""
+        # error
+        print(self.blip)
+        # pylint: disable=E1101
+        # no error
+        print(self.bla)
+        print(self.blop)
+
+    def meth9(self):
+        """test re-enabling right after a block with whitespace"""
+        eris = 5
+
+        if eris: # pylint: disable=using-constant-test
+            print("In block")
+
+        # pylint: disable=E1101
+        # no error
+        print(self.bla)
+        print(self.blu)
+        # pylint: enable=E1101
+        # error
+        print(self.blip)
+
+    def meth10(self):
+        """Test double disable"""
+        # pylint: disable=E1101
+        # no error
+        print(self.bla)
+        # pylint: disable=E1101
+        print(self.blu)
+
+
+class ClassLevelMessage(object):
+    """shouldn't display to much attributes/not enough methods messages
+    """
+    # pylint: disable=R0902,R0903
+
+    def __init__(self):
+        self.attr1 = 1
+        self.attr2 = 1
+        self.attr3 = 1
+        self.attr4 = 1
+        self.attr5 = 1
+        self.attr6 = 1
+        self.attr7 = 1
+        self.attr8 = 1
+        self.attr9 = 1
+        self.attr0 = 1
+
+    def too_complex_but_thats_ok(self, attr1, attr2):
+        """THIS Method has too much branches and returns but i don't care
+        """
+        # pylint: disable=R0912,R0911
+        try:
+            attr3 = attr1+attr2
+        except ValueError:
+            attr3 = None
+        except:
+            return 'duh', self
+        if attr1:
+            for i in attr1:
+                if attr2:
+                    return i
+            else:
+                return 'duh'
+        elif attr2:
+            for i in attr2:
+                if attr2:
+                    return i
+            else:
+                return 'duh'
+        else:
+            for i in range(15):
+                if attr3:
+                    return i
+            else:
+                return 'doh'
+        return None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+print('hop, too many lines but i don\'t care')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_module___dict__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_module___dict__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_module___dict__.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""http://www.logilab.org/ticket/6949."""
+from __future__ import print_function
+__revision__ = None
+
+print(__dict__ is not None)
+
+__dict__ = {}
+
+print(__dict__ is not None)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+"""test"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_classes_protected_member_access.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_classes_protected_member_access.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_classes_protected_member_access.py	(revision 1126)
@@ -0,0 +1,26 @@
+"""
+#3123: W0212 false positive on static method
+"""
+__revision__ = 1
+
+# pylint: disable=no-classmethod-decorator, no-staticmethod-decorator
+class A3123(object):
+    """oypuee"""
+    _protected = 1
+    def __init__(self):
+        pass
+
+
+    def cmeth(cls, val):
+        """set protected member"""
+        cls._protected = +val
+
+    cmeth = classmethod(cmeth)
+
+    def smeth(val):
+        """set protected member"""
+        A3123._protected += val
+
+    smeth = staticmethod(smeth)
+
+    prop = property(lambda self: self._protected)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0122_py_30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0122_py_30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0122_py_30.py	(revision 1126)
@@ -0,0 +1,13 @@
+"""test global statement"""
+
+__revision__ = 0
+
+exec 'a = __revision__'
+exec 'a = 1' in {}
+
+exec 'a = 1' in globals()
+
+def func():
+    """exec in local scope"""
+    exec 'b = 1'
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bad_assigment_to_exception_var.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bad_assigment_to_exception_var.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bad_assigment_to_exception_var.py	(revision 1126)
@@ -0,0 +1,30 @@
+# pylint:disable=C0103, print-statement, no-absolute-import
+"""ho ho ho"""
+from __future__ import print_function
+import sys
+__revision__ = 'toto'
+
+e = 1
+e2 = 'yo'
+e3 = None
+try:
+    raise e
+except Exception as ex:
+    print(ex)
+    _, _, tb = sys.exc_info()
+
+
+
+def func():
+    """bla bla bla"""
+    raise e3
+
+def reraise():
+    """reraise a catched exception instance"""
+    try:
+        raise Exception()
+    except Exception as exc:
+        print(exc)
+        raise exc
+
+raise e3
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_lambda_use_before_assign.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_lambda_use_before_assign.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_lambda_use_before_assign.py	(revision 1126)
@@ -0,0 +1,8 @@
+"""https://www.logilab.net/elo/ticket/18862"""
+from __future__ import print_function
+__revision__ = 1
+def function():
+    """hop"""
+    ggg = lambda: xxx
+    xxx = 1
+    print(ggg())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_overriden_method_varargs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_overriden_method_varargs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_overriden_method_varargs.py	(revision 1126)
@@ -0,0 +1,19 @@
+# pylint: disable=R0201,R0903
+"""docstring"""
+
+__revision__ = 1
+
+class SuperClass(object):
+    """docstring"""
+    def impl(self, arg1, arg2):
+        """docstring"""
+        return arg1 + arg2
+
+class MyClass(SuperClass):
+    """docstring"""
+    def impl(self, *args, **kwargs):
+        """docstring"""
+        # ...do stuff here...
+        super(MyClass, self).impl(*args, **kwargs)
+
+# ...do stuff here...
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0332_py_30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0332_py_30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0332_py_30.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""check use of l as long int marker
+"""
+# pylint: disable=long-suffix
+__revision__ = 1l
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0203.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0203.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_e0203.py	(revision 1126)
@@ -0,0 +1,19 @@
+"""check for method without self as first argument
+"""
+from __future__ import print_function
+__revision__ = 0
+
+
+class Abcd(object):
+    """dummy class"""
+    def __init__(self):
+        pass
+
+    def abcd(yoo):
+        """another test"""
+
+    abcd = classmethod(abcd)
+
+    def edf(self):
+        """justo ne more method"""
+        print('yapudju in', self)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0011.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0011.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0011.py	(revision 1126)
@@ -0,0 +1,5 @@
+# pylint:disable=W0404
+"""check warning on local disabling
+"""
+__revision__ = 1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_crash_127416.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_crash_127416.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_crash_127416.py	(revision 1126)
@@ -0,0 +1,20 @@
+# pylint: disable=C0111,R0201
+"""
+FUNCTIONALITY
+"""
+
+class Example(object):
+    """
+      @summary: Demonstrates pylint error caused by method expecting tuple
+      but called method does not return tuple
+    """
+
+    def method_expects_tuple(self, obj):
+        meth, args = self.method_doesnot_return_tuple(obj)
+        result = meth(args)
+        return result
+
+    def method_doesnot_return_tuple(self, obj):
+        # we want to lock what we have in the inventory, not what is to have
+        # in the future
+        return {'success': obj}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0623_py_30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0623_py_30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0623_py_30.py	(revision 1126)
@@ -0,0 +1,67 @@
+"""Test for W0623, overwriting names in exception handlers."""
+# pylint: disable=broad-except,bare-except,print-statement,no-absolute-import,duplicate-except
+import exceptions
+
+__revision__ = ''
+
+class MyError(Exception):
+    """Special exception class."""
+    pass
+
+
+def some_function():
+    """A function."""
+    exc = None
+
+    try:
+        {}["a"]
+    except KeyError, exceptions.RuntimeError: # W0623
+        pass
+    except KeyError, OSError: # W0623
+        pass
+    except KeyError, MyError: # W0623
+        pass
+    except KeyError, exc: # this is fine
+        print exc
+    except KeyError, exc1: # this is fine
+        print exc1
+    except KeyError, FOO: # C0103
+        print FOO
+
+    try:
+        pass
+    except KeyError, exc1: # this is fine
+        print exc1
+
+class MyOtherError(Exception):
+    """Special exception class."""
+    pass
+
+
+exc3 = None
+
+try:
+    pass
+except KeyError, exceptions.RuntimeError: # W0623
+    pass
+except KeyError, exceptions.RuntimeError.args: # W0623
+    pass
+except KeyError, OSError: # W0623
+    pass
+except KeyError, MyOtherError: # W0623
+    pass
+except KeyError, exc3: # this is fine
+    print exc3
+except KeyError, exc4: # this is fine
+    print exc4
+except KeyError, OOPS: # C0103
+    print OOPS
+
+try:
+    pass
+except KeyError, exc4: # this is fine
+    print exc4
+except IOError, exc5: # this is fine
+    print exc5
+except MyOtherError, exc5: # this is fine
+    print exc5
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0623_py30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0623_py30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0623_py30.py	(revision 1126)
@@ -0,0 +1,16 @@
+"""Test for W0623, overwriting names in exception handlers."""
+
+__revision__ = ''
+
+class MyError(Exception):
+    """Special exception class."""
+    pass
+
+
+def some_function():
+    """A function."""
+
+    try:
+        {}["a"]
+    except KeyError as some_function: # W0623
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_access_attr_before_def_false_positive.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_access_attr_before_def_false_positive.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_access_attr_before_def_false_positive.py	(revision 1126)
@@ -0,0 +1,98 @@
+#pylint: disable=C0103,R0904,R0903,W0201,old-style-class,no-absolute-import
+"""
+This module demonstrates a possible problem of pyLint with calling __init__ s
+from inherited classes.
+Initializations done there are not considered, which results in Error E0203 for
+self.cookedq.
+"""
+
+from __future__ import print_function
+
+import telnetlib
+
+class SeeTelnet(telnetlib.Telnet):
+    """
+    Extension of telnetlib.
+    """
+
+    def __init__(self, host=None, port=0):
+        """
+        Constructor.
+        When called without arguments, create an unconnected instance.
+        With a hostname argument, it connects the instance; a port
+        number is optional.
+        Parameter:
+        - host: IP address of the host
+        - port: Port number
+        """
+        telnetlib.Telnet.__init__(self, host, port)
+
+    def readUntilArray(self, matches, _=None):
+        """
+        Read until a given string is encountered or until timeout.
+        ...
+        """
+        self.process_rawq()
+        maxLength = 0
+        for match in matches:
+            if len(match) > maxLength:
+                maxLength = len(match)
+
+class Base(object):
+    """bla bla"""
+    dougloup_papa = None
+
+    def __init__(self):
+        self._var = False
+
+class Derived(Base):
+    """derived blabla"""
+    dougloup_moi = None
+    def Work(self):
+        """do something"""
+        # E0203 - Access to member '_var' before its definition
+        if self._var:
+            print("True")
+        else:
+            print("False")
+        self._var = True
+
+        # E0203 - Access to member 'dougloup_papa' before its definition
+        if self.dougloup_papa:
+            print('dougloup !')
+        self.dougloup_papa = True
+        # E0203 - Access to member 'dougloup_moi' before its definition
+        if self.dougloup_moi:
+            print('dougloup !')
+        self.dougloup_moi = True
+
+
+class QoSALConnection(object):
+    """blabla"""
+
+    _the_instance = None
+
+    def __new__(cls):
+        if cls._the_instance is None:
+            cls._the_instance = object.__new__(cls)
+        return cls._the_instance
+
+    def __init__(self):
+        pass
+
+class DefinedOutsideInit(object):
+    """use_attr is seen as the method defining attr because its in
+    first position
+    """
+    def __init__(self):
+        self.reset()
+
+    def use_attr(self):
+        """use and set members"""
+        if self.attr:
+            print('hop')
+        self.attr = 10
+
+    def reset(self):
+        """reset members"""
+        self.attr = 4
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_base_init_vars.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_base_init_vars.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_base_init_vars.py	(revision 1126)
@@ -0,0 +1,35 @@
+# pylint:disable=R0201, print-statement, too-few-public-methods
+"""Checks that class variables are seen as inherited !
+"""
+__revision__ = ''
+
+class BaseClass(object):
+    """A simple base class
+    """
+
+    def __init__(self):
+        self.base_var = {}
+
+    def met(self):
+        """yo"""
+    def meeting(self, with_):
+        """ye"""
+        return with_
+class MyClass(BaseClass):
+    """Inherits from BaseClass
+    """
+
+    def __init__(self):
+        BaseClass.__init__(self)
+        self.var = {}
+
+    def met(self):
+        """Checks that base_var is not seen as defined outsite '__init__'
+        """
+        self.var[1] = 'one'
+        self.base_var[1] = 'one'
+        return self.base_var, self.var
+
+if __name__ == '__main__':
+    OBJ = MyClass()
+    OBJ.met()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_yield_assign_py25.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_yield_assign_py25.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_yield_assign_py25.py	(revision 1126)
@@ -0,0 +1,21 @@
+"""http://www.logilab.org/ticket/8771"""
+
+from __future__ import print_function
+
+def generator():
+    """yield as assignment"""
+    yield 45
+    xxxx = yield 123
+    print(xxxx)
+
+def generator_fp1(seq):
+    """W0631 false positive"""
+    for val in seq:
+        pass
+    for val in seq:
+        yield val
+
+def generator_fp2():
+    """E0601 false positive"""
+    xxxx = 12
+    yield xxxx
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_genexp_in_class_scope.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_genexp_in_class_scope.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_genexp_in_class_scope.py	(revision 1126)
@@ -0,0 +1,9 @@
+# pylint: disable=W0232,R0903
+"""class scope must be handled correctly in genexps"""
+
+__revision__ = ''
+
+class MyClass(object):
+    """ds"""
+    var1 = []
+    var2 = list(value*2 for value in var1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_with_without_as_py25.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_with_without_as_py25.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_with_without_as_py25.py	(revision 1126)
@@ -0,0 +1,12 @@
+'''This is a little non regression test on a with statement
+without 'as'.
+'''
+from __future__ import with_statement, print_function
+__revision__ = 32321313
+
+def do_nothing(arg):
+    'ho foo'
+    print(arg)
+    with open('x'):
+        base.baz
+        base = 7
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/ignore_except_pass_by_default.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/ignore_except_pass_by_default.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/ignore_except_pass_by_default.py	(revision 1126)
@@ -0,0 +1,6 @@
+"""#5575: by default no W0704 warning on bare pass in except"""
+
+try:
+    __exception__ = 0
+except ValueError:
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_object_as_class_attribute.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_object_as_class_attribute.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_object_as_class_attribute.py	(revision 1126)
@@ -0,0 +1,19 @@
+# pylint: disable=R0903
+"""Test case for the problem described below :
+ - A class extends 'object'
+ - This class defines its own __init__()
+   * pylint will therefore check that baseclasses' init()
+     are called
+ - If this class defines an 'object' attribute, then pylint
+   will use this new definition when trying to retrieve
+   object.__init__()
+"""
+
+__revision__ = None
+
+class Statement(object):
+    """ ... """
+    def __init__(self):
+        pass
+    object = None
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bad_cont_dictcomp_py27.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bad_cont_dictcomp_py27.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bad_cont_dictcomp_py27.py	(revision 1126)
@@ -0,0 +1,38 @@
+"""Bad continuations in dictionary comprehensions."""
+
+__revision__ = 0
+
+# Dictionary comprehensions should not require extra indentation when breaking
+# before the 'for', which is not part of the value
+C1 = {'key{}'.format(x): 'value{}'.format(x)
+      for x in range(3)}
+
+C2 = {'key{}'.format(x): 'value{}'.format(x) for x in
+      range(3)}
+
+# Dictionary comprehensions with multiple loops broken in different places
+C3 = {x*y: (x, y) for x in range(3) for y in range(3)}
+
+C4 = {x*y: (x, y)
+      for x in range(3) for y in range(3)}
+
+C5 = {x*y: (x, y) for x
+      in range(3) for y in range(3)}
+
+C6 = {x*y: (x, y) for x in range(3)
+      for y in range(3)}
+
+C7 = {key:
+          key ** 2
+      for key in range(10)}
+
+C8 = {
+    key: key ** 2
+    for key in range(10)}
+
+# Misaligned cases for dict comprehensions
+C9 = {'key{}'.format(x): 'value{}'.format(x)
+    for x in range(3)}  # [bad-continuation]
+
+C9 = {'key{}'.format(x): 'value{}'.format(x)
+          for x in range(3)}  # [bad-continuation]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0205.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0205.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0205.py	(revision 1126)
@@ -0,0 +1,24 @@
+"""check different signatures"""
+from __future__ import print_function
+__revision__ = 0
+# pylint: disable=too-few-public-methods
+class Abcd(object):
+    '''dummy'''
+    def __init__(self):
+        self.aarg = False
+    def abcd(self, aaa=1, bbbb=None):
+        """hehehe"""
+        print(self, aaa, bbbb)
+    def args(self):
+        """gaarrrggll"""
+        self.aarg = True
+
+class Cdef(Abcd):
+    """dummy"""
+    def __init__(self, aaa):
+        Abcd.__init__(self)
+        self.aaa = aaa
+
+    def abcd(self, aaa, bbbb=None):
+        """hehehe"""
+        print(self, aaa, bbbb)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_property_affectation_py26.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_property_affectation_py26.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_property_affectation_py26.py	(revision 1126)
@@ -0,0 +1,24 @@
+# pylint: disable=R0903
+"""
+Simple test case for an annoying behavior in pylint.
+"""
+
+__revision__ = 'pouet'
+
+class Test(object):
+    """Smallest test case for reported issue."""
+
+    def __init__(self):
+        self._thing = None
+
+    @property
+    def myattr(self):
+        """Getter for myattr"""
+        return self._thing
+
+    @myattr.setter
+    def myattr(self, value):
+        """Setter for myattr."""
+        self._thing = value
+
+Test().myattr = 'grou'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0611.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0611.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0611.py	(revision 1126)
@@ -0,0 +1,25 @@
+"""check unused import
+"""
+# pylint: disable=no-absolute-import
+
+from __future__ import print_function
+
+import os
+import sys
+
+class NonRegr(object):
+    """???"""
+    def __init__(self):
+        print('initialized')
+
+    def sys(self):
+        """should not get sys from there..."""
+        print(self, sys)
+
+    def dummy(self, truc):
+        """yo"""
+        return self, truc
+
+    def blop(self):
+        """yo"""
+        print(self, 'blip')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_function_as_method.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_function_as_method.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_function_as_method.py	(revision 1126)
@@ -0,0 +1,18 @@
+# pylint: disable=R0903
+'''Test that a function is considered a method when looked up through a class.
+'''
+from __future__ import print_function
+
+class Clazz(object):
+    'test class'
+
+    def __init__(self, value):
+        self.value = value
+
+def func(arg1, arg2):
+    'function that will be used as a method'
+    return arg1.value + arg2
+
+Clazz.method = func
+
+print(Clazz(1).method(2))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0631.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0631.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_w0631.py	(revision 1126)
@@ -0,0 +1,20 @@
+"""Check possible undefined loopvar
+"""
+from __future__ import print_function
+__revision__ = 0
+
+def do_stuff(some_random_list):
+    """This is not right."""
+    for var in some_random_list:
+        pass
+    print(var)
+
+
+def do_else(some_random_list):
+    """This is not right."""
+    for var in some_random_list:
+        if var == 42:
+            break
+    else:
+        var = 84
+    print(var)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_first_arg.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_first_arg.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_first_arg.py	(revision 1126)
@@ -0,0 +1,42 @@
+# pylint: disable=C0111, W0232
+"""check for methods first arguments
+"""
+
+__revision__ = 0
+
+
+class Obj(object):
+    # C0202, classmethod
+    def __new__(something):
+        pass
+
+    # C0202, classmethod
+    def class1(cls):
+        pass
+    class1 = classmethod(class1)
+
+    def class2(other):
+        pass
+    class2 = classmethod(class2)
+
+
+class Meta(type):
+    # C0204, metaclass __new__
+    def __new__(other, name, bases, dct):
+        pass
+
+    # C0203, metaclass method
+    def method1(cls):
+        pass
+
+    def method2(other):
+        pass
+
+    # C0205, metaclass classmethod
+    def class1(mcs):
+        pass
+    class1 = classmethod(class1)
+
+    def class2(other):
+        pass
+    class2 = classmethod(class2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_builtin_module_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_builtin_module_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_builtin_module_test.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""test import from a builtin module"""
+
+from __future__ import absolute_import
+from math import log10
+
+__revision__ = None
+
+
+def log10_2():
+    """bla bla bla"""
+    return log10(2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_classes_meth_could_be_a_function.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_classes_meth_could_be_a_function.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_classes_meth_could_be_a_function.py	(revision 1126)
@@ -0,0 +1,34 @@
+# pylint: disable=C0111,R0903,W0232
+"""
+#2479
+
+R0201 (formely W0212), Method could be a function shouldn't be emitted in case
+like factory method pattern
+"""
+__revision__ = 1
+
+class XAsub(object):
+    pass
+class XBsub(XAsub):
+    pass
+class XCsub(XAsub):
+    pass
+
+class Aimpl(object):
+    # disable "method could be a function" on classes which are not overriding
+    # the factory method because in that case the usage of polymorphism is not
+    # detected
+    # pylint: disable=R0201
+    def makex(self):
+        return XAsub()
+
+class Bimpl(Aimpl):
+
+    def makex(self):
+        return XBsub()
+
+class Cimpl(Aimpl):
+
+    def makex(self):
+        return XCsub()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_no_warning_docstring.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_no_warning_docstring.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror_no_warning_docstring.py	(revision 1126)
@@ -0,0 +1,42 @@
+''' Test for inheritence '''
+from __future__ import print_function
+__revision__ = 1
+# pylint: disable=too-few-public-methods, using-constant-test
+class AAAA(object):
+    ''' class AAAA '''
+
+    def __init__(self):
+        pass
+
+    def method1(self):
+        ''' method 1 '''
+        print(self)
+
+    def method2(self):
+        ''' method 2 '''
+        print(self)
+
+class BBBB(AAAA):
+    ''' class BBBB '''
+
+    def __init__(self):
+        AAAA.__init__(self)
+
+    # should ignore docstring calling from class AAAA
+    def method1(self):
+        AAAA.method1(self)
+
+class CCCC(BBBB):
+    ''' class CCCC '''
+
+    def __init__(self):
+        BBBB.__init__(self)
+
+    # should ignore docstring since CCCC is inherited from BBBB which is
+    # inherited from AAAA containing method2
+    if __revision__:
+        def method2(self):
+            AAAA.method2(self)
+    else:
+        def method2(self):
+            AAAA.method1(self)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_nonregr___file___global.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_nonregr___file___global.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_nonregr___file___global.py	(revision 1126)
@@ -0,0 +1,8 @@
+"""test no crash on __file__ global"""
+
+def func():
+    """override __file__"""
+    global __file__
+    __file__ = 'hop'
+
+__revision__ = 'pouet'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_unused_overridden_argument.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_unused_overridden_argument.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_unused_overridden_argument.py	(revision 1126)
@@ -0,0 +1,31 @@
+# pylint: disable=R0903, print-statement
+"""for Sub.inherited, only the warning for "aay" is desired.
+The warnings for "aab" and "aac"  are most likely false positives though,
+because there could be another subclass that overrides the same method and does
+use the arguments (eg Sub2)
+"""
+
+__revision__ = 'thx to Maarten ter Huurne'
+
+class Base(object):
+    "parent"
+    def inherited(self, aaa, aab, aac):
+        "abstract method"
+        raise NotImplementedError
+
+class Sub(Base):
+    "child 1"
+    def inherited(self, aaa, aab, aac):
+        "overridden method, though don't use every argument"
+        return aaa
+
+    def newmethod(self, aax, aay):
+        "another method, warning for aay desired"
+        return self, aax
+
+class Sub2(Base):
+    "child 1"
+
+    def inherited(self, aaa, aab, aac):
+        "overridden method, use every argument"
+        return aaa + aab + aac
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror___init___return_from_inner_function.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror___init___return_from_inner_function.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_noerror___init___return_from_inner_function.py	(revision 1126)
@@ -0,0 +1,13 @@
+# pylint: disable=R0903
+"""#10075"""
+
+__revision__ = 1
+
+class Aaa(object):
+    """docstring"""
+    def __init__(self):
+        def inner_function(arg):
+            """inner docstring"""
+            return arg + 4
+        self.func = inner_function
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bug113231.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bug113231.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_bug113231.py	(revision 1126)
@@ -0,0 +1,24 @@
+# pylint: disable=E1101
+# pylint: disable=C0103
+# pylint: disable=R0903
+"""test bugfix for #113231 in logging checker
+"""
+from __future__ import absolute_import
+# Muck up the names in an effort to confuse...
+import logging as renamed_logging
+
+__revision__ = ''
+
+class Logger(object):
+    """Fake logger"""
+    pass
+
+logger = renamed_logging.getLogger(__name__)
+fake_logger = Logger()
+
+# Statements that should be flagged:
+renamed_logging.warning('%s, %s' % (4, 5))
+logger.warning('%s' % 5)
+
+# Statements that should not be flagged:
+fake_logger.warn('%s' % 5)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0020.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0020.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0020.py	(revision 1126)
@@ -0,0 +1,8 @@
+"""Test for reporting of suppressed messages."""
+
+__revision__ = 0
+
+def suppressed():
+    """A function with an unused variable."""
+    # pylint: disable=W0612
+    var = 0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0014.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0014.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/input/func_i0014.py	(revision 1126)
@@ -0,0 +1,8 @@
+# pylint: disable-all
+"""disable-all is usable as an inline option"""
+
+# no warning should be issued
+try:
+    import this
+except:
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/data/elif.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/data/elif.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/data/elif.py	(revision 1126)
@@ -0,0 +1,26 @@
+"""Checks use of "else if" triggers a refactor message"""
+
+def my_function():
+    """docstring"""
+    myint = 2
+    if myint > 5:
+        pass
+    else:
+        if myint <= 5:
+            pass
+        else:
+            myint = 3
+            if myint > 2:
+                if myint > 3:
+                    pass
+                elif myint == 3:
+                    pass
+                elif myint < 3:
+                    pass
+                else:
+                    if myint:
+                        pass
+            else:
+                if myint:
+                    pass
+                myint = 4
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/test_check_docs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/test_check_docs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/test_check_docs.py	(revision 1126)
@@ -0,0 +1,666 @@
+"""Unit tests for the pylint checkers in :mod:`pylint.extensions.check_docs`,
+in particular the parameter documentation checker `ParamDocChecker`
+"""
+from __future__ import division, print_function, absolute_import
+
+import unittest
+import sys
+
+import astroid
+from astroid import test_utils
+from pylint.testutils import CheckerTestCase, Message, set_config
+
+from pylint.extensions.check_docs import ParamDocChecker, space_indentation
+
+
+class ParamDocCheckerTest(CheckerTestCase):
+    """Tests for pylint_plugin.ParamDocChecker"""
+    CHECKER_CLASS = ParamDocChecker
+
+    def test_space_indentation(self):
+        self.assertEqual(space_indentation('abc'), 0)
+        self.assertEqual(space_indentation(''), 0)
+        self.assertEqual(space_indentation('  abc'), 2)
+        self.assertEqual(space_indentation('\n  abc'), 0)
+        self.assertEqual(space_indentation('   \n  abc'), 3)
+
+    def test_missing_func_params_in_sphinx_docstring(self):
+        """Example of a function with missing Sphinx parameter documentation in
+        the docstring
+        """
+        node = test_utils.extract_node("""
+        def function_foo(x, y, z):
+            '''docstring ...
+
+            :param x: bla
+
+            :param int z: bar
+            '''
+            pass
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('y',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('x, y',))
+        ):
+            self.checker.visit_functiondef(node)
+
+    def test_missing_func_params_in_google_docstring(self):
+        """Example of a function with missing Google style parameter
+        documentation in the docstring
+        """
+        node = test_utils.extract_node("""
+        def function_foo(x, y, z):
+            '''docstring ...
+
+            Args:
+                x: bla
+                z (int): bar
+
+            some other stuff
+            '''
+            pass
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('y',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('x, y',))
+        ):
+            self.checker.visit_functiondef(node)
+
+    def test_missing_func_params_in_numpy_docstring(self):
+        """Example of a function with missing NumPy style parameter
+        documentation in the docstring
+        """
+        node = test_utils.extract_node("""
+        def function_foo(x, y, z):
+            '''docstring ...
+
+            Parameters
+            ----------
+            x:
+                bla
+            z: int
+                bar
+
+            some other stuff
+            '''
+            pass
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('y',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('x, y',))
+        ):
+            self.checker.visit_functiondef(node)
+
+    def test_tolerate_no_param_documentation_at_all(self):
+        """Example of a function with no parameter documentation at all
+
+        No error message is emitted.
+        """
+        node = test_utils.extract_node("""
+        def function_foo(x, y):
+            '''docstring ...
+
+            missing parameter documentation'''
+            pass
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    @set_config(accept_no_param_doc=False)
+    def test_don_t_tolerate_no_param_documentation_at_all(self):
+        """Example of a function with no parameter documentation at all
+
+        No error message is emitted.
+        """
+        node = test_utils.extract_node("""
+        def function_foo(x, y):
+            '''docstring ...
+
+            missing parameter documentation'''
+            pass
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('x, y',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('x, y',))
+        ):
+            self.checker.visit_functiondef(node)
+
+    def _visit_methods_of_class(self, node):
+        """Visit all methods of a class node
+
+        :param node: class node
+        :type node: :class:`astroid.scoped_nodes.Class`
+        """
+        for body_item in node.body:
+            if (isinstance(body_item, astroid.FunctionDef)
+                    and hasattr(body_item, 'name')):
+                self.checker.visit_functiondef(body_item)
+
+    def test_missing_method_params_in_sphinx_docstring(self):
+        """Example of a class method with missing parameter documentation in
+        the Sphinx style docstring
+        """
+        node = test_utils.extract_node("""
+        class Foo(object):
+            def method_foo(self, x, y):
+                '''docstring ...
+
+                missing parameter documentation
+
+                :param x: bla
+                '''
+                pass
+        """)
+        method_node = node.body[0]
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=method_node,
+                args=('y',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=method_node,
+                args=('x, y',))
+        ):
+            self._visit_methods_of_class(node)
+
+    def test_missing_method_params_in_google_docstring(self):
+        """Example of a class method with missing parameter documentation in
+        the Google style docstring
+        """
+        node = test_utils.extract_node("""
+        class Foo(object):
+            def method_foo(self, x, y):
+                '''docstring ...
+
+                missing parameter documentation
+
+                Args:
+                    x: bla
+                '''
+                pass
+        """)
+        method_node = node.body[0]
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=method_node,
+                args=('y',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=method_node,
+                args=('x, y',))
+        ):
+            self._visit_methods_of_class(node)
+
+    def test_missing_method_params_in_numpy_docstring(self):
+        """Example of a class method with missing parameter documentation in
+        the Numpy style docstring
+        """
+        node = test_utils.extract_node("""
+        class Foo(object):
+            def method_foo(self, x, y):
+                '''docstring ...
+
+                missing parameter documentation
+
+                Parameters
+                ----------
+                x:
+                    bla
+                '''
+                pass
+        """)
+        method_node = node.body[0]
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=method_node,
+                args=('y',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=method_node,
+                args=('x, y',))
+        ):
+            self._visit_methods_of_class(node)
+
+    def test_existing_func_params_in_sphinx_docstring(self):
+        """Example of a function with correctly documented parameters and
+        return values (Sphinx style)
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg, zarg):
+            '''function foo ...
+
+            :param xarg: bla xarg
+            :type xarg: int
+
+            :param yarg: bla yarg
+            :type yarg: float
+
+            :param int zarg: bla zarg
+
+            :return: sum
+            :rtype: float
+            '''
+            return xarg + yarg
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    def test_existing_func_params_in_google_docstring(self):
+        """Example of a function with correctly documented parameters and
+        return values (Google style)
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg, zarg):
+            '''function foo ...
+
+            Args:
+                xarg (int): bla xarg
+                yarg (float): bla
+                    bla yarg
+        
+                zarg (int): bla zarg
+
+            Returns:
+                float: sum
+            '''
+            return xarg + yarg
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    def test_existing_func_params_in_numpy_docstring(self):
+        """Example of a function with correctly documented parameters and
+        return values (Numpy style)
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg, zarg):
+            '''function foo ...
+
+            Parameters
+            ----------
+            xarg: int
+                bla xarg
+            yarg: float
+                bla yarg
+
+            zarg: int
+                bla zarg
+
+            Returns
+            -------
+            float
+                sum
+            '''
+            return xarg + yarg
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    def test_wrong_name_of_func_params_in_sphinx_docstring(self):
+        """Example of functions with inconsistent parameter names in the
+        signature and in the Sphinx style documentation
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg, zarg):
+            '''function foo ...
+
+            :param xarg1: bla xarg
+            :type xarg: int
+
+            :param yarg: bla yarg
+            :type yarg1: float
+
+            :param str zarg1: bla zarg
+            '''
+            return xarg + yarg
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('xarg, xarg1, zarg, zarg1',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('yarg, yarg1, zarg, zarg1',)),
+        ):
+            self.checker.visit_functiondef(node)
+
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg):
+            '''function foo ...
+
+            :param yarg1: bla yarg
+            :type yarg1: float
+
+            For the other parameters, see bla.
+            '''
+            return xarg + yarg
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('yarg1',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('yarg1',))
+        ):
+            self.checker.visit_functiondef(node)
+
+    def test_wrong_name_of_func_params_in_google_docstring(self):
+        """Example of functions with inconsistent parameter names in the
+        signature and in the Google style documentation
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg, zarg):
+            '''function foo ...
+
+            Args:
+                xarg1 (int): bla xarg
+                yarg (float): bla yarg
+
+                zarg1 (str): bla zarg
+            '''
+            return xarg + yarg
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('xarg, xarg1, zarg, zarg1',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('xarg, xarg1, zarg, zarg1',)),
+        ):
+            self.checker.visit_functiondef(node)
+
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg):
+            '''function foo ...
+
+            Args:
+                yarg1 (float): bla yarg
+
+            For the other parameters, see bla.
+            '''
+            return xarg + yarg
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('yarg1',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('yarg1',))
+        ):
+            self.checker.visit_functiondef(node)
+
+    def test_wrong_name_of_func_params_in_numpy_docstring(self):
+        """Example of functions with inconsistent parameter names in the
+        signature and in the Numpy style documentation
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg, zarg):
+            '''function foo ...
+
+            Parameters
+            ----------
+            xarg1: int
+                bla xarg
+            yarg: float
+                bla yarg
+
+            zarg1: str
+                bla zarg
+            '''
+            return xarg + yarg
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('xarg, xarg1, zarg, zarg1',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('xarg, xarg1, zarg, zarg1',)),
+        ):
+            self.checker.visit_functiondef(node)
+
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg):
+            '''function foo ...
+
+            Parameters
+            ----------
+            yarg1: float
+                bla yarg
+
+            For the other parameters, see bla.
+            '''
+            return xarg + yarg
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('yarg1',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('yarg1',))
+        ):
+            self.checker.visit_functiondef(node)
+
+    def test_see_sentence_for_func_params_in_sphinx_docstring(self):
+        """Example for the usage of "For the other parameters, see" to avoid
+        too many repetitions, e.g. in functions or methods adhering to a
+        given interface (Sphinx style)
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg):
+            '''function foo ...
+
+            :param yarg: bla yarg
+            :type yarg: float
+
+            For the other parameters, see :func:`bla`
+            '''
+            return xarg + yarg
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    def test_see_sentence_for_func_params_in_google_docstring(self):
+        """Example for the usage of "For the other parameters, see" to avoid
+        too many repetitions, e.g. in functions or methods adhering to a
+        given interface (Google style)
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg):
+            '''function foo ...
+
+            Args:
+                yarg (float): bla yarg
+
+            For the other parameters, see :func:`bla`
+            '''
+            return xarg + yarg
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    def test_see_sentence_for_func_params_in_numpy_docstring(self):
+        """Example for the usage of "For the other parameters, see" to avoid
+        too many repetitions, e.g. in functions or methods adhering to a
+        given interface (Numpy style)
+        """
+        node = test_utils.extract_node("""
+        def function_foo(xarg, yarg):
+            '''function foo ...
+
+            Parameters
+            ----------
+            yarg: float
+                bla yarg
+
+            For the other parameters, see :func:`bla`
+            '''
+            return xarg + yarg
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    def test_constr_params_in_class_sphinx(self):
+        """Example of a class with missing constructor parameter documentation
+        (Sphinx style)
+
+        Everything is completely analogous to functions.
+        """
+        node = test_utils.extract_node("""
+        class ClassFoo(object):
+            '''docstring foo
+
+            :param y: bla
+            
+            missing constructor parameter documentation
+            '''
+
+            def __init__(self, x, y):
+                pass
+
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('x',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('x, y',))
+        ):
+            self._visit_methods_of_class(node)
+
+    def test_constr_params_in_class_google(self):
+        """Example of a class with missing constructor parameter documentation
+        (Google style)
+
+        Everything is completely analogous to functions.
+        """
+        node = test_utils.extract_node("""
+        class ClassFoo(object):
+            '''docstring foo
+
+            Args:
+                y: bla
+            
+            missing constructor parameter documentation
+            '''
+
+            def __init__(self, x, y):
+                pass
+
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('x',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('x, y',))
+        ):
+            self._visit_methods_of_class(node)
+
+    def test_constr_params_in_class_numpy(self):
+        """Example of a class with missing constructor parameter documentation
+        (Numpy style)
+
+        Everything is completely analogous to functions.
+        """
+        node = test_utils.extract_node("""
+        class ClassFoo(object):
+            '''docstring foo
+
+            Parameters
+            ----------
+            y:
+                bla
+            
+            missing constructor parameter documentation
+            '''
+
+            def __init__(self, x, y):
+                pass
+
+        """)
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('x',)),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('x, y',))
+        ):
+            self._visit_methods_of_class(node)
+
+    @unittest.skipIf(sys.version_info[0] != 3, "Enabled on Python 3")
+    def test_kwonlyargs_are_taken_in_account(self):
+        node = test_utils.extract_node('''
+        def my_func(arg, *, kwonly, missing_kwonly):
+            """The docstring
+
+            :param int arg: The argument.
+            :param bool kwonly: A keyword-arg.
+            """
+        ''')
+        with self.assertAddsMessages(
+            Message(
+                msg_id='missing-param-doc',
+                node=node,
+                args=('missing_kwonly', )),
+            Message(
+                msg_id='missing-type-doc',
+                node=node,
+                args=('missing_kwonly', ))):
+            self.checker.visit_functiondef(node)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/test_elseif_used.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/test_elseif_used.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/extensions/test_elseif_used.py	(revision 1126)
@@ -0,0 +1,47 @@
+"""Tests for the pylint checker in :mod:`pylint.extensions.check_elif
+"""
+
+import os
+import os.path as osp
+import unittest
+
+from pylint import checkers
+from pylint.extensions.check_elif import ElseifUsedChecker
+from pylint.lint import PyLinter
+from pylint.reporters import BaseReporter
+
+
+class TestReporter(BaseReporter):
+
+    def handle_message(self, msg):
+        self.messages.append(msg)
+
+    def on_set_current_module(self, module, filepath):
+        self.messages = []
+
+
+class CheckElseIfUsedTC(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls._linter = PyLinter()
+        cls._linter.set_reporter(TestReporter())
+        checkers.initialize(cls._linter)
+        cls._linter.register_checker(ElseifUsedChecker(cls._linter))
+
+    def test_elseif_message(self):
+        elif_test = osp.join(osp.dirname(osp.abspath(__file__)), 'data',
+                             'elif.py')
+        self._linter.check([elif_test])
+        msgs = self._linter.reporter.messages
+        self.assertEqual(len(msgs), 2)
+        for msg in msgs:
+            self.assertEqual(msg.symbol, 'else-if-used')
+            self.assertEqual(msg.msg,
+                             'Consider using "elif" instead of "else if"')
+        self.assertEqual(msgs[0].line, 9)
+        self.assertEqual(msgs[1].line, 21)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_format.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_format.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_format.py	(revision 1126)
@@ -0,0 +1,262 @@
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+""" Copyright (c) 2000-2011 LOGILAB S.A. (Paris, FRANCE).
+ http://www.logilab.fr/ -- mailto:contact@logilab.fr
+
+Check format checker helper functions
+"""
+
+from __future__ import unicode_literals
+
+import astroid
+from astroid import test_utils
+
+from pylint.checkers.format import *
+
+from pylint.testutils import (
+      CheckerTestCase, Message, set_config, tokenize_str,
+)
+
+
+class MultiStatementLineTest(CheckerTestCase):
+  CHECKER_CLASS = FormatChecker
+
+  def testSingleLineIfStmts(self):
+      stmt = test_utils.extract_node("""
+      if True: pass  #@
+      """)
+      with self.assertAddsMessages(Message('multiple-statements', node=stmt.body[0])):
+          self.checker.process_tokens([])
+          self.checker.visit_default(stmt.body[0])
+      self.checker.config.single_line_if_stmt = True
+      with self.assertNoMessages():
+          self.checker.process_tokens([])
+          self.checker.visit_default(stmt.body[0])
+      stmt = test_utils.extract_node("""
+      if True: pass  #@
+      else:
+        pass
+      """)
+      with self.assertAddsMessages(Message('multiple-statements', node=stmt.body[0])):
+          self.checker.process_tokens([])
+          self.checker.visit_default(stmt.body[0])
+
+  def testTryExceptFinallyNoMultipleStatement(self):
+      tree = test_utils.extract_node("""
+      try:  #@
+        pass
+      except:
+        pass
+      finally:
+        pass""")
+      with self.assertNoMessages():
+          self.checker.process_tokens([])
+          self.checker.visit_default(tree.body[0])
+
+
+
+class SuperfluousParenthesesTest(CheckerTestCase):
+    CHECKER_CLASS = FormatChecker
+
+    def testCheckKeywordParensHandlesValidCases(self):
+        self.checker._keywords_with_parens = set()
+        cases = [
+            'if foo:',
+            'if foo():',
+            'if (x and y) or z:',
+            'assert foo()',
+            'assert ()',
+            'if (1, 2) in (3, 4):',
+            'if (a or b) in c:',
+            'return (x for x in x)',
+            'if (x for x in x):',
+            'for x in (x for x in x):',
+            'not (foo or bar)',
+            'not (foo or bar) and baz',
+            ]
+        with self.assertNoMessages():
+            for code in cases:
+                self.checker._check_keyword_parentheses(tokenize_str(code), 0)
+
+    def testCheckKeywordParensHandlesUnnecessaryParens(self):
+        self.checker._keywords_with_parens = set()
+        cases = [
+            (Message('superfluous-parens', line=1, args='if'),
+             'if (foo):', 0),
+            (Message('superfluous-parens', line=1, args='if'),
+             'if ((foo, bar)):', 0),
+            (Message('superfluous-parens', line=1, args='if'),
+             'if (foo(bar)):', 0),
+            (Message('superfluous-parens', line=1, args='return'),
+             'return ((x for x in x))', 0),
+            (Message('superfluous-parens', line=1, args='not'),
+             'not (foo)', 0),
+            (Message('superfluous-parens', line=1, args='not'),
+             'if not (foo):', 1),
+            (Message('superfluous-parens', line=1, args='if'),
+             'if (not (foo)):', 0),
+            (Message('superfluous-parens', line=1, args='not'),
+             'if (not (foo)):', 2),
+            ]
+        for msg, code, offset in cases:
+            with self.assertAddsMessages(msg):
+                self.checker._check_keyword_parentheses(tokenize_str(code), offset)
+
+    def testFuturePrintStatementWithoutParensWarning(self):
+        code = """from __future__ import print_function
+print('Hello world!')
+"""
+        tree = astroid.parse(code)
+        with self.assertNoMessages():
+            self.checker.process_module(tree)
+            self.checker.process_tokens(tokenize_str(code))
+
+
+class CheckSpaceTest(CheckerTestCase):
+    CHECKER_CLASS = FormatChecker
+
+    def testParenthesesGood(self):
+        good_cases = [
+            '(a)\n',
+            '(a * (b + c))\n',
+            '(#\n    a)\n',
+            ]
+        with self.assertNoMessages():
+            for code in good_cases:
+                self.checker.process_tokens(tokenize_str(code))
+
+    def testParenthesesBad(self):
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'after', 'bracket', '( a)\n^'))):
+            self.checker.process_tokens(tokenize_str('( a)\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'before', 'bracket', '(a )\n   ^'))):
+            self.checker.process_tokens(tokenize_str('(a )\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'before', 'bracket', 'foo (a)\n    ^'))):
+            self.checker.process_tokens(tokenize_str('foo (a)\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'before', 'bracket', '{1: 2} [1]\n       ^'))):
+            self.checker.process_tokens(tokenize_str('{1: 2} [1]\n'))
+
+    def testTrailingCommaGood(self):
+        with self.assertNoMessages():
+            self.checker.process_tokens(tokenize_str('(a, )\n'))
+            self.checker.process_tokens(tokenize_str('(a,)\n'))
+
+        self.checker.config.no_space_check = []
+        with self.assertNoMessages():
+            self.checker.process_tokens(tokenize_str('(a,)\n'))
+
+    @set_config(no_space_check=[])
+    def testTrailingCommaBad(self):
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'before', 'bracket', '(a, )\n    ^'))):
+            self.checker.process_tokens(tokenize_str('(a, )\n'))
+
+    def testComma(self):
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'before', 'comma', '(a , b)\n   ^'))):
+            self.checker.process_tokens(tokenize_str('(a , b)\n'))
+
+    def testSpacesAllowedInsideSlices(self):
+        good_cases = [
+            '[a:b]\n',
+            '[a : b]\n',
+            '[a : ]\n',
+            '[:a]\n',
+            '[:]\n',
+            '[::]\n',
+            ]
+        with self.assertNoMessages():
+            for code in good_cases:
+                self.checker.process_tokens(tokenize_str(code))
+
+    def testKeywordSpacingGood(self):
+        with self.assertNoMessages():
+            self.checker.process_tokens(tokenize_str('foo(foo=bar)\n'))
+            self.checker.process_tokens(tokenize_str('lambda x=1: x\n'))
+
+    def testKeywordSpacingBad(self):
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'before', 'keyword argument assignment',
+                          '(foo =bar)\n     ^'))):
+            self.checker.process_tokens(tokenize_str('(foo =bar)\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'after', 'keyword argument assignment',
+                          '(foo= bar)\n    ^'))):
+            self.checker.process_tokens(tokenize_str('(foo= bar)\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('No', 'allowed', 'around', 'keyword argument assignment',
+                          '(foo = bar)\n     ^'))):
+            self.checker.process_tokens(tokenize_str('(foo = bar)\n'))
+
+    def testOperatorSpacingGood(self):
+        good_cases = [
+            'a = b\n'
+            'a < b\n'
+            'a\n< b\n',
+            ]
+        with self.assertNoMessages():
+            for code in good_cases:
+                self.checker.process_tokens(tokenize_str(code))
+
+    def testOperatorSpacingBad(self):
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('Exactly one', 'required', 'before', 'comparison', 'a< b\n ^'))):
+            self.checker.process_tokens(tokenize_str('a< b\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('Exactly one', 'required', 'after', 'comparison', 'a <b\n  ^'))):
+            self.checker.process_tokens(tokenize_str('a <b\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('Exactly one', 'required', 'around', 'comparison', 'a<b\n ^'))):
+            self.checker.process_tokens(tokenize_str('a<b\n'))
+
+        with self.assertAddsMessages(
+            Message('bad-whitespace', line=1,
+                    args=('Exactly one', 'required', 'around', 'comparison', 'a<  b\n ^'))):
+            self.checker.process_tokens(tokenize_str('a<  b\n'))
+
+    def testEmptyLines(self):
+        self.checker.config.no_space_check = []
+        with self.assertAddsMessages(
+            Message('trailing-whitespace', line=2)):
+            self.checker.process_tokens(tokenize_str('a = 1\n  \nb = 2\n'))
+
+        self.checker.config.no_space_check = ['empty-line']
+        with self.assertNoMessages():
+            self.checker.process_tokens(tokenize_str('a = 1\n  \nb = 2\n'))
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_classes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_classes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_classes.py	(revision 1126)
@@ -0,0 +1,84 @@
+"""Unit tests for the variables checker."""
+import unittest
+import sys
+
+import astroid
+from astroid import test_utils
+from pylint.checkers import classes
+from pylint.testutils import CheckerTestCase, Message, set_config
+
+class VariablesCheckerTC(CheckerTestCase):
+
+    CHECKER_CLASS = classes.ClassChecker
+
+    def test_bitbucket_issue_164(self):
+        """Issue 164 report a false negative for access-member-before-definition"""
+        n1, n2 = test_utils.extract_node("""
+        class MyClass1(object):
+          def __init__(self):
+            self.first += 5 #@
+            self.first = 0  #@
+        """)
+        message = Message('access-member-before-definition',
+                          node=n1.target, args=('first', n2.lineno))
+        with self.assertAddsMessages(message):
+            self.walk(n1.root())
+
+    @set_config(exclude_protected=('_meta', '_manager'))
+    def test_exclude_protected(self):
+        """Test that exclude-protected can be used to
+        exclude names from protected-access warning.
+        """
+
+        node = astroid.parse("""
+        class Protected(object):
+            '''empty'''
+            def __init__(self):
+                self._meta = 42
+                self._manager = 24
+                self._teta = 29
+        OBJ = Protected()
+        OBJ._meta
+        OBJ._manager
+        OBJ._teta
+        """)
+        with self.assertAddsMessages(
+                Message('protected-access',
+                        node=node.body[-1].value,
+                        args='_teta')):
+            self.walk(node.root())
+
+    @unittest.skipUnless(sys.version_info[0] == 3,
+                         "The test works on Python 3.")
+    def test_regression_non_parent_init_called_tracemalloc(self):
+        # This used to raise a non-parent-init-called on Pylint 1.3
+        # See issue https://bitbucket.org/logilab/pylint/issue/308/
+        # for reference.
+        node = test_utils.extract_node("""
+        from tracemalloc import Sequence
+        class _Traces(Sequence):
+            def __init__(self, traces): #@
+                Sequence.__init__(self)
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+    def test_super_init_not_called_regression(self):
+        # This should not emit a super-init-not-called
+        # warning. It previously did this, because
+        # ``next(node.infer())`` was used in that checker's
+        # logic and the first inferred node was an YES object,
+        # leading to this false positive.
+        node = test_utils.extract_node("""
+        import ctypes
+
+        class Foo(ctypes.BigEndianStructure):
+            def __init__(self): #@
+                ctypes.BigEndianStructure.__init__(self)
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0122_py_30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0122_py_30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0122_py_30.txt	(revision 1126)
@@ -0,0 +1,5 @@
+W:  5: Use of exec
+W:  6: Use of exec
+W:  8: Use of exec
+W: 12:func: Use of exec
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_toolonglines_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_toolonglines_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_toolonglines_py30.txt	(revision 1126)
@@ -0,0 +1,4 @@
+C:  1: Line too long (101/100)
+C:  2: Line too long (104/100)
+C: 17: Line too long (102/100)
+C: 25: Line too long (105/100)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bug113231.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bug113231.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bug113231.txt	(revision 1126)
@@ -0,0 +1,2 @@
+W: 20: Specify string format arguments as logging function parameters
+W: 21: Specify string format arguments as logging function parameters
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0203.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0203.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0203.txt	(revision 1126)
@@ -0,0 +1,2 @@
+C: 12:Abcd.abcd: Class method abcd should have 'cls' as first argument
+R: 15:Abcd: Consider using a decorator instead of calling classmethod
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0204.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0204.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0204.txt	(revision 1126)
@@ -0,0 +1,3 @@
+E: 10:Abcd.__init__: Method should have "self" as first argument
+E: 14:Abcd.abdc: Method should have "self" as first argument
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0601.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0601.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0601.txt	(revision 1126)
@@ -0,0 +1 @@
+E:  8:function: Using variable 'aaaa' before assignment
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0604.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0604.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0604.txt	(revision 1126)
@@ -0,0 +1 @@
+E: 13: Invalid object 'some_function' in __all__, must contain only strings
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_use_for_or_listcomp_var_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_use_for_or_listcomp_var_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_use_for_or_listcomp_var_py30.txt	(revision 1126)
@@ -0,0 +1,3 @@
+E:  6: Using variable 'C' before assignment
+W: 15: Using possibly undefined loop variable 'var1'
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_return_yield_mix_py_33.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_return_yield_mix_py_33.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_return_yield_mix_py_33.txt	(revision 1126)
@@ -0,0 +1,2 @@
+E:  6:somegen: Return with argument inside generator
+E: 15:moregen: Return with argument inside generator
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/builtin_module.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/builtin_module.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/builtin_module.txt	(revision 1126)
@@ -0,0 +1 @@
+F:  1: ignored builtin module sys
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0401.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0401.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0401.txt	(revision 1126)
@@ -0,0 +1,3 @@
+R:  1: Cyclic import (input.func_w0401 -> input.w0401_cycle)
+W:  8: Using a conditional statement with a constant value
+W:  8: Using a conditional statement with a constant value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0205.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0205.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0205.txt	(revision 1126)
@@ -0,0 +1,2 @@
+W: 22:Cdef.abcd: Signature differs from overridden 'abcd' method
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0404.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0404.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0404.txt	(revision 1126)
@@ -0,0 +1,5 @@
+W:  7: Reimport 'ElementTree' (imported line 6)
+W: 10: Reimport 'email.encoders' (imported line 9)
+W: 12: Reimport 'sys' (imported line 4)
+W: 23:reimport: Redefining name 'sys' from outer scope (line 4)
+W: 23:reimport: Reimport 'sys' (imported line 4)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0801.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0801.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0801.txt	(revision 1126)
@@ -0,0 +1,11 @@
+R:  1: Similar lines in 2 files
+==input.func_w0801:3
+==input.w0801_same:3
+__revision__ = 'id'
+A = 2
+B = 3
+C = A + B
+# need more than X lines to trigger the message
+C *= 2
+A -= B
+# all this should be detected
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0405.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0405.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0405.txt	(revision 1126)
@@ -0,0 +1,4 @@
+W:  8: Reimport 'os' (imported line 6)
+W: 16: Reimport 'exists' (imported line 7)
+W: 21:func: Reimport 'os' (imported line 6)
+W: 23:func: Reimport 're' (imported line 9)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0406.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0406.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0406.txt	(revision 1126)
@@ -0,0 +1 @@
+W:  4: Module import itself
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e13xx_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e13xx_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e13xx_py30.txt	(revision 1126)
@@ -0,0 +1,11 @@
+E: 11:pprint: Not enough arguments for format string
+E: 12:pprint: Too many arguments for format string
+E: 13:pprint: Mixing named and unnamed conversion specifiers in format string
+E: 14:pprint: Missing key 'PARG_2' in format string dictionary
+E: 16:pprint: Missing key 'PARG_2' in format string dictionary
+E: 17:pprint: Expected mapping for format string, not Tuple
+E: 18:pprint: Expected mapping for format string, not List
+E: 19:pprint: Unsupported format character 'z' (0x7a) at index 2
+E: 20:pprint: Format string ends in middle of conversion specifier
+W: 15:pprint: Unused key 'PARG_3' in format string dictionary
+W: 16:pprint: Format string dictionary key should be a string, not 2
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_nonregr___file___global.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_nonregr___file___global.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_nonregr___file___global.txt	(revision 1126)
@@ -0,0 +1,2 @@
+W:  5:func: Redefining built-in '__file__'
+W:  5:func: Using the global statement
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0012.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0012.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e0012.txt	(revision 1126)
@@ -0,0 +1 @@
+E:  1: Bad option value 'W04044'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0011.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0011.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0011.txt	(revision 1126)
@@ -0,0 +1,2 @@
+I:  1: Locally disabling reimported (W0404)
+I:  1: Useless suppression of 'reimported'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0012.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0012.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0012.txt	(revision 1126)
@@ -0,0 +1 @@
+I:  1: Locally enabling reimported (W0404)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0013.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0013.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0013.txt	(revision 1126)
@@ -0,0 +1 @@
+I:  1: Ignoring entire file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0014.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0014.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0014.txt	(revision 1126)
@@ -0,0 +1,2 @@
+I:  1: Ignoring entire file
+I:  1: Pragma "disable-all" is deprecated, use "skip-file" instead
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_logging_not_lazy_with_logger.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_logging_not_lazy_with_logger.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_logging_not_lazy_with_logger.txt	(revision 1126)
@@ -0,0 +1,4 @@
+W:  8: Specify string format arguments as logging function parameters
+W:  9: Specify string format arguments as logging function parameters
+W: 11: Specify string format arguments as logging function parameters
+W: 13: Specify string format arguments as logging function parameters
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_callfunc_assigment.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_callfunc_assigment.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_callfunc_assigment.txt	(revision 1126)
@@ -0,0 +1,3 @@
+E: 20: Assigning to function call which doesn't return
+E: 28: Assigning to function call which only returns None
+E: 35: Assigning to function call which only returns None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_nameerror_on_string_substitution.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_nameerror_on_string_substitution.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_nameerror_on_string_substitution.txt	(revision 1126)
@@ -0,0 +1,2 @@
+E:  5: Using variable 'MSG' before assignment
+E:  8: Using variable 'MSG2' before assignment
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e13xx.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e13xx.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e13xx.txt	(revision 1126)
@@ -0,0 +1,13 @@
+E: 11:pprint: Not enough arguments for format string
+E: 12:pprint: Too many arguments for format string
+E: 13:pprint: Mixing named and unnamed conversion specifiers in format string
+E: 14:pprint: Missing key 'PARG_2' in format string dictionary
+E: 16:pprint: Missing key 'PARG_2' in format string dictionary
+E: 17:pprint: Expected mapping for format string, not Tuple
+E: 18:pprint: Expected mapping for format string, not List
+E: 19:pprint: Unsupported format character 'z' (0x7a) at index 2
+E: 20:pprint: Format string ends in middle of conversion specifier
+E: 21:pprint: Unsupported format character 'a' (0x61) at index 12
+W: 15:pprint: Unused key 'PARG_3' in format string dictionary
+W: 16:pprint: Format string dictionary key should be a string, not 2
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unused_import_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unused_import_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unused_import_py30.txt	(revision 1126)
@@ -0,0 +1 @@
+W:  8: Reimport 'ABCMeta' (imported line 7)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0611.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0611.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0611.txt	(revision 1126)
@@ -0,0 +1 @@
+W:  7: Unused import os
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0612.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0612.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0612.txt	(revision 1126)
@@ -0,0 +1,5 @@
+W:  9:function: Unused variable 'aaaa'
+W: 34:test_global: Unused variable 'platform'
+W: 35:test_global: Unused variable 'VERSION'
+W: 36:test_global: Unused variable 'this'
+W: 37:test_global: Unused variable 'RE'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_3k_removed_stuff_py_30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_3k_removed_stuff_py_30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_3k_removed_stuff_py_30.txt	(revision 1126)
@@ -0,0 +1,4 @@
+E: 12:function: Instance of 'unicode' has no 'looower' member
+W:  4: Relative import 'func_w0401', should be 'input.func_w0401'
+W:  5: Used builtin function 'filter'. Using a list comprehension can be clearer.
+W:  5: Used builtin function 'map'. Using a list comprehension can be clearer.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_too_many_returns_yields.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_too_many_returns_yields.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_too_many_returns_yields.txt	(revision 1126)
@@ -0,0 +1 @@
+R:  5:too_many_returns: Too many return statements (11/6)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0613.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0613.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0613.txt	(revision 1126)
@@ -0,0 +1,5 @@
+W:  7:function: Unused argument 'arg'
+W: 14:AAAA.method: Unused argument 'arg'
+W: 21:AAAA.selected: Unused argument 'args'
+W: 21:AAAA.selected: Unused argument 'kwargs'
+W: 40:BBBB.__init__: Unused argument 'arg'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unicode_literal_py26.txt
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_block_disable_msg.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_block_disable_msg.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_block_disable_msg.txt	(revision 1126)
@@ -0,0 +1,13 @@
+E: 26:Foo.meth3: Instance of 'Foo' has no 'blop' member
+E: 36:Foo.meth4: Instance of 'Foo' has no 'blip' member
+E: 46:Foo.meth5: Instance of 'Foo' has no 'blip' member
+E: 61:Foo.meth6: Instance of 'Foo' has no 'blip' member
+E: 72:Foo.meth7: Instance of 'Foo' has no 'blip' member
+E: 75:Foo.meth7: Instance of 'Foo' has no 'blip' member
+E: 77:Foo.meth7: Instance of 'Foo' has no 'blip' member
+E: 83:Foo.meth8: Instance of 'Foo' has no 'blip' member
+E:102:Foo.meth9: Instance of 'Foo' has no 'blip' member
+W: 11:Foo.meth1: Unused argument 'arg'
+W:144:ClassLevelMessage.too_complex_but_thats_ok: Else clause on loop without a break statement
+W:150:ClassLevelMessage.too_complex_but_thats_ok: Else clause on loop without a break statement
+W:156:ClassLevelMessage.too_complex_but_thats_ok: Else clause on loop without a break statement
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_break_or_return_in_try_finally.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_break_or_return_in_try_finally.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_break_or_return_in_try_finally.txt	(revision 1126)
@@ -0,0 +1,3 @@
+W: 18:insidious_break_and_return: break statement in finally block may swallow exception
+W: 20:insidious_break_and_return: return statement in finally block may swallow exception
+W: 39:break_and_return.strange: Cell variable my_var defined in loop
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0401_package.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0401_package.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0401_package.txt	(revision 1126)
@@ -0,0 +1 @@
+R:  1: Cyclic import (input.func_w0401_package.all_the_things -> input.func_w0401_package.thing2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unused_overridden_argument.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unused_overridden_argument.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unused_overridden_argument.txt	(revision 1126)
@@ -0,0 +1 @@
+W: 22:Sub.newmethod: Unused argument 'aay'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0020.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0020.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0020.txt	(revision 1126)
@@ -0,0 +1,2 @@
+I:  7: Locally disabling unused-variable (W0612)
+I:  8: Suppressed 'unused-variable' (from line 7)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623_py_30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623_py_30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623_py_30.txt	(revision 1126)
@@ -0,0 +1,12 @@
+C: 28:some_function: Invalid variable name "FOO"
+C: 41: Invalid constant name "exc3"
+C: 57: Invalid variable name "OOPS"
+W: 18:some_function: Redefining name 'RuntimeError' from object 'exceptions' in exception handler
+W: 20:some_function: Redefining name 'OSError' from builtins in exception handler
+W: 20:some_function: Unused variable 'OSError'
+W: 22:some_function: Redefining name 'MyError' from outer scope (line 7) in exception handler
+W: 22:some_function: Unused variable 'MyError'
+W: 45: Redefining name 'RuntimeError' from object 'exceptions' in exception handler
+W: 47: Redefining name 'args' from object 'exceptions.RuntimeError' in exception handler
+W: 49: Redefining name 'OSError' from builtins in exception handler
+W: 51: Redefining name 'MyOtherError' from outer scope (line 36) in exception handler
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_raw_escapes.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_raw_escapes.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_raw_escapes.txt	(revision 1126)
@@ -0,0 +1,3 @@
+W:  5: Anomalous Unicode escape in byte string: '\u'. String constant might be missing an r or u prefix.
+W:  6: Anomalous Unicode escape in byte string: '\U'. String constant might be missing an r or u prefix.
+W:  7: Anomalous Unicode escape in byte string: '\N'. String constant might be missing an r or u prefix.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0022.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0022.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_i0022.txt	(revision 1126)
@@ -0,0 +1,21 @@
+I:  5: Locally disabling invalid-name (C0103)
+I:  5: Suppressed 'invalid-name' (from line 5)
+I:  6: Locally disabling invalid-name (C0103)
+I:  6: Pragma "disable-msg" is deprecated, use "disable" instead
+I:  6: Suppressed 'invalid-name' (from line 6)
+I:  8: Locally disabling invalid-name (C0103)
+I:  9: Suppressed 'invalid-name' (from line 8)
+I: 10: Locally enabling invalid-name (C0103)
+I: 12: Locally disabling invalid-name (C0103)
+I: 12: Pragma "disable-msg" is deprecated, use "disable" instead
+I: 13: Suppressed 'invalid-name' (from line 12)
+I: 14: Locally enabling invalid-name (C0103)
+I: 14: Pragma "enable-msg" is deprecated, use "enable" instead
+I: 16: Locally disabling invalid-name (C0103)
+I: 16: Pragma "disable-msg" is deprecated, use "disable" instead
+I: 17: Suppressed 'invalid-name' (from line 16)
+I: 18: Locally enabling invalid-name (C0103)
+I: 18: Pragma "enable-msg" is deprecated, use "enable" instead
+I: 20: Locally disabling invalid-name (C0103)
+I: 21: Suppressed 'invalid-name' (from line 20)
+I: 22: Locally enabling invalid-name (C0103)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_no_dummy_redefined.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_no_dummy_redefined.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_no_dummy_redefined.txt	(revision 1126)
@@ -0,0 +1,2 @@
+C:  7: Invalid constant name "value"
+W: 12:clobbering: Redefining name 'value' from outer scope (line 7)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_excess_escapes.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_excess_escapes.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_excess_escapes.txt	(revision 1126)
@@ -0,0 +1,9 @@
+W:  7: Anomalous backslash in string: '\['. String constant might be missing an r prefix.
+W:  7: Anomalous backslash in string: '\]'. String constant might be missing an r prefix.
+W:  8: Anomalous backslash in string: '\/'. String constant might be missing an r prefix.
+W:  9: Anomalous backslash in string: '\`'. String constant might be missing an r prefix.
+W: 15: Anomalous backslash in string: '\o'. String constant might be missing an r prefix.
+W: 15: Anomalous backslash in string: '\o'. String constant might be missing an r prefix.
+W: 17: Anomalous backslash in string: '\8'. String constant might be missing an r prefix.
+W: 17: Anomalous backslash in string: '\9'. String constant might be missing an r prefix.
+W: 27: Anomalous backslash in string: '\P'. String constant might be missing an r prefix.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_disable_linebased.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_disable_linebased.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_disable_linebased.txt	(revision 1126)
@@ -0,0 +1,2 @@
+C:  1: Line too long (127/100)
+C: 14: Line too long (114/100)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_loopvar_in_dict_comp_py27.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_loopvar_in_dict_comp_py27.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_loopvar_in_dict_comp_py27.txt	(revision 1126)
@@ -0,0 +1 @@
+W:  8:bad_case.<lambda>: Cell variable x defined in loop
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_kwoa_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_kwoa_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_kwoa_py30.txt	(revision 1126)
@@ -0,0 +1,5 @@
+E: 10: Missing mandatory keyword argument 'foo' in function call
+E: 10: Too many positional arguments for function call
+E: 12: Missing mandatory keyword argument 'foo' in function call
+E: 12: Too many positional arguments for function call
+W:  3:function: Redefining name 'foo' from outer scope (line 9)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0622.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0622.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0622.txt	(revision 1126)
@@ -0,0 +1,2 @@
+W:  8:function: Redefining built-in 'type'
+W: 11: Redefining built-in 'map'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0703.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0703.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0703.txt	(revision 1126)
@@ -0,0 +1 @@
+W:  8: Catching too general exception Exception
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623.txt	(revision 1126)
@@ -0,0 +1,11 @@
+C: 28:some_function: Invalid variable name "FOO"
+C: 41: Invalid constant name "exc3"
+C: 55: Invalid variable name "OOPS"
+W: 18:some_function: Redefining name 'RuntimeError' from object 'exceptions' in exception handler
+W: 20:some_function: Redefining name 'OSError' from builtins in exception handler
+W: 20:some_function: Unused variable 'OSError'
+W: 22:some_function: Redefining name 'MyError' from outer scope (line 7) in exception handler
+W: 22:some_function: Unused variable 'MyError'
+W: 45: Redefining name 'RuntimeError' from object 'exceptions' in exception handler
+W: 47: Redefining name 'OSError' from builtins in exception handler
+W: 49: Redefining name 'MyOtherError' from outer scope (line 36) in exception handler
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0705.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0705.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0705.txt	(revision 1126)
@@ -0,0 +1,11 @@
+E: 10: Bad except clauses order (Exception is an ancestor class of TypeError)
+E: 17: Bad except clauses order (LookupError is an ancestor class of IndexError)
+E: 24: Bad except clauses order (LookupError is an ancestor class of IndexError)
+E: 24: Bad except clauses order (NameError is an ancestor class of UnboundLocalError)
+E: 27: Bad except clauses order (empty except clause should always appear last)
+W:  8: Catching too general exception Exception
+W: 29: No exception type(s) specified
+W: 31: Catching too general exception Exception
+W: 38: No exception type(s) specified
+W: 43: Catching too general exception Exception
+W: 45: No exception type(s) specified
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_disable_linebased_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_disable_linebased_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_disable_linebased_py30.txt	(revision 1126)
@@ -0,0 +1,2 @@
+C:  1: Line too long (127/100)
+C: 14: Line too long (114/100)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_module___dict__.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_module___dict__.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_module___dict__.txt	(revision 1126)
@@ -0,0 +1 @@
+E:  5: Using variable '__dict__' before assignment
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bad_assigment_to_exception_var.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bad_assigment_to_exception_var.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bad_assigment_to_exception_var.txt	(revision 1126)
@@ -0,0 +1,5 @@
+E: 11: Raising int while only classes or instances are allowed
+E: 20:func: Raising NoneType while only classes or instances are allowed
+E: 30: Raising NoneType while only classes or instances are allowed
+W: 12: Catching too general exception Exception
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0332_py_30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0332_py_30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0332_py_30.txt	(revision 1126)
@@ -0,0 +1 @@
+W:  4: Use of "l" as long integer identifier
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0623_py30.txt	(revision 1126)
@@ -0,0 +1,2 @@
+W: 15:some_function: Redefining name 'some_function' from outer scope (line 10) in exception handler
+W: 15:some_function: Unused variable 'some_function'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_init_vars.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_init_vars.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_init_vars.txt	(revision 1126)
@@ -0,0 +1 @@
+W: 18:MyClass.met: Attribute 'base_var' defined outside __init__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_with_without_as_py25.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_with_without_as_py25.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_with_without_as_py25.txt	(revision 1126)
@@ -0,0 +1,3 @@
+E: 11:do_nothing: Using variable 'base' before assignment
+W: 11:do_nothing: Statement seems to have no effect
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_non_callable_call.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_non_callable_call.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_non_callable_call.txt	(revision 1126)
@@ -0,0 +1,8 @@
+E: 10: __revision__ is not callable
+E: 29: INSTANCE is not callable
+E: 31: LIST is not callable
+E: 33: DICT is not callable
+E: 35: TUPLE is not callable
+E: 37: INT is not callable
+E: 72: PROP.test is not callable
+E: 73: PROP.custom is not callable
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e12xx.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e12xx.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_e12xx.txt	(revision 1126)
@@ -0,0 +1,6 @@
+E: 14:pprint: Too many arguments for logging format string
+E: 15:pprint: Too many arguments for logging format string
+E: 16:pprint: Logging format string ends in middle of conversion specifier
+E: 17:pprint: Not enough arguments for logging format string
+E: 18:pprint: Unsupported logging format character 'y' (0x79) at index 3
+E: 19:pprint: Too many arguments for logging format string
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unicode_literal_py274.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unicode_literal_py274.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_unicode_literal_py274.txt	(revision 1126)
@@ -0,0 +1 @@
+W:  6: Anomalous Unicode escape in byte string: '\u'. String constant might be missing an r or u prefix.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_use_for_or_listcomp_var_py29.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_use_for_or_listcomp_var_py29.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_use_for_or_listcomp_var_py29.txt	(revision 1126)
@@ -0,0 +1,3 @@
+W:  6: Using possibly undefined loop variable 'C'
+W: 15: Using possibly undefined loop variable 'var1'
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bad_cont_dictcomp_py27.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bad_cont_dictcomp_py27.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_bad_cont_dictcomp_py27.txt	(revision 1126)
@@ -0,0 +1,6 @@
+C: 35: Wrong continued indentation (add 2 spaces).
+    for x in range(3)}  # [bad-continuation]
+    ^ |
+C: 38: Wrong continued indentation (remove 4 spaces).
+          for x in range(3)}  # [bad-continuation]
+      |   ^
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0312.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0312.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0312.txt	(revision 1126)
@@ -0,0 +1,2 @@
+W: 10: Found indentation with tabs instead of spaces
+W: 11: Found indentation with tabs instead of spaces
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_variables_unused_name_from_wilcard_import.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_variables_unused_name_from_wilcard_import.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_variables_unused_name_from_wilcard_import.txt	(revision 1126)
@@ -0,0 +1,4 @@
+W:  3: Unused import NonRegr from wildcard import
+W:  3: Unused import os from wildcard import
+W:  3: Unused import sys from wildcard import
+W:  3: Wildcard import input.func_w0611
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0233.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0233.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0233.txt	(revision 1126)
@@ -0,0 +1,6 @@
+E:  6: Unable to import 'nonexistant'
+E: 22:CCC: Module 'input.func_w0233' has no 'BBBB' member
+E: 27:CCC.__init__: Module 'input.func_w0233' has no 'BBBB' member
+E: 50:Super2.__init__: Super of 'Super2' has no '__woohoo__' member
+W: 14:AAAA.__init__: __init__ method from a non direct base class 'BBBBMixin' is called
+W: 48:Super2.__init__: __init__ method from base class 'dict' is not called
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0631.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0631.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_w0631.txt	(revision 1126)
@@ -0,0 +1 @@
+W: 10:do_stuff: Using possibly undefined loop variable 'var'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_first_arg.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_first_arg.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_first_arg.txt	(revision 1126)
@@ -0,0 +1,9 @@
+C: 10:Obj.__new__: Class method __new__ should have 'cls' as first argument
+C: 18:Obj.class2: Class method class2 should have 'cls' as first argument
+C: 25:Meta.__new__: Metaclass class method __new__ should have 'mcs' as first argument
+C: 32:Meta.method2: Metaclass method method2 should have 'cls' as first argument
+C: 40:Meta.class2: Metaclass class method class2 should have 'mcs' as first argument
+R: 16:Obj: Consider using a decorator instead of calling classmethod
+R: 20:Obj: Consider using a decorator instead of calling classmethod
+R: 38:Meta: Consider using a decorator instead of calling classmethod
+R: 42:Meta: Consider using a decorator instead of calling classmethod
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_dotted_ancestor.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_dotted_ancestor.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_dotted_ancestor.txt	(revision 1126)
@@ -0,0 +1 @@
+R:  8:Aaaa: Too few public methods (0/2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_getattr_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_getattr_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/messages/func_typecheck_getattr_py30.txt	(revision 1126)
@@ -0,0 +1,9 @@
+E: 25:Client.__init__: Class 'Provider' has no 'cattribute' member
+E: 35:Client.use_method: Instance of 'Provider' has no 'hophophop' member
+E: 40:Client.use_attr: Instance of 'Provider' has no 'attribute' member
+E: 52:Client.test_bt_types: Instance of 'list' has no 'apppend' member
+E: 54:Client.test_bt_types: Instance of 'dict' has no 'set' member
+E: 56:Client.test_bt_types: Instance of 'tuple' has no 'append' member
+E: 58:Client.test_bt_types: Instance of 'str' has no 'loower' member
+E: 62:Client.test_bt_types: Instance of 'int' has no 'whatever' member
+E: 66: Instance of 'int' has no 'lower' member (but some types could not be inferred)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/ascript
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/ascript	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/ascript	(revision 1126)
@@ -0,0 +1,2 @@
+#!/usr/bin/python
+"""ttttttttttttttttttttoooooooooooooooooooooooooooooooooooooooooooooooooooooo lllllllllllooooooooooooooooooooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnngggggggggggggggggg"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/clientmodule_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/clientmodule_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/clientmodule_test.py	(revision 1126)
@@ -0,0 +1,29 @@
+""" docstring for file clientmodule.py """
+from data.suppliermodule_test import Interface, DoNothing
+
+class Ancestor(object):
+    """ Ancestor method """
+    __implements__ = (Interface,)
+    cls_member = DoNothing()
+
+    def __init__(self, value):
+        local_variable = 0
+        self.attr = 'this method shouldn\'t have a docstring'
+        self.__value = value
+
+    def get_value(self):
+        """ nice docstring ;-) """
+        return self.__value
+
+    def set_value(self, value):
+        self.__value = value
+        return 'this method shouldn\'t have a docstring'
+
+class Specialization(Ancestor):
+    TYPE = 'final class'
+    top = 'class'
+
+    def __init__(self, value, _id):
+        Ancestor.__init__(self, value)
+        self._id = _id
+        self.relation = DoNothing()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/classes_No_Name.dot
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/classes_No_Name.dot	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/classes_No_Name.dot	(revision 1126)
@@ -0,0 +1,12 @@
+digraph "classes_No_Name" {
+charset="utf-8"
+rankdir=BT
+"0" [label="{Ancestor|attr : str\lcls_member\l|get_value()\lset_value()\l}", shape="record"];
+"1" [label="{DoNothing|\l|}", shape="record"];
+"2" [label="{Interface|\l|get_value()\lset_value()\l}", shape="record"];
+"3" [label="{Specialization|TYPE : str\lrelation\ltop : str\l|}", shape="record"];
+"3" -> "0" [arrowhead="empty", arrowtail="none"];
+"0" -> "2" [arrowhead="empty", arrowtail="node", style="dashed"];
+"1" -> "0" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="cls_member", style="solid"];
+"1" -> "3" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="relation", style="solid"];
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/packages_No_Name.dot
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/packages_No_Name.dot	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/packages_No_Name.dot	(revision 1126)
@@ -0,0 +1,8 @@
+digraph "packages_No_Name" {
+charset="utf-8"
+rankdir=BT
+"0" [label="data", shape="box"];
+"1" [label="data.clientmodule_test", shape="box"];
+"2" [label="data.suppliermodule_test", shape="box"];
+"1" -> "2" [arrowhead="open", arrowtail="none"];
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/suppliermodule_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/suppliermodule_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/data/suppliermodule_test.py	(revision 1126)
@@ -0,0 +1,10 @@
+""" file suppliermodule.py """
+
+class Interface:
+    def get_value(self):
+        raise NotImplementedError
+
+    def set_value(self, value):
+        raise NotImplementedError
+
+class DoNothing: pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_similar.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_similar.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_similar.py	(revision 1126)
@@ -0,0 +1,142 @@
+import sys
+from os.path import join, dirname, abspath
+import unittest
+
+import six
+
+from pylint.checkers import similar
+
+SIMILAR1 = join(dirname(abspath(__file__)), 'input', 'similar1')
+SIMILAR2 = join(dirname(abspath(__file__)), 'input', 'similar2')
+
+class SimilarTC(unittest.TestCase):
+    """test the similar command line utility"""
+
+    def test_ignore_comments(self):
+        sys.stdout = six.StringIO()
+        try:
+            similar.Run(['--ignore-comments', SIMILAR1, SIMILAR2])
+        except SystemExit as ex:
+            self.assertEqual(ex.code, 0)
+            output = sys.stdout.getvalue()
+        else:
+            self.fail('not system exit')
+        finally:
+            sys.stdout = sys.__stdout__
+        self.assertMultiLineEqual(output.strip(), ("""
+10 similar lines in 2 files
+==%s:0
+==%s:0
+   import one
+   from two import two
+   three
+   four
+   five
+   six
+   seven
+   eight
+   nine
+   ''' ten
+TOTAL lines=44 duplicates=10 percent=22.73
+""" % (SIMILAR1, SIMILAR2)).strip())
+
+
+    def test_ignore_docsrings(self):
+        sys.stdout = six.StringIO()
+        try:
+            similar.Run(['--ignore-docstrings', SIMILAR1, SIMILAR2])
+        except SystemExit as ex:
+            self.assertEqual(ex.code, 0)
+            output = sys.stdout.getvalue()
+        else:
+            self.fail('not system exit')
+        finally:
+            sys.stdout = sys.__stdout__
+        self.assertMultiLineEqual(output.strip(), ("""
+8 similar lines in 2 files
+==%s:6
+==%s:6
+   seven
+   eight
+   nine
+   ''' ten
+   ELEVEN
+   twelve '''
+   thirteen
+   fourteen
+
+5 similar lines in 2 files
+==%s:0
+==%s:0
+   import one
+   from two import two
+   three
+   four
+   five
+TOTAL lines=44 duplicates=13 percent=29.55
+""" % ((SIMILAR1, SIMILAR2) * 2)).strip())
+
+
+    def test_ignore_imports(self):
+        sys.stdout = six.StringIO()
+        try:
+            similar.Run(['--ignore-imports', SIMILAR1, SIMILAR2])
+        except SystemExit as ex:
+            self.assertEqual(ex.code, 0)
+            output = sys.stdout.getvalue()
+        else:
+            self.fail('not system exit')
+        finally:
+            sys.stdout = sys.__stdout__
+        self.assertMultiLineEqual(output.strip(), """
+TOTAL lines=44 duplicates=0 percent=0.00
+""".strip())
+
+
+    def test_ignore_nothing(self):
+        sys.stdout = six.StringIO()
+        try:
+            similar.Run([SIMILAR1, SIMILAR2])
+        except SystemExit as ex:
+            self.assertEqual(ex.code, 0)
+            output = sys.stdout.getvalue()
+        else:
+            self.fail('not system exit')
+        finally:
+            sys.stdout = sys.__stdout__
+        self.assertMultiLineEqual(output.strip(), ("""
+5 similar lines in 2 files
+==%s:0
+==%s:0
+   import one
+   from two import two
+   three
+   four
+   five
+TOTAL lines=44 duplicates=5 percent=11.36
+""" % (SIMILAR1, SIMILAR2)).strip())
+
+    def test_help(self):
+        sys.stdout = six.StringIO()
+        try:
+            similar.Run(['--help'])
+        except SystemExit as ex:
+            self.assertEqual(ex.code, 0)
+        else:
+            self.fail('not system exit')
+        finally:
+            sys.stdout = sys.__stdout__
+
+    def test_no_args(self):
+        sys.stdout = six.StringIO()
+        try:
+            similar.Run([])
+        except SystemExit as ex:
+            self.assertEqual(ex.code, 1)
+        else:
+            self.fail('not system exit')
+        finally:
+            sys.stdout = sys.__stdout__
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_func.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_func.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_func.py	(revision 1126)
@@ -0,0 +1,85 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""functional/non regression tests for pylint"""
+
+import unittest
+import sys
+import re
+
+from os import getcwd
+from os.path import abspath, dirname, join
+
+from pylint.testutils import (make_tests, LintTestUsingModule, LintTestUsingFile,
+    LintTestUpdate, cb_test_gen, linter, test_reporter)
+
+PY3K = sys.version_info >= (3, 0)
+
+# Configure paths
+INPUT_DIR = join(dirname(abspath(__file__)), 'input')
+MSG_DIR = join(dirname(abspath(__file__)), 'messages')
+
+# Classes
+
+quote = "'" if sys.version_info >= (3, 3) else ''
+
+class LintTestNonExistentModuleTC(LintTestUsingModule):
+    module = 'nonexistent'
+    _get_expected = lambda self: 'F:  1: No module named %snonexistent%s\n' % (quote, quote)
+
+
+def gen_tests(filter_rgx):
+    if UPDATE:
+        callbacks = [cb_test_gen(LintTestUpdate)]
+    else:
+        callbacks = [cb_test_gen(LintTestUsingModule)]
+    tests = make_tests(INPUT_DIR, MSG_DIR, filter_rgx, callbacks)
+    if UPDATE:
+        return tests
+
+    if filter_rgx:
+        is_to_run = re.compile(filter_rgx).search
+    else:
+        is_to_run = lambda x: 1
+
+    if is_to_run('nonexistent'):
+        tests.append(LintTestNonExistentModuleTC)
+
+    assert len(tests) < 196, "Please do not add new test cases here."
+    return tests
+
+# Create suite
+
+FILTER_RGX = None
+UPDATE = False
+
+def suite():
+    return unittest.TestSuite([unittest.makeSuite(test, suiteClass=unittest.TestSuite)
+                              for test in gen_tests(FILTER_RGX)])
+
+
+def load_tests(loader, tests, pattern):
+    return suite()
+
+
+if __name__=='__main__':
+    if '-u' in sys.argv:
+        UPDATE = True
+        sys.argv.remove('-u')
+
+    if len(sys.argv) > 1:
+        FILTER_RGX = sys.argv[1]
+        del sys.argv[1]
+    unittest.main(defaultTest='suite')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_variables.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_variables.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_variables.py	(revision 1126)
@@ -0,0 +1,101 @@
+"""Unit tests for the variables checker."""
+import sys
+import os
+import unittest
+
+import astroid
+from astroid import test_utils
+
+from pylint.checkers import variables
+from pylint.testutils import CheckerTestCase, linter, set_config, Message
+
+class VariablesCheckerTC(CheckerTestCase):
+
+    CHECKER_CLASS = variables.VariablesChecker
+
+    def test_bitbucket_issue_78(self):
+        """ Issue 78 report a false positive for unused-module """
+        module = astroid.parse("""
+        from sys import path
+        path += ['stuff']
+        def func():
+            other = 1
+            return len(other)
+        """)
+        with self.assertNoMessages():
+            self.walk(module)
+
+    @set_config(ignored_modules=('argparse',))
+    def test_no_name_in_module_skipped(self):
+        """Make sure that 'from ... import ...' does not emit a
+        'no-name-in-module' with a module that is configured
+        to be ignored.
+        """
+
+        node = test_utils.extract_node("""
+        from argparse import THIS_does_not_EXIST
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_importfrom(node)
+
+    @set_config(callbacks=('callback_', '_callback'))
+    def test_custom_callback_string(self):
+        """ Test the --calbacks option works. """
+        def cleanup():
+            self.checker._to_consume = _to_consume
+        _to_consume = self.checker._to_consume
+        self.checker._to_consume = []
+        self.addCleanup(cleanup)
+
+        node = test_utils.extract_node("""
+        def callback_one(abc):
+             ''' should not emit unused-argument. '''
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+            self.checker.leave_functiondef(node)
+
+        node = test_utils.extract_node("""
+        def two_callback(abc, defg):
+             ''' should not emit unused-argument. '''
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(node)
+            self.checker.leave_functiondef(node)
+
+        node = test_utils.extract_node("""
+        def normal_func(abc):
+             ''' should emit unused-argument. '''
+        """)
+        with self.assertAddsMessages(
+                Message('unused-argument', node=node['abc'], args='abc')):
+            self.checker.visit_functiondef(node)
+            self.checker.leave_functiondef(node)
+
+        node = test_utils.extract_node("""
+        def cb_func(abc):
+             ''' Previous callbacks are overriden. '''
+        """)
+        with self.assertAddsMessages(
+                Message('unused-argument', node=node['abc'], args='abc')):
+            self.checker.visit_functiondef(node)
+            self.checker.leave_functiondef(node)
+
+
+class MissingSubmoduleTest(CheckerTestCase):
+    CHECKER_CLASS = variables.VariablesChecker
+
+    def test_package_all(self):
+        regr_data = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+                                 'regrtest_data')
+        sys.path.insert(0, regr_data)
+        try:
+            linter.check(os.path.join(regr_data, 'package_all'))
+            got = linter.reporter.finalize().strip()
+            self.assertEqual(got, "E:  3: Undefined variable name "
+                                  "'missing' in __all__")
+        finally:
+            sys.path.pop(0)
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_base.py	(revision 1126)
@@ -0,0 +1,305 @@
+"""Unittest for the base checker."""
+
+import re
+import unittest
+
+import astroid
+from astroid import test_utils
+from pylint.checkers import base
+from pylint.testutils import CheckerTestCase, Message, set_config
+
+
+class DocstringTest(CheckerTestCase):
+    CHECKER_CLASS = base.DocStringChecker
+
+    def test_missing_docstring_module(self):
+        module = astroid.parse("something")
+        message = Message('missing-docstring', node=module, args=('module',))
+        with self.assertAddsMessages(message):
+            self.checker.visit_module(module)
+
+    def test_missing_docstring_emtpy_module(self):
+        module = astroid.parse("")
+        with self.assertNoMessages():
+            self.checker.visit_module(module)
+
+    def test_empty_docstring_module(self):
+        module = astroid.parse("''''''")
+        message = Message('empty-docstring', node=module, args=('module',))
+        with self.assertAddsMessages(message):
+            self.checker.visit_module(module)
+
+    def test_empty_docstring_function(self):
+        func = test_utils.extract_node("""
+        def func(tion):
+           pass""")
+        message = Message('missing-docstring', node=func, args=('function',))
+        with self.assertAddsMessages(message):
+            self.checker.visit_functiondef(func)
+
+    @set_config(docstring_min_length=2)
+    def test_short_function_no_docstring(self):
+        func = test_utils.extract_node("""
+        def func(tion):
+           pass""")
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(func)
+
+    @set_config(docstring_min_length=2)
+    def test_function_no_docstring_by_name(self):
+        func = test_utils.extract_node("""
+        def __fun__(tion):
+           pass""")
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(func)
+
+    def test_class_no_docstring(self):
+        klass = test_utils.extract_node("""
+        class Klass(object):
+           pass""")
+        message = Message('missing-docstring', node=klass, args=('class',))
+        with self.assertAddsMessages(message):
+            self.checker.visit_classdef(klass)
+
+
+class NameCheckerTest(CheckerTestCase):
+    CHECKER_CLASS = base.NameChecker
+    CONFIG = {
+        'bad_names': set(),
+        }
+
+    @set_config(include_naming_hint=True)
+    def test_naming_hint(self):
+        const = test_utils.extract_node("""
+        const = "CONSTANT" #@
+        """)
+        message = Message(
+           'invalid-name', node=const.targets[0],
+           args=('constant', 'const',
+                 ' (hint: (([A-Z_][A-Z0-9_]*)|(__.*__))$)'))
+        with self.assertAddsMessages(message):
+            self.checker.visit_assignname(const.targets[0])
+
+    @set_config(include_naming_hint=True, const_name_hint='CONSTANT')
+    def test_naming_hint_configured_hint(self):
+        const = test_utils.extract_node("""
+        const = "CONSTANT" #@
+        """)
+        with self.assertAddsMessages(
+            Message('invalid-name', node=const.targets[0],
+                    args=('constant', 'const', ' (hint: CONSTANT)'))):
+            self.checker.visit_assignname(const.targets[0])
+
+    @set_config(attr_rgx=re.compile('[A-Z]+'))
+    def test_property_names(self):
+        # If a method is annotated with @property, it's name should
+        # match the attr regex. Since by default the attribute regex is the same
+        # as the method regex, we override it here.
+        methods = test_utils.extract_node("""
+        import abc
+
+        class FooClass(object):
+          @property
+          def FOO(self): #@
+            pass
+
+          @property
+          def bar(self): #@
+            pass
+
+          @abc.abstractproperty
+          def BAZ(self): #@
+            pass
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(methods[0])
+            self.checker.visit_functiondef(methods[2])
+        with self.assertAddsMessages(Message('invalid-name', node=methods[1],
+                                             args=('attribute', 'bar', ''))):
+            self.checker.visit_functiondef(methods[1])
+
+    @set_config(attr_rgx=re.compile('[A-Z]+'))
+    def test_property_setters(self):
+        method = test_utils.extract_node("""
+        class FooClass(object):
+          @property
+          def foo(self): pass
+
+          @foo.setter
+          def FOOSETTER(self): #@
+             pass
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_functiondef(method)
+
+    def test_module_level_names(self):
+        assign = test_utils.extract_node("""
+        import collections
+        Class = collections.namedtuple("a", ("b", "c")) #@
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_assignname(assign.targets[0])
+
+        assign = test_utils.extract_node("""
+        class ClassA(object):
+            pass
+        ClassB = ClassA
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_assignname(assign.targets[0])
+
+        module = astroid.parse("""
+        def A():
+          return 1, 2, 3
+        CONSTA, CONSTB, CONSTC = A()
+        CONSTD = A()""")
+        with self.assertNoMessages():
+            self.checker.visit_assignname(module.body[1].targets[0].elts[0])
+            self.checker.visit_assignname(module.body[2].targets[0])
+
+        assign = test_utils.extract_node("""
+        CONST = "12 34 ".rstrip().split()""")
+        with self.assertNoMessages():
+            self.checker.visit_assignname(assign.targets[0])
+
+
+class MultiNamingStyleTest(CheckerTestCase):
+    CHECKER_CLASS = base.NameChecker
+
+    MULTI_STYLE_RE = re.compile('(?:(?P<UP>[A-Z]+)|(?P<down>[a-z]+))$')
+
+    @set_config(class_rgx=MULTI_STYLE_RE)
+    def test_multi_name_detection_majority(self):
+        classes = test_utils.extract_node("""
+        class classb(object): #@
+            pass
+        class CLASSA(object): #@
+            pass
+        class CLASSC(object): #@
+            pass
+        """)
+        message = Message('invalid-name',
+                          node=classes[0],
+                          args=('class', 'classb', ''))
+        with self.assertAddsMessages(message):
+            for cls in classes:
+                self.checker.visit_classdef(cls)
+            self.checker.leave_module(cls.root)
+
+    @set_config(class_rgx=MULTI_STYLE_RE)
+    def test_multi_name_detection_first_invalid(self):
+        classes = test_utils.extract_node("""
+        class class_a(object): #@
+            pass
+        class classb(object): #@
+            pass
+        class CLASSC(object): #@
+            pass
+        """)
+        messages = [
+            Message('invalid-name', node=classes[0],
+                    args=('class', 'class_a', '')),
+            Message('invalid-name', node=classes[2],
+                    args=('class', 'CLASSC', ''))
+        ]
+        with self.assertAddsMessages(*messages):
+            for cls in classes:
+                self.checker.visit_classdef(cls)
+            self.checker.leave_module(cls.root)
+
+    @set_config(method_rgx=MULTI_STYLE_RE,
+                function_rgx=MULTI_STYLE_RE,
+                name_group=('function:method',))
+    def test_multi_name_detection_group(self):
+        function_defs = test_utils.extract_node("""
+        class First(object):
+            def func(self): #@
+                pass
+
+        def FUNC(): #@
+            pass
+        """, module_name='test')
+        message = Message('invalid-name', node=function_defs[1],
+                          args=('function', 'FUNC', ''))
+        with self.assertAddsMessages(message):
+            for func in function_defs:
+                self.checker.visit_functiondef(func)
+            self.checker.leave_module(func.root)
+
+    @set_config(function_rgx=re.compile('(?:(?P<ignore>FOO)|(?P<UP>[A-Z]+)|(?P<down>[a-z]+))$'))
+    def test_multi_name_detection_exempt(self):
+        function_defs = test_utils.extract_node("""
+        def FOO(): #@
+            pass
+        def lower(): #@
+            pass
+        def FOO(): #@
+            pass
+        def UPPER(): #@
+            pass
+        """)
+        message = Message('invalid-name', node=function_defs[3],
+                          args=('function', 'UPPER', ''))
+        with self.assertAddsMessages(message):
+            for func in function_defs:
+                self.checker.visit_functiondef(func)
+            self.checker.leave_module(func.root)
+
+class ComparisonTest(CheckerTestCase):
+    CHECKER_CLASS = base.ComparisonChecker
+
+    def test_comparison(self):
+        node = test_utils.extract_node("foo == True")
+        message = Message('singleton-comparison',
+                          node=node,
+                          args=(True, "just 'expr' or 'expr is True'"))
+        with self.assertAddsMessages(message):
+            self.checker.visit_compare(node)
+
+        node = test_utils.extract_node("foo == False")
+        message = Message('singleton-comparison',
+                          node=node,
+                          args=(False, "'not expr' or 'expr is False'"))
+        with self.assertAddsMessages(message):
+            self.checker.visit_compare(node)
+
+        node = test_utils.extract_node("foo == None")
+        message = Message('singleton-comparison',
+                          node=node,
+                          args=(None, "'expr is None'"))
+        with self.assertAddsMessages(message):
+            self.checker.visit_compare(node)
+
+        node = test_utils.extract_node("True == foo")
+        messages = (Message('misplaced-comparison-constant',
+                            node=node,
+                            args=('foo == True',)),
+                    Message('singleton-comparison',
+                            node=node,
+                            args=(True, "just 'expr' or 'expr is True'")))
+        with self.assertAddsMessages(*messages):
+            self.checker.visit_compare(node)
+
+        node = test_utils.extract_node("False == foo")
+        messages = (Message('misplaced-comparison-constant',
+                            node=node,
+                            args=('foo == False',)),
+                    Message('singleton-comparison',
+                            node=node,
+                            args=(False, "'not expr' or 'expr is False'")))
+        with self.assertAddsMessages(*messages):
+            self.checker.visit_compare(node)
+
+        node = test_utils.extract_node("None == foo")
+        messages = (Message('misplaced-comparison-constant',
+                            node=node,
+                            args=('foo == None',)),
+                    Message('singleton-comparison',
+                            node=node,
+                            args=(None, "'expr is None'")))
+        with self.assertAddsMessages(*messages):
+            self.checker.visit_compare(node)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_utils.py	(revision 1126)
@@ -0,0 +1,94 @@
+# Copyright 2013 Google Inc.
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+import unittest
+import warnings
+
+import astroid
+
+from pylint import __pkginfo__
+from pylint import utils
+from pylint import interfaces
+from pylint.checkers.utils import check_messages
+
+
+class PyLintASTWalkerTest(unittest.TestCase):
+    class MockLinter(object):
+        def __init__(self, msgs):
+            self._msgs = msgs
+
+        def is_message_enabled(self, msgid):
+            return self._msgs.get(msgid, True)
+
+    class Checker(object):
+        def __init__(self):
+            self.called = set()
+
+        @check_messages('first-message')
+        def visit_module(self, module):
+            self.called.add('module')
+
+        @check_messages('second-message')
+        def visit_call(self, module):
+            raise NotImplementedError
+
+        @check_messages('second-message', 'third-message')
+        def visit_assignname(self, module):
+            self.called.add('assname')
+
+        @check_messages('second-message')
+        def leave_assignname(self, module):
+            raise NotImplementedError
+
+    def test_check_messages(self):
+        linter = self.MockLinter({'first-message': True,
+                                  'second-message': False,
+                                  'third-message': True})
+        walker = utils.PyLintASTWalker(linter)
+        checker = self.Checker()
+        walker.add_checker(checker)
+        walker.walk(astroid.parse("x = func()"))
+        self.assertEqual(set(['module', 'assname']), checker.called)
+
+    def test_deprecated_methods(self):
+        class Checker(object):
+            def __init__(self):
+                self.called = False
+
+            @check_messages('first-message')
+            def visit_assname(self, node):
+                self.called = True
+
+        linter = self.MockLinter({'first-message': True})
+        walker = utils.PyLintASTWalker(linter)
+        checker = Checker()
+        walker.add_checker(checker)
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter('always')
+            walker.walk(astroid.parse("x = 1"))
+
+        if __pkginfo__.numversion < (2, 0):
+            expected = ('Implemented method visit_assname instead of '
+                        'visit_assignname. This will be supported until '
+                        'Pylint 2.0.')
+            self.assertEqual(len(w), 1)
+            self.assertIsInstance(w[0].message, PendingDeprecationWarning)
+            self.assertEqual(str(w[0].message), expected)
+            self.assertTrue(checker.called)
+        else:
+            self.assertNotEqual(len(w), 1)
+            self.assertFalse(checker.called)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_spelling.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_spelling.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_spelling.py	(revision 1126)
@@ -0,0 +1,93 @@
+# Copyright 2014 Michal Nowikowski.
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Unittest for the spelling checker."""
+
+import unittest
+
+from astroid import test_utils
+
+from pylint.checkers import spelling
+from pylint.testutils import (
+    CheckerTestCase, Message, set_config, tokenize_str,
+)
+
+# try to create enchant dictionary
+try:
+    import enchant
+except ImportError:
+    enchant = None
+
+spell_dict = None
+if enchant is not None:
+    try:
+        enchant.Dict("en_US")
+        spell_dict = "en_US"
+    except enchant.DictNotFoundError:
+        pass
+
+
+class SpellingCheckerTest(CheckerTestCase):
+    CHECKER_CLASS = spelling.SpellingChecker
+
+    @unittest.skipIf(spell_dict is None,
+                     "missing python-enchant package or missing "
+                     "spelling dictionaries")
+    @set_config(spelling_dict=spell_dict)
+    def test_check_bad_coment(self):
+        with self.assertAddsMessages(
+            Message('wrong-spelling-in-comment', line=1,
+                    args=('coment', '# bad coment',
+                          '      ^^^^^^',
+                          "comet' or 'comment' or 'moment' or 'foment"))):
+            self.checker.process_tokens(tokenize_str("# bad coment"))
+
+    @unittest.skipIf(spell_dict is None,
+                     "missing python-enchant package or missing "
+                     "spelling dictionaries")
+    @set_config(spelling_dict=spell_dict)
+    def test_check_bad_docstring(self):
+        stmt = test_utils.extract_node(
+            'def fff():\n   """bad coment"""\n   pass')
+        with self.assertAddsMessages(
+            Message('wrong-spelling-in-docstring', line=2,
+                    args=('coment', 'bad coment',
+                          '    ^^^^^^',
+                          "comet' or 'comment' or 'moment' or 'foment"))):
+            self.checker.visit_functiondef(stmt)
+
+        stmt = test_utils.extract_node(
+            'class Abc(object):\n   """bad coment"""\n   pass')
+        with self.assertAddsMessages(
+            Message('wrong-spelling-in-docstring', line=2,
+                    args=('coment', 'bad coment',
+                          '    ^^^^^^',
+                          "comet' or 'comment' or 'moment' or 'foment"))):
+            self.checker.visit_classdef(stmt)
+
+    @unittest.skipIf(spell_dict is None,
+                     "missing python-enchant package or missing "
+                     "spelling dictionaries")
+    @set_config(spelling_dict=spell_dict)
+    def test_invalid_docstring_characters(self):
+        stmt = test_utils.extract_node(
+            'def fff():\n   """test\\x00"""\n   pass')
+        with self.assertAddsMessages(
+            Message('invalid-characters-in-docstring', line=2,
+                    args=('test\x00',))):
+            self.checker.visit_functiondef(stmt)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/wrong_import_position.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/wrong_import_position.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/wrong_import_position.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""Test that wrong-import-position is properly reset when
+other errors are disabled.
+"""
+# pylint: disable=unused-import, too-few-public-methods
+
+
+class Something(object):
+    """A class before an import."""
+
+
+import os
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/bad_package/wrong.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/bad_package/wrong.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/bad_package/wrong.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""
+Test that pylint doesn't crash when a relative import
+depends on the local __init__, which contains an expected syntax error.
+"""
+from . import missing
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/bad_package/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/bad_package/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/bad_package/__init__.py	(revision 1126)
@@ -0,0 +1,2 @@
+import missing
+raise missing.Missing..
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/special_attr_scope_lookup_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/special_attr_scope_lookup_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/special_attr_scope_lookup_crash.py	(revision 1126)
@@ -0,0 +1,3 @@
+class Klass(object):
+    """A"""
+    __doc__ += "B"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/decimal_inference.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/decimal_inference.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/decimal_inference.py	(revision 1126)
@@ -0,0 +1,10 @@
+"""hum E1011 on .prec member is justifiable since Context instance are built
+using setattr/locals :(
+
+2007/02/17 update: .prec attribute is now detected by astroid :o)
+"""
+from __future__ import print_function
+import decimal
+
+decimal.getcontext().prec = 200
+print(decimal.getcontext().prec)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_assign.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_assign.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_assign.py	(revision 1126)
@@ -0,0 +1,5 @@
+import shmixml.dom.minidom
+import xml.dom.minidom
+
+if 'dom' not in xml.__dict__:
+  xml.dom = shmixml.dom
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/classdoc_usage.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/classdoc_usage.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/classdoc_usage.py	(revision 1126)
@@ -0,0 +1,17 @@
+"""ds"""
+
+__revision__ = None
+
+class SomeClass(object):
+    """cds"""
+    doc = __doc__
+
+    def __init__(self):
+        """only to make pylint happier"""
+
+    def please(self):
+        """public method 1/2"""
+
+    def besilent(self):
+        """public method 2/2"""
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_package_subpackage_module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_package_subpackage_module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_package_subpackage_module.py	(revision 1126)
@@ -0,0 +1,49 @@
+# pylint: disable=I0011,C0301,W0611
+"""I found some of my scripts trigger off an AttributeError in pylint
+0.8.1 (with common 0.12.0 and astroid 0.13.1).
+
+Traceback (most recent call last):
+  File "/usr/bin/pylint", line 4, in ?
+    lint.Run(sys.argv[1:])
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 729, in __init__
+    linter.check(args)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 412, in check
+    self.check_file(filepath, modname, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 426, in check_file
+    astroid = self._check_file(filepath, modname, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 450, in _check_file
+    self.check_astroid_module(astroid, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 494, in check_astroid_module
+    self.astroid_events(astroid, [checker for checker in checkers
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 511, in astroid_events
+    self.astroid_events(child, checkers, _reversed_checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 511, in astroid_events
+    self.astroid_events(child, checkers, _reversed_checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 508, in astroid_events
+    checker.visit(astroid)
+  File "/usr/lib/python2.4/site-packages/logilab/astroid/utils.py", line 84, in visit
+    method(node)
+  File "/usr/lib/python2.4/site-packages/pylint/checkers/variables.py", line 295, in visit_import
+    self._check_module_attrs(node, module, name_parts[1:])
+  File "/usr/lib/python2.4/site-packages/pylint/checkers/variables.py", line 357, in _check_module_attrs
+    self.add_message('E0611', args=(name, module.name),
+AttributeError: Import instance has no attribute 'name'
+
+
+You can reproduce it by:
+(1) create package structure like the following:
+
+package/
+        __init__.py
+        subpackage/
+                   __init__.py
+                   module.py
+
+(2) in package/__init__.py write:
+
+import subpackage
+
+(3) run pylint with a script importing package.subpackage.module.
+"""
+import package.subpackage.module
+__revision__ = '$Id: import_package_subpackage_module.py,v 1.1 2005-11-10 16:08:54 syt Exp $'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/application_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/application_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/application_crash.py	(revision 1126)
@@ -0,0 +1,12 @@
+class ErudiPublisher:
+    def __init__(self, config): 
+        self.url_resolver = self.select_component('urlpublisher')
+
+    def select_component(self, cid, *args, **kwargs):
+        try:
+            return self.select(self.registry_objects('components', cid), *args, **kwargs)
+        except NoSelectableObject:
+            return
+
+    def main_publish(self, path, req):
+        ctrlid = self.url_resolver.process(req, path)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/no_stdout_encoding.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/no_stdout_encoding.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/no_stdout_encoding.py	(revision 1126)
@@ -0,0 +1,5 @@
+#-*- coding:iso-8859-1 -*-
+class test:
+    def __init__ (self, dir):
+        testString = u"répertoire :\n%s !"%dir
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/absimp/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/absimp/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/absimp/__init__.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""a package with absolute import activated
+"""
+
+from __future__ import absolute_import
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/absimp/string.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/absimp/string.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/absimp/string.py	(revision 1126)
@@ -0,0 +1,7 @@
+"""
+http://www.logilab.org/ticket/70495
+http://www.logilab.org/ticket/70565
+"""
+from __future__ import absolute_import, print_function
+import string
+print(string)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_something.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_something.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/import_something.py	(revision 1126)
@@ -0,0 +1,4 @@
+# pylint: disable=missing-docstring,unused-import
+
+import os
+import sys
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/numarray_import.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/numarray_import.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/numarray_import.py	(revision 1126)
@@ -0,0 +1,7 @@
+"""#10077"""
+
+__revision__ = 1
+
+from numarray import zeros
+
+zeros(shape=(4, 5))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/py3k_error_flag.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/py3k_error_flag.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/py3k_error_flag.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""Contains both normal error messages and Python3 porting error messages."""
+# pylint: disable=bad-builtin, too-few-public-methods
+
+raise Exception, 1  # Error emitted here with the Python 3 checker.
+
+
+class Test(object):
+    """dummy"""
+
+    def __init__(self):
+        return 42
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/numarray_inf.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/numarray_inf.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/numarray_inf.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""#3216"""
+
+import numarray as na
+import numarray.random_array as nar
+IM16 = nar.randint(0, 256, 300).astype(na.UInt8)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package_all/notmissing.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package_all/notmissing.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package_all/notmissing.py	(revision 1126)
@@ -0,0 +1,2 @@
+""" empty """
+__revision__ = 1
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package_all/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package_all/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package_all/__init__.py	(revision 1126)
@@ -0,0 +1,3 @@
+""" Check for E0603 for missing submodule found in __all__ """
+__revision__ = 1
+__all__ = ['notmissing', 'missing']
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/precedence_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/precedence_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/precedence_test.py	(revision 1126)
@@ -0,0 +1,21 @@
+"""
+  # package/__init__.py
+  class AudioTime(object):
+    DECIMAL = 3
+
+  # package/AudioTime.py
+  class AudioTime(object):
+    pass
+
+  # test.py
+  from package import AudioTime
+  # E0611 - No name 'DECIMAL' in module 'AudioTime.AudioTime'
+  print AudioTime.DECIMAL
+
+"""
+from __future__ import print_function
+from package import AudioTime
+__revision__ = 0
+
+
+print(AudioTime.DECIMAL)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/descriptor_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/descriptor_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/descriptor_crash.py	(revision 1126)
@@ -0,0 +1,20 @@
+# -*- coding: iso-8859-1 -*-
+
+import urllib
+
+class Page(object):
+    _urlOpen = staticmethod(urllib.urlopen)
+
+    def getPage(self, url):
+        handle = self._urlOpen(url)
+        data = handle.read()
+        handle.close()
+        return data
+    #_getPage
+
+#Page
+
+if __name__ == "__main__":
+    import sys
+    p = Page()
+    print p.getPage(sys.argv[1])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/syntax_error.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/syntax_error.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/syntax_error.py	(revision 1126)
@@ -0,0 +1 @@
+class A extends B {}
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/__init__.py	(revision 1126)
@@ -0,0 +1,3 @@
+# pylint: disable=missing-docstring
+from .dummy import DUMMY
+from .another import ANOTHER
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/another.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/another.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/another.py	(revision 1126)
@@ -0,0 +1,4 @@
+# pylint: disable=missing-docstring
+
+ANOTHER = 42
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/dummy.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/dummy.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/dummy/dummy.py	(revision 1126)
@@ -0,0 +1,2 @@
+# pylint: disable=missing-docstring
+DUMMY = 42
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/subpackage/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/subpackage/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/subpackage/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+"""package.subpackage"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/subpackage/module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/subpackage/module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/subpackage/module.py	(revision 1126)
@@ -0,0 +1 @@
+"""package.subpackage.module"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/__init__.py	(revision 1126)
@@ -0,0 +1,15 @@
+# pylint: disable=R0903,W0403
+"""package's __init__ file"""
+
+from . import subpackage
+
+__revision__ = 0
+
+# E0602 - Undefined variable '__path__'
+__path__ += "folder"
+
+class AudioTime(object):
+    """test precedence over the AudioTime submodule"""
+
+    DECIMAL = 3
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/AudioTime.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/AudioTime.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/package/AudioTime.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""test preceeded by the AudioTime class in __init__.py"""
+
+__revision__ = 0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/try_finally_disable_msg_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/try_finally_disable_msg_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/try_finally_disable_msg_crash.py	(revision 1126)
@@ -0,0 +1,5 @@
+try:
+    pass
+finally:
+    # pylint: disable=W0201
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/module_global.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/module_global.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/module_global.py	(revision 1126)
@@ -0,0 +1,7 @@
+# pylint: disable=W0603,W0601,W0604,E0602,W0104
+"""was causing infinite recursion
+"""
+__revision__ = 1
+
+global GLOBAL_VAR
+GLOBAL_VAR.foo
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/html_crash_420.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/html_crash_420.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/regrtest_data/html_crash_420.py	(revision 1126)
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+tag2struct = {u"#": "R_HEADER"
+             ,u"£": "RDR_HEADER"
+             ,u"µ": "RDR_DRAFT"
+             }
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_diadefs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_diadefs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_diadefs.py	(revision 1126)
@@ -0,0 +1,171 @@
+# Copyright (c) 2000-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""
+unittest for the extensions.diadefslib modules
+"""
+
+import unittest
+import sys
+
+import six
+
+import astroid
+from astroid import MANAGER
+
+from pylint.pyreverse.inspector import Linker
+from pylint.pyreverse.diadefslib import *
+
+from unittest_pyreverse_writer import Config, get_project
+
+PROJECT = get_project('data')
+HANDLER = DiadefsHandler(Config())
+
+def _process_classes(classes):
+    """extract class names of a list"""
+    return sorted([(isinstance(c.node, astroid.ClassDef), c.title) for c in classes])
+
+def _process_relations(relations):
+    """extract relation indices from a relation list"""
+    result = []
+    for rel_type, rels in six.iteritems(relations):
+        for rel in rels:
+            result.append( (rel_type, rel.from_object.title,
+                            rel.to_object.title) )
+    result.sort()
+    return result
+
+
+class DiaDefGeneratorTC(unittest.TestCase):
+    def test_option_values(self):
+        """test for ancestor, associated and module options"""
+        handler = DiadefsHandler(Config())
+        df_h = DiaDefGenerator(Linker(PROJECT), handler)
+        cl_config = Config()
+        cl_config.classes = ['Specialization']
+        cl_h = DiaDefGenerator(Linker(PROJECT), DiadefsHandler(cl_config) )
+        self.assertEqual( (0, 0), df_h._get_levels())
+        self.assertEqual( False, df_h.module_names)
+        self.assertEqual( (-1, -1), cl_h._get_levels())
+        self.assertEqual( True, cl_h.module_names)
+        for hndl in [df_h, cl_h]:
+            hndl.config.all_ancestors = True
+            hndl.config.all_associated = True
+            hndl.config.module_names = True
+            hndl._set_default_options()
+            self.assertEqual( (-1, -1), hndl._get_levels())
+            self.assertEqual( True, hndl.module_names)
+        handler = DiadefsHandler( Config())
+        df_h = DiaDefGenerator(Linker(PROJECT), handler)
+        cl_config = Config()
+        cl_config.classes = ['Specialization']
+        cl_h = DiaDefGenerator(Linker(PROJECT), DiadefsHandler(cl_config) )
+        for hndl in [df_h, cl_h]:
+            hndl.config.show_ancestors = 2
+            hndl.config.show_associated = 1
+            hndl.config.module_names = False
+            hndl._set_default_options()
+            self.assertEqual( (2, 1), hndl._get_levels())
+            self.assertEqual( False, hndl.module_names)
+    #def test_default_values(self):
+        """test efault values for package or class diagrams"""
+        # TODO : should test difference between default values for package
+        # or class diagrams
+
+class DefaultDiadefGeneratorTC(unittest.TestCase):
+    def test_known_values1(self):
+        dd = DefaultDiadefGenerator(Linker(PROJECT), HANDLER).visit(PROJECT)
+        self.assertEqual(len(dd), 2)
+        keys = [d.TYPE for d in dd]
+        self.assertEqual(keys, ['package', 'class'])
+        pd = dd[0]
+        self.assertEqual(pd.title, 'packages No Name')
+        modules = sorted([(isinstance(m.node, astroid.Module), m.title)
+                         for m in pd.objects])
+        self.assertEqual(modules, [(True, 'data'),
+                                   (True, 'data.clientmodule_test'),
+                                   (True, 'data.suppliermodule_test')])
+        cd = dd[1]
+        self.assertEqual(cd.title, 'classes No Name')
+        classes = _process_classes(cd.objects)
+        self.assertEqual(classes, [(True, 'Ancestor'),
+                                   (True, 'DoNothing'),
+                                   (True, 'Interface'),
+                                   (True, 'Specialization')]
+                          )
+
+    _should_rels = [('association', 'DoNothing', 'Ancestor'),
+                    ('association', 'DoNothing', 'Specialization'),
+                    ('implements', 'Ancestor', 'Interface'),
+                    ('specialization', 'Specialization', 'Ancestor')]
+    def test_exctract_relations(self):
+        """test extract_relations between classes"""
+        cd = DefaultDiadefGenerator(Linker(PROJECT), HANDLER).visit(PROJECT)[1]
+        cd.extract_relationships()
+        relations = _process_relations(cd.relationships)
+        self.assertEqual(relations, self._should_rels)
+
+    def test_functional_relation_extraction(self):
+        """functional test of relations extraction;
+        different classes possibly in different modules"""
+        # XXX should be catching pyreverse environnement problem but doesn't
+        # pyreverse doesn't extracts the relations but this test ok
+        project = get_project('data')
+        handler = DiadefsHandler(Config())
+        diadefs = handler.get_diadefs(project, Linker(project, tag=True) )
+        cd = diadefs[1]
+        relations = _process_relations(cd.relationships)
+        self.assertEqual(relations, self._should_rels)
+
+    def test_known_values2(self):
+        project = get_project('data.clientmodule_test')
+        dd = DefaultDiadefGenerator(Linker(project), HANDLER).visit(project)
+        self.assertEqual(len(dd), 1)
+        keys = [d.TYPE for d in dd]
+        self.assertEqual(keys, ['class'])
+        cd = dd[0]
+        self.assertEqual(cd.title, 'classes No Name')
+        classes = _process_classes(cd.objects)
+        self.assertEqual(classes, [(True, 'Ancestor'),
+                                   (True, 'DoNothing'),
+                                   (True, 'Specialization')]
+                          )
+
+class ClassDiadefGeneratorTC(unittest.TestCase):
+    def test_known_values1(self):
+        HANDLER.config.classes = ['Specialization']
+        cdg = ClassDiadefGenerator(Linker(PROJECT), HANDLER)
+        special = 'data.clientmodule_test.Specialization'
+        cd = cdg.class_diagram(PROJECT, special)
+        self.assertEqual(cd.title, special)
+        classes = _process_classes(cd.objects)
+        self.assertEqual(classes, [(True, 'data.clientmodule_test.Ancestor'),
+                                   (True, special),
+                                   (True, 'data.suppliermodule_test.DoNothing'),
+                                  ])
+
+    def test_known_values2(self):
+        HANDLER.config.module_names = False
+        cd = ClassDiadefGenerator(Linker(PROJECT), HANDLER).class_diagram(PROJECT, 'data.clientmodule_test.Specialization')
+        self.assertEqual(cd.title, 'data.clientmodule_test.Specialization')
+        classes = _process_classes(cd.objects)
+        self.assertEqual(classes, [(True, 'Ancestor'),
+                                   (True, 'DoNothing'),
+                                   (True, 'Specialization')
+                                  ])
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_exceptions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_exceptions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_exceptions.py	(revision 1126)
@@ -0,0 +1,69 @@
+# Copyright (c) 2003-2015 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Tests for pylint.checkers.exceptions."""
+
+import sys
+import unittest
+
+from astroid import test_utils
+from pylint.checkers import exceptions
+from pylint.testutils import CheckerTestCase, Message
+
+
+class ExceptionsCheckerTest(CheckerTestCase):
+    """Tests for pylint.checkers.exceptions."""
+
+    CHECKER_CLASS = exceptions.ExceptionsChecker
+
+    # These tests aren't in the functional test suite,
+    # since they will be converted with 2to3 for Python 3
+    # and `raise (Error, ...)` will be converted to
+    # `raise Error(...)`, so it beats the purpose of the test.
+
+    @unittest.skipUnless(sys.version_info[0] == 3,
+                         "The test should emit an error on Python 3.")
+    def test_raising_bad_type_python3(self):
+        node = test_utils.extract_node('raise (ZeroDivisionError, None)  #@')
+        message = Message('raising-bad-type', node=node, args='tuple')
+        with self.assertAddsMessages(message):
+            self.checker.visit_raise(node)
+
+    @unittest.skipUnless(sys.version_info[0] == 2,
+                         "The test is valid only on Python 2.")
+    def test_raising_bad_type_python2(self):
+        nodes = test_utils.extract_node('''
+        raise (ZeroDivisionError, None)  #@
+        from something import something
+        raise (something, None) #@
+
+        raise (4, None) #@
+        raise () #@
+        ''')
+        with self.assertNoMessages():
+            self.checker.visit_raise(nodes[0])
+        with self.assertNoMessages():
+            self.checker.visit_raise(nodes[1])
+
+        message = Message('raising-bad-type', node=nodes[2], args='tuple')
+        with self.assertAddsMessages(message):
+            self.checker.visit_raise(nodes[2])
+        message = Message('raising-bad-type', node=nodes[3], args='tuple')
+        with self.assertAddsMessages(message):
+            self.checker.visit_raise(nodes[3])
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_reporting.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_reporting.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_reporting.py	(revision 1126)
@@ -0,0 +1,194 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+import os
+from os.path import join, dirname, abspath
+import unittest
+import warnings
+
+import six
+
+from pylint import __pkginfo__
+from pylint.lint import PyLinter
+from pylint import checkers
+from pylint.reporters import BaseReporter
+from pylint.reporters.text import TextReporter, ParseableTextReporter
+from pylint.reporters.html import HTMLReporter
+from pylint.reporters.ureports.nodes import Section
+
+
+HERE = abspath(dirname(__file__))
+INPUTDIR = join(HERE, 'input')
+
+class PyLinterTC(unittest.TestCase):
+
+    def setUp(self):
+        self.linter = PyLinter(reporter=TextReporter())
+        self.linter.disable('I')
+        self.linter.config.persistent = 0
+        # register checkers
+        checkers.initialize(self.linter)
+        os.environ.pop('PYLINTRC', None)
+
+    def test_add_message_is_deprecated(self):
+        if __pkginfo__.numversion >= (1, 6, 0):
+            with self.assertRaises(AttributeError):
+                BaseReporter().add_message
+
+        with warnings.catch_warnings(record=True) as cm:
+            warnings.simplefilter("always")
+            BaseReporter().add_message(None, None, None)
+        
+        self.assertEqual(len(cm), 1)
+        self.assertIsInstance(cm[0].message, DeprecationWarning)
+        msg = ('This method is deprecated, use handle_message '
+               'instead. It will be removed in Pylint 1.6.')
+        self.assertEqual(str(cm[0].message), msg)
+
+    def test_template_option(self):
+        output = six.StringIO()
+        self.linter.reporter.set_output(output)
+        self.linter.set_option('msg-template', '{msg_id}:{line:03d}')
+        self.linter.open()
+        self.linter.set_current_module('0123')
+        self.linter.add_message('C0301', line=1, args=(1, 2))
+        self.linter.add_message('line-too-long', line=2, args=(3, 4))
+        self.assertMultiLineEqual(output.getvalue(),
+                                  '************* Module 0123\n'
+                                  'C0301:001\n'
+                                  'C0301:002\n')
+
+    def test_parseable_output_deprecated(self):
+        with warnings.catch_warnings(record=True) as cm:
+            warnings.simplefilter("always")
+            ParseableTextReporter()
+        
+        self.assertEqual(len(cm), 1)
+        self.assertIsInstance(cm[0].message, DeprecationWarning)
+
+    def test_parseable_output_regression(self):
+        output = six.StringIO()
+        with warnings.catch_warnings(record=True):
+            linter = PyLinter(reporter=ParseableTextReporter())
+
+        checkers.initialize(linter)
+        linter.config.persistent = 0
+        linter.reporter.set_output(output)
+        linter.set_option('output-format', 'parseable')
+        linter.open()
+        linter.set_current_module('0123')
+        linter.add_message('line-too-long', line=1, args=(1, 2))
+        self.assertMultiLineEqual(output.getvalue(),
+                                  '************* Module 0123\n'
+                                  '0123:1: [C0301(line-too-long), ] '
+                                  'Line too long (1/2)\n')
+
+    def test_html_reporter_msg_template(self):
+        expected = '''
+<html>
+<body>
+<div>
+<div>
+<h2>Messages</h2>
+<table>
+<tr class="header">
+<th>category</th>
+<th>msg_id</th>
+</tr>
+<tr class="even">
+<td>warning</td>
+<td>W0332</td>
+</tr>
+</table>
+</div>
+</div>
+</body>
+</html>'''.strip().splitlines()
+        output = six.StringIO()
+        linter = PyLinter(reporter=HTMLReporter())
+        checkers.initialize(linter)
+        linter.config.persistent = 0
+        linter.reporter.set_output(output)
+        linter.set_option('msg-template', '{category}{msg_id}')
+        linter.open()
+        linter.set_current_module('0123')
+        linter.add_message('lowercase-l-suffix', line=1)
+        linter.reporter.display_messages(Section())
+        self.assertEqual(output.getvalue().splitlines(), expected)
+
+    @unittest.expectedFailure
+    def test_html_reporter_type(self):
+        # Integration test for issue #263
+        # https://bitbucket.org/logilab/pylint/issue/263/html-report-type-problems
+        expected = '''<html>
+<body>
+<div>
+<div>
+<h2>Messages</h2>
+<table>
+<tr class="header">
+<th>type</th>
+<th>module</th>
+<th>object</th>
+<th>line</th>
+<th>col_offset</th>
+<th>message</th>
+</tr>
+<tr class="even">
+<td>convention</td>
+<td>0123</td>
+<td>&#160;</td>
+<td>1</td>
+<td>0</td>
+<td>Exactly one space required before comparison
+a&lt; 5: print "zero"</td>
+</tr>
+</table>
+</div>
+</div>
+</body>
+</html>
+'''
+        output = six.StringIO()
+        linter = PyLinter(reporter=HTMLReporter())
+        checkers.initialize(linter)
+        linter.config.persistent = 0
+        linter.reporter.set_output(output)
+        linter.open()
+        linter.set_current_module('0123')
+        linter.add_message('bad-whitespace', line=1,
+                           args=('Exactly one', 'required', 'before',
+                                 'comparison', 'a< 5: print "zero"'))
+        linter.reporter.display_reports(Section())
+        self.assertMultiLineEqual(output.getvalue(), expected)
+
+    def test_display_results_is_renamed(self):
+        class CustomReporter(TextReporter):
+            def _display(self, layout):
+                return None
+
+        reporter = CustomReporter()
+        if __pkginfo__.numversion >= (2, 0):
+            with self.assertRaises(AttributeError):
+                reporter.display_results
+        else:
+            with warnings.catch_warnings(record=True) as cm:
+                warnings.simplefilter("always")
+                reporter.display_results(Section())
+
+            self.assertEqual(len(cm), 1)
+            self.assertIsInstance(cm[0].message, DeprecationWarning)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_inspector.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_inspector.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_inspector.py	(revision 1126)
@@ -0,0 +1,136 @@
+# Copyright (c) 2003-2015 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+"""
+ for the visitors.diadefs module
+"""
+import os
+import unittest
+
+import astroid
+from astroid import nodes
+from astroid import bases
+from astroid import manager
+from astroid import test_utils
+
+from pylint.pyreverse import inspector
+from unittest_pyreverse_writer import get_project
+
+MANAGER = manager.AstroidManager()
+
+def astroid_wrapper(func, modname):
+    return func(modname)
+
+
+class LinkerTest(unittest.TestCase):
+
+    def setUp(self):
+        super(LinkerTest, self).setUp()
+        self.project = get_project('data', 'data')
+        self.linker = inspector.Linker(self.project)
+        self.linker.visit(self.project)
+
+    def test_class_implements(self):
+        klass = self.project.get_module('data.clientmodule_test')['Ancestor']
+        self.assertTrue(hasattr(klass, 'implements'))
+        self.assertEqual(len(klass.implements), 1)
+        self.assertTrue(isinstance(klass.implements[0], nodes.ClassDef))
+        self.assertEqual(klass.implements[0].name, "Interface")
+        klass = self.project.get_module('data.clientmodule_test')['Specialization']
+        self.assertTrue(hasattr(klass, 'implements'))
+        self.assertEqual(len(klass.implements), 0)
+
+    def test_locals_assignment_resolution(self):
+        klass = self.project.get_module('data.clientmodule_test')['Specialization']
+        self.assertTrue(hasattr(klass, 'locals_type'))
+        type_dict = klass.locals_type
+        self.assertEqual(len(type_dict), 2)
+        keys = sorted(type_dict.keys())
+        self.assertEqual(keys, ['TYPE', 'top'])
+        self.assertEqual(len(type_dict['TYPE']), 1)
+        self.assertEqual(type_dict['TYPE'][0].value, 'final class')
+        self.assertEqual(len(type_dict['top']), 1)
+        self.assertEqual(type_dict['top'][0].value, 'class')
+
+    def test_instance_attrs_resolution(self):
+        klass = self.project.get_module('data.clientmodule_test')['Specialization']
+        self.assertTrue(hasattr(klass, 'instance_attrs_type'))
+        type_dict = klass.instance_attrs_type
+        self.assertEqual(len(type_dict), 2)
+        keys = sorted(type_dict.keys())
+        self.assertEqual(keys, ['_id', 'relation'])
+        self.assertTrue(isinstance(type_dict['relation'][0], bases.Instance),
+                        type_dict['relation'])
+        self.assertEqual(type_dict['relation'][0].name, 'DoNothing')
+        self.assertIs(type_dict['_id'][0], astroid.YES)
+
+    def test_concat_interfaces(self):
+        cls = test_utils.extract_node('''
+            class IMachin: pass
+
+            class Correct2:
+                """docstring"""
+                __implements__ = (IMachin,)
+
+            class BadArgument:
+                """docstring"""
+                __implements__ = (IMachin,)
+
+            class InterfaceCanNowBeFound: #@
+                """docstring"""
+                __implements__ = BadArgument.__implements__ + Correct2.__implements__
+        ''')
+        interfaces = inspector.interfaces(cls)
+        self.assertEqual([i.name for i in interfaces], ['IMachin'])
+
+    def test_interfaces(self):
+        module = astroid.parse('''
+        class Interface(object): pass
+        class MyIFace(Interface): pass
+        class AnotherIFace(Interface): pass
+        class Concrete0(object):
+            __implements__ = MyIFace
+        class Concrete1:                     
+            __implements__ = (MyIFace, AnotherIFace)
+        class Concrete2:
+            __implements__ = (MyIFace, AnotherIFace)
+        class Concrete23(Concrete1): pass
+        ''')
+
+        for klass, interfaces in (('Concrete0', ['MyIFace']),
+                                  ('Concrete1', ['MyIFace', 'AnotherIFace']),
+                                  ('Concrete2', ['MyIFace', 'AnotherIFace']),
+                                  ('Concrete23', ['MyIFace', 'AnotherIFace'])):
+            klass = module[klass]
+            self.assertEqual([i.name for i in inspector.interfaces(klass)],
+                             interfaces)
+
+
+    def test_from_directory(self):
+        expected = os.path.join('pylint', 'test', 'data', '__init__.py')
+        self.assertEqual(self.project.name, 'data')
+        self.assertTrue(self.project.path.endswith(expected), self.project.path)
+
+    def test_project_node(self):
+        expected = [
+            'data', 'data.clientmodule_test',
+            'data.suppliermodule_test',
+        ]
+        self.assertListEqual(sorted(self.project.keys()), expected)
+
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_logging.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_logging.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_logging.py	(revision 1126)
@@ -0,0 +1,47 @@
+# Copyright 2014 Google Inc. All Rights Reserved.
+"""Unittest for the logging checker."""
+import unittest
+from astroid import test_utils
+
+from pylint.checkers import logging
+
+from pylint.testutils import CheckerTestCase, Message, set_config
+
+
+class LoggingModuleDetectionTest(CheckerTestCase):
+    CHECKER_CLASS = logging.LoggingChecker
+    
+    def test_detects_standard_logging_module(self):
+        stmts = test_utils.extract_node("""
+        import logging #@
+        logging.warn('%s' % '%s')  #@
+        """)
+        self.checker.visit_module(None)
+        self.checker.visit_import(stmts[0])
+        with self.assertAddsMessages(Message('logging-not-lazy', node=stmts[1])):
+            self.checker.visit_call(stmts[1])
+
+    def test_detects_renamed_standard_logging_module(self):
+        stmts = test_utils.extract_node("""
+        import logging as blogging #@
+        blogging.warn('%s' % '%s')  #@
+        """)
+        self.checker.visit_module(None)
+        self.checker.visit_import(stmts[0])
+        with self.assertAddsMessages(Message('logging-not-lazy', node=stmts[1])):
+            self.checker.visit_call(stmts[1])
+
+    @set_config(logging_modules=['logging', 'my.logging'])
+    def test_nonstandard_logging_module(self):
+        stmts = test_utils.extract_node("""
+        from my import logging as blogging #@
+        blogging.warn('%s' % '%s')  #@
+        """)
+        self.checker.visit_module(None)
+        self.checker.visit_import(stmts[0])
+        with self.assertAddsMessages(Message('logging-not-lazy', node=stmts[1])):
+            self.checker.visit_call(stmts[1])
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.py	(revision 1126)
@@ -0,0 +1,12 @@
+# pylint: disable=missing-docstring,no-init,unused-argument,invalid-name,too-few-public-methods
+
+class A:
+    def __init__(self):
+        self.store = {}
+
+    def get(self, key, default=None):
+        return self.store.get(key, default)
+
+class B(A):
+    def get_memo(self, obj):
+        return super().get(obj)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/singleton_comparison.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/singleton_comparison.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/singleton_comparison.py	(revision 1126)
@@ -0,0 +1,11 @@
+# pylint: disable=missing-docstring, invalid-name, misplaced-comparison-constant
+x = 42
+a = x is None
+b = x == None  # [singleton-comparison]
+c = x == True  # [singleton-comparison]
+d = x == False  # [singleton-comparison]
+e = True == True  # [singleton-comparison]
+f = x is 1
+g = 123 is "123"
+h = None is x
+i = None == x  # [singleton-comparison]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=2.7
+max_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_context_manager.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_context_manager.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_context_manager.py	(revision 1126)
@@ -0,0 +1,135 @@
+"""Tests that onjects used in a with statement implement context manager protocol"""
+
+# pylint: disable=too-few-public-methods, invalid-name, import-error, missing-docstring
+# pylint: disable=no-init,wrong-import-position
+# Tests no messages for objects that implement the protocol
+class Manager(object):
+    def __enter__(self):
+        pass
+    def __exit__(self, type_, value, traceback):
+        pass
+with Manager():
+    pass
+
+class AnotherManager(Manager):
+    pass
+with AnotherManager():
+    pass
+
+
+# Tests message for class that doesn't implement the protocol
+class NotAManager(object):
+    pass
+with NotAManager():  #[not-context-manager]
+    pass
+
+# Tests contextlib.contextmanager usage is recognized as correct.
+from contextlib import contextmanager
+@contextmanager
+def dec():
+    yield
+with dec():  # valid use
+    pass
+
+
+# Tests a message is produced when a contextlib.contextmanager
+# decorated function is used without being called.
+with dec:  # [not-context-manager]
+    pass
+
+
+# Tests no messages about context manager protocol
+# if the type can't be inferred.
+from missing import Missing
+with Missing():
+    pass
+
+# Tests context managers as names.
+
+def penelopa():
+    return 42
+
+hopa = dec()
+tropa = penelopa()
+
+with tropa: # [not-context-manager]
+    pass
+
+with hopa:
+    pass
+
+
+# Tests that no messages are emitted for function calls
+# which return managers
+
+def wrapper():
+    return dec()
+
+with wrapper():
+    pass
+
+# Tests for properties returning managers.
+
+class Property(object):
+
+    @property
+    def ctx(self):
+        return dec()
+
+    @property
+    def not_ctx(self):
+        return 42
+
+
+lala = Property()
+with lala.ctx:
+    # Don't emit when the context manager is the
+    # result of accessing a property.
+    pass
+
+with lala.not_ctx: # [not-context-manager]
+    pass
+
+
+class TestKnownBases(Missing):
+    pass
+
+with TestKnownBases():
+    pass
+
+# Ignore mixins.
+class ManagerMixin(object):
+    def test(self):
+        with self:
+            pass
+
+class FullContextManager(ManagerMixin):
+    def __enter__(self):
+        return self
+    def __exit__(self, *args):
+        pass
+
+# Test a false positive with returning a generator
+# from a context manager.
+def generator():
+    yield 42
+
+@contextmanager
+def context_manager_returning_generator():
+    return generator()
+
+with context_manager_returning_generator():
+    pass
+
+FIRST = [context_manager_returning_generator()]
+with FIRST[0]:
+    pass
+
+def other_indirect_func():
+    return generator()
+
+def not_context_manager():
+    return other_indirect_func()
+
+with not_context_manager(): # [not-context-manager]
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/crash_missing_module_type.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/crash_missing_module_type.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/crash_missing_module_type.py	(revision 1126)
@@ -0,0 +1,18 @@
+""" Test for a crash found in
+https://bitbucket.org/logilab/astroid/issue/45/attributeerror-module-object-has-no#comment-11944673
+"""
+# pylint: disable=no-init, invalid-name, too-few-public-methods, redefined-outer-name
+def decor(trop):
+    """ decorator """
+    return trop
+
+class Foo(object):
+    """ Class """
+    @decor
+    def prop(self):
+        """ method """
+        return self
+
+if __name__ == '__main__':
+    trop = Foo()
+    trop.prop = 42
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/fixme.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/fixme.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/fixme.txt	(revision 1126)
@@ -0,0 +1,5 @@
+fixme:5::"FIXME: beep"
+fixme:11::"FIXME: Valid test"
+fixme:14::"TODO: Do something with the variables"
+fixme:16::"XXX: Fix this later"
+fixme:18::"FIXME: no space after hash"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context.py	(revision 1126)
@@ -0,0 +1,97 @@
+"""
+Checks that only valid values are used in a mapping context.
+"""
+# pylint: disable=missing-docstring,invalid-name,too-few-public-methods,no-self-use,import-error,wrong-import-position
+from __future__ import print_function
+
+
+def test(**kwargs):
+    print(kwargs)
+
+
+# dictionary value/comprehension
+dict_value = dict(a=1, b=2, c=3)
+dict_comp = {chr(x): x for x in range(256)}
+test(**dict_value)
+test(**dict_comp)
+
+
+# in order to be used in kwargs custom mapping class should define
+# __iter__(), __getitem__(key) and keys().
+class CustomMapping(object):
+    def __init__(self):
+        self.data = dict(a=1, b=2, c=3, d=4, e=5)
+
+    def __getitem__(self, key):
+        return self.data[key]
+
+    def keys(self):
+        return self.data.keys()
+
+test(**CustomMapping())
+test(**CustomMapping)  # [not-a-mapping]
+
+class NotMapping(object):
+    pass
+
+test(**NotMapping())  # [not-a-mapping]
+
+# skip checks if statement is inside mixin/base/abstract class
+class SomeMixin(object):
+    kwargs = None
+
+    def get_kwargs(self):
+        return self.kwargs
+
+    def run(self, **kwargs):
+        print(kwargs)
+
+    def dispatch(self):
+        kws = self.get_kwargs()
+        self.run(**kws)
+
+class AbstractThing(object):
+    kwargs = None
+
+    def get_kwargs(self):
+        return self.kwargs
+
+    def run(self, **kwargs):
+        print(kwargs)
+
+    def dispatch(self):
+        kws = self.get_kwargs()
+        self.run(**kws)
+
+class BaseThing(object):
+    kwargs = None
+
+    def get_kwargs(self):
+        return self.kwargs
+
+    def run(self, **kwargs):
+        print(kwargs)
+
+    def dispatch(self):
+        kws = self.get_kwargs()
+        self.run(**kws)
+
+# abstract class
+class Thing(object):
+    def get_kwargs(self):
+        raise NotImplementedError
+
+    def run(self, **kwargs):
+        print(kwargs)
+
+    def dispatch(self):
+        kwargs = self.get_kwargs()
+        self.run(**kwargs)
+
+# skip uninferable instances
+from some_missing_module import Mapping
+
+class MyClass(Mapping):
+    pass
+
+test(**MyClass())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unreachable.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unreachable.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unreachable.txt	(revision 1126)
@@ -0,0 +1,4 @@
+unreachable:7:func1:Unreachable code
+unreachable:12:func2:Unreachable code
+unreachable:18:func3:Unreachable code
+unreachable:22:func4:Unreachable code
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_arguments.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_arguments.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_arguments.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-arguments:3:stupid_function:Too many arguments (9/5)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/reimported.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/reimported.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/reimported.txt	(revision 1126)
@@ -0,0 +1,3 @@
+reimported:3::"Reimport 'sleep' (imported line 3)"
+reimported:4::"Reimport 'missing' (imported line 4)"
+reimported:7::"Reimport 'missing1' (imported line 6)"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confusing_with_statement.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confusing_with_statement.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confusing_with_statement.txt	(revision 1126)
@@ -0,0 +1 @@
+confusing-with-statement:26::Following "as" with another context manager looks like a tuple.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_whitespace.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_whitespace.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_whitespace.py	(revision 1126)
@@ -0,0 +1,3 @@
+# pylint: disable = invalid-name, missing-docstring, unused-variable, unused-argument
+def function(hello):
+    x, y, z = (1,2,3,) # [bad-whitespace, bad-whitespace, missing-final-newline]
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.txt	(revision 1126)
@@ -0,0 +1,14 @@
+bad-open-mode:4::"""rw"" is not a valid mode for open."
+bad-open-mode:5::"""rw"" is not a valid mode for open."
+bad-open-mode:6::"""rw"" is not a valid mode for open."
+bad-open-mode:9::"""Uw"" is not a valid mode for open."
+bad-open-mode:10::"""2"" is not a valid mode for open."
+bad-open-mode:13::"""Uwz"" is not a valid mode for open."
+bad-open-mode:14::"""br"" is not a valid mode for open."
+bad-open-mode:15::"""wU"" is not a valid mode for open."
+bad-open-mode:19::"""xb"" is not a valid mode for open."
+bad-open-mode:20::"""rx"" is not a valid mode for open."
+bad-open-mode:27::"""+rUb"" is not a valid mode for open."
+bad-open-mode:30::"""aU"" is not a valid mode for open."
+bad-open-mode:36::"""Ubr"" is not a valid mode for open."
+bad-open-mode:37::"""Ut"" is not a valid mode for open."
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.txt	(revision 1126)
@@ -0,0 +1,13 @@
+deprecated-method:15:MyTest.test:Using deprecated method assert_()
+deprecated-method:17::Using deprecated method getchildren()
+deprecated-method:18::Using deprecated method getiterator()
+deprecated-method:19::Using deprecated method doctype()
+deprecated-method:20::Using deprecated method xpath()
+deprecated-method:21::Using deprecated method getmoduleinfo()
+deprecated-method:22::Using deprecated method getmodulename()
+deprecated-method:23::Using deprecated method getargspec()
+deprecated-method:24::Using deprecated method warn()
+deprecated-method:25::Using deprecated method popen()
+deprecated-method:26::Using deprecated method encodestring()
+deprecated-method:27::Using deprecated method decodestring()
+deprecated-method:28::Using deprecated method escape()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.py	(revision 1126)
@@ -0,0 +1,65 @@
+"""Check that Python 3.5's async functions are properly analyzed by Pylint."""
+# pylint: disable=missing-docstring,invalid-name,too-few-public-methods
+# pylint: disable=using-constant-test
+
+async def next(): # [redefined-builtin]
+    pass
+
+async def some_function(arg1, arg2): # [unused-argument]
+    await arg1
+
+
+class OtherClass(object):
+
+    @staticmethod
+    def test():
+        return 42
+
+
+class Class(object):
+
+    async def some_method(self):
+        super(OtherClass, self).test() # [bad-super-call]
+
+
+# +1: [too-many-arguments,too-many-return-statements, too-many-branches]
+async def complex_function(this, function, has, more, arguments, than,
+                           one, _, should, have):
+    if 1:
+        return this
+    elif 1:
+        return function
+    elif 1:
+        return has
+    elif 1:
+        return more
+    elif 1:
+        return arguments
+    elif 1:
+        return than
+    try:
+        return one
+    finally:
+        pass
+    if 2:
+        return should
+    while True:
+        pass
+    if 1:
+        return have
+    elif 2:
+        return function
+    elif 3:
+        pass
+
+
+# +1: [duplicate-argument-name,dangerous-default-value]
+async def func(a, a, b=[]):
+    return a, b
+
+
+# +1: [empty-docstring, blacklisted-name]
+async def foo():
+    ""
+
+    
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/names_in__all__.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/names_in__all__.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/names_in__all__.txt	(revision 1126)
@@ -0,0 +1,6 @@
+undefined-all-variable:17::Undefined variable name '' in __all__
+undefined-variable:19::Undefined variable 'SomeUndefined'
+undefined-all-variable:20::Undefined variable name 'NonExistant' in __all__
+undefined-all-variable:22::Undefined variable name 'func' in __all__
+undefined-all-variable:23::Undefined variable name 'inner' in __all__
+undefined-all-variable:24::Undefined variable name 'InnerKlass' in __all__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_instance_attributes.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_instance_attributes.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_instance_attributes.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-instance-attributes:3:Aaaa:Too many instance attributes (21/7)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/eval_used.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/eval_used.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/eval_used.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""test for eval usage"""
+
+eval('os.listdir(".")') # [eval-used]
+eval('os.listdir(".")', globals={})  # [eval-used]
+
+eval('os.listdir(".")', globals=globals())  # [eval-used]
+
+def func():
+    """ eval in local scope"""
+    eval('b = 1')  # [eval-used]
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_except.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_except.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_except.txt	(revision 1126)
@@ -0,0 +1 @@
+duplicate-except:9:main:Catching previously caught exception type ValueError
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wildcard_import.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wildcard_import.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wildcard_import.txt	(revision 1126)
@@ -0,0 +1,2 @@
+wildcard-import:2::Wildcard import indirect1
+wildcard-import:5::Wildcard import unknown.package
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/slots_checks.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/slots_checks.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/slots_checks.txt	(revision 1126)
@@ -0,0 +1,4 @@
+invalid-slots:42:SecondBad:Invalid __slots__ object
+invalid-slots-object:46:ThirdBad:Invalid object '2' in __slots__, must contain only non empty strings
+invalid-slots:48:FourthBad:Invalid __slots__ object
+invalid-slots-object:52:FifthBad:"Invalid object ""''"" in __slots__, must contain only non empty strings"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_pass.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_pass.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_pass.txt	(revision 1126)
@@ -0,0 +1 @@
+unnecessary-pass:7::Unnecessary pass statement
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to_protected_members.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to_protected_members.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to_protected_members.txt	(revision 1126)
@@ -0,0 +1,5 @@
+protected-access:19:MyClass.test:Access to a protected member _haha of a client class
+protected-access:41::Access to a protected member _protected of a client class
+protected-access:42::Access to a protected member _protected of a client class
+protected-access:43::Access to a protected member _cls_protected of a client class
+protected-access:44::Access to a protected member _cls_protected of a client class
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_not_called.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_not_called.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_not_called.txt	(revision 1126)
@@ -0,0 +1,6 @@
+old-style-class:6:AAAA:Old-style class defined.
+old-style-class:12:BBBB:Old-style class defined.
+no-init:18:CCCC:Class has no __init__ method
+old-style-class:18:CCCC:Old-style class defined.
+super-init-not-called:25:ZZZZ.__init__:__init__ method from base class 'BBBB' is not called
+super-init-not-called:58:AssignedInit.__init__:__init__ method from base class 'NewStyleC' is not called
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonexistent_operator.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonexistent_operator.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonexistent_operator.txt	(revision 1126)
@@ -0,0 +1,6 @@
+nonexistent-operator:6::"Use of the non-existent ++ operator"
+nonexistent-operator:7::"Use of the non-existent ++ operator"
+nonexistent-operator:8::"Use of the non-existent ++ operator"
+nonexistent-operator:12::"Use of the non-existent -- operator"
+nonexistent-operator:14::"Use of the non-existent -- operator"
+nonexistent-operator:15::"Use of the non-existent -- operator"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_order.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_order.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_order.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""Checks import order rule"""
+# pylint: disable=unused-import,relative-import,ungrouped-imports,import-error
+try:
+    from six.moves import configparser
+except ImportError:
+    import configparser
+
+import six
+import os.path  # [wrong-import-order]
+from astroid import are_exclusive
+import sys  # [wrong-import-order]
+import datetime  # [wrong-import-order]
+import unused_import
+import totally_missing
+import astroid
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/cellvar_escaping_loop.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/cellvar_escaping_loop.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/cellvar_escaping_loop.txt	(revision 1126)
@@ -0,0 +1,8 @@
+unused-variable:20:good_case3:Unused variable 'i'
+undefined-loop-variable:44:good_case6.<lambda>:Using possibly undefined loop variable 'i'
+cell-var-from-loop:77:bad_case.<lambda>:Cell variable i defined in loop
+cell-var-from-loop:82:bad_case2.<lambda>:Cell variable i defined in loop
+cell-var-from-loop:90:bad_case3.<lambda>:Cell variable j defined in loop
+cell-var-from-loop:100:bad_case4.nested:Cell variable i defined in loop
+cell-var-from-loop:121:bad_case5.<lambda>:Cell variable i defined in loop
+cell-var-from-loop:129:bad_case6.<lambda>:Cell variable i defined in loop
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.txt	(revision 1126)
@@ -0,0 +1 @@
+not-a-mapping:19::Non-mapping value SomeClass() is used in a mapping context
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_locals.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_locals.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_locals.py	(revision 1126)
@@ -0,0 +1,60 @@
+# pylint: disable=missing-docstring
+from __future__ import print_function
+
+def function(arg1, arg2, arg3, arg4, arg5): # [too-many-locals]
+    arg6, arg7, arg8, arg9 = arg1, arg2, arg3, arg4
+    print(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
+    loc1, loc2, loc3, loc4, loc5, loc6, loc7 = arg1, arg2, arg3, arg4, arg5, \
+ arg6, arg7
+    print(loc1, loc2, loc3, loc4, loc5, loc6, loc7)
+
+
+def too_many_locals_function(): # [too-many-locals]
+    """pylint will complains about too many local variables"""
+    args0 = 0
+    args1 = args0 * 1
+    args2 = args1 * 2
+    args3 = args2 * 3
+    args4 = args3 * 4
+    args5 = args4 * 5
+    args6 = args5 * 6
+    args7 = args6 * 7
+    args8 = args7 * 8
+    args9 = args8 * 9
+    args10 = args9 * 10
+    args11 = args10 * 11
+    args12 = args11 * 12
+    args13 = args12 * 13
+    args14 = args13 * 14
+    args15 = args14 * 15
+    return args15
+
+def too_many_arguments_function(arga, argu, argi, arge, argt, args): # [too-many-arguments]
+    """pylint will complains about too many arguments."""
+    arga = argu
+    arga += argi
+    arga += arge
+    arga += argt
+    arga += args
+    return arga
+
+def ignored_arguments_function(arga, argu, argi,
+                               _arge=0, _argt=1, _args=None):
+    """pylint will ignore _arge, _argt, _args.
+
+    Consequently pylint will only coun 13 arguments.
+    """
+    arg0 = 0
+    arg1 = arg0 * 1 + arga
+    arg2 = arg1 * 2 + argu
+    arg3 = arg2 * 3 + argi
+    arg4 = arg3 * 4 + _arge
+    arg5 = arg4 * 5 + _argt
+    arg6 = arg5 * 6
+    arg7 = arg6 * 7
+    arg8 = arg7 * 8
+    arg9 = arg8 * 9
+    arg9 += arg0
+    if _args:
+        arg9 += sum(_args)
+    return arg9
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exception_is_binary_op.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exception_is_binary_op.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exception_is_binary_op.txt	(revision 1126)
@@ -0,0 +1,4 @@
+binary-op-exception:5::"Exception to catch is the result of a binary ""or"" operation"
+binary-op-exception:7::"Exception to catch is the result of a binary ""and"" operation"
+binary-op-exception:9::"Exception to catch is the result of a binary ""or"" operation"
+binary-op-exception:11::"Exception to catch is the result of a binary ""or"" operation"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_scope.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_scope.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_scope.txt	(revision 1126)
@@ -0,0 +1,4 @@
+used-before-assignment:11:Well.<lambda>:Using variable 'revattr' before assignment
+undefined-variable:13:Well.<lambda>:Undefined variable 'get_attr_bad'
+undefined-variable:19:Well.Sub:Undefined variable 'Data'
+undefined-variable:22:Well.func:Undefined variable 'Sub'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.txt	(revision 1126)
@@ -0,0 +1 @@
+syntax-error:1::"Unknown encoding: IBO-8859-1"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/attribute_defined_outside_init.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/attribute_defined_outside_init.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/attribute_defined_outside_init.txt	(revision 1126)
@@ -0,0 +1,2 @@
+attribute-defined-outside-init:16:A.set_z:Attribute 'z' defined outside __init__
+attribute-defined-outside-init:26:B.test:Attribute 'z' defined outside __init__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.txt	(revision 1126)
@@ -0,0 +1,2 @@
+yield-inside-async-function:11:bad_coro:Yield inside async function
+yield-inside-async-function:12:bad_coro:Yield inside async function
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.py	(revision 1126)
@@ -0,0 +1,29 @@
+"""Various tests for unpacking generalizations added in Python 3.5"""
+
+# pylint: disable=missing-docstring, invalid-name
+
+def func_variadic_args(*args):
+    return args
+
+
+def func_variadic_positional_args(a, b, *args):
+    return a, b, args
+
+def func_positional_args(a, b, c, d):
+    return a, b, c, d
+
+
+func_variadic_args(*(2, 3), *(3, 4), *(4, 5))
+func_variadic_args(1, 2, *(2, 3), 2, 3, *(4, 5))
+func_variadic_positional_args(1, 2, *(4, 5), *(5, 6))
+func_variadic_positional_args(*(2, 3), *(4, 5), *(5, 6))
+func_variadic_positional_args(*(2, 3))
+func_variadic_positional_args(*(2, 3, 4))
+func_variadic_positional_args(1, 2, 3, *(3, 4))
+
+func_positional_args(*(2, 3, 4), *(2, 3)) # [too-many-function-args]
+func_positional_args(*(1, 2), 3) # [no-value-for-parameter]
+func_positional_args(1, *(2, ), 3, *(4, 5)) # [too-many-function-args]
+func_positional_args(1, 2, c=24, d=32, **{'d': 32}) # [repeated-keyword]
+# +1: [repeated-keyword,repeated-keyword]
+func_positional_args(1, 2, c=24, **{'c': 34, 'd': 33}, **{'d': 24})
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_ancestors.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_ancestors.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_ancestors.txt	(revision 1126)
@@ -0,0 +1,2 @@
+too-many-ancestors:20:Iiii:Too many ancestors (9/7)
+too-many-ancestors:23:Jjjj:Too many ancestors (10/7)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.txt	(revision 1126)
@@ -0,0 +1 @@
+nonlocal-and-global:4:bad:"Name 'missing' is nonlocal and global"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_lambda.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_lambda.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_lambda.py	(revision 1126)
@@ -0,0 +1,51 @@
+# pylint: disable=undefined-variable
+"""test suspicious lambda expressions
+"""
+
+__revision__ = ''
+
+# Some simple examples of the most commonly encountered forms.
+# +1: [unnecessary-lambda]
+_ = lambda: list()  # replaceable with "list"
+# +1: [unnecessary-lambda]
+_ = lambda x: hash(x)  # replaceable with "hash"
+# +1: [unnecessary-lambda]
+_ = lambda x, y: min(x, y)  # replaceable with "min"
+
+# A function that can take any arguments given to it.
+_ANYARGS = lambda *args, **kwargs: 'completely arbitrary return value'
+
+# Some more complex forms of unnecessary lambda expressions.
+# +1: [unnecessary-lambda]
+_ = lambda *args: _ANYARGS(*args)
+# +1: [unnecessary-lambda]
+_ = lambda **kwargs: _ANYARGS(**kwargs)
+# +1: [unnecessary-lambda]
+_ = lambda *args, **kwargs: _ANYARGS(*args, **kwargs)
+# +1: [unnecessary-lambda]
+_ = lambda x, y, z, *args, **kwargs: _ANYARGS(x, y, z, *args, **kwargs)
+
+# Lambdas that are *not* unnecessary and should *not* trigger warnings.
+_ = lambda x: x
+_ = lambda x: x()
+_ = lambda x=4: hash(x)
+_ = lambda x, y: list(range(y, x))
+_ = lambda x: list(range(5, x))
+_ = lambda x, y: list(range(x, 5))
+_ = lambda x, y, z: x.y(z)
+_ = lambda: 5
+_ = lambda **kwargs: _ANYARGS()
+_ = lambda **kwargs: _ANYARGS(**dict([('three', 3)]))
+_ = lambda **kwargs: _ANYARGS(**{'three': 3})
+_ = lambda dict_arg, **kwargs: _ANYARGS(kwargs, **dict_arg)
+_ = lambda *args: _ANYARGS()
+_ = lambda *args: _ANYARGS(*list([3, 4]))
+_ = lambda *args: _ANYARGS(*[3, 4])
+_ = lambda list_arg, *args: _ANYARGS(args, *list_arg)
+_ = lambda: _ANYARGS(*[3])
+_ = lambda: _ANYARGS(**{'three': 3})
+_ = lambda: _ANYARGS(*[3], **{'three': 3})
+_ = lambda: _ANYARGS(func=42)
+
+# Don't warn about this.
+_ = lambda: code().analysis()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.py	(revision 1126)
@@ -0,0 +1,7 @@
+﻿# [syntax-error]
+# -*- coding: IBO-8859-1 -*-
+""" check correct unknown encoding declaration
+"""
+
+__revision__ = 'יייי'
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/attribute_defined_outside_init.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/attribute_defined_outside_init.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/attribute_defined_outside_init.py	(revision 1126)
@@ -0,0 +1,62 @@
+# pylint: disable=missing-docstring,too-few-public-methods,invalid-name
+
+class A(object):
+
+    def __init__(self):
+        self.x = 0
+        self.setUp()
+
+    def set_y(self, y):
+        self.y = y
+
+    def set_x(self, x):
+        self.x = x
+
+    def set_z(self, z):
+        self.z = z # [attribute-defined-outside-init]
+
+    def setUp(self):
+        self.x = 0
+        self.y = 0
+
+
+class B(A):
+
+    def test(self):
+        self.z = 44 # [attribute-defined-outside-init]
+
+
+class C(object):
+
+    def __init__(self):
+        self._init()
+
+    def _init(self):
+        self.z = 44
+
+
+class D(object):
+
+    def setUp(self):
+        self.set_z()
+
+    def set_z(self):
+        self.z = 42
+
+
+class E(object):
+
+    def __init__(self):
+        i = self._init
+        i()
+
+    def _init(self):
+        self.z = 44
+
+
+class Mixin(object):
+
+    def test_mixin(self):
+        """Don't emit attribute-defined-outside-init for mixin classes."""
+        if self.defined_already: # pylint: disable=access-member-before-definition
+            self.defined_already = None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use.py	(revision 1126)
@@ -0,0 +1,78 @@
+# pylint: disable=R0903,W0232,missing-docstring
+"""test detection of method which could be a function"""
+
+from __future__ import print_function
+
+class Toto(object):
+    """bla bal abl"""
+
+    def __init__(self):
+        self.aaa = 2
+
+    def regular_method(self):
+        """this method is a real method since it access to self"""
+        self.function_method()
+
+    def function_method(self): # [no-self-use]
+        """this method isn' a real method since it doesn't need self"""
+        print('hello')
+
+
+class Base(object):
+    """an abstract class"""
+
+    def __init__(self):
+        self.aaa = 2
+
+    def check(self, arg):
+        """an abstract method, could not be a function"""
+        raise NotImplementedError
+
+
+class Sub(Base):
+    """a concret class"""
+
+    def check(self, arg):
+        """a concret method, could not be a function since it need
+        polymorphism benefits
+        """
+        return arg == 0
+
+class Super(object):
+    """same as before without abstract"""
+    attr = 1
+    def method(self):
+        """regular"""
+        print(self.attr)
+
+class Sub1(Super):
+    """override method with need for self"""
+    def method(self):
+        """no i can not be a function"""
+        print(42)
+
+    def __len__(self):
+        """no i can not be a function"""
+        print(42)
+
+    def __cmp__(self, other):
+        """no i can not be a function"""
+        print(42)
+
+    def __copy__(self):
+        return 24
+
+    def __getstate__(self):
+        return 42
+
+
+class Prop(object):
+
+    @property
+    def count(self):
+        """Don't emit no-self-use for properties.
+
+        They can't be functions and they can be part of an
+        API specification.
+        """
+        return 42
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_dict_literal_key.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_dict_literal_key.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_dict_literal_key.py	(revision 1126)
@@ -0,0 +1,14 @@
+"""Check multiple key definition"""
+# pylint: disable=C0103
+
+correct_dict = {
+    'tea': 'for two',
+    'two': 'for tea',
+}
+
+wrong_dict = {  # [duplicate-key]
+    'tea': 'for two',
+    'two': 'for tea',
+    'tea': 'time',
+
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inherit_non_class.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inherit_non_class.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inherit_non_class.py	(revision 1126)
@@ -0,0 +1,81 @@
+"""Test that inheriting from something which is not
+a class emits a warning. """
+
+# pylint: disable=no-init, import-error, invalid-name, using-constant-test
+# pylint: disable=missing-docstring, too-few-public-methods, no-absolute-import
+
+from missing import Missing
+
+if 1:
+    Ambiguous = None
+else:
+    Ambiguous = int
+
+class Empty(object):
+    """ Empty class. """
+
+def return_class():
+    """ Return a class. """
+    return Good3
+
+class Bad(1): # [inherit-non-class]
+    """ Can't inherit from instance. """
+
+class Bad1(lambda abc: 42): # [inherit-non-class]
+    """ Can't inherit from lambda. """
+
+class Bad2(object()): # [inherit-non-class]
+    """ Can't inherit from an instance of object. """
+
+class Bad3(return_class): # [inherit-non-class]
+    """ Can't inherit from function. """
+
+class Bad4(Empty()): # [inherit-non-class]
+    """ Can't inherit from instance. """
+
+class Good(object):
+    pass
+
+class Good1(int):
+    pass
+
+class Good2(type):
+    pass
+
+class Good3(type(int)):
+    pass
+
+class Good4(return_class()):
+    pass
+
+class Good5(Good4, int, object):
+    pass
+
+class Good6(Ambiguous):
+    """ Inherits from something ambiguous.
+
+    This could emit a warning when we will have
+    flow detection.
+    """
+
+class Unknown(Missing):
+    pass
+
+class Unknown1(Good5 if True else Bad1):
+    pass
+
+
+class NotInheritableBool(bool): # [inherit-non-class]
+    pass
+
+
+class NotInheritableRange(range): # [inherit-non-class]
+    pass
+
+
+class NotInheritableSlice(slice): # [inherit-non-class]
+    pass
+
+
+class NotInheritableMemoryView(memoryview): # [inherit-non-class]
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+max_pyver=2.7
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/non_iterator_returned.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/non_iterator_returned.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/non_iterator_returned.txt	(revision 1126)
@@ -0,0 +1,4 @@
+non-iterator-returned:76:FirstBadIterator.__iter__:__iter__ returns non-iterator
+non-iterator-returned:82:SecondBadIterator.__iter__:__iter__ returns non-iterator
+non-iterator-returned:88:ThirdBadIterator.__iter__:__iter__ returns non-iterator
+non-iterator-returned:94:FourthBadIterator.__iter__:__iter__ returns non-iterator
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_argument_name.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_argument_name.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_argument_name.txt	(revision 1126)
@@ -0,0 +1,3 @@
+duplicate-argument-name:4:foo1:Duplicate argument name _ in function definition
+duplicate-argument-name:7:foo2:Duplicate argument name _ in function definition
+duplicate-argument-name:10:foo3:Duplicate argument name _ in function definition
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.txt	(revision 1126)
@@ -0,0 +1 @@
+bad-inline-option:3::Unable to consider inline option 'errors-only'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.py	(revision 1126)
@@ -0,0 +1,18 @@
+""" Tests for old style classes. """
+# pylint: disable=no-init, too-few-public-methods, invalid-name, metaclass-assignment
+
+class Old: # [old-style-class]
+    """ old style class """
+
+class Child(Old):
+    """ Old style class, but don't emit for it. """
+
+class NotOldStyle2:
+    """ Because I have a metaclass at class level. """
+    __metaclass__ = type
+
+# pylint: disable=redefined-builtin
+__metaclass__ = type
+
+class NotOldStyle:
+    """ Because I have a metaclass at global level. """
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_classmethod_decorator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_classmethod_decorator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_classmethod_decorator.py	(revision 1126)
@@ -0,0 +1,35 @@
+"""Checks class methods are declared with a decorator if within the class
+scope and if classmethod's argument is a member of the class
+"""
+
+# pylint: disable=too-few-public-methods, using-constant-test, no-self-argument
+
+class MyClass(object):
+    """Some class"""
+    def __init__(self):
+        pass
+
+    def cmethod(cls):
+        """class method-to-be"""
+    cmethod = classmethod(cmethod)  # [no-classmethod-decorator]
+
+    if True:
+        cmethod = classmethod(cmethod)  # [no-classmethod-decorator]
+
+    @classmethod
+    def my_second_method(cls):
+        """correct class method definition"""
+
+    def other_method(cls):
+        """some method"""
+    cmethod2 = classmethod(other_method)  # [no-classmethod-decorator]
+
+def helloworld():
+    """says hello"""
+
+
+MyClass.new_class_method = classmethod(helloworld)
+
+class MyOtherClass(object):
+    """Some other class"""
+    _make = classmethod(tuple.__new__)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""
+Test PEP 0448 -- Additional Unpacking Generalizations
+https://www.python.org/dev/peps/pep-0448/
+"""
+
+# pylint: disable=superfluous-parens
+
+UNPACK_TUPLE = (*range(4), 4)
+UNPACK_LIST = [*range(4), 4]
+UNPACK_SET = {*range(4), 4}
+UNPACK_DICT = {'a': 1, **{'b': '2'}}
+UNPACK_DICT2 = {**UNPACK_DICT, "x": 1, "y": 2}
+UNPACK_DICT3 = {**{'a': 1}, 'a': 2, **{'a': 3}}
+
+UNPACK_IN_COMP = {elem for elem in (*range(10))} # [star-needs-assignment-target]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_order.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_order.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_order.txt	(revision 1126)
@@ -0,0 +1,3 @@
+wrong-import-order:9::standard import "import os.path" comes before "from six.moves import configparser"
+wrong-import-order:11::standard import "import sys" comes before "from six.moves import configparser"
+wrong-import-order:12::standard import "import datetime" comes before "from six.moves import configparser"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_instance_attributes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_instance_attributes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_instance_attributes.py	(revision 1126)
@@ -0,0 +1,26 @@
+# pylint: disable=missing-docstring, too-few-public-methods
+
+class Aaaa(object): # [too-many-instance-attributes]
+
+    def __init__(self):
+        self.aaaa = 1
+        self.bbbb = 2
+        self.cccc = 3
+        self.dddd = 4
+        self.eeee = 5
+        self.ffff = 6
+        self.gggg = 7
+        self.hhhh = 8
+        self.iiii = 9
+        self.jjjj = 10
+        self._aaaa = 1
+        self._bbbb = 2
+        self._cccc = 3
+        self._dddd = 4
+        self._eeee = 5
+        self._ffff = 6
+        self._gggg = 7
+        self._hhhh = 8
+        self._iiii = 9
+        self._jjjj = 10
+        self.tomuch = None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.txt	(revision 1126)
@@ -0,0 +1 @@
+syntax-error:1::"mismatched input '\n\n\n\n' expecting LPAREN"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.5
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.txt	(revision 1126)
@@ -0,0 +1,5 @@
+not-async-context-manager:51:bad_coro:Async context manager 'int' doesn't implement __aenter__ and __aexit__.
+not-async-context-manager:53:bad_coro:Async context manager 'generator' doesn't implement __aenter__ and __aexit__.
+not-async-context-manager:55:bad_coro:Async context manager 'ContextManager' doesn't implement __aenter__ and __aexit__.
+not-async-context-manager:57:bad_coro:Async context manager 'PartialAsyncContextManager' doesn't implement __aenter__ and __aexit__.
+not-async-context-manager:59:bad_coro:Async context manager 'SecondPartialAsyncContextManager' doesn't implement __aenter__ and __aexit__.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/using_constant_test.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/using_constant_test.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/using_constant_test.txt	(revision 1126)
@@ -0,0 +1,22 @@
+using-constant-test:21::Using a conditional statement with a constant value
+using-constant-test:25::Using a conditional statement with a constant value
+using-constant-test:28::Using a conditional statement with a constant value
+using-constant-test:31::Using a conditional statement with a constant value
+using-constant-test:34::Using a conditional statement with a constant value
+using-constant-test:37::Using a conditional statement with a constant value
+using-constant-test:40::Using a conditional statement with a constant value
+using-constant-test:43::Using a conditional statement with a constant value
+using-constant-test:46::Using a conditional statement with a constant value
+using-constant-test:49::Using a conditional statement with a constant value
+using-constant-test:52::Using a conditional statement with a constant value
+using-constant-test:55::Using a conditional statement with a constant value
+using-constant-test:58::Using a conditional statement with a constant value
+using-constant-test:61::Using a conditional statement with a constant value
+using-constant-test:66::Using a conditional statement with a constant value
+using-constant-test:69::Using a conditional statement with a constant value
+using-constant-test:73:test_comprehensions:Using a conditional statement with a constant value
+using-constant-test:74:test_comprehensions:Using a conditional statement with a constant value
+using-constant-test:75:test_comprehensions:Using a conditional statement with a constant value
+using-constant-test:76:test_comprehensions:Using a conditional statement with a constant value
+using-constant-test:77:test_comprehensions:Using a conditional statement with a constant value
+using-constant-test:78:test_comprehensions:Using a conditional statement with a constant value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_staticmethod_decorator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_staticmethod_decorator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_staticmethod_decorator.py	(revision 1126)
@@ -0,0 +1,35 @@
+"""Checks static methods are declared with a decorator if within the class
+scope and if static method's argument is a member of the class
+"""
+
+# pylint: disable=too-few-public-methods, using-constant-test, no-method-argument
+
+class MyClass(object):
+    """Some class"""
+    def __init__(self):
+        pass
+
+    def smethod():
+        """static method-to-be"""
+    smethod = staticmethod(smethod) # [no-staticmethod-decorator]
+
+    if True:
+        smethod = staticmethod(smethod)  # [no-staticmethod-decorator]
+
+    @staticmethod
+    def my_second_method():
+        """correct static method definition"""
+
+    def other_method():
+        """some method"""
+    smethod2 = staticmethod(other_method)  # [no-staticmethod-decorator]
+
+def helloworld():
+    """says hello"""
+
+
+MyClass.new_static_method = staticmethod(helloworld)
+
+class MyOtherClass(object):
+    """Some other class"""
+    _make = staticmethod(tuple.__new__)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use.txt	(revision 1126)
@@ -0,0 +1 @@
+no-self-use:16:Toto.function_method:Method could be a function
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_dict_literal_key.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_dict_literal_key.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_dict_literal_key.txt	(revision 1126)
@@ -0,0 +1 @@
+duplicate-key:9::Duplicate key 'tea' in dictionary
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inherit_non_class.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inherit_non_class.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inherit_non_class.txt	(revision 1126)
@@ -0,0 +1,9 @@
+inherit-non-class:21:Bad:Inheriting '1', which is not a class.
+inherit-non-class:24:Bad1:"Inheriting 'lambda abc: 42', which is not a class."
+inherit-non-class:27:Bad2:Inheriting 'object()', which is not a class.
+inherit-non-class:30:Bad3:Inheriting 'return_class', which is not a class.
+inherit-non-class:33:Bad4:Inheriting 'Empty()', which is not a class.
+inherit-non-class:68:NotInheritableBool:Inheriting 'bool', which is not a class.
+inherit-non-class:72:NotInheritableRange:Inheriting 'range', which is not a class.
+inherit-non-class:76:NotInheritableSlice:Inheriting 'slice', which is not a class.
+inherit-non-class:80:NotInheritableMemoryView:Inheriting 'memoryview', which is not a class.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_whitespace.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_whitespace.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_whitespace.txt	(revision 1126)
@@ -0,0 +1,7 @@
+bad-whitespace:3::"Exactly one space required after comma
+    x, y, z = (1,2,3,) # [bad-whitespace, bad-whitespace, missing-final-newline]
+                  ^"
+bad-whitespace:3::"Exactly one space required after comma
+    x, y, z = (1,2,3,) # [bad-whitespace, bad-whitespace, missing-final-newline]
+                ^"
+missing-final-newline:3::"Final newline missing"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments.txt	(revision 1126)
@@ -0,0 +1,26 @@
+no-value-for-parameter:46::No value for argument 'first_argument' in function call
+too-many-function-args:47::Too many positional arguments for function call
+no-value-for-parameter:49::No value for argument 'third_argument' in function call
+no-value-for-parameter:51::No value for argument 'first_argument' in function call
+no-value-for-parameter:51::No value for argument 'second_argument' in function call
+no-value-for-parameter:51::No value for argument 'third_argument' in function call
+too-many-function-args:53::Too many positional arguments for function call
+no-value-for-parameter:58::No value for argument 'first_argument' in function call
+unexpected-keyword-arg:58::Unexpected keyword argument 'bob' in function call
+unexpected-keyword-arg:59::Unexpected keyword argument 'coin' in function call
+redundant-keyword-arg:61::Argument 'one' passed by position and keyword in function call
+no-value-for-parameter:66::No value for argument 'arg' in lambda call
+no-value-for-parameter:71:method_tests:No value for argument 'arg' in staticmethod call
+no-value-for-parameter:72:method_tests:No value for argument 'arg' in staticmethod call
+no-value-for-parameter:74:method_tests:No value for argument 'arg' in classmethod call
+no-value-for-parameter:75:method_tests:No value for argument 'arg' in classmethod call
+no-value-for-parameter:77:method_tests:No value for argument 'arg' in method call
+no-value-for-parameter:78:method_tests:No value for argument 'arg' in unbound method call
+no-value-for-parameter:80:method_tests:No value for argument 'arg' in method call
+no-value-for-parameter:81:method_tests:No value for argument 'arg' in unbound method call
+no-value-for-parameter:110:TestStaticMethod.func:No value for argument 'first' in staticmethod call
+too-many-function-args:111:TestStaticMethod.func:Too many positional arguments for staticmethod call
+unexpected-keyword-arg:122:TypeCheckConstructor.test:Unexpected keyword argument 'lala' in constructor call
+no-value-for-parameter:133:Test.test:No value for argument 'icon' in function call
+too-many-function-args:134:Test.test:Too many positional arguments for function call
+no-value-for-parameter:136::No value for argument 'icon' in function call
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_sequence_index.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_sequence_index.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_sequence_index.txt	(revision 1126)
@@ -0,0 +1,20 @@
+invalid-sequence-index:13:function1:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:17:function2:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:21:function3:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:25:function4:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:33:function5:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:37:function6:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:41:function7:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:48:function8:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:128:function19:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:133:function20:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:144:function21:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:145:function21:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:159:function22:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:160:function22:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:162:function22:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:178:function23:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:180:function23:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:196:function24:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:198:function24:Sequence index is not an int, slice, or instance with __index__
+invalid-sequence-index:208:function25:Sequence index is not an int, slice, or instance with __index__
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.txt	(revision 1126)
@@ -0,0 +1,6 @@
+bad-open-mode:11::"""rwx"" is not a valid mode for open."
+bad-open-mode:12::"""rr"" is not a valid mode for open."
+bad-open-mode:13::"""+"" is not a valid mode for open."
+bad-open-mode:14::"""xw"" is not a valid mode for open."
+bad-open-mode:20::"""Ua"" is not a valid mode for open."
+bad-open-mode:21::"""Ur++"" is not a valid mode for open."
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.txt	(revision 1126)
@@ -0,0 +1,2 @@
+deprecated-module:4::Uses of a deprecated module 'uninstalled'
+deprecated-module:5::Uses of a deprecated module 'uninstalled'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_enum_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_enum_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_enum_crash.py	(revision 1126)
@@ -0,0 +1,11 @@
+# pylint: disable=C0121
+"""http://www.logilab.org/ticket/124337"""
+
+import gtk
+
+def print_some_constant(arg=gtk.BUTTONS_OK):
+    """crash because gtk.BUTTONS_OK, a gtk enum type, is returned by
+    astroid as a constant
+    """
+    print arg
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.txt	(revision 1126)
@@ -0,0 +1,21 @@
+unsupported-binary-operation:9::"unsupported operand type(s) for +: 'int' and 'str'"
+unsupported-binary-operation:10::"unsupported operand type(s) for -: 'int' and 'list'"
+unsupported-binary-operation:11::"unsupported operand type(s) for *: 'int' and 'dict'"
+unsupported-binary-operation:12::"unsupported operand type(s) for /: 'int' and 'module'"
+unsupported-binary-operation:13::"unsupported operand type(s) for **: 'int' and 'function'"
+unsupported-binary-operation:14::"unsupported operand type(s) for *: 'dict' and 'dict'"
+unsupported-binary-operation:15::"unsupported operand type(s) for -: 'dict' and 'dict'"
+unsupported-binary-operation:16::"unsupported operand type(s) for |: 'dict' and 'dict'"
+unsupported-binary-operation:17::"unsupported operand type(s) for >>: 'dict' and 'dict'"
+unsupported-binary-operation:18::"unsupported operand type(s) for +: 'list' and 'tuple'"
+unsupported-binary-operation:19::"unsupported operand type(s) for +: 'tuple' and 'list'"
+unsupported-binary-operation:20::"unsupported operand type(s) for *: 'list' and 'float'"
+unsupported-binary-operation:21::"unsupported operand type(s) for *: 'tuple' and 'float'"
+unsupported-binary-operation:22::"unsupported operand type(s) for >>: 'float' and 'float'"
+unsupported-binary-operation:27::"unsupported operand type(s) for +: 'A' and 'B'"
+unsupported-binary-operation:32::"unsupported operand type(s) for +: 'A1' and 'A1'"
+unsupported-binary-operation:40::"unsupported operand type(s) for +: 'A2' and 'B2'"
+unsupported-binary-operation:47::"unsupported operand type(s) for +: 'Child' and 'Parent'"
+unsupported-binary-operation:54::"unsupported operand type(s) for +: 'A3' and 'B3'"
+unsupported-binary-operation:57::"unsupported operand type(s) for +=: 'int' and 'A'"
+unsupported-binary-operation:59::"unsupported operand type(s) for +=: 'int' and 'list'"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_import.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_import.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_import.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""a docstring"""
+
+from __future__ import generators
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/uninferable_all_object.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/uninferable_all_object.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/uninferable_all_object.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""Test that non-inferable __all__ variables do not make Pylint crash."""
+
+__all__ = sorted([
+    'Dummy',
+    'NonExistant',
+    'path',
+    'func',
+    'inner',
+    'InnerKlass'])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.5
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_locals.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_locals.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_locals.txt	(revision 1126)
@@ -0,0 +1,3 @@
+too-many-locals:4:function:Too many local variables (16/15)
+too-many-locals:12:too_many_locals_function:Too many local variables (16/15)
+too-many-arguments:32:too_many_arguments_function:Too many arguments (6/5)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/globals.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/globals.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/globals.txt	(revision 1126)
@@ -0,0 +1,6 @@
+global-at-module-level:4::Using the global statement at the module level
+undefined-variable:5::Undefined variable 'CSTE'
+global-statement:11:fix_contant:Using the global statement
+global-variable-not-assigned:18:other:Using global for 'HOP' but no assignment is done
+undefined-variable:19:other:Undefined variable 'HOP'
+global-variable-undefined:24:define_constant:Global variable 'SOMEVAR' undefined at the module level
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_jython.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+except_implementations=PyPy,CPython,IronPython
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.py	(revision 1126)
@@ -0,0 +1,35 @@
+""" Functional tests for method deprecation. """
+# pylint: disable=missing-docstring, super-init-not-called, not-callable
+import base64
+import cgi
+import inspect
+import logging
+import nntplib
+import platform
+import unittest
+import xml.etree.ElementTree
+
+
+class MyTest(unittest.TestCase):
+    def test(self):
+        self.assert_(True)  # [deprecated-method]
+
+xml.etree.ElementTree.Element('tag').getchildren()  # [deprecated-method]
+xml.etree.ElementTree.Element('tag').getiterator()  # [deprecated-method]
+xml.etree.ElementTree.XMLParser('tag', None, None).doctype(None, None, None)  # [deprecated-method]
+nntplib.NNTP(None).xpath(None) # [deprecated-method]
+inspect.getmoduleinfo(inspect) # [deprecated-method]
+inspect.getmodulename(inspect) # [deprecated-method]
+inspect.getargspec(None) # [deprecated-method]
+logging.warn("a") # [deprecated-method]
+platform.popen([]) # [deprecated-method]
+base64.encodestring("42") # [deprecated-method]
+base64.decodestring("42") # [deprecated-method]
+cgi.escape("a") # [deprecated-method]
+
+
+class SuperCrash(unittest.TestCase):
+
+    def __init__(self):
+        # should not crash.
+        super(SuperCrash, self)()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.txt	(revision 1126)
@@ -0,0 +1,14 @@
+dangerous-default-value:6:function1:Dangerous default value [] as argument
+dangerous-default-value:10:function2:Dangerous default value HEHE (__builtin__.dict) as argument
+dangerous-default-value:18:function4:Dangerous default value set() (__builtin__.set) as argument
+dangerous-default-value:28:function6:Dangerous default value GLOBAL_SET (__builtin__.set) as argument
+dangerous-default-value:32:function7:Dangerous default value dict() (__builtin__.dict) as argument
+dangerous-default-value:36:function8:Dangerous default value list() (__builtin__.list) as argument
+dangerous-default-value:40:function9:Dangerous default value [] as argument
+dangerous-default-value:44:function10:Dangerous default value {} as argument
+dangerous-default-value:48:function11:Dangerous default value list() (__builtin__.list) as argument
+dangerous-default-value:52:function12:Dangerous default value dict() (__builtin__.dict) as argument
+dangerous-default-value:61:function13:Dangerous default value OINK (__builtin__.dict) as argument
+dangerous-default-value:65:function14:Dangerous default value dict() (__builtin__.dict) as argument
+dangerous-default-value:73:function15:Dangerous default value INVALID_DICT (__builtin__.dict) as argument
+dangerous-default-value:77:function16:Dangerous default value set() as argument
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/names_in__all__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/names_in__all__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/names_in__all__.py	(revision 1126)
@@ -0,0 +1,49 @@
+# pylint: disable=too-few-public-methods,no-self-use, no-absolute-import,import-error
+"""Test Pylint's use of __all__.
+
+* NonExistant is not defined in this module, and it is listed in
+  __all__. An error is expected.
+
+* This module imports path and republished it in __all__. No errors
+  are expected.
+"""
+from __future__ import print_function
+from os import path
+from collections import deque
+from missing import Missing
+
+__all__ = [
+    'Dummy',
+    '', # [undefined-all-variable]
+    Missing,
+    SomeUndefined, # [undefined-variable]
+    'NonExistant',  # [undefined-all-variable]
+    'path',
+    'func',  # [undefined-all-variable]
+    'inner',  # [undefined-all-variable]
+    'InnerKlass', deque.__name__]  # [undefined-all-variable]
+
+
+class Dummy(object):
+    """A class defined in this module."""
+    pass
+
+DUMMY = Dummy()
+
+def function():
+    """Function docstring
+    """
+    pass
+
+function()
+
+class Klass(object):
+    """A klass which contains a function"""
+    def func(self):
+        """A klass method"""
+        inner = None
+        print(inner)
+
+    class InnerKlass(object):
+        """A inner klass"""
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_used_before_assign.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_used_before_assign.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_used_before_assign.py	(revision 1126)
@@ -0,0 +1,11 @@
+'''
+Regression test for
+https://bitbucket.org/logilab/pylint/issue/128/attributeerror-when-parsing
+'''
+from __future__ import with_statement
+
+def do_nothing():
+    """ empty """
+    with open("") as ctx.obj:  # [undefined-variable]
+        context.do()  # [used-before-assignment]
+        context = None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.py	(revision 1126)
@@ -0,0 +1,78 @@
+"""Test warnings about access to undefined variables
+for various Python 3 constructs. """
+# pylint: disable=too-few-public-methods, no-init, no-self-use
+# pylint: disable=wrong-import-position
+class Undefined:
+    """ test various annotation problems. """
+
+    def test(self)->Undefined: # [undefined-variable]
+        """ used Undefined, which is Undefined in this scope. """
+
+    Undefined = True
+
+    def test1(self)->Undefined:
+        """ This Undefined exists at local scope. """
+
+    def test2(self):
+        """ This should not emit. """
+        def func()->Undefined:
+            """ empty """
+            return
+        return func
+
+
+class Undefined1:
+    """ Other annotation problems. """
+
+    Undef = 42
+    ABC = 42
+
+    class InnerScope:
+        """ Test inner scope definition. """
+
+        def test_undefined(self)->Undef: # [undefined-variable]
+            """ Looking at a higher scope is impossible. """
+
+        def test1(self)->ABC: # [undefined-variable]
+            """ Triggers undefined-variable. """
+
+
+class FalsePositive342(object):
+    # pylint: disable=line-too-long
+    """ Fix some false positives found in
+    https://bitbucket.org/logilab/pylint/issue/342/spurious-undefined-variable-for-class
+    """
+
+    top = 42
+
+    def test_good(self, bac: top):
+        """ top is defined at this moment. """
+
+    def test_bad(self, bac: trop): # [undefined-variable]
+        """ trop is undefined at this moment. """
+
+    def test_bad1(self, *args: trop1): # [undefined-variable]
+        """ trop1 is undefined at this moment. """
+
+    def test_bad2(self, **bac: trop2): # [undefined-variable]
+        """ trop2 is undefined at this moment. """
+
+from abc import ABCMeta
+
+class Bad(metaclass=ABCMet): # [undefined-variable]
+    """ Notice the typo """
+
+class SecondBad(metaclass=ab.ABCMeta): # [undefined-variable]
+    """ Notice the `ab` module. """
+
+class Good(metaclass=int):
+    """ int is not a proper metaclass, but it is defined. """
+
+class SecondGood(metaclass=Good):
+    """ empty """
+
+class ThirdGood(metaclass=ABCMeta):
+    """ empty """
+
+class FourthGood(ThirdGood):
+    """ This should not trigger anything. """
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_branches.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_branches.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_branches.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-branches:3:wrong:Too many branches (13/12)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.5
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_failed_inference.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_failed_inference.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_failed_inference.py	(revision 1126)
@@ -0,0 +1,4 @@
+""" Testing string format with a failed inference. This should not crash. """
+
+import collections
+"{dict[0]}".format(dict=collections.defaultdict(int))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_boolean_expressions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_boolean_expressions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_boolean_expressions.py	(revision 1126)
@@ -0,0 +1,20 @@
+"""Checks for if statements containing too many boolean expressions"""
+
+# pylint: disable=invalid-name
+
+x = y = z = 5
+if x > -5 and x < 5 and y > -5 and y < 5 and z > -5 and z < 5:  # [too-many-boolean-expressions]
+    pass
+elif True and False and 1 and 2 and 3:
+    pass
+elif True and False and 1 and 2 and 3 and 4 and 5: # [too-many-boolean-expressions]
+    pass
+elif True and (True and True) and (x == 5 or True or True): # [too-many-boolean-expressions]
+    pass
+elif True and (True or (x > -5 and x < 5 and (z > -5 or z < 5))): # [too-many-boolean-expressions]
+    pass
+elif True == True == True == True == True == True:
+    pass
+
+if True and False and 1 and 2 and 3:
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.py	(revision 1126)
@@ -0,0 +1,18 @@
+"""
+Checks that iterable metaclasses are recognized by pylint.
+"""
+# pylint: disable=missing-docstring,too-few-public-methods,no-init,no-self-use,unused-argument,bad-mcs-method-argument
+
+# metaclasses as iterables
+class Meta(type):
+    def __iter__(self):
+        return iter((1, 2, 3))
+
+class SomeClass(metaclass=Meta):
+    pass
+
+
+for i in SomeClass:
+    print(i)
+for i in SomeClass():  # [not-an-iterable]
+    print(i)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_in_init.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_in_init.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_in_init.py	(revision 1126)
@@ -0,0 +1,25 @@
+# pylint: disable=missing-docstring,too-few-public-methods
+
+class MyClass(object):
+
+    def __init__(self): # [return-in-init]
+        return 1
+
+class MyClass2(object):
+    """dummy class"""
+
+    def __init__(self):
+        return
+
+
+class MyClass3(object):
+    """dummy class"""
+
+    def __init__(self):
+        return None
+
+class MyClass5(object):
+    """dummy class"""
+
+    def __init__(self):
+        self.callable = lambda: (yield None)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.py	(revision 1126)
@@ -0,0 +1,83 @@
+"""Check that instantiating a class with
+`abc.ABCMeta` as metaclass fails if it defines
+abstract methods.
+"""
+
+# pylint: disable=too-few-public-methods, missing-docstring
+# pylint: disable=no-absolute-import, metaclass-assignment
+# pylint: disable=abstract-method, import-error, wildcard-import
+
+import abc
+from abc import ABCMeta
+from lala import Bala
+
+
+class GoodClass(object):
+    __metaclass__ = abc.ABCMeta
+
+class SecondGoodClass(object):
+    __metaclass__ = abc.ABCMeta
+
+    def test(self):
+        """ do nothing. """
+
+class ThirdGoodClass(object):
+    __metaclass__ = abc.ABCMeta
+
+    def test(self):
+        raise NotImplementedError()
+
+class FourthGoodClass(object):
+    __metaclass__ = ABCMeta
+
+class BadClass(object):
+    __metaclass__ = abc.ABCMeta
+
+    @abc.abstractmethod
+    def test(self):
+        """ do nothing. """
+
+class SecondBadClass(object):
+    __metaclass__ = abc.ABCMeta
+
+    @property
+    @abc.abstractmethod
+    def test(self):
+        """ do nothing. """
+
+class ThirdBadClass(object):
+    __metaclass__ = ABCMeta
+
+    @abc.abstractmethod
+    def test(self):
+        pass
+
+class FourthBadClass(ThirdBadClass):
+    pass
+
+
+class SomeMetaclass(object):
+    __metaclass__ = ABCMeta
+
+    @abc.abstractmethod
+    def prop(self):
+        pass
+
+class FifthGoodClass(SomeMetaclass):
+    """Don't consider this abstract if some attributes are
+    there, but can't be inferred.
+    """
+    prop = Bala # missing
+
+
+def main():
+    """ do nothing """
+    GoodClass()
+    SecondGoodClass()
+    ThirdGoodClass()
+    FourthGoodClass()
+    BadClass() # [abstract-class-instantiated]
+    SecondBadClass() # [abstract-class-instantiated]
+    ThirdBadClass() # [abstract-class-instantiated]
+    FourthBadClass() # [abstract-class-instantiated]
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.py	(revision 1126)
@@ -0,0 +1,30 @@
+""" Checks for boolean uses of datetime.time. """
+# pylint: disable=superfluous-parens,print-statement,no-absolute-import
+import datetime
+
+if datetime.time(0, 0, 0): # [boolean-datetime]
+    print("datetime.time(0,0,0) is not a bug!")
+else:
+    print("datetime.time(0,0,0) is a bug!")
+
+if not datetime.time(0, 0, 1): # [boolean-datetime]
+    print("datetime.time(0,0,1) is not a bug!")
+else:
+    print("datetime.time(0,0,1) is a bug!")
+
+DATA = not datetime.time(0, 0, 0) # [boolean-datetime]
+DATA1 = True if datetime.time(0, 0, 0) else False # [boolean-datetime]
+DATA2 = datetime.time(0, 0, 0) or True # [boolean-datetime]
+DATA3 = datetime.time(0, 0, 0) and True # [boolean-datetime]
+DATA4 = False or True or datetime.time(0, 0, 0) # [boolean-datetime]
+DATA5 = False and datetime.time(0, 0, 0) or True # [boolean-datetime]
+
+
+def cant_infer(data):
+    """ Can't infer what data is """
+    hophop = not data
+    troptrop = True if data else False
+    toptop = data or True
+    return hophop, troptrop, toptop
+
+cant_infer(datetime.time(0, 0, 0))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_all_object.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_all_object.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_all_object.txt	(revision 1126)
@@ -0,0 +1,3 @@
+invalid-all-object:3::Invalid object '1' in __all__, must contain only strings
+invalid-all-object:4:<lambda>:"Invalid object 'lambda : None' in __all__, must contain only strings"
+invalid-all-object:5::Invalid object 'None' in __all__, must contain only strings
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/socketerror_import.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/socketerror_import.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/socketerror_import.py	(revision 1126)
@@ -0,0 +1,6 @@
+"""ds"""
+from __future__ import absolute_import, print_function
+from socket import error
+__revision__ = '$Id: socketerror_import.py,v 1.2 2005-12-28 14:58:22 syt Exp $'
+
+print(error)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.py	(revision 1126)
@@ -0,0 +1,90 @@
+"""Test abstract-method warning."""
+from __future__ import print_function
+
+# pylint: disable=missing-docstring, no-init, no-self-use
+# pylint: disable=too-few-public-methods
+import abc
+
+class Abstract(object):
+    def aaaa(self):
+        """should be overridden in concrete class"""
+        raise NotImplementedError()
+
+    def bbbb(self):
+        """should be overridden in concrete class"""
+        raise NotImplementedError()
+
+
+class AbstractB(Abstract):
+    """Abstract class.
+
+    this class is checking that it does not output an error msg for
+    unimplemeted methods in abstract classes
+    """
+    def cccc(self):
+        """should be overridden in concrete class"""
+        raise NotImplementedError()
+
+class Concret(Abstract): # [abstract-method]
+    """Concrete class"""
+
+    def aaaa(self):
+        """overidden form Abstract"""
+
+
+class Structure(object):
+    __metaclass__ = abc.ABCMeta
+
+    @abc.abstractmethod
+    def __iter__(self):
+        pass
+    @abc.abstractmethod
+    def __len__(self):
+        pass
+    @abc.abstractmethod
+    def __contains__(self, _):
+        pass
+    @abc.abstractmethod
+    def __hash__(self):
+        pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Container(Structure):
+    def __contains__(self, _):
+        pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Sizable(Structure):
+    def __len__(self):
+        pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Hashable(Structure):
+    __hash__ = 42
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Iterator(Structure):
+    def keys(self):
+        return iter([1, 2, 3])
+
+    __iter__ = keys
+
+
+class AbstractSizable(Structure):
+    @abc.abstractmethod
+    def length(self):
+        pass
+    __len__ = length
+
+
+class GoodComplexMRO(Container, Iterator, Sizable, Hashable):
+    pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class BadComplexMro(Container, Iterator, AbstractSizable):
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/genexpr_variable_scope.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/genexpr_variable_scope.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/genexpr_variable_scope.txt	(revision 1126)
@@ -0,0 +1 @@
+undefined-variable:5::Undefined variable 'n'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unneeded_not.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unneeded_not.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unneeded_not.txt	(revision 1126)
@@ -0,0 +1,14 @@
+unneeded-not:10:unneeded_not:Consider changing "not not bool_var" to "bool_var"
+unneeded-not:12:unneeded_not:Consider changing "not someint == 1" to "someint != 1"
+unneeded-not:14:unneeded_not:Consider changing "not someint != 1" to "someint == 1"
+unneeded-not:16:unneeded_not:Consider changing "not someint < 1" to "someint >= 1"
+unneeded-not:18:unneeded_not:Consider changing "not someint > 1" to "someint <= 1"
+unneeded-not:20:unneeded_not:Consider changing "not someint <= 1" to "someint > 1"
+unneeded-not:22:unneeded_not:Consider changing "not someint >= 1" to "someint < 1"
+unneeded-not:24:unneeded_not:Consider changing "not not someint" to "someint"
+unneeded-not:26:unneeded_not:Consider changing "not bool_var == True" to "bool_var != True"
+unneeded-not:28:unneeded_not:Consider changing "not bool_var == False" to "bool_var != False"
+unneeded-not:30:unneeded_not:Consider changing "not bool_var != True" to "bool_var == True"
+unneeded-not:32:unneeded_not:Consider changing "not True == True" to "True != True"
+unneeded-not:34:unneeded_not:Consider changing "not 2 in [3, 4]" to "2 not in [3, 4]"
+unneeded-not:36:unneeded_not:Consider changing "not someint is 'test'" to "someint is not 'test'"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_scope.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_scope.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_scope.py	(revision 1126)
@@ -0,0 +1,22 @@
+# pylint: disable=R0903,W0232
+"""check for scope problems"""
+
+__revision__ = None
+
+class Well(object):
+    """well"""
+    attr = 42
+    get_attr = lambda arg=attr: arg * 24
+    # +1: [used-before-assignment]
+    get_attr_bad = lambda arg=revattr: revattr * 42
+    revattr = 24
+    bad_lambda = lambda: get_attr_bad # [undefined-variable]
+
+    class Data(object):
+        """base hidden class"""
+    class Sub(Data):
+        """whaou, is Data found???"""
+        attr = Data() # [undefined-variable]
+    def func(self):
+        """check Sub is not defined here"""
+        return Sub(), self # [undefined-variable]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.txt	(revision 1126)
@@ -0,0 +1,3 @@
+bad-exception-context:14:test:Exception context set to something which is not an exception, nor None
+bad-exception-context:17:test:Exception context set to something which is not an exception, nor None
+bad-exception-context:23:test:Exception context set to something which is not an exception, nor None
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/simplifiable_if_statement.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/simplifiable_if_statement.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/simplifiable_if_statement.py	(revision 1126)
@@ -0,0 +1,120 @@
+"""Test that some if statement tests can be simplified."""
+
+# pylint: disable=missing-docstring, invalid-name
+
+
+def test_simplifiable_1(arg):
+    # Simple test that can be replaced by bool(arg)
+    if arg: # [simplifiable-if-statement]
+        return True
+    else:
+        return False
+
+
+def test_simplifiable_2(arg, arg2):
+    # Can be reduced to bool(arg and not arg2)
+    if arg and not arg2: # [simplifiable-if-statement]
+        return True
+    else:
+        return False
+
+
+def test_simplifiable_3(arg, arg2):
+    # Can be reduced to bool(arg and not arg2)
+    if arg and not arg2: # [simplifiable-if-statement]
+        var = True
+    else:
+        var = False
+    return var
+
+
+def test_simplifiable_4(arg):
+    if arg:
+        var = True
+    else:
+        if arg == "arg1": # [simplifiable-if-statement]
+            return True
+        else:
+            return False
+    return var
+
+
+def test_not_necessarily_simplifiable_1(arg, arg2):
+    # Can be reduced to bool(not arg and not arg2) or to
+    # `not all(N)`, which is a bit harder to understand
+    # than `any(N)` when var should be False.
+    if arg or arg2:
+        var = False
+    else:
+        var = True
+    return var
+
+
+def test_not_necessarily_simplifiabile_2(arg):
+    # This could theoretically be reduced to `not arg or arg > 3`
+    # but the net result is that now the condition is harder to understand,
+    # because it requires understanding of an extra clause:
+    #   * first, there is the negation of truthness with `not arg`
+    #   * the second clause is `arg > 3`, which occurs when arg has a
+    #     a truth value, but it implies that `arg > 3` is equivalent
+    #     with `arg and arg > 3`, which means that the user must
+    #     think about this assumption when evaluating `arg > 3`.
+    #     The original form is easier to grasp.
+    if arg and arg <= 3:
+        return False
+    else:
+        return True
+
+
+def test_not_simplifiable_3(arg):
+    if arg:
+        test_not_necessarily_simplifiabile_2(arg)
+        test_not_necessarily_simplifiable_1(arg, arg)
+        return False
+    else:
+        if arg < 3:
+            test_simplifiable_3(arg, 42)
+        return True
+
+
+def test_not_simplifiable_4(arg):
+    # Not interested in multiple elifs
+    if arg == "any":
+        return True
+    elif test_not_simplifiable_3(arg) == arg:
+        return True
+    else:
+        return False
+
+
+def test_not_simplifiable_5(arg):
+    # Different actions in each branch
+    if arg == "any":
+        return True
+    else:
+        var = 42
+    return var
+
+
+def test_not_simplifiable_6(arg):
+    # Different actions in each branch
+    if arg == "any":
+        var = 42
+    else:
+        return True
+    return var
+
+def test_not_simplifiable_7(arg):
+    # Returning something different
+    if arg == "any":
+        return 4
+    else:
+        return 5
+
+
+def test_not_simplifiable_8(arg):
+    # Only one of the branch returns something boolean
+    if arg == "any":
+        return True
+    else:
+        return 0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_final_newline.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_final_newline.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_final_newline.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""This file does not have a final newline."""
+from __future__ import print_function
+# +1:[missing-final-newline]
+print(1)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/superfluous_parens.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/superfluous_parens.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/superfluous_parens.py	(revision 1126)
@@ -0,0 +1,19 @@
+"""Test the superfluous-parens warning."""
+from __future__ import print_function
+# pylint: disable=unneeded-not
+i = 3
+if (i == 5):  # [superfluous-parens]
+    pass
+if not (i == 5):  # [superfluous-parens]
+    pass
+if not (3 or 5):
+    pass
+for (x) in (1, 2, 3):  # [superfluous-parens]
+    print(x)
+if (1) in (1, 2, 3):  # [superfluous-parens]
+    pass
+if (1, 2) in (1, 2, 3):
+    pass
+DICT = {'a': 1, 'b': 2}
+del(DICT['b'])  # [superfluous-parens]
+del DICT['a']
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_comparison_constant.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_comparison_constant.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_comparison_constant.py	(revision 1126)
@@ -0,0 +1,36 @@
+"""Check that the constants are on the right side of the comparisons"""
+
+# pylint: disable=singleton-comparison, missing-docstring, too-few-public-methods
+
+class MyClass(object):
+    def __init__(self):
+        self.attr = 1
+
+    def dummy_return(self):
+        return self.attr
+
+def dummy_return():
+    return 2
+
+def bad_comparisons():
+    """this is not ok"""
+    instance = MyClass()
+    for i in range(10):
+        if 5 <= i:  # [misplaced-comparison-constant]
+            pass
+        if 1 == i:  # [misplaced-comparison-constant]
+            pass
+        if 3 < dummy_return():  # [misplaced-comparison-constant]
+            pass
+        if 4 != instance.dummy_return():  # [misplaced-comparison-constant]
+            pass
+        if 1 == instance.attr:  # [misplaced-comparison-constant]
+            pass
+        if "aaa" == instance.attr: # [misplaced-comparison-constant]
+            pass
+
+def good_comparison():
+    """this is ok"""
+    for i in range(10):
+        if i == 5:
+            pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_in_loop.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_in_loop.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_in_loop.txt	(revision 1126)
@@ -0,0 +1,8 @@
+not-in-loop:7:ala:'continue' not properly in loop
+not-in-loop:12::'continue' not properly in loop
+not-in-loop:15:lala:'continue' not properly in loop
+not-in-loop:19:A:'continue' not properly in loop
+not-in-loop:24::'continue' not properly in loop
+not-in-loop:29::'break' not properly in loop
+not-in-loop:32::'continue' not properly in loop
+not-in-loop:34::'break' not properly in loop
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_callable.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_callable.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_callable.txt	(revision 1126)
@@ -0,0 +1,8 @@
+not-callable:5::REVISION is not callable
+not-callable:23::INSTANCE is not callable
+not-callable:25::LIST is not callable
+not-callable:27::DICT is not callable
+not-callable:29::TUPLE is not callable
+not-callable:31::INT is not callable
+not-callable:66::PROP.test is not callable
+not-callable:67::PROP.custom is not callable
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_outside_function.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_outside_function.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_outside_function.txt	(revision 1126)
@@ -0,0 +1 @@
+return-outside-function:2::Return outside function
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_used_before_assign.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_used_before_assign.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_used_before_assign.txt	(revision 1126)
@@ -0,0 +1,2 @@
+undefined-variable:9:do_nothing:Undefined variable 'ctx'
+used-before-assignment:10:do_nothing:Using variable 'context' before assignment
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.txt	(revision 1126)
@@ -0,0 +1,8 @@
+undefined-variable:8:Undefined.test:Undefined variable 'Undefined'
+undefined-variable:33:Undefined1.InnerScope.test_undefined:Undefined variable 'Undef'
+undefined-variable:36:Undefined1.InnerScope.test1:Undefined variable 'ABC'
+undefined-variable:51:FalsePositive342.test_bad:Undefined variable 'trop'
+undefined-variable:54:FalsePositive342.test_bad1:Undefined variable 'trop1'
+undefined-variable:57:FalsePositive342.test_bad2:Undefined variable 'trop2'
+undefined-variable:62:Bad:Undefined variable 'ABCMet'
+undefined-variable:65:SecondBad:Undefined variable 'ab.ABCMeta'
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_builtin.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_builtin.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_builtin.py	(revision 1126)
@@ -0,0 +1,10 @@
+"""Tests for redefining builtins."""
+from __future__ import print_function
+
+def function():
+    """Redefined local."""
+    type = 1  # [redefined-builtin]
+    print(type)
+
+# pylint:disable=invalid-name
+map = {}  # [redefined-builtin]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unexpected_special_method_signature.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unexpected_special_method_signature.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unexpected_special_method_signature.txt	(revision 1126)
@@ -0,0 +1,16 @@
+unexpected-special-method-signature:8:Invalid.__enter__:The special method '__enter__' expects 0 param(s), 1 was given
+unexpected-special-method-signature:11:Invalid.__del__:The special method '__del__' expects 0 param(s), 1 was given
+unexpected-special-method-signature:14:Invalid.__format__:The special method '__format__' expects 1 param(s), 2 were given
+unexpected-special-method-signature:17:Invalid.__setattr__:The special method '__setattr__' expects 2 param(s), 0 was given
+unexpected-special-method-signature:20:Invalid.__round__:The special method '__round__' expects between 0 or 1 param(s), 2 were given
+unexpected-special-method-signature:23:Invalid.__deepcopy__:The special method '__deepcopy__' expects 1 param(s), 2 were given
+no-method-argument:26:Invalid.__iter__:Method has no argument
+unexpected-special-method-signature:30:Invalid.__getattr__:The special method '__getattr__' expects 1 param(s), 2 were given
+unexpected-special-method-signature:37:FirstBadContextManager.__exit__:The special method '__exit__' expects 3 param(s), 1 was given
+unexpected-special-method-signature:43:SecondBadContextManager.__exit__:The special method '__exit__' expects 3 param(s), 4 were given
+unexpected-special-method-signature:51:ThirdBadContextManager.__exit__:The special method '__exit__' expects 3 param(s), 4 were given
+unexpected-special-method-signature:57:Async.__aiter__:The special method '__aiter__' expects 0 param(s), 1 was given
+unexpected-special-method-signature:59:Async.__anext__:The special method '__anext__' expects 0 param(s), 2 were given
+unexpected-special-method-signature:61:Async.__await__:The special method '__await__' expects 0 param(s), 1 was given
+unexpected-special-method-signature:63:Async.__aenter__:The special method '__aenter__' expects 0 param(s), 1 was given
+unexpected-special-method-signature:65:Async.__aexit__:The special method '__aexit__' expects 3 param(s), 0 was given
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_docstring.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_docstring.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_docstring.txt	(revision 1126)
@@ -0,0 +1,3 @@
+missing-docstring:1::Missing module docstring
+missing-docstring:21:ClassUndocumented:Missing class docstring
+missing-docstring:25:public_undocumented:Missing function docstring
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_using_generator.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_using_generator.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_using_generator.txt	(revision 1126)
@@ -0,0 +1 @@
+not-context-manager:13:Base.fun:Context manager 'generator' doesn't implement __enter__ and __exit__.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle_properties.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle_properties.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle_properties.txt	(revision 1126)
@@ -0,0 +1,2 @@
+old-style-class:13:OldStyleClass:Old-style class defined.
+property-on-old-class:15:OldStyleClass:"Use of ""property"" on an old style class":INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_enum_crash.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_enum_crash.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_enum_crash.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+requires=gtk
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_bases.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_bases.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_bases.txt	(revision 1126)
@@ -0,0 +1 @@
+duplicate-bases:5:Duplicates:Duplicate bases for class 'Duplicates'
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/member_checks.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/member_checks.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/member_checks.txt	(revision 1126)
@@ -0,0 +1,15 @@
+no-member:24:Client.__init__:Class 'Provider' has no 'cattribute' member:INFERENCE
+no-member:34:Client.use_method:Instance of 'Provider' has no 'hophophop' member:INFERENCE
+no-member:39:Client.use_attr:Instance of 'Provider' has no 'attribute' member:INFERENCE
+no-member:51:Client.test_bt_types:Instance of 'list' has no 'apppend' member:INFERENCE
+no-member:53:Client.test_bt_types:Instance of 'dict' has no 'set' member:INFERENCE
+no-member:55:Client.test_bt_types:Instance of 'tuple' has no 'append' member:INFERENCE
+no-member:57:Client.test_bt_types:Instance of 'str' has no 'loower' member:INFERENCE
+no-member:59:Client.test_bt_types:Instance of 'int' has no 'whatever' member:INFERENCE
+no-member:65:Client.test_no_false_positives:Super of 'Client' has no 'misssing' member:INFERENCE
+no-member:86::Instance of 'int' has no 'lower' member:INFERENCE_FAILURE
+no-member:97::Instance of 'Client' has no 'indeed' member:INFERENCE
+no-member:107::Instance of 'Client' has no 'indeed' member:INFERENCE
+no-member:114::Class 'Client' has no 'missing' member:INFERENCE
+no-member:120::Class 'Client' has no 'missing' member:INFERENCE
+no-member:181:NoDunderNameInInstance.__init__:Instance of 'NoDunderNameInInstance' has no '__name__' member:INFERENCE
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_outside_function.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_outside_function.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_outside_function.py	(revision 1126)
@@ -0,0 +1,2 @@
+"""This is gramatically correct, but it's still a SyntaxError"""
+return # [return-outside-function]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/method_hidden.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/method_hidden.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/method_hidden.txt	(revision 1126)
@@ -0,0 +1 @@
+method-hidden:13:Cdef.abcd:An attribute defined in functional.method_hidden line 9 hides this method
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_nested_blocks.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_nested_blocks.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_nested_blocks.py	(revision 1126)
@@ -0,0 +1,95 @@
+"""Checks the maximum block level is smaller than 6 in function definitions"""
+
+#pylint: disable=using-constant-test, missing-docstring, too-many-return-statements
+
+def my_function():
+    if 1:  # [too-many-nested-blocks]
+        for i in range(10):
+            if i == 2:
+                while True:
+                    try:
+                        if True:
+                            i += 1
+                    except IOError:
+                        pass
+
+    if 1:
+        for i in range(10):
+            if i == 2:
+                while True:
+                    try:
+                        i += 1
+                    except IOError:
+                        pass
+
+    def nested_func():
+        if True:
+            for i in range(10):
+                while True:
+                    if True:
+                        if True:
+                            yield i
+
+    nested_func()
+
+def more_complex_function():
+    attr1 = attr2 = attr3 = [1, 2, 3]
+    if attr1:
+        for i in attr1:
+            if attr2:
+                return i
+            else:
+                return 'duh'
+    elif attr2:
+        for i in attr2:
+            if attr2:
+                return i
+            else:
+                return 'duh'
+    else:
+        for i in range(15):
+            if attr3:
+                return i
+            else:
+                return 'doh'
+            return None
+
+def elif_function():
+    arg = None
+    if arg == 1:
+        return 1
+    elif arg == 2:
+        return 2
+    elif arg == 3:
+        return 3
+    elif arg == 4:
+        return 4
+    elif arg == 5:
+        return 5
+    elif arg == 6:
+        return 6
+    elif arg == 7:
+        return 7
+
+def else_if_function():
+    arg = None
+    if arg == 1:  # [too-many-nested-blocks]
+        return 1
+    else:
+        if arg == 2:
+            return 2
+        else:
+            if arg == 3:
+                return 3
+            else:
+                if arg == 4:
+                    return 4
+                else:
+                    if arg == 5:
+                        return 5
+                    else:
+                        if arg == 6:
+                            return 6
+                        else:
+                            if arg == 7:
+                                return 7
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""Test for a = *b"""
+
+FIRST = *[1, 2]  # [star-needs-assignment-target]
+*THIRD, FOURTH = [1, 2, 3,]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.txt	(revision 1126)
@@ -0,0 +1,16 @@
+abstract-method:28:Concret:"Method 'bbbb' is abstract in class 'Abstract' but is not overridden"
+abstract-method:51:Container:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:51:Container:"Method '__iter__' is abstract in class 'Structure' but is not overridden"
+abstract-method:51:Container:"Method '__len__' is abstract in class 'Structure' but is not overridden"
+abstract-method:57:Sizable:"Method '__contains__' is abstract in class 'Structure' but is not overridden"
+abstract-method:57:Sizable:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:57:Sizable:"Method '__iter__' is abstract in class 'Structure' but is not overridden"
+abstract-method:63:Hashable:"Method '__contains__' is abstract in class 'Structure' but is not overridden"
+abstract-method:63:Hashable:"Method '__iter__' is abstract in class 'Structure' but is not overridden"
+abstract-method:63:Hashable:"Method '__len__' is abstract in class 'Structure' but is not overridden"
+abstract-method:68:Iterator:"Method '__contains__' is abstract in class 'Structure' but is not overridden"
+abstract-method:68:Iterator:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:68:Iterator:"Method '__len__' is abstract in class 'Structure' but is not overridden"
+abstract-method:87:BadComplexMro:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:87:BadComplexMro:"Method '__len__' is abstract in class 'AbstractSizable' but is not overridden"
+abstract-method:87:BadComplexMro:"Method 'length' is abstract in class 'AbstractSizable' but is not overridden"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_name.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_name.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_name.py	(revision 1126)
@@ -0,0 +1,31 @@
+""" Tests for invalid-name checker. """
+# pylint: disable=unused-import, no-absolute-import, wrong-import-position
+
+AAA = 24
+try:
+    import collections
+except ImportError:
+    collections = None
+
+aaa = 42 # [invalid-name]
+try:
+    import time
+except ValueError:
+    time = None # [invalid-name]
+
+try:
+    from sys import argv, executable as python
+except ImportError:
+    argv = 42
+    python = 24
+
+def test():
+    """ Shouldn't emit an invalid-name here. """
+    try:
+        import re
+    except ImportError:
+        re = None
+    return re
+
+def a(): # [invalid-name]
+    """yo"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.py	(revision 1126)
@@ -0,0 +1,19 @@
+# pylint: disable=missing-docstring,invalid-name,too-few-public-methods
+from __future__ import print_function
+
+
+def test(**kwargs):
+    print(kwargs)
+
+# metaclasses as mappings
+class Meta(type):
+    def __getitem__(self, key):
+        return ord(key)
+    def keys(self):
+        return ['a', 'b', 'c']
+
+class SomeClass(object):
+    __metaclass__ = Meta
+
+test(**SomeClass)
+test(**SomeClass())  # [not-a-mapping]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.3
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/function_redefined.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/function_redefined.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/function_redefined.py	(revision 1126)
@@ -0,0 +1,74 @@
+# pylint: disable=R0201,missing-docstring,using-constant-test
+from __future__ import division
+__revision__ = ''
+
+class AAAA(object):
+    """docstring"""
+    def __init__(self):
+        pass
+    def method1(self):
+        """docstring"""
+
+    def method2(self):
+        """docstring"""
+
+    def method2(self): # [function-redefined]
+        """docstring"""
+
+class AAAA(object): # [function-redefined]
+    """docstring"""
+    def __init__(self):
+        pass
+    def yeah(self):
+        """hehehe"""
+    def yoo(self):
+        """yoo"""
+def func1():
+    """docstring"""
+
+def func2():
+    """docstring"""
+
+def func2(): # [function-redefined]
+    """docstring"""
+    __revision__ = 1 # [redefined-outer-name]
+    return __revision__
+
+if __revision__:
+    def exclusive_func():
+        "docstring"
+else:
+    def exclusive_func():
+        "docstring"
+
+try:
+    def exclusive_func2():
+        "docstring"
+except TypeError:
+    def exclusive_func2():
+        "docstring"
+else:
+    def exclusive_func2(): # [function-redefined]
+        "this one redefine the one defined line 42"
+
+
+def with_inner_function_1():
+    """docstring"""
+    def callback():
+        """callback docstring"""
+        pass
+    return callback
+
+def with_inner_function_2():
+    """docstring"""
+    def callback():
+        """does not redefine callback returned by with_inner_function_1"""
+        pass
+    return callback
+
+def some_func():
+    """Don't emit if we defined a variable with the same name as a
+    __future__ directive.
+    """
+    division = 2
+    return division
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/long_lines_with_utf8.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/long_lines_with_utf8.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/long_lines_with_utf8.py	(revision 1126)
@@ -0,0 +1,7 @@
+# coding: utf-8
+"""Test data file files with non-ASCII content."""
+
+
+THIS_IS_A_LONG_VARIABLE_NAME = 'Существительное Частица'  # but the line is okay
+
+THIS_IS_A_VERY_LONG_VARIABLE_NAME = 'Существительное Частица'  # and the line is not okay  # [line-too-long]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_slice_index.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_slice_index.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_slice_index.py	(revision 1126)
@@ -0,0 +1,60 @@
+"""Errors for invalid slice indices"""
+# pylint: disable=too-few-public-methods, no-self-use
+
+
+TESTLIST = [1, 2, 3]
+
+# Invalid indices
+def function1():
+    """functions used as indices"""
+    return TESTLIST[id:id:]  # [invalid-slice-index,invalid-slice-index]
+
+def function2():
+    """strings used as indices"""
+    return TESTLIST['0':'1':]  # [invalid-slice-index,invalid-slice-index]
+
+def function3():
+    """class without __index__ used as index"""
+
+    class NoIndexTest(object):
+        """Class with no __index__ method"""
+        pass
+
+    return TESTLIST[NoIndexTest()::]  # [invalid-slice-index]
+
+# Valid indices
+def function4():
+    """integers used as indices"""
+    return TESTLIST[0:0:0] # no error
+
+def function5():
+    """None used as indices"""
+    return TESTLIST[None:None:None] # no error
+
+def function6():
+    """class with __index__ used as index"""
+    class IndexTest(object):
+        """Class with __index__ method"""
+        def __index__(self):
+            """Allow objects of this class to be used as slice indices"""
+            return 0
+
+    return TESTLIST[IndexTest():None:None] # no error
+
+def function7():
+    """class with __index__ in superclass used as index"""
+    class IndexType(object):
+        """Class with __index__ method"""
+        def __index__(self):
+            """Allow objects of this class to be used as slice indices"""
+            return 0
+
+    class IndexSubType(IndexType):
+        """Class with __index__ in parent"""
+        pass
+
+    return TESTLIST[IndexSubType():None:None] # no error
+
+def function8():
+    """slice object used as index"""
+    return TESTLIST[slice(1, 2, 3)] # no error
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable_py30.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/trailing_whitespaces.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/trailing_whitespaces.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/trailing_whitespaces.txt	(revision 1126)
@@ -0,0 +1,3 @@
+trailing-whitespace:6::Trailing whitespace
+trailing-whitespace:8::Trailing whitespace
+trailing-whitespace:11::Trailing whitespace
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_position.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_position.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_position.txt	(revision 1126)
@@ -0,0 +1,3 @@
+wrong-import-position:26::Import "import datetime" should be placed at the top of the module
+wrong-import-position:32::Import "import scipy" should be placed at the top of the module
+wrong-import-position:33::Import "import astroid" should be placed at the top of the module
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.py	(revision 1126)
@@ -0,0 +1,79 @@
+# pylint: disable=missing-docstring
+
+
+HEHE = {}
+
+def function1(value=[]): # [dangerous-default-value]
+    """docstring"""
+    return value
+
+def function2(value=HEHE): # [dangerous-default-value]
+    """docstring"""
+    return value
+
+def function3(value):
+    """docstring"""
+    return value
+
+def function4(value=set()): # [dangerous-default-value]
+    """set is mutable and dangerous."""
+    return value
+
+def function5(value=frozenset()):
+    """frozenset is immutable and safe."""
+    return value
+
+GLOBAL_SET = set()
+
+def function6(value=GLOBAL_SET): # [dangerous-default-value]
+    """set is mutable and dangerous."""
+    return value
+
+def function7(value=dict()): # [dangerous-default-value]
+    """dict is mutable and dangerous."""
+    return value
+
+def function8(value=list()):  # [dangerous-default-value]
+    """list is mutable and dangerous."""
+    return value
+
+def function9(value=[1, 2, 3, 4]): # [dangerous-default-value]
+    """list with items should not output item values in error message"""
+    return value
+
+def function10(value={'a': 1, 'b': 2}): # [dangerous-default-value]
+    """dictionaries with items should not output item values in error message"""
+    return value
+
+def function11(value=list([1, 2, 3])): # [dangerous-default-value]
+    """list with items should not output item values in error message"""
+    return value
+
+def function12(value=dict([('a', 1), ('b', 2)])): # [dangerous-default-value]
+    """dictionaries with items should not output item values in error message"""
+    return value
+
+OINK = {
+    'a': 1,
+    'b': 2
+}
+
+def function13(value=OINK): # [dangerous-default-value]
+    """dictionaries with items should not output item values in error message"""
+    return value
+
+def function14(value=dict([(1, 2), (1, 2, 3)])): # [dangerous-default-value]
+    """a dictionary which will not be inferred to a syntax AST, but to an
+    astroid.Instance.
+    """
+    return value
+
+INVALID_DICT = dict([(1, 2), (1, 2, 3)])
+
+def function15(value=INVALID_DICT): # [dangerous-default-value]
+    """The same situation as function14."""
+    return value
+
+def function16(value={1}): # [dangerous-default-value]
+    """set literal as default value"""
+    return value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=3.0
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.txt	(revision 1126)
@@ -0,0 +1 @@
+invalid-star-assignment-target:3::Starred assignment target must be in a list or tuple
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.5
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.txt	(revision 1126)
@@ -0,0 +1 @@
+not-an-iterable:17::Non-iterable value SomeClass() is used in an iterating context
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ungrouped_imports.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ungrouped_imports.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ungrouped_imports.txt	(revision 1126)
@@ -0,0 +1,5 @@
+ungrouped-imports:8::Imports from package logging are not grouped
+ungrouped-imports:11::Imports from package os are not grouped
+ungrouped-imports:17::Imports from package astroid are not grouped
+ungrouped-imports:19::Imports from package logging are not grouped
+ungrouped-imports:20::Imports from package os are not grouped
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_callable.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_callable.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_callable.py	(revision 1126)
@@ -0,0 +1,112 @@
+# pylint: disable=missing-docstring,no-self-use,too-few-public-methods
+
+REVISION = None
+
+REVISION() # [not-callable]
+
+def correct():
+    return 1
+
+REVISION = correct()
+
+class Correct(object):
+    """callable object"""
+
+class MetaCorrect(object):
+    """callable object"""
+    def __call__(self):
+        return self
+
+INSTANCE = Correct()
+CALLABLE_INSTANCE = MetaCorrect()
+CORRECT = CALLABLE_INSTANCE()
+INCORRECT = INSTANCE() # [not-callable]
+LIST = []
+INCORRECT = LIST() # [not-callable]
+DICT = {}
+INCORRECT = DICT() # [not-callable]
+TUPLE = ()
+INCORRECT = TUPLE() # [not-callable]
+INT = 1
+INCORRECT = INT() # [not-callable]
+
+# Test calling properties. Pylint can detect when using only the
+# getter, but it doesn't infer properly when having a getter
+# and a setter.
+class MyProperty(property):
+    """ test subclasses """
+
+class PropertyTest(object):
+    """ class """
+
+    def __init__(self):
+        self.attr = 4
+
+    @property
+    def test(self):
+        """ Get the attribute """
+        return self.attr
+
+    @test.setter
+    def test(self, value):
+        """ Set the attribute """
+        self.attr = value
+
+    @MyProperty
+    def custom(self):
+        """ Get the attribute """
+        return self.attr
+
+    @custom.setter
+    def custom(self, value):
+        """ Set the attribute """
+        self.attr = value
+
+PROP = PropertyTest()
+PROP.test(40) # [not-callable]
+PROP.custom() # [not-callable]
+
+# Safe from not-callable when using properties.
+
+class SafeProperty(object):
+    @property
+    def static(self):
+        return staticmethod
+
+    @property
+    def klass(self):
+        return classmethod
+
+    @property
+    def get_lambda(self):
+        return lambda: None
+
+    @property
+    def other_function(self):
+        def function(arg):
+            return arg
+        return function
+
+    @property
+    def dict_builtin(self):
+        return dict
+
+    @property
+    def range_builtin(self):
+        return range
+
+    @property
+    def instance(self):
+        class Empty(object):
+            def __call__(self):
+                return 42
+        return Empty()
+
+PROP1 = SafeProperty()
+PROP1.static(2)
+PROP1.klass(2)
+PROP1.get_lambda()
+PROP1.other_function(4)
+PROP1.dict_builtin()
+PROP1.range_builtin(4)
+PROP1.instance()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_in_loop.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_in_loop.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_in_loop.py	(revision 1126)
@@ -0,0 +1,54 @@
+"""Test that not-in-loop is detected properly."""
+# pylint: disable=missing-docstring, invalid-name, too-few-public-methods
+# pylint: disable=useless-else-on-loop, using-constant-test
+
+while True:
+    def ala():
+        continue # [not-in-loop]
+
+while True:
+    pass
+else:
+    continue # [not-in-loop]
+
+def lala():
+    continue # [not-in-loop]
+
+while True:
+    class A(object):
+        continue # [not-in-loop]
+
+for _ in range(10):
+    pass
+else:
+    continue # [not-in-loop]
+
+for _ in range(42):
+    pass
+else:
+    break # [not-in-loop]
+
+if True:
+    continue # [not-in-loop]
+else:
+    break # [not-in-loop]
+
+for _ in range(10):
+    for _ in range(20):
+        pass
+    else:
+        continue
+
+while True:
+    while True:
+        break
+    else:
+        break
+    break
+else:
+    pass
+
+for _ in range(1):
+    continue
+for _ in range(42):
+    break
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking_py30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking_py30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking_py30.py	(revision 1126)
@@ -0,0 +1,11 @@
+""" Test that using starred nodes in unpacking
+does not trigger a false positive on Python 3.
+"""
+
+__revision__ = 1
+
+def test():
+    """ Test that starred expressions don't give false positives. """
+    first, second, *last = (1, 2, 3, 4)
+    *last, = (1, 2)
+    return (first, second, last)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.txt	(revision 1126)
@@ -0,0 +1,7 @@
+no-member:14:MyClass.test:Instance of 'MyClass' has no 'incorrect' member:INFERENCE
+no-member:15:MyClass.test:Instance of 'MyClass' has no 'havenot' member:INFERENCE
+no-member:16:MyClass.test:Instance of 'MyClass' has no 'nonexistent1' member:INFERENCE
+no-member:17:MyClass.test:Instance of 'MyClass' has no 'nonexistent2' member:INFERENCE
+no-member:48::Instance of 'TestMetaclass' has no 'register' member:INFERENCE
+no-member:49::Instance of 'UsingMetaclass' has no 'test' member:INFERENCE
+no-member:63:MetaClass.whatever:Class 'MetaClass' has no 'missing' member:INFERENCE
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.txt	(revision 1126)
@@ -0,0 +1 @@
+syntax-error:1::unexpected character after line continuation character
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/repeated_keyword.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/repeated_keyword.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/repeated_keyword.txt	(revision 1126)
@@ -0,0 +1 @@
+repeated-keyword:13::"Got multiple values for keyword argument 'b' in function call"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_staticmethod_argument.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_staticmethod_argument.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_staticmethod_argument.txt	(revision 1126)
@@ -0,0 +1,2 @@
+bad-staticmethod-argument:5:Abcd.method1:Static method with 'self' as first argument
+bad-staticmethod-argument:10:Abcd.method2:Static method with 'cls' as first argument
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/continue_in_finally.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/continue_in_finally.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/continue_in_finally.py	(revision 1126)
@@ -0,0 +1,24 @@
+"""Test that `continue` is catched when met inside a `finally` clause."""
+
+# pylint: disable=missing-docstring, lost-exception, broad-except
+
+while True:
+    try:
+        pass
+    finally:
+        continue # [continue-in-finally]
+
+while True:
+    try:
+        pass
+    finally:
+        break
+
+while True:
+    try:
+        pass
+    except Exception:
+        pass
+    else:
+        continue
+   
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/simplifiable_if_statement.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/simplifiable_if_statement.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/simplifiable_if_statement.txt	(revision 1126)
@@ -0,0 +1,4 @@
+simplifiable-if-statement:8:test_simplifiable_1:The if statement can be reduced by returning bool of test
+simplifiable-if-statement:16:test_simplifiable_2:The if statement can be reduced by returning bool of test
+simplifiable-if-statement:24:test_simplifiable_3:The if statement can be reduced by assigning bool of test
+simplifiable-if-statement:35:test_simplifiable_4:The if statement can be reduced by returning bool of test
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_abc_methods.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_abc_methods.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_abc_methods.py	(revision 1126)
@@ -0,0 +1,17 @@
+""" This should not warn about `prop` being abstract in Child """
+# pylint: disable=too-few-public-methods, no-absolute-import,metaclass-assignment
+
+import abc
+
+class Parent(object):
+    """Abstract Base Class """
+    __metaclass__ = abc.ABCMeta
+
+    @property
+    @abc.abstractmethod
+    def prop(self):
+        """ Abstract """
+
+class Child(Parent):
+    """ No warning for the following. """
+    prop = property(lambda self: 1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_classmethod_decorator.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_classmethod_decorator.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_classmethod_decorator.txt	(revision 1126)
@@ -0,0 +1,3 @@
+no-classmethod-decorator:14:MyClass:Consider using a decorator instead of calling classmethod
+no-classmethod-decorator:17:MyClass:Consider using a decorator instead of calling classmethod
+no-classmethod-decorator:25:MyClass:Consider using a decorator instead of calling classmethod
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/old_style_class_py27.txt	(revision 1126)
@@ -0,0 +1,2 @@
+old-style-class:4:Old:Old-style class defined.
+old-style-class:7:Child:Old-style class defined.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/async_functions.txt	(revision 1126)
@@ -0,0 +1,10 @@
+redefined-builtin:5:next:"Redefining built-in 'next'"
+unused-argument:8:some_function:"Unused argument 'arg2'"
+bad-super-call:22:Class.some_method:"Bad first argument 'OtherClass' given to super()"
+too-many-arguments:26:complex_function:Too many arguments (10/5)
+too-many-branches:26:complex_function:Too many branches (13/12)
+too-many-return-statements:26:complex_function:Too many return statements (10/6)
+dangerous-default-value:57:func:Dangerous default value [] as argument
+duplicate-argument-name:57:func:Duplicate argument name a in function definition
+blacklisted-name:62:foo:Black listed name "foo"
+empty-docstring:62:foo:Empty function docstring
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable.txt	(revision 1126)
@@ -0,0 +1,22 @@
+undefined-variable:7::Undefined variable 'unknown'
+undefined-variable:13:in_method:Undefined variable 'nomoreknown'
+undefined-variable:16::Undefined variable '__revision__'
+undefined-variable:18::Undefined variable '__revision__'
+undefined-variable:22:bad_default:Undefined variable 'unknown2'
+undefined-variable:25:bad_default:Undefined variable 'xxxx'
+undefined-variable:26:bad_default:Undefined variable 'augvar'
+undefined-variable:27:bad_default:Undefined variable 'vardel'
+undefined-variable:29:<lambda>:Undefined variable 'doesnotexist'
+undefined-variable:30:<lambda>:Undefined variable 'z'
+used-before-assignment:51::Using variable 'PLOUF' before assignment
+used-before-assignment:60:if_branch_test:Using variable 'xxx' before assignment
+used-before-assignment:86:test_arguments:Using variable 'TestClass' before assignment
+used-before-assignment:90:TestClass:Using variable 'Ancestor' before assignment
+used-before-assignment:93:TestClass.MissingAncestor:Using variable 'Ancestor1' before assignment
+used-before-assignment:100:TestClass.test1.UsingBeforeDefinition:Using variable 'Empty' before assignment
+undefined-variable:114:Self:Undefined variable 'Self'
+undefined-variable:130::Undefined variable 'BAT'
+used-before-assignment:141:KeywordArgument.test1:Using variable 'enabled' before assignment
+undefined-variable:144:KeywordArgument.test2:Undefined variable 'disabled'
+undefined-variable:149:KeywordArgument.<lambda>:Undefined variable 'arg'
+undefined-variable:171::Undefined variable 'unicode_4'
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/using_constant_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/using_constant_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/using_constant_test.py	(revision 1126)
@@ -0,0 +1,140 @@
+"""Verify if constant tests are used inside if statements."""
+# pylint: disable=invalid-name, missing-docstring,too-few-public-methods
+# pylint: disable=no-init,expression-not-assigned
+
+
+import collections
+
+
+def function():
+    yield
+
+
+class Class(object):
+
+    def method(self):
+        pass
+
+
+instance = Class()
+
+if collections: # [using-constant-test]
+    pass
+
+# GenExpr
+if (node for node in range(10)): # [using-constant-test]
+    pass
+
+if lambda: None: # [using-constant-test]
+    pass
+
+if function: # [using-constant-test]
+    pass
+
+if Class: # [using-constant-test]
+    pass
+
+if 2: # [using-constant-test]
+    pass
+
+if True: # [using-constant-test]
+    pass
+
+if '': # [using-constant-test]
+    pass
+
+if b'': # [using-constant-test]
+    pass
+
+if 2.0: # [using-constant-test]
+    pass
+
+if {}: # [using-constant-test]
+    pass
+
+if {1, 2, 3}: # [using-constant-test]
+    pass
+
+if (1, 2, 3): # [using-constant-test]
+    pass
+
+if (): # [using-constant-test]
+    pass
+
+# Generator
+generator = function()
+if generator: # [using-constant-test]
+    pass
+
+if 1 if 2 else 3: # [using-constant-test]
+    pass
+
+def test_comprehensions():
+    [data for data in range(100) if len] # [using-constant-test]
+    [data for data in range(100) if 1] # [using-constant-test]
+    (data for data in range(100) if len) # [using-constant-test]
+    (data for data in range(100) if 1) # [using-constant-test]
+    {data for data in range(100) if len} # [using-constant-test]
+    {data: 1 for data in range(100) if len} # [using-constant-test]
+
+
+
+# For these, we require to do inference, even though the result can be a
+# constant value. For some of them, we could determine that the test
+# is constant, such as 2 + 3, but the components of the BinOp
+# can be anything else (2 + somefunccall).
+
+name = 42
+if name:
+    pass
+
+# UnboundMethod / Function
+if Class.method:
+    pass
+
+# BoundMethod
+if instance.method:
+    pass
+
+if 3 + 4:
+    pass
+
+if 3 and 4:
+    pass
+
+if not 3:
+    pass
+
+if instance.method():
+    pass
+
+# pylint: disable=misplaced-comparison-constant
+if 2 < 3:
+    pass
+
+if tuple((1, 2, 3)):
+    pass
+
+if dict():
+    pass
+
+if tuple():
+    pass
+
+if [1, 2, 3][:1]:
+    pass
+
+def test(*args):
+    if args:
+        return 42
+
+def test_good_comprehension_checks():
+    [data for data in range(100)]
+    [data for data in range(100) if data]
+    [data for data in range(100) if len(data)]
+    (data for data in range(100) if data)
+    (data for data in range(100) if len(data))
+    {data for data in range(100) if data}
+    {data for data in range(100) if len(data)}
+    {data: 1 for data in range(100) if data}
+    {data: 1 for data in range(100)}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_staticmethod_argument.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_staticmethod_argument.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_staticmethod_argument.py	(revision 1126)
@@ -0,0 +1,16 @@
+# pylint: disable=missing-docstring, no-staticmethod-decorator
+
+class Abcd(object):
+
+    def method1(self): # [bad-staticmethod-argument]
+        pass
+
+    method1 = staticmethod(method1)
+
+    def method2(cls): # [bad-staticmethod-argument]
+        pass
+
+    method2 = staticmethod(method2)
+
+    def __init__(self):
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/formatting.txt
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsubscriptable_value.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsubscriptable_value.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsubscriptable_value.py	(revision 1126)
@@ -0,0 +1,115 @@
+"""
+Checks that value used in a subscript supports subscription
+(i.e. defines __getitem__ method).
+"""
+# pylint: disable=missing-docstring,pointless-statement,expression-not-assigned,wrong-import-position
+# pylint: disable=too-few-public-methods,import-error,invalid-name,wrong-import-order
+import six
+
+# primitives
+numbers = [1, 2, 3]
+numbers[0]
+"123"[0]
+u"123"[0]
+b"123"[0]
+bytearray(b"123")[0]
+dict(a=1, b=2)['a']
+(1, 2, 3)[0]
+
+# list/dict comprehensions are fine
+[x for x in range(10)][0]
+{x: 10 - x for x in range(10)}[0]
+
+
+# instances
+class NonSubscriptable(object):
+    pass
+
+class Subscriptable(object):
+    def __getitem__(self, key):
+        return key + key
+
+NonSubscriptable()[0]  # [unsubscriptable-object]
+NonSubscriptable[0]  # [unsubscriptable-object]
+Subscriptable()[0]
+Subscriptable[0]  # [unsubscriptable-object]
+
+# generators are not subscriptable
+def powers_of_two():
+    k = 0
+    while k < 10:
+        yield 2 ** k
+        k += 1
+
+powers_of_two()[0]  # [unsubscriptable-object]
+powers_of_two[0]  # [unsubscriptable-object]
+
+
+# check that primitive non subscriptable types are catched
+True[0]  # [unsubscriptable-object]
+None[0]  # [unsubscriptable-object]
+8.5[0]  # [unsubscriptable-object]
+10[0]  # [unsubscriptable-object]
+
+# sets are not subscriptable
+{x ** 2 for x in range(10)}[0]  # [unsubscriptable-object]
+set(numbers)[0]  # [unsubscriptable-object]
+frozenset(numbers)[0]  # [unsubscriptable-object]
+
+# skip instances with unknown base classes
+from some_missing_module import LibSubscriptable
+
+class MaybeSubscriptable(LibSubscriptable):
+    pass
+
+MaybeSubscriptable()[0]
+
+# subscriptable classes (through metaclasses)
+
+class MetaSubscriptable(type):
+    def __getitem__(cls, key):
+        return key + key
+
+class SubscriptableClass(six.with_metaclass(MetaSubscriptable, object)):
+    pass
+
+SubscriptableClass[0]
+SubscriptableClass()[0]  # [unsubscriptable-object]
+
+# functions are not subscriptable
+def test(*args, **kwargs):
+    return args, kwargs
+
+test()[0]
+test[0]  # [unsubscriptable-object]
+
+# deque
+from collections import deque
+deq = deque(maxlen=10)
+deq.append(42)
+deq[0]
+
+
+class AbstractClass(object):
+
+    def __init__(self):
+        self.ala = {i for i in range(10)}
+        self.bala = [i for i in range(10)]
+        self.portocala = None
+
+    def test_unsubscriptable(self):
+        self.bala[0]
+        self.portocala[0]
+
+
+class ClassMixin(object):
+
+    def __init__(self):
+        self.ala = {i for i in range(10)}
+        self.bala = [i for i in range(10)]
+        self.portocala = None
+
+    def test_unsubscriptable(self):
+        self.bala[0]
+        self.portocala[0]
+    
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/namedtuple_member_inference.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/namedtuple_member_inference.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/namedtuple_member_inference.py	(revision 1126)
@@ -0,0 +1,22 @@
+"""Test namedtuple attributes.
+
+Regression test for:
+https://bitbucket.org/logilab/pylint/issue/93/pylint-crashes-on-namedtuple-attribute
+"""
+from __future__ import absolute_import, print_function
+from collections import namedtuple
+
+__revision__ = None
+
+Thing = namedtuple('Thing', ())
+
+Fantastic = namedtuple('Fantastic', ['foo'])
+
+def test():
+    """Test member access in named tuples."""
+    print(Thing.x)  # [no-member]
+    fan = Fantastic(1)
+    print(fan.foo)
+    # Should not raise protected-access.
+    fan2 = fan._replace(foo=2)
+    print(fan2.foo)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_builtin.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_builtin.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_builtin.txt	(revision 1126)
@@ -0,0 +1,2 @@
+bad-builtin:3::Used builtin function 'map'. Using a list comprehension can be clearer.
+bad-builtin:4::Used builtin function 'filter'. Using a list comprehension can be clearer.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_outside_func.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_outside_func.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_outside_func.txt	(revision 1126)
@@ -0,0 +1 @@
+yield-outside-function:2::Yield outside function
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+max_pyver=2.7
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.py	(revision 1126)
@@ -0,0 +1,36 @@
+# pylint: disable=missing-docstring,too-few-public-methods,no-init,no-self-use,unused-argument,pointless-statement,expression-not-assigned,undefined-variable
+
+# metaclasses that support membership test protocol
+class MetaIterable(type):
+    def __iter__(cls):
+        return iter((1, 2, 3))
+
+class MetaOldIterable(type):
+    def __getitem__(cls, key):
+        if key < 10:
+            return key ** 2
+        else:
+            raise IndexError("bad index")
+
+class MetaContainer(type):
+    def __contains__(cls, key):
+        return False
+
+
+class IterableClass(object):
+    __metaclass__ = MetaIterable
+
+class OldIterableClass(object):
+    __metaclass__ = MetaOldIterable
+
+class ContainerClass(object):
+    __metaclass__ = MetaContainer
+
+
+def test():
+    1 in IterableClass
+    1 in OldIterableClass
+    1 in ContainerClass
+    1 in IterableClass()  # [unsupported-membership-test]
+    1 in OldIterableClass()  # [unsupported-membership-test]
+    1 in ContainerClass()  # [unsupported-membership-test]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_public_methods.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_public_methods.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_public_methods.py	(revision 1126)
@@ -0,0 +1,79 @@
+# pylint: disable=missing-docstring
+
+class Aaaa(object): # [too-many-public-methods]
+
+    def __init__(self):
+        pass
+
+    def meth1(self):
+        """hehehe"""
+
+    def meth2(self):
+        """hehehe"""
+
+    def meth3(self):
+        """hehehe"""
+
+    def meth4(self):
+        """hehehe"""
+
+    def meth5(self):
+        """hehehe"""
+
+    def meth6(self):
+        """hehehe"""
+
+    def meth7(self):
+        """hehehe"""
+
+    def meth8(self):
+        """hehehe"""
+
+    def meth9(self):
+        """hehehe"""
+
+    def meth10(self):
+        """hehehe"""
+
+    def meth11(self):
+        """hehehe"""
+
+    def meth12(self):
+        """hehehe"""
+
+    def meth13(self):
+        """hehehe"""
+
+    def meth14(self):
+        """hehehe"""
+
+    def meth15(self):
+        """hehehe"""
+
+    def meth16(self):
+        """hehehe"""
+
+    def meth17(self):
+        """hehehe"""
+
+    def meth18(self):
+        """hehehe"""
+
+    def meth19(self):
+        """hehehe"""
+
+    def meth20(self):
+        """hehehe"""
+
+    def meth21(self):
+        """hehehe"""
+
+    def _dontcount(self):
+        """not public"""
+
+class BBB(Aaaa):
+    """Don't emit for methods defined in the parent."""
+    def meth1(self):
+        """trop"""
+    def meth2(self):
+        """tzop"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/defined_and_used_on_same_line.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/defined_and_used_on_same_line.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/defined_and_used_on_same_line.py	(revision 1126)
@@ -0,0 +1,29 @@
+"""Check for definitions and usage happening on the same line."""
+#pylint: disable=missing-docstring,multiple-statements,no-absolute-import,parameter-unpacking,wrong-import-position
+from __future__ import print_function
+print([index
+       for index in range(10)])
+
+print((index
+       for index in range(10)))
+
+FILTER_FUNC = lambda x: not x
+
+def func(xxx): return xxx
+
+def func2(xxx): return xxx + func2(1)
+
+import sys; print(sys.exc_info())
+
+for i in range(10): print(i)
+
+j = 4; LAMB = lambda x: x+j
+
+FUNC4 = lambda a, b: a != b
+
+# test http://www.logilab.org/ticket/6954:
+
+with open('f') as f: print(f.read())
+
+with open('f') as f, open(f.read()) as g:
+    print(g.read())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""Suspicious str.strip calls."""
+__revision__ = 1
+
+''.strip('yo')
+''.strip()
+
+u''.strip('http://')  # [bad-str-strip-call]
+u''.lstrip('http://')  # [bad-str-strip-call]
+b''.rstrip('http://')  # [bad-str-strip-call]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.py	(revision 1126)
@@ -0,0 +1,37 @@
+"""Warnings for using open() with an invalid mode string."""
+
+open('foo.bar', 'w', 2)
+open('foo.bar', 'rw')  # [bad-open-mode]
+open(name='foo.bar', buffering=10, mode='rw')  # [bad-open-mode]
+open(mode='rw', name='foo.bar')  # [bad-open-mode]
+open('foo.bar', 'U+')
+open('foo.bar', 'rb+')
+open('foo.bar', 'Uw')  # [bad-open-mode]
+open('foo.bar', 2)  # [bad-open-mode]
+open('foo.bar', buffering=2)
+WRITE_MODE = 'w'
+open('foo.bar', 'U' + WRITE_MODE + 'z')  # [bad-open-mode]
+open('foo.bar', 'br')  # [bad-open-mode]
+open('foo.bar', 'wU')  # [bad-open-mode]
+open('foo.bar', 'r+b')
+open('foo.bar', 'r+')
+open('foo.bar', 'w+')
+open('foo.bar', 'xb')  # [bad-open-mode]
+open('foo.bar', 'rx')  # [bad-open-mode]
+open('foo.bar', 'Ur')
+open('foo.bar', 'rU')
+open('foo.bar', 'rUb')
+open('foo.bar', 'rUb+')
+open('foo.bar', 'rU+b')
+open('foo.bar', 'r+Ub')
+open('foo.bar', '+rUb')  # [bad-open-mode]
+open('foo.bar', 'ab+')
+open('foo.bar', 'a+b')
+open('foo.bar', 'aU')  # [bad-open-mode]
+open('foo.bar', 'U+b')
+open('foo.bar', '+Ub')
+open('foo.bar', 'b+U')
+open('foo.bar', 'Urb+')
+open('foo.bar', 'Ur+b')
+open('foo.bar', 'Ubr')  # [bad-open-mode]
+open('foo.bar', 'Ut')  # [bad-open-mode]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""errors-only is not usable as an inline option"""
+# +1: [bad-inline-option]
+# pylint: errors-only
+
+CONST = "This is not a pylint: inline option."
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_argument_name.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_argument_name.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_argument_name.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""Check for duplicate function arguments."""
+
+
+def foo1(_, _): # [duplicate-argument-name]
+    """Function with duplicate argument name."""
+
+def foo2(_, *_): # [duplicate-argument-name]
+    """Function with duplicate argument name."""
+
+def foo3(_, _=3): # [duplicate-argument-name]
+    """Function with duplicate argument name."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.txt	(revision 1126)
@@ -0,0 +1 @@
+syntax-error:1::"unknown encoding: IBO-8859-1"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_return_statements.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_return_statements.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_return_statements.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-return-statements:3:stupid_function:Too many return statements (11/6)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.txt	(revision 1126)
@@ -0,0 +1,4 @@
+unpacking-in-except:7:new_style:Implicit unpacking of exceptions is not supported in Python 3
+redefine-in-handler:10:new_style:Redefining name 'new_style' from outer scope (line 3) in exception handler
+redefine-in-handler:10:new_style:Redefining name 'tuple' from builtins in exception handler
+unpacking-in-except:10:new_style:Implicit unpacking of exceptions is not supported in Python 3
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unrecognized_inline_option.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unrecognized_inline_option.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unrecognized_inline_option.py	(revision 1126)
@@ -0,0 +1,3 @@
+# +1: [unrecognized-inline-option]
+# pylint:bouboule=1
+"""Check unknown option"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.txt	(revision 1126)
@@ -0,0 +1,4 @@
+exec-used:3::Use of exec
+exec-used:5::Use of exec
+exec-used:7::Use of exec
+exec-used:10:func:Use of exec
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsubscriptable_value.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsubscriptable_value.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsubscriptable_value.txt	(revision 1126)
@@ -0,0 +1,14 @@
+unsubscriptable-object:32::Value 'NonSubscriptable()' is unsubscriptable
+unsubscriptable-object:33::Value 'NonSubscriptable' is unsubscriptable
+unsubscriptable-object:35::Value 'Subscriptable' is unsubscriptable
+unsubscriptable-object:44::Value 'powers_of_two()' is unsubscriptable
+unsubscriptable-object:45::Value 'powers_of_two' is unsubscriptable
+unsubscriptable-object:49::Value 'True' is unsubscriptable
+unsubscriptable-object:50::Value 'None' is unsubscriptable
+unsubscriptable-object:51::Value '8.5' is unsubscriptable
+unsubscriptable-object:52::Value '10' is unsubscriptable
+unsubscriptable-object:55::Value '{(x) ** (2) for x in range(10)}' is unsubscriptable
+unsubscriptable-object:56::Value 'set(numbers)' is unsubscriptable
+unsubscriptable-object:57::Value 'frozenset(numbers)' is unsubscriptable
+unsubscriptable-object:77::Value 'SubscriptableClass()' is unsubscriptable
+unsubscriptable-object:84::Value 'test' is unsubscriptable
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value_py30.txt	(revision 1126)
@@ -0,0 +1,14 @@
+dangerous-default-value:6:function1:Dangerous default value [] as argument
+dangerous-default-value:10:function2:Dangerous default value HEHE (builtins.dict) as argument
+dangerous-default-value:18:function4:Dangerous default value set() (builtins.set) as argument
+dangerous-default-value:28:function6:Dangerous default value GLOBAL_SET (builtins.set) as argument
+dangerous-default-value:32:function7:Dangerous default value dict() (builtins.dict) as argument
+dangerous-default-value:36:function8:Dangerous default value list() (builtins.list) as argument
+dangerous-default-value:40:function9:Dangerous default value [] as argument
+dangerous-default-value:44:function10:Dangerous default value {} as argument
+dangerous-default-value:48:function11:Dangerous default value list() (builtins.list) as argument
+dangerous-default-value:52:function12:Dangerous default value dict() (builtins.dict) as argument
+dangerous-default-value:61:function13:Dangerous default value OINK (builtins.dict) as argument
+dangerous-default-value:65:function14:Dangerous default value dict() (builtins.dict) as argument
+dangerous-default-value:73:function15:Dangerous default value INVALID_DICT (builtins.dict) as argument
+dangerous-default-value:77:function16:Dangerous default value set() as argument
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_final_newline.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_final_newline.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_final_newline.txt	(revision 1126)
@@ -0,0 +1 @@
+missing-final-newline:4::Final newline missing
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.py	(revision 1126)
@@ -0,0 +1,111 @@
+"""Check that instantiating a class with
+`abc.ABCMeta` as metaclass fails if it defines
+abstract methods.
+"""
+
+# pylint: disable=too-few-public-methods, missing-docstring
+# pylint: disable=abstract-method, import-error
+
+import abc
+import weakref
+from lala import Bala
+
+
+class GoodClass(object, metaclass=abc.ABCMeta):
+    pass
+
+class SecondGoodClass(object, metaclass=abc.ABCMeta):
+    def test(self):
+        """ do nothing. """
+
+class ThirdGoodClass(object, metaclass=abc.ABCMeta):
+    """ This should not raise the warning. """
+    def test(self):
+        raise NotImplementedError()
+
+class BadClass(object, metaclass=abc.ABCMeta):
+    @abc.abstractmethod
+    def test(self):
+        """ do nothing. """
+
+class SecondBadClass(object, metaclass=abc.ABCMeta):
+    @property
+    @abc.abstractmethod
+    def test(self):
+        """ do nothing. """
+
+class ThirdBadClass(SecondBadClass):
+    pass
+
+
+class Structure(object, metaclass=abc.ABCMeta):
+    @abc.abstractmethod
+    def __iter__(self):
+        pass
+    @abc.abstractmethod
+    def __len__(self):
+        pass
+    @abc.abstractmethod
+    def __contains__(self, _):
+        pass
+    @abc.abstractmethod
+    def __hash__(self):
+        pass
+
+class Container(Structure):
+    def __contains__(self, _):
+        pass
+
+class Sizable(Structure):
+    def __len__(self):
+        pass
+
+class Hashable(Structure):
+    __hash__ = 42
+
+
+class Iterator(Structure):
+    def keys(self): # pylint: disable=no-self-use
+        return iter([1, 2, 3])
+
+    __iter__ = keys
+
+class AbstractSizable(Structure):
+    @abc.abstractmethod
+    def length(self):
+        pass
+    __len__ = length
+
+class NoMroAbstractMethods(Container, Iterator, Sizable, Hashable):
+    pass
+
+class BadMroAbstractMethods(Container, Iterator, AbstractSizable):
+    pass
+
+class SomeMetaclass(metaclass=abc.ABCMeta):
+
+    @abc.abstractmethod
+    def prop(self):
+        pass
+
+class FourthGoodClass(SomeMetaclass):
+    """Don't consider this abstract if some attributes are
+    there, but can't be inferred.
+    """
+    prop = Bala # missing
+
+
+def main():
+    """ do nothing """
+    GoodClass()
+    SecondGoodClass()
+    ThirdGoodClass()
+    FourthGoodClass()
+    weakref.WeakKeyDictionary()
+    weakref.WeakValueDictionary()
+    NoMroAbstractMethods()
+
+    BadMroAbstractMethods() # [abstract-class-instantiated]
+    BadClass() # [abstract-class-instantiated]
+    SecondBadClass() # [abstract-class-instantiated]
+    ThirdBadClass() # [abstract-class-instantiated]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exception_is_binary_op.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exception_is_binary_op.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exception_is_binary_op.py	(revision 1126)
@@ -0,0 +1,12 @@
+"""Warn about binary operations used as exceptions."""
+from __future__ import print_function
+try:
+    pass
+except Exception or BaseException:  # [binary-op-exception]
+    print("caught1")
+except Exception and BaseException:  # [binary-op-exception]
+    print("caught2")
+except Exception or BaseException:  # [binary-op-exception]
+    print("caught3")
+except (Exception or BaseException) as exc:  # [binary-op-exception]
+    print("caught4")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking_py30.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking_py30.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking_py30.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target_py35.txt	(revision 1126)
@@ -0,0 +1 @@
+star-needs-assignment-target:15::Can use starred expression only in assignment target
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.py	(revision 1126)
@@ -0,0 +1,88 @@
+"""Test abstract-method warning."""
+from __future__ import print_function
+
+# pylint: disable=missing-docstring, no-init, no-self-use
+# pylint: disable=too-few-public-methods
+import abc
+
+class Abstract(object):
+    def aaaa(self):
+        """should be overridden in concrete class"""
+        raise NotImplementedError()
+
+    def bbbb(self):
+        """should be overridden in concrete class"""
+        raise NotImplementedError()
+
+
+class AbstractB(Abstract):
+    """Abstract class.
+
+    this class is checking that it does not output an error msg for
+    unimplemeted methods in abstract classes
+    """
+    def cccc(self):
+        """should be overridden in concrete class"""
+        raise NotImplementedError()
+
+class Concret(Abstract): # [abstract-method]
+    """Concrete class"""
+
+    def aaaa(self):
+        """overidden form Abstract"""
+
+
+class Structure(object, metaclass=abc.ABCMeta):
+    @abc.abstractmethod
+    def __iter__(self):
+        pass
+    @abc.abstractmethod
+    def __len__(self):
+        pass
+    @abc.abstractmethod
+    def __contains__(self, _):
+        pass
+    @abc.abstractmethod
+    def __hash__(self):
+        pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Container(Structure):
+    def __contains__(self, _):
+        pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Sizable(Structure):
+    def __len__(self):
+        pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Hashable(Structure):
+    __hash__ = 42
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class Iterator(Structure):
+    def keys(self):
+        return iter([1, 2, 3])
+
+    __iter__ = keys
+
+
+class AbstractSizable(Structure):
+    @abc.abstractmethod
+    def length(self):
+        pass
+    __len__ = length
+
+
+class GoodComplexMRO(Container, Iterator, Sizable, Hashable):
+    pass
+
+
+# +1: [abstract-method, abstract-method, abstract-method]
+class BadComplexMro(Container, Iterator, AbstractSizable):
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/multiple_imports.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/multiple_imports.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/multiple_imports.txt	(revision 1126)
@@ -0,0 +1 @@
+multiple-imports:2::Multiple imports on one line (os, socket)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/statement_without_effect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/statement_without_effect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/statement_without_effect.py	(revision 1126)
@@ -0,0 +1,65 @@
+"""Test for statements without effects."""
+# pylint: disable=too-few-public-methods
+
+# +1:[pointless-string-statement]
+"""inline doc string should use a separated message"""
+
+__revision__ = ''
+
+__revision__  # [pointless-statement]
+
+__revision__ <= 1  # [pointless-statement]
+
+__revision__.lower()
+
+[i for i in __revision__]  # [pointless-statement]
+
+# +1:[pointless-string-statement]
+"""inline doc string should use a separated message"""
+
+
+__revision__.lower();  # [unnecessary-semicolon]
+
+list() and tuple()  # [expression-not-assigned]
+
+def to_be():
+    """return 42"""
+    return "42"
+
+ANSWER = to_be() # ok
+ANSWER == to_be()  # [expression-not-assigned]
+
+to_be() or not to_be()  # [expression-not-assigned]
+to_be().title  # [expression-not-assigned]
+
+GOOD_ATTRIBUTE_DOCSTRING = 42
+"""Module level attribute docstring is fine. """
+
+class ClassLevelAttributeTest(object):
+    """ test attribute docstrings. """
+
+    good_attribute_docstring = 24
+    """ class level attribute docstring is fine either. """
+    second_good_attribute_docstring = 42
+    # Comments are good.
+
+    # empty lines are good, too.
+    """ Still a valid class level attribute docstring. """
+
+    def __init__(self):
+        self.attr = 42
+        """ Good attribute docstring """
+        attr = 24
+        """ Still a good __init__ level attribute docstring. """
+        val = 0
+        for val in range(42):
+            val += attr
+        # +1:[pointless-string-statement]
+        """ Invalid attribute docstring """
+        self.val = val
+
+    def test(self):
+        """ invalid attribute docstrings here. """
+        self.val = 42
+        # +1:[pointless-string-statement]
+        """ this is an invalid attribute docstring. """
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_raised.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_raised.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_raised.txt	(revision 1126)
@@ -0,0 +1,12 @@
+nonstandard-exception:38:bad_case0:"Exception doesn't inherit from standard ""Exception"" class"
+raising-non-exception:38:bad_case0:Raising a new style class which doesn't inherit from BaseException
+raising-non-exception:42:bad_case1:Raising a new style class which doesn't inherit from BaseException
+nonstandard-exception:48:bad_case2:"Exception doesn't inherit from standard ""Exception"" class"
+raising-non-exception:48:bad_case2:Raising a new style class which doesn't inherit from BaseException
+raising-non-exception:52:bad_case3:Raising a new style class which doesn't inherit from BaseException
+notimplemented-raised:56:bad_case4:NotImplemented raised - should raise NotImplementedError
+raising-bad-type:60:bad_case5:Raising int while only classes or instances are allowed
+raising-bad-type:64:bad_case6:Raising NoneType while only classes or instances are allowed
+raising-non-exception:68:bad_case7:Raising a new style class which doesn't inherit from BaseException
+raising-non-exception:72:bad_case8:Raising a new style class which doesn't inherit from BaseException
+raising-non-exception:76:bad_case9:Raising a new style class which doesn't inherit from BaseException
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.txt	(revision 1126)
@@ -0,0 +1 @@
+not-an-iterable:7:to_ten:Non-iterable value 10 is used in an iterating context
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines_disabled.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines_disabled.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines_disabled.py	(revision 1126)
@@ -0,0 +1,1018 @@
+"""Test that disabling too-many-lines on any line works."""
+
+
+
+# pylint: disable=too-many-lines
+__revision__ = 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ZERFZAER = 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+HEHEHE = 2
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confusing_with_statement.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confusing_with_statement.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confusing_with_statement.py	(revision 1126)
@@ -0,0 +1,27 @@
+# pylint: disable=undefined-variable,not-context-manager,missing-docstring
+
+# both context managers are named
+with one as first, two as second:
+    pass
+
+# first matched as tuple; this is ok
+with one as (first, second), third:
+    pass
+
+# the first context manager doesn't have as name
+with one, two as second:
+    pass
+
+# the second is a function call; this is ok
+with one as first, two():
+    pass
+
+# nested with statements; make sure no message is emited
+# this could be a false positive on Py2
+with one as first:
+    with two:
+        pass
+
+# ambiguous looking with statement
+with one as first, two:  # [confusing-with-statement]
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/reimported.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/reimported.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/reimported.py	(revision 1126)
@@ -0,0 +1,7 @@
+# pylint: disable=missing-docstring,unused-import,import-error
+
+from time import sleep, sleep # [reimported]
+from lala import missing, missing # [reimported]
+
+import missing1
+import missing1 # [reimported]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_arguments.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_arguments.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_arguments.py	(revision 1126)
@@ -0,0 +1,4 @@
+# pylint: disable=missing-docstring
+
+def stupid_function(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9): # [too-many-arguments]
+    return arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/non_iterator_returned.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/non_iterator_returned.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/non_iterator_returned.py	(revision 1126)
@@ -0,0 +1,95 @@
+"""Check non-iterators returned by __iter__ """
+
+# pylint: disable=too-few-public-methods, missing-docstring, no-self-use
+
+import six
+
+class FirstGoodIterator(object):
+    """ yields in iterator. """
+
+    def __iter__(self):
+        for index in range(10):
+            yield index
+
+class SecondGoodIterator(object):
+    """ __iter__ and next """
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        """ Infinite iterator, but still an iterator """
+        return 1
+
+    def next(self):
+        """Same as __next__, but for Python 2."""
+        return 1
+
+class ThirdGoodIterator(object):
+    """ Returns other iterator, not the current instance """
+
+    def __iter__(self):
+        return SecondGoodIterator()
+
+class FourthGoodIterator(object):
+    """ __iter__ returns iter(...) """
+
+    def __iter__(self):
+        return iter(range(10))
+
+
+class IteratorMetaclass(type):
+    def __next__(cls):
+        return 1
+
+    def next(cls):
+        return 2
+
+
+@six.add_metaclass(IteratorMetaclass)
+class IteratorClass(object):
+    """Iterable through the metaclass."""
+
+
+class FifthGoodIterator(object):
+    """__iter__ returns a class which uses an iterator-metaclass."""
+    def __iter__(self):
+        return IteratorClass
+
+class FileBasedIterator(object):
+    def __init__(self, path):
+        self.path = path
+        self.file = None
+
+    def __iter__(self):
+        if self.file is not None:
+            self.file.close()
+        self.file = open(self.path)
+        # self file has two infered values: None and <instance of 'file'>
+        # we don't want to emit error in this case
+        return self.file
+
+
+class FirstBadIterator(object):
+    """ __iter__ returns a list """
+
+    def __iter__(self): # [non-iterator-returned]
+        return []
+
+class SecondBadIterator(object):
+    """ __iter__ without next """
+
+    def __iter__(self): # [non-iterator-returned]
+        return self
+
+class ThirdBadIterator(object):
+    """ __iter__ returns an instance of another non-iterator """
+
+    def __iter__(self): # [non-iterator-returned]
+        return SecondBadIterator()
+
+class FourthBadIterator(object):
+    """__iter__ returns a class."""
+
+    def __iter__(self): # [non-iterator-returned]
+        return ThirdBadIterator
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.py	(revision 1126)
@@ -0,0 +1,59 @@
+"""Test for unsupported-binary-operation."""
+# pylint: disable=missing-docstring,too-few-public-methods,pointless-statement
+# pylint: disable=expression-not-assigned, invalid-name
+
+
+import collections
+
+
+1 + "a" # [unsupported-binary-operation]
+1 - [] # [unsupported-binary-operation]
+1 * {} # [unsupported-binary-operation]
+1 / collections # [unsupported-binary-operation]
+1 ** (lambda x: x) # [unsupported-binary-operation]
+{} * {} # [unsupported-binary-operation]
+{} - {} # [unsupported-binary-operation]
+{} | {} # [unsupported-binary-operation]
+{} >> {} # [unsupported-binary-operation]
+[] + () # [unsupported-binary-operation]
+() + [] # [unsupported-binary-operation]
+[] * 2.0 # [unsupported-binary-operation]
+() * 2.0 # [unsupported-binary-operation]
+2.0 >> 2.0 # [unsupported-binary-operation]
+class A(object):
+    pass
+class B(object):
+    pass
+A() + B() # [unsupported-binary-operation]
+class A1(object):
+    def __add__(self, other):
+        return NotImplemented
+
+A1() + A1() # [unsupported-binary-operation]
+
+class A2(object):
+    def __add__(self, other):
+        return NotImplemented
+class B2(object):
+    def __radd__(self, other):
+        return NotImplemented
+A2() + B2() # [unsupported-binary-operation]
+
+class Parent(object):
+    pass
+class Child(Parent):
+    def __add__(self, other):
+        return NotImplemented
+Child() + Parent() # [unsupported-binary-operation]
+class A3(object):
+    def __add__(self, other):
+        return NotImplemented
+class B3(A3):
+    def __radd__(self, other):
+        return NotImplemented
+A3() + B3() # [unsupported-binary-operation]
+# Augmented
+FFF = 1
+FFF += A() # [unsupported-binary-operation]
+TTT = 1
+TTT += [] # [unsupported-binary-operation]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+max_pyver=3.0
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context.txt	(revision 1126)
@@ -0,0 +1,10 @@
+not-an-iterable:58::Non-iterable value powers_of_two is used in an iterating context
+not-an-iterable:93::Non-iterable value A() is used in an iterating context
+not-an-iterable:95::Non-iterable value B is used in an iterating context
+not-an-iterable:96::Non-iterable value A() is used in an iterating context
+not-an-iterable:100::Non-iterable value B is used in an iterating context
+not-an-iterable:103::Non-iterable value range is used in an iterating context
+not-an-iterable:107::Non-iterable value True is used in an iterating context
+not-an-iterable:110::Non-iterable value None is used in an iterating context
+not-an-iterable:113::Non-iterable value 8.5 is used in an iterating context
+not-an-iterable:116::Non-iterable value 10 is used in an iterating context
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ctor_arguments.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ctor_arguments.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ctor_arguments.txt	(revision 1126)
@@ -0,0 +1,24 @@
+no-value-for-parameter:35::No value for argument 'first_argument' in constructor call
+too-many-function-args:36::Too many positional arguments for constructor call
+no-value-for-parameter:38::No value for argument 'third_argument' in constructor call
+no-value-for-parameter:40::No value for argument 'first_argument' in constructor call
+no-value-for-parameter:40::No value for argument 'second_argument' in constructor call
+no-value-for-parameter:40::No value for argument 'third_argument' in constructor call
+too-many-function-args:42::Too many positional arguments for constructor call
+no-value-for-parameter:47::No value for argument 'first_argument' in constructor call
+unexpected-keyword-arg:47::Unexpected keyword argument 'bob' in constructor call
+unexpected-keyword-arg:48::Unexpected keyword argument 'coin' in constructor call
+redundant-keyword-arg:50::Argument 'one' passed by position and keyword in constructor call
+no-value-for-parameter:53::No value for argument 'first_argument' in constructor call
+too-many-function-args:54::Too many positional arguments for constructor call
+too-many-function-args:60::Too many positional arguments for constructor call
+too-many-function-args:63::Too many positional arguments for constructor call
+no-value-for-parameter:64::No value for argument 'first_argument' in constructor call
+unexpected-keyword-arg:64::Unexpected keyword argument 'one' in constructor call
+too-many-function-args:85::Too many positional arguments for constructor call
+unexpected-keyword-arg:85::Unexpected keyword argument 'badarg' in constructor call
+too-many-function-args:95:Clsmethod.from_nothing:Too many positional arguments for constructor call
+no-value-for-parameter:99:Clsmethod.from_nothing1:"No value for argument 'first' in constructor call"
+no-value-for-parameter:99:Clsmethod.from_nothing1:"No value for argument 'second' in constructor call"
+no-value-for-parameter:104:Clsmethod.from_nothing2:"No value for argument 'second' in constructor call"
+unexpected-keyword-arg:104:Clsmethod.from_nothing2:"Unexpected keyword argument 'not_argument' in constructor call"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_inline_option.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[Messages Control]
+enable=I
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.py	(revision 1126)
@@ -0,0 +1,19 @@
+# pylint: disable=missing-docstring,invalid-name,too-few-public-methods,no-self-use
+from __future__ import print_function
+
+def test(**kwargs):
+    print(kwargs)
+
+# metaclasses as mappings
+class Meta(type):
+    def __getitem__(cls, key):
+        return ord(key)
+
+    def keys(cls):
+        return ['a', 'b', 'c']
+
+class SomeClass(metaclass=Meta):
+    pass
+
+test(**SomeClass)
+test(**SomeClass())  # [not-a-mapping]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/cellvar_escaping_loop.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/cellvar_escaping_loop.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/cellvar_escaping_loop.py	(revision 1126)
@@ -0,0 +1,130 @@
+# pylint: disable=print-statement
+"""Tests for loopvar-in-closure."""
+from __future__ import print_function
+
+def good_case():
+    """No problems here."""
+    lst = []
+    for i in range(10):
+        lst.append(i)
+
+
+def good_case2():
+    """No problems here."""
+    return [i for i in range(10)]
+
+
+def good_case3():
+    """No problems here."""
+    lst = []
+    for i in range(10):  # [unused-variable]
+        lst.append(lambda i=i: i)
+
+
+def good_case4():
+    """No problems here."""
+    lst = []
+    for i in range(10):
+        print(i)
+        lst.append(lambda i: i)
+
+
+def good_case5():
+    """No problems here."""
+    return (i for i in range(10))
+
+
+def good_case6():
+    """Accept use of the variable after the loop.
+
+    There's already a warning about possibly undefined loop variables, and
+    the value will not change any more."""
+    for i in range(10):
+        print(i)
+    return lambda: i  # [undefined-loop-variable]
+
+
+def good_case7():
+    """Accept use of the variable inside return."""
+    for i in range(10):
+        if i == 8:
+            return lambda: i
+    return lambda: -1
+
+
+def good_case8():
+    """Lambda defined and called in loop."""
+    for i in range(10):
+        print((lambda x: i + x)(1))
+
+
+def good_case9():
+    """Another eager binding of the cell variable."""
+    funs = []
+    for i in range(10):
+        def func(bound_i=i):
+            """Ignore."""
+            return bound_i
+        funs.append(func)
+    return funs
+
+
+def bad_case():
+    """Closing over a loop variable."""
+    lst = []
+    for i in range(10):
+        print(i)
+        lst.append(lambda: i)  # [cell-var-from-loop]
+
+
+def bad_case2():
+    """Closing over a loop variable."""
+    return [lambda: i for i in range(10)]  # [cell-var-from-loop]
+
+
+def bad_case3():
+    """Closing over variable defined in loop."""
+    lst = []
+    for i in range(10):
+        j = i * i
+        lst.append(lambda: j)  # [cell-var-from-loop]
+    return lst
+
+
+def bad_case4():
+    """Closing over variable defined in loop."""
+    lst = []
+    for i in range(10):
+        def nested():
+            """Nested function."""
+            return i**2  # [cell-var-from-loop]
+        lst.append(nested)
+    return lst
+
+
+def bad_case5():
+    """Problematic case.
+
+    If this function is used as
+
+    >>> [x() for x in bad_case5()]
+
+    it behaves 'as expected', i.e. the result is range(10).
+
+    If it's used with
+
+    >>> lst = list(bad_case5())
+    >>> [x() for x in lst]
+
+    the result is [9] * 10 again.
+    """
+    return (lambda: i for i in range(10))  # [cell-var-from-loop]
+
+
+def bad_case6():
+    """Closing over variable defined in loop."""
+    lst = []
+    for i, j in zip(range(10), range(10, 20)):
+        print(j)
+        lst.append(lambda: i)  # [cell-var-from-loop]
+    return lst
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_comparison_constant.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_comparison_constant.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_comparison_constant.txt	(revision 1126)
@@ -0,0 +1,6 @@
+misplaced-comparison-constant:19:bad_comparisons:Comparison should be i >= 5
+misplaced-comparison-constant:21:bad_comparisons:Comparison should be i == 1
+misplaced-comparison-constant:23:bad_comparisons:Comparison should be dummy_return() > 3
+misplaced-comparison-constant:25:bad_comparisons:Comparison should be instance.dummy_return() != 4
+misplaced-comparison-constant:27:bad_comparisons:Comparison should be instance.attr == 1
+misplaced-comparison-constant:29:bad_comparisons:Comparison should be instance.attr == 'aaa'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.py	(revision 1126)
@@ -0,0 +1,71 @@
+"""Test that an async context manager receives a proper object."""
+# pylint: disable=missing-docstring, import-error, too-few-public-methods
+import contextlib
+
+from ala import Portocala
+
+
+@contextlib.contextmanager
+def ctx_manager():
+    yield
+
+
+class ContextManager(object):
+    def __enter__(self):
+        pass
+    def __exit__(self, *args):
+        pass
+
+class PartialAsyncContextManager(object):
+    def __aenter__(self):
+        pass
+
+class SecondPartialAsyncContextManager(object):
+    def __aexit__(self, *args):
+        pass
+
+class UnknownBases(Portocala):
+    def __aenter__(self):
+        pass
+
+
+class AsyncManagerMixin(object):
+    pass
+
+class GoodAsyncManager(object):
+    def __aenter__(self):
+        pass
+    def __aexit__(self, *args):
+        pass
+
+class InheritExit(object):
+    def __aexit__(self, *args):
+        pass
+
+class SecondGoodAsyncManager(InheritExit):
+    def __aenter__(self):
+        pass
+
+
+async def bad_coro():
+    async with 42: # [not-async-context-manager]
+        pass
+    async with ctx_manager(): # [not-async-context-manager]
+        pass
+    async with ContextManager(): # [not-async-context-manager]
+        pass
+    async with PartialAsyncContextManager(): # [not-async-context-manager]
+        pass
+    async with SecondPartialAsyncContextManager(): # [not-async-context-manager]
+        pass
+
+
+async def good_coro():
+    async with UnknownBases():
+        pass
+    async with AsyncManagerMixin():
+        pass
+    async with GoodAsyncManager():
+        pass
+    async with SecondGoodAsyncManager():
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/superfluous_parens.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/superfluous_parens.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/superfluous_parens.txt	(revision 1126)
@@ -0,0 +1,5 @@
+superfluous-parens:5::Unnecessary parens after 'if' keyword
+superfluous-parens:7::Unnecessary parens after 'not' keyword
+superfluous-parens:11::Unnecessary parens after 'for' keyword
+superfluous-parens:13::Unnecessary parens after 'if' keyword
+superfluous-parens:18::Unnecessary parens after 'del' keyword
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/eval_used.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/eval_used.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/eval_used.txt	(revision 1126)
@@ -0,0 +1,4 @@
+eval-used:3::Use of eval
+eval-used:4::Use of eval
+eval-used:6::Use of eval
+eval-used:10:func:Use of eval
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.txt	(revision 1126)
@@ -0,0 +1 @@
+anomalous-unicode-escape-in-string:5::"Anomalous Unicode escape in byte string: '\u'. String constant might be missing an r or u prefix."
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/useless_else_on_loop.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/useless_else_on_loop.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/useless_else_on_loop.txt	(revision 1126)
@@ -0,0 +1,5 @@
+useless-else-on-loop:10:test_return_for:Else clause on loop without a break statement
+useless-else-on-loop:17:test_return_while:Else clause on loop without a break statement
+useless-else-on-loop:26::Else clause on loop without a break statement
+useless-else-on-loop:33::Else clause on loop without a break statement
+useless-else-on-loop:38::Else clause on loop without a break statement
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unreachable.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unreachable.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unreachable.py	(revision 1126)
@@ -0,0 +1,22 @@
+# pylint: disable=missing-docstring
+
+from __future__ import print_function
+
+def func1():
+    return 1
+    print('unreachable') # [unreachable]
+
+def func2():
+    while 1:
+        break
+        print('unreachable') # [unreachable]
+
+def func3():
+    for i in (1, 2, 3):
+        print(i)
+        continue
+        print('unreachable') # [unreachable]
+
+def func4():
+    raise Exception
+    return 1 / 0 # [unreachable]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unrecognized_inline_option.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unrecognized_inline_option.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unrecognized_inline_option.txt	(revision 1126)
@@ -0,0 +1 @@
+unrecognized-inline-option:2::"Unrecognized file option 'bouboule'"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_nested_blocks.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_nested_blocks.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_nested_blocks.txt	(revision 1126)
@@ -0,0 +1,2 @@
+too-many-nested-blocks:6:my_function:Too many nested blocks (6/5)
+too-many-nested-blocks:76:else_if_function:Too many nested blocks (7/5)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""Test for *a = b """
+
+*FIRST = [1, 2, 3] # [invalid-star-assignment-target]
+(*FIRST, ) = [1, 2, 3]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_staticmethod_decorator.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_staticmethod_decorator.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_staticmethod_decorator.txt	(revision 1126)
@@ -0,0 +1,3 @@
+no-staticmethod-decorator:14:MyClass:Consider using a decorator instead of calling staticmethod
+no-staticmethod-decorator:17:MyClass:Consider using a decorator instead of calling staticmethod
+no-staticmethod-decorator:25:MyClass:Consider using a decorator instead of calling staticmethod
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/useless_else_on_loop.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/useless_else_on_loop.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/useless_else_on_loop.py	(revision 1126)
@@ -0,0 +1,55 @@
+"""Check for else branches on loops with break an return only."""
+from __future__ import print_function
+__revision__ = 0
+
+def test_return_for():
+    """else + return is not accetable."""
+    for i in range(10):
+        if i % 2:
+            return i
+    else:  # [useless-else-on-loop]
+        print('math is broken')
+
+def test_return_while():
+    """else + return is not accetable."""
+    while True:
+        return 1
+    else:  # [useless-else-on-loop]
+        print('math is broken')
+
+
+while True:
+    def short_fun():
+        """A function with a loop."""
+        for _ in range(10):
+            break
+else:  # [useless-else-on-loop]
+    print('or else!')
+
+
+while True:
+    while False:
+        break
+else:  # [useless-else-on-loop]
+    print('or else!')
+
+for j in range(10):
+    pass
+else:  # [useless-else-on-loop]
+    print('fat chance')
+    for j in range(10):
+        break
+
+def test_return_for2():
+    """no false positive for break in else
+
+    https://bitbucket.org/logilab/pylint/issue/117/useless-else-on-loop-false-positives
+    """
+    for i in range(10):
+        for i in range(i):
+            if i % 2:
+                break
+        else:
+            break
+    else:
+        print('great math')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/import_error.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/import_error.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/import_error.py	(revision 1126)
@@ -0,0 +1,36 @@
+""" Test that import errors are detected. """
+# pylint: disable=invalid-name, unused-import, no-absolute-import, bare-except, broad-except
+import totally_missing # [import-error]
+
+try:
+    import maybe_missing
+except ImportError:
+    maybe_missing = None
+
+try:
+    import maybe_missing_1
+except (ImportError, SyntaxError):
+    maybe_missing_1 = None
+
+try:
+    import maybe_missing_2 # [import-error]
+except ValueError:
+    maybe_missing_2 = None
+
+try:
+    import dont_emit
+except Exception:
+    pass
+
+try:
+    import please_dont_emit
+except:
+    pass
+
+try:
+    if maybe_missing:
+        import really_missing
+except ImportError:
+    pass
+
+from .collections import missing # [import-error]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.py	(revision 1126)
@@ -0,0 +1 @@
+"a {} {".format(1) # [bad-format-string]
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_few_public_methods.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_few_public_methods.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_few_public_methods.py	(revision 1126)
@@ -0,0 +1,29 @@
+# pylint: disable=missing-docstring
+from __future__ import print_function
+
+class Aaaa(object): # [too-few-public-methods]
+
+    def __init__(self):
+        pass
+
+    def meth1(self):
+        print(self)
+
+    def _dontcount(self):
+        print(self)
+
+
+# Don't emit for these cases.
+class Klass(object):
+    """docstring"""
+
+    def meth1(self):
+        """first"""
+
+    def meth2(self):
+        """second"""
+
+
+class EnoughPublicMethods(Klass):
+    """We shouldn't emit too-few-public-methods for this."""
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_statements.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_statements.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_statements.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-statements:5:stupid_function:Too many statements (55/50)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.txt	(revision 1126)
@@ -0,0 +1 @@
+syntax-error:1::invalid syntax
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting.txt	(revision 1126)
@@ -0,0 +1,40 @@
+too-many-format-args:58:pprint_bad:Too many arguments for format string
+bad-format-string:59:pprint_bad:Invalid format string
+bad-format-string:60:pprint_bad:Invalid format string
+format-combined-specification:61:pprint_bad:Format string contains both automatic field numbering and manual field specification
+missing-format-argument-key:63:pprint_bad:Missing keyword argument 'b' for format string
+unused-format-string-argument:63:pprint_bad:Unused format argument 'c'
+missing-format-argument-key:64:pprint_bad:Missing keyword argument 'a' for format string
+too-few-format-args:65:pprint_bad:Not enough arguments for format string
+too-many-format-args:66:pprint_bad:Too many arguments for format string
+missing-format-argument-key:68:pprint_bad:Missing keyword argument 'a' for format string
+missing-format-argument-key:68:pprint_bad:Missing keyword argument 'b' for format string
+missing-format-argument-key:68:pprint_bad:Missing keyword argument 'c' for format string
+too-few-format-args:69:pprint_bad:Not enough arguments for format string
+missing-format-argument-key:71:pprint_bad:Missing keyword argument 'a' for format string
+missing-format-argument-key:71:pprint_bad:Missing keyword argument 'b' for format string
+missing-format-argument-key:72:pprint_bad:Missing keyword argument 'a' for format string
+missing-format-attribute:74:pprint_bad:Missing format attribute 'length' in format specifier 'a.ids.__len__.length'
+invalid-format-index:75:pprint_bad:Using invalid lookup key 400 in format specifier 'a.ids[3][400]'
+invalid-format-index:76:pprint_bad:"Using invalid lookup key ""'string'"" in format specifier 'a.ids[3][""\'string\'""]'"
+invalid-format-index:77:pprint_bad:Using invalid lookup key 1 in format specifier '0[0][1]'
+invalid-format-index:78:pprint_bad:Using invalid lookup key 0 in format specifier '0[0][0]'
+missing-format-argument-key:80:pprint_bad:Missing keyword argument 'b' for format string
+unused-format-string-argument:80:pprint_bad:Unused format argument 'a'
+invalid-format-index:81:pprint_bad:Using invalid lookup key 0 in format specifier 'a[0]'
+too-many-format-args:82:pprint_bad:Too many arguments for format string
+missing-format-attribute:83:pprint_bad:Missing format attribute 'missing' in format specifier '0.missing'
+too-few-format-args:84:pprint_bad:Not enough arguments for format string
+too-many-format-args:85:pprint_bad:Too many arguments for format string
+too-few-format-args:86:pprint_bad:Not enough arguments for format string
+too-few-format-args:87:pprint_bad:Not enough arguments for format string
+too-many-format-args:88:pprint_bad:Too many arguments for format string
+too-few-format-args:113:nested_issue294:Not enough arguments for format string
+too-many-format-args:114:nested_issue294:Too many arguments for format string
+missing-format-argument-key:115:nested_issue294:Missing keyword argument 'a' for format string
+missing-format-attribute:116:nested_issue294:Missing format attribute 'x' in format specifier 'a.x'
+too-few-format-args:121:issue310:Not enough arguments for format string
+too-many-format-args:128:issue322:Too many arguments for format string
+too-few-format-args:129:issue322:Not enough arguments for format string
+too-few-format-args:152:issue351:Not enough arguments for format string
+too-many-format-args:154:issue351:Too many arguments for format string
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unsupported_binary_operation.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=4.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonexistent_operator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonexistent_operator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonexistent_operator.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""check operator use"""
+# pylint: disable=invalid-name, pointless-statement
+a = 1
+a += 5
+a = +a
+b = ++a # [nonexistent-operator]
+++a # [nonexistent-operator]
+c = (++a) * b # [nonexistent-operator]
+
+a = 1
+a -= 5
+b = --a # [nonexistent-operator]
+b = a
+--a # [nonexistent-operator]
+c = (--a) * b # [nonexistent-operator]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/namedtuple_member_inference.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/namedtuple_member_inference.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/namedtuple_member_inference.txt	(revision 1126)
@@ -0,0 +1,2 @@
+no-member:17:test:Class 'Thing' has no 'x' member:INFERENCE
+no-member:23:test:Instance of 'Fantastic' has no 'foo' member:INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.py	(revision 1126)
@@ -0,0 +1 @@
+def toto # [syntax-error]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/repeated_keyword.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/repeated_keyword.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/repeated_keyword.py	(revision 1126)
@@ -0,0 +1,13 @@
+"""Check that a keyword is not repeated in a function call
+
+This is somehow related to redundant-keyword, but it's not the same.
+"""
+
+# pylint: disable=missing-docstring, invalid-name
+
+def test(a, b):
+    return a, b
+
+test(1, 24)
+test(1, b=24, **{})
+test(1, b=24, **{'b': 24}) # [repeated-keyword]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.py	(revision 1126)
@@ -0,0 +1,10 @@
+# pylint: disable=missing-docstring
+
+exec 'a = __revision__' # [exec-used]
+VALUES = {}
+exec 'a = 1' in VALUES # [exec-used]
+
+exec 'a = 1' in globals() # [exec-used]
+
+def func():
+    exec 'b = 1' # [exec-used]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting.py	(revision 1126)
@@ -0,0 +1,183 @@
+"""test for Python 3 string formatting error
+"""
+# pylint: disable=too-few-public-methods, import-error, unused-argument, line-too-long, no-absolute-import
+import os
+from missing import Missing
+
+__revision__ = 1
+
+class Custom(object):
+    """ Has a __getattr__ """
+    def __getattr__(self, _):
+        return self
+
+class Test(object):
+    """ test format attribute access """
+    custom = Custom()
+    ids = [1, 2, 3, [4, 5, 6]]
+
+class Getitem(object):
+    """ test custom getitem for lookup access """
+    def __getitem__(self, index):
+        return 42
+
+class ReturnYes(object):
+    """ can't be properly infered """
+    missing = Missing()
+
+def log(message, message_type="error"):
+    """ Test """
+    return message
+
+def print_good():
+    """ Good format strings """
+    "{0} {1}".format(1, 2)
+    "{0!r:20}".format("Hello")
+    "{!r:20}".format("Hello")
+    "{a!r:20}".format(a="Hello")
+    "{pid}".format(pid=os.getpid())
+    str("{}").format(2)
+    "{0.missing.length}".format(ReturnYes())
+    "{1.missing.length}".format(ReturnYes())
+    "{a.ids[3][1]}".format(a=Test())
+    "{a[0][0]}".format(a=[[1]])
+    "{[0][0]}".format({0: {0: 1}})
+    "{a.test}".format(a=Custom())
+    "{a.__len__}".format(a=[])
+    "{a.ids.__len__}".format(a=Test())
+    "{a[0]}".format(a=Getitem())
+    "{a[0][0]}".format(a=[Getitem()])
+    "{[0][0]}".format(["test"])
+    # these are skipped
+    "{0} {1}".format(*[1, 2])
+    "{a} {b}".format(**{'a': 1, 'b': 2})
+    "{a}".format(a=Missing())
+
+def pprint_bad():
+    """Test string format """
+    "{{}}".format(1) # [too-many-format-args]
+    "{} {".format() # [bad-format-string]
+    "{} }".format() # [bad-format-string]
+    "{0} {}".format(1, 2) # [format-combined-specification]
+    # +1: [missing-format-argument-key, unused-format-string-argument]
+    "{a} {b}".format(a=1, c=2)
+    "{} {a}".format(1, 2) # [missing-format-argument-key]
+    "{} {}".format(1) # [too-few-format-args]
+    "{} {}".format(1, 2, 3) # [too-many-format-args]
+    # +1: [missing-format-argument-key,missing-format-argument-key,missing-format-argument-key]
+    "{a} {b} {c}".format()
+    "{} {}".format(a=1, b=2) # [too-few-format-args]
+    # +1: [missing-format-argument-key, missing-format-argument-key]
+    "{a} {b}".format(1, 2)
+    "{0} {1} {a}".format(1, 2, 3) # [missing-format-argument-key]
+    # +1: [missing-format-attribute]
+    "{a.ids.__len__.length}".format(a=Test())
+    "{a.ids[3][400]}".format(a=Test()) # [invalid-format-index]
+    "{a.ids[3]['string']}".format(a=Test()) # [invalid-format-index]
+    "{[0][1]}".format(["a"]) # [invalid-format-index]
+    "{[0][0]}".format(((1, ))) # [invalid-format-index]
+    # +1: [missing-format-argument-key, unused-format-string-argument]
+    "{b[0]}".format(a=23)
+    "{a[0]}".format(a=object) # [invalid-format-index]
+    log("{}".format(2, "info")) # [too-many-format-args]
+    "{0.missing}".format(2) # [missing-format-attribute]
+    "{0} {1} {2}".format(1, 2) # [too-few-format-args]
+    "{0} {1}".format(1, 2, 3) # [too-many-format-args]
+    "{0} {a}".format(a=4) # [too-few-format-args]
+    "{[0]} {}".format([4]) # [too-few-format-args]
+    "{[0]} {}".format([4], 5, 6) # [too-many-format-args]
+
+def good_issue288(*args, **kwargs):
+    """ Test that using kwargs does not emit a false
+    positive.
+    """
+    'Hello John Doe {0[0]}'.format(args)
+    'Hello {0[name]}'.format(kwargs)
+
+def good_issue287():
+    """ Test that the string format checker skips
+    format nodes which don't have a string as a parent
+    (but a subscript, name etc).
+    """
+    name = 'qwerty'
+    ret = {'comment': ''}
+    ret['comment'] = 'MySQL grant {0} is set to be revoked'
+    ret['comment'] = ret['comment'].format(name)
+    return ret, name
+
+def nested_issue294():
+    """ Test nested format fields. """
+    '{0:>{1}}'.format(42, 24)
+    '{0:{a[1]}} {a}'.format(1, a=[1, 2])
+    '{:>{}}'.format(42, 24)
+    '{0:>{1}}'.format(42) # [too-few-format-args]
+    '{0:>{1}}'.format(42, 24, 54) # [too-many-format-args]
+    '{0:{a[1]}}'.format(1) # [missing-format-argument-key]
+    '{0:{a.x}}'.format(1, a=2) # [missing-format-attribute]
+
+def issue310():
+    """ Test a regression using duplicate manual position arguments. """
+    '{0} {1} {0}'.format(1, 2)
+    '{0} {1} {0}'.format(1) # [too-few-format-args]
+
+def issue322():
+    """ Test a regression using mixed manual position arguments
+    and attribute access arguments.
+    """
+    '{0}{1[FOO]}'.format(123, {'FOO': 456})
+    '{0}{1[FOO]}'.format(123, {'FOO': 456}, 321) # [too-many-format-args]
+    '{0}{1[FOO]}'.format(123) # [too-few-format-args]
+
+def issue338():
+    """
+    Check that using a namedtuple subclass doesn't crash when
+    trying to infer EmptyNodes (resulted after mocking the
+    members of namedtuples).
+    """
+    from collections import namedtuple
+
+    class Crash(namedtuple("C", "foo bar")):
+        """ Looking for attributes in __str__ will crash,
+        because EmptyNodes can't be infered.
+        """
+        def __str__(self):
+            return "{0.foo}: {0.bar}".format(self)
+    return Crash
+
+def issue351():
+    """
+    Check that the format method can be assigned to a variable, ie:
+    """
+    fmt = 'test {} {}'.format
+    fmt('arg1') # [too-few-format-args]
+    fmt('arg1', 'arg2')
+    fmt('arg1', 'arg2', 'arg3') # [too-many-format-args]
+
+def issue373():
+    """
+    Ignore any object coming from an argument.
+    """
+    class SomeClass(object):
+        """ empty docstring. """
+        def __init__(self, opts=None):
+            self.opts = opts
+
+        def dunc(self, arg):
+            """Don't try to analyze this."""
+            return "A{0}{1}".format(arg, self.opts)
+
+        def func(self):
+            """Don't try to analyze the following string."""
+            return 'AAA{0[iface]}BBB{0[port]}'.format(self.opts)
+
+    return SomeClass
+
+def issue_463():
+    """
+    Mix positional arguments, `{0}`, with positional
+    arguments with attribute access, `{0.__x__}`.
+    """
+    data = "{0.__class__.__name__}: {0}".format(42)
+    data2 = "{0[0]}: {0}".format([1])
+    return (data, data2)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_format_interpolation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_format_interpolation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_format_interpolation.py	(revision 1126)
@@ -0,0 +1,25 @@
+# pylint: disable=E1101, no-absolute-import, import-error,line-too-long, missing-docstring,wrong-import-order
+
+try:
+    import __builtin__ as builtins
+except ImportError:
+    import builtins
+
+# Muck up the names in an effort to confuse...
+import logging as renamed_logging
+import os as logging
+
+FORMAT_STR = '{0}, {1}'
+
+# Statements that should be flagged:
+renamed_logging.debug('{0}, {1}'.format(4, 5)) # [logging-format-interpolation]
+renamed_logging.log(renamed_logging.DEBUG, 'msg: {}'.format('Run!')) # [logging-format-interpolation]
+renamed_logging.debug(FORMAT_STR.format(4, 5)) # [logging-format-interpolation]
+renamed_logging.log(renamed_logging.DEBUG, FORMAT_STR.format(4, 5)) # [logging-format-interpolation]
+
+# Statements that should not be flagged:
+renamed_logging.debug(format(66, 'x'))
+renamed_logging.debug(builtins.format(66, 'x'))
+renamed_logging.log(renamed_logging.DEBUG, 'msg: Run!'.upper())
+logging.debug('{0}, {1}'.format(4, 5))
+logging.log(logging.DEBUG, 'msg: {}'.format('Run!'))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.txt	(revision 1126)
@@ -0,0 +1,3 @@
+anomalous-unicode-escape-in-string:5::"Anomalous Unicode escape in byte string: '\u'. String constant might be missing an r or u prefix."
+anomalous-unicode-escape-in-string:6::"Anomalous Unicode escape in byte string: '\U'. String constant might be missing an r or u prefix."
+anomalous-unicode-escape-in-string:8::"Anomalous Unicode escape in byte string: '\N'. String constant might be missing an r or u prefix."
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""Suspicious str.strip calls."""
+__revision__ = 1
+
+''.strip('yo')
+''.strip()
+
+u''.strip('http://')  # [bad-str-strip-call]
+u''.lstrip('http://')  # [bad-str-strip-call]
+b''.rstrip('http://')  # [bad-str-strip-call]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py3.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=3.0
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.py	(revision 1126)
@@ -0,0 +1,36 @@
+# pylint: disable=missing-docstring,too-few-public-methods,no-init,no-self-use,unused-argument,pointless-statement,expression-not-assigned
+
+# metaclasses that support membership test protocol
+class MetaIterable(type):
+    def __iter__(cls):
+        return iter((1, 2, 3))
+
+class MetaOldIterable(type):
+    def __getitem__(cls, key):
+        if key < 10:
+            return key ** 2
+        else:
+            raise IndexError("bad index")
+
+class MetaContainer(type):
+    def __contains__(cls, key):
+        return False
+
+
+class IterableClass(metaclass=MetaOldIterable):
+    pass
+
+class OldIterableClass(metaclass=MetaOldIterable):
+    pass
+
+class ContainerClass(metaclass=MetaContainer):
+    pass
+
+
+def test():
+    1 in IterableClass
+    1 in OldIterableClass
+    1 in ContainerClass
+    1 in IterableClass()  # [unsupported-membership-test]
+    1 in OldIterableClass()  # [unsupported-membership-test]
+    1 in ContainerClass()  # [unsupported-membership-test]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_name_in_module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_name_in_module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_name_in_module.py	(revision 1126)
@@ -0,0 +1,66 @@
+#pylint: disable=W0401,W0611,no-absolute-import,invalid-name,import-error,bare-except,broad-except,wrong-import-order,ungrouped-imports
+"""check unexistant names imported are reported"""
+from __future__ import print_function
+
+import collections.tutu  # [no-name-in-module]
+from collections import toto  # [no-name-in-module]
+toto.yo()
+
+from xml.etree import ElementTree
+ElementTree.nonexistant_function()  # [no-member]
+ElementTree.another.nonexistant.function()  # [no-member]
+print(collections.yo)  # [no-member]
+
+import sys
+print(sys.stdout, 'hello world')
+print(sys.stdoout, 'bye bye world')  # [no-member]
+
+
+import re
+re.finditer('*', 'yo')
+
+from rie import *
+from re import findiiter, compiile  # [no-name-in-module,no-name-in-module]
+
+import os
+'SOMEVAR' in os.environ  # [pointless-statement]
+
+try:
+    from collections import something
+except ImportError:
+    something = None
+
+try:
+    from collections import anything # [no-name-in-module]
+except ValueError:
+    anything = None
+
+try:
+    import collections.missing
+except ImportError:
+    pass
+
+try:
+    import collections.indeed_missing # [no-name-in-module]
+except ValueError:
+    pass
+
+try:
+    import collections.dont_emit
+except Exception:
+    pass
+
+try:
+    import collections.please_dont_emit
+except:
+    pass
+
+try:
+    if something:
+        import collections.please_dont_emit
+except Exception:
+    pass
+
+from .no_self_use import Super
+from .no_self_use import lala  # [no-name-in-module]
+from .no_self_use.bla import lala1 # [no-name-in-module]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_async_context_manager.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.5
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/fixme.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/fixme.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/fixme.py	(revision 1126)
@@ -0,0 +1,18 @@
+# pylint: disable=missing-docstring, unused-variable
+
+
+# +1: [fixme]
+# FIXME: beep
+
+
+def function():
+    variable = "FIXME: Ignore me!"
+    # +1: [fixme]
+    test = "text"  # FIXME: Valid test
+
+    # +1: [fixme]
+    # TODO: Do something with the variables
+    # +1: [fixme]
+    xxx = "n/a"  # XXX: Fix this later
+    # +1: [fixme]
+    #FIXME: no space after hash
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/star_needs_assignment_target.txt	(revision 1126)
@@ -0,0 +1 @@
+star-needs-assignment-target:3::Can use starred expression only in assignment target
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py3.txt	(revision 1126)
@@ -0,0 +1 @@
+not-an-iterable:17::Non-iterable value SomeClass() is used in an iterating context
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_boolean_expressions.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_boolean_expressions.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_boolean_expressions.txt	(revision 1126)
@@ -0,0 +1,4 @@
+too-many-boolean-expressions:6::Too many boolean expressions in if statement (6/5)
+too-many-boolean-expressions:10::Too many boolean expressions in if statement (7/5)
+too-many-boolean-expressions:12::Too many boolean expressions in if statement (6/5)
+too-many-boolean-expressions:14::Too many boolean expressions in if statement (6/5)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_outside_func.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_outside_func.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_outside_func.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""This is gramatically correct, but it's still a SyntaxError"""
+yield 1  # [yield-outside-function]
+
+LAMBDA_WITH_YIELD = lambda: (yield)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_raised.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_raised.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_raised.py	(revision 1126)
@@ -0,0 +1,83 @@
+# pylint:disable=too-few-public-methods,old-style-class,no-init,import-error,missing-docstring, not-callable
+"""test pb with exceptions and old/new style classes"""
+
+
+class ValidException(Exception):
+    """Valid Exception."""
+
+class OldStyleClass:
+    """Not an exception."""
+
+class NewStyleClass(object):
+    """Not an exception."""
+
+
+def good_case():
+    """raise"""
+    raise ValidException('hop')
+
+def good_case1():
+    """zlib.error is defined in C module."""
+    import zlib
+    raise zlib.error(4)
+
+def good_case2():
+    """decimal.DivisionByZero is defined in C on Python 3."""
+    import decimal
+    raise decimal.DivisionByZero(4)
+
+def good_case3():
+    """io.BlockingIOError is defined in C."""
+    import io
+    raise io.BlockingIOError
+
+def bad_case0():
+    """raise"""
+    # +2:<3.0:[nonstandard-exception]
+    # +1:>=3.0:[raising-non-exception]
+    raise OldStyleClass('hop')
+
+def bad_case1():
+    """raise"""
+    raise NewStyleClass()  # [raising-non-exception]
+
+def bad_case2():
+    """raise"""
+    # +2:<3.0:[nonstandard-exception]
+    # +1:>=3.0:[raising-non-exception]
+    raise OldStyleClass('hop')
+
+def bad_case3():
+    """raise"""
+    raise NewStyleClass  # [raising-non-exception]
+
+def bad_case4():
+    """raise"""
+    raise NotImplemented('hop')  # [notimplemented-raised]
+
+def bad_case5():
+    """raise"""
+    raise 1  # [raising-bad-type]
+
+def bad_case6():
+    """raise"""
+    raise None  # [raising-bad-type]
+
+def bad_case7():
+    """raise list"""
+    raise list # [raising-non-exception]
+
+def bad_case8():
+    """raise tuple"""
+    raise tuple # [raising-non-exception]
+
+def bad_case9():
+    """raise dict"""
+    raise dict # [raising-non-exception]
+
+def unknown_bases():
+    """Don't emit when we don't know the bases."""
+    from lala import bala
+    class MyException(bala):
+        pass
+    raise MyException
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.py	(revision 1126)
@@ -0,0 +1,7 @@
+"""
+Check that `yield from`-statement takes an iterable.
+"""
+# pylint: disable=missing-docstring
+
+def to_ten():
+    yield from 10  # [not-an-iterable]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.py	(revision 1126)
@@ -0,0 +1,6 @@
+"""Unicode literals in Python 2.*"""
+from __future__ import unicode_literals
+
+
+BAD_STRING = b'\u1234'  # >= 2.7.4:[anomalous-unicode-escape-in-string]
+GOOD_STRING = '\u1234'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_non_sequence.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_non_sequence.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_non_sequence.py	(revision 1126)
@@ -0,0 +1,119 @@
+"""Check unpacking non-sequences in assignments. """
+
+# pylint: disable=too-few-public-methods, invalid-name, attribute-defined-outside-init, unused-variable, no-absolute-import
+# pylint: disable=using-constant-test, no-init
+from os import rename as nonseq_func
+from six import with_metaclass
+from functional.unpacking import nonseq
+
+__revision__ = 0
+
+# Working
+
+class Seq(object):
+    """ sequence """
+    def __init__(self):
+        self.items = range(2)
+
+    def __getitem__(self, item):
+        return self.items[item]
+
+    def __len__(self):
+        return len(self.items)
+
+class Iter(object):
+    """ Iterator """
+    def __iter__(self):
+        for number in range(2):
+            yield number
+
+def good_unpacking():
+    """ returns should be unpackable """
+    if True:
+        return [1, 2]
+    else:
+        return (3, 4)
+
+def good_unpacking2():
+    """ returns should be unpackable """
+    return good_unpacking()
+
+class MetaIter(type):
+    "metaclass that makes classes that use it iterables"
+    def __iter__(cls):
+        return iter((1, 2))
+
+class IterClass(with_metaclass(MetaIter)):
+    "class that is iterable (and unpackable)"
+
+class AbstrClass(object):
+    "abstract class"
+    pair = None
+
+    def setup_pair(self):
+        "abstract method"
+        raise NotImplementedError
+
+    def __init__(self):
+        "error should not be emitted because setup_pair is abstract"
+        self.setup_pair()
+        x, y = self.pair
+
+a, b = [1, 2]
+a, b = (1, 2)
+a, b = set([1, 2])
+a, b = {1: 2, 2: 3}
+a, b = "xy"
+a, b = Seq()
+a, b = Iter()
+a, b = (number for number in range(2))
+a, b = good_unpacking()
+a, b = good_unpacking2()
+a, b = IterClass
+
+# Not working
+class NonSeq(object):
+    """ does nothing """
+
+a, b = NonSeq() # [unpacking-non-sequence]
+a, b = ValueError # [unpacking-non-sequence]
+a, b = None # [unpacking-non-sequence]
+a, b = 1 # [unpacking-non-sequence]
+a, b = nonseq # [unpacking-non-sequence]
+a, b = nonseq() # [unpacking-non-sequence]
+a, b = nonseq_func # [unpacking-non-sequence]
+
+class ClassUnpacking(object):
+    """ Check unpacking as instance attributes. """
+
+    def test(self):
+        """ test unpacking in instance attributes. """
+
+        self.a, self.b = 1, 2
+        self.a, self.b = {1: 2, 2: 3}
+        self.a, self.b = "xy"
+        self.a, c = "xy"
+        c, self.a = good_unpacking()
+        self.a, self.b = Iter()
+
+        self.a, self.b = NonSeq() # [unpacking-non-sequence]
+        self.a, self.b = ValueError # [unpacking-non-sequence]
+        self.a, c = nonseq_func # [unpacking-non-sequence]
+
+class TestBase(object):
+    'base class with `test` method implementation'
+    @staticmethod
+    def test(data):
+        'default implementation'
+        return data
+
+class Test(TestBase):
+    'child class that overrides `test` method'
+    def __init__(self):
+        # no error should be emitted here as `test` is overriden in this class
+        (self.aaa, self.bbb, self.ccc) = self.test(None)
+
+    @staticmethod
+    def test(data):
+        'overridden implementation'
+        return (1, 2, 3)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle__slots__.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle__slots__.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle__slots__.txt	(revision 1126)
@@ -0,0 +1,2 @@
+old-style-class:10:OldStyleClass:Old-style class defined.
+slots-on-old-class:10:OldStyleClass:Use of __slots__ on an old style class:INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_future.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_future.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_future.txt	(revision 1126)
@@ -0,0 +1 @@
+misplaced-future:3::"__future__ import is not the first non docstring statement"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_caught.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_caught.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_caught.py	(revision 1126)
@@ -0,0 +1,109 @@
+"""Test for catching non-exceptions."""
+# pylint: disable=too-many-ancestors, no-absolute-import, import-error, multiple-imports,wrong-import-position
+from __future__ import print_function
+
+import socket, binascii
+
+class MyException(object):
+    """Custom 'exception'."""
+
+class MySecondException(object):
+    """Custom 'exception'."""
+
+class MyGoodException(Exception):
+    """Custom exception."""
+
+class MySecondGoodException(MyGoodException):
+    """Custom exception."""
+
+class SkipException(socket.error):
+    """Not an exception for Python 2, but one in 3."""
+
+class SecondSkipException(SkipException):
+    """Also a good exception."""
+
+try:
+    1 + 1
+except MyException:  # [catching-non-exception]
+    print("caught")
+
+try:
+    1 + 2
+# +1:[catching-non-exception,catching-non-exception]
+except (MyException, MySecondException):
+    print("caught")
+
+try:
+    1 + 3
+except MyGoodException:
+    print("caught")
+
+try:
+    1 + 3
+except (MyGoodException, MySecondGoodException):
+    print("caught")
+
+try:
+    1 + 3
+except (SkipException, SecondSkipException):
+    print("caught")
+
+try:
+    1 + 42
+# +1:[catching-non-exception,catching-non-exception]
+except (None, list()):
+    print("caught")
+
+try:
+    1 + 24
+except None: # [catching-non-exception]
+    print("caught")
+
+EXCEPTION = None
+EXCEPTION = ZeroDivisionError
+try:
+    1 + 46
+except EXCEPTION:
+    print("caught")
+
+try:
+    1 + 42
+# +1:[catching-non-exception,catching-non-exception,catching-non-exception]
+except (list([4, 5, 6]), None, ZeroDivisionError, 4):
+    print("caught")
+
+EXCEPTION_TUPLE = (ZeroDivisionError, OSError)
+NON_EXCEPTION_TUPLE = (ZeroDivisionError, OSError, 4)
+
+try:
+    1 + 42
+except EXCEPTION_TUPLE:
+    print("caught")
+
+try:
+    1 + 42
+except NON_EXCEPTION_TUPLE: # [catching-non-exception]
+    print("caught")
+
+from missing_import import UnknownError
+UNKNOWN_COMPONENTS = (ZeroDivisionError, UnknownError)
+
+try:
+    1 + 42
+except UNKNOWN_COMPONENTS:
+    print("caught")
+
+try:
+    1 + 42
+except binascii.Error:
+    print('builtin and detected')
+
+try:
+    1 + 45
+except object: # [catching-non-exception]
+    print('caught')
+
+try:
+    1 + 42
+except range: # [catching-non-exception]
+    print('caught')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_variable_type.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_variable_type.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_variable_type.txt	(revision 1126)
@@ -0,0 +1,6 @@
+redefined-variable-type:17:MyClass.__init__:Redefinition of self.var1 type from int to float
+redefined-variable-type:33:MyClass.some_method.func:Redefinition of var type from int to str
+redefined-variable-type:37:MyClass.some_method:Redefinition of myint type from int to bool
+redefined-variable-type:39::Redefinition of _OK type from bool to str
+redefined-variable-type:49:other_function:Redefinition of instance type from functional.redefined_variable_type.MyClass to bool
+redefined-variable-type:51::Redefinition of SOME_FLOAT type from float to int
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inconsistent_mro.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inconsistent_mro.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inconsistent_mro.txt	(revision 1126)
@@ -0,0 +1 @@
+inconsistent-mro:8:Inconsistent:Inconsistent method resolution order for class 'Inconsistent'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.txt	(revision 1126)
@@ -0,0 +1,2 @@
+mixed-line-endings:3::Mixed line endings LF and CRLF
+unexpected-line-ending-format:3::Unexpected line ending format. There is 'CRLF' while it should be 'LF'.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_too_long.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_too_long.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_too_long.py	(revision 1126)
@@ -0,0 +1,26 @@
+# pylint: disable=invalid-encoded-data
+# +1: [line-too-long]
+#####################################################################################################
+# +1: [line-too-long]
+""" that one is too long tooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo loooooong"""
+
+# The next line is exactly 80 characters long.
+A = '--------------------------------------------------------------------------'
+
+# Do not trigger the line-too-long warning if the only token that makes the
+# line longer than 80 characters is a trailing pylint disable.
+var = 'This line has a disable pragma and whitespace trailing beyond 80 chars. '  # pylint:disable=invalid-name
+
+# +1: [line-too-long]
+badname = 'This line is already longer than 100 characters even without the pragma. Trust me. Please.'  # pylint:disable=invalid-name
+
+# http://example.com/this/is/a/very/long/url?but=splitting&urls=is&a=pain&so=they&can=be&long
+
+
+def function():
+    # +3: [line-too-long]
+    """This is a docstring.
+
+    That contains a very, very long line that exceeds the 100 characters limit by a good margin. So good?
+    """
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_star_assignment_target.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/statement_without_effect.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/statement_without_effect.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/statement_without_effect.txt	(revision 1126)
@@ -0,0 +1,60 @@
+pointless-string-statement:5::String statement has no effect
+pointless-statement:6::"""Statement seems to have no effect
+""
+"
+pointless-statement:8::"""Statement seems to have no effect
+""
+"
+pointless-statement:9::Statement seems to have no effect
+pointless-statement:11::Statement seems to have no effect
+pointless-statement:12::"""Statement seems to have no effect
+""
+"
+pointless-statement:15::Statement seems to have no effect
+pointless-string-statement:15::"""String statement has no effect
+""
+"
+unnecessary-semicolon:17::"""Unnecessary semicolon
+""
+"
+pointless-string-statement:18::String statement has no effect
+unnecessary-semicolon:18::"""Unnecessary semicolon
+""
+"
+expression-not-assigned:19::"""Expression """"(list()) and (tuple())"""" is assigned to nothing
+""
+"
+expression-not-assigned:20::"""Expression """"(list()) and (tuple())"""" is assigned to nothing
+""
+"
+unnecessary-semicolon:21::Unnecessary semicolon
+expression-not-assigned:23::"Expression ""(list()) and (tuple())"" is assigned to nothing"
+expression-not-assigned:26::"""Expression """"ANSWER == to_be()"""" is assigned to nothing
+""
+"
+expression-not-assigned:27::"""Expression """"ANSWER == to_be()"""" is assigned to nothing
+""
+"
+expression-not-assigned:28::"""Expression """"(to_be()) or (not to_be())"""" is assigned to nothing
+""
+"
+expression-not-assigned:29::"""Expression """"(to_be()) or (not to_be())"""" is assigned to nothing
+""
+"
+expression-not-assigned:30::"Expression ""ANSWER == to_be()"" is assigned to nothing"
+expression-not-assigned:32::"Expression ""(to_be()) or (not to_be())"" is assigned to nothing"
+expression-not-assigned:33::"Expression ""to_be().title"" is assigned to nothing"
+pointless-string-statement:54:ClassLevelAttributeTest.__init__:"""String statement has no effect
+""
+"
+pointless-string-statement:55:ClassLevelAttributeTest.__init__:"""String statement has no effect
+""
+"
+pointless-string-statement:58:ClassLevelAttributeTest.__init__:String statement has no effect
+pointless-string-statement:61:ClassLevelAttributeTest.test:"""String statement has no effect
+""
+"
+pointless-string-statement:62:ClassLevelAttributeTest.test:"""String statement has no effect
+""
+"
+pointless-string-statement:65:ClassLevelAttributeTest.test:String statement has no effect
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_branches.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_branches.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_branches.py	(revision 1126)
@@ -0,0 +1,69 @@
+""" Test for too many branches. """
+# pylint: disable=using-constant-test
+def wrong(): # [too-many-branches]
+    """ Has too many branches. """
+    if 1:
+        pass
+    elif 1:
+        pass
+    elif 1:
+        pass
+    elif 1:
+        pass
+    elif 1:
+        pass
+    elif 1:
+        pass
+    try:
+        pass
+    finally:
+        pass
+    if 2:
+        pass
+    while True:
+        pass
+    if 1:
+        pass
+    elif 2:
+        pass
+    elif 3:
+        pass
+
+def good():
+    """ Too many branches only if we take
+    into consideration the nested functions.
+    """
+    def nested_1():
+        """ empty """
+        if 1:
+            pass
+        elif 2:
+            pass
+        elif 3:
+            pass
+        elif 4:
+            pass
+
+    nested_1()
+    try:
+        pass
+    finally:
+        pass
+    try:
+        pass
+    finally:
+        pass
+    if 1:
+        pass
+    elif 2:
+        pass
+    elif 3:
+        pass
+    elif 4:
+        pass
+    elif 5:
+        pass
+    elif 6:
+        pass
+    elif 7:
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/method_hidden.py
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/method_hidden.py
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.py	(revision 1126)
@@ -0,0 +1,7 @@
+# [syntax-error]
+"""A module that is accepted by Python but rejected by tokenize.
+
+The problem is the trailing line continuation at the end of the line,
+which produces a TokenError."""
+
+""\
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[Messages Control]
+disable=all
+enable=bad-format-string
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.py	(revision 1126)
@@ -0,0 +1 @@
+def toto # [syntax-error]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol.txt	(revision 1126)
@@ -0,0 +1,7 @@
+unsupported-membership-test:113::Value '42' doesn't support membership test
+unsupported-membership-test:114::Value 'None' doesn't support membership test
+unsupported-membership-test:115::Value '8.5' doesn't support membership test
+unsupported-membership-test:120::Value 'EmptyClass()' doesn't support membership test
+unsupported-membership-test:121::Value 'EmptyClass' doesn't support membership test
+unsupported-membership-test:122::Value 'count' doesn't support membership test
+unsupported-membership-test:123::Value 'range' doesn't support membership test
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.txt	(revision 1126)
@@ -0,0 +1 @@
+abstract-class-instantiated:19:main:Abstract class 'BadClass' with abstract methods instantiated
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assert_on_tuple.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assert_on_tuple.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assert_on_tuple.py	(revision 1126)
@@ -0,0 +1,11 @@
+'''Assert check example'''
+
+# pylint: disable=misplaced-comparison-constant
+assert (1 == 1, 2 == 2), "no error"
+assert (1 == 1, 2 == 2) # [assert-on-tuple]
+assert 1 == 1, "no error"
+assert (1 == 1, ), "no error"
+assert (1 == 1, )
+assert (1 == 1, 2 == 2, 3 == 5), "no error"
+assert ()
+assert (True, 'error msg') # [assert-on-tuple]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error_jython.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+except_implementations=CPython, PyPy
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_continuation.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_continuation.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_continuation.txt	(revision 1126)
@@ -0,0 +1,63 @@
+bad-continuation:14::"Wrong hanging indentation.
+   ]  # [bad-continuation]
+|  ^|"
+bad-continuation:19::"Wrong continued indentation (remove 3 spaces).
+         7,  # [bad-continuation]
+      |  ^"
+bad-continuation:27::"Wrong hanging indentation (add 1 space).
+   'b': 2,  # [bad-continuation]
+   ^|"
+bad-continuation:33::"Wrong hanging indentation (add 1 space).
+   'b': 2,  # [bad-continuation]
+   ^|"
+bad-continuation:41::"Wrong continued indentation.
+                             # [bad-continuation] is not accepted
+      |                   |  ^"
+bad-continuation:42::"Wrong continued indentation (remove 20 spaces).
+                          'contents', # [bad-continuation] nor this.
+      |                   ^"
+bad-continuation:51::"Wrong hanging indentation in dict value.
+      'value2',  # [bad-continuation]
+    | ^ |"
+bad-continuation:61::"Wrong continued indentation (add 4 spaces).
+        'wrong',  # [bad-continuation]
+        ^   |"
+bad-continuation:85::"Wrong hanging indentation in dict value.
+'value1',  # [bad-continuation]
+^     |   |"
+bad-continuation:89::"Wrong hanging indentation in dict value.
+    'value1',  # [bad-continuation]
+    ^ |   |"
+bad-continuation:106::"Wrong hanging indentation before block (add 4 spaces).
+    some_arg,         # [bad-continuation]
+    ^   |"
+bad-continuation:107::"Wrong hanging indentation before block (add 4 spaces).
+    some_other_arg):  # [bad-continuation]
+    ^   |"
+bad-continuation:127::"Wrong continued indentation (add 3 spaces).
+    ""b"")  # [bad-continuation]
+    ^  |"
+bad-continuation:141::"Wrong hanging indentation before block.
+   ): pass  # [bad-continuation]
+|  ^|"
+bad-continuation:144::"Wrong continued indentation before block (add 4 spaces).
+    2):  # [bad-continuation]
+    ^   |"
+bad-continuation:152::"Wrong continued indentation (remove 2 spaces).
+         2 and  # [bad-continuation]
+       | ^"
+bad-continuation:157::"Wrong hanging indentation before block.
+  2): pass  # [bad-continuation]
+  ^ |   |"
+bad-continuation:164::"Wrong continued indentation before block.
+     2 or  # [bad-continuation]
+    |^  |"
+bad-continuation:168::"Wrong continued indentation before block.
+  2): pass  # [bad-continuation]
+  ^ |   |"
+bad-continuation:174::"Wrong hanging indentation before block.
+  2):  # [bad-continuation]
+  ^ |   |"
+bad-continuation:185::"Wrong continued indentation (add 4 spaces).
+    2):  # [bad-continuation]
+    ^   |"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/consider_using_enumerate.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/consider_using_enumerate.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/consider_using_enumerate.txt	(revision 1126)
@@ -0,0 +1 @@
+consider-using-enumerate:7:bad:Consider using enumerate instead of iterating with range and len
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-star-expressions:3::More than one starred expression in assignment
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/generated_members.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/generated_members.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/generated_members.py	(revision 1126)
@@ -0,0 +1,8 @@
+"""Test the generated-members config option."""
+from __future__ import print_function
+
+class Klass(object):
+    """A class with a generated member."""
+
+print(Klass().DoesNotExist)
+print(Klass().aBC_set1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_non_sequence.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_non_sequence.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_non_sequence.txt	(revision 1126)
@@ -0,0 +1,10 @@
+unpacking-non-sequence:78::Attempting to unpack a non-sequence defined at line 75
+unpacking-non-sequence:79::Attempting to unpack a non-sequence
+unpacking-non-sequence:80::Attempting to unpack a non-sequence None
+unpacking-non-sequence:81::Attempting to unpack a non-sequence 1
+unpacking-non-sequence:82::Attempting to unpack a non-sequence defined at line 9 of functional.unpacking
+unpacking-non-sequence:83::Attempting to unpack a non-sequence defined at line 11 of functional.unpacking
+unpacking-non-sequence:84::Attempting to unpack a non-sequence
+unpacking-non-sequence:99:ClassUnpacking.test:Attempting to unpack a non-sequence defined at line 75
+unpacking-non-sequence:100:ClassUnpacking.test:Attempting to unpack a non-sequence
+unpacking-non-sequence:101:ClassUnpacking.test:Attempting to unpack a non-sequence
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py2.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_builtin.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_builtin.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_builtin.py	(revision 1126)
@@ -0,0 +1,4 @@
+# pylint: disable=missing-docstring
+
+TEST = map(str, (1, 2, 3)) # [bad-builtin]
+TEST1 = filter(str, (1, 2, 3)) # [bad-builtin]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_name.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_name.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_name.txt	(revision 1126)
@@ -0,0 +1,3 @@
+invalid-name:10::"Invalid constant name ""aaa"""
+invalid-name:14::"Invalid constant name ""time"""
+invalid-name:30:a:"Invalid function name ""a"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_continuation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_continuation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_continuation.py	(revision 1126)
@@ -0,0 +1,191 @@
+"""Regression test case for bad-continuation."""
+# pylint: disable=print-statement,using-constant-test, redefined-variable-type
+# Various alignment for brackets
+from __future__ import print_function
+
+LIST0 = [
+    1, 2, 3
+]
+LIST1 = [
+    1, 2, 3
+    ]
+LIST2 = [
+    1, 2, 3
+   ]  # [bad-continuation]
+
+# Alignment inside literals
+W0 = [1, 2, 3,
+      4, 5, 6,
+         7,  # [bad-continuation]
+      8, 9, 10,
+      11, 12, 13,
+      # and a comment
+      14, 15, 16]
+
+W1 = {
+    'a': 1,
+   'b': 2,  # [bad-continuation]
+    'c': 3,
+    }
+
+W2 = {
+    'a': 1,
+   'b': 2,  # [bad-continuation]
+    'c': 3,
+    }
+
+W2 = ['some', 'contents'  # with a continued comment that may be aligned
+                          # under the previous comment (optionally)
+      'and',
+      'more',             # but this
+                             # [bad-continuation] is not accepted
+                          'contents', # [bad-continuation] nor this.
+     ]
+
+# Values in dictionaries should be indented 4 spaces further if they are on a
+# different line than their key
+W4 = {
+    'key1':
+    'value1',  # Grandfather in the old style
+    'key2':
+      'value2',  # [bad-continuation]
+    'key3':
+        'value3',  # Comma here
+    }
+
+# And should follow the same rules as continuations within parens
+W5 = {
+    'key1': 'long value'
+            'long continuation',
+    'key2': 'breaking'
+        'wrong',  # [bad-continuation]
+    'key3': 2*(
+        2+2),
+    'key4': ('parenthesis',
+             'continuation')  # No comma here
+    }
+
+# Allow values to line up with their keys when the key is next to the brace
+W6 = {'key1':
+      'value1',
+      'key2':
+      'value2',
+     }
+
+# Or allow them to be indented
+W7 = {'key1':
+          'value1',
+      'key2':
+          'value2'
+     }
+
+# Bug that caused a warning on the previous two cases permitted these odd
+# incorrect indentations
+W8 = {'key1':
+'value1',  # [bad-continuation]
+     }
+
+W9 = {'key1':
+    'value1',  # [bad-continuation]
+     }
+
+# Alignment of arguments in function definitions
+def continue1(some_arg,
+              some_other_arg):
+    """A function with well-aligned arguments."""
+    print(some_arg, some_other_arg)
+
+
+def continue2(
+        some_arg,
+        some_other_arg):
+    """A function with well-aligned arguments."""
+    print(some_arg, some_other_arg)
+
+def continue3(
+    some_arg,         # [bad-continuation]
+    some_other_arg):  # [bad-continuation]
+    """A function with misaligned arguments"""
+    print(some_arg, some_other_arg)
+
+def continue4(  # pylint:disable=missing-docstring
+    arg1,
+    arg2): print(arg1, arg2)
+
+
+def callee(*args):
+    """noop"""
+    print(args)
+
+
+callee(
+    "a",
+    "b"
+    )
+
+callee("a",
+    "b")  # [bad-continuation]
+
+callee(5, {'a': 'b',
+           'c': 'd'})
+
+if (
+    1
+    ): pass
+
+if (
+    1
+): pass
+if (
+    1
+   ): pass  # [bad-continuation]
+
+if (1 and
+    2):  # [bad-continuation]
+    pass
+
+while (1 and
+       2):
+    pass
+
+while (1 and
+         2 and  # [bad-continuation]
+       3):
+    pass
+
+if (
+  2): pass  # [bad-continuation]
+
+if (1 or
+    2 or
+    3): pass
+
+if (1 or
+     2 or  # [bad-continuation]
+    3): print(1, 2)
+
+if (1 and
+  2): pass  # [bad-continuation]
+
+if (
+    2): pass
+
+if (
+  2):  # [bad-continuation]
+    pass
+
+L1 = (lambda a,
+             b: a + b)
+
+if not (1 and
+        2):
+    print(3)
+
+if not (1 and
+    2):  # [bad-continuation]
+    print(3)
+
+continue2("foo",
+          some_other_arg="this "
+                         "is "
+                         "fine")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/consider_using_enumerate.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/consider_using_enumerate.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/consider_using_enumerate.py	(revision 1126)
@@ -0,0 +1,43 @@
+"""Emit a message for iteration through range and len is encountered."""
+
+# pylint: disable=missing-docstring, import-error
+
+def bad():
+    iterable = [1, 2, 3]
+    for obj in range(len(iterable)): # [consider-using-enumerate]
+        yield iterable[obj]
+
+
+def good():
+    iterable = other_obj = [1, 2, 3]
+    total = 0
+    for obj in range(len(iterable)):
+        total += obj
+        yield total
+        yield iterable[obj + 1: 2]
+        yield iterable[len(obj)]
+    for obj in iterable:
+        yield iterable[obj - 1]
+
+    for index, obj in enumerate(iterable):
+        yield iterable[index]
+    for index in range(0, 10):
+        yield iterable[index + 1]
+    for index in range(10):
+        yield iterable[index]
+    for index in range(len([1, 2, 3, 4])):
+        yield index
+    for index in range(len(iterable)):
+        yield [1, 2, 3][index]
+        yield len([1, 2, 3])
+    for index in range(len(iterable)):
+        yield other_obj[index]
+
+    from unknown import unknown
+    for index in range(unknown(iterable)):
+        yield iterable[index]
+
+    for index in range(len(iterable)):
+        def test(iterable):
+            return iterable[index]
+        yield test([1, 2, 3])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""Test for too-many-star-expressions."""
+
+*FIRST, *SECOND = [1, 2, 3] # [too-many-star-expressions]
+*FIRST_1, SECOND = (1, 2, 3)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/blacklisted_name.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/blacklisted_name.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/blacklisted_name.py	(revision 1126)
@@ -0,0 +1,4 @@
+# pylint: disable=missing-docstring
+
+def baz(): # [blacklisted-name]
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=3.0
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unused_import.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unused_import.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unused_import.txt	(revision 1126)
@@ -0,0 +1,8 @@
+unused-import:3::Unused import xml.etree
+unused-import:4::Unused import xml.sax
+unused-import:5::Unused os.path imported as test
+unused-import:6::Unused argv imported from sys as test2
+unused-import:7::Unused flags imported from sys
+unused-import:9::Unused OrderedDict imported from collections
+unused-import:9::Unused deque imported from collections
+unused-import:12::Unused SomeOtherName imported from fake
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.txt	(revision 1126)
@@ -0,0 +1,4 @@
+exec-used:3::Use of exec
+exec-used:4::Use of exec
+exec-used:6::Use of exec
+exec-used:9:func:Use of exec
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.txt	(revision 1126)
@@ -0,0 +1,4 @@
+deprecated-module:4::Uses of a deprecated module 'Bastion'
+deprecated-module:5::Uses of a deprecated module 'rexec'
+deprecated-module:7::Uses of a deprecated module 'Bastion'
+deprecated-module:8::Uses of a deprecated module 'rexec'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.py	(revision 1126)
@@ -0,0 +1,7 @@
+# +1: [syntax-error]
+# -*- coding: IBO-8859-1 -*-
+""" check correct unknown encoding declaration
+"""
+
+__revision__ = 'יייי'
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_not_called.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_not_called.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_not_called.py	(revision 1126)
@@ -0,0 +1,64 @@
+# pylint: disable=R0903,import-error,missing-docstring,wrong-import-position
+"""test for __init__ not called
+"""
+from __future__ import print_function
+
+class AAAA:  # <3.0:[old-style-class]
+    """ancestor 1"""
+
+    def __init__(self):
+        print('init', self)
+
+class BBBB:  # <3.0:[old-style-class]
+    """ancestor 2"""
+
+    def __init__(self):
+        print('init', self)
+
+class CCCC:  # <3.0:[old-style-class,no-init]
+    """ancestor 3"""
+
+
+class ZZZZ(AAAA, BBBB, CCCC):
+    """derived class"""
+
+    def __init__(self):  # [super-init-not-called]
+        AAAA.__init__(self)
+
+class NewStyleA(object):
+    """new style class"""
+    def __init__(self):
+        super(NewStyleA, self).__init__()
+        print('init', self)
+
+class NewStyleB(NewStyleA):
+    """derived new style class"""
+    def __init__(self):
+        super(NewStyleB, self).__init__()
+
+class NoInit(object):
+    """No __init__ defined"""
+
+class Init(NoInit):
+    """Don't complain for not calling the super __init__"""
+
+    def __init__(self, arg):
+        self.arg = arg
+
+class NewStyleC(object):
+    """__init__ defined by assignemnt."""
+    def xx_init(self):
+        """Initializer."""
+        pass
+
+    __init__ = xx_init
+
+class AssignedInit(NewStyleC):
+    """No init called."""
+    def __init__(self):  # [super-init-not-called]
+        self.arg = 0
+
+from missing import Missing
+
+class UnknownBases(Missing):
+    """Don't emit no-init if the bases aren't known."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_iterable_py33.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.3
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/future_unicode_literals.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+except_implementations=Jython
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.txt	(revision 1126)
@@ -0,0 +1,14 @@
+invalid-unary-operand-type:36:these_are_bad:"bad operand type for unary ~: list"
+invalid-unary-operand-type:37:these_are_bad:"bad operand type for unary ~: tuple"
+invalid-unary-operand-type:38:these_are_bad:"bad operand type for unary ~: dict"
+invalid-unary-operand-type:39:these_are_bad:"bad operand type for unary ~: dict"
+invalid-unary-operand-type:40:these_are_bad:"bad operand type for unary ~: set"
+invalid-unary-operand-type:41:these_are_bad:"bad operand type for unary -: set"
+invalid-unary-operand-type:42:these_are_bad:"bad operand type for unary -: str"
+invalid-unary-operand-type:43:these_are_bad:"bad operand type for unary ~: str"
+invalid-unary-operand-type:44:these_are_bad:"bad operand type for unary +: str"
+invalid-unary-operand-type:47:these_are_bad:"bad operand type for unary ~: <lambda>"
+invalid-unary-operand-type:48:these_are_bad:"bad operand type for unary ~: A"
+invalid-unary-operand-type:49:these_are_bad:"bad operand type for unary ~: A"
+invalid-unary-operand-type:50:these_are_bad:"bad operand type for unary ~: collections"
+invalid-unary-operand-type:51:these_are_bad:"bad operand type for unary ~: float"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_is_generator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_is_generator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_is_generator.py	(revision 1126)
@@ -0,0 +1,5 @@
+# pylint: disable=missing-docstring,too-few-public-methods
+
+class SomeClass(object):
+    def __init__(self): # [init-is-generator]
+        yield None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redundant_unittest_assert.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redundant_unittest_assert.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redundant_unittest_assert.py	(revision 1126)
@@ -0,0 +1,38 @@
+# pylint: disable=missing-docstring,too-few-public-methods
+"""
+http://www.logilab.org/ticket/355
+If you are using assertTrue or assertFalse and the first argument is a
+constant(like a string), then the assert will always be true. Therefore,
+it should emit a warning message.
+"""
+
+import unittest
+
+@unittest.skip("don't run this")
+class Tests(unittest.TestCase):
+    def test_something(self):
+        ''' Simple test '''
+        some_var = 'It should be assertEqual'
+        # +1:[redundant-unittest-assert]
+        self.assertTrue('I meant assertEqual not assertTrue', some_var)
+        # +1:[redundant-unittest-assert]
+        self.assertFalse('I meant assertEqual not assertFalse', some_var)
+        # +1:[redundant-unittest-assert]
+        self.assertTrue(True, some_var)
+        # +1:[redundant-unittest-assert]
+        self.assertFalse(False, some_var)
+        # +1:[redundant-unittest-assert]
+        self.assertFalse(None, some_var)
+        # +1:[redundant-unittest-assert]
+        self.assertTrue(0, some_var)
+
+        self.assertTrue('should be' in some_var, some_var)
+        self.assertTrue(some_var, some_var)
+
+
+@unittest.skip("don't run this")
+class RegressionWithArgs(unittest.TestCase):
+    '''Don't fail if the bound method doesn't have arguments.'''
+
+    def test(self):
+        self.run()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unidiomatic_typecheck.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unidiomatic_typecheck.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unidiomatic_typecheck.py	(revision 1126)
@@ -0,0 +1,76 @@
+"""Warnings for using type(x) == Y or type(x) is Y instead of isinstance(x, Y)."""
+# pylint: disable=missing-docstring,expression-not-assigned,redefined-builtin,invalid-name
+
+def simple_positives():
+    type(42) is int # [unidiomatic-typecheck]
+    type(42) is not int # [unidiomatic-typecheck]
+    type(42) == int # [unidiomatic-typecheck]
+    type(42) != int # [unidiomatic-typecheck]
+    type(42) in [int] # [unidiomatic-typecheck]
+    type(42) not in [int] # [unidiomatic-typecheck]
+
+def simple_inference_positives():
+    alias = type
+    alias(42) is int # [unidiomatic-typecheck]
+    alias(42) is not int # [unidiomatic-typecheck]
+    alias(42) == int # [unidiomatic-typecheck]
+    alias(42) != int # [unidiomatic-typecheck]
+    alias(42) in [int] # [unidiomatic-typecheck]
+    alias(42) not in [int] # [unidiomatic-typecheck]
+
+def type_creation_negatives():
+    type('Q', (object,), dict(a=1)) is int
+    type('Q', (object,), dict(a=1)) is not int
+    type('Q', (object,), dict(a=1)) == int
+    type('Q', (object,), dict(a=1)) != int
+    type('Q', (object,), dict(a=1)) in [int]
+    type('Q', (object,), dict(a=1)) not in [int]
+
+def invalid_type_call_negatives(**kwargs):
+    type(bad=7) is int
+    type(bad=7) is not int
+    type(bad=7) == int
+    type(bad=7) != int
+    type(bad=7) in [int]
+    type(bad=7) not in [int]
+    type('bad', 7) is int
+    type('bad', 7) is not int
+    type('bad', 7) == int
+    type('bad', 7) != int
+    type('bad', 7) in [int]
+    type('bad', 7) not in [int]
+    type(**kwargs) is int
+    type(**kwargs) is not int
+    type(**kwargs) == int
+    type(**kwargs) != int
+    type(**kwargs) in [int]
+    type(**kwargs) not in [int]
+
+def local_var_shadowing_inference_negatives():
+    type = lambda dummy: 7
+    type(42) is int
+    type(42) is not int
+    type(42) == int
+    type(42) != int
+    type(42) in [int]
+    type(42) not in [int]
+
+def parameter_shadowing_inference_negatives(type):
+    type(42) is int
+    type(42) is not int
+    type(42) == int
+    type(42) != int
+    type(42) in [int]
+    type(42) not in [int]
+
+def deliberate_subclass_check_negatives(b):
+    type(42) is type(b)
+    type(42) is not type(b)
+
+def type_of_literals_positives(a):
+    type(a) is type([]) # [unidiomatic-typecheck]
+    type(a) is not type([]) # [unidiomatic-typecheck]
+    type(a) is type({}) # [unidiomatic-typecheck]
+    type(a) is not type({}) # [unidiomatic-typecheck]
+    type(a) is type("") # [unidiomatic-typecheck]
+    type(a) is not type("") # [unidiomatic-typecheck]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_not_lazy.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_not_lazy.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_not_lazy.py	(revision 1126)
@@ -0,0 +1,17 @@
+# pylint: disable=missing-docstring,no-member,deprecated-method
+
+# Muck up the names in an effort to confuse...
+import logging as renamed_logging
+import os as logging
+
+# Statements that should be flagged:
+renamed_logging.warn('%s, %s' % (4, 5))             # [logging-not-lazy]
+renamed_logging.exception('%s' % 'Exceptional!')    # [logging-not-lazy]
+renamed_logging.log(renamed_logging.INFO, 'msg: %s' % 'Run!')  # [logging-not-lazy]
+
+# Statements that should not be flagged:
+renamed_logging.warn('%s, %s', 4, 5)
+renamed_logging.log(renamed_logging.INFO, 'msg: %s', 'Run!')
+renamed_logging.warn('%s' + ' the rest of a single string')
+logging.warn('%s, %s' % (4, 5))
+logging.log(logging.INFO, 'msg: %s' % 'Run!')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.txt	(revision 1126)
@@ -0,0 +1 @@
+raising-non-exception:13::Raising a new style class which doesn't inherit from BaseException
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.py	(revision 1126)
@@ -0,0 +1,12 @@
+"""Test that a name is both nonlocal and global in the same scope."""
+# pylint: disable=missing-docstring,global-variable-not-assigned,invalid-name,nonlocal-without-binding
+
+def bad(): # [nonlocal-and-global]
+    nonlocal missing
+    global missing
+
+def good():
+    nonlocal missing
+    def test():
+        global missing
+    return test
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/blacklisted_name.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/blacklisted_name.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/blacklisted_name.txt	(revision 1126)
@@ -0,0 +1 @@
+blacklisted-name:3:baz:Black listed name "baz"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error_jython.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+except_implementations=CPython,PyPy,IronPython
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_caught.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_caught.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_exceptions_caught.txt	(revision 1126)
@@ -0,0 +1,12 @@
+catching-non-exception:27::"Catching an exception which doesn't inherit from BaseException: MyException"
+catching-non-exception:33::"Catching an exception which doesn't inherit from BaseException: MyException"
+catching-non-exception:33::"Catching an exception which doesn't inherit from BaseException: MySecondException"
+catching-non-exception:54::"Catching an exception which doesn't inherit from BaseException: None"
+catching-non-exception:54::"Catching an exception which doesn't inherit from BaseException: list()"
+catching-non-exception:59::"Catching an exception which doesn't inherit from BaseException: None"
+catching-non-exception:72::"Catching an exception which doesn't inherit from BaseException: 4"
+catching-non-exception:72::"Catching an exception which doesn't inherit from BaseException: None"
+catching-non-exception:72::"Catching an exception which doesn't inherit from BaseException: list([4, 5, 6])"
+catching-non-exception:85::"Catching an exception which doesn't inherit from BaseException: NON_EXCEPTION_TUPLE"
+catching-non-exception:103::"Catching an exception which doesn't inherit from BaseException: object"
+catching-non-exception:108::"Catching an exception which doesn't inherit from BaseException: range"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/import_error.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/import_error.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/import_error.txt	(revision 1126)
@@ -0,0 +1,3 @@
+import-error:3::"Unable to import 'totally_missing'"
+import-error:16::"Unable to import 'maybe_missing_2'"
+import-error:36::"Unable to import 'functional.collections'"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_disable.txt	(revision 1126)
@@ -0,0 +1 @@
+bad-format-string:1::Invalid format string
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_few_public_methods.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_few_public_methods.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_few_public_methods.txt	(revision 1126)
@@ -0,0 +1 @@
+too-few-public-methods:4:Aaaa:Too few public methods (1/2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_position.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_position.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wrong_import_position.py	(revision 1126)
@@ -0,0 +1,33 @@
+"""Checks import order rule"""
+# pylint: disable=unused-import,relative-import,ungrouped-imports,wrong-import-order,using-constant-test
+# pylint: disable=import-error, too-few-public-methods, missing-docstring
+import os.path
+
+if True:
+    from astroid import are_exclusive
+try:
+    import sys
+except ImportError:
+    class Myclass(object):
+        """docstring"""
+
+if sys.version_info[0] == 3:
+    from collections import OrderedDict
+else:
+    class OrderedDict(object):
+        """Nothing to see here."""
+        def some_func(self):
+            pass
+
+import six
+
+CONSTANT = True
+
+import datetime  # [wrong-import-position]
+
+VAR = 0
+for i in range(10):
+    VAR += i
+
+import scipy  # [wrong-import-position]
+import astroid  # [wrong-import-position]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/syntax_error.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+except_implementations=Jython
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.py	(revision 1126)
@@ -0,0 +1,20 @@
+# pylint:disable=W0105, W0511
+"""Test for backslash escapes in byte vs unicode strings"""
+
+# Would be valid in Unicode, but probably not what you want otherwise
+BAD_UNICODE = b'\u0042'  # [anomalous-unicode-escape-in-string]
+BAD_LONG_UNICODE = b'\U00000042'  # [anomalous-unicode-escape-in-string]
+# +1:[anomalous-unicode-escape-in-string]
+BAD_NAMED_UNICODE = b'\N{GREEK SMALL LETTER ALPHA}'
+
+GOOD_UNICODE = u'\u0042'
+GOOD_LONG_UNICODE = u'\U00000042'
+GOOD_NAMED_UNICODE = u'\N{GREEK SMALL LETTER ALPHA}'
+
+
+# Valid raw strings
+RAW_BACKSLASHES = r'raw'
+RAW_UNICODE = ur"\u0062\n"
+
+# In a comment you can have whatever you want: \ \\ \n \m
+# even things that look like bad strings: "C:\Program Files"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_in_init.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_in_init.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/return_in_init.txt	(revision 1126)
@@ -0,0 +1 @@
+return-in-init:5:MyClass.__init__:Explicit return in __init__
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking.py	(revision 1126)
@@ -0,0 +1,11 @@
+""" Code for checking the display of the module
+for unbalanced-tuple-unpacking and unpacking-non-sequence
+"""
+
+def unpack():
+    """ Return something"""
+    return (1, 2, 3)
+
+def nonseq():
+    """ Return non sequence """
+    return 1
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bare_except.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bare_except.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bare_except.py	(revision 1126)
@@ -0,0 +1,6 @@
+# pylint: disable=missing-docstring, import-error
+
+try:
+    1 + "2"
+except: # [bare-except]
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_indentation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_indentation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_indentation.py	(revision 1126)
@@ -0,0 +1,20 @@
+# pylint: disable=missing-docstring, pointless-statement
+from __future__ import print_function
+
+
+def totoo():
+ print('malindented') # [bad-indentation]
+
+def tutuu():
+    print('good indentation')
+
+def titii():
+     1  # and this. # [bad-indentation]
+
+def tataa(kdict):
+    for key in ['1', '2', '3']:
+        key = key.lower()
+
+        if key in kdict:
+            del kdict[key]
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_self_argument.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_self_argument.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_self_argument.py	(revision 1126)
@@ -0,0 +1,20 @@
+"""Checks that missing self in method defs don't crash Pylint."""
+
+
+
+class MyClass(object):
+    """A class with some methods missing self args."""
+
+    def __init__(self):
+        self.var = "var"
+
+    def method():  # [no-method-argument]
+        """A method without a self argument."""
+
+    def setup():  # [no-method-argument]
+        """A method without a self argument, but usage."""
+        self.var = 1  # [undefined-variable]
+
+    def correct(self):
+        """Correct."""
+        self.var = "correct"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/generated_members.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/generated_members.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/generated_members.rc	(revision 1126)
@@ -0,0 +1,5 @@
+[Messages Control]
+disable=too-few-public-methods,print-statement
+
+[typecheck]
+generated-members=DoesNotExist,"[a-zA-Z]+_set{1,2}""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments_differ.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments_differ.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments_differ.py	(revision 1126)
@@ -0,0 +1,138 @@
+"""Test that we are emitting arguments-differ when the arguments are different."""
+# pylint: disable=missing-docstring, too-few-public-methods
+
+class Parent(object):
+
+    def test(self):
+        pass
+
+
+class Child(Parent):
+
+    def test(self, arg): # [arguments-differ]
+        pass
+
+
+class ParentDefaults(object):
+
+    def test(self, arg=None, barg=None):
+        pass
+
+class ChildDefaults(ParentDefaults):
+
+    def test(self, arg=None): # [arguments-differ]
+        pass
+
+
+class Classmethod(object):
+
+    @classmethod
+    def func(cls, data):
+        return data
+
+    @classmethod
+    def func1(cls):
+        return cls
+
+
+class ClassmethodChild(Classmethod):
+
+    @staticmethod
+    def func(): # [arguments-differ]
+        pass
+
+    @classmethod
+    def func1(cls):
+        return cls()
+
+
+class Builtins(dict):
+    """Ignore for builtins, for which we don't know the number of required args."""
+
+    @classmethod
+    def fromkeys(cls, arg, arg1):
+        pass
+
+
+class Varargs(object):
+
+    def test(self, arg, **kwargs):
+        pass
+
+class VarargsChild(Varargs):
+
+    def test(self, arg):
+        pass
+
+
+class Super(object):
+    def __init__(self):
+        pass
+
+    def __private(self):
+        pass
+
+    def __private2_(self):
+        pass
+
+    def ___private3(self):
+        pass
+
+    def method(self, param):
+        raise NotImplementedError
+
+
+class Sub(Super):
+
+    # pylint: disable=unused-argument
+    def __init__(self, arg):
+        super(Sub, self).__init__()
+
+    def __private(self, arg):
+        pass
+
+    def __private2_(self, arg):
+        pass
+
+    def ___private3(self, arg):
+        pass
+
+    def method(self, param='abc'):
+        pass
+
+
+class Staticmethod(object):
+
+    @staticmethod
+    def func(data):
+        return data
+
+
+class StaticmethodChild(Staticmethod):
+
+    @classmethod
+    def func(cls, data):
+        return data
+
+
+class Property(object):
+
+    @property
+    def close(self):
+        pass
+
+class PropertySetter(Property):
+
+    @property
+    def close(self):
+        pass
+
+    @close.setter
+    def close(self, attr):
+        return attr
+
+
+class StaticmethodChild2(Staticmethod):
+
+    def func(self, arg):
+        super(StaticmethodChild2, self).func(arg)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to_protected_members.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to_protected_members.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to_protected_members.py	(revision 1126)
@@ -0,0 +1,44 @@
+# pylint: disable=too-few-public-methods, W0231, print-statement
+# pylint: disable=no-classmethod-decorator
+"""Test external access to protected class members."""
+from __future__ import print_function
+
+class MyClass(object):
+    """Class with protected members."""
+    _cls_protected = 5
+
+    def __init__(self, other):
+        MyClass._cls_protected = 6
+        self._protected = 1
+        self.public = other
+        self.attr = 0
+
+    def test(self):
+        """Docstring."""
+        self._protected += self._cls_protected
+        print(self.public._haha)  # [protected-access]
+
+    def clsmeth(cls):
+        """Docstring."""
+        cls._cls_protected += 1
+        print(cls._cls_protected)
+    clsmeth = classmethod(clsmeth)
+
+    def _private_method(self):
+        """Doing nothing."""
+
+
+class Subclass(MyClass):
+    """Subclass with protected members."""
+
+    def __init__(self):
+        MyClass._protected = 5
+        super(Subclass, self)._private_method()
+
+INST = Subclass()
+INST.attr = 1
+print(INST.attr)
+INST._protected = 2  # [protected-access]
+print(INST._protected)  # [protected-access]
+INST._cls_protected = 3  # [protected-access]
+print(INST._cls_protected)  # [protected-access]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.py	(revision 1126)
@@ -0,0 +1,63 @@
+""" Various tests for class members access. """
+# pylint: disable=R0903,import-error,no-init,missing-docstring, wrong-import-position,wrong-import-order
+from missing import Missing
+class MyClass(object):
+    """class docstring"""
+
+    def __init__(self):
+        """init"""
+        self.correct = 1
+
+    def test(self):
+        """test"""
+        self.correct += 2
+        self.incorrect += 2 # [no-member]
+        del self.havenot # [no-member]
+        self.nonexistent1.truc() # [no-member]
+        self.nonexistent2[1] = 'hehe' # [no-member]
+
+class XYZMixin(object):
+    """access to undefined members should be ignored in mixin classes by
+    default
+    """
+    def __init__(self):
+        print(self.nonexistent)
+
+
+class NewClass(object):
+    """use object.__setattr__"""
+    def __init__(self):
+        self.__setattr__('toto', 'tutu')
+
+from abc import ABCMeta
+
+class TestMetaclass(object, metaclass=ABCMeta):
+    """ Test attribute access for metaclasses. """
+
+class Metaclass(type):
+    """ metaclass """
+    @classmethod
+    def test(mcs):
+        """ classmethod """
+
+class UsingMetaclass(object, metaclass=Metaclass):
+    """ empty """
+
+# TestMetaclass.register(int)
+# UsingMetaclass.test()
+TestMetaclass().register(int) # [no-member]
+UsingMetaclass().test() # [no-member]
+
+
+class NoKnownBases(Missing):
+    """Don't emit no-member if we don't know the bases of a class."""
+
+NoKnownBases().lalala()
+
+# Enabled on a more capable astroid (1.4.0)
+# class MetaClass(object):
+#     """Look some methods in the implicit metaclass."""
+#
+#     @classmethod
+#     def whatever(cls):
+#         return cls.mro() + cls.missing()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_return_statements.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_return_statements.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_return_statements.py	(revision 1126)
@@ -0,0 +1,24 @@
+# pylint: disable=missing-docstring
+
+def stupid_function(arg): # [too-many-return-statements]
+    if arg == 1:
+        return 1
+    elif arg == 2:
+        return 2
+    elif arg == 3:
+        return 3
+    elif arg == 4:
+        return 4
+    elif arg == 5:
+        return 5
+    elif arg == 6:
+        return 6
+    elif arg == 7:
+        return 7
+    elif arg == 8:
+        return 8
+    elif arg == 9:
+        return 9
+    elif arg == 10:
+        return 10
+    return None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""Test for redefine-in-handler, overwriting names in exception handlers."""
+
+def new_style():
+    """Some exceptions can be unpacked."""
+    try:
+        pass
+    except IOError, (errno, message):  # [unpacking-in-except]
+        print errno, message  # pylint: disable=print-statement
+    # +1: [redefine-in-handler,redefine-in-handler,unpacking-in-except]
+    except IOError, (new_style, tuple):  # pylint: disable=duplicate-except
+        print new_style, tuple  # pylint: disable=print-statement
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ctor_arguments.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ctor_arguments.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ctor_arguments.py	(revision 1126)
@@ -0,0 +1,104 @@
+"""Test function argument checker on __init__
+
+Based on test/functional/arguments.py
+"""
+# pylint: disable=C0111,R0903,W0231
+
+
+class Class1Arg(object):
+    def __init__(self, first_argument):
+        """one argument function"""
+
+class Class3Arg(object):
+    def __init__(self, first_argument, second_argument, third_argument):
+        """three arguments function"""
+
+class ClassDefaultArg(object):
+    def __init__(self, one=1, two=2):
+        """function with default value"""
+
+class Subclass1Arg(Class1Arg):
+    pass
+
+class ClassAllArgs(Class1Arg):
+    def __init__(self, *args, **kwargs):
+        pass
+
+class ClassMultiInheritance(Class1Arg, Class3Arg):
+    pass
+
+class ClassNew(object):
+    def __new__(cls, first_argument, kwarg=None):
+        return first_argument, kwarg
+
+Class1Arg(420)
+Class1Arg()  # [no-value-for-parameter]
+Class1Arg(1337, 347)  # [too-many-function-args]
+
+Class3Arg(420, 789)  # [no-value-for-parameter]
+# +1:[no-value-for-parameter,no-value-for-parameter,no-value-for-parameter]
+Class3Arg()
+Class3Arg(1337, 347, 456)
+Class3Arg('bab', 'bebe', None, 5.6)  # [too-many-function-args]
+
+ClassDefaultArg(1, two=5)
+ClassDefaultArg(two=5)
+
+Class1Arg(bob=4)  # [no-value-for-parameter,unexpected-keyword-arg]
+ClassDefaultArg(1, 4, coin="hello")  # [unexpected-keyword-arg]
+
+ClassDefaultArg(1, one=5)  # [redundant-keyword-arg]
+
+Subclass1Arg(420)
+Subclass1Arg()  # [no-value-for-parameter]
+Subclass1Arg(1337, 347)  # [too-many-function-args]
+
+ClassAllArgs()
+ClassAllArgs(1, 2, 3, even=4, more=5)
+
+ClassMultiInheritance(1)
+ClassMultiInheritance(1, 2, 3)  # [too-many-function-args]
+
+ClassNew(1, kwarg=1)
+ClassNew(1, 2, 3)  # [too-many-function-args]
+ClassNew(one=2)  # [no-value-for-parameter,unexpected-keyword-arg]
+
+
+class Metaclass(type):
+    def __new__(mcs, name, bases, namespace):
+        return type.__new__(mcs, name, bases, namespace)
+
+def with_metaclass(meta, base=object):
+    """Create a new type that can be used as a metaclass."""
+    return meta("NewBase", (base, ), {})
+
+class ClassWithMeta(with_metaclass(Metaclass)):
+    pass
+
+ClassWithMeta()
+
+
+class BuiltinExc(Exception):
+    def __init__(self, val=True):
+        self.val = val
+
+BuiltinExc(42, 24, badarg=1) # [too-many-function-args,unexpected-keyword-arg]
+
+
+class Clsmethod(object):
+    def __init__(self, first, second):
+        self.first = first
+        self.second = second
+
+    @classmethod
+    def from_nothing(cls):
+        return cls(1, 2, 3, 4) # [too-many-function-args]
+
+    @classmethod
+    def from_nothing1(cls):
+        return cls() # [no-value-for-parameter,no-value-for-parameter]
+
+    @classmethod
+    def from_nothing2(cls):
+        # +1: [no-value-for-parameter,unexpected-keyword-arg]
+        return cls(1, not_argument=2)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_star_expressions.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py2.txt	(revision 1126)
@@ -0,0 +1,3 @@
+unsupported-membership-test:34:test:Value 'IterableClass()' doesn't support membership test
+unsupported-membership-test:35:test:Value 'OldIterableClass()' doesn't support membership test
+unsupported-membership-test:36:test:Value 'ContainerClass()' doesn't support membership test
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_public_methods.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_public_methods.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_public_methods.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-public-methods:3:Aaaa:Too many public methods (21/20)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.py	(revision 1126)
@@ -0,0 +1,4 @@
+"mixing line endings are not welcome"
+# +1: [unexpected-line-ending-format, mixed-line-endings]
+CONST = 1
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.py	(revision 1126)
@@ -0,0 +1,10 @@
+# pylint: disable=missing-docstring
+
+exec('a = __revision__') # [exec-used]
+exec('a = 1', globals={}) # [exec-used]
+
+exec('a = 1', globals=globals()) # [exec-used]
+
+def func():
+    exec('b = 1') # [exec-used]
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.py	(revision 1126)
@@ -0,0 +1,8 @@
+"""Test deprecated modules."""
+# pylint: disable=unused-import,no-name-in-module,import-error,ungrouped-imports
+
+import Bastion # [deprecated-module]
+import rexec # [deprecated-module]
+
+from Bastion import bastion_module # [deprecated-module]
+from rexec import rexec_module # [deprecated-module]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mixed_indentation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mixed_indentation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mixed_indentation.py	(revision 1126)
@@ -0,0 +1,10 @@
+"""test mixed tabs and spaces"""
+from __future__ import print_function
+
+def spaces_func():
+    """yo"""
+    print("yo")
+
+def tab_func():
+	"""yo""" # [mixed-indentation]
+	print("yo") # [mixed-indentation]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=3.0
+except_implementations=CPython, Jython, IronPython
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_bare_raise.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_bare_raise.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_bare_raise.txt	(revision 1126)
@@ -0,0 +1,7 @@
+misplaced-bare-raise:5::The raise statement is not inside an except clause
+misplaced-bare-raise:36:test1.best:The raise statement is not inside an except clause
+misplaced-bare-raise:39:test1:The raise statement is not inside an except clause
+misplaced-bare-raise:40::The raise statement is not inside an except clause
+misplaced-bare-raise:49::The raise statement is not inside an except clause
+misplaced-bare-raise:57:A:The raise statement is not inside an except clause
+misplaced-bare-raise:68::The raise statement is not inside an except clause
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_reversed_sequence.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_reversed_sequence.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_reversed_sequence.txt	(revision 1126)
@@ -0,0 +1,8 @@
+bad-reversed-sequence:43:test:The first reversed() argument is not a sequence
+bad-reversed-sequence:46:test:The first reversed() argument is not a sequence
+bad-reversed-sequence:47:test:The first reversed() argument is not a sequence
+bad-reversed-sequence:48:test:The first reversed() argument is not a sequence
+bad-reversed-sequence:51:test:The first reversed() argument is not a sequence
+bad-reversed-sequence:52:test:The first reversed() argument is not a sequence
+bad-reversed-sequence:54:test:The first reversed() argument is not a sequence
+bad-reversed-sequence:55:test:The first reversed() argument is not a sequence
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking.py	(revision 1126)
@@ -0,0 +1,108 @@
+"""Check possible unbalanced tuple unpacking """
+from __future__ import absolute_import
+from functional.unpacking import unpack
+
+# pylint: disable=using-constant-test
+
+def do_stuff():
+    """This is not right."""
+    first, second = 1, 2, 3 # [unbalanced-tuple-unpacking]
+    return first + second
+
+def do_stuff1():
+    """This is not right."""
+    first, second = [1, 2, 3] # [unbalanced-tuple-unpacking]
+    return first + second
+
+def do_stuff2():
+    """This is not right."""
+    (first, second) = 1, 2, 3 # [unbalanced-tuple-unpacking]
+    return first + second
+
+def do_stuff3():
+    """This is not right."""
+    first, second = range(100)
+    return first + second
+
+def do_stuff4():
+    """ This is right """
+    first, second = 1, 2
+    return first + second
+
+def do_stuff5():
+    """ This is also right """
+    first, second = (1, 2)
+    return first + second
+
+def do_stuff6():
+    """ This is right """
+    (first, second) = (1, 2)
+    return first + second
+
+def temp():
+    """ This is not weird """
+    if True:
+        return [1, 2]
+    return [2, 3, 4]
+
+def do_stuff7():
+    """ This is not right, but we're not sure """
+    first, second = temp()
+    return first + second
+
+def temp2():
+    """ This is weird, but correct """
+    if True:
+        return (1, 2)
+    else:
+        if True:
+            return (2, 3)
+    return (4, 5)
+
+def do_stuff8():
+    """ This is correct """
+    first, second = temp2()
+    return first + second
+
+def do_stuff9():
+    """ This is not correct """
+    first, second = unpack() # [unbalanced-tuple-unpacking]
+    return first + second
+
+class UnbalancedUnpacking(object):
+    """ Test unbalanced tuple unpacking in instance attributes. """
+    # pylint: disable=attribute-defined-outside-init, invalid-name, too-few-public-methods
+    def test(self):
+        """ unpacking in instance attributes """
+        # we're not sure if temp() returns two or three values
+        # so we shouldn't emit an error
+        self.a, self.b = temp()
+        self.a, self.b = temp2()
+        self.a, self.b = unpack() # [unbalanced-tuple-unpacking]
+
+
+def issue329(*args):
+    """ Don't emit unbalanced tuple unpacking if the
+    rhs of the assignment is a variable-length argument,
+    because we don't know the actual length of the tuple.
+    """
+    first, second, third = args
+    return first, second, third
+
+
+def test_decimal():
+    """Test a false positive with decimal.Decimal.as_tuple
+
+    See astroid https://bitbucket.org/logilab/astroid/issues/92/
+    """
+    from decimal import Decimal
+    dec = Decimal(2)
+    first, second, third = dec.as_tuple()
+    return first, second, third
+
+
+def test_issue_559():
+    """Test that we don't have a false positive wrt to issue #559."""
+    from ctypes import c_int
+    root_x, root_y, win_x, win_y = [c_int()] * 4
+    return root_x, root_y, win_x, win_y
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/docstrings.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/docstrings.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/docstrings.txt	(revision 1126)
@@ -0,0 +1,8 @@
+missing-docstring:1::Missing module docstring
+empty-docstring:6:function0:Empty function docstring
+missing-docstring:10:function1:Missing function docstring
+missing-docstring:23:AAAA:Missing class docstring
+missing-docstring:40:AAAA.method1:Missing method docstring:INFERENCE
+empty-docstring:48:AAAA.method3:Empty method docstring:INFERENCE
+empty-docstring:62:DDDD.method2:Empty method docstring:INFERENCE
+missing-docstring:70:DDDD.method4:Missing method docstring:INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_ancestors.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_ancestors.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_ancestors.py	(revision 1126)
@@ -0,0 +1,25 @@
+# pylint: disable=missing-docstring, too-few-public-methods
+
+class Aaaa(object):
+    pass
+class Bbbb(object):
+    pass
+class Cccc(object):
+    pass
+class Dddd(object):
+    pass
+class Eeee(object):
+    pass
+class Ffff(object):
+    pass
+class Gggg(object):
+    pass
+class Hhhh(object):
+    pass
+
+class Iiii(Aaaa, Bbbb, Cccc, Dddd, Eeee, Ffff, Gggg, Hhhh): # [too-many-ancestors]
+    pass
+
+class Jjjj(Iiii): # [too-many-ancestors]
+    pass
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""Test deprecated modules uninstalled."""
+# pylint: disable=unused-import,no-name-in-module,import-error
+
+from uninstalled import uninstalled_module # [deprecated-module]
+import uninstalled # [deprecated-module]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.py	(revision 1126)
@@ -0,0 +1,24 @@
+"""Check that raise ... from .. uses a proper exception context """
+
+# pylint: disable=unreachable, import-error, multiple-imports
+
+import socket, unknown
+
+__revision__ = 0
+
+class ExceptionSubclass(Exception):
+    """ subclass """
+
+def test():
+    """ docstring """
+    raise IndexError from 1 # [bad-exception-context]
+    raise IndexError from None
+    raise IndexError from ZeroDivisionError
+    raise IndexError from object() # [bad-exception-context]
+    raise IndexError from ExceptionSubclass
+    raise IndexError from socket.error
+    raise IndexError() from None
+    raise IndexError() from ZeroDivisionError
+    raise IndexError() from ZeroDivisionError()
+    raise IndexError() from object() # [bad-exception-context]
+    raise IndexError() from unknown
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bare_except.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bare_except.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bare_except.txt	(revision 1126)
@@ -0,0 +1 @@
+bare-except:5::No exception type(s) specified
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.py	(revision 1126)
@@ -0,0 +1,19 @@
+"""
+Check that instantiating a class with `abc.ABCMeta` as ancestor fails if it
+defines abstract methods.
+"""
+
+# pylint: disable=too-few-public-methods, missing-docstring, no-init
+
+import abc
+
+
+
+class BadClass(abc.ABC):
+    @abc.abstractmethod
+    def test(self):
+        pass
+
+def main():
+    """ do nothing """
+    BadClass() # [abstract-class-instantiated]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.py	(revision 1126)
@@ -0,0 +1,13 @@
+"""The following code should emit a raising-non-exception.
+
+Previously, it didn't, due to a bug in the check for bad-exception-context,
+which prevented further checking on the Raise node.
+"""
+# pylint: disable=import-error, too-few-public-methods
+
+from missing_module import missing
+
+class Exc(object):
+    """Not an actual exception."""
+
+raise Exc from missing # [raising-non-exception]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py2.txt	(revision 1126)
@@ -0,0 +1,4 @@
+abstract-class-instantiated:79:main:Abstract class 'BadClass' with abstract methods instantiated
+abstract-class-instantiated:80:main:Abstract class 'SecondBadClass' with abstract methods instantiated
+abstract-class-instantiated:81:main:Abstract class 'ThirdBadClass' with abstract methods instantiated
+abstract-class-instantiated:82:main:Abstract class 'FourthBadClass' with abstract methods instantiated
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_member_before_definition.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_member_before_definition.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_member_before_definition.py	(revision 1126)
@@ -0,0 +1,40 @@
+# pylint: disable=missing-docstring,too-few-public-methods,invalid-name
+# pylint: disable=attribute-defined-outside-init
+
+class Aaaa(object):
+    """class with attributes defined in wrong order"""
+
+    def __init__(self):
+        var1 = self._var2 # [access-member-before-definition]
+        self._var2 = 3
+        self._var3 = var1
+
+
+class Bbbb(object):
+    A = 23
+    B = A
+
+    def __getattr__(self, attr):
+        try:
+            return self.__repo
+        except AttributeError:
+            self.__repo = attr
+            return attr
+
+
+    def catchme(self, attr):
+        """no AttributeError catched"""
+        try:
+            return self._repo # [access-member-before-definition]
+        except ValueError:
+            self._repo = attr
+            return attr
+
+
+class Mixin(object):
+
+    def test_mixin(self):
+        """Don't emit access-member-before-definition for mixin classes."""
+        if self.already_defined:
+            # pylint: disable=attribute-defined-outside-init
+            self.already_defined = None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.py	(revision 1126)
@@ -0,0 +1,30 @@
+""" Checks that reversed() receive proper argument """
+# pylint: disable=missing-docstring,invalid-name,unused-variable
+# pylint: disable=too-few-public-methods,no-self-use,no-absolute-import
+
+def test():
+    def parent():
+        a = 42
+        def stuff():
+            nonlocal a
+
+    c = 24
+    def parent2():
+        a = 42
+        def stuff():
+            def other_stuff():
+                nonlocal a
+                nonlocal c
+
+b = 42
+def func():
+    def other_func():
+        nonlocal b  # [nonlocal-without-binding]
+
+class SomeClass(object):
+    nonlocal x # [nonlocal-without-binding]
+
+    def func(self):
+        nonlocal some_attr # [nonlocal-without-binding]
+
+   
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""
+Check for indexing exceptions.
+"""
+# pylint: disable=import-error, no-absolute-import
+
+from unknown import ExtensionException
+__revision__ = 0
+
+class SubException(IndexError):
+    """ empty """
+
+_ = IndexError("test")[0] # [indexing-exception]
+_ = ZeroDivisionError("error")[0] # [indexing-exception]
+_ = ExtensionException("error")[0]
+_ = SubException("error")[1] # [indexing-exception]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_self_use_py3.txt	(revision 1126)
@@ -0,0 +1 @@
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_and_global.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/singleton_comparison.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/singleton_comparison.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/singleton_comparison.txt	(revision 1126)
@@ -0,0 +1,5 @@
+singleton-comparison:4::Comparison to None should be 'expr is None'
+singleton-comparison:5::Comparison to True should be just 'expr' or 'expr is True'
+singleton-comparison:6::Comparison to False should be 'not expr' or 'expr is False'
+singleton-comparison:7::Comparison to True should be just 'expr' or 'expr is True'
+singleton-comparison:11::Comparison to None should be 'expr is None'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assigning_non_slot.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assigning_non_slot.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assigning_non_slot.txt	(revision 1126)
@@ -0,0 +1,4 @@
+assigning-non-slot:18:Bad.__init__:Assigning to attribute 'missing' not defined in class slots
+assigning-non-slot:26:Bad2.__init__:Assigning to attribute 'missing' not defined in class slots
+assigning-non-slot:36:Bad3.__init__:Assigning to attribute 'missing' not defined in class slots
+assigning-non-slot:132:dont_emit_for_descriptors:Assigning to attribute 'non_data_descriptor' not defined in class slots
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_pass.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_pass.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_pass.py	(revision 1126)
@@ -0,0 +1,7 @@
+# pylint: disable=missing-docstring
+
+try:
+    A = 2
+except ValueError:
+    A = 24
+    pass # [unnecessary-pass]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.txt	(revision 1126)
@@ -0,0 +1 @@
+invalid-encoded-data:5::"Cannot decode using encoding ""utf-8"", unexpected byte at position 11"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.txt	(revision 1126)
@@ -0,0 +1,6 @@
+no-member:14:MyClass.test:Instance of 'MyClass' has no 'incorrect' member:INFERENCE
+no-member:15:MyClass.test:Instance of 'MyClass' has no 'havenot' member:INFERENCE
+no-member:16:MyClass.test:Instance of 'MyClass' has no 'nonexistent1' member:INFERENCE
+no-member:17:MyClass.test:Instance of 'MyClass' has no 'nonexistent2' member:INFERENCE
+no-member:50::Instance of 'TestMetaclass' has no 'register' member:INFERENCE
+no-member:51::Instance of 'UsingMetaclass' has no 'test' member:INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.py	(revision 1126)
@@ -0,0 +1,79 @@
+# pylint: disable=missing-docstring
+
+
+HEHE = {}
+
+def function1(value=[]): # [dangerous-default-value]
+    """docstring"""
+    return value
+
+def function2(value=HEHE): # [dangerous-default-value]
+    """docstring"""
+    return value
+
+def function3(value):
+    """docstring"""
+    return value
+
+def function4(value=set()): # [dangerous-default-value]
+    """set is mutable and dangerous."""
+    return value
+
+def function5(value=frozenset()):
+    """frozenset is immutable and safe."""
+    return value
+
+GLOBAL_SET = set()
+
+def function6(value=GLOBAL_SET): # [dangerous-default-value]
+    """set is mutable and dangerous."""
+    return value
+
+def function7(value=dict()): # [dangerous-default-value]
+    """dict is mutable and dangerous."""
+    return value
+
+def function8(value=list()):  # [dangerous-default-value]
+    """list is mutable and dangerous."""
+    return value
+
+def function9(value=[1, 2, 3, 4]): # [dangerous-default-value]
+    """list with items should not output item values in error message"""
+    return value
+
+def function10(value={'a': 1, 'b': 2}): # [dangerous-default-value]
+    """dictionaries with items should not output item values in error message"""
+    return value
+
+def function11(value=list([1, 2, 3])): # [dangerous-default-value]
+    """list with items should not output item values in error message"""
+    return value
+
+def function12(value=dict([('a', 1), ('b', 2)])): # [dangerous-default-value]
+    """dictionaries with items should not output item values in error message"""
+    return value
+
+OINK = {
+    'a': 1,
+    'b': 2
+}
+
+def function13(value=OINK): # [dangerous-default-value]
+    """dictionaries with items should not output item values in error message"""
+    return value
+
+def function14(value=dict([(1, 2), (1, 2, 3)])): # [dangerous-default-value]
+    """a dictionary which will not be inferred to a syntax AST, but to an
+    astroid.Instance.
+    """
+    return value
+
+INVALID_DICT = dict([(1, 2), (1, 2, 3)])
+
+def function15(value=INVALID_DICT): # [dangerous-default-value]
+    """The same situation as function14."""
+    return value
+
+def function16(value={1}): # [dangerous-default-value]
+    """set literal as default value"""
+    return value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py2.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context.py	(revision 1126)
@@ -0,0 +1,179 @@
+"""
+Checks that primitive values are not used in an
+iterating/mapping context.
+"""
+# pylint: disable=missing-docstring,invalid-name,too-few-public-methods,no-init,no-self-use,import-error,unused-argument,bad-mcs-method-argument,wrong-import-position
+from __future__ import print_function
+
+# primitives
+numbers = [1, 2, 3]
+
+for i in numbers:
+    pass
+
+for i in iter(numbers):
+    pass
+
+for i in "123":
+    pass
+
+for i in u"123":
+    pass
+
+for i in b"123":
+    pass
+
+for i in bytearray(b"123"):
+    pass
+
+for i in set(numbers):
+    pass
+
+for i in frozenset(numbers):
+    pass
+
+for i in dict(a=1, b=2):
+    pass
+
+# comprehensions
+for i in [x for x in range(10)]:
+    pass
+
+for i in {x for x in range(1, 100, 2)}:
+    pass
+
+for i in {x: 10 - x for x in range(10)}:
+    pass
+
+# generators
+def powers_of_two():
+    k = 0
+    while k < 10:
+        yield 2 ** k
+        k += 1
+
+for i in powers_of_two():
+    pass
+
+for i in powers_of_two:  # [not-an-iterable]
+    pass
+
+# check for custom iterators
+class A(object):
+    pass
+
+class B(object):
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        return 1
+
+    def next(self):
+        return 1
+
+class C(object):
+    "old-style iterator"
+    def __getitem__(self, k):
+        if k > 10:
+            raise IndexError
+        return k + 1
+
+    def __len__(self):
+        return 10
+
+for i in C():
+    print(i)
+
+
+def test(*args):
+    print(args)
+
+
+test(*A())  # [not-an-iterable]
+test(*B())
+test(*B)  # [not-an-iterable]
+for i in A():  # [not-an-iterable]
+    pass
+for i in B():
+    pass
+for i in B:  # [not-an-iterable]
+    pass
+
+for i in range:  # [not-an-iterable]
+    pass
+
+# check that primitive non-iterable types are catched
+for i in True:  # [not-an-iterable]
+    pass
+
+for i in None:  # [not-an-iterable]
+    pass
+
+for i in 8.5:  # [not-an-iterable]
+    pass
+
+for i in 10:  # [not-an-iterable]
+    pass
+
+
+# skip uninferable instances
+from some_missing_module import Iterable
+
+class MyClass(Iterable):
+    pass
+
+m = MyClass()
+for i in m:
+    print(i)
+
+# skip checks if statement is inside mixin/base/abstract class
+class ManagedAccessViewMixin(object):
+    access_requirements = None
+
+    def get_access_requirements(self):
+        return self.access_requirements
+
+    def dispatch(self, *_args, **_kwargs):
+        klasses = self.get_access_requirements()
+
+        # no error should be emitted here
+        for requirement in klasses:
+            print(requirement)
+
+class BaseType(object):
+    valid_values = None
+
+    def validate(self, value):
+        if self.valid_values is None:
+            return True
+        else:
+            # error should not be emitted here
+            for v in self.valid_values:
+                if value == v:
+                    return True
+            return False
+
+class AbstractUrlMarkManager(object):
+    def __init__(self):
+        self._lineparser = None
+        self._init_lineparser()
+        # error should not be emitted here
+        for line in self._lineparser:
+            print(line)
+
+    def _init_lineparser(self):
+        raise NotImplementedError
+
+# class is not named as abstract
+# but still is deduceably abstract
+class UrlMarkManager(object):
+    def __init__(self):
+        self._lineparser = None
+        self._init_lineparser()
+        # error should not be emitted here
+        for line in self._lineparser:
+            print(line)
+
+    def _init_lineparser(self):
+        raise NotImplementedError
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_statements.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_statements.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_statements.py	(revision 1126)
@@ -0,0 +1,60 @@
+# pylint: disable=missing-docstring
+
+from __future__ import print_function
+
+def stupid_function(arg): # [too-many-statements]
+    if arg == 1:
+        print(1)
+    elif arg == 2:
+        print(1)
+    elif arg == 3:
+        print(1)
+    elif arg == 4:
+        print(1)
+    elif arg == 5:
+        print(1)
+    elif arg == 6:
+        print(1)
+    elif arg == 7:
+        print(1)
+    elif arg == 8:
+        print(1)
+    elif arg == 9:
+        print(1)
+    elif arg == 10:
+        print(1)
+    elif arg < 1:
+        print(1)
+        print(1)
+        arg = 0
+    for _ in range(arg):
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
+        print(1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inconsistent_mro.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inconsistent_mro.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/inconsistent_mro.py	(revision 1126)
@@ -0,0 +1,9 @@
+"""Tests for inconsistent-mro."""
+# pylint: disable=missing-docstring,too-few-public-methods,no-init
+
+class Str(str):
+    pass
+
+
+class Inconsistent(str, Str): # [inconsistent-mro]
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.py	(revision 1126)
@@ -0,0 +1,65 @@
+""" Various tests for class members access. """
+# pylint: disable=R0903,print-statement,no-absolute-import, metaclass-assignment,import-error,no-init,missing-docstring, wrong-import-order,wrong-import-position
+from missing import Missing
+class MyClass(object):
+    """class docstring"""
+
+    def __init__(self):
+        """init"""
+        self.correct = 1
+
+    def test(self):
+        """test"""
+        self.correct += 2
+        self.incorrect += 2 # [no-member]
+        del self.havenot # [no-member]
+        self.nonexistent1.truc() # [no-member]
+        self.nonexistent2[1] = 'hehe' # [no-member]
+
+class XYZMixin(object):
+    """access to undefined members should be ignored in mixin classes by
+    default
+    """
+    def __init__(self):
+        print self.nonexistent
+
+
+class NewClass(object):
+    """use object.__setattr__"""
+    def __init__(self):
+        self.__setattr__('toto', 'tutu')
+
+from abc import ABCMeta
+
+class TestMetaclass(object):
+    """ Test attribute access for metaclasses. """
+    __metaclass__ = ABCMeta
+
+class Metaclass(type):
+    """ metaclass """
+    @classmethod
+    def test(mcs):
+        """ classmethod """
+
+class UsingMetaclass(object):
+    """ empty """
+    __metaclass__ = Metaclass
+
+#TestMetaclass.register(int)
+#UsingMetaclass.test()
+TestMetaclass().register(int) # [no-member]
+UsingMetaclass().test() # [no-member]
+
+
+class NoKnownBases(Missing):
+    """Don't emit no-member if we don't know the bases of a class."""
+
+NoKnownBases().lalala()
+
+# Should be enabled on astroid > 1.4.0
+#class MetaClass(object):
+#    """Look some methods in the implicit metaclass."""
+#
+#    @classmethod
+#    def whatever(cls):
+#        return cls.mro() + cls.missing()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.py	(revision 1126)
@@ -0,0 +1,5 @@
+# coding: utf-8
+"""Test data file with encoding errors."""
+
+
+STR = 'Су�ествительное'  # [invalid-encoded-data]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.py	(revision 1126)
@@ -0,0 +1,6 @@
+"""A module that is accepted by Python but rejected by tokenize.
+
+The problem is the trailing line continuation at the end of the line,
+which produces a TokenError."""
+# +2: [syntax-error]
+""\
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""Test for the confidence filter."""
+from __future__ import print_function
+
+class Client(object):
+    """use provider class"""
+
+    def __init__(self):
+        self.set_later = 0
+
+    def set_set_later(self, value):
+        """set set_later attribute (introduce an inference ambiguity)"""
+        self.set_later = value
+
+print(Client().set_later.lower())
+print(Client().foo)  # [no-member]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.txt	(revision 1126)
@@ -0,0 +1,4 @@
+deprecated-method:6::Using deprecated method popen2()
+deprecated-method:7::Using deprecated method popen3()
+deprecated-method:8::Using deprecated method popen4()
+deprecated-method:9::Using deprecated method getchildren()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/super_checks.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/super_checks.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/super_checks.txt	(revision 1126)
@@ -0,0 +1,19 @@
+old-style-class:6:Aaaa:Old-style class defined.
+super-on-old-class:8:Aaaa.hop:Use of super on an old style class
+no-member:10:Aaaa.hop:Super of 'Aaaa' has no 'hop' member:INFERENCE
+super-on-old-class:12:Aaaa.__init__:Use of super on an old style class
+no-member:19:NewAaaa.hop:Super of 'NewAaaa' has no 'hop' member:INFERENCE
+bad-super-call:22:NewAaaa.__init__:Bad first argument 'Aaaa' given to super()
+missing-super-argument:27:Py3kAaaa.__init__:Missing argument to super()
+bad-super-call:32:Py3kWrongSuper.__init__:Bad first argument 'NewAaaa' given to super()
+bad-super-call:37:WrongNameRegression.__init__:Bad first argument 'Missing' given to super()
+bad-super-call:46:CrashSuper.__init__:Bad first argument 'NewAaaa' given to super()
+bad-super-call:62:SuperDifferentScope.test:Bad first argument 'object' given to super()
+bad-super-call:70:UnknownBases.__init__:Bad first argument 'Missing' given to super()
+not-callable:89:InvalidSuperChecks.__init__:super(InvalidSuperChecks, self).not_a_method is not callable
+no-member:90:InvalidSuperChecks.__init__:Super of 'InvalidSuperChecks' has no 'attribute_error' member:INFERENCE
+no-value-for-parameter:92:InvalidSuperChecks.__init__:No value for argument 'param' in method call
+too-many-function-args:93:InvalidSuperChecks.__init__:Too many positional arguments for method call
+no-value-for-parameter:95:InvalidSuperChecks.__init__:No value for argument 'param' in method call
+unexpected-keyword-arg:95:InvalidSuperChecks.__init__:Unexpected keyword argument 'lala' in method call
+no-member:98:InvalidSuperChecks.__init__:Super of 'InvalidSuperChecks' has no 'attribute_error' member:INFERENCE
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py30.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.txt	(revision 1126)
@@ -0,0 +1,3 @@
+anomalous-unicode-escape-in-string:5::"Anomalous Unicode escape in byte string: '\u'. String constant might be missing an r or u prefix."
+anomalous-unicode-escape-in-string:6::"Anomalous Unicode escape in byte string: '\U'. String constant might be missing an r or u prefix."
+anomalous-unicode-escape-in-string:8::"Anomalous Unicode escape in byte string: '\N'. String constant might be missing an r or u prefix."
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.py	(revision 1126)
@@ -0,0 +1,23 @@
+"""Warnings for using open() with an invalid mode string."""
+
+NAME = "foo.bar"
+open(NAME, "wb")
+open(NAME, "w")
+open(NAME, "rb")
+open(NAME, "x")
+open(NAME, "br")
+open(NAME, "+r")
+open(NAME, "xb")
+open(NAME, "rwx")  # [bad-open-mode]
+open(NAME, "rr")  # [bad-open-mode]
+open(NAME, "+")  # [bad-open-mode]
+open(NAME, "xw")  # [bad-open-mode]
+open(NAME, "ab+")
+open(NAME, "a+b")
+open(NAME, "+ab")
+open(NAME, "+rUb")
+open(NAME, "x+b")
+open(NAME, "Ua")  # [bad-open-mode]
+open(NAME, "Ur++")  # [bad-open-mode]
+open(NAME, "Ut")
+open(NAME, "Ubr")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacked_exceptions.rc	(revision 1126)
@@ -0,0 +1,5 @@
+[testoptions]
+max_pyver=3.0
+
+[Messages Control]
+enable=python3
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unneeded_not.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unneeded_not.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unneeded_not.py	(revision 1126)
@@ -0,0 +1,64 @@
+"""Check exceeding negations in boolean expressions trigger warnings"""
+
+# pylint: disable=singleton-comparison,too-many-branches,too-few-public-methods,undefined-variable
+
+def unneeded_not():
+    """This is not ok
+    """
+    bool_var = True
+    someint = 2
+    if not not bool_var:  # [unneeded-not]
+        pass
+    if not someint == 1:  # [unneeded-not]
+        pass
+    if not someint != 1:  # [unneeded-not]
+        pass
+    if not someint < 1:  # [unneeded-not]
+        pass
+    if not someint > 1:  # [unneeded-not]
+        pass
+    if not someint <= 1:  # [unneeded-not]
+        pass
+    if not someint >= 1:  # [unneeded-not]
+        pass
+    if not not someint:  # [unneeded-not]
+        pass
+    if not bool_var == True:  # [unneeded-not]
+        pass
+    if not bool_var == False:  # [unneeded-not]
+        pass
+    if not bool_var != True:  # [unneeded-not]
+        pass
+    if not True == True:  # [unneeded-not]
+        pass
+    if not 2 in [3, 4]:  # [unneeded-not]
+        pass
+    if not someint is 'test':  # [unneeded-not]
+        pass
+
+
+def tolerated_statements():
+    """This is ok"""
+    bool_var = True
+    someint = 2
+    if not(bool_var == False and someint == 1):
+        pass
+    if 2 not in [3, 4]:
+        pass
+    if not someint == bool_var == 2:
+        pass
+    if not 2 <= someint < 3 < 4:
+        pass
+    if not set('bar') <= set('foobaz'):
+        pass
+    if not set(something) <= 3:
+        pass
+    if not frozenset(something) <= 3:
+        pass
+
+
+class Klass(object):
+    """This is also ok"""
+    def __ne__(self, other):
+        return not self == other
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/trailing_whitespaces.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/trailing_whitespaces.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/trailing_whitespaces.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""Regression test for trailing-whitespace (C0303)."""
+# pylint: disable=mixed-line-endings
+from __future__ import print_function
+
+# +1: [trailing-whitespace]
+print('some trailing whitespace')   
+# +1: [trailing-whitespace]
+print('trailing whitespace does not count towards the line length limit')                   
+print('windows line ends are ok')
+# +1: [trailing-whitespace]
+print('but trailing whitespace on win is not')   
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_indentation.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_indentation.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_indentation.txt	(revision 1126)
@@ -0,0 +1,2 @@
+bad-indentation:6::Bad indentation. Found 1 spaces, expected 4
+bad-indentation:12::Bad indentation. Found 5 spaces, expected 4
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_endings.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[Format]
+expected-line-ending-format=LF
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/exec_used_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py2.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+max_pyver=3.0
+except_implementations=Jython
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/continue_in_finally.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/continue_in_finally.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/continue_in_finally.txt	(revision 1126)
@@ -0,0 +1 @@
+continue-in-finally:9::'continue' not supported inside 'finally' clause
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/docstrings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/docstrings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/docstrings.py	(revision 1126)
@@ -0,0 +1,83 @@
+# pylint: disable=R0201
+# -1: [missing-docstring]
+from __future__ import print_function
+
+# +1: [empty-docstring]
+def function0():
+    """"""
+
+# +1: [missing-docstring]
+def function1(value):
+    # missing docstring
+    print(value)
+
+def function2(value):
+    """docstring"""
+    print(value)
+
+def function3(value):
+    """docstring"""
+    print(value)
+
+# +1: [missing-docstring]
+class AAAA(object):
+    # missing docstring
+
+##     class BBBB:
+##         # missing docstring
+##         pass
+
+##     class CCCC:
+##         """yeah !"""
+##         def method1(self):
+##             pass
+
+##         def method2(self):
+##             """ yeah !"""
+##             pass
+
+    # +1: [missing-docstring]
+    def method1(self):
+        pass
+
+    def method2(self):
+        """ yeah !"""
+        pass
+
+    # +1: [empty-docstring]
+    def method3(self):
+        """"""
+        pass
+
+    def __init__(self):
+        pass
+
+class DDDD(AAAA):
+    """yeah !"""
+
+    def __init__(self):
+        AAAA.__init__(self)
+
+    # +1: [empty-docstring]
+    def method2(self):
+        """"""
+        pass
+
+    def method3(self):
+        pass
+
+    # +1: [missing-docstring]
+    def method4(self):
+        pass
+
+# pylint: disable=missing-docstring
+def function4():
+    pass
+
+# pylint: disable=empty-docstring
+def function5():
+    """"""
+    pass
+
+def function6():
+    """ I am a {} docstring.""".format("good")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context_py2.txt	(revision 1126)
@@ -0,0 +1 @@
+not-a-mapping:19::Non-mapping value SomeClass() is used in a mapping context
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.py	(revision 1126)
@@ -0,0 +1,119 @@
+"""Test for the invalid-name warning."""
+# pylint: disable=no-absolute-import
+from __future__ import print_function
+import abc
+import collections
+
+GOOD_CONST_NAME = ''
+bad_const_name = 0  # [invalid-name]
+
+
+def BADFUNCTION_name():  # [invalid-name]
+    """Bad function name."""
+    BAD_LOCAL_VAR = 1  # [invalid-name]
+    print(BAD_LOCAL_VAR)
+
+
+def func_bad_argname(NOT_GOOD):  # [invalid-name]
+    """Function with a badly named argument."""
+    return NOT_GOOD
+
+
+def no_nested_args(arg1, arg21, arg22):
+    """Well-formed function."""
+    print(arg1, arg21, arg22)
+
+
+class bad_class_name(object):  # [invalid-name]
+    """Class with a bad name."""
+
+
+class CorrectClassName(object):
+    """Class with a good name."""
+
+    def __init__(self):
+        self._good_private_name = 10
+        self.__good_real_private_name = 11
+        self.good_attribute_name = 12
+        self._Bad_AtTR_name = None  # [invalid-name]
+        self.Bad_PUBLIC_name = None  # [invalid-name]
+
+    zz = 'Bad Class Attribute'  # [invalid-name]
+    GOOD_CLASS_ATTR = 'Good Class Attribute'
+
+    def BadMethodName(self):  # [invalid-name]
+        """A Method with a bad name."""
+
+    def good_method_name(self):
+        """A method with a good name."""
+
+    def __DunDER_IS_not_free_for_all__(self):  # [invalid-name]
+        """Another badly named method."""
+
+
+class DerivedFromCorrect(CorrectClassName):
+    """A derived class with an invalid inherited members.
+
+    Derived attributes and methods with invalid names do not trigger warnings.
+    """
+    zz = 'Now a good class attribute'
+
+    def __init__(self):
+        super(DerivedFromCorrect, self).__init__()
+        self._Bad_AtTR_name = None  # Ignored
+
+    def BadMethodName(self):
+        """Ignored since the method is in the interface."""
+
+
+V = [WHAT_Ever_inListComp for WHAT_Ever_inListComp in GOOD_CONST_NAME]
+
+def class_builder():
+    """Function returning a class object."""
+
+    class EmbeddedClass(object):
+        """Useless class."""
+
+    return EmbeddedClass
+
+# +1:[invalid-name]
+BAD_NAME_FOR_CLASS = collections.namedtuple('Named', ['tuple'])
+NEXT_BAD_NAME_FOR_CLASS = class_builder()  # [invalid-name]
+
+GoodName = collections.namedtuple('Named', ['tuple'])
+ToplevelClass = class_builder()
+
+# Aliases for classes have the same name constraints.
+AlsoCorrect = CorrectClassName
+NOT_CORRECT = CorrectClassName  # [invalid-name]
+
+
+def test_globals():
+    """Names in global statements are also checked."""
+    global NOT_CORRECT
+    global AlsoCorrect  # [invalid-name]
+    NOT_CORRECT = 1
+    AlsoCorrect = 2
+
+
+class FooClass(object):
+    """A test case for property names.
+
+    Since by default, the regex for attributes is the same as the one
+    for method names, we check the warning messages to contain the
+    string 'attribute'.
+    """
+    @property
+    def PROPERTY_NAME(self):  # [invalid-name]
+        """Ignored."""
+        pass
+
+    @abc.abstractproperty
+    def ABSTRACT_PROPERTY_NAME(self):  # [invalid-name]
+        """Ignored."""
+        pass
+
+    @PROPERTY_NAME.setter
+    def PROPERTY_NAME_SETTER(self):  # [invalid-name]
+        """Ignored."""
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_uninstalled.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[Messages Control]
+deprecated-modules=uninstalled
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_exception_context.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/slots_checks.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/slots_checks.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/slots_checks.py	(revision 1126)
@@ -0,0 +1,61 @@
+""" Checks that classes uses valid __slots__ """
+
+# pylint: disable=too-few-public-methods, missing-docstring, no-absolute-import
+# pylint: disable=using-constant-test
+from collections import deque
+
+def func():
+    if True:
+        return ("a", "b", "c")
+    else:
+        return [str(var) for var in range(3)]
+
+
+class NotIterable(object):
+    def __iter_(self):
+        """ do nothing """
+
+class Good(object):
+    __slots__ = ()
+
+class SecondGood(object):
+    __slots__ = []
+
+class ThirdGood(object):
+    __slots__ = ['a']
+
+class FourthGood(object):
+    __slots__ = ('a%s' % i for i in range(10))
+
+class FifthGood(object):
+    __slots__ = "a"
+
+class SixthGood(object):
+    __slots__ = deque(["a", "b", "c"])
+
+class SeventhGood(object):
+    __slots__ = {"a": "b", "c": "d"}
+
+class Bad(object):
+    __slots__ = list
+
+class SecondBad(object):  # [invalid-slots]
+    __slots__ = 1
+
+class ThirdBad(object):
+    __slots__ = ('a', 2)  # [invalid-slots-object]
+
+class FourthBad(object):  # [invalid-slots]
+    __slots__ = NotIterable()
+
+class FifthBad(object):
+    __slots__ = ("a", "b", "")  # [invalid-slots-object]
+
+class PotentiallyGood(object):
+    __slots__ = func()
+
+class PotentiallySecondGood(object):
+    __slots__ = ('a', deque.__name__)
+
+class PotentiallyThirdGood(object):
+    __slots__ = deque.__name__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.txt	(revision 1126)
@@ -0,0 +1,6 @@
+used-before-assignment:18:test_fail.wrap:Using variable 'cnt' before assignment
+used-before-assignment:27:test_fail2.wrap:Using variable 'cnt' before assignment
+used-before-assignment:30:test_fail3:Using variable 'test_fail4' before assignment
+used-before-assignment:34:test_fail4:Using variable 'test_fail5' before assignment
+used-before-assignment:34:test_fail4:Using variable 'undefined' before assignment
+used-before-assignment:40:test_fail5:Using variable 'undefined1' before assignment
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/member_checks.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/member_checks.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/member_checks.py	(revision 1126)
@@ -0,0 +1,181 @@
+# pylint: disable=print-statement,missing-docstring,no-self-use,too-few-public-methods,bare-except,broad-except
+# pylint: disable=using-constant-test,expression-not-assigned, redefined-variable-type
+from __future__ import print_function
+
+class Provider(object):
+    """provide some attributes and method"""
+    cattr = 4
+    def __init__(self):
+        self.attr = 4
+    def method(self, val):
+        """impressive method"""
+        return self.attr * val
+    def hophop(self):
+        """hop method"""
+        print('hop hop hop', self)
+
+
+class Client(object):
+    """use provider class"""
+
+    def __init__(self):
+        self._prov = Provider()
+        self._prov_attr = Provider.cattr
+        self._prov_attr2 = Provider.cattribute  # [no-member]
+        self.set_later = 0
+
+    def set_set_later(self, value):
+        """set set_later attribute (introduce an inference ambiguity)"""
+        self.set_later = value
+
+    def use_method(self):
+        """use provider's method"""
+        self._prov.hophop()
+        self._prov.hophophop()  # [no-member]
+
+    def use_attr(self):
+        """use provider's attr"""
+        print(self._prov.attr)
+        print(self._prov.attribute)  # [no-member]
+
+    def debug(self):
+        """print debug information"""
+        print(self.__class__.__name__)
+        print(self.__doc__)
+        print(self.__dict__)
+        print(self.__module__)
+
+    def test_bt_types(self):
+        """test access to unexistant member of builtin types"""
+        lis = []
+        lis.apppend(self)  # [no-member]
+        dic = {}
+        dic.set(self)  # [no-member]
+        tup = ()
+        tup.append(self)  # [no-member]
+        string = 'toto'
+        print(string.loower())  # [no-member]
+        integer = 1
+        print(integer.whatever)  # [no-member]
+
+    def test_no_false_positives(self):
+        none = None
+        print(none.whatever)
+        # No misssing in the parents.
+        super(Client, self).misssing() # [no-member]
+
+
+class Mixin(object):
+    """No no-member should be emitted for mixins."""
+
+class Getattr(object):
+    """no-member shouldn't be emitted for classes with dunder getattr."""
+
+    def __getattr__(self, attr):
+        return self.__dict__[attr]
+
+
+class Getattribute(object):
+    """no-member shouldn't be emitted for classes with dunder getattribute."""
+
+    def __getattribute__(self, attr):
+        return 42
+
+print(object.__init__)
+print(property.__init__)
+print(Client().set_later.lower())  # [no-member]
+print(Mixin().nanana())
+print(Getattr().nananan())
+print(Getattribute().batman())
+
+try:
+    Client().missing_method()
+except AttributeError:
+    pass
+
+try:
+    Client().indeed()
+except Exception:
+    pass
+
+try:
+    Client().indeed()
+except:
+    pass
+
+try:
+    Client().indeed() # [no-member]
+except ImportError:
+    pass
+
+try:
+    Client.missing()
+except AttributeError:
+    Client.missing() # [no-member]
+
+try:
+    Client.missing()
+except AttributeError:
+    try:
+        Client.missing() # [no-member]
+    except ValueError:
+        pass
+
+try:
+    if Client:
+        Client().missing()
+except AttributeError:
+    pass
+
+try:
+    Client().indeed()
+except AttributeError:
+    try:
+        Client.missing()
+    except Exception:
+        pass
+
+
+class SuperChecks(str, str): # pylint: disable=duplicate-bases
+    """Don't fail when the MRO is invalid."""
+    def test(self):
+        super(SuperChecks, self).lalala()
+
+type(Client()).ala
+type({}).bala
+type('').portocala
+
+
+def socket_false_positive():
+    """Test a regression
+    Version used:
+
+    - Pylint 0.10.0
+    - Logilab common 0.15.0
+    - Logilab astroid 0.15.1
+
+    False E1101 positive, line 23:
+    Instance of '_socketobject' has no 'connect' member
+    """
+
+    import socket
+    sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    sckt.connect(('127.0.0.1', 80))
+    sckt.close()
+
+
+def no_conjugate_member(magic_flag):
+    """should not raise E1101 on something.conjugate"""
+    if magic_flag:
+        something = 1.0
+    else:
+        something = 1.0j
+    if isinstance(something, float):
+        return something
+    return something.conjugate()
+
+
+class NoDunderNameInInstance(object):
+    """Emit a warning when accessing __name__ from an instance."""
+    def __init__(self):
+        self.var = self.__name__ # [no-member]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_bases.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_bases.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_bases.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""Test duplicate bases error."""
+# pylint: disable=missing-docstring,too-few-public-methods,no-init
+
+
+class Duplicates(str, str): # [duplicate-bases]
+    pass
+
+
+class Alpha(str):
+    pass
+
+
+class NotDuplicates(Alpha, str):
+    """The error should not be emitted for this case, since the
+    other same base comes from the ancestors."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_import.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_import.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_import.py	(revision 1126)
@@ -0,0 +1,14 @@
+"""Import PyGTK."""
+#pylint: disable=too-few-public-methods,too-many-public-methods
+
+from gtk import VBox
+import gtk
+
+class FooButton(gtk.Button):
+    """extend gtk.Button"""
+    def extend(self):
+        """hop"""
+        print self
+
+print gtk.Button
+print VBox
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.txt	(revision 1126)
@@ -0,0 +1 @@
+syntax-error:7::EOF in multi-line statement
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mixed_indentation.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mixed_indentation.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mixed_indentation.txt	(revision 1126)
@@ -0,0 +1,2 @@
+mixed-indentation:9::Found indentation with tabs instead of spaces
+mixed-indentation:10::Found indentation with tabs instead of spaces
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py34.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.4
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/raising_non_exception_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call_py3.txt	(revision 1126)
@@ -0,0 +1,3 @@
+bad-str-strip-call:7::Suspicious argument in str.strip call
+bad-str-strip-call:8::Suspicious argument in str.lstrip call
+bad-str-strip-call:9::Suspicious argument in bytes.rstrip call
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_format_interpolation.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_format_interpolation.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_format_interpolation.txt	(revision 1126)
@@ -0,0 +1,4 @@
+logging-format-interpolation:15::Use % formatting in logging functions and pass the % parameters as arguments
+logging-format-interpolation:16::Use % formatting in logging functions and pass the % parameters as arguments
+logging-format-interpolation:17::Use % formatting in logging functions and pass the % parameters as arguments
+logging-format-interpolation:18::Use % formatting in logging functions and pass the % parameters as arguments
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unused_import.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unused_import.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unused_import.py	(revision 1126)
@@ -0,0 +1,18 @@
+"""unused import"""
+# pylint: disable=undefined-all-variable, import-error, no-absolute-import, too-few-public-methods, missing-docstring,wrong-import-position
+import xml.etree  # [unused-import]
+import xml.sax  # [unused-import]
+import os.path as test  # [unused-import]
+from sys import argv as test2  # [unused-import]
+from sys import flags  # [unused-import]
+# +1:[unused-import,unused-import]
+from collections import deque, OrderedDict, Counter
+DATA = Counter()
+
+from fake import SomeName, SomeOtherName  # [unused-import]
+class SomeClass(object):
+    SomeName = SomeName # https://bitbucket.org/logilab/pylint/issue/475
+    SomeOtherName = 1
+    SomeOtherName = SomeOtherName
+
+from never import __all__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.rc	(revision 1126)
@@ -0,0 +1,5 @@
+[testoptions]
+max_pyver=3.0
+
+[Messages Control]
+enable=python3
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/dangerous_default_value.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments.py	(revision 1126)
@@ -0,0 +1,167 @@
+# pylint: disable=too-few-public-methods, no-absolute-import,missing-docstring,import-error,wrong-import-position
+"""Test function argument checker"""
+
+def decorator(fun):
+    """Decorator"""
+    return fun
+
+
+class DemoClass(object):
+    """Test class for method invocations."""
+
+    @staticmethod
+    def static_method(arg):
+        """static method."""
+        return arg + arg
+
+    @classmethod
+    def class_method(cls, arg):
+        """class method"""
+        return arg + arg
+
+    def method(self, arg):
+        """method."""
+        return (self, arg)
+
+    @decorator
+    def decorated_method(self, arg):
+        """decorated method."""
+        return (self, arg)
+
+
+def function_1_arg(first_argument):
+    """one argument function"""
+    return first_argument
+
+def function_3_args(first_argument, second_argument, third_argument):
+    """three arguments function"""
+    return first_argument, second_argument, third_argument
+
+def function_default_arg(one=1, two=2):
+    """fonction with default value"""
+    return two, one
+
+
+function_1_arg(420)
+function_1_arg()  # [no-value-for-parameter]
+function_1_arg(1337, 347)  # [too-many-function-args]
+
+function_3_args(420, 789)  # [no-value-for-parameter]
+# +1:[no-value-for-parameter,no-value-for-parameter,no-value-for-parameter]
+function_3_args()
+function_3_args(1337, 347, 456)
+function_3_args('bab', 'bebe', None, 5.6)  # [too-many-function-args]
+
+function_default_arg(1, two=5)
+function_default_arg(two=5)
+
+function_1_arg(bob=4)  # [unexpected-keyword-arg,no-value-for-parameter]
+function_default_arg(1, 4, coin="hello")  # [unexpected-keyword-arg]
+
+function_default_arg(1, one=5)  # [redundant-keyword-arg]
+
+# Remaining tests are for coverage of correct names in messages.
+LAMBDA = lambda arg: 1
+
+LAMBDA()  # [no-value-for-parameter]
+
+def method_tests():
+    """Method invocations."""
+    demo = DemoClass()
+    demo.static_method()  # [no-value-for-parameter]
+    DemoClass.static_method()  # [no-value-for-parameter]
+
+    demo.class_method()  # [no-value-for-parameter]
+    DemoClass.class_method()  # [no-value-for-parameter]
+
+    demo.method()  # [no-value-for-parameter]
+    DemoClass.method(demo)  # [no-value-for-parameter]
+
+    demo.decorated_method()  # [no-value-for-parameter]
+    DemoClass.decorated_method(demo)  # [no-value-for-parameter]
+
+# Test a regression (issue #234)
+import sys
+
+class Text(object):
+    """ Regression """
+
+    if sys.version_info > (3,):
+        def __new__(cls):
+            """ empty """
+            return object.__new__(cls)
+    else:
+        def __new__(cls):
+            """ empty """
+            return object.__new__(cls)
+
+Text()
+
+class TestStaticMethod(object):
+
+    @staticmethod
+    def test(first, second=None, **kwargs):
+        return first, second, kwargs
+
+    def func(self):
+        self.test(42)
+        self.test(42, second=34)
+        self.test(42, 42)
+        self.test() # [no-value-for-parameter]
+        self.test(42, 42, 42) # [too-many-function-args]
+
+# Should be enabled on a more capable astroid (> 1.4.0)
+# class TypeCheckConstructor(object):
+#    def __init__(self, first, second):
+#        self.first = first
+#        self.second = second
+#    def test(self):
+#        type(self)(1, 2, 3)
+#        #
+#        type(self)()
+#        type(self)(1, lala=2)
+#        type(self)(1, 2)
+#        type(self)(first=1, second=2)
+
+
+class Test(object):
+    """ lambda needs Test instance as first argument """
+    lam = lambda self, icon: (self, icon)
+
+    def test(self):
+        self.lam(42)
+        self.lam() # [no-value-for-parameter]
+        self.lam(1, 2, 3) # [too-many-function-args]
+
+Test().lam() # [no-value-for-parameter]
+
+# Don't emit a redundant-keyword-arg for this example,
+# it's perfectly valid
+
+class Issue642(object):
+    attr = 0
+    def __str__(self):
+        return "{self.attr}".format(self=self)
+
+# These should not emit anything regarding the number of arguments,
+# since they have something invalid.
+from ala_bala_portocola import unknown
+
+# pylint: disable=not-a-mapping,not-an-iterable
+
+function_1_arg(*unknown)
+function_1_arg(1, *2)
+function_1_arg(1, 2, 3, **unknown)
+function_1_arg(4, 5, **1)
+function_1_arg(5, 6, **{unknown: 1})
+function_1_arg(**{object: 1})
+function_1_arg(**{1: 2})
+
+# Don't emit no-value-for-parameter for this, since we
+# don't have the context at our disposal.
+def expect_three(one, two, three):
+    return one + two + three
+
+
+def no_context(*args):
+    expect_three(*args)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_sequence_index.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_sequence_index.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_sequence_index.py	(revision 1126)
@@ -0,0 +1,216 @@
+"""Errors for invalid sequence indices"""
+# pylint: disable=too-few-public-methods, no-self-use
+
+__revision__ = 0
+
+TESTLIST = [1, 2, 3]
+TESTTUPLE = (1, 2, 3)
+TESTSTR = '123'
+
+# getitem tests with bad indices
+def function1():
+    """list index is a function"""
+    return TESTLIST[id] # [invalid-sequence-index]
+
+def function2():
+    """list index is None"""
+    return TESTLIST[None] # [invalid-sequence-index]
+
+def function3():
+    """list index is a float expression"""
+    return TESTLIST[float(0)] # [invalid-sequence-index]
+
+def function4():
+    """list index is a str constant"""
+    return TESTLIST['0'] # [invalid-sequence-index]
+
+def function5():
+    """list index does not implement __index__"""
+    class NonIndexType(object):
+        """Class without __index__ method"""
+        pass
+
+    return TESTLIST[NonIndexType()] # [invalid-sequence-index]
+
+def function6():
+    """Tuple index is None"""
+    return TESTTUPLE[None] # [invalid-sequence-index]
+
+def function7():
+    """String index is None"""
+    return TESTSTR[None] # [invalid-sequence-index]
+
+def function8():
+    """Index of subclass of tuple is None"""
+    class TupleTest(tuple):
+        """Subclass of tuple"""
+        pass
+    return TupleTest()[None] # [invalid-sequence-index]
+
+# getitem tests with good indices
+def function9():
+    """list index is an int constant"""
+    return TESTLIST[0]  # no error
+
+def function10():
+    """list index is a integer expression"""
+    return TESTLIST[int(0.0)] # no error
+
+def function11():
+    """list index is a slice"""
+    return TESTLIST[slice(1, 2, 3)] # no error
+
+def function12():
+    """list index implements __index__"""
+    class IndexType(object):
+        """Class with __index__ method"""
+        def __index__(self):
+            """Allow objects of this class to be used as slice indices"""
+            return 0
+
+    return TESTLIST[IndexType()] # no error
+
+def function13():
+    """list index implements __index__ in a superclass"""
+    class IndexType(object):
+        """Class with __index__ method"""
+        def __index__(self):
+            """Allow objects of this class to be used as slice indices"""
+            return 0
+
+    class IndexSubType(IndexType):
+        """Class with __index__ in parent"""
+        pass
+
+    return TESTLIST[IndexSubType()] # no error
+
+def function14():
+    """Tuple index is an int constant"""
+    return TESTTUPLE[0]
+
+def function15():
+    """String index is an int constant"""
+    return TESTSTR[0]
+
+def function16():
+    """Index of subclass of tuple is an int constant"""
+    class TupleTest(tuple):
+        """Subclass of tuple"""
+        pass
+    return TupleTest()[0] # no error
+
+def function17():
+    """Index of subclass of tuple with custom __getitem__ is None"""
+    class TupleTest(tuple):
+        """Subclass of tuple with custom __getitem__"""
+        def __getitem__(self, index):
+            """Allow non-integer indices"""
+            return 0
+    return TupleTest()[None] # no error
+
+def function18():
+    """Index of subclass of tuple with __getitem__ in superclass is None"""
+    class TupleTest(tuple):
+        """Subclass of tuple with custom __getitem__"""
+        def __getitem__(self, index):
+            """Allow non-integer indices"""
+            return 0
+
+    class SubTupleTest(TupleTest):
+        """Subclass of a subclass of tuple"""
+        pass
+
+    return SubTupleTest()[None] # no error
+
+# Test with set and delete statements
+def function19():
+    """Set with None and integer indices"""
+    TESTLIST[None] = 0 # [invalid-sequence-index]
+    TESTLIST[0] = 0 # no error
+
+def function20():
+    """Delete with None and integer indicies"""
+    del TESTLIST[None] # [invalid-sequence-index]
+    del TESTLIST[0] # no error
+
+def function21():
+    """Set and delete on a subclass of list"""
+    class ListTest(list):
+        """Inherit all list get/set/del handlers"""
+        pass
+    test = ListTest()
+
+    # Set and delete with invalid indices
+    test[None] = 0 # [invalid-sequence-index]
+    del test[None] # [invalid-sequence-index]
+
+    # Set and delete with valid indices
+    test[0] = 0 # no error
+    del test[0] # no error
+
+def function22():
+    """Get, set, and delete on a subclass of list that overrides __setitem__"""
+    class ListTest(list):
+        """Override setitem but not get or del"""
+        def __setitem__(self, key, value):
+            pass
+    test = ListTest()
+
+    # failure on the getitem with None
+    test[None][0] = 0 # [invalid-sequence-index]
+    # failure on the getitem with None
+    del test[None] # [invalid-sequence-index]
+
+    test[0][0] = 0 # getitem with int and setitem with int, no error
+    test[None] = 0 # setitem overridden, no error
+    test[0] = 0 # setitem with int, no error
+    del test[0] # delitem with int, no error
+
+def function23():
+    """Get, set, and delete on a subclass of list that overrides __delitem__"""
+    class ListTest(list):
+        """Override delitem but not get or set"""
+        def __delitem__(self, key):
+            pass
+    test = ListTest()
+
+    # failure on the getitem with None
+    test[None][0] = 0 # [invalid-sequence-index]
+    # setitem with invalid index
+    test[None] = 0  # [invalid-sequence-index]
+
+    test[0][0] = 0 # getitem with int and setitem with int, no error
+    test[0] = 0 # setitem with int, no error
+    del test[None] # delitem overriden, no error
+    del test[0] # delitem with int, no error
+
+def function24():
+    """Get, set, and delete on a subclass of list that overrides __getitem__"""
+    class ListTest(list):
+        """Override gelitem but not del or set"""
+        def __getitem__(self, key):
+            pass
+    test = ListTest()
+
+    # setitem with invalid index
+    test[None] = 0 # [invalid-sequence-index]
+    # delitem with invalid index
+    del test[None] # [invalid-sequence-index]
+
+    test[None][0] = 0 # getitem overriden, no error
+    test[0][0] = 0 # getitem with int and setitem with int, no error
+    test[0] = 0 # setitem with int, no error
+    del test[0] # delitem with int, no error
+
+# Teest ExtSlice usage
+def function25():
+    """Extended slice used with a list"""
+    return TESTLIST[..., 0] # [invalid-sequence-index]
+
+def function26():
+    """Extended slice used with an object that implements __getitem__"""
+    class ExtSliceTest(object):
+        """Permit extslice syntax by implementing __getitem__"""
+        def __getitem__(self, index):
+            return 0
+    return ExtSliceTest()[..., 0] # no error
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/genexpr_variable_scope.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/genexpr_variable_scope.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/genexpr_variable_scope.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""test name defined in generator expression are not available
+outside the genexpr scope
+"""
+from __future__ import print_function
+print(n)  # [undefined-variable]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/nonlocal_without_binding.txt	(revision 1126)
@@ -0,0 +1,3 @@
+nonlocal-without-binding:22:func.other_func:nonlocal name b found without binding
+nonlocal-without-binding:25:SomeClass:nonlocal name x found without binding
+nonlocal-without-binding:28:SomeClass.func:nonlocal name some_attr found without binding
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_member_before_definition.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_member_before_definition.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_member_before_definition.txt	(revision 1126)
@@ -0,0 +1,2 @@
+access-member-before-definition:8:Aaaa.__init__:Access to member '_var2' before its definition line 9
+access-member-before-definition:28:Bbbb.catchme:Access to member '_repo' before its definition line 30
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_in_class.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_in_class.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_in_class.py	(revision 1126)
@@ -0,0 +1,20 @@
+"""Don't warn if the class is instantiated in its own body."""
+# pylint: disable=missing-docstring
+
+
+import abc
+
+import six
+
+
+@six.add_metaclass(abc.ABCMeta)
+class Ala(object):
+
+    @abc.abstractmethod
+    def bala(self):
+        pass
+
+    @classmethod
+    def portocala(cls):
+        instance = cls()
+        return instance
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/class_members_py27.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=2.7
+max_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_encoded_data.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+max_pyver=3.0
+except_implementations=Jython
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol.py	(revision 1126)
@@ -0,0 +1,123 @@
+# pylint: disable=missing-docstring,pointless-statement,expression-not-assigned,too-few-public-methods,import-error,no-init,wrong-import-position
+
+# standard types
+1 in [1, 2, 3]
+1 in {'a': 1, 'b': 2}
+1 in {1, 2, 3}
+1 in (1, 2, 3)
+'1' in "123"
+'1' in u"123"
+'1' in bytearray(b"123")
+1 in frozenset([1, 2, 3])
+
+# comprehensions
+1 in [x ** 2 % 10 for x in range(10)]
+1 in {x ** 2 % 10 for x in range(10)}
+1 in {x: x ** 2 % 10 for x in range(10)}
+
+# iterators
+1 in iter([1, 2, 3])
+
+# generator
+def count(upto=float("inf")):
+    i = 0
+    while True:
+        if i > upto:
+            break
+        yield i
+        i += 1
+
+10 in count(upto=10)
+
+# custom instance
+class UniversalContainer(object):
+    def __contains__(self, key):
+        return True
+
+42 in UniversalContainer()
+
+# custom iterable
+class CustomIterable(object):
+    def __iter__(self):
+        return iter((1, 2, 3))
+3 in CustomIterable()
+
+# old-style iterable
+class OldStyleIterable(object):
+    def __getitem__(self, key):
+        if key < 10:
+            return 2 ** key
+        else:
+            raise IndexError("bad index")
+64 in OldStyleIterable()
+
+# do not emit warning if class has unknown bases
+from some_missing_module import ImportedClass
+
+class MaybeIterable(ImportedClass):
+    pass
+
+10 in MaybeIterable()
+
+# do not emit warning inside mixins/abstract/base classes
+class UsefulMixin(object):
+    stuff = None
+
+    def get_stuff(self):
+        return self.stuff
+
+    def act(self, thing):
+        stuff = self.get_stuff()
+        if thing in stuff:
+            pass
+
+class BaseThing(object):
+    valid_values = None
+
+    def validate(self, value):
+        if self.valid_values is None:
+            return True
+        else:
+            # error should not be emitted here
+            return value in self.valid_values
+
+class AbstractThing(object):
+    valid_values = None
+
+    def validate(self, value):
+        if self.valid_values is None:
+            return True
+        else:
+            # error should not be emitted here
+            return value in self.valid_values
+
+# class is not named as abstract
+# but still is deduceably abstract
+class Thing(object):
+    valid_values = None
+
+    def __init__(self):
+        self._init_values()
+
+    def validate(self, value):
+        if self.valid_values is None:
+            return True
+        else:
+            # error should not be emitted here
+            return value in self.valid_values
+
+    def _init_values(self):
+        raise NotImplementedError
+
+# error cases
+42 in 42  # [unsupported-membership-test]
+42 not in None  # [unsupported-membership-test]
+42 in 8.5  # [unsupported-membership-test]
+
+class EmptyClass(object):
+    pass
+
+42 not in EmptyClass()  # [unsupported-membership-test]
+42 in EmptyClass  # [unsupported-membership-test]
+42 not in count  # [unsupported-membership-test]
+42 in range  # [unsupported-membership-test]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/tokenize_error.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+except_implementations=Jython
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.py	(revision 1126)
@@ -0,0 +1,51 @@
+"""Detect problems with invalid operands used on invalid objects."""
+# pylint: disable=missing-docstring,too-few-public-methods,invalid-name
+# pylint: disable=unused-variable
+
+import collections
+
+
+class Implemented(object):
+    def __invert__(self):
+        return 42
+    def __pos__(self):
+        return 42
+    def __neg__(self):
+        return 42
+
+
+def these_are_good():
+    negative = -1
+    negative1 = -1.0
+    positive = +1
+    positive2 = +1.0
+    inverted = ~1
+    not_int = not 1
+    not_float = not 2.0
+    not_string = not ""
+    not_list = not []
+    not_dict = not {}
+    not_tuple = not (1, 2)
+    inverted_instance = ~Implemented()
+    positive_instance = +Implemented()
+    negative_instance = -Implemented()
+    not_instance = not Implemented()
+
+
+def these_are_bad():
+    invert_list = ~[] # [invalid-unary-operand-type]
+    invert_tuple = ~() # [invalid-unary-operand-type]
+    invert_dict = ~dict() # [invalid-unary-operand-type]
+    invert_dict_1 = ~{} # [invalid-unary-operand-type]
+    invert_set = ~set() # [invalid-unary-operand-type]
+    neg_set = -set() # [invalid-unary-operand-type]
+    neg_str = -"" # [invalid-unary-operand-type]
+    invert_str = ~"" # [invalid-unary-operand-type]
+    pos_str = +"" # [invalid-unary-operand-type]
+    class A(object):
+        pass
+    invert_func = ~(lambda: None) # [invalid-unary-operand-type]
+    invert_class = ~A # [invalid-unary-operand-type]
+    invert_instance = ~A() # [invalid-unary-operand-type]
+    invert_module = ~collections # [invalid-unary-operand-type]
+    invert_float = ~2.0 # [invalid-unary-operand-type]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[Messages Control]
+disable=no-init,too-few-public-methods,undefined-variable,print-statement
+confidence=INFERENCE,HIGH,UNDEFINED
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.py	(revision 1126)
@@ -0,0 +1,19 @@
+# pylint:disable=W0105, W0511
+"""Test for backslash escapes in byte vs unicode strings"""
+
+# Would be valid in Unicode, but probably not what you want otherwise
+BAD_UNICODE = b'\u0042'  # [anomalous-unicode-escape-in-string]
+BAD_LONG_UNICODE = b'\U00000042'  # [anomalous-unicode-escape-in-string]
+# +1:[anomalous-unicode-escape-in-string]
+BAD_NAMED_UNICODE = b'\N{GREEK SMALL LETTER ALPHA}'
+
+GOOD_UNICODE = u'\u0042'
+GOOD_LONG_UNICODE = u'\U00000042'
+GOOD_NAMED_UNICODE = u'\N{GREEK SMALL LETTER ALPHA}'
+
+
+# Valid raw strings
+RAW_BACKSLASHES = r'raw'
+
+# In a comment you can have whatever you want: \ \\ \n \m
+# even things that look like bad strings: "C:\Program Files"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/function_redefined.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/function_redefined.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/function_redefined.txt	(revision 1126)
@@ -0,0 +1,5 @@
+function-redefined:15:AAAA.method2:method already defined line 12
+function-redefined:18:AAAA:class already defined line 5
+function-redefined:32:func2:function already defined line 29
+redefined-outer-name:34:func2:Redefining name '__revision__' from outer scope (line 3)
+function-redefined:51:exclusive_func2:function already defined line 45
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/long_lines_with_utf8.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/long_lines_with_utf8.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/long_lines_with_utf8.txt	(revision 1126)
@@ -0,0 +1 @@
+line-too-long:7::Line too long (108/100)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/boolean_datetime.txt	(revision 1126)
@@ -0,0 +1,8 @@
+boolean-datetime:5::Using datetime.time in a boolean context.
+boolean-datetime:10::Using datetime.time in a boolean context.
+boolean-datetime:15::Using datetime.time in a boolean context.
+boolean-datetime:16::Using datetime.time in a boolean context.
+boolean-datetime:17::Using datetime.time in a boolean context.
+boolean-datetime:18::Using datetime.time in a boolean context.
+boolean-datetime:19::Using datetime.time in a boolean context.
+boolean-datetime:20::Using datetime.time in a boolean context.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_open_mode_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wildcard_import.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wildcard_import.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/wildcard_import.py	(revision 1126)
@@ -0,0 +1,5 @@
+# pylint: disable=no-absolute-import,missing-docstring,import-error,unused-wildcard-import
+from indirect1 import * # [wildcard-import]
+# This is an unresolved import which still generates the wildcard-import
+# warning.
+from unknown.package import * # [wildcard-import]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unpacking_generalizations.txt	(revision 1126)
@@ -0,0 +1,6 @@
+too-many-function-args:24::Too many positional arguments for function call
+no-value-for-parameter:25::"No value for argument 'd' in function call"
+too-many-function-args:26::Too many positional arguments for function call
+repeated-keyword:27::Got multiple values for keyword argument 'd' in function call
+repeated-keyword:29::Got multiple values for keyword argument 'c' in function call
+repeated-keyword:29::Got multiple values for keyword argument 'd' in function call
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_context_manager.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_context_manager.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/not_context_manager.txt	(revision 1126)
@@ -0,0 +1,5 @@
+not-context-manager:23::Context manager 'NotAManager' doesn't implement __enter__ and __exit__.
+not-context-manager:37::Context manager 'dec' doesn't implement __enter__ and __exit__.
+not-context-manager:55::Context manager 'int' doesn't implement __enter__ and __exit__.
+not-context-manager:90::Context manager 'int' doesn't implement __enter__ and __exit__.
+not-context-manager:134::Context manager 'generator' doesn't implement __enter__ and __exit__.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_using_generator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_using_generator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/with_using_generator.py	(revision 1126)
@@ -0,0 +1,14 @@
+""" Testing with statements that use generators. This should not crash. """
+
+class Base(object):
+    """ Base class. """
+    val = 0
+
+    def gen(self):
+        """ A generator. """
+        yield self.val
+
+    def fun(self):
+        """ With statement using a generator. """
+        with self.gen():  # [not-context-manager]
+            pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle_properties.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle_properties.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle_properties.py	(revision 1126)
@@ -0,0 +1,53 @@
+# pylint: disable=too-few-public-methods
+"""Test properties on old style classes and property.setter/deleter usage"""
+
+
+def getter(self):
+    """interesting"""
+    return self
+
+class CorrectClass(object):
+    """correct usage"""
+    method = property(getter, doc='hop')
+
+class OldStyleClass:  # <3.0:[old-style-class]
+    """bad usage"""
+    method = property(getter, doc='hop')  # <3.0:[property-on-old-class]
+
+    def __init__(self):
+        pass
+
+
+def decorator(func):
+    """Redefining decorator."""
+    def wrapped(self):
+        """Wrapper function."""
+        return func(self)
+    return wrapped
+
+
+class SomeClass(object):
+    """another docstring"""
+
+    def __init__(self):
+        self._prop = None
+
+    @property
+    def prop(self):
+        """I'm the 'prop' property."""
+        return self._prop
+
+    @prop.setter
+    def prop(self, value):
+        """I'm the 'prop' property."""
+        self._prop = value
+
+    @prop.deleter
+    def prop(self):
+        """I'm the 'prop' property."""
+        del self._prop
+
+    @decorator
+    def noregr(self):
+        """Just a normal method with a decorator."""
+        return self.prop
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.txt	(revision 1126)
@@ -0,0 +1 @@
+deprecated-module:4::Uses of a deprecated module 'optparse'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to__name__.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to__name__.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to__name__.txt	(revision 1126)
@@ -0,0 +1,3 @@
+old-style-class:7:Aaaa:Old-style class defined.
+no-member:10:Aaaa.__init__:Instance of 'Aaaa' has no '__name__' member:INFERENCE
+no-member:21:NewClass.__init__:Instance of 'NewClass' has no '__name__' member:INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.txt	(revision 1126)
@@ -0,0 +1 @@
+yield-outside-function:2::Yield outside function
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.py	(revision 1126)
@@ -0,0 +1,7 @@
+# [syntax-error]
+# -*- coding: IBO-8859-1 -*-
+""" check correct unknown encoding declaration
+"""
+
+__revision__ = 'יייי'
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/confidence_filter.txt	(revision 1126)
@@ -0,0 +1 @@
+no-member:15::Instance of 'Client' has no 'foo' member:INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle__slots__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle__slots__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/newstyle__slots__.py	(revision 1126)
@@ -0,0 +1,17 @@
+# pylint: disable=R0903
+"""test __slots__ on old style class"""
+
+
+class NewStyleClass(object):
+    """correct usage"""
+    __slots__ = ('a', 'b')
+
+
+class OldStyleClass:  # <3.0:[old-style-class,slots-on-old-class]
+    """bad usage"""
+    __slots__ = ('a', 'b')
+
+    def __init__(self):
+        pass
+
+__slots__ = 'hop'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_future.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_future.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_future.py	(revision 1126)
@@ -0,0 +1,6 @@
+"""Test that __future__ is not the first statement after the docstring."""
+import collections
+from __future__ import print_function # [misplaced-future]
+from __future__ import with_statement
+
+DATA = collections
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_is_generator.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_is_generator.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/init_is_generator.txt	(revision 1126)
@@ -0,0 +1 @@
+init-is-generator:4:SomeClass.__init__:__init__ method is a generator
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_variable_type.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_variable_type.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_variable_type.py	(revision 1126)
@@ -0,0 +1,55 @@
+"""Checks variable types aren't redefined within a method or a function"""
+
+# pylint: disable=too-few-public-methods, missing-docstring, unused-variable
+
+_OK = True
+
+class MyClass(object):
+
+    class Klass(object):
+        def __init__(self):
+            self.var2 = 'var'
+
+    def __init__(self):
+        self.var = True
+        self.var1 = 2
+        self.var2 = 1.
+        self.var1 = 2.  # [redefined-variable-type]
+        self.a_str = "hello"
+        a_str = False
+        (a_str, b_str) = (1, 2)  # no support for inference on tuple assignment
+        a_str = 2.0 if self.var else 1.0  # no support for inference on ifexpr
+
+    def _getter(self):
+        return self.a_str
+    def _setter(self, val):
+        self.a_str = val
+    var2 = property(_getter, _setter)
+
+    def some_method(self):
+        def func():
+            var = 1
+            test = 'bar'
+            var = 'baz'  # [redefined-variable-type]
+        self.var = 1  # the rule checks for redefinitions in the scope of a function or method
+        test = 'foo'
+        myint = 2
+        myint = False  # [redefined-variable-type]
+
+_OK = "This is OK"  # [redefined-variable-type]
+
+if _OK:
+    SOME_FLOAT = 1.
+
+def dummy_function():
+    return 2
+
+def other_function():
+    instance = MyClass()
+    instance = True  # [redefined-variable-type]
+
+SOME_FLOAT = dummy_function()  # [redefined-variable-type]
+
+A_GLOB = None
+A_GLOB = [1, 2, 3]
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redundant_unittest_assert.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redundant_unittest_assert.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redundant_unittest_assert.txt	(revision 1126)
@@ -0,0 +1,6 @@
+redundant-unittest-assert:17:Tests.test_something:"Redundant use of assertTrue with constant value 'I meant assertEqual not assertTrue'"
+redundant-unittest-assert:19:Tests.test_something:"Redundant use of assertFalse with constant value 'I meant assertEqual not assertFalse'"
+redundant-unittest-assert:21:Tests.test_something:"Redundant use of assertTrue with constant value True"
+redundant-unittest-assert:23:Tests.test_something:"Redundant use of assertFalse with constant value False"
+redundant-unittest-assert:25:Tests.test_something:"Redundant use of assertFalse with constant value None"
+redundant-unittest-assert:27:Tests.test_something:"Redundant use of assertTrue with constant value 0"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unidiomatic_typecheck.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unidiomatic_typecheck.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unidiomatic_typecheck.txt	(revision 1126)
@@ -0,0 +1,18 @@
+unidiomatic-typecheck:5:simple_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:6:simple_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:7:simple_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:8:simple_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:9:simple_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:10:simple_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:14:simple_inference_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:15:simple_inference_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:16:simple_inference_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:17:simple_inference_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:18:simple_inference_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:19:simple_inference_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:71:type_of_literals_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:72:type_of_literals_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:73:type_of_literals_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:74:type_of_literals_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:75:type_of_literals_positives:Using type() instead of isinstance() for a typecheck.
+unidiomatic-typecheck:76:type_of_literals_positives:Using type() instead of isinstance() for a typecheck.
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.rc	(revision 1126)
@@ -0,0 +1,5 @@
+[testoptions]
+min_pyver=2.6
+
+[Messages Control]
+disable=too-few-public-methods,abstract-class-not-used,global-statement
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.py	(revision 1126)
@@ -0,0 +1,47 @@
+"""Check for nonlocal and used-before-assignment"""
+# pylint: disable=missing-docstring, unused-variable, no-init, too-few-public-methods
+
+__revision__ = 0
+
+def test_ok():
+    """ uses nonlocal """
+    cnt = 1
+    def wrap():
+        nonlocal cnt
+        cnt = cnt + 1
+    wrap()
+
+def test_fail():
+    """ doesn't use nonlocal """
+    cnt = 1
+    def wrap():
+        cnt = cnt + 1 # [used-before-assignment]
+    wrap()
+
+def test_fail2():
+    """ use nonlocal, but for other variable """
+    cnt = 1
+    count = 1
+    def wrap():
+        nonlocal count
+        cnt = cnt + 1 # [used-before-assignment]
+    wrap()
+
+def test_fail3(arg: test_fail4): # [used-before-assignment]
+    """ Depends on `test_fail4`, in argument annotation. """
+    return arg
+# +1: [used-before-assignment, used-before-assignment]
+def test_fail4(*args: test_fail5, **kwargs: undefined):
+    """ Depends on `test_fail5` and `undefined` in
+    variable and named arguments annotations.
+    """
+    return args, kwargs
+
+def test_fail5()->undefined1: # [used-before-assignment]
+    """ Depends on `undefined1` in function return annotation. """
+
+def undefined():
+    """ no op """
+
+def undefined1():
+    """ no op """
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to__name__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to__name__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/access_to__name__.py	(revision 1126)
@@ -0,0 +1,21 @@
+# pylint: disable=too-few-public-methods, print-statement
+"""test access to __name__ gives undefined member on new/old class instances
+but not on new/old class object
+"""
+from __future__ import print_function
+
+class Aaaa:  # <3.0:[old-style-class]
+    """old class"""
+    def __init__(self):
+        print(self.__name__)  # [no-member]
+        print(self.__class__.__name__)
+
+class NewClass(object):
+    """new class"""
+
+    def __new__(cls, *args, **kwargs):
+        print('new', cls.__name__)
+        return object.__new__(cls, *args, **kwargs)
+
+    def __init__(self):
+        print('init', self.__name__)  # [no-member]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""Test deprecated modules."""
+# pylint: disable=unused-import
+
+import optparse # [deprecated-module]
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""This is gramatically correct, but it's still a SyntaxError"""
+yield from [1, 2]  # [yield-outside-function]
+
+LAMBDA_WITH_YIELD = lambda: (yield from [1, 2])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_builtin.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_builtin.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/redefined_builtin.txt	(revision 1126)
@@ -0,0 +1,2 @@
+redefined-builtin:6:function:Redefining built-in 'type'
+redefined-builtin:10::Redefining built-in 'map'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.py	(revision 1126)
@@ -0,0 +1,12 @@
+"""Test that `yield` or `yield from` can't be used inside an async function."""
+# pylint: disable=missing-docstring, unused-variable
+
+async def good_coro():
+    def _inner():
+        yield 42
+        yield from [1, 2, 3]
+
+
+async def bad_coro():
+    yield 42 # [yield-inside-async-function]
+    yield from [1, 2, 3] # [yield-inside-async-function]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_import.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_import.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/pygtk_import.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+requires=gtk
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines.txt	(revision 1126)
@@ -0,0 +1 @@
+too-many-lines:1::Too many lines in module (1015/1000)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/multiple_imports.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/multiple_imports.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/multiple_imports.py	(revision 1126)
@@ -0,0 +1,2 @@
+# pylint: disable=missing-docstring, unused-import
+import os, socket  # [multiple-imports]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/indexing_exception.txt	(revision 1126)
@@ -0,0 +1,3 @@
+indexing-exception:12::Indexing exceptions will not work on Python 3
+indexing-exception:13::Indexing exceptions will not work on Python 3
+indexing-exception:15::Indexing exceptions will not work on Python 3
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_self_argument.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_self_argument.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_self_argument.txt	(revision 1126)
@@ -0,0 +1,6 @@
+no-method-argument:11:MyClass.method:Method has no argument
+no-method-argument:13:MyClass.met:"""Method has no argument
+""
+"
+no-method-argument:14:MyClass.setup:Method has no argument
+undefined-variable:16:MyClass.setup:Undefined variable 'self'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments_differ.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments_differ.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/arguments_differ.txt	(revision 1126)
@@ -0,0 +1,3 @@
+arguments-differ:12:Child.test:Arguments number differs from overridden 'test' method
+arguments-differ:23:ChildDefaults.test:Arguments number differs from overridden 'test' method
+arguments-differ:41:ClassmethodChild.func:Arguments number differs from overridden 'func' method
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_bare_raise.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_bare_raise.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/misplaced_bare_raise.py	(revision 1126)
@@ -0,0 +1,75 @@
+# pylint: disable=missing-docstring, broad-except, unreachable
+# pylint: disable=unused-variable, too-few-public-methods, invalid-name
+
+try:
+    raise # [misplaced-bare-raise]
+except Exception:
+    pass
+
+try:
+    pass
+except Exception:
+    raise
+
+# pylint: disable=misplaced-comparison-constant
+try:
+    pass
+except Exception:
+    if 1 == 2:
+        raise
+
+def test():
+    try:
+        pass
+    except Exception:
+        def chest():
+            try:
+                pass
+            except Exception:
+                raise
+        raise
+
+def test1():
+    try:
+        if 1 > 2:
+            def best():
+                raise # [misplaced-bare-raise]
+    except Exception:
+        pass
+    raise # [misplaced-bare-raise]
+raise # [misplaced-bare-raise]
+
+try:
+    pass
+finally:
+    # This might work or might not to, depending if there's
+    # an error raised inside the try block. But relying on this
+    # behaviour can be error prone, so we decided to warn
+    # against it.
+    raise # [misplaced-bare-raise]
+
+
+class A(object):
+    try:
+        pass
+    except Exception:
+        raise
+    raise # [misplaced-bare-raise]
+
+# This works in Python 2, but the intent is nevertheless
+# unclear. It will also not work on Python 3, so it's best
+# not to rely on it.
+exc = None
+try:
+    1/0
+except ZeroDivisionError as exc:
+    pass
+if exc:
+    raise # [misplaced-bare-raise]
+
+# Don't emit if we're in ``__exit__``.
+class ContextManager(object):
+    def __enter__(self):
+        return self
+    def __exit__(self, *args):
+        raise
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_reversed_sequence.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_reversed_sequence.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/bad_reversed_sequence.py	(revision 1126)
@@ -0,0 +1,71 @@
+""" Checks that reversed() receive proper argument """
+# pylint: disable=missing-docstring
+# pylint: disable=too-few-public-methods,no-self-use,no-absolute-import
+from collections import deque
+
+__revision__ = 0
+
+class GoodReversed(object):
+    """ Implements __reversed__ """
+    def __reversed__(self):
+        return [1, 2, 3]
+
+class SecondGoodReversed(object):
+    """ Implements __len__ and __getitem__ """
+    def __len__(self):
+        return 3
+
+    def __getitem__(self, index):
+        return index
+
+class BadReversed(object):
+    """ implements only len() """
+    def __len__(self):
+        return 3
+
+class SecondBadReversed(object):
+    """ implements only __getitem__ """
+    def __getitem__(self, index):
+        return index
+
+class ThirdBadReversed(dict):
+    """ dict subclass """
+
+def uninferable(seq):
+    """ This can't be infered at this moment,
+    make sure we don't have a false positive.
+    """
+    return reversed(seq)
+
+def test(path):
+    """ test function """
+    seq = reversed() # No argument given
+    seq = reversed(None) # [bad-reversed-sequence]
+    seq = reversed([1, 2, 3])
+    seq = reversed((1, 2, 3))
+    seq = reversed(set()) # [bad-reversed-sequence]
+    seq = reversed({'a': 1, 'b': 2}) # [bad-reversed-sequence]
+    seq = reversed(iter([1, 2, 3])) # [bad-reversed-sequence]
+    seq = reversed(GoodReversed())
+    seq = reversed(SecondGoodReversed())
+    seq = reversed(BadReversed()) # [bad-reversed-sequence]
+    seq = reversed(SecondBadReversed()) # [bad-reversed-sequence]
+    seq = reversed(range(100))
+    seq = reversed(ThirdBadReversed()) # [bad-reversed-sequence]
+    seq = reversed(lambda: None) # [bad-reversed-sequence]
+    seq = reversed(deque([]))
+    seq = reversed("123")
+    seq = uninferable([1, 2, 3])
+    seq = reversed(path.split("/"))
+    return seq
+
+def test_dict_ancestor_and_reversed():
+    """Don't emit for subclasses of dict, with __reversed__ implemented."""
+    from collections import OrderedDict
+
+    class Child(dict):
+        def __reversed__(self):
+            return reversed(range(10))
+
+    seq = reversed(OrderedDict())
+    return reversed(Child()), seq
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/super_checks.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/super_checks.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/super_checks.py	(revision 1126)
@@ -0,0 +1,114 @@
+# pylint: disable=too-few-public-methods,import-error, no-absolute-import,missing-docstring, wrong-import-position,invalid-name
+"""check use of super"""
+
+from unknown import Missing
+
+class Aaaa:  # <3.0:[old-style-class]
+    """old style"""
+    def hop(self):  # <3.0:[super-on-old-class]
+        """hop"""
+        super(Aaaa, self).hop() # >=3.0:[no-member]
+
+    def __init__(self):  # <3.0:[super-on-old-class]
+        super(Aaaa, self).__init__()
+
+class NewAaaa(object):
+    """old style"""
+    def hop(self):
+        """hop"""
+        super(NewAaaa, self).hop() # [no-member]
+
+    def __init__(self):
+        super(Aaaa, self).__init__()  # [bad-super-call]
+
+class Py3kAaaa(NewAaaa):
+    """new style"""
+    def __init__(self):
+        super().__init__()  # <3.0:[missing-super-argument]
+
+class Py3kWrongSuper(Py3kAaaa):
+    """new style"""
+    def __init__(self):
+        super(NewAaaa, self).__init__()  # [bad-super-call]
+
+class WrongNameRegression(Py3kAaaa):
+    """ test a regression with the message """
+    def __init__(self):
+        super(Missing, self).__init__()  # [bad-super-call]
+
+class Getattr(object):
+    """ crash """
+    name = NewAaaa
+
+class CrashSuper(object):
+    """ test a crash with this checker """
+    def __init__(self):
+        super(Getattr.name, self).__init__()  # [bad-super-call]
+
+class Empty(object):
+    """Just an empty class."""
+
+class SuperDifferentScope(object):
+    """Don'emit bad-super-call when the super call is in another scope.
+    For reference, see https://bitbucket.org/logilab/pylint/issue/403.
+    """
+    @staticmethod
+    def test():
+        """Test that a bad-super-call is not emitted for this case."""
+        class FalsePositive(Empty):
+            """The following super is in another scope than `test`."""
+            def __init__(self, arg):
+                super(FalsePositive, self).__init__(arg)
+        super(object, 1).__init__() # [bad-super-call]
+
+
+class UnknownBases(Missing):
+    """Don't emit if we don't know all the bases."""
+    def __init__(self):
+        super(UnknownBases, self).__init__()
+        super(UnknownBases, self).test()
+        super(Missing, self).test() # [bad-super-call]
+
+
+# Test that we are detecting proper super errors.
+
+class BaseClass(object):
+
+    not_a_method = 42
+
+    def function(self, param):
+        return param + self.not_a_method
+
+    def __getattr__(self, attr):
+        return attr
+
+
+class InvalidSuperChecks(BaseClass):
+
+    def __init__(self):
+        super(InvalidSuperChecks, self).not_a_method() # [not-callable]
+        super(InvalidSuperChecks, self).attribute_error() # [no-member]
+        super(InvalidSuperChecks, self).function(42)
+        super(InvalidSuperChecks, self).function() # [no-value-for-parameter]
+        super(InvalidSuperChecks, self).function(42, 24, 24) # [too-many-function-args]
+        # +1: [unexpected-keyword-arg,no-value-for-parameter]
+        super(InvalidSuperChecks, self).function(lala=42)
+        # Even though BaseClass has a __getattr__, that won't
+        # be called.
+        super(InvalidSuperChecks, self).attribute_error() # [no-member]
+
+
+
+# Regression for PyCQA/pylint/issues/773
+import subprocess
+
+# The problem was related to astroid not filtering statements
+# at scope level properly, basically not doing strong updates.
+try:
+    TimeoutExpired = subprocess.TimeoutExpired
+except AttributeError:
+    class TimeoutExpired(subprocess.CalledProcessError):
+        def __init__(self):
+            returncode = -1
+            self.timeout = -1
+            super(TimeoutExpired, self).__init__(returncode)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.py	(revision 1126)
@@ -0,0 +1,23 @@
+"""test for Python 2 string formatting error
+"""
+from __future__ import unicode_literals
+# pylint: disable=line-too-long
+__revision__ = 1
+
+def pprint_bad():
+    """Test string format """
+    "{{}}".format(1) # [too-many-format-args]
+    "{} {".format() # [bad-format-string]
+    "{} }".format() # [bad-format-string]
+    "{0} {}".format(1, 2) # [format-combined-specification]
+    # +1: [missing-format-argument-key, unused-format-string-argument]
+    "{a} {b}".format(a=1, c=2)
+    "{} {a}".format(1, 2) # [missing-format-argument-key]
+    "{} {}".format(1) # [too-few-format-args]
+    "{} {}".format(1, 2, 3) # [too-many-format-args]
+    # +1: [missing-format-argument-key,missing-format-argument-key,missing-format-argument-key]
+    "{a} {b} {c}".format()
+    "{} {}".format(a=1, b=2) # [too-few-format-args]
+    # +1: [missing-format-argument-key, missing-format-argument-key]
+    "{a} {b}".format(1, 2)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_except.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_except.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/duplicate_except.py	(revision 1126)
@@ -0,0 +1,12 @@
+"""Test for duplicate-check."""
+
+def main():
+    """The second ValueError should be flagged."""
+    try:
+        raise ValueError('test')
+    except ValueError:
+        return 1
+    except ValueError:  # [duplicate-except]
+        return 2
+    except (OSError, TypeError):
+        return 3
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_docstring.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_docstring.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/missing_docstring.py	(revision 1126)
@@ -0,0 +1,54 @@
+# [missing-docstring]
+# pylint: disable=too-few-public-methods
+
+def public_documented():
+    """It has a docstring."""
+
+
+def _private_undocumented():
+    # Doesn't need a docstring
+    pass
+
+
+def _private_documented():
+    """It has a docstring."""
+
+
+class ClassDocumented(object):
+    """It has a docstring."""
+
+
+class ClassUndocumented(object): # [missing-docstring]
+    pass
+
+
+def public_undocumented(): # [missing-docstring]
+    pass
+
+
+def __sizeof__():
+    # Special
+    pass
+
+
+def __mangled():
+    pass
+
+
+class Property(object):
+    """Don't warn about setters and deleters."""
+
+    def __init__(self):
+        self._value = None
+
+    @property
+    def test(self):
+        """Default docstring for setters and deleters."""
+
+    @test.setter
+    def test(self, value):
+        self._value = value
+
+    @test.deleter
+    def test(self):
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unexpected_special_method_signature.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unexpected_special_method_signature.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unexpected_special_method_signature.py	(revision 1126)
@@ -0,0 +1,120 @@
+"""Test for special methods implemented incorrectly."""
+
+# pylint: disable=missing-docstring, unused-argument, too-few-public-methods
+# pylint: disable=invalid-name,too-many-arguments,bad-staticmethod-argument
+
+class Invalid(object):
+
+    def __enter__(self, other): # [unexpected-special-method-signature]
+        pass
+
+    def __del__(self, other): # [unexpected-special-method-signature]
+        pass
+
+    def __format__(self, other, other2): # [unexpected-special-method-signature]
+        pass
+
+    def __setattr__(self): # [unexpected-special-method-signature]
+        pass
+
+    def __round__(self, invalid, args): # [unexpected-special-method-signature]
+        pass
+
+    def __deepcopy__(self, memo, other): # [unexpected-special-method-signature]
+        pass
+
+    def __iter__(): # [no-method-argument]
+        pass
+
+    @staticmethod
+    def __getattr__(self, nanana): # [unexpected-special-method-signature]
+        pass
+
+
+class FirstBadContextManager(object):
+    def __enter__(self):
+        return self
+    def __exit__(self, exc_type): # [unexpected-special-method-signature]
+        pass
+
+class SecondBadContextManager(object):
+    def __enter__(self):
+        return self
+    def __exit__(self, exc_type, value, tb, stack): # [unexpected-special-method-signature]
+        pass
+
+class ThirdBadContextManager(object):
+    def __enter__(self):
+        return self
+
+    # +1: [unexpected-special-method-signature]
+    def __exit__(self, exc_type, value, tb, stack, *args):
+        pass
+
+
+class Async(object):
+
+    def __aiter__(self, extra): # [unexpected-special-method-signature]
+        pass
+    def __anext__(self, extra, argument): # [unexpected-special-method-signature]
+        pass
+    def __await__(self, param): # [unexpected-special-method-signature]
+        pass
+    def __aenter__(self, first): # [unexpected-special-method-signature]
+        pass
+    def __aexit__(self): # [unexpected-special-method-signature]
+        pass
+
+
+class Valid(object):
+
+    def __new__(cls, test, multiple, args):
+        pass
+
+    def __init__(self, this, can, have, multiple, args, as_well):
+        pass
+
+    def __call__(self, also, trv, for_this):
+        pass
+
+    def __round__(self, n):
+        pass
+
+    def __index__(self, n=42):
+        """Expects 0 args, but we are taking in account arguments with defaults."""
+
+    def __deepcopy__(self, memo):
+        pass
+
+    def __format__(self, format_specification=''):
+        pass
+
+    def __copy__(self, this=None, is_not=None, necessary=None):
+        pass
+
+    @staticmethod
+    def __enter__():
+        pass
+
+    @staticmethod
+    def __getitem__(index):
+        pass
+
+
+class FirstGoodContextManager(object):
+    def __enter__(self):
+        return self
+    def __exit__(self, exc_type, value, tb):
+        pass
+
+class SecondGoodContextManager(object):
+    def __enter__(self):
+        return self
+    def __exit__(self, exc_type=None, value=None, tb=None):
+        pass
+
+class ThirdGoodContextManager(object):
+    def __enter__(self):
+        return self
+    def __exit__(self, exc_type, *args):
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/mapping_context.txt	(revision 1126)
@@ -0,0 +1,2 @@
+not-a-mapping:32::Non-mapping value CustomMapping is used in a mapping context
+not-a-mapping:37::Non-mapping value NotMapping() is used in a mapping context
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/crash_missing_module_type.txt
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.txt	(revision 1126)
@@ -0,0 +1,2 @@
+deprecated-lambda:6::map/filter on lambda could be replaced by comprehension
+deprecated-lambda:8::map/filter on lambda could be replaced by comprehension
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_unary_operand_type.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=4.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/anomalous_unicode_escape_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unbalanced_tuple_unpacking.txt	(revision 1126)
@@ -0,0 +1,6 @@
+unbalanced-tuple-unpacking:9:do_stuff:"Possible unbalanced tuple unpacking with sequence (1, 2, 3): left side has 2 label(s), right side has 3 value(s)"
+unbalanced-tuple-unpacking:14:do_stuff1:"Possible unbalanced tuple unpacking with sequence [1, 2, 3]: left side has 2 label(s), right side has 3 value(s)"
+unbalanced-tuple-unpacking:19:do_stuff2:"Possible unbalanced tuple unpacking with sequence (1, 2, 3): left side has 2 label(s), right side has 3 value(s)"
+unbalanced-tuple-unpacking:24:do_stuff3:"Possible unbalanced tuple unpacking with sequence (1, 2, 3): left side has 2 label(s), right side has 3 value(s)"
+unbalanced-tuple-unpacking:69:do_stuff9:"Possible unbalanced tuple unpacking with sequence defined at line 7 of functional.unpacking: left side has 2 label(s), right side has 3 value(s)"
+unbalanced-tuple-unpacking:81:UnbalancedUnpacking.test:"Possible unbalanced tuple unpacking with sequence defined at line 7 of functional.unpacking: left side has 2 label(s), right side has 3 value(s)"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_not_lazy.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_not_lazy.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/logging_not_lazy.txt	(revision 1126)
@@ -0,0 +1,3 @@
+logging-not-lazy:8::Specify string format arguments as logging function parameters
+logging-not-lazy:9::Specify string format arguments as logging function parameters
+logging-not-lazy:10::Specify string format arguments as logging function parameters
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assigning_non_slot.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assigning_non_slot.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assigning_non_slot.py	(revision 1126)
@@ -0,0 +1,133 @@
+""" Checks assigning attributes not found in class slots
+will trigger assigning-non-slot warning.
+"""
+# pylint: disable=too-few-public-methods, no-init, missing-docstring, no-absolute-import, import-error
+from collections import deque
+
+from missing import Unknown
+
+class Empty(object):
+    """ empty """
+
+class Bad(object):
+    """ missing not in slots. """
+
+    __slots__ = ['member']
+
+    def __init__(self):
+        self.missing = 42 # [assigning-non-slot]
+
+class Bad2(object):
+    """ missing not in slots """
+    __slots__ = [deque.__name__, 'member']
+
+    def __init__(self):
+        self.deque = 42
+        self.missing = 42 # [assigning-non-slot]
+
+class Bad3(Bad):
+    """ missing not found in slots """
+
+    __slots__ = ['component']
+
+    def __init__(self):
+        self.component = 42
+        self.member = 24
+        self.missing = 42 # [assigning-non-slot]
+        super(Bad3, self).__init__()
+
+class Good(Empty):
+    """ missing not in slots, but Empty doesn't
+    specify __slots__.
+    """
+    __slots__ = ['a']
+
+    def __init__(self):
+        self.missing = 42
+
+class Good2(object):
+    """ Using __dict__ in slots will be safe. """
+
+    __slots__ = ['__dict__', 'comp']
+
+    def __init__(self):
+        self.comp = 4
+        self.missing = 5
+
+class PropertyGood(object):
+    """ Using properties is safe. """
+
+    __slots__ = ['tmp', '_value']
+
+    @property
+    def test(self):
+        return self._value
+
+    @test.setter
+    def test(self, value):
+        # pylint: disable=attribute-defined-outside-init
+        self._value = value
+
+    def __init__(self):
+        self.test = 42
+
+class PropertyGood2(object):
+    """ Using properties in the body of the class is safe. """
+    __slots__ = ['_value']
+
+    def _getter(self):
+        return self._value
+
+    def _setter(self, value):
+        # pylint: disable=attribute-defined-outside-init
+        self._value = value
+
+    test = property(_getter, _setter)
+
+    def __init__(self):
+        self.test = 24
+
+class UnicodeSlots(object):
+    """Using unicode objects in __slots__ is okay.
+
+    On Python 3.3 onward, u'' is equivalent to '',
+    so this test should be safe for both versions.
+    """
+    __slots__ = (u'first', u'second')
+
+    def __init__(self):
+        self.first = 42
+        self.second = 24
+
+
+class DataDescriptor(object):
+    def __init__(self, name, default=''):
+        self.__name = name
+        self.__default = default
+
+    def __get__(self, inst, cls):
+        return getattr(inst, self.__name, self.__default)
+
+    def __set__(self, inst, value):
+        setattr(inst, self.__name, value)
+
+
+class NonDataDescriptor(object):
+    def __get__(self, inst, cls):
+        return 42
+
+
+class SlotsWithDescriptor(object):
+    __slots__ = ['_err']
+    data_descriptor = DataDescriptor('_err')
+    non_data_descriptor = NonDataDescriptor()
+    missing_descriptor = Unknown()
+
+
+def dont_emit_for_descriptors():
+    inst = SlotsWithDescriptor()
+    # This should not emit, because attr is
+    # a data descriptor
+    inst.data_descriptor = 'foo'
+    inst.non_data_descriptor = 'lala' # [assigning-non-slot]
+    return
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assert_on_tuple.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assert_on_tuple.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/assert_on_tuple.txt	(revision 1126)
@@ -0,0 +1,2 @@
+assert-on-tuple:5::Assert called on a 2-uple. Did you mean 'assert x,y'?
+assert-on-tuple:11::Assert called on a 2-uple. Did you mean 'assert x,y'?
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/membership_protocol_py3.txt	(revision 1126)
@@ -0,0 +1,3 @@
+unsupported-membership-test:34:test:Value 'IterableClass()' doesn't support membership test
+unsupported-membership-test:35:test:Value 'OldIterableClass()' doesn't support membership test
+unsupported-membership-test:36:test:Value 'ContainerClass()' doesn't support membership test
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_name_in_module.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_name_in_module.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/no_name_in_module.txt	(revision 1126)
@@ -0,0 +1,13 @@
+no-name-in-module:5::No name 'tutu' in module 'collections'
+no-name-in-module:6::No name 'toto' in module 'collections'
+no-member:10::Module 'xml.etree.ElementTree' has no 'nonexistant_function' member:INFERENCE
+no-member:11::Module 'xml.etree.ElementTree' has no 'another' member:INFERENCE
+no-member:12::Module 'collections' has no 'yo' member:INFERENCE
+no-member:16::Module 'sys' has no 'stdoout' member:INFERENCE
+no-name-in-module:23::No name 'compiile' in module 're'
+no-name-in-module:23::No name 'findiiter' in module 're'
+pointless-statement:26::Statement seems to have no effect
+no-name-in-module:34::No name 'anything' in module 'collections'
+no-name-in-module:44::No name 'indeed_missing' in module 'collections'
+no-name-in-module:65::No name 'lala' in module 'functional.no_self_use'
+no-name-in-module:66::No name 'bla' in module 'functional.no_self_use'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_lambda.py	(revision 1126)
@@ -0,0 +1,23 @@
+# pylint: disable=missing-docstring,bad-builtin,invalid-name,no-absolute-import
+
+import functools
+
+# Don't do this, use a comprehension instead.
+assert map(lambda x: x*2, [1, 2, 3]) == [2, 4, 6] # [deprecated-lambda]
+
+assert filter(lambda x: x != 1, [1, 2, 3]) == [2, 3] # [deprecated-lambda]
+
+# It's still ok to use map and filter with anything but an inline lambda.
+double = lambda x: x * 2
+assert map(double, [1, 2, 3]) == [2, 4, 6]
+
+# It's also ok to pass lambdas to other functions.
+assert functools.reduce(lambda x, y: x * y, [1, 2, 3, 4]) == 24
+
+# Or to a undefined function or one with varargs
+def f(*a):
+    return len(a)
+
+f(lambda x, y: x + y, [1, 2, 3])
+
+undefined_function(lambda: 2)  # pylint: disable=undefined-variable
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/suspicious_str_strip_call.txt	(revision 1126)
@@ -0,0 +1,3 @@
+bad-str-strip-call:7::Suspicious argument in unicode.strip call
+bad-str-strip-call:8::Suspicious argument in unicode.lstrip call
+bad-str-strip-call:9::Suspicious argument in str.rstrip call
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_all_object.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_all_object.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_all_object.py	(revision 1126)
@@ -0,0 +1,6 @@
+# pylint: disable=missing-docstring
+__all__ = (
+    1, # [invalid-all-object]
+    lambda: None, # [invalid-all-object]
+    None, # [invalid-all-object]
+)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_py29.rc	(revision 1126)
@@ -0,0 +1,3 @@
+[testoptions]
+max_pyver=3.0
+except_implementations=PyPy,Jython
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/undefined_variable.py	(revision 1126)
@@ -0,0 +1,177 @@
+# pylint: disable=missing-docstring, multiple-statements, redefined-variable-type
+# pylint: disable=too-few-public-methods, no-init, no-self-use, old-style-class,bare-except,broad-except
+from __future__ import print_function
+DEFINED = 1
+
+if DEFINED != 1:
+    if DEFINED in (unknown, DEFINED):  # [undefined-variable]
+        DEFINED += 1
+
+
+def in_method(var):
+    """method doc"""
+    var = nomoreknown  # [undefined-variable]
+    assert var
+
+DEFINED = {DEFINED:__revision__}  # [undefined-variable]
+# +1:[undefined-variable]
+DEFINED[__revision__] = OTHER = 'move this is astroid test'
+
+OTHER += '$'
+
+def bad_default(var, default=unknown2):  # [undefined-variable]
+    """function with defaut arg's value set to an unexistant name"""
+    print(var, default)
+    print(xxxx)  # [undefined-variable]
+    augvar += 1  # [undefined-variable]
+    del vardel  # [undefined-variable]
+
+LMBD = lambda x, y=doesnotexist: x+y  # [undefined-variable]
+LMBD2 = lambda x, y: x+z  # [undefined-variable]
+
+try:
+    POUET # don't catch me
+except NameError:
+    POUET = 'something'
+
+try:
+    POUETT # don't catch me
+except Exception: # pylint:disable = broad-except
+    POUETT = 'something'
+
+try:
+    POUETTT # don't catch me
+except: # pylint:disable = bare-except
+    POUETTT = 'something'
+
+print(POUET, POUETT, POUETTT)
+
+
+try:
+    PLOUF  # [used-before-assignment]
+except ValueError:
+    PLOUF = 'something'
+
+print(PLOUF)
+
+def if_branch_test(something):
+    """hop"""
+    if something == 0:
+        if xxx == 1:  # [used-before-assignment]
+            pass
+    else:
+        print(xxx)
+        xxx = 3
+
+
+def decorator(arg):
+    """Decorator with one argument."""
+    return lambda: list(arg)
+
+
+@decorator(arg=[i * 2 for i in range(15)])
+def func1():
+    """A function with a decorator that contains a listcomp."""
+
+@decorator(arg=(i * 2 for i in range(15)))
+def func2():
+    """A function with a decorator that contains a genexpr."""
+
+@decorator(lambda x: x > 0)
+def main():
+    """A function with a decorator that contains a lambda."""
+
+# Test shared scope.
+
+def test_arguments(arg=TestClass):  # [used-before-assignment]
+    """ TestClass isn't defined yet. """
+    return arg
+
+class TestClass(Ancestor):  # [used-before-assignment]
+    """ contains another class, which uses an undefined ancestor. """
+
+    class MissingAncestor(Ancestor1):  # [used-before-assignment]
+        """ no op """
+
+    def test1(self):
+        """ It should trigger here, because the two classes
+        have the same scope.
+        """
+        class UsingBeforeDefinition(Empty):  # [used-before-assignment]
+            """ uses Empty before definition """
+        class Empty(object):
+            """ no op """
+        return UsingBeforeDefinition
+
+    def test(self):
+        """ Ancestor isn't defined yet, but we don't care. """
+        class MissingAncestor1(Ancestor):
+            """ no op """
+        return MissingAncestor1
+
+class Self(object):
+    """ Detect when using the same name inside the class scope. """
+    obj = Self # [undefined-variable]
+
+class Self1(object):
+    """ No error should be raised here. """
+
+    def test(self):
+        """ empty """
+        return Self1
+
+
+class Ancestor(object):
+    """ No op """
+
+class Ancestor1(object):
+    """ No op """
+
+NANA = BAT # [undefined-variable]
+del BAT
+
+
+class KeywordArgument(object):
+    """Test keyword arguments."""
+
+    enable = True
+    def test(self, is_enabled=enable):
+        """do nothing."""
+
+    def test1(self, is_enabled=enabled): # [used-before-assignment]
+        """enabled is undefined at this point, but it is used before assignment."""
+
+    def test2(self, is_disabled=disabled): # [undefined-variable]
+        """disabled is undefined"""
+
+    enabled = True
+
+    func = lambda arg=arg: arg * arg # [undefined-variable]
+
+    arg2 = 0
+    func2 = lambda arg2=arg2: arg2 * arg2
+
+# Don't emit if the code is protected by NameError
+try:
+    unicode_1
+except NameError:
+    pass
+
+try:
+    unicode_2
+except Exception:
+    pass
+
+try:
+    unicode_3
+except:
+    pass
+
+try:
+    unicode_4 # [undefined-variable]
+except ValueError:
+    pass
+
+# See https://bitbucket.org/logilab/pylint/issue/111/
+try: raise IOError(1, "a")
+except IOError as err: print(err)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/string_formatting_py27.txt	(revision 1126)
@@ -0,0 +1,15 @@
+too-many-format-args:9:pprint_bad:Too many arguments for format string
+bad-format-string:10:pprint_bad:Invalid format string
+bad-format-string:11:pprint_bad:Invalid format string
+format-combined-specification:12:pprint_bad:Format string contains both automatic field numbering and manual field specification
+missing-format-argument-key:14:pprint_bad:Missing keyword argument u'b' for format string
+unused-format-string-argument:14:pprint_bad:Unused format argument 'c'
+missing-format-argument-key:15:pprint_bad:Missing keyword argument u'a' for format string
+too-few-format-args:16:pprint_bad:Not enough arguments for format string
+too-many-format-args:17:pprint_bad:Too many arguments for format string
+missing-format-argument-key:19:pprint_bad:Missing keyword argument u'a' for format string
+missing-format-argument-key:19:pprint_bad:Missing keyword argument u'b' for format string
+missing-format-argument-key:19:pprint_bad:Missing keyword argument u'c' for format string
+too-few-format-args:20:pprint_bad:Not enough arguments for format string
+missing-format-argument-key:22:pprint_bad:Missing keyword argument u'a' for format string
+missing-format-argument-key:22:pprint_bad:Missing keyword argument u'b' for format string
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/name_styles.txt	(revision 1126)
@@ -0,0 +1,17 @@
+invalid-name:8::"Invalid constant name ""bad_const_name"""
+invalid-name:11:BADFUNCTION_name:"Invalid function name ""BADFUNCTION_name"""
+invalid-name:13:BADFUNCTION_name:"Invalid variable name ""BAD_LOCAL_VAR"""
+invalid-name:17:func_bad_argname:"Invalid argument name ""NOT_GOOD"""
+invalid-name:27:bad_class_name:"Invalid class name ""bad_class_name"""
+invalid-name:38:CorrectClassName.__init__:"Invalid attribute name ""_Bad_AtTR_name"""
+invalid-name:39:CorrectClassName.__init__:"Invalid attribute name ""Bad_PUBLIC_name"""
+invalid-name:41:CorrectClassName:"Invalid class attribute name ""zz"""
+invalid-name:44:CorrectClassName.BadMethodName:"Invalid method name ""BadMethodName""":INFERENCE
+invalid-name:50:CorrectClassName.__DunDER_IS_not_free_for_all__:"Invalid method name ""__DunDER_IS_not_free_for_all__""":INFERENCE
+invalid-name:80::"Invalid class name ""BAD_NAME_FOR_CLASS"""
+invalid-name:81::"Invalid class name ""NEXT_BAD_NAME_FOR_CLASS"""
+invalid-name:88::"Invalid class name ""NOT_CORRECT"""
+invalid-name:94:test_globals:"Invalid constant name ""AlsoCorrect"""
+invalid-name:107:FooClass.PROPERTY_NAME:"Invalid attribute name ""PROPERTY_NAME""":INFERENCE
+invalid-name:112:FooClass.ABSTRACT_PROPERTY_NAME:"Invalid attribute name ""ABSTRACT_PROPERTY_NAME""":INFERENCE
+invalid-name:117:FooClass.PROPERTY_NAME_SETTER:"Invalid attribute name ""PROPERTY_NAME_SETTER""":INFERENCE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/used_before_assignment_nonlocal.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_module_py3.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_from_outside_func.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.3
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/deprecated_methods_py2.py	(revision 1126)
@@ -0,0 +1,9 @@
+""" Functional test for deprecated methods in Python 2 """
+# pylint: disable=no-member
+import os
+import xml.etree.ElementTree
+
+os.popen2('')     # [deprecated-method]
+os.popen3('')     # [deprecated-method]
+os.popen4('')     # [deprecated-method]
+xml.etree.ElementTree.Element('elem').getchildren()     # [deprecated-method]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unknown_encoding_pypy.txt	(revision 1126)
@@ -0,0 +1 @@
+syntax-error:1::"Unknown encoding: ibo-8859-1"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_too_long.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_too_long.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/line_too_long.txt	(revision 1126)
@@ -0,0 +1,4 @@
+line-too-long:3::Line too long (101/100)
+line-too-long:5::Line too long (104/100)
+line-too-long:15::Line too long (102/100)
+line-too-long:24::Line too long (105/100)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/too_many_lines.py	(revision 1126)
@@ -0,0 +1,1015 @@
+# pylint: disable=missing-docstring
+# -1: [too-many-lines]
+__revision__ = 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ZERFZAER = 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+HEHEHE = 2
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.rc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.rc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/yield_inside_async_function.rc	(revision 1126)
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.5
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_class_instantiated_py3.txt	(revision 1126)
@@ -0,0 +1,4 @@
+abstract-class-instantiated:108:main:Abstract class 'BadMroAbstractMethods' with abstract methods instantiated
+abstract-class-instantiated:109:main:Abstract class 'BadClass' with abstract methods instantiated
+abstract-class-instantiated:110:main:Abstract class 'SecondBadClass' with abstract methods instantiated
+abstract-class-instantiated:111:main:Abstract class 'ThirdBadClass' with abstract methods instantiated
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_slice_index.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_slice_index.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/invalid_slice_index.txt	(revision 1126)
@@ -0,0 +1,5 @@
+invalid-slice-index:10:function1:Slice index is not an int, None, or instance with __index__
+invalid-slice-index:10:function1:Slice index is not an int, None, or instance with __index__
+invalid-slice-index:14:function2:Slice index is not an int, None, or instance with __index__
+invalid-slice-index:14:function2:Slice index is not an int, None, or instance with __index__
+invalid-slice-index:23:function3:Slice index is not an int, None, or instance with __index__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/globals.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/globals.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/globals.py	(revision 1126)
@@ -0,0 +1,25 @@
+"""Warnings about global statements and usage of global variables."""
+from __future__ import print_function
+
+global CSTE  # [global-at-module-level]
+print(CSTE)  # [undefined-variable]
+
+CONSTANT = 1
+
+def fix_contant(value):
+    """all this is ok, but try not using global ;)"""
+    global CONSTANT  # [global-statement]
+    print(CONSTANT)
+    CONSTANT = value
+
+
+def other():
+    """global behaviour test"""
+    global HOP  # [global-variable-not-assigned]
+    print(HOP)  # [undefined-variable]
+
+
+def define_constant():
+    """ok but somevar is not defined at the module scope"""
+    global SOMEVAR  # [global-variable-undefined]
+    SOMEVAR = 2
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/abstract_method_py2.txt	(revision 1126)
@@ -0,0 +1,16 @@
+abstract-method:28:Concret:"Method 'bbbb' is abstract in class 'Abstract' but is not overridden"
+abstract-method:53:Container:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:53:Container:"Method '__iter__' is abstract in class 'Structure' but is not overridden"
+abstract-method:53:Container:"Method '__len__' is abstract in class 'Structure' but is not overridden"
+abstract-method:59:Sizable:"Method '__contains__' is abstract in class 'Structure' but is not overridden"
+abstract-method:59:Sizable:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:59:Sizable:"Method '__iter__' is abstract in class 'Structure' but is not overridden"
+abstract-method:65:Hashable:"Method '__contains__' is abstract in class 'Structure' but is not overridden"
+abstract-method:65:Hashable:"Method '__iter__' is abstract in class 'Structure' but is not overridden"
+abstract-method:65:Hashable:"Method '__len__' is abstract in class 'Structure' but is not overridden"
+abstract-method:70:Iterator:"Method '__contains__' is abstract in class 'Structure' but is not overridden"
+abstract-method:70:Iterator:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:70:Iterator:"Method '__len__' is abstract in class 'Structure' but is not overridden"
+abstract-method:89:BadComplexMro:"Method '__hash__' is abstract in class 'Structure' but is not overridden"
+abstract-method:89:BadComplexMro:"Method '__len__' is abstract in class 'AbstractSizable' but is not overridden"
+abstract-method:89:BadComplexMro:"Method 'length' is abstract in class 'AbstractSizable' but is not overridden"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/iterable_context_py2.py	(revision 1126)
@@ -0,0 +1,18 @@
+"""
+Checks that iterable metaclasses are recognized by pylint.
+"""
+# pylint: disable=missing-docstring,too-few-public-methods,no-init,no-self-use,unused-argument,bad-mcs-method-argument
+
+# metaclasses as iterables
+class Meta(type):
+    def __iter__(self):
+        return iter((1, 2, 3))
+
+class SomeClass(object):
+    __metaclass__ = Meta
+
+
+for i in SomeClass:
+    print i
+for i in SomeClass():  # [not-an-iterable]
+    print i
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ungrouped_imports.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ungrouped_imports.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/ungrouped_imports.py	(revision 1126)
@@ -0,0 +1,20 @@
+"""Checks import order rule"""
+# pylint: disable=unused-import,relative-import,wrong-import-order,using-constant-test
+# pylint: disable=import-error
+import six
+import logging.config
+import os.path
+from astroid import are_exclusive
+import logging  # [ungrouped-imports]
+import unused_import
+try:
+    import os  # [ungrouped-imports]
+except ImportError:
+    pass
+from os import pardir
+import scipy
+from os import sep
+import astroid  # [ungrouped-imports]
+if True:
+    import logging.handlers  # [ungrouped-imports]
+from os.path import join  # [ungrouped-imports]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_lambda.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_lambda.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/functional/unnecessary_lambda.txt	(revision 1126)
@@ -0,0 +1,7 @@
+unnecessary-lambda:9:<lambda>:Lambda may not be necessary
+unnecessary-lambda:11:<lambda>:Lambda may not be necessary
+unnecessary-lambda:13:<lambda>:Lambda may not be necessary
+unnecessary-lambda:20:<lambda>:Lambda may not be necessary
+unnecessary-lambda:22:<lambda>:Lambda may not be necessary
+unnecessary-lambda:24:<lambda>:Lambda may not be necessary
+unnecessary-lambda:26:<lambda>:Lambda may not be necessary
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_strings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_strings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_strings.py	(revision 1126)
@@ -0,0 +1,41 @@
+# Copyright (c) 2003-2015 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+import sys
+import unittest
+
+from astroid import test_utils
+
+from pylint.checkers import strings
+from pylint.testutils import CheckerTestCase
+
+
+class StringCheckerTest(CheckerTestCase):
+    CHECKER_CLASS = strings.StringFormatChecker
+
+    @unittest.skipUnless(sys.version_info > (3, 0),
+                         "Tests that the string formatting checker "
+                         "doesn't fail when encountering a bytes "
+                         "string with a .format call")
+    def test_format_bytes(self):
+        code = "b'test'.format(1, 2)"
+        node = test_utils.extract_node(code)
+        with self.assertNoMessages():
+            self.checker.visit_call(node)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_reporters_json.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_reporters_json.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_reporters_json.py	(revision 1126)
@@ -0,0 +1,62 @@
+# Copyright (c) 2003-2015 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+"""Test for the JSON reporter."""
+
+import json
+import unittest
+
+import six
+
+from pylint.lint import PyLinter
+from pylint import checkers
+from pylint.reporters.json import JSONReporter
+
+
+class TestJSONReporter(unittest.TestCase):
+
+    def test_simple_json_output(self):
+        output = six.StringIO()
+
+        reporter = JSONReporter()
+        linter = PyLinter(reporter=reporter)
+        checkers.initialize(linter)
+
+        linter.config.persistent = 0
+        linter.reporter.set_output(output)
+        linter.open()
+        linter.set_current_module('0123')
+        linter.add_message('line-too-long', line=1, args=(1, 2))
+
+        # we call this method because we didn't actually run the checkers
+        reporter.display_messages(None)
+
+        expected_result = [[
+            ("column", 0),
+            ("line", 1),
+            ("message", "Line too long (1/2)"),
+            ("module", "0123"),
+            ("obj", ""),
+            ("path", "0123"),
+            ("symbol", "line-too-long"),
+            ("type", "convention"),
+        ]]
+        report_result = json.loads(output.getvalue())
+        report_result = [sorted(report_result[0].items(),
+                                key=lambda item: item[0])]
+        self.assertEqual(report_result, expected_result)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_misc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_misc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_misc.py	(revision 1126)
@@ -0,0 +1,49 @@
+# Copyright 2013 Google Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Tests for the misc checker."""
+
+import unittest
+
+from pylint.checkers import misc
+from pylint.testutils import (
+    CheckerTestCase, Message,
+    set_config, create_file_backed_module,
+)
+
+
+
+class FixmeTest(CheckerTestCase):
+    CHECKER_CLASS = misc.EncodingChecker
+
+    def test_fixme(self):
+        with create_file_backed_module(
+            """a = 1
+            # FIXME """) as module:
+            with self.assertAddsMessages(
+                Message(msg_id='fixme', line=2, args=u'FIXME')):
+                self.checker.process_module(module)
+
+    @set_config(notes=[])
+    def test_empty_fixme_regex(self):
+        with create_file_backed_module(
+            """a = 1
+            # fixme
+            """) as module:
+            with self.assertNoMessages():
+                self.checker.process_module(module)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_writer.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_writer.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_pyreverse_writer.py	(revision 1126)
@@ -0,0 +1,134 @@
+# Copyright (c) 2000-2013 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""
+unittest for visitors.diadefs and extensions.diadefslib modules
+"""
+
+
+import os
+import sys
+import codecs
+from os.path import join, dirname, abspath
+from difflib import unified_diff
+import unittest
+
+from astroid import MANAGER
+
+from pylint.pyreverse.inspector import Linker, project_from_files
+from pylint.pyreverse.diadefslib import DefaultDiadefGenerator, DiadefsHandler
+from pylint.pyreverse.writer import DotWriter
+from pylint.pyreverse.utils import get_visibility
+
+
+_DEFAULTS = {
+    'all_ancestors': None, 'show_associated': None,
+    'module_names': None,
+    'output_format': 'dot', 'diadefs_file': None, 'quiet': 0,
+    'show_ancestors': None, 'classes': (), 'all_associated': None,
+    'mode': 'PUB_ONLY', 'show_builtin': False, 'only_classnames': False
+    }
+
+class Config(object):
+    """config object for tests"""
+    def __init__(self):
+        for attr, value in _DEFAULTS.items():
+            setattr(self, attr, value)
+
+
+def _file_lines(path):
+    # we don't care about the actual encoding, but python3 forces us to pick one
+    with codecs.open(path, encoding='latin1') as stream:
+        lines = [line.strip() for line in stream.readlines()
+                 if (line.find('squeleton generated by ') == -1 and
+                     not line.startswith('__revision__ = "$Id:'))]
+    return [line for line in lines if line]
+
+def get_project(module, name="No Name"):
+    """return a astroid project representation"""
+    def _astroid_wrapper(func, modname):
+        return func(modname)
+    return project_from_files([module], _astroid_wrapper,
+                              project_name=name)
+
+CONFIG = Config()
+
+class DotWriterTC(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        project = get_project(os.path.join(os.path.dirname(__file__), 'data'))
+        linker = Linker(project)
+        handler = DiadefsHandler(CONFIG)
+        dd = DefaultDiadefGenerator(linker, handler).visit(project)
+        for diagram in dd:
+            diagram.extract_relationships()
+        writer = DotWriter(CONFIG)
+        writer.write(dd)
+
+    @classmethod
+    def tearDownClass(cls):
+        for fname in ('packages_No_Name.dot', 'classes_No_Name.dot',):
+            try:
+                os.remove(fname)
+            except:
+                continue
+
+    def _test_same_file(self, generated_file):
+        expected_file = os.path.join(os.path.dirname(__file__), 'data', generated_file)
+        generated = _file_lines(generated_file)
+        expected = _file_lines(expected_file)
+        generated = '\n'.join(generated)
+        expected = '\n'.join(expected)
+        files = "\n *** expected : %s, generated : %s \n"  % (
+            expected_file, generated_file)
+        self.assertEqual(expected, generated, '%s%s' % (
+            files, '\n'.join(line for line in unified_diff(
+            expected.splitlines(), generated.splitlines() ))) )
+        os.remove(generated_file)
+
+    def test_package_diagram(self):
+        self._test_same_file('packages_No_Name.dot')
+
+    def test_class_diagram(self):
+        self._test_same_file('classes_No_Name.dot')
+
+
+
+class GetVisibilityTC(unittest.TestCase):
+
+    def test_special(self):
+        for name in ["__reduce_ex__",  "__setattr__"]:
+            self.assertEqual(get_visibility(name), 'special')
+
+    def test_private(self):
+        for name in ["__g_", "____dsf", "__23_9"]:
+            got = get_visibility(name)
+            self.assertEqual(got, 'private',
+                             'got %s instead of private for value %s' % (got, name))
+
+    def test_public(self):
+        self.assertEqual(get_visibility('simple'), 'public')
+
+    def test_protected(self):
+        for name in ["_","__", "___", "____", "_____", "___e__",
+                     "_nextsimple", "_filter_it_"]:
+            got = get_visibility(name)
+            self.assertEqual(got, 'protected',
+                             'got %s instead of protected for value %s' % (got, name))
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_imports.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_imports.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_imports.py	(revision 1126)
@@ -0,0 +1,75 @@
+"""Unit tests for the imports checker."""
+import unittest
+
+from astroid import test_utils
+from pylint.checkers import imports
+from pylint.testutils import CheckerTestCase, Message, set_config
+
+
+class ImportsCheckerTC(CheckerTestCase):
+
+    CHECKER_CLASS = imports.ImportsChecker
+
+    @set_config(ignored_modules=('external_module',
+                                 'fake_module.submodule',
+                                 'foo',
+                                 'bar'))
+    def test_import_error_skipped(self):
+        """Make sure that imports do not emit a 'import-error' when the
+        module is configured to be ignored."""
+
+        node = test_utils.extract_node("""
+        from external_module import anything
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_importfrom(node)
+
+        node = test_utils.extract_node("""
+        from external_module.another_module import anything
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_importfrom(node)
+
+        node = test_utils.extract_node("""
+        import external_module
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_import(node)
+
+        node = test_utils.extract_node("""
+        from fake_module.submodule import anything
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_importfrom(node)
+
+        node = test_utils.extract_node("""
+        from fake_module.submodule.deeper import anything
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_importfrom(node)
+
+        node = test_utils.extract_node("""
+        import foo, bar
+        """)
+        msg = Message('multiple-imports', node=node, args='foo, bar')
+        with self.assertAddsMessages(msg):
+            self.checker.visit_import(node)
+
+        node = test_utils.extract_node("""
+        import foo
+        import bar
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_import(node)
+
+    def test_visit_importfrom(self):
+        """
+        Test that duplicate imports on single line raise 'reimported'.
+        """
+        node = test_utils.extract_node('from time import sleep, sleep, time')
+        msg = Message(msg_id='reimported', node=node, args=('sleep', 1))
+        with self.assertAddsMessages(msg):
+            self.checker.visit_importfrom(node)
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_python3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_python3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_python3.py	(revision 1126)
@@ -0,0 +1,441 @@
+# Copyright 2014 Google Inc.
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""Tests for the python3 checkers."""
+from __future__ import absolute_import
+
+import sys
+import unittest
+import textwrap
+
+import astroid
+from astroid import test_utils
+
+from pylint import testutils
+from pylint.checkers import python3 as checker
+
+
+def python2_only(test):
+    """Decorator for any tests that will fail under Python 3."""
+    return unittest.skipIf(sys.version_info[0] > 2, 'Python 2 only')(test)
+
+# TODO(cpopa): Port these to the functional test framework instead.
+
+class Python3CheckerTest(testutils.CheckerTestCase):
+    CHECKER_CLASS = checker.Python3Checker
+
+    def check_bad_builtin(self, builtin_name):
+        node = test_utils.extract_node(builtin_name + '  #@')
+        message = builtin_name.lower() + '-builtin'
+        with self.assertAddsMessages(testutils.Message(message, node=node)):
+            self.checker.visit_name(node)
+
+    @python2_only
+    def test_bad_builtins(self):
+        builtins = [
+            'apply',
+            'buffer',
+            'cmp',
+            'coerce',
+            'execfile',
+            'file',
+            'input',
+            'intern',
+            'long',
+            'raw_input',
+            'round',
+            'reduce',
+            'StandardError',
+            'unichr',
+            'unicode',
+            'xrange',
+            'reload',
+        ]
+        for builtin in builtins:
+            self.check_bad_builtin(builtin)
+
+    def as_iterable_in_for_loop_test(self, fxn):
+        code = "for x in {}(): pass".format(fxn)
+        module = astroid.parse(code)
+        with self.assertNoMessages():
+            self.walk(module)
+
+    def as_used_by_iterable_in_for_loop_test(self, fxn):
+        checker = '{}-builtin-not-iterating'.format(fxn)
+        node = test_utils.extract_node("""
+        for x in (whatever(
+            {}() #@
+        )):
+            pass
+        """.format(fxn))
+        message = testutils.Message(checker, node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def as_iterable_in_genexp_test(self, fxn):
+        code = "x = (x for x in {}())".format(fxn)
+        module = astroid.parse(code)
+        with self.assertNoMessages():
+            self.walk(module)
+
+    def as_iterable_in_listcomp_test(self, fxn):
+        code = "x = [x for x in {}(None, [1])]".format(fxn)
+        module = astroid.parse(code)
+        with self.assertNoMessages():
+            self.walk(module)
+
+    def as_used_in_variant_in_genexp_test(self, fxn):
+        checker = '{}-builtin-not-iterating'.format(fxn)
+        node = test_utils.extract_node("""
+        list(
+            __({}(x))
+            for x in [1]
+        )
+        """.format(fxn))
+        message = testutils.Message(checker, node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def as_used_in_variant_in_listcomp_test(self, fxn):
+        checker = '{}-builtin-not-iterating'.format(fxn)
+        node = test_utils.extract_node("""
+        [
+            __({}(None, x))
+        for x in [[1]]]
+        """.format(fxn))
+        message = testutils.Message(checker, node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def as_argument_to_callable_constructor_test(self, fxn, callable_fn):
+        module = astroid.parse("x = {}({}())".format(callable_fn, fxn))
+        with self.assertNoMessages():
+            self.walk(module)
+
+    def as_argument_to_random_fxn_test(self, fxn):
+        checker = '{}-builtin-not-iterating'.format(fxn)
+        node = test_utils.extract_node("""
+        y(
+            {}() #@
+        )
+        """.format(fxn))
+        message = testutils.Message(checker, node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def as_argument_to_str_join_test(self, fxn):
+        code = "x = ''.join({}())".format(fxn)
+        module = astroid.parse(code)
+        with self.assertNoMessages():
+            self.walk(module)
+
+    def as_iterable_in_unpacking(self, fxn):
+        node = test_utils.extract_node("""
+        a, b = __({}())
+        """.format(fxn))
+        with self.assertNoMessages():
+            self.checker.visit_call(node)
+
+    def as_assignment(self, fxn):
+        checker = '{}-builtin-not-iterating'.format(fxn)
+        node = test_utils.extract_node("""
+        a = __({}())
+        """.format(fxn))
+        message = testutils.Message(checker, node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def iterating_context_tests(self, fxn):
+        """Helper for verifying a function isn't used as an iterator."""
+        self.as_iterable_in_for_loop_test(fxn)
+        self.as_used_by_iterable_in_for_loop_test(fxn)
+        self.as_iterable_in_genexp_test(fxn)
+        self.as_iterable_in_listcomp_test(fxn)
+        self.as_used_in_variant_in_genexp_test(fxn)
+        self.as_used_in_variant_in_listcomp_test(fxn)
+        self.as_argument_to_random_fxn_test(fxn)
+        self.as_argument_to_str_join_test(fxn)
+        self.as_iterable_in_unpacking(fxn)
+        self.as_assignment(fxn)
+
+        for func in ('iter', 'list', 'tuple', 'sorted',
+                     'set', 'sum', 'any', 'all',
+                     'enumerate', 'dict'):
+            self.as_argument_to_callable_constructor_test(fxn, func)
+
+    @python2_only
+    def test_map_in_iterating_context(self):
+        self.iterating_context_tests('map')
+
+    @python2_only
+    def test_zip_in_iterating_context(self):
+        self.iterating_context_tests('zip')
+
+    @python2_only
+    def test_range_in_iterating_context(self):
+        self.iterating_context_tests('range')
+
+    @python2_only
+    def test_filter_in_iterating_context(self):
+        self.iterating_context_tests('filter')
+
+    def defined_method_test(self, method, warning):
+        """Helper for verifying that a certain method is not defined."""
+        node = test_utils.extract_node("""
+            class Foo(object):
+                def __{0}__(self, other):  #@
+                    pass""".format(method))
+        message = testutils.Message(warning, node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_functiondef(node)
+
+    def test_delslice_method(self):
+        self.defined_method_test('delslice', 'delslice-method')
+
+    def test_getslice_method(self):
+        self.defined_method_test('getslice', 'getslice-method')
+
+    def test_setslice_method(self):
+        self.defined_method_test('setslice', 'setslice-method')
+
+    def test_coerce_method(self):
+        self.defined_method_test('coerce', 'coerce-method')
+
+    def test_oct_method(self):
+        self.defined_method_test('oct', 'oct-method')
+
+    def test_hex_method(self):
+        self.defined_method_test('hex', 'hex-method')
+
+    def test_nonzero_method(self):
+        self.defined_method_test('nonzero', 'nonzero-method')
+
+    def test_cmp_method(self):
+        self.defined_method_test('cmp', 'cmp-method')
+
+    @python2_only
+    def test_print_statement(self):
+        node = test_utils.extract_node('print "Hello, World!" #@')
+        message = testutils.Message('print-statement', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_print(node)
+
+    @python2_only
+    def test_backtick(self):
+        node = test_utils.extract_node('`test`')
+        message = testutils.Message('backtick', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_repr(node)
+
+    def test_relative_import(self):
+        node = test_utils.extract_node('import string  #@')
+        message = testutils.Message('no-absolute-import', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_import(node)
+
+    def test_relative_from_import(self):
+        node = test_utils.extract_node('from os import path  #@')
+        message = testutils.Message('no-absolute-import', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_import(node)
+
+    def test_absolute_import(self):
+        module_import = astroid.parse(
+                'from __future__ import absolute_import; import os')
+        module_from = astroid.parse(
+                'from __future__ import absolute_import; from os import path')
+        with self.assertNoMessages():
+            for module in (module_import, module_from):
+                self.walk(module)
+
+    def test_import_star_module_level(self):
+        node = test_utils.extract_node('''
+        def test():
+            from lala import * #@
+        ''')
+        absolute = testutils.Message('no-absolute-import', node=node)
+        star = testutils.Message('import-star-module-level', node=node)
+        with self.assertAddsMessages(absolute, star):
+            self.checker.visit_importfrom(node)
+
+    def test_division(self):
+        node = test_utils.extract_node('3 / 2  #@')
+        message = testutils.Message('old-division', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_binop(node)
+
+    def test_division_with_future_statement(self):
+        module = astroid.parse('from __future__ import division; 3 / 2')
+        with self.assertNoMessages():
+            self.walk(module)
+
+    def test_floor_division(self):
+        node = test_utils.extract_node(' 3 // 2  #@')
+        with self.assertNoMessages():
+            self.checker.visit_binop(node)
+
+    def test_division_by_float(self):
+        left_node = test_utils.extract_node('3.0 / 2 #@')
+        right_node = test_utils.extract_node(' 3 / 2.0  #@')
+        with self.assertNoMessages():
+            for node in (left_node, right_node):
+                self.checker.visit_binop(node)
+
+    def test_dict_iter_method(self):
+        for meth in ('keys', 'values', 'items'):
+            node = test_utils.extract_node('x.iter%s()  #@' % meth)
+            message = testutils.Message('dict-iter-method', node=node)
+            with self.assertAddsMessages(message):
+                self.checker.visit_call(node)
+
+    def test_dict_iter_method_on_dict(self):
+        node = test_utils.extract_node('{}.iterkeys()')
+        message = testutils.Message('dict-iter-method', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def test_dict_not_iter_method(self):
+        arg_node = test_utils.extract_node('x.iterkeys(x)  #@')
+        stararg_node = test_utils.extract_node('x.iterkeys(*x)  #@')
+        kwarg_node = test_utils.extract_node('x.iterkeys(y=x)  #@')
+        non_dict_node = test_utils.extract_node('x=[]\nx.iterkeys() #@')
+        with self.assertNoMessages():
+            for node in (arg_node, stararg_node, kwarg_node, non_dict_node):
+                self.checker.visit_call(node)
+
+    def test_dict_view_method(self):
+        for meth in ('keys', 'values', 'items'):
+            node = test_utils.extract_node('x.view%s()  #@' % meth)
+            message = testutils.Message('dict-view-method', node=node)
+            with self.assertAddsMessages(message):
+                self.checker.visit_call(node)
+
+    def test_dict_view_method_on_dict(self):
+        node = test_utils.extract_node('{}.viewkeys()')
+        message = testutils.Message('dict-view-method', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def test_dict_not_view_method(self):
+        arg_node = test_utils.extract_node('x.viewkeys(x)  #@')
+        stararg_node = test_utils.extract_node('x.viewkeys(*x)  #@')
+        kwarg_node = test_utils.extract_node('x.viewkeys(y=x)  #@')
+        non_dict_node = test_utils.extract_node('x=[]\nx.viewkeys() #@')
+        with self.assertNoMessages():
+            for node in (arg_node, stararg_node, kwarg_node, non_dict_node):
+                self.checker.visit_call(node)
+
+    def test_next_method(self):
+        node = test_utils.extract_node('x.next()  #@')
+        message = testutils.Message('next-method-called', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_call(node)
+
+    def test_not_next_method(self):
+        arg_node = test_utils.extract_node('x.next(x)  #@')
+        stararg_node = test_utils.extract_node('x.next(*x)  #@')
+        kwarg_node = test_utils.extract_node('x.next(y=x)  #@')
+        with self.assertNoMessages():
+            for node in (arg_node, stararg_node, kwarg_node):
+                self.checker.visit_call(node)
+
+    def test_metaclass_assignment(self):
+        node = test_utils.extract_node("""
+            class Foo(object):  #@
+                __metaclass__ = type""")
+        message = testutils.Message('metaclass-assignment', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_classdef(node)
+
+    def test_metaclass_global_assignment(self):
+        module = astroid.parse('__metaclass__ = type')
+        with self.assertNoMessages():
+            self.walk(module)
+
+    @python2_only
+    def test_parameter_unpacking(self):
+        node = test_utils.extract_node('def func((a, b)):#@\n pass')
+        arg = node.args.args[0]
+        with self.assertAddsMessages(testutils.Message('parameter-unpacking', node=arg)):
+            self.checker.visit_arguments(node.args)
+
+    @python2_only
+    def test_old_raise_syntax(self):
+        node = test_utils.extract_node('raise Exception, "test"')
+        message = testutils.Message('old-raise-syntax', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_raise(node)
+
+    @python2_only
+    def test_raising_string(self):
+        node = test_utils.extract_node('raise "Test"')
+        message = testutils.Message('raising-string', node=node)
+        with self.assertAddsMessages(message):
+            self.checker.visit_raise(node)
+
+    @python2_only
+    def test_checker_disabled_by_default(self):
+        node = astroid.parse(textwrap.dedent("""
+        abc = 1l
+        raise Exception, "test"
+        raise "test"
+        `abc`
+        """))
+        with self.assertNoMessages():
+            self.walk(node)
+
+    def test_using_cmp_argument(self):
+        nodes = test_utils.extract_node("""
+        [].sort(cmp=lambda x: x) #@
+        a = list(range(x))
+        a.sort(cmp=lambda x: x) #@
+
+        sorted([], cmp=lambda x: x) #@
+        """)
+        for node in nodes:
+            message = testutils.Message('using-cmp-argument', node=node)
+            with self.assertAddsMessages(message):
+                self.checker.visit_call(node)
+
+
+@python2_only
+class Python3TokenCheckerTest(testutils.CheckerTestCase):
+
+    CHECKER_CLASS = checker.Python3TokenChecker
+
+    def _test_token_message(self, code, symbolic_message):
+        tokens = testutils.tokenize_str(code)
+        message = testutils.Message(symbolic_message, line=1)
+        with self.assertAddsMessages(message):
+            self.checker.process_tokens(tokens)
+
+    def test_long_suffix(self):
+        for code in ("1l", "1L"):
+            self._test_token_message(code, 'long-suffix')
+
+    def test_old_ne_operator(self):
+        self._test_token_message("1 <> 2", "old-ne-operator")
+
+    def test_old_octal_literal(self):
+        for octal in ("045", "055", "075", "077", "076543"):
+            self._test_token_message(octal, "old-octal-literal")
+
+        # Make sure we are catching only octals.
+        for non_octal in ("45", "00", "085", "08", "1"):
+            tokens = testutils.tokenize_str(non_octal)
+            with self.assertNoMessages():
+                self.checker.process_tokens(tokens)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_self.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_self.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_self.py	(revision 1126)
@@ -0,0 +1,347 @@
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+import contextlib
+import json
+import re
+import sys
+import os
+from os.path import join, dirname, abspath
+import tempfile
+import textwrap
+import unittest
+
+import six
+
+from pylint.lint import Run
+from pylint import __pkginfo__
+from pylint.reporters import BaseReporter
+from pylint.reporters.text import *
+from pylint.reporters.html import HTMLReporter
+from pylint.reporters.json import JSONReporter
+
+HERE = abspath(dirname(__file__))
+
+
+
+@contextlib.contextmanager
+def _patch_streams(out):
+    sys.stderr = sys.stdout = out
+    try:
+        yield
+    finally:
+        sys.stderr = sys.__stderr__
+        sys.stdout = sys.__stdout__
+
+
+class MultiReporter(BaseReporter):
+    def __init__(self, reporters):
+        self._reporters = reporters
+        self.path_strip_prefix = os.getcwd() + os.sep
+
+    def on_set_current_module(self, *args, **kwargs):
+        for rep in self._reporters:
+            rep.on_set_current_module(*args, **kwargs)
+
+    def handle_message(self, msg):
+        for rep in self._reporters:
+            rep.handle_message(msg)
+
+    def display_reports(self, layout):
+        pass
+
+    @property
+    def out(self):
+        return self._reporters[0].out
+
+    @property
+    def linter(self):
+        return self._linter
+
+    @linter.setter
+    def linter(self, value):
+        self._linter = value
+        for rep in self._reporters:
+            rep.linter = value
+
+
+class RunTC(unittest.TestCase):
+
+    def _runtest(self, args, reporter=None, out=None, code=28):
+        if out is None:
+            out = six.StringIO()
+        pylint_code = self._run_pylint(args, reporter=reporter, out=out)
+        if reporter:
+            output = reporter.out.getvalue()
+        elif hasattr(out, 'getvalue'):
+            output = out.getvalue()
+        else:
+            output = None
+        msg = 'expected output status %s, got %s' % (code, pylint_code)
+        if output is not None:
+            msg = '%s. Below pylint output: \n%s' % (msg, output)
+        self.assertEqual(pylint_code, code, msg)
+
+    def _run_pylint(self, args, out, reporter=None):
+        args = args + ['--persistent=no']
+        with _patch_streams(out):
+            with self.assertRaises(SystemExit) as cm:
+                with warnings.catch_warnings():
+                    warnings.simplefilter("ignore")
+                    Run(args, reporter=reporter)
+            return cm.exception.code
+
+    def _test_output(self, args, expected_output):
+        out = six.StringIO()
+        self._run_pylint(args, out=out)
+        actual_output = out.getvalue()
+        self.assertIn(expected_output.strip(), actual_output.strip())
+
+    def test_pkginfo(self):
+        """Make pylint check itself."""
+        self._runtest(['pylint.__pkginfo__'], reporter=TextReporter(six.StringIO()),
+                      code=0)
+
+    def test_all(self):
+        """Make pylint check itself."""
+        reporters = [
+            TextReporter(six.StringIO()),
+            HTMLReporter(six.StringIO()),
+            ColorizedTextReporter(six.StringIO()),
+            JSONReporter(six.StringIO())
+        ]
+        self._runtest(['pylint/test/functional/arguments.py'],
+                      reporter=MultiReporter(reporters), code=1)
+
+    def test_no_ext_file(self):
+        self._runtest([join(HERE, 'input', 'noext')], code=0)
+
+    def test_w0704_ignored(self):
+        self._runtest([join(HERE, 'input', 'ignore_except_pass_by_default.py')], code=0)
+
+    def test_generate_config_option(self):
+        self._runtest(['--generate-rcfile'], code=0)
+
+    def test_generate_config_disable_symbolic_names(self):
+        # Test that --generate-rcfile puts symbolic names in the --disable
+        # option.
+
+        out = six.StringIO()
+        self._run_pylint(["--generate-rcfile", "--rcfile="], out=out)
+
+        output = out.getvalue()
+        # Get rid of the pesky messages that pylint emits if the
+        # configuration file is not found.
+        master = re.search("\[MASTER", output)        
+        out = six.StringIO(output[master.start():])
+        parser = six.moves.configparser.RawConfigParser()
+        parser.readfp(out)
+        messages = parser.get('MESSAGES CONTROL', 'disable').split(",")
+        self.assertIn('suppressed-message', messages)
+
+    def test_generate_rcfile_no_obsolete_methods(self):
+        out = six.StringIO()
+        self._run_pylint(["--generate-rcfile"], out=out)
+        output = out.getvalue()
+        self.assertNotIn("profile", output)
+
+    def _test_deprecated_options(self, option, expected):
+        out = six.StringIO()
+        self._run_pylint([option, "--rcfile=", "pylint.config"], out=out)
+        output = out.getvalue()
+        if __pkginfo__.numversion >= (1, 6, 0):
+            self.assertIn("no such option", output)
+        else:
+            self.assertIn(expected, output)
+
+    def test_deprecated_options_zope(self):
+        expected = ("option --zope is obsolete and it is "
+                    "slated for removal in Pylint 1.6")
+        self._test_deprecated_options("--zope=y", expected)
+
+    def test_deprecated_options_symbols(self):
+        expected = ("option --symbols is obsolete and it is "
+                    "slated for removal in Pylint 1.6")
+        self._test_deprecated_options("--symbols=y", expected)
+
+    def test_deprecated_options_include_ids(self):
+        expected = ("option --include-ids is obsolete and it is "
+                    "slated for removal in Pylint 1.6")
+        self._test_deprecated_options("--include-ids=y", expected)
+
+    def test_deprecated_options_profile(self):
+        expected = ("option --profile is obsolete and it is "
+                    "slated for removal in Pylint 1.6")
+        self._test_deprecated_options("--profile=y", expected)
+
+    def test_help_message_option(self):
+        self._runtest(['--help-msg', 'W0101'], code=0)
+
+    def test_error_help_message_option(self):
+        self._runtest(['--help-msg', 'WX101'], code=0)
+
+    def test_error_missing_arguments(self):
+        self._runtest([], code=32)
+
+    def test_no_out_encoding(self):
+        """test redirection of stdout with non ascii caracters
+        """
+        #This test reproduces bug #48066 ; it happens when stdout is redirected
+        # through '>' : the sys.stdout.encoding becomes then None, and if the
+        # output contains non ascii, pylint will crash
+        if sys.version_info < (3, 0):
+            strio = tempfile.TemporaryFile()
+        else:
+            strio = six.StringIO()
+        assert strio.encoding is None
+        self._runtest([join(HERE, 'regrtest_data/no_stdout_encoding.py')],
+                      out=strio)
+
+    def test_parallel_execution(self):
+        self._runtest(['-j 2', 'pylint/test/functional/arguments.py',
+                       'pylint/test/functional/bad_continuation.py'], code=1)
+
+    def test_parallel_execution_missing_arguments(self):
+        self._runtest(['-j 2', 'not_here', 'not_here_too'], code=1)
+
+    def test_py3k_option(self):
+        # Test that --py3k flag works.
+        rc_code = 2 if six.PY2 else 0
+        self._runtest([join(HERE, 'functional', 'unpacked_exceptions.py'),
+                       '--py3k'],
+                      code=rc_code)
+
+    def test_py3k_jobs_option(self):
+        rc_code = 2 if six.PY2 else 0
+        self._runtest([join(HERE, 'functional', 'unpacked_exceptions.py'),
+                       '--py3k', '-j 2'],
+                      code=rc_code)
+
+    @unittest.skipIf(sys.version_info[0] > 2, "Requires the --py3k flag.")
+    def test_py3k_commutative_with_errors_only(self):
+
+        # Test what gets emitted with -E only
+        module = join(HERE, 'regrtest_data', 'py3k_error_flag.py')
+        expected = textwrap.dedent("""
+        No config file found, using default configuration
+        ************* Module py3k_error_flag
+        Explicit return in __init__
+        """)
+        self._test_output([module, "-E", "--msg-template='{msg}'"],
+                          expected_output=expected)
+
+        # Test what gets emitted with -E --py3k
+        expected = textwrap.dedent("""
+        No config file found, using default configuration
+        ************* Module py3k_error_flag
+        Use raise ErrorClass(args) instead of raise ErrorClass, args.
+        """)
+        self._test_output([module, "-E", "--py3k", "--msg-template='{msg}'"],
+                          expected_output=expected)
+
+        # Test what gets emitted with --py3k -E
+        self._test_output([module, "--py3k", "-E", "--msg-template='{msg}'"],
+                          expected_output=expected)
+
+    def test_abbreviations_are_not_supported(self):
+        expected = "no such option: --load-plugin"
+        self._test_output([".", "--load-plugin"], expected_output=expected)
+
+    def test_enable_all_works(self):
+        module = join(HERE, 'data', 'clientmodule_test.py')
+        expected = textwrap.dedent("""
+        No config file found, using default configuration
+        ************* Module data.clientmodule_test
+        W: 10, 8: Unused variable 'local_variable' (unused-variable)
+        C: 18, 4: Missing method docstring (missing-docstring)
+        C: 22, 0: Missing class docstring (missing-docstring)
+        """)
+        self._test_output([module, "--disable=all", "--enable=all", "-rn"],
+                          expected_output=expected)
+
+    def test_html_crash_report(self):
+        out = six.StringIO()
+        module = join(HERE, 'regrtest_data', 'html_crash_420.py')
+        self._runtest([module], code=16, reporter=HTMLReporter(out))
+
+    def test_wrong_import_position_when_others_disabled(self):
+        expected_output = textwrap.dedent('''
+        No config file found, using default configuration
+        ************* Module wrong_import_position
+        C: 11, 0: Import "import os" should be placed at the top of the module (wrong-import-position)
+        ''')
+        module1 = join(HERE, 'regrtest_data', 'import_something.py')
+        module2 = join(HERE, 'regrtest_data', 'wrong_import_position.py')
+        args = [module2, module1,
+                "--disable=all", "--enable=wrong-import-position",
+                "-rn"]
+        out = six.StringIO()
+        self._run_pylint(args, out=out)
+        actual_output = out.getvalue()
+        self.assertEqual(expected_output.strip(), actual_output.strip())
+
+    def test_import_itself_not_accounted_for_relative_imports(self):
+        expected = 'No config file found, using default configuration'
+        package = join(HERE, 'regrtest_data', 'dummy')
+        self._test_output([package, '--disable=locally-disabled', '-rn'],
+                          expected_output=expected)
+                           
+
+    def test_json_report_when_file_has_syntax_error(self):
+        out = six.StringIO()
+        module = join(HERE, 'regrtest_data', 'syntax_error.py')
+        self._runtest([module], code=2, reporter=JSONReporter(out))
+        output = json.loads(out.getvalue())
+        self.assertIsInstance(output, list)
+        self.assertEqual(len(output), 1)
+        self.assertIsInstance(output[0], dict)
+        expected = {
+            "obj": "",
+            "column": 0,
+            "line": 1,
+            "type": "error",
+            "symbol": "syntax-error",
+            "module": "syntax_error"
+        }
+        message = output[0]
+        for key, value in expected.items():
+            self.assertIn(key, message)
+            self.assertEqual(message[key], value)
+        self.assertIn("invalid syntax", message["message"].lower())
+
+    def test_json_report_when_file_is_missing(self):
+        out = six.StringIO()
+        module = join(HERE, 'regrtest_data', 'totally_missing.py')
+        self._runtest([module], code=1, reporter=JSONReporter(out))
+        output = json.loads(out.getvalue())
+        self.assertIsInstance(output, list)
+        self.assertEqual(len(output), 1)
+        self.assertIsInstance(output[0], dict)
+        expected = {
+            "obj": "",
+            "column": 0,
+            "line": 1,
+            "type": "fatal",
+            "symbol": "fatal",
+            "module": module
+        }
+        message = output[0]
+        for key, value in expected.items():
+            self.assertIn(key, message)
+            self.assertEqual(message[key], value)
+        self.assertTrue(message['message'].startswith("No module named"))
+
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_import_graph.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_import_graph.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_import_graph.py	(revision 1126)
@@ -0,0 +1,68 @@
+import sys
+import os
+from os.path import exists
+import unittest
+
+import six
+
+from pylint.checkers import initialize, imports
+from pylint.lint import PyLinter
+
+from pylint.testutils import TestReporter
+
+class DependenciesGraphTC(unittest.TestCase):
+    """test the imports graph function"""
+
+    dest = 'dependencies_graph.dot'
+    def tearDown(self):
+        os.remove(self.dest)
+
+    def test_dependencies_graph(self):
+        imports._dependencies_graph(self.dest, {'labas': ['hoho', 'yep'],
+                                                'hoho': ['yep']})
+        with open(self.dest) as stream:
+            self.assertEqual(stream.read().strip(),
+                          '''
+digraph "dependencies_graph" {
+rankdir=LR
+charset="utf-8"
+URL="." node[shape="box"]
+"hoho" [];
+"yep" [];
+"labas" [];
+"yep" -> "hoho" [];
+"hoho" -> "labas" [];
+"yep" -> "labas" [];
+}
+'''.strip())
+
+class ImportCheckerTC(unittest.TestCase):
+    def setUp(self):
+        self.linter = l = PyLinter(reporter=TestReporter())
+        initialize(l)
+
+    def test_checker_dep_graphs(self):
+        l = self.linter
+        l.global_set_option('persistent', False)
+        l.global_set_option('enable', 'imports')
+        l.global_set_option('import-graph', 'import.dot')
+        l.global_set_option('ext-import-graph', 'ext_import.dot')
+        l.global_set_option('int-import-graph', 'int_import.dot')
+        l.global_set_option('int-import-graph', 'int_import.dot')
+        # ignore this file causing spurious MemoryError w/ some python version (>=2.3?)
+        l.global_set_option('ignore', ('func_unknown_encoding.py',))
+        try:
+            l.check('input')
+            l.generate_reports()
+            self.assertTrue(exists('import.dot'))
+            self.assertTrue(exists('ext_import.dot'))
+            self.assertTrue(exists('int_import.dot'))
+        finally:
+            for fname in ('import.dot', 'ext_import.dot', 'int_import.dot'):
+                try:
+                    os.remove(fname)
+                except:
+                    pass
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_regr.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_regr.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_regr.py	(revision 1126)
@@ -0,0 +1,149 @@
+# Copyright (c) 2005-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""non regression tests for pylint, which requires a too specific configuration
+to be incorporated in the automatic functional test framework
+"""
+
+import sys
+import platform
+import os
+from os.path import abspath, dirname, join
+import unittest
+
+from pylint.testutils import TestReporter
+from pylint.lint import PyLinter
+from pylint import checkers
+
+test_reporter = TestReporter()
+linter = PyLinter()
+linter.set_reporter(test_reporter)
+linter.disable('I')
+linter.config.persistent = 0
+checkers.initialize(linter)
+
+REGR_DATA = join(dirname(abspath(__file__)), 'regrtest_data')
+sys.path.insert(1, REGR_DATA)
+
+class NonRegrTC(unittest.TestCase):
+    def setUp(self):
+        """call reporter.finalize() to cleanup
+        pending messages if a test finished badly
+        """
+        linter.reporter.finalize()
+
+    def test_package___path___manipulation(self):
+        linter.check('package.__init__')
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, '')
+
+    def test_package___init___precedence(self):
+        linter.check('precedence_test')
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, '')
+
+    def test_check_package___init__(self):
+        for variation in ('package.__init__', join(REGR_DATA, 'package', '__init__.py')):
+            linter.check(variation)
+            got = linter.reporter.finalize().strip()
+            checked = list(linter.stats['by_module'].keys())
+            self.assertEqual(checked, ['package.__init__'],
+                             '%s: %s' % (variation, checked))
+        cwd = os.getcwd()
+        os.chdir(join(REGR_DATA, 'package'))
+        sys.path.insert(0, '')
+        try:
+            for variation in ('__init__', '__init__.py'):
+                linter.check(variation)
+                got = linter.reporter.finalize().strip()
+                checked = list(linter.stats['by_module'].keys())
+                self.assertEqual(checked, ['__init__'],
+                                 '%s: %s' % (variation, checked))
+        finally:
+            sys.path.pop(0)
+            os.chdir(cwd)
+
+    def test_numarray_inference(self):
+        try:
+            from numarray import random_array
+        except ImportError:
+            self.skipTest('test skipped: numarray.random_array is not available')
+        linter.check(join(REGR_DATA, 'numarray_inf.py'))
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, "E:  5: Instance of 'int' has no 'astype' member (but some types could not be inferred)")
+
+    def test_numarray_import(self):
+        try:
+            import numarray
+        except ImportError:
+            self.skipTest('test skipped: numarray is not available')
+        linter.check(join(REGR_DATA, 'numarray_import.py'))
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, '')
+
+    def test_class__doc__usage(self):
+        linter.check(join(REGR_DATA, 'classdoc_usage.py'))
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, '')
+
+    def test_package_import_relative_subpackage_no_attribute_error(self):
+        linter.check('import_package_subpackage_module')
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, '')
+
+    def test_import_assign_crash(self):
+        linter.check(join(REGR_DATA, 'import_assign.py'))
+
+    def test_special_attr_scope_lookup_crash(self):
+        linter.check(join(REGR_DATA, 'special_attr_scope_lookup_crash.py'))
+
+    def test_module_global_crash(self):
+        linter.check(join(REGR_DATA, 'module_global.py'))
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, '')
+
+    def test_decimal_inference(self):
+        linter.check(join(REGR_DATA, 'decimal_inference.py'))
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, "")
+
+    def test_descriptor_crash(self):
+        for fname in os.listdir(REGR_DATA):
+            if fname.endswith('_crash.py'):
+                linter.check(join(REGR_DATA, fname))
+                linter.reporter.finalize().strip()
+
+    def test_try_finally_disable_msg_crash(self):
+        linter.check(join(REGR_DATA, 'try_finally_disable_msg_crash'))
+
+    def test___path__(self):
+        linter.check('pylint.checkers.__init__')
+        messages = linter.reporter.finalize().strip()
+        self.assertFalse('__path__' in messages, messages)
+
+    def test_absolute_import(self):
+        linter.check(join(REGR_DATA, 'absimp', 'string.py'))
+        got = linter.reporter.finalize().strip()
+        self.assertEqual(got, "")
+
+    def test_no_context_file(self):
+        expected = "Unused import missing"
+        linter.check(join(REGR_DATA, 'bad_package'))
+        got = linter.reporter.finalize().strip()
+        self.assertIn(expected, got)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_functional.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_functional.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/test_functional.py	(revision 1126)
@@ -0,0 +1,369 @@
+"""Functional full-module tests for PyLint."""
+import csv
+import collections
+import io
+import operator
+import os
+import re
+import sys
+import platform
+import unittest
+
+import six
+from six.moves import configparser
+
+from pylint import checkers
+from pylint import interfaces
+from pylint import lint
+from pylint import reporters
+from pylint import utils
+
+class test_dialect(csv.excel):
+    if sys.version_info[0] < 3:
+        delimiter = b':'
+        lineterminator = b'\n'
+    else:
+        delimiter = ':'
+        lineterminator = '\n'
+
+
+csv.register_dialect('test', test_dialect)
+
+
+class NoFileError(Exception):
+    pass
+
+# Notes:
+# - for the purpose of this test, the confidence levels HIGH and UNDEFINED
+#   are treated as the same.
+
+# TODOs
+#  - implement exhaustivity tests
+
+# If message files should be updated instead of checked.
+UPDATE = False
+
+class OutputLine(collections.namedtuple('OutputLine',
+                ['symbol', 'lineno', 'object', 'msg', 'confidence'])):
+    @classmethod
+    def from_msg(cls, msg):
+        return cls(
+            msg.symbol, msg.line, msg.obj or '', msg.msg.replace("\r\n", "\n"),
+            msg.confidence.name
+            if msg.confidence != interfaces.UNDEFINED else interfaces.HIGH.name)
+
+    @classmethod
+    def from_csv(cls, row):
+        confidence = row[4] if len(row) == 5 else interfaces.HIGH.name
+        return cls(row[0], int(row[1]), row[2], row[3], confidence)
+
+    def to_csv(self):
+        if self.confidence == interfaces.HIGH.name:
+            return self[:-1]
+        else:
+            return self
+
+
+# Common sub-expressions.
+_MESSAGE = {'msg': r'[a-z][a-z\-]+'}
+# Matches a #,
+#  - followed by a comparison operator and a Python version (optional),
+#  - followed by an line number with a +/- (optional),
+#  - followed by a list of bracketed message symbols.
+# Used to extract expected messages from testdata files.
+_EXPECTED_RE = re.compile(
+    r'\s*#\s*(?:(?P<line>[+-]?[0-9]+):)?'
+    r'(?:(?P<op>[><=]+) *(?P<version>[0-9.]+):)?'
+    r'\s*\[(?P<msgs>%(msg)s(?:,\s*%(msg)s)*)\]' % _MESSAGE)
+
+
+def parse_python_version(str):
+    return tuple(int(digit) for digit in str.split('.'))
+
+
+class TestReporter(reporters.BaseReporter):
+    def handle_message(self, msg):
+        self.messages.append(msg)
+
+    def on_set_current_module(self, module, filepath):
+        self.messages = []
+
+    def display_reports(self, layout):
+        """Ignore layouts."""
+
+
+class TestFile(object):
+    """A single functional test case file with options."""
+
+    _CONVERTERS = {
+        'min_pyver': parse_python_version,
+        'max_pyver': parse_python_version,
+        'requires': lambda s: s.split(',')
+    }
+
+
+    def __init__(self, directory, filename):
+        self._directory = directory
+        self.base = filename.replace('.py', '')
+        self.options = {
+            'min_pyver': (2, 5),
+            'max_pyver': (4, 0),
+            'requires': [],
+            'except_implementations': [],
+            }
+        self._parse_options()
+
+    def _parse_options(self):
+        cp = configparser.ConfigParser()
+        cp.add_section('testoptions')
+        try:
+            cp.read(self.option_file)
+        except NoFileError:
+            pass
+
+        for name, value in cp.items('testoptions'):
+            conv = self._CONVERTERS.get(name, lambda v: v)
+            self.options[name] = conv(value)
+
+    @property
+    def option_file(self):
+        return self._file_type('.rc')
+
+    @property
+    def module(self):
+        package = os.path.basename(self._directory)
+        return '.'.join([package, self.base])
+
+    @property
+    def expected_output(self):
+        return self._file_type('.txt', check_exists=False)
+
+    @property
+    def source(self):
+        return self._file_type('.py')
+
+    def _file_type(self, ext, check_exists=True):
+        name = os.path.join(self._directory, self.base + ext)
+        if not check_exists or os.path.exists(name):
+            return name
+        else:
+            raise NoFileError
+
+
+_OPERATORS = {
+    '>': operator.gt,
+    '<': operator.lt,
+    '>=': operator.ge,
+    '<=': operator.le,
+}
+
+def parse_expected_output(stream):
+    return [OutputLine.from_csv(row) for row in csv.reader(stream, 'test')]
+
+
+def get_expected_messages(stream):
+    """Parses a file and get expected messages.
+
+    :param stream: File-like input stream.
+    :returns: A dict mapping line,msg-symbol tuples to the count on this line.
+    """
+    messages = collections.Counter()
+    for i, line in enumerate(stream):
+        match = _EXPECTED_RE.search(line)
+        if match is None:
+            continue
+        line = match.group('line')
+        if line is None:
+            line = i + 1
+        elif line.startswith('+') or line.startswith('-'):
+            line = i + 1 + int(line)
+        else:
+            line = int(line)
+
+        version = match.group('version')
+        op = match.group('op')
+        if version:
+            required = parse_python_version(version)
+            if not _OPERATORS[op](sys.version_info, required):
+                continue
+
+        for msg_id in match.group('msgs').split(','):
+            messages[line, msg_id.strip()] += 1
+    return messages
+
+
+def multiset_difference(left_op, right_op):
+    """Takes two multisets and compares them.
+
+    A multiset is a dict with the cardinality of the key as the value.
+
+    :param left_op: The expected entries.
+    :param right_op: Actual entries.
+
+    :returns: The two multisets of missing and unexpected messages.
+    """
+    missing = left_op.copy()
+    missing.subtract(right_op)
+    unexpected = {}
+    for key, value in list(six.iteritems(missing)):
+        if value <= 0:
+            missing.pop(key)
+            if value < 0:
+                unexpected[key] = -value
+    return missing, unexpected
+
+
+class LintModuleTest(unittest.TestCase):
+    maxDiff = None
+
+    def __init__(self, test_file):
+        super(LintModuleTest, self).__init__('_runTest')
+        test_reporter = TestReporter()
+        self._linter = lint.PyLinter()
+        self._linter.set_reporter(test_reporter)
+        self._linter.config.persistent = 0
+        checkers.initialize(self._linter)
+        self._linter.disable('I')
+        try:
+            self._linter.read_config_file(test_file.option_file)
+            self._linter.load_config_file()
+        except NoFileError:
+            pass
+        self._test_file = test_file
+
+    def setUp(self):
+        if (sys.version_info < self._test_file.options['min_pyver']
+                or sys.version_info >= self._test_file.options['max_pyver']):
+            self.skipTest(
+                'Test cannot run with Python %s.' % (sys.version.split(' ')[0],))
+        missing = []
+        for req in self._test_file.options['requires']:
+            try:
+                __import__(req)
+            except ImportError:
+                missing.append(req)
+        if missing:
+            self.skipTest('Requires %s to be present.' % (','.join(missing),))
+        if self._test_file.options['except_implementations']:
+            implementations = [
+                item.strip() for item in
+                self._test_file.options['except_implementations'].split(",")
+            ]
+            implementation = platform.python_implementation()
+            if implementation in implementations:
+                self.skipTest(
+                    'Test cannot run with Python implementation %r'
+                     % (implementation, ))
+
+    def __str__(self):
+        return "%s (%s.%s)" % (self._test_file.base, self.__class__.__module__,
+                               self.__class__.__name__)
+
+    def _open_expected_file(self):
+        return open(self._test_file.expected_output)
+
+    def _open_source_file(self):
+        if self._test_file.base == "invalid_encoded_data":
+            return open(self._test_file.source)
+        else:
+            return io.open(self._test_file.source, encoding="utf8")
+
+    def _get_expected(self):
+        with self._open_source_file() as fobj:
+            expected_msgs = get_expected_messages(fobj)
+
+        if expected_msgs:
+            with self._open_expected_file() as fobj:
+                expected_output_lines = parse_expected_output(fobj)
+        else:
+            expected_output_lines = []
+        return expected_msgs, expected_output_lines
+
+    def _get_received(self):
+        messages = self._linter.reporter.messages
+        messages.sort(key=lambda m: (m.line, m.symbol, m.msg))
+        received_msgs = collections.Counter()
+        received_output_lines = []
+        for msg in messages:
+            received_msgs[msg.line, msg.symbol] += 1
+            received_output_lines.append(OutputLine.from_msg(msg))
+        return received_msgs, received_output_lines
+
+    def _runTest(self):
+        self._linter.check([self._test_file.module])
+
+        expected_messages, expected_text = self._get_expected()
+        received_messages, received_text = self._get_received()
+
+        if expected_messages != received_messages:
+            msg = ['Wrong results for file "%s":' % (self._test_file.base)]
+            missing, unexpected = multiset_difference(expected_messages,
+                                                      received_messages)
+            if missing:
+                msg.append('\nExpected in testdata:')
+                msg.extend(' %3d: %s' % msg for msg in sorted(missing))
+            if unexpected:
+                msg.append('\nUnexpected in testdata:')
+                msg.extend(' %3d: %s' % msg for msg in sorted(unexpected))
+            self.fail('\n'.join(msg))
+        self._check_output_text(expected_messages, expected_text, received_text)
+
+    def _split_lines(self, expected_messages, lines):
+        emitted, omitted = [], []
+        for msg in lines:
+            if (msg[1], msg[0]) in expected_messages:
+                emitted.append(msg)
+            else:
+                omitted.append(msg)
+        return emitted, omitted
+
+    def _check_output_text(self, expected_messages, expected_lines,
+                           received_lines):
+        self.assertSequenceEqual(
+            self._split_lines(expected_messages, expected_lines)[0],
+            received_lines)
+
+
+class LintModuleOutputUpdate(LintModuleTest):
+    def _open_expected_file(self):
+        try:
+            return super(LintModuleOutputUpdate, self)._open_expected_file()
+        except IOError:
+            return io.StringIO()
+
+    def _check_output_text(self, expected_messages, expected_lines,
+                           received_lines):
+        if not expected_messages:
+            return
+        emitted, remaining = self._split_lines(expected_messages, expected_lines)
+        if emitted != received_lines:
+            remaining.extend(received_lines)
+            remaining.sort(key=lambda m: (m[1], m[0], m[3]))
+            with open(self._test_file.expected_output, 'w') as fobj:
+                writer = csv.writer(fobj, dialect='test')
+                for line in remaining:
+                    writer.writerow(line.to_csv())
+
+def suite():
+    input_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+                             'functional')
+    suite = unittest.TestSuite()
+    for fname in os.listdir(input_dir):
+        if fname != '__init__.py' and fname.endswith('.py'):
+            test_file = TestFile(input_dir, fname)
+            if UPDATE:
+                suite.addTest(LintModuleOutputUpdate(test_file))
+            else:
+                suite.addTest(LintModuleTest(test_file))
+    return suite
+
+
+def load_tests(loader, tests, pattern):
+    return suite()
+
+
+if __name__=='__main__':
+    if '-u' in sys.argv:
+        UPDATE = True
+        sys.argv.remove('-u')
+    unittest.main(defaultTest='suite')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_typecheck.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_typecheck.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_typecheck.py	(revision 1126)
@@ -0,0 +1,94 @@
+"""Unittest for the type checker."""
+import unittest
+
+from astroid import test_utils
+from pylint.checkers import typecheck
+from pylint.testutils import CheckerTestCase, Message, set_config
+
+
+class TypeCheckerTest(CheckerTestCase):
+    "Tests for pylint.checkers.typecheck"
+    CHECKER_CLASS = typecheck.TypeChecker
+
+    def test_no_member_in_getattr(self):
+        """Make sure that a module attribute access is checked by pylint.
+        """
+
+        node = test_utils.extract_node("""
+        import optparse
+        optparse.THIS_does_not_EXIST 
+        """)
+        with self.assertAddsMessages(
+                Message(
+                    'no-member',
+                    node=node,
+                    args=('Module', 'optparse', 'THIS_does_not_EXIST'))):
+            self.checker.visit_attribute(node)
+
+    @set_config(ignored_modules=('argparse',))
+    def test_no_member_in_getattr_ignored(self):
+        """Make sure that a module attribute access check is omitted with a
+        module that is configured to be ignored.
+        """
+
+        node = test_utils.extract_node("""
+        import argparse
+        argparse.THIS_does_not_EXIST
+        """)
+        with self.assertNoMessages():
+            self.checker.visit_attribute(node)
+
+    @set_config(ignored_classes=('xml.etree.', ))
+    def test_ignored_modules_invalid_pattern(self):
+        node = test_utils.extract_node('''
+        import xml
+        xml.etree.Lala
+        ''')
+        message = Message('no-member', node=node,
+                          args=('Module', 'xml.etree', 'Lala'))
+        with self.assertAddsMessages(message):
+            self.checker.visit_attribute(node)
+
+    @set_config(ignored_modules=('xml.etree*', ))
+    def test_ignored_modules_patterns(self):
+        node = test_utils.extract_node('''
+        import xml
+        xml.etree.portocola #@
+        ''')
+        with self.assertNoMessages():
+            self.checker.visit_attribute(node)
+
+    @set_config(ignored_classes=('xml.*', ))
+    def test_ignored_classes_no_recursive_pattern(self):
+        node = test_utils.extract_node('''
+        import xml
+        xml.etree.ElementTree.Test
+        ''')
+        message = Message('no-member', node=node,
+                          args=('Module', 'xml.etree.ElementTree', 'Test'))
+        with self.assertAddsMessages(message):
+            self.checker.visit_attribute(node)
+
+    @set_config(ignored_classes=('optparse.Values', ))
+    def test_ignored_classes_qualified_name(self):
+        """Test that ignored-classes supports qualified name for ignoring."""
+        node = test_utils.extract_node('''
+        import optparse
+        optparse.Values.lala
+        ''')
+        with self.assertNoMessages():
+            self.checker.visit_attribute(node)
+
+    @set_config(ignored_classes=('Values', ))
+    def test_ignored_classes_only_name(self):
+        """Test that ignored_classes works with the name only."""
+        node = test_utils.extract_node('''
+        import optparse
+        optparse.Values.lala
+        ''')
+        with self.assertNoMessages():
+            self.checker.visit_attribute(node)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_stdlib.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_stdlib.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_checker_stdlib.py	(revision 1126)
@@ -0,0 +1,65 @@
+# Copyright (c) 2003-2015 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+import contextlib
+import unittest
+
+import astroid
+from astroid import test_utils
+
+from pylint.checkers import stdlib
+from pylint.testutils import CheckerTestCase
+
+
+@contextlib.contextmanager
+def _add_transform(manager, node, transform, predicate=None):
+    manager.register_transform(node, transform, predicate)
+    try:
+        yield
+    finally:
+        manager.unregister_transform(node, transform, predicate)
+
+
+class StdlibCheckerTest(CheckerTestCase):
+    CHECKER_CLASS = stdlib.StdlibChecker
+
+    def test_deprecated_no_qname_on_unexpected_nodes(self):
+        # Test that we don't crash on nodes which don't have
+        # a qname method. While this test might seem weird since
+        # it uses a transform, it's actually testing a crash that
+        # happened in production, but there was no way to retrieve
+        # the code for which this occurred (how an AssignAttr
+        # got to be the result of a function inference
+        # beats me..)
+
+        def infer_func(node, context=None):
+            new_node = astroid.AssignAttr()
+            new_node.parent = node
+            yield new_node
+
+        manager = astroid.MANAGER
+        transform = astroid.inference_tip(infer_func)
+        with _add_transform(manager, astroid.Name, transform):
+            node = test_utils.extract_node('''
+            call_something()
+            ''')
+            with self.assertNoMessages():
+                self.checker.visit_call(node)
+ 
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_lint.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_lint.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/test/unittest_lint.py	(revision 1126)
@@ -0,0 +1,691 @@
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+from contextlib import contextmanager
+import sys
+import os
+import tempfile
+from shutil import rmtree
+from os import getcwd, chdir
+from os.path import join, basename, dirname, isdir, abspath, sep
+import unittest
+
+import six
+from six.moves import reload_module
+
+from pylint import config, lint
+from pylint.lint import PyLinter, Run, preprocess_options, \
+     ArgumentPreprocessingError
+from pylint.utils import MSG_STATE_SCOPE_CONFIG, MSG_STATE_SCOPE_MODULE, MSG_STATE_CONFIDENCE, \
+    MessagesStore, PyLintASTWalker, MessageDefinition, FileState, \
+    build_message_def, tokenize_module, UnknownMessage
+from pylint.testutils import TestReporter
+from pylint.reporters import text, html
+from pylint import checkers
+from pylint.checkers.utils import check_messages
+from pylint import interfaces
+
+if os.name == 'java':
+    if os._name == 'nt':
+        HOME = 'USERPROFILE'
+    else:
+        HOME = 'HOME'
+else:
+    if sys.platform == 'win32':
+        HOME = 'USERPROFILE'
+    else:
+        HOME = 'HOME'
+
+@contextmanager
+def fake_home():
+    folder = tempfile.mkdtemp('fake-home')
+    old_home = os.environ.get(HOME)
+    try:
+        os.environ[HOME] = folder
+        yield
+    finally:
+        os.environ.pop('PYLINTRC', '')
+        if old_home is None:
+            del os.environ[HOME]
+        else:
+            os.environ[HOME] = old_home
+        rmtree(folder, ignore_errors=True)
+
+def remove(file):
+    try:
+        os.remove(file)
+    except OSError:
+        pass
+
+HERE = abspath(dirname(__file__))
+INPUTDIR = join(HERE, 'input')
+
+
+@contextmanager
+def tempdir():
+    """Create a temp directory and change the current location to it.
+
+    This is supposed to be used with a *with* statement.
+    """
+    tmp = tempfile.mkdtemp()
+
+    # Get real path of tempfile, otherwise test fail on mac os x
+    current_dir = getcwd()
+    chdir(tmp)
+    abs_tmp = abspath('.')
+
+    try:
+        yield abs_tmp
+    finally:
+        chdir(current_dir)
+        rmtree(abs_tmp)
+
+
+def create_files(paths, chroot='.'):
+    """Creates directories and files found in <path>.
+
+    :param paths: list of relative paths to files or directories
+    :param chroot: the root directory in which paths will be created
+
+    >>> from os.path import isdir, isfile
+    >>> isdir('/tmp/a')
+    False
+    >>> create_files(['a/b/foo.py', 'a/b/c/', 'a/b/c/d/e.py'], '/tmp')
+    >>> isdir('/tmp/a')
+    True
+    >>> isdir('/tmp/a/b/c')
+    True
+    >>> isfile('/tmp/a/b/c/d/e.py')
+    True
+    >>> isfile('/tmp/a/b/foo.py')
+    True
+    """
+    dirs, files = set(), set()
+    for path in paths:
+        path = join(chroot, path)
+        filename = basename(path)
+        # path is a directory path
+        if filename == '':
+            dirs.add(path)
+        # path is a filename path
+        else:
+            dirs.add(dirname(path))
+            files.add(path)
+    for dirpath in dirs:
+        if not isdir(dirpath):
+            os.makedirs(dirpath)
+    for filepath in files:
+        open(filepath, 'w').close()
+
+
+class SysPathFixupTC(unittest.TestCase):
+    def setUp(self):
+        self.orig = list(sys.path)
+        self.fake = [1, 2, 3]
+        sys.path[:] = self.fake
+
+    def tearDown(self):
+        sys.path[:] = self.orig
+
+    def test_no_args(self):
+        with lint.fix_import_path([]):
+            self.assertEqual(sys.path, self.fake)
+        self.assertEqual(sys.path, self.fake)
+
+    def test_one_arg(self):
+        with tempdir() as chroot:
+            create_files(['a/b/__init__.py'])
+            expected = [join(chroot, 'a')] + self.fake
+
+            cases = (
+                ['a/b/'],
+                ['a/b'],
+                ['a/b/__init__.py'],
+                ['a/'],
+                ['a'],
+            )
+
+            self.assertEqual(sys.path, self.fake)
+            for case in cases:
+                with lint.fix_import_path(case):
+                    self.assertEqual(sys.path, expected)
+                self.assertEqual(sys.path, self.fake)
+
+    def test_two_similar_args(self):
+        with tempdir() as chroot:
+            create_files(['a/b/__init__.py', 'a/c/__init__.py'])
+            expected = [join(chroot, 'a')] + self.fake
+
+            cases = (
+                ['a/b', 'a/c'],
+                ['a/c/', 'a/b/'],
+                ['a/b/__init__.py', 'a/c/__init__.py'],
+                ['a', 'a/c/__init__.py'],
+            )
+
+            self.assertEqual(sys.path, self.fake)
+            for case in cases:
+                with lint.fix_import_path(case):
+                    self.assertEqual(sys.path, expected)
+                self.assertEqual(sys.path, self.fake)
+
+    def test_more_args(self):
+        with tempdir() as chroot:
+            create_files(['a/b/c/__init__.py', 'a/d/__init__.py', 'a/e/f.py'])
+            expected = [
+                join(chroot, suffix)
+                for suffix in [sep.join(('a', 'b')), 'a', sep.join(('a', 'e'))]
+            ] + self.fake
+
+            cases = (
+                ['a/b/c/__init__.py', 'a/d/__init__.py', 'a/e/f.py'],
+                ['a/b/c', 'a', 'a/e'],
+                ['a/b/c', 'a', 'a/b/c', 'a/e', 'a'],
+            )
+
+            self.assertEqual(sys.path, self.fake)
+            for case in cases:
+                with lint.fix_import_path(case):
+                    self.assertEqual(sys.path, expected)
+                self.assertEqual(sys.path, self.fake)
+
+
+class PyLinterTC(unittest.TestCase):
+
+    def setUp(self):
+        self.linter = PyLinter()
+        self.linter.disable('I')
+        self.linter.config.persistent = 0
+        # register checkers
+        checkers.initialize(self.linter)
+        self.linter.set_reporter(TestReporter())
+
+    def init_linter(self):
+        linter = self.linter
+        linter.open()
+        linter.set_current_module('toto')
+        linter.file_state = FileState('toto')
+        return linter
+
+    def test_pylint_visit_method_taken_in_account(self):
+        class CustomChecker(checkers.BaseChecker):
+            __implements__ = interfaces.IAstroidChecker
+            name = 'custom'
+            msgs = {'W9999': ('', 'custom', '')}
+
+            @check_messages('custom')
+            def visit_class(self, _):
+               pass
+
+        self.linter.register_checker(CustomChecker(self.linter))
+        self.linter.open()
+        out = six.moves.StringIO()
+        self.linter.set_reporter(text.TextReporter(out))
+        self.linter.check('abc')
+
+    def test_enable_message(self):
+        linter = self.init_linter()
+        self.assertTrue(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('W0102'))
+        linter.disable('W0101', scope='package')
+        linter.disable('W0102', scope='module', line=1)
+        self.assertFalse(linter.is_message_enabled('W0101'))
+        self.assertFalse(linter.is_message_enabled('W0102', 1))
+        linter.set_current_module('tutu')
+        self.assertFalse(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('W0102'))
+        linter.enable('W0101', scope='package')
+        linter.enable('W0102', scope='module', line=1)
+        self.assertTrue(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('W0102', 1))
+
+    def test_enable_message_category(self):
+        linter = self.init_linter()
+        self.assertTrue(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('C0202'))
+        linter.disable('W', scope='package')
+        linter.disable('C', scope='module', line=1)
+        self.assertFalse(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('C0202'))
+        self.assertFalse(linter.is_message_enabled('C0202', line=1))
+        linter.set_current_module('tutu')
+        self.assertFalse(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('C0202'))
+        linter.enable('W', scope='package')
+        linter.enable('C', scope='module', line=1)
+        self.assertTrue(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('C0202'))
+        self.assertTrue(linter.is_message_enabled('C0202', line=1))
+
+    def test_message_state_scope(self):
+        class FakeConfig(object):
+            confidence = ['HIGH']
+
+        linter = self.init_linter()
+        linter.disable('C0202')
+        self.assertEqual(MSG_STATE_SCOPE_CONFIG,
+                         linter.get_message_state_scope('C0202'))
+        linter.disable('W0101', scope='module', line=3)
+        self.assertEqual(MSG_STATE_SCOPE_CONFIG,
+                         linter.get_message_state_scope('C0202'))
+        self.assertEqual(MSG_STATE_SCOPE_MODULE,
+                         linter.get_message_state_scope('W0101', 3))
+        linter.enable('W0102', scope='module', line=3)
+        self.assertEqual(MSG_STATE_SCOPE_MODULE,
+                         linter.get_message_state_scope('W0102', 3))
+        linter.config = FakeConfig()
+        self.assertEqual(
+            MSG_STATE_CONFIDENCE,
+            linter.get_message_state_scope('this-is-bad',
+                                           confidence=interfaces.INFERENCE))
+
+    def test_enable_message_block(self):
+        linter = self.init_linter()
+        linter.open()
+        filepath = join(INPUTDIR, 'func_block_disable_msg.py')
+        linter.set_current_module('func_block_disable_msg')
+        astroid = linter.get_ast(filepath, 'func_block_disable_msg')
+        linter.process_tokens(tokenize_module(astroid))
+        fs = linter.file_state
+        fs.collect_block_lines(linter.msgs_store, astroid)
+        # global (module level)
+        self.assertTrue(linter.is_message_enabled('W0613'))
+        self.assertTrue(linter.is_message_enabled('E1101'))
+        # meth1
+        self.assertTrue(linter.is_message_enabled('W0613', 13))
+        # meth2
+        self.assertFalse(linter.is_message_enabled('W0613', 18))
+        # meth3
+        self.assertFalse(linter.is_message_enabled('E1101', 24))
+        self.assertTrue(linter.is_message_enabled('E1101', 26))
+        # meth4
+        self.assertFalse(linter.is_message_enabled('E1101', 32))
+        self.assertTrue(linter.is_message_enabled('E1101', 36))
+        # meth5
+        self.assertFalse(linter.is_message_enabled('E1101', 42))
+        self.assertFalse(linter.is_message_enabled('E1101', 43))
+        self.assertTrue(linter.is_message_enabled('E1101', 46))
+        self.assertFalse(linter.is_message_enabled('E1101', 49))
+        self.assertFalse(linter.is_message_enabled('E1101', 51))
+        # meth6
+        self.assertFalse(linter.is_message_enabled('E1101', 57))
+        self.assertTrue(linter.is_message_enabled('E1101', 61))
+        self.assertFalse(linter.is_message_enabled('E1101', 64))
+        self.assertFalse(linter.is_message_enabled('E1101', 66))
+
+        self.assertTrue(linter.is_message_enabled('E0602', 57))
+        self.assertTrue(linter.is_message_enabled('E0602', 61))
+        self.assertFalse(linter.is_message_enabled('E0602', 62))
+        self.assertTrue(linter.is_message_enabled('E0602', 64))
+        self.assertTrue(linter.is_message_enabled('E0602', 66))
+        # meth7
+        self.assertFalse(linter.is_message_enabled('E1101', 70))
+        self.assertTrue(linter.is_message_enabled('E1101', 72))
+        self.assertTrue(linter.is_message_enabled('E1101', 75))
+        self.assertTrue(linter.is_message_enabled('E1101', 77))
+
+        fs = linter.file_state
+        self.assertEqual(17, fs._suppression_mapping['W0613', 18])
+        self.assertEqual(30, fs._suppression_mapping['E1101', 33])
+        self.assertTrue(('E1101', 46) not in fs._suppression_mapping)
+        self.assertEqual(1, fs._suppression_mapping['C0302', 18])
+        self.assertEqual(1, fs._suppression_mapping['C0302', 50])
+        # This is tricky. While the disable in line 106 is disabling
+        # both 108 and 110, this is usually not what the user wanted.
+        # Therefore, we report the closest previous disable comment.
+        self.assertEqual(106, fs._suppression_mapping['E1101', 108])
+        self.assertEqual(109, fs._suppression_mapping['E1101', 110])
+
+    def test_enable_by_symbol(self):
+        """messages can be controlled by symbolic names.
+
+        The state is consistent across symbols and numbers.
+        """
+        linter = self.init_linter()
+        self.assertTrue(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('unreachable'))
+        self.assertTrue(linter.is_message_enabled('W0102'))
+        self.assertTrue(linter.is_message_enabled('dangerous-default-value'))
+        linter.disable('unreachable', scope='package')
+        linter.disable('dangerous-default-value', scope='module', line=1)
+        self.assertFalse(linter.is_message_enabled('W0101'))
+        self.assertFalse(linter.is_message_enabled('unreachable'))
+        self.assertFalse(linter.is_message_enabled('W0102', 1))
+        self.assertFalse(linter.is_message_enabled('dangerous-default-value', 1))
+        linter.set_current_module('tutu')
+        self.assertFalse(linter.is_message_enabled('W0101'))
+        self.assertFalse(linter.is_message_enabled('unreachable'))
+        self.assertTrue(linter.is_message_enabled('W0102'))
+        self.assertTrue(linter.is_message_enabled('dangerous-default-value'))
+        linter.enable('unreachable', scope='package')
+        linter.enable('dangerous-default-value', scope='module', line=1)
+        self.assertTrue(linter.is_message_enabled('W0101'))
+        self.assertTrue(linter.is_message_enabled('unreachable'))
+        self.assertTrue(linter.is_message_enabled('W0102', 1))
+        self.assertTrue(linter.is_message_enabled('dangerous-default-value', 1))
+
+    def test_lint_ext_module_with_file_output(self):
+        self.linter.set_reporter(text.TextReporter())
+        if sys.version_info < (3, 0):
+            strio = 'StringIO'
+        else:
+            strio = 'io'
+        self.linter.config.files_output = True
+        pylint_strio = 'pylint_%s.txt' % strio
+        files = [pylint_strio, 'pylint_global.txt']
+        for file in files:
+            self.addCleanup(remove, file)
+
+        self.linter.check(strio)
+        self.linter.generate_reports()
+        for f in files:
+            self.assertTrue(os.path.exists(f))
+
+    def test_enable_report(self):
+        self.assertEqual(self.linter.report_is_enabled('RP0001'), True)
+        self.linter.disable('RP0001')
+        self.assertEqual(self.linter.report_is_enabled('RP0001'), False)
+        self.linter.enable('RP0001')
+        self.assertEqual(self.linter.report_is_enabled('RP0001'), True)
+
+    def test_report_output_format_aliased(self):
+        text.register(self.linter)
+        self.linter.set_option('output-format', 'text')
+        self.assertEqual(self.linter.reporter.__class__.__name__, 'TextReporter')
+
+    def test_report_output_format_custom(self):
+        this_module = sys.modules[__name__]
+        class TestReporter(object):
+            pass
+        this_module.TestReporter = TestReporter
+        class_name = ".".join((this_module.__name__, 'TestReporter'))
+        self.linter.set_option('output-format', class_name)
+        self.assertEqual(self.linter.reporter.__class__.__name__, 'TestReporter')
+
+    def test_set_option_1(self):
+        linter = self.linter
+        linter.set_option('disable', 'C0111,W0234')
+        self.assertFalse(linter.is_message_enabled('C0111'))
+        self.assertFalse(linter.is_message_enabled('W0234'))
+        self.assertTrue(linter.is_message_enabled('W0113'))
+        self.assertFalse(linter.is_message_enabled('missing-docstring'))
+        self.assertFalse(linter.is_message_enabled('non-iterator-returned'))
+
+    def test_set_option_2(self):
+        linter = self.linter
+        linter.set_option('disable', ('C0111', 'W0234') )
+        self.assertFalse(linter.is_message_enabled('C0111'))
+        self.assertFalse(linter.is_message_enabled('W0234'))
+        self.assertTrue(linter.is_message_enabled('W0113'))
+        self.assertFalse(linter.is_message_enabled('missing-docstring'))
+        self.assertFalse(linter.is_message_enabled('non-iterator-returned'))
+
+    def test_enable_checkers(self):
+        self.linter.disable('design')
+        self.assertFalse('design' in [c.name for c in self.linter.prepare_checkers()])
+        self.linter.enable('design')
+        self.assertTrue('design' in [c.name for c in self.linter.prepare_checkers()])
+
+    def test_errors_only(self):
+        linter = self.linter
+        self.linter.error_mode()
+        checkers = self.linter.prepare_checkers()
+        checker_names = set(c.name for c in checkers)
+        should_not = set(('design', 'format', 'metrics',
+                      'miscellaneous', 'similarities'))
+        self.assertSetEqual(set(), should_not & checker_names)
+
+    def test_disable_similar(self):
+        self.linter.set_option('disable', 'RP0801')
+        self.linter.set_option('disable', 'R0801')
+        self.assertFalse('similarities' in [c.name for c in self.linter.prepare_checkers()])
+
+    def test_disable_alot(self):
+        """check that we disabled a lot of checkers"""
+        self.linter.set_option('reports', False)
+        self.linter.set_option('disable', 'R,C,W')
+        checker_names = [c.name for c in self.linter.prepare_checkers()]
+        for cname in  ('design', 'metrics', 'similarities'):
+            self.assertFalse(cname in checker_names, cname)
+
+    def test_addmessage(self):
+        self.linter.set_reporter(TestReporter())
+        self.linter.open()
+        self.linter.set_current_module('0123')
+        self.linter.add_message('C0301', line=1, args=(1, 2))
+        self.linter.add_message('line-too-long', line=2, args=(3, 4))
+        self.assertEqual(
+            ['C:  1: Line too long (1/2)', 'C:  2: Line too long (3/4)'],
+            self.linter.reporter.messages)
+
+    def test_init_hooks_called_before_load_plugins(self):
+        self.assertRaises(RuntimeError,
+                          Run, ['--load-plugins', 'unexistant', '--init-hook', 'raise RuntimeError'])
+        self.assertRaises(RuntimeError,
+                          Run, ['--init-hook', 'raise RuntimeError', '--load-plugins', 'unexistant'])
+
+
+    def test_analyze_explicit_script(self):
+        self.linter.set_reporter(TestReporter())
+        self.linter.check(os.path.join(os.path.dirname(__file__), 'data', 'ascript'))
+        self.assertEqual(
+            ['C:  2: Line too long (175/100)'],
+            self.linter.reporter.messages)
+
+    def test_html_reporter_missing_files(self):
+        output = six.StringIO()
+        self.linter.set_reporter(html.HTMLReporter(output))
+        self.linter.set_option('output-format', 'html')
+        self.linter.check('troppoptop.py')
+        self.linter.generate_reports()
+        value = output.getvalue()
+        self.assertIn('troppoptop.py', value)
+        self.assertIn('fatal', value)
+
+    def test_python3_checker_disabled(self):
+        checker_names = [c.name for c in self.linter.prepare_checkers()]
+        self.assertNotIn('python3', checker_names)
+
+        self.linter.set_option('enable', 'python3')
+        checker_names = [c.name for c in self.linter.prepare_checkers()]
+        self.assertIn('python3', checker_names)
+
+
+class ConfigTC(unittest.TestCase):
+
+    def setUp(self):
+        os.environ.pop('PYLINTRC', None)
+
+    def test_pylint_home(self):
+        uhome = os.path.expanduser('~')
+        if uhome == '~':
+            expected = '.pylint.d'
+        else:
+            expected = os.path.join(uhome, '.pylint.d')
+        self.assertEqual(config.PYLINT_HOME, expected)
+
+        try:
+            pylintd = join(tempfile.gettempdir(), '.pylint.d')
+            os.environ['PYLINTHOME'] = pylintd
+            try:
+                reload_module(config)
+                self.assertEqual(config.PYLINT_HOME, pylintd)
+            finally:
+                try:
+                    os.remove(pylintd)
+                except:
+                    pass
+        finally:
+            del os.environ['PYLINTHOME']
+
+    def test_pylintrc(self):
+        with fake_home():
+            try:
+                self.assertEqual(config.find_pylintrc(), None)
+                os.environ['PYLINTRC'] = join(tempfile.gettempdir(),
+                                              '.pylintrc')
+                self.assertEqual(config.find_pylintrc(), None)
+                os.environ['PYLINTRC'] = '.'
+                self.assertEqual(config.find_pylintrc(), None)
+            finally:
+                reload_module(config)
+
+    def test_pylintrc_parentdir(self):
+        with tempdir() as chroot:
+
+            create_files(['a/pylintrc', 'a/b/__init__.py', 'a/b/pylintrc',
+                          'a/b/c/__init__.py', 'a/b/c/d/__init__.py',
+                          'a/b/c/d/e/.pylintrc'])
+            with fake_home():
+                self.assertEqual(config.find_pylintrc(), None)
+            results = {'a'       : join(chroot, 'a', 'pylintrc'),
+                       'a/b'     : join(chroot, 'a', 'b', 'pylintrc'),
+                       'a/b/c'   : join(chroot, 'a', 'b', 'pylintrc'),
+                       'a/b/c/d' : join(chroot, 'a', 'b', 'pylintrc'),
+                       'a/b/c/d/e' : join(chroot, 'a', 'b', 'c', 'd', 'e', '.pylintrc'),
+                       }
+            for basedir, expected in results.items():
+                os.chdir(join(chroot, basedir))
+                self.assertEqual(config.find_pylintrc(), expected)
+
+    def test_pylintrc_parentdir_no_package(self):
+        with tempdir() as chroot:
+            with fake_home():
+                create_files(['a/pylintrc', 'a/b/pylintrc', 'a/b/c/d/__init__.py'])
+                self.assertEqual(config.find_pylintrc(), None)
+                results = {'a'       : join(chroot, 'a', 'pylintrc'),
+                           'a/b'     : join(chroot, 'a', 'b', 'pylintrc'),
+                           'a/b/c'   : None,
+                           'a/b/c/d' : None,
+                           }
+                for basedir, expected in results.items():
+                    os.chdir(join(chroot, basedir))
+                    self.assertEqual(config.find_pylintrc(), expected)
+
+
+class PreprocessOptionsTC(unittest.TestCase):
+    def _callback(self, name, value):
+        self.args.append((name, value))
+
+    def test_value_equal(self):
+        self.args = []
+        preprocess_options(['--foo', '--bar=baz', '--qu=ux'],
+                           {'foo' : (self._callback, False),
+                            'qu' : (self._callback, True)})
+        self.assertEqual(
+            [('foo', None), ('qu', 'ux')], self.args)
+
+    def test_value_space(self):
+        self.args = []
+        preprocess_options(['--qu', 'ux'],
+                           {'qu' : (self._callback, True)})
+        self.assertEqual(
+            [('qu', 'ux')], self.args)
+
+    def test_error_missing_expected_value(self):
+        self.assertRaises(
+            ArgumentPreprocessingError,
+            preprocess_options,
+            ['--foo', '--bar', '--qu=ux'],
+            {'bar' : (None, True)})
+        self.assertRaises(
+            ArgumentPreprocessingError,
+            preprocess_options,
+            ['--foo', '--bar'],
+            {'bar' : (None, True)})
+
+    def test_error_unexpected_value(self):
+        self.assertRaises(
+            ArgumentPreprocessingError,
+            preprocess_options,
+            ['--foo', '--bar=spam', '--qu=ux'],
+            {'bar' : (None, False)})
+
+
+class MessagesStoreTC(unittest.TestCase):
+    def setUp(self):
+        self.store = MessagesStore()
+        class Checker(object):
+            name = 'achecker'
+            msgs = {
+                'W1234': ('message', 'msg-symbol', 'msg description.',
+                          {'old_names': [('W0001', 'old-symbol')]}),
+                'E1234': ('Duplicate keyword argument %r in %s call',
+                          'duplicate-keyword-arg',
+                          'Used when a function call passes the same keyword argument multiple times.',
+                          {'maxversion': (2, 6)}),
+                }
+        self.store.register_messages(Checker())
+
+    def _compare_messages(self, desc, msg, checkerref=False):
+        self.assertMultiLineEqual(desc, msg.format_help(checkerref=checkerref))
+
+    def test_check_message_id(self):
+        self.assertIsInstance(self.store.check_message_id('W1234'),
+                              MessageDefinition)
+        self.assertRaises(UnknownMessage,
+                          self.store.check_message_id, 'YB12')
+
+    def test_message_help(self):
+        msg = self.store.check_message_id('W1234')
+        self._compare_messages(
+            ''':msg-symbol (W1234): *message*
+  msg description. This message belongs to the achecker checker.''',
+            msg, checkerref=True)
+        self._compare_messages(
+            ''':msg-symbol (W1234): *message*
+  msg description.''',
+            msg, checkerref=False)
+
+    def test_message_help_minmax(self):
+        # build the message manually to be python version independant
+        msg = self.store.check_message_id('E1234')
+        self._compare_messages(
+            ''':duplicate-keyword-arg (E1234): *Duplicate keyword argument %r in %s call*
+  Used when a function call passes the same keyword argument multiple times.
+  This message belongs to the achecker checker. It can't be emitted when using
+  Python >= 2.6.''',
+            msg, checkerref=True)
+        self._compare_messages(
+            ''':duplicate-keyword-arg (E1234): *Duplicate keyword argument %r in %s call*
+  Used when a function call passes the same keyword argument multiple times.
+  This message can't be emitted when using Python >= 2.6.''',
+            msg, checkerref=False)
+
+    def test_list_messages(self):
+        sys.stdout = six.StringIO()
+        try:
+            self.store.list_messages()
+            output = sys.stdout.getvalue()
+        finally:
+            sys.stdout = sys.__stdout__
+        # cursory examination of the output: we're mostly testing it completes
+        self.assertIn(':msg-symbol (W1234): *message*', output)
+
+    def test_add_renamed_message(self):
+        self.store.add_renamed_message('W1234', 'old-bad-name', 'msg-symbol')
+        self.assertEqual('msg-symbol',
+                         self.store.check_message_id('W1234').symbol)
+        self.assertEqual('msg-symbol',
+                         self.store.check_message_id('old-bad-name').symbol)
+
+    def test_renamed_message_register(self):
+        self.assertEqual('msg-symbol',
+                         self.store.check_message_id('W0001').symbol)
+        self.assertEqual('msg-symbol',
+                         self.store.check_message_id('old-symbol').symbol)
+
+   
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__pkginfo__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__pkginfo__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pylint/__pkginfo__.py	(revision 1126)
@@ -0,0 +1,80 @@
+# pylint: disable=W0622,C0103
+# Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+"""pylint packaging information"""
+from __future__ import absolute_import
+
+import sys
+from os.path import join
+
+
+modname = distname = 'pylint'
+
+numversion = (1, 5, 4)
+version = '.'.join([str(num) for num in numversion])
+
+install_requires = [
+    'astroid>=1.4.1,<1.5.0',
+    'six',
+]
+
+if sys.platform == 'win32':
+    install_requires.append('colorama')
+
+
+license = 'GPL'
+description = "python code static checker"
+web = 'http://www.pylint.org'
+mailinglist = "mailto://code-quality@python.org"
+author = 'Logilab'
+author_email = 'python-projects@lists.logilab.org'
+
+classifiers = ['Development Status :: 4 - Beta',
+               'Environment :: Console',
+               'Intended Audience :: Developers',
+               'License :: OSI Approved :: GNU General Public License (GPL)',
+               'Operating System :: OS Independent',
+               'Programming Language :: Python',
+               'Programming Language :: Python :: 2',
+               'Programming Language :: Python :: 3',
+               'Topic :: Software Development :: Debuggers',
+               'Topic :: Software Development :: Quality Assurance',
+               'Topic :: Software Development :: Testing'
+              ]
+
+
+long_desc = """\
+ Pylint is a Python source code analyzer which looks for programming
+ errors, helps enforcing a coding standard and sniffs for some code
+ smells (as defined in Martin Fowler's Refactoring book)
+ .
+ Pylint can be seen as another PyChecker since nearly all tests you
+ can do with PyChecker can also be done with Pylint. However, Pylint
+ offers some more features, like checking length of lines of code,
+ checking if variable names are well-formed according to your coding
+ standard, or checking if declared interfaces are truly implemented,
+ and much more.
+ .
+ Additionally, it is possible to write plugins to add your own checks.
+ .
+ Pylint is shipped with "pylint-gui", "pyreverse" (UML diagram generator)
+ and "symilar" (an independent similarities checker)."""
+
+scripts = [join('bin', filename)
+           for filename in ('pylint', 'pylint-gui', "symilar", "epylint",
+                            "pyreverse")]
+
+include_dirs = [join('pylint', 'test')]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/compat.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/compat.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/compat.py	(revision 1126)
@@ -0,0 +1,99 @@
+"""
+Compatibility...
+"""
+
+import sys
+
+py3k = sys.version_info >= (3, 0)
+
+if py3k: # pragma: no cover
+    string_compare = str
+else: # pragma: no cover
+    string_compare = (str, unicode)
+
+# Unicode compatibility, borrowed from 'six'
+if py3k: # pragma: no cover
+    def u(s):
+        """
+        Convert to Unicode with py3k
+        """
+        return s
+else: # pragma: no cover
+    def u(s):
+        """
+        Convert to Unicode with unicode escaping
+        """
+        return unicode(s.replace(r'\\', r'\\\\'), 'unicode_escape')
+
+if py3k: # pragma: no cover
+    from urllib.parse import urlencode, quote # pylint: disable=W0611,F0401,W0611,E0611
+    from urllib.request import (Request, urlopen, # pylint: disable=W0611,F0401,W0611,E0611
+                                build_opener, ProxyHandler,
+                                URLError, install_opener,
+                                HTTPPasswordMgrWithDefaultRealm,
+                                HTTPBasicAuthHandler)
+    from urllib.error import HTTPError # pylint: disable=W0611,F0401,W0611,E0611
+
+    def itervalues(d):
+        """
+        Function for iterating on values due to methods
+        renaming between Python 2 and 3 versions
+        For Python2
+        """
+        return iter(d.values())
+    def iteritems(d):
+        """
+        Function for iterating on items due to methods
+        renaming between Python 2 and 3 versions
+        For Python2
+        """
+        return iter(d.items())
+
+else: # pragma: no cover
+    from urllib import urlencode as original_urlencode, quote # pylint: disable=W0611,F0401,W0611,E0611
+    from urllib2 import (Request, HTTPError,   # pylint: disable=W0611,F0401,W0611,E0611
+                         ProxyHandler, URLError, urlopen,
+                         build_opener, install_opener,
+                         HTTPPasswordMgrWithDefaultRealm,
+                         HTTPBasicAuthHandler)
+
+    def force_str(str_or_unicode):
+        """
+        Python2-only, ensures that a string is encoding to a str.
+        """
+        if isinstance(str_or_unicode, unicode):
+            return str_or_unicode.encode('utf-8')
+        else:
+            return str_or_unicode
+
+    def urlencode(query, doseq=0):
+        """
+        A version of Python's urllib.urlencode() function that can operate on
+        unicode strings. The parameters are first cast to UTF-8 encoded strings
+        and then encoded as per normal.
+
+        Based on the urlencode from django.utils.http
+        """
+        if hasattr(query, 'items'):
+            query = query.items()
+        return original_urlencode(
+            [(force_str(k),
+              [force_str(i) for i in v]
+              if isinstance(v, (list, tuple)) else force_str(v))
+             for k, v in query],
+            doseq)
+
+    def itervalues(d):
+        """
+        Function for iterating on values due to methods
+        renaming between Python 2 and 3 versions
+        For Python3
+        """
+        return d.itervalues()
+    def iteritems(d):
+        """
+        Function for iterating on items due to methods
+        renaming between Python 2 and 3 versions
+        For Python3
+        """
+        return d.iteritems()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/ignfrance.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/ignfrance.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/ignfrance.py	(revision 1126)
@@ -0,0 +1,541 @@
+"""
+:class:`.IGNFrance` is the IGN France Geocoder.
+"""
+
+import xml.etree.ElementTree as ET
+
+from geopy.compat import (urlencode, HTTPPasswordMgrWithDefaultRealm,
+                          HTTPBasicAuthHandler, build_opener, u,
+                          install_opener, iteritems, Request)
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT, DEFAULT_SCHEME
+from geopy.exc import (
+    GeocoderQueryError,
+    ConfigurationError,
+)
+from geopy.location import Location
+from geopy.util import logger
+
+__all__ = ("IGNFrance", )
+
+
+class IGNFrance(Geocoder):   # pylint: disable=W0223
+    """
+    Geocoder using the IGN France GeoCoder OpenLS API. Documentation at:
+        http://api.ign.fr/tech-docs-js/fr/developpeur/search.html
+    """
+
+    xml_request = """<?xml version="1.0" encoding="UTF-8"?>
+    <XLS version="1.2"
+        xmlns="http://www.opengis.net/xls"
+        xmlns:gml="http://www.opengis.net/gml"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://www.opengis.net/xls
+        http://schemas.opengis.net/ols/1.2/olsAll.xsd">
+        <RequestHeader srsName="epsg:4326"/>
+        <Request methodName="{method_name}"
+                 maximumResponses="{maximum_responses}"
+                 requestID=""
+                 version="1.2">
+            {sub_request}
+        </Request>
+    </XLS>"""
+
+    def __init__(
+            self,
+            api_key,
+            username=None,
+            password=None,
+            referer=None,
+            domain='wxs.ign.fr',
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+    ):  # pylint: disable=R0913
+        """
+        Initialize a customized IGN France geocoder.
+
+        :param string api_key: The API key required by IGN France API
+            to perform geocoding requests. You can get your key here:
+            http://api.ign.fr. Mandatory. For authentication with referer
+            and with username/password, the api key always differ.
+
+        :param string username: When making a call need HTTP simple
+            authentication username. Mandatory if no referer set
+
+        :param string password: When making a call need HTTP simple
+            authentication password. Mandatory if no referer set
+
+        :param string referer: When making a call need HTTP referer.
+            Mandatory if no password and username
+
+        :param string domain: Currently it is 'wxs.ign.fr', can
+            be changed for testing purposes for developer API
+            e.g gpp3-wxs.ign.fr at the moment.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+        """
+        super(IGNFrance, self).__init__(
+            scheme=scheme, timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+
+        # Catch if no api key with username and password
+        # or no api key with referer
+        if not (api_key and username and password) \
+            and not (api_key and referer):
+            raise ConfigurationError('You should provide an api key and a '
+                                     'username with a password or an api '
+                                     'key with a referer depending on '
+                                     'created api key')
+        if (username and password) and referer:
+            raise ConfigurationError('You can\'t set username/password and '
+                                     'referer together. The API key always '
+                                     'differs depending on both scenarios')
+        if username and not password:
+            raise ConfigurationError(
+                'username and password must be set together'
+            )
+
+        self.api_key = api_key
+        self.username = username
+        self.password = password
+        self.referer = referer
+        self.domain = domain.strip('/')
+        self.api = "{scheme}://{domain}/{api_key}/geoportail/ols".format(
+            scheme=self.scheme,
+            api_key=self.api_key,
+            domain=self.domain
+        )
+        if username and password and referer is None:
+            self.addSimpleHTTPAuthHeader()
+
+    def geocode(
+            self,
+            query,
+            query_type='StreetAddress',
+            maximum_responses=25,
+            is_freeform=False,
+            filtering=None,
+            exactly_one=True,
+            timeout=None
+    ):  # pylint: disable=W0221,R0913
+        """
+        Geocode a location query.
+
+        :param string query: The query string to be geocoded.
+
+        :param string query_type: The type to provide for geocoding. It can be
+            PositionOfInterest, StreetAddress or CadastralParcel.
+            StreetAddress is the default choice if none provided.
+
+        :param int maximum_responses: The maximum number of responses
+            to ask to the API in the query body.
+
+        :param string is_freeform: Set if return is structured with
+            freeform structure or a more structured returned.
+            By default, value is False.
+
+        :param string filtering: Provide string that help setting geocoder
+            filter. It contains an XML string. See examples in documentation
+            and ignfrance.py file in directory tests.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+
+        # Check if acceptable query type
+        if query_type not in ['PositionOfInterest',
+                              'StreetAddress',
+                              'CadastralParcel']:
+            raise GeocoderQueryError("""You did not provided a query_type the
+            webservice can consume. It should be PositionOfInterest,
+            'StreetAddress or CadastralParcel""")
+
+        # Check query validity for CadastralParcel
+        if query_type == 'CadastralParcel' and len(query.strip()) != 14:
+            raise GeocoderQueryError("""You must send a string of fourteen
+                characters long to match the cadastre required code""")
+
+        sub_request = """
+                <GeocodeRequest returnFreeForm="{is_freeform}">
+                    <Address countryCode="{query_type}">
+                        <freeFormAddress>{query}</freeFormAddress>
+                        {filtering}
+                    </Address>
+                </GeocodeRequest>
+        """
+
+        xml_request = self.xml_request.format(
+            method_name='LocationUtilityService',
+            sub_request=sub_request,
+            maximum_responses=maximum_responses
+        )
+
+        # Manage type change for xml case sensitive
+        if is_freeform:
+            is_freeform = 'true'
+        else:
+            is_freeform = 'false'
+
+        # Manage filtering value
+        if filtering is None:
+            filtering = ''
+
+        # Create query using parameters
+        request_string = xml_request.format(
+            is_freeform=is_freeform,
+            query=query,
+            query_type=query_type,
+            filtering=filtering
+        )
+
+        params = {
+            'xls': request_string
+        }
+
+        url = "?".join((self.api, urlencode(params)))
+
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+
+        raw_xml = self._request_raw_content(url, timeout)
+
+        return self._parse_xml(
+            raw_xml,
+            is_freeform=is_freeform,
+            exactly_one=exactly_one
+        )
+
+    def reverse(
+            self,
+            query,
+            reverse_geocode_preference=('StreetAddress', ),
+            maximum_responses=25,
+            filtering='',
+            exactly_one=False,
+            timeout=None
+    ):  # pylint: disable=W0221,R0913
+        """
+        Given a point, find an address.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param list reverse_geocode_preference: Enable to set expected results
+            type. It can be StreetAddress or PositionOfInterest.
+            Default is set to StreetAddress
+
+        :param int maximum_responses: The maximum number of responses
+            to ask to the API in the query body.
+
+        :param string filtering: Provide string that help setting geocoder
+            filter. It contains an XML string. See examples in documentation
+            and ignfrance.py file in directory tests.
+
+        :param boolean exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+
+        sub_request = """
+            <ReverseGeocodeRequest>
+                {reverse_geocode_preference}
+                <Position>
+                  <gml:Point>
+                    <gml:pos>{query}</gml:pos>
+                  </gml:Point>
+                  {filtering}
+                </Position>
+            </ReverseGeocodeRequest>
+        """
+
+        xml_request = self.xml_request.format(
+            method_name='ReverseGeocodeRequest',
+            sub_request=sub_request,
+            maximum_responses=maximum_responses
+        )
+
+        for pref in reverse_geocode_preference:
+            if pref not in ('StreetAddress', 'PositionOfInterest'):
+                raise GeocoderQueryError(
+                    '`reverse_geocode_preference` must contain '
+                    'one or more of: StreetAddress, PositionOfInterest'
+                )
+
+        point = self._coerce_point_to_string(query).replace(',', ' ')
+        reverse_geocode_preference = '\n'.join((
+            '<ReverseGeocodePreference>%s</ReverseGeocodePreference>' % pref
+            for pref
+            in reverse_geocode_preference
+        ))
+
+        request_string = xml_request.format(
+            maximum_responses=maximum_responses,
+            query=point,
+            reverse_geocode_preference=reverse_geocode_preference,
+            filtering=filtering
+        )
+
+        url = "?".join((self.api, urlencode({'xls': request_string})))
+
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+
+        raw_xml = self._request_raw_content(url, timeout)
+
+        return self._parse_xml(
+            raw_xml,
+            exactly_one=exactly_one,
+            is_reverse=True,
+            is_freeform='false'
+        )
+
+    def addSimpleHTTPAuthHeader(self):
+        """
+        Create Urllib request object embedding HTTP simple authentication
+        """
+        sub_request = """
+        <GeocodeRequest returnFreeForm="{is_freeform}">
+            <Address countryCode="{query_type}">
+                <freeFormAddress>{query}</freeFormAddress>
+            </Address>
+        </GeocodeRequest>
+        """
+
+        xml_request = self.xml_request.format(
+            method_name='LocationUtilityService',
+            sub_request=sub_request,
+            maximum_responses=1
+        )
+
+        # Create query using parameters
+        request_string = xml_request.format(
+            is_freeform='false',
+            query='rennes',
+            query_type='PositionOfInterest'
+        )
+
+        params = {
+            'xls':  request_string
+        }
+
+        top_level_url = "?".join((self.api, urlencode(params)))
+        password_mgr = HTTPPasswordMgrWithDefaultRealm()
+
+        # Add the username and password.
+        # If we knew the realm, we could use it instead of None.
+        password_mgr.add_password(
+            None,
+            top_level_url,
+            self.username,
+            self.password
+        )
+
+        handler = HTTPBasicAuthHandler(password_mgr)
+
+        # create "opener" (OpenerDirector instance)
+        opener = build_opener(handler)
+
+        # Install the opener.
+        # Now all calls to urllib.request.urlopen use our opener.
+        install_opener(opener)
+
+    def _parse_xml(self,
+                   page,
+                   is_reverse=False,
+                   is_freeform=False,
+                   exactly_one=True):
+        """
+        Returns location, (latitude, longitude) from XML feed
+        and transform to json
+        """
+        # Parse the page
+        tree = ET.fromstring(page.encode('utf-8'))
+
+        # Clean tree from namespace to facilitate XML manipulation
+        def remove_namespace(doc, namespace):
+            """Remove namespace in the document in place."""
+            ns = '{%s}' % namespace
+            ns = u(ns)
+            nsl = len(ns)
+            for elem in doc.getiterator():
+                if elem.tag.startswith(ns):
+                    elem.tag = elem.tag[nsl:]
+
+        remove_namespace(tree, 'http://www.opengis.net/gml')
+        remove_namespace(tree, 'http://www.opengis.net/xls')
+        remove_namespace(tree, 'http://www.opengis.net/xlsext')
+
+        # Return places as json instead of XML
+        places = self._xml_to_json_places(tree, is_reverse=is_reverse)
+
+        if exactly_one:
+            return self._parse_place(places[0], is_freeform=is_freeform)
+        else:
+            return [
+                self._parse_place(
+                    place,
+                    is_freeform=is_freeform
+                ) for place in places
+            ]
+
+    @staticmethod
+    def _xml_to_json_places(tree, is_reverse=False):
+        """
+        Transform the xml ElementTree due to XML webservice return to json
+        """
+
+        select_multi = (
+            'GeocodedAddress'
+            if not is_reverse
+            else 'ReverseGeocodedLocation'
+        )
+
+        adresses = tree.findall('.//' + select_multi)
+        places = []
+
+        sel_pl = './/Address/Place[@type="{}"]'
+        for adr in adresses:
+            el = {}
+            el['pos'] = adr.find('./Point/pos')
+            el['street'] = adr.find('.//Address/StreetAddress/Street')
+            el['freeformaddress'] = adr.find('.//Address/freeFormAddress')
+            el['municipality'] = adr.find(sel_pl.format('Municipality'))
+            el['numero'] = adr.find(sel_pl.format('Numero'))
+            el['feuille'] = adr.find(sel_pl.format('Feuille'))
+            el['section'] = adr.find(sel_pl.format('Section'))
+            el['departement'] = adr.find(sel_pl.format('Departement'))
+            el['commune_absorbee'] = adr.find(sel_pl.format('CommuneAbsorbee'))
+            el['commune'] = adr.find(sel_pl.format('Commune'))
+            el['insee'] = adr.find(sel_pl.format('INSEE'))
+            el['qualite'] = adr.find(sel_pl.format('Qualite'))
+            el['territoire'] = adr.find(sel_pl.format('Territoire'))
+            el['id'] = adr.find(sel_pl.format('ID'))
+            el['id_tr'] = adr.find(sel_pl.format('ID_TR'))
+            el['bbox'] = adr.find(sel_pl.format('Bbox'))
+            el['nature'] = adr.find(sel_pl.format('Nature'))
+            el['postal_code'] = adr.find('.//Address/PostalCode')
+            el['extended_geocode_match_code'] = adr.find(
+                './/ExtendedGeocodeMatchCode'
+            )
+
+            place = {}
+
+            def testContentAttrib(selector, key):
+                """
+                Helper to select by attribute and if not attribute,
+                value set to empty string
+                """
+                return selector.attrib.get(
+                    key,
+                    None
+                ) if selector is not None else None
+
+            place['accuracy'] = testContentAttrib(
+                adr.find('.//GeocodeMatchCode'), 'accuracy')
+
+            place['match_type'] = testContentAttrib(
+                adr.find('.//GeocodeMatchCode'), 'matchType')
+
+            place['building'] = testContentAttrib(
+                adr.find('.//Address/StreetAddress/Building'), 'number')
+
+            place['search_centre_distance'] = testContentAttrib(
+                adr.find('.//SearchCentreDistance'), 'value')
+
+            for key, value in iteritems(el):
+                if value is not None:
+                    place[key] = value.text
+                    if value.text == None:
+                        place[key] = None
+                else:
+                    place[key] = None
+
+            # We check if lat lng is not empty and unpack accordingly
+            if place['pos']:
+                lat, lng = place['pos'].split(' ')
+                place['lat'] = lat.strip()
+                place['lng'] = lng.strip()
+            else:
+                place['lat'] = place['lng'] = None
+
+            # We removed the unused key
+            place.pop("pos", None)
+            places.append(place)
+
+        return places
+
+    def _request_raw_content(self, url, timeout):
+        """
+        Send the request to get raw content.
+        """
+
+        request = Request(url)
+
+        if self.referer is not None:
+            request.add_header('Referer', self.referer)
+
+        raw_xml = self._call_geocoder(
+            request,
+            timeout=timeout,
+            deserializer=None
+        )
+
+        return raw_xml
+
+
+    @staticmethod
+    def _parse_place(place, is_freeform=None):
+        """
+        Get the location, lat, lng and place from a single json place.
+        """
+        # When freeform already so full adress
+        if is_freeform == 'true':
+            location = place.get('freeformaddress')
+        else:
+            # For parcelle
+            if place.get('numero'):
+                location = place.get('street')
+            else:
+                # When classic geocoding
+                # or when reverse geocoding
+                location = "%s %s" % (
+                    place.get('postal_code', ''),
+                    place.get('commune', ''),
+                )
+                if place.get('street'):
+                    location = "%s, %s" % (
+                        place.get('street', ''),
+                        location,
+                    )
+                if place.get('building'):
+                    location = "%s %s" % (
+                        place.get('building', ''),
+                        location,
+                    )
+
+        return Location(location, (place.get('lat'), place.get('lng')), place)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/dot_us.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/dot_us.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/dot_us.py	(revision 1126)
@@ -0,0 +1,159 @@
+"""
+:class:`GeocoderDotUS` geocoder.
+"""
+
+import csv
+from base64 import encodestring
+from geopy.compat import urlencode, py3k, Request
+from geopy.geocoders.base import (
+    Geocoder,
+    DEFAULT_FORMAT_STRING,
+    DEFAULT_TIMEOUT,
+)
+from geopy.location import Location
+from geopy.exc import ConfigurationError
+from geopy.util import logger, join_filter
+
+
+__all__ = ("GeocoderDotUS", )
+
+
+class GeocoderDotUS(Geocoder):  # pylint: disable=W0223
+    """
+    GeocoderDotUS geocoder, documentation at:
+        http://geocoder.us/
+
+    Note that GeocoderDotUS does not support SSL.
+    """
+
+    def __init__(
+            self,
+            username=None,
+            password=None,
+            format_string=DEFAULT_FORMAT_STRING,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):  # pylint: disable=R0913
+        """
+        :param string username:
+
+        :param string password:
+
+        :param string format_string: String containing '%s' where the
+            string to geocode should be interpolated before querying the
+            geocoder. For example: '%s, Mountain View, CA'. The default
+            is just '%s'.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising an :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+            .. versionadded:: 0.97
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+        """
+        super(GeocoderDotUS, self).__init__(
+            format_string=format_string, timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        if username or password:
+            if not (username and password):
+                raise ConfigurationError(
+                    "Username and password must both specified"
+                )
+            self.authenticated = True
+            self.api = "http://geocoder.us/member/service/namedcsv"
+        else:
+            self.authenticated = False
+            self.api = "http://geocoder.us/service/namedcsv"
+        self.username = username
+        self.password = password
+
+    def geocode(self, query, exactly_one=True, timeout=None):
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+        """
+        query_str = self.format_string % query
+
+        url = "?".join((self.api, urlencode({'address':query_str})))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        if self.authenticated is True:
+            auth = " ".join((
+                "Basic",
+                encodestring(":".join((self.username, self.password))\
+                    .encode('utf-8')).strip().decode('utf-8')
+            ))
+            url = Request(url, headers={"Authorization": auth})
+        page = self._call_geocoder(url, timeout=timeout, raw=True)
+        content = page.read().decode("utf-8") if py3k else page.read() # pylint: disable=E1101,E1103
+        places = [
+            r for r in csv.reader(
+                [content, ] if not isinstance(content, list)
+                else content
+            )
+        ]
+        if not len(places):
+            return None
+        if exactly_one is True:
+            return self._parse_result(places[0])
+        else:
+            result = [self._parse_result(res) for res in places]
+            if None in result: # todo
+                return None
+            return result
+
+    @staticmethod
+    def _parse_result(result):
+        """
+        Parse individual results. Different, but lazy actually, so... ok.
+        """
+        # turn x=y pairs ("lat=47.6", "long=-117.426")
+        # into dict key/value pairs:
+        place = dict(
+            [x.split('=') for x in result if len(x.split('=')) > 1]
+        )
+        if 'error' in place:
+            if "couldn't find" in place['error']:
+                return None
+
+        address = [
+            place.get('number', None),
+            place.get('prefix', None),
+            place.get('street', None),
+            place.get('type', None),
+            place.get('suffix', None)
+        ]
+        city = place.get('city', None)
+        state = place.get('state', None)
+        zip_code = place.get('zip', None)
+
+        name = join_filter(", ", [
+            join_filter(" ", address),
+            city,
+            join_filter(" ", [state, zip_code])
+        ])
+
+        latitude = place.get('lat', None)
+        longitude = place.get('long', None)
+        if latitude and longitude:
+            latlon = float(latitude), float(longitude)
+        else:
+            return None
+        return Location(name, latlon, place)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/geonames.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/geonames.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/geonames.py	(revision 1126)
@@ -0,0 +1,184 @@
+"""
+:class:`GeoNames` geocoder.
+"""
+
+from geopy.compat import urlencode
+
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT
+from geopy.location import Location
+from geopy.exc import (
+    GeocoderInsufficientPrivileges,
+    GeocoderServiceError,
+    ConfigurationError
+)
+from geopy.util import logger
+
+
+__all__ = ("GeoNames", )
+
+
+class GeoNames(Geocoder): # pylint: disable=W0223
+    """
+    GeoNames geocoder, documentation at:
+        http://www.geonames.org/export/geonames-search.html
+
+    Reverse geocoding documentation at:
+        http://www.geonames.org/maps/us-reverse-geocoder.html
+    """
+
+    def __init__(
+            self,
+            country_bias=None,
+            username=None,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):
+        """
+        :param string country_bias:
+
+        :param string username:
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+            .. versionadded:: 0.97
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+        """
+        super(GeoNames, self).__init__(
+            scheme='http', timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        if username == None:
+            raise ConfigurationError(
+                'No username given, required for api access.  If you do not '
+                'have a GeoNames username, sign up here: '
+                'http://www.geonames.org/login'
+            )
+        self.username = username
+        self.country_bias = country_bias
+        self.api = "%s://api.geonames.org/searchJSON" % self.scheme
+        self.api_reverse = (
+            "%s://api.geonames.org/findNearbyPlaceNameJSON" % self.scheme
+        )
+
+    def geocode(self, query, exactly_one=True, timeout=None): # pylint: disable=W0221
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+        """
+        params = {
+            'q': query,
+            'username': self.username
+        }
+        if self.country_bias:
+            params['countryBias'] = self.country_bias
+        if exactly_one is True:
+            params['maxRows'] = 1
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one,
+        )
+
+    def reverse(
+            self,
+            query,
+            exactly_one=False,
+            timeout=None,
+        ):
+        """
+        Given a point, find an address.
+
+            .. versionadded:: 1.2.0
+
+        :param string query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param boolean exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+        """
+        try:
+            lat, lng = [
+                x.strip() for x in
+                self._coerce_point_to_string(query).split(',')
+            ]
+        except ValueError:
+            raise ValueError("Must be a coordinate pair or Point")
+        params = {
+            'lat': lat,
+            'lng': lng,
+            'username': self.username
+        }
+        url = "?".join((self.api_reverse, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one
+        )
+
+    def _parse_json(self, doc, exactly_one):
+        """
+        Parse JSON response body.
+        """
+        places = doc.get('geonames', [])
+        err = doc.get('status', None)
+        if err and 'message' in err:
+            if err['message'].startswith("user account not enabled to use"):
+                raise GeocoderInsufficientPrivileges(err['message'])
+            else:
+                raise GeocoderServiceError(err['message'])
+        if not len(places):
+            return None
+
+        def parse_code(place):
+            """
+            Parse each record.
+            """
+            latitude = place.get('lat', None)
+            longitude = place.get('lng', None)
+            if latitude and longitude:
+                latitude = float(latitude)
+                longitude = float(longitude)
+            else:
+                return None
+
+            placename = place.get('name')
+            state = place.get('adminCode1', None)
+            country = place.get('countryCode', None)
+
+            location = ', '.join(
+                [x for x in [placename, state, country] if x]
+            )
+
+            return Location(location, (latitude, longitude), place)
+
+        if exactly_one:
+            return parse_code(places[0])
+        else:
+            return [parse_code(place) for place in places]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/osm.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/osm.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/osm.py	(revision 1126)
@@ -0,0 +1,274 @@
+"""
+OpenStreetMaps geocoder, contributed by Alessandro Pasotti of ItOpen.
+"""
+
+from geopy.geocoders.base import (
+    Geocoder,
+    DEFAULT_FORMAT_STRING,
+    DEFAULT_TIMEOUT,
+    DEFAULT_SCHEME
+)
+from geopy.compat import urlencode
+from geopy.location import Location
+from geopy.util import logger
+from geopy.exc import GeocoderQueryError
+
+
+__all__ = ("Nominatim", )
+
+
+class Nominatim(Geocoder):
+    """
+    Nominatim geocoder for OpenStreetMap servers. Documentation at:
+        https://wiki.openstreetmap.org/wiki/Nominatim
+
+    Note that Nominatim does not support SSL.
+    """
+
+    structured_query_params = {
+        'street',
+        'city',
+        'county',
+        'state',
+        'country',
+        'postalcode',
+    }
+
+    def __init__(
+            self,
+            format_string=DEFAULT_FORMAT_STRING,
+            view_box=None,
+            country_bias=None,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            domain='nominatim.openstreetmap.org',
+            scheme=DEFAULT_SCHEME,
+            user_agent=None
+    ):  # pylint: disable=R0913
+        """
+        :param string format_string: String containing '%s' where the
+            string to geocode should be interpolated before querying the
+            geocoder. For example: '%s, Mountain View, CA'. The default
+            is just '%s'.
+
+        :param tuple view_box: Coordinates to restrict search within.
+
+        :param string country_bias: Bias results to this country.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+
+        :param string domain: Should be the localized Openstreetmap domain to
+            connect to. The default is 'nominatim.openstreetmap.org', but you
+            can change it to a domain of your own.
+
+            .. versionadded:: 1.8.2
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+            .. versionadded:: 1.8.2
+        """
+        super(Nominatim, self).__init__(
+            format_string, scheme, timeout, proxies, user_agent=user_agent
+        )
+        self.country_bias = country_bias
+        self.format_string = format_string
+        self.view_box = view_box
+        self.domain = domain.strip('/')
+
+        self.api = "%s://%s/search" % (self.scheme, self.domain)
+        self.reverse_api = "%s://%s/reverse" % (self.scheme, self.domain)
+
+    def geocode(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+            addressdetails=False,
+            language=False,
+            geometry=None
+    ):  # pylint: disable=R0913,W0221
+        """
+        Geocode a location query.
+
+        :param query: The address, query or structured query to geocode
+            you wish to geocode.
+
+            For a structured query, provide a dictionary whose keys
+            are one of: `street`, `city`, `county`, `state`, `country`, or
+            `postalcode`. For more information, see Nominatim's
+            documentation for "structured requests":
+
+                https://wiki.openstreetmap.org/wiki/Nominatim
+
+        :type query: dict or string
+
+            .. versionchanged:: 1.0.0
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+
+        :param addressdetails: If you want in *Location.raw* to include
+            addressdetails such as city_district, etc set it to True
+        :type addressdetails: bool
+
+        :param string language: Preferred language in which to return results.
+            Either uses standard
+            `RFC2616 <http://www.ietf.org/rfc/rfc2616.txt>`_
+            accept-language string or a simple comma-separated
+            list of language codes.
+        :type addressdetails: string
+
+            .. versionadded:: 1.0.0
+
+        :param string geometry: If present, specifies whether the geocoding
+            service should return the result's geometry in `wkt`, `svg`,
+            `kml`, or `geojson` formats. This is available via the
+            `raw` attribute on the returned :class:`geopy.location.Location`
+            object.
+
+            .. versionadded:: 1.3.0
+
+        """
+
+        if isinstance(query, dict):
+            params = {
+                key: val
+                for key, val
+                in query.items()
+                if key in self.structured_query_params
+            }
+        else:
+            params = {'q': self.format_string % query}
+
+        params.update({
+            'format': 'json'
+        })
+
+        # `viewbox` apparently replaces `view_box`
+        if self.view_box:
+            params['viewbox'] = ','.join(self.view_box)
+
+        if self.country_bias:
+            params['countrycodes'] = self.country_bias
+
+        if addressdetails:
+            params['addressdetails'] = 1
+
+        if language:
+            params['accept-language'] = language
+
+        if geometry is not None:
+            geometry = geometry.lower()
+            if geometry == 'wkt':
+                params['polygon_text'] = 1
+            elif geometry == 'svg':
+                params['polygon_svg'] = 1
+            elif geometry == 'kml':
+                params['polygon_kml'] = 1
+            elif geometry == 'geojson':
+                params['polygon_geojson'] = 1
+            else:
+                raise GeocoderQueryError(
+                    "Invalid geometry format. Must be one of: "
+                    "wkt, svg, kml, geojson."
+                )
+
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    def reverse(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+            language=False,
+    ):  # pylint: disable=W0221
+        """
+        Returns a reverse geocoded location.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+
+        :param string language: Preferred language in which to return results.
+            Either uses standard
+            `RFC2616 <http://www.ietf.org/rfc/rfc2616.txt>`_
+            accept-language string or a simple comma-separated
+            list of language codes.
+        :type addressdetails: string
+
+            .. versionadded:: 1.0.0
+
+        """
+        try:
+            lat, lon = [
+                x.strip() for x in
+                self._coerce_point_to_string(query).split(',')
+            ]  # doh
+        except ValueError:
+            raise ValueError("Must be a coordinate pair or Point")
+        params = {
+            'lat': lat,
+            'lon': lon,
+            'format': 'json',
+        }
+        if language:
+            params['accept-language'] = language
+        url = "?".join((self.reverse_api, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    @staticmethod
+    def parse_code(place):
+        """
+        Parse each resource.
+        """
+        latitude = place.get('lat', None)
+        longitude = place.get('lon', None)
+        placename = place.get('display_name', None)
+        if latitude and longitude:
+            latitude = float(latitude)
+            longitude = float(longitude)
+        return Location(placename, (latitude, longitude), place)
+
+    def _parse_json(self, places, exactly_one):
+        if places is None:
+            return None
+        if not isinstance(places, list):
+            places = [places]
+        if not len(places):
+            return None
+        if exactly_one is True:
+            return self.parse_code(places[0])
+        else:
+            return [self.parse_code(place) for place in places]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/__init__.py	(revision 1126)
@@ -0,0 +1,163 @@
+"""
+Each geolocation service you might use, such as Google Maps, Bing Maps, or
+Yahoo BOSS, has its own class in ``geopy.geocoders`` abstracting the service's
+API. Geocoders each define at least a ``geocode`` method, for resolving a
+location from a string, and may define a ``reverse`` method, which resolves a
+pair of coordinates to an address. Each Geocoder accepts any credentials
+or settings needed to interact with its service, e.g., an API key or
+locale, during its initialization.
+
+To geolocate a query to an address and coordinates:
+
+    >>> from geopy.geocoders import Nominatim
+    >>> geolocator = Nominatim()
+    >>> location = geolocator.geocode("175 5th Avenue NYC")
+    >>> print(location.address)
+    Flatiron Building, 175, 5th Avenue, Flatiron, New York, NYC, New York, ...
+    >>> print((location.latitude, location.longitude))
+    (40.7410861, -73.9896297241625)
+    >>> print(location.raw)
+    {'place_id': '9167009604', 'type': 'attraction', ...}
+
+
+To find the address corresponding to a set of coordinates:
+
+    >>> from geopy.geocoders import Nominatim
+    >>> geolocator = Nominatim()
+    >>> location = geolocator.reverse("52.509669, 13.376294")
+    >>> print(location.address)
+    Potsdamer Platz, Mitte, Berlin, 10117, Deutschland, European Union
+    >>> print((location.latitude, location.longitude))
+    (52.5094982, 13.3765983)
+    >>> print(location.raw)
+    {'place_id': '654513', 'osm_type': 'node', ...}
+
+Locators' ``geolocate`` and ``reverse`` methods require the argument ``query``,
+and also accept at least the argument ``exactly_one``, which is ``True``.
+Geocoders may have additional attributes, e.g., Bing accepts ``user_location``,
+the effect of which is to bias results near that location. ``geolocate``
+and ``reverse`` methods  may return three types of values:
+
+- When there are no results found, returns ``None``.
+
+- When the method's ``exactly_one`` argument is ``True`` and at least one
+  result is found, returns a :class:`geopy.location.Location` object, which
+  can be iterated over as:
+
+    (address<String>, (latitude<Float>, longitude<Float>))
+
+  Or can be accessed as `Location.address`, `Location.latitude`,
+  `Location.longitude`, `Location.altitude`, and `Location.raw`. The
+  last contains the geocoder's unparsed response for this result.
+
+- When ``exactly_one`` is False, and there is at least one result, returns a
+  list of :class:`geopy.location.Location` objects, as above:
+
+    [Location, [...]]
+
+If a service is unavailable or otherwise returns a non-OK response, or doesn't
+receive a response in the allotted timeout, you will receive one of the
+`Exceptions`_ detailed below.
+
+Every geocoder accepts an argument ``format_string`` that defaults to '%s'
+where the input string to geocode is interpolated. For example, if you only
+need to geocode locations in Cleveland, Ohio, you could do::
+
+    >>> from geopy.geocoders import GeocoderDotUS
+    >>> geolocator = GeocoderDotUS(format_string="%s, Cleveland OH")
+    >>> address, (latitude, longitude) = geolocator.geocode("11111 Euclid Ave")
+    >>> print(address, latitude, longitude)
+    11111 Euclid Ave, Cleveland, OH 44106 41.506784 -81.608148
+
+"""
+
+__all__ = (
+    "get_geocoder_for_service",
+    "ArcGIS",
+    "Baidu",
+    "Bing",
+    "DataBC",
+    "GeocoderDotUS",
+    "GeocodeFarm",
+    "GeoNames",
+    "GoogleV3",
+    "IGNFrance",
+    "OpenCage",
+    "OpenMapQuest",
+    "NaviData",
+    "Nominatim",
+    "YahooPlaceFinder",
+    "LiveAddress",
+    'Yandex',
+    "What3Words",
+    "Photon",
+)
+
+
+from geopy.geocoders.arcgis import ArcGIS
+from geopy.geocoders.baidu import Baidu
+from geopy.geocoders.bing import Bing
+from geopy.geocoders.databc import DataBC
+from geopy.geocoders.dot_us import GeocoderDotUS
+from geopy.geocoders.geocodefarm import GeocodeFarm
+from geopy.geocoders.geonames import GeoNames
+from geopy.geocoders.googlev3 import GoogleV3
+from geopy.geocoders.opencage import OpenCage
+from geopy.geocoders.openmapquest import OpenMapQuest
+from geopy.geocoders.navidata import NaviData
+from geopy.geocoders.osm import Nominatim
+from geopy.geocoders.placefinder import YahooPlaceFinder
+from geopy.geocoders.smartystreets import LiveAddress
+from geopy.geocoders.what3words import What3Words
+from geopy.geocoders.yandex import Yandex
+from geopy.geocoders.ignfrance import IGNFrance
+from geopy.geocoders.photon import Photon
+
+
+from geopy.exc import GeocoderNotFound
+
+
+SERVICE_TO_GEOCODER = {
+    "arcgis": ArcGIS,
+    "baidu": Baidu,
+    "bing": Bing,
+    "databc": DataBC,
+    "google": GoogleV3,
+    "googlev3": GoogleV3,
+    "geocoderdotus": GeocoderDotUS,
+    "geonames": GeoNames,
+    "yahoo": YahooPlaceFinder,
+    "placefinder": YahooPlaceFinder,
+    "opencage": OpenCage,
+    "openmapquest": OpenMapQuest,
+    "liveaddress": LiveAddress,
+    "navidata": NaviData,
+    "nominatim": Nominatim,
+    "geocodefarm": GeocodeFarm,
+    "what3words": What3Words,
+    "yandex": Yandex,
+    "ignfrance": IGNFrance,
+    "photon": Photon
+}
+
+
+def get_geocoder_for_service(service):
+    """
+    For the service provided, try to return a geocoder class.
+
+    >>> from geopy.geocoders import get_geocoder_for_service
+    >>> get_geocoder_for_service("nominatim")
+    geopy.geocoders.osm.Nominatim
+
+    If the string given is not recognized, a
+    :class:`geopy.exc.GeocoderNotFound` exception is raised.
+
+    """
+    try:
+        return SERVICE_TO_GEOCODER[service.lower()]
+    except KeyError:
+        raise GeocoderNotFound(
+            "Unknown geocoder '%s'; options are: %s" %
+            (service, SERVICE_TO_GEOCODER.keys())
+        )
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/what3words.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/what3words.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/what3words.py	(revision 1126)
@@ -0,0 +1,272 @@
+"""
+:class:`.What3Words` geocoder.
+"""
+
+import re
+from geopy.compat import urlencode
+from geopy.geocoders.base import (
+    Geocoder,
+    DEFAULT_FORMAT_STRING,
+    DEFAULT_TIMEOUT,
+    DEFAULT_SCHEME
+)
+from geopy.location import Location
+from geopy.util import logger, join_filter
+from geopy import exc
+
+
+__all__ = ("What3Words", )
+
+
+class What3Words(Geocoder):
+    """
+    What3Words geocoder, documentation at:
+        http://what3words.com/api/reference
+    """
+
+    word_re = re.compile(r"^\*{1,1}[^\W\d\_]+$", re.U)
+    multiple_word_re = re.compile(
+        r"[^\W\d\_]+\.{1,1}[^\W\d\_]+\.{1,1}[^\W\d\_]+$", re.U
+        )
+
+    def __init__(
+            self,
+            api_key,
+            format_string=DEFAULT_FORMAT_STRING,
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+    ):
+        """
+        Initialize a What3Words geocoder with 3-word or OneWord-address and
+        What3Words API key.
+
+            .. versionadded:: 1.5.0
+
+        :param string api_key: Key provided by What3Words.
+
+        :param string format_string: String containing '%s' where the
+            string to geocode should be interpolated before querying the
+            geocoder. For example: '%s, piped.gains.jungle'. The default
+            is just '%s'.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+        """
+        super(What3Words, self).__init__(
+            format_string,
+            scheme,
+            timeout,
+            proxies,
+            user_agent=user_agent,
+        )
+        self.api_key = api_key
+        self.api = (
+            "%s://api.what3words.com/" % self.scheme
+        )
+
+    def _check_query(self, query):
+        """
+        Check query validity with regex
+        """
+        if not (self.word_re.match(query) or
+                self.multiple_word_re.match(query)):
+            return False
+        else:
+            return True
+
+    def geocode(self,
+                query,
+                lang='en',
+                exactly_one=True,
+                timeout=None):
+
+        """
+        Geocode a "3 words" or "OneWord" query.
+
+        :param string query: The 3-word or OneWord-address you wish to geocode.
+
+        :param string lang: two character language codes as supported by
+            the API (http://what3words.com/api/reference/languages).
+
+        :param bool exactly_one: Parameter has no effect for this geocoder.
+            Due to the address scheme there is always exactly one result.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+            .. versionadded:: 0.97
+        """
+
+        if not self._check_query(query):
+            raise exc.GeocoderQueryError(
+                "Search string must be either like "
+                "'word.word.word' or '*word' "
+            )
+
+        params = {
+            'string': self.format_string % query,
+            'lang': self.format_string % lang.lower()
+
+        }
+
+        url = "?".join((
+            (self.api + "w3w"),
+            "&".join(("=".join(('key', self.api_key)), urlencode(params)))
+        ))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one
+        )
+
+    def _parse_json(self, resources, exactly_one=True):
+        """
+        Parse type, words, latitude, and longitude and language from a
+        JSON response.
+        """
+        if resources.get('error') == "X1":
+            raise exc.GeocoderAuthenticationFailure()
+
+        if resources.get('error') == "11":
+            raise exc.GeocoderQueryError(
+                "Address (Word(s)) not recognised by What3Words."
+            )
+
+        def parse_resource(resource):
+            """
+            Parse record.
+            """
+
+            if resource['type'] == '3 words':
+                words = resource['words']
+                words = join_filter(".", [words[0], words[1], words[2]])
+                position = resource['position']
+                latitude, longitude = position[0], position[1]
+
+                if latitude and longitude:
+                    latitude = float(latitude)
+                    longitude = float(longitude)
+
+                return Location(words, (latitude, longitude), resource)
+            elif resource['type'] == 'OneWord':
+                words = resource['words']
+                words = join_filter(".", [words[0], words[1], words[2]])
+                oneword = resource['oneword']
+                info = resource['info']
+
+                address = join_filter(", ", [
+                    oneword,
+                    words,
+                    info['name'],
+                    info['address1'],
+                    info['address2'],
+                    info['address3'],
+                    info['city'],
+                    info['county'],
+                    info['postcode'],
+                    info['country_id']
+                ])
+
+                position = resource['position']
+                latitude, longitude = position[0], position[1]
+
+                if latitude and longitude:
+                    latitude = float(latitude)
+                    longitude = float(longitude)
+
+                return Location(address, (latitude, longitude), resource)
+            else:
+                raise exc.GeocoderParseError('Error parsing result.')
+
+
+        return parse_resource(resources)
+
+
+    def reverse(self, query, lang='en', exactly_one=True, timeout=None):
+        """
+        Given a point, find the 3 word address.
+
+        :param query: The coordinates for which you wish to obtain the 3 word
+            address.
+
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param string lang: two character language codes as supported by the
+            API (http://what3words.com/api/reference/languages).
+
+        :param bool exactly_one: Parameter has no effect for this geocoder.
+            Due to the address scheme there is always exactly one result.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+        lang = lang.lower()
+
+        params = {
+            'position': self._coerce_point_to_string(query),
+            'lang': self.format_string % lang
+
+        }
+
+        url = "?".join((
+            (self.api + "position"),
+            "&".join(("=".join(('key', self.api_key)), urlencode(params)))
+        ))
+
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_reverse_json(
+            self._call_geocoder(url, timeout=timeout),
+        )
+
+
+    @staticmethod
+    def _parse_reverse_json(resources):
+        """
+        Parses a location from a single-result reverse API call.
+        """
+
+        if resources.get('error') == "21":
+            raise exc.GeocoderQueryError("Invalid coordinates")
+
+        def parse_resource(resource):
+            """
+            Parse resource to return Geopy Location object
+            """
+            words = resource['words']
+            words = join_filter(".", [words[0], words[1], words[2]])
+            position = resource['position']
+            latitude, longitude = position[0], position[1]
+
+            if latitude and longitude:
+                latitude = float(latitude)
+                longitude = float(longitude)
+
+            return Location(words, (latitude, longitude), resource)
+
+        return parse_resource(resources)
+
+
+
+
+
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/photon.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/photon.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/photon.py	(revision 1126)
@@ -0,0 +1,225 @@
+"""
+:class:`.Photon` geocoder.
+"""
+
+from geopy.compat import urlencode, string_compare
+from geopy.geocoders.base import (
+    Geocoder,
+    DEFAULT_FORMAT_STRING,
+    DEFAULT_TIMEOUT,
+    DEFAULT_SCHEME
+)
+from geopy.location import Location
+from geopy.util import logger
+
+
+__all__ = ("Photon", )
+
+
+class Photon(Geocoder):  # pylint: disable=W0223
+    """
+    Geocoder using Photon geocoding service (data based on OpenStreetMap and
+    service provided by Komoot on https://photon.komoot.de).
+    Documentation at https://github.com/komoot/photon
+    """
+
+    def __init__(
+            self,
+            format_string=DEFAULT_FORMAT_STRING,
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            domain='photon.komoot.de'
+    ):   # pylint: disable=R0913
+        """
+        Initialize a Photon/Komoot geocoder which aims to let you "search as
+        you type with OpenStreetMap". No API Key is needed by this platform.
+
+        :param string format_string: String containing '%s' where
+            the string to geocode should be interpolated before querying
+            the geocoder. For example: '%s, Mountain View, CA'. The default
+            is just '%s'.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+        :param string domain: Should be the localized Photon domain to
+            connect to. The default is 'photon.komoot.de', but you
+            can change it to a domain of your own.
+        """
+        super(Photon, self).__init__(
+            format_string, scheme, timeout, proxies
+        )
+        self.domain = domain.strip('/')
+        self.api = "%s://%s/api" % (self.scheme, self.domain)
+        self.reverse_api = "%s://%s/reverse" % (self.scheme, self.domain)
+
+    def geocode(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+            location_bias=None,
+            language=False,
+            osm_tag=None
+        ):  # pylint: disable=W0221
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        :param location_bias: The coordinates to used as location bias.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param string language: Preferred language in which to return results.
+
+        :param osm_tag: The expression to filter (include/exclude) by key and/
+            or value, str as 'key:value' or list/set of str if multiple filters
+            are requiered as ['key:!val', '!key', ':!value']
+
+        """
+        params = {
+            'q': self.format_string % query
+        }
+        if exactly_one:
+            params['limit'] = 1
+        if language:
+            params['lang'] = language
+        if location_bias:
+            try:
+                lat, lon = [x.strip() for x
+                            in self._coerce_point_to_string(location_bias)
+                            .split(',')]
+                params['lon'] = lon
+                params['lat'] = lat
+            except ValueError:
+                raise ValueError(("Location bias must be a"
+                                  " coordinate pair or Point"))
+        if osm_tag:
+            if isinstance(osm_tag, string_compare):
+                params['osm_tag'] = osm_tag
+            else:
+                try:
+                    params['osm_tag'] = '&osm_tag='.join(osm_tag)
+                except ValueError:
+                    raise ValueError(
+                        "osm_tag must be a string expression or "
+                        "a set/list of string expressions"
+                    )
+        url = "?".join((self.api, urlencode(params)))
+
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one
+        )
+
+    def reverse(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+            language=False,
+            osm_tag=None
+        ):  # pylint: disable=W0221
+        """
+        Returns a reverse geocoded location.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        :param string language: Preferred language in which to return results.
+
+        :param osm_tag: The expression to filter (include/exclude) by key and/
+            or value, str as 'key:value' or list/set of str if multiple filters
+            are requiered as ['key:!val', '!key', ':!value']
+        """
+        try:
+            lat, lon = [x.strip() for x in
+                        self._coerce_point_to_string(query).split(',')]
+        except ValueError:
+            raise ValueError("Must be a coordinate pair or Point")
+        params = {
+            'lat': lat,
+            'lon': lon,
+        }
+        if exactly_one:
+            params['limit'] = 1
+        if language:
+            params['lang'] = language
+        if osm_tag:
+            if isinstance(osm_tag, string_compare):
+                params['osm_tag'] = osm_tag
+            else:
+                try:
+                    params['osm_tag'] = '&osm_tag='.join(osm_tag)
+                except ValueError:
+                    raise ValueError(("osm_tag must be a string expression or "
+                                      "a set/list of string expressions"))
+        url = "?".join((self.reverse_api, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    @classmethod
+    def _parse_json(cls, resources, exactly_one=True):
+        """
+        Parse display name, latitude, and longitude from a JSON response.
+        """
+        if not len(resources):  # pragma: no cover
+            return None
+        if exactly_one:
+            return cls.parse_resource(resources['features'][0])
+        else:
+            return [cls.parse_resource(resource) for resource
+                    in resources['features']]
+
+    @classmethod
+    def parse_resource(cls, resource):
+        """
+        Return location and coordinates tuple from dict.
+        """
+        name_elements = ['name', 'housenumber', 'street',
+                         'postcode', 'street', 'city',
+                         'state', 'country']
+        name = [resource.get(k) for k
+                in name_elements if resource.get(k)]
+        location = ', '.join(name)
+
+        latitude = resource['geometry']['coordinates'][1] or None
+        longitude = resource['geometry']['coordinates'][0] or None
+        if latitude and longitude:
+            latitude = float(latitude)
+            longitude = float(longitude)
+
+        return Location(location, (latitude, longitude), resource)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/arcgis.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/arcgis.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/arcgis.py	(revision 1126)
@@ -0,0 +1,249 @@
+"""
+:class:`.ArcGIS` geocoder.
+"""
+
+import json
+from time import time
+from geopy.compat import urlencode, Request
+
+from geopy.geocoders.base import Geocoder, DEFAULT_SCHEME, DEFAULT_TIMEOUT, \
+    DEFAULT_WKID
+from geopy.exc import GeocoderServiceError, GeocoderAuthenticationFailure
+from geopy.exc import ConfigurationError
+from geopy.location import Location
+from geopy.util import logger
+
+
+__all__ = ("ArcGIS", )
+
+
+class ArcGIS(Geocoder):  # pylint: disable=R0921,R0902,W0223
+    """
+    Geocoder using the ERSI ArcGIS API. Documentation at:
+        https://developers.arcgis.com/rest/geocode/api-reference/overview-world-geocoding-service.htm
+    """
+
+    _TOKEN_EXPIRED = 498
+    _MAX_RETRIES = 3
+    auth_api = 'https://www.arcgis.com/sharing/generateToken'
+
+    def __init__(self, username=None, password=None, referer=None, # pylint: disable=R0913
+                 token_lifetime=60, scheme=DEFAULT_SCHEME,
+                 timeout=DEFAULT_TIMEOUT, proxies=None,
+                user_agent=None):
+        """
+        Create a ArcGIS-based geocoder.
+
+            .. versionadded:: 0.97
+
+        :param string username: ArcGIS username. Required if authenticated
+            mode is desired.
+
+        :param string password: ArcGIS password. Required if authenticated
+            mode is desired.
+
+        :param string referer: Required if authenticated mode is desired.
+            'Referer' HTTP header to send with each request,
+            e.g., 'http://www.example.com'. This is tied to an issued token,
+            so fielding queries for multiple referrers should be handled by
+            having multiple ArcGIS geocoder instances.
+
+        :param int token_lifetime: Desired lifetime, in minutes, of an
+            ArcGIS-issued token.
+
+        :param string scheme: Desired scheme. If authenticated mode is in use,
+            it must be 'https'.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+        """
+        super(ArcGIS, self).__init__(
+            scheme=scheme, timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        if username or password or referer:
+            if not (username and password and referer):
+                raise ConfigurationError(
+                    "Authenticated mode requires username,"
+                    " password, and referer"
+                )
+            if self.scheme != 'https':
+                raise ConfigurationError(
+                    "Authenticated mode requires scheme of 'https'"
+                )
+            self._base_call_geocoder = self._call_geocoder
+            self._call_geocoder = self._authenticated_call_geocoder
+
+        self.username = username
+        self.password = password
+        self.referer = referer
+
+        self.token = None
+        self.token_lifetime = token_lifetime * 60 # store in seconds
+        self.token_expiry = None
+        self.retry = 1
+
+        self.api = (
+            '%s://geocode.arcgis.com/arcgis/rest/services/'
+            'World/GeocodeServer/find' % self.scheme
+        )
+        self.reverse_api = (
+            '%s://geocode.arcgis.com/arcgis/rest/services/'
+            'World/GeocodeServer/reverseGeocode' % self.scheme
+        )
+
+    def _authenticated_call_geocoder(self, url, timeout=None):
+        """
+        Wrap self._call_geocoder, handling tokens.
+        """
+        if self.token is None or int(time()) > self.token_expiry:
+            self._refresh_authentication_token()
+        request = Request(
+            "&token=".join((url, self.token)), # no urlencoding
+            headers={"Referer": self.referer}
+        )
+        return self._base_call_geocoder(request, timeout=timeout)
+
+    def geocode(self, query, exactly_one=True, timeout=None):
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+        """
+        params = {'text': query, 'f': 'json'}
+        if exactly_one is True:
+            params['maxLocations'] = 1
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        response = self._call_geocoder(url, timeout=timeout)
+
+        # Handle any errors; recursing in the case of an expired token.
+        if 'error' in response:
+            if response['error']['code'] == self._TOKEN_EXPIRED:
+                self.retry += 1
+                self._refresh_authentication_token()
+                return self.geocode(
+                    query, exactly_one=exactly_one, timeout=timeout
+                )
+            raise GeocoderServiceError(str(response['error']))
+
+        # Success; convert from the ArcGIS JSON format.
+        if not len(response['locations']):
+            return None
+        geocoded = []
+        for resource in response['locations']:
+            geometry = resource['feature']['geometry']
+            geocoded.append(
+                Location(
+                    resource['name'], (geometry['y'], geometry['x']), resource
+                )
+            )
+        if exactly_one is True:
+            return geocoded[0]
+        return geocoded
+
+    def reverse(self, query, exactly_one=True, timeout=None, # pylint: disable=R0913,W0221
+                distance=None, wkid=DEFAULT_WKID):
+        """
+        Given a point, find an address.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s".
+
+        :param bool exactly_one: Return one result, or a list?
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        :param int distance: Distance from the query location, in meters,
+            within which to search. ArcGIS has a default of 100 meters, if not
+            specified.
+
+        :param string wkid: WKID to use for both input and output coordinates.
+        """
+        # ArcGIS is lon,lat; maintain lat,lon convention of geopy
+        point = self._coerce_point_to_string(query).split(",")
+        if wkid != DEFAULT_WKID:
+            location = {"x": point[1], "y": point[0], "spatialReference": wkid}
+        else:
+            location = ",".join((point[1], point[0]))
+        params = {'location': location, 'f': 'json', 'outSR': wkid}
+        if distance is not None:
+            params['distance'] = distance
+        url = "?".join((self.reverse_api, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        response = self._call_geocoder(url, timeout=timeout)
+        if not len(response):
+            return None
+        if 'error' in response:
+            if response['error']['code'] == self._TOKEN_EXPIRED:
+                self.retry += 1
+                self._refresh_authentication_token()
+                return self.reverse(query, exactly_one=exactly_one,
+                                    timeout=timeout, distance=distance,
+                                    wkid=wkid)
+            raise GeocoderServiceError(str(response['error']))
+        address = (
+            "%(Address)s, %(City)s, %(Region)s %(Postal)s,"
+            " %(CountryCode)s" % response['address']
+        )
+        return Location(
+            address,
+            (response['location']['y'], response['location']['x']),
+            response['address']
+        )
+
+    def _refresh_authentication_token(self):
+        """
+        POST to ArcGIS requesting a new token.
+        """
+        if self.retry == self._MAX_RETRIES:
+            raise GeocoderAuthenticationFailure(
+                'Too many retries for auth: %s' % self.retry
+            )
+        token_request_arguments = {
+            'username': self.username,
+            'password': self.password,
+            'expiration': self.token_lifetime,
+            'f': 'json'
+        }
+        token_request_arguments = "&".join([
+            "%s=%s" % (key, val)
+            for key, val
+            in token_request_arguments.items()
+        ])
+        url = "&".join((
+            "?".join((self.auth_api, token_request_arguments)),
+            urlencode({'referer': self.referer})
+        ))
+        logger.debug(
+            "%s._refresh_authentication_token: %s",
+            self.__class__.__name__, url
+        )
+        self.token_expiry = int(time()) + self.token_lifetime
+        response = self._base_call_geocoder(url)
+        if not 'token' in response:
+            raise GeocoderAuthenticationFailure(
+                'Missing token in auth request.'
+                'Request URL: %s; response JSON: %s' %
+                (url, json.dumps(response))
+            )
+        self.retry = 0
+        self.token = response['token']
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/base.py	(revision 1126)
@@ -0,0 +1,207 @@
+"""
+:class:`.GeoCoder` base object from which other geocoders are templated.
+"""
+
+from ssl import SSLError
+from socket import timeout as SocketTimeout
+import json
+
+from geopy.compat import (
+    string_compare,
+    HTTPError,
+    py3k,
+    urlopen as urllib_urlopen,
+    build_opener,
+    ProxyHandler,
+    URLError,
+    install_opener,
+    Request,
+)
+from geopy.point import Point
+from geopy.exc import (
+    GeocoderServiceError,
+    ConfigurationError,
+    GeocoderTimedOut,
+    GeocoderAuthenticationFailure,
+    GeocoderQuotaExceeded,
+    GeocoderQueryError,
+    GeocoderInsufficientPrivileges,
+    GeocoderUnavailable,
+    GeocoderParseError,
+)
+from geopy.util import decode_page, __version__
+
+
+__all__ = (
+    "Geocoder",
+    "DEFAULT_FORMAT_STRING",
+    "DEFAULT_SCHEME",
+    "DEFAULT_TIMEOUT",
+    "DEFAULT_WKID",
+)
+
+
+DEFAULT_FORMAT_STRING = '%s'
+DEFAULT_SCHEME = 'https'
+DEFAULT_TIMEOUT = 1
+DEFAULT_WKID = 4326
+DEFAULT_USER_AGENT = "geopy/%s" % __version__
+
+
+ERROR_CODE_MAP = {
+    400: GeocoderQueryError,
+    401: GeocoderAuthenticationFailure,
+    402: GeocoderQuotaExceeded,
+    403: GeocoderInsufficientPrivileges,
+    407: GeocoderAuthenticationFailure,
+    412: GeocoderQueryError,
+    413: GeocoderQueryError,
+    414: GeocoderQueryError,
+    502: GeocoderServiceError,
+    503: GeocoderTimedOut,
+    504: GeocoderTimedOut
+}
+
+
+class Geocoder(object): # pylint: disable=R0921
+    """
+    Template object for geocoders.
+    """
+
+    def __init__(
+            self,
+            format_string=DEFAULT_FORMAT_STRING,
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None
+        ):
+        """
+        Mostly-common geocoder validation, proxies, &c. Not all geocoders
+        specify format_string and such.
+        """
+        self.format_string = format_string
+        self.scheme = scheme
+        if self.scheme not in ('http', 'https'): # pragma: no cover
+            raise ConfigurationError(
+                'Supported schemes are `http` and `https`.'
+            )
+        self.proxies = proxies
+        self.timeout = timeout
+        self.headers = {'User-Agent': user_agent or DEFAULT_USER_AGENT}
+
+        if self.proxies:
+            install_opener(
+                build_opener(
+                    ProxyHandler(self.proxies)
+                )
+            )
+        self.urlopen = urllib_urlopen
+
+    @staticmethod
+    def _coerce_point_to_string(point):
+        """
+        Do the right thing on "point" input. For geocoders with reverse
+        methods.
+        """
+        if isinstance(point, Point):
+            return ",".join((str(point.latitude), str(point.longitude)))
+        elif isinstance(point, (list, tuple)):
+            return ",".join((str(point[0]), str(point[1]))) # -altitude
+        elif isinstance(point, string_compare):
+            return point
+        else: # pragma: no cover
+            raise ValueError("Invalid point")
+
+    def _parse_json(self, page, exactly_one): # pragma: no cover
+        """
+        Template for subclasses
+        """
+        raise NotImplementedError()
+
+    def _call_geocoder(
+            self,
+            url,
+            timeout=None,
+            raw=False,
+            requester=None,
+            deserializer=json.loads,
+            **kwargs
+        ):
+        """
+        For a generated query URL, get the results.
+        """
+        requester = requester or self.urlopen
+
+        if not requester:
+            req = Request(url=url, headers=self.headers)
+        else:
+            # work around for placefinder's use of requests
+            req = url
+
+        try:
+            page = requester(req, timeout=(timeout or self.timeout), **kwargs)
+        except Exception as error: # pylint: disable=W0703
+            message = (
+                str(error) if not py3k
+                else (
+                    str(error.args[0])
+                    if len(error.args)
+                    else str(error)
+                )
+            )
+            if hasattr(self, '_geocoder_exception_handler'):
+                self._geocoder_exception_handler(error, message) # pylint: disable=E1101
+            if isinstance(error, HTTPError):
+                code = error.getcode()
+                try:
+                    raise ERROR_CODE_MAP[code](message)
+                except KeyError:
+                    raise GeocoderServiceError(message)
+            elif isinstance(error, URLError):
+                if "timed out" in message:
+                    raise GeocoderTimedOut('Service timed out')
+                elif "unreachable" in message:
+                    raise GeocoderUnavailable('Service not available')
+            elif isinstance(error, SocketTimeout):
+                raise GeocoderTimedOut('Service timed out')
+            elif isinstance(error, SSLError):
+                if "timed out" in message:
+                    raise GeocoderTimedOut('Service timed out')
+            raise GeocoderServiceError(message)
+
+        if hasattr(page, 'getcode'):
+            status_code = page.getcode()
+        elif hasattr(page, 'status_code'):
+            status_code = page.status_code
+        else:
+            status_code = None
+        if status_code in ERROR_CODE_MAP:
+            raise ERROR_CODE_MAP[page.status_code]("\n%s" % decode_page(page))
+
+        if raw:
+            return page
+
+        page = decode_page(page)
+
+        if deserializer is not None:
+            try:
+                return deserializer(page)
+            except ValueError:
+                raise GeocoderParseError(
+                    "Could not deserialize using deserializer:\n%s" % page
+                )
+        else:
+            return page
+
+    def geocode(self, query, exactly_one=True, timeout=None):
+        """
+        Implemented in subclasses.
+        """
+        raise NotImplementedError()
+
+    def reverse(self, query, exactly_one=True, timeout=None):
+        """
+        Implemented in subclasses.
+        """
+        raise NotImplementedError()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/geocodefarm.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/geocodefarm.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/geocodefarm.py	(revision 1126)
@@ -0,0 +1,172 @@
+"""
+:class:`.GeocodeFarm` geocoder.
+"""
+
+from geopy.geocoders.base import Geocoder, DEFAULT_FORMAT_STRING, \
+    DEFAULT_TIMEOUT
+from geopy.location import Location
+from geopy.util import logger
+from geopy.exc import GeocoderAuthenticationFailure, GeocoderQuotaExceeded, \
+    GeocoderServiceError
+from geopy.compat import urlencode
+
+
+__all__ = ("GeocodeFarm", )
+
+
+class GeocodeFarm(Geocoder):
+    """
+    Geocoder using the GeocodeFarm API. Documentation at:
+        https://www.geocode.farm/geocoding/free-api-documentation/
+    """
+
+    def __init__(
+            self,
+            api_key=None,
+            format_string=DEFAULT_FORMAT_STRING,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):  # pylint: disable=R0913
+        """
+        Create a geocoder for GeocodeFarm.
+
+            .. versionadded:: 0.99
+
+        :param string api_key: The API key required by GeocodeFarm to perform
+            geocoding requests.
+
+        :param string format_string: String containing '%s' where the
+            string to geocode should be interpolated before querying the
+            geocoder. For example: '%s, Mountain View, CA'. The default
+            is just '%s'.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+        """
+        super(GeocodeFarm, self).__init__(
+            format_string, 'https', timeout, proxies, user_agent=user_agent
+        )
+        self.api_key = api_key
+        self.format_string = format_string
+        self.api = (
+            "%s://www.geocode.farm/v3/json/forward/" % self.scheme
+        )
+        self.reverse_api = (
+            "%s://www.geocode.farm/v3/json/reverse/" % self.scheme
+        )
+
+    def geocode(self, query, exactly_one=True, timeout=None):
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+        """
+        params = {
+            'addr': self.format_string % query,
+        }
+        if self.api_key:
+            params['key'] = self.api_key
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    def reverse(self, query, exactly_one=True, timeout=None):
+        """
+        Returns a reverse geocoded location.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available. GeocodeFarm's API will always return at most one
+            result.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+        """
+        try:
+            lat, lon = [
+                x.strip() for x in
+                self._coerce_point_to_string(query).split(',')
+            ]
+        except ValueError:
+            raise ValueError("Must be a coordinate pair or Point")
+        params = {
+            'lat': lat,
+            'lon': lon
+        }
+        if self.api_key:
+            params['key'] = self.api_key
+        url = "?".join((self.reverse_api, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    @staticmethod
+    def parse_code(results):
+        """
+        Parse each resource.
+        """
+        places = []
+        for result in results.get('RESULTS'):
+            coordinates = result.get('COORDINATES', {})
+            address = result.get('ADDRESS', {})
+            latitude = coordinates.get('latitude', None)
+            longitude = coordinates.get('longitude', None)
+            placename = address.get('address_returned', None)
+            if placename is None:
+                placename = address.get('address', None)
+            if latitude and longitude:
+                latitude = float(latitude)
+                longitude = float(longitude)
+            places.append(Location(placename, (latitude, longitude), result))
+        return places
+
+    def _parse_json(self, api_result, exactly_one):
+        if api_result is None:
+            return None
+        geocoding_results = api_result["geocoding_results"]
+        self._check_for_api_errors(geocoding_results)
+
+        places = self.parse_code(geocoding_results)
+        if exactly_one is True:
+            return places[0]
+        else:
+            return places
+
+    @staticmethod
+    def _check_for_api_errors(geocoding_results):
+        """
+        Raise any exceptions if there were problems reported
+        in the api response.
+        """
+        status_result = geocoding_results.get("STATUS", {})
+        api_call_success = status_result.get("status", "") == "SUCCESS"
+        if not api_call_success:
+            access_error = status_result.get("access")
+            access_error_to_exception = {
+                'API_KEY_INVALID': GeocoderAuthenticationFailure,
+                'OVER_QUERY_LIMIT': GeocoderQuotaExceeded,
+            }
+            exception_cls = access_error_to_exception.get(
+                access_error, GeocoderServiceError
+            )
+            raise exception_cls(access_error)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/placefinder.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/placefinder.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/placefinder.py	(revision 1126)
@@ -0,0 +1,218 @@
+"""
+:class:`.YahooPlaceFinder` geocoder.
+"""
+
+from functools import partial
+
+try:
+    from requests import get, Request
+    from requests_oauthlib import OAuth1
+    requests_missing = False
+except ImportError:
+    requests_missing = True
+
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT
+from geopy.exc import GeocoderParseError
+from geopy.location import Location
+from geopy.compat import string_compare, py3k
+
+
+__all__ = ("YahooPlaceFinder", )
+
+
+class YahooPlaceFinder(Geocoder): # pylint: disable=W0223
+    """
+    Geocoder that utilizes the Yahoo! BOSS PlaceFinder API. Documentation at:
+        https://developer.yahoo.com/boss/geo/docs/
+    """
+
+    def __init__(
+            self,
+            consumer_key,
+            consumer_secret,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):  # pylint: disable=R0913
+        """
+        :param string consumer_key: Key provided by Yahoo.
+
+        :param string consumer_secret: Secret corresponding to the key
+            provided by Yahoo.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+        :param dict proxies: If specified, routes this geocoder"s requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+        """
+        if requests_missing:
+            raise ImportError(
+                'requests-oauthlib is needed for YahooPlaceFinder.'
+                ' Install with `pip install geopy -e ".[placefinder]"`.'
+            )
+        super(YahooPlaceFinder, self).__init__(
+            timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        self.consumer_key = (
+            unicode(consumer_key)
+            if not py3k
+            else str(consumer_key)
+        )
+        self.consumer_secret = (
+            unicode(consumer_secret)
+            if not py3k
+            else str(consumer_secret)
+        )
+        self.auth = OAuth1(
+            client_key=self.consumer_key,
+            client_secret=self.consumer_secret,
+            signature_method="HMAC-SHA1",
+            signature_type="AUTH_HEADER",
+        )
+        self.api = "https://yboss.yahooapis.com/geo/placefinder"
+
+    @staticmethod
+    def _filtered_results(results, min_quality, valid_country_codes):
+        """
+        Returns only the results that meet the minimum quality threshold
+        and are located in expected countries.
+        """
+        if min_quality:
+            results = [
+                loc
+                for loc in results
+                if int(loc.raw["quality"]) > min_quality
+            ]
+
+        if valid_country_codes:
+            results = [
+                loc
+                for loc in results
+                if loc.raw["countrycode"] in valid_country_codes
+            ]
+
+        return results
+
+    def _parse_response(self, content):
+        """
+        Returns the parsed result of a PlaceFinder API call.
+        """
+        try:
+            placefinder = (
+                content["bossresponse"]["placefinder"]
+            )
+            if not len(placefinder) or not len(placefinder.get("results", [])):
+                return None
+            results = [
+                Location(
+                    self.humanize(place),
+                    (float(place["latitude"]), float(place["longitude"])),
+                    raw=place
+                )
+                for place in placefinder["results"]
+            ]
+        except (KeyError, ValueError):
+            raise GeocoderParseError("Error parsing PlaceFinder result")
+
+        return results
+
+    @staticmethod
+    def humanize(location):
+        """
+        Returns a human readable representation of a raw PlaceFinder location
+        """
+        return ", ".join([
+            location[line]
+            for line in ["line1", "line2", "line3", "line4"]
+            if location[line]
+        ])
+
+    def geocode(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+            min_quality=0,
+            reverse=False,
+            valid_country_codes=None,
+            with_timezone=False,
+        ):  # pylint: disable=W0221,R0913
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int min_quality:
+
+        :param bool reverse:
+
+        :param valid_country_codes:
+        :type valid_country_codes: list or tuple
+
+        :param bool with_timezone: Include the timezone in the response's
+            `raw` dictionary (as `timezone`).
+        """
+        params = {
+            "location": query,
+            "flags": "J", # JSON
+        }
+
+        if reverse is True:
+            params["gflags"] = "R"
+        if exactly_one is True:
+            params["count"] = "1"
+        if with_timezone is True:
+            params['flags'] += 'T' #Return timezone
+
+        response = self._call_geocoder(
+            self.api,
+            timeout=timeout,
+            requester=get,
+            params=params,
+            auth=self.auth,
+        )
+        results = self._parse_response(response)
+        if results is None:
+            return None
+
+        results = self._filtered_results(
+            results,
+            min_quality,
+            valid_country_codes,
+        )
+
+        if exactly_one:
+            return results[0]
+        else:
+            return results
+
+    def reverse(self, query, exactly_one=True, timeout=None):
+        """
+        Returns a reverse geocoded location using Yahoo"s PlaceFinder API.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+        """
+        query = self._coerce_point_to_string(query)
+        if isinstance(query, string_compare):
+            query = query.replace(" ", "") # oauth signature failure; todo
+        return self.geocode(
+            query,
+            exactly_one=exactly_one,
+            timeout=timeout,
+            reverse=True
+        )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/databc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/databc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/databc.py	(revision 1126)
@@ -0,0 +1,115 @@
+"""
+:class:`.DataBC` geocoder.
+"""
+
+from geopy.compat import urlencode
+
+from geopy.geocoders.base import Geocoder, DEFAULT_SCHEME, DEFAULT_TIMEOUT
+from geopy.exc import GeocoderQueryError
+from geopy.location import Location
+from geopy.util import logger
+
+
+__all__ = ("DataBC", )
+
+
+class DataBC(Geocoder):
+    """
+    Geocoder using the Physical Address Geocoder from DataBC. Documentation at:
+        http://www.data.gov.bc.ca/dbc/geographic/locate/geocoding.page
+    """
+
+    def __init__(self, scheme=DEFAULT_SCHEME, timeout=DEFAULT_TIMEOUT, proxies=None, user_agent=None):
+        """
+        Create a DataBC-based geocoder.
+
+        :param string scheme: Desired scheme.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+        """
+        super(DataBC, self).__init__(
+            scheme=scheme, timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        self.api = '%s://apps.gov.bc.ca/pub/geocoder/addresses.geojson' % self.scheme
+
+    def geocode(
+            self,
+            query,
+            max_results=25,
+            set_back=0,
+            location_descriptor='any',
+            exactly_one=True,
+            timeout=None,
+        ):
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param int max_results: The maximum number of resutls to request.
+
+        :param float set_back: The distance to move the accessPoint away
+            from the curb (in meters) and towards the interior of the parcel.
+            location_descriptor must be set to accessPoint for set_back to
+            take effect.
+
+        :param string location_descriptor: The type of point requested. It
+            can be any, accessPoint, frontDoorPoint, parcelPoint,
+            rooftopPoint and routingPoint.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+        """
+        params = {'addressString': query}
+        if set_back != 0:
+            params['setBack'] = set_back
+        if location_descriptor not in ['any',
+                                       'accessPoint',
+                                       'frontDoorPoint',
+                                       'parcelPoint',
+                                       'rooftopPoint',
+                                       'routingPoint']:
+            raise GeocoderQueryError(
+                "You did not provided a location_descriptor "
+                "the webservice can consume. It should be any, accessPoint, "
+                "frontDoorPoint, parcelPoint, rooftopPoint or routingPoint."
+            )
+        params['locationDescriptor'] = location_descriptor
+        if exactly_one is True:
+            max_results = 1
+        params['maxResults'] = max_results
+
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        response = self._call_geocoder(url, timeout=timeout)
+
+        # Success; convert from GeoJSON
+        if not len(response['features']):
+            return None
+        geocoded = []
+        for feature in response['features']:
+            geocoded.append(self._parse_feature(feature))
+        if exactly_one is True:
+            return geocoded[0]
+        return geocoded
+
+    @staticmethod
+    def _parse_feature(feature):
+        properties = feature['properties']
+        coordinates = feature['geometry']['coordinates']
+        return Location(
+            properties['fullAddress'], (coordinates[1], coordinates[0]),
+            properties
+        )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/bing.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/bing.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/bing.py	(revision 1126)
@@ -0,0 +1,243 @@
+"""
+:class:`.Bing` geocoder.
+"""
+
+from geopy.compat import urlencode
+from geopy.geocoders.base import Geocoder, DEFAULT_FORMAT_STRING, \
+    DEFAULT_TIMEOUT, DEFAULT_SCHEME
+from geopy.location import Location
+from geopy.exc import (
+    GeocoderAuthenticationFailure,
+    GeocoderQuotaExceeded,
+    GeocoderInsufficientPrivileges,
+    GeocoderUnavailable,
+    GeocoderServiceError,
+)
+from geopy.util import logger, join_filter
+
+
+__all__ = ("Bing", )
+
+
+class Bing(Geocoder):
+    """
+    Geocoder using the Bing Maps Locations API. Documentation at:
+        https://msdn.microsoft.com/en-us/library/ff701715.aspx
+    """
+
+    structured_query_params = {
+        'addressLine',
+        'locality',
+        'adminDistrict',
+        'countryRegion',
+        'postalCode',
+    }
+
+    def __init__(
+            self,
+            api_key,
+            format_string=DEFAULT_FORMAT_STRING,
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):  # pylint: disable=R0913
+        """Initialize a customized Bing geocoder with location-specific
+        address information and your Bing Maps API key.
+
+        :param string api_key: Should be a valid Bing Maps API key.
+
+        :param string format_string: String containing '%s' where the
+            string to geocode should be interpolated before querying the
+            geocoder. For example: '%s, Mountain View, CA'. The default
+            is just '%s'.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+            .. versionadded:: 0.97
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+            .. versionadded:: 0.97
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+        """
+        super(Bing, self).__init__(format_string, scheme, timeout, proxies, user_agent=user_agent)
+        self.api_key = api_key
+        self.api = "%s://dev.virtualearth.net/REST/v1/Locations" % self.scheme
+
+    def geocode(
+            self,
+            query,
+            exactly_one=True,
+            user_location=None,
+            timeout=None,
+            culture=None,
+            include_neighborhood=None,
+            include_country_code=False
+        ):  # pylint: disable=W0221
+        """
+        Geocode an address.
+
+        :param string query: The address or query you wish to geocode.
+
+            For a structured query, provide a dictionary whose keys
+            are one of: `addressLine`, `locality` (city), `adminDistrict` (state), `countryRegion`, or
+            `postalcode`.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param user_location: Prioritize results closer to
+            this location.
+
+            .. versionadded:: 0.96
+
+        :type user_location: :class:`geopy.point.Point`
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+
+        :param string culture: Affects the language of the response,
+            must be a two-letter country code.
+
+            .. versionadded:: 1.4.0
+
+        :param boolean include_neighborhood: Sets whether to include the
+            neighborhood field in the response.
+
+            .. versionadded:: 1.4.0
+
+        :param boolean include_country_code: Sets whether to include the
+            two-letter ISO code of the country in the response (field name
+            'countryRegionIso2').
+
+            .. versionadded:: 1.4.0
+        """
+        if isinstance(query, dict):
+            params = {
+                key: val
+                for key, val
+                in query.items()
+                if key in self.structured_query_params
+            }
+            params['key'] = self.api_key
+        else:
+            params = {
+                'query': self.format_string % query,
+                'key': self.api_key
+            }
+        if user_location:
+            params['userLocation'] = ",".join(
+                (str(user_location.latitude), str(user_location.longitude))
+            )
+        if exactly_one is True:
+            params['maxResults'] = 1
+        if culture:
+            params['culture'] = culture
+        if include_neighborhood is not None:
+            params['includeNeighborhood'] = include_neighborhood
+        if include_country_code:
+            params['include'] = 'ciso2'  # the only acceptable value
+
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one
+        )
+
+    def reverse(self, query, exactly_one=True, timeout=None):
+        """
+        Reverse geocode a point.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s".
+
+        :param bool exactly_one: Return one result, or a list?
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+        """
+        point = self._coerce_point_to_string(query)
+        params = {'key': self.api_key}
+        url = "%s/%s?%s" % (
+            self.api, point, urlencode(params))
+
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one
+        )
+
+    @staticmethod
+    def _parse_json(doc, exactly_one=True):  # pylint: disable=W0221
+        """
+        Parse a location name, latitude, and longitude from an JSON response.
+        """
+        status_code = doc.get("statusCode", 200)
+        if status_code != 200:
+            err = doc.get("errorDetails", "")
+            if status_code == 401:
+                raise GeocoderAuthenticationFailure(err)
+            elif status_code == 403:
+                raise GeocoderInsufficientPrivileges(err)
+            elif status_code == 429:
+                raise GeocoderQuotaExceeded(err)
+            elif status_code == 503:
+                raise GeocoderUnavailable(err)
+            else:
+                raise GeocoderServiceError(err)
+
+        resources = doc['resourceSets'][0]['resources']
+        if resources is None or not len(resources): # pragma: no cover
+            return None
+
+        def parse_resource(resource):
+            """
+            Parse each return object.
+            """
+            stripchars = ", \n"
+            addr = resource['address']
+
+            address = addr.get('addressLine', '').strip(stripchars)
+            city = addr.get('locality', '').strip(stripchars)
+            state = addr.get('adminDistrict', '').strip(stripchars)
+            zipcode = addr.get('postalCode', '').strip(stripchars)
+            country = addr.get('countryRegion', '').strip(stripchars)
+
+            city_state = join_filter(", ", [city, state])
+            place = join_filter(" ", [city_state, zipcode])
+            location = join_filter(", ", [address, place, country])
+
+            latitude = resource['point']['coordinates'][0] or None
+            longitude = resource['point']['coordinates'][1] or None
+            if latitude and longitude:
+                latitude = float(latitude)
+                longitude = float(longitude)
+
+            return Location(location, (latitude, longitude), resource)
+
+        if exactly_one:
+            return parse_resource(resources[0])
+        else:
+            return [parse_resource(resource) for resource in resources]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/openmapquest.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/openmapquest.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/openmapquest.py	(revision 1126)
@@ -0,0 +1,124 @@
+"""
+:class:`.OpenMapQuest` geocoder.
+"""
+
+from geopy.compat import urlencode
+from geopy.geocoders.base import (
+    Geocoder,
+    DEFAULT_FORMAT_STRING,
+    DEFAULT_TIMEOUT,
+    DEFAULT_SCHEME
+)
+from geopy.location import Location
+from geopy.util import logger
+
+
+__all__ = ("OpenMapQuest", )
+
+
+class OpenMapQuest(Geocoder): # pylint: disable=W0223
+    """
+    Geocoder using MapQuest Open Platform Web Services. Documentation at:
+        http://developer.mapquest.com/web/products/open/geocoding-service
+    """
+
+    def __init__(
+            self,
+            api_key=None,
+            format_string=DEFAULT_FORMAT_STRING,
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):  # pylint: disable=R0913
+        """
+        Initialize an Open MapQuest geocoder with location-specific
+        address information. No API Key is needed by the Nominatim based
+        platform.
+
+        :param string format_string: String containing '%s' where
+            the string to geocode should be interpolated before querying
+            the geocoder. For example: '%s, Mountain View, CA'. The default
+            is just '%s'.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+            .. versionadded:: 0.97
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+            .. versionadded:: 0.97
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+        """
+        super(OpenMapQuest, self).__init__(
+            format_string, scheme, timeout, proxies, user_agent=user_agent
+        )
+        self.api_key = api_key or ''
+        self.api = "%s://open.mapquestapi.com/nominatim/v1/search" \
+                    "?format=json" % self.scheme
+
+    def geocode(self, query, exactly_one=True, timeout=None): # pylint: disable=W0221
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+        """
+        params = {
+            'q': self.format_string % query
+        }
+        if exactly_one:
+            params['maxResults'] = 1
+        url = "&".join((self.api, urlencode(params)))
+
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one
+        )
+
+    @classmethod
+    def _parse_json(cls, resources, exactly_one=True):
+        """
+        Parse display name, latitude, and longitude from an JSON response.
+        """
+        if not len(resources): # pragma: no cover
+            return None
+        if exactly_one:
+            return cls.parse_resource(resources[0])
+        else:
+            return [cls.parse_resource(resource) for resource in resources]
+
+    @classmethod
+    def parse_resource(cls, resource):
+        """
+        Return location and coordinates tuple from dict.
+        """
+        location = resource['display_name']
+
+        latitude = resource['lat'] or None
+        longitude = resource['lon'] or None
+        if latitude and longitude:
+            latitude = float(latitude)
+            longitude = float(longitude)
+
+        return Location(location, (latitude, longitude), resource)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/opencage.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/opencage.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/opencage.py	(revision 1126)
@@ -0,0 +1,206 @@
+"""
+:class:`.OpenCage` is the Opencagedata geocoder.
+"""
+
+from geopy.compat import urlencode
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT, DEFAULT_SCHEME
+from geopy.exc import (
+    GeocoderQueryError,
+    GeocoderQuotaExceeded,
+)
+from geopy.location import Location
+from geopy.util import logger
+
+
+__all__ = ("OpenCage", )
+
+
+class OpenCage(Geocoder):
+    """
+    Geocoder using the Open Cage Data API. Documentation at:
+        http://geocoder.opencagedata.com/api.html
+
+    ..versionadded:: 1.1.0
+    """
+
+    def __init__(
+            self,
+            api_key,
+            domain='api.opencagedata.com',
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+    ):  # pylint: disable=R0913
+        """
+        Initialize a customized Open Cage Data geocoder.
+
+        :param string api_key: The API key required by Open Cage Data
+            to perform geocoding requests. You can get your key here:
+            https://developer.opencagedata.com/
+
+        :param string domain: Currently it is 'api.opencagedata.com', can
+            be changed for testing purposes.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+        """
+        super(OpenCage, self).__init__(
+            scheme=scheme, timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+
+        self.api_key = api_key
+        self.domain = domain.strip('/')
+        self.scheme = scheme
+        self.api = '%s://%s/geocode/v1/json' % (self.scheme, self.domain)
+
+    def geocode(
+            self,
+            query,
+            bounds=None,
+            country=None,
+            language=None,
+            exactly_one=True,
+            timeout=None,
+    ):  # pylint: disable=W0221,R0913
+        """
+        Geocode a location query.
+
+        :param string query: The query string to be geocoded; this must
+            be URL encoded.
+
+        :param string language: an IETF format language code (such as `es`
+            for Spanish or pt-BR for Brazilian Portuguese); if this is
+            omitted a code of `en` (English) will be assumed by the remote
+            service.
+
+        :param string bounds: Provides the geocoder with a hint to the region
+            that the query resides in. This value will help the geocoder
+            but will not restrict the possible results to the supplied
+            region. The bounds parameter should be specified as 4
+            coordinate points forming the south-west and north-east
+            corners of a bounding box. For example,
+            `bounds=-0.563160,51.280430,0.278970,51.683979`.
+
+        :param string country: Provides the geocoder with a hint to the
+            country that the query resides in. This value will help the
+            geocoder but will not restrict the possible results to the
+            supplied country. The country code is a 3 character code as
+            defined by the ISO 3166-1 Alpha 3 standard.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+        params = {
+            'key': self.api_key,
+            'q': self.format_string % query,
+        }
+        if bounds:
+            params['bounds'] = bounds
+        if language:
+            params['language'] = language
+        if country:
+            params['country'] = country
+
+        url = "?".join((self.api, urlencode(params)))
+
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    def reverse(
+            self,
+            query,
+            language=None,
+            exactly_one=False,
+            timeout=None,
+    ):  # pylint: disable=W0221,R0913
+        """
+        Given a point, find an address.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param string language: The language in which to return results.
+
+        :param boolean exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+        params = {
+            'key': self.api_key,
+            'q': self._coerce_point_to_string(query),
+        }
+        if language:
+            params['language'] = language
+
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    def _parse_json(self, page, exactly_one=True):
+        '''Returns location, (latitude, longitude) from json feed.'''
+
+        places = page.get('results', [])
+        if not len(places):
+            self._check_status(page.get('status'))
+            return None
+
+        def parse_place(place):
+            '''Get the location, lat, lng from a single json place.'''
+            location = place.get('formatted')
+            latitude = place['geometry']['lat']
+            longitude = place['geometry']['lng']
+            return Location(location, (latitude, longitude), place)
+
+        if exactly_one:
+            return parse_place(places[0])
+        else:
+            return [parse_place(place) for place in places]
+
+    @staticmethod
+    def _check_status(status):
+        """
+        Validates error statuses.
+        """
+        status_code = status['code']
+        if status_code == 429:
+            # Rate limit exceeded
+            raise GeocoderQuotaExceeded(
+                'The given key has gone over the requests limit in the 24'
+                ' hour period or has submitted too many requests in too'
+                ' short a period of time.'
+            )
+        if status_code == 200:
+            # When there are no results, just return.
+            return
+
+        if status_code == 403:
+            raise GeocoderQueryError(
+                'Your request was denied.'
+            )
+        else:
+            raise GeocoderQueryError('Unknown error.')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/baidu.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/baidu.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/baidu.py	(revision 1126)
@@ -0,0 +1,215 @@
+"""
+:class:`.Baidu` is the Baidu Maps geocoder.
+"""
+
+from geopy.compat import urlencode
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT
+from geopy.exc import (
+    GeocoderQueryError,
+    GeocoderQuotaExceeded,
+    GeocoderAuthenticationFailure,
+)
+from geopy.location import Location
+from geopy.util import logger
+
+
+__all__ = ("Baidu", )
+
+
+class Baidu(Geocoder):
+    """
+    Geocoder using the Baidu Maps v2 API. Documentation at:
+        http://developer.baidu.com/map/webservice-geocoding.htm
+    """
+
+    def __init__(
+            self,
+            api_key,
+            scheme='http',
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None
+        ):
+        """
+        Initialize a customized Baidu geocoder using the v2 API.
+
+        .. versionadded:: 1.0.0
+
+        :param string api_key: The API key required by Baidu Map to perform
+            geocoding requests. API keys are managed through the Baidu APIs
+            console (http://lbsyun.baidu.com/apiconsole/key).
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is http and only http support.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+        """
+        super(Baidu, self).__init__(
+            scheme=scheme, timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        self.api_key = api_key
+        self.scheme = scheme
+        self.doc = {}
+        self.api = 'http://api.map.baidu.com/geocoder/v2/'
+
+
+    @staticmethod
+    def _format_components_param(components):
+        """
+        Format the components dict to something Baidu understands.
+        """
+        return "|".join(
+            (":".join(item)
+             for item in components.items()
+            )
+        )
+
+    def geocode(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None
+        ):
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+        params = {
+            'ak': self.api_key,
+            'output': 'json',
+            'address': self.format_string % query,
+        }
+
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one=exactly_one
+        )
+
+    def reverse(self, query, timeout=None):  # pylint: disable=W0221
+        """
+        Given a point, find an address.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+        params = {
+            'ak': self.api_key,
+            'output': 'json',
+            'location': self._coerce_point_to_string(query),
+        }
+
+        url = "?".join((self.api, urlencode(params)))
+
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_reverse_json(
+            self._call_geocoder(url, timeout=timeout)
+        )
+
+
+    @staticmethod
+    def _parse_reverse_json(page):
+        """
+        Parses a location from a single-result reverse API call.
+        """
+        place = page.get('result')
+
+        location = place.get('formatted_address').encode('utf-8')
+        latitude = place['location']['lat']
+        longitude = place['location']['lng']
+
+        return Location(location, (latitude, longitude), place)
+
+
+    def _parse_json(self, page, exactly_one=True):
+        """
+        Returns location, (latitude, longitude) from JSON feed.
+        """
+
+        place = page.get('result', None)
+
+        if not place:
+            self._check_status(page.get('status'))
+            return None
+
+        def parse_place(place):
+            """
+            Get the location, lat, lng from a single JSON place.
+            """
+            location = place.get('level')
+            latitude = place['location']['lat']
+            longitude = place['location']['lng']
+            return Location(location, (latitude, longitude), place)
+
+        if exactly_one:
+            return parse_place(place)
+        else:
+            return [parse_place(item) for item in place]
+
+    @staticmethod
+    def _check_status(status):
+        """
+        Validates error statuses.
+        """
+        if status == '0':
+            # When there are no results, just return.
+            return
+        if status == '1':
+            raise GeocoderQueryError(
+                'Internal server error.'
+            )
+        elif status == '2':
+            raise GeocoderQueryError(
+                'Invalid request.'
+            )
+        elif status == '3':
+            raise GeocoderAuthenticationFailure(
+                'Authentication failure.'
+            )
+        elif status == '4':
+            raise GeocoderQuotaExceeded(
+                'Quota validate failure.'
+            )
+        elif status == '5':
+            raise GeocoderQueryError(
+                'AK Illegal or Not Exist.'
+            )
+        elif status == '101':
+            raise GeocoderQueryError(
+                'Your request was denied.'
+            )
+        elif status == '102':
+            raise GeocoderQueryError(
+                'IP/SN/SCODE/REFERER Illegal:'
+            )
+        elif status == '2xx':
+            raise GeocoderQueryError(
+                'Has No Privilleges.'
+            )
+        elif status == '3xx':
+            raise GeocoderQuotaExceeded(
+                'Quota Error.'
+            )
+        else:
+            raise GeocoderQueryError('Unknown error')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/googlev3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/googlev3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/googlev3.py	(revision 1126)
@@ -0,0 +1,375 @@
+"""
+:class:`.GoogleV3` is the Google Maps V3 geocoder.
+"""
+
+import base64
+import hashlib
+import hmac
+from geopy.compat import urlencode
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT, DEFAULT_SCHEME
+from geopy.exc import (
+    GeocoderQueryError,
+    GeocoderQuotaExceeded,
+    ConfigurationError,
+    GeocoderParseError,
+    GeocoderQueryError,
+)
+from geopy.location import Location
+from geopy.util import logger
+
+try:
+    from pytz import timezone, UnknownTimeZoneError
+    from calendar import timegm
+    from datetime import datetime
+    from numbers import Number
+    pytz_available = True
+except ImportError:
+    pytz_available = False
+
+
+__all__ = ("GoogleV3", )
+
+
+class GoogleV3(Geocoder):  # pylint: disable=R0902
+    """
+    Geocoder using the Google Maps v3 API. Documentation at:
+        https://developers.google.com/maps/documentation/geocoding/
+    """
+
+    def __init__(
+            self,
+            api_key=None,
+            domain='maps.googleapis.com',
+            scheme=DEFAULT_SCHEME,
+            client_id=None,
+            secret_key=None,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):  # pylint: disable=R0913
+        """
+        Initialize a customized Google geocoder.
+
+        API authentication is only required for Google Maps Premier customers.
+
+        :param string api_key: The API key required by Google to perform
+            geocoding requests. API keys are managed through the Google APIs
+            console (https://code.google.com/apis/console).
+
+            .. versionadded:: 0.98.2
+
+        :param string domain: Should be the localized Google Maps domain to
+            connect to. The default is 'maps.googleapis.com', but if you're
+            geocoding address in the UK (for example), you may want to set it
+            to 'maps.google.co.uk' to properly bias results.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+            .. versionadded:: 0.97
+
+        :param string client_id: If using premier, the account client id.
+
+        :param string secret_key: If using premier, the account secret key.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+        """
+        super(GoogleV3, self).__init__(
+            scheme=scheme, timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        if client_id and not secret_key:
+            raise ConfigurationError('Must provide secret_key with client_id.')
+        if secret_key and not client_id:
+            raise ConfigurationError('Must provide client_id with secret_key.')
+
+        self.api_key = api_key
+        self.domain = domain.strip('/')
+        self.scheme = scheme
+        self.doc = {}
+
+        if client_id and secret_key:
+            self.premier = True
+            self.client_id = client_id
+            self.secret_key = secret_key
+        else:
+            self.premier = False
+            self.client_id = None
+            self.secret_key = None
+
+        self.api = '%s://%s/maps/api/geocode/json' % (self.scheme, self.domain)
+        self.tz_api = '%s://%s/maps/api/timezone/json' % (
+            self.scheme,
+            self.domain
+        )
+
+    def _get_signed_url(self, params):
+        """
+        Returns a Premier account signed url. Docs on signature:
+            https://developers.google.com/maps/documentation/business/webservices/auth#digital_signatures
+        """
+        params['client'] = self.client_id
+        path = "?".join(('/maps/api/geocode/json', urlencode(params)))
+        signature = hmac.new(
+            base64.urlsafe_b64decode(self.secret_key),
+            path.encode('utf-8'),
+            hashlib.sha1
+        )
+        signature = base64.urlsafe_b64encode(
+            signature.digest()
+        ).decode('utf-8')
+        return '%s://%s%s&signature=%s' % (
+            self.scheme, self.domain, path, signature
+        )
+
+    @staticmethod
+    def _format_components_param(components):
+        """
+        Format the components dict to something Google understands.
+        """
+        return "|".join(
+            (":".join(item)
+             for item in components.items()
+            )
+        )
+
+    @staticmethod
+    def _format_bounds_param(bounds):
+      """
+      Format the bounds to something Google understands.
+      """
+      return '%f,%f|%f,%f' % (bounds[0], bounds[1], bounds[2], bounds[3])
+
+    def geocode(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+            bounds=None,
+            region=None,
+            components=None,
+            language=None,
+            sensor=False,
+        ):  # pylint: disable=W0221,R0913
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+            .. versionadded:: 0.97
+
+        :param bounds: The bounding box of the viewport within which
+            to bias geocode results more prominently.
+        :type bounds: list or tuple
+
+        :param string region: The region code, specified as a ccTLD
+            ("top-level domain") two-character value.
+
+        :param dict components: Restricts to an area. Can use any combination
+            of: route, locality, administrative_area, postal_code, country.
+
+            .. versionadded:: 0.97.1
+
+        :param string language: The language in which to return results.
+
+        :param bool sensor: Whether the geocoding request comes from a
+            device with a location sensor.
+        """
+        params = {
+            'address': self.format_string % query,
+            'sensor': str(sensor).lower()
+        }
+        if self.api_key:
+            params['key'] = self.api_key
+        if bounds:
+            if len(bounds) != 4:
+                raise GeocoderQueryError(
+                    "bounds must be a four-item iterable of lat,lon,lat,lon"
+                )
+            params['bounds'] = self._format_bounds_param(bounds)
+        if region:
+            params['region'] = region
+        if components:
+            params['components'] = self._format_components_param(components)
+        if language:
+            params['language'] = language
+
+        if self.premier is False:
+            url = "?".join((self.api, urlencode(params)))
+        else:
+            url = self._get_signed_url(params)
+
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    def reverse(
+            self,
+            query,
+            exactly_one=False,
+            timeout=None,
+            language=None,
+            sensor=False,
+        ):  # pylint: disable=W0221,R0913
+        """
+        Given a point, find an address.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param boolean exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+            .. versionadded:: 0.97
+
+        :param string language: The language in which to return results.
+
+        :param boolean sensor: Whether the geocoding request comes from a
+            device with a location sensor.
+        """
+        params = {
+            'latlng': self._coerce_point_to_string(query),
+            'sensor': str(sensor).lower()
+        }
+        if language:
+            params['language'] = language
+        if self.api_key:
+            params['key'] = self.api_key
+
+        if not self.premier:
+            url = "?".join((self.api, urlencode(params)))
+        else:
+            url = self._get_signed_url(params)
+
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    def timezone(self, location, at_time=None, timeout=None):
+        """
+        **This is an unstable API.**
+
+        Finds the timezone a `location` was in for a specified `at_time`,
+        and returns a pytz timezone object.
+
+            .. versionadded:: 1.2.0
+
+        :param location: The coordinates for which you want a timezone.
+        :type location: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param at_time: The time at which you want the timezone of this
+            location. This is optional, and defaults to the time that the
+            function is called in UTC.
+        :type at_time integer, long, float, datetime:
+
+        :rtype: pytz timezone
+        """
+        if not pytz_available:
+            raise ImportError(
+                'pytz must be installed in order to locate timezones. '
+                ' Install with `pip install geopy -e ".[timezone]"`.'
+            )
+        location = self._coerce_point_to_string(location)
+
+        if isinstance(at_time, Number):
+            timestamp = at_time
+        elif isinstance(at_time, datetime):
+            timestamp = timegm(at_time.utctimetuple())
+        elif at_time is None:
+            timestamp = timegm(datetime.utcnow().utctimetuple())
+        else:
+            raise GeocoderQueryError(
+                "`at_time` must be an epoch integer or "
+                "datetime.datetime object"
+            )
+
+        params = {
+            "location": location,
+            "timestamp": timestamp,
+        }
+        if self.api_key:
+            params['key'] = self.api_key
+        url = "?".join((self.tz_api, urlencode(params)))
+
+        logger.debug("%s.timezone: %s", self.__class__.__name__, url)
+        response = self._call_geocoder(url, timeout=timeout)
+
+        try:
+            tz = timezone(response["timeZoneId"])
+        except UnknownTimeZoneError:
+            raise GeocoderParseError(
+                "pytz could not parse the timezone identifier (%s) "
+                "returned by the service." % response["timeZoneId"]
+            )
+        except KeyError:
+            raise GeocoderParseError(
+                "geopy could not find a timezone in this response: %s" %
+                response
+            )
+        return tz
+
+    def _parse_json(self, page, exactly_one=True):
+        '''Returns location, (latitude, longitude) from json feed.'''
+
+        places = page.get('results', [])
+        if not len(places):
+            self._check_status(page.get('status'))
+            return None
+
+        def parse_place(place):
+            '''Get the location, lat, lng from a single json place.'''
+            location = place.get('formatted_address')
+            latitude = place['geometry']['location']['lat']
+            longitude = place['geometry']['location']['lng']
+            return Location(location, (latitude, longitude), place)
+
+        if exactly_one:
+            return parse_place(places[0])
+        else:
+            return [parse_place(place) for place in places]
+
+    @staticmethod
+    def _check_status(status):
+        """
+        Validates error statuses.
+        """
+        if status == 'ZERO_RESULTS':
+            # When there are no results, just return.
+            return
+        if status == 'OVER_QUERY_LIMIT':
+            raise GeocoderQuotaExceeded(
+                'The given key has gone over the requests limit in the 24'
+                ' hour period or has submitted too many requests in too'
+                ' short a period of time.'
+            )
+        elif status == 'REQUEST_DENIED':
+            raise GeocoderQueryError(
+                'Your request was denied.'
+            )
+        elif status == 'INVALID_REQUEST':
+            raise GeocoderQueryError('Probably missing address or latlng.')
+        else:
+            raise GeocoderQueryError('Unknown error.')
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/navidata.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/navidata.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/navidata.py	(revision 1126)
@@ -0,0 +1,197 @@
+"""
+:class:`.NaviData` is the NaviData.pl geocoder.
+"""
+
+from geopy.compat import urlencode
+from geopy.location import Location
+from geopy.util import logger
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT
+
+from geopy.exc import (
+    GeocoderQueryError,
+    GeocoderQuotaExceeded,
+)
+
+
+__all__ = ("NaviData", )
+
+
+class NaviData(Geocoder):  # pylint: disable=W0223
+    """
+    Geocoder using the NaviData API. Documentation at:
+
+        http://www.navidata.pl
+    """
+
+    def __init__(
+            self,
+            api_key=None,
+            domain='api.navidata.pl',
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+    ):
+        """
+            .. versionadded:: 1.8.0
+
+        Initialize NaviData geocoder. Please note that 'scheme' parameter is
+        not supported: at present state, all NaviData traffic use plain http.
+
+        :param string api_key: The commercial API key for service. None
+            required if you use the API for non-commercial purposes.
+
+        :param string domain: Currently it is 'api.navidata.pl', can
+            be changed for testing purposes.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+        """
+        super(NaviData, self).__init__(
+            scheme="http", timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+
+        self.api_key = api_key
+        self.domain = domain.strip('/')
+        self.geocode_api = 'http://%s/geocode' % (self.domain)
+        self.reverse_geocode_api = 'http://%s/revGeo' % (self.domain)
+
+    def geocode(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+        ):
+        """
+        Geocode a location query.
+
+        :param string query: The query string to be geocoded; this must
+            be URL encoded.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+        params = {
+            'q': self.format_string % query,
+        }
+
+        if self.api_key is not None:
+            params["api_key"] = self.api_key
+
+        url = "?".join((self.geocode_api, urlencode(params)))
+
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json_geocode(
+            self._call_geocoder(url, timeout=timeout), exactly_one
+        )
+
+    def reverse(
+            self,
+            query,
+            exactly_one=True,
+            timeout=None,
+        ):
+        """
+        Given a point, find an address.
+
+        :param query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param boolean exactly_one: Return one result or a list of results, if
+            available. Currently this has no effect
+            (only one address is returned by API).
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+
+        """
+
+        (lat, lon) = self._coerce_point_to_string(query).split(',')
+
+        params = {
+            'lat': lat,
+            'lon': lon
+        }
+
+        if self.api_key is not None:
+            params["api_key"] = self.api_key
+
+        url = "?".join((self.reverse_geocode_api, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json_revgeocode(
+            self._call_geocoder(url, timeout=timeout)
+        )
+
+    @staticmethod
+    def _parse_json_geocode(page, exactly_one=True):
+        '''Returns location, (latitude, longitude) from json feed.'''
+
+        places = page
+
+        if not len(places):
+            return None
+
+        def parse_place(place):
+            '''Get the location, lat, lon from a single json result.'''
+            location = place.get('description')
+            latitude = place.get('lat')
+            longitude = place.get('lon')
+            return Location(location, (latitude, longitude), place)
+
+        if exactly_one:
+            return parse_place(places[0])
+        else:
+            return [parse_place(place) for place in places]
+
+    @staticmethod
+    def _parse_json_revgeocode(page):
+        '''Returns location, (latitude, longitude) from json feed.'''
+        result = page
+
+        if result.get('description', None) is None:
+            return None
+
+        location = result.get('description')
+        latitude = result.get('lat')
+        longitude = result.get('lon')
+
+        return Location(location, (latitude, longitude), result)
+
+
+    @staticmethod
+    def _check_status(status):
+        """
+        Validates error statuses.
+        """
+        status_code = status['code']
+
+        if status_code == 200:
+            # When there are no results, just return.
+            return
+
+        elif status_code == 429:
+            # Rate limit exceeded
+            raise GeocoderQuotaExceeded(
+                'The given key has gone over the requests limit in the 24'
+                ' hour period or has submitted too many requests in too'
+                ' short a period of time.'
+            )
+
+        elif status_code == 403:
+            raise GeocoderQueryError(
+                'Your request was denied.'
+            )
+        else:
+            raise GeocoderQueryError('Unknown error: ' + str(status_code))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/yandex.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/yandex.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/yandex.py	(revision 1126)
@@ -0,0 +1,170 @@
+"""
+:class:`Yandex` geocoder.
+"""
+
+from geopy.compat import urlencode
+
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT
+from geopy.location import Location
+from geopy.exc import (
+    GeocoderServiceError,
+    GeocoderParseError
+)
+from geopy.util import logger
+
+
+__all__ = ("Yandex", )
+
+
+class Yandex(Geocoder): # pylint: disable=W0223
+    """
+    Yandex geocoder, documentation at:
+        http://api.yandex.com/maps/doc/geocoder/desc/concepts/input_params.xml
+    """
+
+    def __init__(
+            self,
+            api_key=None,
+            lang=None,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):
+        """
+        Create a Yandex-based geocoder.
+
+            .. versionadded:: 1.5.0
+
+        :param string api_key: Yandex API key (not obligatory)
+            http://api.yandex.ru/maps/form.xml
+
+        :param string lang: response locale, the following locales are
+            supported: "ru_RU" (default), "uk_UA", "be_BY", "en_US", "tr_TR"
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+        """
+        super(Yandex, self).__init__(
+            scheme='http', timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        self.api_key = api_key
+        self.lang = lang
+        self.api = 'http://geocode-maps.yandex.ru/1.x/'
+
+    def geocode(self, query, exactly_one=True, timeout=None): # pylint: disable=W0221
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception. Set this only if you wish to override, on this call
+            only, the value set during the geocoder's initialization.
+        """
+        params = {
+            'geocode': query,
+            'format': 'json'
+        }
+        if not self.api_key is None:
+            params['key'] = self.api_key
+        if not self.lang is None:
+            params['lang'] = self.lang
+        if exactly_one is True:
+            params['results'] = 1
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one,
+        )
+
+    def reverse(
+            self,
+            query,
+            exactly_one=False,
+            timeout=None,
+        ):
+        """
+        Given a point, find an address.
+
+        :param string query: The coordinates for which you wish to obtain the
+            closest human-readable addresses.
+        :type query: :class:`geopy.point.Point`, list or tuple of (latitude,
+            longitude), or string as "%(latitude)s, %(longitude)s"
+
+        :param boolean exactly_one: Return one result or a list of results, if
+            available.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+        """
+        try:
+            lat, lng = [
+                x.strip() for x in
+                self._coerce_point_to_string(query).split(',')
+            ]
+        except ValueError:
+            raise ValueError("Must be a coordinate pair or Point")
+        params = {
+            'geocode': '{0},{1}'.format(lng, lat),
+            'format': 'json'
+        }
+        if self.api_key is not None:
+            params['key'] = self.api_key
+        if self.lang is not None:
+            params['lang'] = self.lang
+        url = "?".join((self.api, urlencode(params)))
+        logger.debug("%s.reverse: %s", self.__class__.__name__, url)
+        return self._parse_json(
+            self._call_geocoder(url, timeout=timeout),
+            exactly_one
+        )
+
+    def _parse_json(self, doc, exactly_one):
+        """
+        Parse JSON response body.
+        """
+        if doc.get('error'):
+            raise GeocoderServiceError(doc['error']['message'])
+
+        try:
+            places = doc['response']['GeoObjectCollection']['featureMember']
+        except KeyError:
+            raise GeocoderParseError('Failed to parse server response')
+
+        def parse_code(place):
+            """
+            Parse each record.
+            """
+            try:
+                place = place['GeoObject']
+            except KeyError:
+                raise GeocoderParseError('Failed to parse server response')
+
+            longitude, latitude = [
+                float(_) for _ in place['Point']['pos'].split(' ')
+            ]
+
+            location = place.get('description')
+
+            return Location(location, (latitude, longitude), place)
+
+        if exactly_one:
+            try:
+                return parse_code(places[0])
+            except IndexError:
+                return None
+        else:
+            return [parse_code(place) for place in places]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/smartystreets.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/smartystreets.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/geocoders/smartystreets.py	(revision 1126)
@@ -0,0 +1,136 @@
+"""
+:class:`.LiveAddress` geocoder.
+"""
+
+from geopy.geocoders.base import Geocoder, DEFAULT_TIMEOUT, DEFAULT_SCHEME
+from geopy.compat import urlencode
+from geopy.location import Location
+from geopy.exc import ConfigurationError, GeocoderQuotaExceeded
+from geopy.util import logger
+
+
+__all__ = ("LiveAddress", )
+
+
+class LiveAddress(Geocoder):  # pylint: disable=W0223
+    """
+    Initialize a customized LiveAddress geocoder provided by SmartyStreets.
+    More information regarding the LiveAddress API can be found here:
+        https://smartystreets.com/products/liveaddress-api
+    """
+    def __init__(
+            self,
+            auth_id,
+            auth_token,
+            candidates=1,
+            scheme=DEFAULT_SCHEME,
+            timeout=DEFAULT_TIMEOUT,
+            proxies=None,
+            user_agent=None,
+        ):  # pylint: disable=R0913
+        """
+        Initialize a customized SmartyStreets LiveAddress geocoder.
+
+        :param string auth_id: Valid `Auth ID` from SmartyStreets.
+
+            .. versionadded:: 1.5.0
+
+        :param string auth_token: Valid `Auth Token` from SmartyStreets.
+
+        :param int candidates: An integer between 1 and 10 indicating the max
+            number of candidate addresses to return if a valid address
+            could be found.
+
+        :param string scheme: Use 'https' or 'http' as the API URL's scheme.
+            Default is https. Note that SSL connections' certificates are not
+            verified.
+
+            .. versionadded:: 0.97
+
+            .. versionchanged:: 1.8.0
+            LiveAddress now requires `https`. Specifying `scheme=http` will
+            result in a :class:`geopy.exc.ConfigurationError`.
+
+        :param int timeout: Time, in seconds, to wait for the geocoding service
+            to respond before raising an :class:`geopy.exc.GeocoderTimedOut`
+            exception.
+
+            .. versionadded:: 0.97
+
+        :param dict proxies: If specified, routes this geocoder's requests
+            through the specified proxy. E.g., {"https": "192.0.2.0"}. For
+            more information, see documentation on
+            :class:`urllib2.ProxyHandler`.
+
+            .. versionadded:: 0.96
+        """
+        super(LiveAddress, self).__init__(
+            timeout=timeout, proxies=proxies, user_agent=user_agent
+        )
+        if scheme == "http":
+            raise ConfigurationError("LiveAddress now requires `https`.")
+        self.scheme = scheme
+        self.auth_id = auth_id
+        self.auth_token = auth_token
+        if candidates:
+            if not 1 <= candidates <= 10:
+                raise ValueError('candidates must be between 1 and 10')
+        self.candidates = candidates
+        self.api = '%s://api.smartystreets.com/street-address' % self.scheme
+
+    def geocode(self, query, exactly_one=True, timeout=None):  # pylint: disable=W0221
+        """
+        Geocode a location query.
+
+        :param string query: The address or query you wish to geocode.
+
+        :param bool exactly_one: Return one result or a list of results, if
+            available.
+        """
+        url = self._compose_url(query)
+        logger.debug("%s.geocode: %s", self.__class__.__name__, url)
+        return self._parse_json(self._call_geocoder(url, timeout=timeout),
+                                exactly_one)
+
+    def _geocoder_exception_handler(self, error, message): # pylint: disable=R0201,W0613
+        """
+        LiveStreets-specific exceptions.
+        """
+        if "no active subscriptions found" in message.lower():
+            raise GeocoderQuotaExceeded(message)
+
+    def _compose_url(self, location):
+        """
+        Generate API URL.
+        """
+        query = {
+            'auth-id': self.auth_id,
+            'auth-token': self.auth_token,
+            'street': location,
+            'candidates': self.candidates
+        }
+        return '{url}?{query}'.format(url=self.api, query=urlencode(query))
+
+    def _parse_json(self, response, exactly_one=True):
+        """
+        Parse responses as JSON objects.
+        """
+        if not len(response):
+            return None
+        if exactly_one is True:
+            return self._format_structured_address(response[0])
+        else:
+            return [self._format_structured_address(c) for c in response]
+
+    @staticmethod
+    def _format_structured_address(address):
+        """
+        Pretty-print address and return lat, lon tuple.
+        """
+        latitude = address['metadata'].get('latitude')
+        longitude = address['metadata'].get('longitude')
+        return Location(
+            ", ".join((address['delivery_line_1'], address['last_line'])),
+            (latitude, longitude) if latitude and longitude else None,
+            address
+        )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/format.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/format.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/format.py	(revision 1126)
@@ -0,0 +1,126 @@
+"""
+Formatting...
+"""
+
+from geopy import units
+from geopy.compat import py3k
+
+if py3k:
+    unichr = chr # pylint: disable=W0622
+
+# Unicode characters for symbols that appear in coordinate strings.
+DEGREE = unichr(176)
+PRIME = unichr(8242)
+DOUBLE_PRIME = unichr(8243)
+ASCII_DEGREE = ''
+ASCII_PRIME = "'"
+ASCII_DOUBLE_PRIME = '"'
+LATIN1_DEGREE = chr(176)
+HTML_DEGREE = '&deg;'
+HTML_PRIME = '&prime;'
+HTML_DOUBLE_PRIME = '&Prime;'
+XML_DECIMAL_DEGREE = '&#176;'
+XML_DECIMAL_PRIME = '&#8242;'
+XML_DECIMAL_DOUBLE_PRIME = '&#8243;'
+XML_HEX_DEGREE = '&xB0;'
+XML_HEX_PRIME = '&x2032;'
+XML_HEX_DOUBLE_PRIME = '&x2033;'
+ABBR_DEGREE = 'deg'
+ABBR_ARCMIN = 'arcmin'
+ABBR_ARCSEC = 'arcsec'
+
+DEGREES_FORMAT = (
+    "%(degrees)d%(deg)s %(minutes)d%(arcmin)s %(seconds)g%(arcsec)s"
+)
+
+UNICODE_SYMBOLS = {
+    'deg': DEGREE,
+    'arcmin': PRIME,
+    'arcsec': DOUBLE_PRIME
+}
+ASCII_SYMBOLS = {
+    'deg': ASCII_DEGREE,
+    'arcmin': ASCII_PRIME,
+    'arcsec': ASCII_DOUBLE_PRIME
+}
+LATIN1_SYMBOLS = {
+    'deg': LATIN1_DEGREE,
+    'arcmin': ASCII_PRIME,
+    'arcsec': ASCII_DOUBLE_PRIME
+}
+HTML_SYMBOLS = {
+    'deg': HTML_DEGREE,
+    'arcmin': HTML_PRIME,
+    'arcsec': HTML_DOUBLE_PRIME
+}
+XML_SYMBOLS = {
+    'deg': XML_DECIMAL_DEGREE,
+    'arcmin': XML_DECIMAL_PRIME,
+    'arcsec': XML_DECIMAL_DOUBLE_PRIME
+}
+ABBR_SYMBOLS = {
+    'deg': ABBR_DEGREE,
+    'arcmin': ABBR_ARCMIN,
+    'arcsec': ABBR_ARCSEC
+}
+
+def format_degrees(degrees, fmt=DEGREES_FORMAT, symbols=None):
+    """
+    TODO docs.
+    """
+    symbols = symbols or ASCII_SYMBOLS
+    arcminutes = units.arcminutes(degrees=degrees - int(degrees))
+    arcseconds = units.arcseconds(arcminutes=arcminutes - int(arcminutes))
+    format_dict = dict(
+        symbols,
+        degrees=degrees,
+        minutes=abs(arcminutes),
+        seconds=abs(arcseconds)
+    )
+    return fmt % format_dict
+
+DISTANCE_FORMAT = "%(magnitude)s%(unit)s"
+DISTANCE_UNITS = {
+    'km': lambda d: d,
+    'm': lambda d: units.meters(kilometers=d),
+    'mi': lambda d: units.miles(kilometers=d),
+    'ft': lambda d: units.feet(kilometers=d),
+    'nm': lambda d: units.nautical(kilometers=d),
+    'nmi': lambda d: units.nautical(kilometers=d)
+}
+
+def format_distance(kilometers, fmt=DISTANCE_FORMAT, unit='km'):
+    """
+    TODO docs.
+    """
+    magnitude = DISTANCE_UNITS[unit](kilometers)
+    return fmt % {'magnitude': magnitude, 'unit': unit}
+
+_DIRECTIONS = [
+    ('north', 'N'),
+    ('north by east', 'NbE'),
+    ('north-northeast', 'NNE'),
+    ('northeast by north', 'NEbN'),
+    ('northeast', 'NE'),
+    ('northeast by east', 'NEbE'),
+    ('east-northeast', 'ENE'),
+    ('east by north', 'EbN'),
+    ('east', 'E'),
+    ('east by south', 'EbS'),
+    ('east-southeast', 'ESE'),
+    ('southeast by east', 'SEbE'),
+    ('southeast', 'SE'),
+    ('southeast by south', 'SEbS'),
+]
+
+DIRECTIONS, DIRECTIONS_ABBR = zip(*_DIRECTIONS)
+ANGLE_DIRECTIONS = {
+    n * 11.25: d
+    for n, d
+    in enumerate(DIRECTIONS)
+}
+ANGLE_DIRECTIONS_ABBR = {
+    n * 11.25: d
+    for n, d
+    in enumerate(DIRECTIONS_ABBR)
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/location.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/location.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/location.py	(revision 1126)
@@ -0,0 +1,136 @@
+"""
+:class:`.Location` returns geocoder results.
+"""
+
+from geopy.point import Point
+from geopy.compat import string_compare, py3k
+
+
+class Location(object): # pylint: disable=R0903,R0921
+    """
+    Contains a parsed geocoder response. Can be iterated over as
+    (location<String>, (latitude<float>, longitude<Float)). Or one can access
+    the properties `address`, `latitude`, `longitude`, or `raw`. The last
+    is a dictionary of the geocoder's response for this item.
+
+    .. versionadded:: 0.98
+    """
+
+    __slots__ = ("_address", "_point", "_tuple", "_raw")
+
+    def __init__(self, address="", point=None, raw=None):
+        self._address = address
+        if point is None:
+            self._point = (None, None, None)
+        elif isinstance(point, Point):
+            self._point = point
+        elif isinstance(point, string_compare):
+            self._point = Point(point)
+        elif isinstance(point, (tuple, list)):
+            self._point = Point(point)
+        else:
+            raise TypeError(
+                "point an unsupported type: %r; use %r or Point",
+                type(point), type(string_compare)
+            )
+        self._tuple = (self._address, (self._point[0], self._point[1]))
+        self._raw = raw
+
+    @property
+    def address(self):
+        """
+        Location as a formatted string returned by the geocoder or constructed
+        by geopy, depending on the service.
+
+        :rtype: unicode
+        """
+        return self._address
+
+    @property
+    def latitude(self):
+        """
+        Location's latitude.
+
+        :rtype: float or None
+        """
+        return self._point[0]
+
+    @property
+    def longitude(self):
+        """
+        Location's longitude.
+
+        :rtype: float or None
+        """
+        return self._point[1]
+
+    @property
+    def altitude(self):
+        """
+        Location's altitude.
+
+        :rtype: float or None
+        """
+        return self._point[2]
+
+    @property
+    def point(self):
+        """
+        :class:`geopy.point.Point` instance representing the location's
+        latitude, longitude, and altitude.
+
+        :rtype: :class:`geopy.point.Point` or None
+        """
+        return self._point if self._point != (None, None, None) else None
+
+    @property
+    def raw(self):
+        """
+        Location's raw, unparsed geocoder response. For details on this,
+        consult the service's documentation.
+
+        :rtype: dict or None
+        """
+        return self._raw
+
+    def __getitem__(self, index):
+        """
+        Backwards compatibility with geopy<0.98 tuples.
+        """
+        return self._tuple[index]
+
+    def __unicode__(self):
+        return self._address
+
+    __str__ = __unicode__
+
+    def __repr__(self):
+        if py3k:
+            return "Location(%s, (%s, %s, %s))" % (
+                self._address, self.latitude, self.longitude, self.altitude
+            )
+        else:
+            # Python 2 should not return unicode in __repr__:
+            # http://bugs.python.org/issue5876
+            return "Location((%s, %s, %s))" % (
+                self.latitude, self.longitude, self.altitude
+            )
+
+
+    def __iter__(self):
+        return iter(self._tuple)
+
+    def __eq__(self, other):
+        return (
+            isinstance(other, Location) and
+            self._address == other._address and  # pylint: disable=W0212
+            self._point == other._point and  # pylint: disable=W0212
+            self.raw == other.raw
+        )
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __len__(self): # pragma: no cover
+        return len(self._tuple)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/point.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/point.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/point.py	(revision 1126)
@@ -0,0 +1,361 @@
+# encoding: utf-8
+"""
+:class:`.Point` data structure.
+"""
+
+import re
+from itertools import islice
+from geopy import util, units
+from geopy.format import (
+    DEGREE,
+    PRIME,
+    DOUBLE_PRIME,
+    format_degrees,
+    format_distance,
+)
+from geopy.compat import string_compare
+
+
+POINT_PATTERN = re.compile(r"""
+    .*?
+    (?P<latitude>
+      (?P<latitude_direction_front>[NS])?[ ]*
+        (?P<latitude_degrees>-?%(FLOAT)s)(?:[%(DEGREE)sD\*\u00B0\s][ ]*
+        (?:(?P<latitude_arcminutes>%(FLOAT)s)[%(PRIME)s'm][ ]*)?
+        (?:(?P<latitude_arcseconds>%(FLOAT)s)[%(DOUBLE_PRIME)s"s][ ]*)?
+        )?(?P<latitude_direction_back>[NS])?)
+    %(SEP)s
+    (?P<longitude>
+      (?P<longitude_direction_front>[EW])?[ ]*
+      (?P<longitude_degrees>-?%(FLOAT)s)(?:[%(DEGREE)sD\*\u00B0\s][ ]*
+      (?:(?P<longitude_arcminutes>%(FLOAT)s)[%(PRIME)s'm][ ]*)?
+      (?:(?P<longitude_arcseconds>%(FLOAT)s)[%(DOUBLE_PRIME)s"s][ ]*)?
+      )?(?P<longitude_direction_back>[EW])?)(?:
+    %(SEP)s
+      (?P<altitude>
+        (?P<altitude_distance>-?%(FLOAT)s)[ ]*
+        (?P<altitude_units>km|m|mi|ft|nm|nmi)))?
+    .*?$
+""" % {
+    "FLOAT": r'\d+(?:\.\d+)?',
+    "DEGREE": DEGREE,
+    "PRIME": PRIME,
+    "DOUBLE_PRIME": DOUBLE_PRIME,
+    "SEP": r'\s*[,;/\s]\s*',
+}, re.X)
+
+
+class Point(object):
+    """
+    A geodetic point with latitude, longitude, and altitude.
+
+    Latitude and longitude are floating point values in degrees.
+    Altitude is a floating point value in kilometers. The reference level
+    is never considered and is thus application dependent, so be consistent!
+    The default for all values is 0.
+
+    Points can be created in a number of ways...
+
+    With longitude, latitude, and altitude::
+
+        >>> p1 = Point(41.5, -81, 0)
+        >>> p2 = Point(latitude=41.5, longitude=-81)
+
+    With a sequence of 0 to 3 values (longitude, latitude, altitude)::
+
+        >>> p1 = Point([41.5, -81, 0])
+        >>> p2 = Point((41.5, -81))
+
+    Copy another `Point` instance::
+
+        >>> p2 = Point(p1)
+        >>> p2 == p1
+        True
+        >>> p2 is p1
+        False
+
+    Give a string containing at least latitude and longitude::
+
+        >>> p1 = Point('41.5,-81.0')
+        >>> p2 = Point('41.5 N -81.0 W')
+        >>> p3 = Point('-41.5 S, 81.0 E, 2.5km')
+        >>> p4 = Point('23 26m 22s N 23 27m 30s E 21.0mi')
+        >>> p5 = Point('''3 26' 22" N 23 27' 30" E''')
+
+    Point values can be accessed by name or by index::
+
+        >>> p = Point(41.5, -81.0, 0)
+        >>> p.latitude == p[0]
+        True
+        >>> p.longitude == p[1]
+        True
+        >>> p.altitude == p[2]
+        True
+
+    When unpacking (or iterating), a (latitude, longitude, altitude) tuple is
+    returned::
+
+        >>> latitude, longitude, altitude = p
+
+    """
+
+    __slots__ = ("latitude", "longitude", "altitude", "_items")
+
+    POINT_PATTERN = POINT_PATTERN
+
+    def __new__(cls, latitude=None, longitude=None, altitude=None):
+        """
+        :param float latitude: Latitude of point.
+        :param float longitude: Longitude of point.
+        :param float altitude: Altitude of point.
+        """
+        single_arg = longitude is None and altitude is None
+        if single_arg and not isinstance(latitude, util.NUMBER_TYPES):
+            arg = latitude
+            if arg is None: # pragma: no cover
+                pass
+            elif isinstance(arg, Point):
+                return cls.from_point(arg)
+            elif isinstance(arg, string_compare):
+                return cls.from_string(arg)
+            else:
+                try:
+                    seq = iter(arg)
+                except TypeError: # pragma: no cover
+                    raise TypeError(
+                        "Failed to create Point instance from %r." % (arg,)
+                    )
+                else:
+                    return cls.from_sequence(seq)
+
+        latitude = float(latitude or 0.0)
+        if abs(latitude) > 90:
+            latitude = ((latitude + 90) % 180) - 90
+
+        longitude = float(longitude or 0.0)
+        if abs(longitude) > 180:
+            longitude = ((longitude + 180) % 360) - 180
+
+        altitude = float(altitude or 0.0)
+
+        self = super(Point, cls).__new__(cls)
+        self.latitude = latitude
+        self.longitude = longitude
+        self.altitude = altitude
+        self._items = [self.latitude, self.longitude, self.altitude]
+        return self
+
+    def __getitem__(self, index):
+        return self._items[index]
+
+    def __setitem__(self, index, value):
+        self._items[index] = value
+
+    def __iter__(self):
+        return iter((self.latitude, self.longitude, self.altitude))
+
+    def __repr__(self):
+        return "Point(%r, %r, %r)" % tuple(self._items)
+
+    def format(self, altitude=None, deg_char='', min_char='m', sec_char='s'):
+        """
+        Format decimal degrees (DD) to degrees minutes seconds (DMS)
+        """
+        latitude = "%s %s" % (
+            format_degrees(abs(self.latitude), symbols={
+                'deg': deg_char, 'arcmin': min_char, 'arcsec': sec_char
+            }),
+            self.latitude >= 0 and 'N' or 'S'
+        )
+        longitude = "%s %s" % (
+            format_degrees(abs(self.longitude), symbols={
+                'deg': deg_char, 'arcmin': min_char, 'arcsec': sec_char
+            }),
+            self.longitude >= 0 and 'E' or 'W'
+        )
+        coordinates = [latitude, longitude]
+
+        if altitude is None:
+            altitude = bool(self.altitude)
+        if altitude:
+            if not isinstance(altitude, string_compare):
+                altitude = 'km'
+            coordinates.append(self.format_altitude(altitude))
+
+        return ", ".join(coordinates)
+
+    def format_decimal(self, altitude=None):
+        """
+        Format decimal degrees with altitude
+        """
+        coordinates = [str(self.latitude), str(self.longitude)]
+
+        if altitude is None:
+            altitude = bool(self.altitude)
+        if altitude is True:
+            if not isinstance(altitude, string_compare):
+                altitude = 'km'
+            coordinates.append(self.format_altitude(altitude))
+
+        return ", ".join(coordinates)
+
+    def format_altitude(self, unit='km'):
+        """
+        Foamt altitude with unit
+        """
+        return format_distance(self.altitude, unit=unit)
+
+    def __str__(self):
+        return self.format()
+
+    def __unicode__(self):
+        return self.format(
+            None, DEGREE, PRIME, DOUBLE_PRIME
+        )
+
+    def __eq__(self, other):
+        return tuple(self) == tuple(other)
+
+    def __ne__(self, other):
+        return tuple(self) != tuple(other)
+
+    @classmethod
+    def parse_degrees(cls, degrees, arcminutes, arcseconds, direction=None):
+        """
+        Parse degrees minutes seconds including direction (N, S, E, W)
+        """
+        degrees = float(degrees)
+        negative = degrees < 0
+        arcminutes = float(arcminutes)
+        arcseconds = float(arcseconds)
+
+        if arcminutes or arcseconds:
+            more = units.degrees(arcminutes=arcminutes, arcseconds=arcseconds)
+            if negative:
+                degrees -= more
+            else:
+                degrees += more
+
+        if direction in [None, 'N', 'E']:
+            return degrees
+        elif direction in ['S', 'W']:
+            return -degrees
+        else:
+            raise ValueError("Invalid direction! Should be one of [NSEW].")
+
+    @classmethod
+    def parse_altitude(cls, distance, unit):
+        """
+        Parse altitude managing units conversion
+        """
+        if distance is not None:
+            distance = float(distance)
+            CONVERTERS = {
+                'km': lambda d: d,
+                'm': lambda d: units.kilometers(meters=d),
+                'mi': lambda d: units.kilometers(miles=d),
+                'ft': lambda d: units.kilometers(feet=d),
+                'nm': lambda d: units.kilometers(nautical=d),
+                'nmi': lambda d: units.kilometers(nautical=d)
+            }
+            try:
+                return CONVERTERS[unit](distance)
+            except KeyError: # pragma: no cover
+                raise NotImplementedError(
+                    'Bad distance unit specified, valid are: %r' %
+                    CONVERTERS.keys()
+                )
+        else:
+            return distance
+
+    @classmethod
+    def from_string(cls, string):
+        """
+        Create and return a ``Point`` instance from a string containing
+        latitude and longitude, and optionally, altitude.
+
+        Latitude and longitude must be in degrees and may be in decimal form
+        or indicate arcminutes and arcseconds (labeled with Unicode prime and
+        double prime, ASCII quote and double quote or 'm' and 's'). The degree
+        symbol is optional and may be included after the decimal places (in
+        decimal form) and before the arcminutes and arcseconds otherwise.
+        Coordinates given from south and west (indicated by S and W suffixes)
+        will be converted to north and east by switching their signs. If no
+        (or partial) cardinal directions are given, north and east are the
+        assumed directions. Latitude and longitude must be separated by at
+        least whitespace, a comma, or a semicolon (each with optional
+        surrounding whitespace).
+
+        Altitude, if supplied, must be a decimal number with given units.
+        The following unit abbrevations (case-insensitive) are supported:
+
+            - ``km`` (kilometers)
+            - ``m`` (meters)
+            - ``mi`` (miles)
+            - ``ft`` (feet)
+            - ``nm``, ``nmi`` (nautical miles)
+
+        Some example strings the will work include:
+
+            - 41.5;-81.0
+            - 41.5,-81.0
+            - 41.5 -81.0
+            - 41.5 N -81.0 W
+            - -41.5 S;81.0 E
+            - 23 26m 22s N 23 27m 30s E
+            - 23 26' 22" N 23 27' 30" E
+            - UT: N 39°20' 0'' / W 74°35' 0''
+
+        """
+        match = re.match(cls.POINT_PATTERN, re.sub(r"''", r'"', string))
+        if match:
+            latitude_direction = None
+            if match.group("latitude_direction_front"):
+                latitude_direction = match.group("latitude_direction_front")
+            elif match.group("latitude_direction_back"):
+                latitude_direction = match.group("latitude_direction_back")
+
+            longitude_direction = None
+            if match.group("longitude_direction_front"):
+                longitude_direction = match.group("longitude_direction_front")
+            elif match.group("longitude_direction_back"):
+                longitude_direction = match.group("longitude_direction_back")
+            latitude = cls.parse_degrees(
+                match.group('latitude_degrees') or 0.0,
+                match.group('latitude_arcminutes') or 0.0,
+                match.group('latitude_arcseconds') or 0.0,
+                latitude_direction
+            )
+            longitude = cls.parse_degrees(
+                match.group('longitude_degrees') or 0.0,
+                match.group('longitude_arcminutes') or 0.0,
+                match.group('longitude_arcseconds') or 0.0,
+                longitude_direction
+            )
+            altitude = cls.parse_altitude(
+                match.group('altitude_distance'),
+                match.group('altitude_units')
+            )
+            return cls(latitude, longitude, altitude)
+        else:
+            raise ValueError(
+                "Failed to create Point instance from string: unknown format."
+            )
+
+    @classmethod
+    def from_sequence(cls, seq):
+        """
+        Create and return a new ``Point`` instance from any iterable with 0 to
+        3 elements.  The elements, if present, must be latitude, longitude,
+        and altitude, respectively.
+        """
+        args = tuple(islice(seq, 4))
+        return cls(*args)
+
+    @classmethod
+    def from_point(cls, point):
+        """
+        Create and return a new ``Point`` instance from another ``Point``
+        instance.
+        """
+        return cls(point.latitude, point.longitude, point.altitude)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/distance.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/distance.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/distance.py	(revision 1126)
@@ -0,0 +1,533 @@
+"""
+.. versionadded:: 0.93
+
+Geopy can calculate geodesic distance between two points using the
+[Vincenty distance](https://en.wikipedia.org/wiki/Vincenty's_formulae) or
+[great-circle distance](https://en.wikipedia.org/wiki/Great-circle_distance)
+formulas, with a default of Vincenty available as the function
+`geopy.distance.distance`.
+
+Great-circle distance (:class:`.great_circle`) uses a spherical model of
+the earth, using the mean earth radius as defined by the International
+Union of Geodesy and Geophysics, (2*a + b)/3 = 6371.0087714150598
+kilometers approx 6371.009 km (for WGS-84), resulting in an error of up
+to about 0.5%. The radius value is stored in
+:const:`distance.EARTH_RADIUS`, so it can be customized (it should
+always be in kilometers, however).
+
+Vincenty distance (:class:`.vincenty`) uses a more accurate ellipsoidal model
+of the earth. This is the default distance formula, and is thus aliased as
+``distance.distance``. There are multiple popular ellipsoidal models, and
+which one will be the most accurate depends on where your points are located
+on the earth. The default is the WGS-84 ellipsoid, which is the most globally
+accurate. geopy includes a few other
+models in the distance.ELLIPSOIDS dictionary::
+
+                  model             major (km)   minor (km)     flattening
+    ELLIPSOIDS = {'WGS-84':        (6378.137,    6356.7523142,  1 / \
+                                                                298.257223563),
+                  'GRS-80':        (6378.137,    6356.7523141,  1 / \
+                                                                298.257222101),
+                  'Airy (1830)':   (6377.563396, 6356.256909,   1 / \
+                                                                299.3249646),
+                  'Intl 1924':     (6378.388,    6356.911946,   1 / 297.0),
+                  'Clarke (1880)': (6378.249145, 6356.51486955, 1 / 293.465),
+                  'GRS-67':        (6378.1600,   6356.774719,   1 / 298.25),
+                  }
+
+Here's an example usage of distance.vincenty::
+
+    >>> from geopy.distance import vincenty
+    >>> newport_ri = (41.49008, -71.312796)
+    >>> cleveland_oh = (41.499498, -81.695391)
+    >>> print(vincenty(newport_ri, cleveland_oh).miles)
+    538.3904451566326
+
+Using great-circle distance::
+
+    >>> from geopy.distance import great_circle
+    >>> newport_ri = (41.49008, -71.312796)
+    >>> cleveland_oh = (41.499498, -81.695391)
+    >>> print(great_circle(newport_ri, cleveland_oh).miles)
+    537.1485284062816
+
+You can change the ellipsoid model used by the Vincenty formula like so::
+
+    >>> distance.vincenty(ne, cl, ellipsoid='GRS-80').miles
+
+The above model name will automatically be retrieved from the
+ELLIPSOIDS dictionary. Alternatively, you can specify the model values
+directly::
+
+    >>> distance.vincenty(ne, cl, ellipsoid=(6377., 6356., 1 / 297.)).miles
+
+Distances support simple arithmetic, making it easy to do things like
+calculate the length of a path::
+
+    >>> d = distance.distance
+    >>> _, wa = g.geocode('Washington, DC')
+    >>> _, pa = g.geocode('Palo Alto, CA')
+    >>> print((d(ne, cl) + d(cl, wa) + d(wa, pa)).miles)
+    3276.157156868931
+
+"""
+from __future__ import division
+
+from math import atan, tan, sin, cos, pi, sqrt, atan2, asin
+from geopy.units import radians
+from geopy import units, util
+from geopy.point import Point
+from geopy.compat import string_compare
+
+# IUGG mean earth radius in kilometers, from
+# https://en.wikipedia.org/wiki/Earth_radius#Mean_radius.  Using a
+# sphere with this radius results in an error of up to about 0.5%.
+EARTH_RADIUS = 6371.009
+
+# From http://www.movable-type.co.uk/scripts/LatLongVincenty.html:
+#   The most accurate and widely used globally-applicable model for the earth
+#   ellipsoid is WGS-84, used in this script. Other ellipsoids offering a
+#   better fit to the local geoid include Airy (1830) in the UK, International
+#   1924 in much of Europe, Clarke (1880) in Africa, and GRS-67 in South
+#   America. America (NAD83) and Australia (GDA) use GRS-80, functionally
+#   equivalent to the WGS-84 ellipsoid.
+ELLIPSOIDS = {
+    # model           major (km)   minor (km)     flattening
+    'WGS-84':        (6378.137, 6356.7523142, 1 / 298.257223563),
+    'GRS-80':        (6378.137, 6356.7523141, 1 / 298.257222101),
+    'Airy (1830)':   (6377.563396, 6356.256909, 1 / 299.3249646),
+    'Intl 1924':     (6378.388, 6356.911946, 1 / 297.0),
+    'Clarke (1880)': (6378.249145, 6356.51486955, 1 / 293.465),
+    'GRS-67':        (6378.1600, 6356.774719, 1 / 298.25)
+}
+
+class Distance(object):
+    """
+    Base for :class:`.great_circle` and :class:`.vincenty`.
+    """
+
+    def __init__(self, *args, **kwargs):
+        kilometers = kwargs.pop('kilometers', 0)
+        if len(args) == 1:
+            # if we only get one argument we assume
+            # it's a known distance instead of
+            # calculating it first
+            kilometers += args[0]
+        elif len(args) > 1:
+            for a, b in util.pairwise(args):
+                kilometers += self.measure(a, b)
+
+        kilometers += units.kilometers(**kwargs)
+        self.__kilometers = kilometers
+
+    def __add__(self, other):
+        if isinstance(other, Distance):
+            return self.__class__(self.kilometers + other.kilometers)
+        else:
+            raise TypeError(
+                "Distance instance must be added with Distance instance."
+            )
+
+    def __neg__(self):
+        return self.__class__(-self.kilometers)
+
+    def __sub__(self, other):
+        return self + -other
+
+    def __mul__(self, other):
+        return self.__class__(self.kilometers * other)
+
+    def __div__(self, other):
+        if isinstance(other, Distance):
+            return self.kilometers / other.kilometers
+        else:
+            return self.__class__(self.kilometers / other)
+
+    __truediv__ = __div__
+
+    def __abs__(self):
+        return self.__class__(abs(self.kilometers))
+
+    def __nonzero__(self):
+        return bool(self.kilometers)
+
+    __bool__ = __nonzero__
+
+    def measure(self, a, b):
+        """
+        Abstract method for measure
+        """
+        raise NotImplementedError()
+
+    def __repr__(self): # pragma: no cover
+        return 'Distance(%s)' % self.kilometers
+
+    def __str__(self): # pragma: no cover
+        return '%s km' % self.__kilometers
+
+    def __cmp__(self, other):
+        if isinstance(other, Distance):
+            return cmp(self.kilometers, other.kilometers)
+        else:
+            return cmp(self.kilometers, other)
+
+    @property
+    def kilometers(self): # pylint: disable=C0111
+        return self.__kilometers
+
+    @property
+    def km(self): # pylint: disable=C0111
+        return self.kilometers
+
+    @property
+    def meters(self): # pylint: disable=C0111
+        return units.meters(kilometers=self.kilometers)
+
+    @property
+    def m(self): # pylint: disable=C0111
+        return self.meters
+
+    @property
+    def miles(self): # pylint: disable=C0111
+        return units.miles(kilometers=self.kilometers)
+
+    @property
+    def mi(self): # pylint: disable=C0111
+        return self.miles
+
+    @property
+    def feet(self): # pylint: disable=C0111
+        return units.feet(kilometers=self.kilometers)
+
+    @property
+    def ft(self): # pylint: disable=C0111
+        return self.feet
+
+    @property
+    def nautical(self): # pylint: disable=C0111
+        return units.nautical(kilometers=self.kilometers)
+
+    @property
+    def nm(self): # pylint: disable=C0111
+        return self.nautical
+
+
+class great_circle(Distance):
+    """
+    Use spherical geometry to calculate the surface distance between two
+    geodesic points. This formula can be written many different ways,
+    including just the use of the spherical law of cosines or the haversine
+    formula.
+
+    Set which radius of the earth to use by specifying a 'radius' keyword
+    argument. It must be in kilometers. The default is to use the module
+    constant `EARTH_RADIUS`, which uses the average great-circle radius.
+
+    Example::
+
+        >>> from geopy.distance import great_circle
+        >>> newport_ri = (41.49008, -71.312796)
+        >>> cleveland_oh = (41.499498, -81.695391)
+        >>> great_circle(newport_ri, cleveland_oh).miles
+        537.1485284062816
+
+    """
+
+    def __init__(self, *args, **kwargs):
+        self.RADIUS = kwargs.pop('radius', EARTH_RADIUS)
+        super(great_circle, self).__init__(*args, **kwargs)
+
+    def measure(self, a, b):
+        a, b = Point(a), Point(b)
+
+        lat1, lng1 = radians(degrees=a.latitude), radians(degrees=a.longitude)
+        lat2, lng2 = radians(degrees=b.latitude), radians(degrees=b.longitude)
+
+        sin_lat1, cos_lat1 = sin(lat1), cos(lat1)
+        sin_lat2, cos_lat2 = sin(lat2), cos(lat2)
+
+        delta_lng = lng2 - lng1
+        cos_delta_lng, sin_delta_lng = cos(delta_lng), sin(delta_lng)
+
+        d = atan2(sqrt((cos_lat2 * sin_delta_lng) ** 2 +
+                       (cos_lat1 * sin_lat2 -
+                        sin_lat1 * cos_lat2 * cos_delta_lng) ** 2),
+                  sin_lat1 * sin_lat2 + cos_lat1 * cos_lat2 * cos_delta_lng)
+
+        return self.RADIUS * d
+
+    def destination(self, point, bearing, distance=None): # pylint: disable=W0621
+        """
+        TODO docs.
+        """
+        point = Point(point)
+        lat1 = units.radians(degrees=point.latitude)
+        lng1 = units.radians(degrees=point.longitude)
+        bearing = units.radians(degrees=bearing)
+
+        if distance is None:
+            distance = self
+        if isinstance(distance, Distance):
+            distance = distance.kilometers
+
+        d_div_r = float(distance) / self.RADIUS
+
+        lat2 = asin(
+            sin(lat1) * cos(d_div_r) +
+            cos(lat1) * sin(d_div_r) * cos(bearing)
+        )
+
+        lng2 = lng1 + atan2(
+            sin(bearing) * sin(d_div_r) * cos(lat1),
+            cos(d_div_r) - sin(lat1) * sin(lat2)
+        )
+
+        return Point(units.degrees(radians=lat2), units.degrees(radians=lng2))
+
+
+class vincenty(Distance):
+    """
+    Calculate the geodesic distance between two points using the formula
+    devised by Thaddeus Vincenty, with an accurate ellipsoidal model of the
+    earth.
+
+    Set which ellipsoidal model of the earth to use by specifying an
+    ``ellipsoid`` keyword argument. The default is 'WGS-84', which is the
+    most globally accurate model.  If ``ellipsoid`` is a string, it is
+    looked up in the `ELLIPSOIDS` dictionary to obtain the major and minor
+    semiaxes and the flattening. Otherwise, it should be a tuple with those
+    values.  See the comments above the `ELLIPSOIDS` dictionary for
+    more information.
+
+    Example::
+
+        >>> from geopy.distance import vincenty
+        >>> newport_ri = (41.49008, -71.312796)
+        >>> cleveland_oh = (41.499498, -81.695391)
+        >>> print(vincenty(newport_ri, cleveland_oh).miles)
+        538.3904451566326
+
+    Note: This implementation of Vincenty distance fails to converge for
+    some valid points. In some cases, a result can be obtained by increasing
+    the number of iterations (`iterations` keyword argument, given in the
+    class `__init__`, with a default of 20). It may be preferable to use
+    :class:`.great_circle`, which is marginally less accurate, but always
+    produces a result.
+    """
+
+    ellipsoid_key = None
+    ELLIPSOID = None
+
+    def __init__(self, *args, **kwargs):
+        self.set_ellipsoid(kwargs.pop('ellipsoid', 'WGS-84'))
+        self.iterations = kwargs.pop('iterations', 20)
+        major, minor, f = self.ELLIPSOID # pylint: disable=W0612
+        super(vincenty, self).__init__(*args, **kwargs)
+
+    def set_ellipsoid(self, ellipsoid):
+        """
+        Change the ellipsoid used in the calculation.
+        """
+        if not isinstance(ellipsoid, (list, tuple)):
+            try:
+                self.ELLIPSOID = ELLIPSOIDS[ellipsoid]
+                self.ellipsoid_key = ellipsoid
+            except KeyError:
+                raise Exception(
+                    "Invalid ellipsoid. See geopy.distance.ELIPSOIDS"
+                )
+        else:
+            self.ELLIPSOID = ellipsoid
+            self.ellipsoid_key = None
+        return
+
+    def measure(self, a, b):
+        a, b = Point(a), Point(b)
+        lat1, lng1 = radians(degrees=a.latitude), radians(degrees=a.longitude)
+        lat2, lng2 = radians(degrees=b.latitude), radians(degrees=b.longitude)
+
+        if isinstance(self.ELLIPSOID, string_compare):
+            major, minor, f = ELLIPSOIDS[self.ELLIPSOID]
+        else:
+            major, minor, f = self.ELLIPSOID
+
+        delta_lng = lng2 - lng1
+
+        reduced_lat1 = atan((1 - f) * tan(lat1))
+        reduced_lat2 = atan((1 - f) * tan(lat2))
+
+        sin_reduced1, cos_reduced1 = sin(reduced_lat1), cos(reduced_lat1)
+        sin_reduced2, cos_reduced2 = sin(reduced_lat2), cos(reduced_lat2)
+
+        lambda_lng = delta_lng
+        lambda_prime = 2 * pi
+
+        iter_limit = self.iterations
+
+        i = 0
+        while abs(lambda_lng - lambda_prime) > 10e-12 and i <= iter_limit:
+            i += 1
+
+            sin_lambda_lng, cos_lambda_lng = sin(lambda_lng), cos(lambda_lng)
+
+            sin_sigma = sqrt(
+                (cos_reduced2 * sin_lambda_lng) ** 2 +
+                (cos_reduced1 * sin_reduced2 -
+                 sin_reduced1 * cos_reduced2 * cos_lambda_lng) ** 2
+            )
+
+            if sin_sigma == 0:
+                return 0 # Coincident points
+
+            cos_sigma = (
+                sin_reduced1 * sin_reduced2 +
+                cos_reduced1 * cos_reduced2 * cos_lambda_lng
+            )
+
+            sigma = atan2(sin_sigma, cos_sigma)
+
+            sin_alpha = (
+                cos_reduced1 * cos_reduced2 * sin_lambda_lng / sin_sigma
+            )
+            cos_sq_alpha = 1 - sin_alpha ** 2
+
+            if cos_sq_alpha != 0:
+                cos2_sigma_m = cos_sigma - 2 * (
+                    sin_reduced1 * sin_reduced2 / cos_sq_alpha
+                )
+            else:
+                cos2_sigma_m = 0.0 # Equatorial line
+
+            C = f / 16. * cos_sq_alpha * (4 + f * (4 - 3 * cos_sq_alpha))
+
+            lambda_prime = lambda_lng
+            lambda_lng = (
+                delta_lng + (1 - C) * f * sin_alpha * (
+                    sigma + C * sin_sigma * (
+                        cos2_sigma_m + C * cos_sigma * (
+                            -1 + 2 * cos2_sigma_m ** 2
+                        )
+                    )
+                )
+            )
+
+        if i > iter_limit:
+            raise ValueError("Vincenty formula failed to converge!")
+
+        u_sq = cos_sq_alpha * (major ** 2 - minor ** 2) / minor ** 2
+
+        A = 1 + u_sq / 16384. * (
+            4096 + u_sq * (-768 + u_sq * (320 - 175 * u_sq))
+        )
+
+        B = u_sq / 1024. * (256 + u_sq * (-128 + u_sq * (74 - 47 * u_sq)))
+
+        delta_sigma = (
+            B * sin_sigma * (
+                cos2_sigma_m + B / 4. * (
+                    cos_sigma * (
+                        -1 + 2 * cos2_sigma_m ** 2
+                    ) - B / 6. * cos2_sigma_m * (
+                        -3 + 4 * sin_sigma ** 2
+                    ) * (
+                        -3 + 4 * cos2_sigma_m ** 2
+                    )
+                )
+            )
+        )
+
+        s = minor * A * (sigma - delta_sigma)
+        return s
+
+    def destination(self, point, bearing, distance=None): # pylint: disable=W0621
+        """
+        TODO docs.
+        """
+        point = Point(point)
+        lat1 = units.radians(degrees=point.latitude)
+        lng1 = units.radians(degrees=point.longitude)
+        bearing = units.radians(degrees=bearing)
+
+        if distance is None:
+            distance = self
+        if isinstance(distance, Distance):
+            distance = distance.kilometers
+
+        ellipsoid = self.ELLIPSOID
+        if isinstance(ellipsoid, string_compare):
+            ellipsoid = ELLIPSOIDS[ellipsoid]
+
+        major, minor, f = ellipsoid
+
+        tan_reduced1 = (1 - f) * tan(lat1)
+        cos_reduced1 = 1 / sqrt(1 + tan_reduced1 ** 2)
+        sin_reduced1 = tan_reduced1 * cos_reduced1
+        sin_bearing, cos_bearing = sin(bearing), cos(bearing)
+        sigma1 = atan2(tan_reduced1, cos_bearing)
+        sin_alpha = cos_reduced1 * sin_bearing
+        cos_sq_alpha = 1 - sin_alpha ** 2
+        u_sq = cos_sq_alpha * (major ** 2 - minor ** 2) / minor ** 2
+
+        A = 1 + u_sq / 16384. * (
+            4096 + u_sq * (-768 + u_sq * (320 - 175 * u_sq))
+        )
+        B = u_sq / 1024. * (256 + u_sq * (-128 + u_sq * (74 - 47 * u_sq)))
+
+        sigma = distance / (minor * A)
+        sigma_prime = 2 * pi
+
+        while abs(sigma - sigma_prime) > 10e-12:
+            cos2_sigma_m = cos(2 * sigma1 + sigma)
+            sin_sigma, cos_sigma = sin(sigma), cos(sigma)
+            delta_sigma = B * sin_sigma * (
+                cos2_sigma_m + B / 4. * (
+                    cos_sigma * (
+                        -1 + 2 * cos2_sigma_m
+                    ) - B / 6. * cos2_sigma_m * (
+                        -3 + 4 * sin_sigma ** 2
+                    ) * (
+                        -3 + 4 * cos2_sigma_m ** 2
+                    )
+                )
+            )
+            sigma_prime = sigma
+            sigma = distance / (minor * A) + delta_sigma
+
+        sin_sigma, cos_sigma = sin(sigma), cos(sigma)
+
+        lat2 = atan2(
+            sin_reduced1 * cos_sigma + cos_reduced1 * sin_sigma * cos_bearing,
+            (1 - f) * sqrt(
+                sin_alpha ** 2 + (
+                    sin_reduced1 * sin_sigma -
+                    cos_reduced1 * cos_sigma * cos_bearing
+                ) ** 2
+            )
+        )
+
+        lambda_lng = atan2(
+            sin_sigma * sin_bearing,
+            cos_reduced1 * cos_sigma - sin_reduced1 * sin_sigma * cos_bearing
+        )
+
+        C = f / 16. * cos_sq_alpha * (4 + f * (4 - 3 * cos_sq_alpha))
+
+        delta_lng = (
+            lambda_lng - (1 - C) * f * sin_alpha * (
+                sigma + C * sin_sigma * (
+                    cos2_sigma_m + C * cos_sigma * (
+                        -1 + 2 * cos2_sigma_m ** 2
+                    )
+                )
+            )
+        )
+
+        lng2 = lng1 + delta_lng
+
+        return Point(units.degrees(radians=lat2), units.degrees(radians=lng2))
+
+
+# Set the default distance formula to the most generally accurate.
+
+distance = VincentyDistance = vincenty
+GreatCircleDistance = great_circle
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/util.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/util.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/util.py	(revision 1126)
@@ -0,0 +1,92 @@
+"""
+Utils.
+"""
+
+import logging
+from geopy.compat import py3k
+
+if not py3k: # pragma: no cover
+    NUMBER_TYPES = (int, long, float)
+else: # pragma: no cover
+    NUMBER_TYPES = (int, float) # long -> int in Py3k
+try:
+    from decimal import Decimal
+    NUMBER_TYPES = NUMBER_TYPES + (Decimal, )
+except ImportError: # pragma: no cover
+    pass
+
+
+__version__ = "1.11.0"
+
+
+class NullHandler(logging.Handler):
+    """
+    No output.
+    """
+
+    def emit(self, record):
+        pass
+
+logger = logging.getLogger('geopy') # pylint: disable=C0103
+logger.setLevel(logging.CRITICAL)
+
+
+def pairwise(seq):
+    """
+    Pair an iterable, e.g., (1, 2, 3, 4) -> ((1, 2), (3, 4))
+    """
+    for i in range(0, len(seq) - 1):
+        yield (seq[i], seq[i + 1])
+
+
+if not py3k:
+    def join_filter(sep, seq, pred=bool):
+        """
+        Join with a filter.
+        """
+        return sep.join([unicode(i) for i in seq if pred(i)])
+else:
+    def join_filter(sep, seq, pred=bool):
+        """
+        Join with a filter.
+        """
+        return sep.join([str(i) for i in seq if pred(i)])
+
+
+if not py3k:
+    def decode_page(page):
+        """
+        Return unicode string of geocoder results.
+
+        Nearly all services use JSON, so assume UTF8 encoding unless the
+        response specifies otherwise.
+        """
+        if hasattr(page, 'read'): # urllib
+            # note getparam in py2
+            encoding = page.headers.getparam("charset") or "utf-8"
+            return unicode(page.read(), encoding=encoding)
+        else: # requests?
+            encoding = page.headers.get("charset", "utf-8")
+            return unicode(page.content, encoding=encoding)
+else:
+    def decode_page(page):
+        """
+        Return unicode string of geocoder results.
+
+        Nearly all services use JSON, so assume UTF8 encoding unless the
+        response specifies otherwise.
+        """
+        if hasattr(page, 'read'): # urllib
+            # note get_param in py3
+            encoding = page.headers.get_param("charset") or "utf-8"
+            return str(page.read(), encoding=encoding)
+        else: # requests?
+            encoding = page.headers.get("charset") or "utf-8"
+            return str(page.content, encoding=encoding)
+
+
+def get_version():
+    from geopy.version import GEOPY_VERSION
+    return str(GEOPY_VERSION)
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/__init__.py	(revision 1126)
@@ -0,0 +1,14 @@
+"""
+geopy is a Python 2 and 3 client for several popular geocoding web services.
+
+geopy makes it easy for Python developers to locate the coordinates of
+addresses, cities, countries, and landmarks across the globe using third-party
+geocoders and other data sources.
+
+geopy is tested against CPython 2.7, CPython 3.2, CPython 3.4, PyPy, and PyPy3.
+"""
+
+from geopy.point import Point
+from geopy.location import Location
+from geopy.geocoders import * # pylint: disable=W0401
+from geopy.util import __version__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/exc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/exc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/exc.py	(revision 1126)
@@ -0,0 +1,75 @@
+"""
+Exceptions raised by geopy.
+"""
+
+class GeopyError(Exception):
+    """
+    Geopy-specific exceptions are all inherited from GeopyError.
+    """
+
+class ConfigurationError(GeopyError):
+    """
+    When instantiating a geocoder, the arguments given were invalid. See
+    the documentation of each geocoder's `__init__` for more details.
+    """
+
+class GeocoderServiceError(GeopyError):
+    """
+    There was an exception caused when calling the remote geocoding service,
+    and no more specific exception could be raised by geopy. When calling
+    geocoders' `geocode` or `reverse` methods, this is the most general
+    exception that can be raised, and any non-geopy exception will be caught
+    and turned into this. The exception's message will be that of the
+    original exception.
+    """
+
+class GeocoderQueryError(GeocoderServiceError):
+    """
+    Either geopy detected input that would cause a request to fail,
+    or a request was made and the remote geocoding service responded
+    that the request was bad.
+    """
+
+class GeocoderQuotaExceeded(GeocoderServiceError):
+    """
+    The remote geocoding service refused to fulfill the request
+    because the client has used its quota.
+    """
+
+class GeocoderAuthenticationFailure(GeocoderServiceError):
+    """
+    The remote geocoding service rejects the API key or account
+    credentials this geocoder was instantiated with.
+    """
+
+class GeocoderInsufficientPrivileges(GeocoderServiceError):
+    """
+    The remote geocoding service refused to fulfill a request using the
+    account credentials given.
+    """
+
+class GeocoderTimedOut(GeocoderServiceError):
+    """
+    The call to the geocoding service was aborted because no response
+    was receiving within the `timeout` argument of either the geocoding class
+    or, if specified, the method call. Some services are just consistently
+    slow, and a higher timeout may be needed to use them.
+    """
+
+class GeocoderUnavailable(GeocoderServiceError):
+    """
+    Either it was not possible to establish a connection to the remote
+    geocoding service, or the service responded with a code indicating
+    it was unavailable.
+    """
+
+class GeocoderParseError(GeocoderServiceError):
+    """
+    Geopy could not parse the service's response. This is a bug in geopy.
+    """
+
+class GeocoderNotFound(GeopyError):
+    """
+    Caller requested the geocoder matching a string, e.g.,
+    "google" > GoogleV3, but no geocoder could be found.
+    """
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/units.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/units.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/geopy/units.py	(revision 1126)
@@ -0,0 +1,128 @@
+"""
+Convert units.
+"""
+
+import math
+
+
+# Angles
+
+def degrees(radians=0, arcminutes=0, arcseconds=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    deg = 0.
+    if radians:
+        deg = math.degrees(radians)
+    if arcminutes:
+        deg += arcminutes / arcmin(degrees=1.)
+    if arcseconds:
+        deg += arcseconds / arcsec(degrees=1.)
+    return deg
+
+def radians(degrees=0, arcminutes=0, arcseconds=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    if arcminutes:
+        degrees += arcminutes / arcmin(degrees=1.)
+    if arcseconds:
+        degrees += arcseconds / arcsec(degrees=1.)
+    return math.radians(degrees)
+
+def arcminutes(degrees=0, radians=0, arcseconds=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    if radians:
+        degrees += math.degrees(radians)
+    if arcseconds:
+        degrees += arcseconds / arcsec(degrees=1.)
+    return degrees * 60.
+
+def arcseconds(degrees=0, radians=0, arcminutes=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    if radians:
+        degrees += math.degrees(radians)
+    if arcminutes:
+        degrees += arcminutes / arcmin(degrees=1.)
+    return degrees * 3600.
+
+
+# Lengths
+
+def kilometers(meters=0, miles=0, feet=0, nautical=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    ret = 0.
+    if meters:
+        ret += meters / 1000.
+    if feet:
+        miles += feet / ft(1.)
+    if nautical:
+        ret += nautical / nm(1.)
+    ret += miles * 1.609344
+    return ret
+
+def meters(kilometers=0, miles=0, feet=0, nautical=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    return (kilometers + km(nautical=nautical, miles=miles, feet=feet)) * 1000
+
+def miles(kilometers=0, meters=0, feet=0, nautical=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    ret = 0.
+    if nautical:
+        kilometers += nautical / nm(1.)
+    if feet:
+        ret += feet / ft(1.)
+    if meters:
+        kilometers += meters / 1000.
+    ret += kilometers / 1.609344
+    return ret
+
+def feet(kilometers=0, meters=0, miles=0, nautical=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    ret = 0.
+    if nautical:
+        kilometers += nautical / nm(1.)
+    if meters:
+        kilometers += meters / 1000.
+    if kilometers:
+        miles += mi(kilometers=kilometers)
+    ret += miles * 5280
+    return ret
+
+def nautical(kilometers=0, meters=0, miles=0, feet=0): # pylint: disable=W0621
+    """
+    TODO docs.
+    """
+    ret = 0.
+    if feet:
+        miles += feet / ft(1.)
+    if miles:
+        kilometers += km(miles=miles)
+    if meters:
+        kilometers += meters / 1000.
+    ret += kilometers / 1.852
+    return ret
+
+
+# Compatible names
+
+rad = radians # pylint: disable=C0103
+arcmin = arcminutes # pylint: disable=C0103
+arcsec = arcseconds # pylint: disable=C0103
+km = kilometers # pylint: disable=C0103
+m = meters # pylint: disable=C0103
+mi = miles # pylint: disable=C0103
+ft = feet # pylint: disable=C0103
+nm = nautical # pylint: disable=C0103
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/examples.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/examples.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/examples.py	(revision 1126)
@@ -0,0 +1,97 @@
+# $Id: examples.py 7320 2012-01-19 22:33:02Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module contains practical examples of Docutils client code.
+
+Importing this module from client code is not recommended; its contents are
+subject to change in future Docutils releases.  Instead, it is recommended
+that you copy and paste the parts you need into your own code, modifying as
+necessary.
+"""
+
+from docutils import core, io
+
+
+def html_parts(input_string, source_path=None, destination_path=None,
+               input_encoding='unicode', doctitle=True,
+               initial_header_level=1):
+    """
+    Given an input string, returns a dictionary of HTML document parts.
+
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.
+
+    Parameters:
+
+    - `input_string`: A multi-line text string; required.
+    - `source_path`: Path to the source file or object.  Optional, but useful
+      for diagnostic output (system messages).
+    - `destination_path`: Path to the file or object which will receive the
+      output; optional.  Used for determining relative paths (stylesheets,
+      source links, etc.).
+    - `input_encoding`: The encoding of `input_string`.  If it is an encoded
+      8-bit string, provide the correct encoding.  If it is a Unicode string,
+      use "unicode", the default.
+    - `doctitle`: Disable the promotion of a lone top-level section title to
+      document title (and subsequent section title to document subtitle
+      promotion); enabled by default.
+    - `initial_header_level`: The initial level for header elements (e.g. 1
+      for "<h1>").
+    """
+    overrides = {'input_encoding': input_encoding,
+                 'doctitle_xform': doctitle,
+                 'initial_header_level': initial_header_level}
+    parts = core.publish_parts(
+        source=input_string, source_path=source_path,
+        destination_path=destination_path,
+        writer_name='html', settings_overrides=overrides)
+    return parts
+
+def html_body(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', output_encoding='unicode',
+              doctitle=True, initial_header_level=1):
+    """
+    Given an input string, returns an HTML fragment as a string.
+
+    The return value is the contents of the <body> element.
+
+    Parameters (see `html_parts()` for the remainder):
+
+    - `output_encoding`: The desired encoding of the output.  If a Unicode
+      string is desired, use the default value of "unicode" .
+    """
+    parts = html_parts(
+        input_string=input_string, source_path=source_path,
+        destination_path=destination_path,
+        input_encoding=input_encoding, doctitle=doctitle,
+        initial_header_level=initial_header_level)
+    fragment = parts['html_body']
+    if output_encoding != 'unicode':
+        fragment = fragment.encode(output_encoding)
+    return fragment
+
+def internals(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', settings_overrides=None):
+    """
+    Return the document tree and publisher, for exploring Docutils internals.
+
+    Parameters: see `html_parts()`.
+    """
+    if settings_overrides:
+        overrides = settings_overrides.copy()
+    else:
+        overrides = {}
+    overrides['input_encoding'] = input_encoding
+    output, pub = core.publish_programmatically(
+        source_class=io.StringInput, source=input_string,
+        source_path=source_path,
+        destination_class=io.NullOutput, destination=None,
+        destination_path=destination_path,
+        reader=None, reader_name='standalone',
+        parser=None, parser_name='restructuredtext',
+        writer=None, writer_name='null',
+        settings=None, settings_spec=None, settings_overrides=overrides,
+        config_section=None, enable_exit_status=None)
+    return pub.writer.document, pub
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/frontend.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/frontend.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/frontend.py	(revision 1126)
@@ -0,0 +1,821 @@
+# $Id: frontend.py 7584 2013-01-01 20:00:21Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Command-line and common processing for Docutils front-end tools.
+
+Exports the following classes:
+
+* `OptionParser`: Standard Docutils command-line processing.
+* `Option`: Customized version of `optparse.Option`; validation support.
+* `Values`: Runtime settings; objects are simple structs
+  (``object.attribute``).  Supports cumulative list settings (attributes).
+* `ConfigParser`: Standard Docutils config file processing.
+
+Also exports the following functions:
+
+* Option callbacks: `store_multiple`, `read_config_file`.
+* Setting validators: `validate_encoding`,
+  `validate_encoding_error_handler`,
+  `validate_encoding_and_error_handler`,
+  `validate_boolean`, `validate_ternary`, `validate_threshold`,
+  `validate_colon_separated_string_list`,
+  `validate_comma_separated_string_list`,
+  `validate_dependency_file`.
+* `make_paths_absolute`.
+* SettingSpec manipulation: `filter_settings_spec`.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os
+import os.path
+import sys
+import warnings
+import ConfigParser as CP
+import codecs
+import optparse
+from optparse import SUPPRESS_HELP
+import docutils
+import docutils.utils
+import docutils.nodes
+from docutils.utils.error_reporting import locale_encoding, ErrorOutput, ErrorString
+
+
+def store_multiple(option, opt, value, parser, *args, **kwargs):
+    """
+    Store multiple values in `parser.values`.  (Option callback.)
+
+    Store `None` for each attribute named in `args`, and store the value for
+    each key (attribute name) in `kwargs`.
+    """
+    for attribute in args:
+        setattr(parser.values, attribute, None)
+    for key, value in kwargs.items():
+        setattr(parser.values, key, value)
+
+def read_config_file(option, opt, value, parser):
+    """
+    Read a configuration file during option processing.  (Option callback.)
+    """
+    try:
+        new_settings = parser.get_config_file_settings(value)
+    except ValueError, error:
+        parser.error(error)
+    parser.values.update(new_settings, parser)
+
+def validate_encoding(setting, value, option_parser,
+                      config_parser=None, config_section=None):
+    try:
+        codecs.lookup(value)
+    except LookupError:
+        raise (LookupError('setting "%s": unknown encoding: "%s"'
+                           % (setting, value)),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_error_handler(setting, value, option_parser,
+                                    config_parser=None, config_section=None):
+    try:
+        codecs.lookup_error(value)
+    except LookupError:
+        raise (LookupError(
+            'unknown encoding error handler: "%s" (choices: '
+            '"strict", "ignore", "replace", "backslashreplace", '
+            '"xmlcharrefreplace", and possibly others; see documentation for '
+            'the Python ``codecs`` module)' % value),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_and_error_handler(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    """
+    Side-effect: if an error handler is included in the value, it is inserted
+    into the appropriate place as if it was a separate setting/option.
+    """
+    if ':' in value:
+        encoding, handler = value.split(':')
+        validate_encoding_error_handler(
+            setting + '_error_handler', handler, option_parser,
+            config_parser, config_section)
+        if config_parser:
+            config_parser.set(config_section, setting + '_error_handler',
+                              handler)
+        else:
+            setattr(option_parser.values, setting + '_error_handler', handler)
+    else:
+        encoding = value
+    validate_encoding(setting, encoding, option_parser,
+                      config_parser, config_section)
+    return encoding
+
+def validate_boolean(setting, value, option_parser,
+                     config_parser=None, config_section=None):
+    """Check/normalize boolean settings:
+         True:  '1', 'on', 'yes', 'true'
+         False: '0', 'off', 'no','false', ''
+    """
+    if isinstance(value, bool):
+        return value
+    try:
+        return option_parser.booleans[value.strip().lower()]
+    except KeyError:
+        raise (LookupError('unknown boolean value: "%s"' % value),
+               None, sys.exc_info()[2])
+
+def validate_ternary(setting, value, option_parser,
+                     config_parser=None, config_section=None):
+    """Check/normalize three-value settings:
+         True:  '1', 'on', 'yes', 'true'
+         False: '0', 'off', 'no','false', ''
+         any other value: returned as-is.
+    """
+    if isinstance(value, bool) or value is None:
+        return value
+    try:
+        return option_parser.booleans[value.strip().lower()]
+    except KeyError:
+        return value
+
+def validate_nonnegative_int(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    value = int(value)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+def validate_threshold(setting, value, option_parser,
+                       config_parser=None, config_section=None):
+    try:
+        return int(value)
+    except ValueError:
+        try:
+            return option_parser.thresholds[value.lower()]
+        except (KeyError, AttributeError):
+            raise (LookupError('unknown threshold: %r.' % value),
+                   None, sys.exc_info[2])
+
+def validate_colon_separated_string_list(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if not isinstance(value, list):
+        value = value.split(':')
+    else:
+        last = value.pop()
+        value.extend(last.split(':'))
+    return value
+
+def validate_comma_separated_list(setting, value, option_parser,
+                                    config_parser=None, config_section=None):
+    """Check/normalize list arguments (split at "," and strip whitespace).
+    """
+    # `value` is already a ``list`` when  given as command line option
+    # and "action" is "append" and ``unicode`` or ``str`` else.
+    if not isinstance(value, list):
+        value = [value]
+    # this function is called for every option added to `value`
+    # -> split the last item and append the result:
+    last = value.pop()
+    items = [i.strip(u' \t\n') for i in last.split(u',') if i.strip(u' \t\n')]
+    value.extend(items)
+    return value
+
+def validate_url_trailing_slash(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if not value:
+        return './'
+    elif value.endswith('/'):
+        return value
+    else:
+        return value + '/'
+
+def validate_dependency_file(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    try:
+        return docutils.utils.DependencyList(value)
+    except IOError:
+        return docutils.utils.DependencyList(None)
+
+def validate_strip_class(setting, value, option_parser,
+                         config_parser=None, config_section=None):
+    # value is a comma separated string list:
+    value = validate_comma_separated_list(setting, value, option_parser,
+                                          config_parser, config_section)
+    # validate list elements:
+    for cls in value:
+        normalized = docutils.nodes.make_id(cls)
+        if cls != normalized:
+            raise ValueError('invalid class value %r (perhaps %r?)'
+                             % (cls, normalized))
+    return value
+
+def make_paths_absolute(pathdict, keys, base_path=None):
+    """
+    Interpret filesystem path settings relative to the `base_path` given.
+
+    Paths are values in `pathdict` whose keys are in `keys`.  Get `keys` from
+    `OptionParser.relative_path_settings`.
+    """
+    if base_path is None:
+        base_path = os.getcwdu() # type(base_path) == unicode
+        # to allow combining non-ASCII cwd with unicode values in `pathdict`
+    for key in keys:
+        if key in pathdict:
+            value = pathdict[key]
+            if isinstance(value, list):
+                value = [make_one_path_absolute(base_path, path)
+                         for path in value]
+            elif value:
+                value = make_one_path_absolute(base_path, value)
+            pathdict[key] = value
+
+def make_one_path_absolute(base_path, path):
+    return os.path.abspath(os.path.join(base_path, path))
+
+def filter_settings_spec(settings_spec, *exclude, **replace):
+    """Return a copy of `settings_spec` excluding/replacing some settings.
+
+    `settings_spec` is a tuple of configuration settings with a structure
+    described for docutils.SettingsSpec.settings_spec.
+
+    Optional positional arguments are names of to-be-excluded settings.
+    Keyword arguments are option specification replacements.
+    (See the html4strict writer for an example.)
+    """
+    settings = list(settings_spec)
+    # every third item is a sequence of option tuples
+    for i in range(2, len(settings), 3):
+        newopts = []
+        for opt_spec in settings[i]:
+            # opt_spec is ("<help>", [<option strings>], {<keyword args>})
+            opt_name = [opt_string[2:].replace('-', '_')
+                        for opt_string in opt_spec[1]
+                            if opt_string.startswith('--')
+                       ][0]
+            if opt_name in exclude:
+                continue
+            if opt_name in replace.keys():
+                newopts.append(replace[opt_name])
+            else:
+                newopts.append(opt_spec)
+        settings[i] = tuple(newopts)
+    return tuple(settings)
+
+
+class Values(optparse.Values):
+
+    """
+    Updates list attributes by extension rather than by replacement.
+    Works in conjunction with the `OptionParser.lists` instance attribute.
+    """
+
+    def __init__(self, *args, **kwargs):
+        optparse.Values.__init__(self, *args, **kwargs)
+        if (not hasattr(self, 'record_dependencies')
+            or self.record_dependencies is None):
+            # Set up dependency list, in case it is needed.
+            self.record_dependencies = docutils.utils.DependencyList()
+
+    def update(self, other_dict, option_parser):
+        if isinstance(other_dict, Values):
+            other_dict = other_dict.__dict__
+        other_dict = other_dict.copy()
+        for setting in option_parser.lists.keys():
+            if (hasattr(self, setting) and setting in other_dict):
+                value = getattr(self, setting)
+                if value:
+                    value += other_dict[setting]
+                    del other_dict[setting]
+        self._update_loose(other_dict)
+
+    def copy(self):
+        """Return a shallow copy of `self`."""
+        return self.__class__(defaults=self.__dict__)
+
+
+class Option(optparse.Option):
+
+    ATTRS = optparse.Option.ATTRS + ['validator', 'overrides']
+
+    def process(self, opt, value, values, parser):
+        """
+        Call the validator function on applicable settings and
+        evaluate the 'overrides' option.
+        Extends `optparse.Option.process`.
+        """
+        result = optparse.Option.process(self, opt, value, values, parser)
+        setting = self.dest
+        if setting:
+            if self.validator:
+                value = getattr(values, setting)
+                try:
+                    new_value = self.validator(setting, value, parser)
+                except Exception, error:
+                    raise (optparse.OptionValueError(
+                        'Error in option "%s":\n    %s'
+                        % (opt, ErrorString(error))),
+                           None, sys.exc_info()[2])
+                setattr(values, setting, new_value)
+            if self.overrides:
+                setattr(values, self.overrides, None)
+        return result
+
+
+class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
+
+    """
+    Parser for command-line and library use.  The `settings_spec`
+    specification here and in other Docutils components are merged to build
+    the set of command-line options and runtime settings for this process.
+
+    Common settings (defined below) and component-specific settings must not
+    conflict.  Short options are reserved for common settings, and components
+    are restrict to using long options.
+    """
+
+    standard_config_files = [
+        '/etc/docutils.conf',           # system-wide
+        './docutils.conf',              # project-specific
+        '~/.docutils']                  # user-specific
+    """Docutils configuration files, using ConfigParser syntax.  Filenames
+    will be tilde-expanded later.  Later files override earlier ones."""
+
+    threshold_choices = 'info 1 warning 2 error 3 severe 4 none 5'.split()
+    """Possible inputs for for --report and --halt threshold values."""
+
+    thresholds = {'info': 1, 'warning': 2, 'error': 3, 'severe': 4, 'none': 5}
+    """Lookup table for --report and --halt threshold values."""
+
+    booleans={'1': True, 'on': True, 'yes': True, 'true': True,
+              '0': False, 'off': False, 'no': False, 'false': False, '': False}
+    """Lookup table for boolean configuration file settings."""
+
+    default_error_encoding = getattr(sys.stderr, 'encoding',
+                                     None) or locale_encoding or 'ascii'
+
+    default_error_encoding_error_handler = 'backslashreplace'
+
+    settings_spec = (
+        'General Docutils Options',
+        None,
+        (('Specify the document title as metadata.',
+          ['--title'], {}),
+         ('Include a "Generated by Docutils" credit and link.',
+          ['--generator', '-g'], {'action': 'store_true',
+                                  'validator': validate_boolean}),
+         ('Do not include a generator credit.',
+          ['--no-generator'], {'action': 'store_false', 'dest': 'generator'}),
+         ('Include the date at the end of the document (UTC).',
+          ['--date', '-d'], {'action': 'store_const', 'const': '%Y-%m-%d',
+                             'dest': 'datestamp'}),
+         ('Include the time & date (UTC).',
+          ['--time', '-t'], {'action': 'store_const',
+                             'const': '%Y-%m-%d %H:%M UTC',
+                             'dest': 'datestamp'}),
+         ('Do not include a datestamp of any kind.',
+          ['--no-datestamp'], {'action': 'store_const', 'const': None,
+                               'dest': 'datestamp'}),
+         ('Include a "View document source" link.',
+          ['--source-link', '-s'], {'action': 'store_true',
+                                    'validator': validate_boolean}),
+         ('Use <URL> for a source link; implies --source-link.',
+          ['--source-url'], {'metavar': '<URL>'}),
+         ('Do not include a "View document source" link.',
+          ['--no-source-link'],
+          {'action': 'callback', 'callback': store_multiple,
+           'callback_args': ('source_link', 'source_url')}),
+         ('Link from section headers to TOC entries.  (default)',
+          ['--toc-entry-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'entry',
+           'default': 'entry'}),
+         ('Link from section headers to the top of the TOC.',
+          ['--toc-top-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'top'}),
+         ('Disable backlinks to the table of contents.',
+          ['--no-toc-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_false'}),
+         ('Link from footnotes/citations to references. (default)',
+          ['--footnote-backlinks'],
+          {'action': 'store_true', 'default': 1,
+           'validator': validate_boolean}),
+         ('Disable backlinks from footnotes and citations.',
+          ['--no-footnote-backlinks'],
+          {'dest': 'footnote_backlinks', 'action': 'store_false'}),
+         ('Enable section numbering by Docutils.  (default)',
+          ['--section-numbering'],
+          {'action': 'store_true', 'dest': 'sectnum_xform',
+           'default': 1, 'validator': validate_boolean}),
+         ('Disable section numbering by Docutils.',
+          ['--no-section-numbering'],
+          {'action': 'store_false', 'dest': 'sectnum_xform'}),
+         ('Remove comment elements from the document tree.',
+          ['--strip-comments'],
+          {'action': 'store_true', 'validator': validate_boolean}),
+         ('Leave comment elements in the document tree. (default)',
+          ['--leave-comments'],
+          {'action': 'store_false', 'dest': 'strip_comments'}),
+         ('Remove all elements with classes="<class>" from the document tree. '
+          'Warning: potentially dangerous; use with caution. '
+          '(Multiple-use option.)',
+          ['--strip-elements-with-class'],
+          {'action': 'append', 'dest': 'strip_elements_with_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Remove all classes="<class>" attributes from elements in the '
+          'document tree. Warning: potentially dangerous; use with caution. '
+          '(Multiple-use option.)',
+          ['--strip-class'],
+          {'action': 'append', 'dest': 'strip_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Report system messages at or higher than <level>: "info" or "1", '
+          '"warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"',
+          ['--report', '-r'], {'choices': threshold_choices, 'default': 2,
+                               'dest': 'report_level', 'metavar': '<level>',
+                               'validator': validate_threshold}),
+         ('Report all system messages.  (Same as "--report=1".)',
+          ['--verbose', '-v'], {'action': 'store_const', 'const': 1,
+                                'dest': 'report_level'}),
+         ('Report no system messages.  (Same as "--report=5".)',
+          ['--quiet', '-q'], {'action': 'store_const', 'const': 5,
+                              'dest': 'report_level'}),
+         ('Halt execution at system messages at or above <level>.  '
+          'Levels as in --report.  Default: 4 (severe).',
+          ['--halt'], {'choices': threshold_choices, 'dest': 'halt_level',
+                       'default': 4, 'metavar': '<level>',
+                       'validator': validate_threshold}),
+         ('Halt at the slightest problem.  Same as "--halt=info".',
+          ['--strict'], {'action': 'store_const', 'const': 1,
+                         'dest': 'halt_level'}),
+         ('Enable a non-zero exit status for non-halting system messages at '
+          'or above <level>.  Default: 5 (disabled).',
+          ['--exit-status'], {'choices': threshold_choices,
+                              'dest': 'exit_status_level',
+                              'default': 5, 'metavar': '<level>',
+                              'validator': validate_threshold}),
+         ('Enable debug-level system messages and diagnostics.',
+          ['--debug'], {'action': 'store_true', 'validator': validate_boolean}),
+         ('Disable debug output.  (default)',
+          ['--no-debug'], {'action': 'store_false', 'dest': 'debug'}),
+         ('Send the output of system messages to <file>.',
+          ['--warnings'], {'dest': 'warning_stream', 'metavar': '<file>'}),
+         ('Enable Python tracebacks when Docutils is halted.',
+          ['--traceback'], {'action': 'store_true', 'default': None,
+                            'validator': validate_boolean}),
+         ('Disable Python tracebacks.  (default)',
+          ['--no-traceback'], {'dest': 'traceback', 'action': 'store_false'}),
+         ('Specify the encoding and optionally the '
+          'error handler of input text.  Default: <locale-dependent>:strict.',
+          ['--input-encoding', '-i'],
+          {'metavar': '<name[:handler]>',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for undecodable characters.  '
+          'Choices: "strict" (default), "ignore", and "replace".',
+          ['--input-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify the text encoding and optionally the error handler for '
+          'output.  Default: UTF-8:strict.',
+          ['--output-encoding', '-o'],
+          {'metavar': '<name[:handler]>', 'default': 'utf-8',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify error handler for unencodable output characters; '
+          '"strict" (default), "ignore", "replace", '
+          '"xmlcharrefreplace", "backslashreplace".',
+          ['--output-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify text encoding and error handler for error output.  '
+          'Default: %s:%s.'
+          % (default_error_encoding, default_error_encoding_error_handler),
+          ['--error-encoding', '-e'],
+          {'metavar': '<name[:handler]>', 'default': default_error_encoding,
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for unencodable characters in '
+          'error output.  Default: %s.'
+          % default_error_encoding_error_handler,
+          ['--error-encoding-error-handler'],
+          {'default': default_error_encoding_error_handler,
+           'validator': validate_encoding_error_handler}),
+         ('Specify the language (as BCP 47 language tag).  Default: en.',
+          ['--language', '-l'], {'dest': 'language_code', 'default': 'en',
+                                 'metavar': '<name>'}),
+         ('Write output file dependencies to <file>.',
+          ['--record-dependencies'],
+          {'metavar': '<file>', 'validator': validate_dependency_file,
+           'default': None}),           # default set in Values class
+         ('Read configuration settings from <file>, if it exists.',
+          ['--config'], {'metavar': '<file>', 'type': 'string',
+                         'action': 'callback', 'callback': read_config_file}),
+         ("Show this program's version number and exit.",
+          ['--version', '-V'], {'action': 'version'}),
+         ('Show this help message and exit.',
+          ['--help', '-h'], {'action': 'help'}),
+         # Typically not useful for non-programmatical use:
+         (SUPPRESS_HELP, ['--id-prefix'], {'default': ''}),
+         (SUPPRESS_HELP, ['--auto-id-prefix'], {'default': 'id'}),
+         # Hidden options, for development use only:
+         (SUPPRESS_HELP, ['--dump-settings'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-internals'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-transforms'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-pseudo-xml'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--expose-internal-attribute'],
+          {'action': 'append', 'dest': 'expose_internals',
+           'validator': validate_colon_separated_string_list}),
+         (SUPPRESS_HELP, ['--strict-visitor'], {'action': 'store_true'}),
+         ))
+    """Runtime settings and command-line options common to all Docutils front
+    ends.  Setting specs specific to individual Docutils components are also
+    used (see `populate_from_components()`)."""
+
+    settings_defaults = {'_disable_config': None,
+                         '_source': None,
+                         '_destination': None,
+                         '_config_files': None}
+    """Defaults for settings that don't have command-line option equivalents."""
+
+    relative_path_settings = ('warning_stream',)
+
+    config_section = 'general'
+
+    version_template = ('%%prog (Docutils %s [%s], Python %s, on %s)'
+                        % (docutils.__version__, docutils.__version_details__,
+                           sys.version.split()[0], sys.platform))
+    """Default version message."""
+
+    def __init__(self, components=(), defaults=None, read_config_files=None,
+                 *args, **kwargs):
+        """
+        `components` is a list of Docutils components each containing a
+        ``.settings_spec`` attribute.  `defaults` is a mapping of setting
+        default overrides.
+        """
+
+        self.lists = {}
+        """Set of list-type settings."""
+
+        self.config_files = []
+        """List of paths of applied configuration files."""
+
+        optparse.OptionParser.__init__(
+            self, option_class=Option, add_help_option=None,
+            formatter=optparse.TitledHelpFormatter(width=78),
+            *args, **kwargs)
+        if not self.version:
+            self.version = self.version_template
+        # Make an instance copy (it will be modified):
+        self.relative_path_settings = list(self.relative_path_settings)
+        self.components = (self,) + tuple(components)
+        self.populate_from_components(self.components)
+        self.set_defaults_from_dict(defaults or {})
+        if read_config_files and not self.defaults['_disable_config']:
+            try:
+                config_settings = self.get_standard_config_settings()
+            except ValueError, error:
+                self.error(error)
+            self.set_defaults_from_dict(config_settings.__dict__)
+
+    def populate_from_components(self, components):
+        """
+        For each component, first populate from the `SettingsSpec.settings_spec`
+        structure, then from the `SettingsSpec.settings_defaults` dictionary.
+        After all components have been processed, check for and populate from
+        each component's `SettingsSpec.settings_default_overrides` dictionary.
+        """
+        for component in components:
+            if component is None:
+                continue
+            settings_spec = component.settings_spec
+            self.relative_path_settings.extend(
+                component.relative_path_settings)
+            for i in range(0, len(settings_spec), 3):
+                title, description, option_spec = settings_spec[i:i+3]
+                if title:
+                    group = optparse.OptionGroup(self, title, description)
+                    self.add_option_group(group)
+                else:
+                    group = self        # single options
+                for (help_text, option_strings, kwargs) in option_spec:
+                    option = group.add_option(help=help_text, *option_strings,
+                                              **kwargs)
+                    if kwargs.get('action') == 'append':
+                        self.lists[option.dest] = 1
+                if component.settings_defaults:
+                    self.defaults.update(component.settings_defaults)
+        for component in components:
+            if component and component.settings_default_overrides:
+                self.defaults.update(component.settings_default_overrides)
+
+    def get_standard_config_files(self):
+        """Return list of config files, from environment or standard."""
+        try:
+            config_files = os.environ['DOCUTILSCONFIG'].split(os.pathsep)
+        except KeyError:
+            config_files = self.standard_config_files
+
+        # If 'HOME' is not set, expandvars() requires the 'pwd' module which is
+        # not available under certain environments, for example, within
+        # mod_python.  The publisher ends up in here, and we need to publish
+        # from within mod_python.  Therefore we need to avoid expanding when we
+        # are in those environments.
+        expand = os.path.expanduser
+        if 'HOME' not in os.environ:
+            try:
+                import pwd
+            except ImportError:
+                expand = lambda x: x
+        return [expand(f) for f in config_files if f.strip()]
+
+    def get_standard_config_settings(self):
+        settings = Values()
+        for filename in self.get_standard_config_files():
+            settings.update(self.get_config_file_settings(filename), self)
+        return settings
+
+    def get_config_file_settings(self, config_file):
+        """Returns a dictionary containing appropriate config file settings."""
+        parser = ConfigParser()
+        parser.read(config_file, self)
+        self.config_files.extend(parser._files)
+        base_path = os.path.dirname(config_file)
+        applied = {}
+        settings = Values()
+        for component in self.components:
+            if not component:
+                continue
+            for section in (tuple(component.config_section_dependencies or ())
+                            + (component.config_section,)):
+                if section in applied:
+                    continue
+                applied[section] = 1
+                settings.update(parser.get_section(section), self)
+        make_paths_absolute(
+            settings.__dict__, self.relative_path_settings, base_path)
+        return settings.__dict__
+
+    def check_values(self, values, args):
+        """Store positional arguments as runtime settings."""
+        values._source, values._destination = self.check_args(args)
+        make_paths_absolute(values.__dict__, self.relative_path_settings)
+        values._config_files = self.config_files
+        return values
+
+    def check_args(self, args):
+        source = destination = None
+        if args:
+            source = args.pop(0)
+            if source == '-':           # means stdin
+                source = None
+        if args:
+            destination = args.pop(0)
+            if destination == '-':      # means stdout
+                destination = None
+        if args:
+            self.error('Maximum 2 arguments allowed.')
+        if source and source == destination:
+            self.error('Do not specify the same file for both source and '
+                       'destination.  It will clobber the source file.')
+        return source, destination
+
+    def set_defaults_from_dict(self, defaults):
+        self.defaults.update(defaults)
+
+    def get_default_values(self):
+        """Needed to get custom `Values` instances."""
+        defaults = Values(self.defaults)
+        defaults._config_files = self.config_files
+        return defaults
+
+    def get_option_by_dest(self, dest):
+        """
+        Get an option by its dest.
+
+        If you're supplying a dest which is shared by several options,
+        it is undefined which option of those is returned.
+
+        A KeyError is raised if there is no option with the supplied
+        dest.
+        """
+        for group in self.option_groups + [self]:
+            for option in group.option_list:
+                if option.dest == dest:
+                    return option
+        raise KeyError('No option with dest == %r.' % dest)
+
+
+class ConfigParser(CP.RawConfigParser):
+
+    old_settings = {
+        'pep_stylesheet': ('pep_html writer', 'stylesheet'),
+        'pep_stylesheet_path': ('pep_html writer', 'stylesheet_path'),
+        'pep_template': ('pep_html writer', 'template')}
+    """{old setting: (new section, new setting)} mapping, used by
+    `handle_old_config`, to convert settings from the old [options] section."""
+
+    old_warning = """
+The "[option]" section is deprecated.  Support for old-format configuration
+files may be removed in a future Docutils release.  Please revise your
+configuration files.  See <http://docutils.sf.net/docs/user/config.html>,
+section "Old-Format Configuration Files".
+"""
+
+    not_utf8_error = """\
+Unable to read configuration file "%s": content not encoded as UTF-8.
+Skipping "%s" configuration file.
+"""
+
+    def __init__(self, *args, **kwargs):
+        CP.RawConfigParser.__init__(self, *args, **kwargs)
+
+        self._files = []
+        """List of paths of configuration files read."""
+
+        self._stderr = ErrorOutput()
+        """Wrapper around sys.stderr catching en-/decoding errors"""
+
+    def read(self, filenames, option_parser):
+        if type(filenames) in (str, unicode):
+            filenames = [filenames]
+        for filename in filenames:
+            try:
+                # Config files must be UTF-8-encoded:
+                fp = codecs.open(filename, 'r', 'utf-8')
+            except IOError:
+                continue
+            try:
+                if sys.version_info < (3,2):
+                    CP.RawConfigParser.readfp(self, fp, filename)
+                else:
+                    CP.RawConfigParser.read_file(self, fp, filename)
+            except UnicodeDecodeError:
+                self._stderr.write(self.not_utf8_error % (filename, filename))
+                fp.close()
+                continue
+            fp.close()
+            self._files.append(filename)
+            if self.has_section('options'):
+                self.handle_old_config(filename)
+            self.validate_settings(filename, option_parser)
+
+    def handle_old_config(self, filename):
+        warnings.warn_explicit(self.old_warning, ConfigDeprecationWarning,
+                               filename, 0)
+        options = self.get_section('options')
+        if not self.has_section('general'):
+            self.add_section('general')
+        for key, value in options.items():
+            if key in self.old_settings:
+                section, setting = self.old_settings[key]
+                if not self.has_section(section):
+                    self.add_section(section)
+            else:
+                section = 'general'
+                setting = key
+            if not self.has_option(section, setting):
+                self.set(section, setting, value)
+        self.remove_section('options')
+
+    def validate_settings(self, filename, option_parser):
+        """
+        Call the validator function and implement overrides on all applicable
+        settings.
+        """
+        for section in self.sections():
+            for setting in self.options(section):
+                try:
+                    option = option_parser.get_option_by_dest(setting)
+                except KeyError:
+                    continue
+                if option.validator:
+                    value = self.get(section, setting)
+                    try:
+                        new_value = option.validator(
+                            setting, value, option_parser,
+                            config_parser=self, config_section=section)
+                    except Exception, error:
+                        raise (ValueError(
+                            'Error in config file "%s", section "[%s]":\n'
+                            '    %s\n'
+                            '        %s = %s'
+                            % (filename, section, ErrorString(error),
+                               setting, value)), None, sys.exc_info()[2])
+                    self.set(section, setting, new_value)
+                if option.overrides:
+                    self.set(section, option.overrides, None)
+
+    def optionxform(self, optionstr):
+        """
+        Transform '-' to '_' so the cmdline form of option names can be used.
+        """
+        return optionstr.lower().replace('-', '_')
+
+    def get_section(self, section):
+        """
+        Return a given section as a dictionary (empty if the section
+        doesn't exist).
+        """
+        section_dict = {}
+        if self.has_section(section):
+            for option in self.options(section):
+                section_dict[option] = self.get(section, option)
+        return section_dict
+
+
+class ConfigDeprecationWarning(DeprecationWarning):
+    """Warning for deprecated configuration file features."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/lt.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/lt.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/lt.py	(revision 1126)
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# $Id: lt.py 7911 2015-08-31 08:23:06Z milde $
+# Author: Dalius Dobravolskas <dalius.do...@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Lithuanian language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Autorius',
+      'authors': 'Autoriai',
+      'organization': 'Organizacija',
+      'address': 'Adresas',
+      'contact': 'Kontaktas',
+      'version': 'Versija',
+      'revision': 'Revizija',
+      'status': u'Būsena',
+      'date': 'Data',
+      'copyright': u'Autoriaus teisės',
+      'dedication': 'Dedikacija',
+      'abstract': 'Santrauka',
+      'attention': u'Dėmesio!',
+      'caution': 'Atsargiai!',
+      'danger': '!PAVOJINGA!',
+      'error': 'Klaida',
+      'hint': u'Užuomina',
+      'important': 'Svarbu',
+      'note': 'Pastaba',
+      'tip': 'Patarimas',
+      'warning': u'Įspėjimas',
+      'contents': 'Turinys'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'autorius': 'author',
+      'autoriai': 'authors',
+      'organizacija': 'organization',
+      'adresas': 'address',
+      'kontaktas': 'contact',
+      'versija': 'version',
+      'revizija': 'revision',
+      'būsena': 'status',
+      'data': 'date',
+      'autoriaus teisės': 'copyright',
+      'dedikacija': 'dedication',
+      'santrauka': 'abstract'}
+"""Lithuanian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/lv.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/lv.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/lv.py	(revision 1126)
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+# $Id: lv.py 7975 2016-10-20 20:00:19Z milde $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Latvian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Autors',
+      'authors': 'Autori',
+      'organization': 'Organizācija',
+      'address': 'Adrese',
+      'contact': 'Kontakti',
+      'version': 'Versija',
+      'revision': 'Revīzija',
+      'status': 'Statuss',
+      'date': 'Datums',
+      'copyright': 'Copyright',
+      'dedication': 'Veltījums',
+      'abstract': 'Atreferējums',
+      'attention': 'Uzmanību!',
+      'caution': 'Piesardzību!',
+      'danger': '!BĪSTAMI!',
+      'error': 'Kļūda',
+      'hint': 'Ieteikums',
+      'important': 'Svarīgi',
+      'note': 'Piezīme',
+      'tip': 'Padoms',
+      'warning': 'Brīdinājums',
+      'contents': 'Saturs'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'autors': 'author',
+      'autori': 'authors',
+      'organizācija': 'organization',
+      'adrese': 'address',
+      'kontakti': 'contact',
+      'versija': 'version',
+      'revīzija': 'revision',
+      'statuss': 'status',
+      'datums': 'date',
+      'copyright': 'copyright',
+      'veltījums': 'dedication',
+      'atreferējums': 'abstract'}
+"""English (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ca.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ca.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ca.py	(revision 1126)
@@ -0,0 +1,60 @@
+# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autors',
+      'organization': u'Organitzaci\u00F3',
+      'address': u'Adre\u00E7a',
+      'contact': u'Contacte',
+      'version': u'Versi\u00F3',
+      'revision': u'Revisi\u00F3',
+      'status': u'Estat',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F2ria',
+      'abstract': u'Resum',
+      'attention': u'Atenci\u00F3!',
+      'caution': u'Compte!',
+      'danger': u'PERILL!',
+      'error': u'Error',
+      'hint': u'Suggeriment',
+      'important': u'Important',
+      'note': u'Nota',
+      'tip': u'Consell',
+      'warning': u'Av\u00EDs',
+      'contents': u'Contingut'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autors': 'authors',
+      u'organitzaci\u00F3': 'organization',
+      u'adre\u00E7a': 'address',
+      u'contacte': 'contact',
+      u'versi\u00F3': 'version',
+      u'revisi\u00F3': 'revision',
+      u'estat': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F2ria': 'dedication',
+      u'resum': 'abstract'}
+"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/da.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/da.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/da.py	(revision 1126)
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+# $Id: da.py 7678 2013-07-03 09:57:36Z milde $
+# Author: E D
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Danish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Forfatter',
+      'authors': u'Forfattere',
+      'organization': u'Organisation',
+      'address': u'Adresse',
+      'contact': u'Kontakt',
+      'version': u'Version',
+      'revision': u'Revision',
+      'status': u'Status',
+      'date': u'Dato',
+      'copyright': u'Copyright',
+      'dedication': u'Dedikation',
+      'abstract': u'Resumé',
+      'attention': u'Giv agt!',
+      'caution': u'Pas på!',
+      'danger': u'!FARE!',
+      'error': u'Fejl',
+      'hint': u'Vink',
+      'important': u'Vigtigt',
+      'note': u'Bemærk',
+      'tip': u'Tips',
+      'warning': u'Advarsel',
+      'contents': u'Indhold'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'forfatter': 'author',
+      u'forfattere': 'authors',
+      u'organisation': 'organization',
+      u'adresse': 'address',
+      u'kontakt': 'contact',
+      u'version': 'version',
+      u'revision': 'revision',
+      u'status': 'status',
+      u'dato': 'date',
+      u'copyright': 'copyright',
+      u'dedikation': 'dedication',
+      u'resume': 'abstract',
+      u'resumé': 'abstract'}
+"""Danish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ru.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ru.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ru.py	(revision 1126)
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+# $Id: ru.py 7125 2011-09-16 18:36:18Z milde $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'abstract': u'Аннотация',
+      u'address': u'Адрес',
+      u'attention': u'Внимание!',
+      u'author': u'Автор',
+      u'authors': u'Авторы',
+      u'caution': u'Осторожно!',
+      u'contact': u'Контакт',
+      u'contents': u'Содержание',
+      u'copyright': u'Права копирования',
+      u'danger': u'ОПАСНО!',
+      u'date': u'Дата',
+      u'dedication': u'Посвящение',
+      u'error': u'Ошибка',
+      u'hint': u'Совет',
+      u'important': u'Важно',
+      u'note': u'Примечание',
+      u'organization': u'Организация',
+      u'revision': u'Редакция',
+      u'status': u'Статус',
+      u'tip': u'Подсказка',
+      u'version': u'Версия',
+      u'warning': u'Предупреждение'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'аннотация': u'abstract',
+      u'адрес': u'address',
+      u'автор': u'author',
+      u'авторы': u'authors',
+      u'контакт': u'contact',
+      u'права копирования': u'copyright',
+      u'дата': u'date',
+      u'посвящение': u'dedication',
+      u'организация': u'organization',
+      u'редакция': u'revision',
+      u'статус': u'status',
+      u'версия': u'version'}
+"""Russian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators =  [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/af.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/af.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/af.py	(revision 1126)
@@ -0,0 +1,58 @@
+# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisasie',
+      'address': 'Adres',
+      'contact': 'Kontak',
+      'version': 'Weergawe',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Kopiereg',
+      'dedication': 'Opdrag',
+      'abstract': 'Opsomming',
+      'attention': 'Aandag!',
+      'caution': 'Wees versigtig!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Wenk',
+      'important': 'Belangrik',
+      'note': 'Nota',
+      'tip': 'Tip', # hint and tip both have the same translation: wenk
+      'warning': 'Waarskuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisasie': 'organization',
+      'adres': 'address',
+      'kontak': 'contact',
+      'weergawe': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'kopiereg': 'copyright',
+      'opdrag': 'dedication',
+      'opsomming': 'abstract'}
+"""Afrikaans (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fa.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fa.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fa.py	(revision 1126)
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# $Id: fa.py 4564 2016-08-10 11:48:42Z
+# Author: Shahin <me@5hah.in>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Persian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      u'author': u'نویسنده',
+      u'authors': u'نویسندگان',
+      u'organization': u'سازمان',
+      u'address': u'آدرس',
+      u'contact': u'تماس',
+      u'version': u'نسخه',
+      u'revision': u'بازبینی',
+      u'status': u'وضعیت',
+      u'date': u'تاریخ',
+      u'copyright': u'کپی‌رایت',
+      u'dedication': u'تخصیص',
+      u'abstract': u'چکیده',
+      u'attention': u'توجه!',
+      u'caution': u'احتیاط!',
+      u'danger': u'خطر!',
+      u'error': u'خطا',
+      u'hint': u'راهنما',
+      u'important': u'مهم',
+      u'note': u'یادداشت',
+      u'tip': u'نکته',
+      u'warning': u'اخطار',
+      u'contents': u'محتوا'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'نویسنده': u'author',
+      u'نویسندگان': u'authors',
+      u'سازمان': u'organization',
+      u'آدرس': u'address',
+      u'تماس': u'contact',
+      u'نسخه': u'version',
+      u'بازبینی': u'revision',
+      u'وضعیت': u'status',
+      u'تاریخ': u'date',
+      u'کپی‌رایت': u'copyright',
+      u'تخصیص': u'dedication',
+      u'چکیده': u'abstract'}
+"""Persian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [u'؛', u'،']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/sv.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/sv.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/sv.py	(revision 1126)
@@ -0,0 +1,59 @@
+# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author':       u'F\u00f6rfattare',
+    'authors':      u'F\u00f6rfattare',
+    'organization': u'Organisation',
+    'address':      u'Adress',
+    'contact':      u'Kontakt',
+    'version':      u'Version',
+    'revision':     u'Revision',
+    'status':       u'Status',
+    'date':         u'Datum',
+    'copyright':    u'Copyright',
+    'dedication':   u'Dedikation',
+    'abstract':     u'Sammanfattning',
+    'attention':    u'Observera!',
+    'caution':      u'Varning!',
+    'danger':       u'FARA!',
+    'error':        u'Fel',
+    'hint':         u'V\u00e4gledning',
+    'important':    u'Viktigt',
+    'note':         u'Notera',
+    'tip':          u'Tips',
+    'warning':      u'Varning',
+    'contents':     u'Inneh\u00e5ll' }
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    # 'Author' and 'Authors' identical in Swedish; assume the plural:
+    u'f\u00f6rfattare': 'authors',
+    u' n/a':            'author',
+    u'organisation':    'organization',
+    u'adress':          'address',
+    u'kontakt':         'contact',
+    u'version':         'version',
+    u'revision':        'revision',
+    u'status':          'status',
+    u'datum':           'date',
+    u'copyright':       'copyright',
+    u'dedikation':      'dedication', 
+    u'sammanfattning':  'abstract' }
+"""Swedish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/de.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/de.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/de.py	(revision 1126)
@@ -0,0 +1,58 @@
+# $Id: de.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Gunnar Schwant <g.schwant@gmx.de>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author': 'Autor',
+    'authors': 'Autoren',
+    'organization': 'Organisation',
+    'address': 'Adresse',
+    'contact': 'Kontakt',
+    'version': 'Version',
+    'revision': 'Revision',
+    'status': 'Status',
+    'date': 'Datum',
+    'dedication': 'Widmung',
+    'copyright': 'Copyright',
+    'abstract': 'Zusammenfassung',
+    'attention': 'Achtung!',
+    'caution': 'Vorsicht!',
+    'danger': '!GEFAHR!',
+    'error': 'Fehler',
+    'hint': 'Hinweis',
+    'important': 'Wichtig',
+    'note': 'Bemerkung',
+    'tip': 'Tipp',
+    'warning': 'Warnung',
+    'contents': 'Inhalt'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    'autor': 'author',
+    'autoren': 'authors',
+    'organisation': 'organization',
+    'adresse': 'address',
+    'kontakt': 'contact',
+    'version': 'version',
+    'revision': 'revision',
+    'status': 'status',
+    'datum': 'date',
+    'copyright': 'copyright',
+    'widmung': 'dedication',
+    'zusammenfassung': 'abstract'}
+"""German (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ja.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ja.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/ja.py	(revision 1126)
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Hisashi Morita <hisashim@kt.rim.or.jp>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'著者',
+      'authors': u'著者',
+      'organization': u'組織',
+      'address': u'住所',
+      'contact': u'連絡先',
+      'version': u'バージョン',
+      'revision': u'リビジョン',
+      'status': u'ステータス',
+      'date': u'日付',
+      'copyright': u'著作権',
+      'dedication': u'献辞',
+      'abstract': u'概要',
+      'attention': u'注目!',
+      'caution': u'注意!',
+      'danger': u'!危険!',
+      'error': u'エラー',
+      'hint': u'ヒント',
+      'important': u'重要',
+      'note': u'備考',
+      'tip': u'通報',
+      'warning': u'警告',
+      'contents': u'目次'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'著者': 'author',
+      u' n/a': 'authors',
+      u'組織': 'organization',
+      u'住所': 'address',
+      u'連絡先': 'contact',
+      u'バージョン': 'version',
+      u'リビジョン': 'revision',
+      u'ステータス': 'status',
+      u'日付': 'date',
+      u'著作権': 'copyright',
+      u'献辞': 'dedication',
+      u'概要': 'abstract'}
+"""Japanese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/zh_tw.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/zh_tw.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/zh_tw.py	(revision 1126)
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Joe YS Jaw <joeysj@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u4f5c\u8005', # '作者' <-- Chinese word
+      'authors': u'\u4f5c\u8005\u7fa4', # '作者群',
+      'organization': u'\u7d44\u7e54', # '組織',
+      'address': u'\u5730\u5740', # '地址',
+      'contact': u'\u9023\u7d61', # '連絡',
+      'version': u'\u7248\u672c', # '版本',
+      'revision': u'\u4fee\u8a02', # '修訂',
+      'status': u'\u72c0\u614b', # '狀態',
+      'date': u'\u65e5\u671f', # '日期',
+      'copyright': u'\u7248\u6b0a', # '版權',
+      'dedication': u'\u984c\u737b', # '題獻',
+      'abstract': u'\u6458\u8981', # '摘要',
+      'attention': u'\u6ce8\u610f\uff01', # '注意！',
+      'caution': u'\u5c0f\u5fc3\uff01', # '小心！',
+      'danger': u'\uff01\u5371\u96aa\uff01', # '！危險！',
+      'error': u'\u932f\u8aa4', # '錯誤',
+      'hint': u'\u63d0\u793a', # '提示',
+      'important': u'\u91cd\u8981', # '注意！',
+      'note': u'\u8a3b\u91cb', # '註釋',
+      'tip': u'\u79d8\u8a23', # '秘訣',
+      'warning': u'\u8b66\u544a', # '警告',
+      'contents': u'\u76ee\u9304' # '目錄'
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author (translation required)': 'author',
+      'authors (translation required)': 'authors',
+      'organization (translation required)': 'organization',
+      'address (translation required)': 'address',
+      'contact (translation required)': 'contact',
+      'version (translation required)': 'version',
+      'revision (translation required)': 'revision',
+      'status (translation required)': 'status',
+      'date (translation required)': 'date',
+      'copyright (translation required)': 'copyright',
+      'dedication (translation required)': 'dedication',
+      'abstract (translation required)': 'abstract'}
+"""Traditional Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # '；'
+                     u'\uff0c', # '，'
+                     u'\u3001', # '、'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/he.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/he.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/he.py	(revision 1126)
@@ -0,0 +1,60 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Hebrew-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u05de\u05d7\u05d1\u05e8',
+      'authors': u'\u05de\u05d7\u05d1\u05e8\u05d9',
+      'organization': u'\u05d0\u05e8\u05d2\u05d5\u05df',
+      'address': u'\u05db\u05ea\u05d5\u05d1\u05ea',
+      'contact':  u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8',
+      'version': u'\u05d2\u05e8\u05e1\u05d4',
+      'revision': u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4',
+      'status': u'\u05e1\u05d8\u05d8\u05d5\u05e1',
+      'date': u'\u05ea\u05d0\u05e8\u05d9\u05da',
+      'copyright': u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea',
+      'dedication': u'\u05d4\u05e7\u05d3\u05e9\u05d4',
+      'abstract': u'\u05ea\u05e7\u05e6\u05d9\u05e8',
+      'attention': u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1',
+      'caution': u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea',
+      'danger': u'\u05e1\u05db\u05e0\u05d4',
+      'error': u'\u05e9\u05d2\u05d9\u05d0\u05d4' ,
+      'hint': u'\u05e8\u05de\u05d6',
+      'important': u'\u05d7\u05e9\u05d5\u05d1',
+      'note': u'\u05d4\u05e2\u05e8\u05d4',
+      'tip': u'\u05d8\u05d9\u05e4',
+      'warning': u'\u05d0\u05d6\u05d4\u05e8\u05d4',
+      'contents': u'\u05ea\u05d5\u05db\u05df'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'\u05de\u05d7\u05d1\u05e8': 'author',
+      u'\u05de\u05d7\u05d1\u05e8\u05d9': 'authors',
+      u'\u05d0\u05e8\u05d2\u05d5\u05df': 'organization',
+      u'\u05db\u05ea\u05d5\u05d1\u05ea': 'address',
+      u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8': 'contact',
+      u'\u05d2\u05e8\u05e1\u05d4': 'version',
+      u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4': 'revision',
+      u'\u05e1\u05d8\u05d8\u05d5\u05e1': 'status',
+      u'\u05ea\u05d0\u05e8\u05d9\u05da': 'date',
+      u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea': 'copyright',
+      u'\u05d4\u05e7\u05d3\u05e9\u05d4': 'dedication',
+      u'\u05ea\u05e7\u05e6\u05d9\u05e8': 'abstract'}
+"""Hebrew to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fi.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fi.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fi.py	(revision 1126)
@@ -0,0 +1,60 @@
+# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      u'author': u'Tekij\u00e4',
+      u'authors': u'Tekij\u00e4t',
+      u'organization': u'Yhteis\u00f6',
+      u'address': u'Osoite',
+      u'contact': u'Yhteystiedot',
+      u'version': u'Versio',
+      u'revision': u'Vedos',
+      u'status': u'Tila',
+      u'date': u'P\u00e4iv\u00e4ys',
+      u'copyright': u'Tekij\u00e4noikeudet',
+      u'dedication': u'Omistuskirjoitus',
+      u'abstract': u'Tiivistelm\u00e4',
+      u'attention': u'Huomio!',
+      u'caution': u'Varo!',
+      u'danger': u'!VAARA!',
+      u'error': u'Virhe',
+      u'hint': u'Vihje',
+      u'important': u'T\u00e4rke\u00e4\u00e4',
+      u'note': u'Huomautus',
+      u'tip': u'Neuvo',
+      u'warning': u'Varoitus',
+      u'contents': u'Sis\u00e4llys'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'tekij\u00e4': u'author',
+      u'tekij\u00e4t': u'authors',
+      u'yhteis\u00f6': u'organization',
+      u'osoite': u'address',
+      u'yhteystiedot': u'contact',
+      u'versio': u'version',
+      u'vedos': u'revision',
+      u'tila': u'status',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'tekij\u00e4noikeudet': u'copyright',
+      u'omistuskirjoitus': u'dedication',
+      u'tiivistelm\u00e4': u'abstract'}
+"""Finnish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/__init__.py	(revision 1126)
@@ -0,0 +1,48 @@
+# $Id: __init__.py 7648 2013-04-18 07:36:22Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+
+from docutils.utils import normalize_language_tag
+if sys.version_info < (2,5):
+    from docutils._compat import __import__
+
+_languages = {}
+
+def get_language(language_code, reporter=None):
+    """Return module with language localizations.
+
+    `language_code` is a "BCP 47" language tag.
+    If there is no matching module, warn and fall back to English.
+    """
+    # TODO: use a dummy module returning emtpy strings?, configurable?
+    for tag in normalize_language_tag(language_code):
+        tag = tag.replace('-','_') # '-' not valid in module names
+        if tag in _languages:
+            return _languages[tag]
+        try:
+            module = __import__(tag, globals(), locals(), level=1)
+        except ImportError:
+            try:
+                module = __import__(tag, globals(), locals(), level=0)
+            except ImportError:
+                continue
+        _languages[tag] = module
+        return module
+    if reporter is not None:
+        reporter.warning(
+            'language "%s" not supported: ' % language_code +
+            'Docutils-generated text will be in English.')
+    module = __import__('en', globals(), locals(), level=1)
+    _languages[tag] = module # warn only one time!
+    return module
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/zh_cn.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/zh_cn.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/zh_cn.py	(revision 1126)
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Pan Junyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features
+of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'作者',
+      'authors': u'作者群',
+      'organization': u'组织',
+      'address': u'地址',
+      'contact': u'联系',
+      'version': u'版本',
+      'revision': u'修订',
+      'status': u'状态',
+      'date': u'日期',
+      'copyright': u'版权',
+      'dedication': u'献辞',
+      'abstract': u'摘要',
+      'attention': u'注意',
+      'caution': u'小心',
+      'danger': u'危险',
+      'error': u'错误',
+      'hint': u'提示',
+      'important': u'重要',
+      'note': u'注解',
+      'tip': u'技巧',
+      'warning': u'警告',
+      'contents': u'目录',
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'作者': 'author',
+      u'作者群': 'authors',
+      u'组织': 'organization',
+      u'地址': 'address',
+      u'联系': 'contact',
+      u'版本': 'version',
+      u'修订': 'revision',
+      u'状态': 'status',
+      u'时间': 'date',
+      u'版权': 'copyright',
+      u'献辞': 'dedication',
+      u'摘要': 'abstract'}
+"""Simplified Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # '；'
+                     u'\uff0c', # '，'
+                     u'\u3001', # '、'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/en.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/en.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/en.py	(revision 1126)
@@ -0,0 +1,60 @@
+# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Author',
+      'authors': 'Authors',
+      'organization': 'Organization',
+      'address': 'Address',
+      'contact': 'Contact',
+      'version': 'Version',
+      'revision': 'Revision',
+      'status': 'Status',
+      'date': 'Date',
+      'copyright': 'Copyright',
+      'dedication': 'Dedication',
+      'abstract': 'Abstract',
+      'attention': 'Attention!',
+      'caution': 'Caution!',
+      'danger': '!DANGER!',
+      'error': 'Error',
+      'hint': 'Hint',
+      'important': 'Important',
+      'note': 'Note',
+      'tip': 'Tip',
+      'warning': 'Warning',
+      'contents': 'Contents'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author': 'author',
+      'authors': 'authors',
+      'organization': 'organization',
+      'address': 'address',
+      'contact': 'contact',
+      'version': 'version',
+      'revision': 'revision',
+      'status': 'status',
+      'date': 'date',
+      'copyright': 'copyright',
+      'dedication': 'dedication',
+      'abstract': 'abstract'}
+"""English (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/gl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/gl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/gl.py	(revision 1126)
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Galician-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organizaci\u00f3n',
+      'address': u'Enderezo',
+      'contact': u'Contacto',
+      'version': u'Versi\u00f3n',
+      'revision': u'Revisi\u00f3n',
+      'status': u'Estado',
+      'date': u'Data',
+      'copyright': u'Dereitos de copia',
+      'dedication': u'Dedicatoria',
+      'abstract': u'Abstract',
+      'attention': u'Atenci\u00f3n!',
+      'caution': u'Advertencia!',
+      'danger': u'PERIGO!',
+      'error': u'Erro',
+      'hint': u'Consello',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Suxesti\u00f3n',
+      'warning': u'Aviso',
+      'contents': u'Contido'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organizaci\u00f3n': 'organization',
+      u'enderezo': 'address',
+      u'contacto': 'contact',
+      u'versi\u00f3n': 'version',
+      u'revisi\u00f3n': 'revision',
+      u'estado': 'status',
+      u'data': 'date',
+      u'dereitos de copia': 'copyright',
+      u'dedicatoria': 'dedication',
+      u'abstract': 'abstract'}
+"""Galician (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/eo.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/eo.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/eo.py	(revision 1126)
@@ -0,0 +1,61 @@
+# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'A\u016dtoro',
+      'authors': u'A\u016dtoroj',
+      'organization': u'Organizo',
+      'address': u'Adreso',
+      'contact': u'Kontakto',
+      'version': u'Versio',
+      'revision': u'Revido',
+      'status': u'Stato',
+      'date': u'Dato',
+      # 'copyright': u'Kopirajto',
+      'copyright': u'A\u016dtorrajto',
+      'dedication': u'Dedi\u0109o',
+      'abstract': u'Resumo',
+      'attention': u'Atentu!',
+      'caution': u'Zorgu!',
+      'danger': u'DAN\u011cERO!',
+      'error': u'Eraro',
+      'hint': u'Spuro',
+      'important': u'Grava',
+      'note': u'Noto',
+      'tip': u'Helpeto',
+      'warning': u'Averto',
+      'contents': u'Enhavo'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'a\u016dtoro': 'author',
+      'a\u016dtoroj': 'authors',
+      'organizo': 'organization',
+      'adreso': 'address',
+      'kontakto': 'contact',
+      'versio': 'version',
+      'revido': 'revision',
+      'stato': 'status',
+      'dato': 'date',
+      'a\u016dtorrajto': 'copyright',
+      'dedi\u0109o': 'dedication',
+      'resumo': 'abstract'}
+"""Esperanto (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/cs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/cs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/cs.py	(revision 1126)
@@ -0,0 +1,60 @@
+# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Auto\u0159i',
+      'organization': u'Organizace',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verze',
+      'revision': u'Revize',
+      'status': u'Stav',
+      'date': u'Datum',
+      'copyright': u'Copyright',
+      'dedication': u'V\u011Bnov\u00E1n\u00ED',
+      'abstract': u'Abstrakt',
+      'attention': u'Pozor!',
+      'caution': u'Opatrn\u011B!',
+      'danger': u'!NEBEZPE\u010C\u00CD!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u016Fle\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varov\u00E1n\u00ED',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'auto\u0159i': 'authors',
+      u'organizace': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verze': 'version',
+      u'revize': 'revision',
+      u'stav': 'status',
+      u'datum': 'date',
+      u'copyright': 'copyright',
+      u'v\u011Bnov\u00E1n\u00ED': 'dedication',
+      u'abstrakt': 'abstract'}
+"""Czech (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/pt_br.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/pt_br.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/pt_br.py	(revision 1126)
@@ -0,0 +1,60 @@
+# $Id: pt_br.py 5567 2008-06-03 01:11:03Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organiza\u00E7\u00E3o',
+      'address': u'Endere\u00E7o',
+      'contact': u'Contato',
+      'version': u'Vers\u00E3o',
+      'revision': u'Revis\u00E3o',
+      'status': u'Estado',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F3ria',
+      'abstract': u'Resumo',
+      'attention': u'Aten\u00E7\u00E3o!',
+      'caution': u'Cuidado!',
+      'danger': u'PERIGO!',
+      'error': u'Erro',
+      'hint': u'Sugest\u00E3o',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Dica',
+      'warning': u'Aviso',
+      'contents': u'Sum\u00E1rio'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organiza\u00E7\u00E3o': 'organization',
+      u'endere\u00E7o': 'address',
+      u'contato': 'contact',
+      u'vers\u00E3o': 'version',
+      u'revis\u00E3o': 'revision',
+      u'estado': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F3ria': 'dedication',
+      u'resumo': 'abstract'}
+"""Brazilian Portuguese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fr.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fr.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/fr.py	(revision 1126)
@@ -0,0 +1,58 @@
+# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Stefane Fermigier <sf@fermigier.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'author': u'Auteur',
+      u'authors': u'Auteurs',
+      u'organization': u'Organisation',
+      u'address': u'Adresse',
+      u'contact': u'Contact',
+      u'version': u'Version',
+      u'revision': u'R\u00e9vision',
+      u'status': u'Statut',
+      u'date': u'Date',
+      u'copyright': u'Copyright',
+      u'dedication': u'D\u00e9dicace',
+      u'abstract': u'R\u00e9sum\u00e9',
+      u'attention': u'Attention!',
+      u'caution': u'Avertissement!',
+      u'danger': u'!DANGER!',
+      u'error': u'Erreur',
+      u'hint': u'Indication',
+      u'important': u'Important',
+      u'note': u'Note',
+      u'tip': u'Astuce',
+      u'warning': u'Avis',
+      u'contents': u'Sommaire'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'auteur': u'author',
+      u'auteurs': u'authors',
+      u'organisation': u'organization',
+      u'adresse': u'address',
+      u'contact': u'contact',
+      u'version': u'version',
+      u'r\u00e9vision': u'revision',
+      u'statut': u'status',
+      u'date': u'date',
+      u'copyright': u'copyright',
+      u'd\u00e9dicace': u'dedication',
+      u'r\u00e9sum\u00e9': u'abstract'}
+"""French (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/es.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/es.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/es.py	(revision 1126)
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 4572 2006-05-25 20:48:37Z richieadler $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organizaci\u00f3n',
+      'address': u'Direcci\u00f3n',
+      'contact': u'Contacto',
+      'version': u'Versi\u00f3n',
+      'revision': u'Revisi\u00f3n',
+      'status': u'Estado',
+      'date': u'Fecha',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicatoria',
+      'abstract': u'Resumen',
+      'attention': u'\u00a1Atenci\u00f3n!',
+      'caution': u'\u00a1Precauci\u00f3n!',
+      'danger': u'\u00a1PELIGRO!',
+      'error': u'Error',
+      'hint': u'Sugerencia',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Consejo',
+      'warning': u'Advertencia',
+      'contents': u'Contenido'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organizaci\u00f3n': 'organization',
+      u'direcci\u00f3n': 'address',
+      u'contacto': 'contact',
+      u'versi\u00f3n': 'version',
+      u'revisi\u00f3n': 'revision',
+      u'estado': 'status',
+      u'fecha': 'date',
+      u'copyright': 'copyright',
+      u'dedicatoria': 'dedication',
+      u'resumen': 'abstract'}
+"""Spanish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/nl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/nl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/nl.py	(revision 1126)
@@ -0,0 +1,60 @@
+# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisatie',
+      'address': 'Adres',
+      'contact': 'Contact',
+      'version': 'Versie',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Copyright',
+      'dedication': 'Toewijding',
+      'abstract': 'Samenvatting',
+      'attention': 'Attentie!',
+      'caution': 'Let op!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Hint',
+      'important': 'Belangrijk',
+      'note': 'Opmerking',
+      'tip': 'Tip',
+      'warning': 'Waarschuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisatie': 'organization',
+      'adres': 'address',
+      'contact': 'contact',
+      'versie': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'copyright': 'copyright',
+      'toewijding': 'dedication',
+      'samenvatting': 'abstract'}
+"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/pl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/pl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/pl.py	(revision 1126)
@@ -0,0 +1,62 @@
+# $Id$
+# Author: Robert Wojciechowicz <rw@smsnet.pl>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Polish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autorzy',
+      'organization': u'Organizacja',
+      'address': u'Adres',
+      'contact': u'Kontakt',
+      'version': u'Wersja',
+      'revision': u'Korekta',
+      'status': u'Status',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedykacja',
+      'abstract': u'Streszczenie',
+      'attention': u'Uwaga!',
+      'caution': u'Ostro\u017cnie!',
+      'danger': u'!Niebezpiecze\u0144stwo!',
+      'error': u'B\u0142\u0105d',
+      'hint': u'Wskaz\u00f3wka',
+      'important': u'Wa\u017cne',
+      'note': u'Przypis',
+      'tip': u'Rada',
+      'warning': u'Ostrze\u017cenie',
+      'contents': u'Tre\u015b\u0107'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autorzy': 'authors',
+      u'organizacja': 'organization',
+      u'adres': 'address',
+      u'kontakt': 'contact',
+      u'wersja': 'version',
+      u'korekta': 'revision',
+      u'status': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedykacja': 'dedication',
+      u'streszczenie': 'abstract'}
+"""Polish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
+
+ 	  	 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/it.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/it.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/it.py	(revision 1126)
@@ -0,0 +1,58 @@
+# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Nicola Larosa <docutils@tekNico.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Italian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Autore',
+      'authors': 'Autori',
+      'organization': 'Organizzazione',
+      'address': 'Indirizzo',
+      'contact': 'Contatti',
+      'version': 'Versione',
+      'revision': 'Revisione',
+      'status': 'Status',
+      'date': 'Data',
+      'copyright': 'Copyright',
+      'dedication': 'Dedica',
+      'abstract': 'Riassunto',
+      'attention': 'Attenzione!',
+      'caution': 'Cautela!',
+      'danger': '!PERICOLO!',
+      'error': 'Errore',
+      'hint': 'Suggerimento',
+      'important': 'Importante',
+      'note': 'Nota',
+      'tip': 'Consiglio',
+      'warning': 'Avvertenza',
+      'contents': 'Indice'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'autore': 'author',
+      'autori': 'authors',
+      'organizzazione': 'organization',
+      'indirizzo': 'address',
+      'contatto': 'contact',
+      'versione': 'version',
+      'revisione': 'revision',
+      'status': 'status',
+      'data': 'date',
+      'copyright': 'copyright',
+      'dedica': 'dedication',
+      'riassunto': 'abstract'}
+"""Italian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/sk.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/sk.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/languages/sk.py	(revision 1126)
@@ -0,0 +1,58 @@
+# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autori',
+      'organization': u'Organiz\u00E1cia',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verzia',
+      'revision': u'Rev\u00EDzia',
+      'status': u'Stav',
+      'date': u'D\u00E1tum',
+      'copyright': u'Copyright',
+      'dedication': u'Venovanie',
+      'abstract': u'Abstraktne',
+      'attention': u'Pozor!',
+      'caution': u'Opatrne!',
+      'danger': u'!NEBEZPE\u010cENSTVO!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u00F4le\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varovanie',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autori': 'authors',
+      u'organiz\u00E1cia': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verzia': 'version',
+      u'rev\u00EDzia': 'revision',
+      u'stav': 'status',
+      u'd\u00E1tum': 'date',
+      u'copyright': 'copyright',
+      u'venovanie': 'dedication',
+      u'abstraktne': 'abstract'}
+"""Slovak (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/_compat.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/_compat.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/_compat.py	(revision 1126)
@@ -0,0 +1,48 @@
+# $Id: _compat.py 7486 2012-07-11 12:25:14Z milde $
+# Author: Georg Brandl <georg@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Python 2/3 compatibility definitions.
+
+This module currently provides the following helper symbols:
+
+* bytes (name of byte string type; str in 2.x, bytes in 3.x)
+* b (function converting a string literal to an ASCII byte string;
+  can be also used to convert a Unicode string into a byte string)
+* u_prefix (unicode repr prefix: 'u' in 2.x, '' in 3.x)
+  (Required in docutils/test/test_publisher.py)
+* BytesIO (a StringIO class that works with bytestrings)
+"""
+
+import sys
+
+if sys.version_info < (3,0):
+    b = bytes = str
+    u_prefix = 'u'
+    from StringIO import StringIO as BytesIO
+else:
+    import builtins
+    bytes = builtins.bytes
+    u_prefix = ''
+    def b(s):
+        if isinstance(s, str):
+            return s.encode('latin1')
+        elif isinstance(s, bytes):
+            return s
+        else:
+            raise TypeError("Invalid argument %r for b()" % (s,))
+    # using this hack since 2to3 "fixes" the relative import
+    # when using ``from io import BytesIO``
+    BytesIO = __import__('io').BytesIO
+
+if sys.version_info < (2,5):
+    import __builtin__
+
+    def __import__(name, globals={}, locals={}, fromlist=[], level=-1):
+        """Compatibility definition for Python 2.4.
+
+        Silently ignore the `level` argument missing in Python < 2.5.
+        """
+        # we need the level arg because the default changed in Python 3.3
+        return __builtin__.__import__(name, globals, locals, fromlist)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/docutils.conf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/docutils.conf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/docutils.conf	(revision 1126)
@@ -0,0 +1,5 @@
+# This configuration file is to prevent tools/buildhtml.py from
+# processing text files in and below this directory.
+
+[buildhtml application]
+prune: .
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/core.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/core.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/core.py	(revision 1126)
@@ -0,0 +1,663 @@
+# $Id: core.py 7466 2012-06-25 14:56:51Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Calling the ``publish_*`` convenience functions (or instantiating a
+`Publisher` object) with component names will result in default
+behavior.  For custom behavior (setting component options), create
+custom component objects first, and pass *them* to
+``publish_*``/`Publisher`.  See `The Docutils Publisher`_.
+
+.. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import pprint
+from docutils import __version__, __version_details__, SettingsSpec
+from docutils import frontend, io, utils, readers, writers
+from docutils.frontend import OptionParser
+from docutils.transforms import Transformer
+from docutils.utils.error_reporting import ErrorOutput, ErrorString
+import docutils.readers.doctree
+
+class Publisher:
+
+    """
+    A facade encapsulating the high-level logic of a Docutils system.
+    """
+
+    def __init__(self, reader=None, parser=None, writer=None,
+                 source=None, source_class=io.FileInput,
+                 destination=None, destination_class=io.FileOutput,
+                 settings=None):
+        """
+        Initial setup.  If any of `reader`, `parser`, or `writer` are not
+        specified, the corresponding ``set_...`` method should be called with
+        a component name (`set_reader` sets the parser as well).
+        """
+
+        self.document = None
+        """The document tree (`docutils.nodes` objects)."""
+
+        self.reader = reader
+        """A `docutils.readers.Reader` instance."""
+
+        self.parser = parser
+        """A `docutils.parsers.Parser` instance."""
+
+        self.writer = writer
+        """A `docutils.writers.Writer` instance."""
+
+        for component in 'reader', 'parser', 'writer':
+            assert not isinstance(getattr(self, component), str), (
+                'passed string "%s" as "%s" parameter; pass an instance, '
+                'or use the "%s_name" parameter instead (in '
+                'docutils.core.publish_* convenience functions).'
+                % (getattr(self, component), component, component))
+
+        self.source = source
+        """The source of input data, a `docutils.io.Input` instance."""
+
+        self.source_class = source_class
+        """The class for dynamically created source objects."""
+
+        self.destination = destination
+        """The destination for docutils output, a `docutils.io.Output`
+        instance."""
+
+        self.destination_class = destination_class
+        """The class for dynamically created destination objects."""
+
+        self.settings = settings
+        """An object containing Docutils settings as instance attributes.
+        Set by `self.process_command_line()` or `self.get_settings()`."""
+
+        self._stderr = ErrorOutput()
+
+    def set_reader(self, reader_name, parser, parser_name):
+        """Set `self.reader` by name."""
+        reader_class = readers.get_reader_class(reader_name)
+        self.reader = reader_class(parser, parser_name)
+        self.parser = self.reader.parser
+
+    def set_writer(self, writer_name):
+        """Set `self.writer` by name."""
+        writer_class = writers.get_writer_class(writer_name)
+        self.writer = writer_class()
+
+    def set_components(self, reader_name, parser_name, writer_name):
+        if self.reader is None:
+            self.set_reader(reader_name, self.parser, parser_name)
+        if self.parser is None:
+            if self.reader.parser is None:
+                self.reader.set_parser(parser_name)
+            self.parser = self.reader.parser
+        if self.writer is None:
+            self.set_writer(writer_name)
+
+    def setup_option_parser(self, usage=None, description=None,
+                            settings_spec=None, config_section=None,
+                            **defaults):
+        if config_section:
+            if not settings_spec:
+                settings_spec = SettingsSpec()
+            settings_spec.config_section = config_section
+            parts = config_section.split()
+            if len(parts) > 1 and parts[-1] == 'application':
+                settings_spec.config_section_dependencies = ['applications']
+        #@@@ Add self.source & self.destination to components in future?
+        option_parser = OptionParser(
+            components=(self.parser, self.reader, self.writer, settings_spec),
+            defaults=defaults, read_config_files=True,
+            usage=usage, description=description)
+        return option_parser
+
+    def get_settings(self, usage=None, description=None,
+                     settings_spec=None, config_section=None, **defaults):
+        """
+        Set and return default settings (overrides in `defaults` dict).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        Explicitly setting `self.settings` disables command line option
+        processing from `self.publish()`.
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        self.settings = option_parser.get_default_values()
+        return self.settings
+
+    def process_programmatic_settings(self, settings_spec,
+                                      settings_overrides,
+                                      config_section):
+        if self.settings is None:
+            defaults = (settings_overrides or {}).copy()
+            # Propagate exceptions by default when used programmatically:
+            defaults.setdefault('traceback', True)
+            self.get_settings(settings_spec=settings_spec,
+                              config_section=config_section,
+                              **defaults)
+
+    def process_command_line(self, argv=None, usage=None, description=None,
+                             settings_spec=None, config_section=None,
+                             **defaults):
+        """
+        Pass an empty list to `argv` to avoid reading `sys.argv` (the
+        default).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        if argv is None:
+            argv = sys.argv[1:]
+            # converting to Unicode (Python 3 does this automatically):
+            if sys.version_info < (3,0):
+                # TODO: make this failsafe and reversible?
+                argv_encoding = (frontend.locale_encoding or 'ascii')
+                argv = [a.decode(argv_encoding) for a in argv]
+        self.settings = option_parser.parse_args(argv)
+
+    def set_io(self, source_path=None, destination_path=None):
+        if self.source is None:
+            self.set_source(source_path=source_path)
+        if self.destination is None:
+            self.set_destination(destination_path=destination_path)
+
+    def set_source(self, source=None, source_path=None):
+        if source_path is None:
+            source_path = self.settings._source
+        else:
+            self.settings._source = source_path
+        # Raise IOError instead of system exit with `tracback == True`
+        # TODO: change io.FileInput's default behaviour and remove this hack
+        try:
+            self.source = self.source_class(
+                source=source, source_path=source_path,
+                encoding=self.settings.input_encoding)
+        except TypeError:
+            self.source = self.source_class(
+                source=source, source_path=source_path,
+                encoding=self.settings.input_encoding)
+
+    def set_destination(self, destination=None, destination_path=None):
+        if destination_path is None:
+            destination_path = self.settings._destination
+        else:
+            self.settings._destination = destination_path
+        self.destination = self.destination_class(
+            destination=destination, destination_path=destination_path,
+            encoding=self.settings.output_encoding,
+            error_handler=self.settings.output_encoding_error_handler)
+
+    def apply_transforms(self):
+        self.document.transformer.populate_from_components(
+            (self.source, self.reader, self.reader.parser, self.writer,
+             self.destination))
+        self.document.transformer.apply_transforms()
+
+    def publish(self, argv=None, usage=None, description=None,
+                settings_spec=None, settings_overrides=None,
+                config_section=None, enable_exit_status=False):
+        """
+        Process command line options and arguments (if `self.settings` not
+        already set), run `self.reader` and then `self.writer`.  Return
+        `self.writer`'s output.
+        """
+        exit = None
+        try:
+            if self.settings is None:
+                self.process_command_line(
+                    argv, usage, description, settings_spec, config_section,
+                    **(settings_overrides or {}))
+            self.set_io()
+            self.document = self.reader.read(self.source, self.parser,
+                                             self.settings)
+            self.apply_transforms()
+            output = self.writer.write(self.document, self.destination)
+            self.writer.assemble_parts()
+        except SystemExit, error:
+            exit = 1
+            exit_status = error.code
+        except Exception, error:
+            if not self.settings:       # exception too early to report nicely
+                raise
+            if self.settings.traceback: # Propagate exceptions?
+                self.debugging_dumps()
+                raise
+            self.report_Exception(error)
+            exit = True
+            exit_status = 1
+        self.debugging_dumps()
+        if (enable_exit_status and self.document
+            and (self.document.reporter.max_level
+                 >= self.settings.exit_status_level)):
+            sys.exit(self.document.reporter.max_level + 10)
+        elif exit:
+            sys.exit(exit_status)
+        return output
+
+    def debugging_dumps(self):
+        if not self.document:
+            return
+        if self.settings.dump_settings:
+            print >>self._stderr, '\n::: Runtime settings:'
+            print >>self._stderr, pprint.pformat(self.settings.__dict__)
+        if self.settings.dump_internals:
+            print >>self._stderr, '\n::: Document internals:'
+            print >>self._stderr, pprint.pformat(self.document.__dict__)
+        if self.settings.dump_transforms:
+            print >>self._stderr, '\n::: Transforms applied:'
+            print >>self._stderr, (' (priority, transform class, '
+                                 'pending node details, keyword args)')
+            print >>self._stderr, pprint.pformat(
+                [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
+                  pending and pending.details, kwargs)
+                 for priority, xclass, pending, kwargs
+                 in self.document.transformer.applied])
+        if self.settings.dump_pseudo_xml:
+            print >>self._stderr, '\n::: Pseudo-XML:'
+            print >>self._stderr, self.document.pformat().encode(
+                'raw_unicode_escape')
+
+    def report_Exception(self, error):
+        if isinstance(error, utils.SystemMessage):
+            self.report_SystemMessage(error)
+        elif isinstance(error, UnicodeEncodeError):
+            self.report_UnicodeError(error)
+        elif isinstance(error, io.InputError):
+            self._stderr.write(u'Unable to open source file for reading:\n'
+                               u'  %s\n' % ErrorString(error))
+        elif isinstance(error, io.OutputError):
+            self._stderr.write(
+                u'Unable to open destination file for writing:\n'
+                u'  %s\n' % ErrorString(error))
+        else:
+            print >>self._stderr, u'%s' % ErrorString(error)
+            print >>self._stderr, ("""\
+Exiting due to error.  Use "--traceback" to diagnose.
+Please report errors to <docutils-users@lists.sf.net>.
+Include "--traceback" output, Docutils version (%s [%s]),
+Python version (%s), your OS type & version, and the
+command line used.""" % (__version__, __version_details__,
+                         sys.version.split()[0]))
+
+    def report_SystemMessage(self, error):
+        print >>self._stderr, ('Exiting due to level-%s (%s) system message.'
+                             % (error.level,
+                                utils.Reporter.levels[error.level]))
+
+    def report_UnicodeError(self, error):
+        data = error.object[error.start:error.end]
+        self._stderr.write(
+            '%s\n'
+            '\n'
+            'The specified output encoding (%s) cannot\n'
+            'handle all of the output.\n'
+            'Try setting "--output-encoding-error-handler" to\n'
+            '\n'
+            '* "xmlcharrefreplace" (for HTML & XML output);\n'
+            '  the output will contain "%s" and should be usable.\n'
+            '* "backslashreplace" (for other output formats);\n'
+            '  look for "%s" in the output.\n'
+            '* "replace"; look for "?" in the output.\n'
+            '\n'
+            '"--output-encoding-error-handler" is currently set to "%s".\n'
+            '\n'
+            'Exiting due to error.  Use "--traceback" to diagnose.\n'
+            'If the advice above doesn\'t eliminate the error,\n'
+            'please report it to <docutils-users@lists.sf.net>.\n'
+            'Include "--traceback" output, Docutils version (%s),\n'
+            'Python version (%s), your OS type & version, and the\n'
+            'command line used.\n'
+            % (ErrorString(error),
+               self.settings.output_encoding,
+               data.encode('ascii', 'xmlcharrefreplace'),
+               data.encode('ascii', 'backslashreplace'),
+               self.settings.output_encoding_error_handler,
+               __version__, sys.version.split()[0]))
+
+default_usage = '%prog [options] [<source> [<destination>]]'
+default_description = ('Reads from <source> (default is stdin) and writes to '
+                       '<destination> (default is stdout).  See '
+                       '<http://docutils.sf.net/docs/user/config.html> for '
+                       'the full reference.')
+
+def publish_cmdline(reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    writer=None, writer_name='pseudoxml',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=True, argv=None,
+                    usage=default_usage, description=default_description):
+    """
+    Set up & run a `Publisher` for command-line-based file I/O (input and
+    output file paths taken automatically from the command line).  Return the
+    encoded string output also.
+
+    Parameters: see `publish_programmatically` for the remainder.
+
+    - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
+    - `usage`: Usage string, output if there's a problem parsing the command
+      line.
+    - `description`: Program description, output for the "--help" option
+      (along with command-line option descriptions).
+    """
+    pub = Publisher(reader, parser, writer, settings=settings)
+    pub.set_components(reader_name, parser_name, writer_name)
+    output = pub.publish(
+        argv, usage, description, settings_spec, settings_overrides,
+        config_section=config_section, enable_exit_status=enable_exit_status)
+    return output
+
+def publish_file(source=None, source_path=None,
+                 destination=None, destination_path=None,
+                 reader=None, reader_name='standalone',
+                 parser=None, parser_name='restructuredtext',
+                 writer=None, writer_name='pseudoxml',
+                 settings=None, settings_spec=None, settings_overrides=None,
+                 config_section=None, enable_exit_status=False):
+    """
+    Set up & run a `Publisher` for programmatic use with file-like I/O.
+    Return the encoded string output also.
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.FileInput, source=source, source_path=source_path,
+        destination_class=io.FileOutput,
+        destination=destination, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_string(source, source_path=None, destination_path=None,
+                   reader=None, reader_name='standalone',
+                   parser=None, parser_name='restructuredtext',
+                   writer=None, writer_name='pseudoxml',
+                   settings=None, settings_spec=None,
+                   settings_overrides=None, config_section=None,
+                   enable_exit_status=False):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.  Return
+    the encoded string or Unicode string output.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_string(..., settings_overrides={'output_encoding': 'unicode'})
+
+    Similarly for Unicode string input (`source`)::
+
+        publish_string(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.StringInput, source=source, source_path=source_path,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_parts(source, source_path=None, source_class=io.StringInput,
+                  destination_path=None,
+                  reader=None, reader_name='standalone',
+                  parser=None, parser_name='restructuredtext',
+                  writer=None, writer_name='pseudoxml',
+                  settings=None, settings_spec=None,
+                  settings_overrides=None, config_section=None,
+                  enable_exit_status=False):
+    """
+    Set up & run a `Publisher`, and return a dictionary of document parts.
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.  For programmatic use with string I/O.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's how::
+
+        publish_parts(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source=source, source_path=source_path, source_class=source_class,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return pub.writer.parts
+
+def publish_doctree(source, source_path=None,
+                    source_class=io.StringInput,
+                    reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=False):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.
+    Return the document tree.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's one way::
+
+        publish_doctree(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    pub = Publisher(reader=reader, parser=parser, writer=None,
+                    settings=settings,
+                    source_class=source_class,
+                    destination_class=io.NullOutput)
+    pub.set_components(reader_name, parser_name, 'null')
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(None, None)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return pub.document
+
+def publish_from_doctree(document, destination_path=None,
+                         writer=None, writer_name='pseudoxml',
+                         settings=None, settings_spec=None,
+                         settings_overrides=None, config_section=None,
+                         enable_exit_status=False):
+    """
+    Set up & run a `Publisher` to render from an existing document
+    tree data structure, for programmatic use with string I/O.  Return
+    the encoded string output.
+
+    Note that document.settings is overridden; if you want to use the settings
+    of the original `document`, pass settings=document.settings.
+
+    Also, new document.transformer and document.reporter objects are
+    generated.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_from_doctree(
+            ..., settings_overrides={'output_encoding': 'unicode'})
+
+    Parameters: `document` is a `docutils.nodes.document` object, an existing
+    document tree.
+
+    Other parameters: see `publish_programmatically`.
+    """
+    reader = docutils.readers.doctree.Reader(parser_name='null')
+    pub = Publisher(reader, None, writer,
+                    source=io.DocTreeInput(document),
+                    destination_class=io.StringOutput, settings=settings)
+    if not writer and writer_name:
+        pub.set_writer(writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_destination(None, destination_path)
+    return pub.publish(enable_exit_status=enable_exit_status)
+
+def publish_cmdline_to_binary(reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    writer=None, writer_name='pseudoxml',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=True, argv=None,
+                    usage=default_usage, description=default_description,
+                    destination=None, destination_class=io.BinaryFileOutput
+                    ):
+    """
+    Set up & run a `Publisher` for command-line-based file I/O (input and
+    output file paths taken automatically from the command line).  Return the
+    encoded string output also.
+
+    This is just like publish_cmdline, except that it uses
+    io.BinaryFileOutput instead of io.FileOutput.
+
+    Parameters: see `publish_programmatically` for the remainder.
+
+    - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
+    - `usage`: Usage string, output if there's a problem parsing the command
+      line.
+    - `description`: Program description, output for the "--help" option
+      (along with command-line option descriptions).
+    """
+    pub = Publisher(reader, parser, writer, settings=settings,
+        destination_class=destination_class)
+    pub.set_components(reader_name, parser_name, writer_name)
+    output = pub.publish(
+        argv, usage, description, settings_spec, settings_overrides,
+        config_section=config_section, enable_exit_status=enable_exit_status)
+    return output
+
+def publish_programmatically(source_class, source, source_path,
+                             destination_class, destination, destination_path,
+                             reader, reader_name,
+                             parser, parser_name,
+                             writer, writer_name,
+                             settings, settings_spec,
+                             settings_overrides, config_section,
+                             enable_exit_status):
+    """
+    Set up & run a `Publisher` for custom programmatic use.  Return the
+    encoded string output and the Publisher object.
+
+    Applications should not need to call this function directly.  If it does
+    seem to be necessary to call this function directly, please write to the
+    Docutils-develop mailing list
+    <http://docutils.sf.net/docs/user/mailing-lists.html#docutils-develop>.
+
+    Parameters:
+
+    * `source_class` **required**: The class for dynamically created source
+      objects.  Typically `io.FileInput` or `io.StringInput`.
+
+    * `source`: Type depends on `source_class`:
+
+      - If `source_class` is `io.FileInput`: Either a file-like object
+        (must have 'read' and 'close' methods), or ``None``
+        (`source_path` is opened).  If neither `source` nor
+        `source_path` are supplied, `sys.stdin` is used.
+
+      - If `source_class` is `io.StringInput` **required**: The input
+        string, either an encoded 8-bit string (set the
+        'input_encoding' setting to the correct encoding) or a Unicode
+        string (set the 'input_encoding' setting to 'unicode').
+
+    * `source_path`: Type depends on `source_class`:
+
+      - `io.FileInput`: Path to the input file, opened if no `source`
+        supplied.
+
+      - `io.StringInput`: Optional.  Path to the file or object that produced
+        `source`.  Only used for diagnostic output.
+
+    * `destination_class` **required**: The class for dynamically created
+      destination objects.  Typically `io.FileOutput` or `io.StringOutput`.
+
+    * `destination`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Either a file-like object (must have 'write' and
+        'close' methods), or ``None`` (`destination_path` is opened).  If
+        neither `destination` nor `destination_path` are supplied,
+        `sys.stdout` is used.
+
+      - `io.StringOutput`: Not used; pass ``None``.
+
+    * `destination_path`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Path to the output file.  Opened if no `destination`
+        supplied.
+
+      - `io.StringOutput`: Path to the file or object which will receive the
+        output; optional.  Used for determining relative paths (stylesheets,
+        source links, etc.).
+
+    * `reader`: A `docutils.readers.Reader` object.
+
+    * `reader_name`: Name or alias of the Reader class to be instantiated if
+      no `reader` supplied.
+
+    * `parser`: A `docutils.parsers.Parser` object.
+
+    * `parser_name`: Name or alias of the Parser class to be instantiated if
+      no `parser` supplied.
+
+    * `writer`: A `docutils.writers.Writer` object.
+
+    * `writer_name`: Name or alias of the Writer class to be instantiated if
+      no `writer` supplied.
+
+    * `settings`: A runtime settings (`docutils.frontend.Values`) object, for
+      dotted-attribute access to runtime settings.  It's the end result of the
+      `SettingsSpec`, config file, and option processing.  If `settings` is
+      passed, it's assumed to be complete and no further setting/config/option
+      processing is done.
+
+    * `settings_spec`: A `docutils.SettingsSpec` subclass or object.  Provides
+      extra application-specific settings definitions independently of
+      components.  In other words, the application becomes a component, and
+      its settings data is processed along with that of the other components.
+      Used only if no `settings` specified.
+
+    * `settings_overrides`: A dictionary containing application-specific
+      settings defaults that override the defaults of other components.
+      Used only if no `settings` specified.
+
+    * `config_section`: A string, the name of the configuration file section
+      for this application.  Overrides the ``config_section`` attribute
+      defined by `settings_spec`.  Used only if no `settings` specified.
+
+    * `enable_exit_status`: Boolean; enable exit status at end of processing?
+    """
+    pub = Publisher(reader, parser, writer, settings=settings,
+                    source_class=source_class,
+                    destination_class=destination_class)
+    pub.set_components(reader_name, parser_name, writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(destination, destination_path)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return output, pub
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/null.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/null.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/null.py	(revision 1126)
@@ -0,0 +1,20 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""A do-nothing parser."""
+
+from docutils import parsers
+
+
+class Parser(parsers.Parser):
+
+    """A do-nothing parser."""
+
+    supported = ('null',)
+
+    config_section = 'null parser'
+    config_section_dependencies = ('parsers',)
+
+    def parse(self, inputstring, document):
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/__init__.py	(revision 1126)
@@ -0,0 +1,53 @@
+# $Id: __init__.py 7646 2013-04-17 14:17:37Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils parser modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+from docutils import Component
+if sys.version_info < (2,5):
+    from docutils._compat import __import__
+
+
+class Parser(Component):
+
+    component_type = 'parser'
+    config_section = 'parsers'
+
+    def parse(self, inputstring, document):
+        """Override to parse `inputstring` into document tree `document`."""
+        raise NotImplementedError('subclass must override this method')
+
+    def setup_parse(self, inputstring, document):
+        """Initial parse setup.  Call at start of `self.parse()`."""
+        self.inputstring = inputstring
+        self.document = document
+        document.reporter.attach_observer(document.note_parse_message)
+
+    def finish_parse(self):
+        """Finalize parse details.  Call at end of `self.parse()`."""
+        self.document.reporter.detach_observer(
+            self.document.note_parse_message)
+
+
+_parser_aliases = {
+      'restructuredtext': 'rst',
+      'rest': 'rst',
+      'restx': 'rst',
+      'rtxt': 'rst',}
+
+def get_parser_class(parser_name):
+    """Return the Parser class from the `parser_name` module."""
+    parser_name = parser_name.lower()
+    if parser_name in _parser_aliases:
+        parser_name = _parser_aliases[parser_name]
+    try:
+        module = __import__(parser_name, globals(), locals(), level=1)
+    except ImportError:
+        module = __import__(parser_name, globals(), locals(), level=0)
+    return module.Parser
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/states.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/states.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/states.py	(revision 1126)
@@ -0,0 +1,3091 @@
+# $Id: states.py 7958 2016-07-28 21:52:14Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the ``docutils.parsers.rst.states`` module, the core of
+the reStructuredText parser.  It defines the following:
+
+:Classes:
+    - `RSTStateMachine`: reStructuredText parser's entry point.
+    - `NestedStateMachine`: recursive StateMachine.
+    - `RSTState`: reStructuredText State superclass.
+    - `Inliner`: For parsing inline markup.
+    - `Body`: Generic classifier of the first line of a block.
+    - `SpecializedBody`: Superclass for compound element members.
+    - `BulletList`: Second and subsequent bullet_list list_items
+    - `DefinitionList`: Second+ definition_list_items.
+    - `EnumeratedList`: Second+ enumerated_list list_items.
+    - `FieldList`: Second+ fields.
+    - `OptionList`: Second+ option_list_items.
+    - `RFC2822List`: Second+ RFC2822-style fields.
+    - `ExtensionOptions`: Parses directive option fields.
+    - `Explicit`: Second+ explicit markup constructs.
+    - `SubstitutionDef`: For embedded directives in substitution definitions.
+    - `Text`: Classifier of second line of a text block.
+    - `SpecializedText`: Superclass for continuation lines of Text-variants.
+    - `Definition`: Second line of potential definition_list_item.
+    - `Line`: Second line of overlined section title or transition marker.
+    - `Struct`: An auxiliary collection class.
+
+:Exception classes:
+    - `MarkupError`
+    - `ParserError`
+    - `MarkupMismatch`
+
+:Functions:
+    - `escape2null()`: Return a string, escape-backslashes converted to nulls.
+    - `unescape()`: Return a string, nulls removed or restored to backslashes.
+
+:Attributes:
+    - `state_classes`: set of State classes used with `RSTStateMachine`.
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a recursive state machine,
+examining its input one line at a time.  To understand how the parser works,
+please first become familiar with the `docutils.statemachine` module.  In the
+description below, references are made to classes defined in this module;
+please see the individual classes for details.
+
+Parsing proceeds as follows:
+
+1. The state machine examines each line of input, checking each of the
+   transition patterns of the state `Body`, in order, looking for a match.
+   The implicit transitions (blank lines and indentation) are checked before
+   any others.  The 'text' transition is a catch-all (matches anything).
+
+2. The method associated with the matched transition pattern is called.
+
+   A. Some transition methods are self-contained, appending elements to the
+      document tree (`Body.doctest` parses a doctest block).  The parser's
+      current line index is advanced to the end of the element, and parsing
+      continues with step 1.
+
+   B. Other transition methods trigger the creation of a nested state machine,
+      whose job is to parse a compound construct ('indent' does a block quote,
+      'bullet' does a bullet list, 'overline' does a section [first checking
+      for a valid section header], etc.).
+
+      - In the case of lists and explicit markup, a one-off state machine is
+        created and run to parse contents of the first item.
+
+      - A new state machine is created and its initial state is set to the
+        appropriate specialized state (`BulletList` in the case of the
+        'bullet' transition; see `SpecializedBody` for more detail).  This
+        state machine is run to parse the compound element (or series of
+        explicit markup elements), and returns as soon as a non-member element
+        is encountered.  For example, the `BulletList` state machine ends as
+        soon as it encounters an element which is not a list item of that
+        bullet list.  The optional omission of inter-element blank lines is
+        enabled by this nested state machine.
+
+      - The current line index is advanced to the end of the elements parsed,
+        and parsing continues with step 1.
+
+   C. The result of the 'text' transition depends on the next line of text.
+      The current state is changed to `Text`, under which the second line is
+      examined.  If the second line is:
+
+      - Indented: The element is a definition list item, and parsing proceeds
+        similarly to step 2.B, using the `DefinitionList` state.
+
+      - A line of uniform punctuation characters: The element is a section
+        header; again, parsing proceeds as in step 2.B, and `Body` is still
+        used.
+
+      - Anything else: The element is a paragraph, which is examined for
+        inline markup and appended to the parent element.  Processing
+        continues with step 1.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import re
+from types import FunctionType, MethodType
+
+from docutils import nodes, statemachine, utils
+from docutils import ApplicationError, DataError
+from docutils.statemachine import StateMachineWS, StateWS
+from docutils.nodes import fully_normalize_name as normalize_name
+from docutils.nodes import whitespace_normalize_name
+import docutils.parsers.rst
+from docutils.parsers.rst import directives, languages, tableparser, roles
+from docutils.parsers.rst.languages import en as _fallback_language_module
+from docutils.utils import escape2null, unescape, column_width
+from docutils.utils import punctuation_chars, roman, urischemes
+
+class MarkupError(DataError): pass
+class UnknownInterpretedRoleError(DataError): pass
+class InterpretedRoleNotImplementedError(DataError): pass
+class ParserError(ApplicationError): pass
+class MarkupMismatch(Exception): pass
+
+
+class Struct:
+
+    """Stores data attributes for dotted-attribute access."""
+
+    def __init__(self, **keywordargs):
+        self.__dict__.update(keywordargs)
+
+
+class RSTStateMachine(StateMachineWS):
+
+    """
+    reStructuredText's master StateMachine.
+
+    The entry point to reStructuredText parsing is the `run()` method.
+    """
+
+    def run(self, input_lines, document, input_offset=0, match_titles=True,
+            inliner=None):
+        """
+        Parse `input_lines` and modify the `document` node in place.
+
+        Extend `StateMachineWS.run()`: set up parse-global data and
+        run the StateMachine.
+        """
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.match_titles = match_titles
+        if inliner is None:
+            inliner = Inliner()
+        inliner.init_customizations(document.settings)
+        self.memo = Struct(document=document,
+                           reporter=document.reporter,
+                           language=self.language,
+                           title_styles=[],
+                           section_level=0,
+                           section_bubble_up_kludge=False,
+                           inliner=inliner)
+        self.document = document
+        self.attach_observer(document.note_source)
+        self.reporter = self.memo.reporter
+        self.node = document
+        results = StateMachineWS.run(self, input_lines, input_offset,
+                                     input_source=document['source'])
+        assert results == [], 'RSTStateMachine.run() results should be empty!'
+        self.node = self.memo = None    # remove unneeded references
+
+
+class NestedStateMachine(StateMachineWS):
+
+    """
+    StateMachine run from within other StateMachine runs, to parse nested
+    document structures.
+    """
+
+    def run(self, input_lines, input_offset, memo, node, match_titles=True):
+        """
+        Parse `input_lines` and populate a `docutils.nodes.document` instance.
+
+        Extend `StateMachineWS.run()`: set up document-wide data.
+        """
+        self.match_titles = match_titles
+        self.memo = memo
+        self.document = memo.document
+        self.attach_observer(self.document.note_source)
+        self.reporter = memo.reporter
+        self.language = memo.language
+        self.node = node
+        results = StateMachineWS.run(self, input_lines, input_offset)
+        assert results == [], ('NestedStateMachine.run() results should be '
+                               'empty!')
+        return results
+
+
+class RSTState(StateWS):
+
+    """
+    reStructuredText State superclass.
+
+    Contains methods used by all State subclasses.
+    """
+
+    nested_sm = NestedStateMachine
+    nested_sm_cache = []
+
+    def __init__(self, state_machine, debug=False):
+        self.nested_sm_kwargs = {'state_classes': state_classes,
+                                 'initial_state': 'Body'}
+        StateWS.__init__(self, state_machine, debug)
+
+    def runtime_init(self):
+        StateWS.runtime_init(self)
+        memo = self.state_machine.memo
+        self.memo = memo
+        self.reporter = memo.reporter
+        self.inliner = memo.inliner
+        self.document = memo.document
+        self.parent = self.state_machine.node
+        # enable the reporter to determine source and source-line
+        if not hasattr(self.reporter, 'get_source_and_line'):
+            self.reporter.get_source_and_line = self.state_machine.get_source_and_line
+
+
+    def goto_line(self, abs_line_offset):
+        """
+        Jump to input line `abs_line_offset`, ignoring jumps past the end.
+        """
+        try:
+            self.state_machine.goto_line(abs_line_offset)
+        except EOFError:
+            pass
+
+    def no_match(self, context, transitions):
+        """
+        Override `StateWS.no_match` to generate a system message.
+
+        This code should never be run.
+        """
+        self.reporter.severe(
+            'Internal error: no transition pattern match.  State: "%s"; '
+            'transitions: %s; context: %s; current line: %r.'
+            % (self.__class__.__name__, transitions, context,
+               self.state_machine.line))
+        return context, None, []
+
+    def bof(self, context):
+        """Called at beginning of file."""
+        return [], []
+
+    def nested_parse(self, block, input_offset, node, match_titles=False,
+                     state_machine_class=None, state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`.
+        """
+        use_default = 0
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+            use_default += 1
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs
+            use_default += 1
+        block_length = len(block)
+
+        state_machine = None
+        if use_default == 2:
+            try:
+                state_machine = self.nested_sm_cache.pop()
+            except IndexError:
+                pass
+        if not state_machine:
+            state_machine = state_machine_class(debug=self.debug,
+                                                **state_machine_kwargs)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        if use_default == 2:
+            self.nested_sm_cache.append(state_machine)
+        else:
+            state_machine.unlink()
+        new_offset = state_machine.abs_line_offset()
+        # No `block.parent` implies disconnected -- lines aren't in sync:
+        if block.parent and (len(block) - block_length) != 0:
+            # Adjustment for block if modified in nested parse:
+            self.state_machine.next_line(len(block) - block_length)
+        return new_offset
+
+    def nested_list_parse(self, block, input_offset, node, initial_state,
+                          blank_finish,
+                          blank_finish_state=None,
+                          extra_settings={},
+                          match_titles=False,
+                          state_machine_class=None,
+                          state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`. Also keep track of optional intermediate blank lines and the
+        required final one.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs.copy()
+        state_machine_kwargs['initial_state'] = initial_state
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        if blank_finish_state is None:
+            blank_finish_state = initial_state
+        state_machine.states[blank_finish_state].blank_finish = blank_finish
+        for key, value in extra_settings.items():
+            setattr(state_machine.states[initial_state], key, value)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        blank_finish = state_machine.states[blank_finish_state].blank_finish
+        state_machine.unlink()
+        return state_machine.abs_line_offset(), blank_finish
+
+    def section(self, title, source, style, lineno, messages):
+        """Check for a valid subsection and create one if it checks out."""
+        if self.check_subsection(source, style, lineno):
+            self.new_subsection(title, lineno, messages)
+
+    def check_subsection(self, source, style, lineno):
+        """
+        Check for a valid subsection header.  Return 1 (true) or None (false).
+
+        When a new section is reached that isn't a subsection of the current
+        section, back up the line count (use ``previous_line(-x)``), then
+        ``raise EOFError``.  The current StateMachine will finish, then the
+        calling StateMachine can re-examine the title.  This will work its way
+        back up the calling chain until the correct section level isreached.
+
+        @@@ Alternative: Evaluate the title, store the title info & level, and
+        back up the chain until that level is reached.  Store in memo? Or
+        return in results?
+
+        :Exception: `EOFError` when a sibling or supersection encountered.
+        """
+        memo = self.memo
+        title_styles = memo.title_styles
+        mylevel = memo.section_level
+        try:                            # check for existing title style
+            level = title_styles.index(style) + 1
+        except ValueError:              # new title style
+            if len(title_styles) == memo.section_level: # new subsection
+                title_styles.append(style)
+                return 1
+            else:                       # not at lowest level
+                self.parent += self.title_inconsistent(source, lineno)
+                return None
+        if level <= mylevel:            # sibling or supersection
+            memo.section_level = level   # bubble up to parent section
+            if len(style) == 2:
+                memo.section_bubble_up_kludge = True
+            # back up 2 lines for underline title, 3 for overline title
+            self.state_machine.previous_line(len(style) + 1)
+            raise EOFError              # let parent section re-evaluate
+        if level == mylevel + 1:        # immediate subsection
+            return 1
+        else:                           # invalid subsection
+            self.parent += self.title_inconsistent(source, lineno)
+            return None
+
+    def title_inconsistent(self, sourcetext, lineno):
+        error = self.reporter.severe(
+            'Title level inconsistent:', nodes.literal_block('', sourcetext),
+            line=lineno)
+        return error
+
+    def new_subsection(self, title, lineno, messages):
+        """Append new subsection to document tree. On return, check level."""
+        memo = self.memo
+        mylevel = memo.section_level
+        memo.section_level += 1
+        section_node = nodes.section()
+        self.parent += section_node
+        textnodes, title_messages = self.inline_text(title, lineno)
+        titlenode = nodes.title(title, '', *textnodes)
+        name = normalize_name(titlenode.astext())
+        section_node['names'].append(name)
+        section_node += titlenode
+        section_node += messages
+        section_node += title_messages
+        self.document.note_implicit_target(section_node, section_node)
+        offset = self.state_machine.line_offset + 1
+        absoffset = self.state_machine.abs_line_offset() + 1
+        newabsoffset = self.nested_parse(
+              self.state_machine.input_lines[offset:], input_offset=absoffset,
+              node=section_node, match_titles=True)
+        self.goto_line(newabsoffset)
+        if memo.section_level <= mylevel: # can't handle next section?
+            raise EOFError              # bubble up to supersection
+        # reset section_level; next pass will detect it properly
+        memo.section_level = mylevel
+
+    def paragraph(self, lines, lineno):
+        """
+        Return a list (paragraph & messages) & a boolean: literal_block next?
+        """
+        data = '\n'.join(lines).rstrip()
+        if re.search(r'(?<!\\)(\\\\)*::$', data):
+            if len(data) == 2:
+                return [], 1
+            elif data[-3] in ' \n':
+                text = data[:-3].rstrip()
+            else:
+                text = data[:-1]
+            literalnext = 1
+        else:
+            text = data
+            literalnext = 0
+        textnodes, messages = self.inline_text(text, lineno)
+        p = nodes.paragraph(data, '', *textnodes)
+        p.source, p.line = self.state_machine.get_source_and_line(lineno)
+        return [p] + messages, literalnext
+
+    def inline_text(self, text, lineno):
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+        """
+        return self.inliner.parse(text, lineno, self.memo, self.parent)
+
+    def unindent_warning(self, node_name):
+        # the actual problem is one line below the current line
+        lineno = self.state_machine.abs_line_number()+1
+        return self.reporter.warning('%s ends without a blank line; '
+                                     'unexpected unindent.' % node_name,
+                                     line=lineno)
+
+
+def build_regexp(definition, compile=True):
+    """
+    Build, compile and return a regular expression based on `definition`.
+
+    :Parameter: `definition`: a 4-tuple (group name, prefix, suffix, parts),
+        where "parts" is a list of regular expressions and/or regular
+        expression definitions to be joined into an or-group.
+    """
+    name, prefix, suffix, parts = definition
+    part_strings = []
+    for part in parts:
+        if type(part) is tuple:
+            part_strings.append(build_regexp(part, None))
+        else:
+            part_strings.append(part)
+    or_group = '|'.join(part_strings)
+    regexp = '%(prefix)s(?P<%(name)s>%(or_group)s)%(suffix)s' % locals()
+    if compile:
+        return re.compile(regexp, re.UNICODE)
+    else:
+        return regexp
+
+
+class Inliner:
+
+    """
+    Parse inline markup; call the `parse()` method.
+    """
+
+    def __init__(self):
+        pass
+
+    def init_customizations(self, settings):
+        # lookahead and look-behind expressions for inline markup rules
+        if settings.character_level_inline_markup:
+            start_string_prefix = u'(^|(?<!\x00))'
+            end_string_suffix = u''
+        else:
+            start_string_prefix = (u'(^|(?<=\\s|[%s%s]))' %
+                                   (punctuation_chars.openers,
+                                    punctuation_chars.delimiters))
+            end_string_suffix = (u'($|(?=\\s|[\x00%s%s%s]))' %
+                                 (punctuation_chars.closing_delimiters,
+                                  punctuation_chars.delimiters,
+                                  punctuation_chars.closers))
+
+        args = locals().copy()
+        args.update(vars(self.__class__))
+
+        parts = ('initial_inline', start_string_prefix, '',
+           [('start', '', self.non_whitespace_after, # simple start-strings
+             [r'\*\*',                # strong
+              r'\*(?!\*)',            # emphasis but not strong
+              r'``',                  # literal
+              r'_`',                  # inline internal target
+              r'\|(?!\|)']            # substitution reference
+             ),
+            ('whole', '', end_string_suffix, # whole constructs
+             [# reference name & end-string
+              r'(?P<refname>%s)(?P<refend>__?)' % self.simplename,
+              ('footnotelabel', r'\[', r'(?P<fnend>\]_)',
+               [r'[0-9]+',               # manually numbered
+                r'\#(%s)?' % self.simplename, # auto-numbered (w/ label?)
+                r'\*',                   # auto-symbol
+                r'(?P<citationlabel>%s)' % self.simplename] # citation reference
+               )
+              ]
+             ),
+            ('backquote',             # interpreted text or phrase reference
+             '(?P<role>(:%s:)?)' % self.simplename, # optional role
+             self.non_whitespace_after,
+             ['`(?!`)']               # but not literal
+             )
+            ]
+           )
+
+        self.patterns = Struct(
+          initial=build_regexp(parts),
+          emphasis=re.compile(self.non_whitespace_escape_before
+                              + r'(\*)' + end_string_suffix, re.UNICODE),
+          strong=re.compile(self.non_whitespace_escape_before
+                            + r'(\*\*)' + end_string_suffix, re.UNICODE),
+          interpreted_or_phrase_ref=re.compile(
+              r"""
+              %(non_unescaped_whitespace_escape_before)s
+              (
+                `
+                (?P<suffix>
+                  (?P<role>:%(simplename)s:)?
+                  (?P<refend>__?)?
+                )
+              )
+              %(end_string_suffix)s
+              """ % args, re.VERBOSE | re.UNICODE),
+          embedded_link=re.compile(
+              r"""
+              (
+                (?:[ \n]+|^)            # spaces or beginning of line/string
+                <                       # open bracket
+                %(non_whitespace_after)s
+                (([^<>]|\x00[<>])+)     # anything but unescaped angle brackets
+                %(non_whitespace_escape_before)s
+                >                       # close bracket
+              )
+              $                         # end of string
+              """ % args, re.VERBOSE | re.UNICODE),
+          literal=re.compile(self.non_whitespace_before + '(``)'
+                             + end_string_suffix),
+          target=re.compile(self.non_whitespace_escape_before
+                            + r'(`)' + end_string_suffix),
+          substitution_ref=re.compile(self.non_whitespace_escape_before
+                                      + r'(\|_{0,2})'
+                                      + end_string_suffix),
+          email=re.compile(self.email_pattern % args + '$',
+                           re.VERBOSE | re.UNICODE),
+          uri=re.compile(
+                (r"""
+                %(start_string_prefix)s
+                (?P<whole>
+                  (?P<absolute>           # absolute URI
+                    (?P<scheme>             # scheme (http, ftp, mailto)
+                      [a-zA-Z][a-zA-Z0-9.+-]*
+                    )
+                    :
+                    (
+                      (                       # either:
+                        (//?)?                  # hierarchical URI
+                        %(uric)s*               # URI characters
+                        %(uri_end)s             # final URI char
+                      )
+                      (                       # optional query
+                        \?%(uric)s*
+                        %(uri_end)s
+                      )?
+                      (                       # optional fragment
+                        \#%(uric)s*
+                        %(uri_end)s
+                      )?
+                    )
+                  )
+                |                       # *OR*
+                  (?P<email>              # email address
+                    """ + self.email_pattern + r"""
+                  )
+                )
+                %(end_string_suffix)s
+                """) % args, re.VERBOSE | re.UNICODE),
+          pep=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (
+                  (pep-(?P<pepnum1>\d+)(.txt)?) # reference to source file
+                |
+                  (PEP\s+(?P<pepnum2>\d+))      # reference by name
+                )
+                %(end_string_suffix)s""" % args, re.VERBOSE | re.UNICODE),
+          rfc=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (RFC(-|\s+)?(?P<rfcnum>\d+))
+                %(end_string_suffix)s""" % args, re.VERBOSE | re.UNICODE))
+
+        self.implicit_dispatch = [(self.patterns.uri, self.standalone_uri),]
+        """List of (pattern, bound method) tuples, used by
+        `self.implicit_inline`."""
+
+        if settings.pep_references:
+            self.implicit_dispatch.append((self.patterns.pep,
+                                           self.pep_reference))
+        if settings.rfc_references:
+            self.implicit_dispatch.append((self.patterns.rfc,
+                                           self.rfc_reference))
+
+    def parse(self, text, lineno, memo, parent):
+        # Needs to be refactored for nested inline markup.
+        # Add nested_parse() method?
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+
+        Using `self.patterns.initial`, a pattern which matches start-strings
+        (emphasis, strong, interpreted, phrase reference, literal,
+        substitution reference, and inline target) and complete constructs
+        (simple reference, footnote reference), search for a candidate.  When
+        one is found, check for validity (e.g., not a quoted '*' character).
+        If valid, search for the corresponding end string if applicable, and
+        check it for validity.  If not found or invalid, generate a warning
+        and ignore the start-string.  Implicit inline markup (e.g. standalone
+        URIs) is found last.
+        """
+        self.reporter = memo.reporter
+        self.document = memo.document
+        self.language = memo.language
+        self.parent = parent
+        pattern_search = self.patterns.initial.search
+        dispatch = self.dispatch
+        remaining = escape2null(text)
+        processed = []
+        unprocessed = []
+        messages = []
+        while remaining:
+            match = pattern_search(remaining)
+            if match:
+                groups = match.groupdict()
+                method = dispatch[groups['start'] or groups['backquote']
+                                  or groups['refend'] or groups['fnend']]
+                before, inlines, remaining, sysmessages = method(self, match,
+                                                                 lineno)
+                unprocessed.append(before)
+                messages += sysmessages
+                if inlines:
+                    processed += self.implicit_inline(''.join(unprocessed),
+                                                      lineno)
+                    processed += inlines
+                    unprocessed = []
+            else:
+                break
+        remaining = ''.join(unprocessed) + remaining
+        if remaining:
+            processed += self.implicit_inline(remaining, lineno)
+        return processed, messages
+
+    # Inline object recognition
+    # -------------------------
+    # print start_string_prefix.encode('utf8')
+    # TODO: support non-ASCII whitespace in the following 4 patterns?
+    non_whitespace_before = r'(?<![ \n])'
+    non_whitespace_escape_before = r'(?<![ \n\x00])'
+    non_unescaped_whitespace_escape_before = r'(?<!(?<!\x00)[ \n\x00])'
+    non_whitespace_after = r'(?![ \n])'
+    # Alphanumerics with isolated internal [-._+:] chars (i.e. not 2 together):
+    simplename = r'(?:(?!_)\w)+(?:[-._+:](?:(?!_)\w)+)*'
+    # Valid URI characters (see RFC 2396 & RFC 2732);
+    # final \x00 allows backslash escapes in URIs:
+    uric = r"""[-_.!~*'()[\];/:@&=+$,%a-zA-Z0-9\x00]"""
+    # Delimiter indicating the end of a URI (not part of the URI):
+    uri_end_delim = r"""[>]"""
+    # Last URI character; same as uric but no punctuation:
+    urilast = r"""[_~*/=+a-zA-Z0-9]"""
+    # End of a URI (either 'urilast' or 'uric followed by a
+    # uri_end_delim'):
+    uri_end = r"""(?:%(urilast)s|%(uric)s(?=%(uri_end_delim)s))""" % locals()
+    emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]"""
+    email_pattern = r"""
+          %(emailc)s+(?:\.%(emailc)s+)*   # name
+          (?<!\x00)@                      # at
+          %(emailc)s+(?:\.%(emailc)s*)*   # host
+          %(uri_end)s                     # final URI char
+          """
+
+    def quoted_start(self, match):
+        """Test if inline markup start-string is 'quoted'.
+
+        'Quoted' in this context means the start-string is enclosed in a pair
+        of matching opening/closing delimiters (not necessarily quotes)
+        or at the end of the match.
+        """
+        string = match.string
+        start = match.start()
+        if start == 0:                  # start-string at beginning of text
+            return False
+        prestart = string[start - 1]
+        try:
+            poststart = string[match.end()]
+        except IndexError:          # start-string at end of text
+            return True  # not "quoted" but no markup start-string either
+        return punctuation_chars.match_chars(prestart, poststart)
+
+    def inline_obj(self, match, lineno, end_pattern, nodeclass,
+                   restore_backslashes=False):
+        string = match.string
+        matchstart = match.start('start')
+        matchend = match.end('start')
+        if self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [], '')
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            text = unescape(endmatch.string[:endmatch.start(1)],
+                            restore_backslashes)
+            textend = matchend + endmatch.end(1)
+            rawsource = unescape(string[matchstart:textend], 1)
+            return (string[:matchstart], [nodeclass(rawsource, text)],
+                    string[textend:], [], endmatch.group(1))
+        msg = self.reporter.warning(
+              'Inline %s start-string without end-string.'
+              % nodeclass.__name__, line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        rawsource = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, rawsource, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg], ''
+
+    def problematic(self, text, rawsource, message):
+        msgid = self.document.set_id(message, self.parent)
+        problematic = nodes.problematic(rawsource, text, refid=msgid)
+        prbid = self.document.set_id(problematic)
+        message.add_backref(prbid)
+        return problematic
+
+    def emphasis(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.emphasis, nodes.emphasis)
+        return before, inlines, remaining, sysmessages
+
+    def strong(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.strong, nodes.strong)
+        return before, inlines, remaining, sysmessages
+
+    def interpreted_or_phrase_ref(self, match, lineno):
+        end_pattern = self.patterns.interpreted_or_phrase_ref
+        string = match.string
+        matchstart = match.start('backquote')
+        matchend = match.end('backquote')
+        rolestart = match.start('role')
+        role = match.group('role')
+        position = ''
+        if role:
+            role = role[1:-1]
+            position = 'prefix'
+        elif self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [])
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            textend = matchend + endmatch.end()
+            if endmatch.group('role'):
+                if role:
+                    msg = self.reporter.warning(
+                        'Multiple roles in interpreted text (both '
+                        'prefix and suffix present; only one allowed).',
+                        line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                role = endmatch.group('suffix')[1:-1]
+                position = 'suffix'
+            escaped = endmatch.string[:endmatch.start(1)]
+            rawsource = unescape(string[matchstart:textend], 1)
+            if rawsource[-1:] == '_':
+                if role:
+                    msg = self.reporter.warning(
+                          'Mismatch: both interpreted text role %s and '
+                          'reference suffix.' % position, line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                return self.phrase_ref(string[:matchstart], string[textend:],
+                                       rawsource, escaped, unescape(escaped))
+            else:
+                rawsource = unescape(string[rolestart:textend], 1)
+                nodelist, messages = self.interpreted(rawsource, escaped, role,
+                                                      lineno)
+                return (string[:rolestart], nodelist,
+                        string[textend:], messages)
+        msg = self.reporter.warning(
+              'Inline interpreted text or phrase reference start-string '
+              'without end-string.', line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, text, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg]
+
+    def phrase_ref(self, before, after, rawsource, escaped, text):
+        match = self.patterns.embedded_link.search(escaped)
+        if match: # embedded <URI> or <alias_>
+            text = unescape(escaped[:match.start(0)])
+            aliastext = match.group(2)
+            underscore_escaped = aliastext.endswith('\x00_')
+            aliastext = unescape(aliastext)
+            if aliastext.endswith('_') and not (underscore_escaped
+                                        or self.patterns.uri.match(aliastext)):
+                aliastype = 'name'
+                alias = normalize_name(aliastext[:-1])
+                target = nodes.target(match.group(1), refname=alias)
+                target.indirect_reference_name = aliastext[:-1]
+            else:
+                aliastype = 'uri'
+                alias = ''.join(aliastext.split())
+                alias = self.adjust_uri(alias)
+                if alias.endswith(r'\_'):
+                    alias = alias[:-2] + '_'
+                target = nodes.target(match.group(1), refuri=alias)
+                target.referenced = 1
+            if not aliastext:
+                raise ApplicationError('problem with embedded link: %r'
+                                       % aliastext)
+            if not text:
+                text = alias
+        else:
+            target = None
+
+        refname = normalize_name(text)
+        reference = nodes.reference(rawsource, text,
+                                    name=whitespace_normalize_name(text))
+        node_list = [reference]
+
+        if rawsource[-2:] == '__':
+            if  target and (aliastype == 'name'):
+                reference['refname'] = alias
+                self.document.note_refname(reference)
+                # self.document.note_indirect_target(target) # required?
+            elif target and (aliastype == 'uri'):
+                reference['refuri'] = alias
+            else:
+                reference['anonymous'] = 1
+        else:
+            if target:
+                target['names'].append(refname)
+                if aliastype == 'name':
+                    reference['refname'] = alias
+                    self.document.note_indirect_target(target)
+                    self.document.note_refname(reference)
+                else:
+                    reference['refuri'] = alias
+                    self.document.note_explicit_target(target, self.parent)
+                # target.note_referenced_by(name=refname)
+                node_list.append(target)
+            else:
+                reference['refname'] = refname
+                self.document.note_refname(reference)
+        return before, node_list, after, []
+
+
+    def adjust_uri(self, uri):
+        match = self.patterns.email.match(uri)
+        if match:
+            return 'mailto:' + uri
+        else:
+            return uri
+
+    def interpreted(self, rawsource, text, role, lineno):
+        role_fn, messages = roles.role(role, self.language, lineno,
+                                       self.reporter)
+        if role_fn:
+            nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
+            return nodes, messages + messages2
+        else:
+            msg = self.reporter.error(
+                'Unknown interpreted text role "%s".' % role,
+                line=lineno)
+            return ([self.problematic(rawsource, rawsource, msg)],
+                    messages + [msg])
+
+    def literal(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.literal, nodes.literal,
+              restore_backslashes=True)
+        return before, inlines, remaining, sysmessages
+
+    def inline_internal_target(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.target, nodes.target)
+        if inlines and isinstance(inlines[0], nodes.target):
+            assert len(inlines) == 1
+            target = inlines[0]
+            name = normalize_name(target.astext())
+            target['names'].append(name)
+            self.document.note_explicit_target(target, self.parent)
+        return before, inlines, remaining, sysmessages
+
+    def substitution_reference(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.substitution_ref,
+              nodes.substitution_reference)
+        if len(inlines) == 1:
+            subref_node = inlines[0]
+            if isinstance(subref_node, nodes.substitution_reference):
+                subref_text = subref_node.astext()
+                self.document.note_substitution_ref(subref_node, subref_text)
+                if endstring[-1:] == '_':
+                    reference_node = nodes.reference(
+                        '|%s%s' % (subref_text, endstring), '')
+                    if endstring[-2:] == '__':
+                        reference_node['anonymous'] = 1
+                    else:
+                        reference_node['refname'] = normalize_name(subref_text)
+                        self.document.note_refname(reference_node)
+                    reference_node += subref_node
+                    inlines = [reference_node]
+        return before, inlines, remaining, sysmessages
+
+    def footnote_reference(self, match, lineno):
+        """
+        Handles `nodes.footnote_reference` and `nodes.citation_reference`
+        elements.
+        """
+        label = match.group('footnotelabel')
+        refname = normalize_name(label)
+        string = match.string
+        before = string[:match.start('whole')]
+        remaining = string[match.end('whole'):]
+        if match.group('citationlabel'):
+            refnode = nodes.citation_reference('[%s]_' % label,
+                                               refname=refname)
+            refnode += nodes.Text(label)
+            self.document.note_citation_ref(refnode)
+        else:
+            refnode = nodes.footnote_reference('[%s]_' % label)
+            if refname[0] == '#':
+                refname = refname[1:]
+                refnode['auto'] = 1
+                self.document.note_autofootnote_ref(refnode)
+            elif refname == '*':
+                refname = ''
+                refnode['auto'] = '*'
+                self.document.note_symbol_footnote_ref(
+                      refnode)
+            else:
+                refnode += nodes.Text(label)
+            if refname:
+                refnode['refname'] = refname
+                self.document.note_footnote_ref(refnode)
+            if utils.get_trim_footnote_ref_space(self.document.settings):
+                before = before.rstrip()
+        return (before, [refnode], remaining, [])
+
+    def reference(self, match, lineno, anonymous=False):
+        referencename = match.group('refname')
+        refname = normalize_name(referencename)
+        referencenode = nodes.reference(
+            referencename + match.group('refend'), referencename,
+            name=whitespace_normalize_name(referencename))
+        if anonymous:
+            referencenode['anonymous'] = 1
+        else:
+            referencenode['refname'] = refname
+            self.document.note_refname(referencenode)
+        string = match.string
+        matchstart = match.start('whole')
+        matchend = match.end('whole')
+        return (string[:matchstart], [referencenode], string[matchend:], [])
+
+    def anonymous_reference(self, match, lineno):
+        return self.reference(match, lineno, anonymous=1)
+
+    def standalone_uri(self, match, lineno):
+        if (not match.group('scheme')
+                or match.group('scheme').lower() in urischemes.schemes):
+            if match.group('email'):
+                addscheme = 'mailto:'
+            else:
+                addscheme = ''
+            text = match.group('whole')
+            unescaped = unescape(text, 0)
+            return [nodes.reference(unescape(text, 1), unescaped,
+                                    refuri=addscheme + unescaped)]
+        else:                   # not a valid scheme
+            raise MarkupMismatch
+
+    def pep_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('pep-'):
+            pepnum = int(match.group('pepnum1'))
+        elif text.startswith('PEP'):
+            pepnum = int(match.group('pepnum2'))
+        else:
+            raise MarkupMismatch
+        ref = (self.document.settings.pep_base_url
+               + self.document.settings.pep_file_url_template % pepnum)
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    rfc_url = 'rfc%d.html'
+
+    def rfc_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('RFC'):
+            rfcnum = int(match.group('rfcnum'))
+            ref = self.document.settings.rfc_base_url + self.rfc_url % rfcnum
+        else:
+            raise MarkupMismatch
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    def implicit_inline(self, text, lineno):
+        """
+        Check each of the patterns in `self.implicit_dispatch` for a match,
+        and dispatch to the stored method for the pattern.  Recursively check
+        the text before and after the match.  Return a list of `nodes.Text`
+        and inline element nodes.
+        """
+        if not text:
+            return []
+        for pattern, method in self.implicit_dispatch:
+            match = pattern.search(text)
+            if match:
+                try:
+                    # Must recurse on strings before *and* after the match;
+                    # there may be multiple patterns.
+                    return (self.implicit_inline(text[:match.start()], lineno)
+                            + method(match, lineno) +
+                            self.implicit_inline(text[match.end():], lineno))
+                except MarkupMismatch:
+                    pass
+        return [nodes.Text(unescape(text), rawsource=unescape(text, 1))]
+
+    dispatch = {'*': emphasis,
+                '**': strong,
+                '`': interpreted_or_phrase_ref,
+                '``': literal,
+                '_`': inline_internal_target,
+                ']_': footnote_reference,
+                '|': substitution_reference,
+                '_': reference,
+                '__': anonymous_reference}
+
+
+def _loweralpha_to_int(s, _zero=(ord('a')-1)):
+    return ord(s) - _zero
+
+def _upperalpha_to_int(s, _zero=(ord('A')-1)):
+    return ord(s) - _zero
+
+def _lowerroman_to_int(s):
+    return roman.fromRoman(s.upper())
+
+
+class Body(RSTState):
+
+    """
+    Generic classifier of the first line of a block.
+    """
+
+    double_width_pad_char = tableparser.TableParser.double_width_pad_char
+    """Padding character for East Asian double-width text."""
+
+    enum = Struct()
+    """Enumerated list parsing information."""
+
+    enum.formatinfo = {
+          'parens': Struct(prefix='(', suffix=')', start=1, end=-1),
+          'rparen': Struct(prefix='', suffix=')', start=0, end=-1),
+          'period': Struct(prefix='', suffix='.', start=0, end=-1)}
+    enum.formats = enum.formatinfo.keys()
+    enum.sequences = ['arabic', 'loweralpha', 'upperalpha',
+                      'lowerroman', 'upperroman'] # ORDERED!
+    enum.sequencepats = {'arabic': '[0-9]+',
+                         'loweralpha': '[a-z]',
+                         'upperalpha': '[A-Z]',
+                         'lowerroman': '[ivxlcdm]+',
+                         'upperroman': '[IVXLCDM]+',}
+    enum.converters = {'arabic': int,
+                       'loweralpha': _loweralpha_to_int,
+                       'upperalpha': _upperalpha_to_int,
+                       'lowerroman': _lowerroman_to_int,
+                       'upperroman': roman.fromRoman}
+
+    enum.sequenceregexps = {}
+    for sequence in enum.sequences:
+        enum.sequenceregexps[sequence] = re.compile(
+              enum.sequencepats[sequence] + '$', re.UNICODE)
+
+    grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$')
+    """Matches the top (& bottom) of a full table)."""
+
+    simple_table_top_pat = re.compile('=+( +=+)+ *$')
+    """Matches the top of a simple table."""
+
+    simple_table_border_pat = re.compile('=+[ =]*$')
+    """Matches the bottom & header bottom of a simple table."""
+
+    pats = {}
+    """Fragments of patterns used by transitions."""
+
+    pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]'
+    pats['alpha'] = '[a-zA-Z]'
+    pats['alphanum'] = '[a-zA-Z0-9]'
+    pats['alphanumplus'] = '[a-zA-Z0-9_-]'
+    pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s'
+                    '|%(upperroman)s|#)' % enum.sequencepats)
+    pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats
+    # @@@ Loosen up the pattern?  Allow Unicode?
+    pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<[^<>]+>)' % pats
+    pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats
+    pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats
+    pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats
+
+    for format in enum.formats:
+        pats[format] = '(?P<%s>%s%s%s)' % (
+              format, re.escape(enum.formatinfo[format].prefix),
+              pats['enum'], re.escape(enum.formatinfo[format].suffix))
+
+    patterns = {
+          'bullet': u'[-+*\u2022\u2023\u2043]( +|$)',
+          'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats,
+          'field_marker': r':(?![: ])([^:\\]|\\.)*(?<! ):( +|$)',
+          'option_marker': r'%(option)s(, %(option)s)*(  +| ?$)' % pats,
+          'doctest': r'>>>( +|$)',
+          'line_block': r'\|( +|$)',
+          'grid_table_top': grid_table_top_pat,
+          'simple_table_top': simple_table_top_pat,
+          'explicit_markup': r'\.\.( +|$)',
+          'anonymous': r'__( +|$)',
+          'line': r'(%(nonalphanum7bit)s)\1* *$' % pats,
+          'text': r''}
+    initial_transitions = (
+          'bullet',
+          'enumerator',
+          'field_marker',
+          'option_marker',
+          'doctest',
+          'line_block',
+          'grid_table_top',
+          'simple_table_top',
+          'explicit_markup',
+          'anonymous',
+          'line',
+          'text')
+
+    def indent(self, match, context, next_state):
+        """Block quote."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        elements = self.block_quote(indented, line_offset)
+        self.parent += elements
+        if not blank_finish:
+            self.parent += self.unindent_warning('Block quote')
+        return context, next_state, []
+
+    def block_quote(self, indented, line_offset):
+        elements = []
+        while indented:
+            (blockquote_lines,
+             attribution_lines,
+             attribution_offset,
+             indented,
+             new_line_offset) = self.split_attribution(indented, line_offset)
+            blockquote = nodes.block_quote()
+            self.nested_parse(blockquote_lines, line_offset, blockquote)
+            elements.append(blockquote)
+            if attribution_lines:
+                attribution, messages = self.parse_attribution(
+                    attribution_lines, attribution_offset)
+                blockquote += attribution
+                elements += messages
+            line_offset = new_line_offset
+            while indented and not indented[0]:
+                indented = indented[1:]
+                line_offset += 1
+        return elements
+
+    # U+2014 is an em-dash:
+    attribution_pattern = re.compile(u'(---?(?!-)|\u2014) *(?=[^ \\n])',
+                                     re.UNICODE)
+
+    def split_attribution(self, indented, line_offset):
+        """
+        Check for a block quote attribution and split it off:
+
+        * First line after a blank line must begin with a dash ("--", "---",
+          em-dash; matches `self.attribution_pattern`).
+        * Every line after that must have consistent indentation.
+        * Attributions must be preceded by block quote content.
+
+        Return a tuple of: (block quote content lines, content offset,
+        attribution lines, attribution offset, remaining indented lines).
+        """
+        blank = None
+        nonblank_seen = False
+        for i in range(len(indented)):
+            line = indented[i].rstrip()
+            if line:
+                if nonblank_seen and blank == i - 1: # last line blank
+                    match = self.attribution_pattern.match(line)
+                    if match:
+                        attribution_end, indent = self.check_attribution(
+                            indented, i)
+                        if attribution_end:
+                            a_lines = indented[i:attribution_end]
+                            a_lines.trim_left(match.end(), end=1)
+                            a_lines.trim_left(indent, start=1)
+                            return (indented[:i], a_lines,
+                                    i, indented[attribution_end:],
+                                    line_offset + attribution_end)
+                nonblank_seen = True
+            else:
+                blank = i
+        else:
+            return (indented, None, None, None, None)
+
+    def check_attribution(self, indented, attribution_start):
+        """
+        Check attribution shape.
+        Return the index past the end of the attribution, and the indent.
+        """
+        indent = None
+        i = attribution_start + 1
+        for i in range(attribution_start + 1, len(indented)):
+            line = indented[i].rstrip()
+            if not line:
+                break
+            if indent is None:
+                indent = len(line) - len(line.lstrip())
+            elif len(line) - len(line.lstrip()) != indent:
+                return None, None       # bad shape; not an attribution
+        else:
+            # return index of line after last attribution line:
+            i += 1
+        return i, (indent or 0)
+
+    def parse_attribution(self, indented, line_offset):
+        text = '\n'.join(indented).rstrip()
+        lineno = self.state_machine.abs_line_number() + line_offset
+        textnodes, messages = self.inline_text(text, lineno)
+        node = nodes.attribution(text, '', *textnodes)
+        node.source, node.line = self.state_machine.get_source_and_line(lineno)
+        return node, messages
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        bulletlist = nodes.bullet_list()
+        (bulletlist.source,
+         bulletlist.line) = self.state_machine.get_source_and_line()
+        self.parent += bulletlist
+        bulletlist['bullet'] = match.string[0]
+        i, blank_finish = self.list_item(match.end())
+        bulletlist += i
+        offset = self.state_machine.line_offset + 1   # next line
+        new_line_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=bulletlist, initial_state='BulletList',
+              blank_finish=blank_finish)
+        self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Bullet list')
+        return [], next_state, []
+
+    def list_item(self, indent):
+        if self.state_machine.line[indent:]:
+            indented, line_offset, blank_finish = (
+                self.state_machine.get_known_indented(indent))
+        else:
+            indented, indent, line_offset, blank_finish = (
+                self.state_machine.get_first_known_indented(indent))
+        listitem = nodes.list_item('\n'.join(indented))
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=listitem)
+        return listitem, blank_finish
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated List Item"""
+        format, sequence, text, ordinal = self.parse_enumerator(match)
+        if not self.is_enumerated_list_item(ordinal, sequence, format):
+            raise statemachine.TransitionCorrection('text')
+        enumlist = nodes.enumerated_list()
+        self.parent += enumlist
+        if sequence == '#':
+            enumlist['enumtype'] = 'arabic'
+        else:
+            enumlist['enumtype'] = sequence
+        enumlist['prefix'] = self.enum.formatinfo[format].prefix
+        enumlist['suffix'] = self.enum.formatinfo[format].suffix
+        if ordinal != 1:
+            enumlist['start'] = ordinal
+            msg = self.reporter.info(
+                'Enumerated list start value not ordinal-1: "%s" (ordinal %s)'
+                % (text, ordinal))
+            self.parent += msg
+        listitem, blank_finish = self.list_item(match.end())
+        enumlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=enumlist, initial_state='EnumeratedList',
+              blank_finish=blank_finish,
+              extra_settings={'lastordinal': ordinal,
+                              'format': format,
+                              'auto': sequence == '#'})
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Enumerated list')
+        return [], next_state, []
+
+    def parse_enumerator(self, match, expected_sequence=None):
+        """
+        Analyze an enumerator and return the results.
+
+        :Return:
+            - the enumerator format ('period', 'parens', or 'rparen'),
+            - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.),
+            - the text of the enumerator, stripped of formatting, and
+            - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.;
+              ``None`` is returned for invalid enumerator text).
+
+        The enumerator format has already been determined by the regular
+        expression match. If `expected_sequence` is given, that sequence is
+        tried first. If not, we check for Roman numeral 1. This way,
+        single-character Roman numerals (which are also alphabetical) can be
+        matched. If no sequence has been matched, all sequences are checked in
+        order.
+        """
+        groupdict = match.groupdict()
+        sequence = ''
+        for format in self.enum.formats:
+            if groupdict[format]:       # was this the format matched?
+                break                   # yes; keep `format`
+        else:                           # shouldn't happen
+            raise ParserError('enumerator format not matched')
+        text = groupdict[format][self.enum.formatinfo[format].start
+                                 :self.enum.formatinfo[format].end]
+        if text == '#':
+            sequence = '#'
+        elif expected_sequence:
+            try:
+                if self.enum.sequenceregexps[expected_sequence].match(text):
+                    sequence = expected_sequence
+            except KeyError:            # shouldn't happen
+                raise ParserError('unknown enumerator sequence: %s'
+                                  % sequence)
+        elif text == 'i':
+            sequence = 'lowerroman'
+        elif text == 'I':
+            sequence = 'upperroman'
+        if not sequence:
+            for sequence in self.enum.sequences:
+                if self.enum.sequenceregexps[sequence].match(text):
+                    break
+            else:                       # shouldn't happen
+                raise ParserError('enumerator sequence not matched')
+        if sequence == '#':
+            ordinal = 1
+        else:
+            try:
+                ordinal = self.enum.converters[sequence](text)
+            except roman.InvalidRomanNumeralError:
+                ordinal = None
+        return format, sequence, text, ordinal
+
+    def is_enumerated_list_item(self, ordinal, sequence, format):
+        """
+        Check validity based on the ordinal value and the second line.
+
+        Return true if the ordinal is valid and the second line is blank,
+        indented, or starts with the next enumerator or an auto-enumerator.
+        """
+        if ordinal is None:
+            return None
+        try:
+            next_line = self.state_machine.next_line()
+        except EOFError:              # end of input lines
+            self.state_machine.previous_line()
+            return 1
+        else:
+            self.state_machine.previous_line()
+        if not next_line[:1].strip():   # blank or indented
+            return 1
+        result = self.make_enumerator(ordinal + 1, sequence, format)
+        if result:
+            next_enumerator, auto_enumerator = result
+            try:
+                if ( next_line.startswith(next_enumerator) or
+                     next_line.startswith(auto_enumerator) ):
+                    return 1
+            except TypeError:
+                pass
+        return None
+
+    def make_enumerator(self, ordinal, sequence, format):
+        """
+        Construct and return the next enumerated list item marker, and an
+        auto-enumerator ("#" instead of the regular enumerator).
+
+        Return ``None`` for invalid (out of range) ordinals.
+        """ #"
+        if sequence == '#':
+            enumerator = '#'
+        elif sequence == 'arabic':
+            enumerator = str(ordinal)
+        else:
+            if sequence.endswith('alpha'):
+                if ordinal > 26:
+                    return None
+                enumerator = chr(ordinal + ord('a') - 1)
+            elif sequence.endswith('roman'):
+                try:
+                    enumerator = roman.toRoman(ordinal)
+                except roman.RomanError:
+                    return None
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+            if sequence.startswith('lower'):
+                enumerator = enumerator.lower()
+            elif sequence.startswith('upper'):
+                enumerator = enumerator.upper()
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+        formatinfo = self.enum.formatinfo[format]
+        next_enumerator = (formatinfo.prefix + enumerator + formatinfo.suffix
+                           + ' ')
+        auto_enumerator = formatinfo.prefix + '#' + formatinfo.suffix + ' '
+        return next_enumerator, auto_enumerator
+
+    def field_marker(self, match, context, next_state):
+        """Field list item."""
+        field_list = nodes.field_list()
+        self.parent += field_list
+        field, blank_finish = self.field(match)
+        field_list += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=field_list, initial_state='FieldList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Field list')
+        return [], next_state, []
+
+    def field(self, match):
+        name = self.parse_field_marker(match)
+        src, srcline = self.state_machine.get_source_and_line()
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        field_node = nodes.field()
+        field_node.source = src
+        field_node.line = srcline
+        name_nodes, name_messages = self.inline_text(name, lineno)
+        field_node += nodes.field_name(name, '', *name_nodes)
+        field_body = nodes.field_body('\n'.join(indented), *name_messages)
+        field_node += field_body
+        if indented:
+            self.parse_field_body(indented, line_offset, field_body)
+        return field_node, blank_finish
+
+    def parse_field_marker(self, match):
+        """Extract & return field name from a field marker match."""
+        field = match.group()[1:]        # strip off leading ':'
+        field = field[:field.rfind(':')] # strip off trailing ':' etc.
+        return field
+
+    def parse_field_body(self, indented, offset, node):
+        self.nested_parse(indented, input_offset=offset, node=node)
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        optionlist = nodes.option_list()
+        (optionlist.source, optionlist.line) = self.state_machine.get_source_and_line()
+        try:
+            listitem, blank_finish = self.option_list_item(match)
+        except MarkupError, error:
+            # This shouldn't happen; pattern won't match.
+            msg = self.reporter.error(u'Invalid option list marker: %s' %
+                                      error)
+            self.parent += msg
+            indented, indent, line_offset, blank_finish = \
+                  self.state_machine.get_first_known_indented(match.end())
+            elements = self.block_quote(indented, line_offset)
+            self.parent += elements
+            if not blank_finish:
+                self.parent += self.unindent_warning('Option list')
+            return [], next_state, []
+        self.parent += optionlist
+        optionlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=optionlist, initial_state='OptionList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Option list')
+        return [], next_state, []
+
+    def option_list_item(self, match):
+        offset = self.state_machine.abs_line_offset()
+        options = self.parse_option_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        if not indented:                # not an option list item
+            self.goto_line(offset)
+            raise statemachine.TransitionCorrection('text')
+        option_group = nodes.option_group('', *options)
+        description = nodes.description('\n'.join(indented))
+        option_list_item = nodes.option_list_item('', option_group,
+                                                  description)
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=description)
+        return option_list_item, blank_finish
+
+    def parse_option_marker(self, match):
+        """
+        Return a list of `node.option` and `node.option_argument` objects,
+        parsed from an option marker match.
+
+        :Exception: `MarkupError` for invalid option markers.
+        """
+        optlist = []
+        optionstrings = match.group().rstrip().split(', ')
+        for optionstring in optionstrings:
+            tokens = optionstring.split()
+            delimiter = ' '
+            firstopt = tokens[0].split('=', 1)
+            if len(firstopt) > 1:
+                # "--opt=value" form
+                tokens[:1] = firstopt
+                delimiter = '='
+            elif (len(tokens[0]) > 2
+                  and ((tokens[0].startswith('-')
+                        and not tokens[0].startswith('--'))
+                       or tokens[0].startswith('+'))):
+                # "-ovalue" form
+                tokens[:1] = [tokens[0][:2], tokens[0][2:]]
+                delimiter = ''
+            if len(tokens) > 1 and (tokens[1].startswith('<')
+                                    and tokens[-1].endswith('>')):
+                # "-o <value1 value2>" form; join all values into one token
+                tokens[1:] = [' '.join(tokens[1:])]
+            if 0 < len(tokens) <= 2:
+                option = nodes.option(optionstring)
+                option += nodes.option_string(tokens[0], tokens[0])
+                if len(tokens) > 1:
+                    option += nodes.option_argument(tokens[1], tokens[1],
+                                                    delimiter=delimiter)
+                optlist.append(option)
+            else:
+                raise MarkupError(
+                    'wrong number of option tokens (=%s), should be 1 or 2: '
+                    '"%s"' % (len(tokens), optionstring))
+        return optlist
+
+    def doctest(self, match, context, next_state):
+        data = '\n'.join(self.state_machine.get_text_block())
+        # TODO: prepend class value ['pycon'] (Python Console)
+        # parse with `directives.body.CodeBlock` (returns literal-block
+        # with class "code" and syntax highlight markup).
+        self.parent += nodes.doctest_block(data, data)
+        return [], next_state, []
+
+    def line_block(self, match, context, next_state):
+        """First line of a line block."""
+        block = nodes.line_block()
+        self.parent += block
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        block += line
+        self.parent += messages
+        if not blank_finish:
+            offset = self.state_machine.line_offset + 1   # next line
+            new_line_offset, blank_finish = self.nested_list_parse(
+                  self.state_machine.input_lines[offset:],
+                  input_offset=self.state_machine.abs_line_offset() + 1,
+                  node=block, initial_state='LineBlock',
+                  blank_finish=0)
+            self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.reporter.warning(
+                'Line block ends without a blank line.',
+                line=lineno+1)
+        if len(block):
+            if block[0].indent is None:
+                block[0].indent = 0
+            self.nest_line_block_lines(block)
+        return [], next_state, []
+
+    def line_block_line(self, match, lineno):
+        """Return one line element of a line_block."""
+        indented, indent, line_offset, blank_finish = \
+            self.state_machine.get_first_known_indented(match.end(),
+                                                        until_blank=True)
+        text = u'\n'.join(indented)
+        text_nodes, messages = self.inline_text(text, lineno)
+        line = nodes.line(text, '', *text_nodes)
+        if match.string.rstrip() != '|': # not empty
+            line.indent = len(match.group(1)) - 1
+        return line, messages, blank_finish
+
+    def nest_line_block_lines(self, block):
+        for index in range(1, len(block)):
+            if getattr(block[index], 'indent', None) is None:
+                block[index].indent = block[index - 1].indent
+        self.nest_line_block_segment(block)
+
+    def nest_line_block_segment(self, block):
+        indents = [item.indent for item in block]
+        least = min(indents)
+        new_items = []
+        new_block = nodes.line_block()
+        for item in block:
+            if item.indent > least:
+                new_block.append(item)
+            else:
+                if len(new_block):
+                    self.nest_line_block_segment(new_block)
+                    new_items.append(new_block)
+                    new_block = nodes.line_block()
+                new_items.append(item)
+        if len(new_block):
+            self.nest_line_block_segment(new_block)
+            new_items.append(new_block)
+        block[:] = new_items
+
+    def grid_table_top(self, match, context, next_state):
+        """Top border of a full table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_grid_table,
+                              tableparser.GridTableParser)
+
+    def simple_table_top(self, match, context, next_state):
+        """Top border of a simple table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_simple_table,
+                              tableparser.SimpleTableParser)
+
+    def table_top(self, match, context, next_state,
+                  isolate_function, parser_class):
+        """Top border of a generic table."""
+        nodelist, blank_finish = self.table(isolate_function, parser_class)
+        self.parent += nodelist
+        if not blank_finish:
+            msg = self.reporter.warning(
+                'Blank line required after table.',
+                line=self.state_machine.abs_line_number()+1)
+            self.parent += msg
+        return [], next_state, []
+
+    def table(self, isolate_function, parser_class):
+        """Parse a table."""
+        block, messages, blank_finish = isolate_function()
+        if block:
+            try:
+                parser = parser_class()
+                tabledata = parser.parse(block)
+                tableline = (self.state_machine.abs_line_number() - len(block)
+                             + 1)
+                table = self.build_table(tabledata, tableline)
+                nodelist = [table] + messages
+            except tableparser.TableMarkupError, err:
+                nodelist = self.malformed_table(block, ' '.join(err.args),
+                                                offset=err.offset) + messages
+        else:
+            nodelist = messages
+        return nodelist, blank_finish
+
+    def isolate_grid_table(self):
+        messages = []
+        blank_finish = 1
+        try:
+            block = self.state_machine.get_text_block(flush_left=True)
+        except statemachine.UnexpectedIndentationError, err:
+            block, src, srcline = err.args
+            messages.append(self.reporter.error('Unexpected indentation.',
+                                                source=src, line=srcline))
+            blank_finish = 0
+        block.disconnect()
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        width = len(block[0].strip())
+        for i in range(len(block)):
+            block[i] = block[i].strip()
+            if block[i][0] not in '+|': # check left edge
+                blank_finish = 0
+                self.state_machine.previous_line(len(block) - i)
+                del block[i:]
+                break
+        if not self.grid_table_top_pat.match(block[-1]): # find bottom
+            blank_finish = 0
+            # from second-last to third line of table:
+            for i in range(len(block) - 2, 1, -1):
+                if self.grid_table_top_pat.match(block[i]):
+                    self.state_machine.previous_line(len(block) - i + 1)
+                    del block[i+1:]
+                    break
+            else:
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        for i in range(len(block)):     # check right edge
+            if len(block[i]) != width or block[i][-1] not in '+|':
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        return block, messages, blank_finish
+
+    def isolate_simple_table(self):
+        start = self.state_machine.line_offset
+        lines = self.state_machine.input_lines
+        limit = len(lines) - 1
+        toplen = len(lines[start].strip())
+        pattern_match = self.simple_table_border_pat.match
+        found = 0
+        found_at = None
+        i = start + 1
+        while i <= limit:
+            line = lines[i]
+            match = pattern_match(line)
+            if match:
+                if len(line.strip()) != toplen:
+                    self.state_machine.next_line(i - start)
+                    messages = self.malformed_table(
+                        lines[start:i+1], 'Bottom/header table border does '
+                        'not match top border.')
+                    return [], messages, i == limit or not lines[i+1].strip()
+                found += 1
+                found_at = i
+                if found == 2 or i == limit or not lines[i+1].strip():
+                    end = i
+                    break
+            i += 1
+        else:                           # reached end of input_lines
+            if found:
+                extra = ' or no blank line after table bottom'
+                self.state_machine.next_line(found_at - start)
+                block = lines[start:found_at+1]
+            else:
+                extra = ''
+                self.state_machine.next_line(i - start - 1)
+                block = lines[start:]
+            messages = self.malformed_table(
+                block, 'No bottom table border found%s.' % extra)
+            return [], messages, not extra
+        self.state_machine.next_line(end - start)
+        block = lines[start:end+1]
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        return block, [], end == limit or not lines[end+1].strip()
+
+    def malformed_table(self, block, detail='', offset=0):
+        block.replace(self.double_width_pad_char, '')
+        data = '\n'.join(block)
+        message = 'Malformed table.'
+        startline = self.state_machine.abs_line_number() - len(block) + 1
+        if detail:
+            message += '\n' + detail
+        error = self.reporter.error(message, nodes.literal_block(data, data),
+                                    line=startline+offset)
+        return [error]
+
+    def build_table(self, tabledata, tableline, stub_columns=0, widths=None):
+        colwidths, headrows, bodyrows = tabledata
+        table = nodes.table()
+        if widths:
+            table['classes'] += ['colwidths-%s' % widths]
+        tgroup = nodes.tgroup(cols=len(colwidths))
+        table += tgroup
+        for colwidth in colwidths:
+            colspec = nodes.colspec(colwidth=colwidth)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        if headrows:
+            thead = nodes.thead()
+            tgroup += thead
+            for row in headrows:
+                thead += self.build_table_row(row, tableline)
+        tbody = nodes.tbody()
+        tgroup += tbody
+        for row in bodyrows:
+            tbody += self.build_table_row(row, tableline)
+        return table
+
+    def build_table_row(self, rowdata, tableline):
+        row = nodes.row()
+        for cell in rowdata:
+            if cell is None:
+                continue
+            morerows, morecols, offset, cellblock = cell
+            attributes = {}
+            if morerows:
+                attributes['morerows'] = morerows
+            if morecols:
+                attributes['morecols'] = morecols
+            entry = nodes.entry(**attributes)
+            row += entry
+            if ''.join(cellblock):
+                self.nested_parse(cellblock, input_offset=tableline+offset,
+                                  node=entry)
+        return row
+
+
+    explicit = Struct()
+    """Patterns and constants used for explicit markup recognition."""
+
+    explicit.patterns = Struct(
+          target=re.compile(r"""
+                            (
+                              _               # anonymous target
+                            |               # *OR*
+                              (?!_)           # no underscore at the beginning
+                              (?P<quote>`?)   # optional open quote
+                              (?![ `])        # first char. not space or
+                                              # backquote
+                              (?P<name>       # reference name
+                                .+?
+                              )
+                              %(non_whitespace_escape_before)s
+                              (?P=quote)      # close quote if open quote used
+                            )
+                            (?<!(?<!\x00):) # no unescaped colon at end
+                            %(non_whitespace_escape_before)s
+                            [ ]?            # optional space
+                            :               # end of reference name
+                            ([ ]+|$)        # followed by whitespace
+                            """ % vars(Inliner), re.VERBOSE | re.UNICODE),
+          reference=re.compile(r"""
+                               (
+                                 (?P<simple>%(simplename)s)_
+                               |                  # *OR*
+                                 `                  # open backquote
+                                 (?![ ])            # not space
+                                 (?P<phrase>.+?)    # hyperlink phrase
+                                 %(non_whitespace_escape_before)s
+                                 `_                 # close backquote,
+                                                    # reference mark
+                               )
+                               $                  # end of string
+                               """ % vars(Inliner), re.VERBOSE | re.UNICODE),
+          substitution=re.compile(r"""
+                                  (
+                                    (?![ ])          # first char. not space
+                                    (?P<name>.+?)    # substitution text
+                                    %(non_whitespace_escape_before)s
+                                    \|               # close delimiter
+                                  )
+                                  ([ ]+|$)           # followed by whitespace
+                                  """ % vars(Inliner),
+                                  re.VERBOSE | re.UNICODE),)
+
+    def footnote(self, match):
+        src, srcline = self.state_machine.get_source_and_line()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        footnote = nodes.footnote('\n'.join(indented))
+        footnote.source = src
+        footnote.line = srcline
+        if name[0] == '#':              # auto-numbered
+            name = name[1:]             # autonumber label
+            footnote['auto'] = 1
+            if name:
+                footnote['names'].append(name)
+            self.document.note_autofootnote(footnote)
+        elif name == '*':               # auto-symbol
+            name = ''
+            footnote['auto'] = '*'
+            self.document.note_symbol_footnote(footnote)
+        else:                           # manually numbered
+            footnote += nodes.label('', label)
+            footnote['names'].append(name)
+            self.document.note_footnote(footnote)
+        if name:
+            self.document.note_explicit_target(footnote, footnote)
+        else:
+            self.document.set_id(footnote, footnote)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=footnote)
+        return [footnote], blank_finish
+
+    def citation(self, match):
+        src, srcline = self.state_machine.get_source_and_line()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        citation = nodes.citation('\n'.join(indented))
+        citation.source = src
+        citation.line = srcline
+        citation += nodes.label('', label)
+        citation['names'].append(name)
+        self.document.note_citation(citation)
+        self.document.note_explicit_target(citation, citation)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=citation)
+        return [citation], blank_finish
+
+    def hyperlink_target(self, match):
+        pattern = self.explicit.patterns.target
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(
+              match.end(), until_blank=True, strip_indent=False)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        escaped = block[0]
+        blockindex = 0
+        while True:
+            targetmatch = pattern.match(escaped)
+            if targetmatch:
+                break
+            blockindex += 1
+            try:
+                escaped += block[blockindex]
+            except IndexError:
+                raise MarkupError('malformed hyperlink target.')
+        del block[:blockindex]
+        block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip()
+        target = self.make_target(block, blocktext, lineno,
+                                  targetmatch.group('name'))
+        return [target], blank_finish
+
+    def make_target(self, block, block_text, lineno, target_name):
+        target_type, data = self.parse_target(block, block_text, lineno)
+        if target_type == 'refname':
+            target = nodes.target(block_text, '', refname=normalize_name(data))
+            target.indirect_reference_name = data
+            self.add_target(target_name, '', target, lineno)
+            self.document.note_indirect_target(target)
+            return target
+        elif target_type == 'refuri':
+            target = nodes.target(block_text, '')
+            self.add_target(target_name, data, target, lineno)
+            return target
+        else:
+            return data
+
+    def parse_target(self, block, block_text, lineno):
+        """
+        Determine the type of reference of a target.
+
+        :Return: A 2-tuple, one of:
+
+            - 'refname' and the indirect reference name
+            - 'refuri' and the URI
+            - 'malformed' and a system_message node
+        """
+        if block and block[-1].strip()[-1:] == '_': # possible indirect target
+            reference = ' '.join([line.strip() for line in block])
+            refname = self.is_reference(reference)
+            if refname:
+                return 'refname', refname
+        reference = ''.join([''.join(line.split()) for line in block])
+        return 'refuri', unescape(reference)
+
+    def is_reference(self, reference):
+        match = self.explicit.patterns.reference.match(
+            whitespace_normalize_name(reference))
+        if not match:
+            return None
+        return unescape(match.group('simple') or match.group('phrase'))
+
+    def add_target(self, targetname, refuri, target, lineno):
+        target.line = lineno
+        if targetname:
+            name = normalize_name(unescape(targetname))
+            target['names'].append(name)
+            if refuri:
+                uri = self.inliner.adjust_uri(refuri)
+                if uri:
+                    target['refuri'] = uri
+                else:
+                    raise ApplicationError('problem with URI: %r' % refuri)
+            self.document.note_explicit_target(target, self.parent)
+        else:                       # anonymous target
+            if refuri:
+                target['refuri'] = refuri
+            target['anonymous'] = 1
+            self.document.note_anonymous_target(target)
+
+    def substitution_def(self, match):
+        pattern = self.explicit.patterns.substitution
+        src, srcline = self.state_machine.get_source_and_line()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          strip_indent=False)
+        blocktext = (match.string[:match.end()] + '\n'.join(block))
+        block.disconnect()
+        escaped = escape2null(block[0].rstrip())
+        blockindex = 0
+        while True:
+            subdefmatch = pattern.match(escaped)
+            if subdefmatch:
+                break
+            blockindex += 1
+            try:
+                escaped = escaped + ' ' + escape2null(block[blockindex].strip())
+            except IndexError:
+                raise MarkupError('malformed substitution definition.')
+        del block[:blockindex]          # strip out the substitution marker
+        block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1]
+        if not block[0]:
+            del block[0]
+            offset += 1
+        while block and not block[-1].strip():
+            block.pop()
+        subname = subdefmatch.group('name')
+        substitution_node = nodes.substitution_definition(blocktext)
+        substitution_node.source = src
+        substitution_node.line = srcline
+        if not block:
+            msg = self.reporter.warning(
+                'Substitution definition "%s" missing contents.' % subname,
+                nodes.literal_block(blocktext, blocktext),
+                source=src, line=srcline)
+            return [msg], blank_finish
+        block[0] = block[0].strip()
+        substitution_node['names'].append(
+            nodes.whitespace_normalize_name(subname))
+        new_abs_offset, blank_finish = self.nested_list_parse(
+              block, input_offset=offset, node=substitution_node,
+              initial_state='SubstitutionDef', blank_finish=blank_finish)
+        i = 0
+        for node in substitution_node[:]:
+            if not (isinstance(node, nodes.Inline) or
+                    isinstance(node, nodes.Text)):
+                self.parent += substitution_node[i]
+                del substitution_node[i]
+            else:
+                i += 1
+        for node in substitution_node.traverse(nodes.Element):
+            if self.disallowed_inside_substitution_definitions(node):
+                pformat = nodes.literal_block('', node.pformat().rstrip())
+                msg = self.reporter.error(
+                    'Substitution definition contains illegal element:',
+                    pformat, nodes.literal_block(blocktext, blocktext),
+                    source=src, line=srcline)
+                return [msg], blank_finish
+        if len(substitution_node) == 0:
+            msg = self.reporter.warning(
+                  'Substitution definition "%s" empty or invalid.' % subname,
+                  nodes.literal_block(blocktext, blocktext),
+                  source=src, line=srcline)
+            return [msg], blank_finish
+        self.document.note_substitution_def(
+            substitution_node, subname, self.parent)
+        return [substitution_node], blank_finish
+
+    def disallowed_inside_substitution_definitions(self, node):
+        if (node['ids'] or
+            isinstance(node, nodes.reference) and node.get('anonymous') or
+            isinstance(node, nodes.footnote_reference) and node.get('auto')):
+            return 1
+        else:
+            return 0
+
+    def directive(self, match, **option_presets):
+        """Returns a 2-tuple: list of nodes, and a "blank finish" boolean."""
+        type_name = match.group(1)
+        directive_class, messages = directives.directive(
+            type_name, self.memo.language, self.document)
+        self.parent += messages
+        if directive_class:
+            return self.run_directive(
+                directive_class, match, type_name, option_presets)
+        else:
+            return self.unknown_directive(type_name)
+
+    def run_directive(self, directive, match, type_name, option_presets):
+        """
+        Parse a directive then run its directive function.
+
+        Parameters:
+
+        - `directive`: The class implementing the directive.  Must be
+          a subclass of `rst.Directive`.
+
+        - `match`: A regular expression match object which matched the first
+          line of the directive.
+
+        - `type_name`: The directive name, as used in the source text.
+
+        - `option_presets`: A dictionary of preset options, defaults for the
+          directive options.  Currently, only an "alt" option is passed by
+          substitution definitions (value: the substitution name), which may
+          be used by an embedded image directive.
+
+        Returns a 2-tuple: list of nodes, and a "blank finish" boolean.
+        """
+        if isinstance(directive, (FunctionType, MethodType)):
+            from docutils.parsers.rst import convert_directive_function
+            directive = convert_directive_function(directive)
+        lineno = self.state_machine.abs_line_number()
+        initial_line_offset = self.state_machine.line_offset
+        indented, indent, line_offset, blank_finish \
+                  = self.state_machine.get_first_known_indented(match.end(),
+                                                                strip_top=0)
+        block_text = '\n'.join(self.state_machine.input_lines[
+            initial_line_offset : self.state_machine.line_offset + 1])
+        try:
+            arguments, options, content, content_offset = (
+                self.parse_directive_block(indented, line_offset,
+                                           directive, option_presets))
+        except MarkupError, detail:
+            error = self.reporter.error(
+                'Error in "%s" directive:\n%s.' % (type_name,
+                                                   ' '.join(detail.args)),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error], blank_finish
+        directive_instance = directive(
+            type_name, arguments, options, content, lineno,
+            content_offset, block_text, self, self.state_machine)
+        try:
+            result = directive_instance.run()
+        except docutils.parsers.rst.DirectiveError, error:
+            msg_node = self.reporter.system_message(error.level, error.msg,
+                                                    line=lineno)
+            msg_node += nodes.literal_block(block_text, block_text)
+            result = [msg_node]
+        assert isinstance(result, list), \
+               'Directive "%s" must return a list of nodes.' % type_name
+        for i in range(len(result)):
+            assert isinstance(result[i], nodes.Node), \
+                   ('Directive "%s" returned non-Node object (index %s): %r'
+                    % (type_name, i, result[i]))
+        return (result,
+                blank_finish or self.state_machine.is_next_line_blank())
+
+    def parse_directive_block(self, indented, line_offset, directive,
+                              option_presets):
+        option_spec = directive.option_spec
+        has_content = directive.has_content
+        if indented and not indented[0].strip():
+            indented.trim_start()
+            line_offset += 1
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if indented and (directive.required_arguments
+                         or directive.optional_arguments
+                         or option_spec):
+            for i, line in enumerate(indented):
+                if not line.strip():
+                    break
+            else:
+                i += 1
+            arg_block = indented[:i]
+            content = indented[i+1:]
+            content_offset = line_offset + i + 1
+        else:
+            content = indented
+            content_offset = line_offset
+            arg_block = []
+        if option_spec:
+            options, arg_block = self.parse_directive_options(
+                option_presets, option_spec, arg_block)
+        else:
+            options = {}
+        if arg_block and not (directive.required_arguments
+                              or directive.optional_arguments):
+            content = arg_block + indented[i:]
+            content_offset = line_offset
+            arg_block = []
+        while content and not content[0].strip():
+            content.trim_start()
+            content_offset += 1
+        if directive.required_arguments or directive.optional_arguments:
+            arguments = self.parse_directive_arguments(
+                directive, arg_block)
+        else:
+            arguments = []
+        if content and not has_content:
+            raise MarkupError('no content permitted')
+        return (arguments, options, content, content_offset)
+
+    def parse_directive_options(self, option_presets, option_spec, arg_block):
+        options = option_presets.copy()
+        for i, line in enumerate(arg_block):
+            if re.match(Body.patterns['field_marker'], line):
+                opt_block = arg_block[i:]
+                arg_block = arg_block[:i]
+                break
+        else:
+            opt_block = []
+        if opt_block:
+            success, data = self.parse_extension_options(option_spec,
+                                                         opt_block)
+            if success:                 # data is a dict of options
+                options.update(data)
+            else:                       # data is an error string
+                raise MarkupError(data)
+        return options, arg_block
+
+    def parse_directive_arguments(self, directive, arg_block):
+        required = directive.required_arguments
+        optional = directive.optional_arguments
+        arg_text = '\n'.join(arg_block)
+        arguments = arg_text.split()
+        if len(arguments) < required:
+            raise MarkupError('%s argument(s) required, %s supplied'
+                              % (required, len(arguments)))
+        elif len(arguments) > required + optional:
+            if directive.final_argument_whitespace:
+                arguments = arg_text.split(None, required + optional - 1)
+            else:
+                raise MarkupError(
+                    'maximum %s argument(s) allowed, %s supplied'
+                    % (required + optional, len(arguments)))
+        return arguments
+
+    def parse_extension_options(self, option_spec, datalines):
+        """
+        Parse `datalines` for a field list containing extension options
+        matching `option_spec`.
+
+        :Parameters:
+            - `option_spec`: a mapping of option name to conversion
+              function, which should raise an exception on bad input.
+            - `datalines`: a list of input strings.
+
+        :Return:
+            - Success value, 1 or 0.
+            - An option dictionary on success, an error string on failure.
+        """
+        node = nodes.field_list()
+        newline_offset, blank_finish = self.nested_list_parse(
+              datalines, 0, node, initial_state='ExtensionOptions',
+              blank_finish=True)
+        if newline_offset != len(datalines): # incomplete parse of block
+            return 0, 'invalid option block'
+        try:
+            options = utils.extract_extension_options(node, option_spec)
+        except KeyError, detail:
+            return 0, ('unknown option: "%s"' % detail.args[0])
+        except (ValueError, TypeError), detail:
+            return 0, ('invalid option value: %s' % ' '.join(detail.args))
+        except utils.ExtensionOptionError, detail:
+            return 0, ('invalid option data: %s' % ' '.join(detail.args))
+        if blank_finish:
+            return 1, options
+        else:
+            return 0, 'option data incompletely parsed'
+
+    def unknown_directive(self, type_name):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+            self.state_machine.get_first_known_indented(0, strip_indent=False)
+        text = '\n'.join(indented)
+        error = self.reporter.error(
+              'Unknown directive type "%s".' % type_name,
+              nodes.literal_block(text, text), line=lineno)
+        return [error], blank_finish
+
+    def comment(self, match):
+        if not match.string[match.end():].strip() \
+              and self.state_machine.is_next_line_blank(): # an empty comment?
+            return [nodes.comment()], 1 # "A tiny but practical wart."
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        text = '\n'.join(indented)
+        return [nodes.comment(text, text)], blank_finish
+
+    explicit.constructs = [
+          (footnote,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[
+                      (                 # footnote label:
+                          [0-9]+          # manually numbered footnote
+                        |               # *OR*
+                          \#              # anonymous auto-numbered footnote
+                        |               # *OR*
+                          \#%s            # auto-number ed?) footnote label
+                        |               # *OR*
+                          \*              # auto-symbol footnote
+                      )
+                      \]
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (citation,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[(%s)\]          # citation label
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (hyperlink_target,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      _                 # target indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE | re.UNICODE)),
+          (substitution_def,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \|                # substitution indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE | re.UNICODE)),
+          (directive,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      (%s)              # directive name
+                      [ ]?              # optional space
+                      ::                # directive delimiter
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE))]
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def explicit_construct(self, match):
+        """Determine which explicit construct this is, parse & return it."""
+        errors = []
+        for method, pattern in self.explicit.constructs:
+            expmatch = pattern.match(match.string)
+            if expmatch:
+                try:
+                    return method(self, expmatch)
+                except MarkupError, error:
+                    lineno = self.state_machine.abs_line_number()
+                    message = ' '.join(error.args)
+                    errors.append(self.reporter.warning(message, line=lineno))
+                    break
+        nodelist, blank_finish = self.comment(match)
+        return nodelist + errors, blank_finish
+
+    def explicit_list(self, blank_finish):
+        """
+        Create a nested state machine for a series of explicit markup
+        constructs (including anonymous hyperlink targets).
+        """
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=self.parent, initial_state='Explicit',
+              blank_finish=blank_finish,
+              match_titles=self.state_machine.match_titles)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Explicit markup')
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def anonymous_target(self, match):
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish \
+            = self.state_machine.get_first_known_indented(match.end(),
+                                                        until_blank=True)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        target = self.make_target(block, blocktext, lineno, '')
+        return [target], blank_finish
+
+    def line(self, match, context, next_state):
+        """Section title overline or transition marker."""
+        if self.state_machine.match_titles:
+            return [match.string], 'Line', []
+        elif match.string.strip() == '::':
+            raise statemachine.TransitionCorrection('text')
+        elif len(match.string.strip()) < 4:
+            msg = self.reporter.info(
+                'Unexpected possible title overline or transition.\n'
+                "Treating it as ordinary text because it's so short.",
+                line=self.state_machine.abs_line_number())
+            self.parent += msg
+            raise statemachine.TransitionCorrection('text')
+        else:
+            blocktext = self.state_machine.line
+            msg = self.reporter.severe(
+                  'Unexpected section title or transition.',
+                  nodes.literal_block(blocktext, blocktext),
+                  line=self.state_machine.abs_line_number())
+            self.parent += msg
+            return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Titles, definition lists, paragraphs."""
+        return [match.string], 'Text', []
+
+
+class RFC2822Body(Body):
+
+    """
+    RFC2822 headers are only valid as the first constructs in documents.  As
+    soon as anything else appears, the `Body` state should take over.
+    """
+
+    patterns = Body.patterns.copy()     # can't modify the original
+    patterns['rfc2822'] = r'[!-9;-~]+:( +|$)'
+    initial_transitions = [(name, 'Body')
+                           for name in Body.initial_transitions]
+    initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text'
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        fieldlist = nodes.field_list(classes=['rfc2822'])
+        self.parent += fieldlist
+        field, blank_finish = self.rfc2822_field(match)
+        fieldlist += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=fieldlist, initial_state='RFC2822List',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning(
+                  'RFC2822-style field list')
+        return [], next_state, []
+
+    def rfc2822_field(self, match):
+        name = match.string[:match.string.find(':')]
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=True)
+        fieldnode = nodes.field()
+        fieldnode += nodes.field_name(name, name)
+        fieldbody = nodes.field_body('\n'.join(indented))
+        fieldnode += fieldbody
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=fieldbody)
+        return fieldnode, blank_finish
+
+
+class SpecializedBody(Body):
+
+    """
+    Superclass for second and subsequent compound element members.  Compound
+    elements are lists and list-like constructs.
+
+    All transition methods are disabled (redefined as `invalid_input`).
+    Override individual methods in subclasses to re-enable.
+
+    For example, once an initial bullet list item, say, is recognized, the
+    `BulletList` subclass takes over, with a "bullet_list" node as its
+    container.  Upon encountering the initial bullet list item, `Body.bullet`
+    calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which
+    starts up a nested parsing session with `BulletList` as the initial state.
+    Only the ``bullet`` transition method is enabled in `BulletList`; as long
+    as only bullet list items are encountered, they are parsed and inserted
+    into the container.  The first construct which is *not* a bullet list item
+    triggers the `invalid_input` method, which ends the nested parse and
+    closes the container.  `BulletList` needs to recognize input that is
+    invalid in the context of a bullet list, which means everything *other
+    than* bullet list items, so it inherits the transition list created in
+    `Body`.
+    """
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        self.state_machine.previous_line() # back up so parent SM can reassess
+        raise EOFError
+
+    indent = invalid_input
+    bullet = invalid_input
+    enumerator = invalid_input
+    field_marker = invalid_input
+    option_marker = invalid_input
+    doctest = invalid_input
+    line_block = invalid_input
+    grid_table_top = invalid_input
+    simple_table_top = invalid_input
+    explicit_markup = invalid_input
+    anonymous = invalid_input
+    line = invalid_input
+    text = invalid_input
+
+
+class BulletList(SpecializedBody):
+
+    """Second and subsequent bullet_list list_items."""
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        if match.string[0] != self.parent['bullet']:
+            # different bullet: new list
+            self.invalid_input()
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class DefinitionList(SpecializedBody):
+
+    """Second and subsequent definition_list_items."""
+
+    def text(self, match, context, next_state):
+        """Definition lists."""
+        return [match.string], 'Definition', []
+
+
+class EnumeratedList(SpecializedBody):
+
+    """Second and subsequent enumerated_list list_items."""
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated list item."""
+        format, sequence, text, ordinal = self.parse_enumerator(
+              match, self.parent['enumtype'])
+        if ( format != self.format
+             or (sequence != '#' and (sequence != self.parent['enumtype']
+                                      or self.auto
+                                      or ordinal != (self.lastordinal + 1)))
+             or not self.is_enumerated_list_item(ordinal, sequence, format)):
+            # different enumeration: new list
+            self.invalid_input()
+        if sequence == '#':
+            self.auto = 1
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        self.lastordinal = ordinal
+        return [], next_state, []
+
+
+class FieldList(SpecializedBody):
+
+    """Second and subsequent field_list fields."""
+
+    def field_marker(self, match, context, next_state):
+        """Field list field."""
+        field, blank_finish = self.field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class OptionList(SpecializedBody):
+
+    """Second and subsequent option_list option_list_items."""
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        try:
+            option_list_item, blank_finish = self.option_list_item(match)
+        except MarkupError:
+            self.invalid_input()
+        self.parent += option_list_item
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class RFC2822List(SpecializedBody, RFC2822Body):
+
+    """Second and subsequent RFC2822-style field_list fields."""
+
+    patterns = RFC2822Body.patterns
+    initial_transitions = RFC2822Body.initial_transitions
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        field, blank_finish = self.rfc2822_field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], 'RFC2822List', []
+
+    blank = SpecializedBody.invalid_input
+
+
+class ExtensionOptions(FieldList):
+
+    """
+    Parse field_list fields for extension options.
+
+    No nested parsing is done (including inline markup parsing).
+    """
+
+    def parse_field_body(self, indented, offset, node):
+        """Override `Body.parse_field_body` for simpler parsing."""
+        lines = []
+        for line in list(indented) + ['']:
+            if line.strip():
+                lines.append(line)
+            elif lines:
+                text = '\n'.join(lines)
+                node += nodes.paragraph(text, text)
+                lines = []
+
+
+class LineBlock(SpecializedBody):
+
+    """Second and subsequent lines of a line_block."""
+
+    blank = SpecializedBody.invalid_input
+
+    def line_block(self, match, context, next_state):
+        """New line of line block."""
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        self.parent += line
+        self.parent.parent += messages
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class Explicit(SpecializedBody):
+
+    """Second and subsequent explicit markup construct."""
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    blank = SpecializedBody.invalid_input
+
+
+class SubstitutionDef(Body):
+
+    """
+    Parser for the contents of a substitution_definition element.
+    """
+
+    patterns = {
+          'embedded_directive': re.compile(r'(%s)::( +|$)'
+                                           % Inliner.simplename, re.UNICODE),
+          'text': r''}
+    initial_transitions = ['embedded_directive', 'text']
+
+    def embedded_directive(self, match, context, next_state):
+        nodelist, blank_finish = self.directive(match,
+                                                alt=self.parent['names'][0])
+        self.parent += nodelist
+        if not self.state_machine.at_eof():
+            self.blank_finish = blank_finish
+        raise EOFError
+
+    def text(self, match, context, next_state):
+        if not self.state_machine.at_eof():
+            self.blank_finish = self.state_machine.is_next_line_blank()
+        raise EOFError
+
+
+class Text(RSTState):
+
+    """
+    Classifier of second line of a text block.
+
+    Could be a paragraph, a definition list item, or a title.
+    """
+
+    patterns = {'underline': Body.patterns['line'],
+                'text': r''}
+    initial_transitions = [('underline', 'Body'), ('text', 'Body')]
+
+    def blank(self, match, context, next_state):
+        """End of paragraph."""
+        # NOTE: self.paragraph returns [ node, system_message(s) ], literalnext
+        paragraph, literalnext = self.paragraph(
+              context, self.state_machine.abs_line_number() - 1)
+        self.parent += paragraph
+        if literalnext:
+            self.parent += self.literal_block()
+        return [], 'Body', []
+
+    def eof(self, context):
+        if context:
+            self.blank(None, context, None)
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlist = nodes.definition_list()
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        definitionlist += definitionlistitem
+        self.parent += definitionlist
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=definitionlist, initial_state='DefinitionList',
+              blank_finish=blank_finish, blank_finish_state='Definition')
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Definition list')
+        return [], 'Body', []
+
+    def underline(self, match, context, next_state):
+        """Section title."""
+        lineno = self.state_machine.abs_line_number()
+        title = context[0].rstrip()
+        underline = match.string.rstrip()
+        source = title + '\n' + underline
+        messages = []
+        if column_width(title) > len(underline):
+            if len(underline) < 4:
+                if self.state_machine.match_titles:
+                    msg = self.reporter.info(
+                        'Possible title underline, too short for the title.\n'
+                        "Treating it as ordinary text because it's so short.",
+                        line=lineno)
+                    self.parent += msg
+                raise statemachine.TransitionCorrection('text')
+            else:
+                blocktext = context[0] + '\n' + self.state_machine.line
+                msg = self.reporter.warning('Title underline too short.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                messages.append(msg)
+        if not self.state_machine.match_titles:
+            blocktext = context[0] + '\n' + self.state_machine.line
+            # We need get_source_and_line() here to report correctly
+            src, srcline = self.state_machine.get_source_and_line()
+            # TODO: why is abs_line_number() == srcline+1
+            # if the error is in a table (try with test_tables.py)?
+            # print "get_source_and_line", srcline
+            # print "abs_line_number", self.state_machine.abs_line_number()
+            msg = self.reporter.severe('Unexpected section title.',
+                nodes.literal_block(blocktext, blocktext),
+                source=src, line=srcline)
+            self.parent += messages
+            self.parent += msg
+            return [], next_state, []
+        style = underline[0]
+        context[:] = []
+        self.section(title, source, style, lineno - 1, messages)
+        return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Paragraph."""
+        startline = self.state_machine.abs_line_number() - 1
+        msg = None
+        try:
+            block = self.state_machine.get_text_block(flush_left=True)
+        except statemachine.UnexpectedIndentationError, err:
+            block, src, srcline = err.args
+            msg = self.reporter.error('Unexpected indentation.',
+                                      source=src, line=srcline)
+        lines = context + list(block)
+        paragraph, literalnext = self.paragraph(lines, startline)
+        self.parent += paragraph
+        self.parent += msg
+        if literalnext:
+            try:
+                self.state_machine.next_line()
+            except EOFError:
+                pass
+            self.parent += self.literal_block()
+        return [], next_state, []
+
+    def literal_block(self):
+        """Return a list of nodes."""
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_indented()
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if not indented:
+            return self.quoted_literal_block()
+        data = '\n'.join(indented)
+        literal_block = nodes.literal_block(data, data)
+        literal_block.line = offset + 1
+        nodelist = [literal_block]
+        if not blank_finish:
+            nodelist.append(self.unindent_warning('Literal block'))
+        return nodelist
+
+    def quoted_literal_block(self):
+        abs_line_offset = self.state_machine.abs_line_offset()
+        offset = self.state_machine.line_offset
+        parent_node = nodes.Element()
+        new_abs_offset = self.nested_parse(
+            self.state_machine.input_lines[offset:],
+            input_offset=abs_line_offset, node=parent_node, match_titles=False,
+            state_machine_kwargs={'state_classes': (QuotedLiteralBlock,),
+                                  'initial_state': 'QuotedLiteralBlock'})
+        self.goto_line(new_abs_offset)
+        return parent_node.children
+
+    def definition_list_item(self, termline):
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        itemnode = nodes.definition_list_item(
+            '\n'.join(termline + list(indented)))
+        lineno = self.state_machine.abs_line_number() - 1
+        (itemnode.source,
+         itemnode.line) = self.state_machine.get_source_and_line(lineno)
+        termlist, messages = self.term(termline, lineno)
+        itemnode += termlist
+        definition = nodes.definition('', *messages)
+        itemnode += definition
+        if termline[0][-2:] == '::':
+            definition += self.reporter.info(
+                  'Blank line missing before literal block (after the "::")? '
+                  'Interpreted as a definition list item.',
+                  line=lineno+1)
+        self.nested_parse(indented, input_offset=line_offset, node=definition)
+        return itemnode, blank_finish
+
+    classifier_delimiter = re.compile(' +: +')
+
+    def term(self, lines, lineno):
+        """Return a definition_list's term and optional classifiers."""
+        assert len(lines) == 1
+        text_nodes, messages = self.inline_text(lines[0], lineno)
+        term_node = nodes.term()
+        (term_node.source,
+         term_node.line) = self.state_machine.get_source_and_line(lineno)
+        term_node.rawsource = unescape(lines[0])
+        node_list = [term_node]
+        for i in range(len(text_nodes)):
+            node = text_nodes[i]
+            if isinstance(node, nodes.Text):
+                parts = self.classifier_delimiter.split(node.rawsource)
+                if len(parts) == 1:
+                    node_list[-1] += node
+                else:
+
+                    node_list[-1] += nodes.Text(parts[0].rstrip())
+                    for part in parts[1:]:
+                        classifier_node = nodes.classifier('', part)
+                        node_list.append(classifier_node)
+            else:
+                node_list[-1] += node
+        return node_list, messages
+
+
+class SpecializedText(Text):
+
+    """
+    Superclass for second and subsequent lines of Text-variants.
+
+    All transition methods are disabled. Override individual methods in
+    subclasses to re-enable.
+    """
+
+    def eof(self, context):
+        """Incomplete construct."""
+        return []
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        raise EOFError
+
+    blank = invalid_input
+    indent = invalid_input
+    underline = invalid_input
+    text = invalid_input
+
+
+class Definition(SpecializedText):
+
+    """Second line of potential definition_list_item."""
+
+    def eof(self, context):
+        """Not a definition."""
+        self.state_machine.previous_line(2) # so parent SM can reassess
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        itemnode, blank_finish = self.definition_list_item(context)
+        self.parent += itemnode
+        self.blank_finish = blank_finish
+        return [], 'DefinitionList', []
+
+
+class Line(SpecializedText):
+
+    """
+    Second line of over- & underlined section title or transition marker.
+    """
+
+    eofcheck = 1                        # @@@ ???
+    """Set to 0 while parsing sections, so that we don't catch the EOF."""
+
+    def eof(self, context):
+        """Transition marker at end of section or document."""
+        marker = context[0].strip()
+        if self.memo.section_bubble_up_kludge:
+            self.memo.section_bubble_up_kludge = False
+        elif len(marker) < 4:
+            self.state_correction(context)
+        if self.eofcheck:               # ignore EOFError with sections
+            lineno = self.state_machine.abs_line_number() - 1
+            transition = nodes.transition(rawsource=context[0])
+            transition.line = lineno
+            self.parent += transition
+        self.eofcheck = 1
+        return []
+
+    def blank(self, match, context, next_state):
+        """Transition marker."""
+        src, srcline = self.state_machine.get_source_and_line()
+        marker = context[0].strip()
+        if len(marker) < 4:
+            self.state_correction(context)
+        transition = nodes.transition(rawsource=marker)
+        transition.source = src
+        transition.line = srcline - 1
+        self.parent += transition
+        return [], 'Body', []
+
+    def text(self, match, context, next_state):
+        """Potential over- & underlined title."""
+        lineno = self.state_machine.abs_line_number() - 1
+        overline = context[0]
+        title = match.string
+        underline = ''
+        try:
+            underline = self.state_machine.next_line()
+        except EOFError:
+            blocktext = overline + '\n' + title
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Incomplete section title.',
+                    nodes.literal_block(blocktext, blocktext),
+                    line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        source = '%s\n%s\n%s' % (overline, title, underline)
+        overline = overline.rstrip()
+        underline = underline.rstrip()
+        if not self.transitions['underline'][0].match(underline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Missing matching underline for section title overline.',
+                    nodes.literal_block(source, source),
+                    line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        elif overline != underline:
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                      'Title overline & underline mismatch.',
+                      nodes.literal_block(source, source),
+                      line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        title = title.rstrip()
+        messages = []
+        if column_width(title) > len(overline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.warning(
+                      'Title overline too short.',
+                      nodes.literal_block(source, source),
+                      line=lineno)
+                messages.append(msg)
+        style = (overline[0], underline[0])
+        self.eofcheck = 0               # @@@ not sure this is correct
+        self.section(title.lstrip(), source, style, lineno + 1, messages)
+        self.eofcheck = 1
+        return [], 'Body', []
+
+    indent = text                       # indented title
+
+    def underline(self, match, context, next_state):
+        overline = context[0]
+        blocktext = overline + '\n' + self.state_machine.line
+        lineno = self.state_machine.abs_line_number() - 1
+        if len(overline.rstrip()) < 4:
+            self.short_overline(context, blocktext, lineno, 1)
+        msg = self.reporter.error(
+              'Invalid section title or transition marker.',
+              nodes.literal_block(blocktext, blocktext),
+              line=lineno)
+        self.parent += msg
+        return [], 'Body', []
+
+    def short_overline(self, context, blocktext, lineno, lines=1):
+        msg = self.reporter.info(
+            'Possible incomplete section title.\nTreating the overline as '
+            "ordinary text because it's so short.",
+            line=lineno)
+        self.parent += msg
+        self.state_correction(context, lines)
+
+    def state_correction(self, context, lines=1):
+        self.state_machine.previous_line(lines)
+        context[:] = []
+        raise statemachine.StateCorrection('Body', 'text')
+
+
+class QuotedLiteralBlock(RSTState):
+
+    """
+    Nested parse handler for quoted (unindented) literal blocks.
+
+    Special-purpose.  Not for inclusion in `state_classes`.
+    """
+
+    patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats,
+                'text': r''}
+    initial_transitions = ('initial_quoted', 'text')
+
+    def __init__(self, state_machine, debug=False):
+        RSTState.__init__(self, state_machine, debug)
+        self.messages = []
+        self.initial_lineno = None
+
+    def blank(self, match, context, next_state):
+        if context:
+            raise EOFError
+        else:
+            return context, next_state, []
+
+    def eof(self, context):
+        if context:
+            src, srcline = self.state_machine.get_source_and_line(
+                                                        self.initial_lineno)
+            text = '\n'.join(context)
+            literal_block = nodes.literal_block(text, text)
+            literal_block.source = src
+            literal_block.line = srcline
+            self.parent += literal_block
+        else:
+            self.parent += self.reporter.warning(
+                'Literal block expected; none found.',
+                line=self.state_machine.abs_line_number())
+                # src not available, because statemachine.input_lines is empty
+            self.state_machine.previous_line()
+        self.parent += self.messages
+        return []
+
+    def indent(self, match, context, next_state):
+        assert context, ('QuotedLiteralBlock.indent: context should not '
+                         'be empty!')
+        self.messages.append(
+            self.reporter.error('Unexpected indentation.',
+                                line=self.state_machine.abs_line_number()))
+        self.state_machine.previous_line()
+        raise EOFError
+
+    def initial_quoted(self, match, context, next_state):
+        """Match arbitrary quote character on the first line only."""
+        self.remove_transition('initial_quoted')
+        quote = match.string[0]
+        pattern = re.compile(re.escape(quote), re.UNICODE)
+        # New transition matches consistent quotes only:
+        self.add_transition('quoted',
+                            (pattern, self.quoted, self.__class__.__name__))
+        self.initial_lineno = self.state_machine.abs_line_number()
+        return [match.string], next_state, []
+
+    def quoted(self, match, context, next_state):
+        """Match consistent quotes on subsequent lines."""
+        context.append(match.string)
+        return context, next_state, []
+
+    def text(self, match, context, next_state):
+        if context:
+            self.messages.append(
+                self.reporter.error('Inconsistent literal block quoting.',
+                                   line=self.state_machine.abs_line_number()))
+            self.state_machine.previous_line()
+        raise EOFError
+
+
+state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList,
+                 OptionList, LineBlock, ExtensionOptions, Explicit, Text,
+                 Definition, Line, SubstitutionDef, RFC2822Body, RFC2822List)
+"""Standard set of State classes used to start `RSTStateMachine`."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/roles.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/roles.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/roles.py	(revision 1126)
@@ -0,0 +1,394 @@
+# $Id: roles.py 7937 2016-05-24 10:48:48Z milde $
+# Author: Edward Loper <edloper@gradient.cis.upenn.edu>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines standard interpreted text role functions, a registry for
+interpreted text roles, and an API for adding to and retrieving from the
+registry.
+
+The interface for interpreted role functions is as follows::
+
+    def role_fn(name, rawtext, text, lineno, inliner,
+                options={}, content=[]):
+        code...
+
+    # Set function attributes for customization:
+    role_fn.options = ...
+    role_fn.content = ...
+
+Parameters:
+
+- ``name`` is the local name of the interpreted text role, the role name
+  actually used in the document.
+
+- ``rawtext`` is a string containing the entire interpreted text construct.
+  Return it as a ``problematic`` node linked to a system message if there is a
+  problem.
+
+- ``text`` is the interpreted text content, with backslash escapes converted
+  to nulls (``\x00``).
+
+- ``lineno`` is the line number where the interpreted text beings.
+
+- ``inliner`` is the Inliner object that called the role function.
+  It defines the following useful attributes: ``reporter``,
+  ``problematic``, ``memo``, ``parent``, ``document``.
+
+- ``options``: A dictionary of directive options for customization, to be
+  interpreted by the role function.  Used for additional attributes for the
+  generated elements and other functionality.
+
+- ``content``: A list of strings, the directive content for customization
+  ("role" directive).  To be interpreted by the role function.
+
+Function attributes for customization, interpreted by the "role" directive:
+
+- ``options``: A dictionary, mapping known option names to conversion
+  functions such as `int` or `float`.  ``None`` or an empty dict implies no
+  options to parse.  Several directive option conversion functions are defined
+  in the `directives` module.
+
+  All role functions implicitly support the "class" option, unless disabled
+  with an explicit ``{'class': None}``.
+
+- ``content``: A boolean; true if content is allowed.  Client code must handle
+  the case where content is required but not supplied (an empty content list
+  will be supplied).
+
+Note that unlike directives, the "arguments" function attribute is not
+supported for role customization.  Directive arguments are handled by the
+"role" directive itself.
+
+Interpreted role functions return a tuple of two values:
+
+- A list of nodes which will be inserted into the document tree at the
+  point where the interpreted role was encountered (can be an empty
+  list).
+
+- A list of system messages, which will be inserted into the document tree
+  immediately after the end of the current inline block (can also be empty).
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.languages import en as _fallback_language_module
+from docutils.utils.code_analyzer import Lexer, LexerError
+
+DEFAULT_INTERPRETED_ROLE = 'title-reference'
+"""
+The canonical name of the default interpreted role.  This role is used
+when no role is specified for a piece of interpreted text.
+"""
+
+_role_registry = {}
+"""Mapping of canonical role names to role functions.  Language-dependent role
+names are defined in the ``language`` subpackage."""
+
+_roles = {}
+"""Mapping of local or language-dependent interpreted text role names to role
+functions."""
+
+def role(role_name, language_module, lineno, reporter):
+    """
+    Locate and return a role function from its language-dependent name, along
+    with a list of system messages.  If the role is not found in the current
+    language, check English.  Return a 2-tuple: role function (``None`` if the
+    named role cannot be found) and a list of system messages.
+    """
+    normname = role_name.lower()
+    messages = []
+    msg_text = []
+
+    if normname in _roles:
+        return _roles[normname], messages
+
+    if role_name:
+        canonicalname = None
+        try:
+            canonicalname = language_module.roles[normname]
+        except AttributeError, error:
+            msg_text.append('Problem retrieving role entry from language '
+                            'module %r: %s.' % (language_module, error))
+        except KeyError:
+            msg_text.append('No role entry for "%s" in module "%s".'
+                            % (role_name, language_module.__name__))
+    else:
+        canonicalname = DEFAULT_INTERPRETED_ROLE
+
+    # If we didn't find it, try English as a fallback.
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.roles[normname]
+            msg_text.append('Using English fallback for role "%s".'
+                            % role_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical role name.'
+                            % role_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+
+    # Collect any messages that we generated.
+    if msg_text:
+        message = reporter.info('\n'.join(msg_text), line=lineno)
+        messages.append(message)
+
+    # Look the role up in the registry, and return it.
+    if canonicalname in _role_registry:
+        role_fn = _role_registry[canonicalname]
+        register_local_role(normname, role_fn)
+        return role_fn, messages
+    else:
+        return None, messages # Error message will be generated by caller.
+
+def register_canonical_role(name, role_fn):
+    """
+    Register an interpreted text role by its canonical name.
+
+    :Parameters:
+      - `name`: The canonical name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _role_registry[name] = role_fn
+
+def register_local_role(name, role_fn):
+    """
+    Register an interpreted text role by its local or language-dependent name.
+
+    :Parameters:
+      - `name`: The local or language-dependent name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _roles[name] = role_fn
+
+def set_implicit_options(role_fn):
+    """
+    Add customization options to role functions, unless explicitly set or
+    disabled.
+    """
+    if not hasattr(role_fn, 'options') or role_fn.options is None:
+        role_fn.options = {'class': directives.class_option}
+    elif 'class' not in role_fn.options:
+        role_fn.options['class'] = directives.class_option
+
+def register_generic_role(canonical_name, node_class):
+    """For roles which simply wrap a given `node_class` around the text."""
+    role = GenericRole(canonical_name, node_class)
+    register_canonical_role(canonical_name, role)
+
+
+class GenericRole:
+
+    """
+    Generic interpreted text role, where the interpreted text is simply
+    wrapped with the provided node class.
+    """
+
+    def __init__(self, role_name, node_class):
+        self.name = role_name
+        self.node_class = node_class
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        set_classes(options)
+        return [self.node_class(rawtext, utils.unescape(text), **options)], []
+
+
+class CustomRole:
+
+    """
+    Wrapper for custom interpreted text roles.
+    """
+
+    def __init__(self, role_name, base_role, options={}, content=[]):
+        self.name = role_name
+        self.base_role = base_role
+        self.options = None
+        if hasattr(base_role, 'options'):
+            self.options = base_role.options
+        self.content = None
+        if hasattr(base_role, 'content'):
+            self.content = base_role.content
+        self.supplied_options = options
+        self.supplied_content = content
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        opts = self.supplied_options.copy()
+        opts.update(options)
+        cont = list(self.supplied_content)
+        if cont and content:
+            cont += '\n'
+        cont.extend(content)
+        return self.base_role(role, rawtext, text, lineno, inliner,
+                              options=opts, content=cont)
+
+
+def generic_custom_role(role, rawtext, text, lineno, inliner,
+                        options={}, content=[]):
+    """"""
+    # Once nested inline markup is implemented, this and other methods should
+    # recursively call inliner.nested_parse().
+    set_classes(options)
+    return [nodes.inline(rawtext, utils.unescape(text), **options)], []
+
+generic_custom_role.options = {'class': directives.class_option}
+
+
+######################################################################
+# Define and register the standard roles:
+######################################################################
+
+register_generic_role('abbreviation', nodes.abbreviation)
+register_generic_role('acronym', nodes.acronym)
+register_generic_role('emphasis', nodes.emphasis)
+register_generic_role('literal', nodes.literal)
+register_generic_role('strong', nodes.strong)
+register_generic_role('subscript', nodes.subscript)
+register_generic_role('superscript', nodes.superscript)
+register_generic_role('title-reference', nodes.title_reference)
+
+def pep_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        pepnum = int(text)
+        if pepnum < 0 or pepnum > 9999:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'PEP number must be a number from 0 to 9999; "%s" is invalid.'
+            % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.pep_reference; so this is correct:
+    ref = (inliner.document.settings.pep_base_url
+           + inliner.document.settings.pep_file_url_template % pepnum)
+    set_classes(options)
+    return [nodes.reference(rawtext, 'PEP ' + utils.unescape(text), refuri=ref,
+                            **options)], []
+
+register_canonical_role('pep-reference', pep_reference_role)
+
+def rfc_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        rfcnum = int(text)
+        if rfcnum <= 0:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'RFC number must be a number greater than or equal to 1; '
+            '"%s" is invalid.' % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.rfc_reference, so this is correct:
+    ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+    set_classes(options)
+    node = nodes.reference(rawtext, 'RFC ' + utils.unescape(text), refuri=ref,
+                           **options)
+    return [node], []
+
+register_canonical_role('rfc-reference', rfc_reference_role)
+
+def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    if not inliner.document.settings.raw_enabled:
+        msg = inliner.reporter.warning('raw (and derived) roles disabled')
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    if 'format' not in options:
+        msg = inliner.reporter.error(
+            'No format (Writer name) is associated with this role: "%s".\n'
+            'The "raw" role cannot be used directly.\n'
+            'Instead, use the "role" directive to create a new role with '
+            'an associated format.' % role, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    set_classes(options)
+    node = nodes.raw(rawtext, utils.unescape(text, 1), **options)
+    node.source, node.line = inliner.reporter.get_source_and_line(lineno)
+    return [node], []
+
+raw_role.options = {'format': directives.unchanged}
+
+register_canonical_role('raw', raw_role)
+
+def code_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    set_classes(options)
+    language = options.get('language', '')
+    classes = ['code']
+    if 'classes' in options:
+        classes.extend(options['classes'])
+    if language and language not in classes:
+        classes.append(language)
+    try:
+        tokens = Lexer(utils.unescape(text, 1), language,
+                       inliner.document.settings.syntax_highlight)
+    except LexerError, error:
+        msg = inliner.reporter.warning(error)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+
+    node = nodes.literal(rawtext, '', classes=classes)
+
+    # analyse content and add nodes for every token
+    for classes, value in tokens:
+        # print (classes, value)
+        if classes:
+            node += nodes.inline(value, value, classes=classes)
+        else:
+            # insert as Text to decrease the verbosity of the output
+            node += nodes.Text(value, value)
+
+    return [node], []
+
+code_role.options = {'class': directives.class_option,
+                     'language': directives.unchanged}
+
+register_canonical_role('code', code_role)
+
+def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    set_classes(options)
+    i = rawtext.find('`')
+    text = rawtext.split('`')[1]
+    node = nodes.math(rawtext, text, **options)
+    return [node], []
+
+register_canonical_role('math', math_role)
+
+######################################################################
+# Register roles that are currently unimplemented.
+######################################################################
+
+def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}):
+    msg = inliner.reporter.error(
+        'Interpreted text role "%s" not implemented.' % role, line=lineno)
+    prb = inliner.problematic(rawtext, rawtext, msg)
+    return [prb], [msg]
+
+register_canonical_role('index', unimplemented_role)
+register_canonical_role('named-reference', unimplemented_role)
+register_canonical_role('anonymous-reference', unimplemented_role)
+register_canonical_role('uri-reference', unimplemented_role)
+register_canonical_role('footnote-reference', unimplemented_role)
+register_canonical_role('citation-reference', unimplemented_role)
+register_canonical_role('substitution-reference', unimplemented_role)
+register_canonical_role('target', unimplemented_role)
+
+# This should remain unimplemented, for testing purposes:
+register_canonical_role('restructuredtext-unimplemented-role',
+                        unimplemented_role)
+
+
+def set_classes(options):
+    """
+    Auxiliary function to set options['classes'] and delete
+    options['class'].
+    """
+    if 'class' in options:
+        assert 'classes' not in options
+        options['classes'] = options['class']
+        del options['class']
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/tableparser.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/tableparser.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/tableparser.py	(revision 1126)
@@ -0,0 +1,544 @@
+# $Id: tableparser.py 7898 2015-05-29 20:49:28Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines table parser classes,which parse plaintext-graphic tables
+and produce a well-formed data structure suitable for building a CALS table.
+
+:Classes:
+    - `GridTableParser`: Parse fully-formed tables represented with a grid.
+    - `SimpleTableParser`: Parse simple tables, delimited by top & bottom
+      borders.
+
+:Exception class: `TableMarkupError`
+
+:Function:
+    `update_dict_of_lists()`: Merge two dictionaries containing list values.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import DataError
+from docutils.utils import strip_combining_chars
+
+
+class TableMarkupError(DataError):
+
+    """
+    Raise if there is any problem with table markup.
+
+    The keyword argument `offset` denotes the offset of the problem
+    from the table's start line.
+    """
+
+    def __init__(self, *args, **kwargs):
+            self.offset = kwargs.pop('offset', 0)
+            DataError.__init__(self, *args)
+
+
+class TableParser:
+
+    """
+    Abstract superclass for the common parts of the syntax-specific parsers.
+    """
+
+    head_body_separator_pat = None
+    """Matches the row separator between head rows and body rows."""
+
+    double_width_pad_char = '\x00'
+    """Padding character for East Asian double-width text."""
+
+    def parse(self, block):
+        """
+        Analyze the text `block` and return a table data structure.
+
+        Given a plaintext-graphic table in `block` (list of lines of text; no
+        whitespace padding), parse the table, construct and return the data
+        necessary to construct a CALS table or equivalent.
+
+        Raise `TableMarkupError` if there is any problem with the markup.
+        """
+        self.setup(block)
+        self.find_head_body_sep()
+        self.parse_table()
+        structure = self.structure_from_cells()
+        return structure
+
+    def find_head_body_sep(self):
+        """Look for a head/body row separator line; store the line index."""
+        for i in range(len(self.block)):
+            line = self.block[i]
+            if self.head_body_separator_pat.match(line):
+                if self.head_body_sep:
+                    raise TableMarkupError(
+                        'Multiple head/body row separators '
+                        '(table lines %s and %s); only one allowed.'
+                        % (self.head_body_sep+1, i+1), offset=i)
+                else:
+                    self.head_body_sep = i
+                    self.block[i] = line.replace('=', '-')
+        if self.head_body_sep == 0 or self.head_body_sep == (len(self.block)
+                                                             - 1):
+            raise TableMarkupError('The head/body row separator may not be '
+                                   'the first or last line of the table.',
+                                   offset=i)
+
+
+class GridTableParser(TableParser):
+
+    """
+    Parse a grid table using `parse()`.
+
+    Here's an example of a grid table::
+
+        +------------------------+------------+----------+----------+
+        | Header row, column 1   | Header 2   | Header 3 | Header 4 |
+        +========================+============+==========+==========+
+        | body row 1, column 1   | column 2   | column 3 | column 4 |
+        +------------------------+------------+----------+----------+
+        | body row 2             | Cells may span columns.          |
+        +------------------------+------------+---------------------+
+        | body row 3             | Cells may  | - Table cells       |
+        +------------------------+ span rows. | - contain           |
+        | body row 4             |            | - body elements.    |
+        +------------------------+------------+---------------------+
+
+    Intersections use '+', row separators use '-' (except for one optional
+    head/body row separator, which uses '='), and column separators use '|'.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure::
+
+        ([24, 12, 10, 10],
+         [[(0, 0, 1, ['Header row, column 1']),
+           (0, 0, 1, ['Header 2']),
+           (0, 0, 1, ['Header 3']),
+           (0, 0, 1, ['Header 4'])]],
+         [[(0, 0, 3, ['body row 1, column 1']),
+           (0, 0, 3, ['column 2']),
+           (0, 0, 3, ['column 3']),
+           (0, 0, 3, ['column 4'])],
+          [(0, 0, 5, ['body row 2']),
+           (0, 2, 5, ['Cells may span columns.']),
+           None,
+           None],
+          [(0, 0, 7, ['body row 3']),
+           (1, 0, 7, ['Cells may', 'span rows.', '']),
+           (1, 1, 7, ['- Table cells', '- contain', '- body elements.']),
+           None],
+          [(0, 0, 9, ['body row 4']), None, None, None]])
+
+    The first item is a list containing column widths (colspecs). The second
+    item is a list of head rows, and the third is a list of body rows. Each
+    row contains a list of cells. Each cell is either None (for a cell unused
+    because of another cell's span), or a tuple. A cell tuple contains four
+    items: the number of extra rows used by the cell in a vertical span
+    (morerows); the number of extra columns used by the cell in a horizontal
+    span (morecols); the line offset of the first line of the cell contents;
+    and the cell contents, a list of lines of text.
+    """
+
+    head_body_separator_pat = re.compile(r'\+=[=+]+=\+ *$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it may be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        self.bottom = len(block) - 1
+        self.right = len(block[0]) - 1
+        self.head_body_sep = None
+        self.done = [-1] * len(block[0])
+        self.cells = []
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        Start with a queue of upper-left corners, containing the upper-left
+        corner of the table itself. Trace out one rectangular cell, remember
+        it, and add its upper-right and lower-left corners to the queue of
+        potential upper-left corners of further cells. Process the queue in
+        top-to-bottom order, keeping track of how much of each text column has
+        been seen.
+
+        We'll end up knowing all the row and column boundaries, cell positions
+        and their dimensions.
+        """
+        corners = [(0, 0)]
+        while corners:
+            top, left = corners.pop(0)
+            if top == self.bottom or left == self.right \
+                  or top <= self.done[left]:
+                continue
+            result = self.scan_cell(top, left)
+            if not result:
+                continue
+            bottom, right, rowseps, colseps = result
+            update_dict_of_lists(self.rowseps, rowseps)
+            update_dict_of_lists(self.colseps, colseps)
+            self.mark_done(top, left, bottom, right)
+            cellblock = self.block.get_2D_block(top + 1, left + 1,
+                                                bottom, right)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            self.cells.append((top, left, bottom, right, cellblock))
+            corners.extend([(top, right), (bottom, left)])
+            corners.sort()
+        if not self.check_parse_complete():
+            raise TableMarkupError('Malformed table; parse incomplete.')
+
+    def mark_done(self, top, left, bottom, right):
+        """For keeping track of how much of each text column has been seen."""
+        before = top - 1
+        after = bottom - 1
+        for col in range(left, right):
+            assert self.done[col] == before
+            self.done[col] = after
+
+    def check_parse_complete(self):
+        """Each text column should have been completely seen."""
+        last = self.bottom - 1
+        for col in range(self.right):
+            if self.done[col] != last:
+                return False
+        return True
+
+    def scan_cell(self, top, left):
+        """Starting at the top-left corner, start tracing out a cell."""
+        assert self.block[top][left] == '+'
+        result = self.scan_right(top, left)
+        return result
+
+    def scan_right(self, top, left):
+        """
+        Look for the top-right corner of the cell, and make note of all column
+        boundaries ('+').
+        """
+        colseps = {}
+        line = self.block[top]
+        for i in range(left + 1, self.right + 1):
+            if line[i] == '+':
+                colseps[i] = [top]
+                result = self.scan_down(top, left, i)
+                if result:
+                    bottom, rowseps, newcolseps = result
+                    update_dict_of_lists(colseps, newcolseps)
+                    return bottom, i, rowseps, colseps
+            elif line[i] != '-':
+                return None
+        return None
+
+    def scan_down(self, top, left, right):
+        """
+        Look for the bottom-right corner of the cell, making note of all row
+        boundaries.
+        """
+        rowseps = {}
+        for i in range(top + 1, self.bottom + 1):
+            if self.block[i][right] == '+':
+                rowseps[i] = [right]
+                result = self.scan_left(top, left, i, right)
+                if result:
+                    newrowseps, colseps = result
+                    update_dict_of_lists(rowseps, newrowseps)
+                    return i, rowseps, colseps
+            elif self.block[i][right] != '|':
+                return None
+        return None
+
+    def scan_left(self, top, left, bottom, right):
+        """
+        Noting column boundaries, look for the bottom-left corner of the cell.
+        It must line up with the starting point.
+        """
+        colseps = {}
+        line = self.block[bottom]
+        for i in range(right - 1, left, -1):
+            if line[i] == '+':
+                colseps[i] = [bottom]
+            elif line[i] != '-':
+                return None
+        if line[left] != '+':
+            return None
+        result = self.scan_up(top, left, bottom, right)
+        if result is not None:
+            rowseps = result
+            return rowseps, colseps
+        return None
+
+    def scan_up(self, top, left, bottom, right):
+        """
+        Noting row boundaries, see if we can return to the starting point.
+        """
+        rowseps = {}
+        for i in range(bottom - 1, top, -1):
+            if self.block[i][left] == '+':
+                rowseps[i] = [left]
+            elif self.block[i][left] != '|':
+                return None
+        return rowseps
+
+    def structure_from_cells(self):
+        """
+        From the data collected by `scan_cell()`, convert to the final data
+        structure.
+        """
+        rowseps = self.rowseps.keys()   # list of row boundaries
+        rowseps.sort()
+        rowindex = {}
+        for i in range(len(rowseps)):
+            rowindex[rowseps[i]] = i    # row boundary -> row number mapping
+        colseps = self.colseps.keys()   # list of column boundaries
+        colseps.sort()
+        colindex = {}
+        for i in range(len(colseps)):
+            colindex[colseps[i]] = i    # column boundary -> col number map
+        colspecs = [(colseps[i] - colseps[i - 1] - 1)
+                    for i in range(1, len(colseps))] # list of column widths
+        # prepare an empty table with the correct number of rows & columns
+        onerow = [None for i in range(len(colseps) - 1)]
+        rows = [onerow[:] for i in range(len(rowseps) - 1)]
+        # keep track of # of cells remaining; should reduce to zero
+        remaining = (len(rowseps) - 1) * (len(colseps) - 1)
+        for top, left, bottom, right, block in self.cells:
+            rownum = rowindex[top]
+            colnum = colindex[left]
+            assert rows[rownum][colnum] is None, (
+                  'Cell (row %s, column %s) already used.'
+                  % (rownum + 1, colnum + 1))
+            morerows = rowindex[bottom] - rownum - 1
+            morecols = colindex[right] - colnum - 1
+            remaining -= (morerows + 1) * (morecols + 1)
+            # write the cell into the table
+            rows[rownum][colnum] = (morerows, morecols, top + 1, block)
+        assert remaining == 0, 'Unused cells remaining.'
+        if self.head_body_sep:          # separate head rows from body rows
+            numheadrows = rowindex[self.head_body_sep]
+            headrows = rows[:numheadrows]
+            bodyrows = rows[numheadrows:]
+        else:
+            headrows = []
+            bodyrows = rows
+        return (colspecs, headrows, bodyrows)
+
+
+class SimpleTableParser(TableParser):
+
+    """
+    Parse a simple table using `parse()`.
+
+    Here's an example of a simple table::
+
+        =====  =====
+        col 1  col 2
+        =====  =====
+        1      Second column of row 1.
+        2      Second column of row 2.
+               Second line of paragraph.
+        3      - Second column of row 3.
+
+               - Second item in bullet
+                 list (row 3, column 2).
+        4 is a span
+        ------------
+        5
+        =====  =====
+
+    Top and bottom borders use '=', column span underlines use '-', column
+    separation is indicated with spaces.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure, whose interpretation is the same as for
+    `GridTableParser`::
+
+        ([5, 25],
+         [[(0, 0, 1, ['col 1']),
+           (0, 0, 1, ['col 2'])]],
+         [[(0, 0, 3, ['1']),
+           (0, 0, 3, ['Second column of row 1.'])],
+          [(0, 0, 4, ['2']),
+           (0, 0, 4, ['Second column of row 2.',
+                      'Second line of paragraph.'])],
+          [(0, 0, 6, ['3']),
+           (0, 0, 6, ['- Second column of row 3.',
+                      '',
+                      '- Second item in bullet',
+                      '  list (row 3, column 2).'])],
+          [(0, 1, 10, ['4 is a span'])],
+          [(0, 0, 12, ['5']),
+           (0, 0, 12, [''])]])
+    """
+
+    head_body_separator_pat = re.compile('=[ =]*$')
+    span_pat = re.compile('-[ -]*$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it will be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        # Convert top & bottom borders to column span underlines:
+        self.block[0] = self.block[0].replace('=', '-')
+        self.block[-1] = self.block[-1].replace('=', '-')
+        self.head_body_sep = None
+        self.columns = []
+        self.border_end = None
+        self.table = []
+        self.done = [-1] * len(block[0])
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        First determine the column boundaries from the top border, then
+        process rows.  Each row may consist of multiple lines; accumulate
+        lines until a row is complete.  Call `self.parse_row` to finish the
+        job.
+        """
+        # Top border must fully describe all table columns.
+        self.columns = self.parse_columns(self.block[0], 0)
+        self.border_end = self.columns[-1][1]
+        firststart, firstend = self.columns[0]
+        offset = 1                      # skip top border
+        start = 1
+        text_found = None
+        while offset < len(self.block):
+            line = self.block[offset]
+            if self.span_pat.match(line):
+                # Column span underline or border; row is complete.
+                self.parse_row(self.block[start:offset], start,
+                               (line.rstrip(), offset))
+                start = offset + 1
+                text_found = None
+            elif line[firststart:firstend].strip():
+                # First column not blank, therefore it's a new row.
+                if text_found and offset != start:
+                    self.parse_row(self.block[start:offset], start)
+                start = offset
+                text_found = 1
+            elif not text_found:
+                start = offset + 1
+            offset += 1
+
+    def parse_columns(self, line, offset):
+        """
+        Given a column span underline, return a list of (begin, end) pairs.
+        """
+        cols = []
+        end = 0
+        while True:
+            begin = line.find('-', end)
+            end = line.find(' ', begin)
+            if begin < 0:
+                break
+            if end < 0:
+                end = len(line)
+            cols.append((begin, end))
+        if self.columns:
+            if cols[-1][1] != self.border_end:
+                raise TableMarkupError('Column span incomplete in table '
+                                       'line %s.' % (offset+1),
+                                       offset=offset)
+            # Allow for an unbounded rightmost column:
+            cols[-1] = (cols[-1][0], self.columns[-1][1])
+        return cols
+
+    def init_row(self, colspec, offset):
+        i = 0
+        cells = []
+        for start, end in colspec:
+            morecols = 0
+            try:
+                assert start == self.columns[i][0]
+                while end != self.columns[i][1]:
+                    i += 1
+                    morecols += 1
+            except (AssertionError, IndexError):
+                raise TableMarkupError('Column span alignment problem '
+                                       'in table line %s.' % (offset+2),
+                                       offset=offset+1)
+            cells.append([0, morecols, offset, []])
+            i += 1
+        return cells
+
+    def parse_row(self, lines, start, spanline=None):
+        """
+        Given the text `lines` of a row, parse it and append to `self.table`.
+
+        The row is parsed according to the current column spec (either
+        `spanline` if provided or `self.columns`).  For each column, extract
+        text from each line, and check for text in column margins.  Finally,
+        adjust for insignificant whitespace.
+        """
+        if not (lines or spanline):
+            # No new row, just blank lines.
+            return
+        if spanline:
+            columns = self.parse_columns(*spanline)
+            span_offset = spanline[1]
+        else:
+            columns = self.columns[:]
+            span_offset = start
+        self.check_columns(lines, start, columns)
+        row = self.init_row(columns, start)
+        for i in range(len(columns)):
+            start, end = columns[i]
+            cellblock = lines.get_2D_block(0, start, len(lines), end)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            row[i][3] = cellblock
+        self.table.append(row)
+
+    def check_columns(self, lines, first_line, columns):
+        """
+        Check for text in column margins and text overflow in the last column.
+        Raise TableMarkupError if anything but whitespace is in column margins.
+        Adjust the end value for the last column if there is text overflow.
+        """
+        # "Infinite" value for a dummy last column's beginning, used to
+        # check for text overflow:
+        columns.append((sys.maxint, None))
+        lastcol = len(columns) - 2
+        # combining characters do not contribute to the column width
+        lines = [strip_combining_chars(line) for line in lines]
+
+        for i in range(len(columns) - 1):
+            start, end = columns[i]
+            nextstart = columns[i+1][0]
+            offset = 0
+            for line in lines:
+                if i == lastcol and line[end:].strip():
+                    text = line[start:].rstrip()
+                    new_end = start + len(text)
+                    main_start, main_end = self.columns[-1]
+                    columns[i] = (start, max(main_end, new_end))
+                    if new_end > main_end:
+                        self.columns[-1] = (main_start, new_end)
+                elif line[end:nextstart].strip():
+                    raise TableMarkupError('Text in column margin '
+                        'in table line %s.' % (first_line+offset+1),
+                        offset=first_line+offset)
+                offset += 1
+        columns.pop()
+
+    def structure_from_cells(self):
+        colspecs = [end - start for start, end in self.columns]
+        first_body_row = 0
+        if self.head_body_sep:
+            for i in range(len(self.table)):
+                if self.table[i][0][2] > self.head_body_sep:
+                    first_body_row = i
+                    break
+        return (colspecs, self.table[:first_body_row],
+                self.table[first_body_row:])
+
+
+def update_dict_of_lists(master, newdata):
+    """
+    Extend the list values of `master` with those from `newdata`.
+
+    Both parameters must be dictionaries containing list values.
+    """
+    for key, values in newdata.items():
+        master.setdefault(key, []).extend(values)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/admonitions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/admonitions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/admonitions.py	(revision 1126)
@@ -0,0 +1,99 @@
+# $Id: admonitions.py 7681 2013-07-12 07:52:27Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Admonition directives.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states, directives
+from docutils.parsers.rst.roles import set_classes
+from docutils import nodes
+
+
+class BaseAdmonition(Directive):
+
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+    has_content = True
+
+    node_class = None
+    """Subclasses must set this to the appropriate admonition node class."""
+
+    def run(self):
+        set_classes(self.options)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        admonition_node = self.node_class(text, **self.options)
+        self.add_name(admonition_node)
+        if self.node_class is nodes.admonition:
+            title_text = self.arguments[0]
+            textnodes, messages = self.state.inline_text(title_text,
+                                                         self.lineno)
+            title = nodes.title(title_text, '', *textnodes)
+            title.source, title.line = (
+                    self.state_machine.get_source_and_line(self.lineno))
+            admonition_node += title
+            admonition_node += messages
+            if not 'classes' in self.options:
+                admonition_node['classes'] += ['admonition-' +
+                                               nodes.make_id(title_text)]
+        self.state.nested_parse(self.content, self.content_offset,
+                                admonition_node)
+        return [admonition_node]
+
+
+class Admonition(BaseAdmonition):
+
+    required_arguments = 1
+    node_class = nodes.admonition
+
+
+class Attention(BaseAdmonition):
+
+    node_class = nodes.attention
+
+
+class Caution(BaseAdmonition):
+
+    node_class = nodes.caution
+
+
+class Danger(BaseAdmonition):
+
+    node_class = nodes.danger
+
+
+class Error(BaseAdmonition):
+
+    node_class = nodes.error
+
+
+class Hint(BaseAdmonition):
+
+    node_class = nodes.hint
+
+
+class Important(BaseAdmonition):
+
+    node_class = nodes.important
+
+
+class Note(BaseAdmonition):
+
+    node_class = nodes.note
+
+
+class Tip(BaseAdmonition):
+
+    node_class = nodes.tip
+
+
+class Warning(BaseAdmonition):
+
+    node_class = nodes.warning
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/html.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/html.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/html.py	(revision 1126)
@@ -0,0 +1,86 @@
+# $Id: html.py 7320 2012-01-19 22:33:02Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for typically HTML-specific constructs.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states
+from docutils.transforms import components
+
+
+class MetaBody(states.SpecializedBody):
+
+    class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
+        """HTML-specific "meta" element."""
+        pass
+
+    def field_marker(self, match, context, next_state):
+        """Meta element."""
+        node, blank_finish = self.parsemeta(match)
+        self.parent += node
+        return [], next_state, []
+
+    def parsemeta(self, match):
+        name = self.parse_field_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        node = self.meta()
+        pending = nodes.pending(components.Filter,
+                                {'component': 'writer',
+                                 'format': 'html',
+                                 'nodes': [node]})
+        node['content'] = ' '.join(indented)
+        if not indented:
+            line = self.state_machine.line
+            msg = self.reporter.info(
+                  'No content for meta tag "%s".' % name,
+                  nodes.literal_block(line, line))
+            return msg, blank_finish
+        tokens = name.split()
+        try:
+            attname, val = utils.extract_name_value(tokens[0])[0]
+            node[attname.lower()] = val
+        except utils.NameValueError:
+            node['name'] = tokens[0]
+        for token in tokens[1:]:
+            try:
+                attname, val = utils.extract_name_value(token)[0]
+                node[attname.lower()] = val
+            except utils.NameValueError, detail:
+                line = self.state_machine.line
+                msg = self.reporter.error(
+                      'Error parsing meta tag attribute "%s": %s.'
+                      % (token, detail), nodes.literal_block(line, line))
+                return msg, blank_finish
+        self.document.note_pending(pending)
+        return pending, blank_finish
+
+
+class Meta(Directive):
+
+    has_content = True
+
+    SMkwargs = {'state_classes': (MetaBody,)}
+
+    def run(self):
+        self.assert_has_content()
+        node = nodes.Element()
+        new_line_offset, blank_finish = self.state.nested_list_parse(
+            self.content, self.content_offset, node,
+            initial_state='MetaBody', blank_finish=True,
+            state_machine_kwargs=self.SMkwargs)
+        if (new_line_offset - self.content_offset) != len(self.content):
+            # incomplete parse of block?
+            error = self.state_machine.reporter.error(
+                'Invalid meta directive.',
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            node += error
+        return node.children
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/images.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/images.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/images.py	(revision 1126)
@@ -0,0 +1,164 @@
+# $Id: images.py 7753 2014-06-24 14:52:59Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for figures and simple images.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import urllib
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives, states
+from docutils.nodes import fully_normalize_name, whitespace_normalize_name
+from docutils.parsers.rst.roles import set_classes
+try: # check for the Python Imaging Library
+    import PIL.Image
+except ImportError:
+    try:  # sometimes PIL modules are put in PYTHONPATH's root
+        import Image
+        class PIL(object): pass  # dummy wrapper
+        PIL.Image = Image
+    except ImportError:
+        PIL = None
+
+class Image(Directive):
+
+    align_h_values = ('left', 'center', 'right')
+    align_v_values = ('top', 'middle', 'bottom')
+    align_values = align_v_values + align_h_values
+
+    def align(argument):
+        # This is not callable as self.align.  We cannot make it a
+        # staticmethod because we're saving an unbound method in
+        # option_spec below.
+        return directives.choice(argument, Image.align_values)
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'alt': directives.unchanged,
+                   'height': directives.length_or_unitless,
+                   'width': directives.length_or_percentage_or_unitless,
+                   'scale': directives.percentage,
+                   'align': align,
+                   'name': directives.unchanged,
+                   'target': directives.unchanged_required,
+                   'class': directives.class_option}
+
+    def run(self):
+        if 'align' in self.options:
+            if isinstance(self.state, states.SubstitutionDef):
+                # Check for align_v_values.
+                if self.options['align'] not in self.align_v_values:
+                    raise self.error(
+                        'Error in "%s" directive: "%s" is not a valid value '
+                        'for the "align" option within a substitution '
+                        'definition.  Valid values for "align" are: "%s".'
+                        % (self.name, self.options['align'],
+                           '", "'.join(self.align_v_values)))
+            elif self.options['align'] not in self.align_h_values:
+                raise self.error(
+                    'Error in "%s" directive: "%s" is not a valid value for '
+                    'the "align" option.  Valid values for "align" are: "%s".'
+                    % (self.name, self.options['align'],
+                       '", "'.join(self.align_h_values)))
+        messages = []
+        reference = directives.uri(self.arguments[0])
+        self.options['uri'] = reference
+        reference_node = None
+        if 'target' in self.options:
+            block = states.escape2null(
+                self.options['target']).splitlines()
+            block = [line for line in block]
+            target_type, data = self.state.parse_target(
+                block, self.block_text, self.lineno)
+            if target_type == 'refuri':
+                reference_node = nodes.reference(refuri=data)
+            elif target_type == 'refname':
+                reference_node = nodes.reference(
+                    refname=fully_normalize_name(data),
+                    name=whitespace_normalize_name(data))
+                reference_node.indirect_reference_name = data
+                self.state.document.note_refname(reference_node)
+            else:                           # malformed target
+                messages.append(data)       # data is a system message
+            del self.options['target']
+        set_classes(self.options)
+        image_node = nodes.image(self.block_text, **self.options)
+        self.add_name(image_node)
+        if reference_node:
+            reference_node += image_node
+            return messages + [reference_node]
+        else:
+            return messages + [image_node]
+
+
+class Figure(Image):
+
+    def align(argument):
+        return directives.choice(argument, Figure.align_h_values)
+
+    def figwidth_value(argument):
+        if argument.lower() == 'image':
+            return 'image'
+        else:
+            return directives.length_or_percentage_or_unitless(argument, 'px')
+
+    option_spec = Image.option_spec.copy()
+    option_spec['figwidth'] = figwidth_value
+    option_spec['figclass'] = directives.class_option
+    option_spec['align'] = align
+    has_content = True
+
+    def run(self):
+        figwidth = self.options.pop('figwidth', None)
+        figclasses = self.options.pop('figclass', None)
+        align = self.options.pop('align', None)
+        (image_node,) = Image.run(self)
+        if isinstance(image_node, nodes.system_message):
+            return [image_node]
+        figure_node = nodes.figure('', image_node)
+        if figwidth == 'image':
+            if PIL and self.state.document.settings.file_insertion_enabled:
+                imagepath = urllib.url2pathname(image_node['uri'])
+                try:
+                    img = PIL.Image.open(
+                            imagepath.encode(sys.getfilesystemencoding()))
+                except (IOError, UnicodeEncodeError):
+                    pass # TODO: warn?
+                else:
+                    self.state.document.settings.record_dependencies.add(
+                        imagepath.replace('\\', '/'))
+                    figure_node['width'] = '%dpx' % img.size[0]
+                    del img
+        elif figwidth is not None:
+            figure_node['width'] = figwidth
+        if figclasses:
+            figure_node['classes'] += figclasses
+        if align:
+            figure_node['align'] = align
+        if self.content:
+            node = nodes.Element()          # anonymous container for parsing
+            self.state.nested_parse(self.content, self.content_offset, node)
+            first_node = node[0]
+            if isinstance(first_node, nodes.paragraph):
+                caption = nodes.caption(first_node.rawsource, '',
+                                        *first_node.children)
+                caption.source = first_node.source
+                caption.line = first_node.line
+                figure_node += caption
+            elif not (isinstance(first_node, nodes.comment)
+                      and len(first_node) == 0):
+                error = self.state_machine.reporter.error(
+                      'Figure caption must be a paragraph or empty comment.',
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                return [figure_node, error]
+            if len(node) > 1:
+                figure_node += nodes.legend('', *node[1:])
+        return [figure_node]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/parts.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/parts.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/parts.py	(revision 1126)
@@ -0,0 +1,126 @@
+# $Id: parts.py 7308 2012-01-06 12:08:43Z milde $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, languages
+from docutils.transforms import parts
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class Contents(Directive):
+
+    """
+    Table of contents.
+
+    The table of contents is generated in two passes: initial parse and
+    transform.  During the initial parse, a 'pending' element is generated
+    which acts as a placeholder, storing the TOC title and any options
+    internally.  At a later stage in the processing, the 'pending' element is
+    replaced by a 'topic' element, a title and the table of contents proper.
+    """
+
+    backlinks_values = ('top', 'entry', 'none')
+
+    def backlinks(arg):
+        value = directives.choice(arg, Contents.backlinks_values)
+        if value == 'none':
+            return None
+        else:
+            return value
+
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'depth': directives.nonnegative_int,
+                   'local': directives.flag,
+                   'backlinks': backlinks,
+                   'class': directives.class_option}
+    
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        document = self.state_machine.document
+        language = languages.get_language(document.settings.language_code,
+                                          document.reporter)
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            messages = []
+            if 'local' in self.options:
+                title = None
+            else:
+                title = nodes.title('', language.labels['contents'])
+        topic = nodes.topic(classes=['contents'])
+        topic['classes'] += self.options.get('class', [])
+        # the latex2e writer needs source and line for a warning:
+        topic.source, topic.line = self.state_machine.get_source_and_line()
+        topic.line -= 1
+        if 'local' in self.options:
+            topic['classes'].append('local')
+        if title:
+            name = title.astext()
+            topic += title
+        else:
+            name = language.labels['contents']
+        name = nodes.fully_normalize_name(name)
+        if not document.has_name(name):
+            topic['names'].append(name)
+        document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents, rawsource=self.block_text)
+        pending.details.update(self.options)
+        document.note_pending(pending)
+        topic += pending
+        return [topic] + messages
+
+
+class Sectnum(Directive):
+
+    """Automatic section numbering."""
+
+    option_spec = {'depth': int,
+                   'start': int,
+                   'prefix': directives.unchanged_required,
+                   'suffix': directives.unchanged_required}
+
+    def run(self):
+        pending = nodes.pending(parts.SectNum)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        return [pending]
+
+
+class Header(Directive):
+
+    """Contents of document header."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        header = self.state_machine.document.get_decoration().get_header()
+        self.state.nested_parse(self.content, self.content_offset, header)
+        return []
+
+
+class Footer(Directive):
+
+    """Contents of document footer."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        footer = self.state_machine.document.get_decoration().get_footer()
+        self.state.nested_parse(self.content, self.content_offset, footer)
+        return []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/tables.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/tables.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/tables.py	(revision 1126)
@@ -0,0 +1,503 @@
+# $Id: tables.py 7958 2016-07-28 21:52:14Z milde $
+# Authors: David Goodger <goodger@python.org>; David Priest
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for table elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os.path
+import csv
+
+from docutils import io, nodes, statemachine, utils
+from docutils.utils.error_reporting import SafeString
+from docutils.utils import SystemMessagePropagation
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+def align(argument):
+    return directives.choice(argument, ('left', 'center', 'right'))
+
+
+class Table(Directive):
+
+    """
+    Generic table base class.
+    """
+
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged,
+                   'align': align,
+                   'widths': directives.value_or(('auto', 'grid'),
+                                                 directives.positive_int_list)}
+    has_content = True
+
+    def make_title(self):
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            title = None
+            messages = []
+        return title, messages
+
+    def process_header_option(self):
+        source = self.state_machine.get_source(self.lineno - 1)
+        table_head = []
+        max_header_cols = 0
+        if 'header' in self.options:   # separate table header in option
+            rows, max_header_cols = self.parse_csv_data_into_rows(
+                self.options['header'].split('\n'), self.HeaderDialect(),
+                source)
+            table_head.extend(rows)
+        return table_head, max_header_cols
+
+    def check_table_dimensions(self, rows, header_rows, stub_columns):
+        if len(rows) < header_rows:
+            error = self.state_machine.reporter.error(
+                '%s header row(s) specified but only %s row(s) of data '
+                'supplied ("%s" directive).'
+                % (header_rows, len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        if len(rows) == header_rows > 0:
+            error = self.state_machine.reporter.error(
+                'Insufficient data supplied (%s row(s)); no data remaining '
+                'for table body, required by "%s" directive.'
+                % (len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        for row in rows:
+            if len(row) < stub_columns:
+                error = self.state_machine.reporter.error(
+                    '%s stub column(s) specified but only %s columns(s) of '
+                    'data supplied ("%s" directive).' %
+                    (stub_columns, len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            if len(row) == stub_columns > 0:
+                error = self.state_machine.reporter.error(
+                    'Insufficient data supplied (%s columns(s)); no data remaining '
+                    'for table body, required by "%s" directive.'
+                    % (len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+
+    @property
+    def widths(self):
+        return self.options.get('widths', '')
+
+    def get_column_widths(self, max_cols):
+        if type(self.widths) == list:
+            if len(self.widths) != max_cols:
+                error = self.state_machine.reporter.error(
+                    '"%s" widths do not match the number of columns in table '
+                    '(%s).' % (self.name, max_cols), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            col_widths = self.widths
+        elif max_cols:
+            col_widths = [100 // max_cols] * max_cols
+        else:
+            error = self.state_machine.reporter.error(
+                'No table data detected in CSV file.', nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        if self.widths == 'auto':
+            widths = 'auto'
+        elif self.widths: # "grid" or list of integers
+            widths = 'given'
+        else:
+            widths = self.widths
+        return widths, col_widths
+
+    def extend_short_rows_with_empty_cells(self, columns, parts):
+        for part in parts:
+            for row in part:
+                if len(row) < columns:
+                    row.extend([(0, 0, 0, [])] * (columns - len(row)))
+
+
+class RSTTable(Table):
+
+    def run(self):
+        if not self.content:
+            warning = self.state_machine.reporter.warning(
+                'Content block expected for the "%s" directive; none found.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [warning]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        if len(node) != 1 or not isinstance(node[0], nodes.table):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: exactly '
+                'one table expected.' % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table_node = node[0]
+        table_node['classes'] += self.options.get('class', [])
+        if 'align' in self.options:
+            table_node['align'] = self.options.get('align')
+        tgroup = table_node[0]
+        if type(self.widths) == list:
+            colspecs = [child for child in tgroup.children
+                        if child.tagname == 'colspec']
+            for colspec, col_width in zip(colspecs, self.widths):
+                colspec['colwidth'] = col_width
+        # @@@ the colwidths argument for <tgroup> is not part of the
+        # XML Exchange Table spec (https://www.oasis-open.org/specs/tm9901.htm)
+        # and hence violates the docutils.dtd.
+        if self.widths == 'auto':
+            table_node['classes'] += ['colwidths-auto']
+        elif self.widths: # "grid" or list of integers
+            table_node['classes'] += ['colwidths-given']
+        self.add_name(table_node)
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+
+class CSVTable(Table):
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'header': directives.unchanged,
+                   'widths': directives.value_or(('auto', ),
+                                                 directives.positive_int_list),
+                   'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding,
+                   'class': directives.class_option,
+                   'name': directives.unchanged,
+                   'align': align,
+                   # field delimiter char
+                   'delim': directives.single_char_or_whitespace_or_unicode,
+                   # treat whitespace after delimiter as significant
+                   'keepspace': directives.flag,
+                   # text field quote/unquote char:
+                   'quote': directives.single_char_or_unicode,
+                   # char used to escape delim & quote as-needed:
+                   'escape': directives.single_char_or_unicode,}
+
+    class DocutilsDialect(csv.Dialect):
+
+        """CSV dialect for `csv_table` directive."""
+
+        delimiter = ','
+        quotechar = '"'
+        doublequote = True
+        skipinitialspace = True
+        strict = True
+        lineterminator = '\n'
+        quoting = csv.QUOTE_MINIMAL
+
+        def __init__(self, options):
+            if 'delim' in options:
+                self.delimiter = CSVTable.encode_for_csv(options['delim'])
+            if 'keepspace' in options:
+                self.skipinitialspace = False
+            if 'quote' in options:
+                self.quotechar = CSVTable.encode_for_csv(options['quote'])
+            if 'escape' in options:
+                self.doublequote = False
+                self.escapechar = CSVTable.encode_for_csv(options['escape'])
+            csv.Dialect.__init__(self)
+
+
+    class HeaderDialect(csv.Dialect):
+
+        """CSV dialect to use for the "header" option data."""
+
+        delimiter = ','
+        quotechar = '"'
+        escapechar = '\\'
+        doublequote = False
+        skipinitialspace = True
+        strict = True
+        lineterminator = '\n'
+        quoting = csv.QUOTE_MINIMAL
+
+    def check_requirements(self):
+        pass
+
+    def run(self):
+        try:
+            if (not self.state.document.settings.file_insertion_enabled
+                and ('file' in self.options
+                     or 'url' in self.options)):
+                warning = self.state_machine.reporter.warning(
+                    'File and URL access deactivated; ignoring "%s" '
+                    'directive.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return [warning]
+            self.check_requirements()
+            title, messages = self.make_title()
+            csv_data, source = self.get_csv_data()
+            table_head, max_header_cols = self.process_header_option()
+            rows, max_cols = self.parse_csv_data_into_rows(
+                csv_data, self.DocutilsDialect(self.options), source)
+            max_cols = max(max_cols, max_header_cols)
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(rows, header_rows, stub_columns)
+            table_head.extend(rows[:header_rows])
+            table_body = rows[header_rows:]
+            widths, col_widths = self.get_column_widths(max_cols)
+            self.extend_short_rows_with_empty_cells(max_cols,
+                                                    (table_head, table_body))
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        except csv.Error, detail:
+            message = str(detail)
+            if sys.version_info < (3,) and '1-character string' in message:
+                message += '\nwith Python 2.x this must be an ASCII character.'
+            error = self.state_machine.reporter.error(
+                'Error with CSV data in "%s" directive:\n%s'
+                % (self.name, message), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table = (col_widths, table_head, table_body)
+        table_node = self.state.build_table(table, self.content_offset,
+                                            stub_columns, widths=widths)
+        table_node['classes'] += self.options.get('class', [])
+        if 'align' in self.options:
+            table_node['align'] = self.options.get('align')
+        self.add_name(table_node)
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def get_csv_data(self):
+        """
+        Get CSV data from the directive content, from an external
+        file, or from a URL reference.
+        """
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        error_handler = self.state.document.settings.input_encoding_error_handler
+        if self.content:
+            # CSV data is from directive content.
+            if 'file' in self.options or 'url' in self.options:
+                error = self.state_machine.reporter.error(
+                    '"%s" directive may not both specify an external file and'
+                    ' have content.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source = self.content.source(0)
+            csv_data = self.content
+        elif 'file' in self.options:
+            # CSV data is from an external file.
+            if 'url' in self.options:
+                error = self.state_machine.reporter.error(
+                      'The "file" and "url" options may not be simultaneously'
+                      ' specified for the "%s" directive.' % self.name,
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            source = os.path.normpath(os.path.join(source_dir,
+                                                   self.options['file']))
+            source = utils.relative_path(None, source)
+            try:
+                self.state.document.settings.record_dependencies.add(source)
+                csv_file = io.FileInput(source_path=source,
+                                        encoding=encoding,
+                                        error_handler=error_handler)
+                csv_data = csv_file.read().splitlines()
+            except IOError, error:
+                severe = self.state_machine.reporter.severe(
+                    u'Problems with "%s" directive path:\n%s.'
+                    % (self.name, SafeString(error)),
+                    nodes.literal_block(self.block_text, self.block_text),
+                    line=self.lineno)
+                raise SystemMessagePropagation(severe)
+        elif 'url' in self.options:
+            # CSV data is from a URL.
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            source = self.options['url']
+            try:
+                csv_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError, ValueError), error:
+                severe = self.state_machine.reporter.severe(
+                      'Problems with "%s" directive URL "%s":\n%s.'
+                      % (self.name, self.options['url'], SafeString(error)),
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(severe)
+            csv_file = io.StringInput(
+                source=csv_text, source_path=source, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler))
+            csv_data = csv_file.read().splitlines()
+        else:
+            error = self.state_machine.reporter.warning(
+                'The "%s" directive requires content; none supplied.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        return csv_data, source
+
+    if sys.version_info < (3,):
+        # 2.x csv module doesn't do Unicode
+        def decode_from_csv(s):
+            return s.decode('utf-8')
+        def encode_for_csv(s):
+            return s.encode('utf-8')
+    else:
+        def decode_from_csv(s):
+            return s
+        def encode_for_csv(s):
+            return s
+    decode_from_csv = staticmethod(decode_from_csv)
+    encode_for_csv = staticmethod(encode_for_csv)
+
+    def parse_csv_data_into_rows(self, csv_data, dialect, source):
+        # csv.py doesn't do Unicode; encode temporarily as UTF-8
+        csv_reader = csv.reader([self.encode_for_csv(line + '\n')
+                                 for line in csv_data],
+                                dialect=dialect)
+        rows = []
+        max_cols = 0
+        for row in csv_reader:
+            row_data = []
+            for cell in row:
+                # decode UTF-8 back to Unicode
+                cell_text = self.decode_from_csv(cell)
+                cell_data = (0, 0, 0, statemachine.StringList(
+                    cell_text.splitlines(), source=source))
+                row_data.append(cell_data)
+            rows.append(row_data)
+            max_cols = max(max_cols, len(row))
+        return rows, max_cols
+
+
+class ListTable(Table):
+
+    """
+    Implement tables whose data is encoded as a uniform two-level bullet list.
+    For further ideas, see
+    http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables
+    """
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'widths': directives.value_or(('auto', ),
+                                                 directives.positive_int_list),
+                   'class': directives.class_option,
+                   'name': directives.unchanged,
+                   'align': align}
+
+    def run(self):
+        if not self.content:
+            error = self.state_machine.reporter.error(
+                'The "%s" directive is empty; content required.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return [error]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        try:
+            num_cols, widths, col_widths = self.check_list_content(node)
+            table_data = [[item.children for item in row_list[0]]
+                          for row_list in node[0]]
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(table_data, header_rows, stub_columns)
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        table_node = self.build_table_from_list(table_data, widths, col_widths,
+                                                header_rows, stub_columns)
+        if 'align' in self.options:
+            table_node['align'] = self.options.get('align')
+        table_node['classes'] += self.options.get('class', [])
+        self.add_name(table_node)
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def check_list_content(self, node):
+        if len(node) != 1 or not isinstance(node[0], nodes.bullet_list):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: '
+                'exactly one bullet list expected.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            raise SystemMessagePropagation(error)
+        list_node = node[0]
+        # Check for a uniform two-level bullet list:
+        for item_index in range(len(list_node)):
+            item = list_node[item_index]
+            if len(item) != 1 or not isinstance(item[0], nodes.bullet_list):
+                error = self.state_machine.reporter.error(
+                    'Error parsing content block for the "%s" directive: '
+                    'two-level bullet list expected, but row %s does not '
+                    'contain a second-level bullet list.'
+                    % (self.name, item_index + 1), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            elif item_index:
+                # ATTN pychecker users: num_cols is guaranteed to be set in the
+                # "else" clause below for item_index==0, before this branch is
+                # triggered.
+                if len(item[0]) != num_cols:
+                    error = self.state_machine.reporter.error(
+                        'Error parsing content block for the "%s" directive: '
+                        'uniform two-level bullet list expected, but row %s '
+                        'does not contain the same number of items as row 1 '
+                        '(%s vs %s).'
+                        % (self.name, item_index + 1, len(item[0]), num_cols),
+                        nodes.literal_block(self.block_text, self.block_text),
+                        line=self.lineno)
+                    raise SystemMessagePropagation(error)
+            else:
+                num_cols = len(item[0])
+        widths, col_widths = self.get_column_widths(num_cols)
+        return num_cols, widths, col_widths
+
+    def build_table_from_list(self, table_data, widths, col_widths, header_rows,
+                              stub_columns):
+        table = nodes.table()
+        if widths:
+            table['classes'] += ['colwidths-%s' % widths]
+        tgroup = nodes.tgroup(cols=len(col_widths))
+        table += tgroup
+        for col_width in col_widths:
+            colspec = nodes.colspec()
+            if col_width is not None:
+                colspec.attributes['colwidth'] = col_width
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        rows = []
+        for row in table_data:
+            row_node = nodes.row()
+            for cell in row:
+                entry = nodes.entry()
+                entry += cell
+                row_node += entry
+            rows.append(row_node)
+        if header_rows:
+            thead = nodes.thead()
+            thead.extend(rows[:header_rows])
+            tgroup += thead
+        tbody = nodes.tbody()
+        tbody.extend(rows[header_rows:])
+        tgroup += tbody
+        return table
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/misc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/misc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/misc.py	(revision 1126)
@@ -0,0 +1,552 @@
+# $Id: misc.py 7961 2016-07-28 22:02:47Z milde $
+# Authors: David Goodger <goodger@python.org>; Dethe Elza
+# Copyright: This module has been placed in the public domain.
+
+"""Miscellaneous directives."""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os.path
+import re
+import time
+from docutils import io, nodes, statemachine, utils
+from docutils.utils.error_reporting import SafeString, ErrorString
+from docutils.utils.error_reporting import locale_encoding
+from docutils.parsers.rst import Directive, convert_directive_function
+from docutils.parsers.rst import directives, roles, states
+from docutils.parsers.rst.directives.body import CodeBlock, NumberLines
+from docutils.parsers.rst.roles import set_classes
+from docutils.transforms import misc
+
+class Include(Directive):
+
+    """
+    Include content read from a separate source file.
+
+    Content may be parsed by the parser, or included as a literal
+    block.  The encoding of the included file can be specified.  Only
+    a part of the given file argument may be included by specifying
+    start and end line or text to match before and/or after the text
+    to be used.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'literal': directives.flag,
+                   'code': directives.unchanged,
+                   'encoding': directives.encoding,
+                   'tab-width': int,
+                   'start-line': int,
+                   'end-line': int,
+                   'start-after': directives.unchanged_required,
+                   'end-before': directives.unchanged_required,
+                   # ignored except for 'literal' or 'code':
+                   'number-lines': directives.unchanged, # integer or None
+                   'class': directives.class_option,
+                   'name': directives.unchanged}
+
+    standard_include_path = os.path.join(os.path.dirname(states.__file__),
+                                         'include')
+
+    def run(self):
+        """Include a file as part of the content of this reST file."""
+        if not self.state.document.settings.file_insertion_enabled:
+            raise self.warning('"%s" directive disabled.' % self.name)
+        source = self.state_machine.input_lines.source(
+            self.lineno - self.state_machine.input_offset - 1)
+        source_dir = os.path.dirname(os.path.abspath(source))
+        path = directives.path(self.arguments[0])
+        if path.startswith('<') and path.endswith('>'):
+            path = os.path.join(self.standard_include_path, path[1:-1])
+        path = os.path.normpath(os.path.join(source_dir, path))
+        path = utils.relative_path(None, path)
+        path = nodes.reprunicode(path)
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        e_handler=self.state.document.settings.input_encoding_error_handler
+        tab_width = self.options.get(
+            'tab-width', self.state.document.settings.tab_width)
+        try:
+            self.state.document.settings.record_dependencies.add(path)
+            include_file = io.FileInput(source_path=path,
+                                        encoding=encoding,
+                                        error_handler=e_handler)
+        except UnicodeEncodeError, error:
+            raise self.severe(u'Problems with "%s" directive path:\n'
+                              'Cannot encode input file path "%s" '
+                              '(wrong locale?).' %
+                              (self.name, SafeString(path)))
+        except IOError, error:
+            raise self.severe(u'Problems with "%s" directive path:\n%s.' %
+                      (self.name, ErrorString(error)))
+        startline = self.options.get('start-line', None)
+        endline = self.options.get('end-line', None)
+        try:
+            if startline or (endline is not None):
+                lines = include_file.readlines()
+                rawtext = ''.join(lines[startline:endline])
+            else:
+                rawtext = include_file.read()
+        except UnicodeError, error:
+            raise self.severe(u'Problem with "%s" directive:\n%s' %
+                              (self.name, ErrorString(error)))
+        # start-after/end-before: no restrictions on newlines in match-text,
+        # and no restrictions on matching inside lines vs. line boundaries
+        after_text = self.options.get('start-after', None)
+        if after_text:
+            # skip content in rawtext before *and incl.* a matching text
+            after_index = rawtext.find(after_text)
+            if after_index < 0:
+                raise self.severe('Problem with "start-after" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            rawtext = rawtext[after_index + len(after_text):]
+        before_text = self.options.get('end-before', None)
+        if before_text:
+            # skip content in rawtext after *and incl.* a matching text
+            before_index = rawtext.find(before_text)
+            if before_index < 0:
+                raise self.severe('Problem with "end-before" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            rawtext = rawtext[:before_index]
+
+        include_lines = statemachine.string2lines(rawtext, tab_width,
+                                                  convert_whitespace=True)
+        if 'literal' in self.options:
+            # Convert tabs to spaces, if `tab_width` is positive.
+            if tab_width >= 0:
+                text = rawtext.expandtabs(tab_width)
+            else:
+                text = rawtext
+            literal_block = nodes.literal_block(rawtext, source=path,
+                                    classes=self.options.get('class', []))
+            literal_block.line = 1
+            self.add_name(literal_block)
+            if 'number-lines' in self.options:
+                try:
+                    startline = int(self.options['number-lines'] or 1)
+                except ValueError:
+                    raise self.error(':number-lines: with non-integer '
+                                     'start value')
+                endline = startline + len(include_lines)
+                if text.endswith('\n'):
+                    text = text[:-1]
+                tokens = NumberLines([([], text)], startline, endline)
+                for classes, value in tokens:
+                    if classes:
+                        literal_block += nodes.inline(value, value,
+                                                      classes=classes)
+                    else:
+                        literal_block += nodes.Text(value, value)
+            else:
+                literal_block += nodes.Text(text, text)
+            return [literal_block]
+        if 'code' in self.options:
+            self.options['source'] = path
+            codeblock = CodeBlock(self.name,
+                                  [self.options.pop('code')], # arguments
+                                  self.options,
+                                  include_lines, # content
+                                  self.lineno,
+                                  self.content_offset,
+                                  self.block_text,
+                                  self.state,
+                                  self.state_machine)
+            return codeblock.run()
+        self.state_machine.insert_input(include_lines, path)
+        return []
+
+
+class Raw(Directive):
+
+    """
+    Pass through content unchanged
+
+    Content is included in output based on type argument
+
+    Content may be included inline (content section of directive) or
+    imported from a file or url.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding}
+    has_content = True
+
+    def run(self):
+        if (not self.state.document.settings.raw_enabled
+            or (not self.state.document.settings.file_insertion_enabled
+                and ('file' in self.options
+                     or 'url' in self.options))):
+            raise self.warning('"%s" directive disabled.' % self.name)
+        attributes = {'format': ' '.join(self.arguments[0].lower().split())}
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        e_handler=self.state.document.settings.input_encoding_error_handler
+        if self.content:
+            if 'file' in self.options or 'url' in self.options:
+                raise self.error(
+                    '"%s" directive may not both specify an external file '
+                    'and have content.' % self.name)
+            text = '\n'.join(self.content)
+        elif 'file' in self.options:
+            if 'url' in self.options:
+                raise self.error(
+                    'The "file" and "url" options may not be simultaneously '
+                    'specified for the "%s" directive.' % self.name)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            path = os.path.normpath(os.path.join(source_dir,
+                                                 self.options['file']))
+            path = utils.relative_path(None, path)
+            try:
+                raw_file = io.FileInput(source_path=path,
+                                        encoding=encoding,
+                                        error_handler=e_handler)
+                # TODO: currently, raw input files are recorded as
+                # dependencies even if not used for the chosen output format.
+                self.state.document.settings.record_dependencies.add(path)
+            except IOError, error:
+                raise self.severe(u'Problems with "%s" directive path:\n%s.'
+                                  % (self.name, ErrorString(error)))
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(u'Problem with "%s" directive:\n%s'
+                    % (self.name, ErrorString(error)))
+            attributes['source'] = path
+        elif 'url' in self.options:
+            source = self.options['url']
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            try:
+                raw_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError), error:
+                raise self.severe(u'Problems with "%s" directive URL "%s":\n%s.'
+                    % (self.name, self.options['url'], ErrorString(error)))
+            raw_file = io.StringInput(source=raw_text, source_path=source,
+                                      encoding=encoding,
+                                      error_handler=e_handler)
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(u'Problem with "%s" directive:\n%s'
+                                  % (self.name, ErrorString(error)))
+            attributes['source'] = source
+        else:
+            # This will always fail because there is no content.
+            self.assert_has_content()
+        raw_node = nodes.raw('', text, **attributes)
+        (raw_node.source,
+        raw_node.line) = self.state_machine.get_source_and_line(self.lineno)
+        return [raw_node]
+
+
+class Replace(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        element = nodes.Element(text)
+        self.state.nested_parse(self.content, self.content_offset,
+                                element)
+        # element might contain [paragraph] + system_message(s)
+        node = None
+        messages = []
+        for elem in element:
+            if not node and isinstance(elem, nodes.paragraph):
+                node = elem
+            elif isinstance(elem, nodes.system_message):
+                elem['backrefs'] = []
+                messages.append(elem)
+            else:
+                return [
+                    self.state_machine.reporter.error(
+                        'Error in "%s" directive: may contain a single paragraph '
+                        'only.' % (self.name), line=self.lineno) ]
+        if node:
+            return messages + node.children
+        return messages
+
+class Unicode(Directive):
+
+    r"""
+    Convert Unicode character codes (numbers) to characters.  Codes may be
+    decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
+    ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
+    entities (e.g. ``&#x262E;``).  Text following ".." is a comment and is
+    ignored.  Spaces are ignored, and any other text remains as-is.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'trim': directives.flag,
+                   'ltrim': directives.flag,
+                   'rtrim': directives.flag}
+
+    comment_pattern = re.compile(r'( |\n|^)\.\. ')
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        substitution_definition = self.state_machine.node
+        if 'trim' in self.options:
+            substitution_definition.attributes['ltrim'] = 1
+            substitution_definition.attributes['rtrim'] = 1
+        if 'ltrim' in self.options:
+            substitution_definition.attributes['ltrim'] = 1
+        if 'rtrim' in self.options:
+            substitution_definition.attributes['rtrim'] = 1
+        codes = self.comment_pattern.split(self.arguments[0])[0].split()
+        element = nodes.Element()
+        for code in codes:
+            try:
+                decoded = directives.unicode_code(code)
+            except ValueError, error:
+                raise self.error(u'Invalid character code: %s\n%s'
+                    % (code, ErrorString(error)))
+            element += nodes.Text(decoded)
+        return element.children
+
+
+class Class(Directive):
+
+    """
+    Set a "class" attribute on the directive content or the next element.
+    When applied to the next element, a "pending" element is inserted, and a
+    transform does the work later.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    has_content = True
+
+    def run(self):
+        try:
+            class_value = directives.class_option(self.arguments[0])
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node_list = []
+        if self.content:
+            container = nodes.Element()
+            self.state.nested_parse(self.content, self.content_offset,
+                                    container)
+            for node in container:
+                node['classes'].extend(class_value)
+            node_list.extend(container.children)
+        else:
+            pending = nodes.pending(
+                misc.ClassAttribute,
+                {'class': class_value, 'directive': self.name},
+                self.block_text)
+            self.state_machine.document.note_pending(pending)
+            node_list.append(pending)
+        return node_list
+
+
+class Role(Directive):
+
+    has_content = True
+
+    argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
+                                  % ((states.Inliner.simplename,) * 2))
+
+    def run(self):
+        """Dynamically create and register a custom interpreted text role."""
+        if self.content_offset > self.lineno or not self.content:
+            raise self.error('"%s" directive requires arguments on the first '
+                             'line.' % self.name)
+        args = self.content[0]
+        match = self.argument_pattern.match(args)
+        if not match:
+            raise self.error('"%s" directive arguments not valid role names: '
+                             '"%s".' % (self.name, args))
+        new_role_name = match.group(1)
+        base_role_name = match.group(3)
+        messages = []
+        if base_role_name:
+            base_role, messages = roles.role(
+                base_role_name, self.state_machine.language, self.lineno,
+                self.state.reporter)
+            if base_role is None:
+                error = self.state.reporter.error(
+                    'Unknown interpreted text role "%s".' % base_role_name,
+                    nodes.literal_block(self.block_text, self.block_text),
+                    line=self.lineno)
+                return messages + [error]
+        else:
+            base_role = roles.generic_custom_role
+        assert not hasattr(base_role, 'arguments'), (
+            'Supplemental directive arguments for "%s" directive not '
+            'supported (specified by "%r" role).' % (self.name, base_role))
+        try:
+            converted_role = convert_directive_function(base_role)
+            (arguments, options, content, content_offset) = (
+                self.state.parse_directive_block(
+                self.content[1:], self.content_offset, converted_role,
+                option_presets={}))
+        except states.MarkupError, detail:
+            error = self.state_machine.reporter.error(
+                'Error in "%s" directive:\n%s.' % (self.name, detail),
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        if 'class' not in options:
+            try:
+                options['class'] = directives.class_option(new_role_name)
+            except ValueError, detail:
+                error = self.state_machine.reporter.error(
+                    u'Invalid argument for "%s" directive:\n%s.'
+                    % (self.name, SafeString(detail)), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return messages + [error]
+        role = roles.CustomRole(new_role_name, base_role, options, content)
+        roles.register_local_role(new_role_name, role)
+        return messages
+
+
+class DefaultRole(Directive):
+
+    """Set the default interpreted text role."""
+
+    optional_arguments = 1
+    final_argument_whitespace = False
+
+    def run(self):
+        if not self.arguments:
+            if '' in roles._roles:
+                # restore the "default" default role
+                del roles._roles['']
+            return []
+        role_name = self.arguments[0]
+        role, messages = roles.role(role_name, self.state_machine.language,
+                                    self.lineno, self.state.reporter)
+        if role is None:
+            error = self.state.reporter.error(
+                'Unknown interpreted text role "%s".' % role_name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        roles._roles[''] = role
+        # @@@ should this be local to the document, not the parser?
+        return messages
+
+
+class Title(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+
+    def run(self):
+        self.state_machine.document['title'] = self.arguments[0]
+        return []
+
+
+class Date(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        format_str = '\n'.join(self.content) or '%Y-%m-%d'
+        if sys.version_info< (3, 0):
+            try:
+                format_str = format_str.encode(locale_encoding or 'utf-8')
+            except UnicodeEncodeError:
+                raise self.warning(u'Cannot encode date format string '
+                    u'with locale encoding "%s".' % locale_encoding)
+        # @@@
+        # Use timestamp from the `SOURCE_DATE_EPOCH`_ environment variable?
+        # Pro: Docutils-generated documentation
+        #      can easily be part of `reproducible software builds`__
+        #
+        #      __ https://reproducible-builds.org/
+        #
+        # Con: Changes the specs, hard to predict behaviour,
+        #      no actual use case!
+        #
+        # See also the discussion about \date \time \year in TeX
+        # http://tug.org/pipermail/tex-k/2016-May/002704.html
+        # source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH')
+        # if (source_date_epoch
+        #     and self.state.document.settings.use_source_date_epoch):
+        #     text = time.strftime(format_str,
+        #                          time.gmtime(int(source_date_epoch)))
+        # else:
+        text = time.strftime(format_str)
+        if sys.version_info< (3, 0):
+            # `text` is a byte string that may contain non-ASCII characters:
+            try:
+                text = text.decode(locale_encoding or 'utf-8')
+            except UnicodeDecodeError:
+                text = text.decode(locale_encoding or 'utf-8', 'replace')
+                raise self.warning(u'Error decoding "%s"'
+                    u'with locale encoding "%s".' % (text, locale_encoding))
+        return [nodes.Text(text)]
+
+
+class TestDirective(Directive):
+
+    """This directive is useful only for testing purposes."""
+
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'option': directives.unchanged_required}
+    has_content = True
+
+    def run(self):
+        if self.content:
+            text = '\n'.join(self.content)
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content:' % (self.name, self.arguments, self.options),
+                nodes.literal_block(text, text), line=self.lineno)
+        else:
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content: None' % (self.name, self.arguments, self.options),
+                line=self.lineno)
+        return [info]
+
+# Old-style, functional definition:
+#
+# def directive_test_function(name, arguments, options, content, lineno,
+#                             content_offset, block_text, state, state_machine):
+#     """This directive is useful only for testing purposes."""
+#     if content:
+#         text = '\n'.join(content)
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content:' % (name, arguments, options),
+#             nodes.literal_block(text, text), line=lineno)
+#     else:
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content: None' % (name, arguments, options), line=lineno)
+#     return [info]
+#
+# directive_test_function.arguments = (0, 1, 1)
+# directive_test_function.options = {'option': directives.unchanged_required}
+# directive_test_function.content = 1
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/body.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/body.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/body.py	(revision 1126)
@@ -0,0 +1,289 @@
+# $Id: body.py 7267 2011-12-20 14:14:21Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for additional body elements.
+
+See `docutils.parsers.rst.directives` for API details.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.roles import set_classes
+from docutils.utils.code_analyzer import Lexer, LexerError, NumberLines
+
+class BasePseudoSection(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+    has_content = True
+
+    node_class = None
+    """Node class to be used (must be set in subclasses)."""
+
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        self.assert_has_content()
+        title_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(title_text, self.lineno)
+        titles = [nodes.title(title_text, '', *textnodes)]
+        # Sidebar uses this code.
+        if 'subtitle' in self.options:
+            textnodes, more_messages = self.state.inline_text(
+                self.options['subtitle'], self.lineno)
+            titles.append(nodes.subtitle(self.options['subtitle'], '',
+                                         *textnodes))
+            messages.extend(more_messages)
+        text = '\n'.join(self.content)
+        node = self.node_class(text, *(titles + messages))
+        node['classes'] += self.options.get('class', [])
+        self.add_name(node)
+        if text:
+            self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Topic(BasePseudoSection):
+
+    node_class = nodes.topic
+
+
+class Sidebar(BasePseudoSection):
+
+    node_class = nodes.sidebar
+
+    option_spec = BasePseudoSection.option_spec.copy()
+    option_spec['subtitle'] = directives.unchanged_required
+
+    def run(self):
+        if isinstance(self.state_machine.node, nodes.sidebar):
+            raise self.error('The "%s" directive may not be used within a '
+                             'sidebar element.' % self.name)
+        return BasePseudoSection.run(self)
+
+
+class LineBlock(Directive):
+
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        block = nodes.line_block(classes=self.options.get('class', []))
+        self.add_name(block)
+        node_list = [block]
+        for line_text in self.content:
+            text_nodes, messages = self.state.inline_text(
+                line_text.strip(), self.lineno + self.content_offset)
+            line = nodes.line(line_text, '', *text_nodes)
+            if line_text.strip():
+                line.indent = len(line_text) - len(line_text.lstrip())
+            block += line
+            node_list.extend(messages)
+            self.content_offset += 1
+        self.state.nest_line_block_lines(block)
+        return node_list
+
+
+class ParsedLiteral(Directive):
+
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+    has_content = True
+
+    def run(self):
+        set_classes(self.options)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        text_nodes, messages = self.state.inline_text(text, self.lineno)
+        node = nodes.literal_block(text, '', *text_nodes, **self.options)
+        node.line = self.content_offset + 1
+        self.add_name(node)
+        return [node] + messages
+
+
+class CodeBlock(Directive):
+    """Parse and mark up content of a code block.
+
+    Configuration setting: syntax_highlight
+       Highlight Code content with Pygments?
+       Possible values: ('long', 'short', 'none')
+
+    """
+    optional_arguments = 1
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged,
+                   'number-lines': directives.unchanged # integer or None
+                  }
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        if self.arguments:
+            language = self.arguments[0]
+        else:
+            language = ''
+        set_classes(self.options)
+        classes = ['code']
+        if language:
+            classes.append(language)
+        if 'classes' in self.options:
+            classes.extend(self.options['classes'])
+
+        # set up lexical analyzer
+        try:
+            tokens = Lexer(u'\n'.join(self.content), language,
+                           self.state.document.settings.syntax_highlight)
+        except LexerError, error:
+            raise self.warning(error)
+
+        if 'number-lines' in self.options:
+            # optional argument `startline`, defaults to 1
+            try:
+                startline = int(self.options['number-lines'] or 1)
+            except ValueError:
+                raise self.error(':number-lines: with non-integer start value')
+            endline = startline + len(self.content)
+            # add linenumber filter:
+            tokens = NumberLines(tokens, startline, endline)
+
+        node = nodes.literal_block('\n'.join(self.content), classes=classes)
+        self.add_name(node)
+        # if called from "include", set the source
+        if 'source' in self.options:
+            node.attributes['source'] = self.options['source']
+        # analyze content and add nodes for every token
+        for classes, value in tokens:
+            # print (classes, value)
+            if classes:
+                node += nodes.inline(value, value, classes=classes)
+            else:
+                # insert as Text to decrease the verbosity of the output
+                node += nodes.Text(value, value)
+
+        return [node]
+
+
+class MathBlock(Directive):
+
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+                   ## TODO: Add Sphinx' ``mathbase.py`` option 'nowrap'?
+                   # 'nowrap': directives.flag,
+    has_content = True
+
+    def run(self):
+        set_classes(self.options)
+        self.assert_has_content()
+        # join lines, separate blocks
+        content = '\n'.join(self.content).split('\n\n')
+        _nodes = []
+        for block in content:
+            if not block:
+                continue
+            node = nodes.math_block(self.block_text, block, **self.options)
+            node.line = self.content_offset + 1
+            self.add_name(node)
+            _nodes.append(node)
+        return _nodes
+
+
+class Rubric(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+
+    def run(self):
+        set_classes(self.options)
+        rubric_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(rubric_text, self.lineno)
+        rubric = nodes.rubric(rubric_text, '', *textnodes, **self.options)
+        self.add_name(rubric)
+        return [rubric] + messages
+
+
+class BlockQuote(Directive):
+
+    has_content = True
+    classes = []
+
+    def run(self):
+        self.assert_has_content()
+        elements = self.state.block_quote(self.content, self.content_offset)
+        for element in elements:
+            if isinstance(element, nodes.block_quote):
+                element['classes'] += self.classes
+        return elements
+
+
+class Epigraph(BlockQuote):
+
+    classes = ['epigraph']
+
+
+class Highlights(BlockQuote):
+
+    classes = ['highlights']
+
+
+class PullQuote(BlockQuote):
+
+    classes = ['pull-quote']
+
+
+class Compound(Directive):
+
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        node = nodes.compound(text)
+        node['classes'] += self.options.get('class', [])
+        self.add_name(node)
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Container(Directive):
+
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'name': directives.unchanged}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        try:
+            if self.arguments:
+                classes = directives.class_option(self.arguments[0])
+            else:
+                classes = []
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node = nodes.container(text)
+        node['classes'].extend(classes)
+        self.add_name(node)
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/__init__.py	(revision 1126)
@@ -0,0 +1,416 @@
+# $Id: __init__.py 7785 2015-02-08 23:51:45Z grubert $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains directive implementation modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import codecs
+import sys
+
+from docutils import nodes
+from docutils.parsers.rst.languages import en as _fallback_language_module
+if sys.version_info < (2,5):
+    from docutils._compat import __import__
+
+
+_directive_registry = {
+      'attention': ('admonitions', 'Attention'),
+      'caution': ('admonitions', 'Caution'),
+      'code': ('body', 'CodeBlock'),
+      'danger': ('admonitions', 'Danger'),
+      'error': ('admonitions', 'Error'),
+      'important': ('admonitions', 'Important'),
+      'note': ('admonitions', 'Note'),
+      'tip': ('admonitions', 'Tip'),
+      'hint': ('admonitions', 'Hint'),
+      'warning': ('admonitions', 'Warning'),
+      'admonition': ('admonitions', 'Admonition'),
+      'sidebar': ('body', 'Sidebar'),
+      'topic': ('body', 'Topic'),
+      'line-block': ('body', 'LineBlock'),
+      'parsed-literal': ('body', 'ParsedLiteral'),
+      'math': ('body', 'MathBlock'),
+      'rubric': ('body', 'Rubric'),
+      'epigraph': ('body', 'Epigraph'),
+      'highlights': ('body', 'Highlights'),
+      'pull-quote': ('body', 'PullQuote'),
+      'compound': ('body', 'Compound'),
+      'container': ('body', 'Container'),
+      #'questions': ('body', 'question_list'),
+      'table': ('tables', 'RSTTable'),
+      'csv-table': ('tables', 'CSVTable'),
+      'list-table': ('tables', 'ListTable'),
+      'image': ('images', 'Image'),
+      'figure': ('images', 'Figure'),
+      'contents': ('parts', 'Contents'),
+      'sectnum': ('parts', 'Sectnum'),
+      'header': ('parts', 'Header'),
+      'footer': ('parts', 'Footer'),
+      #'footnotes': ('parts', 'footnotes'),
+      #'citations': ('parts', 'citations'),
+      'target-notes': ('references', 'TargetNotes'),
+      'meta': ('html', 'Meta'),
+      #'imagemap': ('html', 'imagemap'),
+      'raw': ('misc', 'Raw'),
+      'include': ('misc', 'Include'),
+      'replace': ('misc', 'Replace'),
+      'unicode': ('misc', 'Unicode'),
+      'class': ('misc', 'Class'),
+      'role': ('misc', 'Role'),
+      'default-role': ('misc', 'DefaultRole'),
+      'title': ('misc', 'Title'),
+      'date': ('misc', 'Date'),
+      'restructuredtext-test-directive': ('misc', 'TestDirective'),}
+"""Mapping of directive name to (module name, class name).  The
+directive name is canonical & must be lowercase.  Language-dependent
+names are defined in the ``language`` subpackage."""
+
+_directives = {}
+"""Cache of imported directives."""
+
+def directive(directive_name, language_module, document):
+    """
+    Locate and return a directive function from its language-dependent name.
+    If not found in the current language, check English.  Return None if the
+    named directive cannot be found.
+    """
+    normname = directive_name.lower()
+    messages = []
+    msg_text = []
+    if normname in _directives:
+        return _directives[normname], messages
+    canonicalname = None
+    try:
+        canonicalname = language_module.directives[normname]
+    except AttributeError, error:
+        msg_text.append('Problem retrieving directive entry from language '
+                        'module %r: %s.' % (language_module, error))
+    except KeyError:
+        msg_text.append('No directive entry for "%s" in module "%s".'
+                        % (directive_name, language_module.__name__))
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.directives[normname]
+            msg_text.append('Using English fallback for directive "%s".'
+                            % directive_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical directive name.'
+                            % directive_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+    if msg_text:
+        message = document.reporter.info(
+            '\n'.join(msg_text), line=document.current_line)
+        messages.append(message)
+    try:
+        modulename, classname = _directive_registry[canonicalname]
+    except KeyError:
+        # Error handling done by caller.
+        return None, messages
+    try:
+        module = __import__(modulename, globals(), locals(), level=1)
+    except ImportError, detail:
+        messages.append(document.reporter.error(
+            'Error importing directive module "%s" (directive "%s"):\n%s'
+            % (modulename, directive_name, detail),
+            line=document.current_line))
+        return None, messages
+    try:
+        directive = getattr(module, classname)
+        _directives[normname] = directive
+    except AttributeError:
+        messages.append(document.reporter.error(
+            'No directive class "%s" in module "%s" (directive "%s").'
+            % (classname, modulename, directive_name),
+            line=document.current_line))
+        return None, messages
+    return directive, messages
+
+def register_directive(name, directive):
+    """
+    Register a nonstandard application-defined directive function.
+    Language lookups are not needed for such functions.
+    """
+    _directives[name] = directive
+
+def flag(argument):
+    """
+    Check for a valid flag option (no argument) and return ``None``.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if an argument is found.
+    """
+    if argument and argument.strip():
+        raise ValueError('no argument is allowed; "%s" supplied' % argument)
+    else:
+        return None
+
+def unchanged_required(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        return argument  # unchanged!
+
+def unchanged(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    No argument implies empty string ("").
+    """
+    if argument is None:
+        return u''
+    else:
+        return argument  # unchanged!
+
+def path(argument):
+    """
+    Return the path argument unwrapped (with newlines removed).
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        path = ''.join([s.strip() for s in argument.splitlines()])
+        return path
+
+def uri(argument):
+    """
+    Return the URI argument with whitespace removed.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        uri = ''.join(argument.split())
+        return uri
+
+def nonnegative_int(argument):
+    """
+    Check for a nonnegative integer argument; raise ``ValueError`` if not.
+    (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+def percentage(argument):
+    """
+    Check for an integer percentage value with optional percent sign.
+    """
+    try:
+        argument = argument.rstrip(' %')
+    except AttributeError:
+        pass
+    return nonnegative_int(argument)
+
+length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc']
+
+def get_measure(argument, units):
+    """
+    Check for a positive argument of one of the units and return a
+    normalized string of the form "<value><unit>" (without space in
+    between).
+
+    To be called from directive option conversion functions.
+    """
+    match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument)
+    try:
+        float(match.group(1))
+    except (AttributeError, ValueError):
+        raise ValueError(
+            'not a positive measure of one of the following units:\n%s'
+            % ' '.join(['"%s"' % i for i in units]))
+    return match.group(1) + match.group(2)
+
+def length_or_unitless(argument):
+    return get_measure(argument, length_units + [''])
+
+def length_or_percentage_or_unitless(argument, default=''):
+    """
+    Return normalized string of a length or percentage unit.
+
+    Add <default> if there is no unit. Raise ValueError if the argument is not
+    a positive measure of one of the valid CSS units (or without unit).
+
+    >>> length_or_percentage_or_unitless('3 pt')
+    '3pt'
+    >>> length_or_percentage_or_unitless('3%', 'em')
+    '3%'
+    >>> length_or_percentage_or_unitless('3')
+    '3'
+    >>> length_or_percentage_or_unitless('3', 'px')
+    '3px'
+    """
+    try:
+        return get_measure(argument, length_units + ['%'])
+    except ValueError:
+        try:
+            return get_measure(argument, ['']) + default
+        except ValueError:
+            # raise ValueError with list of valid units:
+            return get_measure(argument, length_units + ['%'])
+
+def class_option(argument):
+    """
+    Convert the argument into a list of ID-compatible strings and return it.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    names = argument.split()
+    class_names = []
+    for name in names:
+        class_name = nodes.make_id(name)
+        if not class_name:
+            raise ValueError('cannot make "%s" into a class name' % name)
+        class_names.append(class_name)
+    return class_names
+
+unicode_pattern = re.compile(
+    r'(?:0x|x|\\x|U\+?|\\u)([0-9a-f]+)$|&#x([0-9a-f]+);$', re.IGNORECASE)
+
+def unicode_code(code):
+    r"""
+    Convert a Unicode character code to a Unicode character.
+    (Directive option conversion function.)
+
+    Codes may be decimal numbers, hexadecimal numbers (prefixed by ``0x``,
+    ``x``, ``\x``, ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style
+    numeric character entities (e.g. ``&#x262E;``).  Other text remains as-is.
+
+    Raise ValueError for illegal Unicode code values.
+    """
+    try:
+        if code.isdigit():                  # decimal number
+            return unichr(int(code))
+        else:
+            match = unicode_pattern.match(code)
+            if match:                       # hex number
+                value = match.group(1) or match.group(2)
+                return unichr(int(value, 16))
+            else:                           # other text
+                return code
+    except OverflowError, detail:
+        raise ValueError('code too large (%s)' % detail)
+
+def single_char_or_unicode(argument):
+    """
+    A single character is returned as-is.  Unicode characters codes are
+    converted as in `unicode_code`.  (Directive option conversion function.)
+    """
+    char = unicode_code(argument)
+    if len(char) > 1:
+        raise ValueError('%r invalid; must be a single character or '
+                         'a Unicode code' % char)
+    return char
+
+def single_char_or_whitespace_or_unicode(argument):
+    """
+    As with `single_char_or_unicode`, but "tab" and "space" are also supported.
+    (Directive option conversion function.)
+    """
+    if argument == 'tab':
+        char = '\t'
+    elif argument == 'space':
+        char = ' '
+    else:
+        char = single_char_or_unicode(argument)
+    return char
+
+def positive_int(argument):
+    """
+    Converts the argument into an integer.  Raises ValueError for negative,
+    zero, or non-integer values.  (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 1:
+        raise ValueError('negative or zero value; must be positive')
+    return value
+
+def positive_int_list(argument):
+    """
+    Converts a space- or comma-separated list of values into a Python list
+    of integers.
+    (Directive option conversion function.)
+
+    Raises ValueError for non-positive-integer values.
+    """
+    if ',' in argument:
+        entries = argument.split(',')
+    else:
+        entries = argument.split()
+    return [positive_int(entry) for entry in entries]
+
+def encoding(argument):
+    """
+    Verfies the encoding argument by lookup.
+    (Directive option conversion function.)
+
+    Raises ValueError for unknown encodings.
+    """
+    try:
+        codecs.lookup(argument)
+    except LookupError:
+        raise ValueError('unknown encoding: "%s"' % argument)
+    return argument
+
+def choice(argument, values):
+    """
+    Directive option utility function, supplied to enable options whose
+    argument must be a member of a finite set of possible values (must be
+    lower case).  A custom conversion function must be written to use it.  For
+    example::
+
+        from docutils.parsers.rst import directives
+
+        def yesno(argument):
+            return directives.choice(argument, ('yes', 'no'))
+
+    Raise ``ValueError`` if no argument is found or if the argument's value is
+    not valid (not an entry in the supplied list).
+    """
+    try:
+        value = argument.lower().strip()
+    except AttributeError:
+        raise ValueError('must supply an argument; choose from %s'
+                         % format_values(values))
+    if value in values:
+        return value
+    else:
+        raise ValueError('"%s" unknown; choose from %s'
+                         % (argument, format_values(values)))
+
+def format_values(values):
+    return '%s, or "%s"' % (', '.join(['"%s"' % s for s in values[:-1]]),
+                            values[-1])
+
+def value_or(values, other):
+    """
+    The argument can be any of `values` or `argument_type`.
+    """
+    def auto_or_other(argument):
+        if argument in values:
+            return argument
+        else:
+            return other(argument)
+    return auto_or_other
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/references.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/references.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/directives/references.py	(revision 1126)
@@ -0,0 +1,29 @@
+# $Id: references.py 7062 2011-06-30 22:14:29Z milde $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for references and targets.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import references
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class TargetNotes(Directive):
+
+    """Target footnote generation."""
+
+    option_spec = {'class': directives.class_option,
+                   'name': directives.unchanged}
+
+    def run(self):
+        pending = nodes.pending(references.TargetNotes)
+        self.add_name(pending)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        return [pending]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlextra.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlextra.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlextra.txt	(revision 1126)
@@ -0,0 +1,87 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isocyr1.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isocyr1.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isocyr1.txt	(revision 1126)
@@ -0,0 +1,73 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Acy|    unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A
+.. |acy|    unicode:: U+00430 .. CYRILLIC SMALL LETTER A
+.. |Bcy|    unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE
+.. |bcy|    unicode:: U+00431 .. CYRILLIC SMALL LETTER BE
+.. |CHcy|   unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE
+.. |chcy|   unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE
+.. |Dcy|    unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE
+.. |dcy|    unicode:: U+00434 .. CYRILLIC SMALL LETTER DE
+.. |Ecy|    unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E
+.. |ecy|    unicode:: U+0044D .. CYRILLIC SMALL LETTER E
+.. |Fcy|    unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF
+.. |fcy|    unicode:: U+00444 .. CYRILLIC SMALL LETTER EF
+.. |Gcy|    unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE
+.. |gcy|    unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE
+.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN
+.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN
+.. |Icy|    unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I
+.. |icy|    unicode:: U+00438 .. CYRILLIC SMALL LETTER I
+.. |IEcy|   unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE
+.. |iecy|   unicode:: U+00435 .. CYRILLIC SMALL LETTER IE
+.. |IOcy|   unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO
+.. |iocy|   unicode:: U+00451 .. CYRILLIC SMALL LETTER IO
+.. |Jcy|    unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I
+.. |jcy|    unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I
+.. |Kcy|    unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA
+.. |kcy|    unicode:: U+0043A .. CYRILLIC SMALL LETTER KA
+.. |KHcy|   unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA
+.. |khcy|   unicode:: U+00445 .. CYRILLIC SMALL LETTER HA
+.. |Lcy|    unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL
+.. |lcy|    unicode:: U+0043B .. CYRILLIC SMALL LETTER EL
+.. |Mcy|    unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM
+.. |mcy|    unicode:: U+0043C .. CYRILLIC SMALL LETTER EM
+.. |Ncy|    unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN
+.. |ncy|    unicode:: U+0043D .. CYRILLIC SMALL LETTER EN
+.. |numero| unicode:: U+02116 .. NUMERO SIGN
+.. |Ocy|    unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O
+.. |ocy|    unicode:: U+0043E .. CYRILLIC SMALL LETTER O
+.. |Pcy|    unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE
+.. |pcy|    unicode:: U+0043F .. CYRILLIC SMALL LETTER PE
+.. |Rcy|    unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER
+.. |rcy|    unicode:: U+00440 .. CYRILLIC SMALL LETTER ER
+.. |Scy|    unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES
+.. |scy|    unicode:: U+00441 .. CYRILLIC SMALL LETTER ES
+.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA
+.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA
+.. |SHcy|   unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA
+.. |shcy|   unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA
+.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN
+.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN
+.. |Tcy|    unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE
+.. |tcy|    unicode:: U+00442 .. CYRILLIC SMALL LETTER TE
+.. |TScy|   unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE
+.. |tscy|   unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE
+.. |Ucy|    unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U
+.. |ucy|    unicode:: U+00443 .. CYRILLIC SMALL LETTER U
+.. |Vcy|    unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE
+.. |vcy|    unicode:: U+00432 .. CYRILLIC SMALL LETTER VE
+.. |YAcy|   unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA
+.. |yacy|   unicode:: U+0044F .. CYRILLIC SMALL LETTER YA
+.. |Ycy|    unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU
+.. |ycy|    unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU
+.. |YUcy|   unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU
+.. |yucy|   unicode:: U+0044E .. CYRILLIC SMALL LETTER YU
+.. |Zcy|    unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE
+.. |zcy|    unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE
+.. |ZHcy|   unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE
+.. |zhcy|   unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isocyr2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isocyr2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isocyr2.txt	(revision 1126)
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |DJcy|   unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE
+.. |djcy|   unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE
+.. |DScy|   unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE
+.. |dscy|   unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE
+.. |DZcy|   unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE
+.. |dzcy|   unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE
+.. |GJcy|   unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE
+.. |gjcy|   unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE
+.. |Iukcy|  unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |iukcy|  unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE
+.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE
+.. |Jukcy|  unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE
+.. |jukcy|  unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE
+.. |KJcy|   unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE
+.. |kjcy|   unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE
+.. |LJcy|   unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE
+.. |ljcy|   unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE
+.. |NJcy|   unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE
+.. |njcy|   unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE
+.. |TSHcy|  unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE
+.. |tshcy|  unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE
+.. |Ubrcy|  unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U
+.. |ubrcy|  unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U
+.. |YIcy|   unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI
+.. |yicy|   unicode:: U+00457 .. CYRILLIC SMALL LETTER YI
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-special.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-special.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-special.txt	(revision 1126)
@@ -0,0 +1,37 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |bdquo|  unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |circ|   unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |euro|   unicode:: U+020AC .. EURO SIGN
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lrm|    unicode:: U+0200E .. LEFT-TO-RIGHT MARK
+.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |permil| unicode:: U+02030 .. PER MILLE SIGN
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rlm|    unicode:: U+0200F .. RIGHT-TO-LEFT MARK
+.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sbquo|  unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |tilde|  unicode:: U+002DC .. SMALL TILDE
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |zwj|    unicode:: U+0200D .. ZERO WIDTH JOINER
+.. |zwnj|   unicode:: U+0200C .. ZERO WIDTH NON-JOINER
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsa.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsa.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsa.txt	(revision 1126)
@@ -0,0 +1,162 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angzarr|  unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+.. |cirmid|   unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE
+.. |cudarrl|  unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW
+.. |cudarrr|  unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+.. |cularr|   unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |cularrp|  unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+.. |curarr|   unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |curarrm|  unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS
+.. |Darr|     unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr2|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |ddarr|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM
+.. |dfisht|   unicode:: U+0297F .. DOWN FISH TAIL
+.. |dHar|     unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |dharl|    unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |dharr|    unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |dlarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |drarr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |duarr|    unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |duhar|    unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW
+.. |erarr|    unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |harrcir|  unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+.. |harrw|    unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |hoarr|    unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW
+.. |imof|     unicode:: U+022B7 .. IMAGE OF
+.. |lAarr|    unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |Larr|     unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |larr2|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |larrbfs|  unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |larrfs|   unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND
+.. |larrhk|   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |larrlp|   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |larrpl|   unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW
+.. |larrsim|  unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR
+.. |larrtl|   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |lAtail|   unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL
+.. |latail|   unicode:: U+02919 .. LEFTWARDS ARROW-TAIL
+.. |lBarr|    unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW
+.. |lbarr|    unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW
+.. |ldca|     unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+.. |ldrdhar|  unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON
+.. |ldsh|     unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS
+.. |lfisht|   unicode:: U+0297C .. LEFT FISH TAIL
+.. |lHar|     unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |lhard|    unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |lharu|    unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |lharul|   unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |llarr|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |llhard|   unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |loarr|    unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW
+.. |lrarr|    unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrarr2|   unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrhar|    unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhar2|   unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhard|   unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |lsh|      unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON
+.. |luruhar|  unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+.. |Map|      unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR
+.. |map|      unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |midcir|   unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW
+.. |mumap|    unicode:: U+022B8 .. MULTIMAP
+.. |nearhk|   unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK
+.. |neArr|    unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW
+.. |nearr|    unicode:: U+02197 .. NORTH EAST ARROW
+.. |nesear|   unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |nhArr|    unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nharr|    unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nlArr|    unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nlarr|    unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nrArr|    unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrarr|    unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nrarrc|   unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash
+.. |nrarrw|   unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash
+.. |nvHarr|   unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvlArr|   unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvrArr|   unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nwarhk|   unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK
+.. |nwArr|    unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW
+.. |nwarr|    unicode:: U+02196 .. NORTH WEST ARROW
+.. |nwnear|   unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW
+.. |olarr|    unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |orarr|    unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |origof|   unicode:: U+022B6 .. ORIGINAL OF
+.. |rAarr|    unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rarr|     unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |rarr2|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rarrap|   unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+.. |rarrbfs|  unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |rarrc|    unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT
+.. |rarrfs|   unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND
+.. |rarrhk|   unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |rarrlp|   unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |rarrpl|   unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW
+.. |rarrsim|  unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+.. |Rarrtl|   unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+.. |rarrtl|   unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |rarrw|    unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |rAtail|   unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL
+.. |ratail|   unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL
+.. |RBarr|    unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |rBarr|    unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |rbarr|    unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |rdca|     unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+.. |rdldhar|  unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |rdsh|     unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS
+.. |rfisht|   unicode:: U+0297D .. RIGHT FISH TAIL
+.. |rHar|     unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |rhard|    unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rharu|    unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rharul|   unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |rlarr|    unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlarr2|   unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlhar|    unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rlhar2|   unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |roarr|    unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW
+.. |rrarr|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rsh|      unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |ruluhar|  unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+.. |searhk|   unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |seArr|    unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW
+.. |searr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |seswar|   unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |simrarr|  unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+.. |slarr|    unicode:: U+02190 .. LEFTWARDS ARROW
+.. |srarr|    unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |swarhk|   unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |swArr|    unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW
+.. |swarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |swnwar|   unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW
+.. |Uarr|     unicode:: U+0219F .. UPWARDS TWO HEADED ARROW
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr2|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+.. |udarr|    unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |udhar|    unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |ufisht|   unicode:: U+0297E .. UP FISH TAIL
+.. |uHar|     unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |uharl|    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |uharr|    unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |uuarr|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |vArr|     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |varr|     unicode:: U+02195 .. UP DOWN ARROW
+.. |xhArr|    unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |xharr|    unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |xlArr|    unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |xlarr|    unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |xmap|     unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |xrArr|    unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |xrarr|    unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |zigrarr|  unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsb.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsb.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsb.txt	(revision 1126)
@@ -0,0 +1,126 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ac|       unicode:: U+0223E .. INVERTED LAZY S
+.. |acE|      unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline
+.. |amalg|    unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT
+.. |barvee|   unicode:: U+022BD .. NOR
+.. |Barwed|   unicode:: U+02306 .. PERSPECTIVE
+.. |barwed|   unicode:: U+02305 .. PROJECTIVE
+.. |bsolb|    unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH
+.. |Cap|      unicode:: U+022D2 .. DOUBLE INTERSECTION
+.. |capand|   unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND
+.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION
+.. |capcap|   unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+.. |capcup|   unicode:: U+02A47 .. INTERSECTION ABOVE UNION
+.. |capdot|   unicode:: U+02A40 .. INTERSECTION WITH DOT
+.. |caps|     unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs
+.. |ccaps|    unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS
+.. |ccups|    unicode:: U+02A4C .. CLOSED UNION WITH SERIFS
+.. |ccupssm|  unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+.. |coprod|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Cup|      unicode:: U+022D3 .. DOUBLE UNION
+.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION
+.. |cupcap|   unicode:: U+02A46 .. UNION ABOVE INTERSECTION
+.. |cupcup|   unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION
+.. |cupdot|   unicode:: U+0228D .. MULTISET MULTIPLICATION
+.. |cupor|    unicode:: U+02A45 .. UNION WITH LOGICAL OR
+.. |cups|     unicode:: U+0222A U+0FE00 .. UNION with serifs
+.. |cuvee|    unicode:: U+022CE .. CURLY LOGICAL OR
+.. |cuwed|    unicode:: U+022CF .. CURLY LOGICAL AND
+.. |Dagger|   unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger|   unicode:: U+02020 .. DAGGER
+.. |diam|     unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |divonx|   unicode:: U+022C7 .. DIVISION TIMES
+.. |eplus|    unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN
+.. |hercon|   unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX
+.. |intcal|   unicode:: U+022BA .. INTERCALATE
+.. |iprod|    unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |loplus|   unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE
+.. |lotimes|  unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+.. |lthree|   unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |ltimes|   unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |midast|   unicode:: U+0002A .. ASTERISK
+.. |minusb|   unicode:: U+0229F .. SQUARED MINUS
+.. |minusd|   unicode:: U+02238 .. DOT MINUS
+.. |minusdu|  unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW
+.. |ncap|     unicode:: U+02A43 .. INTERSECTION WITH OVERBAR
+.. |ncup|     unicode:: U+02A42 .. UNION WITH OVERBAR
+.. |oast|     unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |ocir|     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |odash|    unicode:: U+0229D .. CIRCLED DASH
+.. |odiv|     unicode:: U+02A38 .. CIRCLED DIVISION SIGN
+.. |odot|     unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |odsold|   unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+.. |ofcir|    unicode:: U+029BF .. CIRCLED BULLET
+.. |ogt|      unicode:: U+029C1 .. CIRCLED GREATER-THAN
+.. |ohbar|    unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR
+.. |olcir|    unicode:: U+029BE .. CIRCLED WHITE BULLET
+.. |olt|      unicode:: U+029C0 .. CIRCLED LESS-THAN
+.. |omid|     unicode:: U+029B6 .. CIRCLED VERTICAL BAR
+.. |ominus|   unicode:: U+02296 .. CIRCLED MINUS
+.. |opar|     unicode:: U+029B7 .. CIRCLED PARALLEL
+.. |operp|    unicode:: U+029B9 .. CIRCLED PERPENDICULAR
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |osol|     unicode:: U+02298 .. CIRCLED DIVISION SLASH
+.. |Otimes|   unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+.. |ovbar|    unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE
+.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+.. |plusb|    unicode:: U+0229E .. SQUARED PLUS
+.. |pluscir|  unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE
+.. |plusdo|   unicode:: U+02214 .. DOT PLUS
+.. |plusdu|   unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW
+.. |pluse|    unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN
+.. |plussim|  unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW
+.. |plustwo|  unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |race|     unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE
+.. |roplus|   unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE
+.. |rotimes|  unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+.. |rthree|   unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |rtimes|   unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |sdotb|    unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |setmn|    unicode:: U+02216 .. SET MINUS
+.. |simplus|  unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE
+.. |smashp|   unicode:: U+02A33 .. SMASH PRODUCT
+.. |solb|     unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH
+.. |sqcap|    unicode:: U+02293 .. SQUARE CAP
+.. |sqcaps|   unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs
+.. |sqcup|    unicode:: U+02294 .. SQUARE CUP
+.. |sqcups|   unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs
+.. |ssetmn|   unicode:: U+02216 .. SET MINUS
+.. |sstarf|   unicode:: U+022C6 .. STAR OPERATOR
+.. |subdot|   unicode:: U+02ABD .. SUBSET WITH DOT
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |supdot|   unicode:: U+02ABE .. SUPERSET WITH DOT
+.. |timesb|   unicode:: U+022A0 .. SQUARED TIMES
+.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR
+.. |timesd|   unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |tridot|   unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT
+.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE
+.. |triplus|  unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE
+.. |trisb|    unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM
+.. |tritime|  unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE
+.. |uplus|    unicode:: U+0228E .. MULTISET UNION
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |wedbar|   unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR
+.. |wreath|   unicode:: U+02240 .. WREATH PRODUCT
+.. |xcap|     unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |xcirc|    unicode:: U+025EF .. LARGE CIRCLE
+.. |xcup|     unicode:: U+022C3 .. N-ARY UNION
+.. |xdtri|    unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |xodot|    unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |xoplus|   unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |xotime|   unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |xsqcup|   unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |xuplus|   unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |xutri|    unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |xvee|     unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |xwedge|   unicode:: U+022C0 .. N-ARY LOGICAL AND
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsc.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsc.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsc.txt	(revision 1126)
@@ -0,0 +1,29 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |dlcorn|  unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |drcorn|  unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |gtlPar|  unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET
+.. |langd|   unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT
+.. |lbrke|   unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR
+.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |lceil|   unicode:: U+02308 .. LEFT CEILING
+.. |lfloor|  unicode:: U+0230A .. LEFT FLOOR
+.. |lmoust|  unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lpargt|  unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT
+.. |lparlt|  unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET
+.. |ltrPar|  unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET
+.. |rangd|   unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT
+.. |rbrke|   unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR
+.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |rceil|   unicode:: U+02309 .. RIGHT CEILING
+.. |rfloor|  unicode:: U+0230B .. RIGHT FLOOR
+.. |rmoust|  unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |rpargt|  unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET
+.. |ulcorn|  unicode:: U+0231C .. TOP LEFT CORNER
+.. |urcorn|  unicode:: U+0231D .. TOP RIGHT CORNER
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlalias.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlalias.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlalias.txt	(revision 1126)
@@ -0,0 +1,554 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angle|                           unicode:: U+02220 .. ANGLE
+.. |ApplyFunction|                   unicode:: U+02061 .. FUNCTION APPLICATION
+.. |approx|                          unicode:: U+02248 .. ALMOST EQUAL TO
+.. |approxeq|                        unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |Assign|                          unicode:: U+02254 .. COLON EQUALS
+.. |backcong|                        unicode:: U+0224C .. ALL EQUAL TO
+.. |backepsilon|                     unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |backprime|                       unicode:: U+02035 .. REVERSED PRIME
+.. |backsim|                         unicode:: U+0223D .. REVERSED TILDE
+.. |backsimeq|                       unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |Backslash|                       unicode:: U+02216 .. SET MINUS
+.. |barwedge|                        unicode:: U+02305 .. PROJECTIVE
+.. |Because|                         unicode:: U+02235 .. BECAUSE
+.. |because|                         unicode:: U+02235 .. BECAUSE
+.. |Bernoullis|                      unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |between|                         unicode:: U+0226C .. BETWEEN
+.. |bigcap|                          unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |bigcirc|                         unicode:: U+025EF .. LARGE CIRCLE
+.. |bigcup|                          unicode:: U+022C3 .. N-ARY UNION
+.. |bigodot|                         unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |bigoplus|                        unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |bigotimes|                       unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |bigsqcup|                        unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |bigstar|                         unicode:: U+02605 .. BLACK STAR
+.. |bigtriangledown|                 unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |bigtriangleup|                   unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |biguplus|                        unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |bigvee|                          unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |bigwedge|                        unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |bkarow|                          unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |blacklozenge|                    unicode:: U+029EB .. BLACK LOZENGE
+.. |blacksquare|                     unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |blacktriangle|                   unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |blacktriangledown|               unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |blacktriangleleft|               unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |blacktriangleright|              unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |bot|                             unicode:: U+022A5 .. UP TACK
+.. |boxminus|                        unicode:: U+0229F .. SQUARED MINUS
+.. |boxplus|                         unicode:: U+0229E .. SQUARED PLUS
+.. |boxtimes|                        unicode:: U+022A0 .. SQUARED TIMES
+.. |Breve|                           unicode:: U+002D8 .. BREVE
+.. |bullet|                          unicode:: U+02022 .. BULLET
+.. |Bumpeq|                          unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpeq|                          unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |CapitalDifferentialD|            unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |Cayleys|                         unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Cedilla|                         unicode:: U+000B8 .. CEDILLA
+.. |CenterDot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |centerdot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |checkmark|                       unicode:: U+02713 .. CHECK MARK
+.. |circeq|                          unicode:: U+02257 .. RING EQUAL TO
+.. |circlearrowleft|                 unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |circlearrowright|                unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |circledast|                      unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |circledcirc|                     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |circleddash|                     unicode:: U+0229D .. CIRCLED DASH
+.. |CircleDot|                       unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |circledR|                        unicode:: U+000AE .. REGISTERED SIGN
+.. |circledS|                        unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |CircleMinus|                     unicode:: U+02296 .. CIRCLED MINUS
+.. |CirclePlus|                      unicode:: U+02295 .. CIRCLED PLUS
+.. |CircleTimes|                     unicode:: U+02297 .. CIRCLED TIMES
+.. |ClockwiseContourIntegral|        unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |CloseCurlyDoubleQuote|           unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |CloseCurlyQuote|                 unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |clubsuit|                        unicode:: U+02663 .. BLACK CLUB SUIT
+.. |coloneq|                         unicode:: U+02254 .. COLON EQUALS
+.. |complement|                      unicode:: U+02201 .. COMPLEMENT
+.. |complexes|                       unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Congruent|                       unicode:: U+02261 .. IDENTICAL TO
+.. |ContourIntegral|                 unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |Coproduct|                       unicode:: U+02210 .. N-ARY COPRODUCT
+.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |CupCap|                          unicode:: U+0224D .. EQUIVALENT TO
+.. |curlyeqprec|                     unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |curlyeqsucc|                     unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |curlyvee|                        unicode:: U+022CE .. CURLY LOGICAL OR
+.. |curlywedge|                      unicode:: U+022CF .. CURLY LOGICAL AND
+.. |curvearrowleft|                  unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |curvearrowright|                 unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |dbkarow|                         unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |ddagger|                         unicode:: U+02021 .. DOUBLE DAGGER
+.. |ddotseq|                         unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |Del|                             unicode:: U+02207 .. NABLA
+.. |DiacriticalAcute|                unicode:: U+000B4 .. ACUTE ACCENT
+.. |DiacriticalDot|                  unicode:: U+002D9 .. DOT ABOVE
+.. |DiacriticalDoubleAcute|          unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |DiacriticalGrave|                unicode:: U+00060 .. GRAVE ACCENT
+.. |DiacriticalTilde|                unicode:: U+002DC .. SMALL TILDE
+.. |Diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamondsuit|                     unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |DifferentialD|                   unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |digamma|                         unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |div|                             unicode:: U+000F7 .. DIVISION SIGN
+.. |divideontimes|                   unicode:: U+022C7 .. DIVISION TIMES
+.. |doteq|                           unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |doteqdot|                        unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |DotEqual|                        unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |dotminus|                        unicode:: U+02238 .. DOT MINUS
+.. |dotplus|                         unicode:: U+02214 .. DOT PLUS
+.. |dotsquare|                       unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |doublebarwedge|                  unicode:: U+02306 .. PERSPECTIVE
+.. |DoubleContourIntegral|           unicode:: U+0222F .. SURFACE INTEGRAL
+.. |DoubleDot|                       unicode:: U+000A8 .. DIAERESIS
+.. |DoubleDownArrow|                 unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |DoubleLeftArrow|                 unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |DoubleLeftRightArrow|            unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |DoubleLeftTee|                   unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |DoubleLongLeftArrow|             unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |DoubleLongLeftRightArrow|        unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |DoubleLongRightArrow|            unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightArrow|                unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightTee|                  unicode:: U+022A8 .. TRUE
+.. |DoubleUpArrow|                   unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |DoubleUpDownArrow|               unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |DoubleVerticalBar|               unicode:: U+02225 .. PARALLEL TO
+.. |DownArrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Downarrow|                       unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |downarrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |DownArrowUpArrow|                unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |downdownarrows|                  unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |downharpoonleft|                 unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |downharpoonright|                unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |DownLeftVector|                  unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownRightVector|                 unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownTee|                         unicode:: U+022A4 .. DOWN TACK
+.. |DownTeeArrow|                    unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |drbkarow|                        unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |Element|                         unicode:: U+02208 .. ELEMENT OF
+.. |emptyset|                        unicode:: U+02205 .. EMPTY SET
+.. |eqcirc|                          unicode:: U+02256 .. RING IN EQUAL TO
+.. |eqcolon|                         unicode:: U+02255 .. EQUALS COLON
+.. |eqsim|                           unicode:: U+02242 .. MINUS TILDE
+.. |eqslantgtr|                      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |eqslantless|                     unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |EqualTilde|                      unicode:: U+02242 .. MINUS TILDE
+.. |Equilibrium|                     unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |Exists|                          unicode:: U+02203 .. THERE EXISTS
+.. |expectation|                     unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |ExponentialE|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |exponentiale|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |fallingdotseq|                   unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |ForAll|                          unicode:: U+02200 .. FOR ALL
+.. |Fouriertrf|                      unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |geq|                             unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |geqq|                            unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |geqslant|                        unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gg|                              unicode:: U+0226B .. MUCH GREATER-THAN
+.. |ggg|                             unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gnapprox|                        unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gneq|                            unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gneqq|                           unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |GreaterEqual|                    unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |GreaterEqualLess|                unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |GreaterFullEqual|                unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |GreaterLess|                     unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |GreaterSlantEqual|               unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |GreaterTilde|                    unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gtrapprox|                       unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gtrdot|                          unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtreqless|                       unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |gtreqqless|                      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gtrless|                         unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gtrsim|                          unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gvertneqq|                       unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |Hacek|                           unicode:: U+002C7 .. CARON
+.. |hbar|                            unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |heartsuit|                       unicode:: U+02665 .. BLACK HEART SUIT
+.. |HilbertSpace|                    unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hksearow|                        unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |hkswarow|                        unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |hookleftarrow|                   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |hookrightarrow|                  unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |hslash|                          unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |HumpDownHump|                    unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |HumpEqual|                       unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |iiiint|                          unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |iiint|                           unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |Im|                              unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ImaginaryI|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |imagline|                        unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |imagpart|                        unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Implies|                         unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |in|                              unicode:: U+02208 .. ELEMENT OF
+.. |integers|                        unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
+.. |Integral|                        unicode:: U+0222B .. INTEGRAL
+.. |intercal|                        unicode:: U+022BA .. INTERCALATE
+.. |Intersection|                    unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |intprod|                         unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |InvisibleComma|                  unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |InvisibleTimes|                  unicode:: U+02062 .. INVISIBLE TIMES
+.. |langle|                          unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |Laplacetrf|                      unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lbrace|                          unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |lbrack|                          unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |LeftAngleBracket|                unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |LeftArrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |Leftarrow|                       unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |leftarrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |LeftArrowBar|                    unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftArrowRightArrow|             unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftarrowtail|                   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |LeftCeiling|                     unicode:: U+02308 .. LEFT CEILING
+.. |LeftDoubleBracket|               unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |LeftDownVector|                  unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftFloor|                       unicode:: U+0230A .. LEFT FLOOR
+.. |leftharpoondown|                 unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |leftharpoonup|                   unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leftleftarrows|                  unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |LeftRightArrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |Leftrightarrow|                  unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |leftrightarrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |leftrightarrows|                 unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftrightharpoons|               unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |leftrightsquigarrow|             unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |LeftTee|                         unicode:: U+022A3 .. LEFT TACK
+.. |LeftTeeArrow|                    unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |leftthreetimes|                  unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |LeftTriangle|                    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |LeftTriangleEqual|               unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |LeftUpVector|                    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftVector|                      unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leq|                             unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |leqq|                            unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |leqslant|                        unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lessapprox|                      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lessdot|                         unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lesseqgtr|                       unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |lesseqqgtr|                      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |LessEqualGreater|                unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |LessFullEqual|                   unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |LessGreater|                     unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lessgtr|                         unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lesssim|                         unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |LessSlantEqual|                  unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |LessTilde|                       unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |ll|                              unicode:: U+0226A .. MUCH LESS-THAN
+.. |llcorner|                        unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |Lleftarrow|                      unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |lmoustache|                      unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lnapprox|                        unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lneq|                            unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lneqq|                           unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |LongLeftArrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |Longleftarrow|                   unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |longleftarrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |LongLeftRightArrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |Longleftrightarrow|              unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |longleftrightarrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |longmapsto|                      unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |LongRightArrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |Longrightarrow|                  unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |longrightarrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |looparrowleft|                   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |looparrowright|                  unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |LowerLeftArrow|                  unicode:: U+02199 .. SOUTH WEST ARROW
+.. |LowerRightArrow|                 unicode:: U+02198 .. SOUTH EAST ARROW
+.. |lozenge|                         unicode:: U+025CA .. LOZENGE
+.. |lrcorner|                        unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |Lsh|                             unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lvertneqq|                       unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |maltese|                         unicode:: U+02720 .. MALTESE CROSS
+.. |mapsto|                          unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |measuredangle|                   unicode:: U+02221 .. MEASURED ANGLE
+.. |Mellintrf|                       unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |MinusPlus|                       unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |mp|                              unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |multimap|                        unicode:: U+022B8 .. MULTIMAP
+.. |napprox|                         unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |natural|                         unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |naturals|                        unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |nearrow|                         unicode:: U+02197 .. NORTH EAST ARROW
+.. |NegativeMediumSpace|             unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThickSpace|              unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThinSpace|               unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeVeryThinSpace|           unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NestedGreaterGreater|            unicode:: U+0226B .. MUCH GREATER-THAN
+.. |NestedLessLess|                  unicode:: U+0226A .. MUCH LESS-THAN
+.. |nexists|                         unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |ngeq|                            unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |ngeqq|                           unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |ngeqslant|                       unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |ngtr|                            unicode:: U+0226F .. NOT GREATER-THAN
+.. |nLeftarrow|                      unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nleftarrow|                      unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nLeftrightarrow|                 unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nleftrightarrow|                 unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nleq|                            unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nleqq|                           unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nleqslant|                       unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nless|                           unicode:: U+0226E .. NOT LESS-THAN
+.. |NonBreakingSpace|                unicode:: U+000A0 .. NO-BREAK SPACE
+.. |NotCongruent|                    unicode:: U+02262 .. NOT IDENTICAL TO
+.. |NotDoubleVerticalBar|            unicode:: U+02226 .. NOT PARALLEL TO
+.. |NotElement|                      unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |NotEqual|                        unicode:: U+02260 .. NOT EQUAL TO
+.. |NotEqualTilde|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NotExists|                       unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |NotGreater|                      unicode:: U+0226F .. NOT GREATER-THAN
+.. |NotGreaterEqual|                 unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |NotGreaterFullEqual|             unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |NotGreaterGreater|               unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |NotGreaterLess|                  unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |NotGreaterSlantEqual|            unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |NotGreaterTilde|                 unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |NotHumpDownHump|                 unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |NotLeftTriangle|                 unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |NotLeftTriangleEqual|            unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |NotLess|                         unicode:: U+0226E .. NOT LESS-THAN
+.. |NotLessEqual|                    unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |NotLessGreater|                  unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |NotLessLess|                     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |NotLessSlantEqual|               unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |NotLessTilde|                    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |NotPrecedes|                     unicode:: U+02280 .. DOES NOT PRECEDE
+.. |NotPrecedesEqual|                unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotPrecedesSlantEqual|           unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |NotReverseElement|               unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |NotRightTriangle|                unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |NotRightTriangleEqual|           unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |NotSquareSubsetEqual|            unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |NotSquareSupersetEqual|          unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |NotSubset|                       unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |NotSubsetEqual|                  unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |NotSucceeds|                     unicode:: U+02281 .. DOES NOT SUCCEED
+.. |NotSucceedsEqual|                unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotSucceedsSlantEqual|           unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |NotSuperset|                     unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |NotSupersetEqual|                unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |NotTilde|                        unicode:: U+02241 .. NOT TILDE
+.. |NotTildeEqual|                   unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |NotTildeFullEqual|               unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |NotTildeTilde|                   unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |NotVerticalBar|                  unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nparallel|                       unicode:: U+02226 .. NOT PARALLEL TO
+.. |nprec|                           unicode:: U+02280 .. DOES NOT PRECEDE
+.. |npreceq|                         unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nRightarrow|                     unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrightarrow|                     unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nshortmid|                       unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nshortparallel|                  unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsimeq|                          unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsubset|                         unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |nsubseteq|                       unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsubseteqq|                      unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsucc|                           unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsucceq|                         unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsupset|                         unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |nsupseteq|                       unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |nsupseteqq|                      unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |ntriangleleft|                   unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |ntrianglelefteq|                 unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |ntriangleright|                  unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |ntrianglerighteq|                unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nwarrow|                         unicode:: U+02196 .. NORTH WEST ARROW
+.. |oint|                            unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |OpenCurlyDoubleQuote|            unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |OpenCurlyQuote|                  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |orderof|                         unicode:: U+02134 .. SCRIPT SMALL O
+.. |parallel|                        unicode:: U+02225 .. PARALLEL TO
+.. |PartialD|                        unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |pitchfork|                       unicode:: U+022D4 .. PITCHFORK
+.. |PlusMinus|                       unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pm|                              unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |Poincareplane|                   unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |prec|                            unicode:: U+0227A .. PRECEDES
+.. |precapprox|                      unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |preccurlyeq|                     unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Precedes|                        unicode:: U+0227A .. PRECEDES
+.. |PrecedesEqual|                   unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |PrecedesSlantEqual|              unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |PrecedesTilde|                   unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |preceq|                          unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |precnapprox|                     unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |precneqq|                        unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |precnsim|                        unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |precsim|                         unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |primes|                          unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Proportion|                      unicode:: U+02237 .. PROPORTION
+.. |Proportional|                    unicode:: U+0221D .. PROPORTIONAL TO
+.. |propto|                          unicode:: U+0221D .. PROPORTIONAL TO
+.. |quaternions|                     unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |questeq|                         unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |rangle|                          unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rationals|                       unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |rbrace|                          unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rbrack|                          unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |Re|                              unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |realine|                         unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |realpart|                        unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |reals|                           unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |ReverseElement|                  unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |ReverseEquilibrium|              unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |ReverseUpEquilibrium|            unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |RightAngleBracket|               unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |RightArrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |Rightarrow|                      unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rightarrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |RightArrowBar|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightArrowLeftArrow|             unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightarrowtail|                  unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |RightCeiling|                    unicode:: U+02309 .. RIGHT CEILING
+.. |RightDoubleBracket|              unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |RightDownVector|                 unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightFloor|                      unicode:: U+0230B .. RIGHT FLOOR
+.. |rightharpoondown|                unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rightharpoonup|                  unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rightleftarrows|                 unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightleftharpoons|               unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rightrightarrows|                unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rightsquigarrow|                 unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |RightTee|                        unicode:: U+022A2 .. RIGHT TACK
+.. |RightTeeArrow|                   unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |rightthreetimes|                 unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |RightTriangle|                   unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |RightTriangleEqual|              unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |RightUpVector|                   unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightVector|                     unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |risingdotseq|                    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |rmoustache|                      unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |Rrightarrow|                     unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rsh|                             unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |searrow|                         unicode:: U+02198 .. SOUTH EAST ARROW
+.. |setminus|                        unicode:: U+02216 .. SET MINUS
+.. |ShortDownArrow|                  unicode:: U+02193 .. DOWNWARDS ARROW
+.. |ShortLeftArrow|                  unicode:: U+02190 .. LEFTWARDS ARROW
+.. |shortmid|                        unicode:: U+02223 .. DIVIDES
+.. |shortparallel|                   unicode:: U+02225 .. PARALLEL TO
+.. |ShortRightArrow|                 unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |ShortUpArrow|                    unicode:: U+02191 .. UPWARDS ARROW
+.. |simeq|                           unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |SmallCircle|                     unicode:: U+02218 .. RING OPERATOR
+.. |smallsetminus|                   unicode:: U+02216 .. SET MINUS
+.. |spadesuit|                       unicode:: U+02660 .. BLACK SPADE SUIT
+.. |Sqrt|                            unicode:: U+0221A .. SQUARE ROOT
+.. |sqsubset|                        unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsubseteq|                      unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsupset|                        unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupseteq|                      unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |Square|                          unicode:: U+025A1 .. WHITE SQUARE
+.. |SquareIntersection|              unicode:: U+02293 .. SQUARE CAP
+.. |SquareSubset|                    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |SquareSubsetEqual|               unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |SquareSuperset|                  unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |SquareSupersetEqual|             unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |SquareUnion|                     unicode:: U+02294 .. SQUARE CUP
+.. |Star|                            unicode:: U+022C6 .. STAR OPERATOR
+.. |straightepsilon|                 unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |straightphi|                     unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Subset|                          unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subset|                          unicode:: U+02282 .. SUBSET OF
+.. |subseteq|                        unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subseteqq|                       unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |SubsetEqual|                     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subsetneq|                       unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |subsetneqq|                      unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |succ|                            unicode:: U+0227B .. SUCCEEDS
+.. |succapprox|                      unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |succcurlyeq|                     unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |Succeeds|                        unicode:: U+0227B .. SUCCEEDS
+.. |SucceedsEqual|                   unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |SucceedsSlantEqual|              unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |SucceedsTilde|                   unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |succeq|                          unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |succnapprox|                     unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |succneqq|                        unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |succnsim|                        unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |succsim|                         unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |SuchThat|                        unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Sum|                             unicode:: U+02211 .. N-ARY SUMMATION
+.. |Superset|                        unicode:: U+02283 .. SUPERSET OF
+.. |SupersetEqual|                   unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Supset|                          unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supset|                          unicode:: U+02283 .. SUPERSET OF
+.. |supseteq|                        unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |supseteqq|                       unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supsetneq|                       unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |supsetneqq|                      unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |swarrow|                         unicode:: U+02199 .. SOUTH WEST ARROW
+.. |Therefore|                       unicode:: U+02234 .. THEREFORE
+.. |therefore|                       unicode:: U+02234 .. THEREFORE
+.. |thickapprox|                     unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thicksim|                        unicode:: U+0223C .. TILDE OPERATOR
+.. |ThinSpace|                       unicode:: U+02009 .. THIN SPACE
+.. |Tilde|                           unicode:: U+0223C .. TILDE OPERATOR
+.. |TildeEqual|                      unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |TildeFullEqual|                  unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |TildeTilde|                      unicode:: U+02248 .. ALMOST EQUAL TO
+.. |toea|                            unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |tosa|                            unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |triangle|                        unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |triangledown|                    unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |triangleleft|                    unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |trianglelefteq|                  unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |triangleq|                       unicode:: U+0225C .. DELTA EQUAL TO
+.. |triangleright|                   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |trianglerighteq|                 unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |TripleDot|                       unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |twoheadleftarrow|                unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |twoheadrightarrow|               unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |ulcorner|                        unicode:: U+0231C .. TOP LEFT CORNER
+.. |Union|                           unicode:: U+022C3 .. N-ARY UNION
+.. |UnionPlus|                       unicode:: U+0228E .. MULTISET UNION
+.. |UpArrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |Uparrow|                         unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uparrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |UpArrowDownArrow|                unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |UpDownArrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |Updownarrow|                     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |updownarrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |UpEquilibrium|                   unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |upharpoonleft|                   unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |upharpoonright|                  unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |UpperLeftArrow|                  unicode:: U+02196 .. NORTH WEST ARROW
+.. |UpperRightArrow|                 unicode:: U+02197 .. NORTH EAST ARROW
+.. |upsilon|                         unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |UpTee|                           unicode:: U+022A5 .. UP TACK
+.. |UpTeeArrow|                      unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |upuparrows|                      unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |urcorner|                        unicode:: U+0231D .. TOP RIGHT CORNER
+.. |varepsilon|                      unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |varkappa|                        unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |varnothing|                      unicode:: U+02205 .. EMPTY SET
+.. |varphi|                          unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |varpi|                           unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |varpropto|                       unicode:: U+0221D .. PROPORTIONAL TO
+.. |varrho|                          unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |varsigma|                        unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |varsubsetneq|                    unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsubsetneqq|                   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneq|                    unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneqq|                   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vartheta|                        unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |vartriangleleft|                 unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vartriangleright|                unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vee|                             unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |vee|                             unicode:: U+02228 .. LOGICAL OR
+.. |Vert|                            unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |vert|                            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalBar|                     unicode:: U+02223 .. DIVIDES
+.. |VerticalTilde|                   unicode:: U+02240 .. WREATH PRODUCT
+.. |VeryThinSpace|                   unicode:: U+0200A .. HAIR SPACE
+.. |Wedge|                           unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |wedge|                           unicode:: U+02227 .. LOGICAL AND
+.. |wp|                              unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |wr|                              unicode:: U+02240 .. WREATH PRODUCT
+.. |zeetrf|                          unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomfrk-wide.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomfrk-wide.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomfrk-wide.txt	(revision 1126)
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A
+.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A
+.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B
+.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C
+.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D
+.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D
+.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E
+.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E
+.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F
+.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F
+.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G
+.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I
+.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J
+.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J
+.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K
+.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K
+.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L
+.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L
+.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M
+.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M
+.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N
+.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N
+.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O
+.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O
+.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P
+.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P
+.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q
+.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R
+.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S
+.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S
+.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T
+.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T
+.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U
+.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U
+.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V
+.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V
+.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W
+.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W
+.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X
+.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X
+.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y
+.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
+.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomopf-wide.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomopf-wide.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomopf-wide.txt	(revision 1126)
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomscr-wide.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomscr-wide.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomscr-wide.txt	(revision 1126)
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A
+.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B
+.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C
+.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C
+.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D
+.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F
+.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I
+.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J
+.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J
+.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K
+.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M
+.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N
+.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N
+.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P
+.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P
+.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q
+.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R
+.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S
+.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S
+.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T
+.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T
+.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U
+.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U
+.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V
+.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V
+.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W
+.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W
+.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X
+.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X
+.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y
+.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y
+.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z
+.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isodia.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isodia.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isodia.txt	(revision 1126)
@@ -0,0 +1,20 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
+.. |breve| unicode:: U+002D8 .. BREVE
+.. |caron| unicode:: U+002C7 .. CARON
+.. |cedil| unicode:: U+000B8 .. CEDILLA
+.. |circ|  unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |die|   unicode:: U+000A8 .. DIAERESIS
+.. |dot|   unicode:: U+002D9 .. DOT ABOVE
+.. |grave| unicode:: U+00060 .. GRAVE ACCENT
+.. |macr|  unicode:: U+000AF .. MACRON
+.. |ogon|  unicode:: U+002DB .. OGONEK
+.. |ring|  unicode:: U+002DA .. RING ABOVE
+.. |tilde| unicode:: U+002DC .. SMALL TILDE
+.. |uml|   unicode:: U+000A8 .. DIAERESIS
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsn.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsn.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsn.txt	(revision 1126)
@@ -0,0 +1,96 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |gnap|     unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gnE|      unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |gne|      unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gnsim|    unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO
+.. |gvnE|     unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |lnap|     unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lnE|      unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |lne|      unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lnsim|    unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO
+.. |lvnE|     unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |nap|      unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |napE|     unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash
+.. |napid|    unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash
+.. |ncong|    unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash
+.. |nequiv|   unicode:: U+02262 .. NOT IDENTICAL TO
+.. |ngE|      unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |nge|      unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |nges|     unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |nGg|      unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash
+.. |ngsim|    unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |nGt|      unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line
+.. |ngt|      unicode:: U+0226F .. NOT GREATER-THAN
+.. |nGtv|     unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |nlE|      unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nle|      unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nles|     unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nLl|      unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash
+.. |nlsim|    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |nLt|      unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line
+.. |nlt|      unicode:: U+0226E .. NOT LESS-THAN
+.. |nltri|    unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |nltrie|   unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |nLtv|     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |nmid|     unicode:: U+02224 .. DOES NOT DIVIDE
+.. |npar|     unicode:: U+02226 .. NOT PARALLEL TO
+.. |npr|      unicode:: U+02280 .. DOES NOT PRECEDE
+.. |nprcue|   unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |npre|     unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nrtri|    unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |nrtrie|   unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nsc|      unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsccue|   unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |nsce|     unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsim|     unicode:: U+02241 .. NOT TILDE
+.. |nsime|    unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsmid|    unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nspar|    unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsqsube|  unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |nsqsupe|  unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |nsubE|    unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsube|    unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsup|     unicode:: U+02285 .. NOT A SUPERSET OF
+.. |nsupE|    unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |nsupe|    unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |ntgl|     unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |ntlg|     unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |nvap|     unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line
+.. |nVDash|   unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |nVdash|   unicode:: U+022AE .. DOES NOT FORCE
+.. |nvDash|   unicode:: U+022AD .. NOT TRUE
+.. |nvdash|   unicode:: U+022AC .. DOES NOT PROVE
+.. |nvge|     unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line
+.. |nvgt|     unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line
+.. |nvle|     unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line
+.. |nvlt|     unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line
+.. |nvltrie|  unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line
+.. |nvrtrie|  unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
+.. |nvsim|    unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line
+.. |parsim|   unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR
+.. |prnap|    unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |prnE|     unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |prnsim|   unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |rnmid|    unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+.. |scnap|    unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |scnE|     unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |scnsim|   unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |simne|    unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+.. |solbar|   unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR
+.. |subnE|    unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |subne|    unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |supnE|    unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |supne|    unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |vnsub|    unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |vnsup|    unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |vsubnE|   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsubne|   unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupnE|   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupne|   unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamso.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamso.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamso.txt	(revision 1126)
@@ -0,0 +1,62 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |ange|     unicode:: U+029A4 .. ANGLE WITH UNDERBAR
+.. |angmsd|   unicode:: U+02221 .. MEASURED ANGLE
+.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+.. |angrtvb|  unicode:: U+022BE .. RIGHT ANGLE WITH ARC
+.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT
+.. |bbrk|     unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+.. |bemptyv|  unicode:: U+029B0 .. REVERSED EMPTY SET
+.. |beth|     unicode:: U+02136 .. BET SYMBOL
+.. |boxbox|   unicode:: U+029C9 .. TWO JOINED SQUARES
+.. |bprime|   unicode:: U+02035 .. REVERSED PRIME
+.. |bsemi|    unicode:: U+0204F .. REVERSED SEMICOLON
+.. |cemptyv|  unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE
+.. |cirE|     unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+.. |cirscir|  unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+.. |comp|     unicode:: U+02201 .. COMPLEMENT
+.. |daleth|   unicode:: U+02138 .. DALET SYMBOL
+.. |demptyv|  unicode:: U+029B1 .. EMPTY SET WITH OVERBAR
+.. |ell|      unicode:: U+02113 .. SCRIPT SMALL L
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |emptyv|   unicode:: U+02205 .. EMPTY SET
+.. |gimel|    unicode:: U+02137 .. GIMEL SYMBOL
+.. |iiota|    unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |imath|    unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |inodot|   unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |jmath|    unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |jnodot|   unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE
+.. |lltri|    unicode:: U+025FA .. LOWER LEFT TRIANGLE
+.. |lrtri|    unicode:: U+022BF .. RIGHT TRIANGLE
+.. |mho|      unicode:: U+02127 .. INVERTED OHM SIGN
+.. |nang|     unicode:: U+02220 U+020D2 .. ANGLE with vertical line
+.. |nexist|   unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |oS|       unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |planck|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |plankv|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE
+.. |range|    unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |sbsol|    unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS
+.. |tbrk|     unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |ultri|    unicode:: U+025F8 .. UPPER LEFT TRIANGLE
+.. |urtri|    unicode:: U+025F9 .. UPPER RIGHT TRIANGLE
+.. |vprime|   unicode:: U+02032 .. PRIME
+.. |vzigzag|  unicode:: U+0299A .. VERTICAL ZIGZAG LINE
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isolat1.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isolat1.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isolat1.txt	(revision 1126)
@@ -0,0 +1,68 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsr.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsr.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isoamsr.txt	(revision 1126)
@@ -0,0 +1,191 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |apE|      unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO
+.. |ape|      unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |apid|     unicode:: U+0224B .. TRIPLE TILDE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Barv|     unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR
+.. |bcong|    unicode:: U+0224C .. ALL EQUAL TO
+.. |bepsi|    unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |bowtie|   unicode:: U+022C8 .. BOWTIE
+.. |bsim|     unicode:: U+0223D .. REVERSED TILDE
+.. |bsime|    unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF
+.. |bump|     unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpE|    unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE
+.. |bumpe|    unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |cire|     unicode:: U+02257 .. RING EQUAL TO
+.. |Colon|    unicode:: U+02237 .. PROPORTION
+.. |Colone|   unicode:: U+02A74 .. DOUBLE COLON EQUAL
+.. |colone|   unicode:: U+02254 .. COLON EQUALS
+.. |congdot|  unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE
+.. |csub|     unicode:: U+02ACF .. CLOSED SUBSET
+.. |csube|    unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO
+.. |csup|     unicode:: U+02AD0 .. CLOSED SUPERSET
+.. |csupe|    unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO
+.. |cuepr|    unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |cuesc|    unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |cupre|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Dashv|    unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |dashv|    unicode:: U+022A3 .. LEFT TACK
+.. |easter|   unicode:: U+02A6E .. EQUALS WITH ASTERISK
+.. |ecir|     unicode:: U+02256 .. RING IN EQUAL TO
+.. |ecolon|   unicode:: U+02255 .. EQUALS COLON
+.. |eDDot|    unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |eDot|     unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |efDot|    unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |eg|       unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN
+.. |egs|      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |egsdot|   unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+.. |el|       unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN
+.. |els|      unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |elsdot|   unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+.. |equest|   unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |equivDD|  unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE
+.. |erDot|    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |esdot|    unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |Esim|     unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR
+.. |esim|     unicode:: U+02242 .. MINUS TILDE
+.. |fork|     unicode:: U+022D4 .. PITCHFORK
+.. |forkv|    unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS
+.. |frown|    unicode:: U+02322 .. FROWN
+.. |gap|      unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gE|       unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |gEl|      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gel|      unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |ges|      unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gescc|    unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |gesdot|   unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |gesdoto|  unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+.. |gesl|     unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN
+.. |gesles|   unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+.. |Gg|       unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gl|       unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gla|      unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN
+.. |glE|      unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+.. |glj|      unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN
+.. |gsdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gsim|     unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gsime|    unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL
+.. |gsiml|    unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+.. |Gt|       unicode:: U+0226B .. MUCH GREATER-THAN
+.. |gtcc|     unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE
+.. |gtcir|    unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE
+.. |gtdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtquest|  unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE
+.. |gtrarr|   unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW
+.. |homtht|   unicode:: U+0223B .. HOMOTHETIC
+.. |lap|      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lat|      unicode:: U+02AAB .. LARGER THAN
+.. |late|     unicode:: U+02AAD .. LARGER THAN OR EQUAL TO
+.. |lates|    unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL
+.. |ldot|     unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lE|       unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |lEg|      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |leg|      unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |les|      unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lescc|    unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |lesdot|   unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |lesdoto|  unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+.. |lesg|     unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN
+.. |lesges|   unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+.. |lg|       unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lgE|      unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+.. |Ll|       unicode:: U+022D8 .. VERY MUCH LESS-THAN
+.. |lsim|     unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |lsime|    unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL
+.. |lsimg|    unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+.. |Lt|       unicode:: U+0226A .. MUCH LESS-THAN
+.. |ltcc|     unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE
+.. |ltcir|    unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE
+.. |ltdot|    unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |ltlarr|   unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW
+.. |ltquest|  unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE
+.. |ltrie|    unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |mcomma|   unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE
+.. |mDDot|    unicode:: U+0223A .. GEOMETRIC PROPORTION
+.. |mid|      unicode:: U+02223 .. DIVIDES
+.. |mlcp|     unicode:: U+02ADB .. TRANSVERSAL INTERSECTION
+.. |models|   unicode:: U+022A7 .. MODELS
+.. |mstpos|   unicode:: U+0223E .. INVERTED LAZY S
+.. |Pr|       unicode:: U+02ABB .. DOUBLE PRECEDES
+.. |pr|       unicode:: U+0227A .. PRECEDES
+.. |prap|     unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |prcue|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |prE|      unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN
+.. |pre|      unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |prsim|    unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |prurel|   unicode:: U+022B0 .. PRECEDES UNDER RELATION
+.. |ratio|    unicode:: U+02236 .. RATIO
+.. |rtrie|    unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+.. |samalg|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Sc|       unicode:: U+02ABC .. DOUBLE SUCCEEDS
+.. |sc|       unicode:: U+0227B .. SUCCEEDS
+.. |scap|     unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |sccue|    unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |scE|      unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN
+.. |sce|      unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |scsim|    unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |sdote|    unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW
+.. |sfrown|   unicode:: U+02322 .. FROWN
+.. |simg|     unicode:: U+02A9E .. SIMILAR OR GREATER-THAN
+.. |simgE|    unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+.. |siml|     unicode:: U+02A9D .. SIMILAR OR LESS-THAN
+.. |simlE|    unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+.. |smid|     unicode:: U+02223 .. DIVIDES
+.. |smile|    unicode:: U+02323 .. SMILE
+.. |smt|      unicode:: U+02AAA .. SMALLER THAN
+.. |smte|     unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO
+.. |smtes|    unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL
+.. |spar|     unicode:: U+02225 .. PARALLEL TO
+.. |sqsub|    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsube|   unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsup|    unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupe|   unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |ssmile|   unicode:: U+02323 .. SMILE
+.. |Sub|      unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subE|     unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |subedot|  unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE
+.. |submult|  unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW
+.. |subplus|  unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW
+.. |subrarr|  unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW
+.. |subsim|   unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR
+.. |subsub|   unicode:: U+02AD5 .. SUBSET ABOVE SUBSET
+.. |subsup|   unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET
+.. |Sup|      unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supdsub|  unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+.. |supE|     unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supedot|  unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+.. |suphsol|  unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS
+.. |suphsub|  unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET
+.. |suplarr|  unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW
+.. |supmult|  unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW
+.. |supplus|  unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW
+.. |supsim|   unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR
+.. |supsub|   unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET
+.. |supsup|   unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET
+.. |thkap|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thksim|   unicode:: U+0223C .. TILDE OPERATOR
+.. |topfork|  unicode:: U+02ADA .. PITCHFORK WITH TEE TOP
+.. |trie|     unicode:: U+0225C .. DELTA EQUAL TO
+.. |twixt|    unicode:: U+0226C .. BETWEEN
+.. |Vbar|     unicode:: U+02AEB .. DOUBLE UP TACK
+.. |vBar|     unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR
+.. |vBarv|    unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK
+.. |VDash|    unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |Vdash|    unicode:: U+022A9 .. FORCES
+.. |vDash|    unicode:: U+022A8 .. TRUE
+.. |vdash|    unicode:: U+022A2 .. RIGHT TACK
+.. |Vdashl|   unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |vltri|    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vprop|    unicode:: U+0221D .. PROPORTIONAL TO
+.. |vrtri|    unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vvdash|   unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isolat2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isolat2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isolat2.txt	(revision 1126)
@@ -0,0 +1,128 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE
+.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE
+.. |Amacr|  unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON
+.. |amacr|  unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON
+.. |Aogon|  unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK
+.. |aogon|  unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK
+.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE
+.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE
+.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON
+.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON
+.. |Ccirc|  unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+.. |ccirc|  unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX
+.. |Cdot|   unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE
+.. |cdot|   unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE
+.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON
+.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON
+.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE
+.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE
+.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON
+.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON
+.. |Edot|   unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE
+.. |edot|   unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE
+.. |Emacr|  unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON
+.. |emacr|  unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON
+.. |ENG|    unicode:: U+0014A .. LATIN CAPITAL LETTER ENG
+.. |eng|    unicode:: U+0014B .. LATIN SMALL LETTER ENG
+.. |Eogon|  unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK
+.. |eogon|  unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK
+.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE
+.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE
+.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE
+.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA
+.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA
+.. |Gcirc|  unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+.. |gcirc|  unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX
+.. |Gdot|   unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE
+.. |gdot|   unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE
+.. |Hcirc|  unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+.. |hcirc|  unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX
+.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE
+.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE
+.. |Idot|   unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE
+.. |IJlig|  unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ
+.. |ijlig|  unicode:: U+00133 .. LATIN SMALL LIGATURE IJ
+.. |Imacr|  unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON
+.. |imacr|  unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON
+.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |Iogon|  unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK
+.. |iogon|  unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK
+.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE
+.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE
+.. |Jcirc|  unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+.. |jcirc|  unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX
+.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA
+.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA
+.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA
+.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE
+.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE
+.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON
+.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON
+.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA
+.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA
+.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT
+.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT
+.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE
+.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE
+.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE
+.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE
+.. |napos|  unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON
+.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON
+.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA
+.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA
+.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |Omacr|  unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON
+.. |omacr|  unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON
+.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE
+.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE
+.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON
+.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON
+.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA
+.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA
+.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE
+.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA
+.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA
+.. |Scirc|  unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+.. |scirc|  unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX
+.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON
+.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON
+.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA
+.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA
+.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE
+.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE
+.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE
+.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE
+.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE
+.. |Umacr|  unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON
+.. |umacr|  unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON
+.. |Uogon|  unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK
+.. |uogon|  unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK
+.. |Uring|  unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE
+.. |uring|  unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE
+.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE
+.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE
+.. |Wcirc|  unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+.. |wcirc|  unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX
+.. |Ycirc|  unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+.. |ycirc|  unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE
+.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE
+.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON
+.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON
+.. |Zdot|   unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE
+.. |zdot|   unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk1.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk1.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk1.txt	(revision 1126)
@@ -0,0 +1,55 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Agr|  unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |agr|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |Bgr|  unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |bgr|  unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |Dgr|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |dgr|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Egr|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |egr|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |Ggr|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |ggr|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Igr|  unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |igr|  unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |Kgr|  unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kgr|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Lgr|  unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lgr|  unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |Mgr|  unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mgr|  unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |Ngr|  unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |ngr|  unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Ogr|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |ogr|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Pgr|  unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pgr|  unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |Rgr|  unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rgr|  unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |Sgr|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sgr|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |Tgr|  unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tgr|  unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |Ugr|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |ugr|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xgr|  unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xgr|  unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zgr|  unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zgr|  unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomscr.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomscr.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomscr.txt	(revision 1126)
@@ -0,0 +1,17 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk2.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk2.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk2.txt	(revision 1126)
@@ -0,0 +1,26 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacgr|  unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS
+.. |aacgr|  unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS
+.. |Eacgr|  unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS
+.. |eacgr|  unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS
+.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS
+.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS
+.. |Iacgr|  unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS
+.. |iacgr|  unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS
+.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+.. |Idigr|  unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+.. |idigr|  unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA
+.. |Oacgr|  unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS
+.. |oacgr|  unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS
+.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS
+.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS
+.. |Uacgr|  unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS
+.. |uacgr|  unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS
+.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+.. |Udigr|  unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+.. |udigr|  unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk3.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk3.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk3.txt	(revision 1126)
@@ -0,0 +1,52 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alpha|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |beta|   unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |chi|    unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Delta|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |epsi|   unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsis|  unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsiv|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |eta|    unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Gamma|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |iota|   unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |kappa|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |mu|     unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nu|     unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Omega|  unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|  unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Phi|    unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|    unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phis|   unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phiv|   unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |Pi|     unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|     unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|    unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Psi|    unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|    unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |rho|    unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |rhov|   unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |Sigma|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |tau|    unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |Theta|  unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|  unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |Upsi|   unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |upsi|   unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xi|     unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|     unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |zeta|   unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk4.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk4.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk4.txt	(revision 1126)
@@ -0,0 +1,8 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/s5defs.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/s5defs.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/s5defs.txt	(revision 1126)
@@ -0,0 +1,68 @@
+.. Definitions of interpreted text roles (classes) for S5/HTML data.
+.. This data file has been placed in the public domain.
+
+.. Colours
+   =======
+
+.. role:: black
+.. role:: gray
+.. role:: silver
+.. role:: white
+
+.. role:: maroon
+.. role:: red
+.. role:: magenta
+.. role:: fuchsia
+.. role:: pink
+.. role:: orange
+.. role:: yellow
+.. role:: lime
+.. role:: green
+.. role:: olive
+.. role:: teal
+.. role:: cyan
+.. role:: aqua
+.. role:: blue
+.. role:: navy
+.. role:: purple
+
+
+.. Text Sizes
+   ==========
+
+.. role:: huge
+.. role:: big
+.. role:: small
+.. role:: tiny
+
+
+.. Display in Slides (Presentation Mode) Only
+   ==========================================
+
+.. role:: slide
+   :class: slide-display
+
+
+.. Display in Outline Mode Only
+   ============================
+
+.. role:: outline
+
+
+.. Display in Print Only
+   =====================
+
+.. role:: print
+
+
+.. Display in Handout Mode Only
+   ============================
+
+.. role:: handout
+
+
+.. Incremental Display
+   ===================
+
+.. role:: incremental
+.. default-role:: incremental
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/README.txt	(revision 1126)
@@ -0,0 +1,17 @@
+============================================
+ ``docutils/parsers/rst/include`` Directory
+============================================
+
+This directory contains standard data files intended for inclusion in
+reStructuredText documents.  To access these files, use the "include"
+directive with the special syntax for standard "include" data files,
+angle brackets around the file name::
+
+    .. include:: <isonum.txt>
+
+See the documentation for the `"include" directive`__ and
+`reStructuredText Standard Substitution Definition Sets`__ for
+details.
+
+__ http://docutils.sf.net/docs/ref/rst/directives.html#include
+__ http://docutils.sf.net/docs/ref/rst/substitutions.html
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isotech.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isotech.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isotech.txt	(revision 1126)
@@ -0,0 +1,168 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acd|      unicode:: U+0223F .. SINE WAVE
+.. |aleph|    unicode:: U+02135 .. ALEF SYMBOL
+.. |And|      unicode:: U+02A53 .. DOUBLE LOGICAL AND
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |andand|   unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND
+.. |andd|     unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH
+.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND
+.. |andv|     unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM
+.. |ang90|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angrt|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angsph|   unicode:: U+02222 .. SPHERICAL ANGLE
+.. |angst|    unicode:: U+0212B .. ANGSTROM SIGN
+.. |ap|       unicode:: U+02248 .. ALMOST EQUAL TO
+.. |apacir|   unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |awint|    unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION
+.. |becaus|   unicode:: U+02235 .. BECAUSE
+.. |bernou|   unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bne|      unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash
+.. |bnequiv|  unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash
+.. |bNot|     unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN
+.. |bnot|     unicode:: U+02310 .. REVERSED NOT SIGN
+.. |bottom|   unicode:: U+022A5 .. UP TACK
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Cconint|  unicode:: U+02230 .. VOLUME INTEGRAL
+.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION
+.. |compfn|   unicode:: U+02218 .. RING OPERATOR
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |Conint|   unicode:: U+0222F .. SURFACE INTEGRAL
+.. |conint|   unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |ctdot|    unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |cwint|    unicode:: U+02231 .. CLOCKWISE INTEGRAL
+.. |cylcty|   unicode:: U+0232D .. CYLINDRICITY
+.. |disin|    unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE
+.. |Dot|      unicode:: U+000A8 .. DIAERESIS
+.. |DotDot|   unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE
+.. |dsol|     unicode:: U+029F6 .. SOLIDUS WITH OVERBAR
+.. |dtdot|    unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS
+.. |dwangle|  unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP
+.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |epar|     unicode:: U+022D5 .. EQUAL AND PARALLEL TO
+.. |eparsl|   unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fltns|    unicode:: U+025B1 .. WHITE PARALLELOGRAM
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hamilt|   unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |iff|      unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |iinfin|   unicode:: U+029DC .. INCOMPLETE INFINITY
+.. |imped|    unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY
+.. |Int|      unicode:: U+0222C .. DOUBLE INTEGRAL
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |isindot|  unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE
+.. |isinE|    unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES
+.. |isins|    unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinsv|   unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinv|    unicode:: U+02208 .. ELEMENT OF
+.. |lagran|   unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Lang|     unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |lbbrk|    unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |loang|    unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET
+.. |lobrk|    unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |lopar|    unicode:: U+02985 .. LEFT WHITE PARENTHESIS
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |mnplus|   unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |nedot|    unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash
+.. |nhpar|    unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |nis|      unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |nisd|     unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE
+.. |niv|      unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Not|      unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash
+.. |notinE|   unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
+.. |notinva|  unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notinvb|  unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR
+.. |notinvc|  unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR
+.. |notni|    unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notniva|  unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notnivb|  unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR
+.. |notnivc|  unicode:: U+022FD .. CONTAINS WITH OVERBAR
+.. |nparsl|   unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash
+.. |npart|    unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash
+.. |npolint|  unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE
+.. |nvinfin|  unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR
+.. |olcross|  unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X
+.. |Or|       unicode:: U+02A54 .. DOUBLE LOGICAL OR
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |ord|      unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH
+.. |order|    unicode:: U+02134 .. SCRIPT SMALL O
+.. |oror|     unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR
+.. |orslope|  unicode:: U+02A57 .. SLOPING LARGE OR
+.. |orv|      unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM
+.. |par|      unicode:: U+02225 .. PARALLEL TO
+.. |parsl|    unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |permil|   unicode:: U+02030 .. PER MILLE SIGN
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |pertenk|  unicode:: U+02031 .. PER TEN THOUSAND SIGN
+.. |phmmat|   unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE
+.. |profline| unicode:: U+02312 .. ARC
+.. |profsurf| unicode:: U+02313 .. SEGMENT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |qint|     unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |qprime|   unicode:: U+02057 .. QUADRUPLE PRIME
+.. |quatint|  unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |Rang|     unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rbbrk|    unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET
+.. |roang|    unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET
+.. |robrk|    unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |ropar|    unicode:: U+02986 .. RIGHT WHITE PARENTHESIS
+.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |simdot|   unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE
+.. |sime|     unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+.. |square|   unicode:: U+025A1 .. WHITE SQUARE
+.. |squarf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |strns|    unicode:: U+000AF .. MACRON
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |tdot|     unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |tint|     unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |topbot|   unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM
+.. |topcir|   unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW
+.. |tprime|   unicode:: U+02034 .. TRIPLE PRIME
+.. |utdot|    unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS
+.. |uwangle|  unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN
+.. |vangrt|   unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE
+.. |veeeq|    unicode:: U+0225A .. EQUIANGULAR TO
+.. |Verbar|   unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |wedgeq|   unicode:: U+02259 .. ESTIMATES
+.. |xnis|     unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isopub.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isopub.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isopub.txt	(revision 1126)
@@ -0,0 +1,90 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |blank|  unicode:: U+02423 .. OPEN BOX
+.. |blk12|  unicode:: U+02592 .. MEDIUM SHADE
+.. |blk14|  unicode:: U+02591 .. LIGHT SHADE
+.. |blk34|  unicode:: U+02593 .. DARK SHADE
+.. |block|  unicode:: U+02588 .. FULL BLOCK
+.. |bull|   unicode:: U+02022 .. BULLET
+.. |caret|  unicode:: U+02041 .. CARET INSERTION POINT
+.. |check|  unicode:: U+02713 .. CHECK MARK
+.. |cir|    unicode:: U+025CB .. WHITE CIRCLE
+.. |clubs|  unicode:: U+02663 .. BLACK CLUB SUIT
+.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT
+.. |cross|  unicode:: U+02717 .. BALLOT X
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |dash|   unicode:: U+02010 .. HYPHEN
+.. |diams|  unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP
+.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP
+.. |dtri|   unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |dtrif|  unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE
+.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |female| unicode:: U+02640 .. FEMALE SIGN
+.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI
+.. |fflig|  unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF
+.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL
+.. |filig|  unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI
+.. |flat|   unicode:: U+0266D .. MUSIC FLAT SIGN
+.. |fllig|  unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL
+.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD
+.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH
+.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH
+.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS
+.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS
+.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS
+.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS
+.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS
+.. |hairsp| unicode:: U+0200A .. HAIR SPACE
+.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |hybull| unicode:: U+02043 .. HYPHEN BULLET
+.. |incare| unicode:: U+02105 .. CARE OF
+.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |lhblk|  unicode:: U+02584 .. LOWER HALF BLOCK
+.. |loz|    unicode:: U+025CA .. LOZENGE
+.. |lozf|   unicode:: U+029EB .. BLACK LOZENGE
+.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |ltri|   unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |ltrif|  unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |male|   unicode:: U+02642 .. MALE SIGN
+.. |malt|   unicode:: U+02720 .. MALTESE CROSS
+.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |mldr|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |natur|  unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |nldr|   unicode:: U+02025 .. TWO DOT LEADER
+.. |numsp|  unicode:: U+02007 .. FIGURE SPACE
+.. |phone|  unicode:: U+0260E .. BLACK TELEPHONE
+.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE
+.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rect|   unicode:: U+025AD .. WHITE RECTANGLE
+.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |rtri|   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |rtrif|  unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |rx|     unicode:: U+0211E .. PRESCRIPTION TAKE
+.. |sext|   unicode:: U+02736 .. SIX POINTED BLACK STAR
+.. |sharp|  unicode:: U+0266F .. MUSIC SHARP SIGN
+.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
+.. |squ|    unicode:: U+025A1 .. WHITE SQUARE
+.. |squf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |star|   unicode:: U+02606 .. WHITE STAR
+.. |starf|  unicode:: U+02605 .. BLACK STAR
+.. |target| unicode:: U+02316 .. POSITION INDICATOR
+.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |uhblk|  unicode:: U+02580 .. UPPER HALF BLOCK
+.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP
+.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP
+.. |utri|   unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |utrif|  unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isobox.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isobox.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isobox.txt	(revision 1126)
@@ -0,0 +1,46 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT
+.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT
+.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT
+.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT
+.. |boxH|  unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL
+.. |boxh|  unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL
+.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT
+.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT
+.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT
+.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT
+.. |boxV|  unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL
+.. |boxv|  unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL
+.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT
+.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk4-wide.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk4-wide.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isogrk4-wide.txt	(revision 1126)
@@ -0,0 +1,49 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.alpha|  unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA
+.. |b.beta|   unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA
+.. |b.chi|    unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI
+.. |b.Delta|  unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA
+.. |b.delta|  unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA
+.. |b.epsi|   unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON
+.. |b.epsiv|  unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL
+.. |b.eta|    unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA
+.. |b.Gamma|  unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA
+.. |b.gamma|  unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |b.iota|   unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA
+.. |b.kappa|  unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA
+.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL
+.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA
+.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA
+.. |b.mu|     unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU
+.. |b.nu|     unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU
+.. |b.Omega|  unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA
+.. |b.omega|  unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA
+.. |b.Phi|    unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI
+.. |b.phi|    unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI
+.. |b.phiv|   unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL
+.. |b.Pi|     unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI
+.. |b.pi|     unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI
+.. |b.piv|    unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL
+.. |b.Psi|    unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI
+.. |b.psi|    unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI
+.. |b.rho|    unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO
+.. |b.rhov|   unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL
+.. |b.Sigma|  unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA
+.. |b.sigma|  unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA
+.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA
+.. |b.tau|    unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU
+.. |b.Theta|  unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA
+.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA
+.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL
+.. |b.Upsi|   unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON
+.. |b.upsi|   unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON
+.. |b.Xi|     unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI
+.. |b.xi|     unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI
+.. |b.zeta|   unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isonum.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isonum.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isonum.txt	(revision 1126)
@@ -0,0 +1,82 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |amp|    unicode:: U+00026 .. AMPERSAND
+.. |apos|   unicode:: U+00027 .. APOSTROPHE
+.. |ast|    unicode:: U+0002A .. ASTERISK
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |bsol|   unicode:: U+0005C .. REVERSE SOLIDUS
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |colon|  unicode:: U+0003A .. COLON
+.. |comma|  unicode:: U+0002C .. COMMA
+.. |commat| unicode:: U+00040 .. COMMERCIAL AT
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |darr|   unicode:: U+02193 .. DOWNWARDS ARROW
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |dollar| unicode:: U+00024 .. DOLLAR SIGN
+.. |equals| unicode:: U+0003D .. EQUALS SIGN
+.. |excl|   unicode:: U+00021 .. EXCLAMATION MARK
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS
+.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS
+.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |half|   unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR
+.. |hyphen| unicode:: U+02010 .. HYPHEN
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |larr|   unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lcub|   unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lowbar| unicode:: U+0005F .. LOW LINE
+.. |lpar|   unicode:: U+00028 .. LEFT PARENTHESIS
+.. |lsqb|   unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |num|    unicode:: U+00023 .. NUMBER SIGN
+.. |ohm|    unicode:: U+02126 .. OHM SIGN
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |percnt| unicode:: U+00025 .. PERCENT SIGN
+.. |period| unicode:: U+0002E .. FULL STOP
+.. |plus|   unicode:: U+0002B .. PLUS SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |quest|  unicode:: U+0003F .. QUESTION MARK
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |rarr|   unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rcub|   unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |rpar|   unicode:: U+00029 .. RIGHT PARENTHESIS
+.. |rsqb|   unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |semi|   unicode:: U+0003B .. SEMICOLON
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sol|    unicode:: U+0002F .. SOLIDUS
+.. |sung|   unicode:: U+0266A .. EIGHTH NOTE
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |trade|  unicode:: U+02122 .. TRADE MARK SIGN
+.. |uarr|   unicode:: U+02191 .. UPWARDS ARROW
+.. |verbar| unicode:: U+0007C .. VERTICAL LINE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomfrk.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomfrk.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomfrk.txt	(revision 1126)
@@ -0,0 +1,11 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-lat1.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-lat1.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-lat1.txt	(revision 1126)
@@ -0,0 +1,102 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |acute|  unicode:: U+000B4 .. ACUTE ACCENT
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |cedil|  unicode:: U+000B8 .. CEDILLA
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |macr|   unicode:: U+000AF .. MACRON
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |uml|    unicode:: U+000A8 .. DIAERESIS
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomopf.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomopf.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/isomopf.txt	(revision 1126)
@@ -0,0 +1,13 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlextra-wide.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlextra-wide.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/mmlextra-wide.txt	(revision 1126)
@@ -0,0 +1,113 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |aopf|                    unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |bopf|                    unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B
+.. |copf|                    unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |dopf|                    unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |eopf|                    unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |fopf|                    unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F
+.. |gopf|                    unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |hopf|                    unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |iopf|                    unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |jopf|                    unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J
+.. |kopf|                    unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |lopf|                    unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |mopf|                    unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |nopf|                    unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |oopf|                    unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |popf|                    unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |qopf|                    unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |ropf|                    unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |sopf|                    unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |topf|                    unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |uopf|                    unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |vopf|                    unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V
+.. |wopf|                    unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W
+.. |xopf|                    unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X
+.. |yopf|                    unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |zopf|                    unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-symbol.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-symbol.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/include/xhtml1-symbol.txt	(revision 1126)
@@ -0,0 +1,130 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alefsym|  unicode:: U+02135 .. ALEF SYMBOL
+.. |Alpha|    unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |alpha|    unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Beta|     unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |beta|     unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |bull|     unicode:: U+02022 .. BULLET
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Chi|      unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |chi|      unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |clubs|    unicode:: U+02663 .. BLACK CLUB SUIT
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |crarr|    unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr|     unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Delta|    unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|    unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |diams|    unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |Epsilon|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |epsilon|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |Eta|      unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eta|      unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |frasl|    unicode:: U+02044 .. FRACTION SLASH
+.. |Gamma|    unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|    unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |hearts|   unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |Iota|     unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |iota|     unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |Kappa|    unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kappa|    unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |Lambda|   unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda|   unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |larr|     unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lceil|    unicode:: U+02308 .. LEFT CEILING
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |lfloor|   unicode:: U+0230A .. LEFT FLOOR
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |loz|      unicode:: U+025CA .. LOZENGE
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |Mu|       unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mu|       unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |Nu|       unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |nu|       unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |oline|    unicode:: U+0203E .. OVERLINE
+.. |Omega|    unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|    unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Omicron|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |omicron|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |Phi|      unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|      unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Pi|       unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|       unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|      unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |Psi|      unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|      unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rarr|     unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rceil|    unicode:: U+02309 .. RIGHT CEILING
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfloor|   unicode:: U+0230B .. RIGHT FLOOR
+.. |Rho|      unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rho|      unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |Sigma|    unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|    unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmaf|   unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |spades|   unicode:: U+02660 .. BLACK SPADE SUIT
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Tau|      unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tau|      unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |Theta|    unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|    unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |trade|    unicode:: U+02122 .. TRADE MARK SIGN
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr|     unicode:: U+02191 .. UPWARDS ARROW
+.. |upsih|    unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |Upsilon|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |upsilon|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |Xi|       unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|       unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zeta|     unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zeta|     unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/__init__.py	(revision 1126)
@@ -0,0 +1,407 @@
+# $Id: __init__.py 7961 2016-07-28 22:02:47Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is ``docutils.parsers.rst`` package. It exports a single class, `Parser`,
+the reStructuredText parser.
+
+
+Usage
+=====
+
+1. Create a parser::
+
+       parser = docutils.parsers.rst.Parser()
+
+   Several optional arguments may be passed to modify the parser's behavior.
+   Please see `Customizing the Parser`_ below for details.
+
+2. Gather input (a multi-line string), by reading a file or the standard
+   input::
+
+       input = sys.stdin.read()
+
+3. Create a new empty `docutils.nodes.document` tree::
+
+       document = docutils.utils.new_document(source, settings)
+
+   See `docutils.utils.new_document()` for parameter details.
+
+4. Run the parser, populating the document tree::
+
+       parser.parse(input, document)
+
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a state machine, examining its
+input one line at a time. To understand how the parser works, please first
+become familiar with the `docutils.statemachine` module, then see the
+`states` module.
+
+
+Customizing the Parser
+----------------------
+
+Anything that isn't already customizable is that way simply because that type
+of customizability hasn't been implemented yet.  Patches welcome!
+
+When instantiating an object of the `Parser` class, two parameters may be
+passed: ``rfc2822`` and ``inliner``.  Pass ``rfc2822=True`` to enable an
+initial RFC-2822 style header block, parsed as a "field_list" element (with
+"class" attribute set to "rfc2822").  Currently this is the only body-level
+element which is customizable without subclassing.  (Tip: subclass `Parser`
+and change its "state_classes" and "initial_state" attributes to refer to new
+classes. Contact the author if you need more details.)
+
+The ``inliner`` parameter takes an instance of `states.Inliner` or a subclass.
+It handles inline markup recognition.  A common extension is the addition of
+further implicit hyperlinks, like "RFC 2822".  This can be done by subclassing
+`states.Inliner`, adding a new method for the implicit markup, and adding a
+``(pattern, method)`` pair to the "implicit_dispatch" attribute of the
+subclass.  See `states.Inliner.implicit_inline()` for details.  Explicit
+inline markup can be customized in a `states.Inliner` subclass via the
+``patterns.initial`` and ``dispatch`` attributes (and new methods as
+appropriate).
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils.parsers
+import docutils.statemachine
+from docutils.parsers.rst import states
+from docutils import frontend, nodes, Component
+from docutils.transforms import universal
+
+
+class Parser(docutils.parsers.Parser):
+
+    """The reStructuredText parser."""
+
+    supported = ('restructuredtext', 'rst', 'rest', 'restx', 'rtxt', 'rstx')
+    """Aliases this parser supports."""
+
+    settings_spec = (
+        'reStructuredText Parser Options',
+        None,
+        (('Recognize and link to standalone PEP references (like "PEP 258").',
+          ['--pep-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for PEP references '
+          '(default "http://www.python.org/dev/peps/").',
+          ['--pep-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.python.org/dev/peps/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Template for PEP file part of URL. (default "pep-%04d")',
+          ['--pep-file-url-template'],
+          {'metavar': '<URL>', 'default': 'pep-%04d'}),
+         ('Recognize and link to standalone RFC references (like "RFC 822").',
+          ['--rfc-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for RFC references (default "http://tools.ietf.org/html/").',
+          ['--rfc-base-url'],
+          {'metavar': '<URL>', 'default': 'http://tools.ietf.org/html/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Set number of spaces for tab expansion (default 8).',
+          ['--tab-width'],
+          {'metavar': '<width>', 'type': 'int', 'default': 8,
+           'validator': frontend.validate_nonnegative_int}),
+         ('Remove spaces before footnote references.',
+          ['--trim-footnote-reference-space'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Leave spaces before footnote references.',
+          ['--leave-footnote-reference-space'],
+          {'action': 'store_false', 'dest': 'trim_footnote_reference_space'}),
+         ('Disable directives that insert the contents of external file '
+          '("include" & "raw"); replaced with a "warning" system message.',
+          ['--no-file-insertion'],
+          {'action': 'store_false', 'default': 1,
+           'dest': 'file_insertion_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable directives that insert the contents of external file '
+          '("include" & "raw").  Enabled by default.',
+          ['--file-insertion-enabled'],
+          {'action': 'store_true'}),
+         ('Disable the "raw" directives; replaced with a "warning" '
+          'system message.',
+          ['--no-raw'],
+          {'action': 'store_false', 'default': 1, 'dest': 'raw_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable the "raw" directive.  Enabled by default.',
+          ['--raw-enabled'],
+          {'action': 'store_true'}),
+         ('Token name set for parsing code with Pygments: one of '
+          '"long", "short", or "none (no parsing)". Default is "long".',
+          ['--syntax-highlight'],
+          {'choices': ['long', 'short', 'none'],
+           'default': 'long', 'metavar': '<format>'}),
+         ('Change straight quotation marks to typographic form: '
+          'one of "yes", "no", "alt[ernative]" (default "no").',
+          ['--smart-quotes'],
+          {'default': False, 'validator': frontend.validate_ternary}),
+         ('Inline markup recognized at word boundaries only '
+          '(adjacent to punctuation or whitespace). '
+          'Force character-level inline markup recognition with '
+          '"\ " (backslash + space). Default.',
+          ['--word-level-inline-markup'],
+          {'action': 'store_false', 'dest': 'character_level_inline_markup'}),
+         ('Inline markup recognized anywhere, regardless of surrounding '
+          'characters. Backslash-escapes must be used to avoid unwanted '
+          'markup recognition. Useful for East Asian languages. '
+          'Experimental.',
+          ['--character-level-inline-markup'],
+          {'action': 'store_true', 'default': False,
+           'dest': 'character_level_inline_markup'}),
+        ))
+
+    config_section = 'restructuredtext parser'
+    config_section_dependencies = ('parsers',)
+
+    def __init__(self, rfc2822=False, inliner=None):
+        if rfc2822:
+            self.initial_state = 'RFC2822Body'
+        else:
+            self.initial_state = 'Body'
+        self.state_classes = states.state_classes
+        self.inliner = inliner
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.SmartQuotes]
+
+    def parse(self, inputstring, document):
+        """Parse `inputstring` and populate `document`, a document tree."""
+        self.setup_parse(inputstring, document)
+        self.statemachine = states.RSTStateMachine(
+              state_classes=self.state_classes,
+              initial_state=self.initial_state,
+              debug=document.reporter.debug_flag)
+        inputlines = docutils.statemachine.string2lines(
+              inputstring, tab_width=document.settings.tab_width,
+              convert_whitespace=True)
+        self.statemachine.run(inputlines, document, inliner=self.inliner)
+        self.finish_parse()
+
+
+class DirectiveError(Exception):
+
+    """
+    Store a message and a system message level.
+
+    To be thrown from inside directive code.
+
+    Do not instantiate directly -- use `Directive.directive_error()`
+    instead!
+    """
+
+    def __init__(self, level, message):
+        """Set error `message` and `level`"""
+        Exception.__init__(self)
+        self.level = level
+        self.msg = message
+
+
+class Directive(object):
+
+    """
+    Base class for reStructuredText directives.
+
+    The following attributes may be set by subclasses.  They are
+    interpreted by the directive parser (which runs the directive
+    class):
+
+    - `required_arguments`: The number of required arguments (default:
+      0).
+
+    - `optional_arguments`: The number of optional arguments (default:
+      0).
+
+    - `final_argument_whitespace`: A boolean, indicating if the final
+      argument may contain whitespace (default: False).
+
+    - `option_spec`: A dictionary, mapping known option names to
+      conversion functions such as `int` or `float` (default: {}, no
+      options).  Several conversion functions are defined in the
+      directives/__init__.py module.
+
+      Option conversion functions take a single parameter, the option
+      argument (a string or ``None``), validate it and/or convert it
+      to the appropriate form.  Conversion functions may raise
+      `ValueError` and `TypeError` exceptions.
+
+    - `has_content`: A boolean; True if content is allowed.  Client
+      code must handle the case where content is required but not
+      supplied (an empty content list will be supplied).
+
+    Arguments are normally single whitespace-separated words.  The
+    final argument may contain whitespace and/or newlines if
+    `final_argument_whitespace` is True.
+
+    If the form of the arguments is more complex, specify only one
+    argument (either required or optional) and set
+    `final_argument_whitespace` to True; the client code must do any
+    context-sensitive parsing.
+
+    When a directive implementation is being run, the directive class
+    is instantiated, and the `run()` method is executed.  During
+    instantiation, the following instance variables are set:
+
+    - ``name`` is the directive type or name (string).
+
+    - ``arguments`` is the list of positional arguments (strings).
+
+    - ``options`` is a dictionary mapping option names (strings) to
+      values (type depends on option conversion functions; see
+      `option_spec` above).
+
+    - ``content`` is a list of strings, the directive content line by line.
+
+    - ``lineno`` is the absolute line number of the first line
+      of the directive.
+
+    - ``content_offset`` is the line offset of the first line of the content from
+      the beginning of the current input.  Used when initiating a nested parse.
+
+    - ``block_text`` is a string containing the entire directive.
+
+    - ``state`` is the state which called the directive function.
+
+    - ``state_machine`` is the state machine which controls the state which called
+      the directive function.
+
+    Directive functions return a list of nodes which will be inserted
+    into the document tree at the point where the directive was
+    encountered.  This can be an empty list if there is nothing to
+    insert.
+
+    For ordinary directives, the list must contain body elements or
+    structural elements.  Some directives are intended specifically
+    for substitution definitions, and must return a list of `Text`
+    nodes and/or inline elements (suitable for inline insertion, in
+    place of the substitution reference).  Such directives must verify
+    substitution definition context, typically using code like this::
+
+        if not isinstance(state, states.SubstitutionDef):
+            error = state_machine.reporter.error(
+                'Invalid context: the "%s" directive can only be used '
+                'within a substitution definition.' % (name),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+    """
+
+    # There is a "Creating reStructuredText Directives" how-to at
+    # <http://docutils.sf.net/docs/howto/rst-directives.html>.  If you
+    # update this docstring, please update the how-to as well.
+
+    required_arguments = 0
+    """Number of required directive arguments."""
+
+    optional_arguments = 0
+    """Number of optional arguments after the required arguments."""
+
+    final_argument_whitespace = False
+    """May the final argument contain whitespace?"""
+
+    option_spec = None
+    """Mapping of option names to validator functions."""
+
+    has_content = False
+    """May the directive have content?"""
+
+    def __init__(self, name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine):
+        self.name = name
+        self.arguments = arguments
+        self.options = options
+        self.content = content
+        self.lineno = lineno
+        self.content_offset = content_offset
+        self.block_text = block_text
+        self.state = state
+        self.state_machine = state_machine
+
+    def run(self):
+        raise NotImplementedError('Must override run() is subclass.')
+
+    # Directive errors:
+
+    def directive_error(self, level, message):
+        """
+        Return a DirectiveError suitable for being thrown as an exception.
+
+        Call "raise self.directive_error(level, message)" from within
+        a directive implementation to return one single system message
+        at level `level`, which automatically gets the directive block
+        and the line number added.
+
+        Preferably use the `debug`, `info`, `warning`, `error`, or `severe`
+        wrapper methods, e.g. ``self.error(message)`` to generate an
+        ERROR-level directive error.
+        """
+        return DirectiveError(level, message)
+
+    def debug(self, message):
+        return self.directive_error(0, message)
+
+    def info(self, message):
+        return self.directive_error(1, message)
+
+    def warning(self, message):
+        return self.directive_error(2, message)
+
+    def error(self, message):
+        return self.directive_error(3, message)
+
+    def severe(self, message):
+        return self.directive_error(4, message)
+
+    # Convenience methods:
+
+    def assert_has_content(self):
+        """
+        Throw an ERROR-level DirectiveError if the directive doesn't
+        have contents.
+        """
+        if not self.content:
+            raise self.error('Content block expected for the "%s" directive; '
+                             'none found.' % self.name)
+
+    def add_name(self, node):
+        """Append self.options['name'] to node['names'] if it exists.
+
+        Also normalize the name string and register it as explicit target.
+        """
+        if 'name' in self.options:
+            name = nodes.fully_normalize_name(self.options.pop('name'))
+            if 'name' in node:
+                del(node['name'])
+            node['names'].append(name)
+            self.state.document.note_explicit_target(node, node)
+
+
+def convert_directive_function(directive_fn):
+    """
+    Define & return a directive class generated from `directive_fn`.
+
+    `directive_fn` uses the old-style, functional interface.
+    """
+
+    class FunctionalDirective(Directive):
+
+        option_spec = getattr(directive_fn, 'options', None)
+        has_content = getattr(directive_fn, 'content', False)
+        _argument_spec = getattr(directive_fn, 'arguments', (0, 0, False))
+        required_arguments, optional_arguments, final_argument_whitespace \
+            = _argument_spec
+
+        def run(self):
+            return directive_fn(
+                self.name, self.arguments, self.options, self.content,
+                self.lineno, self.content_offset, self.block_text,
+                self.state, self.state_machine)
+
+    # Return new-style directive.
+    return FunctionalDirective
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/es.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/es.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/es.py	(revision 1126)
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'atenci\u00f3n': 'attention',
+      u'atencion': 'attention',
+      u'precauci\u00f3n': 'caution',
+      u'code (translation required)': 'code',
+      u'precaucion': 'caution',
+      u'peligro': 'danger',
+      u'error': 'error',
+      u'sugerencia': 'hint',
+      u'importante': 'important',
+      u'nota': 'note',
+      u'consejo': 'tip',
+      u'advertencia': 'warning',
+      u'exhortacion': 'admonition',
+      u'exhortaci\u00f3n': 'admonition',
+      u'nota-al-margen': 'sidebar',
+      u'tema': 'topic',
+      u'bloque-de-lineas': 'line-block',
+      u'bloque-de-l\u00edneas': 'line-block',
+      u'literal-evaluado': 'parsed-literal',
+      u'firma': 'rubric',
+      u'ep\u00edgrafe': 'epigraph',
+      u'epigrafe': 'epigraph',
+      u'destacado': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'combinacion': 'compound',
+      u'combinaci\u00f3n': 'compound',
+      u'contenedor': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabla': 'table',
+      u'tabla-vsc': 'csv-table',
+      u'tabla-csv': 'csv-table',
+      u'tabla-lista': 'list-table',
+      u'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      u'imagen': 'image',
+      u'figura': 'figure',
+      u'incluir': 'include',
+      u'sin-analisis': 'raw',
+      u'sin-an\u00e1lisis': 'raw',
+      u'reemplazar': 'replace',
+      u'unicode': 'unicode',
+      u'fecha': 'date',
+      u'clase': 'class',
+      u'rol': 'role',
+      u'rol-por-omision': 'default-role',
+      u'rol-por-omisi\u00f3n': 'default-role',
+      u'titulo': 'title',
+      u't\u00edtulo': 'title',
+      u'contenido': 'contents',
+      u'numseccion': 'sectnum',
+      u'numsecci\u00f3n': 'sectnum',
+      u'numeracion-seccion': 'sectnum',
+      u'numeraci\u00f3n-secci\u00f3n': 'sectnum',
+      u'notas-destino': 'target-notes',
+      u'cabecera': 'header',
+      u'pie': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Spanish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    u'abreviatura': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acronimo': 'acronym',
+    u'acronimo': 'acronym',
+    u'ac': 'acronym',
+    u'code (translation required)': 'code',
+    u'indice': 'index',
+    u'i': 'index',
+    u'subindice': 'subscript',
+    u'sub\u00edndice': 'subscript',
+    u'superindice': 'superscript',
+    u'super\u00edndice': 'superscript',
+    u'referencia-titulo': 'title-reference',
+    u'titulo': 'title-reference',
+    u't': 'title-reference',
+    u'referencia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'referencia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'enfasis': 'emphasis',
+    u'\u00e9nfasis': 'emphasis',
+    u'destacado': 'strong',
+    u'literal': 'literal',              # "literal" is also a word in Spanish :-)
+    u'math (translation required)': 'math',
+    u'referencia-con-nombre': 'named-reference',
+    u'referencia-anonima': 'anonymous-reference',
+    u'referencia-an\u00f3nima': 'anonymous-reference',
+    u'referencia-nota-al-pie': 'footnote-reference',
+    u'referencia-cita': 'citation-reference',
+    u'referencia-sustitucion': 'substitution-reference',
+    u'referencia-sustituci\u00f3n': 'substitution-reference',
+    u'destino': 'target',
+    u'referencia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'sin-analisis': 'raw',
+    u'sin-an\u00e1lisis': 'raw',
+}
+"""Mapping of Spanish role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fr.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fr.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fr.py	(revision 1126)
@@ -0,0 +1,103 @@
+# $Id: fr.py 7119 2011-09-02 13:00:23Z milde $
+# Authors: David Goodger <goodger@python.org>; William Dode
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'attention': 'attention',
+      u'pr\u00E9caution': 'caution',
+      u'code': 'code',
+      u'danger': 'danger',
+      u'erreur': 'error',
+      u'conseil': 'hint',
+      u'important': 'important',
+      u'note': 'note',
+      u'astuce': 'tip',
+      u'avertissement': 'warning',
+      u'admonition': 'admonition',
+      u'encadr\u00E9': 'sidebar',
+      u'sujet': 'topic',
+      u'bloc-textuel': 'line-block',
+      u'bloc-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'code-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'intertitre': 'rubric',
+      u'exergue': 'epigraph',
+      u'\u00E9pigraphe': 'epigraph',
+      u'chapeau': 'highlights',
+      u'accroche': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qr': 'questions',
+      #u'faq': 'questions',
+      u'tableau': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'm\u00E9ta': 'meta',
+      'math (translation required)': 'math',
+      #u'imagemap (translation required)': 'imagemap',
+      u'image': 'image',
+      u'figure': 'figure',
+      u'inclure': 'include',
+      u'brut': 'raw',
+      u'remplacer': 'replace',
+      u'remplace': 'replace',
+      u'unicode': 'unicode',
+      u'date': 'date',
+      u'classe': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'titre (translation required)': 'title',
+      u'sommaire': 'contents',
+      u'table-des-mati\u00E8res': 'contents',
+      u'sectnum': 'sectnum',
+      u'section-num\u00E9rot\u00E9e': 'sectnum',
+      u'liens': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      }
+"""French name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abr\u00E9viation': 'abbreviation',
+      u'acronyme': 'acronym',
+      u'sigle': 'acronym',
+      u'code': 'code',
+      u'index': 'index',
+      u'indice': 'subscript',
+      u'ind': 'subscript',
+      u'exposant': 'superscript',
+      u'exp': 'superscript',
+      u'titre-r\u00E9f\u00E9rence': 'title-reference',
+      u'titre': 'title-reference',
+      u'pep-r\u00E9f\u00E9rence': 'pep-reference',
+      u'rfc-r\u00E9f\u00E9rence': 'rfc-reference',
+      u'emphase': 'emphasis',
+      u'fort': 'strong',
+      u'litt\u00E9ral': 'literal',
+    'math (translation required)': 'math',
+      u'nomm\u00E9e-r\u00E9f\u00E9rence': 'named-reference',
+      u'anonyme-r\u00E9f\u00E9rence': 'anonymous-reference',
+      u'note-r\u00E9f\u00E9rence': 'footnote-reference',
+      u'citation-r\u00E9f\u00E9rence': 'citation-reference',
+      u'substitution-r\u00E9f\u00E9rence': 'substitution-reference',
+      u'lien': 'target',
+      u'uri-r\u00E9f\u00E9rence': 'uri-reference',
+      u'brut': 'raw',}
+"""Mapping of French role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/nl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/nl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/nl.py	(revision 1126)
@@ -0,0 +1,112 @@
+# $Id: nl.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attentie': 'attention',
+      'let-op': 'caution',
+      'code (translation required)': 'code',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'hint': 'hint',
+      'belangrijk': 'important',
+      'opmerking': 'note',
+      'tip': 'tip',
+      'waarschuwing': 'warning',
+      'aanmaning': 'admonition',
+      'katern': 'sidebar',
+      'onderwerp': 'topic',
+      'lijn-blok': 'line-block',
+      'letterlijk-ontleed': 'parsed-literal',
+      'rubriek': 'rubric',
+      'opschrift': 'epigraph',
+      'hoogtepunten': 'highlights',
+      'pull-quote': 'pull-quote', # Dutch printers use the english term
+      'samenstelling': 'compound',
+      'verbinding': 'compound',
+      u'container (translation required)': 'container',
+      #'vragen': 'questions',
+      'tabel': 'table',
+      'csv-tabel': 'csv-table',
+      'lijst-tabel': 'list-table',
+      #'veelgestelde-vragen': 'questions',
+      'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'opnemen': 'include',
+      'onbewerkt': 'raw',
+      'vervang': 'replace',
+      'vervanging': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'sectie-nummering': 'sectnum',
+      'hoofdstuk-nummering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnoten': 'footnotes',
+      #'citaten': 'citations',
+      'verwijzing-voetnoten': 'target-notes',
+      'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
+"""Dutch name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'afkorting': 'abbreviation',
+    # 'ab': 'abbreviation',
+    'acroniem': 'acronym',
+    'ac': 'acronym',
+    u'code (translation required)': 'code',
+    'index': 'index',
+    'i': 'index',
+    'inferieur': 'subscript',
+    'inf': 'subscript',
+    'superieur': 'superscript',
+    'sup': 'superscript',
+    'titel-referentie': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-referentie': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-referentie': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'extra': 'strong',
+    'extra-nadruk': 'strong',
+    'vet': 'strong',
+    'letterlijk': 'literal',
+    'math (translation required)': 'math',
+    'benoemde-referentie': 'named-reference',
+    'anonieme-referentie': 'anonymous-reference',
+    'voetnoot-referentie': 'footnote-reference',
+    'citaat-referentie': 'citation-reference',
+    'substitie-reference': 'substitution-reference',
+    'verwijzing': 'target',
+    'uri-referentie': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'onbewerkt': 'raw',}
+"""Mapping of Dutch role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/pl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/pl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/pl.py	(revision 1126)
@@ -0,0 +1,102 @@
+# $Id$
+# Author: Robert Wojciechowicz <rw@smsnet.pl>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Polish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'uwaga': 'attention',
+      u'ostro\u017cnie': 'caution',
+      u'code (translation required)': 'code',
+      u'niebezpiecze\u0144stwo': 'danger',
+      u'b\u0142\u0105d': 'error',
+      u'wskaz\u00f3wka': 'hint',
+      u'wa\u017cne': 'important',
+      u'przypis': 'note',
+      u'rada': 'tip',
+      u'ostrze\u017cenie': 'warning',
+      u'upomnienie': 'admonition',
+      u'ramka': 'sidebar',
+      u'temat': 'topic',
+      u'blok-linii': 'line-block',
+      u'sparsowany-litera\u0142': 'parsed-literal',
+      u'rubryka': 'rubric',
+      u'epigraf': 'epigraph',
+      u'highlights': 'highlights',  # FIXME no polish equivalent?
+      u'pull-quote': 'pull-quote',  # FIXME no polish equivalent?
+      u'z\u0142o\u017cony': 'compound',
+      u'kontener': 'container',
+      #'questions': 'questions',
+      u'tabela': 'table',
+      u'tabela-csv': 'csv-table',
+      u'tabela-listowa': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      u'obraz': 'image',
+      u'rycina': 'figure',
+      u'do\u0142\u0105cz': 'include',
+      u'surowe': 'raw',
+      u'zast\u0105p': 'replace',
+      u'unikod': 'unicode',
+      u'data': 'date',
+      u'klasa': 'class',
+      u'rola': 'role',
+      u'rola-domy\u015blna': 'default-role',
+      u'tytu\u0142': 'title',
+      u'tre\u015b\u0107': 'contents',
+      u'sectnum': 'sectnum',
+      u'numeracja-sekcji': 'sectnum',
+      u'nag\u0142\u00f3wek': 'header',
+      u'stopka': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'target-notes': 'target-notes',  # FIXME no polish equivalent?
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Polish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'skr\u00f3t': 'abbreviation',
+    u'akronim': 'acronym',
+    u'code (translation required)': 'code',
+    u'indeks': 'index',
+    u'indeks-dolny': 'subscript',
+    u'indeks-g\u00f3rny': 'superscript',
+    u'referencja-tytu\u0142': 'title-reference',
+    u'referencja-pep': 'pep-reference',
+    u'referencja-rfc': 'rfc-reference',
+    u'podkre\u015blenie': 'emphasis',
+    u'wyt\u0142uszczenie': 'strong',
+    u'dos\u0142ownie': 'literal',
+    'math (translation required)': 'math',
+    u'referencja-nazwana': 'named-reference',
+    u'referencja-anonimowa': 'anonymous-reference',
+    u'referencja-przypis': 'footnote-reference',
+    u'referencja-cytat': 'citation-reference',
+    u'referencja-podstawienie': 'substitution-reference',
+    u'cel': 'target',
+    u'referencja-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'surowe': 'raw',}
+"""Mapping of Polish role names to canonical role names for interpreted text.
+"""
+    
+
+                 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/it.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/it.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/it.py	(revision 1126)
@@ -0,0 +1,97 @@
+# $Id: it.py 7119 2011-09-02 13:00:23Z milde $
+# Authors: Nicola Larosa <docutils@tekNico.net>;
+#          Lele Gaifax <lele@seldati.it>
+# Copyright: This module has been placed in the public domain.
+
+# Beware: the italian translation of the reStructuredText documentation
+# at http://docit.bice.dyndns.org/static/ReST, in particular
+# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs
+# to be synced with the content of this file.
+
+"""
+Italian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'attenzione': 'attention',
+      'cautela': 'caution',
+      'code (translation required)': 'code',
+      'pericolo': 'danger',
+      'errore': 'error',
+      'suggerimento': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'consiglio': 'tip',
+      'avvertenza': 'warning',
+      'ammonizione': 'admonition',
+      'riquadro': 'sidebar',
+      'argomento': 'topic',
+      'blocco-di-righe': 'line-block',
+      'blocco-interpretato': 'parsed-literal',
+      'rubrica': 'rubric',
+      'epigrafe': 'epigraph',
+      'punti-salienti': 'highlights',
+      'estratto-evidenziato': 'pull-quote',
+      'composito': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'tabella': 'table',
+      'tabella-csv': 'csv-table',
+      'tabella-elenco': 'list-table',
+      'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      'immagine': 'image',
+      'figura': 'figure',
+      'includi': 'include',
+      'grezzo': 'raw',
+      'sostituisci': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'ruolo': 'role',
+      'ruolo-predefinito': 'default-role',
+      'titolo': 'title',
+      'indice': 'contents',
+      'contenuti': 'contents',
+      'seznum': 'sectnum',
+      'sezioni-autonumerate': 'sectnum',
+      'annota-riferimenti-esterni': 'target-notes',
+      'intestazione': 'header',
+      'piede-pagina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Italian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      'abbreviazione': 'abbreviation',
+      'acronimo': 'acronym',
+      u'code (translation required)': 'code',
+      'indice': 'index',
+      'deponente': 'subscript',
+      'esponente': 'superscript',
+      'riferimento-titolo': 'title-reference',
+      'riferimento-pep': 'pep-reference',
+      'riferimento-rfc': 'rfc-reference',
+      'enfasi': 'emphasis',
+      'forte': 'strong',
+      'letterale': 'literal',
+    'math (translation required)': 'math',
+      'riferimento-con-nome': 'named-reference',
+      'riferimento-anonimo': 'anonymous-reference',
+      'riferimento-nota': 'footnote-reference',
+      'riferimento-citazione': 'citation-reference',
+      'riferimento-sostituzione': 'substitution-reference',
+      'destinazione': 'target',
+      'riferimento-uri': 'uri-reference',
+      'grezzo': 'raw',}
+"""Mapping of Italian role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/sk.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/sk.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/sk.py	(revision 1126)
@@ -0,0 +1,95 @@
+# $Id: sk.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'pozor': 'attention',
+      u'opatrne': 'caution',
+      u'code (translation required)': 'code',
+      u'nebezpe\xe8enstvo': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\xf4le\x9eit\xe9': 'important',
+      u'pozn\xe1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varovanie': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\xe9ma': 'topic',
+      u'blok-riadkov': 'line-block',
+      u'parsed-literal': 'parsed-literal',
+      u'rubric (translation required)': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qa': 'questions',
+      #u'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      'math (translation required)': 'math',
+      #u'imagemap': 'imagemap',
+      u'obr\xe1zok': 'image',
+      u'tvar': 'figure',
+      u'vlo\x9ei\x9d': 'include',
+      u'raw (translation required)': 'raw',
+      u'nahradi\x9d': 'replace',
+      u'unicode': 'unicode',
+      u'd\u00E1tum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'\xe8as\x9d': 'sectnum',
+      u'\xe8as\x9d-\xe8\xedslovanie': 'sectnum',
+      u'cie\xbeov\xe9-pozn\xe1mky': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes': 'footnotes',
+      #u'citations': 'citations',
+      }
+"""Slovak name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'code (translation required)': 'code',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+    'math (translation required)': 'math',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'raw (translation required)': 'raw',}
+"""Mapping of Slovak role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/lt.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/lt.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/lt.py	(revision 1126)
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+# $Id: lt.py 7668 2013-06-04 12:46:30Z milde $
+# Author: Dalius Dobravolskas <dalius.do...@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Lithuanian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'dėmesio': 'attention',
+      u'atsargiai': 'caution',
+      u'code (translation required)': 'code',
+      u'pavojinga': 'danger',
+      u'klaida': 'error',
+      u'užuomina': 'hint',
+      u'svarbu': 'important',
+      u'pastaba': 'note',
+      u'patarimas': 'tip',
+      u'įspėjimas': 'warning',
+      u'perspėjimas': 'admonition',
+      u'šoninė-juosta': 'sidebar',
+      u'tema': 'topic',
+      u'linijinis-blokas': 'line-block',
+      u'išanalizuotas-literalas': 'parsed-literal',
+      u'rubrika': 'rubric',
+      u'epigrafas': 'epigraph',
+      u'pagridiniai-momentai': 'highlights',
+      u'atitraukta-citata': 'pull-quote',
+      u'sudėtinis-darinys': 'compound',
+      u'konteineris': 'container',
+      #'questions': 'questions',
+      u'lentelė': 'table',
+      u'csv-lentelė': 'csv-table',
+      u'sąrašo-lentelė': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      u'matematika': 'math',
+      #'imagemap': 'imagemap',
+      u'paveiksliukas': 'image',
+      u'iliustracija': 'figure',
+      u'pridėti': 'include',
+      u'žalia': 'raw',
+      u'pakeisti': 'replace',
+      u'unikodas': 'unicode',
+      u'data': 'date',
+      u'klasė': 'class',
+      u'rolė': 'role',
+      u'numatytoji-rolė': 'default-role',
+      u'titulas': 'title',
+      u'turinys': 'contents',
+      u'seknum': 'sectnum',
+      u'sekcijos-numeravimas': 'sectnum',
+      u'antraštė': 'header',
+      u'poraštė': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'nutaikytos-pastaba': 'target-notes',
+      u'restructuredtext-testinė-direktyva': 'restructuredtext-test-directive'}
+"""Lithuanian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'santrumpa': 'abbreviation',
+    'sa': 'abbreviation',
+    'akronimas': 'acronym',
+    'ak': 'acronym',
+    u'code (translation required)': 'code',
+    'indeksas': 'index',
+    'i': 'index',
+    u'apatinis-indeksas': 'subscript',
+    'sub': 'subscript',
+    u'viršutinis-indeksas': 'superscript',
+    'sup': 'superscript',
+    u'antrašės-nuoroda': 'title-reference',
+    u'antraštė': 'title-reference',
+    'a': 'title-reference',
+    'pep-nuoroda': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-nuoroda': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    u'paryškinimas': 'emphasis',
+    u'sustiprintas': 'strong',
+    u'literalas': 'literal',
+    u'matematika': 'math',
+    u'vardinė-nuoroda': 'named-reference',
+    u'anoniminė-nuoroda': 'anonymous-reference',
+    u'išnašos-nuoroda': 'footnote-reference',
+    u'citatos-nuoroda': 'citation-reference',
+    u'pakeitimo-nuoroda': 'substitution-reference',
+    u'taikinys': 'target',
+    u'uri-nuoroda': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'žalia': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/lv.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/lv.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/lv.py	(revision 1126)
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+# $Id: lv.py 7975 2016-10-20 20:00:19Z milde $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Latvian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'uzmanību': 'attention',
+      'piesardzību': 'caution',
+      'kods': 'code',
+      'koda-bloks': 'code',
+      'pirmkods': 'code',
+      'bīstami': 'danger',
+      'kļūda': 'error',
+      'ieteikums': 'hint',
+      'svarīgi': 'important',
+      'piezīme': 'note',
+      'padoms': 'tip',
+      'brīdinājums': 'warning',
+      'aizrādījums': 'admonition',
+      'sānjosla': 'sidebar',
+      'tēma': 'topic',
+      'rindu-bloks': 'line-block',
+      'parsēts-literālis': 'parsed-literal',
+      'rubrika': 'rubric',
+      'epigrāfs': 'epigraph',
+      'apskats': 'highlights',
+      'izvilkuma-citāts': 'pull-quote',
+      'savienojums': 'compound',
+      'konteiners': 'container',
+      #'questions': 'questions',
+      'tabula': 'table',
+      'csv-tabula': 'csv-table',
+      'sarakstveida-tabula': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      'matemātika': 'math',
+      #'imagemap': 'imagemap',
+      'attēls': 'image',
+      'figūra': 'figure',
+      'ietvert': 'include',
+      'burtiski': 'raw',
+      'aizvieto': 'replace',
+      'unicode': 'unicode',
+      'datums': 'date',
+      'klase': 'class',
+      'role': 'role',
+      'noklusējuma-role': 'default-role',
+      'virsraksts': 'title',
+      'saturs': 'contents',
+      'numurēt-sekcijas': 'sectnum',
+      'galvene': 'header',
+      'kājene': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'atsauces-apakšā': 'target-notes',
+      'restructuredtext-testa-direktīva': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'saīsinājums': 'abbreviation',
+    'īsi': 'abbreviation',
+    'akronīms': 'acronym',
+    'kods': 'code',
+    'indekss': 'index',
+    'i': 'index',
+    'apakšraksts': 'subscript',
+    'apakšā': 'subscript',
+    'augšraksts': 'superscript',
+    'augšā': 'superscript',
+    'virsraksta-atsauce': 'title-reference',
+    'virsraksts': 'title-reference',
+    'v': 'title-reference',
+    'atsauce-uz-pep': 'pep-reference',
+    'pep': 'pep-reference',
+    'atsauce-uz-rfc': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'izcēlums': 'emphasis',
+    'blīvs': 'strong',
+    'literālis': 'literal',
+    'matemātika': 'math',
+    'nosaukta-atsauce': 'named-reference',
+    'nenosaukta-atsauce': 'anonymous-reference',
+    'kājenes-atsauce': 'footnote-reference',
+    'citātā-atsauce': 'citation-reference',
+    'aizvietojuma-atsauce': 'substitution-reference',
+    'mēr''kis': 'target',
+    'atsauce-uz-uri': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'burtiski': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ca.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ca.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ca.py	(revision 1126)
@@ -0,0 +1,125 @@
+# $Id: ca.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atenci\u00F3': 'attention',
+      u'compte': 'caution',
+      u'code (translation required)': 'code',
+      u'perill': 'danger',
+      u'error': 'error',
+      u'suggeriment': 'hint',
+      u'important': 'important',
+      u'nota': 'note',
+      u'consell': 'tip',
+      u'av\u00EDs': 'warning',
+      u'advertiment': 'admonition',
+      u'nota-al-marge': 'sidebar',
+      u'nota-marge': 'sidebar',
+      u'tema': 'topic',
+      u'bloc-de-l\u00EDnies': 'line-block',
+      u'bloc-l\u00EDnies': 'line-block',
+      u'literal-analitzat': 'parsed-literal',
+      u'r\u00FAbrica': 'rubric',
+      u'ep\u00EDgraf': 'epigraph',
+      u'sumari': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'compost': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      u'taula': 'table',
+      u'taula-csv': 'csv-table',
+      u'taula-llista': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'math (translation required)': 'math',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imatge': 'image',
+      u'figura': 'figure',
+      u'inclou': 'include',
+      u'incloure': 'include',
+      u'cru': 'raw',
+      u'reempla\u00E7a': 'replace',
+      u'reempla\u00E7ar': 'replace',
+      u'unicode': 'unicode',
+      u'data': 'date',
+      u'classe': 'class',
+      u'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'contingut': 'contents',
+      u'numsec': 'sectnum',
+      u'numeraci\u00F3-de-seccions': 'sectnum',
+      u'numeraci\u00F3-seccions': 'sectnum',
+      u'cap\u00E7alera': 'header',
+      u'peu-de-p\u00E0gina': 'footer',
+      u'peu-p\u00E0gina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'notes-amb-destinacions': 'target-notes',
+      u'notes-destinacions': 'target-notes',
+      u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'}
+"""Catalan name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abreviatura': 'abbreviation',
+    u'abreviaci\u00F3': 'abbreviation',
+    u'abrev': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acr\u00F2nim': 'acronym',
+    u'ac': 'acronym',
+    u'code (translation required)': 'code',
+    u'\u00EDndex': 'index',
+    u'i': 'index',
+    u'sub\u00EDndex': 'subscript',
+    u'sub': 'subscript',
+    u'super\u00EDndex': 'superscript',
+    u'sup': 'superscript',
+    u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference',
+    u'refer\u00E8ncia-t\u00EDtol': 'title-reference',
+    u't\u00EDtol': 'title-reference',
+    u't': 'title-reference',
+    u'refer\u00E8ncia-a-pep': 'pep-reference',
+    u'refer\u00E8ncia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'refer\u00E8ncia-a-rfc': 'rfc-reference',
+    u'refer\u00E8ncia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'\u00E8mfasi': 'emphasis',
+    u'destacat': 'strong',
+    u'literal': 'literal',
+    u'math (translation required)': 'math',
+    u'refer\u00E8ncia-amb-nom': 'named-reference',
+    u'refer\u00E8ncia-nom': 'named-reference',
+    u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference',
+    u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-a-cita': 'citation-reference',
+    u'refer\u00E8ncia-cita': 'citation-reference',
+    u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference',
+    u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference',
+    u'destinaci\u00F3': 'target',
+    u'refer\u00E8ncia-a-uri': 'uri-reference',
+    u'refer\u00E8ncia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'cru': 'raw',}
+"""Mapping of Catalan role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/da.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/da.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/da.py	(revision 1126)
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+# $Id: da.py 7678 2013-07-03 09:57:36Z milde $
+# Author: E D
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Danish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'giv agt': 'attention',
+      u'pas på': 'caution',
+      u'kode': 'code',
+      u'kode-blok': 'code',
+      u'kildekode': 'code',
+      u'fare': 'danger',
+      u'fejl': 'error',
+      u'vink': 'hint',
+      u'vigtigt': 'important',
+      u'bemærk': 'note',
+      u'tips': 'tip',
+      u'advarsel': 'warning',
+      u'formaning': 'admonition',
+      u'sidebjælke': 'sidebar',
+      u'emne': 'topic',
+      u'linje-blok': 'line-block',
+      u'linie-blok': 'line-block',
+      u'parset-literal': 'parsed-literal',
+      u'rubrik': 'rubric',
+      u'epigraf': 'epigraph',
+      u'fremhævninger': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      u'tabel': 'table',
+      u'csv-tabel': 'csv-table',
+      u'liste-tabel': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      u'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      u'billede': 'image',
+      u'figur': 'figure',
+      u'inkludér': 'include',
+      u'inkluder': 'include',
+      u'rå': 'raw',
+      u'erstat': 'replace',
+      u'unicode': 'unicode',
+      u'dato': 'date',
+      u'klasse': 'class',
+      u'rolle': 'role',
+      u'forvalgt-rolle': 'default-role',
+      u'titel': 'title',
+      u'indhold': 'contents',
+      u'sektnum': 'sectnum',
+      u'sektions-nummerering': 'sectnum',
+      u'sidehovede': 'header',
+      u'sidefod': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-direktiv': 'restructuredtext-test-directive'}
+"""Danish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'forkortelse': 'abbreviation',
+    u'fork': 'abbreviation',
+    u'akronym': 'acronym',
+    u'ac (translation required)': 'acronym',
+    u'kode': 'code',
+    u'indeks': 'index',
+    u'i': 'index',
+    u'subscript (translation required)': 'subscript',
+    u'sub (translation required)': 'subscript',
+    u'superscript (translation required)': 'superscript',
+    u'sup (translation required)': 'superscript',
+    u'titel-reference': 'title-reference',
+    u'titel': 'title-reference',
+    u't': 'title-reference',
+    u'pep-reference': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'rfc-reference': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'emfase': 'emphasis',
+    u'kraftig': 'strong',
+    u'literal': 'literal',
+    u'math (translation required)': 'math',
+    u'navngivet-reference': 'named-reference',
+    u'anonym-reference': 'anonymous-reference',
+    u'fodnote-reference': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitutions-reference': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'rå': 'raw',}
+"""Mapping of Danish role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fa.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fa.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fa.py	(revision 1126)
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+# $Id: fa.py 4564 2016-08-10 11:48:42Z
+# Author: Shahin <me@5hah.in>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Persian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'توجه': u'attention',
+      u'احتیاط': u'caution',
+      u'کد': u'code',
+      u'بلوک-کد': u'code',
+      u'کد-منبع': u'code',
+      u'خطر': u'danger',
+      u'خطا': u'error',
+      u'راهنما': u'hint',
+      u'مهم': u'important',
+      u'یادداشت': u'note',
+      u'نکته': u'tip',
+      u'اخطار': u'warning',
+      u'تذکر': u'admonition',
+      u'نوار-کناری': u'sidebar',
+      u'موضوع': u'topic',
+      u'بلوک-خط': u'line-block',
+      u'تلفظ-پردازش-شده': u'parsed-literal',
+      u'سر-فصل': u'rubric',
+      u'کتیبه': u'epigraph',
+      u'نکات-برجسته': u'highlights',
+      u'نقل-قول': u'pull-quote',
+      u'ترکیب': u'compound',
+      u'ظرف': u'container',
+      #'questions': u'questions',
+      u'جدول': u'table',
+      u'جدول-csv': u'csv-table',
+      u'جدول-لیست': u'list-table',
+      #'qa': u'questions',
+      #'faq': u'questions',
+      u'متا': u'meta',
+      u'ریاضی': u'math',
+      #'imagemap': u'imagemap',
+      u'تصویر': u'image',
+      u'شکل': u'figure',
+      u'شامل': u'include',
+      u'خام': u'raw',
+      u'جایگزین': u'replace',
+      u'یونیکد': u'unicode',
+      u'تاریخ': u'date',
+      u'کلاس': u'class',
+      u'قانون': u'role',
+      u'قانون-پیش‌فرض': u'default-role',
+      u'عنوان': u'title',
+      u'محتوا': u'contents',
+      u'شماره-فصل': u'sectnum',
+      u'شماره‌گذاری-فصل': u'sectnum',
+      u'سرآیند': u'header',
+      u'پاصفحه': u'footer',
+      #'footnotes': u'footnotes',
+      #'citations': u'citations',
+      u'یادداشت-هدف': u'target-notes',
+    }
+"""Persian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'مخفف': u'abbreviation',
+    u'سرنام': u'acronym',
+    u'کد': u'code',
+    u'شاخص': u'index',
+    u'زیرنویس': u'subscript',
+    u'بالانویس': u'superscript',
+    u'عنوان': u'title-reference',
+    u'نیرو': u'pep-reference',
+    u'rfc-reference (translation required)': u'rfc-reference',
+    u'تاکید': u'emphasis',
+    u'قوی': u'strong',
+    u'لفظی': u'literal',
+    u'ریاضی': u'math',
+    u'منبع-نام‌گذاری': u'named-reference',
+    u'منبع-ناشناس': u'anonymous-reference',
+    u'منبع-پانویس': u'footnote-reference',
+    u'منبع-نقل‌فول': u'citation-reference',
+    u'منبع-جایگزینی': u'substitution-reference',
+    u'هدف': u'target',
+    u'منبع-uri': u'uri-reference',
+    u'uri': u'uri-reference',
+    u'url': u'uri-reference',
+    u'خام': u'raw',}
+"""Mapping of Persian role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/af.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/af.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/af.py	(revision 1126)
@@ -0,0 +1,106 @@
+# $Id: af.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'aandag': 'attention',
+      'versigtig': 'caution',
+      'code (translation required)': 'code',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'wenk': 'hint',
+      'belangrik': 'important',
+      'nota': 'note',
+      'tip': 'tip', # hint and tip both have the same translation: wenk
+      'waarskuwing': 'warning',
+      'vermaning': 'admonition',
+      'kantstreep': 'sidebar',
+      'onderwerp': 'topic',
+      'lynblok': 'line-block',
+      'math (translation required)': 'math',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubriek': 'rubric',
+      'epigraaf': 'epigraph',
+      'hoogtepunte': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'vrae': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'beeldkaart': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'insluiting': 'include',
+      'rou': 'raw',
+      'vervang': 'replace',
+      'unicode': 'unicode', # should this be translated? unikode
+      'datum': 'date',
+      'klas': 'class',
+      'role (translation required)': 'role',
+      'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnote': 'footnotes',
+      #'aanhalings': 'citations',
+      'teikennotas': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Afrikaans name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    'afkorting': 'abbreviation',
+    'ab': 'abbreviation',
+    'akroniem': 'acronym',
+    'ac': 'acronym',
+    u'code (translation required)': 'code',
+    'indeks': 'index',
+    'i': 'index',
+    'voetskrif': 'subscript',
+    'sub': 'subscript',
+    'boskrif': 'superscript',
+    'sup': 'superscript',
+    'titelverwysing': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-verwysing': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-verwysing': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'sterk': 'strong',
+    'literal (translation required)': 'literal',
+    'math (translation required)': 'math',
+    'benoemde verwysing': 'named-reference',
+    'anonieme verwysing': 'anonymous-reference',
+    'voetnootverwysing': 'footnote-reference',
+    'aanhalingverwysing': 'citation-reference',
+    'vervangingsverwysing': 'substitution-reference',
+    'teiken': 'target',
+    'uri-verwysing': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'rou': 'raw',}
+"""Mapping of Afrikaans role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ru.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ru.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ru.py	(revision 1126)
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+# $Id: ru.py 7123 2011-09-12 08:28:31Z milde $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+directives = {
+ u'блок-строк': u'line-block',
+ u'meta': u'meta',
+ u'математика': 'math',
+ u'обработанный-литерал': u'parsed-literal',
+ u'выделенная-цитата': u'pull-quote',
+ u'код': 'code',
+ u'compound (translation required)': 'compound',
+ u'контейнер': 'container',
+ u'таблица': 'table',
+ u'csv-table (translation required)': 'csv-table',
+ u'list-table (translation required)': 'list-table',
+ u'сырой': u'raw',
+ u'замена': u'replace',
+ u'тестовая-директива-restructuredtext': u'restructuredtext-test-directive',
+ u'целевые-сноски': u'target-notes',
+ u'unicode': u'unicode',
+ u'дата': u'date',
+ u'боковая-полоса': u'sidebar',
+ u'важно': u'important',
+ u'включать': u'include',
+ u'внимание': u'attention',
+ u'выделение': u'highlights',
+ u'замечание': u'admonition',
+ u'изображение': u'image',
+ u'класс': u'class',
+ u'роль': 'role',
+ u'default-role (translation required)': 'default-role',
+ u'титул': 'title',
+ u'номер-раздела': u'sectnum',
+ u'нумерация-разделов': u'sectnum',
+ u'опасно': u'danger',
+ u'осторожно': u'caution',
+ u'ошибка': u'error',
+ u'подсказка': u'tip',
+ u'предупреждение': u'warning',
+ u'примечание': u'note',
+ u'рисунок': u'figure',
+ u'рубрика': u'rubric',
+ u'совет': u'hint',
+ u'содержание': u'contents',
+ u'тема': u'topic',
+ u'эпиграф': u'epigraph',
+ u'header (translation required)': 'header',
+ u'footer (translation required)': 'footer',}
+"""Russian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+ u'акроним': 'acronym',
+ u'код': 'code',
+ u'анонимная-ссылка': 'anonymous-reference',
+ u'буквально': 'literal',
+ u'математика': 'math',
+ u'верхний-индекс': 'superscript',
+ u'выделение': 'emphasis',
+ u'именованная-ссылка': 'named-reference',
+ u'индекс': 'index',
+ u'нижний-индекс': 'subscript',
+ u'сильное-выделение': 'strong',
+ u'сокращение': 'abbreviation',
+ u'ссылка-замена': 'substitution-reference',
+ u'ссылка-на-pep': 'pep-reference',
+ u'ссылка-на-rfc': 'rfc-reference',
+ u'ссылка-на-uri': 'uri-reference',
+ u'ссылка-на-заглавие': 'title-reference',
+ u'ссылка-на-сноску': 'footnote-reference',
+ u'цитатная-ссылка': 'citation-reference',
+ u'цель': 'target',
+ u'сырой': 'raw',}
+"""Mapping of Russian role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/de.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/de.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/de.py	(revision 1126)
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+# $Id: de.py 7223 2011-11-21 16:43:06Z milde $
+# Authors: Engelbert Gruber <grubert@users.sourceforge.net>;
+#          Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'achtung': 'attention',
+      'vorsicht': 'caution',
+      'code': 'code',
+      'gefahr': 'danger',
+      'fehler': 'error',
+      'hinweis': 'hint',
+      'wichtig': 'important',
+      'notiz': 'note',
+      'tipp': 'tip',
+      'warnung': 'warning',
+      'ermahnung': 'admonition',
+      'kasten': 'sidebar',
+      'seitenkasten': 'sidebar',
+      'thema': 'topic',
+      'zeilen-block': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubrik': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      u'pull-quote': 'pull-quote', # commonly used in German too
+      u'seitenansprache': 'pull-quote', # cf. http://www.typografie.info/2/wiki.php?title=Seitenansprache
+      'zusammengesetzt': 'compound',
+      'verbund': 'compound',
+      u'container': 'container',
+      #'fragen': 'questions',
+      'tabelle': 'table',
+      'csv-tabelle': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      u'mathe': 'math',
+      u'formel': 'math',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'bild': 'image',
+      'abbildung': 'figure',
+      u'unverändert': 'raw',
+      u'roh': 'raw',
+      u'einfügen': 'include',
+      'ersetzung': 'replace',
+      'ersetzen': 'replace',
+      'ersetze': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rolle': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'inhalt': 'contents',
+      'kapitel-nummerierung': 'sectnum',
+      'abschnitts-nummerierung': 'sectnum',
+      u'linkziel-fußfnoten': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'fußfnoten': 'footnotes',
+      #'zitate': 'citations',
+      }
+"""German name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abkürzung': 'abbreviation',
+      'akronym': 'acronym',
+      u'code': 'code',
+      'index': 'index',
+      'tiefgestellt': 'subscript',
+      'hochgestellt': 'superscript',
+      'titel-referenz': 'title-reference',
+      'pep-referenz': 'pep-reference',
+      'rfc-referenz': 'rfc-reference',
+      'betonung': 'emphasis',
+      'fett': 'strong',
+      u'wörtlich': 'literal',
+      u'mathe': 'math',
+      'benannte-referenz': 'named-reference',
+      'unbenannte-referenz': 'anonymous-reference',
+      u'fußfnoten-referenz': 'footnote-reference',
+      'zitat-referenz': 'citation-reference',
+      'ersetzungs-referenz': 'substitution-reference',
+      'ziel': 'target',
+      'uri-referenz': 'uri-reference',
+      u'unverändert': 'raw',
+      u'roh': 'raw',}
+"""Mapping of German role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/sv.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/sv.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/sv.py	(revision 1126)
@@ -0,0 +1,94 @@
+# $Id: sv.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'observera': 'attention',
+      u'caution (translation required)': 'caution',
+      u'code (translation required)': 'code',
+      u'fara': 'danger',
+      u'fel': 'error',
+      u'v\u00e4gledning': 'hint',
+      u'viktigt': 'important',
+      u'notera': 'note',
+      u'tips': 'tip',
+      u'varning': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u'\u00e4mne': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'mellanrubrik': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      # u'fr\u00e5gor': 'questions',
+      # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/:
+      # u'fr\u00e5gor-och-svar': 'questions',
+      # u'vanliga-fr\u00e5gor': 'questions',  
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      'math (translation required)': 'math',
+      # u'bildkarta': 'imagemap',   # FIXME: Translation might be too literal.
+      u'bild': 'image',
+      u'figur': 'figure',
+      u'inkludera': 'include',   
+      u'r\u00e5': 'raw',            # FIXME: Translation might be too literal.
+      u'ers\u00e4tt': 'replace', 
+      u'unicode': 'unicode',
+      u'datum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'inneh\u00e5ll': 'contents',
+      u'sektionsnumrering': 'sectnum',
+      u'target-notes (translation required)': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      # u'fotnoter': 'footnotes',
+      # u'citeringar': 'citations',
+      }
+"""Swedish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'code (translation required)': 'code',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+    'math (translation required)': 'math',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'r\u00e5': 'raw',}
+"""Mapping of Swedish role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ja.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ja.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/ja.py	(revision 1126)
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 7119 2011-09-02 13:00:23Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# Corrections to these translations are welcome!
+# 間違いがあれば、どうぞ正しい翻訳を教えて下さい。
+
+directives = {
+    # language-dependent: fixed
+    u'注目': 'attention',
+    u'注意': 'caution',
+    u'code (translation required)': 'code',
+    u'危険': 'danger',
+    u'エラー': 'error',
+    u'ヒント': 'hint',
+    u'重要': 'important',
+    u'備考': 'note',
+    u'通報': 'tip',
+    u'警告': 'warning',
+    u'戒告': 'admonition',
+    u'サイドバー': 'sidebar',
+    u'トピック': 'topic',
+    u'ラインブロック': 'line-block',
+    u'パーズドリテラル': 'parsed-literal',
+    u'ルブリック': 'rubric',
+    u'エピグラフ': 'epigraph',
+    u'題言': 'epigraph',
+    u'ハイライト': 'highlights',
+    u'見所': 'highlights',
+    u'プルクオート': 'pull-quote',
+    u'合成': 'compound',
+    u'コンテナー': 'container',
+    u'容器': 'container',
+    u'表': 'table',
+    u'csv表': 'csv-table',
+    u'リスト表': 'list-table',
+    #u'質問': 'questions',
+    #u'問答': 'questions',
+    #u'faq': 'questions',
+    u'math (translation required)': 'math',
+    u'メタ': 'meta',
+    #u'イメージマプ': 'imagemap',
+    u'イメージ': 'image',
+    u'画像': 'image',
+    u'フィグア': 'figure',
+    u'図版': 'figure',
+    u'インクルード': 'include',
+    u'含む': 'include',
+    u'組み込み': 'include',
+    u'生': 'raw',
+    u'原': 'raw',
+    u'換える': 'replace',
+    u'取り換える': 'replace',
+    u'掛け替える': 'replace',
+    u'ユニコード': 'unicode',
+    u'日付': 'date',
+    u'クラス': 'class',
+    u'ロール': 'role',
+    u'役': 'role',
+    u'ディフォルトロール': 'default-role',
+    u'既定役': 'default-role',
+    u'タイトル': 'title',
+    u'題': 'title',                    # 題名　件名
+    u'目次': 'contents',
+    u'節数': 'sectnum',
+    u'ヘッダ': 'header',
+    u'フッタ': 'footer',
+    #u'脚注': 'footnotes',             # 脚註?
+    #u'サイテーション': 'citations',　　　# 出典　引証　引用
+    u'ターゲットノート': 'target-notes', # 的注　的脚注
+    }
+"""Japanese name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'略': 'abbreviation',
+    u'頭字語': 'acronym',
+    u'code (translation required)': 'code',
+    u'インデックス': 'index',
+    u'索引': 'index',
+    u'添字': 'subscript',
+    u'下付': 'subscript',
+    u'下': 'subscript',
+    u'上付': 'superscript',
+    u'上': 'superscript',
+    u'題参照': 'title-reference',
+    u'pep参照': 'pep-reference',
+    u'rfc参照': 'rfc-reference',
+    u'強調': 'emphasis',
+    u'強い': 'strong',
+    u'リテラル': 'literal',
+    u'整形済み': 'literal',
+    u'math (translation required)': 'math',
+    u'名付参照': 'named-reference',
+    u'無名参照': 'anonymous-reference',
+    u'脚注参照': 'footnote-reference',
+    u'出典参照': 'citation-reference',
+    u'代入参照': 'substitution-reference',
+    u'的': 'target',
+    u'uri参照': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'生': 'raw',}
+"""Mapping of Japanese role names to canonical role names for interpreted
+text."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/zh_tw.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/zh_tw.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/zh_tw.py	(revision 1126)
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 7119 2011-09-02 13:00:23Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention (translation required)': 'attention',
+      'caution (translation required)': 'caution',
+      'code (translation required)': 'code',
+      'danger (translation required)': 'danger',
+      'error (translation required)': 'error',
+      'hint (translation required)': 'hint',
+      'important (translation required)': 'important',
+      'note (translation required)': 'note',
+      'tip (translation required)': 'tip',
+      'warning (translation required)': 'warning',
+      'admonition (translation required)': 'admonition',
+      'sidebar (translation required)': 'sidebar',
+      'topic (translation required)': 'topic',
+      'line-block (translation required)': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubric (translation required)': 'rubric',
+      'epigraph (translation required)': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions (translation required)': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      #'qa (translation required)': 'questions',
+      #'faq (translation required)': 'questions',
+      'meta (translation required)': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap (translation required)': 'imagemap',
+      'image (translation required)': 'image',
+      'figure (translation required)': 'figure',
+      'include (translation required)': 'include',
+      'raw (translation required)': 'raw',
+      'replace (translation required)': 'replace',
+      'unicode (translation required)': 'unicode',
+      u'日期': 'date',
+      'class (translation required)': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'contents (translation required)': 'contents',
+      'sectnum (translation required)': 'sectnum',
+      'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes (translation required)': 'footnotes',
+      #'citations (translation required)': 'citations',
+      'target-notes (translation required)': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Traditional Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation (translation required)': 'abbreviation',
+    'ab (translation required)': 'abbreviation',
+    'acronym (translation required)': 'acronym',
+    'ac (translation required)': 'acronym',
+    u'code (translation required)': 'code',
+    'index (translation required)': 'index',
+    'i (translation required)': 'index',
+    'subscript (translation required)': 'subscript',
+    'sub (translation required)': 'subscript',
+    'superscript (translation required)': 'superscript',
+    'sup (translation required)': 'superscript',
+    'title-reference (translation required)': 'title-reference',
+    'title (translation required)': 'title-reference',
+    't (translation required)': 'title-reference',
+    'pep-reference (translation required)': 'pep-reference',
+    'pep (translation required)': 'pep-reference',
+    'rfc-reference (translation required)': 'rfc-reference',
+    'rfc (translation required)': 'rfc-reference',
+    'emphasis (translation required)': 'emphasis',
+    'strong (translation required)': 'strong',
+    'literal (translation required)': 'literal',
+    'math (translation required)': 'math',
+    'named-reference (translation required)': 'named-reference',
+    'anonymous-reference (translation required)': 'anonymous-reference',
+    'footnote-reference (translation required)': 'footnote-reference',
+    'citation-reference (translation required)': 'citation-reference',
+    'substitution-reference (translation required)': 'substitution-reference',
+    'target (translation required)': 'target',
+    'uri-reference (translation required)': 'uri-reference',
+    'uri (translation required)': 'uri-reference',
+    'url (translation required)': 'uri-reference',
+    'raw (translation required)': 'raw',}
+"""Mapping of Traditional Chinese role names to canonical role names for
+interpreted text."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/he.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/he.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/he.py	(revision 1126)
@@ -0,0 +1,108 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 7119 2011-09-02 13:00:23Z milde $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1': 'attention',
+      u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea': 'caution',
+      u'code (translation required)': 'code',
+      u'\u05e1\u05db\u05e0\u05d4': 'danger',
+      u'\u05e9\u05d2\u05d9\u05d0\u05d4' : 'error',
+      u'\u05e8\u05de\u05d6': 'hint',
+      u'\u05d7\u05e9\u05d5\u05d1': 'important',
+      u'\u05d4\u05e2\u05e8\u05d4': 'note',
+      u'\u05d8\u05d9\u05e4': 'tip',
+      u'\u05d0\u05d6\u05d4\u05e8\u05d4': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      u'\u05ea\u05de\u05d5\u05e0\u05d4': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+       u'\u05e1\u05d2\u05e0\u05d5\u05df': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      u'\u05ea\u05d5\u05db\u05df': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    u'code (translation required)': 'code',
+    'index': 'index',
+    'i': 'index',
+    u'\u05ea\u05d7\u05ea\u05d9': 'subscript',
+    'sub': 'subscript',
+    u'\u05e2\u05d9\u05dc\u05d9': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'math (translation required)': 'math',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fi.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fi.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/fi.py	(revision 1126)
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# $Id: fi.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'huomio': u'attention',
+      u'varo': u'caution',
+      u'code (translation required)': 'code',
+      u'vaara': u'danger',
+      u'virhe': u'error',
+      u'vihje': u'hint',
+      u't\u00e4rke\u00e4\u00e4': u'important',
+      u'huomautus': u'note',
+      u'neuvo': u'tip',
+      u'varoitus': u'warning',
+      u'kehotus': u'admonition',
+      u'sivupalkki': u'sidebar',
+      u'aihe': u'topic',
+      u'rivi': u'line-block',
+      u'tasalevyinen': u'parsed-literal',
+      u'ohje': u'rubric',
+      u'epigraafi': u'epigraph',
+      u'kohokohdat': u'highlights',
+      u'lainaus': u'pull-quote',
+      u'taulukko': u'table',
+      u'csv-taulukko': u'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'kysymykset': u'questions',
+      u'meta': u'meta',
+      'math (translation required)': 'math',
+      #u'kuvakartta': u'imagemap',
+      u'kuva': u'image',
+      u'kaavio': u'figure',
+      u'sis\u00e4llyt\u00e4': u'include',
+      u'raaka': u'raw',
+      u'korvaa': u'replace',
+      u'unicode': u'unicode',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'luokka': u'class',
+      u'rooli': u'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'sis\u00e4llys': u'contents',
+      u'kappale': u'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'alaviitteet': u'footnotes',
+      #u'viitaukset': u'citations',
+      u'target-notes (translation required)': u'target-notes'}
+"""Finnish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'lyhennys': u'abbreviation',
+    u'akronyymi': u'acronym',
+    u'kirjainsana': u'acronym',
+    u'code (translation required)': 'code',
+    u'hakemisto': u'index',
+    u'luettelo': u'index',
+    u'alaindeksi': u'subscript',
+    u'indeksi': u'subscript',
+    u'yl\u00e4indeksi': u'superscript',
+    u'title-reference (translation required)': u'title-reference',
+    u'title (translation required)': u'title-reference',
+    u'pep-reference (translation required)': u'pep-reference',
+    u'rfc-reference (translation required)': u'rfc-reference',
+    u'korostus': u'emphasis',
+    u'vahvistus': u'strong',
+    u'tasalevyinen': u'literal',
+    'math (translation required)': 'math',
+    u'named-reference (translation required)': u'named-reference',
+    u'anonymous-reference (translation required)': u'anonymous-reference',
+    u'footnote-reference (translation required)': u'footnote-reference',
+    u'citation-reference (translation required)': u'citation-reference',
+    u'substitution-reference (translation required)': u'substitution-reference',
+    u'kohde': u'target',
+    u'uri-reference (translation required)': u'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Finnish role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/__init__.py	(revision 1126)
@@ -0,0 +1,37 @@
+# $Id: __init__.py 7648 2013-04-18 07:36:22Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+
+from docutils.utils import normalize_language_tag
+if sys.version_info < (2,5):
+    from docutils._compat import __import__
+
+_languages = {}
+
+def get_language(language_code):
+    for tag in normalize_language_tag(language_code):
+        tag = tag.replace('-','_') # '-' not valid in module names
+        if tag in _languages:
+            return _languages[tag]
+        try:
+            module = __import__(tag, globals(), locals(), level=1)
+        except ImportError:
+            try:
+                module = __import__(tag, globals(), locals(), level=0)
+            except ImportError:
+                continue
+        _languages[tag] = module
+        return module
+    return None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/zh_cn.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/zh_cn.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/zh_cn.py	(revision 1126)
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Panjunyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'注意': 'attention',
+      u'小心': 'caution',
+      u'code (translation required)': 'code',
+      u'危险': 'danger',
+      u'错误': 'error',
+      u'提示': 'hint',
+      u'重要': 'important',
+      u'注解': 'note',
+      u'技巧': 'tip',
+      u'警告': 'warning',
+      u'忠告': 'admonition',
+      u'侧框': 'sidebar',
+      u'主题': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'醒目': 'rubric',
+      u'铭文': 'epigraph',
+      u'要点': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'复合': 'compound',
+      u'容器': 'container',
+      #u'questions (translation required)': 'questions',
+      u'表格': 'table',
+      u'csv表格': 'csv-table',
+      u'列表表格': 'list-table',
+      #u'qa (translation required)': 'questions',
+      #u'faq (translation required)': 'questions',
+      u'元数据': 'meta',
+      u'math (translation required)': 'math',
+      #u'imagemap (translation required)': 'imagemap',
+      u'图片': 'image',
+      u'图例': 'figure',
+      u'包含': 'include',
+      u'原文': 'raw',
+      u'代替': 'replace',
+      u'统一码': 'unicode',
+      u'日期': 'date',
+      u'类型': 'class',
+      u'角色': 'role',
+      u'默认角色': 'default-role',
+      u'标题': 'title',
+      u'目录': 'contents',
+      u'章节序号': 'sectnum',
+      u'题头': 'header',
+      u'页脚': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Simplified Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'缩写': 'abbreviation',
+    u'简称': 'acronym',
+    u'code (translation required)': 'code',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'下标': 'subscript',
+    u'上标': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'强调': 'emphasis',
+    u'加粗': 'strong',
+    u'字面': 'literal',
+    u'math (translation required)': 'math',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Simplified Chinese role names to canonical role names
+for interpreted text."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/en.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/en.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/en.py	(revision 1126)
@@ -0,0 +1,110 @@
+# $Id: en.py 7179 2011-10-15 22:06:45Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention': 'attention',
+      'caution': 'caution',
+      'code': 'code',
+      'code-block': 'code',
+      'sourcecode': 'code',
+      'danger': 'danger',
+      'error': 'error',
+      'hint': 'hint',
+      'important': 'important',
+      'note': 'note',
+      'tip': 'tip',
+      'warning': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      'math': 'math',
+      #'imagemap': 'imagemap',
+      'image': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+      'class': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      'contents': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'code': 'code',
+    'index': 'index',
+    'i': 'index',
+    'subscript': 'subscript',
+    'sub': 'subscript',
+    'superscript': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'math': 'math',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/gl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/gl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/gl.py	(revision 1126)
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Galician-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atenci\u00f3n': 'attention',
+      u'advertencia': 'caution',
+      u'code (translation required)': 'code',
+      u'perigo': 'danger',
+      u'erro': 'error',
+      u'pista': 'hint',
+      u'importante': 'important',
+      u'nota': 'note',
+      u'consello': 'tip',
+      u'aviso': 'warning',
+      u'admonici\u00f3n': 'admonition',
+      u'barra lateral': 'sidebar',
+      u't\u00f3pico': 'topic',
+      u'bloque-li\u00f1a': 'line-block',
+      u'literal-analizado': 'parsed-literal',
+      u'r\u00fabrica': 'rubric',
+      u'ep\u00edgrafe': 'epigraph',
+      u'realzados': 'highlights',
+      u'coller-citaci\u00f3n': 'pull-quote',
+      u'compor': 'compound',
+      u'recipiente': 'container',
+      #'questions': 'questions',
+      u't\u00e1boa': 'table',
+      u't\u00e1boa-csv': 'csv-table',
+      u't\u00e1boa-listaxe': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      u'imaxe': 'image',
+      u'figura': 'figure',
+      u'inclu\u00edr': 'include',
+      u'cru': 'raw',
+      u'substitu\u00edr': 'replace',
+      u'unicode': 'unicode',
+      u'data': 'date',
+      u'clase': 'class',
+      u'regra': 'role',
+      u'regra-predeterminada': 'default-role',
+      u't\u00edtulo': 'title',
+      u'contido': 'contents',
+      u'seccnum': 'sectnum',
+      u'secci\u00f3n-numerar': 'sectnum',
+      u'cabeceira': 'header',
+      u'p\u00e9 de p\u00e1xina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'notas-destino': 'target-notes',
+      u'texto restruturado-proba-directiva': 'restructuredtext-test-directive'}
+"""Galician name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abreviatura': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acr\u00f3nimo': 'acronym',
+    u'ac': 'acronym',
+    u'code (translation required)': 'code',
+    u'\u00edndice': 'index',
+    u'i': 'index',
+    u'sub\u00edndice': 'subscript',
+    u'sub': 'subscript',
+    u'super\u00edndice': 'superscript',
+    u'sup': 'superscript',
+    u'referencia t\u00edtulo': 'title-reference',
+    u't\u00edtulo': 'title-reference',
+    u't': 'title-reference',
+    u'referencia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'referencia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'\u00e9nfase': 'emphasis',
+    u'forte': 'strong',
+    u'literal': 'literal',
+    'math (translation required)': 'math',
+    u'referencia-nome': 'named-reference',
+    u'referencia-an\u00f3nimo': 'anonymous-reference',
+    u'referencia-nota ao p\u00e9': 'footnote-reference',
+    u'referencia-citaci\u00f3n': 'citation-reference',
+    u'referencia-substituci\u00f3n': 'substitution-reference',
+    u'destino': 'target',
+    u'referencia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'cru': 'raw',}
+"""Mapping of Galician role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/eo.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/eo.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/eo.py	(revision 1126)
@@ -0,0 +1,118 @@
+# $Id: eo.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atentu': 'attention',
+      u'zorgu': 'caution',
+      u'code (translation required)': 'code',
+      u'dangxero': 'danger',
+      u'dan\u011dero': 'danger',
+      u'eraro': 'error',
+      u'spuro': 'hint',
+      u'grava': 'important',
+      u'noto': 'note',
+      u'helpeto': 'tip',
+      u'averto': 'warning',
+      u'admono': 'admonition',
+      u'flankteksto': 'sidebar',
+      u'temo': 'topic',
+      u'linea-bloko': 'line-block',
+      u'analizota-literalo': 'parsed-literal',
+      u'rubriko': 'rubric',
+      u'epigrafo': 'epigraph',
+      u'elstarajxoj': 'highlights',
+      u'elstara\u0135oj': 'highlights',
+      u'ekstera-citajxo': 'pull-quote',
+      u'ekstera-cita\u0135o': 'pull-quote',
+      u'kombinajxo': 'compound',
+      u'kombina\u0135o': 'compound',
+      u'tekstingo': 'container',
+      u'enhavilo': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabelo': 'table',
+      u'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj"
+      u'tabelo-csv': 'csv-table',
+      u'tabelo-lista': 'list-table',
+      u'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      u'bildo': 'image',
+      u'figuro': 'figure',
+      u'inkludi': 'include',
+      u'senanaliza': 'raw',
+      u'anstatauxi': 'replace',
+      u'anstata\u016di': 'replace',
+      u'unicode': 'unicode',
+      u'dato': 'date',
+      u'klaso': 'class',
+      u'rolo': 'role',
+      u'preterlasita-rolo': 'default-role',
+      u'titolo': 'title',
+      u'enhavo': 'contents',
+      u'seknum': 'sectnum',
+      u'sekcia-numerado': 'sectnum',
+      u'kapsekcio': 'header',
+      u'piedsekcio': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'celaj-notoj': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Esperanto name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'mallongigo': 'abbreviation',
+    u'mall': 'abbreviation',
+    u'komenclitero': 'acronym',
+    u'kl': 'acronym',
+    u'code (translation required)': 'code',
+    u'indekso': 'index',
+    u'i': 'index',
+    u'subskribo': 'subscript',
+    u'sub': 'subscript',
+    u'supraskribo': 'superscript',
+    u'sup': 'superscript',
+    u'titola-referenco': 'title-reference',
+    u'titolo': 'title-reference',
+    u't': 'title-reference',
+    u'pep-referenco': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'rfc-referenco': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'emfazo': 'emphasis',
+    u'forta': 'strong',
+    u'litera': 'literal',
+    'math (translation required)': 'math',
+    u'nomita-referenco': 'named-reference',
+    u'nenomita-referenco': 'anonymous-reference',
+    u'piednota-referenco': 'footnote-reference',
+    u'citajxo-referenco': 'citation-reference',
+    u'cita\u0135o-referenco': 'citation-reference',
+    u'anstatauxa-referenco': 'substitution-reference',
+    u'anstata\u016da-referenco': 'substitution-reference',
+    u'celo': 'target',
+    u'uri-referenco': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'senanaliza': 'raw',
+}
+"""Mapping of Esperanto role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/cs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/cs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/cs.py	(revision 1126)
@@ -0,0 +1,108 @@
+# $Id: cs.py 7119 2011-09-02 13:00:23Z milde $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'pozor': 'attention',
+      u'caution (translation required)': 'caution', # jak rozlisit caution a warning?
+      u'code (translation required)': 'code',
+      u'nebezpe\u010D\u00ED': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\u016Fle\u017Eit\u00E9': 'important',
+      u'pozn\u00E1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varov\u00E1n\u00ED': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\u00E9ma': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'odd\u00EDl': 'rubric',
+      u'moto': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'math (translation required)': 'math',
+      u'meta (translation required)': 'meta',
+      #'imagemap': 'imagemap',
+      u'image (translation required)': 'image',   # obrazek
+      u'figure (translation required)': 'figure', # a tady?
+      u'include (translation required)': 'include',
+      u'raw (translation required)': 'raw',
+      u'replace (translation required)': 'replace',
+      u'unicode (translation required)': 'unicode',
+      u'datum': 'date',
+      u't\u0159\u00EDda': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'sectnum (translation required)': 'sectnum',
+      u'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Czech name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbreviation (translation required)': 'abbreviation',
+    u'ab (translation required)': 'abbreviation',
+    u'acronym (translation required)': 'acronym',
+    u'ac (translation required)': 'acronym',
+    u'code (translation required)': 'code',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'subscript (translation required)': 'subscript',
+    u'sub (translation required)': 'subscript',
+    u'superscript (translation required)': 'superscript',
+    u'sup (translation required)': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'emphasis (translation required)': 'emphasis',
+    u'strong (translation required)': 'strong',
+    u'literal (translation required)': 'literal',
+    u'math (translation required)': 'math',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Czech role names to canonical role names for interpreted text.
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/pt_br.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/pt_br.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/parsers/rst/languages/pt_br.py	(revision 1126)
@@ -0,0 +1,108 @@
+# $Id: pt_br.py 7119 2011-09-02 13:00:23Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'aten\u00E7\u00E3o': 'attention',
+      'cuidado': 'caution',
+      u'code (translation required)': 'code',
+      'perigo': 'danger',
+      'erro': 'error',
+      u'sugest\u00E3o': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'dica': 'tip',
+      'aviso': 'warning',
+      u'exorta\u00E7\u00E3o': 'admonition',
+      'barra-lateral': 'sidebar',
+      u't\u00F3pico': 'topic',
+      'bloco-de-linhas': 'line-block',
+      'literal-interpretado': 'parsed-literal',
+      'rubrica': 'rubric',
+      u'ep\u00EDgrafo': 'epigraph',
+      'destaques': 'highlights',
+      u'cita\u00E7\u00E3o-destacada': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'perguntas': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      'math (translation required)': 'math',
+      #'imagemap': 'imagemap',
+      'imagem': 'image',
+      'figura': 'figure',
+      u'inclus\u00E3o': 'include',
+      'cru': 'raw',
+      u'substitui\u00E7\u00E3o': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'\u00EDndice': 'contents',
+      'numsec': 'sectnum',
+      u'numera\u00E7\u00E3o-de-se\u00E7\u00F5es': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'notas-de-rorap\u00E9': 'footnotes',
+      #u'cita\u00E7\u00F5es': 'citations',
+      u'links-no-rodap\u00E9': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Brazilian Portuguese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbrevia\u00E7\u00E3o': 'abbreviation',
+    'ab': 'abbreviation',
+    u'acr\u00F4nimo': 'acronym',
+    'ac': 'acronym',
+    u'code (translation required)': 'code',
+    u'\u00EDndice-remissivo': 'index',
+    'i': 'index',
+    'subscrito': 'subscript',
+    'sub': 'subscript',
+    'sobrescrito': 'superscript',
+    'sob': 'superscript',
+    u'refer\u00EAncia-a-t\u00EDtulo': 'title-reference',
+    u't\u00EDtulo': 'title-reference',
+    't': 'title-reference',
+    u'refer\u00EAncia-a-pep': 'pep-reference',
+    'pep': 'pep-reference',
+    u'refer\u00EAncia-a-rfc': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    u'\u00EAnfase': 'emphasis',
+    'forte': 'strong',
+    'literal': 'literal',
+    'math (translation required)': 'math',               # translation required?
+    u'refer\u00EAncia-por-nome': 'named-reference',
+    u'refer\u00EAncia-an\u00F4nima': 'anonymous-reference',
+    u'refer\u00EAncia-a-nota-de-rodap\u00E9': 'footnote-reference',
+    u'refer\u00EAncia-a-cita\u00E7\u00E3o': 'citation-reference',
+    u'refer\u00EAncia-a-substitui\u00E7\u00E3o': 'substitution-reference',
+    'alvo': 'target',
+    u'refer\u00EAncia-a-uri': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'cru': 'raw',}
+"""Mapping of Brazilian Portuguese role names to canonical role names
+for interpreted text."""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/__init__$py.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/__init__$py.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/pep.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/pep.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/pep.py	(revision 1126)
@@ -0,0 +1,48 @@
+# $Id: pep.py 7320 2012-01-19 22:33:02Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Python Enhancement Proposal (PEP) Reader.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.readers import standalone
+from docutils.transforms import peps, references, misc, frontmatter
+from docutils.parsers import rst
+
+
+class Reader(standalone.Reader):
+
+    supported = ('pep',)
+    """Contexts this reader supports."""
+
+    settings_spec = (
+        'PEP Reader Option Defaults',
+        'The --pep-references and --rfc-references options (for the '
+        'reStructuredText parser) are on by default.',
+        ())
+
+    config_section = 'pep reader'
+    config_section_dependencies = ('readers', 'standalone reader')
+
+    def get_transforms(self):
+        transforms = standalone.Reader.get_transforms(self)
+        # We have PEP-specific frontmatter handling.
+        transforms.remove(frontmatter.DocTitle)
+        transforms.remove(frontmatter.SectionSubTitle)
+        transforms.remove(frontmatter.DocInfo)
+        transforms.extend([peps.Headers, peps.Contents, peps.TargetNotes])
+        return transforms
+
+    settings_default_overrides = {'pep_references': 1, 'rfc_references': 1}
+
+    inliner_class = rst.states.Inliner
+
+    def __init__(self, parser=None, parser_name=None):
+        """`parser` should be ``None``."""
+        if parser is None:
+            parser = rst.Parser(rfc2822=True, inliner=self.inliner_class())
+        standalone.Reader.__init__(self, parser, '')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/doctree.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/doctree.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/doctree.py	(revision 1126)
@@ -0,0 +1,46 @@
+# $Id: doctree.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""Reader for existing document trees."""
+
+from docutils import readers, utils, transforms
+
+
+class Reader(readers.ReReader):
+
+    """
+    Adapt the Reader API for an existing document tree.
+
+    The existing document tree must be passed as the ``source`` parameter to
+    the `docutils.core.Publisher` initializer, wrapped in a
+    `docutils.io.DocTreeInput` object::
+
+        pub = docutils.core.Publisher(
+            ..., source=docutils.io.DocTreeInput(document), ...)
+
+    The original document settings are overridden; if you want to use the
+    settings of the original document, pass ``settings=document.settings`` to
+    the Publisher call above.
+    """
+
+    supported = ('doctree',)
+
+    config_section = 'doctree reader'
+    config_section_dependencies = ('readers',)
+
+    def parse(self):
+        """
+        No parsing to do; refurbish the document tree instead.
+        Overrides the inherited method.
+        """
+        self.document = self.input
+        # Create fresh Transformer object, to be populated from Writer
+        # component.
+        self.document.transformer = transforms.Transformer(self.document)
+        # Replace existing settings object with new one.
+        self.document.settings = self.settings
+        # Create fresh Reporter object because it is dependent on
+        # (new) settings.
+        self.document.reporter = utils.new_reporter(
+            self.document.get('source', ''), self.document.settings)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/standalone.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/standalone.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/standalone.py	(revision 1126)
@@ -0,0 +1,66 @@
+# $Id: standalone.py 4802 2006-11-12 18:02:17Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Standalone file Reader for the reStructuredText markup syntax.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import frontend, readers
+from docutils.transforms import frontmatter, references, misc
+
+
+class Reader(readers.Reader):
+
+    supported = ('standalone',)
+    """Contexts this reader supports."""
+
+    document = None
+    """A single document tree."""
+
+    settings_spec = (
+        'Standalone Reader',
+        None,
+        (('Disable the promotion of a lone top-level section title to '
+          'document title (and subsequent section title to document '
+          'subtitle promotion; enabled by default).',
+          ['--no-doc-title'],
+          {'dest': 'doctitle_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Disable the bibliographic field list transform (enabled by '
+          'default).',
+          ['--no-doc-info'],
+          {'dest': 'docinfo_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Activate the promotion of lone subsection titles to '
+          'section subtitles (disabled by default).',
+          ['--section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_true', 'default': 0,
+           'validator': frontend.validate_boolean}),
+         ('Deactivate the promotion of lone subsection titles.',
+          ['--no-section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_false'}),
+         ))
+
+    config_section = 'standalone reader'
+    config_section_dependencies = ('readers',)
+
+    def get_transforms(self):
+        return readers.Reader.get_transforms(self) + [
+            references.Substitutions,
+            references.PropagateTargets,
+            frontmatter.DocTitle,
+            frontmatter.SectionSubTitle,
+            frontmatter.DocInfo,
+            references.AnonymousHyperlinks,
+            references.IndirectHyperlinks,
+            references.Footnotes,
+            references.ExternalTargets,
+            references.InternalTargets,
+            references.DanglingReferences,
+            misc.Transitions,
+            ]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/readers/__init__.py	(revision 1126)
@@ -0,0 +1,113 @@
+# $Id: __init__.py 7648 2013-04-18 07:36:22Z milde $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+
+from docutils import utils, parsers, Component
+from docutils.transforms import universal
+if sys.version_info < (2,5):
+    from docutils._compat import __import__
+
+
+class Reader(Component):
+
+    """
+    Abstract base class for docutils Readers.
+
+    Each reader module or package must export a subclass also called 'Reader'.
+
+    The two steps of a Reader's responsibility are `scan()` and
+    `parse()`.  Call `read()` to process a document.
+    """
+
+    component_type = 'reader'
+    config_section = 'readers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Decorations,
+            universal.ExposeInternals,
+            universal.StripComments,]
+
+    def __init__(self, parser=None, parser_name=None):
+        """
+        Initialize the Reader instance.
+
+        Several instance attributes are defined with dummy initial values.
+        Subclasses may use these attributes as they wish.
+        """
+
+        self.parser = parser
+        """A `parsers.Parser` instance shared by all doctrees.  May be left
+        unspecified if the document source determines the parser."""
+
+        if parser is None and parser_name:
+            self.set_parser(parser_name)
+
+        self.source = None
+        """`docutils.io` IO object, source of input data."""
+
+        self.input = None
+        """Raw text input; either a single string or, for more complex cases,
+        a collection of strings."""
+
+    def set_parser(self, parser_name):
+        """Set `self.parser` by name."""
+        parser_class = parsers.get_parser_class(parser_name)
+        self.parser = parser_class()
+
+    def read(self, source, parser, settings):
+        self.source = source
+        if not self.parser:
+            self.parser = parser
+        self.settings = settings
+        self.input = self.source.read()
+        self.parse()
+        return self.document
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        self.parser.parse(self.input, document)
+        document.current_source = document.current_line = None
+
+    def new_document(self):
+        """Create and return a new empty document tree (root node)."""
+        document = utils.new_document(self.source.source_path, self.settings)
+        return document
+
+
+class ReReader(Reader):
+
+    """
+    A reader which rereads an existing document tree (e.g. a
+    deserializer).
+
+    Often used in conjunction with `writers.UnfilteredWriter`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  They have already been applied
+        # by the reader which originally created the document.
+        return Component.get_transforms(self)
+
+
+_reader_aliases = {}
+
+def get_reader_class(reader_name):
+    """Return the Reader class from the `reader_name` module."""
+    reader_name = reader_name.lower()
+    if reader_name in _reader_aliases:
+        reader_name = _reader_aliases[reader_name]
+    try:
+        module = __import__(reader_name, globals(), locals(), level=1)
+    except ImportError:
+        module = __import__(reader_name, globals(), locals(), level=0)
+    return module.Reader
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/__init__.py	(revision 1126)
@@ -0,0 +1,217 @@
+# $Id: __init__.py 7991 2016-12-09 13:11:53Z grubert $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the Docutils (Python Documentation Utilities) package.
+
+Package Structure
+=================
+
+Modules:
+
+- __init__.py: Contains component base classes, exception classes, and
+  Docutils version information.
+
+- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience
+  functions.
+
+- frontend.py: Runtime settings (command-line interface, configuration files)
+  processing, for Docutils front-ends.
+
+- io.py: Provides a uniform API for low-level input and output.
+
+- nodes.py: Docutils document tree (doctree) node class library.
+
+- statemachine.py: A finite state machine specialized for
+  regular-expression-based text filters.
+
+Subpackages:
+
+- languages: Language-specific mappings of terms.
+
+- parsers: Syntax-specific input parser modules or packages.
+
+- readers: Context-specific input handlers which understand the data
+  source and manage a parser.
+
+- transforms: Modules used by readers and writers to modify DPS
+  doctrees.
+
+- utils: Contains the ``Reporter`` system warning class and miscellaneous
+  utilities used by readers, writers, and transforms.
+
+  utils/urischemes.py: Contains a complete mapping of known URI addressing
+  scheme names to descriptions.
+
+- utils/math: Contains functions for conversion of mathematical notation
+  between different formats (LaTeX, MathML, text, ...).
+
+- writers: Format-specific output translators.
+"""
+
+__docformat__ = 'reStructuredText'
+
+__version__ = '0.13.2a'
+"""``major.minor.micro`` version number.  The micro number is bumped for API
+changes, for new functionality, and for interim project releases.  The minor
+number is bumped whenever there is a significant project release.  The major
+number will be bumped when the project is feature-complete, and perhaps if
+there is a major change in the design."""
+
+__version_details__ = 'repository'
+"""Extra version details (e.g. 'snapshot 2005-05-29, r3410', 'repository',
+'release'), modified automatically & manually."""
+
+import sys
+
+class ApplicationError(StandardError):
+    # Workaround:
+    # In Python < 2.6, unicode(<exception instance>) calls `str` on the
+    # arg and therefore, e.g., unicode(StandardError(u'\u234')) fails
+    # with UnicodeDecodeError.
+    if sys.version_info < (2,6):
+        def __unicode__(self):
+            return u', '.join(self.args)
+
+class DataError(ApplicationError): pass
+
+
+class SettingsSpec:
+
+    """
+    Runtime setting specification base class.
+
+    SettingsSpec subclass objects used by `docutils.frontend.OptionParser`.
+    """
+
+    settings_spec = ()
+    """Runtime settings specification.  Override in subclasses.
+
+    Defines runtime settings and associated command-line options, as used by
+    `docutils.frontend.OptionParser`.  This is a tuple of:
+
+    - Option group title (string or `None` which implies no group, just a list
+      of single options).
+
+    - Description (string or `None`).
+
+    - A sequence of option tuples.  Each consists of:
+
+      - Help text (string)
+
+      - List of option strings (e.g. ``['-Q', '--quux']``).
+
+      - Dictionary of keyword arguments sent to the OptionParser/OptionGroup
+        ``add_option`` method.
+
+        Runtime setting names are derived implicitly from long option names
+        ('--a-setting' becomes ``settings.a_setting``) or explicitly from the
+        'dest' keyword argument.
+
+        Most settings will also have a 'validator' keyword & function.  The
+        validator function validates setting values (from configuration files
+        and command-line option arguments) and converts them to appropriate
+        types.  For example, the ``docutils.frontend.validate_boolean``
+        function, **required by all boolean settings**, converts true values
+        ('1', 'on', 'yes', and 'true') to 1 and false values ('0', 'off',
+        'no', 'false', and '') to 0.  Validators need only be set once per
+        setting.  See the `docutils.frontend.validate_*` functions.
+
+        See the optparse docs for more details.
+
+    - More triples of group title, description, options, as many times as
+      needed.  Thus, `settings_spec` tuples can be simply concatenated.
+    """
+
+    settings_defaults = None
+    """A dictionary of defaults for settings not in `settings_spec` (internal
+    settings, intended to be inaccessible by command-line and config file).
+    Override in subclasses."""
+
+    settings_default_overrides = None
+    """A dictionary of auxiliary defaults, to override defaults for settings
+    defined in other components.  Override in subclasses."""
+
+    relative_path_settings = ()
+    """Settings containing filesystem paths.  Override in subclasses.
+    Settings listed here are to be interpreted relative to the current working
+    directory."""
+
+    config_section = None
+    """The name of the config file section specific to this component
+    (lowercase, no brackets).  Override in subclasses."""
+
+    config_section_dependencies = None
+    """A list of names of config file sections that are to be applied before
+    `config_section`, in order (from general to specific).  In other words,
+    the settings in `config_section` are to be overlaid on top of the settings
+    from these sections.  The "general" section is assumed implicitly.
+    Override in subclasses."""
+
+
+class TransformSpec:
+
+    """
+    Runtime transform specification base class.
+
+    TransformSpec subclass objects used by `docutils.transforms.Transformer`.
+    """
+
+    def get_transforms(self):
+        """Transforms required by this class.  Override in subclasses."""
+        if self.default_transforms != ():
+            import warnings
+            warnings.warn('default_transforms attribute deprecated.\n'
+                          'Use get_transforms() method instead.',
+                          DeprecationWarning)
+            return list(self.default_transforms)
+        return []
+
+    # Deprecated; for compatibility.
+    default_transforms = ()
+
+    unknown_reference_resolvers = ()
+    """List of functions to try to resolve unknown references.  Unknown
+    references have a 'refname' attribute which doesn't correspond to any
+    target in the document.  Called when the transforms in
+    `docutils.tranforms.references` are unable to find a correct target.  The
+    list should contain functions which will try to resolve unknown
+    references, with the following signature::
+
+        def reference_resolver(node):
+            '''Returns boolean: true if resolved, false if not.'''
+
+    If the function is able to resolve the reference, it should also remove
+    the 'refname' attribute and mark the node as resolved::
+
+        del node['refname']
+        node.resolved = 1
+
+    Each function must have a "priority" attribute which will affect the order
+    the unknown_reference_resolvers are run::
+
+        reference_resolver.priority = 100
+
+    Override in subclasses."""
+
+
+class Component(SettingsSpec, TransformSpec):
+
+    """Base class for Docutils components."""
+
+    component_type = None
+    """Name of the component type ('reader', 'parser', 'writer').  Override in
+    subclasses."""
+
+    supported = ()
+    """Names for this component.  Override in subclasses."""
+
+    def supports(self, format):
+        """
+        Is `format` supported by this component?
+
+        To be used by transforms to ask the dependent component if it supports
+        a certain input context or output format.
+        """
+        return format in self.supported
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/statemachine.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/statemachine.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/statemachine.py	(revision 1126)
@@ -0,0 +1,1538 @@
+ # $Id: statemachine.py 7464 2012-06-25 13:16:03Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A finite state machine specialized for regular-expression-based text filters,
+this module defines the following classes:
+
+- `StateMachine`, a state machine
+- `State`, a state superclass
+- `StateMachineWS`, a whitespace-sensitive version of `StateMachine`
+- `StateWS`, a state superclass for use with `StateMachineWS`
+- `SearchStateMachine`, uses `re.search()` instead of `re.match()`
+- `SearchStateMachineWS`, uses `re.search()` instead of `re.match()`
+- `ViewList`, extends standard Python lists.
+- `StringList`, string-specific ViewList.
+
+Exception classes:
+
+- `StateMachineError`
+- `UnknownStateError`
+- `DuplicateStateError`
+- `UnknownTransitionError`
+- `DuplicateTransitionError`
+- `TransitionPatternNotFound`
+- `TransitionMethodNotFound`
+- `UnexpectedIndentationError`
+- `TransitionCorrection`: Raised to switch to another transition.
+- `StateCorrection`: Raised to switch to another state & transition.
+
+Functions:
+
+- `string2lines()`: split a multi-line string into a list of one-line strings
+
+
+How To Use This Module
+======================
+(See the individual classes, methods, and attributes for details.)
+
+1. Import it: ``import statemachine`` or ``from statemachine import ...``.
+   You will also need to ``import re``.
+
+2. Derive a subclass of `State` (or `StateWS`) for each state in your state
+   machine::
+
+       class MyState(statemachine.State):
+
+   Within the state's class definition:
+
+   a) Include a pattern for each transition, in `State.patterns`::
+
+          patterns = {'atransition': r'pattern', ...}
+
+   b) Include a list of initial transitions to be set up automatically, in
+      `State.initial_transitions`::
+
+          initial_transitions = ['atransition', ...]
+
+   c) Define a method for each transition, with the same name as the
+      transition pattern::
+
+          def atransition(self, match, context, next_state):
+              # do something
+              result = [...]  # a list
+              return context, next_state, result
+              # context, next_state may be altered
+
+      Transition methods may raise an `EOFError` to cut processing short.
+
+   d) You may wish to override the `State.bof()` and/or `State.eof()` implicit
+      transition methods, which handle the beginning- and end-of-file.
+
+   e) In order to handle nested processing, you may wish to override the
+      attributes `State.nested_sm` and/or `State.nested_sm_kwargs`.
+
+      If you are using `StateWS` as a base class, in order to handle nested
+      indented blocks, you may wish to:
+
+      - override the attributes `StateWS.indent_sm`,
+        `StateWS.indent_sm_kwargs`, `StateWS.known_indent_sm`, and/or
+        `StateWS.known_indent_sm_kwargs`;
+      - override the `StateWS.blank()` method; and/or
+      - override or extend the `StateWS.indent()`, `StateWS.known_indent()`,
+        and/or `StateWS.firstknown_indent()` methods.
+
+3. Create a state machine object::
+
+       sm = StateMachine(state_classes=[MyState, ...],
+                         initial_state='MyState')
+
+4. Obtain the input text, which needs to be converted into a tab-free list of
+   one-line strings. For example, to read text from a file called
+   'inputfile'::
+
+       input_string = open('inputfile').read()
+       input_lines = statemachine.string2lines(input_string)
+
+5. Run the state machine on the input text and collect the results, a list::
+
+       results = sm.run(input_lines)
+
+6. Remove any lingering circular references::
+
+       sm.unlink()
+"""
+
+__docformat__ = 'restructuredtext'
+
+import sys
+import re
+import types
+import unicodedata
+from docutils import utils
+from docutils.utils.error_reporting import ErrorOutput
+
+
+class StateMachine:
+
+    """
+    A finite state machine for text filters using regular expressions.
+
+    The input is provided in the form of a list of one-line strings (no
+    newlines). States are subclasses of the `State` class. Transitions consist
+    of regular expression patterns and transition methods, and are defined in
+    each state.
+
+    The state machine is started with the `run()` method, which returns the
+    results of processing in a list.
+    """
+
+    def __init__(self, state_classes, initial_state, debug=False):
+        """
+        Initialize a `StateMachine` object; add state objects.
+
+        Parameters:
+
+        - `state_classes`: a list of `State` (sub)classes.
+        - `initial_state`: a string, the class name of the initial state.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.input_lines = None
+        """`StringList` of input lines (without newlines).
+        Filled by `self.run()`."""
+
+        self.input_offset = 0
+        """Offset of `self.input_lines` from the beginning of the file."""
+
+        self.line = None
+        """Current input line."""
+
+        self.line_offset = -1
+        """Current input line offset from beginning of `self.input_lines`."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        self.initial_state = initial_state
+        """The name of the initial state (key to `self.states`)."""
+
+        self.current_state = initial_state
+        """The name of the current state (key to `self.states`)."""
+
+        self.states = {}
+        """Mapping of {state_name: State_object}."""
+
+        self.add_states(state_classes)
+
+        self.observers = []
+        """List of bound methods or functions to call whenever the current
+        line changes.  Observers are called with one argument, ``self``.
+        Cleared at the end of `run()`."""
+
+        self._stderr = ErrorOutput()
+        """Wrapper around sys.stderr catching en-/decoding errors"""
+
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        for state in self.states.values():
+            state.unlink()
+        self.states = None
+
+    def run(self, input_lines, input_offset=0, context=None,
+            input_source=None, initial_state=None):
+        """
+        Run the state machine on `input_lines`. Return results (a list).
+
+        Reset `self.line_offset` and `self.current_state`. Run the
+        beginning-of-file transition. Input one line at a time and check for a
+        matching transition. If a match is found, call the transition method
+        and possibly change the state. Store the context returned by the
+        transition method to be passed on to the next transition matched.
+        Accumulate the results returned by the transition methods in a list.
+        Run the end-of-file transition. Finally, return the accumulated
+        results.
+
+        Parameters:
+
+        - `input_lines`: a list of strings without newlines, or `StringList`.
+        - `input_offset`: the line offset of `input_lines` from the beginning
+          of the file.
+        - `context`: application-specific storage.
+        - `input_source`: name or path of source of `input_lines`.
+        - `initial_state`: name of initial state.
+        """
+        self.runtime_init()
+        if isinstance(input_lines, StringList):
+            self.input_lines = input_lines
+        else:
+            self.input_lines = StringList(input_lines, source=input_source)
+        self.input_offset = input_offset
+        self.line_offset = -1
+        self.current_state = initial_state or self.initial_state
+        if self.debug:
+            print >>self._stderr, (
+                u'\nStateMachine.run: input_lines (line_offset=%s):\n| %s'
+                % (self.line_offset, u'\n| '.join(self.input_lines)))
+        transitions = None
+        results = []
+        state = self.get_state()
+        try:
+            if self.debug:
+                print >>self._stderr, '\nStateMachine.run: bof transition'
+            context, result = state.bof(context)
+            results.extend(result)
+            while True:
+                try:
+                    try:
+                        self.next_line()
+                        if self.debug:
+                            source, offset = self.input_lines.info(
+                                self.line_offset)
+                            print >>self._stderr, (
+                                u'\nStateMachine.run: line (source=%r, '
+                                u'offset=%r):\n| %s'
+                                % (source, offset, self.line))
+                        context, next_state, result = self.check_line(
+                            context, state, transitions)
+                    except EOFError:
+                        if self.debug:
+                            print >>self._stderr, (
+                                '\nStateMachine.run: %s.eof transition'
+                                % state.__class__.__name__)
+                        result = state.eof(context)
+                        results.extend(result)
+                        break
+                    else:
+                        results.extend(result)
+                except TransitionCorrection, exception:
+                    self.previous_line() # back up for another try
+                    transitions = (exception.args[0],)
+                    if self.debug:
+                        print >>self._stderr, (
+                              '\nStateMachine.run: TransitionCorrection to '
+                              'state "%s", transition %s.'
+                              % (state.__class__.__name__, transitions[0]))
+                    continue
+                except StateCorrection, exception:
+                    self.previous_line() # back up for another try
+                    next_state = exception.args[0]
+                    if len(exception.args) == 1:
+                        transitions = None
+                    else:
+                        transitions = (exception.args[1],)
+                    if self.debug:
+                        print >>self._stderr, (
+                              '\nStateMachine.run: StateCorrection to state '
+                              '"%s", transition %s.'
+                              % (next_state, transitions[0]))
+                else:
+                    transitions = None
+                state = self.get_state(next_state)
+        except:
+            if self.debug:
+                self.error()
+            raise
+        self.observers = []
+        return results
+
+    def get_state(self, next_state=None):
+        """
+        Return current state object; set it first if `next_state` given.
+
+        Parameter `next_state`: a string, the name of the next state.
+
+        Exception: `UnknownStateError` raised if `next_state` unknown.
+        """
+        if next_state:
+            if self.debug and next_state != self.current_state:
+                print >>self._stderr, (
+                    '\nStateMachine.get_state: Changing state from '
+                    '"%s" to "%s" (input line %s).'
+                    % (self.current_state, next_state,
+                       self.abs_line_number()))
+            self.current_state = next_state
+        try:
+            return self.states[self.current_state]
+        except KeyError:
+            raise UnknownStateError(self.current_state)
+
+    def next_line(self, n=1):
+        """Load `self.line` with the `n`'th next line and return it."""
+        try:
+            try:
+                self.line_offset += n
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def is_next_line_blank(self):
+        """Return 1 if the next line is blank or non-existant."""
+        try:
+            return not self.input_lines[self.line_offset + 1].strip()
+        except IndexError:
+            return 1
+
+    def at_eof(self):
+        """Return 1 if the input is at or past end-of-file."""
+        return self.line_offset >= len(self.input_lines) - 1
+
+    def at_bof(self):
+        """Return 1 if the input is at or before beginning-of-file."""
+        return self.line_offset <= 0
+
+    def previous_line(self, n=1):
+        """Load `self.line` with the `n`'th previous line and return it."""
+        self.line_offset -= n
+        if self.line_offset < 0:
+            self.line = None
+        else:
+            self.line = self.input_lines[self.line_offset]
+        self.notify_observers()
+        return self.line
+
+    def goto_line(self, line_offset):
+        """Jump to absolute line offset `line_offset`, load and return it."""
+        try:
+            try:
+                self.line_offset = line_offset - self.input_offset
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def get_source(self, line_offset):
+        """Return source of line at absolute line offset `line_offset`."""
+        return self.input_lines.source(line_offset - self.input_offset)
+
+    def abs_line_offset(self):
+        """Return line offset of current line, from beginning of file."""
+        return self.line_offset + self.input_offset
+
+    def abs_line_number(self):
+        """Return line number of current line (counting from 1)."""
+        return self.line_offset + self.input_offset + 1
+
+    def get_source_and_line(self, lineno=None):
+        """Return (source, line) tuple for current or given line number.
+
+        Looks up the source and line number in the `self.input_lines`
+        StringList instance to count for included source files.
+
+        If the optional argument `lineno` is given, convert it from an
+        absolute line number to the corresponding (source, line) pair.
+        """
+        if lineno is None:
+            offset = self.line_offset
+        else:
+            offset = lineno - self.input_offset - 1
+        try:
+            src, srcoffset = self.input_lines.info(offset)
+            srcline = srcoffset + 1
+        except (TypeError):
+            # line is None if index is "Just past the end"
+            src, srcline = self.get_source_and_line(offset + self.input_offset)
+            return src, srcline + 1
+        except (IndexError): # `offset` is off the list
+            src, srcline = None, None
+            # raise AssertionError('cannot find line %d in %s lines' %
+            #                      (offset, len(self.input_lines)))
+            #                      # list(self.input_lines.lines())))
+        # assert offset == srcoffset, str(self.input_lines)
+        # print "get_source_and_line(%s):" % lineno,
+        # print offset + 1, '->', src, srcline
+        # print self.input_lines
+        return (src, srcline)
+
+    def insert_input(self, input_lines, source):
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding after '+source,
+                                offset=len(input_lines))
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding before '+source,
+                                offset=-1)
+        self.input_lines.insert(self.line_offset + 2,
+                                StringList(input_lines, source))
+
+    def get_text_block(self, flush_left=False):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        try:
+            block = self.input_lines.get_text_block(self.line_offset,
+                                                    flush_left)
+            self.next_line(len(block) - 1)
+            return block
+        except UnexpectedIndentationError, err:
+            block = err.args[0]
+            self.next_line(len(block) - 1) # advance to last line of block
+            raise
+
+    def check_line(self, context, state, transitions=None):
+        """
+        Examine one line of input for a transition match & execute its method.
+
+        Parameters:
+
+        - `context`: application-dependent storage.
+        - `state`: a `State` object, the current state.
+        - `transitions`: an optional ordered list of transition names to try,
+          instead of ``state.transition_order``.
+
+        Return the values returned by the transition method:
+
+        - context: possibly modified from the parameter `context`;
+        - next state name (`State` subclass name);
+        - the result output of the transition, a list.
+
+        When there is no match, ``state.no_match()`` is called and its return
+        value is returned.
+        """
+        if transitions is None:
+            transitions =  state.transition_order
+        state_correction = None
+        if self.debug:
+            print >>self._stderr, (
+                  '\nStateMachine.check_line: state="%s", transitions=%r.'
+                  % (state.__class__.__name__, transitions))
+        for name in transitions:
+            pattern, method, next_state = state.transitions[name]
+            match = pattern.match(self.line)
+            if match:
+                if self.debug:
+                    print >>self._stderr, (
+                          '\nStateMachine.check_line: Matched transition '
+                          '"%s" in state "%s".'
+                          % (name, state.__class__.__name__))
+                return method(match, context, next_state)
+        else:
+            if self.debug:
+                print >>self._stderr, (
+                      '\nStateMachine.check_line: No match in state "%s".'
+                      % state.__class__.__name__)
+            return state.no_match(context, transitions)
+
+    def add_state(self, state_class):
+        """
+        Initialize & add a `state_class` (`State` subclass) object.
+
+        Exception: `DuplicateStateError` raised if `state_class` was already
+        added.
+        """
+        statename = state_class.__name__
+        if statename in self.states:
+            raise DuplicateStateError(statename)
+        self.states[statename] = state_class(self, self.debug)
+
+    def add_states(self, state_classes):
+        """
+        Add `state_classes` (a list of `State` subclasses).
+        """
+        for state_class in state_classes:
+            self.add_state(state_class)
+
+    def runtime_init(self):
+        """
+        Initialize `self.states`.
+        """
+        for state in self.states.values():
+            state.runtime_init()
+
+    def error(self):
+        """Report error details."""
+        type, value, module, line, function = _exception_data()
+        print >>self._stderr, u'%s: %s' % (type, value)
+        print >>self._stderr, 'input line %s' % (self.abs_line_number())
+        print >>self._stderr, (u'module %s, line %s, function %s' %
+                               (module, line, function))
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes two
+        arguments, the source and offset of the current line.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self):
+        for observer in self.observers:
+            try:
+                info = self.input_lines.info(self.line_offset)
+            except IndexError:
+                info = (None, None)
+            observer(*info)
+
+
+class State:
+
+    """
+    State superclass. Contains a list of transitions, and transition methods.
+
+    Transition methods all have the same signature. They take 3 parameters:
+
+    - An `re` match object. ``match.string`` contains the matched input line,
+      ``match.start()`` gives the start index of the match, and
+      ``match.end()`` gives the end index.
+    - A context object, whose meaning is application-defined (initial value
+      ``None``). It can be used to store any information required by the state
+      machine, and the retured context is passed on to the next transition
+      method unchanged.
+    - The name of the next state, a string, taken from the transitions list;
+      normally it is returned unchanged, but it may be altered by the
+      transition method if necessary.
+
+    Transition methods all return a 3-tuple:
+
+    - A context object, as (potentially) modified by the transition method.
+    - The next state name (a return value of ``None`` means no state change).
+    - The processing result, a list, which is accumulated by the state
+      machine.
+
+    Transition methods may raise an `EOFError` to cut processing short.
+
+    There are two implicit transitions, and corresponding transition methods
+    are defined: `bof()` handles the beginning-of-file, and `eof()` handles
+    the end-of-file. These methods have non-standard signatures and return
+    values. `bof()` returns the initial context and results, and may be used
+    to return a header string, or do any other processing needed. `eof()`
+    should handle any remaining context and wrap things up; it returns the
+    final processing result.
+
+    Typical applications need only subclass `State` (or a subclass), set the
+    `patterns` and `initial_transitions` class attributes, and provide
+    corresponding transition methods. The default object initialization will
+    take care of constructing the list of transitions.
+    """
+
+    patterns = None
+    """
+    {Name: pattern} mapping, used by `make_transition()`. Each pattern may
+    be a string or a compiled `re` pattern. Override in subclasses.
+    """
+
+    initial_transitions = None
+    """
+    A list of transitions to initialize when a `State` is instantiated.
+    Each entry is either a transition name string, or a (transition name, next
+    state name) pair. See `make_transitions()`. Override in subclasses.
+    """
+
+    nested_sm = None
+    """
+    The `StateMachine` class for handling nested processing.
+
+    If left as ``None``, `nested_sm` defaults to the class of the state's
+    controlling state machine. Override it in subclasses to avoid the default.
+    """
+
+    nested_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `nested_sm` constructor.
+
+    Two keys must have entries in the dictionary:
+
+    - Key 'state_classes' must be set to a list of `State` classes.
+    - Key 'initial_state' must be set to the name of the initial state class.
+
+    If `nested_sm_kwargs` is left as ``None``, 'state_classes' defaults to the
+    class of the current state, and 'initial_state' defaults to the name of
+    the class of the current state. Override in subclasses to avoid the
+    defaults.
+    """
+
+    def __init__(self, state_machine, debug=False):
+        """
+        Initialize a `State` object; make & add initial transitions.
+
+        Parameters:
+
+        - `statemachine`: the controlling `StateMachine` object.
+        - `debug`: a boolean; produce verbose output if true.
+        """
+
+        self.transition_order = []
+        """A list of transition names in search order."""
+
+        self.transitions = {}
+        """
+        A mapping of transition names to 3-tuples containing
+        (compiled_pattern, transition_method, next_state_name). Initialized as
+        an instance attribute dynamically (instead of as a class attribute)
+        because it may make forward references to patterns and methods in this
+        or other classes.
+        """
+
+        self.add_initial_transitions()
+
+        self.state_machine = state_machine
+        """A reference to the controlling `StateMachine` object."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        if self.nested_sm is None:
+            self.nested_sm = self.state_machine.__class__
+        if self.nested_sm_kwargs is None:
+            self.nested_sm_kwargs = {'state_classes': [self.__class__],
+                                     'initial_state': self.__class__.__name__}
+
+    def runtime_init(self):
+        """
+        Initialize this `State` before running the state machine; called from
+        `self.state_machine.run()`.
+        """
+        pass
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        self.state_machine = None
+
+    def add_initial_transitions(self):
+        """Make and add transitions listed in `self.initial_transitions`."""
+        if self.initial_transitions:
+            names, transitions = self.make_transitions(
+                  self.initial_transitions)
+            self.add_transitions(names, transitions)
+
+    def add_transitions(self, names, transitions):
+        """
+        Add a list of transitions to the start of the transition list.
+
+        Parameters:
+
+        - `names`: a list of transition names.
+        - `transitions`: a mapping of names to transition tuples.
+
+        Exceptions: `DuplicateTransitionError`, `UnknownTransitionError`.
+        """
+        for name in names:
+            if name in self.transitions:
+                raise DuplicateTransitionError(name)
+            if name not in transitions:
+                raise UnknownTransitionError(name)
+        self.transition_order[:0] = names
+        self.transitions.update(transitions)
+
+    def add_transition(self, name, transition):
+        """
+        Add a transition to the start of the transition list.
+
+        Parameter `transition`: a ready-made transition 3-tuple.
+
+        Exception: `DuplicateTransitionError`.
+        """
+        if name in self.transitions:
+            raise DuplicateTransitionError(name)
+        self.transition_order[:0] = [name]
+        self.transitions[name] = transition
+
+    def remove_transition(self, name):
+        """
+        Remove a transition by `name`.
+
+        Exception: `UnknownTransitionError`.
+        """
+        try:
+            del self.transitions[name]
+            self.transition_order.remove(name)
+        except:
+            raise UnknownTransitionError(name)
+
+    def make_transition(self, name, next_state=None):
+        """
+        Make & return a transition tuple based on `name`.
+
+        This is a convenience function to simplify transition creation.
+
+        Parameters:
+
+        - `name`: a string, the name of the transition pattern & method. This
+          `State` object must have a method called '`name`', and a dictionary
+          `self.patterns` containing a key '`name`'.
+        - `next_state`: a string, the name of the next `State` object for this
+          transition. A value of ``None`` (or absent) implies no state change
+          (i.e., continue with the same state).
+
+        Exceptions: `TransitionPatternNotFound`, `TransitionMethodNotFound`.
+        """
+        if next_state is None:
+            next_state = self.__class__.__name__
+        try:
+            pattern = self.patterns[name]
+            if not hasattr(pattern, 'match'):
+                pattern = re.compile(pattern)
+        except KeyError:
+            raise TransitionPatternNotFound(
+                  '%s.patterns[%r]' % (self.__class__.__name__, name))
+        try:
+            method = getattr(self, name)
+        except AttributeError:
+            raise TransitionMethodNotFound(
+                  '%s.%s' % (self.__class__.__name__, name))
+        return (pattern, method, next_state)
+
+    def make_transitions(self, name_list):
+        """
+        Return a list of transition names and a transition mapping.
+
+        Parameter `name_list`: a list, where each entry is either a transition
+        name string, or a 1- or 2-tuple (transition name, optional next state
+        name).
+        """
+        stringtype = type('')
+        names = []
+        transitions = {}
+        for namestate in name_list:
+            if type(namestate) is stringtype:
+                transitions[namestate] = self.make_transition(namestate)
+                names.append(namestate)
+            else:
+                transitions[namestate[0]] = self.make_transition(*namestate)
+                names.append(namestate[0])
+        return names, transitions
+
+    def no_match(self, context, transitions):
+        """
+        Called when there is no match from `StateMachine.check_line()`.
+
+        Return the same values returned by transition methods:
+
+        - context: unchanged;
+        - next state name: ``None``;
+        - empty result list.
+
+        Override in subclasses to catch this event.
+        """
+        return context, None, []
+
+    def bof(self, context):
+        """
+        Handle beginning-of-file. Return unchanged `context`, empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return context, []
+
+    def eof(self, context):
+        """
+        Handle end-of-file. Return empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return []
+
+    def nop(self, match, context, next_state):
+        """
+        A "do nothing" transition method.
+
+        Return unchanged `context` & `next_state`, empty result. Useful for
+        simple state changes (actionless transitions).
+        """
+        return context, next_state, []
+
+
+class StateMachineWS(StateMachine):
+
+    """
+    `StateMachine` subclass specialized for whitespace recognition.
+
+    There are three methods provided for extracting indented text blocks:
+
+    - `get_indented()`: use when the indent is unknown.
+    - `get_known_indented()`: use when the indent is known for all lines.
+    - `get_first_known_indented()`: use when only the first line's indent is
+      known.
+    """
+
+    def get_indented(self, until_blank=False, strip_indent=True):
+        """
+        Return a block of indented lines of text, and info.
+
+        Extract an indented block where the indent is unknown for all lines.
+
+        :Parameters:
+            - `until_blank`: Stop collecting at the first blank line if true.
+            - `strip_indent`: Strip common leading indent if true (default).
+
+        :Return:
+            - the indented block (a list of lines of text),
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent)
+        if indented:
+            self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, indent, offset, blank_finish
+
+    def get_known_indented(self, indent, until_blank=False, strip_indent=True):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for all lines.
+        Starting with the current line, extract the entire text block with at
+        least `indent` indentation (which must be whitespace, except for the
+        first line).
+
+        :Parameters:
+            - `indent`: The number of indent columns/characters.
+            - `until_blank`: Stop collecting at the first blank line if true.
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (default).
+
+        :Return:
+            - the indented block,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              block_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, offset, blank_finish
+
+    def get_first_known_indented(self, indent, until_blank=False, 
+                                 strip_indent=True, strip_top=True):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for the first line
+        and unknown for all other lines.
+
+        :Parameters:
+            - `indent`: The first line's indent (# of columns/characters).
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+            - `strip_top`: Strip blank lines from the beginning of the block.
+
+        :Return:
+            - the indented block,
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              first_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        if strip_top:
+            while indented and not indented[0].strip():
+                indented.trim_start()
+                offset += 1
+        return indented, indent, offset, blank_finish
+
+
+class StateWS(State):
+
+    """
+    State superclass specialized for whitespace (blank lines & indents).
+
+    Use this class with `StateMachineWS`.  The transitions 'blank' (for blank
+    lines) and 'indent' (for indented text blocks) are added automatically,
+    before any other transitions.  The transition method `blank()` handles
+    blank lines and `indent()` handles nested indented blocks.  Indented
+    blocks trigger a new state machine to be created by `indent()` and run.
+    The class of the state machine to be created is in `indent_sm`, and the
+    constructor keyword arguments are in the dictionary `indent_sm_kwargs`.
+
+    The methods `known_indent()` and `firstknown_indent()` are provided for
+    indented blocks where the indent (all lines' and first line's only,
+    respectively) is known to the transition method, along with the attributes
+    `known_indent_sm` and `known_indent_sm_kwargs`.  Neither transition method
+    is triggered automatically.
+    """
+
+    indent_sm = None
+    """
+    The `StateMachine` class handling indented text blocks.
+
+    If left as ``None``, `indent_sm` defaults to the value of
+    `State.nested_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `indent_sm` constructor.
+
+    If left as ``None``, `indent_sm_kwargs` defaults to the value of
+    `State.nested_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm = None
+    """
+    The `StateMachine` class handling known-indented text blocks.
+
+    If left as ``None``, `known_indent_sm` defaults to the value of
+    `indent_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `known_indent_sm` constructor.
+
+    If left as ``None``, `known_indent_sm_kwargs` defaults to the value of
+    `indent_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    ws_patterns = {'blank': ' *$',
+                   'indent': ' +'}
+    """Patterns for default whitespace transitions.  May be overridden in
+    subclasses."""
+
+    ws_initial_transitions = ('blank', 'indent')
+    """Default initial whitespace transitions, added before those listed in
+    `State.initial_transitions`.  May be overridden in subclasses."""
+
+    def __init__(self, state_machine, debug=False):
+        """
+        Initialize a `StateSM` object; extends `State.__init__()`.
+
+        Check for indent state machine attributes, set defaults if not set.
+        """
+        State.__init__(self, state_machine, debug)
+        if self.indent_sm is None:
+            self.indent_sm = self.nested_sm
+        if self.indent_sm_kwargs is None:
+            self.indent_sm_kwargs = self.nested_sm_kwargs
+        if self.known_indent_sm is None:
+            self.known_indent_sm = self.indent_sm
+        if self.known_indent_sm_kwargs is None:
+            self.known_indent_sm_kwargs = self.indent_sm_kwargs
+
+    def add_initial_transitions(self):
+        """
+        Add whitespace-specific transitions before those defined in subclass.
+
+        Extends `State.add_initial_transitions()`.
+        """
+        State.add_initial_transitions(self)
+        if self.patterns is None:
+            self.patterns = {}
+        self.patterns.update(self.ws_patterns)
+        names, transitions = self.make_transitions(
+            self.ws_initial_transitions)
+        self.add_transitions(names, transitions)
+
+    def blank(self, match, context, next_state):
+        """Handle blank lines. Does nothing. Override in subclasses."""
+        return self.nop(match, context, next_state)
+
+    def indent(self, match, context, next_state):
+        """
+        Handle an indented text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for indented blocks
+        (`self.indent_sm`).
+        """
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        sm = self.indent_sm(debug=self.debug, **self.indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def known_indent(self, match, context, next_state):
+        """
+        Handle a known-indent text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def first_known_indent(self, match, context, next_state):
+        """
+        Handle an indented text block (first line's indent known).
+
+        Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+
+class _SearchOverride:
+
+    """
+    Mix-in class to override `StateMachine` regular expression behavior.
+
+    Changes regular expression matching, from the default `re.match()`
+    (succeeds only if the pattern matches at the start of `self.line`) to
+    `re.search()` (succeeds if the pattern matches anywhere in `self.line`).
+    When subclassing a `StateMachine`, list this class **first** in the
+    inheritance list of the class definition.
+    """
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression search.
+
+        Overrides `StateMachine.match()`.
+
+        Parameter `pattern`: `re` compiled regular expression.
+        """
+        return pattern.search(self.line)
+
+
+class SearchStateMachine(_SearchOverride, StateMachine):
+    """`StateMachine` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class SearchStateMachineWS(_SearchOverride, StateMachineWS):
+    """`StateMachineWS` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class ViewList:
+
+    """
+    List with extended functionality: slices of ViewList objects are child
+    lists, linked to their parents. Changes made to a child list also affect
+    the parent list.  A child list is effectively a "view" (in the SQL sense)
+    of the parent list.  Changes to parent lists, however, do *not* affect
+    active child lists.  If a parent list is changed, any active child lists
+    should be recreated.
+
+    The start and end of the slice can be trimmed using the `trim_start()` and
+    `trim_end()` methods, without affecting the parent list.  The link between
+    child and parent lists can be broken by calling `disconnect()` on the
+    child list.
+
+    Also, ViewList objects keep track of the source & offset of each item.
+    This information is accessible via the `source()`, `offset()`, and
+    `info()` methods.
+    """
+
+    def __init__(self, initlist=None, source=None, items=None,
+                 parent=None, parent_offset=None):
+        self.data = []
+        """The actual list of data, flattened from various sources."""
+
+        self.items = []
+        """A list of (source, offset) pairs, same length as `self.data`: the
+        source of each line and the offset of each line from the beginning of
+        its source."""
+
+        self.parent = parent
+        """The parent list."""
+
+        self.parent_offset = parent_offset
+        """Offset of this list from the beginning of the parent list."""
+
+        if isinstance(initlist, ViewList):
+            self.data = initlist.data[:]
+            self.items = initlist.items[:]
+        elif initlist is not None:
+            self.data = list(initlist)
+            if items:
+                self.items = items
+            else:
+                self.items = [(source, i) for i in range(len(initlist))]
+        assert len(self.data) == len(self.items), 'data mismatch'
+
+    def __str__(self):
+        return str(self.data)
+
+    def __repr__(self):
+        return '%s(%s, items=%s)' % (self.__class__.__name__,
+                                     self.data, self.items)
+
+    def __lt__(self, other): return self.data <  self.__cast(other)
+    def __le__(self, other): return self.data <= self.__cast(other)
+    def __eq__(self, other): return self.data == self.__cast(other)
+    def __ne__(self, other): return self.data != self.__cast(other)
+    def __gt__(self, other): return self.data >  self.__cast(other)
+    def __ge__(self, other): return self.data >= self.__cast(other)
+    def __cmp__(self, other): return cmp(self.data, self.__cast(other))
+
+    def __cast(self, other):
+        if isinstance(other, ViewList):
+            return other.data
+        else:
+            return other
+
+    def __contains__(self, item): return item in self.data
+    def __len__(self): return len(self.data)
+
+    # The __getitem__()/__setitem__() methods check whether the index
+    # is a slice first, since indexing a native list with a slice object
+    # just works.
+
+    def __getitem__(self, i):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1),  'cannot handle slice with stride'
+            return self.__class__(self.data[i.start:i.stop],
+                                  items=self.items[i.start:i.stop],
+                                  parent=self, parent_offset=i.start or 0)
+        else:
+            return self.data[i]
+
+    def __setitem__(self, i, item):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1), 'cannot handle slice with stride'
+            if not isinstance(item, ViewList):
+                raise TypeError('assigning non-ViewList to ViewList slice')
+            self.data[i.start:i.stop] = item.data
+            self.items[i.start:i.stop] = item.items
+            assert len(self.data) == len(self.items), 'data mismatch'
+            if self.parent:
+                self.parent[(i.start or 0) + self.parent_offset
+                            : (i.stop or len(self)) + self.parent_offset] = item
+        else:
+            self.data[i] = item
+            if self.parent:
+                self.parent[i + self.parent_offset] = item
+
+    def __delitem__(self, i):
+        try:
+            del self.data[i]
+            del self.items[i]
+            if self.parent:
+                del self.parent[i + self.parent_offset]
+        except TypeError:
+            assert i.step is None, 'cannot handle slice with stride'
+            del self.data[i.start:i.stop]
+            del self.items[i.start:i.stop]
+            if self.parent:
+                del self.parent[(i.start or 0) + self.parent_offset
+                                : (i.stop or len(self)) + self.parent_offset]
+
+    def __add__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(self.data + other.data,
+                                  items=(self.items + other.items))
+        else:
+            raise TypeError('adding non-ViewList to a ViewList')
+
+    def __radd__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(other.data + self.data,
+                                  items=(other.items + self.items))
+        else:
+            raise TypeError('adding ViewList to a non-ViewList')
+
+    def __iadd__(self, other):
+        if isinstance(other, ViewList):
+            self.data += other.data
+        else:
+            raise TypeError('argument to += must be a ViewList')
+        return self
+
+    def __mul__(self, n):
+        return self.__class__(self.data * n, items=(self.items * n))
+
+    __rmul__ = __mul__
+
+    def __imul__(self, n):
+        self.data *= n
+        self.items *= n
+        return self
+
+    def extend(self, other):
+        if not isinstance(other, ViewList):
+            raise TypeError('extending a ViewList with a non-ViewList')
+        if self.parent:
+            self.parent.insert(len(self.data) + self.parent_offset, other)
+        self.data.extend(other.data)
+        self.items.extend(other.items)
+
+    def append(self, item, source=None, offset=0):
+        if source is None:
+            self.extend(item)
+        else:
+            if self.parent:
+                self.parent.insert(len(self.data) + self.parent_offset, item,
+                                   source, offset)
+            self.data.append(item)
+            self.items.append((source, offset))
+
+    def insert(self, i, item, source=None, offset=0):
+        if source is None:
+            if not isinstance(item, ViewList):
+                raise TypeError('inserting non-ViewList with no source given')
+            self.data[i:i] = item.data
+            self.items[i:i] = item.items
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item)
+        else:
+            self.data.insert(i, item)
+            self.items.insert(i, (source, offset))
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item,
+                                   source, offset)
+
+    def pop(self, i=-1):
+        if self.parent:
+            index = (len(self.data) + i) % len(self.data)
+            self.parent.pop(index + self.parent_offset)
+        self.items.pop(i)
+        return self.data.pop(i)
+
+    def trim_start(self, n=1):
+        """
+        Remove items from the start of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[:n]
+        del self.items[:n]
+        if self.parent:
+            self.parent_offset += n
+
+    def trim_end(self, n=1):
+        """
+        Remove items from the end of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[-n:]
+        del self.items[-n:]
+
+    def remove(self, item):
+        index = self.index(item)
+        del self[index]
+
+    def count(self, item): return self.data.count(item)
+    def index(self, item): return self.data.index(item)
+
+    def reverse(self):
+        self.data.reverse()
+        self.items.reverse()
+        self.parent = None
+
+    def sort(self, *args):
+        tmp = zip(self.data, self.items)
+        tmp.sort(*args)
+        self.data = [entry[0] for entry in tmp]
+        self.items = [entry[1] for entry in tmp]
+        self.parent = None
+
+    def info(self, i):
+        """Return source & offset for index `i`."""
+        try:
+            return self.items[i]
+        except IndexError:
+            if i == len(self.data):     # Just past the end
+                return self.items[i - 1][0], None
+            else:
+                raise
+
+    def source(self, i):
+        """Return source for index `i`."""
+        return self.info(i)[0]
+
+    def offset(self, i):
+        """Return offset for index `i`."""
+        return self.info(i)[1]
+
+    def disconnect(self):
+        """Break link between this list and parent list."""
+        self.parent = None
+
+    def xitems(self):
+        """Return iterator yielding (source, offset, value) tuples."""
+        for (value, (source, offset)) in zip(self.data, self.items):
+            yield (source, offset, value)
+
+    def pprint(self):
+        """Print the list in `grep` format (`source:offset:value` lines)"""
+        for line in self.xitems():
+            print "%s:%d:%s" % line
+
+
+class StringList(ViewList):
+
+    """A `ViewList` with string-specific methods."""
+
+    def trim_left(self, length, start=0, end=sys.maxint):
+        """
+        Trim `length` characters off the beginning of each item, in-place,
+        from index `start` to `end`.  No whitespace-checking is done on the
+        trimmed text.  Does not affect slice parent.
+        """
+        self.data[start:end] = [line[length:]
+                                for line in self.data[start:end]]
+
+    def get_text_block(self, start, flush_left=False):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        end = start
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if not line.strip():
+                break
+            if flush_left and (line[0] == ' '):
+                source, offset = self.info(end)
+                raise UnexpectedIndentationError(self[start:end], source,
+                                                 offset + 1)
+            end += 1
+        return self[start:end]
+
+    def get_indented(self, start=0, until_blank=False, strip_indent=True,
+                     block_indent=None, first_indent=None):
+        """
+        Extract and return a StringList of indented lines of text.
+
+        Collect all lines with indentation, determine the minimum indentation,
+        remove the minimum indentation from all indented lines (unless
+        `strip_indent` is false), and return them. All lines up to but not
+        including the first unindented line will be returned.
+
+        :Parameters:
+          - `start`: The index of the first line to examine.
+          - `until_blank`: Stop collecting at the first blank line if true.
+          - `strip_indent`: Strip common leading indent if true (default).
+          - `block_indent`: The indent of the entire block, if known.
+          - `first_indent`: The indent of the first line, if known.
+
+        :Return:
+          - a StringList of indented lines with mininum indent removed;
+          - the amount of the indent;
+          - a boolean: did the indented block finish with a blank line or EOF?
+        """
+        indent = block_indent           # start with None if unknown
+        end = start
+        if block_indent is not None and first_indent is None:
+            first_indent = block_indent
+        if first_indent is not None:
+            end += 1
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if line and (line[0] != ' '
+                         or (block_indent is not None
+                             and line[:block_indent].strip())):
+                # Line not indented or insufficiently indented.
+                # Block finished properly iff the last indented line blank:
+                blank_finish = ((end > start)
+                                and not self.data[end - 1].strip())
+                break
+            stripped = line.lstrip()
+            if not stripped:            # blank line
+                if until_blank:
+                    blank_finish = 1
+                    break
+            elif block_indent is None:
+                line_indent = len(line) - len(stripped)
+                if indent is None:
+                    indent = line_indent
+                else:
+                    indent = min(indent, line_indent)
+            end += 1
+        else:
+            blank_finish = 1            # block ends at end of lines
+        block = self[start:end]
+        if first_indent is not None and block:
+            block.data[0] = block.data[0][first_indent:]
+        if indent and strip_indent:
+            block.trim_left(indent, start=(first_indent is not None))
+        return block, indent or 0, blank_finish
+
+    def get_2D_block(self, top, left, bottom, right, strip_indent=True):
+        block = self[top:bottom]
+        indent = right
+        for i in range(len(block.data)):
+            # get slice from line, care for combining characters
+            ci = utils.column_indices(block.data[i])
+            try:
+                left = ci[left]
+            except IndexError:
+                left += len(block.data[i]) - len(ci)
+            try:
+                right = ci[right]
+            except IndexError:
+                right += len(block.data[i]) - len(ci)
+            block.data[i] = line = block.data[i][left:right].rstrip()
+            if line:
+                indent = min(indent, len(line) - len(line.lstrip()))
+        if strip_indent and 0 < indent < right:
+            block.data = [line[indent:] for line in block.data]
+        return block
+
+    def pad_double_width(self, pad_char):
+        """
+        Pad all double-width characters in self by appending `pad_char` to each.
+        For East Asian language support.
+        """
+        if hasattr(unicodedata, 'east_asian_width'):
+            east_asian_width = unicodedata.east_asian_width
+        else:
+            return                      # new in Python 2.4
+        for i in range(len(self.data)):
+            line = self.data[i]
+            if isinstance(line, unicode):
+                new = []
+                for char in line:
+                    new.append(char)
+                    if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width
+                        new.append(pad_char)
+                self.data[i] = ''.join(new)
+
+    def replace(self, old, new):
+        """Replace all occurrences of substring `old` with `new`."""
+        for i in range(len(self.data)):
+            self.data[i] = self.data[i].replace(old, new)
+
+
+class StateMachineError(Exception): pass
+class UnknownStateError(StateMachineError): pass
+class DuplicateStateError(StateMachineError): pass
+class UnknownTransitionError(StateMachineError): pass
+class DuplicateTransitionError(StateMachineError): pass
+class TransitionPatternNotFound(StateMachineError): pass
+class TransitionMethodNotFound(StateMachineError): pass
+class UnexpectedIndentationError(StateMachineError): pass
+
+
+class TransitionCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another transition.
+
+    Raise with one argument, the new transition name.
+    """
+
+
+class StateCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another state.
+
+    Raise with one or two arguments: new state name, and an optional new
+    transition name.
+    """
+
+
+def string2lines(astring, tab_width=8, convert_whitespace=False,
+                 whitespace=re.compile('[\v\f]')):
+    """
+    Return a list of one-line strings with tabs expanded, no newlines, and
+    trailing whitespace stripped.
+
+    Each tab is expanded with between 1 and `tab_width` spaces, so that the
+    next character's index becomes a multiple of `tab_width` (8 by default).
+
+    Parameters:
+
+    - `astring`: a multi-line string.
+    - `tab_width`: the number of columns between tab stops.
+    - `convert_whitespace`: convert form feeds and vertical tabs to spaces?
+    """
+    if convert_whitespace:
+        astring = whitespace.sub(' ', astring)
+    return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]
+
+def _exception_data():
+    """
+    Return exception information:
+
+    - the exception's class name;
+    - the exception object;
+    - the name of the file containing the offending code;
+    - the line number of the offending code;
+    - the function name of the offending code.
+    """
+    type, value, traceback = sys.exc_info()
+    while traceback.tb_next:
+        traceback = traceback.tb_next
+    code = traceback.tb_frame.f_code
+    return (type.__name__, value, code.co_filename, traceback.tb_lineno,
+            code.co_name)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/io.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/io.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/io.py	(revision 1126)
@@ -0,0 +1,481 @@
+# $Id: io.py 7864 2015-04-12 09:57:05Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+I/O classes provide a uniform API for low-level input and output.  Subclasses
+exist for a variety of input/output mechanisms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import codecs
+from docutils import TransformSpec
+from docutils._compat import b
+from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput
+
+
+class InputError(IOError): pass
+class OutputError(IOError): pass
+
+def check_encoding(stream, encoding):
+    """Test, whether the encoding of `stream` matches `encoding`.
+
+    Returns
+
+    :None:  if `encoding` or `stream.encoding` are not a valid encoding
+            argument (e.g. ``None``) or `stream.encoding is missing.
+    :True:  if the encoding argument resolves to the same value as `encoding`,
+    :False: if the encodings differ.
+    """
+    try:
+        return codecs.lookup(stream.encoding) == codecs.lookup(encoding)
+    except (LookupError, AttributeError, TypeError):
+        return None
+
+
+class Input(TransformSpec):
+
+    """
+    Abstract base class for input wrappers.
+    """
+
+    component_type = 'input'
+
+    default_source_path = None
+
+    def __init__(self, source=None, source_path=None, encoding=None,
+                 error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the input source."""
+
+        self.error_handler = error_handler
+        """Text decoding error handler."""
+
+        self.source = source
+        """The source of input data."""
+
+        self.source_path = source_path
+        """A text reference to the source."""
+
+        if not source_path:
+            self.source_path = self.default_source_path
+
+        self.successful_encoding = None
+        """The encoding that successfully decoded the source data."""
+
+    def __repr__(self):
+        return '%s: source=%r, source_path=%r' % (self.__class__, self.source,
+                                                  self.source_path)
+
+    def read(self):
+        raise NotImplementedError
+
+    def decode(self, data):
+        """
+        Decode a string, `data`, heuristically.
+        Raise UnicodeError if unsuccessful.
+
+        The client application should call ``locale.setlocale`` at the
+        beginning of processing::
+
+            locale.setlocale(locale.LC_ALL, '')
+        """
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, unicode), (
+                'input encoding is "unicode" '
+                'but input is not a unicode object')
+        if isinstance(data, unicode):
+            # Accept unicode even if self.encoding != 'unicode'.
+            return data
+        if self.encoding:
+            # We believe the user/application when the encoding is
+            # explicitly given.
+            encodings = [self.encoding]
+        else:
+            data_encoding = self.determine_encoding_from_data(data)
+            if data_encoding:
+                # If the data declares its encoding (explicitly or via a BOM),
+                # we believe it.
+                encodings = [data_encoding]
+            else:
+                # Apply heuristics only if no encoding is explicitly given and
+                # no BOM found.  Start with UTF-8, because that only matches
+                # data that *IS* UTF-8:
+                encodings = ['utf-8', 'latin-1']
+                if locale_encoding:
+                    encodings.insert(1, locale_encoding)
+        for enc in encodings:
+            try:
+                decoded = unicode(data, enc, self.error_handler)
+                self.successful_encoding = enc
+                # Return decoded, removing BOMs.
+                return decoded.replace(u'\ufeff', u'')
+            except (UnicodeError, LookupError), err:
+                error = err # in Python 3, the <exception instance> is
+                            # local to the except clause
+        raise UnicodeError(
+            'Unable to decode input data.  Tried the following encodings: '
+            '%s.\n(%s)' % (', '.join([repr(enc) for enc in encodings]),
+                         ErrorString(error)))
+
+    coding_slug = re.compile(b("coding[:=]\s*([-\w.]+)"))
+    """Encoding declaration pattern."""
+
+    byte_order_marks = ((codecs.BOM_UTF8, 'utf-8'), # 'utf-8-sig' new in v2.5
+                        (codecs.BOM_UTF16_BE, 'utf-16-be'),
+                        (codecs.BOM_UTF16_LE, 'utf-16-le'),)
+    """Sequence of (start_bytes, encoding) tuples for encoding detection.
+    The first bytes of input data are checked against the start_bytes strings.
+    A match indicates the given encoding."""
+
+    def determine_encoding_from_data(self, data):
+        """
+        Try to determine the encoding of `data` by looking *in* `data`.
+        Check for a byte order mark (BOM) or an encoding declaration.
+        """
+        # check for a byte order mark:
+        for start_bytes, encoding in self.byte_order_marks:
+            if data.startswith(start_bytes):
+                return encoding
+        # check for an encoding declaration pattern in first 2 lines of file:
+        for line in data.splitlines()[:2]:
+            match = self.coding_slug.search(line)
+            if match:
+                return match.group(1).decode('ascii')
+        return None
+
+
+class Output(TransformSpec):
+
+    """
+    Abstract base class for output wrappers.
+    """
+
+    component_type = 'output'
+
+    default_destination_path = None
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the output destination."""
+
+        self.error_handler = error_handler or 'strict'
+        """Text encoding error handler."""
+
+        self.destination = destination
+        """The destination for output data."""
+
+        self.destination_path = destination_path
+        """A text reference to the destination."""
+
+        if not destination_path:
+            self.destination_path = self.default_destination_path
+
+    def __repr__(self):
+        return ('%s: destination=%r, destination_path=%r'
+                % (self.__class__, self.destination, self.destination_path))
+
+    def write(self, data):
+        """`data` is a Unicode string, to be encoded by `self.encode`."""
+        raise NotImplementedError
+
+    def encode(self, data):
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, unicode), (
+                'the encoding given is "unicode" but the output is not '
+                'a Unicode string')
+            return data
+        if not isinstance(data, unicode):
+            # Non-unicode (e.g. bytes) output.
+            return data
+        else:
+            return data.encode(self.encoding, self.error_handler)
+
+
+class FileInput(Input):
+
+    """
+    Input for single, simple file-like objects.
+    """
+    def __init__(self, source=None, source_path=None,
+                 encoding=None, error_handler='strict',
+                 autoclose=True, handle_io_errors=None, mode='rU'):
+        """
+        :Parameters:
+            - `source`: either a file-like object (which is read directly), or
+              `None` (which implies `sys.stdin` if no `source_path` given).
+            - `source_path`: a path to a file, which is opened and then read.
+            - `encoding`: the expected text encoding of the input file.
+            - `error_handler`: the encoding error handler to use.
+            - `autoclose`: close automatically after read (except when
+              `sys.stdin` is the source).
+            - `handle_io_errors`: ignored, deprecated, will be removed.
+            - `mode`: how the file is to be opened (see standard function
+              `open`). The default 'rU' provides universal newline support
+              for text files.
+        """
+        Input.__init__(self, source, source_path, encoding, error_handler)
+        self.autoclose = autoclose
+        self._stderr = ErrorOutput()
+
+        if source is None:
+            if source_path:
+                # Specify encoding in Python 3
+                if sys.version_info >= (3,0):
+                    kwargs = {'encoding': self.encoding,
+                              'errors': self.error_handler}
+                else:
+                    kwargs = {}
+
+                try:
+                    self.source = open(source_path, mode, **kwargs)
+                except IOError, error:
+                    raise InputError(error.errno, error.strerror, source_path)
+            else:
+                self.source = sys.stdin
+        elif (sys.version_info >= (3,0) and
+              check_encoding(self.source, self.encoding) is False):
+            # TODO: re-open, warn or raise error?
+            raise UnicodeError('Encoding clash: encoding given is "%s" '
+                               'but source is opened with encoding "%s".' %
+                               (self.encoding, self.source.encoding))
+        if not source_path:
+            try:
+                self.source_path = self.source.name
+            except AttributeError:
+                pass
+
+    def read(self):
+        """
+        Read and decode a single file and return the data (Unicode string).
+        """
+        try: # In Python < 2.5, try...except has to be nested in try...finally.
+            try:
+                if self.source is sys.stdin and sys.version_info >= (3,0):
+                    # read as binary data to circumvent auto-decoding
+                    data = self.source.buffer.read()
+                    # normalize newlines
+                    data = b('\n').join(data.splitlines()) + b('\n')
+                else:
+                    data = self.source.read()
+            except (UnicodeError, LookupError), err: # (in Py3k read() decodes)
+                if not self.encoding and self.source_path:
+                    # re-read in binary mode and decode with heuristics
+                    b_source = open(self.source_path, 'rb')
+                    data = b_source.read()
+                    b_source.close()
+                    # normalize newlines
+                    data = b('\n').join(data.splitlines()) + b('\n')
+                else:
+                    raise
+        finally:
+            if self.autoclose:
+                self.close()
+        return self.decode(data)
+
+    def readlines(self):
+        """
+        Return lines of a single file as list of Unicode strings.
+        """
+        return self.read().splitlines(True)
+
+    def close(self):
+        if self.source is not sys.stdin:
+            self.source.close()
+
+
+class FileOutput(Output):
+
+    """
+    Output for single, simple file-like objects.
+    """
+
+    mode = 'w'
+    """The mode argument for `open()`."""
+    # 'wb' for binary (e.g. OpenOffice) files (see also `BinaryFileOutput`).
+    # (Do not use binary mode ('wb') for text files, as this prevents the
+    # conversion of newlines to the system specific default.)
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict', autoclose=True,
+                 handle_io_errors=None, mode=None):
+        """
+        :Parameters:
+            - `destination`: either a file-like object (which is written
+              directly) or `None` (which implies `sys.stdout` if no
+              `destination_path` given).
+            - `destination_path`: a path to a file, which is opened and then
+              written.
+            - `encoding`: the text encoding of the output file.
+            - `error_handler`: the encoding error handler to use.
+            - `autoclose`: close automatically after write (except when
+              `sys.stdout` or `sys.stderr` is the destination).
+            - `handle_io_errors`: ignored, deprecated, will be removed.
+            - `mode`: how the file is to be opened (see standard function
+              `open`). The default is 'w', providing universal newline
+              support for text files.
+        """
+        Output.__init__(self, destination, destination_path,
+                        encoding, error_handler)
+        self.opened = True
+        self.autoclose = autoclose
+        if mode is not None:
+            self.mode = mode
+        self._stderr = ErrorOutput()
+        if destination is None:
+            if destination_path:
+                self.opened = False
+            else:
+                self.destination = sys.stdout
+        elif (# destination is file-type object -> check mode:
+              mode and hasattr(self.destination, 'mode')
+              and mode != self.destination.mode):
+                print >>self._stderr, ('Warning: Destination mode "%s" '
+                               'differs from specified mode "%s"' %
+                               (self.destination.mode, mode))
+        if not destination_path:
+            try:
+                self.destination_path = self.destination.name
+            except AttributeError:
+                pass
+
+    def open(self):
+        # Specify encoding in Python 3.
+        if sys.version_info >= (3,0) and 'b' not in self.mode:
+            kwargs = {'encoding': self.encoding,
+                      'errors': self.error_handler}
+        else:
+            kwargs = {}
+        try:
+            self.destination = open(self.destination_path, self.mode, **kwargs)
+        except IOError, error:
+            raise OutputError(error.errno, error.strerror,
+                              self.destination_path)
+        self.opened = True
+
+    def write(self, data):
+        """Encode `data`, write it to a single file, and return it.
+
+        With Python 3 or binary output mode, `data` is returned unchanged,
+        except when specified encoding and output encoding differ.
+        """
+        if not self.opened:
+            self.open()
+        if ('b' not in self.mode and sys.version_info < (3,0)
+            or check_encoding(self.destination, self.encoding) is False
+           ):
+            data = self.encode(data)
+            if sys.version_info >= (3,0) and os.linesep != '\n':
+                data = data.replace(b('\n'), b(os.linesep)) # fix endings
+
+        try: # In Python < 2.5, try...except has to be nested in try...finally.
+            try:
+                self.destination.write(data)
+            except TypeError, e:
+                if sys.version_info >= (3,0) and isinstance(data, bytes):
+                    try:
+                        self.destination.buffer.write(data)
+                    except AttributeError:
+                        if check_encoding(self.destination, 
+                                          self.encoding) is False:
+                            raise ValueError('Encoding of %s (%s) differs \n'
+                                '  from specified encoding (%s)' %
+                                (self.destination_path or 'destination',
+                                self.destination.encoding, self.encoding))
+                        else:
+                            raise e
+            except (UnicodeError, LookupError), err:
+                raise UnicodeError(
+                    'Unable to encode output data. output-encoding is: '
+                    '%s.\n(%s)' % (self.encoding, ErrorString(err)))
+        finally:
+            if self.autoclose:
+                self.close()
+        return data
+
+    def close(self):
+        if self.destination not in (sys.stdout, sys.stderr):
+            self.destination.close()
+            self.opened = False
+
+
+class BinaryFileOutput(FileOutput):
+    """
+    A version of docutils.io.FileOutput which writes to a binary file.
+    """
+    # Used by core.publish_cmdline_to_binary() which in turn is used by
+    # rst2odt (OpenOffice writer)
+    mode = 'wb'
+
+
+class StringInput(Input):
+
+    """
+    Direct string input.
+    """
+
+    default_source_path = '<string>'
+
+    def read(self):
+        """Decode and return the source string."""
+        return self.decode(self.source)
+
+
+class StringOutput(Output):
+
+    """
+    Direct string output.
+    """
+
+    default_destination_path = '<string>'
+
+    def write(self, data):
+        """Encode `data`, store it in `self.destination`, and return it."""
+        self.destination = self.encode(data)
+        return self.destination
+
+
+class NullInput(Input):
+
+    """
+    Degenerate input: read nothing.
+    """
+
+    default_source_path = 'null input'
+
+    def read(self):
+        """Return a null string."""
+        return u''
+
+
+class NullOutput(Output):
+
+    """
+    Degenerate output: write nothing.
+    """
+
+    default_destination_path = 'null output'
+
+    def write(self, data):
+        """Do nothing ([don't even] send data to the bit bucket)."""
+        pass
+
+
+class DocTreeInput(Input):
+
+    """
+    Adapter for document tree input.
+
+    The document tree must be passed in the ``source`` parameter.
+    """
+
+    default_source_path = 'doctree input'
+
+    def read(self):
+        """Return the document tree."""
+        return self.source
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/components.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/components.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/components.py	(revision 1126)
@@ -0,0 +1,52 @@
+# $Id: components.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils component-related transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+
+
+class Filter(Transform):
+
+    """
+    Include or exclude elements which depend on a specific Docutils component.
+
+    For use with `nodes.pending` elements.  A "pending" element's dictionary
+    attribute ``details`` must contain the keys "component" and "format".  The
+    value of ``details['component']`` must match the type name of the
+    component the elements depend on (e.g. "writer").  The value of
+    ``details['format']`` is the name of a specific format or context of that
+    component (e.g. "html").  If the matching Docutils component supports that
+    format or context, the "pending" element is replaced by the contents of
+    ``details['nodes']`` (a list of nodes); otherwise, the "pending" element
+    is removed.
+
+    For example, the reStructuredText "meta" directive creates a "pending"
+    element containing a "meta" element (in ``pending.details['nodes']``).
+    Only writers (``pending.details['component'] == 'writer'``) supporting the
+    "html" format (``pending.details['format'] == 'html'``) will include the
+    "meta" element; it will be deleted from the output of all other writers.
+    """
+
+    default_priority = 780
+
+    def apply(self):
+        pending = self.startnode
+        component_type = pending.details['component'] # 'reader' or 'writer'
+        format = pending.details['format']
+        component = self.document.transformer.components[component_type]
+        if component.supports(format):
+            pending.replace_self(pending.details['nodes'])
+        else:
+            pending.parent.remove(pending)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/frontmatter.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/frontmatter.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/frontmatter.py	(revision 1126)
@@ -0,0 +1,530 @@
+# $Id: frontmatter.py 7897 2015-05-29 11:48:20Z milde $
+# Author: David Goodger, Ueli Schlaepfer <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to the front matter of a document or a section
+(information found before the main text):
+
+- `DocTitle`: Used to transform a lone top level section's title to
+  the document title, promote a remaining lone top-level section's
+  title to the document subtitle, and determine the document's title
+  metadata (document['title']) based on the document title and/or the
+  "title" setting.
+
+- `SectionSubTitle`: Used to transform a lone subsection into a
+  subtitle.
+
+- `DocInfo`: Used to transform a bibliographic field list into docinfo
+  elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class TitlePromoter(Transform):
+
+    """
+    Abstract base class for DocTitle and SectionSubTitle transforms.
+    """
+
+    def promote_title(self, node):
+        """
+        Transform the following tree::
+
+            <node>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                ...
+
+        `node` is normally a document.
+        """
+        # Type check
+        if not isinstance(node, nodes.Element):
+            raise TypeError, 'node must be of Element-derived type.'
+
+        # `node` must not have a title yet.
+        assert not (len(node) and isinstance(node[0], nodes.title))
+        section, index = self.candidate_index(node)
+        if index is None:
+            return None
+
+        # Transfer the section's attributes to the node:
+        # NOTE: Change second parameter to False to NOT replace
+        #       attributes that already exist in node with those in
+        #       section
+        # NOTE: Remove third parameter to NOT copy the 'source'
+        #       attribute from section
+        node.update_all_atts_concatenating(section, True, True)
+
+        # setup_child is called automatically for all nodes.
+        node[:] = (section[:1]        # section title
+                   + node[:index]     # everything that was in the
+                                      # node before the section
+                   + section[1:])     # everything that was in the section
+        assert isinstance(node[0], nodes.title)
+        return 1
+
+    def promote_subtitle(self, node):
+        """
+        Transform the following node tree::
+
+            <node>
+                <title>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                <subtitle>
+                ...
+        """
+        # Type check
+        if not isinstance(node, nodes.Element):
+            raise TypeError, 'node must be of Element-derived type.'
+
+        subsection, index = self.candidate_index(node)
+        if index is None:
+            return None
+        subtitle = nodes.subtitle()
+
+        # Transfer the subsection's attributes to the new subtitle
+        # NOTE: Change second parameter to False to NOT replace
+        #       attributes that already exist in node with those in
+        #       section
+        # NOTE: Remove third parameter to NOT copy the 'source'
+        #       attribute from section
+        subtitle.update_all_atts_concatenating(subsection, True, True)
+
+        # Transfer the contents of the subsection's title to the
+        # subtitle:
+        subtitle[:] = subsection[0][:]
+        node[:] = (node[:1]       # title
+                   + [subtitle]
+                   # everything that was before the section:
+                   + node[1:index]
+                   # everything that was in the subsection:
+                   + subsection[1:])
+        return 1
+
+    def candidate_index(self, node):
+        """
+        Find and return the promotion candidate and its index.
+
+        Return (None, None) if no valid candidate was found.
+        """
+        index = node.first_child_not_matching_class(
+            nodes.PreBibliographic)
+        if index is None or len(node) > (index + 1) or \
+               not isinstance(node[index], nodes.section):
+            return None, None
+        else:
+            return node[index], index
+
+
+class DocTitle(TitlePromoter):
+
+    """
+    In reStructuredText_, there is no way to specify a document title
+    and subtitle explicitly. Instead, we can supply the document title
+    (and possibly the subtitle as well) implicitly, and use this
+    two-step transform to "raise" or "promote" the title(s) (and their
+    corresponding section contents) to the document level.
+
+    1. If the document contains a single top-level section as its
+       first non-comment element, the top-level section's title
+       becomes the document's title, and the top-level section's
+       contents become the document's immediate contents. The lone
+       top-level section header must be the first non-comment element
+       in the document.
+
+       For example, take this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           A paragraph.
+
+       Once parsed, it looks like this::
+
+           <document>
+               <section names="top-level title">
+                   <title>
+                       Top-Level Title
+                   <paragraph>
+                       A paragraph.
+
+       After running the DocTitle transform, we have::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <paragraph>
+                   A paragraph.
+
+    2. If step 1 successfully determines the document title, we
+       continue by checking for a subtitle.
+
+       If the lone top-level section itself contains a single
+       second-level section as its first non-comment element, that
+       section's title is promoted to the document's subtitle, and
+       that section's contents become the document's immediate
+       contents. Given this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           Second-Level Title
+           ~~~~~~~~~~~~~~~~~~
+
+           A paragraph.
+
+       After parsing and running the Section Promotion transform, the
+       result is::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <subtitle names="second-level title">
+                   Second-Level Title
+               <paragraph>
+                   A paragraph.
+
+       (Note that the implicit hyperlink target generated by the
+       "Second-Level Title" is preserved on the "subtitle" element
+       itself.)
+
+    Any comment elements occurring before the document title or
+    subtitle are accumulated and inserted as the first body elements
+    after the title(s).
+
+    This transform also sets the document's metadata title
+    (document['title']).
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    """
+
+    default_priority = 320
+
+    def set_metadata(self):
+        """
+        Set document['title'] metadata title from the following
+        sources, listed in order of priority:
+
+        * Existing document['title'] attribute.
+        * "title" setting.
+        * Document title node (as promoted by promote_title).
+        """
+        if not self.document.hasattr('title'):
+            if self.document.settings.title is not None:
+                self.document['title'] = self.document.settings.title
+            elif len(self.document) and isinstance(self.document[0], nodes.title):
+                self.document['title'] = self.document[0].astext()
+
+    def apply(self):
+        if getattr(self.document.settings, 'doctitle_xform', 1):
+            # promote_(sub)title defined in TitlePromoter base class.
+            if self.promote_title(self.document):
+                # If a title has been promoted, also try to promote a
+                # subtitle.
+                self.promote_subtitle(self.document)
+        # Set document['title'].
+        self.set_metadata()
+
+
+class SectionSubTitle(TitlePromoter):
+
+    """
+    This works like document subtitles, but for sections.  For example, ::
+
+        <section>
+            <title>
+                Title
+            <section>
+                <title>
+                    Subtitle
+                ...
+
+    is transformed into ::
+
+        <section>
+            <title>
+                Title
+            <subtitle>
+                Subtitle
+            ...
+
+    For details refer to the docstring of DocTitle.
+    """
+
+    default_priority = 350
+
+    def apply(self):
+        if not getattr(self.document.settings, 'sectsubtitle_xform', 1):
+            return
+        for section in self.document.traverse(nodes.section):
+            # On our way through the node tree, we are deleting
+            # sections, but we call self.promote_subtitle for those
+            # sections nonetheless.  To do: Write a test case which
+            # shows the problem and discuss on Docutils-develop.
+            self.promote_subtitle(section)
+
+
+class DocInfo(Transform):
+
+    """
+    This transform is specific to the reStructuredText_ markup syntax;
+    see "Bibliographic Fields" in the `reStructuredText Markup
+    Specification`_ for a high-level description. This transform
+    should be run *after* the `DocTitle` transform.
+
+    Given a field list as the first non-comment element after the
+    document title and subtitle (if present), registered bibliographic
+    field names are transformed to the corresponding DTD elements,
+    becoming child elements of the "docinfo" element (except for a
+    dedication and/or an abstract, which become "topic" elements after
+    "docinfo").
+
+    For example, given this document fragment after parsing::
+
+        <document>
+            <title>
+                Document Title
+            <field_list>
+                <field>
+                    <field_name>
+                        Author
+                    <field_body>
+                        <paragraph>
+                            A. Name
+                <field>
+                    <field_name>
+                        Status
+                    <field_body>
+                        <paragraph>
+                            $RCSfile$
+            ...
+
+    After running the bibliographic field list transform, the
+    resulting document tree would look like this::
+
+        <document>
+            <title>
+                Document Title
+            <docinfo>
+                <author>
+                    A. Name
+                <status>
+                    frontmatter.py
+            ...
+
+    The "Status" field contained an expanded RCS keyword, which is
+    normally (but optionally) cleaned up by the transform. The sole
+    contents of the field body must be a paragraph containing an
+    expanded RCS keyword of the form "$keyword: expansion text $". Any
+    RCS keyword can be processed in any bibliographic field. The
+    dollar signs and leading RCS keyword name are removed. Extra
+    processing is done for the following RCS keywords:
+
+    - "RCSfile" expands to the name of the file in the RCS or CVS
+      repository, which is the name of the source file with a ",v"
+      suffix appended. The transform will remove the ",v" suffix.
+
+    - "Date" expands to the format "YYYY/MM/DD hh:mm:ss" (in the UTC
+      time zone). The RCS Keywords transform will extract just the
+      date itself and transform it to an ISO 8601 format date, as in
+      "2000-12-31".
+
+      (Since the source file for this text is itself stored under CVS,
+      we can't show an example of the "Date" RCS keyword because we
+      can't prevent any RCS keywords used in this explanation from
+      being expanded. Only the "RCSfile" keyword is stable; its
+      expansion text changes only if the file name changes.)
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    .. _reStructuredText Markup Specification:
+       http://docutils.sf.net/docs/ref/rst/restructuredtext.html
+    """
+
+    default_priority = 340
+
+    biblio_nodes = {
+          'author': nodes.author,
+          'authors': nodes.authors,
+          'organization': nodes.organization,
+          'address': nodes.address,
+          'contact': nodes.contact,
+          'version': nodes.version,
+          'revision': nodes.revision,
+          'status': nodes.status,
+          'date': nodes.date,
+          'copyright': nodes.copyright,
+          'dedication': nodes.topic,
+          'abstract': nodes.topic}
+    """Canonical field name (lowcased) to node class name mapping for
+    bibliographic fields (field_list)."""
+
+    def apply(self):
+        if not getattr(self.document.settings, 'docinfo_xform', 1):
+            return
+        document = self.document
+        index = document.first_child_not_matching_class(
+              nodes.PreBibliographic)
+        if index is None:
+            return
+        candidate = document[index]
+        if isinstance(candidate, nodes.field_list):
+            biblioindex = document.first_child_not_matching_class(
+                  (nodes.Titular, nodes.Decorative))
+            nodelist = self.extract_bibliographic(candidate)
+            del document[index]         # untransformed field list (candidate)
+            document[biblioindex:biblioindex] = nodelist
+
+    def extract_bibliographic(self, field_list):
+        docinfo = nodes.docinfo()
+        bibliofields = self.language.bibliographic_fields
+        labels = self.language.labels
+        topics = {'dedication': None, 'abstract': None}
+        for field in field_list:
+            try:
+                name = field[0][0].astext()
+                normedname = nodes.make_id(name)
+                if not (len(field) == 2 and normedname in bibliofields
+                        and self.check_empty_biblio_field(field, name)):
+                    raise TransformError
+                canonical = bibliofields[normedname]
+                biblioclass = self.biblio_nodes[canonical]
+                if issubclass(biblioclass, nodes.TextElement):
+                    if not self.check_compound_biblio_field(field, name):
+                        raise TransformError
+                    utils.clean_rcs_keywords(
+                          field[1][0], self.rcs_keyword_substitutions)
+                    docinfo.append(biblioclass('', '', *field[1][0]))
+                elif issubclass(biblioclass, nodes.authors):
+                    self.extract_authors(field, name, docinfo)
+                elif issubclass(biblioclass, nodes.topic):
+                    if topics[canonical]:
+                        field[-1] += self.document.reporter.warning(
+                            'There can only be one "%s" field.' % name,
+                            base_node=field)
+                        raise TransformError
+                    title = nodes.title(name, labels[canonical])
+                    topics[canonical] = biblioclass(
+                        '', title, classes=[canonical], *field[1].children)
+                else:
+                    docinfo.append(biblioclass('', *field[1].children))
+            except TransformError:
+                if len(field[-1]) == 1 \
+                       and isinstance(field[-1][0], nodes.paragraph):
+                    utils.clean_rcs_keywords(
+                        field[-1][0], self.rcs_keyword_substitutions)
+                if normedname and normedname not in bibliofields:
+                    field['classes'].append(normedname)
+                docinfo.append(field)
+        nodelist = []
+        if len(docinfo) != 0:
+            nodelist.append(docinfo)
+        for name in ('dedication', 'abstract'):
+            if topics[name]:
+                nodelist.append(topics[name])
+        return nodelist
+
+    def check_empty_biblio_field(self, field, name):
+        if len(field[-1]) < 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract empty bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    def check_compound_biblio_field(self, field, name):
+        if len(field[-1]) > 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract compound bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        if not isinstance(field[-1][0], nodes.paragraph):
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract bibliographic field "%s" containing '
+                  'anything other than a single paragraph.' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    rcs_keyword_substitutions = [
+          (re.compile(r'\$' r'Date: (\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T][\d:]+'
+                      r'[^$]* \$', re.IGNORECASE), r'\1-\2-\3'),
+          (re.compile(r'\$' r'RCSfile: (.+),v \$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$'), r'\1'),]
+
+    def extract_authors(self, field, name, docinfo):
+        try:
+            if len(field[1]) == 1:
+                if isinstance(field[1][0], nodes.paragraph):
+                    authors = self.authors_from_one_paragraph(field)
+                elif isinstance(field[1][0], nodes.bullet_list):
+                    authors = self.authors_from_bullet_list(field)
+                else:
+                    raise TransformError
+            else:
+                authors = self.authors_from_paragraphs(field)
+            authornodes = [nodes.author('', '', *author)
+                           for author in authors if author]
+            if len(authornodes) >= 1:
+                docinfo.append(nodes.authors('', *authornodes))
+            else:
+                raise TransformError
+        except TransformError:
+            field[-1] += self.document.reporter.warning(
+                  'Bibliographic field "%s" incompatible with extraction: '
+                  'it must contain either a single paragraph (with authors '
+                  'separated by one of "%s"), multiple paragraphs (one per '
+                  'author), or a bullet list with one paragraph (one author) '
+                  'per item.'
+                  % (name, ''.join(self.language.author_separators)),
+                  base_node=field)
+            raise
+
+    def authors_from_one_paragraph(self, field):
+        text = field[1][0].astext().strip()
+        if not text:
+            raise TransformError
+        for authorsep in self.language.author_separators:
+            authornames = text.split(authorsep)
+            if len(authornames) > 1:
+                break
+        authornames = [author.strip() for author in authornames]
+        authors = [[nodes.Text(author)] for author in authornames if author]
+        return authors
+
+    def authors_from_bullet_list(self, field):
+        authors = []
+        for item in field[1][0]:
+            if len(item) != 1 or not isinstance(item[0], nodes.paragraph):
+                raise TransformError
+            authors.append(item[0].children)
+        if not authors:
+            raise TransformError
+        return authors
+
+    def authors_from_paragraphs(self, field):
+        for item in field[1]:
+            if not isinstance(item, nodes.paragraph):
+                raise TransformError
+        authors = [item.children for item in field[1]]
+        return authors
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/peps.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/peps.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/peps.py	(revision 1126)
@@ -0,0 +1,305 @@
+# $Id: peps.py 7773 2014-10-08 15:08:29Z grubert $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for PEP processing.
+
+- `Headers`: Used to transform a PEP's initial RFC-2822 header.  It remains a
+  field list, but some entries get processed.
+- `Contents`: Auto-inserts a table of contents.
+- `PEPZero`: Special processing for PEP 0.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils, languages
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+from docutils.transforms import parts, references, misc
+
+
+class Headers(Transform):
+
+    """
+    Process fields in a PEP's initial RFC-2822 header.
+    """
+
+    default_priority = 360
+
+    pep_url = 'pep-%04d'
+    pep_cvs_url = ('http://hg.python.org'
+                   '/peps/file/default/pep-%04d.txt')
+    rcs_keyword_substitutions = (
+          (re.compile(r'\$' r'RCSfile: (.+),v \$$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$$'), r'\1'),)
+
+    def apply(self):
+        if not len(self.document):
+            # @@@ replace these DataErrors with proper system messages
+            raise DataError('Document tree is empty.')
+        header = self.document[0]
+        if not isinstance(header, nodes.field_list) or \
+              'rfc2822' not in header['classes']:
+            raise DataError('Document does not begin with an RFC-2822 '
+                            'header; it is not a PEP.')
+        pep = None
+        for field in header:
+            if field[0].astext().lower() == 'pep': # should be the first field
+                value = field[1].astext()
+                try:
+                    pep = int(value)
+                    cvs_url = self.pep_cvs_url % pep
+                except ValueError:
+                    pep = value
+                    cvs_url = None
+                    msg = self.document.reporter.warning(
+                        '"PEP" header must contain an integer; "%s" is an '
+                        'invalid value.' % pep, base_node=field)
+                    msgid = self.document.set_id(msg)
+                    prb = nodes.problematic(value, value or '(none)',
+                                            refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    if len(field[1]):
+                        field[1][0][:] = [prb]
+                    else:
+                        field[1] += nodes.paragraph('', '', prb)
+                break
+        if pep is None:
+            raise DataError('Document does not contain an RFC-2822 "PEP" '
+                            'header.')
+        if pep == 0:
+            # Special processing for PEP 0.
+            pending = nodes.pending(PEPZero)
+            self.document.insert(1, pending)
+            self.document.note_pending(pending)
+        if len(header) < 2 or header[1][0].astext().lower() != 'title':
+            raise DataError('No title!')
+        for field in header:
+            name = field[0].astext().lower()
+            body = field[1]
+            if len(body) > 1:
+                raise DataError('PEP header field body contains multiple '
+                                'elements:\n%s' % field.pformat(level=1))
+            elif len(body) == 1:
+                if not isinstance(body[0], nodes.paragraph):
+                    raise DataError('PEP header field body may only contain '
+                                    'a single paragraph:\n%s'
+                                    % field.pformat(level=1))
+            elif name == 'last-modified':
+                date = time.strftime(
+                      '%d-%b-%Y',
+                      time.localtime(os.stat(self.document['source'])[8]))
+                if cvs_url:
+                    body += nodes.paragraph(
+                        '', '', nodes.reference('', date, refuri=cvs_url))
+            else:
+                # empty
+                continue
+            para = body[0]
+            if name == 'author':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node))
+            elif name == 'discussions-to':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node, pep))
+            elif name in ('replaces', 'replaced-by', 'requires'):
+                newbody = []
+                space = nodes.Text(' ')
+                for refpep in re.split(',?\s+', body.astext()):
+                    pepno = int(refpep)
+                    newbody.append(nodes.reference(
+                        refpep, refpep,
+                        refuri=(self.document.settings.pep_base_url
+                                + self.pep_url % pepno)))
+                    newbody.append(space)
+                para[:] = newbody[:-1] # drop trailing space
+            elif name == 'last-modified':
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+                if cvs_url:
+                    date = para.astext()
+                    para[:] = [nodes.reference('', date, refuri=cvs_url)]
+            elif name == 'content-type':
+                pep_type = para.astext()
+                uri = self.document.settings.pep_base_url + self.pep_url % 12
+                para[:] = [nodes.reference('', pep_type, refuri=uri)]
+            elif name == 'version' and len(body):
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+
+
+class Contents(Transform):
+
+    """
+    Insert an empty table of contents topic and a transform placeholder into
+    the document after the RFC 2822 header.
+    """
+
+    default_priority = 380
+
+    def apply(self):
+        language = languages.get_language(self.document.settings.language_code,
+                                          self.document.reporter)
+        name = language.labels['contents']
+        title = nodes.title('', name)
+        topic = nodes.topic('', title, classes=['contents'])
+        name = nodes.fully_normalize_name(name)
+        if not self.document.has_name(name):
+            topic['names'].append(name)
+        self.document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents)
+        topic += pending
+        self.document.insert(1, topic)
+        self.document.note_pending(pending)
+
+
+class TargetNotes(Transform):
+
+    """
+    Locate the "References" section, insert a placeholder for an external
+    target footnote insertion transform at the end, and schedule the
+    transform to run immediately.
+    """
+
+    default_priority = 520
+
+    def apply(self):
+        doc = self.document
+        i = len(doc) - 1
+        refsect = copyright = None
+        while i >= 0 and isinstance(doc[i], nodes.section):
+            title_words = doc[i][0].astext().lower().split()
+            if 'references' in title_words:
+                refsect = doc[i]
+                break
+            elif 'copyright' in title_words:
+                copyright = i
+            i -= 1
+        if not refsect:
+            refsect = nodes.section()
+            refsect += nodes.title('', 'References')
+            doc.set_id(refsect)
+            if copyright:
+                # Put the new "References" section before "Copyright":
+                doc.insert(copyright, refsect)
+            else:
+                # Put the new "References" section at end of doc:
+                doc.append(refsect)
+        pending = nodes.pending(references.TargetNotes)
+        refsect.append(pending)
+        self.document.note_pending(pending, 0)
+        pending = nodes.pending(misc.CallBack,
+                                details={'callback': self.cleanup_callback})
+        refsect.append(pending)
+        self.document.note_pending(pending, 1)
+
+    def cleanup_callback(self, pending):
+        """
+        Remove an empty "References" section.
+
+        Called after the `references.TargetNotes` transform is complete.
+        """
+        if len(pending.parent) == 2:    # <title> and <pending>
+            pending.parent.parent.remove(pending.parent)
+
+
+class PEPZero(Transform):
+
+    """
+    Special processing for PEP 0.
+    """
+
+    default_priority =760
+
+    def apply(self):
+        visitor = PEPZeroSpecial(self.document)
+        self.document.walk(visitor)
+        self.startnode.parent.remove(self.startnode)
+
+
+class PEPZeroSpecial(nodes.SparseNodeVisitor):
+
+    """
+    Perform the special processing needed by PEP 0:
+
+    - Mask email addresses.
+
+    - Link PEP numbers in the second column of 4-column tables to the PEPs
+      themselves.
+    """
+
+    pep_url = Headers.pep_url
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        node.replace_self(mask_email(node))
+
+    def visit_field_list(self, node):
+        if 'rfc2822' in node['classes']:
+            raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        self.pep_table = node['cols'] == 4
+        self.entry = 0
+
+    def visit_colspec(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2:
+            node['classes'].append('num')
+
+    def visit_row(self, node):
+        self.entry = 0
+
+    def visit_entry(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2 and len(node) == 1:
+            node['classes'].append('num')
+            p = node[0]
+            if isinstance(p, nodes.paragraph) and len(p) == 1:
+                text = p.astext()
+                try:
+                    pep = int(text)
+                    ref = (self.document.settings.pep_base_url
+                           + self.pep_url % pep)
+                    p[0] = nodes.reference(text, text, refuri=ref)
+                except ValueError:
+                    pass
+
+
+non_masked_addresses = ('peps@python.org',
+                        'python-list@python.org',
+                        'python-dev@python.org')
+
+def mask_email(ref, pepno=None):
+    """
+    Mask the email address in `ref` and return a replacement node.
+
+    `ref` is returned unchanged if it contains no email address.
+
+    For email addresses such as "user@host", mask the address as "user at
+    host" (text) to thwart simple email address harvesters (except for those
+    listed in `non_masked_addresses`).  If a PEP number (`pepno`) is given,
+    return a reference including a default email subject.
+    """
+    if ref.hasattr('refuri') and ref['refuri'].startswith('mailto:'):
+        if ref['refuri'][8:] in non_masked_addresses:
+            replacement = ref[0]
+        else:
+            replacement_text = ref.astext().replace('@', '&#32;&#97;t&#32;')
+            replacement = nodes.raw('', replacement_text, format='html')
+        if pepno is None:
+            return replacement
+        else:
+            ref['refuri'] += '?subject=PEP%%20%s' % pepno
+            ref[:] = [replacement]
+            return ref
+    else:
+        return ref
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/universal.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/universal.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/universal.py	(revision 1126)
@@ -0,0 +1,296 @@
+# $Id: universal.py 7957 2016-07-28 20:59:14Z milde $
+# -*- coding: utf-8 -*-
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Günter Milde
+# Maintainer: docutils-develop@lists.sourceforge.net
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms needed by most or all documents:
+
+- `Decorations`: Generate a document's header & footer.
+- `Messages`: Placement of system messages stored in
+  `nodes.document.transform_messages`.
+- `TestMessages`: Like `Messages`, used on test runs.
+- `FinalReferences`: Resolve remaining references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import sys
+import time
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+from docutils.utils import smartquotes
+
+class Decorations(Transform):
+
+    """
+    Populate a document's decoration element (header, footer).
+    """
+
+    default_priority = 820
+
+    def apply(self):
+        header_nodes = self.generate_header()
+        if header_nodes:
+            decoration = self.document.get_decoration()
+            header = decoration.get_header()
+            header.extend(header_nodes)
+        footer_nodes = self.generate_footer()
+        if footer_nodes:
+            decoration = self.document.get_decoration()
+            footer = decoration.get_footer()
+            footer.extend(footer_nodes)
+
+    def generate_header(self):
+        return None
+
+    def generate_footer(self):
+        # @@@ Text is hard-coded for now.
+        # Should be made dynamic (language-dependent).
+        # @@@ Use timestamp from the `SOURCE_DATE_EPOCH`_ environment variable
+        # for the datestamp?
+        # See https://sourceforge.net/p/docutils/patches/132/
+        # and https://reproducible-builds.org/specs/source-date-epoch/
+        settings = self.document.settings
+        if settings.generator or settings.datestamp or settings.source_link \
+               or settings.source_url:
+            text = []
+            if settings.source_link and settings._source \
+                   or settings.source_url:
+                if settings.source_url:
+                    source = settings.source_url
+                else:
+                    source = utils.relative_path(settings._destination,
+                                                 settings._source)
+                text.extend([
+                    nodes.reference('', 'View document source',
+                                    refuri=source),
+                    nodes.Text('.\n')])
+            if settings.datestamp:
+                datestamp = time.strftime(settings.datestamp, time.gmtime())
+                text.append(nodes.Text('Generated on: ' + datestamp + '.\n'))
+            if settings.generator:
+                text.extend([
+                    nodes.Text('Generated by '),
+                    nodes.reference('', 'Docutils', refuri=
+                                    'http://docutils.sourceforge.net/'),
+                    nodes.Text(' from '),
+                    nodes.reference('', 'reStructuredText', refuri='http://'
+                                    'docutils.sourceforge.net/rst.html'),
+                    nodes.Text(' source.\n')])
+            return [nodes.paragraph('', '', *text)]
+        else:
+            return None
+
+
+class ExposeInternals(Transform):
+
+    """
+    Expose internal attributes if ``expose_internals`` setting is set.
+    """
+
+    default_priority = 840
+
+    def not_Text(self, node):
+        return not isinstance(node, nodes.Text)
+
+    def apply(self):
+        if self.document.settings.expose_internals:
+            for node in self.document.traverse(self.not_Text):
+                for att in self.document.settings.expose_internals:
+                    value = getattr(node, att, None)
+                    if value is not None:
+                        node['internal:' + att] = value
+
+
+class Messages(Transform):
+
+    """
+    Place any system messages generated after parsing into a dedicated section
+    of the document.
+    """
+
+    default_priority = 860
+
+    def apply(self):
+        unfiltered = self.document.transform_messages
+        threshold = self.document.reporter.report_level
+        messages = []
+        for msg in unfiltered:
+            if msg['level'] >= threshold and not msg.parent:
+                messages.append(msg)
+        if messages:
+            section = nodes.section(classes=['system-messages'])
+            # @@@ get this from the language module?
+            section += nodes.title('', 'Docutils System Messages')
+            section += messages
+            self.document.transform_messages[:] = []
+            self.document += section
+
+
+class FilterMessages(Transform):
+
+    """
+    Remove system messages below verbosity threshold.
+    """
+
+    default_priority = 870
+
+    def apply(self):
+        for node in self.document.traverse(nodes.system_message):
+            if node['level'] < self.document.reporter.report_level:
+                node.parent.remove(node)
+
+
+class TestMessages(Transform):
+
+    """
+    Append all post-parse system messages to the end of the document.
+
+    Used for testing purposes.
+    """
+
+    default_priority = 880
+
+    def apply(self):
+        for msg in self.document.transform_messages:
+            if not msg.parent:
+                self.document += msg
+
+
+class StripComments(Transform):
+
+    """
+    Remove comment elements from the document tree (only if the
+    ``strip_comments`` setting is enabled).
+    """
+
+    default_priority = 740
+
+    def apply(self):
+        if self.document.settings.strip_comments:
+            for node in self.document.traverse(nodes.comment):
+                node.parent.remove(node)
+
+
+class StripClassesAndElements(Transform):
+
+    """
+    Remove from the document tree all elements with classes in
+    `self.document.settings.strip_elements_with_classes` and all "classes"
+    attribute values in `self.document.settings.strip_classes`.
+    """
+
+    default_priority = 420
+
+    def apply(self):
+        if not (self.document.settings.strip_elements_with_classes
+                or self.document.settings.strip_classes):
+            return
+        # prepare dicts for lookup (not sets, for Python 2.2 compatibility):
+        self.strip_elements = dict(
+            [(key, None)
+             for key in (self.document.settings.strip_elements_with_classes
+                         or [])])
+        self.strip_classes = dict(
+            [(key, None) for key in (self.document.settings.strip_classes
+                                     or [])])
+        for node in self.document.traverse(self.check_classes):
+            node.parent.remove(node)
+
+    def check_classes(self, node):
+        if isinstance(node, nodes.Element):
+            for class_value in node['classes'][:]:
+                if class_value in self.strip_classes:
+                    node['classes'].remove(class_value)
+                if class_value in self.strip_elements:
+                    return 1
+
+class SmartQuotes(Transform):
+
+    """
+    Replace ASCII quotation marks with typographic form.
+
+    Also replace multiple dashes with em-dash/en-dash characters.
+    """
+
+    default_priority = 850
+
+    def __init__(self, document, startnode):
+        Transform.__init__(self, document, startnode=startnode)
+        self.unsupported_languages = set()
+
+    def get_tokens(self, txtnodes):
+        # A generator that yields ``(texttype, nodetext)`` tuples for a list
+        # of "Text" nodes (interface to ``smartquotes.educate_tokens()``).
+
+        texttype = {True: 'literal', # "literal" text is not changed:
+                    False: 'plain'}
+        for txtnode in txtnodes:
+            nodetype = texttype[isinstance(txtnode.parent,
+                                           (nodes.literal,
+                                            nodes.math,
+                                            nodes.image,
+                                            nodes.raw,
+                                            nodes.problematic))]
+            yield (nodetype, txtnode.astext())
+
+
+    def apply(self):
+        smart_quotes = self.document.settings.smart_quotes
+        if not smart_quotes:
+            return
+        try:
+            alternative = smart_quotes.startswith('alt')
+        except AttributeError:
+            alternative = False
+        # print repr(alternative)
+
+        document_language = self.document.settings.language_code
+
+        # "Educate" quotes in normal text. Handle each block of text
+        # (TextElement node) as a unit to keep context around inline nodes:
+        for node in self.document.traverse(nodes.TextElement):
+            # skip preformatted text blocks and special elements:
+            if isinstance(node, (nodes.FixedTextElement, nodes.Special)):
+                continue
+            # nested TextElements are not "block-level" elements:
+            if isinstance(node.parent, nodes.TextElement):
+                continue
+
+            # list of text nodes in the "text block":
+            txtnodes = [txtnode for txtnode in node.traverse(nodes.Text)
+                        if not isinstance(txtnode.parent,
+                                          nodes.option_string)]
+
+            # language: use typographical quotes for language "lang"
+            lang = node.get_language_code(document_language)
+            # use alternative form if `smart-quotes` setting starts with "alt":
+            if alternative:
+                if '-x-altquot' in lang:
+                    lang = lang.replace('-x-altquot', '')
+                else:
+                    lang += '-x-altquot'
+            # drop subtags missing in quotes:
+            for tag in utils.normalize_language_tag(lang):
+                if tag in smartquotes.smartchars.quotes:
+                    lang = tag
+                    break
+            else: # language not supported: (keep ASCII quotes)
+                if lang not in self.unsupported_languages:
+                    self.document.reporter.warning('No smart quotes '
+                        'defined for language "%s".'%lang, base_node=node)
+                self.unsupported_languages.add(lang)
+                lang = ''
+
+            # Iterator educating quotes in plain text:
+            # '2': set all, using old school en- and em- dash shortcuts
+            teacher = smartquotes.educate_tokens(self.get_tokens(txtnodes),
+                                                 attr='2', language=lang)
+
+            for txtnode, newtext in zip(txtnodes, teacher):
+                txtnode.parent.replace(txtnode, nodes.Text(newtext))
+
+            self.unsupported_languages = set() # reset
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/parts.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/parts.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/parts.py	(revision 1126)
@@ -0,0 +1,180 @@
+# $Id: parts.py 6073 2009-08-06 12:21:10Z milde $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class SectNum(Transform):
+
+    """
+    Automatically assigns numbers to the titles of document sections.
+
+    It is possible to limit the maximum section level for which the numbers
+    are added.  For those sections that are auto-numbered, the "autonum"
+    attribute is set, informing the contents table generator that a different
+    form of the TOC should be used.
+    """
+
+    default_priority = 710
+    """Should be applied before `Contents`."""
+
+    def apply(self):
+        self.maxdepth = self.startnode.details.get('depth', None)
+        self.startvalue = self.startnode.details.get('start', 1)
+        self.prefix = self.startnode.details.get('prefix', '')
+        self.suffix = self.startnode.details.get('suffix', '')
+        self.startnode.parent.remove(self.startnode)
+        if self.document.settings.sectnum_xform:
+            if self.maxdepth is None:
+                self.maxdepth = sys.maxint
+            self.update_section_numbers(self.document)
+        else: # store details for eventual section numbering by the writer
+            self.document.settings.sectnum_depth = self.maxdepth
+            self.document.settings.sectnum_start = self.startvalue
+            self.document.settings.sectnum_prefix = self.prefix
+            self.document.settings.sectnum_suffix = self.suffix
+
+    def update_section_numbers(self, node, prefix=(), depth=0):
+        depth += 1
+        if prefix:
+            sectnum = 1
+        else:
+            sectnum = self.startvalue
+        for child in node:
+            if isinstance(child, nodes.section):
+                numbers = prefix + (str(sectnum),)
+                title = child[0]
+                # Use &nbsp; for spacing:
+                generated = nodes.generated(
+                    '', (self.prefix + '.'.join(numbers) + self.suffix
+                         +  u'\u00a0' * 3),
+                    classes=['sectnum'])
+                title.insert(0, generated)
+                title['auto'] = 1
+                if depth < self.maxdepth:
+                    self.update_section_numbers(child, numbers, depth)
+                sectnum += 1
+
+
+class Contents(Transform):
+
+    """
+    This transform generates a table of contents from the entire document tree
+    or from a single branch.  It locates "section" elements and builds them
+    into a nested bullet list, which is placed within a "topic" created by the
+    contents directive.  A title is either explicitly specified, taken from
+    the appropriate language module, or omitted (local table of contents).
+    The depth may be specified.  Two-way references between the table of
+    contents and section titles are generated (requires Writer support).
+
+    This transform requires a startnode, which contains generation
+    options and provides the location for the generated table of contents (the
+    startnode is replaced by the table of contents "topic").
+    """
+
+    default_priority = 720
+
+    def apply(self):
+        try: # let the writer (or output software) build the contents list?
+            toc_by_writer = self.document.settings.use_latex_toc
+        except AttributeError:
+            toc_by_writer = False
+        details = self.startnode.details
+        if 'local' in details:
+            startnode = self.startnode.parent.parent
+            while not (isinstance(startnode, nodes.section)
+                       or isinstance(startnode, nodes.document)):
+                # find the ToC root: a direct ancestor of startnode
+                startnode = startnode.parent
+        else:
+            startnode = self.document
+        self.toc_id = self.startnode.parent['ids'][0]
+        if 'backlinks' in details:
+            self.backlinks = details['backlinks']
+        else:
+            self.backlinks = self.document.settings.toc_backlinks
+        if toc_by_writer:
+            # move customization settings to the parent node
+            self.startnode.parent.attributes.update(details)
+            self.startnode.parent.remove(self.startnode)
+        else:
+            contents = self.build_contents(startnode)
+            if len(contents):
+                self.startnode.replace_self(contents)
+            else:
+                self.startnode.parent.parent.remove(self.startnode.parent)
+
+    def build_contents(self, node, level=0):
+        level += 1
+        sections = [sect for sect in node if isinstance(sect, nodes.section)]
+        entries = []
+        autonum = 0
+        depth = self.startnode.details.get('depth', sys.maxint)
+        for section in sections:
+            title = section[0]
+            auto = title.get('auto')    # May be set by SectNum.
+            entrytext = self.copy_and_filter(title)
+            reference = nodes.reference('', '', refid=section['ids'][0],
+                                        *entrytext)
+            ref_id = self.document.set_id(reference)
+            entry = nodes.paragraph('', '', reference)
+            item = nodes.list_item('', entry)
+            if ( self.backlinks in ('entry', 'top')
+                 and title.next_node(nodes.reference) is None):
+                if self.backlinks == 'entry':
+                    title['refid'] = ref_id
+                elif self.backlinks == 'top':
+                    title['refid'] = self.toc_id
+            if level < depth:
+                subsects = self.build_contents(section, level)
+                item += subsects
+            entries.append(item)
+        if entries:
+            contents = nodes.bullet_list('', *entries)
+            if auto:
+                contents['classes'].append('auto-toc')
+            return contents
+        else:
+            return []
+
+    def copy_and_filter(self, node):
+        """Return a copy of a title, with references, images, etc. removed."""
+        visitor = ContentsFilter(self.document)
+        node.walkabout(visitor)
+        return visitor.get_entry_text()
+
+
+class ContentsFilter(nodes.TreeCopyVisitor):
+
+    def get_entry_text(self):
+        return self.get_tree_copy().children
+
+    def visit_citation_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        if node.hasattr('alt'):
+            self.parent.append(nodes.Text(node['alt']))
+        raise nodes.SkipNode
+
+    def ignore_node_but_process_children(self, node):
+        raise nodes.SkipDeparture
+
+    visit_interpreted = ignore_node_but_process_children
+    visit_problematic = ignore_node_but_process_children
+    visit_reference = ignore_node_but_process_children
+    visit_target = ignore_node_but_process_children
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/writer_aux.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/writer_aux.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/writer_aux.py	(revision 1126)
@@ -0,0 +1,88 @@
+# $Id: writer_aux.py 7808 2015-02-27 17:03:32Z milde $
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Auxiliary transforms mainly to be used by Writer components.
+
+This module is called "writer_aux" because otherwise there would be
+conflicting imports like this one::
+
+    from docutils import writers
+    from docutils.transforms import writers
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils, languages
+from docutils.transforms import Transform
+
+
+class Compound(Transform):
+
+    """
+    Flatten all compound paragraphs.  For example, transform ::
+
+        <compound>
+            <paragraph>
+            <literal_block>
+            <paragraph>
+
+    into ::
+
+        <paragraph>
+        <literal_block classes="continued">
+        <paragraph classes="continued">
+    """
+
+    default_priority = 910
+
+    def apply(self):
+        for compound in self.document.traverse(nodes.compound):
+            first_child = True
+            for child in compound:
+                if first_child:
+                    if not isinstance(child, nodes.Invisible):
+                        first_child = False
+                else:
+                    child['classes'].append('continued')
+            # Substitute children for compound.
+            compound.replace_self(compound[:])
+
+
+class Admonitions(Transform):
+
+    """
+    Transform specific admonitions, like this:
+
+        <note>
+            <paragraph>
+                 Note contents ...
+
+    into generic admonitions, like this::
+
+        <admonition classes="note">
+            <title>
+                Note
+            <paragraph>
+                Note contents ...
+
+    The admonition title is localized.
+    """
+
+    default_priority = 920
+
+    def apply(self):
+        language = languages.get_language(self.document.settings.language_code,
+                                          self.document.reporter)
+        for node in self.document.traverse(nodes.Admonition):
+            node_name = node.__class__.__name__
+            # Set class, so that we know what node this admonition came from.
+            node['classes'].append(node_name)
+            if not isinstance(node, nodes.admonition):
+                # Specific admonition.  Transform into a generic admonition.
+                admonition = nodes.admonition(node.rawsource, *node.children,
+                                              **node.attributes)
+                title = nodes.title('', language.labels[node_name])
+                admonition.insert(0, title)
+                node.replace_self(admonition)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/misc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/misc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/misc.py	(revision 1126)
@@ -0,0 +1,144 @@
+# $Id: misc.py 6314 2010-04-26 10:04:17Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import Transform, TransformError
+
+
+class CallBack(Transform):
+
+    """
+    Inserts a callback into a document.  The callback is called when the
+    transform is applied, which is determined by its priority.
+
+    For use with `nodes.pending` elements.  Requires a ``details['callback']``
+    entry, a bound method or function which takes one parameter: the pending
+    node.  Other data can be stored in the ``details`` attribute or in the
+    object hosting the callback method.
+    """
+
+    default_priority = 990
+
+    def apply(self):
+        pending = self.startnode
+        pending.details['callback'](pending)
+        pending.parent.remove(pending)
+
+
+class ClassAttribute(Transform):
+
+    """
+    Move the "class" attribute specified in the "pending" node into the
+    immediately following non-comment element.
+    """
+
+    default_priority = 210
+
+    def apply(self):
+        pending = self.startnode
+        parent = pending.parent
+        child = pending
+        while parent:
+            # Check for appropriate following siblings:
+            for index in range(parent.index(child) + 1, len(parent)):
+                element = parent[index]
+                if (isinstance(element, nodes.Invisible) or
+                    isinstance(element, nodes.system_message)):
+                    continue
+                element['classes'] += pending.details['class']
+                pending.parent.remove(pending)
+                return
+            else:
+                # At end of section or container; apply to sibling
+                child = parent
+                parent = parent.parent
+        error = self.document.reporter.error(
+            'No suitable element following "%s" directive'
+            % pending.details['directive'],
+            nodes.literal_block(pending.rawsource, pending.rawsource),
+            line=pending.line)
+        pending.replace_self(error)
+
+
+class Transitions(Transform):
+
+    """
+    Move transitions at the end of sections up the tree.  Complain
+    on transitions after a title, at the beginning or end of the
+    document, and after another transition.
+
+    For example, transform this::
+
+        <section>
+            ...
+            <transition>
+        <section>
+            ...
+
+    into this::
+
+        <section>
+            ...
+        <transition>
+        <section>
+            ...
+    """
+
+    default_priority = 830
+
+    def apply(self):
+        for node in self.document.traverse(nodes.transition):
+            self.visit_transition(node)
+
+    def visit_transition(self, node):
+        index = node.parent.index(node)
+        error = None
+        if (index == 0 or
+            isinstance(node.parent[0], nodes.title) and
+            (index == 1 or
+             isinstance(node.parent[1], nodes.subtitle) and
+             index == 2)):
+            assert (isinstance(node.parent, nodes.document) or
+                    isinstance(node.parent, nodes.section))
+            error = self.document.reporter.error(
+                'Document or section may not begin with a transition.',
+                source=node.source, line=node.line)
+        elif isinstance(node.parent[index - 1], nodes.transition):
+            error = self.document.reporter.error(
+                'At least one body element must separate transitions; '
+                'adjacent transitions are not allowed.',
+                source=node.source, line=node.line)
+        if error:
+            # Insert before node and update index.
+            node.parent.insert(index, error)
+            index += 1
+        assert index < len(node.parent)
+        if index != len(node.parent) - 1:
+            # No need to move the node.
+            return
+        # Node behind which the transition is to be moved.
+        sibling = node
+        # While sibling is the last node of its parent.
+        while index == len(sibling.parent) - 1:
+            sibling = sibling.parent
+            # If sibling is the whole document (i.e. it has no parent).
+            if sibling.parent is None:
+                # Transition at the end of document.  Do not move the
+                # transition up, and place an error behind.
+                error = self.document.reporter.error(
+                    'Document may not end with a transition.',
+                    line=node.line)
+                node.parent.insert(node.parent.index(node) + 1, error)
+                return
+            index = sibling.parent.index(sibling)
+        # Remove the original transition node.
+        node.parent.remove(node)
+        # Insert the transition after the sibling.
+        sibling.parent.insert(index + 1, node)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/__init__.py	(revision 1126)
@@ -0,0 +1,172 @@
+# $Id: __init__.py 6433 2010-09-28 08:21:25Z milde $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains modules for standard tree transforms available
+to Docutils components. Tree transforms serve a variety of purposes:
+
+- To tie up certain syntax-specific "loose ends" that remain after the
+  initial parsing of the input plaintext. These transforms are used to
+  supplement a limited syntax.
+
+- To automate the internal linking of the document tree (hyperlink
+  references, footnote references, etc.).
+
+- To extract useful information from the document tree. These
+  transforms may be used to construct (for example) indexes and tables
+  of contents.
+
+Each transform is an optional step that a Docutils component may
+choose to perform on the parsed document.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import languages, ApplicationError, TransformSpec
+
+
+class TransformError(ApplicationError): pass
+
+
+class Transform:
+
+    """
+    Docutils transform component abstract base class.
+    """
+
+    default_priority = None
+    """Numerical priority of this transform, 0 through 999 (override)."""
+
+    def __init__(self, document, startnode=None):
+        """
+        Initial setup for in-place document transforms.
+        """
+
+        self.document = document
+        """The document tree to transform."""
+
+        self.startnode = startnode
+        """Node from which to begin the transform.  For many transforms which
+        apply to the document as a whole, `startnode` is not set (i.e. its
+        value is `None`)."""
+
+        self.language = languages.get_language(
+            document.settings.language_code, document.reporter)
+        """Language module local to this document."""
+
+    def apply(self, **kwargs):
+        """Override to apply the transform to the document tree."""
+        raise NotImplementedError('subclass must override this method')
+
+
+class Transformer(TransformSpec):
+
+    """
+    Stores transforms (`Transform` classes) and applies them to document
+    trees.  Also keeps track of components by component type name.
+    """
+
+    def __init__(self, document):
+        self.transforms = []
+        """List of transforms to apply.  Each item is a 3-tuple:
+        ``(priority string, transform class, pending node or None)``."""
+
+        self.unknown_reference_resolvers = []
+        """List of hook functions which assist in resolving references"""
+
+        self.document = document
+        """The `nodes.document` object this Transformer is attached to."""
+
+        self.applied = []
+        """Transforms already applied, in order."""
+
+        self.sorted = 0
+        """Boolean: is `self.tranforms` sorted?"""
+
+        self.components = {}
+        """Mapping of component type name to component object.  Set by
+        `self.populate_from_components()`."""
+
+        self.serialno = 0
+        """Internal serial number to keep track of the add order of
+        transforms."""
+
+    def add_transform(self, transform_class, priority=None, **kwargs):
+        """
+        Store a single transform.  Use `priority` to override the default.
+        `kwargs` is a dictionary whose contents are passed as keyword
+        arguments to the `apply` method of the transform.  This can be used to
+        pass application-specific data to the transform instance.
+        """
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, None, kwargs))
+        self.sorted = 0
+
+    def add_transforms(self, transform_list):
+        """Store multiple transforms, with default priorities."""
+        for transform_class in transform_list:
+            priority_string = self.get_priority_string(
+                transform_class.default_priority)
+            self.transforms.append(
+                (priority_string, transform_class, None, {}))
+        self.sorted = 0
+
+    def add_pending(self, pending, priority=None):
+        """Store a transform with an associated `pending` node."""
+        transform_class = pending.transform
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, pending, {}))
+        self.sorted = 0
+
+    def get_priority_string(self, priority):
+        """
+        Return a string, `priority` combined with `self.serialno`.
+
+        This ensures FIFO order on transforms with identical priority.
+        """
+        self.serialno += 1
+        return '%03d-%03d' % (priority, self.serialno)
+
+    def populate_from_components(self, components):
+        """
+        Store each component's default transforms, with default priorities.
+        Also, store components by type name in a mapping for later lookup.
+        """
+        for component in components:
+            if component is None:
+                continue
+            self.add_transforms(component.get_transforms())
+            self.components[component.component_type] = component
+        self.sorted = 0
+        # Set up all of the reference resolvers for this transformer. Each
+        # component of this transformer is able to register its own helper
+        # functions to help resolve references.
+        unknown_reference_resolvers = []
+        for i in components:
+            unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
+        decorated_list = [(f.priority, f) for f in unknown_reference_resolvers]
+        decorated_list.sort()
+        self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
+
+    def apply_transforms(self):
+        """Apply all of the stored transforms, in priority order."""
+        self.document.reporter.attach_observer(
+            self.document.note_transform_message)
+        while self.transforms:
+            if not self.sorted:
+                # Unsorted initially, and whenever a transform is added.
+                self.transforms.sort()
+                self.transforms.reverse()
+                self.sorted = 1
+            priority, transform_class, pending, kwargs = self.transforms.pop()
+            transform = transform_class(self.document, startnode=pending)
+            transform.apply(**kwargs)
+            self.applied.append((priority, transform_class, pending, kwargs))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/references.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/references.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/transforms/references.py	(revision 1126)
@@ -0,0 +1,905 @@
+# $Id: references.py 7624 2013-03-07 14:10:26Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for resolving references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class PropagateTargets(Transform):
+
+    """
+    Propagate empty internal targets to the next element.
+
+    Given the following nodes::
+
+        <target ids="internal1" names="internal1">
+        <target anonymous="1" ids="id1">
+        <target ids="internal2" names="internal2">
+        <paragraph>
+            This is a test.
+
+    PropagateTargets propagates the ids and names of the internal
+    targets preceding the paragraph to the paragraph itself::
+
+        <target refid="internal1">
+        <target anonymous="1" refid="id1">
+        <target refid="internal2">
+        <paragraph ids="internal2 id1 internal1" names="internal2 internal1">
+            This is a test.
+    """
+
+    default_priority = 260
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            # Only block-level targets without reference (like ".. target:"):
+            if (isinstance(target.parent, nodes.TextElement) or
+                (target.hasattr('refid') or target.hasattr('refuri') or
+                 target.hasattr('refname'))):
+                continue
+            assert len(target) == 0, 'error: block-level target has children'
+            next_node = target.next_node(ascend=True)
+            # Do not move names and ids into Invisibles (we'd lose the
+            # attributes) or different Targetables (e.g. footnotes).
+            if (next_node is not None and
+                ((not isinstance(next_node, nodes.Invisible) and
+                  not isinstance(next_node, nodes.Targetable)) or
+                 isinstance(next_node, nodes.target))):
+                next_node['ids'].extend(target['ids'])
+                next_node['names'].extend(target['names'])
+                # Set defaults for next_node.expect_referenced_by_name/id.
+                if not hasattr(next_node, 'expect_referenced_by_name'):
+                    next_node.expect_referenced_by_name = {}
+                if not hasattr(next_node, 'expect_referenced_by_id'):
+                    next_node.expect_referenced_by_id = {}
+                for id in target['ids']:
+                    # Update IDs to node mapping.
+                    self.document.ids[id] = next_node
+                    # If next_node is referenced by id ``id``, this
+                    # target shall be marked as referenced.
+                    next_node.expect_referenced_by_id[id] = target
+                for name in target['names']:
+                    next_node.expect_referenced_by_name[name] = target
+                # If there are any expect_referenced_by_... attributes
+                # in target set, copy them to next_node.
+                next_node.expect_referenced_by_name.update(
+                    getattr(target, 'expect_referenced_by_name', {}))
+                next_node.expect_referenced_by_id.update(
+                    getattr(target, 'expect_referenced_by_id', {}))
+                # Set refid to point to the first former ID of target
+                # which is now an ID of next_node.
+                target['refid'] = target['ids'][0]
+                # Clear ids and names; they have been moved to
+                # next_node.
+                target['ids'] = []
+                target['names'] = []
+                self.document.note_refid(target)
+
+
+class AnonymousHyperlinks(Transform):
+
+    """
+    Link anonymous references to targets.  Given::
+
+        <paragraph>
+            <reference anonymous="1">
+                internal
+            <reference anonymous="1">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+
+    Corresponding references are linked via "refid" or resolved via "refuri"::
+
+        <paragraph>
+            <reference anonymous="1" refid="id1">
+                text
+            <reference anonymous="1" refuri="http://external">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+    """
+
+    default_priority = 440
+
+    def apply(self):
+        anonymous_refs = []
+        anonymous_targets = []
+        for node in self.document.traverse(nodes.reference):
+            if node.get('anonymous'):
+                anonymous_refs.append(node)
+        for node in self.document.traverse(nodes.target):
+            if node.get('anonymous'):
+                anonymous_targets.append(node)
+        if len(anonymous_refs) \
+              != len(anonymous_targets):
+            msg = self.document.reporter.error(
+                  'Anonymous hyperlink mismatch: %s references but %s '
+                  'targets.\nSee "backrefs" attribute for IDs.'
+                  % (len(anonymous_refs), len(anonymous_targets)))
+            msgid = self.document.set_id(msg)
+            for ref in anonymous_refs:
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            return
+        for ref, target in zip(anonymous_refs, anonymous_targets):
+            target.referenced = 1
+            while True:
+                if target.hasattr('refuri'):
+                    ref['refuri'] = target['refuri']
+                    ref.resolved = 1
+                    break
+                else:
+                    if not target['ids']:
+                        # Propagated target.
+                        target = self.document.ids[target['refid']]
+                        continue
+                    ref['refid'] = target['ids'][0]
+                    self.document.note_refid(ref)
+                    break
+
+
+class IndirectHyperlinks(Transform):
+
+    """
+    a) Indirect external references::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refname="direct external">
+
+       The "refuri" attribute is migrated back to all indirect targets
+       from the final direct target (i.e. a target not referring to
+       another indirect target)::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refuri="http://indirect">
+
+       Once the attribute is migrated, the preexisting "refname" attribute
+       is dropped.
+
+    b) Indirect internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refname="indirect internal">
+                   indirect internal
+           <target id="id2" name="indirect internal 2"
+               refname="final target">
+           <target id="id3" name="indirect internal"
+               refname="indirect internal 2">
+
+       Targets which indirectly refer to an internal target become one-hop
+       indirect (their "refid" attributes are directly set to the internal
+       target's "id"). References which indirectly refer to an internal
+       target become direct internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refid="id1">
+                   indirect internal
+           <target id="id2" name="indirect internal 2" refid="id1">
+           <target id="id3" name="indirect internal" refid="id1">
+    """
+
+    default_priority = 460
+
+    def apply(self):
+        for target in self.document.indirect_targets:
+            if not target.resolved:
+                self.resolve_indirect_target(target)
+            self.resolve_indirect_references(target)
+
+    def resolve_indirect_target(self, target):
+        refname = target.get('refname')
+        if refname is None:
+            reftarget_id = target['refid']
+        else:
+            reftarget_id = self.document.nameids.get(refname)
+            if not reftarget_id:
+                # Check the unknown_reference_resolvers
+                for resolver_function in \
+                        self.document.transformer.unknown_reference_resolvers:
+                    if resolver_function(target):
+                        break
+                else:
+                    self.nonexistent_indirect_target(target)
+                return
+        reftarget = self.document.ids[reftarget_id]
+        reftarget.note_referenced_by(id=reftarget_id)
+        if isinstance(reftarget, nodes.target) \
+               and not reftarget.resolved and reftarget.hasattr('refname'):
+            if hasattr(target, 'multiply_indirect'):
+                #and target.multiply_indirect):
+                #del target.multiply_indirect
+                self.circular_indirect_reference(target)
+                return
+            target.multiply_indirect = 1
+            self.resolve_indirect_target(reftarget) # multiply indirect
+            del target.multiply_indirect
+        if reftarget.hasattr('refuri'):
+            target['refuri'] = reftarget['refuri']
+            if 'refid' in target:
+                del target['refid']
+        elif reftarget.hasattr('refid'):
+            target['refid'] = reftarget['refid']
+            self.document.note_refid(target)
+        else:
+            if reftarget['ids']:
+                target['refid'] = reftarget_id
+                self.document.note_refid(target)
+            else:
+                self.nonexistent_indirect_target(target)
+                return
+        if refname is not None:
+            del target['refname']
+        target.resolved = 1
+
+    def nonexistent_indirect_target(self, target):
+        if target['refname'] in self.document.nameids:
+            self.indirect_target_error(target, 'which is a duplicate, and '
+                                       'cannot be used as a unique reference')
+        else:
+            self.indirect_target_error(target, 'which does not exist')
+
+    def circular_indirect_reference(self, target):
+        self.indirect_target_error(target, 'forming a circular reference')
+
+    def indirect_target_error(self, target, explanation):
+        naming = ''
+        reflist = []
+        if target['names']:
+            naming = '"%s" ' % target['names'][0]
+        for name in target['names']:
+            reflist.extend(self.document.refnames.get(name, []))
+        for id in target['ids']:
+            reflist.extend(self.document.refids.get(id, []))
+        if target['ids']:
+            naming += '(id="%s")' % target['ids'][0]
+        msg = self.document.reporter.error(
+              'Indirect hyperlink target %s refers to target "%s", %s.'
+              % (naming, target['refname'], explanation), base_node=target)
+        msgid = self.document.set_id(msg)
+        for ref in utils.uniq(reflist):
+            prb = nodes.problematic(
+                  ref.rawsource, ref.rawsource, refid=msgid)
+            prbid = self.document.set_id(prb)
+            msg.add_backref(prbid)
+            ref.replace_self(prb)
+        target.resolved = 1
+
+    def resolve_indirect_references(self, target):
+        if target.hasattr('refid'):
+            attname = 'refid'
+            call_method = self.document.note_refid
+        elif target.hasattr('refuri'):
+            attname = 'refuri'
+            call_method = None
+        else:
+            return
+        attval = target[attname]
+        for name in target['names']:
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+        for id in target['ids']:
+            reflist = self.document.refids.get(id, [])
+            if reflist:
+                target.note_referenced_by(id=id)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refid']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+
+
+class ExternalTargets(Transform):
+
+    """
+    Given::
+
+        <paragraph>
+            <reference refname="direct external">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+
+    The "refname" attribute is replaced by the direct "refuri" attribute::
+
+        <paragraph>
+            <reference refuri="http://direct">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+    """
+
+    default_priority = 640
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if target.hasattr('refuri'):
+                refuri = target['refuri']
+                for name in target['names']:
+                    reflist = self.document.refnames.get(name, [])
+                    if reflist:
+                        target.note_referenced_by(name=name)
+                    for ref in reflist:
+                        if ref.resolved:
+                            continue
+                        del ref['refname']
+                        ref['refuri'] = refuri
+                        ref.resolved = 1
+
+
+class InternalTargets(Transform):
+
+    default_priority = 660
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if not target.hasattr('refuri') and not target.hasattr('refid'):
+                self.resolve_reference_ids(target)
+
+    def resolve_reference_ids(self, target):
+        """
+        Given::
+
+            <paragraph>
+                <reference refname="direct internal">
+                    direct internal
+            <target id="id1" name="direct internal">
+
+        The "refname" attribute is replaced by "refid" linking to the target's
+        "id"::
+
+            <paragraph>
+                <reference refid="id1">
+                    direct internal
+            <target id="id1" name="direct internal">
+        """
+        for name in target['names']:
+            refid = self.document.nameids.get(name)
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                if refid:
+                    del ref['refname']
+                    ref['refid'] = refid
+                ref.resolved = 1
+
+
+class Footnotes(Transform):
+
+    """
+    Assign numbers to autonumbered footnotes, and resolve links to footnotes,
+    citations, and their references.
+
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refname="footnote">
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2">
+            <footnote auto="1" id="id3">
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote">
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Auto-numbered footnotes have attribute ``auto="1"`` and no label.
+    Auto-numbered footnote_references have no reference text (they're
+    empty elements). When resolving the numbering, a ``label`` element
+    is added to the beginning of the ``footnote``, and reference text
+    to the ``footnote_reference``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refid="footnote">
+                    2
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2" refid="id3">
+                    1
+            <footnote auto="1" id="id3" backrefs="id2">
+                <label>
+                    1
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote" backrefs="id1">
+                <label>
+                    2
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Note that the footnotes are not in the same order as the references.
+
+    The labels and reference text are added to the auto-numbered ``footnote``
+    and ``footnote_reference`` elements.  Footnote elements are backlinked to
+    their references via "refids" attributes.  References are assigned "id"
+    and "refid" attributes.
+
+    After adding labels and reference text, the "auto" attributes can be
+    ignored.
+    """
+
+    default_priority = 620
+
+    autofootnote_labels = None
+    """Keep track of unlabeled autonumbered footnotes."""
+
+    symbols = [
+          # Entries 1-4 and 6 below are from section 12.51 of
+          # The Chicago Manual of Style, 14th edition.
+          '*',                          # asterisk/star
+          u'\u2020',                    # dagger &dagger;
+          u'\u2021',                    # double dagger &Dagger;
+          u'\u00A7',                    # section mark &sect;
+          u'\u00B6',                    # paragraph mark (pilcrow) &para;
+                                        # (parallels ['||'] in CMoS)
+          '#',                          # number sign
+          # The entries below were chosen arbitrarily.
+          u'\u2660',                    # spade suit &spades;
+          u'\u2665',                    # heart suit &hearts;
+          u'\u2666',                    # diamond suit &diams;
+          u'\u2663',                    # club suit &clubs;
+          ]
+
+    def apply(self):
+        self.autofootnote_labels = []
+        startnum = self.document.autofootnote_start
+        self.document.autofootnote_start = self.number_footnotes(startnum)
+        self.number_footnote_references(startnum)
+        self.symbolize_footnotes()
+        self.resolve_footnotes_and_citations()
+
+    def number_footnotes(self, startnum):
+        """
+        Assign numbers to autonumbered footnotes.
+
+        For labeled autonumbered footnotes, copy the number over to
+        corresponding footnote references.
+        """
+        for footnote in self.document.autofootnotes:
+            while True:
+                label = str(startnum)
+                startnum += 1
+                if label not in self.document.nameids:
+                    break
+            footnote.insert(0, nodes.label('', label))
+            for name in footnote['names']:
+                for ref in self.document.footnote_refs.get(name, []):
+                    ref += nodes.Text(label)
+                    ref.delattr('refname')
+                    assert len(footnote['ids']) == len(ref['ids']) == 1
+                    ref['refid'] = footnote['ids'][0]
+                    footnote.add_backref(ref['ids'][0])
+                    self.document.note_refid(ref)
+                    ref.resolved = 1
+            if not footnote['names'] and not footnote['dupnames']:
+                footnote['names'].append(label)
+                self.document.note_explicit_target(footnote, footnote)
+                self.autofootnote_labels.append(label)
+        return startnum
+
+    def number_footnote_references(self, startnum):
+        """Assign numbers to autonumbered footnote references."""
+        i = 0
+        for ref in self.document.autofootnote_refs:
+            if ref.resolved or ref.hasattr('refid'):
+                continue
+            try:
+                label = self.autofootnote_labels[i]
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many autonumbered footnote references: only %s '
+                      'corresponding footnotes available.'
+                      % len(self.autofootnote_labels), base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.autofootnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refname'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            ref += nodes.Text(label)
+            id = self.document.nameids[label]
+            footnote = self.document.ids[id]
+            ref['refid'] = id
+            self.document.note_refid(ref)
+            assert len(ref['ids']) == 1
+            footnote.add_backref(ref['ids'][0])
+            ref.resolved = 1
+            i += 1
+
+    def symbolize_footnotes(self):
+        """Add symbols indexes to "[*]"-style footnotes and references."""
+        labels = []
+        for footnote in self.document.symbol_footnotes:
+            reps, index = divmod(self.document.symbol_footnote_start,
+                                 len(self.symbols))
+            labeltext = self.symbols[index] * (reps + 1)
+            labels.append(labeltext)
+            footnote.insert(0, nodes.label('', labeltext))
+            self.document.symbol_footnote_start += 1
+            self.document.set_id(footnote)
+        i = 0
+        for ref in self.document.symbol_footnote_refs:
+            try:
+                ref += nodes.Text(labels[i])
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many symbol footnote references: only %s '
+                      'corresponding footnotes available.' % len(labels),
+                      base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.symbol_footnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refid'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            footnote = self.document.symbol_footnotes[i]
+            assert len(footnote['ids']) == 1
+            ref['refid'] = footnote['ids'][0]
+            self.document.note_refid(ref)
+            footnote.add_backref(ref['ids'][0])
+            i += 1
+
+    def resolve_footnotes_and_citations(self):
+        """
+        Link manually-labeled footnotes and citations to/from their
+        references.
+        """
+        for footnote in self.document.footnotes:
+            for label in footnote['names']:
+                if label in self.document.footnote_refs:
+                    reflist = self.document.footnote_refs[label]
+                    self.resolve_references(footnote, reflist)
+        for citation in self.document.citations:
+            for label in citation['names']:
+                if label in self.document.citation_refs:
+                    reflist = self.document.citation_refs[label]
+                    self.resolve_references(citation, reflist)
+
+    def resolve_references(self, note, reflist):
+        assert len(note['ids']) == 1
+        id = note['ids'][0]
+        for ref in reflist:
+            if ref.resolved:
+                continue
+            ref.delattr('refname')
+            ref['refid'] = id
+            assert len(ref['ids']) == 1
+            note.add_backref(ref['ids'][0])
+            ref.resolved = 1
+        note.resolved = 1
+
+
+class CircularSubstitutionDefinitionError(Exception): pass
+
+
+class Substitutions(Transform):
+
+    """
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                The
+                <substitution_reference refname="biohazard">
+                    biohazard
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+
+    The ``substitution_reference`` will simply be replaced by the
+    contents of the corresponding ``substitution_definition``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                The
+                <image alt="biohazard" uri="biohazard.png">
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+    """
+
+    default_priority = 220
+    """The Substitutions transform has to be applied very early, before
+    `docutils.tranforms.frontmatter.DocTitle` and others."""
+
+    def apply(self):
+        defs = self.document.substitution_defs
+        normed = self.document.substitution_names
+        subreflist = self.document.traverse(nodes.substitution_reference)
+        nested = {}
+        for ref in subreflist:
+            refname = ref['refname']
+            key = None
+            if refname in defs:
+                key = refname
+            else:
+                normed_name = refname.lower()
+                if normed_name in normed:
+                    key = normed[normed_name]
+            if key is None:
+                msg = self.document.reporter.error(
+                      'Undefined substitution referenced: "%s".'
+                      % refname, base_node=ref)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            else:
+                subdef = defs[key]
+                parent = ref.parent
+                index = parent.index(ref)
+                if  ('ltrim' in subdef.attributes
+                     or 'trim' in subdef.attributes):
+                    if index > 0 and isinstance(parent[index - 1],
+                                                nodes.Text):
+                        parent.replace(parent[index - 1],
+                                       parent[index - 1].rstrip())
+                if  ('rtrim' in subdef.attributes
+                     or 'trim' in subdef.attributes):
+                    if  (len(parent) > index + 1
+                         and isinstance(parent[index + 1], nodes.Text)):
+                        parent.replace(parent[index + 1],
+                                       parent[index + 1].lstrip())
+                subdef_copy = subdef.deepcopy()
+                try:
+                    # Take care of nested substitution references:
+                    for nested_ref in subdef_copy.traverse(
+                          nodes.substitution_reference):
+                        nested_name = normed[nested_ref['refname'].lower()]
+                        if nested_name in nested.setdefault(nested_name, []):
+                            raise CircularSubstitutionDefinitionError
+                        else:
+                            nested[nested_name].append(key)
+                            subreflist.append(nested_ref)
+                except CircularSubstitutionDefinitionError:
+                    parent = ref.parent
+                    if isinstance(parent, nodes.substitution_definition):
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition detected:',
+                            nodes.literal_block(parent.rawsource,
+                                                parent.rawsource),
+                            line=parent.line, base_node=parent)
+                        parent.replace_self(msg)
+                    else:
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition referenced: "%s".'
+                            % refname, base_node=ref)
+                        msgid = self.document.set_id(msg)
+                        prb = nodes.problematic(
+                            ref.rawsource, ref.rawsource, refid=msgid)
+                        prbid = self.document.set_id(prb)
+                        msg.add_backref(prbid)
+                        ref.replace_self(prb)
+                else:
+                    ref.replace_self(subdef_copy.children)
+                    # register refname of the replacment node(s)
+                    # (needed for resolution of references)
+                    for node in subdef_copy.children:
+                        if isinstance(node, nodes.Referential):
+                            # HACK: verify refname attribute exists.
+                            # Test with docs/dev/todo.txt, see. |donate|
+                            if 'refname' in node:
+                                self.document.note_refname(node)
+
+
+class TargetNotes(Transform):
+
+    """
+    Creates a footnote for each external target in the text, and corresponding
+    footnote references after each reference.
+    """
+
+    default_priority = 540
+    """The TargetNotes transform has to be applied after `IndirectHyperlinks`
+    but before `Footnotes`."""
+
+
+    def __init__(self, document, startnode):
+        Transform.__init__(self, document, startnode=startnode)
+
+        self.classes = startnode.details.get('class', [])
+
+    def apply(self):
+        notes = {}
+        nodelist = []
+        for target in self.document.traverse(nodes.target):
+            # Only external targets.
+            if not target.hasattr('refuri'):
+                continue
+            names = target['names']
+            refs = []
+            for name in names:
+                refs.extend(self.document.refnames.get(name, []))
+            if not refs:
+                continue
+            footnote = self.make_target_footnote(target['refuri'], refs,
+                                                 notes)
+            if target['refuri'] not in notes:
+                notes[target['refuri']] = footnote
+                nodelist.append(footnote)
+        # Take care of anonymous references.
+        for ref in self.document.traverse(nodes.reference):
+            if not ref.get('anonymous'):
+                continue
+            if ref.hasattr('refuri'):
+                footnote = self.make_target_footnote(ref['refuri'], [ref],
+                                                     notes)
+                if ref['refuri'] not in notes:
+                    notes[ref['refuri']] = footnote
+                    nodelist.append(footnote)
+        self.startnode.replace_self(nodelist)
+
+    def make_target_footnote(self, refuri, refs, notes):
+        if refuri in notes:  # duplicate?
+            footnote = notes[refuri]
+            assert len(footnote['names']) == 1
+            footnote_name = footnote['names'][0]
+        else:                           # original
+            footnote = nodes.footnote()
+            footnote_id = self.document.set_id(footnote)
+            # Use uppercase letters and a colon; they can't be
+            # produced inside names by the parser.
+            footnote_name = 'TARGET_NOTE: ' + footnote_id
+            footnote['auto'] = 1
+            footnote['names'] = [footnote_name]
+            footnote_paragraph = nodes.paragraph()
+            footnote_paragraph += nodes.reference('', refuri, refuri=refuri)
+            footnote += footnote_paragraph
+            self.document.note_autofootnote(footnote)
+            self.document.note_explicit_target(footnote, footnote)
+        for ref in refs:
+            if isinstance(ref, nodes.target):
+                continue
+            refnode = nodes.footnote_reference(refname=footnote_name, auto=1)
+            refnode['classes'] += self.classes
+            self.document.note_autofootnote_ref(refnode)
+            self.document.note_footnote_ref(refnode)
+            index = ref.parent.index(ref) + 1
+            reflist = [refnode]
+            if not utils.get_trim_footnote_ref_space(self.document.settings):
+                if self.classes:
+                    reflist.insert(0, nodes.inline(text=' ', Classes=self.classes))
+                else:
+                    reflist.insert(0, nodes.Text(' '))
+            ref.parent.insert(index, reflist)
+        return footnote
+
+
+class DanglingReferences(Transform):
+
+    """
+    Check for dangling references (incl. footnote & citation) and for
+    unreferenced targets.
+    """
+
+    default_priority = 850
+
+    def apply(self):
+        visitor = DanglingReferencesVisitor(
+            self.document,
+            self.document.transformer.unknown_reference_resolvers)
+        self.document.walk(visitor)
+        # *After* resolving all references, check for unreferenced
+        # targets:
+        for target in self.document.traverse(nodes.target):
+            if not target.referenced:
+                if target.get('anonymous'):
+                    # If we have unreferenced anonymous targets, there
+                    # is already an error message about anonymous
+                    # hyperlink mismatch; no need to generate another
+                    # message.
+                    continue
+                if target['names']:
+                    naming = target['names'][0]
+                elif target['ids']:
+                    naming = target['ids'][0]
+                else:
+                    # Hack: Propagated targets always have their refid
+                    # attribute set.
+                    naming = target['refid']
+                self.document.reporter.info(
+                    'Hyperlink target "%s" is not referenced.'
+                    % naming, base_node=target)
+
+
+class DanglingReferencesVisitor(nodes.SparseNodeVisitor):
+    
+    def __init__(self, document, unknown_reference_resolvers):
+        nodes.SparseNodeVisitor.__init__(self, document)
+        self.document = document
+        self.unknown_reference_resolvers = unknown_reference_resolvers
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        if node.resolved or not node.hasattr('refname'):
+            return
+        refname = node['refname']
+        id = self.document.nameids.get(refname)
+        if id is None:
+            for resolver_function in self.unknown_reference_resolvers:
+                if resolver_function(node):
+                    break
+            else:
+                if refname in self.document.nameids:
+                    msg = self.document.reporter.error(
+                        'Duplicate target name, cannot be used as a unique '
+                        'reference: "%s".' % (node['refname']), base_node=node)
+                else:
+                    msg = self.document.reporter.error(
+                        'Unknown target name: "%s".' % (node['refname']),
+                        base_node=node)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      node.rawsource, node.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                node.replace_self(prb)
+        else:
+            del node['refname']
+            node['refid'] = id
+            self.document.ids[id].note_referenced_by(id=id)
+            node.resolved = 1
+
+    visit_footnote_reference = visit_citation_reference = visit_reference
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/nodes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/nodes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/nodes.py	(revision 1126)
@@ -0,0 +1,2204 @@
+# $Id: nodes.py 7788 2015-02-16 22:10:52Z milde $
+# Author: David Goodger <goodger@python.org>
+# Maintainer: docutils-develop@lists.sourceforge.net
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils document tree element class library.
+
+Classes in CamelCase are abstract base classes or auxiliary classes. The one
+exception is `Text`, for a text (PCDATA) node; uppercase is used to
+differentiate from element classes.  Classes in lower_case_with_underscores
+are element classes, matching the XML element generic identifiers in the DTD_.
+
+The position of each node (the level at which it can occur) is significant and
+is represented by abstract base classes (`Root`, `Structural`, `Body`,
+`Inline`, etc.).  Certain transformations will be easier because we can use
+``isinstance(node, base_class)`` to determine the position of the node in the
+hierarchy.
+
+.. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import warnings
+import types
+import unicodedata
+
+# ==============================
+#  Functional Node Base Classes
+# ==============================
+
+class Node(object):
+
+    """Abstract base class of nodes in a document tree."""
+
+    parent = None
+    """Back-reference to the Node immediately containing this Node."""
+
+    document = None
+    """The `document` node at the root of the tree containing this Node."""
+
+    source = None
+    """Path or description of the input source which generated this Node."""
+
+    line = None
+    """The line number (1-based) of the beginning of this Node in `source`."""
+
+    def __nonzero__(self):
+        """
+        Node instances are always true, even if they're empty.  A node is more
+        than a simple container.  Its boolean "truth" does not depend on
+        having one or more subnodes in the doctree.
+
+        Use `len()` to check node length.  Use `None` to represent a boolean
+        false value.
+        """
+        return True
+
+    if sys.version_info < (3,):
+        # on 2.x, str(node) will be a byte string with Unicode
+        # characters > 255 escaped; on 3.x this is no longer necessary
+        def __str__(self):
+            return unicode(self).encode('raw_unicode_escape')
+
+    def asdom(self, dom=None):
+        """Return a DOM **fragment** representation of this Node."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        return self._dom_node(domroot)
+
+    def pformat(self, indent='    ', level=0):
+        """
+        Return an indented pseudo-XML representation, for test purposes.
+
+        Override in subclasses.
+        """
+        raise NotImplementedError
+
+    def copy(self):
+        """Return a copy of self."""
+        raise NotImplementedError
+
+    def deepcopy(self):
+        """Return a deep copy of self (also copying children)."""
+        raise NotImplementedError
+
+    def setup_child(self, child):
+        child.parent = self
+        if self.document:
+            child.document = self.document
+            if child.source is None:
+                child.source = self.document.current_source
+            if child.line is None:
+                child.line = self.document.current_line
+
+    def walk(self, visitor):
+        """
+        Traverse a tree of `Node` objects, calling the
+        `dispatch_visit()` method of `visitor` when entering each
+        node.  (The `walkabout()` method is similar, except it also
+        calls the `dispatch_departure()` method before exiting each
+        node.)
+
+        This tree traversal supports limited in-place tree
+        modifications.  Replacing one node with one or more nodes is
+        OK, as is removing an element.  However, if the node removed
+        or replaced occurs after the current node, the old node will
+        still be traversed, and any new nodes will not.
+
+        Within ``visit`` methods (and ``depart`` methods for
+        `walkabout()`), `TreePruningException` subclasses may be raised
+        (`SkipChildren`, `SkipSiblings`, `SkipNode`, `SkipDeparture`).
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` implementation for each `Node` subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        stop = False
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walk calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except (SkipChildren, SkipNode):
+                return stop
+            except SkipDeparture:           # not applicable; ignore
+                pass
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walk(visitor):
+                        stop = True
+                        break
+            except SkipSiblings:
+                pass
+        except StopTraversal:
+            stop = True
+        return stop
+
+    def walkabout(self, visitor):
+        """
+        Perform a tree traversal similarly to `Node.walk()` (which
+        see), except also call the `dispatch_departure()` method
+        before exiting each node.
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` and ``depart`` implementation for each `Node`
+        subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        call_depart = True
+        stop = False
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walkabout calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except SkipNode:
+                return stop
+            except SkipDeparture:
+                call_depart = False
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walkabout(visitor):
+                        stop = True
+                        break
+            except SkipSiblings:
+                pass
+        except SkipChildren:
+            pass
+        except StopTraversal:
+            stop = True
+        if call_depart:
+            visitor.document.reporter.debug(
+                'docutils.nodes.Node.walkabout calling dispatch_departure '
+                'for %s' % self.__class__.__name__)
+            visitor.dispatch_departure(self)
+        return stop
+
+    def _fast_traverse(self, cls):
+        """Specialized traverse() that only supports instance checks."""
+        result = []
+        if isinstance(self, cls):
+            result.append(self)
+        for child in self.children:
+            result.extend(child._fast_traverse(cls))
+        return result
+
+    def _all_traverse(self):
+        """Specialized traverse() that doesn't check for a condition."""
+        result = []
+        result.append(self)
+        for child in self.children:
+            result.extend(child._all_traverse())
+        return result
+
+    def traverse(self, condition=None, include_self=True, descend=True,
+                 siblings=False, ascend=False):
+        """
+        Return an iterable containing
+
+        * self (if include_self is true)
+        * all descendants in tree traversal order (if descend is true)
+        * all siblings (if siblings is true) and their descendants (if
+          also descend is true)
+        * the siblings of the parent (if ascend is true) and their
+          descendants (if also descend is true), and so on
+
+        If `condition` is not None, the iterable contains only nodes
+        for which ``condition(node)`` is true.  If `condition` is a
+        node class ``cls``, it is equivalent to a function consisting
+        of ``return isinstance(node, cls)``.
+
+        If ascend is true, assume siblings to be true as well.
+
+        For example, given the following tree::
+
+            <paragraph>
+                <emphasis>      <--- emphasis.traverse() and
+                    <strong>    <--- strong.traverse() are called.
+                        Foo
+                    Bar
+                <reference name="Baz" refid="baz">
+                    Baz
+
+        Then list(emphasis.traverse()) equals ::
+
+            [<emphasis>, <strong>, <#text: Foo>, <#text: Bar>]
+
+        and list(strong.traverse(ascend=True)) equals ::
+
+            [<strong>, <#text: Foo>, <#text: Bar>, <reference>, <#text: Baz>]
+        """
+        if ascend:
+            siblings=True
+        # Check for special argument combinations that allow using an
+        # optimized version of traverse()
+        if include_self and descend and not siblings:
+            if condition is None:
+                return self._all_traverse()
+            elif isinstance(condition, (types.ClassType, type)):
+                return self._fast_traverse(condition)
+        # Check if `condition` is a class (check for TypeType for Python
+        # implementations that use only new-style classes, like PyPy).
+        if isinstance(condition, (types.ClassType, type)):
+            node_class = condition
+            def condition(node, node_class=node_class):
+                return isinstance(node, node_class)
+        r = []
+        if include_self and (condition is None or condition(self)):
+            r.append(self)
+        if descend and len(self.children):
+            for child in self:
+                r.extend(child.traverse(include_self=True, descend=True,
+                                        siblings=False, ascend=False,
+                                        condition=condition))
+        if siblings or ascend:
+            node = self
+            while node.parent:
+                index = node.parent.index(node)
+                for sibling in node.parent[index+1:]:
+                    r.extend(sibling.traverse(include_self=True,
+                                              descend=descend,
+                                              siblings=False, ascend=False,
+                                              condition=condition))
+                if not ascend:
+                    break
+                else:
+                    node = node.parent
+        return r
+
+    def next_node(self, condition=None, include_self=False, descend=True,
+                  siblings=False, ascend=False):
+        """
+        Return the first node in the iterable returned by traverse(),
+        or None if the iterable is empty.
+
+        Parameter list is the same as of traverse.  Note that
+        include_self defaults to 0, though.
+        """
+        iterable = self.traverse(condition=condition,
+                                 include_self=include_self, descend=descend,
+                                 siblings=siblings, ascend=ascend)
+        try:
+            return iterable[0]
+        except IndexError:
+            return None
+
+if sys.version_info < (3,):
+    class reprunicode(unicode):
+        """
+        A unicode sub-class that removes the initial u from unicode's repr.
+        """
+
+        def __repr__(self):
+            return unicode.__repr__(self)[1:]
+
+
+else:
+    reprunicode = unicode
+
+
+def ensure_str(s):
+    """
+    Failsave conversion of `unicode` to `str`.
+    """
+    if sys.version_info < (3,) and isinstance(s, unicode):
+        return s.encode('ascii', 'backslashreplace')
+    return s
+
+
+class Text(Node, reprunicode):
+
+    """
+    Instances are terminal nodes (leaves) containing text only; no child
+    nodes or attributes.  Initialize by passing a string to the constructor.
+    Access the text itself with the `astext` method.
+    """
+
+    tagname = '#text'
+
+    children = ()
+    """Text nodes have no children, and cannot have children."""
+
+    if sys.version_info > (3,):
+        def __new__(cls, data, rawsource=None):
+            """Prevent the rawsource argument from propagating to str."""
+            if isinstance(data, bytes):
+                raise TypeError('expecting str data, not bytes')
+            return reprunicode.__new__(cls, data)
+    else:
+        def __new__(cls, data, rawsource=None):
+            """Prevent the rawsource argument from propagating to str."""
+            return reprunicode.__new__(cls, data)
+
+    def __init__(self, data, rawsource=''):
+
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+    def shortrepr(self, maxlen=18):
+        data = self
+        if len(data) > maxlen:
+            data = data[:maxlen-4] + ' ...'
+        return '<%s: %r>' % (self.tagname, reprunicode(data))
+
+    def __repr__(self):
+        return self.shortrepr(maxlen=68)
+
+    def _dom_node(self, domroot):
+        return domroot.createTextNode(unicode(self))
+
+    def astext(self):
+        return reprunicode(self)
+
+    # Note about __unicode__: The implementation of __unicode__ here,
+    # and the one raising NotImplemented in the superclass Node had
+    # to be removed when changing Text to a subclass of unicode instead
+    # of UserString, since there is no way to delegate the __unicode__
+    # call to the superclass unicode:
+    # unicode itself does not have __unicode__ method to delegate to
+    # and calling unicode(self) or unicode.__new__ directly creates
+    # an infinite loop
+
+    def copy(self):
+        return self.__class__(reprunicode(self), rawsource=self.rawsource)
+
+    def deepcopy(self):
+        return self.copy()
+
+    def pformat(self, indent='    ', level=0):
+        result = []
+        indent = indent * level
+        for line in self.splitlines():
+            result.append(indent + line + '\n')
+        return ''.join(result)
+
+    # rstrip and lstrip are used by substitution definitions where
+    # they are expected to return a Text instance, this was formerly
+    # taken care of by UserString. Note that then and now the
+    # rawsource member is lost.
+
+    def rstrip(self, chars=None):
+        return self.__class__(reprunicode.rstrip(self, chars))
+    def lstrip(self, chars=None):
+        return self.__class__(reprunicode.lstrip(self, chars))
+
+class Element(Node):
+
+    """
+    `Element` is the superclass to all specific elements.
+
+    Elements contain attributes and child nodes.  Elements emulate
+    dictionaries for attributes, indexing by attribute name (a string).  To
+    set the attribute 'att' to 'value', do::
+
+        element['att'] = 'value'
+
+    There are two special attributes: 'ids' and 'names'.  Both are
+    lists of unique identifiers, and names serve as human interfaces
+    to IDs.  Names are case- and whitespace-normalized (see the
+    fully_normalize_name() function), and IDs conform to the regular
+    expression ``[a-z](-?[a-z0-9]+)*`` (see the make_id() function).
+
+    Elements also emulate lists for child nodes (element nodes and/or text
+    nodes), indexing by integer.  To get the first child node, use::
+
+        element[0]
+
+    Elements may be constructed using the ``+=`` operator.  To add one new
+    child node to element, do::
+
+        element += node
+
+    This is equivalent to ``element.append(node)``.
+
+    To add a list of multiple child nodes at once, use the same ``+=``
+    operator::
+
+        element += [node1, node2]
+
+    This is equivalent to ``element.extend([node1, node2])``.
+    """
+
+    basic_attributes = ('ids', 'classes', 'names', 'dupnames')
+    """List attributes which are defined for every Element-derived class
+    instance and can be safely transferred to a different node."""
+
+    local_attributes = ('backrefs',)
+    """A list of class-specific attributes that should not be copied with the
+    standard attributes when replacing a node.
+
+    NOTE: Derived classes should override this value to prevent any of its
+    attributes being copied by adding to the value in its parent class."""
+
+    list_attributes = basic_attributes + local_attributes
+    """List attributes, automatically initialized to empty lists for
+    all nodes."""
+
+    known_attributes = list_attributes + ('source',)
+    """List attributes that are known to the Element base class."""
+
+    tagname = None
+    """The element generic identifier. If None, it is set as an instance
+    attribute to the name of the class."""
+
+    child_text_separator = '\n\n'
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', *children, **attributes):
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+        self.children = []
+        """List of child nodes (elements and/or `Text`)."""
+
+        self.extend(children)           # maintain parent info
+
+        self.attributes = {}
+        """Dictionary of attribute {name: value}."""
+
+        # Initialize list attributes.
+        for att in self.list_attributes:
+            self.attributes[att] = []
+
+        for att, value in attributes.items():
+            att = att.lower()
+            if att in self.list_attributes:
+                # mutable list; make a copy for this node
+                self.attributes[att] = value[:]
+            else:
+                self.attributes[att] = value
+
+        if self.tagname is None:
+            self.tagname = self.__class__.__name__
+
+    def _dom_node(self, domroot):
+        element = domroot.createElement(self.tagname)
+        for attribute, value in self.attlist():
+            if isinstance(value, list):
+                value = ' '.join([serial_escape('%s' % (v,)) for v in value])
+            element.setAttribute(attribute, '%s' % value)
+        for child in self.children:
+            element.appendChild(child._dom_node(domroot))
+        return element
+
+    def __repr__(self):
+        data = ''
+        for c in self.children:
+            data += c.shortrepr()
+            if len(data) > 60:
+                data = data[:56] + ' ...'
+                break
+        if self['names']:
+            return '<%s "%s": %s>' % (self.__class__.__name__,
+                '; '.join([ensure_str(n) for n in self['names']]), data)
+        else:
+            return '<%s: %s>' % (self.__class__.__name__, data)
+
+    def shortrepr(self):
+        if self['names']:
+            return '<%s "%s"...>' % (self.__class__.__name__,
+                '; '.join([ensure_str(n) for n in self['names']]))
+        else:
+            return '<%s...>' % self.tagname
+
+    def __unicode__(self):
+        if self.children:
+            return u'%s%s%s' % (self.starttag(),
+                                ''.join([unicode(c) for c in self.children]),
+                                self.endtag())
+        else:
+            return self.emptytag()
+
+    if sys.version_info > (3,):
+        # 2to3 doesn't convert __unicode__ to __str__
+        __str__ = __unicode__
+
+    def starttag(self, quoteattr=None):
+        # the optional arg is used by the docutils_xml writer
+        if quoteattr is None:
+            quoteattr = pseudo_quoteattr
+        parts = [self.tagname]
+        for name, value in self.attlist():
+            if value is None:           # boolean attribute
+                parts.append('%s="True"' % name)
+                continue
+            if isinstance(value, list):
+                values = [serial_escape('%s' % (v,)) for v in value]
+                value = ' '.join(values)
+            else:
+                value = unicode(value)
+            value = quoteattr(value)
+            parts.append(u'%s=%s' % (name, value))
+        return u'<%s>' % u' '.join(parts)
+
+    def endtag(self):
+        return '</%s>' % self.tagname
+
+    def emptytag(self):
+        return u'<%s/>' % u' '.join([self.tagname] +
+                                    ['%s="%s"' % (n, v)
+                                     for n, v in self.attlist()])
+
+    def __len__(self):
+        return len(self.children)
+
+    def __contains__(self, key):
+        # support both membership test for children and attributes
+        # (has_key is translated to "in" by 2to3)
+        if isinstance(key, basestring):
+            return key in self.attributes
+        return key in self.children
+
+    def __getitem__(self, key):
+        if isinstance(key, basestring):
+            return self.attributes[key]
+        elif isinstance(key, int):
+            return self.children[key]
+        elif isinstance(key, types.SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            return self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __setitem__(self, key, item):
+        if isinstance(key, basestring):
+            self.attributes[str(key)] = item
+        elif isinstance(key, int):
+            self.setup_child(item)
+            self.children[key] = item
+        elif isinstance(key, types.SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            for node in item:
+                self.setup_child(node)
+            self.children[key.start:key.stop] = item
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __delitem__(self, key):
+        if isinstance(key, basestring):
+            del self.attributes[key]
+        elif isinstance(key, int):
+            del self.children[key]
+        elif isinstance(key, types.SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            del self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a simple '
+                              'slice, or an attribute name string')
+
+    def __add__(self, other):
+        return self.children + other
+
+    def __radd__(self, other):
+        return other + self.children
+
+    def __iadd__(self, other):
+        """Append a node or a list of nodes to `self.children`."""
+        if isinstance(other, Node):
+            self.append(other)
+        elif other is not None:
+            self.extend(other)
+        return self
+
+    def astext(self):
+        return self.child_text_separator.join(
+              [child.astext() for child in self.children])
+
+    def non_default_attributes(self):
+        atts = {}
+        for key, value in self.attributes.items():
+            if self.is_not_default(key):
+                atts[key] = value
+        return atts
+
+    def attlist(self):
+        attlist = self.non_default_attributes().items()
+        attlist.sort()
+        return attlist
+
+    def get(self, key, failobj=None):
+        return self.attributes.get(key, failobj)
+
+    def hasattr(self, attr):
+        return attr in self.attributes
+
+    def delattr(self, attr):
+        if attr in self.attributes:
+            del self.attributes[attr]
+
+    def setdefault(self, key, failobj=None):
+        return self.attributes.setdefault(key, failobj)
+
+    has_key = hasattr
+
+    # support operator ``in``
+    __contains__ = hasattr
+
+    def get_language_code(self, fallback=''):
+        """Return node's language tag.
+
+        Look iteratively in self and parents for a class argument
+        starting with ``language-`` and return the remainder of it
+        (which should be a `BCP49` language tag) or the `fallback`.
+        """
+        for cls in self.get('classes', []):
+            if cls.startswith('language-'):
+                return cls[9:]
+        try:
+            return self.parent.get_language(fallback)
+        except AttributeError:
+            return fallback
+
+    def append(self, item):
+        self.setup_child(item)
+        self.children.append(item)
+
+    def extend(self, item):
+        for node in item:
+            self.append(node)
+
+    def insert(self, index, item):
+        if isinstance(item, Node):
+            self.setup_child(item)
+            self.children.insert(index, item)
+        elif item is not None:
+            self[index:index] = item
+
+    def pop(self, i=-1):
+        return self.children.pop(i)
+
+    def remove(self, item):
+        self.children.remove(item)
+
+    def index(self, item):
+        return self.children.index(item)
+
+    def is_not_default(self, key):
+        if self[key] == [] and key in self.list_attributes:
+            return 0
+        else:
+            return 1
+
+    def update_basic_atts(self, dict_):
+        """
+        Update basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') from node or dictionary `dict_`.
+        """
+        if isinstance(dict_, Node):
+            dict_ = dict_.attributes
+        for att in self.basic_attributes:
+            self.append_attr_list(att, dict_.get(att, []))
+
+    def append_attr_list(self, attr, values):
+        """
+        For each element in values, if it does not exist in self[attr], append
+        it.
+
+        NOTE: Requires self[attr] and values to be sequence type and the
+        former should specifically be a list.
+        """
+        # List Concatenation
+        for value in values:
+            if not value in self[attr]:
+                self[attr].append(value)
+
+    def coerce_append_attr_list(self, attr, value):
+        """
+        First, convert both self[attr] and value to a non-string sequence
+        type; if either is not already a sequence, convert it to a list of one
+        element.  Then call append_attr_list.
+
+        NOTE: self[attr] and value both must not be None.
+        """
+        # List Concatenation
+        if not isinstance(self.get(attr), list):
+            self[attr] = [self[attr]]
+        if not isinstance(value, list):
+            value = [value]
+        self.append_attr_list(attr, value)
+
+    def replace_attr(self, attr, value, force = True):
+        """
+        If self[attr] does not exist or force is True or omitted, set
+        self[attr] to value, otherwise do nothing.
+        """
+        # One or the other
+        if force or self.get(attr) is None:
+            self[attr] = value
+
+    def copy_attr_convert(self, attr, value, replace = True):
+        """
+        If attr is an attribute of self, set self[attr] to
+        [self[attr], value], otherwise set self[attr] to value.
+
+        NOTE: replace is not used by this function and is kept only for
+              compatibility with the other copy functions.
+        """
+        if self.get(attr) is not value:
+            self.coerce_append_attr_list(attr, value)
+
+    def copy_attr_coerce(self, attr, value, replace):
+        """
+        If attr is an attribute of self and either self[attr] or value is a
+        list, convert all non-sequence values to a sequence of 1 element and
+        then concatenate the two sequence, setting the result to self[attr].
+        If both self[attr] and value are non-sequences and replace is True or
+        self[attr] is None, replace self[attr] with value. Otherwise, do
+        nothing.
+        """
+        if self.get(attr) is not value:
+            if isinstance(self.get(attr), list) or \
+               isinstance(value, list):
+                self.coerce_append_attr_list(attr, value)
+            else:
+                self.replace_attr(attr, value, replace)
+
+    def copy_attr_concatenate(self, attr, value, replace):
+        """
+        If attr is an attribute of self and both self[attr] and value are
+        lists, concatenate the two sequences, setting the result to
+        self[attr].  If either self[attr] or value are non-sequences and
+        replace is True or self[attr] is None, replace self[attr] with value.
+        Otherwise, do nothing.
+        """
+        if self.get(attr) is not value:
+            if isinstance(self.get(attr), list) and \
+               isinstance(value, list):
+                self.append_attr_list(attr, value)
+            else:
+                self.replace_attr(attr, value, replace)
+
+    def copy_attr_consistent(self, attr, value, replace):
+        """
+        If replace is True or selfpattr] is None, replace self[attr] with
+        value.  Otherwise, do nothing.
+        """
+        if self.get(attr) is not value:
+            self.replace_attr(attr, value, replace)
+
+    def update_all_atts(self, dict_, update_fun = copy_attr_consistent,
+                        replace = True, and_source = False):
+        """
+        Updates all attributes from node or dictionary `dict_`.
+
+        Appends the basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') and then, for all other attributes in
+        dict_, updates the same attribute in self.  When attributes with the
+        same identifier appear in both self and dict_, the two values are
+        merged based on the value of update_fun.  Generally, when replace is
+        True, the values in self are replaced or merged with the values in
+        dict_; otherwise, the values in self may be preserved or merged.  When
+        and_source is True, the 'source' attribute is included in the copy.
+
+        NOTE: When replace is False, and self contains a 'source' attribute,
+              'source' is not replaced even when dict_ has a 'source'
+              attribute, though it may still be merged into a list depending
+              on the value of update_fun.
+        NOTE: It is easier to call the update-specific methods then to pass
+              the update_fun method to this function.
+        """
+        if isinstance(dict_, Node):
+            dict_ = dict_.attributes
+
+        # Include the source attribute when copying?
+        if and_source:
+            filter_fun = self.is_not_list_attribute
+        else:
+            filter_fun = self.is_not_known_attribute
+
+        # Copy the basic attributes
+        self.update_basic_atts(dict_)
+
+        # Grab other attributes in dict_ not in self except the
+        # (All basic attributes should be copied already)
+        for att in filter(filter_fun, dict_):
+            update_fun(self, att, dict_[att], replace)
+
+    def update_all_atts_consistantly(self, dict_, replace = True,
+                                     and_source = False):
+        """
+        Updates all attributes from node or dictionary `dict_`.
+
+        Appends the basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') and then, for all other attributes in
+        dict_, updates the same attribute in self.  When attributes with the
+        same identifier appear in both self and dict_ and replace is True, the
+        values in self are replaced with the values in dict_; otherwise, the
+        values in self are preserved.  When and_source is True, the 'source'
+        attribute is included in the copy.
+
+        NOTE: When replace is False, and self contains a 'source' attribute,
+              'source' is not replaced even when dict_ has a 'source'
+              attribute, though it may still be merged into a list depending
+              on the value of update_fun.
+        """
+        self.update_all_atts(dict_, Element.copy_attr_consistent, replace,
+                             and_source)
+
+    def update_all_atts_concatenating(self, dict_, replace = True,
+                                      and_source = False):
+        """
+        Updates all attributes from node or dictionary `dict_`.
+
+        Appends the basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') and then, for all other attributes in
+        dict_, updates the same attribute in self.  When attributes with the
+        same identifier appear in both self and dict_ whose values aren't each
+        lists and replace is True, the values in self are replaced with the
+        values in dict_; if the values from self and dict_ for the given
+        identifier are both of list type, then the two lists are concatenated
+        and the result stored in self; otherwise, the values in self are
+        preserved.  When and_source is True, the 'source' attribute is
+        included in the copy.
+
+        NOTE: When replace is False, and self contains a 'source' attribute,
+              'source' is not replaced even when dict_ has a 'source'
+              attribute, though it may still be merged into a list depending
+              on the value of update_fun.
+        """
+        self.update_all_atts(dict_, Element.copy_attr_concatenate, replace,
+                             and_source)
+
+    def update_all_atts_coercion(self, dict_, replace = True,
+                                 and_source = False):
+        """
+        Updates all attributes from node or dictionary `dict_`.
+
+        Appends the basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') and then, for all other attributes in
+        dict_, updates the same attribute in self.  When attributes with the
+        same identifier appear in both self and dict_ whose values are both
+        not lists and replace is True, the values in self are replaced with
+        the values in dict_; if either of the values from self and dict_ for
+        the given identifier are of list type, then first any non-lists are
+        converted to 1-element lists and then the two lists are concatenated
+        and the result stored in self; otherwise, the values in self are
+        preserved.  When and_source is True, the 'source' attribute is
+        included in the copy.
+
+        NOTE: When replace is False, and self contains a 'source' attribute,
+              'source' is not replaced even when dict_ has a 'source'
+              attribute, though it may still be merged into a list depending
+              on the value of update_fun.
+        """
+        self.update_all_atts(dict_, Element.copy_attr_coerce, replace,
+                             and_source)
+
+    def update_all_atts_convert(self, dict_, and_source = False):
+        """
+        Updates all attributes from node or dictionary `dict_`.
+
+        Appends the basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') and then, for all other attributes in
+        dict_, updates the same attribute in self.  When attributes with the
+        same identifier appear in both self and dict_ then first any non-lists
+        are converted to 1-element lists and then the two lists are
+        concatenated and the result stored in self; otherwise, the values in
+        self are preserved.  When and_source is True, the 'source' attribute
+        is included in the copy.
+
+        NOTE: When replace is False, and self contains a 'source' attribute,
+              'source' is not replaced even when dict_ has a 'source'
+              attribute, though it may still be merged into a list depending
+              on the value of update_fun.
+        """
+        self.update_all_atts(dict_, Element.copy_attr_convert,
+                             and_source = and_source)
+
+    def clear(self):
+        self.children = []
+
+    def replace(self, old, new):
+        """Replace one child `Node` with another child or children."""
+        index = self.index(old)
+        if isinstance(new, Node):
+            self.setup_child(new)
+            self[index] = new
+        elif new is not None:
+            self[index:index+1] = new
+
+    def replace_self(self, new):
+        """
+        Replace `self` node with `new`, where `new` is a node or a
+        list of nodes.
+        """
+        update = new
+        if not isinstance(new, Node):
+            # `new` is a list; update first child.
+            try:
+                update = new[0]
+            except IndexError:
+                update = None
+        if isinstance(update, Element):
+            update.update_basic_atts(self)
+        else:
+            # `update` is a Text node or `new` is an empty list.
+            # Assert that we aren't losing any attributes.
+            for att in self.basic_attributes:
+                assert not self[att], \
+                       'Losing "%s" attribute: %s' % (att, self[att])
+        self.parent.replace(self, new)
+
+    def first_child_matching_class(self, childclass, start=0, end=sys.maxint):
+        """
+        Return the index of the first child whose class exactly matches.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to search for, or a tuple of `Node`
+          classes. If a tuple, any of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, tuple):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self[index], c):
+                    return index
+        return None
+
+    def first_child_not_matching_class(self, childclass, start=0,
+                                       end=sys.maxint):
+        """
+        Return the index of the first child whose class does *not* match.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to skip, or a tuple of `Node`
+          classes. If a tuple, none of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, tuple):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self.children[index], c):
+                    break
+            else:
+                return index
+        return None
+
+    def pformat(self, indent='    ', level=0):
+        return ''.join(['%s%s\n' % (indent * level, self.starttag())] +
+                       [child.pformat(indent, level+1)
+                        for child in self.children])
+
+    def copy(self):
+        return self.__class__(rawsource=self.rawsource, **self.attributes)
+
+    def deepcopy(self):
+        copy = self.copy()
+        copy.extend([child.deepcopy() for child in self.children])
+        return copy
+
+    def set_class(self, name):
+        """Add a new class to the "classes" attribute."""
+        warnings.warn('docutils.nodes.Element.set_class deprecated; '
+                      "append to Element['classes'] list attribute directly",
+                      DeprecationWarning, stacklevel=2)
+        assert ' ' not in name
+        self['classes'].append(name.lower())
+
+    def note_referenced_by(self, name=None, id=None):
+        """Note that this Element has been referenced by its name
+        `name` or id `id`."""
+        self.referenced = 1
+        # Element.expect_referenced_by_* dictionaries map names or ids
+        # to nodes whose ``referenced`` attribute is set to true as
+        # soon as this node is referenced by the given name or id.
+        # Needed for target propagation.
+        by_name = getattr(self, 'expect_referenced_by_name', {}).get(name)
+        by_id = getattr(self, 'expect_referenced_by_id', {}).get(id)
+        if by_name:
+            assert name is not None
+            by_name.referenced = 1
+        if by_id:
+            assert id is not None
+            by_id.referenced = 1
+
+    @classmethod
+    def is_not_list_attribute(cls, attr):
+        """
+        Returns True if and only if the given attribute is NOT one of the
+        basic list attributes defined for all Elements.
+        """
+        return attr not in cls.list_attributes
+
+    @classmethod
+    def is_not_known_attribute(cls, attr):
+        """
+        Returns True if and only if the given attribute is NOT recognized by
+        this class.
+        """
+        return attr not in cls.known_attributes
+
+
+class TextElement(Element):
+
+    """
+    An element which directly contains text.
+
+    Its children are all `Text` or `Inline` subclass nodes.  You can
+    check whether an element's context is inline simply by checking whether
+    its immediate parent is a `TextElement` instance (including subclasses).
+    This is handy for nodes like `image` that can appear both inline and as
+    standalone body elements.
+
+    If passing children to `__init__()`, make sure to set `text` to
+    ``''`` or some other suitable value.
+    """
+
+    child_text_separator = ''
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        if text != '':
+            textnode = Text(text)
+            Element.__init__(self, rawsource, textnode, *children,
+                              **attributes)
+        else:
+            Element.__init__(self, rawsource, *children, **attributes)
+
+
+class FixedTextElement(TextElement):
+
+    """An element which directly contains preformatted text."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        TextElement.__init__(self, rawsource, text, *children, **attributes)
+        self.attributes['xml:space'] = 'preserve'
+
+
+# ========
+#  Mixins
+# ========
+
+class Resolvable:
+
+    resolved = 0
+
+
+class BackLinkable:
+
+    def add_backref(self, refid):
+        self['backrefs'].append(refid)
+
+
+# ====================
+#  Element Categories
+# ====================
+
+class Root: pass
+
+class Titular: pass
+
+class PreBibliographic:
+    """Category of Node which may occur before Bibliographic Nodes."""
+
+class Bibliographic: pass
+
+class Decorative(PreBibliographic): pass
+
+class Structural: pass
+
+class Body: pass
+
+class General(Body): pass
+
+class Sequential(Body):
+    """List-like elements."""
+
+class Admonition(Body): pass
+
+class Special(Body):
+    """Special internal body elements."""
+
+class Invisible(PreBibliographic):
+    """Internal elements that don't appear in output."""
+
+class Part: pass
+
+class Inline: pass
+
+class Referential(Resolvable): pass
+
+
+class Targetable(Resolvable):
+
+    referenced = 0
+
+    indirect_reference_name = None
+    """Holds the whitespace_normalized_name (contains mixed case) of a target.
+    Required for MoinMoin/reST compatibility."""
+
+
+class Labeled:
+    """Contains a `label` as its first element."""
+
+
+# ==============
+#  Root Element
+# ==============
+
+class document(Root, Structural, Element):
+
+    """
+    The document root element.
+
+    Do not instantiate this class directly; use
+    `docutils.utils.new_document()` instead.
+    """
+
+    def __init__(self, settings, reporter, *args, **kwargs):
+        Element.__init__(self, *args, **kwargs)
+
+        self.current_source = None
+        """Path to or description of the input source being processed."""
+
+        self.current_line = None
+        """Line number (1-based) of `current_source`."""
+
+        self.settings = settings
+        """Runtime settings data record."""
+
+        self.reporter = reporter
+        """System message generator."""
+
+        self.indirect_targets = []
+        """List of indirect target nodes."""
+
+        self.substitution_defs = {}
+        """Mapping of substitution names to substitution_definition nodes."""
+
+        self.substitution_names = {}
+        """Mapping of case-normalized substitution names to case-sensitive
+        names."""
+
+        self.refnames = {}
+        """Mapping of names to lists of referencing nodes."""
+
+        self.refids = {}
+        """Mapping of ids to lists of referencing nodes."""
+
+        self.nameids = {}
+        """Mapping of names to unique id's."""
+
+        self.nametypes = {}
+        """Mapping of names to hyperlink type (boolean: True => explicit,
+        False => implicit."""
+
+        self.ids = {}
+        """Mapping of ids to nodes."""
+
+        self.footnote_refs = {}
+        """Mapping of footnote labels to lists of footnote_reference nodes."""
+
+        self.citation_refs = {}
+        """Mapping of citation labels to lists of citation_reference nodes."""
+
+        self.autofootnotes = []
+        """List of auto-numbered footnote nodes."""
+
+        self.autofootnote_refs = []
+        """List of auto-numbered footnote_reference nodes."""
+
+        self.symbol_footnotes = []
+        """List of symbol footnote nodes."""
+
+        self.symbol_footnote_refs = []
+        """List of symbol footnote_reference nodes."""
+
+        self.footnotes = []
+        """List of manually-numbered footnote nodes."""
+
+        self.citations = []
+        """List of citation nodes."""
+
+        self.autofootnote_start = 1
+        """Initial auto-numbered footnote number."""
+
+        self.symbol_footnote_start = 0
+        """Initial symbol footnote symbol index."""
+
+        self.id_start = 1
+        """Initial ID number."""
+
+        self.parse_messages = []
+        """System messages generated while parsing."""
+
+        self.transform_messages = []
+        """System messages generated while applying transforms."""
+
+        import docutils.transforms
+        self.transformer = docutils.transforms.Transformer(self)
+        """Storage for transforms to be applied to this document."""
+
+        self.decoration = None
+        """Document's `decoration` node."""
+
+        self.document = self
+
+    def __getstate__(self):
+        """
+        Return dict with unpicklable references removed.
+        """
+        state = self.__dict__.copy()
+        state['reporter'] = None
+        state['transformer'] = None
+        return state
+
+    def asdom(self, dom=None):
+        """Return a DOM representation of this document."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        domroot.appendChild(self._dom_node(domroot))
+        return domroot
+
+    def set_id(self, node, msgnode=None):
+        for id in node['ids']:
+            if id in self.ids and self.ids[id] is not node:
+                msg = self.reporter.severe('Duplicate ID: "%s".' % id)
+                if msgnode != None:
+                    msgnode += msg
+        if not node['ids']:
+            for name in node['names']:
+                id = self.settings.id_prefix + make_id(name)
+                if id and id not in self.ids:
+                    break
+            else:
+                id = ''
+                while not id or id in self.ids:
+                    id = (self.settings.id_prefix +
+                          self.settings.auto_id_prefix + str(self.id_start))
+                    self.id_start += 1
+            node['ids'].append(id)
+        self.ids[id] = node
+        return id
+
+    def set_name_id_map(self, node, id, msgnode=None, explicit=None):
+        """
+        `self.nameids` maps names to IDs, while `self.nametypes` maps names to
+        booleans representing hyperlink type (True==explicit,
+        False==implicit).  This method updates the mappings.
+
+        The following state transition table shows how `self.nameids` ("ids")
+        and `self.nametypes` ("types") change with new input (a call to this
+        method), and what actions are performed ("implicit"-type system
+        messages are INFO/1, and "explicit"-type system messages are ERROR/3):
+
+        ====  =====  ========  ========  =======  ====  =====  =====
+         Old State    Input          Action        New State   Notes
+        -----------  --------  -----------------  -----------  -----
+        ids   types  new type  sys.msg.  dupname  ids   types
+        ====  =====  ========  ========  =======  ====  =====  =====
+        -     -      explicit  -         -        new   True
+        -     -      implicit  -         -        new   False
+        None  False  explicit  -         -        new   True
+        old   False  explicit  implicit  old      new   True
+        None  True   explicit  explicit  new      None  True
+        old   True   explicit  explicit  new,old  None  True   [#]_
+        None  False  implicit  implicit  new      None  False
+        old   False  implicit  implicit  new,old  None  False
+        None  True   implicit  implicit  new      None  True
+        old   True   implicit  implicit  new      old   True
+        ====  =====  ========  ========  =======  ====  =====  =====
+
+        .. [#] Do not clear the name-to-id map or invalidate the old target if
+           both old and new targets are external and refer to identical URIs.
+           The new target is invalidated regardless.
+        """
+        for name in node['names']:
+            if name in self.nameids:
+                self.set_duplicate_name_id(node, id, name, msgnode, explicit)
+            else:
+                self.nameids[name] = id
+                self.nametypes[name] = explicit
+
+    def set_duplicate_name_id(self, node, id, name, msgnode, explicit):
+        old_id = self.nameids[name]
+        old_explicit = self.nametypes[name]
+        self.nametypes[name] = old_explicit or explicit
+        if explicit:
+            if old_explicit:
+                level = 2
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    if 'refuri' in node:
+                        refuri = node['refuri']
+                        if old_node['names'] \
+                               and 'refuri' in old_node \
+                               and old_node['refuri'] == refuri:
+                            level = 1   # just inform if refuri's identical
+                    if level > 1:
+                        dupname(old_node, name)
+                        self.nameids[name] = None
+                msg = self.reporter.system_message(
+                    level, 'Duplicate explicit target name: "%s".' % name,
+                    backrefs=[id], base_node=node)
+                if msgnode != None:
+                    msgnode += msg
+                dupname(node, name)
+            else:
+                self.nameids[name] = id
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    dupname(old_node, name)
+        else:
+            if old_id is not None and not old_explicit:
+                self.nameids[name] = None
+                old_node = self.ids[old_id]
+                dupname(old_node, name)
+            dupname(node, name)
+        if not explicit or (not old_explicit and old_id is not None):
+            msg = self.reporter.info(
+                'Duplicate implicit target name: "%s".' % name,
+                backrefs=[id], base_node=node)
+            if msgnode != None:
+                msgnode += msg
+
+    def has_name(self, name):
+        return name in self.nameids
+
+    # "note" here is an imperative verb: "take note of".
+    def note_implicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=None)
+
+    def note_explicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=True)
+
+    def note_refname(self, node):
+        self.refnames.setdefault(node['refname'], []).append(node)
+
+    def note_refid(self, node):
+        self.refids.setdefault(node['refid'], []).append(node)
+
+    def note_indirect_target(self, target):
+        self.indirect_targets.append(target)
+        if target['names']:
+            self.note_refname(target)
+
+    def note_anonymous_target(self, target):
+        self.set_id(target)
+
+    def note_autofootnote(self, footnote):
+        self.set_id(footnote)
+        self.autofootnotes.append(footnote)
+
+    def note_autofootnote_ref(self, ref):
+        self.set_id(ref)
+        self.autofootnote_refs.append(ref)
+
+    def note_symbol_footnote(self, footnote):
+        self.set_id(footnote)
+        self.symbol_footnotes.append(footnote)
+
+    def note_symbol_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.symbol_footnote_refs.append(ref)
+
+    def note_footnote(self, footnote):
+        self.set_id(footnote)
+        self.footnotes.append(footnote)
+
+    def note_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.footnote_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_citation(self, citation):
+        self.citations.append(citation)
+
+    def note_citation_ref(self, ref):
+        self.set_id(ref)
+        self.citation_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_substitution_def(self, subdef, def_name, msgnode=None):
+        name = whitespace_normalize_name(def_name)
+        if name in self.substitution_defs:
+            msg = self.reporter.error(
+                  'Duplicate substitution definition name: "%s".' % name,
+                  base_node=subdef)
+            if msgnode != None:
+                msgnode += msg
+            oldnode = self.substitution_defs[name]
+            dupname(oldnode, name)
+        # keep only the last definition:
+        self.substitution_defs[name] = subdef
+        # case-insensitive mapping:
+        self.substitution_names[fully_normalize_name(name)] = name
+
+    def note_substitution_ref(self, subref, refname):
+        subref['refname'] = whitespace_normalize_name(refname)
+
+    def note_pending(self, pending, priority=None):
+        self.transformer.add_pending(pending, priority)
+
+    def note_parse_message(self, message):
+        self.parse_messages.append(message)
+
+    def note_transform_message(self, message):
+        self.transform_messages.append(message)
+
+    def note_source(self, source, offset):
+        self.current_source = source
+        if offset is None:
+            self.current_line = offset
+        else:
+            self.current_line = offset + 1
+
+    def copy(self):
+        return self.__class__(self.settings, self.reporter,
+                              **self.attributes)
+
+    def get_decoration(self):
+        if not self.decoration:
+            self.decoration = decoration()
+            index = self.first_child_not_matching_class(Titular)
+            if index is None:
+                self.append(self.decoration)
+            else:
+                self.insert(index, self.decoration)
+        return self.decoration
+
+
+# ================
+#  Title Elements
+# ================
+
+class title(Titular, PreBibliographic, TextElement): pass
+class subtitle(Titular, PreBibliographic, TextElement): pass
+class rubric(Titular, TextElement): pass
+
+
+# ========================
+#  Bibliographic Elements
+# ========================
+
+class docinfo(Bibliographic, Element): pass
+class author(Bibliographic, TextElement): pass
+class authors(Bibliographic, Element): pass
+class organization(Bibliographic, TextElement): pass
+class address(Bibliographic, FixedTextElement): pass
+class contact(Bibliographic, TextElement): pass
+class version(Bibliographic, TextElement): pass
+class revision(Bibliographic, TextElement): pass
+class status(Bibliographic, TextElement): pass
+class date(Bibliographic, TextElement): pass
+class copyright(Bibliographic, TextElement): pass
+
+
+# =====================
+#  Decorative Elements
+# =====================
+
+class decoration(Decorative, Element):
+
+    def get_header(self):
+        if not len(self.children) or not isinstance(self.children[0], header):
+            self.insert(0, header())
+        return self.children[0]
+
+    def get_footer(self):
+        if not len(self.children) or not isinstance(self.children[-1], footer):
+            self.append(footer())
+        return self.children[-1]
+
+
+class header(Decorative, Element): pass
+class footer(Decorative, Element): pass
+
+
+# =====================
+#  Structural Elements
+# =====================
+
+class section(Structural, Element): pass
+
+
+class topic(Structural, Element):
+
+    """
+    Topics are terminal, "leaf" mini-sections, like block quotes with titles,
+    or textual figures.  A topic is just like a section, except that it has no
+    subsections, and it doesn't have to conform to section placement rules.
+
+    Topics are allowed wherever body elements (list, table, etc.) are allowed,
+    but only at the top level of a section or document.  Topics cannot nest
+    inside topics, sidebars, or body elements; you can't have a topic inside a
+    table, list, block quote, etc.
+    """
+
+
+class sidebar(Structural, Element):
+
+    """
+    Sidebars are like miniature, parallel documents that occur inside other
+    documents, providing related or reference material.  A sidebar is
+    typically offset by a border and "floats" to the side of the page; the
+    document's main text may flow around it.  Sidebars can also be likened to
+    super-footnotes; their content is outside of the flow of the document's
+    main text.
+
+    Sidebars are allowed wherever body elements (list, table, etc.) are
+    allowed, but only at the top level of a section or document.  Sidebars
+    cannot nest inside sidebars, topics, or body elements; you can't have a
+    sidebar inside a table, list, block quote, etc.
+    """
+
+
+class transition(Structural, Element): pass
+
+
+# ===============
+#  Body Elements
+# ===============
+
+class paragraph(General, TextElement): pass
+class compound(General, Element): pass
+class container(General, Element): pass
+class bullet_list(Sequential, Element): pass
+class enumerated_list(Sequential, Element): pass
+class list_item(Part, Element): pass
+class definition_list(Sequential, Element): pass
+class definition_list_item(Part, Element): pass
+class term(Part, TextElement): pass
+class classifier(Part, TextElement): pass
+class definition(Part, Element): pass
+class field_list(Sequential, Element): pass
+class field(Part, Element): pass
+class field_name(Part, TextElement): pass
+class field_body(Part, Element): pass
+
+
+class option(Part, Element):
+
+    child_text_separator = ''
+
+
+class option_argument(Part, TextElement):
+
+    def astext(self):
+        return self.get('delimiter', ' ') + TextElement.astext(self)
+
+
+class option_group(Part, Element):
+
+    child_text_separator = ', '
+
+
+class option_list(Sequential, Element): pass
+
+
+class option_list_item(Part, Element):
+
+    child_text_separator = '  '
+
+
+class option_string(Part, TextElement): pass
+class description(Part, Element): pass
+class literal_block(General, FixedTextElement): pass
+class doctest_block(General, FixedTextElement): pass
+class math_block(General, FixedTextElement): pass
+class line_block(General, Element): pass
+
+
+class line(Part, TextElement):
+
+    indent = None
+
+
+class block_quote(General, Element): pass
+class attribution(Part, TextElement): pass
+class attention(Admonition, Element): pass
+class caution(Admonition, Element): pass
+class danger(Admonition, Element): pass
+class error(Admonition, Element): pass
+class important(Admonition, Element): pass
+class note(Admonition, Element): pass
+class tip(Admonition, Element): pass
+class hint(Admonition, Element): pass
+class warning(Admonition, Element): pass
+class admonition(Admonition, Element): pass
+class comment(Special, Invisible, FixedTextElement): pass
+class substitution_definition(Special, Invisible, TextElement): pass
+class target(Special, Invisible, Inline, TextElement, Targetable): pass
+class footnote(General, BackLinkable, Element, Labeled, Targetable): pass
+class citation(General, BackLinkable, Element, Labeled, Targetable): pass
+class label(Part, TextElement): pass
+class figure(General, Element): pass
+class caption(Part, TextElement): pass
+class legend(Part, Element): pass
+class table(General, Element): pass
+class tgroup(Part, Element): pass
+class colspec(Part, Element): pass
+class thead(Part, Element): pass
+class tbody(Part, Element): pass
+class row(Part, Element): pass
+class entry(Part, Element): pass
+
+
+class system_message(Special, BackLinkable, PreBibliographic, Element):
+
+    """
+    System message element.
+
+    Do not instantiate this class directly; use
+    ``document.reporter.info/warning/error/severe()`` instead.
+    """
+
+    def __init__(self, message=None, *children, **attributes):
+        if message:
+            p = paragraph('', message)
+            children = (p,) + children
+        try:
+            Element.__init__(self, '', *children, **attributes)
+        except:
+            print 'system_message: children=%r' % (children,)
+            raise
+
+    def astext(self):
+        line = self.get('line', '')
+        return u'%s:%s: (%s/%s) %s' % (self['source'], line, self['type'],
+                                       self['level'], Element.astext(self))
+
+
+class pending(Special, Invisible, Element):
+
+    """
+    The "pending" element is used to encapsulate a pending operation: the
+    operation (transform), the point at which to apply it, and any data it
+    requires.  Only the pending operation's location within the document is
+    stored in the public document tree (by the "pending" object itself); the
+    operation and its data are stored in the "pending" object's internal
+    instance attributes.
+
+    For example, say you want a table of contents in your reStructuredText
+    document.  The easiest way to specify where to put it is from within the
+    document, with a directive::
+
+        .. contents::
+
+    But the "contents" directive can't do its work until the entire document
+    has been parsed and possibly transformed to some extent.  So the directive
+    code leaves a placeholder behind that will trigger the second phase of its
+    processing, something like this::
+
+        <pending ...public attributes...> + internal attributes
+
+    Use `document.note_pending()` so that the
+    `docutils.transforms.Transformer` stage of processing can run all pending
+    transforms.
+    """
+
+    def __init__(self, transform, details=None,
+                 rawsource='', *children, **attributes):
+        Element.__init__(self, rawsource, *children, **attributes)
+
+        self.transform = transform
+        """The `docutils.transforms.Transform` class implementing the pending
+        operation."""
+
+        self.details = details or {}
+        """Detail data (dictionary) required by the pending operation."""
+
+    def pformat(self, indent='    ', level=0):
+        internals = [
+              '.. internal attributes:',
+              '     .transform: %s.%s' % (self.transform.__module__,
+                                          self.transform.__name__),
+              '     .details:']
+        details = self.details.items()
+        details.sort()
+        for key, value in details:
+            if isinstance(value, Node):
+                internals.append('%7s%s:' % ('', key))
+                internals.extend(['%9s%s' % ('', line)
+                                  for line in value.pformat().splitlines()])
+            elif value and isinstance(value, list) \
+                  and isinstance(value[0], Node):
+                internals.append('%7s%s:' % ('', key))
+                for v in value:
+                    internals.extend(['%9s%s' % ('', line)
+                                      for line in v.pformat().splitlines()])
+            else:
+                internals.append('%7s%s: %r' % ('', key, value))
+        return (Element.pformat(self, indent, level)
+                + ''.join([('    %s%s\n' % (indent * level, line))
+                           for line in internals]))
+
+    def copy(self):
+        return self.__class__(self.transform, self.details, self.rawsource,
+                              **self.attributes)
+
+
+class raw(Special, Inline, PreBibliographic, FixedTextElement):
+
+    """
+    Raw data that is to be passed untouched to the Writer.
+    """
+
+    pass
+
+
+# =================
+#  Inline Elements
+# =================
+
+class emphasis(Inline, TextElement): pass
+class strong(Inline, TextElement): pass
+class literal(Inline, TextElement): pass
+class reference(General, Inline, Referential, TextElement): pass
+class footnote_reference(Inline, Referential, TextElement): pass
+class citation_reference(Inline, Referential, TextElement): pass
+class substitution_reference(Inline, TextElement): pass
+class title_reference(Inline, TextElement): pass
+class abbreviation(Inline, TextElement): pass
+class acronym(Inline, TextElement): pass
+class superscript(Inline, TextElement): pass
+class subscript(Inline, TextElement): pass
+class math(Inline, TextElement): pass
+
+
+class image(General, Inline, Element):
+
+    def astext(self):
+        return self.get('alt', '')
+
+
+class inline(Inline, TextElement): pass
+class problematic(Inline, TextElement): pass
+class generated(Inline, TextElement): pass
+
+
+# ========================================
+#  Auxiliary Classes, Functions, and Data
+# ========================================
+
+node_class_names = """
+    Text
+    abbreviation acronym address admonition attention attribution author
+        authors
+    block_quote bullet_list
+    caption caution citation citation_reference classifier colspec comment
+        compound contact container copyright
+    danger date decoration definition definition_list definition_list_item
+        description docinfo doctest_block document
+    emphasis entry enumerated_list error
+    field field_body field_list field_name figure footer
+        footnote footnote_reference
+    generated
+    header hint
+    image important inline
+    label legend line line_block list_item literal literal_block
+    math math_block
+    note
+    option option_argument option_group option_list option_list_item
+        option_string organization
+    paragraph pending problematic
+    raw reference revision row rubric
+    section sidebar status strong subscript substitution_definition
+        substitution_reference subtitle superscript system_message
+    table target tbody term tgroup thead tip title title_reference topic
+        transition
+    version
+    warning""".split()
+"""A list of names of all concrete Node subclasses."""
+
+
+class NodeVisitor:
+
+    """
+    "Visitor" pattern [GoF95]_ abstract superclass implementation for
+    document tree traversals.
+
+    Each node class has corresponding methods, doing nothing by
+    default; override individual methods for specific and useful
+    behaviour.  The `dispatch_visit()` method is called by
+    `Node.walk()` upon entering a node.  `Node.walkabout()` also calls
+    the `dispatch_departure()` method before exiting a node.
+
+    The dispatch methods call "``visit_`` + node class name" or
+    "``depart_`` + node class name", resp.
+
+    This is a base class for visitors whose ``visit_...`` & ``depart_...``
+    methods should be implemented for *all* node types encountered (such as
+    for `docutils.writers.Writer` subclasses).  Unimplemented methods will
+    raise exceptions.
+
+    For sparse traversals, where only certain node types are of interest,
+    subclass `SparseNodeVisitor` instead.  When (mostly or entirely) uniform
+    processing is desired, subclass `GenericNodeVisitor`.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    optional = ()
+    """
+    Tuple containing node class names (as strings).
+
+    No exception will be raised if writers do not implement visit
+    or departure functions for these node classes.
+
+    Used to ensure transitional compatibility with existing 3rd-party writers.
+    """
+
+    def __init__(self, document):
+        self.document = document
+
+    def dispatch_visit(self, node):
+        """
+        Call self."``visit_`` + node class name" with `node` as
+        parameter.  If the ``visit_...`` method does not exist, call
+        self.unknown_visit.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'visit_' + node_name, self.unknown_visit)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_visit calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def dispatch_departure(self, node):
+        """
+        Call self."``depart_`` + node class name" with `node` as
+        parameter.  If the ``depart_...`` method does not exist, call
+        self.unknown_departure.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'depart_' + node_name, self.unknown_departure)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_departure calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def unknown_visit(self, node):
+        """
+        Called when entering unknown `Node` types.
+
+        Raise an exception unless overridden.
+        """
+        if  (self.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s visiting unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+    def unknown_departure(self, node):
+        """
+        Called before exiting unknown `Node` types.
+
+        Raise exception unless overridden.
+        """
+        if  (self.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s departing unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+
+class SparseNodeVisitor(NodeVisitor):
+
+    """
+    Base class for sparse traversals, where only certain node types are of
+    interest.  When ``visit_...`` & ``depart_...`` methods should be
+    implemented for *all* node types (such as for `docutils.writers.Writer`
+    subclasses), subclass `NodeVisitor` instead.
+    """
+
+
+class GenericNodeVisitor(NodeVisitor):
+
+    """
+    Generic "Visitor" abstract superclass, for simple traversals.
+
+    Unless overridden, each ``visit_...`` method calls `default_visit()`, and
+    each ``depart_...`` method (when using `Node.walkabout()`) calls
+    `default_departure()`. `default_visit()` (and `default_departure()`) must
+    be overridden in subclasses.
+
+    Define fully generic visitors by overriding `default_visit()` (and
+    `default_departure()`) only. Define semi-generic visitors by overriding
+    individual ``visit_...()`` (and ``depart_...()``) methods also.
+
+    `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should
+    be overridden for default behavior.
+    """
+
+    def default_visit(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+    def default_departure(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+def _call_default_visit(self, node):
+    self.default_visit(node)
+
+def _call_default_departure(self, node):
+    self.default_departure(node)
+
+def _nop(self, node):
+    pass
+
+def _add_node_class_names(names):
+    """Save typing with dynamic assignments:"""
+    for _name in names:
+        setattr(GenericNodeVisitor, "visit_" + _name, _call_default_visit)
+        setattr(GenericNodeVisitor, "depart_" + _name, _call_default_departure)
+        setattr(SparseNodeVisitor, 'visit_' + _name, _nop)
+        setattr(SparseNodeVisitor, 'depart_' + _name, _nop)
+
+_add_node_class_names(node_class_names)
+
+
+class TreeCopyVisitor(GenericNodeVisitor):
+
+    """
+    Make a complete copy of a tree or branch, including element attributes.
+    """
+
+    def __init__(self, document):
+        GenericNodeVisitor.__init__(self, document)
+        self.parent_stack = []
+        self.parent = []
+
+    def get_tree_copy(self):
+        return self.parent[0]
+
+    def default_visit(self, node):
+        """Copy the current node, and make it the new acting parent."""
+        newnode = node.copy()
+        self.parent.append(newnode)
+        self.parent_stack.append(self.parent)
+        self.parent = newnode
+
+    def default_departure(self, node):
+        """Restore the previous acting parent."""
+        self.parent = self.parent_stack.pop()
+
+
+class TreePruningException(Exception):
+
+    """
+    Base class for `NodeVisitor`-related tree pruning exceptions.
+
+    Raise subclasses from within ``visit_...`` or ``depart_...`` methods
+    called from `Node.walk()` and `Node.walkabout()` tree traversals to prune
+    the tree traversed.
+    """
+
+    pass
+
+
+class SkipChildren(TreePruningException):
+
+    """
+    Do not visit any children of the current node.  The current node's
+    siblings and ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipSiblings(TreePruningException):
+
+    """
+    Do not visit any more siblings (to the right) of the current node.  The
+    current node's children and its ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipNode(TreePruningException):
+
+    """
+    Do not visit the current node's children, and do not call the current
+    node's ``depart_...`` method.
+    """
+
+    pass
+
+
+class SkipDeparture(TreePruningException):
+
+    """
+    Do not call the current node's ``depart_...`` method.  The current node's
+    children and siblings are not affected.
+    """
+
+    pass
+
+
+class NodeFound(TreePruningException):
+
+    """
+    Raise to indicate that the target of a search has been found.  This
+    exception must be caught by the client; it is not caught by the traversal
+    code.
+    """
+
+    pass
+
+
+class StopTraversal(TreePruningException):
+
+    """
+    Stop the traversal alltogether.  The current node's ``depart_...`` method
+    is not affected.  The parent nodes ``depart_...`` methods are also called
+    as usual.  No other nodes are visited.  This is an alternative to
+    NodeFound that does not cause exception handling to trickle up to the
+    caller.
+    """
+
+    pass
+
+
+def make_id(string):
+    """
+    Convert `string` into an identifier and return it.
+
+    Docutils identifiers will conform to the regular expression
+    ``[a-z](-?[a-z0-9]+)*``.  For CSS compatibility, identifiers (the "class"
+    and "id" attributes) should have no underscores, colons, or periods.
+    Hyphens may be used.
+
+    - The `HTML 4.01 spec`_ defines identifiers based on SGML tokens:
+
+          ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
+          followed by any number of letters, digits ([0-9]), hyphens ("-"),
+          underscores ("_"), colons (":"), and periods (".").
+
+    - However the `CSS1 spec`_ defines identifiers based on the "name" token,
+      a tighter interpretation ("flex" tokenizer notation; "latin1" and
+      "escape" 8-bit characters have been replaced with entities)::
+
+          unicode     \\[0-9a-f]{1,4}
+          latin1      [&iexcl;-&yuml;]
+          escape      {unicode}|\\[ -~&iexcl;-&yuml;]
+          nmchar      [-a-z0-9]|{latin1}|{escape}
+          name        {nmchar}+
+
+    The CSS1 "nmchar" rule does not include underscores ("_"), colons (":"),
+    or periods ("."), therefore "class" and "id" attributes should not contain
+    these characters. They should be replaced with hyphens ("-"). Combined
+    with HTML's requirements (the first character must be a letter; no
+    "unicode", "latin1", or "escape" characters), this results in the
+    ``[a-z](-?[a-z0-9]+)*`` pattern.
+
+    .. _HTML 4.01 spec: http://www.w3.org/TR/html401
+    .. _CSS1 spec: http://www.w3.org/TR/REC-CSS1
+    """
+    id = string.lower()
+    if not isinstance(id, unicode):
+        id = id.decode()
+    id = id.translate(_non_id_translate_digraphs)
+    id = id.translate(_non_id_translate)
+    # get rid of non-ascii characters.
+    # 'ascii' lowercase to prevent problems with turkish locale.
+    id = unicodedata.normalize('NFKD', id).\
+         encode('ascii', 'ignore').decode('ascii')
+    # shrink runs of whitespace and replace by hyphen
+    id = _non_id_chars.sub('-', ' '.join(id.split()))
+    id = _non_id_at_ends.sub('', id)
+    return str(id)
+
+_non_id_chars = re.compile('[^a-z0-9]+')
+_non_id_at_ends = re.compile('^[-0-9]+|-+$')
+_non_id_translate = {
+    0x00f8: u'o',       # o with stroke
+    0x0111: u'd',       # d with stroke
+    0x0127: u'h',       # h with stroke
+    0x0131: u'i',       # dotless i
+    0x0142: u'l',       # l with stroke
+    0x0167: u't',       # t with stroke
+    0x0180: u'b',       # b with stroke
+    0x0183: u'b',       # b with topbar
+    0x0188: u'c',       # c with hook
+    0x018c: u'd',       # d with topbar
+    0x0192: u'f',       # f with hook
+    0x0199: u'k',       # k with hook
+    0x019a: u'l',       # l with bar
+    0x019e: u'n',       # n with long right leg
+    0x01a5: u'p',       # p with hook
+    0x01ab: u't',       # t with palatal hook
+    0x01ad: u't',       # t with hook
+    0x01b4: u'y',       # y with hook
+    0x01b6: u'z',       # z with stroke
+    0x01e5: u'g',       # g with stroke
+    0x0225: u'z',       # z with hook
+    0x0234: u'l',       # l with curl
+    0x0235: u'n',       # n with curl
+    0x0236: u't',       # t with curl
+    0x0237: u'j',       # dotless j
+    0x023c: u'c',       # c with stroke
+    0x023f: u's',       # s with swash tail
+    0x0240: u'z',       # z with swash tail
+    0x0247: u'e',       # e with stroke
+    0x0249: u'j',       # j with stroke
+    0x024b: u'q',       # q with hook tail
+    0x024d: u'r',       # r with stroke
+    0x024f: u'y',       # y with stroke
+}
+_non_id_translate_digraphs = {
+    0x00df: u'sz',      # ligature sz
+    0x00e6: u'ae',      # ae
+    0x0153: u'oe',      # ligature oe
+    0x0238: u'db',      # db digraph
+    0x0239: u'qp',      # qp digraph
+}
+
+def dupname(node, name):
+    node['dupnames'].append(name)
+    node['names'].remove(name)
+    # Assume that this method is referenced, even though it isn't; we
+    # don't want to throw unnecessary system_messages.
+    node.referenced = 1
+
+def fully_normalize_name(name):
+    """Return a case- and whitespace-normalized name."""
+    return ' '.join(name.lower().split())
+
+def whitespace_normalize_name(name):
+    """Return a whitespace-normalized name."""
+    return ' '.join(name.split())
+
+def serial_escape(value):
+    """Escape string values that are elements of a list, for serialization."""
+    return value.replace('\\', r'\\').replace(' ', r'\ ')
+
+def pseudo_quoteattr(value):
+    """Quote attributes for pseudo-xml"""
+    return '"%s"' % value
+
+# 
+#
+# Local Variables:
+# indent-tabs-mode: nil
+# sentence-end-double-space: t
+# fill-column: 78
+# End:
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/docutils_xml.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/docutils_xml.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/docutils_xml.py	(revision 1126)
@@ -0,0 +1,204 @@
+# $Id: docutils_xml.py 7966 2016-08-18 13:06:09Z milde $
+# Author: David Goodger, Paul Tremblay, Guenter Milde
+# Maintainer: docutils-develop@lists.sourceforge.net
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple document tree Writer, writes Docutils XML according to
+http://docutils.sourceforge.net/docs/ref/docutils.dtd.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+
+# Work around broken PyXML and obsolete python stdlib behaviour. (The stdlib
+# replaces its own xml module with PyXML if the latter is installed. However,
+# PyXML is no longer maintained and partially incompatible/buggy.) Reverse
+# the order in which xml module and submodules are searched to import stdlib
+# modules if they exist and PyXML modules if they do not exist in the stdlib.
+#
+# See http://sourceforge.net/tracker/index.php?func=detail&aid=3552403&group_id=38414&atid=422030
+# and http://lists.fedoraproject.org/pipermail/python-devel/2012-July/000406.html
+import xml
+if "_xmlplus" in xml.__path__[0]: # PyXML sub-module
+    xml.__path__.reverse() # If both are available, prefer stdlib over PyXML
+
+import xml.sax.saxutils
+from StringIO import StringIO
+
+import docutils
+from docutils import frontend, writers, nodes
+
+
+class RawXmlError(docutils.ApplicationError): pass
+
+
+class Writer(writers.Writer):
+
+    supported = ('xml',)
+    """Formats this writer supports."""
+
+    settings_spec = (
+        '"Docutils XML" Writer Options',
+        None,
+        (('Generate XML with newlines before and after tags.',
+          ['--newlines'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Generate XML with indents and newlines.',
+          ['--indents'], #@ TODO use integer value for number of spaces?
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Omit the DOCTYPE declaration.',
+          ['--no-doctype'],
+          {'dest': 'doctype_declaration', 'default': 1,
+           'action': 'store_false', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    config_section = 'docutils_xml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = XMLTranslator
+
+    def translate(self):
+        self.visitor = visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        self.output = ''.join(visitor.output)
+
+
+class XMLTranslator(nodes.GenericNodeVisitor):
+
+    xml_declaration = '<?xml version="1.0" encoding="%s"?>\n'
+    # TODO: add stylesheet options similar to HTML and LaTeX writers?
+    #xml_stylesheet = '<?xml-stylesheet type="text/xsl" href="%s"?>\n'
+    doctype = (
+        '<!DOCTYPE document PUBLIC'
+        ' "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML"'
+        ' "http://docutils.sourceforge.net/docs/ref/docutils.dtd">\n')
+    generator = '<!-- Generated by Docutils %s -->\n'
+
+    xmlparser = xml.sax.make_parser()
+    """SAX parser instance to check/exctract raw XML."""
+    xmlparser.setFeature(
+        "http://xml.org/sax/features/external-general-entities", True)
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+
+        # Reporter
+        self.warn = self.document.reporter.warning
+        self.error = self.document.reporter.error
+
+        # Settings
+        self.settings = settings = document.settings
+        self.indent = self.newline = ''
+        if settings.newlines:
+            self.newline = '\n'
+        if settings.indents:
+            self.newline = '\n'
+            self.indent = '    ' #@ TODO make this configurable?
+        self.level = 0  # indentation level
+        self.in_simple = 0 # level of nesting inside mixed-content elements
+        self.fixed_text = 0 # level of nesting inside FixedText elements
+
+        # Output
+        self.output = []
+        if settings.xml_declaration:
+            self.output.append(
+                self.xml_declaration % settings.output_encoding)
+        if settings.doctype_declaration:
+            self.output.append(self.doctype)
+        self.output.append(self.generator % docutils.__version__)
+
+        # initialize XML parser
+        self.the_handle=TestXml()
+        self.xmlparser.setContentHandler(self.the_handle)
+
+    # generic visit and depart methods
+    # --------------------------------
+
+    simple_nodes = (nodes.TextElement,
+                    nodes.image, nodes.colspec, nodes.transition) # empty elements
+
+    def default_visit(self, node):
+        """Default node visit method."""
+        if not self.in_simple:
+            self.output.append(self.indent*self.level)
+        self.output.append(node.starttag(xml.sax.saxutils.quoteattr))
+        self.level += 1
+        # @@ make nodes.literal an instance of FixedTextElement?
+        if isinstance(node, (nodes.FixedTextElement, nodes.literal)):
+            self.fixed_text += 1
+        if isinstance(node, self.simple_nodes):
+            self.in_simple += 1
+        if not self.in_simple:
+            self.output.append(self.newline)
+
+    def default_departure(self, node):
+        """Default node depart method."""
+        self.level -= 1
+        if not self.in_simple:
+            self.output.append(self.indent*self.level)
+        self.output.append(node.endtag())
+        if isinstance(node, (nodes.FixedTextElement, nodes.literal)):
+            self.fixed_text -= 1
+        if isinstance(node, self.simple_nodes):
+            self.in_simple -= 1
+        if not self.in_simple:
+            self.output.append(self.newline)
+
+
+    # specific visit and depart methods
+    # ---------------------------------
+
+    def visit_Text(self, node):
+        text = xml.sax.saxutils.escape(node.astext())
+        # indent text if we are not in a FixedText element:
+        if not self.fixed_text:
+            text = text.replace('\n', '\n'+self.indent*self.level)
+        self.output.append(text)
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_raw(self, node):
+        if 'xml' not in node.get('format', '').split():
+            # skip other raw content?
+            # raise nodes.SkipNode
+            self.default_visit(node)
+            return
+        # wrap in <raw> element
+        self.default_visit(node)      # or not?
+        xml_string = node.astext()
+        self.output.append(xml_string)
+        self.default_departure(node)  # or not?
+        # Check validity of raw XML:
+        if isinstance(xml_string, unicode) and sys.version_info < (3,):
+            xml_string = xml_string.encode('utf8')
+        try:
+            self.xmlparser.parse(StringIO(xml_string))
+        except xml.sax._exceptions.SAXParseException, error:
+            col_num = self.the_handle.locator.getColumnNumber()
+            line_num =  self.the_handle.locator.getLineNumber()
+            srcline = node.line
+            if not isinstance(node.parent, nodes.TextElement):
+                srcline += 2 # directive content start line
+            msg = 'Invalid raw XML in column %d, line offset %d:\n%s' % (
+                   col_num, line_num, node.astext())
+            self.warn(msg, source=node.source, line=srcline+line_num-1)
+        raise nodes.SkipNode # content already processed
+
+
+class TestXml(xml.sax.ContentHandler):
+
+    def setDocumentLocator(self, locator):
+        self.locator = locator
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/xetex/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/xetex/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/xetex/__init__.py	(revision 1126)
@@ -0,0 +1,138 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# :Author: Günter Milde <milde@users.sourceforge.net>
+# :Revision: $Revision: 7852 $
+# :Date: $Date: 2015-03-21 16:07:49 +0000 (Sat, 21 Mar 2015) $
+# :Copyright: © 2010 Günter Milde.
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+# 
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+# 
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+"""
+XeLaTeX document tree Writer.
+
+A variant of Docutils' standard 'latex2e' writer producing LaTeX output
+suited for processing with the Unicode-aware TeX engines
+LuaTeX and XeTeX.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os
+import os.path
+import re
+
+import docutils
+from docutils import frontend, nodes, utils, writers, languages
+from docutils.writers import latex2e
+
+class Writer(latex2e.Writer):
+    """A writer for Unicode-aware LaTeX variants (XeTeX, LuaTeX)"""
+
+    supported = ('lxtex', 'xetex','xelatex','luatex', 'lualatex')
+    """Formats this writer supports."""
+
+    default_template = 'xelatex.tex'
+    default_preamble = '\n'.join([
+        r'% Linux Libertine (free, wide coverage, not only for Linux)',
+        r'\setmainfont{Linux Libertine O}',
+        r'\setsansfont{Linux Biolinum O}',
+        r'\setmonofont[HyphenChar=None,Scale=MatchLowercase]{DejaVu Sans Mono}',
+    ])
+
+    config_section = 'xetex writer'
+    config_section_dependencies = ('writers', 'latex2e writer')
+
+    settings_spec = frontend.filter_settings_spec(
+        latex2e.Writer.settings_spec,
+        'font_encoding',
+        template=('Template file. Default: "%s".' % default_template,
+          ['--template'], {'default': default_template, 'metavar': '<file>'}),
+        latex_preamble=('Customization by LaTeX code in the preamble. '
+          'Default: select "Linux Libertine" fonts.',
+          ['--latex-preamble'],
+          {'default': default_preamble}),
+        )
+
+    def __init__(self):
+        latex2e.Writer.__init__(self)
+        self.settings_defaults.update({'fontencoding': ''}) # use default (EU1 or EU2)
+        self.translator_class = XeLaTeXTranslator
+
+
+class Babel(latex2e.Babel):
+    """Language specifics for XeTeX.
+
+    Use `polyglossia` instead of `babel` and adapt settings.
+    """
+    language_codes = latex2e.Babel.language_codes.copy()
+    # Additionally supported or differently named languages:
+    language_codes.update({
+        # code          Polyglossia-name       comment
+        'cop':          'coptic',
+        'de':           'german', # new spelling (de_1996)
+        'de-1901':      'ogerman', # old spelling
+        'dv':           'divehi',  # Maldivian
+        'dsb':          'lsorbian',
+        'el-polyton':   'polygreek',
+        'fa':           'farsi',
+        'grc':          'ancientgreek',
+        'hsb':          'usorbian',
+        'sh-Cyrl':      'serbian', # Serbo-Croatian, Cyrillic script
+        'sh-Latn':      'croatian', # Serbo-Croatian, Latin script
+        'sq':           'albanian',
+        'sr':           'serbian', # Cyrillic script (sr-Cyrl)
+        'th':           'thai',
+        'vi':           'vietnamese',
+        # zh-Latn:      ???        #     Chinese Pinyin
+        })
+    # normalize (downcase) keys
+    language_codes = dict([(k.lower(), v) for (k,v) in language_codes.items()])
+
+    # Languages without Polyglossia support:
+    for key in ('af',           # 'afrikaans',
+                'de-AT',        # 'naustrian',
+                'de-AT-1901',   # 'austrian',
+                'fr-CA',        # 'canadien',
+                'grc-ibycus',   # 'ibycus', (Greek Ibycus encoding)
+                'sr-Latn',      # 'serbian script=latin'
+               ):
+        del(language_codes[key.lower()])
+
+    def __init__(self, language_code, reporter):
+        self.language_code = language_code
+        self.reporter = reporter
+        self.language = self.language_name(language_code)
+        self.otherlanguages = {}
+        self.warn_msg = 'Language "%s" not supported by XeTeX (polyglossia).'
+        self.quote_index = 0
+        self.quotes = ('"', '"')
+        # language dependent configuration:
+        # double quotes are "active" in some languages (e.g. German).
+        self.literal_double_quote = u'"' # TODO: use \textquotedbl
+
+    def __call__(self):
+        setup = [r'\usepackage{polyglossia}',
+                 r'\setdefaultlanguage{%s}' % self.language]
+        if self.otherlanguages:
+            setup.append(r'\setotherlanguages{%s}' %
+                         ','.join(sorted(self.otherlanguages.keys())))
+        return '\n'.join(setup)
+
+
+class XeLaTeXTranslator(latex2e.LaTeXTranslator):
+
+    def __init__(self, document):
+        self.is_xetex = True  # typeset with XeTeX or LuaTeX engine
+        latex2e.LaTeXTranslator.__init__(self, document, Babel)
+        if self.latex_encoding == 'utf8':
+            self.requirements.pop('_inputenc', None)
+        else:
+            self.requirements['_inputenc'] = (r'\XeTeXinputencoding %s '
+                                              % self.latex_encoding)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/pygmentsformatter.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/pygmentsformatter.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/pygmentsformatter.py	(revision 1126)
@@ -0,0 +1,109 @@
+# $Id: pygmentsformatter.py 5853 2009-01-19 21:02:02Z dkuhlman $
+# Author: Dave Kuhlman <dkuhlman@rexx.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+
+Additional support for Pygments formatter.
+
+"""
+
+
+import pygments
+import pygments.formatter
+
+
+class OdtPygmentsFormatter(pygments.formatter.Formatter):
+    def __init__(self, rststyle_function, escape_function):
+        pygments.formatter.Formatter.__init__(self)
+        self.rststyle_function = rststyle_function
+        self.escape_function = escape_function
+
+    def rststyle(self, name, parameters=( )):
+        return self.rststyle_function(name, parameters)
+
+
+class OdtPygmentsProgFormatter(OdtPygmentsFormatter):
+    def format(self, tokensource, outfile):
+        tokenclass = pygments.token.Token
+        for ttype, value in tokensource:
+            value = self.escape_function(value)
+            if ttype == tokenclass.Keyword:
+                s2 = self.rststyle('codeblock-keyword')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Literal.String:
+                s2 = self.rststyle('codeblock-string')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype in (
+                    tokenclass.Literal.Number.Integer,
+                    tokenclass.Literal.Number.Integer.Long,
+                    tokenclass.Literal.Number.Float,
+                    tokenclass.Literal.Number.Hex,
+                    tokenclass.Literal.Number.Oct,
+                    tokenclass.Literal.Number,
+                    ):
+                s2 = self.rststyle('codeblock-number')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Operator:
+                s2 = self.rststyle('codeblock-operator')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Comment:
+                s2 = self.rststyle('codeblock-comment')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Name.Class:
+                s2 = self.rststyle('codeblock-classname')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Name.Function:
+                s2 = self.rststyle('codeblock-functionname')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Name:
+                s2 = self.rststyle('codeblock-name')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            else:
+                s1 = value
+            outfile.write(s1)
+
+
+class OdtPygmentsLaTeXFormatter(OdtPygmentsFormatter):
+    def format(self, tokensource, outfile):
+        tokenclass = pygments.token.Token
+        for ttype, value in tokensource:
+            value = self.escape_function(value)
+            if ttype == tokenclass.Keyword:
+                s2 = self.rststyle('codeblock-keyword')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype in (tokenclass.Literal.String,
+                    tokenclass.Literal.String.Backtick,
+                    ):
+                s2 = self.rststyle('codeblock-string')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Name.Attribute:
+                s2 = self.rststyle('codeblock-operator')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            elif ttype == tokenclass.Comment:
+                if value[-1] == '\n':
+                    s2 = self.rststyle('codeblock-comment')
+                    s1 = '<text:span text:style-name="%s">%s</text:span>\n' % \
+                        (s2, value[:-1], )
+                else:
+                    s2 = self.rststyle('codeblock-comment')
+                    s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                        (s2, value, )
+            elif ttype == tokenclass.Name.Builtin:
+                s2 = self.rststyle('codeblock-name')
+                s1 = '<text:span text:style-name="%s">%s</text:span>' % \
+                    (s2, value, )
+            else:
+                s1 = value
+            outfile.write(s1)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/__init__.py	(revision 1126)
@@ -0,0 +1,3307 @@
+# $Id: __init__.py 7899 2015-06-03 22:02:46Z timehorse $
+# Author: Dave Kuhlman <dkuhlman@rexx.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Open Document Format (ODF) Writer.
+
+"""
+
+VERSION = '1.0a'
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import tempfile
+import zipfile
+from xml.dom import minidom
+import time
+import re
+import StringIO
+import copy
+import urllib2
+import docutils
+from docutils import frontend, nodes, utils, writers, languages
+from docutils.readers import standalone
+from docutils.transforms import references
+
+
+WhichElementTree = ''
+try:
+    # 1. Try to use lxml.
+    #from lxml import etree
+    #WhichElementTree = 'lxml'
+    raise ImportError('Ignoring lxml')
+except ImportError, e:
+    try:
+        # 2. Try to use ElementTree from the Python standard library.
+        from xml.etree import ElementTree as etree
+        WhichElementTree = 'elementtree'
+    except ImportError, e:
+        try:
+            # 3. Try to use a version of ElementTree installed as a separate
+            #    product.
+            from elementtree import ElementTree as etree
+            WhichElementTree = 'elementtree'
+        except ImportError, e:
+            s1 = 'Must install either a version of Python containing ' \
+                 'ElementTree (Python version >=2.5) or install ElementTree.'
+            raise ImportError(s1)
+
+#
+# Import pygments and odtwriter pygments formatters if possible.
+try:
+    import pygments
+    import pygments.lexers
+    from pygmentsformatter import OdtPygmentsProgFormatter, \
+        OdtPygmentsLaTeXFormatter
+except (ImportError, SyntaxError), exp:
+    pygments = None
+
+# check for the Python Imaging Library
+try:
+    import PIL.Image
+except ImportError:
+    try:  # sometimes PIL modules are put in PYTHONPATH's root
+        import Image
+        class PIL(object): pass  # dummy wrapper
+        PIL.Image = Image
+    except ImportError:
+        PIL = None
+
+## import warnings
+## warnings.warn('importing IPShellEmbed', UserWarning)
+## from IPython.Shell import IPShellEmbed
+## args = ['-pdb', '-pi1', 'In <\\#>: ', '-pi2', '   .\\D.: ',
+##         '-po', 'Out<\\#>: ', '-nosep']
+## ipshell = IPShellEmbed(args,
+##                        banner = 'Entering IPython.  Press Ctrl-D to exit.',
+##                        exit_msg = 'Leaving Interpreter, back to program.')
+
+
+#
+# ElementTree does not support getparent method (lxml does).
+# This wrapper class and the following support functions provide
+#   that support for the ability to get the parent of an element.
+#
+if WhichElementTree == 'elementtree':
+    import weakref
+    _parents = weakref.WeakKeyDictionary()
+    if isinstance(etree.Element, type):
+        _ElementInterface = etree.Element
+    else:
+        _ElementInterface = etree._ElementInterface
+    class _ElementInterfaceWrapper(_ElementInterface):
+        def __init__(self, tag, attrib=None):
+            _ElementInterface.__init__(self, tag, attrib)
+            _parents[self] = None
+        def setparent(self, parent):
+            _parents[self] = parent
+        def getparent(self):
+            return _parents[self]
+
+
+#
+# Constants and globals
+
+SPACES_PATTERN = re.compile(r'( +)')
+TABS_PATTERN = re.compile(r'(\t+)')
+FILL_PAT1 = re.compile(r'^ +')
+FILL_PAT2 = re.compile(r' {2,}')
+
+TABLESTYLEPREFIX = 'rststyle-table-'
+TABLENAMEDEFAULT = '%s0' % TABLESTYLEPREFIX
+TABLEPROPERTYNAMES = ('border', 'border-top', 'border-left',
+    'border-right', 'border-bottom', )
+
+GENERATOR_DESC = 'Docutils.org/odf_odt'
+
+NAME_SPACE_1 = 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'
+
+CONTENT_NAMESPACE_DICT = CNSD = {
+#    'office:version': '1.0',
+    'chart': 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0',
+    'dc': 'http://purl.org/dc/elements/1.1/',
+    'dom': 'http://www.w3.org/2001/xml-events',
+    'dr3d': 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0',
+    'draw': 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0',
+    'fo': 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0',
+    'form': 'urn:oasis:names:tc:opendocument:xmlns:form:1.0',
+    'math': 'http://www.w3.org/1998/Math/MathML',
+    'meta': 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
+    'number': 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0',
+    'office': NAME_SPACE_1,
+    'ooo': 'http://openoffice.org/2004/office',
+    'oooc': 'http://openoffice.org/2004/calc',
+    'ooow': 'http://openoffice.org/2004/writer',
+    'presentation': 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0',
+
+    'script': 'urn:oasis:names:tc:opendocument:xmlns:script:1.0',
+    'style': 'urn:oasis:names:tc:opendocument:xmlns:style:1.0',
+    'svg': 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0',
+    'table': 'urn:oasis:names:tc:opendocument:xmlns:table:1.0',
+    'text': 'urn:oasis:names:tc:opendocument:xmlns:text:1.0',
+    'xforms': 'http://www.w3.org/2002/xforms',
+    'xlink': 'http://www.w3.org/1999/xlink',
+    'xsd': 'http://www.w3.org/2001/XMLSchema',
+    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+    }
+
+STYLES_NAMESPACE_DICT = SNSD = {
+#    'office:version': '1.0',
+    'chart': 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0',
+    'dc': 'http://purl.org/dc/elements/1.1/',
+    'dom': 'http://www.w3.org/2001/xml-events',
+    'dr3d': 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0',
+    'draw': 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0',
+    'fo': 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0',
+    'form': 'urn:oasis:names:tc:opendocument:xmlns:form:1.0',
+    'math': 'http://www.w3.org/1998/Math/MathML',
+    'meta': 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
+    'number': 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0',
+    'office': NAME_SPACE_1,
+    'presentation': 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0',
+    'ooo': 'http://openoffice.org/2004/office',
+    'oooc': 'http://openoffice.org/2004/calc',
+    'ooow': 'http://openoffice.org/2004/writer',
+    'script': 'urn:oasis:names:tc:opendocument:xmlns:script:1.0',
+    'style': 'urn:oasis:names:tc:opendocument:xmlns:style:1.0',
+    'svg': 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0',
+    'table': 'urn:oasis:names:tc:opendocument:xmlns:table:1.0',
+    'text': 'urn:oasis:names:tc:opendocument:xmlns:text:1.0',
+    'xlink': 'http://www.w3.org/1999/xlink',
+    }
+
+MANIFEST_NAMESPACE_DICT = MANNSD = {
+    'manifest': 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0',
+}
+
+META_NAMESPACE_DICT = METNSD = {
+#    'office:version': '1.0',
+    'dc': 'http://purl.org/dc/elements/1.1/',
+    'meta': 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
+    'office': NAME_SPACE_1,
+    'ooo': 'http://openoffice.org/2004/office',
+    'xlink': 'http://www.w3.org/1999/xlink',
+}
+
+#
+# Attribute dictionaries for use with ElementTree (not lxml), which
+#   does not support use of nsmap parameter on Element() and SubElement().
+
+CONTENT_NAMESPACE_ATTRIB = {
+    #'office:version': '1.0',
+    'xmlns:chart': 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0',
+    'xmlns:dc': 'http://purl.org/dc/elements/1.1/',
+    'xmlns:dom': 'http://www.w3.org/2001/xml-events',
+    'xmlns:dr3d': 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0',
+    'xmlns:draw': 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0',
+    'xmlns:fo': 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0',
+    'xmlns:form': 'urn:oasis:names:tc:opendocument:xmlns:form:1.0',
+    'xmlns:math': 'http://www.w3.org/1998/Math/MathML',
+    'xmlns:meta': 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
+    'xmlns:number': 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0',
+    'xmlns:office': NAME_SPACE_1,
+    'xmlns:presentation': 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0',
+    'xmlns:ooo': 'http://openoffice.org/2004/office',
+    'xmlns:oooc': 'http://openoffice.org/2004/calc',
+    'xmlns:ooow': 'http://openoffice.org/2004/writer',
+    'xmlns:script': 'urn:oasis:names:tc:opendocument:xmlns:script:1.0',
+    'xmlns:style': 'urn:oasis:names:tc:opendocument:xmlns:style:1.0',
+    'xmlns:svg': 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0',
+    'xmlns:table': 'urn:oasis:names:tc:opendocument:xmlns:table:1.0',
+    'xmlns:text': 'urn:oasis:names:tc:opendocument:xmlns:text:1.0',
+    'xmlns:xforms': 'http://www.w3.org/2002/xforms',
+    'xmlns:xlink': 'http://www.w3.org/1999/xlink',
+    'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema',
+    'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+    }
+
+STYLES_NAMESPACE_ATTRIB = {
+    #'office:version': '1.0',
+    'xmlns:chart': 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0',
+    'xmlns:dc': 'http://purl.org/dc/elements/1.1/',
+    'xmlns:dom': 'http://www.w3.org/2001/xml-events',
+    'xmlns:dr3d': 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0',
+    'xmlns:draw': 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0',
+    'xmlns:fo': 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0',
+    'xmlns:form': 'urn:oasis:names:tc:opendocument:xmlns:form:1.0',
+    'xmlns:math': 'http://www.w3.org/1998/Math/MathML',
+    'xmlns:meta': 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
+    'xmlns:number': 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0',
+    'xmlns:office': NAME_SPACE_1,
+    'xmlns:presentation': 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0',
+    'xmlns:ooo': 'http://openoffice.org/2004/office',
+    'xmlns:oooc': 'http://openoffice.org/2004/calc',
+    'xmlns:ooow': 'http://openoffice.org/2004/writer',
+    'xmlns:script': 'urn:oasis:names:tc:opendocument:xmlns:script:1.0',
+    'xmlns:style': 'urn:oasis:names:tc:opendocument:xmlns:style:1.0',
+    'xmlns:svg': 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0',
+    'xmlns:table': 'urn:oasis:names:tc:opendocument:xmlns:table:1.0',
+    'xmlns:text': 'urn:oasis:names:tc:opendocument:xmlns:text:1.0',
+    'xmlns:xlink': 'http://www.w3.org/1999/xlink',
+    }
+
+MANIFEST_NAMESPACE_ATTRIB = {
+    'xmlns:manifest': 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0',
+}
+
+META_NAMESPACE_ATTRIB = {
+    #'office:version': '1.0',
+    'xmlns:dc': 'http://purl.org/dc/elements/1.1/',
+    'xmlns:meta': 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
+    'xmlns:office': NAME_SPACE_1,
+    'xmlns:ooo': 'http://openoffice.org/2004/office',
+    'xmlns:xlink': 'http://www.w3.org/1999/xlink',
+}
+
+
+#
+# Functions
+#
+
+#
+# ElementTree support functions.
+# In order to be able to get the parent of elements, must use these
+#   instead of the functions with same name provided by ElementTree.
+#
+def Element(tag, attrib=None, nsmap=None, nsdict=CNSD):
+    if attrib is None:
+        attrib = {}
+    tag, attrib = fix_ns(tag, attrib, nsdict)
+    if WhichElementTree == 'lxml':
+        el = etree.Element(tag, attrib, nsmap=nsmap)
+    else:
+        el = _ElementInterfaceWrapper(tag, attrib)
+    return el
+
+def SubElement(parent, tag, attrib=None, nsmap=None, nsdict=CNSD):
+    if attrib is None:
+        attrib = {}
+    tag, attrib = fix_ns(tag, attrib, nsdict)
+    if WhichElementTree == 'lxml':
+        el = etree.SubElement(parent, tag, attrib, nsmap=nsmap)
+    else:
+        el = _ElementInterfaceWrapper(tag, attrib)
+        parent.append(el)
+        el.setparent(parent)
+    return el
+
+def fix_ns(tag, attrib, nsdict):
+    nstag = add_ns(tag, nsdict)
+    nsattrib = {}
+    for key, val in attrib.iteritems():
+        nskey = add_ns(key, nsdict)
+        nsattrib[nskey] = val
+    return nstag, nsattrib
+
+def add_ns(tag, nsdict=CNSD):
+    if WhichElementTree == 'lxml':
+        nstag, name = tag.split(':')
+        ns = nsdict.get(nstag)
+        if ns is None:
+            raise RuntimeError, 'Invalid namespace prefix: %s' % nstag
+        tag = '{%s}%s' % (ns, name,)
+    return tag
+
+def ToString(et):
+    outstream = StringIO.StringIO()
+    if sys.version_info >= (3, 2):
+        et.write(outstream, encoding="unicode")
+    else:
+        et.write(outstream)
+    s1 = outstream.getvalue()
+    outstream.close()
+    return s1
+
+
+def escape_cdata(text):
+    text = text.replace("&", "&amp;")
+    text = text.replace("<", "&lt;")
+    text = text.replace(">", "&gt;")
+    ascii = ''
+    for char in text:
+      if ord(char) >= ord("\x7f"):
+          ascii += "&#x%X;" % ( ord(char), )
+      else:
+          ascii += char
+    return ascii
+
+
+
+WORD_SPLIT_PAT1 = re.compile(r'\b(\w*)\b\W*')
+
+def split_words(line):
+    # We need whitespace at the end of the string for our regexpr.
+    line += ' '
+    words = []
+    pos1 = 0
+    mo = WORD_SPLIT_PAT1.search(line, pos1)
+    while mo is not None:
+        word = mo.groups()[0]
+        words.append(word)
+        pos1 = mo.end()
+        mo = WORD_SPLIT_PAT1.search(line, pos1)
+    return words
+
+
+#
+# Classes
+#
+
+
+class TableStyle(object):
+    def __init__(self, border=None, backgroundcolor=None):
+        self.border = border
+        self.backgroundcolor = backgroundcolor
+    def get_border_(self):
+        return self.border_
+    def set_border_(self, border):
+        self.border_ = border
+    border = property(get_border_, set_border_)
+    def get_backgroundcolor_(self):
+        return self.backgroundcolor_
+    def set_backgroundcolor_(self, backgroundcolor):
+        self.backgroundcolor_ = backgroundcolor
+    backgroundcolor = property(get_backgroundcolor_, set_backgroundcolor_)
+
+BUILTIN_DEFAULT_TABLE_STYLE = TableStyle(
+    border = '0.0007in solid #000000')
+
+#
+# Information about the indentation level for lists nested inside
+#   other contexts, e.g. dictionary lists.
+class ListLevel(object):
+    def __init__(self, level, sibling_level=True, nested_level=True):
+        self.level = level
+        self.sibling_level = sibling_level
+        self.nested_level = nested_level
+    def set_sibling(self, sibling_level): self.sibling_level = sibling_level
+    def get_sibling(self): return self.sibling_level
+    def set_nested(self, nested_level): self.nested_level = nested_level
+    def get_nested(self): return self.nested_level
+    def set_level(self, level): self.level = level
+    def get_level(self): return self.level
+
+
+class Writer(writers.Writer):
+
+    MIME_TYPE = 'application/vnd.oasis.opendocument.text'
+    EXTENSION = '.odt'
+
+    supported = ('odt', )
+    """Formats this writer supports."""
+
+    default_stylesheet = 'styles' + EXTENSION
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = (
+        'ODF-Specific Options',
+        None,
+        (
+        ('Specify a stylesheet.  '
+            'Default: "%s"' % default_stylesheet_path,
+            ['--stylesheet'],
+            {
+                'default': default_stylesheet_path,
+                'dest': 'stylesheet'
+                }),
+        ('Specify a configuration/mapping file relative to the '
+            'current working '
+            'directory for additional ODF options.  '
+            'In particular, this file may contain a section named '
+            '"Formats" that maps default style names to '
+            'names to be used in the resulting output file allowing for '
+            'adhering to external standards. '
+            'For more info and the format of the configuration/mapping file, '
+            'see the odtwriter doc.',
+            ['--odf-config-file'],
+            {'metavar': '<file>'}),
+        ('Obfuscate email addresses to confuse harvesters while still '
+            'keeping email links usable with standards-compliant browsers.',
+            ['--cloak-email-addresses'],
+            {'default': False,
+                'action': 'store_true',
+                'dest': 'cloak_email_addresses',
+                'validator': frontend.validate_boolean}),
+        ('Do not obfuscate email addresses.',
+            ['--no-cloak-email-addresses'],
+            {'default': False,
+                'action': 'store_false',
+                'dest': 'cloak_email_addresses',
+                'validator': frontend.validate_boolean}),
+        ('Specify the thickness of table borders in thousands of a cm.  '
+            'Default is 35.',
+            ['--table-border-thickness'],
+            {'default': None,
+                'validator': frontend.validate_nonnegative_int}),
+        ('Add syntax highlighting in literal code blocks.',
+            ['--add-syntax-highlighting'],
+            {'default': False,
+                'action': 'store_true',
+                'dest': 'add_syntax_highlighting',
+                'validator': frontend.validate_boolean}),
+        ('Do not add syntax highlighting in literal code blocks. (default)',
+            ['--no-syntax-highlighting'],
+            {'default': False,
+                'action': 'store_false',
+                'dest': 'add_syntax_highlighting',
+                'validator': frontend.validate_boolean}),
+        ('Create sections for headers.  (default)',
+            ['--create-sections'],
+            {'default': True, 
+                'action': 'store_true',
+                'dest': 'create_sections',
+                'validator': frontend.validate_boolean}),
+        ('Do not create sections for headers.',
+            ['--no-sections'],
+            {'default': True, 
+                'action': 'store_false',
+                'dest': 'create_sections',
+                'validator': frontend.validate_boolean}),
+        ('Create links.',
+            ['--create-links'],
+            {'default': False,
+                'action': 'store_true',
+                'dest': 'create_links',
+                'validator': frontend.validate_boolean}),
+        ('Do not create links.  (default)',
+            ['--no-links'],
+            {'default': False,
+                'action': 'store_false',
+                'dest': 'create_links',
+                'validator': frontend.validate_boolean}),
+        ('Generate endnotes at end of document, not footnotes '
+            'at bottom of page.',
+            ['--endnotes-end-doc'],
+            {'default': False,
+                'action': 'store_true',
+                'dest': 'endnotes_end_doc',
+                'validator': frontend.validate_boolean}),
+        ('Generate footnotes at bottom of page, not endnotes '
+            'at end of document. (default)',
+            ['--no-endnotes-end-doc'],
+            {'default': False,
+                'action': 'store_false',
+                'dest': 'endnotes_end_doc',
+                'validator': frontend.validate_boolean}),
+        ('Generate a bullet list table of contents, not '
+            'an ODF/oowriter table of contents.',
+            ['--generate-list-toc'],
+            {'default': True,
+                'action': 'store_false',
+                'dest': 'generate_oowriter_toc',
+                'validator': frontend.validate_boolean}),
+        ('Generate an ODF/oowriter table of contents, not '
+            'a bullet list. (default)',
+            ['--generate-oowriter-toc'],
+            {'default': True,
+                'action': 'store_true',
+                'dest': 'generate_oowriter_toc',
+                'validator': frontend.validate_boolean}),
+        ('Specify the contents of an custom header line.  '
+            'See odf_odt writer documentation for details '
+            'about special field character sequences.',
+            ['--custom-odt-header'],
+            {   'default': '',
+                'dest': 'custom_header',
+                }),
+        ('Specify the contents of an custom footer line.  '
+            'See odf_odt writer documentation for details '
+            'about special field character sequences.',
+            ['--custom-odt-footer'],
+            {   'default': '',
+                'dest': 'custom_footer',
+                }),
+        )
+        )
+
+    settings_defaults = {
+        'output_encoding_error_handler': 'xmlcharrefreplace',
+        }
+
+    relative_path_settings = (
+        'stylesheet_path',
+        )
+
+    config_section = 'odf_odt writer'
+    config_section_dependencies = (
+        'writers',
+        )
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = ODFTranslator
+
+    def translate(self):
+        self.settings = self.document.settings
+        self.visitor = self.translator_class(self.document)
+        self.visitor.retrieve_styles(self.EXTENSION)
+        self.document.walkabout(self.visitor)
+        self.visitor.add_doc_title()
+        self.assemble_my_parts()
+        self.output = self.parts['whole']
+
+    def assemble_my_parts(self):
+        """Assemble the `self.parts` dictionary.  Extend in subclasses.
+        """
+        writers.Writer.assemble_parts(self)
+        f = tempfile.NamedTemporaryFile()
+        zfile = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
+        self.write_zip_str(zfile, 'mimetype', self.MIME_TYPE,
+            compress_type=zipfile.ZIP_STORED)
+        content = self.visitor.content_astext()
+        self.write_zip_str(zfile, 'content.xml', content)
+        s1 = self.create_manifest()
+        self.write_zip_str(zfile, 'META-INF/manifest.xml', s1)
+        s1 = self.create_meta()
+        self.write_zip_str(zfile, 'meta.xml', s1)
+        s1 = self.get_stylesheet()
+        self.write_zip_str(zfile, 'styles.xml', s1)
+        self.store_embedded_files(zfile)
+        self.copy_from_stylesheet(zfile)
+        zfile.close()
+        f.seek(0)
+        whole = f.read()
+        f.close()
+        self.parts['whole'] = whole
+        self.parts['encoding'] = self.document.settings.output_encoding
+        self.parts['version'] = docutils.__version__
+
+    def write_zip_str(self, zfile, name, bytes, compress_type=zipfile.ZIP_DEFLATED):
+        localtime = time.localtime(time.time())
+        zinfo = zipfile.ZipInfo(name, localtime)
+        # Add some standard UNIX file access permissions (-rw-r--r--).
+        zinfo.external_attr = (0x81a4 & 0xFFFF) << 16L
+        zinfo.compress_type = compress_type
+        zfile.writestr(zinfo, bytes)
+
+    def store_embedded_files(self, zfile):
+        embedded_files = self.visitor.get_embedded_file_list()
+        for source, destination in embedded_files:
+            if source is None:
+                continue
+            try:
+                zfile.write(source, destination)
+            except OSError, e:
+                self.document.reporter.warning(
+                    "Can't open file %s." % (source, ))
+
+    def get_settings(self):
+        """
+        modeled after get_stylesheet
+        """
+        stylespath = self.settings.stylesheet
+        zfile = zipfile.ZipFile(stylespath, 'r')
+        s1 = zfile.read('settings.xml')
+        zfile.close()
+        return s1
+
+    def get_stylesheet(self):
+        """Get the stylesheet from the visitor.
+        Ask the visitor to setup the page.
+        """
+        s1 = self.visitor.setup_page()
+        return s1
+
+    def copy_from_stylesheet(self, outzipfile):
+        """Copy images, settings, etc from the stylesheet doc into target doc.
+        """
+        stylespath = self.settings.stylesheet
+        inzipfile = zipfile.ZipFile(stylespath, 'r')
+        # Copy the styles.
+        s1 = inzipfile.read('settings.xml')
+        self.write_zip_str(outzipfile, 'settings.xml', s1)
+        # Copy the images.
+        namelist = inzipfile.namelist()
+        for name in namelist:
+            if name.startswith('Pictures/'):
+                imageobj = inzipfile.read(name)
+                outzipfile.writestr(name, imageobj)
+        inzipfile.close()
+
+    def assemble_parts(self):
+        pass
+
+    def create_manifest(self):
+        if WhichElementTree == 'lxml':
+            root = Element('manifest:manifest',
+                nsmap=MANIFEST_NAMESPACE_DICT,
+                nsdict=MANIFEST_NAMESPACE_DICT,
+                )
+        else:
+            root = Element('manifest:manifest',
+                attrib=MANIFEST_NAMESPACE_ATTRIB,
+                nsdict=MANIFEST_NAMESPACE_DICT,
+                )
+        doc = etree.ElementTree(root)
+        SubElement(root, 'manifest:file-entry', attrib={
+            'manifest:media-type': self.MIME_TYPE,
+            'manifest:full-path': '/',
+            }, nsdict=MANNSD)
+        SubElement(root, 'manifest:file-entry', attrib={
+            'manifest:media-type': 'text/xml',
+            'manifest:full-path': 'content.xml',
+            }, nsdict=MANNSD)
+        SubElement(root, 'manifest:file-entry', attrib={
+            'manifest:media-type': 'text/xml',
+            'manifest:full-path': 'styles.xml',
+            }, nsdict=MANNSD)
+        SubElement(root, 'manifest:file-entry', attrib={
+            'manifest:media-type': 'text/xml',
+            'manifest:full-path': 'settings.xml',
+            }, nsdict=MANNSD)
+        SubElement(root, 'manifest:file-entry', attrib={
+            'manifest:media-type': 'text/xml',
+            'manifest:full-path': 'meta.xml',
+            }, nsdict=MANNSD)
+        s1 = ToString(doc)
+        doc = minidom.parseString(s1)
+        s1 = doc.toprettyxml('  ')
+        return s1
+
+    def create_meta(self):
+        if WhichElementTree == 'lxml':
+            root = Element('office:document-meta',
+                nsmap=META_NAMESPACE_DICT,
+                nsdict=META_NAMESPACE_DICT,
+                )
+        else:
+            root = Element('office:document-meta',
+                attrib=META_NAMESPACE_ATTRIB,
+                nsdict=META_NAMESPACE_DICT,
+                )
+        doc = etree.ElementTree(root)
+        root = SubElement(root, 'office:meta', nsdict=METNSD)
+        el1 = SubElement(root, 'meta:generator', nsdict=METNSD)
+        el1.text = 'Docutils/rst2odf.py/%s' % (VERSION, )
+        s1 = os.environ.get('USER', '')
+        el1 = SubElement(root, 'meta:initial-creator', nsdict=METNSD)
+        el1.text = s1
+        s2 = time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime())
+        el1 = SubElement(root, 'meta:creation-date', nsdict=METNSD)
+        el1.text = s2
+        el1 = SubElement(root, 'dc:creator', nsdict=METNSD)
+        el1.text = s1
+        el1 = SubElement(root, 'dc:date', nsdict=METNSD)
+        el1.text = s2
+        el1 = SubElement(root, 'dc:language', nsdict=METNSD)
+        el1.text = 'en-US'
+        el1 = SubElement(root, 'meta:editing-cycles', nsdict=METNSD)
+        el1.text = '1'
+        el1 = SubElement(root, 'meta:editing-duration', nsdict=METNSD)
+        el1.text = 'PT00M01S'
+        title = self.visitor.get_title()
+        el1 = SubElement(root, 'dc:title', nsdict=METNSD)
+        if title:
+            el1.text = title
+        else:
+            el1.text = '[no title]'
+        meta_dict = self.visitor.get_meta_dict()
+        keywordstr = meta_dict.get('keywords')
+        if keywordstr is not None:
+            keywords = split_words(keywordstr)
+            for keyword in keywords:
+                el1 = SubElement(root, 'meta:keyword', nsdict=METNSD)
+                el1.text = keyword
+        description = meta_dict.get('description')
+        if description is not None:
+            el1 = SubElement(root, 'dc:description', nsdict=METNSD)
+            el1.text = description
+        s1 = ToString(doc)
+        #doc = minidom.parseString(s1)
+        #s1 = doc.toprettyxml('  ')
+        return s1
+
+# class ODFTranslator(nodes.SparseNodeVisitor):
+
+class ODFTranslator(nodes.GenericNodeVisitor):
+
+    used_styles = (
+        'attribution', 'blockindent', 'blockquote', 'blockquote-bulletitem',
+        'blockquote-bulletlist', 'blockquote-enumitem', 'blockquote-enumlist',
+        'bulletitem', 'bulletlist',
+        'caption', 'legend',
+        'centeredtextbody', 'codeblock', 'codeblock-indented',
+        'codeblock-classname', 'codeblock-comment', 'codeblock-functionname',
+        'codeblock-keyword', 'codeblock-name', 'codeblock-number',
+        'codeblock-operator', 'codeblock-string', 'emphasis', 'enumitem',
+        'enumlist', 'epigraph', 'epigraph-bulletitem', 'epigraph-bulletlist',
+        'epigraph-enumitem', 'epigraph-enumlist', 'footer',
+        'footnote', 'citation',
+        'header', 'highlights', 'highlights-bulletitem',
+        'highlights-bulletlist', 'highlights-enumitem', 'highlights-enumlist',
+        'horizontalline', 'inlineliteral', 'quotation', 'rubric',
+        'strong', 'table-title', 'textbody', 'tocbulletlist', 'tocenumlist',
+        'title',
+        'subtitle',
+        'heading1',
+        'heading2',
+        'heading3',
+        'heading4',
+        'heading5',
+        'heading6',
+        'heading7',
+        'admon-attention-hdr',
+        'admon-attention-body',
+        'admon-caution-hdr',
+        'admon-caution-body',
+        'admon-danger-hdr',
+        'admon-danger-body',
+        'admon-error-hdr',
+        'admon-error-body',
+        'admon-generic-hdr',
+        'admon-generic-body',
+        'admon-hint-hdr',
+        'admon-hint-body',
+        'admon-important-hdr',
+        'admon-important-body',
+        'admon-note-hdr',
+        'admon-note-body',
+        'admon-tip-hdr',
+        'admon-tip-body',
+        'admon-warning-hdr',
+        'admon-warning-body',
+        'tableoption',
+        'tableoption.%c', 'tableoption.%c%d', 'Table%d', 'Table%d.%c',
+        'Table%d.%c%d',
+        'lineblock1',
+        'lineblock2',
+        'lineblock3',
+        'lineblock4',
+        'lineblock5',
+        'lineblock6',
+        'image', 'figureframe',
+        )
+
+    def __init__(self, document):
+        #nodes.SparseNodeVisitor.__init__(self, document)
+        nodes.GenericNodeVisitor.__init__(self, document)
+        self.settings = document.settings
+        lcode = self.settings.language_code
+        self.language = languages.get_language(lcode, document.reporter)
+        self.format_map = { }
+        if self.settings.odf_config_file:
+            from ConfigParser import ConfigParser
+
+            parser = ConfigParser()
+            parser.read(self.settings.odf_config_file)
+            for rststyle, format in parser.items("Formats"):
+                if rststyle not in self.used_styles:
+                    self.document.reporter.warning(
+                        'Style "%s" is not a style used by odtwriter.' % (
+                        rststyle, ))
+                self.format_map[rststyle] = format.decode('utf-8')
+        self.section_level = 0
+        self.section_count = 0
+        # Create ElementTree content and styles documents.
+        if WhichElementTree == 'lxml':
+            root = Element(
+                'office:document-content',
+                nsmap=CONTENT_NAMESPACE_DICT,
+                )
+        else:
+            root = Element(
+                'office:document-content',
+                attrib=CONTENT_NAMESPACE_ATTRIB,
+                )
+        self.content_tree = etree.ElementTree(element=root)
+        self.current_element = root
+        SubElement(root, 'office:scripts')
+        SubElement(root, 'office:font-face-decls')
+        el = SubElement(root, 'office:automatic-styles')
+        self.automatic_styles = el
+        el = SubElement(root, 'office:body')
+        el = self.generate_content_element(el)
+        self.current_element = el
+        self.body_text_element = el
+        self.paragraph_style_stack = [self.rststyle('textbody'), ]
+        self.list_style_stack = []
+        self.table_count = 0
+        self.column_count = ord('A') - 1
+        self.trace_level = -1
+        self.optiontablestyles_generated = False
+        self.field_name = None
+        self.field_element = None
+        self.title = None
+        self.image_count = 0
+        self.image_style_count = 0
+        self.image_dict = {}
+        self.embedded_file_list = []
+        self.syntaxhighlighting = 1
+        self.syntaxhighlight_lexer = 'python'
+        self.header_content = []
+        self.footer_content = []
+        self.in_header = False
+        self.in_footer = False
+        self.blockstyle = ''
+        self.in_table_of_contents = False
+        self.table_of_content_index_body = None
+        self.list_level = 0
+        self.def_list_level = 0
+        self.footnote_ref_dict = {}
+        self.footnote_list = []
+        self.footnote_chars_idx = 0
+        self.footnote_level = 0
+        self.pending_ids = [ ]
+        self.in_paragraph = False
+        self.found_doc_title = False
+        self.bumped_list_level_stack = []
+        self.meta_dict = {}
+        self.line_block_level = 0
+        self.line_indent_level = 0
+        self.citation_id = None
+        self.style_index = 0        # use to form unique style names
+        self.str_stylesheet = ''
+        self.str_stylesheetcontent = ''
+        self.dom_stylesheet = None
+        self.table_styles = None
+        self.in_citation = False
+
+        # Keep track of nested styling classes
+        self.inline_style_count_stack = []
+
+    def get_str_stylesheet(self):
+        return self.str_stylesheet
+
+    def retrieve_styles(self, extension):
+        """Retrieve the stylesheet from either a .xml file or from
+        a .odt (zip) file.  Return the content as a string.
+        """
+        s2 = None
+        stylespath = self.settings.stylesheet
+        ext = os.path.splitext(stylespath)[1]
+        if ext == '.xml':
+            stylesfile = open(stylespath, 'r')
+            s1 = stylesfile.read()
+            stylesfile.close()
+        elif ext == extension:
+            zfile = zipfile.ZipFile(stylespath, 'r')
+            s1 = zfile.read('styles.xml')
+            s2 = zfile.read('content.xml')
+            zfile.close()
+        else:
+            raise RuntimeError, 'stylesheet path (%s) must be %s or .xml file' %(stylespath, extension)
+        self.str_stylesheet = s1
+        self.str_stylesheetcontent = s2
+        self.dom_stylesheet = etree.fromstring(self.str_stylesheet)
+        self.dom_stylesheetcontent = etree.fromstring(self.str_stylesheetcontent)
+        self.table_styles = self.extract_table_styles(s2)
+
+    def extract_table_styles(self, styles_str):
+        root = etree.fromstring(styles_str)
+        table_styles = {}
+        auto_styles = root.find(
+            '{%s}automatic-styles' % (CNSD['office'], ))
+        for stylenode in auto_styles:
+            name = stylenode.get('{%s}name' % (CNSD['style'], ))
+            tablename = name.split('.')[0]
+            family = stylenode.get('{%s}family' % (CNSD['style'], ))
+            if name.startswith(TABLESTYLEPREFIX):
+                tablestyle = table_styles.get(tablename)
+                if tablestyle is None:
+                    tablestyle = TableStyle()
+                    table_styles[tablename] = tablestyle
+                if family == 'table':
+                    properties = stylenode.find(
+                        '{%s}table-properties' % (CNSD['style'], ))
+                    property = properties.get('{%s}%s' % (CNSD['fo'],
+                        'background-color', ))
+                    if property is not None and property != 'none':
+                        tablestyle.backgroundcolor = property
+                elif family == 'table-cell':
+                    properties = stylenode.find(
+                        '{%s}table-cell-properties' % (CNSD['style'], ))
+                    if properties is not None:
+                        border = self.get_property(properties)
+                        if border is not None:
+                            tablestyle.border = border
+        return table_styles
+
+    def get_property(self, stylenode):
+        border = None
+        for propertyname in TABLEPROPERTYNAMES:
+            border = stylenode.get('{%s}%s' % (CNSD['fo'], propertyname, ))
+            if border is not None and border != 'none':
+                return border
+        return border
+
+    def add_doc_title(self):
+        text = self.settings.title
+        if text:
+            self.title = text
+            if not self.found_doc_title:
+                el = Element('text:p', attrib = {
+                    'text:style-name': self.rststyle('title'),
+                    })
+                el.text = text
+                self.body_text_element.insert(0, el)
+        el = self.find_first_text_p(self.body_text_element)
+        if el is not None:
+            self.attach_page_style(el)
+
+    def find_first_text_p(self, el):
+        """Search the generated doc and return the first <text:p> element.
+        """
+        if (
+                el.tag == 'text:p' or
+                el.tag == 'text:h'
+                ):
+            return el
+        elif el.getchildren():
+            for child in el.getchildren():
+                el1 = self.find_first_text_p(child)
+                if el1 is not None:
+                    return el1
+            return None
+        else:
+            return None
+
+    def attach_page_style(self, el):
+        """Attach the default page style.
+
+        Create an automatic-style that refers to the current style
+        of this element and that refers to the default page style.
+        """
+        current_style = el.get('text:style-name')
+        style_name = 'P1003'
+        el1 = SubElement(
+            self.automatic_styles, 'style:style', attrib={
+                'style:name': style_name,
+                'style:master-page-name': "rststyle-pagedefault",
+                'style:family': "paragraph",
+                }, nsdict=SNSD)
+        if current_style:
+            el1.set('style:parent-style-name', current_style)
+        el.set('text:style-name', style_name)
+
+
+    def rststyle(self, name, parameters=( )):
+        """
+        Returns the style name to use for the given style.
+
+        If `parameters` is given `name` must contain a matching number of ``%`` and
+        is used as a format expression with `parameters` as the value.
+        """
+        name1 = name % parameters
+        stylename = self.format_map.get(name1, 'rststyle-%s' % name1)
+        return stylename
+
+    def generate_content_element(self, root):
+        return SubElement(root, 'office:text')
+
+    def setup_page(self):
+        self.setup_paper(self.dom_stylesheet)
+        if (len(self.header_content) > 0 or len(self.footer_content) > 0 or
+            self.settings.custom_header or self.settings.custom_footer):
+            self.add_header_footer(self.dom_stylesheet)
+        new_content = etree.tostring(self.dom_stylesheet)
+        return new_content
+
+    def setup_paper(self, root_el):
+        try:
+            fin = os.popen("paperconf -s 2> /dev/null")
+            w, h = map(float, fin.read().split())
+            fin.close()
+        except:
+            w, h = 612, 792     # default to Letter
+        def walk(el):
+            if el.tag == "{%s}page-layout-properties" % SNSD["style"] and \
+                    not el.attrib.has_key("{%s}page-width" % SNSD["fo"]):
+                el.attrib["{%s}page-width" % SNSD["fo"]] = "%.3fpt" % w
+                el.attrib["{%s}page-height" % SNSD["fo"]] = "%.3fpt" % h
+                el.attrib["{%s}margin-left" % SNSD["fo"]] = \
+                        el.attrib["{%s}margin-right" % SNSD["fo"]] = \
+                        "%.3fpt" % (.1 * w)
+                el.attrib["{%s}margin-top" % SNSD["fo"]] = \
+                        el.attrib["{%s}margin-bottom" % SNSD["fo"]] = \
+                        "%.3fpt" % (.1 * h)
+            else:
+                for subel in el.getchildren(): walk(subel)
+        walk(root_el)
+
+    def add_header_footer(self, root_el):
+        automatic_styles = root_el.find(
+            '{%s}automatic-styles' % SNSD['office'])
+        path = '{%s}master-styles' % (NAME_SPACE_1, )
+        master_el = root_el.find(path)
+        if master_el is None:
+            return
+        path = '{%s}master-page' % (SNSD['style'], )
+        master_el_container = master_el.findall(path)
+        master_el = None
+        target_attrib = '{%s}name' % (SNSD['style'], )
+        target_name = self.rststyle('pagedefault')
+        for el in master_el_container:
+            if el.get(target_attrib) == target_name:
+                master_el = el
+                break
+        if master_el is None:
+            return
+        el1 = master_el
+        if self.header_content or self.settings.custom_header:
+            if WhichElementTree == 'lxml':
+                el2 = SubElement(el1, 'style:header', nsdict=SNSD)
+            else:
+                el2 = SubElement(el1, 'style:header',
+                    attrib=STYLES_NAMESPACE_ATTRIB,
+                    nsdict=STYLES_NAMESPACE_DICT,
+                    )
+            for el in self.header_content:
+                attrkey = add_ns('text:style-name', nsdict=SNSD)
+                el.attrib[attrkey] = self.rststyle('header')
+                el2.append(el)
+            if self.settings.custom_header:
+                elcustom = self.create_custom_headfoot(el2,
+                    self.settings.custom_header, 'header', automatic_styles)
+        if self.footer_content or self.settings.custom_footer:
+            if WhichElementTree == 'lxml':
+                el2 = SubElement(el1, 'style:footer', nsdict=SNSD)
+            else:
+                el2 = SubElement(el1, 'style:footer',
+                    attrib=STYLES_NAMESPACE_ATTRIB,
+                    nsdict=STYLES_NAMESPACE_DICT,
+                    )
+            for el in self.footer_content:
+                attrkey = add_ns('text:style-name', nsdict=SNSD)
+                el.attrib[attrkey] = self.rststyle('footer')
+                el2.append(el)
+            if self.settings.custom_footer:
+                elcustom = self.create_custom_headfoot(el2,
+                    self.settings.custom_footer, 'footer', automatic_styles)
+
+    code_none, code_field, code_text = range(3)
+    field_pat = re.compile(r'%(..?)%')
+
+    def create_custom_headfoot(self, parent, text, style_name, automatic_styles):
+        parent = SubElement(parent, 'text:p', attrib={
+            'text:style-name': self.rststyle(style_name),
+            })
+        current_element = None
+        field_iter = self.split_field_specifiers_iter(text)
+        for item in field_iter:
+            if item[0] == ODFTranslator.code_field:
+                if item[1] not in ('p', 'P', 
+                    't1', 't2', 't3', 't4',
+                    'd1', 'd2', 'd3', 'd4', 'd5',
+                    's', 't', 'a'):
+                    msg = 'bad field spec: %%%s%%' % (item[1], )
+                    raise RuntimeError, msg
+                el1 = self.make_field_element(parent,
+                    item[1], style_name, automatic_styles)
+                if el1 is None:
+                    msg = 'bad field spec: %%%s%%' % (item[1], )
+                    raise RuntimeError, msg
+                else:
+                    current_element = el1
+            else:
+                if current_element is None:
+                    parent.text = item[1]
+                else:
+                    current_element.tail = item[1]
+
+    def make_field_element(self, parent, text, style_name, automatic_styles):
+        if text == 'p':
+            el1 = SubElement(parent, 'text:page-number', attrib={
+                #'text:style-name': self.rststyle(style_name),
+                'text:select-page': 'current',
+                })
+        elif text == 'P':
+            el1 = SubElement(parent, 'text:page-count', attrib={
+                #'text:style-name': self.rststyle(style_name),
+                })
+        elif text == 't1':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:time', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'text:fixed': 'true',
+                'style:data-style-name': 'rst-time-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:time-style', attrib={
+                'style:name': 'rst-time-style-%d' % self.style_index,
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:hours', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ':'
+            el3 = SubElement(el2, 'number:minutes', attrib={
+                    'number:style': 'long',
+                    })
+        elif text == 't2':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:time', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'text:fixed': 'true',
+                'style:data-style-name': 'rst-time-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:time-style', attrib={
+                'style:name': 'rst-time-style-%d' % self.style_index,
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:hours', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ':'
+            el3 = SubElement(el2, 'number:minutes', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ':'
+            el3 = SubElement(el2, 'number:seconds', attrib={
+                    'number:style': 'long',
+                    })
+        elif text == 't3':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:time', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'text:fixed': 'true',
+                'style:data-style-name': 'rst-time-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:time-style', attrib={
+                'style:name': 'rst-time-style-%d' % self.style_index,
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:hours', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ':'
+            el3 = SubElement(el2, 'number:minutes', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ' '
+            el3 = SubElement(el2, 'number:am-pm')
+        elif text == 't4':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:time', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'text:fixed': 'true',
+                'style:data-style-name': 'rst-time-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:time-style', attrib={
+                'style:name': 'rst-time-style-%d' % self.style_index,
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:hours', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ':'
+            el3 = SubElement(el2, 'number:minutes', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ':'
+            el3 = SubElement(el2, 'number:seconds', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ' '
+            el3 = SubElement(el2, 'number:am-pm')
+        elif text == 'd1':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:date', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'style:data-style-name': 'rst-date-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:date-style', attrib={
+                'style:name': 'rst-date-style-%d' % self.style_index,
+                'number:automatic-order': 'true',
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:month', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = '/'
+            el3 = SubElement(el2, 'number:day', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = '/'
+            el3 = SubElement(el2, 'number:year')
+        elif text == 'd2':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:date', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'style:data-style-name': 'rst-date-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:date-style', attrib={
+                'style:name': 'rst-date-style-%d' % self.style_index,
+                'number:automatic-order': 'true',
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:month', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = '/'
+            el3 = SubElement(el2, 'number:day', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = '/'
+            el3 = SubElement(el2, 'number:year', attrib={
+                    'number:style': 'long',
+                    })
+        elif text == 'd3':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:date', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'style:data-style-name': 'rst-date-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:date-style', attrib={
+                'style:name': 'rst-date-style-%d' % self.style_index,
+                'number:automatic-order': 'true',
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:month', attrib={
+                    'number:textual': 'true',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ' '
+            el3 = SubElement(el2, 'number:day', attrib={
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ', '
+            el3 = SubElement(el2, 'number:year', attrib={
+                    'number:style': 'long',
+                    })
+        elif text == 'd4':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:date', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'style:data-style-name': 'rst-date-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:date-style', attrib={
+                'style:name': 'rst-date-style-%d' % self.style_index,
+                'number:automatic-order': 'true',
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:month', attrib={
+                    'number:textual': 'true',
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ' '
+            el3 = SubElement(el2, 'number:day', attrib={
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = ', '
+            el3 = SubElement(el2, 'number:year', attrib={
+                    'number:style': 'long',
+                    })
+        elif text == 'd5':
+            self.style_index += 1
+            el1 = SubElement(parent, 'text:date', attrib={
+                'text:style-name': self.rststyle(style_name),
+                'style:data-style-name': 'rst-date-style-%d' % self.style_index,
+                })
+            el2 = SubElement(automatic_styles, 'number:date-style', attrib={
+                'style:name': 'rst-date-style-%d' % self.style_index,
+                'xmlns:number': SNSD['number'],
+                'xmlns:style': SNSD['style'],
+                    })
+            el3 = SubElement(el2, 'number:year', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = '-'
+            el3 = SubElement(el2, 'number:month', attrib={
+                    'number:style': 'long',
+                    })
+            el3 = SubElement(el2, 'number:text')
+            el3.text = '-'
+            el3 = SubElement(el2, 'number:day', attrib={
+                    'number:style': 'long',
+                    })
+        elif text == 's':
+            el1 = SubElement(parent, 'text:subject', attrib={
+                'text:style-name': self.rststyle(style_name),
+                })
+        elif text == 't':
+            el1 = SubElement(parent, 'text:title', attrib={
+                'text:style-name': self.rststyle(style_name),
+                })
+        elif text == 'a':
+            el1 = SubElement(parent, 'text:author-name', attrib={
+                'text:fixed': 'false',
+                })
+        else:
+            el1 = None
+        return el1
+
+    def split_field_specifiers_iter(self, text):
+        pos1 = 0
+        pos_end = len(text)
+        while True:
+            mo = ODFTranslator.field_pat.search(text, pos1)
+            if mo:
+                pos2 = mo.start()
+                if pos2 > pos1:
+                    yield (ODFTranslator.code_text, text[pos1:pos2])
+                yield (ODFTranslator.code_field, mo.group(1))
+                pos1 = mo.end()
+            else:
+                break
+        trailing = text[pos1:]
+        if trailing:
+            yield (ODFTranslator.code_text, trailing)
+
+
+    def astext(self):
+        root = self.content_tree.getroot()
+        et = etree.ElementTree(root)
+        s1 = ToString(et)
+        return s1
+
+    def content_astext(self):
+        return self.astext()
+
+    def set_title(self, title): self.title = title
+    def get_title(self): return self.title
+    def set_embedded_file_list(self, embedded_file_list):
+        self.embedded_file_list = embedded_file_list
+    def get_embedded_file_list(self): return self.embedded_file_list
+    def get_meta_dict(self): return self.meta_dict
+
+    def process_footnotes(self):
+        for node, el1 in self.footnote_list:
+            backrefs = node.attributes.get('backrefs', [])
+            first = True
+            for ref in backrefs:
+                el2 = self.footnote_ref_dict.get(ref)
+                if el2 is not None:
+                    if first:
+                        first = False
+                        el3 = copy.deepcopy(el1)
+                        el2.append(el3)
+                    else:
+                        children = el2.getchildren()
+                        if len(children) > 0: #  and 'id' in el2.attrib:
+                            child = children[0]
+                            ref1 = child.text
+                            attribkey = add_ns('text:id', nsdict=SNSD)
+                            id1 = el2.get(attribkey, 'footnote-error')
+                            if id1 is None:
+                                id1 = ''
+                            tag = add_ns('text:note-ref', nsdict=SNSD)
+                            el2.tag = tag
+                            if self.settings.endnotes_end_doc:
+                                note_class = 'endnote'
+                            else:
+                                note_class = 'footnote'
+                            el2.attrib.clear()
+                            attribkey = add_ns('text:note-class', nsdict=SNSD)
+                            el2.attrib[attribkey] = note_class
+                            attribkey = add_ns('text:ref-name', nsdict=SNSD)
+                            el2.attrib[attribkey] = id1
+                            attribkey = add_ns('text:reference-format', nsdict=SNSD)
+                            el2.attrib[attribkey] = 'page'
+                            el2.text = ref1
+
+    #
+    # Utility methods
+
+    def append_child(self, tag, attrib=None, parent=None):
+        if parent is None:
+            parent = self.current_element
+        if attrib is None:
+            el = SubElement(parent, tag)
+        else:
+            el = SubElement(parent, tag, attrib)
+        return el
+
+    def append_p(self, style, text=None):
+        result = self.append_child('text:p', attrib={
+                'text:style-name': self.rststyle(style)})
+        self.append_pending_ids(result)
+        if text is not None:
+            result.text = text
+        return result
+
+    def append_pending_ids(self, el):
+        if self.settings.create_links:
+            for id in self.pending_ids:
+                SubElement(el, 'text:reference-mark', attrib={
+                        'text:name': id})
+        self.pending_ids = [ ]
+
+    def set_current_element(self, el):
+        self.current_element = el
+
+    def set_to_parent(self):
+        self.current_element = self.current_element.getparent()
+
+    def generate_labeled_block(self, node, label):
+        label = '%s:' % (self.language.labels[label], )
+        el = self.append_p('textbody')
+        el1 = SubElement(el, 'text:span',
+            attrib={'text:style-name': self.rststyle('strong')})
+        el1.text = label
+        el = self.append_p('blockindent')
+        return el
+
+    def generate_labeled_line(self, node, label):
+        label = '%s:' % (self.language.labels[label], )
+        el = self.append_p('textbody')
+        el1 = SubElement(el, 'text:span',
+            attrib={'text:style-name': self.rststyle('strong')})
+        el1.text = label
+        el1.tail = node.astext()
+        return el
+
+    def encode(self, text):
+        text = text.replace(u'\u00a0', " ")
+        return text
+
+    #
+    # Visitor functions
+    #
+    # In alphabetic order, more or less.
+    #   See docutils.docutils.nodes.node_class_names.
+    #
+
+    def dispatch_visit(self, node):
+        """Override to catch basic attributes which many nodes have."""
+        self.handle_basic_atts(node)
+        nodes.GenericNodeVisitor.dispatch_visit(self, node)
+
+    def handle_basic_atts(self, node):
+        if isinstance(node, nodes.Element) and node['ids']:
+            self.pending_ids += node['ids']
+
+    def default_visit(self, node):
+        self.document.reporter.warning('missing visit_%s' % (node.tagname, ))
+
+    def default_departure(self, node):
+        self.document.reporter.warning('missing depart_%s' % (node.tagname, ))
+
+    def visit_Text(self, node):
+        # Skip nodes whose text has been processed in parent nodes.
+        if isinstance(node.parent, docutils.nodes.literal_block):
+            return
+        text = node.astext()
+        # Are we in mixed content?  If so, add the text to the
+        #   etree tail of the previous sibling element.
+        if len(self.current_element.getchildren()) > 0:
+            if self.current_element.getchildren()[-1].tail:
+                self.current_element.getchildren()[-1].tail += text
+            else:
+                self.current_element.getchildren()[-1].tail = text
+        else:
+            if self.current_element.text:
+                self.current_element.text += text
+            else:
+                self.current_element.text = text
+
+    def depart_Text(self, node):
+        pass
+
+    #
+    # Pre-defined fields
+    #
+
+    def visit_address(self, node):
+        el = self.generate_labeled_block(node, 'address')
+        self.set_current_element(el)
+
+    def depart_address(self, node):
+        self.set_to_parent()
+
+    def visit_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            el = self.append_p('blockindent')
+        else:
+            el = self.generate_labeled_block(node, 'author')
+        self.set_current_element(el)
+
+    def depart_author(self, node):
+        self.set_to_parent()
+
+    def visit_authors(self, node):
+        label = '%s:' % (self.language.labels['authors'], )
+        el = self.append_p('textbody')
+        el1 = SubElement(el, 'text:span',
+            attrib={'text:style-name': self.rststyle('strong')})
+        el1.text = label
+
+    def depart_authors(self, node):
+        pass
+
+    def visit_contact(self, node):
+        el = self.generate_labeled_block(node, 'contact')
+        self.set_current_element(el)
+
+    def depart_contact(self, node):
+        self.set_to_parent()
+
+    def visit_copyright(self, node):
+        el = self.generate_labeled_block(node, 'copyright')
+        self.set_current_element(el)
+
+    def depart_copyright(self, node):
+        self.set_to_parent()
+
+    def visit_date(self, node):
+        self.generate_labeled_line(node, 'date')
+
+    def depart_date(self, node):
+        pass
+
+    def visit_organization(self, node):
+        el = self.generate_labeled_block(node, 'organization')
+        self.set_current_element(el)
+
+    def depart_organization(self, node):
+        self.set_to_parent()
+
+    def visit_status(self, node):
+        el = self.generate_labeled_block(node, 'status')
+        self.set_current_element(el)
+
+    def depart_status(self, node):
+        self.set_to_parent()
+
+    def visit_revision(self, node):
+        el = self.generate_labeled_line(node, 'revision')
+
+    def depart_revision(self, node):
+        pass
+
+    def visit_version(self, node):
+        el = self.generate_labeled_line(node, 'version')
+        #self.set_current_element(el)
+
+    def depart_version(self, node):
+        #self.set_to_parent()
+        pass
+
+    def visit_attribution(self, node):
+        el = self.append_p('attribution', node.astext())
+
+    def depart_attribution(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        if 'epigraph' in node.attributes['classes']:
+            self.paragraph_style_stack.append(self.rststyle('epigraph'))
+            self.blockstyle = self.rststyle('epigraph')
+        elif 'highlights' in node.attributes['classes']:
+            self.paragraph_style_stack.append(self.rststyle('highlights'))
+            self.blockstyle = self.rststyle('highlights')
+        else:
+            self.paragraph_style_stack.append(self.rststyle('blockquote'))
+            self.blockstyle = self.rststyle('blockquote')
+        self.line_indent_level += 1
+
+    def depart_block_quote(self, node):
+        self.paragraph_style_stack.pop()
+        self.blockstyle = ''
+        self.line_indent_level -= 1
+
+    def visit_bullet_list(self, node):
+        self.list_level +=1
+        if self.in_table_of_contents:
+            if self.settings.generate_oowriter_toc:
+                pass
+            else:
+                if node.has_key('classes') and \
+                        'auto-toc' in node.attributes['classes']:
+                    el = SubElement(self.current_element, 'text:list', attrib={
+                        'text:style-name': self.rststyle('tocenumlist'),
+                        })
+                    self.list_style_stack.append(self.rststyle('enumitem'))
+                else:
+                    el = SubElement(self.current_element, 'text:list', attrib={
+                        'text:style-name': self.rststyle('tocbulletlist'),
+                        })
+                    self.list_style_stack.append(self.rststyle('bulletitem'))
+                self.set_current_element(el)
+        else:
+            if self.blockstyle == self.rststyle('blockquote'):
+                el = SubElement(self.current_element, 'text:list', attrib={
+                    'text:style-name': self.rststyle('blockquote-bulletlist'),
+                    })
+                self.list_style_stack.append(
+                    self.rststyle('blockquote-bulletitem'))
+            elif self.blockstyle == self.rststyle('highlights'):
+                el = SubElement(self.current_element, 'text:list', attrib={
+                    'text:style-name': self.rststyle('highlights-bulletlist'),
+                    })
+                self.list_style_stack.append(
+                    self.rststyle('highlights-bulletitem'))
+            elif self.blockstyle == self.rststyle('epigraph'):
+                el = SubElement(self.current_element, 'text:list', attrib={
+                    'text:style-name': self.rststyle('epigraph-bulletlist'),
+                    })
+                self.list_style_stack.append(
+                    self.rststyle('epigraph-bulletitem'))
+            else:
+                el = SubElement(self.current_element, 'text:list', attrib={
+                    'text:style-name': self.rststyle('bulletlist'),
+                    })
+                self.list_style_stack.append(self.rststyle('bulletitem'))
+            self.set_current_element(el)
+
+    def depart_bullet_list(self, node):
+        if self.in_table_of_contents:
+            if self.settings.generate_oowriter_toc:
+                pass
+            else:
+                self.set_to_parent()
+                self.list_style_stack.pop()
+        else:
+            self.set_to_parent()
+            self.list_style_stack.pop()
+        self.list_level -=1
+
+    def visit_caption(self, node):
+        raise nodes.SkipChildren()
+        pass
+
+    def depart_caption(self, node):
+        pass
+
+    def visit_comment(self, node):
+        el = self.append_p('textbody')
+        el1 =  SubElement(el, 'office:annotation', attrib={})
+        el2 =  SubElement(el1, 'dc:creator', attrib={})
+        s1 = os.environ.get('USER', '')
+        el2.text = s1
+        el2 =  SubElement(el1, 'text:p', attrib={})
+        el2.text = node.astext()
+
+    def depart_comment(self, node):
+        pass
+
+    def visit_compound(self, node):
+        # The compound directive currently receives no special treatment.
+        pass
+
+    def depart_compound(self, node):
+        pass
+
+    def visit_container(self, node):
+        styles = node.attributes.get('classes', ())
+        if len(styles) > 0:
+            self.paragraph_style_stack.append(self.rststyle(styles[0]))
+
+    def depart_container(self, node):
+        styles = node.attributes.get('classes', ())
+        if len(styles) > 0:
+            self.paragraph_style_stack.pop()
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition_list(self, node):
+        self.def_list_level +=1
+        if self.list_level > 5:
+            raise RuntimeError(
+                'max definition list nesting level exceeded')
+
+    def depart_definition_list(self, node):
+        self.def_list_level -=1
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_term(self, node):
+        el = self.append_p('deflist-term-%d' % self.def_list_level)
+        el.text = node.astext()
+        self.set_current_element(el)
+        raise nodes.SkipChildren()
+
+    def depart_term(self, node):
+        self.set_to_parent()
+
+    def visit_definition(self, node):
+        self.paragraph_style_stack.append(
+            self.rststyle('deflist-def-%d' % self.def_list_level))
+        self.bumped_list_level_stack.append(ListLevel(1))
+
+    def depart_definition(self, node):
+        self.paragraph_style_stack.pop()
+        self.bumped_list_level_stack.pop()
+
+    def visit_classifier(self, node):
+        els = self.current_element.getchildren()
+        if len(els) > 0:
+            el = els[-1]
+            el1 = SubElement(el, 'text:span',
+                attrib={'text:style-name': self.rststyle('emphasis')
+                })
+            el1.text = ' (%s)' % (node.astext(), )
+
+    def depart_classifier(self, node):
+        pass
+
+    def visit_document(self, node):
+        pass
+
+    def depart_document(self, node):
+        self.process_footnotes()
+
+    def visit_docinfo(self, node):
+        self.section_level += 1
+        self.section_count += 1
+        if self.settings.create_sections:
+            el = self.append_child('text:section', attrib={
+                    'text:name': 'Section%d' % self.section_count,
+                    'text:style-name': 'Sect%d' % self.section_level,
+                    })
+            self.set_current_element(el)
+
+    def depart_docinfo(self, node):
+        self.section_level -= 1
+        if self.settings.create_sections:
+            self.set_to_parent()
+
+    def visit_emphasis(self, node):
+        el = SubElement(self.current_element, 'text:span',
+            attrib={'text:style-name': self.rststyle('emphasis')})
+        self.set_current_element(el)
+
+    def depart_emphasis(self, node):
+        self.set_to_parent()
+
+    def visit_enumerated_list(self, node):
+        el1 = self.current_element
+        if self.blockstyle == self.rststyle('blockquote'):
+            el2 = SubElement(el1, 'text:list', attrib={
+                'text:style-name': self.rststyle('blockquote-enumlist'),
+                })
+            self.list_style_stack.append(self.rststyle('blockquote-enumitem'))
+        elif self.blockstyle == self.rststyle('highlights'):
+            el2 = SubElement(el1, 'text:list', attrib={
+                'text:style-name': self.rststyle('highlights-enumlist'),
+                })
+            self.list_style_stack.append(self.rststyle('highlights-enumitem'))
+        elif self.blockstyle == self.rststyle('epigraph'):
+            el2 = SubElement(el1, 'text:list', attrib={
+                'text:style-name': self.rststyle('epigraph-enumlist'),
+                })
+            self.list_style_stack.append(self.rststyle('epigraph-enumitem'))
+        else:
+            liststylename = 'enumlist-%s' % (node.get('enumtype', 'arabic'), )
+            el2 = SubElement(el1, 'text:list', attrib={
+                'text:style-name': self.rststyle(liststylename),
+                })
+            self.list_style_stack.append(self.rststyle('enumitem'))
+        self.set_current_element(el2)
+
+    def depart_enumerated_list(self, node):
+        self.set_to_parent()
+        self.list_style_stack.pop()
+
+    def visit_list_item(self, node):
+        # If we are in a "bumped" list level, then wrap this
+        #   list in an outer lists in order to increase the
+        #   indentation level.
+        if self.in_table_of_contents:
+            if self.settings.generate_oowriter_toc:
+                self.paragraph_style_stack.append(
+                    self.rststyle('contents-%d' % (self.list_level, )))
+            else:
+                el1 = self.append_child('text:list-item')
+                self.set_current_element(el1)
+        else:
+            el1 = self.append_child('text:list-item')
+            el3 = el1
+            if len(self.bumped_list_level_stack) > 0:
+                level_obj = self.bumped_list_level_stack[-1]
+                if level_obj.get_sibling():
+                    level_obj.set_nested(False)
+                    for level_obj1 in self.bumped_list_level_stack:
+                        for idx in range(level_obj1.get_level()):
+                            el2 = self.append_child('text:list', parent=el3)
+                            el3 = self.append_child(
+                                'text:list-item', parent=el2)
+            self.paragraph_style_stack.append(self.list_style_stack[-1])
+            self.set_current_element(el3)
+
+    def depart_list_item(self, node):
+        if self.in_table_of_contents:
+            if self.settings.generate_oowriter_toc:
+                self.paragraph_style_stack.pop()
+            else:
+                self.set_to_parent()
+        else:
+            if len(self.bumped_list_level_stack) > 0:
+                level_obj = self.bumped_list_level_stack[-1]
+                if level_obj.get_sibling():
+                    level_obj.set_nested(True)
+                    for level_obj1 in self.bumped_list_level_stack:
+                        for idx in range(level_obj1.get_level()):
+                            self.set_to_parent()
+                            self.set_to_parent()
+            self.paragraph_style_stack.pop()
+            self.set_to_parent()
+
+    def visit_header(self, node):
+        self.in_header = True
+
+    def depart_header(self, node):
+        self.in_header = False
+
+    def visit_footer(self, node):
+        self.in_footer = True
+
+    def depart_footer(self, node):
+        self.in_footer = False
+
+    def visit_field(self, node):
+        pass
+
+    def depart_field(self, node):
+        pass
+
+    def visit_field_list(self, node):
+        pass
+
+    def depart_field_list(self, node):
+        pass
+
+    def visit_field_name(self, node):
+        el = self.append_p('textbody')
+        el1 = SubElement(el, 'text:span',
+            attrib={'text:style-name': self.rststyle('strong')})
+        el1.text = node.astext()
+
+    def depart_field_name(self, node):
+        pass
+
+    def visit_field_body(self, node):
+        self.paragraph_style_stack.append(self.rststyle('blockindent'))
+
+    def depart_field_body(self, node):
+        self.paragraph_style_stack.pop()
+
+    def visit_figure(self, node):
+        pass
+
+    def depart_figure(self, node):
+        pass
+
+    def visit_footnote(self, node):
+        self.footnote_level += 1
+        self.save_footnote_current = self.current_element
+        el1 = Element('text:note-body')
+        self.current_element = el1
+        self.footnote_list.append((node, el1))
+        if isinstance(node, docutils.nodes.citation):
+            self.paragraph_style_stack.append(self.rststyle('citation'))
+        else:
+            self.paragraph_style_stack.append(self.rststyle('footnote'))
+
+    def depart_footnote(self, node):
+        self.paragraph_style_stack.pop()
+        self.current_element = self.save_footnote_current
+        self.footnote_level -= 1
+
+    footnote_chars = [
+        '*', '**', '***',
+        '++', '+++',
+        '##', '###',
+        '@@', '@@@',
+        ]
+
+    def visit_footnote_reference(self, node):
+        if self.footnote_level <= 0:
+            id = node.attributes['ids'][0]
+            refid = node.attributes.get('refid')
+            if refid is None:
+                refid = ''
+            if self.settings.endnotes_end_doc:
+                note_class = 'endnote'
+            else:
+                note_class = 'footnote'
+            el1 = self.append_child('text:note', attrib={
+                'text:id': '%s' % (refid, ),
+                'text:note-class': note_class,
+                })
+            note_auto = str(node.attributes.get('auto', 1))
+            if isinstance(node, docutils.nodes.citation_reference):
+                citation = '[%s]' % node.astext()
+                el2 = SubElement(el1, 'text:note-citation', attrib={
+                    'text:label': citation,
+                    })
+                el2.text = citation
+            elif note_auto == '1':
+                el2 = SubElement(el1, 'text:note-citation', attrib={
+                    'text:label': node.astext(),
+                    })
+                el2.text = node.astext()
+            elif note_auto == '*':
+                if self.footnote_chars_idx >= len(
+                    ODFTranslator.footnote_chars):
+                    self.footnote_chars_idx = 0
+                footnote_char = ODFTranslator.footnote_chars[
+                    self.footnote_chars_idx]
+                self.footnote_chars_idx += 1
+                el2 = SubElement(el1, 'text:note-citation', attrib={
+                    'text:label': footnote_char,
+                    })
+                el2.text = footnote_char
+            self.footnote_ref_dict[id] = el1
+        raise nodes.SkipChildren()
+
+    def depart_footnote_reference(self, node):
+        pass
+
+    def visit_citation(self, node):
+        self.in_citation = True
+        for id in node.attributes['ids']:
+            self.citation_id = id
+            break
+        self.paragraph_style_stack.append(self.rststyle('blockindent'))
+        self.bumped_list_level_stack.append(ListLevel(1))
+
+    def depart_citation(self, node):
+        self.citation_id = None
+        self.paragraph_style_stack.pop()
+        self.bumped_list_level_stack.pop()
+        self.in_citation = False
+
+    def visit_citation_reference(self, node):
+        if self.settings.create_links:
+            id = node.attributes['refid']
+            el = self.append_child('text:reference-ref', attrib={
+                'text:ref-name': '%s' % (id, ),
+                'text:reference-format': 'text',
+                })
+            el.text = '['
+            self.set_current_element(el)
+        elif self.current_element.text is None:
+            self.current_element.text = '['
+        else:
+            self.current_element.text += '['
+
+    def depart_citation_reference(self, node):
+        self.current_element.text += ']'
+        if self.settings.create_links:
+            self.set_to_parent()
+
+    def visit_label(self, node):
+        if isinstance(node.parent, docutils.nodes.footnote):
+            raise nodes.SkipChildren()
+        elif self.citation_id is not None:
+            el = self.append_p('textbody')
+            self.set_current_element(el)
+            if self.settings.create_links:
+                el0 = SubElement(el, 'text:span')
+                el0.text = '['
+                el1 = self.append_child('text:reference-mark-start', attrib={
+                        'text:name': '%s' % (self.citation_id, ),
+                        })
+            else:
+                el.text = '['
+
+    def depart_label(self, node):
+        if isinstance(node.parent, docutils.nodes.footnote):
+            pass
+        elif self.citation_id is not None:
+            if self.settings.create_links:
+                el = self.append_child('text:reference-mark-end', attrib={
+                        'text:name': '%s' % (self.citation_id, ),
+                        })
+                el0 = SubElement(self.current_element, 'text:span')
+                el0.text = ']'
+            else:
+                self.current_element.text += ']'
+            self.set_to_parent()
+
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def check_file_exists(self, path):
+        if os.path.exists(path):
+            return 1
+        else:
+            return 0
+
+    def visit_image(self, node):
+        # Capture the image file.
+        if 'uri' in node.attributes:
+            source = node.attributes['uri']
+            if not source.startswith('http:'):
+                if not source.startswith(os.sep):
+                    docsource, line = utils.get_source_line(node)
+                    if docsource:
+                        dirname = os.path.dirname(docsource)
+                        if dirname:
+                            source = '%s%s%s' % (dirname, os.sep, source, )
+                if not self.check_file_exists(source):
+                    self.document.reporter.warning(
+                        'Cannot find image file %s.' % (source, ))
+                    return
+        else:
+            return
+        if source in self.image_dict:
+            filename, destination = self.image_dict[source]
+        else:
+            self.image_count += 1
+            filename = os.path.split(source)[1]
+            destination = 'Pictures/1%08x%s' % (self.image_count, filename, )
+            if source.startswith('http:'):
+                try:
+                    imgfile = urllib2.urlopen(source)
+                    content = imgfile.read()
+                    imgfile.close()
+                    imgfile2 = tempfile.NamedTemporaryFile('wb', delete=False)
+                    imgfile2.write(content)
+                    imgfile2.close()
+                    imgfilename = imgfile2.name
+                    source = imgfilename
+                except urllib2.HTTPError, e:
+                    self.document.reporter.warning(
+                        "Can't open image url %s." % (source, ))
+                spec = (source, destination,)
+            else:
+                spec = (os.path.abspath(source), destination,)
+            self.embedded_file_list.append(spec)
+            self.image_dict[source] = (source, destination,)
+        # Is this a figure (containing an image) or just a plain image?
+        if self.in_paragraph:
+            el1 = self.current_element
+        else:
+            el1 = SubElement(self.current_element, 'text:p',
+                attrib={'text:style-name': self.rststyle('textbody')})
+        el2 = el1
+        if isinstance(node.parent, docutils.nodes.figure):
+            el3, el4, el5, caption = self.generate_figure(node, source,
+                destination, el2)
+            attrib = {}
+            el6, width = self.generate_image(node, source, destination,
+                el5, attrib)
+            if caption is not None:
+                el6.tail = caption
+        else:   #if isinstance(node.parent, docutils.nodes.image):
+            el3 = self.generate_image(node, source, destination, el2)
+
+    def depart_image(self, node):
+        pass
+
+    def get_image_width_height(self, node, attr):
+        size = None
+        if attr in node.attributes:
+            size = node.attributes[attr]
+            unit = size[-2:]
+            if unit.isalpha():
+                size = size[:-2]
+            else:
+                unit = 'px'
+            try:
+                size = float(size)
+            except ValueError, e:
+                self.document.reporter.warning(
+                    'Invalid %s for image: "%s"' % (
+                        attr, node.attributes[attr]))
+            size = [size, unit]
+        return size
+
+    def get_image_scale(self, node):
+        if 'scale' in node.attributes:
+            try:
+                scale = int(node.attributes['scale'])
+                if scale < 1: # or scale > 100:
+                    self.document.reporter.warning(
+                        'scale out of range (%s), using 1.' % (scale, ))
+                    scale = 1
+                scale = scale * 0.01
+            except ValueError, e:
+                self.document.reporter.warning(
+                    'Invalid scale for image: "%s"' % (
+                        node.attributes['scale'], ))
+        else:
+            scale = 1.0
+        return scale
+
+    def get_image_scaled_width_height(self, node, source):
+        scale = self.get_image_scale(node)
+        width = self.get_image_width_height(node, 'width')
+        height = self.get_image_width_height(node, 'height')
+
+        dpi = (72, 72)
+        if PIL is not None and source in self.image_dict:
+            filename, destination = self.image_dict[source]
+            imageobj = PIL.Image.open(filename, 'r')
+            dpi = imageobj.info.get('dpi', dpi)
+            # dpi information can be (xdpi, ydpi) or xydpi
+            try: iter(dpi)
+            except: dpi = (dpi, dpi)
+        else:
+            imageobj = None
+
+        if width is None or height is None:
+            if imageobj is None:
+                raise RuntimeError(
+                    'image size not fully specified and PIL not installed')
+            if width is None: width = [imageobj.size[0], 'px']
+            if height is None: height = [imageobj.size[1], 'px']
+
+        width[0] *= scale
+        height[0] *= scale
+        if width[1] == 'px': width = [width[0] / dpi[0], 'in']
+        if height[1] == 'px': height = [height[0] / dpi[1], 'in']
+
+        width[0] = str(width[0])
+        height[0] = str(height[0])
+        return ''.join(width), ''.join(height)
+
+    def generate_figure(self, node, source, destination, current_element):
+        caption = None
+        width, height = self.get_image_scaled_width_height(node, source)
+        for node1 in node.parent.children:
+            if node1.tagname == 'caption':
+                caption = node1.astext()
+        self.image_style_count += 1
+        #
+        # Add the style for the caption.
+        if caption is not None:
+            attrib = {
+                'style:class': 'extra',
+                'style:family': 'paragraph',
+                'style:name': 'Caption',
+                'style:parent-style-name': 'Standard',
+                }
+            el1 = SubElement(self.automatic_styles, 'style:style',
+                attrib=attrib, nsdict=SNSD)
+            attrib = {
+                'fo:margin-bottom': '0.0835in',
+                'fo:margin-top': '0.0835in',
+                'text:line-number': '0',
+                'text:number-lines': 'false',
+                }
+            el2 = SubElement(el1, 'style:paragraph-properties', 
+                attrib=attrib, nsdict=SNSD)
+            attrib = {
+                'fo:font-size': '12pt',
+                'fo:font-style': 'italic',
+                'style:font-name': 'Times',
+                'style:font-name-complex': 'Lucidasans1',
+                'style:font-size-asian': '12pt',
+                'style:font-size-complex': '12pt',
+                'style:font-style-asian': 'italic',
+                'style:font-style-complex': 'italic',
+                }
+            el2 = SubElement(el1, 'style:text-properties', 
+                attrib=attrib, nsdict=SNSD)
+        style_name = 'rstframestyle%d' % self.image_style_count
+        # Add the styles
+        attrib = {
+            'style:name': style_name,
+            'style:family': 'graphic',
+            'style:parent-style-name': self.rststyle('figureframe'),
+            }
+        el1 = SubElement(self.automatic_styles, 
+            'style:style', attrib=attrib, nsdict=SNSD)
+        halign = 'center'
+        valign = 'top'
+        if 'align' in node.attributes:
+            align = node.attributes['align'].split()
+            for val in align:
+                if val in ('left', 'center', 'right'):
+                    halign = val
+                elif val in ('top', 'middle', 'bottom'):
+                    valign = val
+        attrib = {}
+        wrap = False
+        classes = node.parent.attributes.get('classes')
+        if classes and 'wrap' in classes:
+            wrap = True
+        if wrap:
+            attrib['style:wrap'] = 'dynamic'
+        else:
+            attrib['style:wrap'] = 'none'
+        el2 = SubElement(el1,
+            'style:graphic-properties', attrib=attrib, nsdict=SNSD)
+        attrib = {
+            'draw:style-name': style_name,
+            'draw:name': 'Frame1',
+            'text:anchor-type': 'paragraph',
+            'draw:z-index': '0',
+            }
+        attrib['svg:width'] = width
+        el3 = SubElement(current_element, 'draw:frame', attrib=attrib)
+        attrib = {}
+        el4 = SubElement(el3, 'draw:text-box', attrib=attrib)
+        attrib = {
+            'text:style-name': self.rststyle('caption'),
+            }
+        el5 = SubElement(el4, 'text:p', attrib=attrib)
+        return el3, el4, el5, caption
+
+    def generate_image(self, node, source, destination, current_element,
+        frame_attrs=None):
+        width, height = self.get_image_scaled_width_height(node, source)
+        self.image_style_count += 1
+        style_name = 'rstframestyle%d' % self.image_style_count
+        # Add the style.
+        attrib = {
+            'style:name': style_name,
+            'style:family': 'graphic',
+            'style:parent-style-name': self.rststyle('image'),
+            }
+        el1 = SubElement(self.automatic_styles, 
+            'style:style', attrib=attrib, nsdict=SNSD)
+        halign = None
+        valign = None
+        if 'align' in node.attributes:
+            align = node.attributes['align'].split()
+            for val in align:
+                if val in ('left', 'center', 'right'):
+                    halign = val
+                elif val in ('top', 'middle', 'bottom'):
+                    valign = val
+        if frame_attrs is None:
+            attrib = {
+                'style:vertical-pos': 'top',
+                'style:vertical-rel': 'paragraph',
+                'style:horizontal-rel': 'paragraph',
+                'style:mirror': 'none',
+                'fo:clip': 'rect(0cm 0cm 0cm 0cm)',
+                'draw:luminance': '0%',
+                'draw:contrast': '0%',
+                'draw:red': '0%',
+                'draw:green': '0%',
+                'draw:blue': '0%',
+                'draw:gamma': '100%',
+                'draw:color-inversion': 'false',
+                'draw:image-opacity': '100%',
+                'draw:color-mode': 'standard',
+                }
+        else:
+            attrib = frame_attrs
+        if halign is not None:
+            attrib['style:horizontal-pos'] = halign
+        if valign is not None:
+            attrib['style:vertical-pos'] = valign
+        # If there is a classes/wrap directive or we are 
+        #   inside a table, add a no-wrap style.
+        wrap = False
+        classes = node.attributes.get('classes')
+        if classes and 'wrap' in classes:
+            wrap = True
+        if wrap:
+            attrib['style:wrap'] = 'dynamic'
+        else:
+            attrib['style:wrap'] = 'none'
+        # If we are inside a table, add a no-wrap style.
+        if self.is_in_table(node):
+            attrib['style:wrap'] = 'none'
+        el2 = SubElement(el1,
+            'style:graphic-properties', attrib=attrib, nsdict=SNSD)
+        # Add the content.
+        #el = SubElement(current_element, 'text:p',
+        #    attrib={'text:style-name': self.rststyle('textbody')})
+        attrib={
+            'draw:style-name': style_name,
+            'draw:name': 'graphics2',
+            'draw:z-index': '1',
+            }
+        if isinstance(node.parent, nodes.TextElement):
+            attrib['text:anchor-type'] = 'as-char' #vds
+        else:
+            attrib['text:anchor-type'] = 'paragraph'
+        attrib['svg:width'] = width
+        attrib['svg:height'] = height
+        el1 = SubElement(current_element, 'draw:frame', attrib=attrib)
+        el2 = SubElement(el1, 'draw:image', attrib={
+            'xlink:href': '%s' % (destination, ),
+            'xlink:type': 'simple',
+            'xlink:show': 'embed',
+            'xlink:actuate': 'onLoad',
+            })
+        return el1, width
+
+    def is_in_table(self, node):
+        node1 = node.parent
+        while node1:
+            if isinstance(node1, docutils.nodes.entry):
+                return True
+            node1 = node1.parent
+        return False
+
+    def visit_legend(self, node):
+        if isinstance(node.parent, docutils.nodes.figure):
+            el1 = self.current_element[-1]
+            el1 = el1[0][0]
+            self.current_element = el1
+            self.paragraph_style_stack.append(self.rststyle('legend'))
+
+    def depart_legend(self, node):
+        if isinstance(node.parent, docutils.nodes.figure):
+            self.paragraph_style_stack.pop()
+            self.set_to_parent()
+            self.set_to_parent()
+            self.set_to_parent()
+
+    def visit_line_block(self, node):
+        self.line_indent_level += 1
+        self.line_block_level += 1
+
+    def depart_line_block(self, node):
+        self.line_indent_level -= 1
+        self.line_block_level -= 1
+
+    def visit_line(self, node):
+        style = 'lineblock%d' % self.line_indent_level
+        el1 = SubElement(self.current_element, 'text:p', attrib={
+                'text:style-name': self.rststyle(style),
+                })
+        self.current_element = el1
+
+    def depart_line(self, node):
+        self.set_to_parent()
+
+    def visit_literal(self, node):
+        el = SubElement(self.current_element, 'text:span',
+            attrib={'text:style-name': self.rststyle('inlineliteral')})
+        self.set_current_element(el)
+
+    def depart_literal(self, node):
+        self.set_to_parent()
+
+    def visit_inline(self, node):
+        styles = node.attributes.get('classes', ())
+        if styles:
+            el = self.current_element
+            for inline_style in styles:
+                el = SubElement(el, 'text:span',
+                                attrib={'text:style-name':
+                                        self.rststyle(inline_style)})
+            count = len(styles)
+        else:
+            # No style was specified so use a default style (old code
+            # crashed if no style was given)
+            el = SubElement(self.current_element, 'text:span')
+            count = 1
+
+        self.set_current_element(el)
+        self.inline_style_count_stack.append(count)
+
+    def depart_inline(self, node):
+        count = self.inline_style_count_stack.pop()
+        for x in range(count):
+            self.set_to_parent()
+
+    def _calculate_code_block_padding(self, line):
+        count = 0
+        matchobj = SPACES_PATTERN.match(line)
+        if matchobj:
+            pad = matchobj.group()
+            count = len(pad)
+        else:
+            matchobj = TABS_PATTERN.match(line)
+            if matchobj:
+                pad = matchobj.group()
+                count = len(pad) * 8
+        return count
+
+    def _add_syntax_highlighting(self, insource, language):
+        lexer = pygments.lexers.get_lexer_by_name(language, stripall=True)
+        if language in ('latex', 'tex'):
+            fmtr = OdtPygmentsLaTeXFormatter(lambda name, parameters=():
+                self.rststyle(name, parameters),
+                escape_function=escape_cdata)
+        else:
+            fmtr = OdtPygmentsProgFormatter(lambda name, parameters=():
+                self.rststyle(name, parameters),
+                escape_function=escape_cdata)
+        outsource = pygments.highlight(insource, lexer, fmtr)
+        return outsource
+
+    def fill_line(self, line):
+        line = FILL_PAT1.sub(self.fill_func1, line)
+        line = FILL_PAT2.sub(self.fill_func2, line)
+        return line
+
+    def fill_func1(self, matchobj):
+        spaces = matchobj.group(0)
+        repl = '<text:s text:c="%d"/>' % (len(spaces), )
+        return repl
+
+    def fill_func2(self, matchobj):
+        spaces = matchobj.group(0)
+        repl = ' <text:s text:c="%d"/>' % (len(spaces) - 1, )
+        return repl
+
+    def visit_literal_block(self, node):
+        if len(self.paragraph_style_stack) > 1:
+            wrapper1 = '<text:p text:style-name="%s">%%s</text:p>' % (
+                self.rststyle('codeblock-indented'), )
+        else:
+            wrapper1 = '<text:p text:style-name="%s">%%s</text:p>' % (
+                self.rststyle('codeblock'), )
+        source = node.astext()
+        if (pygments and
+            self.settings.add_syntax_highlighting
+            #and
+            #node.get('hilight', False)
+            ):
+            language = node.get('language', 'python')
+            source = self._add_syntax_highlighting(source, language)
+        else:
+            source = escape_cdata(source)
+        lines = source.split('\n')
+        # If there is an empty last line, remove it.
+        if lines[-1] == '':
+            del lines[-1]
+        lines1 = ['<wrappertag1 xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">']
+
+        my_lines = []
+        for my_line in lines:
+            my_line = self.fill_line(my_line)
+            my_line = my_line.replace("&#10;", "\n")
+            my_lines.append(my_line)
+        my_lines_str = '<text:line-break/>'.join(my_lines)
+        my_lines_str2 = wrapper1 % (my_lines_str, )
+        lines1.append(my_lines_str2)
+        lines1.append('</wrappertag1>')
+        s1 = ''.join(lines1)
+        if WhichElementTree != "lxml":
+            s1 = s1.encode("utf-8")
+        el1 = etree.fromstring(s1)
+        children = el1.getchildren()
+        for child in children:
+            self.current_element.append(child)
+
+    def depart_literal_block(self, node):
+        pass
+
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    # placeholder for math (see docs/dev/todo.txt)
+    def visit_math(self, node):
+        self.document.reporter.warning('"math" role not supported',
+                base_node=node)
+        self.visit_literal(node)
+
+    def depart_math(self, node):
+        self.depart_literal(node)
+
+    def visit_math_block(self, node):
+        self.document.reporter.warning('"math" directive not supported',
+                base_node=node)
+        self.visit_literal_block(node)
+
+    def depart_math_block(self, node):
+        self.depart_literal_block(node)
+
+    def visit_meta(self, node):
+        name = node.attributes.get('name')
+        content = node.attributes.get('content')
+        if name is not None and content is not None:
+            self.meta_dict[name] = content
+
+    def depart_meta(self, node):
+        pass
+
+    def visit_option_list(self, node):
+        table_name = 'tableoption'
+        #
+        # Generate automatic styles
+        if not self.optiontablestyles_generated:
+            self.optiontablestyles_generated = True
+            el = SubElement(self.automatic_styles, 'style:style', attrib={
+                'style:name': self.rststyle(table_name),
+                'style:family': 'table'}, nsdict=SNSD)
+            el1 = SubElement(el, 'style:table-properties', attrib={
+                'style:width': '17.59cm',
+                'table:align': 'left',
+                'style:shadow': 'none'}, nsdict=SNSD)
+            el = SubElement(self.automatic_styles, 'style:style', attrib={
+                'style:name': self.rststyle('%s.%%c' % table_name, ( 'A', )),
+                'style:family': 'table-column'}, nsdict=SNSD)
+            el1 = SubElement(el, 'style:table-column-properties', attrib={
+                'style:column-width': '4.999cm'}, nsdict=SNSD)
+            el = SubElement(self.automatic_styles, 'style:style', attrib={
+                'style:name': self.rststyle('%s.%%c' % table_name, ( 'B', )),
+                'style:family': 'table-column'}, nsdict=SNSD)
+            el1 = SubElement(el, 'style:table-column-properties', attrib={
+                'style:column-width': '12.587cm'}, nsdict=SNSD)
+            el = SubElement(self.automatic_styles, 'style:style', attrib={
+                'style:name': self.rststyle(
+                    '%s.%%c%%d' % table_name, ( 'A', 1, )),
+                'style:family': 'table-cell'}, nsdict=SNSD)
+            el1 = SubElement(el, 'style:table-cell-properties', attrib={
+                'fo:background-color': 'transparent',
+                'fo:padding': '0.097cm',
+                'fo:border-left': '0.035cm solid #000000',
+                'fo:border-right': 'none',
+                'fo:border-top': '0.035cm solid #000000',
+                'fo:border-bottom': '0.035cm solid #000000'}, nsdict=SNSD)
+            el2 = SubElement(el1, 'style:background-image', nsdict=SNSD)
+            el = SubElement(self.automatic_styles, 'style:style', attrib={
+                'style:name': self.rststyle(
+                    '%s.%%c%%d' % table_name, ( 'B', 1, )),
+                'style:family': 'table-cell'}, nsdict=SNSD)
+            el1 = SubElement(el, 'style:table-cell-properties', attrib={
+                'fo:padding': '0.097cm',
+                'fo:border': '0.035cm solid #000000'}, nsdict=SNSD)
+            el = SubElement(self.automatic_styles, 'style:style', attrib={
+                'style:name': self.rststyle(
+                    '%s.%%c%%d' % table_name, ( 'A', 2, )),
+                'style:family': 'table-cell'}, nsdict=SNSD)
+            el1 = SubElement(el, 'style:table-cell-properties', attrib={
+                'fo:padding': '0.097cm',
+                'fo:border-left': '0.035cm solid #000000',
+                'fo:border-right': 'none',
+                'fo:border-top': 'none',
+                'fo:border-bottom': '0.035cm solid #000000'}, nsdict=SNSD)
+            el = SubElement(self.automatic_styles, 'style:style', attrib={
+                'style:name': self.rststyle(
+                    '%s.%%c%%d' % table_name, ( 'B', 2, )),
+                'style:family': 'table-cell'}, nsdict=SNSD)
+            el1 = SubElement(el, 'style:table-cell-properties', attrib={
+                'fo:padding': '0.097cm',
+                'fo:border-left': '0.035cm solid #000000',
+                'fo:border-right': '0.035cm solid #000000',
+                'fo:border-top': 'none',
+                'fo:border-bottom': '0.035cm solid #000000'}, nsdict=SNSD)
+        #
+        # Generate table data
+        el = self.append_child('table:table', attrib={
+            'table:name': self.rststyle(table_name),
+            'table:style-name': self.rststyle(table_name),
+            })
+        el1 = SubElement(el, 'table:table-column', attrib={
+            'table:style-name': self.rststyle(
+                '%s.%%c' % table_name, ( 'A', ))})
+        el1 = SubElement(el, 'table:table-column', attrib={
+            'table:style-name': self.rststyle(
+                '%s.%%c' % table_name, ( 'B', ))})
+        el1 = SubElement(el, 'table:table-header-rows')
+        el2 = SubElement(el1, 'table:table-row')
+        el3 = SubElement(el2, 'table:table-cell', attrib={
+            'table:style-name': self.rststyle(
+                '%s.%%c%%d' % table_name, ( 'A', 1, )),
+            'office:value-type': 'string'})
+        el4 = SubElement(el3, 'text:p', attrib={
+            'text:style-name': 'Table_20_Heading'})
+        el4.text= 'Option'
+        el3 = SubElement(el2, 'table:table-cell', attrib={
+            'table:style-name': self.rststyle(
+                '%s.%%c%%d' % table_name, ( 'B', 1, )),
+            'office:value-type': 'string'})
+        el4 = SubElement(el3, 'text:p', attrib={
+            'text:style-name': 'Table_20_Heading'})
+        el4.text= 'Description'
+        self.set_current_element(el)
+
+    def depart_option_list(self, node):
+        self.set_to_parent()
+
+    def visit_option_list_item(self, node):
+        el = self.append_child('table:table-row')
+        self.set_current_element(el)
+
+    def depart_option_list_item(self, node):
+        self.set_to_parent()
+
+    def visit_option_group(self, node):
+        el = self.append_child('table:table-cell', attrib={
+            'table:style-name': 'Table%d.A2' % self.table_count,
+            'office:value-type': 'string',
+        })
+        self.set_current_element(el)
+
+    def depart_option_group(self, node):
+        self.set_to_parent()
+
+    def visit_option(self, node):
+        el = self.append_child('text:p', attrib={
+            'text:style-name': 'Table_20_Contents'})
+        el.text = node.astext()
+
+    def depart_option(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        pass
+
+    def depart_option_string(self, node):
+        pass
+
+    def visit_option_argument(self, node):
+        pass
+
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_description(self, node):
+        el = self.append_child('table:table-cell', attrib={
+            'table:style-name': 'Table%d.B2' % self.table_count,
+            'office:value-type': 'string',
+        })
+        el1 = SubElement(el, 'text:p', attrib={
+            'text:style-name': 'Table_20_Contents'})
+        el1.text = node.astext()
+        raise nodes.SkipChildren()
+
+    def depart_description(self, node):
+        pass
+
+    def visit_paragraph(self, node):
+        self.in_paragraph = True
+        if self.in_header:
+            el = self.append_p('header')
+        elif self.in_footer:
+            el = self.append_p('footer')
+        else:
+            style_name = self.paragraph_style_stack[-1]
+            el = self.append_child('text:p',
+                attrib={'text:style-name': style_name})
+            self.append_pending_ids(el)
+        self.set_current_element(el)
+
+    def depart_paragraph(self, node):
+        self.in_paragraph = False
+        self.set_to_parent()
+        if self.in_header:
+            self.header_content.append(
+                self.current_element.getchildren()[-1])
+            self.current_element.remove(
+                self.current_element.getchildren()[-1])
+        elif self.in_footer:
+            self.footer_content.append(
+                self.current_element.getchildren()[-1])
+            self.current_element.remove(
+                self.current_element.getchildren()[-1])
+
+    def visit_problematic(self, node):
+        pass
+
+    def depart_problematic(self, node):
+        pass
+
+    def visit_raw(self, node):
+        if 'format' in node.attributes:
+            formats = node.attributes['format']
+            formatlist = formats.split()
+            if 'odt' in formatlist:
+                rawstr = node.astext()
+                attrstr = ' '.join(['%s="%s"' % (k, v, )
+                    for k,v in CONTENT_NAMESPACE_ATTRIB.items()])
+                contentstr = '<stuff %s>%s</stuff>' % (attrstr, rawstr, )
+                if WhichElementTree != "lxml":
+                    contentstr = contentstr.encode("utf-8")
+                content = etree.fromstring(contentstr)
+                elements = content.getchildren()
+                if len(elements) > 0:
+                    el1 = elements[0]
+                    if self.in_header:
+                        pass
+                    elif self.in_footer:
+                        pass
+                    else:
+                        self.current_element.append(el1)
+        raise nodes.SkipChildren()
+
+    def depart_raw(self, node):
+        if self.in_header:
+            pass
+        elif self.in_footer:
+            pass
+        else:
+            pass
+
+    def visit_reference(self, node):
+        text = node.astext()
+        if self.settings.create_links:
+            if node.has_key('refuri'):
+                    href = node['refuri']
+                    if ( self.settings.cloak_email_addresses
+                         and href.startswith('mailto:')):
+                        href = self.cloak_mailto(href)
+                    el = self.append_child('text:a', attrib={
+                        'xlink:href': '%s' % href,
+                        'xlink:type': 'simple',
+                        })
+                    self.set_current_element(el)
+            elif node.has_key('refid'):
+                if self.settings.create_links:
+                    href = node['refid']
+                    el = self.append_child('text:reference-ref', attrib={
+                        'text:ref-name': '%s' % href,
+                        'text:reference-format': 'text',
+                        })
+            else:
+                self.document.reporter.warning(
+                    'References must have "refuri" or "refid" attribute.')
+        if (self.in_table_of_contents and
+            len(node.children) >= 1 and
+            isinstance(node.children[0], docutils.nodes.generated)):
+            node.remove(node.children[0])
+
+    def depart_reference(self, node):
+        if self.settings.create_links:
+            if node.has_key('refuri'):
+                self.set_to_parent()
+
+    def visit_rubric(self, node):
+        style_name = self.rststyle('rubric')
+        classes = node.get('classes')
+        if classes:
+            class1 = classes[0]
+            if class1:
+                style_name = class1
+        el = SubElement(self.current_element, 'text:h', attrib = {
+            #'text:outline-level': '%d' % section_level,
+            #'text:style-name': 'Heading_20_%d' % section_level,
+            'text:style-name': style_name,
+            })
+        text = node.astext()
+        el.text = self.encode(text)
+
+    def depart_rubric(self, node):
+        pass
+
+    def visit_section(self, node, move_ids=1):
+        self.section_level += 1
+        self.section_count += 1
+        if self.settings.create_sections:
+            el = self.append_child('text:section', attrib={
+                'text:name': 'Section%d' % self.section_count,
+                'text:style-name': 'Sect%d' % self.section_level,
+                })
+            self.set_current_element(el)
+
+    def depart_section(self, node):
+        self.section_level -= 1
+        if self.settings.create_sections:
+            self.set_to_parent()
+
+    def visit_strong(self, node):
+        el = SubElement(self.current_element, 'text:span',
+            attrib={'text:style-name': self.rststyle('strong')})
+        self.set_current_element(el)
+
+    def depart_strong(self, node):
+        self.set_to_parent()
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipChildren()
+
+    def depart_substitution_definition(self, node):
+        pass
+
+    def visit_system_message(self, node):
+        pass
+
+    def depart_system_message(self, node):
+        pass
+
+    def get_table_style(self, node):
+        table_style = None
+        table_name = None
+        use_predefined_table_style = False
+        str_classes = node.get('classes')
+        if str_classes is not None:
+            for str_class in str_classes:
+                if str_class.startswith(TABLESTYLEPREFIX):
+                    table_name = str_class
+                    use_predefined_table_style = True
+                    break
+        if table_name is not None:
+            table_style = self.table_styles.get(table_name)
+            if table_style is None:
+                # If we can't find the table style, issue warning
+                #   and use the default table style.
+                self.document.reporter.warning(
+                    'Can\'t find table style "%s".  Using default.' % (
+                    table_name, ))
+                table_name = TABLENAMEDEFAULT
+                table_style = self.table_styles.get(table_name)
+                if table_style is None:
+                    # If we can't find the default table style, issue a warning
+                    #   and use a built-in default style.
+                    self.document.reporter.warning(
+                        'Can\'t find default table style "%s".  Using built-in default.' % (
+                        table_name, ))
+                    table_style = BUILTIN_DEFAULT_TABLE_STYLE
+        else:
+            table_name = TABLENAMEDEFAULT
+            table_style = self.table_styles.get(table_name)
+            if table_style is None:
+                # If we can't find the default table style, issue a warning
+                #   and use a built-in default style.
+                self.document.reporter.warning(
+                    'Can\'t find default table style "%s".  Using built-in default.' % (
+                    table_name, ))
+                table_style = BUILTIN_DEFAULT_TABLE_STYLE
+        return table_style
+
+    def visit_table(self, node):
+        self.table_count += 1
+        table_style = self.get_table_style(node)
+        table_name = '%s%%d' % TABLESTYLEPREFIX
+        el1 = SubElement(self.automatic_styles, 'style:style', attrib={
+            'style:name': self.rststyle(
+                '%s' % table_name, ( self.table_count, )),
+            'style:family': 'table',
+            }, nsdict=SNSD)
+        if table_style.backgroundcolor is None:
+            el1_1 = SubElement(el1, 'style:table-properties', attrib={
+                #'style:width': '17.59cm',
+                #'table:align': 'margins',
+                'table:align': 'left',
+                'fo:margin-top': '0in',
+                'fo:margin-bottom': '0.10in',
+                }, nsdict=SNSD)
+        else:
+            el1_1 = SubElement(el1, 'style:table-properties', attrib={
+                #'style:width': '17.59cm',
+                'table:align': 'margins',
+                'fo:margin-top': '0in',
+                'fo:margin-bottom': '0.10in',
+                'fo:background-color': table_style.backgroundcolor,
+                }, nsdict=SNSD)
+        # We use a single cell style for all cells in this table.
+        # That's probably not correct, but seems to work.
+        el2 = SubElement(self.automatic_styles, 'style:style', attrib={
+            'style:name': self.rststyle(
+                '%s.%%c%%d' % table_name, ( self.table_count, 'A', 1, )),
+            'style:family': 'table-cell',
+            }, nsdict=SNSD)
+        thickness = self.settings.table_border_thickness
+        if thickness is None:
+            line_style1 = table_style.border
+        else:
+            line_style1 = '0.%03dcm solid #000000' % (thickness, )
+        el2_1 = SubElement(el2, 'style:table-cell-properties', attrib={
+            'fo:padding': '0.049cm',
+            'fo:border-left': line_style1,
+            'fo:border-right': line_style1,
+            'fo:border-top': line_style1,
+            'fo:border-bottom': line_style1,
+            }, nsdict=SNSD)
+        title = None
+        for child in node.children:
+            if child.tagname == 'title':
+                title = child.astext()
+                break
+        if title is not None:
+            el3 = self.append_p('table-title', title)
+        else:
+            pass
+        el4 = SubElement(self.current_element, 'table:table', attrib={
+            'table:name': self.rststyle(
+                '%s' % table_name, ( self.table_count, )),
+            'table:style-name': self.rststyle(
+                '%s' % table_name, ( self.table_count, )),
+            })
+        self.set_current_element(el4)
+        self.current_table_style = el1
+        self.table_width = 0.0
+
+    def depart_table(self, node):
+        attribkey = add_ns('style:width', nsdict=SNSD)
+        attribval = '%.4fin' % (self.table_width, )
+        el1 = self.current_table_style
+        el2 = el1[0]
+        el2.attrib[attribkey] = attribval
+        self.set_to_parent()
+
+    def visit_tgroup(self, node):
+        self.column_count = ord('A') - 1
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_colspec(self, node):
+        self.column_count += 1
+        colspec_name = self.rststyle(
+            '%s%%d.%%s' % TABLESTYLEPREFIX,
+            (self.table_count, chr(self.column_count), )
+            )
+        colwidth = node['colwidth'] / 12.0
+        el1 = SubElement(self.automatic_styles, 'style:style', attrib={
+            'style:name': colspec_name,
+            'style:family': 'table-column',
+            }, nsdict=SNSD)
+        el1_1 = SubElement(el1, 'style:table-column-properties', attrib={
+            'style:column-width': '%.4fin' % colwidth 
+            },
+            nsdict=SNSD)
+        el2 = self.append_child('table:table-column', attrib={
+            'table:style-name': colspec_name,
+            })
+        self.table_width += colwidth
+
+    def depart_colspec(self, node):
+        pass
+
+    def visit_thead(self, node):
+        el = self.append_child('table:table-header-rows')
+        self.set_current_element(el)
+        self.in_thead = True
+        self.paragraph_style_stack.append('Table_20_Heading')
+
+    def depart_thead(self, node):
+        self.set_to_parent()
+        self.in_thead = False
+        self.paragraph_style_stack.pop()
+
+    def visit_row(self, node):
+        self.column_count = ord('A') - 1
+        el = self.append_child('table:table-row')
+        self.set_current_element(el)
+
+    def depart_row(self, node):
+        self.set_to_parent()
+
+    def visit_entry(self, node):
+        self.column_count += 1
+        cellspec_name = self.rststyle(
+            '%s%%d.%%c%%d' % TABLESTYLEPREFIX, 
+            (self.table_count, 'A', 1, )
+            )
+        attrib={
+            'table:style-name': cellspec_name,
+            'office:value-type': 'string',
+            }
+        morecols = node.get('morecols', 0)
+        if morecols > 0:
+            attrib['table:number-columns-spanned'] = '%d' % (morecols + 1,)
+            self.column_count += morecols
+        morerows = node.get('morerows', 0)
+        if morerows > 0:
+            attrib['table:number-rows-spanned'] = '%d' % (morerows + 1,)
+        el1 = self.append_child('table:table-cell', attrib=attrib)
+        self.set_current_element(el1)
+
+    def depart_entry(self, node):
+        self.set_to_parent()
+
+    def visit_tbody(self, node):
+        pass
+
+    def depart_tbody(self, node):
+        pass
+
+    def visit_target(self, node):
+        #
+        # I don't know how to implement targets in ODF.
+        # How do we create a target in oowriter?  A cross-reference?
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            pass
+        else:
+            pass
+
+    def depart_target(self, node):
+        pass
+
+    def visit_title(self, node, move_ids=1, title_type='title'):
+        if isinstance(node.parent, docutils.nodes.section):
+            section_level = self.section_level
+            if section_level > 7:
+                self.document.reporter.warning(
+                    'Heading/section levels greater than 7 not supported.')
+                self.document.reporter.warning(
+                    '    Reducing to heading level 7 for heading: "%s"' % (
+                        node.astext(), ))
+                section_level = 7
+            el1 = self.append_child('text:h', attrib = {
+                'text:outline-level': '%d' % section_level,
+                #'text:style-name': 'Heading_20_%d' % section_level,
+                'text:style-name': self.rststyle(
+                    'heading%d', (section_level, )),
+                })
+            self.append_pending_ids(el1)
+            self.set_current_element(el1)
+        elif isinstance(node.parent, docutils.nodes.document):
+            #    text = self.settings.title
+            #else:
+            #    text = node.astext()
+            el1 = SubElement(self.current_element, 'text:p', attrib = {
+                'text:style-name': self.rststyle(title_type),
+                })
+            self.append_pending_ids(el1)
+            text = node.astext()
+            self.title = text
+            self.found_doc_title = True
+            self.set_current_element(el1)
+
+    def depart_title(self, node):
+        if (isinstance(node.parent, docutils.nodes.section) or
+            isinstance(node.parent, docutils.nodes.document)):
+            self.set_to_parent()
+
+    def visit_subtitle(self, node, move_ids=1):
+        self.visit_title(node, move_ids, title_type='subtitle')
+
+    def depart_subtitle(self, node):
+        self.depart_title(node)
+
+    def visit_title_reference(self, node):
+        el = self.append_child('text:span', attrib={
+            'text:style-name': self.rststyle('quotation')})
+        el.text = self.encode(node.astext())
+        raise nodes.SkipChildren()
+
+    def depart_title_reference(self, node):
+        pass
+
+    def generate_table_of_content_entry_template(self, el1):
+        for idx in range(1, 11):
+            el2 = SubElement(el1, 
+                'text:table-of-content-entry-template', 
+                attrib={
+                    'text:outline-level': "%d" % (idx, ),
+                    'text:style-name': self.rststyle('contents-%d' % (idx, )),
+                })
+            el3 = SubElement(el2, 'text:index-entry-chapter')
+            el3 = SubElement(el2, 'text:index-entry-text')
+            el3 = SubElement(el2, 'text:index-entry-tab-stop', attrib={
+                'style:leader-char': ".",
+                'style:type': "right",
+                })
+            el3 = SubElement(el2, 'text:index-entry-page-number')
+
+    def find_title_label(self, node, class_type, label_key):
+        label = ''
+        title_node = None
+        for child in node.children:
+            if isinstance(child, class_type):
+                title_node = child
+                break
+        if title_node is not None:
+            label = title_node.astext()
+        else:
+            label = self.language.labels[label_key]
+        return label
+
+    def visit_topic(self, node):
+        if 'classes' in node.attributes:
+            if 'contents' in node.attributes['classes']:
+                label = self.find_title_label(node, docutils.nodes.title,
+                    'contents')
+                if self.settings.generate_oowriter_toc:
+                    el1 = self.append_child('text:table-of-content', attrib={
+                        'text:name': 'Table of Contents1',
+                        'text:protected': 'true',
+                        'text:style-name': 'Sect1',
+                        })
+                    el2 = SubElement(el1,
+                        'text:table-of-content-source',
+                        attrib={
+                            'text:outline-level': '10',
+                        })
+                    el3 =SubElement(el2, 'text:index-title-template', attrib={
+                        'text:style-name': 'Contents_20_Heading',
+                        })
+                    el3.text = label
+                    self.generate_table_of_content_entry_template(el2)
+                    el4 = SubElement(el1, 'text:index-body')
+                    el5 = SubElement(el4, 'text:index-title')
+                    el6 = SubElement(el5, 'text:p', attrib={
+                        'text:style-name': self.rststyle('contents-heading'),
+                        })
+                    el6.text = label
+                    self.save_current_element = self.current_element
+                    self.table_of_content_index_body = el4
+                    self.set_current_element(el4)
+                else:
+                    el = self.append_p('horizontalline')
+                    el = self.append_p('centeredtextbody')
+                    el1 = SubElement(el, 'text:span',
+                        attrib={'text:style-name': self.rststyle('strong')})
+                    el1.text = label
+                self.in_table_of_contents = True
+            elif 'abstract' in node.attributes['classes']:
+                el = self.append_p('horizontalline')
+                el = self.append_p('centeredtextbody')
+                el1 = SubElement(el, 'text:span',
+                    attrib={'text:style-name': self.rststyle('strong')})
+                label = self.find_title_label(node, docutils.nodes.title,
+                    'abstract')
+                el1.text = label
+            elif 'dedication' in node.attributes['classes']:
+                el = self.append_p('horizontalline')
+                el = self.append_p('centeredtextbody')
+                el1 = SubElement(el, 'text:span',
+                    attrib={'text:style-name': self.rststyle('strong')})
+                label = self.find_title_label(node, docutils.nodes.title,
+                    'dedication')
+                el1.text = label
+
+    def depart_topic(self, node):
+        if 'classes' in node.attributes:
+            if 'contents' in node.attributes['classes']:
+                if self.settings.generate_oowriter_toc:
+                    self.update_toc_page_numbers(
+                        self.table_of_content_index_body)
+                    self.set_current_element(self.save_current_element)
+                else:
+                    el = self.append_p('horizontalline')
+                self.in_table_of_contents = False
+
+    def update_toc_page_numbers(self, el):
+        collection = []
+        self.update_toc_collect(el, 0, collection)
+        self.update_toc_add_numbers(collection)
+
+    def update_toc_collect(self, el, level, collection):
+        collection.append((level, el))
+        level += 1
+        for child_el in el.getchildren():
+            if child_el.tag != 'text:index-body':
+                self.update_toc_collect(child_el, level, collection)
+
+    def update_toc_add_numbers(self, collection):
+        for level, el1 in collection:
+            if (el1.tag == 'text:p' and
+                el1.text != 'Table of Contents'):
+                el2 = SubElement(el1, 'text:tab')
+                el2.tail = '9999'
+
+
+    def visit_transition(self, node):
+        el = self.append_p('horizontalline')
+
+    def depart_transition(self, node):
+        pass
+
+    #
+    # Admonitions
+    #
+    def visit_warning(self, node):
+        self.generate_admonition(node, 'warning')
+
+    def depart_warning(self, node):
+        self.paragraph_style_stack.pop()
+
+    def visit_attention(self, node):
+        self.generate_admonition(node, 'attention')
+
+    depart_attention = depart_warning
+
+    def visit_caution(self, node):
+        self.generate_admonition(node, 'caution')
+
+    depart_caution = depart_warning
+
+    def visit_danger(self, node):
+        self.generate_admonition(node, 'danger')
+
+    depart_danger = depart_warning
+
+    def visit_error(self, node):
+        self.generate_admonition(node, 'error')
+
+    depart_error = depart_warning
+
+    def visit_hint(self, node):
+        self.generate_admonition(node, 'hint')
+
+    depart_hint = depart_warning
+
+    def visit_important(self, node):
+        self.generate_admonition(node, 'important')
+
+    depart_important = depart_warning
+
+    def visit_note(self, node):
+        self.generate_admonition(node, 'note')
+
+    depart_note = depart_warning
+
+    def visit_tip(self, node):
+        self.generate_admonition(node, 'tip')
+
+    depart_tip = depart_warning
+
+    def visit_admonition(self, node):
+        title = None
+        for child in node.children:
+            if child.tagname == 'title':
+                title = child.astext()
+        if title is None:
+            classes1 = node.get('classes')
+            if classes1:
+                title = classes1[0]
+        self.generate_admonition(node, 'generic', title)
+
+    depart_admonition = depart_warning
+
+    def generate_admonition(self, node, label, title=None):
+        el1 = SubElement(self.current_element, 'text:p', attrib = {
+            'text:style-name': self.rststyle('admon-%s-hdr', ( label, )),
+            })
+        if title:
+            el1.text = title
+        else:
+            el1.text = '%s!' % (label.capitalize(), )
+        s1 = self.rststyle('admon-%s-body', ( label, ))
+        self.paragraph_style_stack.append(s1)
+
+    #
+    # Roles (e.g. subscript, superscript, strong, ...
+    #
+    def visit_subscript(self, node):
+        el = self.append_child('text:span', attrib={
+            'text:style-name': 'rststyle-subscript',
+            })
+        self.set_current_element(el)
+
+    def depart_subscript(self, node):
+        self.set_to_parent()
+
+    def visit_superscript(self, node):
+        el = self.append_child('text:span', attrib={
+            'text:style-name': 'rststyle-superscript',
+            })
+        self.set_current_element(el)
+
+    def depart_superscript(self, node):
+        self.set_to_parent()
+
+
+# Use an own reader to modify transformations done.
+class Reader(standalone.Reader):
+
+    def get_transforms(self):
+        default = standalone.Reader.get_transforms(self)
+        if self.settings.create_links:
+            return default
+        return [ i
+                 for i in default
+                 if i is not references.DanglingReferences ]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/styles.odt
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/odf_odt/styles.odt
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/manpage.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/manpage.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/manpage.py	(revision 1126)
@@ -0,0 +1,1157 @@
+# -*- coding: utf-8 -*-
+# $Id: manpage.py 7628 2013-03-09 10:19:35Z grubert $
+# Author: Engelbert Gruber <grubert@users.sourceforge.net>
+# Copyright: This module is put into the public domain.
+
+"""
+Simple man page writer for reStructuredText.
+
+Man pages (short for "manual pages") contain system documentation on unix-like
+systems. The pages are grouped in numbered sections:
+
+ 1 executable programs and shell commands
+ 2 system calls
+ 3 library functions
+ 4 special files
+ 5 file formats
+ 6 games
+ 7 miscellaneous
+ 8 system administration
+
+Man pages are written *troff*, a text file formatting system.
+
+See http://www.tldp.org/HOWTO/Man-Page for a start.
+
+Man pages have no subsection only parts.
+Standard parts
+
+  NAME ,
+  SYNOPSIS ,
+  DESCRIPTION ,
+  OPTIONS ,
+  FILES ,
+  SEE ALSO ,
+  BUGS ,
+
+and
+
+  AUTHOR .
+
+A unix-like system keeps an index of the DESCRIPTIONs, which is accesable
+by the command whatis or apropos.
+
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+
+import docutils
+from docutils import nodes, writers, languages
+try:
+    import roman
+except ImportError:
+    import docutils.utils.roman as roman
+
+FIELD_LIST_INDENT = 7
+DEFINITION_LIST_INDENT = 7
+OPTION_LIST_INDENT = 7
+BLOCKQOUTE_INDENT = 3.5
+LITERAL_BLOCK_INDENT = 3.5
+
+# Define two macros so man/roff can calculate the
+# indent/unindent margins by itself
+MACRO_DEF = (r""".
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+""")
+
+class Writer(writers.Writer):
+
+    supported = ('manpage',)
+    """Formats this writer supports."""
+
+    output = None
+    """Final translated form of `document`."""
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = Translator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+
+
+class Table(object):
+    def __init__(self):
+        self._rows = []
+        self._options = ['center']
+        self._tab_char = '\t'
+        self._coldefs = []
+    def new_row(self):
+        self._rows.append([])
+    def append_separator(self, separator):
+        """Append the separator for table head."""
+        self._rows.append([separator])
+    def append_cell(self, cell_lines):
+        """cell_lines is an array of lines"""
+        start = 0
+        if len(cell_lines) > 0 and cell_lines[0] == '.sp\n':
+            start = 1
+        self._rows[-1].append(cell_lines[start:])
+        if len(self._coldefs) < len(self._rows[-1]):
+            self._coldefs.append('l')
+    def _minimize_cell(self, cell_lines):
+        """Remove leading and trailing blank and ``.sp`` lines"""
+        while (cell_lines and cell_lines[0] in ('\n', '.sp\n')):
+            del cell_lines[0]
+        while (cell_lines and cell_lines[-1] in ('\n', '.sp\n')):
+            del cell_lines[-1]
+    def as_list(self):
+        text = ['.TS\n']
+        text.append(' '.join(self._options) + ';\n')
+        text.append('|%s|.\n' % ('|'.join(self._coldefs)))
+        for row in self._rows:
+            # row = array of cells. cell = array of lines.
+            text.append('_\n')       # line above
+            text.append('T{\n')
+            for i in range(len(row)):
+                cell = row[i]
+                self._minimize_cell(cell)
+                text.extend(cell)
+                if not text[-1].endswith('\n'):
+                    text[-1] += '\n'
+                if i < len(row)-1:
+                    text.append('T}'+self._tab_char+'T{\n')
+                else:
+                    text.append('T}\n')
+        text.append('_\n')
+        text.append('.TE\n')
+        return text
+
+class Translator(nodes.NodeVisitor):
+    """"""
+
+    words_and_spaces = re.compile(r'\S+| +|\n')
+    possibly_a_roff_command = re.compile(r'\.\w')
+    document_start = """Man page generated from reStructuredText."""
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        lcode = settings.language_code
+        self.language = languages.get_language(lcode, document.reporter)
+        self.head = []
+        self.body = []
+        self.foot = []
+        self.section_level = 0
+        self.context = []
+        self.topic_class = ''
+        self.colspecs = []
+        self.compact_p = 1
+        self.compact_simple = None
+        # the list style "*" bullet or "#" numbered
+        self._list_char = []
+        # writing the header .TH and .SH NAME is postboned after
+        # docinfo.
+        self._docinfo = {
+                "title" : "", "title_upper": "",
+                "subtitle" : "",
+                "manual_section" : "", "manual_group" : "",
+                "author" : [],
+                "date" : "",
+                "copyright" : "",
+                "version" : "",
+                    }
+        self._docinfo_keys = []     # a list to keep the sequence as in source.
+        self._docinfo_names = {}    # to get name from text not normalized.
+        self._in_docinfo = None
+        self._active_table = None
+        self._in_literal = False
+        self.header_written = 0
+        self._line_block = 0
+        self.authors = []
+        self.section_level = 0
+        self._indent = [0]
+        # central definition of simple processing rules
+        # what to output on : visit, depart
+        # Do not use paragraph requests ``.PP`` because these set indentation.
+        # use ``.sp``. Remove superfluous ``.sp`` in ``astext``.
+        #
+        # Fonts are put on a stack, the top one is used.
+        # ``.ft P`` or ``\\fP`` pop from stack.
+        # ``B`` bold, ``I`` italic, ``R`` roman should be available.
+        # Hopefully ``C`` courier too.
+        self.defs = {
+                'indent' : ('.INDENT %.1f\n', '.UNINDENT\n'),
+                'definition_list_item' : ('.TP', ''),
+                'field_name' : ('.TP\n.B ', '\n'),
+                'literal' : ('\\fB', '\\fP'),
+                'literal_block' : ('.sp\n.nf\n.ft C\n', '\n.ft P\n.fi\n'),
+
+                'option_list_item' : ('.TP\n', ''),
+
+                'reference' : (r'\fI\%', r'\fP'),
+                'emphasis': ('\\fI', '\\fP'),
+                'strong' : ('\\fB', '\\fP'),
+                'term' : ('\n.B ', '\n'),
+                'title_reference' : ('\\fI', '\\fP'),
+
+                'topic-title' : ('.SS ',),
+                'sidebar-title' : ('.SS ',),
+
+                'problematic' : ('\n.nf\n', '\n.fi\n'),
+                    }
+        # NOTE do not specify the newline before a dot-command, but ensure
+        # it is there.
+
+    def comment_begin(self, text):
+        """Return commented version of the passed text WITHOUT end of
+        line/comment."""
+        prefix = '.\\" '
+        out_text = ''.join(
+            [(prefix + in_line + '\n')
+            for in_line in text.split('\n')])
+        return out_text
+
+    def comment(self, text):
+        """Return commented version of the passed text."""
+        return self.comment_begin(text)+'.\n'
+
+    def ensure_eol(self):
+        """Ensure the last line in body is terminated by new line."""
+        if len(self.body) > 0 and self.body[-1][-1] != '\n':
+            self.body.append('\n')
+
+    def astext(self):
+        """Return the final formatted document as a string."""
+        if not self.header_written:
+            # ensure we get a ".TH" as viewers require it.
+            self.append_header()
+        # filter body
+        for i in xrange(len(self.body)-1, 0, -1):
+            # remove superfluous vertical gaps.
+            if self.body[i] == '.sp\n':
+                if self.body[i - 1][:4] in ('.BI ','.IP '):
+                    self.body[i] = '.\n'
+                elif (self.body[i - 1][:3] == '.B ' and
+                    self.body[i - 2][:4] == '.TP\n'):
+                    self.body[i] = '.\n'
+                elif (self.body[i - 1] == '\n' and
+                    not self.possibly_a_roff_command.match(self.body[i - 2]) and
+                    (self.body[i - 3][:7] == '.TP\n.B '
+                        or self.body[i - 3][:4] == '\n.B ')
+                     ):
+                    self.body[i] = '.\n'
+        return ''.join(self.head + self.body + self.foot)
+
+    def deunicode(self, text):
+        text = text.replace(u'\xa0', '\\ ')
+        text = text.replace(u'\u2020', '\\(dg')
+        return text
+
+    def visit_Text(self, node):
+        text = node.astext()
+        text = text.replace('\\','\\e')
+        replace_pairs = [
+            (u'-', ur'\-'),
+            (u'\'', ur'\(aq'),
+            (u'´', ur'\''),
+            (u'`', ur'\(ga'),
+            ]
+        for (in_char, out_markup) in replace_pairs:
+            text = text.replace(in_char, out_markup)
+        # unicode
+        text = self.deunicode(text)
+        # prevent interpretation of "." at line start
+        if text.startswith('.'):
+            text = '\\&' + text
+        if self._in_literal:
+            text = text.replace('\n.', '\n\\&.')
+        self.body.append(text)
+
+    def depart_Text(self, node):
+        pass
+
+    def list_start(self, node):
+        class enum_char(object):
+            enum_style = {
+                    'bullet'     : '\\(bu',
+                    'emdash'     : '\\(em',
+                     }
+
+            def __init__(self, style):
+                self._style = style
+                if node.has_key('start'):
+                    self._cnt = node['start'] - 1
+                else:
+                    self._cnt = 0
+                self._indent = 2
+                if style == 'arabic':
+                    # indentation depends on number of childrens
+                    # and start value.
+                    self._indent = len(str(len(node.children)))
+                    self._indent += len(str(self._cnt)) + 1
+                elif style == 'loweralpha':
+                    self._cnt += ord('a') - 1
+                    self._indent = 3
+                elif style == 'upperalpha':
+                    self._cnt += ord('A') - 1
+                    self._indent = 3
+                elif style.endswith('roman'):
+                    self._indent = 5
+
+            def next(self):
+                if self._style == 'bullet':
+                    return self.enum_style[self._style]
+                elif self._style == 'emdash':
+                    return self.enum_style[self._style]
+                self._cnt += 1
+                # TODO add prefix postfix
+                if self._style == 'arabic':
+                    return "%d." % self._cnt
+                elif self._style in ('loweralpha', 'upperalpha'):
+                    return "%c." % self._cnt
+                elif self._style.endswith('roman'):
+                    res = roman.toRoman(self._cnt) + '.'
+                    if self._style.startswith('upper'):
+                        return res.upper()
+                    return res.lower()
+                else:
+                    return "%d." % self._cnt
+            def get_width(self):
+                return self._indent
+            def __repr__(self):
+                return 'enum_style-%s' % list(self._style)
+
+        if node.has_key('enumtype'):
+            self._list_char.append(enum_char(node['enumtype']))
+        else:
+            self._list_char.append(enum_char('bullet'))
+        if len(self._list_char) > 1:
+            # indent nested lists
+            self.indent(self._list_char[-2].get_width())
+        else:
+            self.indent(self._list_char[-1].get_width())
+
+    def list_end(self):
+        self.dedent()
+        self._list_char.pop()
+
+    def header(self):
+        tmpl = (".TH %(title_upper)s %(manual_section)s"
+                " \"%(date)s\" \"%(version)s\" \"%(manual_group)s\"\n"
+                ".SH NAME\n"
+                "%(title)s \- %(subtitle)s\n")
+        return tmpl % self._docinfo
+
+    def append_header(self):
+        """append header with .TH and .SH NAME"""
+        # NOTE before everything
+        # .TH title_upper section date source manual
+        if self.header_written:
+            return
+        self.head.append(self.header())
+        self.head.append(MACRO_DEF)
+        self.header_written = 1
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address')
+
+    def depart_address(self, node):
+        pass
+
+    def visit_admonition(self, node, name=None):
+        #
+        # Make admonitions a simple block quote
+        # with a strong heading
+        #
+        # Using .IP/.RE doesn't preserve indentation
+        # when admonitions contain bullets, literal,
+        # and/or block quotes.
+        #
+        if name:
+            # .. admonition:: has no name
+            self.body.append('.sp\n')
+            name = '%s%s:%s\n' % (
+                self.defs['strong'][0],
+                self.language.labels.get(name, name).upper(),
+                self.defs['strong'][1],
+                )        
+            self.body.append(name)
+        self.visit_block_quote(node)
+
+    def depart_admonition(self, node):
+        self.depart_block_quote(node)
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    depart_attention = depart_admonition
+
+    def visit_docinfo_item(self, node, name):
+        if name == 'author':
+            self._docinfo[name].append(node.astext())
+        else:
+            self._docinfo[name] = node.astext()
+        self._docinfo_keys.append(name)
+        raise nodes.SkipNode
+
+    def depart_docinfo_item(self, node):
+        pass
+
+    def visit_author(self, node):
+        self.visit_docinfo_item(node, 'author')
+
+    depart_author = depart_docinfo_item
+
+    def visit_authors(self, node):
+        # _author is called anyway.
+        pass
+
+    def depart_authors(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        # BUG/HACK: indent alway uses the _last_ indention,
+        # thus we need two of them.
+        self.indent(BLOCKQOUTE_INDENT)
+        self.indent(0)
+
+    def depart_block_quote(self, node):
+        self.dedent()
+        self.dedent()
+
+    def visit_bullet_list(self, node):
+        self.list_start(node)
+
+    def depart_bullet_list(self, node):
+        self.list_end()
+
+    def visit_caption(self, node):
+        pass
+
+    def depart_caption(self, node):
+        pass
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+
+    depart_caution = depart_admonition
+
+    def visit_citation(self, node):
+        num, text = node.astext().split(None, 1)
+        num = num.strip()
+        self.body.append('.IP [%s] 5\n' % num)
+
+    def depart_citation(self, node):
+        pass
+
+    def visit_citation_reference(self, node):
+        self.body.append('['+node.astext()+']')
+        raise nodes.SkipNode
+
+    def visit_classifier(self, node):
+        pass
+
+    def depart_classifier(self, node):
+        pass
+
+    def visit_colspec(self, node):
+        self.colspecs.append(node)
+
+    def depart_colspec(self, node):
+        pass
+
+    def write_colspecs(self):
+        self.body.append("%s.\n" % ('L '*len(self.colspecs)))
+
+    def visit_comment(self, node,
+                      sub=re.compile('-(?=-)').sub):
+        self.body.append(self.comment(node.astext()))
+        raise nodes.SkipNode
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact')
+
+    depart_contact = depart_docinfo_item
+
+    def visit_container(self, node):
+        pass
+
+    def depart_container(self, node):
+        pass
+
+    def visit_compound(self, node):
+        pass
+
+    def depart_compound(self, node):
+        pass
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+
+    depart_danger = depart_admonition
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        pass
+
+    def depart_definition(self, node):
+        pass
+
+    def visit_definition_list(self, node):
+        self.indent(DEFINITION_LIST_INDENT)
+
+    def depart_definition_list(self, node):
+        self.dedent()
+
+    def visit_definition_list_item(self, node):
+        self.body.append(self.defs['definition_list_item'][0])
+
+    def depart_definition_list_item(self, node):
+        self.body.append(self.defs['definition_list_item'][1])
+
+    def visit_description(self, node):
+        pass
+
+    def depart_description(self, node):
+        pass
+
+    def visit_docinfo(self, node):
+        self._in_docinfo = 1
+
+    def depart_docinfo(self, node):
+        self._in_docinfo = None
+        # NOTE nothing should be written before this
+        self.append_header()
+
+    def visit_doctest_block(self, node):
+        self.body.append(self.defs['literal_block'][0])
+        self._in_literal = True
+
+    def depart_doctest_block(self, node):
+        self._in_literal = False
+        self.body.append(self.defs['literal_block'][1])
+
+    def visit_document(self, node):
+        # no blank line between comment and header.
+        self.head.append(self.comment(self.document_start).rstrip()+'\n')
+        # writing header is postboned
+        self.header_written = 0
+
+    def depart_document(self, node):
+        if self._docinfo['author']:
+            self.body.append('.SH AUTHOR\n%s\n'
+                    % ', '.join(self._docinfo['author']))
+        skip = ('author', 'copyright', 'date',
+                'manual_group', 'manual_section',
+                'subtitle',
+                'title', 'title_upper', 'version')
+        for name in self._docinfo_keys:
+            if name == 'address':
+                self.body.append("\n%s:\n%s%s.nf\n%s\n.fi\n%s%s" % (
+                                    self.language.labels.get(name, name),
+                                    self.defs['indent'][0] % 0,
+                                    self.defs['indent'][0] % BLOCKQOUTE_INDENT,
+                                    self._docinfo[name],
+                                    self.defs['indent'][1],
+                                    self.defs['indent'][1]))
+            elif not name in skip:
+                if name in self._docinfo_names:
+                    label = self._docinfo_names[name]
+                else:
+                    label = self.language.labels.get(name, name)
+                self.body.append("\n%s: %s\n" % (label, self._docinfo[name]))
+        if self._docinfo['copyright']:
+            self.body.append('.SH COPYRIGHT\n%s\n'
+                    % self._docinfo['copyright'])
+        self.body.append(self.comment(
+                        'Generated by docutils manpage writer.'))
+
+    def visit_emphasis(self, node):
+        self.body.append(self.defs['emphasis'][0])
+
+    def depart_emphasis(self, node):
+        self.body.append(self.defs['emphasis'][1])
+
+    def visit_entry(self, node):
+        # a cell in a table row
+        if 'morerows' in node:
+            self.document.reporter.warning('"table row spanning" not supported',
+                    base_node=node)
+        if 'morecols' in node:
+            self.document.reporter.warning(
+                    '"table cell spanning" not supported', base_node=node)
+        self.context.append(len(self.body))
+
+    def depart_entry(self, node):
+        start = self.context.pop()
+        self._active_table.append_cell(self.body[start:])
+        del self.body[start:]
+
+    def visit_enumerated_list(self, node):
+        self.list_start(node)
+
+    def depart_enumerated_list(self, node):
+        self.list_end()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+
+    depart_error = depart_admonition
+
+    def visit_field(self, node):
+        pass
+
+    def depart_field(self, node):
+        pass
+
+    def visit_field_body(self, node):
+        if self._in_docinfo:
+            name_normalized = self._field_name.lower().replace(" ","_")
+            self._docinfo_names[name_normalized] = self._field_name
+            self.visit_docinfo_item(node, name_normalized)
+            raise nodes.SkipNode
+
+    def depart_field_body(self, node):
+        pass
+
+    def visit_field_list(self, node):
+        self.indent(FIELD_LIST_INDENT)
+
+    def depart_field_list(self, node):
+        self.dedent()
+
+    def visit_field_name(self, node):
+        if self._in_docinfo:
+            self._field_name = node.astext()
+            raise nodes.SkipNode
+        else:
+            self.body.append(self.defs['field_name'][0])
+
+    def depart_field_name(self, node):
+        self.body.append(self.defs['field_name'][1])
+
+    def visit_figure(self, node):
+        self.indent(2.5)
+        self.indent(0)
+
+    def depart_figure(self, node):
+        self.dedent()
+        self.dedent()
+
+    def visit_footer(self, node):
+        self.document.reporter.warning('"footer" not supported',
+                base_node=node)
+
+    def depart_footer(self, node):
+        pass
+
+    def visit_footnote(self, node):
+        num, text = node.astext().split(None, 1)
+        num = num.strip()
+        self.body.append('.IP [%s] 5\n' % self.deunicode(num))
+
+    def depart_footnote(self, node):
+        pass
+
+    def footnote_backrefs(self, node):
+        self.document.reporter.warning('"footnote_backrefs" not supported',
+                base_node=node)
+
+    def visit_footnote_reference(self, node):
+        self.body.append('['+self.deunicode(node.astext())+']')
+        raise nodes.SkipNode
+
+    def depart_footnote_reference(self, node):
+        pass
+
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        raise NotImplementedError, node.astext()
+
+    def depart_header(self, node):
+        pass
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+
+    depart_hint = depart_admonition
+
+    def visit_subscript(self, node):
+        self.body.append('\\s-2\\d')
+
+    def depart_subscript(self, node):
+        self.body.append('\\u\\s0')
+
+    def visit_superscript(self, node):
+        self.body.append('\\s-2\\u')
+
+    def depart_superscript(self, node):
+        self.body.append('\\d\\s0')
+
+    def visit_attribution(self, node):
+        self.body.append('\\(em ')
+
+    def depart_attribution(self, node):
+        self.body.append('\n')
+
+    def visit_image(self, node):
+        self.document.reporter.warning('"image" not supported',
+                base_node=node)
+        text = []
+        if 'alt' in node.attributes:
+            text.append(node.attributes['alt'])
+        if 'uri' in node.attributes:
+            text.append(node.attributes['uri'])
+        self.body.append('[image: %s]\n' % ('/'.join(text)))
+        raise nodes.SkipNode
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+
+    depart_important = depart_admonition
+
+    def visit_label(self, node):
+        # footnote and citation
+        if (isinstance(node.parent, nodes.footnote)
+            or isinstance(node.parent, nodes.citation)):
+            raise nodes.SkipNode
+        self.document.reporter.warning('"unsupported "label"',
+                base_node=node)
+        self.body.append('[')
+
+    def depart_label(self, node):
+        self.body.append(']\n')
+
+    def visit_legend(self, node):
+        pass
+
+    def depart_legend(self, node):
+        pass
+
+    # WHAT should we use .INDENT, .UNINDENT ?
+    def visit_line_block(self, node):
+        self._line_block += 1
+        if self._line_block == 1:
+            # TODO: separate inline blocks from previous paragraphs
+            # see http://hg.intevation.org/mercurial/crew/rev/9c142ed9c405
+            # self.body.append('.sp\n')
+            # but it does not work for me.
+            self.body.append('.nf\n')
+        else:
+            self.body.append('.in +2\n')
+
+    def depart_line_block(self, node):
+        self._line_block -= 1
+        if self._line_block == 0:
+            self.body.append('.fi\n')
+            self.body.append('.sp\n')
+        else:
+            self.body.append('.in -2\n')
+
+    def visit_line(self, node):
+        pass
+
+    def depart_line(self, node):
+        self.body.append('\n')
+
+    def visit_list_item(self, node):
+        # man 7 man argues to use ".IP" instead of ".TP"
+        self.body.append('.IP %s %d\n' % (
+                self._list_char[-1].next(),
+                self._list_char[-1].get_width(),))
+
+    def depart_list_item(self, node):
+        pass
+
+    def visit_literal(self, node):
+        self.body.append(self.defs['literal'][0])
+
+    def depart_literal(self, node):
+        self.body.append(self.defs['literal'][1])
+
+    def visit_literal_block(self, node):
+        # BUG/HACK: indent alway uses the _last_ indention,
+        # thus we need two of them.
+        self.indent(LITERAL_BLOCK_INDENT)
+        self.indent(0)        
+        self.body.append(self.defs['literal_block'][0])
+        self._in_literal = True
+
+    def depart_literal_block(self, node):
+        self._in_literal = False
+        self.body.append(self.defs['literal_block'][1])
+        self.dedent()
+        self.dedent()
+
+    def visit_math(self, node):
+        self.document.reporter.warning('"math" role not supported',
+                base_node=node)
+        self.visit_literal(node)
+
+    def depart_math(self, node):
+        self.depart_literal(node)
+
+    def visit_math_block(self, node):
+        self.document.reporter.warning('"math" directive not supported',
+                base_node=node)
+        self.visit_literal_block(node)
+
+    def depart_math_block(self, node):
+        self.depart_literal_block(node)
+
+    def visit_meta(self, node):
+        raise NotImplementedError, node.astext()
+
+    def depart_meta(self, node):
+        pass
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+
+    depart_note = depart_admonition
+
+    def indent(self, by=0.5):
+        # if we are in a section ".SH" there already is a .RS
+        step = self._indent[-1]
+        self._indent.append(by)
+        self.body.append(self.defs['indent'][0] % step)
+
+    def dedent(self):
+        self._indent.pop()
+        self.body.append(self.defs['indent'][1])
+
+    def visit_option_list(self, node):
+        self.indent(OPTION_LIST_INDENT)
+
+    def depart_option_list(self, node):
+        self.dedent()
+
+    def visit_option_list_item(self, node):
+        # one item of the list
+        self.body.append(self.defs['option_list_item'][0])
+
+    def depart_option_list_item(self, node):
+        self.body.append(self.defs['option_list_item'][1])
+
+    def visit_option_group(self, node):
+        # as one option could have several forms it is a group
+        # options without parameter bold only, .B, -v
+        # options with parameter bold italic, .BI, -f file
+        #
+        # we do not know if .B or .BI
+        self.context.append('.B')           # blind guess
+        self.context.append(len(self.body)) # to be able to insert later
+        self.context.append(0)              # option counter
+
+    def depart_option_group(self, node):
+        self.context.pop()  # the counter
+        start_position = self.context.pop()
+        text = self.body[start_position:]
+        del self.body[start_position:]
+        self.body.append('%s%s\n' % (self.context.pop(), ''.join(text)))
+
+    def visit_option(self, node):
+        # each form of the option will be presented separately
+        if self.context[-1] > 0:
+            self.body.append('\\fP,\\fB ')
+        if self.context[-3] == '.BI':
+            self.body.append('\\')
+        self.body.append(' ')
+
+    def depart_option(self, node):
+        self.context[-1] += 1
+
+    def visit_option_string(self, node):
+        # do not know if .B or .BI
+        pass
+
+    def depart_option_string(self, node):
+        pass
+
+    def visit_option_argument(self, node):
+        self.context[-3] = '.BI' # bold/italic alternate
+        if node['delimiter'] != ' ':
+            self.body.append('\\fB%s ' % node['delimiter'])
+        elif self.body[len(self.body)-1].endswith('='):
+            # a blank only means no blank in output, just changing font
+            self.body.append(' ')
+        else:
+            # blank backslash blank, switch font then a blank
+            self.body.append(' \\ ')
+
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        pass
+
+    def first_child(self, node):
+        first = isinstance(node.parent[0], nodes.label) # skip label
+        for child in node.parent.children[first:]:
+            if isinstance(child, nodes.Invisible):
+                continue
+            if child is node:
+                return 1
+            break
+        return 0
+
+    def visit_paragraph(self, node):
+        # ``.PP`` : Start standard indented paragraph.
+        # ``.LP`` : Start block paragraph, all except the first.
+        # ``.P [type]``  : Start paragraph type.
+        # NOTE dont use paragraph starts because they reset indentation.
+        # ``.sp`` is only vertical space
+        self.ensure_eol()
+        if not self.first_child(node):
+            self.body.append('.sp\n')
+
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_problematic(self, node):
+        self.body.append(self.defs['problematic'][0])
+
+    def depart_problematic(self, node):
+        self.body.append(self.defs['problematic'][1])
+
+    def visit_raw(self, node):
+        if node.get('format') == 'manpage':
+            self.body.append(node.astext() + "\n")
+        # Keep non-manpage raw text out of output:
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        """E.g. link or email address."""
+        self.body.append(self.defs['reference'][0])
+
+    def depart_reference(self, node):
+        self.body.append(self.defs['reference'][1])
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision')
+
+    depart_revision = depart_docinfo_item
+
+    def visit_row(self, node):
+        self._active_table.new_row()
+
+    def depart_row(self, node):
+        pass
+
+    def visit_section(self, node):
+        self.section_level += 1
+
+    def depart_section(self, node):
+        self.section_level -= 1
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status')
+
+    depart_status = depart_docinfo_item
+
+    def visit_strong(self, node):
+        self.body.append(self.defs['strong'][0])
+
+    def depart_strong(self, node):
+        self.body.append(self.defs['strong'][1])
+
+    def visit_substitution_definition(self, node):
+        """Internal only."""
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.document.reporter.warning('"substitution_reference" not supported',
+                base_node=node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append(self.defs['strong'][0])
+        elif isinstance(node.parent, nodes.document):
+            self.visit_docinfo_item(node, 'subtitle')
+        elif isinstance(node.parent, nodes.section):
+            self.body.append(self.defs['strong'][0])
+
+    def depart_subtitle(self, node):
+        # document subtitle calls SkipNode
+        self.body.append(self.defs['strong'][1]+'\n.PP\n')
+
+    def visit_system_message(self, node):
+        # TODO add report_level
+        #if node['level'] < self.document.reporter['writer'].report_level:
+        #    Level is too low to display:
+        #    raise nodes.SkipNode
+        attr = {}
+        backref_text = ''
+        if node.hasattr('id'):
+            attr['name'] = node['id']
+        if node.hasattr('line'):
+            line = ', line %s' % node['line']
+        else:
+            line = ''
+        self.body.append('.IP "System Message: %s/%s (%s:%s)"\n'
+                         % (node['type'], node['level'], node['source'], line))
+
+    def depart_system_message(self, node):
+        pass
+
+    def visit_table(self, node):
+        self._active_table = Table()
+
+    def depart_table(self, node):
+        self.ensure_eol()
+        self.body.extend(self._active_table.as_list())
+        self._active_table = None
+
+    def visit_target(self, node):
+        # targets are in-document hyper targets, without any use for man-pages.
+        raise nodes.SkipNode
+
+    def visit_tbody(self, node):
+        pass
+
+    def depart_tbody(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.body.append(self.defs['term'][0])
+
+    def depart_term(self, node):
+        self.body.append(self.defs['term'][1])
+
+    def visit_tgroup(self, node):
+        pass
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        # MAYBE double line '='
+        pass
+
+    def depart_thead(self, node):
+        # MAYBE double line '='
+        pass
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+
+    depart_tip = depart_admonition
+
+    def visit_title(self, node):
+        if isinstance(node.parent, nodes.topic):
+            self.body.append(self.defs['topic-title'][0])
+        elif isinstance(node.parent, nodes.sidebar):
+            self.body.append(self.defs['sidebar-title'][0])
+        elif isinstance(node.parent, nodes.admonition):
+            self.body.append('.IP "')
+        elif self.section_level == 0:
+            self._docinfo['title'] = node.astext()
+            # document title for .TH
+            self._docinfo['title_upper'] = node.astext().upper()
+            raise nodes.SkipNode
+        elif self.section_level == 1:
+            self.body.append('.SH %s\n' % self.deunicode(node.astext().upper()))
+            raise nodes.SkipNode
+        else:
+            self.body.append('.SS ')
+
+    def depart_title(self, node):
+        if isinstance(node.parent, nodes.admonition):
+            self.body.append('"')
+        self.body.append('\n')
+
+    def visit_title_reference(self, node):
+        """inline citation reference"""
+        self.body.append(self.defs['title_reference'][0])
+
+    def depart_title_reference(self, node):
+        self.body.append(self.defs['title_reference'][1])
+
+    def visit_topic(self, node):
+        pass
+
+    def depart_topic(self, node):
+        pass
+
+    def visit_sidebar(self, node):
+        pass
+
+    def depart_sidebar(self, node):
+        pass
+
+    def visit_rubric(self, node):
+        pass
+
+    def depart_rubric(self, node):
+        pass
+
+    def visit_transition(self, node):
+        # .PP      Begin a new paragraph and reset prevailing indent.
+        # .sp N    leaves N lines of blank space.
+        # .ce      centers the next line
+        self.body.append('\n.sp\n.ce\n----\n')
+
+    def depart_transition(self, node):
+        self.body.append('\n.ce 0\n.sp\n')
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version')
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+
+    depart_warning = depart_admonition
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+# vim: set fileencoding=utf-8 et ts=4 ai :
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/null.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/null.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/null.py	(revision 1126)
@@ -0,0 +1,21 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A do-nothing Writer.
+"""
+
+from docutils import writers
+
+
+class Writer(writers.UnfilteredWriter):
+
+    supported = ('null',)
+    """Formats this writer supports."""
+
+    config_section = 'null writer'
+    config_section_dependencies = ('writers',)
+
+    def translate(self):
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/__init__.py	(revision 1126)
@@ -0,0 +1,823 @@
+# $Id: __init__.py 7977 2016-11-29 12:00:39Z milde $
+# Author: David Goodger
+# Maintainer: docutils-develop@lists.sourceforge.net
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple HyperText Markup Language document tree Writer.
+
+The output conforms to the XHTML version 1.0 Transitional DTD
+(*almost* strict).  The output contains a minimum of formatting
+information.  The cascading style sheet "html4css1.css" is required
+for proper viewing with a modern graphical browser.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os.path
+import docutils
+from docutils import frontend, nodes, writers, io
+from docutils.transforms import writer_aux
+from docutils.writers import _html_base
+
+class Writer(writers._html_base.Writer):
+
+    supported = ('html', 'html4', 'html4css1', 'xhtml', 'xhtml10')
+    """Formats this writer supports."""
+
+    default_stylesheets = ['html4css1.css']
+    default_stylesheet_dirs = ['.',
+        os.path.abspath(os.path.dirname(__file__)),
+        # for math.css
+        os.path.abspath(os.path.join(
+            os.path.dirname(os.path.dirname(__file__)), 'html5_polyglot'))
+       ]
+
+    default_template = 'template.txt'
+    default_template_path = os.path.join(
+        os.path.dirname(os.path.abspath(__file__)), default_template)
+
+    settings_spec = (
+        'HTML-Specific Options',
+        None,
+        (('Specify the template file (UTF-8 encoded).  Default is "%s".'
+          % default_template_path,
+          ['--template'],
+          {'default': default_template_path, 'metavar': '<file>'}),
+         ('Comma separated list of stylesheet URLs. '
+          'Overrides previous --stylesheet and --stylesheet-path settings.',
+          ['--stylesheet'],
+          {'metavar': '<URL[,URL,...]>', 'overrides': 'stylesheet_path',
+           'validator': frontend.validate_comma_separated_list}),
+         ('Comma separated list of stylesheet paths. '
+          'Relative paths are expanded if a matching file is found in '
+          'the --stylesheet-dirs. With --link-stylesheet, '
+          'the path is rewritten relative to the output HTML file. '
+          'Default: "%s"' % ','.join(default_stylesheets),
+          ['--stylesheet-path'],
+          {'metavar': '<file[,file,...]>', 'overrides': 'stylesheet',
+           'validator': frontend.validate_comma_separated_list,
+           'default': default_stylesheets}),
+         ('Embed the stylesheet(s) in the output HTML file.  The stylesheet '
+          'files must be accessible during processing. This is the default.',
+          ['--embed-stylesheet'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Link to the stylesheet(s) in the output HTML file. '
+          'Default: embed stylesheets.',
+          ['--link-stylesheet'],
+          {'dest': 'embed_stylesheet', 'action': 'store_false'}),
+         ('Comma-separated list of directories where stylesheets are found. '
+          'Used by --stylesheet-path when expanding relative path arguments. '
+          'Default: "%s"' % default_stylesheet_dirs,
+          ['--stylesheet-dirs'],
+          {'metavar': '<dir[,dir,...]>',
+           'validator': frontend.validate_comma_separated_list,
+           'default': default_stylesheet_dirs}),
+         ('Specify the initial header level.  Default is 1 for "<h1>".  '
+          'Does not affect document title & subtitle (see --no-doc-title).',
+          ['--initial-header-level'],
+          {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
+           'metavar': '<level>'}),
+         ('Specify the maximum width (in characters) for one-column field '
+          'names.  Longer field names will span an entire row of the table '
+          'used to render the field list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--field-name-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Specify the maximum width (in characters) for options in option '
+          'lists.  Longer options will span an entire row of the table used '
+          'to render the option list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--option-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "brackets".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'brackets',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Remove extra vertical whitespace between items of "simple" bullet '
+          'lists and enumerated lists.  Default: enabled.',
+          ['--compact-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple bullet and enumerated lists.',
+          ['--no-compact-lists'],
+          {'dest': 'compact_lists', 'action': 'store_false'}),
+         ('Remove extra vertical whitespace between items of simple field '
+          'lists.  Default: enabled.',
+          ['--compact-field-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple field lists.',
+          ['--no-compact-field-lists'],
+          {'dest': 'compact_field_lists', 'action': 'store_false'}),
+         ('Added to standard table classes. '
+          'Defined styles: "borderless". Default: ""',
+          ['--table-style'],
+          {'default': ''}),
+         ('Math output format, one of "MathML", "HTML", "MathJax" '
+          'or "LaTeX". Default: "HTML math.css"',
+          ['--math-output'],
+          {'default': 'HTML math.css'}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Obfuscate email addresses to confuse harvesters while still '
+          'keeping email links usable with standards-compliant browsers.',
+          ['--cloak-email-addresses'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    config_section = 'html4css1 writer'
+
+    def __init__(self):
+        self.parts = {}
+        self.translator_class = HTMLTranslator
+
+
+class HTMLTranslator(writers._html_base.HTMLTranslator):
+    """
+    The html4css1 writer has been optimized to produce visually compact
+    lists (less vertical whitespace).  HTML's mixed content models
+    allow list items to contain "<li><p>body elements</p></li>" or
+    "<li>just text</li>" or even "<li>text<p>and body
+    elements</p>combined</li>", each with different effects.  It would
+    be best to stick with strict body elements in list items, but they
+    affect vertical spacing in older browsers (although they really
+    shouldn't).
+    The html5_polyglot writer solves this using CSS2.
+
+    Here is an outline of the optimization:
+
+    - Check for and omit <p> tags in "simple" lists: list items
+      contain either a single paragraph, a nested simple list, or a
+      paragraph followed by a nested simple list.  This means that
+      this list can be compact:
+
+          - Item 1.
+          - Item 2.
+
+      But this list cannot be compact:
+
+          - Item 1.
+
+            This second paragraph forces space between list items.
+
+          - Item 2.
+
+    - In non-list contexts, omit <p> tags on a paragraph if that
+      paragraph is the only child of its parent (footnotes & citations
+      are allowed a label first).
+
+    - Regardless of the above, in definitions, table cells, field bodies,
+      option descriptions, and list items, mark the first child with
+      'class="first"' and the last child with 'class="last"'.  The stylesheet
+      sets the margins (top & bottom respectively) to 0 for these elements.
+
+    The ``no_compact_lists`` setting (``--no-compact-lists`` command-line
+    option) disables list whitespace optimization.
+    """
+
+    # The following definitions are required for display in browsers limited
+    # to CSS1 or backwards compatible behaviour of the writer:
+
+    doctype = (
+        '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
+
+    content_type = ('<meta http-equiv="Content-Type"'
+                    ' content="text/html; charset=%s" />\n')
+    content_type_mathml = ('<meta http-equiv="Content-Type"'
+                           ' content="application/xhtml+xml; charset=%s" />\n')
+
+    # encode also non-breaking space
+    special_characters = dict(_html_base.HTMLTranslator.special_characters)
+    special_characters[0xa0] = u'&nbsp;'
+
+    # use character reference for dash (not valid in HTML5)
+    attribution_formats = {'dash': ('&mdash;', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    # ersatz for first/last pseudo-classes missing in CSS1
+    def set_first_last(self, node):
+        self.set_class_on_child(node, 'first', 0)
+        self.set_class_on_child(node, 'last', -1)
+
+    # add newline after opening tag
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address', meta=False)
+        self.body.append(self.starttag(node, 'pre', CLASS='address'))
+
+
+    # ersatz for first/last pseudo-classes
+    def visit_admonition(self, node):
+        node['classes'].insert(0, 'admonition')
+        self.body.append(self.starttag(node, 'div'))
+        self.set_first_last(node)
+
+    # author, authors: use <br> instead of paragraphs
+    def visit_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            if self.author_in_authors:
+                self.body.append('\n<br />')
+        else:
+            self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            self.author_in_authors = True
+        else:
+            self.depart_docinfo_item()
+
+    def visit_authors(self, node):
+        self.visit_docinfo_item(node, 'authors')
+        self.author_in_authors = False  # initialize
+
+    def depart_authors(self, node):
+        self.depart_docinfo_item()
+
+    # Compact lists:
+    # exclude definition lists and field lists (non-compact by default)
+
+    def is_compactable(self, node):
+        return ('compact' in node['classes']
+                or (self.settings.compact_lists
+                    and 'open' not in node['classes']
+                    and (self.compact_simple
+                         or self.topic_classes == ['contents']
+                         # TODO: self.in_contents
+                         or self.check_simple_list(node))))
+
+    # citations: Use table for bibliographic references.
+    def visit_citation(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils citation',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def depart_citation(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    # insert classifier-delimiter (not required with CSS2)
+    def visit_classifier(self, node):
+        self.body.append(' <span class="classifier-delimiter">:</span> ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
+
+    # rewritten in _html_base (support for "auto" width)
+    def depart_colspec(self, node):
+        pass
+
+    def write_colspecs(self):
+        width = 0
+        for node in self.colspecs:
+            width += node['colwidth']
+        for node in self.colspecs:
+            colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
+            self.body.append(self.emptytag(node, 'col',
+                                           width='%i%%' % colwidth))
+        self.colspecs = []
+
+    # ersatz for first/last pseudo-classes
+    def visit_definition(self, node):
+        self.body.append('</dt>\n')
+        self.body.append(self.starttag(node, 'dd', ''))
+        self.set_first_last(node)
+
+    # don't add "simple" class value
+    def visit_definition_list(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS='docutils'))
+
+    # use a table for description lists
+    def visit_description(self, node):
+        self.body.append(self.starttag(node, 'td', ''))
+        self.set_first_last(node)
+
+    def depart_description(self, node):
+        self.body.append('</td>')
+
+    # use table for docinfo
+    def visit_docinfo(self, node):
+        self.context.append(len(self.body))
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docinfo',
+                                       frame="void", rules="none"))
+        self.body.append('<col class="docinfo-name" />\n'
+                         '<col class="docinfo-content" />\n'
+                         '<tbody valign="top">\n')
+        self.in_docinfo = True
+
+    def depart_docinfo(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.in_docinfo = False
+        start = self.context.pop()
+        self.docinfo = self.body[start:]
+        self.body = []
+
+    def visit_docinfo_item(self, node, name, meta=True):
+        if meta:
+            meta_tag = '<meta name="%s" content="%s" />\n' \
+                       % (name, self.attval(node.astext()))
+            self.add_meta(meta_tag)
+        self.body.append(self.starttag(node, 'tr', ''))
+        self.body.append('<th class="docinfo-name">%s:</th>\n<td>'
+                         % self.language.labels[name])
+        if len(node):
+            if isinstance(node[0], nodes.Element):
+                node[0]['classes'].append('first')
+            if isinstance(node[-1], nodes.Element):
+                node[-1]['classes'].append('last')
+
+    def depart_docinfo_item(self):
+        self.body.append('</td></tr>\n')
+
+    # add newline after opening tag
+    def visit_doctest_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
+
+    # insert an NBSP into empty cells, ersatz for first/last
+    def visit_entry(self, node):
+        writers._html_base.HTMLTranslator.visit_entry(self, node)
+        if len(node) == 0:              # empty cell
+            self.body.append('&nbsp;')
+        self.set_first_last(node)
+
+    # ersatz for first/last pseudo-classes
+    def visit_enumerated_list(self, node):
+        """
+        The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
+        cannot be emulated in CSS1 (HTML 5 reincludes it).
+        """
+        atts = {}
+        if 'start' in node:
+            atts['start'] = node['start']
+        if 'enumtype' in node:
+            atts['class'] = node['enumtype']
+        # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
+        # single "format" attribute? Use CSS2?
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = (atts.get('class', '') + ' simple').strip()
+        self.body.append(self.starttag(node, 'ol', **atts))
+
+    def depart_enumerated_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ol>\n')
+
+    # use table for field-list:
+    def visit_field(self, node):
+        self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
+
+    def depart_field(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_field_body(self, node):
+        self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
+        self.set_class_on_child(node, 'first', 0)
+        field = node.parent
+        if (self.compact_field_list or
+            isinstance(field.parent, nodes.docinfo) or
+            field.parent.index(field) == len(field.parent) - 1):
+            # If we are in a compact list, the docinfo, or if this is
+            # the last field of the field list, do not add vertical
+            # space after last element.
+            self.set_class_on_child(node, 'last', -1)
+
+    def depart_field_body(self, node):
+        self.body.append('</td>\n')
+
+    def visit_field_list(self, node):
+        self.context.append((self.compact_field_list, self.compact_p))
+        self.compact_p = None
+        if 'compact' in node['classes']:
+            self.compact_field_list = True
+        elif (self.settings.compact_field_lists
+              and 'open' not in node['classes']):
+            self.compact_field_list = True
+        if self.compact_field_list:
+            for field in node:
+                field_body = field[-1]
+                assert isinstance(field_body, nodes.field_body)
+                children = [n for n in field_body
+                            if not isinstance(n, nodes.Invisible)]
+                if not (len(children) == 0 or
+                        len(children) == 1 and
+                        isinstance(children[0],
+                                   (nodes.paragraph, nodes.line_block))):
+                    self.compact_field_list = False
+                    break
+        self.body.append(self.starttag(node, 'table', frame='void',
+                                       rules='none',
+                                       CLASS='docutils field-list'))
+        self.body.append('<col class="field-name" />\n'
+                         '<col class="field-body" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_field_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.compact_field_list, self.compact_p = self.context.pop()
+
+    def visit_field_name(self, node):
+        atts = {}
+        if self.in_docinfo:
+            atts['class'] = 'docinfo-name'
+        else:
+            atts['class'] = 'field-name'
+        if ( self.settings.field_name_limit
+             and len(node.astext()) > self.settings.field_name_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n'
+                                + self.starttag(node.parent, 'tr', '',
+                                                CLASS='field')
+                                + '<td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'th', '', **atts))
+
+    def depart_field_name(self, node):
+        self.body.append(':</th>')
+        self.body.append(self.context.pop())
+
+    # use table for footnote text
+    def visit_footnote(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils footnote',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def footnote_backrefs(self, node):
+        backlinks = []
+        backrefs = node['backrefs']
+        if self.settings.footnote_backlinks and backrefs:
+            if len(backrefs) == 1:
+                self.context.append('')
+                self.context.append('</a>')
+                self.context.append('<a class="fn-backref" href="#%s">'
+                                    % backrefs[0])
+            else:
+                # Python 2.4 fails with enumerate(backrefs, 1)
+                for (i, backref) in enumerate(backrefs):
+                    backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
+                                     % (backref, i+1))
+                self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
+                self.context += ['', '']
+        else:
+            self.context.append('')
+            self.context += ['', '']
+        # If the node does not only consist of a label.
+        if len(node) > 1:
+            # If there are preceding backlinks, we do not set class
+            # 'first', because we need to retain the top-margin.
+            if not backlinks:
+                node[1]['classes'].append('first')
+            node[-1]['classes'].append('last')
+
+    def depart_footnote(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    # insert markers in text as pseudo-classes are not supported in CSS1:
+    def visit_footnote_reference(self, node):
+        href = '#' + node['refid']
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        else:
+            assert format == 'superscript'
+            suffix = '<sup>'
+            self.context.append('</sup>')
+        self.body.append(self.starttag(node, 'a', suffix,
+                                       CLASS='footnote-reference', href=href))
+
+    def depart_footnote_reference(self, node):
+        self.body.append(self.context.pop() + '</a>')
+
+    # just pass on generated text
+    def visit_generated(self, node):
+        pass
+
+    # Image types to place in an <object> element
+    # SVG not supported by IE up to version 8
+    # (html4css1 strives for IE6 compatibility)
+    object_image_types = {'.svg': 'image/svg+xml',
+                         '.swf': 'application/x-shockwave-flash'}
+
+    # use table for footnote text,
+    # context added in footnote_backrefs.
+    def visit_label(self, node):
+        self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
+                                       CLASS='label'))
+
+    def depart_label(self, node):
+        self.body.append(']%s</td><td>%s' % (self.context.pop(), self.context.pop()))
+
+
+    # ersatz for first/last pseudo-classes
+    def visit_list_item(self, node):
+        self.body.append(self.starttag(node, 'li', ''))
+        if len(node):
+            node[0]['classes'].append('first')
+
+    # use <tt> (not supported by HTML5),
+    # cater for limited styling options in CSS1 using hard-coded NBSPs
+    def visit_literal(self, node):
+        # special case: "code" role
+        classes = node.get('classes', [])
+        if 'code' in classes:
+            # filter 'code' from class arguments
+            node['classes'] = [cls for cls in classes if cls != 'code']
+            self.body.append(self.starttag(node, 'code', ''))
+            return
+        self.body.append(
+            self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        text = node.astext()
+        for token in self.words_and_spaces.findall(text):
+            if token.strip():
+                # Protect text like "--an-option" and the regular expression
+                # ``[+]?(\d+(\.\d*)?|\.\d+)`` from bad line wrapping
+                if self.sollbruchstelle.search(token):
+                    self.body.append('<span class="pre">%s</span>'
+                                     % self.encode(token))
+                else:
+                    self.body.append(self.encode(token))
+            elif token in ('\n', ' '):
+                # Allow breaks at whitespace:
+                self.body.append(token)
+            else:
+                # Protect runs of multiple spaces; the last space can wrap:
+                self.body.append('&nbsp;' * (len(token) - 1) + ' ')
+        self.body.append('</tt>')
+        # Content already processed:
+        raise nodes.SkipNode
+
+    # add newline after opening tag, don't use <code> for code
+    def visit_literal_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
+
+    # add newline
+    def depart_literal_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    # use table for option list
+    def visit_option_group(self, node):
+        atts = {}
+        if ( self.settings.option_limit
+             and len(node.astext()) > self.settings.option_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(
+            self.starttag(node, 'td', CLASS='option-group', **atts))
+        self.body.append('<kbd>')
+        self.context.append(0)          # count number of options
+
+    def depart_option_group(self, node):
+        self.context.pop()
+        self.body.append('</kbd></td>\n')
+        self.body.append(self.context.pop())
+
+    def visit_option_list(self, node):
+        self.body.append(
+              self.starttag(node, 'table', CLASS='docutils option-list',
+                            frame="void", rules="none"))
+        self.body.append('<col class="option" />\n'
+                         '<col class="description" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_option_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+
+    def visit_option_list_item(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+
+    def depart_option_list_item(self, node):
+        self.body.append('</tr>\n')
+
+    # Omit <p> tags to produce visually compact lists (less vertical
+    # whitespace) as CSS styling requires CSS2.
+    def should_be_compact_paragraph(self, node):
+        """
+        Determine if the <p> tags around paragraph ``node`` can be omitted.
+        """
+        if (isinstance(node.parent, nodes.document) or
+            isinstance(node.parent, nodes.compound)):
+            # Never compact paragraphs in document or compound.
+            return False
+        for key, value in node.attlist():
+            if (node.is_not_default(key) and
+                not (key == 'classes' and value in
+                     ([], ['first'], ['last'], ['first', 'last']))):
+                # Attribute which needs to survive.
+                return False
+        first = isinstance(node.parent[0], nodes.label) # skip label
+        for child in node.parent.children[first:]:
+            # only first paragraph can be compact
+            if isinstance(child, nodes.Invisible):
+                continue
+            if child is node:
+                break
+            return False
+        parent_length = len([n for n in node.parent if not isinstance(
+            n, (nodes.Invisible, nodes.label))])
+        if ( self.compact_simple
+             or self.compact_field_list
+             or self.compact_p and parent_length == 1):
+            return True
+        return False
+
+    def visit_paragraph(self, node):
+        if self.should_be_compact_paragraph(node):
+            self.context.append('')
+        else:
+            self.body.append(self.starttag(node, 'p', ''))
+            self.context.append('</p>\n')
+
+    def depart_paragraph(self, node):
+        self.body.append(self.context.pop())
+
+    # ersatz for first/last pseudo-classes
+    def visit_sidebar(self, node):
+        self.body.append(
+            self.starttag(node, 'div', CLASS='sidebar'))
+        self.set_first_last(node)
+        self.in_sidebar = True
+
+    # <sub> not allowed in <pre>
+    def visit_subscript(self, node):
+        if isinstance(node.parent, nodes.literal_block):
+            self.body.append(self.starttag(node, 'span', '',
+                                           CLASS='subscript'))
+        else:
+            self.body.append(self.starttag(node, 'sub', ''))
+
+    def depart_subscript(self, node):
+        if isinstance(node.parent, nodes.literal_block):
+            self.body.append('</span>')
+        else:
+            self.body.append('</sub>')
+
+    # Use <h*> for subtitles (deprecated in HTML 5)
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append(self.starttag(node, 'p', '',
+                                           CLASS='sidebar-subtitle'))
+            self.context.append('</p>\n')
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
+            self.context.append('</h2>\n')
+            self.in_document_title = len(self.body)
+        elif isinstance(node.parent, nodes.section):
+            tag = 'h%s' % (self.section_level + self.initial_header_level - 1)
+            self.body.append(
+                self.starttag(node, tag, '', CLASS='section-subtitle') +
+                self.starttag({}, 'span', '', CLASS='section-subtitle'))
+            self.context.append('</span></%s>\n' % tag)
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.subtitle = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_subtitle.extend(self.body)
+            del self.body[:]
+
+    # <sup> not allowed in <pre> in HTML 4
+    def visit_superscript(self, node):
+        if isinstance(node.parent, nodes.literal_block):
+            self.body.append(self.starttag(node, 'span', '',
+                                           CLASS='superscript'))
+        else:
+            self.body.append(self.starttag(node, 'sup', ''))
+
+    def depart_superscript(self, node):
+        if isinstance(node.parent, nodes.literal_block):
+            self.body.append('</span>')
+        else:
+            self.body.append('</sup>')
+
+    # <tt> element deprecated in HTML 5
+    def visit_system_message(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='system-message'))
+        self.body.append('<p class="system-message-title">')
+        backref_text = ''
+        if len(node['backrefs']):
+            backrefs = node['backrefs']
+            if len(backrefs) == 1:
+                backref_text = ('; <em><a href="#%s">backlink</a></em>'
+                                % backrefs[0])
+            else:
+                i = 1
+                backlinks = []
+                for backref in backrefs:
+                    backlinks.append('<a href="#%s">%s</a>' % (backref, i))
+                    i += 1
+                backref_text = ('; <em>backlinks: %s</em>'
+                                % ', '.join(backlinks))
+        if node.hasattr('line'):
+            line = ', line %s' % node['line']
+        else:
+            line = ''
+        self.body.append('System Message: %s/%s '
+                         '(<tt class="docutils">%s</tt>%s)%s</p>\n'
+                         % (node['type'], node['level'],
+                            self.encode(node['source']), line, backref_text))
+
+    # "hard coded" border setting
+    def visit_table(self, node):
+        self.context.append(self.compact_p)
+        self.compact_p = True
+        classes = ['docutils', self.settings.table_style]
+        if 'align' in node:
+            classes.append('align-%s' % node['align'])
+        self.body.append(
+            self.starttag(node, 'table', CLASS=' '.join(classes), border="1"))
+
+    def depart_table(self, node):
+        self.compact_p = self.context.pop()
+        self.body.append('</table>\n')
+
+    # hard-coded vertical alignment
+    def visit_tbody(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n' or ''
+        self.body.append(self.starttag(node, 'tbody', valign='top'))
+
+    # rewritten in _html_base
+    def visit_tgroup(self, node):
+        self.body.append(self.starttag(node, 'colgroup'))
+        # Appended by thead or tbody:
+        self.context.append('</colgroup>\n')
+        node.stubs = []
+
+    # rewritten in _html_base
+    def visit_thead(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n'
+        # There may or may not be a <thead>; this is for <tbody> to use:
+        self.context.append('')
+        self.body.append(self.starttag(node, 'thead', valign='bottom'))
+
+
+class SimpleListChecker(writers._html_base.SimpleListChecker):
+
+    """
+    Raise `nodes.NodeFound` if non-simple list item is encountered.
+
+    Here "simple" means a list item containing nothing other than a single
+    paragraph, a simple list, or a paragraph followed by a simple list.
+    """
+
+    def visit_list_item(self, node):
+        children = []
+        for child in node.children:
+            if not isinstance(child, nodes.Invisible):
+                children.append(child)
+        if (children and isinstance(children[0], nodes.paragraph)
+            and (isinstance(children[-1], nodes.bullet_list)
+                 or isinstance(children[-1], nodes.enumerated_list))):
+            children.pop()
+        if len(children) <= 1:
+            return
+        else:
+            raise nodes.NodeFound
+
+    # def visit_bullet_list(self, node):
+    #     pass
+
+    # def visit_enumerated_list(self, node):
+    #     pass
+
+    # def visit_paragraph(self, node):
+    #     raise nodes.SkipNode
+
+    def visit_definition_list(self, node):
+        raise nodes.NodeFound
+
+    def visit_docinfo(self, node):
+        raise nodes.NodeFound
+
+    def visit_definition_list(self, node):
+        raise nodes.NodeFound
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/html4css1.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/html4css1.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/html4css1.css	(revision 1126)
@@ -0,0 +1,349 @@
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.subscript {
+  vertical-align: sub;
+  font-size: smaller }
+
+.superscript {
+  vertical-align: super;
+  font-size: smaller }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden;
+}
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title, .code .error {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left, .figure.align-left, object.align-left, table.align-left {
+  clear: left ;
+  float: left ;
+  margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right, table.align-right {
+  clear: right ;
+  float: right ;
+  margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+table.align-center {
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+  text-align: left }
+
+.align-center {
+  clear: both ;
+  text-align: center }
+
+.align-right {
+  text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit }
+
+/* div.align-center * { */
+/*   text-align: left } */
+
+.align-top    {
+  vertical-align: top }
+
+.align-middle {
+  vertical-align: middle }
+
+.align-bottom {
+  vertical-align: bottom }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font: inherit }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+pre.code .ln { color: grey; } /* line numbers */
+pre.code, code { background-color: #eeeeee }
+pre.code .comment, code .comment { color: #5C6576 }
+pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
+pre.code .literal.string, code .literal.string { color: #0C5404 }
+pre.code .name.builtin, code .name.builtin { color: #352B84 }
+pre.code .deleted, code .deleted { background-color: #DEB0A1}
+pre.code .inserted, code .inserted { background-color: #A3D289}
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+/* "booktabs" style (no vertical lines) */
+table.docutils.booktabs {
+  border: 0px;
+  border-top: 2px solid;
+  border-bottom: 2px solid;
+  border-collapse: collapse;
+}
+table.docutils.booktabs * {
+  border: 0px;
+}
+table.docutils.booktabs th {
+  border-bottom: thin solid;
+  text-align: left;
+}
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html4css1/template.txt	(revision 1126)
@@ -0,0 +1,8 @@
+%(head_prefix)s
+%(head)s
+%(stylesheet)s
+%(body_prefix)s
+%(body_pre_docinfo)s
+%(docinfo)s
+%(body)s
+%(body_suffix)s
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/__init__.py	(revision 1126)
@@ -0,0 +1,200 @@
+# .. coding: utf8
+# :Author: Günter Milde <milde@users.sf.net>
+#          Based on the html4css1 writer by David Goodger.
+# :Maintainer: docutils-develop@lists.sourceforge.net
+# :Revision: $Revision: 7977 $
+# :Date: $Date: 2005-06-28$
+# :Copyright: © 2005, 2009, 2015 Günter Milde,
+#             portions from html4css1 © David Goodger.
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+#
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+# Use "best practice" as recommended by the W3C:
+# http://www.w3.org/2009/cheatsheet/
+
+"""
+Plain HyperText Markup Language document tree Writer.
+
+The output conforms to the `HTML 5` specification.
+
+The cascading style sheet "minimal.css" is required for proper viewing,
+the style sheet "plain.css" improves reading experience.
+"""
+__docformat__ = 'reStructuredText'
+
+import os.path
+import docutils
+from docutils import frontend, nodes, writers, io
+from docutils.transforms import writer_aux
+from docutils.writers import _html_base
+
+class Writer(writers._html_base.Writer):
+
+    supported = ('html', 'html5', 'html4', 'xhtml', 'xhtml10')
+    """Formats this writer supports."""
+
+    default_stylesheets = ['minimal.css','plain.css']
+    default_stylesheet_dirs = ['.', os.path.abspath(os.path.dirname(__file__))]
+
+    default_template = 'template.txt'
+    default_template_path = os.path.join(
+        os.path.dirname(os.path.abspath(__file__)), default_template)
+
+    settings_spec = (
+        'HTML-Specific Options',
+        None,
+        (('Specify the template file (UTF-8 encoded).  Default is "%s".'
+          % default_template_path,
+          ['--template'],
+          {'default': default_template_path, 'metavar': '<file>'}),
+         ('Comma separated list of stylesheet URLs. '
+          'Overrides previous --stylesheet and --stylesheet-path settings.',
+          ['--stylesheet'],
+          {'metavar': '<URL[,URL,...]>', 'overrides': 'stylesheet_path',
+           'validator': frontend.validate_comma_separated_list}),
+         ('Comma separated list of stylesheet paths. '
+          'Relative paths are expanded if a matching file is found in '
+          'the --stylesheet-dirs. With --link-stylesheet, '
+          'the path is rewritten relative to the output HTML file. '
+          'Default: "%s"' % ','.join(default_stylesheets),
+          ['--stylesheet-path'],
+          {'metavar': '<file[,file,...]>', 'overrides': 'stylesheet',
+           'validator': frontend.validate_comma_separated_list,
+           'default': default_stylesheets}),
+         ('Embed the stylesheet(s) in the output HTML file.  The stylesheet '
+          'files must be accessible during processing. This is the default.',
+          ['--embed-stylesheet'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Link to the stylesheet(s) in the output HTML file. '
+          'Default: embed stylesheets.',
+          ['--link-stylesheet'],
+          {'dest': 'embed_stylesheet', 'action': 'store_false'}),
+         ('Comma-separated list of directories where stylesheets are found. '
+          'Used by --stylesheet-path when expanding relative path arguments. '
+          'Default: "%s"' % default_stylesheet_dirs,
+          ['--stylesheet-dirs'],
+          {'metavar': '<dir[,dir,...]>',
+           'validator': frontend.validate_comma_separated_list,
+           'default': default_stylesheet_dirs}),
+         ('Specify the initial header level.  Default is 1 for "<h1>".  '
+          'Does not affect document title & subtitle (see --no-doc-title).',
+          ['--initial-header-level'],
+          {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
+           'metavar': '<level>'}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "brackets".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'brackets',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Remove extra vertical whitespace between items of "simple" bullet '
+          'lists and enumerated lists.  Default: enabled.',
+          ['--compact-lists'],
+          {'default': True, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple bullet and enumerated lists.',
+          ['--no-compact-lists'],
+          {'dest': 'compact_lists', 'action': 'store_false'}),
+         ('Remove extra vertical whitespace between items of simple field '
+          'lists.  Default: enabled.',
+          ['--compact-field-lists'],
+          {'default': True, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple field lists.',
+          ['--no-compact-field-lists'],
+          {'dest': 'compact_field_lists', 'action': 'store_false'}),
+         ('Added to standard table classes. '
+          'Defined styles: borderless, booktabs, '
+          'align-left, align-center, align-right, colwidths-auto. '
+          'Default: ""',
+          ['--table-style'],
+          {'default': ''}),
+         ('Math output format (one of "MathML", "HTML", "MathJax", '
+          'or "LaTeX") and option(s). '
+          'Default: "HTML math.css"',
+          ['--math-output'],
+          {'default': 'HTML math.css'}),
+         ('Prepend an XML declaration. (Thwarts HTML5 conformance.) '
+          'Default: False',
+          ['--xml-declaration'],
+          {'default': False, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Omit the XML declaration.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'action': 'store_false'}),
+         ('Obfuscate email addresses to confuse harvesters while still '
+          'keeping email links usable with standards-compliant browsers.',
+          ['--cloak-email-addresses'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    config_section = 'html-plain writer'
+
+    def __init__(self):
+        self.parts = {}
+        self.translator_class = HTMLTranslator
+
+
+class HTMLTranslator(writers._html_base.HTMLTranslator):
+    """
+    This writer generates `polyglot markup`: HTML 5 that is also valid XML.
+    """
+    # def __init__(self, document):
+    #     writers._html_base.HTMLTranslator.__init__(self, document)
+
+
+    # <acronym> tag not supported in HTML5. Use the <abbr> tag instead.
+    def visit_acronym(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'abbr', ''))
+
+    def depart_acronym(self, node):
+        self.body.append('</abbr>')
+
+    # no meta tag in HTML 5
+    def visit_authors(self, node):
+        self.visit_docinfo_item(node, 'authors', meta=False)
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright', meta=False)
+
+    # no meta tag in HTML 5
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date', meta=False)
+
+    # TODO: use HTML 5 <footer> element?
+    # def visit_footer(self, node):
+    # def depart_footer(self, node):
+
+    # TODO: use the new HTML5 element <aside>? (Also for footnote text)
+    # def visit_footnote(self, node):
+
+    # Meta tags: 'lang' attribute replaced by 'xml:lang' in XHTML 1.1
+    # HTML5/polyglot recommends using both
+    def visit_meta(self, node):
+        if node.hasattr('lang'):
+            node['xml:lang'] = node['lang']
+            # del(node['lang'])
+        meta = self.emptytag(node, 'meta', **node.non_default_attributes())
+        self.add_meta(meta)
+
+    # no meta tag in HTML 5
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization', meta=False)
+
+    # TODO: use the new HTML 5 element <section>?
+    # def visit_section(self, node):
+
+    # TODO: use the new HTML5 element <aside>?
+    # def visit_topic(self, node):
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/template.txt	(revision 1126)
@@ -0,0 +1,8 @@
+%(head_prefix)s
+%(head)s
+%(stylesheet)s
+%(body_prefix)s
+%(body_pre_docinfo)s
+%(docinfo)s
+%(body)s
+%(body_suffix)s
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/plain.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/plain.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/plain.css	(revision 1126)
@@ -0,0 +1,288 @@
+/* CSS31_ style sheet for the output of Docutils HTML writers.             */
+/* Rules for easy reading and pre-defined style variants.		   */
+/*                                                                         */
+/* :Author: Günter Milde, based on html4css1.css by David Goodger          */
+/* :Id: $Id: plain.css 7952 2016-07-26 18:15:59Z milde $               */
+/* :Copyright: © 2015 Günter Milde.                                        */
+/* :License: Released under the terms of the `2-Clause BSD license`_,      */
+/*    in short:                                                            */
+/*                                                                         */
+/*    Copying and distribution of this file, with or without modification, */
+/*    are permitted in any medium without royalty provided the copyright   */
+/*    notice and this notice are preserved.                                */
+/*    	     	      	     	 					   */
+/*    This file is offered as-is, without any warranty.                    */
+/*                                                                         */
+/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause     */
+/* .. _CSS3: http://www.w3.org/TR/CSS3		        		   */
+
+
+/* Document Structure */
+/* ****************** */
+
+/* "page layout" */
+body {
+  padding: 0 5%;
+  margin: 8px 0;
+}
+div.document {
+  line-height:1.3;
+  counter-reset: table;
+  /* counter-reset: figure; */
+  /* avoid long lines --> better reading */
+  /* OTOH: lines should not be too short because of missing hyphenation, */
+  max-width: 50em;
+  margin: auto;
+}
+
+/* Sections */
+
+/* Transitions */
+
+hr.docutils {
+  width: 80%;
+  margin-top: 1em;
+  margin-bottom: 1em;
+  clear: both;
+}
+
+/* Paragraphs               */
+/* ==========               */
+
+/* vertical space (parskip) */
+p, ol, ul, dl,
+div.line-block,
+table{
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+}
+h1, h2, h3, h4, h5, h6,
+dl > dd {
+  margin-bottom: 0.5em;
+}
+
+/* Lists                    */
+/* ==========               */
+
+/* Definition Lists         */
+
+dl > dd p:first-child { margin-top: 0; }
+/* :last-child is not part of CSS 2.1 (introduced in CSS 3) */
+/* dl > dd p:last-child  { margin-bottom: 0; } */
+
+/* lists nested in definition lists */
+/* :only-child is not part of CSS 2.1 (introduced in CSS 3) */
+dd > ul:only-child, dd > ol:only-child { padding-left: 1em; }
+
+/* Description Lists */
+/* styled like in most dictionaries, encyclopedias etc. */
+dl.description > dt {
+  font-weight: bold;
+  clear: left;
+  float: left;
+  margin: 0;
+  padding: 0;
+  padding-right: 0.5em;
+}
+
+/* Field Lists */
+
+/* example for custom field-name width */
+dl.field-list.narrow > dd {
+  margin-left: 5em;
+}
+/* run-in: start field-body on same line after long field names */
+dl.field-list.run-in > dd p {
+  display: block;
+}
+
+/* Bibliographic Fields */
+
+/* generally, bibliographic fields use special definition list dl.docinfo */
+/* but dedication and abstract are placed into "topic" divs */
+div.abstract p.topic-title {
+  text-align: center;
+}
+div.dedication {
+  margin: 2em 5em;
+  text-align: center;
+  font-style: italic;
+}
+div.dedication p.topic-title {
+  font-style: normal;
+}
+
+/* Citations */
+dl.citation dt.label {
+  font-weight: bold;
+}
+span.fn-backref {
+  font-weight: normal;
+}
+
+/* Text Blocks           */
+/* ============          */
+
+/* Literal Blocks           */
+pre.literal-block, pre.doctest-block,
+pre.math, pre.code {
+  margin-left: 1.5em;
+  margin-right: 1.5em
+}
+
+/* Block Quotes             */
+
+blockquote,
+div.topic {
+  margin-left: 1.5em;
+  margin-right: 1.5em
+}
+blockquote > table,
+div.topic > table {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+blockquote p.attribution,
+div.topic p.attribution {
+  text-align: right;
+  margin-left: 20%;
+}
+
+/* Tables                   */
+/* ======                   */
+
+/* th { vertical-align: bottom; } */
+
+table tr { text-align: left; }
+
+/* "booktabs" style (no vertical lines) */
+table.booktabs {
+  border: 0;
+  border-top: 2px solid;
+  border-bottom: 2px solid;
+  border-collapse: collapse;
+}
+table.booktabs * {
+  border: 0;
+}
+table.booktabs th {
+  border-bottom: thin solid;
+}
+
+/* numbered tables (counter defined in div.document) */
+table.numbered > caption:before {
+  counter-increment: table;
+  content: "Table " counter(table) ": ";
+  font-weight: bold;
+}
+
+/* Explicit Markup Blocks   */
+/* ======================   */
+
+/* Footnotes and Citations  */
+/* -----------------------  */
+
+/* line on the left */
+dl.footnote {
+  padding-left: 1ex;
+  border-left: solid;
+  border-left-width: thin;
+}
+
+/* Directives               */
+/* ----------               */
+
+/* Body Elements            */
+/* ~~~~~~~~~~~~~            */
+
+/* Images and Figures */
+
+/* let content flow to the side of aligned images and figures */
+.figure.align-left,
+img.align-left,
+object.align-left {
+  display: block;
+  clear: left;
+  float: left;
+  margin-right: 1em
+}
+.figure.align-right,
+img.align-right,
+object.align-right {
+  display: block;
+  clear: right;
+  float: right;
+  margin-left: 1em
+}
+/* Stop floating sidebars, images and figures at section level 1,2,3 */
+h1, h2, h3 { clear: both; }
+
+/* Sidebar */
+
+/* Move into the margin. In a layout with fixed margins, */
+/* it can be moved into the margin completely.		 */
+div.sidebar {
+  width: 30%;
+  max-width: 26em;
+  margin-left: 1em;
+  margin-right: -5.5%;
+  background-color: #ffffee ;
+}
+
+/* Code                     */
+
+pre.code, code { background-color: #eeeeee }
+pre.code .ln { color: gray; } /* line numbers */
+/* basic highlighting: for a complete scheme, see */
+/* http://docutils.sourceforge.net/sandbox/stylesheets/ */
+pre.code .comment, code .comment { color: #5C6576 }
+pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
+pre.code .literal.string, code .literal.string { color: #0C5404 }
+pre.code .name.builtin, code .name.builtin { color: #352B84 }
+pre.code .deleted, code .deleted { background-color: #DEB0A1}
+pre.code .inserted, code .inserted { background-color: #A3D289}
+
+/* Math                     */
+/* styled separately (see math.css for math-output=HTML) */
+
+/* Epigraph                 */
+/* Highlights               */
+/* Pull-Quote               */
+/* Compound Paragraph       */
+/* Container                */
+
+/* can be styled in a custom stylesheet */
+
+/* Document Header and Footer */
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller;
+}
+
+/* Inline Markup            */
+/* =============            */
+
+/* Emphasis                 */
+/*   em                     */
+/* Strong Emphasis          */
+/*   strong		    */
+/* Interpreted Text         */
+/*   span.interpreted  	    */
+/* Title Reference 	    */
+/*   cite		    */
+/* Inline Literals          */
+/* possible values: normal, nowrap, pre, pre-wrap, pre-line */
+/*   span.docutils.literal { white-space: pre-wrap; } */
+
+/* Hyperlink References     */
+a { text-decoration: none; }
+
+/* External Targets         */
+/*   span.target.external   */
+/* Internal Targets  	    */
+/*   span.target.internal   */
+/* Footnote References      */
+/*   a.footnote-reference   */
+/* Citation References      */
+/*   a.citation-reference   */
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/minimal.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/minimal.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/minimal.css	(revision 1126)
@@ -0,0 +1,260 @@
+/* Minimal style sheet for the HTML output of Docutils.                    */
+/*                                                                         */
+/* :Author: Günter Milde, based on html4css1.css by David Goodger          */
+/* :Id: $Id: minimal.css 7952 2016-07-26 18:15:59Z milde $               */
+/* :Copyright: © 2015 Günter Milde.                                        */
+/* :License: Released under the terms of the `2-Clause BSD license`_,      */
+/*    in short:                                                            */
+/*                                                                         */
+/*    Copying and distribution of this file, with or without modification, */
+/*    are permitted in any medium without royalty provided the copyright   */
+/*    notice and this notice are preserved.                                */
+/*                                                                         */
+/*    This file is offered as-is, without any warranty.                    */
+/*                                                                         */
+/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause     */
+
+/* This CSS2.1_ stylesheet defines rules for Docutils elements without    */
+/* HTML equivalent. It is required to make the document semantic visible. */
+/*                                                                        */
+/* .. _CSS2.1: http://www.w3.org/TR/CSS2                                  */
+/* .. _validates: http://jigsaw.w3.org/css-validator/validator$link       */
+
+/* alignment of text and inline objects inside block objects*/
+.align-left   { text-align: left; }
+.align-right  { text-align: right; }
+.align-center { clear: both; text-align: center; }
+.align-top    { vertical-align: top; }
+.align-middle { vertical-align: middle; }
+.align-bottom { vertical-align: bottom; }
+
+/* titles */
+h1.title, p.subtitle {
+  text-align: center;
+}
+p.admonition-title,
+p.topic-title,
+p.sidebar-title,
+p.rubric,
+p.system-message-title {
+  font-weight: bold;
+}
+h1 + p.subtitle,
+h1 + p.section-subtitle {
+  font-size: 1.6em;
+}
+h2 + p.section-subtitle { font-size: 1.28em; }
+p.subtitle,
+p.section-subtitle,
+p.sidebar-subtitle {
+  font-weight: bold;
+  margin-top: -0.5em;
+}
+p.sidebar-title,
+p.rubric {
+  font-size: larger;
+}
+p.rubric { color: maroon; }
+a.toc-backref {
+  color: black;
+  text-decoration: none; }
+
+/* Warnings, Errors */
+div.caution p.admonition-title,
+div.attention p.admonition-title,
+div.danger p.admonition-title,
+div.error p.admonition-title,
+div.warning p.admonition-title,
+div.system-messages h1,
+div.error,
+span.problematic,
+p.system-message-title {
+  color: red;
+}
+
+/* inline literals */
+span.docutils.literal {
+  font-family: monospace;
+  white-space: pre-wrap;
+}
+/* do not wraph at hyphens and similar: */
+.literal > span.pre { white-space: nowrap; }
+
+/* Lists */
+
+/* compact and simple lists: no margin between items */
+.simple  li, .compact li,
+.simple  ul, .compact ul,
+.simple  ol, .compact ol,
+.simple > li p, .compact > li p,
+dl.simple > dd, dl.compact > dd {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+/* Table of Contents */
+div.topic.contents { margin: 0; }
+ul.auto-toc {
+  list-style-type: none;
+  padding-left: 1.5em; }
+
+/* Enumerated Lists */
+ol.arabic     { list-style: decimal }
+ol.loweralpha { list-style: lower-alpha }
+ol.upperalpha { list-style: upper-alpha }
+ol.lowerroman { list-style: lower-roman }
+ol.upperroman { list-style: upper-roman }
+
+dt span.classifier { font-style: italic }
+dt span.classifier:before {
+  font-style: normal;
+  margin: 0.5em;
+  content: ":";
+}
+
+/* Field Lists and drivatives */
+/* bold field name, content starts on the same line */
+dl.field-list > dt,
+dl.option-list > dt,
+dl.docinfo > dt,
+dl.footnote > dt,
+dl.citation > dt {
+  font-weight: bold;
+  clear: left;
+  float: left;
+  margin: 0;
+  padding: 0;
+  padding-right: 0.5em;
+}
+/* Offset for field content (corresponds to the --field-name-limit option) */
+dl.field-list > dd,
+dl.option-list > dd,
+dl.docinfo > dd {
+  margin-left:  9em; /* ca. 14 chars in the test examples */
+}
+/* start field-body on a new line after long field names */
+dl.field-list > dd > *:first-child,
+dl.option-list > dd > *:first-child
+{
+  display: inline-block;
+  width: 100%;
+  margin: 0;
+}
+/* field names followed by a colon */
+dl.field-list > dt:after,
+dl.docinfo > dt:after {
+  content: ":";
+}
+
+/* Bibliographic Fields (docinfo) */
+pre.address { font: inherit; }
+dd.authors > p { margin: 0; }
+
+/* Option Lists */
+dl.option-list { margin-left: 40px; }
+dl.option-list > dt { font-weight: normal; }
+span.option { white-space: nowrap; }
+
+/* Footnotes and Citations  */
+dl.footnote.superscript > dd {margin-left: 1em; }
+dl.footnote.brackets > dd {margin-left: 2em; }
+dl > dt.label { font-weight: normal; }
+a.footnote-reference.brackets:before,
+dt.label > span.brackets:before { content: "["; }
+a.footnote-reference.brackets:after,
+dt.label > span.brackets:after { content: "]"; }
+a.footnote-reference.superscript,
+dl.footnote.superscript > dt.label {
+  vertical-align: super;
+  font-size: smaller;
+}
+dt.label > span.fn-backref { margin-left: 0.2em; }
+dt.label > span.fn-backref > a { font-style: italic; }
+
+/* Line Blocks */
+div.line-block { display: block; }
+div.line-block div.line-block {
+  margin-top: 0;
+  margin-bottom: 0;
+  margin-left: 40px;
+}
+
+/* Figures, Images, and Tables */
+.figure.align-left,
+img.align-left,
+object.align-left,
+table.align-left {
+  margin-right: auto;
+}
+.figure.align-center,
+img.align-center,
+object.align-center {
+  margin-left: auto;
+  margin-right: auto;
+  display: block;
+}
+table.align-center {
+  margin-left: auto;
+  margin-right: auto;
+}
+.figure.align-right,
+img.align-right,
+object.align-right,
+table.align-right {
+  margin-left: auto;
+}
+/* reset inner alignment in figures and tables */
+div.align-left, div.align-center, div.align-right,
+table.align-left, table.align-center, table.align-right
+{ text-align: inherit }
+
+/* Admonitions and System Messages */
+div.admonition,
+div.system-message,
+div.sidebar{
+  margin: 40px;
+  border: medium outset;
+  padding-right: 1em;
+  padding-left: 1em;
+}
+
+/* Sidebar */
+div.sidebar {
+  width: 30%;
+  max-width: 26em;
+  float: right;
+  clear: right;
+}
+
+/* Text Blocks */
+div.topic,
+pre.literal-block,
+pre.doctest-block,
+pre.math,
+pre.code {
+  margin-right: 40px;
+  margin-left: 40px;
+}
+pre.code .ln { color: gray; } /* line numbers */
+
+/* Tables */
+table { border-collapse: collapse; }
+td, th {
+  border-style: solid;
+  border-color: silver;
+  padding: 0 1ex;
+  border-width: thin;
+}
+td > p:first-child, th > p:first-child { margin-top: 0; }
+td > p, th > p { margin-bottom: 0; }
+
+table > caption {
+  text-align: left;
+  margin-bottom: 0.25em
+}
+
+table.borderless td, table.borderless th {
+  border: 0;
+  padding: 0;
+  padding-right: 0.5em /* separate table cells */
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/math.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/math.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/html5_polyglot/math.css	(revision 1126)
@@ -0,0 +1,276 @@
+/*
+*   math2html: convert LaTeX equations to HTML output.
+*
+*   Copyright (C) 2009,2010 Alex Fernández
+*
+*   Released under the terms of the `2-Clause BSD license'_, in short:
+*   Copying and distribution of this file, with or without modification,
+*   are permitted in any medium without royalty provided the copyright
+*   notice and this notice are preserved.
+*   This file is offered as-is, without any warranty.
+*
+* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+*
+*   Based on eLyXer: convert LyX source files to HTML output.
+*   http://elyxer.nongnu.org/
+*/
+/* --end--
+* CSS file for LaTeX formulas.
+*/
+
+/* Formulas */
+.formula {
+	text-align: center;
+	font-family: "Droid Serif", "DejaVu Serif", "STIX", serif;
+	margin: 1.2em 0;
+}
+span.formula {
+	white-space: nowrap;
+}
+div.formula {
+	padding: 0.5ex;
+	margin-left: auto;
+	margin-right: auto;
+}
+
+/* Basic features */
+a.eqnumber {
+	display: inline-block;
+	float: right;
+	clear: right;
+	font-weight: bold;
+}
+span.unknown {
+	color: #800000;
+}
+span.ignored, span.arraydef {
+	display: none;
+}
+.formula i {
+	letter-spacing: 0.1ex;
+}
+
+/* Alignment */
+.align-left, .align-l {
+	text-align: left;
+}
+.align-right, .align-r {
+	text-align: right;
+}
+.align-center, .align-c {
+	text-align: center;
+}
+
+/* Structures */
+span.overline, span.bar {
+	text-decoration: overline;
+}
+.fraction, .fullfraction {
+	display: inline-block;
+	vertical-align: middle;
+	text-align: center;
+}
+.fraction .fraction {
+	font-size: 80%;
+	line-height: 100%;
+}
+span.numerator {
+	display: block;
+}
+span.denominator {
+	display: block;
+	padding: 0ex;
+	border-top: thin solid;
+}
+sup.numerator, sup.unit {
+	font-size: 70%;
+	vertical-align: 80%;
+}
+sub.denominator, sub.unit {
+	font-size: 70%;
+	vertical-align: -20%;
+}
+span.sqrt {
+	display: inline-block;
+	vertical-align: middle;
+	padding: 0.1ex;
+}
+sup.root {
+	font-size: 70%;
+	position: relative;
+	left: 1.4ex;
+}
+span.radical {
+	display: inline-block;
+	padding: 0ex;
+	font-size: 150%;
+	vertical-align: top;
+}
+span.root {
+	display: inline-block;
+	border-top: thin solid;
+	padding: 0ex;
+	vertical-align: middle;
+}
+span.symbol {
+	line-height: 125%;
+	font-size: 125%;
+}
+span.bigsymbol {
+	line-height: 150%;
+	font-size: 150%;
+}
+span.largesymbol {
+	font-size: 175%;
+}
+span.hugesymbol {
+	font-size: 200%;
+}
+span.scripts {
+	display: inline-table;
+	vertical-align: middle;
+}
+.script {
+	display: table-row;
+	text-align: left;
+	line-height: 150%;
+}
+span.limits {
+	display: inline-table;
+	vertical-align: middle;
+}
+.limit {
+	display: table-row;
+	line-height: 99%;
+}
+sup.limit, sub.limit {
+	line-height: 100%;
+}
+span.symbolover {
+	display: inline-block;
+	text-align: center;
+	position: relative;
+	float: right;
+	right: 100%;
+	bottom: 0.5em;
+	width: 0px;
+}
+span.withsymbol {
+	display: inline-block;
+}
+span.symbolunder {
+	display: inline-block;
+	text-align: center;
+	position: relative;
+	float: right;
+	right: 80%;
+	top: 0.3em;
+	width: 0px;
+}
+
+/* Environments */
+span.array, span.bracketcases, span.binomial, span.environment {
+	display: inline-table;
+	text-align: center;
+	border-collapse: collapse;
+	margin: 0em;
+	vertical-align: middle;
+}
+span.arrayrow, span.binomrow {
+	display: table-row;
+	padding: 0ex;
+	border: 0ex;
+}
+span.arraycell, span.bracket, span.case, span.binomcell, span.environmentcell {
+	display: table-cell;
+	padding: 0ex 0.2ex;
+	line-height: 99%;
+	border: 0ex;
+}
+/*
+* CSS file for LaTeX formulas, extra stuff:
+* binomials, vertical braces, stackrel, fonts and colors.
+*/
+
+/* Inline binomials */
+span.binom {
+	display: inline-block;
+	vertical-align: middle;
+	text-align: center;
+	font-size: 80%;
+}
+span.binomstack {
+	display: block;
+	padding: 0em;
+}
+
+/* Over- and underbraces */
+span.overbrace {
+	border-top: 2pt solid;
+}
+span.underbrace {
+	border-bottom: 2pt solid;
+}
+
+/* Stackrel */
+span.stackrel {
+	display: inline-block;
+	text-align: center;
+}
+span.upstackrel {
+	display: block;
+	padding: 0em;
+	font-size: 80%;
+	line-height: 64%;
+	position: relative;
+	top: 0.15em;
+
+}
+span.downstackrel {
+	display: block;
+	vertical-align: bottom;
+	padding: 0em;
+}
+
+/* Fonts */
+span.mathsf, span.textsf {
+	font-style: normal;
+	font-family: sans-serif;
+}
+span.mathrm, span.textrm {
+	font-style: normal;
+	font-family: serif;
+}
+span.text, span.textnormal {
+	font-style: normal;
+}
+span.textipa {
+	color: #008080;
+}
+span.fraktur {
+	font-family: "Lucida Blackletter", eufm10, blackletter;
+}
+span.blackboard {
+	font-family: Blackboard, msbm10, serif;
+}
+span.scriptfont {
+	font-family: "Monotype Corsiva", "Apple Chancery", "URW Chancery L", cursive;
+	font-style: italic;
+}
+
+/* Colors */
+span.colorbox {
+	display: inline-block;
+	padding: 5px;
+}
+span.fbox {
+	display: inline-block;
+	border: thin solid black;
+	padding: 2px;
+}
+span.boxed, span.framebox {
+	display: inline-block;
+	border: thin solid black;
+	padding: 5px;
+}
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/_html_base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/_html_base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/_html_base.py	(revision 1126)
@@ -0,0 +1,1598 @@
+#!/usr/bin/env python
+# -*- coding: utf8 -*-
+# :Author: David Goodger, Günter Milde
+#          Based on the html4css1 writer by David Goodger.
+# :Maintainer: docutils-develop@lists.sourceforge.net
+# :Revision: $Revision: 7977 $
+# :Date: $Date: 2005-06-28$
+# :Copyright: © 2016 David Goodger, Günter Milde
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+#
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+
+# _html_base.py:  common definitions for Docutils HTML writers
+# ============================================================
+
+import sys
+import os.path
+import re
+import urllib
+try: # check for the Python Imaging Library
+    import PIL.Image
+except ImportError:
+    try:  # sometimes PIL modules are put in PYTHONPATH's root
+        import Image
+        class PIL(object): pass  # dummy wrapper
+        PIL.Image = Image
+    except ImportError:
+        PIL = None
+import docutils
+from docutils import nodes, utils, writers, languages, io
+from docutils.utils.error_reporting import SafeString
+from docutils.transforms import writer_aux
+from docutils.utils.math import (unichar2tex, pick_math_environment,
+                                 math2html, latex2mathml, tex2mathml_extern)
+
+
+class Writer(writers.Writer):
+
+    supported = ('html', 'xhtml') # update in subclass
+    """Formats this writer supports."""
+
+    # default_stylesheets = [] # set in subclass!
+    # default_stylesheet_dirs = ['.'] # set in subclass!
+    default_template = 'template.txt'
+    # default_template_path = ... # set in subclass!
+    # settings_spec = ... # set in subclass!
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    # config_section = ... # set in subclass!
+    config_section_dependencies = ('writers',)
+
+    visitor_attributes = (
+        'head_prefix', 'head', 'stylesheet', 'body_prefix',
+        'body_pre_docinfo', 'docinfo', 'body', 'body_suffix',
+        'title', 'subtitle', 'header', 'footer', 'meta', 'fragment',
+        'html_prolog', 'html_head', 'html_title', 'html_subtitle',
+        'html_body')
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [writer_aux.Admonitions]
+
+    def translate(self):
+        self.visitor = visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        for attr in self.visitor_attributes:
+            setattr(self, attr, getattr(visitor, attr))
+        self.output = self.apply_template()
+
+    def apply_template(self):
+        template_file = open(self.document.settings.template, 'rb')
+        template = unicode(template_file.read(), 'utf-8')
+        template_file.close()
+        subs = self.interpolation_dict()
+        return template % subs
+
+    def interpolation_dict(self):
+        subs = {}
+        settings = self.document.settings
+        for attr in self.visitor_attributes:
+            subs[attr] = ''.join(getattr(self, attr)).rstrip('\n')
+        subs['encoding'] = settings.output_encoding
+        subs['version'] = docutils.__version__
+        return subs
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            self.parts[part] = ''.join(getattr(self, part))
+
+
+
+class HTMLTranslator(nodes.NodeVisitor):
+
+    """Generic Docutils to HTML translator.
+
+    See the html4css1 and html5_polyglott for writers for full featured HTML
+    writers. """
+
+    xml_declaration = '<?xml version="1.0" encoding="%s" ?>\n'
+    doctype = '<!DOCTYPE html>\n'
+    doctype_mathml = doctype
+
+    head_prefix_template = ('<html xmlns="http://www.w3.org/1999/xhtml"'
+                            ' xml:lang="%(lang)s" lang="%(lang)s">\n<head>\n')
+    content_type = ('<meta charset="%s"/>\n')
+    generator = ('<meta name="generator" content="Docutils %s: '
+                 'http://docutils.sourceforge.net/" />\n')
+
+    # Template for the MathJax script in the header:
+    mathjax_script = '<script type="text/javascript" src="%s"></script>\n'
+    # The latest version of MathJax from the distributed server:
+    # avaliable to the public under the `MathJax CDN Terms of Service`__
+    # __http://www.mathjax.org/download/mathjax-cdn-terms-of-service/
+    # may be overwritten by custom URL appended to "mathjax"
+    mathjax_url = ('https://cdn.mathjax.org/mathjax/latest/MathJax.js?'
+                   'config=TeX-AMS_CHTML')
+
+    stylesheet_link = '<link rel="stylesheet" href="%s" type="text/css" />\n'
+    embedded_stylesheet = '<style type="text/css">\n\n%s\n</style>\n'
+    words_and_spaces = re.compile(r'\S+| +|\n')
+    sollbruchstelle = re.compile(r'.+\W\W.+|[-?].+', re.U) # wrap point inside word
+    lang_attribute = 'lang' # name changes to 'xml:lang' in XHTML 1.1
+
+    special_characters = {ord('&'): u'&amp;',
+                          ord('<'): u'&lt;',
+                          ord('"'): u'&quot;',
+                          ord('>'): u'&gt;',
+                          ord('@'): u'&#64;', # may thwart address harvesters
+                         }
+    """Character references for characters with a special meaning in HTML."""
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        lcode = settings.language_code
+        self.language = languages.get_language(lcode, document.reporter)
+        self.meta = [self.generator % docutils.__version__]
+        self.head_prefix = []
+        self.html_prolog = []
+        if settings.xml_declaration:
+            self.head_prefix.append(self.xml_declaration
+                                    % settings.output_encoding)
+            # self.content_type = ""
+            # encoding not interpolated:
+            self.html_prolog.append(self.xml_declaration)
+        self.head = self.meta[:]
+        self.stylesheet = [self.stylesheet_call(path)
+                           for path in utils.get_stylesheet_list(settings)]
+        self.body_prefix = ['</head>\n<body>\n']
+        # document title, subtitle display
+        self.body_pre_docinfo = []
+        # author, date, etc.
+        self.docinfo = []
+        self.body = []
+        self.fragment = []
+        self.body_suffix = ['</body>\n</html>\n']
+        self.section_level = 0
+        self.initial_header_level = int(settings.initial_header_level)
+
+        self.math_output = settings.math_output.split()
+        self.math_output_options = self.math_output[1:]
+        self.math_output = self.math_output[0].lower()
+
+        # A heterogenous stack used in conjunction with the tree traversal.
+        # Make sure that the pops correspond to the pushes:
+        self.context = []
+
+        self.topic_classes = [] # TODO: replace with self_in_contents
+        self.colspecs = []
+        self.compact_p = True
+        self.compact_simple = False
+        self.compact_field_list = False
+        self.in_docinfo = False
+        self.in_sidebar = False
+        self.in_footnote_list = False
+        self.title = []
+        self.subtitle = []
+        self.header = []
+        self.footer = []
+        self.html_head = [self.content_type] # charset not interpolated
+        self.html_title = []
+        self.html_subtitle = []
+        self.html_body = []
+        self.in_document_title = 0   # len(self.body) or 0
+        self.in_mailto = False
+        self.author_in_authors = False # for html4css1
+        self.math_header = []
+
+    def astext(self):
+        return ''.join(self.head_prefix + self.head
+                       + self.stylesheet + self.body_prefix
+                       + self.body_pre_docinfo + self.docinfo
+                       + self.body + self.body_suffix)
+
+    def encode(self, text):
+        """Encode special characters in `text` & return."""
+        # Use only named entities known in both XML and HTML
+        # other characters are automatically encoded "by number" if required.
+        # @@@ A codec to do these and all other HTML entities would be nice.
+        text = unicode(text)
+        return text.translate(self.special_characters)
+
+    def cloak_mailto(self, uri):
+        """Try to hide a mailto: URL from harvesters."""
+        # Encode "@" using a URL octet reference (see RFC 1738).
+        # Further cloaking with HTML entities will be done in the
+        # `attval` function.
+        return uri.replace('@', '%40')
+
+    def cloak_email(self, addr):
+        """Try to hide the link text of a email link from harversters."""
+        # Surround at-signs and periods with <span> tags.  ("@" has
+        # already been encoded to "&#64;" by the `encode` method.)
+        addr = addr.replace('&#64;', '<span>&#64;</span>')
+        addr = addr.replace('.', '<span>&#46;</span>')
+        return addr
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, HTML encode, and return attribute value text."""
+        encoded = self.encode(whitespace.sub(' ', text))
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            # Cloak at-signs ("%40") and periods with HTML entities.
+            encoded = encoded.replace('%40', '&#37;&#52;&#48;')
+            encoded = encoded.replace('.', '&#46;')
+        return encoded
+
+    def stylesheet_call(self, path):
+        """Return code to reference or embed stylesheet file `path`"""
+        if self.settings.embed_stylesheet:
+            try:
+                content = io.FileInput(source_path=path,
+                                       encoding='utf-8').read()
+                self.settings.record_dependencies.add(path)
+            except IOError, err:
+                msg = u"Cannot embed stylesheet '%s': %s." % (
+                                path, SafeString(err.strerror))
+                self.document.reporter.error(msg)
+                return '<--- %s --->\n' % msg
+            return self.embedded_stylesheet % content
+        # else link to style file:
+        if self.settings.stylesheet_path:
+            # adapt path relative to output (cf. config.html#stylesheet-path)
+            path = utils.relative_path(self.settings._destination, path)
+        return self.stylesheet_link % self.encode(path)
+
+    def starttag(self, node, tagname, suffix='\n', empty=False, **attributes):
+        """
+        Construct and return a start tag given a node (id & class attributes
+        are extracted), tag name, and optional attributes.
+        """
+        tagname = tagname.lower()
+        prefix = []
+        atts = {}
+        ids = []
+        for (name, value) in attributes.items():
+            atts[name.lower()] = value
+        classes = []
+        languages = []
+        # unify class arguments and move language specification
+        for cls in node.get('classes', []) + atts.pop('class', '').split() :
+            if cls.startswith('language-'):
+                languages.append(cls[9:])
+            elif cls.strip() and cls not in classes:
+                classes.append(cls)
+        if languages:
+            # attribute name is 'lang' in XHTML 1.0 but 'xml:lang' in 1.1
+            atts[self.lang_attribute] = languages[0]
+        if classes:
+            atts['class'] = ' '.join(classes)
+        assert 'id' not in atts
+        ids.extend(node.get('ids', []))
+        if 'ids' in atts:
+            ids.extend(atts['ids'])
+            del atts['ids']
+        if ids:
+            atts['id'] = ids[0]
+            for id in ids[1:]:
+                # Add empty "span" elements for additional IDs.  Note
+                # that we cannot use empty "a" elements because there
+                # may be targets inside of references, but nested "a"
+                # elements aren't allowed in XHTML (even if they do
+                # not all have a "href" attribute).
+                if empty or isinstance(node,
+                            (nodes.bullet_list, nodes.enumerated_list,
+                             nodes.definition_list, nodes.field_list,
+                             nodes.option_list, nodes.docinfo)):
+                    # Insert target right in front of element.
+                    prefix.append('<span id="%s"></span>' % id)
+                else:
+                    # Non-empty tag.  Place the auxiliary <span> tag
+                    # *inside* the element, as the first child.
+                    suffix += '<span id="%s"></span>' % id
+        attlist = atts.items()
+        attlist.sort()
+        parts = [tagname]
+        for name, value in attlist:
+            # value=None was used for boolean attributes without
+            # value, but this isn't supported by XHTML.
+            assert value is not None
+            if isinstance(value, list):
+                values = [unicode(v) for v in value]
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(' '.join(values))))
+            else:
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(unicode(value))))
+        if empty:
+            infix = ' /'
+        else:
+            infix = ''
+        return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix
+
+    def emptytag(self, node, tagname, suffix='\n', **attributes):
+        """Construct and return an XML-compatible empty tag."""
+        return self.starttag(node, tagname, suffix, empty=True, **attributes)
+
+    def set_class_on_child(self, node, class_, index=0):
+        """
+        Set class `class_` on the visible child no. index of `node`.
+        Do nothing if node has fewer children than `index`.
+        """
+        children = [n for n in node if not isinstance(n, nodes.Invisible)]
+        try:
+            child = children[index]
+        except IndexError:
+            return
+        child['classes'].append(class_)
+
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            encoded = self.cloak_email(encoded)
+        self.body.append(encoded)
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_abbreviation(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'abbr', ''))
+
+    def depart_abbreviation(self, node):
+        self.body.append('</abbr>')
+
+    def visit_acronym(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'acronym', ''))
+
+    def depart_acronym(self, node):
+        self.body.append('</acronym>')
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address', meta=False)
+        self.body.append(self.starttag(node, 'pre', 
+                                       suffix= '', CLASS='address'))
+
+    def depart_address(self, node):
+        self.body.append('\n</pre>\n')
+        self.depart_docinfo_item()
+
+    def visit_admonition(self, node):
+        node['classes'].insert(0, 'admonition')
+        self.body.append(self.starttag(node, 'div'))
+
+    def depart_admonition(self, node=None):
+        self.body.append('</div>\n')
+
+    attribution_formats = {'dash': (u'\u2014', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.context.append(suffix)
+        self.body.append(
+            self.starttag(node, 'p', prefix, CLASS='attribution'))
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '</p>\n')
+
+    def visit_author(self, node):
+        if not(isinstance(node.parent, nodes.authors)):
+            self.visit_docinfo_item(node, 'author')
+        self.body.append('<p>')
+
+    def depart_author(self, node):
+        self.body.append('</p>')
+        if isinstance(node.parent, nodes.authors):
+            self.body.append('\n')
+        else:
+            self.depart_docinfo_item()
+
+    def visit_authors(self, node):
+        self.visit_docinfo_item(node, 'authors')
+
+    def depart_authors(self, node):
+        self.depart_docinfo_item()
+
+    def visit_block_quote(self, node):
+        self.body.append(self.starttag(node, 'blockquote'))
+
+    def depart_block_quote(self, node):
+        self.body.append('</blockquote>\n')
+
+    def check_simple_list(self, node):
+        """Check for a simple list that can be rendered compactly."""
+        visitor = SimpleListChecker(self.document)
+        try:
+            node.walk(visitor)
+        except nodes.NodeFound:
+            return False
+        else:
+            return True
+
+    # Compact lists
+    # ------------
+    # Include definition lists and field lists (in addition to ordered
+    # and unordered lists) in the test if a list is "simple"  (cf. the
+    # html4css1.HTMLTranslator docstring and the SimpleListChecker class at
+    # the end of this file).
+
+    def is_compactable(self, node):
+        # print "is_compactable %s ?" % node.__class__,
+        # explicite class arguments have precedence
+        if 'compact' in node['classes']:
+            return True
+        if 'open' in node['classes']:
+            return False
+        # check config setting:
+        if (isinstance(node, (nodes.field_list, nodes.definition_list))
+            and not self.settings.compact_field_lists):
+            # print "`compact-field-lists` is False"
+            return False
+        if (isinstance(node, (nodes.enumerated_list, nodes.bullet_list))
+            and not self.settings.compact_lists):
+            # print "`compact-lists` is False"
+            return False
+        # more special cases:
+        if (self.topic_classes == ['contents']): # TODO: self.in_contents
+            return True
+        # check the list items:
+        return self.check_simple_list(node)
+
+    def visit_bullet_list(self, node):
+        atts = {}
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = 'simple'
+        self.body.append(self.starttag(node, 'ul', **atts))
+
+    def depart_bullet_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ul>\n')
+
+    def visit_caption(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
+
+    def depart_caption(self, node):
+        self.body.append('</p>\n')
+
+    # citations
+    # ---------
+    # Use definition list instead of table for bibliographic references.
+    # Join adjacent citation entries.
+
+    def visit_citation(self, node):
+        if not self.in_footnote_list:
+            self.body.append('<dl class="citation">\n')
+            self.in_footnote_list = True
+
+    def depart_citation(self, node):
+        self.body.append('</dd>\n')
+        if not isinstance(node.next_node(descend=False, siblings=True),
+                          nodes.citation):
+            self.body.append('</dl>\n')
+            self.in_footnote_list = False
+
+    def visit_citation_reference(self, node):
+        href = '#'
+        if 'refid' in node:
+            href += node['refid']
+        elif 'refname' in node:
+            href += self.document.nameids[node['refname']]
+        # else: # TODO system message (or already in the transform)?
+        # 'Citation reference missing.'
+        self.body.append(self.starttag(
+            node, 'a', '[', CLASS='citation-reference', href=href))
+
+    def depart_citation_reference(self, node):
+        self.body.append(']</a>')
+
+     # classifier
+    # ----------
+    # don't insert classifier-delimiter here (done by CSS)
+
+    def visit_classifier(self, node):
+        self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
+
+    def depart_classifier(self, node):
+        self.body.append('</span>')
+
+    def visit_colspec(self, node):
+        self.colspecs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        node.parent.stubs.append(node.attributes.get('stub'))
+
+    def depart_colspec(self, node):
+        # write out <colgroup> when all colspecs are processed
+        if isinstance(node.next_node(descend=False, siblings=True),
+                      nodes.colspec):
+            return
+        if 'colwidths-auto' in node.parent.parent['classes'] or (
+            'colwidths-auto' in self.settings.table_style and
+            ('colwidths-given' not in node.parent.parent['classes'])):
+            return
+        total_width = sum(node['colwidth'] for node in self.colspecs)
+        self.body.append(self.starttag(node, 'colgroup'))
+        for node in self.colspecs:
+            colwidth = int(node['colwidth'] * 100.0 / total_width + 0.5)
+            self.body.append(self.emptytag(node, 'col',
+                                           style='width: %i%%' % colwidth))
+        self.body.append('</colgroup>\n')
+
+    def visit_comment(self, node,
+                      sub=re.compile('-(?=-)').sub):
+        """Escape double-dashes in comment text."""
+        self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='compound'))
+        if len(node) > 1:
+            node[0]['classes'].append('compound-first')
+            node[-1]['classes'].append('compound-last')
+            for child in node[1:-1]:
+                child['classes'].append('compound-middle')
+
+    def depart_compound(self, node):
+        self.body.append('</div>\n')
+
+    def visit_container(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='docutils container'))
+
+    def depart_container(self, node):
+        self.body.append('</div>\n')
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact', meta=False)
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item()
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item()
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        self.body.append('</dt>\n')
+        self.body.append(self.starttag(node, 'dd', ''))
+
+    def depart_definition(self, node):
+        self.body.append('</dd>\n')
+
+    def visit_definition_list(self, node):
+        classes = node.setdefault('classes', [])
+        if self.is_compactable(node):
+            classes.append('simple')
+        self.body.append(self.starttag(node, 'dl'))
+
+    def depart_definition_list(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_definition_list_item(self, node):
+        # pass class arguments, ids and names to definition term:
+        node.children[0]['classes'] = (
+            node.get('classes', []) + node.children[0].get('classes', []))
+        node.children[0]['ids'] = (
+            node.get('ids', []) + node.children[0].get('ids', []))
+        node.children[0]['names'] = (
+            node.get('names', []) + node.children[0].get('names', []))
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append(self.starttag(node, 'dd', ''))
+
+    def depart_description(self, node):
+        self.body.append('</dd>\n')
+
+    def visit_docinfo(self, node):
+        classes = 'docinfo'
+        if (self.is_compactable(node)):
+            classes += ' simple'
+        self.body.append(self.starttag(node, 'dl', CLASS=classes))
+
+    def depart_docinfo(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_docinfo_item(self, node, name, meta=True):
+        if meta:
+            meta_tag = '<meta name="%s" content="%s" />\n' \
+                       % (name, self.attval(node.astext()))
+            self.add_meta(meta_tag)
+        self.body.append('<dt class="%s">%s</dt>\n'
+                         % (name, self.language.labels[name]))
+        self.body.append(self.starttag(node, 'dd', '', CLASS=name))
+
+    def depart_docinfo_item(self):
+        self.body.append('</dd>\n')
+
+    def visit_doctest_block(self, node):
+        self.body.append(self.starttag(node, 'pre', suffix='',
+                                       CLASS='code python doctest'))
+
+    def depart_doctest_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_document(self, node):
+        self.head.append('<title>%s</title>\n'
+                         % self.encode(node.get('title', '')))
+
+    def depart_document(self, node):
+        self.head_prefix.extend([self.doctype,
+                                 self.head_prefix_template %
+                                 {'lang': self.settings.language_code}])
+        self.html_prolog.append(self.doctype)
+        self.meta.insert(0, self.content_type % self.settings.output_encoding)
+        self.head.insert(0, self.content_type % self.settings.output_encoding)
+        if self.math_header:
+            if self.math_output == 'mathjax':
+                self.head.extend(self.math_header)
+            else:
+                self.stylesheet.extend(self.math_header)
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.body_prefix.append(self.starttag(node, 'div', CLASS='document'))
+        self.body_suffix.insert(0, '</div>\n')
+        self.fragment.extend(self.body) # self.fragment is the "naked" body
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+        assert not self.context, 'len(context) = %s' % len(self.context)
+
+    def visit_emphasis(self, node):
+        self.body.append(self.starttag(node, 'em', ''))
+
+    def depart_emphasis(self, node):
+        self.body.append('</em>')
+
+    def visit_entry(self, node):
+        atts = {'class': []}
+        if isinstance(node.parent.parent, nodes.thead):
+            atts['class'].append('head')
+        if node.parent.parent.parent.stubs[node.parent.column]:
+            # "stubs" list is an attribute of the tgroup element
+            atts['class'].append('stub')
+        if atts['class']:
+            tagname = 'th'
+            atts['class'] = ' '.join(atts['class'])
+        else:
+            tagname = 'td'
+            del atts['class']
+        node.parent.column += 1
+        if 'morerows' in node:
+            atts['rowspan'] = node['morerows'] + 1
+        if 'morecols' in node:
+            atts['colspan'] = node['morecols'] + 1
+            node.parent.column += node['morecols']
+        self.body.append(self.starttag(node, tagname, '', **atts))
+        self.context.append('</%s>\n' % tagname.lower())
+        # TODO: why does the html4css1 writer insert an NBSP into empty cells?
+        # if len(node) == 0:              # empty cell
+        #     self.body.append('&#0160;') # no-break space
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_enumerated_list(self, node):
+        atts = {}
+        if 'start' in node:
+            atts['start'] = node['start']
+        if 'enumtype' in node:
+            atts['class'] = node['enumtype']
+        if self.is_compactable(node):
+            atts['class'] = (atts.get('class', '') + ' simple').strip()
+        self.body.append(self.starttag(node, 'ol', **atts))
+
+    def depart_enumerated_list(self, node):
+        self.body.append('</ol>\n')
+
+    def visit_field_list(self, node):
+        # Keep simple paragraphs in the field_body to enable CSS
+        # rule to start body on new line if the label is too long
+        classes = 'field-list'
+        if (self.is_compactable(node)):
+            classes += ' simple'
+        self.body.append(self.starttag(node, 'dl', CLASS=classes))
+
+    def depart_field_list(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_field(self, node):
+        pass
+
+    def depart_field(self, node):
+        pass
+
+    # as field is ignored, pass class arguments to field-name and field-body:
+
+    def visit_field_name(self, node):
+        self.body.append(self.starttag(node, 'dt', '',
+                                       CLASS=''.join(node.parent['classes'])))
+
+    def depart_field_name(self, node):
+        self.body.append('</dt>\n')
+
+    def visit_field_body(self, node):
+        self.body.append(self.starttag(node, 'dd', '',
+                                       CLASS=''.join(node.parent['classes'])))
+        # prevent misalignment of following content if the field is empty:
+        if not node.children:
+            self.body.append('<p></p>')
+
+    def depart_field_body(self, node):
+        self.body.append('</dd>\n')
+
+    def visit_figure(self, node):
+        atts = {'class': 'figure'}
+        if node.get('width'):
+            atts['style'] = 'width: %s' % node['width']
+        if node.get('align'):
+            atts['class'] += " align-" + node['align']
+        self.body.append(self.starttag(node, 'div', **atts))
+
+    def depart_figure(self, node):
+        self.body.append('</div>\n')
+
+    # use HTML 5 <footer> element?
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = [self.starttag(node, 'div', CLASS='footer'),
+                  '<hr class="footer" />\n']
+        footer.extend(self.body[start:])
+        footer.append('\n</div>\n')
+        self.footer.extend(footer)
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    # footnotes
+    # ---------
+    # use definition list instead of table for footnote text
+
+    # TODO: use the new HTML5 element <aside>? (Also for footnote text)
+    def visit_footnote(self, node):
+        if not self.in_footnote_list:
+            classes = 'footnote ' + self.settings.footnote_references
+            self.body.append('<dl class="%s">\n'%classes)
+            self.in_footnote_list = True
+
+    def depart_footnote(self, node):
+        self.body.append('</dd>\n')
+        if not isinstance(node.next_node(descend=False, siblings=True),
+                          nodes.footnote):
+            self.body.append('</dl>\n')
+            self.in_footnote_list = False
+
+    def visit_footnote_reference(self, node):
+        href = '#' + node['refid']
+        classes = 'footnote-reference ' + self.settings.footnote_references
+        self.body.append(self.starttag(node, 'a', '', #suffix,
+                                       CLASS=classes, href=href))
+
+    def depart_footnote_reference(self, node):
+        self.body.append('</a>')
+
+    # Docutils-generated text: put section numbers in a span for CSS styling:
+    def visit_generated(self, node):
+        if 'sectnum' in node['classes']:
+            # get section number (strip trailing no-break-spaces)
+            sectnum = node.astext().rstrip(u' ')
+            # print sectnum.encode('utf-8')
+            self.body.append('<span class="sectnum">%s</span> '
+                                    % self.encode(sectnum))
+            # Content already processed:
+            raise nodes.SkipNode
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = [self.starttag(node, 'div', CLASS='header')]
+        header.extend(self.body[start:])
+        header.append('\n<hr class="header"/>\n</div>\n')
+        self.body_prefix.extend(header)
+        self.header.extend(header)
+        del self.body[start:]
+
+    # Image types to place in an <object> element
+    object_image_types = {'.swf': 'application/x-shockwave-flash'}
+
+    def visit_image(self, node):
+        atts = {}
+        uri = node['uri']
+        ext = os.path.splitext(uri)[1].lower()
+        if ext in self.object_image_types:
+            atts['data'] = uri
+            atts['type'] = self.object_image_types[ext]
+        else:
+            atts['src'] = uri
+            atts['alt'] = node.get('alt', uri)
+        # image size
+        if 'width' in node:
+            atts['width'] = node['width']
+        if 'height' in node:
+            atts['height'] = node['height']
+        if 'scale' in node:
+            if (PIL and not ('width' in node and 'height' in node)
+                and self.settings.file_insertion_enabled):
+                imagepath = urllib.url2pathname(uri)
+                try:
+                    img = PIL.Image.open(
+                            imagepath.encode(sys.getfilesystemencoding()))
+                except (IOError, UnicodeEncodeError):
+                    pass # TODO: warn?
+                else:
+                    self.settings.record_dependencies.add(
+                        imagepath.replace('\\', '/'))
+                    if 'width' not in atts:
+                        atts['width'] = '%dpx' % img.size[0]
+                    if 'height' not in atts:
+                        atts['height'] = '%dpx' % img.size[1]
+                    del img
+            for att_name in 'width', 'height':
+                if att_name in atts:
+                    match = re.match(r'([0-9.]+)(\S*)$', atts[att_name])
+                    assert match
+                    atts[att_name] = '%s%s' % (
+                        float(match.group(1)) * (float(node['scale']) / 100),
+                        match.group(2))
+        style = []
+        for att_name in 'width', 'height':
+            if att_name in atts:
+                if re.match(r'^[0-9.]+$', atts[att_name]):
+                    # Interpret unitless values as pixels.
+                    atts[att_name] += 'px'
+                style.append('%s: %s;' % (att_name, atts[att_name]))
+                del atts[att_name]
+        if style:
+            atts['style'] = ' '.join(style)
+        if (isinstance(node.parent, nodes.TextElement) or
+            (isinstance(node.parent, nodes.reference) and
+             not isinstance(node.parent.parent, nodes.TextElement))):
+            # Inline context or surrounded by <a>...</a>.
+            suffix = ''
+        else:
+            suffix = '\n'
+        if 'align' in node:
+            atts['class'] = 'align-%s' % node['align']
+        if ext in self.object_image_types:
+            # do NOT use an empty tag: incorrect rendering in browsers
+            self.body.append(self.starttag(node, 'object', suffix, **atts) +
+                             node.get('alt', uri) + '</object>' + suffix)
+        else:
+            self.body.append(self.emptytag(node, 'img', suffix, **atts))
+
+    def depart_image(self, node):
+        # self.body.append(self.context.pop())
+        pass
+
+    def visit_inline(self, node):
+        self.body.append(self.starttag(node, 'span', ''))
+
+    def depart_inline(self, node):
+        self.body.append('</span>')
+
+    # footnote and citation labels:
+    def visit_label(self, node):
+        if (isinstance(node.parent, nodes.footnote)):
+            classes = self.settings.footnote_references
+        else:
+            classes = 'brackets'
+        # pass parent node to get id into starttag:
+        self.body.append(self.starttag(node.parent, 'dt', '', CLASS='label'))
+        self.body.append(self.starttag(node, 'span', '', CLASS=classes))
+        # footnote/citation backrefs:
+        if self.settings.footnote_backlinks:
+            backrefs = node.parent['backrefs']
+            if len(backrefs) == 1:
+                self.body.append('<a class="fn-backref" href="#%s">'
+                                 % backrefs[0])
+
+    def depart_label(self, node):
+        if self.settings.footnote_backlinks:
+            backrefs = node.parent['backrefs']
+            if len(backrefs) == 1:
+                self.body.append('</a>')
+        self.body.append('</span>')
+        if self.settings.footnote_backlinks and len(backrefs) > 1:
+            # Python 2.4 fails with enumerate(backrefs, 1)
+            backlinks = ['<a href="#%s">%s</a>' % (ref, i+1)
+                            for (i, ref) in enumerate(backrefs)]
+            self.body.append('<span class="fn-backref">(%s)</span>'
+                                % ','.join(backlinks))
+        self.body.append('</dt>\n<dd>')
+
+    def visit_legend(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='legend'))
+
+    def depart_legend(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line(self, node):
+        self.body.append(self.starttag(node, 'div', suffix='', CLASS='line'))
+        if not len(node):
+            self.body.append('<br />')
+
+    def depart_line(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line_block(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='line-block'))
+
+    def depart_line_block(self, node):
+        self.body.append('</div>\n')
+
+    def visit_list_item(self, node):
+        self.body.append(self.starttag(node, 'li', ''))
+
+    def depart_list_item(self, node):
+        self.body.append('</li>\n')
+
+    # inline literal
+    def visit_literal(self, node):
+        # special case: "code" role
+        classes = node.get('classes', [])
+        if 'code' in classes:
+            # filter 'code' from class arguments
+            node['classes'] = [cls for cls in classes if cls != 'code']
+            self.body.append(self.starttag(node, 'code', ''))
+            return
+        self.body.append(
+            self.starttag(node, 'span', '', CLASS='docutils literal'))
+        text = node.astext()
+        # remove hard line breaks (except if in a parsed-literal block)
+        if not isinstance(node.parent, nodes.literal_block):
+            text = text.replace('\n', ' ')
+        # Protect text like ``--an-option`` and the regular expression
+        # ``[+]?(\d+(\.\d*)?|\.\d+)`` from bad line wrapping
+        for token in self.words_and_spaces.findall(text):
+            if token.strip() and self.sollbruchstelle.search(token):
+                self.body.append('<span class="pre">%s</span>'
+                                    % self.encode(token))
+            else:
+                self.body.append(self.encode(token))
+        self.body.append('</span>')
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def depart_literal(self, node):
+        # skipped unless literal element is from "code" role:
+        self.body.append('</code>')
+
+    def visit_literal_block(self, node):
+        self.body.append(self.starttag(node, 'pre', '', CLASS='literal-block'))
+        if 'code' in node.get('classes', []):
+            self.body.append('<code>')
+
+    def depart_literal_block(self, node):
+        if 'code' in node.get('classes', []):
+            self.body.append('</code>')
+        self.body.append('</pre>\n')
+
+    # Mathematics:
+    # As there is no native HTML math support, we provide alternatives
+    # for the math-output: LaTeX and MathJax simply wrap the content,
+    # HTML and MathML also convert the math_code.
+    # HTML container
+    math_tags = {# math_output: (block, inline, class-arguments)
+                 'mathml':      ('div', '', ''),
+                 'html':        ('div', 'span', 'formula'),
+                 'mathjax':     ('div', 'span', 'math'),
+                 'latex':       ('pre', 'tt',   'math'),
+                }
+
+    def visit_math(self, node, math_env=''):
+        # If the method is called from visit_math_block(), math_env != ''.
+
+        if self.math_output not in self.math_tags:
+            self.document.reporter.error(
+                'math-output format "%s" not supported '
+                'falling back to "latex"'% self.math_output)
+            self.math_output = 'latex'
+        tag = self.math_tags[self.math_output][math_env == '']
+        clsarg = self.math_tags[self.math_output][2]
+        # LaTeX container
+        wrappers = {# math_mode: (inline, block)
+                    'mathml':  ('$%s$',   u'\\begin{%s}\n%s\n\\end{%s}'),
+                    'html':    ('$%s$',   u'\\begin{%s}\n%s\n\\end{%s}'),
+                    'mathjax': ('\(%s\)', u'\\begin{%s}\n%s\n\\end{%s}'),
+                    'latex':   (None,     None),
+                   }
+        wrapper = wrappers[self.math_output][math_env != '']
+        if self.math_output == 'mathml' and (not self.math_output_options or
+                                self.math_output_options[0] == 'blahtexml'):
+            wrapper = None
+        # get and wrap content
+        math_code = node.astext().translate(unichar2tex.uni2tex_table)
+        if wrapper:
+            try: # wrapper with three "%s"
+                math_code = wrapper % (math_env, math_code, math_env)
+            except TypeError: # wrapper with one "%s"
+                math_code = wrapper % math_code
+        # settings and conversion
+        if self.math_output in ('latex', 'mathjax'):
+            math_code = self.encode(math_code)
+        if self.math_output == 'mathjax' and not self.math_header:
+            if self.math_output_options:
+                self.mathjax_url = self.math_output_options[0]
+            self.math_header = [self.mathjax_script % self.mathjax_url]
+        elif self.math_output == 'html':
+            if self.math_output_options and not self.math_header:
+                self.math_header = [self.stylesheet_call(
+                    utils.find_file_in_dirs(s, self.settings.stylesheet_dirs))
+                    for s in self.math_output_options[0].split(',')]
+            # TODO: fix display mode in matrices and fractions
+            math2html.DocumentParameters.displaymode = (math_env != '')
+            math_code = math2html.math2html(math_code)
+        elif self.math_output == 'mathml':
+            if  'XHTML 1' in self.doctype:
+                self.doctype = self.doctype_mathml
+                self.content_type = self.content_type_mathml
+            converter = ' '.join(self.math_output_options).lower()
+            try:
+                if converter == 'latexml':
+                    math_code = tex2mathml_extern.latexml(math_code,
+                                                    self.document.reporter)
+                elif converter == 'ttm':
+                    math_code = tex2mathml_extern.ttm(math_code,
+                                                    self.document.reporter)
+                elif converter == 'blahtexml':
+                    math_code = tex2mathml_extern.blahtexml(math_code,
+                        inline=not(math_env),
+                        reporter=self.document.reporter)
+                elif not converter:
+                    math_code = latex2mathml.tex2mathml(math_code,
+                                                        inline=not(math_env))
+                else:
+                    self.document.reporter.error('option "%s" not supported '
+                    'with math-output "MathML"')
+            except OSError:
+                    raise OSError('is "latexmlmath" in your PATH?')
+            except SyntaxError, err:
+                err_node = self.document.reporter.error(err, base_node=node)
+                self.visit_system_message(err_node)
+                self.body.append(self.starttag(node, 'p'))
+                self.body.append(u','.join(err.args))
+                self.body.append('</p>\n')
+                self.body.append(self.starttag(node, 'pre',
+                                               CLASS='literal-block'))
+                self.body.append(self.encode(math_code))
+                self.body.append('\n</pre>\n')
+                self.depart_system_message(err_node)
+                raise nodes.SkipNode
+        # append to document body
+        if tag:
+            self.body.append(self.starttag(node, tag,
+                                           suffix='\n'*bool(math_env),
+                                           CLASS=clsarg))
+        self.body.append(math_code)
+        if math_env: # block mode (equation, display)
+            self.body.append('\n')
+        if tag:
+            self.body.append('</%s>' % tag)
+        if math_env:
+            self.body.append('\n')
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def depart_math(self, node):
+        pass # never reached
+
+    def visit_math_block(self, node):
+        # print node.astext().encode('utf8')
+        math_env = pick_math_environment(node.astext())
+        self.visit_math(node, math_env=math_env)
+
+    def depart_math_block(self, node):
+        pass # never reached
+
+    # Meta tags: 'lang' attribute replaced by 'xml:lang' in XHTML 1.1
+    # HTML5/polyglot recommends using both
+    def visit_meta(self, node):
+        meta = self.emptytag(node, 'meta', **node.non_default_attributes())
+        self.add_meta(meta)
+
+    def depart_meta(self, node):
+        pass
+
+    def add_meta(self, tag):
+        self.meta.append(tag)
+        self.head.append(tag)
+
+    def visit_option(self, node):
+        self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+
+    def depart_option(self, node):
+        self.body.append('</span>')
+        if isinstance(node.next_node(descend=False, siblings=True),
+                      nodes.option):
+            self.body.append(', ')
+
+    def visit_option_argument(self, node):
+        self.body.append(node.get('delimiter', ' '))
+        self.body.append(self.starttag(node, 'var', ''))
+
+    def depart_option_argument(self, node):
+        self.body.append('</var>')
+
+    def visit_option_group(self, node):
+        self.body.append(self.starttag(node, 'dt', ''))
+        self.body.append('<kbd>')
+
+    def depart_option_group(self, node):
+        self.body.append('</kbd></dt>\n')
+
+    def visit_option_list(self, node):
+        self.body.append(
+            self.starttag(node, 'dl', CLASS='option-list'))
+
+    def depart_option_list(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_option_list_item(self, node):
+        pass
+
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        pass
+
+    def depart_option_string(self, node):
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item()
+
+    # Do not omit <p> tags
+    # --------------------
+    #
+    # The HTML4CSS1 writer does this to "produce
+    # visually compact lists (less vertical whitespace)". This writer
+    # relies on CSS rules for"visual compactness".
+    #
+    # * In XHTML 1.1, e.g. a <blockquote> element may not contain
+    #   character data, so you cannot drop the <p> tags.
+    # * Keeping simple paragraphs in the field_body enables a CSS
+    #   rule to start the field-body on a new line if the label is too long
+    # * it makes the code simpler.
+    #
+    # TODO: omit paragraph tags in simple table cells?
+
+    def visit_paragraph(self, node):
+        self.body.append(self.starttag(node, 'p', ''))
+
+    def depart_paragraph(self, node):
+        self.body.append('</p>')
+        if not (isinstance(node.parent, (nodes.list_item, nodes.entry)) and
+                (len(node.parent) == 1)):
+            self.body.append('\n')
+
+    def visit_problematic(self, node):
+        if node.hasattr('refid'):
+            self.body.append('<a href="#%s">' % node['refid'])
+            self.context.append('</a>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
+
+    def depart_problematic(self, node):
+        self.body.append('</span>')
+        self.body.append(self.context.pop())
+
+    def visit_raw(self, node):
+        if 'html' in node.get('format', '').split():
+            t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div'
+            if node['classes']:
+                self.body.append(self.starttag(node, t, suffix=''))
+            self.body.append(node.astext())
+            if node['classes']:
+                self.body.append('</%s>' % t)
+        # Keep non-HTML raw text out of output:
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        atts = {'class': 'reference'}
+        if 'refuri' in node:
+            atts['href'] = node['refuri']
+            if ( self.settings.cloak_email_addresses
+                 and atts['href'].startswith('mailto:')):
+                atts['href'] = self.cloak_mailto(atts['href'])
+                self.in_mailto = True
+            atts['class'] += ' external'
+        else:
+            assert 'refid' in node, \
+                   'References must have "refuri" or "refid" attribute.'
+            atts['href'] = '#' + node['refid']
+            atts['class'] += ' internal'
+        if not isinstance(node.parent, nodes.TextElement):
+            assert len(node) == 1 and isinstance(node[0], nodes.image)
+            atts['class'] += ' image-reference'
+        self.body.append(self.starttag(node, 'a', '', **atts))
+
+    def depart_reference(self, node):
+        self.body.append('</a>')
+        if not isinstance(node.parent, nodes.TextElement):
+            self.body.append('\n')
+        self.in_mailto = False
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision', meta=False)
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item()
+
+    def visit_row(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+        node.column = 0
+
+    def depart_row(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_rubric(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='rubric'))
+
+    def depart_rubric(self, node):
+        self.body.append('</p>\n')
+
+    # TODO: use the new HTML 5 element <section>?
+    def visit_section(self, node):
+        self.section_level += 1
+        self.body.append(
+            self.starttag(node, 'div', CLASS='section'))
+
+    def depart_section(self, node):
+        self.section_level -= 1
+        self.body.append('</div>\n')
+
+    # TODO: use the new HTML5 element <aside>? (Also for footnote text)
+    def visit_sidebar(self, node):
+        self.body.append(
+            self.starttag(node, 'div', CLASS='sidebar'))
+        self.in_sidebar = True
+
+    def depart_sidebar(self, node):
+        self.body.append('</div>\n')
+        self.in_sidebar = False
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status', meta=False)
+
+    def depart_status(self, node):
+        self.depart_docinfo_item()
+
+    def visit_strong(self, node):
+        self.body.append(self.starttag(node, 'strong', ''))
+
+    def depart_strong(self, node):
+        self.body.append('</strong>')
+
+    def visit_subscript(self, node):
+        self.body.append(self.starttag(node, 'sub', ''))
+
+    def depart_subscript(self, node):
+        self.body.append('</sub>')
+
+    def visit_substitution_definition(self, node):
+        """Internal only."""
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    # h1–h6 elements must not be used to markup subheadings, subtitles,
+    # alternative titles and taglines unless intended to be the heading for a
+    # new section or subsection.
+    # -- http://www.w3.org/TR/html/sections.html#headings-and-sections
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            classes = 'sidebar-subtitle'
+        elif isinstance(node.parent, nodes.document):
+            classes = 'subtitle'
+            self.in_document_title = len(self.body)
+        elif isinstance(node.parent, nodes.section):
+            classes = 'section-subtitle'
+        self.body.append(self.starttag(node, 'p', '', CLASS=classes))
+
+    def depart_subtitle(self, node):
+        self.body.append('</p>\n')
+        if self.in_document_title:
+            self.subtitle = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_subtitle.extend(self.body)
+            del self.body[:]
+
+    def visit_superscript(self, node):
+        self.body.append(self.starttag(node, 'sup', ''))
+
+    def depart_superscript(self, node):
+        self.body.append('</sup>')
+
+    def visit_system_message(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='system-message'))
+        self.body.append('<p class="system-message-title">')
+        backref_text = ''
+        if len(node['backrefs']):
+            backrefs = node['backrefs']
+            if len(backrefs) == 1:
+                backref_text = ('; <em><a href="#%s">backlink</a></em>'
+                                % backrefs[0])
+            else:
+                i = 1
+                backlinks = []
+                for backref in backrefs:
+                    backlinks.append('<a href="#%s">%s</a>' % (backref, i))
+                    i += 1
+                backref_text = ('; <em>backlinks: %s</em>'
+                                % ', '.join(backlinks))
+        if node.hasattr('line'):
+            line = ', line %s' % node['line']
+        else:
+            line = ''
+        self.body.append('System Message: %s/%s '
+                         '(<span class="docutils literal">%s</span>%s)%s</p>\n'
+                         % (node['type'], node['level'],
+                            self.encode(node['source']), line, backref_text))
+
+    def depart_system_message(self, node):
+        self.body.append('</div>\n')
+
+    # tables
+    # ------
+    # no hard-coded border setting in the table head::
+
+    def visit_table(self, node):
+        classes = [cls.strip(u' \t\n')
+                   for cls in self.settings.table_style.split(',')]
+        if 'align' in node:
+            classes.append('align-%s' % node['align'])
+        tag = self.starttag(node, 'table', CLASS=' '.join(classes))
+        self.body.append(tag)
+
+    def depart_table(self, node):
+        self.body.append('</table>\n')
+
+    def visit_target(self, node):
+        if not ('refuri' in node or 'refid' in node
+                or 'refname' in node):
+            self.body.append(self.starttag(node, 'span', '', CLASS='target'))
+            self.context.append('</span>')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    # no hard-coded vertical alignment in table body
+    def visit_tbody(self, node):
+        self.body.append(self.starttag(node, 'tbody'))
+
+    def depart_tbody(self, node):
+        self.body.append('</tbody>\n')
+
+    def visit_term(self, node):
+        self.body.append(self.starttag(node, 'dt', ''))
+
+    def depart_term(self, node):
+        """
+        Leave the end tag to `self.visit_definition()`, in case there's a
+        classifier.
+        """
+        pass
+
+    def visit_tgroup(self, node):
+        self.colspecs = []
+        node.stubs = []
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.body.append(self.starttag(node, 'thead'))
+
+    def depart_thead(self, node):
+        self.body.append('</thead>\n')
+
+    def visit_title(self, node):
+        """Only 6 section levels are supported by HTML."""
+        check_id = 0  # TODO: is this a bool (False) or a counter?
+        close_tag = '</p>\n'
+        if isinstance(node.parent, nodes.topic):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='topic-title first'))
+        elif isinstance(node.parent, nodes.sidebar):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='sidebar-title'))
+        elif isinstance(node.parent, nodes.Admonition):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='admonition-title'))
+        elif isinstance(node.parent, nodes.table):
+            self.body.append(
+                  self.starttag(node, 'caption', ''))
+            close_tag = '</caption>\n'
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h1', '', CLASS='title'))
+            close_tag = '</h1>\n'
+            self.in_document_title = len(self.body)
+        else:
+            assert isinstance(node.parent, nodes.section)
+            h_level = self.section_level + self.initial_header_level - 1
+            atts = {}
+            if (len(node.parent) >= 2 and
+                isinstance(node.parent[1], nodes.subtitle)):
+                atts['CLASS'] = 'with-subtitle'
+            self.body.append(
+                  self.starttag(node, 'h%s' % h_level, '', **atts))
+            atts = {}
+            if node.hasattr('refid'):
+                atts['class'] = 'toc-backref'
+                atts['href'] = '#' + node['refid']
+            if atts:
+                self.body.append(self.starttag({}, 'a', '', **atts))
+                close_tag = '</a></h%s>\n' % (h_level)
+            else:
+                close_tag = '</h%s>\n' % (h_level)
+        self.context.append(close_tag)
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.title = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_title.extend(self.body)
+            del self.body[:]
+
+    def visit_title_reference(self, node):
+        self.body.append(self.starttag(node, 'cite', ''))
+
+    def depart_title_reference(self, node):
+        self.body.append('</cite>')
+
+    # TODO: use the new HTML5 element <aside>? (Also for footnote text)
+    def visit_topic(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='topic'))
+        self.topic_classes = node['classes']
+        # TODO: replace with ::
+        #   self.in_contents = 'contents' in node['classes']
+
+    def depart_topic(self, node):
+        self.body.append('</div>\n')
+        self.topic_classes = []
+        # TODO self.in_contents = False
+
+    def visit_transition(self, node):
+        self.body.append(self.emptytag(node, 'hr', CLASS='docutils'))
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version', meta=False)
+
+    def depart_version(self, node):
+        self.depart_docinfo_item()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+
+class SimpleListChecker(nodes.GenericNodeVisitor):
+
+    """
+    Raise `nodes.NodeFound` if non-simple list item is encountered.
+
+    Here "simple" means a list item containing nothing other than a single
+    paragraph, a simple list, or a paragraph followed by a simple list.
+
+    This version also checks for simple field lists and docinfo.
+    """
+
+    def default_visit(self, node):
+        raise nodes.NodeFound
+
+    def visit_list_item(self, node):
+        # print "visiting list item", node.__class__
+        children = [child for child in node.children
+                    if not isinstance(child, nodes.Invisible)]
+        # print "has %s visible children" % len(children)
+        if (children and isinstance(children[0], nodes.paragraph)
+            and (isinstance(children[-1], nodes.bullet_list) or
+                 isinstance(children[-1], nodes.enumerated_list) or
+                 isinstance(children[-1], nodes.field_list))):
+            children.pop()
+        # print "%s children remain" % len(children)
+        if len(children) <= 1:
+            return
+        else:
+            # print "found", child.__class__, "in", node.__class__
+            raise nodes.NodeFound
+
+    def pass_node(self, node):
+        pass
+
+    def ignore_node(self, node):
+        # ignore nodes that are never complex (can contain only inline nodes)
+        raise nodes.SkipNode
+
+    # Paragraphs and text
+    visit_Text = ignore_node
+    visit_paragraph = ignore_node
+
+    # Lists
+    visit_bullet_list = pass_node
+    visit_enumerated_list = pass_node
+    visit_docinfo = pass_node
+
+    # Docinfo nodes:
+    visit_author = ignore_node
+    visit_authors = visit_list_item
+    visit_address = visit_list_item
+    visit_contact = pass_node
+    visit_copyright = ignore_node
+    visit_date = ignore_node
+    visit_organization = ignore_node
+    visit_status = ignore_node
+    visit_version = visit_list_item
+
+    # Definition list:
+    visit_definition_list = pass_node
+    visit_definition_list_item = pass_node
+    visit_term = ignore_node
+    visit_classifier = pass_node
+    visit_definition = visit_list_item
+
+    # Field list:
+    visit_field_list = pass_node
+    visit_field = pass_node
+    # the field body corresponds to a list item
+    visit_field_body = visit_list_item
+    visit_field_name = ignore_node
+
+    # Invisible nodes should be ignored.
+    visit_comment = ignore_node
+    visit_substitution_definition = ignore_node
+    visit_target = ignore_node
+    visit_pending = ignore_node
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/titlepage.tex
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/titlepage.tex	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/titlepage.tex	(revision 1126)
@@ -0,0 +1,20 @@
+% generated by Docutils <http://docutils.sourceforge.net/>
+$head_prefix
+\usepackage{fixltx2e} % LaTeX patches, \textsubscript
+\usepackage{cmap} % fix search and cut-and-paste in Acrobat
+$requirements
+%%% Custom LaTeX preamble
+$latex_preamble
+%%% User specified packages and stylesheets
+$stylesheet
+%%% Fallback definitions for Docutils-specific commands
+$fallbacks$pdfsetup
+$titledata
+%%% Body
+\begin{document}
+\begin{titlepage}
+$body_pre_docinfo$docinfo$dedication$abstract
+\thispagestyle{empty}
+\end{titlepage}
+$body
+\end{document}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/default.tex
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/default.tex	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/default.tex	(revision 1126)
@@ -0,0 +1,15 @@
+$head_prefix% generated by Docutils <http://docutils.sourceforge.net/>
+\usepackage{fixltx2e} % LaTeX patches, \textsubscript
+\usepackage{cmap} % fix search and cut-and-paste in Acrobat
+$requirements
+%%% Custom LaTeX preamble
+$latex_preamble
+%%% User specified packages and stylesheets
+$stylesheet
+%%% Fallback definitions for Docutils-specific commands
+$fallbacks$pdfsetup
+$titledata
+%%% Body
+\begin{document}
+$body_pre_docinfo$docinfo$dedication$abstract$body
+\end{document}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/__init__.py	(revision 1126)
@@ -0,0 +1,3105 @@
+# .. coding: utf-8
+# $Id: __init__.py 7971 2016-09-13 19:11:48Z milde $
+# Author: Engelbert Gruber, Günter Milde
+# Maintainer: docutils-develop@lists.sourceforge.net
+# Copyright: This module has been placed in the public domain.
+
+"""LaTeX2e document tree Writer."""
+
+__docformat__ = 'reStructuredText'
+
+# code contributions from several people included, thanks to all.
+# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
+#
+# convention deactivate code by two # i.e. ##.
+
+import sys
+import os
+import time
+import re
+import string
+import urllib
+try:
+    import roman
+except ImportError:
+    import docutils.utils.roman as roman
+from docutils import frontend, nodes, languages, writers, utils, io
+from docutils.utils.error_reporting import SafeString
+from docutils.transforms import writer_aux
+from docutils.utils.math import pick_math_environment, unichar2tex
+
+class Writer(writers.Writer):
+
+    supported = ('latex','latex2e')
+    """Formats this writer supports."""
+
+    default_template = 'default.tex'
+    default_template_path = os.path.dirname(os.path.abspath(__file__))
+    default_preamble = '\n'.join([r'% PDF Standard Fonts',
+                                  r'\usepackage{mathptmx} % Times',
+                                  r'\usepackage[scaled=.90]{helvet}',
+                                  r'\usepackage{courier}'])
+    table_style_values = ('standard', 'booktabs','nolines', 'borderless',
+                          'colwidths-auto', 'colwidths-given')
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        None,
+        (('Specify documentclass.  Default is "article".',
+          ['--documentclass'],
+          {'default': 'article', }),
+         ('Specify document options.  Multiple options can be given, '
+          'separated by commas.  Default is "a4paper".',
+          ['--documentoptions'],
+          {'default': 'a4paper', }),
+         ('Footnotes with numbers/symbols by Docutils. (default)',
+          ['--docutils-footnotes'],
+          {'default': True, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "superscript".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'superscript',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Use \\cite command for citations. ',
+          ['--use-latex-citations'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Use figure floats for citations '
+          '(might get mixed with real figures). (default)',
+          ['--figure-citations'],
+          {'dest': 'use_latex_citations', 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Specify LaTeX packages/stylesheets. '
+         ' A style is referenced with \\usepackage if extension is '
+         '".sty" or omitted and with \\input else. '
+          ' Overrides previous --stylesheet and --stylesheet-path settings.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file[,file,...]>',
+           'overrides': 'stylesheet_path',
+           'validator': frontend.validate_comma_separated_list}),
+         ('Comma separated list of LaTeX packages/stylesheets. '
+          'Relative paths are expanded if a matching file is found in '
+          'the --stylesheet-dirs. With --link-stylesheet, '
+          'the path is rewritten relative to the output *.tex file. ',
+          ['--stylesheet-path'],
+          {'metavar': '<file[,file,...]>', 'overrides': 'stylesheet',
+           'validator': frontend.validate_comma_separated_list}),
+         ('Link to the stylesheet(s) in the output file. (default)',
+          ['--link-stylesheet'],
+          {'dest': 'embed_stylesheet', 'action': 'store_false'}),
+         ('Embed the stylesheet(s) in the output file. '
+          'Stylesheets must be accessible during processing. ',
+          ['--embed-stylesheet'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Comma-separated list of directories where stylesheets are found. '
+          'Used by --stylesheet-path when expanding relative path arguments. '
+          'Default: "."',
+          ['--stylesheet-dirs'],
+          {'metavar': '<dir[,dir,...]>',
+           'validator': frontend.validate_comma_separated_list,
+           'default': ['.']}),
+         ('Customization by LaTeX code in the preamble. '
+          'Default: select PDF standard fonts (Times, Helvetica, Courier).',
+          ['--latex-preamble'],
+          {'default': default_preamble}),
+         ('Specify the template file. Default: "%s".' % default_template,
+          ['--template'],
+          {'default': default_template, 'metavar': '<file>'}),
+         ('Table of contents by LaTeX. (default) ',
+          ['--use-latex-toc'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Table of contents by Docutils (without page numbers). ',
+          ['--use-docutils-toc'],
+          {'dest': 'use_latex_toc', 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Add parts on top of the section hierarchy.',
+          ['--use-part-section'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Attach author and date to the document info table. (default) ',
+          ['--use-docutils-docinfo'],
+          {'dest': 'use_latex_docinfo', 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Attach author and date to the document title.',
+          ['--use-latex-docinfo'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ("Typeset abstract as topic. (default)",
+          ['--topic-abstract'],
+          {'dest': 'use_latex_abstract', 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ("Use LaTeX abstract environment for the document's abstract. ",
+          ['--use-latex-abstract'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Color of any hyperlinks embedded in text '
+          '(default: "blue", "false" to disable).',
+          ['--hyperlink-color'], {'default': 'blue'}),
+         ('Additional options to the "hyperref" package '
+          '(default: "").',
+          ['--hyperref-options'], {'default': ''}),
+         ('Enable compound enumerators for nested enumerated lists '
+          '(e.g. "1.2.a.ii").  Default: disabled.',
+          ['--compound-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compound enumerators for nested enumerated lists. '
+          'This is the default.',
+          ['--no-compound-enumerators'],
+          {'action': 'store_false', 'dest': 'compound_enumerators'}),
+         ('Enable section ("." subsection ...) prefixes for compound '
+          'enumerators.  This has no effect without --compound-enumerators.'
+          'Default: disabled.',
+          ['--section-prefix-for-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable section prefixes for compound enumerators.  '
+          'This is the default.',
+          ['--no-section-prefix-for-enumerators'],
+          {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
+         ('Set the separator between section number and enumerator '
+          'for compound enumerated lists.  Default is "-".',
+          ['--section-enumerator-separator'],
+          {'default': '-', 'metavar': '<char>'}),
+         ('When possibile, use the specified environment for literal-blocks. '
+          'Default is quoting of whitespace and special chars.',
+          ['--literal-block-env'],
+          {'default': ''}),
+         ('When possibile, use verbatim for literal-blocks. '
+          'Compatibility alias for "--literal-block-env=verbatim".',
+          ['--use-verbatim-when-possible'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Table style. "standard" with horizontal and vertical lines, '
+          '"booktabs" (LaTeX booktabs style) only horizontal lines '
+          'above and below the table and below the header or "borderless".  '
+          'Default: "standard"',
+          ['--table-style'],
+          {'default': ['standard'],
+           'metavar': '<format>',
+           'action': 'append',
+           'validator': frontend.validate_comma_separated_list,
+           'choices': table_style_values}),
+         ('LaTeX graphicx package option. '
+          'Possible values are "dvips", "pdftex". "auto" includes LaTeX code '
+          'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. '
+          'Default is no option.',
+          ['--graphicx-option'],
+          {'default': ''}),
+         ('LaTeX font encoding. '
+          'Possible values are "", "T1" (default), "OT1", "LGR,T1" or '
+          'any other combination of options to the `fontenc` package. ',
+          ['--font-encoding'],
+          {'default': 'T1'}),
+         ('Per default the latex-writer puts the reference title into '
+          'hyperreferences. Specify "ref*" or "pageref*" to get the section '
+          'number or the page number.',
+          ['--reference-label'],
+          {'default': None, }),
+         ('Specify style and database for bibtex, for example '
+          '"--use-bibtex=mystyle,mydb1,mydb2".',
+          ['--use-bibtex'],
+          {'default': None, }),
+          ),)
+
+    settings_defaults = {'sectnum_depth': 0 # updated by SectNum transform
+                        }
+    config_section = 'latex2e writer'
+    config_section_dependencies = ('writers',)
+
+    head_parts = ('head_prefix', 'requirements', 'latex_preamble',
+                  'stylesheet', 'fallbacks', 'pdfsetup',
+                  'title', 'subtitle', 'titledata')
+    visitor_attributes = head_parts + ('body_pre_docinfo', 'docinfo',
+                                       'dedication', 'abstract', 'body')
+
+    output = None
+    """Final translated form of `document`."""
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    # Override parent method to add latex-specific transforms
+    def get_transforms(self):
+       return writers.Writer.get_transforms(self) + [
+       # Convert specific admonitions to generic one
+       writer_aux.Admonitions,
+       # TODO: footnote collection transform
+       ]
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        # copy parts
+        for part in self.visitor_attributes:
+            setattr(self, part, getattr(visitor, part))
+        # get template string from file
+        try:
+            template_file = open(self.document.settings.template, 'rb')
+        except IOError:
+            template_file = open(os.path.join(self.default_template_path,
+                                     self.document.settings.template), 'rb')
+        template = string.Template(unicode(template_file.read(), 'utf-8'))
+        template_file.close()
+        # fill template
+        self.assemble_parts() # create dictionary of parts
+        self.output = template.substitute(self.parts)
+
+    def assemble_parts(self):
+        """Assemble the `self.parts` dictionary of output fragments."""
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            lines = getattr(self, part)
+            if part in self.head_parts:
+                if lines:
+                    lines.append('') # to get a trailing newline
+                self.parts[part] = '\n'.join(lines)
+            else:
+                # body contains inline elements, so join without newline
+                self.parts[part] = ''.join(lines)
+
+
+class Babel(object):
+    """Language specifics for LaTeX."""
+
+    # TeX (babel) language names:
+    # ! not all of these are supported by Docutils!
+    #
+    # based on LyX' languages file with adaptions to `BCP 47`_
+    # (http://www.rfc-editor.org/rfc/bcp/bcp47.txt) and
+    # http://www.tug.org/TUGboat/Articles/tb29-3/tb93miklavec.pdf
+    # * the key without subtags is the default
+    # * case is ignored
+    # cf. http://docutils.sourceforge.net/docs/howto/i18n.html
+    #     http://www.w3.org/International/articles/language-tags/
+    # and http://www.iana.org/assignments/language-subtag-registry
+    language_codes = {
+        # code          TeX/Babel-name       comment
+        'af':           'afrikaans',
+        'ar':           'arabic',
+        # 'be':           'belarusian',
+        'bg':           'bulgarian',
+        'br':           'breton',
+        'ca':           'catalan',
+        # 'cop':          'coptic',
+        'cs':           'czech',
+        'cy':           'welsh',
+        'da':           'danish',
+        'de':           'ngerman', # new spelling (de_1996)
+        'de-1901':      'german', # old spelling
+        'de-AT':        'naustrian',
+        'de-AT-1901':   'austrian',
+        'dsb':          'lowersorbian',
+        'el':           'greek', # monotonic (el-monoton)
+        'el-polyton':   'polutonikogreek',
+        'en':           'english',  # TeX' default language
+        'en-AU':        'australian',
+        'en-CA':        'canadian',
+        'en-GB':        'british',
+        'en-NZ':        'newzealand',
+        'en-US':        'american',
+        'eo':           'esperanto',
+        'es':           'spanish',
+        'et':           'estonian',
+        'eu':           'basque',
+        # 'fa':           'farsi',
+        'fi':           'finnish',
+        'fr':           'french',
+        'fr-CA':        'canadien',
+        'ga':           'irish',    # Irish Gaelic
+        # 'grc':                    # Ancient Greek
+        'grc-ibycus':   'ibycus',   # Ibycus encoding
+        'gl':           'galician',
+        'he':           'hebrew',
+        'hr':           'croatian',
+        'hsb':          'uppersorbian',
+        'hu':           'magyar',
+        'ia':           'interlingua',
+        'id':           'bahasai',  # Bahasa (Indonesian)
+        'is':           'icelandic',
+        'it':           'italian',
+        'ja':           'japanese',
+        'kk':           'kazakh',
+        'la':           'latin',
+        'lt':           'lithuanian',
+        'lv':           'latvian',
+        'mn':           'mongolian', # Mongolian, Cyrillic script (mn-cyrl)
+        'ms':           'bahasam',   # Bahasa (Malay)
+        'nb':           'norsk',     # Norwegian Bokmal
+        'nl':           'dutch',
+        'nn':           'nynorsk',   # Norwegian Nynorsk
+        'no':           'norsk',     # Norwegian (Bokmal)
+        'pl':           'polish',
+        'pt':           'portuges',
+        'pt-BR':        'brazil',
+        'ro':           'romanian',
+        'ru':           'russian',
+        'se':           'samin',     # North Sami
+        'sh-Cyrl':      'serbianc',  # Serbo-Croatian, Cyrillic script
+        'sh-Latn':      'serbian',   # Serbo-Croatian, Latin script see also 'hr'
+        'sk':           'slovak',
+        'sl':           'slovene',
+        'sq':           'albanian',
+        'sr':           'serbianc',  # Serbian, Cyrillic script (contributed)
+        'sr-Latn':      'serbian',   # Serbian, Latin script
+        'sv':           'swedish',
+        # 'th':           'thai',
+        'tr':           'turkish',
+        'uk':           'ukrainian',
+        'vi':           'vietnam',
+        # zh-Latn:      Chinese Pinyin
+        }
+    # normalize (downcase) keys
+    language_codes = dict([(k.lower(), v) for (k,v) in language_codes.items()])
+
+    warn_msg = 'Language "%s" not supported by LaTeX (babel)'
+
+    # "Active characters" are shortcuts that start a LaTeX macro and may need
+    # escaping for literals use. Characters that prevent literal use (e.g.
+    # starting accent macros like "a -> ä) will be deactivated if one of the
+    # defining languages is used in the document.
+    # Special cases:
+    #  ~ (tilde) -- used in estonian, basque, galician, and old versions of
+    #    spanish -- cannot be deactivated as it denotes a no-break space macro,
+    #  " (straight quote) -- used in albanian, austrian, basque
+    #    brazil, bulgarian, catalan, czech, danish, dutch, estonian,
+    #    finnish, galician, german, icelandic, italian, latin, naustrian,
+    #    ngerman, norsk, nynorsk, polish, portuges, russian, serbian, slovak,
+    #    slovene, spanish, swedish, ukrainian, and uppersorbian --
+    #    is escaped as ``\textquotedbl``.
+    active_chars = {# TeX/Babel-name:  active characters to deactivate
+                    # 'breton':        ':;!?' # ensure whitespace
+                    # 'esperanto':     '^',
+                    # 'estonian':      '~"`',
+                    # 'french':        ':;!?' # ensure whitespace
+                    'galician':        '.<>', # also '~"'
+                    # 'magyar':        '`', # for special hyphenation cases
+                    'spanish':         '.<>', # old versions also '~'
+                    # 'turkish':       ':!=' # ensure whitespace
+                   }
+
+    def __init__(self, language_code, reporter=None):
+        self.reporter = reporter
+        self.language = self.language_name(language_code)
+        self.otherlanguages = {}
+
+    def __call__(self):
+        """Return the babel call with correct options and settings"""
+        languages = sorted(self.otherlanguages.keys())
+        languages.append(self.language or 'english')
+        self.setup = [r'\usepackage[%s]{babel}' % ','.join(languages)]
+        # Deactivate "active characters"
+        shorthands = []
+        for c in ''.join([self.active_chars.get(l, '') for l in languages]):
+            if c not in shorthands:
+                shorthands.append(c)
+        if shorthands:
+            self.setup.append(r'\AtBeginDocument{\shorthandoff{%s}}'
+                              % ''.join(shorthands))
+        # Including '~' in shorthandoff prevents its use as no-break space
+        if 'galician' in languages:
+            self.setup.append(r'\deactivatetilden % restore ~ in Galician')
+        if 'estonian' in languages:
+            self.setup.extend([r'\makeatletter',
+                               r'  \addto\extrasestonian{\bbl@deactivate{~}}',
+                               r'\makeatother'])
+        if 'basque' in languages:
+            self.setup.extend([r'\makeatletter',
+                               r'  \addto\extrasbasque{\bbl@deactivate{~}}',
+                               r'\makeatother'])
+        if (languages[-1] == 'english' and
+            'french' in self.otherlanguages.keys()):
+            self.setup += ['% Prevent side-effects if French hyphenation '
+                           'patterns are not loaded:',
+                           r'\frenchbsetup{StandardLayout}',
+                           r'\AtBeginDocument{\selectlanguage{%s}'
+                           r'\noextrasfrench}' % self.language]
+        return '\n'.join(self.setup)
+
+    def language_name(self, language_code):
+        """Return TeX language name for `language_code`"""
+        for tag in utils.normalize_language_tag(language_code):
+            try:
+                return self.language_codes[tag]
+            except KeyError:
+                pass
+        if self.reporter is not None:
+            self.reporter.warning(self.warn_msg % language_code)
+        return ''
+
+    def get_language(self):
+        # Obsolete, kept for backwards compatibility with Sphinx
+        return self.language
+
+
+# Building blocks for the latex preamble
+# --------------------------------------
+
+class SortableDict(dict):
+    """Dictionary with additional sorting methods
+
+    Tip: use key starting with with '_' for sorting before small letters
+         and with '~' for sorting after small letters.
+    """
+    def sortedkeys(self):
+        """Return sorted list of keys"""
+        keys = self.keys()
+        keys.sort()
+        return keys
+
+    def sortedvalues(self):
+        """Return list of values sorted by keys"""
+        return [self[key] for key in self.sortedkeys()]
+
+
+# PreambleCmds
+# `````````````
+# A container for LaTeX code snippets that can be
+# inserted into the preamble if required in the document.
+#
+# .. The package 'makecmds' would enable shorter definitions using the
+#    \providelength and \provideenvironment commands.
+#    However, it is pretty non-standard (texlive-latex-extra).
+
+class PreambleCmds(object):
+    """Building blocks for the latex preamble."""
+
+PreambleCmds.abstract = r"""
+% abstract title
+\providecommand*{\DUtitleabstract}[1]{\centering\textbf{#1}}"""
+
+PreambleCmds.admonition = r"""
+% admonition (specially marked topic)
+\providecommand{\DUadmonition}[2][class-arg]{%
+  % try \DUadmonition#1{#2}:
+  \ifcsname DUadmonition#1\endcsname%
+    \csname DUadmonition#1\endcsname{#2}%
+  \else
+    \begin{center}
+      \fbox{\parbox{0.9\linewidth}{#2}}
+    \end{center}
+  \fi
+}"""
+
+PreambleCmds.align_center = r"""
+\makeatletter
+\@namedef{DUrolealign-center}{\centering}
+\makeatother
+"""
+
+## PreambleCmds.caption = r"""% configure caption layout
+## \usepackage{caption}
+## \captionsetup{singlelinecheck=false}% no exceptions for one-liners"""
+
+PreambleCmds.color = r"""\usepackage{color}"""
+
+PreambleCmds.docinfo = r"""
+% docinfo (width of docinfo table)
+\DUprovidelength{\DUdocinfowidth}{0.9\linewidth}"""
+# PreambleCmds.docinfo._depends = 'providelength'
+
+PreambleCmds.dedication = r"""
+% dedication topic
+\providecommand{\DUtopicdedication}[1]{\begin{center}#1\end{center}}"""
+
+PreambleCmds.error = r"""
+% error admonition title
+\providecommand*{\DUtitleerror}[1]{\DUtitle{\color{red}#1}}"""
+# PreambleCmds.errortitle._depends = 'color'
+
+PreambleCmds.fieldlist = r"""
+% fieldlist environment
+\ifthenelse{\isundefined{\DUfieldlist}}{
+  \newenvironment{DUfieldlist}%
+    {\quote\description}
+    {\enddescription\endquote}
+}{}"""
+
+PreambleCmds.float_settings = r"""\usepackage{float} % float configuration
+\floatplacement{figure}{H} % place figures here definitely"""
+
+PreambleCmds.footnotes = r"""% numeric or symbol footnotes with hyperlinks
+\providecommand*{\DUfootnotemark}[3]{%
+  \raisebox{1em}{\hypertarget{#1}{}}%
+  \hyperlink{#2}{\textsuperscript{#3}}%
+}
+\providecommand{\DUfootnotetext}[4]{%
+  \begingroup%
+  \renewcommand{\thefootnote}{%
+    \protect\raisebox{1em}{\protect\hypertarget{#1}{}}%
+    \protect\hyperlink{#2}{#3}}%
+  \footnotetext{#4}%
+  \endgroup%
+}"""
+
+PreambleCmds.graphicx_auto = r"""% Check output format
+\ifx\pdftexversion\undefined
+  \usepackage{graphicx}
+\else
+  \usepackage[pdftex]{graphicx}
+\fi"""
+
+PreambleCmds.highlight_rules = r"""% basic code highlight:
+\providecommand*\DUrolecomment[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
+\providecommand*\DUroledeleted[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
+\providecommand*\DUrolekeyword[1]{\textbf{#1}}
+\providecommand*\DUrolestring[1]{\textit{#1}}"""
+
+PreambleCmds.inline = r"""
+% inline markup (custom roles)
+% \DUrole{#1}{#2} tries \DUrole#1{#2}
+\providecommand*{\DUrole}[2]{%
+  \ifcsname DUrole#1\endcsname%
+    \csname DUrole#1\endcsname{#2}%
+  \else% backwards compatibility: try \docutilsrole#1{#2}
+    \ifcsname docutilsrole#1\endcsname%
+      \csname docutilsrole#1\endcsname{#2}%
+    \else%
+      #2%
+    \fi%
+  \fi%
+}"""
+
+PreambleCmds.legend = r"""
+% legend environment
+\ifthenelse{\isundefined{\DUlegend}}{
+  \newenvironment{DUlegend}{\small}{}
+}{}"""
+
+PreambleCmds.lineblock = r"""
+% lineblock environment
+\DUprovidelength{\DUlineblockindent}{2.5em}
+\ifthenelse{\isundefined{\DUlineblock}}{
+  \newenvironment{DUlineblock}[1]{%
+    \list{}{\setlength{\partopsep}{\parskip}
+            \addtolength{\partopsep}{\baselineskip}
+            \setlength{\topsep}{0pt}
+            \setlength{\itemsep}{0.15\baselineskip}
+            \setlength{\parsep}{0pt}
+            \setlength{\leftmargin}{#1}}
+    \raggedright
+  }
+  {\endlist}
+}{}"""
+# PreambleCmds.lineblock._depends = 'providelength'
+
+PreambleCmds.linking = r"""
+%% hyperlinks:
+\ifthenelse{\isundefined{\hypersetup}}{
+  \usepackage[%s]{hyperref}
+  \usepackage{bookmark}
+  \urlstyle{same} %% normal text font (alternatives: tt, rm, sf)
+}{}"""
+
+PreambleCmds.minitoc = r"""%% local table of contents
+\usepackage{minitoc}"""
+
+PreambleCmds.optionlist = r"""
+% optionlist environment
+\providecommand*{\DUoptionlistlabel}[1]{\bf #1 \hfill}
+\DUprovidelength{\DUoptionlistindent}{3cm}
+\ifthenelse{\isundefined{\DUoptionlist}}{
+  \newenvironment{DUoptionlist}{%
+    \list{}{\setlength{\labelwidth}{\DUoptionlistindent}
+            \setlength{\rightmargin}{1cm}
+            \setlength{\leftmargin}{\rightmargin}
+            \addtolength{\leftmargin}{\labelwidth}
+            \addtolength{\leftmargin}{\labelsep}
+            \renewcommand{\makelabel}{\DUoptionlistlabel}}
+  }
+  {\endlist}
+}{}"""
+# PreambleCmds.optionlist._depends = 'providelength'
+
+PreambleCmds.providelength = r"""
+% providelength (provide a length variable and set default, if it is new)
+\providecommand*{\DUprovidelength}[2]{
+  \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{}
+}"""
+
+PreambleCmds.rubric = r"""
+% rubric (informal heading)
+\providecommand*{\DUrubric}[2][class-arg]{%
+  \subsubsection*{\centering\textit{\textmd{#2}}}}"""
+
+PreambleCmds.sidebar = r"""
+% sidebar (text outside the main text flow)
+\providecommand{\DUsidebar}[2][class-arg]{%
+  \begin{center}
+    \colorbox[gray]{0.80}{\parbox{0.9\linewidth}{#2}}
+  \end{center}
+}"""
+
+PreambleCmds.subtitle = r"""
+% subtitle (for topic/sidebar)
+\providecommand*{\DUsubtitle}[2][class-arg]{\par\emph{#2}\smallskip}"""
+
+PreambleCmds.documentsubtitle = r"""
+% subtitle (in document title)
+\providecommand*{\DUdocumentsubtitle}[1]{{\large #1}}"""
+
+PreambleCmds.table = r"""\usepackage{longtable,ltcaption,array}
+\setlength{\extrarowheight}{2pt}
+\newlength{\DUtablewidth} % internal use in tables"""
+
+# Options [force,almostfull] prevent spurious error messages, see
+# de.comp.text.tex/2005-12/msg01855
+PreambleCmds.textcomp = """\
+\\usepackage{textcomp} % text symbol macros"""
+
+PreambleCmds.titlereference = r"""
+% titlereference role
+\providecommand*{\DUroletitlereference}[1]{\textsl{#1}}"""
+
+PreambleCmds.title = r"""
+% title for topics, admonitions, unsupported section levels, and sidebar
+\providecommand*{\DUtitle}[2][class-arg]{%
+  % call \DUtitle#1{#2} if it exists:
+  \ifcsname DUtitle#1\endcsname%
+    \csname DUtitle#1\endcsname{#2}%
+  \else
+    \smallskip\noindent\textbf{#2}\smallskip%
+  \fi
+}"""
+
+PreambleCmds.topic = r"""
+% topic (quote with heading)
+\providecommand{\DUtopic}[2][class-arg]{%
+  \ifcsname DUtopic#1\endcsname%
+    \csname DUtopic#1\endcsname{#2}%
+  \else
+    \begin{quote}#2\end{quote}
+  \fi
+}"""
+
+PreambleCmds.transition = r"""
+% transition (break, fancybreak, anonymous section)
+\providecommand*{\DUtransition}[1][class-arg]{%
+  \hspace*{\fill}\hrulefill\hspace*{\fill}
+  \vskip 0.5\baselineskip
+}"""
+
+
+# LaTeX encoding maps
+# -------------------
+# ::
+
+class CharMaps(object):
+    """LaTeX representations for active and Unicode characters."""
+
+    # characters that need escaping even in `alltt` environments:
+    alltt = {
+        ord('\\'): ur'\textbackslash{}',
+        ord('{'): ur'\{',
+        ord('}'): ur'\}',
+    }
+    # characters that normally need escaping:
+    special = {
+        ord('#'): ur'\#',
+        ord('$'): ur'\$',
+        ord('%'): ur'\%',
+        ord('&'): ur'\&',
+        ord('~'): ur'\textasciitilde{}',
+        ord('_'): ur'\_',
+        ord('^'): ur'\textasciicircum{}',
+        # straight double quotes are 'active' in many languages
+        ord('"'): ur'\textquotedbl{}',
+        # Square brackets are ordinary chars and cannot be escaped with '\',
+        # so we put them in a group '{[}'. (Alternative: ensure that all
+        # macros with optional arguments are terminated with {} and text
+        # inside any optional argument is put in a group ``[{text}]``).
+        # Commands with optional args inside an optional arg must be put in a
+        # group, e.g. ``\item[{\hyperref[label]{text}}]``.
+        ord('['): ur'{[}',
+        ord(']'): ur'{]}',
+        # the soft hyphen is unknown in 8-bit text
+        # and not properly handled by XeTeX
+        0x00AD: ur'\-', # SOFT HYPHEN
+    }
+    # Unicode chars that are not recognized by LaTeX's utf8 encoding
+    unsupported_unicode = {
+        0x00A0: ur'~', # NO-BREAK SPACE
+        # TODO: ensure white space also at the beginning of a line?
+        # 0x00A0: ur'\leavevmode\nobreak\vadjust{}~'
+        0x2008: ur'\,', # PUNCTUATION SPACE   
+        0x2011: ur'\hbox{-}', # NON-BREAKING HYPHEN
+        0x202F: ur'\,', # NARROW NO-BREAK SPACE
+        0x21d4: ur'$\Leftrightarrow$',
+        # Docutils footnote symbols:
+        0x2660: ur'$\spadesuit$',
+        0x2663: ur'$\clubsuit$',
+    }
+    # Unicode chars that are recognized by LaTeX's utf8 encoding
+    utf8_supported_unicode = {
+        0x00AB: ur'\guillemotleft{}', # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        0x00bb: ur'\guillemotright{}', # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        0x200C: ur'\textcompwordmark{}', # ZERO WIDTH NON-JOINER
+        0x2013: ur'\textendash{}',
+        0x2014: ur'\textemdash{}',
+        0x2018: ur'\textquoteleft{}',
+        0x2019: ur'\textquoteright{}',
+        0x201A: ur'\quotesinglbase{}', # SINGLE LOW-9 QUOTATION MARK
+        0x201C: ur'\textquotedblleft{}',
+        0x201D: ur'\textquotedblright{}',
+        0x201E: ur'\quotedblbase{}', # DOUBLE LOW-9 QUOTATION MARK
+        0x2030: ur'\textperthousand{}',   # PER MILLE SIGN
+        0x2031: ur'\textpertenthousand{}', # PER TEN THOUSAND SIGN
+        0x2039: ur'\guilsinglleft{}',
+        0x203A: ur'\guilsinglright{}',
+        0x2423: ur'\textvisiblespace{}',  # OPEN BOX
+        0x2020: ur'\dag{}',
+        0x2021: ur'\ddag{}',
+        0x2026: ur'\dots{}',
+        0x2122: ur'\texttrademark{}',
+    }
+    # recognized with 'utf8', if textcomp is loaded
+    textcomp = {
+        # Latin-1 Supplement
+        0x00a2: ur'\textcent{}',          # ¢ CENT SIGN
+        0x00a4: ur'\textcurrency{}',      # ¤ CURRENCY SYMBOL
+        0x00a5: ur'\textyen{}',           # ¥ YEN SIGN
+        0x00a6: ur'\textbrokenbar{}',     # ¦ BROKEN BAR
+        0x00a7: ur'\textsection{}',       # § SECTION SIGN
+        0x00a8: ur'\textasciidieresis{}', # ¨ DIAERESIS
+        0x00a9: ur'\textcopyright{}',     # © COPYRIGHT SIGN
+        0x00aa: ur'\textordfeminine{}',   # ª FEMININE ORDINAL INDICATOR
+        0x00ac: ur'\textlnot{}',          # ¬ NOT SIGN
+        0x00ae: ur'\textregistered{}',    # ® REGISTERED SIGN
+        0x00af: ur'\textasciimacron{}',   # ¯ MACRON
+        0x00b0: ur'\textdegree{}',        # ° DEGREE SIGN
+        0x00b1: ur'\textpm{}',            # ± PLUS-MINUS SIGN
+        0x00b2: ur'\texttwosuperior{}',   # ² SUPERSCRIPT TWO
+        0x00b3: ur'\textthreesuperior{}', # ³ SUPERSCRIPT THREE
+        0x00b4: ur'\textasciiacute{}',    # ´ ACUTE ACCENT
+        0x00b5: ur'\textmu{}',            # µ MICRO SIGN
+        0x00b6: ur'\textparagraph{}',     # ¶ PILCROW SIGN # != \textpilcrow
+        0x00b9: ur'\textonesuperior{}',   # ¹ SUPERSCRIPT ONE
+        0x00ba: ur'\textordmasculine{}',  # º MASCULINE ORDINAL INDICATOR
+        0x00bc: ur'\textonequarter{}',    # 1/4 FRACTION
+        0x00bd: ur'\textonehalf{}',       # 1/2 FRACTION
+        0x00be: ur'\textthreequarters{}', # 3/4 FRACTION
+        0x00d7: ur'\texttimes{}',         # × MULTIPLICATION SIGN
+        0x00f7: ur'\textdiv{}',           # ÷ DIVISION SIGN
+        # others
+        0x0192: ur'\textflorin{}',        # LATIN SMALL LETTER F WITH HOOK
+        0x02b9: ur'\textasciiacute{}',    # MODIFIER LETTER PRIME
+        0x02ba: ur'\textacutedbl{}',      # MODIFIER LETTER DOUBLE PRIME
+        0x2016: ur'\textbardbl{}',        # DOUBLE VERTICAL LINE
+        0x2022: ur'\textbullet{}',        # BULLET
+        0x2032: ur'\textasciiacute{}',    # PRIME
+        0x2033: ur'\textacutedbl{}',      # DOUBLE PRIME
+        0x2035: ur'\textasciigrave{}',    # REVERSED PRIME
+        0x2036: ur'\textgravedbl{}',      # REVERSED DOUBLE PRIME
+        0x203b: ur'\textreferencemark{}', # REFERENCE MARK
+        0x203d: ur'\textinterrobang{}',   # INTERROBANG
+        0x2044: ur'\textfractionsolidus{}', # FRACTION SLASH
+        0x2045: ur'\textlquill{}',        # LEFT SQUARE BRACKET WITH QUILL
+        0x2046: ur'\textrquill{}',        # RIGHT SQUARE BRACKET WITH QUILL
+        0x2052: ur'\textdiscount{}',      # COMMERCIAL MINUS SIGN
+        0x20a1: ur'\textcolonmonetary{}', # COLON SIGN
+        0x20a3: ur'\textfrenchfranc{}',   # FRENCH FRANC SIGN
+        0x20a4: ur'\textlira{}',          # LIRA SIGN
+        0x20a6: ur'\textnaira{}',         # NAIRA SIGN
+        0x20a9: ur'\textwon{}',           # WON SIGN
+        0x20ab: ur'\textdong{}',          # DONG SIGN
+        0x20ac: ur'\texteuro{}',          # EURO SIGN
+        0x20b1: ur'\textpeso{}',          # PESO SIGN
+        0x20b2: ur'\textguarani{}',       # GUARANI SIGN
+        0x2103: ur'\textcelsius{}',       # DEGREE CELSIUS
+        0x2116: ur'\textnumero{}',        # NUMERO SIGN
+        0x2117: ur'\textcircledP{}',      # SOUND RECORDING COYRIGHT
+        0x211e: ur'\textrecipe{}',        # PRESCRIPTION TAKE
+        0x2120: ur'\textservicemark{}',   # SERVICE MARK
+        0x2122: ur'\texttrademark{}',     # TRADE MARK SIGN
+        0x2126: ur'\textohm{}',           # OHM SIGN
+        0x2127: ur'\textmho{}',           # INVERTED OHM SIGN
+        0x212e: ur'\textestimated{}',     # ESTIMATED SYMBOL
+        0x2190: ur'\textleftarrow{}',     # LEFTWARDS ARROW
+        0x2191: ur'\textuparrow{}',       # UPWARDS ARROW
+        0x2192: ur'\textrightarrow{}',    # RIGHTWARDS ARROW
+        0x2193: ur'\textdownarrow{}',     # DOWNWARDS ARROW
+        0x2212: ur'\textminus{}',         # MINUS SIGN
+        0x2217: ur'\textasteriskcentered{}', # ASTERISK OPERATOR
+        0x221a: ur'\textsurd{}',          # SQUARE ROOT
+        0x2422: ur'\textblank{}',         # BLANK SYMBOL
+        0x25e6: ur'\textopenbullet{}',    # WHITE BULLET
+        0x25ef: ur'\textbigcircle{}',     # LARGE CIRCLE
+        0x266a: ur'\textmusicalnote{}',   # EIGHTH NOTE
+        0x26ad: ur'\textmarried{}',       # MARRIAGE SYMBOL
+        0x26ae: ur'\textdivorced{}',      # DIVORCE SYMBOL
+        0x27e8: ur'\textlangle{}',        # MATHEMATICAL LEFT ANGLE BRACKET
+        0x27e9: ur'\textrangle{}',        # MATHEMATICAL RIGHT ANGLE BRACKET
+    }
+    # Unicode chars that require a feature/package to render
+    pifont = {
+        0x2665: ur'\ding{170}',     # black heartsuit
+        0x2666: ur'\ding{169}',     # black diamondsuit
+        0x2713: ur'\ding{51}',      # check mark
+        0x2717: ur'\ding{55}',      # check mark
+    }
+    # TODO: greek alphabet ... ?
+    # see also LaTeX codec
+    # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
+    # and unimap.py from TeXML
+
+
+class DocumentClass(object):
+    """Details of a LaTeX document class."""
+
+    def __init__(self, document_class, with_part=False):
+        self.document_class = document_class
+        self._with_part = with_part
+        self.sections = ['section', 'subsection', 'subsubsection',
+                         'paragraph', 'subparagraph']
+        if self.document_class in ('book', 'memoir', 'report',
+                                   'scrbook', 'scrreprt'):
+            self.sections.insert(0, 'chapter')
+        if self._with_part:
+            self.sections.insert(0, 'part')
+
+    def section(self, level):
+        """Return the LaTeX section name for section `level`.
+
+        The name depends on the specific document class.
+        Level is 1,2,3..., as level 0 is the title.
+        """
+        if level <= len(self.sections):
+            return self.sections[level-1]
+        else:  # unsupported levels
+            return 'DUtitle[section%s]' % roman.toRoman(level)
+
+class Table(object):
+    """Manage a table while traversing.
+
+    Maybe change to a mixin defining the visit/departs, but then
+    class Table internal variables are in the Translator.
+
+    Table style might be
+
+    :standard:   horizontal and vertical lines
+    :booktabs:   only horizontal lines (requires "booktabs" LaTeX package)
+    :borderless: no borders around table cells
+    :nolines:    alias for borderless
+
+    :colwidths-auto:  column widths determined by LaTeX
+    :colwidths-given: use colum widths from rST source
+    """
+    def __init__(self, translator, latex_type):
+        self._translator = translator
+        self._latex_type = latex_type
+        self._open = False
+        # miscellaneous attributes
+        self._attrs = {}
+        self._col_width = []
+        self._rowspan = []
+        self.stubs = []
+        self.colwidths_auto = False
+        self._in_thead = 0
+
+    def open(self):
+        self._open = True
+        self._col_specs = []
+        self.caption = []
+        self._attrs = {}
+        self._in_head = False # maybe context with search
+    def close(self):
+        self._open = False
+        self._col_specs = None
+        self.caption = []
+        self._attrs = {}
+        self.stubs = []
+        self.colwidths_auto = False
+
+    def is_open(self):
+        return self._open
+
+    def set_table_style(self, table_style, classes):
+        borders = [cls.replace('nolines', 'borderless')
+                   for cls in table_style+classes
+                   if cls in ('standard','booktabs','borderless', 'nolines')]
+        try:
+            self.borders = borders[-1]
+        except IndexError:
+            self.borders = 'standard'
+        self.colwidths_auto = (('colwidths-auto' in classes
+                                and 'colwidths-given' not in table_style)
+                               or ('colwidths-auto' in table_style
+                                   and ('colwidths-given' not in classes)))
+
+    def get_latex_type(self):
+        if self._latex_type == 'longtable' and not self.caption:
+            # do not advance the "table" counter (requires "ltcaption" package)
+            return('longtable*')
+        return self._latex_type
+
+    def set(self,attr,value):
+        self._attrs[attr] = value
+    def get(self,attr):
+        if attr in self._attrs:
+            return self._attrs[attr]
+        return None
+
+    def get_vertical_bar(self):
+        if self.borders == 'standard':
+            return '|'
+        return ''
+
+    # horizontal lines are drawn below a row,
+    def get_opening(self):
+        align_map = {'left': 'l',
+                     'center': 'c',
+                     'right': 'r'}
+        align = align_map.get(self.get('align') or 'center')
+        opening = [r'\begin{%s}[%s]' % (self.get_latex_type(), align)]
+        if not self.colwidths_auto:
+            opening.insert(0, r'\setlength{\DUtablewidth}{\linewidth}')
+        return '\n'.join(opening)
+
+    def get_closing(self):
+        closing = []
+        if self.borders == 'booktabs':
+            closing.append(r'\bottomrule')
+        # elif self.borders == 'standard':
+        #     closing.append(r'\hline')
+        closing.append(r'\end{%s}' % self.get_latex_type())
+        return '\n'.join(closing)
+
+    def visit_colspec(self, node):
+        self._col_specs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        self.stubs.append(node.attributes.get('stub'))
+
+    def get_colspecs(self, node):
+        """Return column specification for longtable.
+
+        Assumes reST line length being 80 characters.
+        Table width is hairy.
+
+        === ===
+        ABC DEF
+        === ===
+
+        usually gets to narrow, therefore we add 1 (fiddlefactor).
+        """
+        bar = self.get_vertical_bar()
+        self._rowspan= [0] * len(self._col_specs)
+        self._col_width = []
+        if self.colwidths_auto:
+            latex_table_spec = (bar+'l')*len(self._col_specs)
+            return latex_table_spec+bar
+        width = 80
+        total_width = 0.0
+        # first see if we get too wide.
+        for node in self._col_specs:
+            colwidth = float(node['colwidth']+1) / width
+            total_width += colwidth
+        # donot make it full linewidth
+        factor = 0.93
+        if total_width > 1.0:
+            factor /= total_width
+        latex_table_spec = ''
+        for node in self._col_specs:
+            colwidth = factor * float(node['colwidth']+1) / width
+            self._col_width.append(colwidth+0.005)
+            latex_table_spec += '%sp{%.3f\\DUtablewidth}' % (bar, colwidth+0.005)
+        return latex_table_spec+bar
+
+    def get_column_width(self):
+        """Return columnwidth for current cell (not multicell)."""
+        try:
+            return '%.2f\\DUtablewidth' % self._col_width[self._cell_in_row]
+        except IndexError:
+            return '*'
+
+    def get_multicolumn_width(self, start, len_):
+        """Return sum of columnwidths for multicell."""
+        try:
+            mc_width = sum([width
+                            for width in ([self._col_width[start + co]
+                                           for co in range (len_)])])
+            return 'p{%.2f\\DUtablewidth}' % mc_width
+        except IndexError:
+            return 'l'
+
+    def get_caption(self):
+        if not self.caption:
+            return ''
+        caption = ''.join(self.caption)
+        if 1 == self._translator.thead_depth():
+            return r'\caption{%s}\\' '\n' % caption
+        return r'\caption[]{%s (... continued)}\\' '\n' % caption
+
+    def need_recurse(self):
+        if self._latex_type == 'longtable':
+            return 1 == self._translator.thead_depth()
+        return 0
+
+    def visit_thead(self):
+        self._in_thead += 1
+        if self.borders == 'standard':
+            return ['\\hline\n']
+        elif self.borders == 'booktabs':
+            return ['\\toprule\n']
+        return []
+
+    def depart_thead(self):
+        a = []
+        #if self.borders == 'standard':
+        #    a.append('\\hline\n')
+        if self.borders == 'booktabs':
+            a.append('\\midrule\n')
+        if self._latex_type == 'longtable':
+            if 1 == self._translator.thead_depth():
+                a.append('\\endfirsthead\n')
+            else:
+                a.append('\\endhead\n')
+                a.append(r'\multicolumn{%d}{c}' % len(self._col_specs) +
+                         r'{\hfill ... continued on next page} \\')
+                a.append('\n\\endfoot\n\\endlastfoot\n')
+        # for longtable one could add firsthead, foot and lastfoot
+        self._in_thead -= 1
+        return a
+
+    def visit_row(self):
+        self._cell_in_row = 0
+
+    def depart_row(self):
+        res = [' \\\\\n']
+        self._cell_in_row = None  # remove cell counter
+        for i in range(len(self._rowspan)):
+            if (self._rowspan[i]>0):
+                self._rowspan[i] -= 1
+
+        if self.borders == 'standard':
+            rowspans = [i+1 for i in range(len(self._rowspan))
+                        if (self._rowspan[i]<=0)]
+            if len(rowspans)==len(self._rowspan):
+                res.append('\\hline\n')
+            else:
+                cline = ''
+                rowspans.reverse()
+                # TODO merge clines
+                while True:
+                    try:
+                        c_start = rowspans.pop()
+                    except:
+                        break
+                    cline += '\\cline{%d-%d}\n' % (c_start,c_start)
+                res.append(cline)
+        return res
+
+    def set_rowspan(self,cell,value):
+        try:
+            self._rowspan[cell] = value
+        except:
+            pass
+
+    def get_rowspan(self,cell):
+        try:
+            return self._rowspan[cell]
+        except:
+            return 0
+
+    def get_entry_number(self):
+        return self._cell_in_row
+
+    def visit_entry(self):
+        self._cell_in_row += 1
+
+    def is_stub_column(self):
+        if len(self.stubs) >= self._cell_in_row:
+            return self.stubs[self._cell_in_row]
+        return False
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+
+    # When options are given to the documentclass, latex will pass them
+    # to other packages, as done with babel.
+    # Dummy settings might be taken from document settings
+
+    # Write code for typesetting with 8-bit tex/pdftex (vs. xetex/luatex) engine
+    # overwritten by the XeTeX writer
+    is_xetex = False
+
+    # Config setting defaults
+    # -----------------------
+
+    # TODO: use mixins for different implementations.
+    # list environment for docinfo. else tabularx
+    ## use_optionlist_for_docinfo = False # TODO: NOT YET IN USE
+
+    # Use compound enumerations (1.A.1.)
+    compound_enumerators = False
+
+    # If using compound enumerations, include section information.
+    section_prefix_for_enumerators = False
+
+    # This is the character that separates the section ("." subsection ...)
+    # prefix from the regular list enumerator.
+    section_enumerator_separator = '-'
+
+    # Auxiliary variables
+    # -------------------
+
+    has_latex_toc = False # is there a toc in the doc? (needed by minitoc)
+    is_toc_list = False   # is the current bullet_list a ToC?
+    section_level = 0
+
+    # Flags to encode():
+    # inside citation reference labels underscores dont need to be escaped
+    inside_citation_reference_label = False
+    verbatim = False                   # do not encode
+    insert_non_breaking_blanks = False # replace blanks by "~"
+    insert_newline = False             # add latex newline commands
+    literal = False                    # literal text (block or inline)
+    alltt = False                      # inside `alltt` environment
+
+    def __init__(self, document, babel_class=Babel):
+        nodes.NodeVisitor.__init__(self, document)
+        # Reporter
+        # ~~~~~~~~
+        self.warn = self.document.reporter.warning
+        self.error = self.document.reporter.error
+
+        # Settings
+        # ~~~~~~~~
+        self.settings = settings = document.settings
+        self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
+        self.use_latex_toc = settings.use_latex_toc
+        self.use_latex_docinfo = settings.use_latex_docinfo
+        self._use_latex_citations = settings.use_latex_citations
+        self._reference_label = settings.reference_label
+        self.hyperlink_color = settings.hyperlink_color
+        self.compound_enumerators = settings.compound_enumerators
+        self.font_encoding = getattr(settings, 'font_encoding', '')
+        self.section_prefix_for_enumerators = (
+            settings.section_prefix_for_enumerators)
+        self.section_enumerator_separator = (
+            settings.section_enumerator_separator.replace('_', r'\_'))
+        # literal blocks:
+        self.literal_block_env = 'alltt'
+        self.literal_block_options = ''
+        if settings.literal_block_env != '':
+            (none,
+             self.literal_block_env,
+             self.literal_block_options,
+             none ) = re.split('(\w+)(.*)', settings.literal_block_env)
+        elif settings.use_verbatim_when_possible:
+            self.literal_block_env = 'verbatim'
+        #
+        if self.settings.use_bibtex:
+            self.bibtex = self.settings.use_bibtex.split(',',1)
+            # TODO avoid errors on not declared citations.
+        else:
+            self.bibtex = None
+        # language module for Docutils-generated text
+        # (labels, bibliographic_fields, and author_separators)
+        self.language_module = languages.get_language(settings.language_code,
+                                              document.reporter)
+        self.babel = babel_class(settings.language_code, document.reporter)
+        self.author_separator = self.language_module.author_separators[0]
+        d_options = [self.settings.documentoptions]
+        if self.babel.language not in ('english', ''):
+            d_options.append(self.babel.language)
+        self.documentoptions = ','.join(filter(None, d_options))
+        self.d_class = DocumentClass(settings.documentclass,
+                                     settings.use_part_section)
+        # graphic package options:
+        if self.settings.graphicx_option == '':
+            self.graphicx_package = r'\usepackage{graphicx}'
+        elif self.settings.graphicx_option.lower() == 'auto':
+            self.graphicx_package = PreambleCmds.graphicx_auto
+        else:
+            self.graphicx_package = (r'\usepackage[%s]{graphicx}' %
+                                     self.settings.graphicx_option)
+        # footnotes:
+        self.docutils_footnotes = settings.docutils_footnotes
+        # @@ table_style: list of values from fixed set: warn?
+        # for s in self.settings.table_style:
+        #     if s not in Writer.table_style_values:
+        #         self.warn('Ignoring value "%s" in "table-style" setting.' %s)
+
+        # Output collection stacks
+        # ~~~~~~~~~~~~~~~~~~~~~~~~
+
+        # Document parts
+        self.head_prefix = [r'\documentclass[%s]{%s}' %
+            (self.documentoptions, self.settings.documentclass)]
+        self.requirements = SortableDict() # made a list in depart_document()
+        self.requirements['__static'] = r'\usepackage{ifthen}'
+        self.latex_preamble = [settings.latex_preamble]
+        self.fallbacks = SortableDict() # made a list in depart_document()
+        self.pdfsetup = [] # PDF properties (hyperref package)
+        self.title = []
+        self.subtitle = []
+        self.titledata = [] # \title, \author, \date
+        ## self.body_prefix = ['\\begin{document}\n']
+        self.body_pre_docinfo = [] # \maketitle
+        self.docinfo = []
+        self.dedication = []
+        self.abstract = []
+        self.body = []
+        ## self.body_suffix = ['\\end{document}\n']
+
+        # A heterogenous stack used in conjunction with the tree traversal.
+        # Make sure that the pops correspond to the pushes:
+        self.context = []
+
+        # Title metadata:
+        self.title_labels = []
+        self.subtitle_labels = []
+        # (if use_latex_docinfo: collects lists of
+        # author/organization/contact/address lines)
+        self.author_stack = []
+        self.date = []
+
+        # PDF properties: pdftitle, pdfauthor
+        # TODO?: pdfcreator, pdfproducer, pdfsubject, pdfkeywords
+        self.pdfinfo = []
+        self.pdfauthor = []
+
+        # Stack of section counters so that we don't have to use_latex_toc.
+        # This will grow and shrink as processing occurs.
+        # Initialized for potential first-level sections.
+        self._section_number = [0]
+
+        # The current stack of enumerations so that we can expand
+        # them into a compound enumeration.
+        self._enumeration_counters = []
+        # The maximum number of enumeration counters we've used.
+        # If we go beyond this number, we need to create a new
+        # counter; otherwise, just reuse an old one.
+        self._max_enumeration_counters = 0
+
+        self._bibitems = []
+
+        # object for a table while proccessing.
+        self.table_stack = []
+        self.active_table = Table(self, 'longtable')
+
+        # Where to collect the output of visitor methods (default: body)
+        self.out = self.body
+        self.out_stack = []  # stack of output collectors
+
+        # Process settings
+        # ~~~~~~~~~~~~~~~~
+        # Encodings:
+        # Docutils' output-encoding => TeX input encoding
+        if self.latex_encoding != 'ascii':
+            self.requirements['_inputenc'] = (r'\usepackage[%s]{inputenc}'
+                                              % self.latex_encoding)
+        # TeX font encoding
+        if not self.is_xetex:
+            if self.font_encoding:
+                self.requirements['_fontenc'] = (r'\usepackage[%s]{fontenc}' %
+                                                 self.font_encoding)
+            # ensure \textquotedbl is defined:
+            for enc in self.font_encoding.split(','):
+                enc = enc.strip()
+                if enc == 'OT1':
+                    self.requirements['_textquotedblOT1'] = (
+                        r'\DeclareTextSymbol{\textquotedbl}{OT1}{`\"}')
+                elif enc not in ('T1', 'T2A', 'T2B', 'T2C', 'T4', 'T5'):
+                    self.requirements['_textquotedbl'] = (
+                        r'\DeclareTextSymbolDefault{\textquotedbl}{T1}')
+        # page layout with typearea (if there are relevant document options)
+        if (settings.documentclass.find('scr') == -1 and
+            (self.documentoptions.find('DIV') != -1 or
+             self.documentoptions.find('BCOR') != -1)):
+            self.requirements['typearea'] = r'\usepackage{typearea}'
+
+        # Stylesheets
+        # (the name `self.stylesheet` is singular because only one
+        # stylesheet was supported before Docutils 0.6).
+        self.stylesheet = [self.stylesheet_call(path)
+                           for path in utils.get_stylesheet_list(settings)]
+
+        # PDF setup
+        if self.hyperlink_color in ('0', 'false', 'False', ''):
+            self.hyperref_options = ''
+        else:
+            self.hyperref_options = 'colorlinks=true,linkcolor=%s,urlcolor=%s' % (
+                                      self.hyperlink_color, self.hyperlink_color)
+        if settings.hyperref_options:
+            self.hyperref_options += ',' + settings.hyperref_options
+
+        # LaTeX Toc
+        # include all supported sections in toc and PDF bookmarks
+        # (or use documentclass-default (as currently))?
+        ## if self.use_latex_toc:
+        ##    self.requirements['tocdepth'] = (r'\setcounter{tocdepth}{%d}' %
+        ##                                     len(self.d_class.sections))
+
+        # Section numbering
+        if settings.sectnum_xform: # section numbering by Docutils
+            PreambleCmds.secnumdepth = r'\setcounter{secnumdepth}{0}'
+        else: # section numbering by LaTeX:
+            secnumdepth = settings.sectnum_depth
+            # Possible values of settings.sectnum_depth:
+            # None  "sectnum" directive without depth arg -> LaTeX default
+            #  0    no "sectnum" directive -> no section numbers
+            # >0    value of "depth" argument -> translate to LaTeX levels:
+            #       -1  part    (0 with "article" document class)
+            #        0  chapter (missing in "article" document class)
+            #        1  section
+            #        2  subsection
+            #        3  subsubsection
+            #        4  paragraph
+            #        5  subparagraph
+            if secnumdepth is not None:
+                # limit to supported levels
+                secnumdepth = min(secnumdepth, len(self.d_class.sections))
+                # adjust to document class and use_part_section settings
+                if 'chapter' in  self.d_class.sections:
+                    secnumdepth -= 1
+                if self.d_class.sections[0] == 'part':
+                    secnumdepth -= 1
+                PreambleCmds.secnumdepth = \
+                    r'\setcounter{secnumdepth}{%d}' % secnumdepth
+
+            # start with specified number:
+            if (hasattr(settings, 'sectnum_start') and
+                settings.sectnum_start != 1):
+                self.requirements['sectnum_start'] = (
+                    r'\setcounter{%s}{%d}' % (self.d_class.sections[0],
+                                              settings.sectnum_start-1))
+            # TODO: currently ignored (configure in a stylesheet):
+            ## settings.sectnum_prefix
+            ## settings.sectnum_suffix
+
+    # Auxiliary Methods
+    # -----------------
+
+    def stylesheet_call(self, path):
+        """Return code to reference or embed stylesheet file `path`"""
+        # is it a package (no extension or *.sty) or "normal" tex code:
+        (base, ext) = os.path.splitext(path)
+        is_package = ext in ['.sty', '']
+        # Embed content of style file:
+        if self.settings.embed_stylesheet:
+            if is_package:
+                path = base + '.sty' # ensure extension
+            try:
+                content = io.FileInput(source_path=path,
+                                       encoding='utf-8').read()
+                self.settings.record_dependencies.add(path)
+            except IOError, err:
+                msg = u"Cannot embed stylesheet '%s':\n  %s." % (
+                                path, SafeString(err.strerror))
+                self.document.reporter.error(msg)
+                return '% ' + msg.replace('\n', '\n% ')
+            if is_package:
+                content = '\n'.join([r'\makeatletter',
+                                     content,
+                                     r'\makeatother'])
+            return '%% embedded stylesheet: %s\n%s' % (path, content)
+        # Link to style file:
+        if is_package:
+            path = base # drop extension
+            cmd = r'\usepackage{%s}'
+        else:
+            cmd = r'\input{%s}'
+        if self.settings.stylesheet_path:
+            # adapt path relative to output (cf. config.html#stylesheet-path)
+            path = utils.relative_path(self.settings._destination, path)
+        return cmd % path
+
+    def to_latex_encoding(self,docutils_encoding):
+        """Translate docutils encoding name into LaTeX's.
+
+        Default method is remove "-" and "_" chars from docutils_encoding.
+        """
+        tr = {  'iso-8859-1': 'latin1',     # west european
+                'iso-8859-2': 'latin2',     # east european
+                'iso-8859-3': 'latin3',     # esperanto, maltese
+                'iso-8859-4': 'latin4',     # north european, scandinavian, baltic
+                'iso-8859-5': 'iso88595',   # cyrillic (ISO)
+                'iso-8859-9': 'latin5',     # turkish
+                'iso-8859-15': 'latin9',    # latin9, update to latin1.
+                'mac_cyrillic': 'maccyr',   # cyrillic (on Mac)
+                'windows-1251': 'cp1251',   # cyrillic (on Windows)
+                'koi8-r': 'koi8-r',         # cyrillic (Russian)
+                'koi8-u': 'koi8-u',         # cyrillic (Ukrainian)
+                'windows-1250': 'cp1250',   #
+                'windows-1252': 'cp1252',   #
+                'us-ascii': 'ascii',        # ASCII (US)
+                # unmatched encodings
+                #'': 'applemac',
+                #'': 'ansinew',  # windows 3.1 ansi
+                #'': 'ascii',    # ASCII encoding for the range 32--127.
+                #'': 'cp437',    # dos latin us
+                #'': 'cp850',    # dos latin 1
+                #'': 'cp852',    # dos latin 2
+                #'': 'decmulti',
+                #'': 'latin10',
+                #'iso-8859-6': ''   # arabic
+                #'iso-8859-7': ''   # greek
+                #'iso-8859-8': ''   # hebrew
+                #'iso-8859-10': ''   # latin6, more complete iso-8859-4
+             }
+        encoding = docutils_encoding.lower()
+        if encoding in tr:
+            return tr[encoding]
+        # drop hyphen or low-line from "latin-1", "latin_1", "utf-8" and similar
+        encoding = encoding.replace('_', '').replace('-', '')
+        # strip the error handler
+        return encoding.split(':')[0]
+
+    def language_label(self, docutil_label):
+        return self.language_module.labels[docutil_label]
+
+    def encode(self, text):
+        """Return text with 'problematic' characters escaped.
+
+        * Escape the special printing characters ``# $ % & ~ _ ^ \ { }``,
+          square brackets ``[ ]``, double quotes and (in OT1) ``< | >``.
+        * Translate non-supported Unicode characters.
+        * Separate ``-`` (and more in literal text) to prevent input ligatures.
+        """
+        if self.verbatim:
+            return text
+        # Set up the translation table:
+        table = CharMaps.alltt.copy()
+        if not self.alltt:
+            table.update(CharMaps.special)
+        # keep the underscore in citation references
+        if self.inside_citation_reference_label:
+            del(table[ord('_')])
+        # Workarounds for OT1 font-encoding
+        if self.font_encoding in ['OT1', ''] and not self.is_xetex:
+            # * out-of-order characters in cmtt
+            if self.literal:
+                # replace underscore by underlined blank,
+                # because this has correct width.
+                table[ord('_')] = u'\\underline{~}'
+                # the backslash doesn't work, so we use a mirrored slash.
+                # \reflectbox is provided by graphicx:
+                self.requirements['graphicx'] = self.graphicx_package
+                table[ord('\\')] = ur'\reflectbox{/}'
+            # * ``< | >`` come out as different chars (except for cmtt):
+            else:
+                table[ord('|')] = ur'\textbar{}'
+                table[ord('<')] = ur'\textless{}'
+                table[ord('>')] = ur'\textgreater{}'
+        if self.insert_non_breaking_blanks:
+            table[ord(' ')] = ur'~'
+        # Unicode replacements for 8-bit tex engines (not required with XeTeX/LuaTeX):
+        if not self.is_xetex:
+            table.update(CharMaps.unsupported_unicode)
+            if not self.latex_encoding.startswith('utf8'):
+                table.update(CharMaps.utf8_supported_unicode)
+                table.update(CharMaps.textcomp)
+            table.update(CharMaps.pifont)
+            # Characters that require a feature/package to render
+            if [True for ch in text if ord(ch) in CharMaps.textcomp]:
+                self.requirements['textcomp'] = PreambleCmds.textcomp
+            if [True for ch in text if ord(ch) in CharMaps.pifont]:
+                    self.requirements['pifont'] = '\\usepackage{pifont}'
+
+        text = text.translate(table)
+
+        # Break up input ligatures e.g. '--' to '-{}-'.
+        if not self.is_xetex: # Not required with xetex/luatex
+            separate_chars = '-'
+            # In monospace-font, we also separate ',,', '``' and "''" and some
+            # other characters which can't occur in non-literal text.
+            if self.literal:
+                separate_chars += ',`\'"<>'
+            for char in separate_chars * 2:
+                # Do it twice ("* 2") because otherwise we would replace
+                # '---' by '-{}--'.
+                text = text.replace(char + char, char + '{}' + char)
+
+        # Literal line breaks (in address or literal blocks):
+        if self.insert_newline:
+            lines = text.split('\n')
+            # Add a protected space to blank lines (except the last)
+            # to avoid ``! LaTeX Error: There's no line here to end.``
+            for i, line in enumerate(lines[:-1]):
+                if not line.lstrip():
+                    lines[i] += '~'
+            text = (r'\\' + '\n').join(lines)
+        if self.literal and not self.insert_non_breaking_blanks:
+            # preserve runs of spaces but allow wrapping
+            text = text.replace('  ', ' ~')
+        return text
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, encode, and return attribute value text."""
+        return self.encode(whitespace.sub(' ', text))
+
+    # TODO: is this used anywhere? -> update (use template) or delete
+    ## def astext(self):
+    ##     """Assemble document parts and return as string."""
+    ##     head = '\n'.join(self.head_prefix + self.stylesheet + self.head)
+    ##     body = ''.join(self.body_prefix  + self.body + self.body_suffix)
+    ##     return head + '\n' + body
+
+    def is_inline(self, node):
+        """Check whether a node represents an inline or block-level element"""
+        return isinstance(node.parent, nodes.TextElement)
+
+    def append_hypertargets(self, node):
+        """Append hypertargets for all ids of `node`"""
+        # hypertarget places the anchor at the target's baseline,
+        # so we raise it explicitely
+        self.out.append('%\n'.join(['\\raisebox{1em}{\\hypertarget{%s}{}}' %
+                                    id for id in node['ids']]))
+
+    def ids_to_labels(self, node, set_anchor=True):
+        """Return list of label definitions for all ids of `node`
+
+        If `set_anchor` is True, an anchor is set with \phantomsection.
+        """
+        labels = ['\\label{%s}' % id for id in node.get('ids', [])]
+        if set_anchor and labels:
+            labels.insert(0, '\\phantomsection')
+        return labels
+
+    def push_output_collector(self, new_out):
+        self.out_stack.append(self.out)
+        self.out = new_out
+
+    def pop_output_collector(self):
+        self.out = self.out_stack.pop()
+
+    # Visitor methods
+    # ---------------
+
+    def visit_Text(self, node):
+        self.out.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_abbreviation(self, node):
+        node['classes'].insert(0, 'abbreviation')
+        self.visit_inline(node)
+
+    def depart_abbreviation(self, node):
+        self.depart_inline(node)
+
+    def visit_acronym(self, node):
+        node['classes'].insert(0, 'acronym')
+        self.visit_inline(node)
+
+    def depart_acronym(self, node):
+        self.depart_inline(node)
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address')
+
+    def depart_address(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_admonition(self, node):
+        self.fallbacks['admonition'] = PreambleCmds.admonition
+        if 'error' in node['classes']:
+            self.fallbacks['error'] = PreambleCmds.error
+        # strip the generic 'admonition' from the list of classes
+        node['classes'] = [cls for cls in node['classes']
+                           if cls != 'admonition']
+        self.out.append('\n\\DUadmonition[%s]{\n' % ','.join(node['classes']))
+
+    def depart_admonition(self, node=None):
+        self.out.append('}\n')
+
+    def visit_author(self, node):
+        self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_authors(self, node):
+        # not used: visit_author is called anyway for each author.
+        pass
+
+    def depart_authors(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.out.append( '%\n\\begin{quote}\n')
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_block_quote(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+        self.out.append( '\n\\end{quote}\n')
+
+    def visit_bullet_list(self, node):
+        if self.is_toc_list:
+            self.out.append( '%\n\\begin{list}{}{}\n' )
+        else:
+            self.out.append( '%\n\\begin{itemize}\n' )
+        # if node['classes']:
+        #     self.visit_inline(node)
+
+    def depart_bullet_list(self, node):
+        # if node['classes']:
+        #     self.depart_inline(node)
+        if self.is_toc_list:
+            self.out.append( '\n\\end{list}\n' )
+        else:
+            self.out.append( '\n\\end{itemize}\n' )
+
+    def visit_superscript(self, node):
+        self.out.append(r'\textsuperscript{')
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_superscript(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+        self.out.append('}')
+
+    def visit_subscript(self, node):
+        self.out.append(r'\textsubscript{') # requires `fixltx2e`
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_subscript(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+        self.out.append('}')
+
+    def visit_caption(self, node):
+        self.out.append('\n\\caption{')
+
+    def depart_caption(self, node):
+        self.out.append('}\n')
+
+    def visit_title_reference(self, node):
+        self.fallbacks['titlereference'] = PreambleCmds.titlereference
+        self.out.append(r'\DUroletitlereference{')
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_title_reference(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+        self.out.append( '}' )
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        if self._use_latex_citations:
+            self.push_output_collector([])
+        else:
+            # TODO: do we need these?
+            ## self.requirements['~fnt_floats'] = PreambleCmds.footnote_floats
+            self.out.append(r'\begin{figure}[b]')
+            self.append_hypertargets(node)
+
+    def depart_citation(self, node):
+        if self._use_latex_citations:
+            label = self.out[0]
+            text = ''.join(self.out[1:])
+            self._bibitems.append([label, text])
+            self.pop_output_collector()
+        else:
+            self.out.append('\\end{figure}\n')
+
+    def visit_citation_reference(self, node):
+        if self._use_latex_citations:
+            if not self.inside_citation_reference_label:
+                self.out.append(r'\cite{')
+                self.inside_citation_reference_label = 1
+            else:
+                assert self.body[-1] in (' ', '\n'),\
+                        'unexpected non-whitespace while in reference label'
+                del self.body[-1]
+        else:
+            href = ''
+            if 'refid' in node:
+                href = node['refid']
+            elif 'refname' in node:
+                href = self.document.nameids[node['refname']]
+            self.out.append('\\hyperlink{%s}{[' % href)
+
+    def depart_citation_reference(self, node):
+        if self._use_latex_citations:
+            followup_citation = False
+            # check for a following citation separated by a space or newline
+            next_siblings = node.traverse(descend=False, siblings=True,
+                                          include_self=False)
+            if len(next_siblings) > 1:
+                next = next_siblings[0]
+                if (isinstance(next, nodes.Text) and
+                    next.astext() in (' ', '\n')):
+                    if next_siblings[1].__class__ == node.__class__:
+                        followup_citation = True
+            if followup_citation:
+                self.out.append(',')
+            else:
+                self.out.append('}')
+                self.inside_citation_reference_label = False
+        else:
+            self.out.append(']}')
+
+    def visit_classifier(self, node):
+        self.out.append( '(\\textbf{' )
+
+    def depart_classifier(self, node):
+        self.out.append( '})\n' )
+
+    def visit_colspec(self, node):
+        self.active_table.visit_colspec(node)
+
+    def depart_colspec(self, node):
+        pass
+
+    def visit_comment(self, node):
+        # Precede every line with a comment sign, wrap in newlines
+        self.out.append('\n%% %s\n' % node.astext().replace('\n', '\n% '))
+        raise nodes.SkipNode
+
+    def depart_comment(self, node):
+        pass
+
+    def visit_compound(self, node):
+        pass
+
+    def depart_compound(self, node):
+        pass
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact')
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_container(self, node):
+        pass
+
+    def depart_container(self, node):
+        pass
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_decoration(self, node):
+        # header and footer
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        pass
+
+    def depart_definition(self, node):
+        self.out.append('\n')
+
+    def visit_definition_list(self, node):
+        self.out.append( '%\n\\begin{description}\n' )
+
+    def depart_definition_list(self, node):
+        self.out.append( '\\end{description}\n' )
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.out.append(' ')
+
+    def depart_description(self, node):
+        pass
+
+    def visit_docinfo(self, node):
+        self.push_output_collector(self.docinfo)
+
+    def depart_docinfo(self, node):
+        self.pop_output_collector()
+        # Some itmes (e.g. author) end up at other places
+        if self.docinfo:
+            # tabularx: automatic width of columns, no page breaks allowed.
+            self.requirements['tabularx'] = r'\usepackage{tabularx}'
+            self.fallbacks['_providelength'] = PreambleCmds.providelength
+            self.fallbacks['docinfo'] = PreambleCmds.docinfo
+            #
+            self.docinfo.insert(0, '\n% Docinfo\n'
+                                '\\begin{center}\n'
+                                '\\begin{tabularx}{\\DUdocinfowidth}{lX}\n')
+            self.docinfo.append('\\end{tabularx}\n'
+                                '\\end{center}\n')
+
+    def visit_docinfo_item(self, node, name):
+        if name == 'author':
+            self.pdfauthor.append(self.attval(node.astext()))
+        if self.use_latex_docinfo:
+            if name in ('author', 'organization', 'contact', 'address'):
+                # We attach these to the last author.  If any of them precedes
+                # the first author, put them in a separate "author" group
+                # (in lack of better semantics).
+                if name == 'author' or not self.author_stack:
+                    self.author_stack.append([])
+                if name == 'address':   # newlines are meaningful
+                    self.insert_newline = True
+                    text = self.encode(node.astext())
+                    self.insert_newline = False
+                else:
+                    text = self.attval(node.astext())
+                self.author_stack[-1].append(text)
+                raise nodes.SkipNode
+            elif name == 'date':
+                self.date.append(self.attval(node.astext()))
+                raise nodes.SkipNode
+        self.out.append('\\textbf{%s}: &\n\t' % self.language_label(name))
+        if name == 'address':
+            self.insert_newline = True
+            self.out.append('{\\raggedright\n')
+            self.context.append(' } \\\\\n')
+        else:
+            self.context.append(' \\\\\n')
+
+    def depart_docinfo_item(self, node):
+        self.out.append(self.context.pop())
+        # for address we did set insert_newline
+        self.insert_newline = False
+
+    def visit_doctest_block(self, node):
+        self.visit_literal_block(node)
+
+    def depart_doctest_block(self, node):
+        self.depart_literal_block(node)
+
+    def visit_document(self, node):
+        # titled document?
+        if (self.use_latex_docinfo or len(node) and
+            isinstance(node[0], nodes.title)):
+            self.title_labels += self.ids_to_labels(node, set_anchor=False)
+
+    def depart_document(self, node):
+        # Complete header with information gained from walkabout
+        # * language setup
+        if (self.babel.otherlanguages or
+            self.babel.language not in ('', 'english')):
+            self.requirements['babel'] = self.babel()
+        # * conditional requirements (before style sheet)
+        self.requirements = self.requirements.sortedvalues()
+        # * coditional fallback definitions (after style sheet)
+        self.fallbacks = self.fallbacks.sortedvalues()
+        # * PDF properties
+        self.pdfsetup.append(PreambleCmds.linking % self.hyperref_options)
+        if self.pdfauthor:
+            authors = self.author_separator.join(self.pdfauthor)
+            self.pdfinfo.append('  pdfauthor={%s}' % authors)
+        if self.pdfinfo:
+            self.pdfsetup += [r'\hypersetup{'] + self.pdfinfo + ['}']
+        # Complete body
+        # * document title (with "use_latex_docinfo" also
+        #   'author', 'organization', 'contact', 'address' and 'date')
+        if self.title or (
+           self.use_latex_docinfo and (self.author_stack or self.date)):
+            # with the default template, titledata is written to the preamble
+            self.titledata.append('%%% Title Data')
+            # \title (empty \title prevents error with \maketitle)
+            if self.title:
+                self.title.insert(0, '\phantomsection%\n  ')
+            title = [''.join(self.title)] + self.title_labels
+            if self.subtitle:
+                title += [r'\\ % subtitle',
+                          r'\DUdocumentsubtitle{%s}' % ''.join(self.subtitle)
+                         ] + self.subtitle_labels
+            self.titledata.append(r'\title{%s}' % '%\n  '.join(title))
+            # \author (empty \author prevents warning with \maketitle)
+            authors = ['\\\\\n'.join(author_entry)
+                        for author_entry in self.author_stack]
+            self.titledata.append(r'\author{%s}' %
+                                      ' \\and\n'.join(authors))
+            # \date (empty \date prevents defaulting to \today)
+            self.titledata.append(r'\date{%s}' % ', '.join(self.date))
+            # \maketitle in the body formats title with LaTeX
+            self.body_pre_docinfo.append('\\maketitle\n')
+
+        # * bibliography
+        #   TODO insertion point of bibliography should be configurable.
+        if self._use_latex_citations and len(self._bibitems)>0:
+            if not self.bibtex:
+                widest_label = ''
+                for bi in self._bibitems:
+                    if len(widest_label)<len(bi[0]):
+                        widest_label = bi[0]
+                self.out.append('\n\\begin{thebibliography}{%s}\n' %
+                                 widest_label)
+                for bi in self._bibitems:
+                    # cite_key: underscores must not be escaped
+                    cite_key = bi[0].replace(r'\_','_')
+                    self.out.append('\\bibitem[%s]{%s}{%s}\n' %
+                                     (bi[0], cite_key, bi[1]))
+                self.out.append('\\end{thebibliography}\n')
+            else:
+                self.out.append('\n\\bibliographystyle{%s}\n' %
+                                self.bibtex[0])
+                self.out.append('\\bibliography{%s}\n' % self.bibtex[1])
+        # * make sure to generate a toc file if needed for local contents:
+        if 'minitoc' in self.requirements and not self.has_latex_toc:
+            self.out.append('\n\\faketableofcontents % for local ToCs\n')
+
+    def visit_emphasis(self, node):
+        self.out.append('\\emph{')
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_emphasis(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+        self.out.append('}')
+
+    # Append column delimiters and advance column counter,
+    # if the current cell is a multi-row continuation."""
+    def insert_additional_table_colum_delimiters(self):
+        while self.active_table.get_rowspan(
+                                self.active_table.get_entry_number()):
+            self.out.append(' & ')
+            self.active_table.visit_entry() # increment cell count
+
+    def visit_entry(self, node):
+        # cell separation
+        if self.active_table.get_entry_number() == 0:
+            self.insert_additional_table_colum_delimiters()
+        else:
+            self.out.append(' & ')
+
+        # multirow, multicolumn
+        if 'morerows' in node and 'morecols' in node:
+            raise NotImplementedError('Cells that '
+            'span multiple rows *and* columns currently not supported, sorry.')
+            # TODO: should be possible with LaTeX, see e.g.
+            # http://texblog.org/2012/12/21/multi-column-and-multi-row-cells-in-latex-tables/
+        # multirow in LaTeX simply will enlarge the cell over several rows
+        # (the following n if n is positive, the former if negative).
+        if 'morerows' in node:
+            self.requirements['multirow'] = r'\usepackage{multirow}'
+            mrows = node['morerows'] + 1
+            self.active_table.set_rowspan(
+                            self.active_table.get_entry_number(), mrows)
+            self.out.append('\\multirow{%d}{%s}{' %
+                            (mrows, self.active_table.get_column_width()))
+            self.context.append('}')
+        elif 'morecols' in node:
+            # the vertical bar before column is missing if it is the first
+            # column. the one after always.
+            if self.active_table.get_entry_number() == 0:
+                bar1 = self.active_table.get_vertical_bar()
+            else:
+                bar1 = ''
+            mcols = node['morecols'] + 1
+            self.out.append('\\multicolumn{%d}{%s%s%s}{' %
+                    (mcols, bar1,
+                     self.active_table.get_multicolumn_width(
+                        self.active_table.get_entry_number(),
+                        mcols),
+                     self.active_table.get_vertical_bar()))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+        # bold header/stub-column
+        if len(node) and (isinstance(node.parent.parent, nodes.thead)
+                          or self.active_table.is_stub_column()):
+            self.out.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+        # if line ends with '{', mask line break to prevent spurious whitespace
+        if not self.active_table.colwidths_auto and self.out[-1].endswith("{"):
+                self.out.append("%")
+
+        self.active_table.visit_entry() # increment cell count
+
+    def depart_entry(self, node):
+        self.out.append(self.context.pop()) # header / not header
+        self.out.append(self.context.pop()) # multirow/column
+        # insert extra "&"s, if following rows are spanned from above:
+        self.insert_additional_table_colum_delimiters()
+
+    def visit_row(self, node):
+        self.active_table.visit_row()
+
+    def depart_row(self, node):
+        self.out.extend(self.active_table.depart_row())
+
+    def visit_enumerated_list(self, node):
+        # enumeration styles:
+        types = {'': '',
+                  'arabic':'arabic',
+                  'loweralpha':'alph',
+                  'upperalpha':'Alph',
+                  'lowerroman':'roman',
+                  'upperroman':'Roman'}
+        # the 4 default LaTeX enumeration labels: präfix, enumtype, suffix,
+        labels = [('',  'arabic', '.'), #  1.
+                  ('(', 'alph',   ')'), # (a)
+                  ('',  'roman',  '.'), #  i.
+                  ('',  'Alph',   '.')] #  A.
+
+        prefix = ''
+        if self.compound_enumerators:
+            if (self.section_prefix_for_enumerators and self.section_level
+                and not self._enumeration_counters):
+                prefix = '.'.join([str(n) for n in
+                                   self._section_number[:self.section_level]]
+                                 ) + self.section_enumerator_separator
+            if self._enumeration_counters:
+                prefix += self._enumeration_counters[-1]
+        # TODO: use LaTeX default for unspecified label-type?
+              # (needs change of parser)
+        prefix += node.get('prefix', '')
+        enumtype = types[node.get('enumtype' '')]
+        suffix = node.get('suffix', '')
+
+        enumeration_level = len(self._enumeration_counters)+1
+        counter_name = 'enum' + roman.toRoman(enumeration_level).lower()
+        label = r'%s\%s{%s}%s' % (prefix, enumtype, counter_name, suffix)
+        self._enumeration_counters.append(label)
+
+        if enumeration_level <= 4:
+            self.out.append('\\begin{enumerate}\n')
+            if (prefix, enumtype, suffix
+               ) != labels[enumeration_level-1]:
+                self.out.append('\\renewcommand{\\label%s}{%s}\n' %
+                                (counter_name, label))
+        else:
+            self.fallbacks[counter_name] = '\\newcounter{%s}' % counter_name
+            self.out.append('\\begin{list}')
+            self.out.append('{%s}' % label)
+            self.out.append('{\\usecounter{%s}}\n' % counter_name)
+        if 'start' in node:
+            self.out.append('\\setcounter{%s}{%d}\n' %
+                            (counter_name,node['start']-1))
+        #     ## set rightmargin equal to leftmargin
+        #     self.out.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
+
+
+
+    def depart_enumerated_list(self, node):
+        if len(self._enumeration_counters) <= 4:
+            self.out.append('\\end{enumerate}\n')
+        else:
+            self.out.append('\\end{list}\n')
+        self._enumeration_counters.pop()
+
+    def visit_field(self, node):
+        # real output is done in siblings: _argument, _body, _name
+        pass
+
+    def depart_field(self, node):
+        self.out.append('\n')
+        ##self.out.append('%[depart_field]\n')
+
+    def visit_field_argument(self, node):
+        self.out.append('%[visit_field_argument]\n')
+
+    def depart_field_argument(self, node):
+        self.out.append('%[depart_field_argument]\n')
+
+    def visit_field_body(self, node):
+        pass
+
+    def depart_field_body(self, node):
+        if self.out is self.docinfo:
+            self.out.append(r'\\')
+
+    def visit_field_list(self, node):
+        if self.out is not self.docinfo:
+            self.fallbacks['fieldlist'] = PreambleCmds.fieldlist
+            self.out.append('%\n\\begin{DUfieldlist}\n')
+
+    def depart_field_list(self, node):
+        if self.out is not self.docinfo:
+            self.out.append('\\end{DUfieldlist}\n')
+
+    def visit_field_name(self, node):
+        if self.out is self.docinfo:
+            self.out.append('\\textbf{')
+        else:
+            # Commands with optional args inside an optional arg must be put
+            # in a group, e.g. ``\item[{\hyperref[label]{text}}]``.
+            self.out.append('\\item[{')
+
+    def depart_field_name(self, node):
+        if self.out is self.docinfo:
+            self.out.append('}: &')
+        else:
+            self.out.append(':}]')
+
+    def visit_figure(self, node):
+        self.requirements['float_settings'] = PreambleCmds.float_settings
+        # The 'align' attribute sets the "outer alignment",
+        # for "inner alignment" use LaTeX default alignment (similar to HTML)
+        alignment = node.attributes.get('align', 'center')
+        if alignment != 'center':
+            # The LaTeX "figure" environment always uses the full linewidth,
+            # so "outer alignment" is ignored. Just write a comment.
+            # TODO: use the wrapfigure environment?
+            self.out.append('\n\\begin{figure} %% align = "%s"\n' % alignment)
+        else:
+            self.out.append('\n\\begin{figure}\n')
+        if node.get('ids'):
+            self.out += self.ids_to_labels(node) + ['\n']
+
+    def depart_figure(self, node):
+        self.out.append('\\end{figure}\n')
+
+    def visit_footer(self, node):
+        self.push_output_collector([])
+        self.out.append(r'\newcommand{\DUfooter}{')
+
+    def depart_footer(self, node):
+        self.out.append('}')
+        self.requirements['~footer'] = ''.join(self.out)
+        self.pop_output_collector()
+
+    def visit_footnote(self, node):
+        try:
+            backref = node['backrefs'][0]
+        except IndexError:
+            backref = node['ids'][0] # no backref, use self-ref instead
+        if self.docutils_footnotes:
+            self.fallbacks['footnotes'] = PreambleCmds.footnotes
+            num = node[0].astext()
+            if self.settings.footnote_references == 'brackets':
+                num = '[%s]' % num
+            self.out.append('%%\n\\DUfootnotetext{%s}{%s}{%s}{' %
+                            (node['ids'][0], backref, self.encode(num)))
+            if node['ids'] == node['names']:
+                self.out += self.ids_to_labels(node)
+            # mask newline to prevent spurious whitespace if paragraph follows:
+            if node[1:] and isinstance(node[1], nodes.paragraph):
+                self.out.append('%')
+        ## else:  # TODO: "real" LaTeX \footnote{}s
+
+    def depart_footnote(self, node):
+        self.out.append('}\n')
+
+    def visit_footnote_reference(self, node):
+        href = ''
+        if 'refid' in node:
+            href = node['refid']
+        elif 'refname' in node:
+            href = self.document.nameids[node['refname']]
+        # if not self.docutils_footnotes:
+            # TODO: insert footnote content at (or near) this place
+            # print "footnote-ref to", node['refid']
+            # footnotes = (self.document.footnotes +
+            #              self.document.autofootnotes +
+            #              self.document.symbol_footnotes)
+            # for footnote in footnotes:
+            #     # print footnote['ids']
+            #     if node.get('refid', '') in footnote['ids']:
+            #         print 'matches', footnote['ids']
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            self.append_hypertargets(node)
+            self.out.append('\\hyperlink{%s}{[' % href)
+            self.context.append(']}')
+        else:
+            self.fallbacks['footnotes'] = PreambleCmds.footnotes
+            self.out.append(r'\DUfootnotemark{%s}{%s}{' %
+                            (node['ids'][0], href))
+            self.context.append('}')
+
+    def depart_footnote_reference(self, node):
+        self.out.append(self.context.pop())
+
+    # footnote/citation label
+    def label_delim(self, node, bracket, superscript):
+        if isinstance(node.parent, nodes.footnote):
+            raise nodes.SkipNode
+        else:
+            assert isinstance(node.parent, nodes.citation)
+            if not self._use_latex_citations:
+                self.out.append(bracket)
+
+    def visit_label(self, node):
+        """footnote or citation label: in brackets or as superscript"""
+        self.label_delim(node, '[', '\\textsuperscript{')
+
+    def depart_label(self, node):
+        self.label_delim(node, ']', '}')
+
+    # elements generated by the framework e.g. section numbers.
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.push_output_collector([])
+        self.out.append(r'\newcommand{\DUheader}{')
+
+    def depart_header(self, node):
+        self.out.append('}')
+        self.requirements['~header'] = ''.join(self.out)
+        self.pop_output_collector()
+
+    def to_latex_length(self, length_str, pxunit=None):
+        """Convert `length_str` with rst lenght to LaTeX length
+        """
+        if pxunit is not None:
+            sys.stderr.write('deprecation warning: LaTeXTranslator.to_latex_length()'
+                             ' option `pxunit` will be removed.')
+        match = re.match('(\d*\.?\d*)\s*(\S*)', length_str)
+        if not match:
+            return length_str
+        value, unit = match.groups()[:2]
+        # no unit or "DTP" points (called 'bp' in TeX):
+        if unit in ('', 'pt'):
+            length_str = '%sbp' % value
+        # percentage: relate to current line width
+        elif unit == '%':
+            length_str = '%.3f\\linewidth' % (float(value)/100.0)
+        elif self.is_xetex and unit == 'px':
+            # XeTeX does not know the length unit px.
+            # Use \pdfpxdimen, the macro to set the value of 1 px in pdftex.
+            # This way, configuring works the same for pdftex and xetex.
+            self.fallbacks['_providelength'] = PreambleCmds.providelength
+            self.fallbacks['px'] = '\n\\DUprovidelength{\\pdfpxdimen}{1bp}\n'
+            length_str = r'%s\pdfpxdimen' % value
+        return length_str
+
+    def visit_image(self, node):
+        self.requirements['graphicx'] = self.graphicx_package
+        attrs = node.attributes
+        # Convert image URI to a local file path
+        imagepath = urllib.url2pathname(attrs['uri']).replace('\\', '/')
+        # alignment defaults:
+        if not 'align' in attrs:
+            # Set default align of image in a figure to 'center'
+            if isinstance(node.parent, nodes.figure):
+                attrs['align'] = 'center'
+            # query 'align-*' class argument
+            for cls in node['classes']:
+                if cls.startswith('align-'):
+                    attrs['align'] = cls.split('-')[1]
+        # pre- and postfix (prefix inserted in reverse order)
+        pre = []
+        post = []
+        include_graphics_options = []
+        align_codes = {
+            # inline images: by default latex aligns the bottom.
+            'bottom': ('', ''),
+            'middle': (r'\raisebox{-0.5\height}{', '}'),
+            'top':    (r'\raisebox{-\height}{', '}'),
+            # block level images:
+            'center': (r'\noindent\makebox[\linewidth][c]{', '}'),
+            'left':   (r'\noindent{', r'\hfill}'),
+            'right':  (r'\noindent{\hfill', '}'),}
+        if 'align' in attrs:
+            # TODO: warn or ignore non-applicable alignment settings?
+            try:
+                align_code = align_codes[attrs['align']]
+                pre.append(align_code[0])
+                post.append(align_code[1])
+            except KeyError:
+                pass                    # TODO: warn?
+        if 'height' in attrs:
+            include_graphics_options.append('height=%s' %
+                            self.to_latex_length(attrs['height']))
+        if 'scale' in attrs:
+            include_graphics_options.append('scale=%f' %
+                                            (attrs['scale'] / 100.0))
+        if 'width' in attrs:
+            include_graphics_options.append('width=%s' %
+                            self.to_latex_length(attrs['width']))
+        if not (self.is_inline(node) or
+                isinstance(node.parent, nodes.figure)):
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        self.out.extend(pre)
+        options = ''
+        if include_graphics_options:
+            options = '[%s]' % (','.join(include_graphics_options))
+        self.out.append('\\includegraphics%s{%s}' % (options, imagepath))
+        self.out.extend(post)
+
+    def depart_image(self, node):
+        if node.get('ids'):
+            self.out += self.ids_to_labels(node) + ['\n']
+
+    def visit_inline(self, node): # <span>, i.e. custom roles
+        self.context.append('}' * len(node['classes']))
+        for cls in node['classes']:
+            if cls == 'align-center':
+                self.fallbacks['align-center'] = PreambleCmds.align_center
+            if cls.startswith('language-'):
+                language = self.babel.language_name(cls[9:])
+                if language:
+                    self.babel.otherlanguages[language] = True
+                    self.out.append(r'\foreignlanguage{%s}{' % language)
+            else:
+                self.fallbacks['inline'] = PreambleCmds.inline
+                self.out.append(r'\DUrole{%s}{' % cls)
+
+    def depart_inline(self, node):
+        self.out.append(self.context.pop())
+
+    def visit_interpreted(self, node):
+        # @@@ Incomplete, pending a proper implementation on the
+        # Parser/Reader end.
+        self.visit_literal(node)
+
+    def depart_interpreted(self, node):
+        self.depart_literal(node)
+
+    def visit_legend(self, node):
+        self.fallbacks['legend'] = PreambleCmds.legend
+        self.out.append('\\begin{DUlegend}')
+
+    def depart_legend(self, node):
+        self.out.append('\\end{DUlegend}\n')
+
+    def visit_line(self, node):
+        self.out.append('\item[] ')
+
+    def depart_line(self, node):
+        self.out.append('\n')
+
+    def visit_line_block(self, node):
+        self.fallbacks['_providelength'] = PreambleCmds.providelength
+        self.fallbacks['lineblock'] = PreambleCmds.lineblock
+        if isinstance(node.parent, nodes.line_block):
+            self.out.append('\\item[]\n'
+                             '\\begin{DUlineblock}{\\DUlineblockindent}\n')
+        else:
+            self.out.append('\n\\begin{DUlineblock}{0em}\n')
+        if node['classes']:
+            self.visit_inline(node)
+            self.out.append('\n')
+
+    def depart_line_block(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+            self.out.append('\n')
+        self.out.append('\\end{DUlineblock}\n')
+
+    def visit_list_item(self, node):
+        self.out.append('\n\\item ')
+
+    def depart_list_item(self, node):
+        pass
+
+    def visit_literal(self, node):
+        self.literal = True
+        if 'code' in node['classes'] and (
+                    self.settings.syntax_highlight != 'none'):
+            self.requirements['color'] = PreambleCmds.color
+            self.fallbacks['code'] = PreambleCmds.highlight_rules
+        self.out.append('\\texttt{')
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_literal(self, node):
+        self.literal = False
+        if node['classes']:
+            self.depart_inline(node)
+        self.out.append('}')
+
+    # Literal blocks are used for '::'-prefixed literal-indented
+    # blocks of text, where the inline markup is not recognized,
+    # but are also the product of the "parsed-literal" directive,
+    # where the markup is respected.
+    #
+    # In both cases, we want to use a typewriter/monospaced typeface.
+    # For "real" literal-blocks, we can use \verbatim, while for all
+    # the others we must use \mbox or \alltt.
+    #
+    # We can distinguish between the two kinds by the number of
+    # siblings that compose this node: if it is composed by a
+    # single element, it's either
+    # * a real one,
+    # * a parsed-literal that does not contain any markup, or
+    # * a parsed-literal containing just one markup construct.
+    def is_plaintext(self, node):
+        """Check whether a node can be typeset verbatim"""
+        return (len(node) == 1) and isinstance(node[0], nodes.Text)
+
+    def visit_literal_block(self, node):
+        """Render a literal block."""
+        # environments and packages to typeset literal blocks
+        packages = {'alltt': r'\usepackage{alltt}',
+                    'listing': r'\usepackage{moreverb}',
+                    'lstlisting': r'\usepackage{listings}',
+                    'Verbatim': r'\usepackage{fancyvrb}',
+                    # 'verbatim': '',
+                    'verbatimtab': r'\usepackage{moreverb}'}
+
+        if node.get('ids'):
+            self.out += ['\n'] + self.ids_to_labels(node)
+
+        if not self.active_table.is_open():
+            # no quote inside tables, to avoid vertical space between
+            # table border and literal block.
+            # TODO: fails if normal text precedes the literal block.
+            # check parent node instead?
+            self.out.append('%\n\\begin{quote}\n')
+            self.context.append('\n\\end{quote}\n')
+        else:
+            self.out.append('\n')
+            self.context.append('\n')
+
+        if self.is_plaintext(node):
+            environment = self.literal_block_env
+            self.requirements['literal_block'] = packages.get(environment, '')
+            if environment == 'alltt':
+                self.alltt = True
+            else:
+                self.verbatim = True
+            self.out.append('\\begin{%s}%s\n' %
+                            (environment, self.literal_block_options))
+            self.context.append('\n\\end{%s}' % environment)
+        else:
+            self.literal = True
+            self.insert_newline = True
+            self.insert_non_breaking_blanks = True
+            if 'code' in node['classes'] and (
+                    self.settings.syntax_highlight != 'none'):
+                self.requirements['color'] = PreambleCmds.color
+                self.fallbacks['code'] = PreambleCmds.highlight_rules
+            self.out.append('{\\ttfamily \\raggedright \\noindent\n')
+            self.context.append('\n}')
+
+    def depart_literal_block(self, node):
+        self.insert_non_breaking_blanks = False
+        self.insert_newline = False
+        self.literal = False
+        self.verbatim = False
+        self.alltt = False
+        self.out.append(self.context.pop())
+        self.out.append(self.context.pop())
+
+    ## def visit_meta(self, node):
+    ##     self.out.append('[visit_meta]\n')
+        # TODO: set keywords for pdf?
+        # But:
+        #  The reStructuredText "meta" directive creates a "pending" node,
+        #  which contains knowledge that the embedded "meta" node can only
+        #  be handled by HTML-compatible writers. The "pending" node is
+        #  resolved by the docutils.transforms.components.Filter transform,
+        #  which checks that the calling writer supports HTML; if it doesn't,
+        #  the "pending" node (and enclosed "meta" node) is removed from the
+        #  document.
+        #  --- docutils/docs/peps/pep-0258.html#transformer
+
+    ## def depart_meta(self, node):
+    ##     self.out.append('[depart_meta]\n')
+
+    def visit_math(self, node, math_env='$'):
+        """math role"""
+        if node['classes']:
+            self.visit_inline(node)
+        self.requirements['amsmath'] = r'\usepackage{amsmath}'
+        math_code = node.astext().translate(unichar2tex.uni2tex_table)
+        if node.get('ids'):
+            math_code = '\n'.join([math_code] + self.ids_to_labels(node))
+        if math_env == '$':
+            if self.alltt:
+                wrapper = u'\(%s\)'
+            else:
+                wrapper = u'$%s$'
+        else:
+            wrapper = u'\n'.join(['%%',
+                                 r'\begin{%s}' % math_env,
+                                 '%s',
+                                 r'\end{%s}' % math_env])
+        # print repr(wrapper), repr(math_code)
+        self.out.append(wrapper % math_code)
+        if node['classes']:
+            self.depart_inline(node)
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def depart_math(self, node):
+        pass # never reached
+
+    def visit_math_block(self, node):
+        math_env = pick_math_environment(node.astext())
+        self.visit_math(node, math_env=math_env)
+
+    def depart_math_block(self, node):
+        pass # never reached
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.out.append(', ')
+
+    def depart_option(self, node):
+        # flag that the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """Append the delimiter betweeen an option and its argument to body."""
+        self.out.append(node.get('delimiter', ' '))
+
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        self.out.append('\n\\item[')
+        # flag for first option
+        self.context.append(0)
+
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        self.out.append('] ')
+
+    def visit_option_list(self, node):
+        self.fallbacks['_providelength'] = PreambleCmds.providelength
+        self.fallbacks['optionlist'] = PreambleCmds.optionlist
+        self.out.append('%\n\\begin{DUoptionlist}\n')
+
+    def depart_option_list(self, node):
+        self.out.append('\n\\end{DUoptionlist}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        ##self.out.append(self.starttag(node, 'span', '', CLASS='option'))
+        pass
+
+    def depart_option_string(self, node):
+        ##self.out.append('</span>')
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_paragraph(self, node):
+        # insert blank line, unless
+        # * the paragraph is first in a list item,
+        # * follows a non-paragraph node in a compound,
+        # * is in a table with auto-width columns
+        index = node.parent.index(node)
+        if (index == 0 and (isinstance(node.parent, nodes.list_item) or
+                            isinstance(node.parent, nodes.description))):
+            pass
+        elif (index > 0 and isinstance(node.parent, nodes.compound) and
+              not isinstance(node.parent[index - 1], nodes.paragraph) and
+              not isinstance(node.parent[index - 1], nodes.compound)):
+            pass
+        elif self.active_table.colwidths_auto:
+            if index == 1: # second paragraph
+                self.warn('LaTeX merges paragraphs in tables '
+                          'with auto-sized columns!', base_node=node)
+            if index > 0:
+                self.out.append('\n')
+        else:
+            self.out.append('\n')
+        if node.get('ids'):
+            self.out += self.ids_to_labels(node) + ['\n']
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_paragraph(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+        if not self.active_table.colwidths_auto:
+            self.out.append('\n')
+
+    def visit_problematic(self, node):
+        self.requirements['color'] = PreambleCmds.color
+        self.out.append('%\n')
+        self.append_hypertargets(node)
+        self.out.append(r'\hyperlink{%s}{\textbf{\color{red}' % node['refid'])
+
+    def depart_problematic(self, node):
+        self.out.append('}}')
+
+    def visit_raw(self, node):
+        if not 'latex' in node.get('format', '').split():
+            raise nodes.SkipNode
+        if not self.is_inline(node):
+            self.out.append('\n')
+        if node['classes']:
+            self.visit_inline(node)
+        # append "as-is" skipping any LaTeX-encoding
+        self.verbatim = True
+
+    def depart_raw(self, node):
+        self.verbatim = False
+        if node['classes']:
+            self.depart_inline(node)
+        if not self.is_inline(node):
+            self.out.append('\n')
+
+    def has_unbalanced_braces(self, string):
+        """Test whether there are unmatched '{' or '}' characters."""
+        level = 0
+        for ch in string:
+            if ch == '{':
+                level += 1
+            if ch == '}':
+                level -= 1
+            if level < 0:
+                return True
+        return level != 0
+
+    def visit_reference(self, node):
+        # We need to escape #, \, and % if we use the URL in a command.
+        special_chars = {ord('#'): ur'\#',
+                         ord('%'): ur'\%',
+                         ord('\\'): ur'\\',
+                        }
+        # external reference (URL)
+        if 'refuri' in node:
+            href = unicode(node['refuri']).translate(special_chars)
+            # problematic chars double caret and unbalanced braces:
+            if href.find('^^') != -1 or self.has_unbalanced_braces(href):
+                self.error(
+                    'External link "%s" not supported by LaTeX.\n'
+                    ' (Must not contain "^^" or unbalanced braces.)' % href)
+            if node['refuri'] == node.astext():
+                self.out.append(r'\url{%s}' % href)
+                raise nodes.SkipNode
+            self.out.append(r'\href{%s}{' % href)
+            return
+        # internal reference
+        if 'refid' in node:
+            href = node['refid']
+        elif 'refname' in node:
+            href = self.document.nameids[node['refname']]
+        else:
+            raise AssertionError('Unknown reference.')
+        if not self.is_inline(node):
+            self.out.append('\n')
+        self.out.append('\\hyperref[%s]{' % href)
+        if self._reference_label:
+            self.out.append('\\%s{%s}}' %
+                            (self._reference_label, href.replace('#', '')))
+            raise nodes.SkipNode
+
+    def depart_reference(self, node):
+        self.out.append('}')
+        if not self.is_inline(node):
+            self.out.append('\n')
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision')
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_section(self, node):
+        self.section_level += 1
+        # Initialize counter for potential subsections:
+        self._section_number.append(0)
+        # Counter for this section's level (initialized by parent section):
+        self._section_number[self.section_level - 1] += 1
+
+    def depart_section(self, node):
+        # Remove counter for potential subsections:
+        self._section_number.pop()
+        self.section_level -= 1
+
+    def visit_sidebar(self, node):
+        self.requirements['color'] = PreambleCmds.color
+        self.fallbacks['sidebar'] = PreambleCmds.sidebar
+        self.out.append('\n\\DUsidebar{\n')
+
+    def depart_sidebar(self, node):
+        self.out.append('}\n')
+
+    attribution_formats = {'dash': (u'—', ''), # EM DASH
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.out.append('\\nopagebreak\n\n\\raggedleft ')
+        self.out.append(prefix)
+        self.context.append(suffix)
+
+    def depart_attribution(self, node):
+        self.out.append(self.context.pop() + '\n')
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status')
+
+    def depart_status(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_strong(self, node):
+        self.out.append('\\textbf{')
+        if node['classes']:
+            self.visit_inline(node)
+
+    def depart_strong(self, node):
+        if node['classes']:
+            self.depart_inline(node)
+        self.out.append('}')
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.document):
+            self.push_output_collector(self.subtitle)
+            self.fallbacks['documentsubtitle'] = PreambleCmds.documentsubtitle
+            self.subtitle_labels += self.ids_to_labels(node, set_anchor=False)
+        # section subtitle: "starred" (no number, not in ToC)
+        elif isinstance(node.parent, nodes.section):
+            self.out.append(r'\%s*{' %
+                             self.d_class.section(self.section_level + 1))
+        else:
+            self.fallbacks['subtitle'] = PreambleCmds.subtitle
+            self.out.append('\n\\DUsubtitle[%s]{' % node.parent.tagname)
+
+    def depart_subtitle(self, node):
+        if isinstance(node.parent, nodes.document):
+            self.pop_output_collector()
+        else:
+            self.out.append('}\n')
+
+    def visit_system_message(self, node):
+        self.requirements['color'] = PreambleCmds.color
+        self.fallbacks['title'] = PreambleCmds.title
+        node['classes'] = ['system-message']
+        self.visit_admonition(node)
+        self.out.append('\\DUtitle[system-message]{system-message}\n')
+        self.append_hypertargets(node)
+        try:
+            line = ', line~%s' % node['line']
+        except KeyError:
+            line = ''
+        self.out.append('\n\n{\color{red}%s/%s} in \\texttt{%s}%s\n' %
+                         (node['type'], node['level'],
+                          self.encode(node['source']), line))
+        if len(node['backrefs']) == 1:
+            self.out.append('\n\\hyperlink{%s}{' % node['backrefs'][0])
+            self.context.append('}')
+        else:
+            backrefs = ['\\hyperlink{%s}{%d}' % (href, i+1)
+                        for (i, href) in enumerate(node['backrefs'])]
+            self.context.append('backrefs: ' + ' '.join(backrefs))
+
+    def depart_system_message(self, node):
+        self.out.append(self.context.pop())
+        self.depart_admonition()
+
+    def visit_table(self, node):
+        self.requirements['table'] = PreambleCmds.table
+        if self.active_table.is_open():
+            self.table_stack.append(self.active_table)
+            # nesting longtable does not work (e.g. 2007-04-18)
+            self.active_table = Table(self,'tabular')
+        # A longtable moves before \paragraph and \subparagraph
+        # section titles if it immediately follows them:
+        if (self.active_table._latex_type == 'longtable' and
+            isinstance(node.parent, nodes.section) and
+            node.parent.index(node) == 1 and
+            self.d_class.section(self.section_level).find('paragraph') != -1):
+            self.out.append('\\leavevmode')
+        self.active_table.open()
+        self.active_table.set_table_style(self.settings.table_style,
+                                          node['classes'])
+        if 'align' in node:
+            self.active_table.set('align', node['align'])
+        if self.active_table.borders == 'booktabs':
+            self.requirements['booktabs'] = r'\usepackage{booktabs}'
+        self.push_output_collector([])
+
+    def depart_table(self, node):
+        # wrap content in the right environment:
+        content = self.out
+        self.pop_output_collector()
+        self.out.append('\n' + self.active_table.get_opening())
+        self.out += content
+        self.out.append(self.active_table.get_closing() + '\n')
+        self.active_table.close()
+        if len(self.table_stack)>0:
+            self.active_table = self.table_stack.pop()
+        # Insert hyperlabel after (long)table, as
+        # other places (beginning, caption) result in LaTeX errors.
+        if node.get('ids'):
+            self.out += self.ids_to_labels(node, set_anchor=False) + ['\n']
+
+    def visit_target(self, node):
+        # Skip indirect targets:
+        if ('refuri' in node       # external hyperlink
+            or 'refid' in node     # resolved internal link
+            or 'refname' in node): # unresolved internal link
+            ## self.out.append('%% %s\n' % node)   # for debugging
+            return
+        self.out.append('%\n')
+        # do we need an anchor (\phantomsection)?
+        set_anchor = not(isinstance(node.parent, nodes.caption) or
+                         isinstance(node.parent, nodes.title))
+        # TODO: where else can/must we omit the \phantomsection?
+        self.out += self.ids_to_labels(node, set_anchor)
+
+    def depart_target(self, node):
+        pass
+
+    def visit_tbody(self, node):
+        # BUG write preamble if not yet done (colspecs not [])
+        # for tables without heads.
+        if not self.active_table.get('preamble written'):
+            self.visit_thead(node)
+            self.depart_thead(None)
+
+    def depart_tbody(self, node):
+        pass
+
+    def visit_term(self, node):
+        """definition list term"""
+        # Commands with optional args inside an optional arg must be put
+        # in a group, e.g. ``\item[{\hyperref[label]{text}}]``.
+        self.out.append('\\item[{')
+
+    def depart_term(self, node):
+        # \leavevmode results in a line break if the
+        # term is followed by an item list.
+        self.out.append('}] \leavevmode ')
+
+    def visit_tgroup(self, node):
+        #self.out.append(self.starttag(node, 'colgroup'))
+        #self.context.append('</colgroup>\n')
+        pass
+
+    def depart_tgroup(self, node):
+        pass
+
+    _thead_depth = 0
+    def thead_depth (self):
+        return self._thead_depth
+
+    def visit_thead(self, node):
+        self._thead_depth += 1
+        if 1 == self.thead_depth():
+            self.out.append('{%s}\n' % self.active_table.get_colspecs(node))
+            self.active_table.set('preamble written',1)
+        self.out.append(self.active_table.get_caption())
+        self.out.extend(self.active_table.visit_thead())
+
+    def depart_thead(self, node):
+        if node is not None:
+            self.out.extend(self.active_table.depart_thead())
+            if self.active_table.need_recurse():
+                node.walkabout(self)
+        self._thead_depth -= 1
+
+    def visit_title(self, node):
+        """Append section and other titles."""
+        # Document title
+        if node.parent.tagname == 'document':
+            self.push_output_collector(self.title)
+            self.context.append('')
+            self.pdfinfo.append('  pdftitle={%s},' %
+                                self.encode(node.astext()))
+        # Topic titles (topic, admonition, sidebar)
+        elif (isinstance(node.parent, nodes.topic) or
+              isinstance(node.parent, nodes.admonition) or
+              isinstance(node.parent, nodes.sidebar)):
+            self.fallbacks['title'] = PreambleCmds.title
+            classes = ','.join(node.parent['classes'])
+            if not classes:
+                classes = node.tagname
+            self.out.append('\\DUtitle[%s]{' % classes)
+            self.context.append('}\n')
+        # Table caption
+        elif isinstance(node.parent, nodes.table):
+            self.push_output_collector(self.active_table.caption)
+            self.context.append('')
+        # Section title
+        else:
+            if hasattr(PreambleCmds, 'secnumdepth'):
+                self.requirements['secnumdepth'] = PreambleCmds.secnumdepth
+            section_name = self.d_class.section(self.section_level)
+            self.out.append('\n\n')
+            # System messages heading in red:
+            if ('system-messages' in node.parent['classes']):
+                self.requirements['color'] = PreambleCmds.color
+                section_title = self.encode(node.astext())
+                self.out.append(r'\%s[%s]{\color{red}' % (
+                                section_name,section_title))
+            else:
+                self.out.append(r'\%s{' % section_name)
+            if self.section_level > len(self.d_class.sections):
+                # section level not supported by LaTeX
+                self.fallbacks['title'] = PreambleCmds.title
+                # self.out.append('\\phantomsection%\n  ')
+            # label and ToC entry:
+            bookmark = ['']
+            # add sections with unsupported level to toc and pdfbookmarks?
+            ## if self.section_level > len(self.d_class.sections):
+            ##     section_title = self.encode(node.astext())
+            ##     bookmark.append(r'\addcontentsline{toc}{%s}{%s}' %
+            ##               (section_name, section_title))
+            bookmark += self.ids_to_labels(node.parent, set_anchor=False)
+            self.context.append('%\n  '.join(bookmark) + '%\n}\n')
+
+            # MAYBE postfix paragraph and subparagraph with \leavemode to
+            # ensure floats stay in the section and text starts on a new line.
+
+    def depart_title(self, node):
+        self.out.append(self.context.pop())
+        if (isinstance(node.parent, nodes.table) or
+            node.parent.tagname == 'document'):
+            self.pop_output_collector()
+
+    def minitoc(self, node, title, depth):
+        """Generate a local table of contents with LaTeX package minitoc"""
+        section_name = self.d_class.section(self.section_level)
+        # name-prefix for current section level
+        minitoc_names = {'part': 'part', 'chapter': 'mini'}
+        if 'chapter' not in self.d_class.sections:
+            minitoc_names['section'] = 'sect'
+        try:
+            minitoc_name = minitoc_names[section_name]
+        except KeyError: # minitoc only supports part- and toplevel
+            self.warn('Skipping local ToC at %s level.\n' % section_name +
+                      '  Feature not supported with option "use-latex-toc"',
+                      base_node=node)
+            return
+        # Requirements/Setup
+        self.requirements['minitoc'] = PreambleCmds.minitoc
+        self.requirements['minitoc-'+minitoc_name] = (r'\do%stoc' %
+                                                      minitoc_name)
+        # depth: (Docutils defaults to unlimited depth)
+        maxdepth = len(self.d_class.sections)
+        self.requirements['minitoc-%s-depth' % minitoc_name] = (
+            r'\mtcsetdepth{%stoc}{%d}' % (minitoc_name, maxdepth))
+        # Process 'depth' argument (!Docutils stores a relative depth while
+        # minitoc  expects an absolute depth!):
+        offset = {'sect': 1, 'mini': 0, 'part': 0}
+        if 'chapter' in self.d_class.sections:
+            offset['part'] = -1
+        if depth:
+            self.out.append('\\setcounter{%stocdepth}{%d}' %
+                             (minitoc_name, depth + offset[minitoc_name]))
+        # title:
+        self.out.append('\\mtcsettitle{%stoc}{%s}\n' % (minitoc_name, title))
+        # the toc-generating command:
+        self.out.append('\\%stoc\n' % minitoc_name)
+
+    def visit_topic(self, node):
+        # Topic nodes can be generic topic, abstract, dedication, or ToC.
+        # table of contents:
+        if 'contents' in node['classes']:
+            self.out.append('\n')
+            self.out += self.ids_to_labels(node)
+            # add contents to PDF bookmarks sidebar
+            if isinstance(node.next_node(), nodes.title):
+                self.out.append('\n\\pdfbookmark[%d]{%s}{%s}\n' %
+                                (self.section_level+1,
+                                 node.next_node().astext(),
+                                 node.get('ids', ['contents'])[0]
+                                ))
+            if self.use_latex_toc:
+                title = ''
+                if isinstance(node.next_node(), nodes.title):
+                    title = self.encode(node.pop(0).astext())
+                depth = node.get('depth', 0)
+                if 'local' in node['classes']:
+                    self.minitoc(node, title, depth)
+                    self.context.append('')
+                    return
+                if depth:
+                    self.out.append('\\setcounter{tocdepth}{%d}\n' % depth)
+                if title != 'Contents':
+                    self.out.append('\\renewcommand{\\contentsname}{%s}\n' %
+                                    title)
+                self.out.append('\\tableofcontents\n\n')
+                self.has_latex_toc = True
+            else: # Docutils generated contents list
+                # set flag for visit_bullet_list() and visit_title()
+                self.is_toc_list = True
+            self.context.append('')
+        elif ('abstract' in node['classes'] and
+              self.settings.use_latex_abstract):
+            self.push_output_collector(self.abstract)
+            self.out.append('\\begin{abstract}')
+            self.context.append('\\end{abstract}\n')
+            if isinstance(node.next_node(), nodes.title):
+                node.pop(0) # LaTeX provides its own title
+        else:
+            self.fallbacks['topic'] = PreambleCmds.topic
+            # special topics:
+            if 'abstract' in node['classes']:
+                self.fallbacks['abstract'] = PreambleCmds.abstract
+                self.push_output_collector(self.abstract)
+            if 'dedication' in node['classes']:
+                self.fallbacks['dedication'] = PreambleCmds.dedication
+                self.push_output_collector(self.dedication)
+            self.out.append('\n\\DUtopic[%s]{\n' % ','.join(node['classes']))
+            self.context.append('}\n')
+
+    def depart_topic(self, node):
+        self.out.append(self.context.pop())
+        self.is_toc_list = False
+        if ('abstract' in node['classes'] or
+            'dedication' in node['classes']):
+            self.pop_output_collector()
+
+    def visit_rubric(self, node):
+        self.fallbacks['rubric'] = PreambleCmds.rubric
+        self.out.append('\n\\DUrubric{')
+        self.context.append('}\n')
+
+    def depart_rubric(self, node):
+        self.out.append(self.context.pop())
+
+    def visit_transition(self, node):
+        self.fallbacks['transition'] = PreambleCmds.transition
+        self.out.append('\n\n')
+        self.out.append('%' + '_' * 75 + '\n')
+        self.out.append(r'\DUtransition')
+        self.out.append('\n\n')
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version')
+
+    def depart_version(self, node):
+        self.depart_docinfo_item(node)
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s' %
+                                  node.__class__.__name__)
+
+#    def unknown_visit(self, node):
+#    def default_visit(self, node):
+
+# vim: set ts=4 et ai :
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/docutils-05-compat.sty
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/docutils-05-compat.sty	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/docutils-05-compat.sty	(revision 1126)
@@ -0,0 +1,738 @@
+% ==================================================================
+%     Changes to the Docutils latex2e writer since version 0.5
+% ==================================================================
+% 
+% A backwards compatibility style sheet
+% *************************************
+% 
+% :Author:    Guenter Milde
+% :Contact:   milde@users.sourceforge.net
+% :Revision:  $Revision: 6156 $
+% :Date:      $Date: 2009-02-24 $
+% :Copyright: © 2009 Günter Milde,
+% :License: Released under the terms of the `2-Clause BSD license`_, in short:
+% 
+%    Copying and distribution of this file, with or without modification,
+%    are permitted in any medium without royalty provided the copyright
+%    notice and this notice are preserved.
+%    This file is offered as-is, without any warranty.
+% 
+% :Abstract:  This file documents changes and provides a style for best
+%             possible compatibility to the behaviour of the `latex2e`
+%             writer of Doctutils release 0.5.
+% 
+% .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+% 
+% ::
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{docutils-05-compat}
+[2009/03/26 v0.1 compatibility with rst2latex from Docutils 0.5]
+
+% .. contents::
+%    :depth: 3
+% 
+% Usage
+% =====
+% 
+% * To get an (almost) identic look for your old documents,
+%   place ``docutils-05-compat.sty`` in the TEXINPUT path (e.g.
+%   the current work directory) and pass the
+%   ``--stylesheet=docutils-05-compat`` option to ``rst2latex.py``.
+% 
+% * To use your custom stylesheets without change, add them to the
+%   compatibility style, e.g.
+%   ``--stylesheet="docutils-05-compat,mystyle.tex``.
+% 
+% .. tip:: As the changes include bug fixes that are partly reverted by this
+%    style, it is recommended to adapt the stylesheets to the new version or
+%    copy just the relevant parts of this style into them.
+% 
+% Changes since 0.5
+% =================
+% 
+% Bugfixes
+% --------
+% 
+% * Newlines around comments, targets and references prevent run-together
+%   paragraphs.
+% 
+%   + An image directive with hyperlink reference or target did not start a
+%     new paragraph (e.g. the first two image examples in
+%     standalone_rst_latex.tex).
+% 
+%   + Paragraphs were not separated if there was a (hyper) target definition
+%     inbetween.
+% 
+%   + Paragraphs did run together, if separated by a comment-paragraph in the
+%     rst source.
+% 
+% * Fixed missing and spurious internal links/targets.
+%   Internal links now take you to the correct place.
+% 
+% * Verbose and linked system messages.
+% 
+% * `Figure and image alignment`_ now conforms to the rst definition.
+% 
+% * Put `header and footer directive`__ content in \DUheader respective
+%   \DUfooter macros (ignored by the default style/template).
+% 
+%   (They were put inside hard-coded markup at the top/bottom of the document
+%   without an option to get them on every page.)
+% 
+% __ ../ref/rst/directives.html#document-header-footer
+% 
+% * Render doctest blocks as literal blocks (fixes bug [1586058] doctest block
+%   nested in admonition). I.e.
+% 
+%   + indent doctest blocks by nesting in a quote environment. This is also
+%     the rendering by the HTML writer (html4css2.css).
+%   + apply the ``--literal-block-env`` setting also to doctest blocks.
+% 
+%   .. warning::
+%       (``--literal-block-env=verbatim`` and
+%       ``--literal-block-env=lstlistings`` fail with literal or doctest
+%       blocks nested in an admonition.
+% 
+% * Two-way hyperlinked footnotes and support for symbol footnotes and
+%   ``--footnote-references=brackets`` with ``--use-latex-footnotes``.
+% 
+% * The packages `fixltx2e` (providing LaTeX patches and the \textsubscript
+%   command) and `cmap` (including character maps in the generated PDF for
+%   better search and copy-and-paste operations) are now always loaded
+%   (configurable with custom templates_).
+% 
+% Backwards compatibility:
+%   "Bug for bug compatibility" is not provided.
+% 
+% 
+% New configuration setting defaults
+% ----------------------------------
+% 
+% - font-encoding: "T1" (formerly implicitely set by 'ae').
+% - use-latex-toc: true (ToC with page numbers).
+% - use-latex-footnotes: true (no mixup with figures).
+% 
+% Backwards compatibility:
+%   Reset to the former defaults with:
+% 
+%   | font-encoding: ''
+%   | use-latex-toc: False
+%   | use-latex-footnotes: False
+% 
+%   (in the config file) or the command line options:
+% 
+%     ``--figure-footnotes --use-docutils-toc  --font-encoding=''``
+% 
+% 
+% Cleaner LaTeX source
+% --------------------
+% 
+% New features:
+%   * Remove redundant "double protection" from the encoding of the "special
+%     printing characters" and square brackets, e.g. ``\%`` instead of
+%     ``{\%}``.
+%   * Remove some spurious whitespace, e.g. ``\item [what:] -> \item[what:]``.
+%   * Use conventional style for "named" macros, e.g. ``\dots{}`` instead of
+%     ``{\dots}``
+% 
+% Backwards compatibility:
+%   Changes do not affect the output.
+% 
+% 
+% LaTeX style sheets
+% ------------------
+% 
+% New Feature:
+%   LaTeX packages can be used as ``--stylesheet`` argument without
+%   restriction.
+% 
+% Implementation:
+%   Use ``\usepackage`` if style sheet ends with ``.sty`` or has no
+%   extension and ``\input`` else.
+% 
+% Rationale:
+%   while ``\input`` works with extension as well as without extension,
+%   ``\usepackage`` expects the package name without extension. (The latex2e
+%   writer will strip a ``.sty`` extension.)
+% 
+% 
+% Backwards compatibility:
+%   Up to Docutils 0.5, if no filename extension is given in the
+%   ``stylesheet`` argument, ``.tex`` is assumed (by latex).
+% 
+%   Since Docutils 0.6, a stylesheet without filename extension is assumed to
+%   be a LaTeX package (``*.sty``) and referenced with the ``\usepackage``
+%   command.
+% 
+% .. important::
+%   Always specify the extension if you want the style sheet to be
+%   ``\input`` by LaTeX.
+% 
+% 
+% Templates
+% ---------
+% 
+% New Feature:
+%   Advanced configuration via custom templates.
+% 
+% Implementation:
+%   A ``--template`` option and config setting allows specification of a
+%   template file.
+% 
+% See the `LaTeX writer documentation`__ for details.
+% 
+% __ latex.html#templates
+% 
+% 
+% Custom roles
+% ------------
+% 
+% New Feature: failsave implementation
+%   As with classes to HTML objects, class arguments are silently ignored if
+%   there is no styling rule for this class in a custom style sheet.
+% 
+% New Feature: custom roles based on standard roles
+%   As class support needs to be handled by the LaTeX writer, this feature was
+%   not present "automatically" (as in HTML). Modified visit/depart_*()
+%   methods for the standard roles now call visit/depart_inline() if there are
+%   class arguments to the node.
+% 
+% Backwards compatibility:
+%   The implementation is fully backwards compatible. (SVN versions 5742 to
+%   5861 contained an implementation that did not work with commands expecting
+%   an argument.)
+% 
+% Length units
+% ------------
+% 
+% New Features:
+%   1. Add default unit if none given.
+%      A poll on docutils-users favoured ``bp`` (Big Point: 1 bp  = 1/72 in).
+% 
+%   2. Do not change ``px`` to ``pt``.
+% 
+%   3. Lengths specified in the document with unit "pt" will be written with
+%      unit "bp" to the LaTeX source.
+% 
+% Rationale:
+%   1. prevent LaTeX error "missing unit".
+% 
+%   2. ``px`` is a valid unit in pdftex since version 1.3.0 released on
+%      2005-02-04:
+% 
+%        1px defaults to 1bp (or 72dpi), but can be changed with the
+%        ``\pdfpxdimen`` primitive.::
+
+        \pdfpxdimen=1in % 1 dpi
+        \divide\pdfpxdimen by 96 % 96 dpi
+
+%        --  http://www.tug.org/applications/pdftex/NEWS
+% 
+%      Modern TeX distributions use pdftex also for dvi generation (i.e.
+%      ``latex`` actually calls ``pdftex`` with some options).
+% 
+%   3. In Docutils (as well as CSS) the unit symbol "pt" denotes the
+%      `Postscript point` or `DTP point` while LaTeX uses "pt" for the `LaTeX
+%      point`, which is unknown to Docutils and 0.3 % smaller.
+% 
+%      The `DTP point` is available in LaTeX as "bp" (big point):
+% 
+%        1 pt = 1/72.25 in < 1 bp  = 1/72 in
+% 
+% 
+% Backwards compatibility:
+%   Images with width specification in ``px`` come out slightly (0.3 %) larger:
+% 
+%     1 px = 1 bp  = 1/72 in > 1 pt = 1/72.25 in
+% 
+%   This can be reset with ::
+
+  \pdfpxdimen=1pt
+
+% .. caution:: It is impossible to revert the change of lengths specified with
+%    "pt" or without unit in a style sheet, however the 0.3 % change will be
+%    imperceptible in most cases.
+% 
+% .. admonition:: Error ``illegal unit px``
+% 
+%   The unit ``px`` is not defined in "pure" LaTeX, but introduced by the
+%   `pdfTeX` converter on 2005-02-04. `pdfTeX` is used in all modern LaTeX
+%   distributions (since ca. 2006) also for conversion into DVI.
+% 
+%   If you convert the LaTeX source with a legacy program, you might get the
+%   error ``illegal unit px``.
+% 
+%   If updating LaTeX is not an option, just remove the ``px`` from the length
+%   specification. HTML/CSS will default to ``px`` while the `latexe2` writer
+%   will add the fallback unit ``bp``.
+% 
+% 
+% Font encoding
+% -------------
+% 
+% New feature:
+%   Do not mix font-encoding and font settings: do not load the obsolete
+%   `ae` and `aeguill` packages unless explicitely required via the
+%   ``--stylesheet`` option.
+% 
+%   :font-encoding = "":  do not load `ae` and `aeguill`, i.e.
+% 
+%                         * do not change font settings,
+%                         * do not use the fontenc package
+%                           (implicitely loaded via `ae`),
+%                         * use LaTeX default font encoding (OT1)
+% 
+%   :font-encoding = "OT1": load `fontenc` with ``\usepackage[OT1]{fontenc}``
+% 
+% Example:
+%   ``--font-encoding=LGR,T1`` becomes ``\usepackage[LGR,T1]{fontenc}``
+%   (Latin, Latin-1 Supplement, and Greek)
+% 
+% 
+% Backwards compatibility:
+%   Load the ae and aeguill packages if fontenc is not used.
+% 
+% .. tip:: Using `ae` is not recommended. A similar look (but better
+%    implementation) can be achieved with the packages `lmodern`, `cmsuper`,
+%    or `cmlgr` all providing Computer Modern look-alikes in vector format and
+%    T1 encoding, e.g. ``--font-encoding=T1 --stylesheet=lmodern``.
+% 
+% Sub- and superscript as text
+% ----------------------------
+% 
+% New feature:
+%   Set sub- and superscript role argument in text mode not as math.
+% 
+%   Pass the role content to ``\textsubscript`` or ``\textsuperscript``.
+% 
+% Backwards compatibility:
+%   The old implementation set the role content in Math mode, where
+% 
+%   * whitespace is ignored,
+%   * a different command set and font setting scheme is active,
+%   * Latin letters are typeset italic but numbers upright.
+% 
+%   Although it is possible to redefine ``\textsubscript`` and
+%   ``\textsuperscript`` to typeset the content in math-mode, this can lead to
+%   errors with certain input and is therefore not done in this style sheet.
+% 
+% .. tip:: To get italic subscripts, define and use in your document
+%    `custom roles`_ like ``.. role:: sub(subscript)`` and
+%    ``.. role:: super(superscript)`` and define the "role commands"::
+
+   \newcommand{\DUrolesub}{\itshape}
+   \newcommand{\DUrolesuper}{\itshape}
+
+%    Alternatively, if you want all sub- and superscripts in italic, redefine
+%    the macros::
+
+   %% \let\DUsup\textsubscript
+   %% \let\DUsuper\textsuperscript
+   %% \renewcommand*{\textsubscript}{\DUsub\itshape}
+   %% \renewcommand*{\textsuperscript}{\DUsuper\itshape}
+
+%    This is not fully backwards compatible, as it will also set numbers in
+%    italic shape and not ignore whitespace.
+% 
+% Page layout
+% -----------
+% 
+% New features:
+%   * Margins are configurable via the ``DIV=...`` document option.
+% 
+%   * The ``\raggedbottom`` setting is no longer inserted into the document. It
+%     is the default for article and report classes. If requested in combination
+%     with a book class, it can be given in a custom style sheet.
+% 
+% Backwards compatibility:
+%   Up to version 0.5, use of `typearea` and a DIV setting of 12 were
+%   hard-coded into the latex2e writer ::
+
+  \usepackage{typearea}
+  \typearea{12}
+
+%   and the vertical alignment of lower boundary of the text area in book
+%   classes disabled via ::
+
+  \raggedbottom
+
+
+% ToC and section numbers
+% -----------------------
+% 
+% Better conformance to Docutils specifications.
+% 
+% New feature:
+%   * The "depth" argument of the "contents" and "sectnum" directives is
+%     respected.
+% 
+%   * section numbering independent of 'use-latex-toc':
+% 
+%     + sections are only numbered if there is a "sectnum" directive in the
+%       document
+% 
+%     + section numbering by LaTeX if the "sectnum_xforms" config setting is
+%       False.
+% 
+% Backwards compatibility:
+% 
+%   The previous behaviour was to always number sections if 'use-latex-toc' is
+%   true, using the document class defaults. It cannot be restored
+%   universally, the following code sets the default values of the "article"
+%   document class::
+
+  \setcounter{secnumdepth}{3}
+  \setcounter{tocdepth}{3}
+
+% .. TODO or not to do? (Back-compatibility problems)
+%   * The default "depth" of the LaTeX-created ToC and the LaTeX section
+%     numbering is increased to the number of supported section levels.
+% 
+% New feature:
+%   If 'use-latex-toc' is set, local tables of content are typeset using the
+%   'minitoc' package (instead of being ignored).
+% 
+% Backwards compatibility:
+%   Disable the creation of local ToCs (ignoring all special commands) by
+%   replacing ``\usepackage{minitoc} with ``\usepackage{mtcoff}``.
+% 
+% 
+% Default font in admonitions and sidebar
+% ---------------------------------------
+% 
+% New feature:
+%   Use default font in admonitions and sidebar.
+% 
+% Backward compatibility:
+%   See the fallback definitions for admonitions_, `topic title`_ and
+%   `sidebar`_.
+% 
+% 
+% Figure placement
+% ----------------
+% 
+% New feature:
+%   Use ``\floatplacement`` from the `float` package instead of
+%   "hard-coded" optional argument for the global setting.
+% 
+%   Default to ``\floatplacement{figure}{H}`` (here definitely). This
+%   corresponds most closely to the source and HTML placement (principle of
+%   least surprise).
+% 
+% Backwards compatibility:
+%   Set the global default back to the previous used value::
+
+  \usepackage{float}
+  \floatplacement{figure}{htbp} % here, top, bottom, extra-page
+
+
+% Figure and image alignment
+% --------------------------
+% 
+% New features:
+% 
+% a) Fix behaviour of 'align' argument to a figure (do not align figure
+%    contents).
+% 
+%    As the 'figwidth' argument is still ignored and the "natural width" of a
+%    figure in LaTeX is 100% \textwidth, setting the 'align' argument of a
+%    figure has currently no effect on the LaTeX output.
+% 
+% b) Set default align of image in a figure to 'center'.
+% 
+% c) Also center images that are wider than textwidth.
+% 
+% d) Align images with class "align-[right|center|left]" (allows setting the
+%    alignment of an image in a figure).
+% 
+% Backwards compatibility:
+%    There is no "automatic" way to reverse these changes via a style sheet.
+% 
+% a) The alignment of the image can be set with the "align-left",
+%    "align-center" and "align-right" class arguments.
+% 
+%    As previously, the caption of a figure is aligned according to the
+%    document class -- configurable with a style sheet using the "caption"
+%    package.
+% 
+% b) See a)
+% 
+% c) Set the alignment of "oversized" images to "left" to get back the
+%    old placement.
+% 
+% Shorter preamble
+% ----------------
+% 
+% New feature:
+%   The document preamble is pruned to contain only relevant commands and
+%   settings.
+% 
+% Packages that are no longer required
+% ````````````````````````````````````
+% 
+% The following packages where required in pre-0.5 versions and still loaded
+% with version 0.5::
+
+\usepackage{shortvrb}
+\usepackage{amsmath}
+
+
+% Packages that are conditionally loaded
+% ``````````````````````````````````````
+% 
+% Additional to the `typearea` for `page layout`_, the following packages are
+% only loaded if actually required by doctree elements:
+% 
+% Tables
+% ^^^^^^
+% 
+% Standard package for tables across several pages::
+
+\usepackage{longtable}
+
+% Extra space between text in tables and the line above them
+% ('array' is implicitely loaded by 'tabularx', see below)::
+
+\usepackage{array}
+\setlength{\extrarowheight}{2pt}
+
+% Table cells spanning multiple rows::
+
+\usepackage{multirow}
+
+% Docinfo
+% ^^^^^^^
+% 
+% One-page tables with auto-width columns::
+
+\usepackage{tabularx}
+
+% Images
+% ^^^^^^
+% Include graphic files::
+
+\usepackage{graphicx}
+
+% Problematic, Sidebar
+% ^^^^^^^^^^^^^^^^^^^^
+% Set text and/or background colour, coloured boxes with ``\colorbox``::
+
+\usepackage{color}
+
+% Floats for footnotes settings
+% `````````````````````````````
+% 
+% Settings for the use of floats for footnotes are only included if
+% 
+% * the option "use-latex-footnotes" is False, and
+% * there is at least one footnote in the document.
+% 
+% ::
+
+% begin: floats for footnotes tweaking.
+\setlength{\floatsep}{0.5em}
+\setlength{\textfloatsep}{\fill}
+\addtolength{\textfloatsep}{3em}
+\renewcommand{\textfraction}{0.5}
+\renewcommand{\topfraction}{0.5}
+\renewcommand{\bottomfraction}{0.5}
+\setcounter{totalnumber}{50}
+\setcounter{topnumber}{50}
+\setcounter{bottomnumber}{50}
+% end floats for footnotes
+
+
+% Special lengths, commands, and environments
+% -------------------------------------------
+% 
+% Removed definitions
+% ```````````````````
+% 
+% admonition width
+% ^^^^^^^^^^^^^^^^
+% The ``admonitionwith`` lenght is replaced by the more powerful
+% ``\DUadmonition`` command (see admonitions_).
+% 
+% Backwards compatibility:
+%   The default value (90 % of the textwidth) is unchanged.
+% 
+%   To configure the admonition width, you must redefine the ``DUadmonition``
+%   command instead of changing the ``admonitionwith`` length value.
+% 
+% 
+% Renamed definitions (now conditional)
+% `````````````````````````````````````
+% 
+% The names for special doctree elements are now prefixed with ``DU``.
+% 
+% Up to version 0.5, all definitions were included in the preamble (before the
+% style sheet) of every document -- even if not used in the body. Since
+% version 0.6, fallback definitions are included after the style sheet and
+% only if required.
+% 
+% Customization is done by an alternative definition in a style sheet with
+% ``\newcommand`` instead of the former ``\renewcommand``.
+% 
+% The following code provides the old definitions and maps them (or their
+% custom variants) to the new interface.
+% 
+% docinfo width
+% ^^^^^^^^^^^^^
+% ::
+
+\newlength{\docinfowidth}
+\setlength{\docinfowidth}{0.9\textwidth}
+
+\newlength{\DUdocinfowidth}
+\AtBeginDocument{\setlength{\DUdocinfowidth}{\docinfowidth}}
+
+% line block
+% ^^^^^^^^^^
+% ::
+
+\newlength{\lineblockindentation}
+\setlength{\lineblockindentation}{2.5em}
+\newenvironment{lineblock}[1]
+{\begin{list}{}
+  {\setlength{\partopsep}{\parskip}
+   \addtolength{\partopsep}{\baselineskip}
+   \topsep0pt\itemsep0.15\baselineskip\parsep0pt
+   \leftmargin#1}
+ \raggedright}
+{\end{list}}
+
+\newlength{\DUlineblockindent}
+\AtBeginDocument{\setlength{\DUlineblockindent}{\lineblockindentation}}
+\newenvironment{DUlineblock}[1]
+  {\begin{lineblock}{#1}}
+  {\end{lineblock}}
+
+% local line width
+% ^^^^^^^^^^^^^^^^
+% 
+% The ``\locallinewidth`` length for internal use in tables is replaced
+% by ``\DUtablewidth``. It was never intended for customization::
+
+\newlength{\locallinewidth}
+
+% option lists
+% ^^^^^^^^^^^^
+% ::
+
+\newcommand{\optionlistlabel}[1]{\bf #1 \hfill}
+\newenvironment{optionlist}[1]
+{\begin{list}{}
+  {\setlength{\labelwidth}{#1}
+   \setlength{\rightmargin}{1cm}
+   \setlength{\leftmargin}{\rightmargin}
+   \addtolength{\leftmargin}{\labelwidth}
+   \addtolength{\leftmargin}{\labelsep}
+   \renewcommand{\makelabel}{\optionlistlabel}}
+}{\end{list}}
+
+\newcommand{\DUoptionlistlabel}{\optionlistlabel}
+\newenvironment{DUoptionlist}
+  {\begin{optionlist}{3cm}}
+  {\end{optionlist}}
+
+% rubric
+% ^^^^^^
+% Now less prominent (not bold, normal size) restore with::
+
+\newcommand{\rubric}[1]{\subsection*{~\hfill {\it #1} \hfill ~}}
+\newcommand{\DUrubric}[2][class-arg]{\rubric{#2}}
+
+% title reference role
+% ^^^^^^^^^^^^^^^^^^^^
+% ::
+
+\newcommand{\titlereference}[1]{\textsl{#1}}
+\newcommand{\DUroletitlereference}[1]{\titlereference{#1}}
+
+
+% New definitions
+% ```````````````
+% 
+% New Feature:
+%   Enable customization of some more Docutils elements with special commands
+% 
+%   :admonition: ``DUadmonition`` command (replacing ``\admonitionwidth``),
+%   :field list: ``DUfieldlist``  environment,
+%   :legend:     ``DUlegend``     environment,
+%   :sidebar:    ``\DUsidebar``, ``\DUtitle``, and
+%                ``DUsubtitle`` commands,
+%   :topic:      ``\DUtopic`` and ``\DUtitle`` commands,
+%   :transition: ``\DUtransition`` command.
+%   :footnotes:  ``\DUfootnotemark`` and ``\DUfootnotetext`` commands with
+%                hyperlink support using the Docutils-provided footnote label.
+% 
+% Backwards compatibility:
+%   In most cases, the default definition corresponds to the previously used
+%   construct. The following definitions restore the old behaviour in case of
+%   changes.
+% 
+% admonitions
+% ^^^^^^^^^^^
+% Use sans-serif fonts::
+
+\newcommand{\DUadmonition}[2][class-arg]{%
+  \begin{center}
+    \fbox{\parbox{0.9\textwidth}{\sffamily #2}}
+  \end{center}
+}
+
+% dedication
+% ^^^^^^^^^^
+% Do not center::
+
+\newcommand{\DUtopicdedication}[1]{#1}
+
+% But center the title::
+
+\newcommand*{\DUtitlededication}[1]{\centerline{\textbf{#1}}}
+
+% sidebar
+% ^^^^^^^
+% Use sans-serif fonts, a frame, and a darker shade of grey::
+
+\providecommand{\DUsidebar}[2][class-arg]{%
+  \begin{center}
+    \sffamily
+    \fbox{\colorbox[gray]{0.80}{\parbox{0.9\textwidth}{#2}}}
+  \end{center}
+}
+
+% sidebar sub-title
+% ^^^^^^^^^^^^^^^^^
+% Bold instead of emphasized::
+
+\providecommand*{\DUsubtitlesidebar}[1]{\hspace*{\fill}\\
+  \textbf{#1}\smallskip}
+
+% topic
+% ^^^^^
+% No quote but normal text::
+
+\newcommand{\DUtopic}[2][class-arg]{%
+  \ifcsname DUtopic#1\endcsname%
+    \csname DUtopic#1\endcsname{#2}%
+  \else
+    #2
+  \fi
+}
+
+% topic title
+% ^^^^^^^^^^^
+% Title for "topics" (admonitions, sidebar).
+% 
+% Larger font size::
+
+\providecommand*{\DUtitletopic}[1]{\textbf{\large #1}\smallskip}
+
+% transition
+% ^^^^^^^^^^
+% Do not add vertical space after the transition. ::
+
+\providecommand*{\DUtransition}[1][class-arg]{%
+  \hspace*{\fill}\hrulefill\hspace*{\fill}}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/xelatex.tex
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/xelatex.tex	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/latex2e/xelatex.tex	(revision 1126)
@@ -0,0 +1,17 @@
+$head_prefix% generated by Docutils <http://docutils.sourceforge.net/>
+% rubber: set program xelatex
+\usepackage{fixltx2e}
+\usepackage{fontspec}
+% \defaultfontfeatures{Scale=MatchLowercase}
+$requirements
+%%% Custom LaTeX preamble
+$latex_preamble
+%%% User specified packages and stylesheets
+$stylesheet
+%%% Fallback definitions for Docutils-specific commands
+$fallbacks$pdfsetup
+$titledata
+%%% Body
+\begin{document}
+$body_pre_docinfo$docinfo$dedication$abstract$body
+\end{document}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/__init__.py	(revision 1126)
@@ -0,0 +1,145 @@
+# $Id: __init__.py 7969 2016-08-18 21:40:00Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Writer modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os.path
+import sys
+
+import docutils
+from docutils import languages, Component
+from docutils.transforms import universal
+if sys.version_info < (2,5):
+    from docutils._compat import __import__
+
+
+class Writer(Component):
+
+    """
+    Abstract base class for docutils Writers.
+
+    Each writer module or package must export a subclass also called 'Writer'.
+    Each writer must support all standard node types listed in
+    `docutils.nodes.node_class_names`.
+
+    The `write()` method is the main entry point.
+    """
+
+    component_type = 'writer'
+    config_section = 'writers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Messages,
+            universal.FilterMessages,
+            universal.StripClassesAndElements,]
+
+    document = None
+    """The document to write (Docutils doctree); set by `write`."""
+
+    output = None
+    """Final translated form of `document` (Unicode string for text, binary
+    string for other forms); set by `translate`."""
+
+    language = None
+    """Language module for the document; set by `write`."""
+
+    destination = None
+    """`docutils.io` Output object; where to write the document.
+    Set by `write`."""
+
+    def __init__(self):
+
+        # Used by HTML and LaTeX writer for output fragments:
+        self.parts = {}
+        """Mapping of document part names to fragments of `self.output`.
+        Values are Unicode strings; encoding is up to the client.  The 'whole'
+        key should contain the entire document output.
+        """
+
+    def write(self, document, destination):
+        """
+        Process a document into its final form.
+
+        Translate `document` (a Docutils document tree) into the Writer's
+        native format, and write it out to its `destination` (a
+        `docutils.io.Output` subclass object).
+
+        Normally not overridden or extended in subclasses.
+        """
+        self.document = document
+        self.language = languages.get_language(
+            document.settings.language_code,
+            document.reporter)
+        self.destination = destination
+        self.translate()
+        output = self.destination.write(self.output)
+        return output
+
+    def translate(self):
+        """
+        Do final translation of `self.document` into `self.output`.  Called
+        from `write`.  Override in subclasses.
+
+        Usually done with a `docutils.nodes.NodeVisitor` subclass, in
+        combination with a call to `docutils.nodes.Node.walk()` or
+        `docutils.nodes.Node.walkabout()`.  The ``NodeVisitor`` subclass must
+        support all standard elements (listed in
+        `docutils.nodes.node_class_names`) and possibly non-standard elements
+        used by the current Reader as well.
+        """
+        raise NotImplementedError('subclass must override this method')
+
+    def assemble_parts(self):
+        """Assemble the `self.parts` dictionary.  Extend in subclasses."""
+        self.parts['whole'] = self.output
+        self.parts['encoding'] = self.document.settings.output_encoding
+        self.parts['version'] = docutils.__version__
+
+
+class UnfilteredWriter(Writer):
+
+    """
+    A writer that passes the document tree on unchanged (e.g. a
+    serializer.)
+
+    Documents written by UnfilteredWriters are typically reused at a
+    later date using a subclass of `readers.ReReader`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  When the document is reused
+        # later, the then-used writer will add the appropriate
+        # transforms.
+        return Component.get_transforms(self)
+
+
+_writer_aliases = {
+      'html': 'html4css1',  # may change to html5 some day
+      'html4': 'html4css1',
+      'html5': 'html5_polyglot',
+      'latex': 'latex2e',
+      'pprint': 'pseudoxml',
+      'pformat': 'pseudoxml',
+      'pdf': 'rlpdf',
+      's5': 's5_html',
+      'xelatex': 'xetex',
+      'xhtml': 'html5_polyglot',
+      'xhtml10': 'html4css1',
+      'xml': 'docutils_xml'}
+
+def get_writer_class(writer_name):
+    """Return the Writer class from the `writer_name` module."""
+    writer_name = writer_name.lower()
+    if writer_name in _writer_aliases:
+        writer_name = _writer_aliases[writer_name]
+    try:
+        module = __import__(writer_name, globals(), locals(), level=1)
+    except ImportError:
+        module = __import__(writer_name, globals(), locals(), level=0)
+    return module.Writer
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pseudoxml.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pseudoxml.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pseudoxml.py	(revision 1126)
@@ -0,0 +1,31 @@
+# $Id: pseudoxml.py 7320 2012-01-19 22:33:02Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes indented pseudo-XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('pprint', 'pformat', 'pseudoxml')
+    """Formats this writer supports."""
+
+    config_section = 'pseudoxml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def translate(self):
+        self.output = self.document.pformat()
+
+    def supports(self, format):
+        """This writer supports all format-specific elements."""
+        return True
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/__init__.py	(revision 1126)
@@ -0,0 +1,104 @@
+# $Id: __init__.py 7630 2013-03-15 22:27:04Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+PEP HTML Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import codecs
+import docutils
+from docutils import frontend, nodes, utils, writers
+from docutils.writers import html4css1
+
+
+class Writer(html4css1.Writer):
+
+    default_stylesheet = 'pep.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'PEP/HTML-Specific Options',
+        'For the PEP/HTML writer, the default value for the --stylesheet-path '
+        'option is "%s", and the default value for --template is "%s". '
+        'See HTML-Specific Options above.'
+        % (default_stylesheet_path, default_template_path),
+        (('Python\'s home URL.  Default is "http://www.python.org".',
+          ['--python-home'],
+          {'default': 'http://www.python.org', 'metavar': '<URL>'}),
+         ('Home URL prefix for PEPs.  Default is "." (current directory).',
+          ['--pep-home'],
+          {'default': '.', 'metavar': '<URL>'}),
+         # For testing.
+         (frontend.SUPPRESS_HELP,
+          ['--no-random'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_default_overrides = {'stylesheet_path': default_stylesheet_path,
+                                  'template': default_template_path,}
+
+    relative_path_settings = ('template',)
+
+    config_section = 'pep_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def interpolation_dict(self):
+        subs = html4css1.Writer.interpolation_dict(self)
+        settings = self.document.settings
+        pyhome = settings.python_home
+        subs['pyhome'] = pyhome
+        subs['pephome'] = settings.pep_home
+        if pyhome == '..':
+            subs['pepindex'] = '.'
+        else:
+            subs['pepindex'] = pyhome + '/dev/peps'
+        index = self.document.first_child_matching_class(nodes.field_list)
+        header = self.document[index]
+        self.pepnum = header[0][1].astext()
+        subs['pep'] = self.pepnum
+        if settings.no_random:
+            subs['banner'] = 0
+        else:
+            import random
+            subs['banner'] = random.randrange(64)
+        try:
+            subs['pepnum'] = '%04i' % int(self.pepnum)
+        except ValueError:
+            subs['pepnum'] = self.pepnum
+        self.title = header[1][1].astext()
+        subs['title'] = self.title
+        subs['body'] = ''.join(
+            self.body_pre_docinfo + self.docinfo + self.body)
+        return subs
+
+    def assemble_parts(self):
+        html4css1.Writer.assemble_parts(self)
+        self.parts['title'] = [self.title]
+        self.parts['pepnum'] = self.pepnum
+
+
+class HTMLTranslator(html4css1.HTMLTranslator):
+
+    def depart_field_list(self, node):
+        html4css1.HTMLTranslator.depart_field_list(self, node)
+        if 'rfc2822' in node['classes']:
+             self.body.append('<hr />\n')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/template.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/template.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/template.txt	(revision 1126)
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="%(encoding)s" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+This HTML is auto-generated.  DO NOT EDIT THIS FILE!  If you are writing a new
+PEP, see http://www.python.org/dev/peps/pep-0001 for instructions and links
+to templates.  DO NOT USE THIS HTML FILE AS YOUR TEMPLATE!
+-->
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=%(encoding)s" />
+  <meta name="generator" content="Docutils %(version)s: http://docutils.sourceforge.net/" />
+  <title>PEP %(pep)s -- %(title)s</title>
+  %(stylesheet)s
+</head>
+<body bgcolor="white">
+<table class="navigation" cellpadding="0" cellspacing="0"
+       width="100%%" border="0">
+<tr><td class="navicon" width="150" height="35">
+<a href="%(pyhome)s/" title="Python Home Page">
+<img src="%(pyhome)s/pics/PyBanner%(banner)03d.gif" alt="[Python]"
+ border="0" width="150" height="35" /></a></td>
+<td class="textlinks" align="left">
+[<b><a href="%(pyhome)s/">Python Home</a></b>]
+[<b><a href="%(pepindex)s/">PEP Index</a></b>]
+[<b><a href="%(pephome)s/pep-%(pepnum)s.txt">PEP Source</a></b>]
+</td></tr></table>
+<div class="document">
+%(body)s
+%(body_suffix)s
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/pep.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/pep.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/pep_html/pep.css	(revision 1126)
@@ -0,0 +1,344 @@
+/*
+:Author: David Goodger
+:Contact: goodger@python.org
+:date: $Date: 2006-05-21 20:44:42 +0000 (Sun, 21 May 2006) $
+:version: $Revision: 4564 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the PEP HTML output of Docutils.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.navigation {
+  width: 100% ;
+  background: #99ccff ;
+  margin-top: 0px ;
+  margin-bottom: 0px }
+
+.navigation .navicon {
+  width: 150px ;
+  height: 35px }
+
+.navigation .textlinks {
+  padding-left: 1em ;
+  text-align: left }
+
+.navigation td, .navigation th {
+  padding-left: 0em ;
+  padding-right: 0em ;
+  vertical-align: middle }
+
+.rfc2822 {
+  margin-top: 0.5em ;
+  margin-left: 0.5em ;
+  margin-right: 0.5em ;
+  margin-bottom: 0em }
+
+.rfc2822 td {
+  text-align: left }
+
+.rfc2822 th.field-name {
+  text-align: right ;
+  font-family: sans-serif ;
+  padding-right: 0.5em ;
+  font-weight: bold ;
+  margin-bottom: 0em }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+body {
+  margin: 0px ;
+  margin-bottom: 1em ;
+  padding: 0px }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+div.section {
+  margin-left: 1em ;
+  margin-right: 1em ;
+  margin-bottom: 1.5em }
+
+div.section div.section {
+  margin-left: 0em ;
+  margin-right: 0em ;
+  margin-top: 1.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.footer {
+  margin-left: 1em ;
+  margin-right: 1em }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1 {
+  font-family: sans-serif ;
+  font-size: large }
+
+h2 {
+  font-family: sans-serif ;
+  font-size: medium }
+
+h3 {
+  font-family: sans-serif ;
+  font-size: small }
+
+h4 {
+  font-family: sans-serif ;
+  font-style: italic ;
+  font-size: small }
+
+h5 {
+  font-family: sans-serif;
+  font-size: x-small }
+
+h6 {
+  font-family: sans-serif;
+  font-style: italic ;
+  font-size: x-small }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+td.num {
+  text-align: right }
+
+th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/framing.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/framing.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/framing.css	(revision 1126)
@@ -0,0 +1,25 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/slides.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/slides.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/slides.css	(revision 1126)
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/blank.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/blank.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/opera.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/opera.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/opera.css	(revision 1126)
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+	visibility: visible !important;
+	position: static !important;
+	page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/pretty.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/pretty.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/pretty.css	(revision 1126)
@@ -0,0 +1,120 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+/* Replace the background style above with the style below (and again for
+   div#header) for a graphic: */
+/* background: white url(bodybg.gif) -16px 0 no-repeat; */
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
+/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {position: absolute; top: 0.45em; z-index: 1;
+  margin: 0; padding-left: 0.7em; white-space: nowrap;
+  font: bold 150% sans-serif; color: #DDE; background: #005;}
+.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  background: #005; border: none; color: #779; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 1.5em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {visibility: visible;
+  color: white; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/slides.js
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/slides.js	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/slides.js	(revision 1126)
@@ -0,0 +1,558 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+	if (!object.className) return false;
+	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+	if (!object) return false;
+	return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+	if (!object) return;
+	object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+	if (!object || hasClass(object, className)) return;
+	if (object.className) {
+		object.className += ' '+className;
+	} else {
+		object.className = className;
+	}
+}
+
+function GetElementsWithClassName(elementName,className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (var i = 0; i< allElements.length; i++) {
+		if (hasClass(allElements[i], className)) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+	if (element == null || element.nodeName=='BODY') return false;
+	else if (element.id == id) return true;
+	else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+	var result = "";
+	if (node.nodeType == 1) {
+		var children = node.childNodes;
+		for (var i = 0; i < children.length; ++i) {
+			result += nodeValue(children[i]);
+		}		
+	}
+	else if (node.nodeType == 3) {
+		result = node.nodeValue;
+	}
+	return(result);
+}
+
+function slideLabel() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var list = document.getElementById('jumplist');
+	smax = slideColl.length;
+	for (var n = 0; n < smax; n++) {
+		var obj = slideColl[n];
+
+		var did = 'slide' + n.toString();
+		if (obj.getAttribute('id')) {
+			slideIDs[n] = obj.getAttribute('id');
+		}
+		else {
+			obj.setAttribute('id',did);
+			slideIDs[n] = did;
+		}
+		if (isOp) continue;
+
+		var otext = '';
+		var menu = obj.firstChild;
+		if (!menu) continue; // to cope with empty slides
+		while (menu && menu.nodeType == 3) {
+			menu = menu.nextSibling;
+		}
+	 	if (!menu) continue; // to cope with slides with only text nodes
+
+		var menunodes = menu.childNodes;
+		for (var o = 0; o < menunodes.length; o++) {
+			otext += nodeValue(menunodes[o]);
+		}
+		list.options[list.length] = new Option(n + ' : '  + otext, n);
+	}
+}
+
+function currentSlide() {
+	var cs;
+	var footer_nodes;
+	var vis = 'visible';
+	if (document.getElementById) {
+		cs = document.getElementById('currentSlide');
+		footer_nodes = document.getElementById('footer').childNodes;
+	} else {
+		cs = document.currentSlide;
+		footer = document.footer.childNodes;
+	}
+	cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + 
+		'<span id="csSep">\/<\/span> ' + 
+		'<span id="csTotal">' + (smax-1) + '<\/span>';
+	if (snum == 0) {
+		vis = 'hidden';
+	}
+	cs.style.visibility = vis;
+	for (var i = 0; i < footer_nodes.length; i++) {
+		if (footer_nodes[i].nodeType == 1) {
+			footer_nodes[i].style.visibility = vis;
+		}
+	}		
+}
+
+function go(step) {
+	if (document.getElementById('slideProj').disabled || step == 0) return;
+	var jl = document.getElementById('jumplist');
+	var cid = slideIDs[snum];
+	var ce = document.getElementById(cid);
+	if (incrementals[snum].length > 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			removeClass(incrementals[snum][i], 'current');
+			removeClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (step != 'j') {
+		snum += step;
+		lmax = smax - 1;
+		if (snum > lmax) snum = lmax;
+		if (snum < 0) snum = 0;
+	} else
+		snum = parseInt(jl.value);
+	var nid = slideIDs[snum];
+	var ne = document.getElementById(nid);
+	if (!ne) {
+		ne = document.getElementById(slideIDs[0]);
+		snum = 0;
+	}
+	if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+	if (incrementals[snum].length > 0 && incpos == 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			if (hasClass(incrementals[snum][i], 'current'))
+				incpos = i + 1;
+			else
+				addClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (incrementals[snum].length > 0 && incpos > 0)
+		addClass(incrementals[snum][incpos - 1], 'current');
+	ce.style.visibility = 'hidden';
+	ne.style.visibility = 'visible';
+	jl.selectedIndex = snum;
+	currentSlide();
+	number = 0;
+}
+
+function goTo(target) {
+	if (target >= smax || target == snum) return;
+	go(target - snum);
+}
+
+function subgo(step) {
+	if (step > 0) {
+		removeClass(incrementals[snum][incpos - 1],'current');
+		removeClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos],'current');
+		incpos++;
+	} else {
+		incpos--;
+		removeClass(incrementals[snum][incpos],'current');
+		addClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos - 1],'current');
+	}
+}
+
+function toggle() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	if (!slides.disabled) {
+		slides.disabled = true;
+		outline.disabled = false;
+		s5mode = false;
+		fontSize('1em');
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'visible';
+		}
+	} else {
+		slides.disabled = false;
+		outline.disabled = true;
+		s5mode = true;
+		fontScale();
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'hidden';
+		}
+		slideColl[snum].style.visibility = 'visible';
+	}
+}
+
+function showHide(action) {
+	var obj = GetElementsWithClassName('*','hideme')[0];
+	switch (action) {
+	case 's': obj.style.visibility = 'visible'; break;
+	case 'h': obj.style.visibility = 'hidden'; break;
+	case 'k':
+		if (obj.style.visibility != 'visible') {
+			obj.style.visibility = 'visible';
+		} else {
+			obj.style.visibility = 'hidden';
+		}
+	break;
+	}
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+	if (!key) {
+		key = event;
+		key.which = key.keyCode;
+	}
+	if (key.which == 84) {
+		toggle();
+		return;
+	}
+	if (s5mode) {
+		switch (key.which) {
+			case 10: // return
+			case 13: // enter
+				if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+				if (key.target && isParentOrSelf(key.target, 'controls')) return;
+				if(number != undef) {
+					goTo(number);
+					break;
+				}
+			case 32: // spacebar
+			case 34: // page down
+			case 39: // rightkey
+			case 40: // downkey
+				if(number != undef) {
+					go(number);
+				} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+					go(1);
+				} else {
+					subgo(1);
+				}
+				break;
+			case 33: // page up
+			case 37: // leftkey
+			case 38: // upkey
+				if(number != undef) {
+					go(-1 * number);
+				} else if (!incrementals[snum] || incpos <= 0) {
+					go(-1);
+				} else {
+					subgo(-1);
+				}
+				break;
+			case 36: // home
+				goTo(0);
+				break;
+			case 35: // end
+				goTo(smax-1);
+				break;
+			case 67: // c
+				showHide('k');
+				break;
+		}
+		if (key.which < 48 || key.which > 57) {
+			number = undef;
+		} else {
+			if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+			if (key.target && isParentOrSelf(key.target, 'controls')) return;
+			number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+		}
+	}
+	return false;
+}
+
+function clicker(e) {
+	number = undef;
+	var target;
+	if (window.event) {
+		target = window.event.srcElement;
+		e = window.event;
+	} else target = e.target;
+    if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; 
+	if (!e.which || e.which == 1) {
+		if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+			go(1);
+		} else {
+			subgo(1);
+		}
+	}
+}
+
+function findSlide(hash) {
+	var target = document.getElementById(hash);
+	if (target) {
+		for (var i = 0; i < slideIDs.length; i++) {
+			if (target.id == slideIDs[i]) return i;
+		}
+	}
+	return null;
+}
+
+function slideJump() {
+	if (window.location.hash == null || window.location.hash == '') {
+		currentSlide();
+		return;
+	}
+	if (window.location.hash == null) return;
+	var dest = null;
+	dest = findSlide(window.location.hash.slice(1));
+	if (dest == null) {
+		dest = 0;
+	}
+	go(dest - snum);
+}
+
+function fixLinks() {
+	var thisUri = window.location.href;
+	thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+	var aelements = document.getElementsByTagName('A');
+	for (var i = 0; i < aelements.length; i++) {
+		var a = aelements[i].href;
+		var slideID = a.match('\#.+');
+		if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+			var dest = findSlide(slideID[0].slice(1));
+			if (dest != null) {
+				if (aelements[i].addEventListener) {
+					aelements[i].addEventListener("click", new Function("e",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"if (e.preventDefault) e.preventDefault();"), true);
+				} else if (aelements[i].attachEvent) {
+					aelements[i].attachEvent("onclick", new Function("",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"event.returnValue = false;"));
+				}
+			}
+		}
+	}
+}
+
+function externalLinks() {
+	if (!document.getElementsByTagName) return;
+	var anchors = document.getElementsByTagName('a');
+	for (var i=0; i<anchors.length; i++) {
+		var anchor = anchors[i];
+		if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+			anchor.target = '_blank';
+			addClass(anchor,'external');
+		}
+	}
+}
+
+function createControls() {
+	var controlsDiv = document.getElementById("controls");
+	if (!controlsDiv) return;
+	var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+	var hideDiv, hideList = '';
+	if (controlVis == 'hidden') {
+		hideDiv = hider;
+	} else {
+		hideList = hider;
+	}
+	controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+	'<div id="navLinks">' +
+	'<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+	'<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+	'<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+	'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+	'<\/div><\/form>';
+	if (controlVis == 'hidden') {
+		var hidden = document.getElementById('navLinks');
+	} else {
+		var hidden = document.getElementById('jumplist');
+	}
+	addClass(hidden,'hideme');
+}
+
+function fontScale() {  // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+	if (!s5mode) return false;
+	var vScale = 22;  // both yield 32 (after rounding) at 1024x768
+	var hScale = 32;  // perhaps should auto-calculate based on theme's declared value?
+	if (window.innerHeight) {
+		var vSize = window.innerHeight;
+		var hSize = window.innerWidth;
+	} else if (document.documentElement.clientHeight) {
+		var vSize = document.documentElement.clientHeight;
+		var hSize = document.documentElement.clientWidth;
+	} else if (document.body.clientHeight) {
+		var vSize = document.body.clientHeight;
+		var hSize = document.body.clientWidth;
+	} else {
+		var vSize = 700;  // assuming 1024x768, minus chrome and such
+		var hSize = 1024; // these do not account for kiosk mode or Opera Show
+	}
+	var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+	fontSize(newSize + 'px');
+	if (isGe) {  // hack to counter incremental reflow bugs
+		var obj = document.getElementsByTagName('body')[0];
+		obj.style.display = 'none';
+		obj.style.display = 'block';
+	}
+}
+
+function fontSize(value) {
+	if (!(s5ss = document.getElementById('s5ss'))) {
+		if (!isIE) {
+			document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+			s5ss.setAttribute('media','screen, projection');
+			s5ss.setAttribute('id','s5ss');
+		} else {
+			document.createStyleSheet();
+			document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+		}
+	}
+	if (!isIE) {
+		while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+		s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+	} else {
+		document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+	}
+}
+
+function notOperaFix() {
+	slideCSS = document.getElementById('slideProj').href;
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	slides.setAttribute('media','screen');
+	outline.disabled = true;
+	if (isGe) {
+		slides.setAttribute('href','null');   // Gecko fix
+		slides.setAttribute('href',slideCSS); // Gecko fix
+	}
+	if (isIE && document.styleSheets && document.styleSheets[0]) {
+		document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+	}
+}
+
+function getIncrementals(obj) {
+	var incrementals = new Array();
+	if (!obj) 
+		return incrementals;
+	var children = obj.childNodes;
+	for (var i = 0; i < children.length; i++) {
+		var child = children[i];
+		if (hasClass(child, 'incremental')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'incremental');
+				for (var j = 0; j < child.childNodes.length; j++) {
+					if (child.childNodes[j].nodeType == 1) {
+						addClass(child.childNodes[j], 'incremental');
+					}
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+				removeClass(child,'incremental');
+			}
+		}
+		if (hasClass(child, 'show-first')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'show-first');
+				if (child.childNodes[isGe].nodeType == 1) {
+					removeClass(child.childNodes[isGe], 'incremental');
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+			}
+		}
+		incrementals = incrementals.concat(getIncrementals(child));
+	}
+	return incrementals;
+}
+
+function createIncrementals() {
+	var incrementals = new Array();
+	for (var i = 0; i < smax; i++) {
+		incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+	}
+	return incrementals;
+}
+
+function defaultCheck() {
+	var allMetas = document.getElementsByTagName('meta');
+	for (var i = 0; i< allMetas.length; i++) {
+		if (allMetas[i].name == 'defaultView') {
+			defaultView = allMetas[i].content;
+		}
+		if (allMetas[i].name == 'controlVis') {
+			controlVis = allMetas[i].content;
+		}
+	}
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+	if (!e) {
+		e = event;
+		e.which = e.keyCode;
+	}
+	try {
+		modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+	}
+	catch(e) {
+		modifierKey = false;
+	}
+	return modifierKey || e.which == 0;
+}
+
+function startup() {
+	defaultCheck();
+	if (!isOp) createControls();
+	slideLabel();
+	fixLinks();
+	externalLinks();
+	fontScale();
+	if (!isOp) {
+		notOperaFix();
+		incrementals = createIncrementals();
+		slideJump();
+		if (defaultView == 'outline') {
+			toggle();
+		}
+		document.onkeyup = keys;
+		document.onkeypress = trap;
+		document.onclick = clicker;
+	}
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/print.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/print.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/print.css	(revision 1126)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+   DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+  font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.print {display: inline ! important;}
+
+/* The following rule keeps the layout stuff out of print.
+   Remove at your own risk! */
+.layout, .layout * {display: none !important;}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/s5-core.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/s5-core.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/s5-core.css	(revision 1126)
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+   The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer, 
+  html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/iepngfix.htc
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/iepngfix.htc	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/iepngfix.htc	(revision 1126)
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+  if ((/\.png$/i).test(src)) {
+   filt(src, 'image');  // was 'scale'
+   src = blankImg;
+  } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+  if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+   var s = RegExp.$1;
+   style.backgroundImage = '';
+   filt(s, 'crop');
+  } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component>
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/outline.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/outline.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/default/outline.css	(revision 1126)
@@ -0,0 +1,16 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+   outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+  display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.outline {display: inline ! important;}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-white/framing.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-white/framing.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-white/framing.css	(revision 1126)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-white/pretty.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-white/pretty.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-white/pretty.css	(revision 1126)
@@ -0,0 +1,114 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-black/pretty.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-black/pretty.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-black/pretty.css	(revision 1126)
@@ -0,0 +1,115 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-black/__base__
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-black/__base__	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-black/__base__	(revision 1126)
@@ -0,0 +1,2 @@
+# base theme of this theme:
+medium-white
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/README.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/README.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/README.txt	(revision 1126)
@@ -0,0 +1,6 @@
+Except where otherwise noted (default/iepngfix.htc), all files in this
+directory have been released into the Public Domain.
+
+These files are based on files from S5 1.1, released into the Public
+Domain by Eric Meyer.  For further details, please see
+http://www.meyerweb.com/eric/tools/s5/credits.html.
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/framing.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/framing.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/framing.css	(revision 1126)
@@ -0,0 +1,25 @@
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; z-index: 1;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
+/*  list-style: none;} */
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/pretty.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/pretty.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/pretty.css	(revision 1126)
@@ -0,0 +1,109 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/__base__
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/__base__	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-black/__base__	(revision 1126)
@@ -0,0 +1,2 @@
+# base theme of this theme:
+big-white
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-white/framing.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-white/framing.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-white/framing.css	(revision 1126)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 0.75em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-white/pretty.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-white/pretty.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/medium-white/pretty.css	(revision 1126)
@@ -0,0 +1,113 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-white/framing.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-white/framing.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-white/framing.css	(revision 1126)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-white/pretty.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-white/pretty.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/big-white/pretty.css	(revision 1126)
@@ -0,0 +1,107 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #005; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-black/__base__
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-black/__base__	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-black/__base__	(revision 1126)
@@ -0,0 +1,2 @@
+# base theme of this theme:
+small-white
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-black/pretty.css
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-black/pretty.css	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/themes/small-black/pretty.css	(revision 1126)
@@ -0,0 +1,116 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/writers/s5_html/__init__.py	(revision 1126)
@@ -0,0 +1,353 @@
+# $Id: __init__.py 7720 2013-09-05 12:54:56Z milde $
+# Authors: Chris Liechti <cliechti@gmx.net>;
+#          David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+S5/HTML Slideshow Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import re
+import docutils
+from docutils import frontend, nodes, utils
+from docutils.writers import html4css1
+from docutils.parsers.rst import directives
+from docutils._compat import b
+
+themes_dir_path = utils.relative_path(
+    os.path.join(os.getcwd(), 'dummy'),
+    os.path.join(os.path.dirname(__file__), 'themes'))
+
+def find_theme(name):
+    # Where else to look for a theme?
+    # Check working dir?  Destination dir?  Config dir?  Plugins dir?
+    path = os.path.join(themes_dir_path, name)
+    if not os.path.isdir(path):
+        raise docutils.ApplicationError(
+            'Theme directory not found: %r (path: %r)' % (name, path))
+    return path
+
+
+class Writer(html4css1.Writer):
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'S5 Slideshow Specific Options',
+        'For the S5/HTML writer, the --no-toc-backlinks option '
+        '(defined in General Docutils Options above) is the default, '
+        'and should not be changed.',
+        (('Specify an installed S5 theme by name.  Overrides --theme-url.  '
+          'The default theme name is "default".  The theme files will be '
+          'copied into a "ui/<theme>" directory, in the same directory as the '
+          'destination file (output HTML).  Note that existing theme files '
+          'will not be overwritten (unless --overwrite-theme-files is used).',
+          ['--theme'],
+          {'default': 'default', 'metavar': '<name>',
+           'overrides': 'theme_url'}),
+         ('Specify an S5 theme URL.  The destination file (output HTML) will '
+          'link to this theme; nothing will be copied.  Overrides --theme.',
+          ['--theme-url'],
+          {'metavar': '<URL>', 'overrides': 'theme'}),
+         ('Allow existing theme files in the ``ui/<theme>`` directory to be '
+          'overwritten.  The default is not to overwrite theme files.',
+          ['--overwrite-theme-files'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Keep existing theme files in the ``ui/<theme>`` directory; do not '
+          'overwrite any.  This is the default.',
+          ['--keep-theme-files'],
+          {'dest': 'overwrite_theme_files', 'action': 'store_false'}),
+         ('Set the initial view mode to "slideshow" [default] or "outline".',
+          ['--view-mode'],
+          {'choices': ['slideshow', 'outline'], 'default': 'slideshow',
+           'metavar': '<mode>'}),
+         ('Normally hide the presentation controls in slideshow mode. '
+          'This is the default.',
+          ['--hidden-controls'],
+          {'action': 'store_true', 'default': True,
+           'validator': frontend.validate_boolean}),
+         ('Always show the presentation controls in slideshow mode.  '
+          'The default is to hide the controls.',
+          ['--visible-controls'],
+          {'dest': 'hidden_controls', 'action': 'store_false'}),
+         ('Enable the current slide indicator ("1 / 15").  '
+          'The default is to disable it.',
+          ['--current-slide'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Disable the current slide indicator.  This is the default.',
+          ['--no-current-slide'],
+          {'dest': 'current_slide', 'action': 'store_false'}),))
+
+    settings_default_overrides = {'toc_backlinks': 0}
+
+    config_section = 's5_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = S5HTMLTranslator
+
+
+class S5HTMLTranslator(html4css1.HTMLTranslator):
+
+    s5_stylesheet_template = """\
+<!-- configuration parameters -->
+<meta name="defaultView" content="%(view_mode)s" />
+<meta name="controlVis" content="%(control_visibility)s" />
+<!-- style sheet links -->
+<script src="%(path)s/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="%(path)s/slides.css"
+      type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="%(path)s/outline.css"
+      type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="%(path)s/print.css"
+      type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="%(path)s/opera.css"
+      type="text/css" media="projection" id="operaFix" />\n"""
+    # The script element must go in front of the link elements to
+    # avoid a flash of unstyled content (FOUC), reproducible with
+    # Firefox.
+
+    disable_current_slide = """
+<style type="text/css">
+#currentSlide {display: none;}
+</style>\n"""
+
+    layout_template = """\
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+%(header)s
+</div>
+<div id="footer">
+%(title)s%(footer)s
+</div>
+</div>\n"""
+# <div class="topleft"></div>
+# <div class="topright"></div>
+# <div class="bottomleft"></div>
+# <div class="bottomright"></div>
+
+    default_theme = 'default'
+    """Name of the default theme."""
+
+    base_theme_file = '__base__'
+    """Name of the file containing the name of the base theme."""
+
+    direct_theme_files = (
+        'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js')
+    """Names of theme files directly linked to in the output HTML"""
+
+    indirect_theme_files = (
+        's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc')
+    """Names of files used indirectly; imported or used by files in
+    `direct_theme_files`."""
+
+    required_theme_files = indirect_theme_files + direct_theme_files
+    """Names of mandatory theme files."""
+
+    def __init__(self, *args):
+        html4css1.HTMLTranslator.__init__(self, *args)
+        #insert S5-specific stylesheet and script stuff:
+        self.theme_file_path = None
+        self.setup_theme()
+        view_mode = self.document.settings.view_mode
+        control_visibility = ('visible', 'hidden')[self.document.settings
+                                                   .hidden_controls]
+        self.stylesheet.append(self.s5_stylesheet_template
+                               % {'path': self.theme_file_path,
+                                  'view_mode': view_mode,
+                                  'control_visibility': control_visibility})
+        if not self.document.settings.current_slide:
+            self.stylesheet.append(self.disable_current_slide)
+        self.add_meta('<meta name="version" content="S5 1.1" />\n')
+        self.s5_footer = []
+        self.s5_header = []
+        self.section_count = 0
+        self.theme_files_copied = None
+
+    def setup_theme(self):
+        if self.document.settings.theme:
+            self.copy_theme()
+        elif self.document.settings.theme_url:
+            self.theme_file_path = self.document.settings.theme_url
+        else:
+            raise docutils.ApplicationError(
+                'No theme specified for S5/HTML writer.')
+
+    def copy_theme(self):
+        """
+        Locate & copy theme files.
+
+        A theme may be explicitly based on another theme via a '__base__'
+        file.  The default base theme is 'default'.  Files are accumulated
+        from the specified theme, any base themes, and 'default'.
+        """
+        settings = self.document.settings
+        path = find_theme(settings.theme)
+        theme_paths = [path]
+        self.theme_files_copied = {}
+        required_files_copied = {}
+        # This is a link (URL) in HTML, so we use "/", not os.sep:
+        self.theme_file_path = '%s/%s' % ('ui', settings.theme)
+        if settings._destination:
+            dest = os.path.join(
+                os.path.dirname(settings._destination), 'ui', settings.theme)
+            if not os.path.isdir(dest):
+                os.makedirs(dest)
+        else:
+            # no destination, so we can't copy the theme
+            return
+        default = False
+        while path:
+            for f in os.listdir(path):  # copy all files from each theme
+                if f == self.base_theme_file:
+                    continue            # ... except the "__base__" file
+                if ( self.copy_file(f, path, dest)
+                     and f in self.required_theme_files):
+                    required_files_copied[f] = 1
+            if default:
+                break                   # "default" theme has no base theme
+            # Find the "__base__" file in theme directory:
+            base_theme_file = os.path.join(path, self.base_theme_file)
+            # If it exists, read it and record the theme path:
+            if os.path.isfile(base_theme_file):
+                lines = open(base_theme_file).readlines()
+                for line in lines:
+                    line = line.strip()
+                    if line and not line.startswith('#'):
+                        path = find_theme(line)
+                        if path in theme_paths: # check for duplicates (cycles)
+                            path = None         # if found, use default base
+                        else:
+                            theme_paths.append(path)
+                        break
+                else:                   # no theme name found
+                    path = None         # use default base
+            else:                       # no base theme file found
+                path = None             # use default base
+            if not path:
+                path = find_theme(self.default_theme)
+                theme_paths.append(path)
+                default = True
+        if len(required_files_copied) != len(self.required_theme_files):
+            # Some required files weren't found & couldn't be copied.
+            required = list(self.required_theme_files)
+            for f in required_files_copied.keys():
+                required.remove(f)
+            raise docutils.ApplicationError(
+                'Theme files not found: %s'
+                % ', '.join(['%r' % f for f in required]))
+
+    files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$')
+
+    def copy_file(self, name, source_dir, dest_dir):
+        """
+        Copy file `name` from `source_dir` to `dest_dir`.
+        Return 1 if the file exists in either `source_dir` or `dest_dir`.
+        """
+        source = os.path.join(source_dir, name)
+        dest = os.path.join(dest_dir, name)
+        if dest in self.theme_files_copied:
+            return 1
+        else:
+            self.theme_files_copied[dest] = 1
+        if os.path.isfile(source):
+            if self.files_to_skip_pattern.search(source):
+                return None
+            settings = self.document.settings
+            if os.path.exists(dest) and not settings.overwrite_theme_files:
+                settings.record_dependencies.add(dest)
+            else:
+                src_file = open(source, 'rb')
+                src_data = src_file.read()
+                src_file.close()
+                dest_file = open(dest, 'wb')
+                dest_dir = dest_dir.replace(os.sep, '/')
+                dest_file.write(src_data.replace(
+                    b('ui/default'),
+                    dest_dir[dest_dir.rfind('ui/'):].encode(
+                    sys.getfilesystemencoding())))
+                dest_file.close()
+                settings.record_dependencies.add(source)
+            return 1
+        if os.path.isfile(dest):
+            return 1
+
+    def depart_document(self, node):
+        self.head_prefix.extend([self.doctype,
+                                 self.head_prefix_template %
+                                 {'lang': self.settings.language_code}])
+        self.html_prolog.append(self.doctype)
+        self.meta.insert(0, self.content_type % self.settings.output_encoding)
+        self.head.insert(0, self.content_type % self.settings.output_encoding)
+        if self.math_header:
+            if self.math_output == 'mathjax':
+                self.head.extend(self.math_header)
+            else:
+                self.stylesheet.extend(self.math_header)
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.fragment.extend(self.body)
+        # special S5 code up to the next comment line
+        header = ''.join(self.s5_header)
+        footer = ''.join(self.s5_footer)
+        title = ''.join(self.html_title).replace('<h1 class="title">', '<h1>')
+        layout = self.layout_template % {'header': header,
+                                         'title': title,
+                                         'footer': footer}
+        self.body_prefix.extend(layout)
+        self.body_prefix.append('<div class="presentation">\n')
+        self.body_prefix.append(
+            self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div'))
+        if not self.section_count:
+            self.body.append('</div>\n')
+        #
+        self.body_suffix.insert(0, '</div>\n')
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        self.s5_footer.append('<h2>')
+        self.s5_footer.extend(self.body[start:])
+        self.s5_footer.append('</h2>')
+        del self.body[start:]
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = ['<div id="header">\n']
+        header.extend(self.body[start:])
+        header.append('\n</div>\n')
+        del self.body[start:]
+        self.s5_header.extend(header)
+
+    def visit_section(self, node):
+        if not self.section_count:
+            self.body.append('\n</div>\n')
+        self.section_count += 1
+        self.section_level += 1
+        if self.section_level > 1:
+            # dummy for matching div's
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+        else:
+            self.body.append(self.starttag(node, 'div', CLASS='slide'))
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.section):
+            level = self.section_level + self.initial_header_level - 1
+            if level == 1:
+                level = 2
+            tag = 'h%s' % level
+            self.body.append(self.starttag(node, tag, ''))
+            self.context.append('</%s>\n' % tag)
+        else:
+            html4css1.HTMLTranslator.visit_subtitle(self, node)
+
+    def visit_title(self, node):
+        html4css1.HTMLTranslator.visit_title(self, node)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/smartquotes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/smartquotes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/smartquotes.py	(revision 1126)
@@ -0,0 +1,906 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# :Id: $Id: smartquotes.py 7933 2016-01-13 21:09:13Z milde $
+# :Copyright: © 2010 Günter Milde,
+#             original `SmartyPants`_: © 2003 John Gruber
+#             smartypants.py:          © 2004, 2007 Chad Miller
+# :Maintainer: docutils-develop@lists.sourceforge.net
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+#
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notices and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+
+r"""
+========================
+SmartyPants for Docutils
+========================
+
+Synopsis
+========
+
+Smart-quotes for Docutils.
+
+The original "SmartyPants" is a free web publishing plug-in for Movable Type,
+Blosxom, and BBEdit that easily translates plain ASCII punctuation characters
+into "smart" typographic punctuation characters.
+
+`smartypants.py`, endeavours to be a functional port of
+SmartyPants to Python, for use with Pyblosxom_.
+
+`smartquotes.py` is an adaption of Smartypants to Docutils_. By using Unicode
+characters instead of HTML entities for typographic quotes, it works for any
+output format that supports Unicode.
+
+Authors
+=======
+
+`John Gruber`_ did all of the hard work of writing this software in Perl for
+`Movable Type`_ and almost all of this useful documentation.  `Chad Miller`_
+ported it to Python to use with Pyblosxom_.
+Adapted to Docutils_ by Günter Milde.
+
+Additional Credits
+==================
+
+Portions of the SmartyPants original work are based on Brad Choate's nifty
+MTRegex plug-in.  `Brad Choate`_ also contributed a few bits of source code to
+this plug-in.  Brad Choate is a fine hacker indeed.
+
+`Jeremy Hedley`_ and `Charles Wiltgen`_ deserve mention for exemplary beta
+testing of the original SmartyPants.
+
+`Rael Dornfest`_ ported SmartyPants to Blosxom.
+
+.. _Brad Choate: http://bradchoate.com/
+.. _Jeremy Hedley: http://antipixel.com/
+.. _Charles Wiltgen: http://playbacktime.com/
+.. _Rael Dornfest: http://raelity.org/
+
+
+Copyright and License
+=====================
+
+SmartyPants_ license (3-Clause BSD license):
+
+  Copyright (c) 2003 John Gruber (http://daringfireball.net/)
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+  * Neither the name "SmartyPants" nor the names of its contributors
+    may be used to endorse or promote products derived from this
+    software without specific prior written permission.
+
+  This software is provided by the copyright holders and contributors
+  "as is" and any express or implied warranties, including, but not
+  limited to, the implied warranties of merchantability and fitness for
+  a particular purpose are disclaimed. In no event shall the copyright
+  owner or contributors be liable for any direct, indirect, incidental,
+  special, exemplary, or consequential damages (including, but not
+  limited to, procurement of substitute goods or services; loss of use,
+  data, or profits; or business interruption) however caused and on any
+  theory of liability, whether in contract, strict liability, or tort
+  (including negligence or otherwise) arising in any way out of the use
+  of this software, even if advised of the possibility of such damage.
+
+smartypants.py license (2-Clause BSD license):
+
+  smartypants.py is a derivative work of SmartyPants.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+  This software is provided by the copyright holders and contributors
+  "as is" and any express or implied warranties, including, but not
+  limited to, the implied warranties of merchantability and fitness for
+  a particular purpose are disclaimed. In no event shall the copyright
+  owner or contributors be liable for any direct, indirect, incidental,
+  special, exemplary, or consequential damages (including, but not
+  limited to, procurement of substitute goods or services; loss of use,
+  data, or profits; or business interruption) however caused and on any
+  theory of liability, whether in contract, strict liability, or tort
+  (including negligence or otherwise) arising in any way out of the use
+  of this software, even if advised of the possibility of such damage.
+
+.. _John Gruber: http://daringfireball.net/
+.. _Chad Miller: http://web.chad.org/
+
+.. _Pyblosxom: http://pyblosxom.bluesock.org/
+.. _SmartyPants: http://daringfireball.net/projects/smartypants/
+.. _Movable Type: http://www.movabletype.org/
+.. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+.. _Docutils: http://docutils.sf.net/
+
+Description
+===========
+
+SmartyPants can perform the following transformations:
+
+- Straight quotes ( " and ' ) into "curly" quote characters
+- Backticks-style quotes (\`\`like this'') into "curly" quote characters
+- Dashes (``--`` and ``---``) into en- and em-dash entities
+- Three consecutive dots (``...`` or ``. . .``) into an ellipsis entity
+
+This means you can write, edit, and save your posts using plain old
+ASCII straight quotes, plain dashes, and plain dots, but your published
+posts (and final HTML output) will appear with smart quotes, em-dashes,
+and proper ellipses.
+
+SmartyPants does not modify characters within ``<pre>``, ``<code>``, ``<kbd>``,
+``<math>`` or ``<script>`` tag blocks. Typically, these tags are used to
+display text where smart quotes and other "smart punctuation" would not be
+appropriate, such as source code or example markup.
+
+
+Backslash Escapes
+=================
+
+If you need to use literal straight quotes (or plain hyphens and
+periods), SmartyPants accepts the following backslash escape sequences
+to force non-smart punctuation. It does so by transforming the escape
+sequence into a character:
+
+========  =====  =========
+Escape    Value  Character
+========  =====  =========
+``\\\\``  &#92;  \\
+\\"       &#34;  "
+\\'       &#39;  '
+\\.       &#46;  .
+\\-       &#45;  \-
+\\`       &#96;  \`
+========  =====  =========
+
+This is useful, for example, when you want to use straight quotes as
+foot and inch marks: 6\\'2\\" tall; a 17\\" iMac.
+
+Options
+=======
+
+For Pyblosxom users, the ``smartypants_attributes`` attribute is where you
+specify configuration options.
+
+Numeric values are the easiest way to configure SmartyPants' behavior:
+
+"0"
+        Suppress all transformations. (Do nothing.)
+"1"
+        Performs default SmartyPants transformations: quotes (including
+        \`\`backticks'' -style), em-dashes, and ellipses. "``--``" (dash dash)
+        is used to signify an em-dash; there is no support for en-dashes.
+
+"2"
+        Same as smarty_pants="1", except that it uses the old-school typewriter
+        shorthand for dashes:  "``--``" (dash dash) for en-dashes, "``---``"
+        (dash dash dash)
+        for em-dashes.
+
+"3"
+        Same as smarty_pants="2", but inverts the shorthand for dashes:
+        "``--``" (dash dash) for em-dashes, and "``---``" (dash dash dash) for
+        en-dashes.
+
+"-1"
+        Stupefy mode. Reverses the SmartyPants transformation process, turning
+        the characters produced by SmartyPants into their ASCII equivalents.
+        E.g.  "“" is turned into a simple double-quote (\"), "—" is
+        turned into two dashes, etc.
+
+
+The following single-character attribute values can be combined to toggle
+individual transformations from within the smarty_pants attribute. For
+example, to educate normal quotes and em-dashes, but not ellipses or
+\`\`backticks'' -style quotes:
+
+``py['smartypants_attributes'] = "1"``
+
+"q"
+        Educates normal quote characters: (") and (').
+
+"b"
+        Educates \`\`backticks'' -style double quotes.
+
+"B"
+        Educates \`\`backticks'' -style double quotes and \`single' quotes.
+
+"d"
+        Educates em-dashes.
+
+"D"
+        Educates em-dashes and en-dashes, using old-school typewriter shorthand:
+        (dash dash) for en-dashes, (dash dash dash) for em-dashes.
+
+"i"
+        Educates em-dashes and en-dashes, using inverted old-school typewriter
+        shorthand: (dash dash) for em-dashes, (dash dash dash) for en-dashes.
+
+"e"
+        Educates ellipses.
+
+"w"
+        Translates any instance of ``&quot;`` into a normal double-quote character.
+        This should be of no interest to most people, but of particular interest
+        to anyone who writes their posts using Dreamweaver, as Dreamweaver
+        inexplicably uses this entity to represent a literal double-quote
+        character. SmartyPants only educates normal quotes, not entities (because
+        ordinarily, entities are used for the explicit purpose of representing the
+        specific character they represent). The "w" option must be used in
+        conjunction with one (or both) of the other quote options ("q" or "b").
+        Thus, if you wish to apply all SmartyPants transformations (quotes, en-
+        and em-dashes, and ellipses) and also translate ``&quot;`` entities into
+        regular quotes so SmartyPants can educate them, you should pass the
+        following to the smarty_pants attribute:
+
+
+Caveats
+=======
+
+Why You Might Not Want to Use Smart Quotes in Your Weblog
+---------------------------------------------------------
+
+For one thing, you might not care.
+
+Most normal, mentally stable individuals do not take notice of proper
+typographic punctuation. Many design and typography nerds, however, break
+out in a nasty rash when they encounter, say, a restaurant sign that uses
+a straight apostrophe to spell "Joe's".
+
+If you're the sort of person who just doesn't care, you might well want to
+continue not caring. Using straight quotes -- and sticking to the 7-bit
+ASCII character set in general -- is certainly a simpler way to live.
+
+Even if you I *do* care about accurate typography, you still might want to
+think twice before educating the quote characters in your weblog. One side
+effect of publishing curly quote characters is that it makes your
+weblog a bit harder for others to quote from using copy-and-paste. What
+happens is that when someone copies text from your blog, the copied text
+contains the 8-bit curly quote characters (as well as the 8-bit characters
+for em-dashes and ellipses, if you use these options). These characters
+are not standard across different text encoding methods, which is why they
+need to be encoded as characters.
+
+People copying text from your weblog, however, may not notice that you're
+using curly quotes, and they'll go ahead and paste the unencoded 8-bit
+characters copied from their browser into an email message or their own
+weblog. When pasted as raw "smart quotes", these characters are likely to
+get mangled beyond recognition.
+
+That said, my own opinion is that any decent text editor or email client
+makes it easy to stupefy smart quote characters into their 7-bit
+equivalents, and I don't consider it my problem if you're using an
+indecent text editor or email client.
+
+
+Algorithmic Shortcomings
+------------------------
+
+One situation in which quotes will get curled the wrong way is when
+apostrophes are used at the start of leading contractions. For example:
+
+``'Twas the night before Christmas.``
+
+In the case above, SmartyPants will turn the apostrophe into an opening
+single-quote, when in fact it should be a closing one. I don't think
+this problem can be solved in the general case -- every word processor
+I've tried gets this wrong as well. In such cases, it's best to use the
+proper character for closing single-quotes (``’``) by hand.
+
+
+Version History
+===============
+
+1.7     2012-11-19
+        - Internationalization: language-dependent quotes.
+
+1.6.1:  2012-11-06
+        - Refactor code, code cleanup,
+        - `educate_tokens()` generator as interface for Docutils.
+
+1.6:    2010-08-26
+        - Adaption to Docutils:
+          - Use Unicode instead of HTML entities,
+          - Remove code special to pyblosxom.
+
+1.5_1.6: Fri, 27 Jul 2007 07:06:40 -0400
+        - Fixed bug where blocks of precious unalterable text was instead
+          interpreted.  Thanks to Le Roux and Dirk van Oosterbosch.
+
+1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400
+        - Fix bogus magical quotation when there is no hint that the
+          user wants it, e.g., in "21st century".  Thanks to Nathan Hamblen.
+        - Be smarter about quotes before terminating numbers in an en-dash'ed
+          range.
+
+1.5_1.4: Thu, 10 Feb 2005 20:24:36 -0500
+        - Fix a date-processing bug, as reported by jacob childress.
+        - Begin a test-suite for ensuring correct output.
+        - Removed import of "string", since I didn't really need it.
+          (This was my first every Python program.  Sue me!)
+
+1.5_1.3: Wed, 15 Sep 2004 18:25:58 -0400
+        - Abort processing if the flavour is in forbidden-list.  Default of
+          [ "rss" ]   (Idea of Wolfgang SCHNERRING.)
+        - Remove stray virgules from en-dashes.  Patch by Wolfgang SCHNERRING.
+
+1.5_1.2: Mon, 24 May 2004 08:14:54 -0400
+        - Some single quotes weren't replaced properly.  Diff-tesuji played
+          by Benjamin GEIGER.
+
+1.5_1.1: Sun, 14 Mar 2004 14:38:28 -0500
+        - Support upcoming pyblosxom 0.9 plugin verification feature.
+
+1.5_1.0: Tue, 09 Mar 2004 08:08:35 -0500
+        - Initial release
+"""
+
+default_smartypants_attr = "1"
+
+
+import re
+
+class smartchars(object):
+    """Smart quotes and dashes
+    """
+
+    endash   = u'–' # "&#8211;" EN DASH
+    emdash   = u'—' # "&#8212;" EM DASH
+    ellipsis = u'…' # "&#8230;" HORIZONTAL ELLIPSIS
+
+    # quote characters (language-specific, set in __init__())
+    #
+    # English smart quotes (open primary, close primary, open secondary, close
+    # secondary) are:
+    #   opquote  = u'“' # "&#8220;" LEFT DOUBLE QUOTATION MARK
+    #   cpquote  = u'”' # "&#8221;" RIGHT DOUBLE QUOTATION MARK
+    #   osquote  = u'‘' # "&#8216;" LEFT SINGLE QUOTATION MARK
+    #   csquote  = u'’' # "&#8217;" RIGHT SINGLE QUOTATION MARK
+    # For other languages see:
+    # http://en.wikipedia.org/wiki/Non-English_usage_of_quotation_marks
+    # http://de.wikipedia.org/wiki/Anf%C3%BChrungszeichen#Andere_Sprachen
+    quotes = {'af':           u'“”‘’',
+              'af-x-altquot': u'„”‚’',
+              'ca':           u'«»“”',
+              'ca-x-altquot': u'“”‘’',
+              'cs':           u'„“‚‘',
+              'cs-x-altquot': u'»«›‹',
+              'da':           u'»«‘’',
+              'da-x-altquot': u'„“‚‘',
+              'de':           u'„“‚‘',
+              'de-x-altquot': u'»«›‹',
+              'de-CH':        u'«»‹›',
+              'el':           u'«»“”',
+              'en':           u'“”‘’',
+              'en-UK':        u'‘’“”',
+              'eo':           u'“”‘’',
+              'es':           u'«»“”',
+              'et':           u'„“‚‘', # no secondary quote listed in
+              'et-x-altquot': u'»«›‹', # the sources above (wikipedia.org)
+              'eu':           u'«»‹›',
+              'es-x-altquot': u'“”‘’',
+              'fi':           u'””’’',
+              'fi-x-altquot': u'»»’’',
+              'fr':           (u'« ',  u' »', u'‹ ', u' ›'), # with narrow no-break space
+              'fr-x-altquot': u'«»‹›', # for use with manually set spaces
+              # 'fr-x-altquot': (u'“ ',  u' ”', u'‘ ', u' ’'), # rarely used
+              'fr-CH':        u'«»‹›',
+              'gl':           u'«»“”',
+              'he':           u'”“»«',
+              'he-x-altquot': u'„”‚’',
+              'it':           u'«»“”',
+              'it-CH':        u'«»‹›',
+              'it-x-altquot': u'“”‘’',
+              'ja':           u'「」『』',
+              'lt':           u'„“‚‘',
+              'nl':           u'“”‘’',
+              'nl-x-altquot': u'„”‚’',
+              'pl':           u'„”«»',
+              'pl-x-altquot': u'«»“”',
+              'pt':           u'«»“”',
+              'pt-BR':        u'“”‘’',
+              'ro':           u'„”«»',
+              'ro-x-altquot': u'«»„”',
+              'ru':           u'«»„“',
+              'sk':           u'„“‚‘',
+              'sk-x-altquot': u'»«›‹',
+              'sv':           u'„“‚‘',
+              'sv-x-altquot': u'»«›‹',
+              'zh-CN':        u'“”‘’',
+              'it':           u'«»“”',
+              'zh-TW':        u'「」『』',
+             }
+
+    def __init__(self, language='en'):
+        self.language = language
+        try:
+            (self.opquote, self.cpquote,
+             self.osquote, self.csquote) = self.quotes[language]
+        except KeyError:
+            self.opquote, self.cpquote, self.osquote, self.csquote = u'""\'\''
+
+
+def smartyPants(text, attr=default_smartypants_attr, language='en'):
+    """Main function for "traditional" use."""
+
+    return "".join([t for t in educate_tokens(tokenize(text),
+                                              attr, language)])
+
+
+def educate_tokens(text_tokens, attr=default_smartypants_attr, language='en'):
+    """Return iterator that "educates" the items of `text_tokens`.
+    """
+
+    # Parse attributes:
+    # 0 : do nothing
+    # 1 : set all
+    # 2 : set all, using old school en- and em- dash shortcuts
+    # 3 : set all, using inverted old school en and em- dash shortcuts
+    #
+    # q : quotes
+    # b : backtick quotes (``double'' only)
+    # B : backtick quotes (``double'' and `single')
+    # d : dashes
+    # D : old school dashes
+    # i : inverted old school dashes
+    # e : ellipses
+    # w : convert &quot; entities to " for Dreamweaver users
+
+    convert_quot = False  # translate &quot; entities into normal quotes?
+    do_dashes = False
+    do_backticks = False
+    do_quotes = False
+    do_ellipses = False
+    do_stupefy = False
+
+    if attr == "0": # Do nothing.
+        yield text
+    elif attr == "1": # Do everything, turn all options on.
+        do_quotes    = True
+        do_backticks = True
+        do_dashes    = 1
+        do_ellipses  = True
+    elif attr == "2":
+        # Do everything, turn all options on, use old school dash shorthand.
+        do_quotes    = True
+        do_backticks = True
+        do_dashes    = 2
+        do_ellipses  = True
+    elif attr == "3":
+        # Do everything, use inverted old school dash shorthand.
+        do_quotes    = True
+        do_backticks = True
+        do_dashes    = 3
+        do_ellipses  = True
+    elif attr == "-1": # Special "stupefy" mode.
+        do_stupefy   = True
+    else:
+        if "q" in attr: do_quotes = True
+        if "b" in attr: do_backticks = True
+        if "B" in attr: do_backticks = 2
+        if "d" in attr: do_dashes = 1
+        if "D" in attr: do_dashes = 2
+        if "i" in attr: do_dashes = 3
+        if "e" in attr: do_ellipses = True
+        if "w" in attr: convert_quot = True
+
+    prev_token_last_char = " "
+    # Last character of the previous text token. Used as
+    # context to curl leading quote characters correctly.
+
+    for (ttype, text) in text_tokens:
+
+        # skip HTML and/or XML tags as well as emtpy text tokens
+        # without updating the last character
+        if ttype == 'tag' or not text:
+            yield text
+            continue
+
+        # skip literal text (math, literal, raw, ...)
+        if ttype == 'literal':
+            prev_token_last_char = text[-1:]
+            yield text
+            continue
+
+        last_char = text[-1:] # Remember last char before processing.
+
+        text = processEscapes(text)
+
+        if convert_quot:
+            text = re.sub('&quot;', '"', text)
+
+        if do_dashes == 1:
+            text = educateDashes(text)
+        elif do_dashes == 2:
+            text = educateDashesOldSchool(text)
+        elif do_dashes == 3:
+            text = educateDashesOldSchoolInverted(text)
+
+        if do_ellipses:
+            text = educateEllipses(text)
+
+        # Note: backticks need to be processed before quotes.
+        if do_backticks:
+            text = educateBackticks(text, language)
+
+        if do_backticks == 2:
+            text = educateSingleBackticks(text, language)
+
+        if do_quotes:
+            text = educateQuotes(prev_token_last_char+text, language)[1:]
+
+        if do_stupefy:
+            text = stupefyEntities(text, language)
+
+        # Remember last char as context for the next token
+        prev_token_last_char = last_char
+
+        text = processEscapes(text, restore=True)
+
+        yield text
+
+
+
+def educateQuotes(text, language='en'):
+    """
+    Parameter:  - text string (unicode or bytes).
+                - language (`BCP 47` language tag.)
+    Returns:    The `text`, with "educated" curly quote characters.
+
+    Example input:  "Isn't this fun?"
+    Example output: “Isn’t this fun?“;
+    """
+
+    smart = smartchars(language)
+
+    # oldtext = text
+    punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]"""
+
+    # Special case if the very first character is a quote
+    # followed by punctuation at a non-word-break.
+    # Close the quotes by brute force:
+    text = re.sub(r"""^'(?=%s\\B)""" % (punct_class,), smart.csquote, text)
+    text = re.sub(r"""^"(?=%s\\B)""" % (punct_class,), smart.cpquote, text)
+
+    # Special case for double sets of quotes, e.g.:
+    #   <p>He said, "'Quoted' words in a larger quote."</p>
+    text = re.sub(r""""'(?=\w)""", smart.opquote+smart.osquote, text)
+    text = re.sub(r"""'"(?=\w)""", smart.osquote+smart.opquote, text)
+
+    # Special case for decade abbreviations (the '80s):
+    text = re.sub(r"""\b'(?=\d{2}s)""", smart.csquote, text)
+
+    close_class = r"""[^\ \t\r\n\[\{\(\-]"""
+    dec_dashes = r"""&#8211;|&#8212;"""
+
+    # Get most opening single quotes:
+    opening_single_quotes_regex = re.compile(r"""
+                    (
+                            \s          |   # a whitespace char, or
+                            &nbsp;      |   # a non-breaking space entity, or
+                            --          |   # dashes, or
+                            &[mn]dash;  |   # named dash entities
+                            %s          |   # or decimal entities
+                            &\#x201[34];    # or hex
+                    )
+                    '                 # the quote
+                    (?=\w)            # followed by a word character
+                    """ % (dec_dashes,), re.VERBOSE)
+    text = opening_single_quotes_regex.sub(r'\1'+smart.osquote, text)
+
+    closing_single_quotes_regex = re.compile(r"""
+                    (%s)
+                    '
+                    (?!\s | s\b | \d)
+                    """ % (close_class,), re.VERBOSE)
+    text = closing_single_quotes_regex.sub(r'\1'+smart.csquote, text)
+
+    closing_single_quotes_regex = re.compile(r"""
+                    (%s)
+                    '
+                    (\s | s\b)
+                    """ % (close_class,), re.VERBOSE)
+    text = closing_single_quotes_regex.sub(r'\1%s\2' % smart.csquote, text)
+
+    # Any remaining single quotes should be opening ones:
+    text = re.sub(r"""'""", smart.osquote, text)
+
+    # Get most opening double quotes:
+    opening_double_quotes_regex = re.compile(r"""
+                    (
+                            \s          |   # a whitespace char, or
+                            &nbsp;      |   # a non-breaking space entity, or
+                            --          |   # dashes, or
+                            &[mn]dash;  |   # named dash entities
+                            %s          |   # or decimal entities
+                            &\#x201[34];    # or hex
+                    )
+                    "                 # the quote
+                    (?=\w)            # followed by a word character
+                    """ % (dec_dashes,), re.VERBOSE)
+    text = opening_double_quotes_regex.sub(r'\1'+smart.opquote, text)
+
+    # Double closing quotes:
+    closing_double_quotes_regex = re.compile(r"""
+                    #(%s)?   # character that indicates the quote should be closing
+                    "
+                    (?=\s)
+                    """ % (close_class,), re.VERBOSE)
+    text = closing_double_quotes_regex.sub(smart.cpquote, text)
+
+    closing_double_quotes_regex = re.compile(r"""
+                    (%s)   # character that indicates the quote should be closing
+                    "
+                    """ % (close_class,), re.VERBOSE)
+    text = closing_double_quotes_regex.sub(r'\1'+smart.cpquote, text)
+
+    # Any remaining quotes should be opening ones.
+    text = re.sub(r'"', smart.opquote, text)
+
+    return text
+
+
+def educateBackticks(text, language='en'):
+    """
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with ``backticks'' -style double quotes
+                translated into HTML curly quote entities.
+    Example input:  ``Isn't this fun?''
+    Example output: “Isn't this fun?“;
+    """
+    smart = smartchars(language)
+
+    text = re.sub(r"""``""", smart.opquote, text)
+    text = re.sub(r"""''""", smart.cpquote, text)
+    return text
+
+
+def educateSingleBackticks(text, language='en'):
+    """
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with `backticks' -style single quotes
+                translated into HTML curly quote entities.
+
+    Example input:  `Isn't this fun?'
+    Example output: ‘Isn’t this fun?’
+    """
+    smart = smartchars(language)
+
+    text = re.sub(r"""`""", smart.osquote, text)
+    text = re.sub(r"""'""", smart.csquote, text)
+    return text
+
+
+def educateDashes(text):
+    """
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with each instance of "--" translated to
+                an em-dash character.
+    """
+
+    text = re.sub(r"""---""", smartchars.endash, text) # en  (yes, backwards)
+    text = re.sub(r"""--""", smartchars.emdash, text) # em (yes, backwards)
+    return text
+
+
+def educateDashesOldSchool(text):
+    """
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with each instance of "--" translated to
+                an en-dash character, and each "---" translated to
+                an em-dash character.
+    """
+
+    text = re.sub(r"""---""", smartchars.emdash, text)
+    text = re.sub(r"""--""", smartchars.endash, text)
+    return text
+
+
+def educateDashesOldSchoolInverted(text):
+    """
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with each instance of "--" translated to
+                an em-dash character, and each "---" translated to
+                an en-dash character. Two reasons why: First, unlike the
+                en- and em-dash syntax supported by
+                EducateDashesOldSchool(), it's compatible with existing
+                entries written before SmartyPants 1.1, back when "--" was
+                only used for em-dashes.  Second, em-dashes are more
+                common than en-dashes, and so it sort of makes sense that
+                the shortcut should be shorter to type. (Thanks to Aaron
+                Swartz for the idea.)
+    """
+    text = re.sub(r"""---""", smartchars.endash, text)    # em
+    text = re.sub(r"""--""", smartchars.emdash, text)    # en
+    return text
+
+
+
+def educateEllipses(text):
+    """
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with each instance of "..." translated to
+                an ellipsis character.
+
+    Example input:  Huh...?
+    Example output: Huh&#8230;?
+    """
+
+    text = re.sub(r"""\.\.\.""", smartchars.ellipsis, text)
+    text = re.sub(r"""\. \. \.""", smartchars.ellipsis, text)
+    return text
+
+
+def stupefyEntities(text, language='en'):
+    """
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with each SmartyPants character translated to
+                its ASCII counterpart.
+
+    Example input:  “Hello — world.”
+    Example output: "Hello -- world."
+    """
+    smart = smartchars(language)
+
+    text = re.sub(smart.endash, "-", text)  # en-dash
+    text = re.sub(smart.emdash, "--", text) # em-dash
+
+    text = re.sub(smart.osquote, "'", text)  # open single quote
+    text = re.sub(smart.csquote, "'", text)  # close single quote
+
+    text = re.sub(smart.opquote, '"', text)  # open double quote
+    text = re.sub(smart.cpquote, '"', text)  # close double quote
+
+    text = re.sub(smart.ellipsis, '...', text)# ellipsis
+
+    return text
+
+
+def processEscapes(text, restore=False):
+    r"""
+    Parameter:  String (unicode or bytes).
+    Returns:    The `text`, with after processing the following backslash
+                escape sequences. This is useful if you want to force a "dumb"
+                quote or other character to appear.
+
+                Escape  Value
+                ------  -----
+                \\      &#92;
+                \"      &#34;
+                \'      &#39;
+                \.      &#46;
+                \-      &#45;
+                \`      &#96;
+    """
+    replacements = ((r'\\', r'&#92;'),
+                    (r'\"', r'&#34;'),
+                    (r"\'", r'&#39;'),
+                    (r'\.', r'&#46;'),
+                    (r'\-', r'&#45;'),
+                    (r'\`', r'&#96;'))
+    if restore:
+        for (ch, rep) in replacements:
+            text = text.replace(rep, ch[1])
+    else:
+        for (ch, rep) in replacements:
+            text = text.replace(ch, rep)
+
+    return text
+
+
+def tokenize(text):
+    """
+    Parameter:  String containing HTML markup.
+    Returns:    An iterator that yields the tokens comprising the input
+                string. Each token is either a tag (possibly with nested,
+                tags contained therein, such as <a href="<MTFoo>">, or a
+                run of text between tags. Each yielded element is a
+                two-element tuple; the first is either 'tag' or 'text';
+                the second is the actual value.
+
+    Based on the _tokenize() subroutine from Brad Choate's MTRegex plugin.
+        <http://www.bradchoate.com/past/mtregex.php>
+    """
+
+    pos = 0
+    length = len(text)
+    # tokens = []
+
+    depth = 6
+    nested_tags = "|".join(['(?:<(?:[^<>]',] * depth) + (')*>)' * depth)
+    #match = r"""(?: <! ( -- .*? -- \s* )+ > ) |  # comments
+    #               (?: <\? .*? \?> ) |  # directives
+    #               %s  # nested tags       """ % (nested_tags,)
+    tag_soup = re.compile(r"""([^<]*)(<[^>]*>)""")
+
+    token_match = tag_soup.search(text)
+
+    previous_end = 0
+    while token_match is not None:
+        if token_match.group(1):
+            yield ('text', token_match.group(1))
+
+        yield ('tag', token_match.group(2))
+
+        previous_end = token_match.end()
+        token_match = tag_soup.search(text, token_match.end())
+
+    if previous_end < len(text):
+        yield ('text', text[previous_end:])
+
+
+
+if __name__ == "__main__":
+
+    import locale
+
+    try:
+        locale.setlocale(locale.LC_ALL, '')
+    except:
+        pass
+
+    from docutils.core import publish_string
+    docstring_html = publish_string(__doc__, writer_name='html')
+
+    print docstring_html
+
+
+    # Unit test output goes out stderr.
+    import unittest
+    sp = smartyPants
+
+    class TestSmartypantsAllAttributes(unittest.TestCase):
+        # the default attribute is "1", which means "all".
+
+        def test_dates(self):
+            self.assertEqual(sp("1440-80's"), u"1440-80’s")
+            self.assertEqual(sp("1440-'80s"), u"1440-‘80s")
+            self.assertEqual(sp("1440---'80s"), u"1440–‘80s")
+            self.assertEqual(sp("1960s"), "1960s")  # no effect.
+            self.assertEqual(sp("1960's"), u"1960’s")
+            self.assertEqual(sp("one two '60s"), u"one two ‘60s")
+            self.assertEqual(sp("'60s"), u"‘60s")
+
+        def test_ordinal_numbers(self):
+            self.assertEqual(sp("21st century"), "21st century")  # no effect.
+            self.assertEqual(sp("3rd"), "3rd")  # no effect.
+
+        def test_educated_quotes(self):
+            self.assertEqual(sp('''"Isn't this fun?"'''), u'“Isn’t this fun?”')
+
+        def test_html_tags(self):
+            text = '<a src="foo">more</a>'
+            self.assertEqual(sp(text), text)
+
+    unittest.main()
+
+
+
+
+__author__ = "Chad Miller <smartypantspy@chad.org>"
+__version__ = "1.5_1.6: Fri, 27 Jul 2007 07:06:40 -0400"
+__url__ = "http://wiki.chad.org/SmartyPantsPy"
+__description__ = "Smart-quotes, smart-ellipses, and smart-dashes for weblog entries in pyblosxom"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/urischemes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/urischemes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/urischemes.py	(revision 1126)
@@ -0,0 +1,136 @@
+# $Id: urischemes.py 7922 2015-09-22 15:28:09Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+`schemes` is a dictionary with lowercase URI addressing schemes as
+keys and descriptions as values. It was compiled from the index at
+http://www.iana.org/assignments/uri-schemes (revised 2005-11-28)
+and an older list at http://www.w3.org/Addressing/schemes.html.
+"""
+
+# Many values are blank and should be filled in with useful descriptions.
+
+schemes = {
+      'about': 'provides information on Navigator',
+      'acap': 'Application Configuration Access Protocol; RFC 2244',
+      'addbook': "To add vCard entries to Communicator's Address Book",
+      'afp': 'Apple Filing Protocol',
+      'afs': 'Andrew File System global file names',
+      'aim': 'AOL Instant Messenger',
+      'callto': 'for NetMeeting links',
+      'castanet': 'Castanet Tuner URLs for Netcaster',
+      'chttp': 'cached HTTP supported by RealPlayer',
+      'cid': 'content identifier; RFC 2392',
+      'crid': 'TV-Anytime Content Reference Identifier; RFC 4078',
+      'data': ('allows inclusion of small data items as "immediate" data; '
+               'RFC 2397'),
+      'dav': 'Distributed Authoring and Versioning Protocol; RFC 2518',
+      'dict': 'dictionary service protocol; RFC 2229',
+      'dns': 'Domain Name System resources',
+      'eid': ('External ID; non-URL data; general escape mechanism to allow '
+              'access to information for applications that are too '
+              'specialized to justify their own schemes'),
+      'fax': ('a connection to a terminal that can handle telefaxes '
+              '(facsimiles); RFC 2806'),
+      'feed' : 'NetNewsWire feed',
+      'file': 'Host-specific file names; RFC 1738',
+      'finger': '',
+      'freenet': '',
+      'ftp': 'File Transfer Protocol; RFC 1738',
+      'go': 'go; RFC 3368',
+      'gopher': 'The Gopher Protocol',
+      'gsm-sms': ('Global System for Mobile Communications Short Message '
+                  'Service'),
+      'h323': ('video (audiovisual) communication on local area networks; '
+               'RFC 3508'),
+      'h324': ('video and audio communications over low bitrate connections '
+               'such as POTS modem connections'),
+      'hdl': 'CNRI handle system',
+      'hnews': 'an HTTP-tunneling variant of the NNTP news protocol',
+      'http': 'Hypertext Transfer Protocol; RFC 2616',
+      'https': 'HTTP over SSL; RFC 2818',
+      'hydra': 'SubEthaEdit URI.  See http://www.codingmonkeys.de/subethaedit.',
+      'iioploc': 'Internet Inter-ORB Protocol Location?',
+      'ilu': 'Inter-Language Unification',
+      'im': 'Instant Messaging; RFC 3860',
+      'imap': 'Internet Message Access Protocol; RFC 2192',
+      'info': 'Information Assets with Identifiers in Public Namespaces',
+      'ior': 'CORBA interoperable object reference',
+      'ipp': 'Internet Printing Protocol; RFC 3510',
+      'irc': 'Internet Relay Chat',
+      'iris.beep': 'iris.beep; RFC 3983',
+      'iseek' : 'See www.ambrosiasw.com;  a little util for OS X.',
+      'jar': 'Java archive',
+      'javascript': ('JavaScript code; evaluates the expression after the '
+                     'colon'),
+      'jdbc': 'JDBC connection URI.',
+      'ldap': 'Lightweight Directory Access Protocol',
+      'lifn': '',
+      'livescript': '',
+      'lrq': '',
+      'mailbox': 'Mail folder access',
+      'mailserver': 'Access to data available from mail servers',
+      'mailto': 'Electronic mail address; RFC 2368',
+      'md5': '',
+      'mid': 'message identifier; RFC 2392',
+      'mocha': '',
+      'modem': ('a connection to a terminal that can handle incoming data '
+                'calls; RFC 2806'),
+      'mtqp': 'Message Tracking Query Protocol; RFC 3887',
+      'mupdate': 'Mailbox Update (MUPDATE) Protocol; RFC 3656',
+      'news': 'USENET news; RFC 1738',
+      'nfs': 'Network File System protocol; RFC 2224',
+      'nntp': 'USENET news using NNTP access; RFC 1738',
+      'opaquelocktoken': 'RFC 2518',
+      'phone': '',
+      'pop': 'Post Office Protocol; RFC 2384',
+      'pop3': 'Post Office Protocol v3',
+      'pres': 'Presence; RFC 3859',
+      'printer': '',
+      'prospero': 'Prospero Directory Service; RFC 4157',
+      'rdar' : ('URLs found in Darwin source '
+                '(http://www.opensource.apple.com/darwinsource/).'),
+      'res': '',
+      'rtsp': 'real time streaming protocol; RFC 2326',
+      'rvp': '',
+      'rwhois': '',
+      'rx': 'Remote Execution',
+      'sdp': '',
+      'service': 'service location; RFC 2609',
+      'shttp': 'secure hypertext transfer protocol',
+      'sip': 'Session Initiation Protocol; RFC 3261',
+      'sips': 'secure session intitiaion protocol; RFC 3261',
+      'smb': 'SAMBA filesystems.',
+      'snews': 'For NNTP postings via SSL',
+      'snmp': 'Simple Network Management Protocol; RFC 4088',
+      'soap.beep': 'RFC 3288',
+      'soap.beeps': 'RFC 3288',
+      'ssh': 'Reference to interactive sessions via ssh.',
+      't120': 'real time data conferencing (audiographics)',
+      'tag': 'RFC 4151',
+      'tcp': '',
+      'tel': ('a connection to a terminal that handles normal voice '
+              'telephone calls, a voice mailbox or another voice messaging '
+              'system or a service that can be operated using DTMF tones; '
+              'RFC 3966.'),
+      'telephone': 'telephone',
+      'telnet': 'Reference to interactive sessions; RFC 4248',
+      'tftp': 'Trivial File Transfer Protocol; RFC 3617',
+      'tip': 'Transaction Internet Protocol; RFC 2371',
+      'tn3270': 'Interactive 3270 emulation sessions',
+      'tv': '',
+      'urn': 'Uniform Resource Name; RFC 2141',
+      'uuid': '',
+      'vemmi': 'versatile multimedia interface; RFC 2122',
+      'videotex': '',
+      'view-source': 'displays HTML code that was generated with JavaScript',
+      'wais': 'Wide Area Information Servers; RFC 4156',
+      'whodp': '',
+      'whois++': 'Distributed directory service.',
+      'x-man-page': ('Opens man page in Terminal.app on OS X '
+                     '(see macosxhints.com)'),
+      'xmlrpc.beep': 'RFC 3529',
+      'xmlrpc.beeps': 'RFC 3529',
+      'z39.50r': 'Z39.50 Retrieval; RFC 2056',
+      'z39.50s': 'Z39.50 Session; RFC 2056',}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/punctuation_chars.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/punctuation_chars.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/punctuation_chars.py	(revision 1126)
@@ -0,0 +1,355 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# :Copyright: © 2011 Günter Milde.
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+#
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+# :Id: $Id: punctuation_chars.py 7668 2013-06-04 12:46:30Z milde $
+
+import sys, re
+import unicodedata
+
+# punctuation characters around inline markup
+# ===========================================
+#
+# This module provides the lists of characters for the implementation of
+# the `inline markup recognition rules`_ in the reStructuredText parser
+# (states.py)
+#
+# .. _inline markup recognition rules:
+#     ../../docs/ref/rst/restructuredtext.html#inline-markup
+
+# Docutils punctuation category sample strings
+# --------------------------------------------
+#
+# The sample strings are generated by punctuation_samples() and put here
+# literal to avoid the time-consuming generation with every Docutils run.
+# As the samples are used inside ``[ ]`` in regular expressions, hyphen and
+# square brackets are escaped. ::
+
+openers = (u'"\'(<\\[{\u0f3a\u0f3c\u169b\u2045\u207d\u208d\u2329\u2768'
+           u'\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea'
+           u'\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991'
+           u'\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28'
+           u'\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d'
+           u'\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41'
+           u'\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62'
+           u'\xab\u2018\u201c\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20'
+           u'\u201a\u201e\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d'
+           u'\u2e1d\u2e21\u201b\u201f')
+closers = (u'"\')>\\]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a\u2769'
+           u'\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb'
+           u'\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992'
+           u'\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29'
+           u'\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e'
+           u'\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42'
+           u'\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63'
+           u'\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21'
+           u'\u201b\u201f\xab\u2018\u201c\u2039\u2e02\u2e04\u2e09\u2e0c'
+           u'\u2e1c\u2e20\u201a\u201e')
+delimiters = (u'\\-/:\u058a\xa1\xb7\xbf\u037e\u0387\u055a-\u055f\u0589'
+              u'\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c'
+              u'\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d'
+              u'\u07f7-\u07f9\u0830-\u083e\u0964\u0965\u0970\u0df4\u0e4f'
+              u'\u0e5a\u0e5b\u0f04-\u0f12\u0f85\u0fd0-\u0fd4\u104a-\u104f'
+              u'\u10fb\u1361-\u1368\u1400\u166d\u166e\u16eb-\u16ed\u1735'
+              u'\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945'
+              u'\u19de\u19df\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-'
+              u'\u1b60\u1c3b-\u1c3f\u1c7e\u1c7f\u1cd3\u2010-\u2017\u2020-'
+              u'\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-'
+              u'\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2e00'
+              u'\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e1b\u2e1e\u2e1f\u2e2a-'
+              u'\u2e2e\u2e30\u2e31\u3001-\u3003\u301c\u3030\u303d\u30a0'
+              u'\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7'
+              u'\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f'
+              u'\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uabeb'
+              u'\ufe10-\ufe16\ufe19\ufe30-\ufe32\ufe45\ufe46\ufe49-\ufe4c'
+              u'\ufe50-\ufe52\ufe54-\ufe58\ufe5f-\ufe61\ufe63\ufe68\ufe6a'
+              u'\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c-\uff0f\uff1a'
+              u'\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65')
+if sys.maxunicode >= 0x10FFFF: # "wide" build
+    delimiters += (u'\U00010100\U00010101\U0001039f\U000103d0\U00010857'
+                   u'\U0001091f\U0001093f\U00010a50-\U00010a58\U00010a7f'
+                   u'\U00010b39-\U00010b3f\U000110bb\U000110bc\U000110be-'
+                   u'\U000110c1\U00012470-\U00012473')
+closing_delimiters = u'\\\\.,;!?'
+
+
+# Matching open/close quotes
+# --------------------------
+
+# Rule (5) requires determination of matching open/close pairs. However,
+# the pairing of open/close quotes is ambigue due to  different typographic
+# conventions in different languages.
+
+quote_pairs = {u'\xbb': u'\xbb', # Swedish
+            u'\u2018': u'\u201a', # Greek
+            u'\u2019': u'\u2019', # Swedish
+            u'\u201a': u'\u2018\u2019', # German, Polish
+            u'\u201c': u'\u201e', # German
+            u'\u201e': u'\u201c\u201d',
+            u'\u201d': u'\u201d', # Swedish
+            u'\u203a': u'\u203a', # Swedish
+            }
+
+def match_chars(c1, c2):
+    try:
+        i = openers.index(c1)
+    except ValueError:  # c1 not in openers
+        return False
+    return c2 == closers[i] or c2 in quote_pairs.get(c1, '')
+
+
+# Running this file as a standalone module checks the definitions against a
+# re-calculation::
+
+if __name__ == '__main__':
+
+
+# Unicode punctuation character categories
+# ----------------------------------------
+
+    unicode_punctuation_categories = {
+        # 'Pc': 'Connector', # not used in Docutils inline markup recognition
+        'Pd': 'Dash',
+        'Ps': 'Open',
+        'Pe': 'Close',
+        'Pi': 'Initial quote', # may behave like Ps or Pe depending on usage
+        'Pf': 'Final quote', # may behave like Ps or Pe depending on usage
+        'Po': 'Other'
+        }
+    """Unicode character categories for punctuation"""
+
+
+# generate character pattern strings
+# ==================================
+
+    def unicode_charlists(categories, cp_min=0, cp_max=None):
+        """Return dictionary of Unicode character lists.
+
+        For each of the `catagories`, an item contains a list with all Unicode
+        characters with `cp_min` <= code-point <= `cp_max` that belong to
+        the category.
+
+        The default values check every code-point supported by Python
+        (`sys.maxint` is 0x10FFFF in a "wide" build and 0xFFFF in a "narrow"
+        build, i.e. ucs4 and ucs2 respectively).
+        """
+        # Determine highest code point with one of the given categories
+        # (may shorten the search time considerably if there are many
+        # categories with not too high characters):
+        if cp_max is None:
+            cp_max = max(x for x in xrange(sys.maxunicode+1)
+                        if unicodedata.category(unichr(x)) in categories)
+            # print cp_max # => 74867 for unicode_punctuation_categories
+        charlists = {}
+        for cat in categories:
+            charlists[cat] = [unichr(x) for x in xrange(cp_min, cp_max+1)
+                              if unicodedata.category(unichr(x)) == cat]
+        return charlists
+
+
+# Character categories in Docutils
+# --------------------------------
+
+    def punctuation_samples():
+
+        """Docutils punctuation category sample strings.
+
+        Return list of sample strings for the categories "Open", "Close",
+        "Delimiters" and "Closing-Delimiters" used in the `inline markup
+        recognition rules`_.
+        """
+
+        # Lists with characters in Unicode punctuation character categories
+        cp_min = 160 # ASCII chars have special rules for backwards compatibility
+        ucharlists = unicode_charlists(unicode_punctuation_categories, cp_min)
+
+        # match opening/closing characters
+        # --------------------------------
+        # Rearange the lists to ensure matching characters at the same
+        # index position.
+
+        # low quotation marks are also used as closers (e.g. in Greek)
+        # move them to category Pi:
+        ucharlists['Ps'].remove(u'‚') # 201A  SINGLE LOW-9 QUOTATION MARK
+        ucharlists['Ps'].remove(u'„') # 201E  DOUBLE LOW-9 QUOTATION MARK
+        ucharlists['Pi'] += [u'‚', u'„']
+
+        ucharlists['Pi'].remove(u'‛') # 201B  SINGLE HIGH-REVERSED-9 QUOTATION MARK
+        ucharlists['Pi'].remove(u'‟') # 201F  DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+        ucharlists['Pf'] += [u'‛', u'‟']
+
+        # 301F  LOW DOUBLE PRIME QUOTATION MARK misses the opening pendant:
+        ucharlists['Ps'].insert(ucharlists['Pe'].index(u'\u301f'), u'\u301d')
+
+        # print u''.join(ucharlists['Ps']).encode('utf8')
+        # print u''.join(ucharlists['Pe']).encode('utf8')
+        # print u''.join(ucharlists['Pi']).encode('utf8')
+        # print u''.join(ucharlists['Pf']).encode('utf8')
+
+        # The Docutils character categories
+        # ---------------------------------
+        #
+        # The categorization of ASCII chars is non-standard to reduce
+        # both false positives and need for escaping. (see `inline markup
+        # recognition rules`_)
+
+        # allowed before markup if there is a matching closer
+        openers = [u'"\'(<\\[{']
+        for cat in ('Ps', 'Pi', 'Pf'):
+            openers.extend(ucharlists[cat])
+
+        # allowed after markup if there is a matching opener
+        closers = [u'"\')>\\]}']
+        for cat in ('Pe', 'Pf', 'Pi'):
+            closers.extend(ucharlists[cat])
+
+        # non-matching, allowed on both sides
+        delimiters = [u'\\-/:']
+        for cat in ('Pd', 'Po'):
+            delimiters.extend(ucharlists[cat])
+
+        # non-matching, after markup
+        closing_delimiters = [r'\\.,;!?']
+
+        # # Test open/close matching:
+        # for i in range(min(len(openers),len(closers))):
+        #     print '%4d    %s    %s' % (i, openers[i].encode('utf8'),
+        #                                closers[i].encode('utf8'))
+
+        return [u''.join(chars) for chars in (openers, closers, delimiters,
+                                              closing_delimiters)]
+
+    def separate_wide_chars(s):
+        """Return (s1,s2) with characters above 0xFFFF in s2"""
+        maxunicode_narrow = 0xFFFF
+        l1 = [ch for ch in s if ord(ch) <= maxunicode_narrow]
+        l2 = [ch for ch in s if ord(ch) > maxunicode_narrow]
+        return ''.join(l1), ''.join(l2)
+
+    def mark_intervals(s):
+        """Return s with shortcut notation for runs of consecutive characters
+
+        Sort string and replace 'cdef' by 'c-f' and similar.
+        """
+        l =[]
+        s = [ord(ch) for ch in s]
+        s.sort()
+        for n in s:
+            try:
+                if l[-1][-1]+1 == n:
+                    l[-1].append(n)
+                else:
+                    l.append([n])
+            except IndexError:
+                l.append([n])
+
+        l2 = []
+        for i in l:
+            i = [unichr(n) for n in i]
+            if len(i) > 2:
+                i = i[0], u'-', i[-1]
+            l2.extend(i)
+
+        return ''.join(l2)
+
+    def wrap_string(s, startstring= "(",
+                       endstring = ")", wrap=65):
+        """Line-wrap a unicode string literal definition."""
+        c = len(startstring)
+        contstring = "'\n" + ' ' * len(startstring) + "u'"
+        l = [startstring]
+        for ch in s:
+            c += 1
+            if ch == '\\' and c > wrap:
+                c = len(startstring)
+                ch = contstring + ch
+            l.append(ch)
+        l.append(endstring)
+        return ''.join(l)
+
+
+# print results
+# =============
+
+# (re) create and compare the samples:
+
+    (o, c, d, cd) = punctuation_samples()
+    o, o_wide = separate_wide_chars(o)
+    c, c_wide = separate_wide_chars(c)
+    d, d_wide = separate_wide_chars(d)
+    d = d[:5] + mark_intervals(d[5:])
+    d_wide = mark_intervals(d_wide)
+    if sys.maxunicode >= 0x10FFFF: # "wide" build
+        d += d_wide
+    if o != openers:
+        print '- openers = ur"""%s"""' % openers.encode('utf8')
+        print '+ openers = ur"""%s"""' % o.encode('utf8')
+    if o_wide:
+        print '+ openers-wide = ur"""%s"""' % o_wide.encode('utf8')
+    if c != closers:
+        print '- closers = ur"""%s"""' % closers.encode('utf8')
+        print '+ closers = ur"""%s"""' % c.encode('utf8')
+    if c_wide:
+        print '+ closers-wide = ur"""%s"""' % c_wide.encode('utf8')
+    if d != delimiters:
+        print '- delimiters = ur"%s"' % delimiters.encode('utf8')
+        print '+ delimiters = ur"%s"' % d.encode('utf8')
+    if cd != closing_delimiters:
+        print '- closing_delimiters = ur"%s"' % closing_delimiters.encode('utf8')
+        print '+ closing_delimiters = ur"%s"' % cd.encode('utf8')
+    # closing_delimiters are all ASCII characters
+
+# Print literal code to define the character sets:
+
+    # `openers` and `closers` must be verbose and keep order because they are
+    # also used in `match_chars()`.
+    print wrap_string(repr(o), startstring='openers = (')
+    print wrap_string(repr(c), startstring='closers = (')
+    # delimiters: sort and use shortcut for intervals (saves ~150 characters):
+    print wrap_string(repr(d), startstring='delimiters = (')
+    # add characters in the upper plane only in a "wide" build:
+    print 'if sys.maxunicode >= 0x10FFFF: # "wide" build'
+    print wrap_string(repr(d_wide), startstring='    delimiters += (')
+    print 'closing_delimiters =', repr(cd)
+
+# test prints
+
+    # print "wide" Unicode characters:
+    # ucharlists = unicode_charlists(unicode_punctuation_categories)
+    # for key in ucharlists:
+    #     if key.endswith('wide'):
+    #         print key, ucharlists[key]
+
+    # print 'openers = ', repr(openers)
+    # print 'closers = ', repr(closers)
+    # print 'delimiters = ', repr(delimiters)
+    # print 'closing_delimiters = ', repr(closing_delimiters)
+
+    # ucharlists = unicode_charlists(unicode_punctuation_categories)
+    # for cat, chars in ucharlists.items():
+    #     # print cat, chars
+    #     # compact output (visible with a comprehensive font):
+    #     print (u":%s: %s" % (cat, u''.join(chars))).encode('utf8')
+
+# verbose print
+
+    # print 'openers:'
+    # for ch in openers:
+    #     print ch.encode('utf8'), unicodedata.name(ch)
+    # print 'closers:'
+    # for ch in closers:
+    #     print ch.encode('utf8'), unicodedata.name(ch)
+    # print 'delimiters:'
+    # for ch in delimiters:
+    #     print ch.encode('utf8'), unicodedata.name(ch)
+    # print 'closing_delimiters:'
+    # for ch in closing_delimiters:
+    #     print ch.encode('utf8'), unicodedata.name(ch)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/roman.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/roman.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/roman.py	(revision 1126)
@@ -0,0 +1,81 @@
+"""Convert to and from Roman numerals"""
+
+__author__ = "Mark Pilgrim (f8dy@diveintopython.org)"
+__version__ = "1.4"
+__date__ = "8 August 2001"
+__copyright__ = """Copyright (c) 2001 Mark Pilgrim
+
+This program is part of "Dive Into Python", a free Python tutorial for
+experienced programmers.  Visit http://diveintopython.org/ for the
+latest version.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Python 2.1.1 license, available at
+http://www.python.org/2.1.1/license.html
+"""
+
+import re
+
+#Define exceptions
+class RomanError(Exception): pass
+class OutOfRangeError(RomanError): pass
+class NotIntegerError(RomanError): pass
+class InvalidRomanNumeralError(RomanError): pass
+
+#Define digit mapping
+romanNumeralMap = (('M',  1000),
+                   ('CM', 900),
+                   ('D',  500),
+                   ('CD', 400),
+                   ('C',  100),
+                   ('XC', 90),
+                   ('L',  50),
+                   ('XL', 40),
+                   ('X',  10),
+                   ('IX', 9),
+                   ('V',  5),
+                   ('IV', 4),
+                   ('I',  1))
+
+def toRoman(n):
+    """convert integer to Roman numeral"""
+    if not (0 < n < 5000):
+        raise OutOfRangeError, "number out of range (must be 1..4999)"
+    if int(n) != n:
+        raise NotIntegerError, "decimals can not be converted"
+
+    result = ""
+    for numeral, integer in romanNumeralMap:
+        while n >= integer:
+            result += numeral
+            n -= integer
+    return result
+
+#Define pattern to detect valid Roman numerals
+romanNumeralPattern = re.compile("""
+    ^                   # beginning of string
+    M{0,4}              # thousands - 0 to 4 M's
+    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
+                        #            or 500-800 (D, followed by 0 to 3 C's)
+    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
+                        #        or 50-80 (L, followed by 0 to 3 X's)
+    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
+                        #        or 5-8 (V, followed by 0 to 3 I's)
+    $                   # end of string
+    """ ,re.VERBOSE)
+
+def fromRoman(s):
+    """convert Roman numeral to integer"""
+    if not s:
+        raise InvalidRomanNumeralError, 'Input can not be blank'
+    if not romanNumeralPattern.search(s):
+        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
+
+    result = 0
+    index = 0
+    for numeral, integer in romanNumeralMap:
+        while s[index:index+len(numeral)] == numeral:
+            result += integer
+            index += len(numeral)
+    return result
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/__init__.py	(revision 1126)
@@ -0,0 +1,749 @@
+# coding: utf-8
+# $Id: __init__.py 7668 2013-06-04 12:46:30Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous utilities for the documentation utilities.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import os.path
+import re
+import warnings
+import unicodedata
+from docutils import ApplicationError, DataError
+from docutils import nodes
+import docutils.io
+from docutils.utils.error_reporting import ErrorOutput, SafeString
+
+
+class SystemMessage(ApplicationError):
+
+    def __init__(self, system_message, level):
+        Exception.__init__(self, system_message.astext())
+        self.level = level
+
+
+class SystemMessagePropagation(ApplicationError): pass
+
+
+class Reporter:
+
+    """
+    Info/warning/error reporter and ``system_message`` element generator.
+
+    Five levels of system messages are defined, along with corresponding
+    methods: `debug()`, `info()`, `warning()`, `error()`, and `severe()`.
+
+    There is typically one Reporter object per process.  A Reporter object is
+    instantiated with thresholds for reporting (generating warnings) and
+    halting processing (raising exceptions), a switch to turn debug output on
+    or off, and an I/O stream for warnings.  These are stored as instance
+    attributes.
+
+    When a system message is generated, its level is compared to the stored
+    thresholds, and a warning or error is generated as appropriate.  Debug
+    messages are produced if the stored debug switch is on, independently of
+    other thresholds.  Message output is sent to the stored warning stream if
+    not set to ''.
+
+    The Reporter class also employs a modified form of the "Observer" pattern
+    [GoF95]_ to track system messages generated.  The `attach_observer` method
+    should be called before parsing, with a bound method or function which
+    accepts system messages.  The observer can be removed with
+    `detach_observer`, and another added in its place.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    levels = 'DEBUG INFO WARNING ERROR SEVERE'.split()
+    """List of names for system message levels, indexed by level."""
+
+    # system message level constants:
+    (DEBUG_LEVEL,
+     INFO_LEVEL,
+     WARNING_LEVEL,
+     ERROR_LEVEL,
+     SEVERE_LEVEL) = range(5)
+
+    def __init__(self, source, report_level, halt_level, stream=None,
+                 debug=False, encoding=None, error_handler='backslashreplace'):
+        """
+        :Parameters:
+            - `source`: The path to or description of the source data.
+            - `report_level`: The level at or above which warning output will
+              be sent to `stream`.
+            - `halt_level`: The level at or above which `SystemMessage`
+              exceptions will be raised, halting execution.
+            - `debug`: Show debug (level=0) system messages?
+            - `stream`: Where warning output is sent.  Can be file-like (has a
+              ``.write`` method), a string (file name, opened for writing),
+              '' (empty string) or `False` (for discarding all stream messages)
+              or `None` (implies `sys.stderr`; default).
+            - `encoding`: The output encoding.
+            - `error_handler`: The error handler for stderr output encoding.
+        """
+
+        self.source = source
+        """The path to or description of the source data."""
+
+        self.error_handler = error_handler
+        """The character encoding error handler."""
+
+        self.debug_flag = debug
+        """Show debug (level=0) system messages?"""
+
+        self.report_level = report_level
+        """The level at or above which warning output will be sent
+        to `self.stream`."""
+
+        self.halt_level = halt_level
+        """The level at or above which `SystemMessage` exceptions
+        will be raised, halting execution."""
+
+        if not isinstance(stream, ErrorOutput):
+            stream = ErrorOutput(stream, encoding, error_handler)
+
+        self.stream = stream
+        """Where warning output is sent."""
+
+        self.encoding = encoding or getattr(stream, 'encoding', 'ascii')
+        """The output character encoding."""
+
+        self.observers = []
+        """List of bound methods or functions to call with each system_message
+        created."""
+
+        self.max_level = -1
+        """The highest level system message generated so far."""
+
+    def set_conditions(self, category, report_level, halt_level,
+                       stream=None, debug=False):
+        warnings.warn('docutils.utils.Reporter.set_conditions deprecated; '
+                      'set attributes via configuration settings or directly',
+                      DeprecationWarning, stacklevel=2)
+        self.report_level = report_level
+        self.halt_level = halt_level
+        if not isinstance(stream, ErrorOutput):
+            stream = ErrorOutput(stream, self.encoding, self.error_handler)
+        self.stream = stream
+        self.debug_flag = debug
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes one
+        argument, a `nodes.system_message` instance.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self, message):
+        for observer in self.observers:
+            observer(message)
+
+    def system_message(self, level, message, *children, **kwargs):
+        """
+        Return a system_message object.
+
+        Raise an exception or generate a warning if appropriate.
+        """
+        # `message` can be a `string`, `unicode`, or `Exception` instance.
+        if isinstance(message, Exception):
+            message = SafeString(message)
+
+        attributes = kwargs.copy()
+        if 'base_node' in kwargs:
+            source, line = get_source_line(kwargs['base_node'])
+            del attributes['base_node']
+            if source is not None:
+                attributes.setdefault('source', source)
+            if line is not None:
+                attributes.setdefault('line', line)
+                # assert source is not None, "node has line- but no source-argument"
+        if not 'source' in attributes: # 'line' is absolute line number
+            try: # look up (source, line-in-source)
+                source, line = self.get_source_and_line(attributes.get('line'))
+                # print "locator lookup", kwargs.get('line'), "->", source, line
+            except AttributeError:
+                source, line = None, None
+            if source is not None:
+                attributes['source'] = source
+            if line is not None:
+                attributes['line'] = line
+        # assert attributes['line'] is not None, (message, kwargs)
+        # assert attributes['source'] is not None, (message, kwargs)
+        attributes.setdefault('source', self.source)
+
+        msg = nodes.system_message(message, level=level,
+                                   type=self.levels[level],
+                                   *children, **attributes)
+        if self.stream and (level >= self.report_level
+                            or self.debug_flag and level == self.DEBUG_LEVEL
+                            or level >= self.halt_level):
+            self.stream.write(msg.astext() + '\n')
+        if level >= self.halt_level:
+            raise SystemMessage(msg, level)
+        if level > self.DEBUG_LEVEL or self.debug_flag:
+            self.notify_observers(msg)
+        self.max_level = max(level, self.max_level)
+        return msg
+
+    def debug(self, *args, **kwargs):
+        """
+        Level-0, "DEBUG": an internal reporting issue. Typically, there is no
+        effect on the processing. Level-0 system messages are handled
+        separately from the others.
+        """
+        if self.debug_flag:
+            return self.system_message(self.DEBUG_LEVEL, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        """
+        Level-1, "INFO": a minor issue that can be ignored. Typically there is
+        no effect on processing, and level-1 system messages are not reported.
+        """
+        return self.system_message(self.INFO_LEVEL, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        """
+        Level-2, "WARNING": an issue that should be addressed. If ignored,
+        there may be unpredictable problems with the output.
+        """
+        return self.system_message(self.WARNING_LEVEL, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        """
+        Level-3, "ERROR": an error that should be addressed. If ignored, the
+        output will contain errors.
+        """
+        return self.system_message(self.ERROR_LEVEL, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        """
+        Level-4, "SEVERE": a severe error that must be addressed. If ignored,
+        the output will contain severe errors. Typically level-4 system
+        messages are turned into exceptions which halt processing.
+        """
+        return self.system_message(self.SEVERE_LEVEL, *args, **kwargs)
+
+
+class ExtensionOptionError(DataError): pass
+class BadOptionError(ExtensionOptionError): pass
+class BadOptionDataError(ExtensionOptionError): pass
+class DuplicateOptionError(ExtensionOptionError): pass
+
+
+def extract_extension_options(field_list, options_spec):
+    """
+    Return a dictionary mapping extension option names to converted values.
+
+    :Parameters:
+        - `field_list`: A flat field list without field arguments, where each
+          field body consists of a single paragraph only.
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `ValueError` for invalid option values (raised by the conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+        - `DuplicateOptionError` for duplicate options.
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = extract_options(field_list)
+    option_dict = assemble_option_dict(option_list, options_spec)
+    return option_dict
+
+def extract_options(field_list):
+    """
+    Return a list of option (name, value) pairs from field names & bodies.
+
+    :Parameter:
+        `field_list`: A flat field list, where each field name is a single
+        word and each field body consists of a single paragraph only.
+
+    :Exceptions:
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = []
+    for field in field_list:
+        if len(field[0].astext().split()) != 1:
+            raise BadOptionError(
+                'extension option field name may not contain multiple words')
+        name = str(field[0].astext().lower())
+        body = field[1]
+        if len(body) == 0:
+            data = None
+        elif len(body) > 1 or not isinstance(body[0], nodes.paragraph) \
+              or len(body[0]) != 1 or not isinstance(body[0][0], nodes.Text):
+            raise BadOptionDataError(
+                  'extension option field body may contain\n'
+                  'a single paragraph only (option "%s")' % name)
+        else:
+            data = body[0][0].astext()
+        option_list.append((name, data))
+    return option_list
+
+def assemble_option_dict(option_list, options_spec):
+    """
+    Return a mapping of option names to values.
+
+    :Parameters:
+        - `option_list`: A list of (name, value) pairs (the output of
+          `extract_options()`).
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `DuplicateOptionError` for duplicate options.
+        - `ValueError` for invalid option values (raised by conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+    """
+    options = {}
+    for name, value in option_list:
+        convertor = options_spec[name]  # raises KeyError if unknown
+        if convertor is None:
+            raise KeyError(name)        # or if explicitly disabled
+        if name in options:
+            raise DuplicateOptionError('duplicate option "%s"' % name)
+        try:
+            options[name] = convertor(value)
+        except (ValueError, TypeError), detail:
+            raise detail.__class__('(option: "%s"; value: %r)\n%s'
+                                   % (name, value, ' '.join(detail.args)))
+    return options
+
+
+class NameValueError(DataError): pass
+
+
+def decode_path(path):
+    """
+    Ensure `path` is Unicode. Return `nodes.reprunicode` object.
+
+    Decode file/path string in a failsave manner if not already done.
+    """
+    # see also http://article.gmane.org/gmane.text.docutils.user/2905
+    if isinstance(path, unicode):
+        return path
+    try:
+        path = path.decode(sys.getfilesystemencoding(), 'strict')
+    except AttributeError: # default value None has no decode method
+        return nodes.reprunicode(path)
+    except UnicodeDecodeError:
+        try:
+            path = path.decode('utf-8', 'strict')
+        except UnicodeDecodeError:
+            path = path.decode('ascii', 'replace')
+    return nodes.reprunicode(path)
+
+
+def extract_name_value(line):
+    """
+    Return a list of (name, value) from a line of the form "name=value ...".
+
+    :Exception:
+        `NameValueError` for invalid input (missing name, missing data, bad
+        quotes, etc.).
+    """
+    attlist = []
+    while line:
+        equals = line.find('=')
+        if equals == -1:
+            raise NameValueError('missing "="')
+        attname = line[:equals].strip()
+        if equals == 0 or not attname:
+            raise NameValueError(
+                  'missing attribute name before "="')
+        line = line[equals+1:].lstrip()
+        if not line:
+            raise NameValueError(
+                  'missing value after "%s="' % attname)
+        if line[0] in '\'"':
+            endquote = line.find(line[0], 1)
+            if endquote == -1:
+                raise NameValueError(
+                      'attribute "%s" missing end quote (%s)'
+                      % (attname, line[0]))
+            if len(line) > endquote + 1 and line[endquote + 1].strip():
+                raise NameValueError(
+                      'attribute "%s" end quote (%s) not followed by '
+                      'whitespace' % (attname, line[0]))
+            data = line[1:endquote]
+            line = line[endquote+1:].lstrip()
+        else:
+            space = line.find(' ')
+            if space == -1:
+                data = line
+                line = ''
+            else:
+                data = line[:space]
+                line = line[space+1:].lstrip()
+        attlist.append((attname.lower(), data))
+    return attlist
+
+def new_reporter(source_path, settings):
+    """
+    Return a new Reporter object.
+
+    :Parameters:
+        `source` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.
+    """
+    reporter = Reporter(
+        source_path, settings.report_level, settings.halt_level,
+        stream=settings.warning_stream, debug=settings.debug,
+        encoding=settings.error_encoding,
+        error_handler=settings.error_encoding_error_handler)
+    return reporter
+
+def new_document(source_path, settings=None):
+    """
+    Return a new empty document object.
+
+    :Parameters:
+        `source_path` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.  If none are provided, a default core set will
+            be used.  If you will use the document object with any Docutils
+            components, you must provide their default settings as well.  For
+            example, if parsing, at least provide the parser settings,
+            obtainable as follows::
+
+                settings = docutils.frontend.OptionParser(
+                    components=(docutils.parsers.rst.Parser,)
+                    ).get_default_values()
+    """
+    from docutils import frontend
+    if settings is None:
+        settings = frontend.OptionParser().get_default_values()
+    source_path = decode_path(source_path)
+    reporter = new_reporter(source_path, settings)
+    document = nodes.document(settings, reporter, source=source_path)
+    document.note_source(source_path, -1)
+    return document
+
+def clean_rcs_keywords(paragraph, keyword_substitutions):
+    if len(paragraph) == 1 and isinstance(paragraph[0], nodes.Text):
+        textnode = paragraph[0]
+        for pattern, substitution in keyword_substitutions:
+            match = pattern.search(textnode)
+            if match:
+                paragraph[0] = nodes.Text(pattern.sub(substitution, textnode))
+                return
+
+def relative_path(source, target):
+    """
+    Build and return a path to `target`, relative to `source` (both files).
+
+    If there is no common prefix, return the absolute path to `target`.
+    """
+    source_parts = os.path.abspath(source or type(target)('dummy_file')
+                                  ).split(os.sep)
+    target_parts = os.path.abspath(target).split(os.sep)
+    # Check first 2 parts because '/dir'.split('/') == ['', 'dir']:
+    if source_parts[:2] != target_parts[:2]:
+        # Nothing in common between paths.
+        # Return absolute path, using '/' for URLs:
+        return '/'.join(target_parts)
+    source_parts.reverse()
+    target_parts.reverse()
+    while (source_parts and target_parts
+           and source_parts[-1] == target_parts[-1]):
+        # Remove path components in common:
+        source_parts.pop()
+        target_parts.pop()
+    target_parts.reverse()
+    parts = ['..'] * (len(source_parts) - 1) + target_parts
+    return '/'.join(parts)
+
+def get_stylesheet_reference(settings, relative_to=None):
+    """
+    Retrieve a stylesheet reference from the settings object.
+
+    Deprecated. Use get_stylesheet_list() instead to
+    enable specification of multiple stylesheets as a comma-separated
+    list.
+    """
+    if settings.stylesheet_path:
+        assert not settings.stylesheet, (
+            'stylesheet and stylesheet_path are mutually exclusive.')
+        if relative_to == None:
+            relative_to = settings._destination
+        return relative_path(relative_to, settings.stylesheet_path)
+    else:
+        return settings.stylesheet
+
+# Return 'stylesheet' or 'stylesheet_path' arguments as list.
+#
+# The original settings arguments are kept unchanged: you can test
+# with e.g. ``if settings.stylesheet_path:``
+#
+# Differences to ``get_stylesheet_reference``:
+# * return value is a list
+# * no re-writing of the path (and therefore no optional argument)
+#   (if required, use ``utils.relative_path(source, target)``
+#   in the calling script)
+def get_stylesheet_list(settings):
+    """
+    Retrieve list of stylesheet references from the settings object.
+    """
+    assert not (settings.stylesheet and settings.stylesheet_path), (
+            'stylesheet and stylesheet_path are mutually exclusive.')
+    stylesheets = settings.stylesheet_path or settings.stylesheet or []
+    # programmatically set default can be string or unicode:
+    if not isinstance(stylesheets, list):
+        stylesheets = [path.strip() for path in stylesheets.split(',')]
+    # expand relative paths if found in stylesheet-dirs:
+    return [find_file_in_dirs(path, settings.stylesheet_dirs)
+            for path in stylesheets]
+
+def find_file_in_dirs(path, dirs):
+    """
+    Search for `path` in the list of directories `dirs`.
+
+    Return the first expansion that matches an existing file.
+    """
+    if os.path.isabs(path):
+        return path
+    for d in dirs:
+        if d == '.':
+            f = path
+        else:
+            d = os.path.expanduser(d)
+            f = os.path.join(d, path)
+        if os.path.exists(f):
+            return f
+    return path
+
+def get_trim_footnote_ref_space(settings):
+    """
+    Return whether or not to trim footnote space.
+
+    If trim_footnote_reference_space is not None, return it.
+
+    If trim_footnote_reference_space is None, return False unless the
+    footnote reference style is 'superscript'.
+    """
+    if settings.trim_footnote_reference_space is None:
+        return hasattr(settings, 'footnote_references') and \
+               settings.footnote_references == 'superscript'
+    else:
+        return settings.trim_footnote_reference_space
+
+def get_source_line(node):
+    """
+    Return the "source" and "line" attributes from the `node` given or from
+    its closest ancestor.
+    """
+    while node:
+        if node.source or node.line:
+            return node.source, node.line
+        node = node.parent
+    return None, None
+
+def escape2null(text):
+    """Return a string with escape-backslashes converted to nulls."""
+    parts = []
+    start = 0
+    while True:
+        found = text.find('\\', start)
+        if found == -1:
+            parts.append(text[start:])
+            return ''.join(parts)
+        parts.append(text[start:found])
+        parts.append('\x00' + text[found+1:found+2])
+        start = found + 2               # skip character after escape
+
+def unescape(text, restore_backslashes=False):
+    """
+    Return a string with nulls removed or restored to backslashes.
+    Backslash-escaped spaces are also removed.
+    """
+    if restore_backslashes:
+        return text.replace('\x00', '\\')
+    else:
+        for sep in ['\x00 ', '\x00\n', '\x00']:
+            text = ''.join(text.split(sep))
+        return text
+
+def strip_combining_chars(text):
+    if isinstance(text, str) and sys.version_info < (3,0):
+        return text
+    return u''.join([c for c in text if not unicodedata.combining(c)])
+
+def find_combining_chars(text):
+    """Return indices of all combining chars in  Unicode string `text`.
+
+    >>> find_combining_chars(u'A t̆ab̆lĕ')
+    [3, 6, 9]
+    """
+    if isinstance(text, str) and sys.version_info < (3,0):
+        return []
+    return [i for i,c in enumerate(text) if unicodedata.combining(c)]
+
+def column_indices(text):
+    """Indices of Unicode string `text` when skipping combining characters.
+
+    >>> column_indices(u'A t̆ab̆lĕ')
+    [0, 1, 2, 4, 5, 7, 8]
+    """
+    # TODO: account for asian wide chars here instead of using dummy
+    # replacements in the tableparser?
+    string_indices = range(len(text))
+    for index in find_combining_chars(text):
+        string_indices[index] = None
+    return [i for i in string_indices if i is not None]
+
+east_asian_widths = {'W': 2,   # Wide
+                     'F': 2,   # Full-width (wide)
+                     'Na': 1,  # Narrow
+                     'H': 1,   # Half-width (narrow)
+                     'N': 1,   # Neutral (not East Asian, treated as narrow)
+                     'A': 1}   # Ambiguous (s/b wide in East Asian context,
+                               # narrow otherwise, but that doesn't work)
+"""Mapping of result codes from `unicodedata.east_asian_widt()` to character
+column widths."""
+
+def column_width(text):
+    """Return the column width of text.
+
+    Correct ``len(text)`` for wide East Asian and combining Unicode chars.
+    """
+    if isinstance(text, str) and sys.version_info < (3,0):
+        return len(text)
+    try:
+        width = sum([east_asian_widths[unicodedata.east_asian_width(c)]
+                     for c in text])
+    except AttributeError:  # east_asian_width() New in version 2.4.
+        width = len(text)
+    # correction for combining chars:
+    width -= len(find_combining_chars(text))
+    return width
+
+def uniq(L):
+     r = []
+     for item in L:
+         if not item in r:
+             r.append(item)
+     return r
+
+# by Li Daobing http://code.activestate.com/recipes/190465/
+# since Python 2.6 there is also itertools.combinations()
+def unique_combinations(items, n):
+    """Return n-length tuples, in sorted order, no repeated elements"""
+    if n==0: yield []
+    else:
+        for i in xrange(len(items)-n+1):
+            for cc in unique_combinations(items[i+1:],n-1):
+                yield [items[i]]+cc
+
+def normalize_language_tag(tag):
+    """Return a list of normalized combinations for a `BCP 47` language tag.
+
+    Example:
+
+    >>> normalize_language_tag('de_AT-1901')
+    ['de-at-1901', 'de-at', 'de-1901', 'de']
+    """
+    # normalize:
+    tag = tag.lower().replace('_','-')
+    # split (except singletons, which mark the following tag as non-standard):
+    tag = re.sub(r'-([a-zA-Z0-9])-', r'-\1_', tag)
+    taglist = []
+    subtags = [subtag.replace('_', '-') for subtag in tag.split('-')]
+    base_tag = [subtags.pop(0)]
+    # find all combinations of subtags
+    for n in range(len(subtags), 0, -1):
+        for tags in unique_combinations(subtags, n):
+            taglist.append('-'.join(base_tag+tags))
+    taglist += base_tag
+    return taglist
+
+
+class DependencyList(object):
+
+    """
+    List of dependencies, with file recording support.
+
+    Note that the output file is not automatically closed.  You have
+    to explicitly call the close() method.
+    """
+
+    def __init__(self, output_file=None, dependencies=[]):
+        """
+        Initialize the dependency list, automatically setting the
+        output file to `output_file` (see `set_output()`) and adding
+        all supplied dependencies.
+        """
+        self.set_output(output_file)
+        for i in dependencies:
+            self.add(i)
+
+    def set_output(self, output_file):
+        """
+        Set the output file and clear the list of already added
+        dependencies.
+
+        `output_file` must be a string.  The specified file is
+        immediately overwritten.
+
+        If output_file is '-', the output will be written to stdout.
+        If it is None, no file output is done when calling add().
+        """
+        self.list = []
+        if output_file:
+            if output_file == '-':
+                of = None
+            else:
+                of = output_file
+            self.file = docutils.io.FileOutput(destination_path=of,
+                                   encoding='utf8', autoclose=False)
+        else:
+            self.file = None
+
+    def add(self, *filenames):
+        """
+        If the dependency `filename` has not already been added,
+        append it to self.list and print it to self.file if self.file
+        is not None.
+        """
+        for filename in filenames:
+            if not filename in self.list:
+                self.list.append(filename)
+                if self.file is not None:
+                    self.file.write(filename+'\n')
+
+    def close(self):
+        """
+        Close the output file.
+        """
+        self.file.close()
+        self.file = None
+
+    def __repr__(self):
+        try:
+            output_file = self.file.name
+        except AttributeError:
+            output_file = None
+        return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/code_analyzer.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/code_analyzer.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/code_analyzer.py	(revision 1126)
@@ -0,0 +1,134 @@
+#!/usr/bin/python
+# coding: utf-8
+
+"""Lexical analysis of formal languages (i.e. code) using Pygments."""
+
+# :Author: Georg Brandl; Felix Wiemann; Günter Milde
+# :Date: $Date: 2015-04-20 14:05:27 +0000 (Mon, 20 Apr 2015) $
+# :Copyright: This module has been placed in the public domain.
+
+from docutils import ApplicationError
+try:
+    import pygments
+    from pygments.lexers import get_lexer_by_name
+    from pygments.formatters.html import _get_ttype_class
+    with_pygments = True
+except (ImportError, SyntaxError): # pygments 2.0.1 fails with Py 3.1 and 3.2
+    with_pygments = False
+
+# Filter the following token types from the list of class arguments:
+unstyled_tokens = ['token', # Token (base token type)
+                   'text',  # Token.Text
+                   '']      # short name for Token and Text
+# (Add, e.g., Token.Punctuation with ``unstyled_tokens += 'punctuation'``.)
+
+class LexerError(ApplicationError): 
+    pass
+
+class Lexer(object):
+    """Parse `code` lines and yield "classified" tokens.
+
+    Arguments
+
+      code       -- string of source code to parse,
+      language   -- formal language the code is written in,
+      tokennames -- either 'long', 'short', or '' (see below).
+
+    Merge subsequent tokens of the same token-type.
+
+    Iterating over an instance yields the tokens as ``(tokentype, value)``
+    tuples. The value of `tokennames` configures the naming of the tokentype:
+
+      'long':  downcased full token type name,
+      'short': short name defined by pygments.token.STANDARD_TYPES
+               (= class argument used in pygments html output),
+      'none':      skip lexical analysis.
+    """
+
+    def __init__(self, code, language, tokennames='short'):
+        """
+        Set up a lexical analyzer for `code` in `language`.
+        """
+        self.code = code
+        self.language = language
+        self.tokennames = tokennames
+        self.lexer = None
+        # get lexical analyzer for `language`:
+        if language in ('', 'text') or tokennames == 'none':
+            return
+        if not with_pygments:
+            raise LexerError('Cannot analyze code. '
+                                    'Pygments package not found.')
+        try:
+            self.lexer = get_lexer_by_name(self.language)
+        except pygments.util.ClassNotFound:
+            raise LexerError('Cannot analyze code. '
+                'No Pygments lexer found for "%s".' % language)
+
+    # Since version 1.2. (released Jan 01, 2010) Pygments has a
+    # TokenMergeFilter. However, this requires Python >= 2.4. When Docutils
+    # requires same minimal version,  ``self.merge(tokens)`` in __iter__ can
+    # be replaced by ``self.lexer.add_filter('tokenmerge')`` in __init__.
+    def merge(self, tokens):
+        """Merge subsequent tokens of same token-type.
+
+           Also strip the final newline (added by pygments).
+        """
+        tokens = iter(tokens)
+        (lasttype, lastval) = tokens.next()
+        for ttype, value in tokens:
+            if ttype is lasttype:
+                lastval += value
+            else:
+                yield(lasttype, lastval)
+                (lasttype, lastval) = (ttype, value)
+        if lastval.endswith('\n'):
+            lastval = lastval[:-1]
+        if lastval:
+            yield(lasttype, lastval)
+
+    def __iter__(self):
+        """Parse self.code and yield "classified" tokens.
+        """
+        if self.lexer is None:
+            yield ([], self.code)
+            return
+        tokens = pygments.lex(self.code, self.lexer)
+        for tokentype, value in self.merge(tokens):
+            if self.tokennames == 'long': # long CSS class args
+                classes = str(tokentype).lower().split('.')
+            else: # short CSS class args
+                classes = [_get_ttype_class(tokentype)]
+            classes = [cls for cls in classes if cls not in unstyled_tokens]
+            yield (classes, value)
+
+
+class NumberLines(object):
+    """Insert linenumber-tokens at the start of every code line.
+
+    Arguments
+
+       tokens    -- iterable of ``(classes, value)`` tuples
+       startline -- first line number
+       endline   -- last line number
+
+    Iterating over an instance yields the tokens with a
+    ``(['ln'], '<the line number>')`` token added for every code line.
+    Multi-line tokens are splitted."""
+
+    def __init__(self, tokens, startline, endline):
+        self.tokens = tokens
+        self.startline = startline
+        # pad linenumbers, e.g. endline == 100 -> fmt_str = '%3d '
+        self.fmt_str = '%%%dd ' % len(str(endline))
+
+    def __iter__(self):
+        lineno = self.startline
+        yield (['ln'], self.fmt_str % lineno)
+        for ttype, value in self.tokens:
+            lines = value.split('\n')
+            for line in lines[:-1]:
+                yield (ttype, line + '\n')
+                lineno += 1
+                yield (['ln'], self.fmt_str % lineno)
+            yield (ttype, lines[-1])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/error_reporting.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/error_reporting.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/error_reporting.py	(revision 1126)
@@ -0,0 +1,223 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# :Id: $Id: error_reporting.py 7947 2016-07-22 08:49:52Z milde $
+# :Copyright: © 2011 Günter Milde.
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+#
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+"""
+Error reporting should be safe from encoding/decoding errors.
+However, implicit conversions of strings and exceptions like
+
+>>> u'%s world: %s' % ('H\xe4llo', Exception(u'H\xe4llo')
+
+fail in some Python versions:
+
+* In Python <= 2.6, ``unicode(<exception instance>)`` uses
+  `__str__` and fails with non-ASCII chars in`unicode` arguments.
+  (work around http://bugs.python.org/issue2517):
+
+* In Python 2, unicode(<exception instance>) fails, with non-ASCII
+  chars in arguments. (Use case: in some locales, the errstr
+  argument of IOError contains non-ASCII chars.)
+
+* In Python 2, str(<exception instance>) fails, with non-ASCII chars
+  in `unicode` arguments.
+
+The `SafeString`, `ErrorString` and `ErrorOutput` classes handle
+common exceptions.
+"""
+
+import sys, codecs
+
+# Guess the locale's encoding.
+# If no valid guess can be made, locale_encoding is set to `None`:
+try:
+    import locale # module missing in Jython
+except ImportError:
+    locale_encoding = None
+else:
+    try:
+        locale_encoding = locale.getlocale()[1] or locale.getdefaultlocale()[1]
+        # locale.getpreferredencoding([do_setlocale=True|False])
+        # has side-effects | might return a wrong guess.
+        # (cf. Update 1 in http://stackoverflow.com/questions/4082645/using-python-2-xs-locale-module-to-format-numbers-and-currency)
+    except ValueError, error: # OS X may set UTF-8 without language code
+        # see http://bugs.python.org/issue18378
+        # and https://sourceforge.net/p/docutils/bugs/298/
+        if "unknown locale: UTF-8" in error.args:
+            locale_encoding = "UTF-8"
+    except: # any other problems determining the locale -> use None
+        locale_encoding = None
+    try:
+        codecs.lookup(locale_encoding or '') # None -> ''
+    except LookupError:
+        locale_encoding = None
+
+
+
+class SafeString(object):
+    """
+    A wrapper providing robust conversion to `str` and `unicode`.
+    """
+
+    def __init__(self, data, encoding=None, encoding_errors='backslashreplace',
+                 decoding_errors='replace'):
+        self.data = data
+        self.encoding = (encoding or getattr(data, 'encoding', None) or
+                         locale_encoding or 'ascii')
+        self.encoding_errors = encoding_errors
+        self.decoding_errors = decoding_errors
+
+
+    def __str__(self):
+        try:
+            return str(self.data)
+        except UnicodeEncodeError:
+            if isinstance(self.data, Exception):
+                args = [str(SafeString(arg, self.encoding,
+                                        self.encoding_errors))
+                        for arg in self.data.args]
+                return ', '.join(args)
+            if isinstance(self.data, unicode):
+                if sys.version_info > (3,0):
+                    return self.data
+                else:
+                    return self.data.encode(self.encoding,
+                                            self.encoding_errors)
+            raise
+
+    def __unicode__(self):
+        """
+        Return unicode representation of `self.data`.
+
+        Try ``unicode(self.data)``, catch `UnicodeError` and
+
+        * if `self.data` is an Exception instance, work around
+          http://bugs.python.org/issue2517 with an emulation of
+          Exception.__unicode__,
+
+        * else decode with `self.encoding` and `self.decoding_errors`.
+        """
+        try:
+            u = unicode(self.data)
+            if isinstance(self.data, EnvironmentError):
+                u = u.replace(": u'", ": '") # normalize filename quoting
+            return u
+        except UnicodeError, error: # catch ..Encode.. and ..Decode.. errors
+            if isinstance(self.data, EnvironmentError):
+                return  u"[Errno %s] %s: '%s'" % (self.data.errno,
+                    SafeString(self.data.strerror, self.encoding,
+                               self.decoding_errors),
+                    SafeString(self.data.filename, self.encoding,
+                               self.decoding_errors))
+            if isinstance(self.data, Exception):
+                args = [unicode(SafeString(arg, self.encoding,
+                            decoding_errors=self.decoding_errors))
+                        for arg in self.data.args]
+                return u', '.join(args)
+            if isinstance(error, UnicodeDecodeError):
+                return unicode(self.data, self.encoding, self.decoding_errors)
+            raise
+
+class ErrorString(SafeString):
+    """
+    Safely report exception type and message.
+    """
+    def __str__(self):
+        return '%s: %s' % (self.data.__class__.__name__,
+                            super(ErrorString, self).__str__())
+
+    def __unicode__(self):
+        return u'%s: %s' % (self.data.__class__.__name__,
+                            super(ErrorString, self).__unicode__())
+
+
+class ErrorOutput(object):
+    """
+    Wrapper class for file-like error streams with
+    failsave de- and encoding of `str`, `bytes`, `unicode` and
+    `Exception` instances.
+    """
+
+    def __init__(self, stream=None, encoding=None,
+                 encoding_errors='backslashreplace',
+                 decoding_errors='replace'):
+        """
+        :Parameters:
+            - `stream`: a file-like object,
+                        a string (path to a file),
+                        `None` (write to `sys.stderr`, default), or
+                        evaluating to `False` (write() requests are ignored).
+            - `encoding`: `stream` text encoding. Guessed if None.
+            - `encoding_errors`: how to treat encoding errors.
+        """
+        if stream is None:
+            stream = sys.stderr
+        elif not(stream):
+            stream = False
+        # if `stream` is a file name, open it
+        elif isinstance(stream, str):
+            stream = open(stream, 'w')
+        elif isinstance(stream, unicode):
+            stream = open(stream.encode(sys.getfilesystemencoding()), 'w')
+
+        self.stream = stream
+        """Where warning output is sent."""
+
+        self.encoding = (encoding or getattr(stream, 'encoding', None) or
+                         locale_encoding or 'ascii')
+        """The output character encoding."""
+
+        self.encoding_errors = encoding_errors
+        """Encoding error handler."""
+
+        self.decoding_errors = decoding_errors
+        """Decoding error handler."""
+
+    def write(self, data):
+        """
+        Write `data` to self.stream. Ignore, if self.stream is False.
+
+        `data` can be a `string`, `unicode`, or `Exception` instance.
+        """
+        if self.stream is False:
+            return
+        if isinstance(data, Exception):
+            data = unicode(SafeString(data, self.encoding,
+                                  self.encoding_errors, self.decoding_errors))
+        try:
+            self.stream.write(data)
+        except UnicodeEncodeError:
+            self.stream.write(data.encode(self.encoding, self.encoding_errors))
+        except TypeError: 
+            if isinstance(data, unicode): # passed stream may expect bytes
+                self.stream.write(data.encode(self.encoding, 
+                                              self.encoding_errors))
+                return
+            if self.stream in (sys.stderr, sys.stdout):
+                self.stream.buffer.write(data) # write bytes to raw stream
+            else:
+                self.stream.write(unicode(data, self.encoding,
+                                          self.decoding_errors))
+
+    def close(self):
+        """
+        Close the error-output stream.
+
+        Ignored if the stream is` sys.stderr` or `sys.stdout` or has no
+        close() method.
+        """
+        if self.stream in (sys.stdout, sys.stderr):
+            return
+        try:
+            self.stream.close()
+        except AttributeError:
+            pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/tex2mathml_extern.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/tex2mathml_extern.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/tex2mathml_extern.py	(revision 1126)
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# :Id: $Id: tex2mathml_extern.py 7861 2015-04-10 23:48:51Z milde $
+# :Copyright: © 2015 Günter Milde.
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+#
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+# Wrappers for TeX->MathML conversion by external tools
+# =====================================================
+
+import subprocess
+
+document_template = r"""\documentclass{article}
+\usepackage{amsmath}
+\begin{document}
+%s
+\end{document}
+"""
+
+def latexml(math_code, reporter=None):
+    """Convert LaTeX math code to MathML with LaTeXML_
+    
+    .. _LaTeXML: http://dlmf.nist.gov/LaTeXML/
+    """
+    p = subprocess.Popen(['latexml',
+                             '-', # read from stdin
+                             # '--preload=amsmath',
+                             '--inputencoding=utf8',
+                            ],
+                            stdin=subprocess.PIPE,
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.PIPE,
+                            close_fds=True)
+    p.stdin.write((document_template % math_code).encode('utf8'))
+    p.stdin.close()
+    latexml_code = p.stdout.read()
+    latexml_err = p.stderr.read().decode('utf8')
+    if reporter and latexml_err.find('Error') >= 0 or not latexml_code:
+        reporter.error(latexml_err)
+
+    post_p = subprocess.Popen(['latexmlpost',
+                               '-',
+                               '--nonumbersections',
+                               '--format=xhtml',
+                               # '--linelength=78', # experimental
+                               '--'
+                              ],
+                              stdin=subprocess.PIPE,
+                              stdout=subprocess.PIPE,
+                              stderr=subprocess.PIPE,
+                              close_fds=True)
+    post_p.stdin.write(latexml_code)
+    post_p.stdin.close()
+    result = post_p.stdout.read().decode('utf8')
+    post_p_err = post_p.stderr.read().decode('utf8')
+    if reporter and post_p_err.find('Error') >= 0 or not result:
+        reporter.error(post_p_err)
+    
+    # extract MathML code:
+    start,end = result.find('<math'), result.find('</math>')+7
+    result = result[start:end]
+    if 'class="ltx_ERROR' in result:
+        raise SyntaxError(result)
+    return result
+
+def ttm(math_code, reporter=None):
+    """Convert LaTeX math code to MathML with TtM_
+    
+    .. _TtM: http://hutchinson.belmont.ma.us/tth/mml/
+    """
+    p = subprocess.Popen(['ttm',
+                          # '-i', # italic font for equations. Default roman.
+                          '-u', # unicode character encoding. (Default iso-8859-1).
+                          '-r', # output raw MathML (no preamble or  postlude)
+                         ],
+                         stdin=subprocess.PIPE,
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.PIPE,
+                         close_fds=True)
+    p.stdin.write((document_template % math_code).encode('utf8'))
+    p.stdin.close()
+    result = p.stdout.read()
+    err = p.stderr.read().decode('utf8')
+    if err.find('**** Unknown') >= 0:
+        msg = '\n'.join([line for line in err.splitlines()
+                         if line.startswith('****')])
+        raise SyntaxError('\nMessage from external converter TtM:\n'+ msg)
+    if reporter and err.find('**** Error') >= 0 or not result:
+        reporter.error(err)
+    start,end = result.find('<math'), result.find('</math>')+7
+    result = result[start:end]
+    return result
+
+def blahtexml(math_code, inline=True, reporter=None):
+    """Convert LaTeX math code to MathML with blahtexml_
+    
+    .. _blahtexml: http://gva.noekeon.org/blahtexml/
+    """
+    options = ['--mathml',
+               '--indented',
+               '--spacing', 'moderate',
+               '--mathml-encoding', 'raw',
+               '--other-encoding', 'raw',
+               '--doctype-xhtml+mathml',
+               '--annotate-TeX',
+              ]
+    if inline:
+        mathmode_arg = ''
+    else:
+        mathmode_arg = 'mode="display"'
+        options.append('--displaymath')
+    
+    p = subprocess.Popen(['blahtexml']+options,
+                         stdin=subprocess.PIPE,
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.PIPE,
+                         close_fds=True)
+    p.stdin.write(math_code.encode('utf8'))
+    p.stdin.close()
+    result = p.stdout.read().decode('utf8')
+    err = p.stderr.read().decode('utf8')
+    
+    print err
+    if result.find('<error>') >= 0:
+        raise SyntaxError('\nMessage from external converter blahtexml:\n'
+                +result[result.find('<message>')+9:result.find('</message>')])
+    if reporter and (err.find('**** Error') >= 0 or not result):
+        reporter.error(err)
+    start,end = result.find('<markup>')+9, result.find('</markup>')
+    result = ('<math xmlns="http://www.w3.org/1998/Math/MathML"%s>\n'
+              '%s</math>\n') % (mathmode_arg, result[start:end])
+    return result
+
+# self-test
+
+if __name__ == "__main__":
+    example = ur'\frac{\partial \sin^2(\alpha)}{\partial \vec r} \varpi \, \text{Grüße}'
+    # print latexml(example).encode('utf8')
+    # print ttm(example)#.encode('utf8')
+    print blahtexml(example).encode('utf8')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/tex2unichar.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/tex2unichar.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/tex2unichar.py	(revision 1126)
@@ -0,0 +1,662 @@
+# -*- coding: utf-8 -*-
+
+# LaTeX math to Unicode symbols translation dictionaries.
+# Generated with ``write_tex2unichar.py`` from the data in
+# http://milde.users.sourceforge.net/LUCR/Math/
+
+# Includes commands from: wasysym, stmaryrd, mathdots, mathabx, esint, bbold, amsxtra, amsmath, amssymb, standard LaTeX
+
+mathaccent = {
+    'acute': u'\u0301', # x́ COMBINING ACUTE ACCENT
+    'bar': u'\u0304', # x̄ COMBINING MACRON
+    'breve': u'\u0306', # x̆ COMBINING BREVE
+    'check': u'\u030c', # x̌ COMBINING CARON
+    'ddddot': u'\u20dc', # x⃜ COMBINING FOUR DOTS ABOVE
+    'dddot': u'\u20db', # x⃛ COMBINING THREE DOTS ABOVE
+    'ddot': u'\u0308', # ẍ COMBINING DIAERESIS
+    'dot': u'\u0307', # ẋ COMBINING DOT ABOVE
+    'grave': u'\u0300', # x̀ COMBINING GRAVE ACCENT
+    'hat': u'\u0302', # x̂ COMBINING CIRCUMFLEX ACCENT
+    'mathring': u'\u030a', # x̊ COMBINING RING ABOVE
+    'not': u'\u0338', # x̸ COMBINING LONG SOLIDUS OVERLAY
+    'overleftarrow': u'\u20d6', # x⃖ COMBINING LEFT ARROW ABOVE
+    'overleftrightarrow': u'\u20e1', # x⃡ COMBINING LEFT RIGHT ARROW ABOVE
+    'overline': u'\u0305', # x̅ COMBINING OVERLINE
+    'overrightarrow': u'\u20d7', # x⃗ COMBINING RIGHT ARROW ABOVE
+    'tilde': u'\u0303', # x̃ COMBINING TILDE
+    'underbar': u'\u0331', # x̱ COMBINING MACRON BELOW
+    'underleftarrow': u'\u20ee', # x⃮ COMBINING LEFT ARROW BELOW
+    'underline': u'\u0332', # x̲ COMBINING LOW LINE
+    'underrightarrow': u'\u20ef', # x⃯ COMBINING RIGHT ARROW BELOW
+    'vec': u'\u20d7', # x⃗ COMBINING RIGHT ARROW ABOVE
+    'widehat': u'\u0302', # x̂ COMBINING CIRCUMFLEX ACCENT
+    'widetilde': u'\u0303', # x̃ COMBINING TILDE
+    }
+mathalpha = {
+    'Bbbk': u'\U0001d55c', # 𝕜 MATHEMATICAL DOUBLE-STRUCK SMALL K
+    'Delta': u'\u0394', # Δ GREEK CAPITAL LETTER DELTA
+    'Gamma': u'\u0393', # Γ GREEK CAPITAL LETTER GAMMA
+    'Im': u'\u2111', # ℑ BLACK-LETTER CAPITAL I
+    'Lambda': u'\u039b', # Λ GREEK CAPITAL LETTER LAMDA
+    'Omega': u'\u03a9', # Ω GREEK CAPITAL LETTER OMEGA
+    'Phi': u'\u03a6', # Φ GREEK CAPITAL LETTER PHI
+    'Pi': u'\u03a0', # Π GREEK CAPITAL LETTER PI
+    'Psi': u'\u03a8', # Ψ GREEK CAPITAL LETTER PSI
+    'Re': u'\u211c', # ℜ BLACK-LETTER CAPITAL R
+    'Sigma': u'\u03a3', # Σ GREEK CAPITAL LETTER SIGMA
+    'Theta': u'\u0398', # Θ GREEK CAPITAL LETTER THETA
+    'Upsilon': u'\u03a5', # Υ GREEK CAPITAL LETTER UPSILON
+    'Xi': u'\u039e', # Ξ GREEK CAPITAL LETTER XI
+    'aleph': u'\u2135', # ℵ ALEF SYMBOL
+    'alpha': u'\u03b1', # α GREEK SMALL LETTER ALPHA
+    'beta': u'\u03b2', # β GREEK SMALL LETTER BETA
+    'beth': u'\u2136', # ℶ BET SYMBOL
+    'chi': u'\u03c7', # χ GREEK SMALL LETTER CHI
+    'daleth': u'\u2138', # ℸ DALET SYMBOL
+    'delta': u'\u03b4', # δ GREEK SMALL LETTER DELTA
+    'digamma': u'\u03dc', # Ϝ GREEK LETTER DIGAMMA
+    'ell': u'\u2113', # ℓ SCRIPT SMALL L
+    'epsilon': u'\u03f5', # ϵ GREEK LUNATE EPSILON SYMBOL
+    'eta': u'\u03b7', # η GREEK SMALL LETTER ETA
+    'eth': u'\xf0', # ð LATIN SMALL LETTER ETH
+    'gamma': u'\u03b3', # γ GREEK SMALL LETTER GAMMA
+    'gimel': u'\u2137', # ℷ GIMEL SYMBOL
+    'hbar': u'\u210f', # ℏ PLANCK CONSTANT OVER TWO PI
+    'hslash': u'\u210f', # ℏ PLANCK CONSTANT OVER TWO PI
+    'imath': u'\u0131', # ı LATIN SMALL LETTER DOTLESS I
+    'iota': u'\u03b9', # ι GREEK SMALL LETTER IOTA
+    'jmath': u'\u0237', # ȷ LATIN SMALL LETTER DOTLESS J
+    'kappa': u'\u03ba', # κ GREEK SMALL LETTER KAPPA
+    'lambda': u'\u03bb', # λ GREEK SMALL LETTER LAMDA
+    'mu': u'\u03bc', # μ GREEK SMALL LETTER MU
+    'nu': u'\u03bd', # ν GREEK SMALL LETTER NU
+    'omega': u'\u03c9', # ω GREEK SMALL LETTER OMEGA
+    'phi': u'\u03d5', # ϕ GREEK PHI SYMBOL
+    'pi': u'\u03c0', # π GREEK SMALL LETTER PI
+    'psi': u'\u03c8', # ψ GREEK SMALL LETTER PSI
+    'rho': u'\u03c1', # ρ GREEK SMALL LETTER RHO
+    'sigma': u'\u03c3', # σ GREEK SMALL LETTER SIGMA
+    'tau': u'\u03c4', # τ GREEK SMALL LETTER TAU
+    'theta': u'\u03b8', # θ GREEK SMALL LETTER THETA
+    'upsilon': u'\u03c5', # υ GREEK SMALL LETTER UPSILON
+    'varDelta': u'\U0001d6e5', # 𝛥 MATHEMATICAL ITALIC CAPITAL DELTA
+    'varGamma': u'\U0001d6e4', # 𝛤 MATHEMATICAL ITALIC CAPITAL GAMMA
+    'varLambda': u'\U0001d6ec', # 𝛬 MATHEMATICAL ITALIC CAPITAL LAMDA
+    'varOmega': u'\U0001d6fa', # 𝛺 MATHEMATICAL ITALIC CAPITAL OMEGA
+    'varPhi': u'\U0001d6f7', # 𝛷 MATHEMATICAL ITALIC CAPITAL PHI
+    'varPi': u'\U0001d6f1', # 𝛱 MATHEMATICAL ITALIC CAPITAL PI
+    'varPsi': u'\U0001d6f9', # 𝛹 MATHEMATICAL ITALIC CAPITAL PSI
+    'varSigma': u'\U0001d6f4', # 𝛴 MATHEMATICAL ITALIC CAPITAL SIGMA
+    'varTheta': u'\U0001d6e9', # 𝛩 MATHEMATICAL ITALIC CAPITAL THETA
+    'varUpsilon': u'\U0001d6f6', # 𝛶 MATHEMATICAL ITALIC CAPITAL UPSILON
+    'varXi': u'\U0001d6ef', # 𝛯 MATHEMATICAL ITALIC CAPITAL XI
+    'varepsilon': u'\u03b5', # ε GREEK SMALL LETTER EPSILON
+    'varkappa': u'\U0001d718', # 𝜘 MATHEMATICAL ITALIC KAPPA SYMBOL
+    'varphi': u'\u03c6', # φ GREEK SMALL LETTER PHI
+    'varpi': u'\u03d6', # ϖ GREEK PI SYMBOL
+    'varrho': u'\u03f1', # ϱ GREEK RHO SYMBOL
+    'varsigma': u'\u03c2', # ς GREEK SMALL LETTER FINAL SIGMA
+    'vartheta': u'\u03d1', # ϑ GREEK THETA SYMBOL
+    'wp': u'\u2118', # ℘ SCRIPT CAPITAL P
+    'xi': u'\u03be', # ξ GREEK SMALL LETTER XI
+    'zeta': u'\u03b6', # ζ GREEK SMALL LETTER ZETA
+    }
+mathbin = {
+    'Cap': u'\u22d2', # ⋒ DOUBLE INTERSECTION
+    'Circle': u'\u25cb', # ○ WHITE CIRCLE
+    'Cup': u'\u22d3', # ⋓ DOUBLE UNION
+    'LHD': u'\u25c0', # ◀ BLACK LEFT-POINTING TRIANGLE
+    'RHD': u'\u25b6', # ▶ BLACK RIGHT-POINTING TRIANGLE
+    'amalg': u'\u2a3f', # ⨿ AMALGAMATION OR COPRODUCT
+    'ast': u'\u2217', # ∗ ASTERISK OPERATOR
+    'barwedge': u'\u22bc', # ⊼ NAND
+    'bigtriangledown': u'\u25bd', # ▽ WHITE DOWN-POINTING TRIANGLE
+    'bigtriangleup': u'\u25b3', # △ WHITE UP-POINTING TRIANGLE
+    'bindnasrepma': u'\u214b', # ⅋ TURNED AMPERSAND
+    'blacklozenge': u'\u29eb', # ⧫ BLACK LOZENGE
+    'blacktriangledown': u'\u25be', # ▾ BLACK DOWN-POINTING SMALL TRIANGLE
+    'blacktriangleleft': u'\u25c2', # ◂ BLACK LEFT-POINTING SMALL TRIANGLE
+    'blacktriangleright': u'\u25b8', # ▸ BLACK RIGHT-POINTING SMALL TRIANGLE
+    'blacktriangleup': u'\u25b4', # ▴ BLACK UP-POINTING SMALL TRIANGLE
+    'boxast': u'\u29c6', # ⧆ SQUARED ASTERISK
+    'boxbar': u'\u25eb', # ◫ WHITE SQUARE WITH VERTICAL BISECTING LINE
+    'boxbox': u'\u29c8', # ⧈ SQUARED SQUARE
+    'boxbslash': u'\u29c5', # ⧅ SQUARED FALLING DIAGONAL SLASH
+    'boxcircle': u'\u29c7', # ⧇ SQUARED SMALL CIRCLE
+    'boxdot': u'\u22a1', # ⊡ SQUARED DOT OPERATOR
+    'boxminus': u'\u229f', # ⊟ SQUARED MINUS
+    'boxplus': u'\u229e', # ⊞ SQUARED PLUS
+    'boxslash': u'\u29c4', # ⧄ SQUARED RISING DIAGONAL SLASH
+    'boxtimes': u'\u22a0', # ⊠ SQUARED TIMES
+    'bullet': u'\u2219', # ∙ BULLET OPERATOR
+    'cap': u'\u2229', # ∩ INTERSECTION
+    'cdot': u'\u22c5', # ⋅ DOT OPERATOR
+    'circ': u'\u2218', # ∘ RING OPERATOR
+    'circledast': u'\u229b', # ⊛ CIRCLED ASTERISK OPERATOR
+    'circledcirc': u'\u229a', # ⊚ CIRCLED RING OPERATOR
+    'circleddash': u'\u229d', # ⊝ CIRCLED DASH
+    'cup': u'\u222a', # ∪ UNION
+    'curlyvee': u'\u22ce', # ⋎ CURLY LOGICAL OR
+    'curlywedge': u'\u22cf', # ⋏ CURLY LOGICAL AND
+    'dagger': u'\u2020', # † DAGGER
+    'ddagger': u'\u2021', # ‡ DOUBLE DAGGER
+    'diamond': u'\u22c4', # ⋄ DIAMOND OPERATOR
+    'div': u'\xf7', # ÷ DIVISION SIGN
+    'divideontimes': u'\u22c7', # ⋇ DIVISION TIMES
+    'dotplus': u'\u2214', # ∔ DOT PLUS
+    'doublebarwedge': u'\u2a5e', # ⩞ LOGICAL AND WITH DOUBLE OVERBAR
+    'intercal': u'\u22ba', # ⊺ INTERCALATE
+    'interleave': u'\u2af4', # ⫴ TRIPLE VERTICAL BAR BINARY RELATION
+    'land': u'\u2227', # ∧ LOGICAL AND
+    'leftthreetimes': u'\u22cb', # ⋋ LEFT SEMIDIRECT PRODUCT
+    'lhd': u'\u25c1', # ◁ WHITE LEFT-POINTING TRIANGLE
+    'lor': u'\u2228', # ∨ LOGICAL OR
+    'ltimes': u'\u22c9', # ⋉ LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+    'mp': u'\u2213', # ∓ MINUS-OR-PLUS SIGN
+    'odot': u'\u2299', # ⊙ CIRCLED DOT OPERATOR
+    'ominus': u'\u2296', # ⊖ CIRCLED MINUS
+    'oplus': u'\u2295', # ⊕ CIRCLED PLUS
+    'oslash': u'\u2298', # ⊘ CIRCLED DIVISION SLASH
+    'otimes': u'\u2297', # ⊗ CIRCLED TIMES
+    'pm': u'\xb1', # ± PLUS-MINUS SIGN
+    'rhd': u'\u25b7', # ▷ WHITE RIGHT-POINTING TRIANGLE
+    'rightthreetimes': u'\u22cc', # ⋌ RIGHT SEMIDIRECT PRODUCT
+    'rtimes': u'\u22ca', # ⋊ RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+    'setminus': u'\u29f5', # ⧵ REVERSE SOLIDUS OPERATOR
+    'slash': u'\u2215', # ∕ DIVISION SLASH
+    'smallsetminus': u'\u2216', # ∖ SET MINUS
+    'smalltriangledown': u'\u25bf', # ▿ WHITE DOWN-POINTING SMALL TRIANGLE
+    'smalltriangleleft': u'\u25c3', # ◃ WHITE LEFT-POINTING SMALL TRIANGLE
+    'smalltriangleright': u'\u25b9', # ▹ WHITE RIGHT-POINTING SMALL TRIANGLE
+    'smalltriangleup': u'\u25b5', # ▵ WHITE UP-POINTING SMALL TRIANGLE
+    'sqcap': u'\u2293', # ⊓ SQUARE CAP
+    'sqcup': u'\u2294', # ⊔ SQUARE CUP
+    'sslash': u'\u2afd', # ⫽ DOUBLE SOLIDUS OPERATOR
+    'star': u'\u22c6', # ⋆ STAR OPERATOR
+    'talloblong': u'\u2afe', # ⫾ WHITE VERTICAL BAR
+    'times': u'\xd7', # × MULTIPLICATION SIGN
+    'triangle': u'\u25b3', # △ WHITE UP-POINTING TRIANGLE
+    'triangledown': u'\u25bf', # ▿ WHITE DOWN-POINTING SMALL TRIANGLE
+    'triangleleft': u'\u25c3', # ◃ WHITE LEFT-POINTING SMALL TRIANGLE
+    'triangleright': u'\u25b9', # ▹ WHITE RIGHT-POINTING SMALL TRIANGLE
+    'uplus': u'\u228e', # ⊎ MULTISET UNION
+    'vartriangle': u'\u25b3', # △ WHITE UP-POINTING TRIANGLE
+    'vee': u'\u2228', # ∨ LOGICAL OR
+    'veebar': u'\u22bb', # ⊻ XOR
+    'wedge': u'\u2227', # ∧ LOGICAL AND
+    'wr': u'\u2240', # ≀ WREATH PRODUCT
+    }
+mathclose = {
+    'Rbag': u'\u27c6', # ⟆ RIGHT S-SHAPED BAG DELIMITER
+    'lrcorner': u'\u231f', # ⌟ BOTTOM RIGHT CORNER
+    'rangle': u'\u27e9', # ⟩ MATHEMATICAL RIGHT ANGLE BRACKET
+    'rbag': u'\u27c6', # ⟆ RIGHT S-SHAPED BAG DELIMITER
+    'rbrace': u'}', # } RIGHT CURLY BRACKET
+    'rbrack': u']', # ] RIGHT SQUARE BRACKET
+    'rceil': u'\u2309', # ⌉ RIGHT CEILING
+    'rfloor': u'\u230b', # ⌋ RIGHT FLOOR
+    'rgroup': u'\u27ef', # ⟯ MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+    'rrbracket': u'\u27e7', # ⟧ MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+    'rrparenthesis': u'\u2988', # ⦈ Z NOTATION RIGHT IMAGE BRACKET
+    'urcorner': u'\u231d', # ⌝ TOP RIGHT CORNER
+    '}': u'}', # } RIGHT CURLY BRACKET
+    }
+mathfence = {
+    'Vert': u'\u2016', # ‖ DOUBLE VERTICAL LINE
+    'vert': u'|', # | VERTICAL LINE
+    '|': u'\u2016', # ‖ DOUBLE VERTICAL LINE
+    }
+mathop = {
+    'Join': u'\u2a1d', # ⨝ JOIN
+    'bigcap': u'\u22c2', # ⋂ N-ARY INTERSECTION
+    'bigcup': u'\u22c3', # ⋃ N-ARY UNION
+    'biginterleave': u'\u2afc', # ⫼ LARGE TRIPLE VERTICAL BAR OPERATOR
+    'bigodot': u'\u2a00', # ⨀ N-ARY CIRCLED DOT OPERATOR
+    'bigoplus': u'\u2a01', # ⨁ N-ARY CIRCLED PLUS OPERATOR
+    'bigotimes': u'\u2a02', # ⨂ N-ARY CIRCLED TIMES OPERATOR
+    'bigsqcup': u'\u2a06', # ⨆ N-ARY SQUARE UNION OPERATOR
+    'biguplus': u'\u2a04', # ⨄ N-ARY UNION OPERATOR WITH PLUS
+    'bigvee': u'\u22c1', # ⋁ N-ARY LOGICAL OR
+    'bigwedge': u'\u22c0', # ⋀ N-ARY LOGICAL AND
+    'coprod': u'\u2210', # ∐ N-ARY COPRODUCT
+    'fatsemi': u'\u2a1f', # ⨟ Z NOTATION SCHEMA COMPOSITION
+    'fint': u'\u2a0f', # ⨏ INTEGRAL AVERAGE WITH SLASH
+    'iiiint': u'\u2a0c', # ⨌ QUADRUPLE INTEGRAL OPERATOR
+    'iiint': u'\u222d', # ∭ TRIPLE INTEGRAL
+    'iint': u'\u222c', # ∬ DOUBLE INTEGRAL
+    'int': u'\u222b', # ∫ INTEGRAL
+    'oiint': u'\u222f', # ∯ SURFACE INTEGRAL
+    'oint': u'\u222e', # ∮ CONTOUR INTEGRAL
+    'ointctrclockwise': u'\u2233', # ∳ ANTICLOCKWISE CONTOUR INTEGRAL
+    'prod': u'\u220f', # ∏ N-ARY PRODUCT
+    'sqint': u'\u2a16', # ⨖ QUATERNION INTEGRAL OPERATOR
+    'sum': u'\u2211', # ∑ N-ARY SUMMATION
+    'varointclockwise': u'\u2232', # ∲ CLOCKWISE CONTOUR INTEGRAL
+    }
+mathopen = {
+    'Lbag': u'\u27c5', # ⟅ LEFT S-SHAPED BAG DELIMITER
+    'langle': u'\u27e8', # ⟨ MATHEMATICAL LEFT ANGLE BRACKET
+    'lbag': u'\u27c5', # ⟅ LEFT S-SHAPED BAG DELIMITER
+    'lbrace': u'{', # { LEFT CURLY BRACKET
+    'lbrack': u'[', # [ LEFT SQUARE BRACKET
+    'lceil': u'\u2308', # ⌈ LEFT CEILING
+    'lfloor': u'\u230a', # ⌊ LEFT FLOOR
+    'lgroup': u'\u27ee', # ⟮ MATHEMATICAL LEFT FLATTENED PARENTHESIS
+    'llbracket': u'\u27e6', # ⟦ MATHEMATICAL LEFT WHITE SQUARE BRACKET
+    'llcorner': u'\u231e', # ⌞ BOTTOM LEFT CORNER
+    'llparenthesis': u'\u2987', # ⦇ Z NOTATION LEFT IMAGE BRACKET
+    'ulcorner': u'\u231c', # ⌜ TOP LEFT CORNER
+    '{': u'{', # { LEFT CURLY BRACKET
+    }
+mathord = {
+    '#': u'#', # # NUMBER SIGN
+    '$': u'$', # $ DOLLAR SIGN
+    '%': u'%', # % PERCENT SIGN
+    '&': u'&', # & AMPERSAND
+    'AC': u'\u223f', # ∿ SINE WAVE
+    'APLcomment': u'\u235d', # ⍝ APL FUNCTIONAL SYMBOL UP SHOE JOT
+    'APLdownarrowbox': u'\u2357', # ⍗ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+    'APLinput': u'\u235e', # ⍞ APL FUNCTIONAL SYMBOL QUOTE QUAD
+    'APLinv': u'\u2339', # ⌹ APL FUNCTIONAL SYMBOL QUAD DIVIDE
+    'APLleftarrowbox': u'\u2347', # ⍇ APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+    'APLlog': u'\u235f', # ⍟ APL FUNCTIONAL SYMBOL CIRCLE STAR
+    'APLrightarrowbox': u'\u2348', # ⍈ APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+    'APLuparrowbox': u'\u2350', # ⍐ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+    'Aries': u'\u2648', # ♈ ARIES
+    'CIRCLE': u'\u25cf', # ● BLACK CIRCLE
+    'CheckedBox': u'\u2611', # ☑ BALLOT BOX WITH CHECK
+    'Diamond': u'\u25c7', # ◇ WHITE DIAMOND
+    'Finv': u'\u2132', # Ⅎ TURNED CAPITAL F
+    'Game': u'\u2141', # ⅁ TURNED SANS-SERIF CAPITAL G
+    'Gemini': u'\u264a', # ♊ GEMINI
+    'Jupiter': u'\u2643', # ♃ JUPITER
+    'LEFTCIRCLE': u'\u25d6', # ◖ LEFT HALF BLACK CIRCLE
+    'LEFTcircle': u'\u25d0', # ◐ CIRCLE WITH LEFT HALF BLACK
+    'Leo': u'\u264c', # ♌ LEO
+    'Libra': u'\u264e', # ♎ LIBRA
+    'Mars': u'\u2642', # ♂ MALE SIGN
+    'Mercury': u'\u263f', # ☿ MERCURY
+    'Neptune': u'\u2646', # ♆ NEPTUNE
+    'Pluto': u'\u2647', # ♇ PLUTO
+    'RIGHTCIRCLE': u'\u25d7', # ◗ RIGHT HALF BLACK CIRCLE
+    'RIGHTcircle': u'\u25d1', # ◑ CIRCLE WITH RIGHT HALF BLACK
+    'Saturn': u'\u2644', # ♄ SATURN
+    'Scorpio': u'\u264f', # ♏ SCORPIUS
+    'Square': u'\u2610', # ☐ BALLOT BOX
+    'Sun': u'\u2609', # ☉ SUN
+    'Taurus': u'\u2649', # ♉ TAURUS
+    'Uranus': u'\u2645', # ♅ URANUS
+    'Venus': u'\u2640', # ♀ FEMALE SIGN
+    'XBox': u'\u2612', # ☒ BALLOT BOX WITH X
+    'Yup': u'\u2144', # ⅄ TURNED SANS-SERIF CAPITAL Y
+    '_': u'_', # _ LOW LINE
+    'angle': u'\u2220', # ∠ ANGLE
+    'aquarius': u'\u2652', # ♒ AQUARIUS
+    'aries': u'\u2648', # ♈ ARIES
+    'ast': u'*', # * ASTERISK
+    'backepsilon': u'\u03f6', # ϶ GREEK REVERSED LUNATE EPSILON SYMBOL
+    'backprime': u'\u2035', # ‵ REVERSED PRIME
+    'backslash': u'\\', # \ REVERSE SOLIDUS
+    'because': u'\u2235', # ∵ BECAUSE
+    'bigstar': u'\u2605', # ★ BLACK STAR
+    'binampersand': u'&', # & AMPERSAND
+    'blacklozenge': u'\u2b27', # ⬧ BLACK MEDIUM LOZENGE
+    'blacksmiley': u'\u263b', # ☻ BLACK SMILING FACE
+    'blacksquare': u'\u25fc', # ◼ BLACK MEDIUM SQUARE
+    'bot': u'\u22a5', # ⊥ UP TACK
+    'boy': u'\u2642', # ♂ MALE SIGN
+    'cancer': u'\u264b', # ♋ CANCER
+    'capricornus': u'\u2651', # ♑ CAPRICORN
+    'cdots': u'\u22ef', # ⋯ MIDLINE HORIZONTAL ELLIPSIS
+    'cent': u'\xa2', # ¢ CENT SIGN
+    'centerdot': u'\u2b1d', # ⬝ BLACK VERY SMALL SQUARE
+    'checkmark': u'\u2713', # ✓ CHECK MARK
+    'circlearrowleft': u'\u21ba', # ↺ ANTICLOCKWISE OPEN CIRCLE ARROW
+    'circlearrowright': u'\u21bb', # ↻ CLOCKWISE OPEN CIRCLE ARROW
+    'circledR': u'\xae', # ® REGISTERED SIGN
+    'circledcirc': u'\u25ce', # ◎ BULLSEYE
+    'clubsuit': u'\u2663', # ♣ BLACK CLUB SUIT
+    'complement': u'\u2201', # ∁ COMPLEMENT
+    'dasharrow': u'\u21e2', # ⇢ RIGHTWARDS DASHED ARROW
+    'dashleftarrow': u'\u21e0', # ⇠ LEFTWARDS DASHED ARROW
+    'dashrightarrow': u'\u21e2', # ⇢ RIGHTWARDS DASHED ARROW
+    'diameter': u'\u2300', # ⌀ DIAMETER SIGN
+    'diamondsuit': u'\u2662', # ♢ WHITE DIAMOND SUIT
+    'earth': u'\u2641', # ♁ EARTH
+    'exists': u'\u2203', # ∃ THERE EXISTS
+    'female': u'\u2640', # ♀ FEMALE SIGN
+    'flat': u'\u266d', # ♭ MUSIC FLAT SIGN
+    'forall': u'\u2200', # ∀ FOR ALL
+    'fourth': u'\u2057', # ⁗ QUADRUPLE PRIME
+    'frownie': u'\u2639', # ☹ WHITE FROWNING FACE
+    'gemini': u'\u264a', # ♊ GEMINI
+    'girl': u'\u2640', # ♀ FEMALE SIGN
+    'heartsuit': u'\u2661', # ♡ WHITE HEART SUIT
+    'infty': u'\u221e', # ∞ INFINITY
+    'invneg': u'\u2310', # ⌐ REVERSED NOT SIGN
+    'jupiter': u'\u2643', # ♃ JUPITER
+    'ldots': u'\u2026', # … HORIZONTAL ELLIPSIS
+    'leftmoon': u'\u263e', # ☾ LAST QUARTER MOON
+    'leftturn': u'\u21ba', # ↺ ANTICLOCKWISE OPEN CIRCLE ARROW
+    'leo': u'\u264c', # ♌ LEO
+    'libra': u'\u264e', # ♎ LIBRA
+    'lnot': u'\xac', # ¬ NOT SIGN
+    'lozenge': u'\u25ca', # ◊ LOZENGE
+    'male': u'\u2642', # ♂ MALE SIGN
+    'maltese': u'\u2720', # ✠ MALTESE CROSS
+    'mathdollar': u'$', # $ DOLLAR SIGN
+    'measuredangle': u'\u2221', # ∡ MEASURED ANGLE
+    'mercury': u'\u263f', # ☿ MERCURY
+    'mho': u'\u2127', # ℧ INVERTED OHM SIGN
+    'nabla': u'\u2207', # ∇ NABLA
+    'natural': u'\u266e', # ♮ MUSIC NATURAL SIGN
+    'neg': u'\xac', # ¬ NOT SIGN
+    'neptune': u'\u2646', # ♆ NEPTUNE
+    'nexists': u'\u2204', # ∄ THERE DOES NOT EXIST
+    'notbackslash': u'\u2340', # ⍀ APL FUNCTIONAL SYMBOL BACKSLASH BAR
+    'partial': u'\u2202', # ∂ PARTIAL DIFFERENTIAL
+    'pisces': u'\u2653', # ♓ PISCES
+    'pluto': u'\u2647', # ♇ PLUTO
+    'pounds': u'\xa3', # £ POUND SIGN
+    'prime': u'\u2032', # ′ PRIME
+    'quarternote': u'\u2669', # ♩ QUARTER NOTE
+    'rightmoon': u'\u263d', # ☽ FIRST QUARTER MOON
+    'rightturn': u'\u21bb', # ↻ CLOCKWISE OPEN CIRCLE ARROW
+    'sagittarius': u'\u2650', # ♐ SAGITTARIUS
+    'saturn': u'\u2644', # ♄ SATURN
+    'scorpio': u'\u264f', # ♏ SCORPIUS
+    'second': u'\u2033', # ″ DOUBLE PRIME
+    'sharp': u'\u266f', # ♯ MUSIC SHARP SIGN
+    'sim': u'~', # ~ TILDE
+    'slash': u'/', # / SOLIDUS
+    'smiley': u'\u263a', # ☺ WHITE SMILING FACE
+    'spadesuit': u'\u2660', # ♠ BLACK SPADE SUIT
+    'spddot': u'\xa8', # ¨ DIAERESIS
+    'sphat': u'^', # ^ CIRCUMFLEX ACCENT
+    'sphericalangle': u'\u2222', # ∢ SPHERICAL ANGLE
+    'sptilde': u'~', # ~ TILDE
+    'square': u'\u25fb', # ◻ WHITE MEDIUM SQUARE
+    'sun': u'\u263c', # ☼ WHITE SUN WITH RAYS
+    'taurus': u'\u2649', # ♉ TAURUS
+    'therefore': u'\u2234', # ∴ THEREFORE
+    'third': u'\u2034', # ‴ TRIPLE PRIME
+    'top': u'\u22a4', # ⊤ DOWN TACK
+    'triangleleft': u'\u25c5', # ◅ WHITE LEFT-POINTING POINTER
+    'triangleright': u'\u25bb', # ▻ WHITE RIGHT-POINTING POINTER
+    'twonotes': u'\u266b', # ♫ BEAMED EIGHTH NOTES
+    'uranus': u'\u2645', # ♅ URANUS
+    'varEarth': u'\u2641', # ♁ EARTH
+    'varnothing': u'\u2205', # ∅ EMPTY SET
+    'virgo': u'\u264d', # ♍ VIRGO
+    'wasylozenge': u'\u2311', # ⌑ SQUARE LOZENGE
+    'wasytherefore': u'\u2234', # ∴ THEREFORE
+    'yen': u'\xa5', # ¥ YEN SIGN
+    }
+mathover = {
+    'overbrace': u'\u23de', # ⏞ TOP CURLY BRACKET
+    'wideparen': u'\u23dc', # ⏜ TOP PARENTHESIS
+    }
+mathradical = {
+    'sqrt': u'\u221a', # √ SQUARE ROOT
+    'sqrt[3]': u'\u221b', # ∛ CUBE ROOT
+    'sqrt[4]': u'\u221c', # ∜ FOURTH ROOT
+    }
+mathrel = {
+    'Bumpeq': u'\u224e', # ≎ GEOMETRICALLY EQUIVALENT TO
+    'Doteq': u'\u2251', # ≑ GEOMETRICALLY EQUAL TO
+    'Downarrow': u'\u21d3', # ⇓ DOWNWARDS DOUBLE ARROW
+    'Leftarrow': u'\u21d0', # ⇐ LEFTWARDS DOUBLE ARROW
+    'Leftrightarrow': u'\u21d4', # ⇔ LEFT RIGHT DOUBLE ARROW
+    'Lleftarrow': u'\u21da', # ⇚ LEFTWARDS TRIPLE ARROW
+    'Longleftarrow': u'\u27f8', # ⟸ LONG LEFTWARDS DOUBLE ARROW
+    'Longleftrightarrow': u'\u27fa', # ⟺ LONG LEFT RIGHT DOUBLE ARROW
+    'Longmapsfrom': u'\u27fd', # ⟽ LONG LEFTWARDS DOUBLE ARROW FROM BAR
+    'Longmapsto': u'\u27fe', # ⟾ LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+    'Longrightarrow': u'\u27f9', # ⟹ LONG RIGHTWARDS DOUBLE ARROW
+    'Lsh': u'\u21b0', # ↰ UPWARDS ARROW WITH TIP LEFTWARDS
+    'Mapsfrom': u'\u2906', # ⤆ LEFTWARDS DOUBLE ARROW FROM BAR
+    'Mapsto': u'\u2907', # ⤇ RIGHTWARDS DOUBLE ARROW FROM BAR
+    'Rightarrow': u'\u21d2', # ⇒ RIGHTWARDS DOUBLE ARROW
+    'Rrightarrow': u'\u21db', # ⇛ RIGHTWARDS TRIPLE ARROW
+    'Rsh': u'\u21b1', # ↱ UPWARDS ARROW WITH TIP RIGHTWARDS
+    'Subset': u'\u22d0', # ⋐ DOUBLE SUBSET
+    'Supset': u'\u22d1', # ⋑ DOUBLE SUPERSET
+    'Uparrow': u'\u21d1', # ⇑ UPWARDS DOUBLE ARROW
+    'Updownarrow': u'\u21d5', # ⇕ UP DOWN DOUBLE ARROW
+    'VDash': u'\u22ab', # ⊫ DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+    'Vdash': u'\u22a9', # ⊩ FORCES
+    'Vvdash': u'\u22aa', # ⊪ TRIPLE VERTICAL BAR RIGHT TURNSTILE
+    'apprge': u'\u2273', # ≳ GREATER-THAN OR EQUIVALENT TO
+    'apprle': u'\u2272', # ≲ LESS-THAN OR EQUIVALENT TO
+    'approx': u'\u2248', # ≈ ALMOST EQUAL TO
+    'approxeq': u'\u224a', # ≊ ALMOST EQUAL OR EQUAL TO
+    'asymp': u'\u224d', # ≍ EQUIVALENT TO
+    'backsim': u'\u223d', # ∽ REVERSED TILDE
+    'backsimeq': u'\u22cd', # ⋍ REVERSED TILDE EQUALS
+    'barin': u'\u22f6', # ⋶ ELEMENT OF WITH OVERBAR
+    'barleftharpoon': u'\u296b', # ⥫ LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+    'barrightharpoon': u'\u296d', # ⥭ RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+    'between': u'\u226c', # ≬ BETWEEN
+    'bowtie': u'\u22c8', # ⋈ BOWTIE
+    'bumpeq': u'\u224f', # ≏ DIFFERENCE BETWEEN
+    'circeq': u'\u2257', # ≗ RING EQUAL TO
+    'coloneq': u'\u2254', # ≔ COLON EQUALS
+    'cong': u'\u2245', # ≅ APPROXIMATELY EQUAL TO
+    'corresponds': u'\u2259', # ≙ ESTIMATES
+    'curlyeqprec': u'\u22de', # ⋞ EQUAL TO OR PRECEDES
+    'curlyeqsucc': u'\u22df', # ⋟ EQUAL TO OR SUCCEEDS
+    'curvearrowleft': u'\u21b6', # ↶ ANTICLOCKWISE TOP SEMICIRCLE ARROW
+    'curvearrowright': u'\u21b7', # ↷ CLOCKWISE TOP SEMICIRCLE ARROW
+    'dashv': u'\u22a3', # ⊣ LEFT TACK
+    'ddots': u'\u22f1', # ⋱ DOWN RIGHT DIAGONAL ELLIPSIS
+    'dlsh': u'\u21b2', # ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS
+    'doteq': u'\u2250', # ≐ APPROACHES THE LIMIT
+    'doteqdot': u'\u2251', # ≑ GEOMETRICALLY EQUAL TO
+    'downarrow': u'\u2193', # ↓ DOWNWARDS ARROW
+    'downdownarrows': u'\u21ca', # ⇊ DOWNWARDS PAIRED ARROWS
+    'downdownharpoons': u'\u2965', # ⥥ DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+    'downharpoonleft': u'\u21c3', # ⇃ DOWNWARDS HARPOON WITH BARB LEFTWARDS
+    'downharpoonright': u'\u21c2', # ⇂ DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+    'downuparrows': u'\u21f5', # ⇵ DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+    'downupharpoons': u'\u296f', # ⥯ DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+    'drsh': u'\u21b3', # ↳ DOWNWARDS ARROW WITH TIP RIGHTWARDS
+    'eqcirc': u'\u2256', # ≖ RING IN EQUAL TO
+    'eqcolon': u'\u2255', # ≕ EQUALS COLON
+    'eqsim': u'\u2242', # ≂ MINUS TILDE
+    'eqslantgtr': u'\u2a96', # ⪖ SLANTED EQUAL TO OR GREATER-THAN
+    'eqslantless': u'\u2a95', # ⪕ SLANTED EQUAL TO OR LESS-THAN
+    'equiv': u'\u2261', # ≡ IDENTICAL TO
+    'fallingdotseq': u'\u2252', # ≒ APPROXIMATELY EQUAL TO OR THE IMAGE OF
+    'frown': u'\u2322', # ⌢ FROWN
+    'ge': u'\u2265', # ≥ GREATER-THAN OR EQUAL TO
+    'geq': u'\u2265', # ≥ GREATER-THAN OR EQUAL TO
+    'geqq': u'\u2267', # ≧ GREATER-THAN OVER EQUAL TO
+    'geqslant': u'\u2a7e', # ⩾ GREATER-THAN OR SLANTED EQUAL TO
+    'gets': u'\u2190', # ← LEFTWARDS ARROW
+    'gg': u'\u226b', # ≫ MUCH GREATER-THAN
+    'ggcurly': u'\u2abc', # ⪼ DOUBLE SUCCEEDS
+    'ggg': u'\u22d9', # ⋙ VERY MUCH GREATER-THAN
+    'gnapprox': u'\u2a8a', # ⪊ GREATER-THAN AND NOT APPROXIMATE
+    'gneq': u'\u2a88', # ⪈ GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+    'gneqq': u'\u2269', # ≩ GREATER-THAN BUT NOT EQUAL TO
+    'gnsim': u'\u22e7', # ⋧ GREATER-THAN BUT NOT EQUIVALENT TO
+    'gtrapprox': u'\u2a86', # ⪆ GREATER-THAN OR APPROXIMATE
+    'gtrdot': u'\u22d7', # ⋗ GREATER-THAN WITH DOT
+    'gtreqless': u'\u22db', # ⋛ GREATER-THAN EQUAL TO OR LESS-THAN
+    'gtreqqless': u'\u2a8c', # ⪌ GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+    'gtrless': u'\u2277', # ≷ GREATER-THAN OR LESS-THAN
+    'gtrsim': u'\u2273', # ≳ GREATER-THAN OR EQUIVALENT TO
+    'hash': u'\u22d5', # ⋕ EQUAL AND PARALLEL TO
+    'hookleftarrow': u'\u21a9', # ↩ LEFTWARDS ARROW WITH HOOK
+    'hookrightarrow': u'\u21aa', # ↪ RIGHTWARDS ARROW WITH HOOK
+    'iddots': u'\u22f0', # ⋰ UP RIGHT DIAGONAL ELLIPSIS
+    'impliedby': u'\u27f8', # ⟸ LONG LEFTWARDS DOUBLE ARROW
+    'implies': u'\u27f9', # ⟹ LONG RIGHTWARDS DOUBLE ARROW
+    'in': u'\u2208', # ∈ ELEMENT OF
+    'le': u'\u2264', # ≤ LESS-THAN OR EQUAL TO
+    'leftarrow': u'\u2190', # ← LEFTWARDS ARROW
+    'leftarrowtail': u'\u21a2', # ↢ LEFTWARDS ARROW WITH TAIL
+    'leftarrowtriangle': u'\u21fd', # ⇽ LEFTWARDS OPEN-HEADED ARROW
+    'leftbarharpoon': u'\u296a', # ⥪ LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+    'leftharpoondown': u'\u21bd', # ↽ LEFTWARDS HARPOON WITH BARB DOWNWARDS
+    'leftharpoonup': u'\u21bc', # ↼ LEFTWARDS HARPOON WITH BARB UPWARDS
+    'leftleftarrows': u'\u21c7', # ⇇ LEFTWARDS PAIRED ARROWS
+    'leftleftharpoons': u'\u2962', # ⥢ LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+    'leftrightarrow': u'\u2194', # ↔ LEFT RIGHT ARROW
+    'leftrightarrows': u'\u21c6', # ⇆ LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+    'leftrightarrowtriangle': u'\u21ff', # ⇿ LEFT RIGHT OPEN-HEADED ARROW
+    'leftrightharpoon': u'\u294a', # ⥊ LEFT BARB UP RIGHT BARB DOWN HARPOON
+    'leftrightharpoons': u'\u21cb', # ⇋ LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+    'leftrightsquigarrow': u'\u21ad', # ↭ LEFT RIGHT WAVE ARROW
+    'leftslice': u'\u2aa6', # ⪦ LESS-THAN CLOSED BY CURVE
+    'leftsquigarrow': u'\u21dc', # ⇜ LEFTWARDS SQUIGGLE ARROW
+    'leq': u'\u2264', # ≤ LESS-THAN OR EQUAL TO
+    'leqq': u'\u2266', # ≦ LESS-THAN OVER EQUAL TO
+    'leqslant': u'\u2a7d', # ⩽ LESS-THAN OR SLANTED EQUAL TO
+    'lessapprox': u'\u2a85', # ⪅ LESS-THAN OR APPROXIMATE
+    'lessdot': u'\u22d6', # ⋖ LESS-THAN WITH DOT
+    'lesseqgtr': u'\u22da', # ⋚ LESS-THAN EQUAL TO OR GREATER-THAN
+    'lesseqqgtr': u'\u2a8b', # ⪋ LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+    'lessgtr': u'\u2276', # ≶ LESS-THAN OR GREATER-THAN
+    'lesssim': u'\u2272', # ≲ LESS-THAN OR EQUIVALENT TO
+    'lightning': u'\u21af', # ↯ DOWNWARDS ZIGZAG ARROW
+    'll': u'\u226a', # ≪ MUCH LESS-THAN
+    'llcurly': u'\u2abb', # ⪻ DOUBLE PRECEDES
+    'lll': u'\u22d8', # ⋘ VERY MUCH LESS-THAN
+    'lnapprox': u'\u2a89', # ⪉ LESS-THAN AND NOT APPROXIMATE
+    'lneq': u'\u2a87', # ⪇ LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+    'lneqq': u'\u2268', # ≨ LESS-THAN BUT NOT EQUAL TO
+    'lnsim': u'\u22e6', # ⋦ LESS-THAN BUT NOT EQUIVALENT TO
+    'longleftarrow': u'\u27f5', # ⟵ LONG LEFTWARDS ARROW
+    'longleftrightarrow': u'\u27f7', # ⟷ LONG LEFT RIGHT ARROW
+    'longmapsfrom': u'\u27fb', # ⟻ LONG LEFTWARDS ARROW FROM BAR
+    'longmapsto': u'\u27fc', # ⟼ LONG RIGHTWARDS ARROW FROM BAR
+    'longrightarrow': u'\u27f6', # ⟶ LONG RIGHTWARDS ARROW
+    'looparrowleft': u'\u21ab', # ↫ LEFTWARDS ARROW WITH LOOP
+    'looparrowright': u'\u21ac', # ↬ RIGHTWARDS ARROW WITH LOOP
+    'mapsfrom': u'\u21a4', # ↤ LEFTWARDS ARROW FROM BAR
+    'mapsto': u'\u21a6', # ↦ RIGHTWARDS ARROW FROM BAR
+    'mid': u'\u2223', # ∣ DIVIDES
+    'models': u'\u22a7', # ⊧ MODELS
+    'multimap': u'\u22b8', # ⊸ MULTIMAP
+    'nLeftarrow': u'\u21cd', # ⇍ LEFTWARDS DOUBLE ARROW WITH STROKE
+    'nLeftrightarrow': u'\u21ce', # ⇎ LEFT RIGHT DOUBLE ARROW WITH STROKE
+    'nRightarrow': u'\u21cf', # ⇏ RIGHTWARDS DOUBLE ARROW WITH STROKE
+    'nVDash': u'\u22af', # ⊯ NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+    'nVdash': u'\u22ae', # ⊮ DOES NOT FORCE
+    'ncong': u'\u2247', # ≇ NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+    'ne': u'\u2260', # ≠ NOT EQUAL TO
+    'nearrow': u'\u2197', # ↗ NORTH EAST ARROW
+    'neq': u'\u2260', # ≠ NOT EQUAL TO
+    'ngeq': u'\u2271', # ≱ NEITHER GREATER-THAN NOR EQUAL TO
+    'ngtr': u'\u226f', # ≯ NOT GREATER-THAN
+    'ni': u'\u220b', # ∋ CONTAINS AS MEMBER
+    'nleftarrow': u'\u219a', # ↚ LEFTWARDS ARROW WITH STROKE
+    'nleftrightarrow': u'\u21ae', # ↮ LEFT RIGHT ARROW WITH STROKE
+    'nleq': u'\u2270', # ≰ NEITHER LESS-THAN NOR EQUAL TO
+    'nless': u'\u226e', # ≮ NOT LESS-THAN
+    'nmid': u'\u2224', # ∤ DOES NOT DIVIDE
+    'notasymp': u'\u226d', # ≭ NOT EQUIVALENT TO
+    'notin': u'\u2209', # ∉ NOT AN ELEMENT OF
+    'notowner': u'\u220c', # ∌ DOES NOT CONTAIN AS MEMBER
+    'notslash': u'\u233f', # ⌿ APL FUNCTIONAL SYMBOL SLASH BAR
+    'nparallel': u'\u2226', # ∦ NOT PARALLEL TO
+    'nprec': u'\u2280', # ⊀ DOES NOT PRECEDE
+    'npreceq': u'\u22e0', # ⋠ DOES NOT PRECEDE OR EQUAL
+    'nrightarrow': u'\u219b', # ↛ RIGHTWARDS ARROW WITH STROKE
+    'nsim': u'\u2241', # ≁ NOT TILDE
+    'nsubseteq': u'\u2288', # ⊈ NEITHER A SUBSET OF NOR EQUAL TO
+    'nsucc': u'\u2281', # ⊁ DOES NOT SUCCEED
+    'nsucceq': u'\u22e1', # ⋡ DOES NOT SUCCEED OR EQUAL
+    'nsupseteq': u'\u2289', # ⊉ NEITHER A SUPERSET OF NOR EQUAL TO
+    'ntriangleleft': u'\u22ea', # ⋪ NOT NORMAL SUBGROUP OF
+    'ntrianglelefteq': u'\u22ec', # ⋬ NOT NORMAL SUBGROUP OF OR EQUAL TO
+    'ntriangleright': u'\u22eb', # ⋫ DOES NOT CONTAIN AS NORMAL SUBGROUP
+    'ntrianglerighteq': u'\u22ed', # ⋭ DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+    'nvDash': u'\u22ad', # ⊭ NOT TRUE
+    'nvdash': u'\u22ac', # ⊬ DOES NOT PROVE
+    'nwarrow': u'\u2196', # ↖ NORTH WEST ARROW
+    'owns': u'\u220b', # ∋ CONTAINS AS MEMBER
+    'parallel': u'\u2225', # ∥ PARALLEL TO
+    'perp': u'\u27c2', # ⟂ PERPENDICULAR
+    'pitchfork': u'\u22d4', # ⋔ PITCHFORK
+    'prec': u'\u227a', # ≺ PRECEDES
+    'precapprox': u'\u2ab7', # ⪷ PRECEDES ABOVE ALMOST EQUAL TO
+    'preccurlyeq': u'\u227c', # ≼ PRECEDES OR EQUAL TO
+    'preceq': u'\u2aaf', # ⪯ PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+    'precnapprox': u'\u2ab9', # ⪹ PRECEDES ABOVE NOT ALMOST EQUAL TO
+    'precnsim': u'\u22e8', # ⋨ PRECEDES BUT NOT EQUIVALENT TO
+    'precsim': u'\u227e', # ≾ PRECEDES OR EQUIVALENT TO
+    'propto': u'\u221d', # ∝ PROPORTIONAL TO
+    'restriction': u'\u21be', # ↾ UPWARDS HARPOON WITH BARB RIGHTWARDS
+    'rightarrow': u'\u2192', # → RIGHTWARDS ARROW
+    'rightarrowtail': u'\u21a3', # ↣ RIGHTWARDS ARROW WITH TAIL
+    'rightarrowtriangle': u'\u21fe', # ⇾ RIGHTWARDS OPEN-HEADED ARROW
+    'rightbarharpoon': u'\u296c', # ⥬ RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+    'rightharpoondown': u'\u21c1', # ⇁ RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+    'rightharpoonup': u'\u21c0', # ⇀ RIGHTWARDS HARPOON WITH BARB UPWARDS
+    'rightleftarrows': u'\u21c4', # ⇄ RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+    'rightleftharpoon': u'\u294b', # ⥋ LEFT BARB DOWN RIGHT BARB UP HARPOON
+    'rightleftharpoons': u'\u21cc', # ⇌ RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+    'rightrightarrows': u'\u21c9', # ⇉ RIGHTWARDS PAIRED ARROWS
+    'rightrightharpoons': u'\u2964', # ⥤ RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+    'rightslice': u'\u2aa7', # ⪧ GREATER-THAN CLOSED BY CURVE
+    'rightsquigarrow': u'\u21dd', # ⇝ RIGHTWARDS SQUIGGLE ARROW
+    'risingdotseq': u'\u2253', # ≓ IMAGE OF OR APPROXIMATELY EQUAL TO
+    'searrow': u'\u2198', # ↘ SOUTH EAST ARROW
+    'sim': u'\u223c', # ∼ TILDE OPERATOR
+    'simeq': u'\u2243', # ≃ ASYMPTOTICALLY EQUAL TO
+    'smallfrown': u'\u2322', # ⌢ FROWN
+    'smallsmile': u'\u2323', # ⌣ SMILE
+    'smile': u'\u2323', # ⌣ SMILE
+    'sqsubset': u'\u228f', # ⊏ SQUARE IMAGE OF
+    'sqsubseteq': u'\u2291', # ⊑ SQUARE IMAGE OF OR EQUAL TO
+    'sqsupset': u'\u2290', # ⊐ SQUARE ORIGINAL OF
+    'sqsupseteq': u'\u2292', # ⊒ SQUARE ORIGINAL OF OR EQUAL TO
+    'subset': u'\u2282', # ⊂ SUBSET OF
+    'subseteq': u'\u2286', # ⊆ SUBSET OF OR EQUAL TO
+    'subseteqq': u'\u2ac5', # ⫅ SUBSET OF ABOVE EQUALS SIGN
+    'subsetneq': u'\u228a', # ⊊ SUBSET OF WITH NOT EQUAL TO
+    'subsetneqq': u'\u2acb', # ⫋ SUBSET OF ABOVE NOT EQUAL TO
+    'succ': u'\u227b', # ≻ SUCCEEDS
+    'succapprox': u'\u2ab8', # ⪸ SUCCEEDS ABOVE ALMOST EQUAL TO
+    'succcurlyeq': u'\u227d', # ≽ SUCCEEDS OR EQUAL TO
+    'succeq': u'\u2ab0', # ⪰ SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+    'succnapprox': u'\u2aba', # ⪺ SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+    'succnsim': u'\u22e9', # ⋩ SUCCEEDS BUT NOT EQUIVALENT TO
+    'succsim': u'\u227f', # ≿ SUCCEEDS OR EQUIVALENT TO
+    'supset': u'\u2283', # ⊃ SUPERSET OF
+    'supseteq': u'\u2287', # ⊇ SUPERSET OF OR EQUAL TO
+    'supseteqq': u'\u2ac6', # ⫆ SUPERSET OF ABOVE EQUALS SIGN
+    'supsetneq': u'\u228b', # ⊋ SUPERSET OF WITH NOT EQUAL TO
+    'supsetneqq': u'\u2acc', # ⫌ SUPERSET OF ABOVE NOT EQUAL TO
+    'swarrow': u'\u2199', # ↙ SOUTH WEST ARROW
+    'to': u'\u2192', # → RIGHTWARDS ARROW
+    'trianglelefteq': u'\u22b4', # ⊴ NORMAL SUBGROUP OF OR EQUAL TO
+    'triangleq': u'\u225c', # ≜ DELTA EQUAL TO
+    'trianglerighteq': u'\u22b5', # ⊵ CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+    'twoheadleftarrow': u'\u219e', # ↞ LEFTWARDS TWO HEADED ARROW
+    'twoheadrightarrow': u'\u21a0', # ↠ RIGHTWARDS TWO HEADED ARROW
+    'uparrow': u'\u2191', # ↑ UPWARDS ARROW
+    'updownarrow': u'\u2195', # ↕ UP DOWN ARROW
+    'updownarrows': u'\u21c5', # ⇅ UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+    'updownharpoons': u'\u296e', # ⥮ UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+    'upharpoonleft': u'\u21bf', # ↿ UPWARDS HARPOON WITH BARB LEFTWARDS
+    'upharpoonright': u'\u21be', # ↾ UPWARDS HARPOON WITH BARB RIGHTWARDS
+    'upuparrows': u'\u21c8', # ⇈ UPWARDS PAIRED ARROWS
+    'upupharpoons': u'\u2963', # ⥣ UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+    'vDash': u'\u22a8', # ⊨ TRUE
+    'varpropto': u'\u221d', # ∝ PROPORTIONAL TO
+    'vartriangleleft': u'\u22b2', # ⊲ NORMAL SUBGROUP OF
+    'vartriangleright': u'\u22b3', # ⊳ CONTAINS AS NORMAL SUBGROUP
+    'vdash': u'\u22a2', # ⊢ RIGHT TACK
+    'vdots': u'\u22ee', # ⋮ VERTICAL ELLIPSIS
+    }
+mathunder = {
+    'underbrace': u'\u23df', # ⏟ BOTTOM CURLY BRACKET
+    }
+space = {
+    ':': u'\u205f', #   MEDIUM MATHEMATICAL SPACE
+    'medspace': u'\u205f', #   MEDIUM MATHEMATICAL SPACE
+    'quad': u'\u2001', #   EM QUAD
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/unichar2tex.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/unichar2tex.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/unichar2tex.py	(revision 1126)
@@ -0,0 +1,788 @@
+# LaTeX math to Unicode symbols translation table
+# for use with the translate() method of unicode objects.
+# Generated with ``write_unichar2tex.py`` from the data in
+# http://milde.users.sourceforge.net/LUCR/Math/
+
+# Includes commands from: standard LaTeX, amssymb, amsmath
+
+uni2tex_table = {
+160: u'~',
+163: u'\\pounds ',
+165: u'\\yen ',
+172: u'\\neg ',
+174: u'\\circledR ',
+177: u'\\pm ',
+215: u'\\times ',
+240: u'\\eth ',
+247: u'\\div ',
+305: u'\\imath ',
+567: u'\\jmath ',
+915: u'\\Gamma ',
+916: u'\\Delta ',
+920: u'\\Theta ',
+923: u'\\Lambda ',
+926: u'\\Xi ',
+928: u'\\Pi ',
+931: u'\\Sigma ',
+933: u'\\Upsilon ',
+934: u'\\Phi ',
+936: u'\\Psi ',
+937: u'\\Omega ',
+945: u'\\alpha ',
+946: u'\\beta ',
+947: u'\\gamma ',
+948: u'\\delta ',
+949: u'\\varepsilon ',
+950: u'\\zeta ',
+951: u'\\eta ',
+952: u'\\theta ',
+953: u'\\iota ',
+954: u'\\kappa ',
+955: u'\\lambda ',
+956: u'\\mu ',
+957: u'\\nu ',
+958: u'\\xi ',
+960: u'\\pi ',
+961: u'\\rho ',
+962: u'\\varsigma ',
+963: u'\\sigma ',
+964: u'\\tau ',
+965: u'\\upsilon ',
+966: u'\\varphi ',
+967: u'\\chi ',
+968: u'\\psi ',
+969: u'\\omega ',
+977: u'\\vartheta ',
+981: u'\\phi ',
+982: u'\\varpi ',
+989: u'\\digamma ',
+1014: u'\\backepsilon ',
+8193: u'\\quad ',
+8214: u'\\| ',
+8224: u'\\dagger ',
+8225: u'\\ddagger ',
+8230: u'\\ldots ',
+8242: u'\\prime ',
+8245: u'\\backprime ',
+8287: u'\\: ',
+8450: u'\\mathbb{C}',
+8459: u'\\mathcal{H}',
+8460: u'\\mathfrak{H}',
+8461: u'\\mathbb{H}',
+8463: u'\\hslash ',
+8464: u'\\mathcal{I}',
+8465: u'\\Im ',
+8466: u'\\mathcal{L}',
+8467: u'\\ell ',
+8469: u'\\mathbb{N}',
+8472: u'\\wp ',
+8473: u'\\mathbb{P}',
+8474: u'\\mathbb{Q}',
+8475: u'\\mathcal{R}',
+8476: u'\\Re ',
+8477: u'\\mathbb{R}',
+8484: u'\\mathbb{Z}',
+8487: u'\\mho ',
+8488: u'\\mathfrak{Z}',
+8492: u'\\mathcal{B}',
+8493: u'\\mathfrak{C}',
+8496: u'\\mathcal{E}',
+8497: u'\\mathcal{F}',
+8498: u'\\Finv ',
+8499: u'\\mathcal{M}',
+8501: u'\\aleph ',
+8502: u'\\beth ',
+8503: u'\\gimel ',
+8504: u'\\daleth ',
+8592: u'\\leftarrow ',
+8593: u'\\uparrow ',
+8594: u'\\rightarrow ',
+8595: u'\\downarrow ',
+8596: u'\\leftrightarrow ',
+8597: u'\\updownarrow ',
+8598: u'\\nwarrow ',
+8599: u'\\nearrow ',
+8600: u'\\searrow ',
+8601: u'\\swarrow ',
+8602: u'\\nleftarrow ',
+8603: u'\\nrightarrow ',
+8606: u'\\twoheadleftarrow ',
+8608: u'\\twoheadrightarrow ',
+8610: u'\\leftarrowtail ',
+8611: u'\\rightarrowtail ',
+8614: u'\\mapsto ',
+8617: u'\\hookleftarrow ',
+8618: u'\\hookrightarrow ',
+8619: u'\\looparrowleft ',
+8620: u'\\looparrowright ',
+8621: u'\\leftrightsquigarrow ',
+8622: u'\\nleftrightarrow ',
+8624: u'\\Lsh ',
+8625: u'\\Rsh ',
+8630: u'\\curvearrowleft ',
+8631: u'\\curvearrowright ',
+8634: u'\\circlearrowleft ',
+8635: u'\\circlearrowright ',
+8636: u'\\leftharpoonup ',
+8637: u'\\leftharpoondown ',
+8638: u'\\upharpoonright ',
+8639: u'\\upharpoonleft ',
+8640: u'\\rightharpoonup ',
+8641: u'\\rightharpoondown ',
+8642: u'\\downharpoonright ',
+8643: u'\\downharpoonleft ',
+8644: u'\\rightleftarrows ',
+8646: u'\\leftrightarrows ',
+8647: u'\\leftleftarrows ',
+8648: u'\\upuparrows ',
+8649: u'\\rightrightarrows ',
+8650: u'\\downdownarrows ',
+8651: u'\\leftrightharpoons ',
+8652: u'\\rightleftharpoons ',
+8653: u'\\nLeftarrow ',
+8654: u'\\nLeftrightarrow ',
+8655: u'\\nRightarrow ',
+8656: u'\\Leftarrow ',
+8657: u'\\Uparrow ',
+8658: u'\\Rightarrow ',
+8659: u'\\Downarrow ',
+8660: u'\\Leftrightarrow ',
+8661: u'\\Updownarrow ',
+8666: u'\\Lleftarrow ',
+8667: u'\\Rrightarrow ',
+8669: u'\\rightsquigarrow ',
+8672: u'\\dashleftarrow ',
+8674: u'\\dashrightarrow ',
+8704: u'\\forall ',
+8705: u'\\complement ',
+8706: u'\\partial ',
+8707: u'\\exists ',
+8708: u'\\nexists ',
+8709: u'\\varnothing ',
+8711: u'\\nabla ',
+8712: u'\\in ',
+8713: u'\\notin ',
+8715: u'\\ni ',
+8719: u'\\prod ',
+8720: u'\\coprod ',
+8721: u'\\sum ',
+8722: u'-',
+8723: u'\\mp ',
+8724: u'\\dotplus ',
+8725: u'\\slash ',
+8726: u'\\smallsetminus ',
+8727: u'\\ast ',
+8728: u'\\circ ',
+8729: u'\\bullet ',
+8730: u'\\sqrt ',
+8731: u'\\sqrt[3] ',
+8732: u'\\sqrt[4] ',
+8733: u'\\propto ',
+8734: u'\\infty ',
+8736: u'\\angle ',
+8737: u'\\measuredangle ',
+8738: u'\\sphericalangle ',
+8739: u'\\mid ',
+8740: u'\\nmid ',
+8741: u'\\parallel ',
+8742: u'\\nparallel ',
+8743: u'\\wedge ',
+8744: u'\\vee ',
+8745: u'\\cap ',
+8746: u'\\cup ',
+8747: u'\\int ',
+8748: u'\\iint ',
+8749: u'\\iiint ',
+8750: u'\\oint ',
+8756: u'\\therefore ',
+8757: u'\\because ',
+8758: u':',
+8764: u'\\sim ',
+8765: u'\\backsim ',
+8768: u'\\wr ',
+8769: u'\\nsim ',
+8770: u'\\eqsim ',
+8771: u'\\simeq ',
+8773: u'\\cong ',
+8775: u'\\ncong ',
+8776: u'\\approx ',
+8778: u'\\approxeq ',
+8781: u'\\asymp ',
+8782: u'\\Bumpeq ',
+8783: u'\\bumpeq ',
+8784: u'\\doteq ',
+8785: u'\\Doteq ',
+8786: u'\\fallingdotseq ',
+8787: u'\\risingdotseq ',
+8790: u'\\eqcirc ',
+8791: u'\\circeq ',
+8796: u'\\triangleq ',
+8800: u'\\neq ',
+8801: u'\\equiv ',
+8804: u'\\leq ',
+8805: u'\\geq ',
+8806: u'\\leqq ',
+8807: u'\\geqq ',
+8808: u'\\lneqq ',
+8809: u'\\gneqq ',
+8810: u'\\ll ',
+8811: u'\\gg ',
+8812: u'\\between ',
+8814: u'\\nless ',
+8815: u'\\ngtr ',
+8816: u'\\nleq ',
+8817: u'\\ngeq ',
+8818: u'\\lesssim ',
+8819: u'\\gtrsim ',
+8822: u'\\lessgtr ',
+8823: u'\\gtrless ',
+8826: u'\\prec ',
+8827: u'\\succ ',
+8828: u'\\preccurlyeq ',
+8829: u'\\succcurlyeq ',
+8830: u'\\precsim ',
+8831: u'\\succsim ',
+8832: u'\\nprec ',
+8833: u'\\nsucc ',
+8834: u'\\subset ',
+8835: u'\\supset ',
+8838: u'\\subseteq ',
+8839: u'\\supseteq ',
+8840: u'\\nsubseteq ',
+8841: u'\\nsupseteq ',
+8842: u'\\subsetneq ',
+8843: u'\\supsetneq ',
+8846: u'\\uplus ',
+8847: u'\\sqsubset ',
+8848: u'\\sqsupset ',
+8849: u'\\sqsubseteq ',
+8850: u'\\sqsupseteq ',
+8851: u'\\sqcap ',
+8852: u'\\sqcup ',
+8853: u'\\oplus ',
+8854: u'\\ominus ',
+8855: u'\\otimes ',
+8856: u'\\oslash ',
+8857: u'\\odot ',
+8858: u'\\circledcirc ',
+8859: u'\\circledast ',
+8861: u'\\circleddash ',
+8862: u'\\boxplus ',
+8863: u'\\boxminus ',
+8864: u'\\boxtimes ',
+8865: u'\\boxdot ',
+8866: u'\\vdash ',
+8867: u'\\dashv ',
+8868: u'\\top ',
+8869: u'\\bot ',
+8871: u'\\models ',
+8872: u'\\vDash ',
+8873: u'\\Vdash ',
+8874: u'\\Vvdash ',
+8876: u'\\nvdash ',
+8877: u'\\nvDash ',
+8878: u'\\nVdash ',
+8879: u'\\nVDash ',
+8882: u'\\vartriangleleft ',
+8883: u'\\vartriangleright ',
+8884: u'\\trianglelefteq ',
+8885: u'\\trianglerighteq ',
+8888: u'\\multimap ',
+8890: u'\\intercal ',
+8891: u'\\veebar ',
+8892: u'\\barwedge ',
+8896: u'\\bigwedge ',
+8897: u'\\bigvee ',
+8898: u'\\bigcap ',
+8899: u'\\bigcup ',
+8900: u'\\diamond ',
+8901: u'\\cdot ',
+8902: u'\\star ',
+8903: u'\\divideontimes ',
+8904: u'\\bowtie ',
+8905: u'\\ltimes ',
+8906: u'\\rtimes ',
+8907: u'\\leftthreetimes ',
+8908: u'\\rightthreetimes ',
+8909: u'\\backsimeq ',
+8910: u'\\curlyvee ',
+8911: u'\\curlywedge ',
+8912: u'\\Subset ',
+8913: u'\\Supset ',
+8914: u'\\Cap ',
+8915: u'\\Cup ',
+8916: u'\\pitchfork ',
+8918: u'\\lessdot ',
+8919: u'\\gtrdot ',
+8920: u'\\lll ',
+8921: u'\\ggg ',
+8922: u'\\lesseqgtr ',
+8923: u'\\gtreqless ',
+8926: u'\\curlyeqprec ',
+8927: u'\\curlyeqsucc ',
+8928: u'\\npreceq ',
+8929: u'\\nsucceq ',
+8934: u'\\lnsim ',
+8935: u'\\gnsim ',
+8936: u'\\precnsim ',
+8937: u'\\succnsim ',
+8938: u'\\ntriangleleft ',
+8939: u'\\ntriangleright ',
+8940: u'\\ntrianglelefteq ',
+8941: u'\\ntrianglerighteq ',
+8942: u'\\vdots ',
+8943: u'\\cdots ',
+8945: u'\\ddots ',
+8968: u'\\lceil ',
+8969: u'\\rceil ',
+8970: u'\\lfloor ',
+8971: u'\\rfloor ',
+8988: u'\\ulcorner ',
+8989: u'\\urcorner ',
+8990: u'\\llcorner ',
+8991: u'\\lrcorner ',
+8994: u'\\frown ',
+8995: u'\\smile ',
+9182: u'\\overbrace ',
+9183: u'\\underbrace ',
+9651: u'\\bigtriangleup ',
+9655: u'\\rhd ',
+9661: u'\\bigtriangledown ',
+9665: u'\\lhd ',
+9671: u'\\Diamond ',
+9674: u'\\lozenge ',
+9723: u'\\square ',
+9724: u'\\blacksquare ',
+9733: u'\\bigstar ',
+9824: u'\\spadesuit ',
+9825: u'\\heartsuit ',
+9826: u'\\diamondsuit ',
+9827: u'\\clubsuit ',
+9837: u'\\flat ',
+9838: u'\\natural ',
+9839: u'\\sharp ',
+10003: u'\\checkmark ',
+10016: u'\\maltese ',
+10178: u'\\perp ',
+10216: u'\\langle ',
+10217: u'\\rangle ',
+10222: u'\\lgroup ',
+10223: u'\\rgroup ',
+10229: u'\\longleftarrow ',
+10230: u'\\longrightarrow ',
+10231: u'\\longleftrightarrow ',
+10232: u'\\Longleftarrow ',
+10233: u'\\Longrightarrow ',
+10234: u'\\Longleftrightarrow ',
+10236: u'\\longmapsto ',
+10731: u'\\blacklozenge ',
+10741: u'\\setminus ',
+10752: u'\\bigodot ',
+10753: u'\\bigoplus ',
+10754: u'\\bigotimes ',
+10756: u'\\biguplus ',
+10758: u'\\bigsqcup ',
+10764: u'\\iiiint ',
+10781: u'\\Join ',
+10815: u'\\amalg ',
+10846: u'\\doublebarwedge ',
+10877: u'\\leqslant ',
+10878: u'\\geqslant ',
+10885: u'\\lessapprox ',
+10886: u'\\gtrapprox ',
+10887: u'\\lneq ',
+10888: u'\\gneq ',
+10889: u'\\lnapprox ',
+10890: u'\\gnapprox ',
+10891: u'\\lesseqqgtr ',
+10892: u'\\gtreqqless ',
+10901: u'\\eqslantless ',
+10902: u'\\eqslantgtr ',
+10927: u'\\preceq ',
+10928: u'\\succeq ',
+10935: u'\\precapprox ',
+10936: u'\\succapprox ',
+10937: u'\\precnapprox ',
+10938: u'\\succnapprox ',
+10949: u'\\subseteqq ',
+10950: u'\\supseteqq ',
+10955: u'\\subsetneqq ',
+10956: u'\\supsetneqq ',
+119808: u'\\mathbf{A}',
+119809: u'\\mathbf{B}',
+119810: u'\\mathbf{C}',
+119811: u'\\mathbf{D}',
+119812: u'\\mathbf{E}',
+119813: u'\\mathbf{F}',
+119814: u'\\mathbf{G}',
+119815: u'\\mathbf{H}',
+119816: u'\\mathbf{I}',
+119817: u'\\mathbf{J}',
+119818: u'\\mathbf{K}',
+119819: u'\\mathbf{L}',
+119820: u'\\mathbf{M}',
+119821: u'\\mathbf{N}',
+119822: u'\\mathbf{O}',
+119823: u'\\mathbf{P}',
+119824: u'\\mathbf{Q}',
+119825: u'\\mathbf{R}',
+119826: u'\\mathbf{S}',
+119827: u'\\mathbf{T}',
+119828: u'\\mathbf{U}',
+119829: u'\\mathbf{V}',
+119830: u'\\mathbf{W}',
+119831: u'\\mathbf{X}',
+119832: u'\\mathbf{Y}',
+119833: u'\\mathbf{Z}',
+119834: u'\\mathbf{a}',
+119835: u'\\mathbf{b}',
+119836: u'\\mathbf{c}',
+119837: u'\\mathbf{d}',
+119838: u'\\mathbf{e}',
+119839: u'\\mathbf{f}',
+119840: u'\\mathbf{g}',
+119841: u'\\mathbf{h}',
+119842: u'\\mathbf{i}',
+119843: u'\\mathbf{j}',
+119844: u'\\mathbf{k}',
+119845: u'\\mathbf{l}',
+119846: u'\\mathbf{m}',
+119847: u'\\mathbf{n}',
+119848: u'\\mathbf{o}',
+119849: u'\\mathbf{p}',
+119850: u'\\mathbf{q}',
+119851: u'\\mathbf{r}',
+119852: u'\\mathbf{s}',
+119853: u'\\mathbf{t}',
+119854: u'\\mathbf{u}',
+119855: u'\\mathbf{v}',
+119856: u'\\mathbf{w}',
+119857: u'\\mathbf{x}',
+119858: u'\\mathbf{y}',
+119859: u'\\mathbf{z}',
+119860: u'A',
+119861: u'B',
+119862: u'C',
+119863: u'D',
+119864: u'E',
+119865: u'F',
+119866: u'G',
+119867: u'H',
+119868: u'I',
+119869: u'J',
+119870: u'K',
+119871: u'L',
+119872: u'M',
+119873: u'N',
+119874: u'O',
+119875: u'P',
+119876: u'Q',
+119877: u'R',
+119878: u'S',
+119879: u'T',
+119880: u'U',
+119881: u'V',
+119882: u'W',
+119883: u'X',
+119884: u'Y',
+119885: u'Z',
+119886: u'a',
+119887: u'b',
+119888: u'c',
+119889: u'd',
+119890: u'e',
+119891: u'f',
+119892: u'g',
+119894: u'i',
+119895: u'j',
+119896: u'k',
+119897: u'l',
+119898: u'm',
+119899: u'n',
+119900: u'o',
+119901: u'p',
+119902: u'q',
+119903: u'r',
+119904: u's',
+119905: u't',
+119906: u'u',
+119907: u'v',
+119908: u'w',
+119909: u'x',
+119910: u'y',
+119911: u'z',
+119964: u'\\mathcal{A}',
+119966: u'\\mathcal{C}',
+119967: u'\\mathcal{D}',
+119970: u'\\mathcal{G}',
+119973: u'\\mathcal{J}',
+119974: u'\\mathcal{K}',
+119977: u'\\mathcal{N}',
+119978: u'\\mathcal{O}',
+119979: u'\\mathcal{P}',
+119980: u'\\mathcal{Q}',
+119982: u'\\mathcal{S}',
+119983: u'\\mathcal{T}',
+119984: u'\\mathcal{U}',
+119985: u'\\mathcal{V}',
+119986: u'\\mathcal{W}',
+119987: u'\\mathcal{X}',
+119988: u'\\mathcal{Y}',
+119989: u'\\mathcal{Z}',
+120068: u'\\mathfrak{A}',
+120069: u'\\mathfrak{B}',
+120071: u'\\mathfrak{D}',
+120072: u'\\mathfrak{E}',
+120073: u'\\mathfrak{F}',
+120074: u'\\mathfrak{G}',
+120077: u'\\mathfrak{J}',
+120078: u'\\mathfrak{K}',
+120079: u'\\mathfrak{L}',
+120080: u'\\mathfrak{M}',
+120081: u'\\mathfrak{N}',
+120082: u'\\mathfrak{O}',
+120083: u'\\mathfrak{P}',
+120084: u'\\mathfrak{Q}',
+120086: u'\\mathfrak{S}',
+120087: u'\\mathfrak{T}',
+120088: u'\\mathfrak{U}',
+120089: u'\\mathfrak{V}',
+120090: u'\\mathfrak{W}',
+120091: u'\\mathfrak{X}',
+120092: u'\\mathfrak{Y}',
+120094: u'\\mathfrak{a}',
+120095: u'\\mathfrak{b}',
+120096: u'\\mathfrak{c}',
+120097: u'\\mathfrak{d}',
+120098: u'\\mathfrak{e}',
+120099: u'\\mathfrak{f}',
+120100: u'\\mathfrak{g}',
+120101: u'\\mathfrak{h}',
+120102: u'\\mathfrak{i}',
+120103: u'\\mathfrak{j}',
+120104: u'\\mathfrak{k}',
+120105: u'\\mathfrak{l}',
+120106: u'\\mathfrak{m}',
+120107: u'\\mathfrak{n}',
+120108: u'\\mathfrak{o}',
+120109: u'\\mathfrak{p}',
+120110: u'\\mathfrak{q}',
+120111: u'\\mathfrak{r}',
+120112: u'\\mathfrak{s}',
+120113: u'\\mathfrak{t}',
+120114: u'\\mathfrak{u}',
+120115: u'\\mathfrak{v}',
+120116: u'\\mathfrak{w}',
+120117: u'\\mathfrak{x}',
+120118: u'\\mathfrak{y}',
+120119: u'\\mathfrak{z}',
+120120: u'\\mathbb{A}',
+120121: u'\\mathbb{B}',
+120123: u'\\mathbb{D}',
+120124: u'\\mathbb{E}',
+120125: u'\\mathbb{F}',
+120126: u'\\mathbb{G}',
+120128: u'\\mathbb{I}',
+120129: u'\\mathbb{J}',
+120130: u'\\mathbb{K}',
+120131: u'\\mathbb{L}',
+120132: u'\\mathbb{M}',
+120134: u'\\mathbb{O}',
+120138: u'\\mathbb{S}',
+120139: u'\\mathbb{T}',
+120140: u'\\mathbb{U}',
+120141: u'\\mathbb{V}',
+120142: u'\\mathbb{W}',
+120143: u'\\mathbb{X}',
+120144: u'\\mathbb{Y}',
+120156: u'\\Bbbk ',
+120224: u'\\mathsf{A}',
+120225: u'\\mathsf{B}',
+120226: u'\\mathsf{C}',
+120227: u'\\mathsf{D}',
+120228: u'\\mathsf{E}',
+120229: u'\\mathsf{F}',
+120230: u'\\mathsf{G}',
+120231: u'\\mathsf{H}',
+120232: u'\\mathsf{I}',
+120233: u'\\mathsf{J}',
+120234: u'\\mathsf{K}',
+120235: u'\\mathsf{L}',
+120236: u'\\mathsf{M}',
+120237: u'\\mathsf{N}',
+120238: u'\\mathsf{O}',
+120239: u'\\mathsf{P}',
+120240: u'\\mathsf{Q}',
+120241: u'\\mathsf{R}',
+120242: u'\\mathsf{S}',
+120243: u'\\mathsf{T}',
+120244: u'\\mathsf{U}',
+120245: u'\\mathsf{V}',
+120246: u'\\mathsf{W}',
+120247: u'\\mathsf{X}',
+120248: u'\\mathsf{Y}',
+120249: u'\\mathsf{Z}',
+120250: u'\\mathsf{a}',
+120251: u'\\mathsf{b}',
+120252: u'\\mathsf{c}',
+120253: u'\\mathsf{d}',
+120254: u'\\mathsf{e}',
+120255: u'\\mathsf{f}',
+120256: u'\\mathsf{g}',
+120257: u'\\mathsf{h}',
+120258: u'\\mathsf{i}',
+120259: u'\\mathsf{j}',
+120260: u'\\mathsf{k}',
+120261: u'\\mathsf{l}',
+120262: u'\\mathsf{m}',
+120263: u'\\mathsf{n}',
+120264: u'\\mathsf{o}',
+120265: u'\\mathsf{p}',
+120266: u'\\mathsf{q}',
+120267: u'\\mathsf{r}',
+120268: u'\\mathsf{s}',
+120269: u'\\mathsf{t}',
+120270: u'\\mathsf{u}',
+120271: u'\\mathsf{v}',
+120272: u'\\mathsf{w}',
+120273: u'\\mathsf{x}',
+120274: u'\\mathsf{y}',
+120275: u'\\mathsf{z}',
+120432: u'\\mathtt{A}',
+120433: u'\\mathtt{B}',
+120434: u'\\mathtt{C}',
+120435: u'\\mathtt{D}',
+120436: u'\\mathtt{E}',
+120437: u'\\mathtt{F}',
+120438: u'\\mathtt{G}',
+120439: u'\\mathtt{H}',
+120440: u'\\mathtt{I}',
+120441: u'\\mathtt{J}',
+120442: u'\\mathtt{K}',
+120443: u'\\mathtt{L}',
+120444: u'\\mathtt{M}',
+120445: u'\\mathtt{N}',
+120446: u'\\mathtt{O}',
+120447: u'\\mathtt{P}',
+120448: u'\\mathtt{Q}',
+120449: u'\\mathtt{R}',
+120450: u'\\mathtt{S}',
+120451: u'\\mathtt{T}',
+120452: u'\\mathtt{U}',
+120453: u'\\mathtt{V}',
+120454: u'\\mathtt{W}',
+120455: u'\\mathtt{X}',
+120456: u'\\mathtt{Y}',
+120457: u'\\mathtt{Z}',
+120458: u'\\mathtt{a}',
+120459: u'\\mathtt{b}',
+120460: u'\\mathtt{c}',
+120461: u'\\mathtt{d}',
+120462: u'\\mathtt{e}',
+120463: u'\\mathtt{f}',
+120464: u'\\mathtt{g}',
+120465: u'\\mathtt{h}',
+120466: u'\\mathtt{i}',
+120467: u'\\mathtt{j}',
+120468: u'\\mathtt{k}',
+120469: u'\\mathtt{l}',
+120470: u'\\mathtt{m}',
+120471: u'\\mathtt{n}',
+120472: u'\\mathtt{o}',
+120473: u'\\mathtt{p}',
+120474: u'\\mathtt{q}',
+120475: u'\\mathtt{r}',
+120476: u'\\mathtt{s}',
+120477: u'\\mathtt{t}',
+120478: u'\\mathtt{u}',
+120479: u'\\mathtt{v}',
+120480: u'\\mathtt{w}',
+120481: u'\\mathtt{x}',
+120482: u'\\mathtt{y}',
+120483: u'\\mathtt{z}',
+120484: u'\\imath ',
+120485: u'\\jmath ',
+120490: u'\\mathbf{\\Gamma}',
+120491: u'\\mathbf{\\Delta}',
+120495: u'\\mathbf{\\Theta}',
+120498: u'\\mathbf{\\Lambda}',
+120501: u'\\mathbf{\\Xi}',
+120503: u'\\mathbf{\\Pi}',
+120506: u'\\mathbf{\\Sigma}',
+120508: u'\\mathbf{\\Upsilon}',
+120509: u'\\mathbf{\\Phi}',
+120511: u'\\mathbf{\\Psi}',
+120512: u'\\mathbf{\\Omega}',
+120548: u'\\mathit{\\Gamma}',
+120549: u'\\mathit{\\Delta}',
+120553: u'\\mathit{\\Theta}',
+120556: u'\\mathit{\\Lambda}',
+120559: u'\\mathit{\\Xi}',
+120561: u'\\mathit{\\Pi}',
+120564: u'\\mathit{\\Sigma}',
+120566: u'\\mathit{\\Upsilon}',
+120567: u'\\mathit{\\Phi}',
+120569: u'\\mathit{\\Psi}',
+120570: u'\\mathit{\\Omega}',
+120572: u'\\alpha ',
+120573: u'\\beta ',
+120574: u'\\gamma ',
+120575: u'\\delta ',
+120576: u'\\varepsilon ',
+120577: u'\\zeta ',
+120578: u'\\eta ',
+120579: u'\\theta ',
+120580: u'\\iota ',
+120581: u'\\kappa ',
+120582: u'\\lambda ',
+120583: u'\\mu ',
+120584: u'\\nu ',
+120585: u'\\xi ',
+120587: u'\\pi ',
+120588: u'\\rho ',
+120589: u'\\varsigma ',
+120590: u'\\sigma ',
+120591: u'\\tau ',
+120592: u'\\upsilon ',
+120593: u'\\varphi ',
+120594: u'\\chi ',
+120595: u'\\psi ',
+120596: u'\\omega ',
+120597: u'\\partial ',
+120598: u'\\epsilon ',
+120599: u'\\vartheta ',
+120600: u'\\varkappa ',
+120601: u'\\phi ',
+120602: u'\\varrho ',
+120603: u'\\varpi ',
+120782: u'\\mathbf{0}',
+120783: u'\\mathbf{1}',
+120784: u'\\mathbf{2}',
+120785: u'\\mathbf{3}',
+120786: u'\\mathbf{4}',
+120787: u'\\mathbf{5}',
+120788: u'\\mathbf{6}',
+120789: u'\\mathbf{7}',
+120790: u'\\mathbf{8}',
+120791: u'\\mathbf{9}',
+120802: u'\\mathsf{0}',
+120803: u'\\mathsf{1}',
+120804: u'\\mathsf{2}',
+120805: u'\\mathsf{3}',
+120806: u'\\mathsf{4}',
+120807: u'\\mathsf{5}',
+120808: u'\\mathsf{6}',
+120809: u'\\mathsf{7}',
+120810: u'\\mathsf{8}',
+120811: u'\\mathsf{9}',
+120822: u'\\mathtt{0}',
+120823: u'\\mathtt{1}',
+120824: u'\\mathtt{2}',
+120825: u'\\mathtt{3}',
+120826: u'\\mathtt{4}',
+120827: u'\\mathtt{5}',
+120828: u'\\mathtt{6}',
+120829: u'\\mathtt{7}',
+120830: u'\\mathtt{8}',
+120831: u'\\mathtt{9}',
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/__init__.py	(revision 1126)
@@ -0,0 +1,48 @@
+# :Id: $Id: __init__.py 7865 2015-04-12 10:06:43Z milde $
+# :Author: Guenter Milde.
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+#
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+"""
+This is the Docutils (Python Documentation Utilities) "math" sub-package.
+
+It contains various modules for conversion between different math formats
+(LaTeX, MathML, HTML).
+
+:math2html:    LaTeX math -> HTML conversion from eLyXer
+:latex2mathml: LaTeX math -> presentational MathML
+:unichar2tex:  Unicode character to LaTeX math translation table
+:tex2unichar:  LaTeX math to Unicode character translation dictionaries
+:tex2mathml_extern: Wrapper for TeX -> MathML command line converters
+"""
+
+# helpers for Docutils math support
+# =================================
+
+def pick_math_environment(code, numbered=False):
+    """Return the right math environment to display `code`.
+
+    The test simply looks for line-breaks (``\\``) outside environments.
+    Multi-line formulae are set with ``align``, one-liners with
+    ``equation``.
+
+    If `numbered` evaluates to ``False``, the "starred" versions are used
+    to suppress numbering.
+    """
+    # cut out environment content:
+    chunks = code.split(r'\begin{')
+    toplevel_code = ''.join([chunk.split(r'\end{')[-1]
+                             for chunk in chunks])
+    if toplevel_code.find(r'\\') >= 0:
+        env = 'align'
+    else:
+        env = 'equation'
+    if not numbered:
+        env += '*'
+    return env
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/math2html.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/math2html.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/math2html.py	(revision 1126)
@@ -0,0 +1,5369 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#   math2html: convert LaTeX equations to HTML output.
+#
+#   Copyright (C) 2009-2011 Alex Fernández
+#
+#   Released under the terms of the `2-Clause BSD license'_, in short:
+#   Copying and distribution of this file, with or without modification,
+#   are permitted in any medium without royalty provided the copyright
+#   notice and this notice are preserved.
+#   This file is offered as-is, without any warranty.
+#
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+#   Based on eLyXer: convert LyX source files to HTML output.
+#   http://alexfernandez.github.io/elyxer/
+
+# --end--
+# Alex 20101110
+# eLyXer standalone formula conversion to HTML.
+
+
+
+
+import sys
+
+class Trace(object):
+  "A tracing class"
+
+  debugmode = False
+  quietmode = False
+  showlinesmode = False
+
+  prefix = None
+
+  def debug(cls, message):
+    "Show a debug message"
+    if not Trace.debugmode or Trace.quietmode:
+      return
+    Trace.show(message, sys.stdout)
+
+  def message(cls, message):
+    "Show a trace message"
+    if Trace.quietmode:
+      return
+    if Trace.prefix and Trace.showlinesmode:
+      message = Trace.prefix + message
+    Trace.show(message, sys.stdout)
+
+  def error(cls, message):
+    "Show an error message"
+    message = '* ' + message
+    if Trace.prefix and Trace.showlinesmode:
+      message = Trace.prefix + message
+    Trace.show(message, sys.stderr)
+
+  def fatal(cls, message):
+    "Show an error message and terminate"
+    Trace.error('FATAL: ' + message)
+    exit(-1)
+
+  def show(cls, message, channel):
+    "Show a message out of a channel"
+    if sys.version_info < (3,0):
+      message = message.encode('utf-8')
+    channel.write(message + '\n')
+
+  debug = classmethod(debug)
+  message = classmethod(message)
+  error = classmethod(error)
+  fatal = classmethod(fatal)
+  show = classmethod(show)
+
+
+
+
+import os.path
+import sys
+
+
+class BibStylesConfig(object):
+  "Configuration class from elyxer.config file"
+
+  abbrvnat = {
+      
+      u'@article':u'$authors. $title. <i>$journal</i>,{ {$volume:}$pages,} $month $year.{ doi: $doi.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'cite':u'$surname($year)', 
+      u'default':u'$authors. <i>$title</i>. $publisher, $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      }
+
+  alpha = {
+      
+      u'@article':u'$authors. $title.{ <i>$journal</i>{, {$volume}{($number)}}{: $pages}{, $year}.}{ <a href="$url">$url</a>.}{ <a href="$filename">$filename</a>.}{ $note.}', 
+      u'cite':u'$Sur$YY', 
+      u'default':u'$authors. $title.{ <i>$journal</i>,} $year.{ <a href="$url">$url</a>.}{ <a href="$filename">$filename</a>.}{ $note.}', 
+      }
+
+  authordate2 = {
+      
+      u'@article':u'$authors. $year. $title. <i>$journal</i>, <b>$volume</b>($number), $pages.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@book':u'$authors. $year. <i>$title</i>. $publisher.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'cite':u'$surname, $year', 
+      u'default':u'$authors. $year. <i>$title</i>. $publisher.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      }
+
+  default = {
+      
+      u'@article':u'$authors: “$title”, <i>$journal</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@book':u'{$authors: }<i>$title</i>{ ($editor, ed.)}.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@booklet':u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@conference':u'$authors: “$title”, <i>$journal</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@inbook':u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@incollection':u'$authors: <i>$title</i>{ in <i>$booktitle</i>{ ($editor, ed.)}}.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@inproceedings':u'$authors: “$title”, <i>$booktitle</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@manual':u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@mastersthesis':u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@misc':u'$authors: <i>$title</i>.{{ $publisher,}{ $howpublished,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@phdthesis':u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@proceedings':u'$authors: “$title”, <i>$journal</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@techreport':u'$authors: <i>$title</i>, $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@unpublished':u'$authors: “$title”, <i>$journal</i>, $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'cite':u'$index', 
+      u'default':u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      }
+
+  defaulttags = {
+      u'YY':u'??', u'authors':u'', u'surname':u'', 
+      }
+
+  ieeetr = {
+      
+      u'@article':u'$authors, “$title”, <i>$journal</i>, vol. $volume, no. $number, pp. $pages, $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@book':u'$authors, <i>$title</i>. $publisher, $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'cite':u'$index', 
+      u'default':u'$authors, “$title”. $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      }
+
+  plain = {
+      
+      u'@article':u'$authors. $title.{ <i>$journal</i>{, {$volume}{($number)}}{:$pages}{, $year}.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@book':u'$authors. <i>$title</i>. $publisher,{ $month} $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@incollection':u'$authors. $title.{ In <i>$booktitle</i> {($editor, ed.)}.} $publisher,{ $month} $year.{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'@inproceedings':u'$authors. $title. { <i>$booktitle</i>{, {$volume}{($number)}}{:$pages}{, $year}.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      u'cite':u'$index', 
+      u'default':u'{$authors. }$title.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', 
+      }
+
+  vancouver = {
+      
+      u'@article':u'$authors. $title. <i>$journal</i>, $year{;{<b>$volume</b>}{($number)}{:$pages}}.{ URL: <a href="$url">$url</a>.}{ $note.}', 
+      u'@book':u'$authors. $title. {$publisher, }$year.{ URL: <a href="$url">$url</a>.}{ $note.}', 
+      u'cite':u'$index', 
+      u'default':u'$authors. $title; {$publisher, }$year.{ $howpublished.}{ URL: <a href="$url">$url</a>.}{ $note.}', 
+      }
+
+class BibTeXConfig(object):
+  "Configuration class from elyxer.config file"
+
+  replaced = {
+      u'--':u'—', u'..':u'.', 
+      }
+
+class ContainerConfig(object):
+  "Configuration class from elyxer.config file"
+
+  endings = {
+      u'Align':u'\\end_layout', u'BarredText':u'\\bar', 
+      u'BoldText':u'\\series', u'Cell':u'</cell', 
+      u'ChangeDeleted':u'\\change_unchanged', 
+      u'ChangeInserted':u'\\change_unchanged', u'ColorText':u'\\color', 
+      u'EmphaticText':u'\\emph', u'Hfill':u'\\hfill', u'Inset':u'\\end_inset', 
+      u'Layout':u'\\end_layout', u'LyXFooter':u'\\end_document', 
+      u'LyXHeader':u'\\end_header', u'Row':u'</row', u'ShapedText':u'\\shape', 
+      u'SizeText':u'\\size', u'StrikeOut':u'\\strikeout', 
+      u'TextFamily':u'\\family', u'VersalitasText':u'\\noun', 
+      }
+
+  extracttext = {
+      u'allowed':[u'StringContainer',u'Constant',u'FormulaConstant',], 
+      u'cloned':[u'',], 
+      u'extracted':[u'PlainLayout',u'TaggedText',u'Align',u'Caption',u'TextFamily',u'EmphaticText',u'VersalitasText',u'BarredText',u'SizeText',u'ColorText',u'LangLine',u'Formula',u'Bracket',u'RawText',u'BibTag',u'FormulaNumber',u'AlphaCommand',u'EmptyCommand',u'OneParamFunction',u'SymbolFunction',u'TextFunction',u'FontFunction',u'CombiningFunction',u'DecoratingFunction',u'FormulaSymbol',u'BracketCommand',u'TeXCode',], 
+      }
+
+  startendings = {
+      u'\\begin_deeper':u'\\end_deeper', u'\\begin_inset':u'\\end_inset', 
+      u'\\begin_layout':u'\\end_layout', 
+      }
+
+  starts = {
+      u'':u'StringContainer', u'#LyX':u'BlackBox', u'</lyxtabular':u'BlackBox', 
+      u'<cell':u'Cell', u'<column':u'Column', u'<row':u'Row', 
+      u'\\align':u'Align', u'\\bar':u'BarredText', 
+      u'\\bar default':u'BlackBox', u'\\bar no':u'BlackBox', 
+      u'\\begin_body':u'BlackBox', u'\\begin_deeper':u'DeeperList', 
+      u'\\begin_document':u'BlackBox', u'\\begin_header':u'LyXHeader', 
+      u'\\begin_inset Argument':u'ShortTitle', 
+      u'\\begin_inset Box':u'BoxInset', u'\\begin_inset Branch':u'Branch', 
+      u'\\begin_inset Caption':u'Caption', 
+      u'\\begin_inset CommandInset bibitem':u'BiblioEntry', 
+      u'\\begin_inset CommandInset bibtex':u'BibTeX', 
+      u'\\begin_inset CommandInset citation':u'BiblioCitation', 
+      u'\\begin_inset CommandInset href':u'URL', 
+      u'\\begin_inset CommandInset include':u'IncludeInset', 
+      u'\\begin_inset CommandInset index_print':u'PrintIndex', 
+      u'\\begin_inset CommandInset label':u'Label', 
+      u'\\begin_inset CommandInset line':u'LineInset', 
+      u'\\begin_inset CommandInset nomencl_print':u'PrintNomenclature', 
+      u'\\begin_inset CommandInset nomenclature':u'NomenclatureEntry', 
+      u'\\begin_inset CommandInset ref':u'Reference', 
+      u'\\begin_inset CommandInset toc':u'TableOfContents', 
+      u'\\begin_inset ERT':u'ERT', u'\\begin_inset Flex':u'FlexInset', 
+      u'\\begin_inset Flex Chunkref':u'NewfangledChunkRef', 
+      u'\\begin_inset Flex Marginnote':u'SideNote', 
+      u'\\begin_inset Flex Sidenote':u'SideNote', 
+      u'\\begin_inset Flex URL':u'FlexURL', u'\\begin_inset Float':u'Float', 
+      u'\\begin_inset FloatList':u'ListOf', u'\\begin_inset Foot':u'Footnote', 
+      u'\\begin_inset Formula':u'Formula', 
+      u'\\begin_inset FormulaMacro':u'FormulaMacro', 
+      u'\\begin_inset Graphics':u'Image', 
+      u'\\begin_inset Index':u'IndexReference', 
+      u'\\begin_inset Info':u'InfoInset', 
+      u'\\begin_inset LatexCommand bibitem':u'BiblioEntry', 
+      u'\\begin_inset LatexCommand bibtex':u'BibTeX', 
+      u'\\begin_inset LatexCommand cite':u'BiblioCitation', 
+      u'\\begin_inset LatexCommand citealt':u'BiblioCitation', 
+      u'\\begin_inset LatexCommand citep':u'BiblioCitation', 
+      u'\\begin_inset LatexCommand citet':u'BiblioCitation', 
+      u'\\begin_inset LatexCommand htmlurl':u'URL', 
+      u'\\begin_inset LatexCommand index':u'IndexReference', 
+      u'\\begin_inset LatexCommand label':u'Label', 
+      u'\\begin_inset LatexCommand nomenclature':u'NomenclatureEntry', 
+      u'\\begin_inset LatexCommand prettyref':u'Reference', 
+      u'\\begin_inset LatexCommand printindex':u'PrintIndex', 
+      u'\\begin_inset LatexCommand printnomenclature':u'PrintNomenclature', 
+      u'\\begin_inset LatexCommand ref':u'Reference', 
+      u'\\begin_inset LatexCommand tableofcontents':u'TableOfContents', 
+      u'\\begin_inset LatexCommand url':u'URL', 
+      u'\\begin_inset LatexCommand vref':u'Reference', 
+      u'\\begin_inset Marginal':u'SideNote', 
+      u'\\begin_inset Newline':u'NewlineInset', 
+      u'\\begin_inset Newpage':u'NewPageInset', u'\\begin_inset Note':u'Note', 
+      u'\\begin_inset OptArg':u'ShortTitle', 
+      u'\\begin_inset Phantom':u'PhantomText', 
+      u'\\begin_inset Quotes':u'QuoteContainer', 
+      u'\\begin_inset Tabular':u'Table', u'\\begin_inset Text':u'InsetText', 
+      u'\\begin_inset VSpace':u'VerticalSpace', u'\\begin_inset Wrap':u'Wrap', 
+      u'\\begin_inset listings':u'Listing', 
+      u'\\begin_inset script':u'ScriptInset', u'\\begin_inset space':u'Space', 
+      u'\\begin_layout':u'Layout', u'\\begin_layout Abstract':u'Abstract', 
+      u'\\begin_layout Author':u'Author', 
+      u'\\begin_layout Bibliography':u'Bibliography', 
+      u'\\begin_layout Chunk':u'NewfangledChunk', 
+      u'\\begin_layout Description':u'Description', 
+      u'\\begin_layout Enumerate':u'ListItem', 
+      u'\\begin_layout Itemize':u'ListItem', u'\\begin_layout List':u'List', 
+      u'\\begin_layout LyX-Code':u'LyXCode', 
+      u'\\begin_layout Plain':u'PlainLayout', 
+      u'\\begin_layout Standard':u'StandardLayout', 
+      u'\\begin_layout Title':u'Title', u'\\begin_preamble':u'LyXPreamble', 
+      u'\\change_deleted':u'ChangeDeleted', 
+      u'\\change_inserted':u'ChangeInserted', 
+      u'\\change_unchanged':u'BlackBox', u'\\color':u'ColorText', 
+      u'\\color inherit':u'BlackBox', u'\\color none':u'BlackBox', 
+      u'\\emph default':u'BlackBox', u'\\emph off':u'BlackBox', 
+      u'\\emph on':u'EmphaticText', u'\\emph toggle':u'EmphaticText', 
+      u'\\end_body':u'LyXFooter', u'\\family':u'TextFamily', 
+      u'\\family default':u'BlackBox', u'\\family roman':u'BlackBox', 
+      u'\\hfill':u'Hfill', u'\\labelwidthstring':u'BlackBox', 
+      u'\\lang':u'LangLine', u'\\length':u'InsetLength', 
+      u'\\lyxformat':u'LyXFormat', u'\\lyxline':u'LyXLine', 
+      u'\\newline':u'Newline', u'\\newpage':u'NewPage', 
+      u'\\noindent':u'BlackBox', u'\\noun default':u'BlackBox', 
+      u'\\noun off':u'BlackBox', u'\\noun on':u'VersalitasText', 
+      u'\\paragraph_spacing':u'BlackBox', u'\\series bold':u'BoldText', 
+      u'\\series default':u'BlackBox', u'\\series medium':u'BlackBox', 
+      u'\\shape':u'ShapedText', u'\\shape default':u'BlackBox', 
+      u'\\shape up':u'BlackBox', u'\\size':u'SizeText', 
+      u'\\size normal':u'BlackBox', u'\\start_of_appendix':u'StartAppendix', 
+      u'\\strikeout default':u'BlackBox', u'\\strikeout on':u'StrikeOut', 
+      }
+
+  string = {
+      u'startcommand':u'\\', 
+      }
+
+  table = {
+      u'headers':[u'<lyxtabular',u'<features',], 
+      }
+
+class EscapeConfig(object):
+  "Configuration class from elyxer.config file"
+
+  chars = {
+      u'\n':u'', u' -- ':u' — ', u' --- ':u' — ', u'\'':u'’', u'`':u'‘', 
+      }
+
+  commands = {
+      u'\\InsetSpace \\space{}':u' ', u'\\InsetSpace \\thinspace{}':u' ', 
+      u'\\InsetSpace ~':u' ', u'\\SpecialChar \\-':u'', 
+      u'\\SpecialChar \\@.':u'.', u'\\SpecialChar \\ldots{}':u'…', 
+      u'\\SpecialChar \\menuseparator':u' ▷ ', 
+      u'\\SpecialChar \\nobreakdash-':u'-', u'\\SpecialChar \\slash{}':u'/', 
+      u'\\SpecialChar \\textcompwordmark{}':u'', u'\\backslash':u'\\', 
+      }
+
+  entities = {
+      u'&':u'&amp;', u'<':u'&lt;', u'>':u'&gt;', 
+      }
+
+  html = {
+      u'/>':u'>', 
+      }
+
+  iso885915 = {
+      u' ':u'&nbsp;', u' ':u'&emsp;', u' ':u'&#8197;', 
+      }
+
+  nonunicode = {
+      u' ':u' ', 
+      }
+
+class FormulaConfig(object):
+  "Configuration class from elyxer.config file"
+
+  alphacommands = {
+      u'\\AA':u'Å', u'\\AE':u'Æ', 
+      u'\\AmS':u'<span class="versalitas">AmS</span>', u'\\Angstroem':u'Å', 
+      u'\\DH':u'Ð', u'\\Koppa':u'Ϟ', u'\\L':u'Ł', u'\\Micro':u'µ', u'\\O':u'Ø', 
+      u'\\OE':u'Œ', u'\\Sampi':u'Ϡ', u'\\Stigma':u'Ϛ', u'\\TH':u'Þ', 
+      u'\\aa':u'å', u'\\ae':u'æ', u'\\alpha':u'α', u'\\beta':u'β', 
+      u'\\delta':u'δ', u'\\dh':u'ð', u'\\digamma':u'ϝ', u'\\epsilon':u'ϵ', 
+      u'\\eta':u'η', u'\\eth':u'ð', u'\\gamma':u'γ', u'\\i':u'ı', 
+      u'\\imath':u'ı', u'\\iota':u'ι', u'\\j':u'ȷ', u'\\jmath':u'ȷ', 
+      u'\\kappa':u'κ', u'\\koppa':u'ϟ', u'\\l':u'ł', u'\\lambda':u'λ', 
+      u'\\mu':u'μ', u'\\nu':u'ν', u'\\o':u'ø', u'\\oe':u'œ', u'\\omega':u'ω', 
+      u'\\phi':u'φ', u'\\pi':u'π', u'\\psi':u'ψ', u'\\rho':u'ρ', 
+      u'\\sampi':u'ϡ', u'\\sigma':u'σ', u'\\ss':u'ß', u'\\stigma':u'ϛ', 
+      u'\\tau':u'τ', u'\\tcohm':u'Ω', u'\\textcrh':u'ħ', u'\\th':u'þ', 
+      u'\\theta':u'θ', u'\\upsilon':u'υ', u'\\varDelta':u'∆', 
+      u'\\varGamma':u'Γ', u'\\varLambda':u'Λ', u'\\varOmega':u'Ω', 
+      u'\\varPhi':u'Φ', u'\\varPi':u'Π', u'\\varPsi':u'Ψ', u'\\varSigma':u'Σ', 
+      u'\\varTheta':u'Θ', u'\\varUpsilon':u'Υ', u'\\varXi':u'Ξ', 
+      u'\\varbeta':u'ϐ', u'\\varepsilon':u'ε', u'\\varkappa':u'ϰ', 
+      u'\\varphi':u'φ', u'\\varpi':u'ϖ', u'\\varrho':u'ϱ', u'\\varsigma':u'ς', 
+      u'\\vartheta':u'ϑ', u'\\xi':u'ξ', u'\\zeta':u'ζ', 
+      }
+
+  array = {
+      u'begin':u'\\begin', u'cellseparator':u'&', u'end':u'\\end', 
+      u'rowseparator':u'\\\\', 
+      }
+
+  bigbrackets = {
+      u'(':[u'⎛',u'⎜',u'⎝',], u')':[u'⎞',u'⎟',u'⎠',], u'[':[u'⎡',u'⎢',u'⎣',], 
+      u']':[u'⎤',u'⎥',u'⎦',], u'{':[u'⎧',u'⎪',u'⎨',u'⎩',], u'|':[u'|',], 
+      u'}':[u'⎫',u'⎪',u'⎬',u'⎭',], u'∥':[u'∥',], 
+      }
+
+  bigsymbols = {
+      u'∑':[u'⎲',u'⎳',], u'∫':[u'⌠',u'⌡',], 
+      }
+
+  bracketcommands = {
+      u'\\left':u'span class="symbol"', 
+      u'\\left.':u'<span class="leftdot"></span>', 
+      u'\\middle':u'span class="symbol"', u'\\right':u'span class="symbol"', 
+      u'\\right.':u'<span class="rightdot"></span>', 
+      }
+
+  combiningfunctions = {
+      u'\\"':u'̈', u'\\\'':u'́', u'\\^':u'̂', u'\\`':u'̀', u'\\acute':u'́', 
+      u'\\bar':u'̄', u'\\breve':u'̆', u'\\c':u'̧', u'\\check':u'̌', 
+      u'\\dddot':u'⃛', u'\\ddot':u'̈', u'\\dot':u'̇', u'\\grave':u'̀', 
+      u'\\hat':u'̂', u'\\mathring':u'̊', u'\\overleftarrow':u'⃖', 
+      u'\\overrightarrow':u'⃗', u'\\r':u'̊', u'\\s':u'̩', 
+      u'\\textcircled':u'⃝', u'\\textsubring':u'̥', u'\\tilde':u'̃', 
+      u'\\v':u'̌', u'\\vec':u'⃗', u'\\~':u'̃', 
+      }
+
+  commands = {
+      u'\\ ':u' ', u'\\!':u'', u'\\#':u'#', u'\\$':u'$', u'\\%':u'%', 
+      u'\\&':u'&', u'\\,':u' ', u'\\:':u' ', u'\\;':u' ', u'\\AC':u'∿', 
+      u'\\APLcomment':u'⍝', u'\\APLdownarrowbox':u'⍗', u'\\APLinput':u'⍞', 
+      u'\\APLinv':u'⌹', u'\\APLleftarrowbox':u'⍇', u'\\APLlog':u'⍟', 
+      u'\\APLrightarrowbox':u'⍈', u'\\APLuparrowbox':u'⍐', u'\\Box':u'□', 
+      u'\\Bumpeq':u'≎', u'\\CIRCLE':u'●', u'\\Cap':u'⋒', 
+      u'\\CapitalDifferentialD':u'ⅅ', u'\\CheckedBox':u'☑', u'\\Circle':u'○', 
+      u'\\Coloneqq':u'⩴', u'\\ComplexI':u'ⅈ', u'\\ComplexJ':u'ⅉ', 
+      u'\\Corresponds':u'≙', u'\\Cup':u'⋓', u'\\Delta':u'Δ', u'\\Diamond':u'◇', 
+      u'\\Diamondblack':u'◆', u'\\Diamonddot':u'⟐', u'\\DifferentialD':u'ⅆ', 
+      u'\\Downarrow':u'⇓', u'\\EUR':u'€', u'\\Euler':u'ℇ', 
+      u'\\ExponetialE':u'ⅇ', u'\\Finv':u'Ⅎ', u'\\Game':u'⅁', u'\\Gamma':u'Γ', 
+      u'\\Im':u'ℑ', u'\\Join':u'⨝', u'\\LEFTCIRCLE':u'◖', u'\\LEFTcircle':u'◐', 
+      u'\\LHD':u'◀', u'\\Lambda':u'Λ', u'\\Lbag':u'⟅', u'\\Leftarrow':u'⇐', 
+      u'\\Lleftarrow':u'⇚', u'\\Longleftarrow':u'⟸', 
+      u'\\Longleftrightarrow':u'⟺', u'\\Longrightarrow':u'⟹', u'\\Lparen':u'⦅', 
+      u'\\Lsh':u'↰', u'\\Mapsfrom':u'⇐|', u'\\Mapsto':u'|⇒', u'\\Omega':u'Ω', 
+      u'\\P':u'¶', u'\\Phi':u'Φ', u'\\Pi':u'Π', u'\\Pr':u'Pr', u'\\Psi':u'Ψ', 
+      u'\\Qoppa':u'Ϙ', u'\\RHD':u'▶', u'\\RIGHTCIRCLE':u'◗', 
+      u'\\RIGHTcircle':u'◑', u'\\Rbag':u'⟆', u'\\Re':u'ℜ', u'\\Rparen':u'⦆', 
+      u'\\Rrightarrow':u'⇛', u'\\Rsh':u'↱', u'\\S':u'§', u'\\Sigma':u'Σ', 
+      u'\\Square':u'☐', u'\\Subset':u'⋐', u'\\Sun':u'☉', u'\\Supset':u'⋑', 
+      u'\\Theta':u'Θ', u'\\Uparrow':u'⇑', u'\\Updownarrow':u'⇕', 
+      u'\\Upsilon':u'Υ', u'\\Vdash':u'⊩', u'\\Vert':u'∥', u'\\Vvdash':u'⊪', 
+      u'\\XBox':u'☒', u'\\Xi':u'Ξ', u'\\Yup':u'⅄', u'\\\\':u'<br/>', 
+      u'\\_':u'_', u'\\aleph':u'ℵ', u'\\amalg':u'∐', u'\\anchor':u'⚓', 
+      u'\\angle':u'∠', u'\\aquarius':u'♒', u'\\arccos':u'arccos', 
+      u'\\arcsin':u'arcsin', u'\\arctan':u'arctan', u'\\arg':u'arg', 
+      u'\\aries':u'♈', u'\\arrowbullet':u'➢', u'\\ast':u'∗', u'\\asymp':u'≍', 
+      u'\\backepsilon':u'∍', u'\\backprime':u'‵', u'\\backsimeq':u'⋍', 
+      u'\\backslash':u'\\', u'\\ballotx':u'✗', u'\\barwedge':u'⊼', 
+      u'\\because':u'∵', u'\\beth':u'ℶ', u'\\between':u'≬', u'\\bigcap':u'∩', 
+      u'\\bigcirc':u'○', u'\\bigcup':u'∪', u'\\bigodot':u'⊙', 
+      u'\\bigoplus':u'⊕', u'\\bigotimes':u'⊗', u'\\bigsqcup':u'⊔', 
+      u'\\bigstar':u'★', u'\\bigtriangledown':u'▽', u'\\bigtriangleup':u'△', 
+      u'\\biguplus':u'⊎', u'\\bigvee':u'∨', u'\\bigwedge':u'∧', 
+      u'\\biohazard':u'☣', u'\\blacklozenge':u'⧫', u'\\blacksmiley':u'☻', 
+      u'\\blacksquare':u'■', u'\\blacktriangle':u'▲', 
+      u'\\blacktriangledown':u'▼', u'\\blacktriangleleft':u'◂', 
+      u'\\blacktriangleright':u'▶', u'\\blacktriangleup':u'▴', u'\\bot':u'⊥', 
+      u'\\bowtie':u'⋈', u'\\box':u'▫', u'\\boxast':u'⧆', u'\\boxbar':u'◫', 
+      u'\\boxbox':u'⧈', u'\\boxbslash':u'⧅', u'\\boxcircle':u'⧇', 
+      u'\\boxdot':u'⊡', u'\\boxminus':u'⊟', u'\\boxplus':u'⊞', 
+      u'\\boxslash':u'⧄', u'\\boxtimes':u'⊠', u'\\bullet':u'•', 
+      u'\\bumpeq':u'≏', u'\\cancer':u'♋', u'\\cap':u'∩', u'\\capricornus':u'♑', 
+      u'\\cat':u'⁀', u'\\cdot':u'⋅', u'\\cdots':u'⋯', u'\\cent':u'¢', 
+      u'\\centerdot':u'∙', u'\\checkmark':u'✓', u'\\chi':u'χ', u'\\circ':u'∘', 
+      u'\\circeq':u'≗', u'\\circlearrowleft':u'↺', u'\\circlearrowright':u'↻', 
+      u'\\circledR':u'®', u'\\circledast':u'⊛', u'\\circledbslash':u'⦸', 
+      u'\\circledcirc':u'⊚', u'\\circleddash':u'⊝', u'\\circledgtr':u'⧁', 
+      u'\\circledless':u'⧀', u'\\clubsuit':u'♣', u'\\colon':u': ', u'\\coloneqq':u'≔', 
+      u'\\complement':u'∁', u'\\cong':u'≅', u'\\coprod':u'∐', 
+      u'\\copyright':u'©', u'\\cos':u'cos', u'\\cosh':u'cosh', u'\\cot':u'cot', 
+      u'\\coth':u'coth', u'\\csc':u'csc', u'\\cup':u'∪', u'\\curlyvee':u'⋎', 
+      u'\\curlywedge':u'⋏', u'\\curvearrowleft':u'↶', 
+      u'\\curvearrowright':u'↷', u'\\dag':u'†', u'\\dagger':u'†', 
+      u'\\daleth':u'ℸ', u'\\dashleftarrow':u'⇠', u'\\dashv':u'⊣', 
+      u'\\ddag':u'‡', u'\\ddagger':u'‡', u'\\ddots':u'⋱', u'\\deg':u'deg', 
+      u'\\det':u'det', u'\\diagdown':u'╲', u'\\diagup':u'╱', 
+      u'\\diameter':u'⌀', u'\\diamond':u'◇', u'\\diamondsuit':u'♦', 
+      u'\\dim':u'dim', u'\\div':u'÷', u'\\divideontimes':u'⋇', 
+      u'\\dotdiv':u'∸', u'\\doteq':u'≐', u'\\doteqdot':u'≑', u'\\dotplus':u'∔', 
+      u'\\dots':u'…', u'\\doublebarwedge':u'⌆', u'\\downarrow':u'↓', 
+      u'\\downdownarrows':u'⇊', u'\\downharpoonleft':u'⇃', 
+      u'\\downharpoonright':u'⇂', u'\\dsub':u'⩤', u'\\earth':u'♁', 
+      u'\\eighthnote':u'♪', u'\\ell':u'ℓ', u'\\emptyset':u'∅', 
+      u'\\eqcirc':u'≖', u'\\eqcolon':u'≕', u'\\eqsim':u'≂', u'\\euro':u'€', 
+      u'\\exists':u'∃', u'\\exp':u'exp', u'\\fallingdotseq':u'≒', 
+      u'\\fcmp':u'⨾', u'\\female':u'♀', u'\\flat':u'♭', u'\\forall':u'∀', 
+      u'\\fourth':u'⁗', u'\\frown':u'⌢', u'\\frownie':u'☹', u'\\gcd':u'gcd', 
+      u'\\gemini':u'♊', u'\\geq)':u'≥', u'\\geqq':u'≧', u'\\geqslant':u'≥', 
+      u'\\gets':u'←', u'\\gg':u'≫', u'\\ggg':u'⋙', u'\\gimel':u'ℷ', 
+      u'\\gneqq':u'≩', u'\\gnsim':u'⋧', u'\\gtrdot':u'⋗', u'\\gtreqless':u'⋚', 
+      u'\\gtreqqless':u'⪌', u'\\gtrless':u'≷', u'\\gtrsim':u'≳', 
+      u'\\guillemotleft':u'«', u'\\guillemotright':u'»', u'\\hbar':u'ℏ', 
+      u'\\heartsuit':u'♥', u'\\hfill':u'<span class="hfill"> </span>', 
+      u'\\hom':u'hom', u'\\hookleftarrow':u'↩', u'\\hookrightarrow':u'↪', 
+      u'\\hslash':u'ℏ', u'\\idotsint':u'<span class="bigsymbol">∫⋯∫</span>', 
+      u'\\iiint':u'<span class="bigsymbol">∭</span>', 
+      u'\\iint':u'<span class="bigsymbol">∬</span>', u'\\imath':u'ı', 
+      u'\\inf':u'inf', u'\\infty':u'∞', u'\\intercal':u'⊺', 
+      u'\\interleave':u'⫴', u'\\invamp':u'⅋', u'\\invneg':u'⌐', 
+      u'\\jmath':u'ȷ', u'\\jupiter':u'♃', u'\\ker':u'ker', u'\\land':u'∧', 
+      u'\\landupint':u'<span class="bigsymbol">∱</span>', u'\\lang':u'⟪', 
+      u'\\langle':u'⟨', u'\\lblot':u'⦉', u'\\lbrace':u'{', u'\\lbrace)':u'{', 
+      u'\\lbrack':u'[', u'\\lceil':u'⌈', u'\\ldots':u'…', u'\\leadsto':u'⇝', 
+      u'\\leftarrow)':u'←', u'\\leftarrowtail':u'↢', u'\\leftarrowtobar':u'⇤', 
+      u'\\leftharpoondown':u'↽', u'\\leftharpoonup':u'↼', 
+      u'\\leftleftarrows':u'⇇', u'\\leftleftharpoons':u'⥢', u'\\leftmoon':u'☾', 
+      u'\\leftrightarrow':u'↔', u'\\leftrightarrows':u'⇆', 
+      u'\\leftrightharpoons':u'⇋', u'\\leftthreetimes':u'⋋', u'\\leo':u'♌', 
+      u'\\leq)':u'≤', u'\\leqq':u'≦', u'\\leqslant':u'≤', u'\\lessdot':u'⋖', 
+      u'\\lesseqgtr':u'⋛', u'\\lesseqqgtr':u'⪋', u'\\lessgtr':u'≶', 
+      u'\\lesssim':u'≲', u'\\lfloor':u'⌊', u'\\lg':u'lg', u'\\lgroup':u'⟮', 
+      u'\\lhd':u'⊲', u'\\libra':u'♎', u'\\lightning':u'↯', u'\\limg':u'⦇', 
+      u'\\liminf':u'liminf', u'\\limsup':u'limsup', u'\\ll':u'≪', 
+      u'\\llbracket':u'⟦', u'\\llcorner':u'⌞', u'\\lll':u'⋘', u'\\ln':u'ln', 
+      u'\\lneqq':u'≨', u'\\lnot':u'¬', u'\\lnsim':u'⋦', u'\\log':u'log', 
+      u'\\longleftarrow':u'⟵', u'\\longleftrightarrow':u'⟷', 
+      u'\\longmapsto':u'⟼', u'\\longrightarrow':u'⟶', u'\\looparrowleft':u'↫', 
+      u'\\looparrowright':u'↬', u'\\lor':u'∨', u'\\lozenge':u'◊', 
+      u'\\lrcorner':u'⌟', u'\\ltimes':u'⋉', u'\\lyxlock':u'', u'\\male':u'♂', 
+      u'\\maltese':u'✠', u'\\mapsfrom':u'↤', u'\\mapsto':u'↦', 
+      u'\\mathcircumflex':u'^', u'\\max':u'max', u'\\measuredangle':u'∡', 
+      u'\\medbullet':u'⚫', u'\\medcirc':u'⚪', u'\\mercury':u'☿', u'\\mho':u'℧', 
+      u'\\mid':u'∣', u'\\min':u'min', u'\\models':u'⊨', u'\\mp':u'∓', 
+      u'\\multimap':u'⊸', u'\\nLeftarrow':u'⇍', u'\\nLeftrightarrow':u'⇎', 
+      u'\\nRightarrow':u'⇏', u'\\nVDash':u'⊯', u'\\nabla':u'∇', 
+      u'\\napprox':u'≉', u'\\natural':u'♮', u'\\ncong':u'≇', u'\\nearrow':u'↗', 
+      u'\\neg':u'¬', u'\\neg)':u'¬', u'\\neptune':u'♆', u'\\nequiv':u'≢', 
+      u'\\newline':u'<br/>', u'\\nexists':u'∄', u'\\ngeqslant':u'≱', 
+      u'\\ngtr':u'≯', u'\\ngtrless':u'≹', u'\\ni':u'∋', u'\\ni)':u'∋', 
+      u'\\nleftarrow':u'↚', u'\\nleftrightarrow':u'↮', u'\\nleqslant':u'≰', 
+      u'\\nless':u'≮', u'\\nlessgtr':u'≸', u'\\nmid':u'∤', u'\\nolimits':u'', 
+      u'\\nonumber':u'', u'\\not':u'¬', u'\\not<':u'≮', u'\\not=':u'≠', 
+      u'\\not>':u'≯', u'\\notbackslash':u'⍀', u'\\notin':u'∉', u'\\notni':u'∌', 
+      u'\\notslash':u'⌿', u'\\nparallel':u'∦', u'\\nprec':u'⊀', 
+      u'\\nrightarrow':u'↛', u'\\nsim':u'≁', u'\\nsimeq':u'≄', 
+      u'\\nsqsubset':u'⊏̸', u'\\nsubseteq':u'⊈', u'\\nsucc':u'⊁', 
+      u'\\nsucccurlyeq':u'⋡', u'\\nsupset':u'⊅', u'\\nsupseteq':u'⊉', 
+      u'\\ntriangleleft':u'⋪', u'\\ntrianglelefteq':u'⋬', 
+      u'\\ntriangleright':u'⋫', u'\\ntrianglerighteq':u'⋭', u'\\nvDash':u'⊭', 
+      u'\\nvdash':u'⊬', u'\\nwarrow':u'↖', u'\\odot':u'⊙', 
+      u'\\officialeuro':u'€', u'\\oiiint':u'<span class="bigsymbol">∰</span>', 
+      u'\\oiint':u'<span class="bigsymbol">∯</span>', 
+      u'\\oint':u'<span class="bigsymbol">∮</span>', 
+      u'\\ointclockwise':u'<span class="bigsymbol">∲</span>', 
+      u'\\ointctrclockwise':u'<span class="bigsymbol">∳</span>', 
+      u'\\ominus':u'⊖', u'\\oplus':u'⊕', u'\\oslash':u'⊘', u'\\otimes':u'⊗', 
+      u'\\owns':u'∋', u'\\parallel':u'∥', u'\\partial':u'∂', u'\\pencil':u'✎', 
+      u'\\perp':u'⊥', u'\\pisces':u'♓', u'\\pitchfork':u'⋔', u'\\pluto':u'♇', 
+      u'\\pm':u'±', u'\\pointer':u'➪', u'\\pointright':u'☞', u'\\pounds':u'£', 
+      u'\\prec':u'≺', u'\\preccurlyeq':u'≼', u'\\preceq':u'≼', 
+      u'\\precsim':u'≾', u'\\prime':u'′', u'\\prompto':u'∝', u'\\qoppa':u'ϙ', 
+      u'\\qquad':u'  ', u'\\quad':u' ', u'\\quarternote':u'♩', 
+      u'\\radiation':u'☢', u'\\rang':u'⟫', u'\\rangle':u'⟩', u'\\rblot':u'⦊', 
+      u'\\rbrace':u'}', u'\\rbrace)':u'}', u'\\rbrack':u']', u'\\rceil':u'⌉', 
+      u'\\recycle':u'♻', u'\\rfloor':u'⌋', u'\\rgroup':u'⟯', u'\\rhd':u'⊳', 
+      u'\\rightangle':u'∟', u'\\rightarrow)':u'→', u'\\rightarrowtail':u'↣', 
+      u'\\rightarrowtobar':u'⇥', u'\\rightharpoondown':u'⇁', 
+      u'\\rightharpoonup':u'⇀', u'\\rightharpooondown':u'⇁', 
+      u'\\rightharpooonup':u'⇀', u'\\rightleftarrows':u'⇄', 
+      u'\\rightleftharpoons':u'⇌', u'\\rightmoon':u'☽', 
+      u'\\rightrightarrows':u'⇉', u'\\rightrightharpoons':u'⥤', 
+      u'\\rightthreetimes':u'⋌', u'\\rimg':u'⦈', u'\\risingdotseq':u'≓', 
+      u'\\rrbracket':u'⟧', u'\\rsub':u'⩥', u'\\rtimes':u'⋊', 
+      u'\\sagittarius':u'♐', u'\\saturn':u'♄', u'\\scorpio':u'♏', 
+      u'\\searrow':u'↘', u'\\sec':u'sec', u'\\second':u'″', u'\\setminus':u'∖', 
+      u'\\sharp':u'♯', u'\\simeq':u'≃', u'\\sin':u'sin', u'\\sinh':u'sinh', 
+      u'\\sixteenthnote':u'♬', u'\\skull':u'☠', u'\\slash':u'∕', 
+      u'\\smallsetminus':u'∖', u'\\smalltriangledown':u'▿', 
+      u'\\smalltriangleleft':u'◃', u'\\smalltriangleright':u'▹', 
+      u'\\smalltriangleup':u'▵', u'\\smile':u'⌣', u'\\smiley':u'☺', 
+      u'\\spadesuit':u'♠', u'\\spddot':u'¨', u'\\sphat':u'', 
+      u'\\sphericalangle':u'∢', u'\\spot':u'⦁', u'\\sptilde':u'~', 
+      u'\\sqcap':u'⊓', u'\\sqcup':u'⊔', u'\\sqsubset':u'⊏', 
+      u'\\sqsubseteq':u'⊑', u'\\sqsupset':u'⊐', u'\\sqsupseteq':u'⊒', 
+      u'\\square':u'□', u'\\sslash':u'⫽', u'\\star':u'⋆', u'\\steaming':u'☕', 
+      u'\\subseteqq':u'⫅', u'\\subsetneqq':u'⫋', u'\\succ':u'≻', 
+      u'\\succcurlyeq':u'≽', u'\\succeq':u'≽', u'\\succnsim':u'⋩', 
+      u'\\succsim':u'≿', u'\\sun':u'☼', u'\\sup':u'sup', u'\\supseteqq':u'⫆', 
+      u'\\supsetneqq':u'⫌', u'\\surd':u'√', u'\\swarrow':u'↙', 
+      u'\\swords':u'⚔', u'\\talloblong':u'⫾', u'\\tan':u'tan', 
+      u'\\tanh':u'tanh', u'\\taurus':u'♉', u'\\textasciicircum':u'^', 
+      u'\\textasciitilde':u'~', u'\\textbackslash':u'\\', 
+      u'\\textcopyright':u'©\'', u'\\textdegree':u'°', u'\\textellipsis':u'…', 
+      u'\\textemdash':u'—', u'\\textendash':u'—', u'\\texteuro':u'€', 
+      u'\\textgreater':u'>', u'\\textless':u'<', u'\\textordfeminine':u'ª', 
+      u'\\textordmasculine':u'º', u'\\textquotedblleft':u'“', 
+      u'\\textquotedblright':u'”', u'\\textquoteright':u'’', 
+      u'\\textregistered':u'®', u'\\textrightarrow':u'→', 
+      u'\\textsection':u'§', u'\\texttrademark':u'™', 
+      u'\\texttwosuperior':u'²', u'\\textvisiblespace':u' ', 
+      u'\\therefore':u'∴', u'\\third':u'‴', u'\\top':u'⊤', u'\\triangle':u'△', 
+      u'\\triangleleft':u'⊲', u'\\trianglelefteq':u'⊴', u'\\triangleq':u'≜', 
+      u'\\triangleright':u'▷', u'\\trianglerighteq':u'⊵', 
+      u'\\twoheadleftarrow':u'↞', u'\\twoheadrightarrow':u'↠', 
+      u'\\twonotes':u'♫', u'\\udot':u'⊍', u'\\ulcorner':u'⌜', u'\\unlhd':u'⊴', 
+      u'\\unrhd':u'⊵', u'\\unrhl':u'⊵', u'\\uparrow':u'↑', 
+      u'\\updownarrow':u'↕', u'\\upharpoonleft':u'↿', u'\\upharpoonright':u'↾', 
+      u'\\uplus':u'⊎', u'\\upuparrows':u'⇈', u'\\uranus':u'♅', 
+      u'\\urcorner':u'⌝', u'\\vDash':u'⊨', u'\\varclubsuit':u'♧', 
+      u'\\vardiamondsuit':u'♦', u'\\varheartsuit':u'♥', u'\\varnothing':u'∅', 
+      u'\\varspadesuit':u'♤', u'\\vdash':u'⊢', u'\\vdots':u'⋮', u'\\vee':u'∨', 
+      u'\\vee)':u'∨', u'\\veebar':u'⊻', u'\\vert':u'∣', u'\\virgo':u'♍', 
+      u'\\warning':u'⚠', u'\\wasylozenge':u'⌑', u'\\wedge':u'∧', 
+      u'\\wedge)':u'∧', u'\\wp':u'℘', u'\\wr':u'≀', u'\\yen':u'¥', 
+      u'\\yinyang':u'☯', u'\\{':u'{', u'\\|':u'∥', u'\\}':u'}', 
+      }
+
+  decoratedcommand = {
+      
+      }
+
+  decoratingfunctions = {
+      u'\\overleftarrow':u'⟵', u'\\overrightarrow':u'⟶', u'\\widehat':u'^', 
+      }
+
+  endings = {
+      u'bracket':u'}', u'complex':u'\\]', u'endafter':u'}', 
+      u'endbefore':u'\\end{', u'squarebracket':u']', 
+      }
+
+  environments = {
+      u'align':[u'r',u'l',], u'eqnarray':[u'r',u'c',u'l',], 
+      u'gathered':[u'l',u'l',], 
+      }
+
+  fontfunctions = {
+      u'\\boldsymbol':u'b', u'\\mathbb':u'span class="blackboard"', 
+      u'\\mathbb{A}':u'𝔸', u'\\mathbb{B}':u'𝔹', u'\\mathbb{C}':u'ℂ', 
+      u'\\mathbb{D}':u'𝔻', u'\\mathbb{E}':u'𝔼', u'\\mathbb{F}':u'𝔽', 
+      u'\\mathbb{G}':u'𝔾', u'\\mathbb{H}':u'ℍ', u'\\mathbb{J}':u'𝕁', 
+      u'\\mathbb{K}':u'𝕂', u'\\mathbb{L}':u'𝕃', u'\\mathbb{N}':u'ℕ', 
+      u'\\mathbb{O}':u'𝕆', u'\\mathbb{P}':u'ℙ', u'\\mathbb{Q}':u'ℚ', 
+      u'\\mathbb{R}':u'ℝ', u'\\mathbb{S}':u'𝕊', u'\\mathbb{T}':u'𝕋', 
+      u'\\mathbb{W}':u'𝕎', u'\\mathbb{Z}':u'ℤ', u'\\mathbf':u'b', 
+      u'\\mathcal':u'span class="scriptfont"', u'\\mathcal{B}':u'ℬ', 
+      u'\\mathcal{E}':u'ℰ', u'\\mathcal{F}':u'ℱ', u'\\mathcal{H}':u'ℋ', 
+      u'\\mathcal{I}':u'ℐ', u'\\mathcal{L}':u'ℒ', u'\\mathcal{M}':u'ℳ', 
+      u'\\mathcal{R}':u'ℛ', u'\\mathfrak':u'span class="fraktur"', 
+      u'\\mathfrak{C}':u'ℭ', u'\\mathfrak{F}':u'𝔉', u'\\mathfrak{H}':u'ℌ', 
+      u'\\mathfrak{I}':u'ℑ', u'\\mathfrak{R}':u'ℜ', u'\\mathfrak{Z}':u'ℨ', 
+      u'\\mathit':u'i', u'\\mathring{A}':u'Å', u'\\mathring{U}':u'Ů', 
+      u'\\mathring{a}':u'å', u'\\mathring{u}':u'ů', u'\\mathring{w}':u'ẘ', 
+      u'\\mathring{y}':u'ẙ', u'\\mathrm':u'span class="mathrm"', 
+      u'\\mathscr':u'span class="scriptfont"', u'\\mathscr{B}':u'ℬ', 
+      u'\\mathscr{E}':u'ℰ', u'\\mathscr{F}':u'ℱ', u'\\mathscr{H}':u'ℋ', 
+      u'\\mathscr{I}':u'ℐ', u'\\mathscr{L}':u'ℒ', u'\\mathscr{M}':u'ℳ', 
+      u'\\mathscr{R}':u'ℛ', u'\\mathsf':u'span class="mathsf"', 
+      u'\\mathtt':u'tt', 
+      }
+
+  hybridfunctions = {
+      u'\\addcontentsline':[u'{$p!}{$q!}{$r!}',u'f0{}',u'ignored',], 
+      u'\\addtocontents':[u'{$p!}{$q!}',u'f0{}',u'ignored',], 
+      u'\\backmatter':[u'',u'f0{}',u'ignored',], 
+      u'\\binom':[u'{$1}{$2}',u'f2{(}f0{f1{$1}f1{$2}}f2{)}',u'span class="binom"',u'span class="binomstack"',u'span class="bigsymbol"',], 
+      u'\\boxed':[u'{$1}',u'f0{$1}',u'span class="boxed"',], 
+      u'\\cfrac':[u'[$p!]{$1}{$2}',u'f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}',u'span class="fullfraction"',u'span class="numerator align-$p"',u'span class="denominator"',u'span class="ignored"',], 
+      u'\\color':[u'{$p!}{$1}',u'f0{$1}',u'span style="color: $p;"',], 
+      u'\\colorbox':[u'{$p!}{$1}',u'f0{$1}',u'span class="colorbox" style="background: $p;"',], 
+      u'\\dbinom':[u'{$1}{$2}',u'(f0{f1{f2{$1}}f1{f2{ }}f1{f2{$2}}})',u'span class="binomial"',u'span class="binomrow"',u'span class="binomcell"',], 
+      u'\\dfrac':[u'{$1}{$2}',u'f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}',u'span class="fullfraction"',u'span class="numerator"',u'span class="denominator"',u'span class="ignored"',], 
+      u'\\displaystyle':[u'{$1}',u'f0{$1}',u'span class="displaystyle"',], 
+      u'\\fancyfoot':[u'[$p!]{$q!}',u'f0{}',u'ignored',], 
+      u'\\fancyhead':[u'[$p!]{$q!}',u'f0{}',u'ignored',], 
+      u'\\fbox':[u'{$1}',u'f0{$1}',u'span class="fbox"',], 
+      u'\\fboxrule':[u'{$p!}',u'f0{}',u'ignored',], 
+      u'\\fboxsep':[u'{$p!}',u'f0{}',u'ignored',], 
+      u'\\fcolorbox':[u'{$p!}{$q!}{$1}',u'f0{$1}',u'span class="boxed" style="border-color: $p; background: $q;"',], 
+      u'\\frac':[u'{$1}{$2}',u'f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}',u'span class="fraction"',u'span class="numerator"',u'span class="denominator"',u'span class="ignored"',], 
+      u'\\framebox':[u'[$p!][$q!]{$1}',u'f0{$1}',u'span class="framebox align-$q" style="width: $p;"',], 
+      u'\\frontmatter':[u'',u'f0{}',u'ignored',], 
+      u'\\href':[u'[$o]{$u!}{$t!}',u'f0{$t}',u'a href="$u"',], 
+      u'\\hspace':[u'{$p!}',u'f0{ }',u'span class="hspace" style="width: $p;"',], 
+      u'\\leftroot':[u'{$p!}',u'f0{ }',u'span class="leftroot" style="width: $p;px"',], 
+      u'\\mainmatter':[u'',u'f0{}',u'ignored',], 
+      u'\\markboth':[u'{$p!}{$q!}',u'f0{}',u'ignored',], 
+      u'\\markright':[u'{$p!}',u'f0{}',u'ignored',], 
+      u'\\nicefrac':[u'{$1}{$2}',u'f0{f1{$1}⁄f2{$2}}',u'span class="fraction"',u'sup class="numerator"',u'sub class="denominator"',u'span class="ignored"',], 
+      u'\\parbox':[u'[$p!]{$w!}{$1}',u'f0{1}',u'div class="Boxed" style="width: $w;"',], 
+      u'\\raisebox':[u'{$p!}{$1}',u'f0{$1.font}',u'span class="raisebox" style="vertical-align: $p;"',], 
+      u'\\renewenvironment':[u'{$1!}{$2!}{$3!}',u'',], 
+      u'\\rule':[u'[$v!]{$w!}{$h!}',u'f0/',u'hr class="line" style="width: $w; height: $h;"',], 
+      u'\\scriptscriptstyle':[u'{$1}',u'f0{$1}',u'span class="scriptscriptstyle"',], 
+      u'\\scriptstyle':[u'{$1}',u'f0{$1}',u'span class="scriptstyle"',], 
+      u'\\sqrt':[u'[$0]{$1}',u'f0{f1{$0}f2{√}f4{(}f3{$1}f4{)}}',u'span class="sqrt"',u'sup class="root"',u'span class="radical"',u'span class="root"',u'span class="ignored"',], 
+      u'\\stackrel':[u'{$1}{$2}',u'f0{f1{$1}f2{$2}}',u'span class="stackrel"',u'span class="upstackrel"',u'span class="downstackrel"',], 
+      u'\\tbinom':[u'{$1}{$2}',u'(f0{f1{f2{$1}}f1{f2{ }}f1{f2{$2}}})',u'span class="binomial"',u'span class="binomrow"',u'span class="binomcell"',], 
+      u'\\textcolor':[u'{$p!}{$1}',u'f0{$1}',u'span style="color: $p;"',], 
+      u'\\textstyle':[u'{$1}',u'f0{$1}',u'span class="textstyle"',], 
+      u'\\thispagestyle':[u'{$p!}',u'f0{}',u'ignored',], 
+      u'\\unit':[u'[$0]{$1}',u'$0f0{$1.font}',u'span class="unit"',], 
+      u'\\unitfrac':[u'[$0]{$1}{$2}',u'$0f0{f1{$1.font}⁄f2{$2.font}}',u'span class="fraction"',u'sup class="unit"',u'sub class="unit"',], 
+      u'\\uproot':[u'{$p!}',u'f0{ }',u'span class="uproot" style="width: $p;px"',], 
+      u'\\url':[u'{$u!}',u'f0{$u}',u'a href="$u"',], 
+      u'\\vspace':[u'{$p!}',u'f0{ }',u'span class="vspace" style="height: $p;"',], 
+      }
+
+  hybridsizes = {
+      u'\\binom':u'$1+$2', u'\\cfrac':u'$1+$2', u'\\dbinom':u'$1+$2+1', 
+      u'\\dfrac':u'$1+$2', u'\\frac':u'$1+$2', u'\\tbinom':u'$1+$2+1', 
+      }
+
+  labelfunctions = {
+      u'\\label':u'a name="#"', 
+      }
+
+  limitcommands = {
+      u'\\biginterleave':u'⫼', u'\\bigsqcap':u'⨅', u'\\fint':u'⨏', 
+      u'\\iiiint':u'⨌', u'\\int':u'∫', u'\\intop':u'∫', u'\\lim':u'lim', 
+      u'\\prod':u'∏', u'\\smallint':u'∫', u'\\sqint':u'⨖', u'\\sum':u'∑', 
+      u'\\varointclockwise':u'∲', u'\\varprod':u'⨉', u'\\zcmp':u'⨟', 
+      u'\\zhide':u'⧹', u'\\zpipe':u'⨠', u'\\zproject':u'⨡', 
+      }
+
+  misccommands = {
+      u'\\limits':u'LimitPreviousCommand', u'\\newcommand':u'MacroDefinition', 
+      u'\\renewcommand':u'MacroDefinition', 
+      u'\\setcounter':u'SetCounterFunction', u'\\tag':u'FormulaTag', 
+      u'\\tag*':u'FormulaTag', u'\\today':u'TodayCommand', 
+      }
+
+  modified = {
+      u'\n':u'', u' ':u'', u'$':u'', u'&':u'	', u'\'':u'’', u'+':u' + ', 
+      u',':u', ', u'-':u' − ', u'/':u' ⁄ ', u':':u' : ', u'<':u' &lt; ', 
+      u'=':u' = ', u'>':u' &gt; ', u'@':u'', u'~':u'', 
+      }
+
+  onefunctions = {
+      u'\\Big':u'span class="bigsymbol"', u'\\Bigg':u'span class="hugesymbol"', 
+      u'\\bar':u'span class="bar"', u'\\begin{array}':u'span class="arraydef"', 
+      u'\\big':u'span class="symbol"', u'\\bigg':u'span class="largesymbol"', 
+      u'\\bigl':u'span class="bigsymbol"', u'\\bigr':u'span class="bigsymbol"', 
+      u'\\centering':u'span class="align-center"', 
+      u'\\ensuremath':u'span class="ensuremath"', 
+      u'\\hphantom':u'span class="phantom"', 
+      u'\\noindent':u'span class="noindent"', 
+      u'\\overbrace':u'span class="overbrace"', 
+      u'\\overline':u'span class="overline"', 
+      u'\\phantom':u'span class="phantom"', 
+      u'\\underbrace':u'span class="underbrace"', u'\\underline':u'u', 
+      u'\\vphantom':u'span class="phantom"', 
+      }
+
+  spacedcommands = {
+      u'\\Bot':u'⫫', u'\\Doteq':u'≑', u'\\DownArrowBar':u'⤓', 
+      u'\\DownLeftTeeVector':u'⥞', u'\\DownLeftVectorBar':u'⥖', 
+      u'\\DownRightTeeVector':u'⥟', u'\\DownRightVectorBar':u'⥗', 
+      u'\\Equal':u'⩵', u'\\LeftArrowBar':u'⇤', u'\\LeftDownTeeVector':u'⥡', 
+      u'\\LeftDownVectorBar':u'⥙', u'\\LeftTeeVector':u'⥚', 
+      u'\\LeftTriangleBar':u'⧏', u'\\LeftUpTeeVector':u'⥠', 
+      u'\\LeftUpVectorBar':u'⥘', u'\\LeftVectorBar':u'⥒', 
+      u'\\Leftrightarrow':u'⇔', u'\\Longmapsfrom':u'⟽', u'\\Longmapsto':u'⟾', 
+      u'\\MapsDown':u'↧', u'\\MapsUp':u'↥', u'\\Nearrow':u'⇗', 
+      u'\\NestedGreaterGreater':u'⪢', u'\\NestedLessLess':u'⪡', 
+      u'\\NotGreaterLess':u'≹', u'\\NotGreaterTilde':u'≵', 
+      u'\\NotLessTilde':u'≴', u'\\Nwarrow':u'⇖', u'\\Proportion':u'∷', 
+      u'\\RightArrowBar':u'⇥', u'\\RightDownTeeVector':u'⥝', 
+      u'\\RightDownVectorBar':u'⥕', u'\\RightTeeVector':u'⥛', 
+      u'\\RightTriangleBar':u'⧐', u'\\RightUpTeeVector':u'⥜', 
+      u'\\RightUpVectorBar':u'⥔', u'\\RightVectorBar':u'⥓', 
+      u'\\Rightarrow':u'⇒', u'\\Same':u'⩶', u'\\Searrow':u'⇘', 
+      u'\\Swarrow':u'⇙', u'\\Top':u'⫪', u'\\UpArrowBar':u'⤒', u'\\VDash':u'⊫', 
+      u'\\approx':u'≈', u'\\approxeq':u'≊', u'\\backsim':u'∽', u'\\barin':u'⋶', 
+      u'\\barleftharpoon':u'⥫', u'\\barrightharpoon':u'⥭', u'\\bij':u'⤖', 
+      u'\\coloneq':u'≔', u'\\corresponds':u'≙', u'\\curlyeqprec':u'⋞', 
+      u'\\curlyeqsucc':u'⋟', u'\\dashrightarrow':u'⇢', u'\\dlsh':u'↲', 
+      u'\\downdownharpoons':u'⥥', u'\\downuparrows':u'⇵', 
+      u'\\downupharpoons':u'⥯', u'\\drsh':u'↳', u'\\eqslantgtr':u'⪖', 
+      u'\\eqslantless':u'⪕', u'\\equiv':u'≡', u'\\ffun':u'⇻', u'\\finj':u'⤕', 
+      u'\\ge':u'≥', u'\\geq':u'≥', u'\\ggcurly':u'⪼', u'\\gnapprox':u'⪊', 
+      u'\\gneq':u'⪈', u'\\gtrapprox':u'⪆', u'\\hash':u'⋕', u'\\iddots':u'⋰', 
+      u'\\implies':u' ⇒ ', u'\\in':u'∈', u'\\le':u'≤', u'\\leftarrow':u'←', 
+      u'\\leftarrowtriangle':u'⇽', u'\\leftbarharpoon':u'⥪', 
+      u'\\leftrightarrowtriangle':u'⇿', u'\\leftrightharpoon':u'⥊', 
+      u'\\leftrightharpoondown':u'⥐', u'\\leftrightharpoonup':u'⥎', 
+      u'\\leftrightsquigarrow':u'↭', u'\\leftslice':u'⪦', 
+      u'\\leftsquigarrow':u'⇜', u'\\leftupdownharpoon':u'⥑', u'\\leq':u'≤', 
+      u'\\lessapprox':u'⪅', u'\\llcurly':u'⪻', u'\\lnapprox':u'⪉', 
+      u'\\lneq':u'⪇', u'\\longmapsfrom':u'⟻', u'\\multimapboth':u'⧟', 
+      u'\\multimapdotbothA':u'⊶', u'\\multimapdotbothB':u'⊷', 
+      u'\\multimapinv':u'⟜', u'\\nVdash':u'⊮', u'\\ne':u'≠', u'\\neq':u'≠', 
+      u'\\ngeq':u'≱', u'\\nleq':u'≰', u'\\nni':u'∌', u'\\not\\in':u'∉', 
+      u'\\notasymp':u'≭', u'\\npreceq':u'⋠', u'\\nsqsubseteq':u'⋢', 
+      u'\\nsqsupseteq':u'⋣', u'\\nsubset':u'⊄', u'\\nsucceq':u'⋡', 
+      u'\\pfun':u'⇸', u'\\pinj':u'⤔', u'\\precapprox':u'⪷', u'\\preceqq':u'⪳', 
+      u'\\precnapprox':u'⪹', u'\\precnsim':u'⋨', u'\\propto':u'∝', 
+      u'\\psur':u'⤀', u'\\rightarrow':u'→', u'\\rightarrowtriangle':u'⇾', 
+      u'\\rightbarharpoon':u'⥬', u'\\rightleftharpoon':u'⥋', 
+      u'\\rightslice':u'⪧', u'\\rightsquigarrow':u'⇝', 
+      u'\\rightupdownharpoon':u'⥏', u'\\sim':u'~', u'\\strictfi':u'⥼', 
+      u'\\strictif':u'⥽', u'\\subset':u'⊂', u'\\subseteq':u'⊆', 
+      u'\\subsetneq':u'⊊', u'\\succapprox':u'⪸', u'\\succeqq':u'⪴', 
+      u'\\succnapprox':u'⪺', u'\\supset':u'⊃', u'\\supseteq':u'⊇', 
+      u'\\supsetneq':u'⊋', u'\\times':u'×', u'\\to':u'→', 
+      u'\\updownarrows':u'⇅', u'\\updownharpoons':u'⥮', u'\\upupharpoons':u'⥣', 
+      u'\\vartriangleleft':u'⊲', u'\\vartriangleright':u'⊳', 
+      }
+
+  starts = {
+      u'beginafter':u'}', u'beginbefore':u'\\begin{', u'bracket':u'{', 
+      u'command':u'\\', u'comment':u'%', u'complex':u'\\[', u'simple':u'$', 
+      u'squarebracket':u'[', u'unnumbered':u'*', 
+      }
+
+  symbolfunctions = {
+      u'^':u'sup', u'_':u'sub', 
+      }
+
+  textfunctions = {
+      u'\\mbox':u'span class="mbox"', u'\\text':u'span class="text"', 
+      u'\\textbf':u'b', u'\\textipa':u'span class="textipa"', u'\\textit':u'i', 
+      u'\\textnormal':u'span class="textnormal"', 
+      u'\\textrm':u'span class="textrm"', 
+      u'\\textsc':u'span class="versalitas"', 
+      u'\\textsf':u'span class="textsf"', u'\\textsl':u'i', u'\\texttt':u'tt', 
+      u'\\textup':u'span class="normal"', 
+      }
+
+  unmodified = {
+      
+      u'characters':[u'.',u'*',u'€',u'(',u')',u'[',u']',u'·',u'!',u';',u'|',u'§',u'"',], 
+      }
+
+  urls = {
+      u'googlecharts':u'http://chart.googleapis.com/chart?cht=tx&chl=', 
+      }
+
+class GeneralConfig(object):
+  "Configuration class from elyxer.config file"
+
+  version = {
+      u'date':u'2015-02-26', u'lyxformat':u'413', u'number':u'1.2.5', 
+      }
+
+class HeaderConfig(object):
+  "Configuration class from elyxer.config file"
+
+  parameters = {
+      u'beginpreamble':u'\\begin_preamble', u'branch':u'\\branch', 
+      u'documentclass':u'\\textclass', u'endbranch':u'\\end_branch', 
+      u'endpreamble':u'\\end_preamble', u'language':u'\\language', 
+      u'lstset':u'\\lstset', u'outputchanges':u'\\output_changes', 
+      u'paragraphseparation':u'\\paragraph_separation', 
+      u'pdftitle':u'\\pdf_title', u'secnumdepth':u'\\secnumdepth', 
+      u'tocdepth':u'\\tocdepth', 
+      }
+
+  styles = {
+      
+      u'article':[u'article',u'aastex',u'aapaper',u'acmsiggraph',u'sigplanconf',u'achemso',u'amsart',u'apa',u'arab-article',u'armenian-article',u'article-beamer',u'chess',u'dtk',u'elsarticle',u'heb-article',u'IEEEtran',u'iopart',u'kluwer',u'scrarticle-beamer',u'scrartcl',u'extarticle',u'paper',u'mwart',u'revtex4',u'spie',u'svglobal3',u'ltugboat',u'agu-dtd',u'jgrga',u'agums',u'entcs',u'egs',u'ijmpc',u'ijmpd',u'singlecol-new',u'doublecol-new',u'isprs',u'tarticle',u'jsarticle',u'jarticle',u'jss',u'literate-article',u'siamltex',u'cl2emult',u'llncs',u'svglobal',u'svjog',u'svprobth',], 
+      u'book':[u'book',u'amsbook',u'scrbook',u'extbook',u'tufte-book',u'report',u'extreport',u'scrreprt',u'memoir',u'tbook',u'jsbook',u'jbook',u'mwbk',u'svmono',u'svmult',u'treport',u'jreport',u'mwrep',], 
+      }
+
+class ImageConfig(object):
+  "Configuration class from elyxer.config file"
+
+  converters = {
+      
+      u'imagemagick':u'convert[ -density $scale][ -define $format:use-cropbox=true] "$input" "$output"', 
+      u'inkscape':u'inkscape "$input" --export-png="$output"', 
+      u'lyx':u'lyx -C "$input" "$output"', 
+      }
+
+  cropboxformats = {
+      u'.eps':u'ps', u'.pdf':u'pdf', u'.ps':u'ps', 
+      }
+
+  formats = {
+      u'default':u'.png', u'vector':[u'.svg',u'.eps',], 
+      }
+
+class LayoutConfig(object):
+  "Configuration class from elyxer.config file"
+
+  groupable = {
+      
+      u'allowed':[u'StringContainer',u'Constant',u'TaggedText',u'Align',u'TextFamily',u'EmphaticText',u'VersalitasText',u'BarredText',u'SizeText',u'ColorText',u'LangLine',u'Formula',], 
+      }
+
+class NewfangleConfig(object):
+  "Configuration class from elyxer.config file"
+
+  constants = {
+      u'chunkref':u'chunkref{', u'endcommand':u'}', u'endmark':u'&gt;', 
+      u'startcommand':u'\\', u'startmark':u'=&lt;', 
+      }
+
+class NumberingConfig(object):
+  "Configuration class from elyxer.config file"
+
+  layouts = {
+      
+      u'ordered':[u'Chapter',u'Section',u'Subsection',u'Subsubsection',u'Paragraph',], 
+      u'roman':[u'Part',u'Book',], 
+      }
+
+  sequence = {
+      u'symbols':[u'*',u'**',u'†',u'‡',u'§',u'§§',u'¶',u'¶¶',u'#',u'##',], 
+      }
+
+class StyleConfig(object):
+  "Configuration class from elyxer.config file"
+
+  hspaces = {
+      u'\\enskip{}':u' ', u'\\hfill{}':u'<span class="hfill"> </span>', 
+      u'\\hspace*{\\fill}':u' ', u'\\hspace*{}':u'', u'\\hspace{}':u' ', 
+      u'\\negthinspace{}':u'', u'\\qquad{}':u'  ', u'\\quad{}':u' ', 
+      u'\\space{}':u' ', u'\\thinspace{}':u' ', u'~':u' ', 
+      }
+
+  quotes = {
+      u'ald':u'»', u'als':u'›', u'ard':u'«', u'ars':u'‹', u'eld':u'&ldquo;', 
+      u'els':u'&lsquo;', u'erd':u'&rdquo;', u'ers':u'&rsquo;', u'fld':u'«', 
+      u'fls':u'‹', u'frd':u'»', u'frs':u'›', u'gld':u'„', u'gls':u'‚', 
+      u'grd':u'“', u'grs':u'‘', u'pld':u'„', u'pls':u'‚', u'prd':u'”', 
+      u'prs':u'’', u'sld':u'”', u'srd':u'”', 
+      }
+
+  referenceformats = {
+      u'eqref':u'(@↕)', u'formatted':u'¶↕', u'nameref':u'$↕', u'pageref':u'#↕', 
+      u'ref':u'@↕', u'vpageref':u'on-page#↕', u'vref':u'@on-page#↕', 
+      }
+
+  size = {
+      u'ignoredtexts':[u'col',u'text',u'line',u'page',u'theight',u'pheight',], 
+      }
+
+  vspaces = {
+      u'bigskip':u'<div class="bigskip"> </div>', 
+      u'defskip':u'<div class="defskip"> </div>', 
+      u'medskip':u'<div class="medskip"> </div>', 
+      u'smallskip':u'<div class="smallskip"> </div>', 
+      u'vfill':u'<div class="vfill"> </div>', 
+      }
+
+class TOCConfig(object):
+  "Configuration class from elyxer.config file"
+
+  extractplain = {
+      
+      u'allowed':[u'StringContainer',u'Constant',u'TaggedText',u'Align',u'TextFamily',u'EmphaticText',u'VersalitasText',u'BarredText',u'SizeText',u'ColorText',u'LangLine',u'Formula',], 
+      u'cloned':[u'',], u'extracted':[u'',], 
+      }
+
+  extracttitle = {
+      u'allowed':[u'StringContainer',u'Constant',u'Space',], 
+      u'cloned':[u'TextFamily',u'EmphaticText',u'VersalitasText',u'BarredText',u'SizeText',u'ColorText',u'LangLine',u'Formula',], 
+      u'extracted':[u'PlainLayout',u'TaggedText',u'Align',u'Caption',u'StandardLayout',u'FlexInset',], 
+      }
+
+class TagConfig(object):
+  "Configuration class from elyxer.config file"
+
+  barred = {
+      u'under':u'u', 
+      }
+
+  family = {
+      u'sans':u'span class="sans"', u'typewriter':u'tt', 
+      }
+
+  flex = {
+      u'CharStyle:Code':u'span class="code"', 
+      u'CharStyle:MenuItem':u'span class="menuitem"', 
+      u'Code':u'span class="code"', u'MenuItem':u'span class="menuitem"', 
+      u'Noun':u'span class="noun"', u'Strong':u'span class="strong"', 
+      }
+
+  group = {
+      u'layouts':[u'Quotation',u'Quote',], 
+      }
+
+  layouts = {
+      u'Center':u'div', u'Chapter':u'h?', u'Date':u'h2', u'Paragraph':u'div', 
+      u'Part':u'h1', u'Quotation':u'blockquote', u'Quote':u'blockquote', 
+      u'Section':u'h?', u'Subsection':u'h?', u'Subsubsection':u'h?', 
+      }
+
+  listitems = {
+      u'Enumerate':u'ol', u'Itemize':u'ul', 
+      }
+
+  notes = {
+      u'Comment':u'', u'Greyedout':u'span class="greyedout"', u'Note':u'', 
+      }
+
+  script = {
+      u'subscript':u'sub', u'superscript':u'sup', 
+      }
+
+  shaped = {
+      u'italic':u'i', u'slanted':u'i', u'smallcaps':u'span class="versalitas"', 
+      }
+
+class TranslationConfig(object):
+  "Configuration class from elyxer.config file"
+
+  constants = {
+      u'Appendix':u'Appendix', u'Book':u'Book', u'Chapter':u'Chapter', 
+      u'Paragraph':u'Paragraph', u'Part':u'Part', u'Section':u'Section', 
+      u'Subsection':u'Subsection', u'Subsubsection':u'Subsubsection', 
+      u'abstract':u'Abstract', u'bibliography':u'Bibliography', 
+      u'figure':u'figure', u'float-algorithm':u'Algorithm ', 
+      u'float-figure':u'Figure ', u'float-listing':u'Listing ', 
+      u'float-table':u'Table ', u'float-tableau':u'Tableau ', 
+      u'footnotes':u'Footnotes', u'generated-by':u'Document generated by ', 
+      u'generated-on':u' on ', u'index':u'Index', 
+      u'jsmath-enable':u'Please enable JavaScript on your browser.', 
+      u'jsmath-requires':u' requires JavaScript to correctly process the mathematics on this page. ', 
+      u'jsmath-warning':u'Warning: ', u'list-algorithm':u'List of Algorithms', 
+      u'list-figure':u'List of Figures', u'list-table':u'List of Tables', 
+      u'list-tableau':u'List of Tableaux', u'main-page':u'Main page', 
+      u'next':u'Next', u'nomenclature':u'Nomenclature', 
+      u'on-page':u' on page ', u'prev':u'Prev', u'references':u'References', 
+      u'toc':u'Table of Contents', u'toc-for':u'Contents for ', u'up':u'Up', 
+      }
+
+  languages = {
+      u'american':u'en', u'british':u'en', u'deutsch':u'de', u'dutch':u'nl', 
+      u'english':u'en', u'french':u'fr', u'ngerman':u'de', u'russian':u'ru', 
+      u'spanish':u'es', 
+      }
+
+
+
+
+
+
+class CommandLineParser(object):
+  "A parser for runtime options"
+
+  def __init__(self, options):
+    self.options = options
+
+  def parseoptions(self, args):
+    "Parse command line options"
+    if len(args) == 0:
+      return None
+    while len(args) > 0 and args[0].startswith('--'):
+      key, value = self.readoption(args)
+      if not key:
+        return 'Option ' + value + ' not recognized'
+      if not value:
+        return 'Option ' + key + ' needs a value'
+      setattr(self.options, key, value)
+    return None
+
+  def readoption(self, args):
+    "Read the key and value for an option"
+    arg = args[0][2:]
+    del args[0]
+    if '=' in arg:
+      key = self.readequalskey(arg, args)
+    else:
+      key = arg.replace('-', '')
+    if not hasattr(self.options, key):
+      return None, key
+    current = getattr(self.options, key)
+    if isinstance(current, bool):
+      return key, True
+    # read value
+    if len(args) == 0:
+      return key, None
+    if args[0].startswith('"'):
+      initial = args[0]
+      del args[0]
+      return key, self.readquoted(args, initial)
+    value = args[0].decode('utf-8')
+    del args[0]
+    if isinstance(current, list):
+      current.append(value)
+      return key, current
+    return key, value
+
+  def readquoted(self, args, initial):
+    "Read a value between quotes"
+    Trace.error('Oops')
+    value = initial[1:]
+    while len(args) > 0 and not args[0].endswith('"') and not args[0].startswith('--'):
+      Trace.error('Appending ' + args[0])
+      value += ' ' + args[0]
+      del args[0]
+    if len(args) == 0 or args[0].startswith('--'):
+      return None
+    value += ' ' + args[0:-1]
+    return value
+
+  def readequalskey(self, arg, args):
+    "Read a key using equals"
+    split = arg.split('=', 1)
+    key = split[0]
+    value = split[1]
+    args.insert(0, value)
+    return key
+
+
+
+class Options(object):
+  "A set of runtime options"
+
+  instance = None
+
+  location = None
+  nocopy = False
+  copyright = False
+  debug = False
+  quiet = False
+  version = False
+  hardversion = False
+  versiondate = False
+  html = False
+  help = False
+  showlines = True
+  unicode = False
+  iso885915 = False
+  css = []
+  favicon = ''
+  title = None
+  directory = None
+  destdirectory = None
+  toc = False
+  toctarget = ''
+  tocfor = None
+  forceformat = None
+  lyxformat = False
+  target = None
+  splitpart = None
+  memory = True
+  lowmem = False
+  nobib = False
+  converter = 'imagemagick'
+  raw = False
+  jsmath = None
+  mathjax = None
+  nofooter = False
+  simplemath = False
+  template = None
+  noconvert = False
+  notoclabels = False
+  letterfoot = True
+  numberfoot = False
+  symbolfoot = False
+  hoverfoot = True
+  marginfoot = False
+  endfoot = False
+  supfoot = True
+  alignfoot = False
+  footnotes = None
+  imageformat = None
+  copyimages = False
+  googlecharts = False
+  embedcss = []
+
+  branches = dict()
+
+  def parseoptions(self, args):
+    "Parse command line options"
+    Options.location = args[0]
+    del args[0]
+    parser = CommandLineParser(Options)
+    result = parser.parseoptions(args)
+    if result:
+      Trace.error(result)
+      self.usage()
+    self.processoptions()
+
+  def processoptions(self):
+    "Process all options parsed."
+    if Options.help:
+      self.usage()
+    if Options.version:
+      self.showversion()
+    if Options.hardversion:
+      self.showhardversion()
+    if Options.versiondate:
+      self.showversiondate()
+    if Options.lyxformat:
+      self.showlyxformat()
+    if Options.splitpart:
+      try:
+        Options.splitpart = int(Options.splitpart)
+        if Options.splitpart <= 0:
+          Trace.error('--splitpart requires a number bigger than zero')
+          self.usage()
+      except:
+        Trace.error('--splitpart needs a numeric argument, not ' + Options.splitpart)
+        self.usage()
+    if Options.lowmem or Options.toc or Options.tocfor:
+      Options.memory = False
+    self.parsefootnotes()
+    if Options.forceformat and not Options.imageformat:
+      Options.imageformat = Options.forceformat
+    if Options.imageformat == 'copy':
+      Options.copyimages = True
+    if Options.css == []:
+      Options.css = ['http://elyxer.nongnu.org/lyx.css']
+    if Options.favicon == '':
+      pass # no default favicon
+    if Options.html:
+      Options.simplemath = True
+    if Options.toc and not Options.tocfor:
+      Trace.error('Option --toc is deprecated; use --tocfor "page" instead')
+      Options.tocfor = Options.toctarget
+    if Options.nocopy:
+      Trace.error('Option --nocopy is deprecated; it is no longer needed')
+    if Options.jsmath:
+      Trace.error('Option --jsmath is deprecated; use --mathjax instead')
+    # set in Trace if necessary
+    for param in dir(Trace):
+      if param.endswith('mode'):
+        setattr(Trace, param, getattr(self, param[:-4]))
+
+  def usage(self):
+    "Show correct usage"
+    Trace.error('Usage: ' + os.path.basename(Options.location) + ' [options] [filein] [fileout]')
+    Trace.error('Convert LyX input file "filein" to HTML file "fileout".')
+    Trace.error('If filein (or fileout) is not given use standard input (or output).')
+    Trace.error('Main program of the eLyXer package (http://elyxer.nongnu.org/).')
+    self.showoptions()
+
+  def parsefootnotes(self):
+    "Parse footnotes options."
+    if not Options.footnotes:
+      return
+    Options.marginfoot = False
+    Options.letterfoot = False
+    Options.hoverfoot = False
+    options = Options.footnotes.split(',')
+    for option in options:
+      footoption = option + 'foot'
+      if hasattr(Options, footoption):
+        setattr(Options, footoption, True)
+      else:
+        Trace.error('Unknown footnotes option: ' + option)
+    if not Options.endfoot and not Options.marginfoot and not Options.hoverfoot:
+      Options.hoverfoot = True
+    if not Options.numberfoot and not Options.symbolfoot:
+      Options.letterfoot = True
+
+  def showoptions(self):
+    "Show all possible options"
+    Trace.error('  Common options:')
+    Trace.error('    --help:                 show this online help')
+    Trace.error('    --quiet:                disables all runtime messages')
+    Trace.error('')
+    Trace.error('  Advanced options:')
+    Trace.error('    --debug:                enable debugging messages (for developers)')
+    Trace.error('    --version:              show version number and release date')
+    Trace.error('    --lyxformat:            return the highest LyX version supported')
+    Trace.error('  Options for HTML output:')
+    Trace.error('    --title "title":        set the generated page title')
+    Trace.error('    --css "file.css":       use a custom CSS file')
+    Trace.error('    --embedcss "file.css":  embed styles from a CSS file into the output')
+    Trace.error('    --favicon "icon.ico":   insert the specified favicon in the header.')
+    Trace.error('    --html:                 output HTML 4.0 instead of the default XHTML')
+    Trace.error('    --unicode:              full Unicode output')
+    Trace.error('    --iso885915:            output a document with ISO-8859-15 encoding')
+    Trace.error('    --nofooter:             remove the footer "generated by eLyXer"')
+    Trace.error('    --simplemath:           do not generate fancy math constructions')
+    Trace.error('  Options for image output:')
+    Trace.error('    --directory "img_dir":  look for images in the specified directory')
+    Trace.error('    --destdirectory "dest": put converted images into this directory')
+    Trace.error('    --imageformat ".ext":   image output format, or "copy" to copy images')
+    Trace.error('    --noconvert:            do not convert images, use in original locations')
+    Trace.error('    --converter "inkscape": use an alternative program to convert images')
+    Trace.error('  Options for footnote display:')
+    Trace.error('    --numberfoot:           mark footnotes with numbers instead of letters')
+    Trace.error('    --symbolfoot:           mark footnotes with symbols (*, **...)')
+    Trace.error('    --hoverfoot:            show footnotes as hovering text (default)')
+    Trace.error('    --marginfoot:           show footnotes on the page margin')
+    Trace.error('    --endfoot:              show footnotes at the end of the page')
+    Trace.error('    --supfoot:              use superscript for footnote markers (default)')
+    Trace.error('    --alignfoot:            use aligned text for footnote markers')
+    Trace.error('    --footnotes "options":  specify several comma-separated footnotes options')
+    Trace.error('      Available options are: "number", "symbol", "hover", "margin", "end",')
+    Trace.error('        "sup", "align"')
+    Trace.error('  Advanced output options:')
+    Trace.error('    --splitpart "depth":    split the resulting webpage at the given depth')
+    Trace.error('    --tocfor "page":        generate a TOC that points to the given page')
+    Trace.error('    --target "frame":       make all links point to the given frame')
+    Trace.error('    --notoclabels:          omit the part labels in the TOC, such as Chapter')
+    Trace.error('    --lowmem:               do the conversion on the fly (conserve memory)')
+    Trace.error('    --raw:                  generate HTML without header or footer.')
+    Trace.error('    --mathjax remote:       use MathJax remotely to display equations')
+    Trace.error('    --mathjax "URL":        use MathJax from the given URL to display equations')
+    Trace.error('    --googlecharts:         use Google Charts to generate formula images')
+    Trace.error('    --template "file":      use a template, put everything in <!--$content-->')
+    Trace.error('    --copyright:            add a copyright notice at the bottom')
+    Trace.error('  Deprecated options:')
+    Trace.error('    --toc:                  (deprecated) create a table of contents')
+    Trace.error('    --toctarget "page":     (deprecated) generate a TOC for the given page')
+    Trace.error('    --nocopy:               (deprecated) maintained for backwards compatibility')
+    Trace.error('    --jsmath "URL":         use jsMath from the given URL to display equations')
+    sys.exit()
+
+  def showversion(self):
+    "Return the current eLyXer version string"
+    string = 'eLyXer version ' + GeneralConfig.version['number']
+    string += ' (' + GeneralConfig.version['date'] + ')'
+    Trace.error(string)
+    sys.exit()
+
+  def showhardversion(self):
+    "Return just the version string"
+    Trace.message(GeneralConfig.version['number'])
+    sys.exit()
+
+  def showversiondate(self):
+    "Return just the version dte"
+    Trace.message(GeneralConfig.version['date'])
+    sys.exit()
+
+  def showlyxformat(self):
+    "Return just the lyxformat parameter"
+    Trace.message(GeneralConfig.version['lyxformat'])
+    sys.exit()
+
+class BranchOptions(object):
+  "A set of options for a branch"
+
+  def __init__(self, name):
+    self.name = name
+    self.options = {'color':'#ffffff'}
+
+  def set(self, key, value):
+    "Set a branch option"
+    if not key.startswith(ContainerConfig.string['startcommand']):
+      Trace.error('Invalid branch option ' + key)
+      return
+    key = key.replace(ContainerConfig.string['startcommand'], '')
+    self.options[key] = value
+
+  def isselected(self):
+    "Return if the branch is selected"
+    if not 'selected' in self.options:
+      return False
+    return self.options['selected'] == '1'
+
+  def __unicode__(self):
+    "String representation"
+    return 'options for ' + self.name + ': ' + unicode(self.options)
+
+
+
+
+import urllib
+
+
+
+
+
+
+
+
+class Cloner(object):
+  "An object used to clone other objects."
+
+  def clone(cls, original):
+    "Return an exact copy of an object."
+    "The original object must have an empty constructor."
+    return cls.create(original.__class__)
+
+  def create(cls, type):
+    "Create an object of a given class."
+    clone = type.__new__(type)
+    clone.__init__()
+    return clone
+
+  clone = classmethod(clone)
+  create = classmethod(create)
+
+class ContainerExtractor(object):
+  "A class to extract certain containers."
+
+  def __init__(self, config):
+    "The config parameter is a map containing three lists: allowed, copied and extracted."
+    "Each of the three is a list of class names for containers."
+    "Allowed containers are included as is into the result."
+    "Cloned containers are cloned and placed into the result."
+    "Extracted containers are looked into."
+    "All other containers are silently ignored."
+    self.allowed = config['allowed']
+    self.cloned = config['cloned']
+    self.extracted = config['extracted']
+
+  def extract(self, container):
+    "Extract a group of selected containers from elyxer.a container."
+    list = []
+    locate = lambda c: c.__class__.__name__ in self.allowed + self.cloned
+    recursive = lambda c: c.__class__.__name__ in self.extracted
+    process = lambda c: self.process(c, list)
+    container.recursivesearch(locate, recursive, process)
+    return list
+
+  def process(self, container, list):
+    "Add allowed containers, clone cloned containers and add the clone."
+    name = container.__class__.__name__
+    if name in self.allowed:
+      list.append(container)
+    elif name in self.cloned:
+      list.append(self.safeclone(container))
+    else:
+      Trace.error('Unknown container class ' + name)
+
+  def safeclone(self, container):
+    "Return a new container with contents only in a safe list, recursively."
+    clone = Cloner.clone(container)
+    clone.output = container.output
+    clone.contents = self.extract(container)
+    return clone
+
+
+
+
+
+
+class Parser(object):
+  "A generic parser"
+
+  def __init__(self):
+    self.begin = 0
+    self.parameters = dict()
+
+  def parseheader(self, reader):
+    "Parse the header"
+    header = reader.currentline().split()
+    reader.nextline()
+    self.begin = reader.linenumber
+    return header
+
+  def parseparameter(self, reader):
+    "Parse a parameter"
+    if reader.currentline().strip().startswith('<'):
+      key, value = self.parsexml(reader)
+      self.parameters[key] = value
+      return
+    split = reader.currentline().strip().split(' ', 1)
+    reader.nextline()
+    if len(split) == 0:
+      return
+    key = split[0]
+    if len(split) == 1:
+      self.parameters[key] = True
+      return
+    if not '"' in split[1]:
+      self.parameters[key] = split[1].strip()
+      return
+    doublesplit = split[1].split('"')
+    self.parameters[key] = doublesplit[1]
+
+  def parsexml(self, reader):
+    "Parse a parameter in xml form: <param attr1=value...>"
+    strip = reader.currentline().strip()
+    reader.nextline()
+    if not strip.endswith('>'):
+      Trace.error('XML parameter ' + strip + ' should be <...>')
+    split = strip[1:-1].split()
+    if len(split) == 0:
+      Trace.error('Empty XML parameter <>')
+      return None, None
+    key = split[0]
+    del split[0]
+    if len(split) == 0:
+      return key, dict()
+    attrs = dict()
+    for attr in split:
+      if not '=' in attr:
+        Trace.error('Erroneous attribute for ' + key + ': ' + attr)
+        attr += '="0"'
+      parts = attr.split('=')
+      attrkey = parts[0]
+      value = parts[1].split('"')[1]
+      attrs[attrkey] = value
+    return key, attrs
+
+  def parseending(self, reader, process):
+    "Parse until the current ending is found"
+    if not self.ending:
+      Trace.error('No ending for ' + unicode(self))
+      return
+    while not reader.currentline().startswith(self.ending):
+      process()
+
+  def parsecontainer(self, reader, contents):
+    container = self.factory.createcontainer(reader)
+    if container:
+      container.parent = self.parent
+      contents.append(container)
+
+  def __unicode__(self):
+    "Return a description"
+    return self.__class__.__name__ + ' (' + unicode(self.begin) + ')'
+
+class LoneCommand(Parser):
+  "A parser for just one command line"
+
+  def parse(self,reader):
+    "Read nothing"
+    return []
+
+class TextParser(Parser):
+  "A parser for a command and a bit of text"
+
+  stack = []
+
+  def __init__(self, container):
+    Parser.__init__(self)
+    self.ending = None
+    if container.__class__.__name__ in ContainerConfig.endings:
+      self.ending = ContainerConfig.endings[container.__class__.__name__]
+    self.endings = []
+
+  def parse(self, reader):
+    "Parse lines as long as they are text"
+    TextParser.stack.append(self.ending)
+    self.endings = TextParser.stack + [ContainerConfig.endings['Layout'],
+        ContainerConfig.endings['Inset'], self.ending]
+    contents = []
+    while not self.isending(reader):
+      self.parsecontainer(reader, contents)
+    return contents
+
+  def isending(self, reader):
+    "Check if text is ending"
+    current = reader.currentline().split()
+    if len(current) == 0:
+      return False
+    if current[0] in self.endings:
+      if current[0] in TextParser.stack:
+        TextParser.stack.remove(current[0])
+      else:
+        TextParser.stack = []
+      return True
+    return False
+
+class ExcludingParser(Parser):
+  "A parser that excludes the final line"
+
+  def parse(self, reader):
+    "Parse everything up to (and excluding) the final line"
+    contents = []
+    self.parseending(reader, lambda: self.parsecontainer(reader, contents))
+    return contents
+
+class BoundedParser(ExcludingParser):
+  "A parser bound by a final line"
+
+  def parse(self, reader):
+    "Parse everything, including the final line"
+    contents = ExcludingParser.parse(self, reader)
+    # skip last line
+    reader.nextline()
+    return contents
+
+class BoundedDummy(Parser):
+  "A bound parser that ignores everything"
+
+  def parse(self, reader):
+    "Parse the contents of the container"
+    self.parseending(reader, lambda: reader.nextline())
+    # skip last line
+    reader.nextline()
+    return []
+
+class StringParser(Parser):
+  "Parses just a string"
+
+  def parseheader(self, reader):
+    "Do nothing, just take note"
+    self.begin = reader.linenumber + 1
+    return []
+
+  def parse(self, reader):
+    "Parse a single line"
+    contents = reader.currentline()
+    reader.nextline()
+    return contents
+
+class InsetParser(BoundedParser):
+  "Parses a LyX inset"
+
+  def parse(self, reader):
+    "Parse inset parameters into a dictionary"
+    startcommand = ContainerConfig.string['startcommand']
+    while reader.currentline() != '' and not reader.currentline().startswith(startcommand):
+      self.parseparameter(reader)
+    return BoundedParser.parse(self, reader)
+
+
+
+
+
+
+class ContainerOutput(object):
+  "The generic HTML output for a container."
+
+  def gethtml(self, container):
+    "Show an error."
+    Trace.error('gethtml() not implemented for ' + unicode(self))
+
+  def isempty(self):
+    "Decide if the output is empty: by default, not empty."
+    return False
+
+class EmptyOutput(ContainerOutput):
+
+  def gethtml(self, container):
+    "Return empty HTML code."
+    return []
+
+  def isempty(self):
+    "This output is particularly empty."
+    return True
+
+class FixedOutput(ContainerOutput):
+  "Fixed output"
+
+  def gethtml(self, container):
+    "Return constant HTML code"
+    return container.html
+
+class ContentsOutput(ContainerOutput):
+  "Outputs the contents converted to HTML"
+
+  def gethtml(self, container):
+    "Return the HTML code"
+    html = []
+    if container.contents == None:
+      return html
+    for element in container.contents:
+      if not hasattr(element, 'gethtml'):
+        Trace.error('No html in ' + element.__class__.__name__ + ': ' + unicode(element))
+        return html
+      html += element.gethtml()
+    return html
+
+class TaggedOutput(ContentsOutput):
+  "Outputs an HTML tag surrounding the contents."
+
+  tag = None
+  breaklines = False
+  empty = False
+
+  def settag(self, tag, breaklines=False, empty=False):
+    "Set the value for the tag and other attributes."
+    self.tag = tag
+    if breaklines:
+      self.breaklines = breaklines
+    if empty:
+      self.empty = empty
+    return self
+
+  def setbreaklines(self, breaklines):
+    "Set the value for breaklines."
+    self.breaklines = breaklines
+    return self
+
+  def gethtml(self, container):
+    "Return the HTML code."
+    if self.empty:
+      return [self.selfclosing(container)]
+    html = [self.open(container)]
+    html += ContentsOutput.gethtml(self, container)
+    html.append(self.close(container))
+    return html
+
+  def open(self, container):
+    "Get opening line."
+    if not self.checktag():
+      return ''
+    open = '<' + self.tag + '>'
+    if self.breaklines:
+      return open + '\n'
+    return open
+
+  def close(self, container):
+    "Get closing line."
+    if not self.checktag():
+      return ''
+    close = '</' + self.tag.split()[0] + '>'
+    if self.breaklines:
+      return '\n' + close + '\n'
+    return close
+
+  def selfclosing(self, container):
+    "Get self-closing line."
+    if not self.checktag():
+      return ''
+    selfclosing = '<' + self.tag + '/>'
+    if self.breaklines:
+      return selfclosing + '\n'
+    return selfclosing
+
+  def checktag(self):
+    "Check that the tag is valid."
+    if not self.tag:
+      Trace.error('No tag in ' + unicode(container))
+      return False
+    if self.tag == '':
+      return False
+    return True
+
+class FilteredOutput(ContentsOutput):
+  "Returns the output in the contents, but filtered:"
+  "some strings are replaced by others."
+
+  def __init__(self):
+    "Initialize the filters."
+    self.filters = []
+
+  def addfilter(self, original, replacement):
+    "Add a new filter: replace the original by the replacement."
+    self.filters.append((original, replacement))
+
+  def gethtml(self, container):
+    "Return the HTML code"
+    result = []
+    html = ContentsOutput.gethtml(self, container)
+    for line in html:
+      result.append(self.filter(line))
+    return result
+
+  def filter(self, line):
+    "Filter a single line with all available filters."
+    for original, replacement in self.filters:
+      if original in line:
+        line = line.replace(original, replacement)
+    return line
+
+class StringOutput(ContainerOutput):
+  "Returns a bare string as output"
+
+  def gethtml(self, container):
+    "Return a bare string"
+    return [container.string]
+
+
+
+
+
+
+
+import sys
+import codecs
+
+
+class LineReader(object):
+  "Reads a file line by line"
+
+  def __init__(self, filename):
+    if isinstance(filename, file):
+      self.file = filename
+    else:
+      self.file = codecs.open(filename, 'rU', 'utf-8')
+    self.linenumber = 1
+    self.lastline = None
+    self.current = None
+    self.mustread = True
+    self.depleted = False
+    try:
+      self.readline()
+    except UnicodeDecodeError:
+      # try compressed file
+      import gzip
+      self.file = gzip.open(filename, 'rb')
+      self.readline()
+
+  def setstart(self, firstline):
+    "Set the first line to read."
+    for i in range(firstline):
+      self.file.readline()
+    self.linenumber = firstline
+
+  def setend(self, lastline):
+    "Set the last line to read."
+    self.lastline = lastline
+
+  def currentline(self):
+    "Get the current line"
+    if self.mustread:
+      self.readline()
+    return self.current
+
+  def nextline(self):
+    "Go to next line"
+    if self.depleted:
+      Trace.fatal('Read beyond file end')
+    self.mustread = True
+
+  def readline(self):
+    "Read a line from elyxer.file"
+    self.current = self.file.readline()
+    if not isinstance(self.file, codecs.StreamReaderWriter):
+      self.current = self.current.decode('utf-8')
+    if len(self.current) == 0:
+      self.depleted = True
+    self.current = self.current.rstrip('\n\r')
+    self.linenumber += 1
+    self.mustread = False
+    Trace.prefix = 'Line ' + unicode(self.linenumber) + ': '
+    if self.linenumber % 1000 == 0:
+      Trace.message('Parsing')
+
+  def finished(self):
+    "Find out if the file is finished"
+    if self.lastline and self.linenumber == self.lastline:
+      return True
+    if self.mustread:
+      self.readline()
+    return self.depleted
+
+  def close(self):
+    self.file.close()
+
+class LineWriter(object):
+  "Writes a file as a series of lists"
+
+  file = False
+
+  def __init__(self, filename):
+    if isinstance(filename, file):
+      self.file = filename
+      self.filename = None
+    else:
+      self.filename = filename
+
+  def write(self, strings):
+    "Write a list of strings"
+    for string in strings:
+      if not isinstance(string, basestring):
+        Trace.error('Not a string: ' + unicode(string) + ' in ' + unicode(strings))
+        return
+      self.writestring(string)
+
+  def writestring(self, string):
+    "Write a string"
+    if not self.file:
+      self.file = codecs.open(self.filename, 'w', "utf-8")
+    if self.file == sys.stdout and sys.version_info < (3,0):
+      string = string.encode('utf-8')
+    self.file.write(string)
+
+  def writeline(self, line):
+    "Write a line to file"
+    self.writestring(line + '\n')
+
+  def close(self):
+    self.file.close()
+
+
+
+
+
+
+class Globable(object):
+  """A bit of text which can be globbed (lumped together in bits).
+  Methods current(), skipcurrent(), checkfor() and isout() have to be
+  implemented by subclasses."""
+
+  leavepending = False
+
+  def __init__(self):
+    self.endinglist = EndingList()
+
+  def checkbytemark(self):
+    "Check for a Unicode byte mark and skip it."
+    if self.finished():
+      return
+    if ord(self.current()) == 0xfeff:
+      self.skipcurrent()
+
+  def isout(self):
+    "Find out if we are out of the position yet."
+    Trace.error('Unimplemented isout()')
+    return True
+
+  def current(self):
+    "Return the current character."
+    Trace.error('Unimplemented current()')
+    return ''
+
+  def checkfor(self, string):
+    "Check for the given string in the current position."
+    Trace.error('Unimplemented checkfor()')
+    return False
+
+  def finished(self):
+    "Find out if the current text has finished."
+    if self.isout():
+      if not self.leavepending:
+        self.endinglist.checkpending()
+      return True
+    return self.endinglist.checkin(self)
+
+  def skipcurrent(self):
+    "Return the current character and skip it."
+    Trace.error('Unimplemented skipcurrent()')
+    return ''
+
+  def glob(self, currentcheck):
+    "Glob a bit of text that satisfies a check on the current char."
+    glob = ''
+    while not self.finished() and currentcheck():
+      glob += self.skipcurrent()
+    return glob
+
+  def globalpha(self):
+    "Glob a bit of alpha text"
+    return self.glob(lambda: self.current().isalpha())
+
+  def globnumber(self):
+    "Glob a row of digits."
+    return self.glob(lambda: self.current().isdigit())
+
+  def isidentifier(self):
+    "Return if the current character is alphanumeric or _."
+    if self.current().isalnum() or self.current() == '_':
+      return True
+    return False
+
+  def globidentifier(self):
+    "Glob alphanumeric and _ symbols."
+    return self.glob(self.isidentifier)
+
+  def isvalue(self):
+    "Return if the current character is a value character:"
+    "not a bracket or a space."
+    if self.current().isspace():
+      return False
+    if self.current() in '{}()':
+      return False
+    return True
+
+  def globvalue(self):
+    "Glob a value: any symbols but brackets."
+    return self.glob(self.isvalue)
+
+  def skipspace(self):
+    "Skip all whitespace at current position."
+    return self.glob(lambda: self.current().isspace())
+
+  def globincluding(self, magicchar):
+    "Glob a bit of text up to (including) the magic char."
+    glob = self.glob(lambda: self.current() != magicchar) + magicchar
+    self.skip(magicchar)
+    return glob
+
+  def globexcluding(self, excluded):
+    "Glob a bit of text up until (excluding) any excluded character."
+    return self.glob(lambda: self.current() not in excluded)
+
+  def pushending(self, ending, optional = False):
+    "Push a new ending to the bottom"
+    self.endinglist.add(ending, optional)
+
+  def popending(self, expected = None):
+    "Pop the ending found at the current position"
+    if self.isout() and self.leavepending:
+      return expected
+    ending = self.endinglist.pop(self)
+    if expected and expected != ending:
+      Trace.error('Expected ending ' + expected + ', got ' + ending)
+    self.skip(ending)
+    return ending
+
+  def nextending(self):
+    "Return the next ending in the queue."
+    nextending = self.endinglist.findending(self)
+    if not nextending:
+      return None
+    return nextending.ending
+
+class EndingList(object):
+  "A list of position endings"
+
+  def __init__(self):
+    self.endings = []
+
+  def add(self, ending, optional = False):
+    "Add a new ending to the list"
+    self.endings.append(PositionEnding(ending, optional))
+
+  def pickpending(self, pos):
+    "Pick any pending endings from a parse position."
+    self.endings += pos.endinglist.endings
+
+  def checkin(self, pos):
+    "Search for an ending"
+    if self.findending(pos):
+      return True
+    return False
+
+  def pop(self, pos):
+    "Remove the ending at the current position"
+    if pos.isout():
+      Trace.error('No ending out of bounds')
+      return ''
+    ending = self.findending(pos)
+    if not ending:
+      Trace.error('No ending at ' + pos.current())
+      return ''
+    for each in reversed(self.endings):
+      self.endings.remove(each)
+      if each == ending:
+        return each.ending
+      elif not each.optional:
+        Trace.error('Removed non-optional ending ' + each)
+    Trace.error('No endings left')
+    return ''
+
+  def findending(self, pos):
+    "Find the ending at the current position"
+    if len(self.endings) == 0:
+      return None
+    for index, ending in enumerate(reversed(self.endings)):
+      if ending.checkin(pos):
+        return ending
+      if not ending.optional:
+        return None
+    return None
+
+  def checkpending(self):
+    "Check if there are any pending endings"
+    if len(self.endings) != 0:
+      Trace.error('Pending ' + unicode(self) + ' left open')
+
+  def __unicode__(self):
+    "Printable representation"
+    string = 'endings ['
+    for ending in self.endings:
+      string += unicode(ending) + ','
+    if len(self.endings) > 0:
+      string = string[:-1]
+    return string + ']'
+
+class PositionEnding(object):
+  "An ending for a parsing position"
+
+  def __init__(self, ending, optional):
+    self.ending = ending
+    self.optional = optional
+
+  def checkin(self, pos):
+    "Check for the ending"
+    return pos.checkfor(self.ending)
+
+  def __unicode__(self):
+    "Printable representation"
+    string = 'Ending ' + self.ending
+    if self.optional:
+      string += ' (optional)'
+    return string
+
+
+
+class Position(Globable):
+  """A position in a text to parse.
+  Including those in Globable, functions to implement by subclasses are:
+  skip(), identifier(), extract(), isout() and current()."""
+
+  def __init__(self):
+    Globable.__init__(self)
+
+  def skip(self, string):
+    "Skip a string"
+    Trace.error('Unimplemented skip()')
+
+  def identifier(self):
+    "Return an identifier for the current position."
+    Trace.error('Unimplemented identifier()')
+    return 'Error'
+
+  def extract(self, length):
+    "Extract the next string of the given length, or None if not enough text,"
+    "without advancing the parse position."
+    Trace.error('Unimplemented extract()')
+    return None
+
+  def checkfor(self, string):
+    "Check for a string at the given position."
+    return string == self.extract(len(string))
+
+  def checkforlower(self, string):
+    "Check for a string in lower case."
+    extracted = self.extract(len(string))
+    if not extracted:
+      return False
+    return string.lower() == self.extract(len(string)).lower()
+
+  def skipcurrent(self):
+    "Return the current character and skip it."
+    current = self.current()
+    self.skip(current)
+    return current
+
+  def next(self):
+    "Advance the position and return the next character."
+    self.skipcurrent()
+    return self.current()
+
+  def checkskip(self, string):
+    "Check for a string at the given position; if there, skip it"
+    if not self.checkfor(string):
+      return False
+    self.skip(string)
+    return True
+
+  def error(self, message):
+    "Show an error message and the position identifier."
+    Trace.error(message + ': ' + self.identifier())
+
+class TextPosition(Position):
+  "A parse position based on a raw text."
+
+  def __init__(self, text):
+    "Create the position from elyxer.some text."
+    Position.__init__(self)
+    self.pos = 0
+    self.text = text
+    self.checkbytemark()
+
+  def skip(self, string):
+    "Skip a string of characters."
+    self.pos += len(string)
+
+  def identifier(self):
+    "Return a sample of the remaining text."
+    length = 30
+    if self.pos + length > len(self.text):
+      length = len(self.text) - self.pos
+    return '*' + self.text[self.pos:self.pos + length] + '*'
+
+  def isout(self):
+    "Find out if we are out of the text yet."
+    return self.pos >= len(self.text)
+
+  def current(self):
+    "Return the current character, assuming we are not out."
+    return self.text[self.pos]
+
+  def extract(self, length):
+    "Extract the next string of the given length, or None if not enough text."
+    if self.pos + length > len(self.text):
+      return None
+    return self.text[self.pos : self.pos + length]
+
+class FilePosition(Position):
+  "A parse position based on an underlying file."
+
+  def __init__(self, filename):
+    "Create the position from a file."
+    Position.__init__(self)
+    self.reader = LineReader(filename)
+    self.pos = 0
+    self.checkbytemark()
+
+  def skip(self, string):
+    "Skip a string of characters."
+    length = len(string)
+    while self.pos + length > len(self.reader.currentline()):
+      length -= len(self.reader.currentline()) - self.pos + 1
+      self.nextline()
+    self.pos += length
+
+  def currentline(self):
+    "Get the current line of the underlying file."
+    return self.reader.currentline()
+
+  def nextline(self):
+    "Go to the next line."
+    self.reader.nextline()
+    self.pos = 0
+
+  def linenumber(self):
+    "Return the line number of the file."
+    return self.reader.linenumber + 1
+
+  def identifier(self):
+    "Return the current line and line number in the file."
+    before = self.reader.currentline()[:self.pos - 1]
+    after = self.reader.currentline()[self.pos:]
+    return 'line ' + unicode(self.getlinenumber()) + ': ' + before + '*' + after
+
+  def isout(self):
+    "Find out if we are out of the text yet."
+    if self.pos > len(self.reader.currentline()):
+      if self.pos > len(self.reader.currentline()) + 1:
+        Trace.error('Out of the line ' + self.reader.currentline() + ': ' + unicode(self.pos))
+      self.nextline()
+    return self.reader.finished()
+
+  def current(self):
+    "Return the current character, assuming we are not out."
+    if self.pos == len(self.reader.currentline()):
+      return '\n'
+    if self.pos > len(self.reader.currentline()):
+      Trace.error('Out of the line ' + self.reader.currentline() + ': ' + unicode(self.pos))
+      return '*'
+    return self.reader.currentline()[self.pos]
+
+  def extract(self, length):
+    "Extract the next string of the given length, or None if not enough text."
+    if self.pos + length > len(self.reader.currentline()):
+      return None
+    return self.reader.currentline()[self.pos : self.pos + length]
+
+
+
+class Container(object):
+  "A container for text and objects in a lyx file"
+
+  partkey = None
+  parent = None
+  begin = None
+
+  def __init__(self):
+    self.contents = list()
+
+  def process(self):
+    "Process contents"
+    pass
+
+  def gethtml(self):
+    "Get the resulting HTML"
+    html = self.output.gethtml(self)
+    if isinstance(html, basestring):
+      Trace.error('Raw string ' + html)
+      html = [html]
+    return self.escapeall(html)
+
+  def escapeall(self, lines):
+    "Escape all lines in an array according to the output options."
+    result = []
+    for line in lines:
+      if Options.html:
+        line = self.escape(line, EscapeConfig.html)
+      if Options.iso885915:
+        line = self.escape(line, EscapeConfig.iso885915)
+        line = self.escapeentities(line)
+      elif not Options.unicode:
+        line = self.escape(line, EscapeConfig.nonunicode)
+      result.append(line)
+    return result
+
+  def escape(self, line, replacements = EscapeConfig.entities):
+    "Escape a line with replacements from elyxer.a map"
+    pieces = replacements.keys()
+    # do them in order
+    pieces.sort()
+    for piece in pieces:
+      if piece in line:
+        line = line.replace(piece, replacements[piece])
+    return line
+
+  def escapeentities(self, line):
+    "Escape all Unicode characters to HTML entities."
+    result = ''
+    pos = TextPosition(line)
+    while not pos.finished():
+      if ord(pos.current()) > 128:
+        codepoint = hex(ord(pos.current()))
+        if codepoint == '0xd835':
+          codepoint = hex(ord(pos.next()) + 0xf800)
+        result += '&#' + codepoint[1:] + ';'
+      else:
+        result += pos.current()
+      pos.skipcurrent()
+    return result
+
+  def searchall(self, type):
+    "Search for all embedded containers of a given type"
+    list = []
+    self.searchprocess(type, lambda container: list.append(container))
+    return list
+
+  def searchremove(self, type):
+    "Search for all containers of a type and remove them"
+    list = self.searchall(type)
+    for container in list:
+      container.parent.contents.remove(container)
+    return list
+
+  def searchprocess(self, type, process):
+    "Search for elements of a given type and process them"
+    self.locateprocess(lambda container: isinstance(container, type), process)
+
+  def locateprocess(self, locate, process):
+    "Search for all embedded containers and process them"
+    for container in self.contents:
+      container.locateprocess(locate, process)
+      if locate(container):
+        process(container)
+
+  def recursivesearch(self, locate, recursive, process):
+    "Perform a recursive search in the container."
+    for container in self.contents:
+      if recursive(container):
+        container.recursivesearch(locate, recursive, process)
+      if locate(container):
+        process(container)
+
+  def extracttext(self):
+    "Extract all text from elyxer.allowed containers."
+    result = ''
+    constants = ContainerExtractor(ContainerConfig.extracttext).extract(self)
+    for constant in constants:
+      result += constant.string
+    return result
+
+  def group(self, index, group, isingroup):
+    "Group some adjoining elements into a group"
+    if index >= len(self.contents):
+      return
+    if hasattr(self.contents[index], 'grouped'):
+      return
+    while index < len(self.contents) and isingroup(self.contents[index]):
+      self.contents[index].grouped = True
+      group.contents.append(self.contents[index])
+      self.contents.pop(index)
+    self.contents.insert(index, group)
+
+  def remove(self, index):
+    "Remove a container but leave its contents"
+    container = self.contents[index]
+    self.contents.pop(index)
+    while len(container.contents) > 0:
+      self.contents.insert(index, container.contents.pop())
+
+  def tree(self, level = 0):
+    "Show in a tree"
+    Trace.debug("  " * level + unicode(self))
+    for container in self.contents:
+      container.tree(level + 1)
+
+  def getparameter(self, name):
+    "Get the value of a parameter, if present."
+    if not name in self.parameters:
+      return None
+    return self.parameters[name]
+
+  def getparameterlist(self, name):
+    "Get the value of a comma-separated parameter as a list."
+    paramtext = self.getparameter(name)
+    if not paramtext:
+      return []
+    return paramtext.split(',')
+
+  def hasemptyoutput(self):
+    "Check if the parent's output is empty."
+    current = self.parent
+    while current:
+      if current.output.isempty():
+        return True
+      current = current.parent
+    return False
+
+  def __unicode__(self):
+    "Get a description"
+    if not self.begin:
+      return self.__class__.__name__
+    return self.__class__.__name__ + '@' + unicode(self.begin)
+
+class BlackBox(Container):
+  "A container that does not output anything"
+
+  def __init__(self):
+    self.parser = LoneCommand()
+    self.output = EmptyOutput()
+    self.contents = []
+
+class LyXFormat(BlackBox):
+  "Read the lyxformat command"
+
+  def process(self):
+    "Show warning if version < 276"
+    version = int(self.header[1])
+    if version < 276:
+      Trace.error('Warning: unsupported old format version ' + str(version))
+    if version > int(GeneralConfig.version['lyxformat']):
+      Trace.error('Warning: unsupported new format version ' + str(version))
+
+class StringContainer(Container):
+  "A container for a single string"
+
+  parsed = None
+
+  def __init__(self):
+    self.parser = StringParser()
+    self.output = StringOutput()
+    self.string = ''
+
+  def process(self):
+    "Replace special chars from elyxer.the contents."
+    if self.parsed:
+      self.string = self.replacespecial(self.parsed)
+      self.parsed = None
+
+  def replacespecial(self, line):
+    "Replace all special chars from elyxer.a line"
+    replaced = self.escape(line, EscapeConfig.entities)
+    replaced = self.changeline(replaced)
+    if ContainerConfig.string['startcommand'] in replaced and len(replaced) > 1:
+      # unprocessed commands
+      if self.begin:
+        message = 'Unknown command at ' + unicode(self.begin) + ': '
+      else:
+        message = 'Unknown command: '
+      Trace.error(message + replaced.strip())
+    return replaced
+
+  def changeline(self, line):
+    line = self.escape(line, EscapeConfig.chars)
+    if not ContainerConfig.string['startcommand'] in line:
+      return line
+    line = self.escape(line, EscapeConfig.commands)
+    return line
+
+  def extracttext(self):
+    "Return all text."
+    return self.string
+  
+  def __unicode__(self):
+    "Return a printable representation."
+    result = 'StringContainer'
+    if self.begin:
+      result += '@' + unicode(self.begin)
+    ellipsis = '...'
+    if len(self.string.strip()) <= 15:
+      ellipsis = ''
+    return result + ' (' + self.string.strip()[:15] + ellipsis + ')'
+
+class Constant(StringContainer):
+  "A constant string"
+
+  def __init__(self, text):
+    self.contents = []
+    self.string = text
+    self.output = StringOutput()
+
+  def __unicode__(self):
+    return 'Constant: ' + self.string
+
+class TaggedText(Container):
+  "Text inside a tag"
+
+  output = None
+
+  def __init__(self):
+    self.parser = TextParser(self)
+    self.output = TaggedOutput()
+
+  def complete(self, contents, tag, breaklines=False):
+    "Complete the tagged text and return it"
+    self.contents = contents
+    self.output.tag = tag
+    self.output.breaklines = breaklines
+    return self
+
+  def constant(self, text, tag, breaklines=False):
+    "Complete the tagged text with a constant"
+    constant = Constant(text)
+    return self.complete([constant], tag, breaklines)
+
+  def __unicode__(self):
+    "Return a printable representation."
+    if not hasattr(self.output, 'tag'):
+      return 'Emtpy tagged text'
+    if not self.output.tag:
+      return 'Tagged <unknown tag>'
+    return 'Tagged <' + self.output.tag + '>'
+
+
+
+
+
+
+class DocumentParameters(object):
+  "Global parameters for the document."
+
+  pdftitle = None
+  indentstandard = False
+  tocdepth = 10
+  startinglevel = 0
+  maxdepth = 10
+  language = None
+  bibliography = None
+  outputchanges = False
+  displaymode = False
+
+
+
+
+
+
+class FormulaParser(Parser):
+  "Parses a formula"
+
+  def parseheader(self, reader):
+    "See if the formula is inlined"
+    self.begin = reader.linenumber + 1
+    type = self.parsetype(reader)
+    if not type:
+      reader.nextline()
+      type = self.parsetype(reader)
+      if not type:
+        Trace.error('Unknown formula type in ' + reader.currentline().strip())
+        return ['unknown']
+    return [type]
+
+  def parsetype(self, reader):
+    "Get the formula type from the first line."
+    if reader.currentline().find(FormulaConfig.starts['simple']) >= 0:
+      return 'inline'
+    if reader.currentline().find(FormulaConfig.starts['complex']) >= 0:
+      return 'block'
+    if reader.currentline().find(FormulaConfig.starts['unnumbered']) >= 0:
+      return 'block'
+    if reader.currentline().find(FormulaConfig.starts['beginbefore']) >= 0:
+      return 'numbered'
+    return None
+  
+  def parse(self, reader):
+    "Parse the formula until the end"
+    formula = self.parseformula(reader)
+    while not reader.currentline().startswith(self.ending):
+      stripped = reader.currentline().strip()
+      if len(stripped) > 0:
+        Trace.error('Unparsed formula line ' + stripped)
+      reader.nextline()
+    reader.nextline()
+    return formula
+
+  def parseformula(self, reader):
+    "Parse the formula contents"
+    simple = FormulaConfig.starts['simple']
+    if simple in reader.currentline():
+      rest = reader.currentline().split(simple, 1)[1]
+      if simple in rest:
+        # formula is $...$
+        return self.parsesingleliner(reader, simple, simple)
+      # formula is multiline $...$
+      return self.parsemultiliner(reader, simple, simple)
+    if FormulaConfig.starts['complex'] in reader.currentline():
+      # formula of the form \[...\]
+      return self.parsemultiliner(reader, FormulaConfig.starts['complex'],
+          FormulaConfig.endings['complex'])
+    beginbefore = FormulaConfig.starts['beginbefore']
+    beginafter = FormulaConfig.starts['beginafter']
+    if beginbefore in reader.currentline():
+      if reader.currentline().strip().endswith(beginafter):
+        current = reader.currentline().strip()
+        endsplit = current.split(beginbefore)[1].split(beginafter)
+        startpiece = beginbefore + endsplit[0] + beginafter
+        endbefore = FormulaConfig.endings['endbefore']
+        endafter = FormulaConfig.endings['endafter']
+        endpiece = endbefore + endsplit[0] + endafter
+        return startpiece + self.parsemultiliner(reader, startpiece, endpiece) + endpiece
+      Trace.error('Missing ' + beginafter + ' in ' + reader.currentline())
+      return ''
+    begincommand = FormulaConfig.starts['command']
+    beginbracket = FormulaConfig.starts['bracket']
+    if begincommand in reader.currentline() and beginbracket in reader.currentline():
+      endbracket = FormulaConfig.endings['bracket']
+      return self.parsemultiliner(reader, beginbracket, endbracket)
+    Trace.error('Formula beginning ' + reader.currentline() + ' is unknown')
+    return ''
+
+  def parsesingleliner(self, reader, start, ending):
+    "Parse a formula in one line"
+    line = reader.currentline().strip()
+    if not start in line:
+      Trace.error('Line ' + line + ' does not contain formula start ' + start)
+      return ''
+    if not line.endswith(ending):
+      Trace.error('Formula ' + line + ' does not end with ' + ending)
+      return ''
+    index = line.index(start)
+    rest = line[index + len(start):-len(ending)]
+    reader.nextline()
+    return rest
+
+  def parsemultiliner(self, reader, start, ending):
+    "Parse a formula in multiple lines"
+    formula = ''
+    line = reader.currentline()
+    if not start in line:
+      Trace.error('Line ' + line.strip() + ' does not contain formula start ' + start)
+      return ''
+    index = line.index(start)
+    line = line[index + len(start):].strip()
+    while not line.endswith(ending):
+      formula += line + '\n'
+      reader.nextline()
+      line = reader.currentline()
+    formula += line[:-len(ending)]
+    reader.nextline()
+    return formula
+
+class MacroParser(FormulaParser):
+  "A parser for a formula macro."
+
+  def parseheader(self, reader):
+    "See if the formula is inlined"
+    self.begin = reader.linenumber + 1
+    return ['inline']
+  
+  def parse(self, reader):
+    "Parse the formula until the end"
+    formula = self.parsemultiliner(reader, self.parent.start, self.ending)
+    reader.nextline()
+    return formula
+  
+
+
+
+
+
+
+
+
+class FormulaBit(Container):
+  "A bit of a formula"
+
+  type = None
+  size = 1
+  original = ''
+
+  def __init__(self):
+    "The formula bit type can be 'alpha', 'number', 'font'."
+    self.contents = []
+    self.output = ContentsOutput()
+
+  def setfactory(self, factory):
+    "Set the internal formula factory."
+    self.factory = factory
+    return self
+
+  def add(self, bit):
+    "Add any kind of formula bit already processed"
+    self.contents.append(bit)
+    self.original += bit.original
+    bit.parent = self
+
+  def skiporiginal(self, string, pos):
+    "Skip a string and add it to the original formula"
+    self.original += string
+    if not pos.checkskip(string):
+      Trace.error('String ' + string + ' not at ' + pos.identifier())
+
+  def computesize(self):
+    "Compute the size of the bit as the max of the sizes of all contents."
+    if len(self.contents) == 0:
+      return 1
+    self.size = max([element.size for element in self.contents])
+    return self.size
+
+  def clone(self):
+    "Return a copy of itself."
+    return self.factory.parseformula(self.original)
+
+  def __unicode__(self):
+    "Get a string representation"
+    return self.__class__.__name__ + ' read in ' + self.original
+
+class TaggedBit(FormulaBit):
+  "A tagged string in a formula"
+
+  def constant(self, constant, tag):
+    "Set the constant and the tag"
+    self.output = TaggedOutput().settag(tag)
+    self.add(FormulaConstant(constant))
+    return self
+
+  def complete(self, contents, tag, breaklines = False):
+    "Set the constant and the tag"
+    self.contents = contents
+    self.output = TaggedOutput().settag(tag, breaklines)
+    return self
+
+  def selfcomplete(self, tag):
+    "Set the self-closing tag, no contents (as in <hr/>)."
+    self.output = TaggedOutput().settag(tag, empty = True)
+    return self
+
+class FormulaConstant(Constant):
+  "A constant string in a formula"
+
+  def __init__(self, string):
+    "Set the constant string"
+    Constant.__init__(self, string)
+    self.original = string
+    self.size = 1
+    self.type = None
+
+  def computesize(self):
+    "Compute the size of the constant: always 1."
+    return self.size
+
+  def clone(self):
+    "Return a copy of itself."
+    return FormulaConstant(self.original)
+
+  def __unicode__(self):
+    "Return a printable representation."
+    return 'Formula constant: ' + self.string
+
+class RawText(FormulaBit):
+  "A bit of text inside a formula"
+
+  def detect(self, pos):
+    "Detect a bit of raw text"
+    return pos.current().isalpha()
+
+  def parsebit(self, pos):
+    "Parse alphabetic text"
+    alpha = pos.globalpha()
+    self.add(FormulaConstant(alpha))
+    self.type = 'alpha'
+
+class FormulaSymbol(FormulaBit):
+  "A symbol inside a formula"
+
+  modified = FormulaConfig.modified
+  unmodified = FormulaConfig.unmodified['characters']
+
+  def detect(self, pos):
+    "Detect a symbol"
+    if pos.current() in FormulaSymbol.unmodified:
+      return True
+    if pos.current() in FormulaSymbol.modified:
+      return True
+    return False
+
+  def parsebit(self, pos):
+    "Parse the symbol"
+    if pos.current() in FormulaSymbol.unmodified:
+      self.addsymbol(pos.current(), pos)
+      return
+    if pos.current() in FormulaSymbol.modified:
+      self.addsymbol(FormulaSymbol.modified[pos.current()], pos)
+      return
+    Trace.error('Symbol ' + pos.current() + ' not found')
+
+  def addsymbol(self, symbol, pos):
+    "Add a symbol"
+    self.skiporiginal(pos.current(), pos)
+    self.contents.append(FormulaConstant(symbol))
+
+class FormulaNumber(FormulaBit):
+  "A string of digits in a formula"
+
+  def detect(self, pos):
+    "Detect a digit"
+    return pos.current().isdigit()
+
+  def parsebit(self, pos):
+    "Parse a bunch of digits"
+    digits = pos.glob(lambda: pos.current().isdigit())
+    self.add(FormulaConstant(digits))
+    self.type = 'number'
+
+class Comment(FormulaBit):
+  "A LaTeX comment: % to the end of the line."
+
+  start = FormulaConfig.starts['comment']
+
+  def detect(self, pos):
+    "Detect the %."
+    return pos.current() == self.start
+
+  def parsebit(self, pos):
+    "Parse to the end of the line."
+    self.original += pos.globincluding('\n')
+
+class WhiteSpace(FormulaBit):
+  "Some white space inside a formula."
+
+  def detect(self, pos):
+    "Detect the white space."
+    return pos.current().isspace()
+
+  def parsebit(self, pos):
+    "Parse all whitespace."
+    self.original += pos.skipspace()
+
+  def __unicode__(self):
+    "Return a printable representation."
+    return 'Whitespace: *' + self.original + '*'
+
+class Bracket(FormulaBit):
+  "A {} bracket inside a formula"
+
+  start = FormulaConfig.starts['bracket']
+  ending = FormulaConfig.endings['bracket']
+
+  def __init__(self):
+    "Create a (possibly literal) new bracket"
+    FormulaBit.__init__(self)
+    self.inner = None
+
+  def detect(self, pos):
+    "Detect the start of a bracket"
+    return pos.checkfor(self.start)
+
+  def parsebit(self, pos):
+    "Parse the bracket"
+    self.parsecomplete(pos, self.innerformula)
+    return self
+
+  def parsetext(self, pos):
+    "Parse a text bracket"
+    self.parsecomplete(pos, self.innertext)
+    return self
+
+  def parseliteral(self, pos):
+    "Parse a literal bracket"
+    self.parsecomplete(pos, self.innerliteral)
+    return self
+
+  def parsecomplete(self, pos, innerparser):
+    "Parse the start and end marks"
+    if not pos.checkfor(self.start):
+      Trace.error('Bracket should start with ' + self.start + ' at ' + pos.identifier())
+      return None
+    self.skiporiginal(self.start, pos)
+    pos.pushending(self.ending)
+    innerparser(pos)
+    self.original += pos.popending(self.ending)
+    self.computesize()
+
+  def innerformula(self, pos):
+    "Parse a whole formula inside the bracket"
+    while not pos.finished():
+      self.add(self.factory.parseany(pos))
+
+  def innertext(self, pos):
+    "Parse some text inside the bracket, following textual rules."
+    specialchars = FormulaConfig.symbolfunctions.keys()
+    specialchars.append(FormulaConfig.starts['command'])
+    specialchars.append(FormulaConfig.starts['bracket'])
+    specialchars.append(Comment.start)
+    while not pos.finished():
+      if pos.current() in specialchars:
+        self.add(self.factory.parseany(pos))
+        if pos.checkskip(' '):
+          self.original += ' '
+      else:
+        self.add(FormulaConstant(pos.skipcurrent()))
+
+  def innerliteral(self, pos):
+    "Parse a literal inside the bracket, which does not generate HTML."
+    self.literal = ''
+    while not pos.finished() and not pos.current() == self.ending:
+      if pos.current() == self.start:
+        self.parseliteral(pos)
+      else:
+        self.literal += pos.skipcurrent()
+    self.original += self.literal
+
+class SquareBracket(Bracket):
+  "A [] bracket inside a formula"
+
+  start = FormulaConfig.starts['squarebracket']
+  ending = FormulaConfig.endings['squarebracket']
+
+  def clone(self):
+    "Return a new square bracket with the same contents."
+    bracket = SquareBracket()
+    bracket.contents = self.contents
+    return bracket
+
+
+
+class MathsProcessor(object):
+  "A processor for a maths construction inside the FormulaProcessor."
+
+  def process(self, contents, index):
+    "Process an element inside a formula."
+    Trace.error('Unimplemented process() in ' + unicode(self))
+
+  def __unicode__(self):
+    "Return a printable description."
+    return 'Maths processor ' + self.__class__.__name__
+
+class FormulaProcessor(object):
+  "A processor specifically for formulas."
+
+  processors = []
+
+  def process(self, bit):
+    "Process the contents of every formula bit, recursively."
+    self.processcontents(bit)
+    self.processinsides(bit)
+    self.traversewhole(bit)
+
+  def processcontents(self, bit):
+    "Process the contents of a formula bit."
+    if not isinstance(bit, FormulaBit):
+      return
+    bit.process()
+    for element in bit.contents:
+      self.processcontents(element)
+
+  def processinsides(self, bit):
+    "Process the insides (limits, brackets) in a formula bit."
+    if not isinstance(bit, FormulaBit):
+      return
+    for index, element in enumerate(bit.contents):
+      for processor in self.processors:
+        processor.process(bit.contents, index)
+      # continue with recursive processing
+      self.processinsides(element)
+
+  def traversewhole(self, formula):
+    "Traverse over the contents to alter variables and space units."
+    last = None
+    for bit, contents in self.traverse(formula):
+      if bit.type == 'alpha':
+        self.italicize(bit, contents)
+      elif bit.type == 'font' and last and last.type == 'number':
+        bit.contents.insert(0, FormulaConstant(u' '))
+      last = bit
+
+  def traverse(self, bit):
+    "Traverse a formula and yield a flattened structure of (bit, list) pairs."
+    for element in bit.contents:
+      if hasattr(element, 'type') and element.type:
+        yield (element, bit.contents)
+      elif isinstance(element, FormulaBit):
+        for pair in self.traverse(element):
+          yield pair
+
+  def italicize(self, bit, contents):
+    "Italicize the given bit of text."
+    index = contents.index(bit)
+    contents[index] = TaggedBit().complete([bit], 'i')
+
+
+
+
+class Formula(Container):
+  "A LaTeX formula"
+
+  def __init__(self):
+    self.parser = FormulaParser()
+    self.output = TaggedOutput().settag('span class="formula"')
+
+  def process(self):
+    "Convert the formula to tags"
+    if self.header[0] == 'inline':
+      DocumentParameters.displaymode = False
+    else:
+      DocumentParameters.displaymode = True
+      self.output.settag('div class="formula"', True)
+    if Options.jsmath:
+      self.jsmath()
+    elif Options.mathjax:
+      self.mathjax()
+    elif Options.googlecharts:
+      self.googlecharts()
+    else:
+      self.classic()
+
+  def jsmath(self):
+    "Make the contents for jsMath."
+    if self.header[0] != 'inline':
+      self.output = TaggedOutput().settag('div class="math"')
+    else:
+      self.output = TaggedOutput().settag('span class="math"')
+    self.contents = [Constant(self.parsed)]
+
+  def mathjax(self):
+    "Make the contents for MathJax."
+    self.output.tag = 'span class="MathJax_Preview"'
+    tag = 'script type="math/tex'
+    if self.header[0] != 'inline':
+      tag += ';mode=display'
+    self.contents = [TaggedText().constant(self.parsed, tag + '"', True)]
+
+  def googlecharts(self):
+    "Make the contents using Google Charts http://code.google.com/apis/chart/."
+    url = FormulaConfig.urls['googlecharts'] + urllib.quote_plus(self.parsed)
+    img = '<img class="chart" src="' + url + '" alt="' + self.parsed + '"/>'
+    self.contents = [Constant(img)]
+
+  def classic(self):
+    "Make the contents using classic output generation with XHTML and CSS."
+    whole = FormulaFactory().parseformula(self.parsed)
+    FormulaProcessor().process(whole)
+    whole.parent = self
+    self.contents = [whole]
+
+  def parse(self, pos):
+    "Parse using a parse position instead of self.parser."
+    if pos.checkskip('$$'):
+      self.parsedollarblock(pos)
+    elif pos.checkskip('$'):
+      self.parsedollarinline(pos)
+    elif pos.checkskip('\\('):
+      self.parseinlineto(pos, '\\)')
+    elif pos.checkskip('\\['):
+      self.parseblockto(pos, '\\]')
+    else:
+      pos.error('Unparseable formula')
+    self.process()
+    return self
+
+  def parsedollarinline(self, pos):
+    "Parse a $...$ formula."
+    self.header = ['inline']
+    self.parsedollar(pos)
+
+  def parsedollarblock(self, pos):
+    "Parse a $$...$$ formula."
+    self.header = ['block']
+    self.parsedollar(pos)
+    if not pos.checkskip('$'):
+      pos.error('Formula should be $$...$$, but last $ is missing.')
+
+  def parsedollar(self, pos):
+    "Parse to the next $."
+    pos.pushending('$')
+    self.parsed = pos.globexcluding('$')
+    pos.popending('$')
+
+  def parseinlineto(self, pos, limit):
+    "Parse a \\(...\\) formula."
+    self.header = ['inline']
+    self.parseupto(pos, limit)
+
+  def parseblockto(self, pos, limit):
+    "Parse a \\[...\\] formula."
+    self.header = ['block']
+    self.parseupto(pos, limit)
+
+  def parseupto(self, pos, limit):
+    "Parse a formula that ends with the given command."
+    pos.pushending(limit)
+    self.parsed = pos.glob(lambda: True)
+    pos.popending(limit)
+
+  def __unicode__(self):
+    "Return a printable representation."
+    if self.partkey and self.partkey.number:
+      return 'Formula (' + self.partkey.number + ')'
+    return 'Unnumbered formula'
+
+class WholeFormula(FormulaBit):
+  "Parse a whole formula"
+
+  def detect(self, pos):
+    "Not outside the formula is enough."
+    return not pos.finished()
+
+  def parsebit(self, pos):
+    "Parse with any formula bit"
+    while not pos.finished():
+      self.add(self.factory.parseany(pos))
+
+class FormulaFactory(object):
+  "Construct bits of formula"
+
+  # bit types will be appended later
+  types = [FormulaSymbol, RawText, FormulaNumber, Bracket, Comment, WhiteSpace]
+  skippedtypes = [Comment, WhiteSpace]
+  defining = False
+
+  def __init__(self):
+    "Initialize the map of instances."
+    self.instances = dict()
+
+  def detecttype(self, type, pos):
+    "Detect a bit of a given type."
+    if pos.finished():
+      return False
+    return self.instance(type).detect(pos)
+
+  def instance(self, type):
+    "Get an instance of the given type."
+    if not type in self.instances or not self.instances[type]:
+      self.instances[type] = self.create(type)
+    return self.instances[type]
+
+  def create(self, type):
+    "Create a new formula bit of the given type."
+    return Cloner.create(type).setfactory(self)
+
+  def clearskipped(self, pos):
+    "Clear any skipped types."
+    while not pos.finished():
+      if not self.skipany(pos):
+        return
+    return
+
+  def skipany(self, pos):
+    "Skip any skipped types."
+    for type in self.skippedtypes:
+      if self.instance(type).detect(pos):
+        return self.parsetype(type, pos)
+    return None
+
+  def parseany(self, pos):
+    "Parse any formula bit at the current location."
+    for type in self.types + self.skippedtypes:
+      if self.detecttype(type, pos):
+        return self.parsetype(type, pos)
+    Trace.error('Unrecognized formula at ' + pos.identifier())
+    return FormulaConstant(pos.skipcurrent())
+
+  def parsetype(self, type, pos):
+    "Parse the given type and return it."
+    bit = self.instance(type)
+    self.instances[type] = None
+    returnedbit = bit.parsebit(pos)
+    if returnedbit:
+      return returnedbit.setfactory(self)
+    return bit
+
+  def parseformula(self, formula):
+    "Parse a string of text that contains a whole formula."
+    pos = TextPosition(formula)
+    whole = self.create(WholeFormula)
+    if whole.detect(pos):
+      whole.parsebit(pos)
+      return whole
+    # no formula found
+    if not pos.finished():
+      Trace.error('Unknown formula at: ' + pos.identifier())
+      whole.add(TaggedBit().constant(formula, 'span class="unknown"'))
+    return whole
+
+
+
+
+import unicodedata
+
+
+
+
+
+
+
+
+
+
+
+
+import gettext
+
+
+class Translator(object):
+  "Reads the configuration file and tries to find a translation."
+  "Otherwise falls back to the messages in the config file."
+
+  instance = None
+
+  def translate(cls, key):
+    "Get the translated message for a key."
+    return cls.instance.getmessage(key)
+
+  translate = classmethod(translate)
+
+  def __init__(self):
+    self.translation = None
+    self.first = True
+
+  def findtranslation(self):
+    "Find the translation for the document language."
+    self.langcodes = None
+    if not DocumentParameters.language:
+      Trace.error('No language in document')
+      return
+    if not DocumentParameters.language in TranslationConfig.languages:
+      Trace.error('Unknown language ' + DocumentParameters.language)
+      return
+    if TranslationConfig.languages[DocumentParameters.language] == 'en':
+      return
+    langcodes = [TranslationConfig.languages[DocumentParameters.language]]
+    try:
+      self.translation = gettext.translation('elyxer', None, langcodes)
+    except IOError:
+      Trace.error('No translation for ' + unicode(langcodes))
+
+  def getmessage(self, key):
+    "Get the translated message for the given key."
+    if self.first:
+      self.findtranslation()
+      self.first = False
+    message = self.getuntranslated(key)
+    if not self.translation:
+      return message
+    try:
+      message = self.translation.ugettext(message)
+    except IOError:
+      pass
+    return message
+
+  def getuntranslated(self, key):
+    "Get the untranslated message."
+    if not key in TranslationConfig.constants:
+      Trace.error('Cannot translate ' + key)
+      return key
+    return TranslationConfig.constants[key]
+
+Translator.instance = Translator()
+
+
+
+class NumberCounter(object):
+  "A counter for numbers (by default)."
+  "The type can be changed to return letters, roman numbers..."
+
+  name = None
+  value = None
+  mode = None
+  master = None
+
+  letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+  symbols = NumberingConfig.sequence['symbols']
+  romannumerals = [
+      ('M', 1000), ('CM', 900), ('D', 500), ('CD', 400), ('C', 100),
+      ('XC', 90), ('L', 50), ('XL', 40), ('X', 10), ('IX', 9), ('V', 5),
+      ('IV', 4), ('I', 1)
+      ]
+
+  def __init__(self, name):
+    "Give a name to the counter."
+    self.name = name
+
+  def setmode(self, mode):
+    "Set the counter mode. Can be changed at runtime."
+    self.mode = mode
+    return self
+
+  def init(self, value):
+    "Set an initial value."
+    self.value = value
+
+  def gettext(self):
+    "Get the next value as a text string."
+    return unicode(self.value)
+
+  def getletter(self):
+    "Get the next value as a letter."
+    return self.getsequence(self.letters)
+
+  def getsymbol(self):
+    "Get the next value as a symbol."
+    return self.getsequence(self.symbols)
+
+  def getsequence(self, sequence):
+    "Get the next value from elyxer.a sequence."
+    return sequence[(self.value - 1) % len(sequence)]
+
+  def getroman(self):
+    "Get the next value as a roman number."
+    result = ''
+    number = self.value
+    for numeral, value in self.romannumerals:
+      if number >= value:
+        result += numeral * (number / value)
+        number = number % value
+    return result
+
+  def getvalue(self):
+    "Get the current value as configured in the current mode."
+    if not self.mode or self.mode in ['text', '1']:
+      return self.gettext()
+    if self.mode == 'A':
+      return self.getletter()
+    if self.mode == 'a':
+      return self.getletter().lower()
+    if self.mode == 'I':
+      return self.getroman()
+    if self.mode == '*':
+      return self.getsymbol()
+    Trace.error('Unknown counter mode ' + self.mode)
+    return self.gettext()
+
+  def getnext(self):
+    "Increase the current value and get the next value as configured."
+    if not self.value:
+      self.value = 0
+    self.value += 1
+    return self.getvalue()
+
+  def reset(self):
+    "Reset the counter."
+    self.value = 0
+
+  def __unicode__(self):
+    "Return a printable representation."
+    result = 'Counter ' + self.name
+    if self.mode:
+      result += ' in mode ' + self.mode
+    return result
+
+class DependentCounter(NumberCounter):
+  "A counter which depends on another one (the master)."
+
+  def setmaster(self, master):
+    "Set the master counter."
+    self.master = master
+    self.last = self.master.getvalue()
+    return self
+
+  def getnext(self):
+    "Increase or, if the master counter has changed, restart."
+    if self.last != self.master.getvalue():
+      self.reset()
+    value = NumberCounter.getnext(self)
+    self.last = self.master.getvalue()
+    return value
+
+  def getvalue(self):
+    "Get the value of the combined counter: master.dependent."
+    return self.master.getvalue() + '.' + NumberCounter.getvalue(self)
+
+class NumberGenerator(object):
+  "A number generator for unique sequences and hierarchical structures. Used in:"
+  "  * ordered part numbers: Chapter 3, Section 5.3."
+  "  * unique part numbers: Footnote 15, Bibliography cite [15]."
+  "  * chaptered part numbers: Figure 3.15, Equation (8.3)."
+  "  * unique roman part numbers: Part I, Book IV."
+
+  chaptered = None
+  generator = None
+
+  romanlayouts = [x.lower() for x in NumberingConfig.layouts['roman']]
+  orderedlayouts = [x.lower() for x in NumberingConfig.layouts['ordered']]
+
+  counters = dict()
+  appendix = None
+
+  def deasterisk(self, type):
+    "Remove the possible asterisk in a layout type."
+    return type.replace('*', '')
+
+  def isunique(self, type):
+    "Find out if the layout type corresponds to a unique part."
+    return self.isroman(type)
+
+  def isroman(self, type):
+    "Find out if the layout type should have roman numeration."
+    return self.deasterisk(type).lower() in self.romanlayouts
+
+  def isinordered(self, type):
+    "Find out if the layout type corresponds to an (un)ordered part."
+    return self.deasterisk(type).lower() in self.orderedlayouts
+
+  def isnumbered(self, type):
+    "Find out if the type for a layout corresponds to a numbered layout."
+    if '*' in type:
+      return False
+    if self.isroman(type):
+      return True
+    if not self.isinordered(type):
+      return False
+    if self.getlevel(type) > DocumentParameters.maxdepth:
+      return False
+    return True
+
+  def isunordered(self, type):
+    "Find out if the type contains an asterisk, basically."
+    return '*' in type
+
+  def getlevel(self, type):
+    "Get the level that corresponds to a layout type."
+    if self.isunique(type):
+      return 0
+    if not self.isinordered(type):
+      Trace.error('Unknown layout type ' + type)
+      return 0
+    type = self.deasterisk(type).lower()
+    level = self.orderedlayouts.index(type) + 1
+    return level - DocumentParameters.startinglevel
+
+  def getparttype(self, type):
+    "Obtain the type for the part: without the asterisk, "
+    "and switched to Appendix if necessary."
+    if NumberGenerator.appendix and self.getlevel(type) == 1:
+      return 'Appendix'
+    return self.deasterisk(type)
+
+  def generate(self, type):
+    "Generate a number for a layout type."
+    "Unique part types such as Part or Book generate roman numbers: Part I."
+    "Ordered part types return dot-separated tuples: Chapter 5, Subsection 2.3.5."
+    "Everything else generates unique numbers: Bibliography [1]."
+    "Each invocation results in a new number."
+    return self.getcounter(type).getnext()
+
+  def getcounter(self, type):
+    "Get the counter for the given type."
+    type = type.lower()
+    if not type in self.counters:
+      self.counters[type] = self.create(type)
+    return self.counters[type]
+
+  def create(self, type):
+    "Create a counter for the given type."
+    if self.isnumbered(type) and self.getlevel(type) > 1:
+      index = self.orderedlayouts.index(type)
+      above = self.orderedlayouts[index - 1]
+      master = self.getcounter(above)
+      return self.createdependent(type, master)
+    counter = NumberCounter(type)
+    if self.isroman(type):
+      counter.setmode('I')
+    return counter
+
+  def getdependentcounter(self, type, master):
+    "Get (or create) a counter of the given type that depends on another."
+    if not type in self.counters or not self.counters[type].master:
+      self.counters[type] = self.createdependent(type, master)
+    return self.counters[type]
+
+  def createdependent(self, type, master):
+    "Create a dependent counter given the master."
+    return DependentCounter(type).setmaster(master)
+
+  def startappendix(self):
+    "Start appendices here."
+    firsttype = self.orderedlayouts[DocumentParameters.startinglevel]
+    counter = self.getcounter(firsttype)
+    counter.setmode('A').reset()
+    NumberGenerator.appendix = True
+
+class ChapteredGenerator(NumberGenerator):
+  "Generate chaptered numbers, as in Chapter.Number."
+  "Used in equations, figures: Equation (5.3), figure 8.15."
+
+  def generate(self, type):
+    "Generate a number which goes with first-level numbers (chapters). "
+    "For the article classes a unique number is generated."
+    if DocumentParameters.startinglevel > 0:
+      return NumberGenerator.generator.generate(type)
+    chapter = self.getcounter('Chapter')
+    return self.getdependentcounter(type, chapter).getnext()
+
+
+NumberGenerator.chaptered = ChapteredGenerator()
+NumberGenerator.generator = NumberGenerator()
+
+
+
+
+
+
+class ContainerSize(object):
+  "The size of a container."
+
+  width = None
+  height = None
+  maxwidth = None
+  maxheight = None
+  scale = None
+
+  def set(self, width = None, height = None):
+    "Set the proper size with width and height."
+    self.setvalue('width', width)
+    self.setvalue('height', height)
+    return self
+
+  def setmax(self, maxwidth = None, maxheight = None):
+    "Set max width and/or height."
+    self.setvalue('maxwidth', maxwidth)
+    self.setvalue('maxheight', maxheight)
+    return self
+
+  def readparameters(self, container):
+    "Read some size parameters off a container."
+    self.setparameter(container, 'width')
+    self.setparameter(container, 'height')
+    self.setparameter(container, 'scale')
+    self.checkvalidheight(container)
+    return self
+
+  def setparameter(self, container, name):
+    "Read a size parameter off a container, and set it if present."
+    value = container.getparameter(name)
+    self.setvalue(name, value)
+
+  def setvalue(self, name, value):
+    "Set the value of a parameter name, only if it's valid."
+    value = self.processparameter(value)
+    if value:
+      setattr(self, name, value)
+
+  def checkvalidheight(self, container):
+    "Check if the height parameter is valid; otherwise erase it."
+    heightspecial = container.getparameter('height_special')
+    if self.height and self.extractnumber(self.height) == '1' and heightspecial == 'totalheight':
+      self.height = None
+
+  def processparameter(self, value):
+    "Do the full processing on a parameter."
+    if not value:
+      return None
+    if self.extractnumber(value) == '0':
+      return None
+    for ignored in StyleConfig.size['ignoredtexts']:
+      if ignored in value:
+        value = value.replace(ignored, '')
+    return value
+
+  def extractnumber(self, text):
+    "Extract the first number in the given text."
+    result = ''
+    decimal = False
+    for char in text:
+      if char.isdigit():
+        result += char
+      elif char == '.' and not decimal:
+        result += char
+        decimal = True
+      else:
+        return result
+    return result
+
+  def checkimage(self, width, height):
+    "Check image dimensions, set them if possible."
+    if width:
+      self.maxwidth = unicode(width) + 'px'
+      if self.scale and not self.width:
+        self.width = self.scalevalue(width)
+    if height:
+      self.maxheight = unicode(height) + 'px'
+      if self.scale and not self.height:
+        self.height = self.scalevalue(height)
+    if self.width and not self.height:
+      self.height = 'auto'
+    if self.height and not self.width:
+      self.width = 'auto'
+
+  def scalevalue(self, value):
+    "Scale the value according to the image scale and return it as unicode."
+    scaled = value * int(self.scale) / 100
+    return unicode(int(scaled)) + 'px'
+
+  def removepercentwidth(self):
+    "Remove percent width if present, to set it at the figure level."
+    if not self.width:
+      return None
+    if not '%' in self.width:
+      return None
+    width = self.width
+    self.width = None
+    if self.height == 'auto':
+      self.height = None
+    return width
+
+  def addstyle(self, container):
+    "Add the proper style attribute to the output tag."
+    if not isinstance(container.output, TaggedOutput):
+      Trace.error('No tag to add style, in ' + unicode(container))
+    if not self.width and not self.height and not self.maxwidth and not self.maxheight:
+      # nothing to see here; move along
+      return
+    tag = ' style="'
+    tag += self.styleparameter('width')
+    tag += self.styleparameter('maxwidth')
+    tag += self.styleparameter('height')
+    tag += self.styleparameter('maxheight')
+    if tag[-1] == ' ':
+      tag = tag[:-1]
+    tag += '"'
+    container.output.tag += tag
+
+  def styleparameter(self, name):
+    "Get the style for a single parameter."
+    value = getattr(self, name)
+    if value:
+      return name.replace('max', 'max-') + ': ' + value + '; '
+    return ''
+
+
+
+class QuoteContainer(Container):
+  "A container for a pretty quote"
+
+  def __init__(self):
+    self.parser = BoundedParser()
+    self.output = FixedOutput()
+
+  def process(self):
+    "Process contents"
+    self.type = self.header[2]
+    if not self.type in StyleConfig.quotes:
+      Trace.error('Quote type ' + self.type + ' not found')
+      self.html = ['"']
+      return
+    self.html = [StyleConfig.quotes[self.type]]
+
+class LyXLine(Container):
+  "A Lyx line"
+
+  def __init__(self):
+    self.parser = LoneCommand()
+    self.output = FixedOutput()
+
+  def process(self):
+    self.html = ['<hr class="line" />']
+
+class EmphaticText(TaggedText):
+  "Text with emphatic mode"
+
+  def process(self):
+    self.output.tag = 'i'
+
+class ShapedText(TaggedText):
+  "Text shaped (italic, slanted)"
+
+  def process(self):
+    self.type = self.header[1]
+    if not self.type in TagConfig.shaped:
+      Trace.error('Unrecognized shape ' + self.header[1])
+      self.output.tag = 'span'
+      return
+    self.output.tag = TagConfig.shaped[self.type]
+
+class VersalitasText(TaggedText):
+  "Text in versalitas"
+
+  def process(self):
+    self.output.tag = 'span class="versalitas"'
+
+class ColorText(TaggedText):
+  "Colored text"
+
+  def process(self):
+    self.color = self.header[1]
+    self.output.tag = 'span class="' + self.color + '"'
+
+class SizeText(TaggedText):
+  "Sized text"
+
+  def process(self):
+    self.size = self.header[1]
+    self.output.tag = 'span class="' + self.size + '"'
+
+class BoldText(TaggedText):
+  "Bold text"
+
+  def process(self):
+    self.output.tag = 'b'
+
+class TextFamily(TaggedText):
+  "A bit of text from elyxer.a different family"
+
+  def process(self):
+    "Parse the type of family"
+    self.type = self.header[1]
+    if not self.type in TagConfig.family:
+      Trace.error('Unrecognized family ' + type)
+      self.output.tag = 'span'
+      return
+    self.output.tag = TagConfig.family[self.type]
+
+class Hfill(TaggedText):
+  "Horizontall fill"
+
+  def process(self):
+    self.output.tag = 'span class="hfill"'
+
+class BarredText(TaggedText):
+  "Text with a bar somewhere"
+
+  def process(self):
+    "Parse the type of bar"
+    self.type = self.header[1]
+    if not self.type in TagConfig.barred:
+      Trace.error('Unknown bar type ' + self.type)
+      self.output.tag = 'span'
+      return
+    self.output.tag = TagConfig.barred[self.type]
+
+class LangLine(TaggedText):
+  "A line with language information"
+
+  def process(self):
+    "Only generate a span with lang info when the language is recognized."
+    lang = self.header[1]
+    if not lang in TranslationConfig.languages:
+      self.output = ContentsOutput()
+      return
+    isolang = TranslationConfig.languages[lang]
+    self.output = TaggedOutput().settag('span lang="' + isolang + '"', False)
+
+class InsetLength(BlackBox):
+  "A length measure inside an inset."
+
+  def process(self):
+    self.length = self.header[1]
+
+class Space(Container):
+  "A space of several types"
+
+  def __init__(self):
+    self.parser = InsetParser()
+    self.output = FixedOutput()
+  
+  def process(self):
+    self.type = self.header[2]
+    if self.type not in StyleConfig.hspaces:
+      Trace.error('Unknown space type ' + self.type)
+      self.html = [' ']
+      return
+    self.html = [StyleConfig.hspaces[self.type]]
+    length = self.getlength()
+    if not length:
+      return
+    self.output = TaggedOutput().settag('span class="hspace"', False)
+    ContainerSize().set(length).addstyle(self)
+
+  def getlength(self):
+    "Get the space length from elyxer.the contents or parameters."
+    if len(self.contents) == 0 or not isinstance(self.contents[0], InsetLength):
+      return None
+    return self.contents[0].length
+
+class VerticalSpace(Container):
+  "An inset that contains a vertical space."
+
+  def __init__(self):
+    self.parser = InsetParser()
+    self.output = FixedOutput()
+
+  def process(self):
+    "Set the correct tag"
+    self.type = self.header[2]
+    if self.type not in StyleConfig.vspaces:
+      self.output = TaggedOutput().settag('div class="vspace" style="height: ' + self.type + ';"', True)
+      return
+    self.html = [StyleConfig.vspaces[self.type]]
+
+class Align(Container):
+  "Bit of aligned text"
+
+  def __init__(self):
+    self.parser = ExcludingParser()
+    self.output = TaggedOutput().setbreaklines(True)
+
+  def process(self):
+    self.output.tag = 'div class="' + self.header[1] + '"'
+
+class Newline(Container):
+  "A newline"
+
+  def __init__(self):
+    self.parser = LoneCommand()
+    self.output = FixedOutput()
+
+  def process(self):
+    "Process contents"
+    self.html = ['<br/>\n']
+
+class NewPage(Newline):
+  "A new page"
+
+  def process(self):
+    "Process contents"
+    self.html = ['<p><br/>\n</p>\n']
+
+class Separator(Container):
+  "A separator string which is not extracted by extracttext()."
+
+  def __init__(self, constant):
+    self.output = FixedOutput()
+    self.contents = []
+    self.html = [constant]
+
+class StrikeOut(TaggedText):
+  "Striken out text."
+
+  def process(self):
+    "Set the output tag to strike."
+    self.output.tag = 'strike'
+
+class StartAppendix(BlackBox):
+  "Mark to start an appendix here."
+  "From this point on, all chapters become appendices."
+
+  def process(self):
+    "Activate the special numbering scheme for appendices, using letters."
+    NumberGenerator.generator.startappendix()
+
+
+
+
+
+
+class Link(Container):
+  "A link to another part of the document"
+
+  anchor = None
+  url = None
+  type = None
+  page = None
+  target = None
+  destination = None
+  title = None
+
+  def __init__(self):
+    "Initialize the link, add target if configured."
+    self.contents = []
+    self.parser = InsetParser()
+    self.output = LinkOutput()
+    if Options.target:
+      self.target = Options.target
+
+  def complete(self, text, anchor = None, url = None, type = None, title = None):
+    "Complete the link."
+    self.contents = [Constant(text)]
+    if anchor:
+      self.anchor = anchor
+    if url:
+      self.url = url
+    if type:
+      self.type = type
+    if title:
+      self.title = title
+    return self
+
+  def computedestination(self):
+    "Use the destination link to fill in the destination URL."
+    if not self.destination:
+      return
+    self.url = ''
+    if self.destination.anchor:
+      self.url = '#' + self.destination.anchor
+    if self.destination.page:
+      self.url = self.destination.page + self.url
+
+  def setmutualdestination(self, destination):
+    "Set another link as destination, and set its destination to this one."
+    self.destination = destination
+    destination.destination = self
+
+  def __unicode__(self):
+    "Return a printable representation."
+    result = 'Link'
+    if self.anchor:
+      result += ' #' + self.anchor
+    if self.url:
+      result += ' to ' + self.url
+    return result
+
+class URL(Link):
+  "A clickable URL"
+
+  def process(self):
+    "Read URL from elyxer.parameters"
+    target = self.escape(self.getparameter('target'))
+    self.url = target
+    type = self.getparameter('type')
+    if type:
+      self.url = self.escape(type) + target
+    name = self.getparameter('name')
+    if not name:
+      name = target
+    self.contents = [Constant(name)]
+
+class FlexURL(URL):
+  "A flexible URL"
+
+  def process(self):
+    "Read URL from elyxer.contents"
+    self.url = self.extracttext()
+
+class LinkOutput(ContainerOutput):
+  "A link pointing to some destination"
+  "Or an anchor (destination)"
+
+  def gethtml(self, link):
+    "Get the HTML code for the link"
+    type = link.__class__.__name__
+    if link.type:
+      type = link.type
+    tag = 'a class="' + type + '"'
+    if link.anchor:
+      tag += ' name="' + link.anchor + '"'
+    if link.destination:
+      link.computedestination()
+    if link.url:
+      tag += ' href="' + link.url + '"'
+    if link.target:
+      tag += ' target="' + link.target + '"'
+    if link.title:
+      tag += ' title="' + link.title + '"'
+    return TaggedOutput().settag(tag).gethtml(link)
+
+
+
+
+
+class Postprocessor(object):
+  "Postprocess a container keeping some context"
+
+  stages = []
+
+  def __init__(self):
+    self.stages = StageDict(Postprocessor.stages, self)
+    self.current = None
+    self.last = None
+
+  def postprocess(self, next):
+    "Postprocess a container and its contents."
+    self.postrecursive(self.current)
+    result = self.postcurrent(next)
+    self.last = self.current
+    self.current = next
+    return result
+
+  def postrecursive(self, container):
+    "Postprocess the container contents recursively"
+    if not hasattr(container, 'contents'):
+      return
+    if len(container.contents) == 0:
+      return
+    if hasattr(container, 'postprocess'):
+      if not container.postprocess:
+        return
+    postprocessor = Postprocessor()
+    contents = []
+    for element in container.contents:
+      post = postprocessor.postprocess(element)
+      if post:
+        contents.append(post)
+    # two rounds to empty the pipeline
+    for i in range(2):
+      post = postprocessor.postprocess(None)
+      if post:
+        contents.append(post)
+    container.contents = contents
+
+  def postcurrent(self, next):
+    "Postprocess the current element taking into account next and last."
+    stage = self.stages.getstage(self.current)
+    if not stage:
+      return self.current
+    return stage.postprocess(self.last, self.current, next)
+
+class StageDict(object):
+  "A dictionary of stages corresponding to classes"
+
+  def __init__(self, classes, postprocessor):
+    "Instantiate an element from elyxer.each class and store as a dictionary"
+    instances = self.instantiate(classes, postprocessor)
+    self.stagedict = dict([(x.processedclass, x) for x in instances])
+
+  def instantiate(self, classes, postprocessor):
+    "Instantiate an element from elyxer.each class"
+    stages = [x.__new__(x) for x in classes]
+    for element in stages:
+      element.__init__()
+      element.postprocessor = postprocessor
+    return stages
+
+  def getstage(self, element):
+    "Get the stage for a given element, if the type is in the dict"
+    if not element.__class__ in self.stagedict:
+      return None
+    return self.stagedict[element.__class__]
+
+
+
+class Label(Link):
+  "A label to be referenced"
+
+  names = dict()
+  lastlayout = None
+
+  def __init__(self):
+    Link.__init__(self)
+    self.lastnumbered = None
+
+  def process(self):
+    "Process a label container."
+    key = self.getparameter('name')
+    self.create(' ', key)
+    self.lastnumbered = Label.lastlayout
+
+  def create(self, text, key, type = 'Label'):
+    "Create the label for a given key."
+    self.key = key
+    self.complete(text, anchor = key, type = type)
+    Label.names[key] = self
+    if key in Reference.references:
+      for reference in Reference.references[key]:
+        reference.destination = self
+    return self
+
+  def findpartkey(self):
+    "Get the part key for the latest numbered container seen."
+    numbered = self.numbered(self)
+    if numbered and numbered.partkey:
+      return numbered.partkey
+    return ''
+
+  def numbered(self, container):
+    "Get the numbered container for the label."
+    if container.partkey:
+      return container
+    if not container.parent:
+      if self.lastnumbered:
+        return self.lastnumbered
+      return None
+    return self.numbered(container.parent)
+
+  def __unicode__(self):
+    "Return a printable representation."
+    if not hasattr(self, 'key'):
+      return 'Unnamed label'
+    return 'Label ' + self.key
+
+class Reference(Link):
+  "A reference to a label."
+
+  references = dict()
+  key = 'none'
+
+  def process(self):
+    "Read the reference and set the arrow."
+    self.key = self.getparameter('reference')
+    if self.key in Label.names:
+      self.direction = u'↑'
+      label = Label.names[self.key]
+    else:
+      self.direction = u'↓'
+      label = Label().complete(' ', self.key, 'preref')
+    self.destination = label
+    self.formatcontents()
+    if not self.key in Reference.references:
+      Reference.references[self.key] = []
+    Reference.references[self.key].append(self)
+
+  def formatcontents(self):
+    "Format the reference contents."
+    formatkey = self.getparameter('LatexCommand')
+    if not formatkey:
+      formatkey = 'ref'
+    self.formatted = u'↕'
+    if formatkey in StyleConfig.referenceformats:
+      self.formatted = StyleConfig.referenceformats[formatkey]
+    else:
+      Trace.error('Unknown reference format ' + formatkey)
+    self.replace(u'↕', self.direction)
+    self.replace('#', '1')
+    self.replace('on-page', Translator.translate('on-page'))
+    partkey = self.destination.findpartkey()
+    # only if partkey and partkey.number are not null, send partkey.number
+    self.replace('@', partkey and partkey.number)
+    self.replace(u'¶', partkey and partkey.tocentry)
+    if not '$' in self.formatted or not partkey or not partkey.titlecontents:
+      # there is a $ left, but it should go away on preprocessing
+      self.contents = [Constant(self.formatted)]
+      return
+    pieces = self.formatted.split('$')
+    self.contents = [Constant(pieces[0])]
+    for piece in pieces[1:]:
+      self.contents += partkey.titlecontents
+      self.contents.append(Constant(piece))
+
+  def replace(self, key, value):
+    "Replace a key in the format template with a value."
+    if not key in self.formatted:
+      return
+    if not value:
+      value = ''
+    self.formatted = self.formatted.replace(key, value)
+
+  def __unicode__(self):
+    "Return a printable representation."
+    return 'Reference ' + self.key
+
+
+
+class FormulaCommand(FormulaBit):
+  "A LaTeX command inside a formula"
+
+  types = []
+  start = FormulaConfig.starts['command']
+  commandmap = None
+
+  def detect(self, pos):
+    "Find the current command."
+    return pos.checkfor(FormulaCommand.start)
+
+  def parsebit(self, pos):
+    "Parse the command."
+    command = self.extractcommand(pos)
+    bit = self.parsewithcommand(command, pos)
+    if bit:
+      return bit
+    if command.startswith('\\up') or command.startswith('\\Up'):
+      upgreek = self.parseupgreek(command, pos)
+      if upgreek:
+        return upgreek
+    if not self.factory.defining:
+      Trace.error('Unknown command ' + command)
+    self.output = TaggedOutput().settag('span class="unknown"')
+    self.add(FormulaConstant(command))
+    return None
+
+  def parsewithcommand(self, command, pos):
+    "Parse the command type once we have the command."
+    for type in FormulaCommand.types:
+      if command in type.commandmap:
+        return self.parsecommandtype(command, type, pos)
+    return None
+
+  def parsecommandtype(self, command, type, pos):
+    "Parse a given command type."
+    bit = self.factory.create(type)
+    bit.setcommand(command)
+    returned = bit.parsebit(pos)
+    if returned:
+      return returned
+    return bit
+
+  def extractcommand(self, pos):
+    "Extract the command from elyxer.the current position."
+    if not pos.checkskip(FormulaCommand.start):
+      pos.error('Missing command start ' + FormulaCommand.start)
+      return
+    if pos.finished():
+      return self.emptycommand(pos)
+    if pos.current().isalpha():
+      # alpha command
+      command = FormulaCommand.start + pos.globalpha()
+      # skip mark of short command
+      pos.checkskip('*')
+      return command
+    # symbol command
+    return FormulaCommand.start + pos.skipcurrent()
+
+  def emptycommand(self, pos):
+    """Check for an empty command: look for command disguised as ending.
+    Special case against '{ \{ \} }' situation."""
+    command = ''
+    if not pos.isout():
+      ending = pos.nextending()
+      if ending and pos.checkskip(ending):
+        command = ending
+    return FormulaCommand.start + command
+
+  def parseupgreek(self, command, pos):
+    "Parse the Greek \\up command.."
+    if len(command) < 4:
+      return None
+    if command.startswith('\\up'):
+      upcommand = '\\' + command[3:]
+    elif pos.checkskip('\\Up'):
+      upcommand = '\\' + command[3:4].upper() + command[4:]
+    else:
+      Trace.error('Impossible upgreek command: ' + command)
+      return
+    upgreek = self.parsewithcommand(upcommand, pos)
+    if upgreek:
+      upgreek.type = 'font'
+    return upgreek
+
+class CommandBit(FormulaCommand):
+  "A formula bit that includes a command"
+
+  def setcommand(self, command):
+    "Set the command in the bit"
+    self.command = command
+    if self.commandmap:
+      self.original += command
+      self.translated = self.commandmap[self.command]
+ 
+  def parseparameter(self, pos):
+    "Parse a parameter at the current position"
+    self.factory.clearskipped(pos)
+    if pos.finished():
+      return None
+    parameter = self.factory.parseany(pos)
+    self.add(parameter)
+    return parameter
+
+  def parsesquare(self, pos):
+    "Parse a square bracket"
+    self.factory.clearskipped(pos)
+    if not self.factory.detecttype(SquareBracket, pos):
+      return None
+    bracket = self.factory.parsetype(SquareBracket, pos)
+    self.add(bracket)
+    return bracket
+
+  def parseliteral(self, pos):
+    "Parse a literal bracket."
+    self.factory.clearskipped(pos)
+    if not self.factory.detecttype(Bracket, pos):
+      if not pos.isvalue():
+        Trace.error('No literal parameter found at: ' + pos.identifier())
+        return None
+      return pos.globvalue()
+    bracket = Bracket().setfactory(self.factory)
+    self.add(bracket.parseliteral(pos))
+    return bracket.literal
+
+  def parsesquareliteral(self, pos):
+    "Parse a square bracket literally."
+    self.factory.clearskipped(pos)
+    if not self.factory.detecttype(SquareBracket, pos):
+      return None
+    bracket = SquareBracket().setfactory(self.factory)
+    self.add(bracket.parseliteral(pos))
+    return bracket.literal
+
+  def parsetext(self, pos):
+    "Parse a text parameter."
+    self.factory.clearskipped(pos)
+    if not self.factory.detecttype(Bracket, pos):
+      Trace.error('No text parameter for ' + self.command)
+      return None
+    bracket = Bracket().setfactory(self.factory).parsetext(pos)
+    self.add(bracket)
+    return bracket
+
+class EmptyCommand(CommandBit):
+  "An empty command (without parameters)"
+
+  commandmap = FormulaConfig.commands
+
+  def parsebit(self, pos):
+    "Parse a command without parameters"
+    self.contents = [FormulaConstant(self.translated)]
+
+class SpacedCommand(CommandBit):
+  "An empty command which should have math spacing in formulas."
+
+  commandmap = FormulaConfig.spacedcommands
+
+  def parsebit(self, pos):
+    "Place as contents the command translated and spaced."
+    self.contents = [FormulaConstant(u' ' + self.translated + u' ')]
+
+class AlphaCommand(EmptyCommand):
+  "A command without paramters whose result is alphabetical"
+
+  commandmap = FormulaConfig.alphacommands
+
+  def parsebit(self, pos):
+    "Parse the command and set type to alpha"
+    EmptyCommand.parsebit(self, pos)
+    self.type = 'alpha'
+
+class OneParamFunction(CommandBit):
+  "A function of one parameter"
+
+  commandmap = FormulaConfig.onefunctions
+  simplified = False
+
+  def parsebit(self, pos):
+    "Parse a function with one parameter"
+    self.output = TaggedOutput().settag(self.translated)
+    self.parseparameter(pos)
+    self.simplifyifpossible()
+
+  def simplifyifpossible(self):
+    "Try to simplify to a single character."
+    if self.original in self.commandmap:
+      self.output = FixedOutput()
+      self.html = [self.commandmap[self.original]]
+      self.simplified = True
+
+class SymbolFunction(CommandBit):
+  "Find a function which is represented by a symbol (like _ or ^)"
+
+  commandmap = FormulaConfig.symbolfunctions
+
+  def detect(self, pos):
+    "Find the symbol"
+    return pos.current() in SymbolFunction.commandmap
+
+  def parsebit(self, pos):
+    "Parse the symbol"
+    self.setcommand(pos.current())
+    pos.skip(self.command)
+    self.output = TaggedOutput().settag(self.translated)
+    self.parseparameter(pos)
+
+class TextFunction(CommandBit):
+  "A function where parameters are read as text."
+
+  commandmap = FormulaConfig.textfunctions
+
+  def parsebit(self, pos):
+    "Parse a text parameter"
+    self.output = TaggedOutput().settag(self.translated)
+    self.parsetext(pos)
+
+  def process(self):
+    "Set the type to font"
+    self.type = 'font'
+
+class LabelFunction(CommandBit):
+  "A function that acts as a label"
+
+  commandmap = FormulaConfig.labelfunctions
+
+  def parsebit(self, pos):
+    "Parse a literal parameter"
+    self.key = self.parseliteral(pos)
+
+  def process(self):
+    "Add an anchor with the label contents."
+    self.type = 'font'
+    self.label = Label().create(' ', self.key, type = 'eqnumber')
+    self.contents = [self.label]
+    # store as a Label so we know it's been seen
+    Label.names[self.key] = self.label
+
+class FontFunction(OneParamFunction):
+  "A function of one parameter that changes the font"
+
+  commandmap = FormulaConfig.fontfunctions
+
+  def process(self):
+    "Simplify if possible using a single character."
+    self.type = 'font'
+    self.simplifyifpossible()
+
+FormulaFactory.types += [FormulaCommand, SymbolFunction]
+FormulaCommand.types = [
+    AlphaCommand, EmptyCommand, OneParamFunction, FontFunction, LabelFunction,
+    TextFunction, SpacedCommand,
+    ]
+
+
+
+
+
+
+
+
+
+
+
+
+class BigSymbol(object):
+  "A big symbol generator."
+
+  symbols = FormulaConfig.bigsymbols
+
+  def __init__(self, symbol):
+    "Create the big symbol."
+    self.symbol = symbol
+
+  def getpieces(self):
+    "Get an array with all pieces."
+    if not self.symbol in self.symbols:
+      return [self.symbol]
+    if self.smalllimit():
+      return [self.symbol]
+    return self.symbols[self.symbol]
+
+  def smalllimit(self):
+    "Decide if the limit should be a small, one-line symbol."
+    if not DocumentParameters.displaymode:
+      return True
+    if len(self.symbols[self.symbol]) == 1:
+      return True
+    return Options.simplemath
+
+class BigBracket(BigSymbol):
+  "A big bracket generator."
+
+  def __init__(self, size, bracket, alignment='l'):
+    "Set the size and symbol for the bracket."
+    self.size = size
+    self.original = bracket
+    self.alignment = alignment
+    self.pieces = None
+    if bracket in FormulaConfig.bigbrackets:
+      self.pieces = FormulaConfig.bigbrackets[bracket]
+
+  def getpiece(self, index):
+    "Return the nth piece for the bracket."
+    function = getattr(self, 'getpiece' + unicode(len(self.pieces)))
+    return function(index)
+
+  def getpiece1(self, index):
+    "Return the only piece for a single-piece bracket."
+    return self.pieces[0]
+
+  def getpiece3(self, index):
+    "Get the nth piece for a 3-piece bracket: parenthesis or square bracket."
+    if index == 0:
+      return self.pieces[0]
+    if index == self.size - 1:
+      return self.pieces[-1]
+    return self.pieces[1]
+
+  def getpiece4(self, index):
+    "Get the nth piece for a 4-piece bracket: curly bracket."
+    if index == 0:
+      return self.pieces[0]
+    if index == self.size - 1:
+      return self.pieces[3]
+    if index == (self.size - 1)/2:
+      return self.pieces[2]
+    return self.pieces[1]
+
+  def getcell(self, index):
+    "Get the bracket piece as an array cell."
+    piece = self.getpiece(index)
+    span = 'span class="bracket align-' + self.alignment + '"'
+    return TaggedBit().constant(piece, span)
+
+  def getcontents(self):
+    "Get the bracket as an array or as a single bracket."
+    if self.size == 1 or not self.pieces:
+      return self.getsinglebracket()
+    rows = []
+    for index in range(self.size):
+      cell = self.getcell(index)
+      rows.append(TaggedBit().complete([cell], 'span class="arrayrow"'))
+    return [TaggedBit().complete(rows, 'span class="array"')]
+
+  def getsinglebracket(self):
+    "Return the bracket as a single sign."
+    if self.original == '.':
+      return [TaggedBit().constant('', 'span class="emptydot"')]
+    return [TaggedBit().constant(self.original, 'span class="symbol"')]
+
+
+
+
+
+
+class FormulaEquation(CommandBit):
+  "A simple numbered equation."
+
+  piece = 'equation'
+
+  def parsebit(self, pos):
+    "Parse the array"
+    self.output = ContentsOutput()
+    self.add(self.factory.parsetype(WholeFormula, pos))
+
+class FormulaCell(FormulaCommand):
+  "An array cell inside a row"
+
+  def setalignment(self, alignment):
+    self.alignment = alignment
+    self.output = TaggedOutput().settag('span class="arraycell align-' + alignment +'"', True)
+    return self
+
+  def parsebit(self, pos):
+    self.factory.clearskipped(pos)
+    if pos.finished():
+      return
+    self.add(self.factory.parsetype(WholeFormula, pos))
+
+class FormulaRow(FormulaCommand):
+  "An array row inside an array"
+
+  cellseparator = FormulaConfig.array['cellseparator']
+
+  def setalignments(self, alignments):
+    self.alignments = alignments
+    self.output = TaggedOutput().settag('span class="arrayrow"', True)
+    return self
+
+  def parsebit(self, pos):
+    "Parse a whole row"
+    index = 0
+    pos.pushending(self.cellseparator, optional=True)
+    while not pos.finished():
+      cell = self.createcell(index)
+      cell.parsebit(pos)
+      self.add(cell)
+      index += 1
+      pos.checkskip(self.cellseparator)
+    if len(self.contents) == 0:
+      self.output = EmptyOutput()
+
+  def createcell(self, index):
+    "Create the cell that corresponds to the given index."
+    alignment = self.alignments[index % len(self.alignments)]
+    return self.factory.create(FormulaCell).setalignment(alignment)
+
+class MultiRowFormula(CommandBit):
+  "A formula with multiple rows."
+
+  def parserows(self, pos):
+    "Parse all rows, finish when no more row ends"
+    self.rows = []
+    first = True
+    for row in self.iteraterows(pos):
+      if first:
+        first = False
+      else:
+        # intersparse empty rows
+        self.addempty()
+      row.parsebit(pos)
+      self.addrow(row)
+    self.size = len(self.rows)
+
+  def iteraterows(self, pos):
+    "Iterate over all rows, end when no more row ends"
+    rowseparator = FormulaConfig.array['rowseparator']
+    while True:
+      pos.pushending(rowseparator, True)
+      row = self.factory.create(FormulaRow)
+      yield row.setalignments(self.alignments)
+      if pos.checkfor(rowseparator):
+        self.original += pos.popending(rowseparator)
+      else:
+        return
+
+  def addempty(self):
+    "Add an empty row."
+    row = self.factory.create(FormulaRow).setalignments(self.alignments)
+    for index, originalcell in enumerate(self.rows[-1].contents):
+      cell = row.createcell(index)
+      cell.add(FormulaConstant(u' '))
+      row.add(cell)
+    self.addrow(row)
+
+  def addrow(self, row):
+    "Add a row to the contents and to the list of rows."
+    self.rows.append(row)
+    self.add(row)
+
+class FormulaArray(MultiRowFormula):
+  "An array within a formula"
+
+  piece = 'array'
+
+  def parsebit(self, pos):
+    "Parse the array"
+    self.output = TaggedOutput().settag('span class="array"', False)
+    self.parsealignments(pos)
+    self.parserows(pos)
+
+  def parsealignments(self, pos):
+    "Parse the different alignments"
+    # vertical
+    self.valign = 'c'
+    literal = self.parsesquareliteral(pos)
+    if literal:
+      self.valign = literal
+    # horizontal
+    literal = self.parseliteral(pos)
+    self.alignments = []
+    for l in literal:
+      self.alignments.append(l)
+
+class FormulaMatrix(MultiRowFormula):
+  "A matrix (array with center alignment)."
+
+  piece = 'matrix'
+
+  def parsebit(self, pos):
+    "Parse the matrix, set alignments to 'c'."
+    self.output = TaggedOutput().settag('span class="array"', False)
+    self.valign = 'c'
+    self.alignments = ['c']
+    self.parserows(pos)
+
+class FormulaCases(MultiRowFormula):
+  "A cases statement"
+
+  piece = 'cases'
+
+  def parsebit(self, pos):
+    "Parse the cases"
+    self.output = ContentsOutput()
+    self.alignments = ['l', 'l']
+    self.parserows(pos)
+    for row in self.contents:
+      for cell in row.contents:
+        cell.output.settag('span class="case align-l"', True)
+        cell.contents.append(FormulaConstant(u' '))
+    array = TaggedBit().complete(self.contents, 'span class="bracketcases"', True)
+    brace = BigBracket(len(self.contents), '{', 'l')
+    self.contents = brace.getcontents() + [array]
+
+class EquationEnvironment(MultiRowFormula):
+  "A \\begin{}...\\end equation environment with rows and cells."
+
+  def parsebit(self, pos):
+    "Parse the whole environment."
+    self.output = TaggedOutput().settag('span class="environment"', False)
+    environment = self.piece.replace('*', '')
+    if environment in FormulaConfig.environments:
+      self.alignments = FormulaConfig.environments[environment]
+    else:
+      Trace.error('Unknown equation environment ' + self.piece)
+      self.alignments = ['l']
+    self.parserows(pos)
+
+class BeginCommand(CommandBit):
+  "A \\begin{}...\end command and what it entails (array, cases, aligned)"
+
+  commandmap = {FormulaConfig.array['begin']:''}
+
+  types = [FormulaEquation, FormulaArray, FormulaCases, FormulaMatrix]
+
+  def parsebit(self, pos):
+    "Parse the begin command"
+    command = self.parseliteral(pos)
+    bit = self.findbit(command)
+    ending = FormulaConfig.array['end'] + '{' + command + '}'
+    pos.pushending(ending)
+    bit.parsebit(pos)
+    self.add(bit)
+    self.original += pos.popending(ending)
+    self.size = bit.size
+
+  def findbit(self, piece):
+    "Find the command bit corresponding to the \\begin{piece}"
+    for type in BeginCommand.types:
+      if piece.replace('*', '') == type.piece:
+        return self.factory.create(type)
+    bit = self.factory.create(EquationEnvironment)
+    bit.piece = piece
+    return bit
+
+FormulaCommand.types += [BeginCommand]
+
+
+import datetime
+
+
+class CombiningFunction(OneParamFunction):
+
+  commandmap = FormulaConfig.combiningfunctions
+
+  def parsebit(self, pos):
+    "Parse a combining function."
+    self.type = 'alpha'
+    combining = self.translated
+    parameter = self.parsesingleparameter(pos)
+    if not parameter:
+      Trace.error('Empty parameter for combining function ' + self.command)
+    elif len(parameter.extracttext()) != 1:
+      Trace.error('Applying combining function ' + self.command + ' to invalid string "' + parameter.extracttext() + '"')
+    self.contents.append(Constant(combining))
+
+  def parsesingleparameter(self, pos):
+    "Parse a parameter, or a single letter."
+    self.factory.clearskipped(pos)
+    if pos.finished():
+      Trace.error('Error while parsing single parameter at ' + pos.identifier())
+      return None
+    if self.factory.detecttype(Bracket, pos) \
+        or self.factory.detecttype(FormulaCommand, pos):
+      return self.parseparameter(pos)
+    letter = FormulaConstant(pos.skipcurrent())
+    self.add(letter)
+    return letter
+
+class DecoratingFunction(OneParamFunction):
+  "A function that decorates some bit of text"
+
+  commandmap = FormulaConfig.decoratingfunctions
+
+  def parsebit(self, pos):
+    "Parse a decorating function"
+    self.type = 'alpha'
+    symbol = self.translated
+    self.symbol = TaggedBit().constant(symbol, 'span class="symbolover"')
+    self.parameter = self.parseparameter(pos)
+    self.output = TaggedOutput().settag('span class="withsymbol"')
+    self.contents.insert(0, self.symbol)
+    self.parameter.output = TaggedOutput().settag('span class="undersymbol"')
+    self.simplifyifpossible()
+
+class LimitCommand(EmptyCommand):
+  "A command which accepts limits above and below, in display mode."
+
+  commandmap = FormulaConfig.limitcommands
+
+  def parsebit(self, pos):
+    "Parse a limit command."
+    pieces = BigSymbol(self.translated).getpieces()
+    self.output = TaggedOutput().settag('span class="limits"')
+    for piece in pieces:
+      self.contents.append(TaggedBit().constant(piece, 'span class="limit"'))
+
+class LimitPreviousCommand(LimitCommand):
+  "A command to limit the previous command."
+
+  commandmap = None
+
+  def parsebit(self, pos):
+    "Do nothing."
+    self.output = TaggedOutput().settag('span class="limits"')
+    self.factory.clearskipped(pos)
+
+  def __unicode__(self):
+    "Return a printable representation."
+    return 'Limit previous command'
+
+class LimitsProcessor(MathsProcessor):
+  "A processor for limits inside an element."
+
+  def process(self, contents, index):
+    "Process the limits for an element."
+    if Options.simplemath:
+      return
+    if self.checklimits(contents, index):
+      self.modifylimits(contents, index)
+    if self.checkscript(contents, index) and self.checkscript(contents, index + 1):
+      self.modifyscripts(contents, index)
+
+  def checklimits(self, contents, index):
+    "Check if the current position has a limits command."
+    if not DocumentParameters.displaymode:
+      return False
+    if self.checkcommand(contents, index + 1, LimitPreviousCommand):
+      self.limitsahead(contents, index)
+      return False
+    if not isinstance(contents[index], LimitCommand):
+      return False
+    return self.checkscript(contents, index + 1)
+
+  def limitsahead(self, contents, index):
+    "Limit the current element based on the next."
+    contents[index + 1].add(contents[index].clone())
+    contents[index].output = EmptyOutput()
+
+  def modifylimits(self, contents, index):
+    "Modify a limits commands so that the limits appear above and below."
+    limited = contents[index]
+    subscript = self.getlimit(contents, index + 1)
+    limited.contents.append(subscript)
+    if self.checkscript(contents, index + 1):
+      superscript = self.getlimit(contents, index  + 1)
+    else:
+      superscript = TaggedBit().constant(u' ', 'sup class="limit"')
+    limited.contents.insert(0, superscript)
+
+  def getlimit(self, contents, index):
+    "Get the limit for a limits command."
+    limit = self.getscript(contents, index)
+    limit.output.tag = limit.output.tag.replace('script', 'limit')
+    return limit
+
+  def modifyscripts(self, contents, index):
+    "Modify the super- and subscript to appear vertically aligned."
+    subscript = self.getscript(contents, index)
+    # subscript removed so instead of index + 1 we get index again
+    superscript = self.getscript(contents, index)
+    scripts = TaggedBit().complete([superscript, subscript], 'span class="scripts"')
+    contents.insert(index, scripts)
+
+  def checkscript(self, contents, index):
+    "Check if the current element is a sub- or superscript."
+    return self.checkcommand(contents, index, SymbolFunction)
+
+  def checkcommand(self, contents, index, type):
+    "Check for the given type as the current element."
+    if len(contents) <= index:
+      return False
+    return isinstance(contents[index], type)
+
+  def getscript(self, contents, index):
+    "Get the sub- or superscript."
+    bit = contents[index]
+    bit.output.tag += ' class="script"'
+    del contents[index]
+    return bit
+
+class BracketCommand(OneParamFunction):
+  "A command which defines a bracket."
+
+  commandmap = FormulaConfig.bracketcommands
+
+  def parsebit(self, pos):
+    "Parse the bracket."
+    OneParamFunction.parsebit(self, pos)
+
+  def create(self, direction, character):
+    "Create the bracket for the given character."
+    self.original = character
+    self.command = '\\' + direction
+    self.contents = [FormulaConstant(character)]
+    return self
+
+class BracketProcessor(MathsProcessor):
+  "A processor for bracket commands."
+
+  def process(self, contents, index):
+    "Convert the bracket using Unicode pieces, if possible."
+    if Options.simplemath:
+      return
+    if self.checkleft(contents, index):
+      return self.processleft(contents, index)
+
+  def processleft(self, contents, index):
+    "Process a left bracket."
+    rightindex = self.findright(contents, index + 1)
+    if not rightindex:
+      return
+    size = self.findmax(contents, index, rightindex)
+    self.resize(contents[index], size)
+    self.resize(contents[rightindex], size)
+
+  def checkleft(self, contents, index):
+    "Check if the command at the given index is left."
+    return self.checkdirection(contents[index], '\\left')
+  
+  def checkright(self, contents, index):
+    "Check if the command at the given index is right."
+    return self.checkdirection(contents[index], '\\right')
+
+  def checkdirection(self, bit, command):
+    "Check if the given bit is the desired bracket command."
+    if not isinstance(bit, BracketCommand):
+      return False
+    return bit.command == command
+
+  def findright(self, contents, index):
+    "Find the right bracket starting at the given index, or 0."
+    depth = 1
+    while index < len(contents):
+      if self.checkleft(contents, index):
+        depth += 1
+      if self.checkright(contents, index):
+        depth -= 1
+      if depth == 0:
+        return index
+      index += 1
+    return None
+
+  def findmax(self, contents, leftindex, rightindex):
+    "Find the max size of the contents between the two given indices."
+    sliced = contents[leftindex:rightindex]
+    return max([element.size for element in sliced])
+
+  def resize(self, command, size):
+    "Resize a bracket command to the given size."
+    character = command.extracttext()
+    alignment = command.command.replace('\\', '')
+    bracket = BigBracket(size, character, alignment)
+    command.output = ContentsOutput()
+    command.contents = bracket.getcontents()
+
+class TodayCommand(EmptyCommand):
+  "Shows today's date."
+
+  commandmap = None
+
+  def parsebit(self, pos):
+    "Parse a command without parameters"
+    self.output = FixedOutput()
+    self.html = [datetime.date.today().strftime('%b %d, %Y')]
+
+
+FormulaCommand.types += [
+    DecoratingFunction, CombiningFunction, LimitCommand, BracketCommand,
+    ]
+
+FormulaProcessor.processors += [
+    LimitsProcessor(), BracketProcessor(),
+    ]
+
+
+
+class ParameterDefinition(object):
+  "The definition of a parameter in a hybrid function."
+  "[] parameters are optional, {} parameters are mandatory."
+  "Each parameter has a one-character name, like {$1} or {$p}."
+  "A parameter that ends in ! like {$p!} is a literal."
+  "Example: [$1]{$p!} reads an optional parameter $1 and a literal mandatory parameter p."
+
+  parambrackets = [('[', ']'), ('{', '}')]
+
+  def __init__(self):
+    self.name = None
+    self.literal = False
+    self.optional = False
+    self.value = None
+    self.literalvalue = None
+
+  def parse(self, pos):
+    "Parse a parameter definition: [$0], {$x}, {$1!}..."
+    for (opening, closing) in ParameterDefinition.parambrackets:
+      if pos.checkskip(opening):
+        if opening == '[':
+          self.optional = True
+        if not pos.checkskip('$'):
+          Trace.error('Wrong parameter name, did you mean $' + pos.current() + '?')
+          return None
+        self.name = pos.skipcurrent()
+        if pos.checkskip('!'):
+          self.literal = True
+        if not pos.checkskip(closing):
+          Trace.error('Wrong parameter closing ' + pos.skipcurrent())
+          return None
+        return self
+    Trace.error('Wrong character in parameter template: ' + pos.skipcurrent())
+    return None
+
+  def read(self, pos, function):
+    "Read the parameter itself using the definition."
+    if self.literal:
+      if self.optional:
+        self.literalvalue = function.parsesquareliteral(pos)
+      else:
+        self.literalvalue = function.parseliteral(pos)
+      if self.literalvalue:
+        self.value = FormulaConstant(self.literalvalue)
+    elif self.optional:
+      self.value = function.parsesquare(pos)
+    else:
+      self.value = function.parseparameter(pos)
+
+  def __unicode__(self):
+    "Return a printable representation."
+    result = 'param ' + self.name
+    if self.value:
+      result += ': ' + unicode(self.value)
+    else:
+      result += ' (empty)'
+    return result
+
+class ParameterFunction(CommandBit):
+  "A function with a variable number of parameters defined in a template."
+  "The parameters are defined as a parameter definition."
+
+  def readparams(self, readtemplate, pos):
+    "Read the params according to the template."
+    self.params = dict()
+    for paramdef in self.paramdefs(readtemplate):
+      paramdef.read(pos, self)
+      self.params['$' + paramdef.name] = paramdef
+
+  def paramdefs(self, readtemplate):
+    "Read each param definition in the template"
+    pos = TextPosition(readtemplate)
+    while not pos.finished():
+      paramdef = ParameterDefinition().parse(pos)
+      if paramdef:
+        yield paramdef
+
+  def getparam(self, name):
+    "Get a parameter as parsed."
+    if not name in self.params:
+      return None
+    return self.params[name]
+
+  def getvalue(self, name):
+    "Get the value of a parameter."
+    return self.getparam(name).value
+
+  def getliteralvalue(self, name):
+    "Get the literal value of a parameter."
+    param = self.getparam(name)
+    if not param or not param.literalvalue:
+      return None
+    return param.literalvalue
+
+class HybridFunction(ParameterFunction):
+  """
+  A parameter function where the output is also defined using a template.
+  The template can use a number of functions; each function has an associated
+  tag.
+  Example: [f0{$1},span class="fbox"] defines a function f0 which corresponds
+  to a span of class fbox, yielding <span class="fbox">$1</span>.
+  Literal parameters can be used in tags definitions:
+    [f0{$1},span style="color: $p;"]
+  yields <span style="color: $p;">$1</span>, where $p is a literal parameter.
+  Sizes can be specified in hybridsizes, e.g. adding parameter sizes. By
+  default the resulting size is the max of all arguments. Sizes are used
+  to generate the right parameters.
+  A function followed by a single / is output as a self-closing XHTML tag:
+    [f0/,hr]
+  will generate <hr/>.
+  """
+
+  commandmap = FormulaConfig.hybridfunctions
+
+  def parsebit(self, pos):
+    "Parse a function with [] and {} parameters"
+    readtemplate = self.translated[0]
+    writetemplate = self.translated[1]
+    self.readparams(readtemplate, pos)
+    self.contents = self.writeparams(writetemplate)
+    self.computehybridsize()
+
+  def writeparams(self, writetemplate):
+    "Write all params according to the template"
+    return self.writepos(TextPosition(writetemplate))
+
+  def writepos(self, pos):
+    "Write all params as read in the parse position."
+    result = []
+    while not pos.finished():
+      if pos.checkskip('$'):
+        param = self.writeparam(pos)
+        if param:
+          result.append(param)
+      elif pos.checkskip('f'):
+        function = self.writefunction(pos)
+        if function:
+          function.type = None
+          result.append(function)
+      elif pos.checkskip('('):
+        result.append(self.writebracket('left', '('))
+      elif pos.checkskip(')'):
+        result.append(self.writebracket('right', ')'))
+      else:
+        result.append(FormulaConstant(pos.skipcurrent()))
+    return result
+
+  def writeparam(self, pos):
+    "Write a single param of the form $0, $x..."
+    name = '$' + pos.skipcurrent()
+    if not name in self.params:
+      Trace.error('Unknown parameter ' + name)
+      return None
+    if not self.params[name]:
+      return None
+    if pos.checkskip('.'):
+      self.params[name].value.type = pos.globalpha()
+    return self.params[name].value
+
+  def writefunction(self, pos):
+    "Write a single function f0,...,fn."
+    tag = self.readtag(pos)
+    if not tag:
+      return None
+    if pos.checkskip('/'):
+      # self-closing XHTML tag, such as <hr/>
+      return TaggedBit().selfcomplete(tag)
+    if not pos.checkskip('{'):
+      Trace.error('Function should be defined in {}')
+      return None
+    pos.pushending('}')
+    contents = self.writepos(pos)
+    pos.popending()
+    if len(contents) == 0:
+      return None
+    return TaggedBit().complete(contents, tag)
+
+  def readtag(self, pos):
+    "Get the tag corresponding to the given index. Does parameter substitution."
+    if not pos.current().isdigit():
+      Trace.error('Function should be f0,...,f9: f' + pos.current())
+      return None
+    index = int(pos.skipcurrent())
+    if 2 + index > len(self.translated):
+      Trace.error('Function f' + unicode(index) + ' is not defined')
+      return None
+    tag = self.translated[2 + index]
+    if not '$' in tag:
+      return tag
+    for variable in self.params:
+      if variable in tag:
+        param = self.params[variable]
+        if not param.literal:
+          Trace.error('Parameters in tag ' + tag + ' should be literal: {' + variable + '!}')
+          continue
+        if param.literalvalue:
+          value = param.literalvalue
+        else:
+          value = ''
+        tag = tag.replace(variable, value)
+    return tag
+
+  def writebracket(self, direction, character):
+    "Return a new bracket looking at the given direction."
+    return self.factory.create(BracketCommand).create(direction, character)
+  
+  def computehybridsize(self):
+    "Compute the size of the hybrid function."
+    if not self.command in HybridSize.configsizes:
+      self.computesize()
+      return
+    self.size = HybridSize().getsize(self)
+    # set the size in all elements at first level
+    for element in self.contents:
+      element.size = self.size
+
+class HybridSize(object):
+  "The size associated with a hybrid function."
+
+  configsizes = FormulaConfig.hybridsizes
+
+  def getsize(self, function):
+    "Read the size for a function and parse it."
+    sizestring = self.configsizes[function.command]
+    for name in function.params:
+      if name in sizestring:
+        size = function.params[name].value.computesize()
+        sizestring = sizestring.replace(name, unicode(size))
+    if '$' in sizestring:
+      Trace.error('Unconverted variable in hybrid size: ' + sizestring)
+      return 1
+    return eval(sizestring)
+
+
+FormulaCommand.types += [HybridFunction]
+
+
+
+
+
+
+
+
+
+class HeaderParser(Parser):
+  "Parses the LyX header"
+
+  def parse(self, reader):
+    "Parse header parameters into a dictionary, return the preamble."
+    contents = []
+    self.parseending(reader, lambda: self.parseline(reader, contents))
+    # skip last line
+    reader.nextline()
+    return contents
+
+  def parseline(self, reader, contents):
+    "Parse a single line as a parameter or as a start"
+    line = reader.currentline()
+    if line.startswith(HeaderConfig.parameters['branch']):
+      self.parsebranch(reader)
+      return
+    elif line.startswith(HeaderConfig.parameters['lstset']):
+      LstParser().parselstset(reader)
+      return
+    elif line.startswith(HeaderConfig.parameters['beginpreamble']):
+      contents.append(self.factory.createcontainer(reader))
+      return
+    # no match
+    self.parseparameter(reader)
+
+  def parsebranch(self, reader):
+    "Parse all branch definitions."
+    branch = reader.currentline().split()[1]
+    reader.nextline()
+    subparser = HeaderParser().complete(HeaderConfig.parameters['endbranch'])
+    subparser.parse(reader)
+    options = BranchOptions(branch)
+    for key in subparser.parameters:
+      options.set(key, subparser.parameters[key])
+    Options.branches[branch] = options
+
+  def complete(self, ending):
+    "Complete the parser with the given ending."
+    self.ending = ending
+    return self
+
+class PreambleParser(Parser):
+  "A parser for the LyX preamble."
+
+  preamble = []
+
+  def parse(self, reader):
+    "Parse the full preamble with all statements."
+    self.ending = HeaderConfig.parameters['endpreamble']
+    self.parseending(reader, lambda: self.parsepreambleline(reader))
+    return []
+
+  def parsepreambleline(self, reader):
+    "Parse a single preamble line."
+    PreambleParser.preamble.append(reader.currentline())
+    reader.nextline()
+
+class LstParser(object):
+  "Parse global and local lstparams."
+
+  globalparams = dict()
+
+  def parselstset(self, reader):
+    "Parse a declaration of lstparams in lstset."
+    paramtext = self.extractlstset(reader)
+    if not '{' in paramtext:
+      Trace.error('Missing opening bracket in lstset: ' + paramtext)
+      return
+    lefttext = paramtext.split('{')[1]
+    croppedtext = lefttext[:-1]
+    LstParser.globalparams = self.parselstparams(croppedtext)
+
+  def extractlstset(self, reader):
+    "Extract the global lstset parameters."
+    paramtext = ''
+    while not reader.finished():
+      paramtext += reader.currentline()
+      reader.nextline()
+      if paramtext.endswith('}'):
+        return paramtext
+    Trace.error('Could not find end of \\lstset settings; aborting')
+
+  def parsecontainer(self, container):
+    "Parse some lstparams from elyxer.a container."
+    container.lstparams = LstParser.globalparams.copy()
+    paramlist = container.getparameterlist('lstparams')
+    container.lstparams.update(self.parselstparams(paramlist))
+
+  def parselstparams(self, paramlist):
+    "Process a number of lstparams from elyxer.a list."
+    paramdict = dict()
+    for param in paramlist:
+      if not '=' in param:
+        if len(param.strip()) > 0:
+          Trace.error('Invalid listing parameter ' + param)
+      else:
+        key, value = param.split('=', 1)
+        paramdict[key] = value
+    return paramdict
+
+
+
+
+class MacroDefinition(CommandBit):
+  "A function that defines a new command (a macro)."
+
+  macros = dict()
+
+  def parsebit(self, pos):
+    "Parse the function that defines the macro."
+    self.output = EmptyOutput()
+    self.parameternumber = 0
+    self.defaults = []
+    self.factory.defining = True
+    self.parseparameters(pos)
+    self.factory.defining = False
+    Trace.debug('New command ' + self.newcommand + ' (' + \
+        unicode(self.parameternumber) + ' parameters)')
+    self.macros[self.newcommand] = self
+
+  def parseparameters(self, pos):
+    "Parse all optional parameters (number of parameters, default values)"
+    "and the mandatory definition."
+    self.newcommand = self.parsenewcommand(pos)
+    # parse number of parameters
+    literal = self.parsesquareliteral(pos)
+    if literal:
+      self.parameternumber = int(literal)
+    # parse all default values
+    bracket = self.parsesquare(pos)
+    while bracket:
+      self.defaults.append(bracket)
+      bracket = self.parsesquare(pos)
+    # parse mandatory definition
+    self.definition = self.parseparameter(pos)
+
+  def parsenewcommand(self, pos):
+    "Parse the name of the new command."
+    self.factory.clearskipped(pos)
+    if self.factory.detecttype(Bracket, pos):
+      return self.parseliteral(pos)
+    if self.factory.detecttype(FormulaCommand, pos):
+      return self.factory.create(FormulaCommand).extractcommand(pos)
+    Trace.error('Unknown formula bit in defining function at ' + pos.identifier())
+    return 'unknown'
+
+  def instantiate(self):
+    "Return an instance of the macro."
+    return self.definition.clone()
+
+class MacroParameter(FormulaBit):
+  "A parameter from elyxer.a macro."
+
+  def detect(self, pos):
+    "Find a macro parameter: #n."
+    return pos.checkfor('#')
+
+  def parsebit(self, pos):
+    "Parse the parameter: #n."
+    if not pos.checkskip('#'):
+      Trace.error('Missing parameter start #.')
+      return
+    self.number = int(pos.skipcurrent())
+    self.original = '#' + unicode(self.number)
+    self.contents = [TaggedBit().constant('#' + unicode(self.number), 'span class="unknown"')]
+
+class MacroFunction(CommandBit):
+  "A function that was defined using a macro."
+
+  commandmap = MacroDefinition.macros
+
+  def parsebit(self, pos):
+    "Parse a number of input parameters."
+    self.output = FilteredOutput()
+    self.values = []
+    macro = self.translated
+    self.parseparameters(pos, macro)
+    self.completemacro(macro)
+
+  def parseparameters(self, pos, macro):
+    "Parse as many parameters as are needed."
+    self.parseoptional(pos, list(macro.defaults))
+    self.parsemandatory(pos, macro.parameternumber - len(macro.defaults))
+    if len(self.values) < macro.parameternumber:
+      Trace.error('Missing parameters in macro ' + unicode(self))
+
+  def parseoptional(self, pos, defaults):
+    "Parse optional parameters."
+    optional = []
+    while self.factory.detecttype(SquareBracket, pos):
+      optional.append(self.parsesquare(pos))
+      if len(optional) > len(defaults):
+        break
+    for value in optional:
+      default = defaults.pop()
+      if len(value.contents) > 0:
+        self.values.append(value)
+      else:
+        self.values.append(default)
+    self.values += defaults
+
+  def parsemandatory(self, pos, number):
+    "Parse a number of mandatory parameters."
+    for index in range(number):
+      parameter = self.parsemacroparameter(pos, number - index)
+      if not parameter:
+        return
+      self.values.append(parameter)
+
+  def parsemacroparameter(self, pos, remaining):
+    "Parse a macro parameter. Could be a bracket or a single letter."
+    "If there are just two values remaining and there is a running number,"
+    "parse as two separater numbers."
+    self.factory.clearskipped(pos)
+    if pos.finished():
+      return None
+    if self.factory.detecttype(FormulaNumber, pos):
+      return self.parsenumbers(pos, remaining)
+    return self.parseparameter(pos)
+
+  def parsenumbers(self, pos, remaining):
+    "Parse the remaining parameters as a running number."
+    "For example, 12 would be {1}{2}."
+    number = self.factory.parsetype(FormulaNumber, pos)
+    if not len(number.original) == remaining:
+      return number
+    for digit in number.original:
+      value = self.factory.create(FormulaNumber)
+      value.add(FormulaConstant(digit))
+      value.type = number
+      self.values.append(value)
+    return None
+
+  def completemacro(self, macro):
+    "Complete the macro with the parameters read."
+    self.contents = [macro.instantiate()]
+    replaced = [False] * len(self.values)
+    for parameter in self.searchall(MacroParameter):
+      index = parameter.number - 1
+      if index >= len(self.values):
+        Trace.error('Macro parameter index out of bounds: ' + unicode(index))
+        return
+      replaced[index] = True
+      parameter.contents = [self.values[index].clone()]
+    for index in range(len(self.values)):
+      if not replaced[index]:
+        self.addfilter(index, self.values[index])
+
+  def addfilter(self, index, value):
+    "Add a filter for the given parameter number and parameter value."
+    original = '#' + unicode(index + 1)
+    value = ''.join(self.values[0].gethtml())
+    self.output.addfilter(original, value)
+
+class FormulaMacro(Formula):
+  "A math macro defined in an inset."
+
+  def __init__(self):
+    self.parser = MacroParser()
+    self.output = EmptyOutput()
+
+  def __unicode__(self):
+    "Return a printable representation."
+    return 'Math macro'
+
+FormulaFactory.types += [ MacroParameter ]
+
+FormulaCommand.types += [
+    MacroFunction,
+    ]
+
+
+
+def math2html(formula):
+  "Convert some TeX math to HTML."
+  factory = FormulaFactory()
+  whole = factory.parseformula(formula)
+  FormulaProcessor().process(whole)
+  whole.process()
+  return ''.join(whole.gethtml())
+
+def main():
+  "Main function, called if invoked from elyxer.the command line"
+  args = sys.argv
+  Options().parseoptions(args)
+  if len(args) != 1:
+    Trace.error('Usage: math2html.py escaped_string')
+    exit()
+  result = math2html(args[0])
+  Trace.message(result)
+
+if __name__ == '__main__':
+  main()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/latex2mathml.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/latex2mathml.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/docutils/utils/math/latex2mathml.py	(revision 1126)
@@ -0,0 +1,571 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# :Id: $Id: latex2mathml.py 7865 2015-04-12 10:06:43Z milde $
+# :Copyright: © 2010 Günter Milde.
+#             Based on rst2mathml.py from the latex_math sandbox project
+#             © 2005 Jens Jørgen Mortensen
+# :License: Released under the terms of the `2-Clause BSD license`_, in short:
+# 
+#    Copying and distribution of this file, with or without modification,
+#    are permitted in any medium without royalty provided the copyright
+#    notice and this notice are preserved.
+#    This file is offered as-is, without any warranty.
+# 
+# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
+
+
+"""Convert LaTex math code into presentational MathML"""
+
+# Based on the `latex_math` sandbox project by Jens Jørgen Mortensen
+
+import docutils.utils.math.tex2unichar as tex2unichar
+
+#        TeX      spacing    combining
+over = {'acute':    u'\u00B4', # u'\u0301',
+        'bar':      u'\u00AF', # u'\u0304',
+        'breve':    u'\u02D8', # u'\u0306',
+        'check':    u'\u02C7', # u'\u030C',
+        'dot':      u'\u02D9', # u'\u0307',
+        'ddot':     u'\u00A8', # u'\u0308',
+        'dddot':               u'\u20DB',
+        'grave':    u'`',      # u'\u0300',
+        'hat':      u'^',      # u'\u0302',
+        'mathring': u'\u02DA', # u'\u030A',
+        'overleftrightarrow':  u'\u20e1',
+        # 'overline':        # u'\u0305',
+        'tilde':    u'\u02DC', # u'\u0303',
+        'vec':               u'\u20D7'}
+
+Greek = { # Capital Greek letters: (upright in TeX style)
+    'Phi':u'\u03a6', 'Xi':u'\u039e', 'Sigma':u'\u03a3',
+    'Psi':u'\u03a8', 'Delta':u'\u0394', 'Theta':u'\u0398',
+    'Upsilon':u'\u03d2', 'Pi':u'\u03a0', 'Omega':u'\u03a9',
+    'Gamma':u'\u0393', 'Lambda':u'\u039b'}
+
+letters = tex2unichar.mathalpha
+
+special = tex2unichar.mathbin         # Binary symbols
+special.update(tex2unichar.mathrel)   # Relation symbols, arrow symbols
+special.update(tex2unichar.mathord)   # Miscellaneous symbols
+special.update(tex2unichar.mathop)    # Variable-sized symbols
+special.update(tex2unichar.mathopen)  # Braces
+special.update(tex2unichar.mathclose) # Braces
+special.update(tex2unichar.mathfence)
+
+sumintprod = ''.join([special[symbol] for symbol in
+                      ['sum', 'int', 'oint', 'prod']])
+
+functions = ['arccos', 'arcsin', 'arctan', 'arg', 'cos',  'cosh',
+             'cot',    'coth',   'csc',    'deg', 'det',  'dim',
+             'exp',    'gcd',    'hom',    'inf', 'ker',  'lg',
+             'lim',    'liminf', 'limsup', 'ln',  'log',  'max',
+             'min',    'Pr',     'sec',    'sin', 'sinh', 'sup',
+             'tan',    'tanh',
+             'injlim',  'varinjlim', 'varlimsup',
+             'projlim', 'varliminf', 'varprojlim']
+
+
+mathbb = {
+          'A': u'\U0001D538',
+          'B': u'\U0001D539',
+          'C': u'\u2102',
+          'D': u'\U0001D53B',
+          'E': u'\U0001D53C',
+          'F': u'\U0001D53D',
+          'G': u'\U0001D53E',
+          'H': u'\u210D',
+          'I': u'\U0001D540',
+          'J': u'\U0001D541',
+          'K': u'\U0001D542',
+          'L': u'\U0001D543',
+          'M': u'\U0001D544',
+          'N': u'\u2115',
+          'O': u'\U0001D546',
+          'P': u'\u2119',
+          'Q': u'\u211A',
+          'R': u'\u211D',
+          'S': u'\U0001D54A',
+          'T': u'\U0001D54B',
+          'U': u'\U0001D54C',
+          'V': u'\U0001D54D',
+          'W': u'\U0001D54E',
+          'X': u'\U0001D54F',
+          'Y': u'\U0001D550',
+          'Z': u'\u2124',
+         }
+
+mathscr = {
+           'A': u'\U0001D49C',
+           'B': u'\u212C',     # bernoulli function
+           'C': u'\U0001D49E',
+           'D': u'\U0001D49F',
+           'E': u'\u2130',
+           'F': u'\u2131',
+           'G': u'\U0001D4A2',
+           'H': u'\u210B',     # hamiltonian
+           'I': u'\u2110',
+           'J': u'\U0001D4A5',
+           'K': u'\U0001D4A6',
+           'L': u'\u2112',     # lagrangian
+           'M': u'\u2133',     # physics m-matrix
+           'N': u'\U0001D4A9',
+           'O': u'\U0001D4AA',
+           'P': u'\U0001D4AB',
+           'Q': u'\U0001D4AC',
+           'R': u'\u211B',
+           'S': u'\U0001D4AE',
+           'T': u'\U0001D4AF',
+           'U': u'\U0001D4B0',
+           'V': u'\U0001D4B1',
+           'W': u'\U0001D4B2',
+           'X': u'\U0001D4B3',
+           'Y': u'\U0001D4B4',
+           'Z': u'\U0001D4B5',
+           'a': u'\U0001D4B6',
+           'b': u'\U0001D4B7',
+           'c': u'\U0001D4B8',
+           'd': u'\U0001D4B9',
+           'e': u'\u212F',
+           'f': u'\U0001D4BB',
+           'g': u'\u210A',
+           'h': u'\U0001D4BD',
+           'i': u'\U0001D4BE',
+           'j': u'\U0001D4BF',
+           'k': u'\U0001D4C0',
+           'l': u'\U0001D4C1',
+           'm': u'\U0001D4C2',
+           'n': u'\U0001D4C3',
+           'o': u'\u2134',     # order of
+           'p': u'\U0001D4C5',
+           'q': u'\U0001D4C6',
+           'r': u'\U0001D4C7',
+           's': u'\U0001D4C8',
+           't': u'\U0001D4C9',
+           'u': u'\U0001D4CA',
+           'v': u'\U0001D4CB',
+           'w': u'\U0001D4CC',
+           'x': u'\U0001D4CD',
+           'y': u'\U0001D4CE',
+           'z': u'\U0001D4CF',
+          }
+
+negatables = {'=': u'\u2260',
+              '\in': u'\u2209',
+              '\equiv': u'\u2262'}
+
+# LaTeX to MathML translation stuff:
+class math:
+    """Base class for MathML elements."""
+
+    nchildren = 1000000
+    """Required number of children"""
+
+    def __init__(self, children=None, inline=None):
+        """math([children]) -> MathML element
+
+        children can be one child or a list of children."""
+
+        self.children = []
+        if children is not None:
+            if type(children) is list:
+                for child in children:
+                    self.append(child)
+            else:
+                # Only one child:
+                self.append(children)
+
+        if inline is not None:
+            self.inline = inline
+
+    def __repr__(self):
+        if hasattr(self, 'children'):
+            return self.__class__.__name__ + '(%s)' % \
+                   ','.join([repr(child) for child in self.children])
+        else:
+            return self.__class__.__name__
+
+    def full(self):
+        """Room for more children?"""
+
+        return len(self.children) >= self.nchildren
+
+    def append(self, child):
+        """append(child) -> element
+
+        Appends child and returns self if self is not full or first
+        non-full parent."""
+
+        assert not self.full()
+        self.children.append(child)
+        child.parent = self
+        node = self
+        while node.full():
+            node = node.parent
+        return node
+
+    def delete_child(self):
+        """delete_child() -> child
+
+        Delete last child and return it."""
+
+        child = self.children[-1]
+        del self.children[-1]
+        return child
+
+    def close(self):
+        """close() -> parent
+
+        Close element and return first non-full element."""
+
+        parent = self.parent
+        while parent.full():
+            parent = parent.parent
+        return parent
+
+    def xml(self):
+        """xml() -> xml-string"""
+
+        return self.xml_start() + self.xml_body() + self.xml_end()
+
+    def xml_start(self):
+        if not hasattr(self, 'inline'):
+            return ['<%s>' % self.__class__.__name__]
+        xmlns = 'http://www.w3.org/1998/Math/MathML'
+        if self.inline:
+            return ['<math xmlns="%s">' % xmlns]
+        else:
+            return ['<math xmlns="%s" mode="display">' % xmlns]
+
+    def xml_end(self):
+        return ['</%s>' % self.__class__.__name__]
+
+    def xml_body(self):
+        xml = []
+        for child in self.children:
+            xml.extend(child.xml())
+        return xml
+
+class mrow(math):
+    def xml_start(self):
+        return ['\n<%s>' % self.__class__.__name__]
+
+class mtable(math):
+    def xml_start(self):
+        return ['\n<%s>' % self.__class__.__name__]
+
+class mtr(mrow): pass
+class mtd(mrow): pass
+
+class mx(math):
+    """Base class for mo, mi, and mn"""
+
+    nchildren = 0
+    def __init__(self, data):
+        self.data = data
+
+    def xml_body(self):
+        return [self.data]
+
+class mo(mx):
+    translation = {'<': '&lt;', '>': '&gt;'}
+    def xml_body(self):
+        return [self.translation.get(self.data, self.data)]
+
+class mi(mx): pass
+class mn(mx): pass
+
+class msub(math):
+    nchildren = 2
+
+class msup(math):
+    nchildren = 2
+
+class msqrt(math):
+    nchildren = 1
+
+class mroot(math):
+    nchildren = 2
+
+class mfrac(math):
+    nchildren = 2
+
+class msubsup(math):
+    nchildren = 3
+    def __init__(self, children=None, reversed=False):
+        self.reversed = reversed
+        math.__init__(self, children)
+
+    def xml(self):
+        if self.reversed:
+##            self.children[1:3] = self.children[2:0:-1]
+            self.children[1:3] = [self.children[2], self.children[1]]
+            self.reversed = False
+        return math.xml(self)
+
+class mfenced(math):
+    translation = {'\\{': '{', '\\langle': u'\u2329',
+                   '\\}': '}', '\\rangle': u'\u232A',
+                   '.': ''}
+    def __init__(self, par):
+        self.openpar = par
+        math.__init__(self)
+
+    def xml_start(self):
+        open = self.translation.get(self.openpar, self.openpar)
+        close = self.translation.get(self.closepar, self.closepar)
+        return ['<mfenced open="%s" close="%s">' % (open, close)]
+
+class mspace(math):
+    nchildren = 0
+
+class mstyle(math):
+    def __init__(self, children=None, nchildren=None, **kwargs):
+        if nchildren is not None:
+            self.nchildren = nchildren
+        math.__init__(self, children)
+        self.attrs = kwargs
+
+    def xml_start(self):
+        return ['<mstyle '] + ['%s="%s"' % item
+                               for item in self.attrs.items()] + ['>']
+
+class mover(math):
+    nchildren = 2
+    def __init__(self, children=None, reversed=False):
+        self.reversed = reversed
+        math.__init__(self, children)
+
+    def xml(self):
+        if self.reversed:
+            self.children.reverse()
+            self.reversed = False
+        return math.xml(self)
+
+class munder(math):
+    nchildren = 2
+
+class munderover(math):
+    nchildren = 3
+    def __init__(self, children=None):
+        math.__init__(self, children)
+
+class mtext(math):
+    nchildren = 0
+    def __init__(self, text):
+        self.text = text
+
+    def xml_body(self):
+        return [self.text]
+
+def parse_latex_math(string, inline=True):
+    """parse_latex_math(string [,inline]) -> MathML-tree
+
+    Returns a MathML-tree parsed from string.  inline=True is for
+    inline math and inline=False is for displayed math.
+
+    tree is the whole tree and node is the current element."""
+
+    # Normalize white-space:
+    string = ' '.join(string.split())
+
+    if inline:
+        node = mrow()
+        tree = math(node, inline=True)
+    else:
+        node = mtd()
+        tree = math(mtable(mtr(node)), inline=False)
+
+    while len(string) > 0:
+        n = len(string)
+        c = string[0]
+        skip = 1  # number of characters consumed
+        if n > 1:
+            c2 = string[1]
+        else:
+            c2 = ''
+##        print n, string, c, c2, node.__class__.__name__
+        if c == ' ':
+            pass
+        elif c == '\\':
+            if c2 in '{}':
+                node = node.append(mo(c2))
+                skip = 2
+            elif c2 == ' ':
+                node = node.append(mspace())
+                skip = 2
+            elif c2 == ',': # TODO: small space
+                node = node.append(mspace())
+                skip = 2
+            elif c2.isalpha():
+                # We have a LaTeX-name:
+                i = 2
+                while i < n and string[i].isalpha():
+                    i += 1
+                name = string[1:i]
+                node, skip = handle_keyword(name, node, string[i:])
+                skip += i
+            elif c2 == '\\':
+                # End of a row:
+                entry = mtd()
+                row = mtr(entry)
+                node.close().close().append(row)
+                node = entry
+                skip = 2
+            else:
+                raise SyntaxError(ur'Syntax error: "%s%s"' % (c, c2))
+        elif c.isalpha():
+            node = node.append(mi(c))
+        elif c.isdigit():
+            node = node.append(mn(c))
+        elif c in "+-*/=()[]|<>,.!?':;@":
+            node = node.append(mo(c))
+        elif c == '_':
+            child = node.delete_child()
+            if isinstance(child, msup):
+                sub = msubsup(child.children, reversed=True)
+            elif isinstance(child, mo) and child.data in sumintprod:
+                sub = munder(child)
+            else:
+                sub = msub(child)
+            node.append(sub)
+            node = sub
+        elif c == '^':
+            child = node.delete_child()
+            if isinstance(child, msub):
+                sup = msubsup(child.children)
+            elif isinstance(child, mo) and child.data in sumintprod:
+                sup = mover(child)
+            elif (isinstance(child, munder) and
+                  child.children[0].data in sumintprod):
+                sup = munderover(child.children)
+            else:
+                sup = msup(child)
+            node.append(sup)
+            node = sup
+        elif c == '{':
+            row = mrow()
+            node.append(row)
+            node = row
+        elif c == '}':
+            node = node.close()
+        elif c == '&':
+            entry = mtd()
+            node.close().append(entry)
+            node = entry
+        else:
+            raise SyntaxError(ur'Illegal character: "%s"' % c)
+        string = string[skip:]
+    return tree
+
+
+def handle_keyword(name, node, string):
+    skip = 0
+    if len(string) > 0 and string[0] == ' ':
+        string = string[1:]
+        skip = 1
+    if name == 'begin':
+        if not string.startswith('{matrix}'):
+            raise SyntaxError(u'Environment not supported! '
+                              u'Supported environment: "matrix".')
+        skip += 8
+        entry = mtd()
+        table = mtable(mtr(entry))
+        node.append(table)
+        node = entry
+    elif name == 'end':
+        if not string.startswith('{matrix}'):
+            raise SyntaxError(ur'Expected "\end{matrix}"!')
+        skip += 8
+        node = node.close().close().close()
+    elif name in ('text', 'mathrm'):
+        if string[0] != '{':
+            raise SyntaxError(ur'Expected "\text{...}"!')
+        i = string.find('}')
+        if i == -1:
+            raise SyntaxError(ur'Expected "\text{...}"!')
+        node = node.append(mtext(string[1:i]))
+        skip += i + 1
+    elif name == 'sqrt':
+        sqrt = msqrt()
+        node.append(sqrt)
+        node = sqrt
+    elif name == 'frac':
+        frac = mfrac()
+        node.append(frac)
+        node = frac
+    elif name == 'left':
+        for par in ['(', '[', '|', '\\{', '\\langle', '.']:
+            if string.startswith(par):
+                break
+        else:
+            raise SyntaxError(u'Missing left-brace!')
+        fenced = mfenced(par)
+        node.append(fenced)
+        row = mrow()
+        fenced.append(row)
+        node = row
+        skip += len(par)
+    elif name == 'right':
+        for par in [')', ']', '|', '\\}', '\\rangle', '.']:
+            if string.startswith(par):
+                break
+        else:
+            raise SyntaxError(u'Missing right-brace!')
+        node = node.close()
+        node.closepar = par
+        node = node.close()
+        skip += len(par)
+    elif name == 'not':
+        for operator in negatables:
+            if string.startswith(operator):
+                break
+        else:
+            raise SyntaxError(ur'Expected something to negate: "\not ..."!')
+        node = node.append(mo(negatables[operator]))
+        skip += len(operator)
+    elif name == 'mathbf':
+        style = mstyle(nchildren=1, fontweight='bold')
+        node.append(style)
+        node = style
+    elif name == 'mathbb':
+        if string[0] != '{' or not string[1].isupper() or string[2] != '}':
+            raise SyntaxError(ur'Expected something like "\mathbb{A}"!')
+        node = node.append(mi(mathbb[string[1]]))
+        skip += 3
+    elif name in ('mathscr', 'mathcal'):
+        if string[0] != '{' or string[2] != '}':
+            raise SyntaxError(ur'Expected something like "\mathscr{A}"!')
+        node = node.append(mi(mathscr[string[1]]))
+        skip += 3
+    elif name == 'colon': # "normal" colon, not binary operator
+        node = node.append(mo(':')) # TODO: add ``lspace="0pt"``
+    elif name in Greek:   # Greek capitals (upright in "TeX style")
+        node = node.append(mo(Greek[name]))
+        # TODO: "ISO style" sets them italic. Could we use a class argument
+        # to enable styling via CSS?
+    elif name in letters:
+        node = node.append(mi(letters[name]))
+    elif name in special:
+        node = node.append(mo(special[name]))
+    elif name in functions:
+        node = node.append(mo(name))
+    elif name in over:
+        ovr = mover(mo(over[name]), reversed=True)
+        node.append(ovr)
+        node = ovr
+    else:
+        raise SyntaxError(u'Unknown LaTeX command: ' + name)
+
+    return node, skip
+
+def tex2mathml(tex_math, inline=True):
+    """Return string with MathML code corresponding to `tex_math`. 
+    
+    `inline`=True is for inline math and `inline`=False for displayed math.
+    """
+    
+    mathml_tree = parse_latex_math(tex_math, inline=inline)
+    return ''.join(mathml_tree.xml())
+
+    
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/encutils/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/encutils/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/encutils/__init__.py	(revision 1126)
@@ -0,0 +1,690 @@
+# -*- coding: utf-8 -*-
+#!/usr/bin/env python
+"""encutils - encoding detection collection for Python
+
+:Version: 0.9.8
+:Author: Christof Hoeke, see http://cthedot.de/encutils/
+:Contributor: Robert Siemer, Fredrik Hedman <fredrik.hedman@me.com> ported to python3
+:Copyright: 2005-2012: Christof Hoeke
+:License: encutils has a dual-license, please choose whatever you prefer:
+
+    * encutils is published under the
+      `LGPL 3 or later <http://cthedot.de/encutils/license/>`__
+    * encutils is published under the
+      `Creative Commons License <http://creativecommons.org/licenses/by/3.0/>`__.
+
+    encutils is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    encutils is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public License
+    along with encutils.  If not, see <http://www.gnu.org/licenses/>.
+
+
+A collection of helper functions to detect encodings of text files (like HTML, XHTML, XML, CSS, etc.) retrieved via HTTP, file or string.
+
+:func:`getEncodingInfo` is probably the main function of interest which uses
+other supplied functions itself and gathers all information together and
+supplies an :class:`EncodingInfo` object.
+
+example::
+
+    >>> import encutils
+    >>> info = encutils.getEncodingInfo(url='http://cthedot.de/encutils/')
+
+    >>> str(info)
+    utf-8
+
+    >>> repr(info) # doctest:+ELLIPSIS
+    <encutils.EncodingInfo object encoding='utf-8' mismatch=False at...>
+
+    >>> info.logtext
+    HTTP media_type: text/html
+    HTTP encoding: utf-8
+    Encoding (probably): utf-8 (Mismatch: False)
+    <BLANKLINE>
+
+references
+    XML
+        RFC 3023 (http://www.ietf.org/rfc/rfc3023.txt)
+
+        easier explained in
+            - http://feedparser.org/docs/advanced.html
+            - http://www.xml.com/pub/a/2004/07/21/dive.html
+
+    HTML
+        http://www.w3.org/TR/REC-html40/charset.html#h-5.2.2
+
+TODO
+    - parse @charset of HTML elements?
+    - check for more texttypes if only text given
+"""
+__all__ = ['buildlog',
+           'encodingByMediaType',
+           'getHTTPInfo',
+           'getMetaInfo',
+           'detectXMLEncoding',
+           'getEncodingInfo',
+           'tryEncodings',
+           'EncodingInfo']
+__docformat__ = 'restructuredtext'
+__author__ = 'Christof Hoeke, Robert Siemer, Fredrik Hedman'
+__version__ = '$Id$'
+
+import HTMLParser
+import StringIO
+import cgi
+import httplib
+import re
+import sys
+import types
+import urllib
+
+VERSION = '0.9.8'
+PY2x = sys.version_info < (3,0)
+
+
+class _MetaHTMLParser(HTMLParser.HTMLParser):
+    """Parse given data for <meta http-equiv="content-type">."""
+    content_type = None
+
+    def handle_starttag(self, tag, attrs):
+        if tag == 'meta' and not self.content_type:
+            atts = dict([(a.lower(), v.lower()) for a, v in attrs])
+            if atts.get('http-equiv', u'').strip() == u'content-type':
+                self.content_type = atts.get('content')
+
+
+# application/xml, application/xml-dtd, application/xml-external-parsed-entity, or a subtype like application/rss+xml.
+_XML_APPLICATION_TYPE = 0
+
+# text/xml, text/xml-external-parsed-entity, or a subtype like text/AnythingAtAll+xml
+_XML_TEXT_TYPE = 1
+
+# text/html
+_HTML_TEXT_TYPE = 2
+
+# any other of text/* like text/plain, ...
+_TEXT_TYPE = 3
+
+# any text/* like which defaults to UTF-8 encoding, for now only text/css
+_TEXT_UTF8 = 5
+
+# types not fitting in above types
+_OTHER_TYPE = 4
+
+class EncodingInfo(object):
+    """
+    All encoding related information, returned by :func:`getEncodingInfo`.
+
+    Attributes filled:
+        - ``encoding``: The guessed encoding
+            Encoding is the explicit or implicit encoding or None and
+            always lowercase.
+
+        - from HTTP response
+            * ``http_encoding``
+            * ``http_media_type``
+
+        - from HTML <meta> element
+            * ``meta_encoding``
+            * ``meta_media_type``
+
+        - from XML declaration
+            * ``xml_encoding``
+
+        - ``mismatch``: True if mismatch between XML declaration and HTTP
+            header.
+            Mismatch is True if any mismatches between HTTP header, XML
+            declaration or textcontent (meta) are found. More detailed
+            mismatch reports are written to the optional log or ``logtext``
+
+            Mismatches are not necessarily errors as preferences are defined.
+            For details see the specifications.
+
+        - ``logtext``: if no log was given log reports are given here
+    """
+    def __init__(self):
+        """Initialize all possible properties to ``None``, see class
+        description
+        """
+        self.encoding = self.mismatch = self.logtext =\
+            self.http_encoding = self.http_media_type =\
+            self.meta_encoding = self.meta_media_type =\
+            self.xml_encoding =\
+                None
+
+    def __str__(self):
+        """Output the guessed encoding itself or the empty string."""
+        if self.encoding:
+            return self.encoding
+        else:
+            return u''
+
+    def __repr__(self):
+        return "<%s.%s object encoding=%r mismatch=%s at 0x%x>" % (
+                self.__class__.__module__, self.__class__.__name__,
+                self.encoding, self.mismatch, id(self))
+
+
+def buildlog(logname='encutils', level='INFO', stream=sys.stderr,
+            filename=None, filemode="w",
+            format='%(levelname)s\t%(message)s'):
+    """Helper to build a basic log
+
+    - if `filename` is given returns a log logging to `filename` with
+      mode `filemode`
+    - else uses a log streaming to `stream` which defaults to
+      `sys.stderr`
+    - `level` defines the level of the log
+    - `format` defines the formatter format of the log
+
+    :returns:
+        a log with the name `logname`
+    """
+    import logging
+
+    log = logging.getLogger(logname)
+
+    if filename:
+        hdlr = logging.FileHandler(filename, filemode)
+    else:
+        hdlr = logging.StreamHandler(stream)
+
+    formatter = logging.Formatter(format)
+    hdlr.setFormatter(formatter)
+
+    log.addHandler(hdlr)
+    log.setLevel(logging.__dict__.get(level, logging.INFO))
+
+    return log
+
+
+def _getTextTypeByMediaType(media_type, log=None):
+    """
+    :returns:
+        type as defined by constants in this class
+    """
+    if not media_type:
+        return _OTHER_TYPE
+    xml_application_types = [
+        ur'application/.*?\+xml',
+        u'application/xml',
+        u'application/xml-dtd',
+        u'application/xml-external-parsed-entity']
+    xml_text_types = [
+        ur'text\/.*?\+xml',
+        u'text/xml',
+        u'text/xml-external-parsed-entity']
+
+    media_type = media_type.strip().lower()
+
+    if media_type in xml_application_types or\
+            re.match(xml_application_types[0], media_type, re.I|re.S|re.X):
+        return _XML_APPLICATION_TYPE
+    elif media_type in xml_text_types or\
+            re.match(xml_text_types[0], media_type, re.I|re.S|re.X):
+        return _XML_TEXT_TYPE
+    elif media_type == u'text/html':
+        return _HTML_TEXT_TYPE
+    elif media_type == u'text/css':
+        return _TEXT_UTF8
+    elif media_type.startswith(u'text/'):
+        return _TEXT_TYPE
+    else:
+        return _OTHER_TYPE
+
+
+def _getTextType(text, log=None):
+    """Check if given text is XML (**naive test!**)
+    used if no content-type given
+    """
+    if text[:30].find(u'<?xml version=') != -1:
+        return _XML_APPLICATION_TYPE
+    else:
+        return _OTHER_TYPE
+
+
+def encodingByMediaType(media_type, log=None):
+    """
+    :param media_type:
+        a media type like "text/html"
+    :returns:
+        a default encoding for given `media_type`. For example
+        ``"utf-8"`` for ``media_type="application/xml"``.
+
+        If no default encoding is available returns ``None``.
+
+        Refers to RFC 3023 and HTTP MIME specification.
+    """
+    defaultencodings = {
+        _XML_APPLICATION_TYPE: u'utf-8',
+        _XML_TEXT_TYPE: u'ascii',
+        _HTML_TEXT_TYPE: u'iso-8859-1', # should be None?
+        _TEXT_TYPE: u'iso-8859-1', # should be None?
+        _TEXT_UTF8: u'utf-8',
+        _OTHER_TYPE: None}
+
+    texttype = _getTextTypeByMediaType(media_type)
+    encoding = defaultencodings.get(texttype, None)
+
+    if log:
+        if not encoding:
+            log.debug(u'"%s" Media-Type has no default encoding',
+                media_type)
+        else:
+            log.debug(
+                u'Default encoding for Media Type "%s": %s',
+                media_type, encoding)
+    return encoding
+
+
+def getHTTPInfo(response, log=None):
+    """
+    :param response:
+        a HTTP response object
+    :returns:
+        ``(media_type, encoding)`` information from the `response`
+        Content-Type HTTP header. (Case of headers is ignored.)
+        May be ``(None, None)`` e.g. if no Content-Type header is
+        available.
+    """
+    info = response.info()
+    if PY2x:
+        media_type, encoding = info.gettype(), info.getparam('charset')
+    else:
+        media_type, encoding = info.get_content_type(), info.get_content_charset()
+
+    if encoding:
+        encoding = encoding.lower()
+
+    if log:
+        log.info(u'HTTP media_type: %s', media_type)
+        log.info(u'HTTP encoding: %s', encoding)
+
+    return media_type, encoding
+
+
+def getMetaInfo(text, log=None):
+    """
+    :param text:
+        a byte string
+    :returns:
+        ``(media_type, encoding)`` information from (first)
+        X/HTML Content-Type ``<meta>`` element if available in `text`.
+
+        XHTML format::
+
+            <meta http-equiv="Content-Type"
+                  content="media_type;charset=encoding" />
+    """
+    p = _MetaHTMLParser()
+
+    try:
+        p.feed(text)
+    except HTMLParser.HTMLParseError, e:
+        pass
+
+    if p.content_type:
+        media_type, params = cgi.parse_header(p.content_type)
+        encoding = params.get('charset') # defaults to None
+        if encoding:
+            encoding = encoding.lower()
+        if log:
+            log.info(u'HTML META media_type: %s', media_type)
+            log.info(u'HTML META encoding: %s', encoding)
+    else:
+        media_type = encoding = None
+
+    return media_type, encoding
+
+
+def detectXMLEncoding(fp, log=None, includeDefault=True):
+    """Attempt to detect the character encoding of the xml file
+    given by a file object `fp`. `fp` must not be a codec wrapped file
+    object! `fp` may be a string or unicode string though.
+
+    Based on a recipe by Lars Tiede:
+    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/363841
+    which itself is based on Paul Prescotts recipe:
+    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52257
+
+    :returns:
+        - if detection of the BOM succeeds, the codec name of the
+          corresponding unicode charset is returned
+
+        - if BOM detection fails, the xml declaration is searched for
+          the encoding attribute and its value returned. the "<"
+          character has to be the very first in the file then (it's xml
+          standard after all).
+
+        - if BOM and xml declaration fail, utf-8 is returned according
+          to XML 1.0.
+    """
+    if PY2x and isinstance(fp, types.StringTypes):
+        fp = StringIO.StringIO(fp)
+    elif isinstance(fp, (str,)):
+        fp = StringIO.StringIO(fp)
+
+    ### detection using BOM
+
+    ## the BOMs we know, by their pattern
+    bomDict={ # bytepattern: name
+             (0x00, 0x00, 0xFE, 0xFF) : "utf_32_be",
+             (0xFF, 0xFE, 0x00, 0x00) : "utf_32_le",
+             (0xFE, 0xFF, None, None) : "utf_16_be",
+             (0xFF, 0xFE, None, None) : "utf_16_le",
+             (0xEF, 0xBB, 0xBF, None) : "utf-8",
+            }
+
+    ## go to beginning of file and get the first 4 bytes
+    oldFP = fp.tell()
+    fp.seek(0)
+    (byte1, byte2, byte3, byte4) = tuple(map(ord, fp.read(4)))
+
+    ## try bom detection using 4 bytes, 3 bytes, or 2 bytes
+    bomDetection = bomDict.get((byte1, byte2, byte3, byte4))
+    if not bomDetection:
+        bomDetection = bomDict.get((byte1, byte2, byte3, None))
+        if not bomDetection:
+            bomDetection = bomDict.get((byte1, byte2, None, None))
+
+    ## if BOM detected, we're done :-)
+    if bomDetection:
+        if log:
+            log.info(u'XML BOM encoding: %s' % bomDetection)
+        fp.seek(oldFP)
+        return bomDetection
+
+    ## still here? BOM detection failed.
+    ##  now that BOM detection has failed we assume one byte character
+    ##  encoding behaving ASCII
+
+    ### search xml declaration for encoding attribute
+
+    ## assume xml declaration fits into the first 2 KB (*cough*)
+    fp.seek(0)
+    buffer = fp.read(2048)
+
+    ## set up regular expression
+    xmlDeclPattern = r"""
+    ^<\?xml             # w/o BOM, xmldecl starts with <?xml at the first byte
+    .+?                 # some chars (version info), matched minimal
+    encoding=           # encoding attribute begins
+    ["']                # attribute start delimiter
+    (?P<encstr>         # what's matched in the brackets will be named encstr
+     [^"']+              # every character not delimiter (not overly exact!)
+    )                   # closes the brackets pair for the named group
+    ["']                # attribute end delimiter
+    .*?                 # some chars optionally (standalone decl or whitespace)
+    \?>                 # xmldecl end
+    """
+    xmlDeclRE = re.compile(xmlDeclPattern, re.VERBOSE)
+
+    ## search and extract encoding string
+    match = xmlDeclRE.search(buffer)
+    fp.seek(oldFP)
+    if match:
+        enc = match.group("encstr").lower()
+        if log:
+            log.info(u'XML encoding="%s"' % enc)
+        return enc
+    else:
+        if includeDefault:
+            if log:
+                log.info(u'XML encoding default utf-8')
+            return u'utf-8'
+        else:
+            return None
+
+
+def tryEncodings(text, log=None):
+    """If installed uses chardet http://chardet.feedparser.org/ to detect
+    encoding, else tries different encodings on `text` and returns the one
+    that does not raise an exception which is not very advanced or may
+    be totally wrong. The tried encoding are in order 'ascii', 'iso-8859-1',
+    'windows-1252' (which probably will never happen as 'iso-8859-1' can decode
+    these strings too) and lastly 'utf-8'.
+
+    :param text:
+        a byte string
+    :returns:
+        Working encoding or ``None`` if no encoding does work at all.
+
+        The returned encoding might nevertheless be not the one intended by
+        the author as it is only checked if the text might be encoded in
+        that encoding. Some texts might be working in "iso-8859-1" *and*
+        "windows-1252" *and* "ascii" *and* "utf-8" and ...
+    """
+    try:
+        import chardet
+        encoding = chardet.detect(text)["encoding"]
+
+    except ImportError:
+        msg = 'Using simplified encoding detection, you might want to install chardet.'
+        if log:
+            log.warn(msg)
+        else:
+            print msg
+
+        encodings = (
+            'ascii',
+            'iso-8859-1',
+            #'windows-1252', # test later
+            'utf-8'
+            )
+        encoding = None
+        for e in encodings:
+            try:
+                text.decode(e)
+            except UnicodeDecodeError:
+                pass
+            else:
+                if 'iso-8859-1' == e:
+                    try:
+                        if u'€' in text.decode('windows-1252'):
+                            return 'windows-1252'
+                    except UnicodeDecodeError:
+                        pass
+
+                return e
+
+    return encoding
+
+
+def getEncodingInfo(response=None, text=u'', log=None, url=None):
+    """Find all encoding related information in given `text`.
+
+    Information in headers of supplied HTTPResponse, possible XML
+    declaration and X/HTML ``<meta>`` elements are used.
+
+    :param response:
+        HTTP response object, e.g. via ``urllib.urlopen('url')``
+    :param text:
+        a byte string to guess encoding for. XML prolog with
+        encoding pseudo attribute or HTML meta element will be used to detect
+        the encoding
+    :param url:
+        When given fetches document at `url` and all needed information.
+        No `reponse` or `text` parameters are needed in this case.
+    :param log:
+        an optional logging logger to which messages may go, if
+        no log given all log messages are available from resulting
+        ``EncodingInfo``
+
+    :returns:
+        instance of :class:`EncodingInfo`.
+
+    How the resulting encoding is retrieved:
+
+    XML
+        RFC 3023 states if media type given in the Content-Type HTTP header is
+        application/xml, application/xml-dtd,
+        application/xml-external-parsed-entity, or any one of the subtypes of
+        application/xml such as application/atom+xml or application/rss+xml
+        etc then the character encoding is determined in this order:
+
+        1. the encoding given in the charset parameter of the Content-Type HTTP
+        header, or
+        2. the encoding given in the encoding attribute of the XML declaration
+        within the document, or
+        3. utf-8.
+
+        Mismatch possibilities:
+            - HTTP + XMLdecla
+            - HTTP + HTMLmeta
+
+            application/xhtml+xml ?
+                XMLdecla + HTMLmeta
+
+
+        If the media type given in the Content-Type HTTP header is text/xml,
+        text/xml-external-parsed-entity, or a subtype like text/Anything+xml,
+        the encoding attribute of the XML declaration is ignored completely
+        and the character encoding is determined in the order:
+        1. the encoding given in the charset parameter of the Content-Type HTTP
+        header, or
+        2. ascii.
+
+        No mismatch possible.
+
+
+        If no media type is given the XML encoding pseuso attribute is used
+        if present.
+
+        No mismatch possible.
+
+    HTML
+        For HTML served as text/html:
+            http://www.w3.org/TR/REC-html40/charset.html#h-5.2.2
+
+        1. An HTTP "charset" parameter in a "Content-Type" field.
+           (maybe defaults to ISO-8859-1, but should not assume this)
+        2. A META declaration with "http-equiv" set to "Content-Type" and a
+           value set for "charset".
+        3. The charset attribute set on an element that designates an external
+           resource. (NOT IMPLEMENTED HERE YET)
+
+        Mismatch possibilities:
+            - HTTP + HTMLmeta
+
+    TEXT
+        For most text/* types the encoding will be reported as iso-8859-1.
+        Exceptions are XML formats send as text/* mime type (see above) and
+        text/css which has a default encoding of UTF-8.
+    """
+    if url:
+        # may cause IOError which is raised
+        response = urllib.urlopen(url)
+
+    if text is None:
+        # read text from response only if not explicitly given
+        try:
+            text = response.read()
+        except IOError, e:
+            pass
+
+    if text is None:
+        # text must be a string (not None)
+        text = ''
+
+    encinfo = EncodingInfo()
+
+    logstream = StringIO.StringIO()
+    if not log:
+        log = buildlog(stream=logstream, format='%(message)s')
+
+    # HTTP
+    if response:
+        encinfo.http_media_type, encinfo.http_encoding = getHTTPInfo(
+            response, log)
+        texttype = _getTextTypeByMediaType(encinfo.http_media_type, log)
+    else:
+        # check if maybe XML or (TODO:) HTML
+        texttype = _getTextType(text, log)
+
+    # XML only served as application/xml ! #(also XHTML served as text/html)
+    if texttype == _XML_APPLICATION_TYPE:# or texttype == _XML_TEXT_TYPE:
+        try:
+            encinfo.xml_encoding = detectXMLEncoding(text, log)
+        except (AttributeError, ValueError), e:
+            encinfo.xml_encoding = None
+
+    # XML (also XHTML served as text/html)
+    if texttype == _HTML_TEXT_TYPE:
+        try:
+            encinfo.xml_encoding = detectXMLEncoding(text, log, includeDefault=False)
+        except (AttributeError, ValueError), e:
+            encinfo.xml_encoding = None
+
+    # HTML
+    if texttype == _HTML_TEXT_TYPE or texttype == _TEXT_TYPE:
+        encinfo.meta_media_type, encinfo.meta_encoding = getMetaInfo(
+            text, log)
+
+    # guess
+    # 1. HTTP charset?
+    encinfo.encoding = encinfo.http_encoding
+    encinfo.mismatch = False
+
+    # 2. media_type?
+    #   XML application/...
+    if texttype == _XML_APPLICATION_TYPE:
+        if not encinfo.encoding:
+            encinfo.encoding = encinfo.xml_encoding
+            # xml_encoding has default of utf-8
+
+    #   text/html
+    elif texttype == _HTML_TEXT_TYPE:
+        if not encinfo.encoding:
+            encinfo.encoding = encinfo.meta_encoding
+        if not encinfo.encoding:
+            encinfo.encoding = encodingByMediaType(encinfo.http_media_type)
+        if not encinfo.encoding:
+            encinfo.encoding = tryEncodings(text)
+
+    #   text/... + xml or text/*
+    elif texttype == _XML_TEXT_TYPE or texttype == _TEXT_TYPE:
+        if not encinfo.encoding:
+            encinfo.encoding = encodingByMediaType(encinfo.http_media_type)
+
+    elif texttype == _TEXT_UTF8:
+        if not encinfo.encoding:
+            encinfo.encoding = encodingByMediaType(encinfo.http_media_type)
+
+    # possible mismatches, checks if present at all and then if equal
+    # HTTP + XML
+    if encinfo.http_encoding and encinfo.xml_encoding and\
+       encinfo.http_encoding != encinfo.xml_encoding:
+        encinfo.mismatch = True
+        log.warn(u'"%s" (HTTP) != "%s" (XML) encoding mismatch' %
+                 (encinfo.http_encoding, encinfo.xml_encoding))
+    # HTTP + Meta
+    if encinfo.http_encoding and encinfo.meta_encoding and\
+         encinfo.http_encoding != encinfo.meta_encoding:
+        encinfo.mismatch = True
+        log.warning(u'"%s" (HTTP) != "%s" (HTML <meta>) encoding mismatch' %
+                 (encinfo.http_encoding, encinfo.meta_encoding))
+    # XML + Meta
+    if encinfo.xml_encoding and encinfo.meta_encoding and\
+         encinfo.xml_encoding != encinfo.meta_encoding:
+        encinfo.mismatch = True
+        log.warning(u'"%s" (XML) != "%s" (HTML <meta>) encoding mismatch' %
+                 (encinfo.xml_encoding, encinfo.meta_encoding))
+
+    log.info(u'Encoding (probably): %s (Mismatch: %s)',
+             encinfo.encoding, encinfo.mismatch)
+
+    encinfo.logtext = logstream.getvalue()
+    return encinfo
+
+
+if __name__ == '__main__':
+    import pydoc
+    pydoc.help(__name__)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/__init__.py	(revision 1126)
@@ -0,0 +1,1696 @@
+from __future__ import generators
+"""
+httplib2
+
+A caching http interface that supports ETags and gzip
+to conserve bandwidth.
+
+Requires Python 2.3 or later
+
+Changelog:
+2007-08-18, Rick: Modified so it's able to use a socks proxy if needed.
+
+"""
+
+__author__ = "Joe Gregorio (joe@bitworking.org)"
+__copyright__ = "Copyright 2006, Joe Gregorio"
+__contributors__ = ["Thomas Broyer (t.broyer@ltgt.net)",
+                    "James Antill",
+                    "Xavier Verges Farrero",
+                    "Jonathan Feinberg",
+                    "Blair Zajac",
+                    "Sam Ruby",
+                    "Louis Nyffenegger"]
+__license__ = "MIT"
+__version__ = "0.9.2"
+
+import re
+import sys
+import email
+import email.Utils
+import email.Message
+import email.FeedParser
+import StringIO
+import gzip
+import zlib
+import httplib
+import urlparse
+import urllib
+import base64
+import os
+import copy
+import calendar
+import time
+import random
+import errno
+try:
+    from hashlib import sha1 as _sha, md5 as _md5
+except ImportError:
+    # prior to Python 2.5, these were separate modules
+    import sha
+    import md5
+    _sha = sha.new
+    _md5 = md5.new
+import hmac
+from gettext import gettext as _
+import socket
+
+try:
+    from httplib2 import socks
+except ImportError:
+    try:
+        import socks
+    except (ImportError, AttributeError):
+        socks = None
+
+# Build the appropriate socket wrapper for ssl
+try:
+    import ssl # python 2.6
+    ssl_SSLError = ssl.SSLError
+    def _ssl_wrap_socket(sock, key_file, cert_file,
+                         disable_validation, ca_certs):
+        if disable_validation:
+            cert_reqs = ssl.CERT_NONE
+        else:
+            cert_reqs = ssl.CERT_REQUIRED
+        # We should be specifying SSL version 3 or TLS v1, but the ssl module
+        # doesn't expose the necessary knobs. So we need to go with the default
+        # of SSLv23.
+        return ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file,
+                               cert_reqs=cert_reqs, ca_certs=ca_certs)
+except (AttributeError, ImportError):
+    ssl_SSLError = None
+    def _ssl_wrap_socket(sock, key_file, cert_file,
+                         disable_validation, ca_certs):
+        if not disable_validation:
+            raise CertificateValidationUnsupported(
+                    "SSL certificate validation is not supported without "
+                    "the ssl module installed. To avoid this error, install "
+                    "the ssl module, or explicity disable validation.")
+        ssl_sock = socket.ssl(sock, key_file, cert_file)
+        return httplib.FakeSocket(sock, ssl_sock)
+
+
+if sys.version_info >= (2,3):
+    from iri2uri import iri2uri
+else:
+    def iri2uri(uri):
+        return uri
+
+def has_timeout(timeout): # python 2.6
+    if hasattr(socket, '_GLOBAL_DEFAULT_TIMEOUT'):
+        return (timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT)
+    return (timeout is not None)
+
+__all__ = [
+    'Http', 'Response', 'ProxyInfo', 'HttpLib2Error', 'RedirectMissingLocation',
+    'RedirectLimit', 'FailedToDecompressContent',
+    'UnimplementedDigestAuthOptionError',
+    'UnimplementedHmacDigestAuthOptionError',
+    'debuglevel', 'ProxiesUnavailableError']
+
+
+# The httplib debug level, set to a non-zero value to get debug output
+debuglevel = 0
+
+# A request will be tried 'RETRIES' times if it fails at the socket/connection level.
+RETRIES = 2
+
+# Python 2.3 support
+if sys.version_info < (2,4):
+    def sorted(seq):
+        seq.sort()
+        return seq
+
+# Python 2.3 support
+def HTTPResponse__getheaders(self):
+    """Return list of (header, value) tuples."""
+    if self.msg is None:
+        raise httplib.ResponseNotReady()
+    return self.msg.items()
+
+if not hasattr(httplib.HTTPResponse, 'getheaders'):
+    httplib.HTTPResponse.getheaders = HTTPResponse__getheaders
+
+# All exceptions raised here derive from HttpLib2Error
+class HttpLib2Error(Exception): pass
+
+# Some exceptions can be caught and optionally
+# be turned back into responses.
+class HttpLib2ErrorWithResponse(HttpLib2Error):
+    def __init__(self, desc, response, content):
+        self.response = response
+        self.content = content
+        HttpLib2Error.__init__(self, desc)
+
+class RedirectMissingLocation(HttpLib2ErrorWithResponse): pass
+class RedirectLimit(HttpLib2ErrorWithResponse): pass
+class FailedToDecompressContent(HttpLib2ErrorWithResponse): pass
+class UnimplementedDigestAuthOptionError(HttpLib2ErrorWithResponse): pass
+class UnimplementedHmacDigestAuthOptionError(HttpLib2ErrorWithResponse): pass
+
+class MalformedHeader(HttpLib2Error): pass
+class RelativeURIError(HttpLib2Error): pass
+class ServerNotFoundError(HttpLib2Error): pass
+class ProxiesUnavailableError(HttpLib2Error): pass
+class CertificateValidationUnsupported(HttpLib2Error): pass
+class SSLHandshakeError(HttpLib2Error): pass
+class NotSupportedOnThisPlatform(HttpLib2Error): pass
+class CertificateHostnameMismatch(SSLHandshakeError):
+    def __init__(self, desc, host, cert):
+        HttpLib2Error.__init__(self, desc)
+        self.host = host
+        self.cert = cert
+
+# Open Items:
+# -----------
+# Proxy support
+
+# Are we removing the cached content too soon on PUT (only delete on 200 Maybe?)
+
+# Pluggable cache storage (supports storing the cache in
+#   flat files by default. We need a plug-in architecture
+#   that can support Berkeley DB and Squid)
+
+# == Known Issues ==
+# Does not handle a resource that uses conneg and Last-Modified but no ETag as a cache validator.
+# Does not handle Cache-Control: max-stale
+# Does not use Age: headers when calculating cache freshness.
+
+
+# The number of redirections to follow before giving up.
+# Note that only GET redirects are automatically followed.
+# Will also honor 301 requests by saving that info and never
+# requesting that URI again.
+DEFAULT_MAX_REDIRECTS = 5
+
+try:
+    # Users can optionally provide a module that tells us where the CA_CERTS
+    # are located.
+    import ca_certs_locater
+    CA_CERTS = ca_certs_locater.get()
+except ImportError:
+    # Default CA certificates file bundled with httplib2.
+    CA_CERTS = os.path.join(
+        os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt")
+
+# Which headers are hop-by-hop headers by default
+HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade']
+
+def _get_end2end_headers(response):
+    hopbyhop = list(HOP_BY_HOP)
+    hopbyhop.extend([x.strip() for x in response.get('connection', '').split(',')])
+    return [header for header in response.keys() if header not in hopbyhop]
+
+URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
+
+def parse_uri(uri):
+    """Parses a URI using the regex given in Appendix B of RFC 3986.
+
+        (scheme, authority, path, query, fragment) = parse_uri(uri)
+    """
+    groups = URI.match(uri).groups()
+    return (groups[1], groups[3], groups[4], groups[6], groups[8])
+
+def urlnorm(uri):
+    (scheme, authority, path, query, fragment) = parse_uri(uri)
+    if not scheme or not authority:
+        raise RelativeURIError("Only absolute URIs are allowed. uri = %s" % uri)
+    authority = authority.lower()
+    scheme = scheme.lower()
+    if not path:
+        path = "/"
+    # Could do syntax based normalization of the URI before
+    # computing the digest. See Section 6.2.2 of Std 66.
+    request_uri = query and "?".join([path, query]) or path
+    scheme = scheme.lower()
+    defrag_uri = scheme + "://" + authority + request_uri
+    return scheme, authority, request_uri, defrag_uri
+
+
+# Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/)
+re_url_scheme    = re.compile(r'^\w+://')
+re_slash         = re.compile(r'[?/:|]+')
+
+def safename(filename):
+    """Return a filename suitable for the cache.
+
+    Strips dangerous and common characters to create a filename we
+    can use to store the cache in.
+    """
+
+    try:
+        if re_url_scheme.match(filename):
+            if isinstance(filename,str):
+                filename = filename.decode('utf-8')
+                filename = filename.encode('idna')
+            else:
+                filename = filename.encode('idna')
+    except UnicodeError:
+        pass
+    if isinstance(filename,unicode):
+        filename=filename.encode('utf-8')
+    filemd5 = _md5(filename).hexdigest()
+    filename = re_url_scheme.sub("", filename)
+    filename = re_slash.sub(",", filename)
+
+    # limit length of filename
+    if len(filename)>200:
+        filename=filename[:200]
+    return ",".join((filename, filemd5))
+
+NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
+def _normalize_headers(headers):
+    return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip())  for (key, value) in headers.iteritems()])
+
+def _parse_cache_control(headers):
+    retval = {}
+    if headers.has_key('cache-control'):
+        parts =  headers['cache-control'].split(',')
+        parts_with_args = [tuple([x.strip().lower() for x in part.split("=", 1)]) for part in parts if -1 != part.find("=")]
+        parts_wo_args = [(name.strip().lower(), 1) for name in parts if -1 == name.find("=")]
+        retval = dict(parts_with_args + parts_wo_args)
+    return retval
+
+# Whether to use a strict mode to parse WWW-Authenticate headers
+# Might lead to bad results in case of ill-formed header value,
+# so disabled by default, falling back to relaxed parsing.
+# Set to true to turn on, usefull for testing servers.
+USE_WWW_AUTH_STRICT_PARSING = 0
+
+# In regex below:
+#    [^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+             matches a "token" as defined by HTTP
+#    "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?"    matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space
+# Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both:
+#    \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x08\x0A-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?
+WWW_AUTH_STRICT = re.compile(r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$")
+WWW_AUTH_RELAXED = re.compile(r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(?<!\")[^ \t\r\n,]+(?!\"))\"?)(.*)$")
+UNQUOTE_PAIRS = re.compile(r'\\(.)')
+def _parse_www_authenticate(headers, headername='www-authenticate'):
+    """Returns a dictionary of dictionaries, one dict
+    per auth_scheme."""
+    retval = {}
+    if headers.has_key(headername):
+        try:
+
+            authenticate = headers[headername].strip()
+            www_auth = USE_WWW_AUTH_STRICT_PARSING and WWW_AUTH_STRICT or WWW_AUTH_RELAXED
+            while authenticate:
+                # Break off the scheme at the beginning of the line
+                if headername == 'authentication-info':
+                    (auth_scheme, the_rest) = ('digest', authenticate)
+                else:
+                    (auth_scheme, the_rest) = authenticate.split(" ", 1)
+                # Now loop over all the key value pairs that come after the scheme,
+                # being careful not to roll into the next scheme
+                match = www_auth.search(the_rest)
+                auth_params = {}
+                while match:
+                    if match and len(match.groups()) == 3:
+                        (key, value, the_rest) = match.groups()
+                        auth_params[key.lower()] = UNQUOTE_PAIRS.sub(r'\1', value) # '\\'.join([x.replace('\\', '') for x in value.split('\\\\')])
+                    match = www_auth.search(the_rest)
+                retval[auth_scheme.lower()] = auth_params
+                authenticate = the_rest.strip()
+
+        except ValueError:
+            raise MalformedHeader("WWW-Authenticate")
+    return retval
+
+
+def _entry_disposition(response_headers, request_headers):
+    """Determine freshness from the Date, Expires and Cache-Control headers.
+
+    We don't handle the following:
+
+    1. Cache-Control: max-stale
+    2. Age: headers are not used in the calculations.
+
+    Not that this algorithm is simpler than you might think
+    because we are operating as a private (non-shared) cache.
+    This lets us ignore 's-maxage'. We can also ignore
+    'proxy-invalidate' since we aren't a proxy.
+    We will never return a stale document as
+    fresh as a design decision, and thus the non-implementation
+    of 'max-stale'. This also lets us safely ignore 'must-revalidate'
+    since we operate as if every server has sent 'must-revalidate'.
+    Since we are private we get to ignore both 'public' and
+    'private' parameters. We also ignore 'no-transform' since
+    we don't do any transformations.
+    The 'no-store' parameter is handled at a higher level.
+    So the only Cache-Control parameters we look at are:
+
+    no-cache
+    only-if-cached
+    max-age
+    min-fresh
+    """
+
+    retval = "STALE"
+    cc = _parse_cache_control(request_headers)
+    cc_response = _parse_cache_control(response_headers)
+
+    if request_headers.has_key('pragma') and request_headers['pragma'].lower().find('no-cache') != -1:
+        retval = "TRANSPARENT"
+        if 'cache-control' not in request_headers:
+            request_headers['cache-control'] = 'no-cache'
+    elif cc.has_key('no-cache'):
+        retval = "TRANSPARENT"
+    elif cc_response.has_key('no-cache'):
+        retval = "STALE"
+    elif cc.has_key('only-if-cached'):
+        retval = "FRESH"
+    elif response_headers.has_key('date'):
+        date = calendar.timegm(email.Utils.parsedate_tz(response_headers['date']))
+        now = time.time()
+        current_age = max(0, now - date)
+        if cc_response.has_key('max-age'):
+            try:
+                freshness_lifetime = int(cc_response['max-age'])
+            except ValueError:
+                freshness_lifetime = 0
+        elif response_headers.has_key('expires'):
+            expires = email.Utils.parsedate_tz(response_headers['expires'])
+            if None == expires:
+                freshness_lifetime = 0
+            else:
+                freshness_lifetime = max(0, calendar.timegm(expires) - date)
+        else:
+            freshness_lifetime = 0
+        if cc.has_key('max-age'):
+            try:
+                freshness_lifetime = int(cc['max-age'])
+            except ValueError:
+                freshness_lifetime = 0
+        if cc.has_key('min-fresh'):
+            try:
+                min_fresh = int(cc['min-fresh'])
+            except ValueError:
+                min_fresh = 0
+            current_age += min_fresh
+        if freshness_lifetime > current_age:
+            retval = "FRESH"
+    return retval
+
+def _decompressContent(response, new_content):
+    content = new_content
+    try:
+        encoding = response.get('content-encoding', None)
+        if encoding in ['gzip', 'deflate']:
+            if encoding == 'gzip':
+                content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
+            if encoding == 'deflate':
+                content = zlib.decompress(content)
+            response['content-length'] = str(len(content))
+            # Record the historical presence of the encoding in a way the won't interfere.
+            response['-content-encoding'] = response['content-encoding']
+            del response['content-encoding']
+    except IOError:
+        content = ""
+        raise FailedToDecompressContent(_("Content purported to be compressed with %s but failed to decompress.") % response.get('content-encoding'), response, content)
+    return content
+
+def _updateCache(request_headers, response_headers, content, cache, cachekey):
+    if cachekey:
+        cc = _parse_cache_control(request_headers)
+        cc_response = _parse_cache_control(response_headers)
+        if cc.has_key('no-store') or cc_response.has_key('no-store'):
+            cache.delete(cachekey)
+        else:
+            info = email.Message.Message()
+            for key, value in response_headers.iteritems():
+                if key not in ['status','content-encoding','transfer-encoding']:
+                    info[key] = value
+
+            # Add annotations to the cache to indicate what headers
+            # are variant for this request.
+            vary = response_headers.get('vary', None)
+            if vary:
+                vary_headers = vary.lower().replace(' ', '').split(',')
+                for header in vary_headers:
+                    key = '-varied-%s' % header
+                    try:
+                        info[key] = request_headers[header]
+                    except KeyError:
+                        pass
+
+            status = response_headers.status
+            if status == 304:
+                status = 200
+
+            status_header = 'status: %d\r\n' % status
+
+            header_str = info.as_string()
+
+            header_str = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", header_str)
+            text = "".join([status_header, header_str, content])
+
+            cache.set(cachekey, text)
+
+def _cnonce():
+    dig = _md5("%s:%s" % (time.ctime(), ["0123456789"[random.randrange(0, 9)] for i in range(20)])).hexdigest()
+    return dig[:16]
+
+def _wsse_username_token(cnonce, iso_now, password):
+    return base64.b64encode(_sha("%s%s%s" % (cnonce, iso_now, password)).digest()).strip()
+
+
+# For credentials we need two things, first
+# a pool of credential to try (not necesarily tied to BAsic, Digest, etc.)
+# Then we also need a list of URIs that have already demanded authentication
+# That list is tricky since sub-URIs can take the same auth, or the
+# auth scheme may change as you descend the tree.
+# So we also need each Auth instance to be able to tell us
+# how close to the 'top' it is.
+
+class Authentication(object):
+    def __init__(self, credentials, host, request_uri, headers, response, content, http):
+        (scheme, authority, path, query, fragment) = parse_uri(request_uri)
+        self.path = path
+        self.host = host
+        self.credentials = credentials
+        self.http = http
+
+    def depth(self, request_uri):
+        (scheme, authority, path, query, fragment) = parse_uri(request_uri)
+        return request_uri[len(self.path):].count("/")
+
+    def inscope(self, host, request_uri):
+        # XXX Should we normalize the request_uri?
+        (scheme, authority, path, query, fragment) = parse_uri(request_uri)
+        return (host == self.host) and path.startswith(self.path)
+
+    def request(self, method, request_uri, headers, content):
+        """Modify the request headers to add the appropriate
+        Authorization header. Over-ride this in sub-classes."""
+        pass
+
+    def response(self, response, content):
+        """Gives us a chance to update with new nonces
+        or such returned from the last authorized response.
+        Over-rise this in sub-classes if necessary.
+
+        Return TRUE is the request is to be retried, for
+        example Digest may return stale=true.
+        """
+        return False
+
+
+
+class BasicAuthentication(Authentication):
+    def __init__(self, credentials, host, request_uri, headers, response, content, http):
+        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+
+    def request(self, method, request_uri, headers, content):
+        """Modify the request headers to add the appropriate
+        Authorization header."""
+        headers['authorization'] = 'Basic ' + base64.b64encode("%s:%s" % self.credentials).strip()
+
+
+class DigestAuthentication(Authentication):
+    """Only do qop='auth' and MD5, since that
+    is all Apache currently implements"""
+    def __init__(self, credentials, host, request_uri, headers, response, content, http):
+        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+        challenge = _parse_www_authenticate(response, 'www-authenticate')
+        self.challenge = challenge['digest']
+        qop = self.challenge.get('qop', 'auth')
+        self.challenge['qop'] = ('auth' in [x.strip() for x in qop.split()]) and 'auth' or None
+        if self.challenge['qop'] is None:
+            raise UnimplementedDigestAuthOptionError( _("Unsupported value for qop: %s." % qop))
+        self.challenge['algorithm'] = self.challenge.get('algorithm', 'MD5').upper()
+        if self.challenge['algorithm'] != 'MD5':
+            raise UnimplementedDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
+        self.A1 = "".join([self.credentials[0], ":", self.challenge['realm'], ":", self.credentials[1]])
+        self.challenge['nc'] = 1
+
+    def request(self, method, request_uri, headers, content, cnonce = None):
+        """Modify the request headers"""
+        H = lambda x: _md5(x).hexdigest()
+        KD = lambda s, d: H("%s:%s" % (s, d))
+        A2 = "".join([method, ":", request_uri])
+        self.challenge['cnonce'] = cnonce or _cnonce()
+        request_digest  = '"%s"' % KD(H(self.A1), "%s:%s:%s:%s:%s" % (
+                self.challenge['nonce'],
+                '%08x' % self.challenge['nc'],
+                self.challenge['cnonce'],
+                self.challenge['qop'], H(A2)))
+        headers['authorization'] = 'Digest username="%s", realm="%s", nonce="%s", uri="%s", algorithm=%s, response=%s, qop=%s, nc=%08x, cnonce="%s"' % (
+                self.credentials[0],
+                self.challenge['realm'],
+                self.challenge['nonce'],
+                request_uri,
+                self.challenge['algorithm'],
+                request_digest,
+                self.challenge['qop'],
+                self.challenge['nc'],
+                self.challenge['cnonce'])
+        if self.challenge.get('opaque'):
+            headers['authorization'] += ', opaque="%s"' % self.challenge['opaque']
+        self.challenge['nc'] += 1
+
+    def response(self, response, content):
+        if not response.has_key('authentication-info'):
+            challenge = _parse_www_authenticate(response, 'www-authenticate').get('digest', {})
+            if 'true' == challenge.get('stale'):
+                self.challenge['nonce'] = challenge['nonce']
+                self.challenge['nc'] = 1
+                return True
+        else:
+            updated_challenge = _parse_www_authenticate(response, 'authentication-info').get('digest', {})
+
+            if updated_challenge.has_key('nextnonce'):
+                self.challenge['nonce'] = updated_challenge['nextnonce']
+                self.challenge['nc'] = 1
+        return False
+
+
+class HmacDigestAuthentication(Authentication):
+    """Adapted from Robert Sayre's code and DigestAuthentication above."""
+    __author__ = "Thomas Broyer (t.broyer@ltgt.net)"
+
+    def __init__(self, credentials, host, request_uri, headers, response, content, http):
+        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+        challenge = _parse_www_authenticate(response, 'www-authenticate')
+        self.challenge = challenge['hmacdigest']
+        # TODO: self.challenge['domain']
+        self.challenge['reason'] = self.challenge.get('reason', 'unauthorized')
+        if self.challenge['reason'] not in ['unauthorized', 'integrity']:
+            self.challenge['reason'] = 'unauthorized'
+        self.challenge['salt'] = self.challenge.get('salt', '')
+        if not self.challenge.get('snonce'):
+            raise UnimplementedHmacDigestAuthOptionError( _("The challenge doesn't contain a server nonce, or this one is empty."))
+        self.challenge['algorithm'] = self.challenge.get('algorithm', 'HMAC-SHA-1')
+        if self.challenge['algorithm'] not in ['HMAC-SHA-1', 'HMAC-MD5']:
+            raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
+        self.challenge['pw-algorithm'] = self.challenge.get('pw-algorithm', 'SHA-1')
+        if self.challenge['pw-algorithm'] not in ['SHA-1', 'MD5']:
+            raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for pw-algorithm: %s." % self.challenge['pw-algorithm']))
+        if self.challenge['algorithm'] == 'HMAC-MD5':
+            self.hashmod = _md5
+        else:
+            self.hashmod = _sha
+        if self.challenge['pw-algorithm'] == 'MD5':
+            self.pwhashmod = _md5
+        else:
+            self.pwhashmod = _sha
+        self.key = "".join([self.credentials[0], ":",
+                            self.pwhashmod.new("".join([self.credentials[1], self.challenge['salt']])).hexdigest().lower(),
+                            ":", self.challenge['realm']])
+        self.key = self.pwhashmod.new(self.key).hexdigest().lower()
+
+    def request(self, method, request_uri, headers, content):
+        """Modify the request headers"""
+        keys = _get_end2end_headers(headers)
+        keylist = "".join(["%s " % k for k in keys])
+        headers_val = "".join([headers[k] for k in keys])
+        created = time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())
+        cnonce = _cnonce()
+        request_digest = "%s:%s:%s:%s:%s" % (method, request_uri, cnonce, self.challenge['snonce'], headers_val)
+        request_digest  = hmac.new(self.key, request_digest, self.hashmod).hexdigest().lower()
+        headers['authorization'] = 'HMACDigest username="%s", realm="%s", snonce="%s", cnonce="%s", uri="%s", created="%s", response="%s", headers="%s"' % (
+                self.credentials[0],
+                self.challenge['realm'],
+                self.challenge['snonce'],
+                cnonce,
+                request_uri,
+                created,
+                request_digest,
+                keylist)
+
+    def response(self, response, content):
+        challenge = _parse_www_authenticate(response, 'www-authenticate').get('hmacdigest', {})
+        if challenge.get('reason') in ['integrity', 'stale']:
+            return True
+        return False
+
+
+class WsseAuthentication(Authentication):
+    """This is thinly tested and should not be relied upon.
+    At this time there isn't any third party server to test against.
+    Blogger and TypePad implemented this algorithm at one point
+    but Blogger has since switched to Basic over HTTPS and
+    TypePad has implemented it wrong, by never issuing a 401
+    challenge but instead requiring your client to telepathically know that
+    their endpoint is expecting WSSE profile="UsernameToken"."""
+    def __init__(self, credentials, host, request_uri, headers, response, content, http):
+        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+
+    def request(self, method, request_uri, headers, content):
+        """Modify the request headers to add the appropriate
+        Authorization header."""
+        headers['authorization'] = 'WSSE profile="UsernameToken"'
+        iso_now = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
+        cnonce = _cnonce()
+        password_digest = _wsse_username_token(cnonce, iso_now, self.credentials[1])
+        headers['X-WSSE'] = 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"' % (
+                self.credentials[0],
+                password_digest,
+                cnonce,
+                iso_now)
+
+class GoogleLoginAuthentication(Authentication):
+    def __init__(self, credentials, host, request_uri, headers, response, content, http):
+        from urllib import urlencode
+        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+        challenge = _parse_www_authenticate(response, 'www-authenticate')
+        service = challenge['googlelogin'].get('service', 'xapi')
+        # Bloggger actually returns the service in the challenge
+        # For the rest we guess based on the URI
+        if service == 'xapi' and  request_uri.find("calendar") > 0:
+            service = "cl"
+        # No point in guessing Base or Spreadsheet
+        #elif request_uri.find("spreadsheets") > 0:
+        #    service = "wise"
+
+        auth = dict(Email=credentials[0], Passwd=credentials[1], service=service, source=headers['user-agent'])
+        resp, content = self.http.request("https://www.google.com/accounts/ClientLogin", method="POST", body=urlencode(auth), headers={'Content-Type': 'application/x-www-form-urlencoded'})
+        lines = content.split('\n')
+        d = dict([tuple(line.split("=", 1)) for line in lines if line])
+        if resp.status == 403:
+            self.Auth = ""
+        else:
+            self.Auth = d['Auth']
+
+    def request(self, method, request_uri, headers, content):
+        """Modify the request headers to add the appropriate
+        Authorization header."""
+        headers['authorization'] = 'GoogleLogin Auth=' + self.Auth
+
+
+AUTH_SCHEME_CLASSES = {
+    "basic": BasicAuthentication,
+    "wsse": WsseAuthentication,
+    "digest": DigestAuthentication,
+    "hmacdigest": HmacDigestAuthentication,
+    "googlelogin": GoogleLoginAuthentication
+}
+
+AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"]
+
+class FileCache(object):
+    """Uses a local directory as a store for cached files.
+    Not really safe to use if multiple threads or processes are going to
+    be running on the same cache.
+    """
+    def __init__(self, cache, safe=safename): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior
+        self.cache = cache
+        self.safe = safe
+        if not os.path.exists(cache):
+            os.makedirs(self.cache)
+
+    def get(self, key):
+        retval = None
+        cacheFullPath = os.path.join(self.cache, self.safe(key))
+        try:
+            f = file(cacheFullPath, "rb")
+            retval = f.read()
+            f.close()
+        except IOError:
+            pass
+        return retval
+
+    def set(self, key, value):
+        cacheFullPath = os.path.join(self.cache, self.safe(key))
+        f = file(cacheFullPath, "wb")
+        f.write(value)
+        f.close()
+
+    def delete(self, key):
+        cacheFullPath = os.path.join(self.cache, self.safe(key))
+        if os.path.exists(cacheFullPath):
+            os.remove(cacheFullPath)
+
+class Credentials(object):
+    def __init__(self):
+        self.credentials = []
+
+    def add(self, name, password, domain=""):
+        self.credentials.append((domain.lower(), name, password))
+
+    def clear(self):
+        self.credentials = []
+
+    def iter(self, domain):
+        for (cdomain, name, password) in self.credentials:
+            if cdomain == "" or domain == cdomain:
+                yield (name, password)
+
+class KeyCerts(Credentials):
+    """Identical to Credentials except that
+    name/password are mapped to key/cert."""
+    pass
+
+class AllHosts(object):
+    pass
+
+class ProxyInfo(object):
+    """Collect information required to use a proxy."""
+    bypass_hosts = ()
+
+    def __init__(self, proxy_type, proxy_host, proxy_port,
+                 proxy_rdns=True, proxy_user=None, proxy_pass=None):
+        """
+        Args:
+          proxy_type: The type of proxy server.  This must be set to one of
+          socks.PROXY_TYPE_XXX constants.  For example:
+
+            p = ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP,
+              proxy_host='localhost', proxy_port=8000)
+
+          proxy_host: The hostname or IP address of the proxy server.
+
+          proxy_port: The port that the proxy server is running on.
+
+          proxy_rdns: If True (default), DNS queries will not be performed
+          locally, and instead, handed to the proxy to resolve.  This is useful
+          if the network does not allow resolution of non-local names.  In
+          httplib2 0.9 and earlier, this defaulted to False.
+
+          proxy_user: The username used to authenticate with the proxy server.
+
+          proxy_pass: The password used to authenticate with the proxy server.
+        """
+        self.proxy_type = proxy_type
+        self.proxy_host = proxy_host
+        self.proxy_port = proxy_port
+        self.proxy_rdns = proxy_rdns
+        self.proxy_user = proxy_user
+        self.proxy_pass = proxy_pass
+
+    def astuple(self):
+        return (self.proxy_type, self.proxy_host, self.proxy_port,
+                self.proxy_rdns, self.proxy_user, self.proxy_pass)
+
+    def isgood(self):
+        return (self.proxy_host != None) and (self.proxy_port != None)
+
+    def applies_to(self, hostname):
+        return not self.bypass_host(hostname)
+
+    def bypass_host(self, hostname):
+        """Has this host been excluded from the proxy config"""
+        if self.bypass_hosts is AllHosts:
+            return True
+
+        bypass = False
+        for domain in self.bypass_hosts:
+            if hostname.endswith(domain):
+                bypass = True
+
+        return bypass
+
+
+def proxy_info_from_environment(method='http'):
+    """
+    Read proxy info from the environment variables.
+    """
+    if method not in ['http', 'https']:
+        return
+
+    env_var = method + '_proxy'
+    url = os.environ.get(env_var, os.environ.get(env_var.upper()))
+    if not url:
+        return
+    pi = proxy_info_from_url(url, method)
+
+    no_proxy = os.environ.get('no_proxy', os.environ.get('NO_PROXY', ''))
+    bypass_hosts = []
+    if no_proxy:
+        bypass_hosts = no_proxy.split(',')
+    # special case, no_proxy=* means all hosts bypassed
+    if no_proxy == '*':
+        bypass_hosts = AllHosts
+
+    pi.bypass_hosts = bypass_hosts
+    return pi
+
+def proxy_info_from_url(url, method='http'):
+    """
+    Construct a ProxyInfo from a URL (such as http_proxy env var)
+    """
+    url = urlparse.urlparse(url)
+    username = None
+    password = None
+    port = None
+    if '@' in url[1]:
+        ident, host_port = url[1].split('@', 1)
+        if ':' in ident:
+            username, password = ident.split(':', 1)
+        else:
+            password = ident
+    else:
+        host_port = url[1]
+    if ':' in host_port:
+        host, port = host_port.split(':', 1)
+    else:
+        host = host_port
+
+    if port:
+        port = int(port)
+    else:
+        port = dict(https=443, http=80)[method]
+
+    proxy_type = 3 # socks.PROXY_TYPE_HTTP
+    return ProxyInfo(
+        proxy_type = proxy_type,
+        proxy_host = host,
+        proxy_port = port,
+        proxy_user = username or None,
+        proxy_pass = password or None,
+    )
+
+
+class HTTPConnectionWithTimeout(httplib.HTTPConnection):
+    """
+    HTTPConnection subclass that supports timeouts
+
+    All timeouts are in seconds. If None is passed for timeout then
+    Python's default timeout for sockets will be used. See for example
+    the docs of socket.setdefaulttimeout():
+    http://docs.python.org/library/socket.html#socket.setdefaulttimeout
+    """
+
+    def __init__(self, host, port=None, strict=None, timeout=None, proxy_info=None):
+        httplib.HTTPConnection.__init__(self, host, port, strict)
+        self.timeout = timeout
+        self.proxy_info = proxy_info
+
+    def connect(self):
+        """Connect to the host and port specified in __init__."""
+        # Mostly verbatim from httplib.py.
+        if self.proxy_info and socks is None:
+            raise ProxiesUnavailableError(
+                'Proxy support missing but proxy use was requested!')
+        msg = "getaddrinfo returns an empty list"
+        if self.proxy_info and self.proxy_info.isgood():
+            use_proxy = True
+            proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple()
+
+            host = proxy_host
+            port = proxy_port
+        else:
+            use_proxy = False
+
+            host = self.host
+            port = self.port
+
+        for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
+            af, socktype, proto, canonname, sa = res
+            try:
+                if use_proxy:
+                    self.sock = socks.socksocket(af, socktype, proto)
+                    self.sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)
+                else:
+                    self.sock = socket.socket(af, socktype, proto)
+                    self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+                # Different from httplib: support timeouts.
+                if has_timeout(self.timeout):
+                    self.sock.settimeout(self.timeout)
+                    # End of difference from httplib.
+                if self.debuglevel > 0:
+                    print "connect: (%s, %s) ************" % (self.host, self.port)
+                    if use_proxy:
+                        print "proxy: %s ************" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
+
+                self.sock.connect((self.host, self.port) + sa[2:])
+            except socket.error, msg:
+                if self.debuglevel > 0:
+                    print "connect fail: (%s, %s)" % (self.host, self.port)
+                    if use_proxy:
+                        print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
+                if self.sock:
+                    self.sock.close()
+                self.sock = None
+                continue
+            break
+        if not self.sock:
+            raise socket.error, msg
+
+class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
+    """
+    This class allows communication via SSL.
+
+    All timeouts are in seconds. If None is passed for timeout then
+    Python's default timeout for sockets will be used. See for example
+    the docs of socket.setdefaulttimeout():
+    http://docs.python.org/library/socket.html#socket.setdefaulttimeout
+    """
+    def __init__(self, host, port=None, key_file=None, cert_file=None,
+                 strict=None, timeout=None, proxy_info=None,
+                 ca_certs=None, disable_ssl_certificate_validation=False):
+        httplib.HTTPSConnection.__init__(self, host, port=port,
+                                         key_file=key_file,
+                                         cert_file=cert_file, strict=strict)
+        self.timeout = timeout
+        self.proxy_info = proxy_info
+        if ca_certs is None:
+            ca_certs = CA_CERTS
+        self.ca_certs = ca_certs
+        self.disable_ssl_certificate_validation = \
+                disable_ssl_certificate_validation
+
+    # The following two methods were adapted from https_wrapper.py, released
+    # with the Google Appengine SDK at
+    # http://googleappengine.googlecode.com/svn-history/r136/trunk/python/google/appengine/tools/https_wrapper.py
+    # under the following license:
+    #
+    # Copyright 2007 Google Inc.
+    #
+    # Licensed under the Apache License, Version 2.0 (the "License");
+    # you may not use this file except in compliance with the License.
+    # You may obtain a copy of the License at
+    #
+    #     http://www.apache.org/licenses/LICENSE-2.0
+    #
+    # Unless required by applicable law or agreed to in writing, software
+    # distributed under the License is distributed on an "AS IS" BASIS,
+    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    # See the License for the specific language governing permissions and
+    # limitations under the License.
+    #
+
+    def _GetValidHostsForCert(self, cert):
+        """Returns a list of valid host globs for an SSL certificate.
+
+        Args:
+          cert: A dictionary representing an SSL certificate.
+        Returns:
+          list: A list of valid host globs.
+        """
+        if 'subjectAltName' in cert:
+            return [x[1] for x in cert['subjectAltName']
+                    if x[0].lower() == 'dns']
+        else:
+            return [x[0][1] for x in cert['subject']
+                    if x[0][0].lower() == 'commonname']
+
+    def _ValidateCertificateHostname(self, cert, hostname):
+        """Validates that a given hostname is valid for an SSL certificate.
+
+        Args:
+          cert: A dictionary representing an SSL certificate.
+          hostname: The hostname to test.
+        Returns:
+          bool: Whether or not the hostname is valid for this certificate.
+        """
+        hosts = self._GetValidHostsForCert(cert)
+        for host in hosts:
+            host_re = host.replace('.', '\.').replace('*', '[^.]*')
+            if re.search('^%s$' % (host_re,), hostname, re.I):
+                return True
+        return False
+
+    def connect(self):
+        "Connect to a host on a given (SSL) port."
+
+        msg = "getaddrinfo returns an empty list"
+        if self.proxy_info and self.proxy_info.isgood():
+            use_proxy = True
+            proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple()
+
+            host = proxy_host
+            port = proxy_port
+        else:
+            use_proxy = False
+
+            host = self.host
+            port = self.port
+
+        address_info = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
+        for family, socktype, proto, canonname, sockaddr in address_info:
+            try:
+                if use_proxy:
+                    sock = socks.socksocket(family, socktype, proto)
+
+                    sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)
+                else:
+                    sock = socket.socket(family, socktype, proto)
+                    sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+
+                if has_timeout(self.timeout):
+                    sock.settimeout(self.timeout)
+                sock.connect((self.host, self.port))
+                self.sock =_ssl_wrap_socket(
+                    sock, self.key_file, self.cert_file,
+                    self.disable_ssl_certificate_validation, self.ca_certs)
+                if self.debuglevel > 0:
+                    print "connect: (%s, %s)" % (self.host, self.port)
+                    if use_proxy:
+                        print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
+                if not self.disable_ssl_certificate_validation:
+                    cert = self.sock.getpeercert()
+                    hostname = self.host.split(':', 0)[0]
+                    if not self._ValidateCertificateHostname(cert, hostname):
+                        raise CertificateHostnameMismatch(
+                            'Server presented certificate that does not match '
+                            'host %s: %s' % (hostname, cert), hostname, cert)
+            except ssl_SSLError, e:
+                if sock:
+                    sock.close()
+                if self.sock:
+                    self.sock.close()
+                self.sock = None
+                # Unfortunately the ssl module doesn't seem to provide any way
+                # to get at more detailed error information, in particular
+                # whether the error is due to certificate validation or
+                # something else (such as SSL protocol mismatch).
+                if e.errno == ssl.SSL_ERROR_SSL:
+                    raise SSLHandshakeError(e)
+                else:
+                    raise
+            except (socket.timeout, socket.gaierror):
+                raise
+            except socket.error, msg:
+                if self.debuglevel > 0:
+                    print "connect fail: (%s, %s)" % (self.host, self.port)
+                    if use_proxy:
+                        print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
+                if self.sock:
+                    self.sock.close()
+                self.sock = None
+                continue
+            break
+        if not self.sock:
+            raise socket.error, msg
+
+SCHEME_TO_CONNECTION = {
+    'http': HTTPConnectionWithTimeout,
+    'https': HTTPSConnectionWithTimeout
+}
+
+# Use a different connection object for Google App Engine
+try:
+    try:
+        from google.appengine.api import apiproxy_stub_map
+        if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None:
+            raise ImportError  # Bail out; we're not actually running on App Engine.
+        from google.appengine.api.urlfetch import fetch
+        from google.appengine.api.urlfetch import InvalidURLError
+    except (ImportError, AttributeError):
+        from google3.apphosting.api import apiproxy_stub_map
+        if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None:
+            raise ImportError  # Bail out; we're not actually running on App Engine.
+        from google3.apphosting.api.urlfetch import fetch
+        from google3.apphosting.api.urlfetch import InvalidURLError
+
+    def _new_fixed_fetch(validate_certificate):
+        def fixed_fetch(url, payload=None, method="GET", headers={},
+                        allow_truncated=False, follow_redirects=True,
+                        deadline=None):
+            if deadline is None:
+                deadline = socket.getdefaulttimeout() or 5
+            return fetch(url, payload=payload, method=method, headers=headers,
+                         allow_truncated=allow_truncated,
+                         follow_redirects=follow_redirects, deadline=deadline,
+                         validate_certificate=validate_certificate)
+        return fixed_fetch
+
+    class AppEngineHttpConnection(httplib.HTTPConnection):
+        """Use httplib on App Engine, but compensate for its weirdness.
+
+        The parameters key_file, cert_file, proxy_info, ca_certs, and
+        disable_ssl_certificate_validation are all dropped on the ground.
+        """
+        def __init__(self, host, port=None, key_file=None, cert_file=None,
+                     strict=None, timeout=None, proxy_info=None, ca_certs=None,
+                     disable_ssl_certificate_validation=False):
+            httplib.HTTPConnection.__init__(self, host, port=port,
+                                            strict=strict, timeout=timeout)
+
+    class AppEngineHttpsConnection(httplib.HTTPSConnection):
+        """Same as AppEngineHttpConnection, but for HTTPS URIs."""
+        def __init__(self, host, port=None, key_file=None, cert_file=None,
+                     strict=None, timeout=None, proxy_info=None, ca_certs=None,
+                     disable_ssl_certificate_validation=False):
+            httplib.HTTPSConnection.__init__(self, host, port=port,
+                                             key_file=key_file,
+                                             cert_file=cert_file, strict=strict,
+                                             timeout=timeout)
+            self._fetch = _new_fixed_fetch(
+                    not disable_ssl_certificate_validation)
+
+    # Update the connection classes to use the Googel App Engine specific ones.
+    SCHEME_TO_CONNECTION = {
+        'http': AppEngineHttpConnection,
+        'https': AppEngineHttpsConnection
+    }
+except (ImportError, AttributeError):
+    pass
+
+
+class Http(object):
+    """An HTTP client that handles:
+
+    - all methods
+    - caching
+    - ETags
+    - compression,
+    - HTTPS
+    - Basic
+    - Digest
+    - WSSE
+
+    and more.
+    """
+    def __init__(self, cache=None, timeout=None,
+                 proxy_info=proxy_info_from_environment,
+                 ca_certs=None, disable_ssl_certificate_validation=False):
+        """If 'cache' is a string then it is used as a directory name for
+        a disk cache. Otherwise it must be an object that supports the
+        same interface as FileCache.
+
+        All timeouts are in seconds. If None is passed for timeout
+        then Python's default timeout for sockets will be used. See
+        for example the docs of socket.setdefaulttimeout():
+        http://docs.python.org/library/socket.html#socket.setdefaulttimeout
+
+        `proxy_info` may be:
+          - a callable that takes the http scheme ('http' or 'https') and
+            returns a ProxyInfo instance per request. By default, uses
+            proxy_nfo_from_environment.
+          - a ProxyInfo instance (static proxy config).
+          - None (proxy disabled).
+
+        ca_certs is the path of a file containing root CA certificates for SSL
+        server certificate validation.  By default, a CA cert file bundled with
+        httplib2 is used.
+
+        If disable_ssl_certificate_validation is true, SSL cert validation will
+        not be performed.
+        """
+        self.proxy_info = proxy_info
+        self.ca_certs = ca_certs
+        self.disable_ssl_certificate_validation = \
+                disable_ssl_certificate_validation
+
+        # Map domain name to an httplib connection
+        self.connections = {}
+        # The location of the cache, for now a directory
+        # where cached responses are held.
+        if cache and isinstance(cache, basestring):
+            self.cache = FileCache(cache)
+        else:
+            self.cache = cache
+
+        # Name/password
+        self.credentials = Credentials()
+
+        # Key/cert
+        self.certificates = KeyCerts()
+
+        # authorization objects
+        self.authorizations = []
+
+        # If set to False then no redirects are followed, even safe ones.
+        self.follow_redirects = True
+
+        # Which HTTP methods do we apply optimistic concurrency to, i.e.
+        # which methods get an "if-match:" etag header added to them.
+        self.optimistic_concurrency_methods = ["PUT", "PATCH"]
+
+        # If 'follow_redirects' is True, and this is set to True then
+        # all redirecs are followed, including unsafe ones.
+        self.follow_all_redirects = False
+
+        self.ignore_etag = False
+
+        self.force_exception_to_status_code = False
+
+        self.timeout = timeout
+
+        # Keep Authorization: headers on a redirect.
+        self.forward_authorization_headers = False
+
+    def __getstate__(self):
+        state_dict = copy.copy(self.__dict__)
+        # In case request is augmented by some foreign object such as
+        # credentials which handle auth
+        if 'request' in state_dict:
+            del state_dict['request']
+        if 'connections' in state_dict:
+            del state_dict['connections']
+        return state_dict
+
+    def __setstate__(self, state):
+        self.__dict__.update(state)
+        self.connections = {}
+
+    def _auth_from_challenge(self, host, request_uri, headers, response, content):
+        """A generator that creates Authorization objects
+           that can be applied to requests.
+        """
+        challenges = _parse_www_authenticate(response, 'www-authenticate')
+        for cred in self.credentials.iter(host):
+            for scheme in AUTH_SCHEME_ORDER:
+                if challenges.has_key(scheme):
+                    yield AUTH_SCHEME_CLASSES[scheme](cred, host, request_uri, headers, response, content, self)
+
+    def add_credentials(self, name, password, domain=""):
+        """Add a name and password that will be used
+        any time a request requires authentication."""
+        self.credentials.add(name, password, domain)
+
+    def add_certificate(self, key, cert, domain):
+        """Add a key and cert that will be used
+        any time a request requires authentication."""
+        self.certificates.add(key, cert, domain)
+
+    def clear_credentials(self):
+        """Remove all the names and passwords
+        that are used for authentication"""
+        self.credentials.clear()
+        self.authorizations = []
+
+    def _conn_request(self, conn, request_uri, method, body, headers):
+        i = 0
+        seen_bad_status_line = False
+        while i < RETRIES:
+            i += 1
+            try:
+                if hasattr(conn, 'sock') and conn.sock is None:
+                    conn.connect()
+                conn.request(method, request_uri, body, headers)
+            except socket.timeout:
+                raise
+            except socket.gaierror:
+                conn.close()
+                raise ServerNotFoundError("Unable to find the server at %s" % conn.host)
+            except ssl_SSLError:
+                conn.close()
+                raise
+            except socket.error, e:
+                err = 0
+                if hasattr(e, 'args'):
+                    err = getattr(e, 'args')[0]
+                else:
+                    err = e.errno
+                if err in (errno.ENETUNREACH, errno.EADDRNOTAVAIL) and i < RETRIES:
+                    continue  # retry on potentially transient socket errors
+                raise
+            except httplib.HTTPException:
+                # Just because the server closed the connection doesn't apparently mean
+                # that the server didn't send a response.
+                if hasattr(conn, 'sock') and conn.sock is None:
+                    if i < RETRIES-1:
+                        conn.close()
+                        conn.connect()
+                        continue
+                    else:
+                        conn.close()
+                        raise
+                if i < RETRIES-1:
+                    conn.close()
+                    conn.connect()
+                    continue
+            try:
+                response = conn.getresponse()
+            except httplib.BadStatusLine:
+                # If we get a BadStatusLine on the first try then that means
+                # the connection just went stale, so retry regardless of the
+                # number of RETRIES set.
+                if not seen_bad_status_line and i == 1:
+                    i = 0
+                    seen_bad_status_line = True
+                    conn.close()
+                    conn.connect()
+                    continue
+                else:
+                    conn.close()
+                    raise
+            except (socket.error, httplib.HTTPException):
+                if i < RETRIES-1:
+                    conn.close()
+                    conn.connect()
+                    continue
+                else:
+                    conn.close()
+                    raise
+            else:
+                content = ""
+                if method == "HEAD":
+                    conn.close()
+                else:
+                    content = response.read()
+                response = Response(response)
+                if method != "HEAD":
+                    content = _decompressContent(response, content)
+            break
+        return (response, content)
+
+
+    def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, redirections, cachekey):
+        """Do the actual request using the connection object
+        and also follow one level of redirects if necessary"""
+
+        auths = [(auth.depth(request_uri), auth) for auth in self.authorizations if auth.inscope(host, request_uri)]
+        auth = auths and sorted(auths)[0][1] or None
+        if auth:
+            auth.request(method, request_uri, headers, body)
+
+        (response, content) = self._conn_request(conn, request_uri, method, body, headers)
+
+        if auth:
+            if auth.response(response, body):
+                auth.request(method, request_uri, headers, body)
+                (response, content) = self._conn_request(conn, request_uri, method, body, headers )
+                response._stale_digest = 1
+
+        if response.status == 401:
+            for authorization in self._auth_from_challenge(host, request_uri, headers, response, content):
+                authorization.request(method, request_uri, headers, body)
+                (response, content) = self._conn_request(conn, request_uri, method, body, headers, )
+                if response.status != 401:
+                    self.authorizations.append(authorization)
+                    authorization.response(response, body)
+                    break
+
+        if (self.follow_all_redirects or (method in ["GET", "HEAD"]) or response.status == 303):
+            if self.follow_redirects and response.status in [300, 301, 302, 303, 307]:
+                # Pick out the location header and basically start from the beginning
+                # remembering first to strip the ETag header and decrement our 'depth'
+                if redirections:
+                    if not response.has_key('location') and response.status != 300:
+                        raise RedirectMissingLocation( _("Redirected but the response is missing a Location: header."), response, content)
+                    # Fix-up relative redirects (which violate an RFC 2616 MUST)
+                    if response.has_key('location'):
+                        location = response['location']
+                        (scheme, authority, path, query, fragment) = parse_uri(location)
+                        if authority == None:
+                            response['location'] = urlparse.urljoin(absolute_uri, location)
+                    if response.status == 301 and method in ["GET", "HEAD"]:
+                        response['-x-permanent-redirect-url'] = response['location']
+                        if not response.has_key('content-location'):
+                            response['content-location'] = absolute_uri
+                        _updateCache(headers, response, content, self.cache, cachekey)
+                    if headers.has_key('if-none-match'):
+                        del headers['if-none-match']
+                    if headers.has_key('if-modified-since'):
+                        del headers['if-modified-since']
+                    if 'authorization' in headers and not self.forward_authorization_headers:
+                        del headers['authorization']
+                    if response.has_key('location'):
+                        location = response['location']
+                        old_response = copy.deepcopy(response)
+                        if not old_response.has_key('content-location'):
+                            old_response['content-location'] = absolute_uri
+                        redirect_method = method
+                        if response.status in [302, 303]:
+                            redirect_method = "GET"
+                            body = None
+                        (response, content) = self.request(
+                            location, method=redirect_method,
+                            body=body, headers=headers,
+                            redirections=redirections - 1)
+                        response.previous = old_response
+                else:
+                    raise RedirectLimit("Redirected more times than rediection_limit allows.", response, content)
+            elif response.status in [200, 203] and method in ["GET", "HEAD"]:
+                # Don't cache 206's since we aren't going to handle byte range requests
+                if not response.has_key('content-location'):
+                    response['content-location'] = absolute_uri
+                _updateCache(headers, response, content, self.cache, cachekey)
+
+        return (response, content)
+
+    def _normalize_headers(self, headers):
+        return _normalize_headers(headers)
+
+# Need to catch and rebrand some exceptions
+# Then need to optionally turn all exceptions into status codes
+# including all socket.* and httplib.* exceptions.
+
+
+    def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAULT_MAX_REDIRECTS, connection_type=None):
+        """ Performs a single HTTP request.
+
+        The 'uri' is the URI of the HTTP resource and can begin with either
+        'http' or 'https'. The value of 'uri' must be an absolute URI.
+
+        The 'method' is the HTTP method to perform, such as GET, POST, DELETE,
+        etc. There is no restriction on the methods allowed.
+
+        The 'body' is the entity body to be sent with the request. It is a
+        string object.
+
+        Any extra headers that are to be sent with the request should be
+        provided in the 'headers' dictionary.
+
+        The maximum number of redirect to follow before raising an
+        exception is 'redirections. The default is 5.
+
+        The return value is a tuple of (response, content), the first
+        being and instance of the 'Response' class, the second being
+        a string that contains the response entity body.
+        """
+        try:
+            if headers is None:
+                headers = {}
+            else:
+                headers = self._normalize_headers(headers)
+
+            if not headers.has_key('user-agent'):
+                headers['user-agent'] = "Python-httplib2/%s (gzip)" % __version__
+
+            uri = iri2uri(uri)
+
+            (scheme, authority, request_uri, defrag_uri) = urlnorm(uri)
+            domain_port = authority.split(":")[0:2]
+            if len(domain_port) == 2 and domain_port[1] == '443' and scheme == 'http':
+                scheme = 'https'
+                authority = domain_port[0]
+
+            proxy_info = self._get_proxy_info(scheme, authority)
+
+            conn_key = scheme+":"+authority
+            if conn_key in self.connections:
+                conn = self.connections[conn_key]
+            else:
+                if not connection_type:
+                    connection_type = SCHEME_TO_CONNECTION[scheme]
+                certs = list(self.certificates.iter(authority))
+                if scheme == 'https':
+                    if certs:
+                        conn = self.connections[conn_key] = connection_type(
+                                authority, key_file=certs[0][0],
+                                cert_file=certs[0][1], timeout=self.timeout,
+                                proxy_info=proxy_info,
+                                ca_certs=self.ca_certs,
+                                disable_ssl_certificate_validation=
+                                        self.disable_ssl_certificate_validation)
+                    else:
+                        conn = self.connections[conn_key] = connection_type(
+                                authority, timeout=self.timeout,
+                                proxy_info=proxy_info,
+                                ca_certs=self.ca_certs,
+                                disable_ssl_certificate_validation=
+                                        self.disable_ssl_certificate_validation)
+                else:
+                    conn = self.connections[conn_key] = connection_type(
+                            authority, timeout=self.timeout,
+                            proxy_info=proxy_info)
+                conn.set_debuglevel(debuglevel)
+
+            if 'range' not in headers and 'accept-encoding' not in headers:
+                headers['accept-encoding'] = 'gzip, deflate'
+
+            info = email.Message.Message()
+            cached_value = None
+            if self.cache:
+                cachekey = defrag_uri.encode('utf-8')
+                cached_value = self.cache.get(cachekey)
+                if cached_value:
+                    # info = email.message_from_string(cached_value)
+                    #
+                    # Need to replace the line above with the kludge below
+                    # to fix the non-existent bug not fixed in this
+                    # bug report: http://mail.python.org/pipermail/python-bugs-list/2005-September/030289.html
+                    try:
+                        info, content = cached_value.split('\r\n\r\n', 1)
+                        feedparser = email.FeedParser.FeedParser()
+                        feedparser.feed(info)
+                        info = feedparser.close()
+                        feedparser._parse = None
+                    except (IndexError, ValueError):
+                        self.cache.delete(cachekey)
+                        cachekey = None
+                        cached_value = None
+            else:
+                cachekey = None
+
+            if method in self.optimistic_concurrency_methods and self.cache and info.has_key('etag') and not self.ignore_etag and 'if-match' not in headers:
+                # http://www.w3.org/1999/04/Editing/
+                headers['if-match'] = info['etag']
+
+            if method not in ["GET", "HEAD"] and self.cache and cachekey:
+                # RFC 2616 Section 13.10
+                self.cache.delete(cachekey)
+
+            # Check the vary header in the cache to see if this request
+            # matches what varies in the cache.
+            if method in ['GET', 'HEAD'] and 'vary' in info:
+                vary = info['vary']
+                vary_headers = vary.lower().replace(' ', '').split(',')
+                for header in vary_headers:
+                    key = '-varied-%s' % header
+                    value = info[key]
+                    if headers.get(header, None) != value:
+                        cached_value = None
+                        break
+
+            if cached_value and method in ["GET", "HEAD"] and self.cache and 'range' not in headers:
+                if info.has_key('-x-permanent-redirect-url'):
+                    # Should cached permanent redirects be counted in our redirection count? For now, yes.
+                    if redirections <= 0:
+                        raise RedirectLimit("Redirected more times than rediection_limit allows.", {}, "")
+                    (response, new_content) = self.request(
+                        info['-x-permanent-redirect-url'], method='GET',
+                        headers=headers, redirections=redirections - 1)
+                    response.previous = Response(info)
+                    response.previous.fromcache = True
+                else:
+                    # Determine our course of action:
+                    #   Is the cached entry fresh or stale?
+                    #   Has the client requested a non-cached response?
+                    #
+                    # There seems to be three possible answers:
+                    # 1. [FRESH] Return the cache entry w/o doing a GET
+                    # 2. [STALE] Do the GET (but add in cache validators if available)
+                    # 3. [TRANSPARENT] Do a GET w/o any cache validators (Cache-Control: no-cache) on the request
+                    entry_disposition = _entry_disposition(info, headers)
+
+                    if entry_disposition == "FRESH":
+                        if not cached_value:
+                            info['status'] = '504'
+                            content = ""
+                        response = Response(info)
+                        if cached_value:
+                            response.fromcache = True
+                        return (response, content)
+
+                    if entry_disposition == "STALE":
+                        if info.has_key('etag') and not self.ignore_etag and not 'if-none-match' in headers:
+                            headers['if-none-match'] = info['etag']
+                        if info.has_key('last-modified') and not 'last-modified' in headers:
+                            headers['if-modified-since'] = info['last-modified']
+                    elif entry_disposition == "TRANSPARENT":
+                        pass
+
+                    (response, new_content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
+
+                if response.status == 304 and method == "GET":
+                    # Rewrite the cache entry with the new end-to-end headers
+                    # Take all headers that are in response
+                    # and overwrite their values in info.
+                    # unless they are hop-by-hop, or are listed in the connection header.
+
+                    for key in _get_end2end_headers(response):
+                        info[key] = response[key]
+                    merged_response = Response(info)
+                    if hasattr(response, "_stale_digest"):
+                        merged_response._stale_digest = response._stale_digest
+                    _updateCache(headers, merged_response, content, self.cache, cachekey)
+                    response = merged_response
+                    response.status = 200
+                    response.fromcache = True
+
+                elif response.status == 200:
+                    content = new_content
+                else:
+                    self.cache.delete(cachekey)
+                    content = new_content
+            else:
+                cc = _parse_cache_control(headers)
+                if cc.has_key('only-if-cached'):
+                    info['status'] = '504'
+                    response = Response(info)
+                    content = ""
+                else:
+                    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
+        except Exception, e:
+            if self.force_exception_to_status_code:
+                if isinstance(e, HttpLib2ErrorWithResponse):
+                    response = e.response
+                    content = e.content
+                    response.status = 500
+                    response.reason = str(e)
+                elif isinstance(e, socket.timeout):
+                    content = "Request Timeout"
+                    response = Response({
+                        "content-type": "text/plain",
+                        "status": "408",
+                        "content-length": len(content)
+                    })
+                    response.reason = "Request Timeout"
+                else:
+                    content = str(e)
+                    response = Response({
+                        "content-type": "text/plain",
+                        "status": "400",
+                        "content-length": len(content)
+                    })
+                    response.reason = "Bad Request"
+            else:
+                raise
+
+
+        return (response, content)
+
+    def _get_proxy_info(self, scheme, authority):
+        """Return a ProxyInfo instance (or None) based on the scheme
+        and authority.
+        """
+        hostname, port = urllib.splitport(authority)
+        proxy_info = self.proxy_info
+        if callable(proxy_info):
+            proxy_info = proxy_info(scheme)
+
+        if (hasattr(proxy_info, 'applies_to')
+            and not proxy_info.applies_to(hostname)):
+            proxy_info = None
+        return proxy_info
+
+
+class Response(dict):
+    """An object more like email.Message than httplib.HTTPResponse."""
+
+    """Is this response from our local cache"""
+    fromcache = False
+
+    """HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1. """
+    version = 11
+
+    "Status code returned by server. "
+    status = 200
+
+    """Reason phrase returned by server."""
+    reason = "Ok"
+
+    previous = None
+
+    def __init__(self, info):
+        # info is either an email.Message or
+        # an httplib.HTTPResponse object.
+        if isinstance(info, httplib.HTTPResponse):
+            for key, value in info.getheaders():
+                self[key.lower()] = value
+            self.status = info.status
+            self['status'] = str(self.status)
+            self.reason = info.reason
+            self.version = info.version
+        elif isinstance(info, email.Message.Message):
+            for key, value in info.items():
+                self[key.lower()] = value
+            self.status = int(self['status'])
+        else:
+            for key, value in info.iteritems():
+                self[key.lower()] = value
+            self.status = int(self.get('status', self.status))
+            self.reason = self.get('reason', self.reason)
+
+
+    def __getattr__(self, name):
+        if name == 'dict':
+            return self
+        else:
+            raise AttributeError, name
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/socks.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/socks.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/socks.py	(revision 1126)
@@ -0,0 +1,438 @@
+"""SocksiPy - Python SOCKS module.
+Version 1.00
+
+Copyright 2006 Dan-Haim. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+3. Neither the name of Dan Haim nor the names of his contributors may be used
+   to endorse or promote products derived from this software without specific
+   prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE.
+
+
+This module provides a standard socket-like interface for Python
+for tunneling connections through SOCKS proxies.
+
+"""
+
+"""
+
+Minor modifications made by Christopher Gilbert (http://motomastyle.com/)
+for use in PyLoris (http://pyloris.sourceforge.net/)
+
+Minor modifications made by Mario Vilas (http://breakingcode.wordpress.com/)
+mainly to merge bug fixes found in Sourceforge
+
+"""
+
+import base64
+import socket
+import struct
+import sys
+
+if getattr(socket, 'socket', None) is None:
+    raise ImportError('socket.socket missing, proxy support unusable')
+
+PROXY_TYPE_SOCKS4 = 1
+PROXY_TYPE_SOCKS5 = 2
+PROXY_TYPE_HTTP = 3
+PROXY_TYPE_HTTP_NO_TUNNEL = 4
+
+_defaultproxy = None
+_orgsocket = socket.socket
+
+class ProxyError(Exception): pass
+class GeneralProxyError(ProxyError): pass
+class Socks5AuthError(ProxyError): pass
+class Socks5Error(ProxyError): pass
+class Socks4Error(ProxyError): pass
+class HTTPError(ProxyError): pass
+
+_generalerrors = ("success",
+    "invalid data",
+    "not connected",
+    "not available",
+    "bad proxy type",
+    "bad input")
+
+_socks5errors = ("succeeded",
+    "general SOCKS server failure",
+    "connection not allowed by ruleset",
+    "Network unreachable",
+    "Host unreachable",
+    "Connection refused",
+    "TTL expired",
+    "Command not supported",
+    "Address type not supported",
+    "Unknown error")
+
+_socks5autherrors = ("succeeded",
+    "authentication is required",
+    "all offered authentication methods were rejected",
+    "unknown username or invalid password",
+    "unknown error")
+
+_socks4errors = ("request granted",
+    "request rejected or failed",
+    "request rejected because SOCKS server cannot connect to identd on the client",
+    "request rejected because the client program and identd report different user-ids",
+    "unknown error")
+
+def setdefaultproxy(proxytype=None, addr=None, port=None, rdns=True, username=None, password=None):
+    """setdefaultproxy(proxytype, addr[, port[, rdns[, username[, password]]]])
+    Sets a default proxy which all further socksocket objects will use,
+    unless explicitly changed.
+    """
+    global _defaultproxy
+    _defaultproxy = (proxytype, addr, port, rdns, username, password)
+
+def wrapmodule(module):
+    """wrapmodule(module)
+    Attempts to replace a module's socket library with a SOCKS socket. Must set
+    a default proxy using setdefaultproxy(...) first.
+    This will only work on modules that import socket directly into the namespace;
+    most of the Python Standard Library falls into this category.
+    """
+    if _defaultproxy != None:
+        module.socket.socket = socksocket
+    else:
+        raise GeneralProxyError((4, "no proxy specified"))
+
+class socksocket(socket.socket):
+    """socksocket([family[, type[, proto]]]) -> socket object
+    Open a SOCKS enabled socket. The parameters are the same as
+    those of the standard socket init. In order for SOCKS to work,
+    you must specify family=AF_INET, type=SOCK_STREAM and proto=0.
+    """
+
+    def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None):
+        _orgsocket.__init__(self, family, type, proto, _sock)
+        if _defaultproxy != None:
+            self.__proxy = _defaultproxy
+        else:
+            self.__proxy = (None, None, None, None, None, None)
+        self.__proxysockname = None
+        self.__proxypeername = None
+        self.__httptunnel = True
+
+    def __recvall(self, count):
+        """__recvall(count) -> data
+        Receive EXACTLY the number of bytes requested from the socket.
+        Blocks until the required number of bytes have been received.
+        """
+        data = self.recv(count)
+        while len(data) < count:
+            d = self.recv(count-len(data))
+            if not d: raise GeneralProxyError((0, "connection closed unexpectedly"))
+            data = data + d
+        return data
+
+    def sendall(self, content, *args):
+        """ override socket.socket.sendall method to rewrite the header
+        for non-tunneling proxies if needed
+        """
+        if not self.__httptunnel:
+            content = self.__rewriteproxy(content)
+        return super(socksocket, self).sendall(content, *args)
+
+    def __rewriteproxy(self, header):
+        """ rewrite HTTP request headers to support non-tunneling proxies
+        (i.e. those which do not support the CONNECT method).
+        This only works for HTTP (not HTTPS) since HTTPS requires tunneling.
+        """
+        host, endpt = None, None
+        hdrs = header.split("\r\n")
+        for hdr in hdrs:
+            if hdr.lower().startswith("host:"):
+                host = hdr
+            elif hdr.lower().startswith("get") or hdr.lower().startswith("post"):
+                endpt = hdr
+        if host and endpt:
+            hdrs.remove(host)
+            hdrs.remove(endpt)
+            host = host.split(" ")[1]
+            endpt = endpt.split(" ")
+            if (self.__proxy[4] != None and self.__proxy[5] != None):
+                hdrs.insert(0, self.__getauthheader())
+            hdrs.insert(0, "Host: %s" % host)
+            hdrs.insert(0, "%s http://%s%s %s" % (endpt[0], host, endpt[1], endpt[2]))
+        return "\r\n".join(hdrs)
+
+    def __getauthheader(self):
+        auth = self.__proxy[4] + ":" + self.__proxy[5]
+        return "Proxy-Authorization: Basic " + base64.b64encode(auth)
+
+    def setproxy(self, proxytype=None, addr=None, port=None, rdns=True, username=None, password=None):
+        """setproxy(proxytype, addr[, port[, rdns[, username[, password]]]])
+        Sets the proxy to be used.
+        proxytype -    The type of the proxy to be used. Three types
+                are supported: PROXY_TYPE_SOCKS4 (including socks4a),
+                PROXY_TYPE_SOCKS5 and PROXY_TYPE_HTTP
+        addr -        The address of the server (IP or DNS).
+        port -        The port of the server. Defaults to 1080 for SOCKS
+                servers and 8080 for HTTP proxy servers.
+        rdns -        Should DNS queries be preformed on the remote side
+                (rather than the local side). The default is True.
+                Note: This has no effect with SOCKS4 servers.
+        username -    Username to authenticate with to the server.
+                The default is no authentication.
+        password -    Password to authenticate with to the server.
+                Only relevant when username is also provided.
+        """
+        self.__proxy = (proxytype, addr, port, rdns, username, password)
+
+    def __negotiatesocks5(self, destaddr, destport):
+        """__negotiatesocks5(self,destaddr,destport)
+        Negotiates a connection through a SOCKS5 server.
+        """
+        # First we'll send the authentication packages we support.
+        if (self.__proxy[4]!=None) and (self.__proxy[5]!=None):
+            # The username/password details were supplied to the
+            # setproxy method so we support the USERNAME/PASSWORD
+            # authentication (in addition to the standard none).
+            self.sendall(struct.pack('BBBB', 0x05, 0x02, 0x00, 0x02))
+        else:
+            # No username/password were entered, therefore we
+            # only support connections with no authentication.
+            self.sendall(struct.pack('BBB', 0x05, 0x01, 0x00))
+        # We'll receive the server's response to determine which
+        # method was selected
+        chosenauth = self.__recvall(2)
+        if chosenauth[0:1] != chr(0x05).encode():
+            self.close()
+            raise GeneralProxyError((1, _generalerrors[1]))
+        # Check the chosen authentication method
+        if chosenauth[1:2] == chr(0x00).encode():
+            # No authentication is required
+            pass
+        elif chosenauth[1:2] == chr(0x02).encode():
+            # Okay, we need to perform a basic username/password
+            # authentication.
+            self.sendall(chr(0x01).encode() + chr(len(self.__proxy[4])) + self.__proxy[4] + chr(len(self.__proxy[5])) + self.__proxy[5])
+            authstat = self.__recvall(2)
+            if authstat[0:1] != chr(0x01).encode():
+                # Bad response
+                self.close()
+                raise GeneralProxyError((1, _generalerrors[1]))
+            if authstat[1:2] != chr(0x00).encode():
+                # Authentication failed
+                self.close()
+                raise Socks5AuthError((3, _socks5autherrors[3]))
+            # Authentication succeeded
+        else:
+            # Reaching here is always bad
+            self.close()
+            if chosenauth[1] == chr(0xFF).encode():
+                raise Socks5AuthError((2, _socks5autherrors[2]))
+            else:
+                raise GeneralProxyError((1, _generalerrors[1]))
+        # Now we can request the actual connection
+        req = struct.pack('BBB', 0x05, 0x01, 0x00)
+        # If the given destination address is an IP address, we'll
+        # use the IPv4 address request even if remote resolving was specified.
+        try:
+            ipaddr = socket.inet_aton(destaddr)
+            req = req + chr(0x01).encode() + ipaddr
+        except socket.error:
+            # Well it's not an IP number,  so it's probably a DNS name.
+            if self.__proxy[3]:
+                # Resolve remotely
+                ipaddr = None
+                req = req + chr(0x03).encode() + chr(len(destaddr)).encode() + destaddr
+            else:
+                # Resolve locally
+                ipaddr = socket.inet_aton(socket.gethostbyname(destaddr))
+                req = req + chr(0x01).encode() + ipaddr
+        req = req + struct.pack(">H", destport)
+        self.sendall(req)
+        # Get the response
+        resp = self.__recvall(4)
+        if resp[0:1] != chr(0x05).encode():
+            self.close()
+            raise GeneralProxyError((1, _generalerrors[1]))
+        elif resp[1:2] != chr(0x00).encode():
+            # Connection failed
+            self.close()
+            if ord(resp[1:2])<=8:
+                raise Socks5Error((ord(resp[1:2]), _socks5errors[ord(resp[1:2])]))
+            else:
+                raise Socks5Error((9, _socks5errors[9]))
+        # Get the bound address/port
+        elif resp[3:4] == chr(0x01).encode():
+            boundaddr = self.__recvall(4)
+        elif resp[3:4] == chr(0x03).encode():
+            resp = resp + self.recv(1)
+            boundaddr = self.__recvall(ord(resp[4:5]))
+        else:
+            self.close()
+            raise GeneralProxyError((1,_generalerrors[1]))
+        boundport = struct.unpack(">H", self.__recvall(2))[0]
+        self.__proxysockname = (boundaddr, boundport)
+        if ipaddr != None:
+            self.__proxypeername = (socket.inet_ntoa(ipaddr), destport)
+        else:
+            self.__proxypeername = (destaddr, destport)
+
+    def getproxysockname(self):
+        """getsockname() -> address info
+        Returns the bound IP address and port number at the proxy.
+        """
+        return self.__proxysockname
+
+    def getproxypeername(self):
+        """getproxypeername() -> address info
+        Returns the IP and port number of the proxy.
+        """
+        return _orgsocket.getpeername(self)
+
+    def getpeername(self):
+        """getpeername() -> address info
+        Returns the IP address and port number of the destination
+        machine (note: getproxypeername returns the proxy)
+        """
+        return self.__proxypeername
+
+    def __negotiatesocks4(self,destaddr,destport):
+        """__negotiatesocks4(self,destaddr,destport)
+        Negotiates a connection through a SOCKS4 server.
+        """
+        # Check if the destination address provided is an IP address
+        rmtrslv = False
+        try:
+            ipaddr = socket.inet_aton(destaddr)
+        except socket.error:
+            # It's a DNS name. Check where it should be resolved.
+            if self.__proxy[3]:
+                ipaddr = struct.pack("BBBB", 0x00, 0x00, 0x00, 0x01)
+                rmtrslv = True
+            else:
+                ipaddr = socket.inet_aton(socket.gethostbyname(destaddr))
+        # Construct the request packet
+        req = struct.pack(">BBH", 0x04, 0x01, destport) + ipaddr
+        # The username parameter is considered userid for SOCKS4
+        if self.__proxy[4] != None:
+            req = req + self.__proxy[4]
+        req = req + chr(0x00).encode()
+        # DNS name if remote resolving is required
+        # NOTE: This is actually an extension to the SOCKS4 protocol
+        # called SOCKS4A and may not be supported in all cases.
+        if rmtrslv:
+            req = req + destaddr + chr(0x00).encode()
+        self.sendall(req)
+        # Get the response from the server
+        resp = self.__recvall(8)
+        if resp[0:1] != chr(0x00).encode():
+            # Bad data
+            self.close()
+            raise GeneralProxyError((1,_generalerrors[1]))
+        if resp[1:2] != chr(0x5A).encode():
+            # Server returned an error
+            self.close()
+            if ord(resp[1:2]) in (91, 92, 93):
+                self.close()
+                raise Socks4Error((ord(resp[1:2]), _socks4errors[ord(resp[1:2]) - 90]))
+            else:
+                raise Socks4Error((94, _socks4errors[4]))
+        # Get the bound address/port
+        self.__proxysockname = (socket.inet_ntoa(resp[4:]), struct.unpack(">H", resp[2:4])[0])
+        if rmtrslv != None:
+            self.__proxypeername = (socket.inet_ntoa(ipaddr), destport)
+        else:
+            self.__proxypeername = (destaddr, destport)
+
+    def __negotiatehttp(self, destaddr, destport):
+        """__negotiatehttp(self,destaddr,destport)
+        Negotiates a connection through an HTTP server.
+        """
+        # If we need to resolve locally, we do this now
+        if not self.__proxy[3]:
+            addr = socket.gethostbyname(destaddr)
+        else:
+            addr = destaddr
+        headers =  ["CONNECT ", addr, ":", str(destport), " HTTP/1.1\r\n"]
+        headers += ["Host: ", destaddr, "\r\n"]
+        if (self.__proxy[4] != None and self.__proxy[5] != None):
+                headers += [self.__getauthheader(), "\r\n"]
+        headers.append("\r\n")
+        self.sendall("".join(headers).encode())
+        # We read the response until we get the string "\r\n\r\n"
+        resp = self.recv(1)
+        while resp.find("\r\n\r\n".encode()) == -1:
+            resp = resp + self.recv(1)
+        # We just need the first line to check if the connection
+        # was successful
+        statusline = resp.splitlines()[0].split(" ".encode(), 2)
+        if statusline[0] not in ("HTTP/1.0".encode(), "HTTP/1.1".encode()):
+            self.close()
+            raise GeneralProxyError((1, _generalerrors[1]))
+        try:
+            statuscode = int(statusline[1])
+        except ValueError:
+            self.close()
+            raise GeneralProxyError((1, _generalerrors[1]))
+        if statuscode != 200:
+            self.close()
+            raise HTTPError((statuscode, statusline[2]))
+        self.__proxysockname = ("0.0.0.0", 0)
+        self.__proxypeername = (addr, destport)
+
+    def connect(self, destpair):
+        """connect(self, despair)
+        Connects to the specified destination through a proxy.
+        destpar - A tuple of the IP/DNS address and the port number.
+        (identical to socket's connect).
+        To select the proxy server use setproxy().
+        """
+        # Do a minimal input check first
+        if (not type(destpair) in (list,tuple)) or (len(destpair) < 2) or (not isinstance(destpair[0], basestring)) or (type(destpair[1]) != int):
+            raise GeneralProxyError((5, _generalerrors[5]))
+        if self.__proxy[0] == PROXY_TYPE_SOCKS5:
+            if self.__proxy[2] != None:
+                portnum = self.__proxy[2]
+            else:
+                portnum = 1080
+            _orgsocket.connect(self, (self.__proxy[1], portnum))
+            self.__negotiatesocks5(destpair[0], destpair[1])
+        elif self.__proxy[0] == PROXY_TYPE_SOCKS4:
+            if self.__proxy[2] != None:
+                portnum = self.__proxy[2]
+            else:
+                portnum = 1080
+            _orgsocket.connect(self,(self.__proxy[1], portnum))
+            self.__negotiatesocks4(destpair[0], destpair[1])
+        elif self.__proxy[0] == PROXY_TYPE_HTTP:
+            if self.__proxy[2] != None:
+                portnum = self.__proxy[2]
+            else:
+                portnum = 8080
+            _orgsocket.connect(self,(self.__proxy[1], portnum))
+            self.__negotiatehttp(destpair[0], destpair[1])
+        elif self.__proxy[0] == PROXY_TYPE_HTTP_NO_TUNNEL:
+            if self.__proxy[2] != None:
+                portnum = self.__proxy[2]
+            else:
+                portnum = 8080
+            _orgsocket.connect(self,(self.__proxy[1],portnum))
+            if destpair[1] == 443:
+                self.__negotiatehttp(destpair[0],destpair[1])
+            else:
+                self.__httptunnel = False
+        elif self.__proxy[0] == None:
+            _orgsocket.connect(self, (destpair[0], destpair[1]))
+        else:
+            raise GeneralProxyError((4, _generalerrors[4]))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/iri2uri.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/iri2uri.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/iri2uri.py	(revision 1126)
@@ -0,0 +1,110 @@
+"""
+iri2uri
+
+Converts an IRI to a URI.
+
+"""
+__author__ = "Joe Gregorio (joe@bitworking.org)"
+__copyright__ = "Copyright 2006, Joe Gregorio"
+__contributors__ = []
+__version__ = "1.0.0"
+__license__ = "MIT"
+__history__ = """
+"""
+
+import urlparse
+
+
+# Convert an IRI to a URI following the rules in RFC 3987
+#
+# The characters we need to enocde and escape are defined in the spec:
+#
+# iprivate =  %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD
+# ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
+#         / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
+#         / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
+#         / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
+#         / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
+#         / %xD0000-DFFFD / %xE1000-EFFFD
+
+escape_range = [
+    (0xA0, 0xD7FF),
+    (0xE000, 0xF8FF),
+    (0xF900, 0xFDCF),
+    (0xFDF0, 0xFFEF),
+    (0x10000, 0x1FFFD),
+    (0x20000, 0x2FFFD),
+    (0x30000, 0x3FFFD),
+    (0x40000, 0x4FFFD),
+    (0x50000, 0x5FFFD),
+    (0x60000, 0x6FFFD),
+    (0x70000, 0x7FFFD),
+    (0x80000, 0x8FFFD),
+    (0x90000, 0x9FFFD),
+    (0xA0000, 0xAFFFD),
+    (0xB0000, 0xBFFFD),
+    (0xC0000, 0xCFFFD),
+    (0xD0000, 0xDFFFD),
+    (0xE1000, 0xEFFFD),
+    (0xF0000, 0xFFFFD),
+    (0x100000, 0x10FFFD),
+]
+
+def encode(c):
+    retval = c
+    i = ord(c)
+    for low, high in escape_range:
+        if i < low:
+            break
+        if i >= low and i <= high:
+            retval = "".join(["%%%2X" % ord(o) for o in c.encode('utf-8')])
+            break
+    return retval
+
+
+def iri2uri(uri):
+    """Convert an IRI to a URI. Note that IRIs must be
+    passed in a unicode strings. That is, do not utf-8 encode
+    the IRI before passing it into the function."""
+    if isinstance(uri ,unicode):
+        (scheme, authority, path, query, fragment) = urlparse.urlsplit(uri)
+        authority = authority.encode('idna')
+        # For each character in 'ucschar' or 'iprivate'
+        #  1. encode as utf-8
+        #  2. then %-encode each octet of that utf-8
+        uri = urlparse.urlunsplit((scheme, authority, path, query, fragment))
+        uri = "".join([encode(c) for c in uri])
+    return uri
+
+if __name__ == "__main__":
+    import unittest
+
+    class Test(unittest.TestCase):
+
+        def test_uris(self):
+            """Test that URIs are invariant under the transformation."""
+            invariant = [
+                u"ftp://ftp.is.co.za/rfc/rfc1808.txt",
+                u"http://www.ietf.org/rfc/rfc2396.txt",
+                u"ldap://[2001:db8::7]/c=GB?objectClass?one",
+                u"mailto:John.Doe@example.com",
+                u"news:comp.infosystems.www.servers.unix",
+                u"tel:+1-816-555-1212",
+                u"telnet://192.0.2.16:80/",
+                u"urn:oasis:names:specification:docbook:dtd:xml:4.1.2" ]
+            for uri in invariant:
+                self.assertEqual(uri, iri2uri(uri))
+
+        def test_iri(self):
+            """ Test that the right type of escaping is done for each part of the URI."""
+            self.assertEqual("http://xn--o3h.com/%E2%98%84", iri2uri(u"http://\N{COMET}.com/\N{COMET}"))
+            self.assertEqual("http://bitworking.org/?fred=%E2%98%84", iri2uri(u"http://bitworking.org/?fred=\N{COMET}"))
+            self.assertEqual("http://bitworking.org/#%E2%98%84", iri2uri(u"http://bitworking.org/#\N{COMET}"))
+            self.assertEqual("#%E2%98%84", iri2uri(u"#\N{COMET}"))
+            self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}"))
+            self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}")))
+            self.assertNotEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}".encode('utf-8')))
+
+    unittest.main()
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/functional/test_proxies.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/functional/test_proxies.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/functional/test_proxies.py	(revision 1126)
@@ -0,0 +1,88 @@
+import unittest
+import errno
+import os
+import signal
+import subprocess
+import tempfile
+
+import nose
+
+import httplib2
+from httplib2 import socks
+from httplib2.test import miniserver
+
+tinyproxy_cfg = """
+User "%(user)s"
+Port %(port)s
+Listen 127.0.0.1
+PidFile "%(pidfile)s"
+LogFile "%(logfile)s"
+MaxClients 2
+StartServers 1
+LogLevel Info
+"""
+
+
+class FunctionalProxyHttpTest(unittest.TestCase):
+    def setUp(self):
+        if not socks:
+            raise nose.SkipTest('socks module unavailable')
+        if not subprocess:
+            raise nose.SkipTest('subprocess module unavailable')
+
+        # start a short-lived miniserver so we can get a likely port
+        # for the proxy
+        self.httpd, self.proxyport = miniserver.start_server(
+            miniserver.ThisDirHandler)
+        self.httpd.shutdown()
+        self.httpd, self.port = miniserver.start_server(
+            miniserver.ThisDirHandler)
+
+        self.pidfile = tempfile.mktemp()
+        self.logfile = tempfile.mktemp()
+        fd, self.conffile = tempfile.mkstemp()
+        f = os.fdopen(fd, 'w')
+        our_cfg = tinyproxy_cfg % {'user': os.getlogin(),
+                                   'pidfile': self.pidfile,
+                                   'port': self.proxyport,
+                                   'logfile': self.logfile}
+        f.write(our_cfg)
+        f.close()
+        try:
+            # TODO use subprocess.check_call when 2.4 is dropped
+            ret = subprocess.call(['tinyproxy', '-c', self.conffile])
+            self.assertEqual(0, ret)
+        except OSError, e:
+            if e.errno == errno.ENOENT:
+                raise nose.SkipTest('tinyproxy not available')
+            raise
+
+    def tearDown(self):
+        self.httpd.shutdown()
+        try:
+            pid = int(open(self.pidfile).read())
+            os.kill(pid, signal.SIGTERM)
+        except OSError, e:
+            if e.errno == errno.ESRCH:
+                print '\n\n\nTinyProxy Failed to start, log follows:'
+                print open(self.logfile).read()
+                print 'end tinyproxy log\n\n\n'
+            raise
+        map(os.unlink, (self.pidfile,
+                        self.logfile,
+                        self.conffile))
+
+    def testSimpleProxy(self):
+        proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP,
+                                        'localhost', self.proxyport)
+        client = httplib2.Http(proxy_info=proxy_info)
+        src = 'miniserver.py'
+        response, body = client.request('http://localhost:%d/%s' %
+                                        (self.port, src))
+        self.assertEqual(response.status, 200)
+        self.assertEqual(body, open(os.path.join(miniserver.HERE, src)).read())
+        lf = open(self.logfile).read()
+        expect = ('Established connection to host "127.0.0.1" '
+                  'using file descriptor')
+        self.assertTrue(expect in lf,
+                        'tinyproxy did not proxy a request for miniserver')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/other_cacerts.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/other_cacerts.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/other_cacerts.txt	(revision 1126)
@@ -0,0 +1,70 @@
+# Certifcate Authority certificates for validating SSL connections.
+#
+# This file contains PEM format certificates generated from
+# http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is the Netscape security libraries.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1994-2000
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+
+Comodo CA Limited, CN=Trusted Certificate Services
+==================================================
+
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
+aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
+MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
+VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
+fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
+TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
+fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
+1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
+kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
+A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
+ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
+dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
+Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
+HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
+jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
+dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/smoke_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/smoke_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/smoke_test.py	(revision 1126)
@@ -0,0 +1,23 @@
+import os
+import unittest
+
+import httplib2
+
+from httplib2.test import miniserver
+
+
+class HttpSmokeTest(unittest.TestCase):
+    def setUp(self):
+        self.httpd, self.port = miniserver.start_server(
+            miniserver.ThisDirHandler)
+
+    def tearDown(self):
+        self.httpd.shutdown()
+
+    def testGetFile(self):
+        client = httplib2.Http()
+        src = 'miniserver.py'
+        response, body = client.request('http://localhost:%d/%s' %
+                                        (self.port, src))
+        self.assertEqual(response.status, 200)
+        self.assertEqual(body, open(os.path.join(miniserver.HERE, src)).read())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/brokensocket/socket.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/brokensocket/socket.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/brokensocket/socket.py	(revision 1126)
@@ -0,0 +1 @@
+from realsocket import gaierror, error, getaddrinfo, SOCK_STREAM
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/miniserver.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/miniserver.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/miniserver.py	(revision 1126)
@@ -0,0 +1,100 @@
+import logging
+import os
+import select
+import SimpleHTTPServer
+import SocketServer
+import threading
+
+HERE = os.path.dirname(__file__)
+logger = logging.getLogger(__name__)
+
+
+class ThisDirHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
+    def translate_path(self, path):
+        path = path.split('?', 1)[0].split('#', 1)[0]
+        return os.path.join(HERE, *filter(None, path.split('/')))
+
+    def log_message(self, s, *args):
+        # output via logging so nose can catch it
+        logger.info(s, *args)
+
+
+class ShutdownServer(SocketServer.TCPServer):
+    """Mixin that allows serve_forever to be shut down.
+
+    The methods in this mixin are backported from SocketServer.py in the Python
+    2.6.4 standard library. The mixin is unnecessary in 2.6 and later, when
+    BaseServer supports the shutdown method directly.
+    """
+
+    def __init__(self, *args, **kwargs):
+        SocketServer.TCPServer.__init__(self, *args, **kwargs)
+        self.__is_shut_down = threading.Event()
+        self.__serving = False
+
+    def serve_forever(self, poll_interval=0.1):
+        """Handle one request at a time until shutdown.
+
+        Polls for shutdown every poll_interval seconds. Ignores
+        self.timeout. If you need to do periodic tasks, do them in
+        another thread.
+        """
+        self.__serving = True
+        self.__is_shut_down.clear()
+        while self.__serving:
+            r, w, e = select.select([self.socket], [], [], poll_interval)
+            if r:
+                self._handle_request_noblock()
+        self.__is_shut_down.set()
+
+    def shutdown(self):
+        """Stops the serve_forever loop.
+
+        Blocks until the loop has finished. This must be called while
+        serve_forever() is running in another thread, or it will deadlock.
+        """
+        self.__serving = False
+        self.__is_shut_down.wait()
+
+    def handle_request(self):
+        """Handle one request, possibly blocking.
+
+        Respects self.timeout.
+        """
+        # Support people who used socket.settimeout() to escape
+        # handle_request before self.timeout was available.
+        timeout = self.socket.gettimeout()
+        if timeout is None:
+            timeout = self.timeout
+        elif self.timeout is not None:
+            timeout = min(timeout, self.timeout)
+        fd_sets = select.select([self], [], [], timeout)
+        if not fd_sets[0]:
+            self.handle_timeout()
+            return
+        self._handle_request_noblock()
+
+    def _handle_request_noblock(self):
+        """Handle one request, without blocking.
+
+        I assume that select.select has returned that the socket is
+        readable before this function was called, so there should be
+        no risk of blocking in get_request().
+        """
+        try:
+            request, client_address = self.get_request()
+        except socket.error:
+            return
+        if self.verify_request(request, client_address):
+            try:
+                self.process_request(request, client_address)
+            except:
+                self.handle_error(request, client_address)
+                self.close_request(request)
+
+
+def start_server(handler):
+    httpd = ShutdownServer(("", 0), handler)
+    threading.Thread(target=httpd.serve_forever).start()
+    _, port = httpd.socket.getsockname()
+    return httpd, port
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/test_no_socket.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/test_no_socket.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/test/test_no_socket.py	(revision 1126)
@@ -0,0 +1,24 @@
+"""Tests for httplib2 when the socket module is missing.
+
+This helps ensure compatibility with environments such as AppEngine.
+"""
+import os
+import sys
+import unittest
+
+import httplib2
+
+class MissingSocketTest(unittest.TestCase):
+    def setUp(self):
+        self._oldsocks = httplib2.socks
+        httplib2.socks = None
+
+    def tearDown(self):
+        httplib2.socks = self._oldsocks
+
+    def testProxyDisabled(self):
+        proxy_info = httplib2.ProxyInfo('blah',
+                                        'localhost', 0)
+        client = httplib2.Http(proxy_info=proxy_info)
+        self.assertRaises(httplib2.ProxiesUnavailableError,
+                          client.request, 'http://localhost:-1/')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/cacerts.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/cacerts.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/httplib2/cacerts.txt	(revision 1126)
@@ -0,0 +1,2183 @@
+# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
+# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
+# Label: "GTE CyberTrust Global Root"
+# Serial: 421
+# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db
+# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74
+# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
+VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
+bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
+b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
+iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
+r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
+04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
+GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
+3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
+lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+
+# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Label: "Thawte Server CA"
+# Serial: 1
+# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d
+# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c
+# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
+MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
+MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
+dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
+cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
+DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
+yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
+L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
+EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
+7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
+QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
+qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Label: "Thawte Premium Server CA"
+# Serial: 1
+# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a
+# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a
+# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
+dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
+MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
+MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
+A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
+b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
+cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
+bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
+VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
+ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
+uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
+hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
+pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Equifax OU=Equifax Secure Certificate Authority
+# Subject: O=Equifax OU=Equifax Secure Certificate Authority
+# Label: "Equifax Secure CA"
+# Serial: 903804111
+# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4
+# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a
+# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
+dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
+MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
+dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
+BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
+cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
+MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
+aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
+ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
+IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
+7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
+1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Label: "Verisign Class 3 Public Primary Certification Authority"
+# Serial: 149843929435818692848040365716851702463
+# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67
+# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2
+# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
+lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
+AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
+# Label: "Verisign Class 3 Public Primary Certification Authority - G2"
+# Serial: 167285380242319648451154478808036881606
+# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9
+# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f
+# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
+pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
+13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
+U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
+F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
+oJ2daZH9
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Label: "GlobalSign Root CA"
+# Serial: 4835703278459707669005204
+# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
+# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
+# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Label: "GlobalSign Root CA - R2"
+# Serial: 4835703278459682885658125
+# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
+# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
+# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
+# Label: "ValiCert Class 1 VA"
+# Serial: 1
+# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb
+# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e
+# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
+NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
+LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
+TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
+LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
+I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
+nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
+# Label: "ValiCert Class 2 VA"
+# Serial: 1
+# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87
+# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6
+# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
+NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
+dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
+WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
+v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
+UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
+IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
+W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
+# Label: "RSA Root Certificate 1"
+# Serial: 1
+# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72
+# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb
+# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
+NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
+cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
+2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
+JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
+Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
+n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
+PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
+# Serial: 206684696279472310254277870180966723415
+# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
+# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
+# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 4 Public Primary Certification Authority - G3"
+# Serial: 314531972711909413743075096039378935511
+# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df
+# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d
+# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
+GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
+U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
+NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
+ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
+ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
+CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
+g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
+2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
+bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Secure Server CA"
+# Serial: 927650371
+# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee
+# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39
+# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Premium 2048 Secure Server CA"
+# Serial: 946059622
+# MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc
+# SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe
+# SHA256 Fingerprint: d1:c3:39:ea:27:84:eb:87:0f:93:4f:c5:63:4e:4a:a9:ad:55:05:01:64:01:f2:64:65:d3:7a:57:46:63:35:9f
+-----BEGIN CERTIFICATE-----
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
+MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
+vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
+CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
+WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
+h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
+f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
+B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
+vUxFnmG6v4SBkgPR0ml8xQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Label: "Baltimore CyberTrust Root"
+# Serial: 33554617
+# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
+# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
+# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
+# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
+# Label: "Equifax Secure Global eBusiness CA"
+# Serial: 1
+# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc
+# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45
+# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
+ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
+MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
+dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
+c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
+UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
+58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
+o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
+aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
+A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
+Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
+8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
+# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
+# Label: "Equifax Secure eBusiness CA 1"
+# Serial: 4
+# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d
+# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41
+# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
+ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
+MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
+LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
+KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
+RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
+WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
+Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
+AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
+eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
+zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
+/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+# Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
+# Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
+# Label: "Equifax Secure eBusiness CA 2"
+# Serial: 930140085
+# MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca
+# SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc
+# SHA256 Fingerprint: 2f:27:4e:48:ab:a4:ac:7b:76:59:33:10:17:75:50:6d:c3:0e:e3:8e:f6:ac:d5:c0:49:32:cf:e0:41:23:42:20
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
+dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
+NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
+VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
+vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
+BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
+IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
+NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
+y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
+0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
+E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Low-Value Services Root"
+# Serial: 1
+# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc
+# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d
+# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
+MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
+VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
+CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
+tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
+dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
+PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
+BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
+ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
+7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
+43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
+pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
+WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Label: "AddTrust External Root"
+# Serial: 1
+# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
+# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
+# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Public Services Root"
+# Serial: 1
+# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f
+# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5
+# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
+MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
+ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
+BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
+6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
+GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
+dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
+1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
+62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
+BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
+MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
+cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
+b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
+IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
+iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
+4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
+XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Qualified Certificates Root"
+# Serial: 1
+# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb
+# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf
+# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
+MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
+EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
+BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
+xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
+87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
+2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
+WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
+0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
+A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
+pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
+ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
+aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
+hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
+hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
+P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
+iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
+xqE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Label: "Entrust Root Certification Authority"
+# Serial: 1164660820
+# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
+# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
+# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Label: "GeoTrust Global CA"
+# Serial: 144470
+# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
+# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
+# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Global CA 2"
+# Serial: 1
+# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9
+# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d
+# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
+IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
+R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
+PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
+Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
+TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
+5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
+S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
+2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
+EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
+EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
+/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
+A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
+abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
+I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
+4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA"
+# Serial: 1
+# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
+# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
+# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA 2"
+# Serial: 1
+# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
+# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
+# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc.
+# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc.
+# Label: "America Online Root Certification Authority 1"
+# Serial: 1
+# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e
+# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a
+# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
+hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
+1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
+OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
+2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
+O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
+AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
+Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
+LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
+oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
+MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
+# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc.
+# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc.
+# Label: "America Online Root Certification Authority 2"
+# Serial: 1
+# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf
+# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84
+# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
+206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
+KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
+JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
+BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
+Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
+PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
+Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
+Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
+o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
+YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
+FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
+xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
+LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
+obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
+CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
+IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
+DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
+AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
+Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
+AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
+Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
+RY8mkaKO/qk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
+# Subject: CN=AAA Certificate Services O=Comodo CA Limited
+# Label: "Comodo AAA Services root"
+# Serial: 1
+# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
+# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
+# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Certificate Services O=Comodo CA Limited
+# Subject: CN=Secure Certificate Services O=Comodo CA Limited
+# Label: "Comodo Secure Services root"
+# Serial: 1
+# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd
+# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1
+# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
+ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
+fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
+BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
+cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
+HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
+CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
+3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
+6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
+HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
+Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
+Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
+DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
+5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
+gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
+aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
+izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited
+# Subject: CN=Trusted Certificate Services O=Comodo CA Limited
+# Label: "Comodo Trusted Services root"
+# Serial: 1
+# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27
+# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd
+# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
+aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
+MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
+VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
+fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
+TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
+fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
+1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
+kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
+A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
+ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
+dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
+Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
+HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
+jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
+dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
+# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
+# Label: "UTN DATACorp SGC Root CA"
+# Serial: 91374294542884689855167577680241077609
+# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06
+# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4
+# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
+kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
+IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
+EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
+VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
+dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
+E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
+D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
+4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
+lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
+bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
+o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
+MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
+LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
+BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
+AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
+j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
+KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
+2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
+mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
+# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
+# Label: "UTN USERFirst Hardware Root CA"
+# Serial: 91374294542884704022267039221184531197
+# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39
+# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7
+# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
+lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
+SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
+MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
+d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
+cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
+0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
+M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
+MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
+oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
+DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
+oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
+dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
+bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
+BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
+CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
+CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
+3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
+KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Label: "XRamp Global CA Root"
+# Serial: 107108908803651509692980124233745014957
+# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
+# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
+# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Label: "Go Daddy Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
+# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
+# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+
+# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Label: "Starfield Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
+# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
+# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Label: "StartCom Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16
+# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f
+# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
+LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
+BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
+dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
+cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
+YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
+dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
+bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
+YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
+TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
+9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
+jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
+FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
+ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
+ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
+EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
+L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
+O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
+um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
+NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root CA"
+# Serial: 17154717934120587862167794914071425081
+# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
+# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
+# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root CA"
+# Serial: 10944719598952040374951832963794454346
+# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
+# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
+# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert High Assurance EV Root CA"
+# Serial: 3553400076410547919724730734378100087
+# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
+# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
+# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Label: "GeoTrust Primary Certification Authority"
+# Serial: 32798226551256963324313806436981982369
+# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
+# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
+# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA"
+# Serial: 69529181992039203566298953787712940909
+# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
+# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
+# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
+# Serial: 33037644167568058970164719475676101450
+# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
+# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
+# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
+# Label: "COMODO Certification Authority"
+# Serial: 104350513648249232941998508985834464573
+# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
+# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
+# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Label: "Network Solutions Certificate Authority"
+# Serial: 116697915152937497490437556386812487904
+# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
+# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
+# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Label: "COMODO ECC Certification Authority"
+# Serial: 41578283867086692638256921589707938090
+# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
+# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
+# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
+# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
+# Label: "TC TrustCenter Class 2 CA II"
+# Serial: 941389028203453866782103406992443
+# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23
+# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e
+# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
+tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
+uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
+XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
+8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
+5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
+kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
+dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
+Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
+JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
+Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
+GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
+ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
+au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
+hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
+dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
+# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
+# Label: "TC TrustCenter Class 3 CA II"
+# Serial: 1506523511417715638772220530020799
+# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e
+# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5
+# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
+Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
+Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
+1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
+ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
+Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
+XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
+dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
+Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
+JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
+Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
+irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
+TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
+g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
+95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
+S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
+# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
+# Label: "TC TrustCenter Universal CA I"
+# Serial: 601024842042189035295619584734726
+# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c
+# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3
+# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
+BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
+c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
+MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
+R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
+VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
+JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
+fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
+jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
+wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
+fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
+VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
+CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
+7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
+8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
+ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
+2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+
+# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Label: "Cybertrust Global Root"
+# Serial: 4835703278459682877484360
+# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
+# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
+# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G3"
+# Serial: 28809105769928564313984085209975885599
+# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
+# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
+# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G2"
+# Serial: 71758320672825410020661621085256472406
+# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
+# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
+# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G3"
+# Serial: 127614157056681299805556476275995414779
+# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
+# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
+# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G2"
+# Serial: 80682863203381065782177908751794619243
+# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
+# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
+# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Universal Root Certification Authority"
+# Serial: 85209574734084581917763752644031726877
+# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
+# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
+# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
+# Serial: 63143484348153506665311985501458640051
+# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
+# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
+# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Label: "Verisign Class 3 Public Primary Certification Authority"
+# Serial: 80507572722862485515306429940691309246
+# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4
+# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b
+# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
+2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
+2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Label: "GlobalSign Root CA - R3"
+# Serial: 4835703278459759426209954
+# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
+# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
+# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+
+# Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
+# Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
+# Label: "TC TrustCenter Universal CA III"
+# Serial: 2010889993983507346460533407902964
+# MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b
+# SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87
+# SHA256 Fingerprint: 30:9b:4a:87:f6:ca:56:c9:31:69:aa:a9:9c:6d:98:88:54:d7:89:2b:d5:43:7e:2d:07:b2:9c:be:da:55:d3:5d
+-----BEGIN CERTIFICATE-----
+MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
+BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1
+c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy
+MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl
+ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm
+BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF
+5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv
+DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v
+zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT
+yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj
+dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh
+MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI
+4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz
+dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY
+aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G
+DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
+CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH
+LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Label: "Go Daddy Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
+# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
+# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
+# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
+# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Services Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
+# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
+# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
+# Subject: CN=AffirmTrust Commercial O=AffirmTrust
+# Label: "AffirmTrust Commercial"
+# Serial: 8608355977964138876
+# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
+# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
+# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Networking O=AffirmTrust
+# Subject: CN=AffirmTrust Networking O=AffirmTrust
+# Label: "AffirmTrust Networking"
+# Serial: 8957382827206547757
+# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
+# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
+# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium O=AffirmTrust
+# Subject: CN=AffirmTrust Premium O=AffirmTrust
+# Label: "AffirmTrust Premium"
+# Serial: 7893706540734352110
+# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
+# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
+# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Label: "AffirmTrust Premium ECC"
+# Serial: 8401224907861490260
+# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
+# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
+# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Label: "StartCom Certification Authority"
+# Serial: 45
+# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16
+# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0
+# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
+F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
+ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
+ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
+aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
+YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
+c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
+d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
+CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
+wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
+Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
+0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
+pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
+CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
+P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
+1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
+KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
+8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
+fyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.
+# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.
+# Label: "StartCom Certification Authority G2"
+# Serial: 59
+# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64
+# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17
+# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
+OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
+A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
+JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
+vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
+D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
+Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
+RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
+HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
+nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
+0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
+UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
+Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
+TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
+BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
+UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
+6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
+9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
+HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
+wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
+XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
+IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
+hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
+so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/six.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/six.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/six.py	(revision 1126)
@@ -0,0 +1,868 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2015 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.10.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """Create a base class with a metaclass."""
+    # This requires a bit of explanation: the basic idea is to make a dummy
+    # metaclass for one level of class instantiation that replaces itself with
+    # the actual metaclass.
+    class metaclass(meta):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/statistics/tests/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/statistics/tests/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/statistics/tests/__init__.py	(revision 1126)
@@ -0,0 +1,13 @@
+# -*- coding: UTF-8 -*-
+import statistics
+import unittest
+
+def suite():
+
+    import doctest
+    suite = unittest.TestSuite()
+    suite.addTests(doctest.DocTestSuite(statistics))
+    return suite
+
+if __name__ == '__main__':
+    unittest.TextTestRunner(verbosity=2).run(suite())
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/statistics/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/statistics/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/statistics/__init__.py	(revision 1126)
@@ -0,0 +1,597 @@
+# -*- coding: UTF-8 -*-
+##  Module statistics.py
+##
+##  Copyright (c) 2013 Steven D'Aprano <steve+python@pearwood.info>.
+##
+##  Licensed under the Apache License, Version 2.0 (the "License");
+##  you may not use this file except in compliance with the License.
+##  You may obtain a copy of the License at
+##
+##  http://www.apache.org/licenses/LICENSE-2.0
+##
+##  Unless required by applicable law or agreed to in writing, software
+##  distributed under the License is distributed on an "AS IS" BASIS,
+##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+##  See the License for the specific language governing permissions and
+##  limitations under the License.
+
+
+u"""
+Basic statistics module.
+
+This module provides functions for calculating statistics of data, including
+averages, variance, and standard deviation.
+
+Calculating averages
+--------------------
+
+==================  =============================================
+Function            Description
+==================  =============================================
+mean                Arithmetic mean (average) of data.
+median              Median (middle value) of data.
+median_low          Low median of data.
+median_high         High median of data.
+median_grouped      Median, or 50th percentile, of grouped data.
+mode                Mode (most common value) of data.
+==================  =============================================
+
+Calculate the arithmetic mean ("the average") of data:
+
+>>> mean([-1.0, 2.5, 3.25, 5.75])
+2.625
+
+
+Calculate the standard median of discrete data:
+
+>>> median([2, 3, 4, 5])
+3.5
+
+
+Calculate the median, or 50th percentile, of data grouped into class intervals
+centred on the data values provided. E.g. if your data points are rounded to
+the nearest whole number:
+
+>>> median_grouped([2, 2, 3, 3, 3, 4])  #doctest: +ELLIPSIS
+2.8333333333...
+
+This should be interpreted in this way: you have two data points in the class
+interval 1.5-2.5, three data points in the class interval 2.5-3.5, and one in
+the class interval 3.5-4.5. The median of these data points is 2.8333...
+
+
+Calculating variability or spread
+---------------------------------
+
+==================  =============================================
+Function            Description
+==================  =============================================
+pvariance           Population variance of data.
+variance            Sample variance of data.
+pstdev              Population standard deviation of data.
+stdev               Sample standard deviation of data.
+==================  =============================================
+
+Calculate the standard deviation of sample data:
+
+>>> stdev([2.5, 3.25, 5.5, 11.25, 11.75])  #doctest: +ELLIPSIS
+4.38961843444...
+
+If you have previously calculated the mean, you can pass it as the optional
+second argument to the four "spread" functions to avoid recalculating it:
+
+>>> data = [1, 2, 2, 4, 4, 4, 5, 6]
+>>> mu = mean(data)
+>>> pvariance(data, mu)
+2.5
+
+
+Exceptions
+----------
+
+A single exception is defined: StatisticsError is a subclass of ValueError.
+
+"""
+
+from __future__ import division
+__all__ = [ u'StatisticsError',
+            u'pstdev', u'pvariance', u'stdev', u'variance',
+            u'median',  u'median_low', u'median_high', u'median_grouped',
+            u'mean', u'mode',
+          ]
+
+
+import collections
+import math
+
+from fractions import Fraction
+from decimal import Decimal
+
+
+# === Exceptions ===
+
+class StatisticsError(ValueError):
+    pass
+
+
+# === Private utilities ===
+
+def _sum(data, start=0):
+    u"""_sum(data [, start]) -> value
+
+    Return a high-precision sum of the given numeric data. If optional
+    argument ``start`` is given, it is added to the total. If ``data`` is
+    empty, ``start`` (defaulting to 0) is returned.
+
+
+    Examples
+    --------
+
+    >>> _sum([3, 2.25, 4.5, -0.5, 1.0], 0.75)
+    11.0
+
+    Some sources of round-off error will be avoided:
+
+    >>> _sum([1e50, 1, -1e50] * 1000)  # Built-in sum returns zero.
+    1000.0
+
+    Fractions and Decimals are also supported:
+
+    >>> from fractions import Fraction as F
+    >>> _sum([F(2, 3), F(7, 5), F(1, 4), F(5, 6)])
+    Fraction(63, 20)
+
+    >>> from decimal import Decimal as D
+    >>> data = [D("0.1375"), D("0.2108"), D("0.3061"), D("0.0419")]
+    >>> _sum(data)
+    Decimal('0.6963')
+
+    Mixed types are currently treated as an error, except that int is
+    allowed.
+    """
+    # We fail as soon as we reach a value that is not an int or the type of
+    # the first value which is not an int. E.g. _sum([int, int, float, int])
+    # is okay, but sum([int, int, float, Fraction]) is not.
+    allowed_types = set([int, type(start)])
+    n, d = _exact_ratio(start)
+    partials = {d: n}  # map {denominator: sum of numerators}
+    # Micro-optimizations.
+    exact_ratio = _exact_ratio
+    partials_get = partials.get
+    # Add numerators for each denominator.
+    for x in data:
+        _check_type(type(x), allowed_types)
+        n, d = exact_ratio(x)
+        partials[d] = partials_get(d, 0) + n
+    # Find the expected result type. If allowed_types has only one item, it
+    # will be int; if it has two, use the one which isn't int.
+    assert len(allowed_types) in (1, 2)
+    if len(allowed_types) == 1:
+        assert allowed_types.pop() is int
+        T = int
+    else:
+        T = (allowed_types - set([int])).pop()
+    if None in partials:
+        assert issubclass(T, (float, Decimal))
+        assert not math.isfinite(partials[None])
+        return T(partials[None])
+    total = Fraction()
+    for d, n in sorted(partials.items()):
+        total += Fraction(n, d)
+    if issubclass(T, int):
+        assert total.denominator == 1
+        return T(total.numerator)
+    if issubclass(T, Decimal):
+        return T(total.numerator)/total.denominator
+    return T(total)
+
+
+def _check_type(T, allowed):
+    if T not in allowed:
+        if len(allowed) == 1:
+            allowed.add(T)
+        else:
+            types = u', '.join([t.__name__ for t in allowed] + [T.__name__])
+            raise TypeError(u"unsupported mixed types: %s" % types)
+
+
+def _exact_ratio(x):
+    u"""Convert Real number x exactly to (numerator, denominator) pair.
+
+    >>> _exact_ratio(0.25)
+    (1, 4)
+
+    x is expected to be an int, Fraction, Decimal or float.
+    """
+    try:
+        try:
+            # int, Fraction
+            return (x.numerator, x.denominator)
+        except AttributeError:
+            # float
+            try:
+                return x.as_integer_ratio()
+            except AttributeError:
+                # Decimal
+                try:
+                    return _decimal_to_ratio(x)
+                except AttributeError:
+                    msg = u"can't convert type '{}' to numerator/denominator"
+                    raise TypeError(msg.format(type(x).__name__))
+    except (OverflowError, ValueError):
+        # INF or NAN
+        if __debug__:
+            # Decimal signalling NANs cannot be converted to float :-(
+            if isinstance(x, Decimal):
+                assert not x.is_finite()
+            else:
+                assert not math.isfinite(x)
+        return (x, None)
+
+
+# FIXME This is faster than Fraction.from_decimal, but still too slow.
+def _decimal_to_ratio(d):
+    u"""Convert Decimal d to exact integer ratio (numerator, denominator).
+
+    >>> from decimal import Decimal
+    >>> _decimal_to_ratio(Decimal("2.6"))
+    (26, 10)
+
+    """
+    sign, digits, exp = d.as_tuple()
+    if exp in (u'F', u'n', u'N'):  # INF, NAN, sNAN
+        assert not d.is_finite()
+        raise ValueError
+    num = 0
+    for digit in digits:
+        num = num*10 + digit
+    if exp < 0:
+        den = 10**-exp
+    else:
+        num *= 10**exp
+        den = 1
+    if sign:
+        num = -num
+    return (num, den)
+
+
+def _counts(data):
+    # Generate a table of sorted (value, frequency) pairs.
+    table = collections.Counter(iter(data)).most_common()
+    if not table:
+        return table
+    # Extract the values with the highest frequency.
+    maxfreq = table[0][1]
+    for i in xrange(1, len(table)):
+        if table[i][1] != maxfreq:
+            table = table[:i]
+            break
+    return table
+
+
+# === Measures of central tendency (averages) ===
+
+def mean(data):
+    u"""Return the sample arithmetic mean of data.
+
+    >>> mean([1, 2, 3, 4, 4])
+    2.8
+
+    >>> from fractions import Fraction as F
+    >>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
+    Fraction(13, 21)
+
+    >>> from decimal import Decimal as D
+    >>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
+    Decimal('0.5625')
+
+    If ``data`` is empty, StatisticsError will be raised.
+    """
+    if iter(data) is data:
+        data = list(data)
+    n = len(data)
+    if n < 1:
+        raise StatisticsError(u'mean requires at least one data point')
+    return _sum(data)/n
+
+
+# FIXME: investigate ways to calculate medians without sorting? Quickselect?
+def median(data):
+    u"""Return the median (middle value) of numeric data.
+
+    When the number of data points is odd, return the middle data point.
+    When the number of data points is even, the median is interpolated by
+    taking the average of the two middle values:
+
+    >>> median([1, 3, 5])
+    3
+    >>> median([1, 3, 5, 7])
+    4.0
+
+    """
+    data = sorted(data)
+    n = len(data)
+    if n == 0:
+        raise StatisticsError(u"no median for empty data")
+    if n%2 == 1:
+        return data[n//2]
+    else:
+        i = n//2
+        return (data[i - 1] + data[i])/2
+
+
+def median_low(data):
+    u"""Return the low median of numeric data.
+
+    When the number of data points is odd, the middle value is returned.
+    When it is even, the smaller of the two middle values is returned.
+
+    >>> median_low([1, 3, 5])
+    3
+    >>> median_low([1, 3, 5, 7])
+    3
+
+    """
+    data = sorted(data)
+    n = len(data)
+    if n == 0:
+        raise StatisticsError(u"no median for empty data")
+    if n%2 == 1:
+        return data[n//2]
+    else:
+        return data[n//2 - 1]
+
+
+def median_high(data):
+    u"""Return the high median of data.
+
+    When the number of data points is odd, the middle value is returned.
+    When it is even, the larger of the two middle values is returned.
+
+    >>> median_high([1, 3, 5])
+    3
+    >>> median_high([1, 3, 5, 7])
+    5
+
+    """
+    data = sorted(data)
+    n = len(data)
+    if n == 0:
+        raise StatisticsError(u"no median for empty data")
+    return data[n//2]
+
+
+def median_grouped(data, interval=1):
+    u""""Return the 50th percentile (median) of grouped continuous data.
+
+    >>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5])
+    3.7
+    >>> median_grouped([52, 52, 53, 54])
+    52.5
+
+    This calculates the median as the 50th percentile, and should be
+    used when your data is continuous and grouped. In the above example,
+    the values 1, 2, 3, etc. actually represent the midpoint of classes
+    0.5-1.5, 1.5-2.5, 2.5-3.5, etc. The middle value falls somewhere in
+    class 3.5-4.5, and interpolation is used to estimate it.
+
+    Optional argument ``interval`` represents the class interval, and
+    defaults to 1. Changing the class interval naturally will change the
+    interpolated 50th percentile value:
+
+    >>> median_grouped([1, 3, 3, 5, 7], interval=1)
+    3.25
+    >>> median_grouped([1, 3, 3, 5, 7], interval=2)
+    3.5
+
+    This function does not check whether the data points are at least
+    ``interval`` apart.
+    """
+    data = sorted(data)
+    n = len(data)
+    if n == 0:
+        raise StatisticsError(u"no median for empty data")
+    elif n == 1:
+        return data[0]
+    # Find the value at the midpoint. Remember this corresponds to the
+    # centre of the class interval.
+    x = data[n//2]
+    for obj in (x, interval):
+        if isinstance(obj, (unicode, str)):
+            raise TypeError(u'expected number but got %r' % obj)
+    try:
+        L = x - interval/2  # The lower limit of the median interval.
+    except TypeError:
+        # Mixed type. For now we just coerce to float.
+        L = float(x) - float(interval)/2
+    cf = data.index(x)  # Number of values below the median interval.
+    # FIXME The following line could be more efficient for big lists.
+    f = data.count(x)  # Number of data points in the median interval.
+    return L + interval*(n/2 - cf)/f
+
+
+def mode(data):
+    u"""Return the most common data point from discrete or nominal data.
+
+    ``mode`` assumes discrete data, and returns a single value. This is the
+    standard treatment of the mode as commonly taught in schools:
+
+    >>> mode([1, 1, 2, 3, 3, 3, 3, 4])
+    3
+
+    This also works with nominal (non-numeric) data:
+
+    >>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
+    'red'
+
+    If there is not exactly one most common value, ``mode`` will raise
+    StatisticsError.
+    """
+    # Generate a table of sorted (value, frequency) pairs.
+    table = _counts(data)
+    if len(table) == 1:
+        return table[0][0]
+    elif table:
+        raise StatisticsError(
+                u'no unique mode; found %d equally common values' % len(table)
+                )
+    else:
+        raise StatisticsError(u'no mode for empty data')
+
+
+# === Measures of spread ===
+
+# See http://mathworld.wolfram.com/Variance.html
+#     http://mathworld.wolfram.com/SampleVariance.html
+#     http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
+#
+# Under no circumstances use the so-called "computational formula for
+# variance", as that is only suitable for hand calculations with a small
+# amount of low-precision data. It has terrible numeric properties.
+#
+# See a comparison of three computational methods here:
+# http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/
+
+def _ss(data, c=None):
+    u"""Return sum of square deviations of sequence data.
+
+    If ``c`` is None, the mean is calculated in one pass, and the deviations
+    from the mean are calculated in a second pass. Otherwise, deviations are
+    calculated from ``c`` as given. Use the second case with care, as it can
+    lead to garbage results.
+    """
+    if c is None:
+        c = mean(data)
+    ss = _sum((x-c)**2 for x in data)
+    # The following sum should mathematically equal zero, but due to rounding
+    # error may not.
+    ss -= _sum((x-c) for x in data)**2/len(data)
+    assert not ss < 0, u'negative sum of square deviations: %f' % ss
+    return ss
+
+
+def variance(data, xbar=None):
+    u"""Return the sample variance of data.
+
+    data should be an iterable of Real-valued numbers, with at least two
+    values. The optional argument xbar, if given, should be the mean of
+    the data. If it is missing or None, the mean is automatically calculated.
+
+    Use this function when your data is a sample from a population. To
+    calculate the variance from the entire population, see ``pvariance``.
+
+    Examples:
+
+    >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
+    >>> variance(data)
+    1.3720238095238095
+
+    If you have already calculated the mean of your data, you can pass it as
+    the optional second argument ``xbar`` to avoid recalculating it:
+
+    >>> m = mean(data)
+    >>> variance(data, m)
+    1.3720238095238095
+
+    This function does not check that ``xbar`` is actually the mean of
+    ``data``. Giving arbitrary values for ``xbar`` may lead to invalid or
+    impossible results.
+
+    Decimals and Fractions are supported:
+
+    >>> from decimal import Decimal as D
+    >>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
+    Decimal('31.01875')
+
+    >>> from fractions import Fraction as F
+    >>> variance([F(1, 6), F(1, 2), F(5, 3)])
+    Fraction(67, 108)
+
+    """
+    if iter(data) is data:
+        data = list(data)
+    n = len(data)
+    if n < 2:
+        raise StatisticsError(u'variance requires at least two data points')
+    ss = _ss(data, xbar)
+    return ss/(n-1)
+
+
+def pvariance(data, mu=None):
+    u"""Return the population variance of ``data``.
+
+    data should be an iterable of Real-valued numbers, with at least one
+    value. The optional argument mu, if given, should be the mean of
+    the data. If it is missing or None, the mean is automatically calculated.
+
+    Use this function to calculate the variance from the entire population.
+    To estimate the variance from a sample, the ``variance`` function is
+    usually a better choice.
+
+    Examples:
+
+    >>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]
+    >>> pvariance(data)
+    1.25
+
+    If you have already calculated the mean of the data, you can pass it as
+    the optional second argument to avoid recalculating it:
+
+    >>> mu = mean(data)
+    >>> pvariance(data, mu)
+    1.25
+
+    This function does not check that ``mu`` is actually the mean of ``data``.
+    Giving arbitrary values for ``mu`` may lead to invalid or impossible
+    results.
+
+    Decimals and Fractions are supported:
+
+    >>> from decimal import Decimal as D
+    >>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
+    Decimal('24.815')
+
+    >>> from fractions import Fraction as F
+    >>> pvariance([F(1, 4), F(5, 4), F(1, 2)])
+    Fraction(13, 72)
+
+    """
+    if iter(data) is data:
+        data = list(data)
+    n = len(data)
+    if n < 1:
+        raise StatisticsError(u'pvariance requires at least one data point')
+    ss = _ss(data, mu)
+    return ss/n
+
+
+def stdev(data, xbar=None):
+    u"""Return the square root of the sample variance.
+
+    See ``variance`` for arguments and other details.
+
+    >>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
+    1.0810874155219827
+
+    """
+    var = variance(data, xbar)
+    try:
+        return var.sqrt()
+    except AttributeError:
+        return math.sqrt(var)
+
+
+def pstdev(data, mu=None):
+    u"""Return the square root of the population variance.
+
+    See ``pvariance`` for arguments and other details.
+
+    >>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
+    0.986893273527251
+
+    """
+    var = pvariance(data, mu)
+    try:
+        return var.sqrt()
+    except AttributeError:
+        return math.sqrt(var)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/arguments.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/arguments.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/arguments.py	(revision 1126)
@@ -0,0 +1,95 @@
+# This is a copy of the inspect.getcallargs() function from Python 2.7
+# so we can provide it for use under Python 2.6. As the code in this
+# file derives from the Python distribution, it falls under the version
+# of the PSF license used for Python 2.7.
+
+from inspect import getargspec, ismethod
+
+def getcallargs(func, *positional, **named):
+    """Get the mapping of arguments to values.
+
+    A dict is returned, with keys the function argument names (including the
+    names of the * and ** arguments, if any), and values the respective bound
+    values from 'positional' and 'named'."""
+    args, varargs, varkw, defaults = getargspec(func)
+    f_name = func.__name__
+    arg2value = {}
+
+    # The following closures are basically because of tuple parameter unpacking.
+    assigned_tuple_params = []
+    def assign(arg, value):
+        if isinstance(arg, str):
+            arg2value[arg] = value
+        else:
+            assigned_tuple_params.append(arg)
+            value = iter(value)
+            for i, subarg in enumerate(arg):
+                try:
+                    subvalue = next(value)
+                except StopIteration:
+                    raise ValueError('need more than %d %s to unpack' %
+                                     (i, 'values' if i > 1 else 'value'))
+                assign(subarg,subvalue)
+            try:
+                next(value)
+            except StopIteration:
+                pass
+            else:
+                raise ValueError('too many values to unpack')
+    def is_assigned(arg):
+        if isinstance(arg,str):
+            return arg in arg2value
+        return arg in assigned_tuple_params
+    if ismethod(func) and func.im_self is not None:
+        # implicit 'self' (or 'cls' for classmethods) argument
+        positional = (func.im_self,) + positional
+    num_pos = len(positional)
+    num_total = num_pos + len(named)
+    num_args = len(args)
+    num_defaults = len(defaults) if defaults else 0
+    for arg, value in zip(args, positional):
+        assign(arg, value)
+    if varargs:
+        if num_pos > num_args:
+            assign(varargs, positional[-(num_pos-num_args):])
+        else:
+            assign(varargs, ())
+    elif 0 < num_args < num_pos:
+        raise TypeError('%s() takes %s %d %s (%d given)' % (
+            f_name, 'at most' if defaults else 'exactly', num_args,
+            'arguments' if num_args > 1 else 'argument', num_total))
+    elif num_args == 0 and num_total:
+        if varkw:
+            if num_pos:
+                # XXX: We should use num_pos, but Python also uses num_total:
+                raise TypeError('%s() takes exactly 0 arguments '
+                                '(%d given)' % (f_name, num_total))
+        else:
+            raise TypeError('%s() takes no arguments (%d given)' %
+                            (f_name, num_total))
+    for arg in args:
+        if isinstance(arg, str) and arg in named:
+            if is_assigned(arg):
+                raise TypeError("%s() got multiple values for keyword "
+                                "argument '%s'" % (f_name, arg))
+            else:
+                assign(arg, named.pop(arg))
+    if defaults:    # fill in any missing values with the defaults
+        for arg, value in zip(args[-num_defaults:], defaults):
+            if not is_assigned(arg):
+                assign(arg, value)
+    if varkw:
+        assign(varkw, named)
+    elif named:
+        unexpected = next(iter(named))
+        if isinstance(unexpected, unicode):
+            unexpected = unexpected.encode(sys.getdefaultencoding(), 'replace')
+        raise TypeError("%s() got an unexpected keyword argument '%s'" %
+                        (f_name, unexpected))
+    unassigned = num_args - len([arg for arg in args if is_assigned(arg)])
+    if unassigned:
+        num_required = num_args - num_defaults
+        raise TypeError('%s() takes %s %d %s (%d given)' % (
+            f_name, 'at least' if defaults else 'exactly', num_required,
+            'arguments' if num_required > 1 else 'argument', num_total))
+    return arg2value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/decorators.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/decorators.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/decorators.py	(revision 1126)
@@ -0,0 +1,512 @@
+"""This module implements decorators for implementing other decorators
+as well as some commonly used decorators.
+
+"""
+
+import sys
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    string_types = str,
+
+    import builtins
+    exec_ = getattr(builtins, "exec")
+    del builtins
+
+else:
+    string_types = basestring,
+
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+from functools import partial
+from inspect import getargspec, ismethod, isclass, formatargspec
+from collections import namedtuple
+from threading import Lock, RLock
+
+try:
+    from inspect import signature
+except ImportError:
+    pass
+
+from .wrappers import (FunctionWrapper, BoundFunctionWrapper, ObjectProxy,
+    CallableObjectProxy)
+
+# Adapter wrapper for the wrapped function which will overlay certain
+# properties from the adapter function onto the wrapped function so that
+# functions such as inspect.getargspec(), inspect.getfullargspec(),
+# inspect.signature() and inspect.getsource() return the correct results
+# one would expect.
+
+class _AdapterFunctionCode(CallableObjectProxy):
+
+    def __init__(self, wrapped_code, adapter_code):
+        super(_AdapterFunctionCode, self).__init__(wrapped_code)
+        self._self_adapter_code = adapter_code
+
+    @property
+    def co_argcount(self):
+        return self._self_adapter_code.co_argcount
+
+    @property
+    def co_code(self):
+        return self._self_adapter_code.co_code
+
+    @property
+    def co_flags(self):
+        return self._self_adapter_code.co_flags
+
+    @property
+    def co_kwonlyargcount(self):
+        return self._self_adapter_code.co_kwonlyargcount
+
+    @property
+    def co_varnames(self):
+        return self._self_adapter_code.co_varnames
+
+class _AdapterFunctionSurrogate(CallableObjectProxy):
+
+    def __init__(self, wrapped, adapter):
+        super(_AdapterFunctionSurrogate, self).__init__(wrapped)
+        self._self_adapter = adapter
+
+    @property
+    def __code__(self):
+        return _AdapterFunctionCode(self.__wrapped__.__code__,
+                self._self_adapter.__code__)
+
+    @property
+    def __defaults__(self):
+        return self._self_adapter.__defaults__
+
+    @property
+    def __kwdefaults__(self):
+        return self._self_adapter.__kwdefaults__
+
+    @property
+    def __signature__(self):
+        if 'signature' not in globals():
+            return self._self_adapter.__signature__
+        else:
+            # Can't allow this to fail on Python 3 else it falls
+            # through to using __wrapped__, but that will be the
+            # wrong function we want to derive the signature
+            # from. Thus generate the signature ourselves.
+
+            return signature(self._self_adapter)
+
+    if PY2:
+        func_code = __code__
+        func_defaults = __defaults__
+
+class _BoundAdapterWrapper(BoundFunctionWrapper):
+
+    @property
+    def __func__(self):
+        return _AdapterFunctionSurrogate(self.__wrapped__.__func__,
+                self._self_parent._self_adapter)
+
+    if PY2:
+        im_func = __func__
+
+class AdapterWrapper(FunctionWrapper):
+
+    __bound_function_wrapper__ = _BoundAdapterWrapper
+
+    def __init__(self, *args, **kwargs):
+        adapter = kwargs.pop('adapter')
+        super(AdapterWrapper, self).__init__(*args, **kwargs)
+        self._self_surrogate = _AdapterFunctionSurrogate(
+                self.__wrapped__, adapter)
+        self._self_adapter = adapter
+
+    @property
+    def __code__(self):
+        return self._self_surrogate.__code__
+
+    @property
+    def __defaults__(self):
+        return self._self_surrogate.__defaults__
+
+    @property
+    def __kwdefaults__(self):
+        return self._self_surrogate.__kwdefaults__
+
+    if PY2:
+        func_code = __code__
+        func_defaults = __defaults__
+
+    @property
+    def __signature__(self):
+        return self._self_surrogate.__signature__
+
+class AdapterFactory(object):
+    def __call__(self, wrapped):
+        raise NotImplementedError()
+
+class DelegatedAdapterFactory(AdapterFactory):
+    def __init__(self, factory):
+        super(DelegatedAdapterFactory, self).__init__()
+        self.factory = factory
+    def __call__(self, wrapped):
+        return self.factory(wrapped)
+
+adapter_factory = DelegatedAdapterFactory
+
+# Decorator for creating other decorators. This decorator and the
+# wrappers which they use are designed to properly preserve any name
+# attributes, function signatures etc, in addition to the wrappers
+# themselves acting like a transparent proxy for the original wrapped
+# function so the wrapper is effectively indistinguishable from the
+# original wrapped function.
+
+def decorator(wrapper=None, enabled=None, adapter=None):
+    # The decorator should be supplied with a single positional argument
+    # which is the wrapper function to be used to implement the
+    # decorator. This may be preceded by a step whereby the keyword
+    # arguments are supplied to customise the behaviour of the
+    # decorator. The 'adapter' argument is used to optionally denote a
+    # separate function which is notionally used by an adapter
+    # decorator. In that case parts of the function '__code__' and
+    # '__defaults__' attributes are used from the adapter function
+    # rather than those of the wrapped function. This allows for the
+    # argument specification from inspect.getargspec() to be overridden
+    # with a prototype for a different function than what was wrapped.
+    # The 'enabled' argument provides a way to enable/disable the use
+    # of the decorator. If the type of 'enabled' is a boolean, then it
+    # is evaluated immediately and the wrapper not even applied if
+    # it is False. If not a boolean, it will be evaluated when the
+    # wrapper is called for an unbound wrapper, and when binding occurs
+    # for a bound wrapper. When being evaluated, if 'enabled' is callable
+    # it will be called to obtain the value to be checked. If False,
+    # the wrapper will not be called and instead the original wrapped
+    # function will be called directly instead.
+
+    if wrapper is not None:
+        # Helper function for creating wrapper of the appropriate
+        # time when we need it down below.
+
+        def _build(wrapped, wrapper, enabled=None, adapter=None):
+            if adapter:
+                if isinstance(adapter, AdapterFactory):
+                    adapter = adapter(wrapped)
+
+                if not callable(adapter):
+                    ns = {}
+                    if not isinstance(adapter, string_types):
+                        adapter = formatargspec(*adapter)
+                    exec_('def adapter{0}: pass'.format(adapter), ns, ns)
+                    adapter = ns['adapter']
+
+                return AdapterWrapper(wrapped=wrapped, wrapper=wrapper,
+                        enabled=enabled, adapter=adapter)
+
+            return FunctionWrapper(wrapped=wrapped, wrapper=wrapper,
+                    enabled=enabled)
+
+        # The wrapper has been provided so return the final decorator.
+        # The decorator is itself one of our function wrappers so we
+        # can determine when it is applied to functions, instance methods
+        # or class methods. This allows us to bind the instance or class
+        # method so the appropriate self or cls attribute is supplied
+        # when it is finally called.
+
+        def _wrapper(wrapped, instance, args, kwargs):
+            # We first check for the case where the decorator was applied
+            # to a class type.
+            #
+            #     @decorator
+            #     class mydecoratorclass(object):
+            #         def __init__(self, arg=None):
+            #             self.arg = arg
+            #         def __call__(self, wrapped, instance, args, kwargs):
+            #             return wrapped(*args, **kwargs)
+            #
+            #     @mydecoratorclass(arg=1)
+            #     def function():
+            #         pass
+            #
+            # In this case an instance of the class is to be used as the
+            # decorator wrapper function. If args was empty at this point,
+            # then it means that there were optional keyword arguments
+            # supplied to be used when creating an instance of the class
+            # to be used as the wrapper function.
+
+            if instance is None and isclass(wrapped) and not args:
+                # We still need to be passed the target function to be
+                # wrapped as yet, so we need to return a further function
+                # to be able to capture it.
+
+                def _capture(target_wrapped):
+                    # Now have the target function to be wrapped and need
+                    # to create an instance of the class which is to act
+                    # as the decorator wrapper function. Before we do that,
+                    # we need to first check that use of the decorator
+                    # hadn't been disabled by a simple boolean. If it was,
+                    # the target function to be wrapped is returned instead.
+                    
+                    _enabled = enabled
+                    if type(_enabled) is bool:
+                        if not _enabled:
+                            return target_wrapped
+                        _enabled = None
+
+                    # Now create an instance of the class which is to act
+                    # as the decorator wrapper function. Any arguments had
+                    # to be supplied as keyword only arguments so that is
+                    # all we pass when creating it.
+
+                    target_wrapper = wrapped(**kwargs)
+
+                    # Finally build the wrapper itself and return it.
+
+                    return _build(target_wrapped, target_wrapper,
+                            _enabled, adapter)
+
+                return _capture
+
+            # We should always have the target function to be wrapped at
+            # this point as the first (and only) value in args.
+
+            target_wrapped = args[0]
+
+            # Need to now check that use of the decorator hadn't been
+            # disabled by a simple boolean. If it was, then target
+            # function to be wrapped is returned instead.
+
+            _enabled = enabled
+            if type(_enabled) is bool:
+                if not _enabled:
+                    return target_wrapped
+                _enabled = None
+
+            # We now need to build the wrapper, but there are a couple of
+            # different cases we need to consider.
+
+            if instance is None:
+                if isclass(wrapped):
+                    # In this case the decorator was applied to a class
+                    # type but optional keyword arguments were not supplied
+                    # for initialising an instance of the class to be used
+                    # as the decorator wrapper function.
+                    #
+                    #     @decorator
+                    #     class mydecoratorclass(object):
+                    #         def __init__(self, arg=None):
+                    #             self.arg = arg
+                    #         def __call__(self, wrapped, instance,
+                    #                 args, kwargs):
+                    #             return wrapped(*args, **kwargs)
+                    #
+                    #     @mydecoratorclass
+                    #     def function():
+                    #         pass
+                    #
+                    # We still need to create an instance of the class to
+                    # be used as the decorator wrapper function, but no
+                    # arguments are pass.
+
+                    target_wrapper = wrapped()
+
+                else:
+                    # In this case the decorator was applied to a normal
+                    # function, or possibly a static method of a class.
+                    #
+                    #     @decorator
+                    #     def mydecoratorfuntion(wrapped, instance,
+                    #             args, kwargs):
+                    #         return wrapped(*args, **kwargs)
+                    #
+                    #     @mydecoratorfunction
+                    #     def function():
+                    #         pass
+                    #
+                    # That normal function becomes the decorator wrapper
+                    # function.
+
+                    target_wrapper = wrapper
+
+            else:
+                if isclass(instance):
+                    # In this case the decorator was applied to a class
+                    # method.
+                    #
+                    #     class myclass(object):
+                    #         @decorator
+                    #         @classmethod
+                    #         def decoratorclassmethod(cls, wrapped,
+                    #                 instance, args, kwargs):
+                    #             return wrapped(*args, **kwargs)
+                    #
+                    #     instance = myclass()
+                    #
+                    #     @instance.decoratorclassmethod
+                    #     def function():
+                    #         pass
+                    #
+                    # This one is a bit strange because binding was actually
+                    # performed on the wrapper created by our decorator
+                    # factory. We need to apply that binding to the decorator
+                    # wrapper function which which the decorator factory
+                    # was applied to.
+
+                    target_wrapper = wrapper.__get__(None, instance)
+
+                else:
+                    # In this case the decorator was applied to an instance
+                    # method.
+                    #
+                    #     class myclass(object):
+                    #         @decorator
+                    #         def decoratorclassmethod(self, wrapped,
+                    #                 instance, args, kwargs):
+                    #             return wrapped(*args, **kwargs)
+                    #
+                    #     instance = myclass()
+                    #
+                    #     @instance.decoratorclassmethod
+                    #     def function():
+                    #         pass
+                    #
+                    # This one is a bit strange because binding was actually
+                    # performed on the wrapper created by our decorator
+                    # factory. We need to apply that binding to the decorator
+                    # wrapper function which which the decorator factory
+                    # was applied to.
+
+                    target_wrapper = wrapper.__get__(instance, type(instance))
+
+            # Finally build the wrapper itself and return it.
+
+            return _build(target_wrapped, target_wrapper, _enabled, adapter)
+
+        # We first return our magic function wrapper here so we can
+        # determine in what context the decorator factory was used. In
+        # other words, it is itself a universal decorator.
+
+        return _build(wrapper, _wrapper)
+
+    else:
+        # The wrapper still has not been provided, so we are just
+        # collecting the optional keyword arguments. Return the
+        # decorator again wrapped in a partial using the collected
+        # arguments.
+
+        return partial(decorator, enabled=enabled, adapter=adapter)
+
+# Decorator for implementing thread synchronization. It can be used as a
+# decorator, in which case the synchronization context is determined by
+# what type of function is wrapped, or it can also be used as a context
+# manager, where the user needs to supply the correct synchronization
+# context. It is also possible to supply an object which appears to be a
+# synchronization primitive of some sort, by virtue of having release()
+# and acquire() methods. In that case that will be used directly as the
+# synchronization primitive without creating a separate lock against the
+# derived or supplied context.
+
+def synchronized(wrapped):
+    # Determine if being passed an object which is a synchronization
+    # primitive. We can't check by type for Lock, RLock, Semaphore etc,
+    # as the means of creating them isn't the type. Therefore use the
+    # existence of acquire() and release() methods. This is more
+    # extensible anyway as it allows custom synchronization mechanisms.
+
+    if hasattr(wrapped, 'acquire') and hasattr(wrapped, 'release'):
+        # We remember what the original lock is and then return a new
+        # decorator which acceses and locks it. When returning the new
+        # decorator we wrap it with an object proxy so we can override
+        # the context manager methods in case it is being used to wrap
+        # synchronized statements with a 'with' statement.
+
+        lock = wrapped
+
+        @decorator
+        def _synchronized(wrapped, instance, args, kwargs):
+            # Execute the wrapped function while the original supplied
+            # lock is held.
+
+            with lock:
+                return wrapped(*args, **kwargs)
+
+        class _PartialDecorator(CallableObjectProxy):
+
+            def __enter__(self):
+                lock.acquire()
+                return lock
+
+            def __exit__(self, *args):
+                lock.release()
+
+        return _PartialDecorator(wrapped=_synchronized)
+
+    # Following only apply when the lock is being created automatically
+    # based on the context of what was supplied. In this case we supply
+    # a final decorator, but need to use FunctionWrapper directly as we
+    # want to derive from it to add context manager methods in in case it is
+    # being used to wrap synchronized statements with a 'with' statement.
+
+    def _synchronized_lock(context):
+        # Attempt to retrieve the lock for the specific context.
+
+        lock = vars(context).get('_synchronized_lock', None)
+
+        if lock is None:
+            # There is no existing lock defined for the context we
+            # are dealing with so we need to create one. This needs
+            # to be done in a way to guarantee there is only one
+            # created, even if multiple threads try and create it at
+            # the same time. We can't always use the setdefault()
+            # method on the __dict__ for the context. This is the
+            # case where the context is a class, as __dict__ is
+            # actually a dictproxy. What we therefore do is use a
+            # meta lock on this wrapper itself, to control the
+            # creation and assignment of the lock attribute against
+            # the context.
+
+            meta_lock = vars(synchronized).setdefault(
+                    '_synchronized_meta_lock', Lock())
+
+            with meta_lock:
+                # We need to check again for whether the lock we want
+                # exists in case two threads were trying to create it
+                # at the same time and were competing to create the
+                # meta lock.
+
+                lock = vars(context).get('_synchronized_lock', None)
+
+                if lock is None:
+                    lock = RLock()
+                    setattr(context, '_synchronized_lock', lock)
+
+        return lock
+
+    def _synchronized_wrapper(wrapped, instance, args, kwargs):
+        # Execute the wrapped function while the lock for the
+        # desired context is held. If instance is None then the
+        # wrapped function is used as the context.
+
+        with _synchronized_lock(instance or wrapped):
+            return wrapped(*args, **kwargs)
+
+    class _FinalDecorator(FunctionWrapper):
+
+        def __enter__(self):
+            self._self_lock = _synchronized_lock(self.__wrapped__)
+            self._self_lock.acquire()
+            return self._self_lock
+
+        def __exit__(self, *args):
+            self._self_lock.release()
+
+    return _FinalDecorator(wrapped=wrapped, wrapper=_synchronized_wrapper)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/_wrappers.c
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/_wrappers.c	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/_wrappers.c	(revision 1126)
@@ -0,0 +1,2729 @@
+/* ------------------------------------------------------------------------- */
+
+#include "Python.h"
+
+#include "structmember.h"
+
+#ifndef PyVarObject_HEAD_INIT
+#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+typedef struct {
+    PyObject_HEAD
+
+    PyObject *dict;
+    PyObject *wrapped;
+    PyObject *weakreflist;
+} WraptObjectProxyObject;
+
+PyTypeObject WraptObjectProxy_Type;
+PyTypeObject WraptCallableObjectProxy_Type;
+
+typedef struct {
+    WraptObjectProxyObject object_proxy;
+
+    PyObject *instance;
+    PyObject *wrapper;
+    PyObject *enabled;
+    PyObject *binding;
+    PyObject *parent;
+} WraptFunctionWrapperObject;
+
+PyTypeObject WraptFunctionWrapperBase_Type;
+PyTypeObject WraptBoundFunctionWrapper_Type;
+PyTypeObject WraptFunctionWrapper_Type;
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_new(PyTypeObject *type,
+        PyObject *args, PyObject *kwds)
+{
+    WraptObjectProxyObject *self;
+
+    self = (WraptObjectProxyObject *)type->tp_alloc(type, 0);
+
+    if (!self)
+        return NULL;
+
+    self->dict = PyDict_New();
+    self->wrapped = NULL;
+    self->weakreflist = NULL;
+
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_raw_init(WraptObjectProxyObject *self,
+        PyObject *wrapped)
+{
+    static PyObject *module_str = NULL;
+    static PyObject *doc_str = NULL;
+
+    PyObject *object = NULL;
+
+    Py_INCREF(wrapped);
+    Py_XDECREF(self->wrapped);
+    self->wrapped = wrapped;
+
+    if (!module_str) {
+#if PY_MAJOR_VERSION >= 3
+        module_str = PyUnicode_InternFromString("__module__");
+#else
+        module_str = PyString_InternFromString("__module__");
+#endif
+    }
+
+    if (!doc_str) {
+#if PY_MAJOR_VERSION >= 3
+        doc_str = PyUnicode_InternFromString("__doc__");
+#else
+        doc_str = PyString_InternFromString("__doc__");
+#endif
+    }
+
+    object = PyObject_GetAttr(wrapped, module_str);
+
+    if (object) {
+        if (PyDict_SetItem(self->dict, module_str, object) == -1) {
+            Py_DECREF(object);
+            return -1;
+        }
+        Py_DECREF(object);
+    }
+    else
+        PyErr_Clear();
+
+    object = PyObject_GetAttr(wrapped, doc_str);
+
+    if (object) {
+        if (PyDict_SetItem(self->dict, doc_str, object) == -1) {
+            Py_DECREF(object);
+            return -1;
+        }
+        Py_DECREF(object);
+    }
+    else
+        PyErr_Clear();
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_init(WraptObjectProxyObject *self,
+        PyObject *args, PyObject *kwds)
+{
+    PyObject *wrapped = NULL;
+
+    static char *kwlist[] = { "wrapped", NULL };
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:ObjectProxy",
+            kwlist, &wrapped)) {
+        return -1;
+    }
+
+    return WraptObjectProxy_raw_init(self, wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_traverse(WraptObjectProxyObject *self,
+        visitproc visit, void *arg)
+{
+    Py_VISIT(self->dict);
+    Py_VISIT(self->wrapped);
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_clear(WraptObjectProxyObject *self)
+{
+    Py_CLEAR(self->dict);
+    Py_CLEAR(self->wrapped);
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static void WraptObjectProxy_dealloc(WraptObjectProxyObject *self)
+{
+    PyObject_GC_UnTrack(self);
+
+    if (self->weakreflist != NULL)
+        PyObject_ClearWeakRefs((PyObject *)self);
+
+    WraptObjectProxy_clear(self);
+
+    Py_TYPE(self)->tp_free(self);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_repr(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromFormat("<%s at %p for %s at %p>",
+            Py_TYPE(self)->tp_name, self,
+            Py_TYPE(self->wrapped)->tp_name, self->wrapped);
+#else
+    return PyString_FromFormat("<%s at %p for %s at %p>",
+            Py_TYPE(self)->tp_name, self,
+            Py_TYPE(self->wrapped)->tp_name, self->wrapped);
+#endif
+}
+
+/* ------------------------------------------------------------------------- */
+
+static long WraptObjectProxy_hash(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PyObject_Hash(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_str(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_Str(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_add(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Add(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_subtract(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+
+    return PyNumber_Subtract(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_multiply(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Multiply(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *WraptObjectProxy_divide(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Divide(o1, o2);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_remainder(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Remainder(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_divmod(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Divmod(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_power(PyObject *o1, PyObject *o2,
+        PyObject *modulo)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Power(o1, o2, modulo);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_negative(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Negative(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_positive(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Positive(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_absolute(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Absolute(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_bool(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PyObject_IsTrue(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_invert(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Invert(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_lshift(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Lshift(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_rshift(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Rshift(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_and(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_And(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_xor(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Xor(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_or(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_Or(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *WraptObjectProxy_int(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Int(self->wrapped);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_long(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Long(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_float(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Float(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *WraptObjectProxy_oct(WraptObjectProxyObject *self)
+{
+    PyNumberMethods *nb;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if ((nb = self->wrapped->ob_type->tp_as_number) == NULL ||
+        nb->nb_oct == NULL) {
+        PyErr_SetString(PyExc_TypeError,
+                   "oct() argument can't be converted to oct");
+        return NULL;
+    }
+
+    return (*nb->nb_oct)(self->wrapped);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *WraptObjectProxy_hex(WraptObjectProxyObject *self)
+{
+    PyNumberMethods *nb;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if ((nb = self->wrapped->ob_type->tp_as_number) == NULL ||
+        nb->nb_hex == NULL) {
+        PyErr_SetString(PyExc_TypeError,
+                   "hex() argument can't be converted to hex");
+        return NULL;
+    }
+
+    return (*nb->nb_hex)(self->wrapped);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_add(WraptObjectProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceAdd(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_subtract(
+        WraptObjectProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceSubtract(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_multiply(
+        WraptObjectProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceMultiply(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *WraptObjectProxy_inplace_divide(
+        WraptObjectProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceDivide(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_remainder(
+        WraptObjectProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceRemainder(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_power(WraptObjectProxyObject *self,
+        PyObject *other, PyObject *modulo)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlacePower(self->wrapped, other, modulo);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_lshift(WraptObjectProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceLshift(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_rshift(WraptObjectProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceRshift(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_and(WraptObjectProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceAnd(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_xor(WraptObjectProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceXor(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_or(WraptObjectProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceOr(self->wrapped, other);
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_floor_divide(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_FloorDivide(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_true_divide(PyObject *o1, PyObject *o2)
+{
+    if (!((WraptObjectProxyObject *)o1)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (!((WraptObjectProxyObject *)o2)->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type))
+        o1 = ((WraptObjectProxyObject *)o1)->wrapped;
+
+    if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type))
+        o2 = ((WraptObjectProxyObject *)o2)->wrapped;
+
+    return PyNumber_TrueDivide(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_floor_divide(
+        WraptObjectProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceFloorDivide(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_inplace_true_divide(
+        WraptObjectProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type))
+        other = ((WraptObjectProxyObject *)other)->wrapped;
+
+    object = PyNumber_InPlaceTrueDivide(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_index(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyNumber_Index(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static Py_ssize_t WraptObjectProxy_length(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PyObject_Length(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_contains(WraptObjectProxyObject *self,
+        PyObject *value)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PySequence_Contains(self->wrapped, value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_getitem(WraptObjectProxyObject *self,
+        PyObject *key)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetItem(self->wrapped, key);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_setitem(WraptObjectProxyObject *self,
+        PyObject *key, PyObject* value)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    if (value == NULL)
+        return PyObject_DelItem(self->wrapped, key);
+    else
+        return PyObject_SetItem(self->wrapped, key, value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_dir(
+        WraptObjectProxyObject *self, PyObject *args)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_Dir(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_enter(
+        WraptObjectProxyObject *self, PyObject *args, PyObject *kwds)
+{
+    PyObject *method = NULL;
+    PyObject *result = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    method = PyObject_GetAttrString(self->wrapped, "__enter__");
+
+    if (!method)
+        return NULL;
+
+    result = PyObject_Call(method, args, kwds);
+
+    Py_DECREF(method);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_exit(
+        WraptObjectProxyObject *self, PyObject *args, PyObject *kwds)
+{
+    PyObject *method = NULL;
+    PyObject *result = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    method = PyObject_GetAttrString(self->wrapped, "__exit__");
+
+    if (!method)
+        return NULL;
+
+    result = PyObject_Call(method, args, kwds);
+
+    Py_DECREF(method);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_bytes(
+        WraptObjectProxyObject *self, PyObject *args)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_Bytes(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_reversed(
+        WraptObjectProxyObject *self, PyObject *args)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_CallFunctionObjArgs((PyObject *)&PyReversed_Type,
+            self->wrapped, NULL);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION >= 3
+static PyObject *WraptObjectProxy_round(
+        WraptObjectProxyObject *self, PyObject *args)
+{
+    PyObject *module = NULL;
+    PyObject *dict = NULL;
+    PyObject *round = NULL;
+
+    PyObject *result = NULL;
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    module = PyImport_ImportModule("builtins");
+
+    if (!module)
+        return NULL;
+
+    dict = PyModule_GetDict(module);
+    round = PyDict_GetItemString(dict, "round");
+
+    if (!round) {
+        Py_DECREF(module);
+        return NULL;
+    }
+
+    Py_INCREF(round);
+    Py_DECREF(module);
+
+    result = PyObject_CallFunctionObjArgs(round, self->wrapped, NULL);
+
+    Py_DECREF(round);
+
+    return result;
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_get_name(
+        WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetAttrString(self->wrapped, "__name__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_set_name(WraptObjectProxyObject *self,
+        PyObject *value)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PyObject_SetAttrString(self->wrapped, "__name__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_get_qualname(
+        WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetAttrString(self->wrapped, "__qualname__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_set_qualname(WraptObjectProxyObject *self,
+        PyObject *value)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PyObject_SetAttrString(self->wrapped, "__qualname__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_get_module(
+        WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetAttrString(self->wrapped, "__module__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_set_module(WraptObjectProxyObject *self,
+        PyObject *value)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    if (PyObject_SetAttrString(self->wrapped, "__module__", value) == -1)
+        return -1;
+
+    return PyDict_SetItemString(self->dict, "__module__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_get_doc(
+        WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetAttrString(self->wrapped, "__doc__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_set_doc(WraptObjectProxyObject *self,
+        PyObject *value)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    if (PyObject_SetAttrString(self->wrapped, "__doc__", value) == -1)
+        return -1;
+
+    return PyDict_SetItemString(self->dict, "__doc__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_get_class(
+        WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetAttrString(self->wrapped, "__class__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_get_annotations(
+        WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetAttrString(self->wrapped, "__annotations__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_set_annotations(WraptObjectProxyObject *self,
+        PyObject *value)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PyObject_SetAttrString(self->wrapped, "__annotations__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_get_wrapped(
+        WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    Py_INCREF(self->wrapped);
+    return self->wrapped;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_set_wrapped(WraptObjectProxyObject *self,
+        PyObject *value)
+{
+    if (!value) {
+        PyErr_SetString(PyExc_TypeError, "__wrapped__ must be an object");
+        return -1;
+    }
+
+    Py_INCREF(value);
+    Py_XDECREF(self->wrapped);
+
+    self->wrapped = value;
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_getattro(
+        WraptObjectProxyObject *self, PyObject *name)
+{
+    PyObject *object = NULL;
+    PyObject *result = NULL;
+
+    static PyObject *getattr_str = NULL;
+
+    object = PyObject_GenericGetAttr((PyObject *)self, name);
+
+    if (object)
+        return object;
+
+    PyErr_Clear();
+
+    if (!getattr_str) {
+#if PY_MAJOR_VERSION >= 3
+        getattr_str = PyUnicode_InternFromString("__getattr__");
+#else
+        getattr_str = PyString_InternFromString("__getattr__");
+#endif
+    }
+
+    object = PyObject_GenericGetAttr((PyObject *)self, getattr_str);
+
+    if (!object)
+        return NULL;
+
+    result = PyObject_CallFunctionObjArgs(object, name, NULL);
+
+    Py_DECREF(object);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_getattr(
+        WraptObjectProxyObject *self, PyObject *args)
+{
+    PyObject *name = NULL;
+
+#if PY_MAJOR_VERSION >= 3
+    if (!PyArg_ParseTuple(args, "U:__getattr__", &name))
+        return NULL;
+#else
+    if (!PyArg_ParseTuple(args, "S:__getattr__", &name))
+        return NULL;
+#endif
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetAttr(self->wrapped, name);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptObjectProxy_setattro(
+        WraptObjectProxyObject *self, PyObject *name, PyObject *value)
+{
+    static PyObject *self_str = NULL;
+    static PyObject *wrapped_str = NULL;
+    static PyObject *startswith_str = NULL;
+
+    PyObject *match = NULL;
+
+    if (!startswith_str) {
+#if PY_MAJOR_VERSION >= 3
+        startswith_str = PyUnicode_InternFromString("startswith");
+#else
+        startswith_str = PyString_InternFromString("startswith");
+#endif
+    }
+
+    if (!self_str) {
+#if PY_MAJOR_VERSION >= 3
+        self_str = PyUnicode_InternFromString("_self_");
+#else
+        self_str = PyString_InternFromString("_self_");
+#endif
+    }
+
+    match = PyObject_CallMethodObjArgs(name, startswith_str, self_str, NULL);
+
+    if (match == Py_True) {
+        Py_DECREF(match);
+
+        return PyObject_GenericSetAttr((PyObject *)self, name, value);
+    }
+    else if (!match)
+        PyErr_Clear();
+
+    Py_XDECREF(match);
+
+    if (!wrapped_str) {
+#if PY_MAJOR_VERSION >= 3
+        wrapped_str = PyUnicode_InternFromString("__wrapped__");
+#else
+        wrapped_str = PyString_InternFromString("__wrapped__");
+#endif
+    }
+
+    if (PyObject_HasAttr((PyObject *)Py_TYPE(self), name))
+        return PyObject_GenericSetAttr((PyObject *)self, name, value);
+
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return -1;
+    }
+
+    return PyObject_SetAttr(self->wrapped, name, value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_richcompare(WraptObjectProxyObject *self,
+        PyObject *other, int opcode)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_RichCompare(self->wrapped, other, opcode);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptObjectProxy_iter(WraptObjectProxyObject *self)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_GetIter(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyNumberMethods WraptObjectProxy_as_number = {
+    (binaryfunc)WraptObjectProxy_add, /*nb_add*/
+    (binaryfunc)WraptObjectProxy_subtract, /*nb_subtract*/
+    (binaryfunc)WraptObjectProxy_multiply, /*nb_multiply*/
+#if PY_MAJOR_VERSION < 3
+    (binaryfunc)WraptObjectProxy_divide, /*nb_divide*/
+#endif
+    (binaryfunc)WraptObjectProxy_remainder, /*nb_remainder*/
+    (binaryfunc)WraptObjectProxy_divmod, /*nb_divmod*/
+    (ternaryfunc)WraptObjectProxy_power, /*nb_power*/
+    (unaryfunc)WraptObjectProxy_negative, /*nb_negative*/
+    (unaryfunc)WraptObjectProxy_positive, /*nb_positive*/
+    (unaryfunc)WraptObjectProxy_absolute, /*nb_absolute*/
+    (inquiry)WraptObjectProxy_bool, /*nb_nonzero/nb_bool*/
+    (unaryfunc)WraptObjectProxy_invert, /*nb_invert*/
+    (binaryfunc)WraptObjectProxy_lshift, /*nb_lshift*/
+    (binaryfunc)WraptObjectProxy_rshift, /*nb_rshift*/
+    (binaryfunc)WraptObjectProxy_and, /*nb_and*/
+    (binaryfunc)WraptObjectProxy_xor, /*nb_xor*/
+    (binaryfunc)WraptObjectProxy_or, /*nb_or*/
+#if PY_MAJOR_VERSION < 3
+    0,                      /*nb_coerce*/
+#endif
+#if PY_MAJOR_VERSION < 3
+    (unaryfunc)WraptObjectProxy_int, /*nb_int*/
+    (unaryfunc)WraptObjectProxy_long, /*nb_long*/
+#else
+    (unaryfunc)WraptObjectProxy_long, /*nb_int*/
+    0,                      /*nb_long/nb_reserved*/
+#endif
+    (unaryfunc)WraptObjectProxy_float, /*nb_float*/
+#if PY_MAJOR_VERSION < 3
+    (unaryfunc)WraptObjectProxy_oct, /*nb_oct*/
+    (unaryfunc)WraptObjectProxy_hex, /*nb_hex*/
+#endif
+    (binaryfunc)WraptObjectProxy_inplace_add, /*nb_inplace_add*/
+    (binaryfunc)WraptObjectProxy_inplace_subtract, /*nb_inplace_subtract*/
+    (binaryfunc)WraptObjectProxy_inplace_multiply, /*nb_inplace_multiply*/
+#if PY_MAJOR_VERSION < 3
+    (binaryfunc)WraptObjectProxy_inplace_divide, /*nb_inplace_divide*/
+#endif
+    (binaryfunc)WraptObjectProxy_inplace_remainder, /*nb_inplace_remainder*/
+    (ternaryfunc)WraptObjectProxy_inplace_power, /*nb_inplace_power*/
+    (binaryfunc)WraptObjectProxy_inplace_lshift, /*nb_inplace_lshift*/
+    (binaryfunc)WraptObjectProxy_inplace_rshift, /*nb_inplace_rshift*/
+    (binaryfunc)WraptObjectProxy_inplace_and, /*nb_inplace_and*/
+    (binaryfunc)WraptObjectProxy_inplace_xor, /*nb_inplace_xor*/
+    (binaryfunc)WraptObjectProxy_inplace_or, /*nb_inplace_or*/
+    (binaryfunc)WraptObjectProxy_floor_divide, /*nb_floor_divide*/
+    (binaryfunc)WraptObjectProxy_true_divide, /*nb_true_divide*/
+    (binaryfunc)WraptObjectProxy_inplace_floor_divide, /*nb_inplace_floor_divide*/
+    (binaryfunc)WraptObjectProxy_inplace_true_divide, /*nb_inplace_true_divide*/
+    (unaryfunc)WraptObjectProxy_index, /*nb_index*/
+};
+
+static PySequenceMethods WraptObjectProxy_as_sequence = {
+    (lenfunc)WraptObjectProxy_length, /*sq_length*/
+    0,                          /*sq_concat*/
+    0,                          /*sq_repeat*/
+    0,                          /*sq_item*/
+    0,                          /*sq_slice*/
+    0,                          /*sq_ass_item*/
+    0,                          /*sq_ass_slice*/
+    (objobjproc)WraptObjectProxy_contains, /* sq_contains */
+};
+
+static PyMappingMethods WraptObjectProxy_as_mapping = {
+    (lenfunc)WraptObjectProxy_length, /*mp_length*/
+    (binaryfunc)WraptObjectProxy_getitem, /*mp_subscript*/
+    (objobjargproc)WraptObjectProxy_setitem, /*mp_ass_subscript*/
+};
+
+static PyMethodDef WraptObjectProxy_methods[] = {
+    { "__dir__",    (PyCFunction)WraptObjectProxy_dir, METH_NOARGS, 0 },
+    { "__enter__",  (PyCFunction)WraptObjectProxy_enter,
+                    METH_VARARGS | METH_KEYWORDS, 0 },
+    { "__exit__",   (PyCFunction)WraptObjectProxy_exit,
+                    METH_VARARGS | METH_KEYWORDS, 0 },
+    { "__getattr__", (PyCFunction)WraptObjectProxy_getattr,
+                    METH_VARARGS , 0 },
+    { "__bytes__",  (PyCFunction)WraptObjectProxy_bytes, METH_NOARGS, 0 },
+    { "__reversed__", (PyCFunction)WraptObjectProxy_reversed, METH_NOARGS, 0 },
+#if PY_MAJOR_VERSION >= 3
+    { "__round__",  (PyCFunction)WraptObjectProxy_round, METH_NOARGS, 0 },
+#endif
+    { NULL, NULL },
+};
+
+static PyGetSetDef WraptObjectProxy_getset[] = {
+    { "__name__",           (getter)WraptObjectProxy_get_name,
+                            (setter)WraptObjectProxy_set_name, 0 },
+    { "__qualname__",       (getter)WraptObjectProxy_get_qualname,
+                            (setter)WraptObjectProxy_set_qualname, 0 },
+    { "__module__",         (getter)WraptObjectProxy_get_module,
+                            (setter)WraptObjectProxy_set_module, 0 },
+    { "__doc__",            (getter)WraptObjectProxy_get_doc,
+                            (setter)WraptObjectProxy_set_doc, 0 },
+    { "__class__",          (getter)WraptObjectProxy_get_class,
+                            NULL, 0 },
+    { "__annotations__",    (getter)WraptObjectProxy_get_annotations,
+                            (setter)WraptObjectProxy_set_annotations, 0 },
+    { "__wrapped__",        (getter)WraptObjectProxy_get_wrapped,
+                            (setter)WraptObjectProxy_set_wrapped, 0 },
+    { NULL },
+};
+
+PyTypeObject WraptObjectProxy_Type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "ObjectProxy",          /*tp_name*/
+    sizeof(WraptObjectProxyObject), /*tp_basicsize*/
+    0,                      /*tp_itemsize*/
+    /* methods */
+    (destructor)WraptObjectProxy_dealloc, /*tp_dealloc*/
+    0,                      /*tp_print*/
+    0,                      /*tp_getattr*/
+    0,                      /*tp_setattr*/
+    0,                      /*tp_compare*/
+    (unaryfunc)WraptObjectProxy_repr, /*tp_repr*/
+    &WraptObjectProxy_as_number, /*tp_as_number*/
+    &WraptObjectProxy_as_sequence, /*tp_as_sequence*/
+    &WraptObjectProxy_as_mapping, /*tp_as_mapping*/
+    (hashfunc)WraptObjectProxy_hash, /*tp_hash*/
+    0,                      /*tp_call*/
+    (unaryfunc)WraptObjectProxy_str, /*tp_str*/
+    (getattrofunc)WraptObjectProxy_getattro, /*tp_getattro*/
+    (setattrofunc)WraptObjectProxy_setattro, /*tp_setattro*/
+    0,                      /*tp_as_buffer*/
+#if PY_MAJOR_VERSION < 3
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+        Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
+#else
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+        Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+#endif
+    0,                      /*tp_doc*/
+    (traverseproc)WraptObjectProxy_traverse, /*tp_traverse*/
+    (inquiry)WraptObjectProxy_clear, /*tp_clear*/
+    (richcmpfunc)WraptObjectProxy_richcompare, /*tp_richcompare*/
+    offsetof(WraptObjectProxyObject, weakreflist), /*tp_weaklistoffset*/
+    (getiterfunc)WraptObjectProxy_iter, /*tp_iter*/
+    0,                      /*tp_iternext*/
+    WraptObjectProxy_methods, /*tp_methods*/
+    0,                      /*tp_members*/
+    WraptObjectProxy_getset, /*tp_getset*/
+    0,                      /*tp_base*/
+    0,                      /*tp_dict*/
+    0,                      /*tp_descr_get*/
+    0,                      /*tp_descr_set*/
+    offsetof(WraptObjectProxyObject, dict), /*tp_dictoffset*/
+    (initproc)WraptObjectProxy_init, /*tp_init*/
+    PyType_GenericAlloc,    /*tp_alloc*/
+    WraptObjectProxy_new,   /*tp_new*/
+    PyObject_GC_Del,        /*tp_free*/
+    0,                      /*tp_is_gc*/
+};
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptCallableObjectProxy_call(
+        WraptObjectProxyObject *self, PyObject *args, PyObject *kwds)
+{
+    if (!self->wrapped) {
+      PyErr_SetString(PyExc_ValueError, "wrapper has not been initialized");
+      return NULL;
+    }
+
+    return PyObject_Call(self->wrapped, args, kwds);
+}
+
+/* ------------------------------------------------------------------------- */;
+
+static PyGetSetDef WraptCallableObjectProxy_getset[] = {
+    { "__module__",         (getter)WraptObjectProxy_get_module,
+                            (setter)WraptObjectProxy_set_module, 0 },
+    { "__doc__",            (getter)WraptObjectProxy_get_doc,
+                            (setter)WraptObjectProxy_set_doc, 0 },
+    { NULL },
+};
+
+PyTypeObject WraptCallableObjectProxy_Type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CallableObjectProxy",   /*tp_name*/
+    sizeof(WraptObjectProxyObject), /*tp_basicsize*/
+    0,                      /*tp_itemsize*/
+    /* methods */
+    0,                      /*tp_dealloc*/
+    0,                      /*tp_print*/
+    0,                      /*tp_getattr*/
+    0,                      /*tp_setattr*/
+    0,                      /*tp_compare*/
+    0,                      /*tp_repr*/
+    0,                      /*tp_as_number*/
+    0,                      /*tp_as_sequence*/
+    0,                      /*tp_as_mapping*/
+    0,                      /*tp_hash*/
+    (ternaryfunc)WraptCallableObjectProxy_call, /*tp_call*/
+    0,                      /*tp_str*/
+    0,                      /*tp_getattro*/
+    0,                      /*tp_setattro*/
+    0,                      /*tp_as_buffer*/
+#if PY_MAJOR_VERSION < 3
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
+#else
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+#endif
+    0,                      /*tp_doc*/
+    0,                      /*tp_traverse*/
+    0,                      /*tp_clear*/
+    0,                      /*tp_richcompare*/
+    offsetof(WraptObjectProxyObject, weakreflist), /*tp_weaklistoffset*/
+    0,                      /*tp_iter*/
+    0,                      /*tp_iternext*/
+    0,                      /*tp_methods*/
+    0,                      /*tp_members*/
+    WraptCallableObjectProxy_getset, /*tp_getset*/
+    0,                      /*tp_base*/
+    0,                      /*tp_dict*/
+    0,                      /*tp_descr_get*/
+    0,                      /*tp_descr_set*/
+    0,                      /*tp_dictoffset*/
+    (initproc)WraptObjectProxy_init, /*tp_init*/
+    0,                      /*tp_alloc*/
+    0,                      /*tp_new*/
+    0,                      /*tp_free*/
+    0,                      /*tp_is_gc*/
+};
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_new(PyTypeObject *type,
+        PyObject *args, PyObject *kwds)
+{
+    WraptFunctionWrapperObject *self;
+
+    self = (WraptFunctionWrapperObject *)WraptObjectProxy_new(type,
+            args, kwds);
+
+    if (!self)
+        return NULL;
+
+    self->instance = NULL;
+    self->wrapper = NULL;
+    self->enabled = NULL;
+    self->binding = NULL;
+    self->parent = NULL;
+
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptFunctionWrapperBase_raw_init(WraptFunctionWrapperObject *self,
+        PyObject *wrapped, PyObject *instance, PyObject *wrapper,
+         PyObject *enabled, PyObject *binding, PyObject *parent)
+{
+    int result = 0;
+
+    result = WraptObjectProxy_raw_init((WraptObjectProxyObject *)self,
+            wrapped);
+
+    if (result == 0) {
+        Py_INCREF(instance);
+        Py_XDECREF(self->instance);
+        self->instance = instance;
+
+        Py_INCREF(wrapper);
+        Py_XDECREF(self->wrapper);
+        self->wrapper = wrapper;
+
+        Py_INCREF(enabled);
+        Py_XDECREF(self->enabled);
+        self->enabled = enabled;
+
+        Py_INCREF(binding);
+        Py_XDECREF(self->binding);
+        self->binding = binding;
+
+        Py_INCREF(parent);
+        Py_XDECREF(self->parent);
+        self->parent = parent;
+    }
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptFunctionWrapperBase_init(WraptFunctionWrapperObject *self,
+        PyObject *args, PyObject *kwds)
+{
+    PyObject *wrapped = NULL;
+    PyObject *instance = NULL;
+    PyObject *wrapper = NULL;
+    PyObject *enabled = Py_None;
+    PyObject *binding = NULL;
+    PyObject *parent = Py_None;
+
+    static PyObject *function_str = NULL;
+
+    static char *kwlist[] = { "wrapped", "instance", "wrapper",
+            "enabled", "binding", "parent", NULL };
+
+    if (!function_str) {
+#if PY_MAJOR_VERSION >= 3
+        function_str = PyUnicode_InternFromString("function");
+#else
+        function_str = PyString_InternFromString("function");
+#endif
+    }
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds,
+            "OOO|OOO:FunctionWrapperBase", kwlist, &wrapped, &instance,
+            &wrapper, &enabled, &binding, &parent)) {
+        return -1;
+    }
+
+    if (!binding)
+        binding = function_str;
+
+    return WraptFunctionWrapperBase_raw_init(self, wrapped, instance, wrapper,
+            enabled, binding, parent);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptFunctionWrapperBase_traverse(WraptFunctionWrapperObject *self,
+        visitproc visit, void *arg)
+{
+    WraptObjectProxy_traverse((WraptObjectProxyObject *)self, visit, arg);
+
+    Py_VISIT(self->instance);
+    Py_VISIT(self->wrapper);
+    Py_VISIT(self->enabled);
+    Py_VISIT(self->binding);
+    Py_VISIT(self->parent);
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptFunctionWrapperBase_clear(WraptFunctionWrapperObject *self)
+{
+    WraptObjectProxy_clear((WraptObjectProxyObject *)self);
+
+    Py_CLEAR(self->instance);
+    Py_CLEAR(self->wrapper);
+    Py_CLEAR(self->enabled);
+    Py_CLEAR(self->binding);
+    Py_CLEAR(self->parent);
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static void WraptFunctionWrapperBase_dealloc(WraptFunctionWrapperObject *self)
+{
+    WraptFunctionWrapperBase_clear(self);
+
+    WraptObjectProxy_dealloc((WraptObjectProxyObject *)self);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_call(
+        WraptFunctionWrapperObject *self, PyObject *args, PyObject *kwds)
+{
+    PyObject *param_kwds = NULL;
+
+    PyObject *result = NULL;
+
+    static PyObject *function_str = NULL;
+
+    if (!function_str) {
+#if PY_MAJOR_VERSION >= 3
+        function_str = PyUnicode_InternFromString("function");
+#else
+        function_str = PyString_InternFromString("function");
+#endif
+    }
+
+    if (self->enabled != Py_None) {
+        if (PyCallable_Check(self->enabled)) {
+            PyObject *object = NULL;
+
+            object = PyObject_CallFunctionObjArgs(self->enabled, NULL);
+
+            if (!object)
+                return NULL;
+
+            if (PyObject_Not(object)) {
+                Py_DECREF(object);
+                return PyObject_Call(self->object_proxy.wrapped, args, kwds);
+            }
+
+            Py_DECREF(object);
+        }
+        else if (PyObject_Not(self->enabled)) {
+            return PyObject_Call(self->object_proxy.wrapped, args, kwds);
+        }
+    }
+
+    if (!kwds) {
+        param_kwds = PyDict_New();
+        kwds = param_kwds;
+    }
+
+    if (self->instance == Py_None && (self->binding == function_str ||
+            PyObject_RichCompareBool(self->binding, function_str,
+            Py_EQ) == 1)) {
+
+        PyObject *instance = NULL;
+
+        instance = PyObject_GetAttrString(self->object_proxy.wrapped,
+                "__self__");
+
+        if (instance) {
+            result = PyObject_CallFunctionObjArgs(self->wrapper,
+                    self->object_proxy.wrapped, instance, args, kwds, NULL);
+
+            Py_XDECREF(param_kwds);
+
+            Py_DECREF(instance);
+
+            return result;
+        }
+        else
+            PyErr_Clear();
+    }
+
+    result = PyObject_CallFunctionObjArgs(self->wrapper,
+            self->object_proxy.wrapped, self->instance, args, kwds, NULL);
+
+    Py_XDECREF(param_kwds);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_descr_get(
+        WraptFunctionWrapperObject *self, PyObject *obj, PyObject *type)
+{
+    PyObject *bound_type = NULL;
+    PyObject *descriptor = NULL;
+    PyObject *result = NULL;
+
+    static PyObject *bound_type_str = NULL;
+    static PyObject *function_str = NULL;
+
+    if (!bound_type_str) {
+#if PY_MAJOR_VERSION >= 3
+        bound_type_str = PyUnicode_InternFromString(
+                "__bound_function_wrapper__");
+#else
+        bound_type_str = PyString_InternFromString(
+                "__bound_function_wrapper__");
+#endif
+    }
+
+    if (!function_str) {
+#if PY_MAJOR_VERSION >= 3
+        function_str = PyUnicode_InternFromString("function");
+#else
+        function_str = PyString_InternFromString("function");
+#endif
+    }
+
+    if (self->parent == Py_None) {
+#if PY_MAJOR_VERSION < 3
+        if (PyObject_IsInstance(self->object_proxy.wrapped,
+                (PyObject *)&PyClass_Type) || PyObject_IsInstance(
+                self->object_proxy.wrapped, (PyObject *)&PyType_Type)) {
+            Py_INCREF(self);
+            return (PyObject *)self;
+        }
+#else
+        if (PyObject_IsInstance(self->object_proxy.wrapped,
+                (PyObject *)&PyType_Type)) {
+            Py_INCREF(self);
+            return (PyObject *)self;
+        }
+#endif
+
+        if (Py_TYPE(self->object_proxy.wrapped)->tp_descr_get == NULL) {
+            PyErr_Format(PyExc_AttributeError,
+                    "'%s' object has no attribute '__get__'",
+                    Py_TYPE(self->object_proxy.wrapped)->tp_name);
+            return NULL;
+        }
+
+        descriptor = (Py_TYPE(self->object_proxy.wrapped)->tp_descr_get)(
+                self->object_proxy.wrapped, obj, type);
+
+        if (!descriptor)
+            return NULL;
+
+        if (Py_TYPE(self) != &WraptFunctionWrapper_Type) {
+            bound_type = PyObject_GenericGetAttr((PyObject *)self,
+                    bound_type_str);
+
+            if (!bound_type)
+                PyErr_Clear();
+        }
+
+        if (obj == NULL)
+            obj = Py_None;
+
+        result = PyObject_CallFunctionObjArgs(bound_type ? bound_type :
+                (PyObject *)&WraptBoundFunctionWrapper_Type, descriptor,
+                obj, self->wrapper, self->enabled, self->binding,
+                self, NULL);
+
+        Py_XDECREF(bound_type);
+        Py_DECREF(descriptor);
+
+        return result;
+    }
+
+    if (self->instance == Py_None && (self->binding == function_str ||
+            PyObject_RichCompareBool(self->binding, function_str,
+            Py_EQ) == 1)) {
+
+        PyObject *wrapped = NULL;
+
+        static PyObject *wrapped_str = NULL;
+
+        if (!wrapped_str) {
+#if PY_MAJOR_VERSION >= 3
+            wrapped_str = PyUnicode_InternFromString("__wrapped__");
+#else
+            wrapped_str = PyString_InternFromString("__wrapped__");
+#endif
+        }
+
+        wrapped = PyObject_GetAttr(self->parent, wrapped_str);
+
+        if (!wrapped)
+            return NULL;
+
+        if (Py_TYPE(wrapped)->tp_descr_get == NULL) {
+            PyErr_Format(PyExc_AttributeError,
+                    "'%s' object has no attribute '__get__'",
+                    Py_TYPE(wrapped)->tp_name);
+            Py_DECREF(wrapped);
+            return NULL;
+        }
+
+        descriptor = (Py_TYPE(wrapped)->tp_descr_get)(wrapped, obj, type);
+
+        Py_DECREF(wrapped);
+
+        if (!descriptor)
+            return NULL;
+
+        if (Py_TYPE(self->parent) != &WraptFunctionWrapper_Type) {
+            bound_type = PyObject_GenericGetAttr((PyObject *)self->parent,
+                    bound_type_str);
+
+            if (!bound_type)
+                PyErr_Clear();
+        }
+
+        if (obj == NULL)
+            obj = Py_None;
+
+        result = PyObject_CallFunctionObjArgs(bound_type ? bound_type :
+                (PyObject *)&WraptBoundFunctionWrapper_Type, descriptor,
+                obj, self->wrapper, self->enabled, self->binding,
+                self->parent, NULL);
+
+        Py_XDECREF(bound_type);
+        Py_DECREF(descriptor);
+
+        return result;
+    }
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_get_self_instance(
+        WraptFunctionWrapperObject *self, void *closure)
+{
+    if (!self->instance) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+
+    Py_INCREF(self->instance);
+    return self->instance;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_get_self_wrapper(
+        WraptFunctionWrapperObject *self, void *closure)
+{
+    if (!self->wrapper) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+
+    Py_INCREF(self->wrapper);
+    return self->wrapper;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_get_self_enabled(
+        WraptFunctionWrapperObject *self, void *closure)
+{
+    if (!self->enabled) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+
+    Py_INCREF(self->enabled);
+    return self->enabled;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_get_self_binding(
+        WraptFunctionWrapperObject *self, void *closure)
+{
+    if (!self->binding) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+
+    Py_INCREF(self->binding);
+    return self->binding;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptFunctionWrapperBase_get_self_parent(
+        WraptFunctionWrapperObject *self, void *closure)
+{
+    if (!self->parent) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+
+    Py_INCREF(self->parent);
+    return self->parent;
+}
+
+/* ------------------------------------------------------------------------- */;
+
+static PyGetSetDef WraptFunctionWrapperBase_getset[] = {
+    { "__module__",         (getter)WraptObjectProxy_get_module,
+                            (setter)WraptObjectProxy_set_module, 0 },
+    { "__doc__",            (getter)WraptObjectProxy_get_doc,
+                            (setter)WraptObjectProxy_set_doc, 0 },
+    { "_self_instance",     (getter)WraptFunctionWrapperBase_get_self_instance,
+                            NULL, 0 },
+    { "_self_wrapper",      (getter)WraptFunctionWrapperBase_get_self_wrapper,
+                            NULL, 0 },
+    { "_self_enabled",      (getter)WraptFunctionWrapperBase_get_self_enabled,
+                            NULL, 0 },
+    { "_self_binding",      (getter)WraptFunctionWrapperBase_get_self_binding,
+                            NULL, 0 },
+    { "_self_parent",       (getter)WraptFunctionWrapperBase_get_self_parent,
+                            NULL, 0 },
+    { NULL },
+};
+
+PyTypeObject WraptFunctionWrapperBase_Type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "_FunctionWrapperBase",      /*tp_name*/
+    sizeof(WraptFunctionWrapperObject), /*tp_basicsize*/
+    0,                      /*tp_itemsize*/
+    /* methods */
+    (destructor)WraptFunctionWrapperBase_dealloc, /*tp_dealloc*/
+    0,                      /*tp_print*/
+    0,                      /*tp_getattr*/
+    0,                      /*tp_setattr*/
+    0,                      /*tp_compare*/
+    0,                      /*tp_repr*/
+    0,                      /*tp_as_number*/
+    0,                      /*tp_as_sequence*/
+    0,                      /*tp_as_mapping*/
+    0,                      /*tp_hash*/
+    (ternaryfunc)WraptFunctionWrapperBase_call, /*tp_call*/
+    0,                      /*tp_str*/
+    0,                      /*tp_getattro*/
+    0,                      /*tp_setattro*/
+    0,                      /*tp_as_buffer*/
+#if PY_MAJOR_VERSION < 3
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+        Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
+#else
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+        Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+#endif
+    0,                      /*tp_doc*/
+    (traverseproc)WraptFunctionWrapperBase_traverse, /*tp_traverse*/
+    (inquiry)WraptFunctionWrapperBase_clear, /*tp_clear*/
+    0,                      /*tp_richcompare*/
+    offsetof(WraptObjectProxyObject, weakreflist), /*tp_weaklistoffset*/
+    0,                      /*tp_iter*/
+    0,                      /*tp_iternext*/
+    0,                      /*tp_methods*/
+    0,                      /*tp_members*/
+    WraptFunctionWrapperBase_getset, /*tp_getset*/
+    0,                      /*tp_base*/
+    0,                      /*tp_dict*/
+    (descrgetfunc)WraptFunctionWrapperBase_descr_get, /*tp_descr_get*/
+    0,                      /*tp_descr_set*/
+    0,                      /*tp_dictoffset*/
+    (initproc)WraptFunctionWrapperBase_init, /*tp_init*/
+    0,                      /*tp_alloc*/
+    WraptFunctionWrapperBase_new,  /*tp_new*/
+    0,                      /*tp_free*/
+    0,                      /*tp_is_gc*/
+};
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *WraptBoundFunctionWrapper_call(
+        WraptFunctionWrapperObject *self, PyObject *args, PyObject *kwds)
+{
+    PyObject *param_args = NULL;
+    PyObject *param_kwds = NULL;
+
+    PyObject *wrapped = NULL;
+    PyObject *instance = NULL;
+
+    PyObject *result = NULL;
+
+    static PyObject *function_str = NULL;
+
+    if (self->enabled != Py_None) {
+        if (PyCallable_Check(self->enabled)) {
+            PyObject *object = NULL;
+
+            object = PyObject_CallFunctionObjArgs(self->enabled, NULL);
+
+            if (!object)
+                return NULL;
+
+            if (PyObject_Not(object)) {
+                Py_DECREF(object);
+                return PyObject_Call(self->object_proxy.wrapped, args, kwds);
+            }
+
+            Py_DECREF(object);
+        }
+        else if (PyObject_Not(self->enabled)) {
+            return PyObject_Call(self->object_proxy.wrapped, args, kwds);
+        }
+    }
+
+    if (!function_str) {
+#if PY_MAJOR_VERSION >= 3
+        function_str = PyUnicode_InternFromString("function");
+#else
+        function_str = PyString_InternFromString("function");
+#endif
+    }
+
+    /* 
+    * We need to do things different depending on whether we are likely
+    * wrapping an instance method vs a static method or class method.
+    */
+
+    if (self->binding == function_str || PyObject_RichCompareBool(
+                self->binding, function_str, Py_EQ) == 1) {
+
+        if (self->instance == Py_None) {
+            /*
+             * This situation can occur where someone is calling the
+             * instancemethod via the class type and passing the
+             * instance as the first argument. We need to shift the args
+             * before making the call to the wrapper and effectively
+             * bind the instance to the wrapped function using a partial
+             * so the wrapper doesn't see anything as being different.
+             */
+
+            PyObject *module = NULL;
+            PyObject *dict = NULL;
+            PyObject *partial = NULL;
+
+            if (PyTuple_Size(args) == 0) {
+                PyErr_SetString(PyExc_TypeError,
+                        "missing 1 required positional argument");
+                return NULL;
+            }
+
+            module = PyImport_ImportModule("functools");
+
+            if (!module)
+                return NULL;
+
+            dict = PyModule_GetDict(module);
+            partial = PyDict_GetItemString(dict, "partial");
+
+            if (!partial) {
+                Py_DECREF(module);
+                return NULL;
+            }
+
+            Py_INCREF(partial);
+            Py_DECREF(module);
+
+            instance = PyTuple_GetItem(args, 0);
+
+            if (!instance) {
+                Py_DECREF(partial);
+                return NULL;
+            }
+
+            wrapped = PyObject_CallFunctionObjArgs(partial,
+                    self->object_proxy.wrapped, instance, NULL);
+
+            Py_DECREF(partial);
+
+            if (!wrapped)
+                return NULL;
+
+            param_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args));
+
+            if (!param_args) {
+                Py_DECREF(wrapped);
+                return NULL;
+            }
+
+            args = param_args;
+        }
+        else
+            instance = self->instance;
+
+        if (!wrapped) {
+            Py_INCREF(self->object_proxy.wrapped);
+            wrapped = self->object_proxy.wrapped;
+        }
+
+        if (!kwds) {
+            param_kwds = PyDict_New();
+            kwds = param_kwds;
+        }
+
+        result = PyObject_CallFunctionObjArgs(self->wrapper, wrapped,
+                instance, args, kwds, NULL);
+
+        Py_XDECREF(param_args);
+        Py_XDECREF(param_kwds);
+        Py_DECREF(wrapped);
+
+        return result;
+    }
+    else {
+        /*
+         * As in this case we would be dealing with a classmethod or
+         * staticmethod, then _self_instance will only tell us whether
+         * when calling the classmethod or staticmethod they did it via
+         * an instance of the class it is bound to and not the case
+         * where done by the class type itself. We thus ignore
+         * _self_instance and use the __self__ attribute of the bound
+         * function instead. For a classmethod, this means instance will
+         * be the class type and for a staticmethod it will be None.
+         * This is probably the more useful thing we can pass through
+         * even though we loose knowledge of whether they were called on
+         * the instance vs the class type, as it reflects what they have
+         * available in the decoratored function.
+         */
+
+        instance = PyObject_GetAttrString(self->object_proxy.wrapped,
+                "__self__");
+
+        if (!instance) {
+            PyErr_Clear();
+            Py_INCREF(Py_None);
+            instance = Py_None;
+        }
+
+        if (!kwds) {
+            param_kwds = PyDict_New();
+            kwds = param_kwds;
+        }
+
+        result = PyObject_CallFunctionObjArgs(self->wrapper,
+                self->object_proxy.wrapped, instance, args, kwds, NULL);
+
+        Py_XDECREF(param_kwds);
+
+        Py_DECREF(instance);
+
+        return result;
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyGetSetDef WraptBoundFunctionWrapper_getset[] = {
+    { "__module__",         (getter)WraptObjectProxy_get_module,
+                            (setter)WraptObjectProxy_set_module, 0 },
+    { "__doc__",            (getter)WraptObjectProxy_get_doc,
+                            (setter)WraptObjectProxy_set_doc, 0 },
+    { NULL },
+};
+
+PyTypeObject WraptBoundFunctionWrapper_Type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "BoundFunctionWrapper", /*tp_name*/
+    sizeof(WraptFunctionWrapperObject), /*tp_basicsize*/
+    0,                      /*tp_itemsize*/
+    /* methods */
+    0,                      /*tp_dealloc*/
+    0,                      /*tp_print*/
+    0,                      /*tp_getattr*/
+    0,                      /*tp_setattr*/
+    0,                      /*tp_compare*/
+    0,                      /*tp_repr*/
+    0,                      /*tp_as_number*/
+    0,                      /*tp_as_sequence*/
+    0,                      /*tp_as_mapping*/
+    0,                      /*tp_hash*/
+    (ternaryfunc)WraptBoundFunctionWrapper_call, /*tp_call*/
+    0,                      /*tp_str*/
+    0,                      /*tp_getattro*/
+    0,                      /*tp_setattro*/
+    0,                      /*tp_as_buffer*/
+#if PY_MAJOR_VERSION < 3
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
+#else
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+#endif
+    0,                      /*tp_doc*/
+    0,                      /*tp_traverse*/
+    0,                      /*tp_clear*/
+    0,                      /*tp_richcompare*/
+    offsetof(WraptObjectProxyObject, weakreflist), /*tp_weaklistoffset*/
+    0,                      /*tp_iter*/
+    0,                      /*tp_iternext*/
+    0,                      /*tp_methods*/
+    0,                      /*tp_members*/
+    WraptBoundFunctionWrapper_getset, /*tp_getset*/
+    0,                      /*tp_base*/
+    0,                      /*tp_dict*/
+    0,                      /*tp_descr_get*/
+    0,                      /*tp_descr_set*/
+    0,                      /*tp_dictoffset*/
+    0,                      /*tp_init*/
+    0,                      /*tp_alloc*/
+    0,                      /*tp_new*/
+    0,                      /*tp_free*/
+    0,                      /*tp_is_gc*/
+};
+
+/* ------------------------------------------------------------------------- */
+
+static int WraptFunctionWrapper_init(WraptFunctionWrapperObject *self,
+        PyObject *args, PyObject *kwds)
+{
+    PyObject *wrapped = NULL;
+    PyObject *wrapper = NULL;
+    PyObject *enabled = Py_None;
+    PyObject *binding = NULL;
+    PyObject *instance = NULL;
+
+    static PyObject *classmethod_str = NULL;
+    static PyObject *staticmethod_str = NULL;
+    static PyObject *function_str = NULL;
+
+    int result = 0;
+
+    static char *kwlist[] = { "wrapped", "wrapper", "enabled", NULL };
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|O:FunctionWrapper",
+            kwlist, &wrapped, &wrapper, &enabled)) {
+        return -1;
+    }
+
+    if (!classmethod_str) {
+#if PY_MAJOR_VERSION >= 3
+        classmethod_str = PyUnicode_InternFromString("classmethod");
+#else
+        classmethod_str = PyString_InternFromString("classmethod");
+#endif
+    }
+
+    if (!staticmethod_str) {
+#if PY_MAJOR_VERSION >= 3
+        staticmethod_str = PyUnicode_InternFromString("staticmethod");
+#else
+        staticmethod_str = PyString_InternFromString("staticmethod");
+#endif
+    }
+
+    if (!function_str) {
+#if PY_MAJOR_VERSION >= 3
+        function_str = PyUnicode_InternFromString("function");
+#else
+        function_str = PyString_InternFromString("function");
+#endif
+    }
+
+    if (PyObject_IsInstance(wrapped, (PyObject *)&PyClassMethod_Type)) {
+        binding = classmethod_str;
+    }
+    else if (PyObject_IsInstance(wrapped, (PyObject *)&PyStaticMethod_Type)) {
+        binding = staticmethod_str;
+    }
+    else if ((instance = PyObject_GetAttrString(wrapped, "__self__")) != 0) {
+#if PY_MAJOR_VERSION < 3
+        if (PyObject_IsInstance(instance, (PyObject *)&PyClass_Type) ||
+                PyObject_IsInstance(instance, (PyObject *)&PyType_Type)) {
+            binding = classmethod_str;
+        }
+#else
+        if (PyObject_IsInstance(instance, (PyObject *)&PyType_Type)) {
+            binding = classmethod_str;
+        }
+#endif
+        else
+            binding = function_str;
+
+        Py_DECREF(instance);
+    }
+    else {
+        PyErr_Clear();
+
+        binding = function_str;
+    }
+
+    result = WraptFunctionWrapperBase_raw_init(self, wrapped, Py_None,
+            wrapper, enabled, binding, Py_None);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */;
+
+static PyGetSetDef WraptFunctionWrapper_getset[] = {
+    { "__module__",         (getter)WraptObjectProxy_get_module,
+                            (setter)WraptObjectProxy_set_module, 0 },
+    { "__doc__",            (getter)WraptObjectProxy_get_doc,
+                            (setter)WraptObjectProxy_set_doc, 0 },
+    { NULL },
+};
+
+PyTypeObject WraptFunctionWrapper_Type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "FunctionWrapper",      /*tp_name*/
+    sizeof(WraptFunctionWrapperObject), /*tp_basicsize*/
+    0,                      /*tp_itemsize*/
+    /* methods */
+    0,                      /*tp_dealloc*/
+    0,                      /*tp_print*/
+    0,                      /*tp_getattr*/
+    0,                      /*tp_setattr*/
+    0,                      /*tp_compare*/
+    0,                      /*tp_repr*/
+    0,                      /*tp_as_number*/
+    0,                      /*tp_as_sequence*/
+    0,                      /*tp_as_mapping*/
+    0,                      /*tp_hash*/
+    0,                      /*tp_call*/
+    0,                      /*tp_str*/
+    0,                      /*tp_getattro*/
+    0,                      /*tp_setattro*/
+    0,                      /*tp_as_buffer*/
+#if PY_MAJOR_VERSION < 3
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
+#else
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+#endif
+    0,                      /*tp_doc*/
+    0,                      /*tp_traverse*/
+    0,                      /*tp_clear*/
+    0,                      /*tp_richcompare*/
+    offsetof(WraptObjectProxyObject, weakreflist), /*tp_weaklistoffset*/
+    0,                      /*tp_iter*/
+    0,                      /*tp_iternext*/
+    0,                      /*tp_methods*/
+    0,                      /*tp_members*/
+    WraptFunctionWrapper_getset, /*tp_getset*/
+    0,                      /*tp_base*/
+    0,                      /*tp_dict*/
+    0,                      /*tp_descr_get*/
+    0,                      /*tp_descr_set*/
+    0,                      /*tp_dictoffset*/
+    (initproc)WraptFunctionWrapper_init, /*tp_init*/
+    0,                      /*tp_alloc*/
+    0,                      /*tp_new*/
+    0,                      /*tp_free*/
+    0,                      /*tp_is_gc*/
+};
+
+/* ------------------------------------------------------------------------- */;
+
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef moduledef = {
+    PyModuleDef_HEAD_INIT,
+    "_wrappers",         /* m_name */
+    NULL,                /* m_doc */
+    -1,                  /* m_size */
+    NULL,                /* m_methods */
+    NULL,                /* m_reload */
+    NULL,                /* m_traverse */
+    NULL,                /* m_clear */
+    NULL,                /* m_free */
+};
+#endif
+
+static PyObject *
+moduleinit(void)
+{
+    PyObject *module;
+
+#if PY_MAJOR_VERSION >= 3
+    module = PyModule_Create(&moduledef);
+#else
+    module = Py_InitModule3("_wrappers", NULL, NULL);
+#endif
+
+    if (module == NULL)
+        return NULL;
+
+    if (PyType_Ready(&WraptObjectProxy_Type) < 0)
+        return NULL;
+
+    /* Ensure that inheritence relationships specified. */
+
+    WraptCallableObjectProxy_Type.tp_base = &WraptObjectProxy_Type;
+    WraptFunctionWrapperBase_Type.tp_base = &WraptObjectProxy_Type;
+    WraptBoundFunctionWrapper_Type.tp_base = &WraptFunctionWrapperBase_Type;
+    WraptFunctionWrapper_Type.tp_base = &WraptFunctionWrapperBase_Type;
+
+    if (PyType_Ready(&WraptCallableObjectProxy_Type) < 0)
+        return NULL;
+    if (PyType_Ready(&WraptFunctionWrapperBase_Type) < 0)
+        return NULL;
+    if (PyType_Ready(&WraptBoundFunctionWrapper_Type) < 0)
+        return NULL;
+    if (PyType_Ready(&WraptFunctionWrapper_Type) < 0)
+        return NULL;
+
+    Py_INCREF(&WraptObjectProxy_Type);
+    PyModule_AddObject(module, "ObjectProxy",
+            (PyObject *)&WraptObjectProxy_Type);
+    Py_INCREF(&WraptCallableObjectProxy_Type);
+    PyModule_AddObject(module, "CallableObjectProxy",
+            (PyObject *)&WraptCallableObjectProxy_Type);
+    Py_INCREF(&WraptFunctionWrapper_Type);
+    PyModule_AddObject(module, "FunctionWrapper",
+            (PyObject *)&WraptFunctionWrapper_Type);
+
+    Py_INCREF(&WraptFunctionWrapperBase_Type);
+    PyModule_AddObject(module, "_FunctionWrapperBase",
+            (PyObject *)&WraptFunctionWrapperBase_Type);
+    Py_INCREF(&WraptBoundFunctionWrapper_Type);
+    PyModule_AddObject(module, "BoundFunctionWrapper",
+            (PyObject *)&WraptBoundFunctionWrapper_Type);
+
+    return module;
+}
+
+#if PY_MAJOR_VERSION < 3
+PyMODINIT_FUNC init_wrappers(void)
+{
+    moduleinit();
+}
+#else
+PyMODINIT_FUNC PyInit__wrappers(void)
+{
+    return moduleinit();
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/__init__.py	(revision 1126)
@@ -0,0 +1,19 @@
+__version_info__ = ('1', '10', '6')
+__version__ = '.'.join(__version_info__)
+
+from .wrappers import (ObjectProxy, CallableObjectProxy, FunctionWrapper,
+        BoundFunctionWrapper, WeakFunctionProxy, resolve_path, apply_patch,
+        wrap_object, wrap_object_attribute, function_wrapper,
+        wrap_function_wrapper, patch_function_wrapper,
+        transient_function_wrapper)
+
+from .decorators import (adapter_factory, AdapterFactory, decorator,
+        synchronized)
+
+from .importer import (register_post_import_hook, when_imported,
+        notify_module_loaded, discover_post_import_hooks)
+
+try:
+    from inspect import getcallargs
+except ImportError:
+    from .arguments import getcallargs
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/importer.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/importer.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/importer.py	(revision 1126)
@@ -0,0 +1,228 @@
+"""This module implements a post import hook mechanism styled after what is
+described in PEP-369. Note that it doesn't cope with modules being reloaded.
+
+"""
+
+import sys
+import threading
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+if PY3: 
+    import importlib
+    string_types = str,
+else:
+    string_types = basestring,
+
+from .decorators import synchronized
+
+# The dictionary registering any post import hooks to be triggered once
+# the target module has been imported. Once a module has been imported
+# and the hooks fired, the list of hooks recorded against the target
+# module will be truncacted but the list left in the dictionary. This
+# acts as a flag to indicate that the module had already been imported.
+
+_post_import_hooks = {}
+_post_import_hooks_init = False
+_post_import_hooks_lock = threading.RLock()
+
+# Register a new post import hook for the target module name. This
+# differs from the PEP-369 implementation in that it also allows the
+# hook function to be specified as a string consisting of the name of
+# the callback in the form 'module:function'. This will result in a
+# proxy callback being registered which will defer loading of the
+# specified module containing the callback function until required.
+
+def _create_import_hook_from_string(name):
+    def import_hook(module):
+        module_name, function = name.split(':')
+        attrs = function.split('.')
+        __import__(module_name)
+        callback = sys.modules[module_name]
+        for attr in attrs:
+            callback = getattr(callback, attr)
+        return callback(module)
+    return import_hook
+
+@synchronized(_post_import_hooks_lock)
+def register_post_import_hook(hook, name):
+    # Create a deferred import hook if hook is a string name rather than
+    # a callable function.
+
+    if isinstance(hook, string_types):
+        hook = _create_import_hook_from_string(hook)
+
+    # Automatically install the import hook finder if it has not already
+    # been installed.
+
+    global _post_import_hooks_init
+
+    if not _post_import_hooks_init:
+        _post_import_hooks_init = True
+        sys.meta_path.insert(0, ImportHookFinder())
+
+    # Determine if any prior registration of a post import hook for
+    # the target modules has occurred and act appropriately.
+
+    hooks = _post_import_hooks.get(name, None)
+
+    if hooks is None:
+        # No prior registration of post import hooks for the target
+        # module. We need to check whether the module has already been
+        # imported. If it has we fire the hook immediately and add an
+        # empty list to the registry to indicate that the module has
+        # already been imported and hooks have fired. Otherwise add
+        # the post import hook to the registry.
+
+        module = sys.modules.get(name, None)
+
+        if module is not None:
+            _post_import_hooks[name] = []
+            hook(module)
+
+        else:
+            _post_import_hooks[name] = [hook]
+
+    elif hooks == []:
+        # A prior registration of port import hooks for the target
+        # module was done and the hooks already fired. Fire the hook
+        # immediately.
+
+        module = sys.modules[name]
+        hook(module)
+
+    else:
+        # A prior registration of port import hooks for the target
+        # module was done but the module has not yet been imported.
+
+        _post_import_hooks[name].append(hook)
+
+# Register post import hooks defined as package entry points.
+
+def _create_import_hook_from_entrypoint(entrypoint):
+    def import_hook(module):
+        __import__(entrypoint.module_name)
+        callback = sys.modules[entrypoint.module_name]
+        for attr in entrypoint.attrs:
+            callback = getattr(callback, attr)
+        return callback(module)
+    return import_hook
+
+def discover_post_import_hooks(group):
+    try:
+        import pkg_resources
+    except ImportError:
+        return
+
+    for entrypoint in pkg_resources.iter_entry_points(group=group):
+        callback = _create_import_hook_from_entrypoint(entrypoint)
+        register_post_import_hook(callback, entrypoint.name)
+
+# Indicate that a module has been loaded. Any post import hooks which
+# were registered against the target module will be invoked. If an
+# exception is raised in any of the post import hooks, that will cause
+# the import of the target module to fail.
+
+@synchronized(_post_import_hooks_lock)
+def notify_module_loaded(module):
+    name = getattr(module, '__name__', None)
+    hooks = _post_import_hooks.get(name, None)
+
+    if hooks:
+        _post_import_hooks[name] = []
+
+        for hook in hooks:
+            hook(module)
+
+# A custom module import finder. This intercepts attempts to import
+# modules and watches out for attempts to import target modules of
+# interest. When a module of interest is imported, then any post import
+# hooks which are registered will be invoked.
+
+class _ImportHookLoader:
+
+    def load_module(self, fullname):
+        module = sys.modules[fullname]
+        notify_module_loaded(module)
+
+        return module
+
+class _ImportHookChainedLoader:
+
+    def __init__(self, loader):
+        self.loader = loader
+
+    def load_module(self, fullname):
+        module = self.loader.load_module(fullname)
+        notify_module_loaded(module)
+
+        return module
+
+class ImportHookFinder:
+
+    def __init__(self):
+        self.in_progress = {}
+
+    @synchronized(_post_import_hooks_lock)
+    def find_module(self, fullname, path=None):
+        # If the module being imported is not one we have registered
+        # post import hooks for, we can return immediately. We will
+        # take no further part in the importing of this module.
+
+        if not fullname in _post_import_hooks:
+            return None
+
+        # When we are interested in a specific module, we will call back
+        # into the import system a second time to defer to the import
+        # finder that is supposed to handle the importing of the module.
+        # We set an in progress flag for the target module so that on
+        # the second time through we don't trigger another call back
+        # into the import system and cause a infinite loop.
+
+        if fullname in self.in_progress:
+            return None
+
+        self.in_progress[fullname] = True
+
+        # Now call back into the import system again.
+
+        try:
+            if PY3:
+                # For Python 3 we need to use find_loader() from
+                # the importlib module. It doesn't actually
+                # import the target module and only finds the
+                # loader. If a loader is found, we need to return
+                # our own loader which will then in turn call the
+                # real loader to import the module and invoke the
+                # post import hooks.
+
+                loader = importlib.find_loader(fullname, path)
+
+                if loader:
+                    return _ImportHookChainedLoader(loader)
+
+            else:
+                # For Python 2 we don't have much choice but to
+                # call back in to __import__(). This will
+                # actually cause the module to be imported. If no
+                # module could be found then ImportError will be
+                # raised. Otherwise we return a loader which
+                # returns the already loaded module and invokes
+                # the post import hooks.
+
+                __import__(fullname)
+
+                return _ImportHookLoader()
+
+        finally:
+            del self.in_progress[fullname]
+
+# Decorator for marking that a function should be called as a post
+# import hook when the target module is imported.
+
+def when_imported(name):
+    def register(hook):
+        register_post_import_hook(hook, name)
+        return hook
+    return register
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/wrappers.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/wrappers.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/wrapt/wrappers.py	(revision 1126)
@@ -0,0 +1,899 @@
+import sys
+import functools
+import operator
+import weakref
+import inspect
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    string_types = str,
+else:
+    string_types = basestring,
+
+def with_metaclass(meta, *bases):
+    """Create a base class with a metaclass."""
+    return meta("NewBase", bases, {})
+
+class _ObjectProxyMethods(object):
+
+     # We use properties to override the values of __module__ and
+     # __doc__. If we add these in ObjectProxy, the derived class
+     # __dict__ will still be setup to have string variants of these
+     # attributes and the rules of descriptors means that they appear to
+     # take precedence over the properties in the base class. To avoid
+     # that, we copy the properties into the derived class type itself
+     # via a meta class. In that way the properties will always take
+     # precedence.
+
+    @property
+    def __module__(self):
+        return self.__wrapped__.__module__
+
+    @__module__.setter
+    def __module__(self, value):
+        self.__wrapped__.__module__ = value
+
+    @property
+    def __doc__(self):
+        return self.__wrapped__.__doc__
+
+    @__doc__.setter
+    def __doc__(self, value):
+        self.__wrapped__.__doc__ = value
+
+    # We similar use a property for __dict__. We need __dict__ to be
+    # explicit to ensure that vars() works as expected.
+
+    @property
+    def __dict__(self):
+        return self.__wrapped__.__dict__
+
+    # Need to also propagate the special __weakref__ attribute for case
+    # where decorating classes which will define this. If do not define
+    # it and use a function like inspect.getmembers() on a decorator
+    # class it will fail. This can't be in the derived classes.
+
+    @property
+    def __weakref__(self):
+        return self.__wrapped__.__weakref__
+
+class _ObjectProxyMetaType(type):
+     def __new__(cls, name, bases, dictionary):
+         # Copy our special properties into the class so that they
+         # always take precedence over attributes of the same name added
+         # during construction of a derived class. This is to save
+         # duplicating the implementation for them in all derived classes.
+
+         dictionary.update(vars(_ObjectProxyMethods))
+
+         return type.__new__(cls, name, bases, dictionary)
+
+class ObjectProxy(with_metaclass(_ObjectProxyMetaType)):
+
+    __slots__ = '__wrapped__'
+
+    def __init__(self, wrapped):
+        object.__setattr__(self, '__wrapped__', wrapped)
+
+        # Python 3.2+ has the __qualname__ attribute, but it does not
+        # allow it to be overridden using a property and it must instead
+        # be an actual string object instead.
+
+        try:
+            object.__setattr__(self, '__qualname__', wrapped.__qualname__)
+        except AttributeError:
+            pass
+
+    @property
+    def __name__(self):
+        return self.__wrapped__.__name__
+
+    @__name__.setter
+    def __name__(self, value):
+        self.__wrapped__.__name__ = value
+
+    @property
+    def __class__(self):
+        return self.__wrapped__.__class__
+
+    @__class__.setter
+    def __class__(self, value):
+        self.__wrapped__.__class__ = value
+
+    @property
+    def __annotations__(self):
+        return self.__wrapped__.__anotations__
+
+    @__annotations__.setter
+    def __annotations__(self, value):
+        self.__wrapped__.__annotations__ = value
+
+    def __dir__(self):
+        return dir(self.__wrapped__)
+
+    def __str__(self):
+        return str(self.__wrapped__)
+
+    if PY3:
+        def __bytes__(self):
+            return bytes(self.__wrapped__)
+
+    def __repr__(self):
+        return '<%s at 0x%x for %s at 0x%x>' % (
+                type(self).__name__, id(self),
+                type(self.__wrapped__).__name__,
+                id(self.__wrapped__))
+
+    def __reversed__(self):
+        return reversed(self.__wrapped__)
+
+    if PY3:
+        def __round__(self):
+            return round(self.__wrapped__)
+
+    def __lt__(self, other):
+        return self.__wrapped__ < other
+
+    def __le__(self, other):
+        return self.__wrapped__ <= other
+
+    def __eq__(self, other):
+        return self.__wrapped__ == other
+
+    def __ne__(self, other):
+        return self.__wrapped__ != other
+
+    def __gt__(self, other):
+        return self.__wrapped__ > other
+
+    def __ge__(self, other):
+        return self.__wrapped__ >= other
+
+    def __hash__(self):
+        return hash(self.__wrapped__)
+
+    def __nonzero__(self):
+        return bool(self.__wrapped__)
+
+    def __bool__(self):
+        return bool(self.__wrapped__)
+
+    def __setattr__(self, name, value):
+        if name.startswith('_self_'):
+            object.__setattr__(self, name, value)
+
+        elif name == '__wrapped__':
+            object.__setattr__(self, name, value)
+            try:
+                object.__delattr__(self, '__qualname__')
+            except AttributeError:
+                pass
+            try:
+                object.__setattr__(self, '__qualname__', value.__qualname__)
+            except AttributeError:
+                pass
+
+        elif name == '__qualname__':
+            setattr(self.__wrapped__, name, value)
+            object.__setattr__(self, name, value)
+
+        elif hasattr(type(self), name):
+            object.__setattr__(self, name, value)
+
+        else:
+            setattr(self.__wrapped__, name, value)
+
+    def __getattr__(self, name):
+        # If we are being to lookup '__wrapped__' then the
+        # '__init__()' method cannot have been called.
+
+        if name == '__wrapped__':
+            raise ValueError('wrapper has not been initialised')
+
+        return getattr(self.__wrapped__, name)
+
+    def __delattr__(self, name):
+        if name.startswith('_self_'):
+            object.__delattr__(self, name)
+
+        elif name == '__wrapped__':
+            raise TypeError('__wrapped__ must be an object')
+
+        elif name == '__qualname__':
+            object.__delattr__(self, name)
+            delattr(self.__wrapped__, name)
+
+        elif hasattr(type(self), name):
+            object.__delattr__(self, name)
+
+        else:
+            delattr(self.__wrapped__, name)
+
+    def __add__(self, other):
+        return self.__wrapped__ + other
+
+    def __sub__(self, other):
+        return self.__wrapped__ - other
+
+    def __mul__(self, other):
+        return self.__wrapped__ * other
+
+    def __div__(self, other):
+        return operator.div(self.__wrapped__, other)
+
+    def __truediv__(self, other):
+        return operator.truediv(self.__wrapped__, other)
+
+    def __floordiv__(self, other):
+        return self.__wrapped__ // other
+
+    def __mod__(self, other):
+        return self.__wrapped__ ^ other
+
+    def __divmod__(self, other):
+        return divmod(self.__wrapped__, other)
+
+    def __pow__(self, other, *args):
+        return pow(self.__wrapped__, other, *args)
+
+    def __lshift__(self, other):
+        return self.__wrapped__ << other
+
+    def __rshift__(self, other):
+        return self.__wrapped__ >> other
+
+    def __and__(self, other):
+        return self.__wrapped__ & other
+
+    def __xor__(self, other):
+        return self.__wrapped__ ^ other
+
+    def __or__(self, other):
+        return self.__wrapped__ | other
+
+    def __radd__(self, other):
+        return other + self.__wrapped__
+
+    def __rsub__(self, other):
+        return other - self.__wrapped__
+
+    def __rmul__(self, other):
+        return other * self.__wrapped__
+
+    def __rdiv__(self, other):
+        return operator.div(other, self.__wrapped__)
+
+    def __rtruediv__(self, other):
+        return operator.truediv(other, self.__wrapped__)
+
+    def __rfloordiv__(self, other):
+        return other // self.__wrapped__
+
+    def __rmod__(self, other):
+        return other % self.__wrapped__
+
+    def __rdivmod__(self, other):
+        return divmod(other, self.__wrapped__)
+
+    def __rpow__(self, other, *args):
+        return pow(other, self.__wrapped__, *args)
+
+    def __rlshift__(self, other):
+        return other << self.__wrapped__
+
+    def __rrshift__(self, other):
+        return other >> self.__wrapped__
+
+    def __rand__(self, other):
+        return other & self.__wrapped__
+
+    def __rxor__(self, other):
+        return other ^ self.__wrapped__
+
+    def __ror__(self, other):
+        return other | self.__wrapped__
+
+    def __iadd__(self, other):
+        self.__wrapped__ += other
+        return self
+
+    def __isub__(self, other):
+        self.__wrapped__ -= other
+        return self
+
+    def __imul__(self, other):
+        self.__wrapped__ *= other
+        return self
+
+    def __idiv__(self, other):
+        self.__wrapped__ = operator.idiv(self.__wrapped__, other)
+        return self
+
+    def __itruediv__(self, other):
+        self.__wrapped__ = operator.itruediv(self.__wrapped__, other)
+        return self
+
+    def __ifloordiv__(self, other):
+        self.__wrapped__ //= other
+        return self
+
+    def __imod__(self, other):
+        self.__wrapped__ %= other
+        return self
+
+    def __ipow__(self, other):
+        self.__wrapped__ **= other
+        return self
+
+    def __ilshift__(self, other):
+        self.__wrapped__ <<= other
+        return self
+
+    def __irshift__(self, other):
+        self.__wrapped__ >>= other
+        return self
+
+    def __iand__(self, other):
+        self.__wrapped__ &= other
+        return self
+
+    def __ixor__(self, other):
+        self.__wrapped__ ^= other
+        return self
+
+    def __ior__(self, other):
+        self.__wrapped__ |= other
+        return self
+
+    def __neg__(self):
+        return -self.__wrapped__
+
+    def __pos__(self):
+        return +self.__wrapped__
+
+    def __abs__(self):
+        return abs(self.__wrapped__)
+
+    def __invert__(self):
+        return ~self.__wrapped__
+
+    def __int__(self):
+        return int(self.__wrapped__)
+
+    def __long__(self):
+        return long(self.__wrapped__)
+
+    def __float__(self):
+        return float(self.__wrapped__)
+
+    def __oct__(self):
+        return oct(self.__wrapped__)
+
+    def __hex__(self):
+        return hex(self.__wrapped__)
+
+    def __index__(self):
+        return operator.index(self.__wrapped__)
+
+    def __len__(self):
+        return len(self.__wrapped__)
+
+    def __contains__(self, value):
+        return value in self.__wrapped__
+
+    def __getitem__(self, key):
+        return self.__wrapped__[key]
+
+    def __setitem__(self, key, value):
+        self.__wrapped__[key] = value
+
+    def __delitem__(self, key):
+        del self.__wrapped__[key]
+
+    def __getslice__(self, i, j):
+        return self.__wrapped__[i:j]
+
+    def __setslice__(self, i, j, value):
+        self.__wrapped__[i:j] = value
+
+    def __delslice__(self, i, j):
+        del self.__wrapped__[i:j]
+
+    def __enter__(self):
+        return self.__wrapped__.__enter__()
+
+    def __exit__(self, *args, **kwargs):
+        return self.__wrapped__.__exit__(*args, **kwargs)
+
+    def __iter__(self):
+        return iter(self.__wrapped__)
+
+class CallableObjectProxy(ObjectProxy):
+
+    def __call__(self, *args, **kwargs):
+        return self.__wrapped__(*args, **kwargs)
+
+class _FunctionWrapperBase(ObjectProxy):
+
+    __slots__ = ('_self_instance', '_self_wrapper', '_self_enabled',
+            '_self_binding', '_self_parent') 
+
+    def __init__(self, wrapped, instance, wrapper, enabled=None,
+            binding='function', parent=None):
+
+        super(_FunctionWrapperBase, self).__init__(wrapped)
+
+        object.__setattr__(self, '_self_instance', instance)
+        object.__setattr__(self, '_self_wrapper', wrapper)
+        object.__setattr__(self, '_self_enabled', enabled)
+        object.__setattr__(self, '_self_binding', binding)
+        object.__setattr__(self, '_self_parent', parent)
+
+    def __get__(self, instance, owner):
+        # This method is actually doing double duty for both unbound and
+        # bound derived wrapper classes. It should possibly be broken up
+        # and the distinct functionality moved into the derived classes.
+        # Can't do that straight away due to some legacy code which is
+        # relying on it being here in this base class.
+        #
+        # The distinguishing attribute which determines whether we are
+        # being called in an unbound or bound wrapper is the parent
+        # attribute. If binding has never occured, then the parent will
+        # be None.
+        #
+        # First therefore, is if we are called in an unbound wrapper. In
+        # this case we perform the binding.
+        #
+        # We have one special case to worry about here. This is where we
+        # are decorating a nested class. In this case the wrapped class
+        # would not have a __get__() method to call. In that case we
+        # simply return self.
+        #
+        # Note that we otherwise still do binding even if instance is
+        # None and accessing an unbound instance method from a class.
+        # This is because we need to be able to later detect that
+        # specific case as we will need to extract the instance from the
+        # first argument of those passed in.
+
+        if self._self_parent is None:
+            if not inspect.isclass(self.__wrapped__):
+                descriptor = self.__wrapped__.__get__(instance, owner)
+
+                return self.__bound_function_wrapper__(descriptor, instance,
+                        self._self_wrapper, self._self_enabled,
+                        self._self_binding, self)
+
+            return self
+
+        # Now we have the case of binding occuring a second time on what
+        # was already a bound function. In this case we would usually
+        # return ourselves again. This mirrors what Python does.
+        #
+        # The special case this time is where we were originally bound
+        # with an instance of None and we were likely an instance
+        # method. In that case we rebind against the original wrapped
+        # function from the parent again.
+
+        if self._self_instance is None and self._self_binding == 'function':
+            descriptor = self._self_parent.__wrapped__.__get__(
+                    instance, owner)
+
+            return self._self_parent.__bound_function_wrapper__(
+                    descriptor, instance, self._self_wrapper,
+                    self._self_enabled, self._self_binding,
+                    self._self_parent)
+
+        return self
+
+    def __call__(self, *args, **kwargs):
+        # If enabled has been specified, then evaluate it at this point
+        # and if the wrapper is not to be executed, then simply return
+        # the bound function rather than a bound wrapper for the bound
+        # function. When evaluating enabled, if it is callable we call
+        # it, otherwise we evaluate it as a boolean.
+
+        if self._self_enabled is not None:
+            if callable(self._self_enabled):
+                if not self._self_enabled():
+                    return self.__wrapped__(*args, **kwargs)
+            elif not self._self_enabled:
+                return self.__wrapped__(*args, **kwargs)
+
+        # This can occur where initial function wrapper was applied to
+        # a function that was already bound to an instance. In that case
+        # we want to extract the instance from the function and use it.
+
+        if self._self_binding == 'function':
+            if self._self_instance is None:
+                instance = getattr(self.__wrapped__, '__self__', None)
+                if instance is not None:
+                    return self._self_wrapper(self.__wrapped__, instance,
+                            args, kwargs)
+
+        # This is generally invoked when the wrapped function is being
+        # called as a normal function and is not bound to a class as an
+        # instance method. This is also invoked in the case where the
+        # wrapped function was a method, but this wrapper was in turn
+        # wrapped using the staticmethod decorator.
+
+        return self._self_wrapper(self.__wrapped__, self._self_instance,
+                args, kwargs)
+
+class BoundFunctionWrapper(_FunctionWrapperBase):
+
+    def __call__(self, *args, **kwargs):
+        # If enabled has been specified, then evaluate it at this point
+        # and if the wrapper is not to be executed, then simply return
+        # the bound function rather than a bound wrapper for the bound
+        # function. When evaluating enabled, if it is callable we call
+        # it, otherwise we evaluate it as a boolean.
+
+        if self._self_enabled is not None:
+            if callable(self._self_enabled):
+                if not self._self_enabled():
+                    return self.__wrapped__(*args, **kwargs)
+            elif not self._self_enabled:
+                return self.__wrapped__(*args, **kwargs)
+
+        # We need to do things different depending on whether we are
+        # likely wrapping an instance method vs a static method or class
+        # method.
+
+        if self._self_binding == 'function':
+            if self._self_instance is None:
+                # This situation can occur where someone is calling the
+                # instancemethod via the class type and passing the instance
+                # as the first argument. We need to shift the args before
+                # making the call to the wrapper and effectively bind the
+                # instance to the wrapped function using a partial so the
+                # wrapper doesn't see anything as being different.
+
+                if not args:
+                    raise TypeError('missing 1 required positional argument')
+
+                instance, args = args[0], args[1:]
+                wrapped = functools.partial(self.__wrapped__, instance)
+                return self._self_wrapper(wrapped, instance, args, kwargs)
+
+            return self._self_wrapper(self.__wrapped__, self._self_instance,
+                    args, kwargs)
+
+        else:
+            # As in this case we would be dealing with a classmethod or
+            # staticmethod, then _self_instance will only tell us whether
+            # when calling the classmethod or staticmethod they did it via an
+            # instance of the class it is bound to and not the case where
+            # done by the class type itself. We thus ignore _self_instance
+            # and use the __self__ attribute of the bound function instead.
+            # For a classmethod, this means instance will be the class type
+            # and for a staticmethod it will be None. This is probably the
+            # more useful thing we can pass through even though we loose
+            # knowledge of whether they were called on the instance vs the
+            # class type, as it reflects what they have available in the
+            # decoratored function.
+
+            instance = getattr(self.__wrapped__, '__self__', None)
+
+            return self._self_wrapper(self.__wrapped__, instance, args,
+                    kwargs)
+
+class FunctionWrapper(_FunctionWrapperBase):
+
+    __bound_function_wrapper__ = BoundFunctionWrapper
+
+    def __init__(self, wrapped, wrapper, enabled=None):
+        # What it is we are wrapping here could be anything. We need to
+        # try and detect specific cases though. In particular, we need
+        # to detect when we are given something that is a method of a
+        # class. Further, we need to know when it is likely an instance
+        # method, as opposed to a class or static method. This can
+        # become problematic though as there isn't strictly a fool proof
+        # method of knowing.
+        #
+        # The situations we could encounter when wrapping a method are:
+        #
+        # 1. The wrapper is being applied as part of a decorator which
+        # is a part of the class definition. In this case what we are
+        # given is the raw unbound function, classmethod or staticmethod
+        # wrapper objects.
+        #
+        # The problem here is that we will not know we are being applied
+        # in the context of the class being set up. This becomes
+        # important later for the case of an instance method, because in
+        # that case we just see it as a raw function and can't
+        # distinguish it from wrapping a normal function outside of
+        # a class context.
+        #
+        # 2. The wrapper is being applied when performing monkey
+        # patching of the class type afterwards and the method to be
+        # wrapped was retrieved direct from the __dict__ of the class
+        # type. This is effectively the same as (1) above.
+        #
+        # 3. The wrapper is being applied when performing monkey
+        # patching of the class type afterwards and the method to be
+        # wrapped was retrieved from the class type. In this case
+        # binding will have been performed where the instance against
+        # which the method is bound will be None at that point.
+        #
+        # This case is a problem because we can no longer tell if the
+        # method was a static method, plus if using Python3, we cannot
+        # tell if it was an instance method as the concept of an
+        # unnbound method no longer exists.
+        #
+        # 4. The wrapper is being applied when performing monkey
+        # patching of an instance of a class. In this case binding will
+        # have been perfomed where the instance was not None.
+        #
+        # This case is a problem because we can no longer tell if the
+        # method was a static method.
+        #
+        # Overall, the best we can do is look at the original type of the
+        # object which was wrapped prior to any binding being done and
+        # see if it is an instance of classmethod or staticmethod. In
+        # the case where other decorators are between us and them, if
+        # they do not propagate the __class__  attribute so that the
+        # isinstance() checks works, then likely this will do the wrong
+        # thing where classmethod and staticmethod are used.
+        #
+        # Since it is likely to be very rare that anyone even puts
+        # decorators around classmethod and staticmethod, likelihood of
+        # that being an issue is very small, so we accept it and suggest
+        # that those other decorators be fixed. It is also only an issue
+        # if a decorator wants to actually do things with the arguments.
+        #
+        # As to not being able to identify static methods properly, we
+        # just hope that that isn't something people are going to want
+        # to wrap, or if they do suggest they do it the correct way by
+        # ensuring that it is decorated in the class definition itself,
+        # or patch it in the __dict__ of the class type.
+        #
+        # So to get the best outcome we can, whenever we aren't sure what
+        # it is, we label it as a 'function'. If it was already bound and
+        # that is rebound later, we assume that it will be an instance
+        # method and try an cope with the possibility that the 'self'
+        # argument it being passed as an explicit argument and shuffle
+        # the arguments around to extract 'self' for use as the instance.
+
+        if isinstance(wrapped, classmethod):
+            binding = 'classmethod'
+
+        elif isinstance(wrapped, staticmethod):
+            binding = 'staticmethod'
+
+        elif hasattr(wrapped, '__self__'):
+            if inspect.isclass(wrapped.__self__):
+                binding = 'classmethod'
+            else:
+                binding = 'function'
+
+        else:
+            binding = 'function'
+
+        super(FunctionWrapper, self).__init__(wrapped, None, wrapper,
+                enabled, binding)
+
+try:
+    from ._wrappers import (ObjectProxy, CallableObjectProxy, FunctionWrapper,
+        BoundFunctionWrapper, _FunctionWrapperBase)
+except ImportError:
+    pass
+
+# Helper functions for applying wrappers to existing functions.
+
+def resolve_path(module, name):
+    if isinstance(module, string_types):
+        __import__(module)
+        module = sys.modules[module]
+
+    parent = module
+
+    path = name.split('.')
+    attribute = path[0]
+
+    original = getattr(parent, attribute)
+    for attribute in path[1:]:
+        parent = original
+
+        # We can't just always use getattr() because in doing
+        # that on a class it will cause binding to occur which
+        # will complicate things later and cause some things not
+        # to work. For the case of a class we therefore access
+        # the __dict__ directly. To cope though with the wrong
+        # class being given to us, or a method being moved into
+        # a base class, we need to walk the class heirarchy to
+        # work out exactly which __dict__ the method was defined
+        # in, as accessing it from __dict__ will fail if it was
+        # not actually on the class given. Fallback to using
+        # getattr() if we can't find it. If it truly doesn't
+        # exist, then that will fail.
+
+        if inspect.isclass(original):
+            for cls in inspect.getmro(original):
+                if attribute in vars(original):
+                    original = vars(original)[attribute]
+                    break
+            else:
+                original = getattr(original, attribute)
+
+        else:
+            original = getattr(original, attribute)
+
+    return (parent, attribute, original)
+
+def apply_patch(parent, attribute, replacement):
+    setattr(parent, attribute, replacement)
+
+def wrap_object(module, name, factory, args=(), kwargs={}):
+    (parent, attribute, original) = resolve_path(module, name)
+    wrapper = factory(original, *args, **kwargs)
+    apply_patch(parent, attribute, wrapper)
+    return wrapper
+
+# Function for applying a proxy object to an attribute of a class
+# instance. The wrapper works by defining an attribute of the same name
+# on the class which is a descriptor and which intercepts access to the
+# instance attribute. Note that this cannot be used on attributes which
+# are themselves defined by a property object.
+
+class AttributeWrapper(object):
+
+    def __init__(self, attribute, factory, args, kwargs):
+        self.attribute = attribute
+        self.factory = factory
+        self.args = args
+        self.kwargs = kwargs
+
+    def __get__(self, instance, owner):
+        value = instance.__dict__[self.attribute]
+        return self.factory(value, *self.args, **self.kwargs)
+
+    def __set__(self, instance, value):
+        instance.__dict__[self.attribute] = value
+
+    def __delete__(self, instance):
+        del instance.__dict__[self.attribute]
+
+def wrap_object_attribute(module, name, factory, args=(), kwargs={}):
+    path, attribute = name.rsplit('.', 1)
+    parent = resolve_path(module, path)[2]
+    wrapper = AttributeWrapper(attribute, factory, args, kwargs)
+    apply_patch(parent, attribute, wrapper)
+    return wrapper
+
+# Functions for creating a simple decorator using a FunctionWrapper,
+# plus short cut functions for applying wrappers to functions. These are
+# for use when doing monkey patching. For a more featured way of
+# creating decorators see the decorator decorator instead.
+
+def function_wrapper(wrapper):
+    def _wrapper(wrapped, instance, args, kwargs):
+        target_wrapped = args[0]
+        if instance is None:
+            target_wrapper = wrapper
+        elif inspect.isclass(instance):
+            target_wrapper = wrapper.__get__(None, instance)
+        else:
+            target_wrapper = wrapper.__get__(instance, type(instance))
+        return FunctionWrapper(target_wrapped, target_wrapper)
+    return FunctionWrapper(wrapper, _wrapper)
+
+def wrap_function_wrapper(module, name, wrapper):
+    return wrap_object(module, name, FunctionWrapper, (wrapper,))
+
+def patch_function_wrapper(module, name):
+    def _wrapper(wrapper):
+        return wrap_object(module, name, FunctionWrapper, (wrapper,))
+    return _wrapper
+
+def transient_function_wrapper(module, name):
+    def _decorator(wrapper):
+        def _wrapper(wrapped, instance, args, kwargs):
+            target_wrapped = args[0]
+            if instance is None:
+                target_wrapper = wrapper
+            elif inspect.isclass(instance):
+                target_wrapper = wrapper.__get__(None, instance)
+            else:
+                target_wrapper = wrapper.__get__(instance, type(instance))
+            def _execute(wrapped, instance, args, kwargs):
+                (parent, attribute, original) = resolve_path(module, name)
+                replacement = FunctionWrapper(original, target_wrapper)
+                setattr(parent, attribute, replacement)
+                try:
+                    return wrapped(*args, **kwargs)
+                finally:
+                    setattr(parent, attribute, original)
+            return FunctionWrapper(target_wrapped, _execute)
+        return FunctionWrapper(wrapper, _wrapper)
+    return _decorator
+
+# A weak function proxy. This will work on instance methods, class
+# methods, static methods and regular functions. Special treatment is
+# needed for the method types because the bound method is effectively a
+# transient object and applying a weak reference to one will immediately
+# result in it being destroyed and the weakref callback called. The weak
+# reference is therefore applied to the instance the method is bound to
+# and the original function. The function is then rebound at the point
+# of a call via the weak function proxy.
+
+def _weak_function_proxy_callback(ref, proxy, callback):
+    if proxy._self_expired:
+        return
+
+    proxy._self_expired = True
+
+    # This could raise an exception. We let it propagate back and let
+    # the weakref.proxy() deal with it, at which point it generally
+    # prints out a short error message direct to stderr and keeps going.
+
+    if callback is not None:
+        callback(proxy)
+
+class WeakFunctionProxy(ObjectProxy):
+
+    __slots__ = ('_self_expired', '_self_instance')
+
+    def __init__(self, wrapped, callback=None):
+        # We need to determine if the wrapped function is actually a
+        # bound method. In the case of a bound method, we need to keep a
+        # reference to the original unbound function and the instance.
+        # This is necessary because if we hold a reference to the bound
+        # function, it will be the only reference and given it is a
+        # temporary object, it will almost immediately expire and
+        # the weakref callback triggered. So what is done is that we
+        # hold a reference to the instance and unbound function and
+        # when called bind the function to the instance once again and
+        # then call it. Note that we avoid using a nested function for
+        # the callback here so as not to cause any odd reference cycles.
+
+        _callback = callback and functools.partial(
+                _weak_function_proxy_callback, proxy=self,
+                callback=callback)
+
+        self._self_expired = False
+
+        if isinstance(wrapped, _FunctionWrapperBase):
+            self._self_instance = weakref.ref(wrapped._self_instance,
+                    _callback)
+
+            if wrapped._self_parent is not None:
+                super(WeakFunctionProxy, self).__init__(
+                        weakref.proxy(wrapped._self_parent, _callback))
+
+            else:
+                super(WeakFunctionProxy, self).__init__(
+                        weakref.proxy(wrapped, _callback))
+
+            return
+
+        try:
+            self._self_instance = weakref.ref(wrapped.__self__, _callback)
+
+            super(WeakFunctionProxy, self).__init__(
+                    weakref.proxy(wrapped.__func__, _callback))
+
+        except AttributeError:
+            self._self_instance = None
+
+            super(WeakFunctionProxy, self).__init__(
+                    weakref.proxy(wrapped, _callback))
+
+    def __call__(self, *args, **kwargs):
+        # We perform a boolean check here on the instance and wrapped
+        # function as that will trigger the reference error prior to
+        # calling if the reference had expired.
+
+        instance = self._self_instance and self._self_instance()
+        function = self.__wrapped__ and self.__wrapped__
+
+        # If the wrapped function was originally a bound function, for
+        # which we retained a reference to the instance and the unbound
+        # function we need to rebind the function and then call it. If
+        # not just called the wrapped function.
+
+        if instance is None:
+            return self.__wrapped__(*args, **kwargs)
+
+        return function.__get__(instance, type(instance))(*args, **kwargs)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pynliner/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pynliner/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pynliner/__init__.py	(revision 1126)
@@ -0,0 +1,283 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""Pynliner : Convert CSS to inline styles
+
+Python CSS-to-inline-styles conversion tool for HTML using BeautifulSoup and
+cssutils
+
+Copyright (c) 2011-2013 Tanner Netterville
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+The generated output of this software shall not be used in a mass marketing
+service.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
+EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR 
+THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+"""
+
+__version__ = "0.5.2"
+
+import re
+import urlparse
+import urllib2
+import cssutils
+from BeautifulSoup import BeautifulSoup, Comment
+from soupselect import select
+
+
+class Pynliner(object):
+    """Pynliner class"""
+
+    soup = False
+    style_string = False
+    stylesheet = False
+    output = False
+
+    def __init__(self, log=None, allow_conditional_comments=False):
+        self.log = log
+        cssutils.log.enabled = False if log is None else True
+        self.extra_style_strings = []
+        self.allow_conditional_comments = allow_conditional_comments
+        self.root_url = None
+        self.relative_url = None
+
+    def from_url(self, url):
+        """Gets remote HTML page for conversion
+
+        Downloads HTML page from `url` as a string and passes it to the
+        `from_string` method. Also sets `self.root_url` and `self.relative_url`
+        for use in importing <link> elements.
+
+        Returns self.
+
+        >>> p = Pynliner()
+        >>> p.from_url('http://somewebsite.com/file.html')
+        <Pynliner object at 0x26ac70>
+        """
+        self.url = url
+        self.relative_url = '/'.join(url.split('/')[:-1]) + '/'
+        self.root_url = '/'.join(url.split('/')[:3])
+        self.source_string = self._get_url(self.url)
+        return self
+
+    def from_string(self, string):
+        """Generates a Pynliner object from the given HTML string.
+
+        Returns self.
+
+        >>> p = Pynliner()
+        >>> p.from_string('<style>h1 {color:#ffcc00;}</style><h1>Hi</h1>')
+        <Pynliner object at 0x26ac70>
+        """
+        self.source_string = string
+        return self
+
+    def with_cssString(self, css_string):
+        """Adds external CSS to the Pynliner object. Can be "chained".
+
+        Returns self.
+
+        >>> html = "<h1>Hello World!</h1>"
+        >>> css = "h1 { color:#ffcc00; }"
+        >>> p = Pynliner()
+        >>> p.from_string(html).with_cssString(css)
+        <pynliner.Pynliner object at 0x2ca810>
+        """
+        self.extra_style_strings.append(css_string)
+        return self
+
+    def run(self):
+        """Applies each step of the process if they have not already been
+        performed.
+
+        Returns Unicode output with applied styles.
+
+        >>> html = "<style>h1 { color:#ffcc00; }</style><h1>Hello World!</h1>"
+        >>> Pynliner().from_string(html).run()
+        u'<h1 style="color: #fc0">Hello World!</h1>'
+        """
+        if not self.soup:
+            self._get_soup()
+        if not self.stylesheet:
+            self._get_styles()
+        self._apply_styles()
+        self._get_output()
+        self._clean_output()
+        return self.output
+
+    def _get_url(self, url):
+        """Returns the response content from the given url
+        """
+        return urllib2.urlopen(url).read()
+
+    def _get_soup(self):
+        """Convert source string to BeautifulSoup object. Sets it to self.soup.
+
+        If using mod_wgsi, use html5 parsing to prevent BeautifulSoup
+        incompatibility.
+        """
+        # Check if mod_wsgi is running
+        # - see http://code.google.com/p/modwsgi/wiki/TipsAndTricks
+        try:
+            from mod_wsgi import version
+            self.soup = BeautifulSoup(self.source_string, "html5lib")
+        except:
+            self.soup = BeautifulSoup(self.source_string)
+
+    def _get_styles(self):
+        """Gets all CSS content from and removes all <link rel="stylesheet"> and
+        <style> tags concatenating into one CSS string which is then parsed with
+        cssutils and the resulting CSSStyleSheet object set to
+        `self.stylesheet`.
+        """
+        self._get_external_styles()
+        self._get_internal_styles()
+        for style_string in self.extra_style_strings:
+            self.style_string += style_string
+        cssparser = cssutils.CSSParser(log=self.log)
+        self.stylesheet = cssparser.parseString(self.style_string)
+
+    def _get_external_styles(self):
+        """Gets <link> element styles
+        """
+        if not self.style_string:
+            self.style_string = u''
+        else:
+            self.style_string += u'\n'
+
+        link_tags = self.soup.findAll('link', {'rel': 'stylesheet'})
+        for tag in link_tags:
+            url = tag['href']
+
+            # Convert the relative URL to an absolute URL ready to pass to urllib
+            base_url = self.relative_url or self.root_url
+            url = urlparse.urljoin(base_url, url)
+
+            self.style_string += self._get_url(url)
+            tag.extract()
+
+    def _get_internal_styles(self):
+        """Gets <style> element styles
+        """
+        if not self.style_string:
+            self.style_string = u''
+        else:
+            self.style_string += u'\n'
+
+        style_tags = self.soup.findAll('style')
+        for tag in style_tags:
+            self.style_string += u'\n'.join(tag.contents) + u'\n'
+            tag.extract()
+
+    def _get_specificity_from_list(self, lst):
+        """
+        Takes an array of ints and returns an integer formed
+        by adding all ints multiplied by the power of 10 of the current index
+
+        (1, 0, 0, 1) => (1 * 10**3) + (0 * 10**2) + (0 * 10**1) + (1 * 10**0) => 1001
+        """
+        return int(''.join(map(str, lst)))
+
+    def _get_rule_specificity(self, rule):
+        """
+        For a given CSSRule get its selector specificity in base 10
+        """
+        return sum(map(self._get_specificity_from_list, (s.specificity for s in rule.selectorList)))
+
+    def _apply_styles(self):
+        """Steps through CSS rules and applies each to all the proper elements
+        as @style attributes prepending any current @style attributes.
+        """
+        rules = self.stylesheet.cssRules.rulesOfType(1)
+        elem_prop_map = {}
+        elem_style_map = {}
+
+        # build up a property list for every styled element
+        for rule in rules:
+            # select elements for every selector
+            selectors = rule.selectorText.split(',')
+            elements = []
+            for selector in selectors:
+                elements += select(self.soup, selector.strip())
+            # build prop_list for each selected element
+            for elem in elements:
+                if elem not in elem_prop_map:
+                    elem_prop_map[elem] = []
+                elem_prop_map[elem].append({
+                    'specificity': self._get_rule_specificity(rule),
+                    'props': rule.style.getProperties(),
+                })
+
+        # build up another property list using selector specificity
+        for elem, props in elem_prop_map.items():
+            if elem not in elem_style_map:
+                elem_style_map[elem] = cssutils.css.CSSStyleDeclaration()
+            # ascending sort of prop_lists based on specificity
+            props = sorted(props, key=lambda p: p['specificity'])
+            # for each prop_list, apply to CSSStyleDeclaration
+            for prop_list in map(lambda obj: obj['props'], props):
+                for prop in prop_list:
+                    elem_style_map[elem].removeProperty(prop.name)
+                    elem_style_map[elem].setProperty(prop.name, prop.value)
+
+
+        # apply rules to elements
+        for elem, style_declaration in elem_style_map.items():
+            if elem.has_key('style'):
+                elem['style'] = u'%s; %s' % (style_declaration.cssText.replace('\n', ' '), elem['style'])
+            else:
+                elem['style'] = style_declaration.cssText.replace('\n', ' ')
+        
+    def _get_output(self):
+        """Generate Unicode string of `self.soup` and set it to `self.output`
+
+        Returns self.output
+        """
+        self.output = unicode(self.soup)
+        return self.output
+    
+    def _clean_output(self):
+        """Clean up after BeautifulSoup's output.
+        """
+        if self.allow_conditional_comments:
+            matches = re.finditer('(<!--\[if .+\].+?&lt;!\[endif\]-->)', self.output)
+            for match in matches:
+                comment = match.group()
+                comment = comment.replace('&gt;', '>')
+                comment = comment.replace('&lt;', '<')
+                self.output = (self.output[:match.start()] + comment +
+                               self.output[match.end():])
+
+
+def fromURL(url, log=None):
+    """Shortcut Pynliner constructor. Equivalent to:
+
+    >>> Pynliner().from_url(someURL).run()
+
+    Returns processed HTML string.
+    """
+    return Pynliner(log).from_url(url).run()
+
+def fromString(string, log=None):
+    """Shortcut Pynliner constructor. Equivalent to:
+
+    >>> Pynliner().from_string(someString).run()
+
+    Returns processed HTML string.
+    """
+    return Pynliner(log).from_string(string).run()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pynliner/soupselect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pynliner/soupselect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pynliner/soupselect.py	(revision 1126)
@@ -0,0 +1,229 @@
+"""
+# Included with pynliner since it isn't on PyPI #
+
+soupselect.py
+
+CSS selector support for BeautifulSoup.
+
+soup = BeautifulSoup('<html>...')
+select(soup, 'div')
+    - returns a list of div elements
+
+select(soup, 'div#main ul a')
+    - returns a list of links inside a ul inside div#main
+
+patched to support multiple class selectors here http://code.google.com/p/soupselect/issues/detail?id=4#c0
+"""
+import re
+import BeautifulSoup
+
+attribute_regex = re.compile('\[(?P<attribute>\w+)(?P<operator>[=~\|\^\$\*]?)=?["\']?(?P<value>[^\]"]*)["\']?\]')
+pseudo_class_regex = re.compile(ur':(([^:.#(*\[]|\([^)]+\))+)')
+
+def get_attribute_checker(operator, attribute, value=''):
+    """
+    Takes an operator, attribute and optional value; returns a function that
+    will return True for elements that match that combination.
+    """
+    return {
+        '=': lambda el: el.get(attribute) == value,
+        # attribute includes value as one of a set of space separated tokens
+        '~': lambda el: value in el.get(attribute, '').split(),
+        # attribute starts with value
+        '^': lambda el: el.get(attribute, '').startswith(value),
+        # attribute ends with value
+        '$': lambda el: el.get(attribute, '').endswith(value),
+        # attribute contains value
+        '*': lambda el: value in el.get(attribute, ''),
+        # attribute is either exactly value or starts with value-
+        '|': lambda el: el.get(attribute, '') == value \
+            or el.get(attribute, '').startswith('%s-' % value),
+    }.get(operator, lambda el: el.has_key(attribute))
+
+def is_white_space(el):
+    if isinstance(el, BeautifulSoup.NavigableString) and str(el).strip() == '':
+        return True
+    if isinstance(el, BeautifulSoup.Comment):
+        return True
+    return False
+
+def is_last_content_node(el):
+    result = False
+    if el is None:
+        result = True
+    elif is_white_space(el):
+        result = is_last_content_node(el.nextSibling)
+    return result
+
+def is_first_content_node(el):
+    result = False
+    if el is None:
+        result = True
+    if is_white_space(el):
+        result = is_first_content_node(el.previousSibling)
+    return result
+
+def get_pseudo_class_checker(psuedo_class):
+    """
+    Takes a psuedo_class, like "first-child" or "last-child"
+    and returns a function that will check if the element satisfies
+    that psuedo class
+    """
+    return {
+        'first-child': lambda el: is_first_content_node(getattr(el, 'previousSibling', None)),
+        'last-child': lambda el: is_last_content_node(getattr(el, 'nextSibling', None))
+    }.get(psuedo_class, lambda el: False)
+
+def get_checker(functions):
+    def checker(el):
+        for func in functions:
+            if not func(el):
+                return False
+        return el
+    return checker
+
+
+def select(soup, selector):
+    """
+    soup should be a BeautifulSoup instance; selector is a CSS selector 
+    specifying the elements you want to retrieve.
+    """
+    handle_token = True
+    current_context = [(soup, [])]
+    operator = None
+    while selector:
+        if handle_token:
+            # Get the rightmost token
+            handle_token = False
+            match = re.search('([_0-9a-zA-Z-#.:*"\'\[\\]=]+)$', selector)
+            if not match:
+                raise Exception("No match was found. We're done or something is broken")
+            token = match.groups(1)[0]
+
+            # remove this token from the selector
+            selector = selector.rsplit(token, 1)[0].rstrip()
+            
+            checker_functions = []
+            #
+            # Get attribute selectors from token
+            #
+            matches = attribute_regex.findall(token)
+            for match in matches:
+                checker_functions.append(get_attribute_checker(match[1], match[0], match[2]))
+
+            #
+            # Get pseudo classes from token
+            #
+            for match in pseudo_class_regex.finditer(token):
+                checker_functions.append(get_pseudo_class_checker(match.groups(1)[0]))
+
+            checker = get_checker(checker_functions)
+            #
+            # Get tag
+            #
+            tag = re.findall('^([a-zA-Z0-9]+)', token)
+            if len(tag) == 0:
+                tag = True
+            elif len(tag) == 1:
+                tag = tag[0]
+            else:
+                raise Exception("Multiple tags found (invalid CSS)")
+
+            #
+            # Get ID
+            #
+            ids = re.findall('#([a-zA-Z0-9_-]+)', token)
+            if len(ids) > 1:
+                raise Exception("Only single # OK")
+            #
+            # Get classes
+            #
+            classes = re.findall('\.([a-zA-Z0-9_-]+)', token)
+
+            #
+            # Search contexts for matches
+            #
+            found = []
+            find_dict = {}
+            if ids:
+                find_dict['id'] = ids
+            if classes:
+                find_dict['class'] = lambda attr: attr and set(classes).issubset(attr.split())
+            if operator is None:
+                # This is the first token: simply find all matches
+                for context in current_context:
+                    context_matches = [el for el in context[0].findAll(tag, find_dict) if checker(el)]
+                    for context_match in context_matches:
+                        found.append(
+                            (context_match, [context_match]),
+                        )
+            elif operator == ' ':
+                # for each context in current_context, ensure there
+                # exists an element somewhere above that element that
+                # matches the provided token
+                # ("descendant" selector)
+                for context in current_context:
+                    context_matches = []
+                    for el in context[1]:
+                        if checker(el.findParent(tag, find_dict)):
+                            context_matches.append(el)
+                    if context_matches:
+                        found.append(
+                            (context[0], context_matches),
+                        )
+            elif operator == '>':
+                # for each context in current_context,
+                # check if the parent satisfies the provided
+                # arguments.
+                for context in current_context:
+                    context_matches = []
+                    for el in context[1]:
+                        if checker(el.findParent(tag, find_dict)) == el.parent:
+                            context_matches.append(el.parent)
+                    if context_matches:
+                        found.append(
+                            (context[0], context_matches),
+                        )
+            elif operator == '~':
+                # for each context in current_context
+                # check 
+                raise NotImplementedError("~ operator is not implemented. Sad face :(")
+            elif operator == '+':
+                # for each context in current_context
+                # check if the preceding sibling satisfies the
+                # provided arguments
+                for context in current_context:
+                    context_matches = []
+                    for el in context[1]:
+                        if checker(el.findPreviousSibling(tag, find_dict)) == el.previousSibling:
+                            context_matches.append(el.previousSibling)
+                    if context_matches:
+                        found.append(
+                            (context[0], context_matches)
+                        )
+            current_context = found
+        else:
+            # Get the next operator (whitespace, >, ~, +)
+            handle_token = True
+            operator = None
+            match = re.search('([>~+]+)$', selector)
+            if match:
+                operator = match.groups(1)[0]
+            else:
+                operator = ' '
+            selector = selector.rsplit(operator, 1)[0].rstrip()
+    return [entry[0] for entry in current_context]
+
+def monkeypatch(BeautifulSoupClass=None):
+    """
+    If you don't explicitly state the class to patch, defaults to the most 
+    common import location for BeautifulSoup.
+    """
+    if not BeautifulSoupClass:
+        from BeautifulSoup import BeautifulSoup as BeautifulSoupClass
+    BeautifulSoupClass.findSelect = select
+
+def unmonkeypatch(BeautifulSoupClass=None):
+    if not BeautifulSoupClass:
+        from BeautifulSoup import BeautifulSoup as BeautifulSoupClass
+    delattr(BeautifulSoupClass, 'findSelect')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/BeautifulSoupTests.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/BeautifulSoupTests.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/BeautifulSoupTests.py	(revision 1126)
@@ -0,0 +1,902 @@
+# -*- coding: utf-8 -*-
+"""Unit tests for Beautiful Soup.
+
+These tests make sure the Beautiful Soup works as it should. If you
+find a bug in Beautiful Soup, the best way to express it is as a test
+case like this that fails."""
+
+import unittest
+from BeautifulSoup import *
+
+class SoupTest(unittest.TestCase):
+
+    def assertSoupEquals(self, toParse, rep=None, c=BeautifulSoup):
+        """Parse the given text and make sure its string rep is the other
+        given text."""
+        if rep == None:
+            rep = toParse
+        self.assertEqual(str(c(toParse)), rep)
+
+
+class FollowThatTag(SoupTest):
+
+    "Tests the various ways of fetching tags from a soup."
+
+    def setUp(self):
+        ml = """
+        <a id="x">1</a>
+        <A id="a">2</a>
+        <b id="b">3</a>
+        <b href="foo" id="x">4</a>
+        <ac width=100>4</ac>"""
+        self.soup = BeautifulStoneSoup(ml)
+
+    def testFindAllByName(self):
+        matching = self.soup('a')
+        self.assertEqual(len(matching), 2)
+        self.assertEqual(matching[0].name, 'a')
+        self.assertEqual(matching, self.soup.findAll('a'))
+        self.assertEqual(matching, self.soup.findAll(SoupStrainer('a')))
+
+    def testFindAllByAttribute(self):
+        matching = self.soup.findAll(id='x')
+        self.assertEqual(len(matching), 2)
+        self.assertEqual(matching[0].name, 'a')
+        self.assertEqual(matching[1].name, 'b')
+
+        matching2 = self.soup.findAll(attrs={'id' : 'x'})
+        self.assertEqual(matching, matching2)
+
+        strainer = SoupStrainer(attrs={'id' : 'x'})
+        self.assertEqual(matching, self.soup.findAll(strainer))
+
+        self.assertEqual(len(self.soup.findAll(id=None)), 1)
+
+        self.assertEqual(len(self.soup.findAll(width=100)), 1)
+        self.assertEqual(len(self.soup.findAll(junk=None)), 5)
+        self.assertEqual(len(self.soup.findAll(junk=[1, None])), 5)
+
+        self.assertEqual(len(self.soup.findAll(junk=re.compile('.*'))), 0)
+        self.assertEqual(len(self.soup.findAll(junk=True)), 0)
+
+        self.assertEqual(len(self.soup.findAll(junk=True)), 0)
+        self.assertEqual(len(self.soup.findAll(href=True)), 1)
+
+    def testFindallByClass(self):
+        soup = BeautifulSoup('<b class="foo">Foo</b><a class="1 23 4">Bar</a>')
+        self.assertEqual(soup.find(attrs='foo').string, "Foo")
+        self.assertEqual(soup.find('a', '1').string, "Bar")
+        self.assertEqual(soup.find('a', '23').string, "Bar")
+        self.assertEqual(soup.find('a', '4').string, "Bar")
+
+        self.assertEqual(soup.find('a', '2'), None)
+
+    def testFindAllByList(self):
+        matching = self.soup(['a', 'ac'])
+        self.assertEqual(len(matching), 3)
+
+    def testFindAllByHash(self):
+        matching = self.soup({'a' : True, 'b' : True})
+        self.assertEqual(len(matching), 4)
+
+    def testFindAllText(self):
+        soup = BeautifulSoup("<html>\xbb</html>")
+        self.assertEqual(soup.findAll(text=re.compile('.*')),
+                         [u'\xbb'])
+
+    def testFindAllByRE(self):
+        import re
+        r = re.compile('a.*')
+        self.assertEqual(len(self.soup(r)), 3)
+
+    def testFindAllByMethod(self):
+        def matchTagWhereIDMatchesName(tag):
+            return tag.name == tag.get('id')
+
+        matching = self.soup.findAll(matchTagWhereIDMatchesName)
+        self.assertEqual(len(matching), 2)
+        self.assertEqual(matching[0].name, 'a')
+
+    def testFindByIndex(self):
+        """For when you have the tag and you want to know where it is."""
+        tag = self.soup.find('a', id="a")
+        self.assertEqual(self.soup.index(tag), 3)
+
+        # It works for NavigableStrings as well.
+        s = tag.string
+        self.assertEqual(tag.index(s), 0)
+
+        # If the tag isn't present, a ValueError is raised.
+        soup2 = BeautifulSoup("<b></b>")
+        tag2 = soup2.find('b')
+        self.assertRaises(ValueError, self.soup.index, tag2)
+
+    def testConflictingFindArguments(self):
+        """The 'text' argument takes precedence."""
+        soup = BeautifulSoup('Foo<b>Bar</b>Baz')
+        self.assertEqual(soup.find('b', text='Baz'), 'Baz')
+        self.assertEqual(soup.findAll('b', text='Baz'), ['Baz'])
+
+        self.assertEqual(soup.find(True, text='Baz'), 'Baz')
+        self.assertEqual(soup.findAll(True, text='Baz'), ['Baz'])
+
+    def testParents(self):
+        soup = BeautifulSoup('<ul id="foo"></ul><ul id="foo"><ul><ul id="foo" a="b"><b>Blah')
+        b = soup.b
+        self.assertEquals(len(b.findParents('ul', {'id' : 'foo'})), 2)
+        self.assertEquals(b.findParent('ul')['a'], 'b')
+
+    PROXIMITY_TEST = BeautifulSoup('<b id="1"><b id="2"><b id="3"><b id="4">')
+
+    def testNext(self):
+        soup = self.PROXIMITY_TEST
+        b = soup.find('b', {'id' : 2})
+        self.assertEquals(b.findNext('b')['id'], '3')
+        self.assertEquals(b.findNext('b')['id'], '3')
+        self.assertEquals(len(b.findAllNext('b')), 2)
+        self.assertEquals(len(b.findAllNext('b', {'id' : 4})), 1)
+
+    def testPrevious(self):
+        soup = self.PROXIMITY_TEST
+        b = soup.find('b', {'id' : 3})
+        self.assertEquals(b.findPrevious('b')['id'], '2')
+        self.assertEquals(b.findPrevious('b')['id'], '2')
+        self.assertEquals(len(b.findAllPrevious('b')), 2)
+        self.assertEquals(len(b.findAllPrevious('b', {'id' : 2})), 1)
+
+
+    SIBLING_TEST = BeautifulSoup('<blockquote id="1"><blockquote id="1.1"></blockquote></blockquote><blockquote id="2"><blockquote id="2.1"></blockquote></blockquote><blockquote id="3"><blockquote id="3.1"></blockquote></blockquote><blockquote id="4">')
+
+    def testNextSibling(self):
+        soup = self.SIBLING_TEST
+        tag = 'blockquote'
+        b = soup.find(tag, {'id' : 2})
+        self.assertEquals(b.findNext(tag)['id'], '2.1')
+        self.assertEquals(b.findNextSibling(tag)['id'], '3')
+        self.assertEquals(b.findNextSibling(tag)['id'], '3')
+        self.assertEquals(len(b.findNextSiblings(tag)), 2)
+        self.assertEquals(len(b.findNextSiblings(tag, {'id' : 4})), 1)
+
+    def testPreviousSibling(self):
+        soup = self.SIBLING_TEST
+        tag = 'blockquote'
+        b = soup.find(tag, {'id' : 3})
+        self.assertEquals(b.findPrevious(tag)['id'], '2.1')
+        self.assertEquals(b.findPreviousSibling(tag)['id'], '2')
+        self.assertEquals(b.findPreviousSibling(tag)['id'], '2')
+        self.assertEquals(len(b.findPreviousSiblings(tag)), 2)
+        self.assertEquals(len(b.findPreviousSiblings(tag, id=1)), 1)
+
+    def testTextNavigation(self):
+        soup = BeautifulSoup('Foo<b>Bar</b><i id="1"><b>Baz<br />Blee<hr id="1"/></b></i>Blargh')
+        baz = soup.find(text='Baz')
+        self.assertEquals(baz.findParent("i")['id'], '1')
+        self.assertEquals(baz.findNext(text='Blee'), 'Blee')
+        self.assertEquals(baz.findNextSibling(text='Blee'), 'Blee')
+        self.assertEquals(baz.findNextSibling(text='Blargh'), None)
+        self.assertEquals(baz.findNextSibling('hr')['id'], '1')
+
+class SiblingRivalry(SoupTest):
+    "Tests the nextSibling and previousSibling navigation."
+
+    def testSiblings(self):
+        soup = BeautifulSoup("<ul><li>1<p>A</p>B<li>2<li>3</ul>")
+        secondLI = soup.find('li').nextSibling
+        self.assert_(secondLI.name == 'li' and secondLI.string == '2')
+        self.assertEquals(soup.find(text='1').nextSibling.name, 'p')
+        self.assertEquals(soup.find('p').nextSibling, 'B')
+        self.assertEquals(soup.find('p').nextSibling.previousSibling.nextSibling, 'B')
+
+class TagsAreObjectsToo(SoupTest):
+    "Tests the various built-in functions of Tag objects."
+
+    def testLen(self):
+        soup = BeautifulSoup("<top>1<b>2</b>3</top>")
+        self.assertEquals(len(soup.top), 3)
+
+class StringEmUp(SoupTest):
+    "Tests the use of 'string' as an alias for a tag's only content."
+
+    def testString(self):
+        s = BeautifulSoup("<b>foo</b>")
+        self.assertEquals(s.b.string, 'foo')
+
+    def testLackOfString(self):
+        s = BeautifulSoup("<b>f<i>e</i>o</b>")
+        self.assert_(not s.b.string)
+
+    def testStringAssign(self):
+        s = BeautifulSoup("<b></b>")
+        b = s.b
+        b.string = "foo"
+        string = b.string
+        self.assertEquals(string, "foo")
+        self.assert_(isinstance(string, NavigableString))
+
+class AllText(SoupTest):
+    "Tests the use of 'text' to get all of string content from the tag."
+
+    def testText(self):
+        soup = BeautifulSoup("<ul><li>spam</li><li>eggs</li><li>cheese</li>")
+        self.assertEquals(soup.ul.text, "spameggscheese")
+        self.assertEquals(soup.ul.getText('/'), "spam/eggs/cheese")
+
+class ThatsMyLimit(SoupTest):
+    "Tests the limit argument."
+
+    def testBasicLimits(self):
+        s = BeautifulSoup('<br id="1" /><br id="1" /><br id="1" /><br id="1" />')
+        self.assertEquals(len(s.findAll('br')), 4)
+        self.assertEquals(len(s.findAll('br', limit=2)), 2)
+        self.assertEquals(len(s('br', limit=2)), 2)
+
+class OnlyTheLonely(SoupTest):
+    "Tests the parseOnly argument to the constructor."
+    def setUp(self):
+        x = []
+        for i in range(1,6):
+            x.append('<a id="%s">' % i)
+            for j in range(100,103):
+                x.append('<b id="%s.%s">Content %s.%s</b>' % (i,j, i,j))
+            x.append('</a>')
+        self.x = ''.join(x)
+
+    def testOnly(self):
+        strainer = SoupStrainer("b")
+        soup = BeautifulSoup(self.x, parseOnlyThese=strainer)
+        self.assertEquals(len(soup), 15)
+
+        strainer = SoupStrainer(id=re.compile("100.*"))
+        soup = BeautifulSoup(self.x, parseOnlyThese=strainer)
+        self.assertEquals(len(soup), 5)
+
+        strainer = SoupStrainer(text=re.compile("10[01].*"))
+        soup = BeautifulSoup(self.x, parseOnlyThese=strainer)
+        self.assertEquals(len(soup), 10)
+
+        strainer = SoupStrainer(text=lambda(x):x[8]=='3')
+        soup = BeautifulSoup(self.x, parseOnlyThese=strainer)
+        self.assertEquals(len(soup), 3)
+
+class PickleMeThis(SoupTest):
+    "Testing features like pickle and deepcopy."
+
+    def setUp(self):
+        self.page = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+"http://www.w3.org/TR/REC-html40/transitional.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>Beautiful Soup: We called him Tortoise because he taught us.</title>
+<link rev="made" href="mailto:leonardr@segfault.org">
+<meta name="Description" content="Beautiful Soup: an HTML parser optimized for screen-scraping.">
+<meta name="generator" content="Markov Approximation 1.4 (module: leonardr)">
+<meta name="author" content="Leonard Richardson">
+</head>
+<body>
+<a href="foo">foo</a>
+<a href="foo"><b>bar</b></a>
+</body>
+</html>"""
+
+        self.soup = BeautifulSoup(self.page)
+
+    def testPickle(self):
+        import pickle
+        dumped = pickle.dumps(self.soup, 2)
+        loaded = pickle.loads(dumped)
+        self.assertEqual(loaded.__class__, BeautifulSoup)
+        self.assertEqual(str(loaded), str(self.soup))
+
+    def testDeepcopy(self):
+        from copy import deepcopy
+        copied = deepcopy(self.soup)
+        self.assertEqual(str(copied), str(self.soup))
+
+    def testUnicodePickle(self):
+        import cPickle as pickle
+        html = "<b>" + chr(0xc3) + "</b>"
+        soup = BeautifulSoup(html)
+        dumped = pickle.dumps(soup, pickle.HIGHEST_PROTOCOL)
+        loaded = pickle.loads(dumped)
+        self.assertEqual(str(loaded), str(soup))
+
+
+class WriteOnlyCode(SoupTest):
+    "Testing the modification of the tree."
+
+    def testModifyAttributes(self):
+        soup = BeautifulSoup('<a id="1"></a>')
+        soup.a['id'] = 2
+        self.assertEqual(soup.renderContents(), '<a id="2"></a>')
+        del(soup.a['id'])
+        self.assertEqual(soup.renderContents(), '<a></a>')
+        soup.a['id2'] = 'foo'
+        self.assertEqual(soup.renderContents(), '<a id2="foo"></a>')
+
+    def testNewTagCreation(self):
+        "Makes sure tags don't step on each others' toes."
+        soup = BeautifulSoup()
+        a = Tag(soup, 'a')
+        ol = Tag(soup, 'ol')
+        a['href'] = 'http://foo.com/'
+        self.assertRaises(KeyError, lambda : ol['href'])
+
+    def testNewTagWithAttributes(self):
+        """Makes sure new tags can be created complete with attributes."""
+        soup = BeautifulSoup()
+        a = Tag(soup, 'a', [('href', 'foo')])
+        b = Tag(soup, 'b', {'class':'bar'})
+        soup.insert(0,a)
+        soup.insert(1,b)
+        self.assertEqual(soup.a['href'], 'foo')
+        self.assertEqual(soup.b['class'], 'bar')
+
+    def testTagReplacement(self):
+        # Make sure you can replace an element with itself.
+        text = "<a><b></b><c>Foo<d></d></c></a><a><e></e></a>"
+        soup = BeautifulSoup(text)
+        c = soup.c
+        soup.c.replaceWith(c)
+        self.assertEquals(str(soup), text)
+
+        # A very simple case
+        soup = BeautifulSoup("<b>Argh!</b>")
+        soup.find(text="Argh!").replaceWith("Hooray!")
+        newText = soup.find(text="Hooray!")
+        b = soup.b
+        self.assertEqual(newText.previous, b)
+        self.assertEqual(newText.parent, b)
+        self.assertEqual(newText.previous.next, newText)
+        self.assertEqual(newText.next, None)
+
+        # A more complex case
+        soup = BeautifulSoup("<a><b>Argh!</b><c></c><d></d></a>")
+        soup.b.insert(1, "Hooray!")
+        newText = soup.find(text="Hooray!")
+        self.assertEqual(newText.previous, "Argh!")
+        self.assertEqual(newText.previous.next, newText)
+
+        self.assertEqual(newText.previousSibling, "Argh!")
+        self.assertEqual(newText.previousSibling.nextSibling, newText)
+
+        self.assertEqual(newText.nextSibling, None)
+        self.assertEqual(newText.next, soup.c)
+
+        text = "<html>There's <b>no</b> business like <b>show</b> business</html>"
+        soup = BeautifulSoup(text)
+        no, show = soup.findAll('b')
+        show.replaceWith(no)
+        self.assertEquals(str(soup), "<html>There's  business like <b>no</b> business</html>")
+
+        # Even more complex
+        soup = BeautifulSoup("<a><b>Find</b><c>lady!</c><d></d></a>")
+        tag = Tag(soup, 'magictag')
+        tag.insert(0, "the")
+        soup.a.insert(1, tag)
+
+        b = soup.b
+        c = soup.c
+        theText = tag.find(text=True)
+        findText = b.find(text="Find")
+
+        self.assertEqual(findText.next, tag)
+        self.assertEqual(tag.previous, findText)
+        self.assertEqual(b.nextSibling, tag)
+        self.assertEqual(tag.previousSibling, b)
+        self.assertEqual(tag.nextSibling, c)
+        self.assertEqual(c.previousSibling, tag)
+
+        self.assertEqual(theText.next, c)
+        self.assertEqual(c.previous, theText)
+
+        # Aand... incredibly complex.
+        soup = BeautifulSoup("""<a>We<b>reserve<c>the</c><d>right</d></b></a><e>to<f>refuse</f><g>service</g></e>""")
+        f = soup.f
+        a = soup.a
+        c = soup.c
+        e = soup.e
+        weText = a.find(text="We")
+        soup.b.replaceWith(soup.f)
+        self.assertEqual(str(soup), "<a>We<f>refuse</f></a><e>to<g>service</g></e>")
+
+        self.assertEqual(f.previous, weText)
+        self.assertEqual(weText.next, f)
+        self.assertEqual(f.previousSibling, weText)
+        self.assertEqual(f.nextSibling, None)
+        self.assertEqual(weText.nextSibling, f)
+
+    def testReplaceWithChildren(self):
+        soup = BeautifulStoneSoup(
+            "<top><replace><child1/><child2/></replace></top>",
+            selfClosingTags=["child1", "child2"])
+        soup.replaceTag.replaceWithChildren()
+        self.assertEqual(soup.top.contents[0].name, "child1")
+        self.assertEqual(soup.top.contents[1].name, "child2")
+
+    def testAppend(self):
+       doc = "<p>Don't leave me <b>here</b>.</p> <p>Don't leave me.</p>"
+       soup = BeautifulSoup(doc)
+       second_para = soup('p')[1]
+       bold = soup.find('b')
+       soup('p')[1].append(soup.find('b'))
+       self.assertEqual(bold.parent, second_para)
+       self.assertEqual(str(soup),
+                        "<p>Don't leave me .</p> "
+                        "<p>Don't leave me.<b>here</b></p>")
+
+    def testTagExtraction(self):
+        # A very simple case
+        text = '<html><div id="nav">Nav crap</div>Real content here.</html>'
+        soup = BeautifulSoup(text)
+        extracted = soup.find("div", id="nav").extract()
+        self.assertEqual(str(soup), "<html>Real content here.</html>")
+        self.assertEqual(str(extracted), '<div id="nav">Nav crap</div>')
+
+        # A simple case, a more complex test.
+        text = "<doc><a>1<b>2</b></a><a>i<b>ii</b></a><a>A<b>B</b></a></doc>"
+        soup = BeautifulStoneSoup(text)
+        doc = soup.doc
+        numbers, roman, letters = soup("a")
+
+        self.assertEqual(roman.parent, doc)
+        oldPrevious = roman.previous
+        endOfThisTag = roman.nextSibling.previous
+        self.assertEqual(oldPrevious, "2")
+        self.assertEqual(roman.next, "i")
+        self.assertEqual(endOfThisTag, "ii")
+        self.assertEqual(roman.previousSibling, numbers)
+        self.assertEqual(roman.nextSibling, letters)
+
+        roman.extract()
+        self.assertEqual(roman.parent, None)
+        self.assertEqual(roman.previous, None)
+        self.assertEqual(roman.next, "i")
+        self.assertEqual(letters.previous, '2')
+        self.assertEqual(roman.previousSibling, None)
+        self.assertEqual(roman.nextSibling, None)
+        self.assertEqual(endOfThisTag.next, None)
+        self.assertEqual(roman.b.contents[0].next, None)
+        self.assertEqual(numbers.nextSibling, letters)
+        self.assertEqual(letters.previousSibling, numbers)
+        self.assertEqual(len(doc.contents), 2)
+        self.assertEqual(doc.contents[0], numbers)
+        self.assertEqual(doc.contents[1], letters)
+
+        # A more complex case.
+        text = "<a>1<b>2<c>Hollywood, baby!</c></b></a>3"
+        soup = BeautifulStoneSoup(text)
+        one = soup.find(text="1")
+        three = soup.find(text="3")
+        toExtract = soup.b
+        soup.b.extract()
+        self.assertEqual(one.next, three)
+        self.assertEqual(three.previous, one)
+        self.assertEqual(one.parent.nextSibling, three)
+        self.assertEqual(three.previousSibling, soup.a)
+        
+    def testClear(self):
+        soup = BeautifulSoup("<ul><li></li><li></li></ul>")
+        soup.ul.clear()
+        self.assertEqual(len(soup.ul.contents), 0)
+
+class TheManWithoutAttributes(SoupTest):
+    "Test attribute access"
+
+    def testHasKey(self):
+        text = "<foo attr='bar'>"
+        self.assertEquals(BeautifulSoup(text).foo.has_key('attr'), True)
+
+class QuoteMeOnThat(SoupTest):
+    "Test quoting"
+    def testQuotedAttributeValues(self):
+        self.assertSoupEquals("<foo attr='bar'></foo>",
+                              '<foo attr="bar"></foo>')
+
+        text = """<foo attr='bar "brawls" happen'>a</foo>"""
+        soup = BeautifulSoup(text)
+        self.assertEquals(soup.renderContents(), text)
+
+        soup.foo['attr'] = 'Brawls happen at "Bob\'s Bar"'
+        newText = """<foo attr='Brawls happen at "Bob&squot;s Bar"'>a</foo>"""
+        self.assertSoupEquals(soup.renderContents(), newText)
+
+        self.assertSoupEquals('<this is="really messed up & stuff">',
+                              '<this is="really messed up &amp; stuff"></this>')
+
+        # This is not what the original author had in mind, but it's
+        # a legitimate interpretation of what they wrote.
+        self.assertSoupEquals("""<a href="foo</a>, </a><a href="bar">baz</a>""",
+        '<a href="foo&lt;/a&gt;, &lt;/a&gt;&lt;a href="></a>, <a href="bar">baz</a>')
+
+        # SGMLParser generates bogus parse events when attribute values
+        # contain embedded brackets, but at least Beautiful Soup fixes
+        # it up a little.
+        self.assertSoupEquals('<a b="<a>">', '<a b="&lt;a&gt;"></a><a>"&gt;</a>')
+        self.assertSoupEquals('<a href="http://foo.com/<a> and blah and blah',
+                              """<a href='"http://foo.com/'></a><a> and blah and blah</a>""")
+
+
+
+class YoureSoLiteral(SoupTest):
+    "Test literal mode."
+    def testLiteralMode(self):
+        text = "<script>if (i<imgs.length)</script><b>Foo</b>"
+        soup = BeautifulSoup(text)
+        self.assertEqual(soup.script.contents[0], "if (i<imgs.length)")
+        self.assertEqual(soup.b.contents[0], "Foo")
+
+    def testTextArea(self):
+        text = "<textarea><b>This is an example of an HTML tag</b><&<&</textarea>"
+        soup = BeautifulSoup(text)
+        self.assertEqual(soup.textarea.contents[0],
+                         "<b>This is an example of an HTML tag</b><&<&")
+
+class OperatorOverload(SoupTest):
+    "Our operators do it all! Call now!"
+
+    def testTagNameAsFind(self):
+        "Tests that referencing a tag name as a member delegates to find()."
+        soup = BeautifulSoup('<b id="1">foo<i>bar</i></b><b>Red herring</b>')
+        self.assertEqual(soup.b.i, soup.find('b').find('i'))
+        self.assertEqual(soup.b.i.string, 'bar')
+        self.assertEqual(soup.b['id'], '1')
+        self.assertEqual(soup.b.contents[0], 'foo')
+        self.assert_(not soup.a)
+
+        #Test the .fooTag variant of .foo.
+        self.assertEqual(soup.bTag.iTag.string, 'bar')
+        self.assertEqual(soup.b.iTag.string, 'bar')
+        self.assertEqual(soup.find('b').find('i'), soup.bTag.iTag)
+
+class NestableEgg(SoupTest):
+    """Here we test tag nesting. TEST THE NEST, DUDE! X-TREME!"""
+
+    def testParaInsideBlockquote(self):
+        soup = BeautifulSoup('<blockquote><p><b>Foo</blockquote><p>Bar')
+        self.assertEqual(soup.blockquote.p.b.string, 'Foo')
+        self.assertEqual(soup.blockquote.b.string, 'Foo')
+        self.assertEqual(soup.find('p', recursive=False).string, 'Bar')
+
+    def testNestedTables(self):
+        text = """<table id="1"><tr><td>Here's another table:
+        <table id="2"><tr><td>Juicy text</td></tr></table></td></tr></table>"""
+        soup = BeautifulSoup(text)
+        self.assertEquals(soup.table.table.td.string, 'Juicy text')
+        self.assertEquals(len(soup.findAll('table')), 2)
+        self.assertEquals(len(soup.table.findAll('table')), 1)
+        self.assertEquals(soup.find('table', {'id' : 2}).parent.parent.parent.name,
+                          'table')
+
+        text = "<table><tr><td><div><table>Foo</table></div></td></tr></table>"
+        soup = BeautifulSoup(text)
+        self.assertEquals(soup.table.tr.td.div.table.contents[0], "Foo")
+
+        text = """<table><thead><tr>Foo</tr></thead><tbody><tr>Bar</tr></tbody>
+        <tfoot><tr>Baz</tr></tfoot></table>"""
+        soup = BeautifulSoup(text)
+        self.assertEquals(soup.table.thead.tr.contents[0], "Foo")
+
+    def testBadNestedTables(self):
+        soup = BeautifulSoup("<table><tr><table><tr id='nested'>")
+        self.assertEquals(soup.table.tr.table.tr['id'], 'nested')
+
+class CleanupOnAisleFour(SoupTest):
+    """Here we test cleanup of text that breaks SGMLParser or is just
+    obnoxious."""
+
+    def testSelfClosingtag(self):
+        self.assertEqual(str(BeautifulSoup("Foo<br/>Bar").find('br')),
+                         '<br />')
+
+        self.assertSoupEquals('<p>test1<br/>test2</p>',
+                              '<p>test1<br />test2</p>')
+
+        text = '<p>test1<selfclosing>test2'
+        soup = BeautifulStoneSoup(text)
+        self.assertEqual(str(soup),
+                         '<p>test1<selfclosing>test2</selfclosing></p>')
+
+        soup = BeautifulStoneSoup(text, selfClosingTags='selfclosing')
+        self.assertEqual(str(soup),
+                         '<p>test1<selfclosing />test2</p>')
+
+    def testSelfClosingTagOrNot(self):
+        text = "<item><link>http://foo.com/</link></item>"
+        self.assertEqual(BeautifulStoneSoup(text).renderContents(), text)
+        self.assertEqual(BeautifulSoup(text).renderContents(),
+                         '<item><link />http://foo.com/</item>')
+
+    def testCData(self):
+        xml = "<root>foo<![CDATA[foobar]]>bar</root>"
+        self.assertSoupEquals(xml, xml)
+        r = re.compile("foo.*bar")
+        soup = BeautifulSoup(xml)
+        self.assertEquals(soup.find(text=r).string, "foobar")
+        self.assertEquals(soup.find(text=r).__class__, CData)
+
+    def testComments(self):
+        xml = "foo<!--foobar-->baz"
+        self.assertSoupEquals(xml)
+        r = re.compile("foo.*bar")
+        soup = BeautifulSoup(xml)
+        self.assertEquals(soup.find(text=r).string, "foobar")
+        self.assertEquals(soup.find(text="foobar").__class__, Comment)
+
+    def testDeclaration(self):
+        xml = "foo<!DOCTYPE foobar>baz"
+        self.assertSoupEquals(xml)
+        r = re.compile(".*foo.*bar")
+        soup = BeautifulSoup(xml)
+        text = "DOCTYPE foobar"
+        self.assertEquals(soup.find(text=r).string, text)
+        self.assertEquals(soup.find(text=text).__class__, Declaration)
+
+        namespaced_doctype = ('<!DOCTYPE xsl:stylesheet SYSTEM "htmlent.dtd">'
+                              '<html>foo</html>')
+        soup = BeautifulSoup(namespaced_doctype)
+        self.assertEquals(soup.contents[0],
+                          'DOCTYPE xsl:stylesheet SYSTEM "htmlent.dtd"')
+        self.assertEquals(soup.html.contents[0], 'foo')
+
+    def testEntityConversions(self):
+        text = "&lt;&lt;sacr&eacute;&#32;bleu!&gt;&gt;"
+        soup = BeautifulStoneSoup(text)
+        self.assertSoupEquals(text)
+
+        xmlEnt = BeautifulStoneSoup.XML_ENTITIES
+        htmlEnt = BeautifulStoneSoup.HTML_ENTITIES
+        xhtmlEnt = BeautifulStoneSoup.XHTML_ENTITIES
+
+        soup = BeautifulStoneSoup(text, convertEntities=xmlEnt)
+        self.assertEquals(str(soup), "&lt;&lt;sacr&eacute; bleu!&gt;&gt;")
+
+        soup = BeautifulStoneSoup(text, convertEntities=htmlEnt)
+        self.assertEquals(unicode(soup), u"&lt;&lt;sacr\xe9 bleu!&gt;&gt;")
+
+        # Make sure the "XML", "HTML", and "XHTML" settings work.
+        text = "&lt;&trade;&apos;"
+        soup = BeautifulStoneSoup(text, convertEntities=xmlEnt)
+        self.assertEquals(unicode(soup), u"&lt;&trade;'")
+
+        soup = BeautifulStoneSoup(text, convertEntities=htmlEnt)
+        self.assertEquals(unicode(soup), u"&lt;\u2122&apos;")
+
+        soup = BeautifulStoneSoup(text, convertEntities=xhtmlEnt)
+        self.assertEquals(unicode(soup), u"&lt;\u2122'")
+
+        invalidEntity = "foo&#bar;baz"
+        soup = BeautifulStoneSoup\
+               (invalidEntity,
+                convertEntities=htmlEnt)
+        self.assertEquals(str(soup), "foo&amp;#bar;baz")
+
+        nonexistentEntity = "foo&bar;baz"
+        soup = BeautifulStoneSoup\
+               (nonexistentEntity,
+                convertEntities="xml")
+        self.assertEquals(str(soup), nonexistentEntity)
+
+
+    def testNonBreakingSpaces(self):
+        soup = BeautifulSoup("<a>&nbsp;&nbsp;</a>",
+                             convertEntities=BeautifulStoneSoup.HTML_ENTITIES)
+        self.assertEquals(unicode(soup), u"<a>\xa0\xa0</a>")
+
+    def testWhitespaceInDeclaration(self):
+        self.assertSoupEquals('<! DOCTYPE>', '<!DOCTYPE>')
+
+    def testJunkInDeclaration(self):
+        self.assertSoupEquals('<! Foo = -8>a', '&lt;!Foo = -8&gt;a')
+
+    def testIncompleteDeclaration(self):
+        self.assertSoupEquals('a<!b <p>c', 'a&lt;!b &lt;p&gt;c')
+
+    def testEntityReplacement(self):
+        self.assertSoupEquals('<b>hello&nbsp;there</b>')
+
+    def testEntitiesInAttributeValues(self):
+        self.assertSoupEquals('<x t="x&#241;">', '<x t="x\xc3\xb1"></x>')
+        self.assertSoupEquals('<x t="x&#xf1;">', '<x t="x\xc3\xb1"></x>')
+
+        soup = BeautifulSoup('<x t="&gt;&trade;">',
+                             convertEntities=BeautifulStoneSoup.HTML_ENTITIES)
+        self.assertEquals(unicode(soup), u'<x t="&gt;\u2122"></x>')
+
+        uri = "http://crummy.com?sacr&eacute;&amp;bleu"
+        link = '<a href="%s"></a>' % uri
+        soup = BeautifulSoup(link)
+        self.assertEquals(unicode(soup), link)
+        #self.assertEquals(unicode(soup.a['href']), uri)
+
+        soup = BeautifulSoup(link, convertEntities=BeautifulSoup.HTML_ENTITIES)
+        self.assertEquals(unicode(soup),
+                          link.replace("&eacute;", u"\xe9"))
+
+        uri = "http://crummy.com?sacr&eacute;&bleu"
+        link = '<a href="%s"></a>' % uri
+        soup = BeautifulSoup(link, convertEntities=BeautifulSoup.HTML_ENTITIES)
+        self.assertEquals(unicode(soup.a['href']),
+                          uri.replace("&eacute;", u"\xe9"))
+
+    def testNakedAmpersands(self):
+        html = {'convertEntities':BeautifulStoneSoup.HTML_ENTITIES}
+        soup = BeautifulStoneSoup("AT&T ", **html)
+        self.assertEquals(str(soup), 'AT&amp;T ')
+
+        nakedAmpersandInASentence = "AT&T was Ma Bell"
+        soup = BeautifulStoneSoup(nakedAmpersandInASentence,**html)
+        self.assertEquals(str(soup), \
+               nakedAmpersandInASentence.replace('&','&amp;'))
+
+        invalidURL = '<a href="http://example.org?a=1&b=2;3">foo</a>'
+        validURL = invalidURL.replace('&','&amp;')
+        soup = BeautifulStoneSoup(invalidURL)
+        self.assertEquals(str(soup), validURL)
+
+        soup = BeautifulStoneSoup(validURL)
+        self.assertEquals(str(soup), validURL)
+
+
+class EncodeRed(SoupTest):
+    """Tests encoding conversion, Unicode conversion, and Microsoft
+    smart quote fixes."""
+
+    def testUnicodeDammitStandalone(self):
+        markup = "<foo>\x92</foo>"
+        dammit = UnicodeDammit(markup)
+        self.assertEquals(dammit.unicode, "<foo>&#x2019;</foo>")
+
+        hebrew = "\xed\xe5\xec\xf9"
+        dammit = UnicodeDammit(hebrew, ["iso-8859-8"])
+        self.assertEquals(dammit.unicode, u'\u05dd\u05d5\u05dc\u05e9')
+        self.assertEquals(dammit.originalEncoding, 'iso-8859-8')
+
+    def testGarbageInGarbageOut(self):
+        ascii = "<foo>a</foo>"
+        asciiSoup = BeautifulStoneSoup(ascii)
+        self.assertEquals(ascii, str(asciiSoup))
+
+        unicodeData = u"<foo>\u00FC</foo>"
+        utf8 = unicodeData.encode("utf-8")
+        self.assertEquals(utf8, '<foo>\xc3\xbc</foo>')
+
+        unicodeSoup = BeautifulStoneSoup(unicodeData)
+        self.assertEquals(unicodeData, unicode(unicodeSoup))
+        self.assertEquals(unicode(unicodeSoup.foo.string), u'\u00FC')
+
+        utf8Soup = BeautifulStoneSoup(utf8, fromEncoding='utf-8')
+        self.assertEquals(utf8, str(utf8Soup))
+        self.assertEquals(utf8Soup.originalEncoding, "utf-8")
+
+        utf8Soup = BeautifulStoneSoup(unicodeData)
+        self.assertEquals(utf8, str(utf8Soup))
+        self.assertEquals(utf8Soup.originalEncoding, None)
+
+
+    def testHandleInvalidCodec(self):
+        for bad_encoding in ['.utf8', '...', 'utF---16.!']:
+            soup = BeautifulSoup("Räksmörgås", fromEncoding=bad_encoding)
+            self.assertEquals(soup.originalEncoding, 'utf-8')
+
+    def testUnicodeSearch(self):
+        html = u'<html><body><h1>Räksmörgås</h1></body></html>'
+        soup = BeautifulSoup(html)
+        self.assertEqual(soup.find(text=u'Räksmörgås'),u'Räksmörgås')
+
+    def testRewrittenXMLHeader(self):
+        euc_jp = '<?xml version="1.0 encoding="euc-jp"?>\n<foo>\n\xa4\xb3\xa4\xec\xa4\xcfEUC-JP\xa4\xc7\xa5\xb3\xa1\xbc\xa5\xc7\xa5\xa3\xa5\xf3\xa5\xb0\xa4\xb5\xa4\xec\xa4\xbf\xc6\xfc\xcb\xdc\xb8\xec\xa4\xce\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xa4\xc7\xa4\xb9\xa1\xa3\n</foo>\n'
+        utf8 = "<?xml version='1.0' encoding='utf-8'?>\n<foo>\n\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xafEUC-JP\xe3\x81\xa7\xe3\x82\xb3\xe3\x83\xbc\xe3\x83\x87\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0\xe3\x81\x95\xe3\x82\x8c\xe3\x81\x9f\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\xe3\x81\xae\xe3\x83\x95\xe3\x82\xa1\xe3\x82\xa4\xe3\x83\xab\xe3\x81\xa7\xe3\x81\x99\xe3\x80\x82\n</foo>\n"
+        soup = BeautifulStoneSoup(euc_jp)
+        if soup.originalEncoding != "euc-jp":
+            raise Exception("Test failed when parsing euc-jp document. "
+                            "If you're running Python >=2.4, or you have "
+                            "cjkcodecs installed, this is a real problem. "
+                            "Otherwise, ignore it.")
+
+        self.assertEquals(soup.originalEncoding, "euc-jp")
+        self.assertEquals(str(soup), utf8)
+
+        old_text = "<?xml encoding='windows-1252'><foo>\x92</foo>"
+        new_text = "<?xml version='1.0' encoding='utf-8'?><foo>&rsquo;</foo>"
+        self.assertSoupEquals(old_text, new_text)
+
+    def testRewrittenMetaTag(self):
+        no_shift_jis_html = '''<html><head>\n<meta http-equiv="Content-language" content="ja" /></head><body><pre>\n\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B\n</pre></body></html>'''
+        soup = BeautifulSoup(no_shift_jis_html)
+
+        # Beautiful Soup used to try to rewrite the meta tag even if the
+        # meta tag got filtered out by the strainer. This test makes
+        # sure that doesn't happen.
+        strainer = SoupStrainer('pre')
+        soup = BeautifulSoup(no_shift_jis_html, parseOnlyThese=strainer)
+        self.assertEquals(soup.contents[0].name, 'pre')
+
+        meta_tag = ('<meta content="text/html; charset=x-sjis" '
+                    'http-equiv="Content-type" />')
+        shift_jis_html = (
+            '<html><head>\n%s\n'
+            '<meta http-equiv="Content-language" content="ja" />'
+            '</head><body><pre>\n'
+            '\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f'
+            '\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c'
+            '\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B\n'
+            '</pre></body></html>') % meta_tag
+        soup = BeautifulSoup(shift_jis_html)
+        if soup.originalEncoding != "shift-jis":
+            raise Exception("Test failed when parsing shift-jis document "
+                            "with meta tag '%s'."
+                            "If you're running Python >=2.4, or you have "
+                            "cjkcodecs installed, this is a real problem. "
+                            "Otherwise, ignore it." % meta_tag)
+        self.assertEquals(soup.originalEncoding, "shift-jis")
+
+        content_type_tag = soup.meta['content']
+        self.assertEquals(content_type_tag[content_type_tag.find('charset='):],
+                          'charset=%SOUP-ENCODING%')
+        content_type = str(soup.meta)
+        index = content_type.find('charset=')
+        self.assertEqual(content_type[index:index+len('charset=utf8')+1],
+                         'charset=utf-8')
+        content_type = soup.meta.__str__('shift-jis')
+        index = content_type.find('charset=')
+        self.assertEqual(content_type[index:index+len('charset=shift-jis')],
+                         'charset=shift-jis')
+
+        self.assertEquals(str(soup), (
+                '<html><head>\n'
+                '<meta content="text/html; charset=utf-8" '
+                'http-equiv="Content-type" />\n'
+                '<meta http-equiv="Content-language" content="ja" />'
+                '</head><body><pre>\n'
+                '\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xafShift-JIS\xe3\x81\xa7\xe3'
+                '\x82\xb3\xe3\x83\xbc\xe3\x83\x87\xe3\x82\xa3\xe3\x83\xb3\xe3'
+                '\x82\xb0\xe3\x81\x95\xe3\x82\x8c\xe3\x81\x9f\xe6\x97\xa5\xe6'
+                '\x9c\xac\xe8\xaa\x9e\xe3\x81\xae\xe3\x83\x95\xe3\x82\xa1\xe3'
+                '\x82\xa4\xe3\x83\xab\xe3\x81\xa7\xe3\x81\x99\xe3\x80\x82\n'
+                '</pre></body></html>'))
+        self.assertEquals(soup.renderContents("shift-jis"),
+                          shift_jis_html.replace('x-sjis', 'shift-jis'))
+
+        isolatin ="""<html><meta http-equiv="Content-type" content="text/html; charset=ISO-Latin-1" />Sacr\xe9 bleu!</html>"""
+        soup = BeautifulSoup(isolatin)
+        self.assertSoupEquals(soup.__str__("utf-8"),
+                              isolatin.replace("ISO-Latin-1", "utf-8").replace("\xe9", "\xc3\xa9"))
+
+    def testHebrew(self):
+        iso_8859_8= '<HEAD>\n<TITLE>Hebrew (ISO 8859-8) in Visual Directionality</TITLE>\n\n\n\n</HEAD>\n<BODY>\n<H1>Hebrew (ISO 8859-8) in Visual Directionality</H1>\n\xed\xe5\xec\xf9\n</BODY>\n'
+        utf8 = '<head>\n<title>Hebrew (ISO 8859-8) in Visual Directionality</title>\n</head>\n<body>\n<h1>Hebrew (ISO 8859-8) in Visual Directionality</h1>\n\xd7\x9d\xd7\x95\xd7\x9c\xd7\xa9\n</body>\n'
+        soup = BeautifulStoneSoup(iso_8859_8, fromEncoding="iso-8859-8")
+        self.assertEquals(str(soup), utf8)
+
+    def testSmartQuotesNotSoSmartAnymore(self):
+        self.assertSoupEquals("\x91Foo\x92 <!--blah-->",
+                              '&lsquo;Foo&rsquo; <!--blah-->')
+
+    def testDontConvertSmartQuotesWhenAlsoConvertingEntities(self):
+        smartQuotes = "Il a dit, \x8BSacr&eacute; bl&#101;u!\x9b"
+        soup = BeautifulSoup(smartQuotes)
+        self.assertEquals(str(soup),
+                          'Il a dit, &lsaquo;Sacr&eacute; bl&#101;u!&rsaquo;')
+        soup = BeautifulSoup(smartQuotes, convertEntities="html")
+        self.assertEquals(str(soup),
+                          'Il a dit, \xe2\x80\xb9Sacr\xc3\xa9 bleu!\xe2\x80\xba')
+
+    def testDontSeeSmartQuotesWhereThereAreNone(self):
+        utf_8 = "\343\202\261\343\203\274\343\202\277\343\202\244 Watch"
+        self.assertSoupEquals(utf_8)
+
+
+class Whitewash(SoupTest):
+    """Test whitespace preservation."""
+
+    def testPreservedWhitespace(self):
+        self.assertSoupEquals("<pre>   </pre>")
+        self.assertSoupEquals("<pre> woo  </pre>")
+
+    def testCollapsedWhitespace(self):
+        self.assertSoupEquals("<p>   </p>", "<p> </p>")
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/_compat.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/_compat.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/_compat.py	(revision 1126)
@@ -0,0 +1,48 @@
+try:
+    TEXT = unicode
+except NameError: #pragma NO COVER Py3k
+    PY3 = True
+    TEXT = str
+    STRING_TYPES = (str, bytes)
+    def b(x, encoding='ascii'):
+        return bytes(x, encoding)
+else: #pragma NO COVER Python2
+    PY3 = False
+    STRING_TYPES = (unicode, bytes)
+    def b(x, encoding='ascii'):
+        if isinstance(x, unicode):
+            x = x.encode(encoding)
+        return x
+
+def u(x, encoding='ascii'):
+    if isinstance(x, TEXT): #pragma NO COVER
+        return x
+    try:
+        return x.decode(encoding)
+    except AttributeError: #pragma NO COVER
+        raise ValueError('WTF: %s' % x)
+
+try:
+    import urlparse
+except ImportError: #pragma NO COVER Py3k
+    from urllib.parse import parse_qs
+    from urllib.parse import parse_qsl
+    from urllib.parse import quote
+    from urllib.parse import unquote
+    from urllib.parse import unquote_to_bytes
+    from urllib.parse import urlencode
+    from urllib.parse import urlsplit
+    from urllib.parse import urlunsplit
+    from urllib.parse import urlparse
+    from urllib.parse import urlunparse
+else: #pragma NO COVER Python2
+    from urlparse import parse_qs
+    from urlparse import parse_qsl
+    from urllib import quote
+    from urllib import unquote
+    from urllib import urlencode
+    from urlparse import urlsplit
+    from urlparse import urlunsplit
+    from urlparse import urlparse
+    from urlparse import urlunparse
+    unquote_to_bytes = unquote
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/_version.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/_version.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/_version.py	(revision 1126)
@@ -0,0 +1,19 @@
+# This is the version of this source code.
+
+manual_verstr = "1.9"
+
+
+
+auto_build_num = "0.post1"
+
+
+
+verstr = manual_verstr + "." + auto_build_num
+try:
+    from pyutil.version_class import Version as pyutil_Version
+except (ImportError, ValueError): #pragma NO COVER
+    # Maybe there is no pyutil installed.
+    from distutils.version import LooseVersion as distutils_Version
+    __version__ = distutils_Version(verstr)
+else: #pragma NO COVER
+    __version__ = pyutil_Version(verstr)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/clients/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/clients/smtp.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/clients/smtp.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/clients/smtp.py	(revision 1126)
@@ -0,0 +1,41 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import oauth2
+import smtplib
+import base64
+
+
+class SMTP(smtplib.SMTP):
+    """SMTP wrapper for smtplib.SMTP that implements XOAUTH."""
+
+    def authenticate(self, url, consumer, token):
+        if consumer is not None and not isinstance(consumer, oauth2.Consumer):
+            raise ValueError("Invalid consumer.")
+
+        if token is not None and not isinstance(token, oauth2.Token):
+            raise ValueError("Invalid token.")
+
+        self.docmd('AUTH', 'XOAUTH %s' % \
+            base64.b64encode(oauth2.build_xoauth_string(url, consumer, token)))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/clients/imap.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/clients/imap.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/clients/imap.py	(revision 1126)
@@ -0,0 +1,40 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import oauth2
+import imaplib
+
+
+class IMAP4_SSL(imaplib.IMAP4_SSL):
+    """IMAP wrapper for imaplib.IMAP4_SSL that implements XOAUTH."""
+
+    def authenticate(self, url, consumer, token):
+        if consumer is not None and not isinstance(consumer, oauth2.Consumer):
+            raise ValueError("Invalid consumer.")
+
+        if token is not None and not isinstance(token, oauth2.Token):
+            raise ValueError("Invalid token.")
+
+        imaplib.IMAP4_SSL.authenticate(self, 'XOAUTH',
+            lambda x: oauth2.build_xoauth_string(url, consumer, token))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauth2/__init__.py	(revision 1126)
@@ -0,0 +1,860 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import base64
+from hashlib import sha1
+import time
+import random
+import hmac
+import binascii
+import httplib2
+
+from ._compat import PY3
+from ._compat import b
+from ._compat import parse_qs
+from ._compat import quote
+from ._compat import STRING_TYPES
+from ._compat import TEXT
+from ._compat import u
+from ._compat import unquote
+from ._compat import unquote_to_bytes
+from ._compat import urlencode
+from ._compat import urlsplit
+from ._compat import urlunsplit
+from ._compat import urlparse
+from ._compat import urlunparse
+from ._version import __version__
+
+OAUTH_VERSION = '1.0'  # Hi Blaine!
+HTTP_METHOD = 'GET'
+SIGNATURE_METHOD = 'PLAINTEXT'
+
+
+class Error(RuntimeError):
+    """Generic exception class."""
+
+    def __init__(self, message='OAuth error occurred.'):
+        self._message = message
+
+    @property
+    def message(self):
+        """A hack to get around the deprecation errors in 2.6."""
+        return self._message
+
+    def __str__(self):
+        return self._message
+
+
+class MissingSignature(Error):
+    pass
+
+
+def build_authenticate_header(realm=''):
+    """Optional WWW-Authenticate header (401 error)"""
+    return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
+
+
+def build_xoauth_string(url, consumer, token=None):
+    """Build an XOAUTH string for use in SMTP/IMPA authentication."""
+    request = Request.from_consumer_and_token(consumer, token,
+        "GET", url)
+
+    signing_method = SignatureMethod_HMAC_SHA1()
+    request.sign_request(signing_method, consumer, token)
+
+    params = []
+    for k, v in sorted(request.items()):
+        if v is not None:
+            params.append('%s="%s"' % (k, escape(v)))
+
+    return "%s %s %s" % ("GET", url, ','.join(params))
+
+
+def to_unicode(s):
+    """ Convert to unicode, raise exception with instructive error
+    message if s is not unicode, ascii, or utf-8. """
+    if not isinstance(s, TEXT):
+        if not isinstance(s, bytes):
+            raise TypeError('You are required to pass either unicode or '
+                            'bytes here, not: %r (%s)' % (type(s), s))
+        try:
+            s = s.decode('utf-8')
+        except UnicodeDecodeError as le:
+            raise TypeError('You are required to pass either a unicode '
+                            'object or a utf-8-enccoded bytes string here. '
+                            'You passed a bytes object which contained '
+                            'non-utf-8: %r. The UnicodeDecodeError that '
+                            'resulted from attempting to interpret it as '
+                            'utf-8 was: %s'
+                                % (s, le,))
+    return s
+
+def to_utf8(s):
+    return to_unicode(s).encode('utf-8')
+
+def to_unicode_if_string(s):
+    if isinstance(s, STRING_TYPES):
+        return to_unicode(s)
+    else:
+        return s
+
+def to_utf8_if_string(s):
+    if isinstance(s, STRING_TYPES):
+        return to_utf8(s)
+    else:
+        return s
+
+def to_unicode_optional_iterator(x):
+    """
+    Raise TypeError if x is a str containing non-utf8 bytes or if x is
+    an iterable which contains such a str.
+    """
+    if isinstance(x, STRING_TYPES):
+        return to_unicode(x)
+
+    try:
+        l = list(x)
+    except TypeError as e:
+        assert 'is not iterable' in str(e)
+        return x
+    else:
+        return [ to_unicode(e) for e in l ]
+
+def to_utf8_optional_iterator(x):
+    """
+    Raise TypeError if x is a str or if x is an iterable which
+    contains a str.
+    """
+    if isinstance(x, STRING_TYPES):
+        return to_utf8(x)
+
+    try:
+        l = list(x)
+    except TypeError as e:
+        assert 'is not iterable' in str(e)
+        return x
+    else:
+        return [ to_utf8_if_string(e) for e in l ]
+
+def escape(s):
+    """Escape a URL including any /."""
+    if not isinstance(s, bytes):
+        s = s.encode('utf-8')
+    return quote(s, safe='~')
+
+def generate_timestamp():
+    """Get seconds since epoch (UTC)."""
+    return int(time.time())
+
+
+def generate_nonce(length=8):
+    """Generate pseudorandom number."""
+    return ''.join([str(random.SystemRandom().randint(0, 9)) for i in range(length)])
+
+
+def generate_verifier(length=8):
+    """Generate pseudorandom number."""
+    return ''.join([str(random.SystemRandom().randint(0, 9)) for i in range(length)])
+
+
+class Consumer(object):
+    """A consumer of OAuth-protected services.
+ 
+    The OAuth consumer is a "third-party" service that wants to access
+    protected resources from an OAuth service provider on behalf of an end
+    user. It's kind of the OAuth client.
+ 
+    Usually a consumer must be registered with the service provider by the
+    developer of the consumer software. As part of that process, the service
+    provider gives the consumer a *key* and a *secret* with which the consumer
+    software can identify itself to the service. The consumer will include its
+    key in each request to identify itself, but will use its secret only when
+    signing requests, to prove that the request is from that particular
+    registered consumer.
+ 
+    Once registered, the consumer can then use its consumer credentials to ask
+    the service provider for a request token, kicking off the OAuth
+    authorization process.
+    """
+
+    key = None
+    secret = None
+
+    def __init__(self, key, secret):
+        self.key = key
+        self.secret = secret
+
+        if self.key is None or self.secret is None:
+            raise ValueError("Key and secret must be set.")
+
+    def __str__(self):
+        data = {'oauth_consumer_key': self.key,
+            'oauth_consumer_secret': self.secret}
+
+        return urlencode(data)
+
+
+class Token(object):
+    """An OAuth credential used to request authorization or a protected
+    resource.
+ 
+    Tokens in OAuth comprise a *key* and a *secret*. The key is included in
+    requests to identify the token being used, but the secret is used only in
+    the signature, to prove that the requester is who the server gave the
+    token to.
+ 
+    When first negotiating the authorization, the consumer asks for a *request
+    token* that the live user authorizes with the service provider. The
+    consumer then exchanges the request token for an *access token* that can
+    be used to access protected resources.
+    """
+
+    key = None
+    secret = None
+    callback = None
+    callback_confirmed = None
+    verifier = None
+
+    def __init__(self, key, secret):
+        self.key = key
+        self.secret = secret
+
+        if self.key is None or self.secret is None:
+            raise ValueError("Key and secret must be set.")
+
+    def set_callback(self, callback):
+        self.callback = callback
+        self.callback_confirmed = 'true'
+
+    def set_verifier(self, verifier=None):
+        if verifier is not None:
+            self.verifier = verifier
+        else:
+            self.verifier = generate_verifier()
+
+    def get_callback_url(self):
+        if self.callback and self.verifier:
+            # Append the oauth_verifier.
+            parts = urlparse(self.callback)
+            scheme, netloc, path, params, query, fragment = parts[:6]
+            if query:
+                query = '%s&oauth_verifier=%s' % (query, self.verifier)
+            else:
+                query = 'oauth_verifier=%s' % self.verifier
+            return urlunparse((scheme, netloc, path, params,
+                query, fragment))
+        return self.callback
+
+    def to_string(self):
+        """Returns this token as a plain string, suitable for storage.
+ 
+        The resulting string includes the token's secret, so you should never
+        send or store this string where a third party can read it.
+        """
+        items = [
+            ('oauth_token', self.key),
+            ('oauth_token_secret', self.secret),
+        ]
+
+        if self.callback_confirmed is not None:
+            items.append(('oauth_callback_confirmed', self.callback_confirmed))
+        return urlencode(items)
+ 
+    @staticmethod
+    def from_string(s):
+        """Deserializes a token from a string like one returned by
+        `to_string()`."""
+
+        if not len(s):
+            raise ValueError("Invalid parameter string.")
+
+        params = parse_qs(u(s), keep_blank_values=False)
+        if not len(params):
+            raise ValueError("Invalid parameter string.")
+
+        try:
+            key = params['oauth_token'][0]
+        except Exception:
+            raise ValueError("'oauth_token' not found in OAuth request.")
+
+        try:
+            secret = params['oauth_token_secret'][0]
+        except Exception:
+            raise ValueError("'oauth_token_secret' not found in " 
+                "OAuth request.")
+
+        token = Token(key, secret)
+        try:
+            token.callback_confirmed = params['oauth_callback_confirmed'][0]
+        except KeyError:
+            pass  # 1.0, no callback confirmed.
+        return token
+
+    def __str__(self):
+        return self.to_string()
+
+
+def setter(attr):
+    name = attr.__name__
+ 
+    def getter(self):
+        try:
+            return self.__dict__[name]
+        except KeyError:
+            raise AttributeError(name)
+ 
+    def deleter(self):
+        del self.__dict__[name]
+ 
+    return property(getter, attr, deleter)
+
+
+class Request(dict):
+ 
+    """The parameters and information for an HTTP request, suitable for
+    authorizing with OAuth credentials.
+ 
+    When a consumer wants to access a service's protected resources, it does
+    so using a signed HTTP request identifying itself (the consumer) with its
+    key, and providing an access token authorized by the end user to access
+    those resources.
+ 
+    """
+ 
+    version = OAUTH_VERSION
+
+    def __init__(self, method=HTTP_METHOD, url=None, parameters=None,
+                 body=b'', is_form_encoded=False):
+        if url is not None:
+            self.url = to_unicode(url)
+        self.method = method
+        if parameters is not None:
+            for k, v in parameters.items():
+                k = to_unicode(k)
+                v = to_unicode_optional_iterator(v)
+                self[k] = v
+        self.body = body
+        self.is_form_encoded = is_form_encoded
+
+    @setter
+    def url(self, value):
+        self.__dict__['url'] = value
+        if value is not None:
+            scheme, netloc, path, query, fragment = urlsplit(value)
+
+            # Exclude default port numbers.
+            if scheme == 'http' and netloc[-3:] == ':80':
+                netloc = netloc[:-3]
+            elif scheme == 'https' and netloc[-4:] == ':443':
+                netloc = netloc[:-4]
+            if scheme not in ('http', 'https'):
+                raise ValueError("Unsupported URL %s (%s)." % (value, scheme))
+
+            # Normalized URL excludes params, query, and fragment.
+            self.normalized_url = urlunsplit((scheme, netloc, path, None, None))
+        else:
+            self.normalized_url = None
+            self.__dict__['url'] = None
+ 
+    @setter
+    def method(self, value):
+        self.__dict__['method'] = value.upper()
+ 
+    def _get_timestamp_nonce(self):
+        return self['oauth_timestamp'], self['oauth_nonce']
+ 
+    def get_nonoauth_parameters(self):
+        """Get any non-OAuth parameters."""
+        return dict([(k, v) for k, v in self.items() 
+                    if not k.startswith('oauth_')])
+ 
+    def to_header(self, realm=''):
+        """Serialize as a header for an HTTPAuth request."""
+        oauth_params = ((k, v) for k, v in self.items() 
+                            if k.startswith('oauth_'))
+        stringy_params = ((k, escape(v)) for k, v in oauth_params)
+        header_params = ('%s="%s"' % (k, v) for k, v in stringy_params)
+        params_header = ', '.join(header_params)
+ 
+        auth_header = 'OAuth realm="%s"' % realm
+        if params_header:
+            auth_header = "%s, %s" % (auth_header, params_header)
+ 
+        return {'Authorization': auth_header}
+ 
+    def to_postdata(self):
+        """Serialize as post data for a POST request."""
+        items = []
+        for k, v in sorted(self.items()): # predictable for testing
+            items.append((k.encode('utf-8'), to_utf8_optional_iterator(v)))
+
+        # tell urlencode to deal with sequence values and map them correctly
+        # to resulting querystring. for example self["k"] = ["v1", "v2"] will
+        # result in 'k=v1&k=v2' and not k=%5B%27v1%27%2C+%27v2%27%5D
+        return urlencode(items, True).replace('+', '%20')
+ 
+    def to_url(self):
+        """Serialize as a URL for a GET request."""
+        base_url = urlparse(self.url)
+
+        if PY3:
+            query = parse_qs(base_url.query)
+            for k, v in self.items():
+                query.setdefault(k, []).append(to_utf8_optional_iterator(v))
+            scheme = base_url.scheme
+            netloc = base_url.netloc
+            path = base_url.path
+            params = base_url.params
+            fragment = base_url.fragment
+        else:
+            query = parse_qs(to_utf8(base_url.query))
+            for k, v in self.items():
+                query.setdefault(to_utf8(k), []).append(to_utf8_optional_iterator(v))
+            scheme = to_utf8(base_url.scheme)
+            netloc = to_utf8(base_url.netloc)
+            path = to_utf8(base_url.path)
+            params = to_utf8(base_url.params)
+            fragment = to_utf8(base_url.fragment)
+
+        url = (scheme, netloc, path, params, urlencode(query, True), fragment)
+        return urlunparse(url)
+
+    def get_parameter(self, parameter):
+        ret = self.get(parameter)
+        if ret is None:
+            raise Error('Parameter not found: %s' % parameter)
+
+        return ret
+
+    def get_normalized_parameters(self):
+        """Return a string that contains the parameters that must be signed."""
+        items = []
+        for key, value in self.items():
+            if key == 'oauth_signature':
+                continue
+            # 1.0a/9.1.1 states that kvp must be sorted by key, then by value,
+            # so we unpack sequence values into multiple items for sorting.
+            if isinstance(value, STRING_TYPES):
+                items.append((to_utf8_if_string(key), to_utf8(value)))
+            else:
+                try:
+                    value = list(value)
+                except TypeError as e:
+                    assert 'is not iterable' in str(e)
+                    items.append((to_utf8_if_string(key), to_utf8_if_string(value)))
+                else:
+                    items.extend((to_utf8_if_string(key), to_utf8_if_string(item)) for item in value)
+
+        # Include any query string parameters from the provided URL
+        query = urlparse(self.url)[4]
+
+        url_items = self._split_url_string(query).items()
+        url_items = [(to_utf8(k), to_utf8_optional_iterator(v)) for k, v in url_items if k != 'oauth_signature' ]
+        items.extend(url_items)
+
+        items.sort()
+        encoded_str = urlencode(items, True)
+        # Encode signature parameters per Oauth Core 1.0 protocol
+        # spec draft 7, section 3.6
+        # (http://tools.ietf.org/html/draft-hammer-oauth-07#section-3.6)
+        # Spaces must be encoded with "%20" instead of "+"
+        return encoded_str.replace('+', '%20').replace('%7E', '~')
+
+    def sign_request(self, signature_method, consumer, token):
+        """Set the signature parameter to the result of sign."""
+
+        if not self.is_form_encoded:
+            # according to
+            # http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html
+            # section 4.1.1 "OAuth Consumers MUST NOT include an
+            # oauth_body_hash parameter on requests with form-encoded
+            # request bodies."
+            self['oauth_body_hash'] = base64.b64encode(sha1(self.body).digest())
+
+        if 'oauth_consumer_key' not in self:
+            self['oauth_consumer_key'] = consumer.key
+
+        if token and 'oauth_token' not in self:
+            self['oauth_token'] = token.key
+
+        self['oauth_signature_method'] = signature_method.name
+        self['oauth_signature'] = signature_method.sign(self, consumer, token)
+ 
+    @classmethod
+    def make_timestamp(cls):
+        """Get seconds since epoch (UTC)."""
+        return str(int(time.time()))
+ 
+    @classmethod
+    def make_nonce(cls):
+        """Generate pseudorandom number."""
+        return str(random.SystemRandom().randint(0, 100000000))
+ 
+    @classmethod
+    def from_request(cls, http_method, http_url, headers=None, parameters=None,
+            query_string=None):
+        """Combines multiple parameter sources."""
+        if parameters is None:
+            parameters = {}
+ 
+        # Headers
+        if headers:
+            auth_header = None
+            for k, v in headers.items():
+                if k.lower() == 'authorization' or \
+                    k.upper() == 'HTTP_AUTHORIZATION':
+                    auth_header = v
+
+            # Check that the authorization header is OAuth.
+            if auth_header and auth_header[:6] == 'OAuth ':
+                auth_header = auth_header[6:]
+                try:
+                    # Get the parameters from the header.
+                    header_params = cls._split_header(auth_header)
+                    parameters.update(header_params)
+                except:
+                    raise Error('Unable to parse OAuth parameters from '
+                        'Authorization header.')
+ 
+        # GET or POST query string.
+        if query_string:
+            query_params = cls._split_url_string(query_string)
+            parameters.update(query_params)
+ 
+        # URL parameters.
+        param_str = urlparse(http_url)[4] # query
+        url_params = cls._split_url_string(param_str)
+        parameters.update(url_params)
+ 
+        if parameters:
+            return cls(http_method, http_url, parameters)
+ 
+        return None
+ 
+    @classmethod
+    def from_consumer_and_token(cls, consumer, token=None,
+            http_method=HTTP_METHOD, http_url=None, parameters=None,
+            body=b'', is_form_encoded=False):
+        if not parameters:
+            parameters = {}
+ 
+        defaults = {
+            'oauth_consumer_key': consumer.key,
+            'oauth_timestamp': cls.make_timestamp(),
+            'oauth_nonce': cls.make_nonce(),
+            'oauth_version': cls.version,
+        }
+ 
+        defaults.update(parameters)
+        parameters = defaults
+ 
+        if token:
+            parameters['oauth_token'] = token.key
+            if token.verifier:
+                parameters['oauth_verifier'] = token.verifier
+ 
+        return cls(http_method, http_url, parameters, body=body, 
+            is_form_encoded=is_form_encoded)
+ 
+    @classmethod
+    def from_token_and_callback(cls, token, callback=None, 
+        http_method=HTTP_METHOD, http_url=None, parameters=None):
+
+        if not parameters:
+            parameters = {}
+ 
+        parameters['oauth_token'] = token.key
+ 
+        if callback:
+            parameters['oauth_callback'] = callback
+ 
+        return cls(http_method, http_url, parameters)
+ 
+    @staticmethod
+    def _split_header(header):
+        """Turn Authorization: header into parameters."""
+        params = {}
+        parts = header.split(',')
+        for param in parts:
+            # Ignore realm parameter.
+            if param.find('realm') > -1:
+                continue
+            # Remove whitespace.
+            param = param.strip()
+            # Split key-value.
+            param_parts = param.split('=', 1)
+            # Remove quotes and unescape the value.
+            params[param_parts[0]] = unquote(param_parts[1].strip('\"'))
+        return params
+ 
+    @staticmethod
+    def _split_url_string(param_str):
+        """Turn URL string into parameters."""
+        if not PY3:
+            # If passed unicode with quoted UTF8, Python2's parse_qs leaves
+            # mojibake'd uniocde after unquoting, so encode first.
+            param_str = b(param_str, 'utf-8')
+        parameters = parse_qs(param_str, keep_blank_values=True)
+        for k, v in parameters.items():
+            if len(v) == 1:
+                parameters[k] = unquote(v[0])
+            else:
+                parameters[k] = sorted([unquote(s) for s in v])
+        return parameters
+
+
+class Client(httplib2.Http):
+    """OAuthClient is a worker to attempt to execute a request."""
+
+    def __init__(self, consumer, token=None, **kwargs):
+
+        if consumer is not None and not isinstance(consumer, Consumer):
+            raise ValueError("Invalid consumer.")
+
+        if token is not None and not isinstance(token, Token):
+            raise ValueError("Invalid token.")
+
+        self.consumer = consumer
+        self.token = token
+        self.method = SignatureMethod_HMAC_SHA1()
+
+        super(Client, self).__init__(**kwargs)
+
+    def set_signature_method(self, method):
+        if not isinstance(method, SignatureMethod):
+            raise ValueError("Invalid signature method.")
+
+        self.method = method
+
+    def request(self, uri, method="GET", body=b'', headers=None,
+        redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
+        DEFAULT_POST_CONTENT_TYPE = 'application/x-www-form-urlencoded'
+
+        if not isinstance(headers, dict):
+            headers = {}
+
+        if method == "POST":
+            headers['Content-Type'] = headers.get('Content-Type', 
+                DEFAULT_POST_CONTENT_TYPE)
+
+        is_form_encoded = \
+            headers.get('Content-Type') == 'application/x-www-form-urlencoded'
+
+        if is_form_encoded and body:
+            parameters = parse_qs(body)
+        else:
+            parameters = None
+
+        req = Request.from_consumer_and_token(self.consumer, 
+            token=self.token, http_method=method, http_url=uri, 
+            parameters=parameters, body=body, is_form_encoded=is_form_encoded)
+
+        req.sign_request(self.method, self.consumer, self.token)
+
+        scheme, netloc, path, params, query, fragment = urlparse(uri)
+        realm = urlunparse((scheme, netloc, '', None, None, None))
+
+        if is_form_encoded:
+            body = req.to_postdata()
+        elif method == "GET":
+            uri = req.to_url()
+        else:
+            headers.update(req.to_header(realm=realm))
+
+        return httplib2.Http.request(self, uri, method=method, body=body,
+            headers=headers, redirections=redirections,
+            connection_type=connection_type)
+
+
+class Server(object):
+    """A skeletal implementation of a service provider, providing protected
+    resources to requests from authorized consumers.
+ 
+    This class implements the logic to check requests for authorization. You
+    can use it with your web server or web framework to protect certain
+    resources with OAuth.
+    """
+
+    timestamp_threshold = 300 # In seconds, five minutes.
+    version = OAUTH_VERSION
+    signature_methods = None
+
+    def __init__(self, signature_methods=None):
+        self.signature_methods = signature_methods or {}
+
+    def add_signature_method(self, signature_method):
+        self.signature_methods[signature_method.name] = signature_method
+        return self.signature_methods
+
+    def verify_request(self, request, consumer, token):
+        """Verifies an api call and checks all the parameters."""
+
+        self._check_version(request)
+        self._check_signature(request, consumer, token)
+        parameters = request.get_nonoauth_parameters()
+        return parameters
+
+    def build_authenticate_header(self, realm=''):
+        """Optional support for the authenticate header."""
+        return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
+
+    def _check_version(self, request):
+        """Verify the correct version of the request for this server."""
+        version = self._get_version(request)
+        if version and version != self.version:
+            raise Error('OAuth version %s not supported.' % str(version))
+
+    def _get_version(self, request):
+        """Return the version of the request for this server."""
+        try:
+            version = request.get_parameter('oauth_version')
+        except:
+            version = OAUTH_VERSION
+
+        return version
+
+    def _get_signature_method(self, request):
+        """Figure out the signature with some defaults."""
+        signature_method = request.get('oauth_signature_method')
+        if signature_method is None:
+            signature_method = SIGNATURE_METHOD
+
+        try:
+            # Get the signature method object.
+            return self.signature_methods[signature_method]
+        except KeyError:
+            signature_method_names = ', '.join(self.signature_methods.keys())
+            raise Error('Signature method %s not supported try one of the '
+                        'following: %s'
+                            % (signature_method, signature_method_names))
+
+    def _check_signature(self, request, consumer, token):
+        timestamp, nonce = request._get_timestamp_nonce()
+        self._check_timestamp(timestamp)
+        signature_method = self._get_signature_method(request)
+
+        signature = request.get('oauth_signature')
+        if signature is None:
+            raise MissingSignature('Missing oauth_signature.')
+
+        # Validate the signature.
+        valid = signature_method.check(request, consumer, token, signature)
+
+        if not valid:
+            key, base = signature_method.signing_base(request, consumer, token)
+
+            raise Error('Invalid signature. Expected signature base ' 
+                'string: %s' % base)
+
+    def _check_timestamp(self, timestamp):
+        """Verify that timestamp is recentish."""
+        timestamp = int(timestamp)
+        now = int(time.time())
+        lapsed = now - timestamp
+        if lapsed > self.timestamp_threshold:
+            raise Error('Expired timestamp: given %d and now %s has a '
+                'greater difference than threshold %d' % (timestamp, now, 
+                    self.timestamp_threshold))
+
+
+class SignatureMethod(object):
+    """A way of signing requests.
+ 
+    The OAuth protocol lets consumers and service providers pick a way to sign
+    requests. This interface shows the methods expected by the other `oauth`
+    modules for signing requests. Subclass it and implement its methods to
+    provide a new way to sign requests.
+    """
+
+    def signing_base(self, request, consumer, token): #pragma NO COVER
+        """Calculates the string that needs to be signed.
+
+        This method returns a 2-tuple containing the starting key for the
+        signing and the message to be signed. The latter may be used in error
+        messages to help clients debug their software.
+
+        """
+        raise NotImplementedError
+
+    def sign(self, request, consumer, token): #pragma NO COVER
+        """Returns the signature for the given request, based on the consumer
+        and token also provided.
+
+        You should use your implementation of `signing_base()` to build the
+        message to sign. Otherwise it may be less useful for debugging.
+
+        """
+        raise NotImplementedError
+
+    def check(self, request, consumer, token, signature):
+        """Returns whether the given signature is the correct signature for
+        the given consumer and token signing the given request."""
+        built = self.sign(request, consumer, token)
+        return built == signature
+
+
+class SignatureMethod_HMAC_SHA1(SignatureMethod):
+    name = 'HMAC-SHA1'
+
+    def signing_base(self, request, consumer, token):
+        if (not hasattr(request, 'normalized_url') or request.normalized_url is None):
+            raise ValueError("Base URL for request is not set.")
+
+        sig = (
+            escape(request.method),
+            escape(request.normalized_url),
+            escape(request.get_normalized_parameters()),
+        )
+
+        key = '%s&' % escape(consumer.secret)
+        if token:
+            key += escape(token.secret)
+        raw = '&'.join(sig)
+        return key.encode('ascii'), raw.encode('ascii')
+
+    def sign(self, request, consumer, token):
+        """Builds the base signature string."""
+        key, raw = self.signing_base(request, consumer, token)
+
+        hashed = hmac.new(key, raw, sha1)
+
+        # Calculate the digest base 64.
+        return binascii.b2a_base64(hashed.digest())[:-1]
+
+
+class SignatureMethod_PLAINTEXT(SignatureMethod):
+
+    name = 'PLAINTEXT'
+
+    def signing_base(self, request, consumer, token):
+        """Concatenates the consumer key and secret with the token's
+        secret."""
+        sig = '%s&' % escape(consumer.secret)
+        if token:
+            sig = sig + escape(token.secret)
+        return sig, sig
+
+    def sign(self, request, consumer, token):
+        key, raw = self.signing_base(request, consumer, token)
+        return raw.encode('utf8')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/testcase.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/testcase.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/testcase.py	(revision 1126)
@@ -0,0 +1,28 @@
+import unittest
+import introspect
+
+class IntrospectTestCase(unittest.TestCase):
+
+    def testUnboundMethod(self):
+        import string
+        method = 'string.index('
+        (name, argspec, tip) = introspect.getCallTip(method, locals())
+
+        self.assertEquals('index', name)
+        self.assertEquals('s, *args', argspec)
+        self.assertEquals('index(s, *args)\n\nindex(s, sub [,start [,end]]) -> int\n\nLike find but raises ValueError when the substring is not found.', tip)
+
+    def testBuiltinFunction(self):
+        method = 'len('
+        print introspect.getCallTip(method, locals())
+        
+        (name, argspec, tip) = introspect.getCallTip(method, locals())
+        
+        self.assertEquals('len', name)
+        # next 2 assertions fail in Jython!
+        self.assertEquals('len(object) -> integer', argspec)
+        self.assertEquals('len(object) -> integer\n\nReturn the number of items of a sequence or mapping', tip)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/tip.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/tip.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/tip.py	(revision 1126)
@@ -0,0 +1,45 @@
+from java.awt import Color, Dimension
+from javax.swing import JWindow, JTextArea, JScrollPane
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: tip.py 5782 2006-06-12 07:56:49Z jmvivo $"
+
+class Tip(JWindow):
+    """
+    Window which provides the user with information about the method
+    For Python, this shows arguments, and the documention
+    For Java, this shows the signature(s) and return type
+    """
+    # TODO handle java methods with many overload more gracefully
+    MAX_HEIGHT = 300
+    MAX_WIDTH = 400
+    
+    def __init__(self, frame):
+        JWindow.__init__(self, frame)
+        #self.size = (300,150)
+        self.textarea = JTextArea()
+        # TODO put this color with all the other colors
+        self.textarea.setBackground(Color(225,255,255))
+        self.textarea.setEditable(0)
+        self.jscrollpane = JScrollPane(self.textarea)
+        self.getContentPane().add(self.jscrollpane)
+
+    def setText(self, tip):
+        self.textarea.setText(tip)
+        self.textarea.setCaretPosition(0)
+        #print >> sys.stderr, self.textarea.getPreferredScrollableViewportSize()
+        self.setSize(self.getPreferredSize())
+
+    def getPreferredSize(self):
+        # need to add a magic amount to the size to avoid scrollbars
+        # I'm sure there's a better way to do this
+        MAGIC = 20
+        size = self.textarea.getPreferredScrollableViewportSize()
+        height = size.height + MAGIC
+        width = size.width + MAGIC
+        if height > Tip.MAX_HEIGHT:
+            height = Tip.MAX_HEIGHT
+        if width > Tip.MAX_WIDTH:
+            width = Tip.MAX_WIDTH
+        return Dimension(width, height)
+        
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/dis.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/dis.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/dis.py	(revision 1126)
@@ -0,0 +1,327 @@
+"""Disassembler of Python byte code into mnemonics."""
+
+import sys
+import types
+
+__all__ = ["dis","disassemble","distb","disco","opname","cmp_op",
+           "hasconst","hasname","hasjrel","hasjabs","haslocal",
+           "hascompare", "hasfree"]
+
+def dis(x=None):
+    """Disassemble classes, methods, functions, or code.
+
+    With no argument, disassemble the last traceback.
+
+    """
+    if not x:
+        distb()
+        return
+    if type(x) is types.InstanceType:
+        x = x.__class__
+    if hasattr(x, 'im_func'):
+        x = x.im_func
+    if hasattr(x, 'func_code'):
+        x = x.func_code
+    if hasattr(x, '__dict__'):
+        items = x.__dict__.items()
+        items.sort()
+        for name, x1 in items:
+            if type(x1) in (types.MethodType,
+                            types.FunctionType,
+                            types.CodeType):
+                print "Disassembly of %s:" % name
+                try:
+                    dis(x1)
+                except TypeError, msg:
+                    print "Sorry:", msg
+                print
+    elif hasattr(x, 'co_code'):
+        disassemble(x)
+    else:
+        raise TypeError, \
+              "don't know how to disassemble %s objects" % \
+              type(x).__name__
+
+def distb(tb=None):
+    """Disassemble a traceback (default: last traceback)."""
+    if not tb:
+        try:
+            tb = sys.last_traceback
+        except AttributeError:
+            raise RuntimeError, "no last traceback to disassemble"
+        while tb.tb_next: tb = tb.tb_next
+    disassemble(tb.tb_frame.f_code, tb.tb_lasti)
+
+def disassemble(co, lasti=-1):
+    """Disassemble a code object."""
+    code = co.co_code
+    labels = findlabels(code)
+    n = len(code)
+    i = 0
+    extended_arg = 0
+    free = None
+    while i < n:
+        c = code[i]
+        op = ord(c)
+        if op == SET_LINENO and i > 0: print # Extra blank line
+        if i == lasti: print '-->',
+        else: print '   ',
+        if i in labels: print '>>',
+        else: print '  ',
+        print `i`.rjust(4),
+        print opname[op].ljust(20),
+        i = i+1
+        if op >= HAVE_ARGUMENT:
+            oparg = ord(code[i]) + ord(code[i+1])*256 + extended_arg
+            extended_arg = 0
+            i = i+2
+            if op == EXTENDED_ARG:
+                extended_arg = oparg*65536L
+            print `oparg`.rjust(5),
+            if op in hasconst:
+                print '(' + `co.co_consts[oparg]` + ')',
+            elif op in hasname:
+                print '(' + co.co_names[oparg] + ')',
+            elif op in hasjrel:
+                print '(to ' + `i + oparg` + ')',
+            elif op in haslocal:
+                print '(' + co.co_varnames[oparg] + ')',
+            elif op in hascompare:
+                print '(' + cmp_op[oparg] + ')',
+            elif op in hasfree:
+                if free is None:
+                    free = co.co_cellvars + co.co_freevars
+                print '(' + free[oparg] + ')',
+        print
+
+disco = disassemble                     # XXX For backwards compatibility
+
+def findlabels(code):
+    """Detect all offsets in a byte code which are jump targets.
+
+    Return the list of offsets.
+
+    """
+    labels = []
+    n = len(code)
+    i = 0
+    while i < n:
+        c = code[i]
+        op = ord(c)
+        i = i+1
+        if op >= HAVE_ARGUMENT:
+            oparg = ord(code[i]) + ord(code[i+1])*256
+            i = i+2
+            label = -1
+            if op in hasjrel:
+                label = i+oparg
+            elif op in hasjabs:
+                label = oparg
+            if label >= 0:
+                if label not in labels:
+                    labels.append(label)
+    return labels
+
+cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is',
+        'is not', 'exception match', 'BAD')
+
+hasconst = []
+hasname = []
+hasjrel = []
+hasjabs = []
+haslocal = []
+hascompare = []
+hasfree = []
+
+opname = [''] * 256
+for op in range(256): opname[op] = '<' + `op` + '>'
+
+def def_op(name, op):
+    opname[op] = name
+
+def name_op(name, op):
+    opname[op] = name
+    hasname.append(op)
+
+def jrel_op(name, op):
+    opname[op] = name
+    hasjrel.append(op)
+
+def jabs_op(name, op):
+    opname[op] = name
+    hasjabs.append(op)
+
+# Instruction opcodes for compiled code
+
+def_op('STOP_CODE', 0)
+def_op('POP_TOP', 1)
+def_op('ROT_TWO', 2)
+def_op('ROT_THREE', 3)
+def_op('DUP_TOP', 4)
+def_op('ROT_FOUR', 5)
+
+def_op('UNARY_POSITIVE', 10)
+def_op('UNARY_NEGATIVE', 11)
+def_op('UNARY_NOT', 12)
+def_op('UNARY_CONVERT', 13)
+
+def_op('UNARY_INVERT', 15)
+
+def_op('BINARY_POWER', 19)
+
+def_op('BINARY_MULTIPLY', 20)
+def_op('BINARY_DIVIDE', 21)
+def_op('BINARY_MODULO', 22)
+def_op('BINARY_ADD', 23)
+def_op('BINARY_SUBTRACT', 24)
+def_op('BINARY_SUBSCR', 25)
+def_op('BINARY_FLOOR_DIVIDE', 26)
+def_op('BINARY_TRUE_DIVIDE', 27)
+def_op('INPLACE_FLOOR_DIVIDE', 28)
+def_op('INPLACE_TRUE_DIVIDE', 29)
+
+def_op('SLICE+0', 30)
+def_op('SLICE+1', 31)
+def_op('SLICE+2', 32)
+def_op('SLICE+3', 33)
+
+def_op('STORE_SLICE+0', 40)
+def_op('STORE_SLICE+1', 41)
+def_op('STORE_SLICE+2', 42)
+def_op('STORE_SLICE+3', 43)
+
+def_op('DELETE_SLICE+0', 50)
+def_op('DELETE_SLICE+1', 51)
+def_op('DELETE_SLICE+2', 52)
+def_op('DELETE_SLICE+3', 53)
+
+def_op('INPLACE_ADD', 55)
+def_op('INPLACE_SUBTRACT', 56)
+def_op('INPLACE_MULTIPLY', 57)
+def_op('INPLACE_DIVIDE', 58)
+def_op('INPLACE_MODULO', 59)
+def_op('STORE_SUBSCR', 60)
+def_op('DELETE_SUBSCR', 61)
+
+def_op('BINARY_LSHIFT', 62)
+def_op('BINARY_RSHIFT', 63)
+def_op('BINARY_AND', 64)
+def_op('BINARY_XOR', 65)
+def_op('BINARY_OR', 66)
+def_op('INPLACE_POWER', 67)
+def_op('GET_ITER', 68)
+
+def_op('PRINT_EXPR', 70)
+def_op('PRINT_ITEM', 71)
+def_op('PRINT_NEWLINE', 72)
+def_op('PRINT_ITEM_TO', 73)
+def_op('PRINT_NEWLINE_TO', 74)
+def_op('INPLACE_LSHIFT', 75)
+def_op('INPLACE_RSHIFT', 76)
+def_op('INPLACE_AND', 77)
+def_op('INPLACE_XOR', 78)
+def_op('INPLACE_OR', 79)
+def_op('BREAK_LOOP', 80)
+
+def_op('LOAD_LOCALS', 82)
+def_op('RETURN_VALUE', 83)
+def_op('IMPORT_STAR', 84)
+def_op('EXEC_STMT', 85)
+def_op('YIELD_STMT', 86)
+
+def_op('POP_BLOCK', 87)
+def_op('END_FINALLY', 88)
+def_op('BUILD_CLASS', 89)
+
+HAVE_ARGUMENT = 90              # Opcodes from here have an argument:
+
+name_op('STORE_NAME', 90)       # Index in name list
+name_op('DELETE_NAME', 91)      # ""
+def_op('UNPACK_SEQUENCE', 92)   # Number of tuple items
+jrel_op('FOR_ITER', 93)
+
+name_op('STORE_ATTR', 95)       # Index in name list
+name_op('DELETE_ATTR', 96)      # ""
+name_op('STORE_GLOBAL', 97)     # ""
+name_op('DELETE_GLOBAL', 98)    # ""
+def_op('DUP_TOPX', 99)          # number of items to duplicate
+def_op('LOAD_CONST', 100)       # Index in const list
+hasconst.append(100)
+name_op('LOAD_NAME', 101)       # Index in name list
+def_op('BUILD_TUPLE', 102)      # Number of tuple items
+def_op('BUILD_LIST', 103)       # Number of list items
+def_op('BUILD_MAP', 104)        # Always zero for now
+name_op('LOAD_ATTR', 105)       # Index in name list
+def_op('COMPARE_OP', 106)       # Comparison operator
+hascompare.append(106)
+name_op('IMPORT_NAME', 107)     # Index in name list
+name_op('IMPORT_FROM', 108)     # Index in name list
+
+jrel_op('JUMP_FORWARD', 110)    # Number of bytes to skip
+jrel_op('JUMP_IF_FALSE', 111)   # ""
+jrel_op('JUMP_IF_TRUE', 112)    # ""
+jabs_op('JUMP_ABSOLUTE', 113)   # Target byte offset from beginning of code
+jrel_op('FOR_LOOP', 114)        # Number of bytes to skip
+
+name_op('LOAD_GLOBAL', 116)     # Index in name list
+
+jabs_op('CONTINUE_LOOP', 119)   # Target address
+jrel_op('SETUP_LOOP', 120)      # Distance to target address
+jrel_op('SETUP_EXCEPT', 121)    # ""
+jrel_op('SETUP_FINALLY', 122)   # ""
+
+def_op('LOAD_FAST', 124)        # Local variable number
+haslocal.append(124)
+def_op('STORE_FAST', 125)       # Local variable number
+haslocal.append(125)
+def_op('DELETE_FAST', 126)      # Local variable number
+haslocal.append(126)
+
+def_op('SET_LINENO', 127)       # Current line number
+SET_LINENO = 127
+
+def_op('RAISE_VARARGS', 130)    # Number of raise arguments (1, 2, or 3)
+def_op('CALL_FUNCTION', 131)    # #args + (#kwargs << 8)
+def_op('MAKE_FUNCTION', 132)    # Number of args with default values
+def_op('BUILD_SLICE', 133)      # Number of items
+
+def_op('MAKE_CLOSURE', 134)
+def_op('LOAD_CLOSURE', 135)
+hasfree.append(135)
+def_op('LOAD_DEREF', 136)
+hasfree.append(136)
+def_op('STORE_DEREF', 137)
+hasfree.append(137)
+
+def_op('CALL_FUNCTION_VAR', 140)     # #args + (#kwargs << 8)
+def_op('CALL_FUNCTION_KW', 141)      # #args + (#kwargs << 8)
+def_op('CALL_FUNCTION_VAR_KW', 142)  # #args + (#kwargs << 8)
+
+def_op('EXTENDED_ARG', 143)
+EXTENDED_ARG = 143
+
+def _test():
+    """Simple test program to disassemble a file."""
+    if sys.argv[1:]:
+        if sys.argv[2:]:
+            sys.stderr.write("usage: python dis.py [-|file]\n")
+            sys.exit(2)
+        fn = sys.argv[1]
+        if not fn or fn == "-":
+            fn = None
+    else:
+        fn = None
+    if not fn:
+        f = sys.stdin
+    else:
+        f = open(fn)
+    source = f.read()
+    if fn:
+        f.close()
+    else:
+        fn = "<stdin>"
+    code = compile(source, fn, "exec")
+    dis(code)
+
+if __name__ == "__main__":
+    _test()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/history.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/history.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/history.py	(revision 1126)
@@ -0,0 +1,55 @@
+"""
+ history.py - Handles the History of the jython console
+ Copyright (C) 2001 Carlos Quiroz
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+"""
+#from org.gjt.sp.jedit.gui import HistoryModel
+
+class History:
+    """
+    The class history handles the history management basically wrapping the
+    built-in jEdit's history capabilities
+    """
+
+    def __init__(self, console):
+        self.history = []
+	self.console = console
+	self.index = 0
+	self.last = ""
+
+    def append(self, line):
+        if line == '\n' or len(line) == 0: return
+## 	if line == self.last: # avoid duplicates
+## 	    self.index = len(self.history) - 1
+##          return
+		
+	self.last = line
+	self.history.append(line)
+	self.index = len(self.history) - 1
+
+    def historyUp(self, event):
+        if len(self.history) > 0 and self.console.inLastLine():
+	    self.console.replaceRow(self.history[self.index])
+	    self.index = max(self.index - 1, 0)
+
+    def historyDown(self, event):
+        if len(self.history) > 0 and self.console.inLastLine():
+	    if self.index == len(self.history) - 1:
+	        self.console.replaceRow("")
+	    else:
+	        self.index += 1
+	        self.console.replaceRow(self.history[self.index])
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/console.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/console.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/console.py	(revision 1126)
@@ -0,0 +1,412 @@
+"""
+Jython Console with Code Completion
+
+This uses the basic Jython Interactive Interpreter.
+The UI uses code from Carlos Quiroz's 'Jython Interpreter for JEdit' http://www.jedit.org
+"""
+from javax.swing import JFrame, JScrollPane, JWindow, JTextPane, Action, KeyStroke, WindowConstants
+from javax.swing.text import JTextComponent, TextAction, SimpleAttributeSet, StyleConstants
+from java.awt import Color, Font, FontMetrics, Point
+from java.awt.event import  InputEvent, KeyEvent, WindowAdapter
+
+import jintrospect
+from popup import Popup
+from tip import Tip
+from history import History
+
+import sys
+import traceback
+from code import InteractiveInterpreter
+from org.python.util import InteractiveConsole
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: console.py 5910 2006-06-20 10:03:31Z jmvivo $"
+
+def debug(name, value=None):
+    if value == None:
+        print >> sys.stderr, name
+    else:
+        print >> sys.stderr, "%s = %s" % (name, value)
+
+if not hasattr(sys,"ps1"):
+    sys.ps1 ='>>> '
+    sys.ps2 ='... '
+
+class Console:
+    PROMPT = sys.ps1
+    PROCESS = sys.ps2
+    BANNER = ["Jython Completion Shell", InteractiveConsole.getDefaultBanner()]
+
+    def __init__(self, frame):
+
+        self.frame = frame # TODO do I need a reference to frame after the constructor?
+        self.history = History(self)
+        self.promptPosition = 0
+
+        # command buffer
+        self.buffer = []
+        self.locals = {}
+        #self.locals = {"gvSIG":sys.gvSIG}
+
+        self.interp = Interpreter(self, self.locals)
+        sys.stdout = StdOutRedirector(self)
+
+        # create a textpane
+        self.output = JTextPane(keyTyped = self.keyTyped, keyPressed = self.keyPressed)
+        # TODO rename output to textpane
+
+        # CTRL UP AND DOWN don't work
+        keyBindings = [
+            (KeyEvent.VK_ENTER, 0, "jython.enter", self.enter),
+            (KeyEvent.VK_DELETE, 0, "jython.delete", self.delete),
+            (KeyEvent.VK_BACK_SPACE, 0, "jython.backspace", self.backspace),
+            (KeyEvent.VK_HOME, 0, "jython.home", self.home),
+            (KeyEvent.VK_UP, 0, "jython.up", self.history.historyUp),
+            (KeyEvent.VK_DOWN, 0, "jython.down", self.history.historyDown),
+            (KeyEvent.VK_PERIOD, 0, "jython.showPopup", self.showPopup),
+            (KeyEvent.VK_ESCAPE, 0, "jython.hide", self.hide),
+            
+            ('(', 0, "jython.showTip", self.showTip),
+            (')', 0, "jython.hideTip", self.hideTip),
+            
+            #(KeyEvent.VK_UP, InputEvent.CTRL_MASK, DefaultEditorKit.upAction, self.output.keymap.getAction(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0))),
+            #(KeyEvent.VK_DOWN, InputEvent.CTRL_MASK, DefaultEditorKit.downAction, self.output.keymap.getAction(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)))
+            ]
+        # TODO rename newmap to keymap
+        newmap = JTextComponent.addKeymap("jython", self.output.keymap)
+        for (key, modifier, name, function) in keyBindings:
+            newmap.addActionForKeyStroke(KeyStroke.getKeyStroke(key, modifier), ActionDelegator(name, function))
+
+        self.output.keymap = newmap
+                
+        self.doc = self.output.document
+        #self.panel.add(BorderLayout.CENTER, JScrollPane(self.output))
+        self.__propertiesChanged()
+        self.__inittext()
+        self.initialLocation = self.doc.createPosition(self.doc.length-1)
+
+	# Don't pass frame to popups. JWindows with null owners are not focusable
+	# this fixes the focus problem on Win32, but make the mouse problem worse
+        self.popup = Popup(None, self.output)
+        self.tip = Tip(None)
+
+        # get fontmetrics info so we can position the popup
+        metrics = self.output.getFontMetrics(self.output.getFont())
+        self.dotWidth = metrics.charWidth('.')
+        self.textHeight = metrics.getHeight()
+
+        # add some handles to our objects
+        self.locals['console'] = self
+
+        self.caret = self.output.getCaret()
+
+    # TODO refactor me
+    def getinput(self):
+        offsets = self.__lastLine()
+        text = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+        return text
+
+    def getDisplayPoint(self):
+        """Get the point where the popup window should be displayed"""
+        screenPoint = self.output.getLocationOnScreen()
+        caretPoint = self.output.caret.getMagicCaretPosition()
+
+        # TODO use SwingUtils to do this translation
+        x = screenPoint.getX() + caretPoint.getX() + self.dotWidth 
+        y = screenPoint.getY() + caretPoint.getY() + self.textHeight
+        return Point(int(x),int(y))
+
+    def hide(self, event=None):
+        """Hide the popup or tip window if visible"""
+        if self.popup.visible:
+            self.popup.hide()
+        if self.tip.visible:
+            self.tip.hide()
+
+    def hideTip(self, event=None):
+        self.tip.hide()
+        # TODO this needs to insert ')' at caret!
+        self.write(')')
+
+    def showTip(self, event=None):
+        # get the display point before writing text
+        # otherwise magicCaretPosition is None
+        displayPoint = self.getDisplayPoint()
+
+        if self.popup.visible:
+            self.popup.hide()
+        
+        line = self.getinput()
+        #debug("line", line)
+        # Hack 'o rama
+        line = line[:-1] # remove \n
+        line += '('
+        #debug("line", line)
+
+        # TODO this needs to insert '(' at caret!
+        self.write('(')
+        
+        (name, argspec, tip) = jintrospect.getCallTipJava(line, self.locals)
+        #debug("name", name)
+        #debug("argspec", argspec)
+        #debug("tip", tip)
+
+        if tip:
+            self.tip.setLocation(displayPoint)
+            self.tip.setText(tip)
+            self.tip.show()
+            
+
+    def showPopup(self, event=None):
+
+        line = self.getinput()
+        # this is silly, I have to add the '.' and the other code removes it.
+        line = line[:-1] # remove \n
+        line = line + '.'
+        #print >> sys.stderr, "line:",line
+        
+        # TODO get this code into Popup
+        # TODO handle errors gracefully
+        try:
+            list = jintrospect.getAutoCompleteList(line, self.locals)
+        except Exception, e:
+            # TODO handle this gracefully
+            print >> sys.stderr, e
+            return
+
+        if len(list) == 0:
+            #print >> sys.stderr, "list was empty"
+            return
+
+        self.popup.setLocation(self.getDisplayPoint())
+
+        self.popup.setMethods(list)
+        self.popup.show()
+        self.popup.list.setSelectedIndex(0)
+
+    def beyondPrompt(self, considerCurrent=True, considerSelection=False):
+        """Determines wheter the cursor is in the editable area
+           (i.e. beyond the last prompt position)"""
+        caret = self.output.caretPosition
+        caret0 = caret
+        if considerCurrent:
+            caret = caret + 1
+        if considerSelection:
+            if self.output.selectedText:
+                caret = self.output.selectionEnd
+        if caret > self.promptPosition:
+            return True
+        return False
+
+    def inLastLine(self, include = 1):
+        """ Determines whether the cursor is in the last line """
+        limits = self.__lastLine()
+        caret = self.output.caretPosition
+        if self.output.selectedText:
+            caret = self.output.selectionStart
+        if include:
+            return (caret >= limits[0] and caret <= limits[1])
+        else:
+            return (caret > limits[0] and caret <= limits[1])
+
+    def enter(self, event):
+        """ Triggered when enter is pressed """
+        offsets = self.__lastLine()
+        text = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+        text = text[:-1] # chomp \n
+        self.buffer.append(text)
+        source = "\n".join(self.buffer)
+        more = self.interp.runsource(source)
+        if more:
+            self.printOnProcess()
+        else:
+            self.resetbuffer()
+            self.printPrompt()
+        self.history.append(text)
+
+        self.hide()
+
+    def resetbuffer(self):
+        self.buffer = []
+
+    # home key stops after prompt
+    def home(self, event):
+		""" Triggered when HOME is pressed """
+		if self.inLastLine():
+			self.output.caretPosition = self.__lastLine()[0]
+		else:
+			lines = self.doc.rootElements[0].elementCount
+			for i in xrange(0,lines-1):
+				offsets = (self.doc.rootElements[0].getElement(i).startOffset, \
+					self.doc.rootElements[0].getElement(i).endOffset)
+				line = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+				if self.output.caretPosition >= offsets[0] and \
+					self.output.caretPosition <= offsets[1]:
+					if line.startswith(Console.PROMPT) or line.startswith(Console.PROCESS):
+						self.output.caretPosition = offsets[0] + len(Console.PROMPT)
+					else:
+						self.output.caretPosition = offsets[0]
+
+    def replaceRow(self, text):
+        """ Replaces the last line of the textarea with text """
+        offset = self.__lastLine()
+        last = self.doc.getText(offset[0], offset[1]-offset[0])
+        if last != "\n":
+            self.doc.remove(offset[0], offset[1]-offset[0]-1)
+        self.__addOutput(self.infoColor, text)
+
+    def __do_delete(self, event, pos=0):
+        if self.output.selectedText:
+            start = max(self.output.selectionStart, self.promptPosition)
+            self.doc.remove(start, self.output.selectionEnd - start)
+        else:
+            self.doc.remove(self.output.caretPosition + pos, 1)
+
+    # don't allow prompt to be deleted
+    def delete(self, event):
+        """ Intercepts backspace events only allowing it to work in the last line """
+        if self.beyondPrompt(considerCurrent=True, considerSelection=True):
+            self.__do_delete(event)
+
+
+    # don't allow prompt to be deleted
+    def backspace(self, event):
+        """ Intercepts backspace events only allowing it to work in the last line """
+        if self.beyondPrompt(considerCurrent=False, considerSelection=True):
+            self.__do_delete(event, -1)
+
+    # why is there a keyTyped and a keyPressed?
+    def keyTyped(self, event):
+        if not self.beyondPrompt():
+            self.output.setCaretPosition(self.doc.length)
+
+    def keyPressed(self, event):
+        # skip Shift + delete and shift + backspace as the are incorrectly managed
+        if event.keyCode == KeyEvent.VK_BACK_SPACE or event.keyCode == KeyEvent.VK_DELETE:
+            if event.modifiers > 0:
+                event.consume()
+
+        if self.popup.visible:
+            self.popup.key(event)
+
+
+    # TODO refactor me
+    def write(self, text):
+        self.__addOutput(self.infoColor, text)
+
+    def printResult(self, msg):
+        """ Prints the results of an operation """
+        self.__addOutput(self.output.foreground, msg, True)
+
+    def printError(self, msg): 
+        self.__addOutput(self.errorColor, msg, True)
+
+    def printOnProcess(self):
+        """ Prints the process symbol """
+        self.__addOutput(self.infoColor, Console.PROCESS, True)
+
+    def printPrompt(self):
+        """ Prints the prompt """
+        self.__addOutput(self.infoColor, Console.PROMPT, True)
+        self.promptPosition = self.doc.length
+		
+    def __addOutput(self, color, msg, new_line=False):
+        """ Adds the output to the text area using a given color """
+        if new_line:
+            if isinstance(msg, unicode):
+                msg =  u"\n" + msg
+            else:
+                msg = "\n" + str(msg)
+        from javax.swing.text import BadLocationException
+        style = SimpleAttributeSet()
+
+        if color:
+            style.addAttribute(StyleConstants.Foreground, color)
+
+        self.doc.insertString(self.doc.length, msg, style)
+        self.output.caretPosition = self.doc.length
+
+    def __propertiesChanged(self):
+        """ Detects when the properties have changed """
+        self.output.background = Color.white #jEdit.getColorProperty("jython.bgColor")
+        self.output.foreground = Color.blue #jEdit.getColorProperty("jython.resultColor")
+        self.infoColor = Color.black #jEdit.getColorProperty("jython.textColor")
+        self.errorColor = Color.red # jEdit.getColorProperty("jython.errorColor")
+
+        family = "Monospaced" # jEdit.getProperty("jython.font", "Monospaced")
+        size = 14 #jEdit.getIntegerProperty("jython.fontsize", 14)
+        style = Font.PLAIN #jEdit.getIntegerProperty("jython.fontstyle", Font.PLAIN)
+        self.output.setFont(Font(family,style,size))
+
+    def __inittext(self):
+        """ Inserts the initial text with the jython banner """
+        self.doc.remove(0, self.doc.length)
+        for line in "\n".join(Console.BANNER):
+            self.__addOutput(self.infoColor, line)
+        self.printPrompt()
+        self.output.requestFocus()
+
+    def __lastLine(self):
+        """ Returns the char offests of the last line """
+        lines = self.doc.rootElements[0].elementCount
+        offsets = (self.doc.rootElements[0].getElement(lines-1).startOffset, \
+                   self.doc.rootElements[0].getElement(lines-1).endOffset)
+        line = self.doc.getText(offsets[0], offsets[1]-offsets[0])
+        if len(line) >= 4 and (line[0:4]==Console.PROMPT or line[0:4]==Console.PROCESS):
+            return (offsets[0] + len(Console.PROMPT), offsets[1])
+        return offsets
+
+
+class ActionDelegator(TextAction):
+	"""
+		Class action delegator encapsulates a TextAction delegating the action
+		event to a simple function
+	"""
+	def __init__(self, name, delegate):
+		TextAction.__init__(self, name)
+		self.delegate = delegate
+
+	def actionPerformed(self, event):
+		if isinstance(self.delegate, Action):
+			self.delegate.actionPerformed(event)
+		else:
+			self.delegate(event)
+
+class Interpreter(InteractiveInterpreter):
+    def __init__(self, console, locals):
+        InteractiveInterpreter.__init__(self, locals)
+        self.console = console
+        
+        
+    def write(self, data):
+        # send all output to the textpane
+        # KLUDGE remove trailing linefeed
+        self.console.printError(data[:-1])
+        
+
+# redirect stdout to the textpane
+class StdOutRedirector:
+    def __init__(self, console):
+        self.console = console
+        
+    def write(self, data):
+        #print >> sys.stderr, ">>%s<<" % data
+        if data != '\n':
+            # This is a sucky hack.  Fix printResult
+            self.console.printResult(data)
+
+class JythonFrame(JFrame):
+    def __init__(self):
+        self.title = "Jython"
+        self.size = (600, 400)
+        self.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
+
+
+def main():
+    frame = JythonFrame()
+    console = Console(frame)
+    frame.getContentPane().add(JScrollPane(console.output))
+    frame.show()
+    
+if __name__ == "__main__":
+    main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/popup.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/popup.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/popup.py	(revision 1126)
@@ -0,0 +1,137 @@
+from java.lang import Character
+from javax.swing import JWindow, JList, JScrollPane
+from java.awt import Color, Dimension
+from java.awt.event import KeyAdapter
+from java.awt.event import KeyEvent
+import string
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: popup.py 5782 2006-06-12 07:56:49Z jmvivo $"
+
+class Popup(JWindow):
+    """Popup window to display list of methods for completion"""
+    
+    MAX_HEIGHT = 300
+    MIN_WIDTH = 200
+    MAX_WIDTH = 400
+    
+    def __init__(self, frame, textComponent):
+        JWindow.__init__(self, frame)
+        self.textComponent = textComponent
+        self.size = (200,200)
+        self.list = JList(keyPressed=self.key)
+        self.list.setBackground(Color(255,255,225)) # TODO move this color
+        self.getContentPane().add(JScrollPane(self.list))
+        self.list.setSelectedIndex(0)
+
+        self.originalData = ""
+        self.data = ""
+        self.typed = ""
+
+    def key(self, e):
+        # key listener
+        #print "Other Listener"
+        code = e.getKeyCode()
+        #print 'keychar:',e.getKeyChar()
+        
+        if code == KeyEvent.VK_ESCAPE:
+            self.hide()
+
+        elif code == KeyEvent.VK_ENTER or code == KeyEvent.VK_TAB:
+            self.chooseSelected()
+            e.consume()
+
+        elif code == 8: # BACKSPACE
+            self.typed = self.typed[:-1]
+            self.data = filter(self.originalData, self.typed)
+            self.list.setListData(self.data)
+            self.list.setSelectedIndex(0)
+                
+        elif code == KeyEvent.VK_UP:
+            self.previous()
+            # consume event to avoid history previous
+            e.consume()
+            
+        elif code == KeyEvent.VK_DOWN:
+            self.next()
+            # consume event to avoid history next
+            e.consume()
+            
+        else:
+            char = e.getKeyChar()
+            if Character.isJavaLetterOrDigit(char):
+                self.typed += char 
+                self.data = filter(self.data, self.typed)
+                self.list.setListData(self.data)
+                try:
+                  self.list.setSelectedIndex(0)
+                except:
+                  pass
+                
+    def next(self):
+        index = self.list.getSelectedIndex()
+        max = (self.list.getModel().getSize() - 1)
+        
+        if index < max:
+            index += 1
+            self.list.setSelectedIndex(index)
+            self.list.ensureIndexIsVisible(index)
+        
+    def previous(self):
+        index = self.list.getSelectedIndex()
+
+        if index > 0:
+            index -= 1
+            self.list.setSelectedIndex(index)
+            self.list.ensureIndexIsVisible(index)
+
+    def chooseSelected(self):
+        """Choose the selected value in the list"""
+        try:
+            value = self.list.getSelectedValue()
+            startPosition = self.dotPosition + 1
+            caretPosition = self.textComponent.getCaretPosition()
+            self.textComponent.select(startPosition, caretPosition) 
+            self.textComponent.replaceSelection(value)
+            self.textComponent.setCaretPosition(startPosition + len(value))
+        except:
+            pass
+        self.hide()
+
+    def setMethods(self, methodList):
+        methodList = list(set(methodList))
+        methodList.sort()
+        self.data = methodList
+        self.originalData = methodList
+        self.typed = ""
+        self.list.setListData(methodList)
+
+    def show(self):
+        # when the popup becomes visible, get the cursor
+        # so we know how to replace the selection
+        self.dotPosition = self.textComponent.getCaretPosition()
+        self.setSize(self.getPreferredSize())
+        JWindow.show(self)
+
+    def getPreferredSize(self):
+        # need to add a magic amount to the size to avoid scrollbars
+        # I'm sure there's a better way to do this
+        MAGIC = 20
+        size = self.list.getPreferredScrollableViewportSize()
+        height = size.height + MAGIC
+        width = size.width + MAGIC
+        if height > Popup.MAX_HEIGHT:
+            height = Popup.MAX_HEIGHT
+        if width > Popup.MAX_WIDTH:
+            width = Popup.MAX_WIDTH
+        if width < Popup.MIN_WIDTH:
+            widht = Popup.MIN_WIDTH
+        return Dimension(width, height)
+
+    
+# this needs a list renderer that will hilight the prefix
+def filter(list, prefix):
+    prefix = prefix.lower()
+    list = [eachItem for eachItem in list if str(eachItem).lower().startswith(prefix)]
+    return list
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/jintrospect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/jintrospect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/jintrospect.py	(revision 1126)
@@ -0,0 +1,158 @@
+"""Extend introspect.py for Java based Jython classes."""
+
+from introspect import *
+import string
+
+__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
+__cvsid__ = "$Id: jintrospect.py 5782 2006-06-12 07:56:49Z jmvivo $"
+
+def getAutoCompleteList(command='', locals=None, includeMagic=1, 
+                        includeSingle=1, includeDouble=1):
+    """Return list of auto-completion options for command.
+    
+    The list of options will be based on the locals namespace."""
+    attributes = []
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='.')
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        return attributes
+    
+    if ispython(object):
+        # use existing code
+        attributes = getAttributeNames(object, includeMagic, includeSingle, includeDouble)
+    else:
+        methods = methodsOf(object.__class__)
+        attributes = [eachMethod.__name__ for eachMethod in methods]
+        
+    return attributes
+
+def methodsOf(clazz):
+    """return a list of all the methods in a class"""
+    classMembers = vars(clazz).values()
+    methods = [eachMember for eachMember in classMembers if callable(eachMember)]
+    for eachBase in clazz.__bases__:
+        methods.extend(methodsOf(eachBase))
+    return methods
+
+def getCallTipJava(command='', locals=None):
+    """For a command, return a tuple of object name, argspec, tip text.
+
+    The call tip information will be based on the locals namespace."""
+
+    calltip = ('', '', '')  # object name, argspec, tip text.
+
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='(')
+
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        return calltip
+
+    if ispython(object):
+        # Patrick's code handles python code
+        # TODO fix in future because getCallTip runs eval() again
+        return getCallTip(command, locals)
+
+    name = ''
+    try:
+        name = object.__name__
+    except AttributeError:
+        pass
+    
+    tipList = []
+    argspec = '' # not using argspec for Java
+    
+    if inspect.isbuiltin(object):
+        # inspect.isbuiltin() fails for Jython
+        # Can we get the argspec for Jython builtins?  We can't in Python.
+        pass
+    elif inspect.isclass(object):
+        # get the constructor(s)
+        # TODO consider getting modifiers since jython can access private methods
+        constructors = object.getConstructors()
+        for constructor in constructors:
+            paramList = []
+            paramTypes = constructor.getParameterTypes()
+            # paramTypes is an array of classes, we need Strings
+            # TODO consider list comprehension
+            for param in paramTypes:
+                # TODO translate [B to byte[], [C to char[] etc
+                paramList.append(param.__name__)
+            paramString = string.join(paramList,', ')
+            tip = "%s(%s)" % (constructor.name, paramString)
+            tipList.append(tip)
+             
+    elif inspect.ismethod(object):
+        method = object
+        object = method.im_class
+
+        # java allows overloading so we may have more than one method
+        methodArray = object.getMethods()
+
+        for eachMethod in methodArray:
+            if eachMethod.name == method.__name__:
+                paramList = []
+                for eachParam in eachMethod.parameterTypes:
+                    paramList.append(eachParam.__name__)
+                 
+                paramString = string.join(paramList,', ')
+
+                # create a python style string a la PyCrust
+                # we're showing the parameter type rather than the parameter name, since that's all I can get
+                # we need to show multiple methods for overloading
+                # TODO improve message format
+                # do we want to show the method visibility
+                # how about exceptions?
+                # note: name, return type and exceptions same for EVERY overload method
+
+                tip = "%s(%s) -> %s" % (eachMethod.name, paramString, eachMethod.returnType)
+                tipList.append(tip)
+            
+#    else:
+#        print "Not a java class :("
+
+    calltip = (name, argspec, string.join(tipList,"\n"))
+    return calltip
+                                      
+def ispython(object):
+    """
+    Figure out if this is Python code or Java Code
+
+    """
+    pyclass = 0
+    pycode = 0
+    pyinstance = 0
+    
+    if inspect.isclass(object):
+        try:
+            object.__doc__
+            pyclass = 1
+        except AttributeError:
+            pyclass = 0
+
+    elif inspect.ismethod(object):
+        try:
+            object.__dict__
+            pycode = 1
+        except AttributeError:
+            pycode = 0
+    else: # I guess an instance of an object falls here
+        try:
+            object.__dict__
+            pyinstance = 1
+        except AttributeError:
+            pyinstance = 0
+
+#    print "object", object, "pyclass", pyclass, "pycode", pycode, "returning", pyclass | pycode
+    
+    return pyclass | pycode | pyinstance
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/inspect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/inspect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/inspect.py	(revision 1126)
@@ -0,0 +1,789 @@
+"""Get useful information from live Python objects.
+
+This module encapsulates the interface provided by the internal special
+attributes (func_*, co_*, im_*, tb_*, etc.) in a friendlier fashion.
+It also provides some help for examining source code and class layout.
+
+Here are some of the useful functions provided by this module:
+
+    ismodule(), isclass(), ismethod(), isfunction(), istraceback(),
+        isframe(), iscode(), isbuiltin(), isroutine() - check object types
+    getmembers() - get members of an object that satisfy a given condition
+
+    getfile(), getsourcefile(), getsource() - find an object's source code
+    getdoc(), getcomments() - get documentation on an object
+    getmodule() - determine the module that an object came from
+    getclasstree() - arrange classes so as to represent their hierarchy
+
+    getargspec(), getargvalues() - get info about function arguments
+    formatargspec(), formatargvalues() - format an argument spec
+    getouterframes(), getinnerframes() - get info about frames
+    currentframe() - get the current stack frame
+    stack(), trace() - get info about frames on the stack or in a traceback
+"""
+
+# This module is in the public domain.  No warranties.
+
+__author__ = 'Ka-Ping Yee <ping@lfw.org>'
+__date__ = '1 Jan 2001'
+
+import sys, os, types, string, re, dis, imp, tokenize
+
+# ----------------------------------------------------------- type-checking
+def ismodule(object):
+    """Return true if the object is a module.
+
+    Module objects provide these attributes:
+        __doc__         documentation string
+        __file__        filename (missing for built-in modules)"""
+    return isinstance(object, types.ModuleType)
+
+def isclass(object):
+    """Return true if the object is a class.
+
+    Class objects provide these attributes:
+        __doc__         documentation string
+        __module__      name of module in which this class was defined"""
+    return isinstance(object, types.ClassType) or hasattr(object, '__bases__')
+
+def ismethod(object):
+    """Return true if the object is an instance method.
+
+    Instance method objects provide these attributes:
+        __doc__         documentation string
+        __name__        name with which this method was defined
+        im_class        class object in which this method belongs
+        im_func         function object containing implementation of method
+        im_self         instance to which this method is bound, or None"""
+    return isinstance(object, types.MethodType)
+
+def ismethoddescriptor(object):
+    """Return true if the object is a method descriptor.
+
+    But not if ismethod() or isclass() or isfunction() are true.
+
+    This is new in Python 2.2, and, for example, is true of int.__add__.
+    An object passing this test has a __get__ attribute but not a __set__
+    attribute, but beyond that the set of attributes varies.  __name__ is
+    usually sensible, and __doc__ often is.
+
+    Methods implemented via descriptors that also pass one of the other
+    tests return false from the ismethoddescriptor() test, simply because
+    the other tests promise more -- you can, e.g., count on having the
+    im_func attribute (etc) when an object passes ismethod()."""
+    return (hasattr(object, "__get__")
+            and not hasattr(object, "__set__") # else it's a data descriptor
+            and not ismethod(object)           # mutual exclusion
+            and not isfunction(object)
+            and not isclass(object))
+
+def isfunction(object):
+    """Return true if the object is a user-defined function.
+
+    Function objects provide these attributes:
+        __doc__         documentation string
+        __name__        name with which this function was defined
+        func_code       code object containing compiled function bytecode
+        func_defaults   tuple of any default values for arguments
+        func_doc        (same as __doc__)
+        func_globals    global namespace in which this function was defined
+        func_name       (same as __name__)"""
+    return isinstance(object, types.FunctionType)
+
+def istraceback(object):
+    """Return true if the object is a traceback.
+
+    Traceback objects provide these attributes:
+        tb_frame        frame object at this level
+        tb_lasti        index of last attempted instruction in bytecode
+        tb_lineno       current line number in Python source code
+        tb_next         next inner traceback object (called by this level)"""
+    return isinstance(object, types.TracebackType)
+
+def isframe(object):
+    """Return true if the object is a frame object.
+
+    Frame objects provide these attributes:
+        f_back          next outer frame object (this frame's caller)
+        f_builtins      built-in namespace seen by this frame
+        f_code          code object being executed in this frame
+        f_exc_traceback traceback if raised in this frame, or None
+        f_exc_type      exception type if raised in this frame, or None
+        f_exc_value     exception value if raised in this frame, or None
+        f_globals       global namespace seen by this frame
+        f_lasti         index of last attempted instruction in bytecode
+        f_lineno        current line number in Python source code
+        f_locals        local namespace seen by this frame
+        f_restricted    0 or 1 if frame is in restricted execution mode
+        f_trace         tracing function for this frame, or None"""
+    return isinstance(object, types.FrameType)
+
+def iscode(object):
+    """Return true if the object is a code object.
+
+    Code objects provide these attributes:
+        co_argcount     number of arguments (not including * or ** args)
+        co_code         string of raw compiled bytecode
+        co_consts       tuple of constants used in the bytecode
+        co_filename     name of file in which this code object was created
+        co_firstlineno  number of first line in Python source code
+        co_flags        bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
+        co_lnotab       encoded mapping of line numbers to bytecode indices
+        co_name         name with which this code object was defined
+        co_names        tuple of names of local variables
+        co_nlocals      number of local variables
+        co_stacksize    virtual machine stack space required
+        co_varnames     tuple of names of arguments and local variables"""
+    return isinstance(object, types.CodeType)
+
+def isbuiltin(object):
+    """Return true if the object is a built-in function or method.
+
+    Built-in functions and methods provide these attributes:
+        __doc__         documentation string
+        __name__        original name of this function or method
+        __self__        instance to which a method is bound, or None"""
+    return isinstance(object, types.BuiltinFunctionType)
+
+def isroutine(object):
+    """Return true if the object is any kind of function or method."""
+    return (isbuiltin(object)
+            or isfunction(object)
+            or ismethod(object)
+            or ismethoddescriptor(object))
+
+def getmembers(object, predicate=None):
+    """Return all members of an object as (name, value) pairs sorted by name.
+    Optionally, only return members that satisfy a given predicate."""
+    results = []
+    for key in dir(object):
+        value = getattr(object, key)
+        if not predicate or predicate(value):
+            results.append((key, value))
+    results.sort()
+    return results
+
+def classify_class_attrs(cls):
+    """Return list of attribute-descriptor tuples.
+
+    For each name in dir(cls), the return list contains a 4-tuple
+    with these elements:
+
+        0. The name (a string).
+
+        1. The kind of attribute this is, one of these strings:
+               'class method'    created via classmethod()
+               'static method'   created via staticmethod()
+               'property'        created via property()
+               'method'          any other flavor of method
+               'data'            not a method
+
+        2. The class which defined this attribute (a class).
+
+        3. The object as obtained directly from the defining class's
+           __dict__, not via getattr.  This is especially important for
+           data attributes:  C.data is just a data object, but
+           C.__dict__['data'] may be a data descriptor with additional
+           info, like a __doc__ string.
+    """
+
+    mro = getmro(cls)
+    names = dir(cls)
+    result = []
+    for name in names:
+        # Get the object associated with the name.
+        # Getting an obj from the __dict__ sometimes reveals more than
+        # using getattr.  Static and class methods are dramatic examples.
+        if name in cls.__dict__:
+            obj = cls.__dict__[name]
+        else:
+            obj = getattr(cls, name)
+
+        # Figure out where it was defined.
+        homecls = getattr(obj, "__objclass__", None)
+        if homecls is None:
+            # search the dicts.
+            for base in mro:
+                if name in base.__dict__:
+                    homecls = base
+                    break
+
+        # Get the object again, in order to get it from the defining
+        # __dict__ instead of via getattr (if possible).
+        if homecls is not None and name in homecls.__dict__:
+            obj = homecls.__dict__[name]
+
+        # Also get the object via getattr.
+        obj_via_getattr = getattr(cls, name)
+
+        # Classify the object.
+        if isinstance(obj, staticmethod):
+            kind = "static method"
+        elif isinstance(obj, classmethod):
+            kind = "class method"
+        elif isinstance(obj, property):
+            kind = "property"
+        elif (ismethod(obj_via_getattr) or
+              ismethoddescriptor(obj_via_getattr)):
+            kind = "method"
+        else:
+            kind = "data"
+
+        result.append((name, kind, homecls, obj))
+
+    return result
+
+# ----------------------------------------------------------- class helpers
+def _searchbases(cls, accum):
+    # Simulate the "classic class" search order.
+    if cls in accum:
+        return
+    accum.append(cls)
+    for base in cls.__bases__:
+        _searchbases(base, accum)
+
+def getmro(cls):
+    "Return tuple of base classes (including cls) in method resolution order."
+    if hasattr(cls, "__mro__"):
+        return cls.__mro__
+    else:
+        result = []
+        _searchbases(cls, result)
+        return tuple(result)
+
+# -------------------------------------------------- source code extraction
+def indentsize(line):
+    """Return the indent size, in spaces, at the start of a line of text."""
+    expline = string.expandtabs(line)
+    return len(expline) - len(string.lstrip(expline))
+
+def getdoc(object):
+    """Get the documentation string for an object.
+
+    All tabs are expanded to spaces.  To clean up docstrings that are
+    indented to line up with blocks of code, any whitespace than can be
+    uniformly removed from the second line onwards is removed."""
+
+    try:
+        doc = object.__doc__
+    except AttributeError:
+        return None
+    # Jython doesn't like this syntax
+    # if not isinstance(doc, (str, unicode)):
+    # in Jython UnicodeType == StringType
+    if not isinstance(doc, types.StringType):
+        return None
+    try:
+        lines = string.split(string.expandtabs(doc), '\n')
+    except UnicodeError:
+        return None
+    else:
+        margin = None
+        for line in lines[1:]:
+            content = len(string.lstrip(line))
+            if not content: continue
+            indent = len(line) - content
+            if margin is None: margin = indent
+            else: margin = min(margin, indent)
+        if margin is not None:
+            for i in range(1, len(lines)): lines[i] = lines[i][margin:]
+        return string.join(lines, '\n')
+
+def getfile(object):
+    """Work out which source or compiled file an object was defined in."""
+    if ismodule(object):
+        if hasattr(object, '__file__'):
+            return object.__file__
+        raise TypeError, 'arg is a built-in module'
+    if isclass(object):
+        object = sys.modules.get(object.__module__)
+        if hasattr(object, '__file__'):
+            return object.__file__
+        raise TypeError, 'arg is a built-in class'
+    if ismethod(object):
+        object = object.im_func
+    if isfunction(object):
+        object = object.func_code
+    if istraceback(object):
+        object = object.tb_frame
+    if isframe(object):
+        object = object.f_code
+    if iscode(object):
+        return object.co_filename
+    raise TypeError, 'arg is not a module, class, method, ' \
+                     'function, traceback, frame, or code object'
+
+def getmoduleinfo(path):
+    """Get the module name, suffix, mode, and module type for a given file."""
+    filename = os.path.basename(path)
+    suffixes = map(lambda (suffix, mode, mtype):
+                   (-len(suffix), suffix, mode, mtype), imp.get_suffixes())
+    suffixes.sort() # try longest suffixes first, in case they overlap
+    for neglen, suffix, mode, mtype in suffixes:
+        if filename[neglen:] == suffix:
+            return filename[:neglen], suffix, mode, mtype
+
+def getmodulename(path):
+    """Return the module name for a given file, or None."""
+    info = getmoduleinfo(path)
+    if info: return info[0]
+
+def getsourcefile(object):
+    """Return the Python source file an object was defined in, if it exists."""
+    filename = getfile(object)
+    if string.lower(filename[-4:]) in ['.pyc', '.pyo']:
+        filename = filename[:-4] + '.py'
+    for suffix, mode, kind in imp.get_suffixes():
+        if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
+            # Looks like a binary file.  We want to only return a text file.
+            return None
+    if os.path.exists(filename):
+        return filename
+
+def getabsfile(object):
+    """Return an absolute path to the source or compiled file for an object.
+
+    The idea is for each object to have a unique origin, so this routine
+    normalizes the result as much as possible."""
+    return os.path.normcase(
+        os.path.abspath(getsourcefile(object) or getfile(object)))
+
+modulesbyfile = {}
+
+def getmodule(object):
+    """Return the module an object was defined in, or None if not found."""
+    if ismodule(object):
+        return object
+    if isclass(object):
+        return sys.modules.get(object.__module__)
+    try:
+        file = getabsfile(object)
+    except TypeError:
+        return None
+    if modulesbyfile.has_key(file):
+        return sys.modules[modulesbyfile[file]]
+    for module in sys.modules.values():
+        if hasattr(module, '__file__'):
+            modulesbyfile[getabsfile(module)] = module.__name__
+    if modulesbyfile.has_key(file):
+        return sys.modules[modulesbyfile[file]]
+    main = sys.modules['__main__']
+    if hasattr(main, object.__name__):
+        mainobject = getattr(main, object.__name__)
+        if mainobject is object:
+            return main
+    builtin = sys.modules['__builtin__']
+    if hasattr(builtin, object.__name__):
+        builtinobject = getattr(builtin, object.__name__)
+        if builtinobject is object:
+            return builtin
+
+def findsource(object):
+    """Return the entire source file and starting line number for an object.
+
+    The argument may be a module, class, method, function, traceback, frame,
+    or code object.  The source code is returned as a list of all the lines
+    in the file and the line number indexes a line in that list.  An IOError
+    is raised if the source code cannot be retrieved."""
+    try:
+        file = open(getsourcefile(object))
+    except (TypeError, IOError):
+        raise IOError, 'could not get source code'
+    lines = file.readlines()
+    file.close()
+
+    if ismodule(object):
+        return lines, 0
+
+    if isclass(object):
+        name = object.__name__
+        pat = re.compile(r'^\s*class\s*' + name + r'\b')
+        for i in range(len(lines)):
+            if pat.match(lines[i]): return lines, i
+        else: raise IOError, 'could not find class definition'
+
+    if ismethod(object):
+        object = object.im_func
+    if isfunction(object):
+        object = object.func_code
+    if istraceback(object):
+        object = object.tb_frame
+    if isframe(object):
+        object = object.f_code
+    if iscode(object):
+        if not hasattr(object, 'co_firstlineno'):
+            raise IOError, 'could not find function definition'
+        lnum = object.co_firstlineno - 1
+        pat = re.compile(r'^\s*def\s')
+        while lnum > 0:
+            if pat.match(lines[lnum]): break
+            lnum = lnum - 1
+        return lines, lnum
+    raise IOError, 'could not find code object'
+
+def getcomments(object):
+    """Get lines of comments immediately preceding an object's source code."""
+    try: lines, lnum = findsource(object)
+    except IOError: return None
+
+    if ismodule(object):
+        # Look for a comment block at the top of the file.
+        start = 0
+        if lines and lines[0][:2] == '#!': start = 1
+        while start < len(lines) and string.strip(lines[start]) in ['', '#']:
+            start = start + 1
+        if start < len(lines) and lines[start][:1] == '#':
+            comments = []
+            end = start
+            while end < len(lines) and lines[end][:1] == '#':
+                comments.append(string.expandtabs(lines[end]))
+                end = end + 1
+            return string.join(comments, '')
+
+    # Look for a preceding block of comments at the same indentation.
+    elif lnum > 0:
+        indent = indentsize(lines[lnum])
+        end = lnum - 1
+        if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \
+            indentsize(lines[end]) == indent:
+            comments = [string.lstrip(string.expandtabs(lines[end]))]
+            if end > 0:
+                end = end - 1
+                comment = string.lstrip(string.expandtabs(lines[end]))
+                while comment[:1] == '#' and indentsize(lines[end]) == indent:
+                    comments[:0] = [comment]
+                    end = end - 1
+                    if end < 0: break
+                    comment = string.lstrip(string.expandtabs(lines[end]))
+            while comments and string.strip(comments[0]) == '#':
+                comments[:1] = []
+            while comments and string.strip(comments[-1]) == '#':
+                comments[-1:] = []
+            return string.join(comments, '')
+
+class ListReader:
+    """Provide a readline() method to return lines from a list of strings."""
+    def __init__(self, lines):
+        self.lines = lines
+        self.index = 0
+
+    def readline(self):
+        i = self.index
+        if i < len(self.lines):
+            self.index = i + 1
+            return self.lines[i]
+        else: return ''
+
+class EndOfBlock(Exception): pass
+
+class BlockFinder:
+    """Provide a tokeneater() method to detect the end of a code block."""
+    def __init__(self):
+        self.indent = 0
+        self.started = 0
+        self.last = 0
+
+    def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
+        if not self.started:
+            if type == tokenize.NAME: self.started = 1
+        elif type == tokenize.NEWLINE:
+            self.last = srow
+        elif type == tokenize.INDENT:
+            self.indent = self.indent + 1
+        elif type == tokenize.DEDENT:
+            self.indent = self.indent - 1
+            if self.indent == 0: raise EndOfBlock, self.last
+
+def getblock(lines):
+    """Extract the block of code at the top of the given list of lines."""
+    try:
+        tokenize.tokenize(ListReader(lines).readline, BlockFinder().tokeneater)
+    except EndOfBlock, eob:
+        return lines[:eob.args[0]]
+
+def getsourcelines(object):
+    """Return a list of source lines and starting line number for an object.
+
+    The argument may be a module, class, method, function, traceback, frame,
+    or code object.  The source code is returned as a list of the lines
+    corresponding to the object and the line number indicates where in the
+    original source file the first line of code was found.  An IOError is
+    raised if the source code cannot be retrieved."""
+    lines, lnum = findsource(object)
+
+    if ismodule(object): return lines, 0
+    else: return getblock(lines[lnum:]), lnum + 1
+
+def getsource(object):
+    """Return the text of the source code for an object.
+
+    The argument may be a module, class, method, function, traceback, frame,
+    or code object.  The source code is returned as a single string.  An
+    IOError is raised if the source code cannot be retrieved."""
+    lines, lnum = getsourcelines(object)
+    return string.join(lines, '')
+
+# --------------------------------------------------- class tree extraction
+def walktree(classes, children, parent):
+    """Recursive helper function for getclasstree()."""
+    results = []
+    classes.sort(lambda a, b: cmp(a.__name__, b.__name__))
+    for c in classes:
+        results.append((c, c.__bases__))
+        if children.has_key(c):
+            results.append(walktree(children[c], children, c))
+    return results
+
+def getclasstree(classes, unique=0):
+    """Arrange the given list of classes into a hierarchy of nested lists.
+
+    Where a nested list appears, it contains classes derived from the class
+    whose entry immediately precedes the list.  Each entry is a 2-tuple
+    containing a class and a tuple of its base classes.  If the 'unique'
+    argument is true, exactly one entry appears in the returned structure
+    for each class in the given list.  Otherwise, classes using multiple
+    inheritance and their descendants will appear multiple times."""
+    children = {}
+    roots = []
+    for c in classes:
+        if c.__bases__:
+            for parent in c.__bases__:
+                if not children.has_key(parent):
+                    children[parent] = []
+                children[parent].append(c)
+                if unique and parent in classes: break
+        elif c not in roots:
+            roots.append(c)
+    for parent in children.keys():
+        if parent not in classes:
+            roots.append(parent)
+    return walktree(roots, children, None)
+
+# ------------------------------------------------ argument list extraction
+# These constants are from Python's compile.h.
+CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8
+
+def getargs(co):
+    """Get information about the arguments accepted by a code object.
+
+    Three things are returned: (args, varargs, varkw), where 'args' is
+    a list of argument names (possibly containing nested lists), and
+    'varargs' and 'varkw' are the names of the * and ** arguments or None."""
+
+    if not iscode(co): raise TypeError, 'arg is not a code object'
+
+##     #jython doesn't have co_code
+##     code = co.co_code
+    nargs = co.co_argcount
+    names = co.co_varnames
+    args = list(names[:nargs])
+    step = 0
+
+## We don't have co_code, so skip this for now
+##    
+##     # The following acrobatics are for anonymous (tuple) arguments.
+##     for i in range(nargs):
+##         if args[i][:1] in ['', '.']:
+##             stack, remain, count = [], [], []
+##             while step < len(code):
+##                 op = ord(code[step])
+##                 step = step + 1
+##                 if op >= dis.HAVE_ARGUMENT:
+##                     opname = dis.opname[op]
+##                     value = ord(code[step]) + ord(code[step+1])*256
+##                     step = step + 2
+##                     if opname in ['UNPACK_TUPLE', 'UNPACK_SEQUENCE']:
+##                         remain.append(value)
+##                         count.append(value)
+##                     elif opname == 'STORE_FAST':
+##                         stack.append(names[value])
+##                         remain[-1] = remain[-1] - 1
+##                         while remain[-1] == 0:
+##                             remain.pop()
+##                             size = count.pop()
+##                             stack[-size:] = [stack[-size:]]
+##                             if not remain: break
+##                             remain[-1] = remain[-1] - 1
+##                         if not remain: break
+##             args[i] = stack[0]
+
+    varargs = None
+    if co.co_flags & CO_VARARGS:
+        varargs = co.co_varnames[nargs]
+        nargs = nargs + 1
+    varkw = None
+    if co.co_flags & CO_VARKEYWORDS:
+        varkw = co.co_varnames[nargs]
+    return args, varargs, varkw
+
+def getargspec(func):
+    """Get the names and default values of a function's arguments.
+
+    A tuple of four things is returned: (args, varargs, varkw, defaults).
+    'args' is a list of the argument names (it may contain nested lists).
+    'varargs' and 'varkw' are the names of the * and ** arguments or None.
+    'defaults' is an n-tuple of the default values of the last n arguments."""
+    if not isfunction(func): raise TypeError, 'arg is not a Python function'
+    args, varargs, varkw = getargs(func.func_code)
+    return args, varargs, varkw, func.func_defaults
+
+def getargvalues(frame):
+    """Get information about arguments passed into a particular frame.
+
+    A tuple of four things is returned: (args, varargs, varkw, locals).
+    'args' is a list of the argument names (it may contain nested lists).
+    'varargs' and 'varkw' are the names of the * and ** arguments or None.
+    'locals' is the locals dictionary of the given frame."""
+    args, varargs, varkw = getargs(frame.f_code)
+    return args, varargs, varkw, frame.f_locals
+
+def joinseq(seq):
+    if len(seq) == 1:
+        return '(' + seq[0] + ',)'
+    else:
+        return '(' + string.join(seq, ', ') + ')'
+
+def strseq(object, convert, join=joinseq):
+    """Recursively walk a sequence, stringifying each element."""
+    if type(object) in [types.ListType, types.TupleType]:
+        return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
+    else:
+        return convert(object)
+
+def formatargspec(args, varargs=None, varkw=None, defaults=None,
+                  formatarg=str,
+                  formatvarargs=lambda name: '*' + name,
+                  formatvarkw=lambda name: '**' + name,
+                  formatvalue=lambda value: '=' + repr(value),
+                  join=joinseq):
+    """Format an argument spec from the 4 values returned by getargspec.
+
+    The first four arguments are (args, varargs, varkw, defaults).  The
+    other four arguments are the corresponding optional formatting functions
+    that are called to turn names and values into strings.  The ninth
+    argument is an optional function to format the sequence of arguments."""
+    specs = []
+    if defaults:
+        firstdefault = len(args) - len(defaults)
+    for i in range(len(args)):
+        spec = strseq(args[i], formatarg, join)
+        if defaults and i >= firstdefault:
+            spec = spec + formatvalue(defaults[i - firstdefault])
+        specs.append(spec)
+    if varargs:
+        specs.append(formatvarargs(varargs))
+    if varkw:
+        specs.append(formatvarkw(varkw))
+    return '(' + string.join(specs, ', ') + ')'
+
+def formatargvalues(args, varargs, varkw, locals,
+                    formatarg=str,
+                    formatvarargs=lambda name: '*' + name,
+                    formatvarkw=lambda name: '**' + name,
+                    formatvalue=lambda value: '=' + repr(value),
+                    join=joinseq):
+    """Format an argument spec from the 4 values returned by getargvalues.
+
+    The first four arguments are (args, varargs, varkw, locals).  The
+    next four arguments are the corresponding optional formatting functions
+    that are called to turn names and values into strings.  The ninth
+    argument is an optional function to format the sequence of arguments."""
+    def convert(name, locals=locals,
+                formatarg=formatarg, formatvalue=formatvalue):
+        return formatarg(name) + formatvalue(locals[name])
+    specs = []
+    for i in range(len(args)):
+        specs.append(strseq(args[i], convert, join))
+    if varargs:
+        specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
+    if varkw:
+        specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
+    return '(' + string.join(specs, ', ') + ')'
+
+# -------------------------------------------------- stack frame extraction
+def getframeinfo(frame, context=1):
+    """Get information about a frame or traceback object.
+
+    A tuple of five things is returned: the filename, the line number of
+    the current line, the function name, a list of lines of context from
+    the source code, and the index of the current line within that list.
+    The optional second argument specifies the number of lines of context
+    to return, which are centered around the current line."""
+    if istraceback(frame):
+        frame = frame.tb_frame
+    if not isframe(frame):
+        raise TypeError, 'arg is not a frame or traceback object'
+
+    filename = getsourcefile(frame)
+    lineno = getlineno(frame)
+    if context > 0:
+##         # Jython 2.1 can't handle //
+##         start = lineno - 1 - context//2
+        start = lineno - 1 - context/2
+        try:
+            lines, lnum = findsource(frame)
+        except IOError:
+            lines = index = None
+        else:
+            start = max(start, 1)
+            start = min(start, len(lines) - context)
+            lines = lines[start:start+context]
+            index = lineno - 1 - start
+    else:
+        lines = index = None
+
+    return (filename, lineno, frame.f_code.co_name, lines, index)
+
+def getlineno(frame):
+    """Get the line number from a frame object, allowing for optimization."""
+    # Written by Marc-Andre Lemburg; revised by Jim Hugunin and Fredrik Lundh.
+    lineno = frame.f_lineno
+    code = frame.f_code
+    if hasattr(code, 'co_lnotab'):
+        table = code.co_lnotab
+        lineno = code.co_firstlineno
+        addr = 0
+        for i in range(0, len(table), 2):
+            addr = addr + ord(table[i])
+            if addr > frame.f_lasti: break
+            lineno = lineno + ord(table[i+1])
+    return lineno
+
+def getouterframes(frame, context=1):
+    """Get a list of records for a frame and all higher (calling) frames.
+
+    Each record contains a frame object, filename, line number, function
+    name, a list of lines of context, and index within the context."""
+    framelist = []
+    while frame:
+        framelist.append((frame,) + getframeinfo(frame, context))
+        frame = frame.f_back
+    return framelist
+
+def getinnerframes(tb, context=1):
+    """Get a list of records for a traceback's frame and all lower frames.
+
+    Each record contains a frame object, filename, line number, function
+    name, a list of lines of context, and index within the context."""
+    framelist = []
+    while tb:
+        framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
+        tb = tb.tb_next
+    return framelist
+
+def currentframe():
+    """Return the frame object for the caller's stack frame."""
+    try:
+        raise 'catch me'
+    except:
+        return sys.exc_traceback.tb_frame.f_back
+
+if hasattr(sys, '_getframe'): currentframe = sys._getframe
+
+def stack(context=1):
+    """Return a list of records for the stack above the caller's frame."""
+    return getouterframes(currentframe().f_back, context)
+
+def trace(context=1):
+    """Return a list of records for the stack below the current exception."""
+    return getinnerframes(sys.exc_traceback, context)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/runConsole.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/runConsole.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/runConsole.py	(revision 1126)
@@ -0,0 +1,2 @@
+from console import main
+main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/introspect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/introspect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/introspect.py	(revision 1126)
@@ -0,0 +1,387 @@
+"""Provides a variety of introspective-type support functions for
+things like call tips and command auto completion.
+
+NOTE: this file is a modification of Patrick O'Brien's version 1.62
+"""
+
+#from __future__ import nested_scopes
+
+__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
+__cvsid__ = "$Id: introspect.py 5910 2006-06-20 10:03:31Z jmvivo $"
+__revision__ = "$Revision: 5910 $"[11:-2]
+
+
+import cStringIO
+import inspect
+import sys
+import tokenize
+import types
+
+try:
+    True
+except NameError:
+    True = 1==1
+    False = 1==0
+
+def getAutoCompleteList(command='', locals=None, includeMagic=1, 
+                        includeSingle=1, includeDouble=1):
+    """Return list of auto-completion options for command.
+    
+    The list of options will be based on the locals namespace."""
+    attributes = []
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='.')
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        pass
+    else:
+        attributes = getAttributeNames(object, includeMagic, 
+                                       includeSingle, includeDouble)
+    return attributes
+    
+def getAttributeNames(object, includeMagic=1, includeSingle=1,
+                      includeDouble=1):
+    """Return list of unique attributes, including inherited, for object."""
+    attributes = []
+    dict = {}
+    if not hasattrAlwaysReturnsTrue(object):
+        # Add some attributes that don't always get picked up.  If
+        # they don't apply, they'll get filtered out at the end.
+        attributes += ['__bases__', '__class__', '__dict__', '__name__', 
+                       'func_closure', 'func_code', 'func_defaults', 
+                       'func_dict', 'func_doc', 'func_globals', 'func_name']
+    if includeMagic:
+        try: attributes += object._getAttributeNames()
+        except: pass
+    # Get all attribute names.
+    attrdict = getAllAttributeNames(object)
+    for attrlist in attrdict.values():
+        attributes += attrlist
+    # Remove duplicates from the attribute list.
+    for item in attributes:
+        dict[item] = None
+    attributes = dict.keys()
+    attributes.sort(lambda x, y: cmp(x.upper(), y.upper()))
+    if not includeSingle:
+        attributes = filter(lambda item: item[0]!='_' \
+                            or item[1]=='_', attributes)
+    if not includeDouble:
+        attributes = filter(lambda item: item[:2]!='__', attributes)
+    # Make sure we haven't picked up any bogus attributes somehow.
+    attributes = [attribute for attribute in attributes \
+                  if hasattr(object, attribute)]
+    return attributes
+
+def hasattrAlwaysReturnsTrue(object):
+    return hasattr(object, 'bogu5_123_aTTri8ute')
+
+def getAllAttributeNames(object):
+    """Return dict of all attributes, including inherited, for an object.
+    
+    Recursively walk through a class and all base classes.
+    """
+    #print "getAllAttributeNames  1",repr(object), repr(str(object))
+    attrdict = {}  # (object, technique, count): [list of attributes]
+    # !!!
+    # Do Not use hasattr() as a test anywhere in this function,
+    # because it is unreliable with remote objects: xmlrpc, soap, etc.
+    # They always return true for hasattr().
+    # !!!
+    #print "getAllAttributeNames  2"
+    try:
+        # Yes, this can fail if object is an instance of a class with
+        # __str__ (or __repr__) having a bug or raising an
+        # exception. :-(
+        key = str(object)
+    except:
+        key = 'anonymous'
+    # Wake up sleepy objects - a hack for ZODB objects in "ghost" state.
+    #print "getAllAttributeNames  3"
+    wakeupcall = dir(object)
+    #print "getAllAttributeNames  4"
+    del wakeupcall
+    # Get attributes available through the normal convention.
+    #print "getAllAttributeNames  5"
+    attributes = dir(object)
+    attrdict[(key, 'dir', len(attributes))] = attributes
+    #print "getAllAttributeNames  6"
+    # Get attributes from the object's dictionary, if it has one.
+    try:
+        attributes = object.__dict__.keys()
+        attributes.sort()
+    except:  # Must catch all because object might have __getattr__.
+        pass
+    else:
+        attrdict[(key, '__dict__', len(attributes))] = attributes
+    # For a class instance, get the attributes for the class.
+    #print "getAllAttributeNames  7"
+    try:
+        klass = object.__class__
+    except:  # Must catch all because object might have __getattr__.
+        pass
+    else:
+        if klass is object or klass is type:
+            # Break a circular reference. This happens with extension
+            # classes.
+            pass
+        else:
+            attrdict.update(getAllAttributeNames(klass))
+    #print "getAllAttributeNames  8"
+    # Also get attributes from any and all parent classes.
+    try:
+        bases = object.__bases__
+    except:  # Must catch all because object might have __getattr__.
+        pass
+    else:
+        if isinstance(bases, types.TupleType):
+            for base in bases:
+                if type(base) is types.TypeType:
+                    # Break a circular reference. Happens in Python 2.2.
+                    pass
+                else:
+                    attrdict.update(getAllAttributeNames(base))
+    #print "getAllAttributeNames  attrdict=",repr(attrdict)
+    return attrdict
+
+def getCallTip(command='', locals=None):
+    """For a command, return a tuple of object name, argspec, tip text.
+    
+    The call tip information will be based on the locals namespace."""
+    calltip = ('', '', '')  # object name, argspec, tip text.
+    # Get the proper chunk of code from the command.
+    root = getRoot(command, terminator='(')
+    try:
+        if locals is not None:
+            object = eval(root, locals)
+        else:
+            object = eval(root)
+    except:
+        return calltip
+    name = ''
+    object, dropSelf = getBaseObject(object)
+    try:
+        name = object.__name__
+    except AttributeError:
+        pass
+    tip1 = ''
+    argspec = ''
+    if inspect.isbuiltin(object):
+        # Builtin functions don't have an argspec that we can get.
+        pass
+    elif inspect.isfunction(object):
+        # tip1 is a string like: "getCallTip(command='', locals=None)"
+        argspec = apply(inspect.formatargspec, inspect.getargspec(object))
+        if dropSelf:
+            # The first parameter to a method is a reference to an
+            # instance, usually coded as "self", and is usually passed
+            # automatically by Python; therefore we want to drop it.
+            temp = argspec.split(',')
+            if len(temp) == 1:  # No other arguments.
+                argspec = '()'
+            else:  # Drop the first argument.
+                argspec = '(' + ','.join(temp[1:]).lstrip()
+        tip1 = name + argspec
+    doc = ''
+    if callable(object):
+        doc = inspect.getdoc(object)
+    if doc:
+        # tip2 is the first separated line of the docstring, like:
+        # "Return call tip text for a command."
+        # tip3 is the rest of the docstring, like:
+        # "The call tip information will be based on ... <snip>
+        firstline = doc.split('\n')[0].lstrip()
+        if tip1 == firstline:
+            tip1 = ''
+        else:
+            tip1 += '\n\n'
+        docpieces = doc.split('\n\n')
+        tip2 = docpieces[0]
+        tip3 = '\n\n'.join(docpieces[1:])
+        tip = '%s%s\n\n%s' % (tip1, tip2, tip3)
+    else:
+        tip = tip1
+    calltip = (name, argspec[1:-1], tip.strip())
+    return calltip
+
+def getRoot(command, terminator=None):
+    """Return the rightmost root portion of an arbitrary Python command.
+    
+    Return only the root portion that can be eval()'d without side
+    effects.  The command would normally terminate with a '(' or
+    '.'. The terminator and anything after the terminator will be
+    dropped."""
+    command = command.split('\n')[-1]
+    if command.startswith(sys.ps2):
+        command = command[len(sys.ps2):]
+    command = command.lstrip()
+    command = rtrimTerminus(command, terminator)
+    tokens = getTokens(command)
+    if not tokens:
+        return ''
+    if tokens[-1][0] is tokenize.ENDMARKER:
+        # Remove the end marker.
+        del tokens[-1]
+    if not tokens:
+        return ''
+    if terminator == '.' and \
+           (tokens[-1][1] <> '.' or tokens[-1][0] is not tokenize.OP):
+        # Trap decimals in numbers, versus the dot operator.
+        return ''
+    else:
+        # Strip off the terminator.
+        if terminator and command.endswith(terminator):
+            size = 0 - len(terminator)
+            command = command[:size]
+    command = command.rstrip()
+    tokens = getTokens(command)
+    tokens.reverse()
+    line = ''
+    start = None
+    prefix = ''
+    laststring = '.'
+    emptyTypes = ('[]', '()', '{}')
+    for token in tokens:
+        tokentype = token[0]
+        tokenstring = token[1]
+        line = token[4]
+        if tokentype is tokenize.ENDMARKER:
+            continue
+        if tokentype in (tokenize.NAME, tokenize.STRING, tokenize.NUMBER) \
+        and laststring != '.':
+            # We've reached something that's not part of the root.
+            if prefix and line[token[3][1]] != ' ':
+                # If it doesn't have a space after it, remove the prefix.
+                prefix = ''
+            break
+        if tokentype in (tokenize.NAME, tokenize.STRING, tokenize.NUMBER) \
+        or (tokentype is tokenize.OP and tokenstring == '.'):
+            if prefix:
+                # The prefix isn't valid because it comes after a dot.
+                prefix = ''
+                break
+            else:
+                # start represents the last known good point in the line.
+                start = token[2][1]
+        elif len(tokenstring) == 1 and tokenstring in ('[({])}'):
+            # Remember, we're working backwords.
+            # So prefix += tokenstring would be wrong.
+            if prefix in emptyTypes and tokenstring in ('[({'):
+                # We've already got an empty type identified so now we
+                # are in a nested situation and we can break out with
+                # what we've got.
+                break
+            else:
+                prefix = tokenstring + prefix
+        else:
+            # We've reached something that's not part of the root.
+            break
+        laststring = tokenstring
+    if start is None:
+        start = len(line)
+    root = line[start:]
+    if prefix in emptyTypes:
+        # Empty types are safe to be eval()'d and introspected.
+        root = prefix + root
+    return root    
+
+class _EaterTokens:
+  def __init__(self,tokens):
+    self.tokens = tokens
+
+  def __call__(self,*args):
+    self.tokens.append(args)
+
+def getTokens(command):
+    """Return list of token tuples for command."""
+    command = str(command)  # In case the command is unicode, which fails.
+    f = cStringIO.StringIO(command)
+    # tokens is a list of token tuples, each looking like: 
+    # (type, string, (srow, scol), (erow, ecol), line)
+    tokens = []
+    # Can't use list comprehension:
+    #   tokens = [token for token in tokenize.generate_tokens(f.readline)]
+    # because of need to append as much as possible before TokenError.
+    try:
+##        This code wasn't backward compatible with Python 2.1.3.
+##
+##        for token in tokenize.generate_tokens(f.readline):
+##            tokens.append(token)
+        # This works with Python 2.1.3 (with nested_scopes).
+##        def eater(*args):
+##            tokens.append(args)
+##        tokenize.tokenize_loop(f.readline, eater)
+        eater = _EaterTokens(tokens) #Con una lambda no se lo come 
+        tokenize.tokenize_loop(f.readline, eater)
+    except tokenize.TokenError:
+        # This is due to a premature EOF, which we expect since we are
+        # feeding in fragments of Python code.
+        pass
+    return tokens    
+
+def rtrimTerminus(command, terminator=None):
+    """Return command minus anything that follows the final terminator."""
+    if terminator:
+        pieces = command.split(terminator)
+        if len(pieces) > 1:
+            command = terminator.join(pieces[:-1]) + terminator
+    return command
+
+def getBaseObject(object):
+    """Return base object and dropSelf indicator for an object."""
+    if inspect.isbuiltin(object):
+        # Builtin functions don't have an argspec that we can get.
+        dropSelf = 0
+    elif inspect.ismethod(object):
+        # Get the function from the object otherwise
+        # inspect.getargspec() complains that the object isn't a
+        # Python function.
+        try:
+            if object.im_self is None:
+                # This is an unbound method so we do not drop self
+                # from the argspec, since an instance must be passed
+                # as the first arg.
+                dropSelf = 0
+            else:
+                dropSelf = 1
+            object = object.im_func
+        except AttributeError:
+            dropSelf = 0
+    elif inspect.isclass(object):
+        # Get the __init__ method function for the class.
+        constructor = getConstructor(object)
+        if constructor is not None:
+            object = constructor
+            dropSelf = 1
+        else:
+            dropSelf = 0
+    elif callable(object):
+        # Get the __call__ method instead.
+        try:
+            call_method = object.__call__.im_func
+            if call_method.__name__ == '__call__':
+                # unbound jython method end up here, example: string.index(
+                dropSelf = 0
+            else:
+                object = call_method
+                dropSelf = 1
+        except AttributeError:
+            # unbound python methods end up here
+            dropSelf = 0
+    else:
+        dropSelf = 0
+    return object, dropSelf
+
+def getConstructor(object):
+    """Return constructor for class object, or None if there isn't one."""
+    try:
+        return object.__init__.im_func
+    except AttributeError:
+        for base in object.__bases__:
+            constructor = getConstructor(base)
+            if constructor is not None:
+                return constructor
+    return None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/problems.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/problems.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/console/problems.txt	(revision 1126)
@@ -0,0 +1,23 @@
+==========================
+Known problems
+==========================
+
+You must use the keyboard not the mouse to select methods.  (Due to focus problems.)
+
+python.security.respectJavaAccessibility must be set to true in Jython's registry
+
+You can't insert '(' and ')' in the middle of a line
+
+Method popup displays names multiple times for overloaded methods
+
+Method popup gets abandoned with too many backspaces.  (Use <ESC> to make it go away)
+
+Builtin types don't work, like they do in PyCrust.  This is because they have a null __doc__ string in Jython.
+
+Static methods and properties don't seem to work correctly.
+
+<CTRL>+D (or <CRTL>+Z) to exit is not implemented
+
+History doesn't quite work correctly
+
+$Id: problems.txt 5782 2006-06-12 07:56:49Z jmvivo $
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_gi.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_gi.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_gi.py	(revision 1126)
@@ -0,0 +1,195 @@
+"""Astroid hooks for the Python 2 GObject introspection bindings.
+
+Helps with understanding everything imported from 'gi.repository'
+"""
+
+import inspect
+import itertools
+import sys
+import re
+import warnings
+
+from astroid import MANAGER, AstroidBuildingException, nodes
+from astroid.builder import AstroidBuilder
+
+
+_inspected_modules = {}
+
+_identifier_re = r'^[A-Za-z_]\w*$'
+
+def _gi_build_stub(parent):
+    """
+    Inspect the passed module recursively and build stubs for functions,
+    classes, etc.
+    """
+    classes = {}
+    functions = {}
+    constants = {}
+    methods = {}
+    for name in dir(parent):
+        if name.startswith("__"):
+            continue
+
+        # Check if this is a valid name in python
+        if not re.match(_identifier_re, name):
+            continue
+
+        try:
+            obj = getattr(parent, name)
+        except:
+            continue
+
+        if inspect.isclass(obj):
+            classes[name] = obj
+        elif (inspect.isfunction(obj) or
+              inspect.isbuiltin(obj)):
+            functions[name] = obj
+        elif (inspect.ismethod(obj) or
+              inspect.ismethoddescriptor(obj)):
+            methods[name] = obj
+        elif (str(obj).startswith("<flags") or
+              str(obj).startswith("<enum ") or
+              str(obj).startswith("<GType ") or
+              inspect.isdatadescriptor(obj)):
+            constants[name] = 0
+        elif isinstance(obj, (int, str)):
+            constants[name] = obj
+        elif callable(obj):
+            # Fall back to a function for anything callable
+            functions[name] = obj
+        else:
+            # Assume everything else is some manner of constant
+            constants[name] = 0
+
+    ret = ""
+
+    if constants:
+        ret += "# %s contants\n\n" % parent.__name__
+    for name in sorted(constants):
+        if name[0].isdigit():
+            # GDK has some busted constant names like
+            # Gdk.EventType.2BUTTON_PRESS
+            continue
+
+        val = constants[name]
+
+        strval = str(val)
+        if isinstance(val, str):
+            strval = '"%s"' % str(val).replace("\\", "\\\\")
+        ret += "%s = %s\n" % (name, strval)
+
+    if ret:
+        ret += "\n\n"
+    if functions:
+        ret += "# %s functions\n\n" % parent.__name__
+    for name in sorted(functions):
+        ret += "def %s(*args, **kwargs):\n" % name
+        ret += "    pass\n"
+
+    if ret:
+        ret += "\n\n"
+    if methods:
+        ret += "# %s methods\n\n" % parent.__name__
+    for name in sorted(methods):
+        ret += "def %s(self, *args, **kwargs):\n" % name
+        ret += "    pass\n"
+
+    if ret:
+        ret += "\n\n"
+    if classes:
+        ret += "# %s classes\n\n" % parent.__name__
+    for name in sorted(classes):
+        ret += "class %s(object):\n" % name
+
+        classret = _gi_build_stub(classes[name])
+        if not classret:
+            classret = "pass\n"
+
+        for line in classret.splitlines():
+            ret += "    " + line + "\n"
+        ret += "\n"
+
+    return ret
+
+def _import_gi_module(modname):
+    # we only consider gi.repository submodules
+    if not modname.startswith('gi.repository.'):
+        raise AstroidBuildingException()
+    # build astroid representation unless we already tried so
+    if modname not in _inspected_modules:
+        modnames = [modname]
+        optional_modnames = []
+
+        # GLib and GObject may have some special case handling
+        # in pygobject that we need to cope with. However at
+        # least as of pygobject3-3.13.91 the _glib module doesn't
+        # exist anymore, so if treat these modules as optional.
+        if modname == 'gi.repository.GLib':
+            optional_modnames.append('gi._glib')
+        elif modname == 'gi.repository.GObject':
+            optional_modnames.append('gi._gobject')
+
+        try:
+            modcode = ''
+            for m in itertools.chain(modnames, optional_modnames):
+                try:
+                    __import__(m)
+                    with warnings.catch_warnings():
+                        # Just inspecting the code can raise gi deprecation
+                        # warnings, so ignore them.
+                        try:
+                            from gi import PyGIDeprecationWarning
+                            warnings.simplefilter("ignore", PyGIDeprecationWarning)
+                        except Exception:
+                            pass
+
+                        modcode += _gi_build_stub(sys.modules[m])
+                except ImportError:
+                    if m not in optional_modnames:
+                        raise
+        except ImportError:
+            astng = _inspected_modules[modname] = None
+        else:
+            astng = AstroidBuilder(MANAGER).string_build(modcode, modname)
+            _inspected_modules[modname] = astng
+    else:
+        astng = _inspected_modules[modname]
+    if astng is None:
+        raise AstroidBuildingException('Failed to import module %r' % modname)
+    return astng
+
+def _looks_like_require_version(node):
+    # Return whether this looks like a call to gi.require_version(<name>, <version>)
+    # Only accept function calls with two constant arguments
+    if len(node.args) != 2:
+        return False
+
+    if not all(isinstance(arg, nodes.Const) for arg in node.args):
+        return False
+
+    func = node.func
+    if isinstance(func, nodes.Attribute):
+        if func.attrname != 'require_version':
+            return False
+        if isinstance(func.expr, nodes.Name) and func.expr.name == 'gi':
+            return True
+
+        return False
+
+    if isinstance(func, nodes.Name):
+        return func.name == 'require_version'
+
+    return False
+
+def _register_require_version(node):
+    # Load the gi.require_version locally
+    try:
+        import gi
+        gi.require_version(node.args[0].value, node.args[1].value)
+    except Exception:
+        pass
+
+    return node
+
+MANAGER.register_failed_import_hook(_import_gi_module)
+MANAGER.register_transform(nodes.Call, _register_require_version, _looks_like_require_version)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_stdlib.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_stdlib.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_stdlib.py	(revision 1126)
@@ -0,0 +1,460 @@
+
+"""Astroid hooks for the Python 2 standard library.
+
+Currently help understanding of :
+
+* hashlib.md5 and hashlib.sha1
+"""
+
+import functools
+import sys
+from textwrap import dedent
+
+from astroid import (
+    MANAGER, UseInferenceDefault, inference_tip, BoundMethod,
+    InferenceError, register_module_extender)
+from astroid import exceptions
+from astroid import nodes
+from astroid.builder import AstroidBuilder
+from astroid import util
+
+PY3K = sys.version_info > (3, 0)
+PY33 = sys.version_info >= (3, 3)
+PY34 = sys.version_info >= (3, 4)
+
+# general function
+
+def infer_func_form(node, base_type, context=None, enum=False):
+    """Specific inference function for namedtuple or Python 3 enum. """
+    def infer_first(node):
+        if node is util.YES:
+            raise UseInferenceDefault
+        try:            
+            value = next(node.infer(context=context))
+            if value is util.YES:
+                raise UseInferenceDefault()
+            else:
+                return value
+        except StopIteration:
+            raise InferenceError()
+
+    # node is a Call node, class name as first argument and generated class
+    # attributes as second argument
+    if len(node.args) != 2:
+        # something weird here, go back to class implementation
+        raise UseInferenceDefault()
+    # namedtuple or enums list of attributes can be a list of strings or a
+    # whitespace-separate string
+    try:
+        name = infer_first(node.args[0]).value
+        names = infer_first(node.args[1])
+        try:
+            attributes = names.value.replace(',', ' ').split()
+        except AttributeError:
+            if not enum:
+                attributes = [infer_first(const).value for const in names.elts]
+            else:
+                # Enums supports either iterator of (name, value) pairs
+                # or mappings.
+                # TODO: support only list, tuples and mappings.
+                if hasattr(names, 'items') and isinstance(names.items, list):
+                    attributes = [infer_first(const[0]).value
+                                  for const in names.items
+                                  if isinstance(const[0], nodes.Const)]
+                elif hasattr(names, 'elts'):
+                    # Enums can support either ["a", "b", "c"]
+                    # or [("a", 1), ("b", 2), ...], but they can't
+                    # be mixed.
+                    if all(isinstance(const, nodes.Tuple)
+                           for const in names.elts):
+                        attributes = [infer_first(const.elts[0]).value
+                                      for const in names.elts
+                                      if isinstance(const, nodes.Tuple)]
+                    else:
+                        attributes = [infer_first(const).value
+                                      for const in names.elts]
+                else:
+                    raise AttributeError
+                if not attributes:
+                    raise AttributeError
+    except (AttributeError, exceptions.InferenceError):
+        raise UseInferenceDefault()
+    # we want to return a Class node instance with proper attributes set
+    class_node = nodes.ClassDef(name, 'docstring')
+    class_node.parent = node.parent
+    # set base class=tuple
+    class_node.bases.append(base_type)
+    # XXX add __init__(*attributes) method
+    for attr in attributes:
+        fake_node = nodes.EmptyNode()
+        fake_node.parent = class_node
+        fake_node.attrname = attr
+        class_node._instance_attrs[attr] = [fake_node]
+    return class_node, name, attributes
+
+
+# module specific transformation functions #####################################
+
+def hashlib_transform():
+    template = '''
+
+class %(name)s(object):
+  def __init__(self, value=''): pass
+  def digest(self):
+    return %(digest)s
+  def copy(self):
+    return self
+  def update(self, value): pass
+  def hexdigest(self):
+    return ''
+  @property
+  def name(self):
+    return %(name)r
+  @property
+  def block_size(self):
+    return 1
+  @property
+  def digest_size(self):
+    return 1
+'''
+    algorithms = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
+    classes = "".join(
+        template % {'name': hashfunc, 'digest': 'b""' if PY3K else '""'}
+        for hashfunc in algorithms)
+    return AstroidBuilder(MANAGER).string_build(classes)
+
+
+def collections_transform():
+    return AstroidBuilder(MANAGER).string_build('''
+
+class defaultdict(dict):
+    default_factory = None
+    def __missing__(self, key): pass
+
+class deque(object):
+    maxlen = 0
+    def __init__(self, iterable=None, maxlen=None):
+        self.iterable = iterable
+    def append(self, x): pass
+    def appendleft(self, x): pass
+    def clear(self): pass
+    def count(self, x): return 0
+    def extend(self, iterable): pass
+    def extendleft(self, iterable): pass
+    def pop(self): pass
+    def popleft(self): pass
+    def remove(self, value): pass
+    def reverse(self): pass
+    def rotate(self, n): pass
+    def __iter__(self): return self
+    def __reversed__(self): return self.iterable[::-1]
+    def __getitem__(self, index): pass
+    def __setitem__(self, index, value): pass
+    def __delitem__(self, index): pass
+''')
+
+
+def pkg_resources_transform():
+    return AstroidBuilder(MANAGER).string_build('''
+def require(*requirements):
+    return pkg_resources.working_set.require(*requirements)
+
+def run_script(requires, script_name):
+    return pkg_resources.working_set.run_script(requires, script_name)
+
+def iter_entry_points(group, name=None):
+    return pkg_resources.working_set.iter_entry_points(group, name)
+
+def resource_exists(package_or_requirement, resource_name):
+    return get_provider(package_or_requirement).has_resource(resource_name)
+
+def resource_isdir(package_or_requirement, resource_name):
+    return get_provider(package_or_requirement).resource_isdir(
+        resource_name)
+
+def resource_filename(package_or_requirement, resource_name):
+    return get_provider(package_or_requirement).get_resource_filename(
+        self, resource_name)
+
+def resource_stream(package_or_requirement, resource_name):
+    return get_provider(package_or_requirement).get_resource_stream(
+        self, resource_name)
+
+def resource_string(package_or_requirement, resource_name):
+    return get_provider(package_or_requirement).get_resource_string(
+        self, resource_name)
+
+def resource_listdir(package_or_requirement, resource_name):
+    return get_provider(package_or_requirement).resource_listdir(
+        resource_name)
+
+def extraction_error():
+    pass
+
+def get_cache_path(archive_name, names=()):
+    extract_path = self.extraction_path or get_default_cache()
+    target_path = os.path.join(extract_path, archive_name+'-tmp', *names)
+    return target_path
+
+def postprocess(tempname, filename):
+    pass
+
+def set_extraction_path(path):
+    pass
+
+def cleanup_resources(force=False):
+    pass
+
+''')
+
+
+def subprocess_transform():
+    if PY3K:
+        communicate = (bytes('string', 'ascii'), bytes('string', 'ascii'))
+        communicate_signature = 'def communicate(self, input=None, timeout=None)'
+        init = """
+        def __init__(self, args, bufsize=0, executable=None,
+                     stdin=None, stdout=None, stderr=None,
+                     preexec_fn=None, close_fds=False, shell=False,
+                     cwd=None, env=None, universal_newlines=False,
+                     startupinfo=None, creationflags=0, restore_signals=True,
+                     start_new_session=False, pass_fds=()):
+            pass
+        """
+    else:
+        communicate = ('string', 'string')
+        communicate_signature = 'def communicate(self, input=None)'
+        init = """
+        def __init__(self, args, bufsize=0, executable=None,
+                     stdin=None, stdout=None, stderr=None,
+                     preexec_fn=None, close_fds=False, shell=False,
+                     cwd=None, env=None, universal_newlines=False,
+                     startupinfo=None, creationflags=0):
+            pass
+        """
+    if PY33:
+        wait_signature = 'def wait(self, timeout=None)'
+    else:
+        wait_signature = 'def wait(self)'
+    if PY3K:
+        ctx_manager = '''
+        def __enter__(self): return self
+        def __exit__(self, *args): pass
+        '''
+    else:
+        ctx_manager = ''
+    code = dedent('''
+
+    class Popen(object):
+        returncode = pid = 0
+        stdin = stdout = stderr = file()
+
+        %(init)s
+
+        %(communicate_signature)s:
+            return %(communicate)r
+        %(wait_signature)s:
+            return self.returncode
+        def poll(self):
+            return self.returncode
+        def send_signal(self, signal):
+            pass
+        def terminate(self):
+            pass
+        def kill(self):
+            pass
+        %(ctx_manager)s
+       ''' % {'init': init,
+              'communicate': communicate,
+              'communicate_signature': communicate_signature,
+              'wait_signature': wait_signature,
+              'ctx_manager': ctx_manager})
+    return AstroidBuilder(MANAGER).string_build(code)
+
+
+# namedtuple support ###########################################################
+
+def _looks_like(node, name):
+    func = node.func
+    if isinstance(func, nodes.Attribute):
+        return func.attrname == name
+    if isinstance(func, nodes.Name):
+        return func.name == name
+    return False
+
+_looks_like_namedtuple = functools.partial(_looks_like, name='namedtuple')
+_looks_like_enum = functools.partial(_looks_like, name='Enum')
+
+
+def infer_named_tuple(node, context=None):
+    """Specific inference function for namedtuple Call node"""
+    class_node, name, attributes = infer_func_form(node, nodes.Tuple._proxied,
+                                                   context=context)
+    fake = AstroidBuilder(MANAGER).string_build('''
+class %(name)s(tuple):
+    _fields = %(fields)r
+    def _asdict(self):
+        return self.__dict__
+    @classmethod
+    def _make(cls, iterable, new=tuple.__new__, len=len):
+        return new(cls, iterable)
+    def _replace(self, **kwds):
+        return self
+    ''' % {'name': name, 'fields': attributes})
+    class_node._locals['_asdict'] = fake.body[0]._locals['_asdict']
+    class_node._locals['_make'] = fake.body[0]._locals['_make']
+    class_node._locals['_replace'] = fake.body[0]._locals['_replace']
+    class_node._locals['_fields'] = fake.body[0]._locals['_fields']
+    # we use UseInferenceDefault, we can't be a generator so return an iterator
+    return iter([class_node])
+
+
+def infer_enum(node, context=None):
+    """ Specific inference function for enum Call node. """
+    enum_meta = nodes.ClassDef("EnumMeta", 'docstring')
+    class_node = infer_func_form(node, enum_meta,
+                                 context=context, enum=True)[0]
+    return iter([class_node])
+
+
+def infer_enum_class(node):
+    """ Specific inference for enums. """
+    names = set(('Enum', 'IntEnum', 'enum.Enum', 'enum.IntEnum'))
+    for basename in node.basenames:
+        # TODO: doesn't handle subclasses yet. This implementation
+        # is a hack to support enums.
+        if basename not in names:
+            continue
+        if node.root().name == 'enum':
+            # Skip if the class is directly from enum module.
+            break
+        for local, values in node._locals.items():
+            if any(not isinstance(value, nodes.AssignName)
+                   for value in values):
+                continue
+
+            stmt = values[0].statement()
+            if isinstance(stmt.targets[0], nodes.Tuple):
+                targets = stmt.targets[0].itered()
+            else:
+                targets = stmt.targets
+
+            new_targets = []
+            for target in targets:
+                # Replace all the assignments with our mocked class.
+                classdef = dedent('''
+                class %(name)s(%(types)s):
+                    @property
+                    def value(self):
+                        # Not the best return.
+                        return None
+                    @property
+                    def name(self):
+                        return %(name)r
+                ''' % {'name': target.name, 'types': ', '.join(node.basenames)})
+                fake = AstroidBuilder(MANAGER).string_build(classdef)[target.name]
+                fake.parent = target.parent
+                for method in node.mymethods():
+                    fake._locals[method.name] = [method]
+                new_targets.append(fake.instantiate_class())
+            node._locals[local] = new_targets
+        break
+    return node
+
+def multiprocessing_transform():
+    module = AstroidBuilder(MANAGER).string_build(dedent('''
+    from multiprocessing.managers import SyncManager
+    def Manager():
+        return SyncManager()
+    '''))
+    if not PY34:
+        return module
+
+    # On Python 3.4, multiprocessing uses a getattr lookup inside contexts,
+    # in order to get the attributes they need. Since it's extremely
+    # dynamic, we use this approach to fake it.
+    node = AstroidBuilder(MANAGER).string_build(dedent('''
+    from multiprocessing.context import DefaultContext, BaseContext
+    default = DefaultContext()
+    base = BaseContext()
+    '''))
+    try:
+        context = next(node['default'].infer())
+        base = next(node['base'].infer())
+    except InferenceError:
+        return module
+
+    for node in (context, base):
+        for key, value in node._locals.items():
+            if key.startswith("_"):
+                continue
+
+            value = value[0]
+            if isinstance(value, nodes.FunctionDef):
+                # We need to rebound this, since otherwise
+                # it will have an extra argument (self).
+                value = BoundMethod(value, node)
+            module[key] = value
+    return module
+
+def multiprocessing_managers_transform():
+    return AstroidBuilder(MANAGER).string_build(dedent('''
+    import array
+    import threading
+    import multiprocessing.pool as pool
+
+    import six
+
+    class Namespace(object):
+        pass
+
+    class Value(object):
+        def __init__(self, typecode, value, lock=True):
+            self._typecode = typecode
+            self._value = value
+        def get(self):
+            return self._value
+        def set(self, value):
+            self._value = value
+        def __repr__(self):
+            return '%s(%r, %r)'%(type(self).__name__, self._typecode, self._value)
+        value = property(get, set)
+
+    def Array(typecode, sequence, lock=True):
+        return array.array(typecode, sequence)
+
+    class SyncManager(object):
+        Queue = JoinableQueue = six.moves.queue.Queue
+        Event = threading.Event
+        RLock = threading.RLock
+        BoundedSemaphore = threading.BoundedSemaphore
+        Condition = threading.Condition
+        Barrier = threading.Barrier
+        Pool = pool.Pool
+        list = list
+        dict = dict
+        Value = Value
+        Array = Array
+        Namespace = Namespace
+        __enter__ = lambda self: self
+        __exit__ = lambda *args: args
+        
+        def start(self, initializer=None, initargs=None):
+            pass
+        def shutdown(self):
+            pass
+    '''))
+
+
+MANAGER.register_transform(nodes.Call, inference_tip(infer_named_tuple),
+                           _looks_like_namedtuple)
+MANAGER.register_transform(nodes.Call, inference_tip(infer_enum),
+                           _looks_like_enum)
+MANAGER.register_transform(nodes.ClassDef, infer_enum_class)
+register_module_extender(MANAGER, 'hashlib', hashlib_transform)
+register_module_extender(MANAGER, 'collections', collections_transform)
+register_module_extender(MANAGER, 'pkg_resources', pkg_resources_transform)
+register_module_extender(MANAGER, 'subprocess', subprocess_transform)
+register_module_extender(MANAGER, 'multiprocessing.managers',
+                         multiprocessing_managers_transform)
+register_module_extender(MANAGER, 'multiprocessing', multiprocessing_transform)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_mechanize.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_mechanize.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_mechanize.py	(revision 1126)
@@ -0,0 +1,18 @@
+from astroid import MANAGER, register_module_extender
+from astroid.builder import AstroidBuilder
+
+def mechanize_transform():
+    return AstroidBuilder(MANAGER).string_build('''
+
+class Browser(object):
+    def open(self, url, data=None, timeout=None):
+        return None
+    def open_novisit(self, url, data=None, timeout=None):
+        return None
+    def open_local_file(self, filename):
+        return None
+
+''')
+
+
+register_module_extender(MANAGER, 'mechanize', mechanize_transform)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_six.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_six.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_six.py	(revision 1126)
@@ -0,0 +1,288 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# astroid is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Astroid hooks for six.moves."""
+
+import sys
+from textwrap import dedent
+
+from astroid import MANAGER, register_module_extender
+from astroid.builder import AstroidBuilder
+from astroid.exceptions import AstroidBuildingException, InferenceError
+from astroid import nodes
+
+
+SIX_ADD_METACLASS = 'six.add_metaclass'
+
+
+def _indent(text, prefix, predicate=None):
+    """Adds 'prefix' to the beginning of selected lines in 'text'.
+
+    If 'predicate' is provided, 'prefix' will only be added to the lines
+    where 'predicate(line)' is True. If 'predicate' is not provided,
+    it will default to adding 'prefix' to all non-empty lines that do not
+    consist solely of whitespace characters.
+    """
+    if predicate is None:
+        predicate = lambda line: line.strip()
+
+    def prefixed_lines():
+        for line in text.splitlines(True):
+            yield prefix + line if predicate(line) else line
+    return ''.join(prefixed_lines())
+
+
+if sys.version_info[0] == 2:
+    _IMPORTS_2 = """
+    import BaseHTTPServer
+    import CGIHTTPServer
+    import SimpleHTTPServer
+
+    from StringIO import StringIO
+    from cStringIO import StringIO as cStringIO
+    from UserDict import UserDict
+    from UserList import UserList
+    from UserString import UserString
+
+    import __builtin__ as builtins
+    import thread as _thread
+    import dummy_thread as _dummy_thread
+    import ConfigParser as configparser
+    import copy_reg as copyreg
+    from itertools import (imap as map,
+                           ifilter as filter,
+                           ifilterfalse as filterfalse,
+                           izip_longest as zip_longest,
+                           izip as zip)
+    import htmlentitydefs as html_entities
+    import HTMLParser as html_parser
+    import httplib as http_client
+    import cookielib as http_cookiejar
+    import Cookie as http_cookies
+    import Queue as queue
+    import repr as reprlib
+    from pipes import quote as shlex_quote
+    import SocketServer as socketserver
+    import SimpleXMLRPCServer as xmlrpc_server
+    import xmlrpclib as xmlrpc_client
+    import _winreg as winreg
+    import robotparser as urllib_robotparser
+    import Tkinter as tkinter
+    import tkFileDialog as tkinter_tkfiledialog
+
+    input = raw_input
+    intern = intern
+    range = xrange
+    xrange = xrange
+    reduce = reduce
+    reload_module = reload
+
+    class UrllibParse(object):
+        import urlparse as _urlparse
+        import urllib as _urllib
+        ParseResult = _urlparse.ParseResult
+        SplitResult = _urlparse.SplitResult
+        parse_qs = _urlparse.parse_qs
+        parse_qsl = _urlparse.parse_qsl
+        urldefrag = _urlparse.urldefrag
+        urljoin = _urlparse.urljoin
+        urlparse = _urlparse.urlparse
+        urlsplit = _urlparse.urlsplit
+        urlunparse = _urlparse.urlunparse
+        urlunsplit = _urlparse.urlunsplit
+        quote = _urllib.quote
+        quote_plus = _urllib.quote_plus
+        unquote = _urllib.unquote
+        unquote_plus = _urllib.unquote_plus
+        urlencode = _urllib.urlencode
+        splitquery = _urllib.splitquery
+        splittag = _urllib.splittag
+        splituser = _urllib.splituser
+        uses_fragment = _urlparse.uses_fragment       
+        uses_netloc = _urlparse.uses_netloc
+        uses_params = _urlparse.uses_params
+        uses_query = _urlparse.uses_query
+        uses_relative = _urlparse.uses_relative
+
+    class UrllibError(object):
+        import urllib2 as _urllib2
+        import urllib as _urllib
+        URLError = _urllib2.URLError
+        HTTPError = _urllib2.HTTPError
+        ContentTooShortError = _urllib.ContentTooShortError
+
+    class DummyModule(object):
+        pass
+
+    class UrllibRequest(object):
+        import urlparse as _urlparse
+        import urllib2 as _urllib2
+        import urllib as _urllib
+        urlopen = _urllib2.urlopen
+        install_opener = _urllib2.install_opener
+        build_opener = _urllib2.build_opener
+        pathname2url = _urllib.pathname2url
+        url2pathname = _urllib.url2pathname
+        getproxies = _urllib.getproxies
+        Request = _urllib2.Request
+        OpenerDirector = _urllib2.OpenerDirector
+        HTTPDefaultErrorHandler = _urllib2.HTTPDefaultErrorHandler
+        HTTPRedirectHandler = _urllib2.HTTPRedirectHandler
+        HTTPCookieProcessor = _urllib2.HTTPCookieProcessor
+        ProxyHandler = _urllib2.ProxyHandler
+        BaseHandler = _urllib2.BaseHandler
+        HTTPPasswordMgr = _urllib2.HTTPPasswordMgr
+        HTTPPasswordMgrWithDefaultRealm = _urllib2.HTTPPasswordMgrWithDefaultRealm
+        AbstractBasicAuthHandler = _urllib2.AbstractBasicAuthHandler
+        HTTPBasicAuthHandler = _urllib2.HTTPBasicAuthHandler
+        ProxyBasicAuthHandler = _urllib2.ProxyBasicAuthHandler
+        AbstractDigestAuthHandler = _urllib2.AbstractDigestAuthHandler
+        HTTPDigestAuthHandler = _urllib2.HTTPDigestAuthHandler
+        ProxyDigestAuthHandler = _urllib2.ProxyDigestAuthHandler
+        HTTPHandler = _urllib2.HTTPHandler
+        HTTPSHandler = _urllib2.HTTPSHandler
+        FileHandler = _urllib2.FileHandler
+        FTPHandler = _urllib2.FTPHandler
+        CacheFTPHandler = _urllib2.CacheFTPHandler
+        UnknownHandler = _urllib2.UnknownHandler
+        HTTPErrorProcessor = _urllib2.HTTPErrorProcessor
+        urlretrieve = _urllib.urlretrieve
+        urlcleanup = _urllib.urlcleanup
+        proxy_bypass = _urllib.proxy_bypass
+
+    urllib_parse = UrllibParse()
+    urllib_error = UrllibError()
+    urllib = DummyModule()
+    urllib.request = UrllibRequest()
+    urllib.parse = UrllibParse()
+    urllib.error = UrllibError()
+    """
+else:
+    _IMPORTS_3 = """
+    import _io
+    cStringIO = _io.StringIO
+    filter = filter
+    from itertools import filterfalse
+    input = input
+    from sys import intern
+    map = map
+    range = range
+    from imp import reload as reload_module
+    from functools import reduce
+    from shlex import quote as shlex_quote
+    from io import StringIO
+    from collections import UserDict, UserList, UserString
+    xrange = range
+    zip = zip
+    from itertools import zip_longest
+    import builtins
+    import configparser
+    import copyreg
+    import _dummy_thread
+    import http.cookiejar as http_cookiejar
+    import http.cookies as http_cookies
+    import html.entities as html_entities
+    import html.parser as html_parser
+    import http.client as http_client
+    import http.server
+    BaseHTTPServer = CGIHTTPServer = SimpleHTTPServer = http.server
+    import pickle as cPickle
+    import queue
+    import reprlib
+    import socketserver
+    import _thread
+    import winreg
+    import xmlrpc.server as xmlrpc_server
+    import xmlrpc.client as xmlrpc_client
+    import urllib.robotparser as urllib_robotparser
+    import email.mime.multipart as email_mime_multipart
+    import email.mime.nonmultipart as email_mime_nonmultipart
+    import email.mime.text as email_mime_text
+    import email.mime.base as email_mime_base
+    import urllib.parse as urllib_parse
+    import urllib.error as urllib_error
+    import tkinter
+    import tkinter.dialog as tkinter_dialog
+    import tkinter.filedialog as tkinter_filedialog
+    import tkinter.scrolledtext as tkinter_scrolledtext
+    import tkinter.simpledialog as tkinder_simpledialog
+    import tkinter.tix as tkinter_tix
+    import tkinter.ttk as tkinter_ttk
+    import tkinter.constants as tkinter_constants
+    import tkinter.dnd as tkinter_dnd
+    import tkinter.colorchooser as tkinter_colorchooser
+    import tkinter.commondialog as tkinter_commondialog
+    import tkinter.filedialog as tkinter_tkfiledialog
+    import tkinter.font as tkinter_font
+    import tkinter.messagebox as tkinter_messagebox
+    import urllib.request
+    import urllib.robotparser as urllib_robotparser
+    import urllib.parse as urllib_parse
+    import urllib.error as urllib_error
+    """
+if sys.version_info[0] == 2:
+    _IMPORTS = dedent(_IMPORTS_2)
+else:
+    _IMPORTS = dedent(_IMPORTS_3)
+
+
+def six_moves_transform():
+    code = dedent('''
+    class Moves(object):
+    {}
+    moves = Moves()
+    ''').format(_indent(_IMPORTS, "    "))
+    module = AstroidBuilder(MANAGER).string_build(code)
+    module.name = 'six.moves'
+    return module
+
+
+def _six_fail_hook(modname):
+    if modname != 'six.moves':
+        raise AstroidBuildingException
+    module = AstroidBuilder(MANAGER).string_build(_IMPORTS)
+    module.name = 'six.moves'
+    return module
+
+def transform_six_add_metaclass(node):
+    """Check if the given class node is decorated with *six.add_metaclass*
+
+    If so, inject its argument as the metaclass of the underlying class.
+    """
+    if not node.decorators:
+        return
+
+    for decorator in node.decorators.nodes:
+        if not isinstance(decorator, nodes.Call):
+            continue
+
+        try:
+            func = next(decorator.func.infer())
+        except InferenceError:
+            continue
+        if func.qname() == SIX_ADD_METACLASS and decorator.args:
+            metaclass = decorator.args[0]
+            node._metaclass = metaclass
+            return node
+
+
+register_module_extender(MANAGER, 'six', six_moves_transform)
+register_module_extender(MANAGER, 'requests.packages.urllib3.packages.six',
+                         six_moves_transform)
+MANAGER.register_failed_import_hook(_six_fail_hook)
+MANAGER.register_transform(nodes.ClassDef, transform_six_add_metaclass)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_builtin_inference.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_builtin_inference.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_builtin_inference.py	(revision 1126)
@@ -0,0 +1,336 @@
+"""Astroid hooks for various builtins."""
+
+import sys
+from functools import partial
+from textwrap import dedent
+
+import six
+from astroid import (MANAGER, UseInferenceDefault,
+                     inference_tip, YES, InferenceError, UnresolvableName)
+from astroid import arguments
+from astroid import nodes
+from astroid import objects
+from astroid.builder import AstroidBuilder
+from astroid import util
+
+def _extend_str(class_node, rvalue):
+    """function to extend builtin str/unicode class"""
+    # TODO(cpopa): this approach will make astroid to believe
+    # that some arguments can be passed by keyword, but
+    # unfortunately, strings and bytes don't accept keyword arguments.
+    code = dedent('''
+    class whatever(object):
+        def join(self, iterable):
+            return {rvalue}
+        def replace(self, old, new, count=None):
+            return {rvalue}
+        def format(self, *args, **kwargs):
+            return {rvalue}
+        def encode(self, encoding='ascii', errors=None):
+            return ''
+        def decode(self, encoding='ascii', errors=None):
+            return u''
+        def capitalize(self):
+            return {rvalue}
+        def title(self):
+            return {rvalue}
+        def lower(self):
+            return {rvalue}
+        def upper(self):
+            return {rvalue}
+        def swapcase(self):
+            return {rvalue}
+        def index(self, sub, start=None, end=None):
+            return 0
+        def find(self, sub, start=None, end=None):
+            return 0
+        def count(self, sub, start=None, end=None):
+            return 0
+        def strip(self, chars=None):
+            return {rvalue}
+        def lstrip(self, chars=None):
+            return {rvalue}
+        def rstrip(self, chars=None):
+            return {rvalue}
+        def rjust(self, width, fillchar=None):
+            return {rvalue}
+        def center(self, width, fillchar=None):
+            return {rvalue}
+        def ljust(self, width, fillchar=None):
+            return {rvalue}
+    ''')
+    code = code.format(rvalue=rvalue)
+    fake = AstroidBuilder(MANAGER).string_build(code)['whatever']
+    for method in fake.mymethods():
+        class_node._locals[method.name] = [method]
+        method.parent = class_node
+
+def extend_builtins(class_transforms):
+    from astroid.bases import BUILTINS
+    builtin_ast = MANAGER.astroid_cache[BUILTINS]
+    for class_name, transform in class_transforms.items():
+        transform(builtin_ast[class_name])
+
+if sys.version_info > (3, 0):
+    extend_builtins({'bytes': partial(_extend_str, rvalue="b''"),
+                     'str': partial(_extend_str, rvalue="''")})
+else:
+    extend_builtins({'str': partial(_extend_str, rvalue="''"),
+                     'unicode': partial(_extend_str, rvalue="u''")})
+
+
+def register_builtin_transform(transform, builtin_name):
+    """Register a new transform function for the given *builtin_name*.
+
+    The transform function must accept two parameters, a node and
+    an optional context.
+    """
+    def _transform_wrapper(node, context=None):
+        result = transform(node, context=context)
+        if result:
+            if not result.parent:
+                # Let the transformation function determine
+                # the parent for its result. Otherwise,
+                # we set it to be the node we transformed from.
+                result.parent = node
+
+            result.lineno = node.lineno
+            result.col_offset = node.col_offset
+        return iter([result])
+
+    MANAGER.register_transform(nodes.Call,
+                               inference_tip(_transform_wrapper),
+                               lambda n: (isinstance(n.func, nodes.Name) and
+                                          n.func.name == builtin_name))
+
+
+def _generic_inference(node, context, node_type, transform):
+    args = node.args
+    if not args:
+        return node_type()
+    if len(node.args) > 1:
+        raise UseInferenceDefault()
+
+    arg, = args
+    transformed = transform(arg)
+    if not transformed:
+        try:
+            inferred = next(arg.infer(context=context))
+        except (InferenceError, StopIteration):
+            raise UseInferenceDefault()
+        if inferred is util.YES:
+            raise UseInferenceDefault()
+        transformed = transform(inferred)
+    if not transformed or transformed is util.YES:
+        raise UseInferenceDefault()
+    return transformed
+
+
+def _generic_transform(arg, klass, iterables, build_elts):
+    if isinstance(arg, klass):
+        return arg
+    elif isinstance(arg, iterables):
+        if not all(isinstance(elt, nodes.Const)
+                   for elt in arg.elts):
+            # TODO(cpopa): Don't support heterogenous elements.
+            # Not yet, though.
+            raise UseInferenceDefault()
+        elts = [elt.value for elt in arg.elts]
+    elif isinstance(arg, nodes.Dict):
+        if not all(isinstance(elt[0], nodes.Const)
+                   for elt in arg.items):
+            raise UseInferenceDefault()
+        elts = [item[0].value for item in arg.items]
+    elif (isinstance(arg, nodes.Const) and
+          isinstance(arg.value, (six.string_types, six.binary_type))):
+        elts = arg.value
+    else:
+        return
+    return klass(elts=build_elts(elts))
+
+
+def _infer_builtin(node, context,
+                   klass=None, iterables=None,
+                   build_elts=None):
+    transform_func = partial(
+        _generic_transform,
+        klass=klass,
+        iterables=iterables,
+        build_elts=build_elts)
+
+    return _generic_inference(node, context, klass, transform_func)
+
+# pylint: disable=invalid-name
+infer_tuple = partial(
+    _infer_builtin,
+    klass=nodes.Tuple,
+    iterables=(nodes.List, nodes.Set),
+    build_elts=tuple)
+
+infer_list = partial(
+    _infer_builtin,
+    klass=nodes.List,
+    iterables=(nodes.Tuple, nodes.Set),
+    build_elts=list)
+
+infer_set = partial(
+    _infer_builtin,
+    klass=nodes.Set,
+    iterables=(nodes.List, nodes.Tuple),
+    build_elts=set)
+
+infer_frozenset = partial(
+    _infer_builtin,
+    klass=objects.FrozenSet,
+    iterables=(nodes.List, nodes.Tuple, nodes.Set),
+    build_elts=frozenset)
+
+
+def _get_elts(arg, context):
+    is_iterable = lambda n: isinstance(n,
+                                       (nodes.List, nodes.Tuple, nodes.Set))
+    try:
+        inferred = next(arg.infer(context))
+    except (InferenceError, UnresolvableName):
+        raise UseInferenceDefault()
+    if isinstance(inferred, nodes.Dict):
+        items = inferred.items
+    elif is_iterable(inferred):
+        items = []
+        for elt in inferred.elts:
+            # If an item is not a pair of two items,
+            # then fallback to the default inference.
+            # Also, take in consideration only hashable items,
+            # tuples and consts. We are choosing Names as well.
+            if not is_iterable(elt):
+                raise UseInferenceDefault()
+            if len(elt.elts) != 2:
+                raise UseInferenceDefault()
+            if not isinstance(elt.elts[0],
+                              (nodes.Tuple, nodes.Const, nodes.Name)):
+                raise UseInferenceDefault()
+            items.append(tuple(elt.elts))
+    else:
+        raise UseInferenceDefault()
+    return items
+
+def infer_dict(node, context=None):
+    """Try to infer a dict call to a Dict node.
+
+    The function treats the following cases:
+
+        * dict()
+        * dict(mapping)
+        * dict(iterable)
+        * dict(iterable, **kwargs)
+        * dict(mapping, **kwargs)
+        * dict(**kwargs)
+
+    If a case can't be inferred, we'll fallback to default inference.
+    """
+    call = arguments.CallSite.from_call(node)
+    if call.has_invalid_arguments() or call.has_invalid_keywords():
+        raise UseInferenceDefault
+
+    args = call.positional_arguments
+    kwargs = list(call.keyword_arguments.items())
+
+    if not args and not kwargs:
+        # dict()
+        return nodes.Dict()
+    elif kwargs and not args:
+        # dict(a=1, b=2, c=4)
+        items = [(nodes.Const(key), value) for key, value in kwargs]
+    elif len(args) == 1 and kwargs:
+        # dict(some_iterable, b=2, c=4)
+        elts = _get_elts(args[0], context)
+        keys = [(nodes.Const(key), value) for key, value in kwargs]
+        items = elts + keys
+    elif len(args) == 1:
+        items = _get_elts(args[0], context)
+    else:
+        raise UseInferenceDefault()
+
+    empty = nodes.Dict()
+    empty.items = items
+    return empty
+
+
+def _node_class(node):
+    klass = node.frame()
+    while klass is not None and not isinstance(klass, nodes.ClassDef):
+        if klass.parent is None:
+            klass = None
+        else:
+            klass = klass.parent.frame()
+    return klass
+
+
+def infer_super(node, context=None):
+    """Understand super calls.
+
+    There are some restrictions for what can be understood:
+
+        * unbounded super (one argument form) is not understood.
+
+        * if the super call is not inside a function (classmethod or method),
+          then the default inference will be used.
+
+        * if the super arguments can't be infered, the default inference
+          will be used.
+    """
+    if len(node.args) == 1:
+        # Ignore unbounded super.
+        raise UseInferenceDefault
+
+    scope = node.scope()
+    if not isinstance(scope, nodes.FunctionDef):
+        # Ignore non-method uses of super.
+        raise UseInferenceDefault
+    if scope.type not in ('classmethod', 'method'):
+        # Not interested in staticmethods.
+        raise UseInferenceDefault
+
+    cls = _node_class(scope)
+    if not len(node.args):
+        mro_pointer = cls
+        # In we are in a classmethod, the interpreter will fill
+        # automatically the class as the second argument, not an instance.
+        if scope.type == 'classmethod':
+            mro_type = cls
+        else:
+            mro_type = cls.instantiate_class()
+    else:
+        # TODO(cpopa): support flow control (multiple inference values).
+        try:
+            mro_pointer = next(node.args[0].infer(context=context))
+        except InferenceError:
+            raise UseInferenceDefault
+        try:
+            mro_type = next(node.args[1].infer(context=context))
+        except InferenceError:
+            raise UseInferenceDefault
+
+    if mro_pointer is YES or mro_type is YES:
+        # No way we could understand this.
+        raise UseInferenceDefault
+
+    super_obj = objects.Super(mro_pointer=mro_pointer,
+                              mro_type=mro_type,
+                              self_class=cls,
+                              scope=scope)
+    super_obj.parent = node
+    return iter([super_obj])
+
+
+# Builtins inference
+MANAGER.register_transform(nodes.Call,
+                           inference_tip(infer_super),
+                           lambda n: (isinstance(n.func, nodes.Name) and
+                                      n.func.name == 'super'))
+
+register_builtin_transform(infer_tuple, 'tuple')
+register_builtin_transform(infer_set, 'set')
+register_builtin_transform(infer_list, 'list')
+register_builtin_transform(infer_dict, 'dict')
+register_builtin_transform(infer_frozenset, 'frozenset')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_nose.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_nose.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_nose.py	(revision 1126)
@@ -0,0 +1,82 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+"""Hooks for nose library."""
+
+import re
+import textwrap
+
+import astroid
+import astroid.builder
+
+_BUILDER = astroid.builder.AstroidBuilder(astroid.MANAGER)
+
+
+def _pep8(name, caps=re.compile('([A-Z])')):
+    return caps.sub(lambda m: '_' + m.groups()[0].lower(), name)
+
+
+def _nose_tools_functions():
+    """Get an iterator of names and bound methods."""
+    module = _BUILDER.string_build(textwrap.dedent('''
+    import unittest
+
+    class Test(unittest.TestCase):
+        pass
+    a = Test()
+    '''))
+    try:
+        case = next(module['a'].infer())
+    except astroid.InferenceError:
+        return
+    for method in case.methods():
+        if method.name.startswith('assert') and '_' not in method.name:
+            pep8_name = _pep8(method.name)
+            yield pep8_name, astroid.BoundMethod(method, case)
+        if method.name == 'assertEqual':
+            # nose also exports assert_equals.
+            yield 'assert_equals', astroid.BoundMethod(method, case)
+
+
+def _nose_tools_transform(node):
+    for method_name, method in _nose_tools_functions():
+        node._locals[method_name] = [method]
+
+
+def _nose_tools_trivial_transform():
+    """Custom transform for the nose.tools module."""
+    stub = _BUILDER.string_build('''__all__ = []''')
+    all_entries = ['ok_', 'eq_']
+
+    for pep8_name, method in _nose_tools_functions():
+        all_entries.append(pep8_name)
+        stub[pep8_name] = method
+
+    # Update the __all__ variable, since nose.tools
+    # does this manually with .append.
+    all_assign = stub['__all__'].parent
+    all_object = astroid.List(all_entries)
+    all_object.parent = all_assign
+    all_assign.value = all_object
+    return stub
+
+
+astroid.register_module_extender(astroid.MANAGER, 'nose.tools.trivial',
+                                 _nose_tools_trivial_transform)
+astroid.MANAGER.register_transform(astroid.Module, _nose_tools_transform,
+                                   lambda n: n.name == 'nose.tools')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_qt.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_qt.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_qt.py	(revision 1126)
@@ -0,0 +1,44 @@
+"""Astroid hooks for the PyQT library."""
+
+from astroid import MANAGER, register_module_extender
+from astroid.builder import AstroidBuilder
+from astroid import nodes
+from astroid import parse
+
+
+def _looks_like_signal(node, signal_name='pyqtSignal'):
+    if '__class__' in node._instance_attrs:
+        cls = node._instance_attrs['__class__'][0]
+        return cls.name == signal_name
+    return False
+
+
+def transform_pyqt_signal(node):    
+    module = parse('''
+    class pyqtSignal(object):
+        def connect(self, slot, type=None, no_receiver_check=False):
+            pass
+        def disconnect(self, slot):
+            pass
+        def emit(self, *args):
+            pass
+    ''')
+    signal_cls = module['pyqtSignal']
+    node._instance_attrs['emit'] = signal_cls['emit']
+    node._instance_attrs['disconnect'] = signal_cls['disconnect']
+    node._instance_attrs['connect'] = signal_cls['connect']
+
+
+def pyqt4_qtcore_transform():
+    return AstroidBuilder(MANAGER).string_build('''
+
+def SIGNAL(signal_name): pass
+
+class QObject(object):
+    def emit(self, signal): pass
+''')
+
+
+register_module_extender(MANAGER, 'PyQt4.QtCore', pyqt4_qtcore_transform)
+MANAGER.register_transform(nodes.FunctionDef, transform_pyqt_signal,
+                           _looks_like_signal)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_numpy.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_numpy.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_numpy.py	(revision 1126)
@@ -0,0 +1,62 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# astroid is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Astroid hooks for numpy."""
+
+import astroid
+
+
+# TODO(cpopa): drop when understanding augmented assignments
+
+def numpy_core_transform():
+    return astroid.parse('''
+    from numpy.core import numeric
+    from numpy.core import fromnumeric
+    from numpy.core import defchararray
+    from numpy.core import records
+    from numpy.core import function_base
+    from numpy.core import machar
+    from numpy.core import getlimits
+    from numpy.core import shape_base
+    __all__ = (['char', 'rec', 'memmap', 'chararray'] + numeric.__all__ +
+               fromnumeric.__all__ +
+               records.__all__ +
+               function_base.__all__ +
+               machar.__all__ +
+               getlimits.__all__ +
+               shape_base.__all__)
+    ''')
+
+
+def numpy_transform():
+    return astroid.parse('''
+    from numpy import core
+    from numpy import matrixlib as _mat
+    from numpy import lib
+    __all__ = ['add_newdocs',
+               'ModuleDeprecationWarning',
+               'VisibleDeprecationWarning', 'linalg', 'fft', 'random',
+               'ctypeslib', 'ma',
+               '__version__', 'pkgload', 'PackageLoader',
+               'show_config'] + core.__all__ + _mat.__all__ + lib.__all__
+
+    ''')
+    
+
+astroid.register_module_extender(astroid.MANAGER, 'numpy.core', numpy_core_transform)
+astroid.register_module_extender(astroid.MANAGER, 'numpy', numpy_transform)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_pytest.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_pytest.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_pytest.py	(revision 1126)
@@ -0,0 +1,31 @@
+"""Astroid hooks for pytest."""
+from __future__ import absolute_import
+from astroid import MANAGER, register_module_extender
+from astroid.builder import AstroidBuilder
+
+
+def pytest_transform():
+    return AstroidBuilder(MANAGER).string_build('''
+
+try:
+    import _pytest.mark
+    import _pytest.recwarn
+    import _pytest.runner
+    import _pytest.python
+except ImportError:
+    pass
+else:
+    deprecated_call = _pytest.recwarn.deprecated_call
+    exit = _pytest.runner.exit
+    fail = _pytest.runner.fail
+    fixture = _pytest.python.fixture
+    importorskip = _pytest.runner.importorskip
+    mark = _pytest.mark.MarkGenerator()
+    raises = _pytest.python.raises
+    skip = _pytest.runner.skip
+    yield_fixture = _pytest.python.yield_fixture
+
+''')
+
+register_module_extender(MANAGER, 'pytest', pytest_transform)
+register_module_extender(MANAGER, 'py.test', pytest_transform)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_dateutil.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_dateutil.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/brain/brain_dateutil.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""Astroid hooks for dateutil"""
+
+import textwrap
+
+from astroid import MANAGER, register_module_extender
+from astroid.builder import AstroidBuilder
+
+def dateutil_transform():
+    return AstroidBuilder(MANAGER).string_build(textwrap.dedent('''
+    import datetime
+    def parse(timestr, parserinfo=None, **kwargs):
+        return datetime.datetime()
+    '''))
+
+register_module_extender(MANAGER, 'dateutil.parser', dateutil_transform)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/scoped_nodes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/scoped_nodes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/scoped_nodes.py	(revision 1126)
@@ -0,0 +1,1709 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+This module contains the classes for "scoped" node, i.e. which are opening a
+new local scope in the language definition : Module, ClassDef, FunctionDef (and
+Lambda, GeneratorExp, DictComp and SetComp to some extent).
+"""
+
+import io
+import itertools
+import warnings
+
+import six
+import wrapt
+
+from astroid import bases
+from astroid import context as contextmod
+from astroid import exceptions
+from astroid import manager
+from astroid import mixins
+from astroid import node_classes
+from astroid import decorators as decorators_mod
+from astroid import util
+
+
+BUILTINS = six.moves.builtins.__name__
+ITER_METHODS = ('__iter__', '__getitem__')
+
+
+def _c3_merge(sequences):
+    """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
+
+    Adapted from http://www.python.org/download/releases/2.3/mro/.
+
+    """
+    result = []
+    while True:
+        sequences = [s for s in sequences if s]   # purge empty sequences
+        if not sequences:
+            return result
+        for s1 in sequences:   # find merge candidates among seq heads
+            candidate = s1[0]
+            for s2 in sequences:
+                if candidate in s2[1:]:
+                    candidate = None
+                    break      # reject the current head, it appears later
+            else:
+                break
+        if not candidate:
+            # Show all the remaining bases, which were considered as
+            # candidates for the next mro sequence.
+            bases = ["({})".format(", ".join(base.name
+                                             for base in subsequence))
+                     for subsequence in sequences]
+            raise exceptions.InconsistentMroError(
+                "Cannot create a consistent method resolution "
+                "order for bases %s" % ", ".join(bases))
+
+        result.append(candidate)
+        # remove the chosen candidate
+        for seq in sequences:
+            if seq[0] == candidate:
+                del seq[0]
+
+
+def _verify_duplicates_mro(sequences):
+    for sequence in sequences:
+        names = [node.qname() for node in sequence]
+        if len(names) != len(set(names)):
+            raise exceptions.DuplicateBasesError('Duplicates found in the mro.')
+
+
+def remove_nodes(cls):
+    @wrapt.decorator
+    def decorator(func, instance, args, kwargs):
+        nodes = [n for n in func(*args, **kwargs) if not isinstance(n, cls)]
+        if not nodes:
+            raise exceptions.NotFoundError()
+        return nodes
+    return decorator
+
+
+def function_to_method(n, klass):
+    if isinstance(n, FunctionDef):
+        if n.type == 'classmethod':
+            return bases.BoundMethod(n, klass)
+        if n.type != 'staticmethod':
+            return bases.UnboundMethod(n)
+    return n
+
+
+def std_special_attributes(self, name, add_locals=True):
+    if add_locals:
+        locals = self._locals
+    else:
+        locals = {}
+    if name == '__name__':
+        return [node_classes.const_factory(self.name)] + locals.get(name, [])
+    if name == '__doc__':
+        return [node_classes.const_factory(self.doc)] + locals.get(name, [])
+    if name == '__dict__':
+        return [node_classes.Dict()] + locals.get(name, [])
+    raise exceptions.NotFoundError(name)
+
+
+MANAGER = manager.AstroidManager()
+def builtin_lookup(name):
+    """lookup a name into the builtin module
+    return the list of matching statements and the astroid for the builtin
+    module
+    """
+    builtin_astroid = MANAGER.ast_from_module(six.moves.builtins)
+    if name == '__dict__':
+        return builtin_astroid, ()
+    try:
+        stmts = builtin_astroid._locals[name]
+    except KeyError:
+        stmts = ()
+    return builtin_astroid, stmts
+
+
+# TODO move this Mixin to mixins.py; problem: 'FunctionDef' in _scope_lookup
+class LocalsDictNodeNG(node_classes.LookupMixIn, bases.NodeNG):
+    """ this class provides locals handling common to Module, FunctionDef
+    and ClassDef nodes, including a dict like interface for direct access
+    to locals information
+    """
+
+    # attributes below are set by the builder module or by raw factories
+
+    # dictionary of locals with name as key and node defining the local as
+    # value
+    @property
+    def locals(self):
+        util.attribute_to_function_warning('locals', 2.0, 'get_locals')
+        return self._locals
+    @locals.setter
+    def locals(self, _locals):
+        util.attribute_to_function_warning('locals', 2.0, 'get_locals')
+        self._locals = _locals
+    @locals.deleter
+    def locals(self):
+        util.attribute_to_function_warning('locals', 2.0, 'get_locals')
+        del self._locals
+
+    def qname(self):
+        """return the 'qualified' name of the node, eg module.name,
+        module.class.name ...
+        """
+        if self.parent is None:
+            return self.name
+        return '%s.%s' % (self.parent.frame().qname(), self.name)
+
+    def frame(self):
+        """return the first parent frame node (i.e. Module, FunctionDef or ClassDef)
+        """
+        return self
+
+    def scope(self):
+        """return the first node defining a new scope (i.e. Module,
+        FunctionDef, ClassDef, Lambda but also GeneratorExp, DictComp and SetComp)
+        """
+        return self
+
+    def _scope_lookup(self, node, name, offset=0):
+        """XXX method for interfacing the scope lookup"""
+        try:
+            stmts = node._filter_stmts(self._locals[name], self, offset)
+        except KeyError:
+            stmts = ()
+        if stmts:
+            return self, stmts
+        if self.parent: # i.e. not Module
+            # nested scope: if parent scope is a function, that's fine
+            # else jump to the module
+            pscope = self.parent.scope()
+            if not pscope.is_function:
+                pscope = pscope.root()
+            return pscope.scope_lookup(node, name)
+        return builtin_lookup(name) # Module
+
+    def set_local(self, name, stmt):
+        """define <name> in locals (<stmt> is the node defining the name)
+        if the node is a Module node (i.e. has globals), add the name to
+        globals
+
+        if the name is already defined, ignore it
+        """
+        #assert not stmt in self._locals.get(name, ()), (self, stmt)
+        self._locals.setdefault(name, []).append(stmt)
+
+    __setitem__ = set_local
+
+    def _append_node(self, child):
+        """append a child, linking it in the tree"""
+        self.body.append(child)
+        child.parent = self
+
+    def add_local_node(self, child_node, name=None):
+        """append a child which should alter locals to the given node"""
+        if name != '__class__':
+            # add __class__ node as a child will cause infinite recursion later!
+            self._append_node(child_node)
+        self.set_local(name or child_node.name, child_node)
+
+    def __getitem__(self, item):
+        """method from the `dict` interface returning the first node
+        associated with the given name in the locals dictionary
+
+        :type item: str
+        :param item: the name of the locally defined object
+        :raises KeyError: if the name is not defined
+        """
+        return self._locals[item][0]
+
+    def __iter__(self):
+        """method from the `dict` interface returning an iterator on
+        `self.keys()`
+        """
+        return iter(self.keys())
+
+    def keys(self):
+        """method from the `dict` interface returning a tuple containing
+        locally defined names
+        """
+        return list(self._locals.keys())
+
+    def values(self):
+        """method from the `dict` interface returning a tuple containing
+        locally defined nodes which are instance of `FunctionDef` or `ClassDef`
+        """
+        return [self[key] for key in self.keys()]
+
+    def items(self):
+        """method from the `dict` interface returning a list of tuple
+        containing each locally defined name with its associated node,
+        which is an instance of `FunctionDef` or `ClassDef`
+        """
+        return list(zip(self.keys(), self.values()))
+
+    def __contains__(self, name):
+        return name in self._locals
+
+
+class Module(LocalsDictNodeNG):
+    _astroid_fields = ('body',)
+
+    fromlineno = 0
+    lineno = 0
+
+    # attributes below are set by the builder module or by raw factories
+
+    # the file from which as been extracted the astroid representation. It may
+    # be None if the representation has been built from a built-in module
+    source_file = None
+    # Alternatively, if built from a string/bytes, this can be set
+    source_code = None
+    # encoding of python source file, so we can get unicode out of it (python2
+    # only)
+    file_encoding = None
+    # the module name
+    name = None
+    # boolean for astroid built from source (i.e. ast)
+    pure_python = None
+    # boolean for package module
+    package = None
+    # dictionary of globals with name as key and node defining the global
+    # as value
+    _globals = None
+
+    # Future imports
+    _future_imports = None
+
+    # names of python special attributes (handled by getattr impl.)
+    special_attributes = set(('__name__', '__doc__', '__file__', '__path__',
+                              '__dict__'))
+    # names of module attributes available through the global scope
+    scope_attrs = set(('__name__', '__doc__', '__file__', '__path__'))
+
+    def __init__(self, name, doc, pure_python=True):
+        self.name = name
+        self.doc = doc
+        self.pure_python = pure_python
+        self._locals = self._globals = {}
+        self.body = []
+        self._future_imports = set()
+
+    # Future deprecation warnings
+    @property
+    def file(self):
+        util.rename_warning('file', 2.0, 'source_file')
+        return self.source_file
+    @file.setter
+    def file(self, source_file):
+        util.rename_warning('file', 2.0, 'source_file')
+        self.source_file = source_file
+    @file.deleter
+    def file(self):
+        util.rename_warning('file', 2.0, 'source_file')
+        del self.source_file
+
+    @property
+    def path(self):
+        util.rename_warning('path', 2.0, 'source_file')
+        return self.source_file
+    @path.setter
+    def path(self, source_file):
+        util.rename_warning('path', 2.0, 'source_file')
+        self.source_file = source_file
+    @path.deleter
+    def path(self):
+        util.rename_warning('path', 2.0, 'source_file')
+        del self.source_file
+
+    @property
+    def file_bytes(self):
+        util.rename_warning('file_bytes', 2.0, 'source_code')
+        return self.source_code
+    @file_bytes.setter
+    def file_bytes(self, source_code):
+        util.rename_warning('file_bytes', 2.0, 'source_code')
+        self.source_code = source_code
+    @file_bytes.deleter
+    def file_bytes(self):
+        util.rename_warning('file_bytes', 2.0, 'source_code')
+        del self.source_code
+
+    @property
+    def globals(self):
+        util.attribute_to_function_warning('globals', 2.0, 'get_locals')
+        return self._locals
+    @globals.setter
+    def globals(self, _globals):
+        util.attribute_to_function_warning('globals', 2.0, 'get_locals')
+        self._locals = _globals
+    @globals.deleter
+    def globals(self):
+        util.attribute_to_function_warning('globals', 2.0, 'get_locals')
+        del self._locals
+
+    @property
+    def future_imports(self):
+        util.attribute_to_function_warning('future_imports', 2.0, 'future_imports')
+        return self._future_imports
+    @future_imports.setter
+    def future_imports(self, _future_imports):
+        util.attribute_to_function_warning('future_imports', 2.0, 'future_imports')
+        self._future_imports = _future_imports
+    @future_imports.deleter
+    def future_imports(self):
+        util.attribute_to_function_warning('future_imports', 2.0, 'future_imports')
+        del self._future_imports
+
+    def _get_stream(self):
+        if self.source_code is not None:
+            return io.BytesIO(self.source_code)
+        if self.source_file is not None:
+            stream = open(self.source_file, 'rb')
+            return stream
+        return None
+
+    @property
+    def file_stream(self):
+        warnings.warn("file_stream property is deprecated and "
+                      "it is slated for removal in astroid 1.6."
+                      "Use the new method 'stream' instead.",
+                      PendingDeprecationWarning,
+                      stacklevel=2)
+        return self._get_stream()
+
+    def stream(self):
+        """Get a stream to the underlying file or bytes."""
+        return self._get_stream()
+
+    def close(self):
+        """Close the underlying file streams."""
+        warnings.warn("close method is deprecated and it is "
+                      "slated for removal in astroid 1.6, along "
+                      "with 'file_stream' property. "
+                      "Its behaviour is replaced by managing each "
+                      "file stream returned by the 'stream' method.",
+                      PendingDeprecationWarning,
+                      stacklevel=2)
+
+    def block_range(self, lineno):
+        """return block line numbers.
+
+        start from the beginning whatever the given lineno
+        """
+        return self.fromlineno, self.tolineno
+
+    def scope_lookup(self, node, name, offset=0):
+        if name in self.scope_attrs and name not in self._locals:
+            try:
+                return self, self.getattr(name)
+            except exceptions.NotFoundError:
+                return self, ()
+        return self._scope_lookup(node, name, offset)
+
+    def pytype(self):
+        return '%s.module' % BUILTINS
+
+    def display_type(self):
+        return 'Module'
+
+    @remove_nodes(node_classes.DelName)
+    def getattr(self, name, context=None, ignore_locals=False):
+        if name in self.special_attributes:
+            if name == '__file__':
+                return [node_classes.const_factory(self.source_file)] + self._locals.get(name, [])
+            if name == '__path__' and self.package:
+                return [node_classes.List()] + self._locals.get(name, [])
+            return std_special_attributes(self, name)
+        if not ignore_locals and name in self._locals:
+            return self._locals[name]
+        if self.package:
+            try:
+                return [self.import_module(name, relative_only=True)]
+            except exceptions.AstroidBuildingException:
+                raise exceptions.NotFoundError(name)
+            except SyntaxError:
+                raise exceptions.NotFoundError(name)
+        raise exceptions.NotFoundError(name)
+
+    def igetattr(self, name, context=None):
+        """inferred getattr"""
+        # set lookup name since this is necessary to infer on import nodes for
+        # instance
+        context = contextmod.copy_context(context)
+        context.lookupname = name
+        try:
+            return bases._infer_stmts(self.getattr(name, context),
+                                      context, frame=self)
+        except exceptions.NotFoundError:
+            raise exceptions.InferenceError(name)
+
+    def fully_defined(self):
+        """return True if this module has been built from a .py file
+        and so contains a complete representation including the code
+        """
+        return self.source_file is not None and self.source_file.endswith('.py')
+
+    def statement(self):
+        """return the first parent node marked as statement node
+        consider a module as a statement...
+        """
+        return self
+
+    def previous_sibling(self):
+        """module has no sibling"""
+        return
+
+    def next_sibling(self):
+        """module has no sibling"""
+        return
+
+    if six.PY2:
+        @decorators_mod.cachedproperty
+        def _absolute_import_activated(self):
+            for stmt in self._locals.get('absolute_import', ()):
+                if isinstance(stmt, node_classes.ImportFrom) and stmt.modname == '__future__':
+                    return True
+            return False
+    else:
+        _absolute_import_activated = True
+
+    def absolute_import_activated(self):
+        return self._absolute_import_activated
+
+    def import_module(self, modname, relative_only=False, level=None):
+        """import the given module considering self as context"""
+        if relative_only and level is None:
+            level = 0
+        absmodname = self.relative_to_absolute_name(modname, level)
+        try:
+            return MANAGER.ast_from_module_name(absmodname)
+        except exceptions.AstroidBuildingException:
+            # we only want to import a sub module or package of this module,
+            # skip here
+            if relative_only:
+                raise
+        return MANAGER.ast_from_module_name(modname)
+
+    def relative_to_absolute_name(self, modname, level):
+        """return the absolute module name for a relative import.
+
+        The relative import can be implicit or explicit.
+        """
+        # XXX this returns non sens when called on an absolute import
+        # like 'pylint.checkers.astroid.utils'
+        # XXX doesn't return absolute name if self.name isn't absolute name
+        if self.absolute_import_activated() and level is None:
+            return modname
+        if level:
+            if self.package:
+                level = level - 1
+            package_name = self.name.rsplit('.', level)[0]
+        elif self.package:
+            package_name = self.name
+        else:
+            package_name = self.name.rsplit('.', 1)[0]
+        if package_name:
+            if not modname:
+                return package_name
+            return '%s.%s' % (package_name, modname)
+        return modname
+
+    def wildcard_import_names(self):
+        """return the list of imported names when this module is 'wildcard
+        imported'
+
+        It doesn't include the '__builtins__' name which is added by the
+        current CPython implementation of wildcard imports.
+        """
+        # We separate the different steps of lookup in try/excepts
+        # to avoid catching too many Exceptions
+        default = [name for name in self.keys() if not name.startswith('_')]
+        try:
+            all = self['__all__']
+        except KeyError:
+            return default
+
+        try:
+            explicit = next(all.assigned_stmts())
+        except exceptions.InferenceError:
+            return default
+        except AttributeError:
+            # not an assignment node
+            # XXX infer?
+            return default
+
+        # Try our best to detect the exported name.
+        inferred = []
+        try:
+            explicit = next(explicit.infer())
+        except exceptions.InferenceError:
+            return default
+        if not isinstance(explicit, (node_classes.Tuple, node_classes.List)):
+            return default
+
+        str_const = lambda node: (isinstance(node, node_classes.Const) and
+                                  isinstance(node.value, six.string_types))
+        for node in explicit.elts:
+            if str_const(node):
+                inferred.append(node.value)
+            else:
+                try:
+                    inferred_node = next(node.infer())
+                except exceptions.InferenceError:
+                    continue
+                if str_const(inferred_node):
+                    inferred.append(inferred_node.value)
+        return inferred
+
+    def bool_value(self):
+        return True
+
+
+class ComprehensionScope(LocalsDictNodeNG):
+    def frame(self):
+        return self.parent.frame()
+
+    scope_lookup = LocalsDictNodeNG._scope_lookup
+
+
+class GeneratorExp(ComprehensionScope):
+    _astroid_fields = ('elt', 'generators')
+
+    def __init__(self):
+        self._locals = {}
+        self.elt = None
+        self.generators = []
+
+
+class DictComp(ComprehensionScope):
+    _astroid_fields = ('key', 'value', 'generators')
+
+    def __init__(self):
+        self._locals = {}
+        self.key = None
+        self.value = None
+        self.generators = []
+
+
+class SetComp(ComprehensionScope):
+    _astroid_fields = ('elt', 'generators')
+
+    def __init__(self):
+        self._locals = {}
+        self.elt = None
+        self.generators = []
+
+
+class _ListComp(bases.NodeNG):
+    """class representing a ListComp node"""
+    _astroid_fields = ('elt', 'generators')
+    elt = None
+    generators = None
+
+
+if six.PY3:
+    class ListComp(_ListComp, ComprehensionScope):
+        """class representing a ListComp node"""
+        def __init__(self):
+            self._locals = {}
+else:
+    class ListComp(_ListComp):
+        """class representing a ListComp node"""
+
+
+def _infer_decorator_callchain(node):
+    """Detect decorator call chaining and see if the end result is a
+    static or a classmethod.
+    """
+    if not isinstance(node, FunctionDef):
+        return
+    if not node.parent:
+        return
+    try:
+        # TODO: We don't handle multiple inference results right now,
+        #       because there's no flow to reason when the return
+        #       is what we are looking for, a static or a class method.
+        result = next(node.infer_call_result(node.parent))
+    except (StopIteration, exceptions.InferenceError):
+        return
+    if isinstance(result, bases.Instance):
+        result = result._proxied
+    if isinstance(result, ClassDef):
+        if result.is_subtype_of('%s.classmethod' % BUILTINS):
+            return 'classmethod'
+        if result.is_subtype_of('%s.staticmethod' % BUILTINS):
+            return 'staticmethod'
+
+
+class Lambda(mixins.FilterStmtsMixin, LocalsDictNodeNG):
+    _astroid_fields = ('args', 'body',)
+    name = '<lambda>'
+
+    # function's type, 'function' | 'method' | 'staticmethod' | 'classmethod'
+    type = 'function'
+
+    def __init__(self):
+        self._locals = {}
+        self.args = []
+        self.body = []
+
+    def pytype(self):
+        if 'method' in self.type:
+            return '%s.instancemethod' % BUILTINS
+        return '%s.function' % BUILTINS
+
+    def display_type(self):
+        if 'method' in self.type:
+            return 'Method'
+        return 'Function'
+
+    def callable(self):
+        return True
+
+    def argnames(self):
+        """return a list of argument names"""
+        if self.args.args: # maybe None with builtin functions
+            names = _rec_get_names(self.args.args)
+        else:
+            names = []
+        if self.args.vararg:
+            names.append(self.args.vararg)
+        if self.args.kwarg:
+            names.append(self.args.kwarg)
+        return names
+
+    def infer_call_result(self, caller, context=None):
+        """infer what a function is returning when called"""
+        return self.body.infer(context)
+
+    def scope_lookup(self, node, name, offset=0):
+        if node in self.args.defaults or node in self.args.kw_defaults:
+            frame = self.parent.frame()
+            # line offset to avoid that def func(f=func) resolve the default
+            # value to the defined function
+            offset = -1
+        else:
+            # check this is not used in function decorators
+            frame = self
+        return frame._scope_lookup(node, name, offset)
+
+
+
+class FunctionDef(bases.Statement, Lambda):
+    if six.PY3:
+        _astroid_fields = ('decorators', 'args', 'body', 'returns')
+        returns = None
+    else:
+        _astroid_fields = ('decorators', 'args', 'body')
+
+    special_attributes = set(('__name__', '__doc__', '__dict__'))
+    is_function = True
+    # attributes below are set by the builder module or by raw factories
+    decorators = None
+
+    def __init__(self, name, doc):
+        self._locals = {}
+        self.args = []
+        self.body = []
+        self.name = name
+        self.doc = doc
+        self._instance_attrs = {}
+
+    @property
+    def instance_attrs(self):
+        util.attribute_to_function_warning('instance_attrs', 2.0, 'get_attributes')
+        return self._instance_attrs
+    @instance_attrs.setter
+    def instance_attrs(self, _instance_attrs):
+        util.attribute_to_function_warning('instance_attrs', 2.0, 'get_attributes')
+        self._instance_attrs = _instance_attrs
+    @instance_attrs.deleter
+    def instance_attrs(self):
+        util.attribute_to_function_warning('instance_attrs', 2.0, 'get_attributes')
+        del self._instance_attrs
+
+    @decorators_mod.cachedproperty
+    def extra_decorators(self):
+        """Get the extra decorators that this function can haves
+        Additional decorators are considered when they are used as
+        assignments, as in `method = staticmethod(method)`.
+        The property will return all the callables that are used for
+        decoration.
+        """
+        frame = self.parent.frame()
+        if not isinstance(frame, ClassDef):
+            return []
+
+        decorators = []
+        for assign in frame.nodes_of_class(node_classes.Assign):
+            if (isinstance(assign.value, node_classes.Call)
+                    and isinstance(assign.value.func, node_classes.Name)):
+                for assign_node in assign.targets:
+                    if not isinstance(assign_node, node_classes.AssignName):
+                        # Support only `name = callable(name)`
+                        continue
+
+                    if assign_node.name != self.name:
+                        # Interested only in the assignment nodes that
+                        # decorates the current method.
+                        continue
+                    try:
+                        meth = frame[self.name]
+                    except KeyError:
+                        continue
+                    else:
+                        # Must be a function and in the same frame as the
+                        # original method.
+                        if (isinstance(meth, FunctionDef)
+                                and assign_node.frame() == frame):
+                            decorators.append(assign.value)
+        return decorators
+
+    @decorators_mod.cachedproperty
+    def type(self):
+        """Get the function type for this node.
+
+        Possible values are: method, function, staticmethod, classmethod.
+        """
+        builtin_descriptors = {'classmethod', 'staticmethod'}
+
+        for decorator in self.extra_decorators:
+            if decorator.func.name in builtin_descriptors:
+                return decorator.func.name
+
+        frame = self.parent.frame()
+        type_name = 'function'
+        if isinstance(frame, ClassDef):
+            if self.name == '__new__':
+                return 'classmethod'
+            else:
+                type_name = 'method'
+
+        if self.decorators:
+            for node in self.decorators.nodes:
+                if isinstance(node, node_classes.Name):
+                    if node.name in builtin_descriptors:
+                        return node.name
+
+                if isinstance(node, node_classes.Call):
+                    # Handle the following case:
+                    # @some_decorator(arg1, arg2)
+                    # def func(...)
+                    #
+                    try:
+                        current = next(node.func.infer())
+                    except exceptions.InferenceError:
+                        continue
+                    _type = _infer_decorator_callchain(current)
+                    if _type is not None:
+                        return _type
+
+                try:
+                    for inferred in node.infer():
+                        # Check to see if this returns a static or a class method.
+                        _type = _infer_decorator_callchain(inferred)
+                        if _type is not None:
+                            return _type
+
+                        if not isinstance(inferred, ClassDef):
+                            continue
+                        for ancestor in inferred.ancestors():
+                            if not isinstance(ancestor, ClassDef):
+                                continue
+                            if ancestor.is_subtype_of('%s.classmethod' % BUILTINS):
+                                return 'classmethod'
+                            elif ancestor.is_subtype_of('%s.staticmethod' % BUILTINS):
+                                return 'staticmethod'
+                except exceptions.InferenceError:
+                    pass
+        return type_name
+
+    @decorators_mod.cachedproperty
+    def fromlineno(self):
+        # lineno is the line number of the first decorator, we want the def
+        # statement lineno
+        lineno = self.lineno
+        if self.decorators is not None:
+            lineno += sum(node.tolineno - node.lineno + 1
+                          for node in self.decorators.nodes)
+
+        return lineno
+
+    @decorators_mod.cachedproperty
+    def blockstart_tolineno(self):
+        return self.args.tolineno
+
+    def block_range(self, lineno):
+        """return block line numbers.
+
+        start from the "def" position whatever the given lineno
+        """
+        return self.fromlineno, self.tolineno
+
+    def getattr(self, name, context=None):
+        """this method doesn't look in the instance_attrs dictionary since it's
+        done by an Instance proxy at inference time.
+        """
+        if name == '__module__':
+            return [node_classes.const_factory(self.root().qname())]
+        if name in self._instance_attrs:
+            return self._instance_attrs[name]
+        return std_special_attributes(self, name, False)
+
+    def igetattr(self, name, context=None):
+        """Inferred getattr, which returns an iterator of inferred statements."""
+        try:
+            return bases._infer_stmts(self.getattr(name, context),
+                                      context, frame=self)
+        except exceptions.NotFoundError:
+            raise exceptions.InferenceError(name)
+
+    def is_method(self):
+        """return true if the function node should be considered as a method"""
+        # check we are defined in a ClassDef, because this is usually expected
+        # (e.g. pylint...) when is_method() return True
+        return self.type != 'function' and isinstance(self.parent.frame(), ClassDef)
+
+    @decorators_mod.cached
+    def decoratornames(self):
+        """return a list of decorator qualified names"""
+        result = set()
+        decoratornodes = []
+        if self.decorators is not None:
+            # pylint: disable=unsupported-binary-operation; damn flow control.
+            decoratornodes += self.decorators.nodes
+        decoratornodes += self.extra_decorators
+        for decnode in decoratornodes:
+            for infnode in decnode.infer():
+                result.add(infnode.qname())
+        return result
+
+    def is_bound(self):
+        """return true if the function is bound to an Instance or a class"""
+        return self.type == 'classmethod'
+
+    def is_abstract(self, pass_is_abstract=True):
+        """Returns True if the method is abstract.
+
+        A method is considered abstract if
+         - the only statement is 'raise NotImplementedError', or
+         - the only statement is 'pass' and pass_is_abstract is True, or
+         - the method is annotated with abc.astractproperty/abc.abstractmethod
+        """
+        if self.decorators:
+            for node in self.decorators.nodes:
+                try:
+                    inferred = next(node.infer())
+                except exceptions.InferenceError:
+                    continue
+                if inferred and inferred.qname() in ('abc.abstractproperty',
+                                                     'abc.abstractmethod'):
+                    return True
+
+        for child_node in self.body:
+            if isinstance(child_node, node_classes.Raise):
+                if child_node.raises_not_implemented():
+                    return True
+            return pass_is_abstract and isinstance(child_node, node_classes.Pass)
+        # empty function is the same as function with a single "pass" statement
+        if pass_is_abstract:
+            return True
+
+    def is_generator(self):
+        """return true if this is a generator function"""
+        yield_nodes = (node_classes.Yield, node_classes.YieldFrom)
+        return next(self.nodes_of_class(yield_nodes,
+                                        skip_klass=(FunctionDef, Lambda)), False)
+
+    def infer_call_result(self, caller, context=None):
+        """infer what a function is returning when called"""
+        if self.is_generator():
+            result = bases.Generator()
+            result.parent = self
+            yield result
+            return
+        # This is really a gigantic hack to work around metaclass generators
+        # that return transient class-generating functions. Pylint's AST structure
+        # cannot handle a base class object that is only used for calling __new__,
+        # but does not contribute to the inheritance structure itself. We inject
+        # a fake class into the hierarchy here for several well-known metaclass
+        # generators, and filter it out later.
+        if (self.name == 'with_metaclass' and
+                len(self.args.args) == 1 and
+                self.args.vararg is not None):
+            metaclass = next(caller.args[0].infer(context))
+            if isinstance(metaclass, ClassDef):
+                c = ClassDef('temporary_class', None)
+                c.hide = True
+                c.parent = self
+                class_bases = [next(b.infer(context)) for b in caller.args[1:]]
+                c.bases = [base for base in class_bases if base != util.YES]
+                c._metaclass = metaclass
+                yield c
+                return
+        returns = self.nodes_of_class(node_classes.Return, skip_klass=FunctionDef)
+        for returnnode in returns:
+            if returnnode.value is None:
+                yield node_classes.Const(None)
+            else:
+                try:
+                    for inferred in returnnode.value.infer(context):
+                        yield inferred
+                except exceptions.InferenceError:
+                    yield util.YES
+
+
+class AsyncFunctionDef(FunctionDef):
+    """Asynchronous function created with the `async` keyword."""
+
+
+def _rec_get_names(args, names=None):
+    """return a list of all argument names"""
+    if names is None:
+        names = []
+    for arg in args:
+        if isinstance(arg, node_classes.Tuple):
+            _rec_get_names(arg.elts, names)
+        else:
+            names.append(arg.name)
+    return names
+
+
+def _is_metaclass(klass, seen=None):
+    """ Return if the given class can be
+    used as a metaclass.
+    """
+    if klass.name == 'type':
+        return True
+    if seen is None:
+        seen = set()
+    for base in klass.bases:
+        try:
+            for baseobj in base.infer():
+                baseobj_name = baseobj.qname()
+                if baseobj_name in seen:
+                    continue
+                else:
+                    seen.add(baseobj_name)
+                if isinstance(baseobj, bases.Instance):
+                    # not abstract
+                    return False
+                if baseobj is util.YES:
+                    continue
+                if baseobj is klass:
+                    continue
+                if not isinstance(baseobj, ClassDef):
+                    continue
+                if baseobj._type == 'metaclass':
+                    return True
+                if _is_metaclass(baseobj, seen):
+                    return True
+        except exceptions.InferenceError:
+            continue
+    return False
+
+
+def _class_type(klass, ancestors=None):
+    """return a ClassDef node type to differ metaclass and exception
+    from 'regular' classes
+    """
+    # XXX we have to store ancestors in case we have a ancestor loop
+    if klass._type is not None:
+        return klass._type
+    if _is_metaclass(klass):
+        klass._type = 'metaclass'
+    elif klass.name.endswith('Exception'):
+        klass._type = 'exception'
+    else:
+        if ancestors is None:
+            ancestors = set()
+        klass_name = klass.qname()
+        if klass_name in ancestors:
+            # XXX we are in loop ancestors, and have found no type
+            klass._type = 'class'
+            return 'class'
+        ancestors.add(klass_name)
+        for base in klass.ancestors(recurs=False):
+            name = _class_type(base, ancestors)
+            if name != 'class':
+                if name == 'metaclass' and not _is_metaclass(klass):
+                    # don't propagate it if the current class
+                    # can't be a metaclass
+                    continue
+                klass._type = base.type
+                break
+    if klass._type is None:
+        klass._type = 'class'
+    return klass._type
+
+
+class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG, bases.Statement):
+
+    # some of the attributes below are set by the builder module or
+    # by a raw factories
+
+    # a dictionary of class instances attributes
+    _astroid_fields = ('decorators', 'bases', 'body') # name
+
+    decorators = None
+    special_attributes = set(('__name__', '__doc__', '__dict__', '__module__',
+                              '__bases__', '__mro__', '__subclasses__'))
+
+    _type = None
+    _metaclass_hack = False
+    hide = False
+    type = property(_class_type,
+                    doc="class'type, possible values are 'class' | "
+                    "'metaclass' | 'exception'")
+
+    def __init__(self, name, doc):
+        self._instance_attrs = {}
+        self._locals = {}
+        self.bases = []
+        self.body = []
+        self.name = name
+        self.doc = doc
+
+    @property
+    def instance_attrs(self):
+        util.attribute_to_function_warning('instance_attrs', 2.0, 'get_attributes')
+        return self._instance_attrs
+    @instance_attrs.setter
+    def instance_attrs(self, _instance_attrs):
+        util.attribute_to_function_warning('instance_attrs', 2.0, 'get_attributes')
+        self._instance_attrs = _instance_attrs
+    @instance_attrs.deleter
+    def instance_attrs(self):
+        util.attribute_to_function_warning('instance_attrs', 2.0, 'get_attributes')
+        del self._instance_attrs
+
+    def _newstyle_impl(self, context=None):
+        if context is None:
+            context = contextmod.InferenceContext()
+        if self._newstyle is not None:
+            return self._newstyle
+        for base in self.ancestors(recurs=False, context=context):
+            if base._newstyle_impl(context):
+                self._newstyle = True
+                break
+        klass = self._explicit_metaclass()
+        # could be any callable, we'd need to infer the result of klass(name,
+        # bases, dict).  punt if it's not a class node.
+        if klass is not None and isinstance(klass, ClassDef):
+            self._newstyle = klass._newstyle_impl(context)
+        if self._newstyle is None:
+            self._newstyle = False
+        return self._newstyle
+
+    _newstyle = None
+    newstyle = property(_newstyle_impl,
+                        doc="boolean indicating if it's a new style class"
+                        "or not")
+
+    @decorators_mod.cachedproperty
+    def blockstart_tolineno(self):
+        if self.bases:
+            return self.bases[-1].tolineno
+        else:
+            return self.fromlineno
+
+    def block_range(self, lineno):
+        """return block line numbers.
+
+        start from the "class" position whatever the given lineno
+        """
+        return self.fromlineno, self.tolineno
+
+    def pytype(self):
+        if self.newstyle:
+            return '%s.type' % BUILTINS
+        return '%s.classobj' % BUILTINS
+
+    def display_type(self):
+        return 'Class'
+
+    def callable(self):
+        return True
+
+    def is_subtype_of(self, type_name, context=None):
+        if self.qname() == type_name:
+            return True
+        for anc in self.ancestors(context=context):
+            if anc.qname() == type_name:
+                return True
+
+    def _infer_type_call(self, caller, context):
+        name_node = next(caller.args[0].infer(context))
+        if (isinstance(name_node, node_classes.Const) and
+                isinstance(name_node.value, six.string_types)):
+            name = name_node.value
+        else:
+            return util.YES
+
+        result = ClassDef(name, None)
+
+        # Get the bases of the class.
+        class_bases = next(caller.args[1].infer(context))
+        if isinstance(class_bases, (node_classes.Tuple, node_classes.List)):
+            result.bases = class_bases.itered()
+        else:
+            # There is currently no AST node that can represent an 'unknown'
+            # node (YES is not an AST node), therefore we simply return YES here
+            # although we know at least the name of the class.
+            return util.YES
+
+        # Get the members of the class
+        try:
+            members = next(caller.args[2].infer(context))
+        except exceptions.InferenceError:
+            members = None
+
+        if members and isinstance(members, node_classes.Dict):
+            for attr, value in members.items:
+                if (isinstance(attr, node_classes.Const) and
+                        isinstance(attr.value, six.string_types)):
+                    result._locals[attr.value] = [value]
+
+        result.parent = caller.parent
+        return result
+
+    def infer_call_result(self, caller, context=None):
+        """infer what a class is returning when called"""
+        if (self.is_subtype_of('%s.type' % (BUILTINS,), context)
+                and len(caller.args) == 3):
+            result = self._infer_type_call(caller, context)
+            yield result
+        else:
+            yield bases.Instance(self)
+
+    def scope_lookup(self, node, name, offset=0):
+        # pylint: disable=redefined-variable-type
+        if any(node == base or base.parent_of(node)
+               for base in self.bases):
+            # Handle the case where we have either a name
+            # in the bases of a class, which exists before
+            # the actual definition or the case where we have
+            # a Getattr node, with that name.
+            #
+            # name = ...
+            # class A(name):
+            #     def name(self): ...
+            #
+            # import name
+            # class A(name.Name):
+            #     def name(self): ...
+
+            frame = self.parent.frame()
+            # line offset to avoid that class A(A) resolve the ancestor to
+            # the defined class
+            offset = -1
+        else:
+            frame = self
+        return frame._scope_lookup(node, name, offset)
+
+    @property
+    def basenames(self):
+        """Get the list of parent class names, as they appear in the class definition."""
+        return [bnode.as_string() for bnode in self.bases]
+
+    def ancestors(self, recurs=True, context=None):
+        """return an iterator on the node base classes in a prefixed
+        depth first order
+
+        :param recurs:
+          boolean indicating if it should recurse or return direct
+          ancestors only
+        """
+        # FIXME: should be possible to choose the resolution order
+        # FIXME: inference make infinite loops possible here
+        yielded = set([self])
+        if context is None:
+            context = contextmod.InferenceContext()
+        if six.PY3:
+            if not self.bases and self.qname() != 'builtins.object':
+                yield builtin_lookup("object")[1][0]
+                return
+
+        for stmt in self.bases:
+            with context.restore_path():
+                try:
+                    for baseobj in stmt.infer(context):
+                        if not isinstance(baseobj, ClassDef):
+                            if isinstance(baseobj, bases.Instance):
+                                baseobj = baseobj._proxied
+                            else:
+                                continue
+                        if not baseobj.hide:
+                            if baseobj in yielded:
+                                continue
+                            yielded.add(baseobj)
+                            yield baseobj
+                        if recurs:
+                            for grandpa in baseobj.ancestors(recurs=True,
+                                                             context=context):
+                                if grandpa is self:
+                                    # This class is the ancestor of itself.
+                                    break
+                                if grandpa in yielded:
+                                    continue
+                                yielded.add(grandpa)
+                                yield grandpa
+                except exceptions.InferenceError:
+                    continue
+
+    def local_attr_ancestors(self, name, context=None):
+        """return an iterator on astroid representation of parent classes
+        which have <name> defined in their locals
+        """
+        if self.newstyle and all(n.newstyle for n in self.ancestors(context)):
+            # Look up in the mro if we can. This will result in the
+            # attribute being looked up just as Python does it.
+            try:
+                ancestors = self.mro(context)[1:]
+            except exceptions.MroError:
+                # Fallback to use ancestors, we can't determine
+                # a sane MRO.
+                ancestors = self.ancestors(context=context)
+        else:
+            ancestors = self.ancestors(context=context)
+        for astroid in ancestors:
+            if name in astroid:
+                yield astroid
+
+    def instance_attr_ancestors(self, name, context=None):
+        """return an iterator on astroid representation of parent classes
+        which have <name> defined in their instance attribute dictionary
+        """
+        for astroid in self.ancestors(context=context):
+            if name in astroid._instance_attrs:
+                yield astroid
+
+    def has_base(self, node):
+        return node in self.bases
+
+    @remove_nodes(node_classes.DelAttr)
+    def local_attr(self, name, context=None):
+        """return the list of assign node associated to name in this class
+        locals or in its parents
+
+        :raises `NotFoundError`:
+          if no attribute with this name has been find in this class or
+          its parent classes
+        """
+        try:
+            return self._locals[name]
+        except KeyError:
+            for class_node in self.local_attr_ancestors(name, context):
+                return class_node._locals[name]
+        raise exceptions.NotFoundError(name)
+
+    @remove_nodes(node_classes.DelAttr)
+    def instance_attr(self, name, context=None):
+        """return the astroid nodes associated to name in this class instance
+        attributes dictionary and in its parents
+
+        :raises `NotFoundError`:
+          if no attribute with this name has been find in this class or
+          its parent classes
+        """
+        # Return a copy, so we don't modify self._instance_attrs,
+        # which could lead to infinite loop.
+        values = list(self._instance_attrs.get(name, []))
+        # get all values from parents
+        for class_node in self.instance_attr_ancestors(name, context):
+            values += class_node._instance_attrs[name]
+        if not values:
+            raise exceptions.NotFoundError(name)
+        return values
+
+    def instantiate_class(self):
+        """return Instance of ClassDef node, else return self"""
+        return bases.Instance(self)
+
+    def instanciate_class(self):
+        """return Instance of ClassDef node, else return self"""
+        util.rename_warning('instanciate_class()', 2.0, 'instantiate_class()')
+        return self.instantiate_class()
+
+    def getattr(self, name, context=None):
+        """this method doesn't look in the instance_attrs dictionary since it's
+        done by an Instance proxy at inference time.
+
+        It may return a YES object if the attribute has not been actually
+        found but a __getattr__ or __getattribute__ method is defined
+        """
+        values = self._locals.get(name, [])
+        if name in self.special_attributes:
+            if name == '__module__':
+                return [node_classes.const_factory(self.root().qname())] + values
+            if name == '__bases__':
+                node = node_classes.Tuple()
+                elts = list(self._inferred_bases(context))
+                node.elts = elts
+                return [node] + values
+            if name == '__mro__' and self.newstyle:
+                mro = self.mro()
+                node = node_classes.Tuple()
+                node.elts = mro
+                return [node]
+            return std_special_attributes(self, name)
+        # don't modify the list in self._locals!
+        values = list(values)
+        for classnode in self.ancestors(recurs=True, context=context):
+            values += classnode._locals.get(name, [])
+        if not values:
+            raise exceptions.NotFoundError(name)
+        return values
+
+    def igetattr(self, name, context=None):
+        """inferred getattr, need special treatment in class to handle
+        descriptors
+        """
+        # set lookup name since this is necessary to infer on import nodes for
+        # instance
+        context = contextmod.copy_context(context)
+        context.lookupname = name
+        try:
+            for inferred in bases._infer_stmts(self.getattr(name, context),
+                                               context, frame=self):
+                # yield YES object instead of descriptors when necessary
+                if (not isinstance(inferred, node_classes.Const)
+                        and isinstance(inferred, bases.Instance)):
+                    try:
+                        inferred._proxied.getattr('__get__', context)
+                    except exceptions.NotFoundError:
+                        yield inferred
+                    else:
+                        yield util.YES
+                else:
+                    yield function_to_method(inferred, self)
+        except exceptions.NotFoundError:
+            if not name.startswith('__') and self.has_dynamic_getattr(context):
+                # class handle some dynamic attributes, return a YES object
+                yield util.YES
+            else:
+                raise exceptions.InferenceError(name)
+
+    def has_dynamic_getattr(self, context=None):
+        """
+        Check if the current instance has a custom __getattr__
+        or a custom __getattribute__.
+
+        If any such method is found and it is not from
+        builtins, nor from an extension module, then the function
+        will return True.
+        """
+        def _valid_getattr(node):
+            root = node.root()
+            return root.name != BUILTINS and getattr(root, 'pure_python', None)
+
+        try:
+            return _valid_getattr(self.getattr('__getattr__', context)[0])
+        except exceptions.NotFoundError:
+            #if self.newstyle: XXX cause an infinite recursion error
+            try:
+                getattribute = self.getattr('__getattribute__', context)[0]
+                return _valid_getattr(getattribute)
+            except exceptions.NotFoundError:
+                pass
+        return False
+
+    def methods(self):
+        """return an iterator on all methods defined in the class and
+        its ancestors
+        """
+        done = {}
+        for astroid in itertools.chain(iter((self,)), self.ancestors()):
+            for meth in astroid.mymethods():
+                if meth.name in done:
+                    continue
+                done[meth.name] = None
+                yield meth
+
+    def mymethods(self):
+        """return an iterator on all methods defined in the class"""
+        for member in self.values():
+            if isinstance(member, FunctionDef):
+                yield member
+
+    def implicit_metaclass(self):
+        """Get the implicit metaclass of the current class
+
+        For newstyle classes, this will return an instance of builtins.type.
+        For oldstyle classes, it will simply return None, since there's
+        no implicit metaclass there.
+        """
+
+        if self.newstyle:
+            return builtin_lookup('type')[1][0]
+
+    _metaclass = None
+    def _explicit_metaclass(self):
+        """ Return the explicit defined metaclass
+        for the current class.
+
+        An explicit defined metaclass is defined
+        either by passing the ``metaclass`` keyword argument
+        in the class definition line (Python 3) or (Python 2) by
+        having a ``__metaclass__`` class attribute, or if there are
+        no explicit bases but there is a global ``__metaclass__`` variable.
+        """
+        for base in self.bases:
+            try:
+                for baseobj in base.infer():
+                    if isinstance(baseobj, ClassDef) and baseobj.hide:
+                        self._metaclass = baseobj._metaclass
+                        self._metaclass_hack = True
+                        break
+            except exceptions.InferenceError:
+                pass
+
+        if self._metaclass:
+            # Expects this from Py3k TreeRebuilder
+            try:
+                return next(node for node in self._metaclass.infer()
+                            if node is not util.YES)
+            except (exceptions.InferenceError, StopIteration):
+                return None
+        if six.PY3:
+            return None
+
+        if '__metaclass__' in self._locals:
+            assignment = self._locals['__metaclass__'][-1]
+        elif self.bases:
+            return None
+        elif '__metaclass__' in self.root()._locals:
+            assignments = [ass for ass in self.root()._locals['__metaclass__']
+                           if ass.lineno < self.lineno]
+            if not assignments:
+                return None
+            assignment = assignments[-1]
+        else:
+            return None
+
+        try:
+            inferred = next(assignment.infer())
+        except exceptions.InferenceError:
+            return
+        if inferred is util.YES: # don't expose this
+            return None
+        return inferred
+
+    def _find_metaclass(self, seen=None):
+        if seen is None:
+            seen = set()
+        seen.add(self)
+
+        klass = self._explicit_metaclass()
+        if klass is None:
+            for parent in self.ancestors():
+                if parent not in seen:
+                    klass = parent._find_metaclass(seen)
+                    if klass is not None:
+                        break
+        return klass
+
+    def metaclass(self):
+        """Return the metaclass of this class.
+
+        If this class does not define explicitly a metaclass,
+        then the first defined metaclass in ancestors will be used
+        instead.
+        """
+        return self._find_metaclass()
+
+    def has_metaclass_hack(self):
+        return self._metaclass_hack
+
+    def _islots(self):
+        """ Return an iterator with the inferred slots. """
+        if '__slots__' not in self._locals:
+            return
+        for slots in self.igetattr('__slots__'):
+            # check if __slots__ is a valid type
+            for meth in ITER_METHODS:
+                try:
+                    slots.getattr(meth)
+                    break
+                except exceptions.NotFoundError:
+                    continue
+            else:
+                continue
+
+            if isinstance(slots, node_classes.Const):
+                # a string. Ignore the following checks,
+                # but yield the node, only if it has a value
+                if slots.value:
+                    yield slots
+                continue
+            if not hasattr(slots, 'itered'):
+                # we can't obtain the values, maybe a .deque?
+                continue
+
+            if isinstance(slots, node_classes.Dict):
+                values = [item[0] for item in slots.items]
+            else:
+                values = slots.itered()
+            if values is util.YES:
+                continue
+            if not values:
+                # Stop the iteration, because the class
+                # has an empty list of slots.
+                raise StopIteration(values)
+
+            for elt in values:
+                try:
+                    for inferred in elt.infer():
+                        if inferred is util.YES:
+                            continue
+                        if (not isinstance(inferred, node_classes.Const) or
+                                not isinstance(inferred.value,
+                                               six.string_types)):
+                            continue
+                        if not inferred.value:
+                            continue
+                        yield inferred
+                except exceptions.InferenceError:
+                    continue
+
+    def _slots(self):
+        if not self.newstyle:
+            raise NotImplementedError(
+                "The concept of slots is undefined for old-style classes.")
+
+        slots = self._islots()
+        try:
+            first = next(slots)
+        except StopIteration as exc:
+            # The class doesn't have a __slots__ definition or empty slots.
+            if exc.args and exc.args[0] not in ('', None):
+                return exc.args[0]
+            return None
+        # pylint: disable=unsupported-binary-operation; false positive
+        return [first] + list(slots)
+
+    # Cached, because inferring them all the time is expensive
+    @decorators_mod.cached
+    def slots(self):
+        """Get all the slots for this node.
+
+        If the class doesn't define any slot, through `__slots__`
+        variable, then this function will return a None.
+        Also, it will return None in the case the slots weren't inferred.
+        Otherwise, it will return a list of slot names.
+        """
+        def grouped_slots():
+            # Not interested in object, since it can't have slots.
+            for cls in self.mro()[:-1]:
+                try:
+                    cls_slots = cls._slots()
+                except NotImplementedError:
+                    continue
+                if cls_slots is not None:
+                    for slot in cls_slots:
+                        yield slot
+                else:
+                    yield None
+
+        if not self.newstyle:
+            raise NotImplementedError(
+                "The concept of slots is undefined for old-style classes.")
+
+        slots = list(grouped_slots())
+        if not all(slot is not None for slot in slots):
+            return None
+
+        return sorted(slots, key=lambda item: item.value)
+
+    def _inferred_bases(self, context=None):
+        # TODO(cpopa): really similar with .ancestors,
+        # but the difference is when one base is inferred,
+        # only the first object is wanted. That's because
+        # we aren't interested in superclasses, as in the following
+        # example:
+        #
+        # class SomeSuperClass(object): pass
+        # class SomeClass(SomeSuperClass): pass
+        # class Test(SomeClass): pass
+        #
+        # Inferring SomeClass from the Test's bases will give
+        # us both SomeClass and SomeSuperClass, but we are interested
+        # only in SomeClass.
+
+        if context is None:
+            context = contextmod.InferenceContext()
+        if six.PY3:
+            if not self.bases and self.qname() != 'builtins.object':
+                yield builtin_lookup("object")[1][0]
+                return
+
+        for stmt in self.bases:
+            try:
+                baseobj = next(stmt.infer(context=context))
+            except exceptions.InferenceError:
+                continue
+            if isinstance(baseobj, bases.Instance):
+                baseobj = baseobj._proxied
+            if not isinstance(baseobj, ClassDef):
+                continue
+            if not baseobj.hide:
+                yield baseobj
+            else:
+                for base in baseobj.bases:
+                    yield base
+
+    def mro(self, context=None):
+        """Get the method resolution order, using C3 linearization.
+
+        It returns the list of ancestors sorted by the mro.
+        This will raise `NotImplementedError` for old-style classes, since
+        they don't have the concept of MRO.
+        """
+        if not self.newstyle:
+            raise NotImplementedError(
+                "Could not obtain mro for old-style classes.")
+
+        bases = list(self._inferred_bases(context=context))
+        bases_mro = []
+        for base in bases:
+            try:
+                mro = base.mro(context=context)
+                bases_mro.append(mro)
+            except NotImplementedError:
+                # Some classes have in their ancestors both newstyle and
+                # old style classes. For these we can't retrieve the .mro,
+                # although in Python it's possible, since the class we are
+                # currently working is in fact new style.
+                # So, we fallback to ancestors here.
+                ancestors = list(base.ancestors(context=context))
+                bases_mro.append(ancestors)
+
+        unmerged_mro = ([[self]] + bases_mro + [bases])
+        _verify_duplicates_mro(unmerged_mro)
+        return _c3_merge(unmerged_mro)
+
+def get_locals(node):
+    '''Stub function for forwards compatibility.'''
+    return node._locals
+
+def get_attributes(node):
+    '''Stub function for forwards compatibility.'''
+    return node._instance_attrs
+
+# Backwards-compatibility aliases
+Class = node_classes.proxy_alias('Class', ClassDef)
+Function = node_classes.proxy_alias('Function', FunctionDef)
+GenExpr = node_classes.proxy_alias('GenExpr', GeneratorExp)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/arguments.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/arguments.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/arguments.py	(revision 1126)
@@ -0,0 +1,233 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+from astroid import bases
+from astroid import context as contextmod
+from astroid import exceptions
+from astroid import nodes
+from astroid import util
+
+import six
+
+
+class CallSite(object):
+    """Class for understanding arguments passed into a call site
+
+    It needs a call context, which contains the arguments and the
+    keyword arguments that were passed into a given call site.
+    In order to infer what an argument represents, call
+    :meth:`infer_argument` with the corresponding function node
+    and the argument name.
+    """
+
+    def __init__(self, callcontext):
+        args = callcontext.args
+        keywords = callcontext.keywords
+        self.duplicated_keywords = set()
+        self._unpacked_args = self._unpack_args(args)
+        self._unpacked_kwargs = self._unpack_keywords(keywords)
+
+        self.positional_arguments = [
+            arg for arg in self._unpacked_args
+            if arg is not util.YES
+        ]
+        self.keyword_arguments = {
+            key: value for key, value in self._unpacked_kwargs.items()
+            if value is not util.YES
+        }
+
+    @classmethod
+    def from_call(cls, call_node):
+        """Get a CallSite object from the given Call node."""
+        callcontext = contextmod.CallContext(call_node.args,
+                                             call_node.keywords)
+        return cls(callcontext)
+
+    def has_invalid_arguments(self):
+        """Check if in the current CallSite were passed *invalid* arguments
+
+        This can mean multiple things. For instance, if an unpacking
+        of an invalid object was passed, then this method will return True.
+        Other cases can be when the arguments can't be inferred by astroid,
+        for example, by passing objects which aren't known statically.
+        """
+        return len(self.positional_arguments) != len(self._unpacked_args)
+
+    def has_invalid_keywords(self):
+        """Check if in the current CallSite were passed *invalid* keyword arguments
+
+        For instance, unpacking a dictionary with integer keys is invalid
+        (**{1:2}), because the keys must be strings, which will make this
+        method to return True. Other cases where this might return True if
+        objects which can't be inferred were passed.
+        """
+        return len(self.keyword_arguments) != len(self._unpacked_kwargs)
+
+    def _unpack_keywords(self, keywords):
+        values = {}
+        context = contextmod.InferenceContext()
+        for name, value in keywords:
+            if name is None:
+                # Then it's an unpacking operation (**)
+                try:
+                    inferred = next(value.infer(context=context))
+                except exceptions.InferenceError:
+                    values[name] = util.YES
+                    continue
+
+                if not isinstance(inferred, nodes.Dict):
+                    # Not something we can work with.
+                    values[name] = util.YES
+                    continue
+
+                for dict_key, dict_value in inferred.items:
+                    try:
+                        dict_key = next(dict_key.infer(context=context))
+                    except exceptions.InferenceError:
+                        values[name] = util.YES
+                        continue
+                    if not isinstance(dict_key, nodes.Const):
+                        values[name] = util.YES
+                        continue
+                    if not isinstance(dict_key.value, six.string_types):
+                        values[name] = util.YES
+                        continue
+                    if dict_key.value in values:
+                        # The name is already in the dictionary
+                        values[dict_key.value] = util.YES
+                        self.duplicated_keywords.add(dict_key.value)
+                        continue
+                    values[dict_key.value] = dict_value
+            else:
+                values[name] = value
+        return values
+
+    @staticmethod
+    def _unpack_args(args):
+        values = []
+        context = contextmod.InferenceContext()
+        for arg in args:
+            if isinstance(arg, nodes.Starred):
+                try:
+                    inferred = next(arg.value.infer(context=context))
+                except exceptions.InferenceError:
+                    values.append(util.YES)
+                    continue
+
+                if inferred is util.YES:
+                    values.append(util.YES)
+                    continue
+                if not hasattr(inferred, 'elts'):
+                    values.append(util.YES)
+                    continue
+                values.extend(inferred.elts)
+            else:
+                values.append(arg)
+        return values
+
+    def infer_argument(self, funcnode, name, context):
+        """infer a function argument value according to the call context"""
+        if name in self.duplicated_keywords:
+            raise exceptions.InferenceError(name)
+
+        # Look into the keywords first, maybe it's already there.
+        try:
+            return self.keyword_arguments[name].infer(context)
+        except KeyError:
+            pass
+
+        # Too many arguments given and no variable arguments.
+        if len(self.positional_arguments) > len(funcnode.args.args):
+            if not funcnode.args.vararg:
+                raise exceptions.InferenceError(name)
+
+        positional = self.positional_arguments[:len(funcnode.args.args)]
+        vararg = self.positional_arguments[len(funcnode.args.args):]
+        argindex = funcnode.args.find_argname(name)[0]
+        kwonlyargs = set(arg.name for arg in funcnode.args.kwonlyargs)
+        kwargs = {
+            key: value for key, value in self.keyword_arguments.items()
+            if key not in kwonlyargs
+        }
+        # If there are too few positionals compared to
+        # what the function expects to receive, check to see
+        # if the missing positional arguments were passed
+        # as keyword arguments and if so, place them into the
+        # positional args list.
+        if len(positional) < len(funcnode.args.args):
+            for func_arg in funcnode.args.args:
+                if func_arg.name in kwargs:
+                    arg = kwargs.pop(func_arg.name)
+                    positional.append(arg)
+
+        if argindex is not None:
+            # 2. first argument of instance/class method
+            if argindex == 0 and funcnode.type in ('method', 'classmethod'):
+                if context.boundnode is not None:
+                    boundnode = context.boundnode
+                else:
+                    # XXX can do better ?
+                    boundnode = funcnode.parent.frame()
+                if funcnode.type == 'method':
+                    if not isinstance(boundnode, bases.Instance):
+                        boundnode = bases.Instance(boundnode)
+                    return iter((boundnode,))
+                if funcnode.type == 'classmethod':
+                    return iter((boundnode,))
+            # if we have a method, extract one position
+            # from the index, so we'll take in account
+            # the extra parameter represented by `self` or `cls`
+            if funcnode.type in ('method', 'classmethod'):
+                argindex -= 1
+            # 2. search arg index
+            try:
+                return self.positional_arguments[argindex].infer(context)
+            except IndexError:
+                pass
+
+        if funcnode.args.kwarg == name:
+            # It wants all the keywords that were passed into
+            # the call site.
+            if self.has_invalid_keywords():
+                raise exceptions.InferenceError
+            kwarg = nodes.Dict()
+            kwarg.lineno = funcnode.args.lineno
+            kwarg.col_offset = funcnode.args.col_offset
+            kwarg.parent = funcnode.args
+            items = [(nodes.const_factory(key), value)
+                     for key, value in kwargs.items()]
+            kwarg.items = items
+            return iter((kwarg, ))
+        elif funcnode.args.vararg == name:
+            # It wants all the args that were passed into
+            # the call site.
+            if self.has_invalid_arguments():
+                raise exceptions.InferenceError
+            args = nodes.Tuple()
+            args.lineno = funcnode.args.lineno
+            args.col_offset = funcnode.args.col_offset
+            args.parent = funcnode.args
+            args.elts = vararg
+            return iter((args, ))
+
+        # Check if it's a default parameter.
+        try:
+            return funcnode.args.default_value(name).infer(context)
+        except exceptions.NoDefault:
+            pass
+        raise exceptions.InferenceError(name)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/decorators.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/decorators.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/decorators.py	(revision 1126)
@@ -0,0 +1,75 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+#
+# The code in this file was originally part of logilab-common, licensed under
+# the same license.
+
+""" A few useful function/method decorators."""
+
+import wrapt
+
+
+@wrapt.decorator
+def cached(func, instance, args, kwargs):
+    """Simple decorator to cache result of method calls without args."""
+    cache = getattr(instance, '__cache', None)
+    if cache is None:
+        instance.__cache = cache = {}
+    try:
+        return cache[func]
+    except KeyError:
+        cache[func] = result = func(*args, **kwargs)
+        return result
+
+
+class cachedproperty(object):
+    """ Provides a cached property equivalent to the stacking of
+    @cached and @property, but more efficient.
+
+    After first usage, the <property_name> becomes part of the object's
+    __dict__. Doing:
+
+      del obj.<property_name> empties the cache.
+
+    Idea taken from the pyramid_ framework and the mercurial_ project.
+
+    .. _pyramid: http://pypi.python.org/pypi/pyramid
+    .. _mercurial: http://pypi.python.org/pypi/Mercurial
+    """
+    __slots__ = ('wrapped',)
+
+    def __init__(self, wrapped):
+        try:
+            wrapped.__name__
+        except AttributeError:
+            raise TypeError('%s must have a __name__ attribute' %
+                            wrapped)
+        self.wrapped = wrapped
+
+    @property
+    def __doc__(self):
+        doc = getattr(self.wrapped, '__doc__', None)
+        return ('<wrapped by the cachedproperty decorator>%s'
+                % ('\n%s' % doc if doc else ''))
+
+    def __get__(self, inst, objtype=None):
+        if inst is None:
+            return self
+        val = self.wrapped(inst)
+        setattr(inst, self.wrapped.__name__, val)
+        return val
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/raw_building.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/raw_building.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/raw_building.py	(revision 1126)
@@ -0,0 +1,390 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""this module contains a set of functions to create astroid trees from scratch
+(build_* functions) or from living object (object_build_* functions)
+"""
+
+import sys
+import os
+from os.path import abspath
+from inspect import (getargspec, isdatadescriptor, isfunction, ismethod,
+                     ismethoddescriptor, isclass, isbuiltin, ismodule)
+import six
+
+from astroid.node_classes import CONST_CLS
+from astroid.nodes import (Module, Class, Const, const_factory, From,
+                           Function, EmptyNode, Name, Arguments)
+from astroid.bases import BUILTINS, Generator
+from astroid.manager import AstroidManager
+MANAGER = AstroidManager()
+
+_CONSTANTS = tuple(CONST_CLS) # the keys of CONST_CLS eg python builtin types
+_JYTHON = os.name == 'java'
+_BUILTINS = vars(six.moves.builtins)
+
+def _io_discrepancy(member):
+    # _io module names itself `io`: http://bugs.python.org/issue18602
+    member_self = getattr(member, '__self__', None)
+    return (member_self and
+            ismodule(member_self) and
+            member_self.__name__ == '_io' and
+            member.__module__ == 'io')
+
+def _attach_local_node(parent, node, name):
+    node.name = name # needed by add_local_node
+    parent.add_local_node(node)
+
+
+def _add_dunder_class(func, member):
+    """Add a __class__ member to the given func node, if we can determine it."""
+    python_cls = member.__class__
+    cls_name = getattr(python_cls, '__name__', None)
+    if not cls_name:
+        return
+    bases = [ancestor.__name__ for ancestor in python_cls.__bases__]
+    ast_klass = build_class(cls_name, bases, python_cls.__doc__)
+    func._instance_attrs['__class__'] = [ast_klass]
+
+
+_marker = object()
+
+def attach_dummy_node(node, name, object=_marker):
+    """create a dummy node and register it in the locals of the given
+    node with the specified name
+    """
+    enode = EmptyNode()
+    enode.object = object
+    _attach_local_node(node, enode, name)
+
+def _has_underlying_object(self):
+    return hasattr(self, 'object') and self.object is not _marker
+
+EmptyNode.has_underlying_object = _has_underlying_object
+
+def attach_const_node(node, name, value):
+    """create a Const node and register it in the locals of the given
+    node with the specified name
+    """
+    if not name in node.special_attributes:
+        _attach_local_node(node, const_factory(value), name)
+
+def attach_import_node(node, modname, membername):
+    """create a From node and register it in the locals of the given
+    node with the specified name
+    """
+    from_node = From(modname, [(membername, None)])
+    _attach_local_node(node, from_node, membername)
+
+
+def build_module(name, doc=None):
+    """create and initialize a astroid Module node"""
+    node = Module(name, doc, pure_python=False)
+    node.package = False
+    node.parent = None
+    return node
+
+def build_class(name, basenames=(), doc=None):
+    """create and initialize a astroid Class node"""
+    node = Class(name, doc)
+    for base in basenames:
+        basenode = Name()
+        basenode.name = base
+        node.bases.append(basenode)
+        basenode.parent = node
+    return node
+
+def build_function(name, args=None, defaults=None, flag=0, doc=None):
+    """create and initialize a astroid Function node"""
+    args, defaults = args or [], defaults or []
+    # first argument is now a list of decorators
+    func = Function(name, doc)
+    func.args = argsnode = Arguments()
+    argsnode.args = []
+    for arg in args:
+        argsnode.args.append(Name())
+        argsnode.args[-1].name = arg
+        argsnode.args[-1].parent = argsnode
+    argsnode.defaults = []
+    for default in defaults:
+        argsnode.defaults.append(const_factory(default))
+        argsnode.defaults[-1].parent = argsnode
+    argsnode.kwarg = None
+    argsnode.vararg = None
+    argsnode.parent = func
+    if args:
+        register_arguments(func)
+    return func
+
+
+def build_from_import(fromname, names):
+    """create and initialize an astroid From import statement"""
+    return From(fromname, [(name, None) for name in names])
+
+def register_arguments(func, args=None):
+    """add given arguments to local
+
+    args is a list that may contains nested lists
+    (i.e. def func(a, (b, c, d)): ...)
+    """
+    if args is None:
+        args = func.args.args
+        if func.args.vararg:
+            func.set_local(func.args.vararg, func.args)
+        if func.args.kwarg:
+            func.set_local(func.args.kwarg, func.args)
+    for arg in args:
+        if isinstance(arg, Name):
+            func.set_local(arg.name, arg)
+        else:
+            register_arguments(func, arg.elts)
+
+def object_build_class(node, member, localname):
+    """create astroid for a living class object"""
+    basenames = [base.__name__ for base in member.__bases__]
+    return _base_class_object_build(node, member, basenames,
+                                    localname=localname)
+
+def object_build_function(node, member, localname):
+    """create astroid for a living function object"""
+    args, varargs, varkw, defaults = getargspec(member)
+    if varargs is not None:
+        args.append(varargs)
+    if varkw is not None:
+        args.append(varkw)
+    func = build_function(getattr(member, '__name__', None) or localname, args,
+                          defaults, six.get_function_code(member).co_flags, member.__doc__)
+    node.add_local_node(func, localname)
+
+def object_build_datadescriptor(node, member, name):
+    """create astroid for a living data descriptor object"""
+    return _base_class_object_build(node, member, [], name)
+
+def object_build_methoddescriptor(node, member, localname):
+    """create astroid for a living method descriptor object"""
+    # FIXME get arguments ?
+    func = build_function(getattr(member, '__name__', None) or localname,
+                          doc=member.__doc__)
+    # set node's arguments to None to notice that we have no information, not
+    # and empty argument list
+    func.args.args = None
+    node.add_local_node(func, localname)
+    _add_dunder_class(func, member)
+
+def _base_class_object_build(node, member, basenames, name=None, localname=None):
+    """create astroid for a living class object, with a given set of base names
+    (e.g. ancestors)
+    """
+    klass = build_class(name or getattr(member, '__name__', None) or localname,
+                        basenames, member.__doc__)
+    klass._newstyle = isinstance(member, type)
+    node.add_local_node(klass, localname)
+    try:
+        # limit the instantiation trick since it's too dangerous
+        # (such as infinite test execution...)
+        # this at least resolves common case such as Exception.args,
+        # OSError.errno
+        if issubclass(member, Exception):
+            instdict = member().__dict__
+        else:
+            raise TypeError
+    except:
+        pass
+    else:
+        for name, obj in instdict.items():
+            valnode = EmptyNode()
+            valnode.object = obj
+            valnode.parent = klass
+            valnode.lineno = 1
+            klass._instance_attrs[name] = [valnode]
+    return klass
+
+
+
+
+class InspectBuilder(object):
+    """class for building nodes from living object
+
+    this is actually a really minimal representation, including only Module,
+    Function and Class nodes and some others as guessed.
+    """
+
+    # astroid from living objects ###############################################
+
+    def __init__(self):
+        self._done = {}
+        self._module = None
+
+    def inspect_build(self, module, modname=None, path=None):
+        """build astroid from a living module (i.e. using inspect)
+        this is used when there is no python source code available (either
+        because it's a built-in module or because the .py is not available)
+        """
+        self._module = module
+        if modname is None:
+            modname = module.__name__
+        try:
+            node = build_module(modname, module.__doc__)
+        except AttributeError:
+            # in jython, java modules have no __doc__ (see #109562)
+            node = build_module(modname)
+        node.source_file = path and abspath(path) or path
+        node.name = modname
+        MANAGER.cache_module(node)
+        node.package = hasattr(module, '__path__')
+        self._done = {}
+        self.object_build(node, module)
+        return node
+
+    def object_build(self, node, obj):
+        """recursive method which create a partial ast from real objects
+         (only function, class, and method are handled)
+        """
+        if obj in self._done:
+            return self._done[obj]
+        self._done[obj] = node
+        for name in dir(obj):
+            try:
+                member = getattr(obj, name)
+            except AttributeError:
+                # damned ExtensionClass.Base, I know you're there !
+                attach_dummy_node(node, name)
+                continue
+            if ismethod(member):
+                member = six.get_method_function(member)
+            if isfunction(member):
+                # verify this is not an imported function
+                filename = getattr(six.get_function_code(member),
+                                   'co_filename', None)
+                if filename is None:
+                    assert isinstance(member, object)
+                    object_build_methoddescriptor(node, member, name)
+                elif filename != getattr(self._module, '__file__', None):
+                    attach_dummy_node(node, name, member)
+                else:
+                    object_build_function(node, member, name)
+            elif isbuiltin(member):
+                if (not _io_discrepancy(member) and
+                        self.imported_member(node, member, name)):
+                    continue
+                object_build_methoddescriptor(node, member, name)
+            elif isclass(member):
+                if self.imported_member(node, member, name):
+                    continue
+                if member in self._done:
+                    class_node = self._done[member]
+                    if not class_node in node._locals.get(name, ()):
+                        node.add_local_node(class_node, name)
+                else:
+                    class_node = object_build_class(node, member, name)
+                    # recursion
+                    self.object_build(class_node, member)
+                if name == '__class__' and class_node.parent is None:
+                    class_node.parent = self._done[self._module]
+            elif ismethoddescriptor(member):
+                assert isinstance(member, object)
+                object_build_methoddescriptor(node, member, name)
+            elif isdatadescriptor(member):
+                assert isinstance(member, object)
+                object_build_datadescriptor(node, member, name)
+            elif type(member) in _CONSTANTS:
+                attach_const_node(node, name, member)
+            else:
+                # create an empty node so that the name is actually defined
+                attach_dummy_node(node, name, member)
+
+    def imported_member(self, node, member, name):
+        """verify this is not an imported class or handle it"""
+        # /!\ some classes like ExtensionClass doesn't have a __module__
+        # attribute ! Also, this may trigger an exception on badly built module
+        # (see http://www.logilab.org/ticket/57299 for instance)
+        try:
+            modname = getattr(member, '__module__', None)
+        except:
+            # XXX use logging
+            print('unexpected error while building astroid from living object')
+            import traceback
+            traceback.print_exc()
+            modname = None
+        if modname is None:
+            if (name in ('__new__', '__subclasshook__')
+                    or (name in _BUILTINS and _JYTHON)):
+                # Python 2.5.1 (r251:54863, Sep  1 2010, 22:03:14)
+                # >>> print object.__new__.__module__
+                # None
+                modname = BUILTINS
+            else:
+                attach_dummy_node(node, name, member)
+                return True
+
+        real_name = {
+            'gtk': 'gtk_gtk',
+            '_io': 'io',
+        }.get(modname, modname)
+
+        if real_name != self._module.__name__:
+            # check if it sounds valid and then add an import node, else use a
+            # dummy node
+            try:
+                getattr(sys.modules[modname], name)
+            except (KeyError, AttributeError):
+                attach_dummy_node(node, name, member)
+            else:
+                attach_import_node(node, modname, name)
+            return True
+        return False
+
+
+### astroid bootstrapping ######################################################
+Astroid_BUILDER = InspectBuilder()
+
+_CONST_PROXY = {}
+def _astroid_bootstrapping(astroid_builtin=None):
+    """astroid boot strapping the builtins module"""
+    # this boot strapping is necessary since we need the Const nodes to
+    # inspect_build builtins, and then we can proxy Const
+    if astroid_builtin is None:
+        from six.moves import builtins
+        astroid_builtin = Astroid_BUILDER.inspect_build(builtins)
+
+    for cls, node_cls in CONST_CLS.items():
+        if cls is type(None):
+            proxy = build_class('NoneType')
+            proxy.parent = astroid_builtin
+        elif cls is type(NotImplemented):
+            proxy = build_class('NotImplementedType')
+            proxy.parent = astroid_builtin
+        else:
+            proxy = astroid_builtin.getattr(cls.__name__)[0]
+        if cls in (dict, list, set, tuple):
+            node_cls._proxied = proxy
+        else:
+            _CONST_PROXY[cls] = proxy
+
+_astroid_bootstrapping()
+
+# TODO : find a nicer way to handle this situation;
+# However __proxied introduced an
+# infinite recursion (see https://bugs.launchpad.net/pylint/+bug/456870)
+def _set_proxied(const):
+    return _CONST_PROXY[const.value.__class__]
+Const._proxied = property(_set_proxied)
+
+from types import GeneratorType
+Generator._proxied = Class(GeneratorType.__name__, GeneratorType.__doc__)
+Astroid_BUILDER.object_build(Generator._proxied, GeneratorType)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/mixins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/mixins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/mixins.py	(revision 1126)
@@ -0,0 +1,147 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""This module contains some mixins for the different nodes.
+"""
+
+import warnings
+
+from astroid import decorators
+from astroid import exceptions
+
+
+class BlockRangeMixIn(object):
+    """override block range """
+
+    @decorators.cachedproperty
+    def blockstart_tolineno(self):
+        return self.lineno
+
+    def _elsed_block_range(self, lineno, orelse, last=None):
+        """handle block line numbers range for try/finally, for, if and while
+        statements
+        """
+        if lineno == self.fromlineno:
+            return lineno, lineno
+        if orelse:
+            if lineno >= orelse[0].fromlineno:
+                return lineno, orelse[-1].tolineno
+            return lineno, orelse[0].fromlineno - 1
+        return lineno, last or self.tolineno
+
+
+class FilterStmtsMixin(object):
+    """Mixin for statement filtering and assignment type"""
+
+    def _get_filtered_stmts(self, _, node, _stmts, mystmt):
+        """method used in _filter_stmts to get statemtents and trigger break"""
+        if self.statement() is mystmt:
+            # original node's statement is the assignment, only keep
+            # current node (gen exp, list comp)
+            return [node], True
+        return _stmts, False
+
+    def assign_type(self):
+        return self
+
+    def ass_type(self):
+        warnings.warn('%s.ass_type() is deprecated and slated for removal '
+                      'in astroid 2.0, use %s.assign_type() instead.'
+                      % (type(self).__name__, type(self).__name__),
+                      PendingDeprecationWarning, stacklevel=2)
+        return self.assign_type()
+
+
+class AssignTypeMixin(object):
+
+    def assign_type(self):
+        return self
+
+    def ass_type(self):
+        warnings.warn('%s.ass_type() is deprecated and slated for removal '
+                      'in astroid 2.0, use %s.assign_type() instead.'
+                      % (type(self).__name__, type(self).__name__),
+                      PendingDeprecationWarning, stacklevel=2)
+        return self.assign_type()
+
+    def _get_filtered_stmts(self, lookup_node, node, _stmts, mystmt):
+        """method used in filter_stmts"""
+        if self is mystmt:
+            return _stmts, True
+        if self.statement() is mystmt:
+            # original node's statement is the assignment, only keep
+            # current node (gen exp, list comp)
+            return [node], True
+        return _stmts, False
+
+
+class ParentAssignTypeMixin(AssignTypeMixin):
+
+    def assign_type(self):
+        return self.parent.assign_type()
+
+    def ass_type(self):
+        warnings.warn('%s.ass_type() is deprecated and slated for removal '
+                      'in astroid 2.0, use %s.assign_type() instead.'
+                      % (type(self).__name__, type(self).__name__),
+                      PendingDeprecationWarning, stacklevel=2)
+        return self.assign_type()
+
+
+class ImportFromMixin(FilterStmtsMixin):
+    """MixIn for From and Import Nodes"""
+
+    def _infer_name(self, frame, name):
+        return name
+
+    def do_import_module(self, modname=None):
+        """return the ast for a module whose name is <modname> imported by <self>
+        """
+        # handle special case where we are on a package node importing a module
+        # using the same name as the package, which may end in an infinite loop
+        # on relative imports
+        # XXX: no more needed ?
+        mymodule = self.root()
+        level = getattr(self, 'level', None) # Import as no level
+        if modname is None:
+            modname = self.modname
+        # XXX we should investigate deeper if we really want to check
+        # importing itself: modname and mymodule.name be relative or absolute
+        if mymodule.relative_to_absolute_name(modname, level) == mymodule.name:
+            # FIXME: we used to raise InferenceError here, but why ?
+            return mymodule
+        try:
+            return mymodule.import_module(modname, level=level,
+                                          relative_only=level and level >= 1)
+        except exceptions.AstroidBuildingException as ex:
+            if isinstance(ex.args[0], SyntaxError):
+                raise exceptions.InferenceError(str(ex))
+            raise exceptions.InferenceError(modname)
+        except SyntaxError as ex:
+            raise exceptions.InferenceError(str(ex))
+
+    def real_name(self, asname):
+        """get name from 'as' name"""
+        for name, _asname in self.names:
+            if name == '*':
+                return asname
+            if not _asname:
+                name = name.split('.', 1)[0]
+                _asname = name
+            if asname == _asname:
+                return name
+        raise exceptions.NotFoundError(asname)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/nodes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/nodes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/nodes.py	(revision 1126)
@@ -0,0 +1,87 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""
+on all nodes :
+ .is_statement, returning true if the node should be considered as a
+  statement node
+ .root(), returning the root node of the tree (i.e. a Module)
+ .previous_sibling(), returning previous sibling statement node
+ .next_sibling(), returning next sibling statement node
+ .statement(), returning the first parent node marked as statement node
+ .frame(), returning the first node defining a new local scope (i.e.
+  Module, FunctionDef or ClassDef)
+ .set_local(name, node), define an identifier <name> on the first parent frame,
+  with the node defining it. This is used by the astroid builder and should not
+  be used from out there.
+
+on ImportFrom and Import :
+ .real_name(name),
+
+
+"""
+# pylint: disable=unused-import,redefined-builtin
+
+from astroid.node_classes import (
+    Arguments, AssignAttr, Assert, Assign,
+    AssignName, AugAssign, Repr, BinOp, BoolOp, Break, Call, Compare,
+    Comprehension, Const, Continue, Decorators, DelAttr, DelName, Delete,
+    Dict, Expr, Ellipsis, EmptyNode, ExceptHandler, Exec, ExtSlice, For,
+    ImportFrom, Attribute, Global, If, IfExp, Import, Index, Keyword,
+    List, Name, Nonlocal, Pass, Print, Raise, Return, Set, Slice, Starred, Subscript,
+    TryExcept, TryFinally, Tuple, UnaryOp, While, With, Yield, YieldFrom,
+    const_factory,
+    AsyncFor, Await, AsyncWith,
+    # Backwards-compatibility aliases
+    Backquote, Discard, AssName, AssAttr, Getattr, CallFunc, From,
+    # Node not present in the builtin ast module.
+    DictUnpack,
+)
+from astroid.scoped_nodes import (
+    Module, GeneratorExp, Lambda, DictComp,
+    ListComp, SetComp, FunctionDef, ClassDef,
+    AsyncFunctionDef,
+    # Backwards-compatibility aliases
+    Class, Function, GenExpr,
+)
+
+
+
+ALL_NODE_CLASSES = (
+    AsyncFunctionDef, AsyncFor, AsyncWith, Await,
+
+    Arguments, AssignAttr, Assert, Assign, AssignName, AugAssign,
+    Repr, BinOp, BoolOp, Break,
+    Call, ClassDef, Compare, Comprehension, Const, Continue,
+    Decorators, DelAttr, DelName, Delete,
+    Dict, DictComp, DictUnpack, Expr,
+    Ellipsis, EmptyNode, ExceptHandler, Exec, ExtSlice,
+    For, ImportFrom, FunctionDef,
+    Attribute, GeneratorExp, Global,
+    If, IfExp, Import, Index,
+    Keyword,
+    Lambda, List, ListComp,
+    Name, Nonlocal,
+    Module,
+    Pass, Print,
+    Raise, Return,
+    Set, SetComp, Slice, Starred, Subscript,
+    TryExcept, TryFinally, Tuple,
+    UnaryOp,
+    While, With,
+    Yield, YieldFrom,
+    )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/astpeephole.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/astpeephole.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/astpeephole.py	(revision 1126)
@@ -0,0 +1,86 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""Small AST optimizations."""
+
+import _ast
+
+from astroid import nodes
+
+
+__all__ = ('ASTPeepholeOptimizer', )
+
+
+try:
+    _TYPES = (_ast.Str, _ast.Bytes)
+except AttributeError:
+    _TYPES = (_ast.Str, )
+
+
+class ASTPeepholeOptimizer(object):
+    """Class for applying small optimizations to generate new AST."""
+
+    def optimize_binop(self, node):
+        """Optimize BinOps with string Const nodes on the lhs.
+
+        This fixes an infinite recursion crash, where multiple
+        strings are joined using the addition operator. With a
+        sufficient number of such strings, astroid will fail
+        with a maximum recursion limit exceeded. The
+        function will return a Const node with all the strings
+        already joined.
+        Return ``None`` if no AST node can be obtained
+        through optimization.
+        """
+        ast_nodes = []
+        current = node
+        while isinstance(current, _ast.BinOp):
+            # lhs must be a BinOp with the addition operand.
+            if not isinstance(current.left, _ast.BinOp):
+                return
+            if (not isinstance(current.left.op, _ast.Add)
+                    or not isinstance(current.op, _ast.Add)):
+                return
+
+            # rhs must a str / bytes.
+            if not isinstance(current.right, _TYPES):
+                return
+
+            ast_nodes.append(current.right.s)
+            current = current.left
+
+            if (isinstance(current, _ast.BinOp)
+                    and isinstance(current.left, _TYPES)
+                    and isinstance(current.right, _TYPES)):
+                # Stop early if we are at the last BinOp in
+                # the operation
+                ast_nodes.append(current.right.s)
+                ast_nodes.append(current.left.s)
+                break
+
+        if not ast_nodes:
+            return
+
+        # If we have inconsistent types, bail out.
+        known = type(ast_nodes[0])
+        if any(type(element) is not known
+               for element in ast_nodes[1:]):
+            return
+
+        value = known().join(reversed(ast_nodes))
+        newnode = nodes.Const(value)
+        return newnode
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/manager.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/manager.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/manager.py	(revision 1126)
@@ -0,0 +1,270 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""astroid manager: avoid multiple astroid build of a same module when
+possible by providing a class responsible to get astroid representation
+from various source and using a cache of built modules)
+"""
+from __future__ import print_function
+
+import imp
+import os
+import zipimport
+
+from astroid import exceptions
+from astroid import modutils
+from astroid import transforms
+
+
+def safe_repr(obj):
+    try:
+        return repr(obj)
+    except Exception: # pylint: disable=broad-except
+        return '???'
+
+
+class AstroidManager(object):
+    """the astroid manager, responsible to build astroid from files
+     or modules.
+
+    Use the Borg pattern.
+    """
+
+    name = 'astroid loader'
+    brain = {}
+
+    def __init__(self):
+        self.__dict__ = AstroidManager.brain
+        if not self.__dict__:
+            # NOTE: cache entries are added by the [re]builder
+            self.astroid_cache = {}
+            self._mod_file_cache = {}
+            self._failed_import_hooks = []
+            self.always_load_extensions = False
+            self.optimize_ast = False
+            self.extension_package_whitelist = set()
+            self._transform = transforms.TransformVisitor()
+
+            # Export these APIs for convenience
+            self.register_transform = self._transform.register_transform
+            self.unregister_transform = self._transform.unregister_transform
+
+    def visit_transforms(self, node):
+        """Visit the transforms and apply them to the given *node*."""
+        return self._transform.visit(node)
+
+    def ast_from_file(self, filepath, modname=None, fallback=True, source=False):
+        """given a module name, return the astroid object"""
+        try:
+            filepath = modutils.get_source_file(filepath, include_no_ext=True)
+            source = True
+        except modutils.NoSourceFile:
+            pass
+        if modname is None:
+            try:
+                modname = '.'.join(modutils.modpath_from_file(filepath))
+            except ImportError:
+                modname = filepath
+        if modname in self.astroid_cache and self.astroid_cache[modname].source_file == filepath:
+            return self.astroid_cache[modname]
+	if getattr(filepath,"source_code",None)!=None:
+	  from astroid.builder import parse
+	  return parse(filepath.source_code,modname,filepath)
+        if source:
+            from astroid.builder import AstroidBuilder
+            return AstroidBuilder(self).file_build(filepath, modname)
+        elif fallback and modname:
+            return self.ast_from_module_name(modname)
+        raise exceptions.AstroidBuildingException(
+            'unable to get astroid for file %s' % filepath)
+
+    def _build_stub_module(self, modname):
+        from astroid.builder import AstroidBuilder
+        return AstroidBuilder(self).string_build('', modname)
+
+    def _can_load_extension(self, modname):
+        if self.always_load_extensions:
+            return True
+        if modutils.is_standard_module(modname):
+            return True
+        parts = modname.split('.')
+        return any(
+            '.'.join(parts[:x]) in self.extension_package_whitelist
+            for x in range(1, len(parts) + 1))
+
+    def ast_from_module_name(self, modname, context_file=None):
+        """given a module name, return the astroid object"""
+        if modname in self.astroid_cache:
+            return self.astroid_cache[modname]
+        if modname == '__main__':
+            return self._build_stub_module(modname)
+        old_cwd = os.getcwd()
+        if context_file:
+            os.chdir(os.path.dirname(context_file))
+        try:
+            filepath, mp_type = self.file_from_module_name(modname, context_file)
+            if mp_type == modutils.PY_ZIPMODULE:
+                module = self.zip_import_data(filepath)
+                if module is not None:
+                    return module
+            elif mp_type in (imp.C_BUILTIN, imp.C_EXTENSION):
+                if mp_type == imp.C_EXTENSION and not self._can_load_extension(modname):
+                    return self._build_stub_module(modname)
+                try:
+                    module = modutils.load_module_from_name(modname)
+                except Exception as ex:
+                    msg = 'Unable to load module %s (%s)' % (modname, ex)
+                    raise exceptions.AstroidBuildingException(msg)
+                return self.ast_from_module(module, modname)
+            elif mp_type == imp.PY_COMPILED:
+                msg = "Unable to load compiled module %s" % (modname,)
+                raise exceptions.AstroidBuildingException(msg)
+            if filepath is None:
+                msg = "Unable to load module %s" % (modname,)
+                raise exceptions.AstroidBuildingException(msg)
+            return self.ast_from_file(filepath, modname, fallback=False)
+        except exceptions.AstroidBuildingException as e:
+            for hook in self._failed_import_hooks:
+                try:
+                    return hook(modname)
+                except exceptions.AstroidBuildingException:
+                    pass
+            raise e
+        finally:
+            os.chdir(old_cwd)
+
+    def zip_import_data(self, filepath):
+        if zipimport is None:
+            return None
+        from astroid.builder import AstroidBuilder
+        builder = AstroidBuilder(self)
+        for ext in ('.zip', '.egg'):
+            try:
+                eggpath, resource = filepath.rsplit(ext + os.path.sep, 1)
+            except ValueError:
+                continue
+            try:
+                importer = zipimport.zipimporter(eggpath + ext)
+                zmodname = resource.replace(os.path.sep, '.')
+                if importer.is_package(resource):
+                    zmodname = zmodname + '.__init__'
+                module = builder.string_build(importer.get_source(resource),
+                                              zmodname, filepath)
+                return module
+            except Exception: # pylint: disable=broad-except
+                continue
+        return None
+
+    def file_from_module_name(self, modname, contextfile):
+        # pylint: disable=redefined-variable-type
+        try:
+            value = self._mod_file_cache[(modname, contextfile)]
+        except KeyError:
+            try:
+                value = modutils.file_info_from_modpath(
+                    modname.split('.'), context_file=contextfile)
+            except ImportError as ex:
+                msg = 'Unable to load module %s (%s)' % (modname, ex)
+                value = exceptions.AstroidBuildingException(msg)
+            self._mod_file_cache[(modname, contextfile)] = value
+        if isinstance(value, exceptions.AstroidBuildingException):
+            raise value
+        return value
+
+    def ast_from_module(self, module, modname=None):
+        """given an imported module, return the astroid object"""
+        modname = modname or module.__name__
+        if modname in self.astroid_cache:
+            return self.astroid_cache[modname]
+        try:
+            # some builtin modules don't have __file__ attribute
+            filepath = module.__file__
+            if modutils.is_python_source(filepath):
+                return self.ast_from_file(filepath, modname)
+        except AttributeError:
+            pass
+        from astroid.builder import AstroidBuilder
+        return AstroidBuilder(self).module_build(module, modname)
+
+    def ast_from_class(self, klass, modname=None):
+        """get astroid for the given class"""
+        if modname is None:
+            try:
+                modname = klass.__module__
+            except AttributeError:
+                msg = 'Unable to get module for class %s' % safe_repr(klass)
+                raise exceptions.AstroidBuildingException(msg)
+        modastroid = self.ast_from_module_name(modname)
+        return modastroid.getattr(klass.__name__)[0] # XXX
+
+    def infer_ast_from_something(self, obj, context=None):
+        """infer astroid for the given class"""
+        if hasattr(obj, '__class__') and not isinstance(obj, type):
+            klass = obj.__class__
+        else:
+            klass = obj
+        try:
+            modname = klass.__module__
+        except AttributeError:
+            msg = 'Unable to get module for %s' % safe_repr(klass)
+            raise exceptions.AstroidBuildingException(msg)
+        except Exception as ex:
+            msg = ('Unexpected error while retrieving module for %s: %s'
+                   % (safe_repr(klass), ex))
+            raise exceptions.AstroidBuildingException(msg)
+        try:
+            name = klass.__name__
+        except AttributeError:
+            msg = 'Unable to get name for %s' % safe_repr(klass)
+            raise exceptions.AstroidBuildingException(msg)
+        except Exception as ex:
+            exc = ('Unexpected error while retrieving name for %s: %s'
+                   % (safe_repr(klass), ex))
+            raise exceptions.AstroidBuildingException(exc)
+        # take care, on living object __module__ is regularly wrong :(
+        modastroid = self.ast_from_module_name(modname)
+        if klass is obj:
+            for inferred in modastroid.igetattr(name, context):
+                yield inferred
+        else:
+            for inferred in modastroid.igetattr(name, context):
+                yield inferred.instantiate_class()
+
+    def register_failed_import_hook(self, hook):
+        """Registers a hook to resolve imports that cannot be found otherwise.
+
+        `hook` must be a function that accepts a single argument `modname` which
+        contains the name of the module or package that could not be imported.
+        If `hook` can resolve the import, must return a node of type `astroid.Module`,
+        otherwise, it must raise `AstroidBuildingException`.
+        """
+        self._failed_import_hooks.append(hook)
+
+    def cache_module(self, module):
+        """Cache a module if no module with the same name is known yet."""
+        self.astroid_cache.setdefault(module.name, module)
+
+    def clear_cache(self, astroid_builtin=None):
+        # XXX clear transforms
+        self.astroid_cache.clear()
+        # force bootstrap again, else we may ends up with cache inconsistency
+        # between the manager and CONST_PROXY, making
+        # unittest_lookup.LookupTC.test_builtin_lookup fail depending on the
+        # test order
+        import astroid.raw_building
+        astroid.raw_building._astroid_bootstrapping(
+            astroid_builtin=astroid_builtin)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/noendingnewline.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/noendingnewline.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/noendingnewline.py	(revision 1126)
@@ -0,0 +1,36 @@
+import unittest
+
+
+class TestCase(unittest.TestCase):
+
+    def setUp(self):
+        unittest.TestCase.setUp(self)
+
+
+    def tearDown(self):
+        unittest.TestCase.tearDown(self)
+
+    def testIt(self):
+        self.a = 10
+        self.xxx()
+
+
+    def xxx(self):
+        if False:
+            pass
+            print('a')
+
+        if False:
+            pass
+            pass
+
+        if False:
+            pass
+            print('rara')
+
+
+if __name__ == '__main__':
+    print('test2')
+    unittest.main()
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/clientmodule_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/clientmodule_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/clientmodule_test.py	(revision 1126)
@@ -0,0 +1,32 @@
+""" docstring for file clientmodule.py """
+from data.suppliermodule_test import Interface as IFace, DoNothing
+
+class Toto: pass
+
+class Ancestor:
+    """ Ancestor method """
+    __implements__ = (IFace,)
+
+    def __init__(self, value):
+        local_variable = 0
+        self.attr = 'this method shouldn\'t have a docstring'
+        self.__value = value
+
+    def get_value(self):
+        """ nice docstring ;-) """
+        return self.__value
+
+    def set_value(self, value):
+        self.__value = value
+        return 'this method shouldn\'t have a docstring'
+
+class Specialization(Ancestor):
+    TYPE = 'final class'
+    top = 'class'
+
+    def __init__(self, value, _id):
+        Ancestor.__init__(self, value)
+        self._id = _id
+        self.relation = DoNothing()
+        self.toto = Toto()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/string.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/string.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/string.py	(revision 1126)
@@ -0,0 +1,3 @@
+from __future__ import absolute_import, print_function
+import string
+print(string)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/sidepackage/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/sidepackage/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/sidepackage/__init__.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""a side package with nothing in it
+"""
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimp/__init__.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""a package with absolute import activated
+"""
+
+from __future__ import absolute_import
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module.py	(revision 1126)
@@ -0,0 +1,88 @@
+"""test module for astroid
+"""
+
+__revision__ = '$Id: module.py,v 1.2 2005-11-02 11:56:54 syt Exp $'
+from astroid.node_classes import Name as NameNode
+from astroid import modutils
+from astroid.utils import *
+import os.path
+MY_DICT = {}
+
+def global_access(key, val):
+    """function test"""
+    local = 1
+    MY_DICT[key] = val
+    for i in val:
+        if i:
+            del MY_DICT[i]
+            continue
+        else:
+            break
+    else:
+        return
+
+
+class YO:
+    """hehe"""
+    a = 1
+    
+    def __init__(self):
+        try:
+            self.yo = 1
+        except ValueError as ex:
+            pass
+        except (NameError, TypeError):
+            raise XXXError()
+        except:
+            raise
+
+
+
+class YOUPI(YO):
+    class_attr = None
+    
+    def __init__(self):
+        self.member = None
+    
+    def method(self):
+        """method test"""
+        global MY_DICT
+        try:
+            MY_DICT = {}
+            local = None
+            autre = [a for (a, b) in MY_DICT if b]
+            if b in autre:
+                return
+            else:
+                if a in autre:
+                    return 'hehe'
+            global_access(local, val=autre)
+        finally:
+            return local
+    
+    def static_method():
+        """static method test"""
+        assert MY_DICT, '???'
+    static_method = staticmethod(static_method)
+    
+    def class_method(cls):
+        """class method test"""
+        exec(a, b)
+    class_method = classmethod(class_method)
+
+
+def four_args(a, b, c, d):
+    """four arguments (was nested_args)"""
+    while 1:
+        if a:
+            break
+        a += +1
+    else:
+        b += -2
+    if c:
+        d = ((a) and (b)) or (c)
+    else:
+        c = ((a) and (b)) or (d)
+    list(map(lambda x, y: (y, x), a))
+redirect = four_args
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/email.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/email.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/email.py	(revision 1126)
@@ -0,0 +1 @@
+"""fake email module to test absolute import doesn't grab this one"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/find_test/noendingnewline.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/find_test/module.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/find_test/module2.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/find_test/nonregr.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/find_test/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/format.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/format.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/format.py	(revision 1126)
@@ -0,0 +1,34 @@
+"""A multiline string
+"""
+
+function('aeozrijz\
+earzer', hop)
+# XXX write test
+x = [i for i in range(5)
+     if i % 4]
+
+fonction(1,
+         2,
+         3,
+         4)
+
+def definition(a,
+               b,
+               c):
+    return a + b + c
+
+class debile(dict,
+             object):
+    pass
+
+if aaaa: pass
+else:
+    aaaa,bbbb = 1,2
+    aaaa,bbbb = bbbb,aaaa
+# XXX write test
+hop = \
+    aaaa
+
+
+__revision__.lower();
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/notall.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/notall.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/notall.py	(revision 1126)
@@ -0,0 +1,8 @@
+
+name = 'a'
+_bla = 2
+other = 'o'
+class Aaa: pass
+
+def func(): print('yo')
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/SSL1/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/SSL1/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/SSL1/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+from .Connection1 import Connection
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/SSL1/Connection1.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/SSL1/Connection1.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/SSL1/Connection1.py	(revision 1126)
@@ -0,0 +1,14 @@
+"""M2Crypto.SSL.Connection
+
+Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved."""
+
+RCS_id='$Id: Connection1.py,v 1.1 2005-06-13 20:55:22 syt Exp $'
+
+#Some code deleted here
+
+class Connection:
+
+    """An SSL connection."""
+
+    def __init__(self, ctx, sock=None):
+        print('init Connection')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/MyPyPa-0.1.0-py2.5.egg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/MyPyPa-0.1.0-py2.5.egg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/MyPyPa-0.1.0-py2.5.zip
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/MyPyPa-0.1.0-py2.5.zip
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/descriptor_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/descriptor_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/descriptor_crash.py	(revision 1126)
@@ -0,0 +1,11 @@
+
+import urllib
+
+class Page(object):
+    _urlOpen = staticmethod(urllib.urlopen)
+
+    def getPage(self, url):
+        handle = self._urlOpen(url)
+        data = handle.read()
+        handle.close()
+        return data
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+__revision__="$Id: __init__.py,v 1.1 2005-06-13 20:55:20 syt Exp $"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimport.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimport.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/absimport.py	(revision 1126)
@@ -0,0 +1,3 @@
+
+import email
+from email import message
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/subpackage/module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/subpackage/module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/subpackage/module.py	(revision 1126)
@@ -0,0 +1 @@
+"""package.subpackage.module"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/subpackage/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/subpackage/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/subpackage/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+"""package.subpackage"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/__init__.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""package's __init__ file"""
+
+
+from . import subpackage
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/import_package_subpackage_module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/import_package_subpackage_module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/import_package_subpackage_module.py	(revision 1126)
@@ -0,0 +1,49 @@
+# pylint: disable-msg=I0011,C0301,W0611
+"""I found some of my scripts trigger off an AttributeError in pylint
+0.8.1 (with common 0.12.0 and astroid 0.13.1).
+
+Traceback (most recent call last):
+  File "/usr/bin/pylint", line 4, in ?
+    lint.Run(sys.argv[1:])
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 729, in __init__
+    linter.check(args)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 412, in check
+    self.check_file(filepath, modname, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 426, in check_file
+    astroid = self._check_file(filepath, modname, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 450, in _check_file
+    self.check_astroid_module(astroid, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 494, in check_astroid_module
+    self.astroid_events(astroid, [checker for checker in checkers
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 511, in astroid_events
+    self.astroid_events(child, checkers, _reversed_checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 511, in astroid_events
+    self.astroid_events(child, checkers, _reversed_checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 508, in astroid_events
+    checker.visit(astroid)
+  File "/usr/lib/python2.4/site-packages/logilab/astroid/utils.py", line 84, in visit
+    method(node)
+  File "/usr/lib/python2.4/site-packages/pylint/checkers/variables.py", line 295, in visit_import
+    self._check_module_attrs(node, module, name_parts[1:])
+  File "/usr/lib/python2.4/site-packages/pylint/checkers/variables.py", line 357, in _check_module_attrs
+    self.add_message('E0611', args=(name, module.name),
+AttributeError: Import instance has no attribute 'name'
+
+
+You can reproduce it by:
+(1) create package structure like the following:
+
+package/
+        __init__.py
+        subpackage/
+                   __init__.py
+                   module.py
+
+(2) in package/__init__.py write:
+
+import subpackage
+
+(3) run pylint with a script importing package.subpackage.module.
+"""
+__revision__ = '$Id: import_package_subpackage_module.py,v 1.1 2005-11-10 15:59:32 syt Exp $'
+import package.subpackage.module
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/absimport.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/absimport.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/absimport.py	(revision 1126)
@@ -0,0 +1,6 @@
+from __future__ import absolute_import, print_function
+import import_package_subpackage_module # fail
+print(import_package_subpackage_module)
+
+from . import hello as hola
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/hello.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/hello.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/package/hello.py	(revision 1126)
@@ -0,0 +1,2 @@
+"""hello module"""
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/appl/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/appl/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/appl/__init__.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""
+Init
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/appl/myConnection.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/appl/myConnection.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/appl/myConnection.py	(revision 1126)
@@ -0,0 +1,11 @@
+from data import SSL1
+class MyConnection(SSL1.Connection):
+
+    """An SSL connection."""
+
+    def __init__(self, dummy):
+        print('MyConnection init')
+
+if __name__ == '__main__':
+    myConnection = MyConnection(' ')
+    input('Press Enter to continue...')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module1abs/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module1abs/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module1abs/__init__.py	(revision 1126)
@@ -0,0 +1,4 @@
+
+from . import core
+from .core import *
+print(sys.version)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module1abs/core.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module1abs/core.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module1abs/core.py	(revision 1126)
@@ -0,0 +1 @@
+import sys
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/lmfp/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/lmfp/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/lmfp/__init__.py	(revision 1126)
@@ -0,0 +1,2 @@
+# force a "direct" python import
+from . import foo
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/lmfp/foo.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/lmfp/foo.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/lmfp/foo.py	(revision 1126)
@@ -0,0 +1,6 @@
+import sys
+if not getattr(sys, 'bar', None):
+    sys.just_once = []
+# there used to be two numbers here because
+# of a load_module_from_path bug
+sys.just_once.append(42)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/module2.py	(revision 1126)
@@ -0,0 +1,143 @@
+from data.module import YO, YOUPI
+import data
+
+
+class Specialization(YOUPI, YO):
+    pass
+
+
+
+class Metaclass(type):
+    pass
+
+
+
+class Interface:
+    pass
+
+
+
+class MyIFace(Interface):
+    pass
+
+
+
+class AnotherIFace(Interface):
+    pass
+
+
+
+class MyException(Exception):
+    pass
+
+
+
+class MyError(MyException):
+    pass
+
+
+
+class AbstractClass(object):
+    
+    def to_override(self, whatever):
+        raise NotImplementedError()
+    
+    def return_something(self, param):
+        if param:
+            return 'toto'
+        return
+
+
+
+class Concrete0:
+    __implements__ = MyIFace
+
+
+
+class Concrete1:
+    __implements__ = (MyIFace, AnotherIFace)
+
+
+
+class Concrete2:
+    __implements__ = (MyIFace, AnotherIFace)
+
+
+
+class Concrete23(Concrete1):
+    pass
+
+del YO.member
+del YO
+[SYN1, SYN2] = (Concrete0, Concrete1)
+assert repr(1)
+b = (1) | (((2) & (3)) ^ (8))
+bb = ((1) | (two)) | (6)
+ccc = ((one) & (two)) & (three)
+dddd = ((x) ^ (o)) ^ (r)
+exec('c = 3')
+exec('c = 3', {}, {})
+
+def raise_string(a=2, *args, **kwargs):
+    raise Exception('yo')
+    yield 'coucou'
+    yield
+a = (b) + (2)
+c = (b) * (2)
+c = (b) / (2)
+c = (b) // (2)
+c = (b) - (2)
+c = (b) % (2)
+c = (b) ** (2)
+c = (b) << (2)
+c = (b) >> (2)
+c = ~b
+c = not b
+d = [c]
+e = d[:]
+e = d[a:b:c]
+raise_string(*args, **kwargs)
+print('bonjour', file=stream)
+print('salut', end=' ', file=stream)
+
+def make_class(any, base=data.module.YO, *args, **kwargs):
+    """check base is correctly resolved to Concrete0"""
+    
+    
+    class Aaaa(base):
+        """dynamic class"""
+        
+    
+    return Aaaa
+from os.path import abspath
+import os as myos
+
+
+class A:
+    pass
+
+
+
+class A(A):
+    pass
+
+
+def generator():
+    """A generator."""
+    yield
+
+def not_a_generator():
+    """A function that contains generator, but is not one."""
+    
+    def generator():
+        yield
+    genl = lambda : (yield)
+
+def with_metaclass(meta, *bases):
+    return meta('NewBase', bases, {})
+
+
+class NotMetaclass(with_metaclass(Metaclass)):
+    pass
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/all.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/all.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/all.py	(revision 1126)
@@ -0,0 +1,9 @@
+
+name = 'a'
+_bla = 2
+other = 'o'
+class Aaa: pass
+
+def func(): print('yo')
+
+__all__ = 'Aaa', '_bla', 'name'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/suppliermodule_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/suppliermodule_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/suppliermodule_test.py	(revision 1126)
@@ -0,0 +1,13 @@
+""" file suppliermodule.py """
+
+class NotImplemented(Exception):
+    pass
+
+class Interface:
+    def get_value(self):
+        raise NotImplemented()
+
+    def set_value(self, value):
+        raise NotImplemented()
+
+class DoNothing : pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/recursion.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/recursion.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/recursion.py	(revision 1126)
@@ -0,0 +1,3 @@
+""" For issue #25 """
+class Base(object):
+    pass
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/nonregr.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/nonregr.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/nonregr.py	(revision 1126)
@@ -0,0 +1,57 @@
+
+
+try:
+    enumerate = enumerate
+except NameError:
+
+    def enumerate(iterable):
+        """emulates the python2.3 enumerate() function"""
+        i = 0
+        for val in iterable:
+            yield i, val
+            i += 1
+
+def toto(value):
+    for k, v in value:
+        print(v.get('yo'))
+
+
+import imp
+fp, mpath, desc = imp.find_module('optparse',a)
+s_opt = imp.load_module('std_optparse', fp, mpath, desc)
+
+class OptionParser(s_opt.OptionParser):
+
+    def parse_args(self, args=None, values=None, real_optparse=False):
+        if real_optparse:
+            pass
+##          return super(OptionParser, self).parse_args()
+        else:
+            import optcomp
+            optcomp.completion(self)
+
+
+class Aaa(object):
+    """docstring"""
+    def __init__(self):
+        self.__setattr__('a','b')
+        pass
+
+    def one_public(self):
+        """docstring"""
+        pass
+
+    def another_public(self):
+        """docstring"""
+        pass
+
+class Ccc(Aaa):
+    """docstring"""
+
+    class Ddd(Aaa):
+        """docstring"""
+        pass
+
+    class Eee(Ddd):
+        """docstring"""
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/unicode_package/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/unicode_package/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/unicode_package/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+﻿x = "șțîâ"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/unicode_package/core/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/joined_strings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/joined_strings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python3/data/joined_strings.py	(revision 1126)
@@ -0,0 +1,1051 @@
+x = ('R0lGODlhigJnAef/AAABAAEEAAkCAAMGAg0GBAYJBQoMCBMODQ4QDRITEBkS'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7')
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/clientmodule_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/clientmodule_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/clientmodule_test.py	(revision 1126)
@@ -0,0 +1,32 @@
+""" docstring for file clientmodule.py """
+from data.suppliermodule_test import Interface as IFace, DoNothing
+
+class Toto: pass
+
+class Ancestor:
+    """ Ancestor method """
+    __implements__ = (IFace,)
+
+    def __init__(self, value):
+        local_variable = 0
+        self.attr = 'this method shouldn\'t have a docstring'
+        self.__value = value
+
+    def get_value(self):
+        """ nice docstring ;-) """
+        return self.__value
+
+    def set_value(self, value):
+        self.__value = value
+        return 'this method shouldn\'t have a docstring'
+
+class Specialization(Ancestor):
+    TYPE = 'final class'
+    top = 'class'
+
+    def __init__(self, value, _id):
+        Ancestor.__init__(self, value)
+        self._id = _id
+        self.relation = DoNothing()
+        self.toto = Toto()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/noendingnewline.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/noendingnewline.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/noendingnewline.py	(revision 1126)
@@ -0,0 +1,36 @@
+import unittest
+
+
+class TestCase(unittest.TestCase):
+
+    def setUp(self):
+        unittest.TestCase.setUp(self)
+
+
+    def tearDown(self):
+        unittest.TestCase.tearDown(self)
+
+    def testIt(self):
+        self.a = 10
+        self.xxx()
+
+
+    def xxx(self):
+        if False:
+            pass
+            print 'a'
+
+        if False:
+            pass
+            pass
+
+        if False:
+            pass
+            print 'rara'
+
+
+if __name__ == '__main__':
+    print 'test2'
+    unittest.main()
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/__init__.py	(revision 1126)
@@ -0,0 +1,5 @@
+"""a package with absolute import activated
+"""
+
+from __future__ import absolute_import
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/string.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/string.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/string.py	(revision 1126)
@@ -0,0 +1,3 @@
+from __future__ import absolute_import, print_function
+import string
+print(string)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/sidepackage/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/sidepackage/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimp/sidepackage/__init__.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""a side package with nothing in it
+"""
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module.py	(revision 1126)
@@ -0,0 +1,89 @@
+"""test module for astroid
+"""
+
+__revision__ = '$Id: module.py,v 1.2 2005-11-02 11:56:54 syt Exp $'
+from astroid.node_classes import Name as NameNode
+from astroid import modutils
+from astroid.utils import *
+import os.path
+MY_DICT = {}
+
+def global_access(key, val):
+    """function test"""
+    local = 1
+    MY_DICT[key] = val
+    for i in val:
+        if i:
+            del MY_DICT[i]
+            continue
+        else:
+            break
+    else:
+        return local
+
+
+class YO:
+    """hehe"""
+    a = 1
+    
+    def __init__(self):
+        try:
+            self.yo = 1
+        except ValueError, ex:
+            pass
+        except (NameError, TypeError):
+            raise XXXError()
+        except:
+            raise
+
+
+
+class YOUPI(YO):
+    class_attr = None
+    
+    def __init__(self):
+        self.member = None
+    
+    def method(self):
+        """method test"""
+        global MY_DICT
+        try:
+            MY_DICT = {}
+            local = None
+            autre = [a for (a, b) in MY_DICT if b]
+            if b in autre:
+                return b
+            else:
+                if a in autre:
+                    return a
+            global_access(local, val=autre)
+        finally:
+            return local
+    
+    def static_method():
+        """static method test"""
+        assert MY_DICT, '???'
+    static_method = staticmethod(static_method)
+    
+    def class_method(cls):
+        """class method test"""
+        exec a in b
+    class_method = classmethod(class_method)
+
+
+def four_args(a, b, c, d):
+    """four arguments (was nested_args)"""
+    pass
+    while 1:
+        if a:
+            break
+        a += +1
+    else:
+        b += -2
+    if c:
+        d = ((a) and (b)) or (c)
+    else:
+        c = ((a) and (b)) or (d)
+    map(lambda x, y: (y, x), a)
+redirect = four_args
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/email.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/email.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/email.py	(revision 1126)
@@ -0,0 +1 @@
+"""fake email module to test absolute import doesn't grab this one"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/format.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/format.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/format.py	(revision 1126)
@@ -0,0 +1,34 @@
+"""A multiline string
+"""
+
+function('aeozrijz\
+earzer', hop)
+# XXX write test
+x = [i for i in range(5)
+     if i % 4]
+
+fonction(1,
+         2,
+         3,
+         4)
+
+def definition(a,
+               b,
+               c):
+    return a + b + c
+
+class debile(dict,
+             object):
+    pass
+
+if aaaa: pass
+else:
+    aaaa,bbbb = 1,2
+    aaaa,bbbb = bbbb,aaaa
+# XXX write test
+hop = \
+    aaaa
+
+
+__revision__.lower();
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/find_test/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/find_test/noendingnewline.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/find_test/module.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/find_test/module2.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/find_test/nonregr.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/notall.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/notall.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/notall.py	(revision 1126)
@@ -0,0 +1,7 @@
+name = 'a'
+_bla = 2
+other = 'o'
+class Aaa: pass
+
+def func(): print('yo')
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/SSL1/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/SSL1/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/SSL1/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+from Connection1 import Connection
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/SSL1/Connection1.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/SSL1/Connection1.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/SSL1/Connection1.py	(revision 1126)
@@ -0,0 +1,14 @@
+"""M2Crypto.SSL.Connection
+
+Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved."""
+from __future__ import print_function
+RCS_id='$Id: Connection1.py,v 1.1 2005-06-13 20:55:22 syt Exp $'
+
+#Some code deleted here
+
+class Connection:
+
+    """An SSL connection."""
+
+    def __init__(self, ctx, sock=None):
+        print('init Connection')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/MyPyPa-0.1.0-py2.5.egg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/MyPyPa-0.1.0-py2.5.egg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/MyPyPa-0.1.0-py2.5.zip
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/MyPyPa-0.1.0-py2.5.zip
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/descriptor_crash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/descriptor_crash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/descriptor_crash.py	(revision 1126)
@@ -0,0 +1,11 @@
+
+import urllib
+
+class Page(object):
+    _urlOpen = staticmethod(urllib.urlopen)
+
+    def getPage(self, url):
+        handle = self._urlOpen(url)
+        data = handle.read()
+        handle.close()
+        return data
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+__revision__="$Id: __init__.py,v 1.1 2005-06-13 20:55:20 syt Exp $"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimport.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimport.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/absimport.py	(revision 1126)
@@ -0,0 +1,3 @@
+from __future__ import absolute_import
+import email
+from email import message
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/hello.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/hello.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/hello.py	(revision 1126)
@@ -0,0 +1,2 @@
+"""hello module"""
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/subpackage/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/subpackage/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/subpackage/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+"""package.subpackage"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/subpackage/module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/subpackage/module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/subpackage/module.py	(revision 1126)
@@ -0,0 +1 @@
+"""package.subpackage.module"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/__init__.py	(revision 1126)
@@ -0,0 +1,4 @@
+"""package's __init__ file"""
+
+
+from . import subpackage
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/import_package_subpackage_module.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/import_package_subpackage_module.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/import_package_subpackage_module.py	(revision 1126)
@@ -0,0 +1,49 @@
+# pylint: disable-msg=I0011,C0301,W0611
+"""I found some of my scripts trigger off an AttributeError in pylint
+0.8.1 (with common 0.12.0 and astroid 0.13.1).
+
+Traceback (most recent call last):
+  File "/usr/bin/pylint", line 4, in ?
+    lint.Run(sys.argv[1:])
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 729, in __init__
+    linter.check(args)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 412, in check
+    self.check_file(filepath, modname, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 426, in check_file
+    astroid = self._check_file(filepath, modname, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 450, in _check_file
+    self.check_astroid_module(astroid, checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 494, in check_astroid_module
+    self.astroid_events(astroid, [checker for checker in checkers
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 511, in astroid_events
+    self.astroid_events(child, checkers, _reversed_checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 511, in astroid_events
+    self.astroid_events(child, checkers, _reversed_checkers)
+  File "/usr/lib/python2.4/site-packages/pylint/lint.py", line 508, in astroid_events
+    checker.visit(astroid)
+  File "/usr/lib/python2.4/site-packages/logilab/astroid/utils.py", line 84, in visit
+    method(node)
+  File "/usr/lib/python2.4/site-packages/pylint/checkers/variables.py", line 295, in visit_import
+    self._check_module_attrs(node, module, name_parts[1:])
+  File "/usr/lib/python2.4/site-packages/pylint/checkers/variables.py", line 357, in _check_module_attrs
+    self.add_message('E0611', args=(name, module.name),
+AttributeError: Import instance has no attribute 'name'
+
+
+You can reproduce it by:
+(1) create package structure like the following:
+
+package/
+        __init__.py
+        subpackage/
+                   __init__.py
+                   module.py
+
+(2) in package/__init__.py write:
+
+import subpackage
+
+(3) run pylint with a script importing package.subpackage.module.
+"""
+__revision__ = '$Id: import_package_subpackage_module.py,v 1.1 2005-11-10 15:59:32 syt Exp $'
+import package.subpackage.module
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/absimport.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/absimport.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/package/absimport.py	(revision 1126)
@@ -0,0 +1,6 @@
+from __future__ import absolute_import, print_function
+import import_package_subpackage_module # fail
+print(import_package_subpackage_module)
+
+from . import hello as hola
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module1abs/core.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module1abs/core.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module1abs/core.py	(revision 1126)
@@ -0,0 +1 @@
+import sys
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module1abs/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module1abs/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module1abs/__init__.py	(revision 1126)
@@ -0,0 +1,4 @@
+from __future__ import absolute_import, print_function
+from . import core
+from .core import *
+print(sys.version)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/appl/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/appl/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/appl/__init__.py	(revision 1126)
@@ -0,0 +1,3 @@
+"""
+Init
+"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/appl/myConnection.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/appl/myConnection.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/appl/myConnection.py	(revision 1126)
@@ -0,0 +1,12 @@
+from __future__ import print_function
+from data import SSL1
+class MyConnection(SSL1.Connection):
+
+    """An SSL connection."""
+
+    def __init__(self, dummy):
+        print('MyConnection init')
+
+if __name__ == '__main__':
+    myConnection = MyConnection(' ')
+    raw_input('Press Enter to continue...')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/module2.py	(revision 1126)
@@ -0,0 +1,143 @@
+from data.module import YO, YOUPI
+import data
+
+
+class Specialization(YOUPI, YO):
+    pass
+
+
+
+class Metaclass(type):
+    pass
+
+
+
+class Interface:
+    pass
+
+
+
+class MyIFace(Interface):
+    pass
+
+
+
+class AnotherIFace(Interface):
+    pass
+
+
+
+class MyException(Exception):
+    pass
+
+
+
+class MyError(MyException):
+    pass
+
+
+
+class AbstractClass(object):
+    
+    def to_override(self, whatever):
+        raise NotImplementedError()
+    
+    def return_something(self, param):
+        if param:
+            return 'toto'
+        return
+
+
+
+class Concrete0:
+    __implements__ = MyIFace
+
+
+
+class Concrete1:
+    __implements__ = (MyIFace, AnotherIFace)
+
+
+
+class Concrete2:
+    __implements__ = (MyIFace, AnotherIFace)
+
+
+
+class Concrete23(Concrete1):
+    pass
+
+del YO.member
+del YO
+[SYN1, SYN2] = (Concrete0, Concrete1)
+assert '1'
+b = (1) | (((2) & (3)) ^ (8))
+bb = ((1) | (two)) | (6)
+ccc = ((one) & (two)) & (three)
+dddd = ((x) ^ (o)) ^ (r)
+exec 'c = 3'
+exec 'c = 3' in {}, {}
+
+def raise_string(a=2, *args, **kwargs):
+    raise Exception, 'yo'
+    yield 'coucou'
+    yield
+a = (b) + (2)
+c = (b) * (2)
+c = (b) / (2)
+c = (b) // (2)
+c = (b) - (2)
+c = (b) % (2)
+c = (b) ** (2)
+c = (b) << (2)
+c = (b) >> (2)
+c = ~b
+c = not b
+d = [c]
+e = d[:]
+e = d[a:b:c]
+raise_string(*args, **kwargs)
+print >> stream, 'bonjour'
+print >> stream, 'salut',
+
+def make_class(any, base=data.module.YO, *args, **kwargs):
+    """check base is correctly resolved to Concrete0"""
+    
+    
+    class Aaaa(base):
+        """dynamic class"""
+        
+    
+    return Aaaa
+from os.path import abspath
+import os as myos
+
+
+class A:
+    pass
+
+
+
+class A(A):
+    pass
+
+
+def generator():
+    """A generator."""
+    yield
+
+def not_a_generator():
+    """A function that contains generator, but is not one."""
+    
+    def generator():
+        yield
+    genl = lambda : (yield)
+
+def with_metaclass(meta, *bases):
+    return meta('NewBase', bases, {})
+
+
+class NotMetaclass(with_metaclass(Metaclass)):
+    pass
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/lmfp/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/lmfp/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/lmfp/__init__.py	(revision 1126)
@@ -0,0 +1,2 @@
+# force a "direct" python import
+from . import foo
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/lmfp/foo.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/lmfp/foo.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/lmfp/foo.py	(revision 1126)
@@ -0,0 +1,6 @@
+import sys
+if not getattr(sys, 'bar', None):
+    sys.just_once = []
+# there used to be two numbers here because
+# of a load_module_from_path bug
+sys.just_once.append(42)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/suppliermodule_test.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/suppliermodule_test.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/suppliermodule_test.py	(revision 1126)
@@ -0,0 +1,13 @@
+""" file suppliermodule.py """
+
+class NotImplemented(Exception):
+    pass
+
+class Interface:
+    def get_value(self):
+        raise NotImplemented()
+
+    def set_value(self, value):
+        raise NotImplemented()
+
+class DoNothing : pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/all.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/all.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/all.py	(revision 1126)
@@ -0,0 +1,9 @@
+
+name = 'a'
+_bla = 2
+other = 'o'
+class Aaa: pass
+
+def func(): print 'yo'
+
+__all__ = 'Aaa', '_bla', 'name'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/recursion.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/recursion.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/recursion.py	(revision 1126)
@@ -0,0 +1,3 @@
+""" For issue #25 """
+class Base(object):
+    pass
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/unicode_package/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/unicode_package/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/unicode_package/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+﻿x = "șțîâ"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/unicode_package/core/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/nonregr.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/nonregr.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/nonregr.py	(revision 1126)
@@ -0,0 +1,57 @@
+from __future__ import generators, print_function
+
+try:
+    enumerate = enumerate
+except NameError:
+
+    def enumerate(iterable):
+        """emulates the python2.3 enumerate() function"""
+        i = 0
+        for val in iterable:
+            yield i, val
+            i += 1
+
+def toto(value):
+    for k, v in value:
+        print(v.get('yo'))
+
+
+import imp
+fp, mpath, desc = imp.find_module('optparse',a)
+s_opt = imp.load_module('std_optparse', fp, mpath, desc)
+
+class OptionParser(s_opt.OptionParser):
+
+    def parse_args(self, args=None, values=None, real_optparse=False):
+        if real_optparse:
+            pass
+##          return super(OptionParser, self).parse_args()
+        else:
+            import optcomp
+            optcomp.completion(self)
+
+
+class Aaa(object):
+    """docstring"""
+    def __init__(self):
+        self.__setattr__('a','b')
+        pass
+
+    def one_public(self):
+        """docstring"""
+        pass
+
+    def another_public(self):
+        """docstring"""
+        pass
+
+class Ccc(Aaa):
+    """docstring"""
+
+    class Ddd(Aaa):
+        """docstring"""
+        pass
+
+    class Eee(Ddd):
+        """docstring"""
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/joined_strings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/joined_strings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/testdata/python2/data/joined_strings.py	(revision 1126)
@@ -0,0 +1,1051 @@
+x = ('R0lGODlhigJnAef/AAABAAEEAAkCAAMGAg0GBAYJBQoMCBMODQ4QDRITEBkS'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7'
+     +'CxsSEhkWDhYYFQ0aJhkaGBweGyccGh8hHiIkIiMmGTEiHhQoPSYoJSkqKDcp'
+     +'Ii0uLDAxLzI0Mh44U0gxMDI5JkM0JjU3NDY6Kjc5Njo7OUE8Ozw+Oz89QTxA'
+     +'F1akOFFiRIgPHTZksKBAgMCLGTdGNIAAQgKfDAcgZbj0odOnUA8GBAA7')
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_protocols.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_protocols.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_protocols.py	(revision 1126)
@@ -0,0 +1,176 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+import contextlib
+import unittest
+
+import astroid
+from astroid.test_utils import extract_node, require_version
+from astroid import InferenceError
+from astroid import nodes
+from astroid import util
+from astroid.node_classes import AssignName, Const, Name, Starred
+
+
+@contextlib.contextmanager
+def _add_transform(manager, node, transform, predicate=None):
+    manager.register_transform(node, transform, predicate)
+    try:
+        yield
+    finally:
+        manager.unregister_transform(node, transform, predicate)
+
+
+class ProtocolTests(unittest.TestCase):
+
+    def assertConstNodesEqual(self, nodes_list_expected, nodes_list_got):
+        self.assertEqual(len(nodes_list_expected), len(nodes_list_got))
+        for node in nodes_list_got:
+            self.assertIsInstance(node, Const)
+        for node, expected_value in zip(nodes_list_got, nodes_list_expected):
+            self.assertEqual(expected_value, node.value)
+
+    def assertNameNodesEqual(self, nodes_list_expected, nodes_list_got):
+        self.assertEqual(len(nodes_list_expected), len(nodes_list_got))
+        for node in nodes_list_got:
+            self.assertIsInstance(node, Name)
+        for node, expected_name in zip(nodes_list_got, nodes_list_expected):
+            self.assertEqual(expected_name, node.name)
+
+    def test_assigned_stmts_simple_for(self):
+        assign_stmts = extract_node("""
+        for a in (1, 2, 3):  #@
+          pass
+
+        for b in range(3): #@
+          pass
+        """)
+
+        for1_assnode = next(assign_stmts[0].nodes_of_class(AssignName))
+        assigned = list(for1_assnode.assigned_stmts())
+        self.assertConstNodesEqual([1, 2, 3], assigned)
+
+        for2_assnode = next(assign_stmts[1].nodes_of_class(AssignName))
+        self.assertRaises(InferenceError,
+                          list, for2_assnode.assigned_stmts())
+
+    @require_version(minver='3.0')
+    def test_assigned_stmts_starred_for(self):
+        assign_stmts = extract_node("""
+        for *a, b in ((1, 2, 3), (4, 5, 6, 7)): #@
+            pass
+        """)
+
+        for1_starred = next(assign_stmts.nodes_of_class(Starred))
+        assigned = next(for1_starred.assigned_stmts())
+        self.assertEqual(assigned, util.YES)
+
+    def _get_starred_stmts(self, code):
+        assign_stmt = extract_node("{} #@".format(code))
+        starred = next(assign_stmt.nodes_of_class(Starred))
+        return next(starred.assigned_stmts())
+
+    def _helper_starred_expected_const(self, code, expected):
+        stmts = self._get_starred_stmts(code)
+        self.assertIsInstance(stmts, nodes.List)
+        stmts = stmts.elts
+        self.assertConstNodesEqual(expected, stmts)
+
+    def _helper_starred_expected(self, code, expected):
+        stmts = self._get_starred_stmts(code)
+        self.assertEqual(expected, stmts)
+
+    def _helper_starred_inference_error(self, code):
+        assign_stmt = extract_node("{} #@".format(code))
+        starred = next(assign_stmt.nodes_of_class(Starred))
+        self.assertRaises(InferenceError, list, starred.assigned_stmts())
+
+    @require_version(minver='3.0')
+    def test_assigned_stmts_starred_assnames(self):
+        self._helper_starred_expected_const(
+            "a, *b = (1, 2, 3, 4) #@", [2, 3, 4])
+        self._helper_starred_expected_const(
+            "*a, b = (1, 2, 3) #@", [1, 2])
+        self._helper_starred_expected_const(
+            "a, *b, c = (1, 2, 3, 4, 5) #@",
+            [2, 3, 4])
+        self._helper_starred_expected_const(
+            "a, *b = (1, 2) #@", [2])
+        self._helper_starred_expected_const(
+            "*b, a = (1, 2) #@", [1])
+        self._helper_starred_expected_const(
+            "[*b] = (1, 2) #@", [1, 2])
+
+    @require_version(minver='3.0')
+    def test_assigned_stmts_starred_yes(self):
+        # Not something iterable and known
+        self._helper_starred_expected("a, *b = range(3) #@", util.YES)
+        # Not something inferrable
+        self._helper_starred_expected("a, *b = balou() #@", util.YES)
+        # In function, unknown.
+        self._helper_starred_expected("""
+        def test(arg):
+            head, *tail = arg #@""", util.YES)
+        # These cases aren't worth supporting.
+        self._helper_starred_expected(
+            "a, (*b, c), d = (1, (2, 3, 4), 5) #@", util.YES)
+
+    @require_version(minver='3.0')
+    def test_assign_stmts_starred_fails(self):
+        # Too many starred
+        self._helper_starred_inference_error("a, *b, *c = (1, 2, 3) #@")
+        # Too many lhs values
+        self._helper_starred_inference_error("a, *b, c = (1, 2) #@")
+        # This could be solved properly, but it complicates needlessly the
+        # code for assigned_stmts, without oferring real benefit.
+        self._helper_starred_inference_error(
+            "(*a, b), (c, *d) = (1, 2, 3), (4, 5, 6) #@")
+
+    def test_assigned_stmts_assignments(self):
+        assign_stmts = extract_node("""
+        c = a #@
+
+        d, e = b, c #@
+        """)
+
+        simple_assnode = next(assign_stmts[0].nodes_of_class(AssignName))
+        assigned = list(simple_assnode.assigned_stmts())
+        self.assertNameNodesEqual(['a'], assigned)
+
+        assnames = assign_stmts[1].nodes_of_class(AssignName)
+        simple_mul_assnode_1 = next(assnames)
+        assigned = list(simple_mul_assnode_1.assigned_stmts())
+        self.assertNameNodesEqual(['b'], assigned)
+        simple_mul_assnode_2 = next(assnames)
+        assigned = list(simple_mul_assnode_2.assigned_stmts())
+        self.assertNameNodesEqual(['c'], assigned)
+
+    def test_sequence_assigned_stmts_not_accepting_empty_node(self):
+        def transform(node):
+            node.root().locals['__all__'] = [node.value]
+
+        manager = astroid.MANAGER
+        with _add_transform(manager, astroid.Assign, transform):
+            module = astroid.parse('''
+            __all__ = ['a']
+            ''')
+            module.wildcard_import_names()
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_builder.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_builder.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_builder.py	(revision 1126)
@@ -0,0 +1,774 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""tests for the astroid builder and rebuilder module"""
+
+import os
+import sys
+import unittest
+
+import six
+
+from astroid import builder
+from astroid import exceptions
+from astroid import manager
+from astroid import nodes
+from astroid import test_utils
+from astroid import util
+from astroid.tests import resources
+
+MANAGER = manager.AstroidManager()
+BUILTINS = six.moves.builtins.__name__
+
+
+class FromToLineNoTest(unittest.TestCase):
+
+    def setUp(self):
+        self.astroid = resources.build_file('data/format.py')
+
+    def test_callfunc_lineno(self):
+        stmts = self.astroid.body
+        # on line 4:
+        #    function('aeozrijz\
+        #    earzer', hop)
+        discard = stmts[0]
+        self.assertIsInstance(discard, nodes.Expr)
+        self.assertEqual(discard.fromlineno, 4)
+        self.assertEqual(discard.tolineno, 5)
+        callfunc = discard.value
+        self.assertIsInstance(callfunc, nodes.Call)
+        self.assertEqual(callfunc.fromlineno, 4)
+        self.assertEqual(callfunc.tolineno, 5)
+        name = callfunc.func
+        self.assertIsInstance(name, nodes.Name)
+        self.assertEqual(name.fromlineno, 4)
+        self.assertEqual(name.tolineno, 4)
+        strarg = callfunc.args[0]
+        self.assertIsInstance(strarg, nodes.Const)
+        if hasattr(sys, 'pypy_version_info'):
+            lineno = 4
+        else:
+            lineno = 5 # no way for this one in CPython (is 4 actually)
+        self.assertEqual(strarg.fromlineno, lineno)
+        self.assertEqual(strarg.tolineno, lineno)
+        namearg = callfunc.args[1]
+        self.assertIsInstance(namearg, nodes.Name)
+        self.assertEqual(namearg.fromlineno, 5)
+        self.assertEqual(namearg.tolineno, 5)
+        # on line 10:
+        #    fonction(1,
+        #             2,
+        #             3,
+        #             4)
+        discard = stmts[2]
+        self.assertIsInstance(discard, nodes.Expr)
+        self.assertEqual(discard.fromlineno, 10)
+        self.assertEqual(discard.tolineno, 13)
+        callfunc = discard.value
+        self.assertIsInstance(callfunc, nodes.Call)
+        self.assertEqual(callfunc.fromlineno, 10)
+        self.assertEqual(callfunc.tolineno, 13)
+        name = callfunc.func
+        self.assertIsInstance(name, nodes.Name)
+        self.assertEqual(name.fromlineno, 10)
+        self.assertEqual(name.tolineno, 10)
+        for i, arg in enumerate(callfunc.args):
+            self.assertIsInstance(arg, nodes.Const)
+            self.assertEqual(arg.fromlineno, 10+i)
+            self.assertEqual(arg.tolineno, 10+i)
+
+    def test_function_lineno(self):
+        stmts = self.astroid.body
+        # on line 15:
+        #    def definition(a,
+        #                   b,
+        #                   c):
+        #        return a + b + c
+        function = stmts[3]
+        self.assertIsInstance(function, nodes.FunctionDef)
+        self.assertEqual(function.fromlineno, 15)
+        self.assertEqual(function.tolineno, 18)
+        return_ = function.body[0]
+        self.assertIsInstance(return_, nodes.Return)
+        self.assertEqual(return_.fromlineno, 18)
+        self.assertEqual(return_.tolineno, 18)
+        if sys.version_info < (3, 0):
+            self.assertEqual(function.blockstart_tolineno, 17)
+        else:
+            self.skipTest('FIXME  http://bugs.python.org/issue10445 '
+                          '(no line number on function args)')
+
+    def test_decorated_function_lineno(self):
+        astroid = builder.parse('''
+            @decorator
+            def function(
+                arg):
+                print (arg)
+            ''', __name__)
+        function = astroid['function']
+        self.assertEqual(function.fromlineno, 3) # XXX discussable, but that's what is expected by pylint right now
+        self.assertEqual(function.tolineno, 5)
+        self.assertEqual(function.decorators.fromlineno, 2)
+        self.assertEqual(function.decorators.tolineno, 2)
+        if sys.version_info < (3, 0):
+            self.assertEqual(function.blockstart_tolineno, 4)
+        else:
+            self.skipTest('FIXME  http://bugs.python.org/issue10445 '
+                          '(no line number on function args)')
+
+
+    def test_class_lineno(self):
+        stmts = self.astroid.body
+        # on line 20:
+        #    class debile(dict,
+        #                 object):
+        #       pass
+        class_ = stmts[4]
+        self.assertIsInstance(class_, nodes.ClassDef)
+        self.assertEqual(class_.fromlineno, 20)
+        self.assertEqual(class_.tolineno, 22)
+        self.assertEqual(class_.blockstart_tolineno, 21)
+        pass_ = class_.body[0]
+        self.assertIsInstance(pass_, nodes.Pass)
+        self.assertEqual(pass_.fromlineno, 22)
+        self.assertEqual(pass_.tolineno, 22)
+
+    def test_if_lineno(self):
+        stmts = self.astroid.body
+        # on line 20:
+        #    if aaaa: pass
+        #    else:
+        #        aaaa,bbbb = 1,2
+        #        aaaa,bbbb = bbbb,aaaa
+        if_ = stmts[5]
+        self.assertIsInstance(if_, nodes.If)
+        self.assertEqual(if_.fromlineno, 24)
+        self.assertEqual(if_.tolineno, 27)
+        self.assertEqual(if_.blockstart_tolineno, 24)
+        self.assertEqual(if_.orelse[0].fromlineno, 26)
+        self.assertEqual(if_.orelse[1].tolineno, 27)
+
+    def test_for_while_lineno(self):
+        for code in ('''
+            for a in range(4):
+              print (a)
+              break
+            else:
+              print ("bouh")
+            ''', '''
+            while a:
+              print (a)
+              break
+            else:
+              print ("bouh")
+            '''):
+            astroid = builder.parse(code, __name__)
+            stmt = astroid.body[0]
+            self.assertEqual(stmt.fromlineno, 2)
+            self.assertEqual(stmt.tolineno, 6)
+            self.assertEqual(stmt.blockstart_tolineno, 2)
+            self.assertEqual(stmt.orelse[0].fromlineno, 6) # XXX
+            self.assertEqual(stmt.orelse[0].tolineno, 6)
+
+    def test_try_except_lineno(self):
+        astroid = builder.parse('''
+            try:
+              print (a)
+            except:
+              pass
+            else:
+              print ("bouh")
+            ''', __name__)
+        try_ = astroid.body[0]
+        self.assertEqual(try_.fromlineno, 2)
+        self.assertEqual(try_.tolineno, 7)
+        self.assertEqual(try_.blockstart_tolineno, 2)
+        self.assertEqual(try_.orelse[0].fromlineno, 7) # XXX
+        self.assertEqual(try_.orelse[0].tolineno, 7)
+        hdlr = try_.handlers[0]
+        self.assertEqual(hdlr.fromlineno, 4)
+        self.assertEqual(hdlr.tolineno, 5)
+        self.assertEqual(hdlr.blockstart_tolineno, 4)
+
+
+    def test_try_finally_lineno(self):
+        astroid = builder.parse('''
+            try:
+              print (a)
+            finally:
+              print ("bouh")
+            ''', __name__)
+        try_ = astroid.body[0]
+        self.assertEqual(try_.fromlineno, 2)
+        self.assertEqual(try_.tolineno, 5)
+        self.assertEqual(try_.blockstart_tolineno, 2)
+        self.assertEqual(try_.finalbody[0].fromlineno, 5) # XXX
+        self.assertEqual(try_.finalbody[0].tolineno, 5)
+
+
+    def test_try_finally_25_lineno(self):
+        astroid = builder.parse('''
+            try:
+              print (a)
+            except:
+              pass
+            finally:
+              print ("bouh")
+            ''', __name__)
+        try_ = astroid.body[0]
+        self.assertEqual(try_.fromlineno, 2)
+        self.assertEqual(try_.tolineno, 7)
+        self.assertEqual(try_.blockstart_tolineno, 2)
+        self.assertEqual(try_.finalbody[0].fromlineno, 7) # XXX
+        self.assertEqual(try_.finalbody[0].tolineno, 7)
+
+
+    def test_with_lineno(self):
+        astroid = builder.parse('''
+            from __future__ import with_statement
+            with file("/tmp/pouet") as f:
+                print (f)
+            ''', __name__)
+        with_ = astroid.body[1]
+        self.assertEqual(with_.fromlineno, 3)
+        self.assertEqual(with_.tolineno, 4)
+        self.assertEqual(with_.blockstart_tolineno, 3)
+
+
+class BuilderTest(unittest.TestCase):
+
+    def setUp(self):
+        self.builder = builder.AstroidBuilder()
+
+    def test_data_build_null_bytes(self):
+        with self.assertRaises(exceptions.AstroidBuildingException):
+            self.builder.string_build('\x00')
+
+    def test_data_build_invalid_x_escape(self):
+        with self.assertRaises(exceptions.AstroidBuildingException):
+            self.builder.string_build('"\\x1"')
+
+    def test_missing_newline(self):
+        """check that a file with no trailing new line is parseable"""
+        resources.build_file('data/noendingnewline.py')
+
+    def test_missing_file(self):
+        with self.assertRaises(exceptions.AstroidBuildingException):
+            resources.build_file('data/inexistant.py')
+
+    def test_inspect_build0(self):
+        """test astroid tree build from a living object"""
+        builtin_ast = MANAGER.ast_from_module_name(BUILTINS)
+        if six.PY2:
+            fclass = builtin_ast['file']
+            self.assertIn('name', fclass)
+            self.assertIn('mode', fclass)
+            self.assertIn('read', fclass)
+            self.assertTrue(fclass.newstyle)
+            self.assertTrue(fclass.pytype(), '%s.type' % BUILTINS)
+            self.assertIsInstance(fclass['read'], nodes.FunctionDef)
+            # check builtin function has args.args == None
+            dclass = builtin_ast['dict']
+            self.assertIsNone(dclass['has_key'].args.args)
+        # just check type and object are there
+        builtin_ast.getattr('type')
+        objectastroid = builtin_ast.getattr('object')[0]
+        self.assertIsInstance(objectastroid.getattr('__new__')[0], nodes.FunctionDef)
+        # check open file alias
+        builtin_ast.getattr('open')
+        # check 'help' is there (defined dynamically by site.py)
+        builtin_ast.getattr('help')
+        # check property has __init__
+        pclass = builtin_ast['property']
+        self.assertIn('__init__', pclass)
+        self.assertIsInstance(builtin_ast['None'], nodes.Const)
+        self.assertIsInstance(builtin_ast['True'], nodes.Const)
+        self.assertIsInstance(builtin_ast['False'], nodes.Const)
+        if six.PY3:
+            self.assertIsInstance(builtin_ast['Exception'], nodes.ClassDef)
+            self.assertIsInstance(builtin_ast['NotImplementedError'], nodes.ClassDef)
+        else:
+            self.assertIsInstance(builtin_ast['Exception'], nodes.ImportFrom)
+            self.assertIsInstance(builtin_ast['NotImplementedError'], nodes.ImportFrom)
+
+    def test_inspect_build1(self):
+        time_ast = MANAGER.ast_from_module_name('time')
+        self.assertTrue(time_ast)
+        self.assertEqual(time_ast['time'].args.defaults, [])
+
+    if os.name == 'java':
+        test_inspect_build1 = unittest.expectedFailure(test_inspect_build1)
+
+    def test_inspect_build2(self):
+        """test astroid tree build from a living object"""
+        try:
+            from mx import DateTime
+        except ImportError:
+            self.skipTest('test skipped: mxDateTime is not available')
+        else:
+            dt_ast = self.builder.inspect_build(DateTime)
+            dt_ast.getattr('DateTime')
+            # this one is failing since DateTimeType.__module__ = 'builtins' !
+            #dt_ast.getattr('DateTimeType')
+
+    def test_inspect_build3(self):
+        self.builder.inspect_build(unittest)
+
+    @test_utils.require_version(maxver='3.0')
+    def test_inspect_build_instance(self):
+        """test astroid tree build from a living object"""
+        import exceptions
+        builtin_ast = self.builder.inspect_build(exceptions)
+        fclass = builtin_ast['OSError']
+        # things like OSError.strerror are now (2.5) data descriptors on the
+        # class instead of entries in the __dict__ of an instance
+        container = fclass
+        self.assertIn('errno', container)
+        self.assertIn('strerror', container)
+        self.assertIn('filename', container)
+
+    def test_inspect_build_type_object(self):
+        builtin_ast = MANAGER.ast_from_module_name(BUILTINS)
+
+        inferred = list(builtin_ast.igetattr('object'))
+        self.assertEqual(len(inferred), 1)
+        inferred = inferred[0]
+        self.assertEqual(inferred.name, 'object')
+        inferred.as_string() # no crash test
+
+        inferred = list(builtin_ast.igetattr('type'))
+        self.assertEqual(len(inferred), 1)
+        inferred = inferred[0]
+        self.assertEqual(inferred.name, 'type')
+        inferred.as_string() # no crash test
+
+    def test_inspect_transform_module(self):
+        # ensure no cached version of the time module
+        MANAGER._mod_file_cache.pop(('time', None), None)
+        MANAGER.astroid_cache.pop('time', None)
+        def transform_time(node):
+            if node.name == 'time':
+                node.transformed = True
+        MANAGER.register_transform(nodes.Module, transform_time)
+        try:
+            time_ast = MANAGER.ast_from_module_name('time')
+            self.assertTrue(getattr(time_ast, 'transformed', False))
+        finally:
+            MANAGER.unregister_transform(nodes.Module, transform_time)
+
+    def test_package_name(self):
+        """test base properties and method of a astroid module"""
+        datap = resources.build_file('data/__init__.py', 'data')
+        self.assertEqual(datap.name, 'data')
+        self.assertEqual(datap.package, 1)
+        datap = resources.build_file('data/__init__.py', 'data.__init__')
+        self.assertEqual(datap.name, 'data')
+        self.assertEqual(datap.package, 1)
+
+    def test_yield_parent(self):
+        """check if we added discard nodes as yield parent (w/ compiler)"""
+        code = """
+            def yiell(): #@
+                yield 0
+                if noe:
+                    yield more
+        """
+        func = test_utils.extract_node(code)
+        self.assertIsInstance(func, nodes.FunctionDef)
+        stmt = func.body[0]
+        self.assertIsInstance(stmt, nodes.Expr)
+        self.assertIsInstance(stmt.value, nodes.Yield)
+        self.assertIsInstance(func.body[1].body[0], nodes.Expr)
+        self.assertIsInstance(func.body[1].body[0].value, nodes.Yield)
+
+    def test_object(self):
+        obj_ast = self.builder.inspect_build(object)
+        self.assertIn('__setattr__', obj_ast)
+
+    def test_newstyle_detection(self):
+        data = '''
+            class A:
+                "old style"
+
+            class B(A):
+                "old style"
+
+            class C(object):
+                "new style"
+
+            class D(C):
+                "new style"
+
+            __metaclass__ = type
+
+            class E(A):
+                "old style"
+
+            class F:
+                "new style"
+        '''
+        mod_ast = builder.parse(data, __name__)
+        if six.PY3:
+            self.assertTrue(mod_ast['A'].newstyle)
+            self.assertTrue(mod_ast['B'].newstyle)
+            self.assertTrue(mod_ast['E'].newstyle)
+        else:
+            self.assertFalse(mod_ast['A'].newstyle)
+            self.assertFalse(mod_ast['B'].newstyle)
+            self.assertFalse(mod_ast['E'].newstyle)
+        self.assertTrue(mod_ast['C'].newstyle)
+        self.assertTrue(mod_ast['D'].newstyle)
+        self.assertTrue(mod_ast['F'].newstyle)
+
+    def test_globals(self):
+        data = '''
+            CSTE = 1
+
+            def update_global():
+                global CSTE
+                CSTE += 1
+
+            def global_no_effect():
+                global CSTE2
+                print (CSTE)
+        '''
+        astroid = builder.parse(data, __name__)
+        self.assertEqual(len(astroid.getattr('CSTE')), 2)
+        self.assertIsInstance(astroid.getattr('CSTE')[0], nodes.AssignName)
+        self.assertEqual(astroid.getattr('CSTE')[0].fromlineno, 2)
+        self.assertEqual(astroid.getattr('CSTE')[1].fromlineno, 6)
+        with self.assertRaises(exceptions.NotFoundError):
+            astroid.getattr('CSTE2')
+        with self.assertRaises(exceptions.InferenceError):
+            next(astroid['global_no_effect'].ilookup('CSTE2'))
+
+    @unittest.skipIf(os.name == 'java',
+                     'This test is skipped on Jython, because the '
+                     'socket object is patched later on with the '
+                     'methods we are looking for. Since we do not '
+                     'understand setattr in for loops yet, we skip this')
+    def test_socket_build(self):
+        import socket
+        astroid = self.builder.module_build(socket)
+        # XXX just check the first one. Actually 3 objects are inferred (look at
+        # the socket module) but the last one as those attributes dynamically
+        # set and astroid is missing this.
+        for fclass in astroid.igetattr('socket'):
+            self.assertIn('connect', fclass)
+            self.assertIn('send', fclass)
+            self.assertIn('close', fclass)
+            break
+
+    def test_gen_expr_var_scope(self):
+        data = 'l = list(n for n in range(10))\n'
+        astroid = builder.parse(data, __name__)
+        # n unavailable outside gen expr scope
+        self.assertNotIn('n', astroid)
+        # test n is inferable anyway
+        n = test_utils.get_name_node(astroid, 'n')
+        self.assertIsNot(n.scope(), astroid)
+        self.assertEqual([i.__class__ for i in n.infer()],
+                         [util.YES.__class__])
+
+    def test_no_future_imports(self):
+        mod = builder.parse("import sys")
+        self.assertEqual(set(), mod._future_imports)
+
+    def test_future_imports(self):
+        mod = builder.parse("from __future__ import print_function")
+        self.assertEqual(set(['print_function']), mod._future_imports)
+
+    def test_two_future_imports(self):
+        mod = builder.parse("""
+            from __future__ import print_function
+            from __future__ import absolute_import
+            """)
+        self.assertEqual(set(['print_function', 'absolute_import']), mod._future_imports)
+
+    def test_inferred_build(self):
+        code = '''
+            class A: pass
+            A.type = "class"
+
+            def A_assign_type(self):
+                print (self)
+            A.assign_type = A_assign_type
+            '''
+        astroid = builder.parse(code)
+        lclass = list(astroid.igetattr('A'))
+        self.assertEqual(len(lclass), 1)
+        lclass = lclass[0]
+        self.assertIn('assign_type', lclass._locals)
+        self.assertIn('type', lclass._locals)
+
+    def test_augassign_attr(self):
+        builder.parse("""
+            class Counter:
+                v = 0
+                def inc(self):
+                    self.v += 1
+            """, __name__)
+        # TODO: Check self.v += 1 generate AugAssign(AssAttr(...)),
+        # not AugAssign(GetAttr(AssName...))
+
+    def test_inferred_dont_pollute(self):
+        code = '''
+            def func(a=None):
+                a.custom_attr = 0
+            def func2(a={}):
+                a.custom_attr = 0
+            '''
+        builder.parse(code)
+        nonetype = nodes.const_factory(None)
+        self.assertNotIn('custom_attr', nonetype._locals)
+        self.assertNotIn('custom_attr', nonetype._instance_attrs)
+        nonetype = nodes.const_factory({})
+        self.assertNotIn('custom_attr', nonetype._locals)
+        self.assertNotIn('custom_attr', nonetype._instance_attrs)
+
+    def test_asstuple(self):
+        code = 'a, b = range(2)'
+        astroid = builder.parse(code)
+        self.assertIn('b', astroid._locals)
+        code = '''
+            def visit_if(self, node):
+                node.test, body = node.tests[0]
+            '''
+        astroid = builder.parse(code)
+        self.assertIn('body', astroid['visit_if']._locals)
+
+    def test_build_constants(self):
+        '''test expected values of constants after rebuilding'''
+        code = '''
+            def func():
+                return None
+                return
+                return 'None'
+            '''
+        astroid = builder.parse(code)
+        none, nothing, chain = [ret.value for ret in astroid.body[0].body]
+        self.assertIsInstance(none, nodes.Const)
+        self.assertIsNone(none.value)
+        self.assertIsNone(nothing)
+        self.assertIsInstance(chain, nodes.Const)
+        self.assertEqual(chain.value, 'None')
+
+    def test_not_implemented(self):
+        node = test_utils.extract_node('''
+        NotImplemented #@
+        ''')
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, NotImplemented)
+
+
+class FileBuildTest(unittest.TestCase):
+    def setUp(self):
+        self.module = resources.build_file('data/module.py', 'data.module')
+
+    def test_module_base_props(self):
+        """test base properties and method of a astroid module"""
+        module = self.module
+        self.assertEqual(module.name, 'data.module')
+        self.assertEqual(module.doc, "test module for astroid\n")
+        self.assertEqual(module.fromlineno, 0)
+        self.assertIsNone(module.parent)
+        self.assertEqual(module.frame(), module)
+        self.assertEqual(module.root(), module)
+        self.assertEqual(module.source_file, os.path.abspath(resources.find('data/module.py')))
+        self.assertEqual(module.pure_python, 1)
+        self.assertEqual(module.package, 0)
+        self.assertFalse(module.is_statement)
+        self.assertEqual(module.statement(), module)
+        self.assertEqual(module.statement(), module)
+
+    def test_module_locals(self):
+        """test the 'locals' dictionary of a astroid module"""
+        module = self.module
+        _locals = module._locals
+        self.assertIs(_locals, module._globals)
+        keys = sorted(_locals.keys())
+        should = ['MY_DICT', 'NameNode', 'YO', 'YOUPI',
+                  '__revision__', 'global_access', 'modutils', 'four_args',
+                  'os', 'redirect']
+        should.sort()
+        self.assertEqual(keys, sorted(should))
+
+    def test_function_base_props(self):
+        """test base properties and method of a astroid function"""
+        module = self.module
+        function = module['global_access']
+        self.assertEqual(function.name, 'global_access')
+        self.assertEqual(function.doc, 'function test')
+        self.assertEqual(function.fromlineno, 11)
+        self.assertTrue(function.parent)
+        self.assertEqual(function.frame(), function)
+        self.assertEqual(function.parent.frame(), module)
+        self.assertEqual(function.root(), module)
+        self.assertEqual([n.name for n in function.args.args], ['key', 'val'])
+        self.assertEqual(function.type, 'function')
+
+    def test_function_locals(self):
+        """test the 'locals' dictionary of a astroid function"""
+        _locals = self.module['global_access']._locals
+        self.assertEqual(len(_locals), 4)
+        keys = sorted(_locals.keys())
+        self.assertEqual(keys, ['i', 'key', 'local', 'val'])
+
+    def test_class_base_props(self):
+        """test base properties and method of a astroid class"""
+        module = self.module
+        klass = module['YO']
+        self.assertEqual(klass.name, 'YO')
+        self.assertEqual(klass.doc, 'hehe')
+        self.assertEqual(klass.fromlineno, 25)
+        self.assertTrue(klass.parent)
+        self.assertEqual(klass.frame(), klass)
+        self.assertEqual(klass.parent.frame(), module)
+        self.assertEqual(klass.root(), module)
+        self.assertEqual(klass.basenames, [])
+        if six.PY3:
+            self.assertTrue(klass.newstyle)
+        else:
+            self.assertFalse(klass.newstyle)
+
+    def test_class_locals(self):
+        """test the 'locals' dictionary of a astroid class"""
+        module = self.module
+        klass1 = module['YO']
+        locals1 = klass1._locals
+        keys = sorted(locals1.keys())
+        self.assertEqual(keys, ['__init__', 'a'])
+        klass2 = module['YOUPI']
+        locals2 = klass2._locals
+        keys = locals2.keys()
+        self.assertEqual(sorted(keys),
+                         ['__init__', 'class_attr', 'class_method',
+                          'method', 'static_method'])
+
+    def test_class_instance_attrs(self):
+        module = self.module
+        klass1 = module['YO']
+        klass2 = module['YOUPI']
+        self.assertEqual(list(klass1._instance_attrs.keys()), ['yo'])
+        self.assertEqual(list(klass2._instance_attrs.keys()), ['member'])
+
+    def test_class_basenames(self):
+        module = self.module
+        klass1 = module['YO']
+        klass2 = module['YOUPI']
+        self.assertEqual(klass1.basenames, [])
+        self.assertEqual(klass2.basenames, ['YO'])
+
+    def test_method_base_props(self):
+        """test base properties and method of a astroid method"""
+        klass2 = self.module['YOUPI']
+        # "normal" method
+        method = klass2['method']
+        self.assertEqual(method.name, 'method')
+        self.assertEqual([n.name for n in method.args.args], ['self'])
+        self.assertEqual(method.doc, 'method test')
+        self.assertEqual(method.fromlineno, 47)
+        self.assertEqual(method.type, 'method')
+        # class method
+        method = klass2['class_method']
+        self.assertEqual([n.name for n in method.args.args], ['cls'])
+        self.assertEqual(method.type, 'classmethod')
+        # static method
+        method = klass2['static_method']
+        self.assertEqual(method.args.args, [])
+        self.assertEqual(method.type, 'staticmethod')
+
+    def test_method_locals(self):
+        """test the 'locals' dictionary of a astroid method"""
+        method = self.module['YOUPI']['method']
+        _locals = method._locals
+        keys = sorted(_locals)
+        if sys.version_info < (3, 0):
+            self.assertEqual(len(_locals), 5)
+            self.assertEqual(keys, ['a', 'autre', 'b', 'local', 'self'])
+        else:# ListComp variables are no more accessible outside
+            self.assertEqual(len(_locals), 3)
+            self.assertEqual(keys, ['autre', 'local', 'self'])
+
+
+class ModuleBuildTest(resources.SysPathSetup, FileBuildTest):
+
+    def setUp(self):
+        super(ModuleBuildTest, self).setUp()
+        abuilder = builder.AstroidBuilder()
+        try:
+            import data.module
+        except ImportError:
+            # Make pylint happy.
+            self.skipTest('Unable to load data.module')
+        else:
+            self.module = abuilder.module_build(data.module, 'data.module')
+
+@unittest.skipIf(six.PY3, "guess_encoding not used on Python 3")
+class TestGuessEncoding(unittest.TestCase):
+    def setUp(self):
+        self.guess_encoding = builder._guess_encoding
+
+    def testEmacs(self):
+        e = self.guess_encoding('# -*- coding: UTF-8  -*-')
+        self.assertEqual(e, 'UTF-8')
+        e = self.guess_encoding('# -*- coding:UTF-8 -*-')
+        self.assertEqual(e, 'UTF-8')
+        e = self.guess_encoding('''
+        ### -*- coding: ISO-8859-1  -*-
+        ''')
+        self.assertEqual(e, 'ISO-8859-1')
+        e = self.guess_encoding('''
+
+        ### -*- coding: ISO-8859-1  -*-
+        ''')
+        self.assertIsNone(e)
+
+    def testVim(self):
+        e = self.guess_encoding('# vim:fileencoding=UTF-8')
+        self.assertEqual(e, 'UTF-8')
+        e = self.guess_encoding('''
+        ### vim:fileencoding=ISO-8859-1
+        ''')
+        self.assertEqual(e, 'ISO-8859-1')
+        e = self.guess_encoding('''
+
+        ### vim:fileencoding= ISO-8859-1
+        ''')
+        self.assertIsNone(e)
+
+    def test_wrong_coding(self):
+        # setting "coding" varaible
+        e = self.guess_encoding("coding = UTF-8")
+        self.assertIsNone(e)
+        # setting a dictionnary entry
+        e = self.guess_encoding("coding:UTF-8")
+        self.assertIsNone(e)
+        # setting an arguement
+        e = self.guess_encoding("def do_something(a_word_with_coding=None):")
+        self.assertIsNone(e)
+
+    def testUTF8(self):
+        e = self.guess_encoding('\xef\xbb\xbf any UTF-8 data')
+        self.assertEqual(e, 'UTF-8')
+        e = self.guess_encoding(' any UTF-8 data \xef\xbb\xbf')
+        self.assertIsNone(e)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_objects.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_objects.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_objects.py	(revision 1126)
@@ -0,0 +1,530 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+import unittest
+
+from astroid import bases
+from astroid import exceptions
+from astroid import nodes
+from astroid import objects
+from astroid import test_utils
+
+
+class ObjectsTest(unittest.TestCase):
+
+    def test_frozenset(self):
+        node = test_utils.extract_node("""
+        frozenset({1: 2, 2: 3}) #@
+        """)
+        infered = next(node.infer())
+        self.assertIsInstance(infered, objects.FrozenSet)
+
+        self.assertEqual(infered.pytype(), "%s.frozenset" % bases.BUILTINS)
+
+        itered = infered.itered()
+        self.assertEqual(len(itered), 2)
+        self.assertIsInstance(itered[0], nodes.Const)
+        self.assertEqual([const.value for const in itered], [1, 2])
+
+        proxied = infered._proxied
+        self.assertEqual(infered.qname(), "%s.frozenset" % bases.BUILTINS)
+        self.assertIsInstance(proxied, nodes.ClassDef)
+
+
+class SuperTests(unittest.TestCase):
+
+    def test_inferring_super_outside_methods(self):
+        ast_nodes = test_utils.extract_node('''
+        class Module(object):
+            pass
+        class StaticMethod(object):
+            @staticmethod
+            def static():
+                # valid, but we don't bother with it.
+                return super(StaticMethod, StaticMethod) #@
+        # super outside methods aren't inferred
+        super(Module, Module) #@
+        # no argument super is not recognised outside methods as well.
+        super() #@
+        ''')
+        in_static = next(ast_nodes[0].value.infer())
+        self.assertIsInstance(in_static, bases.Instance)
+        self.assertEqual(in_static.qname(), "%s.super" % bases.BUILTINS)
+
+        module_level = next(ast_nodes[1].infer())
+        self.assertIsInstance(module_level, bases.Instance)
+        self.assertEqual(in_static.qname(), "%s.super" % bases.BUILTINS)
+
+        no_arguments = next(ast_nodes[2].infer())
+        self.assertIsInstance(no_arguments, bases.Instance)
+        self.assertEqual(no_arguments.qname(), "%s.super" % bases.BUILTINS)
+
+    def test_inferring_unbound_super_doesnt_work(self):
+        node = test_utils.extract_node('''
+        class Test(object):
+            def __init__(self):
+                super(Test) #@
+        ''')
+        unbounded = next(node.infer())
+        self.assertIsInstance(unbounded, bases.Instance)
+        self.assertEqual(unbounded.qname(), "%s.super" % bases.BUILTINS)
+
+    def test_use_default_inference_on_not_inferring_args(self):
+        ast_nodes = test_utils.extract_node('''
+        class Test(object):
+            def __init__(self):
+                super(Lala, self) #@
+                super(Test, lala) #@
+        ''')
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, bases.Instance)
+        self.assertEqual(first.qname(), "%s.super" % bases.BUILTINS)
+
+        second = next(ast_nodes[1].infer())
+        self.assertIsInstance(second, bases.Instance)
+        self.assertEqual(second.qname(), "%s.super" % bases.BUILTINS)
+
+    @test_utils.require_version(maxver='3.0')
+    def test_super_on_old_style_class(self):
+        # super doesn't work on old style class, but leave
+        # that as an error for pylint. We'll infer Super objects,
+        # but every call will result in a failure at some point.
+        node = test_utils.extract_node('''
+        class OldStyle:
+            def __init__(self):
+                super(OldStyle, self) #@
+        ''')
+        old = next(node.infer())
+        self.assertIsInstance(old, objects.Super)
+        self.assertIsInstance(old.mro_pointer, nodes.ClassDef)
+        self.assertEqual(old.mro_pointer.name, 'OldStyle')
+        with self.assertRaises(exceptions.SuperError) as cm:
+            old.super_mro()
+        self.assertEqual(str(cm.exception),
+                         "Unable to call super on old-style classes.")
+
+    @test_utils.require_version(minver='3.0')
+    def test_no_arguments_super(self):
+        ast_nodes = test_utils.extract_node('''
+        class First(object): pass
+        class Second(First):
+            def test(self):
+                super() #@
+            @classmethod
+            def test_classmethod(cls):
+                super() #@
+        ''')
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, objects.Super)
+        self.assertIsInstance(first.type, bases.Instance)
+        self.assertEqual(first.type.name, 'Second')
+        self.assertIsInstance(first.mro_pointer, nodes.ClassDef)
+        self.assertEqual(first.mro_pointer.name, 'Second')
+
+        second = next(ast_nodes[1].infer())
+        self.assertIsInstance(second, objects.Super)
+        self.assertIsInstance(second.type, nodes.ClassDef)
+        self.assertEqual(second.type.name, 'Second')
+        self.assertIsInstance(second.mro_pointer, nodes.ClassDef)
+        self.assertEqual(second.mro_pointer.name, 'Second')
+
+    def test_super_simple_cases(self):
+        ast_nodes = test_utils.extract_node('''
+        class First(object): pass
+        class Second(First): pass
+        class Third(First):
+            def test(self):
+                super(Third, self) #@
+                super(Second, self) #@
+
+                # mro position and the type
+                super(Third, Third) #@
+                super(Third, Second) #@
+                super(Fourth, Fourth) #@
+
+        class Fourth(Third):
+            pass
+        ''')
+
+        # .type is the object which provides the mro.
+        # .mro_pointer is the position in the mro from where
+        # the lookup should be done.
+
+        # super(Third, self)
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, objects.Super)
+        self.assertIsInstance(first.type, bases.Instance)
+        self.assertEqual(first.type.name, 'Third')
+        self.assertIsInstance(first.mro_pointer, nodes.ClassDef)
+        self.assertEqual(first.mro_pointer.name, 'Third')
+
+        # super(Second, self)
+        second = next(ast_nodes[1].infer())
+        self.assertIsInstance(second, objects.Super)
+        self.assertIsInstance(second.type, bases.Instance)
+        self.assertEqual(second.type.name, 'Third')
+        self.assertIsInstance(first.mro_pointer, nodes.ClassDef)
+        self.assertEqual(second.mro_pointer.name, 'Second')
+
+        # super(Third, Third)
+        third = next(ast_nodes[2].infer())
+        self.assertIsInstance(third, objects.Super)
+        self.assertIsInstance(third.type, nodes.ClassDef)
+        self.assertEqual(third.type.name, 'Third')
+        self.assertIsInstance(third.mro_pointer, nodes.ClassDef)
+        self.assertEqual(third.mro_pointer.name, 'Third')
+
+        # super(Third, second)
+        fourth = next(ast_nodes[3].infer())
+        self.assertIsInstance(fourth, objects.Super)
+        self.assertIsInstance(fourth.type, nodes.ClassDef)
+        self.assertEqual(fourth.type.name, 'Second')
+        self.assertIsInstance(fourth.mro_pointer, nodes.ClassDef)
+        self.assertEqual(fourth.mro_pointer.name, 'Third')
+
+        # Super(Fourth, Fourth)
+        fifth = next(ast_nodes[4].infer())
+        self.assertIsInstance(fifth, objects.Super)
+        self.assertIsInstance(fifth.type, nodes.ClassDef)
+        self.assertEqual(fifth.type.name, 'Fourth')
+        self.assertIsInstance(fifth.mro_pointer, nodes.ClassDef)
+        self.assertEqual(fifth.mro_pointer.name, 'Fourth')
+
+    def test_super_infer(self):
+        node = test_utils.extract_node('''
+        class Super(object):
+            def __init__(self):
+                super(Super, self) #@
+        ''')
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, objects.Super)
+        reinferred = next(inferred.infer())
+        self.assertIsInstance(reinferred, objects.Super)
+        self.assertIs(inferred, reinferred)
+
+    def test_inferring_invalid_supers(self):
+        ast_nodes = test_utils.extract_node('''
+        class Super(object):
+            def __init__(self):
+                # MRO pointer is not a type
+                super(1, self) #@
+                # MRO type is not a subtype
+                super(Super, 1) #@
+                # self is not a subtype of Bupper
+                super(Bupper, self) #@
+        class Bupper(Super):
+            pass
+        ''')
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, objects.Super)
+        with self.assertRaises(exceptions.SuperError) as cm:
+            first.super_mro()
+        self.assertEqual(str(cm.exception), "The first super argument must be type.")
+
+        for node in ast_nodes[1:]:
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, objects.Super, node)
+            with self.assertRaises(exceptions.SuperArgumentTypeError) as cm:
+                inferred.super_mro()
+            self.assertEqual(str(cm.exception),
+                             "super(type, obj): obj must be an instance "
+                             "or subtype of type", node)
+
+    def test_proxied(self):
+        node = test_utils.extract_node('''
+        class Super(object):
+            def __init__(self):
+                super(Super, self) #@
+        ''')
+        infered = next(node.infer())
+        proxied = infered._proxied
+        self.assertEqual(proxied.qname(), "%s.super" % bases.BUILTINS)
+        self.assertIsInstance(proxied, nodes.ClassDef)
+
+    def test_super_bound_model(self):
+        ast_nodes = test_utils.extract_node('''
+        class First(object):
+            def method(self):
+                pass
+            @classmethod
+            def class_method(cls):
+                pass
+        class Super_Type_Type(First):    
+            def method(self):
+                super(Super_Type_Type, Super_Type_Type).method #@
+                super(Super_Type_Type, Super_Type_Type).class_method #@
+            @classmethod
+            def class_method(cls):
+                super(Super_Type_Type, Super_Type_Type).method #@
+                super(Super_Type_Type, Super_Type_Type).class_method #@
+
+        class Super_Type_Object(First):    
+            def method(self):
+                super(Super_Type_Object, self).method #@
+                super(Super_Type_Object, self).class_method #@
+        ''')
+        # Super(type, type) is the same for both functions and classmethods.
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, nodes.FunctionDef)
+        self.assertEqual(first.name, 'method')
+
+        second = next(ast_nodes[1].infer())
+        self.assertIsInstance(second, bases.BoundMethod)
+        self.assertEqual(second.bound.name, 'First')
+        self.assertEqual(second.type, 'classmethod')
+
+        third = next(ast_nodes[2].infer())
+        self.assertIsInstance(third, nodes.FunctionDef)
+        self.assertEqual(third.name, 'method')
+
+        fourth = next(ast_nodes[3].infer())
+        self.assertIsInstance(fourth, bases.BoundMethod)
+        self.assertEqual(fourth.bound.name, 'First')
+        self.assertEqual(fourth.type, 'classmethod')
+
+        # Super(type, obj) can lead to different attribute bindings
+        # depending on the type of the place where super was called.
+        fifth = next(ast_nodes[4].infer())
+        self.assertIsInstance(fifth, bases.BoundMethod)
+        self.assertEqual(fifth.bound.name, 'First')
+        self.assertEqual(fifth.type, 'method')
+
+        sixth = next(ast_nodes[5].infer())
+        self.assertIsInstance(sixth, bases.BoundMethod)
+        self.assertEqual(sixth.bound.name, 'First')
+        self.assertEqual(sixth.type, 'classmethod')
+
+    def test_super_getattr_single_inheritance(self):
+        ast_nodes = test_utils.extract_node('''
+        class First(object):
+            def test(self): pass
+        class Second(First):
+            def test2(self): pass
+        class Third(Second):
+            test3 = 42
+            def __init__(self):
+                super(Third, self).test2 #@
+                super(Third, self).test #@
+                # test3 is local, no MRO lookup is done.
+                super(Third, self).test3 #@
+                super(Third, self) #@
+
+                # Unbounds.
+                super(Third, Third).test2 #@
+                super(Third, Third).test #@
+
+        ''')
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, bases.BoundMethod)
+        self.assertEqual(first.bound.name, 'Second')
+
+        second = next(ast_nodes[1].infer())
+        self.assertIsInstance(second, bases.BoundMethod)
+        self.assertEqual(second.bound.name, 'First')
+
+        with self.assertRaises(exceptions.InferenceError):
+            next(ast_nodes[2].infer())
+        fourth = next(ast_nodes[3].infer())
+        with self.assertRaises(exceptions.NotFoundError):
+            fourth.getattr('test3')
+        with self.assertRaises(exceptions.NotFoundError):
+            next(fourth.igetattr('test3'))
+
+        first_unbound = next(ast_nodes[4].infer())
+        self.assertIsInstance(first_unbound, nodes.FunctionDef)
+        self.assertEqual(first_unbound.name, 'test2')
+        self.assertEqual(first_unbound.parent.name, 'Second')
+
+        second_unbound = next(ast_nodes[5].infer())
+        self.assertIsInstance(second_unbound, nodes.FunctionDef)
+        self.assertEqual(second_unbound.name, 'test')
+        self.assertEqual(second_unbound.parent.name, 'First')
+
+    def test_super_invalid_mro(self):
+        node = test_utils.extract_node('''
+        class A(object):
+           test = 42
+        class Super(A, A):
+           def __init__(self):
+               super(Super, self) #@
+        ''')
+        inferred = next(node.infer())
+        with self.assertRaises(exceptions.NotFoundError):
+            next(inferred.getattr('test'))
+
+    def test_super_complex_mro(self):
+        ast_nodes = test_utils.extract_node('''
+        class A(object):
+            def spam(self): return "A"
+            def foo(self): return "A"
+            @staticmethod
+            def static(self): pass
+        class B(A):
+            def boo(self): return "B"
+            def spam(self): return "B"
+        class C(A):
+            def boo(self): return "C"
+        class E(C, B):
+            def __init__(self):
+                super(E, self).boo #@
+                super(C, self).boo #@
+                super(E, self).spam #@
+                super(E, self).foo #@
+                super(E, self).static #@
+        ''')
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, bases.BoundMethod)
+        self.assertEqual(first.bound.name, 'C')
+        second = next(ast_nodes[1].infer())
+        self.assertIsInstance(second, bases.BoundMethod)
+        self.assertEqual(second.bound.name, 'B')
+        third = next(ast_nodes[2].infer())
+        self.assertIsInstance(third, bases.BoundMethod)
+        self.assertEqual(third.bound.name, 'B')
+        fourth = next(ast_nodes[3].infer())
+        self.assertEqual(fourth.bound.name, 'A')
+        static = next(ast_nodes[4].infer())
+        self.assertIsInstance(static, nodes.FunctionDef)
+        self.assertEqual(static.parent.scope().name, 'A')
+
+    def test_super_data_model(self):
+        ast_nodes = test_utils.extract_node('''
+        class X(object): pass
+        class A(X):
+            def __init__(self):
+                super(A, self) #@
+                super(A, A) #@
+                super(X, A) #@
+        ''')
+        first = next(ast_nodes[0].infer())
+        thisclass = first.getattr('__thisclass__')[0]
+        self.assertIsInstance(thisclass, nodes.ClassDef)
+        self.assertEqual(thisclass.name, 'A')
+        selfclass = first.getattr('__self_class__')[0]
+        self.assertIsInstance(selfclass, nodes.ClassDef)
+        self.assertEqual(selfclass.name, 'A')
+        self_ = first.getattr('__self__')[0]
+        self.assertIsInstance(self_, bases.Instance)
+        self.assertEqual(self_.name, 'A')
+        cls = first.getattr('__class__')[0]
+        self.assertEqual(cls, first._proxied)
+
+        second = next(ast_nodes[1].infer())
+        thisclass = second.getattr('__thisclass__')[0]
+        self.assertEqual(thisclass.name, 'A')
+        self_ = second.getattr('__self__')[0]
+        self.assertIsInstance(self_, nodes.ClassDef)
+        self.assertEqual(self_.name, 'A')
+
+        third = next(ast_nodes[2].infer())
+        thisclass = third.getattr('__thisclass__')[0]
+        self.assertEqual(thisclass.name, 'X')
+        selfclass = third.getattr('__self_class__')[0]
+        self.assertEqual(selfclass.name, 'A')
+
+    def assertEqualMro(self, klass, expected_mro):
+        self.assertEqual(
+            [member.name for member in klass.super_mro()],
+            expected_mro)
+
+    def test_super_mro(self):
+        ast_nodes = test_utils.extract_node('''
+        class A(object): pass
+        class B(A): pass
+        class C(A): pass
+        class E(C, B):
+            def __init__(self):
+                super(E, self) #@
+                super(C, self) #@
+                super(B, self) #@
+
+                super(B, 1) #@
+                super(1, B) #@
+        ''')
+        first = next(ast_nodes[0].infer())
+        self.assertEqualMro(first, ['C', 'B', 'A', 'object'])
+        second = next(ast_nodes[1].infer())
+        self.assertEqualMro(second, ['B', 'A', 'object'])
+        third = next(ast_nodes[2].infer())
+        self.assertEqualMro(third, ['A', 'object'])
+
+        fourth = next(ast_nodes[3].infer())
+        with self.assertRaises(exceptions.SuperError):
+            fourth.super_mro()
+        fifth = next(ast_nodes[4].infer())
+        with self.assertRaises(exceptions.SuperError):
+            fifth.super_mro()
+
+    def test_super_yes_objects(self):
+        ast_nodes = test_utils.extract_node('''
+        from collections import Missing
+        class A(object):
+            def __init__(self):
+                super(Missing, self) #@
+                super(A, Missing) #@
+        ''')
+        first = next(ast_nodes[0].infer())
+        self.assertIsInstance(first, bases.Instance)
+        second = next(ast_nodes[1].infer())
+        self.assertIsInstance(second, bases.Instance)
+
+    def test_super_invalid_types(self):
+        node = test_utils.extract_node('''
+        import collections
+        class A(object):
+            def __init__(self):
+                super(A, collections) #@
+        ''')
+        inferred = next(node.infer())
+        with self.assertRaises(exceptions.SuperError):
+            inferred.super_mro()
+        with self.assertRaises(exceptions.SuperArgumentTypeError):
+            inferred.super_mro()
+
+    def test_super_pytype_display_type_name(self):
+        node = test_utils.extract_node('''
+        class A(object):
+            def __init__(self):
+                super(A, self) #@
+        ''')
+        inferred = next(node.infer())
+        self.assertEqual(inferred.pytype(), "%s.super" % bases.BUILTINS)
+        self.assertEqual(inferred.display_type(), 'Super of')
+        self.assertEqual(inferred.name, 'A')
+
+    def test_super_properties(self):
+        node = test_utils.extract_node('''
+        class Foo(object):
+            @property
+            def dict(self):
+                return 42
+
+        class Bar(Foo):
+            @property
+            def dict(self):
+                return super(Bar, self).dict
+
+        Bar().dict
+        ''')
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, 42)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_brain.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_brain.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_brain.py	(revision 1126)
@@ -0,0 +1,501 @@
+# Copyright 2013 Google Inc. All Rights Reserved.
+#
+# This file is part of astroid.
+#
+# logilab-astng is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# logilab-astng is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
+"""Tests for basic functionality in astroid.brain."""
+import sys
+import unittest
+
+import six
+
+from astroid import MANAGER
+from astroid import bases
+from astroid import builder
+from astroid import nodes
+from astroid import test_utils
+from astroid import util
+import astroid
+
+
+try:
+    import nose # pylint: disable=unused-import
+    HAS_NOSE = True
+except ImportError:
+    HAS_NOSE = False
+
+try:
+    import multiprocessing # pylint: disable=unused-import
+    HAS_MULTIPROCESSING = True
+except ImportError:
+    HAS_MULTIPROCESSING = False
+
+try:
+    import enum # pylint: disable=unused-import
+    HAS_ENUM = True
+except ImportError:
+    HAS_ENUM = False
+
+try:
+    import dateutil # pylint: disable=unused-import
+    HAS_DATEUTIL = True
+except ImportError:
+    HAS_DATEUTIL = False
+
+try:
+    import numpy # pylint: disable=unused-import
+    HAS_NUMPY = True
+except ImportError:
+    HAS_NUMPY = False
+
+try:
+    import pytest # pylint: disable=unused-import
+    HAS_PYTEST = True
+except ImportError:
+    HAS_PYTEST = False
+
+
+class HashlibTest(unittest.TestCase):
+    def test_hashlib(self):
+        """Tests that brain extensions for hashlib work."""
+        hashlib_module = MANAGER.ast_from_module_name('hashlib')
+        for class_name in ['md5', 'sha1']:
+            class_obj = hashlib_module[class_name]
+            self.assertIn('update', class_obj)
+            self.assertIn('digest', class_obj)
+            self.assertIn('hexdigest', class_obj)
+            self.assertIn('block_size', class_obj)
+            self.assertIn('digest_size', class_obj)
+            self.assertEqual(len(class_obj['__init__'].args.args), 2)
+            self.assertEqual(len(class_obj['__init__'].args.defaults), 1)
+            self.assertEqual(len(class_obj['update'].args.args), 2)
+            self.assertEqual(len(class_obj['digest'].args.args), 1)
+            self.assertEqual(len(class_obj['hexdigest'].args.args), 1)
+
+
+class NamedTupleTest(unittest.TestCase):
+
+    def test_namedtuple_base(self):
+        klass = test_utils.extract_node("""
+        from collections import namedtuple
+
+        class X(namedtuple("X", ["a", "b", "c"])):
+           pass
+        """)
+        self.assertEqual(
+            [anc.name for anc in klass.ancestors()],
+            ['X', 'tuple', 'object'])
+        for anc in klass.ancestors():
+            self.assertFalse(anc.parent is None)
+
+    def test_namedtuple_inference(self):
+        klass = test_utils.extract_node("""
+        from collections import namedtuple
+
+        name = "X"
+        fields = ["a", "b", "c"]
+        class X(namedtuple(name, fields)):
+           pass
+        """)
+        for base in klass.ancestors():
+            if base.name == 'X':
+                break
+        self.assertSetEqual({"a", "b", "c"}, set(base._instance_attrs))
+
+    def test_namedtuple_inference_failure(self):
+        klass = test_utils.extract_node("""
+        from collections import namedtuple
+
+        def foo(fields):
+           return __(namedtuple("foo", fields))
+        """)
+        self.assertIs(util.YES, next(klass.infer()))
+
+    @unittest.skipIf(sys.version_info[0] > 2,
+                     'namedtuple inference is broken on Python 3')
+    def test_namedtuple_advanced_inference(self):
+        # urlparse return an object of class ParseResult, which has a
+        # namedtuple call and a mixin as base classes
+        result = test_utils.extract_node("""
+        import urlparse
+
+        result = __(urlparse.urlparse('gopher://'))
+        """)
+        instance = next(result.infer())
+        self.assertEqual(len(instance.getattr('scheme')), 1)
+        self.assertEqual(len(instance.getattr('port')), 1)
+        with self.assertRaises(astroid.NotFoundError):
+            instance.getattr('foo')
+        self.assertEqual(len(instance.getattr('geturl')), 1)
+        self.assertEqual(instance.name, 'ParseResult')
+
+    def test_namedtuple_instance_attrs(self):
+        result = test_utils.extract_node('''
+        from collections import namedtuple
+        namedtuple('a', 'a b c')(1, 2, 3) #@
+        ''')
+        inferred = next(result.infer())
+        for name, attr in inferred._instance_attrs.items():
+            self.assertEqual(attr[0].attrname, name)
+
+    def test_namedtuple_uninferable_fields(self):
+        node = test_utils.extract_node('''
+        x = [A] * 2
+        from collections import namedtuple
+        l = namedtuple('a', x)
+        l(1)
+        ''')
+        inferred = next(node.infer())
+        self.assertIs(util.YES, inferred)
+
+
+class ModuleExtenderTest(unittest.TestCase):
+    def testExtensionModules(self):
+        transformer = MANAGER._transform
+        for extender, _ in transformer.transforms[nodes.Module]:
+            n = nodes.Module('__main__', None)
+            extender(n)
+
+
+@unittest.skipUnless(HAS_NOSE, "This test requires nose library.")
+class NoseBrainTest(unittest.TestCase):
+
+    def test_nose_tools(self):
+        methods = test_utils.extract_node("""
+        from nose.tools import assert_equal
+        from nose.tools import assert_equals
+        from nose.tools import assert_true
+        assert_equal = assert_equal #@
+        assert_true = assert_true #@
+        assert_equals = assert_equals #@
+        """)
+        assert_equal = next(methods[0].value.infer())
+        assert_true = next(methods[1].value.infer())
+        assert_equals = next(methods[2].value.infer())
+
+        self.assertIsInstance(assert_equal, astroid.BoundMethod)
+        self.assertIsInstance(assert_true, astroid.BoundMethod)
+        self.assertIsInstance(assert_equals, astroid.BoundMethod)
+        self.assertEqual(assert_equal.qname(),
+                         'unittest.case.TestCase.assertEqual')
+        self.assertEqual(assert_true.qname(),
+                         'unittest.case.TestCase.assertTrue')
+        self.assertEqual(assert_equals.qname(),
+                         'unittest.case.TestCase.assertEqual')
+
+
+class SixBrainTest(unittest.TestCase):
+
+    def test_attribute_access(self):
+        ast_nodes = test_utils.extract_node('''
+        import six
+        six.moves.http_client #@
+        six.moves.urllib_parse #@
+        six.moves.urllib_error #@
+        six.moves.urllib.request #@
+        ''')
+        http_client = next(ast_nodes[0].infer())
+        self.assertIsInstance(http_client, nodes.Module)
+        self.assertEqual(http_client.name,
+                         'http.client' if six.PY3 else 'httplib')
+
+        urllib_parse = next(ast_nodes[1].infer())
+        if six.PY3:
+            self.assertIsInstance(urllib_parse, nodes.Module)
+            self.assertEqual(urllib_parse.name, 'urllib.parse')
+        else:
+            # On Python 2, this is a fake module, the same behaviour
+            # being mimicked in brain's tip for six.moves.
+            self.assertIsInstance(urllib_parse, astroid.Instance)
+        urljoin = next(urllib_parse.igetattr('urljoin'))
+        urlencode = next(urllib_parse.igetattr('urlencode'))
+        if six.PY2:
+            # In reality it's a function, but our implementations
+            # transforms it into a method.
+            self.assertIsInstance(urljoin, astroid.BoundMethod)
+            self.assertEqual(urljoin.qname(), 'urlparse.urljoin')
+            self.assertIsInstance(urlencode, astroid.BoundMethod)
+            self.assertEqual(urlencode.qname(), 'urllib.urlencode')
+        else:
+            self.assertIsInstance(urljoin, nodes.FunctionDef)
+            self.assertEqual(urljoin.qname(), 'urllib.parse.urljoin')
+            self.assertIsInstance(urlencode, nodes.FunctionDef)
+            self.assertEqual(urlencode.qname(), 'urllib.parse.urlencode')
+
+        urllib_error = next(ast_nodes[2].infer())
+        if six.PY3:
+            self.assertIsInstance(urllib_error, nodes.Module)
+            self.assertEqual(urllib_error.name, 'urllib.error')
+        else:
+            # On Python 2, this is a fake module, the same behaviour
+            # being mimicked in brain's tip for six.moves.
+            self.assertIsInstance(urllib_error, astroid.Instance)
+        urlerror = next(urllib_error.igetattr('URLError'))
+        self.assertIsInstance(urlerror, nodes.ClassDef)
+        content_too_short = next(urllib_error.igetattr('ContentTooShortError'))
+        self.assertIsInstance(content_too_short, nodes.ClassDef)
+
+        urllib_request = next(ast_nodes[3].infer())
+        if six.PY3:
+            self.assertIsInstance(urllib_request, nodes.Module)
+            self.assertEqual(urllib_request.name, 'urllib.request')
+        else:
+            self.assertIsInstance(urllib_request, astroid.Instance)
+        urlopen = next(urllib_request.igetattr('urlopen'))
+        urlretrieve = next(urllib_request.igetattr('urlretrieve'))
+        if six.PY2:
+            # In reality it's a function, but our implementations
+            # transforms it into a method.
+            self.assertIsInstance(urlopen, astroid.BoundMethod)
+            self.assertEqual(urlopen.qname(), 'urllib2.urlopen')
+            self.assertIsInstance(urlretrieve, astroid.BoundMethod)
+            self.assertEqual(urlretrieve.qname(), 'urllib.urlretrieve')
+        else:
+            self.assertIsInstance(urlopen, nodes.FunctionDef)
+            self.assertEqual(urlopen.qname(), 'urllib.request.urlopen')
+            self.assertIsInstance(urlretrieve, nodes.FunctionDef)
+            self.assertEqual(urlretrieve.qname(), 'urllib.request.urlretrieve')
+
+    def test_from_imports(self):
+        ast_node = test_utils.extract_node('''
+        from six.moves import http_client
+        http_client.HTTPSConnection #@
+        ''')
+        inferred = next(ast_node.infer())
+        self.assertIsInstance(inferred, nodes.ClassDef)
+        if six.PY3:
+            qname = 'http.client.HTTPSConnection'
+        else:
+            qname = 'httplib.HTTPSConnection'
+        self.assertEqual(inferred.qname(), qname)
+
+
+@unittest.skipUnless(HAS_MULTIPROCESSING,
+                     'multiprocesing is required for this test, but '
+                     'on some platforms it is missing '
+                     '(Jython for instance)')
+class MultiprocessingBrainTest(unittest.TestCase):
+
+    def test_multiprocessing_module_attributes(self):
+        # Test that module attributes are working,
+        # especially on Python 3.4+, where they are obtained
+        # from a context.
+        module = test_utils.extract_node("""
+        import multiprocessing
+        """)
+        module = module.do_import_module('multiprocessing')
+        cpu_count = next(module.igetattr('cpu_count'))
+        if sys.version_info < (3, 4):
+            self.assertIsInstance(cpu_count, nodes.FunctionDef)
+        else:
+            self.assertIsInstance(cpu_count, astroid.BoundMethod)
+
+    def test_module_name(self):
+        module = test_utils.extract_node("""
+        import multiprocessing
+        multiprocessing.SyncManager()
+        """)
+        inferred_sync_mgr = next(module.infer())
+        module = inferred_sync_mgr.root()
+        self.assertEqual(module.name, 'multiprocessing.managers')
+
+    def test_multiprocessing_manager(self):
+        # Test that we have the proper attributes
+        # for a multiprocessing.managers.SyncManager
+        module = builder.parse("""
+        import multiprocessing
+        manager = multiprocessing.Manager()
+        queue = manager.Queue()
+        joinable_queue = manager.JoinableQueue()
+        event = manager.Event()
+        rlock = manager.RLock()
+        bounded_semaphore = manager.BoundedSemaphore()
+        condition = manager.Condition()
+        barrier = manager.Barrier()
+        pool = manager.Pool()
+        list = manager.list()
+        dict = manager.dict()
+        value = manager.Value()
+        array = manager.Array()
+        namespace = manager.Namespace()
+        """)
+        queue = next(module['queue'].infer())
+        self.assertEqual(queue.qname(),
+                         "{}.Queue".format(six.moves.queue.__name__))
+
+        joinable_queue = next(module['joinable_queue'].infer())
+        self.assertEqual(joinable_queue.qname(),
+                         "{}.Queue".format(six.moves.queue.__name__))
+
+        event = next(module['event'].infer())
+        event_name = "threading.{}".format("Event" if six.PY3 else "_Event")
+        self.assertEqual(event.qname(), event_name)
+
+        rlock = next(module['rlock'].infer())
+        rlock_name = "threading._RLock"
+        self.assertEqual(rlock.qname(), rlock_name)
+
+        bounded_semaphore = next(module['bounded_semaphore'].infer())
+        semaphore_name = "threading.{}".format(
+            "BoundedSemaphore" if six.PY3 else "_BoundedSemaphore")
+        self.assertEqual(bounded_semaphore.qname(), semaphore_name)
+
+        pool = next(module['pool'].infer())
+        pool_name = "multiprocessing.pool.Pool"
+        self.assertEqual(pool.qname(), pool_name)
+
+        for attr in ('list', 'dict'):
+            obj = next(module[attr].infer())
+            self.assertEqual(obj.qname(),
+                             "{}.{}".format(bases.BUILTINS, attr))
+
+        array = next(module['array'].infer())
+        self.assertEqual(array.qname(), "array.array")
+
+        manager = next(module['manager'].infer())
+        # Verify that we have these attributes
+        self.assertTrue(manager.getattr('start'))
+        self.assertTrue(manager.getattr('shutdown'))
+
+
+@unittest.skipUnless(HAS_ENUM,
+                     'The enum module was only added in Python 3.4. Support for '
+                     'older Python versions may be available through the enum34 '
+                     'compatibility module.')
+class EnumBrainTest(unittest.TestCase):
+
+    def test_simple_enum(self):
+        module = builder.parse("""
+        import enum
+
+        class MyEnum(enum.Enum):
+            one = "one"
+            two = "two"
+
+            def mymethod(self, x):
+                return 5
+
+        """)
+
+        enum = next(module['MyEnum'].infer())
+        one = enum['one']
+        self.assertEqual(one.pytype(), '.MyEnum.one')
+
+        property_type = '{}.property'.format(bases.BUILTINS)
+        for propname in ('name', 'value'):
+            prop = next(iter(one.getattr(propname)))
+            self.assertIn(property_type, prop.decoratornames())
+
+        meth = one.getattr('mymethod')[0]
+        self.assertIsInstance(meth, astroid.FunctionDef)
+
+    def test_looks_like_enum_false_positive(self):
+        # Test that a class named Enumeration is not considered a builtin enum.
+        module = builder.parse('''
+        class Enumeration(object):
+            def __init__(self, name, enum_list):
+                pass
+            test = 42
+        ''')
+        enum = module['Enumeration']
+        test = next(enum.igetattr('test'))
+        self.assertEqual(test.value, 42)
+
+    def test_enum_multiple_base_classes(self):
+        module = builder.parse("""
+        import enum
+
+        class Mixin:
+            pass
+
+        class MyEnum(Mixin, enum.Enum):
+            one = 1
+        """)
+        enum = next(module['MyEnum'].infer())
+        one = enum['one']
+
+        clazz = one.getattr('__class__')[0]
+        self.assertTrue(clazz.is_subtype_of('.Mixin'),
+                        'Enum instance should share base classes with generating class')
+
+    def test_int_enum(self):
+        module = builder.parse("""
+        import enum
+
+        class MyEnum(enum.IntEnum):
+            one = 1
+        """)
+
+        enum = next(module['MyEnum'].infer())
+        one = enum['one']
+
+        clazz = one.getattr('__class__')[0]
+        int_type = '{}.{}'.format(bases.BUILTINS, 'int')
+        self.assertTrue(clazz.is_subtype_of(int_type),
+                        'IntEnum based enums should be a subtype of int')
+
+    def test_enum_func_form_is_class_not_instance(self):
+        cls, instance = test_utils.extract_node('''
+        from enum import Enum
+        f = Enum('Audience', ['a', 'b', 'c'])
+        f #@
+        f() #@
+        ''')
+        inferred_cls = next(cls.infer())
+        self.assertIsInstance(inferred_cls, nodes.ClassDef)
+        inferred_instance = next(instance.infer())
+        self.assertIsInstance(inferred_instance, bases.Instance)
+
+
+@unittest.skipUnless(HAS_DATEUTIL, "This test requires the dateutil library.")
+class DateutilBrainTest(unittest.TestCase):
+    def test_parser(self):
+        module = builder.parse("""
+        from dateutil.parser import parse
+        d = parse('2000-01-01')
+        """)
+        d_type = next(module['d'].infer())
+        self.assertEqual(d_type.qname(), "datetime.datetime")
+
+
+@unittest.skipUnless(HAS_NUMPY, "This test requires the numpy library.")
+class NumpyBrainTest(unittest.TestCase):
+
+    def test_numpy(self):
+        node = test_utils.extract_node('''
+        import numpy
+        numpy.ones #@
+        ''')
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, nodes.FunctionDef)
+
+
+@unittest.skipUnless(HAS_PYTEST, "This test requires the pytest library.")
+class PytestBrainTest(unittest.TestCase):
+
+    def test_pytest(self):
+        ast_node = test_utils.extract_node('''
+        import pytest
+        pytest #@
+        ''')
+        module = next(ast_node.infer())
+        self.assertIn('deprecated_call', module)
+        self.assertIn('exit', module)
+        self.assertIn('fail', module)
+        self.assertIn('fixture', module)
+        self.assertIn('mark', module)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_transforms.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_transforms.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_transforms.py	(revision 1126)
@@ -0,0 +1,245 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import print_function
+
+import contextlib
+import time
+import unittest
+
+from astroid import builder
+from astroid import nodes
+from astroid import parse
+from astroid import transforms
+
+
+@contextlib.contextmanager
+def add_transform(manager, node, transform, predicate=None):
+    manager.register_transform(node, transform, predicate)
+    try:
+        yield
+    finally:
+        manager.unregister_transform(node, transform, predicate)
+
+
+class TestTransforms(unittest.TestCase):
+
+    def setUp(self):
+        self.transformer = transforms.TransformVisitor()
+
+    def parse_transform(self, code):
+        module = parse(code, apply_transforms=False)
+        return self.transformer.visit(module)
+
+    def test_function_inlining_transform(self):
+        def transform_call(node):
+            # Let's do some function inlining
+            inferred = next(node.infer())
+            return inferred
+
+        self.transformer.register_transform(nodes.Call,
+                                            transform_call)
+
+        module = self.parse_transform('''
+        def test(): return 42
+        test() #@
+        ''')
+
+        self.assertIsInstance(module.body[1], nodes.Expr)
+        self.assertIsInstance(module.body[1].value, nodes.Const)
+        self.assertEqual(module.body[1].value.value, 42)
+
+    def test_recursive_transforms_into_astroid_fields(self):
+        # Test that the transformer walks properly the tree
+        # by going recursively into the _astroid_fields per each node.
+        def transform_compare(node):
+            # Let's check the values of the ops
+            _, right = node.ops[0]
+            # Assume they are Consts and they were transformed before
+            # us.
+            return nodes.const_factory(node.left.value < right.value)
+
+        def transform_name(node):
+            # Should be Consts
+            return next(node.infer())
+
+        self.transformer.register_transform(nodes.Compare, transform_compare)
+        self.transformer.register_transform(nodes.Name, transform_name)
+
+        module = self.parse_transform('''
+        a = 42
+        b = 24
+        a < b
+        ''')
+
+        self.assertIsInstance(module.body[2], nodes.Expr)
+        self.assertIsInstance(module.body[2].value, nodes.Const)
+        self.assertFalse(module.body[2].value.value)
+
+    def test_transform_patches_locals(self):
+        def transform_function(node):
+            assign = nodes.Assign()
+            name = nodes.AssignName()
+            name.name = 'value'
+            assign.targets = [name]
+            assign.value = nodes.const_factory(42)
+            node.body.append(assign)
+
+        self.transformer.register_transform(nodes.FunctionDef,
+                                            transform_function)
+
+        module = self.parse_transform('''
+        def test():
+            pass
+        ''')
+
+        func = module.body[0]
+        self.assertEqual(len(func.body), 2)
+        self.assertIsInstance(func.body[1], nodes.Assign)
+        self.assertEqual(func.body[1].as_string(), 'value = 42')
+
+    def test_predicates(self):
+        def transform_call(node):
+            inferred = next(node.infer())
+            return inferred
+
+        def should_inline(node):
+            return node.func.name.startswith('inlineme')
+
+        self.transformer.register_transform(nodes.Call,
+                                            transform_call,
+                                            should_inline)
+
+        module = self.parse_transform('''
+        def inlineme_1():
+            return 24
+        def dont_inline_me():
+            return 42
+        def inlineme_2():
+            return 2
+        inlineme_1()
+        dont_inline_me()
+        inlineme_2()
+        ''')
+        values = module.body[-3:]
+        self.assertIsInstance(values[0], nodes.Expr)
+        self.assertIsInstance(values[0].value, nodes.Const)
+        self.assertEqual(values[0].value.value, 24)
+        self.assertIsInstance(values[1], nodes.Expr)
+        self.assertIsInstance(values[1].value, nodes.Call)
+        self.assertIsInstance(values[2], nodes.Expr)
+        self.assertIsInstance(values[2].value, nodes.Const)
+        self.assertEqual(values[2].value.value, 2)
+
+    def test_transforms_are_separated(self):
+        # Test that the transforming is done at a separate
+        # step, which means that we are not doing inference
+        # on a partially constructred tree anymore, which was the
+        # source of crashes in the past when certain inference rules
+        # were used in a transform.
+        def transform_function(node):
+            if node.decorators:
+                for decorator in node.decorators.nodes:
+                    inferred = next(decorator.infer())
+                    if inferred.qname() == 'abc.abstractmethod':
+                        return next(node.infer_call_result(node))
+
+        manager = builder.MANAGER
+        with add_transform(manager, nodes.FunctionDef, transform_function):
+            module = builder.parse('''
+            import abc
+            from abc import abstractmethod
+
+            class A(object):
+                @abc.abstractmethod
+                def ala(self):
+                    return 24
+
+                @abstractmethod
+                def bala(self):
+                    return 42
+            ''')
+
+        cls = module['A']
+        ala = cls.body[0]
+        bala = cls.body[1]
+        self.assertIsInstance(ala, nodes.Const)
+        self.assertEqual(ala.value, 24)
+        self.assertIsInstance(bala, nodes.Const)
+        self.assertEqual(bala.value, 42)
+
+    def test_transforms_are_called_for_builtin_modules(self):
+        # Test that transforms are called for builtin modules.
+        def transform_function(node):
+            name = nodes.AssignName()
+            name.name = 'value'
+            node.args.args = [name]
+            return node
+
+        manager = builder.MANAGER
+        predicate = lambda node: node.root().name == 'time'
+        with add_transform(manager, nodes.FunctionDef,
+                           transform_function, predicate):
+            builder_instance = builder.AstroidBuilder()
+            module = builder_instance.module_build(time)
+
+        asctime = module['asctime']
+        self.assertEqual(len(asctime.args.args), 1)
+        self.assertIsInstance(asctime.args.args[0], nodes.AssignName)
+        self.assertEqual(asctime.args.args[0].name, 'value')
+
+    def test_builder_apply_transforms(self):
+        def transform_function(node):
+            return nodes.const_factory(42)
+
+        manager = builder.MANAGER
+        with add_transform(manager, nodes.FunctionDef, transform_function):
+            astroid_builder = builder.AstroidBuilder(apply_transforms=False)
+            module = astroid_builder.string_build('''def test(): pass''')
+
+        # The transform wasn't applied.
+        self.assertIsInstance(module.body[0], nodes.FunctionDef)
+
+    def test_transform_crashes_on_is_subtype_of(self):
+        # Test that we don't crash when having is_subtype_of
+        # in a transform, as per issue #188. This happened
+        # before, when the transforms weren't in their own step.
+        def transform_class(cls):
+            if cls.is_subtype_of('django.db.models.base.Model'):
+                return cls
+            return cls
+
+        self.transformer.register_transform(nodes.ClassDef,
+                                            transform_class)
+
+        self.parse_transform('''
+            # Change environ to automatically call putenv() if it exists
+            import os
+            putenv = os.putenv
+            try:
+                # This will fail if there's no putenv
+                putenv
+            except NameError:
+                pass
+            else:
+                import UserDict
+        ''')
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_inference.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_inference.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_inference.py	(revision 1126)
@@ -0,0 +1,2130 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""tests for the astroid inference capabilities
+"""
+import sys
+from functools import partial
+import unittest
+import warnings
+
+import six
+
+from astroid import InferenceError, builder, nodes
+from astroid.builder import parse
+from astroid.inference import infer_end as inference_infer_end
+from astroid.bases import Instance, BoundMethod, UnboundMethod,\
+                                path_wrapper, BUILTINS
+from astroid import arguments
+from astroid import objects
+from astroid import test_utils
+from astroid import util
+from astroid.tests import resources
+
+
+def get_node_of_class(start_from, klass):
+    return next(start_from.nodes_of_class(klass))
+
+builder = builder.AstroidBuilder()
+
+if sys.version_info < (3, 0):
+    EXC_MODULE = 'exceptions'
+else:
+    EXC_MODULE = BUILTINS
+
+
+class InferenceUtilsTest(unittest.TestCase):
+
+    def test_path_wrapper(self):
+        def infer_default(self, *args):
+            raise InferenceError
+        infer_default = path_wrapper(infer_default)
+        infer_end = path_wrapper(inference_infer_end)
+        with self.assertRaises(InferenceError):
+            next(infer_default(1))
+        self.assertEqual(next(infer_end(1)), 1)
+
+
+def _assertInferElts(node_type, self, node, elts):
+    inferred = next(node.infer())
+    self.assertIsInstance(inferred, node_type)
+    self.assertEqual(sorted(elt.value for elt in inferred.elts),
+                     elts)
+
+def partialmethod(func, arg):
+    """similar to functools.partial but return a lambda instead of a class so returned value may be
+    turned into a method.
+    """
+    return lambda *args, **kwargs: func(arg, *args, **kwargs)
+
+class InferenceTest(resources.SysPathSetup, unittest.TestCase):
+
+    # additional assertInfer* method for builtin types
+
+    def assertInferConst(self, node, expected):
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, expected)
+
+    def assertInferDict(self, node, expected):
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, nodes.Dict)
+
+        elts = set([(key.value, value.value)
+                    for (key, value) in inferred.items])
+        self.assertEqual(sorted(elts), sorted(expected.items()))
+
+    assertInferTuple = partialmethod(_assertInferElts, nodes.Tuple)
+    assertInferList = partialmethod(_assertInferElts, nodes.List)
+    assertInferSet = partialmethod(_assertInferElts, nodes.Set)
+    assertInferFrozenSet = partialmethod(_assertInferElts, objects.FrozenSet)
+
+    CODE = '''
+        class C(object):
+            "new style"
+            attr = 4
+
+            def meth1(self, arg1, optarg=0):
+                var = object()
+                print ("yo", arg1, optarg)
+                self.iattr = "hop"
+                return var
+
+            def meth2(self):
+                self.meth1(*self.meth3)
+
+            def meth3(self, d=attr):
+                b = self.attr
+                c = self.iattr
+                return b, c
+
+        ex = Exception("msg")
+        v = C().meth1(1)
+        m_unbound = C.meth1
+        m_bound = C().meth1
+        a, b, c = ex, 1, "bonjour"
+        [d, e, f] = [ex, 1.0, ("bonjour", v)]
+        g, h = f
+        i, (j, k) = "glup", f
+
+        a, b= b, a # Gasp !
+        '''
+
+    ast = parse(CODE, __name__)
+
+    def test_infer_abstract_property_return_values(self):
+        module = parse('''
+        import abc
+
+        class A(object):
+            @abc.abstractproperty
+            def test(self):
+                return 42
+
+        a = A()
+        x = a.test
+        ''')
+        inferred = next(module['x'].infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, 42)
+
+    def test_module_inference(self):
+        inferred = self.ast.infer()
+        obj = next(inferred)
+        self.assertEqual(obj.name, __name__)
+        self.assertEqual(obj.root().name, __name__)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_class_inference(self):
+        inferred = self.ast['C'].infer()
+        obj = next(inferred)
+        self.assertEqual(obj.name, 'C')
+        self.assertEqual(obj.root().name, __name__)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_function_inference(self):
+        inferred = self.ast['C']['meth1'].infer()
+        obj = next(inferred)
+        self.assertEqual(obj.name, 'meth1')
+        self.assertEqual(obj.root().name, __name__)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_builtin_name_inference(self):
+        inferred = self.ast['C']['meth1']['var'].infer()
+        var = next(inferred)
+        self.assertEqual(var.name, 'object')
+        self.assertEqual(var.root().name, BUILTINS)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_tupleassign_name_inference(self):
+        inferred = self.ast['a'].infer()
+        exc = next(inferred)
+        self.assertIsInstance(exc, Instance)
+        self.assertEqual(exc.name, 'Exception')
+        self.assertEqual(exc.root().name, EXC_MODULE)
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast['b'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, 1)
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast['c'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, "bonjour")
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_listassign_name_inference(self):
+        inferred = self.ast['d'].infer()
+        exc = next(inferred)
+        self.assertIsInstance(exc, Instance)
+        self.assertEqual(exc.name, 'Exception')
+        self.assertEqual(exc.root().name, EXC_MODULE)
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast['e'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, 1.0)
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast['f'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Tuple)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_advanced_tupleassign_name_inference1(self):
+        inferred = self.ast['g'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, "bonjour")
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast['h'].infer()
+        var = next(inferred)
+        self.assertEqual(var.name, 'object')
+        self.assertEqual(var.root().name, BUILTINS)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_advanced_tupleassign_name_inference2(self):
+        inferred = self.ast['i'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, u"glup")
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast['j'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, "bonjour")
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast['k'].infer()
+        var = next(inferred)
+        self.assertEqual(var.name, 'object')
+        self.assertEqual(var.root().name, BUILTINS)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_swap_assign_inference(self):
+        inferred = self.ast._locals['a'][1].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, 1)
+        self.assertRaises(StopIteration, partial(next, inferred))
+        inferred = self.ast._locals['b'][1].infer()
+        exc = next(inferred)
+        self.assertIsInstance(exc, Instance)
+        self.assertEqual(exc.name, 'Exception')
+        self.assertEqual(exc.root().name, EXC_MODULE)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_getattr_inference1(self):
+        inferred = self.ast['ex'].infer()
+        exc = next(inferred)
+        self.assertIsInstance(exc, Instance)
+        self.assertEqual(exc.name, 'Exception')
+        self.assertEqual(exc.root().name, EXC_MODULE)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_getattr_inference2(self):
+        inferred = get_node_of_class(self.ast['C']['meth2'], nodes.Attribute).infer()
+        meth1 = next(inferred)
+        self.assertEqual(meth1.name, 'meth1')
+        self.assertEqual(meth1.root().name, __name__)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_getattr_inference3(self):
+        inferred = self.ast['C']['meth3']['b'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, 4)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_getattr_inference4(self):
+        inferred = self.ast['C']['meth3']['c'].infer()
+        const = next(inferred)
+        self.assertIsInstance(const, nodes.Const)
+        self.assertEqual(const.value, "hop")
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_callfunc_inference(self):
+        inferred = self.ast['v'].infer()
+        meth1 = next(inferred)
+        self.assertIsInstance(meth1, Instance)
+        self.assertEqual(meth1.name, 'object')
+        self.assertEqual(meth1.root().name, BUILTINS)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_unbound_method_inference(self):
+        inferred = self.ast['m_unbound'].infer()
+        meth1 = next(inferred)
+        self.assertIsInstance(meth1, UnboundMethod)
+        self.assertEqual(meth1.name, 'meth1')
+        self.assertEqual(meth1.parent.frame().name, 'C')
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_bound_method_inference(self):
+        inferred = self.ast['m_bound'].infer()
+        meth1 = next(inferred)
+        self.assertIsInstance(meth1, BoundMethod)
+        self.assertEqual(meth1.name, 'meth1')
+        self.assertEqual(meth1.parent.frame().name, 'C')
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_args_default_inference1(self):
+        optarg = test_utils.get_name_node(self.ast['C']['meth1'], 'optarg')
+        inferred = optarg.infer()
+        obj1 = next(inferred)
+        self.assertIsInstance(obj1, nodes.Const)
+        self.assertEqual(obj1.value, 0)
+        obj1 = next(inferred)
+        self.assertIs(obj1, util.YES, obj1)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_args_default_inference2(self):
+        inferred = self.ast['C']['meth3'].ilookup('d')
+        obj1 = next(inferred)
+        self.assertIsInstance(obj1, nodes.Const)
+        self.assertEqual(obj1.value, 4)
+        obj1 = next(inferred)
+        self.assertIs(obj1, util.YES, obj1)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_inference_restrictions(self):
+        inferred = test_utils.get_name_node(self.ast['C']['meth1'], 'arg1').infer()
+        obj1 = next(inferred)
+        self.assertIs(obj1, util.YES, obj1)
+        self.assertRaises(StopIteration, partial(next, inferred))
+
+    def test_ancestors_inference(self):
+        code = '''
+            class A(object):  #@
+                pass
+
+            class A(A):  #@
+                pass
+        '''
+        a1, a2 = test_utils.extract_node(code, __name__)
+        a2_ancestors = list(a2.ancestors())
+        self.assertEqual(len(a2_ancestors), 2)
+        self.assertIs(a2_ancestors[0], a1)
+
+    def test_ancestors_inference2(self):
+        code = '''
+            class A(object):  #@
+                pass
+
+            class B(A):  #@
+                pass
+
+            class A(B):  #@
+                pass
+        '''
+        a1, b, a2 = test_utils.extract_node(code, __name__)
+        a2_ancestors = list(a2.ancestors())
+        self.assertEqual(len(a2_ancestors), 3)
+        self.assertIs(a2_ancestors[0], b)
+        self.assertIs(a2_ancestors[1], a1)
+
+    def test_f_arg_f(self):
+        code = '''
+            def f(f=1):
+                return f
+
+            a = f()
+        '''
+        ast = parse(code, __name__)
+        a = ast['a']
+        a_inferred = a.inferred()
+        self.assertEqual(a_inferred[0].value, 1)
+        self.assertEqual(len(a_inferred), 1)
+
+    def test_infered_warning(self):
+        code = '''
+            def f(f=1):
+                return f
+
+            a = f()
+        '''
+        ast = parse(code, __name__)
+        a = ast['a']
+
+        warnings.simplefilter('always')
+        with warnings.catch_warnings(record=True) as w:
+            a.infered()
+            self.assertIsInstance(w[0].message, PendingDeprecationWarning)
+
+    def test_exc_ancestors(self):
+        code = '''
+        def f():
+            raise __(NotImplementedError)
+        '''
+        error = test_utils.extract_node(code, __name__)
+        nie = error.inferred()[0]
+        self.assertIsInstance(nie, nodes.ClassDef)
+        nie_ancestors = [c.name for c in nie.ancestors()]
+        if sys.version_info < (3, 0):
+            self.assertEqual(nie_ancestors, ['RuntimeError', 'StandardError', 'Exception', 'BaseException', 'object'])
+        else:
+            self.assertEqual(nie_ancestors, ['RuntimeError', 'Exception', 'BaseException', 'object'])
+
+    def test_except_inference(self):
+        code = '''
+            try:
+                print (hop)
+            except NameError as ex:
+                ex1 = ex
+            except Exception as ex:
+                ex2 = ex
+                raise
+        '''
+        ast = parse(code, __name__)
+        ex1 = ast['ex1']
+        ex1_infer = ex1.infer()
+        ex1 = next(ex1_infer)
+        self.assertIsInstance(ex1, Instance)
+        self.assertEqual(ex1.name, 'NameError')
+        self.assertRaises(StopIteration, partial(next, ex1_infer))
+        ex2 = ast['ex2']
+        ex2_infer = ex2.infer()
+        ex2 = next(ex2_infer)
+        self.assertIsInstance(ex2, Instance)
+        self.assertEqual(ex2.name, 'Exception')
+        self.assertRaises(StopIteration, partial(next, ex2_infer))
+
+    def test_del1(self):
+        code = '''
+            del undefined_attr
+        '''
+        delete = test_utils.extract_node(code, __name__)
+        self.assertRaises(InferenceError, delete.infer)
+
+    def test_del2(self):
+        code = '''
+            a = 1
+            b = a
+            del a
+            c = a
+            a = 2
+            d = a
+        '''
+        ast = parse(code, __name__)
+        n = ast['b']
+        n_infer = n.infer()
+        inferred = next(n_infer)
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, 1)
+        self.assertRaises(StopIteration, partial(next, n_infer))
+        n = ast['c']
+        n_infer = n.infer()
+        self.assertRaises(InferenceError, partial(next, n_infer))
+        n = ast['d']
+        n_infer = n.infer()
+        inferred = next(n_infer)
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, 2)
+        self.assertRaises(StopIteration, partial(next, n_infer))
+
+    def test_builtin_types(self):
+        code = '''
+            l = [1]
+            t = (2,)
+            d = {}
+            s = ''
+            s2 = '_'
+        '''
+        ast = parse(code, __name__)
+        n = ast['l']
+        inferred = next(n.infer())
+        self.assertIsInstance(inferred, nodes.List)
+        self.assertIsInstance(inferred, Instance)
+        self.assertEqual(inferred.getitem(0).value, 1)
+        self.assertIsInstance(inferred._proxied, nodes.ClassDef)
+        self.assertEqual(inferred._proxied.name, 'list')
+        self.assertIn('append', inferred._proxied._locals)
+        n = ast['t']
+        inferred = next(n.infer())
+        self.assertIsInstance(inferred, nodes.Tuple)
+        self.assertIsInstance(inferred, Instance)
+        self.assertEqual(inferred.getitem(0).value, 2)
+        self.assertIsInstance(inferred._proxied, nodes.ClassDef)
+        self.assertEqual(inferred._proxied.name, 'tuple')
+        n = ast['d']
+        inferred = next(n.infer())
+        self.assertIsInstance(inferred, nodes.Dict)
+        self.assertIsInstance(inferred, Instance)
+        self.assertIsInstance(inferred._proxied, nodes.ClassDef)
+        self.assertEqual(inferred._proxied.name, 'dict')
+        self.assertIn('get', inferred._proxied._locals)
+        n = ast['s']
+        inferred = next(n.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertIsInstance(inferred, Instance)
+        self.assertEqual(inferred.name, 'str')
+        self.assertIn('lower', inferred._proxied._locals)
+        n = ast['s2']
+        inferred = next(n.infer())
+        self.assertEqual(inferred.getitem(0).value, '_')
+
+        code = 's = {1}'
+        ast = parse(code, __name__)
+        n = ast['s']
+        inferred = next(n.infer())
+        self.assertIsInstance(inferred, nodes.Set)
+        self.assertIsInstance(inferred, Instance)
+        self.assertEqual(inferred.name, 'set')
+        self.assertIn('remove', inferred._proxied._locals)
+
+    @test_utils.require_version(maxver='3.0')
+    def test_unicode_type(self):
+        code = '''u = u""'''
+        ast = parse(code, __name__)
+        n = ast['u']
+        inferred = next(n.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertIsInstance(inferred, Instance)
+        self.assertEqual(inferred.name, 'unicode')
+        self.assertIn('lower', inferred._proxied._locals)
+
+    @unittest.expectedFailure
+    def test_descriptor_are_callable(self):
+        code = '''
+            class A:
+                statm = staticmethod(open)
+                clsm = classmethod('whatever')
+        '''
+        ast = parse(code, __name__)
+        statm = next(ast['A'].igetattr('statm'))
+        self.assertTrue(statm.callable())
+        clsm = next(ast['A'].igetattr('clsm'))
+        self.assertFalse(clsm.callable())
+
+    def test_bt_ancestor_crash(self):
+        code = '''
+            class Warning(Warning):
+                pass
+        '''
+        ast = parse(code, __name__)
+        w = ast['Warning']
+        ancestors = w.ancestors()
+        ancestor = next(ancestors)
+        self.assertEqual(ancestor.name, 'Warning')
+        self.assertEqual(ancestor.root().name, EXC_MODULE)
+        ancestor = next(ancestors)
+        self.assertEqual(ancestor.name, 'Exception')
+        self.assertEqual(ancestor.root().name, EXC_MODULE)
+        ancestor = next(ancestors)
+        self.assertEqual(ancestor.name, 'BaseException')
+        self.assertEqual(ancestor.root().name, EXC_MODULE)
+        ancestor = next(ancestors)
+        self.assertEqual(ancestor.name, 'object')
+        self.assertEqual(ancestor.root().name, BUILTINS)
+        self.assertRaises(StopIteration, partial(next, ancestors))
+
+    def test_qqch(self):
+        code = '''
+            from astroid.modutils import load_module_from_name
+            xxx = load_module_from_name('__pkginfo__')
+        '''
+        ast = parse(code, __name__)
+        xxx = ast['xxx']
+        self.assertSetEqual({n.__class__ for n in xxx.inferred()},
+                            {nodes.Const, util.YES.__class__})
+
+    def test_method_argument(self):
+        code = '''
+            class ErudiEntitySchema:
+                """a entity has a type, a set of subject and or object relations"""
+                def __init__(self, e_type, **kwargs):
+                    kwargs['e_type'] = e_type.capitalize().encode()
+
+                def meth(self, e_type, *args, **kwargs):
+                    kwargs['e_type'] = e_type.capitalize().encode()
+                    print(args)
+            '''
+        ast = parse(code, __name__)
+        arg = test_utils.get_name_node(ast['ErudiEntitySchema']['__init__'], 'e_type')
+        self.assertEqual([n.__class__ for n in arg.infer()],
+                         [util.YES.__class__])
+        arg = test_utils.get_name_node(ast['ErudiEntitySchema']['__init__'], 'kwargs')
+        self.assertEqual([n.__class__ for n in arg.infer()],
+                         [nodes.Dict])
+        arg = test_utils.get_name_node(ast['ErudiEntitySchema']['meth'], 'e_type')
+        self.assertEqual([n.__class__ for n in arg.infer()],
+                         [util.YES.__class__])
+        arg = test_utils.get_name_node(ast['ErudiEntitySchema']['meth'], 'args')
+        self.assertEqual([n.__class__ for n in arg.infer()],
+                         [nodes.Tuple])
+        arg = test_utils.get_name_node(ast['ErudiEntitySchema']['meth'], 'kwargs')
+        self.assertEqual([n.__class__ for n in arg.infer()],
+                         [nodes.Dict])
+
+    def test_tuple_then_list(self):
+        code = '''
+            def test_view(rql, vid, tags=()):
+                tags = list(tags)
+                __(tags).append(vid)
+        '''
+        name = test_utils.extract_node(code, __name__)
+        it = name.infer()
+        tags = next(it)
+        self.assertIsInstance(tags, nodes.List)
+        self.assertEqual(tags.elts, [])
+        with self.assertRaises(StopIteration):
+            next(it)
+
+    def test_mulassign_inference(self):
+        code = '''
+            def first_word(line):
+                """Return the first word of a line"""
+
+                return line.split()[0]
+
+            def last_word(line):
+                """Return last word of a line"""
+
+                return line.split()[-1]
+
+            def process_line(word_pos):
+                """Silly function: returns (ok, callable) based on argument.
+
+                   For test purpose only.
+                """
+
+                if word_pos > 0:
+                    return (True, first_word)
+                elif word_pos < 0:
+                    return  (True, last_word)
+                else:
+                    return (False, None)
+
+            if __name__ == '__main__':
+
+                line_number = 0
+                for a_line in file('test_callable.py'):
+                    tupletest  = process_line(line_number)
+                    (ok, fct)  = process_line(line_number)
+                    if ok:
+                        fct(a_line)
+        '''
+        ast = parse(code, __name__)
+        self.assertEqual(len(list(ast['process_line'].infer_call_result(None))), 3)
+        self.assertEqual(len(list(ast['tupletest'].infer())), 3)
+        values = ['FunctionDef(first_word)', 'FunctionDef(last_word)', 'Const(NoneType)']
+        self.assertEqual([str(inferred)
+                          for inferred in ast['fct'].infer()], values)
+
+    def test_float_complex_ambiguity(self):
+        code = '''
+            def no_conjugate_member(magic_flag):  #@
+                """should not raise E1101 on something.conjugate"""
+                if magic_flag:
+                    something = 1.0
+                else:
+                    something = 1.0j
+                if isinstance(something, float):
+                    return something
+                return __(something).conjugate()
+        '''
+        func, retval = test_utils.extract_node(code, __name__)
+        self.assertEqual(
+            [i.value for i in func.ilookup('something')],
+            [1.0, 1.0j])
+        self.assertEqual(
+            [i.value for i in retval.infer()],
+            [1.0, 1.0j])
+
+    def test_lookup_cond_branches(self):
+        code = '''
+            def no_conjugate_member(magic_flag):
+                """should not raise E1101 on something.conjugate"""
+                something = 1.0
+                if magic_flag:
+                    something = 1.0j
+                return something.conjugate()
+        '''
+        ast = parse(code, __name__)
+        values = [i.value for i in test_utils.get_name_node(ast, 'something', -1).infer()]
+        self.assertEqual(values, [1.0, 1.0j])
+
+
+    def test_simple_subscript(self):
+        code = '''
+            class A(object):
+                def __getitem__(self, index):
+                    return index + 42
+            [1, 2, 3][0] #@
+            (1, 2, 3)[1] #@
+            (1, 2, 3)[-1] #@
+            [1, 2, 3][0] + (2, )[0] + (3, )[-1] #@
+            e = {'key': 'value'}
+            e['key'] #@
+            "first"[0] #@
+            list([1, 2, 3])[-1] #@
+            tuple((4, 5, 6))[2] #@
+            A()[0] #@
+            A()[-1] #@
+        '''
+        ast_nodes = test_utils.extract_node(code, __name__)
+        expected = [1, 2, 3, 6, 'value', 'f', 3, 6, 42, 41]
+        for node, expected_value in zip(ast_nodes, expected):
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.Const)
+            self.assertEqual(inferred.value, expected_value)
+
+    def test_invalid_subscripts(self):
+        ast_nodes = test_utils.extract_node('''
+        class NoGetitem(object):
+            pass
+        class InvalidGetitem(object):
+            def __getitem__(self): pass
+        class InvalidGetitem2(object):
+            __getitem__ = 42
+        NoGetitem()[4] #@
+        InvalidGetitem()[5] #@
+        InvalidGetitem2()[10] #@
+        [1, 2, 3][None] #@
+        'lala'['bala'] #@        
+        ''')
+        for node in ast_nodes[:3]:
+            self.assertRaises(InferenceError, next, node.infer())
+        for node in ast_nodes[3:]:
+            self.assertEqual(next(node.infer()), util.YES)
+
+    def test_bytes_subscript(self):
+        node = test_utils.extract_node('''b'a'[0]''')
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        if six.PY2:
+            self.assertEqual(inferred.value, 'a')
+        else:
+            self.assertEqual(inferred.value, 97)
+
+    #def test_simple_tuple(self):
+        #"""test case for a simple tuple value"""
+        ## XXX tuple inference is not implemented ...
+        #code = """
+#a = (1,)
+#b = (22,)
+#some = a + b
+#"""
+        #ast = builder.string_build(code, __name__, __file__)
+        #self.assertEqual(ast['some'].infer.next().as_string(), "(1, 22)")
+
+    def test_simple_for(self):
+        code = '''
+            for a in [1, 2, 3]:
+                print (a)
+            for b,c in [(1,2), (3,4)]:
+                print (b)
+                print (c)
+
+            print ([(d,e) for e,d in ([1,2], [3,4])])
+        '''
+        ast = parse(code, __name__)
+        self.assertEqual([i.value for i in
+                          test_utils.get_name_node(ast, 'a', -1).infer()], [1, 2, 3])
+        self.assertEqual([i.value for i in
+                          test_utils.get_name_node(ast, 'b', -1).infer()], [1, 3])
+        self.assertEqual([i.value for i in
+                          test_utils.get_name_node(ast, 'c', -1).infer()], [2, 4])
+        self.assertEqual([i.value for i in
+                          test_utils.get_name_node(ast, 'd', -1).infer()], [2, 4])
+        self.assertEqual([i.value for i in
+                          test_utils.get_name_node(ast, 'e', -1).infer()], [1, 3])
+
+    def test_simple_for_genexpr(self):
+        code = '''
+            print ((d,e) for e,d in ([1,2], [3,4]))
+        '''
+        ast = parse(code, __name__)
+        self.assertEqual([i.value for i in
+                          test_utils.get_name_node(ast, 'd', -1).infer()], [2, 4])
+        self.assertEqual([i.value for i in
+                          test_utils.get_name_node(ast, 'e', -1).infer()], [1, 3])
+
+
+    def test_builtin_help(self):
+        code = '''
+            help()
+        '''
+        # XXX failing since __builtin__.help assignment has
+        #     been moved into a function...
+        node = test_utils.extract_node(code, __name__)
+        inferred = list(node.func.infer())
+        self.assertEqual(len(inferred), 1, inferred)
+        self.assertIsInstance(inferred[0], Instance)
+        self.assertEqual(inferred[0].name, "_Helper")
+
+    def test_builtin_open(self):
+        code = '''
+            open("toto.txt")
+        '''
+        node = test_utils.extract_node(code, __name__).func
+        inferred = list(node.infer())
+        self.assertEqual(len(inferred), 1)
+        if hasattr(sys, 'pypy_version_info'):
+            self.assertIsInstance(inferred[0], nodes.ClassDef)
+            self.assertEqual(inferred[0].name, 'file')
+        else:
+            self.assertIsInstance(inferred[0], nodes.FunctionDef)
+            self.assertEqual(inferred[0].name, 'open')
+
+    def test_callfunc_context_func(self):
+        code = '''
+            def mirror(arg=None):
+                return arg
+
+            un = mirror(1)
+        '''
+        ast = parse(code, __name__)
+        inferred = list(ast.igetattr('un'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.Const)
+        self.assertEqual(inferred[0].value, 1)
+
+    def test_callfunc_context_lambda(self):
+        code = '''
+            mirror = lambda x=None: x
+
+            un = mirror(1)
+        '''
+        ast = parse(code, __name__)
+        inferred = list(ast.igetattr('mirror'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.Lambda)
+        inferred = list(ast.igetattr('un'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.Const)
+        self.assertEqual(inferred[0].value, 1)
+
+    def test_factory_method(self):
+        code = '''
+            class Super(object):
+                  @classmethod
+                  def instance(cls):
+                          return cls()
+
+            class Sub(Super):
+                  def method(self):
+                          print ('method called')
+
+            sub = Sub.instance()
+        '''
+        ast = parse(code, __name__)
+        inferred = list(ast.igetattr('sub'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], Instance)
+        self.assertEqual(inferred[0]._proxied.name, 'Sub')
+
+
+    def test_import_as(self):
+        code = '''
+            import os.path as osp
+            print (osp.dirname(__file__))
+
+            from os.path import exists as e
+            assert e(__file__)
+
+            from new import code as make_code
+            print (make_code)
+        '''
+        ast = parse(code, __name__)
+        inferred = list(ast.igetattr('osp'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.Module)
+        self.assertEqual(inferred[0].name, 'os.path')
+        inferred = list(ast.igetattr('e'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.FunctionDef)
+        self.assertEqual(inferred[0].name, 'exists')
+        if sys.version_info >= (3, 0):
+            self.skipTest('<new> module has been removed')
+        inferred = list(ast.igetattr('make_code'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], Instance)
+        self.assertEqual(str(inferred[0]),
+                             'Instance of %s.type' % BUILTINS)
+
+    def _test_const_inferred(self, node, value):
+        inferred = list(node.infer())
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.Const)
+        self.assertEqual(inferred[0].value, value)
+
+    def test_unary_not(self):
+        for code in ('a = not (1,); b = not ()',
+                     'a = not {1:2}; b = not {}'):
+            ast = builder.string_build(code, __name__, __file__)
+            self._test_const_inferred(ast['a'], False)
+            self._test_const_inferred(ast['b'], True)
+
+    @test_utils.require_version(minver='3.5')
+    def test_matmul(self):
+        node = test_utils.extract_node('''
+        class Array:
+            def __matmul__(self, other):
+                return 42
+        Array() @ Array() #@
+        ''')
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, 42)
+
+    def test_binary_op_int_add(self):
+        ast = builder.string_build('a = 1 + 2', __name__, __file__)
+        self._test_const_inferred(ast['a'], 3)
+
+    def test_binary_op_int_sub(self):
+        ast = builder.string_build('a = 1 - 2', __name__, __file__)
+        self._test_const_inferred(ast['a'], -1)
+
+    def test_binary_op_float_div(self):
+        ast = builder.string_build('a = 1 / 2.', __name__, __file__)
+        self._test_const_inferred(ast['a'], 1 / 2.)
+
+    def test_binary_op_str_mul(self):
+        ast = builder.string_build('a = "*" * 40', __name__, __file__)
+        self._test_const_inferred(ast['a'], "*" * 40)
+
+    def test_binary_op_bitand(self):
+        ast = builder.string_build('a = 23&20', __name__, __file__)
+        self._test_const_inferred(ast['a'], 23&20)
+
+    def test_binary_op_bitor(self):
+        ast = builder.string_build('a = 23|8', __name__, __file__)
+        self._test_const_inferred(ast['a'], 23|8)
+
+    def test_binary_op_bitxor(self):
+        ast = builder.string_build('a = 23^9', __name__, __file__)
+        self._test_const_inferred(ast['a'], 23^9)
+
+    def test_binary_op_shiftright(self):
+        ast = builder.string_build('a = 23 >>1', __name__, __file__)
+        self._test_const_inferred(ast['a'], 23>>1)
+
+    def test_binary_op_shiftleft(self):
+        ast = builder.string_build('a = 23 <<1', __name__, __file__)
+        self._test_const_inferred(ast['a'], 23<<1)
+
+
+    def test_binary_op_list_mul(self):
+        for code in ('a = [[]] * 2', 'a = 2 * [[]]'):
+            ast = builder.string_build(code, __name__, __file__)
+            inferred = list(ast['a'].infer())
+            self.assertEqual(len(inferred), 1)
+            self.assertIsInstance(inferred[0], nodes.List)
+            self.assertEqual(len(inferred[0].elts), 2)
+            self.assertIsInstance(inferred[0].elts[0], nodes.List)
+            self.assertIsInstance(inferred[0].elts[1], nodes.List)
+
+    def test_binary_op_list_mul_none(self):
+        'test correct handling on list multiplied by None'
+        ast = builder.string_build('a = [1] * None\nb = [1] * "r"')
+        inferred = ast['a'].inferred()
+        self.assertEqual(len(inferred), 1)
+        self.assertEqual(inferred[0], util.YES)
+        inferred = ast['b'].inferred()
+        self.assertEqual(len(inferred), 1)
+        self.assertEqual(inferred[0], util.YES)
+
+    def test_binary_op_list_mul_int(self):
+        'test correct handling on list multiplied by int when there are more than one'
+        code = '''
+        from ctypes import c_int
+        seq = [c_int()] * 4
+        '''
+        ast = parse(code, __name__)
+        inferred = ast['seq'].inferred()
+        self.assertEqual(len(inferred), 1)
+        listval = inferred[0]
+        self.assertIsInstance(listval, nodes.List)
+        self.assertEqual(len(listval.itered()), 4)
+
+    def test_binary_op_tuple_add(self):
+        ast = builder.string_build('a = (1,) + (2,)', __name__, __file__)
+        inferred = list(ast['a'].infer())
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.Tuple)
+        self.assertEqual(len(inferred[0].elts), 2)
+        self.assertEqual(inferred[0].elts[0].value, 1)
+        self.assertEqual(inferred[0].elts[1].value, 2)
+
+    def test_binary_op_custom_class(self):
+        code = '''
+        class myarray:
+            def __init__(self, array):
+                self.array = array
+            def __mul__(self, x):
+                return myarray([2,4,6])
+            def astype(self):
+                return "ASTYPE"
+
+        def randint(maximum):
+            if maximum is not None:
+                return myarray([1,2,3]) * 2
+            else:
+                return int(5)
+
+        x = randint(1)
+        '''
+        ast = parse(code, __name__)
+        inferred = list(ast.igetattr('x'))
+        self.assertEqual(len(inferred), 2)
+        value = [str(v) for v in inferred]
+        # The __name__ trick here makes it work when invoked directly
+        # (__name__ == '__main__') and through pytest (__name__ ==
+        # 'unittest_inference')
+        self.assertEqual(value, ['Instance of %s.myarray' % __name__,
+                                 'Instance of %s.int' % BUILTINS])
+
+    def test_nonregr_lambda_arg(self):
+        code = '''
+        def f(g = lambda: None):
+                __(g()).x
+'''
+        callfuncnode = test_utils.extract_node(code)
+        inferred = list(callfuncnode.infer())
+        self.assertEqual(len(inferred), 2, inferred)
+        inferred.remove(util.YES)
+        self.assertIsInstance(inferred[0], nodes.Const)
+        self.assertIsNone(inferred[0].value)
+
+    def test_nonregr_getitem_empty_tuple(self):
+        code = '''
+            def f(x):
+                a = ()[x]
+        '''
+        ast = parse(code, __name__)
+        inferred = list(ast['f'].ilookup('a'))
+        self.assertEqual(len(inferred), 1)
+        self.assertEqual(inferred[0], util.YES)
+
+    def test_nonregr_instance_attrs(self):
+        """non regression for instance_attrs infinite loop : pylint / #4"""
+
+        code = """
+            class Foo(object):
+
+                def set_42(self):
+                    self.attr = 42
+
+            class Bar(Foo):
+
+                def __init__(self):
+                    self.attr = 41
+        """
+        ast = parse(code, __name__)
+        foo_class = ast['Foo']
+        bar_class = ast['Bar']
+        bar_self = ast['Bar']['__init__']['self']
+        assattr = bar_class._instance_attrs['attr'][0]
+        self.assertEqual(len(foo_class._instance_attrs['attr']), 1)
+        self.assertEqual(len(bar_class._instance_attrs['attr']), 1)
+        self.assertEqual(bar_class._instance_attrs, {'attr': [assattr]})
+        # call 'instance_attr' via 'Instance.getattr' to trigger the bug:
+        instance = bar_self.inferred()[0]
+        instance.getattr('attr')
+        self.assertEqual(len(bar_class._instance_attrs['attr']), 1)
+        self.assertEqual(len(foo_class._instance_attrs['attr']), 1)
+        self.assertEqual(bar_class._instance_attrs, {'attr': [assattr]})
+
+    def test_python25_generator_exit(self):
+        # pylint: disable=redefined-variable-type
+        buffer = six.StringIO()
+        sys.stderr = buffer
+        try:
+            data = "b = {}[str(0)+''].a"
+            ast = builder.string_build(data, __name__, __file__)
+            list(ast['b'].infer())
+            output = buffer.getvalue()
+        finally:
+            sys.stderr = sys.__stderr__
+        # I have no idea how to test for this in another way...
+        msg = ("Exception exceptions.RuntimeError: "
+               "'generator ignored GeneratorExit' in <generator object> "
+               "ignored")
+        self.assertNotIn("RuntimeError", output, msg)
+
+    def test_python25_no_relative_import(self):
+        ast = resources.build_file('data/package/absimport.py')
+        self.assertTrue(ast.absolute_import_activated(), True)
+        inferred = next(test_utils.get_name_node(ast, 'import_package_subpackage_module').infer())
+        # failed to import since absolute_import is activated
+        self.assertIs(inferred, util.YES)
+
+    def test_nonregr_absolute_import(self):
+        ast = resources.build_file('data/absimp/string.py', 'data.absimp.string')
+        self.assertTrue(ast.absolute_import_activated(), True)
+        inferred = next(test_utils.get_name_node(ast, 'string').infer())
+        self.assertIsInstance(inferred, nodes.Module)
+        self.assertEqual(inferred.name, 'string')
+        self.assertIn('ascii_letters', inferred._locals)
+
+    def test_mechanize_open(self):
+        try:
+            import mechanize  # pylint: disable=unused-variable
+        except ImportError:
+            self.skipTest('require mechanize installed')
+        data = '''
+            from mechanize import Browser
+            print(Browser)
+            b = Browser()
+        '''
+        ast = parse(data, __name__)
+        browser = next(test_utils.get_name_node(ast, 'Browser').infer())
+        self.assertIsInstance(browser, nodes.ClassDef)
+        bopen = list(browser.igetattr('open'))
+        self.skipTest('the commit said: "huum, see that later"')
+        self.assertEqual(len(bopen), 1)
+        self.assertIsInstance(bopen[0], nodes.FunctionDef)
+        self.assertTrue(bopen[0].callable())
+        b = next(test_utils.get_name_node(ast, 'b').infer())
+        self.assertIsInstance(b, Instance)
+        bopen = list(b.igetattr('open'))
+        self.assertEqual(len(bopen), 1)
+        self.assertIsInstance(bopen[0], BoundMethod)
+        self.assertTrue(bopen[0].callable())
+
+    def test_property(self):
+        code = '''
+            from smtplib import SMTP
+            class SendMailController(object):
+
+                @property
+                def smtp(self):
+                    return SMTP(mailhost, port)
+
+                @property
+                def me(self):
+                    return self
+
+            my_smtp = SendMailController().smtp
+            my_me = SendMailController().me
+            '''
+        decorators = set(['%s.property' % BUILTINS])
+        ast = parse(code, __name__)
+        self.assertEqual(ast['SendMailController']['smtp'].decoratornames(),
+                         decorators)
+        propinferred = list(ast.body[2].value.infer())
+        self.assertEqual(len(propinferred), 1)
+        propinferred = propinferred[0]
+        self.assertIsInstance(propinferred, Instance)
+        self.assertEqual(propinferred.name, 'SMTP')
+        self.assertEqual(propinferred.root().name, 'smtplib')
+        self.assertEqual(ast['SendMailController']['me'].decoratornames(),
+                         decorators)
+        propinferred = list(ast.body[3].value.infer())
+        self.assertEqual(len(propinferred), 1)
+        propinferred = propinferred[0]
+        self.assertIsInstance(propinferred, Instance)
+        self.assertEqual(propinferred.name, 'SendMailController')
+        self.assertEqual(propinferred.root().name, __name__)
+
+    def test_im_func_unwrap(self):
+        code = '''
+            class EnvBasedTC:
+                def pactions(self):
+                    pass
+            pactions = EnvBasedTC.pactions.im_func
+            print (pactions)
+
+            class EnvBasedTC2:
+                pactions = EnvBasedTC.pactions.im_func
+                print (pactions)
+            '''
+        ast = parse(code, __name__)
+        pactions = test_utils.get_name_node(ast, 'pactions')
+        inferred = list(pactions.infer())
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.FunctionDef)
+        pactions = test_utils.get_name_node(ast['EnvBasedTC2'], 'pactions')
+        inferred = list(pactions.infer())
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.FunctionDef)
+
+    def test_augassign(self):
+        code = '''
+            a = 1
+            a += 2
+            print (a)
+        '''
+        ast = parse(code, __name__)
+        inferred = list(test_utils.get_name_node(ast, 'a').infer())
+
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.Const)
+        self.assertEqual(inferred[0].value, 3)
+
+    def test_nonregr_func_arg(self):
+        code = '''
+            def foo(self, bar):
+                def baz():
+                    pass
+                def qux():
+                    return baz
+                spam = bar(None, qux)
+                print (spam)
+            '''
+        ast = parse(code, __name__)
+        inferred = list(test_utils.get_name_node(ast['foo'], 'spam').infer())
+        self.assertEqual(len(inferred), 1)
+        self.assertIs(inferred[0], util.YES)
+
+    def test_nonregr_func_global(self):
+        code = '''
+            active_application = None
+
+            def get_active_application():
+              global active_application
+              return active_application
+
+            class Application(object):
+              def __init__(self):
+                 global active_application
+                 active_application = self
+
+            class DataManager(object):
+              def __init__(self, app=None):
+                 self.app = get_active_application()
+              def test(self):
+                 p = self.app
+                 print (p)
+        '''
+        ast = parse(code, __name__)
+        inferred = list(Instance(ast['DataManager']).igetattr('app'))
+        self.assertEqual(len(inferred), 2, inferred) # None / Instance(Application)
+        inferred = list(test_utils.get_name_node(ast['DataManager']['test'], 'p').infer())
+        self.assertEqual(len(inferred), 2, inferred)
+        for node in inferred:
+            if isinstance(node, Instance) and node.name == 'Application':
+                break
+        else:
+            self.fail('expected to find an instance of Application in %s' % inferred)
+
+    def test_list_inference(self):
+        """#20464"""
+        code = '''
+            from unknown import Unknown
+            A = []
+            B = []
+
+            def test():
+              xyz = [
+                Unknown
+              ] + A + B
+              return xyz
+
+            Z = test()
+        '''
+        ast = parse(code, __name__)
+        inferred = next(ast['Z'].infer())
+        self.assertIsInstance(inferred, nodes.List)
+        self.assertEqual(len(inferred.elts), 1)
+        self.assertIs(inferred.elts[0], util.YES)
+
+    def test__new__(self):
+        code = '''
+            class NewTest(object):
+                "doc"
+                def __new__(cls, arg):
+                    self = object.__new__(cls)
+                    self.arg = arg
+                    return self
+
+            n = NewTest()
+        '''
+        ast = parse(code, __name__)
+        self.assertRaises(InferenceError, list, ast['NewTest'].igetattr('arg'))
+        n = next(ast['n'].infer())
+        inferred = list(n.igetattr('arg'))
+        self.assertEqual(len(inferred), 1, inferred)
+
+    def test__new__bound_methods(self):
+        node = test_utils.extract_node('''
+        class cls(object): pass
+        cls().__new__(cls) #@
+        ''')
+        inferred = next(node.infer())
+        self.assertIsInstance(inferred, Instance)
+        self.assertEqual(inferred._proxied, node.root()['cls'])
+
+    def test_two_parents_from_same_module(self):
+        code = '''
+            from data import nonregr
+            class Xxx(nonregr.Aaa, nonregr.Ccc):
+                "doc"
+        '''
+        ast = parse(code, __name__)
+        parents = list(ast['Xxx'].ancestors())
+        self.assertEqual(len(parents), 3, parents) # Aaa, Ccc, object
+
+    def test_pluggable_inference(self):
+        code = '''
+            from collections import namedtuple
+            A = namedtuple('A', ['a', 'b'])
+            B = namedtuple('B', 'a b')
+        '''
+        ast = parse(code, __name__)
+        aclass = ast['A'].inferred()[0]
+        self.assertIsInstance(aclass, nodes.ClassDef)
+        self.assertIn('a', aclass._instance_attrs)
+        self.assertIn('b', aclass._instance_attrs)
+        bclass = ast['B'].inferred()[0]
+        self.assertIsInstance(bclass, nodes.ClassDef)
+        self.assertIn('a', bclass._instance_attrs)
+        self.assertIn('b', bclass._instance_attrs)
+
+    def test_infer_arguments(self):
+        code = '''
+            class A(object):
+                def first(self, arg1, arg2):
+                    return arg1
+                @classmethod
+                def method(cls, arg1, arg2):
+                    return arg2
+                @classmethod
+                def empty(cls):
+                    return 2
+                @staticmethod
+                def static(arg1, arg2):
+                    return arg1
+                def empty_method(self):
+                    return []
+            x = A().first(1, [])
+            y = A.method(1, [])
+            z = A.static(1, [])
+            empty = A.empty()
+            empty_list = A().empty_method()
+        '''
+        ast = parse(code, __name__)
+        int_node = ast['x'].inferred()[0]
+        self.assertIsInstance(int_node, nodes.Const)
+        self.assertEqual(int_node.value, 1)
+        list_node = ast['y'].inferred()[0]
+        self.assertIsInstance(list_node, nodes.List)
+        int_node = ast['z'].inferred()[0]
+        self.assertIsInstance(int_node, nodes.Const)
+        self.assertEqual(int_node.value, 1)
+        empty = ast['empty'].inferred()[0]
+        self.assertIsInstance(empty, nodes.Const)
+        self.assertEqual(empty.value, 2)
+        empty_list = ast['empty_list'].inferred()[0]
+        self.assertIsInstance(empty_list, nodes.List)
+
+    def test_infer_variable_arguments(self):
+        code = '''
+            def test(*args, **kwargs):
+                vararg = args
+                kwarg = kwargs
+        '''
+        ast = parse(code, __name__)
+        func = ast['test']
+        vararg = func.body[0].value
+        kwarg = func.body[1].value
+
+        kwarg_inferred = kwarg.inferred()[0]
+        self.assertIsInstance(kwarg_inferred, nodes.Dict)
+        self.assertIs(kwarg_inferred.parent, func.args)
+
+        vararg_inferred = vararg.inferred()[0]
+        self.assertIsInstance(vararg_inferred, nodes.Tuple)
+        self.assertIs(vararg_inferred.parent, func.args)
+
+    def test_infer_nested(self):
+        code = """
+            def nested():
+                from threading import Thread
+
+                class NestedThread(Thread):
+                    def __init__(self):
+                        Thread.__init__(self)
+        """
+        # Test that inferring Thread.__init__ looks up in
+        # the nested scope.
+        ast = parse(code, __name__)
+        callfunc = next(ast.nodes_of_class(nodes.Call))
+        func = callfunc.func
+        inferred = func.inferred()[0]
+        self.assertIsInstance(inferred, UnboundMethod)
+
+    def test_instance_binary_operations(self):
+        code = """
+            class A(object):
+                def __mul__(self, other):
+                    return 42
+            a = A()
+            b = A()
+            sub = a - b
+            mul = a * b
+        """
+        ast = parse(code, __name__)
+        sub = ast['sub'].inferred()[0]
+        mul = ast['mul'].inferred()[0]
+        self.assertIs(sub, util.YES)
+        self.assertIsInstance(mul, nodes.Const)
+        self.assertEqual(mul.value, 42)
+
+    def test_instance_binary_operations_parent(self):
+        code = """
+            class A(object):
+                def __mul__(self, other):
+                    return 42
+            class B(A):
+                pass
+            a = B()
+            b = B()
+            sub = a - b
+            mul = a * b
+        """
+        ast = parse(code, __name__)
+        sub = ast['sub'].inferred()[0]
+        mul = ast['mul'].inferred()[0]
+        self.assertIs(sub, util. YES)
+        self.assertIsInstance(mul, nodes.Const)
+        self.assertEqual(mul.value, 42)
+
+    def test_instance_binary_operations_multiple_methods(self):
+        code = """
+            class A(object):
+                def __mul__(self, other):
+                    return 42
+            class B(A):
+                def __mul__(self, other):
+                    return [42]
+            a = B()
+            b = B()
+            sub = a - b
+            mul = a * b
+        """
+        ast = parse(code, __name__)
+        sub = ast['sub'].inferred()[0]
+        mul = ast['mul'].inferred()[0]
+        self.assertIs(sub, util.YES)
+        self.assertIsInstance(mul, nodes.List)
+        self.assertIsInstance(mul.elts[0], nodes.Const)
+        self.assertEqual(mul.elts[0].value, 42)
+
+    def test_infer_call_result_crash(self):
+        code = """
+            class A(object):
+                def __mul__(self, other):
+                    return type.__new__()
+
+            a = A()
+            b = A()
+            c = a * b
+        """
+        ast = parse(code, __name__)
+        node = ast['c']
+        self.assertEqual(node.inferred(), [util.YES])
+
+    def test_infer_empty_nodes(self):
+        # Should not crash when trying to infer EmptyNodes.
+        node = nodes.EmptyNode()
+        self.assertEqual(node.inferred(), [util.YES])
+
+    def test_infinite_loop_for_decorators(self):
+        # Issue https://bitbucket.org/logilab/astroid/issue/50
+        # A decorator that returns itself leads to an infinite loop.
+        code = """
+            def decorator():
+                def wrapper():
+                    return decorator()
+                return wrapper
+
+            @decorator()
+            def do_a_thing():
+                pass
+        """
+        ast = parse(code, __name__)
+        node = ast['do_a_thing']
+        self.assertEqual(node.type, 'function')
+
+    def test_no_infinite_ancestor_loop(self):
+        klass = test_utils.extract_node("""
+            import datetime
+
+            def method(self):
+                datetime.datetime = something()
+
+            class something(datetime.datetime):  #@
+                pass
+        """)
+        self.assertIn(
+            'object',
+            [base.name for base in klass.ancestors()])
+
+    def test_stop_iteration_leak(self):
+        code = """
+            class Test:
+                def __init__(self):
+                    self.config = {0: self.config[0]}
+                    self.config[0].test() #@
+        """
+        ast = test_utils.extract_node(code, __name__)
+        expr = ast.func.expr
+        self.assertRaises(InferenceError, next, expr.infer())
+
+    def test_tuple_builtin_inference(self):
+         code = """
+         var = (1, 2)
+         tuple() #@
+         tuple([1]) #@
+         tuple({2}) #@
+         tuple("abc") #@
+         tuple({1: 2}) #@
+         tuple(var) #@
+         tuple(tuple([1])) #@
+
+         tuple(None) #@
+         tuple(1) #@
+         tuple(1, 2) #@
+         """
+         ast = test_utils.extract_node(code, __name__)
+
+         self.assertInferTuple(ast[0], [])
+         self.assertInferTuple(ast[1], [1])
+         self.assertInferTuple(ast[2], [2])
+         self.assertInferTuple(ast[3], ["a", "b", "c"])
+         self.assertInferTuple(ast[4], [1])
+         self.assertInferTuple(ast[5], [1, 2])
+         self.assertInferTuple(ast[6], [1])
+
+         for node in ast[7:]:
+             inferred = next(node.infer())
+             self.assertIsInstance(inferred, Instance)
+             self.assertEqual(inferred.qname(), "{}.tuple".format(BUILTINS))
+
+    def test_frozenset_builtin_inference(self):
+         code = """
+         var = (1, 2)
+         frozenset() #@
+         frozenset([1, 2, 1]) #@
+         frozenset({2, 3, 1}) #@
+         frozenset("abcab") #@
+         frozenset({1: 2}) #@
+         frozenset(var) #@
+         frozenset(tuple([1])) #@
+
+         frozenset(set(tuple([4, 5, set([2])]))) #@
+         frozenset(None) #@
+         frozenset(1) #@
+         frozenset(1, 2) #@
+         """
+         ast = test_utils.extract_node(code, __name__)
+
+         self.assertInferFrozenSet(ast[0], [])
+         self.assertInferFrozenSet(ast[1], [1, 2])
+         self.assertInferFrozenSet(ast[2], [1, 2, 3])
+         self.assertInferFrozenSet(ast[3], ["a", "b", "c"])
+         self.assertInferFrozenSet(ast[4], [1])
+         self.assertInferFrozenSet(ast[5], [1, 2])
+         self.assertInferFrozenSet(ast[6], [1])
+
+         for node in ast[7:]:
+             infered = next(node.infer())
+             self.assertIsInstance(infered, Instance)
+             self.assertEqual(infered.qname(), "{}.frozenset".format(BUILTINS))
+
+    def test_set_builtin_inference(self):
+         code = """
+         var = (1, 2)
+         set() #@
+         set([1, 2, 1]) #@
+         set({2, 3, 1}) #@
+         set("abcab") #@
+         set({1: 2}) #@
+         set(var) #@
+         set(tuple([1])) #@
+
+         set(set(tuple([4, 5, set([2])]))) #@
+         set(None) #@
+         set(1) #@
+         set(1, 2) #@
+         """
+         ast = test_utils.extract_node(code, __name__)
+
+         self.assertInferSet(ast[0], [])
+         self.assertInferSet(ast[1], [1, 2])
+         self.assertInferSet(ast[2], [1, 2, 3])
+         self.assertInferSet(ast[3], ["a", "b", "c"])
+         self.assertInferSet(ast[4], [1])
+         self.assertInferSet(ast[5], [1, 2])
+         self.assertInferSet(ast[6], [1])
+
+         for node in ast[7:]:
+             inferred = next(node.infer())
+             self.assertIsInstance(inferred, Instance)
+             self.assertEqual(inferred.qname(), "{}.set".format(BUILTINS))
+
+    def test_list_builtin_inference(self):
+         code = """
+         var = (1, 2)
+         list() #@
+         list([1, 2, 1]) #@
+         list({2, 3, 1}) #@
+         list("abcab") #@
+         list({1: 2}) #@
+         list(var) #@
+         list(tuple([1])) #@
+
+         list(list(tuple([4, 5, list([2])]))) #@
+         list(None) #@
+         list(1) #@
+         list(1, 2) #@
+         """
+         ast = test_utils.extract_node(code, __name__)
+         self.assertInferList(ast[0], [])
+         self.assertInferList(ast[1], [1, 1, 2])
+         self.assertInferList(ast[2], [1, 2, 3])
+         self.assertInferList(ast[3], ["a", "a", "b", "b", "c"])
+         self.assertInferList(ast[4], [1])
+         self.assertInferList(ast[5], [1, 2])
+         self.assertInferList(ast[6], [1])
+
+         for node in ast[7:]:
+             inferred = next(node.infer())
+             self.assertIsInstance(inferred, Instance)
+             self.assertEqual(inferred.qname(), "{}.list".format(BUILTINS))
+
+    @test_utils.require_version('3.0')
+    def test_builtin_inference_py3k(self):
+        code = """
+        list(b"abc") #@
+        tuple(b"abc") #@
+        set(b"abc") #@
+        """
+        ast = test_utils.extract_node(code, __name__)
+        self.assertInferList(ast[0], [97, 98, 99])
+        self.assertInferTuple(ast[1], [97, 98, 99])
+        self.assertInferSet(ast[2], [97, 98, 99])
+
+    def test_dict_inference(self):
+        code = """
+        dict() #@
+        dict(a=1, b=2, c=3) #@
+        dict([(1, 2), (2, 3)]) #@
+        dict([[1, 2], [2, 3]]) #@
+        dict([(1, 2), [2, 3]]) #@
+        dict([('a', 2)], b=2, c=3) #@
+        dict({1: 2}) #@
+        dict({'c': 2}, a=4, b=5) #@
+        def func():
+            return dict(a=1, b=2)
+        func() #@
+        var = {'x': 2, 'y': 3}
+        dict(var, a=1, b=2) #@
+
+        dict([1, 2, 3]) #@
+        dict([(1, 2), (1, 2, 3)]) #@
+        dict({1: 2}, {1: 2}) #@
+        dict({1: 2}, (1, 2)) #@
+        dict({1: 2}, (1, 2), a=4) #@
+        dict([(1, 2), ([4, 5], 2)]) #@
+        dict([None,  None]) #@
+
+        def using_unknown_kwargs(**kwargs):
+            return dict(**kwargs)
+        using_unknown_kwargs(a=1, b=2) #@
+        """
+        ast = test_utils.extract_node(code, __name__)
+        self.assertInferDict(ast[0], {})
+        self.assertInferDict(ast[1], {'a': 1, 'b': 2, 'c': 3})
+        for i in range(2, 5):
+            self.assertInferDict(ast[i], {1: 2, 2: 3})
+        self.assertInferDict(ast[5], {'a': 2, 'b': 2, 'c': 3})
+        self.assertInferDict(ast[6], {1: 2})
+        self.assertInferDict(ast[7], {'c': 2, 'a': 4, 'b': 5})
+        self.assertInferDict(ast[8], {'a': 1, 'b': 2})
+        self.assertInferDict(ast[9], {'x': 2, 'y': 3, 'a': 1, 'b': 2})
+
+        for node in ast[10:]:
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, Instance)
+            self.assertEqual(inferred.qname(), "{}.dict".format(BUILTINS))
+
+    def test_dict_inference_kwargs(self):
+        ast_node = test_utils.extract_node('''dict(a=1, b=2, **{'c': 3})''')
+        self.assertInferDict(ast_node, {'a': 1, 'b': 2, 'c': 3})
+
+    @test_utils.require_version('3.5')
+    def test_dict_inference_for_multiple_starred(self):
+        pairs = [
+            ('dict(a=1, **{"b": 2}, **{"c":3})', {'a':1, 'b':2, 'c':3}),
+            ('dict(a=1, **{"b": 2}, d=4, **{"c":3})', {'a':1, 'b':2, 'c':3, 'd':4}),
+            ('dict({"a":1}, b=2, **{"c":3})', {'a':1, 'b':2, 'c':3}),
+        ]
+        for code, expected_value in pairs:
+            node = test_utils.extract_node(code)
+            self.assertInferDict(node, expected_value)
+
+    def test_dict_invalid_args(self):
+        invalid_values = [
+            'dict(*1)',
+            'dict(**lala)',
+            'dict(**[])',
+        ]
+        for invalid in invalid_values:
+            ast_node = test_utils.extract_node(invalid)
+            inferred = next(ast_node.infer())
+            self.assertIsInstance(inferred, Instance)
+            self.assertEqual(inferred.qname(), "{}.dict".format(BUILTINS))
+
+    def test_str_methods(self):
+        code = """
+        ' '.decode() #@
+
+        ' '.encode() #@
+        ' '.join('abcd') #@
+        ' '.replace('a', 'b') #@
+        ' '.format('a') #@
+        ' '.capitalize() #@
+        ' '.title() #@
+        ' '.lower() #@
+        ' '.upper() #@
+        ' '.swapcase() #@
+        ' '.strip() #@
+        ' '.rstrip() #@
+        ' '.lstrip() #@
+        ' '.rjust() #@
+        ' '.ljust() #@
+        ' '.center() #@
+
+        ' '.index() #@
+        ' '.find() #@
+        ' '.count() #@
+        """
+        ast = test_utils.extract_node(code, __name__)
+        self.assertInferConst(ast[0], u'')
+        for i in range(1, 16):
+            self.assertInferConst(ast[i], '')
+        for i in range(16, 19):
+            self.assertInferConst(ast[i], 0)
+
+    def test_unicode_methods(self):
+        code = """
+        u' '.encode() #@
+
+        u' '.decode() #@
+        u' '.join('abcd') #@
+        u' '.replace('a', 'b') #@
+        u' '.format('a') #@
+        u' '.capitalize() #@
+        u' '.title() #@
+        u' '.lower() #@
+        u' '.upper() #@
+        u' '.swapcase() #@
+        u' '.strip() #@
+        u' '.rstrip() #@
+        u' '.lstrip() #@
+        u' '.rjust() #@
+        u' '.ljust() #@
+        u' '.center() #@
+
+        u' '.index() #@
+        u' '.find() #@
+        u' '.count() #@
+        """
+        ast = test_utils.extract_node(code, __name__)
+        self.assertInferConst(ast[0], '')
+        for i in range(1, 16):
+            self.assertInferConst(ast[i], u'')
+        for i in range(16, 19):
+            self.assertInferConst(ast[i], 0)
+
+    def test_scope_lookup_same_attributes(self):
+        code = '''
+        import collections
+        class Second(collections.Counter):
+            def collections(self):
+                return "second"
+
+        '''
+        ast = parse(code, __name__)
+        bases = ast['Second'].bases[0]
+        inferred = next(bases.infer())
+        self.assertTrue(inferred)
+        self.assertIsInstance(inferred, nodes.ClassDef)
+        self.assertEqual(inferred.qname(), 'collections.Counter')
+
+
+class ArgumentsTest(unittest.TestCase):
+
+    @staticmethod
+    def _get_dict_value(inferred):
+        items = inferred.items
+        return sorted((key.value, value.value) for key, value in items)
+
+    @staticmethod
+    def _get_tuple_value(inferred):
+        elts = inferred.elts
+        return tuple(elt.value for elt in elts)
+
+    def test_args(self):
+        expected_values = [(), (1, ), (2, 3), (4, 5),
+                           (3, ), (), (3, 4, 5),
+                           (), (), (4, ), (4, 5),
+                           (), (3, ), (), (), (3, ), (42, )]
+        ast_nodes = test_utils.extract_node('''
+        def func(*args):
+            return args
+        func() #@
+        func(1) #@
+        func(2, 3) #@
+        func(*(4, 5)) #@
+        def func(a, b, *args):
+            return args
+        func(1, 2, 3) #@
+        func(1, 2) #@
+        func(1, 2, 3, 4, 5) #@
+        def func(a, b, c=42, *args):
+            return args
+        func(1, 2) #@
+        func(1, 2, 3) #@
+        func(1, 2, 3, 4) #@
+        func(1, 2, 3, 4, 5) #@
+        func = lambda a, b, *args: args
+        func(1, 2) #@
+        func(1, 2, 3) #@
+        func = lambda a, b=42, *args: args
+        func(1) #@
+        func(1, 2) #@
+        func(1, 2, 3) #@
+        func(1, 2, *(42, )) #@        
+        ''')
+        for node, expected_value in zip(ast_nodes, expected_values):
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.Tuple)
+            self.assertEqual(self._get_tuple_value(inferred), expected_value)
+
+    @test_utils.require_version('3.5')
+    def test_multiple_starred_args(self):
+        expected_values = [
+           (1, 2, 3),
+           (1, 4, 2, 3, 5, 6, 7),
+        ]
+        ast_nodes = test_utils.extract_node('''
+        def func(a, b, *args):
+            return args
+        func(1, 2, *(1, ), *(2, 3)) #@
+        func(1, 2, *(1, ), 4, *(2, 3), 5, *(6, 7)) #@
+        ''')
+        for node, expected_value in zip(ast_nodes, expected_values):
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.Tuple)
+            self.assertEqual(self._get_tuple_value(inferred), expected_value)
+
+    def test_defaults(self):
+        expected_values = [42, 3, 41, 42]
+        ast_nodes = test_utils.extract_node('''
+        def func(a, b, c=42, *args):
+            return c
+        func(1, 2) #@
+        func(1, 2, 3) #@
+        func(1, 2, c=41) #@
+        func(1, 2, 42, 41) #@        
+        ''')
+        for node, expected_value in zip(ast_nodes, expected_values):
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.Const)
+            self.assertEqual(inferred.value, expected_value)
+
+    @test_utils.require_version('3.0')
+    def test_kwonly_args(self):
+        expected_values = [24, 24, 42, 23, 24, 24, 54]
+        ast_nodes = test_utils.extract_node('''
+        def test(*, f, b): return f
+        test(f=24, b=33) #@
+        def test(a, *, f): return f
+        test(1, f=24) #@
+        def test(a, *, f=42): return f
+        test(1) #@
+        test(1, f=23) #@
+        def test(a, b, c=42, *args, f=24):
+            return f
+        test(1, 2, 3) #@
+        test(1, 2, 3, 4) #@
+        test(1, 2, 3, 4, 5, f=54) #@
+        ''')
+        for node, expected_value in zip(ast_nodes, expected_values):
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.Const)
+            self.assertEqual(inferred.value, expected_value)
+
+    def test_kwargs(self):
+        expected = [
+            [('a', 1), ('b', 2), ('c', 3)],
+            [('a', 1)],
+            [('a', 'b')],
+        ]
+        ast_nodes = test_utils.extract_node('''
+        def test(**kwargs):
+             return kwargs
+        test(a=1, b=2, c=3) #@
+        test(a=1) #@
+        test(**{'a': 'b'}) #@
+        ''')
+        for node, expected_value in zip(ast_nodes, expected):
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.Dict)
+            value = self._get_dict_value(inferred)
+            self.assertEqual(value, expected_value)
+
+    def test_kwargs_and_other_named_parameters(self):
+        ast_nodes = test_utils.extract_node('''
+        def test(a=42, b=24, **kwargs):
+            return kwargs
+        test(42, 24, c=3, d=4) #@
+        test(49, b=24, d=4) #@
+        test(a=42, b=33, c=3, d=42) #@
+        test(a=42, **{'c':42}) #@
+        ''')
+        expected_values = [
+            [('c', 3), ('d', 4)],
+            [('d', 4)],
+            [('c', 3), ('d', 42)],
+            [('c', 42)],
+        ]
+        for node, expected_value in zip(ast_nodes, expected_values):
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.Dict)
+            value = self._get_dict_value(inferred)
+            self.assertEqual(value, expected_value)
+
+    def test_kwargs_access_by_name(self):
+        expected_values = [42, 42, 42, 24]
+        ast_nodes = test_utils.extract_node('''
+        def test(**kwargs):
+            return kwargs['f']
+        test(f=42) #@
+        test(**{'f': 42}) #@
+        test(**dict(f=42)) #@
+        def test(f=42, **kwargs):
+            return kwargs['l']
+        test(l=24) #@
+        ''')
+        for ast_node, value in zip(ast_nodes, expected_values):
+             inferred = next(ast_node.infer())
+             self.assertIsInstance(inferred, nodes.Const)
+             self.assertEqual(inferred.value, value)
+
+    def test_infer_call_result_invalid_dunder_call_on_instance(self):
+        ast_nodes = test_utils.extract_node('''
+        class A:
+            __call__ = 42
+        class B:
+            __call__ = A()
+        class C:
+            __call = None
+        A() #@
+        B() #@
+        C() #@
+        ''')
+        for node in ast_nodes:
+            inferred = next(node.infer())
+            self.assertRaises(InferenceError, next, inferred.infer_call_result(node))
+
+
+    def test_subscript_inference_error(self):
+       # Used to raise StopIteration
+       ast_node = test_utils.extract_node('''
+       class AttributeDict(dict):
+           def __getitem__(self, name):
+               return self
+       flow = AttributeDict()
+       flow['app'] = AttributeDict()
+       flow['app']['config'] = AttributeDict()
+       flow['app']['config']['doffing'] = AttributeDict() #@
+       ''')
+       self.assertIsNone(util.safe_infer(ast_node.targets[0]))
+
+    def test_classmethod_inferred_by_context(self):
+        ast_node = test_utils.extract_node('''
+        class Super(object):
+           def instance(cls):
+              return cls()
+           instance = classmethod(instance)
+
+        class Sub(Super):
+            def method(self):
+                return self
+
+        # should see the Sub.instance() is returning a Sub
+        # instance, not a Super instance
+        Sub.instance().method() #@
+        ''')
+        inferred = next(ast_node.infer())
+        self.assertIsInstance(inferred, Instance)
+        self.assertEqual(inferred.name, 'Sub')
+
+    @test_utils.require_version('3.5')
+    def test_multiple_kwargs(self):
+        expected_value = [
+            ('a', 1),
+            ('b', 2),
+            ('c', 3),
+            ('d', 4),
+            ('f', 42),
+        ]
+        ast_node = test_utils.extract_node('''
+        def test(**kwargs):
+             return kwargs
+        test(a=1, b=2, **{'c': 3}, **{'d': 4}, f=42) #@
+        ''')
+        inferred = next(ast_node.infer())
+        self.assertIsInstance(inferred, nodes.Dict)
+        value = self._get_dict_value(inferred)
+        self.assertEqual(value, expected_value)
+
+    def test_kwargs_are_overriden(self):
+        ast_nodes = test_utils.extract_node('''
+        def test(f):
+             return f
+        test(f=23, **{'f': 34}) #@
+        def test(f=None):
+             return f
+        test(f=23, **{'f':23}) #@
+        ''')
+        for ast_node in ast_nodes:
+            inferred = next(ast_node.infer())
+            self.assertEqual(inferred, util.YES)
+
+    def test_fail_to_infer_args(self):
+        ast_nodes = test_utils.extract_node('''
+        def test(a, **kwargs): return a
+        test(*missing) #@
+        test(*object) #@
+        test(*1) #@
+
+
+        def test(**kwargs): return kwargs
+        test(**miss) #@
+        test(**(1, 2)) #@
+        test(**1) #@
+        test(**{misss:1}) #@
+        test(**{object:1}) #@
+        test(**{1:1}) #@
+        test(**{'a':1, 'a':1}) #@
+
+        def test(a): return a
+        test() #@
+        test(1, 2, 3) #@
+
+        from unknown import unknown
+        test(*unknown) #@
+        def test(*args): return args
+        test(*unknown) #@
+        ''')
+        for node in ast_nodes:
+            inferred = next(node.infer())
+            self.assertEqual(inferred, util.YES)
+
+class CallSiteTest(unittest.TestCase):
+
+    @staticmethod
+    def _call_site_from_call(call):
+        return arguments.CallSite.from_call(call)
+
+    def _test_call_site_pair(self, code, expected_args, expected_keywords):
+        ast_node = test_utils.extract_node(code)
+        call_site = self._call_site_from_call(ast_node)
+        self.assertEqual(len(call_site.positional_arguments), len(expected_args))
+        self.assertEqual([arg.value for arg in call_site.positional_arguments],
+                         expected_args)
+        self.assertEqual(len(call_site.keyword_arguments), len(expected_keywords))
+        for keyword, value in expected_keywords.items():
+            self.assertIn(keyword, call_site.keyword_arguments)
+            self.assertEqual(call_site.keyword_arguments[keyword].value, value)
+
+    def _test_call_site(self, pairs):
+        for pair in pairs:
+            self._test_call_site_pair(*pair)
+
+    @test_utils.require_version('3.5')
+    def test_call_site_starred_args(self):
+        pairs = [
+            (
+               "f(*(1, 2), *(2, 3), *(3, 4), **{'a':1}, **{'b': 2})",
+               [1, 2, 2, 3, 3, 4],
+               {'a': 1, 'b': 2}
+            ),
+            (
+               "f(1, 2, *(3, 4), 5, *(6, 7), f=24, **{'c':3})",
+               [1, 2, 3, 4, 5, 6, 7],
+               {'f':24, 'c': 3},
+            ),
+            # Too many fs passed into.
+            (
+               "f(f=24, **{'f':24})", [], {},
+            ),
+        ]
+        self._test_call_site(pairs)
+
+    def test_call_site(self):
+        pairs = [
+            (
+               "f(1, 2)", [1, 2], {}
+            ),
+            (
+               "f(1, 2, *(1, 2))", [1, 2, 1, 2], {}
+            ),
+            (
+               "f(a=1, b=2, c=3)", [], {'a':1, 'b':2, 'c':3}
+            )
+        ]
+        self._test_call_site(pairs)
+
+    def _test_call_site_valid_arguments(self, values, invalid):
+        for value in values:
+            ast_node = test_utils.extract_node(value)
+            call_site = self._call_site_from_call(ast_node)
+            self.assertEqual(call_site.has_invalid_arguments(), invalid)
+
+    def test_call_site_valid_arguments(self):
+        values = [
+            "f(*lala)", "f(*1)", "f(*object)",
+        ]
+        self._test_call_site_valid_arguments(values, invalid=True)
+        values = [
+            "f()", "f(*(1, ))", "f(1, 2, *(2, 3))",
+        ]
+        self._test_call_site_valid_arguments(values, invalid=False)
+
+    def test_duplicated_keyword_arguments(self):
+        ast_node = test_utils.extract_node('f(f=24, **{"f": 25})')
+        site = self._call_site_from_call(ast_node)
+        self.assertIn('f', site.duplicated_keywords)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_regrtest.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_regrtest.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_regrtest.py	(revision 1126)
@@ -0,0 +1,307 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+import sys
+import unittest
+import textwrap
+
+import six
+
+from astroid import MANAGER, Instance, nodes
+from astroid.bases import BUILTINS
+from astroid.builder import AstroidBuilder
+from astroid import exceptions
+from astroid.raw_building import build_module
+from astroid.manager import AstroidManager
+from astroid.test_utils import require_version, extract_node
+from astroid.tests import resources
+from astroid import transforms
+
+
+class NonRegressionTests(resources.AstroidCacheSetupMixin,
+                         unittest.TestCase):
+
+    def setUp(self):
+        sys.path.insert(0, resources.find('data'))
+        MANAGER.always_load_extensions = True
+        MANAGER.astroid_cache[BUILTINS] = self._builtins
+
+    def tearDown(self):
+        # Since we may have created a brainless manager, leading
+        # to a new cache builtin module and proxy classes in the constants,
+        # clear out the global manager cache.
+        MANAGER.clear_cache(self._builtins)
+        MANAGER.always_load_extensions = False
+        sys.path.pop(0)
+        sys.path_importer_cache.pop(resources.find('data'), None)
+
+    def brainless_manager(self):
+        manager = AstroidManager()
+        # avoid caching into the AstroidManager borg since we get problems
+        # with other tests :
+        manager.__dict__ = {}
+        manager._failed_import_hooks = []
+        manager.astroid_cache = {}
+        manager._mod_file_cache = {}
+        manager._transform = transforms.TransformVisitor()
+        manager.clear_cache() # trigger proper bootstraping
+        return manager
+
+    def test_module_path(self):
+        man = self.brainless_manager()
+        mod = man.ast_from_module_name('package.import_package_subpackage_module')
+        package = next(mod.igetattr('package'))
+        self.assertEqual(package.name, 'package')
+        subpackage = next(package.igetattr('subpackage'))
+        self.assertIsInstance(subpackage, nodes.Module)
+        self.assertTrue(subpackage.package)
+        self.assertEqual(subpackage.name, 'package.subpackage')
+        module = next(subpackage.igetattr('module'))
+        self.assertEqual(module.name, 'package.subpackage.module')
+
+
+    def test_package_sidepackage(self):
+        manager = self.brainless_manager()
+        assert 'package.sidepackage' not in MANAGER.astroid_cache
+        package = manager.ast_from_module_name('absimp')
+        self.assertIsInstance(package, nodes.Module)
+        self.assertTrue(package.package)
+        subpackage = next(package.getattr('sidepackage')[0].infer())
+        self.assertIsInstance(subpackage, nodes.Module)
+        self.assertTrue(subpackage.package)
+        self.assertEqual(subpackage.name, 'absimp.sidepackage')
+
+
+    def test_living_property(self):
+        builder = AstroidBuilder()
+        builder._done = {}
+        builder._module = sys.modules[__name__]
+        builder.object_build(build_module('module_name', ''), Whatever)
+
+
+    def test_new_style_class_detection(self):
+        try:
+            import pygtk # pylint: disable=unused-variable
+        except ImportError:
+            self.skipTest('test skipped: pygtk is not available')
+        # XXX may fail on some pygtk version, because objects in
+        # gobject._gobject have __module__ set to gobject :(
+        builder = AstroidBuilder()
+        data = """
+import pygtk
+pygtk.require("2.6")
+import gobject
+
+class A(gobject.GObject):
+    pass
+"""
+        astroid = builder.string_build(data, __name__, __file__)
+        a = astroid['A']
+        self.assertTrue(a.newstyle)
+
+
+    def test_pylint_config_attr(self):
+        try:
+            from pylint import lint # pylint: disable=unused-variable
+        except ImportError:
+            self.skipTest('pylint not available')
+        mod = MANAGER.ast_from_module_name('pylint.lint')
+        pylinter = mod['PyLinter']
+        expect = ['OptionsManagerMixIn', 'object', 'MessagesHandlerMixIn',
+                  'ReportsHandlerMixIn', 'BaseTokenChecker', 'BaseChecker',
+                  'OptionsProviderMixIn']
+        self.assertListEqual([c.name for c in pylinter.ancestors()],
+                             expect)
+        self.assertTrue(list(Instance(pylinter).getattr('config')))
+        inferred = list(Instance(pylinter).igetattr('config'))
+        self.assertEqual(len(inferred), 1)
+        self.assertEqual(inferred[0].root().name, 'optparse')
+        self.assertEqual(inferred[0].name, 'Values')
+
+    def test_numpy_crash(self):
+        """test don't crash on numpy"""
+        #a crash occured somewhere in the past, and an
+        # InferenceError instead of a crash was better, but now we even infer!
+        try:
+            import numpy # pylint: disable=unused-variable
+        except ImportError:
+            self.skipTest('test skipped: numpy is not available')
+        builder = AstroidBuilder()
+        data = """
+from numpy import multiply
+
+multiply(1, 2, 3)
+"""
+        astroid = builder.string_build(data, __name__, __file__)
+        callfunc = astroid.body[1].value.func
+        inferred = callfunc.inferred()
+        self.assertEqual(len(inferred), 1)
+
+    @require_version('3.0')
+    def test_nameconstant(self):
+        # used to fail for Python 3.4
+        builder = AstroidBuilder()
+        astroid = builder.string_build("def test(x=True): pass")
+        default = astroid.body[0].args.args[0]
+        self.assertEqual(default.name, 'x')
+        self.assertEqual(next(default.infer()).value, True)
+
+    @require_version('2.7')
+    def test_with_infer_assignnames(self):
+        builder = AstroidBuilder()
+        data = """
+with open('a.txt') as stream, open('b.txt'):
+    stream.read()
+"""
+        astroid = builder.string_build(data, __name__, __file__)
+        # Used to crash due to the fact that the second
+        # context manager didn't use an assignment name.
+        list(astroid.nodes_of_class(nodes.Call))[-1].inferred()
+
+    def test_recursion_regression_issue25(self):
+        builder = AstroidBuilder()
+        data = """
+import recursion as base
+
+_real_Base = base.Base
+
+class Derived(_real_Base):
+    pass
+
+def run():
+    base.Base = Derived
+"""
+        astroid = builder.string_build(data, __name__, __file__)
+        # Used to crash in _is_metaclass, due to wrong
+        # ancestors chain
+        classes = astroid.nodes_of_class(nodes.ClassDef)
+        for klass in classes:
+            # triggers the _is_metaclass call
+            klass.type # pylint: disable=pointless-statement
+
+    def test_decorator_callchain_issue42(self):
+        builder = AstroidBuilder()
+        data = """
+
+def test():
+    def factory(func):
+        def newfunc():
+            func()
+        return newfunc
+    return factory
+
+@test()
+def crash():
+    pass
+"""
+        astroid = builder.string_build(data, __name__, __file__)
+        self.assertEqual(astroid['crash'].type, 'function')
+
+    def test_filter_stmts_scoping(self):
+        builder = AstroidBuilder()
+        data = """
+def test():
+    compiler = int()
+    class B(compiler.__class__):
+        pass
+    compiler = B()
+    return compiler
+"""
+        astroid = builder.string_build(data, __name__, __file__)
+        test = astroid['test']
+        result = next(test.infer_call_result(astroid))
+        self.assertIsInstance(result, Instance)
+        base = next(result._proxied.bases[0].infer())
+        self.assertEqual(base.name, 'int')
+
+    def test_ancestors_patching_class_recursion(self):
+        node = AstroidBuilder().string_build(textwrap.dedent("""
+        import string
+        Template = string.Template
+
+        class A(Template):
+            pass
+
+        class B(A):
+            pass
+
+        def test(x=False):
+            if x:
+                string.Template = A
+            else:
+                string.Template = B
+        """))
+        klass = node['A']
+        ancestors = list(klass.ancestors())
+        self.assertEqual(ancestors[0].qname(), 'string.Template')
+
+    def test_ancestors_yes_in_bases(self):
+        # Test for issue https://bitbucket.org/logilab/astroid/issue/84
+        # This used to crash astroid with a TypeError, because an YES
+        # node was present in the bases
+        node = extract_node("""
+        def with_metaclass(meta, *bases):
+            class metaclass(meta):
+                def __new__(cls, name, this_bases, d):
+                    return meta(name, bases, d)
+        return type.__new__(metaclass, 'temporary_class', (), {})
+
+        import lala
+
+        class A(with_metaclass(object, lala.lala)): #@
+            pass
+        """)
+        ancestors = list(node.ancestors())
+        if six.PY3:
+            self.assertEqual(len(ancestors), 1)
+            self.assertEqual(ancestors[0].qname(),
+                             "{}.object".format(BUILTINS))
+        else:
+            self.assertEqual(len(ancestors), 0)
+
+    def test_ancestors_missing_from_function(self):
+        # Test for https://www.logilab.org/ticket/122793
+        node = extract_node('''
+        def gen(): yield
+        GEN = gen()
+        next(GEN)
+        ''')
+        self.assertRaises(exceptions.InferenceError, next, node.infer())
+
+    def test_unicode_in_docstring(self):
+        # Crashed for astroid==1.4.1
+        # Test for https://bitbucket.org/logilab/astroid/issues/273/
+
+        # In a regular file, "coding: utf-8" would have been used.
+        node = extract_node(u'''
+        from __future__ import unicode_literals
+
+        class MyClass(object):
+            def method(self):
+                "With unicode : %s "
+
+        instance = MyClass()
+        ''' % u"\u2019")
+
+        next(node.value.infer()).as_string()
+
+
+class Whatever(object):
+    a = property(lambda x: x, lambda x: x)
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_utils.py	(revision 1126)
@@ -0,0 +1,124 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+import unittest
+
+from astroid import builder
+from astroid import InferenceError
+from astroid import nodes
+from astroid import node_classes
+from astroid import test_utils
+from astroid import util as astroid_util
+
+
+class InferenceUtil(unittest.TestCase):
+
+    def test_not_exclusive(self):
+        module = builder.parse("""
+        x = 10
+        for x in range(5):
+            print (x)
+
+        if x > 0:
+            print ('#' * x)
+        """, __name__, __file__)
+        xass1 = module.locals['x'][0]
+        assert xass1.lineno == 2
+        xnames = [n for n in module.nodes_of_class(nodes.Name) if n.name == 'x']
+        assert len(xnames) == 3
+        assert xnames[1].lineno == 6
+        self.assertEqual(node_classes.are_exclusive(xass1, xnames[1]), False)
+        self.assertEqual(node_classes.are_exclusive(xass1, xnames[2]), False)
+
+    def test_if(self):
+        module = builder.parse('''
+        if 1:
+            a = 1
+            a = 2
+        elif 2:
+            a = 12
+            a = 13
+        else:
+            a = 3
+            a = 4
+        ''')
+        a1 = module.locals['a'][0]
+        a2 = module.locals['a'][1]
+        a3 = module.locals['a'][2]
+        a4 = module.locals['a'][3]
+        a5 = module.locals['a'][4]
+        a6 = module.locals['a'][5]
+        self.assertEqual(node_classes.are_exclusive(a1, a2), False)
+        self.assertEqual(node_classes.are_exclusive(a1, a3), True)
+        self.assertEqual(node_classes.are_exclusive(a1, a5), True)
+        self.assertEqual(node_classes.are_exclusive(a3, a5), True)
+        self.assertEqual(node_classes.are_exclusive(a3, a4), False)
+        self.assertEqual(node_classes.are_exclusive(a5, a6), False)
+
+    def test_try_except(self):
+        module = builder.parse('''
+        try:
+            def exclusive_func2():
+                "docstring"
+        except TypeError:
+            def exclusive_func2():
+                "docstring"
+        except:
+            def exclusive_func2():
+                "docstring"
+        else:
+            def exclusive_func2():
+                "this one redefine the one defined line 42"
+        ''')
+        f1 = module.locals['exclusive_func2'][0]
+        f2 = module.locals['exclusive_func2'][1]
+        f3 = module.locals['exclusive_func2'][2]
+        f4 = module.locals['exclusive_func2'][3]
+        self.assertEqual(node_classes.are_exclusive(f1, f2), True)
+        self.assertEqual(node_classes.are_exclusive(f1, f3), True)
+        self.assertEqual(node_classes.are_exclusive(f1, f4), False)
+        self.assertEqual(node_classes.are_exclusive(f2, f4), True)
+        self.assertEqual(node_classes.are_exclusive(f3, f4), True)
+        self.assertEqual(node_classes.are_exclusive(f3, f2), True)
+
+        self.assertEqual(node_classes.are_exclusive(f2, f1), True)
+        self.assertEqual(node_classes.are_exclusive(f4, f1), False)
+        self.assertEqual(node_classes.are_exclusive(f4, f2), True)
+
+    def test_unpack_infer_uninferable_nodes(self):
+        node = test_utils.extract_node('''
+        x = [A] * 1
+        f = [x, [A] * 2]
+        f
+        ''')
+        inferred = next(node.infer())
+        unpacked = list(node_classes.unpack_infer(inferred))
+        self.assertEqual(len(unpacked), 3)
+        self.assertTrue(all(elt is astroid_util.YES
+                            for elt in unpacked))
+
+    def test_unpack_infer_empty_tuple(self):
+        node = test_utils.extract_node('''
+        ()
+        ''')
+        inferred = next(node.infer())
+        with self.assertRaises(InferenceError):
+            list(node_classes.unpack_infer(inferred))
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_modutils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_modutils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_modutils.py	(revision 1126)
@@ -0,0 +1,269 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# astroid is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid.  If not, see <http://www.gnu.org/licenses/>.
+"""
+unit tests for module modutils (module manipulation utilities)
+"""
+import os
+import sys
+import unittest
+
+from astroid import modutils
+from astroid.tests import resources
+
+
+def _get_file_from_object(obj):
+    return modutils._path_from_filename(obj.__file__)
+
+
+class ModuleFileTest(unittest.TestCase):
+    package = "mypypa"
+
+    def tearDown(self):
+        for k in list(sys.path_importer_cache.keys()):
+            if 'MyPyPa' in k:
+                del sys.path_importer_cache[k]
+
+    def test_find_zipped_module(self):
+        mtype, mfile = modutils._module_file(
+            [self.package], [resources.find('data/MyPyPa-0.1.0-py2.5.zip')])
+        self.assertEqual(mtype, modutils.PY_ZIPMODULE)
+        self.assertEqual(mfile.split(os.sep)[-3:], ["data", "MyPyPa-0.1.0-py2.5.zip", self.package])
+
+    def test_find_egg_module(self):
+        mtype, mfile = modutils._module_file(
+            [self.package], [resources.find('data/MyPyPa-0.1.0-py2.5.egg')])
+        self.assertEqual(mtype, modutils.PY_ZIPMODULE)
+        self.assertEqual(mfile.split(os.sep)[-3:], ["data", "MyPyPa-0.1.0-py2.5.egg", self.package])
+
+
+class LoadModuleFromNameTest(unittest.TestCase):
+    """ load a python module from it's name """
+
+    def test_knownValues_load_module_from_name_1(self):
+        self.assertEqual(modutils.load_module_from_name('sys'), sys)
+
+    def test_knownValues_load_module_from_name_2(self):
+        self.assertEqual(modutils.load_module_from_name('os.path'), os.path)
+
+    def test_raise_load_module_from_name_1(self):
+        self.assertRaises(ImportError,
+                          modutils.load_module_from_name, 'os.path', use_sys=0)
+
+
+class GetModulePartTest(unittest.TestCase):
+    """given a dotted name return the module part of the name"""
+
+    def test_knownValues_get_module_part_1(self):
+        self.assertEqual(modutils.get_module_part('astroid.modutils'),
+                         'astroid.modutils')
+
+    def test_knownValues_get_module_part_2(self):
+        self.assertEqual(modutils.get_module_part('astroid.modutils.get_module_part'),
+                         'astroid.modutils')
+
+    def test_knownValues_get_module_part_3(self):
+        """relative import from given file"""
+        self.assertEqual(modutils.get_module_part('node_classes.AssName',
+                                                  modutils.__file__), 'node_classes')
+
+    def test_knownValues_get_compiled_module_part(self):
+        self.assertEqual(modutils.get_module_part('math.log10'), 'math')
+        self.assertEqual(modutils.get_module_part('math.log10', __file__), 'math')
+
+    def test_knownValues_get_builtin_module_part(self):
+        self.assertEqual(modutils.get_module_part('sys.path'), 'sys')
+        self.assertEqual(modutils.get_module_part('sys.path', '__file__'), 'sys')
+
+    def test_get_module_part_exception(self):
+        self.assertRaises(ImportError, modutils.get_module_part, 'unknown.module',
+                          modutils.__file__)
+
+
+class ModPathFromFileTest(unittest.TestCase):
+    """ given an absolute file path return the python module's path as a list """
+
+    def test_knownValues_modpath_from_file_1(self):
+        from xml.etree import ElementTree
+        self.assertEqual(modutils.modpath_from_file(ElementTree.__file__),
+                         ['xml', 'etree', 'ElementTree'])
+
+    def test_knownValues_modpath_from_file_2(self):
+        self.assertEqual(modutils.modpath_from_file('unittest_modutils.py',
+                                                    {os.getcwd(): 'arbitrary.pkg'}),
+                         ['arbitrary', 'pkg', 'unittest_modutils'])
+
+    def test_raise_modpath_from_file_Exception(self):
+        self.assertRaises(Exception, modutils.modpath_from_file, '/turlututu')
+
+
+class LoadModuleFromPathTest(resources.SysPathSetup, unittest.TestCase):
+
+    def test_do_not_load_twice(self):
+        modutils.load_module_from_modpath(['data', 'lmfp', 'foo'])
+        modutils.load_module_from_modpath(['data', 'lmfp'])
+        self.assertEqual(len(sys.just_once), 1)
+        del sys.just_once
+
+
+class FileFromModPathTest(resources.SysPathSetup, unittest.TestCase):
+    """given a mod path (i.e. splited module / package name), return the
+    corresponding file, giving priority to source file over precompiled file
+    if it exists"""
+
+    def test_site_packages(self):
+        filename = _get_file_from_object(modutils)
+        result = modutils.file_from_modpath(['astroid', 'modutils'])
+        self.assertEqual(os.path.realpath(result), os.path.realpath(filename))
+
+    def test_std_lib(self):
+        from os import path
+        self.assertEqual(os.path.realpath(modutils.file_from_modpath(['os', 'path']).replace('.pyc', '.py')),
+                         os.path.realpath(path.__file__.replace('.pyc', '.py')))
+
+    def test_xmlplus(self):
+        try:
+            # don't fail if pyxml isn't installed
+            from xml.dom import ext
+        except ImportError:
+            pass
+        else:
+            self.assertEqual(os.path.realpath(modutils.file_from_modpath(['xml', 'dom', 'ext']).replace('.pyc', '.py')),
+                             os.path.realpath(ext.__file__.replace('.pyc', '.py')))
+
+    def test_builtin(self):
+        self.assertEqual(modutils.file_from_modpath(['sys']),
+                         None)
+
+
+    def test_unexisting(self):
+        self.assertRaises(ImportError, modutils.file_from_modpath, ['turlututu'])
+
+    def test_unicode_in_package_init(self):
+        # file_from_modpath should not crash when reading an __init__
+        # file with unicode characters.
+        modutils.file_from_modpath(["data", "unicode_package", "core"])
+
+
+class GetSourceFileTest(unittest.TestCase):
+
+    def test(self):
+        filename = _get_file_from_object(os.path)
+        self.assertEqual(modutils.get_source_file(os.path.__file__),
+                         os.path.normpath(filename))
+
+    def test_raise(self):
+        self.assertRaises(modutils.NoSourceFile, modutils.get_source_file, 'whatever')
+
+
+class StandardLibModuleTest(resources.SysPathSetup, unittest.TestCase):
+    """
+    return true if the module may be considered as a module from the standard
+    library
+    """
+
+    def test_datetime(self):
+        # This is an interesting example, since datetime, on pypy,
+        # is under lib_pypy, rather than the usual Lib directory.
+        self.assertTrue(modutils.is_standard_module('datetime'))
+
+    def test_builtins(self):
+        if sys.version_info < (3, 0):
+            self.assertEqual(modutils.is_standard_module('__builtin__'), True)
+            self.assertEqual(modutils.is_standard_module('builtins'), False)
+        else:
+            self.assertEqual(modutils.is_standard_module('__builtin__'), False)
+            self.assertEqual(modutils.is_standard_module('builtins'), True)
+
+    def test_builtin(self):
+        self.assertEqual(modutils.is_standard_module('sys'), True)
+        self.assertEqual(modutils.is_standard_module('marshal'), True)
+
+    def test_nonstandard(self):
+        self.assertEqual(modutils.is_standard_module('astroid'), False)
+
+    def test_unknown(self):
+        self.assertEqual(modutils.is_standard_module('unknown'), False)
+
+    def test_4(self):
+        self.assertEqual(modutils.is_standard_module('hashlib'), True)
+        self.assertEqual(modutils.is_standard_module('pickle'), True)
+        self.assertEqual(modutils.is_standard_module('email'), True)
+        self.assertEqual(modutils.is_standard_module('io'), sys.version_info >= (2, 6))
+        self.assertEqual(modutils.is_standard_module('StringIO'), sys.version_info < (3, 0))
+        self.assertEqual(modutils.is_standard_module('unicodedata'), True)
+
+    def test_custom_path(self):
+        datadir = resources.find('')
+        if datadir.startswith(modutils.EXT_LIB_DIR):
+            self.skipTest('known breakage of is_standard_module on installed package')
+        self.assertEqual(modutils.is_standard_module('data.module', (datadir,)), True)
+        self.assertEqual(modutils.is_standard_module('data.module', (os.path.abspath(datadir),)), True)
+
+    def test_failing_edge_cases(self):
+        from xml import etree
+        # using a subpackage/submodule path as std_path argument
+        self.assertEqual(modutils.is_standard_module('xml.etree', etree.__path__), False)
+        # using a module + object name as modname argument
+        self.assertEqual(modutils.is_standard_module('sys.path'), True)
+        # this is because only the first package/module is considered
+        self.assertEqual(modutils.is_standard_module('sys.whatever'), True)
+        self.assertEqual(modutils.is_standard_module('xml.whatever', etree.__path__), False)
+
+
+class IsRelativeTest(unittest.TestCase):
+
+
+    def test_knownValues_is_relative_1(self):
+        import email
+        self.assertEqual(modutils.is_relative('utils', email.__path__[0]),
+                         True)
+
+    def test_knownValues_is_relative_2(self):
+        from xml.etree import ElementTree
+        self.assertEqual(modutils.is_relative('ElementPath', ElementTree.__file__),
+                         True)
+
+    def test_knownValues_is_relative_3(self):
+        import astroid
+        self.assertEqual(modutils.is_relative('astroid', astroid.__path__[0]),
+                         False)
+
+
+class GetModuleFilesTest(unittest.TestCase):
+
+    def test_get_module_files_1(self):
+        package = resources.find('data/find_test')
+        modules = set(modutils.get_module_files(package, []))
+        expected = ['__init__.py', 'module.py', 'module2.py',
+                    'noendingnewline.py', 'nonregr.py']
+        self.assertEqual(modules,
+                         {os.path.join(package, x) for x in expected})
+
+    def test_load_module_set_attribute(self):
+        import xml.etree.ElementTree
+        import xml
+        del xml.etree.ElementTree
+        del sys.modules['xml.etree.ElementTree']
+        m = modutils.load_module_from_modpath(['xml', 'etree', 'ElementTree'])
+        self.assertTrue(hasattr(xml, 'etree'))
+        self.assertTrue(hasattr(xml.etree, 'ElementTree'))
+        self.assertTrue(m is xml.etree.ElementTree)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_peephole.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_peephole.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_peephole.py	(revision 1126)
@@ -0,0 +1,121 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+"""Tests for the astroid AST peephole optimizer."""
+
+import ast
+import textwrap
+import unittest
+
+import astroid
+from astroid import astpeephole
+from astroid import builder
+from astroid import manager
+from astroid import test_utils
+from astroid.tests import resources
+
+
+MANAGER = manager.AstroidManager()
+
+
+class PeepholeOptimizer(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        MANAGER.optimize_ast = True
+
+    @classmethod
+    def tearDownClass(cls):
+        MANAGER.optimize_ast = False
+
+    def setUp(self):
+        self._optimizer = astpeephole.ASTPeepholeOptimizer()
+
+    @staticmethod
+    def _get_binops(code):
+        module = ast.parse(textwrap.dedent(code))
+        return [node.value for node in module.body
+                if isinstance(node, ast.Expr)]
+
+    @test_utils.require_version(maxver='3.0')
+    def test_optimize_binop_unicode(self):
+        nodes = self._get_binops("""
+        u"a" + u"b" + u"c"
+
+        u"a" + "c" + "b"
+        u"a" + b"c"
+        """)
+
+        result = self._optimizer.optimize_binop(nodes[0])
+        self.assertIsInstance(result, astroid.Const)
+        self.assertEqual(result.value, u"abc")
+
+        self.assertIsNone(self._optimizer.optimize_binop(nodes[1]))
+        self.assertIsNone(self._optimizer.optimize_binop(nodes[2]))
+
+    def test_optimize_binop(self):
+        nodes = self._get_binops("""
+        "a" + "b" + "c" + "d"
+        b"a" + b"b" + b"c" + b"d"
+        "a" + "b"
+
+        "a" + "b" + 1 + object
+        var = 4
+        "a" + "b" + var + "c"
+        "a" + "b" + "c" - "4"
+        "a" + "b" + "c" + "d".format()
+        "a" - "b"
+        "a"
+        1 + 4 + 5 + 6
+        """)
+
+        result = self._optimizer.optimize_binop(nodes[0])
+        self.assertIsInstance(result, astroid.Const)
+        self.assertEqual(result.value, "abcd")
+
+        result = self._optimizer.optimize_binop(nodes[1])
+        self.assertIsInstance(result, astroid.Const)
+        self.assertEqual(result.value, b"abcd")
+
+        for node in nodes[2:]:
+            self.assertIsNone(self._optimizer.optimize_binop(node))
+
+    def test_big_binop_crash(self):
+        # Test that we don't fail on a lot of joined strings
+        # through the addition operator.
+        module = resources.build_file('data/joined_strings.py')
+        element = next(module['x'].infer())
+        self.assertIsInstance(element, astroid.Const)
+        self.assertEqual(len(element.value), 61660)
+
+    def test_optimisation_disabled(self):
+        try:
+            MANAGER.optimize_ast = False
+            module = builder.parse("""
+            '1' + '2' + '3'
+            """)
+            self.assertIsInstance(module.body[0], astroid.Expr)
+            self.assertIsInstance(module.body[0].value, astroid.BinOp)
+            self.assertIsInstance(module.body[0].value.left, astroid.BinOp)
+            self.assertIsInstance(module.body[0].value.left.left,
+                                  astroid.Const)
+        finally:
+            MANAGER.optimize_ast = True
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_python3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_python3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_python3.py	(revision 1126)
@@ -0,0 +1,254 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+from textwrap import dedent
+import unittest
+
+from astroid import nodes
+from astroid.node_classes import Assign, Expr, YieldFrom, Name, Const
+from astroid.builder import AstroidBuilder
+from astroid.scoped_nodes import ClassDef, FunctionDef
+from astroid.test_utils import require_version, extract_node
+
+
+class Python3TC(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        cls.builder = AstroidBuilder()
+
+    @require_version('3.0')
+    def test_starred_notation(self):
+        astroid = self.builder.string_build("*a, b = [1, 2, 3]", 'test', 'test')
+
+        # Get the star node
+        node = next(next(next(astroid.get_children()).get_children()).get_children())
+
+        self.assertTrue(isinstance(node.assign_type(), Assign))
+
+    @require_version('3.3')
+    def test_yield_from(self):
+        body = dedent("""
+        def func():
+            yield from iter([1, 2])
+        """)
+        astroid = self.builder.string_build(body)
+        func = astroid.body[0]
+        self.assertIsInstance(func, FunctionDef)
+        yieldfrom_stmt = func.body[0]
+
+        self.assertIsInstance(yieldfrom_stmt, Expr)
+        self.assertIsInstance(yieldfrom_stmt.value, YieldFrom)
+        self.assertEqual(yieldfrom_stmt.as_string(),
+                         'yield from iter([1, 2])')
+
+    @require_version('3.3')
+    def test_yield_from_is_generator(self):
+        body = dedent("""
+        def func():
+            yield from iter([1, 2])
+        """)
+        astroid = self.builder.string_build(body)
+        func = astroid.body[0]
+        self.assertIsInstance(func, FunctionDef)
+        self.assertTrue(func.is_generator())
+
+    @require_version('3.3')
+    def test_yield_from_as_string(self):
+        body = dedent("""
+        def func():
+            yield from iter([1, 2])
+            value = yield from other()
+        """)
+        astroid = self.builder.string_build(body)
+        func = astroid.body[0]
+        self.assertEqual(func.as_string().strip(), body.strip())
+
+    # metaclass tests
+
+    @require_version('3.0')
+    def test_simple_metaclass(self):
+        astroid = self.builder.string_build("class Test(metaclass=type): pass")
+        klass = astroid.body[0]
+
+        metaclass = klass.metaclass()
+        self.assertIsInstance(metaclass, ClassDef)
+        self.assertEqual(metaclass.name, 'type')
+
+    @require_version('3.0')
+    def test_metaclass_error(self):
+        astroid = self.builder.string_build("class Test(metaclass=typ): pass")
+        klass = astroid.body[0]
+        self.assertFalse(klass.metaclass())
+
+    @require_version('3.0')
+    def test_metaclass_imported(self):
+        astroid = self.builder.string_build(dedent("""
+        from abc import ABCMeta 
+        class Test(metaclass=ABCMeta): pass"""))
+        klass = astroid.body[1]
+
+        metaclass = klass.metaclass()
+        self.assertIsInstance(metaclass, ClassDef)
+        self.assertEqual(metaclass.name, 'ABCMeta')
+
+    @require_version('3.0')
+    def test_as_string(self):
+        body = dedent("""
+        from abc import ABCMeta 
+        class Test(metaclass=ABCMeta): pass""")
+        astroid = self.builder.string_build(body)
+        klass = astroid.body[1]
+
+        self.assertEqual(klass.as_string(),
+                         '\n\nclass Test(metaclass=ABCMeta):\n    pass\n')
+
+    @require_version('3.0')
+    def test_old_syntax_works(self):
+        astroid = self.builder.string_build(dedent("""
+        class Test:
+            __metaclass__ = type
+        class SubTest(Test): pass
+        """))
+        klass = astroid['SubTest']
+        metaclass = klass.metaclass()
+        self.assertIsNone(metaclass)
+
+    @require_version('3.0')
+    def test_metaclass_yes_leak(self):
+        astroid = self.builder.string_build(dedent("""
+        # notice `ab` instead of `abc`
+        from ab import ABCMeta
+
+        class Meta(metaclass=ABCMeta): pass
+        """))
+        klass = astroid['Meta']
+        self.assertIsNone(klass.metaclass())
+
+    @require_version('3.0')
+    def test_parent_metaclass(self):
+        astroid = self.builder.string_build(dedent("""
+        from abc import ABCMeta
+        class Test(metaclass=ABCMeta): pass
+        class SubTest(Test): pass
+        """))
+        klass = astroid['SubTest']
+        self.assertTrue(klass.newstyle)
+        metaclass = klass.metaclass()
+        self.assertIsInstance(metaclass, ClassDef)
+        self.assertEqual(metaclass.name, 'ABCMeta')
+
+    @require_version('3.0')
+    def test_metaclass_ancestors(self):
+        astroid = self.builder.string_build(dedent("""
+        from abc import ABCMeta
+
+        class FirstMeta(metaclass=ABCMeta): pass
+        class SecondMeta(metaclass=type):
+            pass
+
+        class Simple:
+            pass
+
+        class FirstImpl(FirstMeta): pass
+        class SecondImpl(FirstImpl): pass
+        class ThirdImpl(Simple, SecondMeta):
+            pass
+        """))
+        classes = {
+            'ABCMeta': ('FirstImpl', 'SecondImpl'),
+            'type': ('ThirdImpl', )
+        }
+        for metaclass, names in classes.items():
+            for name in names:
+                impl = astroid[name]
+                meta = impl.metaclass()
+                self.assertIsInstance(meta, ClassDef)
+                self.assertEqual(meta.name, metaclass)
+
+    @require_version('3.0')
+    def test_annotation_support(self):
+        astroid = self.builder.string_build(dedent("""
+        def test(a: int, b: str, c: None, d, e,
+                 *args: float, **kwargs: int)->int:
+            pass
+        """))
+        func = astroid['test']
+        self.assertIsInstance(func.args.varargannotation, Name)
+        self.assertEqual(func.args.varargannotation.name, 'float')
+        self.assertIsInstance(func.args.kwargannotation, Name)
+        self.assertEqual(func.args.kwargannotation.name, 'int')
+        self.assertIsInstance(func.returns, Name)
+        self.assertEqual(func.returns.name, 'int')
+        arguments = func.args
+        self.assertIsInstance(arguments.annotations[0], Name)
+        self.assertEqual(arguments.annotations[0].name, 'int')
+        self.assertIsInstance(arguments.annotations[1], Name)
+        self.assertEqual(arguments.annotations[1].name, 'str')
+        self.assertIsInstance(arguments.annotations[2], Const)
+        self.assertIsNone(arguments.annotations[2].value)
+        self.assertIsNone(arguments.annotations[3])
+        self.assertIsNone(arguments.annotations[4])
+
+        astroid = self.builder.string_build(dedent("""
+        def test(a: int=1, b: str=2):
+            pass
+        """))
+        func = astroid['test']
+        self.assertIsInstance(func.args.annotations[0], Name)
+        self.assertEqual(func.args.annotations[0].name, 'int')
+        self.assertIsInstance(func.args.annotations[1], Name)
+        self.assertEqual(func.args.annotations[1].name, 'str')
+        self.assertIsNone(func.returns)
+
+    @require_version('3.0')
+    def test_annotation_as_string(self):
+        code1 = dedent('''
+        def test(a, b:int=4, c=2, f:'lala'=4)->2:
+            pass''')
+        code2 = dedent('''
+        def test(a:typing.Generic[T], c:typing.Any=24)->typing.Iterable:
+            pass''')
+        for code in (code1, code2):
+            func = extract_node(code)
+            self.assertEqual(func.as_string(), code)
+
+    @require_version('3.5')
+    def test_unpacking_in_dicts(self):
+        code = "{'x': 1, **{'y': 2}}"
+        node = extract_node(code)
+        self.assertEqual(node.as_string(), code)
+        keys = [key for (key, _) in node.items]
+        self.assertIsInstance(keys[0], nodes.Const)
+        self.assertIsInstance(keys[1], nodes.DictUnpack)
+
+    @require_version('3.5')
+    def test_nested_unpacking_in_dicts(self):
+        code = "{'x': 1, **{'y': 2, **{'z': 3}}}"
+        node = extract_node(code)
+        self.assertEqual(node.as_string(), code)
+
+    @require_version('3.5')
+    def test_unpacking_in_dict_getitem(self):
+        node = extract_node('{1:2, **{2:3, 3:4}, **{5: 6}}')
+        for key, expected in ((1, 2), (2, 3), (3, 4), (5, 6)):
+            value = node.getitem(key)
+            self.assertIsInstance(value, nodes.Const)
+            self.assertEqual(value.value, expected)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_scoped_nodes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_scoped_nodes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_scoped_nodes.py	(revision 1126)
@@ -0,0 +1,1549 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""tests for specific behaviour of astroid scoped nodes (i.e. module, class and
+function)
+"""
+import os
+import sys
+from functools import partial
+import unittest
+import warnings
+
+from astroid import builder
+from astroid import nodes
+from astroid import scoped_nodes
+from astroid import util
+from astroid.exceptions import (
+    InferenceError, NotFoundError,
+    NoDefault, ResolveError, MroError,
+    InconsistentMroError, DuplicateBasesError,
+)
+from astroid.bases import (
+    BUILTINS, Instance,
+    BoundMethod, UnboundMethod, Generator
+)
+from astroid import __pkginfo__
+from astroid import test_utils
+from astroid.tests import resources
+
+
+def _test_dict_interface(self, node, test_attr):
+    self.assertIs(node[test_attr], node[test_attr])
+    self.assertIn(test_attr, node)
+    node.keys()
+    node.values()
+    node.items()
+    iter(node)
+
+
+class ModuleLoader(resources.SysPathSetup):
+    def setUp(self):
+        super(ModuleLoader, self).setUp()
+        self.module = resources.build_file('data/module.py', 'data.module')
+        self.module2 = resources.build_file('data/module2.py', 'data.module2')
+        self.nonregr = resources.build_file('data/nonregr.py', 'data.nonregr')
+        self.pack = resources.build_file('data/__init__.py', 'data')
+
+
+class ModuleNodeTest(ModuleLoader, unittest.TestCase):
+
+    def test_special_attributes(self):
+        self.assertEqual(len(self.module.getattr('__name__')), 1)
+        self.assertIsInstance(self.module.getattr('__name__')[0], nodes.Const)
+        self.assertEqual(self.module.getattr('__name__')[0].value, 'data.module')
+        self.assertEqual(len(self.module.getattr('__doc__')), 1)
+        self.assertIsInstance(self.module.getattr('__doc__')[0], nodes.Const)
+        self.assertEqual(self.module.getattr('__doc__')[0].value, 'test module for astroid\n')
+        self.assertEqual(len(self.module.getattr('__file__')), 1)
+        self.assertIsInstance(self.module.getattr('__file__')[0], nodes.Const)
+        self.assertEqual(self.module.getattr('__file__')[0].value,
+                         os.path.abspath(resources.find('data/module.py')))
+        self.assertEqual(len(self.module.getattr('__dict__')), 1)
+        self.assertIsInstance(self.module.getattr('__dict__')[0], nodes.Dict)
+        self.assertRaises(NotFoundError, self.module.getattr, '__path__')
+        self.assertEqual(len(self.pack.getattr('__path__')), 1)
+        self.assertIsInstance(self.pack.getattr('__path__')[0], nodes.List)
+
+    def test_dict_interface(self):
+        _test_dict_interface(self, self.module, 'YO')
+
+    def test_getattr(self):
+        yo = self.module.getattr('YO')[0]
+        self.assertIsInstance(yo, nodes.ClassDef)
+        self.assertEqual(yo.name, 'YO')
+        red = next(self.module.igetattr('redirect'))
+        self.assertIsInstance(red, nodes.FunctionDef)
+        self.assertEqual(red.name, 'four_args')
+        namenode = next(self.module.igetattr('NameNode'))
+        self.assertIsInstance(namenode, nodes.ClassDef)
+        self.assertEqual(namenode.name, 'Name')
+        # resolve packageredirection
+        mod = resources.build_file('data/appl/myConnection.py',
+                                   'data.appl.myConnection')
+        ssl = next(mod.igetattr('SSL1'))
+        cnx = next(ssl.igetattr('Connection'))
+        self.assertEqual(cnx.__class__, nodes.ClassDef)
+        self.assertEqual(cnx.name, 'Connection')
+        self.assertEqual(cnx.root().name, 'data.SSL1.Connection1')
+        self.assertEqual(len(self.nonregr.getattr('enumerate')), 2)
+        # raise ResolveError
+        self.assertRaises(InferenceError, self.nonregr.igetattr, 'YOAA')
+
+    def test_wildcard_import_names(self):
+        m = resources.build_file('data/all.py', 'all')
+        self.assertEqual(m.wildcard_import_names(), ['Aaa', '_bla', 'name'])
+        m = resources.build_file('data/notall.py', 'notall')
+        res = sorted(m.wildcard_import_names())
+        self.assertEqual(res, ['Aaa', 'func', 'name', 'other'])
+
+        m = builder.parse('''
+            from missing import tzop
+            trop = "test"
+            __all__ = (trop, "test1", tzop, 42)
+        ''')
+        res = sorted(m.wildcard_import_names())
+        self.assertEqual(res, ["test", "test1"])
+
+        m = builder.parse('''
+            test = tzop = 42
+            __all__ = ('test', ) + ('tzop', )
+        ''')
+        res = sorted(m.wildcard_import_names())
+        self.assertEqual(res, ['test', 'tzop'])
+
+    def test_module_getattr(self):
+        data = '''
+            appli = application
+            appli += 2
+            del appli
+        '''
+        astroid = builder.parse(data, __name__)
+        # test del statement not returned by getattr
+        self.assertEqual(len(astroid.getattr('appli')), 2,
+                         astroid.getattr('appli'))
+
+    def test_relative_to_absolute_name(self):
+        # package
+        mod = nodes.Module('very.multi.package', 'doc')
+        mod.package = True
+        modname = mod.relative_to_absolute_name('utils', 1)
+        self.assertEqual(modname, 'very.multi.package.utils')
+        modname = mod.relative_to_absolute_name('utils', 2)
+        self.assertEqual(modname, 'very.multi.utils')
+        modname = mod.relative_to_absolute_name('utils', 0)
+        self.assertEqual(modname, 'very.multi.package.utils')
+        modname = mod.relative_to_absolute_name('', 1)
+        self.assertEqual(modname, 'very.multi.package')
+        # non package
+        mod = nodes.Module('very.multi.module', 'doc')
+        mod.package = False
+        modname = mod.relative_to_absolute_name('utils', 0)
+        self.assertEqual(modname, 'very.multi.utils')
+        modname = mod.relative_to_absolute_name('utils', 1)
+        self.assertEqual(modname, 'very.multi.utils')
+        modname = mod.relative_to_absolute_name('utils', 2)
+        self.assertEqual(modname, 'very.utils')
+        modname = mod.relative_to_absolute_name('', 1)
+        self.assertEqual(modname, 'very.multi')
+
+    def test_import_1(self):
+        data = '''from . import subpackage'''
+        sys.path.insert(0, resources.find('data'))
+        astroid = builder.parse(data, 'package', 'data/package/__init__.py')
+        try:
+            m = astroid.import_module('', level=1)
+            self.assertEqual(m.name, 'package')
+            inferred = list(astroid.igetattr('subpackage'))
+            self.assertEqual(len(inferred), 1)
+            self.assertEqual(inferred[0].name, 'package.subpackage')
+        finally:
+            del sys.path[0]
+
+
+    def test_import_2(self):
+        data = '''from . import subpackage as pouet'''
+        astroid = builder.parse(data, 'package', 'data/package/__init__.py')
+        sys.path.insert(0, resources.find('data'))
+        try:
+            m = astroid.import_module('', level=1)
+            self.assertEqual(m.name, 'package')
+            inferred = list(astroid.igetattr('pouet'))
+            self.assertEqual(len(inferred), 1)
+            self.assertEqual(inferred[0].name, 'package.subpackage')
+        finally:
+            del sys.path[0]
+
+
+    def test_file_stream_in_memory(self):
+        data = '''irrelevant_variable is irrelevant'''
+        astroid = builder.parse(data, 'in_memory')
+        with warnings.catch_warnings(record=True):
+            self.assertEqual(astroid.file_stream.read().decode(), data)
+
+    def test_file_stream_physical(self):
+        path = resources.find('data/all.py')
+        astroid = builder.AstroidBuilder().file_build(path, 'all')
+        with open(path, 'rb') as file_io:
+            with warnings.catch_warnings(record=True):
+                self.assertEqual(astroid.file_stream.read(), file_io.read())
+
+    def test_file_stream_api(self):
+        path = resources.find('data/all.py')
+        astroid = builder.AstroidBuilder().file_build(path, 'all')
+        if __pkginfo__.numversion >= (1, 6):
+            # file_stream is slated for removal in astroid 1.6.
+            with self.assertRaises(AttributeError):
+                # pylint: disable=pointless-statement
+                astroid.file_stream
+        else:
+            # Until astroid 1.6, Module.file_stream will emit
+            # PendingDeprecationWarning in 1.4, DeprecationWarning
+            # in 1.5 and finally it will be removed in 1.6, leaving
+            # only Module.stream as the recommended way to retrieve
+            # its file stream.
+            with warnings.catch_warnings(record=True) as cm:
+                warnings.simplefilter("always")
+                self.assertIsNot(astroid.file_stream, astroid.file_stream)
+            self.assertGreater(len(cm), 1)
+            self.assertEqual(cm[0].category, PendingDeprecationWarning)
+
+    def test_stream_api(self):
+        path = resources.find('data/all.py')
+        astroid = builder.AstroidBuilder().file_build(path, 'all')
+        stream = astroid.stream()
+        self.assertTrue(hasattr(stream, 'close'))
+        with stream:
+            with open(path, 'rb') as file_io:
+                self.assertEqual(stream.read(), file_io.read())
+
+
+class FunctionNodeTest(ModuleLoader, unittest.TestCase):
+
+    def test_special_attributes(self):
+        func = self.module2['make_class']
+        self.assertEqual(len(func.getattr('__name__')), 1)
+        self.assertIsInstance(func.getattr('__name__')[0], nodes.Const)
+        self.assertEqual(func.getattr('__name__')[0].value, 'make_class')
+        self.assertEqual(len(func.getattr('__doc__')), 1)
+        self.assertIsInstance(func.getattr('__doc__')[0], nodes.Const)
+        self.assertEqual(func.getattr('__doc__')[0].value, 'check base is correctly resolved to Concrete0')
+        self.assertEqual(len(self.module.getattr('__dict__')), 1)
+        self.assertIsInstance(self.module.getattr('__dict__')[0], nodes.Dict)
+
+    def test_dict_interface(self):
+        _test_dict_interface(self, self.module['global_access'], 'local')
+
+    def test_default_value(self):
+        func = self.module2['make_class']
+        self.assertIsInstance(func.args.default_value('base'), nodes.Attribute)
+        self.assertRaises(NoDefault, func.args.default_value, 'args')
+        self.assertRaises(NoDefault, func.args.default_value, 'kwargs')
+        self.assertRaises(NoDefault, func.args.default_value, 'any')
+        #self.assertIsInstance(func.mularg_class('args'), nodes.Tuple)
+        #self.assertIsInstance(func.mularg_class('kwargs'), nodes.Dict)
+        #self.assertIsNone(func.mularg_class('base'))
+
+    def test_navigation(self):
+        function = self.module['global_access']
+        self.assertEqual(function.statement(), function)
+        l_sibling = function.previous_sibling()
+        # check taking parent if child is not a stmt
+        self.assertIsInstance(l_sibling, nodes.Assign)
+        child = function.args.args[0]
+        self.assertIs(l_sibling, child.previous_sibling())
+        r_sibling = function.next_sibling()
+        self.assertIsInstance(r_sibling, nodes.ClassDef)
+        self.assertEqual(r_sibling.name, 'YO')
+        self.assertIs(r_sibling, child.next_sibling())
+        last = r_sibling.next_sibling().next_sibling().next_sibling()
+        self.assertIsInstance(last, nodes.Assign)
+        self.assertIsNone(last.next_sibling())
+        first = l_sibling.root().body[0]
+        self.assertIsNone(first.previous_sibling())
+
+    def test_nested_args(self):
+        if sys.version_info >= (3, 0):
+            self.skipTest("nested args has been removed in py3.x")
+        code = '''
+            def nested_args(a, (b, c, d)):
+                "nested arguments test"
+        '''
+        tree = builder.parse(code)
+        func = tree['nested_args']
+        self.assertEqual(sorted(func._locals), ['a', 'b', 'c', 'd'])
+        self.assertEqual(func.args.format_args(), 'a, (b, c, d)')
+
+    def test_four_args(self):
+        func = self.module['four_args']
+        #self.assertEqual(func.args.args, ['a', ('b', 'c', 'd')])
+        local = sorted(func.keys())
+        self.assertEqual(local, ['a', 'b', 'c', 'd'])
+        self.assertEqual(func.type, 'function')
+
+    def test_format_args(self):
+        func = self.module2['make_class']
+        self.assertEqual(func.args.format_args(),
+                         'any, base=data.module.YO, *args, **kwargs')
+        func = self.module['four_args']
+        self.assertEqual(func.args.format_args(), 'a, b, c, d')
+
+    def test_is_generator(self):
+        self.assertTrue(self.module2['generator'].is_generator())
+        self.assertFalse(self.module2['not_a_generator'].is_generator())
+        self.assertFalse(self.module2['make_class'].is_generator())
+
+    def test_is_abstract(self):
+        method = self.module2['AbstractClass']['to_override']
+        self.assertTrue(method.is_abstract(pass_is_abstract=False))
+        self.assertEqual(method.qname(), 'data.module2.AbstractClass.to_override')
+        self.assertEqual(method.pytype(), '%s.instancemethod' % BUILTINS)
+        method = self.module2['AbstractClass']['return_something']
+        self.assertFalse(method.is_abstract(pass_is_abstract=False))
+        # non regression : test raise "string" doesn't cause an exception in is_abstract
+        func = self.module2['raise_string']
+        self.assertFalse(func.is_abstract(pass_is_abstract=False))
+
+    def test_is_abstract_decorated(self):
+        methods = test_utils.extract_node("""
+            import abc
+
+            class Klass(object):
+                @abc.abstractproperty
+                def prop(self):  #@
+                   pass
+
+                @abc.abstractmethod
+                def method1(self):  #@
+                   pass
+
+                some_other_decorator = lambda x: x
+                @some_other_decorator
+                def method2(self):  #@
+                   pass
+         """)
+        self.assertTrue(methods[0].is_abstract(pass_is_abstract=False))
+        self.assertTrue(methods[1].is_abstract(pass_is_abstract=False))
+        self.assertFalse(methods[2].is_abstract(pass_is_abstract=False))
+
+##     def test_raises(self):
+##         method = self.module2['AbstractClass']['to_override']
+##         self.assertEqual([str(term) for term in method.raises()],
+##                           ["Call(Name('NotImplementedError'), [], None, None)"] )
+
+##     def test_returns(self):
+##         method = self.module2['AbstractClass']['return_something']
+##         # use string comp since Node doesn't handle __cmp__
+##         self.assertEqual([str(term) for term in method.returns()],
+##                           ["Const('toto')", "Const(None)"])
+
+    def test_lambda_pytype(self):
+        data = '''
+            def f():
+                g = lambda: None
+        '''
+        astroid = builder.parse(data)
+        g = list(astroid['f'].ilookup('g'))[0]
+        self.assertEqual(g.pytype(), '%s.function' % BUILTINS)
+
+    def test_lambda_qname(self):
+        astroid = builder.parse('lmbd = lambda: None', __name__)
+        self.assertEqual('%s.<lambda>' % __name__, astroid['lmbd'].parent.value.qname())
+
+    def test_is_method(self):
+        data = '''
+            class A:
+                def meth1(self):
+                    return 1
+                @classmethod
+                def meth2(cls):
+                    return 2
+                @staticmethod
+                def meth3():
+                    return 3
+
+            def function():
+                return 0
+
+            @staticmethod
+            def sfunction():
+                return -1
+        '''
+        astroid = builder.parse(data)
+        self.assertTrue(astroid['A']['meth1'].is_method())
+        self.assertTrue(astroid['A']['meth2'].is_method())
+        self.assertTrue(astroid['A']['meth3'].is_method())
+        self.assertFalse(astroid['function'].is_method())
+        self.assertFalse(astroid['sfunction'].is_method())
+
+    def test_argnames(self):
+        if sys.version_info < (3, 0):
+            code = 'def f(a, (b, c), *args, **kwargs): pass'
+        else:
+            code = 'def f(a, b, c, *args, **kwargs): pass'
+        astroid = builder.parse(code, __name__)
+        self.assertEqual(astroid['f'].argnames(), ['a', 'b', 'c', 'args', 'kwargs'])
+
+    def test_return_nothing(self):
+        """test inferred value on a function with empty return"""
+        data = '''
+            def func():
+                return
+
+            a = func()
+        '''
+        astroid = builder.parse(data)
+        call = astroid.body[1].value
+        func_vals = call.inferred()
+        self.assertEqual(len(func_vals), 1)
+        self.assertIsInstance(func_vals[0], nodes.Const)
+        self.assertIsNone(func_vals[0].value)
+
+    def test_func_instance_attr(self):
+        """test instance attributes for functions"""
+        data = """
+            def test():
+                print(test.bar)
+
+            test.bar = 1
+            test()
+        """
+        astroid = builder.parse(data, 'mod')
+        func = astroid.body[2].value.func.inferred()[0]
+        self.assertIsInstance(func, nodes.FunctionDef)
+        self.assertEqual(func.name, 'test')
+        one = func.getattr('bar')[0].inferred()[0]
+        self.assertIsInstance(one, nodes.Const)
+        self.assertEqual(one.value, 1)
+
+    def test_type_builtin_descriptor_subclasses(self):
+        astroid = builder.parse("""
+            class classonlymethod(classmethod):
+                pass
+            class staticonlymethod(staticmethod):
+                pass
+
+            class Node:
+                @classonlymethod
+                def clsmethod_subclass(cls):
+                    pass
+                @classmethod
+                def clsmethod(cls):
+                    pass
+                @staticonlymethod
+                def staticmethod_subclass(cls):
+                    pass
+                @staticmethod
+                def stcmethod(cls):
+                    pass
+        """)
+        node = astroid._locals['Node'][0]
+        self.assertEqual(node._locals['clsmethod_subclass'][0].type,
+                         'classmethod')
+        self.assertEqual(node._locals['clsmethod'][0].type,
+                         'classmethod')
+        self.assertEqual(node._locals['staticmethod_subclass'][0].type,
+                         'staticmethod')
+        self.assertEqual(node._locals['stcmethod'][0].type,
+                         'staticmethod')
+
+    def test_decorator_builtin_descriptors(self):
+        astroid = builder.parse("""
+            def static_decorator(platform=None, order=50):
+                def wrapper(f):
+                    f.cgm_module = True
+                    f.cgm_module_order = order
+                    f.cgm_module_platform = platform
+                    return staticmethod(f)
+                return wrapper
+
+            def long_classmethod_decorator(platform=None, order=50):
+                def wrapper(f):
+                    def wrapper2(f):
+                        def wrapper3(f):
+                            f.cgm_module = True
+                            f.cgm_module_order = order
+                            f.cgm_module_platform = platform
+                            return classmethod(f)
+                        return wrapper3(f)
+                    return wrapper2(f)
+                return wrapper
+
+            def classmethod_decorator(platform=None):
+                def wrapper(f):
+                    f.platform = platform
+                    return classmethod(f)
+                return wrapper
+
+            def classmethod_wrapper(fn):
+                def wrapper(cls, *args, **kwargs):
+                    result = fn(cls, *args, **kwargs)
+                    return result
+
+                return classmethod(wrapper)
+
+            def staticmethod_wrapper(fn):
+                def wrapper(*args, **kwargs):
+                    return fn(*args, **kwargs)
+                return staticmethod(wrapper)
+
+            class SomeClass(object):
+                @static_decorator()
+                def static(node, cfg):
+                    pass
+                @classmethod_decorator()
+                def classmethod(cls):
+                    pass
+                @static_decorator
+                def not_so_static(node):
+                    pass
+                @classmethod_decorator
+                def not_so_classmethod(node):
+                    pass
+                @classmethod_wrapper
+                def classmethod_wrapped(cls):
+                    pass
+                @staticmethod_wrapper
+                def staticmethod_wrapped():
+                    pass
+                @long_classmethod_decorator()
+                def long_classmethod(cls): 
+                    pass
+        """)
+        node = astroid._locals['SomeClass'][0]
+        self.assertEqual(node._locals['static'][0].type,
+                         'staticmethod')
+        self.assertEqual(node._locals['classmethod'][0].type,
+                         'classmethod')
+        self.assertEqual(node._locals['not_so_static'][0].type,
+                         'method')
+        self.assertEqual(node._locals['not_so_classmethod'][0].type,
+                         'method')
+        self.assertEqual(node._locals['classmethod_wrapped'][0].type,
+                         'classmethod')
+        self.assertEqual(node._locals['staticmethod_wrapped'][0].type,
+                         'staticmethod')
+        self.assertEqual(node._locals['long_classmethod'][0].type,
+                         'classmethod')
+
+    def test_igetattr(self):
+        func = test_utils.extract_node('''
+        def test():
+            pass
+        ''')
+        func._instance_attrs['value'] = [nodes.Const(42)]
+        value = func.getattr('value')
+        self.assertEqual(len(value), 1)
+        self.assertIsInstance(value[0], nodes.Const)
+        self.assertEqual(value[0].value, 42)
+        inferred = next(func.igetattr('value'))
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, 42)
+
+
+class ClassNodeTest(ModuleLoader, unittest.TestCase):
+
+    def test_dict_interface(self):
+        _test_dict_interface(self, self.module['YOUPI'], 'method')
+
+    def test_cls_special_attributes_1(self):
+        cls = self.module['YO']
+        self.assertEqual(len(cls.getattr('__bases__')), 1)
+        self.assertEqual(len(cls.getattr('__name__')), 1)
+        self.assertIsInstance(cls.getattr('__name__')[0], nodes.Const)
+        self.assertEqual(cls.getattr('__name__')[0].value, 'YO')
+        self.assertEqual(len(cls.getattr('__doc__')), 1)
+        self.assertIsInstance(cls.getattr('__doc__')[0], nodes.Const)
+        self.assertEqual(cls.getattr('__doc__')[0].value, 'hehe')
+        self.assertEqual(len(cls.getattr('__module__')), 1)
+        self.assertIsInstance(cls.getattr('__module__')[0], nodes.Const)
+        self.assertEqual(cls.getattr('__module__')[0].value, 'data.module')
+        self.assertEqual(len(cls.getattr('__dict__')), 1)
+        if not cls.newstyle:
+            self.assertRaises(NotFoundError, cls.getattr, '__mro__')
+        for cls in (nodes.List._proxied, nodes.Const(1)._proxied):
+            self.assertEqual(len(cls.getattr('__bases__')), 1)
+            self.assertEqual(len(cls.getattr('__name__')), 1)
+            self.assertEqual(len(cls.getattr('__doc__')), 1, (cls, cls.getattr('__doc__')))
+            self.assertEqual(cls.getattr('__doc__')[0].value, cls.doc)
+            self.assertEqual(len(cls.getattr('__module__')), 1)
+            self.assertEqual(len(cls.getattr('__dict__')), 1)
+            self.assertEqual(len(cls.getattr('__mro__')), 1)
+
+    def test__mro__attribute(self):
+        node = test_utils.extract_node('''
+        class A(object): pass
+        class B(object): pass
+        class C(A, B): pass        
+        ''')
+        mro = node.getattr('__mro__')[0]
+        self.assertIsInstance(mro, nodes.Tuple)
+        self.assertEqual(mro.elts, node.mro())
+
+    def test__bases__attribute(self):
+        node = test_utils.extract_node('''
+        class A(object): pass
+        class B(object): pass
+        class C(A, B): pass
+        class D(C): pass
+        ''')
+        bases = node.getattr('__bases__')[0]
+        self.assertIsInstance(bases, nodes.Tuple)
+        self.assertEqual(len(bases.elts), 1)
+        self.assertIsInstance(bases.elts[0], nodes.ClassDef)
+        self.assertEqual(bases.elts[0].name, 'C')
+
+    def test_cls_special_attributes_2(self):
+        astroid = builder.parse('''
+            class A: pass
+            class B: pass
+
+            A.__bases__ += (B,)
+        ''', __name__)
+        self.assertEqual(len(astroid['A'].getattr('__bases__')), 2)
+        self.assertIsInstance(astroid['A'].getattr('__bases__')[0], nodes.Tuple)
+        self.assertIsInstance(astroid['A'].getattr('__bases__')[1], nodes.AssignAttr)
+
+    def test_instance_special_attributes(self):
+        for inst in (Instance(self.module['YO']), nodes.List(), nodes.Const(1)):
+            self.assertRaises(NotFoundError, inst.getattr, '__mro__')
+            self.assertRaises(NotFoundError, inst.getattr, '__bases__')
+            self.assertRaises(NotFoundError, inst.getattr, '__name__')
+            self.assertEqual(len(inst.getattr('__dict__')), 1)
+            self.assertEqual(len(inst.getattr('__doc__')), 1)
+
+    def test_navigation(self):
+        klass = self.module['YO']
+        self.assertEqual(klass.statement(), klass)
+        l_sibling = klass.previous_sibling()
+        self.assertTrue(isinstance(l_sibling, nodes.FunctionDef), l_sibling)
+        self.assertEqual(l_sibling.name, 'global_access')
+        r_sibling = klass.next_sibling()
+        self.assertIsInstance(r_sibling, nodes.ClassDef)
+        self.assertEqual(r_sibling.name, 'YOUPI')
+
+    def test_local_attr_ancestors(self):
+        module = builder.parse('''
+        class A():
+            def __init__(self): pass
+        class B(A): pass
+        class C(B): pass
+        class D(object): pass
+        class F(): pass
+        class E(F, D): pass
+        ''')
+        # Test old-style (Python 2) / new-style (Python 3+) ancestors lookups
+        klass2 = module['C']
+        it = klass2.local_attr_ancestors('__init__')
+        anc_klass = next(it)
+        self.assertIsInstance(anc_klass, nodes.ClassDef)
+        self.assertEqual(anc_klass.name, 'A')
+        if sys.version_info[0] == 2:
+            self.assertRaises(StopIteration, partial(next, it))
+        else:
+            anc_klass = next(it)
+            self.assertIsInstance(anc_klass, nodes.ClassDef)
+            self.assertEqual(anc_klass.name, 'object')
+            self.assertRaises(StopIteration, partial(next, it))
+
+        it = klass2.local_attr_ancestors('method')
+        self.assertRaises(StopIteration, partial(next, it))
+
+        # Test mixed-style ancestor lookups
+        klass2 = module['E']
+        it = klass2.local_attr_ancestors('__init__')
+        anc_klass = next(it)
+        self.assertIsInstance(anc_klass, nodes.ClassDef)
+        self.assertEqual(anc_klass.name, 'object')
+        self.assertRaises(StopIteration, partial(next, it))
+
+    def test_local_attr_mro(self):
+        module = builder.parse('''
+        class A(object):
+            def __init__(self): pass
+        class B(A):
+            def __init__(self, arg, arg2): pass
+        class C(A): pass
+        class D(C, B): pass
+        ''')
+        dclass = module['D']
+        init = dclass.local_attr('__init__')[0]
+        self.assertIsInstance(init, nodes.FunctionDef)
+        self.assertEqual(init.parent.name, 'B')
+
+        cclass = module['C']
+        init = cclass.local_attr('__init__')[0]
+        self.assertIsInstance(init, nodes.FunctionDef)
+        self.assertEqual(init.parent.name, 'A')
+
+        ancestors = list(dclass.local_attr_ancestors('__init__'))
+        self.assertEqual([node.name for node in ancestors], ['B', 'A', 'object'])
+
+    def test_instance_attr_ancestors(self):
+        klass2 = self.module['YOUPI']
+        it = klass2.instance_attr_ancestors('yo')
+        anc_klass = next(it)
+        self.assertIsInstance(anc_klass, nodes.ClassDef)
+        self.assertEqual(anc_klass.name, 'YO')
+        self.assertRaises(StopIteration, partial(next, it))
+        klass2 = self.module['YOUPI']
+        it = klass2.instance_attr_ancestors('member')
+        self.assertRaises(StopIteration, partial(next, it))
+
+    def test_methods(self):
+        expected_methods = {'__init__', 'class_method', 'method', 'static_method'}
+        klass2 = self.module['YOUPI']
+        methods = {m.name for m in klass2.methods()}
+        self.assertTrue(
+            methods.issuperset(expected_methods))
+        methods = {m.name for m in klass2.mymethods()}
+        self.assertSetEqual(expected_methods, methods)
+        klass2 = self.module2['Specialization']
+        methods = {m.name for m in klass2.mymethods()}
+        self.assertSetEqual(set([]), methods)
+        method_locals = klass2.local_attr('method')
+        self.assertEqual(len(method_locals), 1)
+        self.assertEqual(method_locals[0].name, 'method')
+        self.assertRaises(NotFoundError, klass2.local_attr, 'nonexistant')
+        methods = {m.name for m in klass2.methods()}
+        self.assertTrue(methods.issuperset(expected_methods))
+
+    #def test_rhs(self):
+    #    my_dict = self.module['MY_DICT']
+    #    self.assertIsInstance(my_dict.rhs(), nodes.Dict)
+    #    a = self.module['YO']['a']
+    #    value = a.rhs()
+    #    self.assertIsInstance(value, nodes.Const)
+    #    self.assertEqual(value.value, 1)
+
+    @unittest.skipIf(sys.version_info[0] >= 3, "Python 2 class semantics required.")
+    def test_ancestors(self):
+        klass = self.module['YOUPI']
+        self.assertEqual(['YO'], [a.name for a in klass.ancestors()])
+        klass = self.module2['Specialization']
+        self.assertEqual(['YOUPI', 'YO'], [a.name for a in klass.ancestors()])
+
+    @unittest.skipIf(sys.version_info[0] < 3, "Python 3 class semantics required.")
+    def test_ancestors_py3(self):
+        klass = self.module['YOUPI']
+        self.assertEqual(['YO', 'object'], [a.name for a in klass.ancestors()])
+        klass = self.module2['Specialization']
+        self.assertEqual(['YOUPI', 'YO', 'object'], [a.name for a in klass.ancestors()])
+
+    def test_type(self):
+        klass = self.module['YOUPI']
+        self.assertEqual(klass.type, 'class')
+        klass = self.module2['Metaclass']
+        self.assertEqual(klass.type, 'metaclass')
+        klass = self.module2['MyException']
+        self.assertEqual(klass.type, 'exception')
+        klass = self.module2['MyError']
+        self.assertEqual(klass.type, 'exception')
+        # the following class used to be detected as a metaclass
+        # after the fix which used instance._proxied in .ancestors(),
+        # when in fact it is a normal class
+        klass = self.module2['NotMetaclass']
+        self.assertEqual(klass.type, 'class')
+
+    def test_inner_classes(self):
+        eee = self.nonregr['Ccc']['Eee']
+        self.assertEqual([n.name for n in eee.ancestors()], ['Ddd', 'Aaa', 'object'])
+
+
+    def test_classmethod_attributes(self):
+        data = '''
+            class WebAppObject(object):
+                def registered(cls, application):
+                    cls.appli = application
+                    cls.schema = application.schema
+                    cls.config = application.config
+                    return cls
+                registered = classmethod(registered)
+        '''
+        astroid = builder.parse(data, __name__)
+        cls = astroid['WebAppObject']
+        self.assertEqual(sorted(cls._locals.keys()),
+                         ['appli', 'config', 'registered', 'schema'])
+
+    def test_class_getattr(self):
+        data = '''
+            class WebAppObject(object):
+                appli = application
+                appli += 2
+                del self.appli
+        '''
+        astroid = builder.parse(data, __name__)
+        cls = astroid['WebAppObject']
+        # test del statement not returned by getattr
+        self.assertEqual(len(cls.getattr('appli')), 2)
+
+
+    def test_instance_getattr(self):
+        data = '''
+            class WebAppObject(object):
+                def __init__(self, application):
+                    self.appli = application
+                    self.appli += 2
+                    del self.appli
+         '''
+        astroid = builder.parse(data)
+        inst = Instance(astroid['WebAppObject'])
+        # test del statement not returned by getattr
+        self.assertEqual(len(inst.getattr('appli')), 2)
+
+
+    def test_instance_getattr_with_class_attr(self):
+        data = '''
+            class Parent:
+                aa = 1
+                cc = 1
+
+            class Klass(Parent):
+                aa = 0
+                bb = 0
+
+                def incr(self, val):
+                    self.cc = self.aa
+                    if val > self.aa:
+                        val = self.aa
+                    if val < self.bb:
+                        val = self.bb
+                    self.aa += val
+        '''
+        astroid = builder.parse(data)
+        inst = Instance(astroid['Klass'])
+        self.assertEqual(len(inst.getattr('aa')), 3, inst.getattr('aa'))
+        self.assertEqual(len(inst.getattr('bb')), 1, inst.getattr('bb'))
+        self.assertEqual(len(inst.getattr('cc')), 2, inst.getattr('cc'))
+
+
+    def test_getattr_method_transform(self):
+        data = '''
+            class Clazz(object):
+
+                def m1(self, value):
+                    self.value = value
+                m2 = m1
+
+            def func(arg1, arg2):
+                "function that will be used as a method"
+                return arg1.value + arg2
+
+            Clazz.m3 = func
+            inst = Clazz()
+            inst.m4 = func
+        '''
+        astroid = builder.parse(data)
+        cls = astroid['Clazz']
+        # test del statement not returned by getattr
+        for method in ('m1', 'm2', 'm3'):
+            inferred = list(cls.igetattr(method))
+            self.assertEqual(len(inferred), 1)
+            self.assertIsInstance(inferred[0], UnboundMethod)
+            inferred = list(Instance(cls).igetattr(method))
+            self.assertEqual(len(inferred), 1)
+            self.assertIsInstance(inferred[0], BoundMethod)
+        inferred = list(Instance(cls).igetattr('m4'))
+        self.assertEqual(len(inferred), 1)
+        self.assertIsInstance(inferred[0], nodes.FunctionDef)
+
+    def test_getattr_from_grandpa(self):
+        data = '''
+            class Future:
+                attr = 1
+
+            class Present(Future):
+                pass
+
+            class Past(Present):
+                pass
+        '''
+        astroid = builder.parse(data)
+        past = astroid['Past']
+        attr = past.getattr('attr')
+        self.assertEqual(len(attr), 1)
+        attr1 = attr[0]
+        self.assertIsInstance(attr1, nodes.AssignName)
+        self.assertEqual(attr1.name, 'attr')
+
+    def test_function_with_decorator_lineno(self):
+        data = '''
+            @f(a=2,
+               b=3)
+            def g1(x):
+                print(x)
+
+            @f(a=2,
+               b=3)
+            def g2():
+                pass
+        '''
+        astroid = builder.parse(data)
+        self.assertEqual(astroid['g1'].fromlineno, 4)
+        self.assertEqual(astroid['g1'].tolineno, 5)
+        self.assertEqual(astroid['g2'].fromlineno, 9)
+        self.assertEqual(astroid['g2'].tolineno, 10)
+
+    @test_utils.require_version(maxver='3.0')
+    def test_simple_metaclass(self):
+        astroid = builder.parse("""
+            class Test(object):
+                __metaclass__ = type
+        """)
+        klass = astroid['Test']
+        metaclass = klass.metaclass()
+        self.assertIsInstance(metaclass, scoped_nodes.ClassDef)
+        self.assertEqual(metaclass.name, 'type')
+
+    def test_metaclass_error(self):
+        astroid = builder.parse("""
+            class Test(object):
+                __metaclass__ = typ
+        """)
+        klass = astroid['Test']
+        self.assertFalse(klass.metaclass())
+
+    @test_utils.require_version(maxver='3.0')
+    def test_metaclass_imported(self):
+        astroid = builder.parse("""
+            from abc import ABCMeta
+            class Test(object):
+                __metaclass__ = ABCMeta
+        """)
+        klass = astroid['Test']
+
+        metaclass = klass.metaclass()
+        self.assertIsInstance(metaclass, scoped_nodes.ClassDef)
+        self.assertEqual(metaclass.name, 'ABCMeta')
+
+    def test_metaclass_yes_leak(self):
+        astroid = builder.parse("""
+            # notice `ab` instead of `abc`
+            from ab import ABCMeta
+
+            class Meta(object):
+                __metaclass__ = ABCMeta
+        """)
+        klass = astroid['Meta']
+        self.assertIsNone(klass.metaclass())
+
+    @test_utils.require_version(maxver='3.0')
+    def test_newstyle_and_metaclass_good(self):
+        astroid = builder.parse("""
+            from abc import ABCMeta
+            class Test:
+                __metaclass__ = ABCMeta
+        """)
+        klass = astroid['Test']
+        self.assertTrue(klass.newstyle)
+        self.assertEqual(klass.metaclass().name, 'ABCMeta')
+        astroid = builder.parse("""
+            from abc import ABCMeta
+            __metaclass__ = ABCMeta
+            class Test:
+                pass
+        """)
+        klass = astroid['Test']
+        self.assertTrue(klass.newstyle)
+        self.assertEqual(klass.metaclass().name, 'ABCMeta')
+
+    @test_utils.require_version(maxver='3.0')
+    def test_nested_metaclass(self):
+        astroid = builder.parse("""
+            from abc import ABCMeta
+            class A(object):
+                __metaclass__ = ABCMeta
+                class B: pass
+
+            __metaclass__ = ABCMeta
+            class C:
+               __metaclass__ = type
+               class D: pass
+        """)
+        a = astroid['A']
+        b = a._locals['B'][0]
+        c = astroid['C']
+        d = c._locals['D'][0]
+        self.assertEqual(a.metaclass().name, 'ABCMeta')
+        self.assertFalse(b.newstyle)
+        self.assertIsNone(b.metaclass())
+        self.assertEqual(c.metaclass().name, 'type')
+        self.assertEqual(d.metaclass().name, 'ABCMeta')
+
+    @test_utils.require_version(maxver='3.0')
+    def test_parent_metaclass(self):
+        astroid = builder.parse("""
+            from abc import ABCMeta
+            class Test:
+                __metaclass__ = ABCMeta
+            class SubTest(Test): pass
+        """)
+        klass = astroid['SubTest']
+        self.assertTrue(klass.newstyle)
+        metaclass = klass.metaclass()
+        self.assertIsInstance(metaclass, scoped_nodes.ClassDef)
+        self.assertEqual(metaclass.name, 'ABCMeta')
+
+    @test_utils.require_version(maxver='3.0')
+    def test_metaclass_ancestors(self):
+        astroid = builder.parse("""
+            from abc import ABCMeta
+
+            class FirstMeta(object):
+                __metaclass__ = ABCMeta
+
+            class SecondMeta(object):
+                __metaclass__ = type
+
+            class Simple(object):
+                pass
+
+            class FirstImpl(FirstMeta): pass
+            class SecondImpl(FirstImpl): pass
+            class ThirdImpl(Simple, SecondMeta):
+                pass
+        """)
+        classes = {
+            'ABCMeta': ('FirstImpl', 'SecondImpl'),
+            'type': ('ThirdImpl', )
+        }
+        for metaclass, names in classes.items():
+            for name in names:
+                impl = astroid[name]
+                meta = impl.metaclass()
+                self.assertIsInstance(meta, nodes.ClassDef)
+                self.assertEqual(meta.name, metaclass)
+
+    def test_metaclass_type(self):
+        klass = test_utils.extract_node("""
+            def with_metaclass(meta, base=object):
+                return meta("NewBase", (base, ), {})
+
+            class ClassWithMeta(with_metaclass(type)): #@
+                pass
+        """)
+        self.assertEqual(
+            ['NewBase', 'object'],
+            [base.name for base in klass.ancestors()])
+
+    def test_no_infinite_metaclass_loop(self):
+        klass = test_utils.extract_node("""
+            class SSS(object):
+
+                class JJJ(object):
+                    pass
+
+                @classmethod
+                def Init(cls):
+                    cls.JJJ = type('JJJ', (cls.JJJ,), {})
+
+            class AAA(SSS):
+                pass
+
+            class BBB(AAA.JJJ):
+                pass
+        """)
+        self.assertFalse(scoped_nodes._is_metaclass(klass))
+        ancestors = [base.name for base in klass.ancestors()]
+        self.assertIn('object', ancestors)
+        self.assertIn('JJJ', ancestors)
+
+    def test_no_infinite_metaclass_loop_with_redefine(self):
+        nodes = test_utils.extract_node("""
+            import datetime
+
+            class A(datetime.date): #@
+                @classmethod
+                def now(cls):
+                    return cls()
+
+            class B(datetime.date): #@
+                pass
+
+            datetime.date = A
+            datetime.date = B
+        """)
+        for klass in nodes:
+            self.assertEqual(None, klass.metaclass())
+
+    def test_metaclass_generator_hack(self):
+        klass = test_utils.extract_node("""
+            import six
+
+            class WithMeta(six.with_metaclass(type, object)): #@
+                pass
+        """)
+        self.assertEqual(
+            ['object'],
+            [base.name for base in klass.ancestors()])
+        self.assertEqual(
+            'type', klass.metaclass().name)
+
+    def test_using_six_add_metaclass(self):
+        klass = test_utils.extract_node('''
+        import six
+        import abc
+
+        @six.add_metaclass(abc.ABCMeta)
+        class WithMeta(object):
+            pass
+        ''')
+        inferred = next(klass.infer())
+        metaclass = inferred.metaclass()
+        self.assertIsInstance(metaclass, scoped_nodes.ClassDef)
+        self.assertEqual(metaclass.qname(), 'abc.ABCMeta')
+
+    def test_using_invalid_six_add_metaclass_call(self):
+        klass = test_utils.extract_node('''
+        import six
+        @six.add_metaclass()
+        class Invalid(object):
+            pass
+        ''')
+        inferred = next(klass.infer())
+        self.assertIsNone(inferred.metaclass())
+
+    def test_nonregr_infer_callresult(self):
+        astroid = builder.parse("""
+            class Delegate(object):
+                def __get__(self, obj, cls):
+                    return getattr(obj._subject, self.attribute)
+
+            class CompositeBuilder(object):
+                __call__ = Delegate()
+
+            builder = CompositeBuilder(result, composite)
+            tgts = builder()
+        """)
+        instance = astroid['tgts']
+        # used to raise "'_Yes' object is not iterable", see
+        # https://bitbucket.org/logilab/astroid/issue/17
+        self.assertEqual(list(instance.infer()), [util.YES])
+
+    def test_slots(self):
+        astroid = builder.parse("""
+            from collections import deque
+            from textwrap import dedent
+
+            class First(object): #@
+                __slots__ = ("a", "b", 1)
+            class Second(object): #@
+                __slots__ = "a"
+            class Third(object): #@
+                __slots__ = deque(["a", "b", "c"])
+            class Fourth(object): #@
+                __slots__ = {"a": "a", "b": "b"}
+            class Fifth(object): #@
+                __slots__ = list
+            class Sixth(object): #@
+                __slots__ = ""
+            class Seventh(object): #@
+                __slots__ = dedent.__name__
+            class Eight(object): #@
+                __slots__ = ("parens")
+            class Ninth(object): #@
+                pass
+            class Ten(object): #@
+                __slots__ = dict({"a": "b", "c": "d"})
+        """)
+        expected = [
+            ('First', ('a', 'b')),
+            ('Second', ('a', )),
+            ('Third', None),
+            ('Fourth', ('a', 'b')),
+            ('Fifth', None),
+            ('Sixth', None),
+            ('Seventh', ('dedent', )),
+            ('Eight', ('parens', )),
+            ('Ninth', None),
+            ('Ten', ('a', 'c')),
+        ]
+        for cls, expected_value in expected:
+            slots = astroid[cls].slots()
+            if expected_value is None:
+                self.assertIsNone(slots)
+            else:
+                self.assertEqual(list(expected_value),
+                                 [node.value for node in slots])
+
+    @test_utils.require_version(maxver='3.0')
+    def test_slots_py2(self):
+        module = builder.parse("""
+        class UnicodeSlots(object):
+            __slots__ = (u"a", u"b", "c")
+        """)
+        slots = module['UnicodeSlots'].slots()
+        self.assertEqual(len(slots), 3)
+        self.assertEqual(slots[0].value, "a")
+        self.assertEqual(slots[1].value, "b")
+        self.assertEqual(slots[2].value, "c")
+
+    @test_utils.require_version(maxver='3.0')
+    def test_slots_py2_not_implemented(self):
+        module = builder.parse("""
+        class OldStyle:
+            __slots__ = ("a", "b")
+        """)
+        msg = "The concept of slots is undefined for old-style classes."
+        with self.assertRaises(NotImplementedError) as cm:
+            module['OldStyle'].slots()
+        self.assertEqual(str(cm.exception), msg)
+
+    def test_slots_empty_list_of_slots(self):
+        module = builder.parse("""
+        class Klass(object):
+            __slots__ = ()
+        """)
+        cls = module['Klass']
+        self.assertEqual(cls.slots(), [])
+
+    def test_slots_taken_from_parents(self):
+        module = builder.parse('''
+        class FirstParent(object):
+            __slots__ = ('a', 'b', 'c')
+        class SecondParent(FirstParent):
+            __slots__ = ('d', 'e')
+        class Third(SecondParent):
+            __slots__ = ('d', )
+        ''')
+        cls = module['Third']
+        slots = cls.slots()
+        self.assertEqual(sorted(set(slot.value for slot in slots)),
+                         ['a', 'b', 'c', 'd', 'e'])
+
+    def test_all_ancestors_need_slots(self):
+        module = builder.parse('''
+        class A(object):
+            __slots__ = ('a', )
+        class B(A): pass
+        class C(B):
+            __slots__ = ('a', )
+        ''')
+        cls = module['C']
+        self.assertIsNone(cls.slots())
+        cls = module['B']
+        self.assertIsNone(cls.slots())
+
+    def assertEqualMro(self, klass, expected_mro):
+        self.assertEqual(
+            [member.name for member in klass.mro()],
+            expected_mro)
+
+    @test_utils.require_version(maxver='3.0')
+    def test_no_mro_for_old_style(self):
+        node = test_utils.extract_node("""
+        class Old: pass""")
+        with self.assertRaises(NotImplementedError) as cm:
+            node.mro()
+        self.assertEqual(str(cm.exception), "Could not obtain mro for "
+                                            "old-style classes.")
+
+    @test_utils.require_version(maxver='3.0')
+    def test_combined_newstyle_oldstyle_in_mro(self):
+        node = test_utils.extract_node('''
+        class Old:
+            pass
+        class New(object):
+            pass
+        class New1(object):
+            pass
+        class New2(New, New1):
+            pass
+        class NewOld(New2, Old): #@
+            pass
+        ''')
+        self.assertEqualMro(node, ['NewOld', 'New2', 'New', 'New1', 'object', 'Old'])
+        self.assertTrue(node.newstyle)
+
+    def test_with_metaclass_mro(self):
+        astroid = builder.parse("""
+        import six
+
+        class C(object):
+            pass
+        class B(C):
+            pass
+        class A(six.with_metaclass(type, B)):
+            pass
+        """)
+        self.assertEqualMro(astroid['A'], ['A', 'B', 'C', 'object'])
+
+    def test_mro(self):
+        astroid = builder.parse("""
+        class C(object): pass
+        class D(dict, C): pass
+
+        class A1(object): pass
+        class B1(A1): pass
+        class C1(A1): pass
+        class D1(B1, C1): pass
+        class E1(C1, B1): pass
+        class F1(D1, E1): pass
+        class G1(E1, D1): pass
+
+        class Boat(object): pass
+        class DayBoat(Boat): pass
+        class WheelBoat(Boat): pass
+        class EngineLess(DayBoat): pass
+        class SmallMultihull(DayBoat): pass
+        class PedalWheelBoat(EngineLess, WheelBoat): pass
+        class SmallCatamaran(SmallMultihull): pass
+        class Pedalo(PedalWheelBoat, SmallCatamaran): pass
+
+        class OuterA(object):
+            class Inner(object):
+                pass
+        class OuterB(OuterA):
+            class Inner(OuterA.Inner):
+                pass
+        class OuterC(OuterA):
+            class Inner(OuterA.Inner):
+                pass
+        class OuterD(OuterC):
+            class Inner(OuterC.Inner, OuterB.Inner):
+                pass
+        class Duplicates(str, str): pass
+        
+        """)
+        self.assertEqualMro(astroid['D'], ['D', 'dict', 'C', 'object'])
+        self.assertEqualMro(astroid['D1'], ['D1', 'B1', 'C1', 'A1', 'object'])
+        self.assertEqualMro(astroid['E1'], ['E1', 'C1', 'B1', 'A1', 'object'])
+        with self.assertRaises(InconsistentMroError) as cm:
+            astroid['F1'].mro()
+        self.assertEqual(str(cm.exception),
+                         "Cannot create a consistent method resolution order "
+                         "for bases (B1, C1, A1, object), "
+                         "(C1, B1, A1, object)")
+
+        with self.assertRaises(InconsistentMroError) as cm:
+            astroid['G1'].mro()
+        self.assertEqual(str(cm.exception),
+                         "Cannot create a consistent method resolution order "
+                         "for bases (C1, B1, A1, object), "
+                         "(B1, C1, A1, object)")
+
+        self.assertEqualMro(
+            astroid['PedalWheelBoat'],
+            ["PedalWheelBoat", "EngineLess",
+             "DayBoat", "WheelBoat", "Boat", "object"])
+
+        self.assertEqualMro(
+            astroid["SmallCatamaran"],
+            ["SmallCatamaran", "SmallMultihull", "DayBoat", "Boat", "object"])
+
+        self.assertEqualMro(
+            astroid["Pedalo"],
+            ["Pedalo", "PedalWheelBoat", "EngineLess", "SmallCatamaran",
+             "SmallMultihull", "DayBoat", "WheelBoat", "Boat", "object"])
+
+        self.assertEqualMro(
+            astroid['OuterD']['Inner'],
+            ['Inner', 'Inner', 'Inner', 'Inner', 'object'])
+
+        with self.assertRaises(DuplicateBasesError) as cm:
+            astroid['Duplicates'].mro()
+        self.assertEqual(str(cm.exception), "Duplicates found in the mro.")
+        self.assertTrue(issubclass(cm.exception.__class__, MroError))
+        self.assertTrue(issubclass(cm.exception.__class__, ResolveError))
+
+    def test_generator_from_infer_call_result_parent(self):
+        func = test_utils.extract_node("""
+        import contextlib
+
+        @contextlib.contextmanager
+        def test(): #@
+            yield
+        """)
+        result = next(func.infer_call_result(func))
+        self.assertIsInstance(result, Generator)
+        self.assertEqual(result.parent, func)
+
+    def test_type_three_arguments(self):
+        classes = test_utils.extract_node("""
+        type('A', (object, ), {"a": 1, "b": 2, missing: 3}) #@
+        """)
+        first = next(classes.infer())
+        self.assertIsInstance(first, nodes.ClassDef)
+        self.assertEqual(first.name, "A")
+        self.assertEqual(first.basenames, ["object"])
+        self.assertIsInstance(first["a"], nodes.Const)
+        self.assertEqual(first["a"].value, 1)
+        self.assertIsInstance(first["b"], nodes.Const)
+        self.assertEqual(first["b"].value, 2)
+        with self.assertRaises(NotFoundError):
+            first.getattr("missing")
+
+    def test_implicit_metaclass(self):
+        cls = test_utils.extract_node("""
+        class A(object):
+            pass
+        """)
+        type_cls = scoped_nodes.builtin_lookup("type")[1][0]
+        self.assertEqual(cls.implicit_metaclass(), type_cls)
+
+    @test_utils.require_version(maxver='3.0')
+    def test_implicit_metaclass_is_none(self):
+        cls = test_utils.extract_node("""
+        class A: pass
+        """)
+        self.assertIsNone(cls.implicit_metaclass())
+
+    def test_local_attr_invalid_mro(self):
+        cls = test_utils.extract_node("""
+        # A has an invalid MRO, local_attr should fallback
+        # to using .ancestors.
+        class A(object, object):
+            test = 42
+        class B(A): #@
+            pass
+        """)
+        local = cls.local_attr('test')[0]
+        inferred = next(local.infer())
+        self.assertIsInstance(inferred, nodes.Const)
+        self.assertEqual(inferred.value, 42)
+
+    def test_has_dynamic_getattr(self):
+        module = builder.parse("""
+        class Getattr(object):
+            def __getattr__(self, attrname):
+                pass
+
+        class Getattribute(object):
+            def __getattribute__(self, attrname):
+                pass
+
+        class ParentGetattr(Getattr):
+            pass
+        """)
+        self.assertTrue(module['Getattr'].has_dynamic_getattr())
+        self.assertTrue(module['Getattribute'].has_dynamic_getattr())
+        self.assertTrue(module['ParentGetattr'].has_dynamic_getattr())
+
+        # Test that objects analyzed through the live introspection
+        # aren't considered to have dynamic getattr implemented.
+        import datetime
+        astroid_builder = builder.AstroidBuilder()
+        module = astroid_builder.module_build(datetime)
+        self.assertFalse(module['timedelta'].has_dynamic_getattr())
+
+    def test_duplicate_bases_namedtuple(self):
+        module = builder.parse("""
+        import collections
+        _A = collections.namedtuple('A', 'a')
+
+        class A(_A): pass
+
+        class B(A): pass
+        """)
+        self.assertRaises(DuplicateBasesError, module['B'].mro)
+
+    def test_instance_bound_method_lambdas(self):
+        ast_nodes = test_utils.extract_node('''
+        class Test(object): #@
+            lam = lambda self: self
+            not_method = lambda xargs: xargs
+        Test() #@
+        ''')
+        cls = next(ast_nodes[0].infer())
+        self.assertIsInstance(next(cls.igetattr('lam')), scoped_nodes.Lambda)
+        self.assertIsInstance(next(cls.igetattr('not_method')), scoped_nodes.Lambda)
+
+        instance = next(ast_nodes[1].infer())
+        lam = next(instance.igetattr('lam'))
+        self.assertIsInstance(lam, BoundMethod)
+        not_method = next(instance.igetattr('not_method'))
+        self.assertIsInstance(not_method, scoped_nodes.Lambda)
+
+    def test_class_extra_decorators_frame_is_not_class(self):
+        ast_node = test_utils.extract_node('''
+        def ala():
+            def bala(): #@
+                func = 42
+        ''')
+        self.assertEqual(ast_node.extra_decorators, [])
+
+    def test_class_extra_decorators_only_callfunc_are_considered(self):
+        ast_node = test_utils.extract_node('''
+        class Ala(object):
+             def func(self): #@
+                 pass
+             func = 42
+        ''')
+        self.assertEqual(ast_node.extra_decorators, [])
+
+    def test_class_extra_decorators_only_assignment_names_are_considered(self):
+        ast_node = test_utils.extract_node('''
+        class Ala(object):
+             def func(self): #@
+                 pass
+             def __init__(self):
+                 self.func = staticmethod(func)
+
+        ''')
+        self.assertEqual(ast_node.extra_decorators, [])
+
+    def test_class_extra_decorators_only_same_name_considered(self):
+        ast_node = test_utils.extract_node('''
+        class Ala(object):
+             def func(self): #@
+                pass
+             bala = staticmethod(func)
+        ''')
+        self.assertEqual(ast_node.extra_decorators, [])
+        self.assertEqual(ast_node.type, 'method')
+
+    def test_class_extra_decorators(self):
+        static_method, clsmethod = test_utils.extract_node('''
+        class Ala(object):
+             def static(self): #@
+                 pass
+             def class_method(self): #@
+                 pass
+             class_method = classmethod(class_method)
+             static = staticmethod(static)              
+        ''')
+        self.assertEqual(len(clsmethod.extra_decorators), 1)
+        self.assertEqual(clsmethod.type, 'classmethod')
+        self.assertEqual(len(static_method.extra_decorators), 1)
+        self.assertEqual(static_method.type, 'staticmethod')
+
+    def test_extra_decorators_only_class_level_assignments(self):
+        node = test_utils.extract_node('''
+        def _bind(arg):
+            return arg.bind
+
+        class A(object):
+            @property
+            def bind(self):
+                return 42
+            def irelevant(self):
+                # This is important, because it used to trigger
+                # a maximum recursion error.
+                bind = _bind(self)
+                return bind 
+        A() #@
+        ''')
+        inferred = next(node.infer())
+        bind = next(inferred.igetattr('bind'))
+        self.assertIsInstance(bind, nodes.Const)
+        self.assertEqual(bind.value, 42)
+        parent = bind.scope()
+        self.assertEqual(len(parent.extra_decorators), 0)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_raw_building.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_raw_building.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_raw_building.py	(revision 1126)
@@ -0,0 +1,85 @@
+import inspect
+import os
+import unittest
+
+from six.moves import builtins # pylint: disable=import-error
+
+from astroid.builder import AstroidBuilder
+from astroid.raw_building import (
+    attach_dummy_node, build_module,
+    build_class, build_function, build_from_import
+)
+from astroid import test_utils
+from astroid import nodes
+from astroid.bases import BUILTINS
+
+
+class RawBuildingTC(unittest.TestCase):
+
+    def test_attach_dummy_node(self):
+        node = build_module('MyModule')
+        attach_dummy_node(node, 'DummyNode')
+        self.assertEqual(1, len(list(node.get_children())))
+
+    def test_build_module(self):
+        node = build_module('MyModule')
+        self.assertEqual(node.name, 'MyModule')
+        self.assertEqual(node.pure_python, False)
+        self.assertEqual(node.package, False)
+        self.assertEqual(node.parent, None)
+
+    def test_build_class(self):
+        node = build_class('MyClass')
+        self.assertEqual(node.name, 'MyClass')
+        self.assertEqual(node.doc, None)
+
+    def test_build_function(self):
+        node = build_function('MyFunction')
+        self.assertEqual(node.name, 'MyFunction')
+        self.assertEqual(node.doc, None)
+
+    def test_build_function_args(self):
+        args = ['myArgs1', 'myArgs2']
+        node = build_function('MyFunction', args)
+        self.assertEqual('myArgs1', node.args.args[0].name)
+        self.assertEqual('myArgs2', node.args.args[1].name)
+        self.assertEqual(2, len(node.args.args))
+
+    def test_build_function_defaults(self):
+        defaults = ['defaults1', 'defaults2']
+        node = build_function('MyFunction', None, defaults)
+        self.assertEqual(2, len(node.args.defaults))
+
+    def test_build_from_import(self):
+        names = ['exceptions, inference, inspector']
+        node = build_from_import('astroid', names)
+        self.assertEqual(len(names), len(node.names))
+
+    @test_utils.require_version(minver='3.0')
+    def test_io_is__io(self):
+        # _io module calls itself io. This leads
+        # to cyclic dependencies when astroid tries to resolve
+        # what io.BufferedReader is. The code that handles this
+        # is in astroid.raw_building.imported_member, which verifies
+        # the true name of the module.
+        import _io
+
+        builder = AstroidBuilder()
+        module = builder.inspect_build(_io)
+        buffered_reader = module.getattr('BufferedReader')[0]
+        self.assertEqual(buffered_reader.root().name, 'io')
+
+    @unittest.skipUnless(os.name == 'java', 'Requires Jython')
+    def test_open_is_inferred_correctly(self):
+        # Lot of Jython builtins don't have a __module__ attribute.
+        for name, _ in inspect.getmembers(builtins, predicate=inspect.isbuiltin):
+            if name == 'print':
+                continue
+            node = test_utils.extract_node('{0} #@'.format(name))
+            inferred = next(node.infer())
+            self.assertIsInstance(inferred, nodes.FunctionDef, name)
+            self.assertEqual(inferred.root().name, BUILTINS, name)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_nodes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_nodes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_nodes.py	(revision 1126)
@@ -0,0 +1,764 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""tests for specific behaviour of astroid nodes
+"""
+import os
+import sys
+import textwrap
+import unittest
+import warnings
+
+import six
+
+from astroid import bases
+from astroid import builder
+from astroid import context as contextmod
+from astroid import exceptions
+from astroid import node_classes
+from astroid import nodes
+from astroid import parse
+from astroid import util
+from astroid import test_utils
+from astroid import transforms
+from astroid.tests import resources
+
+
+abuilder = builder.AstroidBuilder()
+BUILTINS = six.moves.builtins.__name__
+
+
+class AsStringTest(resources.SysPathSetup, unittest.TestCase):
+
+    def test_tuple_as_string(self):
+        def build(string):
+            return abuilder.string_build(string).body[0].value
+
+        self.assertEqual(build('1,').as_string(), '(1, )')
+        self.assertEqual(build('1, 2, 3').as_string(), '(1, 2, 3)')
+        self.assertEqual(build('(1, )').as_string(), '(1, )')
+        self.assertEqual(build('1, 2, 3').as_string(), '(1, 2, 3)')
+
+    def test_as_string_for_list_containing_uninferable(self):
+        node = test_utils.extract_node('''
+        def foo(arg):
+            bar = [arg] * 1
+        ''')
+        binop = node.body[0].value
+        inferred = next(binop.infer())
+        self.assertEqual(inferred.as_string(), '[Uninferable]')
+        self.assertEqual(binop.as_string(), '([arg]) * (1)')
+
+    def test_frozenset_as_string(self):
+        nodes = test_utils.extract_node('''
+        frozenset((1, 2, 3)) #@
+        frozenset({1, 2, 3}) #@
+        frozenset([1, 2, 3,]) #@
+
+        frozenset(None) #@
+        frozenset(1) #@
+        ''')
+        nodes = [next(node.infer()) for node in nodes]
+
+        self.assertEqual(nodes[0].as_string(), 'frozenset((1, 2, 3))')
+        self.assertEqual(nodes[1].as_string(), 'frozenset({1, 2, 3})')
+        self.assertEqual(nodes[2].as_string(), 'frozenset([1, 2, 3])')
+
+        self.assertNotEqual(nodes[3].as_string(), 'frozenset(None)')
+        self.assertNotEqual(nodes[4].as_string(), 'frozenset(1)')
+
+    @test_utils.require_version(minver='3.0')
+    def test_func_signature_issue_185(self):
+        code = textwrap.dedent('''
+        def test(a, b, c=42, *, x=42, **kwargs):
+            print(a, b, c, args)
+        ''')
+        node = parse(code)
+        self.assertEqual(node.as_string().strip(), code.strip())
+    def test_varargs_kwargs_as_string(self):
+        ast = abuilder.string_build('raise_string(*args, **kwargs)').body[0]
+        self.assertEqual(ast.as_string(), 'raise_string(*args, **kwargs)')
+
+    def test_module_as_string(self):
+        """check as_string on a whole module prepared to be returned identically
+        """
+        module = resources.build_file('data/module.py', 'data.module')
+        with open(resources.find('data/module.py'), 'r') as fobj:
+            self.assertMultiLineEqual(module.as_string(), fobj.read())
+
+    def test_module2_as_string(self):
+        """check as_string on a whole module prepared to be returned identically
+        """
+        module2 = resources.build_file('data/module2.py', 'data.module2')
+        with open(resources.find('data/module2.py'), 'r') as fobj:
+            self.assertMultiLineEqual(module2.as_string(), fobj.read())
+
+    def test_as_string(self):
+        """check as_string for python syntax >= 2.7"""
+        code = '''one_two = {1, 2}
+b = {v: k for (k, v) in enumerate('string')}
+cdd = {k for k in b}\n\n'''
+        ast = abuilder.string_build(code)
+        self.assertMultiLineEqual(ast.as_string(), code)
+
+    @test_utils.require_version('3.0')
+    def test_3k_as_string(self):
+        """check as_string for python 3k syntax"""
+        code = '''print()
+
+def function(var):
+    nonlocal counter
+    try:
+        hello
+    except NameError as nexc:
+        (*hell, o) = b'hello'
+        raise AttributeError from nexc
+\n'''
+        ast = abuilder.string_build(code)
+        self.assertEqual(ast.as_string(), code)
+
+    @test_utils.require_version('3.0')
+    @unittest.expectedFailure
+    def test_3k_annotations_and_metaclass(self):
+        code_annotations = textwrap.dedent('''
+        def function(var:int):
+            nonlocal counter
+
+        class Language(metaclass=Natural):
+            """natural language"""
+        ''')
+
+        ast = abuilder.string_build(code_annotations)
+        self.assertEqual(ast.as_string(), code_annotations)
+
+    def test_ellipsis(self):
+        ast = abuilder.string_build('a[...]').body[0]
+        self.assertEqual(ast.as_string(), 'a[...]')
+
+    def test_slices(self):
+        for code in ('a[0]', 'a[1:3]', 'a[:-1:step]', 'a[:,newaxis]',
+                     'a[newaxis,:]', 'del L[::2]', 'del A[1]', 'del Br[:]'):
+            ast = abuilder.string_build(code).body[0]
+            self.assertEqual(ast.as_string(), code)
+
+    def test_slice_and_subscripts(self):
+        code = """a[:1] = bord[2:]
+a[:1] = bord[2:]
+del bree[3:d]
+bord[2:]
+del av[d::f], a[df:]
+a[:1] = bord[2:]
+del SRC[::1,newaxis,1:]
+tous[vals] = 1010
+del thousand[key]
+del a[::2], a[:-1:step]
+del Fee.form[left:]
+aout.vals = miles.of_stuff
+del (ccok, (name.thing, foo.attrib.value)), Fee.form[left:]
+if all[1] == bord[0:]:
+    pass\n\n"""
+        ast = abuilder.string_build(code)
+        self.assertEqual(ast.as_string(), code)
+
+
+class _NodeTest(unittest.TestCase):
+    """test transformation of If Node"""
+    CODE = None
+
+    @property
+    def astroid(self):
+        try:
+            return self.__class__.__dict__['CODE_Astroid']
+        except KeyError:
+            astroid = builder.parse(self.CODE)
+            self.__class__.CODE_Astroid = astroid
+            return astroid
+
+
+class IfNodeTest(_NodeTest):
+    """test transformation of If Node"""
+    CODE = """
+        if 0:
+            print()
+
+        if True:
+            print()
+        else:
+            pass
+
+        if "":
+            print()
+        elif []:
+            raise
+
+        if 1:
+            print()
+        elif True:
+            print()
+        elif func():
+            pass
+        else:
+            raise
+    """
+
+    def test_if_elif_else_node(self):
+        """test transformation for If node"""
+        self.assertEqual(len(self.astroid.body), 4)
+        for stmt in self.astroid.body:
+            self.assertIsInstance(stmt, nodes.If)
+        self.assertFalse(self.astroid.body[0].orelse)  # simple If
+        self.assertIsInstance(self.astroid.body[1].orelse[0], nodes.Pass)  # If / else
+        self.assertIsInstance(self.astroid.body[2].orelse[0], nodes.If)  # If / elif
+        self.assertIsInstance(self.astroid.body[3].orelse[0].orelse[0], nodes.If)
+
+    def test_block_range(self):
+        # XXX ensure expected values
+        self.assertEqual(self.astroid.block_range(1), (0, 22))
+        self.assertEqual(self.astroid.block_range(10), (0, 22))  # XXX (10, 22) ?
+        self.assertEqual(self.astroid.body[1].block_range(5), (5, 6))
+        self.assertEqual(self.astroid.body[1].block_range(6), (6, 6))
+        self.assertEqual(self.astroid.body[1].orelse[0].block_range(7), (7, 8))
+        self.assertEqual(self.astroid.body[1].orelse[0].block_range(8), (8, 8))
+
+
+class TryExceptNodeTest(_NodeTest):
+    CODE = """
+        try:
+            print ('pouet')
+        except IOError:
+            pass
+        except UnicodeError:
+            print()
+        else:
+            print()
+    """
+
+    def test_block_range(self):
+        # XXX ensure expected values
+        self.assertEqual(self.astroid.body[0].block_range(1), (1, 8))
+        self.assertEqual(self.astroid.body[0].block_range(2), (2, 2))
+        self.assertEqual(self.astroid.body[0].block_range(3), (3, 8))
+        self.assertEqual(self.astroid.body[0].block_range(4), (4, 4))
+        self.assertEqual(self.astroid.body[0].block_range(5), (5, 5))
+        self.assertEqual(self.astroid.body[0].block_range(6), (6, 6))
+        self.assertEqual(self.astroid.body[0].block_range(7), (7, 7))
+        self.assertEqual(self.astroid.body[0].block_range(8), (8, 8))
+
+
+class TryFinallyNodeTest(_NodeTest):
+    CODE = """
+        try:
+            print ('pouet')
+        finally:
+            print ('pouet')
+    """
+
+    def test_block_range(self):
+        # XXX ensure expected values
+        self.assertEqual(self.astroid.body[0].block_range(1), (1, 4))
+        self.assertEqual(self.astroid.body[0].block_range(2), (2, 2))
+        self.assertEqual(self.astroid.body[0].block_range(3), (3, 4))
+        self.assertEqual(self.astroid.body[0].block_range(4), (4, 4))
+
+
+class TryExceptFinallyNodeTest(_NodeTest):
+    CODE = """
+        try:
+            print('pouet')
+        except Exception:
+            print ('oops')
+        finally:
+            print ('pouet')
+    """
+
+    def test_block_range(self):
+        # XXX ensure expected values
+        self.assertEqual(self.astroid.body[0].block_range(1), (1, 6))
+        self.assertEqual(self.astroid.body[0].block_range(2), (2, 2))
+        self.assertEqual(self.astroid.body[0].block_range(3), (3, 4))
+        self.assertEqual(self.astroid.body[0].block_range(4), (4, 4))
+        self.assertEqual(self.astroid.body[0].block_range(5), (5, 5))
+        self.assertEqual(self.astroid.body[0].block_range(6), (6, 6))
+
+
+@unittest.skipIf(six.PY3, "Python 2 specific test.")
+class TryExcept2xNodeTest(_NodeTest):
+    CODE = """
+        try:
+            hello
+        except AttributeError, (retval, desc):
+            pass
+    """
+
+
+    def test_tuple_attribute(self):
+        handler = self.astroid.body[0].handlers[0]
+        self.assertIsInstance(handler.name, nodes.Tuple)
+
+
+class ImportNodeTest(resources.SysPathSetup, unittest.TestCase):
+    def setUp(self):
+        super(ImportNodeTest, self).setUp()
+        self.module = resources.build_file('data/module.py', 'data.module')
+        self.module2 = resources.build_file('data/module2.py', 'data.module2')
+
+    def test_import_self_resolve(self):
+        myos = next(self.module2.igetattr('myos'))
+        self.assertTrue(isinstance(myos, nodes.Module), myos)
+        self.assertEqual(myos.name, 'os')
+        self.assertEqual(myos.qname(), 'os')
+        self.assertEqual(myos.pytype(), '%s.module' % BUILTINS)
+
+    def test_from_self_resolve(self):
+        namenode = next(self.module.igetattr('NameNode'))
+        self.assertTrue(isinstance(namenode, nodes.ClassDef), namenode)
+        self.assertEqual(namenode.root().name, 'astroid.node_classes')
+        self.assertEqual(namenode.qname(), 'astroid.node_classes.Name')
+        self.assertEqual(namenode.pytype(), '%s.type' % BUILTINS)
+        abspath = next(self.module2.igetattr('abspath'))
+        self.assertTrue(isinstance(abspath, nodes.FunctionDef), abspath)
+        self.assertEqual(abspath.root().name, 'os.path')
+        self.assertEqual(abspath.qname(), 'os.path.abspath')
+        self.assertEqual(abspath.pytype(), '%s.function' % BUILTINS)
+
+    def test_real_name(self):
+        from_ = self.module['NameNode']
+        self.assertEqual(from_.real_name('NameNode'), 'Name')
+        imp_ = self.module['os']
+        self.assertEqual(imp_.real_name('os'), 'os')
+        self.assertRaises(exceptions.NotFoundError, imp_.real_name, 'os.path')
+        imp_ = self.module['NameNode']
+        self.assertEqual(imp_.real_name('NameNode'), 'Name')
+        self.assertRaises(exceptions.NotFoundError, imp_.real_name, 'Name')
+        imp_ = self.module2['YO']
+        self.assertEqual(imp_.real_name('YO'), 'YO')
+        self.assertRaises(exceptions.NotFoundError, imp_.real_name, 'data')
+
+    def test_as_string(self):
+        ast = self.module['modutils']
+        self.assertEqual(ast.as_string(), "from astroid import modutils")
+        ast = self.module['NameNode']
+        self.assertEqual(ast.as_string(), "from astroid.node_classes import Name as NameNode")
+        ast = self.module['os']
+        self.assertEqual(ast.as_string(), "import os.path")
+        code = """from . import here
+from .. import door
+from .store import bread
+from ..cave import wine\n\n"""
+        ast = abuilder.string_build(code)
+        self.assertMultiLineEqual(ast.as_string(), code)
+
+    def test_bad_import_inference(self):
+        # Explication of bug
+        '''When we import PickleError from nonexistent, a call to the infer
+        method of this From node will be made by unpack_infer.
+        inference.infer_from will try to import this module, which will fail and
+        raise a InferenceException (by mixins.do_import_module). The infer_name
+        will catch this exception and yield and YES instead.
+        '''
+
+        code = '''
+            try:
+                from pickle import PickleError
+            except ImportError:
+                from nonexistent import PickleError
+
+            try:
+                pass
+            except PickleError:
+                pass
+        '''
+        astroid = builder.parse(code)
+        handler_type = astroid.body[1].handlers[0].type
+
+        excs = list(node_classes.unpack_infer(handler_type))
+        # The number of returned object can differ on Python 2
+        # and Python 3. In one version, an additional item will
+        # be returned, from the _pickle module, which is not
+        # present in the other version.
+        self.assertIsInstance(excs[0], nodes.ClassDef)
+        self.assertEqual(excs[0].name, 'PickleError')
+        self.assertIs(excs[-1], util.YES)
+
+    def test_absolute_import(self):
+        astroid = resources.build_file('data/absimport.py')
+        ctx = contextmod.InferenceContext()
+        # will fail if absolute import failed
+        ctx.lookupname = 'message'
+        next(astroid['message'].infer(ctx))
+        ctx.lookupname = 'email'
+        m = next(astroid['email'].infer(ctx))
+        self.assertFalse(m.source_file.startswith(os.path.join('data', 'email.py')))
+
+    def test_more_absolute_import(self):
+        astroid = resources.build_file('data/module1abs/__init__.py', 'data.module1abs')
+        self.assertIn('sys', astroid._locals)
+
+
+class CmpNodeTest(unittest.TestCase):
+    def test_as_string(self):
+        ast = abuilder.string_build("a == 2").body[0]
+        self.assertEqual(ast.as_string(), "a == 2")
+
+
+class ConstNodeTest(unittest.TestCase):
+
+    def _test(self, value):
+        node = nodes.const_factory(value)
+        self.assertIsInstance(node._proxied, nodes.ClassDef)
+        self.assertEqual(node._proxied.name, value.__class__.__name__)
+        self.assertIs(node.value, value)
+        self.assertTrue(node._proxied.parent)
+        self.assertEqual(node._proxied.root().name, value.__class__.__module__)
+
+    def test_none(self):
+        self._test(None)
+
+    def test_bool(self):
+        self._test(True)
+
+    def test_int(self):
+        self._test(1)
+
+    def test_float(self):
+        self._test(1.0)
+
+    def test_complex(self):
+        self._test(1.0j)
+
+    def test_str(self):
+        self._test('a')
+
+    def test_unicode(self):
+        self._test(u'a')
+
+
+class NameNodeTest(unittest.TestCase):
+    def test_assign_to_True(self):
+        """test that True and False assignements don't crash"""
+        code = """
+            True = False
+            def hello(False):
+                pass
+            del True
+        """
+        if sys.version_info >= (3, 0):
+            with self.assertRaises(exceptions.AstroidBuildingException):
+                builder.parse(code)
+        else:
+            ast = builder.parse(code)
+            assign_true = ast['True']
+            self.assertIsInstance(assign_true, nodes.AssignName)
+            self.assertEqual(assign_true.name, "True")
+            del_true = ast.body[2].targets[0]
+            self.assertIsInstance(del_true, nodes.DelName)
+            self.assertEqual(del_true.name, "True")
+
+
+class ArgumentsNodeTC(unittest.TestCase):
+    def test_linenumbering(self):
+        ast = builder.parse('''
+            def func(a,
+                b): pass
+            x = lambda x: None
+        ''')
+        self.assertEqual(ast['func'].args.fromlineno, 2)
+        self.assertFalse(ast['func'].args.is_statement)
+        xlambda = next(ast['x'].infer())
+        self.assertEqual(xlambda.args.fromlineno, 4)
+        self.assertEqual(xlambda.args.tolineno, 4)
+        self.assertFalse(xlambda.args.is_statement)
+        if sys.version_info < (3, 0):
+            self.assertEqual(ast['func'].args.tolineno, 3)
+        else:
+            self.skipTest('FIXME  http://bugs.python.org/issue10445 '
+                          '(no line number on function args)')
+
+    def test_builtin_fromlineno_missing(self):
+        cls = test_utils.extract_node('''
+        class Foo(Exception): #@
+            pass
+        ''')
+        new = cls.getattr('__new__')[-1]
+        self.assertEqual(new.args.fromlineno, 0)
+
+
+class UnboundMethodNodeTest(unittest.TestCase):
+
+    def test_no_super_getattr(self):
+        # This is a test for issue
+        # https://bitbucket.org/logilab/astroid/issue/91, which tests
+        # that UnboundMethod doesn't call super when doing .getattr.
+
+        ast = builder.parse('''
+        class A(object):
+            def test(self):
+                pass
+        meth = A.test
+        ''')
+        node = next(ast['meth'].infer())
+        with self.assertRaises(exceptions.NotFoundError):
+            node.getattr('__missssing__')
+        name = node.getattr('__name__')[0]
+        self.assertIsInstance(name, nodes.Const)
+        self.assertEqual(name.value, 'test')
+
+
+class BoundMethodNodeTest(unittest.TestCase):
+
+    def test_is_property(self):
+        ast = builder.parse('''
+        import abc
+
+        def cached_property():
+            # Not a real decorator, but we don't care
+            pass
+        def reify():
+            # Same as cached_property
+            pass
+        def lazy_property():
+            pass
+        def lazyproperty():
+            pass
+        def lazy(): pass
+        class A(object):
+            @property
+            def builtin_property(self):
+                return 42
+            @abc.abstractproperty
+            def abc_property(self):
+                return 42
+            @cached_property
+            def cached_property(self): return 42
+            @reify
+            def reified(self): return 42
+            @lazy_property
+            def lazy_prop(self): return 42
+            @lazyproperty
+            def lazyprop(self): return 42
+            def not_prop(self): pass
+            @lazy
+            def decorated_with_lazy(self): return 42
+
+        cls = A()
+        builtin_property = cls.builtin_property
+        abc_property = cls.abc_property
+        cached_p = cls.cached_property
+        reified = cls.reified
+        not_prop = cls.not_prop
+        lazy_prop = cls.lazy_prop
+        lazyprop = cls.lazyprop
+        decorated_with_lazy = cls.decorated_with_lazy
+        ''')
+        for prop in ('builtin_property', 'abc_property', 'cached_p', 'reified',
+                     'lazy_prop', 'lazyprop', 'decorated_with_lazy'):
+            inferred = next(ast[prop].infer())
+            self.assertIsInstance(inferred, nodes.Const, prop)
+            self.assertEqual(inferred.value, 42, prop)
+
+        inferred = next(ast['not_prop'].infer())
+        self.assertIsInstance(inferred, bases.BoundMethod)
+
+
+class AliasesTest(unittest.TestCase):
+
+    def setUp(self):
+        self.transformer = transforms.TransformVisitor()
+
+    def parse_transform(self, code):
+        module = parse(code, apply_transforms=False)
+        return self.transformer.visit(module)
+
+    def test_aliases(self):
+        def test_from(node):
+            node.names = node.names + [('absolute_import', None)]
+            return node
+
+        def test_class(node):
+            node.name = 'Bar'
+            return node
+
+        def test_function(node):
+            node.name = 'another_test'
+            return node
+
+        def test_callfunc(node):
+            if node.func.name == 'Foo':
+                node.func.name = 'Bar'
+                return node
+
+        def test_assname(node):
+            if node.name == 'foo':
+                n = nodes.AssignName()
+                n.name = 'bar'
+                return n
+        def test_assattr(node):
+            if node.attrname == 'a':
+                node.attrname = 'b'
+                return node
+
+        def test_getattr(node):
+            if node.attrname == 'a':
+                node.attrname = 'b'
+                return node
+
+        def test_genexpr(node):
+            if node.elt.value == 1:
+                node.elt = nodes.Const(2)
+                return node
+
+        self.transformer.register_transform(nodes.From, test_from)
+        self.transformer.register_transform(nodes.Class, test_class)
+        self.transformer.register_transform(nodes.Function, test_function)
+        self.transformer.register_transform(nodes.CallFunc, test_callfunc)
+        self.transformer.register_transform(nodes.AssName, test_assname)
+        self.transformer.register_transform(nodes.AssAttr, test_assattr)
+        self.transformer.register_transform(nodes.Getattr, test_getattr)
+        self.transformer.register_transform(nodes.GenExpr, test_genexpr)
+
+        string = '''
+        from __future__ import print_function
+
+        class Foo: pass
+
+        def test(a): return a
+
+        foo = Foo()
+        foo.a = test(42)
+        foo.a
+        (1 for _ in range(0, 42))
+        '''
+
+        module = self.parse_transform(string)
+
+        self.assertEqual(len(module.body[0].names), 2)
+        self.assertIsInstance(module.body[0], nodes.ImportFrom)
+        self.assertEqual(module.body[1].name, 'Bar')
+        self.assertIsInstance(module.body[1], nodes.ClassDef)
+        self.assertEqual(module.body[2].name, 'another_test')
+        self.assertIsInstance(module.body[2], nodes.FunctionDef)
+        self.assertEqual(module.body[3].targets[0].name, 'bar')
+        self.assertIsInstance(module.body[3].targets[0], nodes.AssignName)
+        self.assertEqual(module.body[3].value.func.name, 'Bar')
+        self.assertIsInstance(module.body[3].value, nodes.Call)
+        self.assertEqual(module.body[4].targets[0].attrname, 'b')
+        self.assertIsInstance(module.body[4].targets[0], nodes.AssignAttr)
+        self.assertIsInstance(module.body[5], nodes.Expr)
+        self.assertEqual(module.body[5].value.attrname, 'b')
+        self.assertIsInstance(module.body[5].value, nodes.Attribute)
+        self.assertEqual(module.body[6].value.elt.value, 2)
+        self.assertIsInstance(module.body[6].value, nodes.GeneratorExp)
+
+    @unittest.skipIf(six.PY3, "Python 3 doesn't have Repr nodes.")
+    def test_repr(self):
+        def test_backquote(node):
+            node.value.name = 'bar'
+            return node
+
+        self.transformer.register_transform(nodes.Backquote, test_backquote)
+
+        module = self.parse_transform('`foo`')
+
+        self.assertEqual(module.body[0].value.value.name, 'bar')
+        self.assertIsInstance(module.body[0].value, nodes.Repr)
+
+
+class DeprecationWarningsTest(unittest.TestCase):
+    def test_asstype_warnings(self):
+        string = '''
+        class C: pass
+        c = C()
+        with warnings.catch_warnings(record=True) as w:
+            pass
+        '''
+        module = parse(string)
+        filter_stmts_mixin = module.body[0]
+        assign_type_mixin = module.body[1].targets[0]
+        parent_assign_type_mixin = module.body[2]
+
+        warnings.simplefilter('always')
+
+        with warnings.catch_warnings(record=True) as w:
+            filter_stmts_mixin.ass_type()
+            self.assertIsInstance(w[0].message, PendingDeprecationWarning)
+        with warnings.catch_warnings(record=True) as w:
+            assign_type_mixin.ass_type()
+            self.assertIsInstance(w[0].message, PendingDeprecationWarning)
+        with warnings.catch_warnings(record=True) as w:
+            parent_assign_type_mixin.ass_type()
+            self.assertIsInstance(w[0].message, PendingDeprecationWarning)
+
+    def test_isinstance_warnings(self):
+        msg_format = ("%r is deprecated and slated for removal in astroid "
+                      "2.0, use %r instead")
+        for cls in (nodes.Discard, nodes.Backquote, nodes.AssName,
+                    nodes.AssAttr, nodes.Getattr, nodes.CallFunc, nodes.From):
+            with warnings.catch_warnings(record=True) as w:
+                warnings.simplefilter('always')
+                isinstance(42, cls)
+            self.assertIsInstance(w[0].message, PendingDeprecationWarning)
+            actual_msg = msg_format % (cls.__class__.__name__, cls.__wrapped__.__name__)
+            self.assertEqual(str(w[0].message), actual_msg)
+
+
+@test_utils.require_version('3.5')
+class Python35AsyncTest(unittest.TestCase):
+
+    def test_async_await_keywords(self):
+        async_def, async_for, async_with, await_node = test_utils.extract_node('''
+        async def func(): #@
+            async for i in range(10): #@
+                f = __(await i)
+            async with test(): #@
+                pass
+        ''')
+        self.assertIsInstance(async_def, nodes.AsyncFunctionDef)
+        self.assertIsInstance(async_for, nodes.AsyncFor)
+        self.assertIsInstance(async_with, nodes.AsyncWith)
+        self.assertIsInstance(await_node, nodes.Await)
+        self.assertIsInstance(await_node.value, nodes.Name)
+
+    def _test_await_async_as_string(self, code):
+        ast_node = parse(code)
+        self.assertEqual(ast_node.as_string().strip(), code.strip())
+
+    def test_await_as_string(self):
+        code = textwrap.dedent('''
+        async def function():
+            await 42
+        ''')
+        self._test_await_async_as_string(code)
+
+    def test_asyncwith_as_string(self):
+        code = textwrap.dedent('''
+        async def function():
+            async with (42):
+                pass
+        ''')
+        self._test_await_async_as_string(code)
+
+    def test_asyncfor_as_string(self):
+        code = textwrap.dedent('''
+        async def function():
+            async for i in range(10):
+                await 42
+        ''')
+        self._test_await_async_as_string(code)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_lookup.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_lookup.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_lookup.py	(revision 1126)
@@ -0,0 +1,352 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""tests for the astroid variable lookup capabilities
+"""
+import functools
+import sys
+import unittest
+
+from astroid import builder
+from astroid import exceptions
+from astroid import nodes
+from astroid import scoped_nodes
+from astroid import test_utils
+from astroid import util
+from astroid.tests import resources
+
+
+class LookupTest(resources.SysPathSetup, unittest.TestCase):
+
+    def setUp(self):
+        super(LookupTest, self).setUp()
+        self.module = resources.build_file('data/module.py', 'data.module')
+        self.module2 = resources.build_file('data/module2.py', 'data.module2')
+        self.nonregr = resources.build_file('data/nonregr.py', 'data.nonregr')
+
+    def test_limit(self):
+        code = '''
+            l = [a
+                 for a,b in list]
+
+            a = 1
+            b = a
+            a = None
+
+            def func():
+                c = 1
+        '''
+        astroid = builder.parse(code, __name__)
+        # a & b
+        a = next(astroid.nodes_of_class(nodes.Name))
+        self.assertEqual(a.lineno, 2)
+        if sys.version_info < (3, 0):
+            self.assertEqual(len(astroid.lookup('b')[1]), 1)
+            self.assertEqual(len(astroid.lookup('a')[1]), 1)
+            b = astroid._locals['b'][1]
+        else:
+            self.assertEqual(len(astroid.lookup('b')[1]), 1)
+            self.assertEqual(len(astroid.lookup('a')[1]), 1)
+            b = astroid._locals['b'][0]
+
+        stmts = a.lookup('a')[1]
+        self.assertEqual(len(stmts), 1)
+        self.assertEqual(b.lineno, 6)
+        b_infer = b.infer()
+        b_value = next(b_infer)
+        self.assertEqual(b_value.value, 1)
+        # c
+        self.assertRaises(StopIteration, functools.partial(next, b_infer))
+        func = astroid._locals['func'][0]
+        self.assertEqual(len(func.lookup('c')[1]), 1)
+
+    def test_module(self):
+        astroid = builder.parse('pass', __name__)
+        # built-in objects
+        none = next(astroid.ilookup('None'))
+        self.assertIsNone(none.value)
+        obj = next(astroid.ilookup('object'))
+        self.assertIsInstance(obj, nodes.ClassDef)
+        self.assertEqual(obj.name, 'object')
+        self.assertRaises(exceptions.InferenceError,
+                          functools.partial(next, astroid.ilookup('YOAA')))
+
+        # XXX
+        self.assertEqual(len(list(self.nonregr.ilookup('enumerate'))), 2)
+
+    def test_class_ancestor_name(self):
+        code = '''
+            class A:
+                pass
+
+            class A(A):
+                pass
+        '''
+        astroid = builder.parse(code, __name__)
+        cls1 = astroid._locals['A'][0]
+        cls2 = astroid._locals['A'][1]
+        name = next(cls2.nodes_of_class(nodes.Name))
+        self.assertEqual(next(name.infer()), cls1)
+
+    ### backport those test to inline code
+    def test_method(self):
+        method = self.module['YOUPI']['method']
+        my_dict = next(method.ilookup('MY_DICT'))
+        self.assertTrue(isinstance(my_dict, nodes.Dict), my_dict)
+        none = next(method.ilookup('None'))
+        self.assertIsNone(none.value)
+        self.assertRaises(exceptions.InferenceError,
+                          functools.partial(next, method.ilookup('YOAA')))
+
+    def test_function_argument_with_default(self):
+        make_class = self.module2['make_class']
+        base = next(make_class.ilookup('base'))
+        self.assertTrue(isinstance(base, nodes.ClassDef), base.__class__)
+        self.assertEqual(base.name, 'YO')
+        self.assertEqual(base.root().name, 'data.module')
+
+    def test_class(self):
+        klass = self.module['YOUPI']
+        my_dict = next(klass.ilookup('MY_DICT'))
+        self.assertIsInstance(my_dict, nodes.Dict)
+        none = next(klass.ilookup('None'))
+        self.assertIsNone(none.value)
+        obj = next(klass.ilookup('object'))
+        self.assertIsInstance(obj, nodes.ClassDef)
+        self.assertEqual(obj.name, 'object')
+        self.assertRaises(exceptions.InferenceError,
+                          functools.partial(next, klass.ilookup('YOAA')))
+
+    def test_inner_classes(self):
+        ddd = list(self.nonregr['Ccc'].ilookup('Ddd'))
+        self.assertEqual(ddd[0].name, 'Ddd')
+
+    def test_loopvar_hiding(self):
+        astroid = builder.parse("""
+            x = 10
+            for x in range(5):
+                print (x)
+
+            if x > 0:
+                print ('#' * x)
+        """, __name__)
+        xnames = [n for n in astroid.nodes_of_class(nodes.Name) if n.name == 'x']
+        # inside the loop, only one possible assignment
+        self.assertEqual(len(xnames[0].lookup('x')[1]), 1)
+        # outside the loop, two possible assignments
+        self.assertEqual(len(xnames[1].lookup('x')[1]), 2)
+        self.assertEqual(len(xnames[2].lookup('x')[1]), 2)
+
+    def test_list_comps(self):
+        astroid = builder.parse("""
+            print ([ i for i in range(10) ])
+            print ([ i for i in range(10) ])
+            print ( list( i for i in range(10) ) )
+        """, __name__)
+        xnames = [n for n in astroid.nodes_of_class(nodes.Name) if n.name == 'i']
+        self.assertEqual(len(xnames[0].lookup('i')[1]), 1)
+        self.assertEqual(xnames[0].lookup('i')[1][0].lineno, 2)
+        self.assertEqual(len(xnames[1].lookup('i')[1]), 1)
+        self.assertEqual(xnames[1].lookup('i')[1][0].lineno, 3)
+        self.assertEqual(len(xnames[2].lookup('i')[1]), 1)
+        self.assertEqual(xnames[2].lookup('i')[1][0].lineno, 4)
+
+    def test_list_comp_target(self):
+        """test the list comprehension target"""
+        astroid = builder.parse("""
+            ten = [ var for var in range(10) ]
+            var
+        """)
+        var = astroid.body[1].value
+        if sys.version_info < (3, 0):
+            self.assertEqual(var.inferred(), [util.YES])
+        else:
+            self.assertRaises(exceptions.UnresolvableName, var.inferred)
+
+    def test_dict_comps(self):
+        astroid = builder.parse("""
+            print ({ i: j for i in range(10) for j in range(10) })
+            print ({ i: j for i in range(10) for j in range(10) })
+        """, __name__)
+        xnames = [n for n in astroid.nodes_of_class(nodes.Name) if n.name == 'i']
+        self.assertEqual(len(xnames[0].lookup('i')[1]), 1)
+        self.assertEqual(xnames[0].lookup('i')[1][0].lineno, 2)
+        self.assertEqual(len(xnames[1].lookup('i')[1]), 1)
+        self.assertEqual(xnames[1].lookup('i')[1][0].lineno, 3)
+
+        xnames = [n for n in astroid.nodes_of_class(nodes.Name) if n.name == 'j']
+        self.assertEqual(len(xnames[0].lookup('i')[1]), 1)
+        self.assertEqual(xnames[0].lookup('i')[1][0].lineno, 2)
+        self.assertEqual(len(xnames[1].lookup('i')[1]), 1)
+        self.assertEqual(xnames[1].lookup('i')[1][0].lineno, 3)
+
+    def test_set_comps(self):
+        astroid = builder.parse("""
+            print ({ i for i in range(10) })
+            print ({ i for i in range(10) })
+        """, __name__)
+        xnames = [n for n in astroid.nodes_of_class(nodes.Name) if n.name == 'i']
+        self.assertEqual(len(xnames[0].lookup('i')[1]), 1)
+        self.assertEqual(xnames[0].lookup('i')[1][0].lineno, 2)
+        self.assertEqual(len(xnames[1].lookup('i')[1]), 1)
+        self.assertEqual(xnames[1].lookup('i')[1][0].lineno, 3)
+
+    def test_set_comp_closure(self):
+        astroid = builder.parse("""
+            ten = { var for var in range(10) }
+            var
+        """)
+        var = astroid.body[1].value
+        self.assertRaises(exceptions.UnresolvableName, var.inferred)
+
+    def test_generator_attributes(self):
+        tree = builder.parse("""
+            def count():
+                "test"
+                yield 0
+
+            iterer = count()
+            num = iterer.next()
+        """)
+        next_node = tree.body[2].value.func
+        gener = next_node.expr.inferred()[0]
+        if sys.version_info < (3, 0):
+            self.assertIsInstance(gener.getattr('next')[0], nodes.FunctionDef)
+        else:
+            self.assertIsInstance(gener.getattr('__next__')[0], nodes.FunctionDef)
+        self.assertIsInstance(gener.getattr('send')[0], nodes.FunctionDef)
+        self.assertIsInstance(gener.getattr('throw')[0], nodes.FunctionDef)
+        self.assertIsInstance(gener.getattr('close')[0], nodes.FunctionDef)
+
+    def test_explicit___name__(self):
+        code = '''
+            class Pouet:
+                __name__ = "pouet"
+            p1 = Pouet()
+
+            class PouetPouet(Pouet): pass
+            p2 = Pouet()
+
+            class NoName: pass
+            p3 = NoName()
+        '''
+        astroid = builder.parse(code, __name__)
+        p1 = next(astroid['p1'].infer())
+        self.assertTrue(p1.getattr('__name__'))
+        p2 = next(astroid['p2'].infer())
+        self.assertTrue(p2.getattr('__name__'))
+        self.assertTrue(astroid['NoName'].getattr('__name__'))
+        p3 = next(astroid['p3'].infer())
+        self.assertRaises(exceptions.NotFoundError, p3.getattr, '__name__')
+
+    def test_function_module_special(self):
+        astroid = builder.parse('''
+        def initialize(linter):
+            """initialize linter with checkers in this package """
+            package_load(linter, __path__[0])
+        ''', 'data.__init__')
+        path = [n for n in astroid.nodes_of_class(nodes.Name) if n.name == '__path__'][0]
+        self.assertEqual(len(path.lookup('__path__')[1]), 1)
+
+    def test_builtin_lookup(self):
+        self.assertEqual(scoped_nodes.builtin_lookup('__dict__')[1], ())
+        intstmts = scoped_nodes.builtin_lookup('int')[1]
+        self.assertEqual(len(intstmts), 1)
+        self.assertIsInstance(intstmts[0], nodes.ClassDef)
+        self.assertEqual(intstmts[0].name, 'int')
+        self.assertIs(intstmts[0], nodes.const_factory(1)._proxied)
+
+    def test_decorator_arguments_lookup(self):
+        code = '''
+            def decorator(value):
+                def wrapper(function):
+                    return function
+                return wrapper
+
+            class foo:
+                member = 10  #@
+
+                @decorator(member) #This will cause pylint to complain
+                def test(self):
+                    pass
+        '''
+        member = test_utils.extract_node(code, __name__).targets[0]
+        it = member.infer()
+        obj = next(it)
+        self.assertIsInstance(obj, nodes.Const)
+        self.assertEqual(obj.value, 10)
+        self.assertRaises(StopIteration, functools.partial(next, it))
+
+    def test_inner_decorator_member_lookup(self):
+        code = '''
+            class FileA:
+                def decorator(bla):
+                    return bla
+
+                @__(decorator)
+                def funcA():
+                    return 4
+        '''
+        decname = test_utils.extract_node(code, __name__)
+        it = decname.infer()
+        obj = next(it)
+        self.assertIsInstance(obj, nodes.FunctionDef)
+        self.assertRaises(StopIteration, functools.partial(next, it))
+
+    def test_static_method_lookup(self):
+        code = '''
+            class FileA:
+                @staticmethod
+                def funcA():
+                    return 4
+
+
+            class Test:
+                FileA = [1,2,3]
+
+                def __init__(self):
+                    print (FileA.funcA())
+        '''
+        astroid = builder.parse(code, __name__)
+        it = astroid['Test']['__init__'].ilookup('FileA')
+        obj = next(it)
+        self.assertIsInstance(obj, nodes.ClassDef)
+        self.assertRaises(StopIteration, functools.partial(next, it))
+
+    def test_global_delete(self):
+        code = '''
+            def run2():
+                f = Frobble()
+
+            class Frobble:
+                pass
+            Frobble.mumble = True
+
+            del Frobble
+
+            def run1():
+                f = Frobble()
+        '''
+        astroid = builder.parse(code, __name__)
+        stmts = astroid['run2'].lookup('Frobbel')[1]
+        self.assertEqual(len(stmts), 0)
+        stmts = astroid['run1'].lookup('Frobbel')[1]
+        self.assertEqual(len(stmts), 0)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_manager.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_manager.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/unittest_manager.py	(revision 1126)
@@ -0,0 +1,216 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+import os
+import platform
+import sys
+import unittest
+
+import six
+
+from astroid import exceptions
+from astroid import manager
+from astroid.tests import resources
+
+
+BUILTINS = six.moves.builtins.__name__
+
+
+def _get_file_from_object(obj):
+    if platform.python_implementation() == 'Jython':
+        return obj.__file__.split("$py.class")[0] + ".py"
+    if sys.version_info > (3, 0):
+        return obj.__file__
+    if not obj.__file__.endswith(".py"):
+        return obj.__file__[:-1]
+    return obj.__file__
+
+
+class AstroidManagerTest(resources.SysPathSetup,
+                         resources.AstroidCacheSetupMixin,
+                         unittest.TestCase):
+
+    def setUp(self):
+        super(AstroidManagerTest, self).setUp()
+        self.manager = manager.AstroidManager()
+        self.manager.clear_cache(self._builtins) # take care of borg
+
+    def test_ast_from_file(self):
+        filepath = unittest.__file__
+        astroid = self.manager.ast_from_file(filepath)
+        self.assertEqual(astroid.name, 'unittest')
+        self.assertIn('unittest', self.manager.astroid_cache)
+
+    def test_ast_from_file_cache(self):
+        filepath = unittest.__file__
+        self.manager.ast_from_file(filepath)
+        astroid = self.manager.ast_from_file('unhandledName', 'unittest')
+        self.assertEqual(astroid.name, 'unittest')
+        self.assertIn('unittest', self.manager.astroid_cache)
+
+    def test_ast_from_file_astro_builder(self):
+        filepath = unittest.__file__
+        astroid = self.manager.ast_from_file(filepath, None, True, True)
+        self.assertEqual(astroid.name, 'unittest')
+        self.assertIn('unittest', self.manager.astroid_cache)
+
+    def test_ast_from_file_name_astro_builder_exception(self):
+        self.assertRaises(exceptions.AstroidBuildingException,
+                          self.manager.ast_from_file, 'unhandledName')
+
+    def test_do_not_expose_main(self):
+        obj = self.manager.ast_from_module_name('__main__')
+        self.assertEqual(obj.name, '__main__')
+        self.assertEqual(obj.items(), [])
+
+    def test_ast_from_module_name(self):
+        astroid = self.manager.ast_from_module_name('unittest')
+        self.assertEqual(astroid.name, 'unittest')
+        self.assertIn('unittest', self.manager.astroid_cache)
+
+    def test_ast_from_module_name_not_python_source(self):
+        astroid = self.manager.ast_from_module_name('time')
+        self.assertEqual(astroid.name, 'time')
+        self.assertIn('time', self.manager.astroid_cache)
+        self.assertEqual(astroid.pure_python, False)
+
+    def test_ast_from_module_name_astro_builder_exception(self):
+        self.assertRaises(exceptions.AstroidBuildingException,
+                          self.manager.ast_from_module_name,
+                          'unhandledModule')
+
+    def _test_ast_from_zip(self, archive):
+        origpath = sys.path[:]
+        sys.modules.pop('mypypa', None)
+        archive_path = resources.find(archive)
+        sys.path.insert(0, archive_path)
+        try:
+            module = self.manager.ast_from_module_name('mypypa')
+            self.assertEqual(module.name, 'mypypa')
+            end = os.path.join(archive, 'mypypa')
+            self.assertTrue(module.source_file.endswith(end),
+                            "%s doesn't endswith %s" % (module.source_file, end))
+        finally:
+            # remove the module, else after importing egg, we don't get the zip
+            if 'mypypa' in self.manager.astroid_cache:
+                del self.manager.astroid_cache['mypypa']
+                del self.manager._mod_file_cache[('mypypa', None)]
+            if archive_path in sys.path_importer_cache:
+                del sys.path_importer_cache[archive_path]
+            sys.path = origpath
+
+    def test_ast_from_module_name_egg(self):
+        self._test_ast_from_zip(
+            os.path.sep.join(['data', os.path.normcase('MyPyPa-0.1.0-py2.5.egg')])
+        )
+
+    def test_ast_from_module_name_zip(self):
+        self._test_ast_from_zip(
+            os.path.sep.join(['data', os.path.normcase('MyPyPa-0.1.0-py2.5.zip')])
+        )
+
+    def test_zip_import_data(self):
+        """check if zip_import_data works"""
+        filepath = resources.find('data/MyPyPa-0.1.0-py2.5.zip/mypypa')
+        astroid = self.manager.zip_import_data(filepath)
+        self.assertEqual(astroid.name, 'mypypa')
+
+    def test_zip_import_data_without_zipimport(self):
+        """check if zip_import_data return None without zipimport"""
+        self.assertEqual(self.manager.zip_import_data('path'), None)
+
+    def test_file_from_module(self):
+        """check if the unittest filepath is equals to the result of the method"""
+        self.assertEqual(
+            _get_file_from_object(unittest),
+            self.manager.file_from_module_name('unittest', None)[0])
+
+    def test_file_from_module_name_astro_building_exception(self):
+        """check if the method launch a exception with a wrong module name"""
+        self.assertRaises(exceptions.AstroidBuildingException,
+                          self.manager.file_from_module_name, 'unhandledModule', None)
+
+    def test_ast_from_module(self):
+        astroid = self.manager.ast_from_module(unittest)
+        self.assertEqual(astroid.pure_python, True)
+        import time
+        astroid = self.manager.ast_from_module(time)
+        self.assertEqual(astroid.pure_python, False)
+
+    def test_ast_from_module_cache(self):
+        """check if the module is in the cache manager"""
+        astroid = self.manager.ast_from_module(unittest)
+        self.assertEqual(astroid.name, 'unittest')
+        self.assertIn('unittest', self.manager.astroid_cache)
+
+    def test_ast_from_class(self):
+        astroid = self.manager.ast_from_class(int)
+        self.assertEqual(astroid.name, 'int')
+        self.assertEqual(astroid.parent.frame().name, BUILTINS)
+
+        astroid = self.manager.ast_from_class(object)
+        self.assertEqual(astroid.name, 'object')
+        self.assertEqual(astroid.parent.frame().name, BUILTINS)
+        self.assertIn('__setattr__', astroid)
+
+    def test_ast_from_class_with_module(self):
+        """check if the method works with the module name"""
+        astroid = self.manager.ast_from_class(int, int.__module__)
+        self.assertEqual(astroid.name, 'int')
+        self.assertEqual(astroid.parent.frame().name, BUILTINS)
+
+        astroid = self.manager.ast_from_class(object, object.__module__)
+        self.assertEqual(astroid.name, 'object')
+        self.assertEqual(astroid.parent.frame().name, BUILTINS)
+        self.assertIn('__setattr__', astroid)
+
+    def test_ast_from_class_attr_error(self):
+        """give a wrong class at the ast_from_class method"""
+        self.assertRaises(exceptions.AstroidBuildingException,
+                          self.manager.ast_from_class, None)
+
+    def testFailedImportHooks(self):
+        def hook(modname):
+            if modname == 'foo.bar':
+                return unittest
+            else:
+                raise exceptions.AstroidBuildingException()
+
+        with self.assertRaises(exceptions.AstroidBuildingException):
+            self.manager.ast_from_module_name('foo.bar')
+        self.manager.register_failed_import_hook(hook)
+        self.assertEqual(unittest, self.manager.ast_from_module_name('foo.bar'))
+        with self.assertRaises(exceptions.AstroidBuildingException):
+            self.manager.ast_from_module_name('foo.bar.baz')
+        del self.manager._failed_import_hooks[0]
+
+
+class BorgAstroidManagerTC(unittest.TestCase):
+
+    def test_borg(self):
+        """test that the AstroidManager is really a borg, i.e. that two different
+        instances has same cache"""
+        first_manager = manager.AstroidManager()
+        built = first_manager.ast_from_module_name(BUILTINS)
+
+        second_manager = manager.AstroidManager()
+        second_built = second_manager.ast_from_module_name(BUILTINS)
+        self.assertIs(built, second_built)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/resources.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/resources.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/tests/resources.py	(revision 1126)
@@ -0,0 +1,72 @@
+# Copyright 2014 Google, Inc. All rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+import os
+import sys
+
+import pkg_resources
+
+from astroid import builder
+from astroid import MANAGER
+from astroid.bases import  BUILTINS
+
+
+DATA_DIR = 'testdata/python{}/'.format(sys.version_info[0])
+
+def find(name):
+    return pkg_resources.resource_filename(
+        'astroid.tests', os.path.normpath(os.path.join(DATA_DIR, name)))
+
+
+def build_file(path, modname=None):
+    return builder.AstroidBuilder().file_build(find(path), modname)
+
+
+class SysPathSetup(object):
+    def setUp(self):
+        sys.path.insert(0, find(''))
+
+    def tearDown(self):
+        del sys.path[0]
+        datadir = find('')
+        for key in list(sys.path_importer_cache):
+            if key.startswith(datadir):
+                del sys.path_importer_cache[key]
+
+
+class AstroidCacheSetupMixin(object):
+    """Mixin for handling the astroid cache problems.
+
+    When clearing the astroid cache, some tests fails due to
+    cache inconsistencies, where some objects had a different
+    builtins object referenced.
+    This saves the builtins module and makes sure to add it
+    back to the astroid_cache after the tests finishes.
+    The builtins module is special, since some of the
+    transforms for a couple of its objects (str, bytes etc)
+    are executed only once, so astroid_bootstrapping will be
+    useless for retrieving the original builtins module.
+    """
+
+    @classmethod
+    def setUpClass(cls):
+        cls._builtins = MANAGER.astroid_cache.get(BUILTINS)
+
+    @classmethod
+    def tearDownClass(cls):
+        if cls._builtins:
+            MANAGER.astroid_cache[BUILTINS] = cls._builtins
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/util.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/util.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/util.py	(revision 1126)
@@ -0,0 +1,89 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+#
+# The code in this file was originally part of logilab-common, licensed under
+# the same license.
+import warnings
+
+from astroid import exceptions
+
+
+def generate_warning(message, warning):
+    return lambda *args: warnings.warn(message % args, warning, stacklevel=3)
+
+rename_warning = generate_warning(
+    "%r is deprecated and will be removed in astroid %.1f, use %r instead",
+    PendingDeprecationWarning)
+
+attribute_to_method_warning = generate_warning(
+    "%s is deprecated and will be removed in astroid %.1f, use the "
+    "method '%s()' instead.", PendingDeprecationWarning)
+
+attribute_to_function_warning = generate_warning(
+    "%s is deprecated and will be removed in astroid %.1f, use the "
+    "function '%s()' instead.", PendingDeprecationWarning)
+
+method_to_function_warning = generate_warning(
+    "%s() is deprecated and will be removed in astroid %.1f, use the "
+    "function '%s()' instead.", PendingDeprecationWarning)
+
+
+class _Yes(object):
+    """Special inference object, which is returned when inference fails."""
+    def __repr__(self):
+        return 'YES'
+
+    __str__ = __repr__
+
+    def __getattribute__(self, name):
+        if name == 'next':
+            raise AttributeError('next method should not be called')
+        if name.startswith('__') and name.endswith('__'):
+            return super(_Yes, self).__getattribute__(name)
+        if name == 'accept':
+            return super(_Yes, self).__getattribute__(name)
+        return self
+
+    def __call__(self, *args, **kwargs):
+        return self
+
+    def accept(self, visitor):
+        func = getattr(visitor, "visit_yes")
+        return func(self)
+
+
+YES = _Yes()
+
+def safe_infer(node, context=None):
+    """Return the inferred value for the given node.
+
+    Return None if inference failed or if there is some ambiguity (more than
+    one node has been inferred).
+    """
+    try:
+        inferit = node.infer(context=context)
+        value = next(inferit)
+    except exceptions.InferenceError:
+        return
+    try:
+        next(inferit)
+        return # None if there is ambiguity on the inferred node
+    except exceptions.InferenceError:
+        return # there is some kind of ambiguity
+    except StopIteration:
+        return value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/rebuilder.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/rebuilder.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/rebuilder.py	(revision 1126)
@@ -0,0 +1,987 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""this module contains utilities for rebuilding a _ast tree in
+order to get a single Astroid representation
+"""
+
+import sys
+import _ast
+from _ast import (
+    # binary operators
+    Add, Div, FloorDiv, Mod, Mult, Pow, Sub, BitAnd, BitOr, BitXor,
+    LShift, RShift,
+    # logical operators
+    And, Or,
+    # unary operators
+    UAdd, USub, Not, Invert,
+    # comparison operators
+    Eq, Gt, GtE, In, Is, IsNot, Lt, LtE, NotEq, NotIn,
+    )
+
+from astroid import nodes as new
+from astroid import astpeephole
+
+
+_BIN_OP_CLASSES = {Add: '+',
+                   BitAnd: '&',
+                   BitOr: '|',
+                   BitXor: '^',
+                   Div: '/',
+                   FloorDiv: '//',
+                   Mod: '%',
+                   Mult: '*',
+                   Pow: '**',
+                   Sub: '-',
+                   LShift: '<<',
+                   RShift: '>>',
+                  }
+if sys.version_info >= (3, 5):
+    from _ast import MatMult
+    _BIN_OP_CLASSES[MatMult] = '@'
+
+_BOOL_OP_CLASSES = {And: 'and',
+                    Or: 'or',
+                   }
+
+_UNARY_OP_CLASSES = {UAdd: '+',
+                     USub: '-',
+                     Not: 'not',
+                     Invert: '~',
+                    }
+
+_CMP_OP_CLASSES = {Eq: '==',
+                   Gt: '>',
+                   GtE: '>=',
+                   In: 'in',
+                   Is: 'is',
+                   IsNot: 'is not',
+                   Lt: '<',
+                   LtE: '<=',
+                   NotEq: '!=',
+                   NotIn: 'not in',
+                  }
+
+CONST_NAME_TRANSFORMS = {'None':  None,
+                         'True':  True,
+                         'False': False,
+                        }
+
+REDIRECT = {'arguments': 'Arguments',
+            'comprehension': 'Comprehension',
+            "ListCompFor": 'Comprehension',
+            "GenExprFor": 'Comprehension',
+            'excepthandler': 'ExceptHandler',
+            'keyword': 'Keyword',
+           }
+PY3K = sys.version_info >= (3, 0)
+PY34 = sys.version_info >= (3, 4)
+
+def _init_set_doc(node, newnode):
+    newnode.doc = None
+    try:
+        if isinstance(node.body[0], _ast.Expr) and isinstance(node.body[0].value, _ast.Str):
+            newnode.doc = node.body[0].value.s
+            node.body = node.body[1:]
+
+    except IndexError:
+        pass # ast built from scratch
+
+def _lineno_parent(oldnode, newnode, parent):
+    newnode.parent = parent
+    newnode.lineno = oldnode.lineno
+    newnode.col_offset = oldnode.col_offset
+
+def _set_infos(oldnode, newnode, parent):
+    newnode.parent = parent
+    if hasattr(oldnode, 'lineno'):
+        newnode.lineno = oldnode.lineno
+    if hasattr(oldnode, 'col_offset'):
+        newnode.col_offset = oldnode.col_offset
+
+def _create_yield_node(node, parent, rebuilder, factory):
+    newnode = factory()
+    _lineno_parent(node, newnode, parent)
+    if node.value is not None:
+        newnode.value = rebuilder.visit(node.value, newnode, None)
+    return newnode
+
+def _visit_or_none(node, attr, visitor, parent, assign_ctx, visit='visit',
+                   **kws):
+    """If the given node has an attribute, visits the attribute, and
+    otherwise returns None.
+
+    """
+    value = getattr(node, attr, None)
+    if value:
+        return getattr(visitor, visit)(value, parent, assign_ctx, **kws)
+    else:
+        return None
+
+
+class TreeRebuilder(object):
+    """Rebuilds the _ast tree to become an Astroid tree"""
+
+    def __init__(self, manager):
+        self._manager = manager
+        self.asscontext = None
+        self._global_names = []
+        self._import_from_nodes = []
+        self._delayed_assattr = []
+        self._visit_meths = {}
+        self._peepholer = astpeephole.ASTPeepholeOptimizer()
+
+    def visit_module(self, node, modname, modpath, package):
+        """visit a Module node by returning a fresh instance of it"""
+        newnode = new.Module(modname, None)
+        newnode.package = package
+        newnode.parent = None
+        _init_set_doc(node, newnode)
+        newnode.body = [self.visit(child, newnode) for child in node.body]
+        newnode.source_file = modpath
+        return newnode
+
+    def visit(self, node, parent, assign_ctx=None):
+        cls = node.__class__
+        if cls in self._visit_meths:
+            visit_method = self._visit_meths[cls]
+        else:
+            cls_name = cls.__name__
+            visit_name = 'visit_' + REDIRECT.get(cls_name, cls_name).lower()
+            visit_method = getattr(self, visit_name)
+            self._visit_meths[cls] = visit_method
+        return visit_method(node, parent, assign_ctx)
+
+    def _save_assignment(self, node, name=None):
+        """save assignement situation since node.parent is not available yet"""
+        if self._global_names and node.name in self._global_names[-1]:
+            node.root().set_local(node.name, node)
+        else:
+            node.parent.set_local(node.name, node)
+
+    def visit_arguments(self, node, parent, assign_ctx=None):
+        """visit a Arguments node by returning a fresh instance of it"""
+        newnode = new.Arguments()
+        newnode.parent = parent
+        newnode.args = [self.visit(child, newnode, "Assign")
+                        for child in node.args]
+        newnode.defaults = [self.visit(child, newnode, assign_ctx)
+                            for child in node.defaults]
+        newnode.kwonlyargs = []
+        newnode.kw_defaults = []
+        vararg, kwarg = node.vararg, node.kwarg
+        # change added in 82732 (7c5c678e4164), vararg and kwarg
+        # are instances of `_ast.arg`, not strings
+        if vararg:
+            if PY34:
+                if vararg.annotation:
+                    newnode.varargannotation = self.visit(vararg.annotation,
+                                                          newnode, assign_ctx)
+                vararg = vararg.arg
+            elif PY3K and node.varargannotation:
+                newnode.varargannotation = self.visit(node.varargannotation,
+                                                      newnode, assign_ctx)
+        if kwarg:
+            if PY34:
+                if kwarg.annotation:
+                    newnode.kwargannotation = self.visit(kwarg.annotation,
+                                                         newnode, assign_ctx)
+                kwarg = kwarg.arg
+            elif PY3K:
+                if node.kwargannotation:
+                    newnode.kwargannotation = self.visit(node.kwargannotation,
+                                                         newnode, assign_ctx)
+        newnode.vararg = vararg
+        newnode.kwarg = kwarg
+        # save argument names in locals:
+        if vararg:
+            newnode.parent.set_local(vararg, newnode)
+        if kwarg:
+            newnode.parent.set_local(kwarg, newnode)
+        return newnode
+
+    def visit_assignattr(self, node, parent, assign_ctx=None):
+        """visit a AssAttr node by returning a fresh instance of it"""
+        newnode = new.AssignAttr()
+        _lineno_parent(node, newnode, parent)
+        newnode.expr = self.visit(node.expr, newnode, assign_ctx)
+        self._delayed_assattr.append(newnode)
+        return newnode
+
+    def visit_assert(self, node, parent, assign_ctx=None):
+        """visit a Assert node by returning a fresh instance of it"""
+        newnode = new.Assert()
+        _lineno_parent(node, newnode, parent)
+        newnode.test = self.visit(node.test, newnode, assign_ctx)
+        if node.msg is not None:
+            newnode.fail = self.visit(node.msg, newnode, assign_ctx)
+        return newnode
+
+    def visit_assign(self, node, parent, assign_ctx=None):
+        """visit a Assign node by returning a fresh instance of it"""
+        newnode = new.Assign()
+        _lineno_parent(node, newnode, parent)
+        newnode.targets = [self.visit(child, newnode, "Assign")
+                           for child in node.targets]
+        newnode.value = self.visit(node.value, newnode, None)
+        return newnode
+
+    def visit_assignname(self, node, parent, assign_ctx=None, node_name=None):
+        '''visit a node and return a AssName node'''
+        newnode = new.AssignName()
+        _set_infos(node, newnode, parent)
+        newnode.name = node_name
+        self._save_assignment(newnode)
+        return newnode
+
+    def visit_augassign(self, node, parent, assign_ctx=None):
+        """visit a AugAssign node by returning a fresh instance of it"""
+        newnode = new.AugAssign()
+        _lineno_parent(node, newnode, parent)
+        newnode.op = _BIN_OP_CLASSES[node.op.__class__] + "="
+        newnode.target = self.visit(node.target, newnode, "Assign")
+        newnode.value = self.visit(node.value, newnode, None)
+        return newnode
+
+    def visit_repr(self, node, parent, assign_ctx=None):
+        """visit a Backquote node by returning a fresh instance of it"""
+        newnode = new.Repr()
+        _lineno_parent(node, newnode, parent)
+        newnode.value = self.visit(node.value, newnode, assign_ctx)
+        return newnode
+
+    def visit_binop(self, node, parent, assign_ctx=None):
+        """visit a BinOp node by returning a fresh instance of it"""
+        if isinstance(node.left, _ast.BinOp) and self._manager.optimize_ast:
+            # Optimize BinOp operations in order to remove
+            # redundant recursion. For instance, if the
+            # following code is parsed in order to obtain
+            # its ast, then the rebuilder will fail with an
+            # infinite recursion, the same will happen with the
+            # inference engine as well. There's no need to hold
+            # so many objects for the BinOp if they can be reduced
+            # to something else (also, the optimization
+            # might handle only Const binops, which isn't a big
+            # problem for the correctness of the program).
+            #
+            # ("a" + "b" + # one thousand more + "c")
+            optimized = self._peepholer.optimize_binop(node)
+            if optimized:
+                _lineno_parent(node, optimized, parent)
+                return optimized
+
+        newnode = new.BinOp()
+        _lineno_parent(node, newnode, parent)
+        newnode.left = self.visit(node.left, newnode, assign_ctx)
+        newnode.right = self.visit(node.right, newnode, assign_ctx)
+        newnode.op = _BIN_OP_CLASSES[node.op.__class__]
+        return newnode
+
+    def visit_boolop(self, node, parent, assign_ctx=None):
+        """visit a BoolOp node by returning a fresh instance of it"""
+        newnode = new.BoolOp()
+        _lineno_parent(node, newnode, parent)
+        newnode.values = [self.visit(child, newnode, assign_ctx)
+                          for child in node.values]
+        newnode.op = _BOOL_OP_CLASSES[node.op.__class__]
+        return newnode
+
+    def visit_break(self, node, parent, assign_ctx=None):
+        """visit a Break node by returning a fresh instance of it"""
+        newnode = new.Break()
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_call(self, node, parent, assign_ctx=None):
+        """visit a CallFunc node by returning a fresh instance of it"""
+        newnode = new.Call()
+        _lineno_parent(node, newnode, parent)
+        newnode.func = self.visit(node.func, newnode, assign_ctx)
+        args = [self.visit(child, newnode, assign_ctx)
+                for child in node.args]
+
+        starargs = _visit_or_none(node, 'starargs', self, newnode,
+                                  assign_ctx)
+        kwargs = _visit_or_none(node, 'kwargs', self, newnode,
+                                assign_ctx)
+        keywords = None
+        if node.keywords:
+            keywords = [self.visit(child, newnode, assign_ctx)
+                        for child in node.keywords]
+
+        if starargs:
+            new_starargs = new.Starred()
+            new_starargs.col_offset = starargs.col_offset
+            new_starargs.lineno = starargs.lineno
+            new_starargs.parent = starargs.parent
+            new_starargs.value = starargs
+            args.append(new_starargs)
+        if kwargs:
+            new_kwargs = new.Keyword()
+            new_kwargs.arg = None
+            new_kwargs.col_offset = kwargs.col_offset
+            new_kwargs.lineno = kwargs.lineno
+            new_kwargs.parent = kwargs.parent
+            new_kwargs.value = kwargs
+            if keywords:
+                keywords.append(new_kwargs)
+            else:
+                keywords = [new_kwargs]
+
+        newnode.args = args
+        newnode.keywords = keywords
+        return newnode
+
+    def visit_classdef(self, node, parent, assign_ctx=None):
+        """visit a Class node to become astroid"""
+        newnode = new.ClassDef(node.name, None)
+        _lineno_parent(node, newnode, parent)
+        _init_set_doc(node, newnode)
+        newnode.bases = [self.visit(child, newnode, assign_ctx)
+                         for child in node.bases]
+        newnode.body = [self.visit(child, newnode, assign_ctx)
+                        for child in node.body]
+        if node.decorator_list:
+            newnode.decorators = self.visit_decorators(node, newnode, assign_ctx)
+        newnode.parent.frame().set_local(newnode.name, newnode)
+        return newnode
+
+    def visit_const(self, node, parent, assign_ctx=None):
+        """visit a Const node by returning a fresh instance of it"""
+        newnode = new.Const(node.value)
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_continue(self, node, parent, assign_ctx=None):
+        """visit a Continue node by returning a fresh instance of it"""
+        newnode = new.Continue()
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_compare(self, node, parent, assign_ctx=None):
+        """visit a Compare node by returning a fresh instance of it"""
+        newnode = new.Compare()
+        _lineno_parent(node, newnode, parent)
+        newnode.left = self.visit(node.left, newnode, assign_ctx)
+        newnode.ops = [(_CMP_OP_CLASSES[op.__class__], self.visit(expr, newnode, assign_ctx))
+                       for (op, expr) in zip(node.ops, node.comparators)]
+        return newnode
+
+    def visit_comprehension(self, node, parent, assign_ctx=None):
+        """visit a Comprehension node by returning a fresh instance of it"""
+        newnode = new.Comprehension()
+        newnode.parent = parent
+        newnode.target = self.visit(node.target, newnode, 'Assign')
+        newnode.iter = self.visit(node.iter, newnode, None)
+        newnode.ifs = [self.visit(child, newnode, None)
+                       for child in node.ifs]
+        return newnode
+
+    def visit_decorators(self, node, parent, assign_ctx=None):
+        """visit a Decorators node by returning a fresh instance of it"""
+        # /!\ node is actually a _ast.Function node while
+        # parent is a astroid.nodes.Function node
+        newnode = new.Decorators()
+        _lineno_parent(node, newnode, parent)
+        decorators = node.decorator_list
+        newnode.nodes = [self.visit(child, newnode, assign_ctx)
+                         for child in decorators]
+        return newnode
+
+    def visit_delete(self, node, parent, assign_ctx=None):
+        """visit a Delete node by returning a fresh instance of it"""
+        newnode = new.Delete()
+        _lineno_parent(node, newnode, parent)
+        newnode.targets = [self.visit(child, newnode, 'Del')
+                           for child in node.targets]
+        return newnode
+
+    def _visit_dict_items(self, node, parent, newnode, assign_ctx):
+        for key, value in zip(node.keys, node.values):
+            rebuilt_value = self.visit(value, newnode, assign_ctx)
+            if not key:
+                # Python 3.5 and extended unpacking
+                rebuilt_key = new.DictUnpack()
+                rebuilt_key.lineno = rebuilt_value.lineno
+                rebuilt_key.col_offset = rebuilt_value.col_offset
+                rebuilt_key.parent = rebuilt_value.parent
+            else:
+                rebuilt_key = self.visit(key, newnode, assign_ctx)
+            yield rebuilt_key, rebuilt_value
+
+    def visit_dict(self, node, parent, assign_ctx=None):
+        """visit a Dict node by returning a fresh instance of it"""
+        newnode = new.Dict()
+        _lineno_parent(node, newnode, parent)
+        newnode.items = list(self._visit_dict_items(node, parent, newnode, assign_ctx))
+        return newnode
+
+    def visit_dictcomp(self, node, parent, assign_ctx=None):
+        """visit a DictComp node by returning a fresh instance of it"""
+        newnode = new.DictComp()
+        _lineno_parent(node, newnode, parent)
+        newnode.key = self.visit(node.key, newnode, assign_ctx)
+        newnode.value = self.visit(node.value, newnode, assign_ctx)
+        newnode.generators = [self.visit(child, newnode, assign_ctx)
+                              for child in node.generators]
+        return newnode
+
+    def visit_expr(self, node, parent, assign_ctx=None):
+        """visit a Discard node by returning a fresh instance of it"""
+        newnode = new.Expr()
+        _lineno_parent(node, newnode, parent)
+        newnode.value = self.visit(node.value, newnode, assign_ctx)
+        return newnode
+
+    def visit_ellipsis(self, node, parent, assign_ctx=None):
+        """visit an Ellipsis node by returning a fresh instance of it"""
+        newnode = new.Ellipsis()
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_emptynode(self, node, parent, assign_ctx=None):
+        """visit an EmptyNode node by returning a fresh instance of it"""
+        newnode = new.EmptyNode()
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_excepthandler(self, node, parent, assign_ctx=None):
+        """visit an ExceptHandler node by returning a fresh instance of it"""
+        newnode = new.ExceptHandler()
+        _lineno_parent(node, newnode, parent)
+        if node.type is not None:
+            newnode.type = self.visit(node.type, newnode, assign_ctx)
+        if node.name is not None:
+            # /!\ node.name can be a tuple
+            newnode.name = self.visit(node.name, newnode, 'Assign')
+        newnode.body = [self.visit(child, newnode, None)
+                        for child in node.body]
+        return newnode
+
+    def visit_exec(self, node, parent, assign_ctx=None):
+        """visit an Exec node by returning a fresh instance of it"""
+        newnode = new.Exec()
+        _lineno_parent(node, newnode, parent)
+        newnode.expr = self.visit(node.body, newnode)
+        if node.globals is not None:
+            newnode.globals = self.visit(node.globals, newnode,
+                                         assign_ctx)
+        if node.locals is not None:
+            newnode.locals = self.visit(node.locals, newnode,
+                                        assign_ctx)
+        return newnode
+
+    def visit_extslice(self, node, parent, assign_ctx=None):
+        """visit an ExtSlice node by returning a fresh instance of it"""
+        newnode = new.ExtSlice()
+        newnode.parent = parent
+        newnode.dims = [self.visit(dim, newnode, assign_ctx)
+                        for dim in node.dims]
+        return newnode
+
+    def _visit_for(self, cls, node, parent, assign_ctx=None):
+        """visit a For node by returning a fresh instance of it"""
+        newnode = cls()
+        _lineno_parent(node, newnode, parent)
+        newnode.target = self.visit(node.target, newnode, "Assign")
+        newnode.iter = self.visit(node.iter, newnode, None)
+        newnode.body = [self.visit(child, newnode, None)
+                        for child in node.body]
+        newnode.orelse = [self.visit(child, newnode, None)
+                          for child in node.orelse]
+        return newnode
+
+    def visit_for(self, node, parent, assign_ctx=None):
+        return self._visit_for(new.For, node, parent,
+                               assign_ctx=assign_ctx)
+    def visit_importfrom(self, node, parent, assign_ctx=None):
+        """visit a From node by returning a fresh instance of it"""
+        names = [(alias.name, alias.asname) for alias in node.names]
+        newnode = new.ImportFrom(node.module or '', names, node.level or None)
+        _set_infos(node, newnode, parent)
+        # store From names to add them to locals after building
+        self._import_from_nodes.append(newnode)
+        return newnode
+
+    def _visit_functiondef(self, cls, node, parent, assign_ctx=None):
+        """visit an FunctionDef node to become astroid"""
+        self._global_names.append({})
+        newnode = cls(node.name, None)
+        _lineno_parent(node, newnode, parent)
+        _init_set_doc(node, newnode)
+        newnode.args = self.visit(node.args, newnode, assign_ctx)
+        newnode.body = [self.visit(child, newnode, assign_ctx)
+                        for child in node.body]
+        decorators = node.decorator_list
+        if decorators:
+            newnode.decorators = self.visit_decorators(
+                    node, newnode, assign_ctx)
+        if PY3K and node.returns:
+            newnode.returns = self.visit(node.returns, newnode,
+                                         assign_ctx)
+        self._global_names.pop()
+        frame = newnode.parent.frame()
+        frame.set_local(newnode.name, newnode)
+        return newnode
+
+    def visit_functiondef(self, node, parent, assign_ctx=None):
+        return self._visit_functiondef(new.FunctionDef, node, parent,
+                                       assign_ctx=assign_ctx)
+
+    def visit_generatorexp(self, node, parent, assign_ctx=None):
+        """visit a GenExpr node by returning a fresh instance of it"""
+        newnode = new.GeneratorExp()
+        _lineno_parent(node, newnode, parent)
+        newnode.elt = self.visit(node.elt, newnode, assign_ctx)
+        newnode.generators = [self.visit(child, newnode, assign_ctx)
+                              for child in node.generators]
+        return newnode
+
+    def visit_attribute(self, node, parent, assign_ctx=None):
+        """visit a Getattr node by returning a fresh instance of it"""
+        # pylint: disable=redefined-variable-type
+        if assign_ctx == "Del":
+            # FIXME : maybe we should reintroduce and visit_delattr ?
+            # for instance, deactivating asscontext
+            newnode = new.DelAttr()
+        elif assign_ctx == "Assign":
+            # FIXME : maybe we should call visit_assattr ?
+            newnode = new.AssignAttr()
+            self._delayed_assattr.append(newnode)
+        else:
+            newnode = new.Attribute()
+        _lineno_parent(node, newnode, parent)
+        newnode.expr = self.visit(node.value, newnode, None)
+        newnode.attrname = node.attr
+        return newnode
+
+    def visit_global(self, node, parent, assign_ctx=None):
+        """visit an Global node to become astroid"""
+        newnode = new.Global(node.names)
+        _set_infos(node, newnode, parent)
+        if self._global_names: # global at the module level, no effect
+            for name in node.names:
+                self._global_names[-1].setdefault(name, []).append(newnode)
+        return newnode
+
+    def visit_if(self, node, parent, assign_ctx=None):
+        """visit a If node by returning a fresh instance of it"""
+        newnode = new.If()
+        _lineno_parent(node, newnode, parent)
+        newnode.test = self.visit(node.test, newnode, assign_ctx)
+        newnode.body = [self.visit(child, newnode, assign_ctx)
+                        for child in node.body]
+        newnode.orelse = [self.visit(child, newnode, assign_ctx)
+                          for child in node.orelse]
+        return newnode
+
+    def visit_ifexp(self, node, parent, assign_ctx=None):
+        """visit a IfExp node by returning a fresh instance of it"""
+        newnode = new.IfExp()
+        _lineno_parent(node, newnode, parent)
+        newnode.test = self.visit(node.test, newnode, assign_ctx)
+        newnode.body = self.visit(node.body, newnode, assign_ctx)
+        newnode.orelse = self.visit(node.orelse, newnode, assign_ctx)
+        return newnode
+
+    def visit_import(self, node, parent, assign_ctx=None):
+        """visit a Import node by returning a fresh instance of it"""
+        newnode = new.Import()
+        _set_infos(node, newnode, parent)
+        newnode.names = [(alias.name, alias.asname) for alias in node.names]
+        # save import names in parent's locals:
+        for (name, asname) in newnode.names:
+            name = asname or name
+            newnode.parent.set_local(name.split('.')[0], newnode)
+        return newnode
+
+    def visit_index(self, node, parent, assign_ctx=None):
+        """visit a Index node by returning a fresh instance of it"""
+        newnode = new.Index()
+        newnode.parent = parent
+        newnode.value = self.visit(node.value, newnode, assign_ctx)
+        return newnode
+
+    def visit_keyword(self, node, parent, assign_ctx=None):
+        """visit a Keyword node by returning a fresh instance of it"""
+        newnode = new.Keyword()
+        newnode.parent = parent
+        newnode.arg = node.arg
+        newnode.value = self.visit(node.value, newnode, assign_ctx)
+        return newnode
+
+    def visit_lambda(self, node, parent, assign_ctx=None):
+        """visit a Lambda node by returning a fresh instance of it"""
+        newnode = new.Lambda()
+        _lineno_parent(node, newnode, parent)
+        newnode.args = self.visit(node.args, newnode, assign_ctx)
+        newnode.body = self.visit(node.body, newnode, assign_ctx)
+        return newnode
+
+    def visit_list(self, node, parent, assign_ctx=None):
+        """visit a List node by returning a fresh instance of it"""
+        newnode = new.List()
+        _lineno_parent(node, newnode, parent)
+        newnode.elts = [self.visit(child, newnode, assign_ctx)
+                        for child in node.elts]
+        return newnode
+
+    def visit_listcomp(self, node, parent, assign_ctx=None):
+        """visit a ListComp node by returning a fresh instance of it"""
+        newnode = new.ListComp()
+        _lineno_parent(node, newnode, parent)
+        newnode.elt = self.visit(node.elt, newnode, assign_ctx)
+        newnode.generators = [self.visit(child, newnode, assign_ctx)
+                              for child in node.generators]
+        return newnode
+
+    def visit_name(self, node, parent, assign_ctx=None):
+        """visit a Name node by returning a fresh instance of it"""
+        # True and False can be assigned to something in py2x, so we have to
+        # check first the asscontext
+        # pylint: disable=redefined-variable-type
+        if assign_ctx == "Del":
+            newnode = new.DelName()
+        elif assign_ctx is not None: # Ass
+            newnode = new.AssName()
+        elif node.id in CONST_NAME_TRANSFORMS:
+            newnode = new.Const(CONST_NAME_TRANSFORMS[node.id])
+            _set_infos(node, newnode, parent)
+            return newnode
+        else:
+            newnode = new.Name()
+        _lineno_parent(node, newnode, parent)
+        newnode.name = node.id
+        # XXX REMOVE me :
+        if assign_ctx in ('Del', 'Assign'): # 'Aug' ??
+            self._save_assignment(newnode)
+        return newnode
+
+    def visit_bytes(self, node, parent, assign_ctx=None):
+        """visit a Bytes node by returning a fresh instance of Const"""
+        newnode = new.Const(node.s)
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_num(self, node, parent, assign_ctx=None):
+        """visit a Num node by returning a fresh instance of Const"""
+        newnode = new.Const(node.n)
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_pass(self, node, parent, assign_ctx=None):
+        """visit a Pass node by returning a fresh instance of it"""
+        newnode = new.Pass()
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_str(self, node, parent, assign_ctx=None):
+        """visit a Str node by returning a fresh instance of Const"""
+        newnode = new.Const(node.s)
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_print(self, node, parent, assign_ctx=None):
+        """visit a Print node by returning a fresh instance of it"""
+        newnode = new.Print()
+        _lineno_parent(node, newnode, parent)
+        newnode.nl = node.nl
+        if node.dest is not None:
+            newnode.dest = self.visit(node.dest, newnode, assign_ctx)
+        newnode.values = [self.visit(child, newnode, assign_ctx)
+                          for child in node.values]
+        return newnode
+
+    def visit_raise(self, node, parent, assign_ctx=None):
+        """visit a Raise node by returning a fresh instance of it"""
+        newnode = new.Raise()
+        _lineno_parent(node, newnode, parent)
+        if node.type is not None:
+            newnode.exc = self.visit(node.type, newnode, assign_ctx)
+        if node.inst is not None:
+            newnode.inst = self.visit(node.inst, newnode, assign_ctx)
+        if node.tback is not None:
+            newnode.tback = self.visit(node.tback, newnode, assign_ctx)
+        return newnode
+
+    def visit_return(self, node, parent, assign_ctx=None):
+        """visit a Return node by returning a fresh instance of it"""
+        newnode = new.Return()
+        _lineno_parent(node, newnode, parent)
+        if node.value is not None:
+            newnode.value = self.visit(node.value, newnode, assign_ctx)
+        return newnode
+
+    def visit_set(self, node, parent, assign_ctx=None):
+        """visit a Set node by returning a fresh instance of it"""
+        newnode = new.Set()
+        _lineno_parent(node, newnode, parent)
+        newnode.elts = [self.visit(child, newnode, assign_ctx)
+                        for child in node.elts]
+        return newnode
+
+    def visit_setcomp(self, node, parent, assign_ctx=None):
+        """visit a SetComp node by returning a fresh instance of it"""
+        newnode = new.SetComp()
+        _lineno_parent(node, newnode, parent)
+        newnode.elt = self.visit(node.elt, newnode, assign_ctx)
+        newnode.generators = [self.visit(child, newnode, assign_ctx)
+                              for child in node.generators]
+        return newnode
+
+    def visit_slice(self, node, parent, assign_ctx=None):
+        """visit a Slice node by returning a fresh instance of it"""
+        newnode = new.Slice()
+        newnode.parent = parent
+        if node.lower is not None:
+            newnode.lower = self.visit(node.lower, newnode, assign_ctx)
+        if node.upper is not None:
+            newnode.upper = self.visit(node.upper, newnode, assign_ctx)
+        if node.step is not None:
+            newnode.step = self.visit(node.step, newnode, assign_ctx)
+        return newnode
+
+    def visit_subscript(self, node, parent, assign_ctx=None):
+        """visit a Subscript node by returning a fresh instance of it"""
+        newnode = new.Subscript()
+        _lineno_parent(node, newnode, parent)
+        newnode.value = self.visit(node.value, newnode, None)
+        newnode.slice = self.visit(node.slice, newnode, None)
+        return newnode
+
+    def visit_tryexcept(self, node, parent, assign_ctx=None):
+        """visit a TryExcept node by returning a fresh instance of it"""
+        newnode = new.TryExcept()
+        _lineno_parent(node, newnode, parent)
+        newnode.body = [self.visit(child, newnode, assign_ctx)
+                        for child in node.body]
+        newnode.handlers = [self.visit(child, newnode, assign_ctx)
+                            for child in node.handlers]
+        newnode.orelse = [self.visit(child, newnode, assign_ctx)
+                          for child in node.orelse]
+        return newnode
+
+    def visit_tryfinally(self, node, parent, assign_ctx=None):
+        """visit a TryFinally node by returning a fresh instance of it"""
+        newnode = new.TryFinally()
+        _lineno_parent(node, newnode, parent)
+        newnode.body = [self.visit(child, newnode, assign_ctx)
+                        for child in node.body]
+        newnode.finalbody = [self.visit(n, newnode, assign_ctx)
+                             for n in node.finalbody]
+        return newnode
+
+    def visit_tuple(self, node, parent, assign_ctx=None):
+        """visit a Tuple node by returning a fresh instance of it"""
+        newnode = new.Tuple()
+        _lineno_parent(node, newnode, parent)
+        newnode.elts = [self.visit(child, newnode, assign_ctx)
+                        for child in node.elts]
+        return newnode
+
+    def visit_unaryop(self, node, parent, assign_ctx=None):
+        """visit a UnaryOp node by returning a fresh instance of it"""
+        newnode = new.UnaryOp()
+        _lineno_parent(node, newnode, parent)
+        newnode.operand = self.visit(node.operand, newnode, assign_ctx)
+        newnode.op = _UNARY_OP_CLASSES[node.op.__class__]
+        return newnode
+
+    def visit_while(self, node, parent, assign_ctx=None):
+        """visit a While node by returning a fresh instance of it"""
+        newnode = new.While()
+        _lineno_parent(node, newnode, parent)
+        newnode.test = self.visit(node.test, newnode, assign_ctx)
+        newnode.body = [self.visit(child, newnode, assign_ctx)
+                        for child in node.body]
+        newnode.orelse = [self.visit(child, newnode, assign_ctx)
+                          for child in node.orelse]
+        return newnode
+
+    def visit_with(self, node, parent, assign_ctx=None):
+        newnode = new.With()
+        _lineno_parent(node, newnode, parent)
+        expr = self.visit(node.context_expr, newnode, assign_ctx)
+        if node.optional_vars is not None:
+            vars = self.visit(node.optional_vars, newnode, 'Assign')
+        else:
+            vars = None
+        self.asscontext = None
+        newnode.items = [(expr, vars)]
+        newnode.body = [self.visit(child, newnode, assign_ctx)
+                        for child in node.body]
+        return newnode
+
+    def visit_yield(self, node, parent, assign_ctx=None):
+        """visit a Yield node by returning a fresh instance of it"""
+        return _create_yield_node(node, parent, self, new.Yield)
+
+class TreeRebuilder3k(TreeRebuilder):
+    """extend and overwrite TreeRebuilder for python3k"""
+
+    def visit_arg(self, node, parent, assign_ctx=None):
+        """visit a arg node by returning a fresh AssName instance"""
+        # TODO(cpopa): introduce an Arg node instead of using AssignName.
+        return self.visit_assignname(node, parent, assign_ctx, node.arg)
+
+    def visit_nameconstant(self, node, parent, assign_ctx=None):
+        # in Python 3.4 we have NameConstant for True / False / None
+        newnode = new.Const(node.value)
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_arguments(self, node, parent, assign_ctx=None):
+        newnode = super(TreeRebuilder3k, self).visit_arguments(node, parent, assign_ctx)
+        newnode.kwonlyargs = [self.visit(child, newnode, 'Assign')
+                              for child in node.kwonlyargs]
+        newnode.kw_defaults = [self.visit(child, newnode, None)
+                               if child else None for child in node.kw_defaults]
+        newnode.annotations = [
+            self.visit(arg.annotation, newnode, None) if arg.annotation else None
+            for arg in node.args]
+        return newnode
+
+    def visit_excepthandler(self, node, parent, assign_ctx=None):
+        """visit an ExceptHandler node by returning a fresh instance of it"""
+        newnode = new.ExceptHandler()
+        _lineno_parent(node, newnode, parent)
+        if node.type is not None:
+            newnode.type = self.visit(node.type, newnode, assign_ctx)
+        if node.name is not None:
+            newnode.name = self.visit_assignname(node, newnode, 'Assign', node.name)
+        newnode.body = [self.visit(child, newnode, None)
+                        for child in node.body]
+        return newnode
+
+    def visit_nonlocal(self, node, parent, assign_ctx=None):
+        """visit a Nonlocal node and return a new instance of it"""
+        newnode = new.Nonlocal(node.names)
+        _set_infos(node, newnode, parent)
+        return newnode
+
+    def visit_raise(self, node, parent, assign_ctx=None):
+        """visit a Raise node by returning a fresh instance of it"""
+        newnode = new.Raise()
+        _lineno_parent(node, newnode, parent)
+        # no traceback; anyway it is not used in Pylint
+        if node.exc is not None:
+            newnode.exc = self.visit(node.exc, newnode, assign_ctx)
+        if node.cause is not None:
+            newnode.cause = self.visit(node.cause, newnode, assign_ctx)
+        return newnode
+
+    def visit_starred(self, node, parent, assign_ctx=None):
+        """visit a Starred node and return a new instance of it"""
+        newnode = new.Starred()
+        _lineno_parent(node, newnode, parent)
+        newnode.value = self.visit(node.value, newnode, assign_ctx)
+        return newnode
+
+    def visit_try(self, node, parent, assign_ctx=None):
+        # python 3.3 introduce a new Try node replacing TryFinally/TryExcept nodes
+        # pylint: disable=redefined-variable-type
+        if node.finalbody:
+            newnode = new.TryFinally()
+            _lineno_parent(node, newnode, parent)
+            newnode.finalbody = [self.visit(n, newnode, assign_ctx)
+                                 for n in node.finalbody]
+            if node.handlers:
+                excnode = new.TryExcept()
+                _lineno_parent(node, excnode, newnode)
+                excnode.body = [self.visit(child, excnode, assign_ctx)
+                                for child in node.body]
+                excnode.handlers = [self.visit(child, excnode, assign_ctx)
+                                    for child in node.handlers]
+                excnode.orelse = [self.visit(child, excnode, assign_ctx)
+                                  for child in node.orelse]
+                newnode.body = [excnode]
+            else:
+                newnode.body = [self.visit(child, newnode, assign_ctx)
+                                for child in node.body]
+        elif node.handlers:
+            newnode = new.TryExcept()
+            _lineno_parent(node, newnode, parent)
+            newnode.body = [self.visit(child, newnode, assign_ctx)
+                            for child in node.body]
+            newnode.handlers = [self.visit(child, newnode, assign_ctx)
+                                for child in node.handlers]
+            newnode.orelse = [self.visit(child, newnode, assign_ctx)
+                              for child in node.orelse]
+        return newnode
+
+    def _visit_with(self, cls, node, parent, assign_ctx=None):
+        if 'items' not in node._fields:
+            # python < 3.3
+            return super(TreeRebuilder3k, self).visit_with(node, parent,
+                                                           assign_ctx)
+
+        newnode = cls()
+        _lineno_parent(node, newnode, parent)
+        def visit_child(child):
+            expr = self.visit(child.context_expr, newnode)
+            if child.optional_vars:
+                var = self.visit(child.optional_vars, newnode,
+                                 'Assign')
+            else:
+                var = None
+            return expr, var
+        newnode.items = [visit_child(child)
+                         for child in node.items]
+        newnode.body = [self.visit(child, newnode, None)
+                        for child in node.body]
+        return newnode
+
+    def visit_with(self, node, parent, assign_ctx=None):
+        return self._visit_with(new.With, node, parent, assign_ctx=assign_ctx)
+
+    def visit_yieldfrom(self, node, parent, assign_ctx=None):
+        return _create_yield_node(node, parent, self, new.YieldFrom)
+
+    def visit_classdef(self, node, parent, assign_ctx=None):
+        newnode = super(TreeRebuilder3k, self).visit_classdef(node, parent, assign_ctx)
+        newnode._newstyle = True
+        for keyword in node.keywords:
+            if keyword.arg == 'metaclass':
+                newnode._metaclass = self.visit(keyword, newnode, assign_ctx).value
+                break
+        return newnode
+
+    # Async structs added in Python 3.5
+    def visit_asyncfunctiondef(self, node, parent, assign_ctx=None):
+        return self._visit_functiondef(new.AsyncFunctionDef, node, parent,
+                                       assign_ctx=assign_ctx)
+
+
+    def visit_asyncfor(self, node, parent, assign_ctx=None):
+        return self._visit_for(new.AsyncFor, node, parent,
+                               assign_ctx=assign_ctx)
+
+    def visit_await(self, node, parent, assign_ctx=None):
+        newnode = new.Await()
+        newnode.lineno = node.lineno
+        newnode.col_offset = node.col_offset
+        newnode.parent = parent
+        newnode.value = self.visit(node.value, newnode, None)
+        return newnode
+
+    def visit_asyncwith(self, node, parent, assign_ctx=None):
+        return self._visit_with(new.AsyncWith, node, parent,
+                                assign_ctx=assign_ctx)
+
+
+if sys.version_info >= (3, 0):
+    TreeRebuilder = TreeRebuilder3k
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/exceptions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/exceptions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/exceptions.py	(revision 1126)
@@ -0,0 +1,71 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""this module contains exceptions used in the astroid library
+
+"""
+
+__doctype__ = "restructuredtext en"
+
+class AstroidError(Exception):
+    """base exception class for all astroid related exceptions"""
+
+class AstroidBuildingException(AstroidError):
+    """exception class when we are unable to build an astroid representation"""
+
+class ResolveError(AstroidError):
+    """base class of astroid resolution/inference error"""
+
+class MroError(ResolveError):
+    """Error raised when there is a problem with method resolution of a class."""
+
+
+class DuplicateBasesError(MroError):
+    """Error raised when there are duplicate bases in the same class bases."""
+
+
+class InconsistentMroError(MroError):
+    """Error raised when a class's MRO is inconsistent."""
+
+
+class SuperError(ResolveError):
+    """Error raised when there is a problem with a super call."""
+
+
+class SuperArgumentTypeError(SuperError):
+    """Error raised when the super arguments are invalid."""
+
+
+class NotFoundError(ResolveError):
+    """raised when we are unable to resolve a name"""
+
+class InferenceError(ResolveError):
+    """raised when we are unable to infer a node"""
+
+class UseInferenceDefault(Exception):
+    """exception to be raised in custom inference function to indicate that it
+    should go back to the default behaviour
+    """
+
+class UnresolvableName(InferenceError):
+    """raised when we are unable to resolve a name"""
+
+class NoDefault(AstroidError):
+    """raised by function's `default_value` method when an argument has
+    no default value
+    """
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/protocols.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/protocols.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/protocols.py	(revision 1126)
@@ -0,0 +1,465 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""this module contains a set of functions to handle python protocols for nodes
+where it makes sense.
+"""
+
+import collections
+import operator
+import sys
+
+from astroid import arguments
+from astroid import bases
+from astroid import context as contextmod
+from astroid import exceptions
+from astroid import node_classes
+from astroid import nodes
+from astroid import util
+
+BIN_OP_METHOD = {'+':  '__add__',
+                 '-':  '__sub__',
+                 '/':  '__div__',
+                 '//': '__floordiv__',
+                 '*':  '__mul__',
+                 '**': '__pow__',
+                 '%':  '__mod__',
+                 '&':  '__and__',
+                 '|':  '__or__',
+                 '^':  '__xor__',
+                 '<<': '__lshift__',
+                 '>>': '__rshift__',
+                 '@': '__matmul__'
+                }
+
+UNARY_OP_METHOD = {'+': '__pos__',
+                   '-': '__neg__',
+                   '~': '__invert__',
+                   'not': None, # XXX not '__nonzero__'
+                  }
+
+# unary operations ############################################################
+
+def tl_infer_unary_op(self, operator):
+    if operator == 'not':
+        return node_classes.const_factory(not bool(self.elts))
+    raise TypeError() # XXX log unsupported operation
+nodes.Tuple.infer_unary_op = tl_infer_unary_op
+nodes.List.infer_unary_op = tl_infer_unary_op
+
+
+def dict_infer_unary_op(self, operator):
+    if operator == 'not':
+        return node_classes.const_factory(not bool(self.items))
+    raise TypeError() # XXX log unsupported operation
+nodes.Dict.infer_unary_op = dict_infer_unary_op
+
+
+def const_infer_unary_op(self, operator):
+    if operator == 'not':
+        return node_classes.const_factory(not self.value)
+    # XXX log potentially raised TypeError
+    elif operator == '+':
+        return node_classes.const_factory(+self.value)
+    else: # operator == '-':
+        return node_classes.const_factory(-self.value)
+nodes.Const.infer_unary_op = const_infer_unary_op
+
+
+# binary operations ###########################################################
+
+BIN_OP_IMPL = {'+':  lambda a, b: a + b,
+               '-':  lambda a, b: a - b,
+               '/':  lambda a, b: a / b,
+               '//': lambda a, b: a // b,
+               '*':  lambda a, b: a * b,
+               '**': lambda a, b: a ** b,
+               '%':  lambda a, b: a % b,
+               '&':  lambda a, b: a & b,
+               '|':  lambda a, b: a | b,
+               '^':  lambda a, b: a ^ b,
+               '<<': lambda a, b: a << b,
+               '>>': lambda a, b: a >> b,
+              }
+
+if sys.version_info >= (3, 5):
+    # MatMult is available since Python 3.5+.
+    BIN_OP_IMPL['@'] = operator.matmul
+
+for key, impl in list(BIN_OP_IMPL.items()):
+    BIN_OP_IMPL[key+'='] = impl
+
+def const_infer_binary_op(self, operator, other, context):
+    for other in other.infer(context):
+        if isinstance(other, nodes.Const):
+            try:
+                impl = BIN_OP_IMPL[operator]
+
+                try:
+                    yield node_classes.const_factory(impl(self.value, other.value))
+                except Exception:
+                    # ArithmeticError is not enough: float >> float is a TypeError
+                    # TODO : let pylint know about the problem
+                    pass
+            except TypeError:
+                # XXX log TypeError
+                continue
+        elif other is util.YES:
+            yield other
+        else:
+            try:
+                for val in other.infer_binary_op(operator, self, context):
+                    yield val
+            except AttributeError:
+                yield util.YES
+nodes.Const.infer_binary_op = bases.yes_if_nothing_inferred(const_infer_binary_op)
+
+
+
+def _multiply_seq_by_int(self, other, context):
+    node = self.__class__()
+    elts = []
+    for elt in self.elts:
+        infered = util.safe_infer(elt, context)
+        if infered is None:
+            infered = util.YES
+        elts.append(infered)
+    node.elts = elts * other.value
+    return node
+
+
+def _filter_uninferable_nodes(elts, context):
+    for elt in elts:
+        if elt is util.YES:
+            yield elt
+        else:
+            for inferred in elt.infer(context):
+                yield inferred
+
+
+def tl_infer_binary_op(self, operator, other, context):
+    for other in other.infer(context):
+        if isinstance(other, self.__class__) and operator == '+':
+            node = self.__class__()
+            elts = list(_filter_uninferable_nodes(self.elts, context))
+            elts += list(_filter_uninferable_nodes(other.elts, context))
+            node.elts = elts
+            yield node
+        elif isinstance(other, nodes.Const) and operator == '*':
+            if not isinstance(other.value, int):
+                yield util.YES
+                continue
+            yield _multiply_seq_by_int(self, other, context)
+        elif isinstance(other, bases.Instance) and not isinstance(other, nodes.Const):
+            yield util.YES
+    # XXX else log TypeError
+nodes.Tuple.infer_binary_op = bases.yes_if_nothing_inferred(tl_infer_binary_op)
+nodes.List.infer_binary_op = bases.yes_if_nothing_inferred(tl_infer_binary_op)
+
+
+def dict_infer_binary_op(self, operator, other, context):
+    for other in other.infer(context):
+        if isinstance(other, bases.Instance) and isinstance(other._proxied, nodes.ClassDef):
+            yield util.YES
+        # XXX else log TypeError
+nodes.Dict.infer_binary_op = bases.yes_if_nothing_inferred(dict_infer_binary_op)
+
+def instance_infer_binary_op(self, operator, other, context):
+    try:
+        methods = self.getattr(BIN_OP_METHOD[operator])
+    except (exceptions.NotFoundError, KeyError):
+        # Unknown operator
+        yield util.YES
+    else:
+        for method in methods:
+            if not isinstance(method, nodes.FunctionDef):
+                continue
+            for result in method.infer_call_result(self, context):
+                if result is not util.YES:
+                    yield result
+            # We are interested only in the first infered method,
+            # don't go looking in the rest of the methods of the ancestors.
+            break
+
+bases.Instance.infer_binary_op = bases.yes_if_nothing_inferred(instance_infer_binary_op)
+
+
+# assignment ##################################################################
+
+"""the assigned_stmts method is responsible to return the assigned statement
+(e.g. not inferred) according to the assignment type.
+
+The `asspath` argument is used to record the lhs path of the original node.
+For instance if we want assigned statements for 'c' in 'a, (b,c)', asspath
+will be [1, 1] once arrived to the Assign node.
+
+The `context` argument is the current inference context which should be given
+to any intermediary inference necessary.
+"""
+
+def _resolve_looppart(parts, asspath, context):
+    """recursive function to resolve multiple assignments on loops"""
+    asspath = asspath[:]
+    index = asspath.pop(0)
+    for part in parts:
+        if part is util.YES:
+            continue
+        # XXX handle __iter__ and log potentially detected errors
+        if not hasattr(part, 'itered'):
+            continue
+        try:
+            itered = part.itered()
+        except TypeError:
+            continue # XXX log error
+        for stmt in itered:
+            try:
+                assigned = stmt.getitem(index, context)
+            except (AttributeError, IndexError):
+                continue
+            except TypeError: # stmt is unsubscriptable Const
+                continue
+            if not asspath:
+                # we achieved to resolved the assignment path,
+                # don't infer the last part
+                yield assigned
+            elif assigned is util.YES:
+                break
+            else:
+                # we are not yet on the last part of the path
+                # search on each possibly inferred value
+                try:
+                    for inferred in _resolve_looppart(assigned.infer(context),
+                                                     asspath, context):
+                        yield inferred
+                except exceptions.InferenceError:
+                    break
+
+
+@bases.raise_if_nothing_inferred
+def for_assigned_stmts(self, node=None, context=None, asspath=None):
+    if asspath is None:
+        for lst in self.iter.infer(context):
+            if isinstance(lst, (nodes.Tuple, nodes.List)):
+                for item in lst.elts:
+                    yield item
+    else:
+        for inferred in _resolve_looppart(self.iter.infer(context),
+                                         asspath, context):
+            yield inferred
+
+nodes.For.assigned_stmts = for_assigned_stmts
+nodes.Comprehension.assigned_stmts = for_assigned_stmts
+
+
+def sequence_assigned_stmts(self, node=None, context=None, asspath=None):
+    if asspath is None:
+        asspath = []
+    try:
+        index = self.elts.index(node)
+    except ValueError:
+         util.reraise(exceptions.InferenceError(
+             'Tried to retrieve a node {node!r} which does not exist',
+             node=self, assign_path=asspath, context=context))
+
+    asspath.insert(0, index)
+    return self.parent.assigned_stmts(node=self, context=context, asspath=asspath)
+
+nodes.Tuple.assigned_stmts = sequence_assigned_stmts
+nodes.List.assigned_stmts = sequence_assigned_stmts
+
+
+def assend_assigned_stmts(self, node=None, context=None, asspath=None):
+    return self.parent.assigned_stmts(node=self, context=context)
+nodes.AssignName.assigned_stmts = assend_assigned_stmts
+nodes.AssignAttr.assigned_stmts = assend_assigned_stmts
+
+
+def _arguments_infer_argname(self, name, context):
+    # arguments information may be missing, in which case we can't do anything
+    # more
+    if not (self.args or self.vararg or self.kwarg):
+        yield util.YES
+        return
+    # first argument of instance/class method
+    if self.args and getattr(self.args[0], 'name', None) == name:
+        functype = self.parent.type
+        if functype == 'method':
+            yield bases.Instance(self.parent.parent.frame())
+            return
+        if functype == 'classmethod':
+            yield self.parent.parent.frame()
+            return
+
+    if context and context.callcontext:
+        call_site = arguments.CallSite(context.callcontext)
+        for value in call_site.infer_argument(self.parent, name, context):
+            yield value
+        return
+
+    # TODO: just provide the type here, no need to have an empty Dict.
+    if name == self.vararg:
+        vararg = node_classes.const_factory(())
+        vararg.parent = self
+        yield vararg
+        return
+    if name == self.kwarg:
+        kwarg = node_classes.const_factory({})
+        kwarg.parent = self
+        yield kwarg
+        return
+    # if there is a default value, yield it. And then yield YES to reflect
+    # we can't guess given argument value
+    try:
+        context = contextmod.copy_context(context)
+        for inferred in self.default_value(name).infer(context):
+            yield inferred
+        yield util.YES
+    except exceptions.NoDefault:
+        yield util.YES
+
+
+def arguments_assigned_stmts(self, node=None, context=None, asspath=None):
+    if context.callcontext:
+        # reset call context/name
+        callcontext = context.callcontext
+        context = contextmod.copy_context(context)
+        context.callcontext = None
+        args = arguments.CallSite(callcontext)
+        return args.infer_argument(self.parent, node.name, context)
+    return _arguments_infer_argname(self, node.name, context)
+
+nodes.Arguments.assigned_stmts = arguments_assigned_stmts
+
+
+@bases.raise_if_nothing_inferred
+def assign_assigned_stmts(self, node=None, context=None, asspath=None):
+    if not asspath:
+        yield self.value
+        return
+    for inferred in _resolve_asspart(self.value.infer(context), asspath, context):
+        yield inferred
+
+nodes.Assign.assigned_stmts = assign_assigned_stmts
+nodes.AugAssign.assigned_stmts = assign_assigned_stmts
+
+
+def _resolve_asspart(parts, asspath, context):
+    """recursive function to resolve multiple assignments"""
+    asspath = asspath[:]
+    index = asspath.pop(0)
+    for part in parts:
+        if hasattr(part, 'getitem'):
+            try:
+                assigned = part.getitem(index, context)
+            # XXX raise a specific exception to avoid potential hiding of
+            # unexpected exception ?
+            except (TypeError, IndexError):
+                return
+            if not asspath:
+                # we achieved to resolved the assignment path, don't infer the
+                # last part
+                yield assigned
+            elif assigned is util.YES:
+                return
+            else:
+                # we are not yet on the last part of the path search on each
+                # possibly inferred value
+                try:
+                    for inferred in _resolve_asspart(assigned.infer(context),
+                                                    asspath, context):
+                        yield inferred
+                except exceptions.InferenceError:
+                    return
+
+
+@bases.raise_if_nothing_inferred
+def excepthandler_assigned_stmts(self, node=None, context=None, asspath=None):
+    for assigned in node_classes.unpack_infer(self.type):
+        if isinstance(assigned, nodes.ClassDef):
+            assigned = bases.Instance(assigned)
+        yield assigned
+nodes.ExceptHandler.assigned_stmts = bases.raise_if_nothing_inferred(excepthandler_assigned_stmts)
+
+
+@bases.raise_if_nothing_inferred
+def with_assigned_stmts(self, node=None, context=None, asspath=None):
+    if asspath is None:
+        for _, vars in self.items:
+            if vars is None:
+                continue
+            for lst in vars.infer(context):
+                if isinstance(lst, (nodes.Tuple, nodes.List)):
+                    for item in lst.nodes:
+                        yield item
+nodes.With.assigned_stmts = with_assigned_stmts
+
+
+@bases.yes_if_nothing_inferred
+def starred_assigned_stmts(self, node=None, context=None, asspath=None):
+    stmt = self.statement()
+    if not isinstance(stmt, (nodes.Assign, nodes.For)):
+        raise exceptions.InferenceError()
+
+    if isinstance(stmt, nodes.Assign):
+        value = stmt.value
+        lhs = stmt.targets[0]
+
+        if sum(1 for node in lhs.nodes_of_class(nodes.Starred)) > 1:
+            # Too many starred arguments in the expression.
+            raise exceptions.InferenceError()
+
+        if context is None:
+            context = contextmod.InferenceContext()
+        try:
+            rhs = next(value.infer(context))
+        except exceptions.InferenceError:
+            yield util.YES
+            return
+        if rhs is util.YES or not hasattr(rhs, 'elts'):
+            # Not interested in inferred values without elts.
+            yield util.YES
+            return
+
+        elts = collections.deque(rhs.elts[:])
+        if len(lhs.elts) > len(rhs.elts):
+            # a, *b, c = (1, 2)
+            raise exceptions.InferenceError()
+
+        # Unpack iteratively the values from the rhs of the assignment,
+        # until the find the starred node. What will remain will
+        # be the list of values which the Starred node will represent
+        # This is done in two steps, from left to right to remove
+        # anything before the starred node and from right to left
+        # to remvoe anything after the starred node.
+
+        for index, node in enumerate(lhs.elts):
+            if not isinstance(node, nodes.Starred):
+                elts.popleft()
+                continue
+            lhs_elts = collections.deque(reversed(lhs.elts[index:]))
+            for node in lhs_elts:
+                if not isinstance(node, nodes.Starred):
+                    elts.pop()
+                    continue
+                # We're done
+                packed = nodes.List()
+                packed.elts = elts
+                packed.parent = self
+                yield packed
+                break
+
+nodes.Starred.assigned_stmts = starred_assigned_stmts
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/context.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/context.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/context.py	(revision 1126)
@@ -0,0 +1,81 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+"""Various context related utilities, including inference and call contexts."""
+
+import contextlib
+
+
+class InferenceContext(object):
+    __slots__ = ('path', 'lookupname', 'callcontext', 'boundnode', 'inferred')
+
+    def __init__(self, path=None, inferred=None):
+        self.path = path or set()
+        self.lookupname = None
+        self.callcontext = None
+        self.boundnode = None
+        self.inferred = inferred or {}
+
+    def push(self, node):
+        name = self.lookupname
+        if (node, name) in self.path:
+            raise StopIteration()
+        self.path.add((node, name))
+
+    def clone(self):
+        # XXX copy lookupname/callcontext ?
+        clone = InferenceContext(self.path, inferred=self.inferred)
+        clone.callcontext = self.callcontext
+        clone.boundnode = self.boundnode
+        return clone
+
+    def cache_generator(self, key, generator):
+        results = []
+        for result in generator:
+            results.append(result)
+            yield result
+
+        self.inferred[key] = tuple(results)
+        return
+
+    @contextlib.contextmanager
+    def restore_path(self):
+        path = set(self.path)
+        yield
+        self.path = path
+
+
+class CallContext(object):
+    """Holds information for a call site."""
+
+    __slots__ = ('args', 'keywords')
+
+    def __init__(self, args, keywords=None):
+        self.args = args
+        if keywords:
+            keywords = [(arg.arg, arg.value) for arg in keywords]
+        else:
+            keywords = []
+        self.keywords = keywords
+
+
+def copy_context(context):
+    if context is not None:
+        return context.clone()
+    else:
+        return InferenceContext()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/builder.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/builder.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/builder.py	(revision 1126)
@@ -0,0 +1,263 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""The AstroidBuilder makes astroid from living object and / or from _ast
+
+The builder is not thread safe and can't be used to parse different sources
+at the same time.
+"""
+from __future__ import with_statement
+
+import _ast
+import os
+import sys
+import textwrap
+
+from astroid import bases
+from astroid import exceptions
+from astroid import manager
+from astroid import modutils
+from astroid import raw_building
+from astroid import rebuilder
+from astroid import util
+
+
+def _parse(string):
+    return compile(string, "<string>", 'exec', _ast.PyCF_ONLY_AST)
+
+
+if sys.version_info >= (3, 0):
+    # pylint: disable=no-name-in-module; We don't understand flows yet.
+    from tokenize import detect_encoding
+
+    def open_source_file(filename):
+        with open(filename, 'rb') as byte_stream:
+            encoding = detect_encoding(byte_stream.readline)[0]
+        stream = open(filename, 'r', newline=None, encoding=encoding)
+        try:
+            data = stream.read()
+        except UnicodeError:  # wrong encoding
+            # detect_encoding returns utf-8 if no encoding specified
+            msg = 'Wrong (%s) or no encoding specified' % encoding
+            raise exceptions.AstroidBuildingException(msg)
+        return stream, encoding, data
+
+else:
+    import re
+
+    _ENCODING_RGX = re.compile(r"\s*#+.*coding[:=]\s*([-\w.]+)")
+
+    def _guess_encoding(string):
+        """get encoding from a python file as string or return None if not found"""
+        # check for UTF-8 byte-order mark
+        if string.startswith('\xef\xbb\xbf'):
+            return 'UTF-8'
+        for line in string.split('\n', 2)[:2]:
+            # check for encoding declaration
+            match = _ENCODING_RGX.match(line)
+            if match is not None:
+                return match.group(1)
+
+    def open_source_file(filename):
+        """get data for parsing a file"""
+        stream = open(filename, 'U')
+        data = stream.read()
+        encoding = _guess_encoding(data)
+        return stream, encoding, data
+
+
+MANAGER = manager.AstroidManager()
+
+
+class AstroidBuilder(raw_building.InspectBuilder):
+    """Class for building an astroid tree from source code or from a live module.
+
+    The param *manager* specifies the manager class which should be used.
+    If no manager is given, then the default one will be used. The
+    param *apply_transforms* determines if the transforms should be
+    applied after the tree was built from source or from a live object,
+    by default being True.
+    """
+
+    def __init__(self, manager=None, apply_transforms=True):
+        super(AstroidBuilder, self).__init__()
+        self._manager = manager or MANAGER
+        self._apply_transforms = apply_transforms
+
+    def module_build(self, module, modname=None):
+        """Build an astroid from a living module instance."""
+        node = None
+        path = getattr(module, '__file__', None)
+        if path is not None:
+            path_, ext = os.path.splitext(modutils._path_from_filename(path))
+            if ext in ('.py', '.pyc', '.pyo') and os.path.exists(path_ + '.py'):
+                node = self.file_build(path_ + '.py', modname)
+        if node is None:
+            # this is a built-in module
+            # get a partial representation by introspection
+            node = self.inspect_build(module, modname=modname, path=path)
+            if self._apply_transforms:
+                # We have to handle transformation by ourselves since the
+                # rebuilder isn't called for builtin nodes
+                node = self._manager.visit_transforms(node)
+        return node
+
+    def file_build(self, path, modname=None):
+        """Build astroid from a source code file (i.e. from an ast)
+
+        *path* is expected to be a python source file
+        """
+        try:
+            stream, encoding, data = open_source_file(path)
+        except IOError as exc:
+            msg = 'Unable to load file %r (%s)' % (path, exc)
+            raise exceptions.AstroidBuildingException(msg)
+        except SyntaxError as exc:  # py3k encoding specification error
+            raise exceptions.AstroidBuildingException(exc)
+        except LookupError as exc:  # unknown encoding
+            raise exceptions.AstroidBuildingException(exc)
+        with stream:
+            # get module name if necessary
+            if modname is None:
+                try:
+                    modname = '.'.join(modutils.modpath_from_file(path))
+                except ImportError:
+                    modname = os.path.splitext(os.path.basename(path))[0]
+            # build astroid representation
+            module = self._data_build(data, modname, path)
+            return self._post_build(module, encoding)
+
+    def string_build(self, data, modname='', path=None):
+        """Build astroid from source code string."""
+        module = self._data_build(data, modname, path)
+        module.source_code = data.encode('utf-8')
+        return self._post_build(module, 'utf-8')
+
+    def _post_build(self, module, encoding):
+        """Handles encoding and delayed nodes after a module has been built"""
+        module.file_encoding = encoding
+        self._manager.cache_module(module)
+        # post tree building steps after we stored the module in the cache:
+        for from_node in module._import_from_nodes:
+            if from_node.modname == '__future__':
+                for symbol, _ in from_node.names:
+                    module._future_imports.add(symbol)
+            self.add_from_names_to_locals(from_node)
+        # handle delayed assattr nodes
+        for delayed in module._delayed_assattr:
+            self.delayed_assattr(delayed)
+
+        # Visit the transforms
+        if self._apply_transforms:
+            module = self._manager.visit_transforms(module)
+        return module
+
+    def _data_build(self, data, modname, path):
+        """Build tree node from data and add some informations"""
+        try:
+            node = _parse(data + '\n')
+        except (TypeError, ValueError, SyntaxError) as exc:
+            raise exceptions.AstroidBuildingException(exc)
+        if path is not None:
+            node_file = os.path.abspath(path)
+        else:
+            node_file = '<?>'
+        if modname.endswith('.__init__'):
+            modname = modname[:-9]
+            package = True
+        else:
+            package = path and path.find('__init__.py') > -1 or False
+        builder = rebuilder.TreeRebuilder(self._manager)
+        module = builder.visit_module(node, modname, node_file, package)
+        module._import_from_nodes = builder._import_from_nodes
+        module._delayed_assattr = builder._delayed_assattr
+        return module
+
+    def add_from_names_to_locals(self, node):
+        """Store imported names to the locals
+
+        Resort the locals if coming from a delayed node
+        """
+        _key_func = lambda node: node.fromlineno
+        def sort_locals(my_list):
+            my_list.sort(key=_key_func)
+
+        for (name, asname) in node.names:
+            if name == '*':
+                try:
+                    imported = node.do_import_module()
+                except exceptions.InferenceError:
+                    continue
+                for name in imported.wildcard_import_names():
+                    node.parent.set_local(name, node)
+                    sort_locals(node.parent.scope()._locals[name])
+            else:
+                node.parent.set_local(asname or name, node)
+                sort_locals(node.parent.scope()._locals[asname or name])
+
+    def delayed_assattr(self, node):
+        """Visit a AssAttr node
+
+        This adds name to locals and handle members definition.
+        """
+        try:
+            frame = node.frame()
+            for inferred in node.expr.infer():
+                if inferred is util.YES:
+                    continue
+                try:
+                    if inferred.__class__ is bases.Instance:
+                        inferred = inferred._proxied
+                        iattrs = inferred._instance_attrs
+                    elif isinstance(inferred, bases.Instance):
+                        # Const, Tuple, ... we may be wrong, may be not, but
+                        # anyway we don't want to pollute builtin's namespace
+                        continue
+                    elif inferred.is_function:
+                        iattrs = inferred._instance_attrs
+                    else:
+                        iattrs = inferred._locals
+                except AttributeError:
+                    # XXX log error
+                    continue
+                values = iattrs.setdefault(node.attrname, [])
+                if node in values:
+                    continue
+                # get assign in __init__ first XXX useful ?
+                if (frame.name == '__init__' and values and
+                        not values[0].frame().name == '__init__'):
+                    values.insert(0, node)
+                else:
+                    values.append(node)
+        except exceptions.InferenceError:
+            pass
+
+
+def parse(code, module_name='', path=None, apply_transforms=True):
+    """Parses a source string in order to obtain an astroid AST from it
+
+    :param str code: The code for the module.
+    :param str module_name: The name for the module, if any
+    :param str path: The path for the module
+    :param bool apply_transforms:
+        Apply the transforms for the give code. Use it if you
+        don't want the default transforms to be applied.
+    """
+    code = textwrap.dedent(code)
+    builder = AstroidBuilder(manager=MANAGER,
+                             apply_transforms=apply_transforms)
+    return builder.string_build(code, modname=module_name, path=path)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/as_string.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/as_string.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/as_string.py	(revision 1126)
@@ -0,0 +1,548 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""This module renders Astroid nodes as string:
+
+* :func:`to_code` function return equivalent (hopefuly valid) python string
+
+* :func:`dump` function return an internal representation of nodes found
+  in the tree, useful for debugging or understanding the tree structure
+"""
+import sys
+
+import six
+
+INDENT = '    ' # 4 spaces ; keep indentation variable
+
+
+def dump(node, ids=False):
+    """print a nice astroid tree representation.
+
+    :param ids: if true, we also print the ids (usefull for debugging)
+    """
+    result = []
+    _repr_tree(node, result, ids=ids)
+    return "\n".join(result)
+
+def _repr_tree(node, result, indent='', _done=None, ids=False):
+    """built a tree representation of a node as a list of lines"""
+    if _done is None:
+        _done = set()
+    if not hasattr(node, '_astroid_fields'): # not a astroid node
+        return
+    if node in _done:
+        result.append(indent + 'loop in tree: %s' % node)
+        return
+    _done.add(node)
+    node_str = str(node)
+    if ids:
+        node_str += '  . \t%x' % id(node)
+    result.append(indent + node_str)
+    indent += INDENT
+    for field in node._astroid_fields:
+        value = getattr(node, field)
+        if isinstance(value, (list, tuple)):
+            result.append(indent + field + " = [")
+            for child in value:
+                if isinstance(child, (list, tuple)):
+                    # special case for Dict # FIXME
+                    _repr_tree(child[0], result, indent, _done, ids)
+                    _repr_tree(child[1], result, indent, _done, ids)
+                    result.append(indent + ',')
+                else:
+                    _repr_tree(child, result, indent, _done, ids)
+            result.append(indent + "]")
+        else:
+            result.append(indent + field + " = ")
+            _repr_tree(value, result, indent, _done, ids)
+
+
+class AsStringVisitor(object):
+    """Visitor to render an Astroid node as a valid python code string"""
+
+    def __call__(self, node):
+        """Makes this visitor behave as a simple function"""
+        return node.accept(self)
+
+    def _stmt_list(self, stmts):
+        """return a list of nodes to string"""
+        stmts = '\n'.join([nstr for nstr in [n.accept(self) for n in stmts] if nstr])
+        return INDENT + stmts.replace('\n', '\n'+INDENT)
+
+
+    ## visit_<node> methods ###########################################
+
+    def visit_arguments(self, node):
+        """return an astroid.Function node as string"""
+        return node.format_args()
+
+    def visit_assignattr(self, node):
+        """return an astroid.AssAttr node as string"""
+        return self.visit_attribute(node)
+
+    def visit_assert(self, node):
+        """return an astroid.Assert node as string"""
+        if node.fail:
+            return 'assert %s, %s' % (node.test.accept(self),
+                                      node.fail.accept(self))
+        return 'assert %s' % node.test.accept(self)
+
+    def visit_assignname(self, node):
+        """return an astroid.AssName node as string"""
+        return node.name
+
+    def visit_assign(self, node):
+        """return an astroid.Assign node as string"""
+        lhs = ' = '.join([n.accept(self) for n in node.targets])
+        return '%s = %s' % (lhs, node.value.accept(self))
+
+    def visit_augassign(self, node):
+        """return an astroid.AugAssign node as string"""
+        return '%s %s %s' % (node.target.accept(self), node.op, node.value.accept(self))
+
+    def visit_repr(self, node):
+        """return an astroid.Repr node as string"""
+        return '`%s`' % node.value.accept(self)
+
+    def visit_binop(self, node):
+        """return an astroid.BinOp node as string"""
+        return '(%s) %s (%s)' % (node.left.accept(self), node.op, node.right.accept(self))
+
+    def visit_boolop(self, node):
+        """return an astroid.BoolOp node as string"""
+        return (' %s ' % node.op).join(['(%s)' % n.accept(self)
+                                        for n in node.values])
+
+    def visit_break(self, node):
+        """return an astroid.Break node as string"""
+        return 'break'
+
+    def visit_call(self, node):
+        """return an astroid.Call node as string"""
+        expr_str = node.func.accept(self)
+        args = [arg.accept(self) for arg in node.args]
+        if node.keywords:
+            keywords = [kwarg.accept(self) for kwarg in node.keywords]
+        else:
+            keywords = []
+
+        args.extend(keywords)
+        return '%s(%s)' % (expr_str, ', '.join(args))
+
+    def visit_classdef(self, node):
+        """return an astroid.ClassDef node as string"""
+        decorate = node.decorators and node.decorators.accept(self)  or ''
+        bases = ', '.join([n.accept(self) for n in node.bases])
+        if sys.version_info[0] == 2:
+            bases = bases and '(%s)' % bases or ''
+        else:
+            metaclass = node.metaclass()
+            if metaclass and not node.has_metaclass_hack():
+                if bases:
+                    bases = '(%s, metaclass=%s)' % (bases, metaclass.name)
+                else:
+                    bases = '(metaclass=%s)' % metaclass.name
+            else:
+                bases = bases and '(%s)' % bases or ''
+        docs = node.doc and '\n%s"""%s"""' % (INDENT, node.doc) or ''
+        return '\n\n%sclass %s%s:%s\n%s\n' % (decorate, node.name, bases, docs,
+                                              self._stmt_list(node.body))
+
+    def visit_compare(self, node):
+        """return an astroid.Compare node as string"""
+        rhs_str = ' '.join(['%s %s' % (op, expr.accept(self))
+                            for op, expr in node.ops])
+        return '%s %s' % (node.left.accept(self), rhs_str)
+
+    def visit_comprehension(self, node):
+        """return an astroid.Comprehension node as string"""
+        ifs = ''.join([' if %s' % n.accept(self) for n in node.ifs])
+        return 'for %s in %s%s' % (node.target.accept(self),
+                                   node.iter.accept(self), ifs)
+
+    def visit_const(self, node):
+        """return an astroid.Const node as string"""
+        return repr(node.value)
+
+    def visit_continue(self, node):
+        """return an astroid.Continue node as string"""
+        return 'continue'
+
+    def visit_delete(self, node): # XXX check if correct
+        """return an astroid.Delete node as string"""
+        return 'del %s' % ', '.join([child.accept(self)
+                                     for child in node.targets])
+
+    def visit_delattr(self, node):
+        """return an astroid.DelAttr node as string"""
+        return self.visit_attribute(node)
+
+    def visit_delname(self, node):
+        """return an astroid.DelName node as string"""
+        return node.name
+
+    def visit_decorators(self, node):
+        """return an astroid.Decorators node as string"""
+        return '@%s\n' % '\n@'.join([item.accept(self) for item in node.nodes])
+
+    def visit_dict(self, node):
+        """return an astroid.Dict node as string"""
+        return '{%s}' % ', '.join(self._visit_dict(node))
+
+    def _visit_dict(self, node):
+        for key, value in node.items:
+             key = key.accept(self)
+             value = value.accept(self)
+             if key == '**':
+                 # It can only be a DictUnpack node.
+                 yield key + value
+             else:
+                 yield '%s: %s' % (key, value)
+
+    def visit_dictunpack(self, node):
+        return '**'
+
+    def visit_dictcomp(self, node):
+        """return an astroid.DictComp node as string"""
+        return '{%s: %s %s}' % (node.key.accept(self), node.value.accept(self),
+                                ' '.join([n.accept(self) for n in node.generators]))
+
+    def visit_expr(self, node):
+        """return an astroid.Discard node as string"""
+        return node.value.accept(self)
+
+    def visit_emptynode(self, node):
+        """dummy method for visiting an Empty node"""
+        return ''
+
+    def visit_excepthandler(self, node):
+        if node.type:
+            if node.name:
+                excs = 'except %s, %s' % (node.type.accept(self),
+                                          node.name.accept(self))
+            else:
+                excs = 'except %s' % node.type.accept(self)
+        else:
+            excs = 'except'
+        return '%s:\n%s' % (excs, self._stmt_list(node.body))
+
+    def visit_ellipsis(self, node):
+        """return an astroid.Ellipsis node as string"""
+        return '...'
+
+    def visit_empty(self, node):
+        """return an Empty node as string"""
+        return ''
+
+    def visit_exec(self, node):
+        """return an astroid.Exec node as string"""
+        if node.locals:
+            return 'exec %s in %s, %s' % (node.expr.accept(self),
+                                          node.locals.accept(self),
+                                          node.globals.accept(self))
+        if node.globals:
+            return 'exec %s in %s' % (node.expr.accept(self),
+                                      node.globals.accept(self))
+        return 'exec %s' % node.expr.accept(self)
+
+    def visit_extslice(self, node):
+        """return an astroid.ExtSlice node as string"""
+        return ','.join([dim.accept(self) for dim in node.dims])
+
+    def visit_for(self, node):
+        """return an astroid.For node as string"""
+        fors = 'for %s in %s:\n%s' % (node.target.accept(self),
+                                      node.iter.accept(self),
+                                      self._stmt_list(node.body))
+        if node.orelse:
+            fors = '%s\nelse:\n%s' % (fors, self._stmt_list(node.orelse))
+        return fors
+
+    def visit_importfrom(self, node):
+        """return an astroid.ImportFrom node as string"""
+        return 'from %s import %s' % ('.' * (node.level or 0) + node.modname,
+                                      _import_string(node.names))
+
+    def visit_functiondef(self, node):
+        """return an astroid.Function node as string"""
+        decorate = node.decorators and node.decorators.accept(self)  or ''
+        docs = node.doc and '\n%s"""%s"""' % (INDENT, node.doc) or ''
+        return_annotation = ''
+        if six.PY3 and node.returns:
+            return_annotation = '->' + node.returns.as_string()
+            trailer = return_annotation + ":"
+        else:
+            trailer = ":"
+        def_format = "\n%sdef %s(%s)%s%s\n%s"
+        return def_format % (decorate, node.name,
+                             node.args.accept(self),
+                             trailer, docs,
+                             self._stmt_list(node.body))
+
+    def visit_generatorexp(self, node):
+        """return an astroid.GeneratorExp node as string"""
+        return '(%s %s)' % (node.elt.accept(self),
+                            ' '.join([n.accept(self) for n in node.generators]))
+
+    def visit_attribute(self, node):
+        """return an astroid.Getattr node as string"""
+        return '%s.%s' % (node.expr.accept(self), node.attrname)
+
+    def visit_global(self, node):
+        """return an astroid.Global node as string"""
+        return 'global %s' % ', '.join(node.names)
+
+    def visit_if(self, node):
+        """return an astroid.If node as string"""
+        ifs = ['if %s:\n%s' % (node.test.accept(self), self._stmt_list(node.body))]
+        if node.orelse:# XXX use elif ???
+            ifs.append('else:\n%s' % self._stmt_list(node.orelse))
+        return '\n'.join(ifs)
+
+    def visit_ifexp(self, node):
+        """return an astroid.IfExp node as string"""
+        return '%s if %s else %s' % (node.body.accept(self),
+                                     node.test.accept(self),
+                                     node.orelse.accept(self))
+
+    def visit_import(self, node):
+        """return an astroid.Import node as string"""
+        return 'import %s' % _import_string(node.names)
+
+    def visit_keyword(self, node):
+        """return an astroid.Keyword node as string"""
+        if node.arg is None:
+            return '**%s' % node.value.accept(self)
+        return '%s=%s' % (node.arg, node.value.accept(self))
+
+    def visit_lambda(self, node):
+        """return an astroid.Lambda node as string"""
+        return 'lambda %s: %s' % (node.args.accept(self),
+                                  node.body.accept(self))
+
+    def visit_list(self, node):
+        """return an astroid.List node as string"""
+        return '[%s]' % ', '.join([child.accept(self) for child in node.elts])
+
+    def visit_listcomp(self, node):
+        """return an astroid.ListComp node as string"""
+        return '[%s %s]' % (node.elt.accept(self),
+                            ' '.join([n.accept(self) for n in node.generators]))
+
+    def visit_module(self, node):
+        """return an astroid.Module node as string"""
+        docs = node.doc and '"""%s"""\n\n' % node.doc or ''
+        return docs + '\n'.join([n.accept(self) for n in node.body]) + '\n\n'
+
+    def visit_name(self, node):
+        """return an astroid.Name node as string"""
+        return node.name
+
+    def visit_pass(self, node):
+        """return an astroid.Pass node as string"""
+        return 'pass'
+
+    def visit_print(self, node):
+        """return an astroid.Print node as string"""
+        nodes = ', '.join([n.accept(self) for n in node.values])
+        if not node.nl:
+            nodes = '%s,' % nodes
+        if node.dest:
+            return 'print >> %s, %s' % (node.dest.accept(self), nodes)
+        return 'print %s' % nodes
+
+    def visit_raise(self, node):
+        """return an astroid.Raise node as string"""
+        if node.exc:
+            if node.inst:
+                if node.tback:
+                    return 'raise %s, %s, %s' % (node.exc.accept(self),
+                                                 node.inst.accept(self),
+                                                 node.tback.accept(self))
+                return 'raise %s, %s' % (node.exc.accept(self),
+                                         node.inst.accept(self))
+            return 'raise %s' % node.exc.accept(self)
+        return 'raise'
+
+    def visit_return(self, node):
+        """return an astroid.Return node as string"""
+        if node.value:
+            return 'return %s' % node.value.accept(self)
+        else:
+            return 'return'
+
+    def visit_index(self, node):
+        """return a astroid.Index node as string"""
+        return node.value.accept(self)
+
+    def visit_set(self, node):
+        """return an astroid.Set node as string"""
+        return '{%s}' % ', '.join([child.accept(self) for child in node.elts])
+
+    def visit_setcomp(self, node):
+        """return an astroid.SetComp node as string"""
+        return '{%s %s}' % (node.elt.accept(self),
+                            ' '.join([n.accept(self) for n in node.generators]))
+
+    def visit_slice(self, node):
+        """return a astroid.Slice node as string"""
+        lower = node.lower and node.lower.accept(self) or ''
+        upper = node.upper and node.upper.accept(self) or ''
+        step = node.step and node.step.accept(self) or ''
+        if step:
+            return '%s:%s:%s' % (lower, upper, step)
+        return  '%s:%s' % (lower, upper)
+
+    def visit_subscript(self, node):
+        """return an astroid.Subscript node as string"""
+        return '%s[%s]' % (node.value.accept(self), node.slice.accept(self))
+
+    def visit_tryexcept(self, node):
+        """return an astroid.TryExcept node as string"""
+        trys = ['try:\n%s' % self._stmt_list(node.body)]
+        for handler in node.handlers:
+            trys.append(handler.accept(self))
+        if node.orelse:
+            trys.append('else:\n%s' % self._stmt_list(node.orelse))
+        return '\n'.join(trys)
+
+    def visit_tryfinally(self, node):
+        """return an astroid.TryFinally node as string"""
+        return 'try:\n%s\nfinally:\n%s' % (self._stmt_list(node.body),
+                                           self._stmt_list(node.finalbody))
+
+    def visit_tuple(self, node):
+        """return an astroid.Tuple node as string"""
+        if len(node.elts) == 1:
+            return '(%s, )' % node.elts[0].accept(self)
+        return '(%s)' % ', '.join([child.accept(self) for child in node.elts])
+
+    def visit_unaryop(self, node):
+        """return an astroid.UnaryOp node as string"""
+        if node.op == 'not':
+            operator = 'not '
+        else:
+            operator = node.op
+        return '%s%s' % (operator, node.operand.accept(self))
+
+    def visit_while(self, node):
+        """return an astroid.While node as string"""
+        whiles = 'while %s:\n%s' % (node.test.accept(self),
+                                    self._stmt_list(node.body))
+        if node.orelse:
+            whiles = '%s\nelse:\n%s' % (whiles, self._stmt_list(node.orelse))
+        return whiles
+
+    def visit_with(self, node): # 'with' without 'as' is possible
+        """return an astroid.With node as string"""
+        items = ', '.join(('(%s)' % expr.accept(self)) +
+                          (vars and ' as (%s)' % (vars.accept(self)) or '')
+                          for expr, vars in node.items)
+        return 'with %s:\n%s' % (items, self._stmt_list(node.body))
+
+    def visit_yield(self, node):
+        """yield an ast.Yield node as string"""
+        yi_val = node.value and (" " + node.value.accept(self)) or ""
+        expr = 'yield' + yi_val
+        if node.parent.is_statement:
+            return expr
+        else:
+            return "(%s)" % (expr,)
+
+    def visit_starred(self, node):
+        """return Starred node as string"""
+        return "*" + node.value.accept(self)
+
+
+    # These aren't for real AST nodes, but for inference objects.
+
+    def visit_frozenset(self, node):
+        return node.parent.accept(self)
+
+    def visit_super(self, node):
+        return node.parent.accept(self)
+
+    def visit_yes(self, node):
+        return "Uninferable"
+
+
+class AsStringVisitor3k(AsStringVisitor):
+    """AsStringVisitor3k overwrites some AsStringVisitor methods"""
+
+    def visit_excepthandler(self, node):
+        if node.type:
+            if node.name:
+                excs = 'except %s as %s' % (node.type.accept(self),
+                                            node.name.accept(self))
+            else:
+                excs = 'except %s' % node.type.accept(self)
+        else:
+            excs = 'except'
+        return '%s:\n%s' % (excs, self._stmt_list(node.body))
+
+    def visit_nonlocal(self, node):
+        """return an astroid.Nonlocal node as string"""
+        return 'nonlocal %s' % ', '.join(node.names)
+
+    def visit_raise(self, node):
+        """return an astroid.Raise node as string"""
+        if node.exc:
+            if node.cause:
+                return 'raise %s from %s' % (node.exc.accept(self),
+                                             node.cause.accept(self))
+            return 'raise %s' % node.exc.accept(self)
+        return 'raise'
+
+    def visit_yieldfrom(self, node):
+        """ Return an astroid.YieldFrom node as string. """
+        yi_val = node.value and (" " + node.value.accept(self)) or ""
+        expr = 'yield from' + yi_val
+        if node.parent.is_statement:
+            return expr
+        else:
+            return "(%s)" % (expr,)
+
+    def visit_asyncfunctiondef(self, node):
+        function = super(AsStringVisitor3k, self).visit_functiondef(node)
+        return 'async ' + function.strip()
+
+    def visit_await(self, node):
+        return 'await %s' % node.value.accept(self)
+
+    def visit_asyncwith(self, node):
+        return 'async %s' % self.visit_with(node)
+
+    def visit_asyncfor(self, node):
+        return 'async %s' % self.visit_for(node)
+
+
+def _import_string(names):
+    """return a list of (name, asname) formatted as a string"""
+    _names = []
+    for name, asname in names:
+        if asname is not None:
+            _names.append('%s as %s' % (name, asname))
+        else:
+            _names.append(name)
+    return  ', '.join(_names)
+
+
+if sys.version_info >= (3, 0):
+    AsStringVisitor = AsStringVisitor3k
+
+# this visitor is stateless, thus it can be reused
+to_code = AsStringVisitor()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/__pkginfo__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/__pkginfo__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/__pkginfo__.py	(revision 1126)
@@ -0,0 +1,42 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""astroid packaging information"""
+distname = 'astroid'
+
+modname = 'astroid'
+
+numversion = (1, 4, 4)
+version = '.'.join([str(num) for num in numversion])
+
+install_requires = ['six', 'lazy_object_proxy', 'wrapt']
+
+license = 'LGPL'
+
+author = 'Logilab'
+author_email = 'pylint-dev@lists.logilab.org'
+mailinglist = "mailto://%s" % author_email
+web = 'http://bitbucket.org/logilab/astroid'
+
+description = "A abstract syntax tree for Python with inference support."
+
+classifiers = ["Topic :: Software Development :: Libraries :: Python Modules",
+               "Topic :: Software Development :: Quality Assurance",
+               "Programming Language :: Python",
+               "Programming Language :: Python :: 2",
+               "Programming Language :: Python :: 3",
+              ]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/objects.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/objects.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/objects.py	(revision 1126)
@@ -0,0 +1,186 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Inference objects are a way to represent composite AST nodes,
+which are used only as inference results, so they can't be found in the
+code tree. For instance, inferring the following frozenset use, leads to an
+inferred FrozenSet:
+
+    CallFunc(func=Name('frozenset'), args=Tuple(...))
+
+"""
+
+import six
+
+from astroid import MANAGER
+from astroid.bases import (
+    BUILTINS, NodeNG, Instance, _infer_stmts,
+    BoundMethod, _is_property
+)
+from astroid.decorators import cachedproperty
+from astroid.exceptions import (
+    SuperError, SuperArgumentTypeError,
+    NotFoundError, MroError
+)
+from astroid.node_classes import const_factory
+from astroid.scoped_nodes import ClassDef, FunctionDef
+from astroid.mixins import ParentAssignTypeMixin
+
+
+class FrozenSet(NodeNG, Instance, ParentAssignTypeMixin):
+    """class representing a FrozenSet composite node"""
+
+    def __init__(self, elts=None):
+        if elts is None:
+            self.elts = []
+        else:
+            self.elts = [const_factory(e) for e in elts]
+
+    def pytype(self):
+        return '%s.frozenset' % BUILTINS
+
+    def itered(self):
+        return self.elts
+
+    def _infer(self, context=None):
+        yield self
+
+    @cachedproperty
+    def _proxied(self):
+        builtins = MANAGER.astroid_cache[BUILTINS]
+        return builtins.getattr('frozenset')[0]
+
+
+class Super(NodeNG):
+    """Proxy class over a super call.
+
+    This class offers almost the same behaviour as Python's super,
+    which is MRO lookups for retrieving attributes from the parents.
+
+    The *mro_pointer* is the place in the MRO from where we should
+    start looking, not counting it. *mro_type* is the object which
+    provides the MRO, it can be both a type or an instance.
+    *self_class* is the class where the super call is, while
+    *scope* is the function where the super call is.
+    """
+
+    def __init__(self, mro_pointer, mro_type, self_class, scope):
+        self.type = mro_type
+        self.mro_pointer = mro_pointer
+        self._class_based = False
+        self._self_class = self_class
+        self._scope = scope
+        self._model = {
+            '__thisclass__': self.mro_pointer,
+            '__self_class__': self._self_class,
+            '__self__': self.type,
+            '__class__': self._proxied,
+        }
+
+    def _infer(self, context=None):
+        yield self
+
+    def super_mro(self):
+        """Get the MRO which will be used to lookup attributes in this super."""
+        if not isinstance(self.mro_pointer, ClassDef):
+            raise SuperArgumentTypeError("The first super argument must be type.")
+
+        if isinstance(self.type, ClassDef):
+            # `super(type, type)`, most likely in a class method.
+            self._class_based = True
+            mro_type = self.type
+        else:
+            mro_type = getattr(self.type, '_proxied', None)
+            if not isinstance(mro_type, (Instance, ClassDef)):
+                raise SuperArgumentTypeError("super(type, obj): obj must be an "
+                                             "instance or subtype of type")
+
+        if not mro_type.newstyle:
+            raise SuperError("Unable to call super on old-style classes.")
+
+        mro = mro_type.mro()
+        if self.mro_pointer not in mro:
+            raise SuperArgumentTypeError("super(type, obj): obj must be an "
+                                         "instance or subtype of type")
+
+        index = mro.index(self.mro_pointer)
+        return mro[index + 1:]
+
+    @cachedproperty
+    def _proxied(self):
+        builtins = MANAGER.astroid_cache[BUILTINS]
+        return builtins.getattr('super')[0]
+
+    def pytype(self):
+        return '%s.super' % BUILTINS
+
+    def display_type(self):
+        return 'Super of'
+
+    @property
+    def name(self):
+        """Get the name of the MRO pointer."""
+        return self.mro_pointer.name
+
+    def igetattr(self, name, context=None):
+        """Retrieve the inferred values of the given attribute name."""
+
+        local_name = self._model.get(name)
+        if local_name:
+            yield local_name
+            return
+
+        try:
+            mro = self.super_mro()
+        except (MroError, SuperError) as exc:
+            # Don't let invalid MROs or invalid super calls
+            # to leak out as is from this function.
+            six.raise_from(NotFoundError, exc)
+
+        found = False
+        for cls in mro:
+            if name not in cls._locals:
+                continue
+
+            found = True
+            for infered in _infer_stmts([cls[name]], context, frame=self):
+                if not isinstance(infered, FunctionDef):
+                    yield infered
+                    continue
+
+                # We can obtain different descriptors from a super depending
+                # on what we are accessing and where the super call is.
+                if infered.type == 'classmethod':
+                    yield BoundMethod(infered, cls)
+                elif self._scope.type == 'classmethod' and infered.type == 'method':
+                    yield infered
+                elif self._class_based or infered.type == 'staticmethod':
+                    yield infered
+                elif _is_property(infered):
+                    # TODO: support other descriptors as well.
+                    for value in infered.infer_call_result(self, context):
+                        yield value
+                else:
+                    yield BoundMethod(infered, cls)
+
+        if not found:
+            raise NotFoundError(name)
+
+    def getattr(self, name, context=None):
+        return list(self.igetattr(name, context=context))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/bases.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/bases.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/bases.py	(revision 1126)
@@ -0,0 +1,636 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""This module contains base classes and functions for the nodes and some
+inference utils.
+"""
+import functools
+import sys
+import warnings
+
+import wrapt
+
+from astroid import context as contextmod
+from astroid import decorators as decoratorsmod
+from astroid import exceptions
+from astroid import util
+
+
+if sys.version_info >= (3, 0):
+    BUILTINS = 'builtins'
+else:
+    BUILTINS = '__builtin__'
+PROPERTIES = {BUILTINS + '.property', 'abc.abstractproperty'}
+# List of possible property names. We use this list in order
+# to see if a method is a property or not. This should be
+# pretty reliable and fast, the alternative being to check each
+# decorator to see if its a real property-like descriptor, which
+# can be too complicated.
+# Also, these aren't qualified, because each project can
+# define them, we shouldn't expect to know every possible
+# property-like decorator!
+# TODO(cpopa): just implement descriptors already.
+POSSIBLE_PROPERTIES = {"cached_property", "cachedproperty",
+                       "lazyproperty", "lazy_property", "reify",
+                       "lazyattribute", "lazy_attribute",
+                       "LazyProperty", "lazy"}
+
+
+def _is_property(meth):
+    if PROPERTIES.intersection(meth.decoratornames()):
+        return True
+    stripped = {name.split(".")[-1] for name in meth.decoratornames()
+                if name is not util.YES}
+    return any(name in stripped for name in POSSIBLE_PROPERTIES)
+
+
+class Proxy(object):
+    """a simple proxy object"""
+
+    _proxied = None # proxied object may be set by class or by instance
+
+    def __init__(self, proxied=None):
+        if proxied is not None:
+            self._proxied = proxied
+
+    def __getattr__(self, name):
+        if name == '_proxied':
+            return getattr(self.__class__, '_proxied')
+        if name in self.__dict__:
+            return self.__dict__[name]
+        return getattr(self._proxied, name)
+
+    def infer(self, context=None):
+        yield self
+
+
+def _infer_stmts(stmts, context, frame=None):
+    """Return an iterator on statements inferred by each statement in *stmts*."""
+    stmt = None
+    inferred = False
+    if context is not None:
+        name = context.lookupname
+        context = context.clone()
+    else:
+        name = None
+        context = contextmod.InferenceContext()
+
+    for stmt in stmts:
+        if stmt is util.YES:
+            yield stmt
+            inferred = True
+            continue
+        context.lookupname = stmt._infer_name(frame, name)
+        try:
+            for inferred in stmt.infer(context=context):
+                yield inferred
+                inferred = True
+        except exceptions.UnresolvableName:
+            continue
+        except exceptions.InferenceError:
+            yield util.YES
+            inferred = True
+    if not inferred:
+        raise exceptions.InferenceError(str(stmt))
+
+
+class Instance(Proxy):
+    """a special node representing a class instance"""
+    def getattr(self, name, context=None, lookupclass=True):
+        try:
+            values = self._proxied.instance_attr(name, context)
+        except exceptions.NotFoundError:
+            if name == '__class__':
+                return [self._proxied]
+            if lookupclass:
+                # class attributes not available through the instance
+                # unless they are explicitly defined
+                if name in ('__name__', '__bases__', '__mro__', '__subclasses__'):
+                    return self._proxied.local_attr(name)
+                return self._proxied.getattr(name, context)
+            raise exceptions.NotFoundError(name)
+        # since we've no context information, return matching class members as
+        # well
+        if lookupclass:
+            try:
+                return values + self._proxied.getattr(name, context)
+            except exceptions.NotFoundError:
+                pass
+        return values
+
+    def igetattr(self, name, context=None):
+        """inferred getattr"""
+        if not context:
+            context = contextmod.InferenceContext()
+        try:
+            # avoid recursively inferring the same attr on the same class
+            context.push((self._proxied, name))
+            # XXX frame should be self._proxied, or not ?
+            get_attr = self.getattr(name, context, lookupclass=False)
+            return _infer_stmts(
+                self._wrap_attr(get_attr, context),
+                context,
+                frame=self,
+            )
+        except exceptions.NotFoundError:
+            try:
+                # fallback to class'igetattr since it has some logic to handle
+                # descriptors
+                return self._wrap_attr(self._proxied.igetattr(name, context),
+                                       context)
+            except exceptions.NotFoundError:
+                raise exceptions.InferenceError(name)
+
+    def _wrap_attr(self, attrs, context=None):
+        """wrap bound methods of attrs in a InstanceMethod proxies"""
+        for attr in attrs:
+            if isinstance(attr, UnboundMethod):
+                if _is_property(attr):
+                    for inferred in attr.infer_call_result(self, context):
+                        yield inferred
+                else:
+                    yield BoundMethod(attr, self)
+            elif hasattr(attr, 'name') and attr.name == '<lambda>':
+                # This is a lambda function defined at class level,
+                # since its scope is the underlying _proxied class.
+                # Unfortunately, we can't do an isinstance check here,
+                # because of the circular dependency between astroid.bases
+                # and astroid.scoped_nodes.
+                if attr.statement().scope() == self._proxied:
+                    if attr.args.args and attr.args.args[0].name == 'self':
+                        yield BoundMethod(attr, self)
+                        continue
+                yield attr
+            else:
+                yield attr
+
+    def infer_call_result(self, caller, context=None):
+        """infer what a class instance is returning when called"""
+        inferred = False
+        for node in self._proxied.igetattr('__call__', context):
+            if node is util.YES or not node.callable():
+                continue
+            for res in node.infer_call_result(caller, context):
+                inferred = True
+                yield res
+        if not inferred:
+            raise exceptions.InferenceError()
+
+    def __repr__(self):
+        return '<Instance of %s.%s at 0x%s>' % (self._proxied.root().name,
+                                                self._proxied.name,
+                                                id(self))
+    def __str__(self):
+        return 'Instance of %s.%s' % (self._proxied.root().name,
+                                      self._proxied.name)
+
+    def callable(self):
+        try:
+            self._proxied.getattr('__call__')
+            return True
+        except exceptions.NotFoundError:
+            return False
+
+    def pytype(self):
+        return self._proxied.qname()
+
+    def display_type(self):
+        return 'Instance of'
+
+
+    # TODO(cpopa): this is set in inference.py
+    # The circular dependency hell goes deeper and deeper.
+    # pylint: disable=unused-argument
+    def getitem(self, index, context=None):
+        pass
+
+class UnboundMethod(Proxy):
+    """a special node representing a method not bound to an instance"""
+    def __repr__(self):
+        frame = self._proxied.parent.frame()
+        return '<%s %s of %s at 0x%s' % (self.__class__.__name__,
+                                         self._proxied.name,
+                                         frame.qname(), id(self))
+
+    def is_bound(self):
+        return False
+
+    def getattr(self, name, context=None):
+        if name == 'im_func':
+            return [self._proxied]
+        return self._proxied.getattr(name, context)
+
+    def igetattr(self, name, context=None):
+        if name == 'im_func':
+            return iter((self._proxied,))
+        return self._proxied.igetattr(name, context)
+
+    def infer_call_result(self, caller, context):
+        # If we're unbound method __new__ of builtin object, the result is an
+        # instance of the class given as first argument.
+        if (self._proxied.name == '__new__' and
+                self._proxied.parent.frame().qname() == '%s.object' % BUILTINS):
+            infer = caller.args[0].infer() if caller.args else []
+            return ((x is util.YES and x or Instance(x)) for x in infer)
+        return self._proxied.infer_call_result(caller, context)
+
+
+class BoundMethod(UnboundMethod):
+    """a special node representing a method bound to an instance"""
+    def __init__(self, proxy, bound):
+        UnboundMethod.__init__(self, proxy)
+        self.bound = bound
+
+    def is_bound(self):
+        return True
+
+    def infer_call_result(self, caller, context=None):
+
+        if context is None:
+            context = contextmod.InferenceContext()
+        context = context.clone()
+        context.boundnode = self.bound
+        return super(BoundMethod, self).infer_call_result(caller, context)
+
+
+class Generator(Instance):
+    """a special node representing a generator.
+
+    Proxied class is set once for all in raw_building.
+    """
+    def callable(self):
+        return False
+
+    def pytype(self):
+        return '%s.generator' % BUILTINS
+
+    def display_type(self):
+        return 'Generator'
+
+    def __repr__(self):
+        return '<Generator(%s) l.%s at 0x%s>' % (self._proxied.name, self.lineno, id(self))
+
+    def __str__(self):
+        return 'Generator(%s)' % (self._proxied.name)
+
+
+# decorators ##################################################################
+
+def path_wrapper(func):
+    """return the given infer function wrapped to handle the path"""
+    @functools.wraps(func)
+    def wrapped(node, context=None, _func=func, **kwargs):
+        """wrapper function handling context"""
+        if context is None:
+            context = contextmod.InferenceContext()
+        context.push(node)
+        yielded = set()
+        for res in _func(node, context, **kwargs):
+            # unproxy only true instance, not const, tuple, dict...
+            if res.__class__ is Instance:
+                ares = res._proxied
+            else:
+                ares = res
+            if ares not in yielded:
+                yield res
+                yielded.add(ares)
+    return wrapped
+
+@wrapt.decorator
+def yes_if_nothing_inferred(func, instance, args, kwargs):
+    inferred = False
+    for node in func(*args, **kwargs):
+        inferred = True
+        yield node
+    if not inferred:
+        yield util.YES
+
+@wrapt.decorator
+def raise_if_nothing_inferred(func, instance, args, kwargs):
+    inferred = False
+    for node in func(*args, **kwargs):
+        inferred = True
+        yield node
+    if not inferred:
+        raise exceptions.InferenceError()
+
+
+# Node  ######################################################################
+
+class NodeNG(object):
+    """Base Class for all Astroid node classes.
+
+    It represents a node of the new abstract syntax tree.
+    """
+    is_statement = False
+    optional_assign = False # True for For (and for Comprehension if py <3.0)
+    is_function = False # True for FunctionDef nodes
+    # attributes below are set by the builder module or by raw factories
+    lineno = None
+    fromlineno = None
+    tolineno = None
+    col_offset = None
+    # parent node in the tree
+    parent = None
+    # attributes containing child node(s) redefined in most concrete classes:
+    _astroid_fields = ()
+    # instance specific inference function infer(node, context)
+    _explicit_inference = None
+
+    def infer(self, context=None, **kwargs):
+        """main interface to the interface system, return a generator on infered
+        values.
+
+        If the instance has some explicit inference function set, it will be
+        called instead of the default interface.
+        """
+        if self._explicit_inference is not None:
+            # explicit_inference is not bound, give it self explicitly
+            try:
+                return self._explicit_inference(self, context, **kwargs)
+            except exceptions.UseInferenceDefault:
+                pass
+
+        if not context:
+            return self._infer(context, **kwargs)
+
+        key = (self, context.lookupname,
+               context.callcontext, context.boundnode)
+        if key in context.inferred:
+            return iter(context.inferred[key])
+
+        return context.cache_generator(key, self._infer(context, **kwargs))
+
+    def _repr_name(self):
+        """return self.name or self.attrname or '' for nice representation"""
+        return getattr(self, 'name', getattr(self, 'attrname', ''))
+
+    def __str__(self):
+        return '%s(%s)' % (self.__class__.__name__, self._repr_name())
+
+    def __repr__(self):
+        return '<%s(%s) l.%s [%s] at 0x%x>' % (self.__class__.__name__,
+                                               self._repr_name(),
+                                               self.fromlineno,
+                                               self.root().name,
+                                               id(self))
+
+
+    def accept(self, visitor):
+        func = getattr(visitor, "visit_" + self.__class__.__name__.lower())
+        return func(self)
+
+    def get_children(self):
+        for field in self._astroid_fields:
+            attr = getattr(self, field)
+            if attr is None:
+                continue
+            if isinstance(attr, (list, tuple)):
+                for elt in attr:
+                    yield elt
+            else:
+                yield attr
+
+    def last_child(self):
+        """an optimized version of list(get_children())[-1]"""
+        for field in self._astroid_fields[::-1]:
+            attr = getattr(self, field)
+            if not attr: # None or empty listy / tuple
+                continue
+            if isinstance(attr, (list, tuple)):
+                return attr[-1]
+            else:
+                return attr
+        return None
+
+    def parent_of(self, node):
+        """return true if i'm a parent of the given node"""
+        parent = node.parent
+        while parent is not None:
+            if self is parent:
+                return True
+            parent = parent.parent
+        return False
+
+    def statement(self):
+        """return the first parent node marked as statement node"""
+        if self.is_statement:
+            return self
+        return self.parent.statement()
+
+    def frame(self):
+        """return the first parent frame node (i.e. Module, FunctionDef or
+        ClassDef)
+
+        """
+        return self.parent.frame()
+
+    def scope(self):
+        """return the first node defining a new scope (i.e. Module,
+        FunctionDef, ClassDef, Lambda but also GenExpr)
+
+        """
+        return self.parent.scope()
+
+    def root(self):
+        """return the root node of the tree, (i.e. a Module)"""
+        if self.parent:
+            return self.parent.root()
+        return self
+
+    def child_sequence(self, child):
+        """search for the right sequence where the child lies in"""
+        for field in self._astroid_fields:
+            node_or_sequence = getattr(self, field)
+            if node_or_sequence is child:
+                return [node_or_sequence]
+            # /!\ compiler.ast Nodes have an __iter__ walking over child nodes
+            if (isinstance(node_or_sequence, (tuple, list))
+                    and child in node_or_sequence):
+                return node_or_sequence
+
+        msg = 'Could not find %s in %s\'s children'
+        raise exceptions.AstroidError(msg % (repr(child), repr(self)))
+
+    def locate_child(self, child):
+        """return a 2-uple (child attribute name, sequence or node)"""
+        for field in self._astroid_fields:
+            node_or_sequence = getattr(self, field)
+            # /!\ compiler.ast Nodes have an __iter__ walking over child nodes
+            if child is node_or_sequence:
+                return field, child
+            if isinstance(node_or_sequence, (tuple, list)) and child in node_or_sequence:
+                return field, node_or_sequence
+        msg = 'Could not find %s in %s\'s children'
+        raise exceptions.AstroidError(msg % (repr(child), repr(self)))
+    # FIXME : should we merge child_sequence and locate_child ? locate_child
+    # is only used in are_exclusive, child_sequence one time in pylint.
+
+    def next_sibling(self):
+        """return the next sibling statement"""
+        return self.parent.next_sibling()
+
+    def previous_sibling(self):
+        """return the previous sibling statement"""
+        return self.parent.previous_sibling()
+
+    def nearest(self, nodes):
+        """return the node which is the nearest before this one in the
+        given list of nodes
+        """
+        myroot = self.root()
+        mylineno = self.fromlineno
+        nearest = None, 0
+        for node in nodes:
+            assert node.root() is myroot, \
+                   'nodes %s and %s are not from the same module' % (self, node)
+            lineno = node.fromlineno
+            if node.fromlineno > mylineno:
+                break
+            if lineno > nearest[1]:
+                nearest = node, lineno
+        # FIXME: raise an exception if nearest is None ?
+        return nearest[0]
+
+    # these are lazy because they're relatively expensive to compute for every
+    # single node, and they rarely get looked at
+
+    @decoratorsmod.cachedproperty
+    def fromlineno(self):
+        if self.lineno is None:
+            return self._fixed_source_line()
+        else:
+            return self.lineno
+
+    @decoratorsmod.cachedproperty
+    def tolineno(self):
+        if not self._astroid_fields:
+            # can't have children
+            lastchild = None
+        else:
+            lastchild = self.last_child()
+        if lastchild is None:
+            return self.fromlineno
+        else:
+            return lastchild.tolineno
+
+        # TODO / FIXME:
+        assert self.fromlineno is not None, self
+        assert self.tolineno is not None, self
+
+    def _fixed_source_line(self):
+        """return the line number where the given node appears
+
+        we need this method since not all nodes have the lineno attribute
+        correctly set...
+        """
+        line = self.lineno
+        _node = self
+        try:
+            while line is None:
+                _node = next(_node.get_children())
+                line = _node.lineno
+        except StopIteration:
+            _node = self.parent
+            while _node and line is None:
+                line = _node.lineno
+                _node = _node.parent
+        return line
+
+    def block_range(self, lineno):
+        """handle block line numbers range for non block opening statements
+        """
+        return lineno, self.tolineno
+
+    def set_local(self, name, stmt):
+        """delegate to a scoped parent handling a locals dictionary"""
+        self.parent.set_local(name, stmt)
+
+    def nodes_of_class(self, klass, skip_klass=None):
+        """return an iterator on nodes which are instance of the given class(es)
+
+        klass may be a class object or a tuple of class objects
+        """
+        if isinstance(self, klass):
+            yield self
+        for child_node in self.get_children():
+            if skip_klass is not None and isinstance(child_node, skip_klass):
+                continue
+            for matching in child_node.nodes_of_class(klass, skip_klass):
+                yield matching
+
+    def _infer_name(self, frame, name):
+        # overridden for ImportFrom, Import, Global, TryExcept and Arguments
+        return None
+
+    def _infer(self, context=None):
+        """we don't know how to resolve a statement by default"""
+        # this method is overridden by most concrete classes
+        raise exceptions.InferenceError(self.__class__.__name__)
+
+    def inferred(self):
+        '''return list of inferred values for a more simple inference usage'''
+        return list(self.infer())
+
+    def infered(self):
+        warnings.warn('%s.infered() is deprecated and slated for removal '
+                      'in astroid 2.0, use %s.inferred() instead.'
+                      % (type(self).__name__, type(self).__name__),
+                      PendingDeprecationWarning, stacklevel=2)
+        return self.inferred()
+
+    def instanciate_class(self):
+        """instanciate a node if it is a ClassDef node, else return self"""
+        return self
+
+    def has_base(self, node):
+        return False
+
+    def callable(self):
+        return False
+
+    def eq(self, value):
+        return False
+
+    def as_string(self):
+        from astroid.as_string import to_code
+        return to_code(self)
+
+    def repr_tree(self, ids=False):
+        from astroid.as_string import dump
+        return dump(self)
+
+
+class Statement(NodeNG):
+    """Statement node adding a few attributes"""
+    is_statement = True
+
+    def next_sibling(self):
+        """return the next sibling statement"""
+        stmts = self.parent.child_sequence(self)
+        index = stmts.index(self)
+        try:
+            return stmts[index +1]
+        except IndexError:
+            pass
+
+    def previous_sibling(self):
+        """return the previous sibling statement"""
+        stmts = self.parent.child_sequence(self)
+        index = stmts.index(self)
+        if index >= 1:
+            return stmts[index -1]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/inference.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/inference.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/inference.py	(revision 1126)
@@ -0,0 +1,359 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""this module contains a set of functions to handle inference on astroid trees
+"""
+
+from __future__ import print_function
+
+from astroid import bases
+from astroid import context as contextmod
+from astroid import exceptions
+from astroid import manager
+from astroid import nodes
+from astroid import protocols
+from astroid import util
+
+
+MANAGER = manager.AstroidManager()
+
+
+# .infer method ###############################################################
+
+
+def infer_end(self, context=None):
+    """inference's end for node such as Module, ClassDef, FunctionDef,
+    Const...
+
+    """
+    yield self
+nodes.Module._infer = infer_end
+nodes.ClassDef._infer = infer_end
+nodes.FunctionDef._infer = infer_end
+nodes.Lambda._infer = infer_end
+nodes.Const._infer = infer_end
+nodes.List._infer = infer_end
+nodes.Tuple._infer = infer_end
+nodes.Dict._infer = infer_end
+nodes.Set._infer = infer_end
+
+def _higher_function_scope(node):
+    """ Search for the first function which encloses the given
+    scope. This can be used for looking up in that function's
+    scope, in case looking up in a lower scope for a particular
+    name fails.
+
+    :param node: A scope node.
+    :returns:
+        ``None``, if no parent function scope was found,
+        otherwise an instance of :class:`astroid.scoped_nodes.Function`,
+        which encloses the given node.
+    """
+    current = node
+    while current.parent and not isinstance(current.parent, nodes.FunctionDef):
+        current = current.parent
+    if current and current.parent:
+        return current.parent
+
+def infer_name(self, context=None):
+    """infer a Name: use name lookup rules"""
+    frame, stmts = self.lookup(self.name)
+    if not stmts:
+        # Try to see if the name is enclosed in a nested function
+        # and use the higher (first function) scope for searching.
+        # TODO: should this be promoted to other nodes as well?
+        parent_function = _higher_function_scope(self.scope())
+        if parent_function:
+            _, stmts = parent_function.lookup(self.name)
+
+        if not stmts:
+            raise exceptions.UnresolvableName(self.name)
+    context = context.clone()
+    context.lookupname = self.name
+    return bases._infer_stmts(stmts, context, frame)
+nodes.Name._infer = bases.path_wrapper(infer_name)
+nodes.AssignName.infer_lhs = infer_name # won't work with a path wrapper
+
+
+@bases.path_wrapper
+@bases.raise_if_nothing_inferred
+def infer_call(self, context=None):
+    """infer a Call node by trying to guess what the function returns"""
+    callcontext = context.clone()
+    callcontext.callcontext = contextmod.CallContext(args=self.args,
+                                                     keywords=self.keywords)
+    callcontext.boundnode = None
+    for callee in self.func.infer(context):
+        if callee is util.YES:
+            yield callee
+            continue
+        try:
+            if hasattr(callee, 'infer_call_result'):
+                for inferred in callee.infer_call_result(self, callcontext):
+                    yield inferred
+        except exceptions.InferenceError:
+            ## XXX log error ?
+            continue
+nodes.Call._infer = infer_call
+
+
+@bases.path_wrapper
+def infer_import(self, context=None, asname=True):
+    """infer an Import node: return the imported module/object"""
+    name = context.lookupname
+    if name is None:
+        raise exceptions.InferenceError()
+    if asname:
+        yield self.do_import_module(self.real_name(name))
+    else:
+        yield self.do_import_module(name)
+nodes.Import._infer = infer_import
+
+
+def infer_name_module(self, name):
+    context = contextmod.InferenceContext()
+    context.lookupname = name
+    return self.infer(context, asname=False)
+nodes.Import.infer_name_module = infer_name_module
+
+
+@bases.path_wrapper
+def infer_import_from(self, context=None, asname=True):
+    """infer a ImportFrom node: return the imported module/object"""
+    name = context.lookupname
+    if name is None:
+        raise exceptions.InferenceError()
+    if asname:
+        name = self.real_name(name)
+    module = self.do_import_module()
+    try:
+        context = contextmod.copy_context(context)
+        context.lookupname = name
+        stmts = module.getattr(name, ignore_locals=module is self.root())
+        return bases._infer_stmts(stmts, context)
+    except exceptions.NotFoundError:
+        raise exceptions.InferenceError(name)
+nodes.ImportFrom._infer = infer_import_from
+
+
+@bases.raise_if_nothing_inferred
+def infer_attribute(self, context=None):
+    """infer an Attribute node by using getattr on the associated object"""
+    for owner in self.expr.infer(context):
+        if owner is util.YES:
+            yield owner
+            continue
+        try:
+            context.boundnode = owner
+            for obj in owner.igetattr(self.attrname, context):
+                yield obj
+            context.boundnode = None
+        except (exceptions.NotFoundError, exceptions.InferenceError):
+            context.boundnode = None
+        except AttributeError:
+            # XXX method / function
+            context.boundnode = None
+nodes.Attribute._infer = bases.path_wrapper(infer_attribute)
+nodes.AssignAttr.infer_lhs = infer_attribute # # won't work with a path wrapper
+
+
+@bases.path_wrapper
+def infer_global(self, context=None):
+    if context.lookupname is None:
+        raise exceptions.InferenceError()
+    try:
+        return bases._infer_stmts(self.root().getattr(context.lookupname),
+                                  context)
+    except exceptions.NotFoundError:
+        raise exceptions.InferenceError()
+nodes.Global._infer = infer_global
+
+
+@bases.raise_if_nothing_inferred
+def infer_subscript(self, context=None):
+    """Inference for subscripts
+
+    We're understanding if the index is a Const
+    or a slice, passing the result of inference
+    to the value's `getitem` method, which should
+    handle each supported index type accordingly.
+    """
+
+    value = next(self.value.infer(context))
+    if value is util.YES:
+        yield util.YES
+        return
+
+    index = next(self.slice.infer(context))
+    if index is util.YES:
+        yield util.YES
+        return
+
+    if isinstance(index, nodes.Const):
+        try:
+            assigned = value.getitem(index.value, context)
+        except AttributeError:
+            raise exceptions.InferenceError()
+        except (IndexError, TypeError):
+            yield util.YES
+            return
+
+        # Prevent inferring if the infered subscript
+        # is the same as the original subscripted object.
+        if self is assigned or assigned is util.YES:
+            yield util.YES
+            return
+        for infered in assigned.infer(context):
+            yield infered
+    else:
+        raise exceptions.InferenceError()
+nodes.Subscript._infer = bases.path_wrapper(infer_subscript)
+nodes.Subscript.infer_lhs = infer_subscript
+
+@bases.raise_if_nothing_inferred
+def infer_unaryop(self, context=None):
+    for operand in self.operand.infer(context):
+        try:
+            yield operand.infer_unary_op(self.op)
+        except TypeError:
+            continue
+        except AttributeError:
+            meth = protocols.UNARY_OP_METHOD[self.op]
+            if meth is None:
+                yield util.YES
+            else:
+                try:
+                    # XXX just suppose if the type implement meth, returned type
+                    # will be the same
+                    operand.getattr(meth)
+                    yield operand
+                except GeneratorExit:
+                    raise
+                except:
+                    yield util.YES
+nodes.UnaryOp._infer = bases.path_wrapper(infer_unaryop)
+
+def _infer_binop(operator, operand1, operand2, context, failures=None):
+    if operand1 is util.YES:
+        yield operand1
+        return
+    try:
+        for valnode in operand1.infer_binary_op(operator, operand2, context):
+            yield valnode
+    except AttributeError:
+        try:
+            # XXX just suppose if the type implement meth, returned type
+            # will be the same
+            operand1.getattr(protocols.BIN_OP_METHOD[operator])
+            yield operand1
+        except:
+            if failures is None:
+                yield util.YES
+            else:
+                failures.append(operand1)
+
+@bases.yes_if_nothing_inferred
+def infer_binop(self, context=None):
+    failures = []
+    for lhs in self.left.infer(context):
+        for val in _infer_binop(self.op, lhs, self.right, context, failures):
+            yield val
+    for lhs in failures:
+        for rhs in self.right.infer(context):
+            for val in _infer_binop(self.op, rhs, lhs, context):
+                yield val
+nodes.BinOp._infer = bases.path_wrapper(infer_binop)
+
+
+def infer_arguments(self, context=None):
+    name = context.lookupname
+    if name is None:
+        raise exceptions.InferenceError()
+    return protocols._arguments_infer_argname(self, name, context)
+nodes.Arguments._infer = infer_arguments
+
+
+@bases.path_wrapper
+def infer_assign(self, context=None):
+    """infer a AssignName/AssignAttr: need to inspect the RHS part of the
+    assign node
+    """
+    stmt = self.statement()
+    if isinstance(stmt, nodes.AugAssign):
+        return stmt.infer(context)
+
+    stmts = list(self.assigned_stmts(context=context))
+    return bases._infer_stmts(stmts, context)
+nodes.AssignName._infer = infer_assign
+nodes.AssignAttr._infer = infer_assign
+
+def infer_augassign(self, context=None):
+    failures = []
+    for lhs in self.target.infer_lhs(context):
+        for val in _infer_binop(self.op, lhs, self.value, context, failures):
+            yield val
+    for lhs in failures:
+        for rhs in self.value.infer(context):
+            for val in _infer_binop(self.op, rhs, lhs, context):
+                yield val
+nodes.AugAssign._infer = bases.path_wrapper(infer_augassign)
+
+
+# no infer method on DelName and DelAttr (expected InferenceError)
+
+@bases.path_wrapper
+def infer_empty_node(self, context=None):
+    if not self.has_underlying_object():
+        yield util.YES
+    else:
+        try:
+            for inferred in MANAGER.infer_ast_from_something(self.object,
+                                                             context=context):
+                yield inferred
+        except exceptions.AstroidError:
+            yield util.YES
+nodes.EmptyNode._infer = infer_empty_node
+
+
+def infer_index(self, context=None):
+    return self.value.infer(context)
+nodes.Index._infer = infer_index
+
+# TODO: move directly into bases.Instance when the dependency hell
+# will be solved.
+def instance_getitem(self, index, context=None):
+    # Rewrap index to Const for this case
+    index = nodes.Const(index)
+    if context:
+        new_context = context.clone()
+    else:
+        context = new_context = contextmod.InferenceContext()
+
+    # Create a new callcontext for providing index as an argument.
+    new_context.callcontext = contextmod.CallContext(args=[index])
+    new_context.boundnode = self
+
+    method = next(self.igetattr('__getitem__', context=context))
+    if not isinstance(method, bases.BoundMethod):
+        raise exceptions.InferenceError
+
+    try:
+        return next(method.infer_call_result(self, new_context))
+    except StopIteration:
+        raise exceptions.InferenceError
+
+bases.Instance.getitem = instance_getitem
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/transforms.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/transforms.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/transforms.py	(revision 1126)
@@ -0,0 +1,96 @@
+# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+
+import collections
+import warnings
+
+
+class TransformVisitor(object):
+    """A visitor for handling transforms.
+
+    The standard approach of using it is to call
+    :meth:`~visit` with an *astroid* module and the class
+    will take care of the rest, walking the tree and running the
+    transforms for each encountered node.
+    """
+
+    def __init__(self):
+        self.transforms = collections.defaultdict(list)
+
+    def _transform(self, node):
+        """Call matching transforms for the given node if any and return the
+        transformed node.
+        """
+        cls = node.__class__
+        if cls not in self.transforms:
+            # no transform registered for this class of node
+            return node
+
+        transforms = self.transforms[cls]
+        orig_node = node  # copy the reference
+        for transform_func, predicate in transforms:
+            if predicate is None or predicate(node):
+                ret = transform_func(node)
+                # if the transformation function returns something, it's
+                # expected to be a replacement for the node
+                if ret is not None:
+                    if node is not orig_node:
+                        # node has already be modified by some previous
+                        # transformation, warn about it
+                        warnings.warn('node %s substituted multiple times' % node)
+                    node = ret
+        return node
+
+    def _visit(self, node):
+        if hasattr(node, '_astroid_fields'):
+            for field in node._astroid_fields:
+                value = getattr(node, field)
+                visited = self._visit_generic(value)
+                setattr(node, field, visited)
+        return self._transform(node)
+
+    def _visit_generic(self, node):
+        if isinstance(node, list):
+            return [self._visit_generic(child) for child in node]
+        elif isinstance(node, tuple):
+            return tuple(self._visit_generic(child) for child in node)
+        else:
+            return self._visit(node)
+
+    def register_transform(self, node_class, transform, predicate=None):
+        """Register `transform(node)` function to be applied on the given
+        astroid's `node_class` if `predicate` is None or returns true
+        when called with the node as argument.
+
+        The transform function may return a value which is then used to
+        substitute the original node in the tree.
+        """
+        self.transforms[node_class].append((transform, predicate))
+
+    def unregister_transform(self, node_class, transform, predicate=None):
+        """Unregister the given transform."""
+        self.transforms[node_class].remove((transform, predicate))
+
+    def visit(self, module):
+        """Walk the given astroid *tree* and transform each encountered node
+
+        Only the nodes which have transforms registered will actually
+        be replaced or changed.
+        """
+        module.body = [self._visit(child) for child in module.body]
+        return self._transform(module)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/__init__.py	(revision 1126)
@@ -0,0 +1,141 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""Python Abstract Syntax Tree New Generation
+
+The aim of this module is to provide a common base representation of
+python source code for projects such as pychecker, pyreverse,
+pylint... Well, actually the development of this library is essentially
+governed by pylint's needs.
+
+It extends class defined in the python's _ast module with some
+additional methods and attributes. Instance attributes are added by a
+builder object, which can either generate extended ast (let's call
+them astroid ;) by visiting an existent ast tree or by inspecting living
+object. Methods are added by monkey patching ast classes.
+
+Main modules are:
+
+* nodes and scoped_nodes for more information about methods and
+  attributes added to different node classes
+
+* the manager contains a high level object to get astroid trees from
+  source files and living objects. It maintains a cache of previously
+  constructed tree for quick access
+
+* builder contains the class responsible to build astroid trees
+"""
+__doctype__ = "restructuredtext en"
+
+import sys
+import re
+from operator import attrgetter
+
+# WARNING: internal imports order matters !
+
+# make all exception classes accessible from astroid package
+from astroid.exceptions import *
+
+# make all node classes accessible from astroid package
+from astroid.nodes import *
+
+# trigger extra monkey-patching
+from astroid import inference
+
+# more stuff available
+from astroid import raw_building
+from astroid.bases import Instance, BoundMethod, UnboundMethod
+from astroid.node_classes import are_exclusive, unpack_infer
+from astroid.scoped_nodes import builtin_lookup
+from astroid.builder import parse
+from astroid.util import YES
+
+# make a manager instance (borg) as well as Project and Package classes
+# accessible from astroid package
+from astroid.manager import AstroidManager
+MANAGER = AstroidManager()
+del AstroidManager
+
+# transform utilities (filters and decorator)
+
+class AsStringRegexpPredicate(object):
+    """Class to be used as predicate that may be given to `register_transform`
+
+    First argument is a regular expression that will be searched against the `as_string`
+    representation of the node onto which it's applied.
+
+    If specified, the second argument is an `attrgetter` expression that will be
+    applied on the node first to get the actual node on which `as_string` should
+    be called.
+
+    WARNING: This can be fairly slow, as it has to convert every AST node back
+    to Python code; you should consider examining the AST directly instead.
+    """
+    def __init__(self, regexp, expression=None):
+        self.regexp = re.compile(regexp)
+        self.expression = expression
+
+    def __call__(self, node):
+        if self.expression is not None:
+            node = attrgetter(self.expression)(node)
+        return self.regexp.search(node.as_string())
+
+def inference_tip(infer_function):
+    """Given an instance specific inference function, return a function to be
+    given to MANAGER.register_transform to set this inference function.
+
+    Typical usage
+
+    .. sourcecode:: python
+
+       MANAGER.register_transform(Call, inference_tip(infer_named_tuple),
+                                  predicate)
+    """
+    def transform(node, infer_function=infer_function):
+        node._explicit_inference = infer_function
+        return node
+    return transform
+
+
+def register_module_extender(manager, module_name, get_extension_mod):
+    def transform(node):
+        extension_module = get_extension_mod()
+        for name, objs in extension_module._locals.items():
+            node._locals[name] = objs
+            for obj in objs:
+                if obj.parent is extension_module:
+                    obj.parent = node
+
+    manager.register_transform(Module, transform, lambda n: n.name == module_name)
+
+
+# load brain plugins
+from os import listdir
+from os.path import join, dirname
+_file_ = __file__
+if sys.getClassLoader()!=None:
+    getResourcePath = getattr(sys.getClassLoader(),"getResourcePath",None)
+    if getResourcePath!=None:
+        _file_ = getResourcePath(_file_) 
+BRAIN_MODULES_DIR = join(dirname(_file_), 'brain')
+if BRAIN_MODULES_DIR not in sys.path:
+    # add it to the end of the list so user path take precedence
+    sys.path.append(BRAIN_MODULES_DIR)
+# load modules in this directory
+for module in listdir(BRAIN_MODULES_DIR):
+    if module.endswith('.py'):
+        __import__(module[:-3])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/test_utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/test_utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/test_utils.py	(revision 1126)
@@ -0,0 +1,201 @@
+"""Utility functions for test code that uses astroid ASTs as input."""
+import functools
+import sys
+
+from astroid import nodes
+from astroid import builder
+# The name of the transient function that is used to
+# wrap expressions to be extracted when calling
+# extract_node.
+_TRANSIENT_FUNCTION = '__'
+
+# The comment used to select a statement to be extracted
+# when calling extract_node.
+_STATEMENT_SELECTOR = '#@'
+
+def _extract_expressions(node):
+    """Find expressions in a call to _TRANSIENT_FUNCTION and extract them.
+
+    The function walks the AST recursively to search for expressions that
+    are wrapped into a call to _TRANSIENT_FUNCTION. If it finds such an
+    expression, it completely removes the function call node from the tree,
+    replacing it by the wrapped expression inside the parent.
+
+    :param node: An astroid node.
+    :type node:  astroid.bases.NodeNG
+    :yields: The sequence of wrapped expressions on the modified tree
+    expression can be found.
+    """
+    if (isinstance(node, nodes.Call)
+            and isinstance(node.func, nodes.Name)
+            and node.func.name == _TRANSIENT_FUNCTION):
+        real_expr = node.args[0]
+        real_expr.parent = node.parent
+        # Search for node in all _astng_fields (the fields checked when
+        # get_children is called) of its parent. Some of those fields may
+        # be lists or tuples, in which case the elements need to be checked.
+        # When we find it, replace it by real_expr, so that the AST looks
+        # like no call to _TRANSIENT_FUNCTION ever took place.
+        for name in node.parent._astroid_fields:
+            child = getattr(node.parent, name)
+            if isinstance(child, (list, tuple)):
+                for idx, compound_child in enumerate(child):
+                    if compound_child is node:
+                        child[idx] = real_expr
+            elif child is node:
+                setattr(node.parent, name, real_expr)
+        yield real_expr
+    else:
+        for child in node.get_children():
+            for result in _extract_expressions(child):
+                yield result
+
+
+def _find_statement_by_line(node, line):
+    """Extracts the statement on a specific line from an AST.
+
+    If the line number of node matches line, it will be returned;
+    otherwise its children are iterated and the function is called
+    recursively.
+
+    :param node: An astroid node.
+    :type node: astroid.bases.NodeNG
+    :param line: The line number of the statement to extract.
+    :type line: int
+    :returns: The statement on the line, or None if no statement for the line
+      can be found.
+    :rtype:  astroid.bases.NodeNG or None
+    """
+    if isinstance(node, (nodes.ClassDef, nodes.FunctionDef)):
+        # This is an inaccuracy in the AST: the nodes that can be
+        # decorated do not carry explicit information on which line
+        # the actual definition (class/def), but .fromline seems to
+        # be close enough.
+        node_line = node.fromlineno
+    else:
+        node_line = node.lineno
+
+    if node_line == line:
+        return node
+
+    for child in node.get_children():
+        result = _find_statement_by_line(child, line)
+        if result:
+            return result
+
+    return None
+
+def extract_node(code, module_name=''):
+    """Parses some Python code as a module and extracts a designated AST node.
+
+    Statements:
+     To extract one or more statement nodes, append #@ to the end of the line
+
+     Examples:
+       >>> def x():
+       >>>   def y():
+       >>>     return 1 #@
+
+       The return statement will be extracted.
+
+       >>> class X(object):
+       >>>   def meth(self): #@
+       >>>     pass
+
+      The funcion object 'meth' will be extracted.
+
+    Expressions:
+     To extract arbitrary expressions, surround them with the fake
+     function call __(...). After parsing, the surrounded expression
+     will be returned and the whole AST (accessible via the returned
+     node's parent attribute) will look like the function call was
+     never there in the first place.
+
+     Examples:
+       >>> a = __(1)
+
+       The const node will be extracted.
+
+       >>> def x(d=__(foo.bar)): pass
+
+       The node containing the default argument will be extracted.
+
+       >>> def foo(a, b):
+       >>>   return 0 < __(len(a)) < b
+
+       The node containing the function call 'len' will be extracted.
+
+    If no statements or expressions are selected, the last toplevel
+    statement will be returned.
+
+    If the selected statement is a discard statement, (i.e. an expression
+    turned into a statement), the wrapped expression is returned instead.
+
+    For convenience, singleton lists are unpacked.
+
+    :param str code: A piece of Python code that is parsed as
+    a module. Will be passed through textwrap.dedent first.
+    :param str module_name: The name of the module.
+    :returns: The designated node from the parse tree, or a list of nodes.
+    :rtype: astroid.bases.NodeNG, or a list of nodes.
+    """
+    def _extract(node):
+        if isinstance(node, nodes.Expr):
+            return node.value
+        else:
+            return node
+
+    requested_lines = []
+    for idx, line in enumerate(code.splitlines()):
+        if line.strip().endswith(_STATEMENT_SELECTOR):
+            requested_lines.append(idx + 1)
+
+    tree = builder.parse(code, module_name=module_name)
+    extracted = []
+    if requested_lines:
+        for line in requested_lines:
+            extracted.append(_find_statement_by_line(tree, line))
+
+    # Modifies the tree.
+    extracted.extend(_extract_expressions(tree))
+
+    if not extracted:
+        extracted.append(tree.body[-1])
+
+    extracted = [_extract(node) for node in extracted]
+    if len(extracted) == 1:
+        return extracted[0]
+    else:
+        return extracted
+
+
+def require_version(minver=None, maxver=None):
+    """ Compare version of python interpreter to the given one. Skip the test
+    if older.
+    """
+    def parse(string, default=None):
+        string = string or default
+        try:
+            return tuple(int(v) for v in string.split('.'))
+        except ValueError:
+            raise ValueError('%s is not a correct version : should be X.Y[.Z].' % version)
+
+    def check_require_version(f):
+        current = sys.version_info[:3]
+        if parse(minver, "0") < current <= parse(maxver, "4"):
+            return f
+        else:
+            str_version = '.'.join(str(v) for v in sys.version_info)
+            @functools.wraps(f)
+            def new_f(self, *args, **kwargs):
+                if minver is not None:
+                    self.skipTest('Needs Python > %s. Current version is %s.' % (minver, str_version))
+                elif maxver is not None:
+                    self.skipTest('Needs Python <= %s. Current version is %s.' % (maxver, str_version))
+            return new_f
+
+
+    return check_require_version
+
+def get_name_node(start_from, name, index=0):
+    return [n for n in start_from.nodes_of_class(nodes.Name) if n.name == name][index]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/modutils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/modutils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/modutils.py	(revision 1126)
@@ -0,0 +1,744 @@
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# astroid is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid.  If not, see <http://www.gnu.org/licenses/>.
+"""Python modules manipulation utility functions.
+
+:type PY_SOURCE_EXTS: tuple(str)
+:var PY_SOURCE_EXTS: list of possible python source file extension
+
+:type STD_LIB_DIRS: set of str
+:var STD_LIB_DIRS: directories where standard modules are located
+
+:type BUILTIN_MODULES: dict
+:var BUILTIN_MODULES: dictionary with builtin module names has key
+"""
+from __future__ import with_statement
+
+import imp
+import os
+import platform
+import sys
+from distutils.sysconfig import get_python_lib
+from distutils.errors import DistutilsPlatformError
+import zipimport
+
+try:
+    import pkg_resources
+except ImportError:
+    pkg_resources = None
+
+PY_ZIPMODULE = object()
+
+if sys.platform.startswith('win'):
+    PY_SOURCE_EXTS = ('py', 'pyw')
+    PY_COMPILED_EXTS = ('dll', 'pyd')
+else:
+    PY_SOURCE_EXTS = ('py',)
+    PY_COMPILED_EXTS = ('so',)
+
+
+try:
+    # The explicit sys.prefix is to work around a patch in virtualenv that
+    # replaces the 'real' sys.prefix (i.e. the location of the binary)
+    # with the prefix from which the virtualenv was created. This throws
+    # off the detection logic for standard library modules, thus the
+    # workaround.
+    STD_LIB_DIRS = set([
+        get_python_lib(standard_lib=True, prefix=sys.prefix),
+        # Take care of installations where exec_prefix != prefix.
+        get_python_lib(standard_lib=True, prefix=sys.exec_prefix),
+        get_python_lib(standard_lib=True)])
+# get_python_lib(standard_lib=1) is not available on pypy, set STD_LIB_DIR to
+# non-valid path, see https://bugs.pypy.org/issue1164
+except DistutilsPlatformError:
+    STD_LIB_DIRS = set()
+
+if os.name == 'nt':
+    STD_LIB_DIRS.add(os.path.join(sys.prefix, 'dlls'))
+    try:
+        # real_prefix is defined when running inside virtualenv.
+        STD_LIB_DIRS.add(os.path.join(sys.real_prefix, 'dlls'))
+    except AttributeError:
+        pass
+if platform.python_implementation() == 'PyPy':
+    _root = os.path.join(sys.prefix, 'lib_pypy')
+    STD_LIB_DIRS.add(_root)
+    try:
+        # real_prefix is defined when running inside virtualenv.
+        STD_LIB_DIRS.add(os.path.join(sys.real_prefix, 'lib_pypy'))
+    except AttributeError:
+        pass
+    del _root
+if os.name == 'posix':
+    # Need the real prefix is we're under a virtualenv, otherwise
+    # the usual one will do.
+    try:
+        prefix = sys.real_prefix
+    except AttributeError:
+        prefix = sys.prefix
+
+    def _posix_path(path):
+        base_python = 'python%d.%d' % sys.version_info[:2]
+        return os.path.join(prefix, path, base_python)
+
+    STD_LIB_DIRS.add(_posix_path('lib'))
+    if sys.maxsize > 2**32:
+        # This tries to fix a problem with /usr/lib64 builds,
+        # where systems are running both 32-bit and 64-bit code
+        # on the same machine, which reflects into the places where
+        # standard library could be found. More details can be found
+        # here http://bugs.python.org/issue1294959.
+        # An easy reproducing case would be
+        # https://github.com/PyCQA/pylint/issues/712#issuecomment-163178753
+        STD_LIB_DIRS.add(_posix_path('lib64'))
+
+EXT_LIB_DIR = get_python_lib()
+IS_JYTHON = platform.python_implementation() == 'Jython'
+BUILTIN_MODULES = dict.fromkeys(sys.builtin_module_names, True)
+
+
+class NoSourceFile(Exception):
+    """exception raised when we are not able to get a python
+    source file for a precompiled file
+    """
+
+def _normalize_path(path):
+    return os.path.normcase(os.path.abspath(path))
+
+
+def _path_from_filename(filename, is_jython=IS_JYTHON):
+    if not is_jython:
+        if sys.version_info > (3, 0):
+            return filename
+        else:
+            if filename.endswith(".pyc"):
+                return filename[:-1]
+            return filename
+    head, has_pyclass, _ = filename.partition("$py.class")
+    if has_pyclass:
+        return head + ".py"
+    return filename
+
+
+def _handle_blacklist(blacklist, dirnames, filenames):
+    """remove files/directories in the black list
+
+    dirnames/filenames are usually from os.walk
+    """
+    for norecurs in blacklist:
+        if norecurs in dirnames:
+            dirnames.remove(norecurs)
+        elif norecurs in filenames:
+            filenames.remove(norecurs)
+
+
+_NORM_PATH_CACHE = {}
+
+def _cache_normalize_path(path):
+    """abspath with caching"""
+    # _module_file calls abspath on every path in sys.path every time it's
+    # called; on a larger codebase this easily adds up to half a second just
+    # assembling path components. This cache alleviates that.
+    try:
+        return _NORM_PATH_CACHE[path]
+    except KeyError:
+        if not path: # don't cache result for ''
+            return _normalize_path(path)
+        result = _NORM_PATH_CACHE[path] = _normalize_path(path)
+        return result
+
+def load_module_from_name(dotted_name, path=None, use_sys=True):
+    """Load a Python module from its name.
+
+    :type dotted_name: str
+    :param dotted_name: python name of a module or package
+
+    :type path: list or None
+    :param path:
+      optional list of path where the module or package should be
+      searched (use sys.path if nothing or None is given)
+
+    :type use_sys: bool
+    :param use_sys:
+      boolean indicating whether the sys.modules dictionary should be
+      used or not
+
+
+    :raise ImportError: if the module or package is not found
+
+    :rtype: module
+    :return: the loaded module
+    """
+    return load_module_from_modpath(dotted_name.split('.'), path, use_sys)
+
+
+def load_module_from_modpath(parts, path=None, use_sys=1):
+    """Load a python module from its splitted name.
+
+    :type parts: list(str) or tuple(str)
+    :param parts:
+      python name of a module or package splitted on '.'
+
+    :type path: list or None
+    :param path:
+      optional list of path where the module or package should be
+      searched (use sys.path if nothing or None is given)
+
+    :type use_sys: bool
+    :param use_sys:
+      boolean indicating whether the sys.modules dictionary should be used or not
+
+    :raise ImportError: if the module or package is not found
+
+    :rtype: module
+    :return: the loaded module
+    """
+    if use_sys:
+        try:
+            return sys.modules['.'.join(parts)]
+        except KeyError:
+            pass
+    modpath = []
+    prevmodule = None
+    for part in parts:
+        modpath.append(part)
+        curname = '.'.join(modpath)
+        module = None
+        if len(modpath) != len(parts):
+            # even with use_sys=False, should try to get outer packages from sys.modules
+            module = sys.modules.get(curname)
+        elif use_sys:
+            # because it may have been indirectly loaded through a parent
+            module = sys.modules.get(curname)
+        if module is None:
+            mp_file, mp_filename, mp_desc = imp.find_module(part, path)
+            module = imp.load_module(curname, mp_file, mp_filename, mp_desc)
+            # mp_file still needs to be closed.
+            if mp_file:
+                mp_file.close()
+        if prevmodule:
+            setattr(prevmodule, part, module)
+        _file = getattr(module, '__file__', '')
+        prevmodule = module
+        if not _file and _is_namespace(curname):
+            continue
+        if not _file and len(modpath) != len(parts):
+            raise ImportError('no module in %s' % '.'.join(parts[len(modpath):]))
+        path = [os.path.dirname(_file)]
+    return module
+
+
+def load_module_from_file(filepath, path=None, use_sys=True, extrapath=None):
+    """Load a Python module from it's path.
+
+    :type filepath: str
+    :param filepath: path to the python module or package
+
+    :type path: list or None
+    :param path:
+      optional list of path where the module or package should be
+      searched (use sys.path if nothing or None is given)
+
+    :type use_sys: bool
+    :param use_sys:
+      boolean indicating whether the sys.modules dictionary should be
+      used or not
+
+
+    :raise ImportError: if the module or package is not found
+
+    :rtype: module
+    :return: the loaded module
+    """
+    modpath = modpath_from_file(filepath, extrapath)
+    return load_module_from_modpath(modpath, path, use_sys)
+
+
+def _check_init(path, mod_path):
+    """check there are some __init__.py all along the way"""
+    modpath = []
+    for part in mod_path:
+        modpath.append(part)
+        path = os.path.join(path, part)
+        if not _is_namespace('.'.join(modpath)) and not _has_init(path):
+            return False
+    return True
+
+
+def modpath_from_file(filename, extrapath=None):
+    """given a file path return the corresponding splitted module's name
+    (i.e name of a module or package splitted on '.')
+
+    :type filename: str
+    :param filename: file's path for which we want the module's name
+
+    :type extrapath: dict
+    :param extrapath:
+      optional extra search path, with path as key and package name for the path
+      as value. This is usually useful to handle package splitted in multiple
+      directories using __path__ trick.
+
+
+    :raise ImportError:
+      if the corresponding module's name has not been found
+
+    :rtype: list(str)
+    :return: the corresponding splitted module's name
+    """
+    filename = _path_from_filename(filename)
+    filename = os.path.abspath(filename)
+    base = os.path.splitext(filename)[0]
+    if extrapath is not None:
+        for path_ in extrapath:
+            path = os.path.abspath(path_)
+            if path and os.path.normcase(base[:len(path)]) == os.path.normcase(path):
+                submodpath = [pkg for pkg in base[len(path):].split(os.sep)
+                              if pkg]
+                if _check_init(path, submodpath[:-1]):
+                    return extrapath[path_].split('.') + submodpath
+    for path in sys.path:
+        path = _cache_normalize_path(path)
+        if path and os.path.normcase(base).startswith(path):
+            modpath = [pkg for pkg in base[len(path):].split(os.sep) if pkg]
+            if _check_init(path, modpath[:-1]):
+                return modpath
+    raise ImportError('Unable to find module for %s in %s' % (
+        filename, ', \n'.join(sys.path)))
+
+
+def file_from_modpath(modpath, path=None, context_file=None):
+    return file_info_from_modpath(modpath, path, context_file)[0]
+
+def file_info_from_modpath(modpath, path=None, context_file=None):
+    """given a mod path (i.e. splitted module / package name), return the
+    corresponding file, giving priority to source file over precompiled
+    file if it exists
+
+    :type modpath: list or tuple
+    :param modpath:
+      splitted module's name (i.e name of a module or package splitted
+      on '.')
+      (this means explicit relative imports that start with dots have
+      empty strings in this list!)
+
+    :type path: list or None
+    :param path:
+      optional list of path where the module or package should be
+      searched (use sys.path if nothing or None is given)
+
+    :type context_file: str or None
+    :param context_file:
+      context file to consider, necessary if the identifier has been
+      introduced using a relative import unresolvable in the actual
+      context (i.e. modutils)
+
+    :raise ImportError: if there is no such module in the directory
+
+    :rtype: (str or None, import type)
+    :return:
+      the path to the module's file or None if it's an integrated
+      builtin module such as 'sys'
+    """
+    if context_file is not None:
+        context = os.path.dirname(context_file)
+    else:
+        context = context_file
+    if modpath[0] == 'xml':
+        # handle _xmlplus
+        try:
+            return _file_from_modpath(['_xmlplus'] + modpath[1:], path, context)
+        except ImportError:
+            return _file_from_modpath(modpath, path, context)
+    elif modpath == ['os', 'path']:
+        # FIXME: currently ignoring search_path...
+        return os.path.__file__, imp.PY_SOURCE
+    return _file_from_modpath(modpath, path, context)
+
+
+def get_module_part(dotted_name, context_file=None):
+    """given a dotted name return the module part of the name :
+
+    >>> get_module_part('astroid.as_string.dump')
+    'astroid.as_string'
+
+    :type dotted_name: str
+    :param dotted_name: full name of the identifier we are interested in
+
+    :type context_file: str or None
+    :param context_file:
+      context file to consider, necessary if the identifier has been
+      introduced using a relative import unresolvable in the actual
+      context (i.e. modutils)
+
+
+    :raise ImportError: if there is no such module in the directory
+
+    :rtype: str or None
+    :return:
+      the module part of the name or None if we have not been able at
+      all to import the given name
+
+    XXX: deprecated, since it doesn't handle package precedence over module
+    (see #10066)
+    """
+    # os.path trick
+    if dotted_name.startswith('os.path'):
+        return 'os.path'
+    parts = dotted_name.split('.')
+    if context_file is not None:
+        # first check for builtin module which won't be considered latter
+        # in that case (path != None)
+        if parts[0] in BUILTIN_MODULES:
+            if len(parts) > 2:
+                raise ImportError(dotted_name)
+            return parts[0]
+        # don't use += or insert, we want a new list to be created !
+    path = None
+    starti = 0
+    if parts[0] == '':
+        assert context_file is not None, \
+                'explicit relative import, but no context_file?'
+        path = [] # prevent resolving the import non-relatively
+        starti = 1
+    while parts[starti] == '': # for all further dots: change context
+        starti += 1
+        context_file = os.path.dirname(context_file)
+    for i in range(starti, len(parts)):
+        try:
+            file_from_modpath(parts[starti:i+1], path=path,
+                              context_file=context_file)
+        except ImportError:
+            if not i >= max(1, len(parts) - 2):
+                raise
+            return '.'.join(parts[:i])
+    return dotted_name
+
+
+def get_module_files(src_directory, blacklist):
+    """given a package directory return a list of all available python
+    module's files in the package and its subpackages
+
+    :type src_directory: str
+    :param src_directory:
+      path of the directory corresponding to the package
+
+    :type blacklist: list or tuple
+    :param blacklist: iterable
+      list of files or directories to ignore.
+
+    :rtype: list
+    :return:
+      the list of all available python module's files in the package and
+      its subpackages
+    """
+    files = []
+    for directory, dirnames, filenames in os.walk(src_directory):
+        _handle_blacklist(blacklist, dirnames, filenames)
+        # check for __init__.py
+        if not '__init__.py' in filenames:
+            dirnames[:] = ()
+            continue
+        for filename in filenames:
+            if _is_python_file(filename):
+                src = os.path.join(directory, filename)
+                files.append(src)
+    return files
+
+
+def get_source_file(filename, include_no_ext=False):
+    """given a python module's file name return the matching source file
+    name (the filename will be returned identically if it's a already an
+    absolute path to a python source file...)
+
+    :type filename: str
+    :param filename: python module's file name
+
+
+    :raise NoSourceFile: if no source file exists on the file system
+
+    :rtype: str
+    :return: the absolute path of the source file if it exists
+    """
+    copy = getattr(filename,"copy",None)
+    filename = os.path.abspath(_path_from_filename(filename))
+    base, orig_ext = os.path.splitext(filename)
+    for ext in PY_SOURCE_EXTS:
+        source_path = '%s.%s' % (base, ext)
+        if os.path.exists(source_path):
+	    if copy==None:
+	      return source_path
+	    return copy(source_path)
+    if include_no_ext and not orig_ext and os.path.exists(base):
+        return base
+    raise NoSourceFile(filename)
+
+
+def is_python_source(filename):
+    """
+    rtype: bool
+    return: True if the filename is a python source file
+    """
+    return os.path.splitext(filename)[1][1:] in PY_SOURCE_EXTS
+
+
+def is_standard_module(modname, std_path=None):
+    """try to guess if a module is a standard python module (by default,
+    see `std_path` parameter's description)
+
+    :type modname: str
+    :param modname: name of the module we are interested in
+
+    :type std_path: list(str) or tuple(str)
+    :param std_path: list of path considered has standard
+
+
+    :rtype: bool
+    :return:
+      true if the module:
+      - is located on the path listed in one of the directory in `std_path`
+      - is a built-in module
+    """
+    modname = modname.split('.')[0]
+    try:
+        filename = file_from_modpath([modname])
+    except ImportError:
+        # import failed, i'm probably not so wrong by supposing it's
+        # not standard...
+        return False
+    # modules which are not living in a file are considered standard
+    # (sys and __builtin__ for instance)
+    if filename is None:
+        # we assume there are no namespaces in stdlib
+        return not _is_namespace(modname)
+    filename = _normalize_path(filename)
+    if filename.startswith(_cache_normalize_path(EXT_LIB_DIR)):
+        return False
+    if std_path is None:
+        std_path = STD_LIB_DIRS
+    for path in std_path:
+        if filename.startswith(_cache_normalize_path(path)):
+            return True
+    return False
+
+
+
+def is_relative(modname, from_file):
+    """return true if the given module name is relative to the given
+    file name
+
+    :type modname: str
+    :param modname: name of the module we are interested in
+
+    :type from_file: str
+    :param from_file:
+      path of the module from which modname has been imported
+
+    :rtype: bool
+    :return:
+      true if the module has been imported relatively to `from_file`
+    """
+    if not os.path.isdir(from_file):
+        from_file = os.path.dirname(from_file)
+    if from_file in sys.path:
+        return False
+    try:
+        stream, _, _ = imp.find_module(modname.split('.')[0], [from_file])
+
+        # Close the stream to avoid ResourceWarnings.
+        if stream:
+            stream.close()
+        return True
+    except ImportError:
+        return False
+
+
+# internal only functions #####################################################
+
+def _file_from_modpath(modpath, path=None, context=None):
+    """given a mod path (i.e. splitted module / package name), return the
+    corresponding file
+
+    this function is used internally, see `file_from_modpath`'s
+    documentation for more information
+    """
+    assert len(modpath) > 0
+    if context is not None:
+        try:
+            mtype, mp_filename = _module_file(modpath, [context])
+        except ImportError:
+            mtype, mp_filename = _module_file(modpath, path)
+    else:
+        mtype, mp_filename = _module_file(modpath, path)
+    if mtype == imp.PY_COMPILED:
+        try:
+            return get_source_file(mp_filename), imp.PY_SOURCE
+        except NoSourceFile:
+            return mp_filename, imp.PY_COMPILED
+    elif mtype == imp.C_BUILTIN:
+        # integrated builtin module
+        return None, imp.C_BUILTIN
+    elif mtype == imp.PKG_DIRECTORY:
+        mp_filename = _has_init(mp_filename)
+        mtype = imp.PY_SOURCE
+    return mp_filename, mtype
+
+def _search_zip(modpath, pic):
+    for filepath, importer in list(pic.items()):
+        if importer is not None:
+            if importer.find_module(modpath[0]):
+                if not importer.find_module(os.path.sep.join(modpath)):
+                    raise ImportError('No module named %s in %s/%s' % (
+                        '.'.join(modpath[1:]), filepath, modpath))
+                return (PY_ZIPMODULE,
+                        os.path.abspath(filepath) + os.path.sep + os.path.sep.join(modpath),
+                        filepath)
+    raise ImportError('No module named %s' % '.'.join(modpath))
+
+try:
+    import pkg_resources
+except ImportError:
+    pkg_resources = None
+
+
+def _is_namespace(modname):
+    return (pkg_resources is not None
+            and modname in pkg_resources._namespace_packages)
+
+
+def _module_file(modpath, path=None):
+    """get a module type / file path
+
+    :type modpath: list or tuple
+    :param modpath:
+      splitted module's name (i.e name of a module or package splitted
+      on '.'), with leading empty strings for explicit relative import
+
+    :type path: list or None
+    :param path:
+      optional list of path where the module or package should be
+      searched (use sys.path if nothing or None is given)
+
+
+    :rtype: tuple(int, str)
+    :return: the module type flag and the file path for a module
+    """
+    # egg support compat
+    try:
+        pic = sys.path_importer_cache
+        _path = (path is None and sys.path or path)
+        for __path in _path:
+            if not __path in pic:
+                try:
+                    pic[__path] = zipimport.zipimporter(__path)
+                except zipimport.ZipImportError:
+                    pic[__path] = None
+        checkeggs = True
+    except AttributeError:
+        checkeggs = False
+    # pkg_resources support (aka setuptools namespace packages)
+    if _is_namespace(modpath[0]) and modpath[0] in sys.modules:
+        # setuptools has added into sys.modules a module object with proper
+        # __path__, get back information from there
+        module = sys.modules[modpath.pop(0)]
+        path = module.__path__
+        if not modpath:
+            return imp.C_BUILTIN, None
+    imported = []
+    while modpath:
+        modname = modpath[0]
+        # take care to changes in find_module implementation wrt builtin modules
+        #
+        # Python 2.6.6 (r266:84292, Sep 11 2012, 08:34:23)
+        # >>> imp.find_module('posix')
+        # (None, 'posix', ('', '', 6))
+        #
+        # Python 3.3.1 (default, Apr 26 2013, 12:08:46)
+        # >>> imp.find_module('posix')
+        # (None, None, ('', '', 6))
+        try:
+            stream, mp_filename, mp_desc = imp.find_module(modname, path)
+        except ImportError:
+            if checkeggs:
+                return _search_zip(modpath, pic)[:2]
+            raise
+        else:
+            # Don't forget to close the stream to avoid
+            # spurious ResourceWarnings.
+            if stream:
+                stream.close()
+
+            if checkeggs and mp_filename:
+                fullabspath = [_cache_normalize_path(x) for x in _path]
+                try:
+                    pathindex = fullabspath.index(os.path.dirname(_normalize_path(mp_filename)))
+                    emtype, emp_filename, zippath = _search_zip(modpath, pic)
+                    if pathindex > _path.index(zippath):
+                        # an egg takes priority
+                        return emtype, emp_filename
+                except ValueError:
+                    # XXX not in _path
+                    pass
+                except ImportError:
+                    pass
+                checkeggs = False
+        imported.append(modpath.pop(0))
+        mtype = mp_desc[2]
+        if modpath:
+            if mtype != imp.PKG_DIRECTORY:
+                raise ImportError('No module %s in %s' % ('.'.join(modpath),
+                                                          '.'.join(imported)))
+            # XXX guess if package is using pkgutil.extend_path by looking for
+            # those keywords in the first four Kbytes
+            try:
+                with open(os.path.join(mp_filename, '__init__.py'), 'rb') as stream:
+                    data = stream.read(4096)
+            except IOError:
+                path = [mp_filename]
+            else:
+                extend_path = b'pkgutil' in data and b'extend_path' in data
+                declare_namespace = (
+                    b"pkg_resources" in data
+                    and b"declare_namespace(__name__)" in data)
+                if extend_path or declare_namespace:
+                    # extend_path is called, search sys.path for module/packages
+                    # of this name see pkgutil.extend_path documentation
+                    path = [os.path.join(p, *imported) for p in sys.path
+                            if os.path.isdir(os.path.join(p, *imported))]
+                else:
+                    path = [mp_filename]
+    return mtype, mp_filename
+
+def _is_python_file(filename):
+    """return true if the given filename should be considered as a python file
+
+    .pyc and .pyo are ignored
+    """
+    for ext in ('.py', '.so', '.pyd', '.pyw'):
+        if filename.endswith(ext):
+            return True
+    return False
+
+
+def _has_init(directory):
+    """if the given directory has a valid __init__ file, return its path,
+    else return None
+    """
+    mod_or_pack = os.path.join(directory, '__init__')
+    for ext in PY_SOURCE_EXTS + ('pyc', 'pyo'):
+        if os.path.exists(mod_or_pack + '.' + ext):
+            return mod_or_pack + '.' + ext
+    return None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/node_classes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/node_classes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/astroid/node_classes.py	(revision 1126)
@@ -0,0 +1,1053 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of astroid.
+#
+# astroid is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by the
+# Free Software Foundation, either version 2.1 of the License, or (at your
+# option) any later version.
+#
+# astroid is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with astroid. If not, see <http://www.gnu.org/licenses/>.
+"""Module for some node classes. More nodes in scoped_nodes.py
+"""
+
+import abc
+import warnings
+
+import lazy_object_proxy
+import six
+
+from astroid import bases
+from astroid import context as contextmod
+from astroid import decorators
+from astroid import exceptions
+from astroid import mixins
+from astroid import util
+
+
+BUILTINS = six.moves.builtins.__name__
+
+
+@bases.raise_if_nothing_inferred
+def unpack_infer(stmt, context=None):
+    """recursively generate nodes inferred by the given statement.
+    If the inferred value is a list or a tuple, recurse on the elements
+    """
+    if isinstance(stmt, (List, Tuple)):
+        for elt in stmt.elts:
+            if elt is util.YES:
+                yield elt
+                continue
+            for inferred_elt in unpack_infer(elt, context):
+                yield inferred_elt
+        return
+    # if inferred is a final node, return it and stop
+    inferred = next(stmt.infer(context))
+    if inferred is stmt:
+        yield inferred
+        return
+    # else, infer recursivly, except YES object that should be returned as is
+    for inferred in stmt.infer(context):
+        if inferred is util.YES:
+            yield inferred
+        else:
+            for inf_inf in unpack_infer(inferred, context):
+                yield inf_inf
+
+
+def are_exclusive(stmt1, stmt2, exceptions=None):
+    """return true if the two given statements are mutually exclusive
+
+    `exceptions` may be a list of exception names. If specified, discard If
+    branches and check one of the statement is in an exception handler catching
+    one of the given exceptions.
+
+    algorithm :
+     1) index stmt1's parents
+     2) climb among stmt2's parents until we find a common parent
+     3) if the common parent is a If or TryExcept statement, look if nodes are
+        in exclusive branches
+    """
+    # index stmt1's parents
+    stmt1_parents = {}
+    children = {}
+    node = stmt1.parent
+    previous = stmt1
+    while node:
+        stmt1_parents[node] = 1
+        children[node] = previous
+        previous = node
+        node = node.parent
+    # climb among stmt2's parents until we find a common parent
+    node = stmt2.parent
+    previous = stmt2
+    while node:
+        if node in stmt1_parents:
+            # if the common parent is a If or TryExcept statement, look if
+            # nodes are in exclusive branches
+            if isinstance(node, If) and exceptions is None:
+                if (node.locate_child(previous)[1]
+                        is not node.locate_child(children[node])[1]):
+                    return True
+            elif isinstance(node, TryExcept):
+                c2attr, c2node = node.locate_child(previous)
+                c1attr, c1node = node.locate_child(children[node])
+                if c1node is not c2node:
+                    if ((c2attr == 'body'
+                         and c1attr == 'handlers'
+                         and children[node].catch(exceptions)) or
+                            (c2attr == 'handlers' and c1attr == 'body' and previous.catch(exceptions)) or
+                            (c2attr == 'handlers' and c1attr == 'orelse') or
+                            (c2attr == 'orelse' and c1attr == 'handlers')):
+                        return True
+                elif c2attr == 'handlers' and c1attr == 'handlers':
+                    return previous is not children[node]
+            return False
+        previous = node
+        node = node.parent
+    return False
+
+
+@six.add_metaclass(abc.ABCMeta)
+class _BaseContainer(mixins.ParentAssignTypeMixin,
+                     bases.NodeNG,
+                     bases.Instance):
+    """Base class for Set, FrozenSet, Tuple and List."""
+
+    _astroid_fields = ('elts',)
+
+    def __init__(self, elts=None):
+        if elts is None:
+            self.elts = []
+        else:
+            self.elts = [const_factory(e) for e in elts]
+
+    def itered(self):
+        return self.elts
+
+    def bool_value(self):
+        return bool(self.elts)
+
+    @abc.abstractmethod
+    def pytype(self):
+        pass
+
+
+class LookupMixIn(object):
+    """Mixin looking up a name in the right scope
+    """
+
+    def lookup(self, name):
+        """lookup a variable name
+
+        return the scope node and the list of assignments associated to the
+        given name according to the scope where it has been found (locals,
+        globals or builtin)
+
+        The lookup is starting from self's scope. If self is not a frame itself
+        and the name is found in the inner frame locals, statements will be
+        filtered to remove ignorable statements according to self's location
+        """
+        return self.scope().scope_lookup(self, name)
+
+    def ilookup(self, name):
+        """inferred lookup
+
+        return an iterator on inferred values of the statements returned by
+        the lookup method
+        """
+        frame, stmts = self.lookup(name)
+        context = contextmod.InferenceContext()
+        return bases._infer_stmts(stmts, context, frame)
+
+    def _filter_stmts(self, stmts, frame, offset):
+        """filter statements to remove ignorable statements.
+
+        If self is not a frame itself and the name is found in the inner
+        frame locals, statements will be filtered to remove ignorable
+        statements according to self's location
+        """
+        # if offset == -1, my actual frame is not the inner frame but its parent
+        #
+        # class A(B): pass
+        #
+        # we need this to resolve B correctly
+        if offset == -1:
+            myframe = self.frame().parent.frame()
+        else:
+            myframe = self.frame()
+            # If the frame of this node is the same as the statement
+            # of this node, then the node is part of a class or
+            # a function definition and the frame of this node should be the
+            # the upper frame, not the frame of the definition.
+            # For more information why this is important,
+            # see Pylint issue #295.
+            # For example, for 'b', the statement is the same
+            # as the frame / scope:
+            #
+            # def test(b=1):
+            #     ...
+
+            if self.statement() is myframe and myframe.parent:
+                myframe = myframe.parent.frame()
+
+        mystmt = self.statement()
+        # line filtering if we are in the same frame
+        #
+        # take care node may be missing lineno information (this is the case for
+        # nodes inserted for living objects)
+        if myframe is frame and mystmt.fromlineno is not None:
+            assert mystmt.fromlineno is not None, mystmt
+            mylineno = mystmt.fromlineno + offset
+        else:
+            # disabling lineno filtering
+            mylineno = 0
+        _stmts = []
+        _stmt_parents = []
+        for node in stmts:
+            stmt = node.statement()
+            # line filtering is on and we have reached our location, break
+            if mylineno > 0 and stmt.fromlineno > mylineno:
+                break
+            assert hasattr(node, 'assign_type'), (node, node.scope(),
+                                                  node.scope().locals)
+            assign_type = node.assign_type()
+            if node.has_base(self):
+                break
+
+            _stmts, done = assign_type._get_filtered_stmts(self, node, _stmts, mystmt)
+            if done:
+                break
+
+            optional_assign = assign_type.optional_assign
+            if optional_assign and assign_type.parent_of(self):
+                # we are inside a loop, loop var assigment is hidding previous
+                # assigment
+                _stmts = [node]
+                _stmt_parents = [stmt.parent]
+                continue
+
+            # XXX comment various branches below!!!
+            try:
+                pindex = _stmt_parents.index(stmt.parent)
+            except ValueError:
+                pass
+            else:
+                # we got a parent index, this means the currently visited node
+                # is at the same block level as a previously visited node
+                if _stmts[pindex].assign_type().parent_of(assign_type):
+                    # both statements are not at the same block level
+                    continue
+                # if currently visited node is following previously considered
+                # assignement and both are not exclusive, we can drop the
+                # previous one. For instance in the following code ::
+                #
+                #   if a:
+                #     x = 1
+                #   else:
+                #     x = 2
+                #   print x
+                #
+                # we can't remove neither x = 1 nor x = 2 when looking for 'x'
+                # of 'print x'; while in the following ::
+                #
+                #   x = 1
+                #   x = 2
+                #   print x
+                #
+                # we can remove x = 1 when we see x = 2
+                #
+                # moreover, on loop assignment types, assignment won't
+                # necessarily be done if the loop has no iteration, so we don't
+                # want to clear previous assigments if any (hence the test on
+                # optional_assign)
+                if not (optional_assign or are_exclusive(_stmts[pindex], node)):
+                    del _stmt_parents[pindex]
+                    del _stmts[pindex]
+            if isinstance(node, AssignName):
+                if not optional_assign and stmt.parent is mystmt.parent:
+                    _stmts = []
+                    _stmt_parents = []
+            elif isinstance(node, DelName):
+                _stmts = []
+                _stmt_parents = []
+                continue
+            if not are_exclusive(self, node):
+                _stmts.append(node)
+                _stmt_parents.append(stmt.parent)
+        return _stmts
+
+
+# Name classes
+
+class AssignName(LookupMixIn, mixins.ParentAssignTypeMixin, bases.NodeNG):
+    """class representing an AssName node"""
+
+
+class DelName(LookupMixIn, mixins.ParentAssignTypeMixin, bases.NodeNG):
+    """class representing a DelName node"""
+
+
+class Name(LookupMixIn, bases.NodeNG):
+    """class representing a Name node"""
+
+
+class Arguments(mixins.AssignTypeMixin, bases.NodeNG):
+    """class representing an Arguments node"""
+    if six.PY3:
+        # Python 3.4+ uses a different approach regarding annotations,
+        # each argument is a new class, _ast.arg, which exposes an
+        # 'annotation' attribute. In astroid though, arguments are exposed
+        # as is in the Arguments node and the only way to expose annotations
+        # is by using something similar with Python 3.3:
+        #  - we expose 'varargannotation' and 'kwargannotation' of annotations
+        #    of varargs and kwargs.
+        #  - we expose 'annotation', a list with annotations for
+        #    for each normal argument. If an argument doesn't have an
+        #    annotation, its value will be None.
+
+        _astroid_fields = ('args', 'defaults', 'kwonlyargs',
+                           'kw_defaults', 'annotations',
+                           'varargannotation', 'kwargannotation')
+        annotations = None
+        varargannotation = None
+        kwargannotation = None
+    else:
+        _astroid_fields = ('args', 'defaults', 'kwonlyargs', 'kw_defaults')
+    args = None
+    defaults = None
+    kwonlyargs = None
+    kw_defaults = None
+
+    def __init__(self, vararg=None, kwarg=None):
+        self.vararg = vararg
+        self.kwarg = kwarg
+
+    def _infer_name(self, frame, name):
+        if self.parent is frame:
+            return name
+        return None
+
+    @decorators.cachedproperty
+    def fromlineno(self):
+        lineno = super(Arguments, self).fromlineno
+        return max(lineno, self.parent.fromlineno or 0)
+
+    def format_args(self):
+        """return arguments formatted as string"""
+        result = []
+        if self.args:
+            result.append(
+                _format_args(self.args, self.defaults,
+                             getattr(self, 'annotations', None))
+            )
+        if self.vararg:
+            result.append('*%s' % self.vararg)
+        if self.kwonlyargs:
+            if not self.vararg:
+                result.append('*')
+            result.append(_format_args(self.kwonlyargs, self.kw_defaults))
+        if self.kwarg:
+            result.append('**%s' % self.kwarg)
+        return ', '.join(result)
+
+    def default_value(self, argname):
+        """return the default value for an argument
+
+        :raise `NoDefault`: if there is no default value defined
+        """
+        i = _find_arg(argname, self.args)[0]
+        if i is not None:
+            idx = i - (len(self.args) - len(self.defaults))
+            if idx >= 0:
+                return self.defaults[idx]
+        i = _find_arg(argname, self.kwonlyargs)[0]
+        if i is not None and self.kw_defaults[i] is not None:
+            return self.kw_defaults[i]
+        raise exceptions.NoDefault()
+
+    def is_argument(self, name):
+        """return True if the name is defined in arguments"""
+        if name == self.vararg:
+            return True
+        if name == self.kwarg:
+            return True
+        return self.find_argname(name, True)[1] is not None
+
+    def find_argname(self, argname, rec=False):
+        """return index and Name node with given name"""
+        if self.args: # self.args may be None in some cases (builtin function)
+            return _find_arg(argname, self.args, rec)
+        return None, None
+
+    def get_children(self):
+        """override get_children to skip over None elements in kw_defaults"""
+        for child in super(Arguments, self).get_children():
+            if child is not None:
+                yield child
+
+
+def _find_arg(argname, args, rec=False):
+    for i, arg in enumerate(args):
+        if isinstance(arg, Tuple):
+            if rec:
+                found = _find_arg(argname, arg.elts)
+                if found[0] is not None:
+                    return found
+        elif arg.name == argname:
+            return i, arg
+    return None, None
+
+
+def _format_args(args, defaults=None, annotations=None):
+    values = []
+    if args is None:
+        return ''
+    if annotations is None:
+        annotations = []
+    if defaults is not None:
+        default_offset = len(args) - len(defaults)
+    packed = six.moves.zip_longest(args, annotations)
+    for i, (arg, annotation) in enumerate(packed):
+        if isinstance(arg, Tuple):
+            values.append('(%s)' % _format_args(arg.elts))
+        else:
+            argname = arg.name
+            if annotation is not None:
+                argname += ':' + annotation.as_string()
+            values.append(argname)
+
+            if defaults is not None and i >= default_offset:
+                if defaults[i-default_offset] is not None:
+                    values[-1] += '=' + defaults[i-default_offset].as_string()
+    return ', '.join(values)
+
+
+class AssignAttr(mixins.ParentAssignTypeMixin, bases.NodeNG):
+    """class representing an AssignAttr node"""
+    _astroid_fields = ('expr',)
+    expr = None
+
+class Assert(bases.Statement):
+    """class representing an Assert node"""
+    _astroid_fields = ('test', 'fail',)
+    test = None
+    fail = None
+
+class Assign(bases.Statement, mixins.AssignTypeMixin):
+    """class representing an Assign node"""
+    _astroid_fields = ('targets', 'value',)
+    targets = None
+    value = None
+
+class AugAssign(bases.Statement, mixins.AssignTypeMixin):
+    """class representing an AugAssign node"""
+    _astroid_fields = ('target', 'value',)
+    target = None
+    value = None
+
+class Repr(bases.NodeNG):
+    """class representing a Backquote node"""
+    _astroid_fields = ('value',)
+    value = None
+
+class BinOp(bases.NodeNG):
+    """class representing a BinOp node"""
+    _astroid_fields = ('left', 'right',)
+    left = None
+    right = None
+
+class BoolOp(bases.NodeNG):
+    """class representing a BoolOp node"""
+    _astroid_fields = ('values',)
+    values = None
+
+class Break(bases.Statement):
+    """class representing a Break node"""
+
+
+class Call(bases.NodeNG):
+    """class representing a Call node"""
+    _astroid_fields = ('func', 'args', 'keywords')
+    func = None
+    args = None
+    keywords = None
+
+    @property
+    def starargs(self):
+        args = self.args or []
+        return [arg for arg in args if isinstance(arg, Starred)]
+
+    @property
+    def kwargs(self):
+        keywords = self.keywords or []
+        return [keyword for keyword in keywords if keyword.arg is None]
+
+class Compare(bases.NodeNG):
+    """class representing a Compare node"""
+    _astroid_fields = ('left', 'ops',)
+    left = None
+    ops = None
+
+    def get_children(self):
+        """override get_children for tuple fields"""
+        yield self.left
+        for _, comparator in self.ops:
+            yield comparator # we don't want the 'op'
+
+    def last_child(self):
+        """override last_child"""
+        # XXX maybe if self.ops:
+        return self.ops[-1][1]
+        #return self.left
+
+
+class Comprehension(bases.NodeNG):
+    """class representing a Comprehension node"""
+    _astroid_fields = ('target', 'iter', 'ifs')
+    target = None
+    iter = None
+    ifs = None
+
+    optional_assign = True
+    def assign_type(self):
+        return self
+
+    def ass_type(self):
+        warnings.warn('%s.ass_type() is deprecated and slated for removal'
+                      'in astroid 2.0, use %s.assign_type() instead.'
+                      % (type(self).__name__, type(self).__name__),
+                      PendingDeprecationWarning, stacklevel=2)
+        return self.assign_type()
+
+    def _get_filtered_stmts(self, lookup_node, node, stmts, mystmt):
+        """method used in filter_stmts"""
+        if self is mystmt:
+            if isinstance(lookup_node, (Const, Name)):
+                return [lookup_node], True
+
+        elif self.statement() is mystmt:
+            # original node's statement is the assignment, only keeps
+            # current node (gen exp, list comp)
+
+            return [node], True
+
+        return stmts, False
+
+
+class Const(bases.NodeNG, bases.Instance):
+    """represent a constant node like num, str, bool, None, bytes"""
+
+    def __init__(self, value=None):
+        self.value = value
+
+    def getitem(self, index, context=None):
+        if isinstance(self.value, six.string_types):
+            return Const(self.value[index])
+        if isinstance(self.value, bytes) and six.PY3:
+            # Bytes aren't instances of six.string_types
+            # on Python 3. Also, indexing them should return
+            # integers.
+            return Const(self.value[index])
+        raise TypeError('%r (value=%s)' % (self, self.value))
+
+    def has_dynamic_getattr(self):
+        return False
+
+    def itered(self):
+        if isinstance(self.value, six.string_types):
+            return self.value
+        raise TypeError()
+
+    def pytype(self):
+        return self._proxied.qname()
+
+
+class Continue(bases.Statement):
+    """class representing a Continue node"""
+
+
+class Decorators(bases.NodeNG):
+    """class representing a Decorators node"""
+    _astroid_fields = ('nodes',)
+    nodes = None
+
+    def __init__(self, nodes=None):
+        self.nodes = nodes
+
+    def scope(self):
+        # skip the function node to go directly to the upper level scope
+        return self.parent.parent.scope()
+
+
+class DelAttr(mixins.ParentAssignTypeMixin, bases.NodeNG):
+    """class representing a DelAttr node"""
+    _astroid_fields = ('expr',)
+    expr = None
+
+
+
+class Delete(mixins.AssignTypeMixin, bases.Statement):
+    """class representing a Delete node"""
+    _astroid_fields = ('targets',)
+    targets = None
+
+
+class Dict(bases.NodeNG, bases.Instance):
+    """class representing a Dict node"""
+    _astroid_fields = ('items',)
+
+    def __init__(self, items=None):
+        if items is None:
+            self.items = []
+        else:
+            self.items = [(const_factory(k), const_factory(v))
+                          for k, v in list(items.items())]
+
+    def pytype(self):
+        return '%s.dict' % BUILTINS
+
+    def get_children(self):
+        """get children of a Dict node"""
+        # overrides get_children
+        for key, value in self.items:
+            yield key
+            yield value
+
+    def last_child(self):
+        """override last_child"""
+        if self.items:
+            return self.items[-1][1]
+        return None
+
+    def itered(self):
+        return self.items[::2]
+
+    def getitem(self, lookup_key, context=None):
+        for key, value in self.items:
+            # TODO(cpopa): no support for overriding yet, {1:2, **{1: 3}}.
+            if isinstance(key, DictUnpack):
+                try:
+                    return value.getitem(lookup_key, context)
+                except IndexError:
+                    continue
+            for inferredkey in key.infer(context):
+                if inferredkey is util.YES:
+                    continue
+                if isinstance(inferredkey, Const) \
+                        and inferredkey.value == lookup_key:
+                    return value
+        # This should raise KeyError, but all call sites only catch
+        # IndexError. Let's leave it like that for now.
+        raise IndexError(lookup_key)
+
+
+class Expr(bases.Statement):
+    """class representing a Expr node"""
+    _astroid_fields = ('value',)
+    value = None
+
+
+class Ellipsis(bases.NodeNG): # pylint: disable=redefined-builtin
+    """class representing an Ellipsis node"""
+
+
+class EmptyNode(bases.NodeNG):
+    """class representing an EmptyNode node"""
+
+
+class ExceptHandler(mixins.AssignTypeMixin, bases.Statement):
+    """class representing an ExceptHandler node"""
+    _astroid_fields = ('type', 'name', 'body',)
+    type = None
+    name = None
+    body = None
+
+    @decorators.cachedproperty
+    def blockstart_tolineno(self):
+        if self.name:
+            return self.name.tolineno
+        elif self.type:
+            return self.type.tolineno
+        else:
+            return self.lineno
+
+    def catch(self, exceptions):
+        if self.type is None or exceptions is None:
+            return True
+        for node in self.type.nodes_of_class(Name):
+            if node.name in exceptions:
+                return True
+
+
+class Exec(bases.Statement):
+    """class representing an Exec node"""
+    _astroid_fields = ('expr', 'globals', 'locals',)
+    expr = None
+    globals = None
+    locals = None
+
+
+class ExtSlice(bases.NodeNG):
+    """class representing an ExtSlice node"""
+    _astroid_fields = ('dims',)
+    dims = None
+
+class For(mixins.BlockRangeMixIn, mixins.AssignTypeMixin, bases.Statement):
+    """class representing a For node"""
+    _astroid_fields = ('target', 'iter', 'body', 'orelse',)
+    target = None
+    iter = None
+    body = None
+    orelse = None
+
+    optional_assign = True
+    @decorators.cachedproperty
+    def blockstart_tolineno(self):
+        return self.iter.tolineno
+
+
+class AsyncFor(For):
+    """Asynchronous For built with `async` keyword."""
+
+
+class Await(bases.NodeNG):
+    """Await node for the `await` keyword."""
+
+    _astroid_fields = ('value', )
+    value = None
+
+    def postinit(self, value=None):
+        self.value = value
+
+
+class ImportFrom(mixins.ImportFromMixin, bases.Statement):
+    """class representing a From node"""
+
+    def __init__(self, fromname, names, level=0):
+        self.modname = fromname
+        self.names = names
+        self.level = level
+
+class Attribute(bases.NodeNG):
+    """class representing a Attribute node"""
+    _astroid_fields = ('expr',)
+    expr = None
+
+
+class Global(bases.Statement):
+    """class representing a Global node"""
+
+    def __init__(self, names):
+        self.names = names
+
+    def _infer_name(self, frame, name):
+        return name
+
+
+class If(mixins.BlockRangeMixIn, bases.Statement):
+    """class representing an If node"""
+    _astroid_fields = ('test', 'body', 'orelse')
+    test = None
+    body = None
+    orelse = None
+
+    @decorators.cachedproperty
+    def blockstart_tolineno(self):
+        return self.test.tolineno
+
+    def block_range(self, lineno):
+        """handle block line numbers range for if statements"""
+        if lineno == self.body[0].fromlineno:
+            return lineno, lineno
+        if lineno <= self.body[-1].tolineno:
+            return lineno, self.body[-1].tolineno
+        return self._elsed_block_range(lineno, self.orelse,
+                                       self.body[0].fromlineno - 1)
+
+
+class IfExp(bases.NodeNG):
+    """class representing an IfExp node"""
+    _astroid_fields = ('test', 'body', 'orelse')
+    test = None
+    body = None
+    orelse = None
+
+
+class Import(mixins.ImportFromMixin, bases.Statement):
+    """class representing an Import node"""
+
+
+class Index(bases.NodeNG):
+    """class representing an Index node"""
+    _astroid_fields = ('value',)
+    value = None
+
+
+class Keyword(bases.NodeNG):
+    """class representing a Keyword node"""
+    _astroid_fields = ('value',)
+    value = None
+
+
+class List(_BaseContainer):
+    """class representing a List node"""
+
+    def pytype(self):
+        return '%s.list' % BUILTINS
+
+    def getitem(self, index, context=None):
+        return self.elts[index]
+
+
+class Nonlocal(bases.Statement):
+    """class representing a Nonlocal node"""
+
+    def __init__(self, names):
+        self.names = names
+
+    def _infer_name(self, frame, name):
+        return name
+
+
+class Pass(bases.Statement):
+    """class representing a Pass node"""
+
+
+class Print(bases.Statement):
+    """class representing a Print node"""
+    _astroid_fields = ('dest', 'values',)
+    dest = None
+    values = None
+
+
+class Raise(bases.Statement):
+    """class representing a Raise node"""
+    exc = None
+    if six.PY2:
+        _astroid_fields = ('exc', 'inst', 'tback')
+        inst = None
+        tback = None
+    else:
+        _astroid_fields = ('exc', 'cause')
+        exc = None
+        cause = None
+
+    def raises_not_implemented(self):
+        if not self.exc:
+            return
+        for name in self.exc.nodes_of_class(Name):
+            if name.name == 'NotImplementedError':
+                return True
+
+
+class Return(bases.Statement):
+    """class representing a Return node"""
+    _astroid_fields = ('value',)
+    value = None
+
+
+class Set(_BaseContainer):
+    """class representing a Set node"""
+
+    def pytype(self):
+        return '%s.set' % BUILTINS
+
+
+class Slice(bases.NodeNG):
+    """class representing a Slice node"""
+    _astroid_fields = ('lower', 'upper', 'step')
+    lower = None
+    upper = None
+    step = None
+
+class Starred(mixins.ParentAssignTypeMixin, bases.NodeNG):
+    """class representing a Starred node"""
+    _astroid_fields = ('value',)
+    value = None
+
+
+class Subscript(bases.NodeNG):
+    """class representing a Subscript node"""
+    _astroid_fields = ('value', 'slice')
+    value = None
+    slice = None
+
+
+class TryExcept(mixins.BlockRangeMixIn, bases.Statement):
+    """class representing a TryExcept node"""
+    _astroid_fields = ('body', 'handlers', 'orelse',)
+    body = None
+    handlers = None
+    orelse = None
+
+    def _infer_name(self, frame, name):
+        return name
+
+    def block_range(self, lineno):
+        """handle block line numbers range for try/except statements"""
+        last = None
+        for exhandler in self.handlers:
+            if exhandler.type and lineno == exhandler.type.fromlineno:
+                return lineno, lineno
+            if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno:
+                return lineno, exhandler.body[-1].tolineno
+            if last is None:
+                last = exhandler.body[0].fromlineno - 1
+        return self._elsed_block_range(lineno, self.orelse, last)
+
+
+class TryFinally(mixins.BlockRangeMixIn, bases.Statement):
+    """class representing a TryFinally node"""
+    _astroid_fields = ('body', 'finalbody',)
+    body = None
+    finalbody = None
+
+    def block_range(self, lineno):
+        """handle block line numbers range for try/finally statements"""
+        child = self.body[0]
+        # py2.5 try: except: finally:
+        if (isinstance(child, TryExcept) and child.fromlineno == self.fromlineno
+                and lineno > self.fromlineno and lineno <= child.tolineno):
+            return child.block_range(lineno)
+        return self._elsed_block_range(lineno, self.finalbody)
+
+
+class Tuple(_BaseContainer):
+    """class representing a Tuple node"""
+
+    def pytype(self):
+        return '%s.tuple' % BUILTINS
+
+    def getitem(self, index, context=None):
+        return self.elts[index]
+
+
+class UnaryOp(bases.NodeNG):
+    """class representing an UnaryOp node"""
+    _astroid_fields = ('operand',)
+    operand = None
+
+
+class While(mixins.BlockRangeMixIn, bases.Statement):
+    """class representing a While node"""
+    _astroid_fields = ('test', 'body', 'orelse',)
+    test = None
+    body = None
+    orelse = None
+
+    @decorators.cachedproperty
+    def blockstart_tolineno(self):
+        return self.test.tolineno
+
+    def block_range(self, lineno):
+        """handle block line numbers range for for and while statements"""
+        return self. _elsed_block_range(lineno, self.orelse)
+
+
+class With(mixins.BlockRangeMixIn, mixins.AssignTypeMixin, bases.Statement):
+    """class representing a With node"""
+    _astroid_fields = ('items', 'body')
+    items = None
+    body = None
+
+    @decorators.cachedproperty
+    def blockstart_tolineno(self):
+        return self.items[-1][0].tolineno
+
+    def get_children(self):
+        for expr, var in self.items:
+            yield expr
+            if var:
+                yield var
+        for elt in self.body:
+            yield elt
+
+
+class AsyncWith(With):
+    """Asynchronous `with` built with the `async` keyword."""
+
+
+class Yield(bases.NodeNG):
+    """class representing a Yield node"""
+    _astroid_fields = ('value',)
+    value = None
+
+class YieldFrom(Yield):
+    """ Class representing a YieldFrom node. """
+
+
+class DictUnpack(bases.NodeNG):
+    """Represents the unpacking of dicts into dicts using PEP 448."""
+
+
+# constants ##############################################################
+
+CONST_CLS = {
+    list: List,
+    tuple: Tuple,
+    dict: Dict,
+    set: Set,
+    type(None): Const,
+    type(NotImplemented): Const,
+    }
+
+def _update_const_classes():
+    """update constant classes, so the keys of CONST_CLS can be reused"""
+    klasses = (bool, int, float, complex, str)
+    if six.PY2:
+        klasses += (unicode, long)
+    klasses += (bytes,)
+    for kls in klasses:
+        CONST_CLS[kls] = Const
+_update_const_classes()
+
+
+def const_factory(value):
+    """return an astroid node for a python value"""
+    # XXX we should probably be stricter here and only consider stuff in
+    # CONST_CLS or do better treatment: in case where value is not in CONST_CLS,
+    # we should rather recall the builder on this value than returning an empty
+    # node (another option being that const_factory shouldn't be called with something
+    # not in CONST_CLS)
+    assert not isinstance(value, bases.NodeNG)
+    try:
+        return CONST_CLS[value.__class__](value)
+    except (KeyError, AttributeError):
+        node = EmptyNode()
+        node.object = value
+        return node
+
+
+# Backward-compatibility aliases
+def instancecheck(cls, other):
+    wrapped = cls.__wrapped__
+    other_cls = other.__class__
+    is_instance_of = wrapped is other_cls or issubclass(other_cls, wrapped)
+    warnings.warn("%r is deprecated and slated for removal in astroid "
+                  "2.0, use %r instead" % (cls.__class__.__name__,
+                                           wrapped.__name__),
+                  PendingDeprecationWarning, stacklevel=2)
+    return is_instance_of
+
+
+def proxy_alias(alias_name, node_type):
+    proxy = type(alias_name, (lazy_object_proxy.Proxy,),
+                 {'__class__': object.__dict__['__class__'],
+                  '__instancecheck__': instancecheck})
+    return proxy(lambda: node_type)
+
+Backquote = proxy_alias('Backquote', Repr)
+Discard = proxy_alias('Discard', Expr)
+AssName = proxy_alias('AssName', AssignName)
+AssAttr = proxy_alias('AssAttr', AssignAttr)
+Getattr = proxy_alias('Getattr', Attribute)
+CallFunc = proxy_alias('CallFunc', Call)
+From = proxy_alias('From', ImportFrom)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/simple.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/simple.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/simple.py	(revision 1126)
@@ -0,0 +1,246 @@
+import operator
+
+from .compat import PY2
+from .compat import PY3
+from .compat import with_metaclass
+from .utils import cached_property
+from .utils import identity
+
+
+def make_proxy_method(code):
+    def proxy_wrapper(self, *args):
+        return code(self.__wrapped__, *args)
+
+    return proxy_wrapper
+
+
+class _ProxyMethods(object):
+    # We use properties to override the values of __module__ and
+    # __doc__. If we add these in ObjectProxy, the derived class
+    # __dict__ will still be setup to have string variants of these
+    # attributes and the rules of descriptors means that they appear to
+    # take precedence over the properties in the base class. To avoid
+    # that, we copy the properties into the derived class type itself
+    # via a meta class. In that way the properties will always take
+    # precedence.
+
+    @property
+    def __module__(self):
+        return self.__wrapped__.__module__
+
+    @__module__.setter
+    def __module__(self, value):
+        self.__wrapped__.__module__ = value
+
+    @property
+    def __doc__(self):
+        return self.__wrapped__.__doc__
+
+    @__doc__.setter
+    def __doc__(self, value):
+        self.__wrapped__.__doc__ = value
+
+    # Need to also propagate the special __weakref__ attribute for case
+    # where decorating classes which will define this. If do not define
+    # it and use a function like inspect.getmembers() on a decorator
+    # class it will fail. This can't be in the derived classes.
+
+    @property
+    def __weakref__(self):
+        return self.__wrapped__.__weakref__
+
+
+class _ProxyMetaType(type):
+    def __new__(cls, name, bases, dictionary):
+        # Copy our special properties into the class so that they
+        # always take precedence over attributes of the same name added
+        # during construction of a derived class. This is to save
+        # duplicating the implementation for them in all derived classes.
+
+        dictionary.update(vars(_ProxyMethods))
+        dictionary.pop('__dict__')
+
+        return type.__new__(cls, name, bases, dictionary)
+
+
+class Proxy(with_metaclass(_ProxyMetaType)):
+    __factory__ = None
+
+    def __init__(self, factory):
+        self.__dict__['__factory__'] = factory
+
+    @cached_property
+    def __wrapped__(self):
+        self = self.__dict__
+        if '__factory__' in self:
+            factory = self['__factory__']
+            return factory()
+        else:
+            raise ValueError("Proxy hasn't been initiated: __factory__ is missing.")
+
+    __name__ = property(make_proxy_method(operator.attrgetter('__name__')))
+    __class__ = property(make_proxy_method(operator.attrgetter('__class__')))
+    __annotations__ = property(make_proxy_method(operator.attrgetter('__anotations__')))
+    __dir__ = make_proxy_method(dir)
+    __str__ = make_proxy_method(str)
+
+    if PY3:
+        __bytes__ = make_proxy_method(bytes)
+
+    def __repr__(self, __getattr__=object.__getattribute__):
+        if '__wrapped__' in self.__dict__:
+            return '<%s at 0x%x wrapping %r at 0x%x with factory %r>' % (
+                type(self).__name__, id(self),
+                self.__wrapped__, id(self.__wrapped__),
+                self.__factory__
+            )
+        else:
+            return '<%s at 0x%x with factory %r>' % (
+                type(self).__name__, id(self),
+                self.__factory__
+            )
+
+    __reversed__ = make_proxy_method(reversed)
+
+    if PY3:
+        __round__ = make_proxy_method(round)
+
+    __lt__ = make_proxy_method(operator.lt)
+    __le__ = make_proxy_method(operator.le)
+    __eq__ = make_proxy_method(operator.eq)
+    __ne__ = make_proxy_method(operator.ne)
+    __gt__ = make_proxy_method(operator.gt)
+    __ge__ = make_proxy_method(operator.ge)
+    __hash__ = make_proxy_method(hash)
+    __nonzero__ = make_proxy_method(bool)
+    __bool__ = make_proxy_method(bool)
+
+    def __setattr__(self, name, value):
+        if hasattr(type(self), name):
+            self.__dict__[name] = value
+        else:
+            setattr(self.__wrapped__, name, value)
+
+    def __getattr__(self, name):
+        if name in ('__wrapped__', '__factory__'):
+            raise AttributeError(name)
+        else:
+            return getattr(self.__wrapped__, name)
+
+    def __delattr__(self, name):
+        if hasattr(type(self), name):
+            del self.__dict__[name]
+        else:
+            delattr(self.__wrapped__, name)
+
+    __add__ = make_proxy_method(operator.add)
+    __sub__ = make_proxy_method(operator.sub)
+    __mul__ = make_proxy_method(operator.mul)
+    __div__ = make_proxy_method(operator.div if PY2 else operator.truediv)
+    __truediv__ = make_proxy_method(operator.truediv)
+    __floordiv__ = make_proxy_method(operator.floordiv)
+    __mod__ = make_proxy_method(operator.mod)
+    __divmod__ = make_proxy_method(divmod)
+    __pow__ = make_proxy_method(pow)
+    __lshift__ = make_proxy_method(operator.lshift)
+    __rshift__ = make_proxy_method(operator.rshift)
+    __and__ = make_proxy_method(operator.and_)
+    __xor__ = make_proxy_method(operator.xor)
+    __or__ = make_proxy_method(operator.or_)
+
+    def __radd__(self, other):
+        return other + self.__wrapped__
+
+    def __rsub__(self, other):
+        return other - self.__wrapped__
+
+    def __rmul__(self, other):
+        return other * self.__wrapped__
+
+    def __rdiv__(self, other):
+        return operator.div(other, self.__wrapped__)
+
+    def __rtruediv__(self, other):
+        return operator.truediv(other, self.__wrapped__)
+
+    def __rfloordiv__(self, other):
+        return other // self.__wrapped__
+
+    def __rmod__(self, other):
+        return other % self.__wrapped__
+
+    def __rdivmod__(self, other):
+        return divmod(other, self.__wrapped__)
+
+    def __rpow__(self, other, *args):
+        return pow(other, self.__wrapped__, *args)
+
+    def __rlshift__(self, other):
+        return other << self.__wrapped__
+
+    def __rrshift__(self, other):
+        return other >> self.__wrapped__
+
+    def __rand__(self, other):
+        return other & self.__wrapped__
+
+    def __rxor__(self, other):
+        return other ^ self.__wrapped__
+
+    def __ror__(self, other):
+        return other | self.__wrapped__
+
+    __iadd__ = make_proxy_method(operator.iadd)
+    __isub__ = make_proxy_method(operator.isub)
+    __imul__ = make_proxy_method(operator.imul)
+    __idiv__ = make_proxy_method(operator.idiv if PY2 else operator.itruediv)
+    __itruediv__ = make_proxy_method(operator.itruediv)
+    __ifloordiv__ = make_proxy_method(operator.ifloordiv)
+    __imod__ = make_proxy_method(operator.imod)
+    __ipow__ = make_proxy_method(operator.ipow)
+    __ilshift__ = make_proxy_method(operator.ilshift)
+    __irshift__ = make_proxy_method(operator.irshift)
+    __iand__ = make_proxy_method(operator.iand)
+    __ixor__ = make_proxy_method(operator.ixor)
+    __ior__ = make_proxy_method(operator.ior)
+    __neg__ = make_proxy_method(operator.neg)
+    __pos__ = make_proxy_method(operator.pos)
+    __abs__ = make_proxy_method(operator.abs)
+    __invert__ = make_proxy_method(operator.invert)
+
+    __int__ = make_proxy_method(int)
+
+    if PY2:
+        __long__ = make_proxy_method(long)  # flake8: noqa
+
+    __float__ = make_proxy_method(float)
+    __oct__ = make_proxy_method(oct)
+    __hex__ = make_proxy_method(hex)
+    __index__ = make_proxy_method(operator.index)
+    __len__ = make_proxy_method(len)
+    __contains__ = make_proxy_method(operator.contains)
+    __getitem__ = make_proxy_method(operator.getitem)
+    __setitem__ = make_proxy_method(operator.setitem)
+    __delitem__ = make_proxy_method(operator.delitem)
+
+    if PY2:
+        __getslice__ = make_proxy_method(operator.getslice)
+        __setslice__ = make_proxy_method(operator.setslice)
+        __delslice__ = make_proxy_method(operator.delslice)
+
+    def __enter__(self):
+        return self.__wrapped__.__enter__()
+
+    def __exit__(self, *args, **kwargs):
+        return self.__wrapped__.__exit__(*args, **kwargs)
+
+    __iter__ = make_proxy_method(iter)
+
+    def __call__(self, *args, **kwargs):
+        return self.__wrapped__(*args, **kwargs)
+
+    def __reduce__(self):
+        return identity, (self.__wrapped__,)
+
+    def __reduce_ex__(self, protocol):
+        return identity, (self.__wrapped__,)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/cext.c
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/cext.c	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/cext.c	(revision 1126)
@@ -0,0 +1,1421 @@
+/* ------------------------------------------------------------------------- */
+
+#include "Python.h"
+
+#include "structmember.h"
+
+#ifndef PyVarObject_HEAD_INIT
+#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
+#endif
+
+#define Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(object) \
+    if (PyObject_IsInstance(object, (PyObject *)&Proxy_Type)) { \
+        object = Proxy__ensure_wrapped((ProxyObject *)object); \
+        if (!object) return NULL; \
+    }
+
+#define Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self) if (!Proxy__ensure_wrapped(self)) return NULL;
+#define Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self) if (!Proxy__ensure_wrapped(self)) return -1;
+
+#if PY_MAJOR_VERSION < 3
+#define Py_hash_t long
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+typedef struct {
+    PyObject_HEAD
+
+    PyObject *dict;
+    PyObject *wrapped;
+    PyObject *factory;
+} ProxyObject;
+
+PyTypeObject Proxy_Type;
+
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *identity_ref = NULL;
+static PyObject *
+identity(PyObject *self, PyObject *value)
+{
+    Py_INCREF(value);
+    return value;
+}
+
+/* ------------------------------------------------------------------------- */
+
+PyDoc_STRVAR(identity_doc, "Indentity function: returns the single argument.");
+
+static struct PyMethodDef module_functions[] = {
+    {"identity", identity, METH_O, identity_doc},
+    {NULL,       NULL}
+};
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy__ensure_wrapped(ProxyObject *self)
+{
+    PyObject *wrapped;
+
+    if (self->wrapped) {
+        return self->wrapped;
+    } else {
+        if (self->factory) {
+            wrapped = PyObject_CallFunctionObjArgs(self->factory, NULL);
+            if (wrapped) {
+                self->wrapped = wrapped;
+                return wrapped;
+            } else {
+                return NULL;
+            }
+        } else {
+            PyErr_SetString(PyExc_ValueError, "Proxy hasn't been initiated: __factory__ is missing.");
+            return NULL;
+        }
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_new(PyTypeObject *type,
+        PyObject *args, PyObject *kwds)
+{
+    ProxyObject *self;
+
+    self = (ProxyObject *)type->tp_alloc(type, 0);
+
+    if (!self)
+        return NULL;
+
+    self->dict = PyDict_New();
+    self->wrapped = NULL;
+    self->factory = NULL;
+
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_raw_init(ProxyObject *self,
+        PyObject *factory)
+{
+    Py_INCREF(factory);
+    Py_XDECREF(self->wrapped);
+    Py_XDECREF(self->factory);
+    self->factory = factory;
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_init(ProxyObject *self,
+        PyObject *args, PyObject *kwds)
+{
+    PyObject *wrapped = NULL;
+
+    static char *kwlist[] = { "wrapped", NULL };
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:ObjectProxy",
+            kwlist, &wrapped)) {
+        return -1;
+    }
+
+    return Proxy_raw_init(self, wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_traverse(ProxyObject *self,
+        visitproc visit, void *arg)
+{
+    Py_VISIT(self->dict);
+    Py_VISIT(self->wrapped);
+    Py_VISIT(self->factory);
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_clear(ProxyObject *self)
+{
+    Py_CLEAR(self->dict);
+    Py_CLEAR(self->wrapped);
+    Py_CLEAR(self->factory);
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static void Proxy_dealloc(ProxyObject *self)
+{
+    PyObject_GC_UnTrack(self);
+
+    Proxy_clear(self);
+
+    Py_TYPE(self)->tp_free(self);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_repr(ProxyObject *self)
+{
+
+#if PY_MAJOR_VERSION < 3
+    PyObject *factory_repr;
+
+    factory_repr = PyObject_Repr(self->factory);
+    if (factory_repr == NULL)
+        return NULL;
+#endif
+
+    if (self->wrapped) {
+#if PY_MAJOR_VERSION >= 3
+        return PyUnicode_FromFormat("<%s at %p wrapping %R at %p with factory %R>",
+                Py_TYPE(self)->tp_name, self,
+                self->wrapped, self->wrapped,
+                self->factory);
+#else
+        PyObject *wrapped_repr;
+
+        wrapped_repr = PyObject_Repr(self->wrapped);
+        if (wrapped_repr == NULL)
+            return NULL;
+
+        return PyString_FromFormat("<%s at %p wrapping %s at %p with factory %s>",
+                Py_TYPE(self)->tp_name, self,
+                PyString_AS_STRING(wrapped_repr), self->wrapped,
+                PyString_AS_STRING(factory_repr));
+#endif
+    } else {
+#if PY_MAJOR_VERSION >= 3
+        return PyUnicode_FromFormat("<%s at %p with factory %R>",
+                Py_TYPE(self)->tp_name, self,
+                self->factory);
+#else
+        return PyString_FromFormat("<%s at %p with factory %s>",
+                Py_TYPE(self)->tp_name, self,
+                PyString_AS_STRING(factory_repr));
+#endif
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+static Py_hash_t Proxy_hash(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PyObject_Hash(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_str(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_Str(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_add(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Add(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_subtract(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Subtract(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_multiply(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Multiply(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *Proxy_divide(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Divide(o1, o2);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_remainder(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Remainder(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_divmod(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Divmod(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_power(PyObject *o1, PyObject *o2,
+        PyObject *modulo)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Power(o1, o2, modulo);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_negative(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Negative(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_positive(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Positive(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_absolute(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Absolute(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_bool(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PyObject_IsTrue(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_invert(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Invert(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_lshift(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Lshift(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_rshift(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Rshift(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_and(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_And(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_xor(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Xor(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_or(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_Or(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *Proxy_int(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Int(self->wrapped);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_long(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Long(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_float(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Float(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *Proxy_oct(ProxyObject *self)
+{
+    PyNumberMethods *nb;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    if ((nb = self->wrapped->ob_type->tp_as_number) == NULL ||
+        nb->nb_oct == NULL) {
+        PyErr_SetString(PyExc_TypeError,
+                   "oct() argument can't be converted to oct");
+        return NULL;
+    }
+
+    return (*nb->nb_oct)(self->wrapped);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *Proxy_hex(ProxyObject *self)
+{
+    PyNumberMethods *nb;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    if ((nb = self->wrapped->ob_type->tp_as_number) == NULL ||
+        nb->nb_hex == NULL) {
+        PyErr_SetString(PyExc_TypeError,
+                   "hex() argument can't be converted to hex");
+        return NULL;
+    }
+
+    return (*nb->nb_hex)(self->wrapped);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_add(ProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceAdd(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_subtract(
+        ProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceSubtract(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_multiply(
+        ProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceMultiply(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION < 3
+static PyObject *Proxy_inplace_divide(
+        ProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceDivide(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_remainder(
+        ProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceRemainder(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_power(ProxyObject *self,
+        PyObject *other, PyObject *modulo)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlacePower(self->wrapped, other, modulo);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_lshift(ProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceLshift(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_rshift(ProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceRshift(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_and(ProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceAnd(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_xor(ProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceXor(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_or(ProxyObject *self,
+        PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceOr(self->wrapped, other);
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_floor_divide(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_FloorDivide(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_true_divide(PyObject *o1, PyObject *o2)
+{
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o1);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(o2);
+
+    return PyNumber_TrueDivide(o1, o2);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_floor_divide(
+        ProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceFloorDivide(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_inplace_true_divide(
+        ProxyObject *self, PyObject *other)
+{
+    PyObject *object = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+    Proxy__WRAPPED_REPLACE_OR_RETURN_NULL(other);
+
+    object = PyNumber_InPlaceTrueDivide(self->wrapped, other);
+
+    if (!object)
+        return NULL;
+
+    Py_DECREF(self->wrapped);
+    self->wrapped = object;
+
+    Py_INCREF(self);
+    return (PyObject *)self;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_index(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyNumber_Index(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static Py_ssize_t Proxy_length(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PyObject_Length(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_contains(ProxyObject *self,
+        PyObject *value)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PySequence_Contains(self->wrapped, value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_getitem(ProxyObject *self,
+        PyObject *key)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetItem(self->wrapped, key);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_setitem(ProxyObject *self,
+        PyObject *key, PyObject* value)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    if (value == NULL)
+        return PyObject_DelItem(self->wrapped, key);
+    else
+        return PyObject_SetItem(self->wrapped, key, value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_dir(
+        ProxyObject *self, PyObject *args)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_Dir(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_enter(
+        ProxyObject *self, PyObject *args, PyObject *kwds)
+{
+    PyObject *method = NULL;
+    PyObject *result = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    method = PyObject_GetAttrString(self->wrapped, "__enter__");
+
+    if (!method)
+        return NULL;
+
+    result = PyObject_Call(method, args, kwds);
+
+    Py_DECREF(method);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_exit(
+        ProxyObject *self, PyObject *args, PyObject *kwds)
+{
+    PyObject *method = NULL;
+    PyObject *result = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    method = PyObject_GetAttrString(self->wrapped, "__exit__");
+
+    if (!method)
+        return NULL;
+
+    result = PyObject_Call(method, args, kwds);
+
+    Py_DECREF(method);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_bytes(
+        ProxyObject *self, PyObject *args)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_Bytes(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_reversed(
+        ProxyObject *self, PyObject *args)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_CallFunctionObjArgs((PyObject *)&PyReversed_Type,
+            self->wrapped, NULL);
+}
+
+/* ------------------------------------------------------------------------- */
+static PyObject *Proxy_reduce(
+        ProxyObject *self, PyObject *args)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return Py_BuildValue("(O(O))", identity_ref, self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION >= 3
+static PyObject *Proxy_round(
+        ProxyObject *self, PyObject *args)
+{
+    PyObject *module = NULL;
+    PyObject *dict = NULL;
+    PyObject *round = NULL;
+
+    PyObject *result = NULL;
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    module = PyImport_ImportModule("builtins");
+
+    if (!module)
+        return NULL;
+
+    dict = PyModule_GetDict(module);
+    round = PyDict_GetItemString(dict, "round");
+
+    if (!round) {
+        Py_DECREF(module);
+        return NULL;
+    }
+
+    Py_INCREF(round);
+    Py_DECREF(module);
+
+    result = PyObject_CallFunctionObjArgs(round, self->wrapped, NULL);
+
+    Py_DECREF(round);
+
+    return result;
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_name(
+        ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetAttrString(self->wrapped, "__name__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_set_name(ProxyObject *self,
+        PyObject *value)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PyObject_SetAttrString(self->wrapped, "__name__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_qualname(
+        ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetAttrString(self->wrapped, "__qualname__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_set_qualname(ProxyObject *self,
+        PyObject *value)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PyObject_SetAttrString(self->wrapped, "__qualname__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_module(
+        ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetAttrString(self->wrapped, "__module__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_set_module(ProxyObject *self,
+        PyObject *value)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    if (PyObject_SetAttrString(self->wrapped, "__module__", value) == -1)
+        return -1;
+
+    return PyDict_SetItemString(self->dict, "__module__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_doc(
+        ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetAttrString(self->wrapped, "__doc__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_set_doc(ProxyObject *self,
+        PyObject *value)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    if (PyObject_SetAttrString(self->wrapped, "__doc__", value) == -1)
+        return -1;
+
+    return PyDict_SetItemString(self->dict, "__doc__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_class(
+        ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetAttrString(self->wrapped, "__class__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_annotations(
+        ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetAttrString(self->wrapped, "__annotations__");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_set_annotations(ProxyObject *self,
+        PyObject *value)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PyObject_SetAttrString(self->wrapped, "__annotations__", value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_wrapped(
+        ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    Py_INCREF(self->wrapped);
+    return self->wrapped;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_set_wrapped(ProxyObject *self,
+        PyObject *value)
+{
+    if (value) Py_INCREF(value);
+    Py_XDECREF(self->wrapped);
+
+    self->wrapped = value;
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_get_factory(
+        ProxyObject *self)
+{
+    Py_INCREF(self->factory);
+    return self->factory;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_set_factory(ProxyObject *self,
+        PyObject *value)
+{
+    if (value) Py_INCREF(value);
+    Py_XDECREF(self->factory);
+
+    self->factory = value;
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_getattro(
+        ProxyObject *self, PyObject *name)
+{
+    PyObject *object = NULL;
+    PyObject *result = NULL;
+
+    static PyObject *getattr_str = NULL;
+
+    object = PyObject_GenericGetAttr((PyObject *)self, name);
+
+    if (object)
+        return object;
+
+    PyErr_Clear();
+
+    if (!getattr_str) {
+#if PY_MAJOR_VERSION >= 3
+        getattr_str = PyUnicode_InternFromString("__getattr__");
+#else
+        getattr_str = PyString_InternFromString("__getattr__");
+#endif
+    }
+
+    object = PyObject_GenericGetAttr((PyObject *)self, getattr_str);
+
+    if (!object)
+        return NULL;
+
+    result = PyObject_CallFunctionObjArgs(object, name, NULL);
+
+    Py_DECREF(object);
+
+    return result;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_getattr(
+        ProxyObject *self, PyObject *args)
+{
+    PyObject *name = NULL;
+
+#if PY_MAJOR_VERSION >= 3
+    if (!PyArg_ParseTuple(args, "U:__getattr__", &name))
+        return NULL;
+#else
+    if (!PyArg_ParseTuple(args, "S:__getattr__", &name))
+        return NULL;
+#endif
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetAttr(self->wrapped, name);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int Proxy_setattro(
+        ProxyObject *self, PyObject *name, PyObject *value)
+{
+    if (PyObject_HasAttr((PyObject *)Py_TYPE(self), name))
+        return PyObject_GenericSetAttr((PyObject *)self, name, value);
+
+    Proxy__ENSURE_WRAPPED_OR_RETURN_MINUS1(self);
+
+    return PyObject_SetAttr(self->wrapped, name, value);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_richcompare(ProxyObject *self,
+        PyObject *other, int opcode)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_RichCompare(self->wrapped, other, opcode);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_iter(ProxyObject *self)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_GetIter(self->wrapped);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static PyObject *Proxy_call(
+        ProxyObject *self, PyObject *args, PyObject *kwds)
+{
+    Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self);
+
+    return PyObject_Call(self->wrapped, args, kwds);
+}
+
+/* ------------------------------------------------------------------------- */;
+
+static PyNumberMethods Proxy_as_number = {
+    (binaryfunc)Proxy_add,                  /*nb_add*/
+    (binaryfunc)Proxy_subtract,             /*nb_subtract*/
+    (binaryfunc)Proxy_multiply,             /*nb_multiply*/
+#if PY_MAJOR_VERSION < 3
+    (binaryfunc)Proxy_divide,               /*nb_divide*/
+#endif
+    (binaryfunc)Proxy_remainder,            /*nb_remainder*/
+    (binaryfunc)Proxy_divmod,               /*nb_divmod*/
+    (ternaryfunc)Proxy_power,               /*nb_power*/
+    (unaryfunc)Proxy_negative,              /*nb_negative*/
+    (unaryfunc)Proxy_positive,              /*nb_positive*/
+    (unaryfunc)Proxy_absolute,              /*nb_absolute*/
+    (inquiry)Proxy_bool,                    /*nb_nonzero/nb_bool*/
+    (unaryfunc)Proxy_invert,                /*nb_invert*/
+    (binaryfunc)Proxy_lshift,               /*nb_lshift*/
+    (binaryfunc)Proxy_rshift,               /*nb_rshift*/
+    (binaryfunc)Proxy_and,                  /*nb_and*/
+    (binaryfunc)Proxy_xor,                  /*nb_xor*/
+    (binaryfunc)Proxy_or,                   /*nb_or*/
+#if PY_MAJOR_VERSION < 3
+    0,                                      /*nb_coerce*/
+#endif
+#if PY_MAJOR_VERSION < 3
+    (unaryfunc)Proxy_int,                   /*nb_int*/
+    (unaryfunc)Proxy_long,                  /*nb_long*/
+#else
+    (unaryfunc)Proxy_long,                  /*nb_int*/
+    0,                                      /*nb_long/nb_reserved*/
+#endif
+    (unaryfunc)Proxy_float,                 /*nb_float*/
+#if PY_MAJOR_VERSION < 3
+    (unaryfunc)Proxy_oct,                   /*nb_oct*/
+    (unaryfunc)Proxy_hex,                   /*nb_hex*/
+#endif
+    (binaryfunc)Proxy_inplace_add,          /*nb_inplace_add*/
+    (binaryfunc)Proxy_inplace_subtract,     /*nb_inplace_subtract*/
+    (binaryfunc)Proxy_inplace_multiply,     /*nb_inplace_multiply*/
+#if PY_MAJOR_VERSION < 3
+    (binaryfunc)Proxy_inplace_divide,       /*nb_inplace_divide*/
+#endif
+    (binaryfunc)Proxy_inplace_remainder,    /*nb_inplace_remainder*/
+    (ternaryfunc)Proxy_inplace_power,       /*nb_inplace_power*/
+    (binaryfunc)Proxy_inplace_lshift,       /*nb_inplace_lshift*/
+    (binaryfunc)Proxy_inplace_rshift,       /*nb_inplace_rshift*/
+    (binaryfunc)Proxy_inplace_and,          /*nb_inplace_and*/
+    (binaryfunc)Proxy_inplace_xor,          /*nb_inplace_xor*/
+    (binaryfunc)Proxy_inplace_or,           /*nb_inplace_or*/
+    (binaryfunc)Proxy_floor_divide,         /*nb_floor_divide*/
+    (binaryfunc)Proxy_true_divide,          /*nb_true_divide*/
+    (binaryfunc)Proxy_inplace_floor_divide, /*nb_inplace_floor_divide*/
+    (binaryfunc)Proxy_inplace_true_divide,  /*nb_inplace_true_divide*/
+    (unaryfunc)Proxy_index,                 /*nb_index*/
+};
+
+static PySequenceMethods Proxy_as_sequence = {
+    (lenfunc)Proxy_length,      /*sq_length*/
+    0,                          /*sq_concat*/
+    0,                          /*sq_repeat*/
+    0,                          /*sq_item*/
+    0,                          /*sq_slice*/
+    0,                          /*sq_ass_item*/
+    0,                          /*sq_ass_slice*/
+    (objobjproc)Proxy_contains, /* sq_contains */
+};
+
+static PyMappingMethods Proxy_as_mapping = {
+    (lenfunc)Proxy_length,        /*mp_length*/
+    (binaryfunc)Proxy_getitem,    /*mp_subscript*/
+    (objobjargproc)Proxy_setitem, /*mp_ass_subscript*/
+};
+
+static PyMethodDef Proxy_methods[] = {
+    { "__dir__",    (PyCFunction)Proxy_dir, METH_NOARGS, 0 },
+    { "__enter__",  (PyCFunction)Proxy_enter,
+                    METH_VARARGS | METH_KEYWORDS, 0 },
+    { "__exit__",   (PyCFunction)Proxy_exit,
+                    METH_VARARGS | METH_KEYWORDS, 0 },
+    { "__getattr__", (PyCFunction)Proxy_getattr,
+                    METH_VARARGS , 0 },
+    { "__bytes__",  (PyCFunction)Proxy_bytes, METH_NOARGS, 0 },
+    { "__reversed__", (PyCFunction)Proxy_reversed, METH_NOARGS, 0 },
+    { "__reduce__", (PyCFunction)Proxy_reduce, METH_NOARGS, 0 },
+    { "__reduce_ex__", (PyCFunction)Proxy_reduce, METH_O, 0 },
+#if PY_MAJOR_VERSION >= 3
+    { "__round__",  (PyCFunction)Proxy_round, METH_NOARGS, 0 },
+#endif
+    { NULL, NULL },
+};
+
+static PyGetSetDef Proxy_getset[] = {
+    { "__name__",           (getter)Proxy_get_name,
+                            (setter)Proxy_set_name, 0 },
+    { "__qualname__",       (getter)Proxy_get_qualname,
+                            (setter)Proxy_set_qualname, 0 },
+    { "__module__",         (getter)Proxy_get_module,
+                            (setter)Proxy_set_module, 0 },
+    { "__doc__",            (getter)Proxy_get_doc,
+                            (setter)Proxy_set_doc, 0 },
+    { "__class__",          (getter)Proxy_get_class,
+                            NULL, 0 },
+    { "__annotations__",    (getter)Proxy_get_annotations,
+                            (setter)Proxy_set_annotations, 0 },
+    { "__wrapped__",        (getter)Proxy_get_wrapped,
+                            (setter)Proxy_set_wrapped, 0 },
+    { "__factory__",        (getter)Proxy_get_factory,
+                            (setter)Proxy_set_factory, 0 },
+    { NULL },
+};
+
+PyTypeObject Proxy_Type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "Proxy",                  /*tp_name*/
+    sizeof(ProxyObject),            /*tp_basicsize*/
+    0,                              /*tp_itemsize*/
+    /* methods */
+    (destructor)Proxy_dealloc,      /*tp_dealloc*/
+    0,                              /*tp_print*/
+    0,                              /*tp_getattr*/
+    0,                              /*tp_setattr*/
+    0,                              /*tp_compare*/
+    (unaryfunc)Proxy_repr,          /*tp_repr*/
+    &Proxy_as_number,               /*tp_as_number*/
+    &Proxy_as_sequence,             /*tp_as_sequence*/
+    &Proxy_as_mapping,              /*tp_as_mapping*/
+    (hashfunc)Proxy_hash,           /*tp_hash*/
+    (ternaryfunc)Proxy_call,        /*tp_call*/
+    (unaryfunc)Proxy_str,           /*tp_str*/
+    (getattrofunc)Proxy_getattro,   /*tp_getattro*/
+    (setattrofunc)Proxy_setattro,   /*tp_setattro*/
+    0,                              /*tp_as_buffer*/
+#if PY_MAJOR_VERSION < 3
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,
+                                    /*tp_flags*/
+#else
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+                                    /*tp_flags*/
+#endif
+    0,                              /*tp_doc*/
+    (traverseproc)Proxy_traverse,   /*tp_traverse*/
+    (inquiry)Proxy_clear,           /*tp_clear*/
+    (richcmpfunc)Proxy_richcompare, /*tp_richcompare*/
+    0,                              /*tp_weaklistoffset*/
+    (getiterfunc)Proxy_iter,        /*tp_iter*/
+    0,                              /*tp_iternext*/
+    Proxy_methods,                  /*tp_methods*/
+    0,                              /*tp_members*/
+    Proxy_getset,                   /*tp_getset*/
+    0,                              /*tp_base*/
+    0,                              /*tp_dict*/
+    0,                              /*tp_descr_get*/
+    0,                              /*tp_descr_set*/
+    offsetof(ProxyObject, dict),    /*tp_dictoffset*/
+    (initproc)Proxy_init,           /*tp_init*/
+    PyType_GenericAlloc,            /*tp_alloc*/
+    Proxy_new,                      /*tp_new*/
+    PyObject_GC_Del,                /*tp_free*/
+    0,                              /*tp_is_gc*/
+};
+
+/* ------------------------------------------------------------------------- */
+
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef moduledef = {
+    PyModuleDef_HEAD_INIT,
+    "lazy_object_proxy.cext", /* m_name */
+    NULL,                     /* m_doc */
+    -1,                       /* m_size */
+    module_functions,         /* m_methods */
+    NULL,                     /* m_reload */
+    NULL,                     /* m_traverse */
+    NULL,                     /* m_clear */
+    NULL,                     /* m_free */
+};
+#endif
+
+static PyObject *
+moduleinit(void)
+{
+    PyObject *module;
+    PyObject *dict;
+
+#if PY_MAJOR_VERSION >= 3
+    module = PyModule_Create(&moduledef);
+#else
+    module = Py_InitModule3("lazy_object_proxy.cext", module_functions, NULL);
+#endif
+
+    if (module == NULL)
+        return NULL;
+
+    if (PyType_Ready(&Proxy_Type) < 0)
+        return NULL;
+
+    dict = PyModule_GetDict(module);
+    if (dict == NULL)
+        return NULL;
+    identity_ref = PyDict_GetItemString(dict, "identity");
+    if (identity_ref == NULL)
+        return NULL;
+    Py_INCREF(identity_ref);
+
+    Py_INCREF(&Proxy_Type);
+    PyModule_AddObject(module, "Proxy",
+            (PyObject *)&Proxy_Type);
+    return module;
+}
+
+#if PY_MAJOR_VERSION < 3
+PyMODINIT_FUNC initcext(void)
+{
+    moduleinit();
+}
+#else
+PyMODINIT_FUNC PyInit_cext(void)
+{
+    return moduleinit();
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/__init__.py	(revision 1126)
@@ -0,0 +1,20 @@
+try:
+    import copy_reg as copyreg
+except ImportError:
+    import copyreg
+
+from .utils import identity
+
+copyreg.constructor(identity)
+
+try:
+    from .cext import Proxy
+    from .cext import identity
+except ImportError:
+    from .slots import Proxy
+else:
+    copyreg.constructor(identity)
+
+__version__ = "1.2.2"
+
+__all__ = "Proxy",
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/utils.py	(revision 1126)
@@ -0,0 +1,13 @@
+def identity(obj):
+    return obj
+
+
+class cached_property(object):
+    def __init__(self, func):
+        self.func = func
+
+    def __get__(self, obj, cls):
+        if obj is None:
+            return self
+        value = obj.__dict__[self.func.__name__] = self.func(obj)
+        return value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/compat.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/compat.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/compat.py	(revision 1126)
@@ -0,0 +1,9 @@
+import sys
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+
+def with_metaclass(meta, *bases):
+    """Create a base class with a metaclass."""
+    return meta("NewBase", bases, {})
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/slots.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/slots.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/lazy_object_proxy/slots.py	(revision 1126)
@@ -0,0 +1,414 @@
+import operator
+
+from .compat import PY2
+from .compat import PY3
+from .compat import with_metaclass
+from .utils import identity
+
+
+class _ProxyMethods(object):
+    # We use properties to override the values of __module__ and
+    # __doc__. If we add these in ObjectProxy, the derived class
+    # __dict__ will still be setup to have string variants of these
+    # attributes and the rules of descriptors means that they appear to
+    # take precedence over the properties in the base class. To avoid
+    # that, we copy the properties into the derived class type itself
+    # via a meta class. In that way the properties will always take
+    # precedence.
+
+    @property
+    def __module__(self):
+        return self.__wrapped__.__module__
+
+    @__module__.setter
+    def __module__(self, value):
+        self.__wrapped__.__module__ = value
+
+    @property
+    def __doc__(self):
+        return self.__wrapped__.__doc__
+
+    @__doc__.setter
+    def __doc__(self, value):
+        self.__wrapped__.__doc__ = value
+
+    # We similar use a property for __dict__. We need __dict__ to be
+    # explicit to ensure that vars() works as expected.
+
+    @property
+    def __dict__(self):
+        return self.__wrapped__.__dict__
+
+    # Need to also propagate the special __weakref__ attribute for case
+    # where decorating classes which will define this. If do not define
+    # it and use a function like inspect.getmembers() on a decorator
+    # class it will fail. This can't be in the derived classes.
+
+    @property
+    def __weakref__(self):
+        return self.__wrapped__.__weakref__
+
+
+class _ProxyMetaType(type):
+    def __new__(cls, name, bases, dictionary):
+        # Copy our special properties into the class so that they
+        # always take precedence over attributes of the same name added
+        # during construction of a derived class. This is to save
+        # duplicating the implementation for them in all derived classes.
+
+        dictionary.update(vars(_ProxyMethods))
+
+        return type.__new__(cls, name, bases, dictionary)
+
+
+class Proxy(with_metaclass(_ProxyMetaType)):
+    """
+    A proxy implementation in pure Python, using slots. You can subclass this to add
+    local methods or attributes, or enable __dict__.
+
+    The most important internals:
+
+    * ``__factory__`` is the callback that "materializes" the object we proxy to.
+    * ``__target__`` will contain the object we proxy to, once it's "materialized".
+    * ``__wrapped__`` is a property that does either:
+
+      * return ``__target__`` if it's set.
+      * calls ``__factory__``, saves result to ``__target__`` and returns said result.
+    """
+
+    __slots__ = '__target__', '__factory__'
+
+    def __init__(self, factory):
+        object.__setattr__(self, '__factory__', factory)
+
+    @property
+    def __wrapped__(self, __getattr__=object.__getattribute__, __setattr__=object.__setattr__,
+                    __delattr__=object.__delattr__):
+        try:
+            return __getattr__(self, '__target__')
+        except AttributeError:
+            try:
+                factory = __getattr__(self, '__factory__')
+            except AttributeError:
+                raise ValueError("Proxy hasn't been initiated: __factory__ is missing.")
+            target = factory()
+            __setattr__(self, '__target__', target)
+            return target
+
+    @__wrapped__.deleter
+    def __wrapped__(self, __delattr__=object.__delattr__):
+        __delattr__(self, '__target__')
+
+    @__wrapped__.setter
+    def __wrapped__(self, target, __setattr__=object.__setattr__):
+        __setattr__(self, '__target__', target)
+
+    @property
+    def __name__(self):
+        return self.__wrapped__.__name__
+
+    @__name__.setter
+    def __name__(self, value):
+        self.__wrapped__.__name__ = value
+
+    @property
+    def __class__(self):
+        return self.__wrapped__.__class__
+
+    @__class__.setter
+    def __class__(self, value):
+        self.__wrapped__.__class__ = value
+
+    @property
+    def __annotations__(self):
+        return self.__wrapped__.__anotations__
+
+    @__annotations__.setter
+    def __annotations__(self, value):
+        self.__wrapped__.__annotations__ = value
+
+    def __dir__(self):
+        return dir(self.__wrapped__)
+
+    def __str__(self):
+        return str(self.__wrapped__)
+
+    if PY3:
+        def __bytes__(self):
+            return bytes(self.__wrapped__)
+
+    def __repr__(self, __getattr__=object.__getattribute__):
+        try:
+            target = __getattr__(self, '__target__')
+        except AttributeError:
+            return '<%s at 0x%x with factory %r>' % (
+                type(self).__name__, id(self),
+                self.__factory__
+            )
+        else:
+            return '<%s at 0x%x wrapping %r at 0x%x with factory %r>' % (
+                type(self).__name__, id(self),
+                target, id(target),
+                self.__factory__
+            )
+
+    def __reversed__(self):
+        return reversed(self.__wrapped__)
+
+    if PY3:
+        def __round__(self):
+            return round(self.__wrapped__)
+
+    def __lt__(self, other):
+        return self.__wrapped__ < other
+
+    def __le__(self, other):
+        return self.__wrapped__ <= other
+
+    def __eq__(self, other):
+        return self.__wrapped__ == other
+
+    def __ne__(self, other):
+        return self.__wrapped__ != other
+
+    def __gt__(self, other):
+        return self.__wrapped__ > other
+
+    def __ge__(self, other):
+        return self.__wrapped__ >= other
+
+    def __hash__(self):
+        return hash(self.__wrapped__)
+
+    def __nonzero__(self):
+        return bool(self.__wrapped__)
+
+    def __bool__(self):
+        return bool(self.__wrapped__)
+
+    def __setattr__(self, name, value, __setattr__=object.__setattr__):
+        if hasattr(type(self), name):
+            __setattr__(self, name, value)
+        else:
+            setattr(self.__wrapped__, name, value)
+
+    def __getattr__(self, name):
+        if name in ('__wrapped__', '__factory__'):
+            raise AttributeError(name)
+        else:
+            return getattr(self.__wrapped__, name)
+
+    def __delattr__(self, name, __delattr__=object.__delattr__):
+        if hasattr(type(self), name):
+            __delattr__(self, name)
+        else:
+            delattr(self.__wrapped__, name)
+
+    def __add__(self, other):
+        return self.__wrapped__ + other
+
+    def __sub__(self, other):
+        return self.__wrapped__ - other
+
+    def __mul__(self, other):
+        return self.__wrapped__ * other
+
+    def __div__(self, other):
+        return operator.div(self.__wrapped__, other)
+
+    def __truediv__(self, other):
+        return operator.truediv(self.__wrapped__, other)
+
+    def __floordiv__(self, other):
+        return self.__wrapped__ // other
+
+    def __mod__(self, other):
+        return self.__wrapped__ ^ other
+
+    def __divmod__(self, other):
+        return divmod(self.__wrapped__, other)
+
+    def __pow__(self, other, *args):
+        return pow(self.__wrapped__, other, *args)
+
+    def __lshift__(self, other):
+        return self.__wrapped__ << other
+
+    def __rshift__(self, other):
+        return self.__wrapped__ >> other
+
+    def __and__(self, other):
+        return self.__wrapped__ & other
+
+    def __xor__(self, other):
+        return self.__wrapped__ ^ other
+
+    def __or__(self, other):
+        return self.__wrapped__ | other
+
+    def __radd__(self, other):
+        return other + self.__wrapped__
+
+    def __rsub__(self, other):
+        return other - self.__wrapped__
+
+    def __rmul__(self, other):
+        return other * self.__wrapped__
+
+    def __rdiv__(self, other):
+        return operator.div(other, self.__wrapped__)
+
+    def __rtruediv__(self, other):
+        return operator.truediv(other, self.__wrapped__)
+
+    def __rfloordiv__(self, other):
+        return other // self.__wrapped__
+
+    def __rmod__(self, other):
+        return other % self.__wrapped__
+
+    def __rdivmod__(self, other):
+        return divmod(other, self.__wrapped__)
+
+    def __rpow__(self, other, *args):
+        return pow(other, self.__wrapped__, *args)
+
+    def __rlshift__(self, other):
+        return other << self.__wrapped__
+
+    def __rrshift__(self, other):
+        return other >> self.__wrapped__
+
+    def __rand__(self, other):
+        return other & self.__wrapped__
+
+    def __rxor__(self, other):
+        return other ^ self.__wrapped__
+
+    def __ror__(self, other):
+        return other | self.__wrapped__
+
+    def __iadd__(self, other):
+        self.__wrapped__ += other
+        return self
+
+    def __isub__(self, other):
+        self.__wrapped__ -= other
+        return self
+
+    def __imul__(self, other):
+        self.__wrapped__ *= other
+        return self
+
+    def __idiv__(self, other):
+        self.__wrapped__ = operator.idiv(self.__wrapped__, other)
+        return self
+
+    def __itruediv__(self, other):
+        self.__wrapped__ = operator.itruediv(self.__wrapped__, other)
+        return self
+
+    def __ifloordiv__(self, other):
+        self.__wrapped__ //= other
+        return self
+
+    def __imod__(self, other):
+        self.__wrapped__ %= other
+        return self
+
+    def __ipow__(self, other):
+        self.__wrapped__ **= other
+        return self
+
+    def __ilshift__(self, other):
+        self.__wrapped__ <<= other
+        return self
+
+    def __irshift__(self, other):
+        self.__wrapped__ >>= other
+        return self
+
+    def __iand__(self, other):
+        self.__wrapped__ &= other
+        return self
+
+    def __ixor__(self, other):
+        self.__wrapped__ ^= other
+        return self
+
+    def __ior__(self, other):
+        self.__wrapped__ |= other
+        return self
+
+    def __neg__(self):
+        return -self.__wrapped__
+
+    def __pos__(self):
+        return +self.__wrapped__
+
+    def __abs__(self):
+        return abs(self.__wrapped__)
+
+    def __invert__(self):
+        return ~self.__wrapped__
+
+    def __int__(self):
+        return int(self.__wrapped__)
+
+    if PY2:
+        def __long__(self):
+            return long(self.__wrapped__)  # flake8: noqa
+
+    def __float__(self):
+        return float(self.__wrapped__)
+
+    def __oct__(self):
+        return oct(self.__wrapped__)
+
+    def __hex__(self):
+        return hex(self.__wrapped__)
+
+    def __index__(self):
+        return operator.index(self.__wrapped__)
+
+    def __len__(self):
+        return len(self.__wrapped__)
+
+    def __contains__(self, value):
+        return value in self.__wrapped__
+
+    def __getitem__(self, key):
+        return self.__wrapped__[key]
+
+    def __setitem__(self, key, value):
+        self.__wrapped__[key] = value
+
+    def __delitem__(self, key):
+        del self.__wrapped__[key]
+
+    def __getslice__(self, i, j):
+        return self.__wrapped__[i:j]
+
+    def __setslice__(self, i, j, value):
+        self.__wrapped__[i:j] = value
+
+    def __delslice__(self, i, j):
+        del self.__wrapped__[i:j]
+
+    def __enter__(self):
+        return self.__wrapped__.__enter__()
+
+    def __exit__(self, *args, **kwargs):
+        return self.__wrapped__.__exit__(*args, **kwargs)
+
+    def __iter__(self):
+        return iter(self.__wrapped__)
+
+    def __call__(self, *args, **kwargs):
+        return self.__wrapped__(*args, **kwargs)
+
+    def __reduce__(self):
+        return identity, (self.__wrapped__,)
+
+    def __reduce_ex__(self, protocol):
+        return identity, (self.__wrapped__,)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/token.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/token.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/token.py	(revision 1126)
@@ -0,0 +1,213 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.token
+    ~~~~~~~~~~~~~~
+
+    Basic token types and the standard tokens.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+class _TokenType(tuple):
+    parent = None
+
+    def split(self):
+        buf = []
+        node = self
+        while node is not None:
+            buf.append(node)
+            node = node.parent
+        buf.reverse()
+        return buf
+
+    def __init__(self, *args):
+        # no need to call super.__init__
+        self.subtypes = set()
+
+    def __contains__(self, val):
+        return self is val or (
+            type(val) is self.__class__ and
+            val[:len(self)] == self
+        )
+
+    def __getattr__(self, val):
+        if not val or not val[0].isupper():
+            return tuple.__getattribute__(self, val)
+        new = _TokenType(self + (val,))
+        setattr(self, val, new)
+        self.subtypes.add(new)
+        new.parent = self
+        return new
+
+    def __repr__(self):
+        return 'Token' + (self and '.' or '') + '.'.join(self)
+
+    def __copy__(self):
+        # These instances are supposed to be singletons
+        return self
+
+    def __deepcopy__(self, memo):
+        # These instances are supposed to be singletons
+        return self
+
+
+Token = _TokenType()
+
+# Special token types
+Text = Token.Text
+Whitespace = Text.Whitespace
+Escape = Token.Escape
+Error = Token.Error
+# Text that doesn't belong to this lexer (e.g. HTML in PHP)
+Other = Token.Other
+
+# Common token types for source code
+Keyword = Token.Keyword
+Name = Token.Name
+Literal = Token.Literal
+String = Literal.String
+Number = Literal.Number
+Punctuation = Token.Punctuation
+Operator = Token.Operator
+Comment = Token.Comment
+
+# Generic types for non-source code
+Generic = Token.Generic
+
+# String and some others are not direct children of Token.
+# alias them:
+Token.Token = Token
+Token.String = String
+Token.Number = Number
+
+
+def is_token_subtype(ttype, other):
+    """
+    Return True if ``ttype`` is a subtype of ``other``.
+
+    exists for backwards compatibility. use ``ttype in other`` now.
+    """
+    return ttype in other
+
+
+def string_to_tokentype(s):
+    """
+    Convert a string into a token type::
+
+        >>> string_to_token('String.Double')
+        Token.Literal.String.Double
+        >>> string_to_token('Token.Literal.Number')
+        Token.Literal.Number
+        >>> string_to_token('')
+        Token
+
+    Tokens that are already tokens are returned unchanged:
+
+        >>> string_to_token(String)
+        Token.Literal.String
+    """
+    if isinstance(s, _TokenType):
+        return s
+    if not s:
+        return Token
+    node = Token
+    for item in s.split('.'):
+        node = getattr(node, item)
+    return node
+
+
+# Map standard token types to short names, used in CSS class naming.
+# If you add a new item, please be sure to run this file to perform
+# a consistency check for duplicate values.
+STANDARD_TYPES = {
+    Token:                         '',
+
+    Text:                          '',
+    Whitespace:                    'w',
+    Escape:                        'esc',
+    Error:                         'err',
+    Other:                         'x',
+
+    Keyword:                       'k',
+    Keyword.Constant:              'kc',
+    Keyword.Declaration:           'kd',
+    Keyword.Namespace:             'kn',
+    Keyword.Pseudo:                'kp',
+    Keyword.Reserved:              'kr',
+    Keyword.Type:                  'kt',
+
+    Name:                          'n',
+    Name.Attribute:                'na',
+    Name.Builtin:                  'nb',
+    Name.Builtin.Pseudo:           'bp',
+    Name.Class:                    'nc',
+    Name.Constant:                 'no',
+    Name.Decorator:                'nd',
+    Name.Entity:                   'ni',
+    Name.Exception:                'ne',
+    Name.Function:                 'nf',
+    Name.Function.Magic:           'fm',
+    Name.Property:                 'py',
+    Name.Label:                    'nl',
+    Name.Namespace:                'nn',
+    Name.Other:                    'nx',
+    Name.Tag:                      'nt',
+    Name.Variable:                 'nv',
+    Name.Variable.Class:           'vc',
+    Name.Variable.Global:          'vg',
+    Name.Variable.Instance:        'vi',
+    Name.Variable.Magic:           'vm',
+
+    Literal:                       'l',
+    Literal.Date:                  'ld',
+
+    String:                        's',
+    String.Affix:                  'sa',
+    String.Backtick:               'sb',
+    String.Char:                   'sc',
+    String.Delimiter:              'dl',
+    String.Doc:                    'sd',
+    String.Double:                 's2',
+    String.Escape:                 'se',
+    String.Heredoc:                'sh',
+    String.Interpol:               'si',
+    String.Other:                  'sx',
+    String.Regex:                  'sr',
+    String.Single:                 's1',
+    String.Symbol:                 'ss',
+
+    Number:                        'm',
+    Number.Bin:                    'mb',
+    Number.Float:                  'mf',
+    Number.Hex:                    'mh',
+    Number.Integer:                'mi',
+    Number.Integer.Long:           'il',
+    Number.Oct:                    'mo',
+
+    Operator:                      'o',
+    Operator.Word:                 'ow',
+
+    Punctuation:                   'p',
+
+    Comment:                       'c',
+    Comment.Hashbang:              'ch',
+    Comment.Multiline:             'cm',
+    Comment.Preproc:               'cp',
+    Comment.PreprocFile:           'cpf',
+    Comment.Single:                'c1',
+    Comment.Special:               'cs',
+
+    Generic:                       'g',
+    Generic.Deleted:               'gd',
+    Generic.Emph:                  'ge',
+    Generic.Error:                 'gr',
+    Generic.Heading:               'gh',
+    Generic.Inserted:              'gi',
+    Generic.Output:                'go',
+    Generic.Prompt:                'gp',
+    Generic.Strong:                'gs',
+    Generic.Subheading:            'gu',
+    Generic.Traceback:             'gt',
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/filters/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/filters/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/filters/__init__.py	(revision 1126)
@@ -0,0 +1,350 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.filters
+    ~~~~~~~~~~~~~~~~
+
+    Module containing filter lookup functions and default
+    filters.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.token import String, Comment, Keyword, Name, Error, Whitespace, \
+    string_to_tokentype
+from pygments.filter import Filter
+from pygments.util import get_list_opt, get_int_opt, get_bool_opt, \
+     get_choice_opt, ClassNotFound, OptionError, text_type, string_types
+from pygments.plugin import find_plugin_filters
+
+
+def find_filter_class(filtername):
+    """Lookup a filter by name. Return None if not found."""
+    if filtername in FILTERS:
+        return FILTERS[filtername]
+    for name, cls in find_plugin_filters():
+        if name == filtername:
+            return cls
+    return None
+
+
+def get_filter_by_name(filtername, **options):
+    """Return an instantiated filter.
+
+    Options are passed to the filter initializer if wanted.
+    Raise a ClassNotFound if not found.
+    """
+    cls = find_filter_class(filtername)
+    if cls:
+        return cls(**options)
+    else:
+        raise ClassNotFound('filter %r not found' % filtername)
+
+
+def get_all_filters():
+    """Return a generator of all filter names."""
+    for name in FILTERS:
+        yield name
+    for name, _ in find_plugin_filters():
+        yield name
+
+
+def _replace_special(ttype, value, regex, specialttype,
+                     replacefunc=lambda x: x):
+    last = 0
+    for match in regex.finditer(value):
+        start, end = match.start(), match.end()
+        if start != last:
+            yield ttype, value[last:start]
+        yield specialttype, replacefunc(value[start:end])
+        last = end
+    if last != len(value):
+        yield ttype, value[last:]
+
+
+class CodeTagFilter(Filter):
+    """Highlight special code tags in comments and docstrings.
+
+    Options accepted:
+
+    `codetags` : list of strings
+       A list of strings that are flagged as code tags.  The default is to
+       highlight ``XXX``, ``TODO``, ``BUG`` and ``NOTE``.
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        tags = get_list_opt(options, 'codetags',
+                            ['XXX', 'TODO', 'BUG', 'NOTE'])
+        self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([
+            re.escape(tag) for tag in tags if tag
+        ]))
+
+    def filter(self, lexer, stream):
+        regex = self.tag_re
+        for ttype, value in stream:
+            if ttype in String.Doc or \
+               ttype in Comment and \
+               ttype not in Comment.Preproc:
+                for sttype, svalue in _replace_special(ttype, value, regex,
+                                                       Comment.Special):
+                    yield sttype, svalue
+            else:
+                yield ttype, value
+
+
+class KeywordCaseFilter(Filter):
+    """Convert keywords to lowercase or uppercase or capitalize them, which
+    means first letter uppercase, rest lowercase.
+
+    This can be useful e.g. if you highlight Pascal code and want to adapt the
+    code to your styleguide.
+
+    Options accepted:
+
+    `case` : string
+       The casing to convert keywords to. Must be one of ``'lower'``,
+       ``'upper'`` or ``'capitalize'``.  The default is ``'lower'``.
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        case = get_choice_opt(options, 'case',
+                              ['lower', 'upper', 'capitalize'], 'lower')
+        self.convert = getattr(text_type, case)
+
+    def filter(self, lexer, stream):
+        for ttype, value in stream:
+            if ttype in Keyword:
+                yield ttype, self.convert(value)
+            else:
+                yield ttype, value
+
+
+class NameHighlightFilter(Filter):
+    """Highlight a normal Name (and Name.*) token with a different token type.
+
+    Example::
+
+        filter = NameHighlightFilter(
+            names=['foo', 'bar', 'baz'],
+            tokentype=Name.Function,
+        )
+
+    This would highlight the names "foo", "bar" and "baz"
+    as functions. `Name.Function` is the default token type.
+
+    Options accepted:
+
+    `names` : list of strings
+      A list of names that should be given the different token type.
+      There is no default.
+    `tokentype` : TokenType or string
+      A token type or a string containing a token type name that is
+      used for highlighting the strings in `names`.  The default is
+      `Name.Function`.
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        self.names = set(get_list_opt(options, 'names', []))
+        tokentype = options.get('tokentype')
+        if tokentype:
+            self.tokentype = string_to_tokentype(tokentype)
+        else:
+            self.tokentype = Name.Function
+
+    def filter(self, lexer, stream):
+        for ttype, value in stream:
+            if ttype in Name and value in self.names:
+                yield self.tokentype, value
+            else:
+                yield ttype, value
+
+
+class ErrorToken(Exception):
+    pass
+
+
+class RaiseOnErrorTokenFilter(Filter):
+    """Raise an exception when the lexer generates an error token.
+
+    Options accepted:
+
+    `excclass` : Exception class
+      The exception class to raise.
+      The default is `pygments.filters.ErrorToken`.
+
+    .. versionadded:: 0.8
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        self.exception = options.get('excclass', ErrorToken)
+        try:
+            # issubclass() will raise TypeError if first argument is not a class
+            if not issubclass(self.exception, Exception):
+                raise TypeError
+        except TypeError:
+            raise OptionError('excclass option is not an exception class')
+
+    def filter(self, lexer, stream):
+        for ttype, value in stream:
+            if ttype is Error:
+                raise self.exception(value)
+            yield ttype, value
+
+
+class VisibleWhitespaceFilter(Filter):
+    """Convert tabs, newlines and/or spaces to visible characters.
+
+    Options accepted:
+
+    `spaces` : string or bool
+      If this is a one-character string, spaces will be replaces by this string.
+      If it is another true value, spaces will be replaced by ``·`` (unicode
+      MIDDLE DOT).  If it is a false value, spaces will not be replaced.  The
+      default is ``False``.
+    `tabs` : string or bool
+      The same as for `spaces`, but the default replacement character is ``»``
+      (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK).  The default value
+      is ``False``.  Note: this will not work if the `tabsize` option for the
+      lexer is nonzero, as tabs will already have been expanded then.
+    `tabsize` : int
+      If tabs are to be replaced by this filter (see the `tabs` option), this
+      is the total number of characters that a tab should be expanded to.
+      The default is ``8``.
+    `newlines` : string or bool
+      The same as for `spaces`, but the default replacement character is ``¶``
+      (unicode PILCROW SIGN).  The default value is ``False``.
+    `wstokentype` : bool
+      If true, give whitespace the special `Whitespace` token type.  This allows
+      styling the visible whitespace differently (e.g. greyed out), but it can
+      disrupt background colors.  The default is ``True``.
+
+    .. versionadded:: 0.8
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        for name, default in [('spaces',   u'·'),
+                              ('tabs',     u'»'),
+                              ('newlines', u'¶')]:
+            opt = options.get(name, False)
+            if isinstance(opt, string_types) and len(opt) == 1:
+                setattr(self, name, opt)
+            else:
+                setattr(self, name, (opt and default or ''))
+        tabsize = get_int_opt(options, 'tabsize', 8)
+        if self.tabs:
+            self.tabs += ' ' * (tabsize - 1)
+        if self.newlines:
+            self.newlines += '\n'
+        self.wstt = get_bool_opt(options, 'wstokentype', True)
+
+    def filter(self, lexer, stream):
+        if self.wstt:
+            spaces = self.spaces or u' '
+            tabs = self.tabs or u'\t'
+            newlines = self.newlines or u'\n'
+            regex = re.compile(r'\s')
+            def replacefunc(wschar):
+                if wschar == ' ':
+                    return spaces
+                elif wschar == '\t':
+                    return tabs
+                elif wschar == '\n':
+                    return newlines
+                return wschar
+
+            for ttype, value in stream:
+                for sttype, svalue in _replace_special(ttype, value, regex,
+                                                       Whitespace, replacefunc):
+                    yield sttype, svalue
+        else:
+            spaces, tabs, newlines = self.spaces, self.tabs, self.newlines
+            # simpler processing
+            for ttype, value in stream:
+                if spaces:
+                    value = value.replace(' ', spaces)
+                if tabs:
+                    value = value.replace('\t', tabs)
+                if newlines:
+                    value = value.replace('\n', newlines)
+                yield ttype, value
+
+
+class GobbleFilter(Filter):
+    """Gobbles source code lines (eats initial characters).
+
+    This filter drops the first ``n`` characters off every line of code.  This
+    may be useful when the source code fed to the lexer is indented by a fixed
+    amount of space that isn't desired in the output.
+
+    Options accepted:
+
+    `n` : int
+       The number of characters to gobble.
+
+    .. versionadded:: 1.2
+    """
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        self.n = get_int_opt(options, 'n', 0)
+
+    def gobble(self, value, left):
+        if left < len(value):
+            return value[left:], 0
+        else:
+            return u'', left - len(value)
+
+    def filter(self, lexer, stream):
+        n = self.n
+        left = n # How many characters left to gobble.
+        for ttype, value in stream:
+            # Remove ``left`` tokens from first line, ``n`` from all others.
+            parts = value.split('\n')
+            (parts[0], left) = self.gobble(parts[0], left)
+            for i in range(1, len(parts)):
+                (parts[i], left) = self.gobble(parts[i], n)
+            value = u'\n'.join(parts)
+
+            if value != '':
+                yield ttype, value
+
+
+class TokenMergeFilter(Filter):
+    """Merges consecutive tokens with the same token type in the output
+    stream of a lexer.
+
+    .. versionadded:: 1.2
+    """
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+
+    def filter(self, lexer, stream):
+        current_type = None
+        current_value = None
+        for ttype, value in stream:
+            if ttype is current_type:
+                current_value += value
+            else:
+                if current_type is not None:
+                    yield current_type, current_value
+                current_type = ttype
+                current_value = value
+        if current_type is not None:
+            yield current_type, current_value
+
+
+FILTERS = {
+    'codetagify':     CodeTagFilter,
+    'keywordcase':    KeywordCaseFilter,
+    'highlight':      NameHighlightFilter,
+    'raiseonerror':   RaiseOnErrorTokenFilter,
+    'whitespace':     VisibleWhitespaceFilter,
+    'gobble':         GobbleFilter,
+    'tokenmerge':     TokenMergeFilter,
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/unistring.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/unistring.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/unistring.py	(revision 1126)
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.unistring
+    ~~~~~~~~~~~~~~~~~~
+
+    Strings of all Unicode characters of a certain category.
+    Used for matching in Unicode-aware languages. Run to regenerate.
+
+    Inspired by chartypes_create.py from the MoinMoin project.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import sys
+
+Cc = u'\x00-\x1f\x7f-\x9f'
+
+Cf = u'\xad\u0600-\u0604\u061c\u06dd\u070f\u180e\u200b-\u200f\u202a-\u202e\u2060-\u2064\u2066-\u206f\ufeff\ufff9-\ufffb'
+
+Cn = u'\u0378-\u0379\u037f-\u0383\u038b\u038d\u03a2\u0528-\u0530\u0557-\u0558\u0560\u0588\u058b-\u058e\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u05ff\u0605\u061d\u070e\u074b-\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e-\u082f\u083f\u085c-\u085d\u085f-\u089f\u08a1\u08ad-\u08e3\u08ff\u0978\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5a-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c80-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0d01\u0d04\u0d0d\u0d11\u0d3b-\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5f\u0d64-\u0d65\u0d76-\u0d78\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f5-\u13ff\u169d-\u169f\u16f1-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191d-\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7-\u1cff\u1de7-\u1dfb\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff\u2065\u2072-\u2073\u208f\u209d-\u209f\u20bb-\u20cf\u20f1-\u20ff\u218a-\u218f\u23f4-\u23ff\u2427-\u243f\u244b-\u245f\u2700\u2b4d-\u2b4f\u2b5a-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e3c-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097-\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fcd-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua698-\ua69e\ua6f8-\ua6ff\ua78f\ua794-\ua79f\ua7ab-\ua7f7\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fc-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9e0-\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaa7c-\uaa7f\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f-\uabbf\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\ud7ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe27-\ufe2f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\ufefe\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufff8\ufffe-\uffff'
+
+Co = u'\ue000-\uf8ff'
+
+try:
+    Cs = eval(r"u'\ud800-\udbff\\\udc00\udc01-\udfff'")
+except UnicodeDecodeError:
+    Cs = ''  # Jython can't handle isolated surrogates
+
+Ll = u'a-z\xb5\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137-\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148-\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c-\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa-\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9-\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc-\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef-\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f-\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02af\u0371\u0373\u0377\u037b-\u037d\u0390\u03ac-\u03ce\u03d0-\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb-\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce-\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0561-\u0587\u1d00-\u1d2b\u1d6b-\u1d77\u1d79-\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6-\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fc7\u1fd0-\u1fd3\u1fd6-\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6-\u1ff7\u210a\u210e-\u210f\u2113\u212f\u2134\u2139\u213c-\u213d\u2146-\u2149\u214e\u2184\u2c30-\u2c5e\u2c61\u2c65-\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73-\u2c74\u2c76-\u2c7b\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3-\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f\ua771-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7fa\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a'
+
+Lm = u'\u02b0-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0374\u037a\u0559\u0640\u06e5-\u06e6\u07f4-\u07f5\u07fa\u081a\u0824\u0828\u0971\u0e46\u0ec6\u10fc\u17d7\u1843\u1aa7\u1c78-\u1c7d\u1d2c-\u1d6a\u1d78\u1d9b-\u1dbf\u2071\u207f\u2090-\u209c\u2c7c-\u2c7d\u2d6f\u2e2f\u3005\u3031-\u3035\u303b\u309d-\u309e\u30fc-\u30fe\ua015\ua4f8-\ua4fd\ua60c\ua67f\ua717-\ua71f\ua770\ua788\ua7f8-\ua7f9\ua9cf\uaa70\uaadd\uaaf3-\uaaf4\uff70\uff9e-\uff9f'
+
+Lo = u'\xaa\xba\u01bb\u01c0-\u01c3\u0294\u05d0-\u05ea\u05f0-\u05f2\u0620-\u063f\u0641-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u0800-\u0815\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0972-\u0977\u0979-\u097f\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58-\u0c59\u0c60-\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e45\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u10d0-\u10fa\u10fd-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17dc\u1820-\u1842\u1844-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u2135-\u2138\u2d30-\u2d67\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3006\u303c\u3041-\u3096\u309f\u30a1-\u30fa\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua014\ua016-\ua48c\ua4d0-\ua4f7\ua500-\ua60b\ua610-\ua61f\ua62a-\ua62b\ua66e\ua6a0-\ua6e5\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa6f\uaa71-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadc\uaae0-\uaaea\uaaf2\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff66-\uff6f\uff71-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc'
+
+Lt = u'\u01c5\u01c8\u01cb\u01f2\u1f88-\u1f8f\u1f98-\u1f9f\u1fa8-\u1faf\u1fbc\u1fcc\u1ffc'
+
+Lu = u'A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178-\u0179\u017b\u017d\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018b\u018e-\u0191\u0193-\u0194\u0196-\u0198\u019c-\u019d\u019f-\u01a0\u01a2\u01a4\u01a6-\u01a7\u01a9\u01ac\u01ae-\u01af\u01b1-\u01b3\u01b5\u01b7-\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a-\u023b\u023d-\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u0386\u0388-\u038a\u038c\u038e-\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9-\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0-\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e-\u213f\u2145\u2183\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d-\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa\uff21-\uff3a'
+
+Mc = u'\u0903\u093b\u093e-\u0940\u0949-\u094c\u094e-\u094f\u0982-\u0983\u09be-\u09c0\u09c7-\u09c8\u09cb-\u09cc\u09d7\u0a03\u0a3e-\u0a40\u0a83\u0abe-\u0ac0\u0ac9\u0acb-\u0acc\u0b02-\u0b03\u0b3e\u0b40\u0b47-\u0b48\u0b4b-\u0b4c\u0b57\u0bbe-\u0bbf\u0bc1-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd7\u0c01-\u0c03\u0c41-\u0c44\u0c82-\u0c83\u0cbe\u0cc0-\u0cc4\u0cc7-\u0cc8\u0cca-\u0ccb\u0cd5-\u0cd6\u0d02-\u0d03\u0d3e-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d57\u0d82-\u0d83\u0dcf-\u0dd1\u0dd8-\u0ddf\u0df2-\u0df3\u0f3e-\u0f3f\u0f7f\u102b-\u102c\u1031\u1038\u103b-\u103c\u1056-\u1057\u1062-\u1064\u1067-\u106d\u1083-\u1084\u1087-\u108c\u108f\u109a-\u109c\u17b6\u17be-\u17c5\u17c7-\u17c8\u1923-\u1926\u1929-\u192b\u1930-\u1931\u1933-\u1938\u19b0-\u19c0\u19c8-\u19c9\u1a19-\u1a1a\u1a55\u1a57\u1a61\u1a63-\u1a64\u1a6d-\u1a72\u1b04\u1b35\u1b3b\u1b3d-\u1b41\u1b43-\u1b44\u1b82\u1ba1\u1ba6-\u1ba7\u1baa\u1bac-\u1bad\u1be7\u1bea-\u1bec\u1bee\u1bf2-\u1bf3\u1c24-\u1c2b\u1c34-\u1c35\u1ce1\u1cf2-\u1cf3\u302e-\u302f\ua823-\ua824\ua827\ua880-\ua881\ua8b4-\ua8c3\ua952-\ua953\ua983\ua9b4-\ua9b5\ua9ba-\ua9bb\ua9bd-\ua9c0\uaa2f-\uaa30\uaa33-\uaa34\uaa4d\uaa7b\uaaeb\uaaee-\uaaef\uaaf5\uabe3-\uabe4\uabe6-\uabe7\uabe9-\uabea\uabec'
+
+Me = u'\u0488-\u0489\u20dd-\u20e0\u20e2-\u20e4\ua670-\ua672'
+
+Mn = u'\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09c1-\u09c4\u09cd\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b62-\u0b63\u0b82\u0bc0\u0bcd\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0cbc\u0cbf\u0cc6\u0ccc-\u0ccd\u0ce2-\u0ce3\u0d41-\u0d44\u0d4d\u0d62-\u0d63\u0dca\u0dd2-\u0dd4\u0dd6\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u3099-\u309a\ua66f\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe26'
+
+Nd = u'0-9\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19'
+
+Nl = u'\u16ee-\u16f0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303a\ua6e6-\ua6ef'
+
+No = u'\xb2-\xb3\xb9\xbc-\xbe\u09f4-\u09f9\u0b72-\u0b77\u0bf0-\u0bf2\u0c78-\u0c7e\u0d70-\u0d75\u0f2a-\u0f33\u1369-\u137c\u17f0-\u17f9\u19da\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215f\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua830-\ua835'
+
+Pc = u'_\u203f-\u2040\u2054\ufe33-\ufe34\ufe4d-\ufe4f\uff3f'
+
+Pd = u'\\-\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a-\u2e3b\u301c\u3030\u30a0\ufe31-\ufe32\ufe58\ufe63\uff0d'
+
+Pe = u')\\]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u2309\u230b\u232a\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e-\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63'
+
+Pf = u'\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21'
+
+Pi = u'\xab\u2018\u201b-\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20'
+
+Po = u"!-#%-'*,.-/:-;?-@\\\\\xa1\xa7\xb6-\xb7\xbf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3-\u05f4\u0609-\u060a\u060c-\u060d\u061b\u061e-\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964-\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a-\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9-\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d-\u166e\u16eb-\u16ed\u1735-\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944-\u1945\u1a1e-\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e-\u1c7f\u1cc0-\u1cc7\u1cd3\u2016-\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe-\u2cff\u2d70\u2e00-\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18-\u2e19\u2e1b\u2e1e-\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe-\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce-\ua8cf\ua8f8-\ua8fa\ua92e-\ua92f\ua95f\ua9c1-\ua9cd\ua9de-\ua9df\uaa5c-\uaa5f\uaade-\uaadf\uaaf0-\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45-\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a-\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e-\uff0f\uff1a-\uff1b\uff1f-\uff20\uff3c\uff61\uff64-\uff65"
+
+Ps = u'(\\[{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2308\u230a\u2329\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62'
+
+Sc = u'$\xa2-\xa5\u058f\u060b\u09f2-\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20ba\ua838\ufdfc\ufe69\uff04\uffe0-\uffe1\uffe5-\uffe6'
+
+Sk = u'\\^`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384-\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd-\u1ffe\u309b-\u309c\ua700-\ua716\ua720-\ua721\ua789-\ua78a\ufbb2-\ufbc1\uff3e\uff40\uffe3'
+
+Sm = u'+<->|~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a-\u219b\u21a0\u21a3\u21a6\u21ae\u21ce-\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320-\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec'
+
+So = u'\xa6\xa9\xae\xb0\u0482\u060e-\u060f\u06de\u06e9\u06fd-\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce-\u0fcf\u0fd5-\u0fd8\u109e-\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100-\u2101\u2103-\u2106\u2108-\u2109\u2114\u2116-\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a-\u213b\u214a\u214c-\u214d\u214f\u2195-\u2199\u219c-\u219f\u21a1-\u21a2\u21a4-\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0-\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23f3\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u26ff\u2701-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45-\u2b46\u2b50-\u2b59\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012-\u3013\u3020\u3036-\u3037\u303e-\u303f\u3190-\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836-\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed-\uffee\ufffc-\ufffd'
+
+Zl = u'\u2028'
+
+Zp = u'\u2029'
+
+Zs = u' \xa0\u1680\u2000-\u200a\u202f\u205f\u3000'
+
+xid_continue = u'0-9A-Z_a-z\xaa\xb5\xb7\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376-\u0377\u037b-\u037d\u0386-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7-\u09c8\u09cb-\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c58-\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1-\u0cf2\u0d02-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2-\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1369-\u1371\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772-\u1773\u1780-\u17d3\u17d7\u17dc-\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u203f-\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099-\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec-\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe00-\ufe0f\ufe20-\ufe26\ufe33-\ufe34\ufe4d-\ufe4f\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc'
+
+xid_start = u'A-Z_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376-\u0377\u037b-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06e5-\u06e6\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4-\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58-\u0c59\u0c60-\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e40-\u0e46\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a-\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc'
+
+if sys.maxunicode > 0xFFFF:
+    # non-BMP characters, use only on wide Unicode builds
+    Cf += u'\U000110bd\U0001d173-\U0001d17a\U000e0001\U000e0020-\U000e007f'
+
+    Cn += u'\U0001000c\U00010027\U0001003b\U0001003e\U0001004e-\U0001004f\U0001005e-\U0001007f\U000100fb-\U000100ff\U00010103-\U00010106\U00010134-\U00010136\U0001018b-\U0001018f\U0001019c-\U000101cf\U000101fe-\U0001027f\U0001029d-\U0001029f\U000102d1-\U000102ff\U0001031f\U00010324-\U0001032f\U0001034b-\U0001037f\U0001039e\U000103c4-\U000103c7\U000103d6-\U000103ff\U0001049e-\U0001049f\U000104aa-\U000107ff\U00010806-\U00010807\U00010809\U00010836\U00010839-\U0001083b\U0001083d-\U0001083e\U00010856\U00010860-\U000108ff\U0001091c-\U0001091e\U0001093a-\U0001093e\U00010940-\U0001097f\U000109b8-\U000109bd\U000109c0-\U000109ff\U00010a04\U00010a07-\U00010a0b\U00010a14\U00010a18\U00010a34-\U00010a37\U00010a3b-\U00010a3e\U00010a48-\U00010a4f\U00010a59-\U00010a5f\U00010a80-\U00010aff\U00010b36-\U00010b38\U00010b56-\U00010b57\U00010b73-\U00010b77\U00010b80-\U00010bff\U00010c49-\U00010e5f\U00010e7f-\U00010fff\U0001104e-\U00011051\U00011070-\U0001107f\U000110c2-\U000110cf\U000110e9-\U000110ef\U000110fa-\U000110ff\U00011135\U00011144-\U0001117f\U000111c9-\U000111cf\U000111da-\U0001167f\U000116b8-\U000116bf\U000116ca-\U00011fff\U0001236f-\U000123ff\U00012463-\U0001246f\U00012474-\U00012fff\U0001342f-\U000167ff\U00016a39-\U00016eff\U00016f45-\U00016f4f\U00016f7f-\U00016f8e\U00016fa0-\U0001afff\U0001b002-\U0001cfff\U0001d0f6-\U0001d0ff\U0001d127-\U0001d128\U0001d1de-\U0001d1ff\U0001d246-\U0001d2ff\U0001d357-\U0001d35f\U0001d372-\U0001d3ff\U0001d455\U0001d49d\U0001d4a0-\U0001d4a1\U0001d4a3-\U0001d4a4\U0001d4a7-\U0001d4a8\U0001d4ad\U0001d4ba\U0001d4bc\U0001d4c4\U0001d506\U0001d50b-\U0001d50c\U0001d515\U0001d51d\U0001d53a\U0001d53f\U0001d545\U0001d547-\U0001d549\U0001d551\U0001d6a6-\U0001d6a7\U0001d7cc-\U0001d7cd\U0001d800-\U0001edff\U0001ee04\U0001ee20\U0001ee23\U0001ee25-\U0001ee26\U0001ee28\U0001ee33\U0001ee38\U0001ee3a\U0001ee3c-\U0001ee41\U0001ee43-\U0001ee46\U0001ee48\U0001ee4a\U0001ee4c\U0001ee50\U0001ee53\U0001ee55-\U0001ee56\U0001ee58\U0001ee5a\U0001ee5c\U0001ee5e\U0001ee60\U0001ee63\U0001ee65-\U0001ee66\U0001ee6b\U0001ee73\U0001ee78\U0001ee7d\U0001ee7f\U0001ee8a\U0001ee9c-\U0001eea0\U0001eea4\U0001eeaa\U0001eebc-\U0001eeef\U0001eef2-\U0001efff\U0001f02c-\U0001f02f\U0001f094-\U0001f09f\U0001f0af-\U0001f0b0\U0001f0bf-\U0001f0c0\U0001f0d0\U0001f0e0-\U0001f0ff\U0001f10b-\U0001f10f\U0001f12f\U0001f16c-\U0001f16f\U0001f19b-\U0001f1e5\U0001f203-\U0001f20f\U0001f23b-\U0001f23f\U0001f249-\U0001f24f\U0001f252-\U0001f2ff\U0001f321-\U0001f32f\U0001f336\U0001f37d-\U0001f37f\U0001f394-\U0001f39f\U0001f3c5\U0001f3cb-\U0001f3df\U0001f3f1-\U0001f3ff\U0001f43f\U0001f441\U0001f4f8\U0001f4fd-\U0001f4ff\U0001f53e-\U0001f53f\U0001f544-\U0001f54f\U0001f568-\U0001f5fa\U0001f641-\U0001f644\U0001f650-\U0001f67f\U0001f6c6-\U0001f6ff\U0001f774-\U0001ffff\U0002a6d7-\U0002a6ff\U0002b735-\U0002b73f\U0002b81e-\U0002f7ff\U0002fa1e-\U000e0000\U000e0002-\U000e001f\U000e0080-\U000e00ff\U000e01f0-\U000effff\U000ffffe-\U000fffff\U0010fffe-\U0010ffff'
+
+    Co += u'\U000f0000-\U000ffffd\U00100000-\U0010fffd'
+
+    Ll += u'\U00010428-\U0001044f\U0001d41a-\U0001d433\U0001d44e-\U0001d454\U0001d456-\U0001d467\U0001d482-\U0001d49b\U0001d4b6-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d4cf\U0001d4ea-\U0001d503\U0001d51e-\U0001d537\U0001d552-\U0001d56b\U0001d586-\U0001d59f\U0001d5ba-\U0001d5d3\U0001d5ee-\U0001d607\U0001d622-\U0001d63b\U0001d656-\U0001d66f\U0001d68a-\U0001d6a5\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6e1\U0001d6fc-\U0001d714\U0001d716-\U0001d71b\U0001d736-\U0001d74e\U0001d750-\U0001d755\U0001d770-\U0001d788\U0001d78a-\U0001d78f\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7c9\U0001d7cb'
+
+    Lm += u'\U00016f93-\U00016f9f'
+
+    Lo += u'\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031e\U00010330-\U00010340\U00010342-\U00010349\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U00010450-\U0001049d\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a33\U00010a60-\U00010a7c\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010c00-\U00010c48\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011183-\U000111b2\U000111c1-\U000111c4\U00011680-\U000116aa\U00012000-\U0001236e\U00013000-\U0001342e\U00016800-\U00016a38\U00016f00-\U00016f44\U00016f50\U0001b000-\U0001b001\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002f800-\U0002fa1d'
+
+    Lu += u'\U00010400-\U00010427\U0001d400-\U0001d419\U0001d434-\U0001d44d\U0001d468-\U0001d481\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b5\U0001d4d0-\U0001d4e9\U0001d504-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d538-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d56c-\U0001d585\U0001d5a0-\U0001d5b9\U0001d5d4-\U0001d5ed\U0001d608-\U0001d621\U0001d63c-\U0001d655\U0001d670-\U0001d689\U0001d6a8-\U0001d6c0\U0001d6e2-\U0001d6fa\U0001d71c-\U0001d734\U0001d756-\U0001d76e\U0001d790-\U0001d7a8\U0001d7ca'
+
+    Mc += u'\U00011000\U00011002\U00011082\U000110b0-\U000110b2\U000110b7-\U000110b8\U0001112c\U00011182\U000111b3-\U000111b5\U000111bf-\U000111c0\U000116ac\U000116ae-\U000116af\U000116b6\U00016f51-\U00016f7e\U0001d165-\U0001d166\U0001d16d-\U0001d172'
+
+    Mn += u'\U000101fd\U00010a01-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a0f\U00010a38-\U00010a3a\U00010a3f\U00011001\U00011038-\U00011046\U00011080-\U00011081\U000110b3-\U000110b6\U000110b9-\U000110ba\U00011100-\U00011102\U00011127-\U0001112b\U0001112d-\U00011134\U00011180-\U00011181\U000111b6-\U000111be\U000116ab\U000116ad\U000116b0-\U000116b5\U000116b7\U00016f8f-\U00016f92\U0001d167-\U0001d169\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U000e0100-\U000e01ef'
+
+    Nd += u'\U000104a0-\U000104a9\U00011066-\U0001106f\U000110f0-\U000110f9\U00011136-\U0001113f\U000111d0-\U000111d9\U000116c0-\U000116c9\U0001d7ce-\U0001d7ff'
+
+    Nl += u'\U00010140-\U00010174\U00010341\U0001034a\U000103d1-\U000103d5\U00012400-\U00012462'
+
+    No += u'\U00010107-\U00010133\U00010175-\U00010178\U0001018a\U00010320-\U00010323\U00010858-\U0001085f\U00010916-\U0001091b\U00010a40-\U00010a47\U00010a7d-\U00010a7e\U00010b58-\U00010b5f\U00010b78-\U00010b7f\U00010e60-\U00010e7e\U00011052-\U00011065\U0001d360-\U0001d371\U0001f100-\U0001f10a'
+
+    Po += u'\U00010100-\U00010102\U0001039f\U000103d0\U00010857\U0001091f\U0001093f\U00010a50-\U00010a58\U00010a7f\U00010b39-\U00010b3f\U00011047-\U0001104d\U000110bb-\U000110bc\U000110be-\U000110c1\U00011140-\U00011143\U000111c5-\U000111c8\U00012470-\U00012473'
+
+    Sm += u'\U0001d6c1\U0001d6db\U0001d6fb\U0001d715\U0001d735\U0001d74f\U0001d76f\U0001d789\U0001d7a9\U0001d7c3\U0001eef0-\U0001eef1'
+
+    So += u'\U00010137-\U0001013f\U00010179-\U00010189\U00010190-\U0001019b\U000101d0-\U000101fc\U0001d000-\U0001d0f5\U0001d100-\U0001d126\U0001d129-\U0001d164\U0001d16a-\U0001d16c\U0001d183-\U0001d184\U0001d18c-\U0001d1a9\U0001d1ae-\U0001d1dd\U0001d200-\U0001d241\U0001d245\U0001d300-\U0001d356\U0001f000-\U0001f02b\U0001f030-\U0001f093\U0001f0a0-\U0001f0ae\U0001f0b1-\U0001f0be\U0001f0c1-\U0001f0cf\U0001f0d1-\U0001f0df\U0001f110-\U0001f12e\U0001f130-\U0001f16b\U0001f170-\U0001f19a\U0001f1e6-\U0001f202\U0001f210-\U0001f23a\U0001f240-\U0001f248\U0001f250-\U0001f251\U0001f300-\U0001f320\U0001f330-\U0001f335\U0001f337-\U0001f37c\U0001f380-\U0001f393\U0001f3a0-\U0001f3c4\U0001f3c6-\U0001f3ca\U0001f3e0-\U0001f3f0\U0001f400-\U0001f43e\U0001f440\U0001f442-\U0001f4f7\U0001f4f9-\U0001f4fc\U0001f500-\U0001f53d\U0001f540-\U0001f543\U0001f550-\U0001f567\U0001f5fb-\U0001f640\U0001f645-\U0001f64f\U0001f680-\U0001f6c5\U0001f700-\U0001f773'
+
+    xid_continue += u'\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U000101fd\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031e\U00010330-\U0001034a\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U000104a0-\U000104a9\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a33\U00010a38-\U00010a3a\U00010a3f\U00010a60-\U00010a7c\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010c00-\U00010c48\U00011000-\U00011046\U00011066-\U0001106f\U00011080-\U000110ba\U000110d0-\U000110e8\U000110f0-\U000110f9\U00011100-\U00011134\U00011136-\U0001113f\U00011180-\U000111c4\U000111d0-\U000111d9\U00011680-\U000116b7\U000116c0-\U000116c9\U00012000-\U0001236e\U00012400-\U00012462\U00013000-\U0001342e\U00016800-\U00016a38\U00016f00-\U00016f44\U00016f50-\U00016f7e\U00016f8f-\U00016f9f\U0001b000-\U0001b001\U0001d165-\U0001d169\U0001d16d-\U0001d172\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001d7ce-\U0001d7ff\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002f800-\U0002fa1d\U000e0100-\U000e01ef'
+
+    xid_start += u'\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031e\U00010330-\U0001034a\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a33\U00010a60-\U00010a7c\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010c00-\U00010c48\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011183-\U000111b2\U000111c1-\U000111c4\U00011680-\U000116aa\U00012000-\U0001236e\U00012400-\U00012462\U00013000-\U0001342e\U00016800-\U00016a38\U00016f00-\U00016f44\U00016f50\U00016f93-\U00016f9f\U0001b000-\U0001b001\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002f800-\U0002fa1d'
+
+cats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs']
+
+# Generated from unidata 6.3.0
+
+def combine(*args):
+    return u''.join(globals()[cat] for cat in args)
+
+
+def allexcept(*args):
+    newcats = cats[:]
+    for arg in args:
+        newcats.remove(arg)
+    return u''.join(globals()[cat] for cat in newcats)
+
+
+def _handle_runs(char_list):  # pragma: no cover
+    buf = []
+    for c in char_list:
+        if len(c) == 1:
+            if buf and buf[-1][1] == chr(ord(c)-1):
+                buf[-1] = (buf[-1][0], c)
+            else:
+                buf.append((c, c))
+        else:
+            buf.append((c, c))
+    for a, b in buf:
+        if a == b:
+            yield a
+        else:
+            yield u'%s-%s' % (a, b)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import unicodedata
+
+    # we need Py3 for the determination of the XID_* properties
+    if sys.version_info[:2] < (3, 3):
+        raise RuntimeError('this file must be regenerated with Python 3.3+')
+
+    categories_bmp = {'xid_start': [], 'xid_continue': []}
+    categories_nonbmp = {'xid_start': [], 'xid_continue': []}
+
+    with open(__file__) as fp:
+        content = fp.read()
+
+    header = content[:content.find('Cc =')]
+    footer = content[content.find("def combine("):]
+
+    for code in range(0x110000):
+        c = chr(code)
+        cat = unicodedata.category(c)
+        if ord(c) == 0xdc00:
+            # Hack to avoid combining this combining with the preceeding high
+            # surrogate, 0xdbff, when doing a repr.
+            c = u'\\' + c
+        elif ord(c) in (0x2d, 0x5b, 0x5c, 0x5d, 0x5e):
+            # Escape regex metachars.
+            c = u'\\' + c
+        cat_dic = categories_bmp if code < 0x10000 else categories_nonbmp
+        cat_dic.setdefault(cat, []).append(c)
+        # XID_START and XID_CONTINUE are special categories used for matching
+        # identifiers in Python 3.
+        if c.isidentifier():
+            cat_dic['xid_start'].append(c)
+        if ('a' + c).isidentifier():
+            cat_dic['xid_continue'].append(c)
+
+    with open(__file__, 'w') as fp:
+        fp.write(header)
+
+        for cat in sorted(categories_bmp):
+            val = u''.join(_handle_runs(categories_bmp[cat]))
+            if cat == 'Cs':
+                # Jython can't handle isolated surrogates
+                fp.write("""\
+try:
+    Cs = eval(r"u%s")
+except UnicodeDecodeError:
+    Cs = ''  # Jython can't handle isolated surrogates\n\n""" % ascii(val))
+            else:
+                fp.write('%s = u%a\n\n' % (cat, val))
+
+        fp.write('if sys.maxunicode > 0xFFFF:\n')
+        fp.write('    # non-BMP characters, use only on wide Unicode builds\n')
+        for cat in sorted(categories_nonbmp):
+            # no special case for Cs needed, since there are no surrogates
+            # in the higher planes
+            val = u''.join(_handle_runs(categories_nonbmp[cat]))
+            fp.write('    %s += u%a\n\n' % (cat, val))
+
+        cats = sorted(categories_bmp)
+        cats.remove('xid_start')
+        cats.remove('xid_continue')
+        fp.write('cats = %r\n\n' % cats)
+
+        fp.write('# Generated from unidata %s\n\n' % (unicodedata.unidata_version,))
+
+        fp.write(footer)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/filter.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/filter.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/filter.py	(revision 1126)
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.filter
+    ~~~~~~~~~~~~~~~
+
+    Module that implements the default filter.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+def apply_filters(stream, filters, lexer=None):
+    """
+    Use this method to apply an iterable of filters to
+    a stream. If lexer is given it's forwarded to the
+    filter, otherwise the filter receives `None`.
+    """
+    def _apply(filter_, stream):
+        for token in filter_.filter(lexer, stream):
+            yield token
+    for filter_ in filters:
+        stream = _apply(filter_, stream)
+    return stream
+
+
+def simplefilter(f):
+    """
+    Decorator that converts a function into a filter::
+
+        @simplefilter
+        def lowercase(self, lexer, stream, options):
+            for ttype, value in stream:
+                yield ttype, value.lower()
+    """
+    return type(f.__name__, (FunctionFilter,), {
+        '__module__': getattr(f, '__module__'),
+        '__doc__': f.__doc__,
+        'function': f,
+    })
+
+
+class Filter(object):
+    """
+    Default filter. Subclass this class or use the `simplefilter`
+    decorator to create own filters.
+    """
+
+    def __init__(self, **options):
+        self.options = options
+
+    def filter(self, lexer, stream):
+        raise NotImplementedError()
+
+
+class FunctionFilter(Filter):
+    """
+    Abstract class used by `simplefilter` to create simple
+    function filters on the fly. The `simplefilter` decorator
+    automatically creates subclasses of this class for
+    functions passed to it.
+    """
+    function = None
+
+    def __init__(self, **options):
+        if not hasattr(self, 'function'):
+            raise TypeError('%r used without bound function' %
+                            self.__class__.__name__)
+        Filter.__init__(self, **options)
+
+    def filter(self, lexer, stream):
+        # pylint: disable=not-callable
+        for ttype, value in self.function(lexer, stream, self.options):
+            yield ttype, value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/scanner.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/scanner.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/scanner.py	(revision 1126)
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.scanner
+    ~~~~~~~~~~~~~~~~
+
+    This library implements a regex based scanner. Some languages
+    like Pascal are easy to parse but have some keywords that
+    depend on the context. Because of this it's impossible to lex
+    that just by using a regular expression lexer like the
+    `RegexLexer`.
+
+    Have a look at the `DelphiLexer` to get an idea of how to use
+    this scanner.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import re
+
+
+class EndOfText(RuntimeError):
+    """
+    Raise if end of text is reached and the user
+    tried to call a match function.
+    """
+
+
+class Scanner(object):
+    """
+    Simple scanner
+
+    All method patterns are regular expression strings (not
+    compiled expressions!)
+    """
+
+    def __init__(self, text, flags=0):
+        """
+        :param text:    The text which should be scanned
+        :param flags:   default regular expression flags
+        """
+        self.data = text
+        self.data_length = len(text)
+        self.start_pos = 0
+        self.pos = 0
+        self.flags = flags
+        self.last = None
+        self.match = None
+        self._re_cache = {}
+
+    def eos(self):
+        """`True` if the scanner reached the end of text."""
+        return self.pos >= self.data_length
+    eos = property(eos, eos.__doc__)
+
+    def check(self, pattern):
+        """
+        Apply `pattern` on the current position and return
+        the match object. (Doesn't touch pos). Use this for
+        lookahead.
+        """
+        if self.eos:
+            raise EndOfText()
+        if pattern not in self._re_cache:
+            self._re_cache[pattern] = re.compile(pattern, self.flags)
+        return self._re_cache[pattern].match(self.data, self.pos)
+
+    def test(self, pattern):
+        """Apply a pattern on the current position and check
+        if it patches. Doesn't touch pos.
+        """
+        return self.check(pattern) is not None
+
+    def scan(self, pattern):
+        """
+        Scan the text for the given pattern and update pos/match
+        and related fields. The return value is a boolen that
+        indicates if the pattern matched. The matched value is
+        stored on the instance as ``match``, the last value is
+        stored as ``last``. ``start_pos`` is the position of the
+        pointer before the pattern was matched, ``pos`` is the
+        end position.
+        """
+        if self.eos:
+            raise EndOfText()
+        if pattern not in self._re_cache:
+            self._re_cache[pattern] = re.compile(pattern, self.flags)
+        self.last = self.match
+        m = self._re_cache[pattern].match(self.data, self.pos)
+        if m is None:
+            return False
+        self.start_pos = m.start()
+        self.pos = m.end()
+        self.match = m.group()
+        return True
+
+    def get_char(self):
+        """Scan exactly one char."""
+        self.scan('.')
+
+    def __repr__(self):
+        return '<%s %d/%d>' % (
+            self.__class__.__name__,
+            self.pos,
+            self.data_length
+        )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/sphinxext.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/sphinxext.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/sphinxext.py	(revision 1126)
@@ -0,0 +1,158 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.sphinxext
+    ~~~~~~~~~~~~~~~~~~
+
+    Sphinx extension to generate automatic documentation of lexers,
+    formatters and filters.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+import sys
+
+from docutils import nodes
+from docutils.statemachine import ViewList
+from sphinx.util.compat import Directive
+from sphinx.util.nodes import nested_parse_with_titles
+
+
+MODULEDOC = '''
+.. module:: %s
+
+%s
+%s
+'''
+
+LEXERDOC = '''
+.. class:: %s
+
+    :Short names: %s
+    :Filenames:   %s
+    :MIME types:  %s
+
+    %s
+
+'''
+
+FMTERDOC = '''
+.. class:: %s
+
+    :Short names: %s
+    :Filenames: %s
+
+    %s
+
+'''
+
+FILTERDOC = '''
+.. class:: %s
+
+    :Name: %s
+
+    %s
+
+'''
+
+
+class PygmentsDoc(Directive):
+    """
+    A directive to collect all lexers/formatters/filters and generate
+    autoclass directives for them.
+    """
+    has_content = False
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = False
+    option_spec = {}
+
+    def run(self):
+        self.filenames = set()
+        if self.arguments[0] == 'lexers':
+            out = self.document_lexers()
+        elif self.arguments[0] == 'formatters':
+            out = self.document_formatters()
+        elif self.arguments[0] == 'filters':
+            out = self.document_filters()
+        else:
+            raise Exception('invalid argument for "pygmentsdoc" directive')
+        node = nodes.compound()
+        vl = ViewList(out.split('\n'), source='')
+        nested_parse_with_titles(self.state, vl, node)
+        for fn in self.filenames:
+            self.state.document.settings.record_dependencies.add(fn)
+        return node.children
+
+    def document_lexers(self):
+        from pygments.lexers._mapping import LEXERS
+        out = []
+        modules = {}
+        moduledocstrings = {}
+        for classname, data in sorted(LEXERS.items(), key=lambda x: x[0]):
+            module = data[0]
+            mod = __import__(module, None, None, [classname])
+            self.filenames.add(mod.__file__)
+            cls = getattr(mod, classname)
+            if not cls.__doc__:
+                print("Warning: %s does not have a docstring." % classname)
+            docstring = cls.__doc__
+            if isinstance(docstring, bytes):
+                docstring = docstring.decode('utf8')
+            modules.setdefault(module, []).append((
+                classname,
+                ', '.join(data[2]) or 'None',
+                ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None',
+                ', '.join(data[4]) or 'None',
+                docstring))
+            if module not in moduledocstrings:
+                moddoc = mod.__doc__
+                if isinstance(moddoc, bytes):
+                    moddoc = moddoc.decode('utf8')
+                moduledocstrings[module] = moddoc
+
+        for module, lexers in sorted(modules.items(), key=lambda x: x[0]):
+            if moduledocstrings[module] is None:
+                raise Exception("Missing docstring for %s" % (module,))
+            heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.')
+            out.append(MODULEDOC % (module, heading, '-'*len(heading)))
+            for data in lexers:
+                out.append(LEXERDOC % data)
+
+        return ''.join(out)
+
+    def document_formatters(self):
+        from pygments.formatters import FORMATTERS
+
+        out = []
+        for classname, data in sorted(FORMATTERS.items(), key=lambda x: x[0]):
+            module = data[0]
+            mod = __import__(module, None, None, [classname])
+            self.filenames.add(mod.__file__)
+            cls = getattr(mod, classname)
+            docstring = cls.__doc__
+            if isinstance(docstring, bytes):
+                docstring = docstring.decode('utf8')
+            heading = cls.__name__
+            out.append(FMTERDOC % (heading, ', '.join(data[2]) or 'None',
+                                   ', '.join(data[3]).replace('*', '\\*') or 'None',
+                                   docstring))
+        return ''.join(out)
+
+    def document_filters(self):
+        from pygments.filters import FILTERS
+
+        out = []
+        for name, cls in FILTERS.items():
+            self.filenames.add(sys.modules[cls.__module__].__file__)
+            docstring = cls.__doc__
+            if isinstance(docstring, bytes):
+                docstring = docstring.decode('utf8')
+            out.append(FILTERDOC % (cls.__name__, name, docstring))
+        return ''.join(out)
+
+
+def setup(app):
+    app.add_directive('pygmentsdoc', PygmentsDoc)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/modeline.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/modeline.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/modeline.py	(revision 1126)
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.modeline
+    ~~~~~~~~~~~~~~~~~
+
+    A simple modeline parser (based on pymodeline).
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+__all__ = ['get_filetype_from_buffer']
+
+
+modeline_re = re.compile(r'''
+    (?: vi | vim | ex ) (?: [<=>]? \d* )? :
+    .* (?: ft | filetype | syn | syntax ) = ( [^:\s]+ )
+''', re.VERBOSE)
+
+
+def get_filetype_from_line(l):
+    m = modeline_re.search(l)
+    if m:
+        return m.group(1)
+
+
+def get_filetype_from_buffer(buf, max_lines=5):
+    """
+    Scan the buffer for modelines and return filetype if one is found.
+    """
+    lines = buf.splitlines()
+    for l in lines[-1:-max_lines-1:-1]:
+        ret = get_filetype_from_line(l)
+        if ret:
+            return ret
+    for i in range(max_lines, -1, -1):
+        if i < len(lines):
+            ret = get_filetype_from_line(lines[i])
+            if ret:
+                return ret
+
+    return None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/fruity.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/fruity.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/fruity.py	(revision 1126)
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.fruity
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    pygments version of my "fruity" vim theme.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Token, Comment, Name, Keyword, \
+    Generic, Number, String, Whitespace
+
+class FruityStyle(Style):
+    """
+    Pygments version of the "native" vim theme.
+    """
+
+    background_color = '#111111'
+    highlight_color = '#333333'
+
+    styles = {
+        Whitespace:         '#888888',
+        Token:              '#ffffff',
+        Generic.Output:     '#444444 bg:#222222',
+        Keyword:            '#fb660a bold',
+        Keyword.Pseudo:     'nobold',
+        Number:             '#0086f7 bold',
+        Name.Tag:           '#fb660a bold',
+        Name.Variable:      '#fb660a',
+        Comment:            '#008800 bg:#0f140f italic',
+        Name.Attribute:     '#ff0086 bold',
+        String:             '#0086d2',
+        Name.Function:      '#ff0086 bold',
+        Generic.Heading:    '#ffffff bold',
+        Keyword.Type:       '#cdcaa9 bold',
+        Generic.Subheading: '#ffffff bold',
+        Name.Constant:      '#0086d2',
+        Comment.Preproc:    '#ff0007 bold'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/murphy.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/murphy.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/murphy.py	(revision 1126)
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.murphy
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Murphy's style from CodeRay.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class MurphyStyle(Style):
+    """
+    Murphy's style from CodeRay.
+    """
+
+    default_style = ""
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "#666 italic",
+        Comment.Preproc:           "#579 noitalic",
+        Comment.Special:           "#c00 bold",
+
+        Keyword:                   "bold #289",
+        Keyword.Pseudo:            "#08f",
+        Keyword.Type:              "#66f",
+
+        Operator:                  "#333",
+        Operator.Word:             "bold #000",
+
+        Name.Builtin:              "#072",
+        Name.Function:             "bold #5ed",
+        Name.Class:                "bold #e9e",
+        Name.Namespace:            "bold #0e84b5",
+        Name.Exception:            "bold #F00",
+        Name.Variable:             "#036",
+        Name.Variable.Instance:    "#aaf",
+        Name.Variable.Class:       "#ccf",
+        Name.Variable.Global:      "#f84",
+        Name.Constant:             "bold #5ed",
+        Name.Label:                "bold #970",
+        Name.Entity:               "#800",
+        Name.Attribute:            "#007",
+        Name.Tag:                  "#070",
+        Name.Decorator:            "bold #555",
+
+        String:                    "bg:#e0e0ff",
+        String.Char:               "#88F bg:",
+        String.Doc:                "#D42 bg:",
+        String.Interpol:           "bg:#eee",
+        String.Escape:             "bold #666",
+        String.Regex:              "bg:#e0e0ff #000",
+        String.Symbol:             "#fc8 bg:",
+        String.Other:              "#f88",
+
+        Number:                    "bold #60E",
+        Number.Integer:            "bold #66f",
+        Number.Float:              "bold #60E",
+        Number.Hex:                "bold #058",
+        Number.Oct:                "bold #40E",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold #c65d09",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "#F00 bg:#FAA"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/colorful.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/colorful.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/colorful.py	(revision 1126)
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.colorful
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A colorful style, inspired by CodeRay.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class ColorfulStyle(Style):
+    """
+    A colorful style, inspired by CodeRay.
+    """
+
+    default_style = ""
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+
+        Comment:                   "#888",
+        Comment.Preproc:           "#579",
+        Comment.Special:           "bold #cc0000",
+
+        Keyword:                   "bold #080",
+        Keyword.Pseudo:            "#038",
+        Keyword.Type:              "#339",
+
+        Operator:                  "#333",
+        Operator.Word:             "bold #000",
+
+        Name.Builtin:              "#007020",
+        Name.Function:             "bold #06B",
+        Name.Class:                "bold #B06",
+        Name.Namespace:            "bold #0e84b5",
+        Name.Exception:            "bold #F00",
+        Name.Variable:             "#963",
+        Name.Variable.Instance:    "#33B",
+        Name.Variable.Class:       "#369",
+        Name.Variable.Global:      "bold #d70",
+        Name.Constant:             "bold #036",
+        Name.Label:                "bold #970",
+        Name.Entity:               "bold #800",
+        Name.Attribute:            "#00C",
+        Name.Tag:                  "#070",
+        Name.Decorator:            "bold #555",
+
+        String:                    "bg:#fff0f0",
+        String.Char:               "#04D bg:",
+        String.Doc:                "#D42 bg:",
+        String.Interpol:           "bg:#eee",
+        String.Escape:             "bold #666",
+        String.Regex:              "bg:#fff0ff #000",
+        String.Symbol:             "#A60 bg:",
+        String.Other:              "#D20",
+
+        Number:                    "bold #60E",
+        Number.Integer:            "bold #00D",
+        Number.Float:              "bold #60E",
+        Number.Hex:                "bold #058",
+        Number.Oct:                "bold #40E",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold #c65d09",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "#F00 bg:#FAA"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/native.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/native.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/native.py	(revision 1126)
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.native
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    pygments version of my "native" vim theme.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Token, Whitespace
+
+
+class NativeStyle(Style):
+    """
+    Pygments version of the "native" vim theme.
+    """
+
+    background_color = '#202020'
+    highlight_color = '#404040'
+
+    styles = {
+        Token:              '#d0d0d0',
+        Whitespace:         '#666666',
+
+        Comment:            'italic #999999',
+        Comment.Preproc:    'noitalic bold #cd2828',
+        Comment.Special:    'noitalic bold #e50808 bg:#520000',
+
+        Keyword:            'bold #6ab825',
+        Keyword.Pseudo:     'nobold',
+        Operator.Word:      'bold #6ab825',
+
+        String:             '#ed9d13',
+        String.Other:       '#ffa500',
+
+        Number:             '#3677a9',
+
+        Name.Builtin:       '#24909d',
+        Name.Variable:      '#40ffff',
+        Name.Constant:      '#40ffff',
+        Name.Class:         'underline #447fcf',
+        Name.Function:      '#447fcf',
+        Name.Namespace:     'underline #447fcf',
+        Name.Exception:     '#bbbbbb',
+        Name.Tag:           'bold #6ab825',
+        Name.Attribute:     '#bbbbbb',
+        Name.Decorator:     '#ffa500',
+
+        Generic.Heading:    'bold #ffffff',
+        Generic.Subheading: 'underline #ffffff',
+        Generic.Deleted:    '#d22323',
+        Generic.Inserted:   '#589819',
+        Generic.Error:      '#d22323',
+        Generic.Emph:       'italic',
+        Generic.Strong:     'bold',
+        Generic.Prompt:     '#aaaaaa',
+        Generic.Output:     '#cccccc',
+        Generic.Traceback:  '#d22323',
+
+        Error:              'bg:#e3d2d2 #a61717'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/emacs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/emacs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/emacs.py	(revision 1126)
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.emacs
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    A highlighting style for Pygments, inspired by Emacs.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class EmacsStyle(Style):
+    """
+    The default style (inspired by Emacs 22).
+    """
+
+    background_color = "#f8f8f8"
+    default_style = ""
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "italic #008800",
+        Comment.Preproc:           "noitalic",
+        Comment.Special:           "noitalic bold",
+
+        Keyword:                   "bold #AA22FF",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "bold #00BB00",
+
+        Operator:                  "#666666",
+        Operator.Word:             "bold #AA22FF",
+
+        Name.Builtin:              "#AA22FF",
+        Name.Function:             "#00A000",
+        Name.Class:                "#0000FF",
+        Name.Namespace:            "bold #0000FF",
+        Name.Exception:            "bold #D2413A",
+        Name.Variable:             "#B8860B",
+        Name.Constant:             "#880000",
+        Name.Label:                "#A0A000",
+        Name.Entity:               "bold #999999",
+        Name.Attribute:            "#BB4444",
+        Name.Tag:                  "bold #008000",
+        Name.Decorator:            "#AA22FF",
+
+        String:                    "#BB4444",
+        String.Doc:                "italic",
+        String.Interpol:           "bold #BB6688",
+        String.Escape:             "bold #BB6622",
+        String.Regex:              "#BB6688",
+        String.Symbol:             "#B8860B",
+        String.Other:              "#008000",
+        Number:                    "#666666",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold #000080",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/vim.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/vim.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/vim.py	(revision 1126)
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.vim
+    ~~~~~~~~~~~~~~~~~~~
+
+    A highlighting style for Pygments, inspired by vim.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace, Token
+
+
+class VimStyle(Style):
+    """
+    Styles somewhat like vim 7.0
+    """
+
+    background_color = "#000000"
+    highlight_color = "#222222"
+    default_style = "#cccccc"
+
+    styles = {
+        Token:                     "#cccccc",
+        Whitespace:                "",
+        Comment:                   "#000080",
+        Comment.Preproc:           "",
+        Comment.Special:           "bold #cd0000",
+
+        Keyword:                   "#cdcd00",
+        Keyword.Declaration:       "#00cd00",
+        Keyword.Namespace:         "#cd00cd",
+        Keyword.Pseudo:            "",
+        Keyword.Type:              "#00cd00",
+
+        Operator:                  "#3399cc",
+        Operator.Word:             "#cdcd00",
+
+        Name:                      "",
+        Name.Class:                "#00cdcd",
+        Name.Builtin:              "#cd00cd",
+        Name.Exception:            "bold #666699",
+        Name.Variable:             "#00cdcd",
+
+        String:                    "#cd0000",
+        Number:                    "#cd00cd",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#cd0000",
+        Generic.Inserted:          "#00cd00",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold #000080",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/paraiso_dark.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/paraiso_dark.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/paraiso_dark.py	(revision 1126)
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.paraiso_dark
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Paraíso (Dark) by Jan T. Sott
+
+    Pygments template by Jan T. Sott (https://github.com/idleberg)
+    Created with Base16 Builder by Chris Kempson
+    (https://github.com/chriskempson/base16-builder).
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Text, \
+    Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+BACKGROUND = "#2f1e2e"
+CURRENT_LINE = "#41323f"
+SELECTION = "#4f424c"
+FOREGROUND = "#e7e9db"
+COMMENT = "#776e71"
+RED = "#ef6155"
+ORANGE = "#f99b15"
+YELLOW = "#fec418"
+GREEN = "#48b685"
+AQUA = "#5bc4bf"
+BLUE = "#06b6ef"
+PURPLE = "#815ba4"
+
+
+class ParaisoDarkStyle(Style):
+
+    default_style = ''
+
+    background_color = BACKGROUND
+    highlight_color = SELECTION
+
+    background_color = BACKGROUND
+    highlight_color = SELECTION
+
+    styles = {
+        # No corresponding class for the following:
+        Text:                      FOREGROUND,  # class:  ''
+        Whitespace:                "",          # class: 'w'
+        Error:                     RED,         # class: 'err'
+        Other:                     "",          # class 'x'
+
+        Comment:                   COMMENT,   # class: 'c'
+        Comment.Multiline:         "",        # class: 'cm'
+        Comment.Preproc:           "",        # class: 'cp'
+        Comment.Single:            "",        # class: 'c1'
+        Comment.Special:           "",        # class: 'cs'
+
+        Keyword:                   PURPLE,    # class: 'k'
+        Keyword.Constant:          "",        # class: 'kc'
+        Keyword.Declaration:       "",        # class: 'kd'
+        Keyword.Namespace:         AQUA,      # class: 'kn'
+        Keyword.Pseudo:            "",        # class: 'kp'
+        Keyword.Reserved:          "",        # class: 'kr'
+        Keyword.Type:              YELLOW,    # class: 'kt'
+
+        Operator:                  AQUA,      # class: 'o'
+        Operator.Word:             "",        # class: 'ow' - like keywords
+
+        Punctuation:               FOREGROUND,  # class: 'p'
+
+        Name:                      FOREGROUND,  # class: 'n'
+        Name.Attribute:            BLUE,        # class: 'na' - to be revised
+        Name.Builtin:              "",          # class: 'nb'
+        Name.Builtin.Pseudo:       "",          # class: 'bp'
+        Name.Class:                YELLOW,      # class: 'nc' - to be revised
+        Name.Constant:             RED,         # class: 'no' - to be revised
+        Name.Decorator:            AQUA,        # class: 'nd' - to be revised
+        Name.Entity:               "",          # class: 'ni'
+        Name.Exception:            RED,         # class: 'ne'
+        Name.Function:             BLUE,        # class: 'nf'
+        Name.Property:             "",          # class: 'py'
+        Name.Label:                "",          # class: 'nl'
+        Name.Namespace:            YELLOW,      # class: 'nn' - to be revised
+        Name.Other:                BLUE,        # class: 'nx'
+        Name.Tag:                  AQUA,        # class: 'nt' - like a keyword
+        Name.Variable:             RED,         # class: 'nv' - to be revised
+        Name.Variable.Class:       "",          # class: 'vc' - to be revised
+        Name.Variable.Global:      "",          # class: 'vg' - to be revised
+        Name.Variable.Instance:    "",          # class: 'vi' - to be revised
+
+        Number:                    ORANGE,    # class: 'm'
+        Number.Float:              "",        # class: 'mf'
+        Number.Hex:                "",        # class: 'mh'
+        Number.Integer:            "",        # class: 'mi'
+        Number.Integer.Long:       "",        # class: 'il'
+        Number.Oct:                "",        # class: 'mo'
+
+        Literal:                   ORANGE,    # class: 'l'
+        Literal.Date:              GREEN,     # class: 'ld'
+
+        String:                    GREEN,       # class: 's'
+        String.Backtick:           "",          # class: 'sb'
+        String.Char:               FOREGROUND,  # class: 'sc'
+        String.Doc:                COMMENT,     # class: 'sd' - like a comment
+        String.Double:             "",          # class: 's2'
+        String.Escape:             ORANGE,      # class: 'se'
+        String.Heredoc:            "",          # class: 'sh'
+        String.Interpol:           ORANGE,      # class: 'si'
+        String.Other:              "",          # class: 'sx'
+        String.Regex:              "",          # class: 'sr'
+        String.Single:             "",          # class: 's1'
+        String.Symbol:             "",          # class: 'ss'
+
+        Generic:                   "",                    # class: 'g'
+        Generic.Deleted:           RED,                   # class: 'gd',
+        Generic.Emph:              "italic",              # class: 'ge'
+        Generic.Error:             "",                    # class: 'gr'
+        Generic.Heading:           "bold " + FOREGROUND,  # class: 'gh'
+        Generic.Inserted:          GREEN,                 # class: 'gi'
+        Generic.Output:            "",                    # class: 'go'
+        Generic.Prompt:            "bold " + COMMENT,     # class: 'gp'
+        Generic.Strong:            "bold",                # class: 'gs'
+        Generic.Subheading:        "bold " + AQUA,        # class: 'gu'
+        Generic.Traceback:         "",                    # class: 'gt'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/__init__.py	(revision 1126)
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles
+    ~~~~~~~~~~~~~~~
+
+    Contains built-in styles.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.plugin import find_plugin_styles
+from pygments.util import ClassNotFound
+
+
+#: Maps style names to 'submodule::classname'.
+STYLE_MAP = {
+    'default':  'default::DefaultStyle',
+    'emacs':    'emacs::EmacsStyle',
+    'friendly': 'friendly::FriendlyStyle',
+    'colorful': 'colorful::ColorfulStyle',
+    'autumn':   'autumn::AutumnStyle',
+    'murphy':   'murphy::MurphyStyle',
+    'manni':    'manni::ManniStyle',
+    'monokai':  'monokai::MonokaiStyle',
+    'perldoc':  'perldoc::PerldocStyle',
+    'pastie':   'pastie::PastieStyle',
+    'borland':  'borland::BorlandStyle',
+    'trac':     'trac::TracStyle',
+    'native':   'native::NativeStyle',
+    'fruity':   'fruity::FruityStyle',
+    'bw':       'bw::BlackWhiteStyle',
+    'vim':      'vim::VimStyle',
+    'vs':       'vs::VisualStudioStyle',
+    'tango':    'tango::TangoStyle',
+    'rrt':      'rrt::RrtStyle',
+    'xcode':    'xcode::XcodeStyle',
+    'igor':     'igor::IgorStyle',
+    'paraiso-light': 'paraiso_light::ParaisoLightStyle',
+    'paraiso-dark': 'paraiso_dark::ParaisoDarkStyle',
+    'lovelace': 'lovelace::LovelaceStyle',
+    'algol':    'algol::AlgolStyle',
+    'algol_nu': 'algol_nu::Algol_NuStyle',
+    'arduino':  'arduino::ArduinoStyle',
+    'rainbow_dash': 'rainbow_dash::RainbowDashStyle',
+    'abap':     'abap::AbapStyle',
+}
+
+
+def get_style_by_name(name):
+    if name in STYLE_MAP:
+        mod, cls = STYLE_MAP[name].split('::')
+        builtin = "yes"
+    else:
+        for found_name, style in find_plugin_styles():
+            if name == found_name:
+                return style
+        # perhaps it got dropped into our styles package
+        builtin = ""
+        mod = name
+        cls = name.title() + "Style"
+
+    try:
+        mod = __import__('pygments.styles.' + mod, None, None, [cls])
+    except ImportError:
+        raise ClassNotFound("Could not find style module %r" % mod +
+                         (builtin and ", though it should be builtin") + ".")
+    try:
+        return getattr(mod, cls)
+    except AttributeError:
+        raise ClassNotFound("Could not find style class %r in style module." % cls)
+
+
+def get_all_styles():
+    """Return an generator for all styles by name,
+    both builtin and plugin."""
+    for name in STYLE_MAP:
+        yield name
+    for name, _ in find_plugin_styles():
+        yield name
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/algol_nu.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/algol_nu.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/algol_nu.py	(revision 1126)
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.algol_nu
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Algol publication style without underlining of keywords.
+
+    This style renders source code for publication of algorithms in
+    scientific papers and academic texts, where its format is frequently used.
+
+    It is based on the style of the revised Algol-60 language report[1].
+
+    o  No colours, only black, white and shades of grey are used.
+    o  Keywords are rendered in lowercase boldface.
+    o  Builtins are rendered in lowercase boldface italic.
+    o  Docstrings and pragmas are rendered in dark grey boldface.
+    o  Library identifiers are rendered in dark grey boldface italic.
+    o  Comments are rendered in grey italic.
+
+    To render keywords with underlining, refer to the `Algol` style.
+
+    For lowercase conversion of keywords and builtins in languages where
+    these are not or might not be lowercase, a supporting lexer is required.
+    The Algol and Modula-2 lexers automatically convert to lowercase whenever
+    this style is selected.
+
+    [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>`
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Operator
+
+
+class Algol_NuStyle(Style):
+
+    background_color = "#ffffff"
+    default_style = ""
+
+    styles = {
+        Comment:                   "italic #888",
+        Comment.Preproc:           "bold noitalic #888",
+        Comment.Special:           "bold noitalic #888",
+
+        Keyword:                   "bold",
+        Keyword.Declaration:       "italic",
+
+        Name.Builtin:              "bold italic",
+        Name.Builtin.Pseudo:       "bold italic",
+        Name.Namespace:            "bold italic #666",
+        Name.Class:                "bold italic #666",
+        Name.Function:             "bold italic #666",
+        Name.Variable:             "bold italic #666",
+        Name.Constant:             "bold italic #666",
+
+        Operator.Word:             "bold",
+
+        String:                    "italic #666",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/rainbow_dash.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/rainbow_dash.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/rainbow_dash.py	(revision 1126)
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.rainbow_dash
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A bright and colorful syntax highlighting `theme`.
+
+    .. _theme: http://sanssecours.github.io/Rainbow-Dash.tmbundle
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import (Comment, Error, Generic, Name, Number, Operator,
+                            String, Text, Whitespace, Keyword)
+
+BLUE_LIGHT = '#0080ff'
+BLUE = '#2c5dcd'
+GREEN = '#00cc66'
+GREEN_LIGHT = '#ccffcc'
+GREEN_NEON = '#00cc00'
+GREY = '#aaaaaa'
+GREY_LIGHT = '#cbcbcb'
+GREY_DARK = '#4d4d4d'
+PURPLE = '#5918bb'
+RED = '#cc0000'
+RED_DARK = '#c5060b'
+RED_LIGHT = '#ffcccc'
+RED_BRIGHT = '#ff0000'
+WHITE = '#ffffff'
+TURQUOISE = '#318495'
+ORANGE = '#ff8000'
+
+
+class RainbowDashStyle(Style):
+    """
+    A bright and colorful syntax highlighting theme.
+    """
+
+    background_color = WHITE
+
+    styles = {
+        Comment: 'italic {}'.format(BLUE_LIGHT),
+        Comment.Preproc: 'noitalic',
+        Comment.Special: 'bold',
+
+        Error: 'bg:{} {}'.format(RED, WHITE),
+
+        Generic.Deleted: 'border:{} bg:{}'.format(RED_DARK, RED_LIGHT),
+        Generic.Emph: 'italic',
+        Generic.Error: RED_BRIGHT,
+        Generic.Heading: 'bold {}'.format(BLUE),
+        Generic.Inserted: 'border:{} bg:{}'.format(GREEN_NEON, GREEN_LIGHT),
+        Generic.Output: GREY,
+        Generic.Prompt: 'bold {}'.format(BLUE),
+        Generic.Strong: 'bold',
+        Generic.Subheading: 'bold {}'.format(BLUE),
+        Generic.Traceback: RED_DARK,
+
+        Keyword: 'bold {}'.format(BLUE),
+        Keyword.Pseudo: 'nobold',
+        Keyword.Type: PURPLE,
+
+        Name.Attribute: 'italic {}'.format(BLUE),
+        Name.Builtin: 'bold {}'.format(PURPLE),
+        Name.Class: 'underline',
+        Name.Constant: TURQUOISE,
+        Name.Decorator: 'bold {}'.format(ORANGE),
+        Name.Entity: 'bold {}'.format(PURPLE),
+        Name.Exception: 'bold {}'.format(PURPLE),
+        Name.Function: 'bold {}'.format(ORANGE),
+        Name.Tag: 'bold {}'.format(BLUE),
+
+        Number: 'bold {}'.format(PURPLE),
+
+        Operator: BLUE,
+        Operator.Word: 'bold',
+
+        String: GREEN,
+        String.Doc: 'italic',
+        String.Escape: 'bold {}'.format(RED_DARK),
+        String.Other: TURQUOISE,
+        String.Symbol: 'bold {}'.format(RED_DARK),
+
+        Text: GREY_DARK,
+
+        Whitespace: GREY_LIGHT
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/tango.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/tango.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/tango.py	(revision 1126)
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.tango
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    The Crunchy default Style inspired from the color palette from
+    the Tango Icon Theme Guidelines.
+
+    http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines
+
+    Butter:     #fce94f     #edd400     #c4a000
+    Orange:     #fcaf3e     #f57900     #ce5c00
+    Chocolate:  #e9b96e     #c17d11     #8f5902
+    Chameleon:  #8ae234     #73d216     #4e9a06
+    Sky Blue:   #729fcf     #3465a4     #204a87
+    Plum:       #ad7fa8     #75507b     #5c35cc
+    Scarlet Red:#ef2929     #cc0000     #a40000
+    Aluminium:  #eeeeec     #d3d7cf     #babdb6
+                #888a85     #555753     #2e3436
+
+    Not all of the above colors are used; other colors added:
+        very light grey: #f8f8f8  (for background)
+
+    This style can be used as a template as it includes all the known
+    Token types, unlike most (if not all) of the styles included in the
+    Pygments distribution.
+
+    However, since Crunchy is intended to be used by beginners, we have strived
+    to create a style that gloss over subtle distinctions between different
+    categories.
+
+    Taking Python for example, comments (Comment.*) and docstrings (String.Doc)
+    have been chosen to have the same style.  Similarly, keywords (Keyword.*),
+    and Operator.Word (and, or, in) have been assigned the same style.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+class TangoStyle(Style):
+    """
+    The Crunchy default Style inspired from the color palette from
+    the Tango Icon Theme Guidelines.
+    """
+
+    # work in progress...
+
+    background_color = "#f8f8f8"
+    default_style = ""
+
+    styles = {
+        # No corresponding class for the following:
+        #Text:                     "", # class:  ''
+        Whitespace:                "underline #f8f8f8",      # class: 'w'
+        Error:                     "#a40000 border:#ef2929", # class: 'err'
+        Other:                     "#000000",                # class 'x'
+
+        Comment:                   "italic #8f5902", # class: 'c'
+        Comment.Multiline:         "italic #8f5902", # class: 'cm'
+        Comment.Preproc:           "italic #8f5902", # class: 'cp'
+        Comment.Single:            "italic #8f5902", # class: 'c1'
+        Comment.Special:           "italic #8f5902", # class: 'cs'
+
+        Keyword:                   "bold #204a87",   # class: 'k'
+        Keyword.Constant:          "bold #204a87",   # class: 'kc'
+        Keyword.Declaration:       "bold #204a87",   # class: 'kd'
+        Keyword.Namespace:         "bold #204a87",   # class: 'kn'
+        Keyword.Pseudo:            "bold #204a87",   # class: 'kp'
+        Keyword.Reserved:          "bold #204a87",   # class: 'kr'
+        Keyword.Type:              "bold #204a87",   # class: 'kt'
+
+        Operator:                  "bold #ce5c00",   # class: 'o'
+        Operator.Word:             "bold #204a87",   # class: 'ow' - like keywords
+
+        Punctuation:               "bold #000000",   # class: 'p'
+
+        # because special names such as Name.Class, Name.Function, etc.
+        # are not recognized as such later in the parsing, we choose them
+        # to look the same as ordinary variables.
+        Name:                      "#000000",        # class: 'n'
+        Name.Attribute:            "#c4a000",        # class: 'na' - to be revised
+        Name.Builtin:              "#204a87",        # class: 'nb'
+        Name.Builtin.Pseudo:       "#3465a4",        # class: 'bp'
+        Name.Class:                "#000000",        # class: 'nc' - to be revised
+        Name.Constant:             "#000000",        # class: 'no' - to be revised
+        Name.Decorator:            "bold #5c35cc",   # class: 'nd' - to be revised
+        Name.Entity:               "#ce5c00",        # class: 'ni'
+        Name.Exception:            "bold #cc0000",   # class: 'ne'
+        Name.Function:             "#000000",        # class: 'nf'
+        Name.Property:             "#000000",        # class: 'py'
+        Name.Label:                "#f57900",        # class: 'nl'
+        Name.Namespace:            "#000000",        # class: 'nn' - to be revised
+        Name.Other:                "#000000",        # class: 'nx'
+        Name.Tag:                  "bold #204a87",   # class: 'nt' - like a keyword
+        Name.Variable:             "#000000",        # class: 'nv' - to be revised
+        Name.Variable.Class:       "#000000",        # class: 'vc' - to be revised
+        Name.Variable.Global:      "#000000",        # class: 'vg' - to be revised
+        Name.Variable.Instance:    "#000000",        # class: 'vi' - to be revised
+
+        # since the tango light blue does not show up well in text, we choose
+        # a pure blue instead.
+        Number:                    "bold #0000cf",   # class: 'm'
+        Number.Float:              "bold #0000cf",   # class: 'mf'
+        Number.Hex:                "bold #0000cf",   # class: 'mh'
+        Number.Integer:            "bold #0000cf",   # class: 'mi'
+        Number.Integer.Long:       "bold #0000cf",   # class: 'il'
+        Number.Oct:                "bold #0000cf",   # class: 'mo'
+
+        Literal:                   "#000000",        # class: 'l'
+        Literal.Date:              "#000000",        # class: 'ld'
+
+        String:                    "#4e9a06",        # class: 's'
+        String.Backtick:           "#4e9a06",        # class: 'sb'
+        String.Char:               "#4e9a06",        # class: 'sc'
+        String.Doc:                "italic #8f5902", # class: 'sd' - like a comment
+        String.Double:             "#4e9a06",        # class: 's2'
+        String.Escape:             "#4e9a06",        # class: 'se'
+        String.Heredoc:            "#4e9a06",        # class: 'sh'
+        String.Interpol:           "#4e9a06",        # class: 'si'
+        String.Other:              "#4e9a06",        # class: 'sx'
+        String.Regex:              "#4e9a06",        # class: 'sr'
+        String.Single:             "#4e9a06",        # class: 's1'
+        String.Symbol:             "#4e9a06",        # class: 'ss'
+
+        Generic:                   "#000000",        # class: 'g'
+        Generic.Deleted:           "#a40000",        # class: 'gd'
+        Generic.Emph:              "italic #000000", # class: 'ge'
+        Generic.Error:             "#ef2929",        # class: 'gr'
+        Generic.Heading:           "bold #000080",   # class: 'gh'
+        Generic.Inserted:          "#00A000",        # class: 'gi'
+        Generic.Output:            "italic #000000", # class: 'go'
+        Generic.Prompt:            "#8f5902",        # class: 'gp'
+        Generic.Strong:            "bold #000000",   # class: 'gs'
+        Generic.Subheading:        "bold #800080",   # class: 'gu'
+        Generic.Traceback:         "bold #a40000",   # class: 'gt'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/bw.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/bw.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/bw.py	(revision 1126)
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.bw
+    ~~~~~~~~~~~~~~~~~~
+
+    Simple black/white only style.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Operator, Generic
+
+
+class BlackWhiteStyle(Style):
+
+    background_color = "#ffffff"
+    default_style = ""
+
+    styles = {
+        Comment:                   "italic",
+        Comment.Preproc:           "noitalic",
+
+        Keyword:                   "bold",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "nobold",
+
+        Operator.Word:             "bold",
+
+        Name.Class:                "bold",
+        Name.Namespace:            "bold",
+        Name.Exception:            "bold",
+        Name.Entity:               "bold",
+        Name.Tag:                  "bold",
+
+        String:                    "italic",
+        String.Interpol:           "bold",
+        String.Escape:             "bold",
+
+        Generic.Heading:           "bold",
+        Generic.Subheading:        "bold",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/stata.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/stata.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/stata.py	(revision 1126)
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.stata
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Style inspired by Stata's do-file editor. Note this is not meant
+    to be a complete style. It's merely meant to mimic Stata's do file
+    editor syntax highlighting.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Whitespace
+
+
+class StataStyle(Style):
+    """
+    Style inspired by Stata's do-file editor. Note this is not meant
+    to be a complete style. It's merely meant to mimic Stata's do file
+    editor syntax highlighting.
+    """
+
+    default_style = ''
+
+    styles = {
+        Whitespace:            '#bbbbbb',
+        Comment:               'italic #008800',
+        String:                '#7a2424',
+        Number:                '#2c2cff',
+        Operator:              '',
+        Keyword:               'bold #353580',
+        Keyword.Constant:      '',
+        Name.Function:         '#2c2cff',
+        Name.Variable:         'bold #35baba',
+        Name.Variable.Global:  'bold #b5565e',
+        Error:                 'bg:#e3d2d2 #a61717'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/borland.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/borland.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/borland.py	(revision 1126)
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.borland
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the style used in the Borland IDEs.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class BorlandStyle(Style):
+    """
+    Style similar to the style used in the borland IDEs.
+    """
+
+    default_style = ''
+
+    styles = {
+        Whitespace:             '#bbbbbb',
+
+        Comment:                'italic #008800',
+        Comment.Preproc:        'noitalic #008080',
+        Comment.Special:        'noitalic bold',
+
+        String:                 '#0000FF',
+        String.Char:            '#800080',
+        Number:                 '#0000FF',
+        Keyword:                'bold #000080',
+        Operator.Word:          'bold',
+        Name.Tag:               'bold #000080',
+        Name.Attribute:         '#FF0000',
+
+        Generic.Heading:        '#999999',
+        Generic.Subheading:     '#aaaaaa',
+        Generic.Deleted:        'bg:#ffdddd #000000',
+        Generic.Inserted:       'bg:#ddffdd #000000',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/default.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/default.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/default.py	(revision 1126)
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.default
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    The default highlighting style.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class DefaultStyle(Style):
+    """
+    The default style (inspired by Emacs 22).
+    """
+
+    background_color = "#f8f8f8"
+    default_style = ""
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "italic #408080",
+        Comment.Preproc:           "noitalic #BC7A00",
+
+        #Keyword:                   "bold #AA22FF",
+        Keyword:                   "bold #008000",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "nobold #B00040",
+
+        Operator:                  "#666666",
+        Operator.Word:             "bold #AA22FF",
+
+        Name.Builtin:              "#008000",
+        Name.Function:             "#0000FF",
+        Name.Class:                "bold #0000FF",
+        Name.Namespace:            "bold #0000FF",
+        Name.Exception:            "bold #D2413A",
+        Name.Variable:             "#19177C",
+        Name.Constant:             "#880000",
+        Name.Label:                "#A0A000",
+        Name.Entity:               "bold #999999",
+        Name.Attribute:            "#7D9029",
+        Name.Tag:                  "bold #008000",
+        Name.Decorator:            "#AA22FF",
+
+        String:                    "#BA2121",
+        String.Doc:                "italic",
+        String.Interpol:           "bold #BB6688",
+        String.Escape:             "bold #BB6622",
+        String.Regex:              "#BB6688",
+        #String.Symbol:             "#B8860B",
+        String.Symbol:             "#19177C",
+        String.Other:              "#008000",
+        Number:                    "#666666",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold #000080",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/pastie.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/pastie.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/pastie.py	(revision 1126)
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.pastie
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the `pastie`_ default style.
+
+    .. _pastie: http://pastie.caboo.se/
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class PastieStyle(Style):
+    """
+    Style similar to the pastie default style.
+    """
+
+    default_style = ''
+
+    styles = {
+        Whitespace:             '#bbbbbb',
+        Comment:                '#888888',
+        Comment.Preproc:        'bold #cc0000',
+        Comment.Special:        'bg:#fff0f0 bold #cc0000',
+
+        String:                 'bg:#fff0f0 #dd2200',
+        String.Regex:           'bg:#fff0ff #008800',
+        String.Other:           'bg:#f0fff0 #22bb22',
+        String.Symbol:          '#aa6600',
+        String.Interpol:        '#3333bb',
+        String.Escape:          '#0044dd',
+
+        Operator.Word:          '#008800',
+
+        Keyword:                'bold #008800',
+        Keyword.Pseudo:         'nobold',
+        Keyword.Type:           '#888888',
+
+        Name.Class:             'bold #bb0066',
+        Name.Exception:         'bold #bb0066',
+        Name.Function:          'bold #0066bb',
+        Name.Property:          'bold #336699',
+        Name.Namespace:         'bold #bb0066',
+        Name.Builtin:           '#003388',
+        Name.Variable:          '#336699',
+        Name.Variable.Class:    '#336699',
+        Name.Variable.Instance: '#3333bb',
+        Name.Variable.Global:   '#dd7700',
+        Name.Constant:          'bold #003366',
+        Name.Tag:               'bold #bb0066',
+        Name.Attribute:         '#336699',
+        Name.Decorator:         '#555555',
+        Name.Label:             'italic #336699',
+
+        Number:                 'bold #0000DD',
+
+        Generic.Heading:        '#333',
+        Generic.Subheading:     '#666',
+        Generic.Deleted:        'bg:#ffdddd #000000',
+        Generic.Inserted:       'bg:#ddffdd #000000',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/paraiso_light.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/paraiso_light.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/paraiso_light.py	(revision 1126)
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.paraiso_light
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Paraíso (Light) by Jan T. Sott
+
+    Pygments template by Jan T. Sott (https://github.com/idleberg)
+    Created with Base16 Builder by Chris Kempson
+    (https://github.com/chriskempson/base16-builder).
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Text, \
+    Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+BACKGROUND = "#e7e9db"
+CURRENT_LINE = "#b9b6b0"
+SELECTION = "#a39e9b"
+FOREGROUND = "#2f1e2e"
+COMMENT = "#8d8687"
+RED = "#ef6155"
+ORANGE = "#f99b15"
+YELLOW = "#fec418"
+GREEN = "#48b685"
+AQUA = "#5bc4bf"
+BLUE = "#06b6ef"
+PURPLE = "#815ba4"
+
+
+class ParaisoLightStyle(Style):
+
+    default_style = ''
+
+    background_color = BACKGROUND
+    highlight_color = SELECTION
+
+    background_color = BACKGROUND
+    highlight_color = SELECTION
+
+    styles = {
+        # No corresponding class for the following:
+        Text:                      FOREGROUND,  # class:  ''
+        Whitespace:                "",          # class: 'w'
+        Error:                     RED,         # class: 'err'
+        Other:                     "",          # class 'x'
+
+        Comment:                   COMMENT,   # class: 'c'
+        Comment.Multiline:         "",        # class: 'cm'
+        Comment.Preproc:           "",        # class: 'cp'
+        Comment.Single:            "",        # class: 'c1'
+        Comment.Special:           "",        # class: 'cs'
+
+        Keyword:                   PURPLE,    # class: 'k'
+        Keyword.Constant:          "",        # class: 'kc'
+        Keyword.Declaration:       "",        # class: 'kd'
+        Keyword.Namespace:         AQUA,      # class: 'kn'
+        Keyword.Pseudo:            "",        # class: 'kp'
+        Keyword.Reserved:          "",        # class: 'kr'
+        Keyword.Type:              YELLOW,    # class: 'kt'
+
+        Operator:                  AQUA,      # class: 'o'
+        Operator.Word:             "",        # class: 'ow' - like keywords
+
+        Punctuation:               FOREGROUND,  # class: 'p'
+
+        Name:                      FOREGROUND,  # class: 'n'
+        Name.Attribute:            BLUE,        # class: 'na' - to be revised
+        Name.Builtin:              "",          # class: 'nb'
+        Name.Builtin.Pseudo:       "",          # class: 'bp'
+        Name.Class:                YELLOW,      # class: 'nc' - to be revised
+        Name.Constant:             RED,         # class: 'no' - to be revised
+        Name.Decorator:            AQUA,        # class: 'nd' - to be revised
+        Name.Entity:               "",          # class: 'ni'
+        Name.Exception:            RED,         # class: 'ne'
+        Name.Function:             BLUE,        # class: 'nf'
+        Name.Property:             "",          # class: 'py'
+        Name.Label:                "",          # class: 'nl'
+        Name.Namespace:            YELLOW,      # class: 'nn' - to be revised
+        Name.Other:                BLUE,        # class: 'nx'
+        Name.Tag:                  AQUA,        # class: 'nt' - like a keyword
+        Name.Variable:             RED,         # class: 'nv' - to be revised
+        Name.Variable.Class:       "",          # class: 'vc' - to be revised
+        Name.Variable.Global:      "",          # class: 'vg' - to be revised
+        Name.Variable.Instance:    "",          # class: 'vi' - to be revised
+
+        Number:                    ORANGE,    # class: 'm'
+        Number.Float:              "",        # class: 'mf'
+        Number.Hex:                "",        # class: 'mh'
+        Number.Integer:            "",        # class: 'mi'
+        Number.Integer.Long:       "",        # class: 'il'
+        Number.Oct:                "",        # class: 'mo'
+
+        Literal:                   ORANGE,    # class: 'l'
+        Literal.Date:              GREEN,     # class: 'ld'
+
+        String:                    GREEN,       # class: 's'
+        String.Backtick:           "",          # class: 'sb'
+        String.Char:               FOREGROUND,  # class: 'sc'
+        String.Doc:                COMMENT,     # class: 'sd' - like a comment
+        String.Double:             "",          # class: 's2'
+        String.Escape:             ORANGE,      # class: 'se'
+        String.Heredoc:            "",          # class: 'sh'
+        String.Interpol:           ORANGE,      # class: 'si'
+        String.Other:              "",          # class: 'sx'
+        String.Regex:              "",          # class: 'sr'
+        String.Single:             "",          # class: 's1'
+        String.Symbol:             "",          # class: 'ss'
+
+        Generic:                   "",                    # class: 'g'
+        Generic.Deleted:           RED,                   # class: 'gd',
+        Generic.Emph:              "italic",              # class: 'ge'
+        Generic.Error:             "",                    # class: 'gr'
+        Generic.Heading:           "bold " + FOREGROUND,  # class: 'gh'
+        Generic.Inserted:          GREEN,                 # class: 'gi'
+        Generic.Output:            "",                    # class: 'go'
+        Generic.Prompt:            "bold " + COMMENT,     # class: 'gp'
+        Generic.Strong:            "bold",                # class: 'gs'
+        Generic.Subheading:        "bold " + AQUA,        # class: 'gu'
+        Generic.Traceback:         "",                    # class: 'gt'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/sas.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/sas.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/sas.py	(revision 1126)
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.sas
+    ~~~~~~~~~~~~~~~~~~~
+
+    Style inspired by SAS' enhanced program editor. Note This is not
+    meant to be a complete style. It's merely meant to mimic SAS'
+    program editor syntax highlighting.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Other, Whitespace, Generic
+
+
+class SasStyle(Style):
+    """
+    Style inspired by SAS' enhanced program editor. Note This is not
+    meant to be a complete style. It's merely meant to mimic SAS'
+    program editor syntax highlighting.
+    """
+
+    default_style = ''
+
+    styles = {
+        Whitespace:            '#bbbbbb',
+        Comment:               'italic #008800',
+        String:                '#800080',
+        Number:                'bold #2e8b57',
+        Other:                 'bg:#ffffe0',
+        Keyword:               '#2c2cff',
+        Keyword.Reserved:      'bold #353580',
+        Keyword.Constant:      'bold',
+        Name.Builtin:          '#2c2cff',
+        Name.Function:         'bold italic',
+        Name.Variable:         'bold #2c2cff',
+        Generic:               '#2c2cff',
+        Generic.Emph:          '#008800',
+        Generic.Error:         '#d30202',
+        Error:                 'bg:#e3d2d2 #a61717'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/vs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/vs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/vs.py	(revision 1126)
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.vs
+    ~~~~~~~~~~~~~~~~~~
+
+    Simple style with MS Visual Studio colors.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Operator, Generic
+
+
+class VisualStudioStyle(Style):
+
+    background_color = "#ffffff"
+    default_style = ""
+
+    styles = {
+        Comment:                   "#008000",
+        Comment.Preproc:           "#0000ff",
+        Keyword:                   "#0000ff",
+        Operator.Word:             "#0000ff",
+        Keyword.Type:              "#2b91af",
+        Name.Class:                "#2b91af",
+        String:                    "#a31515",
+
+        Generic.Heading:           "bold",
+        Generic.Subheading:        "bold",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/perldoc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/perldoc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/perldoc.py	(revision 1126)
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.perldoc
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the style used in the `perldoc`_ code blocks.
+
+    .. _perldoc: http://perldoc.perl.org/
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class PerldocStyle(Style):
+    """
+    Style similar to the style used in the perldoc code blocks.
+    """
+
+    background_color = '#eeeedd'
+    default_style = ''
+
+    styles = {
+        Whitespace:             '#bbbbbb',
+        Comment:                '#228B22',
+        Comment.Preproc:        '#1e889b',
+        Comment.Special:        '#8B008B bold',
+
+        String:                 '#CD5555',
+        String.Heredoc:         '#1c7e71 italic',
+        String.Regex:           '#B452CD',
+        String.Other:           '#cb6c20',
+        String.Regex:           '#1c7e71',
+
+        Number:                 '#B452CD',
+
+        Operator.Word:          '#8B008B',
+
+        Keyword:                '#8B008B bold',
+        Keyword.Type:           '#00688B',
+
+        Name.Class:             '#008b45 bold',
+        Name.Exception:         '#008b45 bold',
+        Name.Function:          '#008b45',
+        Name.Namespace:         '#008b45 underline',
+        Name.Variable:          '#00688B',
+        Name.Constant:          '#00688B',
+        Name.Decorator:         '#707a7c',
+        Name.Tag:               '#8B008B bold',
+        Name.Attribute:         '#658b00',
+        Name.Builtin:           '#658b00',
+
+        Generic.Heading:        'bold #000080',
+        Generic.Subheading:     'bold #800080',
+        Generic.Deleted:        '#aa0000',
+        Generic.Inserted:       '#00aa00',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/trac.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/trac.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/trac.py	(revision 1126)
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.trac
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Port of the default trac highlighter design.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class TracStyle(Style):
+    """
+    Port of the default trac highlighter design.
+    """
+
+    default_style = ''
+
+    styles = {
+        Whitespace:             '#bbbbbb',
+        Comment:                'italic #999988',
+        Comment.Preproc:        'bold noitalic #999999',
+        Comment.Special:        'bold #999999',
+
+        Operator:               'bold',
+
+        String:                 '#bb8844',
+        String.Regex:           '#808000',
+
+        Number:                 '#009999',
+
+        Keyword:                'bold',
+        Keyword.Type:           '#445588',
+
+        Name.Builtin:           '#999999',
+        Name.Function:          'bold #990000',
+        Name.Class:             'bold #445588',
+        Name.Exception:         'bold #990000',
+        Name.Namespace:         '#555555',
+        Name.Variable:          '#008080',
+        Name.Constant:          '#008080',
+        Name.Tag:               '#000080',
+        Name.Attribute:         '#008080',
+        Name.Entity:            '#800080',
+
+        Generic.Heading:        '#999999',
+        Generic.Subheading:     '#aaaaaa',
+        Generic.Deleted:        'bg:#ffdddd #000000',
+        Generic.Inserted:       'bg:#ddffdd #000000',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/lovelace.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/lovelace.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/lovelace.py	(revision 1126)
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.lovelace
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lovelace by Miikka Salminen
+
+    Pygments style by Miikka Salminen (https://github.com/miikkas)
+    A desaturated, somewhat subdued style created for the Lovelace interactive
+    learning environment.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Punctuation, Generic, Whitespace
+
+
+class LovelaceStyle(Style):
+    """
+    The style used in Lovelace interactive learning environment. Tries to avoid
+    the "angry fruit salad" effect with desaturated and dim colours.
+    """
+    _KW_BLUE =       '#2838b0'
+    _NAME_GREEN =    '#388038'
+    _DOC_ORANGE =    '#b85820'
+    _OW_PURPLE =     '#a848a8'
+    _FUN_BROWN =     '#785840'
+    _STR_RED =       '#b83838'
+    _CLS_CYAN =      '#287088'
+    _ESCAPE_LIME =   '#709030'
+    _LABEL_CYAN =    '#289870'
+    _EXCEPT_YELLOW = '#908828'
+
+    default_style =  '#222222'
+
+    styles = {
+        Whitespace:          '#a89028',
+        Comment:             'italic #888888',
+        Comment.Hashbang:    _CLS_CYAN,
+        Comment.Multiline:   '#888888',
+        Comment.Preproc:     'noitalic '+_LABEL_CYAN,
+
+        Keyword:             _KW_BLUE,
+        Keyword.Constant:    'italic #444444',
+        Keyword.Declaration: 'italic',
+        Keyword.Type:        'italic',
+
+        Operator:            '#666666',
+        Operator.Word:       _OW_PURPLE,
+
+        Punctuation:         '#888888',
+
+        Name.Attribute:      _NAME_GREEN,
+        Name.Builtin:        _NAME_GREEN,
+        Name.Builtin.Pseudo: 'italic',
+        Name.Class:          _CLS_CYAN,
+        Name.Constant:       _DOC_ORANGE,
+        Name.Decorator:      _CLS_CYAN,
+        Name.Entity:         _ESCAPE_LIME,
+        Name.Exception:      _EXCEPT_YELLOW,
+        Name.Function:       _FUN_BROWN,
+        Name.Function.Magic: _DOC_ORANGE,
+        Name.Label:          _LABEL_CYAN,
+        Name.Namespace:      _LABEL_CYAN,
+        Name.Tag:            _KW_BLUE,
+        Name.Variable:       '#b04040',
+        Name.Variable.Global:_EXCEPT_YELLOW,
+        Name.Variable.Magic: _DOC_ORANGE,
+
+        String:              _STR_RED,
+        String.Affix:        '#444444',
+        String.Char:         _OW_PURPLE,
+        String.Delimiter:    _DOC_ORANGE,
+        String.Doc:          'italic '+_DOC_ORANGE,
+        String.Escape:       _ESCAPE_LIME,
+        String.Interpol:     'underline',
+        String.Other:        _OW_PURPLE,
+        String.Regex:        _OW_PURPLE,
+
+        Number:              '#444444',
+
+        Generic.Deleted:     '#c02828',
+        Generic.Emph:        'italic',
+        Generic.Error:       '#c02828',
+        Generic.Heading:     '#666666',
+        Generic.Subheading:  '#444444',
+        Generic.Inserted:    _NAME_GREEN,
+        Generic.Output:      '#666666',
+        Generic.Prompt:      '#444444',
+        Generic.Strong:      'bold',
+        Generic.Traceback:   _KW_BLUE,
+
+        Error:               'bg:'+_OW_PURPLE,
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/monokai.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/monokai.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/monokai.py	(revision 1126)
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.monokai
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Mimic the Monokai color scheme. Based on tango.py.
+
+    http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Text, \
+     Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+class MonokaiStyle(Style):
+    """
+    This style mimics the Monokai color scheme.
+    """
+
+    background_color = "#272822"
+    highlight_color = "#49483e"
+
+    styles = {
+        # No corresponding class for the following:
+        Text:                      "#f8f8f2", # class:  ''
+        Whitespace:                "",        # class: 'w'
+        Error:                     "#960050 bg:#1e0010", # class: 'err'
+        Other:                     "",        # class 'x'
+
+        Comment:                   "#75715e", # class: 'c'
+        Comment.Multiline:         "",        # class: 'cm'
+        Comment.Preproc:           "",        # class: 'cp'
+        Comment.Single:            "",        # class: 'c1'
+        Comment.Special:           "",        # class: 'cs'
+
+        Keyword:                   "#66d9ef", # class: 'k'
+        Keyword.Constant:          "",        # class: 'kc'
+        Keyword.Declaration:       "",        # class: 'kd'
+        Keyword.Namespace:         "#f92672", # class: 'kn'
+        Keyword.Pseudo:            "",        # class: 'kp'
+        Keyword.Reserved:          "",        # class: 'kr'
+        Keyword.Type:              "",        # class: 'kt'
+
+        Operator:                  "#f92672", # class: 'o'
+        Operator.Word:             "",        # class: 'ow' - like keywords
+
+        Punctuation:               "#f8f8f2", # class: 'p'
+
+        Name:                      "#f8f8f2", # class: 'n'
+        Name.Attribute:            "#a6e22e", # class: 'na' - to be revised
+        Name.Builtin:              "",        # class: 'nb'
+        Name.Builtin.Pseudo:       "",        # class: 'bp'
+        Name.Class:                "#a6e22e", # class: 'nc' - to be revised
+        Name.Constant:             "#66d9ef", # class: 'no' - to be revised
+        Name.Decorator:            "#a6e22e", # class: 'nd' - to be revised
+        Name.Entity:               "",        # class: 'ni'
+        Name.Exception:            "#a6e22e", # class: 'ne'
+        Name.Function:             "#a6e22e", # class: 'nf'
+        Name.Property:             "",        # class: 'py'
+        Name.Label:                "",        # class: 'nl'
+        Name.Namespace:            "",        # class: 'nn' - to be revised
+        Name.Other:                "#a6e22e", # class: 'nx'
+        Name.Tag:                  "#f92672", # class: 'nt' - like a keyword
+        Name.Variable:             "",        # class: 'nv' - to be revised
+        Name.Variable.Class:       "",        # class: 'vc' - to be revised
+        Name.Variable.Global:      "",        # class: 'vg' - to be revised
+        Name.Variable.Instance:    "",        # class: 'vi' - to be revised
+
+        Number:                    "#ae81ff", # class: 'm'
+        Number.Float:              "",        # class: 'mf'
+        Number.Hex:                "",        # class: 'mh'
+        Number.Integer:            "",        # class: 'mi'
+        Number.Integer.Long:       "",        # class: 'il'
+        Number.Oct:                "",        # class: 'mo'
+
+        Literal:                   "#ae81ff", # class: 'l'
+        Literal.Date:              "#e6db74", # class: 'ld'
+
+        String:                    "#e6db74", # class: 's'
+        String.Backtick:           "",        # class: 'sb'
+        String.Char:               "",        # class: 'sc'
+        String.Doc:                "",        # class: 'sd' - like a comment
+        String.Double:             "",        # class: 's2'
+        String.Escape:             "#ae81ff", # class: 'se'
+        String.Heredoc:            "",        # class: 'sh'
+        String.Interpol:           "",        # class: 'si'
+        String.Other:              "",        # class: 'sx'
+        String.Regex:              "",        # class: 'sr'
+        String.Single:             "",        # class: 's1'
+        String.Symbol:             "",        # class: 'ss'
+
+        Generic:                   "",        # class: 'g'
+        Generic.Deleted:           "#f92672", # class: 'gd',
+        Generic.Emph:              "italic",  # class: 'ge'
+        Generic.Error:             "",        # class: 'gr'
+        Generic.Heading:           "",        # class: 'gh'
+        Generic.Inserted:          "#a6e22e", # class: 'gi'
+        Generic.Output:            "",        # class: 'go'
+        Generic.Prompt:            "",        # class: 'gp'
+        Generic.Strong:            "bold",    # class: 'gs'
+        Generic.Subheading:        "#75715e", # class: 'gu'
+        Generic.Traceback:         "",        # class: 'gt'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/algol.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/algol.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/algol.py	(revision 1126)
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.algol
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Algol publication style.
+
+    This style renders source code for publication of algorithms in
+    scientific papers and academic texts, where its format is frequently used.
+
+    It is based on the style of the revised Algol-60 language report[1].
+
+    o  No colours, only black, white and shades of grey are used.
+    o  Keywords are rendered in lowercase underline boldface.
+    o  Builtins are rendered in lowercase boldface italic.
+    o  Docstrings and pragmas are rendered in dark grey boldface.
+    o  Library identifiers are rendered in dark grey boldface italic.
+    o  Comments are rendered in grey italic.
+
+    To render keywords without underlining, refer to the `Algol_Nu` style.
+
+    For lowercase conversion of keywords and builtins in languages where
+    these are not or might not be lowercase, a supporting lexer is required.
+    The Algol and Modula-2 lexers automatically convert to lowercase whenever
+    this style is selected.
+
+    [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>`
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Operator
+
+
+class AlgolStyle(Style):
+
+    background_color = "#ffffff"
+    default_style = ""
+
+    styles = {
+        Comment:                   "italic #888",
+        Comment.Preproc:           "bold noitalic #888",
+        Comment.Special:           "bold noitalic #888",
+
+        Keyword:                   "underline bold",
+        Keyword.Declaration:       "italic",
+
+        Name.Builtin:              "bold italic",
+        Name.Builtin.Pseudo:       "bold italic",
+        Name.Namespace:            "bold italic #666",
+        Name.Class:                "bold italic #666",
+        Name.Function:             "bold italic #666",
+        Name.Variable:             "bold italic #666",
+        Name.Constant:             "bold italic #666",
+
+        Operator.Word:             "bold",
+
+        String:                    "italic #666",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/igor.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/igor.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/igor.py	(revision 1126)
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.igor
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Igor Pro default style.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String
+
+
+class IgorStyle(Style):
+    """
+    Pygments version of the official colors for Igor Pro procedures.
+    """
+    default_style = ""
+
+    styles = {
+        Comment:                'italic #FF0000',
+        Keyword:                '#0000FF',
+        Name.Function:          '#C34E00',
+        Name.Decorator:         '#CC00A3',
+        Name.Class:             '#007575',
+        String:                 '#009C00'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/arduino.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/arduino.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/arduino.py	(revision 1126)
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.arduino
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Arduino® Syntax highlighting style.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class ArduinoStyle(Style):
+    """
+    The Arduino® language style. This style is designed to highlight the
+    Arduino source code, so exepect the best results with it.
+    """
+
+    background_color = "#ffffff"
+    default_style = ""
+
+    styles = {
+        Whitespace:                "",        # class: 'w'
+        Error:                     "#a61717", # class: 'err'
+
+        Comment:                   "#95a5a6", # class: 'c'
+        Comment.Multiline:         "",        # class: 'cm'
+        Comment.Preproc:           "#728E00", # class: 'cp'
+        Comment.Single:            "",        # class: 'c1'
+        Comment.Special:           "",        # class: 'cs'
+
+        Keyword:                   "#728E00", # class: 'k'
+        Keyword.Constant:          "#00979D", # class: 'kc'
+        Keyword.Declaration:       "",        # class: 'kd'
+        Keyword.Namespace:         "",        # class: 'kn'
+        Keyword.Pseudo:            "#00979D", # class: 'kp'
+        Keyword.Reserved:          "#00979D", # class: 'kr'
+        Keyword.Type:              "#00979D", # class: 'kt'
+
+        Operator:                  "#728E00", # class: 'o'
+        Operator.Word:             "",        # class: 'ow'
+
+        Name:                      "#434f54", # class: 'n'
+        Name.Attribute:            "",        # class: 'na'
+        Name.Builtin:              "#728E00", # class: 'nb'
+        Name.Builtin.Pseudo:       "",        # class: 'bp'
+        Name.Class:                "",        # class: 'nc'
+        Name.Constant:             "",        # class: 'no'
+        Name.Decorator:            "",        # class: 'nd'
+        Name.Entity:               "",        # class: 'ni'
+        Name.Exception:            "",        # class: 'ne'
+        Name.Function:             "#D35400", # class: 'nf'
+        Name.Property:             "",        # class: 'py'
+        Name.Label:                "",        # class: 'nl'
+        Name.Namespace:            "",        # class: 'nn'
+        Name.Other:                "#728E00", # class: 'nx'
+        Name.Tag:                  "",        # class: 'nt'
+        Name.Variable:             "",        # class: 'nv'
+        Name.Variable.Class:       "",        # class: 'vc'
+        Name.Variable.Global:      "",        # class: 'vg'
+        Name.Variable.Instance:    "",        # class: 'vi'
+
+        Number:                    "#8A7B52", # class: 'm'
+        Number.Float:              "",        # class: 'mf'
+        Number.Hex:                "",        # class: 'mh'
+        Number.Integer:            "",        # class: 'mi'
+        Number.Integer.Long:       "",        # class: 'il'
+        Number.Oct:                "",        # class: 'mo'
+
+        String:                    "#7F8C8D", # class: 's'
+        String.Backtick:           "",        # class: 'sb'
+        String.Char:               "",        # class: 'sc'
+        String.Doc:                "",        # class: 'sd'
+        String.Double:             "",        # class: 's2'
+        String.Escape:             "",        # class: 'se'
+        String.Heredoc:            "",        # class: 'sh'
+        String.Interpol:           "",        # class: 'si'
+        String.Other:              "",        # class: 'sx'
+        String.Regex:              "",        # class: 'sr'
+        String.Single:             "",        # class: 's1'
+        String.Symbol:             "",        # class: 'ss'
+
+        Generic:                   "",        # class: 'g'
+        Generic.Deleted:           "",        # class: 'gd',
+        Generic.Emph:              "",        # class: 'ge'
+        Generic.Error:             "",        # class: 'gr'
+        Generic.Heading:           "",        # class: 'gh'
+        Generic.Inserted:          "",        # class: 'gi'
+        Generic.Output:            "",        # class: 'go'
+        Generic.Prompt:            "",        # class: 'gp'
+        Generic.Strong:            "",        # class: 'gs'
+        Generic.Subheading:        "",        # class: 'gu'
+        Generic.Traceback:         "",        # class: 'gt'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/manni.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/manni.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/manni.py	(revision 1126)
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.manni
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    A colorful style, inspired by the terminal highlighting style.
+
+    This is a port of the style used in the `php port`_ of pygments
+    by Manni. The style is called 'default' there.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class ManniStyle(Style):
+    """
+    A colorful style, inspired by the terminal highlighting style.
+    """
+
+    background_color = '#f0f3f3'
+
+    styles = {
+        Whitespace:         '#bbbbbb',
+        Comment:            'italic #0099FF',
+        Comment.Preproc:    'noitalic #009999',
+        Comment.Special:    'bold',
+
+        Keyword:            'bold #006699',
+        Keyword.Pseudo:     'nobold',
+        Keyword.Type:       '#007788',
+
+        Operator:           '#555555',
+        Operator.Word:      'bold #000000',
+
+        Name.Builtin:       '#336666',
+        Name.Function:      '#CC00FF',
+        Name.Class:         'bold #00AA88',
+        Name.Namespace:     'bold #00CCFF',
+        Name.Exception:     'bold #CC0000',
+        Name.Variable:      '#003333',
+        Name.Constant:      '#336600',
+        Name.Label:         '#9999FF',
+        Name.Entity:        'bold #999999',
+        Name.Attribute:     '#330099',
+        Name.Tag:           'bold #330099',
+        Name.Decorator:     '#9999FF',
+
+        String:             '#CC3300',
+        String.Doc:         'italic',
+        String.Interpol:    '#AA0000',
+        String.Escape:      'bold #CC3300',
+        String.Regex:       '#33AAAA',
+        String.Symbol:      '#FFCC33',
+        String.Other:       '#CC3300',
+
+        Number:             '#FF6600',
+
+        Generic.Heading:    'bold #003300',
+        Generic.Subheading: 'bold #003300',
+        Generic.Deleted:    'border:#CC0000 bg:#FFCCCC',
+        Generic.Inserted:   'border:#00CC00 bg:#CCFFCC',
+        Generic.Error:      '#FF0000',
+        Generic.Emph:       'italic',
+        Generic.Strong:     'bold',
+        Generic.Prompt:     'bold #000099',
+        Generic.Output:     '#AAAAAA',
+        Generic.Traceback:  '#99CC66',
+
+        Error:              'bg:#FFAAAA #AA0000'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/xcode.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/xcode.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/xcode.py	(revision 1126)
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.xcode
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the `Xcode` default theme.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Literal
+
+
+class XcodeStyle(Style):
+    """
+    Style similar to the Xcode default colouring theme.
+    """
+
+    default_style = ''
+
+    styles = {
+        Comment:                '#177500',
+        Comment.Preproc:        '#633820',
+
+        String:                 '#C41A16',
+        String.Char:            '#2300CE',
+
+        Operator:               '#000000',
+
+        Keyword:                '#A90D91',
+
+        Name:                   '#000000',
+        Name.Attribute:         '#836C28',
+        Name.Class:             '#3F6E75',
+        Name.Function:          '#000000',
+        Name.Builtin:           '#A90D91',
+        # In Obj-C code this token is used to colour Cocoa types
+        Name.Builtin.Pseudo:    '#5B269A',
+        Name.Variable:          '#000000',
+        Name.Tag:               '#000000',
+        Name.Decorator:         '#000000',
+        # Workaround for a BUG here: lexer treats multiline method signatres as labels
+        Name.Label:             '#000000',
+
+        Literal:                '#1C01CE',
+        Number:                 '#1C01CE',
+        Error:                  '#000000',
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/abap.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/abap.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/abap.py	(revision 1126)
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.abap
+    ~~~~~~~~~~~~~~~~~~~~
+
+    ABAP workbench like style.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator
+
+
+class AbapStyle(Style):
+    default_style = ""
+    styles = {
+        Comment:                'italic #888',
+        Comment.Special:        '#888',
+        Keyword:                '#00f',
+        Operator.Word:          '#00f',
+        Name:                   '#000',
+        Number:                 '#3af',
+        String:                 '#5a2',
+
+        Error:                  '#F00',
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/rrt.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/rrt.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/rrt.py	(revision 1126)
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.rrt
+    ~~~~~~~~~~~~~~~~~~~
+
+    pygments "rrt" theme, based on Zap and Emacs defaults.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Comment, Name, Keyword, String
+
+
+class RrtStyle(Style):
+    """
+    Minimalistic "rrt" theme, based on Zap and Emacs defaults.
+    """
+
+    background_color = '#000000'
+    highlight_color = '#0000ff'
+
+    styles = {
+        Comment:            '#00ff00',
+        Name.Function:      '#ffff00',
+        Name.Variable:      '#eedd82',
+        Name.Constant:      '#7fffd4',
+        Keyword:            '#ff0000',
+        Comment.Preproc:    '#e5e5e5',
+        String:             '#87ceeb',
+        Keyword.Type:       '#ee82ee',
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/autumn.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/autumn.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/autumn.py	(revision 1126)
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.autumn
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    A colorful style, inspired by the terminal highlighting style.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class AutumnStyle(Style):
+    """
+    A colorful style, inspired by the terminal highlighting style.
+    """
+
+    default_style = ""
+
+    styles = {
+        Whitespace:                 '#bbbbbb',
+
+        Comment:                    'italic #aaaaaa',
+        Comment.Preproc:            'noitalic #4c8317',
+        Comment.Special:            'italic #0000aa',
+
+        Keyword:                    '#0000aa',
+        Keyword.Type:               '#00aaaa',
+
+        Operator.Word:              '#0000aa',
+
+        Name.Builtin:               '#00aaaa',
+        Name.Function:              '#00aa00',
+        Name.Class:                 'underline #00aa00',
+        Name.Namespace:             'underline #00aaaa',
+        Name.Variable:              '#aa0000',
+        Name.Constant:              '#aa0000',
+        Name.Entity:                'bold #800',
+        Name.Attribute:             '#1e90ff',
+        Name.Tag:                   'bold #1e90ff',
+        Name.Decorator:             '#888888',
+
+        String:                     '#aa5500',
+        String.Symbol:              '#0000aa',
+        String.Regex:               '#009999',
+
+        Number:                     '#009999',
+
+        Generic.Heading:            'bold #000080',
+        Generic.Subheading:         'bold #800080',
+        Generic.Deleted:            '#aa0000',
+        Generic.Inserted:           '#00aa00',
+        Generic.Error:              '#aa0000',
+        Generic.Emph:               'italic',
+        Generic.Strong:             'bold',
+        Generic.Prompt:             '#555555',
+        Generic.Output:             '#888888',
+        Generic.Traceback:          '#aa0000',
+
+        Error:                      '#F00 bg:#FAA'
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/friendly.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/friendly.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/styles/friendly.py	(revision 1126)
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.styles.friendly
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A modern style based on the VIM pyte theme.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+class FriendlyStyle(Style):
+    """
+    A modern style based on the VIM pyte theme.
+    """
+
+    background_color = "#f0f0f0"
+    default_style = ""
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "italic #60a0b0",
+        Comment.Preproc:           "noitalic #007020",
+        Comment.Special:           "noitalic bg:#fff0f0",
+
+        Keyword:                   "bold #007020",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "nobold #902000",
+
+        Operator:                  "#666666",
+        Operator.Word:             "bold #007020",
+
+        Name.Builtin:              "#007020",
+        Name.Function:             "#06287e",
+        Name.Class:                "bold #0e84b5",
+        Name.Namespace:            "bold #0e84b5",
+        Name.Exception:            "#007020",
+        Name.Variable:             "#bb60d5",
+        Name.Constant:             "#60add5",
+        Name.Label:                "bold #002070",
+        Name.Entity:               "bold #d55537",
+        Name.Attribute:            "#4070a0",
+        Name.Tag:                  "bold #062873",
+        Name.Decorator:            "bold #555555",
+
+        String:                    "#4070a0",
+        String.Doc:                "italic",
+        String.Interpol:           "italic #70a0d0",
+        String.Escape:             "bold #4070a0",
+        String.Regex:              "#235388",
+        String.Symbol:             "#517918",
+        String.Other:              "#c65d09",
+        Number:                    "#40a070",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.Prompt:            "bold #c65d09",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/regexopt.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/regexopt.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/regexopt.py	(revision 1126)
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.regexopt
+    ~~~~~~~~~~~~~~~~~
+
+    An algorithm that generates optimized regexes for matching long lists of
+    literal strings.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from re import escape
+from os.path import commonprefix
+from itertools import groupby
+from operator import itemgetter
+
+CS_ESCAPE = re.compile(r'[\^\\\-\]]')
+FIRST_ELEMENT = itemgetter(0)
+
+
+def make_charset(letters):
+    return '[' + CS_ESCAPE.sub(lambda m: '\\' + m.group(), ''.join(letters)) + ']'
+
+
+def regex_opt_inner(strings, open_paren):
+    """Return a regex that matches any string in the sorted list of strings."""
+    close_paren = open_paren and ')' or ''
+    # print strings, repr(open_paren)
+    if not strings:
+        # print '-> nothing left'
+        return ''
+    first = strings[0]
+    if len(strings) == 1:
+        # print '-> only 1 string'
+        return open_paren + escape(first) + close_paren
+    if not first:
+        # print '-> first string empty'
+        return open_paren + regex_opt_inner(strings[1:], '(?:') \
+            + '?' + close_paren
+    if len(first) == 1:
+        # multiple one-char strings? make a charset
+        oneletter = []
+        rest = []
+        for s in strings:
+            if len(s) == 1:
+                oneletter.append(s)
+            else:
+                rest.append(s)
+        if len(oneletter) > 1:  # do we have more than one oneletter string?
+            if rest:
+                # print '-> 1-character + rest'
+                return open_paren + regex_opt_inner(rest, '') + '|' \
+                    + make_charset(oneletter) + close_paren
+            # print '-> only 1-character'
+            return open_paren + make_charset(oneletter) + close_paren
+    prefix = commonprefix(strings)
+    if prefix:
+        plen = len(prefix)
+        # we have a prefix for all strings
+        # print '-> prefix:', prefix
+        return open_paren + escape(prefix) \
+            + regex_opt_inner([s[plen:] for s in strings], '(?:') \
+            + close_paren
+    # is there a suffix?
+    strings_rev = [s[::-1] for s in strings]
+    suffix = commonprefix(strings_rev)
+    if suffix:
+        slen = len(suffix)
+        # print '-> suffix:', suffix[::-1]
+        return open_paren \
+            + regex_opt_inner(sorted(s[:-slen] for s in strings), '(?:') \
+            + escape(suffix[::-1]) + close_paren
+    # recurse on common 1-string prefixes
+    # print '-> last resort'
+    return open_paren + \
+        '|'.join(regex_opt_inner(list(group[1]), '')
+                 for group in groupby(strings, lambda s: s[0] == first[0])) \
+        + close_paren
+
+
+def regex_opt(strings, prefix='', suffix=''):
+    """Return a compiled regex that matches any string in the given list.
+
+    The strings to match must be literal strings, not regexes.  They will be
+    regex-escaped.
+
+    *prefix* and *suffix* are pre- and appended to the final regex.
+    """
+    strings = sorted(strings)
+    return prefix + regex_opt_inner(strings, '(') + suffix
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/plugin.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/plugin.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/plugin.py	(revision 1126)
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.plugin
+    ~~~~~~~~~~~~~~~
+
+    Pygments setuptools plugin interface. The methods defined
+    here also work if setuptools isn't installed but they just
+    return nothing.
+
+    lexer plugins::
+
+        [pygments.lexers]
+        yourlexer = yourmodule:YourLexer
+
+    formatter plugins::
+
+        [pygments.formatters]
+        yourformatter = yourformatter:YourFormatter
+        /.ext = yourformatter:YourFormatter
+
+    As you can see, you can define extensions for the formatter
+    with a leading slash.
+
+    syntax plugins::
+
+        [pygments.styles]
+        yourstyle = yourstyle:YourStyle
+
+    filter plugin::
+
+        [pygments.filter]
+        yourfilter = yourfilter:YourFilter
+
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+LEXER_ENTRY_POINT = 'pygments.lexers'
+FORMATTER_ENTRY_POINT = 'pygments.formatters'
+STYLE_ENTRY_POINT = 'pygments.styles'
+FILTER_ENTRY_POINT = 'pygments.filters'
+
+def iter_entry_points(group_name):
+    try:
+        import pkg_resources
+    except ImportError:
+        return []
+
+    return pkg_resources.iter_entry_points(group_name)
+
+def find_plugin_lexers():
+    for entrypoint in iter_entry_points(LEXER_ENTRY_POINT):
+        yield entrypoint.load()
+
+
+def find_plugin_formatters():
+    for entrypoint in iter_entry_points(FORMATTER_ENTRY_POINT):
+        yield entrypoint.name, entrypoint.load()
+
+
+def find_plugin_styles():
+    for entrypoint in iter_entry_points(STYLE_ENTRY_POINT):
+        yield entrypoint.name, entrypoint.load()
+
+
+def find_plugin_filters():
+    for entrypoint in iter_entry_points(FILTER_ENTRY_POINT):
+        yield entrypoint.name, entrypoint.load()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/rtf.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/rtf.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/rtf.py	(revision 1126)
@@ -0,0 +1,147 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.rtf
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    A formatter that generates RTF files.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+from pygments.util import get_int_opt, _surrogatepair
+
+
+__all__ = ['RtfFormatter']
+
+
+class RtfFormatter(Formatter):
+    """
+    Format tokens as RTF markup. This formatter automatically outputs full RTF
+    documents with color information and other useful stuff. Perfect for Copy and
+    Paste into Microsoft(R) Word(R) documents.
+
+    Please note that ``encoding`` and ``outencoding`` options are ignored.
+    The RTF format is ASCII natively, but handles unicode characters correctly
+    thanks to escape sequences.
+
+    .. versionadded:: 0.6
+
+    Additional options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `fontface`
+        The used font famliy, for example ``Bitstream Vera Sans``. Defaults to
+        some generic font which is supposed to have fixed width.
+
+    `fontsize`
+        Size of the font used. Size is specified in half points. The
+        default is 24 half-points, giving a size 12 font.
+
+        .. versionadded:: 2.0
+    """
+    name = 'RTF'
+    aliases = ['rtf']
+    filenames = ['*.rtf']
+
+    def __init__(self, **options):
+        r"""
+        Additional options accepted:
+
+        ``fontface``
+            Name of the font used. Could for example be ``'Courier New'``
+            to further specify the default which is ``'\fmodern'``. The RTF
+            specification claims that ``\fmodern`` are "Fixed-pitch serif
+            and sans serif fonts". Hope every RTF implementation thinks
+            the same about modern...
+
+        """
+        Formatter.__init__(self, **options)
+        self.fontface = options.get('fontface') or ''
+        self.fontsize = get_int_opt(options, 'fontsize', 0)
+
+    def _escape(self, text):
+        return text.replace(u'\\', u'\\\\') \
+                   .replace(u'{', u'\\{') \
+                   .replace(u'}', u'\\}')
+
+    def _escape_text(self, text):
+        # empty strings, should give a small performance improvment
+        if not text:
+            return u''
+
+        # escape text
+        text = self._escape(text)
+
+        buf = []
+        for c in text:
+            cn = ord(c)
+            if cn < (2**7):
+                # ASCII character
+                buf.append(str(c))
+            elif (2**7) <= cn < (2**16):
+                # single unicode escape sequence
+                buf.append(u'{\\u%d}' % cn)
+            elif (2**16) <= cn:
+                # RTF limits unicode to 16 bits.
+                # Force surrogate pairs
+                buf.append(u'{\\u%d}{\\u%d}' % _surrogatepair(cn))
+
+        return u''.join(buf).replace(u'\n', u'\\par\n')
+
+    def format_unencoded(self, tokensource, outfile):
+        # rtf 1.8 header
+        outfile.write(u'{\\rtf1\\ansi\\uc0\\deff0'
+                      u'{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}'
+                      u'{\\colortbl;' % (self.fontface and
+                                         u' ' + self._escape(self.fontface) or
+                                         u''))
+
+        # convert colors and save them in a mapping to access them later.
+        color_mapping = {}
+        offset = 1
+        for _, style in self.style:
+            for color in style['color'], style['bgcolor'], style['border']:
+                if color and color not in color_mapping:
+                    color_mapping[color] = offset
+                    outfile.write(u'\\red%d\\green%d\\blue%d;' % (
+                        int(color[0:2], 16),
+                        int(color[2:4], 16),
+                        int(color[4:6], 16)
+                    ))
+                    offset += 1
+        outfile.write(u'}\\f0 ')
+        if self.fontsize:
+            outfile.write(u'\\fs%d' % (self.fontsize))
+
+        # highlight stream
+        for ttype, value in tokensource:
+            while not self.style.styles_token(ttype) and ttype.parent:
+                ttype = ttype.parent
+            style = self.style.style_for_token(ttype)
+            buf = []
+            if style['bgcolor']:
+                buf.append(u'\\cb%d' % color_mapping[style['bgcolor']])
+            if style['color']:
+                buf.append(u'\\cf%d' % color_mapping[style['color']])
+            if style['bold']:
+                buf.append(u'\\b')
+            if style['italic']:
+                buf.append(u'\\i')
+            if style['underline']:
+                buf.append(u'\\ul')
+            if style['border']:
+                buf.append(u'\\chbrdr\\chcfpat%d' %
+                           color_mapping[style['border']])
+            start = u''.join(buf)
+            if start:
+                outfile.write(u'{%s ' % start)
+            outfile.write(self._escape_text(value))
+            if start:
+                outfile.write(u'}')
+
+        outfile.write(u'}')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/terminal.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/terminal.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/terminal.py	(revision 1126)
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.terminal
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for terminal output with ANSI sequences.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import sys
+
+from pygments.formatter import Formatter
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Generic, Token, Whitespace
+from pygments.console import ansiformat
+from pygments.util import get_choice_opt
+
+
+__all__ = ['TerminalFormatter']
+
+
+#: Map token types to a tuple of color values for light and dark
+#: backgrounds.
+TERMINAL_COLORS = {
+    Token:              ('',            ''),
+
+    Whitespace:         ('lightgray',   'darkgray'),
+    Comment:            ('lightgray',   'darkgray'),
+    Comment.Preproc:    ('teal',        'turquoise'),
+    Keyword:            ('darkblue',    'blue'),
+    Keyword.Type:       ('teal',        'turquoise'),
+    Operator.Word:      ('purple',      'fuchsia'),
+    Name.Builtin:       ('teal',        'turquoise'),
+    Name.Function:      ('darkgreen',   'green'),
+    Name.Namespace:     ('_teal_',      '_turquoise_'),
+    Name.Class:         ('_darkgreen_', '_green_'),
+    Name.Exception:     ('teal',        'turquoise'),
+    Name.Decorator:     ('darkgray',    'lightgray'),
+    Name.Variable:      ('darkred',     'red'),
+    Name.Constant:      ('darkred',     'red'),
+    Name.Attribute:     ('teal',        'turquoise'),
+    Name.Tag:           ('blue',        'blue'),
+    String:             ('brown',       'brown'),
+    Number:             ('darkblue',    'blue'),
+
+    Generic.Deleted:    ('red',        'red'),
+    Generic.Inserted:   ('darkgreen',  'green'),
+    Generic.Heading:    ('**',         '**'),
+    Generic.Subheading: ('*purple*',   '*fuchsia*'),
+    Generic.Prompt:     ('**',         '**'),
+    Generic.Error:      ('red',        'red'),
+
+    Error:              ('_red_',      '_red_'),
+}
+
+
+class TerminalFormatter(Formatter):
+    r"""
+    Format tokens with ANSI color sequences, for output in a text console.
+    Color sequences are terminated at newlines, so that paging the output
+    works correctly.
+
+    The `get_style_defs()` method doesn't do anything special since there is
+    no support for common styles.
+
+    Options accepted:
+
+    `bg`
+        Set to ``"light"`` or ``"dark"`` depending on the terminal's background
+        (default: ``"light"``).
+
+    `colorscheme`
+        A dictionary mapping token types to (lightbg, darkbg) color names or
+        ``None`` (default: ``None`` = use builtin colorscheme).
+
+    `linenos`
+        Set to ``True`` to have line numbers on the terminal output as well
+        (default: ``False`` = no line numbers).
+    """
+    name = 'Terminal'
+    aliases = ['terminal', 'console']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.darkbg = get_choice_opt(options, 'bg',
+                                     ['light', 'dark'], 'light') == 'dark'
+        self.colorscheme = options.get('colorscheme', None) or TERMINAL_COLORS
+        self.linenos = options.get('linenos', False)
+        self._lineno = 0
+
+    def format(self, tokensource, outfile):
+        # hack: if the output is a terminal and has an encoding set,
+        # use that to avoid unicode encode problems
+        if not self.encoding and hasattr(outfile, "encoding") and \
+           hasattr(outfile, "isatty") and outfile.isatty() and \
+           sys.version_info < (3,):
+            self.encoding = outfile.encoding
+        return Formatter.format(self, tokensource, outfile)
+
+    def _write_lineno(self, outfile):
+        self._lineno += 1
+        outfile.write("%s%04d: " % (self._lineno != 1 and '\n' or '', self._lineno))
+
+    def _get_color(self, ttype):
+        # self.colorscheme is a dict containing usually generic types, so we
+        # have to walk the tree of dots.  The base Token type must be a key,
+        # even if it's empty string, as in the default above.
+        colors = self.colorscheme.get(ttype)
+        while colors is None:
+            ttype = ttype.parent
+            colors = self.colorscheme.get(ttype)
+        return colors[self.darkbg]
+
+    def format_unencoded(self, tokensource, outfile):
+        if self.linenos:
+            self._write_lineno(outfile)
+
+        for ttype, value in tokensource:
+            color = self._get_color(ttype)
+
+            for line in value.splitlines(True):
+                if color:
+                    outfile.write(ansiformat(color, line.rstrip('\n')))
+                else:
+                    outfile.write(line.rstrip('\n'))
+                if line.endswith('\n'):
+                    if self.linenos:
+                        self._write_lineno(outfile)
+                    else:
+                        outfile.write('\n')
+
+        if self.linenos:
+            outfile.write("\n")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/img.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/img.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/img.py	(revision 1126)
@@ -0,0 +1,600 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.img
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for Pixmap output.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import os
+import sys
+
+from pygments.formatter import Formatter
+from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
+    get_choice_opt, xrange
+
+import subprocess
+
+# Import this carefully
+try:
+    from PIL import Image, ImageDraw, ImageFont
+    pil_available = True
+except ImportError:
+    pil_available = False
+
+try:
+    import _winreg
+except ImportError:
+    try:
+        import winreg as _winreg
+    except ImportError:
+        _winreg = None
+
+__all__ = ['ImageFormatter', 'GifImageFormatter', 'JpgImageFormatter',
+           'BmpImageFormatter']
+
+
+# For some unknown reason every font calls it something different
+STYLES = {
+    'NORMAL':     ['', 'Roman', 'Book', 'Normal', 'Regular', 'Medium'],
+    'ITALIC':     ['Oblique', 'Italic'],
+    'BOLD':       ['Bold'],
+    'BOLDITALIC': ['Bold Oblique', 'Bold Italic'],
+}
+
+# A sane default for modern systems
+DEFAULT_FONT_NAME_NIX = 'Bitstream Vera Sans Mono'
+DEFAULT_FONT_NAME_WIN = 'Courier New'
+DEFAULT_FONT_NAME_MAC = 'Courier New'
+
+
+class PilNotAvailable(ImportError):
+    """When Python imaging library is not available"""
+
+
+class FontNotFound(Exception):
+    """When there are no usable fonts specified"""
+
+
+class FontManager(object):
+    """
+    Manages a set of fonts: normal, italic, bold, etc...
+    """
+
+    def __init__(self, font_name, font_size=14):
+        self.font_name = font_name
+        self.font_size = font_size
+        self.fonts = {}
+        self.encoding = None
+        if sys.platform.startswith('win'):
+            if not font_name:
+                self.font_name = DEFAULT_FONT_NAME_WIN
+            self._create_win()
+        elif sys.platform.startswith('darwin'):
+            if not font_name:
+                self.font_name = DEFAULT_FONT_NAME_MAC
+            self._create_mac()
+        else:
+            if not font_name:
+                self.font_name = DEFAULT_FONT_NAME_NIX
+            self._create_nix()
+
+    def _get_nix_font_path(self, name, style):
+        proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'],
+                                stdout=subprocess.PIPE, stderr=None)
+        stdout, _ = proc.communicate()
+        if proc.returncode == 0:
+            lines = stdout.splitlines()
+            for line in lines:
+                if line.startswith(b'Fontconfig warning:'):
+                    continue
+                path = line.decode().strip().strip(':')
+                if path:
+                    return path
+            return None
+
+    def _create_nix(self):
+        for name in STYLES['NORMAL']:
+            path = self._get_nix_font_path(self.font_name, name)
+            if path is not None:
+                self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
+                break
+        else:
+            raise FontNotFound('No usable fonts named: "%s"' %
+                               self.font_name)
+        for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
+            for stylename in STYLES[style]:
+                path = self._get_nix_font_path(self.font_name, stylename)
+                if path is not None:
+                    self.fonts[style] = ImageFont.truetype(path, self.font_size)
+                    break
+            else:
+                if style == 'BOLDITALIC':
+                    self.fonts[style] = self.fonts['BOLD']
+                else:
+                    self.fonts[style] = self.fonts['NORMAL']
+
+    def _get_mac_font_path(self, font_map, name, style):
+        return font_map.get((name + ' ' + style).strip().lower())
+
+    def _create_mac(self):
+        font_map = {}
+        for font_dir in (os.path.join(os.getenv("HOME"), 'Library/Fonts/'),
+                         '/Library/Fonts/', '/System/Library/Fonts/'):
+            font_map.update(
+                ((os.path.splitext(f)[0].lower(), os.path.join(font_dir, f))
+                    for f in os.listdir(font_dir) if f.lower().endswith('ttf')))
+
+        for name in STYLES['NORMAL']:
+            path = self._get_mac_font_path(font_map, self.font_name, name)
+            if path is not None:
+                self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
+                break
+        else:
+            raise FontNotFound('No usable fonts named: "%s"' %
+                               self.font_name)
+        for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
+            for stylename in STYLES[style]:
+                path = self._get_mac_font_path(font_map, self.font_name, stylename)
+                if path is not None:
+                    self.fonts[style] = ImageFont.truetype(path, self.font_size)
+                    break
+            else:
+                if style == 'BOLDITALIC':
+                    self.fonts[style] = self.fonts['BOLD']
+                else:
+                    self.fonts[style] = self.fonts['NORMAL']
+
+    def _lookup_win(self, key, basename, styles, fail=False):
+        for suffix in ('', ' (TrueType)'):
+            for style in styles:
+                try:
+                    valname = '%s%s%s' % (basename, style and ' '+style, suffix)
+                    val, _ = _winreg.QueryValueEx(key, valname)
+                    return val
+                except EnvironmentError:
+                    continue
+        else:
+            if fail:
+                raise FontNotFound('Font %s (%s) not found in registry' %
+                                   (basename, styles[0]))
+            return None
+
+    def _create_win(self):
+        try:
+            key = _winreg.OpenKey(
+                _winreg.HKEY_LOCAL_MACHINE,
+                r'Software\Microsoft\Windows NT\CurrentVersion\Fonts')
+        except EnvironmentError:
+            try:
+                key = _winreg.OpenKey(
+                    _winreg.HKEY_LOCAL_MACHINE,
+                    r'Software\Microsoft\Windows\CurrentVersion\Fonts')
+            except EnvironmentError:
+                raise FontNotFound('Can\'t open Windows font registry key')
+        try:
+            path = self._lookup_win(key, self.font_name, STYLES['NORMAL'], True)
+            self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
+            for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
+                path = self._lookup_win(key, self.font_name, STYLES[style])
+                if path:
+                    self.fonts[style] = ImageFont.truetype(path, self.font_size)
+                else:
+                    if style == 'BOLDITALIC':
+                        self.fonts[style] = self.fonts['BOLD']
+                    else:
+                        self.fonts[style] = self.fonts['NORMAL']
+        finally:
+            _winreg.CloseKey(key)
+
+    def get_char_size(self):
+        """
+        Get the character size.
+        """
+        return self.fonts['NORMAL'].getsize('M')
+
+    def get_font(self, bold, oblique):
+        """
+        Get the font based on bold and italic flags.
+        """
+        if bold and oblique:
+            return self.fonts['BOLDITALIC']
+        elif bold:
+            return self.fonts['BOLD']
+        elif oblique:
+            return self.fonts['ITALIC']
+        else:
+            return self.fonts['NORMAL']
+
+
+class ImageFormatter(Formatter):
+    """
+    Create a PNG image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 0.10
+
+    Additional options accepted:
+
+    `image_format`
+        An image format to output to that is recognised by PIL, these include:
+
+        * "PNG" (default)
+        * "JPEG"
+        * "BMP"
+        * "GIF"
+
+    `line_pad`
+        The extra spacing (in pixels) between each line of text.
+
+        Default: 2
+
+    `font_name`
+        The font name to be used as the base font from which others, such as
+        bold and italic fonts will be generated.  This really should be a
+        monospace font to look sane.
+
+        Default: "Bitstream Vera Sans Mono" on Windows, Courier New on \*nix
+
+    `font_size`
+        The font size in points to be used.
+
+        Default: 14
+
+    `image_pad`
+        The padding, in pixels to be used at each edge of the resulting image.
+
+        Default: 10
+
+    `line_numbers`
+        Whether line numbers should be shown: True/False
+
+        Default: True
+
+    `line_number_start`
+        The line number of the first line.
+
+        Default: 1
+
+    `line_number_step`
+        The step used when printing line numbers.
+
+        Default: 1
+
+    `line_number_bg`
+        The background colour (in "#123456" format) of the line number bar, or
+        None to use the style background color.
+
+        Default: "#eed"
+
+    `line_number_fg`
+        The text color of the line numbers (in "#123456"-like format).
+
+        Default: "#886"
+
+    `line_number_chars`
+        The number of columns of line numbers allowable in the line number
+        margin.
+
+        Default: 2
+
+    `line_number_bold`
+        Whether line numbers will be bold: True/False
+
+        Default: False
+
+    `line_number_italic`
+        Whether line numbers will be italicized: True/False
+
+        Default: False
+
+    `line_number_separator`
+        Whether a line will be drawn between the line number area and the
+        source code area: True/False
+
+        Default: True
+
+    `line_number_pad`
+        The horizontal padding (in pixels) between the line number margin, and
+        the source code area.
+
+        Default: 6
+
+    `hl_lines`
+        Specify a list of lines to be highlighted.
+
+        .. versionadded:: 1.2
+
+        Default: empty list
+
+    `hl_color`
+        Specify the color for highlighting lines.
+
+        .. versionadded:: 1.2
+
+        Default: highlight color of the selected style
+    """
+
+    # Required by the pygments mapper
+    name = 'img'
+    aliases = ['img', 'IMG', 'png']
+    filenames = ['*.png']
+
+    unicodeoutput = False
+
+    default_image_format = 'png'
+
+    def __init__(self, **options):
+        """
+        See the class docstring for explanation of options.
+        """
+        if not pil_available:
+            raise PilNotAvailable(
+                'Python Imaging Library is required for this formatter')
+        Formatter.__init__(self, **options)
+        self.encoding = 'latin1'  # let pygments.format() do the right thing
+        # Read the style
+        self.styles = dict(self.style)
+        if self.style.background_color is None:
+            self.background_color = '#fff'
+        else:
+            self.background_color = self.style.background_color
+        # Image options
+        self.image_format = get_choice_opt(
+            options, 'image_format', ['png', 'jpeg', 'gif', 'bmp'],
+            self.default_image_format, normcase=True)
+        self.image_pad = get_int_opt(options, 'image_pad', 10)
+        self.line_pad = get_int_opt(options, 'line_pad', 2)
+        # The fonts
+        fontsize = get_int_opt(options, 'font_size', 14)
+        self.fonts = FontManager(options.get('font_name', ''), fontsize)
+        self.fontw, self.fonth = self.fonts.get_char_size()
+        # Line number options
+        self.line_number_fg = options.get('line_number_fg', '#886')
+        self.line_number_bg = options.get('line_number_bg', '#eed')
+        self.line_number_chars = get_int_opt(options,
+                                             'line_number_chars', 2)
+        self.line_number_bold = get_bool_opt(options,
+                                             'line_number_bold', False)
+        self.line_number_italic = get_bool_opt(options,
+                                               'line_number_italic', False)
+        self.line_number_pad = get_int_opt(options, 'line_number_pad', 6)
+        self.line_numbers = get_bool_opt(options, 'line_numbers', True)
+        self.line_number_separator = get_bool_opt(options,
+                                                  'line_number_separator', True)
+        self.line_number_step = get_int_opt(options, 'line_number_step', 1)
+        self.line_number_start = get_int_opt(options, 'line_number_start', 1)
+        if self.line_numbers:
+            self.line_number_width = (self.fontw * self.line_number_chars +
+                                      self.line_number_pad * 2)
+        else:
+            self.line_number_width = 0
+        self.hl_lines = []
+        hl_lines_str = get_list_opt(options, 'hl_lines', [])
+        for line in hl_lines_str:
+            try:
+                self.hl_lines.append(int(line))
+            except ValueError:
+                pass
+        self.hl_color = options.get('hl_color',
+                                    self.style.highlight_color) or '#f90'
+        self.drawables = []
+
+    def get_style_defs(self, arg=''):
+        raise NotImplementedError('The -S option is meaningless for the image '
+                                  'formatter. Use -O style=<stylename> instead.')
+
+    def _get_line_height(self):
+        """
+        Get the height of a line.
+        """
+        return self.fonth + self.line_pad
+
+    def _get_line_y(self, lineno):
+        """
+        Get the Y coordinate of a line number.
+        """
+        return lineno * self._get_line_height() + self.image_pad
+
+    def _get_char_width(self):
+        """
+        Get the width of a character.
+        """
+        return self.fontw
+
+    def _get_char_x(self, charno):
+        """
+        Get the X coordinate of a character position.
+        """
+        return charno * self.fontw + self.image_pad + self.line_number_width
+
+    def _get_text_pos(self, charno, lineno):
+        """
+        Get the actual position for a character and line position.
+        """
+        return self._get_char_x(charno), self._get_line_y(lineno)
+
+    def _get_linenumber_pos(self, lineno):
+        """
+        Get the actual position for the start of a line number.
+        """
+        return (self.image_pad, self._get_line_y(lineno))
+
+    def _get_text_color(self, style):
+        """
+        Get the correct color for the token from the style.
+        """
+        if style['color'] is not None:
+            fill = '#' + style['color']
+        else:
+            fill = '#000'
+        return fill
+
+    def _get_style_font(self, style):
+        """
+        Get the correct font for the style.
+        """
+        return self.fonts.get_font(style['bold'], style['italic'])
+
+    def _get_image_size(self, maxcharno, maxlineno):
+        """
+        Get the required image size.
+        """
+        return (self._get_char_x(maxcharno) + self.image_pad,
+                self._get_line_y(maxlineno + 0) + self.image_pad)
+
+    def _draw_linenumber(self, posno, lineno):
+        """
+        Remember a line number drawable to paint later.
+        """
+        self._draw_text(
+            self._get_linenumber_pos(posno),
+            str(lineno).rjust(self.line_number_chars),
+            font=self.fonts.get_font(self.line_number_bold,
+                                     self.line_number_italic),
+            fill=self.line_number_fg,
+        )
+
+    def _draw_text(self, pos, text, font, **kw):
+        """
+        Remember a single drawable tuple to paint later.
+        """
+        self.drawables.append((pos, text, font, kw))
+
+    def _create_drawables(self, tokensource):
+        """
+        Create drawables for the token content.
+        """
+        lineno = charno = maxcharno = 0
+        for ttype, value in tokensource:
+            while ttype not in self.styles:
+                ttype = ttype.parent
+            style = self.styles[ttype]
+            # TODO: make sure tab expansion happens earlier in the chain.  It
+            # really ought to be done on the input, as to do it right here is
+            # quite complex.
+            value = value.expandtabs(4)
+            lines = value.splitlines(True)
+            # print lines
+            for i, line in enumerate(lines):
+                temp = line.rstrip('\n')
+                if temp:
+                    self._draw_text(
+                        self._get_text_pos(charno, lineno),
+                        temp,
+                        font = self._get_style_font(style),
+                        fill = self._get_text_color(style)
+                    )
+                    charno += len(temp)
+                    maxcharno = max(maxcharno, charno)
+                if line.endswith('\n'):
+                    # add a line for each extra line in the value
+                    charno = 0
+                    lineno += 1
+        self.maxcharno = maxcharno
+        self.maxlineno = lineno
+
+    def _draw_line_numbers(self):
+        """
+        Create drawables for the line numbers.
+        """
+        if not self.line_numbers:
+            return
+        for p in xrange(self.maxlineno):
+            n = p + self.line_number_start
+            if (n % self.line_number_step) == 0:
+                self._draw_linenumber(p, n)
+
+    def _paint_line_number_bg(self, im):
+        """
+        Paint the line number background on the image.
+        """
+        if not self.line_numbers:
+            return
+        if self.line_number_fg is None:
+            return
+        draw = ImageDraw.Draw(im)
+        recth = im.size[-1]
+        rectw = self.image_pad + self.line_number_width - self.line_number_pad
+        draw.rectangle([(0, 0), (rectw, recth)],
+                       fill=self.line_number_bg)
+        draw.line([(rectw, 0), (rectw, recth)], fill=self.line_number_fg)
+        del draw
+
+    def format(self, tokensource, outfile):
+        """
+        Format ``tokensource``, an iterable of ``(tokentype, tokenstring)``
+        tuples and write it into ``outfile``.
+
+        This implementation calculates where it should draw each token on the
+        pixmap, then calculates the required pixmap size and draws the items.
+        """
+        self._create_drawables(tokensource)
+        self._draw_line_numbers()
+        im = Image.new(
+            'RGB',
+            self._get_image_size(self.maxcharno, self.maxlineno),
+            self.background_color
+        )
+        self._paint_line_number_bg(im)
+        draw = ImageDraw.Draw(im)
+        # Highlight
+        if self.hl_lines:
+            x = self.image_pad + self.line_number_width - self.line_number_pad + 1
+            recth = self._get_line_height()
+            rectw = im.size[0] - x
+            for linenumber in self.hl_lines:
+                y = self._get_line_y(linenumber - 1)
+                draw.rectangle([(x, y), (x + rectw, y + recth)],
+                               fill=self.hl_color)
+        for pos, value, font, kw in self.drawables:
+            draw.text(pos, value, font=font, **kw)
+        im.save(outfile, self.image_format.upper())
+
+
+# Add one formatter per format, so that the "-f gif" option gives the correct result
+# when used in pygmentize.
+
+class GifImageFormatter(ImageFormatter):
+    """
+    Create a GIF image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'img_gif'
+    aliases = ['gif']
+    filenames = ['*.gif']
+    default_image_format = 'gif'
+
+
+class JpgImageFormatter(ImageFormatter):
+    """
+    Create a JPEG image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'img_jpg'
+    aliases = ['jpg', 'jpeg']
+    filenames = ['*.jpg']
+    default_image_format = 'jpeg'
+
+
+class BmpImageFormatter(ImageFormatter):
+    """
+    Create a bitmap image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'img_bmp'
+    aliases = ['bmp', 'bitmap']
+    filenames = ['*.bmp']
+    default_image_format = 'bmp'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/irc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/irc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/irc.py	(revision 1126)
@@ -0,0 +1,182 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.irc
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for IRC output
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import sys
+
+from pygments.formatter import Formatter
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Generic, Token, Whitespace
+from pygments.util import get_choice_opt
+
+
+__all__ = ['IRCFormatter']
+
+
+#: Map token types to a tuple of color values for light and dark
+#: backgrounds.
+IRC_COLORS = {
+    Token:              ('',            ''),
+
+    Whitespace:         ('lightgray',   'darkgray'),
+    Comment:            ('lightgray',   'darkgray'),
+    Comment.Preproc:    ('teal',        'turquoise'),
+    Keyword:            ('darkblue',    'blue'),
+    Keyword.Type:       ('teal',        'turquoise'),
+    Operator.Word:      ('purple',      'fuchsia'),
+    Name.Builtin:       ('teal',        'turquoise'),
+    Name.Function:      ('darkgreen',   'green'),
+    Name.Namespace:     ('_teal_',      '_turquoise_'),
+    Name.Class:         ('_darkgreen_', '_green_'),
+    Name.Exception:     ('teal',        'turquoise'),
+    Name.Decorator:     ('darkgray',    'lightgray'),
+    Name.Variable:      ('darkred',     'red'),
+    Name.Constant:      ('darkred',     'red'),
+    Name.Attribute:     ('teal',        'turquoise'),
+    Name.Tag:           ('blue',        'blue'),
+    String:             ('brown',       'brown'),
+    Number:             ('darkblue',    'blue'),
+
+    Generic.Deleted:    ('red',        'red'),
+    Generic.Inserted:   ('darkgreen',  'green'),
+    Generic.Heading:    ('**',         '**'),
+    Generic.Subheading: ('*purple*',   '*fuchsia*'),
+    Generic.Error:      ('red',        'red'),
+
+    Error:              ('_red_',      '_red_'),
+}
+
+
+IRC_COLOR_MAP = {
+    'white': 0,
+    'black': 1,
+    'darkblue': 2,
+    'green': 3,
+    'red': 4,
+    'brown': 5,
+    'purple': 6,
+    'orange': 7,
+    'darkgreen': 7, #compat w/ ansi
+    'yellow': 8,
+    'lightgreen': 9,
+    'turquoise': 9, # compat w/ ansi
+    'teal': 10,
+    'lightblue': 11,
+    'darkred': 11, # compat w/ ansi
+    'blue': 12,
+    'fuchsia': 13,
+    'darkgray': 14,
+    'lightgray': 15,
+}
+
+def ircformat(color, text):
+    if len(color) < 1:
+        return text
+    add = sub = ''
+    if '_' in color: # italic
+        add += '\x1D'
+        sub = '\x1D' + sub
+        color = color.strip('_')
+    if '*' in color: # bold
+        add += '\x02'
+        sub = '\x02' + sub
+        color = color.strip('*')
+    # underline (\x1F) not supported
+    # backgrounds (\x03FF,BB) not supported
+    if len(color) > 0: # actual color - may have issues with ircformat("red", "blah")+"10" type stuff
+        add += '\x03' + str(IRC_COLOR_MAP[color]).zfill(2)
+        sub = '\x03' + sub
+    return add + text + sub
+    return '<'+add+'>'+text+'</'+sub+'>'
+
+
+class IRCFormatter(Formatter):
+    r"""
+    Format tokens with IRC color sequences
+
+    The `get_style_defs()` method doesn't do anything special since there is
+    no support for common styles.
+
+    Options accepted:
+
+    `bg`
+        Set to ``"light"`` or ``"dark"`` depending on the terminal's background
+        (default: ``"light"``).
+
+    `colorscheme`
+        A dictionary mapping token types to (lightbg, darkbg) color names or
+        ``None`` (default: ``None`` = use builtin colorscheme).
+
+    `linenos`
+        Set to ``True`` to have line numbers in the output as well
+        (default: ``False`` = no line numbers).
+    """
+    name = 'IRC'
+    aliases = ['irc', 'IRC']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.darkbg = get_choice_opt(options, 'bg',
+                                     ['light', 'dark'], 'light') == 'dark'
+        self.colorscheme = options.get('colorscheme', None) or IRC_COLORS
+        self.linenos = options.get('linenos', False)
+        self._lineno = 0
+
+    def _write_lineno(self, outfile):
+        self._lineno += 1
+        outfile.write("\n%04d: " % self._lineno)
+
+    def _format_unencoded_with_lineno(self, tokensource, outfile):
+        self._write_lineno(outfile)
+
+        for ttype, value in tokensource:
+            if value.endswith("\n"):
+                self._write_lineno(outfile)
+                value = value[:-1]
+            color = self.colorscheme.get(ttype)
+            while color is None:
+                ttype = ttype[:-1]
+                color = self.colorscheme.get(ttype)
+            if color:
+                color = color[self.darkbg]
+                spl = value.split('\n')
+                for line in spl[:-1]:
+                    self._write_lineno(outfile)
+                    if line:
+                        outfile.write(ircformat(color, line[:-1]))
+                if spl[-1]:
+                    outfile.write(ircformat(color, spl[-1]))
+            else:
+                outfile.write(value)
+
+        outfile.write("\n")
+
+    def format_unencoded(self, tokensource, outfile):
+        if self.linenos:
+            self._format_unencoded_with_lineno(tokensource, outfile)
+            return
+
+        for ttype, value in tokensource:
+            color = self.colorscheme.get(ttype)
+            while color is None:
+                ttype = ttype[:-1]
+                color = self.colorscheme.get(ttype)
+            if color:
+                color = color[self.darkbg]
+                spl = value.split('\n')
+                for line in spl[:-1]:
+                    if line:
+                        outfile.write(ircformat(color, line))
+                    outfile.write('\n')
+                if spl[-1]:
+                    outfile.write(ircformat(color, spl[-1]))
+            else:
+                outfile.write(value)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/latex.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/latex.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/latex.py	(revision 1126)
@@ -0,0 +1,482 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.latex
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for LaTeX fancyvrb output.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import division
+
+from pygments.formatter import Formatter
+from pygments.lexer import Lexer
+from pygments.token import Token, STANDARD_TYPES
+from pygments.util import get_bool_opt, get_int_opt, StringIO, xrange, \
+    iteritems
+
+
+__all__ = ['LatexFormatter']
+
+
+def escape_tex(text, commandprefix):
+    return text.replace('\\', '\x00'). \
+                replace('{', '\x01'). \
+                replace('}', '\x02'). \
+                replace('\x00', r'\%sZbs{}' % commandprefix). \
+                replace('\x01', r'\%sZob{}' % commandprefix). \
+                replace('\x02', r'\%sZcb{}' % commandprefix). \
+                replace('^', r'\%sZca{}' % commandprefix). \
+                replace('_', r'\%sZus{}' % commandprefix). \
+                replace('&', r'\%sZam{}' % commandprefix). \
+                replace('<', r'\%sZlt{}' % commandprefix). \
+                replace('>', r'\%sZgt{}' % commandprefix). \
+                replace('#', r'\%sZsh{}' % commandprefix). \
+                replace('%', r'\%sZpc{}' % commandprefix). \
+                replace('$', r'\%sZdl{}' % commandprefix). \
+                replace('-', r'\%sZhy{}' % commandprefix). \
+                replace("'", r'\%sZsq{}' % commandprefix). \
+                replace('"', r'\%sZdq{}' % commandprefix). \
+                replace('~', r'\%sZti{}' % commandprefix)
+
+
+DOC_TEMPLATE = r'''
+\documentclass{%(docclass)s}
+\usepackage{fancyvrb}
+\usepackage{color}
+\usepackage[%(encoding)s]{inputenc}
+%(preamble)s
+
+%(styledefs)s
+
+\begin{document}
+
+\section*{%(title)s}
+
+%(code)s
+\end{document}
+'''
+
+## Small explanation of the mess below :)
+#
+# The previous version of the LaTeX formatter just assigned a command to
+# each token type defined in the current style.  That obviously is
+# problematic if the highlighted code is produced for a different style
+# than the style commands themselves.
+#
+# This version works much like the HTML formatter which assigns multiple
+# CSS classes to each <span> tag, from the most specific to the least
+# specific token type, thus falling back to the parent token type if one
+# is not defined.  Here, the classes are there too and use the same short
+# forms given in token.STANDARD_TYPES.
+#
+# Highlighted code now only uses one custom command, which by default is
+# \PY and selectable by the commandprefix option (and in addition the
+# escapes \PYZat, \PYZlb and \PYZrb which haven't been renamed for
+# backwards compatibility purposes).
+#
+# \PY has two arguments: the classes, separated by +, and the text to
+# render in that style.  The classes are resolved into the respective
+# style commands by magic, which serves to ignore unknown classes.
+#
+# The magic macros are:
+# * \PY@it, \PY@bf, etc. are unconditionally wrapped around the text
+#   to render in \PY@do.  Their definition determines the style.
+# * \PY@reset resets \PY@it etc. to do nothing.
+# * \PY@toks parses the list of classes, using magic inspired by the
+#   keyval package (but modified to use plusses instead of commas
+#   because fancyvrb redefines commas inside its environments).
+# * \PY@tok processes one class, calling the \PY@tok@classname command
+#   if it exists.
+# * \PY@tok@classname sets the \PY@it etc. to reflect the chosen style
+#   for its class.
+# * \PY resets the style, parses the classnames and then calls \PY@do.
+#
+# Tip: to read this code, print it out in substituted form using e.g.
+# >>> print STYLE_TEMPLATE % {'cp': 'PY'}
+
+STYLE_TEMPLATE = r'''
+\makeatletter
+\def\%(cp)s@reset{\let\%(cp)s@it=\relax \let\%(cp)s@bf=\relax%%
+    \let\%(cp)s@ul=\relax \let\%(cp)s@tc=\relax%%
+    \let\%(cp)s@bc=\relax \let\%(cp)s@ff=\relax}
+\def\%(cp)s@tok#1{\csname %(cp)s@tok@#1\endcsname}
+\def\%(cp)s@toks#1+{\ifx\relax#1\empty\else%%
+    \%(cp)s@tok{#1}\expandafter\%(cp)s@toks\fi}
+\def\%(cp)s@do#1{\%(cp)s@bc{\%(cp)s@tc{\%(cp)s@ul{%%
+    \%(cp)s@it{\%(cp)s@bf{\%(cp)s@ff{#1}}}}}}}
+\def\%(cp)s#1#2{\%(cp)s@reset\%(cp)s@toks#1+\relax+\%(cp)s@do{#2}}
+
+%(styles)s
+
+\def\%(cp)sZbs{\char`\\}
+\def\%(cp)sZus{\char`\_}
+\def\%(cp)sZob{\char`\{}
+\def\%(cp)sZcb{\char`\}}
+\def\%(cp)sZca{\char`\^}
+\def\%(cp)sZam{\char`\&}
+\def\%(cp)sZlt{\char`\<}
+\def\%(cp)sZgt{\char`\>}
+\def\%(cp)sZsh{\char`\#}
+\def\%(cp)sZpc{\char`\%%}
+\def\%(cp)sZdl{\char`\$}
+\def\%(cp)sZhy{\char`\-}
+\def\%(cp)sZsq{\char`\'}
+\def\%(cp)sZdq{\char`\"}
+\def\%(cp)sZti{\char`\~}
+%% for compatibility with earlier versions
+\def\%(cp)sZat{@}
+\def\%(cp)sZlb{[}
+\def\%(cp)sZrb{]}
+\makeatother
+'''
+
+
+def _get_ttype_name(ttype):
+    fname = STANDARD_TYPES.get(ttype)
+    if fname:
+        return fname
+    aname = ''
+    while fname is None:
+        aname = ttype[-1] + aname
+        ttype = ttype.parent
+        fname = STANDARD_TYPES.get(ttype)
+    return fname + aname
+
+
+class LatexFormatter(Formatter):
+    r"""
+    Format tokens as LaTeX code. This needs the `fancyvrb` and `color`
+    standard packages.
+
+    Without the `full` option, code is formatted as one ``Verbatim``
+    environment, like this:
+
+    .. sourcecode:: latex
+
+        \begin{Verbatim}[commandchars=\\\{\}]
+        \PY{k}{def }\PY{n+nf}{foo}(\PY{n}{bar}):
+            \PY{k}{pass}
+        \end{Verbatim}
+
+    The special command used here (``\PY``) and all the other macros it needs
+    are output by the `get_style_defs` method.
+
+    With the `full` option, a complete LaTeX document is output, including
+    the command definitions in the preamble.
+
+    The `get_style_defs()` method of a `LatexFormatter` returns a string
+    containing ``\def`` commands defining the macros needed inside the
+    ``Verbatim`` environments.
+
+    Additional options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `full`
+        Tells the formatter to output a "full" document, i.e. a complete
+        self-contained document (default: ``False``).
+
+    `title`
+        If `full` is true, the title that should be used to caption the
+        document (default: ``''``).
+
+    `docclass`
+        If the `full` option is enabled, this is the document class to use
+        (default: ``'article'``).
+
+    `preamble`
+        If the `full` option is enabled, this can be further preamble commands,
+        e.g. ``\usepackage`` (default: ``''``).
+
+    `linenos`
+        If set to ``True``, output line numbers (default: ``False``).
+
+    `linenostart`
+        The line number for the first line (default: ``1``).
+
+    `linenostep`
+        If set to a number n > 1, only every nth line number is printed.
+
+    `verboptions`
+        Additional options given to the Verbatim environment (see the *fancyvrb*
+        docs for possible values) (default: ``''``).
+
+    `commandprefix`
+        The LaTeX commands used to produce colored output are constructed
+        using this prefix and some letters (default: ``'PY'``).
+
+        .. versionadded:: 0.7
+        .. versionchanged:: 0.10
+           The default is now ``'PY'`` instead of ``'C'``.
+
+    `texcomments`
+        If set to ``True``, enables LaTeX comment lines.  That is, LaTex markup
+        in comment tokens is not escaped so that LaTeX can render it (default:
+        ``False``).
+
+        .. versionadded:: 1.2
+
+    `mathescape`
+        If set to ``True``, enables LaTeX math mode escape in comments. That
+        is, ``'$...$'`` inside a comment will trigger math mode (default:
+        ``False``).
+
+        .. versionadded:: 1.2
+
+    `escapeinside`
+        If set to a string of length 2, enables escaping to LaTeX. Text
+        delimited by these 2 characters is read as LaTeX code and
+        typeset accordingly. It has no effect in string literals. It has
+        no effect in comments if `texcomments` or `mathescape` is
+        set. (default: ``''``).
+
+        .. versionadded:: 2.0
+
+    `envname`
+        Allows you to pick an alternative environment name replacing Verbatim.
+        The alternate environment still has to support Verbatim's option syntax.
+        (default: ``'Verbatim'``).
+
+        .. versionadded:: 2.0
+    """
+    name = 'LaTeX'
+    aliases = ['latex', 'tex']
+    filenames = ['*.tex']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.docclass = options.get('docclass', 'article')
+        self.preamble = options.get('preamble', '')
+        self.linenos = get_bool_opt(options, 'linenos', False)
+        self.linenostart = abs(get_int_opt(options, 'linenostart', 1))
+        self.linenostep = abs(get_int_opt(options, 'linenostep', 1))
+        self.verboptions = options.get('verboptions', '')
+        self.nobackground = get_bool_opt(options, 'nobackground', False)
+        self.commandprefix = options.get('commandprefix', 'PY')
+        self.texcomments = get_bool_opt(options, 'texcomments', False)
+        self.mathescape = get_bool_opt(options, 'mathescape', False)
+        self.escapeinside = options.get('escapeinside', '')
+        if len(self.escapeinside) == 2:
+            self.left = self.escapeinside[0]
+            self.right = self.escapeinside[1]
+        else:
+            self.escapeinside = ''
+        self.envname = options.get('envname', u'Verbatim')
+
+        self._create_stylesheet()
+
+    def _create_stylesheet(self):
+        t2n = self.ttype2name = {Token: ''}
+        c2d = self.cmd2def = {}
+        cp = self.commandprefix
+
+        def rgbcolor(col):
+            if col:
+                return ','.join(['%.2f' % (int(col[i] + col[i + 1], 16) / 255.0)
+                                 for i in (0, 2, 4)])
+            else:
+                return '1,1,1'
+
+        for ttype, ndef in self.style:
+            name = _get_ttype_name(ttype)
+            cmndef = ''
+            if ndef['bold']:
+                cmndef += r'\let\$$@bf=\textbf'
+            if ndef['italic']:
+                cmndef += r'\let\$$@it=\textit'
+            if ndef['underline']:
+                cmndef += r'\let\$$@ul=\underline'
+            if ndef['roman']:
+                cmndef += r'\let\$$@ff=\textrm'
+            if ndef['sans']:
+                cmndef += r'\let\$$@ff=\textsf'
+            if ndef['mono']:
+                cmndef += r'\let\$$@ff=\textsf'
+            if ndef['color']:
+                cmndef += (r'\def\$$@tc##1{\textcolor[rgb]{%s}{##1}}' %
+                           rgbcolor(ndef['color']))
+            if ndef['border']:
+                cmndef += (r'\def\$$@bc##1{\setlength{\fboxsep}{0pt}'
+                           r'\fcolorbox[rgb]{%s}{%s}{\strut ##1}}' %
+                           (rgbcolor(ndef['border']),
+                            rgbcolor(ndef['bgcolor'])))
+            elif ndef['bgcolor']:
+                cmndef += (r'\def\$$@bc##1{\setlength{\fboxsep}{0pt}'
+                           r'\colorbox[rgb]{%s}{\strut ##1}}' %
+                           rgbcolor(ndef['bgcolor']))
+            if cmndef == '':
+                continue
+            cmndef = cmndef.replace('$$', cp)
+            t2n[ttype] = name
+            c2d[name] = cmndef
+
+    def get_style_defs(self, arg=''):
+        """
+        Return the command sequences needed to define the commands
+        used to format text in the verbatim environment. ``arg`` is ignored.
+        """
+        cp = self.commandprefix
+        styles = []
+        for name, definition in iteritems(self.cmd2def):
+            styles.append(r'\expandafter\def\csname %s@tok@%s\endcsname{%s}' %
+                          (cp, name, definition))
+        return STYLE_TEMPLATE % {'cp': self.commandprefix,
+                                 'styles': '\n'.join(styles)}
+
+    def format_unencoded(self, tokensource, outfile):
+        # TODO: add support for background colors
+        t2n = self.ttype2name
+        cp = self.commandprefix
+
+        if self.full:
+            realoutfile = outfile
+            outfile = StringIO()
+
+        outfile.write(u'\\begin{' + self.envname + u'}[commandchars=\\\\\\{\\}')
+        if self.linenos:
+            start, step = self.linenostart, self.linenostep
+            outfile.write(u',numbers=left' +
+                          (start and u',firstnumber=%d' % start or u'') +
+                          (step and u',stepnumber=%d' % step or u''))
+        if self.mathescape or self.texcomments or self.escapeinside:
+            outfile.write(u',codes={\\catcode`\\$=3\\catcode`\\^=7\\catcode`\\_=8}')
+        if self.verboptions:
+            outfile.write(u',' + self.verboptions)
+        outfile.write(u']\n')
+
+        for ttype, value in tokensource:
+            if ttype in Token.Comment:
+                if self.texcomments:
+                    # Try to guess comment starting lexeme and escape it ...
+                    start = value[0:1]
+                    for i in xrange(1, len(value)):
+                        if start[0] != value[i]:
+                            break
+                        start += value[i]
+
+                    value = value[len(start):]
+                    start = escape_tex(start, cp)
+
+                    # ... but do not escape inside comment.
+                    value = start + value
+                elif self.mathescape:
+                    # Only escape parts not inside a math environment.
+                    parts = value.split('$')
+                    in_math = False
+                    for i, part in enumerate(parts):
+                        if not in_math:
+                            parts[i] = escape_tex(part, cp)
+                        in_math = not in_math
+                    value = '$'.join(parts)
+                elif self.escapeinside:
+                    text = value
+                    value = ''
+                    while text:
+                        a, sep1, text = text.partition(self.left)
+                        if sep1:
+                            b, sep2, text = text.partition(self.right)
+                            if sep2:
+                                value += escape_tex(a, cp) + b
+                            else:
+                                value += escape_tex(a + sep1 + b, cp)
+                        else:
+                            value += escape_tex(a, cp)
+                else:
+                    value = escape_tex(value, cp)
+            elif ttype not in Token.Escape:
+                value = escape_tex(value, cp)
+            styles = []
+            while ttype is not Token:
+                try:
+                    styles.append(t2n[ttype])
+                except KeyError:
+                    # not in current style
+                    styles.append(_get_ttype_name(ttype))
+                ttype = ttype.parent
+            styleval = '+'.join(reversed(styles))
+            if styleval:
+                spl = value.split('\n')
+                for line in spl[:-1]:
+                    if line:
+                        outfile.write("\\%s{%s}{%s}" % (cp, styleval, line))
+                    outfile.write('\n')
+                if spl[-1]:
+                    outfile.write("\\%s{%s}{%s}" % (cp, styleval, spl[-1]))
+            else:
+                outfile.write(value)
+
+        outfile.write(u'\\end{' + self.envname + u'}\n')
+
+        if self.full:
+            encoding = self.encoding or 'utf8'
+            # map known existings encodings from LaTeX distribution
+            encoding = {
+                'utf_8': 'utf8',
+                'latin_1': 'latin1',
+                'iso_8859_1': 'latin1',
+            }.get(encoding.replace('-', '_'), encoding)
+            realoutfile.write(DOC_TEMPLATE %
+                dict(docclass  = self.docclass,
+                     preamble  = self.preamble,
+                     title     = self.title,
+                     encoding  = encoding,
+                     styledefs = self.get_style_defs(),
+                     code      = outfile.getvalue()))
+
+
+class LatexEmbeddedLexer(Lexer):
+    """
+    This lexer takes one lexer as argument, the lexer for the language
+    being formatted, and the left and right delimiters for escaped text.
+
+    First everything is scanned using the language lexer to obtain
+    strings and comments. All other consecutive tokens are merged and
+    the resulting text is scanned for escaped segments, which are given
+    the Token.Escape type. Finally text that is not escaped is scanned
+    again with the language lexer.
+    """
+    def __init__(self, left, right, lang, **options):
+        self.left = left
+        self.right = right
+        self.lang = lang
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        buf = ''
+        idx = 0
+        for i, t, v in self.lang.get_tokens_unprocessed(text):
+            if t in Token.Comment or t in Token.String:
+                if buf:
+                    for x in self.get_tokens_aux(idx, buf):
+                        yield x
+                    buf = ''
+                yield i, t, v
+            else:
+                if not buf:
+                    idx = i
+                buf += v
+        if buf:
+            for x in self.get_tokens_aux(idx, buf):
+                yield x
+
+    def get_tokens_aux(self, index, text):
+        while text:
+            a, sep1, text = text.partition(self.left)
+            if a:
+                for i, t, v in self.lang.get_tokens_unprocessed(a):
+                    yield index + i, t, v
+                    index += len(a)
+            if sep1:
+                b, sep2, text = text.partition(self.right)
+                if sep2:
+                    yield index + len(sep1), Token.Escape, b
+                    index += len(sep1) + len(b) + len(sep2)
+                else:
+                    yield index, Token.Error, sep1
+                    index += len(sep1)
+                    text = b
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/bbcode.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/bbcode.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/bbcode.py	(revision 1126)
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.bbcode
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    BBcode formatter.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+from pygments.formatter import Formatter
+from pygments.util import get_bool_opt
+
+__all__ = ['BBCodeFormatter']
+
+
+class BBCodeFormatter(Formatter):
+    """
+    Format tokens with BBcodes. These formatting codes are used by many
+    bulletin boards, so you can highlight your sourcecode with pygments before
+    posting it there.
+
+    This formatter has no support for background colors and borders, as there
+    are no common BBcode tags for that.
+
+    Some board systems (e.g. phpBB) don't support colors in their [code] tag,
+    so you can't use the highlighting together with that tag.
+    Text in a [code] tag usually is shown with a monospace font (which this
+    formatter can do with the ``monofont`` option) and no spaces (which you
+    need for indentation) are removed.
+
+    Additional options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `codetag`
+        If set to true, put the output into ``[code]`` tags (default:
+        ``false``)
+
+    `monofont`
+        If set to true, add a tag to show the code with a monospace font
+        (default: ``false``).
+    """
+    name = 'BBCode'
+    aliases = ['bbcode', 'bb']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self._code = get_bool_opt(options, 'codetag', False)
+        self._mono = get_bool_opt(options, 'monofont', False)
+
+        self.styles = {}
+        self._make_styles()
+
+    def _make_styles(self):
+        for ttype, ndef in self.style:
+            start = end = ''
+            if ndef['color']:
+                start += '[color=#%s]' % ndef['color']
+                end = '[/color]' + end
+            if ndef['bold']:
+                start += '[b]'
+                end = '[/b]' + end
+            if ndef['italic']:
+                start += '[i]'
+                end = '[/i]' + end
+            if ndef['underline']:
+                start += '[u]'
+                end = '[/u]' + end
+            # there are no common BBcodes for background-color and border
+
+            self.styles[ttype] = start, end
+
+    def format_unencoded(self, tokensource, outfile):
+        if self._code:
+            outfile.write('[code]')
+        if self._mono:
+            outfile.write('[font=monospace]')
+
+        lastval = ''
+        lasttype = None
+
+        for ttype, value in tokensource:
+            while ttype not in self.styles:
+                ttype = ttype.parent
+            if ttype == lasttype:
+                lastval += value
+            else:
+                if lastval:
+                    start, end = self.styles[lasttype]
+                    outfile.write(''.join((start, lastval, end)))
+                lastval = value
+                lasttype = ttype
+
+        if lastval:
+            start, end = self.styles[lasttype]
+            outfile.write(''.join((start, lastval, end)))
+
+        if self._mono:
+            outfile.write('[/font]')
+        if self._code:
+            outfile.write('[/code]')
+        if self._code or self._mono:
+            outfile.write('\n')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/__init__.py	(revision 1126)
@@ -0,0 +1,153 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters
+    ~~~~~~~~~~~~~~~~~~~
+
+    Pygments formatters.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import sys
+import types
+import fnmatch
+from os.path import basename
+
+from pygments.formatters._mapping import FORMATTERS
+from pygments.plugin import find_plugin_formatters
+from pygments.util import ClassNotFound, itervalues
+
+__all__ = ['get_formatter_by_name', 'get_formatter_for_filename',
+           'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS)
+
+_formatter_cache = {}  # classes by name
+_pattern_cache = {}
+
+
+def _fn_matches(fn, glob):
+    """Return whether the supplied file name fn matches pattern filename."""
+    if glob not in _pattern_cache:
+        pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
+        return pattern.match(fn)
+    return _pattern_cache[glob].match(fn)
+
+
+def _load_formatters(module_name):
+    """Load a formatter (and all others in the module too)."""
+    mod = __import__(module_name, None, None, ['__all__'])
+    for formatter_name in mod.__all__:
+        cls = getattr(mod, formatter_name)
+        _formatter_cache[cls.name] = cls
+
+
+def get_all_formatters():
+    """Return a generator for all formatter classes."""
+    # NB: this returns formatter classes, not info like get_all_lexers().
+    for info in itervalues(FORMATTERS):
+        if info[1] not in _formatter_cache:
+            _load_formatters(info[0])
+        yield _formatter_cache[info[1]]
+    for _, formatter in find_plugin_formatters():
+        yield formatter
+
+
+def find_formatter_class(alias):
+    """Lookup a formatter by alias.
+
+    Returns None if not found.
+    """
+    for module_name, name, aliases, _, _ in itervalues(FORMATTERS):
+        if alias in aliases:
+            if name not in _formatter_cache:
+                _load_formatters(module_name)
+            return _formatter_cache[name]
+    for _, cls in find_plugin_formatters():
+        if alias in cls.aliases:
+            return cls
+
+
+def get_formatter_by_name(_alias, **options):
+    """Lookup and instantiate a formatter by alias.
+
+    Raises ClassNotFound if not found.
+    """
+    cls = find_formatter_class(_alias)
+    if cls is None:
+        raise ClassNotFound("no formatter found for name %r" % _alias)
+    return cls(**options)
+
+
+def load_formatter_from_file(filename, formattername="CustomFormatter",
+                             **options):
+    """Load a formatter from a file.
+
+    This method expects a file located relative to the current working
+    directory, which contains a class named CustomFormatter. By default,
+    it expects the Formatter to be named CustomFormatter; you can specify
+    your own class name as the second argument to this function.
+
+    Users should be very careful with the input, because this method
+    is equivalent to running eval on the input file.
+
+    Raises ClassNotFound if there are any problems importing the Formatter.
+
+    .. versionadded:: 2.2
+    """
+    try:
+        # This empty dict will contain the namespace for the exec'd file
+        custom_namespace = {}
+        exec(open(filename, 'rb').read(), custom_namespace)
+        # Retrieve the class `formattername` from that namespace
+        if formattername not in custom_namespace:
+            raise ClassNotFound('no valid %s class found in %s' %
+                                (formattername, filename))
+        formatter_class = custom_namespace[formattername]
+        # And finally instantiate it with the options
+        return formatter_class(**options)
+    except IOError as err:
+        raise ClassNotFound('cannot read %s' % filename)
+    except ClassNotFound as err:
+        raise
+    except Exception as err:
+        raise ClassNotFound('error when loading custom formatter: %s' % err)
+
+
+def get_formatter_for_filename(fn, **options):
+    """Lookup and instantiate a formatter by filename pattern.
+
+    Raises ClassNotFound if not found.
+    """
+    fn = basename(fn)
+    for modname, name, _, filenames, _ in itervalues(FORMATTERS):
+        for filename in filenames:
+            if _fn_matches(fn, filename):
+                if name not in _formatter_cache:
+                    _load_formatters(modname)
+                return _formatter_cache[name](**options)
+    for cls in find_plugin_formatters():
+        for filename in cls.filenames:
+            if _fn_matches(fn, filename):
+                return cls(**options)
+    raise ClassNotFound("no formatter found for file name %r" % fn)
+
+
+class _automodule(types.ModuleType):
+    """Automatically import formatters."""
+
+    def __getattr__(self, name):
+        info = FORMATTERS.get(name)
+        if info:
+            _load_formatters(info[0])
+            cls = _formatter_cache[info[1]]
+            setattr(self, name, cls)
+            return cls
+        raise AttributeError(name)
+
+
+oldmod = sys.modules[__name__]
+newmod = _automodule(__name__)
+newmod.__dict__.update(oldmod.__dict__)
+sys.modules[__name__] = newmod
+del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/svg.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/svg.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/svg.py	(revision 1126)
@@ -0,0 +1,153 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.svg
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for SVG output.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+from pygments.util import get_bool_opt, get_int_opt
+
+__all__ = ['SvgFormatter']
+
+
+def escape_html(text):
+    """Escape &, <, > as well as single and double quotes for HTML."""
+    return text.replace('&', '&amp;').  \
+                replace('<', '&lt;').   \
+                replace('>', '&gt;').   \
+                replace('"', '&quot;'). \
+                replace("'", '&#39;')
+
+
+class2style = {}
+
+class SvgFormatter(Formatter):
+    """
+    Format tokens as an SVG graphics file.  This formatter is still experimental.
+    Each line of code is a ``<text>`` element with explicit ``x`` and ``y``
+    coordinates containing ``<tspan>`` elements with the individual token styles.
+
+    By default, this formatter outputs a full SVG document including doctype
+    declaration and the ``<svg>`` root element.
+
+    .. versionadded:: 0.9
+
+    Additional options accepted:
+
+    `nowrap`
+        Don't wrap the SVG ``<text>`` elements in ``<svg><g>`` elements and
+        don't add a XML declaration and a doctype.  If true, the `fontfamily`
+        and `fontsize` options are ignored.  Defaults to ``False``.
+
+    `fontfamily`
+        The value to give the wrapping ``<g>`` element's ``font-family``
+        attribute, defaults to ``"monospace"``.
+
+    `fontsize`
+        The value to give the wrapping ``<g>`` element's ``font-size``
+        attribute, defaults to ``"14px"``.
+
+    `xoffset`
+        Starting offset in X direction, defaults to ``0``.
+
+    `yoffset`
+        Starting offset in Y direction, defaults to the font size if it is given
+        in pixels, or ``20`` else.  (This is necessary since text coordinates
+        refer to the text baseline, not the top edge.)
+
+    `ystep`
+        Offset to add to the Y coordinate for each subsequent line.  This should
+        roughly be the text size plus 5.  It defaults to that value if the text
+        size is given in pixels, or ``25`` else.
+
+    `spacehack`
+        Convert spaces in the source to ``&#160;``, which are non-breaking
+        spaces.  SVG provides the ``xml:space`` attribute to control how
+        whitespace inside tags is handled, in theory, the ``preserve`` value
+        could be used to keep all whitespace as-is.  However, many current SVG
+        viewers don't obey that rule, so this option is provided as a workaround
+        and defaults to ``True``.
+    """
+    name = 'SVG'
+    aliases = ['svg']
+    filenames = ['*.svg']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.nowrap = get_bool_opt(options, 'nowrap', False)
+        self.fontfamily = options.get('fontfamily', 'monospace')
+        self.fontsize = options.get('fontsize', '14px')
+        self.xoffset = get_int_opt(options, 'xoffset', 0)
+        fs = self.fontsize.strip()
+        if fs.endswith('px'): fs = fs[:-2].strip()
+        try:
+            int_fs = int(fs)
+        except:
+            int_fs = 20
+        self.yoffset = get_int_opt(options, 'yoffset', int_fs)
+        self.ystep = get_int_opt(options, 'ystep', int_fs + 5)
+        self.spacehack = get_bool_opt(options, 'spacehack', True)
+        self._stylecache = {}
+
+    def format_unencoded(self, tokensource, outfile):
+        """
+        Format ``tokensource``, an iterable of ``(tokentype, tokenstring)``
+        tuples and write it into ``outfile``.
+
+        For our implementation we put all lines in their own 'line group'.
+        """
+        x = self.xoffset
+        y = self.yoffset
+        if not self.nowrap:
+            if self.encoding:
+                outfile.write('<?xml version="1.0" encoding="%s"?>\n' %
+                              self.encoding)
+            else:
+                outfile.write('<?xml version="1.0"?>\n')
+            outfile.write('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" '
+                          '"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/'
+                          'svg10.dtd">\n')
+            outfile.write('<svg xmlns="http://www.w3.org/2000/svg">\n')
+            outfile.write('<g font-family="%s" font-size="%s">\n' %
+                          (self.fontfamily, self.fontsize))
+        outfile.write('<text x="%s" y="%s" xml:space="preserve">' % (x, y))
+        for ttype, value in tokensource:
+            style = self._get_style(ttype)
+            tspan = style and '<tspan' + style + '>' or ''
+            tspanend = tspan and '</tspan>' or ''
+            value = escape_html(value)
+            if self.spacehack:
+                value = value.expandtabs().replace(' ', '&#160;')
+            parts = value.split('\n')
+            for part in parts[:-1]:
+                outfile.write(tspan + part + tspanend)
+                y += self.ystep
+                outfile.write('</text>\n<text x="%s" y="%s" '
+                              'xml:space="preserve">' % (x, y))
+            outfile.write(tspan + parts[-1] + tspanend)
+        outfile.write('</text>')
+
+        if not self.nowrap:
+            outfile.write('</g></svg>\n')
+
+    def _get_style(self, tokentype):
+        if tokentype in self._stylecache:
+            return self._stylecache[tokentype]
+        otokentype = tokentype
+        while not self.style.styles_token(tokentype):
+            tokentype = tokentype.parent
+        value = self.style.style_for_token(tokentype)
+        result = ''
+        if value['color']:
+            result = ' fill="#' + value['color'] + '"'
+        if value['bold']:
+            result += ' font-weight="bold"'
+        if value['italic']:
+            result += ' font-style="italic"'
+        self._stylecache[otokentype] = result
+        return result
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/other.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/other.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/other.py	(revision 1126)
@@ -0,0 +1,160 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.other
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Other formatters: NullFormatter, RawTokenFormatter.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+from pygments.util import OptionError, get_choice_opt
+from pygments.token import Token
+from pygments.console import colorize
+
+__all__ = ['NullFormatter', 'RawTokenFormatter', 'TestcaseFormatter']
+
+
+class NullFormatter(Formatter):
+    """
+    Output the text unchanged without any formatting.
+    """
+    name = 'Text only'
+    aliases = ['text', 'null']
+    filenames = ['*.txt']
+
+    def format(self, tokensource, outfile):
+        enc = self.encoding
+        for ttype, value in tokensource:
+            if enc:
+                outfile.write(value.encode(enc))
+            else:
+                outfile.write(value)
+
+
+class RawTokenFormatter(Formatter):
+    r"""
+    Format tokens as a raw representation for storing token streams.
+
+    The format is ``tokentype<TAB>repr(tokenstring)\n``. The output can later
+    be converted to a token stream with the `RawTokenLexer`, described in the
+    :doc:`lexer list <lexers>`.
+
+    Only two options are accepted:
+
+    `compress`
+        If set to ``'gz'`` or ``'bz2'``, compress the output with the given
+        compression algorithm after encoding (default: ``''``).
+    `error_color`
+        If set to a color name, highlight error tokens using that color.  If
+        set but with no value, defaults to ``'red'``.
+
+        .. versionadded:: 0.11
+
+    """
+    name = 'Raw tokens'
+    aliases = ['raw', 'tokens']
+    filenames = ['*.raw']
+
+    unicodeoutput = False
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        # We ignore self.encoding if it is set, since it gets set for lexer
+        # and formatter if given with -Oencoding on the command line.
+        # The RawTokenFormatter outputs only ASCII. Override here.
+        self.encoding = 'ascii'  # let pygments.format() do the right thing
+        self.compress = get_choice_opt(options, 'compress',
+                                       ['', 'none', 'gz', 'bz2'], '')
+        self.error_color = options.get('error_color', None)
+        if self.error_color is True:
+            self.error_color = 'red'
+        if self.error_color is not None:
+            try:
+                colorize(self.error_color, '')
+            except KeyError:
+                raise ValueError("Invalid color %r specified" %
+                                 self.error_color)
+
+    def format(self, tokensource, outfile):
+        try:
+            outfile.write(b'')
+        except TypeError:
+            raise TypeError('The raw tokens formatter needs a binary '
+                            'output file')
+        if self.compress == 'gz':
+            import gzip
+            outfile = gzip.GzipFile('', 'wb', 9, outfile)
+            def write(text):
+                outfile.write(text.encode())
+            flush = outfile.flush
+        elif self.compress == 'bz2':
+            import bz2
+            compressor = bz2.BZ2Compressor(9)
+            def write(text):
+                outfile.write(compressor.compress(text.encode()))
+            def flush():
+                outfile.write(compressor.flush())
+                outfile.flush()
+        else:
+            def write(text):
+                outfile.write(text.encode())
+            flush = outfile.flush
+
+        if self.error_color:
+            for ttype, value in tokensource:
+                line = "%s\t%r\n" % (ttype, value)
+                if ttype is Token.Error:
+                    write(colorize(self.error_color, line))
+                else:
+                    write(line)
+        else:
+            for ttype, value in tokensource:
+                write("%s\t%r\n" % (ttype, value))
+        flush()
+
+TESTCASE_BEFORE = u'''\
+    def testNeedsName(self):
+        fragment = %r
+        tokens = [
+'''
+TESTCASE_AFTER = u'''\
+        ]
+        self.assertEqual(tokens, list(self.lexer.get_tokens(fragment)))
+'''
+
+
+class TestcaseFormatter(Formatter):
+    """
+    Format tokens as appropriate for a new testcase.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Testcase'
+    aliases = ['testcase']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        if self.encoding is not None and self.encoding != 'utf-8':
+            raise ValueError("Only None and utf-8 are allowed encodings.")
+
+    def format(self, tokensource, outfile):
+        indentation = ' ' * 12
+        rawbuf = []
+        outbuf = []
+        for ttype, value in tokensource:
+            rawbuf.append(value)
+            outbuf.append('%s(%s, %r),\n' % (indentation, ttype, value))
+
+        before = TESTCASE_BEFORE % (u''.join(rawbuf),)
+        during = u''.join(outbuf)
+        after = TESTCASE_AFTER
+        if self.encoding is None:
+            outfile.write(before + during + after)
+        else:
+            outfile.write(before.encode('utf-8'))
+            outfile.write(during.encode('utf-8'))
+            outfile.write(after.encode('utf-8'))
+        outfile.flush()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/html.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/html.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/html.py	(revision 1126)
@@ -0,0 +1,851 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.html
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for HTML output.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+import os
+import sys
+import os.path
+
+from pygments.formatter import Formatter
+from pygments.token import Token, Text, STANDARD_TYPES
+from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
+    StringIO, string_types, iteritems
+
+try:
+    import ctags
+except ImportError:
+    ctags = None
+
+__all__ = ['HtmlFormatter']
+
+
+_escape_html_table = {
+    ord('&'): u'&amp;',
+    ord('<'): u'&lt;',
+    ord('>'): u'&gt;',
+    ord('"'): u'&quot;',
+    ord("'"): u'&#39;',
+}
+
+
+def escape_html(text, table=_escape_html_table):
+    """Escape &, <, > as well as single and double quotes for HTML."""
+    return text.translate(table)
+
+
+def _get_ttype_class(ttype):
+    fname = STANDARD_TYPES.get(ttype)
+    if fname:
+        return fname
+    aname = ''
+    while fname is None:
+        aname = '-' + ttype[-1] + aname
+        ttype = ttype.parent
+        fname = STANDARD_TYPES.get(ttype)
+    return fname + aname
+
+
+CSSFILE_TEMPLATE = '''\
+td.linenos { background-color: #f0f0f0; padding-right: 10px; }
+span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
+pre { line-height: 125%%; }
+%(styledefs)s
+'''
+
+DOC_HEADER = '''\
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html>
+<head>
+  <title>%(title)s</title>
+  <meta http-equiv="content-type" content="text/html; charset=%(encoding)s">
+  <style type="text/css">
+''' + CSSFILE_TEMPLATE + '''
+  </style>
+</head>
+<body>
+<h2>%(title)s</h2>
+
+'''
+
+DOC_HEADER_EXTERNALCSS = '''\
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html>
+<head>
+  <title>%(title)s</title>
+  <meta http-equiv="content-type" content="text/html; charset=%(encoding)s">
+  <link rel="stylesheet" href="%(cssfile)s" type="text/css">
+</head>
+<body>
+<h2>%(title)s</h2>
+
+'''
+
+DOC_FOOTER = '''\
+</body>
+</html>
+'''
+
+
+class HtmlFormatter(Formatter):
+    r"""
+    Format tokens as HTML 4 ``<span>`` tags within a ``<pre>`` tag, wrapped
+    in a ``<div>`` tag. The ``<div>``'s CSS class can be set by the `cssclass`
+    option.
+
+    If the `linenos` option is set to ``"table"``, the ``<pre>`` is
+    additionally wrapped inside a ``<table>`` which has one row and two
+    cells: one containing the line numbers and one containing the code.
+    Example:
+
+    .. sourcecode:: html
+
+        <div class="highlight" >
+        <table><tr>
+          <td class="linenos" title="click to toggle"
+            onclick="with (this.firstChild.style)
+                     { display = (display == '') ? 'none' : '' }">
+            <pre>1
+            2</pre>
+          </td>
+          <td class="code">
+            <pre><span class="Ke">def </span><span class="NaFu">foo</span>(bar):
+              <span class="Ke">pass</span>
+            </pre>
+          </td>
+        </tr></table></div>
+
+    (whitespace added to improve clarity).
+
+    Wrapping can be disabled using the `nowrap` option.
+
+    A list of lines can be specified using the `hl_lines` option to make these
+    lines highlighted (as of Pygments 0.11).
+
+    With the `full` option, a complete HTML 4 document is output, including
+    the style definitions inside a ``<style>`` tag, or in a separate file if
+    the `cssfile` option is given.
+
+    When `tagsfile` is set to the path of a ctags index file, it is used to
+    generate hyperlinks from names to their definition.  You must enable
+    `lineanchors` and run ctags with the `-n` option for this to work.  The
+    `python-ctags` module from PyPI must be installed to use this feature;
+    otherwise a `RuntimeError` will be raised.
+
+    The `get_style_defs(arg='')` method of a `HtmlFormatter` returns a string
+    containing CSS rules for the CSS classes used by the formatter. The
+    argument `arg` can be used to specify additional CSS selectors that
+    are prepended to the classes. A call `fmter.get_style_defs('td .code')`
+    would result in the following CSS classes:
+
+    .. sourcecode:: css
+
+        td .code .kw { font-weight: bold; color: #00FF00 }
+        td .code .cm { color: #999999 }
+        ...
+
+    If you have Pygments 0.6 or higher, you can also pass a list or tuple to the
+    `get_style_defs()` method to request multiple prefixes for the tokens:
+
+    .. sourcecode:: python
+
+        formatter.get_style_defs(['div.syntax pre', 'pre.syntax'])
+
+    The output would then look like this:
+
+    .. sourcecode:: css
+
+        div.syntax pre .kw,
+        pre.syntax .kw { font-weight: bold; color: #00FF00 }
+        div.syntax pre .cm,
+        pre.syntax .cm { color: #999999 }
+        ...
+
+    Additional options accepted:
+
+    `nowrap`
+        If set to ``True``, don't wrap the tokens at all, not even inside a ``<pre>``
+        tag. This disables most other options (default: ``False``).
+
+    `full`
+        Tells the formatter to output a "full" document, i.e. a complete
+        self-contained document (default: ``False``).
+
+    `title`
+        If `full` is true, the title that should be used to caption the
+        document (default: ``''``).
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``). This option has no effect if the `cssfile`
+        and `noclobber_cssfile` option are given and the file specified in
+        `cssfile` exists.
+
+    `noclasses`
+        If set to true, token ``<span>`` tags will not use CSS classes, but
+        inline styles. This is not recommended for larger pieces of code since
+        it increases output size by quite a bit (default: ``False``).
+
+    `classprefix`
+        Since the token types use relatively short class names, they may clash
+        with some of your own class names. In this case you can use the
+        `classprefix` option to give a string to prepend to all Pygments-generated
+        CSS class names for token types.
+        Note that this option also affects the output of `get_style_defs()`.
+
+    `cssclass`
+        CSS class for the wrapping ``<div>`` tag (default: ``'highlight'``).
+        If you set this option, the default selector for `get_style_defs()`
+        will be this class.
+
+        .. versionadded:: 0.9
+           If you select the ``'table'`` line numbers, the wrapping table will
+           have a CSS class of this string plus ``'table'``, the default is
+           accordingly ``'highlighttable'``.
+
+    `cssstyles`
+        Inline CSS styles for the wrapping ``<div>`` tag (default: ``''``).
+
+    `prestyles`
+        Inline CSS styles for the ``<pre>`` tag (default: ``''``).
+
+        .. versionadded:: 0.11
+
+    `cssfile`
+        If the `full` option is true and this option is given, it must be the
+        name of an external file. If the filename does not include an absolute
+        path, the file's path will be assumed to be relative to the main output
+        file's path, if the latter can be found. The stylesheet is then written
+        to this file instead of the HTML file.
+
+        .. versionadded:: 0.6
+
+    `noclobber_cssfile`
+        If `cssfile` is given and the specified file exists, the css file will
+        not be overwritten. This allows the use of the `full` option in
+        combination with a user specified css file. Default is ``False``.
+
+        .. versionadded:: 1.1
+
+    `linenos`
+        If set to ``'table'``, output line numbers as a table with two cells,
+        one containing the line numbers, the other the whole code.  This is
+        copy-and-paste-friendly, but may cause alignment problems with some
+        browsers or fonts.  If set to ``'inline'``, the line numbers will be
+        integrated in the ``<pre>`` tag that contains the code (that setting
+        is *new in Pygments 0.8*).
+
+        For compatibility with Pygments 0.7 and earlier, every true value
+        except ``'inline'`` means the same as ``'table'`` (in particular, that
+        means also ``True``).
+
+        The default value is ``False``, which means no line numbers at all.
+
+        **Note:** with the default ("table") line number mechanism, the line
+        numbers and code can have different line heights in Internet Explorer
+        unless you give the enclosing ``<pre>`` tags an explicit ``line-height``
+        CSS property (you get the default line spacing with ``line-height:
+        125%``).
+
+    `hl_lines`
+        Specify a list of lines to be highlighted.
+
+        .. versionadded:: 0.11
+
+    `linenostart`
+        The line number for the first line (default: ``1``).
+
+    `linenostep`
+        If set to a number n > 1, only every nth line number is printed.
+
+    `linenospecial`
+        If set to a number n > 0, every nth line number is given the CSS
+        class ``"special"`` (default: ``0``).
+
+    `nobackground`
+        If set to ``True``, the formatter won't output the background color
+        for the wrapping element (this automatically defaults to ``False``
+        when there is no wrapping element [eg: no argument for the
+        `get_syntax_defs` method given]) (default: ``False``).
+
+        .. versionadded:: 0.6
+
+    `lineseparator`
+        This string is output between lines of code. It defaults to ``"\n"``,
+        which is enough to break a line inside ``<pre>`` tags, but you can
+        e.g. set it to ``"<br>"`` to get HTML line breaks.
+
+        .. versionadded:: 0.7
+
+    `lineanchors`
+        If set to a nonempty string, e.g. ``foo``, the formatter will wrap each
+        output line in an anchor tag with a ``name`` of ``foo-linenumber``.
+        This allows easy linking to certain lines.
+
+        .. versionadded:: 0.9
+
+    `linespans`
+        If set to a nonempty string, e.g. ``foo``, the formatter will wrap each
+        output line in a span tag with an ``id`` of ``foo-linenumber``.
+        This allows easy access to lines via javascript.
+
+        .. versionadded:: 1.6
+
+    `anchorlinenos`
+        If set to `True`, will wrap line numbers in <a> tags. Used in
+        combination with `linenos` and `lineanchors`.
+
+    `tagsfile`
+        If set to the path of a ctags file, wrap names in anchor tags that
+        link to their definitions. `lineanchors` should be used, and the
+        tags file should specify line numbers (see the `-n` option to ctags).
+
+        .. versionadded:: 1.6
+
+    `tagurlformat`
+        A string formatting pattern used to generate links to ctags definitions.
+        Available variables are `%(path)s`, `%(fname)s` and `%(fext)s`.
+        Defaults to an empty string, resulting in just `#prefix-number` links.
+
+        .. versionadded:: 1.6
+
+    `filename`
+        A string used to generate a filename when rendering <pre> blocks,
+        for example if displaying source code.
+
+        .. versionadded:: 2.1
+
+
+    **Subclassing the HTML formatter**
+
+    .. versionadded:: 0.7
+
+    The HTML formatter is now built in a way that allows easy subclassing, thus
+    customizing the output HTML code. The `format()` method calls
+    `self._format_lines()` which returns a generator that yields tuples of ``(1,
+    line)``, where the ``1`` indicates that the ``line`` is a line of the
+    formatted source code.
+
+    If the `nowrap` option is set, the generator is the iterated over and the
+    resulting HTML is output.
+
+    Otherwise, `format()` calls `self.wrap()`, which wraps the generator with
+    other generators. These may add some HTML code to the one generated by
+    `_format_lines()`, either by modifying the lines generated by the latter,
+    then yielding them again with ``(1, line)``, and/or by yielding other HTML
+    code before or after the lines, with ``(0, html)``. The distinction between
+    source lines and other code makes it possible to wrap the generator multiple
+    times.
+
+    The default `wrap()` implementation adds a ``<div>`` and a ``<pre>`` tag.
+
+    A custom `HtmlFormatter` subclass could look like this:
+
+    .. sourcecode:: python
+
+        class CodeHtmlFormatter(HtmlFormatter):
+
+            def wrap(self, source, outfile):
+                return self._wrap_code(source)
+
+            def _wrap_code(self, source):
+                yield 0, '<code>'
+                for i, t in source:
+                    if i == 1:
+                        # it's a line of formatted code
+                        t += '<br>'
+                    yield i, t
+                yield 0, '</code>'
+
+    This results in wrapping the formatted lines with a ``<code>`` tag, where the
+    source lines are broken using ``<br>`` tags.
+
+    After calling `wrap()`, the `format()` method also adds the "line numbers"
+    and/or "full document" wrappers if the respective options are set. Then, all
+    HTML yielded by the wrapped generator is output.
+    """
+
+    name = 'HTML'
+    aliases = ['html']
+    filenames = ['*.html', '*.htm']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.title = self._decodeifneeded(self.title)
+        self.nowrap = get_bool_opt(options, 'nowrap', False)
+        self.noclasses = get_bool_opt(options, 'noclasses', False)
+        self.classprefix = options.get('classprefix', '')
+        self.cssclass = self._decodeifneeded(options.get('cssclass', 'highlight'))
+        self.cssstyles = self._decodeifneeded(options.get('cssstyles', ''))
+        self.prestyles = self._decodeifneeded(options.get('prestyles', ''))
+        self.cssfile = self._decodeifneeded(options.get('cssfile', ''))
+        self.noclobber_cssfile = get_bool_opt(options, 'noclobber_cssfile', False)
+        self.tagsfile = self._decodeifneeded(options.get('tagsfile', ''))
+        self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))
+        self.filename = self._decodeifneeded(options.get('filename', ''))
+
+        if self.tagsfile:
+            if not ctags:
+                raise RuntimeError('The "ctags" package must to be installed '
+                                   'to be able to use the "tagsfile" feature.')
+            self._ctags = ctags.CTags(self.tagsfile)
+
+        linenos = options.get('linenos', False)
+        if linenos == 'inline':
+            self.linenos = 2
+        elif linenos:
+            # compatibility with <= 0.7
+            self.linenos = 1
+        else:
+            self.linenos = 0
+        self.linenostart = abs(get_int_opt(options, 'linenostart', 1))
+        self.linenostep = abs(get_int_opt(options, 'linenostep', 1))
+        self.linenospecial = abs(get_int_opt(options, 'linenospecial', 0))
+        self.nobackground = get_bool_opt(options, 'nobackground', False)
+        self.lineseparator = options.get('lineseparator', '\n')
+        self.lineanchors = options.get('lineanchors', '')
+        self.linespans = options.get('linespans', '')
+        self.anchorlinenos = options.get('anchorlinenos', False)
+        self.hl_lines = set()
+        for lineno in get_list_opt(options, 'hl_lines', []):
+            try:
+                self.hl_lines.add(int(lineno))
+            except ValueError:
+                pass
+
+        self._create_stylesheet()
+
+    def _get_css_class(self, ttype):
+        """Return the css class of this token type prefixed with
+        the classprefix option."""
+        ttypeclass = _get_ttype_class(ttype)
+        if ttypeclass:
+            return self.classprefix + ttypeclass
+        return ''
+
+    def _get_css_classes(self, ttype):
+        """Return the css classes of this token type prefixed with
+        the classprefix option."""
+        cls = self._get_css_class(ttype)
+        while ttype not in STANDARD_TYPES:
+            ttype = ttype.parent
+            cls = self._get_css_class(ttype) + ' ' + cls
+        return cls
+
+    def _create_stylesheet(self):
+        t2c = self.ttype2class = {Token: ''}
+        c2s = self.class2style = {}
+        for ttype, ndef in self.style:
+            name = self._get_css_class(ttype)
+            style = ''
+            if ndef['color']:
+                style += 'color: #%s; ' % ndef['color']
+            if ndef['bold']:
+                style += 'font-weight: bold; '
+            if ndef['italic']:
+                style += 'font-style: italic; '
+            if ndef['underline']:
+                style += 'text-decoration: underline; '
+            if ndef['bgcolor']:
+                style += 'background-color: #%s; ' % ndef['bgcolor']
+            if ndef['border']:
+                style += 'border: 1px solid #%s; ' % ndef['border']
+            if style:
+                t2c[ttype] = name
+                # save len(ttype) to enable ordering the styles by
+                # hierarchy (necessary for CSS cascading rules!)
+                c2s[name] = (style[:-2], ttype, len(ttype))
+
+    def get_style_defs(self, arg=None):
+        """
+        Return CSS style definitions for the classes produced by the current
+        highlighting style. ``arg`` can be a string or list of selectors to
+        insert before the token type classes.
+        """
+        if arg is None:
+            arg = ('cssclass' in self.options and '.'+self.cssclass or '')
+        if isinstance(arg, string_types):
+            args = [arg]
+        else:
+            args = list(arg)
+
+        def prefix(cls):
+            if cls:
+                cls = '.' + cls
+            tmp = []
+            for arg in args:
+                tmp.append((arg and arg + ' ' or '') + cls)
+            return ', '.join(tmp)
+
+        styles = [(level, ttype, cls, style)
+                  for cls, (style, ttype, level) in iteritems(self.class2style)
+                  if cls and style]
+        styles.sort()
+        lines = ['%s { %s } /* %s */' % (prefix(cls), style, repr(ttype)[6:])
+                 for (level, ttype, cls, style) in styles]
+        if arg and not self.nobackground and \
+           self.style.background_color is not None:
+            text_style = ''
+            if Text in self.ttype2class:
+                text_style = ' ' + self.class2style[self.ttype2class[Text]][0]
+            lines.insert(0, '%s { background: %s;%s }' %
+                         (prefix(''), self.style.background_color, text_style))
+        if self.style.highlight_color is not None:
+            lines.insert(0, '%s.hll { background-color: %s }' %
+                         (prefix(''), self.style.highlight_color))
+        return '\n'.join(lines)
+
+    def _decodeifneeded(self, value):
+        if isinstance(value, bytes):
+            if self.encoding:
+                return value.decode(self.encoding)
+            return value.decode()
+        return value
+
+    def _wrap_full(self, inner, outfile):
+        if self.cssfile:
+            if os.path.isabs(self.cssfile):
+                # it's an absolute filename
+                cssfilename = self.cssfile
+            else:
+                try:
+                    filename = outfile.name
+                    if not filename or filename[0] == '<':
+                        # pseudo files, e.g. name == '<fdopen>'
+                        raise AttributeError
+                    cssfilename = os.path.join(os.path.dirname(filename),
+                                               self.cssfile)
+                except AttributeError:
+                    print('Note: Cannot determine output file name, '
+                          'using current directory as base for the CSS file name',
+                          file=sys.stderr)
+                    cssfilename = self.cssfile
+            # write CSS file only if noclobber_cssfile isn't given as an option.
+            try:
+                if not os.path.exists(cssfilename) or not self.noclobber_cssfile:
+                    cf = open(cssfilename, "w")
+                    cf.write(CSSFILE_TEMPLATE %
+                             {'styledefs': self.get_style_defs('body')})
+                    cf.close()
+            except IOError as err:
+                err.strerror = 'Error writing CSS file: ' + err.strerror
+                raise
+
+            yield 0, (DOC_HEADER_EXTERNALCSS %
+                      dict(title=self.title,
+                           cssfile=self.cssfile,
+                           encoding=self.encoding))
+        else:
+            yield 0, (DOC_HEADER %
+                      dict(title=self.title,
+                           styledefs=self.get_style_defs('body'),
+                           encoding=self.encoding))
+
+        for t, line in inner:
+            yield t, line
+        yield 0, DOC_FOOTER
+
+    def _wrap_tablelinenos(self, inner):
+        dummyoutfile = StringIO()
+        lncount = 0
+        for t, line in inner:
+            if t:
+                lncount += 1
+            dummyoutfile.write(line)
+
+        fl = self.linenostart
+        mw = len(str(lncount + fl - 1))
+        sp = self.linenospecial
+        st = self.linenostep
+        la = self.lineanchors
+        aln = self.anchorlinenos
+        nocls = self.noclasses
+        if sp:
+            lines = []
+
+            for i in range(fl, fl+lncount):
+                if i % st == 0:
+                    if i % sp == 0:
+                        if aln:
+                            lines.append('<a href="#%s-%d" class="special">%*d</a>' %
+                                         (la, i, mw, i))
+                        else:
+                            lines.append('<span class="special">%*d</span>' % (mw, i))
+                    else:
+                        if aln:
+                            lines.append('<a href="#%s-%d">%*d</a>' % (la, i, mw, i))
+                        else:
+                            lines.append('%*d' % (mw, i))
+                else:
+                    lines.append('')
+            ls = '\n'.join(lines)
+        else:
+            lines = []
+            for i in range(fl, fl+lncount):
+                if i % st == 0:
+                    if aln:
+                        lines.append('<a href="#%s-%d">%*d</a>' % (la, i, mw, i))
+                    else:
+                        lines.append('%*d' % (mw, i))
+                else:
+                    lines.append('')
+            ls = '\n'.join(lines)
+
+        # in case you wonder about the seemingly redundant <div> here: since the
+        # content in the other cell also is wrapped in a div, some browsers in
+        # some configurations seem to mess up the formatting...
+        if nocls:
+            yield 0, ('<table class="%stable">' % self.cssclass +
+                      '<tr><td><div class="linenodiv" '
+                      'style="background-color: #f0f0f0; padding-right: 10px">'
+                      '<pre style="line-height: 125%">' +
+                      ls + '</pre></div></td><td class="code">')
+        else:
+            yield 0, ('<table class="%stable">' % self.cssclass +
+                      '<tr><td class="linenos"><div class="linenodiv"><pre>' +
+                      ls + '</pre></div></td><td class="code">')
+        yield 0, dummyoutfile.getvalue()
+        yield 0, '</td></tr></table>'
+
+    def _wrap_inlinelinenos(self, inner):
+        # need a list of lines since we need the width of a single number :(
+        lines = list(inner)
+        sp = self.linenospecial
+        st = self.linenostep
+        num = self.linenostart
+        mw = len(str(len(lines) + num - 1))
+
+        if self.noclasses:
+            if sp:
+                for t, line in lines:
+                    if num % sp == 0:
+                        style = 'background-color: #ffffc0; padding: 0 5px 0 5px'
+                    else:
+                        style = 'background-color: #f0f0f0; padding: 0 5px 0 5px'
+                    yield 1, '<span style="%s">%*s </span>' % (
+                        style, mw, (num % st and ' ' or num)) + line
+                    num += 1
+            else:
+                for t, line in lines:
+                    yield 1, ('<span style="background-color: #f0f0f0; '
+                              'padding: 0 5px 0 5px">%*s </span>' % (
+                                  mw, (num % st and ' ' or num)) + line)
+                    num += 1
+        elif sp:
+            for t, line in lines:
+                yield 1, '<span class="lineno%s">%*s </span>' % (
+                    num % sp == 0 and ' special' or '', mw,
+                    (num % st and ' ' or num)) + line
+                num += 1
+        else:
+            for t, line in lines:
+                yield 1, '<span class="lineno">%*s </span>' % (
+                    mw, (num % st and ' ' or num)) + line
+                num += 1
+
+    def _wrap_lineanchors(self, inner):
+        s = self.lineanchors
+        # subtract 1 since we have to increment i *before* yielding
+        i = self.linenostart - 1
+        for t, line in inner:
+            if t:
+                i += 1
+                yield 1, '<a name="%s-%d"></a>' % (s, i) + line
+            else:
+                yield 0, line
+
+    def _wrap_linespans(self, inner):
+        s = self.linespans
+        i = self.linenostart - 1
+        for t, line in inner:
+            if t:
+                i += 1
+                yield 1, '<span id="%s-%d">%s</span>' % (s, i, line)
+            else:
+                yield 0, line
+
+    def _wrap_div(self, inner):
+        style = []
+        if (self.noclasses and not self.nobackground and
+                self.style.background_color is not None):
+            style.append('background: %s' % (self.style.background_color,))
+        if self.cssstyles:
+            style.append(self.cssstyles)
+        style = '; '.join(style)
+
+        yield 0, ('<div' + (self.cssclass and ' class="%s"' % self.cssclass) +
+                  (style and (' style="%s"' % style)) + '>')
+        for tup in inner:
+            yield tup
+        yield 0, '</div>\n'
+
+    def _wrap_pre(self, inner):
+        style = []
+        if self.prestyles:
+            style.append(self.prestyles)
+        if self.noclasses:
+            style.append('line-height: 125%')
+        style = '; '.join(style)
+
+        if self.filename:
+            yield 0, ('<span class="filename">' + self.filename + '</span>')
+
+        # the empty span here is to keep leading empty lines from being
+        # ignored by HTML parsers
+        yield 0, ('<pre' + (style and ' style="%s"' % style) + '><span></span>')
+        for tup in inner:
+            yield tup
+        yield 0, '</pre>'
+
+    def _format_lines(self, tokensource):
+        """
+        Just format the tokens, without any wrapping tags.
+        Yield individual lines.
+        """
+        nocls = self.noclasses
+        lsep = self.lineseparator
+        # for <span style=""> lookup only
+        getcls = self.ttype2class.get
+        c2s = self.class2style
+        escape_table = _escape_html_table
+        tagsfile = self.tagsfile
+
+        lspan = ''
+        line = []
+        for ttype, value in tokensource:
+            if nocls:
+                cclass = getcls(ttype)
+                while cclass is None:
+                    ttype = ttype.parent
+                    cclass = getcls(ttype)
+                cspan = cclass and '<span style="%s">' % c2s[cclass][0] or ''
+            else:
+                cls = self._get_css_classes(ttype)
+                cspan = cls and '<span class="%s">' % cls or ''
+
+            parts = value.translate(escape_table).split('\n')
+
+            if tagsfile and ttype in Token.Name:
+                filename, linenumber = self._lookup_ctag(value)
+                if linenumber:
+                    base, filename = os.path.split(filename)
+                    if base:
+                        base += '/'
+                    filename, extension = os.path.splitext(filename)
+                    url = self.tagurlformat % {'path': base, 'fname': filename,
+                                               'fext': extension}
+                    parts[0] = "<a href=\"%s#%s-%d\">%s" % \
+                        (url, self.lineanchors, linenumber, parts[0])
+                    parts[-1] = parts[-1] + "</a>"
+
+            # for all but the last line
+            for part in parts[:-1]:
+                if line:
+                    if lspan != cspan:
+                        line.extend(((lspan and '</span>'), cspan, part,
+                                     (cspan and '</span>'), lsep))
+                    else:  # both are the same
+                        line.extend((part, (lspan and '</span>'), lsep))
+                    yield 1, ''.join(line)
+                    line = []
+                elif part:
+                    yield 1, ''.join((cspan, part, (cspan and '</span>'), lsep))
+                else:
+                    yield 1, lsep
+            # for the last line
+            if line and parts[-1]:
+                if lspan != cspan:
+                    line.extend(((lspan and '</span>'), cspan, parts[-1]))
+                    lspan = cspan
+                else:
+                    line.append(parts[-1])
+            elif parts[-1]:
+                line = [cspan, parts[-1]]
+                lspan = cspan
+            # else we neither have to open a new span nor set lspan
+
+        if line:
+            line.extend(((lspan and '</span>'), lsep))
+            yield 1, ''.join(line)
+
+    def _lookup_ctag(self, token):
+        entry = ctags.TagEntry()
+        if self._ctags.find(entry, token, 0):
+            return entry['file'], entry['lineNumber']
+        else:
+            return None, None
+
+    def _highlight_lines(self, tokensource):
+        """
+        Highlighted the lines specified in the `hl_lines` option by
+        post-processing the token stream coming from `_format_lines`.
+        """
+        hls = self.hl_lines
+
+        for i, (t, value) in enumerate(tokensource):
+            if t != 1:
+                yield t, value
+            if i + 1 in hls:  # i + 1 because Python indexes start at 0
+                if self.noclasses:
+                    style = ''
+                    if self.style.highlight_color is not None:
+                        style = (' style="background-color: %s"' %
+                                 (self.style.highlight_color,))
+                    yield 1, '<span%s>%s</span>' % (style, value)
+                else:
+                    yield 1, '<span class="hll">%s</span>' % value
+            else:
+                yield 1, value
+
+    def wrap(self, source, outfile):
+        """
+        Wrap the ``source``, which is a generator yielding
+        individual lines, in custom generators. See docstring
+        for `format`. Can be overridden.
+        """
+        return self._wrap_div(self._wrap_pre(source))
+
+    def format_unencoded(self, tokensource, outfile):
+        """
+        The formatting process uses several nested generators; which of
+        them are used is determined by the user's options.
+
+        Each generator should take at least one argument, ``inner``,
+        and wrap the pieces of text generated by this.
+
+        Always yield 2-tuples: (code, text). If "code" is 1, the text
+        is part of the original tokensource being highlighted, if it's
+        0, the text is some piece of wrapping. This makes it possible to
+        use several different wrappers that process the original source
+        linewise, e.g. line number generators.
+        """
+        source = self._format_lines(tokensource)
+        if self.hl_lines:
+            source = self._highlight_lines(source)
+        if not self.nowrap:
+            if self.linenos == 2:
+                source = self._wrap_inlinelinenos(source)
+            if self.lineanchors:
+                source = self._wrap_lineanchors(source)
+            if self.linespans:
+                source = self._wrap_linespans(source)
+            source = self.wrap(source, outfile)
+            if self.linenos == 1:
+                source = self._wrap_tablelinenos(source)
+            if self.full:
+                source = self._wrap_full(source, outfile)
+
+        for t, piece in source:
+            outfile.write(piece)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/terminal256.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/terminal256.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/terminal256.py	(revision 1126)
@@ -0,0 +1,309 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters.terminal256
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for 256-color terminal output with ANSI sequences.
+
+    RGB-to-XTERM color conversion routines adapted from xterm256-conv
+    tool (http://frexx.de/xterm-256-notes/data/xterm256-conv2.tar.bz2)
+    by Wolfgang Frisch.
+
+    Formatter version 1.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# TODO:
+#  - Options to map style's bold/underline/italic/border attributes
+#    to some ANSI attrbutes (something like 'italic=underline')
+#  - An option to output "style RGB to xterm RGB/index" conversion table
+#  - An option to indicate that we are running in "reverse background"
+#    xterm. This means that default colors are white-on-black, not
+#    black-on-while, so colors like "white background" need to be converted
+#    to "white background, black foreground", etc...
+
+import sys
+
+from pygments.formatter import Formatter
+from pygments.console import codes
+from pygments.style import ansicolors
+
+
+__all__ = ['Terminal256Formatter', 'TerminalTrueColorFormatter']
+
+
+class EscapeSequence:
+    def __init__(self, fg=None, bg=None, bold=False, underline=False):
+        self.fg = fg
+        self.bg = bg
+        self.bold = bold
+        self.underline = underline
+
+    def escape(self, attrs):
+        if len(attrs):
+            return "\x1b[" + ";".join(attrs) + "m"
+        return ""
+
+    def color_string(self):
+        attrs = []
+        if self.fg is not None:
+            if self.fg in ansicolors:
+                esc = codes[self.fg[5:]]
+                if ';01m' in esc:
+                    self.bold = True
+                # extract fg color code.
+                attrs.append(esc[2:4])
+            else:
+                attrs.extend(("38", "5", "%i" % self.fg))
+        if self.bg is not None:
+            if self.bg in ansicolors:
+                esc = codes[self.bg[5:]]
+                # extract fg color code, add 10 for bg.
+                attrs.append(str(int(esc[2:4])+10))
+            else:
+                attrs.extend(("48", "5", "%i" % self.bg))
+        if self.bold:
+            attrs.append("01")
+        if self.underline:
+            attrs.append("04")
+        return self.escape(attrs)
+
+    def true_color_string(self):
+        attrs = []
+        if self.fg:
+            attrs.extend(("38", "2", str(self.fg[0]), str(self.fg[1]), str(self.fg[2])))
+        if self.bg:
+            attrs.extend(("48", "2", str(self.bg[0]), str(self.bg[1]), str(self.bg[2])))
+        if self.bold:
+            attrs.append("01")
+        if self.underline:
+            attrs.append("04")
+        return self.escape(attrs)
+
+    def reset_string(self):
+        attrs = []
+        if self.fg is not None:
+            attrs.append("39")
+        if self.bg is not None:
+            attrs.append("49")
+        if self.bold or self.underline:
+            attrs.append("00")
+        return self.escape(attrs)
+
+
+class Terminal256Formatter(Formatter):
+    """
+    Format tokens with ANSI color sequences, for output in a 256-color
+    terminal or console.  Like in `TerminalFormatter` color sequences
+    are terminated at newlines, so that paging the output works correctly.
+
+    The formatter takes colors from a style defined by the `style` option
+    and converts them to nearest ANSI 256-color escape sequences. Bold and
+    underline attributes from the style are preserved (and displayed).
+
+    .. versionadded:: 0.9
+
+    .. versionchanged:: 2.2
+       If the used style defines foreground colors in the form ``#ansi*``, then
+       `Terminal256Formatter` will map these to non extended foreground color.
+       See :ref:`AnsiTerminalStyle` for more information.
+
+    Options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+    """
+    name = 'Terminal256'
+    aliases = ['terminal256', 'console256', '256']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+
+        self.xterm_colors = []
+        self.best_match = {}
+        self.style_string = {}
+
+        self.usebold = 'nobold' not in options
+        self.useunderline = 'nounderline' not in options
+
+        self._build_color_table()  # build an RGB-to-256 color conversion table
+        self._setup_styles()  # convert selected style's colors to term. colors
+
+    def _build_color_table(self):
+        # colors 0..15: 16 basic colors
+
+        self.xterm_colors.append((0x00, 0x00, 0x00))  # 0
+        self.xterm_colors.append((0xcd, 0x00, 0x00))  # 1
+        self.xterm_colors.append((0x00, 0xcd, 0x00))  # 2
+        self.xterm_colors.append((0xcd, 0xcd, 0x00))  # 3
+        self.xterm_colors.append((0x00, 0x00, 0xee))  # 4
+        self.xterm_colors.append((0xcd, 0x00, 0xcd))  # 5
+        self.xterm_colors.append((0x00, 0xcd, 0xcd))  # 6
+        self.xterm_colors.append((0xe5, 0xe5, 0xe5))  # 7
+        self.xterm_colors.append((0x7f, 0x7f, 0x7f))  # 8
+        self.xterm_colors.append((0xff, 0x00, 0x00))  # 9
+        self.xterm_colors.append((0x00, 0xff, 0x00))  # 10
+        self.xterm_colors.append((0xff, 0xff, 0x00))  # 11
+        self.xterm_colors.append((0x5c, 0x5c, 0xff))  # 12
+        self.xterm_colors.append((0xff, 0x00, 0xff))  # 13
+        self.xterm_colors.append((0x00, 0xff, 0xff))  # 14
+        self.xterm_colors.append((0xff, 0xff, 0xff))  # 15
+
+        # colors 16..232: the 6x6x6 color cube
+
+        valuerange = (0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff)
+
+        for i in range(217):
+            r = valuerange[(i // 36) % 6]
+            g = valuerange[(i // 6) % 6]
+            b = valuerange[i % 6]
+            self.xterm_colors.append((r, g, b))
+
+        # colors 233..253: grayscale
+
+        for i in range(1, 22):
+            v = 8 + i * 10
+            self.xterm_colors.append((v, v, v))
+
+    def _closest_color(self, r, g, b):
+        distance = 257*257*3  # "infinity" (>distance from #000000 to #ffffff)
+        match = 0
+
+        for i in range(0, 254):
+            values = self.xterm_colors[i]
+
+            rd = r - values[0]
+            gd = g - values[1]
+            bd = b - values[2]
+            d = rd*rd + gd*gd + bd*bd
+
+            if d < distance:
+                match = i
+                distance = d
+        return match
+
+    def _color_index(self, color):
+        index = self.best_match.get(color, None)
+        if color in ansicolors:
+            # strip the `#ansi` part and look up code
+            index = color
+            self.best_match[color] = index
+        if index is None:
+            try:
+                rgb = int(str(color), 16)
+            except ValueError:
+                rgb = 0
+
+            r = (rgb >> 16) & 0xff
+            g = (rgb >> 8) & 0xff
+            b = rgb & 0xff
+            index = self._closest_color(r, g, b)
+            self.best_match[color] = index
+        return index
+
+    def _setup_styles(self):
+        for ttype, ndef in self.style:
+            escape = EscapeSequence()
+            # get foreground from ansicolor if set
+            if ndef['ansicolor']:
+                escape.fg = self._color_index(ndef['ansicolor'])
+            elif ndef['color']:
+                escape.fg = self._color_index(ndef['color'])
+            if ndef['bgansicolor']:
+                escape.bg = self._color_index(ndef['bgansicolor'])
+            elif ndef['bgcolor']:
+                escape.bg = self._color_index(ndef['bgcolor'])
+            if self.usebold and ndef['bold']:
+                escape.bold = True
+            if self.useunderline and ndef['underline']:
+                escape.underline = True
+            self.style_string[str(ttype)] = (escape.color_string(),
+                                             escape.reset_string())
+
+    def format(self, tokensource, outfile):
+        # hack: if the output is a terminal and has an encoding set,
+        # use that to avoid unicode encode problems
+        if not self.encoding and hasattr(outfile, "encoding") and \
+           hasattr(outfile, "isatty") and outfile.isatty() and \
+           sys.version_info < (3,):
+            self.encoding = outfile.encoding
+        return Formatter.format(self, tokensource, outfile)
+
+    def format_unencoded(self, tokensource, outfile):
+        for ttype, value in tokensource:
+            not_found = True
+            while ttype and not_found:
+                try:
+                    # outfile.write( "<" + str(ttype) + ">" )
+                    on, off = self.style_string[str(ttype)]
+
+                    # Like TerminalFormatter, add "reset colors" escape sequence
+                    # on newline.
+                    spl = value.split('\n')
+                    for line in spl[:-1]:
+                        if line:
+                            outfile.write(on + line + off)
+                        outfile.write('\n')
+                    if spl[-1]:
+                        outfile.write(on + spl[-1] + off)
+
+                    not_found = False
+                    # outfile.write( '#' + str(ttype) + '#' )
+
+                except KeyError:
+                    # ottype = ttype
+                    ttype = ttype[:-1]
+                    # outfile.write( '!' + str(ottype) + '->' + str(ttype) + '!' )
+
+            if not_found:
+                outfile.write(value)
+
+
+class TerminalTrueColorFormatter(Terminal256Formatter):
+    r"""
+    Format tokens with ANSI color sequences, for output in a true-color
+    terminal or console.  Like in `TerminalFormatter` color sequences
+    are terminated at newlines, so that paging the output works correctly.
+
+    .. versionadded:: 2.1
+
+    Options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+    """
+    name = 'TerminalTrueColor'
+    aliases = ['terminal16m', 'console16m', '16m']
+    filenames = []
+
+    def _build_color_table(self):
+        pass
+
+    def _color_tuple(self, color):
+        try:
+            rgb = int(str(color), 16)
+        except ValueError:
+            return None
+        r = (rgb >> 16) & 0xff
+        g = (rgb >> 8) & 0xff
+        b = rgb & 0xff
+        return (r, g, b)
+
+    def _setup_styles(self):
+        for ttype, ndef in self.style:
+            escape = EscapeSequence()
+            if ndef['color']:
+                escape.fg = self._color_tuple(ndef['color'])
+            if ndef['bgcolor']:
+                escape.bg = self._color_tuple(ndef['bgcolor'])
+            if self.usebold and ndef['bold']:
+                escape.bold = True
+            if self.useunderline and ndef['underline']:
+                escape.underline = True
+            self.style_string[str(ttype)] = (escape.true_color_string(),
+                                             escape.reset_string())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/_mapping.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/_mapping.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/_mapping.py	(revision 1126)
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatters._mapping
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter mapping definitions. This file is generated by itself. Everytime
+    you change something on a builtin formatter definition, run this script from
+    the formatters folder to update it.
+
+    Do not alter the FORMATTERS dictionary by hand.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+FORMATTERS = {
+    'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'),
+    'BmpImageFormatter': ('pygments.formatters.img', 'img_bmp', ('bmp', 'bitmap'), ('*.bmp',), 'Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'GifImageFormatter': ('pygments.formatters.img', 'img_gif', ('gif',), ('*.gif',), 'Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'HtmlFormatter': ('pygments.formatters.html', 'HTML', ('html',), ('*.html', '*.htm'), "Format tokens as HTML 4 ``<span>`` tags within a ``<pre>`` tag, wrapped in a ``<div>`` tag. The ``<div>``'s CSS class can be set by the `cssclass` option."),
+    'IRCFormatter': ('pygments.formatters.irc', 'IRC', ('irc', 'IRC'), (), 'Format tokens with IRC color sequences'),
+    'ImageFormatter': ('pygments.formatters.img', 'img', ('img', 'IMG', 'png'), ('*.png',), 'Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'JpgImageFormatter': ('pygments.formatters.img', 'img_jpg', ('jpg', 'jpeg'), ('*.jpg',), 'Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'LatexFormatter': ('pygments.formatters.latex', 'LaTeX', ('latex', 'tex'), ('*.tex',), 'Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages.'),
+    'NullFormatter': ('pygments.formatters.other', 'Text only', ('text', 'null'), ('*.txt',), 'Output the text unchanged without any formatting.'),
+    'RawTokenFormatter': ('pygments.formatters.other', 'Raw tokens', ('raw', 'tokens'), ('*.raw',), 'Format tokens as a raw representation for storing token streams.'),
+    'RtfFormatter': ('pygments.formatters.rtf', 'RTF', ('rtf',), ('*.rtf',), 'Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents.'),
+    'SvgFormatter': ('pygments.formatters.svg', 'SVG', ('svg',), ('*.svg',), 'Format tokens as an SVG graphics file.  This formatter is still experimental. Each line of code is a ``<text>`` element with explicit ``x`` and ``y`` coordinates containing ``<tspan>`` elements with the individual token styles.'),
+    'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'),
+    'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'),
+    'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'),
+    'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.')
+}
+
+if __name__ == '__main__':  # pragma: no cover
+    import sys
+    import os
+
+    # lookup formatters
+    found_formatters = []
+    imports = []
+    sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
+    from pygments.util import docstring_headline
+
+    for root, dirs, files in os.walk('.'):
+        for filename in files:
+            if filename.endswith('.py') and not filename.startswith('_'):
+                module_name = 'pygments.formatters%s.%s' % (
+                    root[1:].replace('/', '.'), filename[:-3])
+                print(module_name)
+                module = __import__(module_name, None, None, [''])
+                for formatter_name in module.__all__:
+                    formatter = getattr(module, formatter_name)
+                    found_formatters.append(
+                        '%r: %r' % (formatter_name,
+                                    (module_name,
+                                     formatter.name,
+                                     tuple(formatter.aliases),
+                                     tuple(formatter.filenames),
+                                     docstring_headline(formatter))))
+    # sort them to make the diff minimal
+    found_formatters.sort()
+
+    # extract useful sourcecode from this file
+    with open(__file__) as fp:
+        content = fp.read()
+        # replace crnl to nl for Windows.
+        #
+        # Note that, originally, contributers should keep nl of master
+        # repository, for example by using some kind of automatic
+        # management EOL, like `EolExtension
+        #  <https://www.mercurial-scm.org/wiki/EolExtension>`.
+        content = content.replace("\r\n", "\n")
+    header = content[:content.find('FORMATTERS = {')]
+    footer = content[content.find("if __name__ == '__main__':"):]
+
+    # write new file
+    with open(__file__, 'w') as fp:
+        fp.write(header)
+        fp.write('FORMATTERS = {\n    %s\n}\n\n' % ',\n    '.join(found_formatters))
+        fp.write(footer)
+
+    print ('=== %d formatters processed.' % len(found_formatters))

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatters/_mapping.py
___________________________________________________________________
Added: svn:executable
   + *

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/__init__.py	(revision 1126)
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+"""
+    Pygments
+    ~~~~~~~~
+
+    Pygments is a syntax highlighting package written in Python.
+
+    It is a generic syntax highlighter for general use in all kinds of software
+    such as forum systems, wikis or other applications that need to prettify
+    source code. Highlights are:
+
+    * a wide range of common languages and markup formats is supported
+    * special attention is paid to details, increasing quality by a fair amount
+    * support for new languages and formats are added easily
+    * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image
+      formats that PIL supports, and ANSI sequences
+    * it is usable as a command-line tool and as a library
+    * ... and it highlights even Brainfuck!
+
+    The `Pygments tip`_ is installable with ``easy_install Pygments==dev``.
+
+    .. _Pygments tip:
+       http://bitbucket.org/birkenfeld/pygments-main/get/tip.zip#egg=Pygments-dev
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import sys
+
+from pygments.util import StringIO, BytesIO
+
+__version__ = '2.2.0'
+__docformat__ = 'restructuredtext'
+
+__all__ = ['lex', 'format', 'highlight']
+
+
+def lex(code, lexer):
+    """
+    Lex ``code`` with ``lexer`` and return an iterable of tokens.
+    """
+    try:
+        return lexer.get_tokens(code)
+    except TypeError as err:
+        if (isinstance(err.args[0], str) and
+            ('unbound method get_tokens' in err.args[0] or
+             'missing 1 required positional argument' in err.args[0])):
+            raise TypeError('lex() argument must be a lexer instance, '
+                            'not a class')
+        raise
+
+
+def format(tokens, formatter, outfile=None):  # pylint: disable=redefined-builtin
+    """
+    Format a tokenlist ``tokens`` with the formatter ``formatter``.
+
+    If ``outfile`` is given and a valid file object (an object
+    with a ``write`` method), the result will be written to it, otherwise
+    it is returned as a string.
+    """
+    try:
+        if not outfile:
+            realoutfile = getattr(formatter, 'encoding', None) and BytesIO() or StringIO()
+            formatter.format(tokens, realoutfile)
+            return realoutfile.getvalue()
+        else:
+            formatter.format(tokens, outfile)
+    except TypeError as err:
+        if (isinstance(err.args[0], str) and
+            ('unbound method format' in err.args[0] or
+             'missing 1 required positional argument' in err.args[0])):
+            raise TypeError('format() argument must be a formatter instance, '
+                            'not a class')
+        raise
+
+
+def highlight(code, lexer, formatter, outfile=None):
+    """
+    Lex ``code`` with ``lexer`` and format it with the formatter ``formatter``.
+
+    If ``outfile`` is given and a valid file object (an object
+    with a ``write`` method), the result will be written to it, otherwise
+    it is returned as a string.
+    """
+    return format(lex(code, lexer), formatter, outfile)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    from pygments.cmdline import main
+    sys.exit(main(sys.argv))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/style.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/style.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/style.py	(revision 1126)
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.style
+    ~~~~~~~~~~~~~~
+
+    Basic style object.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.token import Token, STANDARD_TYPES
+from pygments.util import add_metaclass
+
+# Default mapping of #ansixxx to RGB colors.
+_ansimap = {
+    # dark
+    '#ansiblack': '000000',
+    '#ansidarkred': '7f0000',
+    '#ansidarkgreen': '007f00',
+    '#ansibrown': '7f7fe0',
+    '#ansidarkblue': '00007f',
+    '#ansipurple': '7f007f',
+    '#ansiteal': '007f7f',
+    '#ansilightgray': 'e5e5e5',
+    # normal
+    '#ansidarkgray': '555555',
+    '#ansired': 'ff0000',
+    '#ansigreen': '00ff00',
+    '#ansiyellow': 'ffff00',
+    '#ansiblue': '0000ff',
+    '#ansifuchsia': 'ff00ff',
+    '#ansiturquoise': '00ffff',
+    '#ansiwhite': 'ffffff',
+}
+ansicolors = set(_ansimap)
+
+
+class StyleMeta(type):
+
+    def __new__(mcs, name, bases, dct):
+        obj = type.__new__(mcs, name, bases, dct)
+        for token in STANDARD_TYPES:
+            if token not in obj.styles:
+                obj.styles[token] = ''
+
+        def colorformat(text):
+            if text in ansicolors:
+                return text
+            if text[0:1] == '#':
+                col = text[1:]
+                if len(col) == 6:
+                    return col
+                elif len(col) == 3:
+                    return col[0]*2 + col[1]*2 + col[2]*2
+            elif text == '':
+                return ''
+            assert False, "wrong color format %r" % text
+
+        _styles = obj._styles = {}
+
+        for ttype in obj.styles:
+            for token in ttype.split():
+                if token in _styles:
+                    continue
+                ndef = _styles.get(token.parent, None)
+                styledefs = obj.styles.get(token, '').split()
+                if not ndef or token is None:
+                    ndef = ['', 0, 0, 0, '', '', 0, 0, 0]
+                elif 'noinherit' in styledefs and token is not Token:
+                    ndef = _styles[Token][:]
+                else:
+                    ndef = ndef[:]
+                _styles[token] = ndef
+                for styledef in obj.styles.get(token, '').split():
+                    if styledef == 'noinherit':
+                        pass
+                    elif styledef == 'bold':
+                        ndef[1] = 1
+                    elif styledef == 'nobold':
+                        ndef[1] = 0
+                    elif styledef == 'italic':
+                        ndef[2] = 1
+                    elif styledef == 'noitalic':
+                        ndef[2] = 0
+                    elif styledef == 'underline':
+                        ndef[3] = 1
+                    elif styledef == 'nounderline':
+                        ndef[3] = 0
+                    elif styledef[:3] == 'bg:':
+                        ndef[4] = colorformat(styledef[3:])
+                    elif styledef[:7] == 'border:':
+                        ndef[5] = colorformat(styledef[7:])
+                    elif styledef == 'roman':
+                        ndef[6] = 1
+                    elif styledef == 'sans':
+                        ndef[7] = 1
+                    elif styledef == 'mono':
+                        ndef[8] = 1
+                    else:
+                        ndef[0] = colorformat(styledef)
+
+        return obj
+
+    def style_for_token(cls, token):
+        t = cls._styles[token]
+        ansicolor = bgansicolor = None
+        color = t[0]
+        if color.startswith('#ansi'):
+            ansicolor = color
+            color = _ansimap[color]
+        bgcolor = t[4]
+        if bgcolor.startswith('#ansi'):
+            bgansicolor = bgcolor
+            bgcolor = _ansimap[bgcolor]
+
+        return {
+            'color':        color or None,
+            'bold':         bool(t[1]),
+            'italic':       bool(t[2]),
+            'underline':    bool(t[3]),
+            'bgcolor':      bgcolor or None,
+            'border':       t[5] or None,
+            'roman':        bool(t[6]) or None,
+            'sans':         bool(t[7]) or None,
+            'mono':         bool(t[8]) or None,
+            'ansicolor':    ansicolor,
+            'bgansicolor':  bgansicolor,
+        }
+
+    def list_styles(cls):
+        return list(cls)
+
+    def styles_token(cls, ttype):
+        return ttype in cls._styles
+
+    def __iter__(cls):
+        for token in cls._styles:
+            yield token, cls.style_for_token(token)
+
+    def __len__(cls):
+        return len(cls._styles)
+
+
+@add_metaclass(StyleMeta)
+class Style(object):
+
+    #: overall background color (``None`` means transparent)
+    background_color = '#ffffff'
+
+    #: highlight background color
+    highlight_color = '#ffffcc'
+
+    #: Style definitions for individual token types.
+    styles = {}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/console.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/console.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/console.py	(revision 1126)
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.console
+    ~~~~~~~~~~~~~~~~
+
+    Format colored console output.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+esc = "\x1b["
+
+codes = {}
+codes[""] = ""
+codes["reset"] = esc + "39;49;00m"
+
+codes["bold"] = esc + "01m"
+codes["faint"] = esc + "02m"
+codes["standout"] = esc + "03m"
+codes["underline"] = esc + "04m"
+codes["blink"] = esc + "05m"
+codes["overline"] = esc + "06m"
+
+dark_colors = ["black", "darkred", "darkgreen", "brown", "darkblue",
+               "purple", "teal", "lightgray"]
+light_colors = ["darkgray", "red", "green", "yellow", "blue",
+                "fuchsia", "turquoise", "white"]
+
+x = 30
+for d, l in zip(dark_colors, light_colors):
+    codes[d] = esc + "%im" % x
+    codes[l] = esc + "%i;01m" % x
+    x += 1
+
+del d, l, x
+
+codes["darkteal"] = codes["turquoise"]
+codes["darkyellow"] = codes["brown"]
+codes["fuscia"] = codes["fuchsia"]
+codes["white"] = codes["bold"]
+
+
+def reset_color():
+    return codes["reset"]
+
+
+def colorize(color_key, text):
+    return codes[color_key] + text + codes["reset"]
+
+
+def ansiformat(attr, text):
+    """
+    Format ``text`` with a color and/or some attributes::
+
+        color       normal color
+        *color*     bold color
+        _color_     underlined color
+        +color+     blinking color
+    """
+    result = []
+    if attr[:1] == attr[-1:] == '+':
+        result.append(codes['blink'])
+        attr = attr[1:-1]
+    if attr[:1] == attr[-1:] == '*':
+        result.append(codes['bold'])
+        attr = attr[1:-1]
+    if attr[:1] == attr[-1:] == '_':
+        result.append(codes['underline'])
+        attr = attr[1:-1]
+    result.append(codes[attr])
+    result.append(text)
+    result.append(codes['reset'])
+    return ''.join(result)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatter.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatter.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/formatter.py	(revision 1126)
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.formatter
+    ~~~~~~~~~~~~~~~~~~
+
+    Base formatter class.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import codecs
+
+from pygments.util import get_bool_opt, string_types
+from pygments.styles import get_style_by_name
+
+__all__ = ['Formatter']
+
+
+def _lookup_style(style):
+    if isinstance(style, string_types):
+        return get_style_by_name(style)
+    return style
+
+
+class Formatter(object):
+    """
+    Converts a token stream to text.
+
+    Options accepted:
+
+    ``style``
+        The style to use, can be a string or a Style subclass
+        (default: "default"). Not used by e.g. the
+        TerminalFormatter.
+    ``full``
+        Tells the formatter to output a "full" document, i.e.
+        a complete self-contained document. This doesn't have
+        any effect for some formatters (default: false).
+    ``title``
+        If ``full`` is true, the title that should be used to
+        caption the document (default: '').
+    ``encoding``
+        If given, must be an encoding name. This will be used to
+        convert the Unicode token strings to byte strings in the
+        output. If it is "" or None, Unicode strings will be written
+        to the output file, which most file-like objects do not
+        support (default: None).
+    ``outencoding``
+        Overrides ``encoding`` if given.
+    """
+
+    #: Name of the formatter
+    name = None
+
+    #: Shortcuts for the formatter
+    aliases = []
+
+    #: fn match rules
+    filenames = []
+
+    #: If True, this formatter outputs Unicode strings when no encoding
+    #: option is given.
+    unicodeoutput = True
+
+    def __init__(self, **options):
+        self.style = _lookup_style(options.get('style', 'default'))
+        self.full = get_bool_opt(options, 'full', False)
+        self.title = options.get('title', '')
+        self.encoding = options.get('encoding', None) or None
+        if self.encoding in ('guess', 'chardet'):
+            # can happen for e.g. pygmentize -O encoding=guess
+            self.encoding = 'utf-8'
+        self.encoding = options.get('outencoding') or self.encoding
+        self.options = options
+
+    def get_style_defs(self, arg=''):
+        """
+        Return the style definitions for the current style as a string.
+
+        ``arg`` is an additional argument whose meaning depends on the
+        formatter used. Note that ``arg`` can also be a list or tuple
+        for some formatters like the html formatter.
+        """
+        return ''
+
+    def format(self, tokensource, outfile):
+        """
+        Format ``tokensource``, an iterable of ``(tokentype, tokenstring)``
+        tuples and write it into ``outfile``.
+        """
+        if self.encoding:
+            # wrap the outfile in a StreamWriter
+            outfile = codecs.lookup(self.encoding)[3](outfile)
+        return self.format_unencoded(tokensource, outfile)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/cmdline.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/cmdline.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/cmdline.py	(revision 1126)
@@ -0,0 +1,568 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.cmdline
+    ~~~~~~~~~~~~~~~~
+
+    Command line interface.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+import sys
+import getopt
+from textwrap import dedent
+
+from pygments import __version__, highlight
+from pygments.util import ClassNotFound, OptionError, docstring_headline, \
+    guess_decode, guess_decode_from_terminal, terminal_encoding
+from pygments.lexers import get_all_lexers, get_lexer_by_name, guess_lexer, \
+    load_lexer_from_file, get_lexer_for_filename, find_lexer_class_for_filename
+from pygments.lexers.special import TextLexer
+from pygments.formatters.latex import LatexEmbeddedLexer, LatexFormatter
+from pygments.formatters import get_all_formatters, get_formatter_by_name, \
+    load_formatter_from_file, get_formatter_for_filename, find_formatter_class
+from pygments.formatters.terminal import TerminalFormatter
+from pygments.filters import get_all_filters, find_filter_class
+from pygments.styles import get_all_styles, get_style_by_name
+
+
+USAGE = """\
+Usage: %s [-l <lexer> | -g] [-F <filter>[:<options>]] [-f <formatter>]
+          [-O <options>] [-P <option=value>] [-s] [-v] [-x] [-o <outfile>] [<infile>]
+
+       %s -S <style> -f <formatter> [-a <arg>] [-O <options>] [-P <option=value>]
+       %s -L [<which> ...]
+       %s -N <filename>
+       %s -H <type> <name>
+       %s -h | -V
+
+Highlight the input file and write the result to <outfile>.
+
+If no input file is given, use stdin, if -o is not given, use stdout.
+
+If -s is passed, lexing will be done in "streaming" mode, reading and
+highlighting one line at a time.  This will only work properly with
+lexers that have no constructs spanning multiple lines!
+
+<lexer> is a lexer name (query all lexer names with -L). If -l is not
+given, the lexer is guessed from the extension of the input file name
+(this obviously doesn't work if the input is stdin).  If -g is passed,
+attempt to guess the lexer from the file contents, or pass through as
+plain text if this fails (this can work for stdin).
+
+Likewise, <formatter> is a formatter name, and will be guessed from
+the extension of the output file name. If no output file is given,
+the terminal formatter will be used by default.
+
+The additional option -x allows custom lexers and formatters to be
+loaded from a .py file relative to the current working directory. For
+example, ``-l ./customlexer.py -x``. By default, this option expects a
+file with a class named CustomLexer or CustomFormatter; you can also
+specify your own class name with a colon (``-l ./lexer.py:MyLexer``).
+Users should be very careful not to use this option with untrusted files,
+because it will import and run them.
+
+With the -O option, you can give the lexer and formatter a comma-
+separated list of options, e.g. ``-O bg=light,python=cool``.
+
+The -P option adds lexer and formatter options like the -O option, but
+you can only give one option per -P. That way, the option value may
+contain commas and equals signs, which it can't with -O, e.g.
+``-P "heading=Pygments, the Python highlighter".
+
+With the -F option, you can add filters to the token stream, you can
+give options in the same way as for -O after a colon (note: there must
+not be spaces around the colon).
+
+The -O, -P and -F options can be given multiple times.
+
+With the -S option, print out style definitions for style <style>
+for formatter <formatter>. The argument given by -a is formatter
+dependent.
+
+The -L option lists lexers, formatters, styles or filters -- set
+`which` to the thing you want to list (e.g. "styles"), or omit it to
+list everything.
+
+The -N option guesses and prints out a lexer name based solely on
+the given filename. It does not take input or highlight anything.
+If no specific lexer can be determined "text" is returned.
+
+The -H option prints detailed help for the object <name> of type <type>,
+where <type> is one of "lexer", "formatter" or "filter".
+
+The -s option processes lines one at a time until EOF, rather than
+waiting to process the entire file.  This only works for stdin, and
+is intended for streaming input such as you get from 'tail -f'.
+Example usage: "tail -f sql.log | pygmentize -s -l sql"
+
+The -v option prints a detailed traceback on unhandled exceptions,
+which is useful for debugging and bug reports.
+
+The -h option prints this help.
+The -V option prints the package version.
+"""
+
+
+def _parse_options(o_strs):
+    opts = {}
+    if not o_strs:
+        return opts
+    for o_str in o_strs:
+        if not o_str.strip():
+            continue
+        o_args = o_str.split(',')
+        for o_arg in o_args:
+            o_arg = o_arg.strip()
+            try:
+                o_key, o_val = o_arg.split('=', 1)
+                o_key = o_key.strip()
+                o_val = o_val.strip()
+            except ValueError:
+                opts[o_arg] = True
+            else:
+                opts[o_key] = o_val
+    return opts
+
+
+def _parse_filters(f_strs):
+    filters = []
+    if not f_strs:
+        return filters
+    for f_str in f_strs:
+        if ':' in f_str:
+            fname, fopts = f_str.split(':', 1)
+            filters.append((fname, _parse_options([fopts])))
+        else:
+            filters.append((f_str, {}))
+    return filters
+
+
+def _print_help(what, name):
+    try:
+        if what == 'lexer':
+            cls = get_lexer_by_name(name)
+            print("Help on the %s lexer:" % cls.name)
+            print(dedent(cls.__doc__))
+        elif what == 'formatter':
+            cls = find_formatter_class(name)
+            print("Help on the %s formatter:" % cls.name)
+            print(dedent(cls.__doc__))
+        elif what == 'filter':
+            cls = find_filter_class(name)
+            print("Help on the %s filter:" % name)
+            print(dedent(cls.__doc__))
+        return 0
+    except (AttributeError, ValueError):
+        print("%s not found!" % what, file=sys.stderr)
+        return 1
+
+
+def _print_list(what):
+    if what == 'lexer':
+        print()
+        print("Lexers:")
+        print("~~~~~~~")
+
+        info = []
+        for fullname, names, exts, _ in get_all_lexers():
+            tup = (', '.join(names)+':', fullname,
+                   exts and '(filenames ' + ', '.join(exts) + ')' or '')
+            info.append(tup)
+        info.sort()
+        for i in info:
+            print(('* %s\n    %s %s') % i)
+
+    elif what == 'formatter':
+        print()
+        print("Formatters:")
+        print("~~~~~~~~~~~")
+
+        info = []
+        for cls in get_all_formatters():
+            doc = docstring_headline(cls)
+            tup = (', '.join(cls.aliases) + ':', doc, cls.filenames and
+                   '(filenames ' + ', '.join(cls.filenames) + ')' or '')
+            info.append(tup)
+        info.sort()
+        for i in info:
+            print(('* %s\n    %s %s') % i)
+
+    elif what == 'filter':
+        print()
+        print("Filters:")
+        print("~~~~~~~~")
+
+        for name in get_all_filters():
+            cls = find_filter_class(name)
+            print("* " + name + ':')
+            print("    %s" % docstring_headline(cls))
+
+    elif what == 'style':
+        print()
+        print("Styles:")
+        print("~~~~~~~")
+
+        for name in get_all_styles():
+            cls = get_style_by_name(name)
+            print("* " + name + ':')
+            print("    %s" % docstring_headline(cls))
+
+
+def main_inner(popts, args, usage):
+    opts = {}
+    O_opts = []
+    P_opts = []
+    F_opts = []
+    for opt, arg in popts:
+        if opt == '-O':
+            O_opts.append(arg)
+        elif opt == '-P':
+            P_opts.append(arg)
+        elif opt == '-F':
+            F_opts.append(arg)
+        opts[opt] = arg
+
+    if opts.pop('-h', None) is not None:
+        print(usage)
+        return 0
+
+    if opts.pop('-V', None) is not None:
+        print('Pygments version %s, (c) 2006-2017 by Georg Brandl.' % __version__)
+        return 0
+
+    # handle ``pygmentize -L``
+    L_opt = opts.pop('-L', None)
+    if L_opt is not None:
+        if opts:
+            print(usage, file=sys.stderr)
+            return 2
+
+        # print version
+        main(['', '-V'])
+        if not args:
+            args = ['lexer', 'formatter', 'filter', 'style']
+        for arg in args:
+            _print_list(arg.rstrip('s'))
+        return 0
+
+    # handle ``pygmentize -H``
+    H_opt = opts.pop('-H', None)
+    if H_opt is not None:
+        if opts or len(args) != 2:
+            print(usage, file=sys.stderr)
+            return 2
+
+        what, name = args  # pylint: disable=unbalanced-tuple-unpacking
+        if what not in ('lexer', 'formatter', 'filter'):
+            print(usage, file=sys.stderr)
+            return 2
+
+        return _print_help(what, name)
+
+    # parse -O options
+    parsed_opts = _parse_options(O_opts)
+    opts.pop('-O', None)
+
+    # parse -P options
+    for p_opt in P_opts:
+        try:
+            name, value = p_opt.split('=', 1)
+        except ValueError:
+            parsed_opts[p_opt] = True
+        else:
+            parsed_opts[name] = value
+    opts.pop('-P', None)
+
+    # encodings
+    inencoding = parsed_opts.get('inencoding', parsed_opts.get('encoding'))
+    outencoding = parsed_opts.get('outencoding', parsed_opts.get('encoding'))
+
+    # handle ``pygmentize -N``
+    infn = opts.pop('-N', None)
+    if infn is not None:
+        lexer = find_lexer_class_for_filename(infn)
+        if lexer is None:
+            lexer = TextLexer
+
+        print(lexer.aliases[0])
+        return 0
+
+    # handle ``pygmentize -S``
+    S_opt = opts.pop('-S', None)
+    a_opt = opts.pop('-a', None)
+    if S_opt is not None:
+        f_opt = opts.pop('-f', None)
+        if not f_opt:
+            print(usage, file=sys.stderr)
+            return 2
+        if opts or args:
+            print(usage, file=sys.stderr)
+            return 2
+
+        try:
+            parsed_opts['style'] = S_opt
+            fmter = get_formatter_by_name(f_opt, **parsed_opts)
+        except ClassNotFound as err:
+            print(err, file=sys.stderr)
+            return 1
+
+        print(fmter.get_style_defs(a_opt or ''))
+        return 0
+
+    # if no -S is given, -a is not allowed
+    if a_opt is not None:
+        print(usage, file=sys.stderr)
+        return 2
+
+    # parse -F options
+    F_opts = _parse_filters(F_opts)
+    opts.pop('-F', None)
+
+    allow_custom_lexer_formatter = False
+    # -x: allow custom (eXternal) lexers and formatters
+    if opts.pop('-x', None) is not None:
+        allow_custom_lexer_formatter = True
+
+    # select lexer
+    lexer = None
+
+    # given by name?
+    lexername = opts.pop('-l', None)
+    if lexername:
+        # custom lexer, located relative to user's cwd
+        if allow_custom_lexer_formatter and '.py' in lexername:
+            try:
+                if ':' in lexername:
+                    filename, name = lexername.rsplit(':', 1)
+                    lexer = load_lexer_from_file(filename, name,
+                                                 **parsed_opts)
+                else:
+                    lexer = load_lexer_from_file(lexername, **parsed_opts)
+            except ClassNotFound as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+        else:
+            try:
+                lexer = get_lexer_by_name(lexername, **parsed_opts)
+            except (OptionError, ClassNotFound) as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+
+    # read input code
+    code = None
+
+    if args:
+        if len(args) > 1:
+            print(usage, file=sys.stderr)
+            return 2
+
+        if '-s' in opts:
+            print('Error: -s option not usable when input file specified',
+                  file=sys.stderr)
+            return 2
+
+        infn = args[0]
+        try:
+            with open(infn, 'rb') as infp:
+                code = infp.read()
+        except Exception as err:
+            print('Error: cannot read infile:', err, file=sys.stderr)
+            return 1
+        if not inencoding:
+            code, inencoding = guess_decode(code)
+
+        # do we have to guess the lexer?
+        if not lexer:
+            try:
+                lexer = get_lexer_for_filename(infn, code, **parsed_opts)
+            except ClassNotFound as err:
+                if '-g' in opts:
+                    try:
+                        lexer = guess_lexer(code, **parsed_opts)
+                    except ClassNotFound:
+                        lexer = TextLexer(**parsed_opts)
+                else:
+                    print('Error:', err, file=sys.stderr)
+                    return 1
+            except OptionError as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+
+    elif '-s' not in opts:  # treat stdin as full file (-s support is later)
+        # read code from terminal, always in binary mode since we want to
+        # decode ourselves and be tolerant with it
+        if sys.version_info > (3,):
+            # Python 3: we have to use .buffer to get a binary stream
+            code = sys.stdin.buffer.read()
+        else:
+            code = sys.stdin.read()
+        if not inencoding:
+            code, inencoding = guess_decode_from_terminal(code, sys.stdin)
+            # else the lexer will do the decoding
+        if not lexer:
+            try:
+                lexer = guess_lexer(code, **parsed_opts)
+            except ClassNotFound:
+                lexer = TextLexer(**parsed_opts)
+
+    else:  # -s option needs a lexer with -l
+        if not lexer:
+            print('Error: when using -s a lexer has to be selected with -l',
+                  file=sys.stderr)
+            return 2
+
+    # process filters
+    for fname, fopts in F_opts:
+        try:
+            lexer.add_filter(fname, **fopts)
+        except ClassNotFound as err:
+            print('Error:', err, file=sys.stderr)
+            return 1
+
+    # select formatter
+    outfn = opts.pop('-o', None)
+    fmter = opts.pop('-f', None)
+    if fmter:
+        # custom formatter, located relative to user's cwd
+        if allow_custom_lexer_formatter and '.py' in fmter:
+            try:
+                if ':' in fmter:
+                    file, fmtername = fmter.rsplit(':', 1)
+                    fmter = load_formatter_from_file(file, fmtername,
+                                                     **parsed_opts)
+                else:
+                    fmter = load_formatter_from_file(fmter, **parsed_opts)
+            except ClassNotFound as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+        else:
+            try:
+                fmter = get_formatter_by_name(fmter, **parsed_opts)
+            except (OptionError, ClassNotFound) as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+
+    if outfn:
+        if not fmter:
+            try:
+                fmter = get_formatter_for_filename(outfn, **parsed_opts)
+            except (OptionError, ClassNotFound) as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+        try:
+            outfile = open(outfn, 'wb')
+        except Exception as err:
+            print('Error: cannot open outfile:', err, file=sys.stderr)
+            return 1
+    else:
+        if not fmter:
+            fmter = TerminalFormatter(**parsed_opts)
+        if sys.version_info > (3,):
+            # Python 3: we have to use .buffer to get a binary stream
+            outfile = sys.stdout.buffer
+        else:
+            outfile = sys.stdout
+
+    # determine output encoding if not explicitly selected
+    if not outencoding:
+        if outfn:
+            # output file? use lexer encoding for now (can still be None)
+            fmter.encoding = inencoding
+        else:
+            # else use terminal encoding
+            fmter.encoding = terminal_encoding(sys.stdout)
+
+    # provide coloring under Windows, if possible
+    if not outfn and sys.platform in ('win32', 'cygwin') and \
+       fmter.name in ('Terminal', 'Terminal256'):  # pragma: no cover
+        # unfortunately colorama doesn't support binary streams on Py3
+        if sys.version_info > (3,):
+            from pygments.util import UnclosingTextIOWrapper
+            outfile = UnclosingTextIOWrapper(outfile, encoding=fmter.encoding)
+            fmter.encoding = None
+        try:
+            import colorama.initialise
+        except ImportError:
+            pass
+        else:
+            outfile = colorama.initialise.wrap_stream(
+                outfile, convert=None, strip=None, autoreset=False, wrap=True)
+
+    # When using the LaTeX formatter and the option `escapeinside` is
+    # specified, we need a special lexer which collects escaped text
+    # before running the chosen language lexer.
+    escapeinside = parsed_opts.get('escapeinside', '')
+    if len(escapeinside) == 2 and isinstance(fmter, LatexFormatter):
+        left = escapeinside[0]
+        right = escapeinside[1]
+        lexer = LatexEmbeddedLexer(left, right, lexer)
+
+    # ... and do it!
+    if '-s' not in opts:
+        # process whole input as per normal...
+        highlight(code, lexer, fmter, outfile)
+        return 0
+    else:
+        # line by line processing of stdin (eg: for 'tail -f')...
+        try:
+            while 1:
+                if sys.version_info > (3,):
+                    # Python 3: we have to use .buffer to get a binary stream
+                    line = sys.stdin.buffer.readline()
+                else:
+                    line = sys.stdin.readline()
+                if not line:
+                    break
+                if not inencoding:
+                    line = guess_decode_from_terminal(line, sys.stdin)[0]
+                highlight(line, lexer, fmter, outfile)
+                if hasattr(outfile, 'flush'):
+                    outfile.flush()
+            return 0
+        except KeyboardInterrupt:  # pragma: no cover
+            return 0
+
+
+def main(args=sys.argv):
+    """
+    Main command line entry point.
+    """
+    usage = USAGE % ((args[0],) * 6)
+
+    try:
+        popts, args = getopt.getopt(args[1:], "l:f:F:o:O:P:LS:a:N:vhVHgsx")
+    except getopt.GetoptError:
+        print(usage, file=sys.stderr)
+        return 2
+
+    try:
+        return main_inner(popts, args, usage)
+    except Exception:
+        if '-v' in dict(popts):
+            print(file=sys.stderr)
+            print('*' * 65, file=sys.stderr)
+            print('An unhandled exception occurred while highlighting.',
+                  file=sys.stderr)
+            print('Please report the whole traceback to the issue tracker at',
+                  file=sys.stderr)
+            print('<https://bitbucket.org/birkenfeld/pygments-main/issues>.',
+                  file=sys.stderr)
+            print('*' * 65, file=sys.stderr)
+            print(file=sys.stderr)
+            raise
+        import traceback
+        info = traceback.format_exception(*sys.exc_info())
+        msg = info[-1].strip()
+        if len(info) >= 3:
+            # extract relevant file and position info
+            msg += '\n   (f%s)' % info[-2].split('\n')[0].strip()[1:]
+        print(file=sys.stderr)
+        print('*** Error while highlighting:', file=sys.stderr)
+        print(msg, file=sys.stderr)
+        print('*** If this is a bug you want to report, please rerun with -v.',
+              file=sys.stderr)
+        return 1
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ambient.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ambient.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ambient.py	(revision 1126)
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ambient
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for AmbientTalk language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['AmbientTalkLexer']
+
+
+class AmbientTalkLexer(RegexLexer):
+    """
+    Lexer for `AmbientTalk <https://code.google.com/p/ambienttalk>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'AmbientTalk'
+    filenames = ['*.at']
+    aliases = ['at', 'ambienttalk', 'ambienttalk/2']
+    mimetypes = ['text/x-ambienttalk']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    builtin = words(('if:', 'then:', 'else:', 'when:', 'whenever:', 'discovered:',
+                     'disconnected:', 'reconnected:', 'takenOffline:', 'becomes:',
+                     'export:', 'as:', 'object:', 'actor:', 'mirror:', 'taggedAs:',
+                     'mirroredBy:', 'is:'))
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(def|deftype|import|alias|exclude)\b', Keyword),
+            (builtin, Name.Builtin),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (r'(~|lobby|jlobby|/)\.', Keyword.Constant, 'namespace'),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r'\|', Punctuation, 'arglist'),
+            (r'<:|[*^!%&<>+=,./?-]|:=', Operator),
+            (r"`[a-zA-Z_]\w*", String.Symbol),
+            (r"[a-zA-Z_]\w*:", Name.Function),
+            (r"[{}()\[\];`]", Punctuation),
+            (r'(self|super)\b', Name.Variable.Instance),
+            (r"[a-zA-Z_]\w*", Name.Variable),
+            (r"@[a-zA-Z_]\w*", Name.Class),
+            (r"@\[", Name.Class, 'annotations'),
+            include('numbers'),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+        'namespace': [
+            (r'[a-zA-Z_]\w*\.', Name.Namespace),
+            (r'[a-zA-Z_]\w*:', Name.Function, '#pop'),
+            (r'[a-zA-Z_]\w*(?!\.)', Name.Function, '#pop')
+        ],
+        'annotations': [
+            (r"(.*?)\]", Name.Class, '#pop')
+        ],
+        'arglist': [
+            (r'\|', Punctuation, '#pop'),
+            (r'\s*(,)\s*', Punctuation),
+            (r'[a-zA-Z_]\w*', Name.Variable),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/automation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/automation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/automation.py	(revision 1126)
@@ -0,0 +1,374 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.automation
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for automation scripting languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, combined
+from pygments.token import Text, Comment, Operator, Name, String, \
+    Number, Punctuation, Generic
+
+__all__ = ['AutohotkeyLexer', 'AutoItLexer']
+
+
+class AutohotkeyLexer(RegexLexer):
+    """
+    For `autohotkey <http://www.autohotkey.com/>`_ source code.
+
+    .. versionadded:: 1.4
+    """
+    name = 'autohotkey'
+    aliases = ['ahk', 'autohotkey']
+    filenames = ['*.ahk', '*.ahkl']
+    mimetypes = ['text/x-autohotkey']
+
+    tokens = {
+        'root': [
+            (r'^(\s*)(/\*)', bygroups(Text, Comment.Multiline), 'incomment'),
+            (r'^(\s*)(\()', bygroups(Text, Generic), 'incontinuation'),
+            (r'\s+;.*?$', Comment.Singleline),
+            (r'^;.*?$', Comment.Singleline),
+            (r'[]{}(),;[]', Punctuation),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'\%[a-zA-Z_#@$][\w#@$]*\%', Name.Variable),
+            (r'!=|==|:=|\.=|<<|>>|[-~+/*%=<>&^|?:!.]', Operator),
+            include('commands'),
+            include('labels'),
+            include('builtInFunctions'),
+            include('builtInVariables'),
+            (r'"', String, combined('stringescape', 'dqs')),
+            include('numbers'),
+            (r'[a-zA-Z_#@$][\w#@$]*', Name),
+            (r'\\|\'', Text),
+            (r'\`([,%`abfnrtv\-+;])', String.Escape),
+            include('garbage'),
+        ],
+        'incomment': [
+            (r'^\s*\*/', Comment.Multiline, '#pop'),
+            (r'[^*/]', Comment.Multiline),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'incontinuation': [
+            (r'^\s*\)', Generic, '#pop'),
+            (r'[^)]', Generic),
+            (r'[)]', Generic),
+        ],
+        'commands': [
+            (r'(?i)^(\s*)(global|local|static|'
+             r'#AllowSameLineComments|#ClipboardTimeout|#CommentFlag|'
+             r'#ErrorStdOut|#EscapeChar|#HotkeyInterval|#HotkeyModifierTimeout|'
+             r'#Hotstring|#IfWinActive|#IfWinExist|#IfWinNotActive|'
+             r'#IfWinNotExist|#IncludeAgain|#Include|#InstallKeybdHook|'
+             r'#InstallMouseHook|#KeyHistory|#LTrim|#MaxHotkeysPerInterval|'
+             r'#MaxMem|#MaxThreads|#MaxThreadsBuffer|#MaxThreadsPerHotkey|'
+             r'#NoEnv|#NoTrayIcon|#Persistent|#SingleInstance|#UseHook|'
+             r'#WinActivateForce|AutoTrim|BlockInput|Break|Click|ClipWait|'
+             r'Continue|Control|ControlClick|ControlFocus|ControlGetFocus|'
+             r'ControlGetPos|ControlGetText|ControlGet|ControlMove|ControlSend|'
+             r'ControlSendRaw|ControlSetText|CoordMode|Critical|'
+             r'DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|'
+             r'DriveSpaceFree|Edit|Else|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|'
+             r'EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|'
+             r'FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|'
+             r'FileDelete|FileGetAttrib|FileGetShortcut|FileGetSize|'
+             r'FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|'
+             r'FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|'
+             r'FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|'
+             r'FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|'
+             r'GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|'
+             r'GuiControlGet|Hotkey|IfEqual|IfExist|IfGreaterOrEqual|IfGreater|'
+             r'IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|'
+             r'IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|'
+             r'IfWinNotExist|If |ImageSearch|IniDelete|IniRead|IniWrite|'
+             r'InputBox|Input|KeyHistory|KeyWait|ListHotkeys|ListLines|'
+             r'ListVars|Loop|Menu|MouseClickDrag|MouseClick|MouseGetPos|'
+             r'MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|'
+             r'PixelSearch|PostMessage|Process|Progress|Random|RegDelete|'
+             r'RegRead|RegWrite|Reload|Repeat|Return|RunAs|RunWait|Run|'
+             r'SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|Send|'
+             r'SetBatchLines|SetCapslockState|SetControlDelay|'
+             r'SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|'
+             r'SetMouseDelay|SetNumlockState|SetScrollLockState|'
+             r'SetStoreCapslockMode|SetTimer|SetTitleMatchMode|'
+             r'SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|'
+             r'SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|'
+             r'SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|'
+             r'SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|'
+             r'StringGetPos|StringLeft|StringLen|StringLower|StringMid|'
+             r'StringReplace|StringRight|StringSplit|StringTrimLeft|'
+             r'StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|'
+             r'Transform|TrayTip|URLDownloadToFile|While|WinActivate|'
+             r'WinActivateBottom|WinClose|WinGetActiveStats|WinGetActiveTitle|'
+             r'WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinGet|WinHide|'
+             r'WinKill|WinMaximize|WinMenuSelectItem|WinMinimizeAllUndo|'
+             r'WinMinimizeAll|WinMinimize|WinMove|WinRestore|WinSetTitle|'
+             r'WinSet|WinShow|WinWaitActive|WinWaitClose|WinWaitNotActive|'
+             r'WinWait)\b', bygroups(Text, Name.Builtin)),
+        ],
+        'builtInFunctions': [
+            (r'(?i)(Abs|ACos|Asc|ASin|ATan|Ceil|Chr|Cos|DllCall|Exp|FileExist|'
+             r'Floor|GetKeyState|IL_Add|IL_Create|IL_Destroy|InStr|IsFunc|'
+             r'IsLabel|Ln|Log|LV_Add|LV_Delete|LV_DeleteCol|LV_GetCount|'
+             r'LV_GetNext|LV_GetText|LV_Insert|LV_InsertCol|LV_Modify|'
+             r'LV_ModifyCol|LV_SetImageList|Mod|NumGet|NumPut|OnMessage|'
+             r'RegExMatch|RegExReplace|RegisterCallback|Round|SB_SetIcon|'
+             r'SB_SetParts|SB_SetText|Sin|Sqrt|StrLen|SubStr|Tan|TV_Add|'
+             r'TV_Delete|TV_GetChild|TV_GetCount|TV_GetNext|TV_Get|'
+             r'TV_GetParent|TV_GetPrev|TV_GetSelection|TV_GetText|TV_Modify|'
+             r'VarSetCapacity|WinActive|WinExist|Object|ComObjActive|'
+             r'ComObjArray|ComObjEnwrap|ComObjUnwrap|ComObjParameter|'
+             r'ComObjType|ComObjConnect|ComObjCreate|ComObjGet|ComObjError|'
+             r'ComObjValue|Insert|MinIndex|MaxIndex|Remove|SetCapacity|'
+             r'GetCapacity|GetAddress|_NewEnum|FileOpen|Read|Write|ReadLine|'
+             r'WriteLine|ReadNumType|WriteNumType|RawRead|RawWrite|Seek|Tell|'
+             r'Close|Next|IsObject|StrPut|StrGet|Trim|LTrim|RTrim)\b',
+             Name.Function),
+        ],
+        'builtInVariables': [
+            (r'(?i)(A_AhkPath|A_AhkVersion|A_AppData|A_AppDataCommon|'
+             r'A_AutoTrim|A_BatchLines|A_CaretX|A_CaretY|A_ComputerName|'
+             r'A_ControlDelay|A_Cursor|A_DDDD|A_DDD|A_DD|A_DefaultMouseSpeed|'
+             r'A_Desktop|A_DesktopCommon|A_DetectHiddenText|'
+             r'A_DetectHiddenWindows|A_EndChar|A_EventInfo|A_ExitReason|'
+             r'A_FormatFloat|A_FormatInteger|A_Gui|A_GuiEvent|A_GuiControl|'
+             r'A_GuiControlEvent|A_GuiHeight|A_GuiWidth|A_GuiX|A_GuiY|A_Hour|'
+             r'A_IconFile|A_IconHidden|A_IconNumber|A_IconTip|A_Index|'
+             r'A_IPAddress1|A_IPAddress2|A_IPAddress3|A_IPAddress4|A_ISAdmin|'
+             r'A_IsCompiled|A_IsCritical|A_IsPaused|A_IsSuspended|A_KeyDelay|'
+             r'A_Language|A_LastError|A_LineFile|A_LineNumber|A_LoopField|'
+             r'A_LoopFileAttrib|A_LoopFileDir|A_LoopFileExt|A_LoopFileFullPath|'
+             r'A_LoopFileLongPath|A_LoopFileName|A_LoopFileShortName|'
+             r'A_LoopFileShortPath|A_LoopFileSize|A_LoopFileSizeKB|'
+             r'A_LoopFileSizeMB|A_LoopFileTimeAccessed|A_LoopFileTimeCreated|'
+             r'A_LoopFileTimeModified|A_LoopReadLine|A_LoopRegKey|'
+             r'A_LoopRegName|A_LoopRegSubkey|A_LoopRegTimeModified|'
+             r'A_LoopRegType|A_MDAY|A_Min|A_MM|A_MMM|A_MMMM|A_Mon|A_MouseDelay|'
+             r'A_MSec|A_MyDocuments|A_Now|A_NowUTC|A_NumBatchLines|A_OSType|'
+             r'A_OSVersion|A_PriorHotkey|A_ProgramFiles|A_Programs|'
+             r'A_ProgramsCommon|A_ScreenHeight|A_ScreenWidth|A_ScriptDir|'
+             r'A_ScriptFullPath|A_ScriptName|A_Sec|A_Space|A_StartMenu|'
+             r'A_StartMenuCommon|A_Startup|A_StartupCommon|A_StringCaseSense|'
+             r'A_Tab|A_Temp|A_ThisFunc|A_ThisHotkey|A_ThisLabel|A_ThisMenu|'
+             r'A_ThisMenuItem|A_ThisMenuItemPos|A_TickCount|A_TimeIdle|'
+             r'A_TimeIdlePhysical|A_TimeSincePriorHotkey|A_TimeSinceThisHotkey|'
+             r'A_TitleMatchMode|A_TitleMatchModeSpeed|A_UserName|A_WDay|'
+             r'A_WinDelay|A_WinDir|A_WorkingDir|A_YDay|A_YEAR|A_YWeek|A_YYYY|'
+             r'Clipboard|ClipboardAll|ComSpec|ErrorLevel|ProgramFiles|True|'
+             r'False|A_IsUnicode|A_FileEncoding|A_OSVersion|A_PtrSize)\b',
+             Name.Variable),
+        ],
+        'labels': [
+            # hotkeys and labels
+            # technically, hotkey names are limited to named keys and buttons
+            (r'(^\s*)([^:\s("]+?:{1,2})', bygroups(Text, Name.Label)),
+            (r'(^\s*)(::[^:\s]+?::)', bygroups(Text, Name.Label)),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'0\d+', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer)
+        ],
+        'stringescape': [
+            (r'\"\"|\`([,%`abfnrtv])', String.Escape),
+        ],
+        'strings': [
+            (r'[^"\n]+', String),
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            include('strings')
+        ],
+        'garbage': [
+            (r'[^\S\n]', Text),
+            # (r'.', Text),      # no cheating
+        ],
+    }
+
+
+class AutoItLexer(RegexLexer):
+    """
+    For `AutoIt <http://www.autoitscript.com/site/autoit/>`_ files.
+
+    AutoIt is a freeware BASIC-like scripting language
+    designed for automating the Windows GUI and general scripting
+
+    .. versionadded:: 1.6
+    """
+    name = 'AutoIt'
+    aliases = ['autoit']
+    filenames = ['*.au3']
+    mimetypes = ['text/x-autoit']
+
+    # Keywords, functions, macros from au3.keywords.properties
+    # which can be found in AutoIt installed directory, e.g.
+    # c:\Program Files (x86)\AutoIt3\SciTE\au3.keywords.properties
+
+    keywords = """\
+    #include-once #include #endregion #forcedef #forceref #region
+    and byref case continueloop dim do else elseif endfunc endif
+    endselect exit exitloop for func global
+    if local next not or return select step
+    then to until wend while exit""".split()
+
+    functions = """\
+    abs acos adlibregister adlibunregister asc ascw asin assign atan
+    autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen
+    binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor
+    blockinput break call cdtray ceiling chr chrw clipget clipput consoleread
+    consolewrite consolewriteerror controlclick controlcommand controldisable
+    controlenable controlfocus controlgetfocus controlgethandle controlgetpos
+    controlgettext controlhide controllistview controlmove controlsend
+    controlsettext controlshow controltreeview cos dec dircopy dircreate
+    dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree
+    dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate
+    dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata
+    drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype
+    drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree
+    drivespacetotal drivestatus envget envset envupdate eval execute exp
+    filechangedir fileclose filecopy filecreatentfslink filecreateshortcut
+    filedelete fileexists filefindfirstfile filefindnextfile fileflush
+    filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut
+    filegetshortname filegetsize filegettime filegetversion fileinstall filemove
+    fileopen fileopendialog fileread filereadline filerecycle filerecycleempty
+    filesavedialog fileselectfolder filesetattrib filesetpos filesettime
+    filewrite filewriteline floor ftpsetproxy guicreate guictrlcreateavi
+    guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo
+    guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy
+    guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon
+    guictrlcreateinput guictrlcreatelabel guictrlcreatelist
+    guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu
+    guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj
+    guictrlcreatepic guictrlcreateprogress guictrlcreateradio
+    guictrlcreateslider guictrlcreatetab guictrlcreatetabitem
+    guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown
+    guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg
+    guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy
+    guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata
+    guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic
+    guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos
+    guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete
+    guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators
+    guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon
+    guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset
+    httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize
+    inetread inidelete iniread inireadsection inireadsectionnames
+    inirenamesection iniwrite iniwritesection inputbox int isadmin isarray
+    isbinary isbool isdeclared isdllstruct isfloat ishwnd isint iskeyword
+    isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag
+    mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox
+    number objcreate objcreateinterface objevent objevent objget objname
+    onautoitexitregister onautoitexitunregister opt ping pixelchecksum
+    pixelgetcolor pixelsearch pluginclose pluginopen processclose processexists
+    processgetstats processlist processsetpriority processwait processwaitclose
+    progressoff progresson progressset ptr random regdelete regenumkey
+    regenumval regread regwrite round run runas runaswait runwait send
+    sendkeepactive seterror setextended shellexecute shellexecutewait shutdown
+    sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton
+    sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread
+    string stringaddcr stringcompare stringformat stringfromasciiarray
+    stringinstr stringisalnum stringisalpha stringisascii stringisdigit
+    stringisfloat stringisint stringislower stringisspace stringisupper
+    stringisxdigit stringleft stringlen stringlower stringmid stringregexp
+    stringregexpreplace stringreplace stringright stringsplit stringstripcr
+    stringstripws stringtoasciiarray stringtobinary stringtrimleft
+    stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect
+    tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff
+    timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete
+    trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent
+    trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent
+    traysetpauseicon traysetstate traysettooltip traytip ubound udpbind
+    udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype
+    winactivate winactive winclose winexists winflash wingetcaretpos
+    wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess
+    wingetstate wingettext wingettitle winkill winlist winmenuselectitem
+    winminimizeall winminimizeallundo winmove winsetontop winsetstate
+    winsettitle winsettrans winwait winwaitactive winwaitclose
+    winwaitnotactive""".split()
+
+    macros = """\
+    @appdatacommondir @appdatadir @autoitexe @autoitpid @autoitversion
+    @autoitx64 @com_eventobj @commonfilesdir @compiled @computername @comspec
+    @cpuarch @cr @crlf @desktopcommondir @desktopdepth @desktopdir
+    @desktopheight @desktoprefresh @desktopwidth @documentscommondir @error
+    @exitcode @exitmethod @extended @favoritescommondir @favoritesdir
+    @gui_ctrlhandle @gui_ctrlid @gui_dragfile @gui_dragid @gui_dropid
+    @gui_winhandle @homedrive @homepath @homeshare @hotkeypressed @hour
+    @ipaddress1 @ipaddress2 @ipaddress3 @ipaddress4 @kblayout @lf
+    @logondnsdomain @logondomain @logonserver @mday @min @mon @msec @muilang
+    @mydocumentsdir @numparams @osarch @osbuild @oslang @osservicepack @ostype
+    @osversion @programfilesdir @programscommondir @programsdir @scriptdir
+    @scriptfullpath @scriptlinenumber @scriptname @sec @startmenucommondir
+    @startmenudir @startupcommondir @startupdir @sw_disable @sw_enable @sw_hide
+    @sw_lock @sw_maximize @sw_minimize @sw_restore @sw_show @sw_showdefault
+    @sw_showmaximized @sw_showminimized @sw_showminnoactive @sw_showna
+    @sw_shownoactivate @sw_shownormal @sw_unlock @systemdir @tab @tempdir
+    @tray_id @trayiconflashing @trayiconvisible @username @userprofiledir @wday
+    @windowsdir @workingdir @yday @year""".split()
+
+    tokens = {
+        'root': [
+            (r';.*\n', Comment.Single),
+            (r'(#comments-start|#cs)(.|\n)*?(#comments-end|#ce)',
+             Comment.Multiline),
+            (r'[\[\]{}(),;]', Punctuation),
+            (r'(and|or|not)\b', Operator.Word),
+            (r'[$|@][a-zA-Z_]\w*', Name.Variable),
+            (r'!=|==|:=|\.=|<<|>>|[-~+/*%=<>&^|?:!.]', Operator),
+            include('commands'),
+            include('labels'),
+            include('builtInFunctions'),
+            include('builtInMarcros'),
+            (r'"', String, combined('stringescape', 'dqs')),
+            include('numbers'),
+            (r'[a-zA-Z_#@$][\w#@$]*', Name),
+            (r'\\|\'', Text),
+            (r'\`([,%`abfnrtv\-+;])', String.Escape),
+            (r'_\n', Text),  # Line continuation
+            include('garbage'),
+        ],
+        'commands': [
+            (r'(?i)(\s*)(%s)\b' % '|'.join(keywords),
+             bygroups(Text, Name.Builtin)),
+        ],
+        'builtInFunctions': [
+            (r'(?i)(%s)\b' % '|'.join(functions),
+             Name.Function),
+        ],
+        'builtInMarcros': [
+            (r'(?i)(%s)\b' % '|'.join(macros),
+             Name.Variable.Global),
+        ],
+        'labels': [
+            # sendkeys
+            (r'(^\s*)(\{\S+?\})', bygroups(Text, Name.Label)),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'0\d+', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer)
+        ],
+        'stringescape': [
+            (r'\"\"|\`([,%`abfnrtv])', String.Escape),
+        ],
+        'strings': [
+            (r'[^"\n]+', String),
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            include('strings')
+        ],
+        'garbage': [
+            (r'[^\S\n]', Text),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/python.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/python.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/python.py	(revision 1126)
@@ -0,0 +1,939 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.python
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Python and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, using, \
+    default, words, combined, do_insertions
+from pygments.util import get_bool_opt, shebang_matches
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Other, Error
+from pygments import unistring as uni
+
+__all__ = ['PythonLexer', 'PythonConsoleLexer', 'PythonTracebackLexer',
+           'Python3Lexer', 'Python3TracebackLexer', 'CythonLexer',
+           'DgLexer', 'NumPyLexer']
+
+line_re = re.compile('.*?\n')
+
+
+class PythonLexer(RegexLexer):
+    """
+    For `Python <http://www.python.org>`_ source code.
+    """
+
+    name = 'Python'
+    aliases = ['python', 'py', 'sage']
+    filenames = ['*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac', '*.sage']
+    mimetypes = ['text/x-python', 'application/x-python']
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r'%', ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")',
+             bygroups(Text, String.Affix, String.Doc)),
+            (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')",
+             bygroups(Text, String.Affix, String.Doc)),
+            (r'[^\S\n]+', Text),
+            (r'\A#!.+$', Comment.Hashbang),
+            (r'#.*$', Comment.Single),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'!=|==|<<|>>|[-~+/*%=<>&^|.]', Operator),
+            include('keywords'),
+            (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'funcname'),
+            (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'classname'),
+            (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text),
+             'fromimport'),
+            (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text),
+             'import'),
+            include('builtins'),
+            include('magicfuncs'),
+            include('magicvars'),
+            include('backtick'),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(""")',
+             bygroups(String.Affix, String.Double), 'tdqs'),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(''')",
+             bygroups(String.Affix, String.Single), 'tsqs'),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(")',
+             bygroups(String.Affix, String.Double), 'dqs'),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(')",
+             bygroups(String.Affix, String.Single), 'sqs'),
+            ('([uUbB]?)(""")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'tdqs')),
+            ("([uUbB]?)(''')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'tsqs')),
+            ('([uUbB]?)(")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'dqs')),
+            ("([uUbB]?)(')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'break', 'continue', 'del', 'elif', 'else', 'except',
+                'exec', 'finally', 'for', 'global', 'if', 'lambda', 'pass',
+                'print', 'raise', 'return', 'try', 'while', 'yield',
+                'yield from', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin',
+                'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod',
+                'cmp', 'coerce', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod',
+                'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float',
+                'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id',
+                'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len',
+                'list', 'locals', 'long', 'map', 'max', 'min', 'next', 'object',
+                'oct', 'open', 'ord', 'pow', 'property', 'range', 'raw_input', 'reduce',
+                'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+                'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type',
+                'unichr', 'unicode', 'vars', 'xrange', 'zip'),
+                prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Builtin),
+            (r'(?<!\.)(self|None|Ellipsis|NotImplemented|False|True|cls'
+             r')\b', Name.Builtin.Pseudo),
+            (words((
+                'ArithmeticError', 'AssertionError', 'AttributeError',
+                'BaseException', 'DeprecationWarning', 'EOFError', 'EnvironmentError',
+                'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit',
+                'IOError', 'ImportError', 'ImportWarning', 'IndentationError',
+                'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
+                'MemoryError', 'NameError', 'NotImplemented', 'NotImplementedError',
+                'OSError', 'OverflowError', 'OverflowWarning', 'PendingDeprecationWarning',
+                'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError',
+                'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
+                'SystemExit', 'TabError', 'TypeError', 'UnboundLocalError',
+                'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError',
+                'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
+                'ValueError', 'VMSError', 'Warning', 'WindowsError',
+                'ZeroDivisionError'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Exception),
+        ],
+        'magicfuncs': [
+            (words((
+                '__abs__', '__add__', '__and__', '__call__', '__cmp__', '__coerce__',
+                '__complex__', '__contains__', '__del__', '__delattr__', '__delete__',
+                '__delitem__', '__delslice__', '__div__', '__divmod__', '__enter__',
+                '__eq__', '__exit__', '__float__', '__floordiv__', '__ge__', '__get__',
+                '__getattr__', '__getattribute__', '__getitem__', '__getslice__', '__gt__',
+                '__hash__', '__hex__', '__iadd__', '__iand__', '__idiv__', '__ifloordiv__',
+                '__ilshift__', '__imod__', '__imul__', '__index__', '__init__',
+                '__instancecheck__', '__int__', '__invert__', '__iop__', '__ior__',
+                '__ipow__', '__irshift__', '__isub__', '__iter__', '__itruediv__',
+                '__ixor__', '__le__', '__len__', '__long__', '__lshift__', '__lt__',
+                '__missing__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__',
+                '__nonzero__', '__oct__', '__op__', '__or__', '__pos__', '__pow__',
+                '__radd__', '__rand__', '__rcmp__', '__rdiv__', '__rdivmod__', '__repr__',
+                '__reversed__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__',
+                '__rop__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__',
+                '__rtruediv__', '__rxor__', '__set__', '__setattr__', '__setitem__',
+                '__setslice__', '__str__', '__sub__', '__subclasscheck__', '__truediv__',
+                '__unicode__', '__xor__'), suffix=r'\b'),
+             Name.Function.Magic),
+        ],
+        'magicvars': [
+            (words((
+                '__bases__', '__class__', '__closure__', '__code__', '__defaults__',
+                '__dict__', '__doc__', '__file__', '__func__', '__globals__',
+                '__metaclass__', '__module__', '__mro__', '__name__', '__self__',
+                '__slots__', '__weakref__'),
+                suffix=r'\b'),
+             Name.Variable.Magic),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+j?', Number.Float),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[bB][01]+', Number.Bin),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+j?', Number.Integer)
+        ],
+        'backtick': [
+            ('`.*?`', String.Backtick),
+        ],
+        'name': [
+            (r'@[\w.]+', Name.Decorator),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'funcname': [
+            include('magicfuncs'),
+            ('[a-zA-Z_]\w*', Name.Function, '#pop'),
+            default('#pop'),
+        ],
+        'classname': [
+            ('[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'(?:[ \t]|\\\n)+', Text),
+            (r'as\b', Keyword.Namespace),
+            (r',', Operator),
+            (r'[a-zA-Z_][\w.]*', Name.Namespace),
+            default('#pop')  # all else: go back
+        ],
+        'fromimport': [
+            (r'(?:[ \t]|\\\n)+', Text),
+            (r'import\b', Keyword.Namespace, '#pop'),
+            # if None occurs here, it's "raise x from None", since None can
+            # never be a module name
+            (r'None\b', Name.Builtin.Pseudo, '#pop'),
+            # sadly, in "raise x from y" y will be highlighted as namespace too
+            (r'[a-zA-Z_.][\w.]*', Name.Namespace),
+            # anything else here also means "raise x from y" and is therefore
+            # not an error
+            default('#pop'),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings-single': innerstring_rules(String.Single),
+        'strings-double': innerstring_rules(String.Double),
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('strings-double')
+        ],
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('strings-single')
+        ],
+        'tdqs': [
+            (r'"""', String.Double, '#pop'),
+            include('strings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqs': [
+            (r"'''", String.Single, '#pop'),
+            include('strings-single'),
+            (r'\n', String.Single)
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'pythonw?(2(\.\d)?)?') or \
+            'import ' in text[:1000]
+
+
+class Python3Lexer(RegexLexer):
+    """
+    For `Python <http://www.python.org>`_ source code (version 3.0).
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'Python 3'
+    aliases = ['python3', 'py3']
+    filenames = []  # Nothing until Python 3 gets widespread
+    mimetypes = ['text/x-python3', 'application/x-python3']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    uni_name = "[%s][%s]*" % (uni.xid_start, uni.xid_continue)
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting (still valid in Py3)
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            # the new style '{}'.format(...) string formatting
+            (r'\{'
+             '((\w+)((\.\w+)|(\[[^\]]+\]))*)?'  # field name
+             '(\![sra])?'                       # conversion
+             '(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?'
+             '\}', String.Interpol),
+
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%{\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r'%|(\{{1,2})', ttype)
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = PythonLexer.tokens.copy()
+    tokens['keywords'] = [
+        (words((
+            'assert', 'async', 'await', 'break', 'continue', 'del', 'elif',
+            'else', 'except', 'finally', 'for', 'global', 'if', 'lambda', 'pass',
+            'raise', 'nonlocal', 'return', 'try', 'while', 'yield', 'yield from',
+            'as', 'with'), suffix=r'\b'),
+         Keyword),
+        (words((
+            'True', 'False', 'None'), suffix=r'\b'),
+         Keyword.Constant),
+    ]
+    tokens['builtins'] = [
+        (words((
+            '__import__', 'abs', 'all', 'any', 'bin', 'bool', 'bytearray', 'bytes',
+            'chr', 'classmethod', 'cmp', 'compile', 'complex', 'delattr', 'dict',
+            'dir', 'divmod', 'enumerate', 'eval', 'filter', 'float', 'format',
+            'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id',
+            'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list',
+            'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct',
+            'open', 'ord', 'pow', 'print', 'property', 'range', 'repr', 'reversed',
+            'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str',
+            'sum', 'super', 'tuple', 'type', 'vars', 'zip'), prefix=r'(?<!\.)',
+            suffix=r'\b'),
+         Name.Builtin),
+        (r'(?<!\.)(self|Ellipsis|NotImplemented|cls)\b', Name.Builtin.Pseudo),
+        (words((
+            'ArithmeticError', 'AssertionError', 'AttributeError',
+            'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning',
+            'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError',
+            'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
+            'ImportWarning', 'IndentationError', 'IndexError', 'KeyError',
+            'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError',
+            'NotImplementedError', 'OSError', 'OverflowError',
+            'PendingDeprecationWarning', 'ReferenceError', 'ResourceWarning',
+            'RuntimeError', 'RuntimeWarning', 'StopIteration',
+            'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError',
+            'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
+            'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
+            'UnicodeWarning', 'UserWarning', 'ValueError', 'VMSError', 'Warning',
+            'WindowsError', 'ZeroDivisionError',
+            # new builtin exceptions from PEP 3151
+            'BlockingIOError', 'ChildProcessError', 'ConnectionError',
+            'BrokenPipeError', 'ConnectionAbortedError', 'ConnectionRefusedError',
+            'ConnectionResetError', 'FileExistsError', 'FileNotFoundError',
+            'InterruptedError', 'IsADirectoryError', 'NotADirectoryError',
+            'PermissionError', 'ProcessLookupError', 'TimeoutError'),
+            prefix=r'(?<!\.)', suffix=r'\b'),
+         Name.Exception),
+    ]
+    tokens['magicfuncs'] = [
+        (words((
+            '__abs__', '__add__', '__aenter__', '__aexit__', '__aiter__', '__and__',
+            '__anext__', '__await__', '__bool__', '__bytes__', '__call__',
+            '__complex__', '__contains__', '__del__', '__delattr__', '__delete__',
+            '__delitem__', '__dir__', '__divmod__', '__enter__', '__eq__', '__exit__',
+            '__float__', '__floordiv__', '__format__', '__ge__', '__get__',
+            '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
+            '__iadd__', '__iand__', '__ifloordiv__', '__ilshift__', '__imatmul__',
+            '__imod__', '__import__', '__imul__', '__index__', '__init__',
+            '__instancecheck__', '__int__', '__invert__', '__ior__', '__ipow__',
+            '__irshift__', '__isub__', '__iter__', '__itruediv__', '__ixor__',
+            '__le__', '__len__', '__length_hint__', '__lshift__', '__lt__',
+            '__matmul__', '__missing__', '__mod__', '__mul__', '__ne__', '__neg__',
+            '__new__', '__next__', '__or__', '__pos__', '__pow__', '__prepare__',
+            '__radd__', '__rand__', '__rdivmod__', '__repr__', '__reversed__',
+            '__rfloordiv__', '__rlshift__', '__rmatmul__', '__rmod__', '__rmul__',
+            '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__',
+            '__rsub__', '__rtruediv__', '__rxor__', '__set__', '__setattr__',
+            '__setitem__', '__str__', '__sub__', '__subclasscheck__', '__truediv__',
+            '__xor__'), suffix=r'\b'),
+         Name.Function.Magic),
+    ]
+    tokens['magicvars'] = [
+        (words((
+            '__annotations__', '__bases__', '__class__', '__closure__', '__code__',
+            '__defaults__', '__dict__', '__doc__', '__file__', '__func__',
+            '__globals__', '__kwdefaults__', '__module__', '__mro__', '__name__',
+            '__objclass__', '__qualname__', '__self__', '__slots__', '__weakref__'),
+            suffix=r'\b'),
+         Name.Variable.Magic),
+    ]
+    tokens['numbers'] = [
+        (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+        (r'\d+[eE][+-]?[0-9]+j?', Number.Float),
+        (r'0[oO][0-7]+', Number.Oct),
+        (r'0[bB][01]+', Number.Bin),
+        (r'0[xX][a-fA-F0-9]+', Number.Hex),
+        (r'\d+', Number.Integer)
+    ]
+    tokens['backtick'] = []
+    tokens['name'] = [
+        (r'@\w+', Name.Decorator),
+        (r'@', Operator),  # new matrix multiplication operator
+        (uni_name, Name),
+    ]
+    tokens['funcname'] = [
+        (uni_name, Name.Function, '#pop')
+    ]
+    tokens['classname'] = [
+        (uni_name, Name.Class, '#pop')
+    ]
+    tokens['import'] = [
+        (r'(\s+)(as)(\s+)', bygroups(Text, Keyword, Text)),
+        (r'\.', Name.Namespace),
+        (uni_name, Name.Namespace),
+        (r'(\s*)(,)(\s*)', bygroups(Text, Operator, Text)),
+        default('#pop')  # all else: go back
+    ]
+    tokens['fromimport'] = [
+        (r'(\s+)(import)\b', bygroups(Text, Keyword), '#pop'),
+        (r'\.', Name.Namespace),
+        (uni_name, Name.Namespace),
+        default('#pop'),
+    ]
+    tokens['strings-single'] = innerstring_rules(String.Single)
+    tokens['strings-double'] = innerstring_rules(String.Double)
+
+    def analyse_text(text):
+        return shebang_matches(text, r'pythonw?3(\.\d)?')
+
+
+class PythonConsoleLexer(Lexer):
+    """
+    For Python console output or doctests, such as:
+
+    .. sourcecode:: pycon
+
+        >>> a = 'foo'
+        >>> print a
+        foo
+        >>> 1 / 0
+        Traceback (most recent call last):
+          File "<stdin>", line 1, in <module>
+        ZeroDivisionError: integer division or modulo by zero
+
+    Additional options:
+
+    `python3`
+        Use Python 3 lexer for code.  Default is ``False``.
+
+        .. versionadded:: 1.0
+    """
+    name = 'Python console session'
+    aliases = ['pycon']
+    mimetypes = ['text/x-python-doctest']
+
+    def __init__(self, **options):
+        self.python3 = get_bool_opt(options, 'python3', False)
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        if self.python3:
+            pylexer = Python3Lexer(**self.options)
+            tblexer = Python3TracebackLexer(**self.options)
+        else:
+            pylexer = PythonLexer(**self.options)
+            tblexer = PythonTracebackLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        curtb = ''
+        tbindex = 0
+        tb = 0
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith(u'>>> ') or line.startswith(u'... '):
+                tb = 0
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:4])]))
+                curcode += line[4:]
+            elif line.rstrip() == u'...' and not tb:
+                # only a new >>> prompt can end an exception block
+                # otherwise an ellipsis in place of the traceback frames
+                # will be mishandled
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, u'...')]))
+                curcode += line[3:]
+            else:
+                if curcode:
+                    for item in do_insertions(
+                            insertions, pylexer.get_tokens_unprocessed(curcode)):
+                        yield item
+                    curcode = ''
+                    insertions = []
+                if (line.startswith(u'Traceback (most recent call last):') or
+                        re.match(u'  File "[^"]+", line \\d+\\n$', line)):
+                    tb = 1
+                    curtb = line
+                    tbindex = match.start()
+                elif line == 'KeyboardInterrupt\n':
+                    yield match.start(), Name.Class, line
+                elif tb:
+                    curtb += line
+                    if not (line.startswith(' ') or line.strip() == u'...'):
+                        tb = 0
+                        for i, t, v in tblexer.get_tokens_unprocessed(curtb):
+                            yield tbindex+i, t, v
+                        curtb = ''
+                else:
+                    yield match.start(), Generic.Output, line
+        if curcode:
+            for item in do_insertions(insertions,
+                                      pylexer.get_tokens_unprocessed(curcode)):
+                yield item
+        if curtb:
+            for i, t, v in tblexer.get_tokens_unprocessed(curtb):
+                yield tbindex+i, t, v
+
+
+class PythonTracebackLexer(RegexLexer):
+    """
+    For Python tracebacks.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'Python Traceback'
+    aliases = ['pytb']
+    filenames = ['*.pytb']
+    mimetypes = ['text/x-python-traceback']
+
+    tokens = {
+        'root': [
+            # Cover both (most recent call last) and (innermost last)
+            # The optional ^C allows us to catch keyboard interrupt signals.
+            (r'^(\^C)?(Traceback.*\n)',
+             bygroups(Text, Generic.Traceback), 'intb'),
+            # SyntaxError starts with this.
+            (r'^(?=  File "[^"]+", line \d+)', Generic.Traceback, 'intb'),
+            (r'^.*\n', Other),
+        ],
+        'intb': [
+            (r'^(  File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text, Name, Text)),
+            (r'^(  File )("[^"]+")(, line )(\d+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text)),
+            (r'^(    )(.+)(\n)',
+             bygroups(Text, using(PythonLexer), Text)),
+            (r'^([ \t]*)(\.\.\.)(\n)',
+             bygroups(Text, Comment, Text)),  # for doctests...
+            (r'^([^:]+)(: )(.+)(\n)',
+             bygroups(Generic.Error, Text, Name, Text), '#pop'),
+            (r'^([a-zA-Z_]\w*)(:?\n)',
+             bygroups(Generic.Error, Text), '#pop')
+        ],
+    }
+
+
+class Python3TracebackLexer(RegexLexer):
+    """
+    For Python 3.0 tracebacks, with support for chained exceptions.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'Python 3.0 Traceback'
+    aliases = ['py3tb']
+    filenames = ['*.py3tb']
+    mimetypes = ['text/x-python3-traceback']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'^Traceback \(most recent call last\):\n', Generic.Traceback, 'intb'),
+            (r'^During handling of the above exception, another '
+             r'exception occurred:\n\n', Generic.Traceback),
+            (r'^The above exception was the direct cause of the '
+             r'following exception:\n\n', Generic.Traceback),
+            (r'^(?=  File "[^"]+", line \d+)', Generic.Traceback, 'intb'),
+        ],
+        'intb': [
+            (r'^(  File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text, Name, Text)),
+            (r'^(  File )("[^"]+")(, line )(\d+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text)),
+            (r'^(    )(.+)(\n)',
+             bygroups(Text, using(Python3Lexer), Text)),
+            (r'^([ \t]*)(\.\.\.)(\n)',
+             bygroups(Text, Comment, Text)),  # for doctests...
+            (r'^([^:]+)(: )(.+)(\n)',
+             bygroups(Generic.Error, Text, Name, Text), '#pop'),
+            (r'^([a-zA-Z_]\w*)(:?\n)',
+             bygroups(Generic.Error, Text), '#pop')
+        ],
+    }
+
+
+class CythonLexer(RegexLexer):
+    """
+    For Pyrex and `Cython <http://cython.org>`_ source code.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Cython'
+    aliases = ['cython', 'pyx', 'pyrex']
+    filenames = ['*.pyx', '*.pxd', '*.pxi']
+    mimetypes = ['text/x-cython', 'application/x-cython']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'^(\s*)("""(?:.|\n)*?""")', bygroups(Text, String.Doc)),
+            (r"^(\s*)('''(?:.|\n)*?''')", bygroups(Text, String.Doc)),
+            (r'[^\S\n]+', Text),
+            (r'#.*$', Comment),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'(<)([a-zA-Z0-9.?]+)(>)',
+             bygroups(Punctuation, Keyword.Type, Punctuation)),
+            (r'!=|==|<<|>>|[-~+/*%=<>&^|.?]', Operator),
+            (r'(from)(\d+)(<=)(\s+)(<)(\d+)(:)',
+             bygroups(Keyword, Number.Integer, Operator, Name, Operator,
+                      Name, Punctuation)),
+            include('keywords'),
+            (r'(def|property)(\s+)', bygroups(Keyword, Text), 'funcname'),
+            (r'(cp?def)(\s+)', bygroups(Keyword, Text), 'cdef'),
+            # (should actually start a block with only cdefs)
+            (r'(cdef)(:)', bygroups(Keyword, Punctuation)),
+            (r'(class|struct)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (r'(from)(\s+)', bygroups(Keyword, Text), 'fromimport'),
+            (r'(c?import)(\s+)', bygroups(Keyword, Text), 'import'),
+            include('builtins'),
+            include('backtick'),
+            ('(?:[rR]|[uU][rR]|[rR][uU])"""', String, 'tdqs'),
+            ("(?:[rR]|[uU][rR]|[rR][uU])'''", String, 'tsqs'),
+            ('(?:[rR]|[uU][rR]|[rR][uU])"', String, 'dqs'),
+            ("(?:[rR]|[uU][rR]|[rR][uU])'", String, 'sqs'),
+            ('[uU]?"""', String, combined('stringescape', 'tdqs')),
+            ("[uU]?'''", String, combined('stringescape', 'tsqs')),
+            ('[uU]?"', String, combined('stringescape', 'dqs')),
+            ("[uU]?'", String, combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'break', 'by', 'continue', 'ctypedef', 'del', 'elif',
+                'else', 'except', 'except?', 'exec', 'finally', 'for', 'fused', 'gil',
+                'global', 'if', 'include', 'lambda', 'nogil', 'pass', 'print',
+                'raise', 'return', 'try', 'while', 'yield', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+            (r'(DEF|IF|ELIF|ELSE)\b', Comment.Preproc),
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin',
+                'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr',
+                'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'delattr',
+                'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit',
+                'file', 'filter', 'float', 'frozenset', 'getattr', 'globals',
+                'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'intern', 'isinstance',
+                'issubclass', 'iter', 'len', 'list', 'locals', 'long', 'map', 'max',
+                'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'property',
+                'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed',
+                'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod',
+                'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'unsigned',
+                'vars', 'xrange', 'zip'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Builtin),
+            (r'(?<!\.)(self|None|Ellipsis|NotImplemented|False|True|NULL'
+             r')\b', Name.Builtin.Pseudo),
+            (words((
+                'ArithmeticError', 'AssertionError', 'AttributeError',
+                'BaseException', 'DeprecationWarning', 'EOFError', 'EnvironmentError',
+                'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit',
+                'IOError', 'ImportError', 'ImportWarning', 'IndentationError',
+                'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
+                'MemoryError', 'NameError', 'NotImplemented', 'NotImplementedError',
+                'OSError', 'OverflowError', 'OverflowWarning',
+                'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError',
+                'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',
+                'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError',
+                'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
+                'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
+                'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning',
+                'ZeroDivisionError'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Exception),
+        ],
+        'numbers': [
+            (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'0\d+', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer)
+        ],
+        'backtick': [
+            ('`.*?`', String.Backtick),
+        ],
+        'name': [
+            (r'@\w+', Name.Decorator),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'funcname': [
+            ('[a-zA-Z_]\w*', Name.Function, '#pop')
+        ],
+        'cdef': [
+            (r'(public|readonly|extern|api|inline)\b', Keyword.Reserved),
+            (r'(struct|enum|union|class)\b', Keyword),
+            (r'([a-zA-Z_]\w*)(\s*)(?=[(:#=]|$)',
+             bygroups(Name.Function, Text), '#pop'),
+            (r'([a-zA-Z_]\w*)(\s*)(,)',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'from\b', Keyword, '#pop'),
+            (r'as\b', Keyword),
+            (r':', Punctuation, '#pop'),
+            (r'(?=["\'])', Text, '#pop'),
+            (r'[a-zA-Z_]\w*', Keyword.Type),
+            (r'.', Text),
+        ],
+        'classname': [
+            ('[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'(\s+)(as)(\s+)', bygroups(Text, Keyword, Text)),
+            (r'[a-zA-Z_][\w.]*', Name.Namespace),
+            (r'(\s*)(,)(\s*)', bygroups(Text, Operator, Text)),
+            default('#pop')  # all else: go back
+        ],
+        'fromimport': [
+            (r'(\s+)(c?import)\b', bygroups(Text, Keyword), '#pop'),
+            (r'[a-zA-Z_.][\w.]*', Name.Namespace),
+            # ``cdef foo from "header"``, or ``for foo from 0 < i < 10``
+            default('#pop'),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings': [
+            (r'%(\([a-zA-Z0-9]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            (r'[^\\\'"%\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'%', String)
+            # newlines are an error (use "nl" state)
+        ],
+        'nl': [
+            (r'\n', String)
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here again for raw strings
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here again for raw strings
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+    }
+
+
+class DgLexer(RegexLexer):
+    """
+    Lexer for `dg <http://pyos.github.com/dg>`_,
+    a functional and object-oriented programming language
+    running on the CPython 3 VM.
+
+    .. versionadded:: 1.6
+    """
+    name = 'dg'
+    aliases = ['dg']
+    filenames = ['*.dg']
+    mimetypes = ['text/x-dg']
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#.*?$', Comment.Single),
+
+            (r'(?i)0b[01]+', Number.Bin),
+            (r'(?i)0o[0-7]+', Number.Oct),
+            (r'(?i)0x[0-9a-f]+', Number.Hex),
+            (r'(?i)[+-]?[0-9]+\.[0-9]+(e[+-]?[0-9]+)?j?', Number.Float),
+            (r'(?i)[+-]?[0-9]+e[+-]?\d+j?', Number.Float),
+            (r'(?i)[+-]?[0-9]+j?', Number.Integer),
+
+            (r"(?i)(br|r?b?)'''", String, combined('stringescape', 'tsqs', 'string')),
+            (r'(?i)(br|r?b?)"""', String, combined('stringescape', 'tdqs', 'string')),
+            (r"(?i)(br|r?b?)'", String, combined('stringescape', 'sqs', 'string')),
+            (r'(?i)(br|r?b?)"', String, combined('stringescape', 'dqs', 'string')),
+
+            (r"`\w+'*`", Operator),
+            (r'\b(and|in|is|or|where)\b', Operator.Word),
+            (r'[!$%&*+\-./:<-@\\^|~;,]+', Operator),
+
+            (words((
+                'bool', 'bytearray', 'bytes', 'classmethod', 'complex', 'dict', 'dict\'',
+                'float', 'frozenset', 'int', 'list', 'list\'', 'memoryview', 'object',
+                'property', 'range', 'set', 'set\'', 'slice', 'staticmethod', 'str',
+                'super', 'tuple', 'tuple\'', 'type'),
+                   prefix=r'(?<!\.)', suffix=r'(?![\'\w])'),
+             Name.Builtin),
+            (words((
+                '__import__', 'abs', 'all', 'any', 'bin', 'bind', 'chr', 'cmp', 'compile',
+                'complex', 'delattr', 'dir', 'divmod', 'drop', 'dropwhile', 'enumerate',
+                'eval', 'exhaust', 'filter', 'flip', 'foldl1?', 'format', 'fst',
+                'getattr', 'globals', 'hasattr', 'hash', 'head', 'hex', 'id', 'init',
+                'input', 'isinstance', 'issubclass', 'iter', 'iterate', 'last', 'len',
+                'locals', 'map', 'max', 'min', 'next', 'oct', 'open', 'ord', 'pow',
+                'print', 'repr', 'reversed', 'round', 'setattr', 'scanl1?', 'snd',
+                'sorted', 'sum', 'tail', 'take', 'takewhile', 'vars', 'zip'),
+                   prefix=r'(?<!\.)', suffix=r'(?![\'\w])'),
+             Name.Builtin),
+            (r"(?<!\.)(self|Ellipsis|NotImplemented|None|True|False)(?!['\w])",
+             Name.Builtin.Pseudo),
+
+            (r"(?<!\.)[A-Z]\w*(Error|Exception|Warning)'*(?!['\w])",
+             Name.Exception),
+            (r"(?<!\.)(Exception|GeneratorExit|KeyboardInterrupt|StopIteration|"
+             r"SystemExit)(?!['\w])", Name.Exception),
+
+            (r"(?<![\w.])(except|finally|for|if|import|not|otherwise|raise|"
+             r"subclass|while|with|yield)(?!['\w])", Keyword.Reserved),
+
+            (r"[A-Z_]+'*(?!['\w])", Name),
+            (r"[A-Z]\w+'*(?!['\w])", Keyword.Type),
+            (r"\w+'*", Name),
+
+            (r'[()]', Punctuation),
+            (r'.', Error),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'string': [
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            (r'[^\\\'"%\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'%', String),
+            (r'\n', String)
+        ],
+        'dqs': [
+            (r'"', String, '#pop')
+        ],
+        'sqs': [
+            (r"'", String, '#pop')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop')
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop')
+        ],
+    }
+
+
+class NumPyLexer(PythonLexer):
+    """
+    A Python lexer recognizing Numerical Python builtins.
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'NumPy'
+    aliases = ['numpy']
+
+    # override the mimetypes to not inherit them from python
+    mimetypes = []
+    filenames = []
+
+    EXTRA_KEYWORDS = set((
+        'abs', 'absolute', 'accumulate', 'add', 'alen', 'all', 'allclose',
+        'alltrue', 'alterdot', 'amax', 'amin', 'angle', 'any', 'append',
+        'apply_along_axis', 'apply_over_axes', 'arange', 'arccos', 'arccosh',
+        'arcsin', 'arcsinh', 'arctan', 'arctan2', 'arctanh', 'argmax', 'argmin',
+        'argsort', 'argwhere', 'around', 'array', 'array2string', 'array_equal',
+        'array_equiv', 'array_repr', 'array_split', 'array_str', 'arrayrange',
+        'asanyarray', 'asarray', 'asarray_chkfinite', 'ascontiguousarray',
+        'asfarray', 'asfortranarray', 'asmatrix', 'asscalar', 'astype',
+        'atleast_1d', 'atleast_2d', 'atleast_3d', 'average', 'bartlett',
+        'base_repr', 'beta', 'binary_repr', 'bincount', 'binomial',
+        'bitwise_and', 'bitwise_not', 'bitwise_or', 'bitwise_xor', 'blackman',
+        'bmat', 'broadcast', 'byte_bounds', 'bytes', 'byteswap', 'c_',
+        'can_cast', 'ceil', 'choose', 'clip', 'column_stack', 'common_type',
+        'compare_chararrays', 'compress', 'concatenate', 'conj', 'conjugate',
+        'convolve', 'copy', 'corrcoef', 'correlate', 'cos', 'cosh', 'cov',
+        'cross', 'cumprod', 'cumproduct', 'cumsum', 'delete', 'deprecate',
+        'diag', 'diagflat', 'diagonal', 'diff', 'digitize', 'disp', 'divide',
+        'dot', 'dsplit', 'dstack', 'dtype', 'dump', 'dumps', 'ediff1d', 'empty',
+        'empty_like', 'equal', 'exp', 'expand_dims', 'expm1', 'extract', 'eye',
+        'fabs', 'fastCopyAndTranspose', 'fft', 'fftfreq', 'fftshift', 'fill',
+        'finfo', 'fix', 'flat', 'flatnonzero', 'flatten', 'fliplr', 'flipud',
+        'floor', 'floor_divide', 'fmod', 'frexp', 'fromarrays', 'frombuffer',
+        'fromfile', 'fromfunction', 'fromiter', 'frompyfunc', 'fromstring',
+        'generic', 'get_array_wrap', 'get_include', 'get_numarray_include',
+        'get_numpy_include', 'get_printoptions', 'getbuffer', 'getbufsize',
+        'geterr', 'geterrcall', 'geterrobj', 'getfield', 'gradient', 'greater',
+        'greater_equal', 'gumbel', 'hamming', 'hanning', 'histogram',
+        'histogram2d', 'histogramdd', 'hsplit', 'hstack', 'hypot', 'i0',
+        'identity', 'ifft', 'imag', 'index_exp', 'indices', 'inf', 'info',
+        'inner', 'insert', 'int_asbuffer', 'interp', 'intersect1d',
+        'intersect1d_nu', 'inv', 'invert', 'iscomplex', 'iscomplexobj',
+        'isfinite', 'isfortran', 'isinf', 'isnan', 'isneginf', 'isposinf',
+        'isreal', 'isrealobj', 'isscalar', 'issctype', 'issubclass_',
+        'issubdtype', 'issubsctype', 'item', 'itemset', 'iterable', 'ix_',
+        'kaiser', 'kron', 'ldexp', 'left_shift', 'less', 'less_equal', 'lexsort',
+        'linspace', 'load', 'loads', 'loadtxt', 'log', 'log10', 'log1p', 'log2',
+        'logical_and', 'logical_not', 'logical_or', 'logical_xor', 'logspace',
+        'lstsq', 'mat', 'matrix', 'max', 'maximum', 'maximum_sctype',
+        'may_share_memory', 'mean', 'median', 'meshgrid', 'mgrid', 'min',
+        'minimum', 'mintypecode', 'mod', 'modf', 'msort', 'multiply', 'nan',
+        'nan_to_num', 'nanargmax', 'nanargmin', 'nanmax', 'nanmin', 'nansum',
+        'ndenumerate', 'ndim', 'ndindex', 'negative', 'newaxis', 'newbuffer',
+        'newbyteorder', 'nonzero', 'not_equal', 'obj2sctype', 'ogrid', 'ones',
+        'ones_like', 'outer', 'permutation', 'piecewise', 'pinv', 'pkgload',
+        'place', 'poisson', 'poly', 'poly1d', 'polyadd', 'polyder', 'polydiv',
+        'polyfit', 'polyint', 'polymul', 'polysub', 'polyval', 'power', 'prod',
+        'product', 'ptp', 'put', 'putmask', 'r_', 'randint', 'random_integers',
+        'random_sample', 'ranf', 'rank', 'ravel', 'real', 'real_if_close',
+        'recarray', 'reciprocal', 'reduce', 'remainder', 'repeat', 'require',
+        'reshape', 'resize', 'restoredot', 'right_shift', 'rint', 'roll',
+        'rollaxis', 'roots', 'rot90', 'round', 'round_', 'row_stack', 's_',
+        'sample', 'savetxt', 'sctype2char', 'searchsorted', 'seed', 'select',
+        'set_numeric_ops', 'set_printoptions', 'set_string_function',
+        'setbufsize', 'setdiff1d', 'seterr', 'seterrcall', 'seterrobj',
+        'setfield', 'setflags', 'setmember1d', 'setxor1d', 'shape',
+        'show_config', 'shuffle', 'sign', 'signbit', 'sin', 'sinc', 'sinh',
+        'size', 'slice', 'solve', 'sometrue', 'sort', 'sort_complex', 'source',
+        'split', 'sqrt', 'square', 'squeeze', 'standard_normal', 'std',
+        'subtract', 'sum', 'svd', 'swapaxes', 'take', 'tan', 'tanh', 'tensordot',
+        'test', 'tile', 'tofile', 'tolist', 'tostring', 'trace', 'transpose',
+        'trapz', 'tri', 'tril', 'trim_zeros', 'triu', 'true_divide', 'typeDict',
+        'typename', 'uniform', 'union1d', 'unique', 'unique1d', 'unravel_index',
+        'unwrap', 'vander', 'var', 'vdot', 'vectorize', 'view', 'vonmises',
+        'vsplit', 'vstack', 'weibull', 'where', 'who', 'zeros', 'zeros_like'
+    ))
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                PythonLexer.get_tokens_unprocessed(self, text):
+            if token is Name and value in self.EXTRA_KEYWORDS:
+                yield index, Keyword.Pseudo, value
+            else:
+                yield index, token, value
+
+    def analyse_text(text):
+        return (shebang_matches(text, r'pythonw?(2(\.\d)?)?') or
+                'import ' in text[:1000]) \
+            and ('import numpy' in text or 'from numpy import' in text)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/monte.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/monte.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/monte.py	(revision 1126)
@@ -0,0 +1,204 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.monte
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Monte programming language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.token import Comment, Error, Keyword, Name, Number, Operator, \
+    Punctuation, String, Whitespace
+from pygments.lexer import RegexLexer, include, words
+
+__all__ = ['MonteLexer']
+
+
+# `var` handled separately
+# `interface` handled separately
+_declarations = ['bind', 'def', 'fn', 'object']
+_methods = ['method', 'to']
+_keywords = [
+    'as', 'break', 'catch', 'continue', 'else', 'escape', 'exit', 'exports',
+    'extends', 'finally', 'for', 'guards', 'if', 'implements', 'import',
+    'in', 'match', 'meta', 'pass', 'return', 'switch', 'try', 'via', 'when',
+    'while',
+]
+_operators = [
+    # Unary
+    '~', '!',
+    # Binary
+    '+', '-', '*', '/', '%', '**', '&', '|', '^', '<<', '>>',
+    # Binary augmented
+    '+=', '-=', '*=', '/=', '%=', '**=', '&=', '|=', '^=', '<<=', '>>=',
+    # Comparison
+    '==', '!=', '<', '<=', '>', '>=', '<=>',
+    # Patterns and assignment
+    ':=', '?', '=~', '!~', '=>',
+    # Calls and sends
+    '.', '<-', '->',
+]
+_escape_pattern = (
+    r'(?:\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|'
+    r'\\["\'\\bftnr])')
+# _char = _escape_chars + [('.', String.Char)]
+_identifier = r'[_a-zA-Z]\w*'
+
+_constants = [
+    # Void constants
+    'null',
+    # Bool constants
+    'false', 'true',
+    # Double constants
+    'Infinity', 'NaN',
+    # Special objects
+    'M', 'Ref', 'throw', 'traceln',
+]
+
+_guards = [
+    'Any', 'Binding', 'Bool', 'Bytes', 'Char', 'DeepFrozen', 'Double',
+    'Empty', 'Int', 'List', 'Map', 'Near', 'NullOk', 'Same', 'Selfless',
+    'Set', 'Str', 'SubrangeGuard', 'Transparent', 'Void',
+]
+
+_safeScope = [
+    '_accumulateList', '_accumulateMap', '_auditedBy', '_bind',
+    '_booleanFlow', '_comparer', '_equalizer', '_iterForever', '_loop',
+    '_makeBytes', '_makeDouble', '_makeFinalSlot', '_makeInt', '_makeList',
+    '_makeMap', '_makeMessageDesc', '_makeOrderedSpace', '_makeParamDesc',
+    '_makeProtocolDesc', '_makeSourceSpan', '_makeString', '_makeVarSlot',
+    '_makeVerbFacet', '_mapExtract', '_matchSame', '_quasiMatcher',
+    '_slotToBinding', '_splitList', '_suchThat', '_switchFailed',
+    '_validateFor', 'b__quasiParser', 'eval', 'import', 'm__quasiParser',
+    'makeBrandPair', 'makeLazySlot', 'safeScope', 'simple__quasiParser',
+]
+
+
+class MonteLexer(RegexLexer):
+    """
+    Lexer for the `Monte <https://monte.readthedocs.io/>`_ programming language.
+
+    .. versionadded:: 2.2
+    """
+    name = 'Monte'
+    aliases = ['monte']
+    filenames = ['*.mt']
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'#[^\n]*\n', Comment),
+
+            # Docstrings
+            # Apologies for the non-greedy matcher here.
+            (r'/\*\*.*?\*/', String.Doc),
+
+            # `var` declarations
+            (r'\bvar\b', Keyword.Declaration, 'var'),
+
+            # `interface` declarations
+            (r'\binterface\b', Keyword.Declaration, 'interface'),
+
+            # method declarations
+            (words(_methods, prefix='\\b', suffix='\\b'),
+             Keyword, 'method'),
+
+            # All other declarations
+            (words(_declarations, prefix='\\b', suffix='\\b'),
+             Keyword.Declaration),
+
+            # Keywords
+            (words(_keywords, prefix='\\b', suffix='\\b'), Keyword),
+
+            # Literals
+            ('[+-]?0x[_0-9a-fA-F]+', Number.Hex),
+            (r'[+-]?[_0-9]+\.[_0-9]*([eE][+-]?[_0-9]+)?', Number.Float),
+            ('[+-]?[_0-9]+', Number.Integer),
+            ("'", String.Double, 'char'),
+            ('"', String.Double, 'string'),
+
+            # Quasiliterals
+            ('`', String.Backtick, 'ql'),
+
+            # Operators
+            (words(_operators), Operator),
+
+            # Verb operators
+            (_identifier + '=', Operator.Word),
+
+            # Safe scope constants
+            (words(_constants, prefix='\\b', suffix='\\b'),
+             Keyword.Pseudo),
+
+            # Safe scope guards
+            (words(_guards, prefix='\\b', suffix='\\b'), Keyword.Type),
+
+            # All other safe scope names
+            (words(_safeScope, prefix='\\b', suffix='\\b'),
+             Name.Builtin),
+
+            # Identifiers
+            (_identifier, Name),
+
+            # Punctuation
+            (r'\(|\)|\{|\}|\[|\]|:|,', Punctuation),
+
+            # Whitespace
+            (' +', Whitespace),
+
+            # Definite lexer errors
+            ('=', Error),
+        ],
+        'char': [
+            # It is definitely an error to have a char of width == 0.
+            ("'", Error, 'root'),
+            (_escape_pattern, String.Escape, 'charEnd'),
+            ('.', String.Char, 'charEnd'),
+        ],
+        'charEnd': [
+            ("'", String.Char, '#pop:2'),
+            # It is definitely an error to have a char of width > 1.
+            ('.', Error),
+        ],
+        # The state of things coming into an interface.
+        'interface': [
+            (' +', Whitespace),
+            (_identifier, Name.Class, '#pop'),
+            include('root'),
+        ],
+        # The state of things coming into a method.
+        'method': [
+            (' +', Whitespace),
+            (_identifier, Name.Function, '#pop'),
+            include('root'),
+        ],
+        'string': [
+            ('"', String.Double, 'root'),
+            (_escape_pattern, String.Escape),
+            (r'\n', String.Double),
+            ('.', String.Double),
+        ],
+        'ql': [
+            ('`', String.Backtick, 'root'),
+            (r'\$' + _escape_pattern, String.Escape),
+            (r'\$\$', String.Escape),
+            (r'@@', String.Escape),
+            (r'\$\{', String.Interpol, 'qlNest'),
+            (r'@\{', String.Interpol, 'qlNest'),
+            (r'\$' + _identifier, Name),
+            ('@' + _identifier, Name),
+            ('.', String.Backtick),
+        ],
+        'qlNest': [
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        # The state of things immediately following `var`.
+        'var': [
+            (' +', Whitespace),
+            (_identifier, Name.Variable, '#pop'),
+            include('root'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rnc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rnc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rnc.py	(revision 1126)
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.rnc
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Relax-NG Compact syntax
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation
+
+__all__ = ['RNCCompactLexer']
+
+
+class RNCCompactLexer(RegexLexer):
+    """
+    For `RelaxNG-compact <http://relaxng.org>`_ syntax.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'Relax-NG Compact'
+    aliases = ['rnc', 'rng-compact']
+    filenames = ['*.rnc']
+
+    tokens = {
+        'root': [
+            (r'namespace\b', Keyword.Namespace),
+            (r'(?:default|datatypes)\b', Keyword.Declaration),
+            (r'##.*$', Comment.Preproc),
+            (r'#.*$', Comment.Single),
+            (r'"[^"]*"', String.Double),
+            # TODO single quoted strings and escape sequences outside of
+            # double-quoted strings
+            (r'(?:element|attribute|mixed)\b', Keyword.Declaration, 'variable'),
+            (r'(text\b|xsd:[^ ]+)', Keyword.Type, 'maybe_xsdattributes'),
+            (r'[,?&*=|~]|>>', Operator),
+            (r'[(){}]', Punctuation),
+            (r'.', Text),
+        ],
+
+        # a variable has been declared using `element` or `attribute`
+        'variable': [
+            (r'[^{]+', Name.Variable),
+            (r'\{', Punctuation, '#pop'),
+        ],
+
+        # after an xsd:<datatype> declaration there may be attributes
+        'maybe_xsdattributes': [
+            (r'\{', Punctuation, 'xsdattributes'),
+            (r'\}', Punctuation, '#pop'),
+            (r'.', Text),
+        ],
+
+        # attributes take the form { key1 = value1 key2 = value2 ... }
+        'xsdattributes': [
+            (r'[^ =}]', Name.Attribute),
+            (r'=', Operator),
+            (r'"[^"]*"', String.Double),
+            (r'\}', Punctuation, '#pop'),
+            (r'.', Text),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/d.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/d.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/d.py	(revision 1126)
@@ -0,0 +1,251 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.d
+    ~~~~~~~~~~~~~~~~~
+
+    Lexers for D languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['DLexer', 'CrocLexer', 'MiniDLexer']
+
+
+class DLexer(RegexLexer):
+    """
+    For D source.
+
+    .. versionadded:: 1.2
+    """
+    name = 'D'
+    filenames = ['*.d', '*.di']
+    aliases = ['d']
+    mimetypes = ['text/x-dsrc']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            # (r'\\\n', Text), # line continuations
+            # Comments
+            (r'//(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'/\+', Comment.Multiline, 'nested_comment'),
+            # Keywords
+            (words((
+                'abstract', 'alias', 'align', 'asm', 'assert', 'auto', 'body',
+                'break', 'case', 'cast', 'catch', 'class', 'const', 'continue',
+                'debug', 'default', 'delegate', 'delete', 'deprecated', 'do', 'else',
+                'enum', 'export', 'extern', 'finally', 'final', 'foreach_reverse',
+                'foreach', 'for', 'function', 'goto', 'if', 'immutable', 'import',
+                'interface', 'invariant', 'inout', 'in', 'is', 'lazy', 'mixin',
+                'module', 'new', 'nothrow', 'out', 'override', 'package', 'pragma',
+                'private', 'protected', 'public', 'pure', 'ref', 'return', 'scope',
+                'shared', 'static', 'struct', 'super', 'switch', 'synchronized',
+                'template', 'this', 'throw', 'try', 'typedef', 'typeid', 'typeof',
+                'union', 'unittest', 'version', 'volatile', 'while', 'with',
+                '__gshared', '__traits', '__vector', '__parameters'),
+                suffix=r'\b'),
+             Keyword),
+            (words((
+                'bool', 'byte', 'cdouble', 'cent', 'cfloat', 'char', 'creal',
+                'dchar', 'double', 'float', 'idouble', 'ifloat', 'int', 'ireal',
+                'long', 'real', 'short', 'ubyte', 'ucent', 'uint', 'ulong',
+                'ushort', 'void', 'wchar'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(false|true|null)\b', Keyword.Constant),
+            (words((
+                '__FILE__', '__MODULE__', '__LINE__', '__FUNCTION__', '__PRETTY_FUNCTION__'
+                '', '__DATE__', '__EOF__', '__TIME__', '__TIMESTAMP__', '__VENDOR__',
+                '__VERSION__'), suffix=r'\b'),
+             Keyword.Pseudo),
+            (r'macro\b', Keyword.Reserved),
+            (r'(string|wstring|dstring|size_t|ptrdiff_t)\b', Name.Builtin),
+            # FloatLiteral
+            # -- HexFloat
+            (r'0[xX]([0-9a-fA-F_]*\.[0-9a-fA-F_]+|[0-9a-fA-F_]+)'
+             r'[pP][+\-]?[0-9_]+[fFL]?[i]?', Number.Float),
+            # -- DecimalFloat
+            (r'[0-9_]+(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*|[eE][+\-]?[0-9_]+)[fFL]?[i]?', Number.Float),
+            (r'\.(0|[1-9][0-9_]*)([eE][+\-]?[0-9_]+)?[fFL]?[i]?', Number.Float),
+            # IntegerLiteral
+            # -- Binary
+            (r'0[Bb][01_]+', Number.Bin),
+            # -- Octal
+            (r'0[0-7_]+', Number.Oct),
+            # -- Hexadecimal
+            (r'0[xX][0-9a-fA-F_]+', Number.Hex),
+            # -- Decimal
+            (r'(0|[1-9][0-9_]*)([LUu]|Lu|LU|uL|UL)?', Number.Integer),
+            # CharacterLiteral
+            (r"""'(\\['"?\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\&\w+;|.)'""",
+             String.Char),
+            # StringLiteral
+            # -- WysiwygString
+            (r'r"[^"]*"[cwd]?', String),
+            # -- AlternateWysiwygString
+            (r'`[^`]*`[cwd]?', String),
+            # -- DoubleQuotedString
+            (r'"(\\\\|\\"|[^"])*"[cwd]?', String),
+            # -- EscapeSequence
+            (r"\\(['\"?\\abfnrtv]|x[0-9a-fA-F]{2}|[0-7]{1,3}"
+             r"|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|&\w+;)",
+             String),
+            # -- HexString
+            (r'x"[0-9a-fA-F_\s]*"[cwd]?', String),
+            # -- DelimitedString
+            (r'q"\[', String, 'delimited_bracket'),
+            (r'q"\(', String, 'delimited_parenthesis'),
+            (r'q"<', String, 'delimited_angle'),
+            (r'q"\{', String, 'delimited_curly'),
+            (r'q"([a-zA-Z_]\w*)\n.*?\n\1"', String),
+            (r'q"(.).*?\1"', String),
+            # -- TokenString
+            (r'q\{', String, 'token_string'),
+            # Attributes
+            (r'@([a-zA-Z_]\w*)?', Name.Decorator),
+            # Tokens
+            (r'(~=|\^=|%=|\*=|==|!>=|!<=|!<>=|!<>|!<|!>|!=|>>>=|>>>|>>=|>>|>='
+             r'|<>=|<>|<<=|<<|<=|\+\+|\+=|--|-=|\|\||\|=|&&|&=|\.\.\.|\.\.|/=)'
+             r'|[/.&|\-+<>!()\[\]{}?,;:$=*%^~]', Punctuation),
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name),
+            # Line
+            (r'#line\s.*\n', Comment.Special),
+        ],
+        'nested_comment': [
+            (r'[^+/]+', Comment.Multiline),
+            (r'/\+', Comment.Multiline, '#push'),
+            (r'\+/', Comment.Multiline, '#pop'),
+            (r'[+/]', Comment.Multiline),
+        ],
+        'token_string': [
+            (r'\{', Punctuation, 'token_string_nest'),
+            (r'\}', String, '#pop'),
+            include('root'),
+        ],
+        'token_string_nest': [
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'delimited_bracket': [
+            (r'[^\[\]]+', String),
+            (r'\[', String, 'delimited_inside_bracket'),
+            (r'\]"', String, '#pop'),
+        ],
+        'delimited_inside_bracket': [
+            (r'[^\[\]]+', String),
+            (r'\[', String, '#push'),
+            (r'\]', String, '#pop'),
+        ],
+        'delimited_parenthesis': [
+            (r'[^()]+', String),
+            (r'\(', String, 'delimited_inside_parenthesis'),
+            (r'\)"', String, '#pop'),
+        ],
+        'delimited_inside_parenthesis': [
+            (r'[^()]+', String),
+            (r'\(', String, '#push'),
+            (r'\)', String, '#pop'),
+        ],
+        'delimited_angle': [
+            (r'[^<>]+', String),
+            (r'<', String, 'delimited_inside_angle'),
+            (r'>"', String, '#pop'),
+        ],
+        'delimited_inside_angle': [
+            (r'[^<>]+', String),
+            (r'<', String, '#push'),
+            (r'>', String, '#pop'),
+        ],
+        'delimited_curly': [
+            (r'[^{}]+', String),
+            (r'\{', String, 'delimited_inside_curly'),
+            (r'\}"', String, '#pop'),
+        ],
+        'delimited_inside_curly': [
+            (r'[^{}]+', String),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+    }
+
+
+class CrocLexer(RegexLexer):
+    """
+    For `Croc <http://jfbillingsley.com/croc>`_ source.
+    """
+    name = 'Croc'
+    filenames = ['*.croc']
+    aliases = ['croc']
+    mimetypes = ['text/x-crocsrc']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            # Comments
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'nestedcomment'),
+            # Keywords
+            (words((
+                'as', 'assert', 'break', 'case', 'catch', 'class', 'continue',
+                'default', 'do', 'else', 'finally', 'for', 'foreach', 'function',
+                'global', 'namespace', 'if', 'import', 'in', 'is', 'local',
+                'module', 'return', 'scope', 'super', 'switch', 'this', 'throw',
+                'try', 'vararg', 'while', 'with', 'yield'), suffix=r'\b'),
+             Keyword),
+            (r'(false|true|null)\b', Keyword.Constant),
+            # FloatLiteral
+            (r'([0-9][0-9_]*)(?=[.eE])(\.[0-9][0-9_]*)?([eE][+\-]?[0-9_]+)?',
+             Number.Float),
+            # IntegerLiteral
+            # -- Binary
+            (r'0[bB][01][01_]*', Number.Bin),
+            # -- Hexadecimal
+            (r'0[xX][0-9a-fA-F][0-9a-fA-F_]*', Number.Hex),
+            # -- Decimal
+            (r'([0-9][0-9_]*)(?![.eE])', Number.Integer),
+            # CharacterLiteral
+            (r"""'(\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\[0-9]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|.)'""",
+             String.Char),
+            # StringLiteral
+            # -- WysiwygString
+            (r'@"(""|[^"])*"', String),
+            (r'@`(``|[^`])*`', String),
+            (r"@'(''|[^'])*'", String),
+            # -- DoubleQuotedString
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # Tokens
+            (r'(~=|\^=|%=|\*=|==|!=|>>>=|>>>|>>=|>>|>=|<=>|\?=|-\>'
+             r'|<<=|<<|<=|\+\+|\+=|--|-=|\|\||\|=|&&|&=|\.\.|/=)'
+             r'|[-/.&$@|\+<>!()\[\]{}?,;:=*%^~#\\]', Punctuation),
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'nestedcomment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
+
+
+class MiniDLexer(CrocLexer):
+    """
+    For MiniD source. MiniD is now known as Croc.
+    """
+    name = 'MiniD'
+    filenames = []  # don't lex .md as MiniD, reserve for Markdown
+    aliases = ['minid']
+    mimetypes = ['text/x-minidsrc']
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/archetype.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/archetype.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/archetype.py	(revision 1126)
@@ -0,0 +1,318 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.archetype
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Archetype-related syntaxes, including:
+
+    - ODIN syntax <https://github.com/openEHR/odin>
+    - ADL syntax <http://www.openehr.org/releases/trunk/architecture/am/adl2.pdf>
+    - cADL sub-syntax of ADL
+
+    For uses of this syntax, see the openEHR archetypes <http://www.openEHR.org/ckm>
+
+    Contributed by Thomas Beale <https://github.com/wolandscat>,
+    <https://bitbucket.org/thomas_beale>.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, using, default
+from pygments.token import Text, Comment, Name, Literal, Number, String, \
+    Punctuation, Keyword, Operator, Generic
+
+__all__ = ['OdinLexer', 'CadlLexer', 'AdlLexer']
+
+
+class AtomsLexer(RegexLexer):
+    """
+    Lexer for Values used in ADL and ODIN.
+
+    .. versionadded:: 2.1
+    """
+
+    tokens = {
+        # ----- pseudo-states for inclusion -----
+        'whitespace': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'[ \t]*--.*$', Comment),
+        ],
+        'archetype_id': [
+            (r'[ \t]*([a-zA-Z]\w+(\.[a-zA-Z]\w+)*::)?[a-zA-Z]\w+(-[a-zA-Z]\w+){2}'
+             r'\.\w+[\w-]*\.v\d+(\.\d+){,2}((-[a-z]+)(\.\d+)?)?', Name.Decorator),
+        ],
+        'date_constraints': [
+            # ISO 8601-based date/time constraints
+            (r'[Xx?YyMmDdHhSs\d]{2,4}([:-][Xx?YyMmDdHhSs\d]{2}){2}', Literal.Date),
+            # ISO 8601-based duration constraints + optional trailing slash
+            (r'(P[YyMmWwDd]+(T[HhMmSs]+)?|PT[HhMmSs]+)/?', Literal.Date),
+        ],
+        'ordered_values': [
+            # ISO 8601 date with optional 'T' ligature
+            (r'\d{4}-\d{2}-\d{2}T?', Literal.Date),
+            # ISO 8601 time
+            (r'\d{2}:\d{2}:\d{2}(\.\d+)?([+-]\d{4}|Z)?', Literal.Date),
+            # ISO 8601 duration
+            (r'P((\d*(\.\d+)?[YyMmWwDd]){1,3}(T(\d*(\.\d+)?[HhMmSs]){,3})?|'
+             r'T(\d*(\.\d+)?[HhMmSs]){,3})', Literal.Date),
+            (r'[+-]?(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'[+-]?(\d+)*\.\d+%?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[+-]?\d+%?', Number.Integer),
+        ],
+        'values': [
+            include('ordered_values'),
+            (r'([Tt]rue|[Ff]alse)', Literal),
+            (r'"', String, 'string'),
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'[a-z][a-z0-9+.-]*:', Literal, 'uri'),
+            # term code
+            (r'(\[)(\w[\w-]*(?:\([^)\n]+\))?)(::)(\w[\w-]*)(\])',
+             bygroups(Punctuation, Name.Decorator, Punctuation, Name.Decorator,
+                      Punctuation)),
+            (r'\|', Punctuation, 'interval'),
+            # list continuation
+            (r'\.\.\.', Punctuation),
+        ],
+        'constraint_values': [
+            (r'(\[)(\w[\w-]*(?:\([^)\n]+\))?)(::)',
+             bygroups(Punctuation, Name.Decorator, Punctuation), 'adl14_code_constraint'),
+            # ADL 1.4 ordinal constraint
+            (r'(\d*)(\|)(\[\w[\w-]*::\w[\w-]*\])((?:[,;])?)',
+             bygroups(Number, Punctuation, Name.Decorator, Punctuation)),
+            include('date_constraints'),
+            include('values'),
+        ],
+
+        # ----- real states -----
+        'string': [
+            ('"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            # all other characters
+            (r'[^\\"]+', String),
+            # stray backslash
+            (r'\\', String),
+        ],
+        'uri': [
+            # effective URI terminators
+            (r'[,>\s]', Punctuation, '#pop'),
+            (r'[^>\s,]+', Literal),
+        ],
+        'interval': [
+            (r'\|', Punctuation, '#pop'),
+            include('ordered_values'),
+            (r'\.\.', Punctuation),
+            (r'[<>=] *', Punctuation),
+            # handle +/-
+            (r'\+/-', Punctuation),
+            (r'\s+', Text),
+        ],
+        'any_code': [
+            include('archetype_id'),
+            # if it is a code
+            (r'[a-z_]\w*[0-9.]+(@[^\]]+)?', Name.Decorator),
+            # if it is tuple with attribute names
+            (r'[a-z_]\w*', Name.Class),
+            # if it is an integer, i.e. Xpath child index
+            (r'[0-9]+', Text),
+            (r'\|', Punctuation, 'code_rubric'),
+            (r'\]', Punctuation, '#pop'),
+            # handle use_archetype statement
+            (r'\s*,\s*', Punctuation),
+        ],
+        'code_rubric': [
+            (r'\|', Punctuation, '#pop'),
+            (r'[^|]+', String),
+        ],
+        'adl14_code_constraint': [
+            (r'\]', Punctuation, '#pop'),
+            (r'\|', Punctuation, 'code_rubric'),
+            (r'(\w[\w-]*)([;,]?)', bygroups(Name.Decorator, Punctuation)),
+            include('whitespace'),
+        ],
+    }
+
+
+class OdinLexer(AtomsLexer):
+    """
+    Lexer for ODIN syntax.
+
+    .. versionadded:: 2.1
+    """
+    name = 'ODIN'
+    aliases = ['odin']
+    filenames = ['*.odin']
+    mimetypes = ['text/odin']
+
+    tokens = {
+        'path': [
+            (r'>', Punctuation, '#pop'),
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'/', Punctuation),
+            (r'\[', Punctuation, 'key'),
+            (r'\s*,\s*', Punctuation, '#pop'),
+            (r'\s+', Text, '#pop'),
+        ],
+        'key': [
+            include('values'),
+            (r'\]', Punctuation, '#pop'),
+        ],
+        'type_cast': [
+            (r'\)', Punctuation, '#pop'),
+            (r'[^)]+',  Name.Class),
+        ],
+        'root': [
+            include('whitespace'),
+            (r'([Tt]rue|[Ff]alse)', Literal),
+            include('values'),
+            # x-ref path
+            (r'/', Punctuation, 'path'),
+            # x-ref path starting with key
+            (r'\[', Punctuation, 'key'),
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'=', Operator),
+            (r'\(', Punctuation, 'type_cast'),
+            (r',', Punctuation),
+            (r'<', Punctuation),
+            (r'>', Punctuation),
+            (r';', Punctuation),
+        ],
+    }
+
+
+class CadlLexer(AtomsLexer):
+    """
+    Lexer for cADL syntax.
+
+    .. versionadded:: 2.1
+    """
+    name = 'cADL'
+    aliases = ['cadl']
+    filenames = ['*.cadl']
+
+    tokens = {
+        'path': [
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'/', Punctuation),
+            (r'\[', Punctuation, 'any_code'),
+            (r'\s+', Punctuation, '#pop'),
+        ],
+        'root': [
+            include('whitespace'),
+            (r'(cardinality|existence|occurrences|group|include|exclude|'
+             r'allow_archetype|use_archetype|use_node)\W', Keyword.Type),
+            (r'(and|or|not|there_exists|xor|implies|for_all)\W', Keyword.Type),
+            (r'(after|before|closed)\W', Keyword.Type),
+            (r'(not)\W', Operator),
+            (r'(matches|is_in)\W', Operator),
+            # is_in / not is_in char
+            (u'(\u2208|\u2209)', Operator),
+            # there_exists / not there_exists / for_all / and / or
+            (u'(\u2203|\u2204|\u2200|\u2227|\u2228|\u22BB|\223C)',
+             Operator),
+            # regex in slot or as string constraint
+            (r'(\{)(\s*/[^}]+/\s*)(\})',
+             bygroups(Punctuation, String.Regex, Punctuation)),
+            # regex in slot or as string constraint
+            (r'(\{)(\s*\^[^}]+\^\s*)(\})',
+             bygroups(Punctuation, String.Regex, Punctuation)),
+            (r'/', Punctuation, 'path'),
+            # for cardinality etc
+            (r'(\{)((?:\d+\.\.)?(?:\d+|\*))'
+             r'((?:\s*;\s*(?:ordered|unordered|unique)){,2})(\})',
+             bygroups(Punctuation, Number, Number, Punctuation)),
+            # [{ is start of a tuple value
+            (r'\[\{', Punctuation),
+            (r'\}\]', Punctuation),
+            (r'\{', Punctuation),
+            (r'\}', Punctuation),
+            include('constraint_values'),
+            # type name
+            (r'[A-Z]\w+(<[A-Z]\w+([A-Za-z_<>]*)>)?',  Name.Class),
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'\[', Punctuation, 'any_code'),
+            (r'(~|//|\\\\|\+|-|/|\*|\^|!=|=|<=|>=|<|>]?)', Operator),
+            (r'\(', Punctuation),
+            (r'\)', Punctuation),
+            # for lists of values
+            (r',', Punctuation),
+            (r'"', String, 'string'),
+            # for assumed value
+            (r';', Punctuation),
+        ],
+    }
+
+
+class AdlLexer(AtomsLexer):
+    """
+    Lexer for ADL syntax.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'ADL'
+    aliases = ['adl']
+    filenames = ['*.adl', '*.adls', '*.adlf', '*.adlx']
+
+    tokens = {
+        'whitespace': [
+            # blank line ends
+            (r'\s*\n', Text),
+            # comment-only line
+            (r'^[ \t]*--.*$', Comment),
+        ],
+        'odin_section': [
+            # repeating the following two rules from the root state enable multi-line
+            # strings that start in the first column to be dealt with
+            (r'^(language|description|ontology|terminology|annotations|'
+             r'component_terminologies|revision_history)[ \t]*\n', Generic.Heading),
+            (r'^(definition)[ \t]*\n', Generic.Heading, 'cadl_section'),
+            (r'^([ \t]*|[ \t]+.*)\n', using(OdinLexer)),
+            (r'^([^"]*")(>[ \t]*\n)', bygroups(String, Punctuation)),
+            # template overlay delimiter
+            (r'^----------*\n', Text, '#pop'),
+            (r'^.*\n', String),
+            default('#pop'),
+        ],
+        'cadl_section': [
+            (r'^([ \t]*|[ \t]+.*)\n', using(CadlLexer)),
+            default('#pop'),
+        ],
+        'rules_section': [
+            (r'^[ \t]+.*\n', using(CadlLexer)),
+            default('#pop'),
+        ],
+        'metadata': [
+            (r'\)', Punctuation, '#pop'),
+            (r';', Punctuation),
+            (r'([Tt]rue|[Ff]alse)', Literal),
+            # numbers and version ids
+            (r'\d+(\.\d+)*', Literal),
+            # Guids
+            (r'(\d|[a-fA-F])+(-(\d|[a-fA-F])+){3,}', Literal),
+            (r'\w+', Name.Class),
+            (r'"', String, 'string'),
+            (r'=', Operator),
+            (r'[ \t]+', Text),
+            default('#pop'),
+        ],
+        'root': [
+            (r'^(archetype|template_overlay|operational_template|template|'
+             r'speciali[sz]e)', Generic.Heading),
+            (r'^(language|description|ontology|terminology|annotations|'
+             r'component_terminologies|revision_history)[ \t]*\n',
+             Generic.Heading, 'odin_section'),
+            (r'^(definition)[ \t]*\n', Generic.Heading, 'cadl_section'),
+            (r'^(rules)[ \t]*\n', Generic.Heading, 'rules_section'),
+            include('archetype_id'),
+            (r'[ \t]*\(', Punctuation, 'metadata'),
+            include('whitespace'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/resource.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/resource.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/resource.py	(revision 1126)
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.resource
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for resource definition files.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Comment, String, Number, Operator, Text, \
+    Keyword, Name
+
+__all__ = ['ResourceLexer']
+
+
+class ResourceLexer(RegexLexer):
+    """Lexer for `ICU Resource bundles
+    <http://userguide.icu-project.org/locale/resources>`_.
+
+    .. versionadded:: 2.0
+    """
+    name = 'ResourceBundle'
+    aliases = ['resource', 'resourcebundle']
+    filenames = ['*.txt']
+
+    _types = (':table', ':array', ':string', ':bin', ':import', ':intvector',
+              ':int', ':alias')
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'//.*?$', Comment),
+            (r'"', String, 'string'),
+            (r'-?\d+', Number.Integer),
+            (r'[,{}]', Operator),
+            (r'([^\s{:]+)(\s*)(%s?)' % '|'.join(_types),
+             bygroups(Name, Text, Keyword)),
+            (r'\s+', Text),
+            (words(_types), Keyword),
+        ],
+        'string': [
+            (r'(\\x[0-9a-f]{2}|\\u[0-9a-f]{4}|\\U00[0-9a-f]{6}|'
+             r'\\[0-7]{1,3}|\\c.|\\[abtnvfre\'"?\\]|\\\{|[^"{\\])+', String),
+            (r'\{', String.Escape, 'msgname'),
+            (r'"', String, '#pop')
+        ],
+        'msgname': [
+            (r'([^{},]+)(\s*)', bygroups(Name, String.Escape), ('#pop', 'message'))
+        ],
+        'message': [
+            (r'\{', String.Escape, 'msgname'),
+            (r'\}', String.Escape, '#pop'),
+            (r'(,)(\s*)([a-z]+)(\s*\})',
+             bygroups(Operator, String.Escape, Keyword, String.Escape), '#pop'),
+            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)(offset)(\s*)(:)(\s*)(-?\d+)(\s*)',
+             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
+                      String.Escape, Operator.Word, String.Escape, Operator,
+                      String.Escape, Number.Integer, String.Escape), 'choice'),
+            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)',
+             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
+                      String.Escape), 'choice'),
+            (r'\s+', String.Escape)
+        ],
+        'choice': [
+            (r'(=|<|>|<=|>=|!=)(-?\d+)(\s*\{)',
+             bygroups(Operator, Number.Integer, String.Escape), 'message'),
+            (r'([a-z]+)(\s*\{)', bygroups(Keyword.Type, String.Escape), 'str'),
+            (r'\}', String.Escape, ('#pop', '#pop')),
+            (r'\s+', String.Escape)
+        ],
+        'str': [
+            (r'\}', String.Escape, '#pop'),
+            (r'\{', String.Escape, 'msgname'),
+            (r'[^{}]+', String)
+        ]
+    }
+
+    def analyse_text(text):
+        if text.startswith('root:table'):
+            return 1.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_tsql_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_tsql_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_tsql_builtins.py	(revision 1126)
@@ -0,0 +1,1004 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._tsql_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    These are manually translated lists from https://msdn.microsoft.com.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# See https://msdn.microsoft.com/en-us/library/ms174986.aspx.
+OPERATORS = (
+    '!<',
+    '!=',
+    '!>',
+    '<',
+    '<=',
+    '<>',
+    '=',
+    '>',
+    '>=',
+    '+',
+    '+=',
+    '-',
+    '-=',
+    '*',
+    '*=',
+    '/',
+    '/=',
+    '%',
+    '%=',
+    '&',
+    '&=',
+    '|',
+    '|=',
+    '^',
+    '^=',
+    '~',
+    '::',
+)
+
+OPERATOR_WORDS = (
+    'all',
+    'and',
+    'any',
+    'between',
+    'except',
+    'exists',
+    'in',
+    'intersect',
+    'like',
+    'not',
+    'or',
+    'some',
+    'union',
+)
+
+_KEYWORDS_SERVER = (
+    'add',
+    'all',
+    'alter',
+    'and',
+    'any',
+    'as',
+    'asc',
+    'authorization',
+    'backup',
+    'begin',
+    'between',
+    'break',
+    'browse',
+    'bulk',
+    'by',
+    'cascade',
+    'case',
+    'catch',
+    'check',
+    'checkpoint',
+    'close',
+    'clustered',
+    'coalesce',
+    'collate',
+    'column',
+    'commit',
+    'compute',
+    'constraint',
+    'contains',
+    'containstable',
+    'continue',
+    'convert',
+    'create',
+    'cross',
+    'current',
+    'current_date',
+    'current_time',
+    'current_timestamp',
+    'current_user',
+    'cursor',
+    'database',
+    'dbcc',
+    'deallocate',
+    'declare',
+    'default',
+    'delete',
+    'deny',
+    'desc',
+    'disk',
+    'distinct',
+    'distributed',
+    'double',
+    'drop',
+    'dump',
+    'else',
+    'end',
+    'errlvl',
+    'escape',
+    'except',
+    'exec',
+    'execute',
+    'exists',
+    'exit',
+    'external',
+    'fetch',
+    'file',
+    'fillfactor',
+    'for',
+    'foreign',
+    'freetext',
+    'freetexttable',
+    'from',
+    'full',
+    'function',
+    'goto',
+    'grant',
+    'group',
+    'having',
+    'holdlock',
+    'identity',
+    'identity_insert',
+    'identitycol',
+    'if',
+    'in',
+    'index',
+    'inner',
+    'insert',
+    'intersect',
+    'into',
+    'is',
+    'join',
+    'key',
+    'kill',
+    'left',
+    'like',
+    'lineno',
+    'load',
+    'merge',
+    'national',
+    'nocheck',
+    'nonclustered',
+    'not',
+    'null',
+    'nullif',
+    'of',
+    'off',
+    'offsets',
+    'on',
+    'open',
+    'opendatasource',
+    'openquery',
+    'openrowset',
+    'openxml',
+    'option',
+    'or',
+    'order',
+    'outer',
+    'over',
+    'percent',
+    'pivot',
+    'plan',
+    'precision',
+    'primary',
+    'print',
+    'proc',
+    'procedure',
+    'public',
+    'raiserror',
+    'read',
+    'readtext',
+    'reconfigure',
+    'references',
+    'replication',
+    'restore',
+    'restrict',
+    'return',
+    'revert',
+    'revoke',
+    'right',
+    'rollback',
+    'rowcount',
+    'rowguidcol',
+    'rule',
+    'save',
+    'schema',
+    'securityaudit',
+    'select',
+    'semantickeyphrasetable',
+    'semanticsimilaritydetailstable',
+    'semanticsimilaritytable',
+    'session_user',
+    'set',
+    'setuser',
+    'shutdown',
+    'some',
+    'statistics',
+    'system_user',
+    'table',
+    'tablesample',
+    'textsize',
+    'then',
+    'throw',
+    'to',
+    'top',
+    'tran',
+    'transaction',
+    'trigger',
+    'truncate',
+    'try',
+    'try_convert',
+    'tsequal',
+    'union',
+    'unique',
+    'unpivot',
+    'update',
+    'updatetext',
+    'use',
+    'user',
+    'values',
+    'varying',
+    'view',
+    'waitfor',
+    'when',
+    'where',
+    'while',
+    'with',
+    'within',
+    'writetext',
+)
+
+_KEYWORDS_FUTURE = (
+    'absolute',
+    'action',
+    'admin',
+    'after',
+    'aggregate',
+    'alias',
+    'allocate',
+    'are',
+    'array',
+    'asensitive',
+    'assertion',
+    'asymmetric',
+    'at',
+    'atomic',
+    'before',
+    'binary',
+    'bit',
+    'blob',
+    'boolean',
+    'both',
+    'breadth',
+    'call',
+    'called',
+    'cardinality',
+    'cascaded',
+    'cast',
+    'catalog',
+    'char',
+    'character',
+    'class',
+    'clob',
+    'collation',
+    'collect',
+    'completion',
+    'condition',
+    'connect',
+    'connection',
+    'constraints',
+    'constructor',
+    'corr',
+    'corresponding',
+    'covar_pop',
+    'covar_samp',
+    'cube',
+    'cume_dist',
+    'current_catalog',
+    'current_default_transform_group',
+    'current_path',
+    'current_role',
+    'current_schema',
+    'current_transform_group_for_type',
+    'cycle',
+    'data',
+    'date',
+    'day',
+    'dec',
+    'decimal',
+    'deferrable',
+    'deferred',
+    'depth',
+    'deref',
+    'describe',
+    'descriptor',
+    'destroy',
+    'destructor',
+    'deterministic',
+    'diagnostics',
+    'dictionary',
+    'disconnect',
+    'domain',
+    'dynamic',
+    'each',
+    'element',
+    'end-exec',
+    'equals',
+    'every',
+    'exception',
+    'false',
+    'filter',
+    'first',
+    'float',
+    'found',
+    'free',
+    'fulltexttable',
+    'fusion',
+    'general',
+    'get',
+    'global',
+    'go',
+    'grouping',
+    'hold',
+    'host',
+    'hour',
+    'ignore',
+    'immediate',
+    'indicator',
+    'initialize',
+    'initially',
+    'inout',
+    'input',
+    'int',
+    'integer',
+    'intersection',
+    'interval',
+    'isolation',
+    'iterate',
+    'language',
+    'large',
+    'last',
+    'lateral',
+    'leading',
+    'less',
+    'level',
+    'like_regex',
+    'limit',
+    'ln',
+    'local',
+    'localtime',
+    'localtimestamp',
+    'locator',
+    'map',
+    'match',
+    'member',
+    'method',
+    'minute',
+    'mod',
+    'modifies',
+    'modify',
+    'module',
+    'month',
+    'multiset',
+    'names',
+    'natural',
+    'nchar',
+    'nclob',
+    'new',
+    'next',
+    'no',
+    'none',
+    'normalize',
+    'numeric',
+    'object',
+    'occurrences_regex',
+    'old',
+    'only',
+    'operation',
+    'ordinality',
+    'out',
+    'output',
+    'overlay',
+    'pad',
+    'parameter',
+    'parameters',
+    'partial',
+    'partition',
+    'path',
+    'percent_rank',
+    'percentile_cont',
+    'percentile_disc',
+    'position_regex',
+    'postfix',
+    'prefix',
+    'preorder',
+    'prepare',
+    'preserve',
+    'prior',
+    'privileges',
+    'range',
+    'reads',
+    'real',
+    'recursive',
+    'ref',
+    'referencing',
+    'regr_avgx',
+    'regr_avgy',
+    'regr_count',
+    'regr_intercept',
+    'regr_r2',
+    'regr_slope',
+    'regr_sxx',
+    'regr_sxy',
+    'regr_syy',
+    'relative',
+    'release',
+    'result',
+    'returns',
+    'role',
+    'rollup',
+    'routine',
+    'row',
+    'rows',
+    'savepoint',
+    'scope',
+    'scroll',
+    'search',
+    'second',
+    'section',
+    'sensitive',
+    'sequence',
+    'session',
+    'sets',
+    'similar',
+    'size',
+    'smallint',
+    'space',
+    'specific',
+    'specifictype',
+    'sql',
+    'sqlexception',
+    'sqlstate',
+    'sqlwarning',
+    'start',
+    'state',
+    'statement',
+    'static',
+    'stddev_pop',
+    'stddev_samp',
+    'structure',
+    'submultiset',
+    'substring_regex',
+    'symmetric',
+    'system',
+    'temporary',
+    'terminate',
+    'than',
+    'time',
+    'timestamp',
+    'timezone_hour',
+    'timezone_minute',
+    'trailing',
+    'translate_regex',
+    'translation',
+    'treat',
+    'true',
+    'uescape',
+    'under',
+    'unknown',
+    'unnest',
+    'usage',
+    'using',
+    'value',
+    'var_pop',
+    'var_samp',
+    'varchar',
+    'variable',
+    'whenever',
+    'width_bucket',
+    'window',
+    'within',
+    'without',
+    'work',
+    'write',
+    'xmlagg',
+    'xmlattributes',
+    'xmlbinary',
+    'xmlcast',
+    'xmlcomment',
+    'xmlconcat',
+    'xmldocument',
+    'xmlelement',
+    'xmlexists',
+    'xmlforest',
+    'xmliterate',
+    'xmlnamespaces',
+    'xmlparse',
+    'xmlpi',
+    'xmlquery',
+    'xmlserialize',
+    'xmltable',
+    'xmltext',
+    'xmlvalidate',
+    'year',
+    'zone',
+)
+
+_KEYWORDS_ODBC = (
+    'absolute',
+    'action',
+    'ada',
+    'add',
+    'all',
+    'allocate',
+    'alter',
+    'and',
+    'any',
+    'are',
+    'as',
+    'asc',
+    'assertion',
+    'at',
+    'authorization',
+    'avg',
+    'begin',
+    'between',
+    'bit',
+    'bit_length',
+    'both',
+    'by',
+    'cascade',
+    'cascaded',
+    'case',
+    'cast',
+    'catalog',
+    'char',
+    'char_length',
+    'character',
+    'character_length',
+    'check',
+    'close',
+    'coalesce',
+    'collate',
+    'collation',
+    'column',
+    'commit',
+    'connect',
+    'connection',
+    'constraint',
+    'constraints',
+    'continue',
+    'convert',
+    'corresponding',
+    'count',
+    'create',
+    'cross',
+    'current',
+    'current_date',
+    'current_time',
+    'current_timestamp',
+    'current_user',
+    'cursor',
+    'date',
+    'day',
+    'deallocate',
+    'dec',
+    'decimal',
+    'declare',
+    'default',
+    'deferrable',
+    'deferred',
+    'delete',
+    'desc',
+    'describe',
+    'descriptor',
+    'diagnostics',
+    'disconnect',
+    'distinct',
+    'domain',
+    'double',
+    'drop',
+    'else',
+    'end',
+    'end-exec',
+    'escape',
+    'except',
+    'exception',
+    'exec',
+    'execute',
+    'exists',
+    'external',
+    'extract',
+    'false',
+    'fetch',
+    'first',
+    'float',
+    'for',
+    'foreign',
+    'fortran',
+    'found',
+    'from',
+    'full',
+    'get',
+    'global',
+    'go',
+    'goto',
+    'grant',
+    'group',
+    'having',
+    'hour',
+    'identity',
+    'immediate',
+    'in',
+    'include',
+    'index',
+    'indicator',
+    'initially',
+    'inner',
+    'input',
+    'insensitive',
+    'insert',
+    'int',
+    'integer',
+    'intersect',
+    'interval',
+    'into',
+    'is',
+    'isolation',
+    'join',
+    'key',
+    'language',
+    'last',
+    'leading',
+    'left',
+    'level',
+    'like',
+    'local',
+    'lower',
+    'match',
+    'max',
+    'min',
+    'minute',
+    'module',
+    'month',
+    'names',
+    'national',
+    'natural',
+    'nchar',
+    'next',
+    'no',
+    'none',
+    'not',
+    'null',
+    'nullif',
+    'numeric',
+    'octet_length',
+    'of',
+    'on',
+    'only',
+    'open',
+    'option',
+    'or',
+    'order',
+    'outer',
+    'output',
+    'overlaps',
+    'pad',
+    'partial',
+    'pascal',
+    'position',
+    'precision',
+    'prepare',
+    'preserve',
+    'primary',
+    'prior',
+    'privileges',
+    'procedure',
+    'public',
+    'read',
+    'real',
+    'references',
+    'relative',
+    'restrict',
+    'revoke',
+    'right',
+    'rollback',
+    'rows',
+    'schema',
+    'scroll',
+    'second',
+    'section',
+    'select',
+    'session',
+    'session_user',
+    'set',
+    'size',
+    'smallint',
+    'some',
+    'space',
+    'sql',
+    'sqlca',
+    'sqlcode',
+    'sqlerror',
+    'sqlstate',
+    'sqlwarning',
+    'substring',
+    'sum',
+    'system_user',
+    'table',
+    'temporary',
+    'then',
+    'time',
+    'timestamp',
+    'timezone_hour',
+    'timezone_minute',
+    'to',
+    'trailing',
+    'transaction',
+    'translate',
+    'translation',
+    'trim',
+    'true',
+    'union',
+    'unique',
+    'unknown',
+    'update',
+    'upper',
+    'usage',
+    'user',
+    'using',
+    'value',
+    'values',
+    'varchar',
+    'varying',
+    'view',
+    'when',
+    'whenever',
+    'where',
+    'with',
+    'work',
+    'write',
+    'year',
+    'zone',
+)
+
+# See https://msdn.microsoft.com/en-us/library/ms189822.aspx.
+KEYWORDS = sorted(set(_KEYWORDS_FUTURE + _KEYWORDS_ODBC + _KEYWORDS_SERVER))
+
+# See https://msdn.microsoft.com/en-us/library/ms187752.aspx.
+TYPES = (
+    'bigint',
+    'binary',
+    'bit',
+    'char',
+    'cursor',
+    'date',
+    'datetime',
+    'datetime2',
+    'datetimeoffset',
+    'decimal',
+    'float',
+    'hierarchyid',
+    'image',
+    'int',
+    'money',
+    'nchar',
+    'ntext',
+    'numeric',
+    'nvarchar',
+    'real',
+    'smalldatetime',
+    'smallint',
+    'smallmoney',
+    'sql_variant',
+    'table',
+    'text',
+    'time',
+    'timestamp',
+    'tinyint',
+    'uniqueidentifier',
+    'varbinary',
+    'varchar',
+    'xml',
+)
+
+# See https://msdn.microsoft.com/en-us/library/ms174318.aspx.
+FUNCTIONS = (
+    '$partition',
+    'abs',
+    'acos',
+    'app_name',
+    'applock_mode',
+    'applock_test',
+    'ascii',
+    'asin',
+    'assemblyproperty',
+    'atan',
+    'atn2',
+    'avg',
+    'binary_checksum',
+    'cast',
+    'ceiling',
+    'certencoded',
+    'certprivatekey',
+    'char',
+    'charindex',
+    'checksum',
+    'checksum_agg',
+    'choose',
+    'col_length',
+    'col_name',
+    'columnproperty',
+    'compress',
+    'concat',
+    'connectionproperty',
+    'context_info',
+    'convert',
+    'cos',
+    'cot',
+    'count',
+    'count_big',
+    'current_request_id',
+    'current_timestamp',
+    'current_transaction_id',
+    'current_user',
+    'cursor_status',
+    'database_principal_id',
+    'databasepropertyex',
+    'dateadd',
+    'datediff',
+    'datediff_big',
+    'datefromparts',
+    'datename',
+    'datepart',
+    'datetime2fromparts',
+    'datetimefromparts',
+    'datetimeoffsetfromparts',
+    'day',
+    'db_id',
+    'db_name',
+    'decompress',
+    'degrees',
+    'dense_rank',
+    'difference',
+    'eomonth',
+    'error_line',
+    'error_message',
+    'error_number',
+    'error_procedure',
+    'error_severity',
+    'error_state',
+    'exp',
+    'file_id',
+    'file_idex',
+    'file_name',
+    'filegroup_id',
+    'filegroup_name',
+    'filegroupproperty',
+    'fileproperty',
+    'floor',
+    'format',
+    'formatmessage',
+    'fulltextcatalogproperty',
+    'fulltextserviceproperty',
+    'get_filestream_transaction_context',
+    'getansinull',
+    'getdate',
+    'getutcdate',
+    'grouping',
+    'grouping_id',
+    'has_perms_by_name',
+    'host_id',
+    'host_name',
+    'iif',
+    'index_col',
+    'indexkey_property',
+    'indexproperty',
+    'is_member',
+    'is_rolemember',
+    'is_srvrolemember',
+    'isdate',
+    'isjson',
+    'isnull',
+    'isnumeric',
+    'json_modify',
+    'json_query',
+    'json_value',
+    'left',
+    'len',
+    'log',
+    'log10',
+    'lower',
+    'ltrim',
+    'max',
+    'min',
+    'min_active_rowversion',
+    'month',
+    'nchar',
+    'newid',
+    'newsequentialid',
+    'ntile',
+    'object_definition',
+    'object_id',
+    'object_name',
+    'object_schema_name',
+    'objectproperty',
+    'objectpropertyex',
+    'opendatasource',
+    'openjson',
+    'openquery',
+    'openrowset',
+    'openxml',
+    'original_db_name',
+    'original_login',
+    'parse',
+    'parsename',
+    'patindex',
+    'permissions',
+    'pi',
+    'power',
+    'pwdcompare',
+    'pwdencrypt',
+    'quotename',
+    'radians',
+    'rand',
+    'rank',
+    'replace',
+    'replicate',
+    'reverse',
+    'right',
+    'round',
+    'row_number',
+    'rowcount_big',
+    'rtrim',
+    'schema_id',
+    'schema_name',
+    'scope_identity',
+    'serverproperty',
+    'session_context',
+    'session_user',
+    'sign',
+    'sin',
+    'smalldatetimefromparts',
+    'soundex',
+    'sp_helplanguage',
+    'space',
+    'sqrt',
+    'square',
+    'stats_date',
+    'stdev',
+    'stdevp',
+    'str',
+    'string_escape',
+    'string_split',
+    'stuff',
+    'substring',
+    'sum',
+    'suser_id',
+    'suser_name',
+    'suser_sid',
+    'suser_sname',
+    'switchoffset',
+    'sysdatetime',
+    'sysdatetimeoffset',
+    'system_user',
+    'sysutcdatetime',
+    'tan',
+    'textptr',
+    'textvalid',
+    'timefromparts',
+    'todatetimeoffset',
+    'try_cast',
+    'try_convert',
+    'try_parse',
+    'type_id',
+    'type_name',
+    'typeproperty',
+    'unicode',
+    'upper',
+    'user_id',
+    'user_name',
+    'var',
+    'varp',
+    'xact_state',
+    'year',
+)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/snobol.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/snobol.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/snobol.py	(revision 1126)
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.snobol
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the SNOBOL language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SnobolLexer']
+
+
+class SnobolLexer(RegexLexer):
+    """
+    Lexer for the SNOBOL4 programming language.
+
+    Recognizes the common ASCII equivalents of the original SNOBOL4 operators.
+    Does not require spaces around binary operators.
+
+    .. versionadded:: 1.5
+    """
+
+    name = "Snobol"
+    aliases = ["snobol"]
+    filenames = ['*.snobol']
+    mimetypes = ['text/x-snobol']
+
+    tokens = {
+        # root state, start of line
+        # comments, continuation lines, and directives start in column 1
+        # as do labels
+        'root': [
+            (r'\*.*\n', Comment),
+            (r'[+.] ', Punctuation, 'statement'),
+            (r'-.*\n', Comment),
+            (r'END\s*\n', Name.Label, 'heredoc'),
+            (r'[A-Za-z$][\w$]*', Name.Label, 'statement'),
+            (r'\s+', Text, 'statement'),
+        ],
+        # statement state, line after continuation or label
+        'statement': [
+            (r'\s*\n', Text, '#pop'),
+            (r'\s+', Text),
+            (r'(?<=[^\w.])(LT|LE|EQ|NE|GE|GT|INTEGER|IDENT|DIFFER|LGT|SIZE|'
+             r'REPLACE|TRIM|DUPL|REMDR|DATE|TIME|EVAL|APPLY|OPSYN|LOAD|UNLOAD|'
+             r'LEN|SPAN|BREAK|ANY|NOTANY|TAB|RTAB|REM|POS|RPOS|FAIL|FENCE|'
+             r'ABORT|ARB|ARBNO|BAL|SUCCEED|INPUT|OUTPUT|TERMINAL)(?=[^\w.])',
+             Name.Builtin),
+            (r'[A-Za-z][\w.]*', Name),
+            # ASCII equivalents of original operators
+            # | for the EBCDIC equivalent, ! likewise
+            # \ for EBCDIC negation
+            (r'\*\*|[?$.!%*/#+\-@|&\\=]', Operator),
+            (r'"[^"]*"', String),
+            (r"'[^']*'", String),
+            # Accept SPITBOL syntax for real numbers
+            # as well as Macro SNOBOL4
+            (r'[0-9]+(?=[^.EeDd])', Number.Integer),
+            (r'[0-9]+(\.[0-9]*)?([EDed][-+]?[0-9]+)?', Number.Float),
+            # Goto
+            (r':', Punctuation, 'goto'),
+            (r'[()<>,;]', Punctuation),
+        ],
+        # Goto block
+        'goto': [
+            (r'\s*\n', Text, "#pop:2"),
+            (r'\s+', Text),
+            (r'F|S', Keyword),
+            (r'(\()([A-Za-z][\w.]*)(\))',
+             bygroups(Punctuation, Name.Label, Punctuation))
+        ],
+        # everything after the END statement is basically one
+        # big heredoc.
+        'heredoc': [
+            (r'.*\n', String.Heredoc)
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/modeling.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/modeling.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/modeling.py	(revision 1126)
@@ -0,0 +1,358 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.modeling
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for modeling languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+from pygments.lexers.html import HtmlLexer
+from pygments.lexers import _stan_builtins
+
+__all__ = ['ModelicaLexer', 'BugsLexer', 'JagsLexer', 'StanLexer']
+
+
+class ModelicaLexer(RegexLexer):
+    """
+    For `Modelica <http://www.modelica.org/>`_ source code.
+
+    .. versionadded:: 1.1
+    """
+    name = 'Modelica'
+    aliases = ['modelica']
+    filenames = ['*.mo']
+    mimetypes = ['text/x-modelica']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    _name = r"(?:'(?:[^\\']|\\.)+'|[a-zA-Z_]\w*)"
+
+    tokens = {
+        'whitespace': [
+            (u'[\\s\ufeff]+', Text),
+            (r'//[^\n]*\n?', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'root': [
+            include('whitespace'),
+            (r'"', String.Double, 'string'),
+            (r'[()\[\]{},;]+', Punctuation),
+            (r'\.?[*^/+-]|\.|<>|[<>:=]=?', Operator),
+            (r'\d+(\.?\d*[eE][-+]?\d+|\.\d*)', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'(abs|acos|actualStream|array|asin|assert|AssertionLevel|atan|'
+             r'atan2|backSample|Boolean|cardinality|cat|ceil|change|Clock|'
+             r'Connections|cos|cosh|cross|delay|diagonal|div|edge|exp|'
+             r'ExternalObject|fill|floor|getInstanceName|hold|homotopy|'
+             r'identity|inStream|integer|Integer|interval|inverse|isPresent|'
+             r'linspace|log|log10|matrix|max|min|mod|ndims|noClock|noEvent|'
+             r'ones|outerProduct|pre|previous|product|Real|reinit|rem|rooted|'
+             r'sample|scalar|semiLinear|shiftSample|sign|sin|sinh|size|skew|'
+             r'smooth|spatialDistribution|sqrt|StateSelect|String|subSample|'
+             r'sum|superSample|symmetric|tan|tanh|terminal|terminate|time|'
+             r'transpose|vector|zeros)\b', Name.Builtin),
+            (r'(algorithm|annotation|break|connect|constant|constrainedby|der|'
+             r'discrete|each|else|elseif|elsewhen|encapsulated|enumeration|'
+             r'equation|exit|expandable|extends|external|final|flow|for|if|'
+             r'import|impure|in|initial|inner|input|loop|nondiscrete|outer|'
+             r'output|parameter|partial|protected|public|pure|redeclare|'
+             r'replaceable|return|stream|then|when|while)\b',
+             Keyword.Reserved),
+            (r'(and|not|or)\b', Operator.Word),
+            (r'(block|class|connector|end|function|model|operator|package|'
+             r'record|type)\b', Keyword.Reserved, 'class'),
+            (r'(false|true)\b', Keyword.Constant),
+            (r'within\b', Keyword.Reserved, 'package-prefix'),
+            (_name, Name)
+        ],
+        'class': [
+            include('whitespace'),
+            (r'(function|record)\b', Keyword.Reserved),
+            (r'(if|for|when|while)\b', Keyword.Reserved, '#pop'),
+            (_name, Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'package-prefix': [
+            include('whitespace'),
+            (_name, Name.Namespace, '#pop'),
+            default('#pop')
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\[\'"?\\abfnrtv]', String.Escape),
+            (r'(?i)<\s*html\s*>([^\\"]|\\.)+?(<\s*/\s*html\s*>|(?="))',
+             using(HtmlLexer)),
+            (r'<|\\?[^"\\<]+', String.Double)
+        ]
+    }
+
+
+class BugsLexer(RegexLexer):
+    """
+    Pygments Lexer for `OpenBugs <http://www.openbugs.net/>`_ and WinBugs
+    models.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'BUGS'
+    aliases = ['bugs', 'winbugs', 'openbugs']
+    filenames = ['*.bug']
+
+    _FUNCTIONS = (
+        # Scalar functions
+        'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
+        'cloglog', 'cos', 'cosh', 'cumulative', 'cut', 'density', 'deviance',
+        'equals', 'expr', 'gammap', 'ilogit', 'icloglog', 'integral', 'log',
+        'logfact', 'loggam', 'logit', 'max', 'min', 'phi', 'post.p.value',
+        'pow', 'prior.p.value', 'probit', 'replicate.post', 'replicate.prior',
+        'round', 'sin', 'sinh', 'solution', 'sqrt', 'step', 'tan', 'tanh',
+        'trunc',
+        # Vector functions
+        'inprod', 'interp.lin', 'inverse', 'logdet', 'mean', 'eigen.vals',
+        'ode', 'prod', 'p.valueM', 'rank', 'ranked', 'replicate.postM',
+        'sd', 'sort', 'sum',
+        # Special
+        'D', 'I', 'F', 'T', 'C')
+    """ OpenBUGS built-in functions
+
+    From http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAII
+
+    This also includes
+
+    - T, C, I : Truncation and censoring.
+      ``T`` and ``C`` are in OpenBUGS. ``I`` in WinBUGS.
+    - D : ODE
+    - F : Functional http://www.openbugs.info/Examples/Functionals.html
+
+    """
+
+    _DISTRIBUTIONS = ('dbern', 'dbin', 'dcat', 'dnegbin', 'dpois',
+                      'dhyper', 'dbeta', 'dchisqr', 'ddexp', 'dexp',
+                      'dflat', 'dgamma', 'dgev', 'df', 'dggamma', 'dgpar',
+                      'dloglik', 'dlnorm', 'dlogis', 'dnorm', 'dpar',
+                      'dt', 'dunif', 'dweib', 'dmulti', 'ddirch', 'dmnorm',
+                      'dmt', 'dwish')
+    """ OpenBUGS built-in distributions
+
+    Functions from
+    http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAI
+    """
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'comments': [
+            # Comments
+            (r'#.*$', Comment.Single),
+        ],
+        'root': [
+            # Comments
+            include('comments'),
+            include('whitespace'),
+            # Block start
+            (r'(model)(\s+)(\{)',
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            # Reserved Words
+            (r'(for|in)(?![\w.])', Keyword.Reserved),
+            # Built-in Functions
+            (r'(%s)(?=\s*\()'
+             % r'|'.join(_FUNCTIONS + _DISTRIBUTIONS),
+             Name.Builtin),
+            # Regular variable names
+            (r'[A-Za-z][\w.]*', Name),
+            # Number Literals
+            (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
+            # Punctuation
+            (r'\[|\]|\(|\)|:|,|;', Punctuation),
+            # Assignment operators
+            # SLexer makes these tokens Operators.
+            (r'<-|~', Operator),
+            # Infix and prefix operators
+            (r'\+|-|\*|/', Operator),
+            # Block
+            (r'[{}]', Punctuation),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r"^\s*model\s*{", text, re.M):
+            return 0.7
+        else:
+            return 0.0
+
+
+class JagsLexer(RegexLexer):
+    """
+    Pygments Lexer for JAGS.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'JAGS'
+    aliases = ['jags']
+    filenames = ['*.jag', '*.bug']
+
+    # JAGS
+    _FUNCTIONS = (
+        'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
+        'cos', 'cosh', 'cloglog',
+        'equals', 'exp', 'icloglog', 'ifelse', 'ilogit', 'log', 'logfact',
+        'loggam', 'logit', 'phi', 'pow', 'probit', 'round', 'sin', 'sinh',
+        'sqrt', 'step', 'tan', 'tanh', 'trunc', 'inprod', 'interp.lin',
+        'logdet', 'max', 'mean', 'min', 'prod', 'sum', 'sd', 'inverse',
+        'rank', 'sort', 't', 'acos', 'acosh', 'asin', 'asinh', 'atan',
+        # Truncation/Censoring (should I include)
+        'T', 'I')
+    # Distributions with density, probability and quartile functions
+    _DISTRIBUTIONS = tuple('[dpq]%s' % x for x in
+                           ('bern', 'beta', 'dchiqsqr', 'ddexp', 'dexp',
+                            'df', 'gamma', 'gen.gamma', 'logis', 'lnorm',
+                            'negbin', 'nchisqr', 'norm', 'par', 'pois', 'weib'))
+    # Other distributions without density and probability
+    _OTHER_DISTRIBUTIONS = (
+        'dt', 'dunif', 'dbetabin', 'dbern', 'dbin', 'dcat', 'dhyper',
+        'ddirch', 'dmnorm', 'dwish', 'dmt', 'dmulti', 'dbinom', 'dchisq',
+        'dnbinom', 'dweibull', 'ddirich')
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'names': [
+            # Regular variable names
+            (r'[a-zA-Z][\w.]*\b', Name),
+        ],
+        'comments': [
+            # do not use stateful comments
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            # Comments
+            (r'#.*$', Comment.Single),
+        ],
+        'root': [
+            # Comments
+            include('comments'),
+            include('whitespace'),
+            # Block start
+            (r'(model|data)(\s+)(\{)',
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            (r'var(?![\w.])', Keyword.Declaration),
+            # Reserved Words
+            (r'(for|in)(?![\w.])', Keyword.Reserved),
+            # Builtins
+            # Need to use lookahead because . is a valid char
+            (r'(%s)(?=\s*\()' % r'|'.join(_FUNCTIONS
+                                          + _DISTRIBUTIONS
+                                          + _OTHER_DISTRIBUTIONS),
+             Name.Builtin),
+            # Names
+            include('names'),
+            # Number Literals
+            (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
+            (r'\[|\]|\(|\)|:|,|;', Punctuation),
+            # Assignment operators
+            (r'<-|~', Operator),
+            # # JAGS includes many more than OpenBUGS
+            (r'\+|-|\*|\/|\|\|[&]{2}|[<>=]=?|\^|%.*?%', Operator),
+            (r'[{}]', Punctuation),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*model\s*\{', text, re.M):
+            if re.search(r'^\s*data\s*\{', text, re.M):
+                return 0.9
+            elif re.search(r'^\s*var', text, re.M):
+                return 0.9
+            else:
+                return 0.3
+        else:
+            return 0
+
+
+class StanLexer(RegexLexer):
+    """Pygments Lexer for Stan models.
+
+    The Stan modeling language is specified in the *Stan Modeling Language
+    User's Guide and Reference Manual, v2.8.0*,
+    `pdf <https://github.com/stan-dev/stan/releases/download/v2.8.8/stan-reference-2.8.0.pdf>`__.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Stan'
+    aliases = ['stan']
+    filenames = ['*.stan']
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'comments': [
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            # Comments
+            (r'(//|#).*$', Comment.Single),
+        ],
+        'root': [
+            # Stan is more restrictive on strings than this regex
+            (r'"[^"]*"', String),
+            # Comments
+            include('comments'),
+            # block start
+            include('whitespace'),
+            # Block start
+            (r'(%s)(\s*)(\{)' %
+             r'|'.join(('functions', 'data', r'transformed\s+?data',
+                        'parameters', r'transformed\s+parameters',
+                        'model', r'generated\s+quantities')),
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            # Reserved Words
+            (r'(%s)\b' % r'|'.join(_stan_builtins.KEYWORDS), Keyword),
+            # Truncation
+            (r'T(?=\s*\[)', Keyword),
+            # Data types
+            (r'(%s)\b' % r'|'.join(_stan_builtins.TYPES), Keyword.Type),
+            # Punctuation
+            (r"[;:,\[\]()]", Punctuation),
+            # Builtin
+            (r'(%s)(?=\s*\()'
+             % r'|'.join(_stan_builtins.FUNCTIONS
+                         + _stan_builtins.DISTRIBUTIONS),
+             Name.Builtin),
+            # Special names ending in __, like lp__
+            (r'[A-Za-z]\w*__\b', Name.Builtin.Pseudo),
+            (r'(%s)\b' % r'|'.join(_stan_builtins.RESERVED), Keyword.Reserved),
+            # user-defined functions
+            (r'[A-Za-z]\w*(?=\s*\()]', Name.Function),
+            # Regular variable names
+            (r'[A-Za-z]\w*\b', Name),
+            # Real Literals
+            (r'-?[0-9]+(\.[0-9]+)?[eE]-?[0-9]+', Number.Float),
+            (r'-?[0-9]*\.[0-9]*', Number.Float),
+            # Integer Literals
+            (r'-?[0-9]+', Number.Integer),
+            # Assignment operators
+            # SLexer makes these tokens Operators.
+            (r'<-|~', Operator),
+            # Infix, prefix and postfix operators (and = )
+            (r"\+|-|\.?\*|\.?/|\\|'|\^|==?|!=?|<=?|>=?|\|\||&&", Operator),
+            # Block delimiters
+            (r'[{}]', Punctuation),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*parameters\s*\{', text, re.M):
+            return 1.0
+        else:
+            return 0.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/markup.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/markup.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/markup.py	(revision 1126)
@@ -0,0 +1,595 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.markup
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for non-HTML markup languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexers.html import HtmlLexer, XmlLexer
+from pygments.lexers.javascript import JavascriptLexer
+from pygments.lexers.css import CssLexer
+
+from pygments.lexer import RegexLexer, DelegatingLexer, include, bygroups, \
+    using, this, do_insertions, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Other
+from pygments.util import get_bool_opt, ClassNotFound
+
+__all__ = ['BBCodeLexer', 'MoinWikiLexer', 'RstLexer', 'TexLexer', 'GroffLexer',
+           'MozPreprocHashLexer', 'MozPreprocPercentLexer',
+           'MozPreprocXulLexer', 'MozPreprocJavascriptLexer',
+           'MozPreprocCssLexer', 'MarkdownLexer']
+
+
+class BBCodeLexer(RegexLexer):
+    """
+    A lexer that highlights BBCode(-like) syntax.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'BBCode'
+    aliases = ['bbcode']
+    mimetypes = ['text/x-bbcode']
+
+    tokens = {
+        'root': [
+            (r'[^[]+', Text),
+            # tag/end tag begin
+            (r'\[/?\w+', Keyword, 'tag'),
+            # stray bracket
+            (r'\[', Text),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            # attribute with value
+            (r'(\w+)(=)("?[^\s"\]]+"?)',
+             bygroups(Name.Attribute, Operator, String)),
+            # tag argument (a la [color=green])
+            (r'(=)("?[^\s"\]]+"?)',
+             bygroups(Operator, String)),
+            # tag end
+            (r'\]', Keyword, '#pop'),
+        ],
+    }
+
+
+class MoinWikiLexer(RegexLexer):
+    """
+    For MoinMoin (and Trac) Wiki markup.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'MoinMoin/Trac Wiki markup'
+    aliases = ['trac-wiki', 'moin']
+    filenames = []
+    mimetypes = ['text/x-trac-wiki']
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'^#.*$', Comment),
+            (r'(!)(\S+)', bygroups(Keyword, Text)),  # Ignore-next
+            # Titles
+            (r'^(=+)([^=]+)(=+)(\s*#.+)?$',
+             bygroups(Generic.Heading, using(this), Generic.Heading, String)),
+            # Literal code blocks, with optional shebang
+            (r'(\{\{\{)(\n#!.+)?', bygroups(Name.Builtin, Name.Namespace), 'codeblock'),
+            (r'(\'\'\'?|\|\||`|__|~~|\^|,,|::)', Comment),  # Formatting
+            # Lists
+            (r'^( +)([.*-])( )', bygroups(Text, Name.Builtin, Text)),
+            (r'^( +)([a-z]{1,5}\.)( )', bygroups(Text, Name.Builtin, Text)),
+            # Other Formatting
+            (r'\[\[\w+.*?\]\]', Keyword),  # Macro
+            (r'(\[[^\s\]]+)(\s+[^\]]+?)?(\])',
+             bygroups(Keyword, String, Keyword)),  # Link
+            (r'^----+$', Keyword),  # Horizontal rules
+            (r'[^\n\'\[{!_~^,|]+', Text),
+            (r'\n', Text),
+            (r'.', Text),
+        ],
+        'codeblock': [
+            (r'\}\}\}', Name.Builtin, '#pop'),
+            # these blocks are allowed to be nested in Trac, but not MoinMoin
+            (r'\{\{\{', Text, '#push'),
+            (r'[^{}]+', Comment.Preproc),  # slurp boring text
+            (r'.', Comment.Preproc),  # allow loose { or }
+        ],
+    }
+
+
+class RstLexer(RegexLexer):
+    """
+    For `reStructuredText <http://docutils.sf.net/rst.html>`_ markup.
+
+    .. versionadded:: 0.7
+
+    Additional options accepted:
+
+    `handlecodeblocks`
+        Highlight the contents of ``.. sourcecode:: language``,
+        ``.. code:: language`` and ``.. code-block:: language``
+        directives with a lexer for the given language (default:
+        ``True``).
+
+        .. versionadded:: 0.8
+    """
+    name = 'reStructuredText'
+    aliases = ['rst', 'rest', 'restructuredtext']
+    filenames = ['*.rst', '*.rest']
+    mimetypes = ["text/x-rst", "text/prs.fallenstein.rst"]
+    flags = re.MULTILINE
+
+    def _handle_sourcecode(self, match):
+        from pygments.lexers import get_lexer_by_name
+
+        # section header
+        yield match.start(1), Punctuation, match.group(1)
+        yield match.start(2), Text, match.group(2)
+        yield match.start(3), Operator.Word, match.group(3)
+        yield match.start(4), Punctuation, match.group(4)
+        yield match.start(5), Text, match.group(5)
+        yield match.start(6), Keyword, match.group(6)
+        yield match.start(7), Text, match.group(7)
+
+        # lookup lexer if wanted and existing
+        lexer = None
+        if self.handlecodeblocks:
+            try:
+                lexer = get_lexer_by_name(match.group(6).strip())
+            except ClassNotFound:
+                pass
+        indention = match.group(8)
+        indention_size = len(indention)
+        code = (indention + match.group(9) + match.group(10) + match.group(11))
+
+        # no lexer for this language. handle it like it was a code block
+        if lexer is None:
+            yield match.start(8), String, code
+            return
+
+        # highlight the lines with the lexer.
+        ins = []
+        codelines = code.splitlines(True)
+        code = ''
+        for line in codelines:
+            if len(line) > indention_size:
+                ins.append((len(code), [(0, Text, line[:indention_size])]))
+                code += line[indention_size:]
+            else:
+                code += line
+        for item in do_insertions(ins, lexer.get_tokens_unprocessed(code)):
+            yield item
+
+    # from docutils.parsers.rst.states
+    closers = u'\'")]}>\u2019\u201d\xbb!?'
+    unicode_delimiters = u'\u2010\u2011\u2012\u2013\u2014\u00a0'
+    end_string_suffix = (r'((?=$)|(?=[-/:.,; \n\x00%s%s]))'
+                         % (re.escape(unicode_delimiters),
+                            re.escape(closers)))
+
+    tokens = {
+        'root': [
+            # Heading with overline
+            (r'^(=+|-+|`+|:+|\.+|\'+|"+|~+|\^+|_+|\*+|\++|#+)([ \t]*\n)'
+             r'(.+)(\n)(\1)(\n)',
+             bygroups(Generic.Heading, Text, Generic.Heading,
+                      Text, Generic.Heading, Text)),
+            # Plain heading
+            (r'^(\S.*)(\n)(={3,}|-{3,}|`{3,}|:{3,}|\.{3,}|\'{3,}|"{3,}|'
+             r'~{3,}|\^{3,}|_{3,}|\*{3,}|\+{3,}|#{3,})(\n)',
+             bygroups(Generic.Heading, Text, Generic.Heading, Text)),
+            # Bulleted lists
+            (r'^(\s*)([-*+])( .+\n(?:\1  .+\n)*)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            # Numbered lists
+            (r'^(\s*)([0-9#ivxlcmIVXLCM]+\.)( .+\n(?:\1  .+\n)*)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            (r'^(\s*)(\(?[0-9#ivxlcmIVXLCM]+\))( .+\n(?:\1  .+\n)*)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            # Numbered, but keep words at BOL from becoming lists
+            (r'^(\s*)([A-Z]+\.)( .+\n(?:\1  .+\n)+)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            (r'^(\s*)(\(?[A-Za-z]+\))( .+\n(?:\1  .+\n)+)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            # Line blocks
+            (r'^(\s*)(\|)( .+\n(?:\|  .+\n)*)',
+             bygroups(Text, Operator, using(this, state='inline'))),
+            # Sourcecode directives
+            (r'^( *\.\.)(\s*)((?:source)?code(?:-block)?)(::)([ \t]*)([^\n]+)'
+             r'(\n[ \t]*\n)([ \t]+)(.*)(\n)((?:(?:\8.*|)\n)+)',
+             _handle_sourcecode),
+            # A directive
+            (r'^( *\.\.)(\s*)([\w:-]+?)(::)(?:([ \t]*)(.*))',
+             bygroups(Punctuation, Text, Operator.Word, Punctuation, Text,
+                      using(this, state='inline'))),
+            # A reference target
+            (r'^( *\.\.)(\s*)(_(?:[^:\\]|\\.)+:)(.*?)$',
+             bygroups(Punctuation, Text, Name.Tag, using(this, state='inline'))),
+            # A footnote/citation target
+            (r'^( *\.\.)(\s*)(\[.+\])(.*?)$',
+             bygroups(Punctuation, Text, Name.Tag, using(this, state='inline'))),
+            # A substitution def
+            (r'^( *\.\.)(\s*)(\|.+\|)(\s*)([\w:-]+?)(::)(?:([ \t]*)(.*))',
+             bygroups(Punctuation, Text, Name.Tag, Text, Operator.Word,
+                      Punctuation, Text, using(this, state='inline'))),
+            # Comments
+            (r'^ *\.\..*(\n( +.*\n|\n)+)?', Comment.Preproc),
+            # Field list
+            (r'^( *)(:[a-zA-Z-]+:)(\s*)$', bygroups(Text, Name.Class, Text)),
+            (r'^( *)(:.*?:)([ \t]+)(.*?)$',
+             bygroups(Text, Name.Class, Text, Name.Function)),
+            # Definition list
+            (r'^(\S.*(?<!::)\n)((?:(?: +.*)\n)+)',
+             bygroups(using(this, state='inline'), using(this, state='inline'))),
+            # Code blocks
+            (r'(::)(\n[ \t]*\n)([ \t]+)(.*)(\n)((?:(?:\3.*|)\n)+)',
+             bygroups(String.Escape, Text, String, String, Text, String)),
+            include('inline'),
+        ],
+        'inline': [
+            (r'\\.', Text),  # escape
+            (r'``', String, 'literal'),  # code
+            (r'(`.+?)(<.+?>)(`__?)',  # reference with inline target
+             bygroups(String, String.Interpol, String)),
+            (r'`.+?`__?', String),  # reference
+            (r'(`.+?`)(:[a-zA-Z0-9:-]+?:)?',
+             bygroups(Name.Variable, Name.Attribute)),  # role
+            (r'(:[a-zA-Z0-9:-]+?:)(`.+?`)',
+             bygroups(Name.Attribute, Name.Variable)),  # role (content first)
+            (r'\*\*.+?\*\*', Generic.Strong),  # Strong emphasis
+            (r'\*.+?\*', Generic.Emph),  # Emphasis
+            (r'\[.*?\]_', String),  # Footnote or citation
+            (r'<.+?>', Name.Tag),   # Hyperlink
+            (r'[^\\\n\[*`:]+', Text),
+            (r'.', Text),
+        ],
+        'literal': [
+            (r'[^`]+', String),
+            (r'``' + end_string_suffix, String, '#pop'),
+            (r'`', String),
+        ]
+    }
+
+    def __init__(self, **options):
+        self.handlecodeblocks = get_bool_opt(options, 'handlecodeblocks', True)
+        RegexLexer.__init__(self, **options)
+
+    def analyse_text(text):
+        if text[:2] == '..' and text[2:3] != '.':
+            return 0.3
+        p1 = text.find("\n")
+        p2 = text.find("\n", p1 + 1)
+        if (p2 > -1 and              # has two lines
+                p1 * 2 + 1 == p2 and     # they are the same length
+                text[p1+1] in '-=' and   # the next line both starts and ends with
+                text[p1+1] == text[p2-1]):  # ...a sufficiently high header
+            return 0.5
+
+
+class TexLexer(RegexLexer):
+    """
+    Lexer for the TeX and LaTeX typesetting languages.
+    """
+
+    name = 'TeX'
+    aliases = ['tex', 'latex']
+    filenames = ['*.tex', '*.aux', '*.toc']
+    mimetypes = ['text/x-tex', 'text/x-latex']
+
+    tokens = {
+        'general': [
+            (r'%.*?\n', Comment),
+            (r'[{}]', Name.Builtin),
+            (r'[&_^]', Name.Builtin),
+        ],
+        'root': [
+            (r'\\\[', String.Backtick, 'displaymath'),
+            (r'\\\(', String, 'inlinemath'),
+            (r'\$\$', String.Backtick, 'displaymath'),
+            (r'\$', String, 'inlinemath'),
+            (r'\\([a-zA-Z]+|.)', Keyword, 'command'),
+            (r'\\$', Keyword),
+            include('general'),
+            (r'[^\\$%&_^{}]+', Text),
+        ],
+        'math': [
+            (r'\\([a-zA-Z]+|.)', Name.Variable),
+            include('general'),
+            (r'[0-9]+', Number),
+            (r'[-=!+*/()\[\]]', Operator),
+            (r'[^=!+*/()\[\]\\$%&_^{}0-9-]+', Name.Builtin),
+        ],
+        'inlinemath': [
+            (r'\\\)', String, '#pop'),
+            (r'\$', String, '#pop'),
+            include('math'),
+        ],
+        'displaymath': [
+            (r'\\\]', String, '#pop'),
+            (r'\$\$', String, '#pop'),
+            (r'\$', Name.Builtin),
+            include('math'),
+        ],
+        'command': [
+            (r'\[.*?\]', Name.Attribute),
+            (r'\*', Keyword),
+            default('#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        for start in ("\\documentclass", "\\input", "\\documentstyle",
+                      "\\relax"):
+            if text[:len(start)] == start:
+                return True
+
+
+class GroffLexer(RegexLexer):
+    """
+    Lexer for the (g)roff typesetting language, supporting groff
+    extensions. Mainly useful for highlighting manpage sources.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'Groff'
+    aliases = ['groff', 'nroff', 'man']
+    filenames = ['*.[1234567]', '*.man']
+    mimetypes = ['application/x-troff', 'text/troff']
+
+    tokens = {
+        'root': [
+            (r'(\.)(\w+)', bygroups(Text, Keyword), 'request'),
+            (r'\.', Punctuation, 'request'),
+            # Regular characters, slurp till we find a backslash or newline
+            (r'[^\\\n]+', Text, 'textline'),
+            default('textline'),
+        ],
+        'textline': [
+            include('escapes'),
+            (r'[^\\\n]+', Text),
+            (r'\n', Text, '#pop'),
+        ],
+        'escapes': [
+            # groff has many ways to write escapes.
+            (r'\\"[^\n]*', Comment),
+            (r'\\[fn]\w', String.Escape),
+            (r'\\\(.{2}', String.Escape),
+            (r'\\.\[.*\]', String.Escape),
+            (r'\\.', String.Escape),
+            (r'\\\n', Text, 'request'),
+        ],
+        'request': [
+            (r'\n', Text, '#pop'),
+            include('escapes'),
+            (r'"[^\n"]+"', String.Double),
+            (r'\d+', Number),
+            (r'\S+', String),
+            (r'\s+', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        if text[:1] != '.':
+            return False
+        if text[:3] == '.\\"':
+            return True
+        if text[:4] == '.TH ':
+            return True
+        if text[1:3].isalnum() and text[3].isspace():
+            return 0.9
+
+
+class MozPreprocHashLexer(RegexLexer):
+    """
+    Lexer for Mozilla Preprocessor files (with '#' as the marker).
+
+    Other data is left untouched.
+
+    .. versionadded:: 2.0
+    """
+    name = 'mozhashpreproc'
+    aliases = [name]
+    filenames = []
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            (r'^#', Comment.Preproc, ('expr', 'exprstart')),
+            (r'.+', Other),
+        ],
+        'exprstart': [
+            (r'(literal)(.*)', bygroups(Comment.Preproc, Text), '#pop:2'),
+            (words((
+                'define', 'undef', 'if', 'ifdef', 'ifndef', 'else', 'elif',
+                'elifdef', 'elifndef', 'endif', 'expand', 'filter', 'unfilter',
+                'include', 'includesubst', 'error')),
+             Comment.Preproc, '#pop'),
+        ],
+        'expr': [
+            (words(('!', '!=', '==', '&&', '||')), Operator),
+            (r'(defined)(\()', bygroups(Keyword, Punctuation)),
+            (r'\)', Punctuation),
+            (r'[0-9]+', Number.Decimal),
+            (r'__\w+?__', Name.Variable),
+            (r'@\w+?@', Name.Class),
+            (r'\w+', Name),
+            (r'\n', Text, '#pop'),
+            (r'\s+', Text),
+            (r'\S', Punctuation),
+        ],
+    }
+
+
+class MozPreprocPercentLexer(MozPreprocHashLexer):
+    """
+    Lexer for Mozilla Preprocessor files (with '%' as the marker).
+
+    Other data is left untouched.
+
+    .. versionadded:: 2.0
+    """
+    name = 'mozpercentpreproc'
+    aliases = [name]
+    filenames = []
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            (r'^%', Comment.Preproc, ('expr', 'exprstart')),
+            (r'.+', Other),
+        ],
+    }
+
+
+class MozPreprocXulLexer(DelegatingLexer):
+    """
+    Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the
+    `XmlLexer`.
+
+    .. versionadded:: 2.0
+    """
+    name = "XUL+mozpreproc"
+    aliases = ['xul+mozpreproc']
+    filenames = ['*.xul.in']
+    mimetypes = []
+
+    def __init__(self, **options):
+        super(MozPreprocXulLexer, self).__init__(
+            XmlLexer, MozPreprocHashLexer, **options)
+
+
+class MozPreprocJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the
+    `JavascriptLexer`.
+
+    .. versionadded:: 2.0
+    """
+    name = "Javascript+mozpreproc"
+    aliases = ['javascript+mozpreproc']
+    filenames = ['*.js.in']
+    mimetypes = []
+
+    def __init__(self, **options):
+        super(MozPreprocJavascriptLexer, self).__init__(
+            JavascriptLexer, MozPreprocHashLexer, **options)
+
+
+class MozPreprocCssLexer(DelegatingLexer):
+    """
+    Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the
+    `CssLexer`.
+
+    .. versionadded:: 2.0
+    """
+    name = "CSS+mozpreproc"
+    aliases = ['css+mozpreproc']
+    filenames = ['*.css.in']
+    mimetypes = []
+
+    def __init__(self, **options):
+        super(MozPreprocCssLexer, self).__init__(
+            CssLexer, MozPreprocPercentLexer, **options)
+
+
+class MarkdownLexer(RegexLexer):
+    """
+    For `Markdown <https://help.github.com/categories/writing-on-github/>`_ markup.
+
+    .. versionadded:: 2.2
+    """
+    name = 'markdown'
+    aliases = ['md']
+    filenames = ['*.md']
+    mimetypes = ["text/x-markdown"]
+    flags = re.MULTILINE
+
+    def _handle_codeblock(self, match):
+        """
+        match args: 1:backticks, 2:lang_name, 3:newline, 4:code, 5:backticks
+        """
+        from pygments.lexers import get_lexer_by_name
+
+        # section header
+        yield match.start(1), String        , match.group(1)
+        yield match.start(2), String        , match.group(2)
+        yield match.start(3), Text          , match.group(3)
+
+        # lookup lexer if wanted and existing
+        lexer = None
+        if self.handlecodeblocks:
+            try:
+                lexer = get_lexer_by_name( match.group(2).strip() )
+            except ClassNotFound:
+                pass
+        code = match.group(4)
+
+        # no lexer for this language. handle it like it was a code block
+        if lexer is None:
+            yield match.start(4), String, code
+            return
+
+        for item in do_insertions([], lexer.get_tokens_unprocessed(code)):
+            yield item
+
+        yield match.start(5), String        , match.group(5)
+
+    tokens = {
+        'root': [
+            # heading with pound prefix
+            (r'^(#)([^#].+\n)', bygroups(Generic.Heading, Text)),
+            (r'^(#{2,6})(.+\n)', bygroups(Generic.Subheading, Text)),
+            # task list
+            (r'^(\s*)([*-] )(\[[ xX]\])( .+\n)',
+            bygroups(Text, Keyword, Keyword, using(this, state='inline'))),
+            # bulleted lists
+            (r'^(\s*)([*-])(\s)(.+\n)',
+            bygroups(Text, Keyword, Text, using(this, state='inline'))),
+            # numbered lists
+            (r'^(\s*)([0-9]+\.)( .+\n)',
+            bygroups(Text, Keyword, using(this, state='inline'))),
+            # quote
+            (r'^(\s*>\s)(.+\n)', bygroups(Keyword, Generic.Emph)),
+            # text block
+            (r'^(```\n)([\w\W]*?)(^```$)', bygroups(String, Text, String)),
+            # code block with language
+            (r'^(```)(\w+)(\n)([\w\W]*?)(^```$)', _handle_codeblock),
+
+            include('inline'),
+        ],
+        'inline': [
+            # escape
+            (r'\\.', Text),
+            # italics
+            (r'(\s)([*_][^*_]+[*_])(\W|\n)', bygroups(Text, Generic.Emph, Text)),
+            # bold
+            # warning: the following rule eats internal tags. eg. **foo _bar_ baz** bar is not italics
+            (r'(\s)((\*\*|__).*\3)((?=\W|\n))', bygroups(Text, Generic.Strong, None, Text)),
+            # "proper way" (r'(\s)([*_]{2}[^*_]+[*_]{2})((?=\W|\n))', bygroups(Text, Generic.Strong, Text)),
+            # strikethrough
+            (r'(\s)(~~[^~]+~~)((?=\W|\n))', bygroups(Text, Generic.Deleted, Text)),
+            # inline code
+            (r'`[^`]+`', String.Backtick),
+            # mentions and topics (twitter and github stuff)
+            (r'[@#][\w/:]+', Name.Entity),
+            # (image?) links eg: ![Image of Yaktocat](https://octodex.github.com/images/yaktocat.png)
+            (r'(!?\[)([^]]+)(\])(\()([^)]+)(\))', bygroups(Text, Name.Tag, Text, Text, Name.Attribute, Text)),
+
+            # general text, must come last!
+            (r'[^\\\s]+', Text),
+            (r'.', Text),
+        ],
+    }
+
+    def __init__(self, **options):
+        self.handlecodeblocks = get_bool_opt(options, 'handlecodeblocks', True)
+        RegexLexer.__init__(self, **options)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/functional.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/functional.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/functional.py	(revision 1126)
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.functional
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexers.lisp import SchemeLexer, CommonLispLexer, RacketLexer, \
+    NewLispLexer, ShenLexer
+from pygments.lexers.haskell import HaskellLexer, LiterateHaskellLexer, \
+    KokaLexer
+from pygments.lexers.theorem import CoqLexer
+from pygments.lexers.erlang import ErlangLexer, ErlangShellLexer, \
+    ElixirConsoleLexer, ElixirLexer
+from pygments.lexers.ml import SMLLexer, OcamlLexer, OpaLexer
+
+__all__ = []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/hdl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/hdl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/hdl.py	(revision 1126)
@@ -0,0 +1,382 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.hdl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for hardware descriptor languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, include, using, this, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['VerilogLexer', 'SystemVerilogLexer', 'VhdlLexer']
+
+
+class VerilogLexer(RegexLexer):
+    """
+    For verilog source code with preprocessor directives.
+
+    .. versionadded:: 1.4
+    """
+    name = 'verilog'
+    aliases = ['verilog', 'v']
+    filenames = ['*.v']
+    mimetypes = ['text/x-verilog']
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+
+    tokens = {
+        'root': [
+            (r'^\s*`define', Comment.Preproc, 'macro'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'[{}#@]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'([0-9]+)|(\'h)[0-9a-fA-F]+', Number.Hex),
+            (r'([0-9]+)|(\'b)[01]+', Number.Bin),
+            (r'([0-9]+)|(\'d)[0-9]+', Number.Integer),
+            (r'([0-9]+)|(\'o)[0-7]+', Number.Oct),
+            (r'\'[01xz]', Number),
+            (r'\d+[Ll]?', Number.Integer),
+            (r'\*/', Error),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;\']', Punctuation),
+            (r'`[a-zA-Z_]\w*', Name.Constant),
+
+            (r'^(\s*)(package)(\s+)', bygroups(Text, Keyword.Namespace, Text)),
+            (r'^(\s*)(import)(\s+)', bygroups(Text, Keyword.Namespace, Text),
+             'import'),
+
+            (words((
+                'always', 'always_comb', 'always_ff', 'always_latch', 'and',
+                'assign', 'automatic', 'begin', 'break', 'buf', 'bufif0', 'bufif1',
+                'case', 'casex', 'casez', 'cmos', 'const', 'continue', 'deassign',
+                'default', 'defparam', 'disable', 'do', 'edge', 'else', 'end', 'endcase',
+                'endfunction', 'endgenerate', 'endmodule', 'endpackage', 'endprimitive',
+                'endspecify', 'endtable', 'endtask', 'enum', 'event', 'final', 'for',
+                'force', 'forever', 'fork', 'function', 'generate', 'genvar', 'highz0',
+                'highz1', 'if', 'initial', 'inout', 'input', 'integer', 'join', 'large',
+                'localparam', 'macromodule', 'medium', 'module', 'nand', 'negedge',
+                'nmos', 'nor', 'not', 'notif0', 'notif1', 'or', 'output', 'packed',
+                'parameter', 'pmos', 'posedge', 'primitive', 'pull0', 'pull1',
+                'pulldown', 'pullup', 'rcmos', 'ref', 'release', 'repeat', 'return',
+                'rnmos', 'rpmos', 'rtran', 'rtranif0', 'rtranif1', 'scalared', 'signed',
+                'small', 'specify', 'specparam', 'strength', 'string', 'strong0',
+                'strong1', 'struct', 'table', 'task', 'tran', 'tranif0', 'tranif1',
+                'type', 'typedef', 'unsigned', 'var', 'vectored', 'void', 'wait',
+                'weak0', 'weak1', 'while', 'xnor', 'xor'), suffix=r'\b'),
+             Keyword),
+
+            (words((
+                'accelerate', 'autoexpand_vectornets', 'celldefine', 'default_nettype',
+                'else', 'elsif', 'endcelldefine', 'endif', 'endprotect', 'endprotected',
+                'expand_vectornets', 'ifdef', 'ifndef', 'include', 'noaccelerate',
+                'noexpand_vectornets', 'noremove_gatenames', 'noremove_netnames',
+                'nounconnected_drive', 'protect', 'protected', 'remove_gatenames',
+                'remove_netnames', 'resetall', 'timescale', 'unconnected_drive',
+                'undef'), prefix=r'`', suffix=r'\b'),
+             Comment.Preproc),
+
+            (words((
+                'bits', 'bitstoreal', 'bitstoshortreal', 'countdrivers', 'display', 'fclose',
+                'fdisplay', 'finish', 'floor', 'fmonitor', 'fopen', 'fstrobe', 'fwrite',
+                'getpattern', 'history', 'incsave', 'input', 'itor', 'key', 'list', 'log',
+                'monitor', 'monitoroff', 'monitoron', 'nokey', 'nolog', 'printtimescale',
+                'random', 'readmemb', 'readmemh', 'realtime', 'realtobits', 'reset',
+                'reset_count', 'reset_value', 'restart', 'rtoi', 'save', 'scale', 'scope',
+                'shortrealtobits', 'showscopes', 'showvariables', 'showvars', 'sreadmemb',
+                'sreadmemh', 'stime', 'stop', 'strobe', 'time', 'timeformat', 'write'),
+                prefix=r'\$', suffix=r'\b'),
+             Name.Builtin),
+
+            (words((
+                'byte', 'shortint', 'int', 'longint', 'integer', 'time',
+                'bit', 'logic', 'reg', 'supply0', 'supply1', 'tri', 'triand',
+                'trior', 'tri0', 'tri1', 'trireg', 'uwire', 'wire', 'wand', 'wo'
+                'shortreal', 'real', 'realtime'), suffix=r'\b'),
+             Keyword.Type),
+            (r'[a-zA-Z_]\w*:(?!:)', Name.Label),
+            (r'\$?[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'import': [
+            (r'[\w:]+\*?', Name.Namespace, '#pop')
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            # Convention: mark all upper case names as constants
+            if token is Name:
+                if value.isupper():
+                    token = Name.Constant
+            yield index, token, value
+
+
+class SystemVerilogLexer(RegexLexer):
+    """
+    Extends verilog lexer to recognise all SystemVerilog keywords from IEEE
+    1800-2009 standard.
+
+    .. versionadded:: 1.5
+    """
+    name = 'systemverilog'
+    aliases = ['systemverilog', 'sv']
+    filenames = ['*.sv', '*.svh']
+    mimetypes = ['text/x-systemverilog']
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+
+    tokens = {
+        'root': [
+            (r'^\s*`define', Comment.Preproc, 'macro'),
+            (r'^(\s*)(package)(\s+)', bygroups(Text, Keyword.Namespace, Text)),
+            (r'^(\s*)(import)(\s+)', bygroups(Text, Keyword.Namespace, Text), 'import'),
+
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'[{}#@]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'([0-9]+)|(\'h)[0-9a-fA-F]+', Number.Hex),
+            (r'([0-9]+)|(\'b)[01]+', Number.Bin),
+            (r'([0-9]+)|(\'d)[0-9]+', Number.Integer),
+            (r'([0-9]+)|(\'o)[0-7]+', Number.Oct),
+            (r'\'[01xz]', Number),
+            (r'\d+[Ll]?', Number.Integer),
+            (r'\*/', Error),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;\']', Punctuation),
+            (r'`[a-zA-Z_]\w*', Name.Constant),
+
+            (words((
+                'accept_on', 'alias', 'always', 'always_comb', 'always_ff', 'always_latch',
+                'and', 'assert', 'assign', 'assume', 'automatic', 'before', 'begin', 'bind', 'bins',
+                'binsof', 'bit', 'break', 'buf', 'bufif0', 'bufif1', 'byte', 'case', 'casex', 'casez',
+                'cell', 'chandle', 'checker', 'class', 'clocking', 'cmos', 'config', 'const', 'constraint',
+                'context', 'continue', 'cover', 'covergroup', 'coverpoint', 'cross', 'deassign',
+                'default', 'defparam', 'design', 'disable', 'dist', 'do', 'edge', 'else', 'end', 'endcase',
+                'endchecker', 'endclass', 'endclocking', 'endconfig', 'endfunction', 'endgenerate',
+                'endgroup', 'endinterface', 'endmodule', 'endpackage', 'endprimitive',
+                'endprogram', 'endproperty', 'endsequence', 'endspecify', 'endtable',
+                'endtask', 'enum', 'event', 'eventually', 'expect', 'export', 'extends', 'extern',
+                'final', 'first_match', 'for', 'force', 'foreach', 'forever', 'fork', 'forkjoin',
+                'function', 'generate', 'genvar', 'global', 'highz0', 'highz1', 'if', 'iff', 'ifnone',
+                'ignore_bins', 'illegal_bins', 'implies', 'import', 'incdir', 'include',
+                'initial', 'inout', 'input', 'inside', 'instance', 'int', 'integer', 'interface',
+                'intersect', 'join', 'join_any', 'join_none', 'large', 'let', 'liblist', 'library',
+                'local', 'localparam', 'logic', 'longint', 'macromodule', 'matches', 'medium',
+                'modport', 'module', 'nand', 'negedge', 'new', 'nexttime', 'nmos', 'nor', 'noshowcancelled',
+                'not', 'notif0', 'notif1', 'null', 'or', 'output', 'package', 'packed', 'parameter',
+                'pmos', 'posedge', 'primitive', 'priority', 'program', 'property', 'protected',
+                'pull0', 'pull1', 'pulldown', 'pullup', 'pulsestyle_ondetect', 'pulsestyle_onevent',
+                'pure', 'rand', 'randc', 'randcase', 'randsequence', 'rcmos', 'real', 'realtime',
+                'ref', 'reg', 'reject_on', 'release', 'repeat', 'restrict', 'return', 'rnmos',
+                'rpmos', 'rtran', 'rtranif0', 'rtranif1', 's_always', 's_eventually', 's_nexttime',
+                's_until', 's_until_with', 'scalared', 'sequence', 'shortint', 'shortreal',
+                'showcancelled', 'signed', 'small', 'solve', 'specify', 'specparam', 'static',
+                'string', 'strong', 'strong0', 'strong1', 'struct', 'super', 'supply0', 'supply1',
+                'sync_accept_on', 'sync_reject_on', 'table', 'tagged', 'task', 'this', 'throughout',
+                'time', 'timeprecision', 'timeunit', 'tran', 'tranif0', 'tranif1', 'tri', 'tri0',
+                'tri1', 'triand', 'trior', 'trireg', 'type', 'typedef', 'union', 'unique', 'unique0',
+                'unsigned', 'until', 'until_with', 'untyped', 'use', 'uwire', 'var', 'vectored',
+                'virtual', 'void', 'wait', 'wait_order', 'wand', 'weak', 'weak0', 'weak1', 'while',
+                'wildcard', 'wire', 'with', 'within', 'wor', 'xnor', 'xor'), suffix=r'\b'),
+             Keyword),
+
+            (words((
+                '`__FILE__', '`__LINE__', '`begin_keywords', '`celldefine', '`default_nettype',
+                '`define', '`else', '`elsif', '`end_keywords', '`endcelldefine', '`endif',
+                '`ifdef', '`ifndef', '`include', '`line', '`nounconnected_drive', '`pragma',
+                '`resetall', '`timescale', '`unconnected_drive', '`undef', '`undefineall'),
+                suffix=r'\b'),
+             Comment.Preproc),
+
+            (words((
+                '$display', '$displayb', '$displayh', '$displayo', '$dumpall', '$dumpfile',
+                '$dumpflush', '$dumplimit', '$dumpoff', '$dumpon', '$dumpports',
+                '$dumpportsall', '$dumpportsflush', '$dumpportslimit', '$dumpportsoff',
+                '$dumpportson', '$dumpvars', '$fclose', '$fdisplay', '$fdisplayb',
+                '$fdisplayh', '$fdisplayo', '$feof', '$ferror', '$fflush', '$fgetc',
+                '$fgets', '$finish', '$fmonitor', '$fmonitorb', '$fmonitorh', '$fmonitoro',
+                '$fopen', '$fread', '$fscanf', '$fseek', '$fstrobe', '$fstrobeb', '$fstrobeh',
+                '$fstrobeo', '$ftell', '$fwrite', '$fwriteb', '$fwriteh', '$fwriteo',
+                '$monitor', '$monitorb', '$monitorh', '$monitoro', '$monitoroff',
+                '$monitoron', '$plusargs', '$random', '$readmemb', '$readmemh', '$rewind',
+                '$sformat', '$sformatf', '$sscanf', '$strobe', '$strobeb', '$strobeh', '$strobeo',
+                '$swrite', '$swriteb', '$swriteh', '$swriteo', '$test', '$ungetc',
+                '$value$plusargs', '$write', '$writeb', '$writeh', '$writememb',
+                '$writememh', '$writeo'), suffix=r'\b'),
+             Name.Builtin),
+
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (words((
+                'byte', 'shortint', 'int', 'longint', 'integer', 'time',
+                'bit', 'logic', 'reg', 'supply0', 'supply1', 'tri', 'triand',
+                'trior', 'tri0', 'tri1', 'trireg', 'uwire', 'wire', 'wand', 'wo'
+                'shortreal', 'real', 'realtime'), suffix=r'\b'),
+             Keyword.Type),
+            (r'[a-zA-Z_]\w*:(?!:)', Name.Label),
+            (r'\$?[a-zA-Z_]\w*', Name),
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'import': [
+            (r'[\w:]+\*?', Name.Namespace, '#pop')
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            # Convention: mark all upper case names as constants
+            if token is Name:
+                if value.isupper():
+                    token = Name.Constant
+            yield index, token, value
+
+
+class VhdlLexer(RegexLexer):
+    """
+    For VHDL source code.
+
+    .. versionadded:: 1.5
+    """
+    name = 'vhdl'
+    aliases = ['vhdl']
+    filenames = ['*.vhdl', '*.vhd']
+    mimetypes = ['text/x-vhdl']
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'--.*?$', Comment.Single),
+            (r"'(U|X|0|1|Z|W|L|H|-)'", String.Char),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r"'[a-z_]\w*", Name.Attribute),
+            (r'[()\[\],.;\']', Punctuation),
+            (r'"[^\n\\"]*"', String),
+
+            (r'(library)(\s+)([a-z_]\w*)',
+             bygroups(Keyword, Text, Name.Namespace)),
+            (r'(use)(\s+)(entity)', bygroups(Keyword, Text, Keyword)),
+            (r'(use)(\s+)([a-z_][\w.]*\.)(all)',
+             bygroups(Keyword, Text, Name.Namespace, Keyword)),
+            (r'(use)(\s+)([a-z_][\w.]*)',
+             bygroups(Keyword, Text, Name.Namespace)),
+            (r'(std|ieee)(\.[a-z_]\w*)',
+             bygroups(Name.Namespace, Name.Namespace)),
+            (words(('std', 'ieee', 'work'), suffix=r'\b'),
+             Name.Namespace),
+            (r'(entity|component)(\s+)([a-z_]\w*)',
+             bygroups(Keyword, Text, Name.Class)),
+            (r'(architecture|configuration)(\s+)([a-z_]\w*)(\s+)'
+             r'(of)(\s+)([a-z_]\w*)(\s+)(is)',
+             bygroups(Keyword, Text, Name.Class, Text, Keyword, Text,
+                      Name.Class, Text, Keyword)),
+            (r'([a-z_]\w*)(:)(\s+)(process|for)',
+             bygroups(Name.Class, Operator, Text, Keyword)),
+            (r'(end)(\s+)', bygroups(using(this), Text), 'endblock'),
+
+            include('types'),
+            include('keywords'),
+            include('numbers'),
+
+            (r'[a-z_]\w*', Name),
+        ],
+        'endblock': [
+            include('keywords'),
+            (r'[a-z_]\w*', Name.Class),
+            (r'(\s+)', Text),
+            (r';', Punctuation, '#pop'),
+        ],
+        'types': [
+            (words((
+                'boolean', 'bit', 'character', 'severity_level', 'integer', 'time',
+                'delay_length', 'natural', 'positive', 'string', 'bit_vector',
+                'file_open_kind', 'file_open_status', 'std_ulogic', 'std_ulogic_vector',
+                'std_logic', 'std_logic_vector', 'signed', 'unsigned'), suffix=r'\b'),
+             Keyword.Type),
+        ],
+        'keywords': [
+            (words((
+                'abs', 'access', 'after', 'alias', 'all', 'and',
+                'architecture', 'array', 'assert', 'attribute', 'begin', 'block',
+                'body', 'buffer', 'bus', 'case', 'component', 'configuration',
+                'constant', 'disconnect', 'downto', 'else', 'elsif', 'end',
+                'entity', 'exit', 'file', 'for', 'function', 'generate',
+                'generic', 'group', 'guarded', 'if', 'impure', 'in',
+                'inertial', 'inout', 'is', 'label', 'library', 'linkage',
+                'literal', 'loop', 'map', 'mod', 'nand', 'new',
+                'next', 'nor', 'not', 'null', 'of', 'on',
+                'open', 'or', 'others', 'out', 'package', 'port',
+                'postponed', 'procedure', 'process', 'pure', 'range', 'record',
+                'register', 'reject', 'rem', 'return', 'rol', 'ror', 'select',
+                'severity', 'signal', 'shared', 'sla', 'sll', 'sra',
+                'srl', 'subtype', 'then', 'to', 'transport', 'type',
+                'units', 'until', 'use', 'variable', 'wait', 'when',
+                'while', 'with', 'xnor', 'xor'), suffix=r'\b'),
+             Keyword),
+        ],
+        'numbers': [
+            (r'\d{1,2}#[0-9a-f_]+#?', Number.Integer),
+            (r'\d+', Number.Integer),
+            (r'(\d+\.\d*|\.\d+|\d+)E[+-]?\d+', Number.Float),
+            (r'X"[0-9a-f_]+"', Number.Hex),
+            (r'O"[0-7_]+"', Number.Oct),
+            (r'B"[01_]+"', Number.Bin),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ml.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ml.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ml.py	(revision 1126)
@@ -0,0 +1,769 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ml
+    ~~~~~~~~~~~~~~~~~~
+
+    Lexers for ML family languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['SMLLexer', 'OcamlLexer', 'OpaLexer']
+
+
+class SMLLexer(RegexLexer):
+    """
+    For the Standard ML language.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Standard ML'
+    aliases = ['sml']
+    filenames = ['*.sml', '*.sig', '*.fun']
+    mimetypes = ['text/x-standardml', 'application/x-standardml']
+
+    alphanumid_reserved = set((
+        # Core
+        'abstype', 'and', 'andalso', 'as', 'case', 'datatype', 'do', 'else',
+        'end', 'exception', 'fn', 'fun', 'handle', 'if', 'in', 'infix',
+        'infixr', 'let', 'local', 'nonfix', 'of', 'op', 'open', 'orelse',
+        'raise', 'rec', 'then', 'type', 'val', 'with', 'withtype', 'while',
+        # Modules
+        'eqtype', 'functor', 'include', 'sharing', 'sig', 'signature',
+        'struct', 'structure', 'where',
+    ))
+
+    symbolicid_reserved = set((
+        # Core
+        ':', '\|', '=', '=>', '->', '#',
+        # Modules
+        ':>',
+    ))
+
+    nonid_reserved = set(('(', ')', '[', ']', '{', '}', ',', ';', '...', '_'))
+
+    alphanumid_re = r"[a-zA-Z][\w']*"
+    symbolicid_re = r"[!%&$#+\-/:<=>?@\\~`^|*]+"
+
+    # A character constant is a sequence of the form #s, where s is a string
+    # constant denoting a string of size one character. This setup just parses
+    # the entire string as either a String.Double or a String.Char (depending
+    # on the argument), even if the String.Char is an erronous
+    # multiple-character string.
+    def stringy(whatkind):
+        return [
+            (r'[^"\\]', whatkind),
+            (r'\\[\\"abtnvfr]', String.Escape),
+            # Control-character notation is used for codes < 32,
+            # where \^@ == \000
+            (r'\\\^[\x40-\x5e]', String.Escape),
+            # Docs say 'decimal digits'
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\\s+\\', String.Interpol),
+            (r'"', whatkind, '#pop'),
+        ]
+
+    # Callbacks for distinguishing tokens and reserved words
+    def long_id_callback(self, match):
+        if match.group(1) in self.alphanumid_reserved:
+            token = Error
+        else:
+            token = Name.Namespace
+        yield match.start(1), token, match.group(1)
+        yield match.start(2), Punctuation, match.group(2)
+
+    def end_id_callback(self, match):
+        if match.group(1) in self.alphanumid_reserved:
+            token = Error
+        elif match.group(1) in self.symbolicid_reserved:
+            token = Error
+        else:
+            token = Name
+        yield match.start(1), token, match.group(1)
+
+    def id_callback(self, match):
+        str = match.group(1)
+        if str in self.alphanumid_reserved:
+            token = Keyword.Reserved
+        elif str in self.symbolicid_reserved:
+            token = Punctuation
+        else:
+            token = Name
+        yield match.start(1), token, str
+
+    tokens = {
+        # Whitespace and comments are (almost) everywhere
+        'whitespace': [
+            (r'\s+', Text),
+            (r'\(\*', Comment.Multiline, 'comment'),
+        ],
+
+        'delimiters': [
+            # This lexer treats these delimiters specially:
+            # Delimiters define scopes, and the scope is how the meaning of
+            # the `|' is resolved - is it a case/handle expression, or function
+            # definition by cases? (This is not how the Definition works, but
+            # it's how MLton behaves, see http://mlton.org/SMLNJDeviations)
+            (r'\(|\[|\{', Punctuation, 'main'),
+            (r'\)|\]|\}', Punctuation, '#pop'),
+            (r'\b(let|if|local)\b(?!\')', Keyword.Reserved, ('main', 'main')),
+            (r'\b(struct|sig|while)\b(?!\')', Keyword.Reserved, 'main'),
+            (r'\b(do|else|end|in|then)\b(?!\')', Keyword.Reserved, '#pop'),
+        ],
+
+        'core': [
+            # Punctuation that doesn't overlap symbolic identifiers
+            (r'(%s)' % '|'.join(re.escape(z) for z in nonid_reserved),
+             Punctuation),
+
+            # Special constants: strings, floats, numbers in decimal and hex
+            (r'#"', String.Char, 'char'),
+            (r'"', String.Double, 'string'),
+            (r'~?0x[0-9a-fA-F]+', Number.Hex),
+            (r'0wx[0-9a-fA-F]+', Number.Hex),
+            (r'0w\d+', Number.Integer),
+            (r'~?\d+\.\d+[eE]~?\d+', Number.Float),
+            (r'~?\d+\.\d+', Number.Float),
+            (r'~?\d+[eE]~?\d+', Number.Float),
+            (r'~?\d+', Number.Integer),
+
+            # Labels
+            (r'#\s*[1-9][0-9]*', Name.Label),
+            (r'#\s*(%s)' % alphanumid_re, Name.Label),
+            (r'#\s+(%s)' % symbolicid_re, Name.Label),
+            # Some reserved words trigger a special, local lexer state change
+            (r'\b(datatype|abstype)\b(?!\')', Keyword.Reserved, 'dname'),
+            (r'(?=\b(exception)\b(?!\'))', Text, ('ename')),
+            (r'\b(functor|include|open|signature|structure)\b(?!\')',
+             Keyword.Reserved, 'sname'),
+            (r'\b(type|eqtype)\b(?!\')', Keyword.Reserved, 'tname'),
+
+            # Regular identifiers, long and otherwise
+            (r'\'[\w\']*', Name.Decorator),
+            (r'(%s)(\.)' % alphanumid_re, long_id_callback, "dotted"),
+            (r'(%s)' % alphanumid_re, id_callback),
+            (r'(%s)' % symbolicid_re, id_callback),
+        ],
+        'dotted': [
+            (r'(%s)(\.)' % alphanumid_re, long_id_callback),
+            (r'(%s)' % alphanumid_re, end_id_callback, "#pop"),
+            (r'(%s)' % symbolicid_re, end_id_callback, "#pop"),
+            (r'\s+', Error),
+            (r'\S+', Error),
+        ],
+
+
+        # Main parser (prevents errors in files that have scoping errors)
+        'root': [
+            default('main')
+        ],
+
+        # In this scope, I expect '|' to not be followed by a function name,
+        # and I expect 'and' to be followed by a binding site
+        'main': [
+            include('whitespace'),
+
+            # Special behavior of val/and/fun
+            (r'\b(val|and)\b(?!\')', Keyword.Reserved, 'vname'),
+            (r'\b(fun)\b(?!\')', Keyword.Reserved,
+             ('#pop', 'main-fun', 'fname')),
+
+            include('delimiters'),
+            include('core'),
+            (r'\S+', Error),
+        ],
+
+        # In this scope, I expect '|' and 'and' to be followed by a function
+        'main-fun': [
+            include('whitespace'),
+
+            (r'\s', Text),
+            (r'\(\*', Comment.Multiline, 'comment'),
+
+            # Special behavior of val/and/fun
+            (r'\b(fun|and)\b(?!\')', Keyword.Reserved, 'fname'),
+            (r'\b(val)\b(?!\')', Keyword.Reserved,
+             ('#pop', 'main', 'vname')),
+
+            # Special behavior of '|' and '|'-manipulating keywords
+            (r'\|', Punctuation, 'fname'),
+            (r'\b(case|handle)\b(?!\')', Keyword.Reserved,
+             ('#pop', 'main')),
+
+            include('delimiters'),
+            include('core'),
+            (r'\S+', Error),
+        ],
+
+        # Character and string parsers
+        'char': stringy(String.Char),
+        'string': stringy(String.Double),
+
+        'breakout': [
+            (r'(?=\b(%s)\b(?!\'))' % '|'.join(alphanumid_reserved), Text, '#pop'),
+        ],
+
+        # Dealing with what comes after module system keywords
+        'sname': [
+            include('whitespace'),
+            include('breakout'),
+
+            (r'(%s)' % alphanumid_re, Name.Namespace),
+            default('#pop'),
+        ],
+
+        # Dealing with what comes after the 'fun' (or 'and' or '|') keyword
+        'fname': [
+            include('whitespace'),
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+
+            (r'(%s)' % alphanumid_re, Name.Function, '#pop'),
+            (r'(%s)' % symbolicid_re, Name.Function, '#pop'),
+
+            # Ignore interesting function declarations like "fun (x + y) = ..."
+            default('#pop'),
+        ],
+
+        # Dealing with what comes after the 'val' (or 'and') keyword
+        'vname': [
+            include('whitespace'),
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+
+            (r'(%s)(\s*)(=(?!%s))' % (alphanumid_re, symbolicid_re),
+             bygroups(Name.Variable, Text, Punctuation), '#pop'),
+            (r'(%s)(\s*)(=(?!%s))' % (symbolicid_re, symbolicid_re),
+             bygroups(Name.Variable, Text, Punctuation), '#pop'),
+            (r'(%s)' % alphanumid_re, Name.Variable, '#pop'),
+            (r'(%s)' % symbolicid_re, Name.Variable, '#pop'),
+
+            # Ignore interesting patterns like 'val (x, y)'
+            default('#pop'),
+        ],
+
+        # Dealing with what comes after the 'type' (or 'and') keyword
+        'tname': [
+            include('whitespace'),
+            include('breakout'),
+
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+            (r'=(?!%s)' % symbolicid_re, Punctuation, ('#pop', 'typbind')),
+
+            (r'(%s)' % alphanumid_re, Keyword.Type),
+            (r'(%s)' % symbolicid_re, Keyword.Type),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # A type binding includes most identifiers
+        'typbind': [
+            include('whitespace'),
+
+            (r'\b(and)\b(?!\')', Keyword.Reserved, ('#pop', 'tname')),
+
+            include('breakout'),
+            include('core'),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # Dealing with what comes after the 'datatype' (or 'and') keyword
+        'dname': [
+            include('whitespace'),
+            include('breakout'),
+
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+            (r'(=)(\s*)(datatype)',
+             bygroups(Punctuation, Text, Keyword.Reserved), '#pop'),
+            (r'=(?!%s)' % symbolicid_re, Punctuation,
+             ('#pop', 'datbind', 'datcon')),
+
+            (r'(%s)' % alphanumid_re, Keyword.Type),
+            (r'(%s)' % symbolicid_re, Keyword.Type),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # common case - A | B | C of int
+        'datbind': [
+            include('whitespace'),
+
+            (r'\b(and)\b(?!\')', Keyword.Reserved, ('#pop', 'dname')),
+            (r'\b(withtype)\b(?!\')', Keyword.Reserved, ('#pop', 'tname')),
+            (r'\b(of)\b(?!\')', Keyword.Reserved),
+
+            (r'(\|)(\s*)(%s)' % alphanumid_re,
+             bygroups(Punctuation, Text, Name.Class)),
+            (r'(\|)(\s+)(%s)' % symbolicid_re,
+             bygroups(Punctuation, Text, Name.Class)),
+
+            include('breakout'),
+            include('core'),
+            (r'\S+', Error),
+        ],
+
+        # Dealing with what comes after an exception
+        'ename': [
+            include('whitespace'),
+
+            (r'(exception|and)\b(\s+)(%s)' % alphanumid_re,
+             bygroups(Keyword.Reserved, Text, Name.Class)),
+            (r'(exception|and)\b(\s*)(%s)' % symbolicid_re,
+             bygroups(Keyword.Reserved, Text, Name.Class)),
+            (r'\b(of)\b(?!\')', Keyword.Reserved),
+
+            include('breakout'),
+            include('core'),
+            (r'\S+', Error),
+        ],
+
+        'datcon': [
+            include('whitespace'),
+            (r'(%s)' % alphanumid_re, Name.Class, '#pop'),
+            (r'(%s)' % symbolicid_re, Name.Class, '#pop'),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # Series of type variables
+        'tyvarseq': [
+            (r'\s', Text),
+            (r'\(\*', Comment.Multiline, 'comment'),
+
+            (r'\'[\w\']*', Name.Decorator),
+            (alphanumid_re, Name),
+            (r',', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            (symbolicid_re, Name),
+        ],
+
+        'comment': [
+            (r'[^(*)]', Comment.Multiline),
+            (r'\(\*', Comment.Multiline, '#push'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            (r'[(*)]', Comment.Multiline),
+        ],
+    }
+
+
+class OcamlLexer(RegexLexer):
+    """
+    For the OCaml language.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'OCaml'
+    aliases = ['ocaml']
+    filenames = ['*.ml', '*.mli', '*.mll', '*.mly']
+    mimetypes = ['text/x-ocaml']
+
+    keywords = (
+        'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done',
+        'downto', 'else', 'end', 'exception', 'external', 'false',
+        'for', 'fun', 'function', 'functor', 'if', 'in', 'include',
+        'inherit', 'initializer', 'lazy', 'let', 'match', 'method',
+        'module', 'mutable', 'new', 'object', 'of', 'open', 'private',
+        'raise', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
+        'type', 'value', 'val', 'virtual', 'when', 'while', 'with',
+    )
+    keyopts = (
+        '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-',
+        r'-\.', '->', r'\.', r'\.\.', ':', '::', ':=', ':>', ';', ';;', '<',
+        '<-', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
+        r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|]', r'\}', '~'
+    )
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    word_operators = ('and', 'asr', 'land', 'lor', 'lsl', 'lxor', 'mod', 'or')
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Class),
+            (r'\(\*(?![)])', Comment, 'comment'),
+            (r'\b(%s)\b' % '|'.join(keywords), Keyword),
+            (r'(%s)' % '|'.join(keyopts[::-1]), Operator),
+            (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator),
+            (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word),
+            (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'\d[\d_]*', Number.Integer),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'comment': [
+            (r'[^(*)]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class OpaLexer(RegexLexer):
+    """
+    Lexer for the Opa language (http://opalang.org).
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Opa'
+    aliases = ['opa']
+    filenames = ['*.opa']
+    mimetypes = ['text/x-opa']
+
+    # most of these aren't strictly keywords
+    # but if you color only real keywords, you might just
+    # as well not color anything
+    keywords = (
+        'and', 'as', 'begin', 'case', 'client', 'css', 'database', 'db', 'do',
+        'else', 'end', 'external', 'forall', 'function', 'if', 'import',
+        'match', 'module', 'or', 'package', 'parser', 'rec', 'server', 'then',
+        'type', 'val', 'with', 'xml_parser',
+    )
+
+    # matches both stuff and `stuff`
+    ident_re = r'(([a-zA-Z_]\w*)|(`[^`]*`))'
+
+    op_re = r'[.=\-<>,@~%/+?*&^!]'
+    punc_re = r'[()\[\],;|]'  # '{' and '}' are treated elsewhere
+                              # because they are also used for inserts
+
+    tokens = {
+        # copied from the caml lexer, should be adapted
+        'escape-sequence': [
+            (r'\\[\\"\'ntr}]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+
+        # factorizing these rules, because they are inserted many times
+        'comments': [
+            (r'/\*', Comment, 'nested-comment'),
+            (r'//.*?$', Comment),
+        ],
+        'comments-and-spaces': [
+            include('comments'),
+            (r'\s+', Text),
+        ],
+
+        'root': [
+            include('comments-and-spaces'),
+            # keywords
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+            # directives
+            # we could parse the actual set of directives instead of anything
+            # starting with @, but this is troublesome
+            # because it needs to be adjusted all the time
+            # and assuming we parse only sources that compile, it is useless
+            (r'@' + ident_re + r'\b', Name.Builtin.Pseudo),
+
+            # number literals
+            (r'-?.[\d]+([eE][+\-]?\d+)', Number.Float),
+            (r'-?\d+.\d*([eE][+\-]?\d+)', Number.Float),
+            (r'-?\d+[eE][+\-]?\d+', Number.Float),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'0[oO][0-7]+', Number.Oct),
+            (r'0[bB][01]+', Number.Bin),
+            (r'\d+', Number.Integer),
+            # color literals
+            (r'#[\da-fA-F]{3,6}', Number.Integer),
+
+            # string literals
+            (r'"', String.Double, 'string'),
+            # char literal, should be checked because this is the regexp from
+            # the caml lexer
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2})|.)'",
+             String.Char),
+
+            # this is meant to deal with embedded exprs in strings
+            # every time we find a '}' we pop a state so that if we were
+            # inside a string, we are back in the string state
+            # as a consequence, we must also push a state every time we find a
+            # '{' or else we will have errors when parsing {} for instance
+            (r'\{', Operator, '#push'),
+            (r'\}', Operator, '#pop'),
+
+            # html literals
+            # this is a much more strict that the actual parser,
+            # since a<b would not be parsed as html
+            # but then again, the parser is way too lax, and we can't hope
+            # to have something as tolerant
+            (r'<(?=[a-zA-Z>])', String.Single, 'html-open-tag'),
+
+            # db path
+            # matching the '[_]' in '/a[_]' because it is a part
+            # of the syntax of the db path definition
+            # unfortunately, i don't know how to match the ']' in
+            # /a[1], so this is somewhat inconsistent
+            (r'[@?!]?(/\w+)+(\[_\])?', Name.Variable),
+            # putting the same color on <- as on db path, since
+            # it can be used only to mean Db.write
+            (r'<-(?!'+op_re+r')', Name.Variable),
+
+            # 'modules'
+            # although modules are not distinguished by their names as in caml
+            # the standard library seems to follow the convention that modules
+            # only area capitalized
+            (r'\b([A-Z]\w*)(?=\.)', Name.Namespace),
+
+            # operators
+            # = has a special role because this is the only
+            # way to syntactic distinguish binding constructions
+            # unfortunately, this colors the equal in {x=2} too
+            (r'=(?!'+op_re+r')', Keyword),
+            (r'(%s)+' % op_re, Operator),
+            (r'(%s)+' % punc_re, Operator),
+
+            # coercions
+            (r':', Operator, 'type'),
+            # type variables
+            # we need this rule because we don't parse specially type
+            # definitions so in "type t('a) = ...", "'a" is parsed by 'root'
+            ("'"+ident_re, Keyword.Type),
+
+            # id literal, #something, or #{expr}
+            (r'#'+ident_re, String.Single),
+            (r'#(?=\{)', String.Single),
+
+            # identifiers
+            # this avoids to color '2' in 'a2' as an integer
+            (ident_re, Text),
+
+            # default, not sure if that is needed or not
+            # (r'.', Text),
+        ],
+
+        # it is quite painful to have to parse types to know where they end
+        # this is the general rule for a type
+        # a type is either:
+        # * -> ty
+        # * type-with-slash
+        # * type-with-slash -> ty
+        # * type-with-slash (, type-with-slash)+ -> ty
+        #
+        # the code is pretty funky in here, but this code would roughly
+        # translate in caml to:
+        # let rec type stream =
+        # match stream with
+        # | [< "->";  stream >] -> type stream
+        # | [< "";  stream >] ->
+        #   type_with_slash stream
+        #   type_lhs_1 stream;
+        # and type_1 stream = ...
+        'type': [
+            include('comments-and-spaces'),
+            (r'->', Keyword.Type),
+            default(('#pop', 'type-lhs-1', 'type-with-slash')),
+        ],
+
+        # parses all the atomic or closed constructions in the syntax of type
+        # expressions: record types, tuple types, type constructors, basic type
+        # and type variables
+        'type-1': [
+            include('comments-and-spaces'),
+            (r'\(', Keyword.Type, ('#pop', 'type-tuple')),
+            (r'~?\{', Keyword.Type, ('#pop', 'type-record')),
+            (ident_re+r'\(', Keyword.Type, ('#pop', 'type-tuple')),
+            (ident_re, Keyword.Type, '#pop'),
+            ("'"+ident_re, Keyword.Type),
+            # this case is not in the syntax but sometimes
+            # we think we are parsing types when in fact we are parsing
+            # some css, so we just pop the states until we get back into
+            # the root state
+            default('#pop'),
+        ],
+
+        # type-with-slash is either:
+        # * type-1
+        # * type-1 (/ type-1)+
+        'type-with-slash': [
+            include('comments-and-spaces'),
+            default(('#pop', 'slash-type-1', 'type-1')),
+        ],
+        'slash-type-1': [
+            include('comments-and-spaces'),
+            ('/', Keyword.Type, ('#pop', 'type-1')),
+            # same remark as above
+            default('#pop'),
+        ],
+
+        # we go in this state after having parsed a type-with-slash
+        # while trying to parse a type
+        # and at this point we must determine if we are parsing an arrow
+        # type (in which case we must continue parsing) or not (in which
+        # case we stop)
+        'type-lhs-1': [
+            include('comments-and-spaces'),
+            (r'->', Keyword.Type, ('#pop', 'type')),
+            (r'(?=,)', Keyword.Type, ('#pop', 'type-arrow')),
+            default('#pop'),
+        ],
+        'type-arrow': [
+            include('comments-and-spaces'),
+            # the look ahead here allows to parse f(x : int, y : float -> truc)
+            # correctly
+            (r',(?=[^:]*?->)', Keyword.Type, 'type-with-slash'),
+            (r'->', Keyword.Type, ('#pop', 'type')),
+            # same remark as above
+            default('#pop'),
+        ],
+
+        # no need to do precise parsing for tuples and records
+        # because they are closed constructions, so we can simply
+        # find the closing delimiter
+        # note that this function would be not work if the source
+        # contained identifiers like `{)` (although it could be patched
+        # to support it)
+        'type-tuple': [
+            include('comments-and-spaces'),
+            (r'[^()/*]+', Keyword.Type),
+            (r'[/*]', Keyword.Type),
+            (r'\(', Keyword.Type, '#push'),
+            (r'\)', Keyword.Type, '#pop'),
+        ],
+        'type-record': [
+            include('comments-and-spaces'),
+            (r'[^{}/*]+', Keyword.Type),
+            (r'[/*]', Keyword.Type),
+            (r'\{', Keyword.Type, '#push'),
+            (r'\}', Keyword.Type, '#pop'),
+        ],
+
+        # 'type-tuple': [
+        #     include('comments-and-spaces'),
+        #     (r'\)', Keyword.Type, '#pop'),
+        #     default(('#pop', 'type-tuple-1', 'type-1')),
+        # ],
+        # 'type-tuple-1': [
+        #     include('comments-and-spaces'),
+        #     (r',?\s*\)', Keyword.Type, '#pop'), # ,) is a valid end of tuple, in (1,)
+        #     (r',', Keyword.Type, 'type-1'),
+        # ],
+        # 'type-record':[
+        #     include('comments-and-spaces'),
+        #     (r'\}', Keyword.Type, '#pop'),
+        #     (r'~?(?:\w+|`[^`]*`)', Keyword.Type, 'type-record-field-expr'),
+        # ],
+        # 'type-record-field-expr': [
+        #
+        # ],
+
+        'nested-comment': [
+            (r'[^/*]+', Comment),
+            (r'/\*', Comment, '#push'),
+            (r'\*/', Comment, '#pop'),
+            (r'[/*]', Comment),
+        ],
+
+        # the copy pasting between string and single-string
+        # is kinda sad. Is there a way to avoid that??
+        'string': [
+            (r'[^\\"{]+', String.Double),
+            (r'"', String.Double, '#pop'),
+            (r'\{', Operator, 'root'),
+            include('escape-sequence'),
+        ],
+        'single-string': [
+            (r'[^\\\'{]+', String.Double),
+            (r'\'', String.Double, '#pop'),
+            (r'\{', Operator, 'root'),
+            include('escape-sequence'),
+        ],
+
+        # all the html stuff
+        # can't really reuse some existing html parser
+        # because we must be able to parse embedded expressions
+
+        # we are in this state after someone parsed the '<' that
+        # started the html literal
+        'html-open-tag': [
+            (r'[\w\-:]+', String.Single, ('#pop', 'html-attr')),
+            (r'>', String.Single, ('#pop', 'html-content')),
+        ],
+
+        # we are in this state after someone parsed the '</' that
+        # started the end of the closing tag
+        'html-end-tag': [
+            # this is a star, because </> is allowed
+            (r'[\w\-:]*>', String.Single, '#pop'),
+        ],
+
+        # we are in this state after having parsed '<ident(:ident)?'
+        # we thus parse a possibly empty list of attributes
+        'html-attr': [
+            (r'\s+', Text),
+            (r'[\w\-:]+=', String.Single, 'html-attr-value'),
+            (r'/>', String.Single, '#pop'),
+            (r'>', String.Single, ('#pop', 'html-content')),
+        ],
+
+        'html-attr-value': [
+            (r"'", String.Single, ('#pop', 'single-string')),
+            (r'"', String.Single, ('#pop', 'string')),
+            (r'#'+ident_re, String.Single, '#pop'),
+            (r'#(?=\{)', String.Single, ('#pop', 'root')),
+            (r'[^"\'{`=<>]+', String.Single, '#pop'),
+            (r'\{', Operator, ('#pop', 'root')),  # this is a tail call!
+        ],
+
+        # we should probably deal with '\' escapes here
+        'html-content': [
+            (r'<!--', Comment, 'html-comment'),
+            (r'</', String.Single, ('#pop', 'html-end-tag')),
+            (r'<', String.Single, 'html-open-tag'),
+            (r'\{', Operator, 'root'),
+            (r'[^<{]+', String.Single),
+        ],
+
+        'html-comment': [
+            (r'-->', Comment, '#pop'),
+            (r'[^\-]+|-', Comment),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/data.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/data.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/data.py	(revision 1126)
@@ -0,0 +1,555 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.data
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for data file format.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, LexerContext, \
+    include, bygroups, inherit
+from pygments.token import Text, Comment, Keyword, Name, String, Number, \
+    Punctuation, Literal, Error
+
+__all__ = ['YamlLexer', 'JsonLexer', 'JsonBareObjectLexer', 'JsonLdLexer']
+
+
+class YamlLexerContext(LexerContext):
+    """Indentation context for the YAML lexer."""
+
+    def __init__(self, *args, **kwds):
+        super(YamlLexerContext, self).__init__(*args, **kwds)
+        self.indent_stack = []
+        self.indent = -1
+        self.next_indent = 0
+        self.block_scalar_indent = None
+
+
+class YamlLexer(ExtendedRegexLexer):
+    """
+    Lexer for `YAML <http://yaml.org/>`_, a human-friendly data serialization
+    language.
+
+    .. versionadded:: 0.11
+    """
+
+    name = 'YAML'
+    aliases = ['yaml']
+    filenames = ['*.yaml', '*.yml']
+    mimetypes = ['text/x-yaml']
+
+    def something(token_class):
+        """Do not produce empty tokens."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if not text:
+                return
+            yield match.start(), token_class, text
+            context.pos = match.end()
+        return callback
+
+    def reset_indent(token_class):
+        """Reset the indentation levels."""
+        def callback(lexer, match, context):
+            text = match.group()
+            context.indent_stack = []
+            context.indent = -1
+            context.next_indent = 0
+            context.block_scalar_indent = None
+            yield match.start(), token_class, text
+            context.pos = match.end()
+        return callback
+
+    def save_indent(token_class, start=False):
+        """Save a possible indentation level."""
+        def callback(lexer, match, context):
+            text = match.group()
+            extra = ''
+            if start:
+                context.next_indent = len(text)
+                if context.next_indent < context.indent:
+                    while context.next_indent < context.indent:
+                        context.indent = context.indent_stack.pop()
+                    if context.next_indent > context.indent:
+                        extra = text[context.indent:]
+                        text = text[:context.indent]
+            else:
+                context.next_indent += len(text)
+            if text:
+                yield match.start(), token_class, text
+            if extra:
+                yield match.start()+len(text), token_class.Error, extra
+            context.pos = match.end()
+        return callback
+
+    def set_indent(token_class, implicit=False):
+        """Set the previously saved indentation level."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if context.indent < context.next_indent:
+                context.indent_stack.append(context.indent)
+                context.indent = context.next_indent
+            if not implicit:
+                context.next_indent += len(text)
+            yield match.start(), token_class, text
+            context.pos = match.end()
+        return callback
+
+    def set_block_scalar_indent(token_class):
+        """Set an explicit indentation level for a block scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            context.block_scalar_indent = None
+            if not text:
+                return
+            increment = match.group(1)
+            if increment:
+                current_indent = max(context.indent, 0)
+                increment = int(increment)
+                context.block_scalar_indent = current_indent + increment
+            if text:
+                yield match.start(), token_class, text
+                context.pos = match.end()
+        return callback
+
+    def parse_block_scalar_empty_line(indent_token_class, content_token_class):
+        """Process an empty line in a block scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if (context.block_scalar_indent is None or
+                    len(text) <= context.block_scalar_indent):
+                if text:
+                    yield match.start(), indent_token_class, text
+            else:
+                indentation = text[:context.block_scalar_indent]
+                content = text[context.block_scalar_indent:]
+                yield match.start(), indent_token_class, indentation
+                yield (match.start()+context.block_scalar_indent,
+                       content_token_class, content)
+            context.pos = match.end()
+        return callback
+
+    def parse_block_scalar_indent(token_class):
+        """Process indentation spaces in a block scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if context.block_scalar_indent is None:
+                if len(text) <= max(context.indent, 0):
+                    context.stack.pop()
+                    context.stack.pop()
+                    return
+                context.block_scalar_indent = len(text)
+            else:
+                if len(text) < context.block_scalar_indent:
+                    context.stack.pop()
+                    context.stack.pop()
+                    return
+            if text:
+                yield match.start(), token_class, text
+                context.pos = match.end()
+        return callback
+
+    def parse_plain_scalar_indent(token_class):
+        """Process indentation spaces in a plain scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if len(text) <= context.indent:
+                context.stack.pop()
+                context.stack.pop()
+                return
+            if text:
+                yield match.start(), token_class, text
+                context.pos = match.end()
+        return callback
+
+    tokens = {
+        # the root rules
+        'root': [
+            # ignored whitespaces
+            (r'[ ]+(?=#|$)', Text),
+            # line breaks
+            (r'\n+', Text),
+            # a comment
+            (r'#[^\n]*', Comment.Single),
+            # the '%YAML' directive
+            (r'^%YAML(?=[ ]|$)', reset_indent(Name.Tag), 'yaml-directive'),
+            # the %TAG directive
+            (r'^%TAG(?=[ ]|$)', reset_indent(Name.Tag), 'tag-directive'),
+            # document start and document end indicators
+            (r'^(?:---|\.\.\.)(?=[ ]|$)', reset_indent(Name.Namespace),
+             'block-line'),
+            # indentation spaces
+            (r'[ ]*(?!\s|$)', save_indent(Text, start=True),
+             ('block-line', 'indentation')),
+        ],
+
+        # trailing whitespaces after directives or a block scalar indicator
+        'ignored-line': [
+            # ignored whitespaces
+            (r'[ ]+(?=#|$)', Text),
+            # a comment
+            (r'#[^\n]*', Comment.Single),
+            # line break
+            (r'\n', Text, '#pop:2'),
+        ],
+
+        # the %YAML directive
+        'yaml-directive': [
+            # the version number
+            (r'([ ]+)([0-9]+\.[0-9]+)',
+             bygroups(Text, Number), 'ignored-line'),
+        ],
+
+        # the %YAG directive
+        'tag-directive': [
+            # a tag handle and the corresponding prefix
+            (r'([ ]+)(!|![\w-]*!)'
+             r'([ ]+)(!|!?[\w;/?:@&=+$,.!~*\'()\[\]%-]+)',
+             bygroups(Text, Keyword.Type, Text, Keyword.Type),
+             'ignored-line'),
+        ],
+
+        # block scalar indicators and indentation spaces
+        'indentation': [
+            # trailing whitespaces are ignored
+            (r'[ ]*$', something(Text), '#pop:2'),
+            # whitespaces preceeding block collection indicators
+            (r'[ ]+(?=[?:-](?:[ ]|$))', save_indent(Text)),
+            # block collection indicators
+            (r'[?:-](?=[ ]|$)', set_indent(Punctuation.Indicator)),
+            # the beginning a block line
+            (r'[ ]*', save_indent(Text), '#pop'),
+        ],
+
+        # an indented line in the block context
+        'block-line': [
+            # the line end
+            (r'[ ]*(?=#|$)', something(Text), '#pop'),
+            # whitespaces separating tokens
+            (r'[ ]+', Text),
+            # tags, anchors and aliases,
+            include('descriptors'),
+            # block collections and scalars
+            include('block-nodes'),
+            # flow collections and quoted scalars
+            include('flow-nodes'),
+            # a plain scalar
+            (r'(?=[^\s?:,\[\]{}#&*!|>\'"%@`-]|[?:-]\S)',
+             something(Name.Variable),
+             'plain-scalar-in-block-context'),
+        ],
+
+        # tags, anchors, aliases
+        'descriptors': [
+            # a full-form tag
+            (r'!<[\w#;/?:@&=+$,.!~*\'()\[\]%-]+>', Keyword.Type),
+            # a tag in the form '!', '!suffix' or '!handle!suffix'
+            (r'!(?:[\w-]+!)?'
+             r'[\w#;/?:@&=+$,.!~*\'()\[\]%-]+', Keyword.Type),
+            # an anchor
+            (r'&[\w-]+', Name.Label),
+            # an alias
+            (r'\*[\w-]+', Name.Variable),
+        ],
+
+        # block collections and scalars
+        'block-nodes': [
+            # implicit key
+            (r':(?=[ ]|$)', set_indent(Punctuation.Indicator, implicit=True)),
+            # literal and folded scalars
+            (r'[|>]', Punctuation.Indicator,
+             ('block-scalar-content', 'block-scalar-header')),
+        ],
+
+        # flow collections and quoted scalars
+        'flow-nodes': [
+            # a flow sequence
+            (r'\[', Punctuation.Indicator, 'flow-sequence'),
+            # a flow mapping
+            (r'\{', Punctuation.Indicator, 'flow-mapping'),
+            # a single-quoted scalar
+            (r'\'', String, 'single-quoted-scalar'),
+            # a double-quoted scalar
+            (r'\"', String, 'double-quoted-scalar'),
+        ],
+
+        # the content of a flow collection
+        'flow-collection': [
+            # whitespaces
+            (r'[ ]+', Text),
+            # line breaks
+            (r'\n+', Text),
+            # a comment
+            (r'#[^\n]*', Comment.Single),
+            # simple indicators
+            (r'[?:,]', Punctuation.Indicator),
+            # tags, anchors and aliases
+            include('descriptors'),
+            # nested collections and quoted scalars
+            include('flow-nodes'),
+            # a plain scalar
+            (r'(?=[^\s?:,\[\]{}#&*!|>\'"%@`])',
+             something(Name.Variable),
+             'plain-scalar-in-flow-context'),
+        ],
+
+        # a flow sequence indicated by '[' and ']'
+        'flow-sequence': [
+            # include flow collection rules
+            include('flow-collection'),
+            # the closing indicator
+            (r'\]', Punctuation.Indicator, '#pop'),
+        ],
+
+        # a flow mapping indicated by '{' and '}'
+        'flow-mapping': [
+            # include flow collection rules
+            include('flow-collection'),
+            # the closing indicator
+            (r'\}', Punctuation.Indicator, '#pop'),
+        ],
+
+        # block scalar lines
+        'block-scalar-content': [
+            # line break
+            (r'\n', Text),
+            # empty line
+            (r'^[ ]+$',
+             parse_block_scalar_empty_line(Text, Name.Constant)),
+            # indentation spaces (we may leave the state here)
+            (r'^[ ]*', parse_block_scalar_indent(Text)),
+            # line content
+            (r'[\S\t ]+', Name.Constant),
+        ],
+
+        # the content of a literal or folded scalar
+        'block-scalar-header': [
+            # indentation indicator followed by chomping flag
+            (r'([1-9])?[+-]?(?=[ ]|$)',
+             set_block_scalar_indent(Punctuation.Indicator),
+             'ignored-line'),
+            # chomping flag followed by indentation indicator
+            (r'[+-]?([1-9])?(?=[ ]|$)',
+             set_block_scalar_indent(Punctuation.Indicator),
+             'ignored-line'),
+        ],
+
+        # ignored and regular whitespaces in quoted scalars
+        'quoted-scalar-whitespaces': [
+            # leading and trailing whitespaces are ignored
+            (r'^[ ]+', Text),
+            (r'[ ]+$', Text),
+            # line breaks are ignored
+            (r'\n+', Text),
+            # other whitespaces are a part of the value
+            (r'[ ]+', Name.Variable),
+        ],
+
+        # single-quoted scalars
+        'single-quoted-scalar': [
+            # include whitespace and line break rules
+            include('quoted-scalar-whitespaces'),
+            # escaping of the quote character
+            (r'\'\'', String.Escape),
+            # regular non-whitespace characters
+            (r'[^\s\']+', String),
+            # the closing quote
+            (r'\'', String, '#pop'),
+        ],
+
+        # double-quoted scalars
+        'double-quoted-scalar': [
+            # include whitespace and line break rules
+            include('quoted-scalar-whitespaces'),
+            # escaping of special characters
+            (r'\\[0abt\tn\nvfre "\\N_LP]', String),
+            # escape codes
+            (r'\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})',
+             String.Escape),
+            # regular non-whitespace characters
+            (r'[^\s"\\]+', String),
+            # the closing quote
+            (r'"', String, '#pop'),
+        ],
+
+        # the beginning of a new line while scanning a plain scalar
+        'plain-scalar-in-block-context-new-line': [
+            # empty lines
+            (r'^[ ]+$', Text),
+            # line breaks
+            (r'\n+', Text),
+            # document start and document end indicators
+            (r'^(?=---|\.\.\.)', something(Name.Namespace), '#pop:3'),
+            # indentation spaces (we may leave the block line state here)
+            (r'^[ ]*', parse_plain_scalar_indent(Text), '#pop'),
+        ],
+
+        # a plain scalar in the block context
+        'plain-scalar-in-block-context': [
+            # the scalar ends with the ':' indicator
+            (r'[ ]*(?=:[ ]|:$)', something(Text), '#pop'),
+            # the scalar ends with whitespaces followed by a comment
+            (r'[ ]+(?=#)', Text, '#pop'),
+            # trailing whitespaces are ignored
+            (r'[ ]+$', Text),
+            # line breaks are ignored
+            (r'\n+', Text, 'plain-scalar-in-block-context-new-line'),
+            # other whitespaces are a part of the value
+            (r'[ ]+', Literal.Scalar.Plain),
+            # regular non-whitespace characters
+            (r'(?::(?!\s)|[^\s:])+', Literal.Scalar.Plain),
+        ],
+
+        # a plain scalar is the flow context
+        'plain-scalar-in-flow-context': [
+            # the scalar ends with an indicator character
+            (r'[ ]*(?=[,:?\[\]{}])', something(Text), '#pop'),
+            # the scalar ends with a comment
+            (r'[ ]+(?=#)', Text, '#pop'),
+            # leading and trailing whitespaces are ignored
+            (r'^[ ]+', Text),
+            (r'[ ]+$', Text),
+            # line breaks are ignored
+            (r'\n+', Text),
+            # other whitespaces are a part of the value
+            (r'[ ]+', Name.Variable),
+            # regular non-whitespace characters
+            (r'[^\s,:?\[\]{}]+', Name.Variable),
+        ],
+
+    }
+
+    def get_tokens_unprocessed(self, text=None, context=None):
+        if context is None:
+            context = YamlLexerContext(text, 0)
+        return super(YamlLexer, self).get_tokens_unprocessed(text, context)
+
+
+class JsonLexer(RegexLexer):
+    """
+    For JSON data structures.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'JSON'
+    aliases = ['json']
+    filenames = ['*.json']
+    mimetypes = ['application/json']
+
+    flags = re.DOTALL
+
+    # integer part of a number
+    int_part = r'-?(0|[1-9]\d*)'
+
+    # fractional part of a number
+    frac_part = r'\.\d+'
+
+    # exponential part of a number
+    exp_part = r'[eE](\+|-)?\d+'
+
+    tokens = {
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+
+        # represents a simple terminal value
+        'simplevalue': [
+            (r'(true|false|null)\b', Keyword.Constant),
+            (('%(int_part)s(%(frac_part)s%(exp_part)s|'
+              '%(exp_part)s|%(frac_part)s)') % vars(),
+             Number.Float),
+            (int_part, Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+        ],
+
+
+        # the right hand side of an object, after the attribute name
+        'objectattribute': [
+            include('value'),
+            (r':', Punctuation),
+            # comma terminates the attribute but expects more
+            (r',', Punctuation, '#pop'),
+            # a closing bracket terminates the entire object, so pop twice
+            (r'\}', Punctuation, '#pop:2'),
+        ],
+
+        # a json object - { attr, attr, ... }
+        'objectvalue': [
+            include('whitespace'),
+            (r'"(\\\\|\\"|[^"])*"', Name.Tag, 'objectattribute'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+
+        # json array - [ value, value, ... }
+        'arrayvalue': [
+            include('whitespace'),
+            include('value'),
+            (r',', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+        ],
+
+        # a json value - either a simple value or a complex value (object or array)
+        'value': [
+            include('whitespace'),
+            include('simplevalue'),
+            (r'\{', Punctuation, 'objectvalue'),
+            (r'\[', Punctuation, 'arrayvalue'),
+        ],
+
+        # the root of a json document whould be a value
+        'root': [
+            include('value'),
+        ],
+    }
+
+
+class JsonBareObjectLexer(JsonLexer):
+    """
+    For JSON data structures (with missing object curly braces).
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'JSONBareObject'
+    aliases = ['json-object']
+    filenames = []
+    mimetypes = ['application/json-object']
+
+    tokens = {
+        'root': [
+            (r'\}', Error),
+            include('objectvalue'),
+        ],
+        'objectattribute': [
+            (r'\}', Error),
+            inherit,
+        ],
+    }
+
+
+class JsonLdLexer(JsonLexer):
+    """
+    For `JSON-LD <http://json-ld.org/>`_ linked data.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'JSON-LD'
+    aliases = ['jsonld', 'json-ld']
+    filenames = ['*.jsonld']
+    mimetypes = ['application/ld+json']
+
+    tokens = {
+        'objectvalue': [
+            (r'"@(context|id|value|language|type|container|list|set|'
+             r'reverse|index|base|vocab|graph)"', Name.Decorator,
+             'objectattribute'),
+            inherit,
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rdf.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rdf.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rdf.py	(revision 1126)
@@ -0,0 +1,270 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.rdf
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for semantic web and RDF query languages and markup.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default
+from pygments.token import Keyword, Punctuation, String, Number, Operator, Generic, \
+    Whitespace, Name, Literal, Comment, Text
+
+__all__ = ['SparqlLexer', 'TurtleLexer']
+
+
+class SparqlLexer(RegexLexer):
+    """
+    Lexer for `SPARQL <http://www.w3.org/TR/rdf-sparql-query/>`_ query language.
+
+    .. versionadded:: 2.0
+    """
+    name = 'SPARQL'
+    aliases = ['sparql']
+    filenames = ['*.rq', '*.sparql']
+    mimetypes = ['application/sparql-query']
+
+    # character group definitions ::
+
+    PN_CHARS_BASE_GRP = (u'a-zA-Z'
+                         u'\u00c0-\u00d6'
+                         u'\u00d8-\u00f6'
+                         u'\u00f8-\u02ff'
+                         u'\u0370-\u037d'
+                         u'\u037f-\u1fff'
+                         u'\u200c-\u200d'
+                         u'\u2070-\u218f'
+                         u'\u2c00-\u2fef'
+                         u'\u3001-\ud7ff'
+                         u'\uf900-\ufdcf'
+                         u'\ufdf0-\ufffd')
+
+    PN_CHARS_U_GRP = (PN_CHARS_BASE_GRP + '_')
+
+    PN_CHARS_GRP = (PN_CHARS_U_GRP +
+                    r'\-' +
+                    r'0-9' +
+                    u'\u00b7' +
+                    u'\u0300-\u036f' +
+                    u'\u203f-\u2040')
+
+    HEX_GRP = '0-9A-Fa-f'
+
+    PN_LOCAL_ESC_CHARS_GRP = r' _~.\-!$&"()*+,;=/?#@%'
+
+    # terminal productions ::
+
+    PN_CHARS_BASE = '[' + PN_CHARS_BASE_GRP + ']'
+
+    PN_CHARS_U = '[' + PN_CHARS_U_GRP + ']'
+
+    PN_CHARS = '[' + PN_CHARS_GRP + ']'
+
+    HEX = '[' + HEX_GRP + ']'
+
+    PN_LOCAL_ESC_CHARS = '[' + PN_LOCAL_ESC_CHARS_GRP + ']'
+
+    IRIREF = r'<(?:[^<>"{}|^`\\\x00-\x20])*>'
+
+    BLANK_NODE_LABEL = '_:[0-9' + PN_CHARS_U_GRP + '](?:[' + PN_CHARS_GRP + \
+                       '.]*' + PN_CHARS + ')?'
+
+    PN_PREFIX = PN_CHARS_BASE + '(?:[' + PN_CHARS_GRP + '.]*' + PN_CHARS + ')?'
+
+    VARNAME = u'[0-9' + PN_CHARS_U_GRP + '][' + PN_CHARS_U_GRP + \
+              u'0-9\u00b7\u0300-\u036f\u203f-\u2040]*'
+
+    PERCENT = '%' + HEX + HEX
+
+    PN_LOCAL_ESC = r'\\' + PN_LOCAL_ESC_CHARS
+
+    PLX = '(?:' + PERCENT + ')|(?:' + PN_LOCAL_ESC + ')'
+
+    PN_LOCAL = ('(?:[' + PN_CHARS_U_GRP + ':0-9' + ']|' + PLX + ')' +
+                '(?:(?:[' + PN_CHARS_GRP + '.:]|' + PLX + ')*(?:[' +
+                PN_CHARS_GRP + ':]|' + PLX + '))?')
+
+    EXPONENT = r'[eE][+-]?\d+'
+
+    # Lexer token definitions ::
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # keywords ::
+            (r'((?i)select|construct|describe|ask|where|filter|group\s+by|minus|'
+             r'distinct|reduced|from\s+named|from|order\s+by|desc|asc|limit|'
+             r'offset|bindings|load|clear|drop|create|add|move|copy|'
+             r'insert\s+data|delete\s+data|delete\s+where|delete|insert|'
+             r'using\s+named|using|graph|default|named|all|optional|service|'
+             r'silent|bind|union|not\s+in|in|as|having|to|prefix|base)\b', Keyword),
+            (r'(a)\b', Keyword),
+            # IRIs ::
+            ('(' + IRIREF + ')', Name.Label),
+            # blank nodes ::
+            ('(' + BLANK_NODE_LABEL + ')', Name.Label),
+            #  # variables ::
+            ('[?$]' + VARNAME, Name.Variable),
+            # prefixed names ::
+            (r'(' + PN_PREFIX + ')?(\:)(' + PN_LOCAL + ')?',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+            # function names ::
+            (r'((?i)str|lang|langmatches|datatype|bound|iri|uri|bnode|rand|abs|'
+             r'ceil|floor|round|concat|strlen|ucase|lcase|encode_for_uri|'
+             r'contains|strstarts|strends|strbefore|strafter|year|month|day|'
+             r'hours|minutes|seconds|timezone|tz|now|md5|sha1|sha256|sha384|'
+             r'sha512|coalesce|if|strlang|strdt|sameterm|isiri|isuri|isblank|'
+             r'isliteral|isnumeric|regex|substr|replace|exists|not\s+exists|'
+             r'count|sum|min|max|avg|sample|group_concat|separator)\b',
+             Name.Function),
+            # boolean literals ::
+            (r'(true|false)', Keyword.Constant),
+            # double literals ::
+            (r'[+\-]?(\d+\.\d*' + EXPONENT + '|\.?\d+' + EXPONENT + ')', Number.Float),
+            # decimal literals ::
+            (r'[+\-]?(\d+\.\d*|\.\d+)', Number.Float),
+            # integer literals ::
+            (r'[+\-]?\d+', Number.Integer),
+            # operators ::
+            (r'(\|\||&&|=|\*|\-|\+|/|!=|<=|>=|!|<|>)', Operator),
+            # punctuation characters ::
+            (r'[(){}.;,:^\[\]]', Punctuation),
+            # line comments ::
+            (r'#[^\n]*', Comment),
+            # strings ::
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String.Escape, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (r'u' + HEX + '{4}', String.Escape, '#pop'),
+            (r'U' + HEX + '{8}', String.Escape, '#pop'),
+            (r'.', String.Escape, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)',
+             bygroups(Operator, Name.Function), '#pop:2'),
+            (r'\^\^', Operator, '#pop:2'),
+            default('#pop:2'),
+        ],
+    }
+
+
+class TurtleLexer(RegexLexer):
+    """
+    Lexer for `Turtle <http://www.w3.org/TR/turtle/>`_ data language.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Turtle'
+    aliases = ['turtle']
+    filenames = ['*.ttl']
+    mimetypes = ['text/turtle', 'application/x-turtle']
+
+    flags = re.IGNORECASE
+
+    patterns = {
+        'PNAME_NS': r'((?:[a-z][\w-]*)?\:)',  # Simplified character range
+        'IRIREF': r'(<[^<>"{}|^`\\\x00-\x20]*>)'
+    }
+
+    # PNAME_NS PN_LOCAL (with simplified character range)
+    patterns['PrefixedName'] = r'%(PNAME_NS)s([a-z][\w-]*)' % patterns
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+
+            # Base / prefix
+            (r'(@base|BASE)(\s+)%(IRIREF)s(\s*)(\.?)' % patterns,
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace,
+                      Punctuation)),
+            (r'(@prefix|PREFIX)(\s+)%(PNAME_NS)s(\s+)%(IRIREF)s(\s*)(\.?)' % patterns,
+             bygroups(Keyword, Whitespace, Name.Namespace, Whitespace,
+                      Name.Variable, Whitespace, Punctuation)),
+
+            # The shorthand predicate 'a'
+            (r'(?<=\s)a(?=\s)', Keyword.Type),
+
+            # IRIREF
+            (r'%(IRIREF)s' % patterns, Name.Variable),
+
+            # PrefixedName
+            (r'%(PrefixedName)s' % patterns,
+             bygroups(Name.Namespace, Name.Tag)),
+
+            # Comment
+            (r'#[^\n]+', Comment),
+
+            (r'\b(true|false)\b', Literal),
+            (r'[+\-]?\d*\.\d+', Number.Float),
+            (r'[+\-]?\d*(:?\.\d+)?E[+\-]?\d+', Number.Float),
+            (r'[+\-]?\d+', Number.Integer),
+            (r'[\[\](){}.;,:^]', Punctuation),
+
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (r'.', String, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-z]+(:?-[a-z0-9]+)*)',
+             bygroups(Operator, Generic.Emph), '#pop:2'),
+
+            (r'(\^\^)%(IRIREF)s' % patterns, bygroups(Operator, Generic.Emph), '#pop:2'),
+            (r'(\^\^)%(PrefixedName)s' % patterns,
+             bygroups(Operator, Generic.Emph, Generic.Emph), '#pop:2'),
+
+            default('#pop:2'),
+
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/foxpro.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/foxpro.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/foxpro.py	(revision 1126)
@@ -0,0 +1,428 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.foxpro
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Simple lexer for Microsoft Visual FoxPro source code.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer
+from pygments.token import Punctuation, Text, Comment, Operator, Keyword, \
+     Name, String
+
+__all__ = ['FoxProLexer']
+
+
+class FoxProLexer(RegexLexer):
+    """Lexer for Microsoft Visual FoxPro language.
+
+    FoxPro syntax allows to shorten all keywords and function names
+    to 4 characters.  Shortened forms are not recognized by this lexer.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'FoxPro'
+    aliases = ['foxpro', 'vfp', 'clipper', 'xbase']
+    filenames = ['*.PRG', '*.prg']
+    mimetype = []
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r';\s*\n', Punctuation), # consume newline
+            (r'(^|\n)\s*', Text, 'newline'),
+
+            # Square brackets may be used for array indices
+            # and for string literal.  Look for arrays
+            # before matching string literals.
+            (r'(?<=\w)\[[0-9, ]+\]', Text),
+            (r'\'[^\'\n]*\'|"[^"\n]*"|\[[^]*]\]', String),
+            (r'(^\s*\*|&&|&amp;&amp;).*?\n', Comment.Single),
+
+            (r'(ABS|ACLASS|ACOPY|ACOS|ADATABASES|ADBOBJECTS|ADDBS|'
+             r'ADDPROPERTY|ADEL|ADIR|ADLLS|ADOCKSTATE|AELEMENT|AERROR|'
+             r'AEVENTS|AFIELDS|AFONT|AGETCLASS|AGETFILEVERSION|AINS|'
+             r'AINSTANCE|ALANGUAGE|ALEN|ALIAS|ALINES|ALLTRIM|'
+             r'AMEMBERS|AMOUSEOBJ|ANETRESOURCES|APRINTERS|APROCINFO|'
+             r'ASC|ASCAN|ASELOBJ|ASESSIONS|ASIN|ASORT|ASQLHANDLES|'
+             r'ASTACKINFO|ASUBSCRIPT|AT|AT_C|ATAGINFO|ATAN|ATC|ATCC|'
+             r'ATCLINE|ATLINE|ATN2|AUSED|AVCXCLASSES|BAR|BARCOUNT|'
+             r'BARPROMPT|BETWEEN|BINDEVENT|BINTOC|BITAND|BITCLEAR|'
+             r'BITLSHIFT|BITNOT|BITOR|BITRSHIFT|BITSET|BITTEST|BITXOR|'
+             r'BOF|CANDIDATE|CAPSLOCK|CAST|CDOW|CDX|CEILING|CHR|CHRSAW|'
+             r'CHRTRAN|CHRTRANC|CLEARRESULTSET|CMONTH|CNTBAR|CNTPAD|COL|'
+             r'COM|Functions|COMARRAY|COMCLASSINFO|COMPOBJ|COMPROP|'
+             r'COMRETURNERROR|COS|CPCONVERT|CPCURRENT|CPDBF|CREATEBINARY|'
+             r'CREATEOBJECT|CREATEOBJECTEX|CREATEOFFLINE|CTOBIN|CTOD|'
+             r'CTOT|CURDIR|CURSORGETPROP|CURSORSETPROP|CURSORTOXML|'
+             r'CURVAL|DATE|DATETIME|DAY|DBC|DBF|DBGETPROP|DBSETPROP|'
+             r'DBUSED|DDEAbortTrans|DDEAdvise|DDEEnabled|DDEExecute|'
+             r'DDEInitiate|DDELastError|DDEPoke|DDERequest|DDESetOption|'
+             r'DDESetService|DDESetTopic|DDETerminate|DEFAULTEXT|'
+             r'DELETED|DESCENDING|DIFFERENCE|DIRECTORY|DISKSPACE|'
+             r'DisplayPath|DMY|DODEFAULT|DOW|DRIVETYPE|DROPOFFLINE|'
+             r'DTOC|DTOR|DTOS|DTOT|EDITSOURCE|EMPTY|EOF|ERROR|EVAL(UATE)?|'
+             r'EVENTHANDLER|EVL|EXECSCRIPT|EXP|FCHSIZE|FCLOSE|FCOUNT|'
+             r'FCREATE|FDATE|FEOF|FERROR|FFLUSH|FGETS|FIELD|FILE|'
+             r'FILETOSTR|FILTER|FKLABEL|FKMAX|FLDLIST|FLOCK|FLOOR|'
+             r'FONTMETRIC|FOPEN|FOR|FORCEEXT|FORCEPATH|FOUND|FPUTS|'
+             r'FREAD|FSEEK|FSIZE|FTIME|FULLPATH|FV|FWRITE|'
+             r'GETAUTOINCVALUE|GETBAR|GETCOLOR|GETCP|GETDIR|GETENV|'
+             r'GETFILE|GETFLDSTATE|GETFONT|GETINTERFACE|'
+             r'GETNEXTMODIFIED|GETOBJECT|GETPAD|GETPEM|GETPICT|'
+             r'GETPRINTER|GETRESULTSET|GETWORDCOUNT|GETWORDNUM|'
+             r'GETCURSORADAPTER|GOMONTH|HEADER|HOME|HOUR|ICASE|'
+             r'IDXCOLLATE|IIF|IMESTATUS|INDBC|INDEXSEEK|INKEY|INLIST|'
+             r'INPUTBOX|INSMODE|INT|ISALPHA|ISBLANK|ISCOLOR|ISDIGIT|'
+             r'ISEXCLUSIVE|ISFLOCKED|ISLEADBYTE|ISLOWER|ISMEMOFETCHED|'
+             r'ISMOUSE|ISNULL|ISPEN|ISREADONLY|ISRLOCKED|'
+             r'ISTRANSACTABLE|ISUPPER|JUSTDRIVE|JUSTEXT|JUSTFNAME|'
+             r'JUSTPATH|JUSTSTEM|KEY|KEYMATCH|LASTKEY|LEFT|LEFTC|LEN|'
+             r'LENC|LIKE|LIKEC|LINENO|LOADPICTURE|LOCFILE|LOCK|LOG|'
+             r'LOG10|LOOKUP|LOWER|LTRIM|LUPDATE|MAKETRANSACTABLE|MAX|'
+             r'MCOL|MDOWN|MDX|MDY|MEMLINES|MEMORY|MENU|MESSAGE|'
+             r'MESSAGEBOX|MIN|MINUTE|MLINE|MOD|MONTH|MRKBAR|MRKPAD|'
+             r'MROW|MTON|MWINDOW|NDX|NEWOBJECT|NORMALIZE|NTOM|NUMLOCK|'
+             r'NVL|OBJNUM|OBJTOCLIENT|OBJVAR|OCCURS|OEMTOANSI|OLDVAL|'
+             r'ON|ORDER|OS|PAD|PADL|PARAMETERS|PAYMENT|PCOL|PCOUNT|'
+             r'PEMSTATUS|PI|POPUP|PRIMARY|PRINTSTATUS|PRMBAR|PRMPAD|'
+             r'PROGRAM|PROMPT|PROPER|PROW|PRTINFO|PUTFILE|PV|QUARTER|'
+             r'RAISEEVENT|RAND|RAT|RATC|RATLINE|RDLEVEL|READKEY|RECCOUNT|'
+             r'RECNO|RECSIZE|REFRESH|RELATION|REPLICATE|REQUERY|RGB|'
+             r'RGBSCHEME|RIGHT|RIGHTC|RLOCK|ROUND|ROW|RTOD|RTRIM|'
+             r'SAVEPICTURE|SCHEME|SCOLS|SEC|SECONDS|SEEK|SELECT|SET|'
+             r'SETFLDSTATE|SETRESULTSET|SIGN|SIN|SKPBAR|SKPPAD|SOUNDEX|'
+             r'SPACE|SQLCANCEL|SQLCOLUMNS|SQLCOMMIT|SQLCONNECT|'
+             r'SQLDISCONNECT|SQLEXEC|SQLGETPROP|SQLIDLEDISCONNECT|'
+             r'SQLMORERESULTS|SQLPREPARE|SQLROLLBACK|SQLSETPROP|'
+             r'SQLSTRINGCONNECT|SQLTABLES|SQRT|SROWS|STR|STRCONV|'
+             r'STREXTRACT|STRTOFILE|STRTRAN|STUFF|STUFFC|SUBSTR|'
+             r'SUBSTRC|SYS|SYSMETRIC|TABLEREVERT|TABLEUPDATE|TAG|'
+             r'TAGCOUNT|TAGNO|TAN|TARGET|TEXTMERGE|TIME|TRANSFORM|'
+             r'TRIM|TTOC|TTOD|TXNLEVEL|TXTWIDTH|TYPE|UNBINDEVENTS|'
+             r'UNIQUE|UPDATED|UPPER|USED|VAL|VARREAD|VARTYPE|VERSION|'
+             r'WBORDER|WCHILD|WCOLS|WDOCKABLE|WEEK|WEXIST|WFONT|WLAST|'
+             r'WLCOL|WLROW|WMAXIMUM|WMINIMUM|WONTOP|WOUTPUT|WPARENT|'
+             r'WREAD|WROWS|WTITLE|WVISIBLE|XMLTOCURSOR|XMLUPDATEGRAM|'
+             r'YEAR)(?=\s*\()', Name.Function),
+
+            (r'_ALIGNMENT|_ASCIICOLS|_ASCIIROWS|_ASSIST|_BEAUTIFY|_BOX|'
+             r'_BROWSER|_BUILDER|_CALCMEM|_CALCVALUE|_CLIPTEXT|_CONVERTER|'
+             r'_COVERAGE|_CUROBJ|_DBLCLICK|_DIARYDATE|_DOS|_FOXDOC|_FOXREF|'
+             r'_GALLERY|_GENGRAPH|_GENHTML|_GENMENU|_GENPD|_GENSCRN|'
+             r'_GENXTAB|_GETEXPR|_INCLUDE|_INCSEEK|_INDENT|_LMARGIN|_MAC|'
+             r'_MENUDESIGNER|_MLINE|_PADVANCE|_PAGENO|_PAGETOTAL|_PBPAGE|'
+             r'_PCOLNO|_PCOPIES|_PDRIVER|_PDSETUP|_PECODE|_PEJECT|_PEPAGE|'
+             r'_PLENGTH|_PLINENO|_PLOFFSET|_PPITCH|_PQUALITY|_PRETEXT|'
+             r'_PSCODE|_PSPACING|_PWAIT|_RMARGIN|_REPORTBUILDER|'
+             r'_REPORTOUTPUT|_REPORTPREVIEW|_SAMPLES|_SCCTEXT|_SCREEN|'
+             r'_SHELL|_SPELLCHK|_STARTUP|_TABS|_TALLY|_TASKPANE|_TEXT|'
+             r'_THROTTLE|_TOOLBOX|_TOOLTIPTIMEOUT|_TRANSPORT|_TRIGGERLEVEL|'
+             r'_UNIX|_VFP|_WINDOWS|_WIZARD|_WRAP', Keyword.Pseudo),
+
+            (r'THISFORMSET|THISFORM|THIS', Name.Builtin),
+
+            (r'Application|CheckBox|Collection|Column|ComboBox|'
+             r'CommandButton|CommandGroup|Container|Control|CursorAdapter|'
+             r'Cursor|Custom|DataEnvironment|DataObject|EditBox|'
+             r'Empty|Exception|Fields|Files|File|FormSet|Form|FoxCode|'
+             r'Grid|Header|Hyperlink|Image|Label|Line|ListBox|Objects|'
+             r'OptionButton|OptionGroup|PageFrame|Page|ProjectHook|Projects|'
+             r'Project|Relation|ReportListener|Separator|Servers|Server|'
+             r'Session|Shape|Spinner|Tables|TextBox|Timer|ToolBar|'
+             r'XMLAdapter|XMLField|XMLTable', Name.Class),
+
+            (r'm\.[a-z_]\w*', Name.Variable),
+            (r'\.(F|T|AND|OR|NOT|NULL)\.|\b(AND|OR|NOT|NULL)\b', Operator.Word),
+
+            (r'\.(ActiveColumn|ActiveControl|ActiveForm|ActivePage|'
+             r'ActiveProject|ActiveRow|AddLineFeeds|ADOCodePage|Alias|'
+             r'Alignment|Align|AllowAddNew|AllowAutoColumnFit|'
+             r'AllowCellSelection|AllowDelete|AllowHeaderSizing|'
+             r'AllowInsert|AllowModalMessages|AllowOutput|AllowRowSizing|'
+             r'AllowSimultaneousFetch|AllowTabs|AllowUpdate|'
+             r'AlwaysOnBottom|AlwaysOnTop|Anchor|Application|'
+             r'AutoActivate|AutoCenter|AutoCloseTables|AutoComplete|'
+             r'AutoCompSource|AutoCompTable|AutoHideScrollBar|'
+             r'AutoIncrement|AutoOpenTables|AutoRelease|AutoSize|'
+             r'AutoVerbMenu|AutoYield|BackColor|ForeColor|BackStyle|'
+             r'BaseClass|BatchUpdateCount|BindControls|BorderColor|'
+             r'BorderStyle|BorderWidth|BoundColumn|BoundTo|Bound|'
+             r'BreakOnError|BufferModeOverride|BufferMode|'
+             r'BuildDateTime|ButtonCount|Buttons|Cancel|Caption|'
+             r'Centered|Century|ChildAlias|ChildOrder|ChildTable|'
+             r'ClassLibrary|Class|ClipControls|Closable|CLSID|CodePage|'
+             r'ColorScheme|ColorSource|ColumnCount|ColumnLines|'
+             r'ColumnOrder|Columns|ColumnWidths|CommandClauses|'
+             r'Comment|CompareMemo|ConflictCheckCmd|ConflictCheckType|'
+             r'ContinuousScroll|ControlBox|ControlCount|Controls|'
+             r'ControlSource|ConversionFunc|Count|CurrentControl|'
+             r'CurrentDataSession|CurrentPass|CurrentX|CurrentY|'
+             r'CursorSchema|CursorSource|CursorStatus|Curvature|'
+             r'Database|DataSessionID|DataSession|DataSourceType|'
+             r'DataSource|DataType|DateFormat|DateMark|Debug|'
+             r'DeclareXMLPrefix|DEClassLibrary|DEClass|DefaultFilePath|'
+             r'Default|DefOLELCID|DeleteCmdDataSourceType|DeleteCmdDataSource|'
+             r'DeleteCmd|DeleteMark|Description|Desktop|'
+             r'Details|DisabledBackColor|DisabledForeColor|'
+             r'DisabledItemBackColor|DisabledItemForeColor|'
+             r'DisabledPicture|DisableEncode|DisplayCount|'
+             r'DisplayValue|Dockable|Docked|DockPosition|'
+             r'DocumentFile|DownPicture|DragIcon|DragMode|DrawMode|'
+             r'DrawStyle|DrawWidth|DynamicAlignment|DynamicBackColor|'
+             r'DynamicForeColor|DynamicCurrentControl|DynamicFontBold|'
+             r'DynamicFontItalic|DynamicFontStrikethru|'
+             r'DynamicFontUnderline|DynamicFontName|DynamicFontOutline|'
+             r'DynamicFontShadow|DynamicFontSize|DynamicInputMask|'
+             r'DynamicLineHeight|EditorOptions|Enabled|'
+             r'EnableHyperlinks|Encrypted|ErrorNo|Exclude|Exclusive|'
+             r'FetchAsNeeded|FetchMemoCmdList|FetchMemoDataSourceType|'
+             r'FetchMemoDataSource|FetchMemo|FetchSize|'
+             r'FileClassLibrary|FileClass|FillColor|FillStyle|Filter|'
+             r'FirstElement|FirstNestedTable|Flags|FontBold|FontItalic|'
+             r'FontStrikethru|FontUnderline|FontCharSet|FontCondense|'
+             r'FontExtend|FontName|FontOutline|FontShadow|FontSize|'
+             r'ForceCloseTag|Format|FormCount|FormattedOutput|Forms|'
+             r'FractionDigits|FRXDataSession|FullName|GDIPlusGraphics|'
+             r'GridLineColor|GridLines|GridLineWidth|HalfHeightCaption|'
+             r'HeaderClassLibrary|HeaderClass|HeaderHeight|Height|'
+             r'HelpContextID|HideSelection|HighlightBackColor|'
+             r'HighlightForeColor|HighlightStyle|HighlightRowLineWidth|'
+             r'HighlightRow|Highlight|HomeDir|Hours|HostName|'
+             r'HScrollSmallChange|hWnd|Icon|IncrementalSearch|Increment|'
+             r'InitialSelectedAlias|InputMask|InsertCmdDataSourceType|'
+             r'InsertCmdDataSource|InsertCmdRefreshCmd|'
+             r'InsertCmdRefreshFieldList|InsertCmdRefreshKeyFieldList|'
+             r'InsertCmd|Instancing|IntegralHeight|'
+             r'Interval|IMEMode|IsAttribute|IsBase64|IsBinary|IsNull|'
+             r'IsDiffGram|IsLoaded|ItemBackColor,|ItemData|ItemIDData|'
+             r'ItemTips|IXMLDOMElement|KeyboardHighValue|KeyboardLowValue|'
+             r'Keyfield|KeyFieldList|KeyPreview|KeySort|LanguageOptions|'
+             r'LeftColumn|Left|LineContents|LineNo|LineSlant|LinkMaster|'
+             r'ListCount|ListenerType|ListIndex|ListItemID|ListItem|'
+             r'List|LockColumnsLeft|LockColumns|LockScreen|MacDesktop|'
+             r'MainFile|MapN19_4ToCurrency|MapBinary|MapVarchar|Margin|'
+             r'MaxButton|MaxHeight|MaxLeft|MaxLength|MaxRecords|MaxTop|'
+             r'MaxWidth|MDIForm|MemberClassLibrary|MemberClass|'
+             r'MemoWindow|Message|MinButton|MinHeight|MinWidth|'
+             r'MouseIcon|MousePointer|Movable|MoverBars|MultiSelect|'
+             r'Name|NestedInto|NewIndex|NewItemID|NextSiblingTable|'
+             r'NoCpTrans|NoDataOnLoad|NoData|NullDisplay|'
+             r'NumberOfElements|Object|OLEClass|OLEDragMode|'
+             r'OLEDragPicture|OLEDropEffects|OLEDropHasData|'
+             r'OLEDropMode|OLEDropTextInsertion|OLELCID|'
+             r'OLERequestPendingTimeout|OLEServerBusyRaiseError|'
+             r'OLEServerBusyTimeout|OLETypeAllowed|OneToMany|'
+             r'OpenViews|OpenWindow|Optimize|OrderDirection|Order|'
+             r'OutputPageCount|OutputType|PageCount|PageHeight|'
+             r'PageNo|PageOrder|Pages|PageTotal|PageWidth|'
+             r'PanelLink|Panel|ParentAlias|ParentClass|ParentTable|'
+             r'Parent|Partition|PasswordChar|PictureMargin|'
+             r'PicturePosition|PictureSpacing|PictureSelectionDisplay|'
+             r'PictureVal|Picture|Prepared|'
+             r'PolyPoints|PreserveWhiteSpace|PreviewContainer|'
+             r'PrintJobName|Procedure|PROCESSID|ProgID|ProjectHookClass|'
+             r'ProjectHookLibrary|ProjectHook|QuietMode|'
+             r'ReadCycle|ReadLock|ReadMouse|ReadObject|ReadOnly|'
+             r'ReadSave|ReadTimeout|RecordMark|RecordSourceType|'
+             r'RecordSource|RefreshAlias|'
+             r'RefreshCmdDataSourceType|RefreshCmdDataSource|RefreshCmd|'
+             r'RefreshIgnoreFieldList|RefreshTimeStamp|RelationalExpr|'
+             r'RelativeColumn|RelativeRow|ReleaseType|Resizable|'
+             r'RespectCursorCP|RespectNesting|RightToLeft|RotateFlip|'
+             r'Rotation|RowColChange|RowHeight|RowSourceType|'
+             r'RowSource|ScaleMode|SCCProvider|SCCStatus|ScrollBars|'
+             r'Seconds|SelectCmd|SelectedID|'
+             r'SelectedItemBackColor|SelectedItemForeColor|Selected|'
+             r'SelectionNamespaces|SelectOnEntry|SelLength|SelStart|'
+             r'SelText|SendGDIPlusImage|SendUpdates|ServerClassLibrary|'
+             r'ServerClass|ServerHelpFile|ServerName|'
+             r'ServerProject|ShowTips|ShowInTaskbar|ShowWindow|'
+             r'Sizable|SizeBox|SOM|Sorted|Sparse|SpecialEffect|'
+             r'SpinnerHighValue|SpinnerLowValue|SplitBar|StackLevel|'
+             r'StartMode|StatusBarText|StatusBar|Stretch|StrictDateEntry|'
+             r'Style|TabIndex|Tables|TabOrientation|Tabs|TabStop|'
+             r'TabStretch|TabStyle|Tag|TerminateRead|Text|Themes|'
+             r'ThreadID|TimestampFieldList|TitleBar|ToolTipText|'
+             r'TopIndex|TopItemID|Top|TwoPassProcess|TypeLibCLSID|'
+             r'TypeLibDesc|TypeLibName|Type|Unicode|UpdatableFieldList|'
+             r'UpdateCmdDataSourceType|UpdateCmdDataSource|'
+             r'UpdateCmdRefreshCmd|UpdateCmdRefreshFieldList|'
+             r'UpdateCmdRefreshKeyFieldList|UpdateCmd|'
+             r'UpdateGramSchemaLocation|UpdateGram|UpdateNameList|UpdateType|'
+             r'UseCodePage|UseCursorSchema|UseDeDataSource|UseMemoSize|'
+             r'UserValue|UseTransactions|UTF8Encoded|Value|VersionComments|'
+             r'VersionCompany|VersionCopyright|VersionDescription|'
+             r'VersionNumber|VersionProduct|VersionTrademarks|Version|'
+             r'VFPXMLProgID|ViewPortHeight|ViewPortLeft|'
+             r'ViewPortTop|ViewPortWidth|VScrollSmallChange|View|Visible|'
+             r'VisualEffect|WhatsThisButton|WhatsThisHelpID|WhatsThisHelp|'
+             r'WhereType|Width|WindowList|WindowState|WindowType|WordWrap|'
+             r'WrapCharInCDATA|WrapInCDATA|WrapMemoInCDATA|XMLAdapter|'
+             r'XMLConstraints|XMLNameIsXPath|XMLNamespace|XMLName|'
+             r'XMLPrefix|XMLSchemaLocation|XMLTable|XMLType|'
+             r'XSDfractionDigits|XSDmaxLength|XSDtotalDigits|'
+             r'XSDtype|ZoomBox)', Name.Attribute),
+
+            (r'\.(ActivateCell|AddColumn|AddItem|AddListItem|AddObject|'
+             r'AddProperty|AddTableSchema|AddToSCC|Add|'
+             r'ApplyDiffgram|Attach|AutoFit|AutoOpen|Box|Build|'
+             r'CancelReport|ChangesToCursor|CheckIn|CheckOut|Circle|'
+             r'CleanUp|ClearData|ClearStatus|Clear|CloneObject|CloseTables|'
+             r'Close|Cls|CursorAttach|CursorDetach|CursorFill|'
+             r'CursorRefresh|DataToClip|DelayedMemoFetch|DeleteColumn|'
+             r'Dock|DoMessage|DoScroll|DoStatus|DoVerb|Drag|Draw|Eval|'
+             r'GetData|GetDockState|GetFormat|GetKey|GetLatestVersion|'
+             r'GetPageHeight|GetPageWidth|Help|Hide|IncludePageInOutput|'
+             r'IndexToItemID|ItemIDToIndex|Item|LoadXML|Line|Modify|'
+             r'MoveItem|Move|Nest|OLEDrag|OnPreviewClose|OutputPage|'
+             r'Point|Print|PSet|Quit|ReadExpression|ReadMethod|'
+             r'RecordRefresh|Refresh|ReleaseXML|Release|RemoveFromSCC|'
+             r'RemoveItem|RemoveListItem|RemoveObject|Remove|'
+             r'Render|Requery|RequestData|ResetToDefault|Reset|Run|'
+             r'SaveAsClass|SaveAs|SetAll|SetData|SetFocus|SetFormat|'
+             r'SetMain|SetVar|SetViewPort|ShowWhatsThis|Show|'
+             r'SupportsListenerType|TextHeight|TextWidth|ToCursor|'
+             r'ToXML|UndoCheckOut|Unnest|UpdateStatus|WhatsThisMode|'
+             r'WriteExpression|WriteMethod|ZOrder)', Name.Function),
+
+            (r'\.(Activate|AdjustObjectSize|AfterBand|AfterBuild|'
+             r'AfterCloseTables|AfterCursorAttach|AfterCursorClose|'
+             r'AfterCursorDetach|AfterCursorFill|AfterCursorRefresh|'
+             r'AfterCursorUpdate|AfterDelete|AfterInsert|'
+             r'AfterRecordRefresh|AfterUpdate|AfterDock|AfterReport|'
+             r'AfterRowColChange|BeforeBand|BeforeCursorAttach|'
+             r'BeforeCursorClose|BeforeCursorDetach|BeforeCursorFill|'
+             r'BeforeCursorRefresh|BeforeCursorUpdate|BeforeDelete|'
+             r'BeforeInsert|BeforeDock|BeforeOpenTables|'
+             r'BeforeRecordRefresh|BeforeReport|BeforeRowColChange|'
+             r'BeforeUpdate|Click|dbc_Activate|dbc_AfterAddTable|'
+             r'dbc_AfterAppendProc|dbc_AfterCloseTable|dbc_AfterCopyProc|'
+             r'dbc_AfterCreateConnection|dbc_AfterCreateOffline|'
+             r'dbc_AfterCreateTable|dbc_AfterCreateView|dbc_AfterDBGetProp|'
+             r'dbc_AfterDBSetProp|dbc_AfterDeleteConnection|'
+             r'dbc_AfterDropOffline|dbc_AfterDropTable|'
+             r'dbc_AfterModifyConnection|dbc_AfterModifyProc|'
+             r'dbc_AfterModifyTable|dbc_AfterModifyView|dbc_AfterOpenTable|'
+             r'dbc_AfterRemoveTable|dbc_AfterRenameConnection|'
+             r'dbc_AfterRenameTable|dbc_AfterRenameView|'
+             r'dbc_AfterValidateData|dbc_BeforeAddTable|'
+             r'dbc_BeforeAppendProc|dbc_BeforeCloseTable|'
+             r'dbc_BeforeCopyProc|dbc_BeforeCreateConnection|'
+             r'dbc_BeforeCreateOffline|dbc_BeforeCreateTable|'
+             r'dbc_BeforeCreateView|dbc_BeforeDBGetProp|'
+             r'dbc_BeforeDBSetProp|dbc_BeforeDeleteConnection|'
+             r'dbc_BeforeDropOffline|dbc_BeforeDropTable|'
+             r'dbc_BeforeModifyConnection|dbc_BeforeModifyProc|'
+             r'dbc_BeforeModifyTable|dbc_BeforeModifyView|'
+             r'dbc_BeforeOpenTable|dbc_BeforeRemoveTable|'
+             r'dbc_BeforeRenameConnection|dbc_BeforeRenameTable|'
+             r'dbc_BeforeRenameView|dbc_BeforeValidateData|'
+             r'dbc_CloseData|dbc_Deactivate|dbc_ModifyData|dbc_OpenData|'
+             r'dbc_PackData|DblClick|Deactivate|Deleted|Destroy|DoCmd|'
+             r'DownClick|DragDrop|DragOver|DropDown|ErrorMessage|Error|'
+             r'EvaluateContents|GotFocus|Init|InteractiveChange|KeyPress|'
+             r'LoadReport|Load|LostFocus|Message|MiddleClick|MouseDown|'
+             r'MouseEnter|MouseLeave|MouseMove|MouseUp|MouseWheel|Moved|'
+             r'OLECompleteDrag|OLEDragOver|OLEGiveFeedback|OLESetData|'
+             r'OLEStartDrag|OnMoveItem|Paint|ProgrammaticChange|'
+             r'QueryAddFile|QueryModifyFile|QueryNewFile|QueryRemoveFile|'
+             r'QueryRunFile|QueryUnload|RangeHigh|RangeLow|ReadActivate|'
+             r'ReadDeactivate|ReadShow|ReadValid|ReadWhen|Resize|'
+             r'RightClick|SCCInit|SCCDestroy|Scrolled|Timer|UIEnable|'
+             r'UnDock|UnloadReport|Unload|UpClick|Valid|When)', Name.Function),
+
+            (r'\s+', Text),
+            # everything else is not colored
+            (r'.', Text),
+        ],
+        'newline': [
+            (r'\*.*?$', Comment.Single, '#pop'),
+            (r'(ACCEPT|ACTIVATE\s*MENU|ACTIVATE\s*POPUP|ACTIVATE\s*SCREEN|'
+             r'ACTIVATE\s*WINDOW|APPEND|APPEND\s*FROM|APPEND\s*FROM\s*ARRAY|'
+             r'APPEND\s*GENERAL|APPEND\s*MEMO|ASSIST|AVERAGE|BLANK|BROWSE|'
+             r'BUILD\s*APP|BUILD\s*EXE|BUILD\s*PROJECT|CALCULATE|CALL|'
+             r'CANCEL|CHANGE|CLEAR|CLOSE|CLOSE\s*MEMO|COMPILE|CONTINUE|'
+             r'COPY\s*FILE|COPY\s*INDEXES|COPY\s*MEMO|COPY\s*STRUCTURE|'
+             r'COPY\s*STRUCTURE\s*EXTENDED|COPY\s*TAG|COPY\s*TO|'
+             r'COPY\s*TO\s*ARRAY|COUNT|CREATE|CREATE\s*COLOR\s*SET|'
+             r'CREATE\s*CURSOR|CREATE\s*FROM|CREATE\s*LABEL|CREATE\s*MENU|'
+             r'CREATE\s*PROJECT|CREATE\s*QUERY|CREATE\s*REPORT|'
+             r'CREATE\s*SCREEN|CREATE\s*TABLE|CREATE\s*VIEW|DDE|'
+             r'DEACTIVATE\s*MENU|DEACTIVATE\s*POPUP|DEACTIVATE\s*WINDOW|'
+             r'DECLARE|DEFINE\s*BAR|DEFINE\s*BOX|DEFINE\s*MENU|'
+             r'DEFINE\s*PAD|DEFINE\s*POPUP|DEFINE\s*WINDOW|DELETE|'
+             r'DELETE\s*FILE|DELETE\s*TAG|DIMENSION|DIRECTORY|DISPLAY|'
+             r'DISPLAY\s*FILES|DISPLAY\s*MEMORY|DISPLAY\s*STATUS|'
+             r'DISPLAY\s*STRUCTURE|DO|EDIT|EJECT|EJECT\s*PAGE|ERASE|'
+             r'EXIT|EXPORT|EXTERNAL|FILER|FIND|FLUSH|FUNCTION|GATHER|'
+             r'GETEXPR|GO|GOTO|HELP|HIDE\s*MENU|HIDE\s*POPUP|'
+             r'HIDE\s*WINDOW|IMPORT|INDEX|INPUT|INSERT|JOIN|KEYBOARD|'
+             r'LABEL|LIST|LOAD|LOCATE|LOOP|MENU|MENU\s*TO|MODIFY\s*COMMAND|'
+             r'MODIFY\s*FILE|MODIFY\s*GENERAL|MODIFY\s*LABEL|MODIFY\s*MEMO|'
+             r'MODIFY\s*MENU|MODIFY\s*PROJECT|MODIFY\s*QUERY|'
+             r'MODIFY\s*REPORT|MODIFY\s*SCREEN|MODIFY\s*STRUCTURE|'
+             r'MODIFY\s*WINDOW|MOVE\s*POPUP|MOVE\s*WINDOW|NOTE|'
+             r'ON\s*APLABOUT|ON\s*BAR|ON\s*ERROR|ON\s*ESCAPE|'
+             r'ON\s*EXIT\s*BAR|ON\s*EXIT\s*MENU|ON\s*EXIT\s*PAD|'
+             r'ON\s*EXIT\s*POPUP|ON\s*KEY|ON\s*KEY\s*=|ON\s*KEY\s*LABEL|'
+             r'ON\s*MACHELP|ON\s*PAD|ON\s*PAGE|ON\s*READERROR|'
+             r'ON\s*SELECTION\s*BAR|ON\s*SELECTION\s*MENU|'
+             r'ON\s*SELECTION\s*PAD|ON\s*SELECTION\s*POPUP|ON\s*SHUTDOWN|'
+             r'PACK|PARAMETERS|PLAY\s*MACRO|POP\s*KEY|POP\s*MENU|'
+             r'POP\s*POPUP|PRIVATE|PROCEDURE|PUBLIC|PUSH\s*KEY|'
+             r'PUSH\s*MENU|PUSH\s*POPUP|QUIT|READ|READ\s*MENU|RECALL|'
+             r'REINDEX|RELEASE|RELEASE\s*MODULE|RENAME|REPLACE|'
+             r'REPLACE\s*FROM\s*ARRAY|REPORT|RESTORE\s*FROM|'
+             r'RESTORE\s*MACROS|RESTORE\s*SCREEN|RESTORE\s*WINDOW|'
+             r'RESUME|RETRY|RETURN|RUN|RUN\s*\/N"|RUNSCRIPT|'
+             r'SAVE\s*MACROS|SAVE\s*SCREEN|SAVE\s*TO|SAVE\s*WINDOWS|'
+             r'SCATTER|SCROLL|SEEK|SELECT|SET|SET\s*ALTERNATE|'
+             r'SET\s*ANSI|SET\s*APLABOUT|SET\s*AUTOSAVE|SET\s*BELL|'
+             r'SET\s*BLINK|SET\s*BLOCKSIZE|SET\s*BORDER|SET\s*BRSTATUS|'
+             r'SET\s*CARRY|SET\s*CENTURY|SET\s*CLEAR|SET\s*CLOCK|'
+             r'SET\s*COLLATE|SET\s*COLOR\s*OF|SET\s*COLOR\s*OF\s*SCHEME|'
+             r'SET\s*COLOR\s*SET|SET\s*COLOR\s*TO|SET\s*COMPATIBLE|'
+             r'SET\s*CONFIRM|SET\s*CONSOLE|SET\s*CURRENCY|SET\s*CURSOR|'
+             r'SET\s*DATE|SET\s*DEBUG|SET\s*DECIMALS|SET\s*DEFAULT|'
+             r'SET\s*DELETED|SET\s*DELIMITERS|SET\s*DEVELOPMENT|'
+             r'SET\s*DEVICE|SET\s*DISPLAY|SET\s*DOHISTORY|SET\s*ECHO|'
+             r'SET\s*ESCAPE|SET\s*EXACT|SET\s*EXCLUSIVE|SET\s*FIELDS|'
+             r'SET\s*FILTER|SET\s*FIXED|SET\s*FORMAT|SET\s*FULLPATH|'
+             r'SET\s*FUNCTION|SET\s*HEADINGS|SET\s*HELP|SET\s*HELPFILTER|'
+             r'SET\s*HOURS|SET\s*INDEX|SET\s*INTENSITY|SET\s*KEY|'
+             r'SET\s*KEYCOMP|SET\s*LIBRARY|SET\s*LOCK|SET\s*LOGERRORS|'
+             r'SET\s*MACDESKTOP|SET\s*MACHELP|SET\s*MACKEY|SET\s*MARGIN|'
+             r'SET\s*MARK\s*OF|SET\s*MARK\s*TO|SET\s*MEMOWIDTH|'
+             r'SET\s*MESSAGE|SET\s*MOUSE|SET\s*MULTILOCKS|SET\s*NEAR|'
+             r'SET\s*NOCPTRANS|SET\s*NOTIFY|SET\s*ODOMETER|SET\s*OPTIMIZE|'
+             r'SET\s*ORDER|SET\s*PALETTE|SET\s*PATH|SET\s*PDSETUP|'
+             r'SET\s*POINT|SET\s*PRINTER|SET\s*PROCEDURE|SET\s*READBORDER|'
+             r'SET\s*REFRESH|SET\s*RELATION|SET\s*RELATION\s*OFF|'
+             r'SET\s*REPROCESS|SET\s*RESOURCE|SET\s*SAFETY|SET\s*SCOREBOARD|'
+             r'SET\s*SEPARATOR|SET\s*SHADOWS|SET\s*SKIP|SET\s*SKIP\s*OF|'
+             r'SET\s*SPACE|SET\s*STATUS|SET\s*STATUS\s*BAR|SET\s*STEP|'
+             r'SET\s*STICKY|SET\s*SYSMENU|SET\s*TALK|SET\s*TEXTMERGE|'
+             r'SET\s*TEXTMERGE\s*DELIMITERS|SET\s*TOPIC|SET\s*TRBETWEEN|'
+             r'SET\s*TYPEAHEAD|SET\s*UDFPARMS|SET\s*UNIQUE|SET\s*VIEW|'
+             r'SET\s*VOLUME|SET\s*WINDOW\s*OF\s*MEMO|SET\s*XCMDFILE|'
+             r'SHOW\s*GET|SHOW\s*GETS|SHOW\s*MENU|SHOW\s*OBJECT|'
+             r'SHOW\s*POPUP|SHOW\s*WINDOW|SIZE\s*POPUP|SKIP|SORT|'
+             r'STORE|SUM|SUSPEND|TOTAL|TYPE|UNLOCK|UPDATE|USE|WAIT|'
+             r'ZAP|ZOOM\s*WINDOW|DO\s*CASE|CASE|OTHERWISE|ENDCASE|'
+             r'DO\s*WHILE|ENDDO|FOR|ENDFOR|NEXT|IF|ELSE|ENDIF|PRINTJOB|'
+             r'ENDPRINTJOB|SCAN|ENDSCAN|TEXT|ENDTEXT|=)',
+                Keyword.Reserved, '#pop'),
+            (r'#\s*(IF|ELIF|ELSE|ENDIF|DEFINE|IFDEF|IFNDEF|INCLUDE)',
+                Comment.Preproc, '#pop'),
+            (r'(m\.)?[a-z_]\w*', Name.Variable, '#pop'),
+            (r'.', Text, '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/esoteric.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/esoteric.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/esoteric.py	(revision 1126)
@@ -0,0 +1,277 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.esoteric
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for esoteric languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['BrainfuckLexer', 'BefungeLexer', 'RedcodeLexer', 'CAmkESLexer',
+           'CapDLLexer', 'AheuiLexer']
+
+
+class BrainfuckLexer(RegexLexer):
+    """
+    Lexer for the esoteric `BrainFuck <http://www.muppetlabs.com/~breadbox/bf/>`_
+    language.
+    """
+
+    name = 'Brainfuck'
+    aliases = ['brainfuck', 'bf']
+    filenames = ['*.bf', '*.b']
+    mimetypes = ['application/x-brainfuck']
+
+    tokens = {
+        'common': [
+            # use different colors for different instruction types
+            (r'[.,]+', Name.Tag),
+            (r'[+-]+', Name.Builtin),
+            (r'[<>]+', Name.Variable),
+            (r'[^.,+\-<>\[\]]+', Comment),
+        ],
+        'root': [
+            (r'\[', Keyword, 'loop'),
+            (r'\]', Error),
+            include('common'),
+        ],
+        'loop': [
+            (r'\[', Keyword, '#push'),
+            (r'\]', Keyword, '#pop'),
+            include('common'),
+        ]
+    }
+
+
+class BefungeLexer(RegexLexer):
+    """
+    Lexer for the esoteric `Befunge <http://en.wikipedia.org/wiki/Befunge>`_
+    language.
+
+    .. versionadded:: 0.7
+    """
+    name = 'Befunge'
+    aliases = ['befunge']
+    filenames = ['*.befunge']
+    mimetypes = ['application/x-befunge']
+
+    tokens = {
+        'root': [
+            (r'[0-9a-f]', Number),
+            (r'[+*/%!`-]', Operator),             # Traditional math
+            (r'[<>^v?\[\]rxjk]', Name.Variable),  # Move, imperatives
+            (r'[:\\$.,n]', Name.Builtin),         # Stack ops, imperatives
+            (r'[|_mw]', Keyword),
+            (r'[{}]', Name.Tag),                  # Befunge-98 stack ops
+            (r'".*?"', String.Double),            # Strings don't appear to allow escapes
+            (r'\'.', String.Single),              # Single character
+            (r'[#;]', Comment),                   # Trampoline... depends on direction hit
+            (r'[pg&~=@iotsy]', Keyword),          # Misc
+            (r'[()A-Z]', Comment),                # Fingerprints
+            (r'\s+', Text),                       # Whitespace doesn't matter
+        ],
+    }
+
+
+class CAmkESLexer(RegexLexer):
+    """
+    Basic lexer for the input language for the
+    `CAmkES <https://sel4.systems/CAmkES/>`_ component platform.
+
+    .. versionadded:: 2.1
+    """
+    name = 'CAmkES'
+    aliases = ['camkes', 'idl4']
+    filenames = ['*.camkes', '*.idl4']
+
+    tokens = {
+        'root': [
+            # C pre-processor directive
+            (r'^\s*#.*\n', Comment.Preproc),
+
+            # Whitespace, comments
+            (r'\s+', Text),
+            (r'/\*(.|\n)*?\*/', Comment),
+            (r'//.*\n', Comment),
+
+            (r'[\[(){},.;\]]', Punctuation),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+
+            (words(('assembly', 'attribute', 'component', 'composition',
+                    'configuration', 'connection', 'connector', 'consumes',
+                    'control', 'dataport', 'Dataport', 'Dataports', 'emits',
+                    'event', 'Event', 'Events', 'export', 'from', 'group',
+                    'hardware', 'has', 'interface', 'Interface', 'maybe',
+                    'procedure', 'Procedure', 'Procedures', 'provides',
+                    'template', 'thread', 'threads', 'to', 'uses', 'with'),
+                   suffix=r'\b'), Keyword),
+
+            (words(('bool', 'boolean', 'Buf', 'char', 'character', 'double',
+                    'float', 'in', 'inout', 'int', 'int16_6', 'int32_t',
+                    'int64_t', 'int8_t', 'integer', 'mutex', 'out', 'real',
+                    'refin', 'semaphore', 'signed', 'string', 'struct',
+                    'uint16_t', 'uint32_t', 'uint64_t', 'uint8_t', 'uintptr_t',
+                    'unsigned', 'void'),
+                   suffix=r'\b'), Keyword.Type),
+
+            # Recognised attributes
+            (r'[a-zA-Z_]\w*_(priority|domain|buffer)', Keyword.Reserved),
+            (words(('dma_pool', 'from_access', 'to_access'), suffix=r'\b'),
+                Keyword.Reserved),
+
+            # CAmkES-level include
+            (r'import\s+(<[^>]*>|"[^"]*");', Comment.Preproc),
+
+            # C-level include
+            (r'include\s+(<[^>]*>|"[^"]*");', Comment.Preproc),
+
+            # Literals
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'-?[\d]+', Number),
+            (r'-?[\d]+\.[\d]+', Number.Float),
+            (r'"[^"]*"', String),
+            (r'[Tt]rue|[Ff]alse', Name.Builtin),
+
+            # Identifiers
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+    }
+
+
+class CapDLLexer(RegexLexer):
+    """
+    Basic lexer for
+    `CapDL <https://ssrg.nicta.com.au/publications/nictaabstracts/Kuz_KLW_10.abstract.pml>`_.
+
+    The source of the primary tool that reads such specifications is available
+    at https://github.com/seL4/capdl/tree/master/capDL-tool. Note that this
+    lexer only supports a subset of the grammar. For example, identifiers can
+    shadow type names, but these instances are currently incorrectly
+    highlighted as types. Supporting this would need a stateful lexer that is
+    considered unnecessarily complex for now.
+
+    .. versionadded:: 2.2
+    """
+    name = 'CapDL'
+    aliases = ['capdl']
+    filenames = ['*.cdl']
+
+    tokens = {
+        'root': [
+            # C pre-processor directive
+            (r'^\s*#.*\n', Comment.Preproc),
+
+            # Whitespace, comments
+            (r'\s+', Text),
+            (r'/\*(.|\n)*?\*/', Comment),
+            (r'(//|--).*\n', Comment),
+
+            (r'[<>\[(){},:;=\]]', Punctuation),
+            (r'\.\.', Punctuation),
+
+            (words(('arch', 'arm11', 'caps', 'child_of', 'ia32', 'irq', 'maps',
+                    'objects'), suffix=r'\b'), Keyword),
+
+            (words(('aep', 'asid_pool', 'cnode', 'ep', 'frame', 'io_device',
+                    'io_ports', 'io_pt', 'notification', 'pd', 'pt', 'tcb',
+                    'ut', 'vcpu'), suffix=r'\b'), Keyword.Type),
+
+            # Properties
+            (words(('asid', 'addr', 'badge', 'cached', 'dom', 'domainID', 'elf',
+                    'fault_ep', 'G', 'guard', 'guard_size', 'init', 'ip',
+                    'prio', 'sp', 'R', 'RG', 'RX', 'RW', 'RWG', 'RWX', 'W',
+                    'WG', 'WX', 'level', 'masked', 'master_reply', 'paddr',
+                    'ports', 'reply', 'uncached'), suffix=r'\b'),
+             Keyword.Reserved),
+
+            # Literals
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+(\.\d+)?(k|M)?', Number),
+            (words(('bits',), suffix=r'\b'), Number),
+            (words(('cspace', 'vspace', 'reply_slot', 'caller_slot',
+                    'ipc_buffer_slot'), suffix=r'\b'), Number),
+
+            # Identifiers
+            (r'[a-zA-Z_][-@\.\w]*', Name),
+        ],
+    }
+
+
+class RedcodeLexer(RegexLexer):
+    """
+    A simple Redcode lexer based on ICWS'94.
+    Contributed by Adam Blinkinsop <blinks@acm.org>.
+
+    .. versionadded:: 0.8
+    """
+    name = 'Redcode'
+    aliases = ['redcode']
+    filenames = ['*.cw']
+
+    opcodes = ('DAT', 'MOV', 'ADD', 'SUB', 'MUL', 'DIV', 'MOD',
+               'JMP', 'JMZ', 'JMN', 'DJN', 'CMP', 'SLT', 'SPL',
+               'ORG', 'EQU', 'END')
+    modifiers = ('A', 'B', 'AB', 'BA', 'F', 'X', 'I')
+
+    tokens = {
+        'root': [
+            # Whitespace:
+            (r'\s+', Text),
+            (r';.*$', Comment.Single),
+            # Lexemes:
+            #  Identifiers
+            (r'\b(%s)\b' % '|'.join(opcodes), Name.Function),
+            (r'\b(%s)\b' % '|'.join(modifiers), Name.Decorator),
+            (r'[A-Za-z_]\w+', Name),
+            #  Operators
+            (r'[-+*/%]', Operator),
+            (r'[#$@<>]', Operator),  # mode
+            (r'[.,]', Punctuation),  # mode
+            #  Numbers
+            (r'[-+]?\d+', Number.Integer),
+        ],
+    }
+
+
+class AheuiLexer(RegexLexer):
+    """
+    Aheui_ Lexer.
+
+    Aheui_ is esoteric language based on Korean alphabets.
+
+    .. _Aheui:: http://aheui.github.io/
+
+    """
+
+    name = 'Aheui'
+    aliases = ['aheui']
+    filenames = ['*.aheui']
+
+    tokens = {
+        'root': [
+            (u'['
+             u'나-낳냐-냫너-넣녀-녛노-놓뇨-눟뉴-닇'
+             u'다-닿댜-댷더-덯뎌-뎧도-돟됴-둫듀-딓'
+             u'따-땋땨-떃떠-떻뗘-뗳또-똫뚀-뚷뜌-띟'
+             u'라-랗랴-럏러-렇려-렿로-롷료-뤃류-릫'
+             u'마-맣먀-먛머-멓며-몋모-뫃묘-뭏뮤-믷'
+             u'바-밯뱌-뱧버-벟벼-볗보-봏뵤-붛뷰-빃'
+             u'빠-빻뺘-뺳뻐-뻫뼈-뼣뽀-뽛뾰-뿧쀼-삏'
+             u'사-샇샤-샿서-섷셔-셯소-솧쇼-숳슈-싛'
+             u'싸-쌓쌰-썋써-쎃쎠-쎻쏘-쏳쑈-쑿쓔-씧'
+             u'자-잫쟈-쟣저-젛져-졓조-좋죠-줗쥬-즿'
+             u'차-챃챠-챻처-첳쳐-쳫초-촣쵸-춯츄-칗'
+             u'카-캏캬-컇커-컿켜-켷코-콯쿄-쿻큐-킣'
+             u'타-탛탸-턓터-텋텨-톃토-톻툐-퉇튜-틯'
+             u'파-팧퍄-퍟퍼-펗펴-폏포-퐇표-풓퓨-픻'
+             u'하-핳햐-햫허-헣혀-혛호-홓효-훟휴-힇'
+             u']', Operator),
+            ('.', Comment),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/factor.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/factor.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/factor.py	(revision 1126)
@@ -0,0 +1,344 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.factor
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Factor language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default, words
+from pygments.token import Text, Comment, Keyword, Name, String, Number
+
+__all__ = ['FactorLexer']
+
+
+class FactorLexer(RegexLexer):
+    """
+    Lexer for the `Factor <http://factorcode.org>`_ language.
+
+    .. versionadded:: 1.4
+    """
+    name = 'Factor'
+    aliases = ['factor']
+    filenames = ['*.factor']
+    mimetypes = ['text/x-factor']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    builtin_kernel = words((
+        '-rot', '2bi', '2bi@', '2bi*', '2curry', '2dip', '2drop', '2dup', '2keep', '2nip',
+        '2over', '2tri', '2tri@', '2tri*', '3bi', '3curry', '3dip', '3drop', '3dup', '3keep',
+        '3tri', '4dip', '4drop', '4dup', '4keep', '<wrapper>', '=', '>boolean', 'clone',
+        '?', '?execute', '?if', 'and', 'assert', 'assert=', 'assert?', 'bi', 'bi-curry',
+        'bi-curry@', 'bi-curry*', 'bi@', 'bi*', 'boa', 'boolean', 'boolean?', 'both?',
+        'build', 'call', 'callstack', 'callstack>array', 'callstack?', 'clear', '(clone)',
+        'compose', 'compose?', 'curry', 'curry?', 'datastack', 'die', 'dip', 'do', 'drop',
+        'dup', 'dupd', 'either?', 'eq?', 'equal?', 'execute', 'hashcode', 'hashcode*',
+        'identity-hashcode', 'identity-tuple', 'identity-tuple?', 'if', 'if*',
+        'keep', 'loop', 'most', 'new', 'nip', 'not', 'null', 'object', 'or', 'over',
+        'pick', 'prepose', 'retainstack', 'rot', 'same?', 'swap', 'swapd', 'throw',
+        'tri', 'tri-curry', 'tri-curry@', 'tri-curry*', 'tri@', 'tri*', 'tuple',
+        'tuple?', 'unless', 'unless*', 'until', 'when', 'when*', 'while', 'with',
+        'wrapper', 'wrapper?', 'xor'), suffix=r'\s')
+
+    builtin_assocs = words((
+        '2cache', '<enum>', '>alist', '?at', '?of', 'assoc', 'assoc-all?',
+        'assoc-any?', 'assoc-clone-like', 'assoc-combine', 'assoc-diff',
+        'assoc-diff!', 'assoc-differ', 'assoc-each', 'assoc-empty?',
+        'assoc-filter', 'assoc-filter!', 'assoc-filter-as', 'assoc-find',
+        'assoc-hashcode', 'assoc-intersect', 'assoc-like', 'assoc-map',
+        'assoc-map-as', 'assoc-partition', 'assoc-refine', 'assoc-size',
+        'assoc-stack', 'assoc-subset?', 'assoc-union', 'assoc-union!',
+        'assoc=', 'assoc>map', 'assoc?', 'at', 'at+', 'at*', 'cache', 'change-at',
+        'clear-assoc', 'delete-at', 'delete-at*', 'enum', 'enum?', 'extract-keys',
+        'inc-at', 'key?', 'keys', 'map>assoc', 'maybe-set-at', 'new-assoc', 'of',
+        'push-at', 'rename-at', 'set-at', 'sift-keys', 'sift-values', 'substitute',
+        'unzip', 'value-at', 'value-at*', 'value?', 'values', 'zip'), suffix=r'\s')
+
+    builtin_combinators = words((
+        '2cleave', '2cleave>quot', '3cleave', '3cleave>quot', '4cleave',
+        '4cleave>quot', 'alist>quot', 'call-effect', 'case', 'case-find',
+        'case>quot', 'cleave', 'cleave>quot', 'cond', 'cond>quot', 'deep-spread>quot',
+        'execute-effect', 'linear-case-quot', 'no-case', 'no-case?', 'no-cond',
+        'no-cond?', 'recursive-hashcode', 'shallow-spread>quot', 'spread',
+        'to-fixed-point', 'wrong-values', 'wrong-values?'), suffix=r'\s')
+
+    builtin_math = words((
+        '-', '/', '/f', '/i', '/mod', '2/', '2^', '<', '<=', '<fp-nan>', '>',
+        '>=', '>bignum', '>fixnum', '>float', '>integer', '(all-integers?)',
+        '(each-integer)', '(find-integer)', '*', '+', '?1+',
+        'abs', 'align', 'all-integers?', 'bignum', 'bignum?', 'bit?', 'bitand',
+        'bitnot', 'bitor', 'bits>double', 'bits>float', 'bitxor', 'complex',
+        'complex?', 'denominator', 'double>bits', 'each-integer', 'even?',
+        'find-integer', 'find-last-integer', 'fixnum', 'fixnum?', 'float',
+        'float>bits', 'float?', 'fp-bitwise=', 'fp-infinity?', 'fp-nan-payload',
+        'fp-nan?', 'fp-qnan?', 'fp-sign', 'fp-snan?', 'fp-special?',
+        'if-zero', 'imaginary-part', 'integer', 'integer>fixnum',
+        'integer>fixnum-strict', 'integer?', 'log2', 'log2-expects-positive',
+        'log2-expects-positive?', 'mod', 'neg', 'neg?', 'next-float',
+        'next-power-of-2', 'number', 'number=', 'number?', 'numerator', 'odd?',
+        'out-of-fixnum-range', 'out-of-fixnum-range?', 'power-of-2?',
+        'prev-float', 'ratio', 'ratio?', 'rational', 'rational?', 'real',
+        'real-part', 'real?', 'recip', 'rem', 'sgn', 'shift', 'sq', 'times',
+        'u<', 'u<=', 'u>', 'u>=', 'unless-zero', 'unordered?', 'when-zero',
+        'zero?'), suffix=r'\s')
+
+    builtin_sequences = words((
+        '1sequence', '2all?', '2each', '2map', '2map-as', '2map-reduce', '2reduce',
+        '2selector', '2sequence', '3append', '3append-as', '3each', '3map', '3map-as',
+        '3sequence', '4sequence', '<repetition>', '<reversed>', '<slice>', '?first',
+        '?last', '?nth', '?second', '?set-nth', 'accumulate', 'accumulate!',
+        'accumulate-as', 'all?', 'any?', 'append', 'append!', 'append-as',
+        'assert-sequence', 'assert-sequence=', 'assert-sequence?',
+        'binary-reduce', 'bounds-check', 'bounds-check?', 'bounds-error',
+        'bounds-error?', 'but-last', 'but-last-slice', 'cartesian-each',
+        'cartesian-map', 'cartesian-product', 'change-nth', 'check-slice',
+        'check-slice-error', 'clone-like', 'collapse-slice', 'collector',
+        'collector-for', 'concat', 'concat-as', 'copy', 'count', 'cut', 'cut-slice',
+        'cut*', 'delete-all', 'delete-slice', 'drop-prefix', 'each', 'each-from',
+        'each-index', 'empty?', 'exchange', 'filter', 'filter!', 'filter-as', 'find',
+        'find-from', 'find-index', 'find-index-from', 'find-last', 'find-last-from',
+        'first', 'first2', 'first3', 'first4', 'flip', 'follow', 'fourth', 'glue', 'halves',
+        'harvest', 'head', 'head-slice', 'head-slice*', 'head*', 'head?',
+        'if-empty', 'immutable', 'immutable-sequence', 'immutable-sequence?',
+        'immutable?', 'index', 'index-from', 'indices', 'infimum', 'infimum-by',
+        'insert-nth', 'interleave', 'iota', 'iota-tuple', 'iota-tuple?', 'join',
+        'join-as', 'last', 'last-index', 'last-index-from', 'length', 'lengthen',
+        'like', 'longer', 'longer?', 'longest', 'map', 'map!', 'map-as', 'map-find',
+        'map-find-last', 'map-index', 'map-integers', 'map-reduce', 'map-sum',
+        'max-length', 'member-eq?', 'member?', 'midpoint@', 'min-length',
+        'mismatch', 'move', 'new-like', 'new-resizable', 'new-sequence',
+        'non-negative-integer-expected', 'non-negative-integer-expected?',
+        'nth', 'nths', 'pad-head', 'pad-tail', 'padding', 'partition', 'pop', 'pop*',
+        'prefix', 'prepend', 'prepend-as', 'produce', 'produce-as', 'product', 'push',
+        'push-all', 'push-either', 'push-if', 'reduce', 'reduce-index', 'remove',
+        'remove!', 'remove-eq', 'remove-eq!', 'remove-nth', 'remove-nth!', 'repetition',
+        'repetition?', 'replace-slice', 'replicate', 'replicate-as', 'rest',
+        'rest-slice', 'reverse', 'reverse!', 'reversed', 'reversed?', 'second',
+        'selector', 'selector-for', 'sequence', 'sequence-hashcode', 'sequence=',
+        'sequence?', 'set-first', 'set-fourth', 'set-last', 'set-length', 'set-nth',
+        'set-second', 'set-third', 'short', 'shorten', 'shorter', 'shorter?',
+        'shortest', 'sift', 'slice', 'slice-error', 'slice-error?', 'slice?',
+        'snip', 'snip-slice', 'start', 'start*', 'subseq', 'subseq?', 'suffix',
+        'suffix!', 'sum', 'sum-lengths', 'supremum', 'supremum-by', 'surround', 'tail',
+        'tail-slice', 'tail-slice*', 'tail*', 'tail?', 'third', 'trim',
+        'trim-head', 'trim-head-slice', 'trim-slice', 'trim-tail', 'trim-tail-slice',
+        'unclip', 'unclip-last', 'unclip-last-slice', 'unclip-slice', 'unless-empty',
+        'virtual-exemplar', 'virtual-sequence', 'virtual-sequence?', 'virtual@',
+        'when-empty'), suffix=r'\s')
+
+    builtin_namespaces = words((
+        '+@', 'change', 'change-global', 'counter', 'dec', 'get', 'get-global',
+        'global', 'inc', 'init-namespaces', 'initialize', 'is-global', 'make-assoc',
+        'namespace', 'namestack', 'off', 'on', 'set', 'set-global', 'set-namestack',
+        'toggle', 'with-global', 'with-scope', 'with-variable', 'with-variables'),
+        suffix=r'\s')
+
+    builtin_arrays = words((
+        '1array', '2array', '3array', '4array', '<array>', '>array', 'array',
+        'array?', 'pair', 'pair?', 'resize-array'), suffix=r'\s')
+
+    builtin_io = words((
+        '(each-stream-block-slice)', '(each-stream-block)',
+        '(stream-contents-by-block)', '(stream-contents-by-element)',
+        '(stream-contents-by-length-or-block)',
+        '(stream-contents-by-length)', '+byte+', '+character+',
+        'bad-seek-type', 'bad-seek-type?', 'bl', 'contents', 'each-block',
+        'each-block-size', 'each-block-slice', 'each-line', 'each-morsel',
+        'each-stream-block', 'each-stream-block-slice', 'each-stream-line',
+        'error-stream', 'flush', 'input-stream', 'input-stream?',
+        'invalid-read-buffer', 'invalid-read-buffer?', 'lines', 'nl',
+        'output-stream', 'output-stream?', 'print', 'read', 'read-into',
+        'read-partial', 'read-partial-into', 'read-until', 'read1', 'readln',
+        'seek-absolute', 'seek-absolute?', 'seek-end', 'seek-end?',
+        'seek-input', 'seek-output', 'seek-relative', 'seek-relative?',
+        'stream-bl', 'stream-contents', 'stream-contents*', 'stream-copy',
+        'stream-copy*', 'stream-element-type', 'stream-flush',
+        'stream-length', 'stream-lines', 'stream-nl', 'stream-print',
+        'stream-read', 'stream-read-into', 'stream-read-partial',
+        'stream-read-partial-into', 'stream-read-partial-unsafe',
+        'stream-read-unsafe', 'stream-read-until', 'stream-read1',
+        'stream-readln', 'stream-seek', 'stream-seekable?', 'stream-tell',
+        'stream-write', 'stream-write1', 'tell-input', 'tell-output',
+        'with-error-stream', 'with-error-stream*', 'with-error>output',
+        'with-input-output+error-streams',
+        'with-input-output+error-streams*', 'with-input-stream',
+        'with-input-stream*', 'with-output-stream', 'with-output-stream*',
+        'with-output>error', 'with-output+error-stream',
+        'with-output+error-stream*', 'with-streams', 'with-streams*',
+        'write', 'write1'), suffix=r'\s')
+
+    builtin_strings = words((
+        '1string', '<string>', '>string', 'resize-string', 'string',
+        'string?'), suffix=r'\s')
+
+    builtin_vectors = words((
+        '1vector', '<vector>', '>vector', '?push', 'vector', 'vector?'),
+        suffix=r'\s')
+
+    builtin_continuations = words((
+        '<condition>', '<continuation>', '<restart>', 'attempt-all',
+        'attempt-all-error', 'attempt-all-error?', 'callback-error-hook',
+        'callcc0', 'callcc1', 'cleanup', 'compute-restarts', 'condition',
+        'condition?', 'continuation', 'continuation?', 'continue',
+        'continue-restart', 'continue-with', 'current-continuation',
+        'error', 'error-continuation', 'error-in-thread', 'error-thread',
+        'ifcc', 'ignore-errors', 'in-callback?', 'original-error', 'recover',
+        'restart', 'restart?', 'restarts', 'rethrow', 'rethrow-restarts',
+        'return', 'return-continuation', 'thread-error-hook', 'throw-continue',
+        'throw-restarts', 'with-datastack', 'with-return'), suffix=r'\s')
+
+    tokens = {
+        'root': [
+            # factor allows a file to start with a shebang
+            (r'#!.*$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            (r'\s+', Text),
+
+            # defining words
+            (r'((?:MACRO|MEMO|TYPED)?:[:]?)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'(M:[:]?)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Class, Text, Name.Function)),
+            (r'(C:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Function, Text, Name.Class)),
+            (r'(GENERIC:)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'(HOOK:|GENERIC#)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Function, Text, Name.Function)),
+            (r'\(\s', Name.Function, 'stackeffect'),
+            (r';\s', Keyword),
+
+            # imports and namespaces
+            (r'(USING:)(\s+)',
+             bygroups(Keyword.Namespace, Text), 'vocabs'),
+            (r'(USE:|UNUSE:|IN:|QUALIFIED:)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Text, Name.Namespace)),
+            (r'(QUALIFIED-WITH:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Text, Name.Namespace, Text, Name.Namespace)),
+            (r'(FROM:|EXCLUDE:)(\s+)(\S+)(\s+=>\s)',
+             bygroups(Keyword.Namespace, Text, Name.Namespace, Text), 'words'),
+            (r'(RENAME:)(\s+)(\S+)(\s+)(\S+)(\s+=>\s+)(\S+)',
+             bygroups(Keyword.Namespace, Text, Name.Function, Text, Name.Namespace, Text, Name.Function)),
+            (r'(ALIAS:|TYPEDEF:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Text, Name.Function, Text, Name.Function)),
+            (r'(DEFER:|FORGET:|POSTPONE:)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Text, Name.Function)),
+
+            # tuples and classes
+            (r'(TUPLE:|ERROR:)(\s+)(\S+)(\s+<\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Class, Text, Name.Class), 'slots'),
+            (r'(TUPLE:|ERROR:|BUILTIN:)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Class), 'slots'),
+            (r'(MIXIN:|UNION:|INTERSECTION:)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Class)),
+            (r'(PREDICATE:)(\s+)(\S+)(\s+<\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Class, Text, Name.Class)),
+            (r'(C:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Function, Text, Name.Class)),
+            (r'(INSTANCE:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Class, Text, Name.Class)),
+            (r'(SLOT:)(\s+)(\S+)', bygroups(Keyword, Text, Name.Function)),
+            (r'(SINGLETON:)(\s+)(\S+)', bygroups(Keyword, Text, Name.Class)),
+            (r'SINGLETONS:', Keyword, 'classes'),
+
+            # other syntax
+            (r'(CONSTANT:|SYMBOL:|MAIN:|HELP:)(\s+)(\S+)',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'SYMBOLS:\s', Keyword, 'words'),
+            (r'SYNTAX:\s', Keyword),
+            (r'ALIEN:\s', Keyword),
+            (r'(STRUCT:)(\s+)(\S+)', bygroups(Keyword, Text, Name.Class)),
+            (r'(FUNCTION:)(\s+\S+\s+)(\S+)(\s+\(\s+[^)]+\)\s)',
+             bygroups(Keyword.Namespace, Text, Name.Function, Text)),
+            (r'(FUNCTION-ALIAS:)(\s+)(\S+)(\s+\S+\s+)(\S+)(\s+\(\s+[^)]+\)\s)',
+             bygroups(Keyword.Namespace, Text, Name.Function, Text, Name.Function, Text)),
+
+            # vocab.private
+            (r'(?:<PRIVATE|PRIVATE>)\s', Keyword.Namespace),
+
+            # strings
+            (r'"""\s+(?:.|\n)*?\s+"""', String),
+            (r'"(?:\\\\|\\"|[^"])*"', String),
+            (r'\S+"\s+(?:\\\\|\\"|[^"])*"', String),
+            (r'CHAR:\s+(?:\\[\\abfnrstv]|[^\\]\S*)\s', String.Char),
+
+            # comments
+            (r'!\s+.*$', Comment),
+            (r'#!\s+.*$', Comment),
+            (r'/\*\s+(?:.|\n)*?\s\*/\s', Comment),
+
+            # boolean constants
+            (r'[tf]\s', Name.Constant),
+
+            # symbols and literals
+            (r'[\\$]\s+\S+', Name.Constant),
+            (r'M\\\s+\S+\s+\S+', Name.Constant),
+
+            # numbers
+            (r'[+-]?(?:[\d,]*\d)?\.(?:\d([\d,]*\d)?)?(?:[eE][+-]?\d+)?\s', Number),
+            (r'[+-]?\d(?:[\d,]*\d)?(?:[eE][+-]?\d+)?\s', Number),
+            (r'0x[a-fA-F\d](?:[a-fA-F\d,]*[a-fA-F\d])?(?:p\d([\d,]*\d)?)?\s', Number),
+            (r'NAN:\s+[a-fA-F\d](?:[a-fA-F\d,]*[a-fA-F\d])?(?:p\d([\d,]*\d)?)?\s', Number),
+            (r'0b[01]+\s', Number.Bin),
+            (r'0o[0-7]+\s', Number.Oct),
+            (r'(?:\d([\d,]*\d)?)?\+\d(?:[\d,]*\d)?/\d(?:[\d,]*\d)?\s', Number),
+            (r'(?:\-\d([\d,]*\d)?)?\-\d(?:[\d,]*\d)?/\d(?:[\d,]*\d)?\s', Number),
+
+            # keywords
+            (r'(?:deprecated|final|foldable|flushable|inline|recursive)\s',
+             Keyword),
+
+            # builtins
+            (builtin_kernel, Name.Builtin),
+            (builtin_assocs, Name.Builtin),
+            (builtin_combinators, Name.Builtin),
+            (builtin_math, Name.Builtin),
+            (builtin_sequences, Name.Builtin),
+            (builtin_namespaces, Name.Builtin),
+            (builtin_arrays, Name.Builtin),
+            (builtin_io, Name.Builtin),
+            (builtin_strings, Name.Builtin),
+            (builtin_vectors, Name.Builtin),
+            (builtin_continuations, Name.Builtin),
+
+            # everything else is text
+            (r'\S+', Text),
+        ],
+        'stackeffect': [
+            (r'\s+', Text),
+            (r'\(\s+', Name.Function, 'stackeffect'),
+            (r'\)\s', Name.Function, '#pop'),
+            (r'--\s', Name.Function),
+            (r'\S+', Name.Variable),
+        ],
+        'slots': [
+            (r'\s+', Text),
+            (r';\s', Keyword, '#pop'),
+            (r'(\{\s+)(\S+)(\s+[^}]+\s+\}\s)',
+             bygroups(Text, Name.Variable, Text)),
+            (r'\S+', Name.Variable),
+        ],
+        'vocabs': [
+            (r'\s+', Text),
+            (r';\s', Keyword, '#pop'),
+            (r'\S+', Name.Namespace),
+        ],
+        'classes': [
+            (r'\s+', Text),
+            (r';\s', Keyword, '#pop'),
+            (r'\S+', Name.Class),
+        ],
+        'words': [
+            (r'\s+', Text),
+            (r';\s', Keyword, '#pop'),
+            (r'\S+', Name.Function),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/parsers.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/parsers.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/parsers.py	(revision 1126)
@@ -0,0 +1,835 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.parsers
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for parser generators.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, DelegatingLexer, \
+    include, bygroups, using
+from pygments.token import Punctuation, Other, Text, Comment, Operator, \
+    Keyword, Name, String, Number, Whitespace
+from pygments.lexers.jvm import JavaLexer
+from pygments.lexers.c_cpp import CLexer, CppLexer
+from pygments.lexers.objective import ObjectiveCLexer
+from pygments.lexers.d import DLexer
+from pygments.lexers.dotnet import CSharpLexer
+from pygments.lexers.ruby import RubyLexer
+from pygments.lexers.python import PythonLexer
+from pygments.lexers.perl import PerlLexer
+
+__all__ = ['RagelLexer', 'RagelEmbeddedLexer', 'RagelCLexer', 'RagelDLexer',
+           'RagelCppLexer', 'RagelObjectiveCLexer', 'RagelRubyLexer',
+           'RagelJavaLexer', 'AntlrLexer', 'AntlrPythonLexer',
+           'AntlrPerlLexer', 'AntlrRubyLexer', 'AntlrCppLexer',
+           # 'AntlrCLexer',
+           'AntlrCSharpLexer', 'AntlrObjectiveCLexer',
+           'AntlrJavaLexer', 'AntlrActionScriptLexer',
+           'TreetopLexer', 'EbnfLexer']
+
+
+class RagelLexer(RegexLexer):
+    """
+    A pure `Ragel <http://www.complang.org/ragel/>`_ lexer.  Use this for
+    fragments of Ragel.  For ``.rl`` files, use RagelEmbeddedLexer instead
+    (or one of the language-specific subclasses).
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Ragel'
+    aliases = ['ragel']
+    filenames = []
+
+    tokens = {
+        'whitespace': [
+            (r'\s+', Whitespace)
+        ],
+        'comments': [
+            (r'\#.*$', Comment),
+        ],
+        'keywords': [
+            (r'(access|action|alphtype)\b', Keyword),
+            (r'(getkey|write|machine|include)\b', Keyword),
+            (r'(any|ascii|extend|alpha|digit|alnum|lower|upper)\b', Keyword),
+            (r'(xdigit|cntrl|graph|print|punct|space|zlen|empty)\b', Keyword)
+        ],
+        'numbers': [
+            (r'0x[0-9A-Fa-f]+', Number.Hex),
+            (r'[+-]?[0-9]+', Number.Integer),
+        ],
+        'literals': [
+            (r'"(\\\\|\\"|[^"])*"', String),              # double quote string
+            (r"'(\\\\|\\'|[^'])*'", String),              # single quote string
+            (r'\[(\\\\|\\\]|[^\]])*\]', String),          # square bracket literals
+            (r'/(?!\*)(\\\\|\\/|[^/])*/', String.Regex),  # regular expressions
+        ],
+        'identifiers': [
+            (r'[a-zA-Z_]\w*', Name.Variable),
+        ],
+        'operators': [
+            (r',', Operator),                           # Join
+            (r'\||&|--?', Operator),                    # Union, Intersection and Subtraction
+            (r'\.|<:|:>>?', Operator),                  # Concatention
+            (r':', Operator),                           # Label
+            (r'->', Operator),                          # Epsilon Transition
+            (r'(>|\$|%|<|@|<>)(/|eof\b)', Operator),    # EOF Actions
+            (r'(>|\$|%|<|@|<>)(!|err\b)', Operator),    # Global Error Actions
+            (r'(>|\$|%|<|@|<>)(\^|lerr\b)', Operator),  # Local Error Actions
+            (r'(>|\$|%|<|@|<>)(~|to\b)', Operator),     # To-State Actions
+            (r'(>|\$|%|<|@|<>)(\*|from\b)', Operator),  # From-State Actions
+            (r'>|@|\$|%', Operator),                    # Transition Actions and Priorities
+            (r'\*|\?|\+|\{[0-9]*,[0-9]*\}', Operator),  # Repetition
+            (r'!|\^', Operator),                        # Negation
+            (r'\(|\)', Operator),                       # Grouping
+        ],
+        'root': [
+            include('literals'),
+            include('whitespace'),
+            include('comments'),
+            include('keywords'),
+            include('numbers'),
+            include('identifiers'),
+            include('operators'),
+            (r'\{', Punctuation, 'host'),
+            (r'=', Operator),
+            (r';', Punctuation),
+        ],
+        'host': [
+            (r'(' + r'|'.join((  # keep host code in largest possible chunks
+                r'[^{}\'"/#]+',  # exclude unsafe characters
+                r'[^\\]\\[{}]',  # allow escaped { or }
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\"|[^"])*"',  # double quote string
+                r"'(\\\\|\\'|[^'])*'",  # single quote string
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+                r'\#.*$\n?',            # ruby comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\/|[^/])*/',
+
+                # / is safe now that we've handled regex and javadoc comments
+                r'/',
+            )) + r')+', Other),
+
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+    }
+
+
+class RagelEmbeddedLexer(RegexLexer):
+    """
+    A lexer for `Ragel`_ embedded in a host language file.
+
+    This will only highlight Ragel statements. If you want host language
+    highlighting then call the language-specific Ragel lexer.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Embedded Ragel'
+    aliases = ['ragel-em']
+    filenames = ['*.rl']
+
+    tokens = {
+        'root': [
+            (r'(' + r'|'.join((   # keep host code in largest possible chunks
+                r'[^%\'"/#]+',    # exclude unsafe characters
+                r'%(?=[^%]|$)',   # a single % sign is okay, just not 2 of them
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\"|[^"])*"',  # double quote string
+                r"'(\\\\|\\'|[^'])*'",  # single quote string
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+                r'//.*$\n?',  # single line comment
+                r'\#.*$\n?',  # ruby/ragel comment
+                r'/(?!\*)(\\\\|\\/|[^/])*/',  # regular expression
+
+                # / is safe now that we've handled regex and javadoc comments
+                r'/',
+            )) + r')+', Other),
+
+            # Single Line FSM.
+            # Please don't put a quoted newline in a single line FSM.
+            # That's just mean. It will break this.
+            (r'(%%)(?![{%])(.*)($|;)(\n?)', bygroups(Punctuation,
+                                                     using(RagelLexer),
+                                                     Punctuation, Text)),
+
+            # Multi Line FSM.
+            (r'(%%%%|%%)\{', Punctuation, 'multi-line-fsm'),
+        ],
+        'multi-line-fsm': [
+            (r'(' + r'|'.join((  # keep ragel code in largest possible chunks.
+                r'(' + r'|'.join((
+                    r'[^}\'"\[/#]',   # exclude unsafe characters
+                    r'\}(?=[^%]|$)',   # } is okay as long as it's not followed by %
+                    r'\}%(?=[^%]|$)',  # ...well, one %'s okay, just not two...
+                    r'[^\\]\\[{}]',   # ...and } is okay if it's escaped
+
+                    # allow / if it's preceded with one of these symbols
+                    # (ragel EOF actions)
+                    r'(>|\$|%|<|@|<>)/',
+
+                    # specifically allow regex followed immediately by *
+                    # so it doesn't get mistaken for a comment
+                    r'/(?!\*)(\\\\|\\/|[^/])*/\*',
+
+                    # allow / as long as it's not followed by another / or by a *
+                    r'/(?=[^/*]|$)',
+
+                    # We want to match as many of these as we can in one block.
+                    # Not sure if we need the + sign here,
+                    # does it help performance?
+                )) + r')+',
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\"|[^"])*"',      # double quote string
+                r"'(\\\\|\\'|[^'])*'",      # single quote string
+                r"\[(\\\\|\\\]|[^\]])*\]",  # square bracket literal
+                r'/\*(.|\n)*?\*/',          # multi-line javadoc-style comment
+                r'//.*$\n?',                # single line comment
+                r'\#.*$\n?',                # ruby/ragel comment
+            )) + r')+', using(RagelLexer)),
+
+            (r'\}%%', Punctuation, '#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        return '@LANG: indep' in text
+
+
+class RagelRubyLexer(DelegatingLexer):
+    """
+    A lexer for `Ragel`_ in a Ruby host file.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Ragel in Ruby Host'
+    aliases = ['ragel-ruby', 'ragel-rb']
+    filenames = ['*.rl']
+
+    def __init__(self, **options):
+        super(RagelRubyLexer, self).__init__(RubyLexer, RagelEmbeddedLexer,
+                                             **options)
+
+    def analyse_text(text):
+        return '@LANG: ruby' in text
+
+
+class RagelCLexer(DelegatingLexer):
+    """
+    A lexer for `Ragel`_ in a C host file.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Ragel in C Host'
+    aliases = ['ragel-c']
+    filenames = ['*.rl']
+
+    def __init__(self, **options):
+        super(RagelCLexer, self).__init__(CLexer, RagelEmbeddedLexer,
+                                          **options)
+
+    def analyse_text(text):
+        return '@LANG: c' in text
+
+
+class RagelDLexer(DelegatingLexer):
+    """
+    A lexer for `Ragel`_ in a D host file.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Ragel in D Host'
+    aliases = ['ragel-d']
+    filenames = ['*.rl']
+
+    def __init__(self, **options):
+        super(RagelDLexer, self).__init__(DLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: d' in text
+
+
+class RagelCppLexer(DelegatingLexer):
+    """
+    A lexer for `Ragel`_ in a CPP host file.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Ragel in CPP Host'
+    aliases = ['ragel-cpp']
+    filenames = ['*.rl']
+
+    def __init__(self, **options):
+        super(RagelCppLexer, self).__init__(CppLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: c++' in text
+
+
+class RagelObjectiveCLexer(DelegatingLexer):
+    """
+    A lexer for `Ragel`_ in an Objective C host file.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Ragel in Objective C Host'
+    aliases = ['ragel-objc']
+    filenames = ['*.rl']
+
+    def __init__(self, **options):
+        super(RagelObjectiveCLexer, self).__init__(ObjectiveCLexer,
+                                                   RagelEmbeddedLexer,
+                                                   **options)
+
+    def analyse_text(text):
+        return '@LANG: objc' in text
+
+
+class RagelJavaLexer(DelegatingLexer):
+    """
+    A lexer for `Ragel`_ in a Java host file.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Ragel in Java Host'
+    aliases = ['ragel-java']
+    filenames = ['*.rl']
+
+    def __init__(self, **options):
+        super(RagelJavaLexer, self).__init__(JavaLexer, RagelEmbeddedLexer,
+                                             **options)
+
+    def analyse_text(text):
+        return '@LANG: java' in text
+
+
+class AntlrLexer(RegexLexer):
+    """
+    Generic `ANTLR`_ Lexer.
+    Should not be called directly, instead
+    use DelegatingLexer for your target language.
+
+    .. versionadded:: 1.1
+
+    .. _ANTLR: http://www.antlr.org/
+    """
+
+    name = 'ANTLR'
+    aliases = ['antlr']
+    filenames = []
+
+    _id = r'[A-Za-z]\w*'
+    _TOKEN_REF = r'[A-Z]\w*'
+    _RULE_REF = r'[a-z]\w*'
+    _STRING_LITERAL = r'\'(?:\\\\|\\\'|[^\']*)\''
+    _INT = r'[0-9]+'
+
+    tokens = {
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'comments': [
+            (r'//.*$', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+        ],
+        'root': [
+            include('whitespace'),
+            include('comments'),
+
+            (r'(lexer|parser|tree)?(\s*)(grammar\b)(\s*)(' + _id + ')(;)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Class,
+                      Punctuation)),
+            # optionsSpec
+            (r'options\b', Keyword, 'options'),
+            # tokensSpec
+            (r'tokens\b', Keyword, 'tokens'),
+            # attrScope
+            (r'(scope)(\s*)(' + _id + ')(\s*)(\{)',
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace,
+                      Punctuation), 'action'),
+            # exception
+            (r'(catch|finally)\b', Keyword, 'exception'),
+            # action
+            (r'(@' + _id + ')(\s*)(::)?(\s*)(' + _id + ')(\s*)(\{)',
+             bygroups(Name.Label, Whitespace, Punctuation, Whitespace,
+                      Name.Label, Whitespace, Punctuation), 'action'),
+            # rule
+            (r'((?:protected|private|public|fragment)\b)?(\s*)(' + _id + ')(!)?',
+             bygroups(Keyword, Whitespace, Name.Label, Punctuation),
+             ('rule-alts', 'rule-prelims')),
+        ],
+        'exception': [
+            (r'\n', Whitespace, '#pop'),
+            (r'\s', Whitespace),
+            include('comments'),
+
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+        ],
+        'rule-prelims': [
+            include('whitespace'),
+            include('comments'),
+
+            (r'returns\b', Keyword),
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+            # throwsSpec
+            (r'(throws)(\s+)(' + _id + ')',
+             bygroups(Keyword, Whitespace, Name.Label)),
+            (r'(,)(\s*)(' + _id + ')',
+             bygroups(Punctuation, Whitespace, Name.Label)),  # Additional throws
+            # optionsSpec
+            (r'options\b', Keyword, 'options'),
+            # ruleScopeSpec - scope followed by target language code or name of action
+            # TODO finish implementing other possibilities for scope
+            # L173 ANTLRv3.g from ANTLR book
+            (r'(scope)(\s+)(\{)', bygroups(Keyword, Whitespace, Punctuation),
+             'action'),
+            (r'(scope)(\s+)(' + _id + ')(\s*)(;)',
+             bygroups(Keyword, Whitespace, Name.Label, Whitespace, Punctuation)),
+            # ruleAction
+            (r'(@' + _id + ')(\s*)(\{)',
+             bygroups(Name.Label, Whitespace, Punctuation), 'action'),
+            # finished prelims, go to rule alts!
+            (r':', Punctuation, '#pop')
+        ],
+        'rule-alts': [
+            include('whitespace'),
+            include('comments'),
+
+            # These might need to go in a separate 'block' state triggered by (
+            (r'options\b', Keyword, 'options'),
+            (r':', Punctuation),
+
+            # literals
+            (r"'(\\\\|\\'|[^'])*'", String),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r'<<([^>]|>[^>])>>', String),
+            # identifiers
+            # Tokens start with capital letter.
+            (r'\$?[A-Z_]\w*', Name.Constant),
+            # Rules start with small letter.
+            (r'\$?[a-z_]\w*', Name.Variable),
+            # operators
+            (r'(\+|\||->|=>|=|\(|\)|\.\.|\.|\?|\*|\^|!|\#|~)', Operator),
+            (r',', Punctuation),
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+            (r';', Punctuation, '#pop')
+        ],
+        'tokens': [
+            include('whitespace'),
+            include('comments'),
+            (r'\{', Punctuation),
+            (r'(' + _TOKEN_REF + r')(\s*)(=)?(\s*)(' + _STRING_LITERAL
+             + ')?(\s*)(;)',
+             bygroups(Name.Label, Whitespace, Punctuation, Whitespace,
+                      String, Whitespace, Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'options': [
+            include('whitespace'),
+            include('comments'),
+            (r'\{', Punctuation),
+            (r'(' + _id + r')(\s*)(=)(\s*)(' +
+             '|'.join((_id, _STRING_LITERAL, _INT, '\*')) + ')(\s*)(;)',
+             bygroups(Name.Variable, Whitespace, Punctuation, Whitespace,
+                      Text, Whitespace, Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'action': [
+            (r'(' + r'|'.join((    # keep host code in largest possible chunks
+                r'[^${}\'"/\\]+',  # exclude unsafe characters
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\"|[^"])*"',  # double quote string
+                r"'(\\\\|\\'|[^'])*'",  # single quote string
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\/|[^/])*/',
+
+                # backslashes are okay, as long as we are not backslashing a %
+                r'\\(?!%)',
+
+                # Now that we've handled regex and javadoc comments
+                # it's safe to let / through.
+                r'/',
+            )) + r')+', Other),
+            (r'(\\)(%)', bygroups(Punctuation, Other)),
+            (r'(\$[a-zA-Z]+)(\.?)(text|value)?',
+             bygroups(Name.Variable, Punctuation, Name.Property)),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'nested-arg-action': [
+            (r'(' + r'|'.join((    # keep host code in largest possible chunks.
+                r'[^$\[\]\'"/]+',  # exclude unsafe characters
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\"|[^"])*"',  # double quote string
+                r"'(\\\\|\\'|[^'])*'",  # single quote string
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\/|[^/])*/',
+
+                # Now that we've handled regex and javadoc comments
+                # it's safe to let / through.
+                r'/',
+            )) + r')+', Other),
+
+
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+            (r'(\$[a-zA-Z]+)(\.?)(text|value)?',
+             bygroups(Name.Variable, Punctuation, Name.Property)),
+            (r'(\\\\|\\\]|\\\[|[^\[\]])+', Other),
+        ]
+    }
+
+    def analyse_text(text):
+        return re.search(r'^\s*grammar\s+[a-zA-Z0-9]+\s*;', text, re.M)
+
+# http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets
+
+# TH: I'm not aware of any language features of C++ that will cause
+# incorrect lexing of C files.  Antlr doesn't appear to make a distinction,
+# so just assume they're C++.  No idea how to make Objective C work in the
+# future.
+
+# class AntlrCLexer(DelegatingLexer):
+#    """
+#    ANTLR with C Target
+#
+#    .. versionadded:: 1.1
+#    """
+#
+#    name = 'ANTLR With C Target'
+#    aliases = ['antlr-c']
+#    filenames = ['*.G', '*.g']
+#
+#    def __init__(self, **options):
+#        super(AntlrCLexer, self).__init__(CLexer, AntlrLexer, **options)
+#
+#    def analyse_text(text):
+#        return re.match(r'^\s*language\s*=\s*C\s*;', text)
+
+
+class AntlrCppLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with CPP Target
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'ANTLR With CPP Target'
+    aliases = ['antlr-cpp']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        super(AntlrCppLexer, self).__init__(CppLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*C\s*;', text, re.M)
+
+
+class AntlrObjectiveCLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with Objective-C Target
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'ANTLR With ObjectiveC Target'
+    aliases = ['antlr-objc']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        super(AntlrObjectiveCLexer, self).__init__(ObjectiveCLexer,
+                                                   AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*ObjC\s*;', text)
+
+
+class AntlrCSharpLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with C# Target
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'ANTLR With C# Target'
+    aliases = ['antlr-csharp', 'antlr-c#']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        super(AntlrCSharpLexer, self).__init__(CSharpLexer, AntlrLexer,
+                                               **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*CSharp2\s*;', text, re.M)
+
+
+class AntlrPythonLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with Python Target
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'ANTLR With Python Target'
+    aliases = ['antlr-python']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        super(AntlrPythonLexer, self).__init__(PythonLexer, AntlrLexer,
+                                               **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Python\s*;', text, re.M)
+
+
+class AntlrJavaLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with Java Target
+
+    .. versionadded:: 1.
+    """
+
+    name = 'ANTLR With Java Target'
+    aliases = ['antlr-java']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        super(AntlrJavaLexer, self).__init__(JavaLexer, AntlrLexer,
+                                             **options)
+
+    def analyse_text(text):
+        # Antlr language is Java by default
+        return AntlrLexer.analyse_text(text) and 0.9
+
+
+class AntlrRubyLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with Ruby Target
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'ANTLR With Ruby Target'
+    aliases = ['antlr-ruby', 'antlr-rb']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        super(AntlrRubyLexer, self).__init__(RubyLexer, AntlrLexer,
+                                             **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Ruby\s*;', text, re.M)
+
+
+class AntlrPerlLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with Perl Target
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'ANTLR With Perl Target'
+    aliases = ['antlr-perl']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        super(AntlrPerlLexer, self).__init__(PerlLexer, AntlrLexer,
+                                             **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Perl5\s*;', text, re.M)
+
+
+class AntlrActionScriptLexer(DelegatingLexer):
+    """
+    `ANTLR`_ with ActionScript Target
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'ANTLR With ActionScript Target'
+    aliases = ['antlr-as', 'antlr-actionscript']
+    filenames = ['*.G', '*.g']
+
+    def __init__(self, **options):
+        from pygments.lexers.actionscript import ActionScriptLexer
+        super(AntlrActionScriptLexer, self).__init__(ActionScriptLexer,
+                                                     AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*ActionScript\s*;', text, re.M)
+
+
+class TreetopBaseLexer(RegexLexer):
+    """
+    A base lexer for `Treetop <http://treetop.rubyforge.org/>`_ grammars.
+    Not for direct use; use TreetopLexer instead.
+
+    .. versionadded:: 1.6
+    """
+
+    tokens = {
+        'root': [
+            include('space'),
+            (r'require[ \t]+[^\n\r]+[\n\r]', Other),
+            (r'module\b', Keyword.Namespace, 'module'),
+            (r'grammar\b', Keyword, 'grammar'),
+        ],
+        'module': [
+            include('space'),
+            include('end'),
+            (r'module\b', Keyword, '#push'),
+            (r'grammar\b', Keyword, 'grammar'),
+            (r'[A-Z]\w*(?:::[A-Z]\w*)*', Name.Namespace),
+        ],
+        'grammar': [
+            include('space'),
+            include('end'),
+            (r'rule\b', Keyword, 'rule'),
+            (r'include\b', Keyword, 'include'),
+            (r'[A-Z]\w*', Name),
+        ],
+        'include': [
+            include('space'),
+            (r'[A-Z]\w*(?:::[A-Z]\w*)*', Name.Class, '#pop'),
+        ],
+        'rule': [
+            include('space'),
+            include('end'),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'([A-Za-z_]\w*)(:)', bygroups(Name.Label, Punctuation)),
+            (r'[A-Za-z_]\w*', Name),
+            (r'[()]', Punctuation),
+            (r'[?+*/&!~]', Operator),
+            (r'\[(?:\\.|\[:\^?[a-z]+:\]|[^\\\]])+\]', String.Regex),
+            (r'([0-9]*)(\.\.)([0-9]*)',
+             bygroups(Number.Integer, Operator, Number.Integer)),
+            (r'(<)([^>]+)(>)', bygroups(Punctuation, Name.Class, Punctuation)),
+            (r'\{', Punctuation, 'inline_module'),
+            (r'\.', String.Regex),
+        ],
+        'inline_module': [
+            (r'\{', Other, 'ruby'),
+            (r'\}', Punctuation, '#pop'),
+            (r'[^{}]+', Other),
+        ],
+        'ruby': [
+            (r'\{', Other, '#push'),
+            (r'\}', Other, '#pop'),
+            (r'[^{}]+', Other),
+        ],
+        'space': [
+            (r'[ \t\n\r]+', Whitespace),
+            (r'#[^\n]*', Comment.Single),
+        ],
+        'end': [
+            (r'end\b', Keyword, '#pop'),
+        ],
+    }
+
+
+class TreetopLexer(DelegatingLexer):
+    """
+    A lexer for `Treetop <http://treetop.rubyforge.org/>`_ grammars.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Treetop'
+    aliases = ['treetop']
+    filenames = ['*.treetop', '*.tt']
+
+    def __init__(self, **options):
+        super(TreetopLexer, self).__init__(RubyLexer, TreetopBaseLexer, **options)
+
+
+class EbnfLexer(RegexLexer):
+    """
+    Lexer for `ISO/IEC 14977 EBNF
+    <http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form>`_
+    grammars.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'EBNF'
+    aliases = ['ebnf']
+    filenames = ['*.ebnf']
+    mimetypes = ['text/x-ebnf']
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comment_start'),
+            include('identifier'),
+            (r'=', Operator, 'production'),
+        ],
+        'production': [
+            include('whitespace'),
+            include('comment_start'),
+            include('identifier'),
+            (r'"[^"]*"', String.Double),
+            (r"'[^']*'", String.Single),
+            (r'(\?[^?]*\?)', Name.Entity),
+            (r'[\[\]{}(),|]', Punctuation),
+            (r'-', Operator),
+            (r';', Punctuation, '#pop'),
+            (r'\.', Punctuation, '#pop'),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+        'comment_start': [
+            (r'\(\*', Comment.Multiline, 'comment'),
+        ],
+        'comment': [
+            (r'[^*)]', Comment.Multiline),
+            include('comment_start'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            (r'[*)]', Comment.Multiline),
+        ],
+        'identifier': [
+            (r'([a-zA-Z][\w \-]*)', Keyword),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/typoscript.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/typoscript.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/typoscript.py	(revision 1126)
@@ -0,0 +1,226 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.typoscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for TypoScript
+
+    `TypoScriptLexer`
+        A TypoScript lexer.
+
+    `TypoScriptCssDataLexer`
+        Lexer that highlights markers, constants and registers within css.
+
+    `TypoScriptHtmlDataLexer`
+        Lexer that highlights markers, constants and registers within html tags.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using
+from pygments.token import Text, Comment, Name, String, Number, \
+    Operator, Punctuation
+
+__all__ = ['TypoScriptLexer', 'TypoScriptCssDataLexer', 'TypoScriptHtmlDataLexer']
+
+
+class TypoScriptCssDataLexer(RegexLexer):
+    """
+    Lexer that highlights markers, constants and registers within css blocks.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'TypoScriptCssData'
+    aliases = ['typoscriptcssdata']
+
+    tokens = {
+        'root': [
+            # marker: ###MARK###
+            (r'(.*)(###\w+###)(.*)', bygroups(String, Name.Constant, String)),
+            # constant: {$some.constant}
+            (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
+             bygroups(String.Symbol, Operator, Name.Constant,
+                      Name.Constant, String.Symbol)),  # constant
+            # constant: {register:somevalue}
+            (r'(.*)(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})(.*)',
+             bygroups(String, String.Symbol, Name.Constant, Operator,
+                      Name.Constant, String.Symbol, String)),  # constant
+            # whitespace
+            (r'\s+', Text),
+            # comments
+            (r'/\*(?:(?!\*/).)*\*/', Comment),
+            (r'(?<!(#|\'|"))(?:#(?!(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))[^\n#]+|//[^\n]*)',
+             Comment),
+            # other
+            (r'[<>,:=.*%+|]', String),
+            (r'[\w"\-!/&;(){}]+', String),
+        ]
+    }
+
+
+class TypoScriptHtmlDataLexer(RegexLexer):
+    """
+    Lexer that highlights markers, constants and registers within html tags.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'TypoScriptHtmlData'
+    aliases = ['typoscripthtmldata']
+
+    tokens = {
+        'root': [
+            # INCLUDE_TYPOSCRIPT
+            (r'(INCLUDE_TYPOSCRIPT)', Name.Class),
+            # Language label or extension resource FILE:... or LLL:... or EXT:...
+            (r'(EXT|FILE|LLL):[^}\n"]*', String),
+            # marker: ###MARK###
+            (r'(.*)(###\w+###)(.*)', bygroups(String, Name.Constant, String)),
+            # constant: {$some.constant}
+            (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
+             bygroups(String.Symbol, Operator, Name.Constant,
+                      Name.Constant, String.Symbol)),  # constant
+            # constant: {register:somevalue}
+            (r'(.*)(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})(.*)',
+             bygroups(String, String.Symbol, Name.Constant, Operator,
+                      Name.Constant, String.Symbol, String)),  # constant
+            # whitespace
+            (r'\s+', Text),
+            # other
+            (r'[<>,:=.*%+|]', String),
+            (r'[\w"\-!/&;(){}#]+', String),
+        ]
+    }
+
+
+class TypoScriptLexer(RegexLexer):
+    """
+    Lexer for TypoScript code.
+
+    http://docs.typo3.org/typo3cms/TyposcriptReference/
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'TypoScript'
+    aliases = ['typoscript']
+    filenames = ['*.ts', '*.txt']
+    mimetypes = ['text/x-typoscript']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    # Slightly higher than TypeScript (which is 0).
+    priority = 0.1
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('constant'),
+            include('html'),
+            include('label'),
+            include('whitespace'),
+            include('keywords'),
+            include('punctuation'),
+            include('operator'),
+            include('structure'),
+            include('literal'),
+            include('other'),
+        ],
+        'keywords': [
+            # Conditions
+            (r'(\[)(?i)(browser|compatVersion|dayofmonth|dayofweek|dayofyear|'
+             r'device|ELSE|END|GLOBAL|globalString|globalVar|hostname|hour|IP|'
+             r'language|loginUser|loginuser|minute|month|page|PIDinRootline|'
+             r'PIDupinRootline|system|treeLevel|useragent|userFunc|usergroup|'
+             r'version)([^\]]*)(\])',
+             bygroups(String.Symbol, Name.Constant, Text, String.Symbol)),
+            # Functions
+            (r'(?=[\w\-])(HTMLparser|HTMLparser_tags|addParams|cache|encapsLines|'
+             r'filelink|if|imageLinkWrap|imgResource|makelinks|numRows|numberFormat|'
+             r'parseFunc|replacement|round|select|split|stdWrap|strPad|tableStyle|'
+             r'tags|textStyle|typolink)(?![\w\-])', Name.Function),
+            # Toplevel objects and _*
+            (r'(?:(=?\s*<?\s+|^\s*))(cObj|field|config|content|constants|FEData|'
+             r'file|frameset|includeLibs|lib|page|plugin|register|resources|sitemap|'
+             r'sitetitle|styles|temp|tt_[^:.\s]*|types|xmlnews|INCLUDE_TYPOSCRIPT|'
+             r'_CSS_DEFAULT_STYLE|_DEFAULT_PI_VARS|_LOCAL_LANG)(?![\w\-])',
+             bygroups(Operator, Name.Builtin)),
+            # Content objects
+            (r'(?=[\w\-])(CASE|CLEARGIF|COA|COA_INT|COBJ_ARRAY|COLUMNS|CONTENT|'
+             r'CTABLE|EDITPANEL|FILE|FILES|FLUIDTEMPLATE|FORM|HMENU|HRULER|HTML|'
+             r'IMAGE|IMGTEXT|IMG_RESOURCE|LOAD_REGISTER|MEDIA|MULTIMEDIA|OTABLE|'
+             r'PAGE|QTOBJECT|RECORDS|RESTORE_REGISTER|SEARCHRESULT|SVG|SWFOBJECT|'
+             r'TEMPLATE|TEXT|USER|USER_INT)(?![\w\-])', Name.Class),
+            # Menu states
+            (r'(?=[\w\-])(ACTIFSUBRO|ACTIFSUB|ACTRO|ACT|CURIFSUBRO|CURIFSUB|CURRO|'
+             r'CUR|IFSUBRO|IFSUB|NO|SPC|USERDEF1RO|USERDEF1|USERDEF2RO|USERDEF2|'
+             r'USRRO|USR)', Name.Class),
+            # Menu objects
+            (r'(?=[\w\-])(GMENU_FOLDOUT|GMENU_LAYERS|GMENU|IMGMENUITEM|IMGMENU|'
+             r'JSMENUITEM|JSMENU|TMENUITEM|TMENU_LAYERS|TMENU)', Name.Class),
+            # PHP objects
+            (r'(?=[\w\-])(PHP_SCRIPT(_EXT|_INT)?)', Name.Class),
+            (r'(?=[\w\-])(userFunc)(?![\w\-])', Name.Function),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+        'html': [
+            (r'<\S[^\n>]*>', using(TypoScriptHtmlDataLexer)),
+            (r'&[^;\n]*;', String),
+            (r'(_CSS_DEFAULT_STYLE)(\s*)(\()(?s)(.*(?=\n\)))',
+             bygroups(Name.Class, Text, String.Symbol, using(TypoScriptCssDataLexer))),
+        ],
+        'literal': [
+            (r'0x[0-9A-Fa-f]+t?', Number.Hex),
+            # (r'[0-9]*\.[0-9]+([eE][0-9]+)?[fd]?\s*(?:[^=])', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'(###\w+###)', Name.Constant),
+        ],
+        'label': [
+            # Language label or extension resource FILE:... or LLL:... or EXT:...
+            (r'(EXT|FILE|LLL):[^}\n"]*', String),
+            # Path to a resource
+            (r'(?![^\w\-])([\w\-]+(?:/[\w\-]+)+/?)(\S*\n)',
+             bygroups(String, String)),
+        ],
+        'punctuation': [
+            (r'[,.]', Punctuation),
+        ],
+        'operator': [
+            (r'[<>,:=.*%+|]', Operator),
+        ],
+        'structure': [
+            # Brackets and braces
+            (r'[{}()\[\]\\]', String.Symbol),
+        ],
+        'constant': [
+            # Constant: {$some.constant}
+            (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
+                bygroups(String.Symbol, Operator, Name.Constant,
+                         Name.Constant, String.Symbol)),  # constant
+            # Constant: {register:somevalue}
+            (r'(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})',
+                bygroups(String.Symbol, Name.Constant, Operator,
+                         Name.Constant, String.Symbol)),  # constant
+            # Hex color: #ff0077
+            (r'(#[a-fA-F0-9]{6}\b|#[a-fA-F0-9]{3}\b)', String.Char)
+        ],
+        'comment': [
+            (r'(?<!(#|\'|"))(?:#(?!(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))[^\n#]+|//[^\n]*)',
+             Comment),
+            (r'/\*(?:(?!\*/).)*\*/', Comment),
+            (r'(\s*#\s*\n)', Comment),
+        ],
+        'other': [
+            (r'[\w"\-!/&;]+', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        if '<INCLUDE_TYPOSCRIPT:' in text:
+            return 1.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/other.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/other.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/other.py	(revision 1126)
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.other
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexers.sql import SqlLexer, MySqlLexer, SqliteConsoleLexer
+from pygments.lexers.shell import BashLexer, BashSessionLexer, BatchLexer, \
+    TcshLexer
+from pygments.lexers.robotframework import RobotFrameworkLexer
+from pygments.lexers.testing import GherkinLexer
+from pygments.lexers.esoteric import BrainfuckLexer, BefungeLexer, RedcodeLexer
+from pygments.lexers.prolog import LogtalkLexer
+from pygments.lexers.snobol import SnobolLexer
+from pygments.lexers.rebol import RebolLexer
+from pygments.lexers.configs import KconfigLexer, Cfengine3Lexer
+from pygments.lexers.modeling import ModelicaLexer
+from pygments.lexers.scripting import AppleScriptLexer, MOOCodeLexer, \
+    HybrisLexer
+from pygments.lexers.graphics import PostScriptLexer, GnuplotLexer, \
+    AsymptoteLexer, PovrayLexer
+from pygments.lexers.business import ABAPLexer, OpenEdgeLexer, \
+    GoodDataCLLexer, MaqlLexer
+from pygments.lexers.automation import AutoItLexer, AutohotkeyLexer
+from pygments.lexers.dsls import ProtoBufLexer, BroLexer, PuppetLexer, \
+    MscgenLexer, VGLLexer
+from pygments.lexers.basic import CbmBasicV2Lexer
+from pygments.lexers.pawn import SourcePawnLexer, PawnLexer
+from pygments.lexers.ecl import ECLLexer
+from pygments.lexers.urbi import UrbiscriptLexer
+from pygments.lexers.smalltalk import SmalltalkLexer, NewspeakLexer
+from pygments.lexers.installers import NSISLexer, RPMSpecLexer
+from pygments.lexers.textedit import AwkLexer
+from pygments.lexers.smv import NuSMVLexer
+
+__all__ = []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/clean.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/clean.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/clean.py	(revision 1126)
@@ -0,0 +1,288 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.clean
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Clean language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import ExtendedRegexLexer, LexerContext, \
+    bygroups, words, include, default
+from pygments.token import Comment, Keyword, Literal, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ['CleanLexer']
+
+
+class CleanLexer(ExtendedRegexLexer):
+    """
+    Lexer for the general purpose, state-of-the-art, pure and lazy functional
+    programming language Clean (http://clean.cs.ru.nl/Clean).
+
+    .. versionadded: 2.2
+    """
+    name = 'Clean'
+    aliases = ['clean']
+    filenames = ['*.icl', '*.dcl']
+
+    def get_tokens_unprocessed(self, text=None, context=None):
+        ctx = LexerContext(text, 0)
+        ctx.indent = 0
+        return ExtendedRegexLexer.get_tokens_unprocessed(self, text, context=ctx)
+
+    def check_class_not_import(lexer, match, ctx):
+        if match.group(0) == 'import':
+            yield match.start(), Keyword.Namespace, match.group(0)
+            ctx.stack = ctx.stack[:-1] + ['fromimportfunc']
+        else:
+            yield match.start(), Name.Class, match.group(0)
+        ctx.pos = match.end()
+
+    def check_instance_class(lexer, match, ctx):
+        if match.group(0) == 'instance' or match.group(0) == 'class':
+            yield match.start(), Keyword, match.group(0)
+        else:
+            yield match.start(), Name.Function, match.group(0)
+            ctx.stack = ctx.stack + ['fromimportfunctype']
+        ctx.pos = match.end()
+
+    @staticmethod
+    def indent_len(text):
+        # Tabs are four spaces:
+        # https://svn.cs.ru.nl/repos/clean-platform/trunk/doc/STANDARDS.txt
+        text = text.replace('\n', '')
+        return len(text.replace('\t', '    ')), len(text)
+
+    def store_indent(lexer, match, ctx):
+        ctx.indent, _ = CleanLexer.indent_len(match.group(0))
+        ctx.pos = match.end()
+        yield match.start(), Text, match.group(0)
+
+    def check_indent1(lexer, match, ctx):
+        indent, reallen = CleanLexer.indent_len(match.group(0))
+        if indent > ctx.indent:
+            yield match.start(), Whitespace, match.group(0)
+            ctx.pos = match.start() + reallen + 1
+        else:
+            ctx.indent = 0
+            ctx.pos = match.start()
+            ctx.stack = ctx.stack[:-1]
+            yield match.start(), Whitespace, match.group(0)[1:]
+
+    def check_indent2(lexer, match, ctx):
+        indent, reallen = CleanLexer.indent_len(match.group(0))
+        if indent > ctx.indent:
+            yield match.start(), Whitespace, match.group(0)
+            ctx.pos = match.start() + reallen + 1
+        else:
+            ctx.indent = 0
+            ctx.pos = match.start()
+            ctx.stack = ctx.stack[:-2]
+
+    def check_indent3(lexer, match, ctx):
+        indent, reallen = CleanLexer.indent_len(match.group(0))
+        if indent > ctx.indent:
+            yield match.start(), Whitespace, match.group(0)
+            ctx.pos = match.start() + reallen + 1
+        else:
+            ctx.indent = 0
+            ctx.pos = match.start()
+            ctx.stack = ctx.stack[:-3]
+            yield match.start(), Whitespace, match.group(0)[1:]
+            if match.group(0) == '\n\n':
+                ctx.pos = ctx.pos + 1
+
+    def skip(lexer, match, ctx):
+        ctx.stack = ctx.stack[:-1]
+        ctx.pos = match.end()
+        yield match.start(), Comment, match.group(0)
+
+    keywords = ('class', 'instance', 'where', 'with', 'let', 'let!',
+                'in', 'case', 'of', 'infix', 'infixr', 'infixl', 'generic',
+                'derive', 'otherwise', 'code', 'inline')
+
+    tokens = {
+        'common': [
+            (r';', Punctuation, '#pop'),
+            (r'//', Comment, 'singlecomment'),
+        ],
+        'root': [
+            # Comments
+            (r'//.*\n', Comment.Single),
+            (r'(?s)/\*\*.*?\*/', Comment.Special),
+            (r'(?s)/\*.*?\*/', Comment.Multi),
+
+            # Modules, imports, etc.
+            (r'\b((?:implementation|definition|system)\s+)?(module)(\s+)([\w`.]+)',
+                bygroups(Keyword.Namespace, Keyword.Namespace, Text, Name.Class)),
+            (r'(?<=\n)import(?=\s)', Keyword.Namespace, 'import'),
+            (r'(?<=\n)from(?=\s)', Keyword.Namespace, 'fromimport'),
+
+            # Keywords
+            # We cannot use (?s)^|(?<=\s) as prefix, so need to repeat this
+            (words(keywords, prefix=r'(?<=\s)', suffix=r'(?=\s)'), Keyword),
+            (words(keywords, prefix=r'^', suffix=r'(?=\s)'), Keyword),
+
+            # Function definitions
+            (r'(?=\{\|)', Whitespace, 'genericfunction'),
+            (r'(?<=\n)([ \t]*)([\w`$()=\-<>~*\^|+&%]+)((?:\s+\w)*)(\s*)(::)',
+             bygroups(store_indent, Name.Function, Keyword.Type, Whitespace,
+                      Punctuation),
+             'functiondefargs'),
+
+            # Type definitions
+            (r'(?<=\n)([ \t]*)(::)', bygroups(store_indent, Punctuation), 'typedef'),
+            (r'^([ \t]*)(::)', bygroups(store_indent, Punctuation), 'typedef'),
+
+            # Literals
+            (r'\'\\?.(?<!\\)\'', String.Char),
+            (r'\'\\\d+\'', String.Char),
+            (r'\'\\\\\'', String.Char),  # (special case for '\\')
+            (r'[+\-~]?\s*\d+\.\d+(E[+\-~]?\d+)?\b', Number.Float),
+            (r'[+\-~]?\s*0[0-7]\b', Number.Oct),
+            (r'[+\-~]?\s*0x[0-9a-fA-F]\b', Number.Hex),
+            (r'[+\-~]?\s*\d+\b', Number.Integer),
+            (r'"', String.Double, 'doubleqstring'),
+            (words(('True', 'False'), prefix=r'(?<=\s)', suffix=r'(?=\s)'),
+             Literal),
+
+            # Qualified names
+            (r'(\')([\w.]+)(\'\.)',
+                bygroups(Punctuation, Name.Namespace, Punctuation)),
+
+            # Everything else is some name
+            (r'([\w`$%/?@]+\.?)*[\w`$%/?@]+', Name),
+
+            # Punctuation
+            (r'[{}()\[\],:;.#]', Punctuation),
+            (r'[+\-=!<>|&~*\^/]', Operator),
+            (r'\\\\', Operator),
+
+            # Lambda expressions
+            (r'\\.*?(->|\.|=)', Name.Function),
+
+            # Whitespace
+            (r'\s', Whitespace),
+
+            include('common'),
+        ],
+        'fromimport': [
+            include('common'),
+            (r'([\w`.]+)', check_class_not_import),
+            (r'\n', Whitespace, '#pop'),
+            (r'\s', Whitespace),
+        ],
+        'fromimportfunc': [
+            include('common'),
+            (r'(::)(\s+)([^,\s]+)', bygroups(Punctuation, Text, Keyword.Type)),
+            (r'([\w`$()=\-<>~*\^|+&%/]+)', check_instance_class),
+            (r',', Punctuation),
+            (r'\n', Whitespace, '#pop'),
+            (r'\s', Whitespace),
+        ],
+        'fromimportfunctype': [
+            include('common'),
+            (r'[{(\[]', Punctuation, 'combtype'),
+            (r',', Punctuation, '#pop'),
+            (r'[:;.#]', Punctuation),
+            (r'\n', Whitespace, '#pop:2'),
+            (r'[^\S\n]+', Whitespace),
+            (r'\S+', Keyword.Type),
+        ],
+        'combtype': [
+            include('common'),
+            (r'[})\]]', Punctuation, '#pop'),
+            (r'[{(\[]', Punctuation, '#pop'),
+            (r'[,:;.#]', Punctuation),
+            (r'\s+', Whitespace),
+            (r'\S+', Keyword.Type),
+        ],
+        'import': [
+            include('common'),
+            (words(('from', 'import', 'as', 'qualified'),
+                   prefix='(?<=\s)', suffix='(?=\s)'), Keyword.Namespace),
+            (r'[\w`.]+', Name.Class),
+            (r'\n', Whitespace, '#pop'),
+            (r',', Punctuation),
+            (r'[^\S\n]+', Whitespace),
+        ],
+        'singlecomment': [
+            (r'(.)(?=\n)', skip),
+            (r'.+(?!\n)', Comment),
+        ],
+        'doubleqstring': [
+            (r'[^\\"]+', String.Double),
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Double),
+        ],
+        'typedef': [
+            include('common'),
+            (r'[\w`]+', Keyword.Type),
+            (r'[:=|(),\[\]{}!*]', Punctuation),
+            (r'->', Punctuation),
+            (r'\n(?=[^\s|])', Whitespace, '#pop'),
+            (r'\s', Whitespace),
+            (r'.', Keyword.Type),
+        ],
+        'genericfunction': [
+            include('common'),
+            (r'\{\|', Punctuation),
+            (r'\|\}', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'->', Punctuation),
+            (r'(\s+of\s+)(\{)', bygroups(Keyword, Punctuation), 'genericftypes'),
+            (r'\s', Whitespace),
+            (r'[\w`\[\]{}!]+', Keyword.Type),
+            (r'[*()]', Punctuation),
+        ],
+        'genericftypes': [
+            include('common'),
+            (r'[\w`]+', Keyword.Type),
+            (r',', Punctuation),
+            (r'\s', Whitespace),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'functiondefargs': [
+            include('common'),
+            (r'\n(\s*)', check_indent1),
+            (r'[!{}()\[\],:;.#]', Punctuation),
+            (r'->', Punctuation, 'functiondefres'),
+            (r'^(?=\S)', Whitespace, '#pop'),
+            (r'\S', Keyword.Type),
+            (r'\s', Whitespace),
+        ],
+        'functiondefres': [
+            include('common'),
+            (r'\n(\s*)', check_indent2),
+            (r'^(?=\S)', Whitespace, '#pop:2'),
+            (r'[!{}()\[\],:;.#]', Punctuation),
+            (r'\|', Punctuation, 'functiondefclasses'),
+            (r'\S', Keyword.Type),
+            (r'\s', Whitespace),
+        ],
+        'functiondefclasses': [
+            include('common'),
+            (r'\n(\s*)', check_indent3),
+            (r'^(?=\S)', Whitespace, '#pop:3'),
+            (r'[,&]', Punctuation),
+            (r'\[', Punctuation, 'functiondefuniquneq'),
+            (r'[\w`$()=\-<>~*\^|+&%/{}\[\]@]', Name.Function, 'functionname'),
+            (r'\s+', Whitespace),
+        ],
+        'functiondefuniquneq': [
+            include('common'),
+            (r'[a-z]+', Keyword.Type),
+            (r'\s+', Whitespace),
+            (r'<=|,', Punctuation),
+            (r'\]', Punctuation, '#pop')
+        ],
+        'functionname': [
+            include('common'),
+            (r'[\w`$()=\-<>~*\^|+&%/]+', Name.Function),
+            (r'(?=\{\|)', Punctuation, 'genericfunction'),
+            default('#pop'),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/tcl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/tcl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/tcl.py	(revision 1126)
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.tcl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Tcl and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number
+from pygments.util import shebang_matches
+
+__all__ = ['TclLexer']
+
+
+class TclLexer(RegexLexer):
+    """
+    For Tcl source code.
+
+    .. versionadded:: 0.10
+    """
+
+    keyword_cmds_re = words((
+        'after', 'apply', 'array', 'break', 'catch', 'continue', 'elseif', 'else', 'error',
+        'eval', 'expr', 'for', 'foreach', 'global', 'if', 'namespace', 'proc', 'rename', 'return',
+        'set', 'switch', 'then', 'trace', 'unset', 'update', 'uplevel', 'upvar', 'variable',
+        'vwait', 'while'), prefix=r'\b', suffix=r'\b')
+
+    builtin_cmds_re = words((
+        'append', 'bgerror', 'binary', 'cd', 'chan', 'clock', 'close', 'concat', 'dde', 'dict',
+        'encoding', 'eof', 'exec', 'exit', 'fblocked', 'fconfigure', 'fcopy', 'file',
+        'fileevent', 'flush', 'format', 'gets', 'glob', 'history', 'http', 'incr', 'info', 'interp',
+        'join', 'lappend', 'lassign', 'lindex', 'linsert', 'list', 'llength', 'load', 'loadTk',
+        'lrange', 'lrepeat', 'lreplace', 'lreverse', 'lsearch', 'lset', 'lsort', 'mathfunc',
+        'mathop', 'memory', 'msgcat', 'open', 'package', 'pid', 'pkg::create', 'pkg_mkIndex',
+        'platform', 'platform::shell', 'puts', 'pwd', 're_syntax', 'read', 'refchan',
+        'regexp', 'registry', 'regsub', 'scan', 'seek', 'socket', 'source', 'split', 'string',
+        'subst', 'tell', 'time', 'tm', 'unknown', 'unload'), prefix=r'\b', suffix=r'\b')
+
+    name = 'Tcl'
+    aliases = ['tcl']
+    filenames = ['*.tcl', '*.rvt']
+    mimetypes = ['text/x-tcl', 'text/x-script.tcl', 'application/x-tcl']
+
+    def _gen_command_rules(keyword_cmds_re, builtin_cmds_re, context=""):
+        return [
+            (keyword_cmds_re, Keyword, 'params' + context),
+            (builtin_cmds_re, Name.Builtin, 'params' + context),
+            (r'([\w.-]+)', Name.Variable, 'params' + context),
+            (r'#', Comment, 'comment'),
+        ]
+
+    tokens = {
+        'root': [
+            include('command'),
+            include('basic'),
+            include('data'),
+            (r'\}', Keyword),  # HACK: somehow we miscounted our braces
+        ],
+        'command': _gen_command_rules(keyword_cmds_re, builtin_cmds_re),
+        'command-in-brace': _gen_command_rules(keyword_cmds_re,
+                                               builtin_cmds_re,
+                                               "-in-brace"),
+        'command-in-bracket': _gen_command_rules(keyword_cmds_re,
+                                                 builtin_cmds_re,
+                                                 "-in-bracket"),
+        'command-in-paren': _gen_command_rules(keyword_cmds_re,
+                                               builtin_cmds_re,
+                                               "-in-paren"),
+        'basic': [
+            (r'\(', Keyword, 'paren'),
+            (r'\[', Keyword, 'bracket'),
+            (r'\{', Keyword, 'brace'),
+            (r'"', String.Double, 'string'),
+            (r'(eq|ne|in|ni)\b', Operator.Word),
+            (r'!=|==|<<|>>|<=|>=|&&|\|\||\*\*|[-+~!*/%<>&^|?:]', Operator),
+        ],
+        'data': [
+            (r'\s+', Text),
+            (r'0x[a-fA-F0-9]+', Number.Hex),
+            (r'0[0-7]+', Number.Oct),
+            (r'\d+\.\d+', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'\$([\w.:-]+)', Name.Variable),
+            (r'([\w.:-]+)', Text),
+        ],
+        'params': [
+            (r';', Keyword, '#pop'),
+            (r'\n', Text, '#pop'),
+            (r'(else|elseif|then)\b', Keyword),
+            include('basic'),
+            include('data'),
+        ],
+        'params-in-brace': [
+            (r'\}', Keyword, ('#pop', '#pop')),
+            include('params')
+        ],
+        'params-in-paren': [
+            (r'\)', Keyword, ('#pop', '#pop')),
+            include('params')
+        ],
+        'params-in-bracket': [
+            (r'\]', Keyword, ('#pop', '#pop')),
+            include('params')
+        ],
+        'string': [
+            (r'\[', String.Double, 'string-square'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\])', String.Double),
+            (r'"', String.Double, '#pop')
+        ],
+        'string-square': [
+            (r'\[', String.Double, 'string-square'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|\\\n|[^\]\\])', String.Double),
+            (r'\]', String.Double, '#pop')
+        ],
+        'brace': [
+            (r'\}', Keyword, '#pop'),
+            include('command-in-brace'),
+            include('basic'),
+            include('data'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('command-in-paren'),
+            include('basic'),
+            include('data'),
+        ],
+        'bracket': [
+            (r'\]', Keyword, '#pop'),
+            include('command-in-bracket'),
+            include('basic'),
+            include('data'),
+        ],
+        'comment': [
+            (r'.*[^\\]\n', Comment, '#pop'),
+            (r'.*\\\n', Comment),
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'(tcl)')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/sas.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/sas.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/sas.py	(revision 1126)
@@ -0,0 +1,228 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.sas
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for SAS.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Keyword, Name, Number, String, Text, \
+    Other, Generic
+
+__all__ = ['SASLexer']
+
+
+class SASLexer(RegexLexer):
+    """
+    For `SAS <http://www.sas.com/>`_ files.
+
+    .. versionadded:: 2.2
+    """
+    # Syntax from syntax/sas.vim by James Kidd <james.kidd@covance.com>
+
+    name      = 'SAS'
+    aliases   = ['sas']
+    filenames = ['*.SAS', '*.sas']
+    mimetypes = ['text/x-sas', 'text/sas', 'application/x-sas']
+    flags     = re.IGNORECASE | re.MULTILINE
+
+    builtins_macros = (
+        "bquote", "nrbquote", "cmpres", "qcmpres", "compstor", "datatyp",
+        "display", "do", "else", "end", "eval", "global", "goto", "if",
+        "index", "input", "keydef", "label", "left", "length", "let",
+        "local", "lowcase", "macro", "mend", "nrquote",
+        "nrstr", "put", "qleft", "qlowcase", "qscan",
+        "qsubstr", "qsysfunc", "qtrim", "quote", "qupcase", "scan",
+        "str", "substr", "superq", "syscall", "sysevalf", "sysexec",
+        "sysfunc", "sysget", "syslput", "sysprod", "sysrc", "sysrput",
+        "then", "to", "trim", "unquote", "until", "upcase", "verify",
+        "while", "window"
+    )
+
+    builtins_conditionals = (
+        "do", "if", "then", "else", "end", "until", "while"
+    )
+
+    builtins_statements = (
+        "abort", "array", "attrib", "by", "call", "cards", "cards4",
+        "catname", "continue", "datalines", "datalines4", "delete", "delim",
+        "delimiter", "display", "dm", "drop", "endsas", "error", "file",
+        "filename", "footnote", "format", "goto", "in", "infile", "informat",
+        "input", "keep", "label", "leave", "length", "libname", "link",
+        "list", "lostcard", "merge", "missing", "modify", "options", "output",
+        "out", "page", "put", "redirect", "remove", "rename", "replace",
+        "retain", "return", "select", "set", "skip", "startsas", "stop",
+        "title", "update", "waitsas", "where", "window", "x", "systask"
+    )
+
+    builtins_sql = (
+        "add", "and", "alter", "as", "cascade", "check", "create",
+        "delete", "describe", "distinct", "drop", "foreign", "from",
+        "group", "having", "index", "insert", "into", "in", "key", "like",
+        "message", "modify", "msgtype", "not", "null", "on", "or",
+        "order", "primary", "references", "reset", "restrict", "select",
+        "set", "table", "unique", "update", "validate", "view", "where"
+    )
+
+    builtins_functions = (
+        "abs", "addr", "airy", "arcos", "arsin", "atan", "attrc",
+        "attrn", "band", "betainv", "blshift", "bnot", "bor",
+        "brshift", "bxor", "byte", "cdf", "ceil", "cexist", "cinv",
+        "close", "cnonct", "collate", "compbl", "compound",
+        "compress", "cos", "cosh", "css", "curobs", "cv", "daccdb",
+        "daccdbsl", "daccsl", "daccsyd", "dacctab", "dairy", "date",
+        "datejul", "datepart", "datetime", "day", "dclose", "depdb",
+        "depdbsl", "depsl", "depsyd",
+        "deptab", "dequote", "dhms", "dif", "digamma",
+        "dim", "dinfo", "dnum", "dopen", "doptname", "doptnum",
+        "dread", "dropnote", "dsname", "erf", "erfc", "exist", "exp",
+        "fappend", "fclose", "fcol", "fdelete", "fetch", "fetchobs",
+        "fexist", "fget", "fileexist", "filename", "fileref",
+        "finfo", "finv", "fipname", "fipnamel", "fipstate", "floor",
+        "fnonct", "fnote", "fopen", "foptname", "foptnum", "fpoint",
+        "fpos", "fput", "fread", "frewind", "frlen", "fsep", "fuzz",
+        "fwrite", "gaminv", "gamma", "getoption", "getvarc", "getvarn",
+        "hbound", "hms", "hosthelp", "hour", "ibessel", "index",
+        "indexc", "indexw", "input", "inputc", "inputn", "int",
+        "intck", "intnx", "intrr", "irr", "jbessel", "juldate",
+        "kurtosis", "lag", "lbound", "left", "length", "lgamma",
+        "libname", "libref", "log", "log10", "log2", "logpdf", "logpmf",
+        "logsdf", "lowcase", "max", "mdy", "mean", "min", "minute",
+        "mod", "month", "mopen", "mort", "n", "netpv", "nmiss",
+        "normal", "note", "npv", "open", "ordinal", "pathname",
+        "pdf", "peek", "peekc", "pmf", "point", "poisson", "poke",
+        "probbeta", "probbnml", "probchi", "probf", "probgam",
+        "probhypr", "probit", "probnegb", "probnorm", "probt",
+        "put", "putc", "putn", "qtr", "quote", "ranbin", "rancau",
+        "ranexp", "rangam", "range", "rank", "rannor", "ranpoi",
+        "rantbl", "rantri", "ranuni", "repeat", "resolve", "reverse",
+        "rewind", "right", "round", "saving", "scan", "sdf", "second",
+        "sign", "sin", "sinh", "skewness", "soundex", "spedis",
+        "sqrt", "std", "stderr", "stfips", "stname", "stnamel",
+        "substr", "sum", "symget", "sysget", "sysmsg", "sysprod",
+        "sysrc", "system", "tan", "tanh", "time", "timepart", "tinv",
+        "tnonct", "today", "translate", "tranwrd", "trigamma",
+        "trim", "trimn", "trunc", "uniform", "upcase", "uss", "var",
+        "varfmt", "varinfmt", "varlabel", "varlen", "varname",
+        "varnum", "varray", "varrayx", "vartype", "verify", "vformat",
+        "vformatd", "vformatdx", "vformatn", "vformatnx", "vformatw",
+        "vformatwx", "vformatx", "vinarray", "vinarrayx", "vinformat",
+        "vinformatd", "vinformatdx", "vinformatn", "vinformatnx",
+        "vinformatw", "vinformatwx", "vinformatx", "vlabel",
+        "vlabelx", "vlength", "vlengthx", "vname", "vnamex", "vtype",
+        "vtypex", "weekday", "year", "yyq", "zipfips", "zipname",
+        "zipnamel", "zipstate"
+    )
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('proc-data'),
+            include('cards-datalines'),
+            include('logs'),
+            include('general'),
+            (r'.', Text),
+        ],
+        # SAS is multi-line regardless, but * is ended by ;
+        'comments': [
+            (r'^\s*\*.*?;', Comment),
+            (r'/\*.*?\*/', Comment),
+            (r'^\s*\*(.|\n)*?;', Comment.Multiline),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+        ],
+        # Special highlight for proc, data, quit, run
+        'proc-data': [
+            (r'(^|;)\s*(proc \w+|data|run|quit)[\s;]',
+             Keyword.Reserved),
+        ],
+        # Special highlight cards and datalines
+        'cards-datalines': [
+            (r'^\s*(datalines|cards)\s*;\s*$', Keyword, 'data'),
+        ],
+        'data': [
+            (r'(.|\n)*^\s*;\s*$', Other, '#pop'),
+        ],
+        # Special highlight for put NOTE|ERROR|WARNING (order matters)
+        'logs': [
+            (r'\n?^\s*%?put ', Keyword, 'log-messages'),
+        ],
+        'log-messages': [
+            (r'NOTE(:|-).*', Generic, '#pop'),
+            (r'WARNING(:|-).*', Generic.Emph, '#pop'),
+            (r'ERROR(:|-).*', Generic.Error, '#pop'),
+            include('general'),
+        ],
+        'general': [
+            include('keywords'),
+            include('vars-strings'),
+            include('special'),
+            include('numbers'),
+        ],
+        # Keywords, statements, functions, macros
+        'keywords': [
+            (words(builtins_statements,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_sql,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_conditionals,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_macros,
+                   prefix = r'%',
+                   suffix = r'\b'),
+             Name.Builtin),
+            (words(builtins_functions,
+                   prefix = r'\b',
+                   suffix = r'\('),
+             Name.Builtin),
+        ],
+        # Strings and user-defined variables and macros (order matters)
+        'vars-strings': [
+            (r'&[a-z_]\w{0,31}\.?', Name.Variable),
+            (r'%[a-z_]\w{0,31}', Name.Function),
+            (r'\'', String, 'string_squote'),
+            (r'"', String, 'string_dquote'),
+        ],
+        'string_squote': [
+            ('\'', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            # AFAIK, macro variables are not evaluated in single quotes
+            # (r'&', Name.Variable, 'validvar'),
+            (r'[^$\'\\]+', String),
+            (r'[$\'\\]', String),
+        ],
+        'string_dquote': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            (r'&', Name.Variable, 'validvar'),
+            (r'[^$&"\\]+', String),
+            (r'[$"\\]', String),
+        ],
+        'validvar': [
+            (r'[a-z_]\w{0,31}\.?', Name.Variable, '#pop'),
+        ],
+        # SAS numbers and special variables
+        'numbers': [
+            (r'\b[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)(E[+-]?[0-9]+)?i?\b',
+             Number),
+        ],
+        'special': [
+            (r'(null|missing|_all_|_automatic_|_character_|_n_|'
+             r'_infile_|_name_|_null_|_numeric_|_user_|_webout_)',
+             Keyword.Constant),
+        ],
+        # 'operators': [
+        #     (r'(-|=|<=|>=|<|>|<>|&|!=|'
+        #      r'\||\*|\+|\^|/|!|~|~=)', Operator)
+        # ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/css.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/css.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/css.py	(revision 1126)
@@ -0,0 +1,689 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.css
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for CSS and related stylesheet formats.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import copy
+
+from pygments.lexer import ExtendedRegexLexer, RegexLexer, include, bygroups, \
+    default, words, inherit
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+from pygments.util import iteritems
+
+__all__ = ['CssLexer', 'SassLexer', 'ScssLexer', 'LessCssLexer']
+
+
+# List of vendor prefixes obtained from:
+# https://www.w3.org/TR/CSS21/syndata.html#vendor-keyword-history
+_vendor_prefixes = (
+    '-ms-', 'mso-', '-moz-', '-o-', '-xv-', '-atsc-', '-wap-', '-khtml-',
+    '-webkit-', 'prince-', '-ah-', '-hp-', '-ro-', '-rim-', '-tc-',
+)
+
+# List of CSS properties obtained from:
+# https://www.w3.org/Style/CSS/all-properties.en.html
+# Note: handle --* separately
+_css_properties = (
+    'align-content', 'align-items', 'align-self', 'alignment-baseline', 'all',
+    'animation', 'animation-delay', 'animation-direction',
+    'animation-duration', 'animation-fill-mode', 'animation-iteration-count',
+    'animation-name', 'animation-play-state', 'animation-timing-function',
+    'appearance', 'azimuth', 'backface-visibility', 'background',
+    'background-attachment', 'background-blend-mode', 'background-clip',
+    'background-color', 'background-image', 'background-origin',
+    'background-position', 'background-repeat', 'background-size',
+    'baseline-shift', 'bookmark-label', 'bookmark-level', 'bookmark-state',
+    'border', 'border-bottom', 'border-bottom-color',
+    'border-bottom-left-radius', 'border-bottom-right-radius',
+    'border-bottom-style', 'border-bottom-width', 'border-boundary',
+    'border-collapse', 'border-color', 'border-image', 'border-image-outset',
+    'border-image-repeat', 'border-image-slice', 'border-image-source',
+    'border-image-width', 'border-left', 'border-left-color',
+    'border-left-style', 'border-left-width', 'border-radius', 'border-right',
+    'border-right-color', 'border-right-style', 'border-right-width',
+    'border-spacing', 'border-style', 'border-top', 'border-top-color',
+    'border-top-left-radius', 'border-top-right-radius', 'border-top-style',
+    'border-top-width', 'border-width', 'bottom', 'box-decoration-break',
+    'box-shadow', 'box-sizing', 'box-snap', 'box-suppress', 'break-after',
+    'break-before', 'break-inside', 'caption-side', 'caret', 'caret-animation',
+    'caret-color', 'caret-shape', 'chains', 'clear', 'clip', 'clip-path',
+    'clip-rule', 'color', 'color-interpolation-filters', 'column-count',
+    'column-fill', 'column-gap', 'column-rule', 'column-rule-color',
+    'column-rule-style', 'column-rule-width', 'column-span', 'column-width',
+    'columns', 'content', 'counter-increment', 'counter-reset', 'counter-set',
+    'crop', 'cue', 'cue-after', 'cue-before', 'cursor', 'direction', 'display',
+    'dominant-baseline', 'elevation', 'empty-cells', 'filter', 'flex',
+    'flex-basis', 'flex-direction', 'flex-flow', 'flex-grow', 'flex-shrink',
+    'flex-wrap', 'float', 'float-defer', 'float-offset', 'float-reference',
+    'flood-color', 'flood-opacity', 'flow', 'flow-from', 'flow-into', 'font',
+    'font-family', 'font-feature-settings', 'font-kerning',
+    'font-language-override', 'font-size', 'font-size-adjust', 'font-stretch',
+    'font-style', 'font-synthesis', 'font-variant', 'font-variant-alternates',
+    'font-variant-caps', 'font-variant-east-asian', 'font-variant-ligatures',
+    'font-variant-numeric', 'font-variant-position', 'font-weight',
+    'footnote-display', 'footnote-policy', 'glyph-orientation-vertical',
+    'grid', 'grid-area', 'grid-auto-columns', 'grid-auto-flow',
+    'grid-auto-rows', 'grid-column', 'grid-column-end', 'grid-column-gap',
+    'grid-column-start', 'grid-gap', 'grid-row', 'grid-row-end',
+    'grid-row-gap', 'grid-row-start', 'grid-template', 'grid-template-areas',
+    'grid-template-columns', 'grid-template-rows', 'hanging-punctuation',
+    'height', 'hyphenate-character', 'hyphenate-limit-chars',
+    'hyphenate-limit-last', 'hyphenate-limit-lines', 'hyphenate-limit-zone',
+    'hyphens', 'image-orientation', 'image-resolution', 'initial-letter',
+    'initial-letter-align', 'initial-letter-wrap', 'isolation',
+    'justify-content', 'justify-items', 'justify-self', 'left',
+    'letter-spacing', 'lighting-color', 'line-break', 'line-grid',
+    'line-height', 'line-snap', 'list-style', 'list-style-image',
+    'list-style-position', 'list-style-type', 'margin', 'margin-bottom',
+    'margin-left', 'margin-right', 'margin-top', 'marker-side',
+    'marquee-direction', 'marquee-loop', 'marquee-speed', 'marquee-style',
+    'mask', 'mask-border', 'mask-border-mode', 'mask-border-outset',
+    'mask-border-repeat', 'mask-border-slice', 'mask-border-source',
+    'mask-border-width', 'mask-clip', 'mask-composite', 'mask-image',
+    'mask-mode', 'mask-origin', 'mask-position', 'mask-repeat', 'mask-size',
+    'mask-type', 'max-height', 'max-lines', 'max-width', 'min-height',
+    'min-width', 'mix-blend-mode', 'motion', 'motion-offset', 'motion-path',
+    'motion-rotation', 'move-to', 'nav-down', 'nav-left', 'nav-right',
+    'nav-up', 'object-fit', 'object-position', 'offset-after', 'offset-before',
+    'offset-end', 'offset-start', 'opacity', 'order', 'orphans', 'outline',
+    'outline-color', 'outline-offset', 'outline-style', 'outline-width',
+    'overflow', 'overflow-style', 'overflow-wrap', 'overflow-x', 'overflow-y',
+    'padding', 'padding-bottom', 'padding-left', 'padding-right', 'padding-top',
+    'page', 'page-break-after', 'page-break-before', 'page-break-inside',
+    'page-policy', 'pause', 'pause-after', 'pause-before', 'perspective',
+    'perspective-origin', 'pitch', 'pitch-range', 'play-during', 'polar-angle',
+    'polar-distance', 'position', 'presentation-level', 'quotes',
+    'region-fragment', 'resize', 'rest', 'rest-after', 'rest-before',
+    'richness', 'right', 'rotation', 'rotation-point', 'ruby-align',
+    'ruby-merge', 'ruby-position', 'running', 'scroll-snap-coordinate',
+    'scroll-snap-destination', 'scroll-snap-points-x', 'scroll-snap-points-y',
+    'scroll-snap-type', 'shape-image-threshold', 'shape-inside', 'shape-margin',
+    'shape-outside', 'size', 'speak', 'speak-as', 'speak-header',
+    'speak-numeral', 'speak-punctuation', 'speech-rate', 'stress', 'string-set',
+    'tab-size', 'table-layout', 'text-align', 'text-align-last',
+    'text-combine-upright', 'text-decoration', 'text-decoration-color',
+    'text-decoration-line', 'text-decoration-skip', 'text-decoration-style',
+    'text-emphasis', 'text-emphasis-color', 'text-emphasis-position',
+    'text-emphasis-style', 'text-indent', 'text-justify', 'text-orientation',
+    'text-overflow', 'text-shadow', 'text-space-collapse', 'text-space-trim',
+    'text-spacing', 'text-transform', 'text-underline-position', 'text-wrap',
+    'top', 'transform', 'transform-origin', 'transform-style', 'transition',
+    'transition-delay', 'transition-duration', 'transition-property',
+    'transition-timing-function', 'unicode-bidi', 'user-select',
+    'vertical-align', 'visibility', 'voice-balance', 'voice-duration',
+    'voice-family', 'voice-pitch', 'voice-range', 'voice-rate', 'voice-stress',
+    'voice-volume', 'volume', 'white-space', 'widows', 'width', 'will-change',
+    'word-break', 'word-spacing', 'word-wrap', 'wrap-after', 'wrap-before',
+    'wrap-flow', 'wrap-inside', 'wrap-through', 'writing-mode', 'z-index',
+)
+
+# List of keyword values obtained from: 
+# http://cssvalues.com/
+_keyword_values = (
+    'absolute', 'alias', 'all', 'all-petite-caps', 'all-scroll',
+    'all-small-caps', 'allow-end', 'alpha', 'alternate', 'alternate-reverse',
+    'always', 'armenian', 'auto', 'avoid', 'avoid-column', 'avoid-page',
+    'backwards', 'balance', 'baseline', 'below', 'blink', 'block', 'bold',
+    'bolder', 'border-box', 'both', 'bottom', 'box-decoration', 'break-word',
+    'capitalize', 'cell', 'center', 'circle', 'clip', 'clone', 'close-quote',
+    'col-resize', 'collapse', 'color', 'color-burn', 'color-dodge', 'column',
+    'column-reverse', 'compact', 'condensed', 'contain', 'container',
+    'content-box', 'context-menu', 'copy', 'cover', 'crisp-edges', 'crosshair',
+    'currentColor', 'cursive', 'darken', 'dashed', 'decimal',
+    'decimal-leading-zero', 'default', 'descendants', 'difference', 'digits',
+    'disc', 'distribute', 'dot', 'dotted', 'double', 'double-circle', 'e-resize',
+    'each-line', 'ease', 'ease-in', 'ease-in-out', 'ease-out', 'edges',
+    'ellipsis', 'end', 'ew-resize', 'exclusion', 'expanded', 'extra-condensed',
+    'extra-expanded', 'fantasy', 'fill', 'fill-box', 'filled', 'first', 'fixed',
+    'flat', 'flex', 'flex-end', 'flex-start', 'flip', 'force-end', 'forwards',
+    'from-image', 'full-width', 'geometricPrecision', 'georgian', 'groove',
+    'hanging', 'hard-light', 'help', 'hidden', 'hide', 'horizontal', 'hue',
+    'icon', 'infinite', 'inherit', 'initial', 'ink', 'inline', 'inline-block',
+    'inline-flex', 'inline-table', 'inset', 'inside', 'inter-word', 'invert',
+    'isolate', 'italic', 'justify', 'large', 'larger', 'last', 'left',
+    'lighten', 'lighter', 'line-through', 'linear', 'list-item', 'local',
+    'loose', 'lower-alpha', 'lower-greek', 'lower-latin', 'lower-roman',
+    'lowercase', 'ltr', 'luminance', 'luminosity', 'mandatory', 'manipulation',
+    'manual', 'margin-box', 'match-parent', 'medium', 'mixed', 'monospace',
+    'move', 'multiply', 'n-resize', 'ne-resize', 'nesw-resize',
+    'no-close-quote', 'no-drop', 'no-open-quote', 'no-repeat', 'none', 'normal',
+    'not-allowed', 'nowrap', 'ns-resize', 'nw-resize', 'nwse-resize', 'objects',
+    'oblique', 'off', 'on', 'open', 'open-quote', 'optimizeLegibility',
+    'optimizeSpeed', 'outset', 'outside', 'over', 'overlay', 'overline',
+    'padding-box', 'page', 'pan-down', 'pan-left', 'pan-right', 'pan-up',
+    'pan-x', 'pan-y', 'paused', 'petite-caps', 'pixelated', 'pointer',
+    'preserve-3d', 'progress', 'proximity', 'relative', 'repeat',
+    'repeat no-repeat', 'repeat-x', 'repeat-y', 'reverse', 'ridge', 'right',
+    'round', 'row', 'row-resize', 'row-reverse', 'rtl', 'ruby', 'ruby-base',
+    'ruby-base-container', 'ruby-text', 'ruby-text-container', 'run-in',
+    'running', 's-resize', 'sans-serif', 'saturation', 'scale-down', 'screen',
+    'scroll', 'se-resize', 'semi-condensed', 'semi-expanded', 'separate',
+    'serif', 'sesame', 'show', 'sideways', 'sideways-left', 'sideways-right',
+    'slice', 'small', 'small-caps', 'smaller', 'smooth', 'snap', 'soft-light',
+    'solid', 'space', 'space-around', 'space-between', 'spaces', 'square',
+    'start', 'static', 'step-end', 'step-start', 'sticky', 'stretch', 'strict',
+    'stroke-box', 'style', 'sw-resize', 'table', 'table-caption', 'table-cell',
+    'table-column', 'table-column-group', 'table-footer-group',
+    'table-header-group', 'table-row', 'table-row-group', 'text', 'thick',
+    'thin', 'titling-caps', 'to', 'top', 'triangle', 'ultra-condensed',
+    'ultra-expanded', 'under', 'underline', 'unicase', 'unset', 'upper-alpha',
+    'upper-latin', 'upper-roman', 'uppercase', 'upright', 'use-glyph-orientation',
+    'vertical', 'vertical-text', 'view-box', 'visible', 'w-resize', 'wait',
+    'wavy', 'weight', 'weight style', 'wrap', 'wrap-reverse', 'x-large',
+    'x-small', 'xx-large', 'xx-small', 'zoom-in', 'zoom-out',
+)
+
+# List of extended color keywords obtained from:
+# https://drafts.csswg.org/css-color/#named-colors
+_color_keywords = (
+    'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige',
+    'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown',
+    'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral',
+    'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan',
+    'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki',
+    'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred',
+    'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray',
+    'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue',
+    'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite',
+    'forestgreen', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod',
+    'gray', 'green', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred',
+    'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen',
+    'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan',
+    'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey',
+    'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue',
+    'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow',
+    'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine',
+    'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen',
+    'mediumslateblue', 'mediumspringgreen', 'mediumturquoise',
+    'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin',
+    'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange',
+    'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise',
+    'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum',
+    'powderblue', 'purple', 'rebeccapurple', 'red', 'rosybrown', 'royalblue',
+    'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna',
+    'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow',
+    'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise',
+    'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen',
+) + ('transparent',)
+
+# List of other keyword values from other sources:
+_other_keyword_values = (
+    'above', 'aural', 'behind', 'bidi-override', 'center-left', 'center-right',
+    'cjk-ideographic', 'continuous', 'crop', 'cross', 'embed', 'far-left',
+    'far-right', 'fast', 'faster', 'hebrew', 'high', 'higher', 'hiragana',
+    'hiragana-iroha', 'katakana', 'katakana-iroha', 'landscape', 'left-side',
+    'leftwards', 'level', 'loud', 'low', 'lower', 'message-box', 'middle',
+    'mix', 'narrower', 'once', 'portrait', 'right-side', 'rightwards', 'silent',
+    'slow', 'slower', 'small-caption', 'soft', 'spell-out', 'status-bar',
+    'super', 'text-bottom', 'text-top', 'wider', 'x-fast', 'x-high', 'x-loud',
+    'x-low', 'x-soft', 'yes', 'pre', 'pre-wrap', 'pre-line',
+)
+
+# List of functional notation and function keyword values:
+_functional_notation_keyword_values = (
+    'attr', 'blackness', 'blend', 'blenda', 'blur', 'brightness', 'calc',
+    'circle', 'color-mod', 'contrast', 'counter', 'cubic-bezier', 'device-cmyk',
+    'drop-shadow', 'ellipse', 'gray', 'grayscale', 'hsl', 'hsla', 'hue',
+    'hue-rotate', 'hwb', 'image', 'inset', 'invert', 'lightness',
+    'linear-gradient', 'matrix', 'matrix3d', 'opacity', 'perspective',
+    'polygon', 'radial-gradient', 'rect', 'repeating-linear-gradient',
+    'repeating-radial-gradient', 'rgb', 'rgba', 'rotate', 'rotate3d', 'rotateX',
+    'rotateY', 'rotateZ', 'saturate', 'saturation', 'scale', 'scale3d',
+    'scaleX', 'scaleY', 'scaleZ', 'sepia', 'shade', 'skewX', 'skewY', 'steps',
+    'tint', 'toggle', 'translate', 'translate3d', 'translateX', 'translateY',
+    'translateZ', 'whiteness',
+)
+# Note! Handle url(...) separately.
+
+# List of units obtained from:
+# https://www.w3.org/TR/css3-values/
+_angle_units = (
+    'deg', 'grad', 'rad', 'turn',
+)
+_frequency_units = (
+    'Hz', 'kHz',
+)
+_length_units = (
+    'em', 'ex', 'ch', 'rem',
+    'vh', 'vw', 'vmin', 'vmax',
+    'px', 'mm', 'cm', 'in', 'pt', 'pc', 'q',
+)
+_resolution_units = (
+    'dpi', 'dpcm', 'dppx',
+)
+_time_units = (
+    's', 'ms',
+)
+_all_units = _angle_units + _frequency_units + _length_units + \
+             _resolution_units + _time_units
+
+
+class CssLexer(RegexLexer):
+    """
+    For CSS (Cascading Style Sheets).
+    """
+
+    name = 'CSS'
+    aliases = ['css']
+    filenames = ['*.css']
+    mimetypes = ['text/css']
+
+    tokens = {
+        'root': [
+            include('basics'),
+        ],
+        'basics': [
+            (r'\s+', Text),
+            (r'/\*(?:.|\n)*?\*/', Comment),
+            (r'\{', Punctuation, 'content'),
+            (r'(\:{1,2})([\w-]+)', bygroups(Punctuation, Name.Decorator)),
+            (r'(\.)([\w-]+)', bygroups(Punctuation, Name.Class)),
+            (r'(\#)([\w-]+)', bygroups(Punctuation, Name.Namespace)),
+            (r'(@)([\w-]+)', bygroups(Punctuation, Keyword), 'atrule'),
+            (r'[\w-]+', Name.Tag),
+            (r'[~^*!%&$\[\]()<>|+=@:;,./?-]', Operator),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single)
+        ],
+        'atrule': [
+            (r'\{', Punctuation, 'atcontent'),
+            (r';', Punctuation, '#pop'),
+            include('basics'),
+        ],
+        'atcontent': [
+            include('basics'),
+            (r'\}', Punctuation, '#pop:2'),
+        ],
+        'content': [
+            (r'\s+', Text),
+            (r'\}', Punctuation, '#pop'),
+            (r';', Punctuation),
+            (r'^@.*?$', Comment.Preproc),
+
+            (words(_vendor_prefixes,), Keyword.Pseudo),
+            (r'('+r'|'.join(_css_properties)+r')(\s*)(\:)',
+             bygroups(Keyword, Text, Punctuation), 'value-start'),
+            (r'([a-zA-Z_][\w-]*)(\s*)(\:)', bygroups(Name, Text, Punctuation),
+             'value-start'),
+
+            (r'/\*(?:.|\n)*?\*/', Comment),
+        ],
+        'value-start': [
+            (r'\s+', Text),
+            (words(_vendor_prefixes,), Name.Builtin.Pseudo),
+            include('urls'),
+            (r'('+r'|'.join(_functional_notation_keyword_values)+r')(\()',
+             bygroups(Name.Builtin, Punctuation), 'function-start'),
+            (r'([a-zA-Z_][\w-]+)(\()', bygroups(Name.Function, Punctuation), 'function-start'),
+            (words(_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_other_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_color_keywords, suffix=r'\b'), Keyword.Constant),
+            (words(_css_properties, suffix=r'\b'), Keyword), # for transition-property etc.
+            (r'\!important', Comment.Preproc),
+            (r'/\*(?:.|\n)*?\*/', Comment),
+
+            include('numeric-values'),
+            
+            (r'[~^*!%&<>|+=@:./?-]+', Operator),
+            (r'[\[\](),]+', Punctuation),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'[a-zA-Z_][\w-]*', Name),
+            (r';', Punctuation, '#pop'),
+            (r'\}', Punctuation, '#pop:2'),
+        ],
+        'function-start': [
+            (r'\s+', Text),
+            include('urls'),
+            (words(_vendor_prefixes,), Keyword.Pseudo),
+            (words(_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_other_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_color_keywords, suffix=r'\b'), Keyword.Constant),
+
+            # function-start may be entered recursively
+            (r'(' + r'|'.join(_functional_notation_keyword_values) + r')(\()',
+             bygroups(Name.Builtin, Punctuation), 'function-start'),
+            (r'([a-zA-Z_][\w-]+)(\()', bygroups(Name.Function, Punctuation), 'function-start'),
+
+            (r'/\*(?:.|\n)*?\*/', Comment),
+            include('numeric-values'),
+            (r'[*+/-]', Operator),
+            (r'[,]', Punctuation),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'[a-zA-Z_-]\w*', Name),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'urls': [
+            (r'(url)(\()(".*?")(\))', bygroups(Name.Builtin, Punctuation,
+                                               String.Double, Punctuation)),
+            (r"(url)(\()('.*?')(\))", bygroups(Name.Builtin, Punctuation,
+                                               String.Single, Punctuation)),
+            (r'(url)(\()(.*?)(\))', bygroups(Name.Builtin, Punctuation,
+                                             String.Other, Punctuation)),
+        ],
+        'numeric-values': [
+            (r'\#[a-zA-Z0-9]{1,6}', Number.Hex),
+            (r'[+\-]?[0-9]*[.][0-9]+', Number.Float, 'numeric-end'),
+            (r'[+\-]?[0-9]+', Number.Integer, 'numeric-end'),            
+        ],        
+        'numeric-end': [
+            (words(_all_units, suffix=r'\b'), Keyword.Type),
+            (r'%', Keyword.Type),
+            default('#pop'),
+        ],
+    }
+
+
+common_sass_tokens = {
+    'value': [
+        (r'[ \t]+', Text),
+        (r'[!$][\w-]+', Name.Variable),
+        (r'url\(', String.Other, 'string-url'),
+        (r'[a-z_-][\w-]*(?=\()', Name.Function),
+        (words(_css_properties + (
+            'above', 'absolute', 'always', 'armenian', 'aural', 'auto', 'avoid', 'baseline',
+            'behind', 'below', 'bidi-override', 'blink', 'block', 'bold', 'bolder', 'both',
+            'capitalize', 'center-left', 'center-right', 'center', 'circle',
+            'cjk-ideographic', 'close-quote', 'collapse', 'condensed', 'continuous',
+            'crop', 'crosshair', 'cross', 'cursive', 'dashed', 'decimal-leading-zero',
+            'decimal', 'default', 'digits', 'disc', 'dotted', 'double', 'e-resize', 'embed',
+            'extra-condensed', 'extra-expanded', 'expanded', 'fantasy', 'far-left',
+            'far-right', 'faster', 'fast', 'fixed', 'georgian', 'groove', 'hebrew', 'help',
+            'hidden', 'hide', 'higher', 'high', 'hiragana-iroha', 'hiragana', 'icon',
+            'inherit', 'inline-table', 'inline', 'inset', 'inside', 'invert', 'italic',
+            'justify', 'katakana-iroha', 'katakana', 'landscape', 'larger', 'large',
+            'left-side', 'leftwards', 'level', 'lighter', 'line-through', 'list-item',
+            'loud', 'lower-alpha', 'lower-greek', 'lower-roman', 'lowercase', 'ltr',
+            'lower', 'low', 'medium', 'message-box', 'middle', 'mix', 'monospace',
+            'n-resize', 'narrower', 'ne-resize', 'no-close-quote', 'no-open-quote',
+            'no-repeat', 'none', 'normal', 'nowrap', 'nw-resize', 'oblique', 'once',
+            'open-quote', 'outset', 'outside', 'overline', 'pointer', 'portrait', 'px',
+            'relative', 'repeat-x', 'repeat-y', 'repeat', 'rgb', 'ridge', 'right-side',
+            'rightwards', 's-resize', 'sans-serif', 'scroll', 'se-resize',
+            'semi-condensed', 'semi-expanded', 'separate', 'serif', 'show', 'silent',
+            'slow', 'slower', 'small-caps', 'small-caption', 'smaller', 'soft', 'solid',
+            'spell-out', 'square', 'static', 'status-bar', 'super', 'sw-resize',
+            'table-caption', 'table-cell', 'table-column', 'table-column-group',
+            'table-footer-group', 'table-header-group', 'table-row',
+            'table-row-group', 'text', 'text-bottom', 'text-top', 'thick', 'thin',
+            'transparent', 'ultra-condensed', 'ultra-expanded', 'underline',
+            'upper-alpha', 'upper-latin', 'upper-roman', 'uppercase', 'url',
+            'visible', 'w-resize', 'wait', 'wider', 'x-fast', 'x-high', 'x-large', 'x-loud',
+            'x-low', 'x-small', 'x-soft', 'xx-large', 'xx-small', 'yes'), suffix=r'\b'),
+         Name.Constant),
+        (words(_color_keywords, suffix=r'\b'), Name.Entity),
+        (words((
+            'black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green',
+            'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua'), suffix=r'\b'),
+         Name.Builtin),
+        (r'\!(important|default)', Name.Exception),
+        (r'(true|false)', Name.Pseudo),
+        (r'(and|or|not)', Operator.Word),
+        (r'/\*', Comment.Multiline, 'inline-comment'),
+        (r'//[^\n]*', Comment.Single),
+        (r'\#[a-z0-9]{1,6}', Number.Hex),
+        (r'(-?\d+)(\%|[a-z]+)?', bygroups(Number.Integer, Keyword.Type)),
+        (r'(-?\d*\.\d+)(\%|[a-z]+)?', bygroups(Number.Float, Keyword.Type)),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'[~^*!&%<>|+=@:,./?-]+', Operator),
+        (r'[\[\]()]+', Punctuation),
+        (r'"', String.Double, 'string-double'),
+        (r"'", String.Single, 'string-single'),
+        (r'[a-z_-][\w-]*', Name),
+    ],
+
+    'interpolation': [
+        (r'\}', String.Interpol, '#pop'),
+        include('value'),
+    ],
+
+    'selector': [
+        (r'[ \t]+', Text),
+        (r'\:', Name.Decorator, 'pseudo-class'),
+        (r'\.', Name.Class, 'class'),
+        (r'\#', Name.Namespace, 'id'),
+        (r'[\w-]+', Name.Tag),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'&', Keyword),
+        (r'[~^*!&\[\]()<>|+=@:;,./?-]', Operator),
+        (r'"', String.Double, 'string-double'),
+        (r"'", String.Single, 'string-single'),
+    ],
+
+    'string-double': [
+        (r'(\\.|#(?=[^\n{])|[^\n"#])+', String.Double),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'"', String.Double, '#pop'),
+    ],
+
+    'string-single': [
+        (r"(\\.|#(?=[^\n{])|[^\n'#])+", String.Double),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r"'", String.Double, '#pop'),
+    ],
+
+    'string-url': [
+        (r'(\\#|#(?=[^\n{])|[^\n#)])+', String.Other),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'\)', String.Other, '#pop'),
+    ],
+
+    'pseudo-class': [
+        (r'[\w-]+', Name.Decorator),
+        (r'#\{', String.Interpol, 'interpolation'),
+        default('#pop'),
+    ],
+
+    'class': [
+        (r'[\w-]+', Name.Class),
+        (r'#\{', String.Interpol, 'interpolation'),
+        default('#pop'),
+    ],
+
+    'id': [
+        (r'[\w-]+', Name.Namespace),
+        (r'#\{', String.Interpol, 'interpolation'),
+        default('#pop'),
+    ],
+
+    'for': [
+        (r'(from|to|through)', Operator.Word),
+        include('value'),
+    ],
+}
+
+
+def _indentation(lexer, match, ctx):
+    indentation = match.group(0)
+    yield match.start(), Text, indentation
+    ctx.last_indentation = indentation
+    ctx.pos = match.end()
+
+    if hasattr(ctx, 'block_state') and ctx.block_state and \
+            indentation.startswith(ctx.block_indentation) and \
+            indentation != ctx.block_indentation:
+        ctx.stack.append(ctx.block_state)
+    else:
+        ctx.block_state = None
+        ctx.block_indentation = None
+        ctx.stack.append('content')
+
+
+def _starts_block(token, state):
+    def callback(lexer, match, ctx):
+        yield match.start(), token, match.group(0)
+
+        if hasattr(ctx, 'last_indentation'):
+            ctx.block_indentation = ctx.last_indentation
+        else:
+            ctx.block_indentation = ''
+
+        ctx.block_state = state
+        ctx.pos = match.end()
+
+    return callback
+
+
+class SassLexer(ExtendedRegexLexer):
+    """
+    For Sass stylesheets.
+
+    .. versionadded:: 1.3
+    """
+
+    name = 'Sass'
+    aliases = ['sass']
+    filenames = ['*.sass']
+    mimetypes = ['text/x-sass']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'content': [
+            (r'//[^\n]*', _starts_block(Comment.Single, 'single-comment'),
+             'root'),
+            (r'/\*[^\n]*', _starts_block(Comment.Multiline, 'multi-comment'),
+             'root'),
+            (r'@import', Keyword, 'import'),
+            (r'@for', Keyword, 'for'),
+            (r'@(debug|warn|if|while)', Keyword, 'value'),
+            (r'(@mixin)( [\w-]+)', bygroups(Keyword, Name.Function), 'value'),
+            (r'(@include)( [\w-]+)', bygroups(Keyword, Name.Decorator), 'value'),
+            (r'@extend', Keyword, 'selector'),
+            (r'@[\w-]+', Keyword, 'selector'),
+            (r'=[\w-]+', Name.Function, 'value'),
+            (r'\+[\w-]+', Name.Decorator, 'value'),
+            (r'([!$][\w-]\w*)([ \t]*(?:(?:\|\|)?=|:))',
+             bygroups(Name.Variable, Operator), 'value'),
+            (r':', Name.Attribute, 'old-style-attr'),
+            (r'(?=.+?[=:]([^a-z]|$))', Name.Attribute, 'new-style-attr'),
+            default('selector'),
+        ],
+
+        'single-comment': [
+            (r'.+', Comment.Single),
+            (r'\n', Text, 'root'),
+        ],
+
+        'multi-comment': [
+            (r'.+', Comment.Multiline),
+            (r'\n', Text, 'root'),
+        ],
+
+        'import': [
+            (r'[ \t]+', Text),
+            (r'\S+', String),
+            (r'\n', Text, 'root'),
+        ],
+
+        'old-style-attr': [
+            (r'[^\s:="\[]+', Name.Attribute),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r'[ \t]*=', Operator, 'value'),
+            default('value'),
+        ],
+
+        'new-style-attr': [
+            (r'[^\s:="\[]+', Name.Attribute),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r'[ \t]*[=:]', Operator, 'value'),
+        ],
+
+        'inline-comment': [
+            (r"(\\#|#(?=[^\n{])|\*(?=[^\n/])|[^\n#*])+", Comment.Multiline),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r"\*/", Comment, '#pop'),
+        ],
+    }
+    for group, common in iteritems(common_sass_tokens):
+        tokens[group] = copy.copy(common)
+    tokens['value'].append((r'\n', Text, 'root'))
+    tokens['selector'].append((r'\n', Text, 'root'))
+
+
+class ScssLexer(RegexLexer):
+    """
+    For SCSS stylesheets.
+    """
+
+    name = 'SCSS'
+    aliases = ['scss']
+    filenames = ['*.scss']
+    mimetypes = ['text/x-scss']
+
+    flags = re.IGNORECASE | re.DOTALL
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@import', Keyword, 'value'),
+            (r'@for', Keyword, 'for'),
+            (r'@(debug|warn|if|while)', Keyword, 'value'),
+            (r'(@mixin)( [\w-]+)', bygroups(Keyword, Name.Function), 'value'),
+            (r'(@include)( [\w-]+)', bygroups(Keyword, Name.Decorator), 'value'),
+            (r'@extend', Keyword, 'selector'),
+            (r'(@media)(\s+)', bygroups(Keyword, Text), 'value'),
+            (r'@[\w-]+', Keyword, 'selector'),
+            (r'(\$[\w-]*\w)([ \t]*:)', bygroups(Name.Variable, Operator), 'value'),
+            # TODO: broken, and prone to infinite loops.
+            # (r'(?=[^;{}][;}])', Name.Attribute, 'attr'),
+            # (r'(?=[^;{}:]+:[^a-z])', Name.Attribute, 'attr'),
+            default('selector'),
+        ],
+
+        'attr': [
+            (r'[^\s:="\[]+', Name.Attribute),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r'[ \t]*:', Operator, 'value'),
+            default('#pop'),
+        ],
+
+        'inline-comment': [
+            (r"(\\#|#(?=[^{])|\*(?=[^/])|[^#*])+", Comment.Multiline),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r"\*/", Comment, '#pop'),
+        ],
+    }
+    for group, common in iteritems(common_sass_tokens):
+        tokens[group] = copy.copy(common)
+    tokens['value'].extend([(r'\n', Text), (r'[;{}]', Punctuation, '#pop')])
+    tokens['selector'].extend([(r'\n', Text), (r'[;{}]', Punctuation, '#pop')])
+
+
+class LessCssLexer(CssLexer):
+    """
+    For `LESS <http://lesscss.org/>`_ styleshets.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'LessCss'
+    aliases = ['less']
+    filenames = ['*.less']
+    mimetypes = ['text/x-less-css']
+
+    tokens = {
+        'root': [
+            (r'@\w+', Name.Variable),
+            inherit,
+        ],
+        'content': [
+            (r'\{', Punctuation, '#push'),
+            inherit,
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/configs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/configs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/configs.py	(revision 1126)
@@ -0,0 +1,833 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.configs
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for configuration file formats.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, default, words, bygroups, include, using
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace, Literal
+from pygments.lexers.shell import BashLexer
+
+__all__ = ['IniLexer', 'RegeditLexer', 'PropertiesLexer', 'KconfigLexer',
+           'Cfengine3Lexer', 'ApacheConfLexer', 'SquidConfLexer',
+           'NginxConfLexer', 'LighttpdConfLexer', 'DockerLexer',
+           'TerraformLexer', 'TermcapLexer', 'TerminfoLexer',
+           'PkgConfigLexer', 'PacmanConfLexer']
+
+
+class IniLexer(RegexLexer):
+    """
+    Lexer for configuration files in INI style.
+    """
+
+    name = 'INI'
+    aliases = ['ini', 'cfg', 'dosini']
+    filenames = ['*.ini', '*.cfg', '*.inf']
+    mimetypes = ['text/x-ini', 'text/inf']
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'[;#].*', Comment.Single),
+            (r'\[.*?\]$', Keyword),
+            (r'(.*?)([ \t]*)(=)([ \t]*)(.*(?:\n[ \t].+)*)',
+             bygroups(Name.Attribute, Text, Operator, Text, String)),
+            # standalone option, supported by some INI parsers
+            (r'(.+?)$', Name.Attribute),
+        ],
+    }
+
+    def analyse_text(text):
+        npos = text.find('\n')
+        if npos < 3:
+            return False
+        return text[0] == '[' and text[npos-1] == ']'
+
+
+class RegeditLexer(RegexLexer):
+    """
+    Lexer for `Windows Registry
+    <http://en.wikipedia.org/wiki/Windows_Registry#.REG_files>`_ files produced
+    by regedit.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'reg'
+    aliases = ['registry']
+    filenames = ['*.reg']
+    mimetypes = ['text/x-windows-registry']
+
+    tokens = {
+        'root': [
+            (r'Windows Registry Editor.*', Text),
+            (r'\s+', Text),
+            (r'[;#].*', Comment.Single),
+            (r'(\[)(-?)(HKEY_[A-Z_]+)(.*?\])$',
+             bygroups(Keyword, Operator, Name.Builtin, Keyword)),
+            # String keys, which obey somewhat normal escaping
+            (r'("(?:\\"|\\\\|[^"])+")([ \t]*)(=)([ \t]*)',
+             bygroups(Name.Attribute, Text, Operator, Text),
+             'value'),
+            # Bare keys (includes @)
+            (r'(.*?)([ \t]*)(=)([ \t]*)',
+             bygroups(Name.Attribute, Text, Operator, Text),
+             'value'),
+        ],
+        'value': [
+            (r'-', Operator, '#pop'),  # delete value
+            (r'(dword|hex(?:\([0-9a-fA-F]\))?)(:)([0-9a-fA-F,]+)',
+             bygroups(Name.Variable, Punctuation, Number), '#pop'),
+            # As far as I know, .reg files do not support line continuation.
+            (r'.+', String, '#pop'),
+            default('#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        return text.startswith('Windows Registry Editor')
+
+
+class PropertiesLexer(RegexLexer):
+    """
+    Lexer for configuration files in Java's properties format.
+
+    Note: trailing whitespace counts as part of the value as per spec
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'Properties'
+    aliases = ['properties', 'jproperties']
+    filenames = ['*.properties']
+    mimetypes = ['text/x-java-properties']
+
+    tokens = {
+        'root': [
+            (r'^(\w+)([ \t])(\w+\s*)$', bygroups(Name.Attribute, Text, String)),
+            (r'^\w+(\\[ \t]\w*)*$', Name.Attribute),
+            (r'(^ *)([#!].*)', bygroups(Text, Comment)),
+            # More controversial comments
+            (r'(^ *)((?:;|//).*)', bygroups(Text, Comment)),
+            (r'(.*?)([ \t]*)([=:])([ \t]*)(.*(?:(?<=\\)\n.*)*)',
+             bygroups(Name.Attribute, Text, Operator, Text, String)),
+            (r'\s', Text),
+        ],
+    }
+
+
+def _rx_indent(level):
+    # Kconfig *always* interprets a tab as 8 spaces, so this is the default.
+    # Edit this if you are in an environment where KconfigLexer gets expanded
+    # input (tabs expanded to spaces) and the expansion tab width is != 8,
+    # e.g. in connection with Trac (trac.ini, [mimeviewer], tab_width).
+    # Value range here is 2 <= {tab_width} <= 8.
+    tab_width = 8
+    # Regex matching a given indentation {level}, assuming that indentation is
+    # a multiple of {tab_width}. In other cases there might be problems.
+    if tab_width == 2:
+        space_repeat = '+'
+    else:
+        space_repeat = '{1,%d}' % (tab_width - 1)
+    if level == 1:
+        level_repeat = ''
+    else:
+        level_repeat = '{%s}' % level
+    return r'(?:\t| %s\t| {%s})%s.*\n' % (space_repeat, tab_width, level_repeat)
+
+
+class KconfigLexer(RegexLexer):
+    """
+    For Linux-style Kconfig files.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Kconfig'
+    aliases = ['kconfig', 'menuconfig', 'linux-config', 'kernel-config']
+    # Adjust this if new kconfig file names appear in your environment
+    filenames = ['Kconfig', '*Config.in*', 'external.in*',
+                 'standard-modules.in']
+    mimetypes = ['text/x-kconfig']
+    # No re.MULTILINE, indentation-aware help text needs line-by-line handling
+    flags = 0
+
+    def call_indent(level):
+        # If indentation >= {level} is detected, enter state 'indent{level}'
+        return (_rx_indent(level), String.Doc, 'indent%s' % level)
+
+    def do_indent(level):
+        # Print paragraphs of indentation level >= {level} as String.Doc,
+        # ignoring blank lines. Then return to 'root' state.
+        return [
+            (_rx_indent(level), String.Doc),
+            (r'\s*\n', Text),
+            default('#pop:2')
+        ]
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#.*?\n', Comment.Single),
+            (words((
+                'mainmenu', 'config', 'menuconfig', 'choice', 'endchoice',
+                'comment', 'menu', 'endmenu', 'visible if', 'if', 'endif',
+                'source', 'prompt', 'select', 'depends on', 'default',
+                'range', 'option'), suffix=r'\b'),
+             Keyword),
+            (r'(---help---|help)[\t ]*\n', Keyword, 'help'),
+            (r'(bool|tristate|string|hex|int|defconfig_list|modules|env)\b',
+             Name.Builtin),
+            (r'[!=&|]', Operator),
+            (r'[()]', Punctuation),
+            (r'[0-9]+', Number.Integer),
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Double),
+            (r'\S+', Text),
+        ],
+        # Help text is indented, multi-line and ends when a lower indentation
+        # level is detected.
+        'help': [
+            # Skip blank lines after help token, if any
+            (r'\s*\n', Text),
+            # Determine the first help line's indentation level heuristically(!).
+            # Attention: this is not perfect, but works for 99% of "normal"
+            # indentation schemes up to a max. indentation level of 7.
+            call_indent(7),
+            call_indent(6),
+            call_indent(5),
+            call_indent(4),
+            call_indent(3),
+            call_indent(2),
+            call_indent(1),
+            default('#pop'),  # for incomplete help sections without text
+        ],
+        # Handle text for indentation levels 7 to 1
+        'indent7': do_indent(7),
+        'indent6': do_indent(6),
+        'indent5': do_indent(5),
+        'indent4': do_indent(4),
+        'indent3': do_indent(3),
+        'indent2': do_indent(2),
+        'indent1': do_indent(1),
+    }
+
+
+class Cfengine3Lexer(RegexLexer):
+    """
+    Lexer for `CFEngine3 <http://cfengine.org>`_ policy files.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'CFEngine3'
+    aliases = ['cfengine3', 'cf3']
+    filenames = ['*.cf']
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            (r'#.*?\n', Comment),
+            (r'(body)(\s+)(\S+)(\s+)(control)',
+             bygroups(Keyword, Text, Keyword, Text, Keyword)),
+            (r'(body|bundle)(\s+)(\S+)(\s+)(\w+)(\()',
+             bygroups(Keyword, Text, Keyword, Text, Name.Function, Punctuation),
+             'arglist'),
+            (r'(body|bundle)(\s+)(\S+)(\s+)(\w+)',
+             bygroups(Keyword, Text, Keyword, Text, Name.Function)),
+            (r'(")([^"]+)(")(\s+)(string|slist|int|real)(\s*)(=>)(\s*)',
+             bygroups(Punctuation, Name.Variable, Punctuation,
+                      Text, Keyword.Type, Text, Operator, Text)),
+            (r'(\S+)(\s*)(=>)(\s*)',
+             bygroups(Keyword.Reserved, Text, Operator, Text)),
+            (r'"', String, 'string'),
+            (r'(\w+)(\()', bygroups(Name.Function, Punctuation)),
+            (r'([\w.!&|()]+)(::)', bygroups(Name.Class, Punctuation)),
+            (r'(\w+)(:)', bygroups(Keyword.Declaration, Punctuation)),
+            (r'@[{(][^)}]+[})]', Name.Variable),
+            (r'[(){},;]', Punctuation),
+            (r'=>', Operator),
+            (r'->', Operator),
+            (r'\d+\.\d+', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'\w+', Name.Function),
+            (r'\s+', Text),
+        ],
+        'string': [
+            (r'\$[{(]', String.Interpol, 'interpol'),
+            (r'\\.', String.Escape),
+            (r'"', String, '#pop'),
+            (r'\n', String),
+            (r'.', String),
+        ],
+        'interpol': [
+            (r'\$[{(]', String.Interpol, '#push'),
+            (r'[})]', String.Interpol, '#pop'),
+            (r'[^${()}]+', String.Interpol),
+        ],
+        'arglist': [
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'\w+', Name.Variable),
+            (r'\s+', Text),
+        ],
+    }
+
+
+class ApacheConfLexer(RegexLexer):
+    """
+    Lexer for configuration files following the Apache config file
+    format.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'ApacheConf'
+    aliases = ['apacheconf', 'aconf', 'apache']
+    filenames = ['.htaccess', 'apache.conf', 'apache2.conf']
+    mimetypes = ['text/x-apacheconf']
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(#.*?)$', Comment),
+            (r'(<[^\s>]+)(?:(\s+)(.*?))?(>)',
+             bygroups(Name.Tag, Text, String, Name.Tag)),
+            (r'([a-z]\w*)(\s+)',
+             bygroups(Name.Builtin, Text), 'value'),
+            (r'\.+', Text),
+        ],
+        'value': [
+            (r'\\\n', Text),
+            (r'$', Text, '#pop'),
+            (r'\\', Text),
+            (r'[^\S\n]+', Text),
+            (r'\d+\.\d+\.\d+\.\d+(?:/\d+)?', Number),
+            (r'\d+', Number),
+            (r'/([a-z0-9][\w./-]+)', String.Other),
+            (r'(on|off|none|any|all|double|email|dns|min|minimal|'
+             r'os|productonly|full|emerg|alert|crit|error|warn|'
+             r'notice|info|debug|registry|script|inetd|standalone|'
+             r'user|group)\b', Keyword),
+            (r'"([^"\\]*(?:\\.[^"\\]*)*)"', String.Double),
+            (r'[^\s"\\]+', Text)
+        ],
+    }
+
+
+class SquidConfLexer(RegexLexer):
+    """
+    Lexer for `squid <http://www.squid-cache.org/>`_ configuration files.
+
+    .. versionadded:: 0.9
+    """
+
+    name = 'SquidConf'
+    aliases = ['squidconf', 'squid.conf', 'squid']
+    filenames = ['squid.conf']
+    mimetypes = ['text/x-squidconf']
+    flags = re.IGNORECASE
+
+    keywords = (
+        "access_log", "acl", "always_direct", "announce_host",
+        "announce_period", "announce_port", "announce_to", "anonymize_headers",
+        "append_domain", "as_whois_server", "auth_param_basic",
+        "authenticate_children", "authenticate_program", "authenticate_ttl",
+        "broken_posts", "buffered_logs", "cache_access_log", "cache_announce",
+        "cache_dir", "cache_dns_program", "cache_effective_group",
+        "cache_effective_user", "cache_host", "cache_host_acl",
+        "cache_host_domain", "cache_log", "cache_mem", "cache_mem_high",
+        "cache_mem_low", "cache_mgr", "cachemgr_passwd", "cache_peer",
+        "cache_peer_access", "cahce_replacement_policy", "cache_stoplist",
+        "cache_stoplist_pattern", "cache_store_log", "cache_swap",
+        "cache_swap_high", "cache_swap_log", "cache_swap_low", "client_db",
+        "client_lifetime", "client_netmask", "connect_timeout", "coredump_dir",
+        "dead_peer_timeout", "debug_options", "delay_access", "delay_class",
+        "delay_initial_bucket_level", "delay_parameters", "delay_pools",
+        "deny_info", "dns_children", "dns_defnames", "dns_nameservers",
+        "dns_testnames", "emulate_httpd_log", "err_html_text",
+        "fake_user_agent", "firewall_ip", "forwarded_for", "forward_snmpd_port",
+        "fqdncache_size", "ftpget_options", "ftpget_program", "ftp_list_width",
+        "ftp_passive", "ftp_user", "half_closed_clients", "header_access",
+        "header_replace", "hierarchy_stoplist", "high_response_time_warning",
+        "high_page_fault_warning", "hosts_file", "htcp_port", "http_access",
+        "http_anonymizer", "httpd_accel", "httpd_accel_host",
+        "httpd_accel_port", "httpd_accel_uses_host_header",
+        "httpd_accel_with_proxy", "http_port", "http_reply_access",
+        "icp_access", "icp_hit_stale", "icp_port", "icp_query_timeout",
+        "ident_lookup", "ident_lookup_access", "ident_timeout",
+        "incoming_http_average", "incoming_icp_average", "inside_firewall",
+        "ipcache_high", "ipcache_low", "ipcache_size", "local_domain",
+        "local_ip", "logfile_rotate", "log_fqdn", "log_icp_queries",
+        "log_mime_hdrs", "maximum_object_size", "maximum_single_addr_tries",
+        "mcast_groups", "mcast_icp_query_timeout", "mcast_miss_addr",
+        "mcast_miss_encode_key", "mcast_miss_port", "memory_pools",
+        "memory_pools_limit", "memory_replacement_policy", "mime_table",
+        "min_http_poll_cnt", "min_icp_poll_cnt", "minimum_direct_hops",
+        "minimum_object_size", "minimum_retry_timeout", "miss_access",
+        "negative_dns_ttl", "negative_ttl", "neighbor_timeout",
+        "neighbor_type_domain", "netdb_high", "netdb_low", "netdb_ping_period",
+        "netdb_ping_rate", "never_direct", "no_cache", "passthrough_proxy",
+        "pconn_timeout", "pid_filename", "pinger_program", "positive_dns_ttl",
+        "prefer_direct", "proxy_auth", "proxy_auth_realm", "query_icmp",
+        "quick_abort", "quick_abort_max", "quick_abort_min",
+        "quick_abort_pct", "range_offset_limit", "read_timeout",
+        "redirect_children", "redirect_program",
+        "redirect_rewrites_host_header", "reference_age",
+        "refresh_pattern", "reload_into_ims", "request_body_max_size",
+        "request_size", "request_timeout", "shutdown_lifetime",
+        "single_parent_bypass", "siteselect_timeout", "snmp_access",
+        "snmp_incoming_address", "snmp_port", "source_ping", "ssl_proxy",
+        "store_avg_object_size", "store_objects_per_bucket",
+        "strip_query_terms", "swap_level1_dirs", "swap_level2_dirs",
+        "tcp_incoming_address", "tcp_outgoing_address", "tcp_recv_bufsize",
+        "test_reachability", "udp_hit_obj", "udp_hit_obj_size",
+        "udp_incoming_address", "udp_outgoing_address", "unique_hostname",
+        "unlinkd_program", "uri_whitespace", "useragent_log",
+        "visible_hostname", "wais_relay", "wais_relay_host", "wais_relay_port",
+    )
+
+    opts = (
+        "proxy-only", "weight", "ttl", "no-query", "default", "round-robin",
+        "multicast-responder", "on", "off", "all", "deny", "allow", "via",
+        "parent", "no-digest", "heap", "lru", "realm", "children", "q1", "q2",
+        "credentialsttl", "none", "disable", "offline_toggle", "diskd",
+    )
+
+    actions = (
+        "shutdown", "info", "parameter", "server_list", "client_list",
+        r'squid.conf',
+    )
+
+    actions_stats = (
+        "objects", "vm_objects", "utilization", "ipcache", "fqdncache", "dns",
+        "redirector", "io", "reply_headers", "filedescriptors", "netdb",
+    )
+
+    actions_log = ("status", "enable", "disable", "clear")
+
+    acls = (
+        "url_regex", "urlpath_regex", "referer_regex", "port", "proto",
+        "req_mime_type", "rep_mime_type", "method", "browser", "user", "src",
+        "dst", "time", "dstdomain", "ident", "snmp_community",
+    )
+
+    ip_re = (
+        r'(?:(?:(?:[3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}|0x0*[0-9a-f]{1,2}|'
+        r'0+[1-3]?[0-7]{0,2})(?:\.(?:[3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}|'
+        r'0x0*[0-9a-f]{1,2}|0+[1-3]?[0-7]{0,2})){3})|(?!.*::.*::)(?:(?!:)|'
+        r':(?=:))(?:[0-9a-f]{0,4}(?:(?<=::)|(?<!::):)){6}(?:[0-9a-f]{0,4}'
+        r'(?:(?<=::)|(?<!::):)[0-9a-f]{0,4}(?:(?<=::)|(?<!:)|(?<=:)(?<!::):)|'
+        r'(?:25[0-4]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-4]|2[0-4]\d|1\d\d|'
+        r'[1-9]?\d)){3}))'
+    )
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#', Comment, 'comment'),
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(opts, prefix=r'\b', suffix=r'\b'), Name.Constant),
+            # Actions
+            (words(actions, prefix=r'\b', suffix=r'\b'), String),
+            (words(actions_stats, prefix=r'stats/', suffix=r'\b'), String),
+            (words(actions_log, prefix=r'log/', suffix=r'='), String),
+            (words(acls, prefix=r'\b', suffix=r'\b'), Keyword),
+            (ip_re + r'(?:/(?:' + ip_re + r'|\b\d+\b))?', Number.Float),
+            (r'(?:\b\d+\b(?:-\b\d+|%)?)', Number),
+            (r'\S+', Text),
+        ],
+        'comment': [
+            (r'\s*TAG:.*', String.Escape, '#pop'),
+            (r'.+', Comment, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class NginxConfLexer(RegexLexer):
+    """
+    Lexer for `Nginx <http://nginx.net/>`_ configuration files.
+
+    .. versionadded:: 0.11
+    """
+    name = 'Nginx configuration file'
+    aliases = ['nginx']
+    filenames = ['nginx.conf']
+    mimetypes = ['text/x-nginx-conf']
+
+    tokens = {
+        'root': [
+            (r'(include)(\s+)([^\s;]+)', bygroups(Keyword, Text, Name)),
+            (r'[^\s;#]+', Keyword, 'stmt'),
+            include('base'),
+        ],
+        'block': [
+            (r'\}', Punctuation, '#pop:2'),
+            (r'[^\s;#]+', Keyword.Namespace, 'stmt'),
+            include('base'),
+        ],
+        'stmt': [
+            (r'\{', Punctuation, 'block'),
+            (r';', Punctuation, '#pop'),
+            include('base'),
+        ],
+        'base': [
+            (r'#.*\n', Comment.Single),
+            (r'on|off', Name.Constant),
+            (r'\$[^\s;#()]+', Name.Variable),
+            (r'([a-z0-9.-]+)(:)([0-9]+)',
+             bygroups(Name, Punctuation, Number.Integer)),
+            (r'[a-z-]+/[a-z-+]+', String),  # mimetype
+            # (r'[a-zA-Z._-]+', Keyword),
+            (r'[0-9]+[km]?\b', Number.Integer),
+            (r'(~)(\s*)([^\s{]+)', bygroups(Punctuation, Text, String.Regex)),
+            (r'[:=~]', Punctuation),
+            (r'[^\s;#{}$]+', String),  # catch all
+            (r'/[^\s;#]*', Name),  # pathname
+            (r'\s+', Text),
+            (r'[$;]', Text),  # leftover characters
+        ],
+    }
+
+
+class LighttpdConfLexer(RegexLexer):
+    """
+    Lexer for `Lighttpd <http://lighttpd.net/>`_ configuration files.
+
+    .. versionadded:: 0.11
+    """
+    name = 'Lighttpd configuration file'
+    aliases = ['lighty', 'lighttpd']
+    filenames = []
+    mimetypes = ['text/x-lighttpd-conf']
+
+    tokens = {
+        'root': [
+            (r'#.*\n', Comment.Single),
+            (r'/\S*', Name),  # pathname
+            (r'[a-zA-Z._-]+', Keyword),
+            (r'\d+\.\d+\.\d+\.\d+(?:/\d+)?', Number),
+            (r'[0-9]+', Number),
+            (r'=>|=~|\+=|==|=|\+', Operator),
+            (r'\$[A-Z]+', Name.Builtin),
+            (r'[(){}\[\],]', Punctuation),
+            (r'"([^"\\]*(?:\\.[^"\\]*)*)"', String.Double),
+            (r'\s+', Text),
+        ],
+
+    }
+
+
+class DockerLexer(RegexLexer):
+    """
+    Lexer for `Docker <http://docker.io>`_ configuration files.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Docker'
+    aliases = ['docker', 'dockerfile']
+    filenames = ['Dockerfile', '*.docker']
+    mimetypes = ['text/x-dockerfile-config']
+
+    _keywords = (r'(?:FROM|MAINTAINER|CMD|EXPOSE|ENV|ADD|ENTRYPOINT|'
+                 r'VOLUME|WORKDIR)')
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'^(ONBUILD)(\s+)(%s)\b' % (_keywords,),
+             bygroups(Name.Keyword, Whitespace, Keyword)),
+            (r'^(%s)\b(.*)' % (_keywords,), bygroups(Keyword, String)),
+            (r'#.*', Comment),
+            (r'RUN', Keyword),  # Rest of line falls through
+            (r'(.*\\\n)*.+', using(BashLexer)),
+        ],
+    }
+
+
+class TerraformLexer(RegexLexer):
+    """
+    Lexer for `terraformi .tf files <https://www.terraform.io/>`_.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Terraform'
+    aliases = ['terraform', 'tf']
+    filenames = ['*.tf']
+    mimetypes = ['application/x-tf', 'application/x-terraform']
+
+    tokens = {
+        'root': [
+             include('string'),
+             include('punctuation'),
+             include('curly'),
+             include('basic'),
+             include('whitespace'),
+             (r'[0-9]+', Number),
+        ],
+        'basic': [
+             (words(('true', 'false'), prefix=r'\b', suffix=r'\b'), Keyword.Type),
+             (r'\s*/\*', Comment.Multiline, 'comment'),
+             (r'\s*#.*\n', Comment.Single),
+             (r'(.*?)(\s*)(=)', bygroups(Name.Attribute, Text, Operator)),
+             (words(('variable', 'resource', 'provider', 'provisioner', 'module'),
+                    prefix=r'\b', suffix=r'\b'), Keyword.Reserved, 'function'),
+             (words(('ingress', 'egress', 'listener', 'default', 'connection'),
+                    prefix=r'\b', suffix=r'\b'), Keyword.Declaration),
+             ('\$\{', String.Interpol, 'var_builtin'),
+        ],
+        'function': [
+             (r'(\s+)(".*")(\s+)', bygroups(Text, String, Text)),
+             include('punctuation'),
+             include('curly'),
+        ],
+        'var_builtin': [
+            (r'\$\{', String.Interpol, '#push'),
+            (words(('concat', 'file', 'join', 'lookup', 'element'),
+                   prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            include('string'),
+            include('punctuation'),
+            (r'\s+', Text),
+            (r'\}', String.Interpol, '#pop'),
+        ],
+        'string': [
+            (r'(".*")', bygroups(String.Double)),
+        ],
+        'punctuation': [
+            (r'[\[\](),.]', Punctuation),
+        ],
+        # Keep this seperate from punctuation - we sometimes want to use different
+        # Tokens for { }
+        'curly': [
+            (r'\{', Text.Punctuation),
+            (r'\}', Text.Punctuation),
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'whitespace': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),
+        ],
+    }
+
+
+class TermcapLexer(RegexLexer):
+    """
+    Lexer for termcap database source.
+
+    This is very simple and minimal.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Termcap'
+    aliases = ['termcap']
+    filenames = ['termcap', 'termcap.src']
+    mimetypes = []
+
+    # NOTE:
+    #   * multiline with trailing backslash
+    #   * separator is ':'
+    #   * to embed colon as data, we must use \072
+    #   * space after separator is not allowed (mayve)
+    tokens = {
+        'root': [
+            (r'^#.*$', Comment),
+            (r'^[^\s#:|]+', Name.Tag, 'names'),
+        ],
+        'names': [
+            (r'\n', Text, '#pop'),
+            (r':', Punctuation, 'defs'),
+            (r'\|', Punctuation),
+            (r'[^:|]+', Name.Attribute),
+        ],
+        'defs': [
+            (r'\\\n[ \t]*', Text),
+            (r'\n[ \t]*', Text, '#pop:2'),
+            (r'(#)([0-9]+)', bygroups(Operator, Number)),
+            (r'=', Operator, 'data'),
+            (r':', Punctuation),
+            (r'[^\s:=#]+', Name.Class),
+        ],
+        'data': [
+            (r'\\072', Literal),
+            (r':', Punctuation, '#pop'),
+            (r'[^:\\]+', Literal),  # for performance
+            (r'.', Literal),
+        ],
+    }
+
+
+class TerminfoLexer(RegexLexer):
+    """
+    Lexer for terminfo database source.
+
+    This is very simple and minimal.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Terminfo'
+    aliases = ['terminfo']
+    filenames = ['terminfo', 'terminfo.src']
+    mimetypes = []
+
+    # NOTE:
+    #   * multiline with leading whitespace
+    #   * separator is ','
+    #   * to embed comma as data, we can use \,
+    #   * space after separator is allowed
+    tokens = {
+        'root': [
+            (r'^#.*$', Comment),
+            (r'^[^\s#,|]+', Name.Tag, 'names'),
+        ],
+        'names': [
+            (r'\n', Text, '#pop'),
+            (r'(,)([ \t]*)', bygroups(Punctuation, Text), 'defs'),
+            (r'\|', Punctuation),
+            (r'[^,|]+', Name.Attribute),
+        ],
+        'defs': [
+            (r'\n[ \t]+', Text),
+            (r'\n', Text, '#pop:2'),
+            (r'(#)([0-9]+)', bygroups(Operator, Number)),
+            (r'=', Operator, 'data'),
+            (r'(,)([ \t]*)', bygroups(Punctuation, Text)),
+            (r'[^\s,=#]+', Name.Class),
+        ],
+        'data': [
+            (r'\\[,\\]', Literal),
+            (r'(,)([ \t]*)', bygroups(Punctuation, Text), '#pop'),
+            (r'[^\\,]+', Literal),  # for performance
+            (r'.', Literal),
+        ],
+    }
+
+
+class PkgConfigLexer(RegexLexer):
+    """
+    Lexer for `pkg-config
+    <http://www.freedesktop.org/wiki/Software/pkg-config/>`_
+    (see also `manual page <http://linux.die.net/man/1/pkg-config>`_).
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'PkgConfig'
+    aliases = ['pkgconfig']
+    filenames = ['*.pc']
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            (r'#.*$', Comment.Single),
+
+            # variable definitions
+            (r'^(\w+)(=)', bygroups(Name.Attribute, Operator)),
+
+            # keyword lines
+            (r'^([\w.]+)(:)',
+             bygroups(Name.Tag, Punctuation), 'spvalue'),
+
+            # variable references
+            include('interp'),
+
+            # fallback
+            (r'[^${}#=:\n.]+', Text),
+            (r'.', Text),
+        ],
+        'interp': [
+            # you can escape literal "$" as "$$"
+            (r'\$\$', Text),
+
+            # variable references
+            (r'\$\{', String.Interpol, 'curly'),
+        ],
+        'curly': [
+            (r'\}', String.Interpol, '#pop'),
+            (r'\w+', Name.Attribute),
+        ],
+        'spvalue': [
+            include('interp'),
+
+            (r'#.*$', Comment.Single, '#pop'),
+            (r'\n', Text, '#pop'),
+
+            # fallback
+            (r'[^${}#\n]+', Text),
+            (r'.', Text),
+        ],
+    }
+
+
+class PacmanConfLexer(RegexLexer):
+    """
+    Lexer for `pacman.conf
+    <https://www.archlinux.org/pacman/pacman.conf.5.html>`_.
+
+    Actually, IniLexer works almost fine for this format,
+    but it yield error token. It is because pacman.conf has
+    a form without assignment like:
+
+        UseSyslog
+        Color
+        TotalDownload
+        CheckSpace
+        VerbosePkgLists
+
+    These are flags to switch on.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'PacmanConf'
+    aliases = ['pacmanconf']
+    filenames = ['pacman.conf']
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            # comment
+            (r'#.*$', Comment.Single),
+
+            # section header
+            (r'^\s*\[.*?\]\s*$', Keyword),
+
+            # variable definitions
+            # (Leading space is allowed...)
+            (r'(\w+)(\s*)(=)',
+             bygroups(Name.Attribute, Text, Operator)),
+
+            # flags to on
+            (r'^(\s*)(\w+)(\s*)$',
+             bygroups(Text, Name.Attribute, Text)),
+
+            # built-in special values
+            (words((
+                '$repo',  # repository
+                '$arch',  # architecture
+                '%o',     # outfile
+                '%u',     # url
+                ), suffix=r'\b'),
+             Name.Variable),
+
+            # fallback
+            (r'.', Text),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nimrod.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nimrod.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nimrod.py	(revision 1126)
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.nimrod
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Nim language (formerly known as Nimrod).
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['NimrodLexer']
+
+
+class NimrodLexer(RegexLexer):
+    """
+    For `Nim <http://nim-lang.org/>`_ source code.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Nimrod'
+    aliases = ['nim', 'nimrod']
+    filenames = ['*.nim', '*.nimrod']
+    mimetypes = ['text/x-nim']
+
+    flags = re.MULTILINE | re.IGNORECASE | re.UNICODE
+
+    def underscorize(words):
+        newWords = []
+        new = ""
+        for word in words:
+            for ch in word:
+                new += (ch + "_?")
+            newWords.append(new)
+            new = ""
+        return "|".join(newWords)
+
+    keywords = [
+        'addr', 'and', 'as', 'asm', 'atomic', 'bind', 'block', 'break', 'case',
+        'cast', 'concept', 'const', 'continue', 'converter', 'defer', 'discard',
+        'distinct', 'div', 'do', 'elif', 'else', 'end', 'enum', 'except',
+        'export', 'finally', 'for', 'func', 'if', 'in', 'yield', 'interface',
+        'is', 'isnot', 'iterator', 'let', 'macro', 'method', 'mixin', 'mod',
+        'not', 'notin', 'object', 'of', 'or', 'out', 'proc', 'ptr', 'raise',
+        'ref', 'return', 'shared', 'shl', 'shr', 'static', 'template', 'try',
+        'tuple', 'type', 'when', 'while', 'with', 'without', 'xor'
+    ]
+
+    keywordsPseudo = [
+        'nil', 'true', 'false'
+    ]
+
+    opWords = [
+        'and', 'or', 'not', 'xor', 'shl', 'shr', 'div', 'mod', 'in',
+        'notin', 'is', 'isnot'
+    ]
+
+    types = [
+        'int', 'int8', 'int16', 'int32', 'int64', 'float', 'float32', 'float64',
+        'bool', 'char', 'range', 'array', 'seq', 'set', 'string'
+    ]
+
+    tokens = {
+        'root': [
+            (r'##.*$', String.Doc),
+            (r'#.*$', Comment),
+            (r'[*=><+\-/@$~&%!?|\\\[\]]', Operator),
+            (r'\.\.|\.|,|\[\.|\.\]|\{\.|\.\}|\(\.|\.\)|\{|\}|\(|\)|:|\^|`|;',
+             Punctuation),
+
+            # Strings
+            (r'(?:[\w]+)"', String, 'rdqs'),
+            (r'"""', String, 'tdqs'),
+            ('"', String, 'dqs'),
+
+            # Char
+            ("'", String.Char, 'chars'),
+
+            # Keywords
+            (r'(%s)\b' % underscorize(opWords), Operator.Word),
+            (r'(p_?r_?o_?c_?\s)(?![(\[\]])', Keyword, 'funcname'),
+            (r'(%s)\b' % underscorize(keywords), Keyword),
+            (r'(%s)\b' % underscorize(['from', 'import', 'include']),
+             Keyword.Namespace),
+            (r'(v_?a_?r)\b', Keyword.Declaration),
+            (r'(%s)\b' % underscorize(types), Keyword.Type),
+            (r'(%s)\b' % underscorize(keywordsPseudo), Keyword.Pseudo),
+            # Identifiers
+            (r'\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*', Name),
+            # Numbers
+            (r'[0-9][0-9_]*(?=([e.]|\'f(32|64)))',
+             Number.Float, ('float-suffix', 'float-number')),
+            (r'0x[a-f0-9][a-f0-9_]*', Number.Hex, 'int-suffix'),
+            (r'0b[01][01_]*', Number.Bin, 'int-suffix'),
+            (r'0o[0-7][0-7_]*', Number.Oct, 'int-suffix'),
+            (r'[0-9][0-9_]*', Number.Integer, 'int-suffix'),
+            # Whitespace
+            (r'\s+', Text),
+            (r'.+$', Error),
+        ],
+        'chars': [
+            (r'\\([\\abcefnrtvl"\']|x[a-f0-9]{2}|[0-9]{1,3})', String.Escape),
+            (r"'", String.Char, '#pop'),
+            (r".", String.Char)
+        ],
+        'strings': [
+            (r'(?<!\$)\$(\d+|#|\w+)+', String.Interpol),
+            (r'[^\\\'"$\n]+', String),
+            # quotes, dollars and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'\$', String)
+            # newlines are an error (use "nl" state)
+        ],
+        'dqs': [
+            (r'\\([\\abcefnrtvl"\']|\n|x[a-f0-9]{2}|[0-9]{1,3})',
+             String.Escape),
+            (r'"', String, '#pop'),
+            include('strings')
+        ],
+        'rdqs': [
+            (r'"(?!")', String, '#pop'),
+            (r'""', String.Escape),
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""(?!")', String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+        'funcname': [
+            (r'((?![\d_])\w)(((?!_)\w)|(_(?!_)\w))*', Name.Function, '#pop'),
+            (r'`.+`', Name.Function, '#pop')
+        ],
+        'nl': [
+            (r'\n', String)
+        ],
+        'float-number': [
+            (r'\.(?!\.)[0-9_]*', Number.Float),
+            (r'e[+-]?[0-9][0-9_]*', Number.Float),
+            default('#pop')
+        ],
+        'float-suffix': [
+            (r'\'f(32|64)', Number.Float),
+            default('#pop')
+        ],
+        'int-suffix': [
+            (r'\'i(32|64)', Number.Integer.Long),
+            (r'\'i(8|16)', Number.Integer),
+            default('#pop')
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/compiled.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/compiled.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/compiled.py	(revision 1126)
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.compiled
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexers.jvm import JavaLexer, ScalaLexer
+from pygments.lexers.c_cpp import CLexer, CppLexer
+from pygments.lexers.d import DLexer
+from pygments.lexers.objective import ObjectiveCLexer, \
+    ObjectiveCppLexer, LogosLexer
+from pygments.lexers.go import GoLexer
+from pygments.lexers.rust import RustLexer
+from pygments.lexers.c_like import ECLexer, ValaLexer, CudaLexer
+from pygments.lexers.pascal import DelphiLexer, Modula2Lexer, AdaLexer
+from pygments.lexers.business import CobolLexer, CobolFreeformatLexer
+from pygments.lexers.fortran import FortranLexer
+from pygments.lexers.prolog import PrologLexer
+from pygments.lexers.python import CythonLexer
+from pygments.lexers.graphics import GLShaderLexer
+from pygments.lexers.ml import OcamlLexer
+from pygments.lexers.basic import BlitzBasicLexer, BlitzMaxLexer, MonkeyLexer
+from pygments.lexers.dylan import DylanLexer, DylanLidLexer, DylanConsoleLexer
+from pygments.lexers.ooc import OocLexer
+from pygments.lexers.felix import FelixLexer
+from pygments.lexers.nimrod import NimrodLexer
+from pygments.lexers.crystal import CrystalLexer
+
+__all__ = []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_cocoa_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_cocoa_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_cocoa_builtins.py	(revision 1126)
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._cocoa_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file defines a set of types used across Cocoa frameworks from Apple.
+    There is a list of @interfaces, @protocols and some other (structs, unions)
+
+    File may be also used as standalone generator for aboves.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+COCOA_INTERFACES = set(['UITableViewCell', 'HKCorrelationQuery', 'NSURLSessionDataTask', 'PHFetchOptions', 'NSLinguisticTagger', 'NSStream', 'AVAudioUnitDelay', 'GCMotion', 'SKPhysicsWorld', 'NSString', 'CMAttitude', 'AVAudioEnvironmentDistanceAttenuationParameters', 'HKStatisticsCollection', 'SCNPlane', 'CBPeer', 'JSContext', 'SCNTransaction', 'SCNTorus', 'AVAudioUnitEffect', 'UICollectionReusableView', 'MTLSamplerDescriptor', 'AVAssetReaderSampleReferenceOutput', 'AVMutableCompositionTrack', 'GKLeaderboard', 'NSFetchedResultsController', 'SKRange', 'MKTileOverlayRenderer', 'MIDINetworkSession', 'UIVisualEffectView', 'CIWarpKernel', 'PKObject', 'MKRoute', 'MPVolumeView', 'UIPrintInfo', 'SCNText', 'ADClient', 'PKPayment', 'AVMutableAudioMix', 'GLKEffectPropertyLight', 'WKScriptMessage', 'AVMIDIPlayer', 'PHCollectionListChangeRequest', 'UICollectionViewLayout', 'NSMutableCharacterSet', 'SKPaymentTransaction', 'NEOnDemandRuleConnect', 'NSShadow', 'SCNView', 'NSURLSessionConfiguration', 'MTLVertexAttributeDescriptor', 'CBCharacteristic', 'HKQuantityType', 'CKLocationSortDescriptor', 'NEVPNIKEv2SecurityAssociationParameters', 'CMStepCounter', 'NSNetService', 'AVAssetWriterInputMetadataAdaptor', 'UICollectionView', 'UIViewPrintFormatter', 'SCNLevelOfDetail', 'CAShapeLayer', 'MCPeerID', 'MPRatingCommand', 'WKNavigation', 'NSDictionary', 'NSFileVersion', 'CMGyroData', 'AVAudioUnitDistortion', 'CKFetchRecordsOperation', 'SKPhysicsJointSpring', 'SCNHitTestResult', 'AVAudioTime', 'CIFilter', 'UIView', 'SCNConstraint', 'CAPropertyAnimation', 'MKMapItem', 'MPRemoteCommandCenter', 'PKPaymentSummaryItem', 'UICollectionViewFlowLayoutInvalidationContext', 'UIInputViewController', 'PKPass', 'SCNPhysicsBehavior', 'MTLRenderPassColorAttachmentDescriptor', 'MKPolygonRenderer', 'CKNotification', 'JSValue', 'PHCollectionList', 'CLGeocoder', 'NSByteCountFormatter', 'AVCaptureScreenInput', 'MPFeedbackCommand', 'CAAnimation', 'MKOverlayPathView', 'UIActionSheet', 'UIMotionEffectGroup', 'NSLengthFormatter', 'UIBarItem', 'SKProduct', 'AVAssetExportSession', 'NSKeyedUnarchiver', 'NSMutableSet', 'SCNPyramid', 'PHAssetCollection', 'MKMapView', 'HMHomeManager', 'CATransition', 'MTLCompileOptions', 'UIVibrancyEffect', 'CLCircularRegion', 'MKTileOverlay', 'SCNShape', 'ACAccountCredential', 'SKPhysicsJointLimit', 'MKMapSnapshotter', 'AVMediaSelectionGroup', 'NSIndexSet', 'CBPeripheralManager', 'CKRecordZone', 'AVAudioRecorder', 'NSURL', 'CBCentral', 'NSNumber', 'AVAudioOutputNode', 'MTLVertexAttributeDescriptorArray', 'MKETAResponse', 'SKTransition', 'SSReadingList', 'HKSourceQuery', 'UITableViewRowAction', 'UITableView', 'SCNParticlePropertyController', 'AVCaptureStillImageOutput', 'GCController', 'AVAudioPlayerNode', 'AVAudioSessionPortDescription', 'NSHTTPURLResponse', 'NEOnDemandRuleEvaluateConnection', 'SKEffectNode', 'HKQuantity', 'GCControllerElement', 'AVPlayerItemAccessLogEvent', 'SCNBox', 'NSExtensionContext', 'MKOverlayRenderer', 'SCNPhysicsVehicle', 'NSDecimalNumber', 'EKReminder', 'MKPolylineView', 'CKQuery', 'AVAudioMixerNode', 'GKAchievementDescription', 'EKParticipant', 'NSBlockOperation', 'UIActivityItemProvider', 'CLLocation', 'NSBatchUpdateRequest', 'PHContentEditingOutput', 'PHObjectChangeDetails', 'HKWorkoutType', 'MPMoviePlayerController', 'AVAudioFormat', 'HMTrigger', 'MTLRenderPassDepthAttachmentDescriptor', 'SCNRenderer', 'GKScore', 'UISplitViewController', 'HKSource', 'NSURLConnection', 'ABUnknownPersonViewController', 'SCNTechnique', 'UIMenuController', 'NSEvent', 'SKTextureAtlas', 'NSKeyedArchiver', 'GKLeaderboardSet', 'NSSimpleCString', 'AVAudioPCMBuffer', 'CBATTRequest', 'GKMatchRequest', 'AVMetadataObject', 'SKProductsRequest', 'UIAlertView', 'NSIncrementalStore', 'MFMailComposeViewController', 'SCNFloor', 'NSSortDescriptor', 'CKFetchNotificationChangesOperation', 'MPMovieAccessLog', 'NSManagedObjectContext', 'AVAudioUnitGenerator', 'WKBackForwardList', 'SKMutableTexture', 'AVCaptureAudioDataOutput', 'ACAccount', 'AVMetadataItem', 'MPRatingCommandEvent', 'AVCaptureDeviceInputSource', 'CLLocationManager', 'MPRemoteCommand', 'AVCaptureSession', 'UIStepper', 'UIRefreshControl', 'NEEvaluateConnectionRule', 'CKModifyRecordsOperation', 'UICollectionViewTransitionLayout', 'CBCentralManager', 'NSPurgeableData', 'PKShippingMethod', 'SLComposeViewController', 'NSHashTable', 'MKUserTrackingBarButtonItem', 'UILexiconEntry', 'CMMotionActivity', 'SKAction', 'SKShader', 'AVPlayerItemOutput', 'MTLRenderPassAttachmentDescriptor', 'UIDocumentInteractionController', 'UIDynamicItemBehavior', 'NSMutableDictionary', 'UILabel', 'AVCaptureInputPort', 'NSExpression', 'CAInterAppAudioTransportView', 'SKMutablePayment', 'UIImage', 'PHCachingImageManager', 'SCNTransformConstraint', 'HKCorrelationType', 'UIColor', 'SCNGeometrySource', 'AVCaptureAutoExposureBracketedStillImageSettings', 'UIPopoverBackgroundView', 'UIToolbar', 'NSNotificationCenter', 'UICollectionViewLayoutAttributes', 'AVAssetReaderOutputMetadataAdaptor', 'NSEntityMigrationPolicy', 'HMUser', 'NSLocale', 'NSURLSession', 'SCNCamera', 'NSTimeZone', 'UIManagedDocument', 'AVMutableVideoCompositionLayerInstruction', 'AVAssetTrackGroup', 'NSInvocationOperation', 'ALAssetRepresentation', 'AVQueuePlayer', 'HMServiceGroup', 'UIPasteboard', 'PHContentEditingInput', 'NSLayoutManager', 'EKCalendarChooser', 'EKObject', 'CATiledLayer', 'GLKReflectionMapEffect', 'NSManagedObjectID', 'NSEnergyFormatter', 'SLRequest', 'HMCharacteristic', 'AVPlayerLayer', 'MTLRenderPassDescriptor', 'SKPayment', 'NSPointerArray', 'AVAudioMix', 'SCNLight', 'MCAdvertiserAssistant', 'MKMapSnapshotOptions', 'HKCategorySample', 'AVAudioEnvironmentReverbParameters', 'SCNMorpher', 'AVTimedMetadataGroup', 'CBMutableCharacteristic', 'NSFetchRequest', 'UIDevice', 'NSManagedObject', 'NKAssetDownload', 'AVOutputSettingsAssistant', 'SKPhysicsJointPin', 'UITabBar', 'UITextInputMode', 'NSFetchRequestExpression', 'HMActionSet', 'CTSubscriber', 'PHAssetChangeRequest', 'NSPersistentStoreRequest', 'UITabBarController', 'HKQuantitySample', 'AVPlayerItem', 'AVSynchronizedLayer', 'MKDirectionsRequest', 'NSMetadataItem', 'UIPresentationController', 'UINavigationItem', 'PHFetchResultChangeDetails', 'PHImageManager', 'AVCaptureManualExposureBracketedStillImageSettings', 'UIStoryboardPopoverSegue', 'SCNLookAtConstraint', 'UIGravityBehavior', 'UIWindow', 'CBMutableDescriptor', 'NEOnDemandRuleDisconnect', 'UIBezierPath', 'UINavigationController', 'ABPeoplePickerNavigationController', 'EKSource', 'AVAssetWriterInput', 'AVPlayerItemTrack', 'GLKEffectPropertyTexture', 'NSHTTPCookie', 'NSURLResponse', 'SKPaymentQueue', 'NSAssertionHandler', 'MKReverseGeocoder', 'GCControllerAxisInput', 'NSArray', 'NSOrthography', 'NSURLSessionUploadTask', 'NSCharacterSet', 'AVMutableVideoCompositionInstruction', 'AVAssetReaderOutput', 'EAGLContext', 'WKFrameInfo', 'CMPedometer', 'MyClass', 'CKModifyBadgeOperation', 'AVCaptureAudioFileOutput', 'SKEmitterNode', 'NSMachPort', 'AVVideoCompositionCoreAnimationTool', 'PHCollection', 'SCNPhysicsWorld', 'NSURLRequest', 'CMAccelerometerData', 'NSNetServiceBrowser', 'CLFloor', 'AVAsynchronousVideoCompositionRequest', 'SCNGeometry', 'SCNIKConstraint', 'CIKernel', 'CAGradientLayer', 'HKCharacteristicType', 'NSFormatter', 'SCNAction', 'CATransaction', 'CBUUID', 'UIStoryboard', 'MPMediaLibrary', 'UITapGestureRecognizer', 'MPMediaItemArtwork', 'NSURLSessionTask', 'AVAudioUnit', 'MCBrowserViewController', 'UIFontDescriptor', 'NSRelationshipDescription', 'HKSample', 'WKWebView', 'NSMutableAttributedString', 'NSPersistentStoreAsynchronousResult', 'MPNowPlayingInfoCenter', 'MKLocalSearch', 'EAAccessory', 'HKCorrelation', 'CATextLayer', 'NSNotificationQueue', 'UINib', 'GLKTextureLoader', 'HKObjectType', 'NSValue', 'NSMutableIndexSet', 'SKPhysicsContact', 'NSProgress', 'AVPlayerViewController', 'CAScrollLayer', 'GKSavedGame', 'NSTextCheckingResult', 'PHObjectPlaceholder', 'SKConstraint', 'EKEventEditViewController', 'NSEntityDescription', 'NSURLCredentialStorage', 'UIApplication', 'SKDownload', 'SCNNode', 'MKLocalSearchRequest', 'SKScene', 'UISearchDisplayController', 'NEOnDemandRule', 'MTLRenderPassStencilAttachmentDescriptor', 'CAReplicatorLayer', 'UIPrintPageRenderer', 'EKCalendarItem', 'NSUUID', 'EAAccessoryManager', 'NEOnDemandRuleIgnore', 'SKRegion', 'AVAssetResourceLoader', 'EAWiFiUnconfiguredAccessoryBrowser', 'NSUserActivity', 'CTCall', 'UIPrinterPickerController', 'CIVector', 'UINavigationBar', 'UIPanGestureRecognizer', 'MPMediaQuery', 'ABNewPersonViewController', 'CKRecordZoneID', 'HKAnchoredObjectQuery', 'CKFetchRecordZonesOperation', 'UIStoryboardSegue', 'ACAccountType', 'GKSession', 'SKVideoNode', 'PHChange', 'SKReceiptRefreshRequest', 'GCExtendedGamepadSnapshot', 'MPSeekCommandEvent', 'GCExtendedGamepad', 'CAValueFunction', 'SCNCylinder', 'NSNotification', 'NSBatchUpdateResult', 'PKPushCredentials', 'SCNPhysicsSliderJoint', 'AVCaptureDeviceFormat', 'AVPlayerItemErrorLog', 'NSMapTable', 'NSSet', 'CMMotionManager', 'GKVoiceChatService', 'UIPageControl', 'UILexicon', 'MTLArrayType', 'AVAudioUnitReverb', 'MKGeodesicPolyline', 'AVMutableComposition', 'NSLayoutConstraint', 'UIPrinter', 'NSOrderedSet', 'CBAttribute', 'PKPushPayload', 'NSIncrementalStoreNode', 'EKEventStore', 'MPRemoteCommandEvent', 'UISlider', 'UIBlurEffect', 'CKAsset', 'AVCaptureInput', 'AVAudioEngine', 'MTLVertexDescriptor', 'SKPhysicsBody', 'NSOperation', 'PKPaymentPass', 'UIImageAsset', 'MKMapCamera', 'SKProductsResponse', 'GLKEffectPropertyMaterial', 'AVCaptureDevice', 'CTCallCenter', 'CABTMIDILocalPeripheralViewController', 'NEVPNManager', 'HKQuery', 'SCNPhysicsContact', 'CBMutableService', 'AVSampleBufferDisplayLayer', 'SCNSceneSource', 'SKLightNode', 'CKDiscoveredUserInfo', 'NSMutableArray', 'MTLDepthStencilDescriptor', 'MTLArgument', 'NSMassFormatter', 'CIRectangleFeature', 'PKPushRegistry', 'NEVPNConnection', 'MCNearbyServiceBrowser', 'NSOperationQueue', 'MKPolylineRenderer', 'HKWorkout', 'NSValueTransformer', 'UICollectionViewFlowLayout', 'MPChangePlaybackRateCommandEvent', 'NSEntityMapping', 'SKTexture', 'NSMergePolicy', 'UITextInputStringTokenizer', 'NSRecursiveLock', 'AVAsset', 'NSUndoManager', 'AVAudioUnitSampler', 'NSItemProvider', 'SKUniform', 'MPMediaPickerController', 'CKOperation', 'MTLRenderPipelineDescriptor', 'EAWiFiUnconfiguredAccessory', 'NSFileCoordinator', 'SKRequest', 'NSFileHandle', 'NSConditionLock', 'UISegmentedControl', 'NSManagedObjectModel', 'UITabBarItem', 'SCNCone', 'MPMediaItem', 'SCNMaterial', 'EKRecurrenceRule', 'UIEvent', 'UITouch', 'UIPrintInteractionController', 'CMDeviceMotion', 'NEVPNProtocol', 'NSCompoundPredicate', 'HKHealthStore', 'MKMultiPoint', 'HKSampleType', 'UIPrintFormatter', 'AVAudioUnitEQFilterParameters', 'SKView', 'NSConstantString', 'UIPopoverController', 'CKDatabase', 'AVMetadataFaceObject', 'UIAccelerometer', 'EKEventViewController', 'CMAltitudeData', 'MTLStencilDescriptor', 'UISwipeGestureRecognizer', 'NSPort', 'MKCircleRenderer', 'AVCompositionTrack', 'NSAsynchronousFetchRequest', 'NSUbiquitousKeyValueStore', 'NSMetadataQueryResultGroup', 'AVAssetResourceLoadingDataRequest', 'UITableViewHeaderFooterView', 'CKNotificationID', 'AVAudioSession', 'HKUnit', 'NSNull', 'NSPersistentStoreResult', 'MKCircleView', 'AVAudioChannelLayout', 'NEVPNProtocolIKEv2', 'WKProcessPool', 'UIAttachmentBehavior', 'CLBeacon', 'NSInputStream', 'NSURLCache', 'GKPlayer', 'NSMappingModel', 'CIQRCodeFeature', 'AVMutableVideoComposition', 'PHFetchResult', 'NSAttributeDescription', 'AVPlayer', 'MKAnnotationView', 'PKPaymentRequest', 'NSTimer', 'CBDescriptor', 'MKOverlayView', 'AVAudioUnitTimePitch', 'NSSaveChangesRequest', 'UIReferenceLibraryViewController', 'SKPhysicsJointFixed', 'UILocalizedIndexedCollation', 'UIInterpolatingMotionEffect', 'UIDocumentPickerViewController', 'AVAssetWriter', 'NSBundle', 'SKStoreProductViewController', 'GLKViewController', 'NSMetadataQueryAttributeValueTuple', 'GKTurnBasedMatch', 'AVAudioFile', 'UIActivity', 'NSPipe', 'MKShape', 'NSMergeConflict', 'CIImage', 'HKObject', 'UIRotationGestureRecognizer', 'AVPlayerItemLegibleOutput', 'AVAssetImageGenerator', 'GCControllerButtonInput', 'CKMarkNotificationsReadOperation', 'CKSubscription', 'MPTimedMetadata', 'NKIssue', 'UIScreenMode', 'HMAccessoryBrowser', 'GKTurnBasedEventHandler', 'UIWebView', 'MKPolyline', 'JSVirtualMachine', 'AVAssetReader', 'NSAttributedString', 'GKMatchmakerViewController', 'NSCountedSet', 'UIButton', 'WKNavigationResponse', 'GKLocalPlayer', 'MPMovieErrorLog', 'AVSpeechUtterance', 'HKStatistics', 'UILocalNotification', 'HKBiologicalSexObject', 'AVURLAsset', 'CBPeripheral', 'NSDateComponentsFormatter', 'SKSpriteNode', 'UIAccessibilityElement', 'AVAssetWriterInputGroup', 'HMZone', 'AVAssetReaderAudioMixOutput', 'NSEnumerator', 'UIDocument', 'MKLocalSearchResponse', 'UISimpleTextPrintFormatter', 'PHPhotoLibrary', 'CBService', 'UIDocumentMenuViewController', 'MCSession', 'QLPreviewController', 'CAMediaTimingFunction', 'UITextPosition', 'ASIdentifierManager', 'AVAssetResourceLoadingRequest', 'SLComposeServiceViewController', 'UIPinchGestureRecognizer', 'PHObject', 'NSExtensionItem', 'HKSampleQuery', 'MTLRenderPipelineColorAttachmentDescriptorArray', 'MKRouteStep', 'SCNCapsule', 'NSMetadataQuery', 'AVAssetResourceLoadingContentInformationRequest', 'UITraitCollection', 'CTCarrier', 'NSFileSecurity', 'UIAcceleration', 'UIMotionEffect', 'MTLRenderPipelineReflection', 'CLHeading', 'CLVisit', 'MKDirectionsResponse', 'HMAccessory', 'MTLStructType', 'UITextView', 'CMMagnetometerData', 'UICollisionBehavior', 'UIProgressView', 'CKServerChangeToken', 'UISearchBar', 'MKPlacemark', 'AVCaptureConnection', 'NSPropertyMapping', 'ALAssetsFilter', 'SK3DNode', 'AVPlayerItemErrorLogEvent', 'NSJSONSerialization', 'AVAssetReaderVideoCompositionOutput', 'ABPersonViewController', 'CIDetector', 'GKTurnBasedMatchmakerViewController', 'MPMediaItemCollection', 'SCNSphere', 'NSCondition', 'NSURLCredential', 'MIDINetworkConnection', 'NSFileProviderExtension', 'NSDecimalNumberHandler', 'NSAtomicStoreCacheNode', 'NSAtomicStore', 'EKAlarm', 'CKNotificationInfo', 'AVAudioUnitEQ', 'UIPercentDrivenInteractiveTransition', 'MKPolygon', 'AVAssetTrackSegment', 'MTLVertexAttribute', 'NSExpressionDescription', 'HKStatisticsCollectionQuery', 'NSURLAuthenticationChallenge', 'NSDirectoryEnumerator', 'MKDistanceFormatter', 'UIAlertAction', 'NSPropertyListSerialization', 'GKPeerPickerController', 'UIUserNotificationSettings', 'UITableViewController', 'GKNotificationBanner', 'MKPointAnnotation', 'MTLRenderPassColorAttachmentDescriptorArray', 'NSCache', 'SKPhysicsJoint', 'NSXMLParser', 'UIViewController', 'PKPaymentToken', 'MFMessageComposeViewController', 'AVAudioInputNode', 'NSDataDetector', 'CABTMIDICentralViewController', 'AVAudioUnitMIDIInstrument', 'AVCaptureVideoPreviewLayer', 'AVAssetWriterInputPassDescription', 'MPChangePlaybackRateCommand', 'NSURLComponents', 'CAMetalLayer', 'UISnapBehavior', 'AVMetadataMachineReadableCodeObject', 'CKDiscoverUserInfosOperation', 'NSTextAttachment', 'NSException', 'UIMenuItem', 'CMMotionActivityManager', 'SCNGeometryElement', 'NCWidgetController', 'CAEmitterLayer', 'MKUserLocation', 'UIImagePickerController', 'CIFeature', 'AVCaptureDeviceInput', 'ALAsset', 'NSURLSessionDownloadTask', 'SCNPhysicsHingeJoint', 'MPMoviePlayerViewController', 'NSMutableOrderedSet', 'SCNMaterialProperty', 'UIFont', 'AVCaptureVideoDataOutput', 'NSCachedURLResponse', 'ALAssetsLibrary', 'NSInvocation', 'UILongPressGestureRecognizer', 'NSTextStorage', 'WKWebViewConfiguration', 'CIFaceFeature', 'MKMapSnapshot', 'GLKEffectPropertyFog', 'AVComposition', 'CKDiscoverAllContactsOperation', 'AVAudioMixInputParameters', 'CAEmitterBehavior', 'PKPassLibrary', 'UIMutableUserNotificationCategory', 'NSLock', 'NEVPNProtocolIPSec', 'ADBannerView', 'UIDocumentPickerExtensionViewController', 'UIActivityIndicatorView', 'AVPlayerMediaSelectionCriteria', 'CALayer', 'UIAccessibilityCustomAction', 'UIBarButtonItem', 'AVAudioSessionRouteDescription', 'CLBeaconRegion', 'HKBloodTypeObject', 'MTLVertexBufferLayoutDescriptorArray', 'CABasicAnimation', 'AVVideoCompositionInstruction', 'AVMutableTimedMetadataGroup', 'EKRecurrenceEnd', 'NSTextContainer', 'TWTweetComposeViewController', 'PKPaymentAuthorizationViewController', 'UIScrollView', 'WKNavigationAction', 'AVPlayerItemMetadataOutput', 'EKRecurrenceDayOfWeek', 'NSNumberFormatter', 'MTLComputePipelineReflection', 'UIScreen', 'CLRegion', 'NSProcessInfo', 'GLKTextureInfo', 'SCNSkinner', 'AVCaptureMetadataOutput', 'SCNAnimationEvent', 'NSTextTab', 'JSManagedValue', 'NSDate', 'UITextChecker', 'WKBackForwardListItem', 'NSData', 'NSParagraphStyle', 'AVMutableMetadataItem', 'EKCalendar', 'HKWorkoutEvent', 'NSMutableURLRequest', 'UIVideoEditorController', 'HMTimerTrigger', 'AVAudioUnitVarispeed', 'UIDynamicAnimator', 'AVCompositionTrackSegment', 'GCGamepadSnapshot', 'MPMediaEntity', 'GLKSkyboxEffect', 'UISwitch', 'EKStructuredLocation', 'UIGestureRecognizer', 'NSProxy', 'GLKBaseEffect', 'UIPushBehavior', 'GKScoreChallenge', 'NSCoder', 'MPMediaPlaylist', 'NSDateComponents', 'WKUserScript', 'EKEvent', 'NSDateFormatter', 'NSAsynchronousFetchResult', 'AVAssetWriterInputPixelBufferAdaptor', 'UIVisualEffect', 'UICollectionViewCell', 'UITextField', 'CLPlacemark', 'MPPlayableContentManager', 'AVCaptureOutput', 'HMCharacteristicWriteAction', 'CKModifySubscriptionsOperation', 'NSPropertyDescription', 'GCGamepad', 'UIMarkupTextPrintFormatter', 'SCNTube', 'NSPersistentStoreCoordinator', 'AVAudioEnvironmentNode', 'GKMatchmaker', 'CIContext', 'NSThread', 'SLComposeSheetConfigurationItem', 'SKPhysicsJointSliding', 'NSPredicate', 'GKVoiceChat', 'SKCropNode', 'AVCaptureAudioPreviewOutput', 'NSStringDrawingContext', 'GKGameCenterViewController', 'UIPrintPaper', 'SCNPhysicsBallSocketJoint', 'UICollectionViewLayoutInvalidationContext', 'GLKEffectPropertyTransform', 'AVAudioIONode', 'UIDatePicker', 'MKDirections', 'ALAssetsGroup', 'CKRecordZoneNotification', 'SCNScene', 'MPMovieAccessLogEvent', 'CKFetchSubscriptionsOperation', 'CAEmitterCell', 'AVAudioUnitTimeEffect', 'HMCharacteristicMetadata', 'MKPinAnnotationView', 'UIPickerView', 'UIImageView', 'UIUserNotificationCategory', 'SCNPhysicsVehicleWheel', 'HKCategoryType', 'MPMediaQuerySection', 'GKFriendRequestComposeViewController', 'NSError', 'MTLRenderPipelineColorAttachmentDescriptor', 'SCNPhysicsShape', 'UISearchController', 'SCNPhysicsBody', 'CTSubscriberInfo', 'AVPlayerItemAccessLog', 'MPMediaPropertyPredicate', 'CMLogItem', 'NSAutoreleasePool', 'NSSocketPort', 'AVAssetReaderTrackOutput', 'SKNode', 'UIMutableUserNotificationAction', 'SCNProgram', 'AVSpeechSynthesisVoice', 'CMAltimeter', 'AVCaptureAudioChannel', 'GKTurnBasedExchangeReply', 'AVVideoCompositionLayerInstruction', 'AVSpeechSynthesizer', 'GKChallengeEventHandler', 'AVCaptureFileOutput', 'UIControl', 'SCNPhysicsField', 'CKReference', 'LAContext', 'CKRecordID', 'ADInterstitialAd', 'AVAudioSessionDataSourceDescription', 'AVAudioBuffer', 'CIColorKernel', 'GCControllerDirectionPad', 'NSFileManager', 'AVMutableAudioMixInputParameters', 'UIScreenEdgePanGestureRecognizer', 'CAKeyframeAnimation', 'CKQueryNotification', 'PHAdjustmentData', 'EASession', 'AVAssetResourceRenewalRequest', 'UIInputView', 'NSFileWrapper', 'UIResponder', 'NSPointerFunctions', 'UIKeyCommand', 'NSHTTPCookieStorage', 'AVMediaSelectionOption', 'NSRunLoop', 'NSFileAccessIntent', 'CAAnimationGroup', 'MKCircle', 'UIAlertController', 'NSMigrationManager', 'NSDateIntervalFormatter', 'UICollectionViewUpdateItem', 'CKDatabaseOperation', 'PHImageRequestOptions', 'SKReachConstraints', 'CKRecord', 'CAInterAppAudioSwitcherView', 'WKWindowFeatures', 'GKInvite', 'NSMutableData', 'PHAssetCollectionChangeRequest', 'NSMutableParagraphStyle', 'UIDynamicBehavior', 'GLKEffectProperty', 'CKFetchRecordChangesOperation', 'SKShapeNode', 'MPMovieErrorLogEvent', 'MKPolygonView', 'MPContentItem', 'HMAction', 'NSScanner', 'GKAchievementChallenge', 'AVAudioPlayer', 'CKContainer', 'AVVideoComposition', 'NKLibrary', 'NSPersistentStore', 'AVCaptureMovieFileOutput', 'HMRoom', 'GKChallenge', 'UITextRange', 'NSURLProtectionSpace', 'ACAccountStore', 'MPSkipIntervalCommand', 'NSComparisonPredicate', 'HMHome', 'PHVideoRequestOptions', 'NSOutputStream', 'MPSkipIntervalCommandEvent', 'PKAddPassesViewController', 'UITextSelectionRect', 'CTTelephonyNetworkInfo', 'AVTextStyleRule', 'NSFetchedPropertyDescription', 'UIPageViewController', 'CATransformLayer', 'UICollectionViewController', 'AVAudioNode', 'MCNearbyServiceAdvertiser', 'NSObject', 'PHAsset', 'GKLeaderboardViewController', 'CKQueryCursor', 'MPMusicPlayerController', 'MKOverlayPathRenderer', 'CMPedometerData', 'HMService', 'SKFieldNode', 'GKAchievement', 'WKUserContentController', 'AVAssetTrack', 'TWRequest', 'SKLabelNode', 'AVCaptureBracketedStillImageSettings', 'MIDINetworkHost', 'MPMediaPredicate', 'AVFrameRateRange', 'MTLTextureDescriptor', 'MTLVertexBufferLayoutDescriptor', 'MPFeedbackCommandEvent', 'UIUserNotificationAction', 'HKStatisticsQuery', 'SCNParticleSystem', 'NSIndexPath', 'AVVideoCompositionRenderContext', 'CADisplayLink', 'HKObserverQuery', 'UIPopoverPresentationController', 'CKQueryOperation', 'CAEAGLLayer', 'NSMutableString', 'NSMessagePort', 'NSURLQueryItem', 'MTLStructMember', 'AVAudioSessionChannelDescription', 'GLKView', 'UIActivityViewController', 'GKAchievementViewController', 'GKTurnBasedParticipant', 'NSURLProtocol', 'NSUserDefaults', 'NSCalendar', 'SKKeyframeSequence', 'AVMetadataItemFilter', 'CKModifyRecordZonesOperation', 'WKPreferences', 'NSMethodSignature', 'NSRegularExpression', 'EAGLSharegroup', 'AVPlayerItemVideoOutput', 'PHContentEditingInputRequestOptions', 'GKMatch', 'CIColor', 'UIDictationPhrase'])
+COCOA_PROTOCOLS = set(['SKStoreProductViewControllerDelegate', 'AVVideoCompositionInstruction', 'AVAudioSessionDelegate', 'GKMatchDelegate', 'NSFileManagerDelegate', 'UILayoutSupport', 'NSCopying', 'UIPrintInteractionControllerDelegate', 'QLPreviewControllerDataSource', 'SKProductsRequestDelegate', 'NSTextStorageDelegate', 'MCBrowserViewControllerDelegate', 'MTLComputeCommandEncoder', 'SCNSceneExportDelegate', 'UISearchResultsUpdating', 'MFMailComposeViewControllerDelegate', 'MTLBlitCommandEncoder', 'NSDecimalNumberBehaviors', 'PHContentEditingController', 'NSMutableCopying', 'UIActionSheetDelegate', 'UIViewControllerTransitioningDelegate', 'UIAlertViewDelegate', 'AVAudioPlayerDelegate', 'MKReverseGeocoderDelegate', 'NSCoding', 'UITextInputTokenizer', 'GKFriendRequestComposeViewControllerDelegate', 'UIActivityItemSource', 'NSCacheDelegate', 'UIAdaptivePresentationControllerDelegate', 'GKAchievementViewControllerDelegate', 'UIViewControllerTransitionCoordinator', 'EKEventEditViewDelegate', 'NSURLConnectionDelegate', 'UITableViewDelegate', 'GKPeerPickerControllerDelegate', 'UIGuidedAccessRestrictionDelegate', 'AVSpeechSynthesizerDelegate', 'AVAudio3DMixing', 'AVPlayerItemLegibleOutputPushDelegate', 'ADInterstitialAdDelegate', 'HMAccessoryBrowserDelegate', 'AVAssetResourceLoaderDelegate', 'UITabBarControllerDelegate', 'CKRecordValue', 'SKPaymentTransactionObserver', 'AVCaptureAudioDataOutputSampleBufferDelegate', 'UIInputViewAudioFeedback', 'GKChallengeListener', 'SKSceneDelegate', 'UIPickerViewDelegate', 'UIWebViewDelegate', 'UIApplicationDelegate', 'GKInviteEventListener', 'MPMediaPlayback', 'MyClassJavaScriptMethods', 'AVAsynchronousKeyValueLoading', 'QLPreviewItem', 'SCNBoundingVolume', 'NSPortDelegate', 'UIContentContainer', 'SCNNodeRendererDelegate', 'SKRequestDelegate', 'SKPhysicsContactDelegate', 'HMAccessoryDelegate', 'UIPageViewControllerDataSource', 'SCNSceneRendererDelegate', 'SCNPhysicsContactDelegate', 'MKMapViewDelegate', 'AVPlayerItemOutputPushDelegate', 'UICollectionViewDelegate', 'UIImagePickerControllerDelegate', 'MTLRenderCommandEncoder', 'PKPaymentAuthorizationViewControllerDelegate', 'UIToolbarDelegate', 'WKUIDelegate', 'SCNActionable', 'NSURLConnectionDataDelegate', 'MKOverlay', 'CBCentralManagerDelegate', 'JSExport', 'NSTextLayoutOrientationProvider', 'UIPickerViewDataSource', 'PKPushRegistryDelegate', 'UIViewControllerTransitionCoordinatorContext', 'NSLayoutManagerDelegate', 'MTLLibrary', 'NSFetchedResultsControllerDelegate', 'ABPeoplePickerNavigationControllerDelegate', 'MTLResource', 'NSDiscardableContent', 'UITextFieldDelegate', 'MTLBuffer', 'MTLSamplerState', 'GKGameCenterControllerDelegate', 'MPMediaPickerControllerDelegate', 'UISplitViewControllerDelegate', 'UIAppearance', 'UIPickerViewAccessibilityDelegate', 'UITraitEnvironment', 'UIScrollViewAccessibilityDelegate', 'ADBannerViewDelegate', 'MPPlayableContentDataSource', 'MTLComputePipelineState', 'NSURLSessionDelegate', 'MTLCommandBuffer', 'NSXMLParserDelegate', 'UIViewControllerRestoration', 'UISearchBarDelegate', 'UIBarPositioning', 'CBPeripheralDelegate', 'UISearchDisplayDelegate', 'CAAction', 'PKAddPassesViewControllerDelegate', 'MCNearbyServiceAdvertiserDelegate', 'MTLDepthStencilState', 'GKTurnBasedMatchmakerViewControllerDelegate', 'MPPlayableContentDelegate', 'AVCaptureVideoDataOutputSampleBufferDelegate', 'UIAppearanceContainer', 'UIStateRestoring', 'UITextDocumentProxy', 'MTLDrawable', 'NSURLSessionTaskDelegate', 'NSFilePresenter', 'AVAudioStereoMixing', 'UIViewControllerContextTransitioning', 'UITextInput', 'CBPeripheralManagerDelegate', 'UITextInputDelegate', 'NSFastEnumeration', 'NSURLAuthenticationChallengeSender', 'SCNProgramDelegate', 'AVVideoCompositing', 'SCNAnimatable', 'NSSecureCoding', 'MCAdvertiserAssistantDelegate', 'GKLocalPlayerListener', 'GLKNamedEffect', 'UIPopoverControllerDelegate', 'AVCaptureMetadataOutputObjectsDelegate', 'NSExtensionRequestHandling', 'UITextSelecting', 'UIPrinterPickerControllerDelegate', 'NCWidgetProviding', 'MTLCommandEncoder', 'NSURLProtocolClient', 'MFMessageComposeViewControllerDelegate', 'UIVideoEditorControllerDelegate', 'WKNavigationDelegate', 'GKSavedGameListener', 'UITableViewDataSource', 'MTLFunction', 'EKCalendarChooserDelegate', 'NSUserActivityDelegate', 'UICollisionBehaviorDelegate', 'NSStreamDelegate', 'MCNearbyServiceBrowserDelegate', 'HMHomeDelegate', 'UINavigationControllerDelegate', 'MCSessionDelegate', 'UIDocumentPickerDelegate', 'UIViewControllerInteractiveTransitioning', 'GKTurnBasedEventListener', 'SCNSceneRenderer', 'MTLTexture', 'GLKViewDelegate', 'EAAccessoryDelegate', 'WKScriptMessageHandler', 'PHPhotoLibraryChangeObserver', 'NSKeyedUnarchiverDelegate', 'AVPlayerItemMetadataOutputPushDelegate', 'NSMachPortDelegate', 'SCNShadable', 'UIPopoverBackgroundViewMethods', 'UIDocumentMenuDelegate', 'UIBarPositioningDelegate', 'ABPersonViewControllerDelegate', 'NSNetServiceBrowserDelegate', 'EKEventViewDelegate', 'UIScrollViewDelegate', 'NSURLConnectionDownloadDelegate', 'UIGestureRecognizerDelegate', 'UINavigationBarDelegate', 'AVAudioMixing', 'NSFetchedResultsSectionInfo', 'UIDocumentInteractionControllerDelegate', 'MTLParallelRenderCommandEncoder', 'QLPreviewControllerDelegate', 'UIAccessibilityReadingContent', 'ABUnknownPersonViewControllerDelegate', 'GLKViewControllerDelegate', 'UICollectionViewDelegateFlowLayout', 'UIPopoverPresentationControllerDelegate', 'UIDynamicAnimatorDelegate', 'NSTextAttachmentContainer', 'MKAnnotation', 'UIAccessibilityIdentification', 'UICoordinateSpace', 'ABNewPersonViewControllerDelegate', 'MTLDevice', 'CAMediaTiming', 'AVCaptureFileOutputRecordingDelegate', 'HMHomeManagerDelegate', 'UITextViewDelegate', 'UITabBarDelegate', 'GKLeaderboardViewControllerDelegate', 'UISearchControllerDelegate', 'EAWiFiUnconfiguredAccessoryBrowserDelegate', 'UITextInputTraits', 'MTLRenderPipelineState', 'GKVoiceChatClient', 'UIKeyInput', 'UICollectionViewDataSource', 'SCNTechniqueSupport', 'NSLocking', 'AVCaptureFileOutputDelegate', 'GKChallengeEventHandlerDelegate', 'UIObjectRestoration', 'CIFilterConstructor', 'AVPlayerItemOutputPullDelegate', 'EAGLDrawable', 'AVVideoCompositionValidationHandling', 'UIViewControllerAnimatedTransitioning', 'NSURLSessionDownloadDelegate', 'UIAccelerometerDelegate', 'UIPageViewControllerDelegate', 'MTLCommandQueue', 'UIDataSourceModelAssociation', 'AVAudioRecorderDelegate', 'GKSessionDelegate', 'NSKeyedArchiverDelegate', 'CAMetalDrawable', 'UIDynamicItem', 'CLLocationManagerDelegate', 'NSMetadataQueryDelegate', 'NSNetServiceDelegate', 'GKMatchmakerViewControllerDelegate', 'NSURLSessionDataDelegate'])
+COCOA_PRIMITIVES = set(['ROTAHeader', '__CFBundle', 'MortSubtable', 'AudioFilePacketTableInfo', 'CGPDFOperatorTable', 'KerxStateEntry', 'ExtendedTempoEvent', 'CTParagraphStyleSetting', 'OpaqueMIDIPort', '_GLKMatrix3', '_GLKMatrix2', '_GLKMatrix4', 'ExtendedControlEvent', 'CAFAudioDescription', 'OpaqueCMBlockBuffer', 'CGTextDrawingMode', 'EKErrorCode', 'gss_buffer_desc_struct', 'AudioUnitParameterInfo', '__SCPreferences', '__CTFrame', '__CTLine', 'AudioFile_SMPTE_Time', 'gss_krb5_lucid_context_v1', 'OpaqueJSValue', 'TrakTableEntry', 'AudioFramePacketTranslation', 'CGImageSource', 'OpaqueJSPropertyNameAccumulator', 'JustPCGlyphRepeatAddAction', '__CFBinaryHeap', 'OpaqueMIDIThruConnection', 'opaqueCMBufferQueue', 'OpaqueMusicSequence', 'MortRearrangementSubtable', 'MixerDistanceParams', 'MorxSubtable', 'MIDIObjectPropertyChangeNotification', 'SFNTLookupSegment', 'CGImageMetadataErrors', 'CGPath', 'OpaqueMIDIEndpoint', 'AudioComponentPlugInInterface', 'gss_ctx_id_t_desc_struct', 'sfntFontFeatureSetting', 'OpaqueJSContextGroup', '__SCNetworkConnection', 'AudioUnitParameterValueTranslation', 'CGImageMetadataType', 'CGPattern', 'AudioFileTypeAndFormatID', 'CGContext', 'AUNodeInteraction', 'SFNTLookupTable', 'JustPCDecompositionAction', 'KerxControlPointHeader', 'AudioStreamPacketDescription', 'KernSubtableHeader', '__SecCertificate', 'AUMIDIOutputCallbackStruct', 'MIDIMetaEvent', 'AudioQueueChannelAssignment', 'AnchorPoint', 'JustTable', '__CFNetService', 'CF_BRIDGED_TYPE', 'gss_krb5_lucid_key', 'CGPDFDictionary', 'KerxSubtableHeader', 'CAF_UUID_ChunkHeader', 'gss_krb5_cfx_keydata', 'OpaqueJSClass', 'CGGradient', 'OpaqueMIDISetup', 'JustPostcompTable', '__CTParagraphStyle', 'AudioUnitParameterHistoryInfo', 'OpaqueJSContext', 'CGShading', 'MIDIThruConnectionParams', 'BslnFormat0Part', 'SFNTLookupSingle', '__CFHost', '__SecRandom', '__CTFontDescriptor', '_NSRange', 'sfntDirectory', 'AudioQueueLevelMeterState', 'CAFPositionPeak', 'PropLookupSegment', '__CVOpenGLESTextureCache', 'sfntInstance', '_GLKQuaternion', 'AnkrTable', '__SCNetworkProtocol', 'CAFFileHeader', 'KerxOrderedListHeader', 'CGBlendMode', 'STXEntryOne', 'CAFRegion', 'SFNTLookupTrimmedArrayHeader', 'SCNMatrix4', 'KerxControlPointEntry', 'OpaqueMusicTrack', '_GLKVector4', 'gss_OID_set_desc_struct', 'OpaqueMusicPlayer', '_CFHTTPAuthentication', 'CGAffineTransform', 'CAFMarkerChunk', 'AUHostIdentifier', 'ROTAGlyphEntry', 'BslnTable', 'gss_krb5_lucid_context_version', '_GLKMatrixStack', 'CGImage', 'KernStateEntry', 'SFNTLookupSingleHeader', 'MortLigatureSubtable', 'CAFUMIDChunk', 'SMPTETime', 'CAFDataChunk', 'CGPDFStream', 'AudioFileRegionList', 'STEntryTwo', 'SFNTLookupBinarySearchHeader', 'OpbdTable', '__CTGlyphInfo', 'BslnFormat2Part', 'KerxIndexArrayHeader', 'TrakTable', 'KerxKerningPair', '__CFBitVector', 'KernVersion0SubtableHeader', 'OpaqueAudioComponentInstance', 'AudioChannelLayout', '__CFUUID', 'MIDISysexSendRequest', '__CFNumberFormatter', 'CGImageSourceStatus', 'AudioFileMarkerList', 'AUSamplerBankPresetData', 'CGDataProvider', 'AudioFormatInfo', '__SecIdentity', 'sfntCMapExtendedSubHeader', 'MIDIChannelMessage', 'KernOffsetTable', 'CGColorSpaceModel', 'MFMailComposeErrorCode', 'CGFunction', '__SecTrust', 'AVAudio3DAngularOrientation', 'CGFontPostScriptFormat', 'KernStateHeader', 'AudioUnitCocoaViewInfo', 'CGDataConsumer', 'OpaqueMIDIDevice', 'KernVersion0Header', 'AnchorPointTable', 'CGImageDestination', 'CAFInstrumentChunk', 'AudioUnitMeterClipping', 'MorxChain', '__CTFontCollection', 'STEntryOne', 'STXEntryTwo', 'ExtendedNoteOnEvent', 'CGColorRenderingIntent', 'KerxSimpleArrayHeader', 'MorxTable', '_GLKVector3', '_GLKVector2', 'MortTable', 'CGPDFBox', 'AudioUnitParameterValueFromString', '__CFSocket', 'ALCdevice_struct', 'MIDINoteMessage', 'sfntFeatureHeader', 'CGRect', '__SCNetworkInterface', '__CFTree', 'MusicEventUserData', 'TrakTableData', 'GCQuaternion', 'MortContextualSubtable', '__CTRun', 'AudioUnitFrequencyResponseBin', 'MortChain', 'MorxInsertionSubtable', 'CGImageMetadata', 'gss_auth_identity', 'AudioUnitMIDIControlMapping', 'CAFChunkHeader', 'CGImagePropertyOrientation', 'CGPDFScanner', 'OpaqueMusicEventIterator', 'sfntDescriptorHeader', 'AudioUnitNodeConnection', 'OpaqueMIDIDeviceList', 'ExtendedAudioFormatInfo', 'BslnFormat1Part', 'sfntFontDescriptor', 'KernSimpleArrayHeader', '__CFRunLoopObserver', 'CGPatternTiling', 'MIDINotification', 'MorxLigatureSubtable', 'MessageComposeResult', 'MIDIThruConnectionEndpoint', 'MusicDeviceStdNoteParams', 'opaqueCMSimpleQueue', 'ALCcontext_struct', 'OpaqueAudioQueue', 'PropLookupSingle', 'CGInterpolationQuality', 'CGColor', 'AudioOutputUnitStartAtTimeParams', 'gss_name_t_desc_struct', 'CGFunctionCallbacks', 'CAFPacketTableHeader', 'AudioChannelDescription', 'sfntFeatureName', 'MorxContextualSubtable', 'CVSMPTETime', 'AudioValueRange', 'CGTextEncoding', 'AudioStreamBasicDescription', 'AUNodeRenderCallback', 'AudioPanningInfo', 'KerxOrderedListEntry', '__CFAllocator', 'OpaqueJSPropertyNameArray', '__SCDynamicStore', 'OpaqueMIDIEntity', '__CTRubyAnnotation', 'SCNVector4', 'CFHostClientContext', 'CFNetServiceClientContext', 'AudioUnitPresetMAS_SettingData', 'opaqueCMBufferQueueTriggerToken', 'AudioUnitProperty', 'CAFRegionChunk', 'CGPDFString', '__GLsync', '__CFStringTokenizer', 'JustWidthDeltaEntry', 'sfntVariationAxis', '__CFNetDiagnostic', 'CAFOverviewSample', 'sfntCMapEncoding', 'CGVector', '__SCNetworkService', 'opaqueCMSampleBuffer', 'AUHostVersionIdentifier', 'AudioBalanceFade', 'sfntFontRunFeature', 'KerxCoordinateAction', 'sfntCMapSubHeader', 'CVPlanarPixelBufferInfo', 'AUNumVersion', 'AUSamplerInstrumentData', 'AUPreset', '__CTRunDelegate', 'OpaqueAudioQueueProcessingTap', 'KerxTableHeader', '_NSZone', 'OpaqueExtAudioFile', '__CFRunLoopSource', '__CVMetalTextureCache', 'KerxAnchorPointAction', 'OpaqueJSString', 'AudioQueueParameterEvent', '__CFHTTPMessage', 'OpaqueCMClock', 'ScheduledAudioFileRegion', 'STEntryZero', 'AVAudio3DPoint', 'gss_channel_bindings_struct', 'sfntVariationHeader', 'AUChannelInfo', 'UIOffset', 'GLKEffectPropertyPrv', 'KerxStateHeader', 'CGLineJoin', 'CGPDFDocument', '__CFBag', 'KernOrderedListHeader', '__SCNetworkSet', '__SecKey', 'MIDIObjectAddRemoveNotification', 'AudioUnitParameter', 'JustPCActionSubrecord', 'AudioComponentDescription', 'AudioUnitParameterValueName', 'AudioUnitParameterEvent', 'KerxControlPointAction', 'AudioTimeStamp', 'KernKerningPair', 'gss_buffer_set_desc_struct', 'MortFeatureEntry', 'FontVariation', 'CAFStringID', 'LcarCaretClassEntry', 'AudioUnitParameterStringFromValue', 'ACErrorCode', 'ALMXGlyphEntry', 'LtagTable', '__CTTypesetter', 'AuthorizationOpaqueRef', 'UIEdgeInsets', 'CGPathElement', 'CAFMarker', 'KernTableHeader', 'NoteParamsControlValue', 'SSLContext', 'gss_cred_id_t_desc_struct', 'AudioUnitParameterNameInfo', 'CGDataConsumerCallbacks', 'ALMXHeader', 'CGLineCap', 'MIDIControlTransform', 'CGPDFArray', '__SecPolicy', 'AudioConverterPrimeInfo', '__CTTextTab', '__CFNetServiceMonitor', 'AUInputSamplesInOutputCallbackStruct', '__CTFramesetter', 'CGPDFDataFormat', 'STHeader', 'CVPlanarPixelBufferInfo_YCbCrPlanar', 'MIDIValueMap', 'JustDirectionTable', '__SCBondStatus', 'SFNTLookupSegmentHeader', 'OpaqueCMMemoryPool', 'CGPathDrawingMode', 'CGFont', '__SCNetworkReachability', 'AudioClassDescription', 'CGPoint', 'AVAudio3DVectorOrientation', 'CAFStrings', '__CFNetServiceBrowser', 'opaqueMTAudioProcessingTap', 'sfntNameRecord', 'CGPDFPage', 'CGLayer', 'ComponentInstanceRecord', 'CAFInfoStrings', 'HostCallbackInfo', 'MusicDeviceNoteParams', 'OpaqueVTCompressionSession', 'KernIndexArrayHeader', 'CVPlanarPixelBufferInfo_YCbCrBiPlanar', 'MusicTrackLoopInfo', 'opaqueCMFormatDescription', 'STClassTable', 'sfntDirectoryEntry', 'OpaqueCMTimebase', 'CGDataProviderDirectCallbacks', 'MIDIPacketList', 'CAFOverviewChunk', 'MIDIPacket', 'ScheduledAudioSlice', 'CGDataProviderSequentialCallbacks', 'AudioBuffer', 'MorxRearrangementSubtable', 'CGPatternCallbacks', 'AUDistanceAttenuationData', 'MIDIIOErrorNotification', 'CGPDFContentStream', 'IUnknownVTbl', 'MIDITransform', 'MortInsertionSubtable', 'CABarBeatTime', 'AudioBufferList', '__CVBuffer', 'AURenderCallbackStruct', 'STXEntryZero', 'JustPCDuctilityAction', 'OpaqueAudioQueueTimeline', 'VTDecompressionOutputCallbackRecord', 'OpaqueMIDIClient', '__CFPlugInInstance', 'AudioQueueBuffer', '__CFFileDescriptor', 'AudioUnitConnection', '_GKTurnBasedExchangeStatus', 'LcarCaretTable', 'CVPlanarComponentInfo', 'JustWidthDeltaGroup', 'OpaqueAudioComponent', 'ParameterEvent', '__CVPixelBufferPool', '__CTFont', 'CGColorSpace', 'CGSize', 'AUDependentParameter', 'MIDIDriverInterface', 'gss_krb5_rfc1964_keydata', '__CFDateFormatter', 'LtagStringRange', 'OpaqueVTDecompressionSession', 'gss_iov_buffer_desc_struct', 'AUPresetEvent', 'PropTable', 'KernOrderedListEntry', 'CF_BRIDGED_MUTABLE_TYPE', 'gss_OID_desc_struct', 'AudioUnitPresetMAS_Settings', 'AudioFileMarker', 'JustPCConditionalAddAction', 'BslnFormat3Part', '__CFNotificationCenter', 'MortSwashSubtable', 'AUParameterMIDIMapping', 'SCNVector3', 'OpaqueAudioConverter', 'MIDIRawData', 'sfntNameHeader', '__CFRunLoop', 'MFMailComposeResult', 'CATransform3D', 'OpbdSideValues', 'CAF_SMPTE_Time', '__SecAccessControl', 'JustPCAction', 'OpaqueVTFrameSilo', 'OpaqueVTMultiPassStorage', 'CGPathElementType', 'AudioFormatListItem', 'AudioUnitExternalBuffer', 'AudioFileRegion', 'AudioValueTranslation', 'CGImageMetadataTag', 'CAFPeakChunk', 'AudioBytePacketTranslation', 'sfntCMapHeader', '__CFURLEnumerator', 'STXHeader', 'CGPDFObjectType', 'SFNTLookupArrayHeader'])
+
+if __name__ == '__main__':  # pragma: no cover
+    import os
+    import re
+
+    FRAMEWORKS_PATH = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/'
+    frameworks = os.listdir(FRAMEWORKS_PATH)
+
+    all_interfaces = set()
+    all_protocols  = set()
+    all_primitives = set()
+    for framework in frameworks:
+        frameworkHeadersDir = FRAMEWORKS_PATH + framework + '/Headers/'
+        if not os.path.exists(frameworkHeadersDir):
+            continue
+
+        headerFilenames = os.listdir(frameworkHeadersDir)
+
+        for f in headerFilenames:
+            if not f.endswith('.h'):
+                continue
+
+            headerFilePath = frameworkHeadersDir + f
+            content = open(headerFilePath).read()
+            res = re.findall('(?<=@interface )\w+', content)
+            for r in res:
+                all_interfaces.add(r)
+
+            res = re.findall('(?<=@protocol )\w+', content)
+            for r in res:
+                all_protocols.add(r)
+
+            res = re.findall('(?<=typedef enum )\w+', content)
+            for r in res:
+                all_primitives.add(r)
+
+            res = re.findall('(?<=typedef struct )\w+', content)
+            for r in res:
+                all_primitives.add(r)
+
+            res = re.findall('(?<=typedef const struct )\w+', content)
+            for r in res:
+                all_primitives.add(r)
+
+
+    print("ALL interfaces: \n")
+    print(all_interfaces)
+
+    print("\nALL protocols: \n")
+    print(all_protocols)
+
+    print("\nALL primitives: \n")
+    print(all_primitives)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/parasail.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/parasail.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/parasail.py	(revision 1126)
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.parasail
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for ParaSail.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['ParaSailLexer']
+
+
+class ParaSailLexer(RegexLexer):
+    """
+    For `ParaSail <http://www.parasail-lang.org>`_ source code.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'ParaSail'
+    aliases = ['parasail']
+    filenames = ['*.psi', '*.psl']
+    mimetypes = ['text/x-parasail']
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'\b(and|or|xor)=', Operator.Word),
+            (r'\b(and(\s+then)?|or(\s+else)?|xor|rem|mod|'
+             r'(is|not)\s+null)\b',
+             Operator.Word),
+            # Keywords
+            (r'\b(abs|abstract|all|block|class|concurrent|const|continue|'
+             r'each|end|exit|extends|exports|forward|func|global|implements|'
+             r'import|in|interface|is|lambda|locked|new|not|null|of|op|'
+             r'optional|private|queued|ref|return|reverse|separate|some|'
+             r'type|until|var|with|'
+             # Control flow
+             r'if|then|else|elsif|case|for|while|loop)\b',
+             Keyword.Reserved),
+            (r'(abstract\s+)?(interface|class|op|func|type)',
+             Keyword.Declaration),
+            # Literals
+            (r'"[^"]*"', String),
+            (r'\\[\'ntrf"0]', String.Escape),
+            (r'#[a-zA-Z]\w*', Literal),       # Enumeration
+            include('numbers'),
+            (r"'[^']'", String.Char),
+            (r'[a-zA-Z]\w*', Name),
+            # Operators and Punctuation
+            (r'(<==|==>|<=>|\*\*=|<\|=|<<=|>>=|==|!=|=\?|<=|>=|'
+             r'\*\*|<<|>>|=>|:=|\+=|-=|\*=|\|=|\||/=|\+|-|\*|/|'
+             r'\.\.|<\.\.|\.\.<|<\.\.<)',
+             Operator),
+            (r'(<|>|\[|\]|\(|\)|\||:|;|,|.|\{|\}|->)',
+             Punctuation),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'\d[0-9_]*#[0-9a-fA-F][0-9a-fA-F_]*#', Number.Hex),  # any base
+            (r'0[xX][0-9a-fA-F][0-9a-fA-F_]*', Number.Hex),        # C-like hex
+            (r'0[bB][01][01_]*', Number.Bin),                      # C-like bin
+            (r'\d[0-9_]*\.\d[0-9_]*[eE][+-]\d[0-9_]*',             # float exp
+             Number.Float),
+            (r'\d[0-9_]*\.\d[0-9_]*', Number.Float),               # float
+            (r'\d[0-9_]*', Number.Integer),                        # integer
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dotnet.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dotnet.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dotnet.py	(revision 1126)
@@ -0,0 +1,691 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.dotnet
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for .net languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import re
+
+from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, include, \
+    using, this, default, words
+from pygments.token import Punctuation, \
+    Text, Comment, Operator, Keyword, Name, String, Number, Literal, Other
+from pygments.util import get_choice_opt, iteritems
+from pygments import unistring as uni
+
+from pygments.lexers.html import XmlLexer
+
+__all__ = ['CSharpLexer', 'NemerleLexer', 'BooLexer', 'VbNetLexer',
+           'CSharpAspxLexer', 'VbNetAspxLexer', 'FSharpLexer']
+
+
+class CSharpLexer(RegexLexer):
+    """
+    For `C# <http://msdn2.microsoft.com/en-us/vcsharp/default.aspx>`_
+    source code.
+
+    Additional options accepted:
+
+    `unicodelevel`
+      Determines which Unicode characters this lexer allows for identifiers.
+      The possible values are:
+
+      * ``none`` -- only the ASCII letters and numbers are allowed. This
+        is the fastest selection.
+      * ``basic`` -- all Unicode characters from the specification except
+        category ``Lo`` are allowed.
+      * ``full`` -- all Unicode characters as specified in the C# specs
+        are allowed.  Note that this means a considerable slowdown since the
+        ``Lo`` category has more than 40,000 characters in it!
+
+      The default value is ``basic``.
+
+      .. versionadded:: 0.8
+    """
+
+    name = 'C#'
+    aliases = ['csharp', 'c#']
+    filenames = ['*.cs']
+    mimetypes = ['text/x-csharp']  # inferred
+
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    # for the range of allowed unicode characters in identifiers, see
+    # http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
+
+    levels = {
+        'none': '@?[_a-zA-Z]\w*',
+        'basic': ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
+                  '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',
+                                    'Cf', 'Mn', 'Mc') + ']*'),
+        'full': ('@?(?:_|[^' +
+                 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])'
+                 + '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
+                                        'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'),
+    }
+
+    tokens = {}
+    token_variants = True
+
+    for levelname, cs_ident in iteritems(levels):
+        tokens[levelname] = {
+            'root': [
+                # method names
+                (r'^([ \t]*(?:' + cs_ident + r'(?:\[\])?\s+)+?)'  # return type
+                 r'(' + cs_ident + ')'                            # method name
+                 r'(\s*)(\()',                               # signature start
+                 bygroups(using(this), Name.Function, Text, Punctuation)),
+                (r'^\s*\[.*?\]', Name.Attribute),
+                (r'[^\S\n]+', Text),
+                (r'\\\n', Text),  # line continuation
+                (r'//.*?\n', Comment.Single),
+                (r'/[*].*?[*]/', Comment.Multiline),
+                (r'\n', Text),
+                (r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation),
+                (r'[{}]', Punctuation),
+                (r'@"(""|[^"])*"', String),
+                (r'"(\\\\|\\"|[^"\n])*["\n]', String),
+                (r"'\\.'|'[^\\]'", String.Char),
+                (r"[0-9](\.[0-9]*)?([eE][+-][0-9]+)?"
+                 r"[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?", Number),
+                (r'#[ \t]*(if|endif|else|elif|define|undef|'
+                 r'line|error|warning|region|endregion|pragma)\b.*?\n',
+                 Comment.Preproc),
+                (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Text,
+                 Keyword)),
+                (r'(abstract|as|async|await|base|break|by|case|catch|'
+                 r'checked|const|continue|default|delegate|'
+                 r'do|else|enum|event|explicit|extern|false|finally|'
+                 r'fixed|for|foreach|goto|if|implicit|in|interface|'
+                 r'internal|is|let|lock|new|null|on|operator|'
+                 r'out|override|params|private|protected|public|readonly|'
+                 r'ref|return|sealed|sizeof|stackalloc|static|'
+                 r'switch|this|throw|true|try|typeof|'
+                 r'unchecked|unsafe|virtual|void|while|'
+                 r'get|set|new|partial|yield|add|remove|value|alias|ascending|'
+                 r'descending|from|group|into|orderby|select|thenby|where|'
+                 r'join|equals)\b', Keyword),
+                (r'(global)(::)', bygroups(Keyword, Punctuation)),
+                (r'(bool|byte|char|decimal|double|dynamic|float|int|long|object|'
+                 r'sbyte|short|string|uint|ulong|ushort|var)\b\??', Keyword.Type),
+                (r'(class|struct)(\s+)', bygroups(Keyword, Text), 'class'),
+                (r'(namespace|using)(\s+)', bygroups(Keyword, Text), 'namespace'),
+                (cs_ident, Name),
+            ],
+            'class': [
+                (cs_ident, Name.Class, '#pop'),
+                default('#pop'),
+            ],
+            'namespace': [
+                (r'(?=\()', Text, '#pop'),  # using (resource)
+                ('(' + cs_ident + r'|\.)+', Name.Namespace, '#pop'),
+            ]
+        }
+
+    def __init__(self, **options):
+        level = get_choice_opt(options, 'unicodelevel', list(self.tokens), 'basic')
+        if level not in self._all_tokens:
+            # compile the regexes now
+            self._tokens = self.__class__.process_tokendef(level)
+        else:
+            self._tokens = self._all_tokens[level]
+
+        RegexLexer.__init__(self, **options)
+
+
+class NemerleLexer(RegexLexer):
+    """
+    For `Nemerle <http://nemerle.org>`_ source code.
+
+    Additional options accepted:
+
+    `unicodelevel`
+      Determines which Unicode characters this lexer allows for identifiers.
+      The possible values are:
+
+      * ``none`` -- only the ASCII letters and numbers are allowed. This
+        is the fastest selection.
+      * ``basic`` -- all Unicode characters from the specification except
+        category ``Lo`` are allowed.
+      * ``full`` -- all Unicode characters as specified in the C# specs
+        are allowed.  Note that this means a considerable slowdown since the
+        ``Lo`` category has more than 40,000 characters in it!
+
+      The default value is ``basic``.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Nemerle'
+    aliases = ['nemerle']
+    filenames = ['*.n']
+    mimetypes = ['text/x-nemerle']  # inferred
+
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    # for the range of allowed unicode characters in identifiers, see
+    # http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
+
+    levels = {
+        'none': '@?[_a-zA-Z]\w*',
+        'basic': ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
+                  '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',
+                                    'Cf', 'Mn', 'Mc') + ']*'),
+        'full': ('@?(?:_|[^' +
+                 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])'
+                 + '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
+                                        'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'),
+    }
+
+    tokens = {}
+    token_variants = True
+
+    for levelname, cs_ident in iteritems(levels):
+        tokens[levelname] = {
+            'root': [
+                # method names
+                (r'^([ \t]*(?:' + cs_ident + r'(?:\[\])?\s+)+?)'  # return type
+                 r'(' + cs_ident + ')'                            # method name
+                 r'(\s*)(\()',                               # signature start
+                 bygroups(using(this), Name.Function, Text, Punctuation)),
+                (r'^\s*\[.*?\]', Name.Attribute),
+                (r'[^\S\n]+', Text),
+                (r'\\\n', Text),  # line continuation
+                (r'//.*?\n', Comment.Single),
+                (r'/[*].*?[*]/', Comment.Multiline),
+                (r'\n', Text),
+                (r'\$\s*"', String, 'splice-string'),
+                (r'\$\s*<#', String, 'splice-string2'),
+                (r'<#', String, 'recursive-string'),
+
+                (r'(<\[)\s*(' + cs_ident + ':)?', Keyword),
+                (r'\]\>', Keyword),
+
+                # quasiquotation only
+                (r'\$' + cs_ident, Name),
+                (r'(\$)(\()', bygroups(Name, Punctuation),
+                 'splice-string-content'),
+
+                (r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation),
+                (r'[{}]', Punctuation),
+                (r'@"(""|[^"])*"', String),
+                (r'"(\\\\|\\"|[^"\n])*["\n]', String),
+                (r"'\\.'|'[^\\]'", String.Char),
+                (r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+                (r"[0-9](\.[0-9]*)?([eE][+-][0-9]+)?[flFLdD]?", Number),
+                (r'#[ \t]*(if|endif|else|elif|define|undef|'
+                 r'line|error|warning|region|endregion|pragma)\b.*?\n',
+                 Comment.Preproc),
+                (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Text,
+                 Keyword)),
+                (r'(abstract|and|as|base|catch|def|delegate|'
+                 r'enum|event|extern|false|finally|'
+                 r'fun|implements|interface|internal|'
+                 r'is|macro|match|matches|module|mutable|new|'
+                 r'null|out|override|params|partial|private|'
+                 r'protected|public|ref|sealed|static|'
+                 r'syntax|this|throw|true|try|type|typeof|'
+                 r'virtual|volatile|when|where|with|'
+                 r'assert|assert2|async|break|checked|continue|do|else|'
+                 r'ensures|for|foreach|if|late|lock|new|nolate|'
+                 r'otherwise|regexp|repeat|requires|return|surroundwith|'
+                 r'unchecked|unless|using|while|yield)\b', Keyword),
+                (r'(global)(::)', bygroups(Keyword, Punctuation)),
+                (r'(bool|byte|char|decimal|double|float|int|long|object|sbyte|'
+                 r'short|string|uint|ulong|ushort|void|array|list)\b\??',
+                 Keyword.Type),
+                (r'(:>?)\s*(' + cs_ident + r'\??)',
+                 bygroups(Punctuation, Keyword.Type)),
+                (r'(class|struct|variant|module)(\s+)',
+                 bygroups(Keyword, Text), 'class'),
+                (r'(namespace|using)(\s+)', bygroups(Keyword, Text),
+                 'namespace'),
+                (cs_ident, Name),
+            ],
+            'class': [
+                (cs_ident, Name.Class, '#pop')
+            ],
+            'namespace': [
+                (r'(?=\()', Text, '#pop'),  # using (resource)
+                ('(' + cs_ident + r'|\.)+', Name.Namespace, '#pop')
+            ],
+            'splice-string': [
+                (r'[^"$]',  String),
+                (r'\$' + cs_ident, Name),
+                (r'(\$)(\()', bygroups(Name, Punctuation),
+                 'splice-string-content'),
+                (r'\\"',  String),
+                (r'"',  String, '#pop')
+            ],
+            'splice-string2': [
+                (r'[^#<>$]',  String),
+                (r'\$' + cs_ident, Name),
+                (r'(\$)(\()', bygroups(Name, Punctuation),
+                 'splice-string-content'),
+                (r'<#',  String, '#push'),
+                (r'#>',  String, '#pop')
+            ],
+            'recursive-string': [
+                (r'[^#<>]',  String),
+                (r'<#',  String, '#push'),
+                (r'#>',  String, '#pop')
+            ],
+            'splice-string-content': [
+                (r'if|match', Keyword),
+                (r'[~!%^&*+=|\[\]:;,.<>/?-\\"$ ]', Punctuation),
+                (cs_ident, Name),
+                (r'\d+', Number),
+                (r'\(', Punctuation, '#push'),
+                (r'\)', Punctuation, '#pop')
+            ]
+        }
+
+    def __init__(self, **options):
+        level = get_choice_opt(options, 'unicodelevel', list(self.tokens),
+                               'basic')
+        if level not in self._all_tokens:
+            # compile the regexes now
+            self._tokens = self.__class__.process_tokendef(level)
+        else:
+            self._tokens = self._all_tokens[level]
+
+        RegexLexer.__init__(self, **options)
+
+
+class BooLexer(RegexLexer):
+    """
+    For `Boo <http://boo.codehaus.org/>`_ source code.
+    """
+
+    name = 'Boo'
+    aliases = ['boo']
+    filenames = ['*.boo']
+    mimetypes = ['text/x-boo']
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(#|//).*$', Comment.Single),
+            (r'/[*]', Comment.Multiline, 'comment'),
+            (r'[]{}:(),.;[]', Punctuation),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'/(\\\\|\\/|[^/\s])/', String.Regex),
+            (r'@/(\\\\|\\/|[^/])*/', String.Regex),
+            (r'=~|!=|==|<<|>>|[-+/*%=<>&^|]', Operator),
+            (r'(as|abstract|callable|constructor|destructor|do|import|'
+             r'enum|event|final|get|interface|internal|of|override|'
+             r'partial|private|protected|public|return|set|static|'
+             r'struct|transient|virtual|yield|super|and|break|cast|'
+             r'continue|elif|else|ensure|except|for|given|goto|if|in|'
+             r'is|isa|not|or|otherwise|pass|raise|ref|try|unless|when|'
+             r'while|from|as)\b', Keyword),
+            (r'def(?=\s+\(.*?\))', Keyword),
+            (r'(def)(\s+)', bygroups(Keyword, Text), 'funcname'),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (r'(namespace)(\s+)', bygroups(Keyword, Text), 'namespace'),
+            (r'(?<!\.)(true|false|null|self|__eval__|__switch__|array|'
+             r'assert|checked|enumerate|filter|getter|len|lock|map|'
+             r'matrix|max|min|normalArrayIndexing|print|property|range|'
+             r'rawArrayIndexing|required|typeof|unchecked|using|'
+             r'yieldAll|zip)\b', Name.Builtin),
+            (r'"""(\\\\|\\"|.*?)"""', String.Double),
+            (r'"(\\\\|\\"|[^"]*?)"', String.Double),
+            (r"'(\\\\|\\'|[^']*?)'", String.Single),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'(\d+\.\d*|\d*\.\d+)([fF][+-]?[0-9]+)?', Number.Float),
+            (r'[0-9][0-9.]*(ms?|d|h|s)', Number),
+            (r'0\d+', Number.Oct),
+            (r'0x[a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer),
+        ],
+        'comment': [
+            ('/[*]', Comment.Multiline, '#push'),
+            ('[*]/', Comment.Multiline, '#pop'),
+            ('[^/*]', Comment.Multiline),
+            ('[*/]', Comment.Multiline)
+        ],
+        'funcname': [
+            ('[a-zA-Z_]\w*', Name.Function, '#pop')
+        ],
+        'classname': [
+            ('[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'namespace': [
+            ('[a-zA-Z_][\w.]*', Name.Namespace, '#pop')
+        ]
+    }
+
+
+class VbNetLexer(RegexLexer):
+    """
+    For
+    `Visual Basic.NET <http://msdn2.microsoft.com/en-us/vbasic/default.aspx>`_
+    source code.
+    """
+
+    name = 'VB.net'
+    aliases = ['vb.net', 'vbnet']
+    filenames = ['*.vb', '*.bas']
+    mimetypes = ['text/x-vbnet', 'text/x-vba']  # (?)
+
+    uni_name = '[_' + uni.combine('Ll', 'Lt', 'Lm', 'Nl') + ']' + \
+               '[' + uni.combine('Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',
+                                 'Cf', 'Mn', 'Mc') + ']*'
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'^\s*<.*?>', Name.Attribute),
+            (r'\s+', Text),
+            (r'\n', Text),
+            (r'rem\b.*?\n', Comment),
+            (r"'.*?\n", Comment),
+            (r'#If\s.*?\sThen|#ElseIf\s.*?\sThen|#Else|#End\s+If|#Const|'
+             r'#ExternalSource.*?\n|#End\s+ExternalSource|'
+             r'#Region.*?\n|#End\s+Region|#ExternalChecksum',
+             Comment.Preproc),
+            (r'[(){}!#,.:]', Punctuation),
+            (r'Option\s+(Strict|Explicit|Compare)\s+'
+             r'(On|Off|Binary|Text)', Keyword.Declaration),
+            (words((
+                'AddHandler', 'Alias', 'ByRef', 'ByVal', 'Call', 'Case',
+                'Catch', 'CBool', 'CByte', 'CChar', 'CDate', 'CDec', 'CDbl',
+                'CInt', 'CLng', 'CObj', 'Continue', 'CSByte', 'CShort', 'CSng',
+                'CStr', 'CType', 'CUInt', 'CULng', 'CUShort', 'Declare',
+                'Default', 'Delegate', 'DirectCast', 'Do', 'Each', 'Else',
+                'ElseIf', 'EndIf', 'Erase', 'Error', 'Event', 'Exit', 'False',
+                'Finally', 'For', 'Friend', 'Get', 'Global', 'GoSub', 'GoTo',
+                'Handles', 'If', 'Implements', 'Inherits', 'Interface', 'Let',
+                'Lib', 'Loop', 'Me', 'MustInherit', 'MustOverride', 'MyBase',
+                'MyClass', 'Narrowing', 'New', 'Next', 'Not', 'Nothing',
+                'NotInheritable', 'NotOverridable', 'Of', 'On', 'Operator',
+                'Option', 'Optional', 'Overloads', 'Overridable', 'Overrides',
+                'ParamArray', 'Partial', 'Private', 'Protected', 'Public',
+                'RaiseEvent', 'ReadOnly', 'ReDim', 'RemoveHandler', 'Resume',
+                'Return', 'Select', 'Set', 'Shadows', 'Shared', 'Single',
+                'Static', 'Step', 'Stop', 'SyncLock', 'Then', 'Throw', 'To',
+                'True', 'Try', 'TryCast', 'Wend', 'Using', 'When', 'While',
+                'Widening', 'With', 'WithEvents', 'WriteOnly'),
+                   prefix='(?<!\.)', suffix=r'\b'), Keyword),
+            (r'(?<!\.)End\b', Keyword, 'end'),
+            (r'(?<!\.)(Dim|Const)\b', Keyword, 'dim'),
+            (r'(?<!\.)(Function|Sub|Property)(\s+)',
+             bygroups(Keyword, Text), 'funcname'),
+            (r'(?<!\.)(Class|Structure|Enum)(\s+)',
+             bygroups(Keyword, Text), 'classname'),
+            (r'(?<!\.)(Module|Namespace|Imports)(\s+)',
+             bygroups(Keyword, Text), 'namespace'),
+            (r'(?<!\.)(Boolean|Byte|Char|Date|Decimal|Double|Integer|Long|'
+             r'Object|SByte|Short|Single|String|Variant|UInteger|ULong|'
+             r'UShort)\b', Keyword.Type),
+            (r'(?<!\.)(AddressOf|And|AndAlso|As|GetType|In|Is|IsNot|Like|Mod|'
+             r'Or|OrElse|TypeOf|Xor)\b', Operator.Word),
+            (r'&=|[*]=|/=|\\=|\^=|\+=|-=|<<=|>>=|<<|>>|:=|'
+             r'<=|>=|<>|[-&*/\\^+=<>\[\]]',
+             Operator),
+            ('"', String, 'string'),
+            (r'_\n', Text),  # Line continuation  (must be before Name)
+            (uni_name + '[%&@!#$]?', Name),
+            ('#.*?#', Literal.Date),
+            (r'(\d+\.\d*|\d*\.\d+)(F[+-]?[0-9]+)?', Number.Float),
+            (r'\d+([SILDFR]|US|UI|UL)?', Number.Integer),
+            (r'&H[0-9a-f]+([SILDFR]|US|UI|UL)?', Number.Integer),
+            (r'&O[0-7]+([SILDFR]|US|UI|UL)?', Number.Integer),
+        ],
+        'string': [
+            (r'""', String),
+            (r'"C?', String, '#pop'),
+            (r'[^"]+', String),
+        ],
+        'dim': [
+            (uni_name, Name.Variable, '#pop'),
+            default('#pop'),  # any other syntax
+        ],
+        'funcname': [
+            (uni_name, Name.Function, '#pop'),
+        ],
+        'classname': [
+            (uni_name, Name.Class, '#pop'),
+        ],
+        'namespace': [
+            (uni_name, Name.Namespace),
+            (r'\.', Name.Namespace),
+            default('#pop'),
+        ],
+        'end': [
+            (r'\s+', Text),
+            (r'(Function|Sub|Property|Class|Structure|Enum|Module|Namespace)\b',
+             Keyword, '#pop'),
+            default('#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*(#If|Module|Namespace)', text, re.MULTILINE):
+            return 0.5
+
+
+class GenericAspxLexer(RegexLexer):
+    """
+    Lexer for ASP.NET pages.
+    """
+
+    name = 'aspx-gen'
+    filenames = []
+    mimetypes = []
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'(<%[@=#]?)(.*?)(%>)', bygroups(Name.Tag, Other, Name.Tag)),
+            (r'(<script.*?>)(.*?)(</script>)', bygroups(using(XmlLexer),
+                                                        Other,
+                                                        using(XmlLexer))),
+            (r'(.+?)(?=<)', using(XmlLexer)),
+            (r'.+', using(XmlLexer)),
+        ],
+    }
+
+
+# TODO support multiple languages within the same source file
+class CSharpAspxLexer(DelegatingLexer):
+    """
+    Lexer for highlighting C# within ASP.NET pages.
+    """
+
+    name = 'aspx-cs'
+    aliases = ['aspx-cs']
+    filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd']
+    mimetypes = []
+
+    def __init__(self, **options):
+        super(CSharpAspxLexer, self).__init__(CSharpLexer, GenericAspxLexer,
+                                              **options)
+
+    def analyse_text(text):
+        if re.search(r'Page\s*Language="C#"', text, re.I) is not None:
+            return 0.2
+        elif re.search(r'script[^>]+language=["\']C#', text, re.I) is not None:
+            return 0.15
+
+
+class VbNetAspxLexer(DelegatingLexer):
+    """
+    Lexer for highlighting Visual Basic.net within ASP.NET pages.
+    """
+
+    name = 'aspx-vb'
+    aliases = ['aspx-vb']
+    filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd']
+    mimetypes = []
+
+    def __init__(self, **options):
+        super(VbNetAspxLexer, self).__init__(VbNetLexer, GenericAspxLexer,
+                                             **options)
+
+    def analyse_text(text):
+        if re.search(r'Page\s*Language="Vb"', text, re.I) is not None:
+            return 0.2
+        elif re.search(r'script[^>]+language=["\']vb', text, re.I) is not None:
+            return 0.15
+
+
+# Very close to functional.OcamlLexer
+class FSharpLexer(RegexLexer):
+    """
+    For the F# language (version 3.0).
+
+    AAAAACK Strings
+    http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc335818775
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'FSharp'
+    aliases = ['fsharp']
+    filenames = ['*.fs', '*.fsi']
+    mimetypes = ['text/x-fsharp']
+
+    keywords = [
+        'abstract', 'as', 'assert', 'base', 'begin', 'class', 'default',
+        'delegate', 'do!', 'do', 'done', 'downcast', 'downto', 'elif', 'else',
+        'end', 'exception', 'extern', 'false', 'finally', 'for', 'function',
+        'fun', 'global', 'if', 'inherit', 'inline', 'interface', 'internal',
+        'in', 'lazy', 'let!', 'let', 'match', 'member', 'module', 'mutable',
+        'namespace', 'new', 'null', 'of', 'open', 'override', 'private', 'public',
+        'rec', 'return!', 'return', 'select', 'static', 'struct', 'then', 'to',
+        'true', 'try', 'type', 'upcast', 'use!', 'use', 'val', 'void', 'when',
+        'while', 'with', 'yield!', 'yield',
+    ]
+    # Reserved words; cannot hurt to color them as keywords too.
+    keywords += [
+        'atomic', 'break', 'checked', 'component', 'const', 'constraint',
+        'constructor', 'continue', 'eager', 'event', 'external', 'fixed',
+        'functor', 'include', 'method', 'mixin', 'object', 'parallel',
+        'process', 'protected', 'pure', 'sealed', 'tailcall', 'trait',
+        'virtual', 'volatile',
+    ]
+    keyopts = [
+        '!=', '#', '&&', '&', '\(', '\)', '\*', '\+', ',', '-\.',
+        '->', '-', '\.\.', '\.', '::', ':=', ':>', ':', ';;', ';', '<-',
+        '<\]', '<', '>\]', '>', '\?\?', '\?', '\[<', '\[\|', '\[', '\]',
+        '_', '`', '\{', '\|\]', '\|', '\}', '~', '<@@', '<@', '=', '@>', '@@>',
+    ]
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    word_operators = ['and', 'or', 'not']
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = [
+        'sbyte', 'byte', 'char', 'nativeint', 'unativeint', 'float32', 'single',
+        'float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32',
+        'uint32', 'int64', 'uint64', 'decimal', 'unit', 'bool', 'string',
+        'list', 'exn', 'obj', 'enum',
+    ]
+
+    # See http://msdn.microsoft.com/en-us/library/dd233181.aspx and/or
+    # http://fsharp.org/about/files/spec.pdf for reference.  Good luck.
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbrafv]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\U[0-9a-fA-F]{8}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text),
+            (r'\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b(?<!\.)([A-Z][\w\']*)(?=\s*\.)',
+             Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name),
+            (r'///.*?\n', String.Doc),
+            (r'//.*?\n', Comment.Single),
+            (r'\(\*(?!\))', Comment, 'comment'),
+
+            (r'@"', String, 'lstring'),
+            (r'"""', String, 'tqs'),
+            (r'"', String, 'string'),
+
+            (r'\b(open|module)(\s+)([\w.]+)',
+             bygroups(Keyword, Text, Name.Namespace)),
+            (r'\b(let!?)(\s+)(\w+)',
+             bygroups(Keyword, Text, Name.Variable)),
+            (r'\b(type)(\s+)(\w+)',
+             bygroups(Keyword, Text, Name.Class)),
+            (r'\b(member|override)(\s+)(\w+)(\.)(\w+)',
+             bygroups(Keyword, Text, Name, Punctuation, Name.Function)),
+            (r'\b(%s)\b' % '|'.join(keywords), Keyword),
+            (r'``([^`\n\r\t]|`[^`\n\r\t])+``', Name),
+            (r'(%s)' % '|'.join(keyopts), Operator),
+            (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator),
+            (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word),
+            (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type),
+            (r'#[ \t]*(if|endif|else|line|nowarn|light|\d+)\b.*?\n',
+             Comment.Preproc),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'\d[\d_]*[uU]?[yslLnQRZINGmM]?', Number.Integer),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*[uU]?[yslLn]?[fF]?', Number.Hex),
+            (r'0[oO][0-7][0-7_]*[uU]?[yslLn]?', Number.Oct),
+            (r'0[bB][01][01_]*[uU]?[yslLn]?', Number.Bin),
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)[fFmM]?',
+             Number.Float),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'B?",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+
+            (r'@?"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            # e.g. dictionary index access
+            default('#pop'),
+        ],
+        'comment': [
+            (r'[^(*)@"]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            # comments cannot be closed within strings in comments
+            (r'@"', String, 'lstring'),
+            (r'"""', String, 'tqs'),
+            (r'"', String, 'string'),
+            (r'[(*)@]', Comment),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            include('escape-sequence'),
+            (r'\\\n', String),
+            (r'\n', String),  # newlines are allowed in any string
+            (r'"B?', String, '#pop'),
+        ],
+        'lstring': [
+            (r'[^"]+', String),
+            (r'\n', String),
+            (r'""', String),
+            (r'"B?', String, '#pop'),
+        ],
+        'tqs': [
+            (r'[^"]+', String),
+            (r'\n', String),
+            (r'"""B?', String, '#pop'),
+            (r'"', String),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_php_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_php_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_php_builtins.py	(revision 1126)
@@ -0,0 +1,4756 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._php_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file loads the function names and their modules from the
+    php webpage and generates itself.
+
+    Do not alter the MODULES dict by hand!
+
+    WARNING: the generation transfers quite much data over your
+             internet connection. don't run that at home, use
+             a server ;-)
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+MODULES = {'.NET': ('dotnet_load',),
+ 'APC': ('apc_add',
+         'apc_bin_dump',
+         'apc_bin_dumpfile',
+         'apc_bin_load',
+         'apc_bin_loadfile',
+         'apc_cache_info',
+         'apc_cas',
+         'apc_clear_cache',
+         'apc_compile_file',
+         'apc_dec',
+         'apc_define_constants',
+         'apc_delete_file',
+         'apc_delete',
+         'apc_exists',
+         'apc_fetch',
+         'apc_inc',
+         'apc_load_constants',
+         'apc_sma_info',
+         'apc_store'),
+ 'APD': ('apd_breakpoint',
+         'apd_callstack',
+         'apd_clunk',
+         'apd_continue',
+         'apd_croak',
+         'apd_dump_function_table',
+         'apd_dump_persistent_resources',
+         'apd_dump_regular_resources',
+         'apd_echo',
+         'apd_get_active_symbols',
+         'apd_set_pprof_trace',
+         'apd_set_session_trace_socket',
+         'apd_set_session_trace',
+         'apd_set_session',
+         'override_function',
+         'rename_function'),
+ 'Aliases and deprecated Mysqli': ('mysqli_bind_param',
+                                   'mysqli_bind_result',
+                                   'mysqli_client_encoding',
+                                   'mysqli_connect',
+                                   'mysqli_disable_rpl_parse',
+                                   'mysqli_enable_reads_from_master',
+                                   'mysqli_enable_rpl_parse',
+                                   'mysqli_escape_string',
+                                   'mysqli_execute',
+                                   'mysqli_fetch',
+                                   'mysqli_get_cache_stats',
+                                   'mysqli_get_metadata',
+                                   'mysqli_master_query',
+                                   'mysqli_param_count',
+                                   'mysqli_report',
+                                   'mysqli_rpl_parse_enabled',
+                                   'mysqli_rpl_probe',
+                                   'mysqli_send_long_data',
+                                   'mysqli_slave_query'),
+ 'Apache': ('apache_child_terminate',
+            'apache_get_modules',
+            'apache_get_version',
+            'apache_getenv',
+            'apache_lookup_uri',
+            'apache_note',
+            'apache_request_headers',
+            'apache_reset_timeout',
+            'apache_response_headers',
+            'apache_setenv',
+            'getallheaders',
+            'virtual'),
+ 'Array': ('array_change_key_case',
+           'array_chunk',
+           'array_column',
+           'array_combine',
+           'array_count_values',
+           'array_diff_assoc',
+           'array_diff_key',
+           'array_diff_uassoc',
+           'array_diff_ukey',
+           'array_diff',
+           'array_fill_keys',
+           'array_fill',
+           'array_filter',
+           'array_flip',
+           'array_intersect_assoc',
+           'array_intersect_key',
+           'array_intersect_uassoc',
+           'array_intersect_ukey',
+           'array_intersect',
+           'array_key_exists',
+           'array_keys',
+           'array_map',
+           'array_merge_recursive',
+           'array_merge',
+           'array_multisort',
+           'array_pad',
+           'array_pop',
+           'array_product',
+           'array_push',
+           'array_rand',
+           'array_reduce',
+           'array_replace_recursive',
+           'array_replace',
+           'array_reverse',
+           'array_search',
+           'array_shift',
+           'array_slice',
+           'array_splice',
+           'array_sum',
+           'array_udiff_assoc',
+           'array_udiff_uassoc',
+           'array_udiff',
+           'array_uintersect_assoc',
+           'array_uintersect_uassoc',
+           'array_uintersect',
+           'array_unique',
+           'array_unshift',
+           'array_values',
+           'array_walk_recursive',
+           'array_walk',
+           'array',
+           'arsort',
+           'asort',
+           'compact',
+           'count',
+           'current',
+           'each',
+           'end',
+           'extract',
+           'in_array',
+           'key_exists',
+           'key',
+           'krsort',
+           'ksort',
+           'list',
+           'natcasesort',
+           'natsort',
+           'next',
+           'pos',
+           'prev',
+           'range',
+           'reset',
+           'rsort',
+           'shuffle',
+           'sizeof',
+           'sort',
+           'uasort',
+           'uksort',
+           'usort'),
+ 'BBCode': ('bbcode_add_element',
+            'bbcode_add_smiley',
+            'bbcode_create',
+            'bbcode_destroy',
+            'bbcode_parse',
+            'bbcode_set_arg_parser',
+            'bbcode_set_flags'),
+ 'BC Math': ('bcadd',
+             'bccomp',
+             'bcdiv',
+             'bcmod',
+             'bcmul',
+             'bcpow',
+             'bcpowmod',
+             'bcscale',
+             'bcsqrt',
+             'bcsub'),
+ 'Blenc': ('blenc_encrypt',),
+ 'Bzip2': ('bzclose',
+           'bzcompress',
+           'bzdecompress',
+           'bzerrno',
+           'bzerror',
+           'bzerrstr',
+           'bzflush',
+           'bzopen',
+           'bzread',
+           'bzwrite'),
+ 'COM': ('com_addref',
+         'com_create_guid',
+         'com_event_sink',
+         'com_get_active_object',
+         'com_get',
+         'com_invoke',
+         'com_isenum',
+         'com_load_typelib',
+         'com_load',
+         'com_message_pump',
+         'com_print_typeinfo',
+         'com_propget',
+         'com_propput',
+         'com_propset',
+         'com_release',
+         'com_set',
+         'variant_abs',
+         'variant_add',
+         'variant_and',
+         'variant_cast',
+         'variant_cat',
+         'variant_cmp',
+         'variant_date_from_timestamp',
+         'variant_date_to_timestamp',
+         'variant_div',
+         'variant_eqv',
+         'variant_fix',
+         'variant_get_type',
+         'variant_idiv',
+         'variant_imp',
+         'variant_int',
+         'variant_mod',
+         'variant_mul',
+         'variant_neg',
+         'variant_not',
+         'variant_or',
+         'variant_pow',
+         'variant_round',
+         'variant_set_type',
+         'variant_set',
+         'variant_sub',
+         'variant_xor'),
+ 'CUBRID': ('cubrid_bind',
+            'cubrid_close_prepare',
+            'cubrid_close_request',
+            'cubrid_col_get',
+            'cubrid_col_size',
+            'cubrid_column_names',
+            'cubrid_column_types',
+            'cubrid_commit',
+            'cubrid_connect_with_url',
+            'cubrid_connect',
+            'cubrid_current_oid',
+            'cubrid_disconnect',
+            'cubrid_drop',
+            'cubrid_error_code_facility',
+            'cubrid_error_code',
+            'cubrid_error_msg',
+            'cubrid_execute',
+            'cubrid_fetch',
+            'cubrid_free_result',
+            'cubrid_get_autocommit',
+            'cubrid_get_charset',
+            'cubrid_get_class_name',
+            'cubrid_get_client_info',
+            'cubrid_get_db_parameter',
+            'cubrid_get_query_timeout',
+            'cubrid_get_server_info',
+            'cubrid_get',
+            'cubrid_insert_id',
+            'cubrid_is_instance',
+            'cubrid_lob_close',
+            'cubrid_lob_export',
+            'cubrid_lob_get',
+            'cubrid_lob_send',
+            'cubrid_lob_size',
+            'cubrid_lob2_bind',
+            'cubrid_lob2_close',
+            'cubrid_lob2_export',
+            'cubrid_lob2_import',
+            'cubrid_lob2_new',
+            'cubrid_lob2_read',
+            'cubrid_lob2_seek64',
+            'cubrid_lob2_seek',
+            'cubrid_lob2_size64',
+            'cubrid_lob2_size',
+            'cubrid_lob2_tell64',
+            'cubrid_lob2_tell',
+            'cubrid_lob2_write',
+            'cubrid_lock_read',
+            'cubrid_lock_write',
+            'cubrid_move_cursor',
+            'cubrid_next_result',
+            'cubrid_num_cols',
+            'cubrid_num_rows',
+            'cubrid_pconnect_with_url',
+            'cubrid_pconnect',
+            'cubrid_prepare',
+            'cubrid_put',
+            'cubrid_rollback',
+            'cubrid_schema',
+            'cubrid_seq_drop',
+            'cubrid_seq_insert',
+            'cubrid_seq_put',
+            'cubrid_set_add',
+            'cubrid_set_autocommit',
+            'cubrid_set_db_parameter',
+            'cubrid_set_drop',
+            'cubrid_set_query_timeout',
+            'cubrid_version'),
+ 'Cairo': ('cairo_create',
+           'cairo_font_face_get_type',
+           'cairo_font_face_status',
+           'cairo_font_options_create',
+           'cairo_font_options_equal',
+           'cairo_font_options_get_antialias',
+           'cairo_font_options_get_hint_metrics',
+           'cairo_font_options_get_hint_style',
+           'cairo_font_options_get_subpixel_order',
+           'cairo_font_options_hash',
+           'cairo_font_options_merge',
+           'cairo_font_options_set_antialias',
+           'cairo_font_options_set_hint_metrics',
+           'cairo_font_options_set_hint_style',
+           'cairo_font_options_set_subpixel_order',
+           'cairo_font_options_status',
+           'cairo_format_stride_for_width',
+           'cairo_image_surface_create_for_data',
+           'cairo_image_surface_create_from_png',
+           'cairo_image_surface_create',
+           'cairo_image_surface_get_data',
+           'cairo_image_surface_get_format',
+           'cairo_image_surface_get_height',
+           'cairo_image_surface_get_stride',
+           'cairo_image_surface_get_width',
+           'cairo_matrix_create_scale',
+           'cairo_matrix_create_translate',
+           'cairo_matrix_invert',
+           'cairo_matrix_multiply',
+           'cairo_matrix_rotate',
+           'cairo_matrix_transform_distance',
+           'cairo_matrix_transform_point',
+           'cairo_matrix_translate',
+           'cairo_pattern_add_color_stop_rgb',
+           'cairo_pattern_add_color_stop_rgba',
+           'cairo_pattern_create_for_surface',
+           'cairo_pattern_create_linear',
+           'cairo_pattern_create_radial',
+           'cairo_pattern_create_rgb',
+           'cairo_pattern_create_rgba',
+           'cairo_pattern_get_color_stop_count',
+           'cairo_pattern_get_color_stop_rgba',
+           'cairo_pattern_get_extend',
+           'cairo_pattern_get_filter',
+           'cairo_pattern_get_linear_points',
+           'cairo_pattern_get_matrix',
+           'cairo_pattern_get_radial_circles',
+           'cairo_pattern_get_rgba',
+           'cairo_pattern_get_surface',
+           'cairo_pattern_get_type',
+           'cairo_pattern_set_extend',
+           'cairo_pattern_set_filter',
+           'cairo_pattern_set_matrix',
+           'cairo_pattern_status',
+           'cairo_pdf_surface_create',
+           'cairo_pdf_surface_set_size',
+           'cairo_ps_get_levels',
+           'cairo_ps_level_to_string',
+           'cairo_ps_surface_create',
+           'cairo_ps_surface_dsc_begin_page_setup',
+           'cairo_ps_surface_dsc_begin_setup',
+           'cairo_ps_surface_dsc_comment',
+           'cairo_ps_surface_get_eps',
+           'cairo_ps_surface_restrict_to_level',
+           'cairo_ps_surface_set_eps',
+           'cairo_ps_surface_set_size',
+           'cairo_scaled_font_create',
+           'cairo_scaled_font_extents',
+           'cairo_scaled_font_get_ctm',
+           'cairo_scaled_font_get_font_face',
+           'cairo_scaled_font_get_font_matrix',
+           'cairo_scaled_font_get_font_options',
+           'cairo_scaled_font_get_scale_matrix',
+           'cairo_scaled_font_get_type',
+           'cairo_scaled_font_glyph_extents',
+           'cairo_scaled_font_status',
+           'cairo_scaled_font_text_extents',
+           'cairo_surface_copy_page',
+           'cairo_surface_create_similar',
+           'cairo_surface_finish',
+           'cairo_surface_flush',
+           'cairo_surface_get_content',
+           'cairo_surface_get_device_offset',
+           'cairo_surface_get_font_options',
+           'cairo_surface_get_type',
+           'cairo_surface_mark_dirty_rectangle',
+           'cairo_surface_mark_dirty',
+           'cairo_surface_set_device_offset',
+           'cairo_surface_set_fallback_resolution',
+           'cairo_surface_show_page',
+           'cairo_surface_status',
+           'cairo_surface_write_to_png',
+           'cairo_svg_surface_create',
+           'cairo_svg_surface_restrict_to_version',
+           'cairo_svg_version_to_string'),
+ 'Calendar': ('cal_days_in_month',
+              'cal_from_jd',
+              'cal_info',
+              'cal_to_jd',
+              'easter_date',
+              'easter_days',
+              'FrenchToJD',
+              'GregorianToJD',
+              'JDDayOfWeek',
+              'JDMonthName',
+              'JDToFrench',
+              'JDToGregorian',
+              'jdtojewish',
+              'JDToJulian',
+              'jdtounix',
+              'JewishToJD',
+              'JulianToJD',
+              'unixtojd'),
+ 'Classes/Object': ('__autoload',
+                    'call_user_method_array',
+                    'call_user_method',
+                    'class_alias',
+                    'class_exists',
+                    'get_called_class',
+                    'get_class_methods',
+                    'get_class_vars',
+                    'get_class',
+                    'get_declared_classes',
+                    'get_declared_interfaces',
+                    'get_declared_traits',
+                    'get_object_vars',
+                    'get_parent_class',
+                    'interface_exists',
+                    'is_a',
+                    'is_subclass_of',
+                    'method_exists',
+                    'property_exists',
+                    'trait_exists'),
+ 'Classkit': ('classkit_import',
+              'classkit_method_add',
+              'classkit_method_copy',
+              'classkit_method_redefine',
+              'classkit_method_remove',
+              'classkit_method_rename'),
+ 'Crack': ('crack_check',
+           'crack_closedict',
+           'crack_getlastmessage',
+           'crack_opendict'),
+ 'Ctype': ('ctype_alnum',
+           'ctype_alpha',
+           'ctype_cntrl',
+           'ctype_digit',
+           'ctype_graph',
+           'ctype_lower',
+           'ctype_print',
+           'ctype_punct',
+           'ctype_space',
+           'ctype_upper',
+           'ctype_xdigit'),
+ 'Cyrus': ('cyrus_authenticate',
+           'cyrus_bind',
+           'cyrus_close',
+           'cyrus_connect',
+           'cyrus_query',
+           'cyrus_unbind'),
+ 'DB++': ('dbplus_add',
+          'dbplus_aql',
+          'dbplus_chdir',
+          'dbplus_close',
+          'dbplus_curr',
+          'dbplus_errcode',
+          'dbplus_errno',
+          'dbplus_find',
+          'dbplus_first',
+          'dbplus_flush',
+          'dbplus_freealllocks',
+          'dbplus_freelock',
+          'dbplus_freerlocks',
+          'dbplus_getlock',
+          'dbplus_getunique',
+          'dbplus_info',
+          'dbplus_last',
+          'dbplus_lockrel',
+          'dbplus_next',
+          'dbplus_open',
+          'dbplus_prev',
+          'dbplus_rchperm',
+          'dbplus_rcreate',
+          'dbplus_rcrtexact',
+          'dbplus_rcrtlike',
+          'dbplus_resolve',
+          'dbplus_restorepos',
+          'dbplus_rkeys',
+          'dbplus_ropen',
+          'dbplus_rquery',
+          'dbplus_rrename',
+          'dbplus_rsecindex',
+          'dbplus_runlink',
+          'dbplus_rzap',
+          'dbplus_savepos',
+          'dbplus_setindex',
+          'dbplus_setindexbynumber',
+          'dbplus_sql',
+          'dbplus_tcl',
+          'dbplus_tremove',
+          'dbplus_undo',
+          'dbplus_undoprepare',
+          'dbplus_unlockrel',
+          'dbplus_unselect',
+          'dbplus_update',
+          'dbplus_xlockrel',
+          'dbplus_xunlockrel'),
+ 'DBA': ('dba_close',
+         'dba_delete',
+         'dba_exists',
+         'dba_fetch',
+         'dba_firstkey',
+         'dba_handlers',
+         'dba_insert',
+         'dba_key_split',
+         'dba_list',
+         'dba_nextkey',
+         'dba_open',
+         'dba_optimize',
+         'dba_popen',
+         'dba_replace',
+         'dba_sync'),
+ 'DOM': ('dom_import_simplexml',),
+ 'Date/Time': ('checkdate',
+               'date_add',
+               'date_create_from_format',
+               'date_create_immutable_from_format',
+               'date_create_immutable',
+               'date_create',
+               'date_date_set',
+               'date_default_timezone_get',
+               'date_default_timezone_set',
+               'date_diff',
+               'date_format',
+               'date_get_last_errors',
+               'date_interval_create_from_date_string',
+               'date_interval_format',
+               'date_isodate_set',
+               'date_modify',
+               'date_offset_get',
+               'date_parse_from_format',
+               'date_parse',
+               'date_sub',
+               'date_sun_info',
+               'date_sunrise',
+               'date_sunset',
+               'date_time_set',
+               'date_timestamp_get',
+               'date_timestamp_set',
+               'date_timezone_get',
+               'date_timezone_set',
+               'date',
+               'getdate',
+               'gettimeofday',
+               'gmdate',
+               'gmmktime',
+               'gmstrftime',
+               'idate',
+               'localtime',
+               'microtime',
+               'mktime',
+               'strftime',
+               'strptime',
+               'strtotime',
+               'time',
+               'timezone_abbreviations_list',
+               'timezone_identifiers_list',
+               'timezone_location_get',
+               'timezone_name_from_abbr',
+               'timezone_name_get',
+               'timezone_offset_get',
+               'timezone_open',
+               'timezone_transitions_get',
+               'timezone_version_get'),
+ 'Direct IO': ('dio_close',
+               'dio_fcntl',
+               'dio_open',
+               'dio_read',
+               'dio_seek',
+               'dio_stat',
+               'dio_tcsetattr',
+               'dio_truncate',
+               'dio_write'),
+ 'Directory': ('chdir',
+               'chroot',
+               'closedir',
+               'dir',
+               'getcwd',
+               'opendir',
+               'readdir',
+               'rewinddir',
+               'scandir'),
+ 'Eio': ('eio_busy',
+         'eio_cancel',
+         'eio_chmod',
+         'eio_chown',
+         'eio_close',
+         'eio_custom',
+         'eio_dup2',
+         'eio_event_loop',
+         'eio_fallocate',
+         'eio_fchmod',
+         'eio_fchown',
+         'eio_fdatasync',
+         'eio_fstat',
+         'eio_fstatvfs',
+         'eio_fsync',
+         'eio_ftruncate',
+         'eio_futime',
+         'eio_get_event_stream',
+         'eio_get_last_error',
+         'eio_grp_add',
+         'eio_grp_cancel',
+         'eio_grp_limit',
+         'eio_grp',
+         'eio_init',
+         'eio_link',
+         'eio_lstat',
+         'eio_mkdir',
+         'eio_mknod',
+         'eio_nop',
+         'eio_npending',
+         'eio_nready',
+         'eio_nreqs',
+         'eio_nthreads',
+         'eio_open',
+         'eio_poll',
+         'eio_read',
+         'eio_readahead',
+         'eio_readdir',
+         'eio_readlink',
+         'eio_realpath',
+         'eio_rename',
+         'eio_rmdir',
+         'eio_seek',
+         'eio_sendfile',
+         'eio_set_max_idle',
+         'eio_set_max_parallel',
+         'eio_set_max_poll_reqs',
+         'eio_set_max_poll_time',
+         'eio_set_min_parallel',
+         'eio_stat',
+         'eio_statvfs',
+         'eio_symlink',
+         'eio_sync_file_range',
+         'eio_sync',
+         'eio_syncfs',
+         'eio_truncate',
+         'eio_unlink',
+         'eio_utime',
+         'eio_write'),
+ 'Enchant': ('enchant_broker_describe',
+             'enchant_broker_dict_exists',
+             'enchant_broker_free_dict',
+             'enchant_broker_free',
+             'enchant_broker_get_error',
+             'enchant_broker_init',
+             'enchant_broker_list_dicts',
+             'enchant_broker_request_dict',
+             'enchant_broker_request_pwl_dict',
+             'enchant_broker_set_ordering',
+             'enchant_dict_add_to_personal',
+             'enchant_dict_add_to_session',
+             'enchant_dict_check',
+             'enchant_dict_describe',
+             'enchant_dict_get_error',
+             'enchant_dict_is_in_session',
+             'enchant_dict_quick_check',
+             'enchant_dict_store_replacement',
+             'enchant_dict_suggest'),
+ 'Error Handling': ('debug_backtrace',
+                    'debug_print_backtrace',
+                    'error_get_last',
+                    'error_log',
+                    'error_reporting',
+                    'restore_error_handler',
+                    'restore_exception_handler',
+                    'set_error_handler',
+                    'set_exception_handler',
+                    'trigger_error',
+                    'user_error'),
+ 'Exif': ('exif_imagetype',
+          'exif_read_data',
+          'exif_tagname',
+          'exif_thumbnail',
+          'read_exif_data'),
+ 'Expect': ('expect_expectl', 'expect_popen'),
+ 'FAM': ('fam_cancel_monitor',
+         'fam_close',
+         'fam_monitor_collection',
+         'fam_monitor_directory',
+         'fam_monitor_file',
+         'fam_next_event',
+         'fam_open',
+         'fam_pending',
+         'fam_resume_monitor',
+         'fam_suspend_monitor'),
+ 'FDF': ('fdf_add_doc_javascript',
+         'fdf_add_template',
+         'fdf_close',
+         'fdf_create',
+         'fdf_enum_values',
+         'fdf_errno',
+         'fdf_error',
+         'fdf_get_ap',
+         'fdf_get_attachment',
+         'fdf_get_encoding',
+         'fdf_get_file',
+         'fdf_get_flags',
+         'fdf_get_opt',
+         'fdf_get_status',
+         'fdf_get_value',
+         'fdf_get_version',
+         'fdf_header',
+         'fdf_next_field_name',
+         'fdf_open_string',
+         'fdf_open',
+         'fdf_remove_item',
+         'fdf_save_string',
+         'fdf_save',
+         'fdf_set_ap',
+         'fdf_set_encoding',
+         'fdf_set_file',
+         'fdf_set_flags',
+         'fdf_set_javascript_action',
+         'fdf_set_on_import_javascript',
+         'fdf_set_opt',
+         'fdf_set_status',
+         'fdf_set_submit_form_action',
+         'fdf_set_target_frame',
+         'fdf_set_value',
+         'fdf_set_version'),
+ 'FPM': ('fastcgi_finish_request',),
+ 'FTP': ('ftp_alloc',
+         'ftp_cdup',
+         'ftp_chdir',
+         'ftp_chmod',
+         'ftp_close',
+         'ftp_connect',
+         'ftp_delete',
+         'ftp_exec',
+         'ftp_fget',
+         'ftp_fput',
+         'ftp_get_option',
+         'ftp_get',
+         'ftp_login',
+         'ftp_mdtm',
+         'ftp_mkdir',
+         'ftp_nb_continue',
+         'ftp_nb_fget',
+         'ftp_nb_fput',
+         'ftp_nb_get',
+         'ftp_nb_put',
+         'ftp_nlist',
+         'ftp_pasv',
+         'ftp_put',
+         'ftp_pwd',
+         'ftp_quit',
+         'ftp_raw',
+         'ftp_rawlist',
+         'ftp_rename',
+         'ftp_rmdir',
+         'ftp_set_option',
+         'ftp_site',
+         'ftp_size',
+         'ftp_ssl_connect',
+         'ftp_systype'),
+ 'Fann': ('fann_cascadetrain_on_data',
+          'fann_cascadetrain_on_file',
+          'fann_clear_scaling_params',
+          'fann_copy',
+          'fann_create_from_file',
+          'fann_create_shortcut_array',
+          'fann_create_shortcut',
+          'fann_create_sparse_array',
+          'fann_create_sparse',
+          'fann_create_standard_array',
+          'fann_create_standard',
+          'fann_create_train_from_callback',
+          'fann_create_train',
+          'fann_descale_input',
+          'fann_descale_output',
+          'fann_descale_train',
+          'fann_destroy_train',
+          'fann_destroy',
+          'fann_duplicate_train_data',
+          'fann_get_activation_function',
+          'fann_get_activation_steepness',
+          'fann_get_bias_array',
+          'fann_get_bit_fail_limit',
+          'fann_get_bit_fail',
+          'fann_get_cascade_activation_functions_count',
+          'fann_get_cascade_activation_functions',
+          'fann_get_cascade_activation_steepnesses_count',
+          'fann_get_cascade_activation_steepnesses',
+          'fann_get_cascade_candidate_change_fraction',
+          'fann_get_cascade_candidate_limit',
+          'fann_get_cascade_candidate_stagnation_epochs',
+          'fann_get_cascade_max_cand_epochs',
+          'fann_get_cascade_max_out_epochs',
+          'fann_get_cascade_min_cand_epochs',
+          'fann_get_cascade_min_out_epochs',
+          'fann_get_cascade_num_candidate_groups',
+          'fann_get_cascade_num_candidates',
+          'fann_get_cascade_output_change_fraction',
+          'fann_get_cascade_output_stagnation_epochs',
+          'fann_get_cascade_weight_multiplier',
+          'fann_get_connection_array',
+          'fann_get_connection_rate',
+          'fann_get_errno',
+          'fann_get_errstr',
+          'fann_get_layer_array',
+          'fann_get_learning_momentum',
+          'fann_get_learning_rate',
+          'fann_get_MSE',
+          'fann_get_network_type',
+          'fann_get_num_input',
+          'fann_get_num_layers',
+          'fann_get_num_output',
+          'fann_get_quickprop_decay',
+          'fann_get_quickprop_mu',
+          'fann_get_rprop_decrease_factor',
+          'fann_get_rprop_delta_max',
+          'fann_get_rprop_delta_min',
+          'fann_get_rprop_delta_zero',
+          'fann_get_rprop_increase_factor',
+          'fann_get_sarprop_step_error_shift',
+          'fann_get_sarprop_step_error_threshold_factor',
+          'fann_get_sarprop_temperature',
+          'fann_get_sarprop_weight_decay_shift',
+          'fann_get_total_connections',
+          'fann_get_total_neurons',
+          'fann_get_train_error_function',
+          'fann_get_train_stop_function',
+          'fann_get_training_algorithm',
+          'fann_init_weights',
+          'fann_length_train_data',
+          'fann_merge_train_data',
+          'fann_num_input_train_data',
+          'fann_num_output_train_data',
+          'fann_print_error',
+          'fann_randomize_weights',
+          'fann_read_train_from_file',
+          'fann_reset_errno',
+          'fann_reset_errstr',
+          'fann_reset_MSE',
+          'fann_run',
+          'fann_save_train',
+          'fann_save',
+          'fann_scale_input_train_data',
+          'fann_scale_input',
+          'fann_scale_output_train_data',
+          'fann_scale_output',
+          'fann_scale_train_data',
+          'fann_scale_train',
+          'fann_set_activation_function_hidden',
+          'fann_set_activation_function_layer',
+          'fann_set_activation_function_output',
+          'fann_set_activation_function',
+          'fann_set_activation_steepness_hidden',
+          'fann_set_activation_steepness_layer',
+          'fann_set_activation_steepness_output',
+          'fann_set_activation_steepness',
+          'fann_set_bit_fail_limit',
+          'fann_set_callback',
+          'fann_set_cascade_activation_functions',
+          'fann_set_cascade_activation_steepnesses',
+          'fann_set_cascade_candidate_change_fraction',
+          'fann_set_cascade_candidate_limit',
+          'fann_set_cascade_candidate_stagnation_epochs',
+          'fann_set_cascade_max_cand_epochs',
+          'fann_set_cascade_max_out_epochs',
+          'fann_set_cascade_min_cand_epochs',
+          'fann_set_cascade_min_out_epochs',
+          'fann_set_cascade_num_candidate_groups',
+          'fann_set_cascade_output_change_fraction',
+          'fann_set_cascade_output_stagnation_epochs',
+          'fann_set_cascade_weight_multiplier',
+          'fann_set_error_log',
+          'fann_set_input_scaling_params',
+          'fann_set_learning_momentum',
+          'fann_set_learning_rate',
+          'fann_set_output_scaling_params',
+          'fann_set_quickprop_decay',
+          'fann_set_quickprop_mu',
+          'fann_set_rprop_decrease_factor',
+          'fann_set_rprop_delta_max',
+          'fann_set_rprop_delta_min',
+          'fann_set_rprop_delta_zero',
+          'fann_set_rprop_increase_factor',
+          'fann_set_sarprop_step_error_shift',
+          'fann_set_sarprop_step_error_threshold_factor',
+          'fann_set_sarprop_temperature',
+          'fann_set_sarprop_weight_decay_shift',
+          'fann_set_scaling_params',
+          'fann_set_train_error_function',
+          'fann_set_train_stop_function',
+          'fann_set_training_algorithm',
+          'fann_set_weight_array',
+          'fann_set_weight',
+          'fann_shuffle_train_data',
+          'fann_subset_train_data',
+          'fann_test_data',
+          'fann_test',
+          'fann_train_epoch',
+          'fann_train_on_data',
+          'fann_train_on_file',
+          'fann_train'),
+ 'Fileinfo': ('finfo_buffer',
+              'finfo_close',
+              'finfo_file',
+              'finfo_open',
+              'finfo_set_flags',
+              'mime_content_type'),
+ 'Filesystem': ('basename',
+                'chgrp',
+                'chmod',
+                'chown',
+                'clearstatcache',
+                'copy',
+                'dirname',
+                'disk_free_space',
+                'disk_total_space',
+                'diskfreespace',
+                'fclose',
+                'feof',
+                'fflush',
+                'fgetc',
+                'fgetcsv',
+                'fgets',
+                'fgetss',
+                'file_exists',
+                'file_get_contents',
+                'file_put_contents',
+                'file',
+                'fileatime',
+                'filectime',
+                'filegroup',
+                'fileinode',
+                'filemtime',
+                'fileowner',
+                'fileperms',
+                'filesize',
+                'filetype',
+                'flock',
+                'fnmatch',
+                'fopen',
+                'fpassthru',
+                'fputcsv',
+                'fputs',
+                'fread',
+                'fscanf',
+                'fseek',
+                'fstat',
+                'ftell',
+                'ftruncate',
+                'fwrite',
+                'glob',
+                'is_dir',
+                'is_executable',
+                'is_file',
+                'is_link',
+                'is_readable',
+                'is_uploaded_file',
+                'is_writable',
+                'is_writeable',
+                'lchgrp',
+                'lchown',
+                'link',
+                'linkinfo',
+                'lstat',
+                'mkdir',
+                'move_uploaded_file',
+                'parse_ini_file',
+                'parse_ini_string',
+                'pathinfo',
+                'pclose',
+                'popen',
+                'readfile',
+                'readlink',
+                'realpath_cache_get',
+                'realpath_cache_size',
+                'realpath',
+                'rename',
+                'rewind',
+                'rmdir',
+                'set_file_buffer',
+                'stat',
+                'symlink',
+                'tempnam',
+                'tmpfile',
+                'touch',
+                'umask',
+                'unlink'),
+ 'Filter': ('filter_has_var',
+            'filter_id',
+            'filter_input_array',
+            'filter_input',
+            'filter_list',
+            'filter_var_array',
+            'filter_var'),
+ 'Firebird/InterBase': ('ibase_add_user',
+                        'ibase_affected_rows',
+                        'ibase_backup',
+                        'ibase_blob_add',
+                        'ibase_blob_cancel',
+                        'ibase_blob_close',
+                        'ibase_blob_create',
+                        'ibase_blob_echo',
+                        'ibase_blob_get',
+                        'ibase_blob_import',
+                        'ibase_blob_info',
+                        'ibase_blob_open',
+                        'ibase_close',
+                        'ibase_commit_ret',
+                        'ibase_commit',
+                        'ibase_connect',
+                        'ibase_db_info',
+                        'ibase_delete_user',
+                        'ibase_drop_db',
+                        'ibase_errcode',
+                        'ibase_errmsg',
+                        'ibase_execute',
+                        'ibase_fetch_assoc',
+                        'ibase_fetch_object',
+                        'ibase_fetch_row',
+                        'ibase_field_info',
+                        'ibase_free_event_handler',
+                        'ibase_free_query',
+                        'ibase_free_result',
+                        'ibase_gen_id',
+                        'ibase_maintain_db',
+                        'ibase_modify_user',
+                        'ibase_name_result',
+                        'ibase_num_fields',
+                        'ibase_num_params',
+                        'ibase_param_info',
+                        'ibase_pconnect',
+                        'ibase_prepare',
+                        'ibase_query',
+                        'ibase_restore',
+                        'ibase_rollback_ret',
+                        'ibase_rollback',
+                        'ibase_server_info',
+                        'ibase_service_attach',
+                        'ibase_service_detach',
+                        'ibase_set_event_handler',
+                        'ibase_trans',
+                        'ibase_wait_event'),
+ 'FriBiDi': ('fribidi_log2vis',),
+ 'FrontBase': ('fbsql_affected_rows',
+               'fbsql_autocommit',
+               'fbsql_blob_size',
+               'fbsql_change_user',
+               'fbsql_clob_size',
+               'fbsql_close',
+               'fbsql_commit',
+               'fbsql_connect',
+               'fbsql_create_blob',
+               'fbsql_create_clob',
+               'fbsql_create_db',
+               'fbsql_data_seek',
+               'fbsql_database_password',
+               'fbsql_database',
+               'fbsql_db_query',
+               'fbsql_db_status',
+               'fbsql_drop_db',
+               'fbsql_errno',
+               'fbsql_error',
+               'fbsql_fetch_array',
+               'fbsql_fetch_assoc',
+               'fbsql_fetch_field',
+               'fbsql_fetch_lengths',
+               'fbsql_fetch_object',
+               'fbsql_fetch_row',
+               'fbsql_field_flags',
+               'fbsql_field_len',
+               'fbsql_field_name',
+               'fbsql_field_seek',
+               'fbsql_field_table',
+               'fbsql_field_type',
+               'fbsql_free_result',
+               'fbsql_get_autostart_info',
+               'fbsql_hostname',
+               'fbsql_insert_id',
+               'fbsql_list_dbs',
+               'fbsql_list_fields',
+               'fbsql_list_tables',
+               'fbsql_next_result',
+               'fbsql_num_fields',
+               'fbsql_num_rows',
+               'fbsql_password',
+               'fbsql_pconnect',
+               'fbsql_query',
+               'fbsql_read_blob',
+               'fbsql_read_clob',
+               'fbsql_result',
+               'fbsql_rollback',
+               'fbsql_rows_fetched',
+               'fbsql_select_db',
+               'fbsql_set_characterset',
+               'fbsql_set_lob_mode',
+               'fbsql_set_password',
+               'fbsql_set_transaction',
+               'fbsql_start_db',
+               'fbsql_stop_db',
+               'fbsql_table_name',
+               'fbsql_tablename',
+               'fbsql_username',
+               'fbsql_warnings'),
+ 'Function handling': ('call_user_func_array',
+                       'call_user_func',
+                       'create_function',
+                       'forward_static_call_array',
+                       'forward_static_call',
+                       'func_get_arg',
+                       'func_get_args',
+                       'func_num_args',
+                       'function_exists',
+                       'get_defined_functions',
+                       'register_shutdown_function',
+                       'register_tick_function',
+                       'unregister_tick_function'),
+ 'GD and Image': ('gd_info',
+                  'getimagesize',
+                  'getimagesizefromstring',
+                  'image_type_to_extension',
+                  'image_type_to_mime_type',
+                  'image2wbmp',
+                  'imageaffine',
+                  'imageaffinematrixconcat',
+                  'imageaffinematrixget',
+                  'imagealphablending',
+                  'imageantialias',
+                  'imagearc',
+                  'imagechar',
+                  'imagecharup',
+                  'imagecolorallocate',
+                  'imagecolorallocatealpha',
+                  'imagecolorat',
+                  'imagecolorclosest',
+                  'imagecolorclosestalpha',
+                  'imagecolorclosesthwb',
+                  'imagecolordeallocate',
+                  'imagecolorexact',
+                  'imagecolorexactalpha',
+                  'imagecolormatch',
+                  'imagecolorresolve',
+                  'imagecolorresolvealpha',
+                  'imagecolorset',
+                  'imagecolorsforindex',
+                  'imagecolorstotal',
+                  'imagecolortransparent',
+                  'imageconvolution',
+                  'imagecopy',
+                  'imagecopymerge',
+                  'imagecopymergegray',
+                  'imagecopyresampled',
+                  'imagecopyresized',
+                  'imagecreate',
+                  'imagecreatefromgd2',
+                  'imagecreatefromgd2part',
+                  'imagecreatefromgd',
+                  'imagecreatefromgif',
+                  'imagecreatefromjpeg',
+                  'imagecreatefrompng',
+                  'imagecreatefromstring',
+                  'imagecreatefromwbmp',
+                  'imagecreatefromwebp',
+                  'imagecreatefromxbm',
+                  'imagecreatefromxpm',
+                  'imagecreatetruecolor',
+                  'imagecrop',
+                  'imagecropauto',
+                  'imagedashedline',
+                  'imagedestroy',
+                  'imageellipse',
+                  'imagefill',
+                  'imagefilledarc',
+                  'imagefilledellipse',
+                  'imagefilledpolygon',
+                  'imagefilledrectangle',
+                  'imagefilltoborder',
+                  'imagefilter',
+                  'imageflip',
+                  'imagefontheight',
+                  'imagefontwidth',
+                  'imageftbbox',
+                  'imagefttext',
+                  'imagegammacorrect',
+                  'imagegd2',
+                  'imagegd',
+                  'imagegif',
+                  'imagegrabscreen',
+                  'imagegrabwindow',
+                  'imageinterlace',
+                  'imageistruecolor',
+                  'imagejpeg',
+                  'imagelayereffect',
+                  'imageline',
+                  'imageloadfont',
+                  'imagepalettecopy',
+                  'imagepalettetotruecolor',
+                  'imagepng',
+                  'imagepolygon',
+                  'imagepsbbox',
+                  'imagepsencodefont',
+                  'imagepsextendfont',
+                  'imagepsfreefont',
+                  'imagepsloadfont',
+                  'imagepsslantfont',
+                  'imagepstext',
+                  'imagerectangle',
+                  'imagerotate',
+                  'imagesavealpha',
+                  'imagescale',
+                  'imagesetbrush',
+                  'imagesetinterpolation',
+                  'imagesetpixel',
+                  'imagesetstyle',
+                  'imagesetthickness',
+                  'imagesettile',
+                  'imagestring',
+                  'imagestringup',
+                  'imagesx',
+                  'imagesy',
+                  'imagetruecolortopalette',
+                  'imagettfbbox',
+                  'imagettftext',
+                  'imagetypes',
+                  'imagewbmp',
+                  'imagewebp',
+                  'imagexbm',
+                  'iptcembed',
+                  'iptcparse',
+                  'jpeg2wbmp',
+                  'png2wbmp'),
+ 'GMP': ('gmp_abs',
+         'gmp_add',
+         'gmp_and',
+         'gmp_clrbit',
+         'gmp_cmp',
+         'gmp_com',
+         'gmp_div_q',
+         'gmp_div_qr',
+         'gmp_div_r',
+         'gmp_div',
+         'gmp_divexact',
+         'gmp_fact',
+         'gmp_gcd',
+         'gmp_gcdext',
+         'gmp_hamdist',
+         'gmp_init',
+         'gmp_intval',
+         'gmp_invert',
+         'gmp_jacobi',
+         'gmp_legendre',
+         'gmp_mod',
+         'gmp_mul',
+         'gmp_neg',
+         'gmp_nextprime',
+         'gmp_or',
+         'gmp_perfect_square',
+         'gmp_popcount',
+         'gmp_pow',
+         'gmp_powm',
+         'gmp_prob_prime',
+         'gmp_random',
+         'gmp_scan0',
+         'gmp_scan1',
+         'gmp_setbit',
+         'gmp_sign',
+         'gmp_sqrt',
+         'gmp_sqrtrem',
+         'gmp_strval',
+         'gmp_sub',
+         'gmp_testbit',
+         'gmp_xor'),
+ 'GeoIP': ('geoip_asnum_by_name',
+           'geoip_continent_code_by_name',
+           'geoip_country_code_by_name',
+           'geoip_country_code3_by_name',
+           'geoip_country_name_by_name',
+           'geoip_database_info',
+           'geoip_db_avail',
+           'geoip_db_filename',
+           'geoip_db_get_all_info',
+           'geoip_domain_by_name',
+           'geoip_id_by_name',
+           'geoip_isp_by_name',
+           'geoip_netspeedcell_by_name',
+           'geoip_org_by_name',
+           'geoip_record_by_name',
+           'geoip_region_by_name',
+           'geoip_region_name_by_code',
+           'geoip_setup_custom_directory',
+           'geoip_time_zone_by_country_and_region'),
+ 'Gettext': ('bind_textdomain_codeset',
+             'bindtextdomain',
+             'dcgettext',
+             'dcngettext',
+             'dgettext',
+             'dngettext',
+             'gettext',
+             'ngettext',
+             'textdomain'),
+ 'GnuPG': ('gnupg_adddecryptkey',
+           'gnupg_addencryptkey',
+           'gnupg_addsignkey',
+           'gnupg_cleardecryptkeys',
+           'gnupg_clearencryptkeys',
+           'gnupg_clearsignkeys',
+           'gnupg_decrypt',
+           'gnupg_decryptverify',
+           'gnupg_encrypt',
+           'gnupg_encryptsign',
+           'gnupg_export',
+           'gnupg_geterror',
+           'gnupg_getprotocol',
+           'gnupg_import',
+           'gnupg_init',
+           'gnupg_keyinfo',
+           'gnupg_setarmor',
+           'gnupg_seterrormode',
+           'gnupg_setsignmode',
+           'gnupg_sign',
+           'gnupg_verify'),
+ 'Gopher': ('gopher_parsedir',),
+ 'Grapheme': ('grapheme_extract',
+              'grapheme_stripos',
+              'grapheme_stristr',
+              'grapheme_strlen',
+              'grapheme_strpos',
+              'grapheme_strripos',
+              'grapheme_strrpos',
+              'grapheme_strstr',
+              'grapheme_substr'),
+ 'Gupnp': ('gupnp_context_get_host_ip',
+           'gupnp_context_get_port',
+           'gupnp_context_get_subscription_timeout',
+           'gupnp_context_host_path',
+           'gupnp_context_new',
+           'gupnp_context_set_subscription_timeout',
+           'gupnp_context_timeout_add',
+           'gupnp_context_unhost_path',
+           'gupnp_control_point_browse_start',
+           'gupnp_control_point_browse_stop',
+           'gupnp_control_point_callback_set',
+           'gupnp_control_point_new',
+           'gupnp_device_action_callback_set',
+           'gupnp_device_info_get_service',
+           'gupnp_device_info_get',
+           'gupnp_root_device_get_available',
+           'gupnp_root_device_get_relative_location',
+           'gupnp_root_device_new',
+           'gupnp_root_device_set_available',
+           'gupnp_root_device_start',
+           'gupnp_root_device_stop',
+           'gupnp_service_action_get',
+           'gupnp_service_action_return_error',
+           'gupnp_service_action_return',
+           'gupnp_service_action_set',
+           'gupnp_service_freeze_notify',
+           'gupnp_service_info_get_introspection',
+           'gupnp_service_info_get',
+           'gupnp_service_introspection_get_state_variable',
+           'gupnp_service_notify',
+           'gupnp_service_proxy_action_get',
+           'gupnp_service_proxy_action_set',
+           'gupnp_service_proxy_add_notify',
+           'gupnp_service_proxy_callback_set',
+           'gupnp_service_proxy_get_subscribed',
+           'gupnp_service_proxy_remove_notify',
+           'gupnp_service_proxy_set_subscribed',
+           'gupnp_service_thaw_notify'),
+ 'HTTP': ('http_cache_etag',
+          'http_cache_last_modified',
+          'http_chunked_decode',
+          'http_deflate',
+          'http_inflate',
+          'http_build_cookie',
+          'http_date',
+          'http_get_request_body_stream',
+          'http_get_request_body',
+          'http_get_request_headers',
+          'http_match_etag',
+          'http_match_modified',
+          'http_match_request_header',
+          'http_support',
+          'http_negotiate_charset',
+          'http_negotiate_content_type',
+          'http_negotiate_language',
+          'ob_deflatehandler',
+          'ob_etaghandler',
+          'ob_inflatehandler',
+          'http_parse_cookie',
+          'http_parse_headers',
+          'http_parse_message',
+          'http_parse_params',
+          'http_persistent_handles_clean',
+          'http_persistent_handles_count',
+          'http_persistent_handles_ident',
+          'http_get',
+          'http_head',
+          'http_post_data',
+          'http_post_fields',
+          'http_put_data',
+          'http_put_file',
+          'http_put_stream',
+          'http_request_body_encode',
+          'http_request_method_exists',
+          'http_request_method_name',
+          'http_request_method_register',
+          'http_request_method_unregister',
+          'http_request',
+          'http_redirect',
+          'http_send_content_disposition',
+          'http_send_content_type',
+          'http_send_data',
+          'http_send_file',
+          'http_send_last_modified',
+          'http_send_status',
+          'http_send_stream',
+          'http_throttle',
+          'http_build_str',
+          'http_build_url'),
+ 'Hash': ('hash_algos',
+          'hash_copy',
+          'hash_file',
+          'hash_final',
+          'hash_hmac_file',
+          'hash_hmac',
+          'hash_init',
+          'hash_pbkdf2',
+          'hash_update_file',
+          'hash_update_stream',
+          'hash_update',
+          'hash'),
+ 'Hyperwave': ('hw_Array2Objrec',
+               'hw_changeobject',
+               'hw_Children',
+               'hw_ChildrenObj',
+               'hw_Close',
+               'hw_Connect',
+               'hw_connection_info',
+               'hw_cp',
+               'hw_Deleteobject',
+               'hw_DocByAnchor',
+               'hw_DocByAnchorObj',
+               'hw_Document_Attributes',
+               'hw_Document_BodyTag',
+               'hw_Document_Content',
+               'hw_Document_SetContent',
+               'hw_Document_Size',
+               'hw_dummy',
+               'hw_EditText',
+               'hw_Error',
+               'hw_ErrorMsg',
+               'hw_Free_Document',
+               'hw_GetAnchors',
+               'hw_GetAnchorsObj',
+               'hw_GetAndLock',
+               'hw_GetChildColl',
+               'hw_GetChildCollObj',
+               'hw_GetChildDocColl',
+               'hw_GetChildDocCollObj',
+               'hw_GetObject',
+               'hw_GetObjectByQuery',
+               'hw_GetObjectByQueryColl',
+               'hw_GetObjectByQueryCollObj',
+               'hw_GetObjectByQueryObj',
+               'hw_GetParents',
+               'hw_GetParentsObj',
+               'hw_getrellink',
+               'hw_GetRemote',
+               'hw_getremotechildren',
+               'hw_GetSrcByDestObj',
+               'hw_GetText',
+               'hw_getusername',
+               'hw_Identify',
+               'hw_InCollections',
+               'hw_Info',
+               'hw_InsColl',
+               'hw_InsDoc',
+               'hw_insertanchors',
+               'hw_InsertDocument',
+               'hw_InsertObject',
+               'hw_mapid',
+               'hw_Modifyobject',
+               'hw_mv',
+               'hw_New_Document',
+               'hw_objrec2array',
+               'hw_Output_Document',
+               'hw_pConnect',
+               'hw_PipeDocument',
+               'hw_Root',
+               'hw_setlinkroot',
+               'hw_stat',
+               'hw_Unlock',
+               'hw_Who'),
+ 'Hyperwave API': ('hwapi_attribute_new',
+                   'hwapi_content_new',
+                   'hwapi_hgcsp',
+                   'hwapi_object_new'),
+ 'IBM DB2': ('db2_autocommit',
+             'db2_bind_param',
+             'db2_client_info',
+             'db2_close',
+             'db2_column_privileges',
+             'db2_columns',
+             'db2_commit',
+             'db2_conn_error',
+             'db2_conn_errormsg',
+             'db2_connect',
+             'db2_cursor_type',
+             'db2_escape_string',
+             'db2_exec',
+             'db2_execute',
+             'db2_fetch_array',
+             'db2_fetch_assoc',
+             'db2_fetch_both',
+             'db2_fetch_object',
+             'db2_fetch_row',
+             'db2_field_display_size',
+             'db2_field_name',
+             'db2_field_num',
+             'db2_field_precision',
+             'db2_field_scale',
+             'db2_field_type',
+             'db2_field_width',
+             'db2_foreign_keys',
+             'db2_free_result',
+             'db2_free_stmt',
+             'db2_get_option',
+             'db2_last_insert_id',
+             'db2_lob_read',
+             'db2_next_result',
+             'db2_num_fields',
+             'db2_num_rows',
+             'db2_pclose',
+             'db2_pconnect',
+             'db2_prepare',
+             'db2_primary_keys',
+             'db2_procedure_columns',
+             'db2_procedures',
+             'db2_result',
+             'db2_rollback',
+             'db2_server_info',
+             'db2_set_option',
+             'db2_special_columns',
+             'db2_statistics',
+             'db2_stmt_error',
+             'db2_stmt_errormsg',
+             'db2_table_privileges',
+             'db2_tables'),
+ 'ID3': ('id3_get_frame_long_name',
+         'id3_get_frame_short_name',
+         'id3_get_genre_id',
+         'id3_get_genre_list',
+         'id3_get_genre_name',
+         'id3_get_tag',
+         'id3_get_version',
+         'id3_remove_tag',
+         'id3_set_tag'),
+ 'IDN': ('grapheme_substr', 'idn_to_ascii', 'idn_to_unicode', 'idn_to_utf8'),
+ 'IIS': ('iis_add_server',
+         'iis_get_dir_security',
+         'iis_get_script_map',
+         'iis_get_server_by_comment',
+         'iis_get_server_by_path',
+         'iis_get_server_rights',
+         'iis_get_service_state',
+         'iis_remove_server',
+         'iis_set_app_settings',
+         'iis_set_dir_security',
+         'iis_set_script_map',
+         'iis_set_server_rights',
+         'iis_start_server',
+         'iis_start_service',
+         'iis_stop_server',
+         'iis_stop_service'),
+ 'IMAP': ('imap_8bit',
+          'imap_alerts',
+          'imap_append',
+          'imap_base64',
+          'imap_binary',
+          'imap_body',
+          'imap_bodystruct',
+          'imap_check',
+          'imap_clearflag_full',
+          'imap_close',
+          'imap_create',
+          'imap_createmailbox',
+          'imap_delete',
+          'imap_deletemailbox',
+          'imap_errors',
+          'imap_expunge',
+          'imap_fetch_overview',
+          'imap_fetchbody',
+          'imap_fetchheader',
+          'imap_fetchmime',
+          'imap_fetchstructure',
+          'imap_fetchtext',
+          'imap_gc',
+          'imap_get_quota',
+          'imap_get_quotaroot',
+          'imap_getacl',
+          'imap_getmailboxes',
+          'imap_getsubscribed',
+          'imap_header',
+          'imap_headerinfo',
+          'imap_headers',
+          'imap_last_error',
+          'imap_list',
+          'imap_listmailbox',
+          'imap_listscan',
+          'imap_listsubscribed',
+          'imap_lsub',
+          'imap_mail_compose',
+          'imap_mail_copy',
+          'imap_mail_move',
+          'imap_mail',
+          'imap_mailboxmsginfo',
+          'imap_mime_header_decode',
+          'imap_msgno',
+          'imap_num_msg',
+          'imap_num_recent',
+          'imap_open',
+          'imap_ping',
+          'imap_qprint',
+          'imap_rename',
+          'imap_renamemailbox',
+          'imap_reopen',
+          'imap_rfc822_parse_adrlist',
+          'imap_rfc822_parse_headers',
+          'imap_rfc822_write_address',
+          'imap_savebody',
+          'imap_scan',
+          'imap_scanmailbox',
+          'imap_search',
+          'imap_set_quota',
+          'imap_setacl',
+          'imap_setflag_full',
+          'imap_sort',
+          'imap_status',
+          'imap_subscribe',
+          'imap_thread',
+          'imap_timeout',
+          'imap_uid',
+          'imap_undelete',
+          'imap_unsubscribe',
+          'imap_utf7_decode',
+          'imap_utf7_encode',
+          'imap_utf8'),
+ 'Informix': ('ifx_affected_rows',
+              'ifx_blobinfile_mode',
+              'ifx_byteasvarchar',
+              'ifx_close',
+              'ifx_connect',
+              'ifx_copy_blob',
+              'ifx_create_blob',
+              'ifx_create_char',
+              'ifx_do',
+              'ifx_error',
+              'ifx_errormsg',
+              'ifx_fetch_row',
+              'ifx_fieldproperties',
+              'ifx_fieldtypes',
+              'ifx_free_blob',
+              'ifx_free_char',
+              'ifx_free_result',
+              'ifx_get_blob',
+              'ifx_get_char',
+              'ifx_getsqlca',
+              'ifx_htmltbl_result',
+              'ifx_nullformat',
+              'ifx_num_fields',
+              'ifx_num_rows',
+              'ifx_pconnect',
+              'ifx_prepare',
+              'ifx_query',
+              'ifx_textasvarchar',
+              'ifx_update_blob',
+              'ifx_update_char',
+              'ifxus_close_slob',
+              'ifxus_create_slob',
+              'ifxus_free_slob',
+              'ifxus_open_slob',
+              'ifxus_read_slob',
+              'ifxus_seek_slob',
+              'ifxus_tell_slob',
+              'ifxus_write_slob'),
+ 'Ingres': ('ingres_autocommit_state',
+            'ingres_autocommit',
+            'ingres_charset',
+            'ingres_close',
+            'ingres_commit',
+            'ingres_connect',
+            'ingres_cursor',
+            'ingres_errno',
+            'ingres_error',
+            'ingres_errsqlstate',
+            'ingres_escape_string',
+            'ingres_execute',
+            'ingres_fetch_array',
+            'ingres_fetch_assoc',
+            'ingres_fetch_object',
+            'ingres_fetch_proc_return',
+            'ingres_fetch_row',
+            'ingres_field_length',
+            'ingres_field_name',
+            'ingres_field_nullable',
+            'ingres_field_precision',
+            'ingres_field_scale',
+            'ingres_field_type',
+            'ingres_free_result',
+            'ingres_next_error',
+            'ingres_num_fields',
+            'ingres_num_rows',
+            'ingres_pconnect',
+            'ingres_prepare',
+            'ingres_query',
+            'ingres_result_seek',
+            'ingres_rollback',
+            'ingres_set_environment',
+            'ingres_unbuffered_query'),
+ 'Inotify': ('inotify_add_watch',
+             'inotify_init',
+             'inotify_queue_len',
+             'inotify_read',
+             'inotify_rm_watch'),
+ 'JSON': ('json_decode',
+          'json_encode',
+          'json_last_error_msg',
+          'json_last_error'),
+ 'Java': ('java_last_exception_clear', 'java_last_exception_get'),
+ 'Judy': ('judy_type', 'judy_version'),
+ 'KADM5': ('kadm5_chpass_principal',
+           'kadm5_create_principal',
+           'kadm5_delete_principal',
+           'kadm5_destroy',
+           'kadm5_flush',
+           'kadm5_get_policies',
+           'kadm5_get_principal',
+           'kadm5_get_principals',
+           'kadm5_init_with_password',
+           'kadm5_modify_principal'),
+ 'LDAP': ('ldap_8859_to_t61',
+          'ldap_add',
+          'ldap_bind',
+          'ldap_close',
+          'ldap_compare',
+          'ldap_connect',
+          'ldap_control_paged_result_response',
+          'ldap_control_paged_result',
+          'ldap_count_entries',
+          'ldap_delete',
+          'ldap_dn2ufn',
+          'ldap_err2str',
+          'ldap_errno',
+          'ldap_error',
+          'ldap_explode_dn',
+          'ldap_first_attribute',
+          'ldap_first_entry',
+          'ldap_first_reference',
+          'ldap_free_result',
+          'ldap_get_attributes',
+          'ldap_get_dn',
+          'ldap_get_entries',
+          'ldap_get_option',
+          'ldap_get_values_len',
+          'ldap_get_values',
+          'ldap_list',
+          'ldap_mod_add',
+          'ldap_mod_del',
+          'ldap_mod_replace',
+          'ldap_modify',
+          'ldap_next_attribute',
+          'ldap_next_entry',
+          'ldap_next_reference',
+          'ldap_parse_reference',
+          'ldap_parse_result',
+          'ldap_read',
+          'ldap_rename',
+          'ldap_sasl_bind',
+          'ldap_search',
+          'ldap_set_option',
+          'ldap_set_rebind_proc',
+          'ldap_sort',
+          'ldap_start_tls',
+          'ldap_t61_to_8859',
+          'ldap_unbind'),
+ 'LZF': ('lzf_compress', 'lzf_decompress', 'lzf_optimized_for'),
+ 'Libevent': ('event_add',
+              'event_base_free',
+              'event_base_loop',
+              'event_base_loopbreak',
+              'event_base_loopexit',
+              'event_base_new',
+              'event_base_priority_init',
+              'event_base_set',
+              'event_buffer_base_set',
+              'event_buffer_disable',
+              'event_buffer_enable',
+              'event_buffer_fd_set',
+              'event_buffer_free',
+              'event_buffer_new',
+              'event_buffer_priority_set',
+              'event_buffer_read',
+              'event_buffer_set_callback',
+              'event_buffer_timeout_set',
+              'event_buffer_watermark_set',
+              'event_buffer_write',
+              'event_del',
+              'event_free',
+              'event_new',
+              'event_set'),
+ 'Lotus Notes': ('notes_body',
+                 'notes_copy_db',
+                 'notes_create_db',
+                 'notes_create_note',
+                 'notes_drop_db',
+                 'notes_find_note',
+                 'notes_header_info',
+                 'notes_list_msgs',
+                 'notes_mark_read',
+                 'notes_mark_unread',
+                 'notes_nav_create',
+                 'notes_search',
+                 'notes_unread',
+                 'notes_version'),
+ 'MCVE': ('m_checkstatus',
+          'm_completeauthorizations',
+          'm_connect',
+          'm_connectionerror',
+          'm_deletetrans',
+          'm_destroyconn',
+          'm_destroyengine',
+          'm_getcell',
+          'm_getcellbynum',
+          'm_getcommadelimited',
+          'm_getheader',
+          'm_initconn',
+          'm_initengine',
+          'm_iscommadelimited',
+          'm_maxconntimeout',
+          'm_monitor',
+          'm_numcolumns',
+          'm_numrows',
+          'm_parsecommadelimited',
+          'm_responsekeys',
+          'm_responseparam',
+          'm_returnstatus',
+          'm_setblocking',
+          'm_setdropfile',
+          'm_setip',
+          'm_setssl_cafile',
+          'm_setssl_files',
+          'm_setssl',
+          'm_settimeout',
+          'm_sslcert_gen_hash',
+          'm_transactionssent',
+          'm_transinqueue',
+          'm_transkeyval',
+          'm_transnew',
+          'm_transsend',
+          'm_uwait',
+          'm_validateidentifier',
+          'm_verifyconnection',
+          'm_verifysslcert'),
+ 'Mail': ('ezmlm_hash', 'mail'),
+ 'Mailparse': ('mailparse_determine_best_xfer_encoding',
+               'mailparse_msg_create',
+               'mailparse_msg_extract_part_file',
+               'mailparse_msg_extract_part',
+               'mailparse_msg_extract_whole_part_file',
+               'mailparse_msg_free',
+               'mailparse_msg_get_part_data',
+               'mailparse_msg_get_part',
+               'mailparse_msg_get_structure',
+               'mailparse_msg_parse_file',
+               'mailparse_msg_parse',
+               'mailparse_rfc822_parse_addresses',
+               'mailparse_stream_encode',
+               'mailparse_uudecode_all'),
+ 'Math': ('abs',
+          'acos',
+          'acosh',
+          'asin',
+          'asinh',
+          'atan2',
+          'atan',
+          'atanh',
+          'base_convert',
+          'bindec',
+          'ceil',
+          'cos',
+          'cosh',
+          'decbin',
+          'dechex',
+          'decoct',
+          'deg2rad',
+          'exp',
+          'expm1',
+          'floor',
+          'fmod',
+          'getrandmax',
+          'hexdec',
+          'hypot',
+          'is_finite',
+          'is_infinite',
+          'is_nan',
+          'lcg_value',
+          'log10',
+          'log1p',
+          'log',
+          'max',
+          'min',
+          'mt_getrandmax',
+          'mt_rand',
+          'mt_srand',
+          'octdec',
+          'pi',
+          'pow',
+          'rad2deg',
+          'rand',
+          'round',
+          'sin',
+          'sinh',
+          'sqrt',
+          'srand',
+          'tan',
+          'tanh'),
+ 'MaxDB': ('maxdb_affected_rows',
+           'maxdb_autocommit',
+           'maxdb_bind_param',
+           'maxdb_bind_result',
+           'maxdb_change_user',
+           'maxdb_character_set_name',
+           'maxdb_client_encoding',
+           'maxdb_close_long_data',
+           'maxdb_close',
+           'maxdb_commit',
+           'maxdb_connect_errno',
+           'maxdb_connect_error',
+           'maxdb_connect',
+           'maxdb_data_seek',
+           'maxdb_debug',
+           'maxdb_disable_reads_from_master',
+           'maxdb_disable_rpl_parse',
+           'maxdb_dump_debug_info',
+           'maxdb_embedded_connect',
+           'maxdb_enable_reads_from_master',
+           'maxdb_enable_rpl_parse',
+           'maxdb_errno',
+           'maxdb_error',
+           'maxdb_escape_string',
+           'maxdb_execute',
+           'maxdb_fetch_array',
+           'maxdb_fetch_assoc',
+           'maxdb_fetch_field_direct',
+           'maxdb_fetch_field',
+           'maxdb_fetch_fields',
+           'maxdb_fetch_lengths',
+           'maxdb_fetch_object',
+           'maxdb_fetch_row',
+           'maxdb_fetch',
+           'maxdb_field_count',
+           'maxdb_field_seek',
+           'maxdb_field_tell',
+           'maxdb_free_result',
+           'maxdb_get_client_info',
+           'maxdb_get_client_version',
+           'maxdb_get_host_info',
+           'maxdb_get_metadata',
+           'maxdb_get_proto_info',
+           'maxdb_get_server_info',
+           'maxdb_get_server_version',
+           'maxdb_info',
+           'maxdb_init',
+           'maxdb_insert_id',
+           'maxdb_kill',
+           'maxdb_master_query',
+           'maxdb_more_results',
+           'maxdb_multi_query',
+           'maxdb_next_result',
+           'maxdb_num_fields',
+           'maxdb_num_rows',
+           'maxdb_options',
+           'maxdb_param_count',
+           'maxdb_ping',
+           'maxdb_prepare',
+           'maxdb_query',
+           'maxdb_real_connect',
+           'maxdb_real_escape_string',
+           'maxdb_real_query',
+           'maxdb_report',
+           'maxdb_rollback',
+           'maxdb_rpl_parse_enabled',
+           'maxdb_rpl_probe',
+           'maxdb_rpl_query_type',
+           'maxdb_select_db',
+           'maxdb_send_long_data',
+           'maxdb_send_query',
+           'maxdb_server_end',
+           'maxdb_server_init',
+           'maxdb_set_opt',
+           'maxdb_sqlstate',
+           'maxdb_ssl_set',
+           'maxdb_stat',
+           'maxdb_stmt_affected_rows',
+           'maxdb_stmt_bind_param',
+           'maxdb_stmt_bind_result',
+           'maxdb_stmt_close_long_data',
+           'maxdb_stmt_close',
+           'maxdb_stmt_data_seek',
+           'maxdb_stmt_errno',
+           'maxdb_stmt_error',
+           'maxdb_stmt_execute',
+           'maxdb_stmt_fetch',
+           'maxdb_stmt_free_result',
+           'maxdb_stmt_init',
+           'maxdb_stmt_num_rows',
+           'maxdb_stmt_param_count',
+           'maxdb_stmt_prepare',
+           'maxdb_stmt_reset',
+           'maxdb_stmt_result_metadata',
+           'maxdb_stmt_send_long_data',
+           'maxdb_stmt_sqlstate',
+           'maxdb_stmt_store_result',
+           'maxdb_store_result',
+           'maxdb_thread_id',
+           'maxdb_thread_safe',
+           'maxdb_use_result',
+           'maxdb_warning_count'),
+ 'Mcrypt': ('mcrypt_cbc',
+            'mcrypt_cfb',
+            'mcrypt_create_iv',
+            'mcrypt_decrypt',
+            'mcrypt_ecb',
+            'mcrypt_enc_get_algorithms_name',
+            'mcrypt_enc_get_block_size',
+            'mcrypt_enc_get_iv_size',
+            'mcrypt_enc_get_key_size',
+            'mcrypt_enc_get_modes_name',
+            'mcrypt_enc_get_supported_key_sizes',
+            'mcrypt_enc_is_block_algorithm_mode',
+            'mcrypt_enc_is_block_algorithm',
+            'mcrypt_enc_is_block_mode',
+            'mcrypt_enc_self_test',
+            'mcrypt_encrypt',
+            'mcrypt_generic_deinit',
+            'mcrypt_generic_end',
+            'mcrypt_generic_init',
+            'mcrypt_generic',
+            'mcrypt_get_block_size',
+            'mcrypt_get_cipher_name',
+            'mcrypt_get_iv_size',
+            'mcrypt_get_key_size',
+            'mcrypt_list_algorithms',
+            'mcrypt_list_modes',
+            'mcrypt_module_close',
+            'mcrypt_module_get_algo_block_size',
+            'mcrypt_module_get_algo_key_size',
+            'mcrypt_module_get_supported_key_sizes',
+            'mcrypt_module_is_block_algorithm_mode',
+            'mcrypt_module_is_block_algorithm',
+            'mcrypt_module_is_block_mode',
+            'mcrypt_module_open',
+            'mcrypt_module_self_test',
+            'mcrypt_ofb',
+            'mdecrypt_generic'),
+ 'Memcache': ('memcache_debug',),
+ 'Mhash': ('mhash_count',
+           'mhash_get_block_size',
+           'mhash_get_hash_name',
+           'mhash_keygen_s2k',
+           'mhash'),
+ 'Ming': ('ming_keypress',
+          'ming_setcubicthreshold',
+          'ming_setscale',
+          'ming_setswfcompression',
+          'ming_useconstants',
+          'ming_useswfversion'),
+ 'Misc.': ('connection_aborted',
+           'connection_status',
+           'connection_timeout',
+           'constant',
+           'define',
+           'defined',
+           'die',
+           'eval',
+           'exit',
+           'get_browser',
+           '__halt_compiler',
+           'highlight_file',
+           'highlight_string',
+           'ignore_user_abort',
+           'pack',
+           'php_check_syntax',
+           'php_strip_whitespace',
+           'show_source',
+           'sleep',
+           'sys_getloadavg',
+           'time_nanosleep',
+           'time_sleep_until',
+           'uniqid',
+           'unpack',
+           'usleep'),
+ 'Mongo': ('bson_decode', 'bson_encode'),
+ 'Msession': ('msession_connect',
+              'msession_count',
+              'msession_create',
+              'msession_destroy',
+              'msession_disconnect',
+              'msession_find',
+              'msession_get_array',
+              'msession_get_data',
+              'msession_get',
+              'msession_inc',
+              'msession_list',
+              'msession_listvar',
+              'msession_lock',
+              'msession_plugin',
+              'msession_randstr',
+              'msession_set_array',
+              'msession_set_data',
+              'msession_set',
+              'msession_timeout',
+              'msession_uniq',
+              'msession_unlock'),
+ 'Mssql': ('mssql_bind',
+           'mssql_close',
+           'mssql_connect',
+           'mssql_data_seek',
+           'mssql_execute',
+           'mssql_fetch_array',
+           'mssql_fetch_assoc',
+           'mssql_fetch_batch',
+           'mssql_fetch_field',
+           'mssql_fetch_object',
+           'mssql_fetch_row',
+           'mssql_field_length',
+           'mssql_field_name',
+           'mssql_field_seek',
+           'mssql_field_type',
+           'mssql_free_result',
+           'mssql_free_statement',
+           'mssql_get_last_message',
+           'mssql_guid_string',
+           'mssql_init',
+           'mssql_min_error_severity',
+           'mssql_min_message_severity',
+           'mssql_next_result',
+           'mssql_num_fields',
+           'mssql_num_rows',
+           'mssql_pconnect',
+           'mssql_query',
+           'mssql_result',
+           'mssql_rows_affected',
+           'mssql_select_db'),
+ 'Multibyte String': ('mb_check_encoding',
+                      'mb_convert_case',
+                      'mb_convert_encoding',
+                      'mb_convert_kana',
+                      'mb_convert_variables',
+                      'mb_decode_mimeheader',
+                      'mb_decode_numericentity',
+                      'mb_detect_encoding',
+                      'mb_detect_order',
+                      'mb_encode_mimeheader',
+                      'mb_encode_numericentity',
+                      'mb_encoding_aliases',
+                      'mb_ereg_match',
+                      'mb_ereg_replace_callback',
+                      'mb_ereg_replace',
+                      'mb_ereg_search_getpos',
+                      'mb_ereg_search_getregs',
+                      'mb_ereg_search_init',
+                      'mb_ereg_search_pos',
+                      'mb_ereg_search_regs',
+                      'mb_ereg_search_setpos',
+                      'mb_ereg_search',
+                      'mb_ereg',
+                      'mb_eregi_replace',
+                      'mb_eregi',
+                      'mb_get_info',
+                      'mb_http_input',
+                      'mb_http_output',
+                      'mb_internal_encoding',
+                      'mb_language',
+                      'mb_list_encodings',
+                      'mb_output_handler',
+                      'mb_parse_str',
+                      'mb_preferred_mime_name',
+                      'mb_regex_encoding',
+                      'mb_regex_set_options',
+                      'mb_send_mail',
+                      'mb_split',
+                      'mb_strcut',
+                      'mb_strimwidth',
+                      'mb_stripos',
+                      'mb_stristr',
+                      'mb_strlen',
+                      'mb_strpos',
+                      'mb_strrchr',
+                      'mb_strrichr',
+                      'mb_strripos',
+                      'mb_strrpos',
+                      'mb_strstr',
+                      'mb_strtolower',
+                      'mb_strtoupper',
+                      'mb_strwidth',
+                      'mb_substitute_character',
+                      'mb_substr_count',
+                      'mb_substr'),
+ 'MySQL': ('mysql_affected_rows',
+           'mysql_client_encoding',
+           'mysql_close',
+           'mysql_connect',
+           'mysql_create_db',
+           'mysql_data_seek',
+           'mysql_db_name',
+           'mysql_db_query',
+           'mysql_drop_db',
+           'mysql_errno',
+           'mysql_error',
+           'mysql_escape_string',
+           'mysql_fetch_array',
+           'mysql_fetch_assoc',
+           'mysql_fetch_field',
+           'mysql_fetch_lengths',
+           'mysql_fetch_object',
+           'mysql_fetch_row',
+           'mysql_field_flags',
+           'mysql_field_len',
+           'mysql_field_name',
+           'mysql_field_seek',
+           'mysql_field_table',
+           'mysql_field_type',
+           'mysql_free_result',
+           'mysql_get_client_info',
+           'mysql_get_host_info',
+           'mysql_get_proto_info',
+           'mysql_get_server_info',
+           'mysql_info',
+           'mysql_insert_id',
+           'mysql_list_dbs',
+           'mysql_list_fields',
+           'mysql_list_processes',
+           'mysql_list_tables',
+           'mysql_num_fields',
+           'mysql_num_rows',
+           'mysql_pconnect',
+           'mysql_ping',
+           'mysql_query',
+           'mysql_real_escape_string',
+           'mysql_result',
+           'mysql_select_db',
+           'mysql_set_charset',
+           'mysql_stat',
+           'mysql_tablename',
+           'mysql_thread_id',
+           'mysql_unbuffered_query'),
+ 'Mysqlnd_memcache': ('mysqlnd_memcache_get_config', 'mysqlnd_memcache_set'),
+ 'Mysqlnd_ms': ('mysqlnd_ms_dump_servers',
+                'mysqlnd_ms_fabric_select_global',
+                'mysqlnd_ms_fabric_select_shard',
+                'mysqlnd_ms_get_last_gtid',
+                'mysqlnd_ms_get_last_used_connection',
+                'mysqlnd_ms_get_stats',
+                'mysqlnd_ms_match_wild',
+                'mysqlnd_ms_query_is_select',
+                'mysqlnd_ms_set_qos',
+                'mysqlnd_ms_set_user_pick_server'),
+ 'Mysqlnd_uh': ('mysqlnd_uh_convert_to_mysqlnd',
+                'mysqlnd_uh_set_connection_proxy',
+                'mysqlnd_uh_set_statement_proxy'),
+ 'NSAPI': ('nsapi_request_headers', 'nsapi_response_headers', 'nsapi_virtual'),
+ 'Ncurses': ('ncurses_addch',
+             'ncurses_addchnstr',
+             'ncurses_addchstr',
+             'ncurses_addnstr',
+             'ncurses_addstr',
+             'ncurses_assume_default_colors',
+             'ncurses_attroff',
+             'ncurses_attron',
+             'ncurses_attrset',
+             'ncurses_baudrate',
+             'ncurses_beep',
+             'ncurses_bkgd',
+             'ncurses_bkgdset',
+             'ncurses_border',
+             'ncurses_bottom_panel',
+             'ncurses_can_change_color',
+             'ncurses_cbreak',
+             'ncurses_clear',
+             'ncurses_clrtobot',
+             'ncurses_clrtoeol',
+             'ncurses_color_content',
+             'ncurses_color_set',
+             'ncurses_curs_set',
+             'ncurses_def_prog_mode',
+             'ncurses_def_shell_mode',
+             'ncurses_define_key',
+             'ncurses_del_panel',
+             'ncurses_delay_output',
+             'ncurses_delch',
+             'ncurses_deleteln',
+             'ncurses_delwin',
+             'ncurses_doupdate',
+             'ncurses_echo',
+             'ncurses_echochar',
+             'ncurses_end',
+             'ncurses_erase',
+             'ncurses_erasechar',
+             'ncurses_filter',
+             'ncurses_flash',
+             'ncurses_flushinp',
+             'ncurses_getch',
+             'ncurses_getmaxyx',
+             'ncurses_getmouse',
+             'ncurses_getyx',
+             'ncurses_halfdelay',
+             'ncurses_has_colors',
+             'ncurses_has_ic',
+             'ncurses_has_il',
+             'ncurses_has_key',
+             'ncurses_hide_panel',
+             'ncurses_hline',
+             'ncurses_inch',
+             'ncurses_init_color',
+             'ncurses_init_pair',
+             'ncurses_init',
+             'ncurses_insch',
+             'ncurses_insdelln',
+             'ncurses_insertln',
+             'ncurses_insstr',
+             'ncurses_instr',
+             'ncurses_isendwin',
+             'ncurses_keyok',
+             'ncurses_keypad',
+             'ncurses_killchar',
+             'ncurses_longname',
+             'ncurses_meta',
+             'ncurses_mouse_trafo',
+             'ncurses_mouseinterval',
+             'ncurses_mousemask',
+             'ncurses_move_panel',
+             'ncurses_move',
+             'ncurses_mvaddch',
+             'ncurses_mvaddchnstr',
+             'ncurses_mvaddchstr',
+             'ncurses_mvaddnstr',
+             'ncurses_mvaddstr',
+             'ncurses_mvcur',
+             'ncurses_mvdelch',
+             'ncurses_mvgetch',
+             'ncurses_mvhline',
+             'ncurses_mvinch',
+             'ncurses_mvvline',
+             'ncurses_mvwaddstr',
+             'ncurses_napms',
+             'ncurses_new_panel',
+             'ncurses_newpad',
+             'ncurses_newwin',
+             'ncurses_nl',
+             'ncurses_nocbreak',
+             'ncurses_noecho',
+             'ncurses_nonl',
+             'ncurses_noqiflush',
+             'ncurses_noraw',
+             'ncurses_pair_content',
+             'ncurses_panel_above',
+             'ncurses_panel_below',
+             'ncurses_panel_window',
+             'ncurses_pnoutrefresh',
+             'ncurses_prefresh',
+             'ncurses_putp',
+             'ncurses_qiflush',
+             'ncurses_raw',
+             'ncurses_refresh',
+             'ncurses_replace_panel',
+             'ncurses_reset_prog_mode',
+             'ncurses_reset_shell_mode',
+             'ncurses_resetty',
+             'ncurses_savetty',
+             'ncurses_scr_dump',
+             'ncurses_scr_init',
+             'ncurses_scr_restore',
+             'ncurses_scr_set',
+             'ncurses_scrl',
+             'ncurses_show_panel',
+             'ncurses_slk_attr',
+             'ncurses_slk_attroff',
+             'ncurses_slk_attron',
+             'ncurses_slk_attrset',
+             'ncurses_slk_clear',
+             'ncurses_slk_color',
+             'ncurses_slk_init',
+             'ncurses_slk_noutrefresh',
+             'ncurses_slk_refresh',
+             'ncurses_slk_restore',
+             'ncurses_slk_set',
+             'ncurses_slk_touch',
+             'ncurses_standend',
+             'ncurses_standout',
+             'ncurses_start_color',
+             'ncurses_termattrs',
+             'ncurses_termname',
+             'ncurses_timeout',
+             'ncurses_top_panel',
+             'ncurses_typeahead',
+             'ncurses_ungetch',
+             'ncurses_ungetmouse',
+             'ncurses_update_panels',
+             'ncurses_use_default_colors',
+             'ncurses_use_env',
+             'ncurses_use_extended_names',
+             'ncurses_vidattr',
+             'ncurses_vline',
+             'ncurses_waddch',
+             'ncurses_waddstr',
+             'ncurses_wattroff',
+             'ncurses_wattron',
+             'ncurses_wattrset',
+             'ncurses_wborder',
+             'ncurses_wclear',
+             'ncurses_wcolor_set',
+             'ncurses_werase',
+             'ncurses_wgetch',
+             'ncurses_whline',
+             'ncurses_wmouse_trafo',
+             'ncurses_wmove',
+             'ncurses_wnoutrefresh',
+             'ncurses_wrefresh',
+             'ncurses_wstandend',
+             'ncurses_wstandout',
+             'ncurses_wvline'),
+ 'Network': ('checkdnsrr',
+             'closelog',
+             'define_syslog_variables',
+             'dns_check_record',
+             'dns_get_mx',
+             'dns_get_record',
+             'fsockopen',
+             'gethostbyaddr',
+             'gethostbyname',
+             'gethostbynamel',
+             'gethostname',
+             'getmxrr',
+             'getprotobyname',
+             'getprotobynumber',
+             'getservbyname',
+             'getservbyport',
+             'header_register_callback',
+             'header_remove',
+             'header',
+             'headers_list',
+             'headers_sent',
+             'http_response_code',
+             'inet_ntop',
+             'inet_pton',
+             'ip2long',
+             'long2ip',
+             'openlog',
+             'pfsockopen',
+             'setcookie',
+             'setrawcookie',
+             'socket_get_status',
+             'socket_set_blocking',
+             'socket_set_timeout',
+             'syslog'),
+ 'Newt': ('newt_bell',
+          'newt_button_bar',
+          'newt_button',
+          'newt_centered_window',
+          'newt_checkbox_get_value',
+          'newt_checkbox_set_flags',
+          'newt_checkbox_set_value',
+          'newt_checkbox_tree_add_item',
+          'newt_checkbox_tree_find_item',
+          'newt_checkbox_tree_get_current',
+          'newt_checkbox_tree_get_entry_value',
+          'newt_checkbox_tree_get_multi_selection',
+          'newt_checkbox_tree_get_selection',
+          'newt_checkbox_tree_multi',
+          'newt_checkbox_tree_set_current',
+          'newt_checkbox_tree_set_entry_value',
+          'newt_checkbox_tree_set_entry',
+          'newt_checkbox_tree_set_width',
+          'newt_checkbox_tree',
+          'newt_checkbox',
+          'newt_clear_key_buffer',
+          'newt_cls',
+          'newt_compact_button',
+          'newt_component_add_callback',
+          'newt_component_takes_focus',
+          'newt_create_grid',
+          'newt_cursor_off',
+          'newt_cursor_on',
+          'newt_delay',
+          'newt_draw_form',
+          'newt_draw_root_text',
+          'newt_entry_get_value',
+          'newt_entry_set_filter',
+          'newt_entry_set_flags',
+          'newt_entry_set',
+          'newt_entry',
+          'newt_finished',
+          'newt_form_add_component',
+          'newt_form_add_components',
+          'newt_form_add_hot_key',
+          'newt_form_destroy',
+          'newt_form_get_current',
+          'newt_form_run',
+          'newt_form_set_background',
+          'newt_form_set_height',
+          'newt_form_set_size',
+          'newt_form_set_timer',
+          'newt_form_set_width',
+          'newt_form_watch_fd',
+          'newt_form',
+          'newt_get_screen_size',
+          'newt_grid_add_components_to_form',
+          'newt_grid_basic_window',
+          'newt_grid_free',
+          'newt_grid_get_size',
+          'newt_grid_h_close_stacked',
+          'newt_grid_h_stacked',
+          'newt_grid_place',
+          'newt_grid_set_field',
+          'newt_grid_simple_window',
+          'newt_grid_v_close_stacked',
+          'newt_grid_v_stacked',
+          'newt_grid_wrapped_window_at',
+          'newt_grid_wrapped_window',
+          'newt_init',
+          'newt_label_set_text',
+          'newt_label',
+          'newt_listbox_append_entry',
+          'newt_listbox_clear_selection',
+          'newt_listbox_clear',
+          'newt_listbox_delete_entry',
+          'newt_listbox_get_current',
+          'newt_listbox_get_selection',
+          'newt_listbox_insert_entry',
+          'newt_listbox_item_count',
+          'newt_listbox_select_item',
+          'newt_listbox_set_current_by_key',
+          'newt_listbox_set_current',
+          'newt_listbox_set_data',
+          'newt_listbox_set_entry',
+          'newt_listbox_set_width',
+          'newt_listbox',
+          'newt_listitem_get_data',
+          'newt_listitem_set',
+          'newt_listitem',
+          'newt_open_window',
+          'newt_pop_help_line',
+          'newt_pop_window',
+          'newt_push_help_line',
+          'newt_radio_get_current',
+          'newt_radiobutton',
+          'newt_redraw_help_line',
+          'newt_reflow_text',
+          'newt_refresh',
+          'newt_resize_screen',
+          'newt_resume',
+          'newt_run_form',
+          'newt_scale_set',
+          'newt_scale',
+          'newt_scrollbar_set',
+          'newt_set_help_callback',
+          'newt_set_suspend_callback',
+          'newt_suspend',
+          'newt_textbox_get_num_lines',
+          'newt_textbox_reflowed',
+          'newt_textbox_set_height',
+          'newt_textbox_set_text',
+          'newt_textbox',
+          'newt_vertical_scrollbar',
+          'newt_wait_for_key',
+          'newt_win_choice',
+          'newt_win_entries',
+          'newt_win_menu',
+          'newt_win_message',
+          'newt_win_messagev',
+          'newt_win_ternary'),
+ 'OAuth': ('oauth_get_sbs', 'oauth_urlencode'),
+ 'OCI8': ('oci_bind_array_by_name',
+          'oci_bind_by_name',
+          'oci_cancel',
+          'oci_client_version',
+          'oci_close',
+          'oci_commit',
+          'oci_connect',
+          'oci_define_by_name',
+          'oci_error',
+          'oci_execute',
+          'oci_fetch_all',
+          'oci_fetch_array',
+          'oci_fetch_assoc',
+          'oci_fetch_object',
+          'oci_fetch_row',
+          'oci_fetch',
+          'oci_field_is_null',
+          'oci_field_name',
+          'oci_field_precision',
+          'oci_field_scale',
+          'oci_field_size',
+          'oci_field_type_raw',
+          'oci_field_type',
+          'oci_free_descriptor',
+          'oci_free_statement',
+          'oci_get_implicit_resultset',
+          'oci_internal_debug',
+          'oci_lob_copy',
+          'oci_lob_is_equal',
+          'oci_new_collection',
+          'oci_new_connect',
+          'oci_new_cursor',
+          'oci_new_descriptor',
+          'oci_num_fields',
+          'oci_num_rows',
+          'oci_parse',
+          'oci_password_change',
+          'oci_pconnect',
+          'oci_result',
+          'oci_rollback',
+          'oci_server_version',
+          'oci_set_action',
+          'oci_set_client_identifier',
+          'oci_set_client_info',
+          'oci_set_edition',
+          'oci_set_module_name',
+          'oci_set_prefetch',
+          'oci_statement_type'),
+ 'ODBC': ('odbc_autocommit',
+          'odbc_binmode',
+          'odbc_close_all',
+          'odbc_close',
+          'odbc_columnprivileges',
+          'odbc_columns',
+          'odbc_commit',
+          'odbc_connect',
+          'odbc_cursor',
+          'odbc_data_source',
+          'odbc_do',
+          'odbc_error',
+          'odbc_errormsg',
+          'odbc_exec',
+          'odbc_execute',
+          'odbc_fetch_array',
+          'odbc_fetch_into',
+          'odbc_fetch_object',
+          'odbc_fetch_row',
+          'odbc_field_len',
+          'odbc_field_name',
+          'odbc_field_num',
+          'odbc_field_precision',
+          'odbc_field_scale',
+          'odbc_field_type',
+          'odbc_foreignkeys',
+          'odbc_free_result',
+          'odbc_gettypeinfo',
+          'odbc_longreadlen',
+          'odbc_next_result',
+          'odbc_num_fields',
+          'odbc_num_rows',
+          'odbc_pconnect',
+          'odbc_prepare',
+          'odbc_primarykeys',
+          'odbc_procedurecolumns',
+          'odbc_procedures',
+          'odbc_result_all',
+          'odbc_result',
+          'odbc_rollback',
+          'odbc_setoption',
+          'odbc_specialcolumns',
+          'odbc_statistics',
+          'odbc_tableprivileges',
+          'odbc_tables'),
+ 'OPcache': ('opcache_compile_file',
+             'opcache_get_configuration',
+             'opcache_get_status',
+             'opcache_invalidate',
+             'opcache_reset'),
+ 'Object Aggregation': ('aggregate_info',
+                        'aggregate_methods_by_list',
+                        'aggregate_methods_by_regexp',
+                        'aggregate_methods',
+                        'aggregate_properties_by_list',
+                        'aggregate_properties_by_regexp',
+                        'aggregate_properties',
+                        'aggregate',
+                        'aggregation_info',
+                        'deaggregate'),
+ 'OpenAL': ('openal_buffer_create',
+            'openal_buffer_data',
+            'openal_buffer_destroy',
+            'openal_buffer_get',
+            'openal_buffer_loadwav',
+            'openal_context_create',
+            'openal_context_current',
+            'openal_context_destroy',
+            'openal_context_process',
+            'openal_context_suspend',
+            'openal_device_close',
+            'openal_device_open',
+            'openal_listener_get',
+            'openal_listener_set',
+            'openal_source_create',
+            'openal_source_destroy',
+            'openal_source_get',
+            'openal_source_pause',
+            'openal_source_play',
+            'openal_source_rewind',
+            'openal_source_set',
+            'openal_source_stop',
+            'openal_stream'),
+ 'OpenSSL': ('openssl_cipher_iv_length',
+             'openssl_csr_export_to_file',
+             'openssl_csr_export',
+             'openssl_csr_get_public_key',
+             'openssl_csr_get_subject',
+             'openssl_csr_new',
+             'openssl_csr_sign',
+             'openssl_decrypt',
+             'openssl_dh_compute_key',
+             'openssl_digest',
+             'openssl_encrypt',
+             'openssl_error_string',
+             'openssl_free_key',
+             'openssl_get_cipher_methods',
+             'openssl_get_md_methods',
+             'openssl_get_privatekey',
+             'openssl_get_publickey',
+             'openssl_open',
+             'openssl_pbkdf2',
+             'openssl_pkcs12_export_to_file',
+             'openssl_pkcs12_export',
+             'openssl_pkcs12_read',
+             'openssl_pkcs7_decrypt',
+             'openssl_pkcs7_encrypt',
+             'openssl_pkcs7_sign',
+             'openssl_pkcs7_verify',
+             'openssl_pkey_export_to_file',
+             'openssl_pkey_export',
+             'openssl_pkey_free',
+             'openssl_pkey_get_details',
+             'openssl_pkey_get_private',
+             'openssl_pkey_get_public',
+             'openssl_pkey_new',
+             'openssl_private_decrypt',
+             'openssl_private_encrypt',
+             'openssl_public_decrypt',
+             'openssl_public_encrypt',
+             'openssl_random_pseudo_bytes',
+             'openssl_seal',
+             'openssl_sign',
+             'openssl_spki_export_challenge',
+             'openssl_spki_export',
+             'openssl_spki_new',
+             'openssl_spki_verify',
+             'openssl_verify',
+             'openssl_x509_check_private_key',
+             'openssl_x509_checkpurpose',
+             'openssl_x509_export_to_file',
+             'openssl_x509_export',
+             'openssl_x509_free',
+             'openssl_x509_parse',
+             'openssl_x509_read'),
+ 'Output Control': ('flush',
+                    'ob_clean',
+                    'ob_end_clean',
+                    'ob_end_flush',
+                    'ob_flush',
+                    'ob_get_clean',
+                    'ob_get_contents',
+                    'ob_get_flush',
+                    'ob_get_length',
+                    'ob_get_level',
+                    'ob_get_status',
+                    'ob_gzhandler',
+                    'ob_implicit_flush',
+                    'ob_list_handlers',
+                    'ob_start',
+                    'output_add_rewrite_var',
+                    'output_reset_rewrite_vars'),
+ 'Ovrimos SQL': ('ovrimos_close',
+                 'ovrimos_commit',
+                 'ovrimos_connect',
+                 'ovrimos_cursor',
+                 'ovrimos_exec',
+                 'ovrimos_execute',
+                 'ovrimos_fetch_into',
+                 'ovrimos_fetch_row',
+                 'ovrimos_field_len',
+                 'ovrimos_field_name',
+                 'ovrimos_field_num',
+                 'ovrimos_field_type',
+                 'ovrimos_free_result',
+                 'ovrimos_longreadlen',
+                 'ovrimos_num_fields',
+                 'ovrimos_num_rows',
+                 'ovrimos_prepare',
+                 'ovrimos_result_all',
+                 'ovrimos_result',
+                 'ovrimos_rollback'),
+ 'PCNTL': ('pcntl_alarm',
+           'pcntl_errno',
+           'pcntl_exec',
+           'pcntl_fork',
+           'pcntl_get_last_error',
+           'pcntl_getpriority',
+           'pcntl_setpriority',
+           'pcntl_signal_dispatch',
+           'pcntl_signal',
+           'pcntl_sigprocmask',
+           'pcntl_sigtimedwait',
+           'pcntl_sigwaitinfo',
+           'pcntl_strerror',
+           'pcntl_wait',
+           'pcntl_waitpid',
+           'pcntl_wexitstatus',
+           'pcntl_wifexited',
+           'pcntl_wifsignaled',
+           'pcntl_wifstopped',
+           'pcntl_wstopsig',
+           'pcntl_wtermsig'),
+ 'PCRE': ('preg_filter',
+          'preg_grep',
+          'preg_last_error',
+          'preg_match_all',
+          'preg_match',
+          'preg_quote',
+          'preg_replace_callback',
+          'preg_replace',
+          'preg_split'),
+ 'PDF': ('PDF_activate_item',
+         'PDF_add_annotation',
+         'PDF_add_bookmark',
+         'PDF_add_launchlink',
+         'PDF_add_locallink',
+         'PDF_add_nameddest',
+         'PDF_add_note',
+         'PDF_add_outline',
+         'PDF_add_pdflink',
+         'PDF_add_table_cell',
+         'PDF_add_textflow',
+         'PDF_add_thumbnail',
+         'PDF_add_weblink',
+         'PDF_arc',
+         'PDF_arcn',
+         'PDF_attach_file',
+         'PDF_begin_document',
+         'PDF_begin_font',
+         'PDF_begin_glyph',
+         'PDF_begin_item',
+         'PDF_begin_layer',
+         'PDF_begin_page_ext',
+         'PDF_begin_page',
+         'PDF_begin_pattern',
+         'PDF_begin_template_ext',
+         'PDF_begin_template',
+         'PDF_circle',
+         'PDF_clip',
+         'PDF_close_image',
+         'PDF_close_pdi_page',
+         'PDF_close_pdi',
+         'PDF_close',
+         'PDF_closepath_fill_stroke',
+         'PDF_closepath_stroke',
+         'PDF_closepath',
+         'PDF_concat',
+         'PDF_continue_text',
+         'PDF_create_3dview',
+         'PDF_create_action',
+         'PDF_create_annotation',
+         'PDF_create_bookmark',
+         'PDF_create_field',
+         'PDF_create_fieldgroup',
+         'PDF_create_gstate',
+         'PDF_create_pvf',
+         'PDF_create_textflow',
+         'PDF_curveto',
+         'PDF_define_layer',
+         'PDF_delete_pvf',
+         'PDF_delete_table',
+         'PDF_delete_textflow',
+         'PDF_delete',
+         'PDF_encoding_set_char',
+         'PDF_end_document',
+         'PDF_end_font',
+         'PDF_end_glyph',
+         'PDF_end_item',
+         'PDF_end_layer',
+         'PDF_end_page_ext',
+         'PDF_end_page',
+         'PDF_end_pattern',
+         'PDF_end_template',
+         'PDF_endpath',
+         'PDF_fill_imageblock',
+         'PDF_fill_pdfblock',
+         'PDF_fill_stroke',
+         'PDF_fill_textblock',
+         'PDF_fill',
+         'PDF_findfont',
+         'PDF_fit_image',
+         'PDF_fit_pdi_page',
+         'PDF_fit_table',
+         'PDF_fit_textflow',
+         'PDF_fit_textline',
+         'PDF_get_apiname',
+         'PDF_get_buffer',
+         'PDF_get_errmsg',
+         'PDF_get_errnum',
+         'PDF_get_font',
+         'PDF_get_fontname',
+         'PDF_get_fontsize',
+         'PDF_get_image_height',
+         'PDF_get_image_width',
+         'PDF_get_majorversion',
+         'PDF_get_minorversion',
+         'PDF_get_parameter',
+         'PDF_get_pdi_parameter',
+         'PDF_get_pdi_value',
+         'PDF_get_value',
+         'PDF_info_font',
+         'PDF_info_matchbox',
+         'PDF_info_table',
+         'PDF_info_textflow',
+         'PDF_info_textline',
+         'PDF_initgraphics',
+         'PDF_lineto',
+         'PDF_load_3ddata',
+         'PDF_load_font',
+         'PDF_load_iccprofile',
+         'PDF_load_image',
+         'PDF_makespotcolor',
+         'PDF_moveto',
+         'PDF_new',
+         'PDF_open_ccitt',
+         'PDF_open_file',
+         'PDF_open_gif',
+         'PDF_open_image_file',
+         'PDF_open_image',
+         'PDF_open_jpeg',
+         'PDF_open_memory_image',
+         'PDF_open_pdi_document',
+         'PDF_open_pdi_page',
+         'PDF_open_pdi',
+         'PDF_open_tiff',
+         'PDF_pcos_get_number',
+         'PDF_pcos_get_stream',
+         'PDF_pcos_get_string',
+         'PDF_place_image',
+         'PDF_place_pdi_page',
+         'PDF_process_pdi',
+         'PDF_rect',
+         'PDF_restore',
+         'PDF_resume_page',
+         'PDF_rotate',
+         'PDF_save',
+         'PDF_scale',
+         'PDF_set_border_color',
+         'PDF_set_border_dash',
+         'PDF_set_border_style',
+         'PDF_set_char_spacing',
+         'PDF_set_duration',
+         'PDF_set_gstate',
+         'PDF_set_horiz_scaling',
+         'PDF_set_info_author',
+         'PDF_set_info_creator',
+         'PDF_set_info_keywords',
+         'PDF_set_info_subject',
+         'PDF_set_info_title',
+         'PDF_set_info',
+         'PDF_set_layer_dependency',
+         'PDF_set_leading',
+         'PDF_set_parameter',
+         'PDF_set_text_matrix',
+         'PDF_set_text_pos',
+         'PDF_set_text_rendering',
+         'PDF_set_text_rise',
+         'PDF_set_value',
+         'PDF_set_word_spacing',
+         'PDF_setcolor',
+         'PDF_setdash',
+         'PDF_setdashpattern',
+         'PDF_setflat',
+         'PDF_setfont',
+         'PDF_setgray_fill',
+         'PDF_setgray_stroke',
+         'PDF_setgray',
+         'PDF_setlinecap',
+         'PDF_setlinejoin',
+         'PDF_setlinewidth',
+         'PDF_setmatrix',
+         'PDF_setmiterlimit',
+         'PDF_setpolydash',
+         'PDF_setrgbcolor_fill',
+         'PDF_setrgbcolor_stroke',
+         'PDF_setrgbcolor',
+         'PDF_shading_pattern',
+         'PDF_shading',
+         'PDF_shfill',
+         'PDF_show_boxed',
+         'PDF_show_xy',
+         'PDF_show',
+         'PDF_skew',
+         'PDF_stringwidth',
+         'PDF_stroke',
+         'PDF_suspend_page',
+         'PDF_translate',
+         'PDF_utf16_to_utf8',
+         'PDF_utf32_to_utf16',
+         'PDF_utf8_to_utf16'),
+ 'PHP Options/Info': ('assert_options',
+                      'assert',
+                      'cli_get_process_title',
+                      'cli_set_process_title',
+                      'dl',
+                      'extension_loaded',
+                      'gc_collect_cycles',
+                      'gc_disable',
+                      'gc_enable',
+                      'gc_enabled',
+                      'get_cfg_var',
+                      'get_current_user',
+                      'get_defined_constants',
+                      'get_extension_funcs',
+                      'get_include_path',
+                      'get_included_files',
+                      'get_loaded_extensions',
+                      'get_magic_quotes_gpc',
+                      'get_magic_quotes_runtime',
+                      'get_required_files',
+                      'getenv',
+                      'getlastmod',
+                      'getmygid',
+                      'getmyinode',
+                      'getmypid',
+                      'getmyuid',
+                      'getopt',
+                      'getrusage',
+                      'ini_alter',
+                      'ini_get_all',
+                      'ini_get',
+                      'ini_restore',
+                      'ini_set',
+                      'magic_quotes_runtime',
+                      'memory_get_peak_usage',
+                      'memory_get_usage',
+                      'php_ini_loaded_file',
+                      'php_ini_scanned_files',
+                      'php_logo_guid',
+                      'php_sapi_name',
+                      'php_uname',
+                      'phpcredits',
+                      'phpinfo',
+                      'phpversion',
+                      'putenv',
+                      'restore_include_path',
+                      'set_include_path',
+                      'set_magic_quotes_runtime',
+                      'set_time_limit',
+                      'sys_get_temp_dir',
+                      'version_compare',
+                      'zend_logo_guid',
+                      'zend_thread_id',
+                      'zend_version'),
+ 'POSIX': ('posix_access',
+           'posix_ctermid',
+           'posix_errno',
+           'posix_get_last_error',
+           'posix_getcwd',
+           'posix_getegid',
+           'posix_geteuid',
+           'posix_getgid',
+           'posix_getgrgid',
+           'posix_getgrnam',
+           'posix_getgroups',
+           'posix_getlogin',
+           'posix_getpgid',
+           'posix_getpgrp',
+           'posix_getpid',
+           'posix_getppid',
+           'posix_getpwnam',
+           'posix_getpwuid',
+           'posix_getrlimit',
+           'posix_getsid',
+           'posix_getuid',
+           'posix_initgroups',
+           'posix_isatty',
+           'posix_kill',
+           'posix_mkfifo',
+           'posix_mknod',
+           'posix_setegid',
+           'posix_seteuid',
+           'posix_setgid',
+           'posix_setpgid',
+           'posix_setsid',
+           'posix_setuid',
+           'posix_strerror',
+           'posix_times',
+           'posix_ttyname',
+           'posix_uname'),
+ 'POSIX Regex': ('ereg_replace',
+                 'ereg',
+                 'eregi_replace',
+                 'eregi',
+                 'split',
+                 'spliti',
+                 'sql_regcase'),
+ 'PS': ('ps_add_bookmark',
+        'ps_add_launchlink',
+        'ps_add_locallink',
+        'ps_add_note',
+        'ps_add_pdflink',
+        'ps_add_weblink',
+        'ps_arc',
+        'ps_arcn',
+        'ps_begin_page',
+        'ps_begin_pattern',
+        'ps_begin_template',
+        'ps_circle',
+        'ps_clip',
+        'ps_close_image',
+        'ps_close',
+        'ps_closepath_stroke',
+        'ps_closepath',
+        'ps_continue_text',
+        'ps_curveto',
+        'ps_delete',
+        'ps_end_page',
+        'ps_end_pattern',
+        'ps_end_template',
+        'ps_fill_stroke',
+        'ps_fill',
+        'ps_findfont',
+        'ps_get_buffer',
+        'ps_get_parameter',
+        'ps_get_value',
+        'ps_hyphenate',
+        'ps_include_file',
+        'ps_lineto',
+        'ps_makespotcolor',
+        'ps_moveto',
+        'ps_new',
+        'ps_open_file',
+        'ps_open_image_file',
+        'ps_open_image',
+        'ps_open_memory_image',
+        'ps_place_image',
+        'ps_rect',
+        'ps_restore',
+        'ps_rotate',
+        'ps_save',
+        'ps_scale',
+        'ps_set_border_color',
+        'ps_set_border_dash',
+        'ps_set_border_style',
+        'ps_set_info',
+        'ps_set_parameter',
+        'ps_set_text_pos',
+        'ps_set_value',
+        'ps_setcolor',
+        'ps_setdash',
+        'ps_setflat',
+        'ps_setfont',
+        'ps_setgray',
+        'ps_setlinecap',
+        'ps_setlinejoin',
+        'ps_setlinewidth',
+        'ps_setmiterlimit',
+        'ps_setoverprintmode',
+        'ps_setpolydash',
+        'ps_shading_pattern',
+        'ps_shading',
+        'ps_shfill',
+        'ps_show_boxed',
+        'ps_show_xy2',
+        'ps_show_xy',
+        'ps_show2',
+        'ps_show',
+        'ps_string_geometry',
+        'ps_stringwidth',
+        'ps_stroke',
+        'ps_symbol_name',
+        'ps_symbol_width',
+        'ps_symbol',
+        'ps_translate'),
+ 'Paradox': ('px_close',
+             'px_create_fp',
+             'px_date2string',
+             'px_delete_record',
+             'px_delete',
+             'px_get_field',
+             'px_get_info',
+             'px_get_parameter',
+             'px_get_record',
+             'px_get_schema',
+             'px_get_value',
+             'px_insert_record',
+             'px_new',
+             'px_numfields',
+             'px_numrecords',
+             'px_open_fp',
+             'px_put_record',
+             'px_retrieve_record',
+             'px_set_blob_file',
+             'px_set_parameter',
+             'px_set_tablename',
+             'px_set_targetencoding',
+             'px_set_value',
+             'px_timestamp2string',
+             'px_update_record'),
+ 'Parsekit': ('parsekit_compile_file',
+              'parsekit_compile_string',
+              'parsekit_func_arginfo'),
+ 'Password Hashing': ('password_get_info',
+                      'password_hash',
+                      'password_needs_rehash',
+                      'password_verify'),
+ 'PostgreSQL': ('pg_affected_rows',
+                'pg_cancel_query',
+                'pg_client_encoding',
+                'pg_close',
+                'pg_connect',
+                'pg_connection_busy',
+                'pg_connection_reset',
+                'pg_connection_status',
+                'pg_convert',
+                'pg_copy_from',
+                'pg_copy_to',
+                'pg_dbname',
+                'pg_delete',
+                'pg_end_copy',
+                'pg_escape_bytea',
+                'pg_escape_identifier',
+                'pg_escape_literal',
+                'pg_escape_string',
+                'pg_execute',
+                'pg_fetch_all_columns',
+                'pg_fetch_all',
+                'pg_fetch_array',
+                'pg_fetch_assoc',
+                'pg_fetch_object',
+                'pg_fetch_result',
+                'pg_fetch_row',
+                'pg_field_is_null',
+                'pg_field_name',
+                'pg_field_num',
+                'pg_field_prtlen',
+                'pg_field_size',
+                'pg_field_table',
+                'pg_field_type_oid',
+                'pg_field_type',
+                'pg_free_result',
+                'pg_get_notify',
+                'pg_get_pid',
+                'pg_get_result',
+                'pg_host',
+                'pg_insert',
+                'pg_last_error',
+                'pg_last_notice',
+                'pg_last_oid',
+                'pg_lo_close',
+                'pg_lo_create',
+                'pg_lo_export',
+                'pg_lo_import',
+                'pg_lo_open',
+                'pg_lo_read_all',
+                'pg_lo_read',
+                'pg_lo_seek',
+                'pg_lo_tell',
+                'pg_lo_truncate',
+                'pg_lo_unlink',
+                'pg_lo_write',
+                'pg_meta_data',
+                'pg_num_fields',
+                'pg_num_rows',
+                'pg_options',
+                'pg_parameter_status',
+                'pg_pconnect',
+                'pg_ping',
+                'pg_port',
+                'pg_prepare',
+                'pg_put_line',
+                'pg_query_params',
+                'pg_query',
+                'pg_result_error_field',
+                'pg_result_error',
+                'pg_result_seek',
+                'pg_result_status',
+                'pg_select',
+                'pg_send_execute',
+                'pg_send_prepare',
+                'pg_send_query_params',
+                'pg_send_query',
+                'pg_set_client_encoding',
+                'pg_set_error_verbosity',
+                'pg_trace',
+                'pg_transaction_status',
+                'pg_tty',
+                'pg_unescape_bytea',
+                'pg_untrace',
+                'pg_update',
+                'pg_version'),
+ 'Printer': ('printer_abort',
+             'printer_close',
+             'printer_create_brush',
+             'printer_create_dc',
+             'printer_create_font',
+             'printer_create_pen',
+             'printer_delete_brush',
+             'printer_delete_dc',
+             'printer_delete_font',
+             'printer_delete_pen',
+             'printer_draw_bmp',
+             'printer_draw_chord',
+             'printer_draw_elipse',
+             'printer_draw_line',
+             'printer_draw_pie',
+             'printer_draw_rectangle',
+             'printer_draw_roundrect',
+             'printer_draw_text',
+             'printer_end_doc',
+             'printer_end_page',
+             'printer_get_option',
+             'printer_list',
+             'printer_logical_fontheight',
+             'printer_open',
+             'printer_select_brush',
+             'printer_select_font',
+             'printer_select_pen',
+             'printer_set_option',
+             'printer_start_doc',
+             'printer_start_page',
+             'printer_write'),
+ 'Proctitle': ('setproctitle', 'setthreadtitle'),
+ 'Program execution': ('escapeshellarg',
+                       'escapeshellcmd',
+                       'exec',
+                       'passthru',
+                       'proc_close',
+                       'proc_get_status',
+                       'proc_nice',
+                       'proc_open',
+                       'proc_terminate',
+                       'shell_exec',
+                       'system'),
+ 'Pspell': ('pspell_add_to_personal',
+            'pspell_add_to_session',
+            'pspell_check',
+            'pspell_clear_session',
+            'pspell_config_create',
+            'pspell_config_data_dir',
+            'pspell_config_dict_dir',
+            'pspell_config_ignore',
+            'pspell_config_mode',
+            'pspell_config_personal',
+            'pspell_config_repl',
+            'pspell_config_runtogether',
+            'pspell_config_save_repl',
+            'pspell_new_config',
+            'pspell_new_personal',
+            'pspell_new',
+            'pspell_save_wordlist',
+            'pspell_store_replacement',
+            'pspell_suggest'),
+ 'RPM Reader': ('rpm_close',
+                'rpm_get_tag',
+                'rpm_is_valid',
+                'rpm_open',
+                'rpm_version'),
+ 'RRD': ('rrd_create',
+         'rrd_error',
+         'rrd_fetch',
+         'rrd_first',
+         'rrd_graph',
+         'rrd_info',
+         'rrd_last',
+         'rrd_lastupdate',
+         'rrd_restore',
+         'rrd_tune',
+         'rrd_update',
+         'rrd_version',
+         'rrd_xport',
+         'rrdc_disconnect'),
+ 'Radius': ('radius_acct_open',
+            'radius_add_server',
+            'radius_auth_open',
+            'radius_close',
+            'radius_config',
+            'radius_create_request',
+            'radius_cvt_addr',
+            'radius_cvt_int',
+            'radius_cvt_string',
+            'radius_demangle_mppe_key',
+            'radius_demangle',
+            'radius_get_attr',
+            'radius_get_tagged_attr_data',
+            'radius_get_tagged_attr_tag',
+            'radius_get_vendor_attr',
+            'radius_put_addr',
+            'radius_put_attr',
+            'radius_put_int',
+            'radius_put_string',
+            'radius_put_vendor_addr',
+            'radius_put_vendor_attr',
+            'radius_put_vendor_int',
+            'radius_put_vendor_string',
+            'radius_request_authenticator',
+            'radius_salt_encrypt_attr',
+            'radius_send_request',
+            'radius_server_secret',
+            'radius_strerror'),
+ 'Rar': ('rar_wrapper_cache_stats',),
+ 'Readline': ('readline_add_history',
+              'readline_callback_handler_install',
+              'readline_callback_handler_remove',
+              'readline_callback_read_char',
+              'readline_clear_history',
+              'readline_completion_function',
+              'readline_info',
+              'readline_list_history',
+              'readline_on_new_line',
+              'readline_read_history',
+              'readline_redisplay',
+              'readline_write_history',
+              'readline'),
+ 'Recode': ('recode_file', 'recode_string', 'recode'),
+ 'SNMP': ('snmp_get_quick_print',
+          'snmp_get_valueretrieval',
+          'snmp_read_mib',
+          'snmp_set_enum_print',
+          'snmp_set_oid_numeric_print',
+          'snmp_set_oid_output_format',
+          'snmp_set_quick_print',
+          'snmp_set_valueretrieval',
+          'snmp2_get',
+          'snmp2_getnext',
+          'snmp2_real_walk',
+          'snmp2_set',
+          'snmp2_walk',
+          'snmp3_get',
+          'snmp3_getnext',
+          'snmp3_real_walk',
+          'snmp3_set',
+          'snmp3_walk',
+          'snmpget',
+          'snmpgetnext',
+          'snmprealwalk',
+          'snmpset',
+          'snmpwalk',
+          'snmpwalkoid'),
+ 'SOAP': ('is_soap_fault', 'use_soap_error_handler'),
+ 'SPL': ('class_implements',
+         'class_parents',
+         'class_uses',
+         'iterator_apply',
+         'iterator_count',
+         'iterator_to_array',
+         'spl_autoload_call',
+         'spl_autoload_extensions',
+         'spl_autoload_functions',
+         'spl_autoload_register',
+         'spl_autoload_unregister',
+         'spl_autoload',
+         'spl_classes',
+         'spl_object_hash'),
+ 'SPPLUS': ('calcul_hmac', 'calculhmac', 'nthmac', 'signeurlpaiement'),
+ 'SQLSRV': ('sqlsrv_begin_transaction',
+            'sqlsrv_cancel',
+            'sqlsrv_client_info',
+            'sqlsrv_close',
+            'sqlsrv_commit',
+            'sqlsrv_configure',
+            'sqlsrv_connect',
+            'sqlsrv_errors',
+            'sqlsrv_execute',
+            'sqlsrv_fetch_array',
+            'sqlsrv_fetch_object',
+            'sqlsrv_fetch',
+            'sqlsrv_field_metadata',
+            'sqlsrv_free_stmt',
+            'sqlsrv_get_config',
+            'sqlsrv_get_field',
+            'sqlsrv_has_rows',
+            'sqlsrv_next_result',
+            'sqlsrv_num_fields',
+            'sqlsrv_num_rows',
+            'sqlsrv_prepare',
+            'sqlsrv_query',
+            'sqlsrv_rollback',
+            'sqlsrv_rows_affected',
+            'sqlsrv_send_stream_data',
+            'sqlsrv_server_info'),
+ 'SQLite': ('sqlite_array_query',
+            'sqlite_busy_timeout',
+            'sqlite_changes',
+            'sqlite_close',
+            'sqlite_column',
+            'sqlite_create_aggregate',
+            'sqlite_create_function',
+            'sqlite_current',
+            'sqlite_error_string',
+            'sqlite_escape_string',
+            'sqlite_exec',
+            'sqlite_factory',
+            'sqlite_fetch_all',
+            'sqlite_fetch_array',
+            'sqlite_fetch_column_types',
+            'sqlite_fetch_object',
+            'sqlite_fetch_single',
+            'sqlite_fetch_string',
+            'sqlite_field_name',
+            'sqlite_has_more',
+            'sqlite_has_prev',
+            'sqlite_key',
+            'sqlite_last_error',
+            'sqlite_last_insert_rowid',
+            'sqlite_libencoding',
+            'sqlite_libversion',
+            'sqlite_next',
+            'sqlite_num_fields',
+            'sqlite_num_rows',
+            'sqlite_open',
+            'sqlite_popen',
+            'sqlite_prev',
+            'sqlite_query',
+            'sqlite_rewind',
+            'sqlite_seek',
+            'sqlite_single_query',
+            'sqlite_udf_decode_binary',
+            'sqlite_udf_encode_binary',
+            'sqlite_unbuffered_query',
+            'sqlite_valid'),
+ 'SSH2': ('ssh2_auth_agent',
+          'ssh2_auth_hostbased_file',
+          'ssh2_auth_none',
+          'ssh2_auth_password',
+          'ssh2_auth_pubkey_file',
+          'ssh2_connect',
+          'ssh2_exec',
+          'ssh2_fetch_stream',
+          'ssh2_fingerprint',
+          'ssh2_methods_negotiated',
+          'ssh2_publickey_add',
+          'ssh2_publickey_init',
+          'ssh2_publickey_list',
+          'ssh2_publickey_remove',
+          'ssh2_scp_recv',
+          'ssh2_scp_send',
+          'ssh2_sftp_chmod',
+          'ssh2_sftp_lstat',
+          'ssh2_sftp_mkdir',
+          'ssh2_sftp_readlink',
+          'ssh2_sftp_realpath',
+          'ssh2_sftp_rename',
+          'ssh2_sftp_rmdir',
+          'ssh2_sftp_stat',
+          'ssh2_sftp_symlink',
+          'ssh2_sftp_unlink',
+          'ssh2_sftp',
+          'ssh2_shell',
+          'ssh2_tunnel'),
+ 'SVN': ('svn_add',
+         'svn_auth_get_parameter',
+         'svn_auth_set_parameter',
+         'svn_blame',
+         'svn_cat',
+         'svn_checkout',
+         'svn_cleanup',
+         'svn_client_version',
+         'svn_commit',
+         'svn_delete',
+         'svn_diff',
+         'svn_export',
+         'svn_fs_abort_txn',
+         'svn_fs_apply_text',
+         'svn_fs_begin_txn2',
+         'svn_fs_change_node_prop',
+         'svn_fs_check_path',
+         'svn_fs_contents_changed',
+         'svn_fs_copy',
+         'svn_fs_delete',
+         'svn_fs_dir_entries',
+         'svn_fs_file_contents',
+         'svn_fs_file_length',
+         'svn_fs_is_dir',
+         'svn_fs_is_file',
+         'svn_fs_make_dir',
+         'svn_fs_make_file',
+         'svn_fs_node_created_rev',
+         'svn_fs_node_prop',
+         'svn_fs_props_changed',
+         'svn_fs_revision_prop',
+         'svn_fs_revision_root',
+         'svn_fs_txn_root',
+         'svn_fs_youngest_rev',
+         'svn_import',
+         'svn_log',
+         'svn_ls',
+         'svn_mkdir',
+         'svn_repos_create',
+         'svn_repos_fs_begin_txn_for_commit',
+         'svn_repos_fs_commit_txn',
+         'svn_repos_fs',
+         'svn_repos_hotcopy',
+         'svn_repos_open',
+         'svn_repos_recover',
+         'svn_revert',
+         'svn_status',
+         'svn_update'),
+ 'SWF': ('swf_actiongeturl',
+         'swf_actiongotoframe',
+         'swf_actiongotolabel',
+         'swf_actionnextframe',
+         'swf_actionplay',
+         'swf_actionprevframe',
+         'swf_actionsettarget',
+         'swf_actionstop',
+         'swf_actiontogglequality',
+         'swf_actionwaitforframe',
+         'swf_addbuttonrecord',
+         'swf_addcolor',
+         'swf_closefile',
+         'swf_definebitmap',
+         'swf_definefont',
+         'swf_defineline',
+         'swf_definepoly',
+         'swf_definerect',
+         'swf_definetext',
+         'swf_endbutton',
+         'swf_enddoaction',
+         'swf_endshape',
+         'swf_endsymbol',
+         'swf_fontsize',
+         'swf_fontslant',
+         'swf_fonttracking',
+         'swf_getbitmapinfo',
+         'swf_getfontinfo',
+         'swf_getframe',
+         'swf_labelframe',
+         'swf_lookat',
+         'swf_modifyobject',
+         'swf_mulcolor',
+         'swf_nextid',
+         'swf_oncondition',
+         'swf_openfile',
+         'swf_ortho2',
+         'swf_ortho',
+         'swf_perspective',
+         'swf_placeobject',
+         'swf_polarview',
+         'swf_popmatrix',
+         'swf_posround',
+         'swf_pushmatrix',
+         'swf_removeobject',
+         'swf_rotate',
+         'swf_scale',
+         'swf_setfont',
+         'swf_setframe',
+         'swf_shapearc',
+         'swf_shapecurveto3',
+         'swf_shapecurveto',
+         'swf_shapefillbitmapclip',
+         'swf_shapefillbitmaptile',
+         'swf_shapefilloff',
+         'swf_shapefillsolid',
+         'swf_shapelinesolid',
+         'swf_shapelineto',
+         'swf_shapemoveto',
+         'swf_showframe',
+         'swf_startbutton',
+         'swf_startdoaction',
+         'swf_startshape',
+         'swf_startsymbol',
+         'swf_textwidth',
+         'swf_translate',
+         'swf_viewport'),
+ 'Semaphore': ('ftok',
+               'msg_get_queue',
+               'msg_queue_exists',
+               'msg_receive',
+               'msg_remove_queue',
+               'msg_send',
+               'msg_set_queue',
+               'msg_stat_queue',
+               'sem_acquire',
+               'sem_get',
+               'sem_release',
+               'sem_remove',
+               'shm_attach',
+               'shm_detach',
+               'shm_get_var',
+               'shm_has_var',
+               'shm_put_var',
+               'shm_remove_var',
+               'shm_remove'),
+ 'Session': ('session_cache_expire',
+             'session_cache_limiter',
+             'session_commit',
+             'session_decode',
+             'session_destroy',
+             'session_encode',
+             'session_get_cookie_params',
+             'session_id',
+             'session_is_registered',
+             'session_module_name',
+             'session_name',
+             'session_regenerate_id',
+             'session_register_shutdown',
+             'session_register',
+             'session_save_path',
+             'session_set_cookie_params',
+             'session_set_save_handler',
+             'session_start',
+             'session_status',
+             'session_unregister',
+             'session_unset',
+             'session_write_close'),
+ 'Session PgSQL': ('session_pgsql_add_error',
+                   'session_pgsql_get_error',
+                   'session_pgsql_get_field',
+                   'session_pgsql_reset',
+                   'session_pgsql_set_field',
+                   'session_pgsql_status'),
+ 'Shared Memory': ('shmop_close',
+                   'shmop_delete',
+                   'shmop_open',
+                   'shmop_read',
+                   'shmop_size',
+                   'shmop_write'),
+ 'SimpleXML': ('simplexml_import_dom',
+               'simplexml_load_file',
+               'simplexml_load_string'),
+ 'Socket': ('socket_accept',
+            'socket_bind',
+            'socket_clear_error',
+            'socket_close',
+            'socket_cmsg_space',
+            'socket_connect',
+            'socket_create_listen',
+            'socket_create_pair',
+            'socket_create',
+            'socket_get_option',
+            'socket_getpeername',
+            'socket_getsockname',
+            'socket_import_stream',
+            'socket_last_error',
+            'socket_listen',
+            'socket_read',
+            'socket_recv',
+            'socket_recvfrom',
+            'socket_recvmsg',
+            'socket_select',
+            'socket_send',
+            'socket_sendmsg',
+            'socket_sendto',
+            'socket_set_block',
+            'socket_set_nonblock',
+            'socket_set_option',
+            'socket_shutdown',
+            'socket_strerror',
+            'socket_write'),
+ 'Solr': ('solr_get_version',),
+ 'Statistic': ('stats_absolute_deviation',
+               'stats_cdf_beta',
+               'stats_cdf_binomial',
+               'stats_cdf_cauchy',
+               'stats_cdf_chisquare',
+               'stats_cdf_exponential',
+               'stats_cdf_f',
+               'stats_cdf_gamma',
+               'stats_cdf_laplace',
+               'stats_cdf_logistic',
+               'stats_cdf_negative_binomial',
+               'stats_cdf_noncentral_chisquare',
+               'stats_cdf_noncentral_f',
+               'stats_cdf_poisson',
+               'stats_cdf_t',
+               'stats_cdf_uniform',
+               'stats_cdf_weibull',
+               'stats_covariance',
+               'stats_den_uniform',
+               'stats_dens_beta',
+               'stats_dens_cauchy',
+               'stats_dens_chisquare',
+               'stats_dens_exponential',
+               'stats_dens_f',
+               'stats_dens_gamma',
+               'stats_dens_laplace',
+               'stats_dens_logistic',
+               'stats_dens_negative_binomial',
+               'stats_dens_normal',
+               'stats_dens_pmf_binomial',
+               'stats_dens_pmf_hypergeometric',
+               'stats_dens_pmf_poisson',
+               'stats_dens_t',
+               'stats_dens_weibull',
+               'stats_harmonic_mean',
+               'stats_kurtosis',
+               'stats_rand_gen_beta',
+               'stats_rand_gen_chisquare',
+               'stats_rand_gen_exponential',
+               'stats_rand_gen_f',
+               'stats_rand_gen_funiform',
+               'stats_rand_gen_gamma',
+               'stats_rand_gen_ibinomial_negative',
+               'stats_rand_gen_ibinomial',
+               'stats_rand_gen_int',
+               'stats_rand_gen_ipoisson',
+               'stats_rand_gen_iuniform',
+               'stats_rand_gen_noncenral_chisquare',
+               'stats_rand_gen_noncentral_f',
+               'stats_rand_gen_noncentral_t',
+               'stats_rand_gen_normal',
+               'stats_rand_gen_t',
+               'stats_rand_get_seeds',
+               'stats_rand_phrase_to_seeds',
+               'stats_rand_ranf',
+               'stats_rand_setall',
+               'stats_skew',
+               'stats_standard_deviation',
+               'stats_stat_binomial_coef',
+               'stats_stat_correlation',
+               'stats_stat_gennch',
+               'stats_stat_independent_t',
+               'stats_stat_innerproduct',
+               'stats_stat_noncentral_t',
+               'stats_stat_paired_t',
+               'stats_stat_percentile',
+               'stats_stat_powersum',
+               'stats_variance'),
+ 'Stomp': ('stomp_connect_error', 'stomp_version'),
+ 'Stream': ('set_socket_blocking',
+            'stream_bucket_append',
+            'stream_bucket_make_writeable',
+            'stream_bucket_new',
+            'stream_bucket_prepend',
+            'stream_context_create',
+            'stream_context_get_default',
+            'stream_context_get_options',
+            'stream_context_get_params',
+            'stream_context_set_default',
+            'stream_context_set_option',
+            'stream_context_set_params',
+            'stream_copy_to_stream',
+            'stream_encoding',
+            'stream_filter_append',
+            'stream_filter_prepend',
+            'stream_filter_register',
+            'stream_filter_remove',
+            'stream_get_contents',
+            'stream_get_filters',
+            'stream_get_line',
+            'stream_get_meta_data',
+            'stream_get_transports',
+            'stream_get_wrappers',
+            'stream_is_local',
+            'stream_notification_callback',
+            'stream_register_wrapper',
+            'stream_resolve_include_path',
+            'stream_select',
+            'stream_set_blocking',
+            'stream_set_chunk_size',
+            'stream_set_read_buffer',
+            'stream_set_timeout',
+            'stream_set_write_buffer',
+            'stream_socket_accept',
+            'stream_socket_client',
+            'stream_socket_enable_crypto',
+            'stream_socket_get_name',
+            'stream_socket_pair',
+            'stream_socket_recvfrom',
+            'stream_socket_sendto',
+            'stream_socket_server',
+            'stream_socket_shutdown',
+            'stream_supports_lock',
+            'stream_wrapper_register',
+            'stream_wrapper_restore',
+            'stream_wrapper_unregister'),
+ 'String': ('addcslashes',
+            'addslashes',
+            'bin2hex',
+            'chop',
+            'chr',
+            'chunk_split',
+            'convert_cyr_string',
+            'convert_uudecode',
+            'convert_uuencode',
+            'count_chars',
+            'crc32',
+            'crypt',
+            'echo',
+            'explode',
+            'fprintf',
+            'get_html_translation_table',
+            'hebrev',
+            'hebrevc',
+            'hex2bin',
+            'html_entity_decode',
+            'htmlentities',
+            'htmlspecialchars_decode',
+            'htmlspecialchars',
+            'implode',
+            'join',
+            'lcfirst',
+            'levenshtein',
+            'localeconv',
+            'ltrim',
+            'md5_file',
+            'md5',
+            'metaphone',
+            'money_format',
+            'nl_langinfo',
+            'nl2br',
+            'number_format',
+            'ord',
+            'parse_str',
+            'print',
+            'printf',
+            'quoted_printable_decode',
+            'quoted_printable_encode',
+            'quotemeta',
+            'rtrim',
+            'setlocale',
+            'sha1_file',
+            'sha1',
+            'similar_text',
+            'soundex',
+            'sprintf',
+            'sscanf',
+            'str_getcsv',
+            'str_ireplace',
+            'str_pad',
+            'str_repeat',
+            'str_replace',
+            'str_rot13',
+            'str_shuffle',
+            'str_split',
+            'str_word_count',
+            'strcasecmp',
+            'strchr',
+            'strcmp',
+            'strcoll',
+            'strcspn',
+            'strip_tags',
+            'stripcslashes',
+            'stripos',
+            'stripslashes',
+            'stristr',
+            'strlen',
+            'strnatcasecmp',
+            'strnatcmp',
+            'strncasecmp',
+            'strncmp',
+            'strpbrk',
+            'strpos',
+            'strrchr',
+            'strrev',
+            'strripos',
+            'strrpos',
+            'strspn',
+            'strstr',
+            'strtok',
+            'strtolower',
+            'strtoupper',
+            'strtr',
+            'substr_compare',
+            'substr_count',
+            'substr_replace',
+            'substr',
+            'trim',
+            'ucfirst',
+            'ucwords',
+            'vfprintf',
+            'vprintf',
+            'vsprintf',
+            'wordwrap'),
+ 'Sybase': ('sybase_affected_rows',
+            'sybase_close',
+            'sybase_connect',
+            'sybase_data_seek',
+            'sybase_deadlock_retry_count',
+            'sybase_fetch_array',
+            'sybase_fetch_assoc',
+            'sybase_fetch_field',
+            'sybase_fetch_object',
+            'sybase_fetch_row',
+            'sybase_field_seek',
+            'sybase_free_result',
+            'sybase_get_last_message',
+            'sybase_min_client_severity',
+            'sybase_min_error_severity',
+            'sybase_min_message_severity',
+            'sybase_min_server_severity',
+            'sybase_num_fields',
+            'sybase_num_rows',
+            'sybase_pconnect',
+            'sybase_query',
+            'sybase_result',
+            'sybase_select_db',
+            'sybase_set_message_handler',
+            'sybase_unbuffered_query'),
+ 'TCP': ('tcpwrap_check',),
+ 'Taint': ('is_tainted', 'taint', 'untaint'),
+ 'Tidy': ('ob_tidyhandler',
+          'tidy_access_count',
+          'tidy_config_count',
+          'tidy_error_count',
+          'tidy_get_output',
+          'tidy_load_config',
+          'tidy_reset_config',
+          'tidy_save_config',
+          'tidy_set_encoding',
+          'tidy_setopt',
+          'tidy_warning_count'),
+ 'Tokenizer': ('token_get_all', 'token_name'),
+ 'Trader': ('trader_acos',
+            'trader_ad',
+            'trader_add',
+            'trader_adosc',
+            'trader_adx',
+            'trader_adxr',
+            'trader_apo',
+            'trader_aroon',
+            'trader_aroonosc',
+            'trader_asin',
+            'trader_atan',
+            'trader_atr',
+            'trader_avgprice',
+            'trader_bbands',
+            'trader_beta',
+            'trader_bop',
+            'trader_cci',
+            'trader_cdl2crows',
+            'trader_cdl3blackcrows',
+            'trader_cdl3inside',
+            'trader_cdl3linestrike',
+            'trader_cdl3outside',
+            'trader_cdl3starsinsouth',
+            'trader_cdl3whitesoldiers',
+            'trader_cdlabandonedbaby',
+            'trader_cdladvanceblock',
+            'trader_cdlbelthold',
+            'trader_cdlbreakaway',
+            'trader_cdlclosingmarubozu',
+            'trader_cdlconcealbabyswall',
+            'trader_cdlcounterattack',
+            'trader_cdldarkcloudcover',
+            'trader_cdldoji',
+            'trader_cdldojistar',
+            'trader_cdldragonflydoji',
+            'trader_cdlengulfing',
+            'trader_cdleveningdojistar',
+            'trader_cdleveningstar',
+            'trader_cdlgapsidesidewhite',
+            'trader_cdlgravestonedoji',
+            'trader_cdlhammer',
+            'trader_cdlhangingman',
+            'trader_cdlharami',
+            'trader_cdlharamicross',
+            'trader_cdlhighwave',
+            'trader_cdlhikkake',
+            'trader_cdlhikkakemod',
+            'trader_cdlhomingpigeon',
+            'trader_cdlidentical3crows',
+            'trader_cdlinneck',
+            'trader_cdlinvertedhammer',
+            'trader_cdlkicking',
+            'trader_cdlkickingbylength',
+            'trader_cdlladderbottom',
+            'trader_cdllongleggeddoji',
+            'trader_cdllongline',
+            'trader_cdlmarubozu',
+            'trader_cdlmatchinglow',
+            'trader_cdlmathold',
+            'trader_cdlmorningdojistar',
+            'trader_cdlmorningstar',
+            'trader_cdlonneck',
+            'trader_cdlpiercing',
+            'trader_cdlrickshawman',
+            'trader_cdlrisefall3methods',
+            'trader_cdlseparatinglines',
+            'trader_cdlshootingstar',
+            'trader_cdlshortline',
+            'trader_cdlspinningtop',
+            'trader_cdlstalledpattern',
+            'trader_cdlsticksandwich',
+            'trader_cdltakuri',
+            'trader_cdltasukigap',
+            'trader_cdlthrusting',
+            'trader_cdltristar',
+            'trader_cdlunique3river',
+            'trader_cdlupsidegap2crows',
+            'trader_cdlxsidegap3methods',
+            'trader_ceil',
+            'trader_cmo',
+            'trader_correl',
+            'trader_cos',
+            'trader_cosh',
+            'trader_dema',
+            'trader_div',
+            'trader_dx',
+            'trader_ema',
+            'trader_errno',
+            'trader_exp',
+            'trader_floor',
+            'trader_get_compat',
+            'trader_get_unstable_period',
+            'trader_ht_dcperiod',
+            'trader_ht_dcphase',
+            'trader_ht_phasor',
+            'trader_ht_sine',
+            'trader_ht_trendline',
+            'trader_ht_trendmode',
+            'trader_kama',
+            'trader_linearreg_angle',
+            'trader_linearreg_intercept',
+            'trader_linearreg_slope',
+            'trader_linearreg',
+            'trader_ln',
+            'trader_log10',
+            'trader_ma',
+            'trader_macd',
+            'trader_macdext',
+            'trader_macdfix',
+            'trader_mama',
+            'trader_mavp',
+            'trader_max',
+            'trader_maxindex',
+            'trader_medprice',
+            'trader_mfi',
+            'trader_midpoint',
+            'trader_midprice',
+            'trader_min',
+            'trader_minindex',
+            'trader_minmax',
+            'trader_minmaxindex',
+            'trader_minus_di',
+            'trader_minus_dm',
+            'trader_mom',
+            'trader_mult',
+            'trader_natr',
+            'trader_obv',
+            'trader_plus_di',
+            'trader_plus_dm',
+            'trader_ppo',
+            'trader_roc',
+            'trader_rocp',
+            'trader_rocr100',
+            'trader_rocr',
+            'trader_rsi',
+            'trader_sar',
+            'trader_sarext',
+            'trader_set_compat',
+            'trader_set_unstable_period',
+            'trader_sin',
+            'trader_sinh',
+            'trader_sma',
+            'trader_sqrt',
+            'trader_stddev',
+            'trader_stoch',
+            'trader_stochf',
+            'trader_stochrsi',
+            'trader_sub',
+            'trader_sum',
+            'trader_t3',
+            'trader_tan',
+            'trader_tanh',
+            'trader_tema',
+            'trader_trange',
+            'trader_trima',
+            'trader_trix',
+            'trader_tsf',
+            'trader_typprice',
+            'trader_ultosc',
+            'trader_var',
+            'trader_wclprice',
+            'trader_willr',
+            'trader_wma'),
+ 'URL': ('base64_decode',
+         'base64_encode',
+         'get_headers',
+         'get_meta_tags',
+         'http_build_query',
+         'parse_url',
+         'rawurldecode',
+         'rawurlencode',
+         'urldecode',
+         'urlencode'),
+ 'Uopz': ('uopz_backup',
+          'uopz_compose',
+          'uopz_copy',
+          'uopz_delete',
+          'uopz_extend',
+          'uopz_flags',
+          'uopz_function',
+          'uopz_implement',
+          'uopz_overload',
+          'uopz_redefine',
+          'uopz_rename',
+          'uopz_restore',
+          'uopz_undefine'),
+ 'Variable handling': ('boolval',
+                       'debug_zval_dump',
+                       'doubleval',
+                       'empty',
+                       'floatval',
+                       'get_defined_vars',
+                       'get_resource_type',
+                       'gettype',
+                       'import_request_variables',
+                       'intval',
+                       'is_array',
+                       'is_bool',
+                       'is_callable',
+                       'is_double',
+                       'is_float',
+                       'is_int',
+                       'is_integer',
+                       'is_long',
+                       'is_null',
+                       'is_numeric',
+                       'is_object',
+                       'is_real',
+                       'is_resource',
+                       'is_scalar',
+                       'is_string',
+                       'isset',
+                       'print_r',
+                       'serialize',
+                       'settype',
+                       'strval',
+                       'unserialize',
+                       'unset',
+                       'var_dump',
+                       'var_export'),
+ 'W32api': ('w32api_deftype',
+            'w32api_init_dtype',
+            'w32api_invoke_function',
+            'w32api_register_function',
+            'w32api_set_call_method'),
+ 'WDDX': ('wddx_add_vars',
+          'wddx_deserialize',
+          'wddx_packet_end',
+          'wddx_packet_start',
+          'wddx_serialize_value',
+          'wddx_serialize_vars'),
+ 'WinCache': ('wincache_fcache_fileinfo',
+              'wincache_fcache_meminfo',
+              'wincache_lock',
+              'wincache_ocache_fileinfo',
+              'wincache_ocache_meminfo',
+              'wincache_refresh_if_changed',
+              'wincache_rplist_fileinfo',
+              'wincache_rplist_meminfo',
+              'wincache_scache_info',
+              'wincache_scache_meminfo',
+              'wincache_ucache_add',
+              'wincache_ucache_cas',
+              'wincache_ucache_clear',
+              'wincache_ucache_dec',
+              'wincache_ucache_delete',
+              'wincache_ucache_exists',
+              'wincache_ucache_get',
+              'wincache_ucache_inc',
+              'wincache_ucache_info',
+              'wincache_ucache_meminfo',
+              'wincache_ucache_set',
+              'wincache_unlock'),
+ 'XML Parser': ('utf8_decode',
+                'utf8_encode',
+                'xml_error_string',
+                'xml_get_current_byte_index',
+                'xml_get_current_column_number',
+                'xml_get_current_line_number',
+                'xml_get_error_code',
+                'xml_parse_into_struct',
+                'xml_parse',
+                'xml_parser_create_ns',
+                'xml_parser_create',
+                'xml_parser_free',
+                'xml_parser_get_option',
+                'xml_parser_set_option',
+                'xml_set_character_data_handler',
+                'xml_set_default_handler',
+                'xml_set_element_handler',
+                'xml_set_end_namespace_decl_handler',
+                'xml_set_external_entity_ref_handler',
+                'xml_set_notation_decl_handler',
+                'xml_set_object',
+                'xml_set_processing_instruction_handler',
+                'xml_set_start_namespace_decl_handler',
+                'xml_set_unparsed_entity_decl_handler'),
+ 'XML-RPC': ('xmlrpc_decode_request',
+             'xmlrpc_decode',
+             'xmlrpc_encode_request',
+             'xmlrpc_encode',
+             'xmlrpc_get_type',
+             'xmlrpc_is_fault',
+             'xmlrpc_parse_method_descriptions',
+             'xmlrpc_server_add_introspection_data',
+             'xmlrpc_server_call_method',
+             'xmlrpc_server_create',
+             'xmlrpc_server_destroy',
+             'xmlrpc_server_register_introspection_callback',
+             'xmlrpc_server_register_method',
+             'xmlrpc_set_type'),
+ 'XSLT (PHP 4)': ('xslt_backend_info',
+                  'xslt_backend_name',
+                  'xslt_backend_version',
+                  'xslt_create',
+                  'xslt_errno',
+                  'xslt_error',
+                  'xslt_free',
+                  'xslt_getopt',
+                  'xslt_process',
+                  'xslt_set_base',
+                  'xslt_set_encoding',
+                  'xslt_set_error_handler',
+                  'xslt_set_log',
+                  'xslt_set_object',
+                  'xslt_set_sax_handler',
+                  'xslt_set_sax_handlers',
+                  'xslt_set_scheme_handler',
+                  'xslt_set_scheme_handlers',
+                  'xslt_setopt'),
+ 'Xhprof': ('xhprof_disable',
+            'xhprof_enable',
+            'xhprof_sample_disable',
+            'xhprof_sample_enable'),
+ 'YAZ': ('yaz_addinfo',
+         'yaz_ccl_conf',
+         'yaz_ccl_parse',
+         'yaz_close',
+         'yaz_connect',
+         'yaz_database',
+         'yaz_element',
+         'yaz_errno',
+         'yaz_error',
+         'yaz_es_result',
+         'yaz_es',
+         'yaz_get_option',
+         'yaz_hits',
+         'yaz_itemorder',
+         'yaz_present',
+         'yaz_range',
+         'yaz_record',
+         'yaz_scan_result',
+         'yaz_scan',
+         'yaz_schema',
+         'yaz_search',
+         'yaz_set_option',
+         'yaz_sort',
+         'yaz_syntax',
+         'yaz_wait'),
+ 'YP/NIS': ('yp_all',
+            'yp_cat',
+            'yp_err_string',
+            'yp_errno',
+            'yp_first',
+            'yp_get_default_domain',
+            'yp_master',
+            'yp_match',
+            'yp_next',
+            'yp_order'),
+ 'Yaml': ('yaml_emit_file',
+          'yaml_emit',
+          'yaml_parse_file',
+          'yaml_parse_url',
+          'yaml_parse'),
+ 'Zip': ('zip_close',
+         'zip_entry_close',
+         'zip_entry_compressedsize',
+         'zip_entry_compressionmethod',
+         'zip_entry_filesize',
+         'zip_entry_name',
+         'zip_entry_open',
+         'zip_entry_read',
+         'zip_open',
+         'zip_read'),
+ 'Zlib': ('gzclose',
+          'gzcompress',
+          'gzdecode',
+          'gzdeflate',
+          'gzencode',
+          'gzeof',
+          'gzfile',
+          'gzgetc',
+          'gzgets',
+          'gzgetss',
+          'gzinflate',
+          'gzopen',
+          'gzpassthru',
+          'gzputs',
+          'gzread',
+          'gzrewind',
+          'gzseek',
+          'gztell',
+          'gzuncompress',
+          'gzwrite',
+          'readgzfile',
+          'zlib_decode',
+          'zlib_encode',
+          'zlib_get_coding_type'),
+ 'bcompiler': ('bcompiler_load_exe',
+               'bcompiler_load',
+               'bcompiler_parse_class',
+               'bcompiler_read',
+               'bcompiler_write_class',
+               'bcompiler_write_constant',
+               'bcompiler_write_exe_footer',
+               'bcompiler_write_file',
+               'bcompiler_write_footer',
+               'bcompiler_write_function',
+               'bcompiler_write_functions_from_file',
+               'bcompiler_write_header',
+               'bcompiler_write_included_filename'),
+ 'cURL': ('curl_close',
+          'curl_copy_handle',
+          'curl_errno',
+          'curl_error',
+          'curl_escape',
+          'curl_exec',
+          'curl_file_create',
+          'curl_getinfo',
+          'curl_init',
+          'curl_multi_add_handle',
+          'curl_multi_close',
+          'curl_multi_exec',
+          'curl_multi_getcontent',
+          'curl_multi_info_read',
+          'curl_multi_init',
+          'curl_multi_remove_handle',
+          'curl_multi_select',
+          'curl_multi_setopt',
+          'curl_multi_strerror',
+          'curl_pause',
+          'curl_reset',
+          'curl_setopt_array',
+          'curl_setopt',
+          'curl_share_close',
+          'curl_share_init',
+          'curl_share_setopt',
+          'curl_strerror',
+          'curl_unescape',
+          'curl_version'),
+ 'chdb': ('chdb_create',),
+ 'dBase': ('dbase_add_record',
+           'dbase_close',
+           'dbase_create',
+           'dbase_delete_record',
+           'dbase_get_header_info',
+           'dbase_get_record_with_names',
+           'dbase_get_record',
+           'dbase_numfields',
+           'dbase_numrecords',
+           'dbase_open',
+           'dbase_pack',
+           'dbase_replace_record'),
+ 'dbx': ('dbx_close',
+         'dbx_compare',
+         'dbx_connect',
+         'dbx_error',
+         'dbx_escape_string',
+         'dbx_fetch_row',
+         'dbx_query',
+         'dbx_sort'),
+ 'filePro': ('filepro_fieldcount',
+             'filepro_fieldname',
+             'filepro_fieldtype',
+             'filepro_fieldwidth',
+             'filepro_retrieve',
+             'filepro_rowcount',
+             'filepro'),
+ 'iconv': ('iconv_get_encoding',
+           'iconv_mime_decode_headers',
+           'iconv_mime_decode',
+           'iconv_mime_encode',
+           'iconv_set_encoding',
+           'iconv_strlen',
+           'iconv_strpos',
+           'iconv_strrpos',
+           'iconv_substr',
+           'iconv',
+           'ob_iconv_handler'),
+ 'inclued': ('inclued_get_data',),
+ 'intl': ('intl_error_name',
+          'intl_get_error_code',
+          'intl_get_error_message',
+          'intl_is_failure'),
+ 'libxml': ('libxml_clear_errors',
+            'libxml_disable_entity_loader',
+            'libxml_get_errors',
+            'libxml_get_last_error',
+            'libxml_set_external_entity_loader',
+            'libxml_set_streams_context',
+            'libxml_use_internal_errors'),
+ 'mSQL': ('msql_affected_rows',
+          'msql_close',
+          'msql_connect',
+          'msql_create_db',
+          'msql_createdb',
+          'msql_data_seek',
+          'msql_db_query',
+          'msql_dbname',
+          'msql_drop_db',
+          'msql_error',
+          'msql_fetch_array',
+          'msql_fetch_field',
+          'msql_fetch_object',
+          'msql_fetch_row',
+          'msql_field_flags',
+          'msql_field_len',
+          'msql_field_name',
+          'msql_field_seek',
+          'msql_field_table',
+          'msql_field_type',
+          'msql_fieldflags',
+          'msql_fieldlen',
+          'msql_fieldname',
+          'msql_fieldtable',
+          'msql_fieldtype',
+          'msql_free_result',
+          'msql_list_dbs',
+          'msql_list_fields',
+          'msql_list_tables',
+          'msql_num_fields',
+          'msql_num_rows',
+          'msql_numfields',
+          'msql_numrows',
+          'msql_pconnect',
+          'msql_query',
+          'msql_regcase',
+          'msql_result',
+          'msql_select_db',
+          'msql_tablename',
+          'msql'),
+ 'mnoGoSearch': ('udm_add_search_limit',
+                 'udm_alloc_agent_array',
+                 'udm_alloc_agent',
+                 'udm_api_version',
+                 'udm_cat_list',
+                 'udm_cat_path',
+                 'udm_check_charset',
+                 'udm_check_stored',
+                 'udm_clear_search_limits',
+                 'udm_close_stored',
+                 'udm_crc32',
+                 'udm_errno',
+                 'udm_error',
+                 'udm_find',
+                 'udm_free_agent',
+                 'udm_free_ispell_data',
+                 'udm_free_res',
+                 'udm_get_doc_count',
+                 'udm_get_res_field',
+                 'udm_get_res_param',
+                 'udm_hash32',
+                 'udm_load_ispell_data',
+                 'udm_open_stored',
+                 'udm_set_agent_param'),
+ 'mqseries': ('mqseries_back',
+              'mqseries_begin',
+              'mqseries_close',
+              'mqseries_cmit',
+              'mqseries_conn',
+              'mqseries_connx',
+              'mqseries_disc',
+              'mqseries_get',
+              'mqseries_inq',
+              'mqseries_open',
+              'mqseries_put1',
+              'mqseries_put',
+              'mqseries_set',
+              'mqseries_strerror'),
+ 'mysqlnd_qc': ('mysqlnd_qc_clear_cache',
+                'mysqlnd_qc_get_available_handlers',
+                'mysqlnd_qc_get_cache_info',
+                'mysqlnd_qc_get_core_stats',
+                'mysqlnd_qc_get_normalized_query_trace_log',
+                'mysqlnd_qc_get_query_trace_log',
+                'mysqlnd_qc_set_cache_condition',
+                'mysqlnd_qc_set_is_select',
+                'mysqlnd_qc_set_storage_handler',
+                'mysqlnd_qc_set_user_handlers'),
+ 'qtdom': ('qdom_error', 'qdom_tree'),
+ 'runkit': ('runkit_class_adopt',
+            'runkit_class_emancipate',
+            'runkit_constant_add',
+            'runkit_constant_redefine',
+            'runkit_constant_remove',
+            'runkit_function_add',
+            'runkit_function_copy',
+            'runkit_function_redefine',
+            'runkit_function_remove',
+            'runkit_function_rename',
+            'runkit_import',
+            'runkit_lint_file',
+            'runkit_lint',
+            'runkit_method_add',
+            'runkit_method_copy',
+            'runkit_method_redefine',
+            'runkit_method_remove',
+            'runkit_method_rename',
+            'runkit_return_value_used',
+            'runkit_sandbox_output_handler',
+            'runkit_superglobals'),
+ 'ssdeep': ('ssdeep_fuzzy_compare',
+            'ssdeep_fuzzy_hash_filename',
+            'ssdeep_fuzzy_hash'),
+ 'vpopmail': ('vpopmail_add_alias_domain_ex',
+              'vpopmail_add_alias_domain',
+              'vpopmail_add_domain_ex',
+              'vpopmail_add_domain',
+              'vpopmail_add_user',
+              'vpopmail_alias_add',
+              'vpopmail_alias_del_domain',
+              'vpopmail_alias_del',
+              'vpopmail_alias_get_all',
+              'vpopmail_alias_get',
+              'vpopmail_auth_user',
+              'vpopmail_del_domain_ex',
+              'vpopmail_del_domain',
+              'vpopmail_del_user',
+              'vpopmail_error',
+              'vpopmail_passwd',
+              'vpopmail_set_user_quota'),
+ 'win32ps': ('win32_ps_list_procs', 'win32_ps_stat_mem', 'win32_ps_stat_proc'),
+ 'win32service': ('win32_continue_service',
+                  'win32_create_service',
+                  'win32_delete_service',
+                  'win32_get_last_control_message',
+                  'win32_pause_service',
+                  'win32_query_service_status',
+                  'win32_set_service_status',
+                  'win32_start_service_ctrl_dispatcher',
+                  'win32_start_service',
+                  'win32_stop_service'),
+ 'xattr': ('xattr_get',
+           'xattr_list',
+           'xattr_remove',
+           'xattr_set',
+           'xattr_supported'),
+ 'xdiff': ('xdiff_file_bdiff_size',
+           'xdiff_file_bdiff',
+           'xdiff_file_bpatch',
+           'xdiff_file_diff_binary',
+           'xdiff_file_diff',
+           'xdiff_file_merge3',
+           'xdiff_file_patch_binary',
+           'xdiff_file_patch',
+           'xdiff_file_rabdiff',
+           'xdiff_string_bdiff_size',
+           'xdiff_string_bdiff',
+           'xdiff_string_bpatch',
+           'xdiff_string_diff_binary',
+           'xdiff_string_diff',
+           'xdiff_string_merge3',
+           'xdiff_string_patch_binary',
+           'xdiff_string_patch',
+           'xdiff_string_rabdiff')}
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import glob
+    import os
+    import pprint
+    import re
+    import shutil
+    import tarfile
+    try:
+        from urllib import urlretrieve
+    except ImportError:
+        from urllib.request import urlretrieve
+
+    PHP_MANUAL_URL     = 'http://us3.php.net/distributions/manual/php_manual_en.tar.gz'
+    PHP_MANUAL_DIR     = './php-chunked-xhtml/'
+    PHP_REFERENCE_GLOB = 'ref.*'
+    PHP_FUNCTION_RE    = '<a href="function\..*?\.html">(.*?)</a>'
+    PHP_MODULE_RE      = '<title>(.*?) Functions</title>'
+
+    def get_php_functions():
+        function_re = re.compile(PHP_FUNCTION_RE)
+        module_re   = re.compile(PHP_MODULE_RE)
+        modules     = {}
+
+        for file in get_php_references():
+            module = ''
+            for line in open(file):
+                if not module:
+                    search = module_re.search(line)
+                    if search:
+                        module = search.group(1)
+                        modules[module] = []
+
+                elif 'href="function.' in line:
+                    for match in function_re.finditer(line):
+                        fn = match.group(1)
+                        if '-&gt;' not in fn and '::' not in fn and fn not in modules[module]:
+                            modules[module].append(fn)
+
+            if module:
+                # These are dummy manual pages, not actual functions
+                if module == 'PHP Options/Info':
+                    modules[module].remove('main')
+
+                if module == 'Filesystem':
+                    modules[module].remove('delete')
+
+                if not modules[module]:
+                    del modules[module]
+
+        return modules
+
+    def get_php_references():
+        download = urlretrieve(PHP_MANUAL_URL)
+        tar = tarfile.open(download[0])
+        tar.extractall()
+        tar.close()
+        for file in glob.glob("%s%s" % (PHP_MANUAL_DIR, PHP_REFERENCE_GLOB)):
+            yield file
+        os.remove(download[0])
+
+    def regenerate(filename, modules):
+        with open(filename) as fp:
+            content = fp.read()
+
+        header = content[:content.find('MODULES = {')]
+        footer = content[content.find("if __name__ == '__main__':"):]
+
+        with open(filename, 'w') as fp:
+            fp.write(header)
+            fp.write('MODULES = %s\n\n' % pprint.pformat(modules))
+            fp.write(footer)
+
+    def run():
+        print('>> Downloading Function Index')
+        modules = get_php_functions()
+        total = sum(len(v) for v in modules.values())
+        print('%d functions found' % total)
+        regenerate(__file__, modules)
+        shutil.rmtree(PHP_MANUAL_DIR)
+
+    run()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/modula2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/modula2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/modula2.py	(revision 1126)
@@ -0,0 +1,1561 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.modula2
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Multi-Dialect Lexer for Modula-2.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.util import get_bool_opt, get_list_opt
+from pygments.token import Text, Comment, Operator, Keyword, Name, \
+    String, Number, Punctuation, Error
+
+__all__ = ['Modula2Lexer']
+
+
+# Multi-Dialect Modula-2 Lexer
+class Modula2Lexer(RegexLexer):
+    """
+    For `Modula-2 <http://www.modula2.org/>`_ source code.
+
+    The Modula-2 lexer supports several dialects.  By default, it operates in
+    fallback mode, recognising the *combined* literals, punctuation symbols
+    and operators of all supported dialects, and the *combined* reserved words
+    and builtins of PIM Modula-2, ISO Modula-2 and Modula-2 R10, while not
+    differentiating between library defined identifiers.
+
+    To select a specific dialect, a dialect option may be passed
+    or a dialect tag may be embedded into a source file.
+
+    Dialect Options:
+
+    `m2pim`
+        Select PIM Modula-2 dialect.
+    `m2iso`
+        Select ISO Modula-2 dialect.
+    `m2r10`
+        Select Modula-2 R10 dialect.
+    `objm2`
+        Select Objective Modula-2 dialect.
+
+    The PIM and ISO dialect options may be qualified with a language extension.
+
+    Language Extensions:
+
+    `+aglet`
+        Select Aglet Modula-2 extensions, available with m2iso.
+    `+gm2`
+        Select GNU Modula-2 extensions, available with m2pim.
+    `+p1`
+        Select p1 Modula-2 extensions, available with m2iso.
+    `+xds`
+        Select XDS Modula-2 extensions, available with m2iso.
+
+
+    Passing a Dialect Option via Unix Commandline Interface
+
+    Dialect options may be passed to the lexer using the `dialect` key.
+    Only one such option should be passed. If multiple dialect options are
+    passed, the first valid option is used, any subsequent options are ignored.
+
+    Examples:
+
+    `$ pygmentize -O full,dialect=m2iso -f html -o /path/to/output /path/to/input`
+        Use ISO dialect to render input to HTML output
+    `$ pygmentize -O full,dialect=m2iso+p1 -f rtf -o /path/to/output /path/to/input`
+        Use ISO dialect with p1 extensions to render input to RTF output
+
+
+    Embedding a Dialect Option within a source file
+
+    A dialect option may be embedded in a source file in form of a dialect
+    tag, a specially formatted comment that specifies a dialect option.
+
+    Dialect Tag EBNF::
+
+       dialectTag :
+           OpeningCommentDelim Prefix dialectOption ClosingCommentDelim ;
+
+       dialectOption :
+           'm2pim' | 'm2iso' | 'm2r10' | 'objm2' |
+           'm2iso+aglet' | 'm2pim+gm2' | 'm2iso+p1' | 'm2iso+xds' ;
+
+       Prefix : '!' ;
+
+       OpeningCommentDelim : '(*' ;
+
+       ClosingCommentDelim : '*)' ;
+
+    No whitespace is permitted between the tokens of a dialect tag.
+
+    In the event that a source file contains multiple dialect tags, the first
+    tag that contains a valid dialect option will be used and any subsequent
+    dialect tags will be ignored.  Ideally, a dialect tag should be placed
+    at the beginning of a source file.
+
+    An embedded dialect tag overrides a dialect option set via command line.
+
+    Examples:
+
+    ``(*!m2r10*) DEFINITION MODULE Foobar; ...``
+        Use Modula2 R10 dialect to render this source file.
+    ``(*!m2pim+gm2*) DEFINITION MODULE Bazbam; ...``
+        Use PIM dialect with GNU extensions to render this source file.
+
+
+    Algol Publication Mode:
+
+    In Algol publication mode, source text is rendered for publication of
+    algorithms in scientific papers and academic texts, following the format
+    of the Revised Algol-60 Language Report.  It is activated by passing
+    one of two corresponding styles as an option:
+
+    `algol`
+        render reserved words lowercase underline boldface
+        and builtins lowercase boldface italic
+    `algol_nu`
+        render reserved words lowercase boldface (no underlining)
+        and builtins lowercase boldface italic
+
+    The lexer automatically performs the required lowercase conversion when
+    this mode is activated.
+
+    Example:
+
+    ``$ pygmentize -O full,style=algol -f latex -o /path/to/output /path/to/input``
+        Render input file in Algol publication mode to LaTeX output.
+
+
+    Rendering Mode of First Class ADT Identifiers:
+
+    The rendering of standard library first class ADT identifiers is controlled
+    by option flag "treat_stdlib_adts_as_builtins".
+
+    When this option is turned on, standard library ADT identifiers are rendered
+    as builtins.  When it is turned off, they are rendered as ordinary library
+    identifiers.
+
+    `treat_stdlib_adts_as_builtins` (default: On)
+
+    The option is useful for dialects that support ADTs as first class objects
+    and provide ADTs in the standard library that would otherwise be built-in.
+
+    At present, only Modula-2 R10 supports library ADTs as first class objects
+    and therefore, no ADT identifiers are defined for any other dialects.
+
+    Example:
+
+    ``$ pygmentize -O full,dialect=m2r10,treat_stdlib_adts_as_builtins=Off ...``
+        Render standard library ADTs as ordinary library types.
+
+    .. versionadded:: 1.3
+
+    .. versionchanged:: 2.1
+       Added multi-dialect support.
+    """
+    name = 'Modula-2'
+    aliases = ['modula2', 'm2']
+    filenames = ['*.def', '*.mod']
+    mimetypes = ['text/x-modula2']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'whitespace': [
+            (r'\n+', Text),  # blank lines
+            (r'\s+', Text),  # whitespace
+        ],
+        'dialecttags': [
+            # PIM Dialect Tag
+            (r'\(\*!m2pim\*\)', Comment.Special),
+            # ISO Dialect Tag
+            (r'\(\*!m2iso\*\)', Comment.Special),
+            # M2R10 Dialect Tag
+            (r'\(\*!m2r10\*\)', Comment.Special),
+            # ObjM2 Dialect Tag
+            (r'\(\*!objm2\*\)', Comment.Special),
+            # Aglet Extensions Dialect Tag
+            (r'\(\*!m2iso\+aglet\*\)', Comment.Special),
+            # GNU Extensions Dialect Tag
+            (r'\(\*!m2pim\+gm2\*\)', Comment.Special),
+            # p1 Extensions Dialect Tag
+            (r'\(\*!m2iso\+p1\*\)', Comment.Special),
+            # XDS Extensions Dialect Tag
+            (r'\(\*!m2iso\+xds\*\)', Comment.Special),
+        ],
+        'identifiers': [
+            (r'([a-zA-Z_$][\w$]*)', Name),
+        ],
+        'prefixed_number_literals': [
+            #
+            # Base-2, whole number
+            (r'0b[01]+(\'[01]+)*', Number.Bin),
+            #
+            # Base-16, whole number
+            (r'0[ux][0-9A-F]+(\'[0-9A-F]+)*', Number.Hex),
+        ],
+        'plain_number_literals': [
+            #
+            # Base-10, real number with exponent
+            (r'[0-9]+(\'[0-9]+)*'  # integral part
+             r'\.[0-9]+(\'[0-9]+)*'  # fractional part
+             r'[eE][+-]?[0-9]+(\'[0-9]+)*',  # exponent
+             Number.Float),
+            #
+            # Base-10, real number without exponent
+            (r'[0-9]+(\'[0-9]+)*'  # integral part
+             r'\.[0-9]+(\'[0-9]+)*',  # fractional part
+             Number.Float),
+            #
+            # Base-10, whole number
+            (r'[0-9]+(\'[0-9]+)*', Number.Integer),
+        ],
+        'suffixed_number_literals': [
+            #
+            # Base-8, whole number
+            (r'[0-7]+B', Number.Oct),
+            #
+            # Base-8, character code
+            (r'[0-7]+C', Number.Oct),
+            #
+            # Base-16, number
+            (r'[0-9A-F]+H', Number.Hex),
+        ],
+        'string_literals': [
+            (r"'(\\\\|\\'|[^'])*'", String),  # single quoted string
+            (r'"(\\\\|\\"|[^"])*"', String),  # double quoted string
+        ],
+        'digraph_operators': [
+            # Dot Product Operator
+            (r'\*\.', Operator),
+            # Array Concatenation Operator
+            (r'\+>', Operator),  # M2R10 + ObjM2
+            # Inequality Operator
+            (r'<>', Operator),  # ISO + PIM
+            # Less-Or-Equal, Subset
+            (r'<=', Operator),
+            # Greater-Or-Equal, Superset
+            (r'>=', Operator),
+            # Identity Operator
+            (r'==', Operator),  # M2R10 + ObjM2
+            # Type Conversion Operator
+            (r'::', Operator),  # M2R10 + ObjM2
+            # Assignment Symbol
+            (r':=', Operator),
+            # Postfix Increment Mutator
+            (r'\+\+', Operator),  # M2R10 + ObjM2
+            # Postfix Decrement Mutator
+            (r'--', Operator),  # M2R10 + ObjM2
+        ],
+        'unigraph_operators': [
+            # Arithmetic Operators
+            (r'[+-]', Operator),
+            (r'[*/]', Operator),
+            # ISO 80000-2 compliant Set Difference Operator
+            (r'\\', Operator),  # M2R10 + ObjM2
+            # Relational Operators
+            (r'[=#<>]', Operator),
+            # Dereferencing Operator
+            (r'\^', Operator),
+            # Dereferencing Operator Synonym
+            (r'@', Operator),  # ISO
+            # Logical AND Operator Synonym
+            (r'&', Operator),  # PIM + ISO
+            # Logical NOT Operator Synonym
+            (r'~', Operator),  # PIM + ISO
+            # Smalltalk Message Prefix
+            (r'`', Operator),  # ObjM2
+        ],
+        'digraph_punctuation': [
+            # Range Constructor
+            (r'\.\.', Punctuation),
+            # Opening Chevron Bracket
+            (r'<<', Punctuation),  # M2R10 + ISO
+            # Closing Chevron Bracket
+            (r'>>', Punctuation),  # M2R10 + ISO
+            # Blueprint Punctuation
+            (r'->', Punctuation),  # M2R10 + ISO
+            # Distinguish |# and # in M2 R10
+            (r'\|#', Punctuation),
+            # Distinguish ## and # in M2 R10
+            (r'##', Punctuation),
+            # Distinguish |* and * in M2 R10
+            (r'\|\*', Punctuation),
+        ],
+        'unigraph_punctuation': [
+            # Common Punctuation
+            (r'[()\[\]{},.:;|]', Punctuation),
+            # Case Label Separator Synonym
+            (r'!', Punctuation),  # ISO
+            # Blueprint Punctuation
+            (r'\?', Punctuation),  # M2R10 + ObjM2
+        ],
+        'comments': [
+            # Single Line Comment
+            (r'^//.*?\n', Comment.Single),  # M2R10 + ObjM2
+            # Block Comment
+            (r'\(\*([^$].*?)\*\)', Comment.Multiline),
+            # Template Block Comment
+            (r'/\*(.*?)\*/', Comment.Multiline),  # M2R10 + ObjM2
+        ],
+        'pragmas': [
+            # ISO Style Pragmas
+            (r'<\*.*?\*>', Comment.Preproc),  # ISO, M2R10 + ObjM2
+            # Pascal Style Pragmas
+            (r'\(\*\$.*?\*\)', Comment.Preproc),  # PIM
+        ],
+        'root': [
+            include('whitespace'),
+            include('dialecttags'),
+            include('pragmas'),
+            include('comments'),
+            include('identifiers'),
+            include('suffixed_number_literals'),  # PIM + ISO
+            include('prefixed_number_literals'),  # M2R10 + ObjM2
+            include('plain_number_literals'),
+            include('string_literals'),
+            include('digraph_punctuation'),
+            include('digraph_operators'),
+            include('unigraph_punctuation'),
+            include('unigraph_operators'),
+        ]
+    }
+
+#  C o m m o n   D a t a s e t s
+
+    # Common Reserved Words Dataset
+    common_reserved_words = (
+        # 37 common reserved words
+        'AND', 'ARRAY', 'BEGIN', 'BY', 'CASE', 'CONST', 'DEFINITION', 'DIV',
+        'DO', 'ELSE', 'ELSIF', 'END', 'EXIT', 'FOR', 'FROM', 'IF',
+        'IMPLEMENTATION', 'IMPORT', 'IN', 'LOOP', 'MOD', 'MODULE', 'NOT',
+        'OF', 'OR', 'POINTER', 'PROCEDURE', 'RECORD', 'REPEAT', 'RETURN',
+        'SET', 'THEN', 'TO', 'TYPE', 'UNTIL', 'VAR', 'WHILE',
+    )
+
+    # Common Builtins Dataset
+    common_builtins = (
+        # 16 common builtins
+        'ABS', 'BOOLEAN', 'CARDINAL', 'CHAR', 'CHR', 'FALSE', 'INTEGER',
+        'LONGINT', 'LONGREAL', 'MAX', 'MIN', 'NIL', 'ODD', 'ORD', 'REAL',
+        'TRUE',
+    )
+
+    # Common Pseudo-Module Builtins Dataset
+    common_pseudo_builtins = (
+        # 4 common pseudo builtins
+        'ADDRESS', 'BYTE', 'WORD', 'ADR'
+    )
+
+#  P I M   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for PIM Modula-2
+    pim_lexemes_to_reject = (
+        '!', '`', '@', '$', '%', '?', '\\', '==', '++', '--', '::', '*.',
+        '+>', '->', '<<', '>>', '|#', '##',
+    )
+
+    # PIM Modula-2 Additional Reserved Words Dataset
+    pim_additional_reserved_words = (
+        # 3 additional reserved words
+        'EXPORT', 'QUALIFIED', 'WITH',
+    )
+
+    # PIM Modula-2 Additional Builtins Dataset
+    pim_additional_builtins = (
+        # 16 additional builtins
+        'BITSET', 'CAP', 'DEC', 'DISPOSE', 'EXCL', 'FLOAT', 'HALT', 'HIGH',
+        'INC', 'INCL', 'NEW', 'NIL', 'PROC', 'SIZE', 'TRUNC', 'VAL',
+    )
+
+    # PIM Modula-2 Additional Pseudo-Module Builtins Dataset
+    pim_additional_pseudo_builtins = (
+        # 5 additional pseudo builtins
+        'SYSTEM', 'PROCESS', 'TSIZE', 'NEWPROCESS', 'TRANSFER',
+    )
+
+#  I S O   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for ISO Modula-2
+    iso_lexemes_to_reject = (
+        '`', '$', '%', '?', '\\', '==', '++', '--', '::', '*.', '+>', '->',
+        '<<', '>>', '|#', '##',
+    )
+
+    # ISO Modula-2 Additional Reserved Words Dataset
+    iso_additional_reserved_words = (
+        # 9 additional reserved words (ISO 10514-1)
+        'EXCEPT', 'EXPORT', 'FINALLY', 'FORWARD', 'PACKEDSET', 'QUALIFIED',
+        'REM', 'RETRY', 'WITH',
+        # 10 additional reserved words (ISO 10514-2 & ISO 10514-3)
+        'ABSTRACT', 'AS', 'CLASS', 'GUARD', 'INHERIT', 'OVERRIDE', 'READONLY',
+        'REVEAL', 'TRACED', 'UNSAFEGUARDED',
+    )
+
+    # ISO Modula-2 Additional Builtins Dataset
+    iso_additional_builtins = (
+        # 26 additional builtins (ISO 10514-1)
+        'BITSET', 'CAP', 'CMPLX', 'COMPLEX', 'DEC', 'DISPOSE', 'EXCL', 'FLOAT',
+        'HALT', 'HIGH', 'IM', 'INC', 'INCL', 'INT', 'INTERRUPTIBLE',  'LENGTH',
+        'LFLOAT', 'LONGCOMPLEX', 'NEW', 'PROC', 'PROTECTION', 'RE', 'SIZE',
+        'TRUNC', 'UNINTERRUBTIBLE', 'VAL',
+        # 5 additional builtins (ISO 10514-2 & ISO 10514-3)
+        'CREATE', 'DESTROY', 'EMPTY', 'ISMEMBER', 'SELF',
+    )
+
+    # ISO Modula-2 Additional Pseudo-Module Builtins Dataset
+    iso_additional_pseudo_builtins = (
+        # 14 additional builtins (SYSTEM)
+        'SYSTEM', 'BITSPERLOC', 'LOCSPERBYTE', 'LOCSPERWORD', 'LOC',
+        'ADDADR', 'SUBADR', 'DIFADR', 'MAKEADR', 'ADR',
+        'ROTATE', 'SHIFT', 'CAST', 'TSIZE',
+        # 13 additional builtins (COROUTINES)
+        'COROUTINES', 'ATTACH', 'COROUTINE', 'CURRENT', 'DETACH', 'HANDLER',
+        'INTERRUPTSOURCE', 'IOTRANSFER', 'IsATTACHED', 'LISTEN',
+        'NEWCOROUTINE', 'PROT', 'TRANSFER',
+        # 9 additional builtins (EXCEPTIONS)
+        'EXCEPTIONS', 'AllocateSource', 'CurrentNumber', 'ExceptionNumber',
+        'ExceptionSource', 'GetMessage', 'IsCurrentSource',
+        'IsExceptionalExecution', 'RAISE',
+        # 3 additional builtins (TERMINATION)
+        'TERMINATION', 'IsTerminating', 'HasHalted',
+        # 4 additional builtins (M2EXCEPTION)
+        'M2EXCEPTION', 'M2Exceptions', 'M2Exception', 'IsM2Exception',
+        'indexException', 'rangeException', 'caseSelectException',
+        'invalidLocation', 'functionException', 'wholeValueException',
+        'wholeDivException', 'realValueException', 'realDivException',
+        'complexValueException', 'complexDivException', 'protException',
+        'sysException', 'coException', 'exException',
+    )
+
+#  M o d u l a - 2   R 1 0   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for Modula-2 R10
+    m2r10_lexemes_to_reject = (
+        '!', '`', '@', '$', '%', '&', '<>',
+    )
+
+    # Modula-2 R10 reserved words in addition to the common set
+    m2r10_additional_reserved_words = (
+        # 12 additional reserved words
+        'ALIAS', 'ARGLIST', 'BLUEPRINT', 'COPY', 'GENLIB', 'INDETERMINATE',
+        'NEW', 'NONE', 'OPAQUE', 'REFERENTIAL', 'RELEASE', 'RETAIN',
+        # 2 additional reserved words with symbolic assembly option
+        'ASM', 'REG',
+    )
+
+    # Modula-2 R10 builtins in addition to the common set
+    m2r10_additional_builtins = (
+        # 26 additional builtins
+        'CARDINAL', 'COUNT', 'EMPTY', 'EXISTS', 'INSERT', 'LENGTH', 'LONGCARD',
+        'OCTET', 'PTR', 'PRED', 'READ', 'READNEW', 'REMOVE', 'RETRIEVE', 'SORT',
+        'STORE', 'SUBSET', 'SUCC', 'TLIMIT', 'TMAX', 'TMIN', 'TRUE', 'TSIZE',
+        'UNICHAR', 'WRITE', 'WRITEF',
+    )
+
+    # Modula-2 R10 Additional Pseudo-Module Builtins Dataset
+    m2r10_additional_pseudo_builtins = (
+        # 13 additional builtins (TPROPERTIES)
+        'TPROPERTIES', 'PROPERTY', 'LITERAL', 'TPROPERTY', 'TLITERAL',
+        'TBUILTIN', 'TDYN', 'TREFC', 'TNIL', 'TBASE', 'TPRECISION',
+        'TMAXEXP', 'TMINEXP',
+        # 4 additional builtins (CONVERSION)
+        'CONVERSION', 'TSXFSIZE', 'SXF', 'VAL',
+        # 35 additional builtins (UNSAFE)
+        'UNSAFE', 'CAST', 'INTRINSIC', 'AVAIL', 'ADD', 'SUB', 'ADDC', 'SUBC',
+        'FETCHADD', 'FETCHSUB', 'SHL', 'SHR', 'ASHR', 'ROTL', 'ROTR', 'ROTLC',
+        'ROTRC', 'BWNOT', 'BWAND', 'BWOR', 'BWXOR', 'BWNAND', 'BWNOR',
+        'SETBIT', 'TESTBIT', 'LSBIT', 'MSBIT', 'CSBITS', 'BAIL', 'HALT',
+        'TODO', 'FFI', 'ADDR', 'VARGLIST', 'VARGC',
+        # 11 additional builtins (ATOMIC)
+        'ATOMIC', 'INTRINSIC', 'AVAIL', 'SWAP', 'CAS', 'INC', 'DEC', 'BWAND',
+        'BWNAND', 'BWOR', 'BWXOR',
+        # 7 additional builtins (COMPILER)
+        'COMPILER', 'DEBUG', 'MODNAME', 'PROCNAME', 'LINENUM', 'DEFAULT',
+        'HASH',
+        # 5 additional builtins (ASSEMBLER)
+        'ASSEMBLER', 'REGISTER', 'SETREG', 'GETREG', 'CODE',
+    )
+
+#  O b j e c t i v e   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for Objective Modula-2
+    objm2_lexemes_to_reject = (
+        '!', '$', '%', '&', '<>',
+    )
+
+    # Objective Modula-2 Extensions
+    # reserved words in addition to Modula-2 R10
+    objm2_additional_reserved_words = (
+        # 16 additional reserved words
+        'BYCOPY', 'BYREF', 'CLASS', 'CONTINUE', 'CRITICAL', 'INOUT', 'METHOD',
+        'ON', 'OPTIONAL', 'OUT', 'PRIVATE', 'PROTECTED', 'PROTOCOL', 'PUBLIC',
+        'SUPER', 'TRY',
+    )
+
+    # Objective Modula-2 Extensions
+    # builtins in addition to Modula-2 R10
+    objm2_additional_builtins = (
+        # 3 additional builtins
+        'OBJECT', 'NO', 'YES',
+    )
+
+    # Objective Modula-2 Extensions
+    # pseudo-module builtins in addition to Modula-2 R10
+    objm2_additional_pseudo_builtins = (
+        # None
+    )
+
+#  A g l e t   M o d u l a - 2   D a t a s e t s
+
+    # Aglet Extensions
+    # reserved words in addition to ISO Modula-2
+    aglet_additional_reserved_words = (
+        # None
+    )
+
+    # Aglet Extensions
+    # builtins in addition to ISO Modula-2
+    aglet_additional_builtins = (
+        # 9 additional builtins
+        'BITSET8', 'BITSET16', 'BITSET32', 'CARDINAL8', 'CARDINAL16',
+        'CARDINAL32', 'INTEGER8', 'INTEGER16', 'INTEGER32',
+    )
+
+    # Aglet Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    aglet_additional_pseudo_builtins = (
+        # None
+    )
+
+#  G N U   M o d u l a - 2   D a t a s e t s
+
+    # GNU Extensions
+    # reserved words in addition to PIM Modula-2
+    gm2_additional_reserved_words = (
+        # 10 additional reserved words
+        'ASM', '__ATTRIBUTE__', '__BUILTIN__', '__COLUMN__', '__DATE__',
+        '__FILE__', '__FUNCTION__', '__LINE__', '__MODULE__', 'VOLATILE',
+    )
+
+    # GNU Extensions
+    # builtins in addition to PIM Modula-2
+    gm2_additional_builtins = (
+        # 21 additional builtins
+        'BITSET8', 'BITSET16', 'BITSET32', 'CARDINAL8', 'CARDINAL16',
+        'CARDINAL32', 'CARDINAL64', 'COMPLEX32', 'COMPLEX64', 'COMPLEX96',
+        'COMPLEX128', 'INTEGER8', 'INTEGER16', 'INTEGER32', 'INTEGER64',
+        'REAL8', 'REAL16', 'REAL32', 'REAL96', 'REAL128', 'THROW',
+    )
+
+    # GNU Extensions
+    # pseudo-module builtins in addition to PIM Modula-2
+    gm2_additional_pseudo_builtins = (
+        # None
+    )
+
+#  p 1   M o d u l a - 2   D a t a s e t s
+
+    # p1 Extensions
+    # reserved words in addition to ISO Modula-2
+    p1_additional_reserved_words = (
+        # None
+    )
+
+    # p1 Extensions
+    # builtins in addition to ISO Modula-2
+    p1_additional_builtins = (
+        # None
+    )
+
+    # p1 Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    p1_additional_pseudo_builtins = (
+        # 1 additional builtin
+        'BCD',
+    )
+
+#  X D S   M o d u l a - 2   D a t a s e t s
+
+    # XDS Extensions
+    # reserved words in addition to ISO Modula-2
+    xds_additional_reserved_words = (
+        # 1 additional reserved word
+        'SEQ',
+    )
+
+    # XDS Extensions
+    # builtins in addition to ISO Modula-2
+    xds_additional_builtins = (
+        # 9 additional builtins
+        'ASH', 'ASSERT', 'DIFFADR_TYPE', 'ENTIER', 'INDEX', 'LEN',
+        'LONGCARD', 'SHORTCARD', 'SHORTINT',
+    )
+
+    # XDS Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    xds_additional_pseudo_builtins = (
+        # 22 additional builtins (SYSTEM)
+        'PROCESS', 'NEWPROCESS', 'BOOL8', 'BOOL16', 'BOOL32', 'CARD8',
+        'CARD16', 'CARD32', 'INT8', 'INT16', 'INT32', 'REF', 'MOVE',
+        'FILL', 'GET', 'PUT', 'CC', 'int', 'unsigned', 'size_t', 'void'
+        # 3 additional builtins (COMPILER)
+        'COMPILER', 'OPTION', 'EQUATION'
+    )
+
+#  P I M   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # PIM Modula-2 Standard Library Modules Dataset
+    pim_stdlib_module_identifiers = (
+        'Terminal', 'FileSystem', 'InOut', 'RealInOut', 'MathLib0', 'Storage',
+    )
+
+    # PIM Modula-2 Standard Library Types Dataset
+    pim_stdlib_type_identifiers = (
+        'Flag', 'FlagSet', 'Response', 'Command', 'Lock', 'Permission',
+        'MediumType', 'File', 'FileProc', 'DirectoryProc', 'FileCommand',
+        'DirectoryCommand',
+    )
+
+    # PIM Modula-2 Standard Library Procedures Dataset
+    pim_stdlib_proc_identifiers = (
+        'Read', 'BusyRead', 'ReadAgain', 'Write', 'WriteString', 'WriteLn',
+        'Create', 'Lookup', 'Close', 'Delete', 'Rename', 'SetRead', 'SetWrite',
+        'SetModify', 'SetOpen', 'Doio', 'SetPos', 'GetPos', 'Length', 'Reset',
+        'Again', 'ReadWord', 'WriteWord', 'ReadChar', 'WriteChar',
+        'CreateMedium', 'DeleteMedium', 'AssignName', 'DeassignName',
+        'ReadMedium', 'LookupMedium', 'OpenInput', 'OpenOutput', 'CloseInput',
+        'CloseOutput', 'ReadString', 'ReadInt', 'ReadCard', 'ReadWrd',
+        'WriteInt', 'WriteCard', 'WriteOct', 'WriteHex', 'WriteWrd',
+        'ReadReal', 'WriteReal', 'WriteFixPt', 'WriteRealOct', 'sqrt', 'exp',
+        'ln', 'sin', 'cos', 'arctan', 'entier', 'ALLOCATE', 'DEALLOCATE',
+    )
+
+    # PIM Modula-2 Standard Library Variables Dataset
+    pim_stdlib_var_identifiers = (
+        'Done', 'termCH', 'in', 'out'
+    )
+
+    # PIM Modula-2 Standard Library Constants Dataset
+    pim_stdlib_const_identifiers = (
+        'EOL',
+    )
+
+#  I S O   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # ISO Modula-2 Standard Library Modules Dataset
+    iso_stdlib_module_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Types Dataset
+    iso_stdlib_type_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Procedures Dataset
+    iso_stdlib_proc_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Variables Dataset
+    iso_stdlib_var_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Constants Dataset
+    iso_stdlib_const_identifiers = (
+        # TO DO
+    )
+
+#  M 2   R 1 0   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # Modula-2 R10 Standard Library ADTs Dataset
+    m2r10_stdlib_adt_identifiers = (
+        'BCD', 'LONGBCD', 'BITSET', 'SHORTBITSET', 'LONGBITSET',
+        'LONGLONGBITSET', 'COMPLEX', 'LONGCOMPLEX', 'SHORTCARD', 'LONGLONGCARD',
+        'SHORTINT', 'LONGLONGINT', 'POSINT', 'SHORTPOSINT', 'LONGPOSINT',
+        'LONGLONGPOSINT', 'BITSET8', 'BITSET16', 'BITSET32', 'BITSET64',
+        'BITSET128', 'BS8', 'BS16', 'BS32', 'BS64', 'BS128', 'CARDINAL8',
+        'CARDINAL16', 'CARDINAL32', 'CARDINAL64', 'CARDINAL128', 'CARD8',
+        'CARD16', 'CARD32', 'CARD64', 'CARD128', 'INTEGER8', 'INTEGER16',
+        'INTEGER32', 'INTEGER64', 'INTEGER128', 'INT8', 'INT16', 'INT32',
+        'INT64', 'INT128', 'STRING', 'UNISTRING',
+    )
+
+    # Modula-2 R10 Standard Library Blueprints Dataset
+    m2r10_stdlib_blueprint_identifiers = (
+        'ProtoRoot', 'ProtoComputational', 'ProtoNumeric', 'ProtoScalar',
+        'ProtoNonScalar', 'ProtoCardinal', 'ProtoInteger', 'ProtoReal',
+        'ProtoComplex', 'ProtoVector', 'ProtoTuple', 'ProtoCompArray',
+        'ProtoCollection', 'ProtoStaticArray', 'ProtoStaticSet',
+        'ProtoStaticString', 'ProtoArray', 'ProtoString', 'ProtoSet',
+        'ProtoMultiSet', 'ProtoDictionary', 'ProtoMultiDict', 'ProtoExtension',
+        'ProtoIO', 'ProtoCardMath', 'ProtoIntMath', 'ProtoRealMath',
+    )
+
+    # Modula-2 R10 Standard Library Modules Dataset
+    m2r10_stdlib_module_identifiers = (
+        'ASCII', 'BooleanIO', 'CharIO', 'UnicharIO', 'OctetIO',
+        'CardinalIO', 'LongCardIO', 'IntegerIO', 'LongIntIO', 'RealIO',
+        'LongRealIO', 'BCDIO', 'LongBCDIO', 'CardMath', 'LongCardMath',
+        'IntMath', 'LongIntMath', 'RealMath', 'LongRealMath', 'BCDMath',
+        'LongBCDMath', 'FileIO', 'FileSystem', 'Storage', 'IOSupport',
+    )
+
+    # Modula-2 R10 Standard Library Types Dataset
+    m2r10_stdlib_type_identifiers = (
+        'File', 'Status',
+        # TO BE COMPLETED
+    )
+
+    # Modula-2 R10 Standard Library Procedures Dataset
+    m2r10_stdlib_proc_identifiers = (
+        'ALLOCATE', 'DEALLOCATE', 'SIZE',
+        # TO BE COMPLETED
+    )
+
+    # Modula-2 R10 Standard Library Variables Dataset
+    m2r10_stdlib_var_identifiers = (
+        'stdIn', 'stdOut', 'stdErr',
+    )
+
+    # Modula-2 R10 Standard Library Constants Dataset
+    m2r10_stdlib_const_identifiers = (
+        'pi', 'tau',
+    )
+
+#  D i a l e c t s
+
+    # Dialect modes
+    dialects = (
+        'unknown',
+        'm2pim', 'm2iso', 'm2r10', 'objm2',
+        'm2iso+aglet', 'm2pim+gm2', 'm2iso+p1', 'm2iso+xds',
+    )
+
+#   D a t a b a s e s
+
+    # Lexemes to Mark as Errors Database
+    lexemes_to_reject_db = {
+        # Lexemes to reject for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Lexemes to reject for PIM Modula-2
+        'm2pim': (
+            pim_lexemes_to_reject,
+        ),
+        # Lexemes to reject for ISO Modula-2
+        'm2iso': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Modula-2 R10
+        'm2r10': (
+            m2r10_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Objective Modula-2
+        'objm2': (
+            objm2_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for GNU Modula-2
+        'm2pim+gm2': (
+            pim_lexemes_to_reject,
+        ),
+        # Lexemes to reject for p1 Modula-2
+        'm2iso+p1': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for XDS Modula-2
+        'm2iso+xds': (
+            iso_lexemes_to_reject,
+        ),
+    }
+
+    # Reserved Words Database
+    reserved_words_db = {
+        # Reserved words for unknown dialect
+        'unknown': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+            iso_additional_reserved_words,
+            m2r10_additional_reserved_words,
+        ),
+
+        # Reserved words for PIM Modula-2
+        'm2pim': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+        ),
+
+        # Reserved words for Modula-2 R10
+        'm2iso': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+        ),
+
+        # Reserved words for ISO Modula-2
+        'm2r10': (
+            common_reserved_words,
+            m2r10_additional_reserved_words,
+        ),
+
+        # Reserved words for Objective Modula-2
+        'objm2': (
+            common_reserved_words,
+            m2r10_additional_reserved_words,
+            objm2_additional_reserved_words,
+        ),
+
+        # Reserved words for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            aglet_additional_reserved_words,
+        ),
+
+        # Reserved words for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+            gm2_additional_reserved_words,
+        ),
+
+        # Reserved words for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            p1_additional_reserved_words,
+        ),
+
+        # Reserved words for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            xds_additional_reserved_words,
+        ),
+    }
+
+    # Builtins Database
+    builtins_db = {
+        # Builtins for unknown dialect
+        'unknown': (
+            common_builtins,
+            pim_additional_builtins,
+            iso_additional_builtins,
+            m2r10_additional_builtins,
+        ),
+
+        # Builtins for PIM Modula-2
+        'm2pim': (
+            common_builtins,
+            pim_additional_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2iso': (
+            common_builtins,
+            iso_additional_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2r10': (
+            common_builtins,
+            m2r10_additional_builtins,
+        ),
+
+        # Builtins for Objective Modula-2
+        'objm2': (
+            common_builtins,
+            m2r10_additional_builtins,
+            objm2_additional_builtins,
+        ),
+
+        # Builtins for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_builtins,
+            iso_additional_builtins,
+            aglet_additional_builtins,
+        ),
+
+        # Builtins for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_builtins,
+            pim_additional_builtins,
+            gm2_additional_builtins,
+        ),
+
+        # Builtins for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_builtins,
+            iso_additional_builtins,
+            p1_additional_builtins,
+        ),
+
+        # Builtins for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_builtins,
+            iso_additional_builtins,
+            xds_additional_builtins,
+        ),
+    }
+
+    # Pseudo-Module Builtins Database
+    pseudo_builtins_db = {
+        # Builtins for unknown dialect
+        'unknown': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+        ),
+
+        # Builtins for PIM Modula-2
+        'm2pim': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2iso': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2r10': (
+            common_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+        ),
+
+        # Builtins for Objective Modula-2
+        'objm2': (
+            common_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+            objm2_additional_pseudo_builtins,
+        ),
+
+        # Builtins for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            aglet_additional_pseudo_builtins,
+        ),
+
+        # Builtins for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+            gm2_additional_pseudo_builtins,
+        ),
+
+        # Builtins for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            p1_additional_pseudo_builtins,
+        ),
+
+        # Builtins for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            xds_additional_pseudo_builtins,
+        ),
+    }
+
+    # Standard Library ADTs Database
+    stdlib_adts_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library ADTs for PIM Modula-2
+        'm2pim': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for ISO Modula-2
+        'm2iso': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library ADTs for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library ADTs for Aglet Modula-2
+        'm2iso+aglet': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for GNU Modula-2
+        'm2pim+gm2': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for p1 Modula-2
+        'm2iso+p1': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for XDS Modula-2
+        'm2iso+xds': (
+            # No first class library types
+        ),
+    }
+
+    # Standard Library Modules Database
+    stdlib_modules_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Modules for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_blueprint_identifiers,
+            m2r10_stdlib_module_identifiers,
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library Modules for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_blueprint_identifiers,
+            m2r10_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_module_identifiers,
+        ),
+    }
+
+    # Standard Library Types Database
+    stdlib_types_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Types for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_type_identifiers,
+        ),
+    }
+
+    # Standard Library Procedures Database
+    stdlib_procedures_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Procedures for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_proc_identifiers,
+        ),
+    }
+
+    # Standard Library Variables Database
+    stdlib_variables_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Variables for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_var_identifiers,
+        ),
+    }
+
+    # Standard Library Constants Database
+    stdlib_constants_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Constants for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_const_identifiers,
+        ),
+    }
+
+#   M e t h o d s
+
+    # initialise a lexer instance
+    def __init__(self, **options):
+        #
+        # check dialect options
+        #
+        dialects = get_list_opt(options, 'dialect', [])
+        #
+        for dialect_option in dialects:
+            if dialect_option in self.dialects[1:-1]:
+                # valid dialect option found
+                self.set_dialect(dialect_option)
+                break
+        #
+        # Fallback Mode (DEFAULT)
+        else:
+            # no valid dialect option
+            self.set_dialect('unknown')
+        #
+        self.dialect_set_by_tag = False
+        #
+        # check style options
+        #
+        styles = get_list_opt(options, 'style', [])
+        #
+        # use lowercase mode for Algol style
+        if 'algol' in styles or 'algol_nu' in styles:
+            self.algol_publication_mode = True
+        else:
+            self.algol_publication_mode = False
+        #
+        # Check option flags
+        #
+        self.treat_stdlib_adts_as_builtins = get_bool_opt(
+            options, 'treat_stdlib_adts_as_builtins', True)
+        #
+        # call superclass initialiser
+        RegexLexer.__init__(self, **options)
+
+    # Set lexer to a specified dialect
+    def set_dialect(self, dialect_id):
+        #
+        # if __debug__:
+        #    print 'entered set_dialect with arg: ', dialect_id
+        #
+        # check dialect name against known dialects
+        if dialect_id not in self.dialects:
+            dialect = 'unknown'  # default
+        else:
+            dialect = dialect_id
+        #
+        # compose lexemes to reject set
+        lexemes_to_reject_set = set()
+        # add each list of reject lexemes for this dialect
+        for list in self.lexemes_to_reject_db[dialect]:
+            lexemes_to_reject_set.update(set(list))
+        #
+        # compose reserved words set
+        reswords_set = set()
+        # add each list of reserved words for this dialect
+        for list in self.reserved_words_db[dialect]:
+            reswords_set.update(set(list))
+        #
+        # compose builtins set
+        builtins_set = set()
+        # add each list of builtins for this dialect excluding reserved words
+        for list in self.builtins_db[dialect]:
+            builtins_set.update(set(list).difference(reswords_set))
+        #
+        # compose pseudo-builtins set
+        pseudo_builtins_set = set()
+        # add each list of builtins for this dialect excluding reserved words
+        for list in self.pseudo_builtins_db[dialect]:
+            pseudo_builtins_set.update(set(list).difference(reswords_set))
+        #
+        # compose ADTs set
+        adts_set = set()
+        # add each list of ADTs for this dialect excluding reserved words
+        for list in self.stdlib_adts_db[dialect]:
+            adts_set.update(set(list).difference(reswords_set))
+        #
+        # compose modules set
+        modules_set = set()
+        # add each list of builtins for this dialect excluding builtins
+        for list in self.stdlib_modules_db[dialect]:
+            modules_set.update(set(list).difference(builtins_set))
+        #
+        # compose types set
+        types_set = set()
+        # add each list of types for this dialect excluding builtins
+        for list in self.stdlib_types_db[dialect]:
+            types_set.update(set(list).difference(builtins_set))
+        #
+        # compose procedures set
+        procedures_set = set()
+        # add each list of procedures for this dialect excluding builtins
+        for list in self.stdlib_procedures_db[dialect]:
+            procedures_set.update(set(list).difference(builtins_set))
+        #
+        # compose variables set
+        variables_set = set()
+        # add each list of variables for this dialect excluding builtins
+        for list in self.stdlib_variables_db[dialect]:
+            variables_set.update(set(list).difference(builtins_set))
+        #
+        # compose constants set
+        constants_set = set()
+        # add each list of constants for this dialect excluding builtins
+        for list in self.stdlib_constants_db[dialect]:
+            constants_set.update(set(list).difference(builtins_set))
+        #
+        # update lexer state
+        self.dialect = dialect
+        self.lexemes_to_reject = lexemes_to_reject_set
+        self.reserved_words = reswords_set
+        self.builtins = builtins_set
+        self.pseudo_builtins = pseudo_builtins_set
+        self.adts = adts_set
+        self.modules = modules_set
+        self.types = types_set
+        self.procedures = procedures_set
+        self.variables = variables_set
+        self.constants = constants_set
+        #
+        # if __debug__:
+        #    print 'exiting set_dialect'
+        #    print ' self.dialect: ', self.dialect
+        #    print ' self.lexemes_to_reject: ', self.lexemes_to_reject
+        #    print ' self.reserved_words: ', self.reserved_words
+        #    print ' self.builtins: ', self.builtins
+        #    print ' self.pseudo_builtins: ', self.pseudo_builtins
+        #    print ' self.adts: ', self.adts
+        #    print ' self.modules: ', self.modules
+        #    print ' self.types: ', self.types
+        #    print ' self.procedures: ', self.procedures
+        #    print ' self.variables: ', self.variables
+        #    print ' self.types: ', self.types
+        #    print ' self.constants: ', self.constants
+
+    # Extracts a dialect name from a dialect tag comment string  and checks
+    # the extracted name against known dialects.  If a match is found,  the
+    # matching name is returned, otherwise dialect id 'unknown' is returned
+    def get_dialect_from_dialect_tag(self, dialect_tag):
+        #
+        # if __debug__:
+        #    print 'entered get_dialect_from_dialect_tag with arg: ', dialect_tag
+        #
+        # constants
+        left_tag_delim = '(*!'
+        right_tag_delim = '*)'
+        left_tag_delim_len = len(left_tag_delim)
+        right_tag_delim_len = len(right_tag_delim)
+        indicator_start = left_tag_delim_len
+        indicator_end = -(right_tag_delim_len)
+        #
+        # check comment string for dialect indicator
+        if len(dialect_tag) > (left_tag_delim_len + right_tag_delim_len) \
+           and dialect_tag.startswith(left_tag_delim) \
+           and dialect_tag.endswith(right_tag_delim):
+            #
+            # if __debug__:
+            #    print 'dialect tag found'
+            #
+            # extract dialect indicator
+            indicator = dialect_tag[indicator_start:indicator_end]
+            #
+            # if __debug__:
+            #    print 'extracted: ', indicator
+            #
+            # check against known dialects
+            for index in range(1, len(self.dialects)):
+                #
+                # if __debug__:
+                #    print 'dialects[', index, ']: ', self.dialects[index]
+                #
+                if indicator == self.dialects[index]:
+                    #
+                    # if __debug__:
+                    #    print 'matching dialect found'
+                    #
+                    # indicator matches known dialect
+                    return indicator
+            else:
+                # indicator does not match any dialect
+                return 'unknown'  # default
+        else:
+            # invalid indicator string
+            return 'unknown'  # default
+
+    # intercept the token stream, modify token attributes and return them
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text):
+            #
+            # check for dialect tag if dialect has not been set by tag
+            if not self.dialect_set_by_tag and token == Comment.Special:
+                indicated_dialect = self.get_dialect_from_dialect_tag(value)
+                if indicated_dialect != 'unknown':
+                    # token is a dialect indicator
+                    # reset reserved words and builtins
+                    self.set_dialect(indicated_dialect)
+                    self.dialect_set_by_tag = True
+            #
+            # check for reserved words, predefined and stdlib identifiers
+            if token is Name:
+                if value in self.reserved_words:
+                    token = Keyword.Reserved
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.builtins:
+                    token = Name.Builtin
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.pseudo_builtins:
+                    token = Name.Builtin.Pseudo
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.adts:
+                    if not self.treat_stdlib_adts_as_builtins:
+                        token = Name.Namespace
+                    else:
+                        token = Name.Builtin.Pseudo
+                        if self.algol_publication_mode:
+                            value = value.lower()
+                #
+                elif value in self.modules:
+                    token = Name.Namespace
+                #
+                elif value in self.types:
+                    token = Name.Class
+                #
+                elif value in self.procedures:
+                    token = Name.Function
+                #
+                elif value in self.variables:
+                    token = Name.Variable
+                #
+                elif value in self.constants:
+                    token = Name.Constant
+            #
+            elif token in Number:
+                #
+                # mark prefix number literals as error for PIM and ISO dialects
+                if self.dialect not in ('unknown', 'm2r10', 'objm2'):
+                    if "'" in value or value[0:2] in ('0b', '0x', '0u'):
+                        token = Error
+                #
+                elif self.dialect in ('m2r10', 'objm2'):
+                    # mark base-8 number literals as errors for M2 R10 and ObjM2
+                    if token is Number.Oct:
+                        token = Error
+                    # mark suffix base-16 literals as errors for M2 R10 and ObjM2
+                    elif token is Number.Hex and 'H' in value:
+                        token = Error
+                    # mark real numbers with E as errors for M2 R10 and ObjM2
+                    elif token is Number.Float and 'E' in value:
+                        token = Error
+            #
+            elif token in Comment:
+                #
+                # mark single line comment as error for PIM and ISO dialects
+                if token is Comment.Single:
+                    if self.dialect not in ('unknown', 'm2r10', 'objm2'):
+                        token = Error
+                #
+                if token is Comment.Preproc:
+                    # mark ISO pragma as error for PIM dialects
+                    if value.startswith('<*') and \
+                       self.dialect.startswith('m2pim'):
+                        token = Error
+                    # mark PIM pragma as comment for other dialects
+                    elif value.startswith('(*$') and \
+                            self.dialect != 'unknown' and \
+                            not self.dialect.startswith('m2pim'):
+                        token = Comment.Multiline
+            #
+            else:  # token is neither Name nor Comment
+                #
+                # mark lexemes matching the dialect's error token set as errors
+                if value in self.lexemes_to_reject:
+                    token = Error
+                #
+                # substitute lexemes when in Algol mode
+                if self.algol_publication_mode:
+                    if value == '#':
+                        value = u'≠'
+                    elif value == '<=':
+                        value = u'≤'
+                    elif value == '>=':
+                        value = u'≥'
+                    elif value == '==':
+                        value = u'≡'
+                    elif value == '*.':
+                        value = u'•'
+
+            # return result
+            yield index, token, value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/pascal.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/pascal.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/pascal.py	(revision 1126)
@@ -0,0 +1,644 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.pascal
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Pascal family languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, words, \
+    using, this, default
+from pygments.util import get_bool_opt, get_list_opt
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+from pygments.scanner import Scanner
+
+# compatibility import
+from pygments.lexers.modula2 import Modula2Lexer
+
+__all__ = ['DelphiLexer', 'AdaLexer']
+
+
+class DelphiLexer(Lexer):
+    """
+    For `Delphi <http://www.borland.com/delphi/>`_ (Borland Object Pascal),
+    Turbo Pascal and Free Pascal source code.
+
+    Additional options accepted:
+
+    `turbopascal`
+        Highlight Turbo Pascal specific keywords (default: ``True``).
+    `delphi`
+        Highlight Borland Delphi specific keywords (default: ``True``).
+    `freepascal`
+        Highlight Free Pascal specific keywords (default: ``True``).
+    `units`
+        A list of units that should be considered builtin, supported are
+        ``System``, ``SysUtils``, ``Classes`` and ``Math``.
+        Default is to consider all of them builtin.
+    """
+    name = 'Delphi'
+    aliases = ['delphi', 'pas', 'pascal', 'objectpascal']
+    filenames = ['*.pas', '*.dpr']
+    mimetypes = ['text/x-pascal']
+
+    TURBO_PASCAL_KEYWORDS = (
+        'absolute', 'and', 'array', 'asm', 'begin', 'break', 'case',
+        'const', 'constructor', 'continue', 'destructor', 'div', 'do',
+        'downto', 'else', 'end', 'file', 'for', 'function', 'goto',
+        'if', 'implementation', 'in', 'inherited', 'inline', 'interface',
+        'label', 'mod', 'nil', 'not', 'object', 'of', 'on', 'operator',
+        'or', 'packed', 'procedure', 'program', 'record', 'reintroduce',
+        'repeat', 'self', 'set', 'shl', 'shr', 'string', 'then', 'to',
+        'type', 'unit', 'until', 'uses', 'var', 'while', 'with', 'xor'
+    )
+
+    DELPHI_KEYWORDS = (
+        'as', 'class', 'except', 'exports', 'finalization', 'finally',
+        'initialization', 'is', 'library', 'on', 'property', 'raise',
+        'threadvar', 'try'
+    )
+
+    FREE_PASCAL_KEYWORDS = (
+        'dispose', 'exit', 'false', 'new', 'true'
+    )
+
+    BLOCK_KEYWORDS = set((
+        'begin', 'class', 'const', 'constructor', 'destructor', 'end',
+        'finalization', 'function', 'implementation', 'initialization',
+        'label', 'library', 'operator', 'procedure', 'program', 'property',
+        'record', 'threadvar', 'type', 'unit', 'uses', 'var'
+    ))
+
+    FUNCTION_MODIFIERS = set((
+        'alias', 'cdecl', 'export', 'inline', 'interrupt', 'nostackframe',
+        'pascal', 'register', 'safecall', 'softfloat', 'stdcall',
+        'varargs', 'name', 'dynamic', 'near', 'virtual', 'external',
+        'override', 'assembler'
+    ))
+
+    # XXX: those aren't global. but currently we know no way for defining
+    #      them just for the type context.
+    DIRECTIVES = set((
+        'absolute', 'abstract', 'assembler', 'cppdecl', 'default', 'far',
+        'far16', 'forward', 'index', 'oldfpccall', 'private', 'protected',
+        'published', 'public'
+    ))
+
+    BUILTIN_TYPES = set((
+        'ansichar', 'ansistring', 'bool', 'boolean', 'byte', 'bytebool',
+        'cardinal', 'char', 'comp', 'currency', 'double', 'dword',
+        'extended', 'int64', 'integer', 'iunknown', 'longbool', 'longint',
+        'longword', 'pansichar', 'pansistring', 'pbool', 'pboolean',
+        'pbyte', 'pbytearray', 'pcardinal', 'pchar', 'pcomp', 'pcurrency',
+        'pdate', 'pdatetime', 'pdouble', 'pdword', 'pextended', 'phandle',
+        'pint64', 'pinteger', 'plongint', 'plongword', 'pointer',
+        'ppointer', 'pshortint', 'pshortstring', 'psingle', 'psmallint',
+        'pstring', 'pvariant', 'pwidechar', 'pwidestring', 'pword',
+        'pwordarray', 'pwordbool', 'real', 'real48', 'shortint',
+        'shortstring', 'single', 'smallint', 'string', 'tclass', 'tdate',
+        'tdatetime', 'textfile', 'thandle', 'tobject', 'ttime', 'variant',
+        'widechar', 'widestring', 'word', 'wordbool'
+    ))
+
+    BUILTIN_UNITS = {
+        'System': (
+            'abs', 'acquireexceptionobject', 'addr', 'ansitoutf8',
+            'append', 'arctan', 'assert', 'assigned', 'assignfile',
+            'beginthread', 'blockread', 'blockwrite', 'break', 'chdir',
+            'chr', 'close', 'closefile', 'comptocurrency', 'comptodouble',
+            'concat', 'continue', 'copy', 'cos', 'dec', 'delete',
+            'dispose', 'doubletocomp', 'endthread', 'enummodules',
+            'enumresourcemodules', 'eof', 'eoln', 'erase', 'exceptaddr',
+            'exceptobject', 'exclude', 'exit', 'exp', 'filepos', 'filesize',
+            'fillchar', 'finalize', 'findclasshinstance', 'findhinstance',
+            'findresourcehinstance', 'flush', 'frac', 'freemem',
+            'get8087cw', 'getdir', 'getlasterror', 'getmem',
+            'getmemorymanager', 'getmodulefilename', 'getvariantmanager',
+            'halt', 'hi', 'high', 'inc', 'include', 'initialize', 'insert',
+            'int', 'ioresult', 'ismemorymanagerset', 'isvariantmanagerset',
+            'length', 'ln', 'lo', 'low', 'mkdir', 'move', 'new', 'odd',
+            'olestrtostring', 'olestrtostrvar', 'ord', 'paramcount',
+            'paramstr', 'pi', 'pos', 'pred', 'ptr', 'pucs4chars', 'random',
+            'randomize', 'read', 'readln', 'reallocmem',
+            'releaseexceptionobject', 'rename', 'reset', 'rewrite', 'rmdir',
+            'round', 'runerror', 'seek', 'seekeof', 'seekeoln',
+            'set8087cw', 'setlength', 'setlinebreakstyle',
+            'setmemorymanager', 'setstring', 'settextbuf',
+            'setvariantmanager', 'sin', 'sizeof', 'slice', 'sqr', 'sqrt',
+            'str', 'stringofchar', 'stringtoolestr', 'stringtowidechar',
+            'succ', 'swap', 'trunc', 'truncate', 'typeinfo',
+            'ucs4stringtowidestring', 'unicodetoutf8', 'uniquestring',
+            'upcase', 'utf8decode', 'utf8encode', 'utf8toansi',
+            'utf8tounicode', 'val', 'vararrayredim', 'varclear',
+            'widecharlentostring', 'widecharlentostrvar',
+            'widechartostring', 'widechartostrvar',
+            'widestringtoucs4string', 'write', 'writeln'
+        ),
+        'SysUtils': (
+            'abort', 'addexitproc', 'addterminateproc', 'adjustlinebreaks',
+            'allocmem', 'ansicomparefilename', 'ansicomparestr',
+            'ansicomparetext', 'ansidequotedstr', 'ansiextractquotedstr',
+            'ansilastchar', 'ansilowercase', 'ansilowercasefilename',
+            'ansipos', 'ansiquotedstr', 'ansisamestr', 'ansisametext',
+            'ansistrcomp', 'ansistricomp', 'ansistrlastchar', 'ansistrlcomp',
+            'ansistrlicomp', 'ansistrlower', 'ansistrpos', 'ansistrrscan',
+            'ansistrscan', 'ansistrupper', 'ansiuppercase',
+            'ansiuppercasefilename', 'appendstr', 'assignstr', 'beep',
+            'booltostr', 'bytetocharindex', 'bytetocharlen', 'bytetype',
+            'callterminateprocs', 'changefileext', 'charlength',
+            'chartobyteindex', 'chartobytelen', 'comparemem', 'comparestr',
+            'comparetext', 'createdir', 'createguid', 'currentyear',
+            'currtostr', 'currtostrf', 'date', 'datetimetofiledate',
+            'datetimetostr', 'datetimetostring', 'datetimetosystemtime',
+            'datetimetotimestamp', 'datetostr', 'dayofweek', 'decodedate',
+            'decodedatefully', 'decodetime', 'deletefile', 'directoryexists',
+            'diskfree', 'disksize', 'disposestr', 'encodedate', 'encodetime',
+            'exceptionerrormessage', 'excludetrailingbackslash',
+            'excludetrailingpathdelimiter', 'expandfilename',
+            'expandfilenamecase', 'expanduncfilename', 'extractfiledir',
+            'extractfiledrive', 'extractfileext', 'extractfilename',
+            'extractfilepath', 'extractrelativepath', 'extractshortpathname',
+            'fileage', 'fileclose', 'filecreate', 'filedatetodatetime',
+            'fileexists', 'filegetattr', 'filegetdate', 'fileisreadonly',
+            'fileopen', 'fileread', 'filesearch', 'fileseek', 'filesetattr',
+            'filesetdate', 'filesetreadonly', 'filewrite', 'finalizepackage',
+            'findclose', 'findcmdlineswitch', 'findfirst', 'findnext',
+            'floattocurr', 'floattodatetime', 'floattodecimal', 'floattostr',
+            'floattostrf', 'floattotext', 'floattotextfmt', 'fmtloadstr',
+            'fmtstr', 'forcedirectories', 'format', 'formatbuf', 'formatcurr',
+            'formatdatetime', 'formatfloat', 'freeandnil', 'getcurrentdir',
+            'getenvironmentvariable', 'getfileversion', 'getformatsettings',
+            'getlocaleformatsettings', 'getmodulename', 'getpackagedescription',
+            'getpackageinfo', 'gettime', 'guidtostring', 'incamonth',
+            'includetrailingbackslash', 'includetrailingpathdelimiter',
+            'incmonth', 'initializepackage', 'interlockeddecrement',
+            'interlockedexchange', 'interlockedexchangeadd',
+            'interlockedincrement', 'inttohex', 'inttostr', 'isdelimiter',
+            'isequalguid', 'isleapyear', 'ispathdelimiter', 'isvalidident',
+            'languages', 'lastdelimiter', 'loadpackage', 'loadstr',
+            'lowercase', 'msecstotimestamp', 'newstr', 'nextcharindex', 'now',
+            'outofmemoryerror', 'quotedstr', 'raiselastoserror',
+            'raiselastwin32error', 'removedir', 'renamefile', 'replacedate',
+            'replacetime', 'safeloadlibrary', 'samefilename', 'sametext',
+            'setcurrentdir', 'showexception', 'sleep', 'stralloc', 'strbufsize',
+            'strbytetype', 'strcat', 'strcharlength', 'strcomp', 'strcopy',
+            'strdispose', 'strecopy', 'strend', 'strfmt', 'stricomp',
+            'stringreplace', 'stringtoguid', 'strlcat', 'strlcomp', 'strlcopy',
+            'strlen', 'strlfmt', 'strlicomp', 'strlower', 'strmove', 'strnew',
+            'strnextchar', 'strpas', 'strpcopy', 'strplcopy', 'strpos',
+            'strrscan', 'strscan', 'strtobool', 'strtobooldef', 'strtocurr',
+            'strtocurrdef', 'strtodate', 'strtodatedef', 'strtodatetime',
+            'strtodatetimedef', 'strtofloat', 'strtofloatdef', 'strtoint',
+            'strtoint64', 'strtoint64def', 'strtointdef', 'strtotime',
+            'strtotimedef', 'strupper', 'supports', 'syserrormessage',
+            'systemtimetodatetime', 'texttofloat', 'time', 'timestamptodatetime',
+            'timestamptomsecs', 'timetostr', 'trim', 'trimleft', 'trimright',
+            'tryencodedate', 'tryencodetime', 'tryfloattocurr', 'tryfloattodatetime',
+            'trystrtobool', 'trystrtocurr', 'trystrtodate', 'trystrtodatetime',
+            'trystrtofloat', 'trystrtoint', 'trystrtoint64', 'trystrtotime',
+            'unloadpackage', 'uppercase', 'widecomparestr', 'widecomparetext',
+            'widefmtstr', 'wideformat', 'wideformatbuf', 'widelowercase',
+            'widesamestr', 'widesametext', 'wideuppercase', 'win32check',
+            'wraptext'
+        ),
+        'Classes': (
+            'activateclassgroup', 'allocatehwnd', 'bintohex', 'checksynchronize',
+            'collectionsequal', 'countgenerations', 'deallocatehwnd', 'equalrect',
+            'extractstrings', 'findclass', 'findglobalcomponent', 'getclass',
+            'groupdescendantswith', 'hextobin', 'identtoint',
+            'initinheritedcomponent', 'inttoident', 'invalidpoint',
+            'isuniqueglobalcomponentname', 'linestart', 'objectbinarytotext',
+            'objectresourcetotext', 'objecttexttobinary', 'objecttexttoresource',
+            'pointsequal', 'readcomponentres', 'readcomponentresex',
+            'readcomponentresfile', 'rect', 'registerclass', 'registerclassalias',
+            'registerclasses', 'registercomponents', 'registerintegerconsts',
+            'registernoicon', 'registernonactivex', 'smallpoint', 'startclassgroup',
+            'teststreamformat', 'unregisterclass', 'unregisterclasses',
+            'unregisterintegerconsts', 'unregistermoduleclasses',
+            'writecomponentresfile'
+        ),
+        'Math': (
+            'arccos', 'arccosh', 'arccot', 'arccoth', 'arccsc', 'arccsch', 'arcsec',
+            'arcsech', 'arcsin', 'arcsinh', 'arctan2', 'arctanh', 'ceil',
+            'comparevalue', 'cosecant', 'cosh', 'cot', 'cotan', 'coth', 'csc',
+            'csch', 'cycletodeg', 'cycletograd', 'cycletorad', 'degtocycle',
+            'degtograd', 'degtorad', 'divmod', 'doubledecliningbalance',
+            'ensurerange', 'floor', 'frexp', 'futurevalue', 'getexceptionmask',
+            'getprecisionmode', 'getroundmode', 'gradtocycle', 'gradtodeg',
+            'gradtorad', 'hypot', 'inrange', 'interestpayment', 'interestrate',
+            'internalrateofreturn', 'intpower', 'isinfinite', 'isnan', 'iszero',
+            'ldexp', 'lnxp1', 'log10', 'log2', 'logn', 'max', 'maxintvalue',
+            'maxvalue', 'mean', 'meanandstddev', 'min', 'minintvalue', 'minvalue',
+            'momentskewkurtosis', 'netpresentvalue', 'norm', 'numberofperiods',
+            'payment', 'periodpayment', 'poly', 'popnstddev', 'popnvariance',
+            'power', 'presentvalue', 'radtocycle', 'radtodeg', 'radtograd',
+            'randg', 'randomrange', 'roundto', 'samevalue', 'sec', 'secant',
+            'sech', 'setexceptionmask', 'setprecisionmode', 'setroundmode',
+            'sign', 'simpleroundto', 'sincos', 'sinh', 'slndepreciation', 'stddev',
+            'sum', 'sumint', 'sumofsquares', 'sumsandsquares', 'syddepreciation',
+            'tan', 'tanh', 'totalvariance', 'variance'
+        )
+    }
+
+    ASM_REGISTERS = set((
+        'ah', 'al', 'ax', 'bh', 'bl', 'bp', 'bx', 'ch', 'cl', 'cr0',
+        'cr1', 'cr2', 'cr3', 'cr4', 'cs', 'cx', 'dh', 'di', 'dl', 'dr0',
+        'dr1', 'dr2', 'dr3', 'dr4', 'dr5', 'dr6', 'dr7', 'ds', 'dx',
+        'eax', 'ebp', 'ebx', 'ecx', 'edi', 'edx', 'es', 'esi', 'esp',
+        'fs', 'gs', 'mm0', 'mm1', 'mm2', 'mm3', 'mm4', 'mm5', 'mm6',
+        'mm7', 'si', 'sp', 'ss', 'st0', 'st1', 'st2', 'st3', 'st4', 'st5',
+        'st6', 'st7', 'xmm0', 'xmm1', 'xmm2', 'xmm3', 'xmm4', 'xmm5',
+        'xmm6', 'xmm7'
+    ))
+
+    ASM_INSTRUCTIONS = set((
+        'aaa', 'aad', 'aam', 'aas', 'adc', 'add', 'and', 'arpl', 'bound',
+        'bsf', 'bsr', 'bswap', 'bt', 'btc', 'btr', 'bts', 'call', 'cbw',
+        'cdq', 'clc', 'cld', 'cli', 'clts', 'cmc', 'cmova', 'cmovae',
+        'cmovb', 'cmovbe', 'cmovc', 'cmovcxz', 'cmove', 'cmovg',
+        'cmovge', 'cmovl', 'cmovle', 'cmovna', 'cmovnae', 'cmovnb',
+        'cmovnbe', 'cmovnc', 'cmovne', 'cmovng', 'cmovnge', 'cmovnl',
+        'cmovnle', 'cmovno', 'cmovnp', 'cmovns', 'cmovnz', 'cmovo',
+        'cmovp', 'cmovpe', 'cmovpo', 'cmovs', 'cmovz', 'cmp', 'cmpsb',
+        'cmpsd', 'cmpsw', 'cmpxchg', 'cmpxchg486', 'cmpxchg8b', 'cpuid',
+        'cwd', 'cwde', 'daa', 'das', 'dec', 'div', 'emms', 'enter', 'hlt',
+        'ibts', 'icebp', 'idiv', 'imul', 'in', 'inc', 'insb', 'insd',
+        'insw', 'int', 'int01', 'int03', 'int1', 'int3', 'into', 'invd',
+        'invlpg', 'iret', 'iretd', 'iretw', 'ja', 'jae', 'jb', 'jbe',
+        'jc', 'jcxz', 'jcxz', 'je', 'jecxz', 'jg', 'jge', 'jl', 'jle',
+        'jmp', 'jna', 'jnae', 'jnb', 'jnbe', 'jnc', 'jne', 'jng', 'jnge',
+        'jnl', 'jnle', 'jno', 'jnp', 'jns', 'jnz', 'jo', 'jp', 'jpe',
+        'jpo', 'js', 'jz', 'lahf', 'lar', 'lcall', 'lds', 'lea', 'leave',
+        'les', 'lfs', 'lgdt', 'lgs', 'lidt', 'ljmp', 'lldt', 'lmsw',
+        'loadall', 'loadall286', 'lock', 'lodsb', 'lodsd', 'lodsw',
+        'loop', 'loope', 'loopne', 'loopnz', 'loopz', 'lsl', 'lss', 'ltr',
+        'mov', 'movd', 'movq', 'movsb', 'movsd', 'movsw', 'movsx',
+        'movzx', 'mul', 'neg', 'nop', 'not', 'or', 'out', 'outsb', 'outsd',
+        'outsw', 'pop', 'popa', 'popad', 'popaw', 'popf', 'popfd', 'popfw',
+        'push', 'pusha', 'pushad', 'pushaw', 'pushf', 'pushfd', 'pushfw',
+        'rcl', 'rcr', 'rdmsr', 'rdpmc', 'rdshr', 'rdtsc', 'rep', 'repe',
+        'repne', 'repnz', 'repz', 'ret', 'retf', 'retn', 'rol', 'ror',
+        'rsdc', 'rsldt', 'rsm', 'sahf', 'sal', 'salc', 'sar', 'sbb',
+        'scasb', 'scasd', 'scasw', 'seta', 'setae', 'setb', 'setbe',
+        'setc', 'setcxz', 'sete', 'setg', 'setge', 'setl', 'setle',
+        'setna', 'setnae', 'setnb', 'setnbe', 'setnc', 'setne', 'setng',
+        'setnge', 'setnl', 'setnle', 'setno', 'setnp', 'setns', 'setnz',
+        'seto', 'setp', 'setpe', 'setpo', 'sets', 'setz', 'sgdt', 'shl',
+        'shld', 'shr', 'shrd', 'sidt', 'sldt', 'smi', 'smint', 'smintold',
+        'smsw', 'stc', 'std', 'sti', 'stosb', 'stosd', 'stosw', 'str',
+        'sub', 'svdc', 'svldt', 'svts', 'syscall', 'sysenter', 'sysexit',
+        'sysret', 'test', 'ud1', 'ud2', 'umov', 'verr', 'verw', 'wait',
+        'wbinvd', 'wrmsr', 'wrshr', 'xadd', 'xbts', 'xchg', 'xlat',
+        'xlatb', 'xor'
+    ))
+
+    def __init__(self, **options):
+        Lexer.__init__(self, **options)
+        self.keywords = set()
+        if get_bool_opt(options, 'turbopascal', True):
+            self.keywords.update(self.TURBO_PASCAL_KEYWORDS)
+        if get_bool_opt(options, 'delphi', True):
+            self.keywords.update(self.DELPHI_KEYWORDS)
+        if get_bool_opt(options, 'freepascal', True):
+            self.keywords.update(self.FREE_PASCAL_KEYWORDS)
+        self.builtins = set()
+        for unit in get_list_opt(options, 'units', list(self.BUILTIN_UNITS)):
+            self.builtins.update(self.BUILTIN_UNITS[unit])
+
+    def get_tokens_unprocessed(self, text):
+        scanner = Scanner(text, re.DOTALL | re.MULTILINE | re.IGNORECASE)
+        stack = ['initial']
+        in_function_block = False
+        in_property_block = False
+        was_dot = False
+        next_token_is_function = False
+        next_token_is_property = False
+        collect_labels = False
+        block_labels = set()
+        brace_balance = [0, 0]
+
+        while not scanner.eos:
+            token = Error
+
+            if stack[-1] == 'initial':
+                if scanner.scan(r'\s+'):
+                    token = Text
+                elif scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):
+                    if scanner.match.startswith('$'):
+                        token = Comment.Preproc
+                    else:
+                        token = Comment.Multiline
+                elif scanner.scan(r'//.*?$'):
+                    token = Comment.Single
+                elif scanner.scan(r'[-+*\/=<>:;,.@\^]'):
+                    token = Operator
+                    # stop label highlighting on next ";"
+                    if collect_labels and scanner.match == ';':
+                        collect_labels = False
+                elif scanner.scan(r'[\(\)\[\]]+'):
+                    token = Punctuation
+                    # abort function naming ``foo = Function(...)``
+                    next_token_is_function = False
+                    # if we are in a function block we count the open
+                    # braces because ootherwise it's impossible to
+                    # determine the end of the modifier context
+                    if in_function_block or in_property_block:
+                        if scanner.match == '(':
+                            brace_balance[0] += 1
+                        elif scanner.match == ')':
+                            brace_balance[0] -= 1
+                        elif scanner.match == '[':
+                            brace_balance[1] += 1
+                        elif scanner.match == ']':
+                            brace_balance[1] -= 1
+                elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):
+                    lowercase_name = scanner.match.lower()
+                    if lowercase_name == 'result':
+                        token = Name.Builtin.Pseudo
+                    elif lowercase_name in self.keywords:
+                        token = Keyword
+                        # if we are in a special block and a
+                        # block ending keyword occours (and the parenthesis
+                        # is balanced) we end the current block context
+                        if (in_function_block or in_property_block) and \
+                           lowercase_name in self.BLOCK_KEYWORDS and \
+                           brace_balance[0] <= 0 and \
+                           brace_balance[1] <= 0:
+                            in_function_block = False
+                            in_property_block = False
+                            brace_balance = [0, 0]
+                            block_labels = set()
+                        if lowercase_name in ('label', 'goto'):
+                            collect_labels = True
+                        elif lowercase_name == 'asm':
+                            stack.append('asm')
+                        elif lowercase_name == 'property':
+                            in_property_block = True
+                            next_token_is_property = True
+                        elif lowercase_name in ('procedure', 'operator',
+                                                'function', 'constructor',
+                                                'destructor'):
+                            in_function_block = True
+                            next_token_is_function = True
+                    # we are in a function block and the current name
+                    # is in the set of registered modifiers. highlight
+                    # it as pseudo keyword
+                    elif in_function_block and \
+                            lowercase_name in self.FUNCTION_MODIFIERS:
+                        token = Keyword.Pseudo
+                    # if we are in a property highlight some more
+                    # modifiers
+                    elif in_property_block and \
+                            lowercase_name in ('read', 'write'):
+                        token = Keyword.Pseudo
+                        next_token_is_function = True
+                    # if the last iteration set next_token_is_function
+                    # to true we now want this name highlighted as
+                    # function. so do that and reset the state
+                    elif next_token_is_function:
+                        # Look if the next token is a dot. If yes it's
+                        # not a function, but a class name and the
+                        # part after the dot a function name
+                        if scanner.test(r'\s*\.\s*'):
+                            token = Name.Class
+                        # it's not a dot, our job is done
+                        else:
+                            token = Name.Function
+                            next_token_is_function = False
+                    # same for properties
+                    elif next_token_is_property:
+                        token = Name.Property
+                        next_token_is_property = False
+                    # Highlight this token as label and add it
+                    # to the list of known labels
+                    elif collect_labels:
+                        token = Name.Label
+                        block_labels.add(scanner.match.lower())
+                    # name is in list of known labels
+                    elif lowercase_name in block_labels:
+                        token = Name.Label
+                    elif lowercase_name in self.BUILTIN_TYPES:
+                        token = Keyword.Type
+                    elif lowercase_name in self.DIRECTIVES:
+                        token = Keyword.Pseudo
+                    # builtins are just builtins if the token
+                    # before isn't a dot
+                    elif not was_dot and lowercase_name in self.builtins:
+                        token = Name.Builtin
+                    else:
+                        token = Name
+                elif scanner.scan(r"'"):
+                    token = String
+                    stack.append('string')
+                elif scanner.scan(r'\#(\d+|\$[0-9A-Fa-f]+)'):
+                    token = String.Char
+                elif scanner.scan(r'\$[0-9A-Fa-f]+'):
+                    token = Number.Hex
+                elif scanner.scan(r'\d+(?![eE]|\.[^.])'):
+                    token = Number.Integer
+                elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):
+                    token = Number.Float
+                else:
+                    # if the stack depth is deeper than once, pop
+                    if len(stack) > 1:
+                        stack.pop()
+                    scanner.get_char()
+
+            elif stack[-1] == 'string':
+                if scanner.scan(r"''"):
+                    token = String.Escape
+                elif scanner.scan(r"'"):
+                    token = String
+                    stack.pop()
+                elif scanner.scan(r"[^']*"):
+                    token = String
+                else:
+                    scanner.get_char()
+                    stack.pop()
+
+            elif stack[-1] == 'asm':
+                if scanner.scan(r'\s+'):
+                    token = Text
+                elif scanner.scan(r'end'):
+                    token = Keyword
+                    stack.pop()
+                elif scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):
+                    if scanner.match.startswith('$'):
+                        token = Comment.Preproc
+                    else:
+                        token = Comment.Multiline
+                elif scanner.scan(r'//.*?$'):
+                    token = Comment.Single
+                elif scanner.scan(r"'"):
+                    token = String
+                    stack.append('string')
+                elif scanner.scan(r'@@[A-Za-z_][A-Za-z_0-9]*'):
+                    token = Name.Label
+                elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):
+                    lowercase_name = scanner.match.lower()
+                    if lowercase_name in self.ASM_INSTRUCTIONS:
+                        token = Keyword
+                    elif lowercase_name in self.ASM_REGISTERS:
+                        token = Name.Builtin
+                    else:
+                        token = Name
+                elif scanner.scan(r'[-+*\/=<>:;,.@\^]+'):
+                    token = Operator
+                elif scanner.scan(r'[\(\)\[\]]+'):
+                    token = Punctuation
+                elif scanner.scan(r'\$[0-9A-Fa-f]+'):
+                    token = Number.Hex
+                elif scanner.scan(r'\d+(?![eE]|\.[^.])'):
+                    token = Number.Integer
+                elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):
+                    token = Number.Float
+                else:
+                    scanner.get_char()
+                    stack.pop()
+
+            # save the dot!!!11
+            if scanner.match.strip():
+                was_dot = scanner.match == '.'
+            yield scanner.start_pos, token, scanner.match or ''
+
+
+class AdaLexer(RegexLexer):
+    """
+    For Ada source code.
+
+    .. versionadded:: 1.3
+    """
+
+    name = 'Ada'
+    aliases = ['ada', 'ada95', 'ada2005']
+    filenames = ['*.adb', '*.ads', '*.ada']
+    mimetypes = ['text/x-ada']
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'--.*?\n', Comment.Single),
+            (r'[^\S\n]+', Text),
+            (r'function|procedure|entry', Keyword.Declaration, 'subprogram'),
+            (r'(subtype|type)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Text, Keyword.Type), 'type_def'),
+            (r'task|protected', Keyword.Declaration),
+            (r'(subtype)(\s+)', bygroups(Keyword.Declaration, Text)),
+            (r'(end)(\s+)', bygroups(Keyword.Reserved, Text), 'end'),
+            (r'(pragma)(\s+)(\w+)', bygroups(Keyword.Reserved, Text,
+                                             Comment.Preproc)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (words((
+                'Address', 'Byte', 'Boolean', 'Character', 'Controlled', 'Count',
+                'Cursor', 'Duration', 'File_Mode', 'File_Type', 'Float', 'Generator',
+                'Integer', 'Long_Float', 'Long_Integer', 'Long_Long_Float',
+                'Long_Long_Integer', 'Natural', 'Positive', 'Reference_Type',
+                'Short_Float', 'Short_Integer', 'Short_Short_Float',
+                'Short_Short_Integer', 'String', 'Wide_Character', 'Wide_String'),
+                   suffix=r'\b'),
+             Keyword.Type),
+            (r'(and(\s+then)?|in|mod|not|or(\s+else)|rem)\b', Operator.Word),
+            (r'generic|private', Keyword.Declaration),
+            (r'package', Keyword.Declaration, 'package'),
+            (r'array\b', Keyword.Reserved, 'array_def'),
+            (r'(with|use)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
+            (r'(\w+)(\s*)(:)(\s*)(constant)',
+             bygroups(Name.Constant, Text, Punctuation, Text,
+                      Keyword.Reserved)),
+            (r'<<\w+>>', Name.Label),
+            (r'(\w+)(\s*)(:)(\s*)(declare|begin|loop|for|while)',
+             bygroups(Name.Label, Text, Punctuation, Text, Keyword.Reserved)),
+            (words((
+                'abort', 'abs', 'abstract', 'accept', 'access', 'aliased', 'all',
+                'array', 'at', 'begin', 'body', 'case', 'constant', 'declare',
+                'delay', 'delta', 'digits', 'do', 'else', 'elsif', 'end', 'entry',
+                'exception', 'exit', 'interface', 'for', 'goto', 'if', 'is', 'limited',
+                'loop', 'new', 'null', 'of', 'or', 'others', 'out', 'overriding',
+                'pragma', 'protected', 'raise', 'range', 'record', 'renames', 'requeue',
+                'return', 'reverse', 'select', 'separate', 'subtype', 'synchronized',
+                'task', 'tagged', 'terminate', 'then', 'type', 'until', 'when',
+                'while', 'xor'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            (r'"[^"]*"', String),
+            include('attribute'),
+            include('numbers'),
+            (r"'[^']'", String.Character),
+            (r'(\w+)(\s*|[(,])', bygroups(Name, using(this))),
+            (r"(<>|=>|:=|[()|:;,.'])", Punctuation),
+            (r'[*<>+=/&-]', Operator),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'[0-9_]+#[0-9a-f]+#', Number.Hex),
+            (r'[0-9_]+\.[0-9_]*', Number.Float),
+            (r'[0-9_]+', Number.Integer),
+        ],
+        'attribute': [
+            (r"(')(\w+)", bygroups(Punctuation, Name.Attribute)),
+        ],
+        'subprogram': [
+            (r'\(', Punctuation, ('#pop', 'formal_part')),
+            (r';', Punctuation, '#pop'),
+            (r'is\b', Keyword.Reserved, '#pop'),
+            (r'"[^"]+"|\w+', Name.Function),
+            include('root'),
+        ],
+        'end': [
+            ('(if|case|record|loop|select)', Keyword.Reserved),
+            ('"[^"]+"|[\w.]+', Name.Function),
+            ('\s+', Text),
+            (';', Punctuation, '#pop'),
+        ],
+        'type_def': [
+            (r';', Punctuation, '#pop'),
+            (r'\(', Punctuation, 'formal_part'),
+            (r'with|and|use', Keyword.Reserved),
+            (r'array\b', Keyword.Reserved, ('#pop', 'array_def')),
+            (r'record\b', Keyword.Reserved, ('record_def')),
+            (r'(null record)(;)', bygroups(Keyword.Reserved, Punctuation), '#pop'),
+            include('root'),
+        ],
+        'array_def': [
+            (r';', Punctuation, '#pop'),
+            (r'(\w+)(\s+)(range)', bygroups(Keyword.Type, Text, Keyword.Reserved)),
+            include('root'),
+        ],
+        'record_def': [
+            (r'end record', Keyword.Reserved, '#pop'),
+            include('root'),
+        ],
+        'import': [
+            (r'[\w.]+', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'formal_part': [
+            (r'\)', Punctuation, '#pop'),
+            (r'\w+', Name.Variable),
+            (r',|:[^=]', Punctuation),
+            (r'(in|not|null|out|access)\b', Keyword.Reserved),
+            include('root'),
+        ],
+        'package': [
+            ('body', Keyword.Declaration),
+            ('is\s+new|renames', Keyword.Reserved),
+            ('is', Keyword.Reserved, '#pop'),
+            (';', Punctuation, '#pop'),
+            ('\(', Punctuation, 'package_instantiation'),
+            ('([\w.]+)', Name.Class),
+            include('root'),
+        ],
+        'package_instantiation': [
+            (r'("[^"]+"|\w+)(\s+)(=>)', bygroups(Name.Variable, Text, Punctuation)),
+            (r'[\w.\'"]', Text),
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/go.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/go.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/go.py	(revision 1126)
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.go
+    ~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Google Go language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['GoLexer']
+
+
+class GoLexer(RegexLexer):
+    """
+    For `Go <http://golang.org>`_ source.
+
+    .. versionadded:: 1.2
+    """
+    name = 'Go'
+    filenames = ['*.go']
+    aliases = ['go']
+    mimetypes = ['text/x-gosrc']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuations
+            (r'//(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'(import|package)\b', Keyword.Namespace),
+            (r'(var|func|struct|map|chan|type|interface|const)\b',
+             Keyword.Declaration),
+            (words((
+                'break', 'default', 'select', 'case', 'defer', 'go',
+                'else', 'goto', 'switch', 'fallthrough', 'if', 'range',
+                'continue', 'for', 'return'), suffix=r'\b'),
+             Keyword),
+            (r'(true|false|iota|nil)\b', Keyword.Constant),
+            # It seems the builtin types aren't actually keywords, but
+            # can be used as functions. So we need two declarations.
+            (words((
+                'uint', 'uint8', 'uint16', 'uint32', 'uint64',
+                'int', 'int8', 'int16', 'int32', 'int64',
+                'float', 'float32', 'float64',
+                'complex64', 'complex128', 'byte', 'rune',
+                'string', 'bool', 'error', 'uintptr',
+                'print', 'println', 'panic', 'recover', 'close', 'complex',
+                'real', 'imag', 'len', 'cap', 'append', 'copy', 'delete',
+                'new', 'make'), suffix=r'\b(\()'),
+             bygroups(Name.Builtin, Punctuation)),
+            (words((
+                'uint', 'uint8', 'uint16', 'uint32', 'uint64',
+                'int', 'int8', 'int16', 'int32', 'int64',
+                'float', 'float32', 'float64',
+                'complex64', 'complex128', 'byte', 'rune',
+                'string', 'bool', 'error', 'uintptr'), suffix=r'\b'),
+             Keyword.Type),
+            # imaginary_lit
+            (r'\d+i', Number),
+            (r'\d+\.\d*([Ee][-+]\d+)?i', Number),
+            (r'\.\d+([Ee][-+]\d+)?i', Number),
+            (r'\d+[Ee][-+]\d+i', Number),
+            # float_lit
+            (r'\d+(\.\d+[eE][+\-]?\d+|'
+             r'\.\d*|[eE][+\-]?\d+)', Number.Float),
+            (r'\.\d+([eE][+\-]?\d+)?', Number.Float),
+            # int_lit
+            # -- octal_lit
+            (r'0[0-7]+', Number.Oct),
+            # -- hex_lit
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            # -- decimal_lit
+            (r'(0|[1-9][0-9]*)', Number.Integer),
+            # char_lit
+            (r"""'(\\['"\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|[^\\])'""",
+             String.Char),
+            # StringLiteral
+            # -- raw_string_lit
+            (r'`[^`]*`', String),
+            # -- interpreted_string_lit
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # Tokens
+            (r'(<<=|>>=|<<|>>|<=|>=|&\^=|&\^|\+=|-=|\*=|/=|%=|&=|\|=|&&|\|\|'
+             r'|<-|\+\+|--|==|!=|:=|\.\.\.|[+\-*/%&])', Operator),
+            (r'[|^<>=!()\[\]{}.,;:]', Punctuation),
+            # identifier
+            (r'[^\W\d]\w*', Name.Other),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dsls.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dsls.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dsls.py	(revision 1126)
@@ -0,0 +1,878 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.dsls
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various domain-specific languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, RegexLexer, bygroups, words, \
+    include, default, this, using, combined
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal, Whitespace
+
+__all__ = ['ProtoBufLexer', 'BroLexer', 'PuppetLexer', 'RslLexer',
+           'MscgenLexer', 'VGLLexer', 'AlloyLexer', 'PanLexer',
+           'CrmshLexer', 'ThriftLexer', 'FlatlineLexer', 'SnowballLexer']
+
+
+class ProtoBufLexer(RegexLexer):
+    """
+    Lexer for `Protocol Buffer <http://code.google.com/p/protobuf/>`_
+    definition files.
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'Protocol Buffer'
+    aliases = ['protobuf', 'proto']
+    filenames = ['*.proto']
+
+    tokens = {
+        'root': [
+            (r'[ \t]+', Text),
+            (r'[,;{}\[\]()<>]', Punctuation),
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
+            (words((
+                'import', 'option', 'optional', 'required', 'repeated', 'default',
+                'packed', 'ctype', 'extensions', 'to', 'max', 'rpc', 'returns',
+                'oneof'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words((
+                'int32', 'int64', 'uint32', 'uint64', 'sint32', 'sint64',
+                'fixed32', 'fixed64', 'sfixed32', 'sfixed64',
+                'float', 'double', 'bool', 'string', 'bytes'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Text), 'package'),
+            (r'(message|extend)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'message'),
+            (r'(enum|group|service)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'type'),
+            (r'\".*?\"', String),
+            (r'\'.*?\'', String),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'(\-?(inf|nan))\b', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'[+-=]', Operator),
+            (r'([a-zA-Z_][\w.]*)([ \t]*)(=)',
+             bygroups(Name.Attribute, Text, Operator)),
+            ('[a-zA-Z_][\w.]*', Name),
+        ],
+        'package': [
+            (r'[a-zA-Z_]\w*', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'message': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'type': [
+            (r'[a-zA-Z_]\w*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class ThriftLexer(RegexLexer):
+    """
+    For `Thrift <https://thrift.apache.org/>`__ interface definitions.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Thrift'
+    aliases = ['thrift']
+    filenames = ['*.thrift']
+    mimetypes = ['application/x-thrift']
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            (r'"', String.Double, combined('stringescape', 'dqs')),
+            (r'\'', String.Single, combined('stringescape', 'sqs')),
+            (r'(namespace)(\s+)',
+                bygroups(Keyword.Namespace, Text.Whitespace), 'namespace'),
+            (r'(enum|union|struct|service|exception)(\s+)',
+                bygroups(Keyword.Declaration, Text.Whitespace), 'class'),
+            (r'((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)'  # return arguments
+             r'((?:[^\W\d]|\$)[\w$]*)'                  # method name
+             r'(\s*)(\()',                              # signature start
+             bygroups(using(this), Name.Function, Text, Operator)),
+            include('keywords'),
+            include('numbers'),
+            (r'[&=]', Operator),
+            (r'[:;,{}()<>\[\]]', Punctuation),
+            (r'[a-zA-Z_](\.\w|\w)*', Name),
+        ],
+        'whitespace': [
+            (r'\n', Text.Whitespace),
+            (r'\s+', Text.Whitespace),
+        ],
+        'comments': [
+            (r'#.*$', Comment),
+            (r'//.*?\n', Comment),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+        ],
+        'stringescape': [
+            (r'\\([\\nrt"\'])', String.Escape),
+        ],
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'[^\\"\n]+', String.Double),
+        ],
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r'[^\\\'\n]+', String.Single),
+        ],
+        'namespace': [
+            (r'[a-z*](\.\w|\w)*', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'keywords': [
+            (r'(async|oneway|extends|throws|required|optional)\b', Keyword),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(const|typedef)\b', Keyword.Declaration),
+            (words((
+                'cpp_namespace', 'cpp_include', 'cpp_type', 'java_package',
+                'cocoa_prefix', 'csharp_namespace', 'delphi_namespace',
+                'php_namespace', 'py_module', 'perl_package',
+                'ruby_namespace', 'smalltalk_category', 'smalltalk_prefix',
+                'xsd_all', 'xsd_optional', 'xsd_nillable', 'xsd_namespace',
+                'xsd_attrs', 'include'), suffix=r'\b'),
+             Keyword.Namespace),
+            (words((
+                'void', 'bool', 'byte', 'i16', 'i32', 'i64', 'double',
+                'string', 'binary', 'map', 'list', 'set', 'slist',
+                'senum'), suffix=r'\b'),
+             Keyword.Type),
+            (words((
+                'BEGIN', 'END', '__CLASS__', '__DIR__', '__FILE__',
+                '__FUNCTION__', '__LINE__', '__METHOD__', '__NAMESPACE__',
+                'abstract', 'alias', 'and', 'args', 'as', 'assert', 'begin',
+                'break', 'case', 'catch', 'class', 'clone', 'continue',
+                'declare', 'def', 'default', 'del', 'delete', 'do', 'dynamic',
+                'elif', 'else', 'elseif', 'elsif', 'end', 'enddeclare',
+                'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile',
+                'ensure', 'except', 'exec', 'finally', 'float', 'for',
+                'foreach', 'function', 'global', 'goto', 'if', 'implements',
+                'import', 'in', 'inline', 'instanceof', 'interface', 'is',
+                'lambda', 'module', 'native', 'new', 'next', 'nil', 'not',
+                'or', 'pass', 'public', 'print', 'private', 'protected',
+                'raise', 'redo', 'rescue', 'retry', 'register', 'return',
+                'self', 'sizeof', 'static', 'super', 'switch', 'synchronized',
+                'then', 'this', 'throw', 'transient', 'try', 'undef',
+                'unless', 'unsigned', 'until', 'use', 'var', 'virtual',
+                'volatile', 'when', 'while', 'with', 'xor', 'yield'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+        ],
+        'numbers': [
+            (r'[+-]?(\d+\.\d+([eE][+-]?\d+)?|\.?\d+[eE][+-]?\d+)', Number.Float),
+            (r'[+-]?0x[0-9A-Fa-f]+', Number.Hex),
+            (r'[+-]?[0-9]+', Number.Integer),
+        ],
+    }
+
+
+class BroLexer(RegexLexer):
+    """
+    For `Bro <http://bro-ids.org/>`_ scripts.
+
+    .. versionadded:: 1.5
+    """
+    name = 'Bro'
+    aliases = ['bro']
+    filenames = ['*.bro']
+
+    _hex = r'[0-9a-fA-F_]'
+    _float = r'((\d*\.?\d+)|(\d+\.?\d*))([eE][-+]?\d+)?'
+    _h = r'[A-Za-z0-9][-A-Za-z0-9]*'
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'^@.*?\n', Comment.Preproc),
+            (r'#.*?\n', Comment.Single),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),
+            # Keywords
+            (r'(add|alarm|break|case|const|continue|delete|do|else|enum|event'
+             r'|export|for|function|if|global|hook|local|module|next'
+             r'|of|print|redef|return|schedule|switch|type|when|while)\b', Keyword),
+            (r'(addr|any|bool|count|counter|double|file|int|interval|net'
+             r'|pattern|port|record|set|string|subnet|table|time|timer'
+             r'|vector)\b', Keyword.Type),
+            (r'(T|F)\b', Keyword.Constant),
+            (r'(&)((?:add|delete|expire)_func|attr|(?:create|read|write)_expire'
+             r'|default|disable_print_hook|raw_output|encrypt|group|log'
+             r'|mergeable|optional|persistent|priority|redef'
+             r'|rotate_(?:interval|size)|synchronized)\b',
+             bygroups(Punctuation, Keyword)),
+            (r'\s+module\b', Keyword.Namespace),
+            # Addresses, ports and networks
+            (r'\d+/(tcp|udp|icmp|unknown)\b', Number),
+            (r'(\d+\.){3}\d+', Number),
+            (r'(' + _hex + r'){7}' + _hex, Number),
+            (r'0x' + _hex + r'(' + _hex + r'|:)*::(' + _hex + r'|:)*', Number),
+            (r'((\d+|:)(' + _hex + r'|:)*)?::(' + _hex + r'|:)*', Number),
+            (r'(\d+\.\d+\.|(\d+\.){2}\d+)', Number),
+            # Hostnames
+            (_h + r'(\.' + _h + r')+', String),
+            # Numeric
+            (_float + r'\s+(day|hr|min|sec|msec|usec)s?\b', Literal.Date),
+            (r'0[xX]' + _hex, Number.Hex),
+            (_float, Number.Float),
+            (r'\d+', Number.Integer),
+            (r'/', String.Regex, 'regex'),
+            (r'"', String, 'string'),
+            # Operators
+            (r'[!%*/+:<=>?~|-]', Operator),
+            (r'([-+=&|]{2}|[+=!><-]=)', Operator),
+            (r'(in|match)\b', Operator.Word),
+            (r'[{}()\[\]$.,;]', Punctuation),
+            # Identfier
+            (r'([_a-zA-Z]\w*)(::)', bygroups(Name, Name.Namespace)),
+            (r'[a-zA-Z_]\w*', Name)
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),
+            (r'\\\n', String),
+            (r'\\', String)
+        ],
+        'regex': [
+            (r'/', String.Regex, '#pop'),
+            (r'\\[\\nt/]', String.Regex),  # String.Escape is too intense here.
+            (r'[^\\/\n]+', String.Regex),
+            (r'\\\n', String.Regex),
+            (r'\\', String.Regex)
+        ]
+    }
+
+
+class PuppetLexer(RegexLexer):
+    """
+    For `Puppet <http://puppetlabs.com/>`__ configuration DSL.
+
+    .. versionadded:: 1.6
+    """
+    name = 'Puppet'
+    aliases = ['puppet']
+    filenames = ['*.pp']
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('keywords'),
+            include('names'),
+            include('numbers'),
+            include('operators'),
+            include('strings'),
+
+            (r'[]{}:(),;[]', Punctuation),
+            (r'[^\S\n]+', Text),
+        ],
+
+        'comments': [
+            (r'\s*#.*$', Comment),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+        ],
+
+        'operators': [
+            (r'(=>|\?|<|>|=|\+|-|/|\*|~|!|\|)', Operator),
+            (r'(in|and|or|not)\b', Operator.Word),
+        ],
+
+        'names': [
+            ('[a-zA-Z_]\w*', Name.Attribute),
+            (r'(\$\S+)(\[)(\S+)(\])', bygroups(Name.Variable, Punctuation,
+                                               String, Punctuation)),
+            (r'\$\S+', Name.Variable),
+        ],
+
+        'numbers': [
+            # Copypasta from the Python lexer
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+j?', Number.Float),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+j?', Number.Integer)
+        ],
+
+        'keywords': [
+            # Left out 'group' and 'require'
+            # Since they're often used as attributes
+            (words((
+                'absent', 'alert', 'alias', 'audit', 'augeas', 'before', 'case',
+                'check', 'class', 'computer', 'configured', 'contained',
+                'create_resources', 'crit', 'cron', 'debug', 'default',
+                'define', 'defined', 'directory', 'else', 'elsif', 'emerg',
+                'err', 'exec', 'extlookup', 'fail', 'false', 'file',
+                'filebucket', 'fqdn_rand', 'generate', 'host', 'if', 'import',
+                'include', 'info', 'inherits', 'inline_template', 'installed',
+                'interface', 'k5login', 'latest', 'link', 'loglevel',
+                'macauthorization', 'mailalias', 'maillist', 'mcx', 'md5',
+                'mount', 'mounted', 'nagios_command', 'nagios_contact',
+                'nagios_contactgroup', 'nagios_host', 'nagios_hostdependency',
+                'nagios_hostescalation', 'nagios_hostextinfo', 'nagios_hostgroup',
+                'nagios_service', 'nagios_servicedependency', 'nagios_serviceescalation',
+                'nagios_serviceextinfo', 'nagios_servicegroup', 'nagios_timeperiod',
+                'node', 'noop', 'notice', 'notify', 'package', 'present', 'purged',
+                'realize', 'regsubst', 'resources', 'role', 'router', 'running',
+                'schedule', 'scheduled_task', 'search', 'selboolean', 'selmodule',
+                'service', 'sha1', 'shellquote', 'split', 'sprintf',
+                'ssh_authorized_key', 'sshkey', 'stage', 'stopped', 'subscribe',
+                'tag', 'tagged', 'template', 'tidy', 'true', 'undef', 'unmounted',
+                'user', 'versioncmp', 'vlan', 'warning', 'yumrepo', 'zfs', 'zone',
+                'zpool'), prefix='(?i)', suffix=r'\b'),
+             Keyword),
+        ],
+
+        'strings': [
+            (r'"([^"])*"', String),
+            (r"'(\\'|[^'])*'", String),
+        ],
+
+    }
+
+
+class RslLexer(RegexLexer):
+    """
+    `RSL <http://en.wikipedia.org/wiki/RAISE>`_ is the formal specification
+    language used in RAISE (Rigorous Approach to Industrial Software Engineering)
+    method.
+
+    .. versionadded:: 2.0
+    """
+    name = 'RSL'
+    aliases = ['rsl']
+    filenames = ['*.rsl']
+    mimetypes = ['text/rsl']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            (words((
+                'Bool', 'Char', 'Int', 'Nat', 'Real', 'Text', 'Unit', 'abs',
+                'all', 'always', 'any', 'as', 'axiom', 'card', 'case', 'channel',
+                'chaos', 'class', 'devt_relation', 'dom', 'elems', 'else', 'elif',
+                'end', 'exists', 'extend', 'false', 'for', 'hd', 'hide', 'if',
+                'in', 'is', 'inds', 'initialise', 'int', 'inter', 'isin', 'len',
+                'let', 'local', 'ltl_assertion', 'object', 'of', 'out', 'post',
+                'pre', 'read', 'real', 'rng', 'scheme', 'skip', 'stop', 'swap',
+                'then', 'theory', 'test_case', 'tl', 'transition_system', 'true',
+                'type', 'union', 'until', 'use', 'value', 'variable', 'while',
+                'with', 'write', '~isin', '-inflist', '-infset', '-list',
+                '-set'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (r'(variable|value)\b', Keyword.Declaration),
+            (r'--.*?\n', Comment),
+            (r'<:.*?:>', Comment),
+            (r'\{!.*?!\}', Comment),
+            (r'/\*.*?\*/', Comment),
+            (r'^[ \t]*([\w]+)[ \t]*:[^:]', Name.Function),
+            (r'(^[ \t]*)([\w]+)([ \t]*\([\w\s,]*\)[ \t]*)(is|as)',
+             bygroups(Text, Name.Function, Text, Keyword)),
+            (r'\b[A-Z]\w*\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'".*"', String),
+            (r'\'.\'', String.Char),
+            (r'(><|->|-m->|/\\|<=|<<=|<\.|\|\||\|\^\||-~->|-~m->|\\/|>=|>>|'
+             r'\.>|\+\+|-\\|<->|=>|:-|~=|\*\*|<<|>>=|\+>|!!|\|=\||#)',
+             Operator),
+            (r'[0-9]+\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'.', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        """
+        Check for the most common text in the beginning of a RSL file.
+        """
+        if re.search(r'scheme\s*.*?=\s*class\s*type', text, re.I) is not None:
+            return 1.0
+
+
+class MscgenLexer(RegexLexer):
+    """
+    For `Mscgen <http://www.mcternan.me.uk/mscgen/>`_ files.
+
+    .. versionadded:: 1.6
+    """
+    name = 'Mscgen'
+    aliases = ['mscgen', 'msc']
+    filenames = ['*.msc']
+
+    _var = r'(\w+|"(?:\\"|[^"])*")'
+
+    tokens = {
+        'root': [
+            (r'msc\b', Keyword.Type),
+            # Options
+            (r'(hscale|HSCALE|width|WIDTH|wordwraparcs|WORDWRAPARCS'
+             r'|arcgradient|ARCGRADIENT)\b', Name.Property),
+            # Operators
+            (r'(abox|ABOX|rbox|RBOX|box|BOX|note|NOTE)\b', Operator.Word),
+            (r'(\.|-|\|){3}', Keyword),
+            (r'(?:-|=|\.|:){2}'
+             r'|<<=>>|<->|<=>|<<>>|<:>'
+             r'|->|=>>|>>|=>|:>|-x|-X'
+             r'|<-|<<=|<<|<=|<:|x-|X-|=', Operator),
+            # Names
+            (r'\*', Name.Builtin),
+            (_var, Name.Variable),
+            # Other
+            (r'\[', Punctuation, 'attrs'),
+            (r'\{|\}|,|;', Punctuation),
+            include('comments')
+        ],
+        'attrs': [
+            (r'\]', Punctuation, '#pop'),
+            (_var + r'(\s*)(=)(\s*)' + _var,
+             bygroups(Name.Attribute, Text.Whitespace, Operator, Text.Whitespace,
+                      String)),
+            (r',', Punctuation),
+            include('comments')
+        ],
+        'comments': [
+            (r'(?://|#).*?\n', Comment.Single),
+            (r'/\*(?:.|\n)*?\*/', Comment.Multiline),
+            (r'[ \t\r\n]+', Text.Whitespace)
+        ]
+    }
+
+
+class VGLLexer(RegexLexer):
+    """
+    For `SampleManager VGL <http://www.thermoscientific.com/samplemanager>`_
+    source code.
+
+    .. versionadded:: 1.6
+    """
+    name = 'VGL'
+    aliases = ['vgl']
+    filenames = ['*.rpf']
+
+    flags = re.MULTILINE | re.DOTALL | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\{[^}]*\}', Comment.Multiline),
+            (r'declare', Keyword.Constant),
+            (r'(if|then|else|endif|while|do|endwhile|and|or|prompt|object'
+             r'|create|on|line|with|global|routine|value|endroutine|constant'
+             r'|global|set|join|library|compile_option|file|exists|create|copy'
+             r'|delete|enable|windows|name|notprotected)(?! *[=<>.,()])',
+             Keyword),
+            (r'(true|false|null|empty|error|locked)', Keyword.Constant),
+            (r'[~^*#!%&\[\]()<>|+=:;,./?-]', Operator),
+            (r'"[^"]*"', String),
+            (r'(\.)([a-z_$][\w$]*)', bygroups(Operator, Name.Attribute)),
+            (r'[0-9][0-9]*(\.[0-9]+(e[+\-]?[0-9]+)?)?', Number),
+            (r'[a-z_$][\w$]*', Name),
+            (r'[\r\n]+', Text),
+            (r'\s+', Text)
+        ]
+    }
+
+
+class AlloyLexer(RegexLexer):
+    """
+    For `Alloy <http://alloy.mit.edu>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Alloy'
+    aliases = ['alloy']
+    filenames = ['*.als']
+    mimetypes = ['text/x-alloy']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    iden_rex = r'[a-zA-Z_][\w\']*'
+    text_tuple = (r'[^\S\n]+', Text)
+
+    tokens = {
+        'sig': [
+            (r'(extends)\b', Keyword, '#pop'),
+            (iden_rex, Name),
+            text_tuple,
+            (r',', Punctuation),
+            (r'\{', Operator, '#pop'),
+        ],
+        'module': [
+            text_tuple,
+            (iden_rex, Name, '#pop'),
+        ],
+        'fun': [
+            text_tuple,
+            (r'\{', Operator, '#pop'),
+            (iden_rex, Name, '#pop'),
+        ],
+        'root': [
+            (r'--.*?$', Comment.Single),
+            (r'//.*?$', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            text_tuple,
+            (r'(module|open)(\s+)', bygroups(Keyword.Namespace, Text),
+                'module'),
+            (r'(sig|enum)(\s+)', bygroups(Keyword.Declaration, Text), 'sig'),
+            (r'(iden|univ|none)\b', Keyword.Constant),
+            (r'(int|Int)\b', Keyword.Type),
+            (r'(this|abstract|extends|set|seq|one|lone|let)\b', Keyword),
+            (r'(all|some|no|sum|disj|when|else)\b', Keyword),
+            (r'(run|check|for|but|exactly|expect|as)\b', Keyword),
+            (r'(and|or|implies|iff|in)\b', Operator.Word),
+            (r'(fun|pred|fact|assert)(\s+)', bygroups(Keyword, Text), 'fun'),
+            (r'!|#|&&|\+\+|<<|>>|>=|<=>|<=|\.|->', Operator),
+            (r'[-+/*%=<>&!^|~{}\[\]().]', Operator),
+            (iden_rex, Name),
+            (r'[:,]', Punctuation),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r'\n', Text),
+        ]
+    }
+
+
+class PanLexer(RegexLexer):
+    """
+    Lexer for `pan <http://github.com/quattor/pan/>`_ source files.
+
+    Based on tcsh lexer.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Pan'
+    aliases = ['pan']
+    filenames = ['*.pan']
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'\(', Keyword, 'paren'),
+            (r'\{', Keyword, 'curly'),
+            include('data'),
+        ],
+        'basic': [
+            (words((
+                'if', 'for', 'with', 'else', 'type', 'bind', 'while', 'valid', 'final',
+                'prefix', 'unique', 'object', 'foreach', 'include', 'template',
+                'function', 'variable', 'structure', 'extensible', 'declaration'),
+                prefix=r'\b', suffix=r'\s*\b'),
+             Keyword),
+            (words((
+                'file_contents', 'format', 'index', 'length', 'match', 'matches',
+                'replace', 'splice', 'split', 'substr', 'to_lowercase', 'to_uppercase',
+                'debug', 'error', 'traceback', 'deprecated', 'base64_decode',
+                'base64_encode', 'digest', 'escape', 'unescape', 'append', 'create',
+                'first', 'nlist', 'key', 'list', 'merge', 'next', 'prepend', 'is_boolean',
+                'is_defined', 'is_double', 'is_list', 'is_long', 'is_nlist', 'is_null',
+                'is_number', 'is_property', 'is_resource', 'is_string', 'to_boolean',
+                'to_double', 'to_long', 'to_string', 'clone', 'delete', 'exists',
+                'path_exists', 'if_exists', 'return', 'value'),
+                prefix=r'\b', suffix=r'\s*\b'),
+             Name.Builtin),
+            (r'#.*', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
+            (r'[\[\]{}()=]+', Operator),
+            (r'<<\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r';', Punctuation),
+        ],
+        'data': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r'\s+', Text),
+            (r'[^=\s\[\]{}()$"\'`\\;#]+', Text),
+            (r'\d+(?= |\Z)', Number),
+        ],
+        'curly': [
+            (r'\}', Keyword, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+    }
+
+
+class CrmshLexer(RegexLexer):
+    """
+    Lexer for `crmsh <http://crmsh.github.io/>`_ configuration files
+    for Pacemaker clusters.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Crmsh'
+    aliases = ['crmsh', 'pcmk']
+    filenames = ['*.crmsh', '*.pcmk']
+    mimetypes = []
+
+    elem = words((
+        'node', 'primitive', 'group', 'clone', 'ms', 'location',
+        'colocation', 'order', 'fencing_topology', 'rsc_ticket',
+        'rsc_template', 'property', 'rsc_defaults',
+        'op_defaults', 'acl_target', 'acl_group', 'user', 'role',
+        'tag'), suffix=r'(?![\w#$-])')
+    sub = words((
+        'params', 'meta', 'operations', 'op', 'rule',
+        'attributes', 'utilization'), suffix=r'(?![\w#$-])')
+    acl = words(('read', 'write', 'deny'), suffix=r'(?![\w#$-])')
+    bin_rel = words(('and', 'or'), suffix=r'(?![\w#$-])')
+    un_ops = words(('defined', 'not_defined'), suffix=r'(?![\w#$-])')
+    date_exp = words(('in_range', 'date', 'spec', 'in'), suffix=r'(?![\w#$-])')
+    acl_mod = (r'(?:tag|ref|reference|attribute|type|xpath)')
+    bin_ops = (r'(?:lt|gt|lte|gte|eq|ne)')
+    val_qual = (r'(?:string|version|number)')
+    rsc_role_action = (r'(?:Master|Started|Slave|Stopped|'
+                       r'start|promote|demote|stop)')
+
+    tokens = {
+        'root': [
+            (r'^#.*\n?', Comment),
+            # attr=value (nvpair)
+            (r'([\w#$-]+)(=)("(?:""|[^"])*"|\S+)',
+                bygroups(Name.Attribute, Punctuation, String)),
+            # need this construct, otherwise numeric node ids
+            # are matched as scores
+            # elem id:
+            (r'(node)(\s+)([\w#$-]+)(:)',
+                bygroups(Keyword, Whitespace, Name, Punctuation)),
+            # scores
+            (r'([+-]?([0-9]+|inf)):', Number),
+            # keywords (elements and other)
+            (elem, Keyword),
+            (sub, Keyword),
+            (acl, Keyword),
+            # binary operators
+            (r'(?:%s:)?(%s)(?![\w#$-])' % (val_qual, bin_ops), Operator.Word),
+            # other operators
+            (bin_rel, Operator.Word),
+            (un_ops, Operator.Word),
+            (date_exp, Operator.Word),
+            # builtin attributes (e.g. #uname)
+            (r'#[a-z]+(?![\w#$-])', Name.Builtin),
+            # acl_mod:blah
+            (r'(%s)(:)("(?:""|[^"])*"|\S+)' % acl_mod,
+             bygroups(Keyword, Punctuation, Name)),
+            # rsc_id[:(role|action)]
+            # NB: this matches all other identifiers
+            (r'([\w#$-]+)(?:(:)(%s))?(?![\w#$-])' % rsc_role_action,
+             bygroups(Name, Punctuation, Operator.Word)),
+            # punctuation
+            (r'(\\(?=\n)|[[\](){}/:@])', Punctuation),
+            (r'\s+|\n', Whitespace),
+        ],
+    }
+
+
+class FlatlineLexer(RegexLexer):
+    """
+    Lexer for `Flatline <https://github.com/bigmlcom/flatline>`_ expressions.
+
+    .. versionadded:: 2.2
+    """
+    name = 'Flatline'
+    aliases = ['flatline']
+    filenames = []
+    mimetypes = ['text/x-flatline']
+
+    special_forms = ('let',)
+
+    builtins = (
+        "!=", "*", "+", "-", "<", "<=", "=", ">", ">=", "abs", "acos", "all",
+        "all-but", "all-with-defaults", "all-with-numeric-default", "and",
+        "asin", "atan", "avg", "avg-window", "bin-center", "bin-count", "call",
+        "category-count", "ceil", "cond", "cond-window", "cons", "cos", "cosh",
+        "count", "diff-window", "div", "ensure-value", "ensure-weighted-value",
+        "epoch", "epoch-day", "epoch-fields", "epoch-hour", "epoch-millisecond",
+        "epoch-minute", "epoch-month", "epoch-second", "epoch-weekday",
+        "epoch-year", "exp", "f", "field", "field-prop", "fields", "filter",
+        "first", "floor", "head", "if", "in", "integer", "language", "length",
+        "levenshtein", "linear-regression", "list", "ln", "log", "log10", "map",
+        "matches", "matches?", "max", "maximum", "md5", "mean", "median", "min",
+        "minimum", "missing", "missing-count", "missing?", "missing_count",
+        "mod", "mode", "normalize", "not", "nth", "occurrences", "or",
+        "percentile", "percentile-label", "population", "population-fraction",
+        "pow", "preferred", "preferred?", "quantile-label", "rand", "rand-int",
+        "random-value", "re-quote", "real", "replace", "replace-first", "rest",
+        "round", "row-number", "segment-label", "sha1", "sha256", "sin", "sinh",
+        "sqrt", "square", "standard-deviation", "standard_deviation", "str",
+        "subs", "sum", "sum-squares", "sum-window", "sum_squares", "summary",
+        "summary-no", "summary-str", "tail", "tan", "tanh", "to-degrees",
+        "to-radians", "variance", "vectorize", "weighted-random-value", "window",
+        "winnow", "within-percentiles?", "z-score",
+    )
+
+    valid_name = r'(?!#)[\w!$%*+<=>?/.#-]+'
+
+    tokens = {
+        'root': [
+            # whitespaces - usually not relevant
+            (r'[,\s]+', Text),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            (r'0x-?[a-f\d]+', Number.Hex),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"\\(.|[a-z]+)", String.Char),
+
+            # expression template placeholder
+            (r'_', String.Symbol),
+
+            # highlight the special forms
+            (words(special_forms, suffix=' '), Keyword),
+
+            # highlight the builtins
+            (words(builtins, suffix=' '), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # parentheses
+            (r'(\(|\))', Punctuation),
+        ],
+    }
+
+
+class SnowballLexer(ExtendedRegexLexer):
+    """
+    Lexer for `Snowball <http://snowballstem.org/>`_ source code.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'Snowball'
+    aliases = ['snowball']
+    filenames = ['*.sbl']
+
+    _ws = r'\n\r\t '
+
+    def __init__(self, **options):
+        self._reset_stringescapes()
+        ExtendedRegexLexer.__init__(self, **options)
+
+    def _reset_stringescapes(self):
+        self._start = "'"
+        self._end = "'"
+
+    def _string(do_string_first):
+        def callback(lexer, match, ctx):
+            s = match.start()
+            text = match.group()
+            string = re.compile(r'([^%s]*)(.)' % re.escape(lexer._start)).match
+            escape = re.compile(r'([^%s]*)(.)' % re.escape(lexer._end)).match
+            pos = 0
+            do_string = do_string_first
+            while pos < len(text):
+                if do_string:
+                    match = string(text, pos)
+                    yield s + match.start(1), String.Single, match.group(1)
+                    if match.group(2) == "'":
+                        yield s + match.start(2), String.Single, match.group(2)
+                        ctx.stack.pop()
+                        break
+                    yield s + match.start(2), String.Escape, match.group(2)
+                    pos = match.end()
+                match = escape(text, pos)
+                yield s + match.start(), String.Escape, match.group()
+                if match.group(2) != lexer._end:
+                    ctx.stack[-1] = 'escape'
+                    break
+                pos = match.end()
+                do_string = True
+            ctx.pos = s + match.end()
+        return callback
+
+    def _stringescapes(lexer, match, ctx):
+        lexer._start = match.group(3)
+        lexer._end = match.group(5)
+        return bygroups(Keyword.Reserved, Text, String.Escape, Text,
+                        String.Escape)(lexer, match, ctx)
+
+    tokens = {
+        'root': [
+            (words(('len', 'lenof'), suffix=r'\b'), Operator.Word),
+            include('root1'),
+        ],
+        'root1': [
+            (r'[%s]+' % _ws, Text),
+            (r'\d+', Number.Integer),
+            (r"'", String.Single, 'string'),
+            (r'[()]', Punctuation),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'//.*', Comment.Single),
+            (r'[!*+\-/<=>]=|[-=]>|<[+-]|[$*+\-/<=>?\[\]]', Operator),
+            (words(('as', 'get', 'hex', 'among', 'define', 'decimal',
+                    'backwardmode'), suffix=r'\b'),
+             Keyword.Reserved),
+            (words(('strings', 'booleans', 'integers', 'routines', 'externals',
+                    'groupings'), suffix=r'\b'),
+             Keyword.Reserved, 'declaration'),
+            (words(('do', 'or', 'and', 'for', 'hop', 'non', 'not', 'set', 'try',
+                    'fail', 'goto', 'loop', 'next', 'test', 'true',
+                    'false', 'unset', 'atmark', 'attach', 'delete', 'gopast',
+                    'insert', 'repeat', 'sizeof', 'tomark', 'atleast',
+                    'atlimit', 'reverse', 'setmark', 'tolimit', 'setlimit',
+                    'backwards', 'substring'), suffix=r'\b'),
+             Operator.Word),
+            (words(('size', 'limit', 'cursor', 'maxint', 'minint'),
+                   suffix=r'\b'),
+             Name.Builtin),
+            (r'(stringdef\b)([%s]*)([^%s]+)' % (_ws, _ws),
+             bygroups(Keyword.Reserved, Text, String.Escape)),
+            (r'(stringescapes\b)([%s]*)(.)([%s]*)(.)' % (_ws, _ws),
+             _stringescapes),
+            (r'[A-Za-z]\w*', Name),
+        ],
+        'declaration': [
+            (r'\)', Punctuation, '#pop'),
+            (words(('len', 'lenof'), suffix=r'\b'), Name,
+             ('root1', 'declaration')),
+            include('root1'),
+        ],
+        'string': [
+            (r"[^']*'", _string(True)),
+        ],
+        'escape': [
+            (r"[^']*'", _string(False)),
+        ],
+    }
+
+    def get_tokens_unprocessed(self, text=None, context=None):
+        self._reset_stringescapes()
+        return ExtendedRegexLexer.get_tokens_unprocessed(self, text, context)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_scilab_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_scilab_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_scilab_builtins.py	(revision 1126)
@@ -0,0 +1,3094 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._scilab_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtin list for the ScilabLexer.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Autogenerated
+
+commands_kw = (
+    'abort',
+    'apropos',
+    'break',
+    'case',
+    'catch',
+    'continue',
+    'do',
+    'else',
+    'elseif',
+    'end',
+    'endfunction',
+    'for',
+    'function',
+    'help',
+    'if',
+    'pause',
+    'quit',
+    'select',
+    'then',
+    'try',
+    'while',
+)
+
+functions_kw = (
+    '!!_invoke_',
+    '%H5Object_e',
+    '%H5Object_fieldnames',
+    '%H5Object_p',
+    '%XMLAttr_6',
+    '%XMLAttr_e',
+    '%XMLAttr_i_XMLElem',
+    '%XMLAttr_length',
+    '%XMLAttr_p',
+    '%XMLAttr_size',
+    '%XMLDoc_6',
+    '%XMLDoc_e',
+    '%XMLDoc_i_XMLList',
+    '%XMLDoc_p',
+    '%XMLElem_6',
+    '%XMLElem_e',
+    '%XMLElem_i_XMLDoc',
+    '%XMLElem_i_XMLElem',
+    '%XMLElem_i_XMLList',
+    '%XMLElem_p',
+    '%XMLList_6',
+    '%XMLList_e',
+    '%XMLList_i_XMLElem',
+    '%XMLList_i_XMLList',
+    '%XMLList_length',
+    '%XMLList_p',
+    '%XMLList_size',
+    '%XMLNs_6',
+    '%XMLNs_e',
+    '%XMLNs_i_XMLElem',
+    '%XMLNs_p',
+    '%XMLSet_6',
+    '%XMLSet_e',
+    '%XMLSet_length',
+    '%XMLSet_p',
+    '%XMLSet_size',
+    '%XMLValid_p',
+    '%_EClass_6',
+    '%_EClass_e',
+    '%_EClass_p',
+    '%_EObj_0',
+    '%_EObj_1__EObj',
+    '%_EObj_1_b',
+    '%_EObj_1_c',
+    '%_EObj_1_i',
+    '%_EObj_1_s',
+    '%_EObj_2__EObj',
+    '%_EObj_2_b',
+    '%_EObj_2_c',
+    '%_EObj_2_i',
+    '%_EObj_2_s',
+    '%_EObj_3__EObj',
+    '%_EObj_3_b',
+    '%_EObj_3_c',
+    '%_EObj_3_i',
+    '%_EObj_3_s',
+    '%_EObj_4__EObj',
+    '%_EObj_4_b',
+    '%_EObj_4_c',
+    '%_EObj_4_i',
+    '%_EObj_4_s',
+    '%_EObj_5',
+    '%_EObj_6',
+    '%_EObj_a__EObj',
+    '%_EObj_a_b',
+    '%_EObj_a_c',
+    '%_EObj_a_i',
+    '%_EObj_a_s',
+    '%_EObj_d__EObj',
+    '%_EObj_d_b',
+    '%_EObj_d_c',
+    '%_EObj_d_i',
+    '%_EObj_d_s',
+    '%_EObj_disp',
+    '%_EObj_e',
+    '%_EObj_g__EObj',
+    '%_EObj_g_b',
+    '%_EObj_g_c',
+    '%_EObj_g_i',
+    '%_EObj_g_s',
+    '%_EObj_h__EObj',
+    '%_EObj_h_b',
+    '%_EObj_h_c',
+    '%_EObj_h_i',
+    '%_EObj_h_s',
+    '%_EObj_i__EObj',
+    '%_EObj_j__EObj',
+    '%_EObj_j_b',
+    '%_EObj_j_c',
+    '%_EObj_j_i',
+    '%_EObj_j_s',
+    '%_EObj_k__EObj',
+    '%_EObj_k_b',
+    '%_EObj_k_c',
+    '%_EObj_k_i',
+    '%_EObj_k_s',
+    '%_EObj_l__EObj',
+    '%_EObj_l_b',
+    '%_EObj_l_c',
+    '%_EObj_l_i',
+    '%_EObj_l_s',
+    '%_EObj_m__EObj',
+    '%_EObj_m_b',
+    '%_EObj_m_c',
+    '%_EObj_m_i',
+    '%_EObj_m_s',
+    '%_EObj_n__EObj',
+    '%_EObj_n_b',
+    '%_EObj_n_c',
+    '%_EObj_n_i',
+    '%_EObj_n_s',
+    '%_EObj_o__EObj',
+    '%_EObj_o_b',
+    '%_EObj_o_c',
+    '%_EObj_o_i',
+    '%_EObj_o_s',
+    '%_EObj_p',
+    '%_EObj_p__EObj',
+    '%_EObj_p_b',
+    '%_EObj_p_c',
+    '%_EObj_p_i',
+    '%_EObj_p_s',
+    '%_EObj_q__EObj',
+    '%_EObj_q_b',
+    '%_EObj_q_c',
+    '%_EObj_q_i',
+    '%_EObj_q_s',
+    '%_EObj_r__EObj',
+    '%_EObj_r_b',
+    '%_EObj_r_c',
+    '%_EObj_r_i',
+    '%_EObj_r_s',
+    '%_EObj_s__EObj',
+    '%_EObj_s_b',
+    '%_EObj_s_c',
+    '%_EObj_s_i',
+    '%_EObj_s_s',
+    '%_EObj_t',
+    '%_EObj_x__EObj',
+    '%_EObj_x_b',
+    '%_EObj_x_c',
+    '%_EObj_x_i',
+    '%_EObj_x_s',
+    '%_EObj_y__EObj',
+    '%_EObj_y_b',
+    '%_EObj_y_c',
+    '%_EObj_y_i',
+    '%_EObj_y_s',
+    '%_EObj_z__EObj',
+    '%_EObj_z_b',
+    '%_EObj_z_c',
+    '%_EObj_z_i',
+    '%_EObj_z_s',
+    '%_eigs',
+    '%_load',
+    '%b_1__EObj',
+    '%b_2__EObj',
+    '%b_3__EObj',
+    '%b_4__EObj',
+    '%b_a__EObj',
+    '%b_d__EObj',
+    '%b_g__EObj',
+    '%b_h__EObj',
+    '%b_i_XMLList',
+    '%b_i__EObj',
+    '%b_j__EObj',
+    '%b_k__EObj',
+    '%b_l__EObj',
+    '%b_m__EObj',
+    '%b_n__EObj',
+    '%b_o__EObj',
+    '%b_p__EObj',
+    '%b_q__EObj',
+    '%b_r__EObj',
+    '%b_s__EObj',
+    '%b_x__EObj',
+    '%b_y__EObj',
+    '%b_z__EObj',
+    '%c_1__EObj',
+    '%c_2__EObj',
+    '%c_3__EObj',
+    '%c_4__EObj',
+    '%c_a__EObj',
+    '%c_d__EObj',
+    '%c_g__EObj',
+    '%c_h__EObj',
+    '%c_i_XMLAttr',
+    '%c_i_XMLDoc',
+    '%c_i_XMLElem',
+    '%c_i_XMLList',
+    '%c_i__EObj',
+    '%c_j__EObj',
+    '%c_k__EObj',
+    '%c_l__EObj',
+    '%c_m__EObj',
+    '%c_n__EObj',
+    '%c_o__EObj',
+    '%c_p__EObj',
+    '%c_q__EObj',
+    '%c_r__EObj',
+    '%c_s__EObj',
+    '%c_x__EObj',
+    '%c_y__EObj',
+    '%c_z__EObj',
+    '%ce_i_XMLList',
+    '%fptr_i_XMLList',
+    '%h_i_XMLList',
+    '%hm_i_XMLList',
+    '%i_1__EObj',
+    '%i_2__EObj',
+    '%i_3__EObj',
+    '%i_4__EObj',
+    '%i_a__EObj',
+    '%i_abs',
+    '%i_cumprod',
+    '%i_cumsum',
+    '%i_d__EObj',
+    '%i_diag',
+    '%i_g__EObj',
+    '%i_h__EObj',
+    '%i_i_XMLList',
+    '%i_i__EObj',
+    '%i_j__EObj',
+    '%i_k__EObj',
+    '%i_l__EObj',
+    '%i_m__EObj',
+    '%i_matrix',
+    '%i_max',
+    '%i_maxi',
+    '%i_min',
+    '%i_mini',
+    '%i_mput',
+    '%i_n__EObj',
+    '%i_o__EObj',
+    '%i_p',
+    '%i_p__EObj',
+    '%i_prod',
+    '%i_q__EObj',
+    '%i_r__EObj',
+    '%i_s__EObj',
+    '%i_sum',
+    '%i_tril',
+    '%i_triu',
+    '%i_x__EObj',
+    '%i_y__EObj',
+    '%i_z__EObj',
+    '%ip_i_XMLList',
+    '%l_i_XMLList',
+    '%l_i__EObj',
+    '%lss_i_XMLList',
+    '%mc_i_XMLList',
+    '%msp_full',
+    '%msp_i_XMLList',
+    '%msp_spget',
+    '%p_i_XMLList',
+    '%ptr_i_XMLList',
+    '%r_i_XMLList',
+    '%s_1__EObj',
+    '%s_2__EObj',
+    '%s_3__EObj',
+    '%s_4__EObj',
+    '%s_a__EObj',
+    '%s_d__EObj',
+    '%s_g__EObj',
+    '%s_h__EObj',
+    '%s_i_XMLList',
+    '%s_i__EObj',
+    '%s_j__EObj',
+    '%s_k__EObj',
+    '%s_l__EObj',
+    '%s_m__EObj',
+    '%s_n__EObj',
+    '%s_o__EObj',
+    '%s_p__EObj',
+    '%s_q__EObj',
+    '%s_r__EObj',
+    '%s_s__EObj',
+    '%s_x__EObj',
+    '%s_y__EObj',
+    '%s_z__EObj',
+    '%sp_i_XMLList',
+    '%spb_i_XMLList',
+    '%st_i_XMLList',
+    'Calendar',
+    'ClipBoard',
+    'Matplot',
+    'Matplot1',
+    'PlaySound',
+    'TCL_DeleteInterp',
+    'TCL_DoOneEvent',
+    'TCL_EvalFile',
+    'TCL_EvalStr',
+    'TCL_ExistArray',
+    'TCL_ExistInterp',
+    'TCL_ExistVar',
+    'TCL_GetVar',
+    'TCL_GetVersion',
+    'TCL_SetVar',
+    'TCL_UnsetVar',
+    'TCL_UpVar',
+    '_',
+    '_code2str',
+    '_d',
+    '_str2code',
+    'about',
+    'abs',
+    'acos',
+    'addModulePreferences',
+    'addcolor',
+    'addf',
+    'addhistory',
+    'addinter',
+    'addlocalizationdomain',
+    'amell',
+    'and',
+    'argn',
+    'arl2_ius',
+    'ascii',
+    'asin',
+    'atan',
+    'backslash',
+    'balanc',
+    'banner',
+    'base2dec',
+    'basename',
+    'bdiag',
+    'beep',
+    'besselh',
+    'besseli',
+    'besselj',
+    'besselk',
+    'bessely',
+    'beta',
+    'bezout',
+    'bfinit',
+    'blkfc1i',
+    'blkslvi',
+    'bool2s',
+    'browsehistory',
+    'browsevar',
+    'bsplin3val',
+    'buildDoc',
+    'buildouttb',
+    'bvode',
+    'c_link',
+    'call',
+    'callblk',
+    'captions',
+    'cd',
+    'cdfbet',
+    'cdfbin',
+    'cdfchi',
+    'cdfchn',
+    'cdff',
+    'cdffnc',
+    'cdfgam',
+    'cdfnbn',
+    'cdfnor',
+    'cdfpoi',
+    'cdft',
+    'ceil',
+    'champ',
+    'champ1',
+    'chdir',
+    'chol',
+    'clc',
+    'clean',
+    'clear',
+    'clearfun',
+    'clearglobal',
+    'closeEditor',
+    'closeEditvar',
+    'closeXcos',
+    'code2str',
+    'coeff',
+    'color',
+    'comp',
+    'completion',
+    'conj',
+    'contour2di',
+    'contr',
+    'conv2',
+    'convstr',
+    'copy',
+    'copyfile',
+    'corr',
+    'cos',
+    'coserror',
+    'createdir',
+    'cshep2d',
+    'csvDefault',
+    'csvIsnum',
+    'csvRead',
+    'csvStringToDouble',
+    'csvTextScan',
+    'csvWrite',
+    'ctree2',
+    'ctree3',
+    'ctree4',
+    'cumprod',
+    'cumsum',
+    'curblock',
+    'curblockc',
+    'daskr',
+    'dasrt',
+    'dassl',
+    'data2sig',
+    'datatipCreate',
+    'datatipManagerMode',
+    'datatipMove',
+    'datatipRemove',
+    'datatipSetDisplay',
+    'datatipSetInterp',
+    'datatipSetOrientation',
+    'datatipSetStyle',
+    'datatipToggle',
+    'dawson',
+    'dct',
+    'debug',
+    'dec2base',
+    'deff',
+    'definedfields',
+    'degree',
+    'delbpt',
+    'delete',
+    'deletefile',
+    'delip',
+    'delmenu',
+    'det',
+    'dgettext',
+    'dhinf',
+    'diag',
+    'diary',
+    'diffobjs',
+    'disp',
+    'dispbpt',
+    'displayhistory',
+    'disposefftwlibrary',
+    'dlgamma',
+    'dnaupd',
+    'dneupd',
+    'double',
+    'drawaxis',
+    'drawlater',
+    'drawnow',
+    'driver',
+    'dsaupd',
+    'dsearch',
+    'dseupd',
+    'dst',
+    'duplicate',
+    'editvar',
+    'emptystr',
+    'end_scicosim',
+    'ereduc',
+    'erf',
+    'erfc',
+    'erfcx',
+    'erfi',
+    'errcatch',
+    'errclear',
+    'error',
+    'eval_cshep2d',
+    'exec',
+    'execstr',
+    'exists',
+    'exit',
+    'exp',
+    'expm',
+    'exportUI',
+    'export_to_hdf5',
+    'eye',
+    'fadj2sp',
+    'fec',
+    'feval',
+    'fft',
+    'fftw',
+    'fftw_flags',
+    'fftw_forget_wisdom',
+    'fftwlibraryisloaded',
+    'figure',
+    'file',
+    'filebrowser',
+    'fileext',
+    'fileinfo',
+    'fileparts',
+    'filesep',
+    'find',
+    'findBD',
+    'findfiles',
+    'fire_closing_finished',
+    'floor',
+    'format',
+    'fort',
+    'fprintfMat',
+    'freq',
+    'frexp',
+    'fromc',
+    'fromjava',
+    'fscanfMat',
+    'fsolve',
+    'fstair',
+    'full',
+    'fullpath',
+    'funcprot',
+    'funptr',
+    'gamma',
+    'gammaln',
+    'geom3d',
+    'get',
+    'getURL',
+    'get_absolute_file_path',
+    'get_fftw_wisdom',
+    'getblocklabel',
+    'getcallbackobject',
+    'getdate',
+    'getdebuginfo',
+    'getdefaultlanguage',
+    'getdrives',
+    'getdynlibext',
+    'getenv',
+    'getfield',
+    'gethistory',
+    'gethistoryfile',
+    'getinstalledlookandfeels',
+    'getio',
+    'getlanguage',
+    'getlongpathname',
+    'getlookandfeel',
+    'getmd5',
+    'getmemory',
+    'getmodules',
+    'getos',
+    'getpid',
+    'getrelativefilename',
+    'getscicosvars',
+    'getscilabmode',
+    'getshortpathname',
+    'gettext',
+    'getvariablesonstack',
+    'getversion',
+    'glist',
+    'global',
+    'glue',
+    'grand',
+    'graphicfunction',
+    'grayplot',
+    'grep',
+    'gsort',
+    'gstacksize',
+    'h5attr',
+    'h5close',
+    'h5cp',
+    'h5dataset',
+    'h5dump',
+    'h5exists',
+    'h5flush',
+    'h5get',
+    'h5group',
+    'h5isArray',
+    'h5isAttr',
+    'h5isCompound',
+    'h5isFile',
+    'h5isGroup',
+    'h5isList',
+    'h5isRef',
+    'h5isSet',
+    'h5isSpace',
+    'h5isType',
+    'h5isVlen',
+    'h5label',
+    'h5ln',
+    'h5ls',
+    'h5mount',
+    'h5mv',
+    'h5open',
+    'h5read',
+    'h5readattr',
+    'h5rm',
+    'h5umount',
+    'h5write',
+    'h5writeattr',
+    'havewindow',
+    'helpbrowser',
+    'hess',
+    'hinf',
+    'historymanager',
+    'historysize',
+    'host',
+    'htmlDump',
+    'htmlRead',
+    'htmlReadStr',
+    'htmlWrite',
+    'iconvert',
+    'ieee',
+    'ilib_verbose',
+    'imag',
+    'impl',
+    'import_from_hdf5',
+    'imult',
+    'inpnvi',
+    'int',
+    'int16',
+    'int2d',
+    'int32',
+    'int3d',
+    'int8',
+    'interp',
+    'interp2d',
+    'interp3d',
+    'intg',
+    'intppty',
+    'inttype',
+    'inv',
+    'invoke_lu',
+    'is_handle_valid',
+    'is_hdf5_file',
+    'isalphanum',
+    'isascii',
+    'isdef',
+    'isdigit',
+    'isdir',
+    'isequal',
+    'isequalbitwise',
+    'iserror',
+    'isfile',
+    'isglobal',
+    'isletter',
+    'isnum',
+    'isreal',
+    'iswaitingforinput',
+    'jallowClassReloading',
+    'jarray',
+    'jautoTranspose',
+    'jautoUnwrap',
+    'javaclasspath',
+    'javalibrarypath',
+    'jcast',
+    'jcompile',
+    'jconvMatrixMethod',
+    'jcreatejar',
+    'jdeff',
+    'jdisableTrace',
+    'jenableTrace',
+    'jexists',
+    'jgetclassname',
+    'jgetfield',
+    'jgetfields',
+    'jgetinfo',
+    'jgetmethods',
+    'jimport',
+    'jinvoke',
+    'jinvoke_db',
+    'jnewInstance',
+    'jremove',
+    'jsetfield',
+    'junwrap',
+    'junwraprem',
+    'jwrap',
+    'jwrapinfloat',
+    'kron',
+    'lasterror',
+    'ldiv',
+    'ldivf',
+    'legendre',
+    'length',
+    'lib',
+    'librarieslist',
+    'libraryinfo',
+    'light',
+    'linear_interpn',
+    'lines',
+    'link',
+    'linmeq',
+    'list',
+    'listvar_in_hdf5',
+    'load',
+    'loadGui',
+    'loadScicos',
+    'loadXcos',
+    'loadfftwlibrary',
+    'loadhistory',
+    'log',
+    'log1p',
+    'lsq',
+    'lsq_splin',
+    'lsqrsolve',
+    'lsslist',
+    'lstcat',
+    'lstsize',
+    'ltitr',
+    'lu',
+    'ludel',
+    'lufact',
+    'luget',
+    'lusolve',
+    'macr2lst',
+    'macr2tree',
+    'matfile_close',
+    'matfile_listvar',
+    'matfile_open',
+    'matfile_varreadnext',
+    'matfile_varwrite',
+    'matrix',
+    'max',
+    'maxfiles',
+    'mclearerr',
+    'mclose',
+    'meof',
+    'merror',
+    'messagebox',
+    'mfprintf',
+    'mfscanf',
+    'mget',
+    'mgeti',
+    'mgetl',
+    'mgetstr',
+    'min',
+    'mlist',
+    'mode',
+    'model2blk',
+    'mopen',
+    'move',
+    'movefile',
+    'mprintf',
+    'mput',
+    'mputl',
+    'mputstr',
+    'mscanf',
+    'mseek',
+    'msprintf',
+    'msscanf',
+    'mtell',
+    'mtlb_mode',
+    'mtlb_sparse',
+    'mucomp',
+    'mulf',
+    'name2rgb',
+    'nearfloat',
+    'newaxes',
+    'newest',
+    'newfun',
+    'nnz',
+    'norm',
+    'notify',
+    'number_properties',
+    'ode',
+    'odedc',
+    'ones',
+    'openged',
+    'opentk',
+    'optim',
+    'or',
+    'ordmmd',
+    'parallel_concurrency',
+    'parallel_run',
+    'param3d',
+    'param3d1',
+    'part',
+    'pathconvert',
+    'pathsep',
+    'phase_simulation',
+    'plot2d',
+    'plot2d1',
+    'plot2d2',
+    'plot2d3',
+    'plot2d4',
+    'plot3d',
+    'plot3d1',
+    'plotbrowser',
+    'pointer_xproperty',
+    'poly',
+    'ppol',
+    'pppdiv',
+    'predef',
+    'preferences',
+    'print',
+    'printf',
+    'printfigure',
+    'printsetupbox',
+    'prod',
+    'progressionbar',
+    'prompt',
+    'pwd',
+    'qld',
+    'qp_solve',
+    'qr',
+    'raise_window',
+    'rand',
+    'rankqr',
+    'rat',
+    'rcond',
+    'rdivf',
+    'read',
+    'read4b',
+    'read_csv',
+    'readb',
+    'readgateway',
+    'readmps',
+    'real',
+    'realtime',
+    'realtimeinit',
+    'regexp',
+    'relocate_handle',
+    'remez',
+    'removeModulePreferences',
+    'removedir',
+    'removelinehistory',
+    'res_with_prec',
+    'resethistory',
+    'residu',
+    'resume',
+    'return',
+    'ricc',
+    'rlist',
+    'roots',
+    'rotate_axes',
+    'round',
+    'rpem',
+    'rtitr',
+    'rubberbox',
+    'save',
+    'saveGui',
+    'saveafterncommands',
+    'saveconsecutivecommands',
+    'savehistory',
+    'schur',
+    'sci_haltscicos',
+    'sci_tree2',
+    'sci_tree3',
+    'sci_tree4',
+    'sciargs',
+    'scicos_debug',
+    'scicos_debug_count',
+    'scicos_time',
+    'scicosim',
+    'scinotes',
+    'sctree',
+    'semidef',
+    'set',
+    'set_blockerror',
+    'set_fftw_wisdom',
+    'set_xproperty',
+    'setbpt',
+    'setdefaultlanguage',
+    'setenv',
+    'setfield',
+    'sethistoryfile',
+    'setlanguage',
+    'setlookandfeel',
+    'setmenu',
+    'sfact',
+    'sfinit',
+    'show_window',
+    'sident',
+    'sig2data',
+    'sign',
+    'simp',
+    'simp_mode',
+    'sin',
+    'size',
+    'slash',
+    'sleep',
+    'sorder',
+    'sparse',
+    'spchol',
+    'spcompack',
+    'spec',
+    'spget',
+    'splin',
+    'splin2d',
+    'splin3d',
+    'splitURL',
+    'spones',
+    'sprintf',
+    'sqrt',
+    'stacksize',
+    'str2code',
+    'strcat',
+    'strchr',
+    'strcmp',
+    'strcspn',
+    'strindex',
+    'string',
+    'stringbox',
+    'stripblanks',
+    'strncpy',
+    'strrchr',
+    'strrev',
+    'strsplit',
+    'strspn',
+    'strstr',
+    'strsubst',
+    'strtod',
+    'strtok',
+    'subf',
+    'sum',
+    'svd',
+    'swap_handles',
+    'symfcti',
+    'syredi',
+    'system_getproperty',
+    'system_setproperty',
+    'ta2lpd',
+    'tan',
+    'taucs_chdel',
+    'taucs_chfact',
+    'taucs_chget',
+    'taucs_chinfo',
+    'taucs_chsolve',
+    'tempname',
+    'testmatrix',
+    'timer',
+    'tlist',
+    'tohome',
+    'tokens',
+    'toolbar',
+    'toprint',
+    'tr_zer',
+    'tril',
+    'triu',
+    'type',
+    'typename',
+    'uiDisplayTree',
+    'uicontextmenu',
+    'uicontrol',
+    'uigetcolor',
+    'uigetdir',
+    'uigetfile',
+    'uigetfont',
+    'uimenu',
+    'uint16',
+    'uint32',
+    'uint8',
+    'uipopup',
+    'uiputfile',
+    'uiwait',
+    'ulink',
+    'umf_ludel',
+    'umf_lufact',
+    'umf_luget',
+    'umf_luinfo',
+    'umf_lusolve',
+    'umfpack',
+    'unglue',
+    'unix',
+    'unsetmenu',
+    'unzoom',
+    'updatebrowsevar',
+    'usecanvas',
+    'useeditor',
+    'user',
+    'var2vec',
+    'varn',
+    'vec2var',
+    'waitbar',
+    'warnBlockByUID',
+    'warning',
+    'what',
+    'where',
+    'whereis',
+    'who',
+    'winsid',
+    'with_module',
+    'writb',
+    'write',
+    'write4b',
+    'write_csv',
+    'x_choose',
+    'x_choose_modeless',
+    'x_dialog',
+    'x_mdialog',
+    'xarc',
+    'xarcs',
+    'xarrows',
+    'xchange',
+    'xchoicesi',
+    'xclick',
+    'xcos',
+    'xcosAddToolsMenu',
+    'xcosConfigureXmlFile',
+    'xcosDiagramToScilab',
+    'xcosPalCategoryAdd',
+    'xcosPalDelete',
+    'xcosPalDisable',
+    'xcosPalEnable',
+    'xcosPalGenerateIcon',
+    'xcosPalGet',
+    'xcosPalLoad',
+    'xcosPalMove',
+    'xcosSimulationStarted',
+    'xcosUpdateBlock',
+    'xdel',
+    'xend',
+    'xfarc',
+    'xfarcs',
+    'xfpoly',
+    'xfpolys',
+    'xfrect',
+    'xget',
+    'xgetmouse',
+    'xgraduate',
+    'xgrid',
+    'xinit',
+    'xlfont',
+    'xls_open',
+    'xls_read',
+    'xmlAddNs',
+    'xmlAppend',
+    'xmlAsNumber',
+    'xmlAsText',
+    'xmlDTD',
+    'xmlDelete',
+    'xmlDocument',
+    'xmlDump',
+    'xmlElement',
+    'xmlFormat',
+    'xmlGetNsByHref',
+    'xmlGetNsByPrefix',
+    'xmlGetOpenDocs',
+    'xmlIsValidObject',
+    'xmlName',
+    'xmlNs',
+    'xmlRead',
+    'xmlReadStr',
+    'xmlRelaxNG',
+    'xmlRemove',
+    'xmlSchema',
+    'xmlSetAttributes',
+    'xmlValidate',
+    'xmlWrite',
+    'xmlXPath',
+    'xname',
+    'xpause',
+    'xpoly',
+    'xpolys',
+    'xrect',
+    'xrects',
+    'xs2bmp',
+    'xs2emf',
+    'xs2eps',
+    'xs2gif',
+    'xs2jpg',
+    'xs2pdf',
+    'xs2png',
+    'xs2ppm',
+    'xs2ps',
+    'xs2svg',
+    'xsegs',
+    'xset',
+    'xstring',
+    'xstringb',
+    'xtitle',
+    'zeros',
+    'znaupd',
+    'zneupd',
+    'zoom_rect',
+)
+
+macros_kw = (
+    '!_deff_wrapper',
+    '%0_i_st',
+    '%3d_i_h',
+    '%Block_xcosUpdateBlock',
+    '%TNELDER_p',
+    '%TNELDER_string',
+    '%TNMPLOT_p',
+    '%TNMPLOT_string',
+    '%TOPTIM_p',
+    '%TOPTIM_string',
+    '%TSIMPLEX_p',
+    '%TSIMPLEX_string',
+    '%_EVoid_p',
+    '%_gsort',
+    '%_listvarinfile',
+    '%_rlist',
+    '%_save',
+    '%_sodload',
+    '%_strsplit',
+    '%_unwrap',
+    '%ar_p',
+    '%asn',
+    '%b_a_b',
+    '%b_a_s',
+    '%b_c_s',
+    '%b_c_spb',
+    '%b_cumprod',
+    '%b_cumsum',
+    '%b_d_s',
+    '%b_diag',
+    '%b_e',
+    '%b_f_s',
+    '%b_f_spb',
+    '%b_g_s',
+    '%b_g_spb',
+    '%b_grand',
+    '%b_h_s',
+    '%b_h_spb',
+    '%b_i_b',
+    '%b_i_ce',
+    '%b_i_h',
+    '%b_i_hm',
+    '%b_i_s',
+    '%b_i_sp',
+    '%b_i_spb',
+    '%b_i_st',
+    '%b_iconvert',
+    '%b_l_b',
+    '%b_l_s',
+    '%b_m_b',
+    '%b_m_s',
+    '%b_matrix',
+    '%b_n_hm',
+    '%b_o_hm',
+    '%b_p_s',
+    '%b_prod',
+    '%b_r_b',
+    '%b_r_s',
+    '%b_s_b',
+    '%b_s_s',
+    '%b_string',
+    '%b_sum',
+    '%b_tril',
+    '%b_triu',
+    '%b_x_b',
+    '%b_x_s',
+    '%bicg',
+    '%bicgstab',
+    '%c_a_c',
+    '%c_b_c',
+    '%c_b_s',
+    '%c_diag',
+    '%c_dsearch',
+    '%c_e',
+    '%c_eye',
+    '%c_f_s',
+    '%c_grand',
+    '%c_i_c',
+    '%c_i_ce',
+    '%c_i_h',
+    '%c_i_hm',
+    '%c_i_lss',
+    '%c_i_r',
+    '%c_i_s',
+    '%c_i_st',
+    '%c_matrix',
+    '%c_n_l',
+    '%c_n_st',
+    '%c_o_l',
+    '%c_o_st',
+    '%c_ones',
+    '%c_rand',
+    '%c_tril',
+    '%c_triu',
+    '%cblock_c_cblock',
+    '%cblock_c_s',
+    '%cblock_e',
+    '%cblock_f_cblock',
+    '%cblock_p',
+    '%cblock_size',
+    '%ce_6',
+    '%ce_c_ce',
+    '%ce_e',
+    '%ce_f_ce',
+    '%ce_i_ce',
+    '%ce_i_s',
+    '%ce_i_st',
+    '%ce_matrix',
+    '%ce_p',
+    '%ce_size',
+    '%ce_string',
+    '%ce_t',
+    '%cgs',
+    '%champdat_i_h',
+    '%choose',
+    '%diagram_xcos',
+    '%dir_p',
+    '%fptr_i_st',
+    '%grand_perm',
+    '%grayplot_i_h',
+    '%h_i_st',
+    '%hmS_k_hmS_generic',
+    '%hm_1_hm',
+    '%hm_1_s',
+    '%hm_2_hm',
+    '%hm_2_s',
+    '%hm_3_hm',
+    '%hm_3_s',
+    '%hm_4_hm',
+    '%hm_4_s',
+    '%hm_5',
+    '%hm_a_hm',
+    '%hm_a_r',
+    '%hm_a_s',
+    '%hm_abs',
+    '%hm_and',
+    '%hm_bool2s',
+    '%hm_c_hm',
+    '%hm_ceil',
+    '%hm_conj',
+    '%hm_cos',
+    '%hm_cumprod',
+    '%hm_cumsum',
+    '%hm_d_hm',
+    '%hm_d_s',
+    '%hm_degree',
+    '%hm_dsearch',
+    '%hm_e',
+    '%hm_exp',
+    '%hm_eye',
+    '%hm_f_hm',
+    '%hm_find',
+    '%hm_floor',
+    '%hm_g_hm',
+    '%hm_grand',
+    '%hm_gsort',
+    '%hm_h_hm',
+    '%hm_i_b',
+    '%hm_i_ce',
+    '%hm_i_h',
+    '%hm_i_hm',
+    '%hm_i_i',
+    '%hm_i_p',
+    '%hm_i_r',
+    '%hm_i_s',
+    '%hm_i_st',
+    '%hm_iconvert',
+    '%hm_imag',
+    '%hm_int',
+    '%hm_isnan',
+    '%hm_isreal',
+    '%hm_j_hm',
+    '%hm_j_s',
+    '%hm_k_hm',
+    '%hm_k_s',
+    '%hm_log',
+    '%hm_m_p',
+    '%hm_m_r',
+    '%hm_m_s',
+    '%hm_matrix',
+    '%hm_max',
+    '%hm_mean',
+    '%hm_median',
+    '%hm_min',
+    '%hm_n_b',
+    '%hm_n_c',
+    '%hm_n_hm',
+    '%hm_n_i',
+    '%hm_n_p',
+    '%hm_n_s',
+    '%hm_o_b',
+    '%hm_o_c',
+    '%hm_o_hm',
+    '%hm_o_i',
+    '%hm_o_p',
+    '%hm_o_s',
+    '%hm_ones',
+    '%hm_or',
+    '%hm_p',
+    '%hm_prod',
+    '%hm_q_hm',
+    '%hm_r_s',
+    '%hm_rand',
+    '%hm_real',
+    '%hm_round',
+    '%hm_s',
+    '%hm_s_hm',
+    '%hm_s_r',
+    '%hm_s_s',
+    '%hm_sign',
+    '%hm_sin',
+    '%hm_size',
+    '%hm_sqrt',
+    '%hm_stdev',
+    '%hm_string',
+    '%hm_sum',
+    '%hm_x_hm',
+    '%hm_x_p',
+    '%hm_x_s',
+    '%hm_zeros',
+    '%i_1_s',
+    '%i_2_s',
+    '%i_3_s',
+    '%i_4_s',
+    '%i_Matplot',
+    '%i_a_i',
+    '%i_a_s',
+    '%i_and',
+    '%i_ascii',
+    '%i_b_s',
+    '%i_bezout',
+    '%i_champ',
+    '%i_champ1',
+    '%i_contour',
+    '%i_contour2d',
+    '%i_d_i',
+    '%i_d_s',
+    '%i_dsearch',
+    '%i_e',
+    '%i_fft',
+    '%i_g_i',
+    '%i_gcd',
+    '%i_grand',
+    '%i_h_i',
+    '%i_i_ce',
+    '%i_i_h',
+    '%i_i_hm',
+    '%i_i_i',
+    '%i_i_s',
+    '%i_i_st',
+    '%i_j_i',
+    '%i_j_s',
+    '%i_l_s',
+    '%i_lcm',
+    '%i_length',
+    '%i_m_i',
+    '%i_m_s',
+    '%i_mfprintf',
+    '%i_mprintf',
+    '%i_msprintf',
+    '%i_n_s',
+    '%i_o_s',
+    '%i_or',
+    '%i_p_i',
+    '%i_p_s',
+    '%i_plot2d',
+    '%i_plot2d1',
+    '%i_plot2d2',
+    '%i_q_s',
+    '%i_r_i',
+    '%i_r_s',
+    '%i_round',
+    '%i_s_i',
+    '%i_s_s',
+    '%i_sign',
+    '%i_string',
+    '%i_x_i',
+    '%i_x_s',
+    '%ip_a_s',
+    '%ip_i_st',
+    '%ip_m_s',
+    '%ip_n_ip',
+    '%ip_o_ip',
+    '%ip_p',
+    '%ip_part',
+    '%ip_s_s',
+    '%ip_string',
+    '%k',
+    '%l_i_h',
+    '%l_i_s',
+    '%l_i_st',
+    '%l_isequal',
+    '%l_n_c',
+    '%l_n_l',
+    '%l_n_m',
+    '%l_n_p',
+    '%l_n_s',
+    '%l_n_st',
+    '%l_o_c',
+    '%l_o_l',
+    '%l_o_m',
+    '%l_o_p',
+    '%l_o_s',
+    '%l_o_st',
+    '%lss_a_lss',
+    '%lss_a_p',
+    '%lss_a_r',
+    '%lss_a_s',
+    '%lss_c_lss',
+    '%lss_c_p',
+    '%lss_c_r',
+    '%lss_c_s',
+    '%lss_e',
+    '%lss_eye',
+    '%lss_f_lss',
+    '%lss_f_p',
+    '%lss_f_r',
+    '%lss_f_s',
+    '%lss_i_ce',
+    '%lss_i_lss',
+    '%lss_i_p',
+    '%lss_i_r',
+    '%lss_i_s',
+    '%lss_i_st',
+    '%lss_inv',
+    '%lss_l_lss',
+    '%lss_l_p',
+    '%lss_l_r',
+    '%lss_l_s',
+    '%lss_m_lss',
+    '%lss_m_p',
+    '%lss_m_r',
+    '%lss_m_s',
+    '%lss_n_lss',
+    '%lss_n_p',
+    '%lss_n_r',
+    '%lss_n_s',
+    '%lss_norm',
+    '%lss_o_lss',
+    '%lss_o_p',
+    '%lss_o_r',
+    '%lss_o_s',
+    '%lss_ones',
+    '%lss_r_lss',
+    '%lss_r_p',
+    '%lss_r_r',
+    '%lss_r_s',
+    '%lss_rand',
+    '%lss_s',
+    '%lss_s_lss',
+    '%lss_s_p',
+    '%lss_s_r',
+    '%lss_s_s',
+    '%lss_size',
+    '%lss_t',
+    '%lss_v_lss',
+    '%lss_v_p',
+    '%lss_v_r',
+    '%lss_v_s',
+    '%lt_i_s',
+    '%m_n_l',
+    '%m_o_l',
+    '%mc_i_h',
+    '%mc_i_s',
+    '%mc_i_st',
+    '%mc_n_st',
+    '%mc_o_st',
+    '%mc_string',
+    '%mps_p',
+    '%mps_string',
+    '%msp_a_s',
+    '%msp_abs',
+    '%msp_e',
+    '%msp_find',
+    '%msp_i_s',
+    '%msp_i_st',
+    '%msp_length',
+    '%msp_m_s',
+    '%msp_maxi',
+    '%msp_n_msp',
+    '%msp_nnz',
+    '%msp_o_msp',
+    '%msp_p',
+    '%msp_sparse',
+    '%msp_spones',
+    '%msp_t',
+    '%p_a_lss',
+    '%p_a_r',
+    '%p_c_lss',
+    '%p_c_r',
+    '%p_cumprod',
+    '%p_cumsum',
+    '%p_d_p',
+    '%p_d_r',
+    '%p_d_s',
+    '%p_det',
+    '%p_e',
+    '%p_f_lss',
+    '%p_f_r',
+    '%p_grand',
+    '%p_i_ce',
+    '%p_i_h',
+    '%p_i_hm',
+    '%p_i_lss',
+    '%p_i_p',
+    '%p_i_r',
+    '%p_i_s',
+    '%p_i_st',
+    '%p_inv',
+    '%p_j_s',
+    '%p_k_p',
+    '%p_k_r',
+    '%p_k_s',
+    '%p_l_lss',
+    '%p_l_p',
+    '%p_l_r',
+    '%p_l_s',
+    '%p_m_hm',
+    '%p_m_lss',
+    '%p_m_r',
+    '%p_matrix',
+    '%p_n_l',
+    '%p_n_lss',
+    '%p_n_r',
+    '%p_o_l',
+    '%p_o_lss',
+    '%p_o_r',
+    '%p_o_sp',
+    '%p_p_s',
+    '%p_part',
+    '%p_prod',
+    '%p_q_p',
+    '%p_q_r',
+    '%p_q_s',
+    '%p_r_lss',
+    '%p_r_p',
+    '%p_r_r',
+    '%p_r_s',
+    '%p_s_lss',
+    '%p_s_r',
+    '%p_simp',
+    '%p_string',
+    '%p_sum',
+    '%p_v_lss',
+    '%p_v_p',
+    '%p_v_r',
+    '%p_v_s',
+    '%p_x_hm',
+    '%p_x_r',
+    '%p_y_p',
+    '%p_y_r',
+    '%p_y_s',
+    '%p_z_p',
+    '%p_z_r',
+    '%p_z_s',
+    '%pcg',
+    '%plist_p',
+    '%plist_string',
+    '%r_0',
+    '%r_a_hm',
+    '%r_a_lss',
+    '%r_a_p',
+    '%r_a_r',
+    '%r_a_s',
+    '%r_c_lss',
+    '%r_c_p',
+    '%r_c_r',
+    '%r_c_s',
+    '%r_clean',
+    '%r_cumprod',
+    '%r_cumsum',
+    '%r_d_p',
+    '%r_d_r',
+    '%r_d_s',
+    '%r_det',
+    '%r_diag',
+    '%r_e',
+    '%r_eye',
+    '%r_f_lss',
+    '%r_f_p',
+    '%r_f_r',
+    '%r_f_s',
+    '%r_i_ce',
+    '%r_i_hm',
+    '%r_i_lss',
+    '%r_i_p',
+    '%r_i_r',
+    '%r_i_s',
+    '%r_i_st',
+    '%r_inv',
+    '%r_j_s',
+    '%r_k_p',
+    '%r_k_r',
+    '%r_k_s',
+    '%r_l_lss',
+    '%r_l_p',
+    '%r_l_r',
+    '%r_l_s',
+    '%r_m_hm',
+    '%r_m_lss',
+    '%r_m_p',
+    '%r_m_r',
+    '%r_m_s',
+    '%r_matrix',
+    '%r_n_lss',
+    '%r_n_p',
+    '%r_n_r',
+    '%r_n_s',
+    '%r_norm',
+    '%r_o_lss',
+    '%r_o_p',
+    '%r_o_r',
+    '%r_o_s',
+    '%r_ones',
+    '%r_p',
+    '%r_p_s',
+    '%r_prod',
+    '%r_q_p',
+    '%r_q_r',
+    '%r_q_s',
+    '%r_r_lss',
+    '%r_r_p',
+    '%r_r_r',
+    '%r_r_s',
+    '%r_rand',
+    '%r_s',
+    '%r_s_hm',
+    '%r_s_lss',
+    '%r_s_p',
+    '%r_s_r',
+    '%r_s_s',
+    '%r_simp',
+    '%r_size',
+    '%r_string',
+    '%r_sum',
+    '%r_t',
+    '%r_tril',
+    '%r_triu',
+    '%r_v_lss',
+    '%r_v_p',
+    '%r_v_r',
+    '%r_v_s',
+    '%r_varn',
+    '%r_x_p',
+    '%r_x_r',
+    '%r_x_s',
+    '%r_y_p',
+    '%r_y_r',
+    '%r_y_s',
+    '%r_z_p',
+    '%r_z_r',
+    '%r_z_s',
+    '%s_1_hm',
+    '%s_1_i',
+    '%s_2_hm',
+    '%s_2_i',
+    '%s_3_hm',
+    '%s_3_i',
+    '%s_4_hm',
+    '%s_4_i',
+    '%s_5',
+    '%s_a_b',
+    '%s_a_hm',
+    '%s_a_i',
+    '%s_a_ip',
+    '%s_a_lss',
+    '%s_a_msp',
+    '%s_a_r',
+    '%s_a_sp',
+    '%s_and',
+    '%s_b_i',
+    '%s_b_s',
+    '%s_bezout',
+    '%s_c_b',
+    '%s_c_cblock',
+    '%s_c_lss',
+    '%s_c_r',
+    '%s_c_sp',
+    '%s_d_b',
+    '%s_d_i',
+    '%s_d_p',
+    '%s_d_r',
+    '%s_d_sp',
+    '%s_e',
+    '%s_f_b',
+    '%s_f_cblock',
+    '%s_f_lss',
+    '%s_f_r',
+    '%s_f_sp',
+    '%s_g_b',
+    '%s_g_s',
+    '%s_gcd',
+    '%s_grand',
+    '%s_h_b',
+    '%s_h_s',
+    '%s_i_b',
+    '%s_i_c',
+    '%s_i_ce',
+    '%s_i_h',
+    '%s_i_hm',
+    '%s_i_i',
+    '%s_i_lss',
+    '%s_i_p',
+    '%s_i_r',
+    '%s_i_s',
+    '%s_i_sp',
+    '%s_i_spb',
+    '%s_i_st',
+    '%s_j_i',
+    '%s_k_hm',
+    '%s_k_p',
+    '%s_k_r',
+    '%s_k_sp',
+    '%s_l_b',
+    '%s_l_hm',
+    '%s_l_i',
+    '%s_l_lss',
+    '%s_l_p',
+    '%s_l_r',
+    '%s_l_s',
+    '%s_l_sp',
+    '%s_lcm',
+    '%s_m_b',
+    '%s_m_hm',
+    '%s_m_i',
+    '%s_m_ip',
+    '%s_m_lss',
+    '%s_m_msp',
+    '%s_m_r',
+    '%s_matrix',
+    '%s_n_hm',
+    '%s_n_i',
+    '%s_n_l',
+    '%s_n_lss',
+    '%s_n_r',
+    '%s_n_st',
+    '%s_o_hm',
+    '%s_o_i',
+    '%s_o_l',
+    '%s_o_lss',
+    '%s_o_r',
+    '%s_o_st',
+    '%s_or',
+    '%s_p_b',
+    '%s_p_i',
+    '%s_pow',
+    '%s_q_hm',
+    '%s_q_i',
+    '%s_q_p',
+    '%s_q_r',
+    '%s_q_sp',
+    '%s_r_b',
+    '%s_r_i',
+    '%s_r_lss',
+    '%s_r_p',
+    '%s_r_r',
+    '%s_r_s',
+    '%s_r_sp',
+    '%s_s_b',
+    '%s_s_hm',
+    '%s_s_i',
+    '%s_s_ip',
+    '%s_s_lss',
+    '%s_s_r',
+    '%s_s_sp',
+    '%s_simp',
+    '%s_v_lss',
+    '%s_v_p',
+    '%s_v_r',
+    '%s_v_s',
+    '%s_x_b',
+    '%s_x_hm',
+    '%s_x_i',
+    '%s_x_r',
+    '%s_y_p',
+    '%s_y_r',
+    '%s_y_sp',
+    '%s_z_p',
+    '%s_z_r',
+    '%s_z_sp',
+    '%sn',
+    '%sp_a_s',
+    '%sp_a_sp',
+    '%sp_and',
+    '%sp_c_s',
+    '%sp_ceil',
+    '%sp_conj',
+    '%sp_cos',
+    '%sp_cumprod',
+    '%sp_cumsum',
+    '%sp_d_s',
+    '%sp_d_sp',
+    '%sp_det',
+    '%sp_diag',
+    '%sp_e',
+    '%sp_exp',
+    '%sp_f_s',
+    '%sp_floor',
+    '%sp_grand',
+    '%sp_gsort',
+    '%sp_i_ce',
+    '%sp_i_h',
+    '%sp_i_s',
+    '%sp_i_sp',
+    '%sp_i_st',
+    '%sp_int',
+    '%sp_inv',
+    '%sp_k_s',
+    '%sp_k_sp',
+    '%sp_l_s',
+    '%sp_l_sp',
+    '%sp_length',
+    '%sp_max',
+    '%sp_min',
+    '%sp_norm',
+    '%sp_or',
+    '%sp_p_s',
+    '%sp_prod',
+    '%sp_q_s',
+    '%sp_q_sp',
+    '%sp_r_s',
+    '%sp_r_sp',
+    '%sp_round',
+    '%sp_s_s',
+    '%sp_s_sp',
+    '%sp_sin',
+    '%sp_sqrt',
+    '%sp_string',
+    '%sp_sum',
+    '%sp_tril',
+    '%sp_triu',
+    '%sp_y_s',
+    '%sp_y_sp',
+    '%sp_z_s',
+    '%sp_z_sp',
+    '%spb_and',
+    '%spb_c_b',
+    '%spb_cumprod',
+    '%spb_cumsum',
+    '%spb_diag',
+    '%spb_e',
+    '%spb_f_b',
+    '%spb_g_b',
+    '%spb_g_spb',
+    '%spb_h_b',
+    '%spb_h_spb',
+    '%spb_i_b',
+    '%spb_i_ce',
+    '%spb_i_h',
+    '%spb_i_st',
+    '%spb_or',
+    '%spb_prod',
+    '%spb_sum',
+    '%spb_tril',
+    '%spb_triu',
+    '%st_6',
+    '%st_c_st',
+    '%st_e',
+    '%st_f_st',
+    '%st_i_b',
+    '%st_i_c',
+    '%st_i_fptr',
+    '%st_i_h',
+    '%st_i_i',
+    '%st_i_ip',
+    '%st_i_lss',
+    '%st_i_msp',
+    '%st_i_p',
+    '%st_i_r',
+    '%st_i_s',
+    '%st_i_sp',
+    '%st_i_spb',
+    '%st_i_st',
+    '%st_matrix',
+    '%st_n_c',
+    '%st_n_l',
+    '%st_n_mc',
+    '%st_n_p',
+    '%st_n_s',
+    '%st_o_c',
+    '%st_o_l',
+    '%st_o_mc',
+    '%st_o_p',
+    '%st_o_s',
+    '%st_o_tl',
+    '%st_p',
+    '%st_size',
+    '%st_string',
+    '%st_t',
+    '%ticks_i_h',
+    '%xls_e',
+    '%xls_p',
+    '%xlssheet_e',
+    '%xlssheet_p',
+    '%xlssheet_size',
+    '%xlssheet_string',
+    'DominationRank',
+    'G_make',
+    'IsAScalar',
+    'NDcost',
+    'OS_Version',
+    'PlotSparse',
+    'ReadHBSparse',
+    'TCL_CreateSlave',
+    'abcd',
+    'abinv',
+    'accept_func_default',
+    'accept_func_vfsa',
+    'acf',
+    'acosd',
+    'acosh',
+    'acoshm',
+    'acosm',
+    'acot',
+    'acotd',
+    'acoth',
+    'acsc',
+    'acscd',
+    'acsch',
+    'add_demo',
+    'add_help_chapter',
+    'add_module_help_chapter',
+    'add_param',
+    'add_profiling',
+    'adj2sp',
+    'aff2ab',
+    'ana_style',
+    'analpf',
+    'analyze',
+    'aplat',
+    'arhnk',
+    'arl2',
+    'arma2p',
+    'arma2ss',
+    'armac',
+    'armax',
+    'armax1',
+    'arobasestring2strings',
+    'arsimul',
+    'ascii2string',
+    'asciimat',
+    'asec',
+    'asecd',
+    'asech',
+    'asind',
+    'asinh',
+    'asinhm',
+    'asinm',
+    'assert_checkalmostequal',
+    'assert_checkequal',
+    'assert_checkerror',
+    'assert_checkfalse',
+    'assert_checkfilesequal',
+    'assert_checktrue',
+    'assert_comparecomplex',
+    'assert_computedigits',
+    'assert_cond2reltol',
+    'assert_cond2reqdigits',
+    'assert_generror',
+    'atand',
+    'atanh',
+    'atanhm',
+    'atanm',
+    'atomsAutoload',
+    'atomsAutoloadAdd',
+    'atomsAutoloadDel',
+    'atomsAutoloadList',
+    'atomsCategoryList',
+    'atomsCheckModule',
+    'atomsDepTreeShow',
+    'atomsGetConfig',
+    'atomsGetInstalled',
+    'atomsGetInstalledPath',
+    'atomsGetLoaded',
+    'atomsGetLoadedPath',
+    'atomsInstall',
+    'atomsIsInstalled',
+    'atomsIsLoaded',
+    'atomsList',
+    'atomsLoad',
+    'atomsQuit',
+    'atomsRemove',
+    'atomsRepositoryAdd',
+    'atomsRepositoryDel',
+    'atomsRepositoryList',
+    'atomsRestoreConfig',
+    'atomsSaveConfig',
+    'atomsSearch',
+    'atomsSetConfig',
+    'atomsShow',
+    'atomsSystemInit',
+    'atomsSystemUpdate',
+    'atomsTest',
+    'atomsUpdate',
+    'atomsVersion',
+    'augment',
+    'auread',
+    'auwrite',
+    'balreal',
+    'bench_run',
+    'bilin',
+    'bilt',
+    'bin2dec',
+    'binomial',
+    'bitand',
+    'bitcmp',
+    'bitget',
+    'bitor',
+    'bitset',
+    'bitxor',
+    'black',
+    'blanks',
+    'bloc2exp',
+    'bloc2ss',
+    'block_parameter_error',
+    'bode',
+    'bode_asymp',
+    'bstap',
+    'buttmag',
+    'bvodeS',
+    'bytecode',
+    'bytecodewalk',
+    'cainv',
+    'calendar',
+    'calerf',
+    'calfrq',
+    'canon',
+    'casc',
+    'cat',
+    'cat_code',
+    'cb_m2sci_gui',
+    'ccontrg',
+    'cell',
+    'cell2mat',
+    'cellstr',
+    'center',
+    'cepstrum',
+    'cfspec',
+    'char',
+    'chart',
+    'cheb1mag',
+    'cheb2mag',
+    'check_gateways',
+    'check_modules_xml',
+    'check_versions',
+    'chepol',
+    'chfact',
+    'chsolve',
+    'classmarkov',
+    'clean_help',
+    'clock',
+    'cls2dls',
+    'cmb_lin',
+    'cmndred',
+    'cmoment',
+    'coding_ga_binary',
+    'coding_ga_identity',
+    'coff',
+    'coffg',
+    'colcomp',
+    'colcompr',
+    'colinout',
+    'colregul',
+    'companion',
+    'complex',
+    'compute_initial_temp',
+    'cond',
+    'cond2sp',
+    'condestsp',
+    'configure_msifort',
+    'configure_msvc',
+    'conjgrad',
+    'cont_frm',
+    'cont_mat',
+    'contrss',
+    'conv',
+    'convert_to_float',
+    'convertindex',
+    'convol',
+    'convol2d',
+    'copfac',
+    'correl',
+    'cosd',
+    'cosh',
+    'coshm',
+    'cosm',
+    'cotd',
+    'cotg',
+    'coth',
+    'cothm',
+    'cov',
+    'covar',
+    'createXConfiguration',
+    'createfun',
+    'createstruct',
+    'cross',
+    'crossover_ga_binary',
+    'crossover_ga_default',
+    'csc',
+    'cscd',
+    'csch',
+    'csgn',
+    'csim',
+    'cspect',
+    'ctr_gram',
+    'czt',
+    'dae',
+    'daeoptions',
+    'damp',
+    'datafit',
+    'date',
+    'datenum',
+    'datevec',
+    'dbphi',
+    'dcf',
+    'ddp',
+    'dec2bin',
+    'dec2hex',
+    'dec2oct',
+    'del_help_chapter',
+    'del_module_help_chapter',
+    'demo_begin',
+    'demo_choose',
+    'demo_compiler',
+    'demo_end',
+    'demo_file_choice',
+    'demo_folder_choice',
+    'demo_function_choice',
+    'demo_gui',
+    'demo_run',
+    'demo_viewCode',
+    'denom',
+    'derivat',
+    'derivative',
+    'des2ss',
+    'des2tf',
+    'detectmsifort64tools',
+    'detectmsvc64tools',
+    'determ',
+    'detr',
+    'detrend',
+    'devtools_run_builder',
+    'dhnorm',
+    'diff',
+    'diophant',
+    'dir',
+    'dirname',
+    'dispfiles',
+    'dllinfo',
+    'dscr',
+    'dsimul',
+    'dt_ility',
+    'dtsi',
+    'edit',
+    'edit_error',
+    'editor',
+    'eigenmarkov',
+    'eigs',
+    'ell1mag',
+    'enlarge_shape',
+    'entropy',
+    'eomday',
+    'epred',
+    'eqfir',
+    'eqiir',
+    'equil',
+    'equil1',
+    'erfinv',
+    'etime',
+    'eval',
+    'evans',
+    'evstr',
+    'example_run',
+    'expression2code',
+    'extract_help_examples',
+    'factor',
+    'factorial',
+    'factors',
+    'faurre',
+    'ffilt',
+    'fft2',
+    'fftshift',
+    'fieldnames',
+    'filt_sinc',
+    'filter',
+    'findABCD',
+    'findAC',
+    'findBDK',
+    'findR',
+    'find_freq',
+    'find_links',
+    'find_scicos_version',
+    'findm',
+    'findmsifortcompiler',
+    'findmsvccompiler',
+    'findx0BD',
+    'firstnonsingleton',
+    'fix',
+    'fixedpointgcd',
+    'flipdim',
+    'flts',
+    'fminsearch',
+    'formatBlackTip',
+    'formatBodeMagTip',
+    'formatBodePhaseTip',
+    'formatGainplotTip',
+    'formatHallModuleTip',
+    'formatHallPhaseTip',
+    'formatNicholsGainTip',
+    'formatNicholsPhaseTip',
+    'formatNyquistTip',
+    'formatPhaseplotTip',
+    'formatSgridDampingTip',
+    'formatSgridFreqTip',
+    'formatZgridDampingTip',
+    'formatZgridFreqTip',
+    'format_txt',
+    'fourplan',
+    'frep2tf',
+    'freson',
+    'frfit',
+    'frmag',
+    'fseek_origin',
+    'fsfirlin',
+    'fspec',
+    'fspecg',
+    'fstabst',
+    'ftest',
+    'ftuneq',
+    'fullfile',
+    'fullrf',
+    'fullrfk',
+    'fun2string',
+    'g_margin',
+    'gainplot',
+    'gamitg',
+    'gcare',
+    'gcd',
+    'gencompilationflags_unix',
+    'generateBlockImage',
+    'generateBlockImages',
+    'generic_i_ce',
+    'generic_i_h',
+    'generic_i_hm',
+    'generic_i_s',
+    'generic_i_st',
+    'genlib',
+    'genmarkov',
+    'geomean',
+    'getDiagramVersion',
+    'getModelicaPath',
+    'getPreferencesValue',
+    'get_file_path',
+    'get_function_path',
+    'get_param',
+    'get_profile',
+    'get_scicos_version',
+    'getd',
+    'getscilabkeywords',
+    'getshell',
+    'gettklib',
+    'gfare',
+    'gfrancis',
+    'givens',
+    'glever',
+    'gmres',
+    'group',
+    'gschur',
+    'gspec',
+    'gtild',
+    'h2norm',
+    'h_cl',
+    'h_inf',
+    'h_inf_st',
+    'h_norm',
+    'hallchart',
+    'halt',
+    'hank',
+    'hankelsv',
+    'harmean',
+    'haveacompiler',
+    'head_comments',
+    'help_from_sci',
+    'help_skeleton',
+    'hermit',
+    'hex2dec',
+    'hilb',
+    'hilbert',
+    'histc',
+    'horner',
+    'householder',
+    'hrmt',
+    'htrianr',
+    'hypermat',
+    'idct',
+    'idst',
+    'ifft',
+    'ifftshift',
+    'iir',
+    'iirgroup',
+    'iirlp',
+    'iirmod',
+    'ilib_build',
+    'ilib_build_jar',
+    'ilib_compile',
+    'ilib_for_link',
+    'ilib_gen_Make',
+    'ilib_gen_Make_unix',
+    'ilib_gen_cleaner',
+    'ilib_gen_gateway',
+    'ilib_gen_loader',
+    'ilib_include_flag',
+    'ilib_mex_build',
+    'im_inv',
+    'importScicosDiagram',
+    'importScicosPal',
+    'importXcosDiagram',
+    'imrep2ss',
+    'ind2sub',
+    'inistate',
+    'init_ga_default',
+    'init_param',
+    'initial_scicos_tables',
+    'input',
+    'instruction2code',
+    'intc',
+    'intdec',
+    'integrate',
+    'interp1',
+    'interpln',
+    'intersect',
+    'intl',
+    'intsplin',
+    'inttrap',
+    'inv_coeff',
+    'invr',
+    'invrs',
+    'invsyslin',
+    'iqr',
+    'isLeapYear',
+    'is_absolute_path',
+    'is_param',
+    'iscell',
+    'iscellstr',
+    'iscolumn',
+    'isempty',
+    'isfield',
+    'isinf',
+    'ismatrix',
+    'isnan',
+    'isrow',
+    'isscalar',
+    'issparse',
+    'issquare',
+    'isstruct',
+    'isvector',
+    'jmat',
+    'justify',
+    'kalm',
+    'karmarkar',
+    'kernel',
+    'kpure',
+    'krac2',
+    'kroneck',
+    'lattn',
+    'lattp',
+    'launchtest',
+    'lcf',
+    'lcm',
+    'lcmdiag',
+    'leastsq',
+    'leqe',
+    'leqr',
+    'lev',
+    'levin',
+    'lex_sort',
+    'lft',
+    'lin',
+    'lin2mu',
+    'lincos',
+    'lindquist',
+    'linf',
+    'linfn',
+    'linsolve',
+    'linspace',
+    'list2vec',
+    'list_param',
+    'listfiles',
+    'listfunctions',
+    'listvarinfile',
+    'lmisolver',
+    'lmitool',
+    'loadXcosLibs',
+    'loadmatfile',
+    'loadwave',
+    'log10',
+    'log2',
+    'logm',
+    'logspace',
+    'lqe',
+    'lqg',
+    'lqg2stan',
+    'lqg_ltr',
+    'lqr',
+    'ls',
+    'lyap',
+    'm2sci_gui',
+    'm_circle',
+    'macglov',
+    'macrovar',
+    'mad',
+    'makecell',
+    'manedit',
+    'mapsound',
+    'markp2ss',
+    'matfile2sci',
+    'mdelete',
+    'mean',
+    'meanf',
+    'median',
+    'members',
+    'mese',
+    'meshgrid',
+    'mfft',
+    'mfile2sci',
+    'minreal',
+    'minss',
+    'mkdir',
+    'modulo',
+    'moment',
+    'mrfit',
+    'msd',
+    'mstr2sci',
+    'mtlb',
+    'mtlb_0',
+    'mtlb_a',
+    'mtlb_all',
+    'mtlb_any',
+    'mtlb_axes',
+    'mtlb_axis',
+    'mtlb_beta',
+    'mtlb_box',
+    'mtlb_choices',
+    'mtlb_close',
+    'mtlb_colordef',
+    'mtlb_cond',
+    'mtlb_cov',
+    'mtlb_cumprod',
+    'mtlb_cumsum',
+    'mtlb_dec2hex',
+    'mtlb_delete',
+    'mtlb_diag',
+    'mtlb_diff',
+    'mtlb_dir',
+    'mtlb_double',
+    'mtlb_e',
+    'mtlb_echo',
+    'mtlb_error',
+    'mtlb_eval',
+    'mtlb_exist',
+    'mtlb_eye',
+    'mtlb_false',
+    'mtlb_fft',
+    'mtlb_fftshift',
+    'mtlb_filter',
+    'mtlb_find',
+    'mtlb_findstr',
+    'mtlb_fliplr',
+    'mtlb_fopen',
+    'mtlb_format',
+    'mtlb_fprintf',
+    'mtlb_fread',
+    'mtlb_fscanf',
+    'mtlb_full',
+    'mtlb_fwrite',
+    'mtlb_get',
+    'mtlb_grid',
+    'mtlb_hold',
+    'mtlb_i',
+    'mtlb_ifft',
+    'mtlb_image',
+    'mtlb_imp',
+    'mtlb_int16',
+    'mtlb_int32',
+    'mtlb_int8',
+    'mtlb_is',
+    'mtlb_isa',
+    'mtlb_isfield',
+    'mtlb_isletter',
+    'mtlb_isspace',
+    'mtlb_l',
+    'mtlb_legendre',
+    'mtlb_linspace',
+    'mtlb_logic',
+    'mtlb_logical',
+    'mtlb_loglog',
+    'mtlb_lower',
+    'mtlb_max',
+    'mtlb_mean',
+    'mtlb_median',
+    'mtlb_mesh',
+    'mtlb_meshdom',
+    'mtlb_min',
+    'mtlb_more',
+    'mtlb_num2str',
+    'mtlb_ones',
+    'mtlb_pcolor',
+    'mtlb_plot',
+    'mtlb_prod',
+    'mtlb_qr',
+    'mtlb_qz',
+    'mtlb_rand',
+    'mtlb_randn',
+    'mtlb_rcond',
+    'mtlb_realmax',
+    'mtlb_realmin',
+    'mtlb_s',
+    'mtlb_semilogx',
+    'mtlb_semilogy',
+    'mtlb_setstr',
+    'mtlb_size',
+    'mtlb_sort',
+    'mtlb_sortrows',
+    'mtlb_sprintf',
+    'mtlb_sscanf',
+    'mtlb_std',
+    'mtlb_strcmp',
+    'mtlb_strcmpi',
+    'mtlb_strfind',
+    'mtlb_strrep',
+    'mtlb_subplot',
+    'mtlb_sum',
+    'mtlb_t',
+    'mtlb_toeplitz',
+    'mtlb_tril',
+    'mtlb_triu',
+    'mtlb_true',
+    'mtlb_type',
+    'mtlb_uint16',
+    'mtlb_uint32',
+    'mtlb_uint8',
+    'mtlb_upper',
+    'mtlb_var',
+    'mtlb_zeros',
+    'mu2lin',
+    'mutation_ga_binary',
+    'mutation_ga_default',
+    'mvcorrel',
+    'mvvacov',
+    'nancumsum',
+    'nand2mean',
+    'nanmax',
+    'nanmean',
+    'nanmeanf',
+    'nanmedian',
+    'nanmin',
+    'nanreglin',
+    'nanstdev',
+    'nansum',
+    'narsimul',
+    'ndgrid',
+    'ndims',
+    'nehari',
+    'neigh_func_csa',
+    'neigh_func_default',
+    'neigh_func_fsa',
+    'neigh_func_vfsa',
+    'neldermead_cget',
+    'neldermead_configure',
+    'neldermead_costf',
+    'neldermead_defaultoutput',
+    'neldermead_destroy',
+    'neldermead_function',
+    'neldermead_get',
+    'neldermead_log',
+    'neldermead_new',
+    'neldermead_restart',
+    'neldermead_search',
+    'neldermead_updatesimp',
+    'nextpow2',
+    'nfreq',
+    'nicholschart',
+    'nlev',
+    'nmplot_cget',
+    'nmplot_configure',
+    'nmplot_contour',
+    'nmplot_destroy',
+    'nmplot_function',
+    'nmplot_get',
+    'nmplot_historyplot',
+    'nmplot_log',
+    'nmplot_new',
+    'nmplot_outputcmd',
+    'nmplot_restart',
+    'nmplot_search',
+    'nmplot_simplexhistory',
+    'noisegen',
+    'nonreg_test_run',
+    'now',
+    'nthroot',
+    'null',
+    'num2cell',
+    'numderivative',
+    'numdiff',
+    'numer',
+    'nyquist',
+    'nyquistfrequencybounds',
+    'obs_gram',
+    'obscont',
+    'observer',
+    'obsv_mat',
+    'obsvss',
+    'oct2dec',
+    'odeoptions',
+    'optim_ga',
+    'optim_moga',
+    'optim_nsga',
+    'optim_nsga2',
+    'optim_sa',
+    'optimbase_cget',
+    'optimbase_checkbounds',
+    'optimbase_checkcostfun',
+    'optimbase_checkx0',
+    'optimbase_configure',
+    'optimbase_destroy',
+    'optimbase_function',
+    'optimbase_get',
+    'optimbase_hasbounds',
+    'optimbase_hasconstraints',
+    'optimbase_hasnlcons',
+    'optimbase_histget',
+    'optimbase_histset',
+    'optimbase_incriter',
+    'optimbase_isfeasible',
+    'optimbase_isinbounds',
+    'optimbase_isinnonlincons',
+    'optimbase_log',
+    'optimbase_logshutdown',
+    'optimbase_logstartup',
+    'optimbase_new',
+    'optimbase_outputcmd',
+    'optimbase_outstruct',
+    'optimbase_proj2bnds',
+    'optimbase_set',
+    'optimbase_stoplog',
+    'optimbase_terminate',
+    'optimget',
+    'optimplotfunccount',
+    'optimplotfval',
+    'optimplotx',
+    'optimset',
+    'optimsimplex_center',
+    'optimsimplex_check',
+    'optimsimplex_compsomefv',
+    'optimsimplex_computefv',
+    'optimsimplex_deltafv',
+    'optimsimplex_deltafvmax',
+    'optimsimplex_destroy',
+    'optimsimplex_dirmat',
+    'optimsimplex_fvmean',
+    'optimsimplex_fvstdev',
+    'optimsimplex_fvvariance',
+    'optimsimplex_getall',
+    'optimsimplex_getallfv',
+    'optimsimplex_getallx',
+    'optimsimplex_getfv',
+    'optimsimplex_getn',
+    'optimsimplex_getnbve',
+    'optimsimplex_getve',
+    'optimsimplex_getx',
+    'optimsimplex_gradientfv',
+    'optimsimplex_log',
+    'optimsimplex_new',
+    'optimsimplex_reflect',
+    'optimsimplex_setall',
+    'optimsimplex_setallfv',
+    'optimsimplex_setallx',
+    'optimsimplex_setfv',
+    'optimsimplex_setn',
+    'optimsimplex_setnbve',
+    'optimsimplex_setve',
+    'optimsimplex_setx',
+    'optimsimplex_shrink',
+    'optimsimplex_size',
+    'optimsimplex_sort',
+    'optimsimplex_xbar',
+    'orth',
+    'output_ga_default',
+    'output_moga_default',
+    'output_nsga2_default',
+    'output_nsga_default',
+    'p_margin',
+    'pack',
+    'pareto_filter',
+    'parrot',
+    'pbig',
+    'pca',
+    'pcg',
+    'pdiv',
+    'pen2ea',
+    'pencan',
+    'pencost',
+    'penlaur',
+    'perctl',
+    'perl',
+    'perms',
+    'permute',
+    'pertrans',
+    'pfactors',
+    'pfss',
+    'phasemag',
+    'phaseplot',
+    'phc',
+    'pinv',
+    'playsnd',
+    'plotprofile',
+    'plzr',
+    'pmodulo',
+    'pol2des',
+    'pol2str',
+    'polar',
+    'polfact',
+    'prbs_a',
+    'prettyprint',
+    'primes',
+    'princomp',
+    'profile',
+    'proj',
+    'projsl',
+    'projspec',
+    'psmall',
+    'pspect',
+    'qmr',
+    'qpsolve',
+    'quart',
+    'quaskro',
+    'rafiter',
+    'randpencil',
+    'range',
+    'rank',
+    'readxls',
+    'recompilefunction',
+    'recons',
+    'reglin',
+    'regress',
+    'remezb',
+    'remove_param',
+    'remove_profiling',
+    'repfreq',
+    'replace_Ix_by_Fx',
+    'repmat',
+    'reset_profiling',
+    'resize_matrix',
+    'returntoscilab',
+    'rhs2code',
+    'ric_desc',
+    'riccati',
+    'rmdir',
+    'routh_t',
+    'rowcomp',
+    'rowcompr',
+    'rowinout',
+    'rowregul',
+    'rowshuff',
+    'rref',
+    'sample',
+    'samplef',
+    'samwr',
+    'savematfile',
+    'savewave',
+    'scanf',
+    'sci2exp',
+    'sciGUI_init',
+    'sci_sparse',
+    'scicos_getvalue',
+    'scicos_simulate',
+    'scicos_workspace_init',
+    'scisptdemo',
+    'scitest',
+    'sdiff',
+    'sec',
+    'secd',
+    'sech',
+    'selection_ga_elitist',
+    'selection_ga_random',
+    'sensi',
+    'setPreferencesValue',
+    'set_param',
+    'setdiff',
+    'sgrid',
+    'show_margins',
+    'show_pca',
+    'showprofile',
+    'signm',
+    'sinc',
+    'sincd',
+    'sind',
+    'sinh',
+    'sinhm',
+    'sinm',
+    'sm2des',
+    'sm2ss',
+    'smga',
+    'smooth',
+    'solve',
+    'sound',
+    'soundsec',
+    'sp2adj',
+    'spaninter',
+    'spanplus',
+    'spantwo',
+    'specfact',
+    'speye',
+    'sprand',
+    'spzeros',
+    'sqroot',
+    'sqrtm',
+    'squarewave',
+    'squeeze',
+    'srfaur',
+    'srkf',
+    'ss2des',
+    'ss2ss',
+    'ss2tf',
+    'sskf',
+    'ssprint',
+    'ssrand',
+    'st_deviation',
+    'st_i_generic',
+    'st_ility',
+    'stabil',
+    'statgain',
+    'stdev',
+    'stdevf',
+    'steadycos',
+    'strange',
+    'strcmpi',
+    'struct',
+    'sub2ind',
+    'sva',
+    'svplot',
+    'sylm',
+    'sylv',
+    'sysconv',
+    'sysdiag',
+    'sysfact',
+    'syslin',
+    'syssize',
+    'system',
+    'systmat',
+    'tabul',
+    'tand',
+    'tanh',
+    'tanhm',
+    'tanm',
+    'tbx_build_blocks',
+    'tbx_build_cleaner',
+    'tbx_build_gateway',
+    'tbx_build_gateway_clean',
+    'tbx_build_gateway_loader',
+    'tbx_build_help',
+    'tbx_build_help_loader',
+    'tbx_build_loader',
+    'tbx_build_localization',
+    'tbx_build_macros',
+    'tbx_build_pal_loader',
+    'tbx_build_src',
+    'tbx_builder',
+    'tbx_builder_gateway',
+    'tbx_builder_gateway_lang',
+    'tbx_builder_help',
+    'tbx_builder_help_lang',
+    'tbx_builder_macros',
+    'tbx_builder_src',
+    'tbx_builder_src_lang',
+    'tbx_generate_pofile',
+    'temp_law_csa',
+    'temp_law_default',
+    'temp_law_fsa',
+    'temp_law_huang',
+    'temp_law_vfsa',
+    'test_clean',
+    'test_on_columns',
+    'test_run',
+    'test_run_level',
+    'testexamples',
+    'tf2des',
+    'tf2ss',
+    'thrownan',
+    'tic',
+    'time_id',
+    'toc',
+    'toeplitz',
+    'tokenpos',
+    'toolboxes',
+    'trace',
+    'trans',
+    'translatepaths',
+    'tree2code',
+    'trfmod',
+    'trianfml',
+    'trimmean',
+    'trisolve',
+    'trzeros',
+    'typeof',
+    'ui_observer',
+    'union',
+    'unique',
+    'unit_test_run',
+    'unix_g',
+    'unix_s',
+    'unix_w',
+    'unix_x',
+    'unobs',
+    'unpack',
+    'unwrap',
+    'variance',
+    'variancef',
+    'vec2list',
+    'vectorfind',
+    'ver',
+    'warnobsolete',
+    'wavread',
+    'wavwrite',
+    'wcenter',
+    'weekday',
+    'wfir',
+    'wfir_gui',
+    'whereami',
+    'who_user',
+    'whos',
+    'wiener',
+    'wigner',
+    'window',
+    'winlist',
+    'with_javasci',
+    'with_macros_source',
+    'with_modelica_compiler',
+    'with_tk',
+    'xcorr',
+    'xcosBlockEval',
+    'xcosBlockInterface',
+    'xcosCodeGeneration',
+    'xcosConfigureModelica',
+    'xcosPal',
+    'xcosPalAdd',
+    'xcosPalAddBlock',
+    'xcosPalExport',
+    'xcosPalGenerateAllIcons',
+    'xcosShowBlockWarning',
+    'xcosValidateBlockSet',
+    'xcosValidateCompareBlock',
+    'xcos_compile',
+    'xcos_debug_gui',
+    'xcos_run',
+    'xcos_simulate',
+    'xcov',
+    'xmltochm',
+    'xmltoformat',
+    'xmltohtml',
+    'xmltojar',
+    'xmltopdf',
+    'xmltops',
+    'xmltoweb',
+    'yulewalk',
+    'zeropen',
+    'zgrid',
+    'zpbutt',
+    'zpch1',
+    'zpch2',
+    'zpell',
+)
+
+variables_kw = (
+    '$',
+    '%F',
+    '%T',
+    '%e',
+    '%eps',
+    '%f',
+    '%fftw',
+    '%gui',
+    '%i',
+    '%inf',
+    '%io',
+    '%modalWarning',
+    '%nan',
+    '%pi',
+    '%s',
+    '%t',
+    '%tk',
+    '%toolboxes',
+    '%toolboxes_dir',
+    '%z',
+    'PWD',
+    'SCI',
+    'SCIHOME',
+    'TMPDIR',
+    'arnoldilib',
+    'assertlib',
+    'atomslib',
+    'cacsdlib',
+    'compatibility_functilib',
+    'corelib',
+    'data_structureslib',
+    'demo_toolslib',
+    'development_toolslib',
+    'differential_equationlib',
+    'dynamic_linklib',
+    'elementary_functionslib',
+    'enull',
+    'evoid',
+    'external_objectslib',
+    'fd',
+    'fileiolib',
+    'functionslib',
+    'genetic_algorithmslib',
+    'helptoolslib',
+    'home',
+    'integerlib',
+    'interpolationlib',
+    'iolib',
+    'jnull',
+    'jvoid',
+    'linear_algebralib',
+    'm2scilib',
+    'matiolib',
+    'modules_managerlib',
+    'neldermeadlib',
+    'optimbaselib',
+    'optimizationlib',
+    'optimsimplexlib',
+    'output_streamlib',
+    'overloadinglib',
+    'parameterslib',
+    'polynomialslib',
+    'preferenceslib',
+    'randliblib',
+    'scicos_autolib',
+    'scicos_utilslib',
+    'scinoteslib',
+    'signal_processinglib',
+    'simulated_annealinglib',
+    'soundlib',
+    'sparselib',
+    'special_functionslib',
+    'spreadsheetlib',
+    'statisticslib',
+    'stringlib',
+    'tclscilib',
+    'timelib',
+    'umfpacklib',
+    'xcoslib',
+)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import subprocess
+    from pygments.util import format_lines, duplicates_removed
+
+    mapping = {'variables': 'builtin'}
+
+    def extract_completion(var_type):
+        s = subprocess.Popen(['scilab', '-nwni'], stdin=subprocess.PIPE,
+                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        output = s.communicate('''\
+fd = mopen("/dev/stderr", "wt");
+mputl(strcat(completion("", "%s"), "||"), fd);
+mclose(fd)\n''' % var_type)
+        if '||' not in output[1]:
+            raise Exception(output[0])
+        # Invalid DISPLAY causes this to be output:
+        text = output[1].strip()
+        if text.startswith('Error: unable to open display \n'):
+            text = text[len('Error: unable to open display \n'):]
+        return text.split('||')
+
+    new_data = {}
+    seen = set()  # only keep first type for a given word
+    for t in ('functions', 'commands', 'macros', 'variables'):
+        new_data[t] = duplicates_removed(extract_completion(t), seen)
+        seen.update(set(new_data[t]))
+
+
+    with open(__file__) as f:
+        content = f.read()
+
+    header = content[:content.find('# Autogenerated')]
+    footer = content[content.find("if __name__ == '__main__':"):]
+
+    with open(__file__, 'w') as f:
+        f.write(header)
+        f.write('# Autogenerated\n\n')
+        for k, v in sorted(new_data.iteritems()):
+            f.write(format_lines(k + '_kw', v) + '\n\n')
+        f.write(footer)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dylan.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dylan.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dylan.py	(revision 1126)
@@ -0,0 +1,289 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.dylan
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Dylan language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Literal
+
+__all__ = ['DylanLexer', 'DylanConsoleLexer', 'DylanLidLexer']
+
+
+class DylanLexer(RegexLexer):
+    """
+    For the `Dylan <http://www.opendylan.org/>`_ language.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'Dylan'
+    aliases = ['dylan']
+    filenames = ['*.dylan', '*.dyl', '*.intr']
+    mimetypes = ['text/x-dylan']
+
+    flags = re.IGNORECASE
+
+    builtins = set((
+        'subclass', 'abstract', 'block', 'concrete', 'constant', 'class',
+        'compiler-open', 'compiler-sideways', 'domain', 'dynamic',
+        'each-subclass', 'exception', 'exclude', 'function', 'generic',
+        'handler', 'inherited', 'inline', 'inline-only', 'instance',
+        'interface', 'import', 'keyword', 'library', 'macro', 'method',
+        'module', 'open', 'primary', 'required', 'sealed', 'sideways',
+        'singleton', 'slot', 'thread', 'variable', 'virtual'))
+
+    keywords = set((
+        'above', 'afterwards', 'begin', 'below', 'by', 'case', 'cleanup',
+        'create', 'define', 'else', 'elseif', 'end', 'export', 'finally',
+        'for', 'from', 'if', 'in', 'let', 'local', 'otherwise', 'rename',
+        'select', 'signal', 'then', 'to', 'unless', 'until', 'use', 'when',
+        'while'))
+
+    operators = set((
+        '~', '+', '-', '*', '|', '^', '=', '==', '~=', '~==', '<', '<=',
+        '>', '>=', '&', '|'))
+
+    functions = set((
+        'abort', 'abs', 'add', 'add!', 'add-method', 'add-new', 'add-new!',
+        'all-superclasses', 'always', 'any?', 'applicable-method?', 'apply',
+        'aref', 'aref-setter', 'as', 'as-lowercase', 'as-lowercase!',
+        'as-uppercase', 'as-uppercase!', 'ash', 'backward-iteration-protocol',
+        'break', 'ceiling', 'ceiling/', 'cerror', 'check-type', 'choose',
+        'choose-by', 'complement', 'compose', 'concatenate', 'concatenate-as',
+        'condition-format-arguments', 'condition-format-string', 'conjoin',
+        'copy-sequence', 'curry', 'default-handler', 'dimension', 'dimensions',
+        'direct-subclasses', 'direct-superclasses', 'disjoin', 'do',
+        'do-handlers', 'element', 'element-setter', 'empty?', 'error', 'even?',
+        'every?', 'false-or', 'fill!', 'find-key', 'find-method', 'first',
+        'first-setter', 'floor', 'floor/', 'forward-iteration-protocol',
+        'function-arguments', 'function-return-values',
+        'function-specializers', 'gcd', 'generic-function-mandatory-keywords',
+        'generic-function-methods', 'head', 'head-setter', 'identity',
+        'initialize', 'instance?', 'integral?', 'intersection',
+        'key-sequence', 'key-test', 'last', 'last-setter', 'lcm', 'limited',
+        'list', 'logand', 'logbit?', 'logior', 'lognot', 'logxor', 'make',
+        'map', 'map-as', 'map-into', 'max', 'member?', 'merge-hash-codes',
+        'min', 'modulo', 'negative', 'negative?', 'next-method',
+        'object-class', 'object-hash', 'odd?', 'one-of', 'pair', 'pop',
+        'pop-last', 'positive?', 'push', 'push-last', 'range', 'rank',
+        'rcurry', 'reduce', 'reduce1', 'remainder', 'remove', 'remove!',
+        'remove-duplicates', 'remove-duplicates!', 'remove-key!',
+        'remove-method', 'replace-elements!', 'replace-subsequence!',
+        'restart-query', 'return-allowed?', 'return-description',
+        'return-query', 'reverse', 'reverse!', 'round', 'round/',
+        'row-major-index', 'second', 'second-setter', 'shallow-copy',
+        'signal', 'singleton', 'size', 'size-setter', 'slot-initialized?',
+        'sort', 'sort!', 'sorted-applicable-methods', 'subsequence-position',
+        'subtype?', 'table-protocol', 'tail', 'tail-setter', 'third',
+        'third-setter', 'truncate', 'truncate/', 'type-error-expected-type',
+        'type-error-value', 'type-for-copy', 'type-union', 'union', 'values',
+        'vector', 'zero?'))
+
+    valid_name = '\\\\?[\\w!&*<>|^$%@\\-+~?/=]+'
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                lowercase_value = value.lower()
+                if lowercase_value in self.builtins:
+                    yield index, Name.Builtin, value
+                    continue
+                if lowercase_value in self.keywords:
+                    yield index, Keyword, value
+                    continue
+                if lowercase_value in self.functions:
+                    yield index, Name.Builtin, value
+                    continue
+                if lowercase_value in self.operators:
+                    yield index, Operator, value
+                    continue
+            yield index, token, value
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'\s+', Text),
+
+            # single line comment
+            (r'//.*?\n', Comment.Single),
+
+            # lid header
+            (r'([a-z0-9-]+)(:)([ \t]*)(.*(?:\n[ \t].+)*)',
+                bygroups(Name.Attribute, Operator, Text, String)),
+
+            default('code')  # no header match, switch to code
+        ],
+        'code': [
+            # Whitespace
+            (r'\s+', Text),
+
+            # single line comment
+            (r'//.*?\n', Comment.Single),
+
+            # multi-line comment
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # strings and characters
+            (r'"', String, 'string'),
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\\'\n])'", String.Char),
+
+            # binary integer
+            (r'#b[01]+', Number.Bin),
+
+            # octal integer
+            (r'#o[0-7]+', Number.Oct),
+
+            # floating point
+            (r'[-+]?(\d*\.\d+(e[-+]?\d+)?|\d+(\.\d*)?e[-+]?\d+)', Number.Float),
+
+            # decimal integer
+            (r'[-+]?\d+', Number.Integer),
+
+            # hex integer
+            (r'#x[0-9a-f]+', Number.Hex),
+
+            # Macro parameters
+            (r'(\?' + valid_name + ')(:)'
+             r'(token|name|variable|expression|body|case-body|\*)',
+                bygroups(Name.Tag, Operator, Name.Builtin)),
+            (r'(\?)(:)(token|name|variable|expression|body|case-body|\*)',
+                bygroups(Name.Tag, Operator, Name.Builtin)),
+            (r'\?' + valid_name, Name.Tag),
+
+            # Punctuation
+            (r'(=>|::|#\(|#\[|##|\?\?|\?=|\?|[(){}\[\],.;])', Punctuation),
+
+            # Most operators are picked up as names and then re-flagged.
+            # This one isn't valid in a name though, so we pick it up now.
+            (r':=', Operator),
+
+            # Pick up #t / #f before we match other stuff with #.
+            (r'#[tf]', Literal),
+
+            # #"foo" style keywords
+            (r'#"', String.Symbol, 'keyword'),
+
+            # #rest, #key, #all-keys, etc.
+            (r'#[a-z0-9-]+', Keyword),
+
+            # required-init-keyword: style keywords.
+            (valid_name + ':', Keyword),
+
+            # class names
+            (r'<' + valid_name + '>', Name.Class),
+
+            # define variable forms.
+            (r'\*' + valid_name + '\*', Name.Variable.Global),
+
+            # define constant forms.
+            (r'\$' + valid_name, Name.Constant),
+
+            # everything else. We re-flag some of these in the method above.
+            (valid_name, Name),
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'keyword': [
+            (r'"', String.Symbol, '#pop'),
+            (r'[^\\"]+', String.Symbol),  # all other characters
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-f0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ]
+    }
+
+
+class DylanLidLexer(RegexLexer):
+    """
+    For Dylan LID (Library Interchange Definition) files.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'DylanLID'
+    aliases = ['dylan-lid', 'lid']
+    filenames = ['*.lid', '*.hdp']
+    mimetypes = ['text/x-dylan-lid']
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'\s+', Text),
+
+            # single line comment
+            (r'//.*?\n', Comment.Single),
+
+            # lid header
+            (r'(.*?)(:)([ \t]*)(.*(?:\n[ \t].+)*)',
+             bygroups(Name.Attribute, Operator, Text, String)),
+        ]
+    }
+
+
+class DylanConsoleLexer(Lexer):
+    """
+    For Dylan interactive console output like:
+
+    .. sourcecode:: dylan-console
+
+        ? let a = 1;
+        => 1
+        ? a
+        => 1
+
+    This is based on a copy of the RubyConsoleLexer.
+
+    .. versionadded:: 1.6
+    """
+    name = 'Dylan session'
+    aliases = ['dylan-console', 'dylan-repl']
+    filenames = ['*.dylan-console']
+    mimetypes = ['text/x-dylan-console']
+
+    _line_re = re.compile('.*?\n')
+    _prompt_re = re.compile('\?| ')
+
+    def get_tokens_unprocessed(self, text):
+        dylexer = DylanLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in self._line_re.finditer(text):
+            line = match.group()
+            m = self._prompt_re.match(line)
+            if m is not None:
+                end = m.end()
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:end])]))
+                curcode += line[end:]
+            else:
+                if curcode:
+                    for item in do_insertions(insertions,
+                                              dylexer.get_tokens_unprocessed(curcode)):
+                        yield item
+                    curcode = ''
+                    insertions = []
+                yield match.start(), Generic.Output, line
+        if curcode:
+            for item in do_insertions(insertions,
+                                      dylexer.get_tokens_unprocessed(curcode)):
+                yield item
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/erlang.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/erlang.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/erlang.py	(revision 1126)
@@ -0,0 +1,533 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.erlang
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Erlang.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, words, do_insertions, \
+    include, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic
+
+__all__ = ['ErlangLexer', 'ErlangShellLexer', 'ElixirConsoleLexer',
+           'ElixirLexer']
+
+
+line_re = re.compile('.*?\n')
+
+
+class ErlangLexer(RegexLexer):
+    """
+    For the Erlang functional programming language.
+
+    Blame Jeremy Thurgood (http://jerith.za.net/).
+
+    .. versionadded:: 0.9
+    """
+
+    name = 'Erlang'
+    aliases = ['erlang']
+    filenames = ['*.erl', '*.hrl', '*.es', '*.escript']
+    mimetypes = ['text/x-erlang']
+
+    keywords = (
+        'after', 'begin', 'case', 'catch', 'cond', 'end', 'fun', 'if',
+        'let', 'of', 'query', 'receive', 'try', 'when',
+    )
+
+    builtins = (  # See erlang(3) man page
+        'abs', 'append_element', 'apply', 'atom_to_list', 'binary_to_list',
+        'bitstring_to_list', 'binary_to_term', 'bit_size', 'bump_reductions',
+        'byte_size', 'cancel_timer', 'check_process_code', 'delete_module',
+        'demonitor', 'disconnect_node', 'display', 'element', 'erase', 'exit',
+        'float', 'float_to_list', 'fun_info', 'fun_to_list',
+        'function_exported', 'garbage_collect', 'get', 'get_keys',
+        'group_leader', 'hash', 'hd', 'integer_to_list', 'iolist_to_binary',
+        'iolist_size', 'is_atom', 'is_binary', 'is_bitstring', 'is_boolean',
+        'is_builtin', 'is_float', 'is_function', 'is_integer', 'is_list',
+        'is_number', 'is_pid', 'is_port', 'is_process_alive', 'is_record',
+        'is_reference', 'is_tuple', 'length', 'link', 'list_to_atom',
+        'list_to_binary', 'list_to_bitstring', 'list_to_existing_atom',
+        'list_to_float', 'list_to_integer', 'list_to_pid', 'list_to_tuple',
+        'load_module', 'localtime_to_universaltime', 'make_tuple', 'md5',
+        'md5_final', 'md5_update', 'memory', 'module_loaded', 'monitor',
+        'monitor_node', 'node', 'nodes', 'open_port', 'phash', 'phash2',
+        'pid_to_list', 'port_close', 'port_command', 'port_connect',
+        'port_control', 'port_call', 'port_info', 'port_to_list',
+        'process_display', 'process_flag', 'process_info', 'purge_module',
+        'put', 'read_timer', 'ref_to_list', 'register', 'resume_process',
+        'round', 'send', 'send_after', 'send_nosuspend', 'set_cookie',
+        'setelement', 'size', 'spawn', 'spawn_link', 'spawn_monitor',
+        'spawn_opt', 'split_binary', 'start_timer', 'statistics',
+        'suspend_process', 'system_flag', 'system_info', 'system_monitor',
+        'system_profile', 'term_to_binary', 'tl', 'trace', 'trace_delivered',
+        'trace_info', 'trace_pattern', 'trunc', 'tuple_size', 'tuple_to_list',
+        'universaltime_to_localtime', 'unlink', 'unregister', 'whereis'
+    )
+
+    operators = r'(\+\+?|--?|\*|/|<|>|/=|=:=|=/=|=<|>=|==?|<-|!|\?)'
+    word_operators = (
+        'and', 'andalso', 'band', 'bnot', 'bor', 'bsl', 'bsr', 'bxor',
+        'div', 'not', 'or', 'orelse', 'rem', 'xor'
+    )
+
+    atom_re = r"(?:[a-z]\w*|'[^\n']*[^\\]')"
+
+    variable_re = r'(?:[A-Z_]\w*)'
+
+    esc_char_re = r'[bdefnrstv\'"\\]'
+    esc_octal_re = r'[0-7][0-7]?[0-7]?'
+    esc_hex_re = r'(?:x[0-9a-fA-F]{2}|x\{[0-9a-fA-F]+\})'
+    esc_ctrl_re = r'\^[a-zA-Z]'
+    escape_re = r'(?:\\(?:'+esc_char_re+r'|'+esc_octal_re+r'|'+esc_hex_re+r'|'+esc_ctrl_re+r'))'
+
+    macro_re = r'(?:'+variable_re+r'|'+atom_re+r')'
+
+    base_re = r'(?:[2-9]|[12][0-9]|3[0-6])'
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'%.*\n', Comment),
+            (words(keywords, suffix=r'\b'), Keyword),
+            (words(builtins, suffix=r'\b'), Name.Builtin),
+            (words(word_operators, suffix=r'\b'), Operator.Word),
+            (r'^-', Punctuation, 'directive'),
+            (operators, Operator),
+            (r'"', String, 'string'),
+            (r'<<', Name.Label),
+            (r'>>', Name.Label),
+            ('(' + atom_re + ')(:)', bygroups(Name.Namespace, Punctuation)),
+            ('(?:^|(?<=:))(' + atom_re + r')(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[+-]?' + base_re + r'#[0-9a-zA-Z]+', Number.Integer),
+            (r'[+-]?\d+', Number.Integer),
+            (r'[+-]?\d+.\d+', Number.Float),
+            (r'[]\[:_@\".{}()|;,]', Punctuation),
+            (variable_re, Name.Variable),
+            (atom_re, Name),
+            (r'\?'+macro_re, Name.Constant),
+            (r'\$(?:'+escape_re+r'|\\[ %]|[^\\])', String.Char),
+            (r'#'+atom_re+r'(:?\.'+atom_re+r')?', Name.Label),
+
+            # Erlang script shebang
+            (r'\A#!.+\n', Comment.Hashbang),
+
+            # EEP 43: Maps
+            # http://www.erlang.org/eeps/eep-0043.html
+            (r'#\{', Punctuation, 'map_key'),
+        ],
+        'string': [
+            (escape_re, String.Escape),
+            (r'"', String, '#pop'),
+            (r'~[0-9.*]*[~#+BPWXb-ginpswx]', String.Interpol),
+            (r'[^"\\~]+', String),
+            (r'~', String),
+        ],
+        'directive': [
+            (r'(define)(\s*)(\()('+macro_re+r')',
+             bygroups(Name.Entity, Text, Punctuation, Name.Constant), '#pop'),
+            (r'(record)(\s*)(\()('+macro_re+r')',
+             bygroups(Name.Entity, Text, Punctuation, Name.Label), '#pop'),
+            (atom_re, Name.Entity, '#pop'),
+        ],
+        'map_key': [
+            include('root'),
+            (r'=>', Punctuation, 'map_val'),
+            (r':=', Punctuation, 'map_val'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'map_val': [
+            include('root'),
+            (r',', Punctuation, '#pop'),
+            (r'(?=\})', Punctuation, '#pop'),
+        ],
+    }
+
+
+class ErlangShellLexer(Lexer):
+    """
+    Shell sessions in erl (for Erlang code).
+
+    .. versionadded:: 1.1
+    """
+    name = 'Erlang erl session'
+    aliases = ['erl']
+    filenames = ['*.erl-sh']
+    mimetypes = ['text/x-erl-shellsession']
+
+    _prompt_re = re.compile(r'\d+>(?=\s|\Z)')
+
+    def get_tokens_unprocessed(self, text):
+        erlexer = ErlangLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            m = self._prompt_re.match(line)
+            if m is not None:
+                end = m.end()
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:end])]))
+                curcode += line[end:]
+            else:
+                if curcode:
+                    for item in do_insertions(insertions,
+                                              erlexer.get_tokens_unprocessed(curcode)):
+                        yield item
+                    curcode = ''
+                    insertions = []
+                if line.startswith('*'):
+                    yield match.start(), Generic.Traceback, line
+                else:
+                    yield match.start(), Generic.Output, line
+        if curcode:
+            for item in do_insertions(insertions,
+                                      erlexer.get_tokens_unprocessed(curcode)):
+                yield item
+
+
+def gen_elixir_string_rules(name, symbol, token):
+    states = {}
+    states['string_' + name] = [
+        (r'[^#%s\\]+' % (symbol,), token),
+        include('escapes'),
+        (r'\\.', token),
+        (r'(%s)' % (symbol,), bygroups(token), "#pop"),
+        include('interpol')
+    ]
+    return states
+
+
+def gen_elixir_sigstr_rules(term, token, interpol=True):
+    if interpol:
+        return [
+            (r'[^#%s\\]+' % (term,), token),
+            include('escapes'),
+            (r'\\.', token),
+            (r'%s[a-zA-Z]*' % (term,), token, '#pop'),
+            include('interpol')
+        ]
+    else:
+        return [
+            (r'[^%s\\]+' % (term,), token),
+            (r'\\.', token),
+            (r'%s[a-zA-Z]*' % (term,), token, '#pop'),
+        ]
+
+
+class ElixirLexer(RegexLexer):
+    """
+    For the `Elixir language <http://elixir-lang.org>`_.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Elixir'
+    aliases = ['elixir', 'ex', 'exs']
+    filenames = ['*.ex', '*.exs']
+    mimetypes = ['text/x-elixir']
+
+    KEYWORD = ('fn', 'do', 'end', 'after', 'else', 'rescue', 'catch')
+    KEYWORD_OPERATOR = ('not', 'and', 'or', 'when', 'in')
+    BUILTIN = (
+        'case', 'cond', 'for', 'if', 'unless', 'try', 'receive', 'raise',
+        'quote', 'unquote', 'unquote_splicing', 'throw', 'super',
+    )
+    BUILTIN_DECLARATION = (
+        'def', 'defp', 'defmodule', 'defprotocol', 'defmacro', 'defmacrop',
+        'defdelegate', 'defexception', 'defstruct', 'defimpl', 'defcallback',
+    )
+
+    BUILTIN_NAMESPACE = ('import', 'require', 'use', 'alias')
+    CONSTANT = ('nil', 'true', 'false')
+
+    PSEUDO_VAR = ('_', '__MODULE__', '__DIR__', '__ENV__', '__CALLER__')
+
+    OPERATORS3 = (
+        '<<<', '>>>', '|||', '&&&', '^^^', '~~~', '===', '!==',
+        '~>>', '<~>', '|~>', '<|>',
+    )
+    OPERATORS2 = (
+        '==', '!=', '<=', '>=', '&&', '||', '<>', '++', '--', '|>', '=~',
+        '->', '<-', '|', '.', '=', '~>', '<~',
+    )
+    OPERATORS1 = ('<', '>', '+', '-', '*', '/', '!', '^', '&')
+
+    PUNCTUATION = (
+        '\\\\', '<<', '>>', '=>', '(', ')', ':', ';', ',', '[', ']',
+    )
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                if value in self.KEYWORD:
+                    yield index, Keyword, value
+                elif value in self.KEYWORD_OPERATOR:
+                    yield index, Operator.Word, value
+                elif value in self.BUILTIN:
+                    yield index, Keyword, value
+                elif value in self.BUILTIN_DECLARATION:
+                    yield index, Keyword.Declaration, value
+                elif value in self.BUILTIN_NAMESPACE:
+                    yield index, Keyword.Namespace, value
+                elif value in self.CONSTANT:
+                    yield index, Name.Constant, value
+                elif value in self.PSEUDO_VAR:
+                    yield index, Name.Builtin.Pseudo, value
+                else:
+                    yield index, token, value
+            else:
+                yield index, token, value
+
+    def gen_elixir_sigil_rules():
+        # all valid sigil terminators (excluding heredocs)
+        terminators = [
+            (r'\{', r'\}', 'cb'),
+            (r'\[', r'\]', 'sb'),
+            (r'\(', r'\)', 'pa'),
+            (r'<', r'>', 'ab'),
+            (r'/', r'/', 'slas'),
+            (r'\|', r'\|', 'pipe'),
+            ('"', '"', 'quot'),
+            ("'", "'", 'apos'),
+        ]
+
+        # heredocs have slightly different rules
+        triquotes = [(r'"""', 'triquot'), (r"'''", 'triapos')]
+
+        token = String.Other
+        states = {'sigils': []}
+
+        for term, name in triquotes:
+            states['sigils'] += [
+                (r'(~[a-z])(%s)' % (term,), bygroups(token, String.Heredoc),
+                    (name + '-end', name + '-intp')),
+                (r'(~[A-Z])(%s)' % (term,), bygroups(token, String.Heredoc),
+                    (name + '-end', name + '-no-intp')),
+            ]
+
+            states[name + '-end'] = [
+                (r'[a-zA-Z]+', token, '#pop'),
+                default('#pop'),
+            ]
+            states[name + '-intp'] = [
+                (r'^\s*' + term, String.Heredoc, '#pop'),
+                include('heredoc_interpol'),
+            ]
+            states[name + '-no-intp'] = [
+                (r'^\s*' + term, String.Heredoc, '#pop'),
+                include('heredoc_no_interpol'),
+            ]
+
+        for lterm, rterm, name in terminators:
+            states['sigils'] += [
+                (r'~[a-z]' + lterm, token, name + '-intp'),
+                (r'~[A-Z]' + lterm, token, name + '-no-intp'),
+            ]
+            states[name + '-intp'] = gen_elixir_sigstr_rules(rterm, token)
+            states[name + '-no-intp'] = \
+                gen_elixir_sigstr_rules(rterm, token, interpol=False)
+
+        return states
+
+    op3_re = "|".join(re.escape(s) for s in OPERATORS3)
+    op2_re = "|".join(re.escape(s) for s in OPERATORS2)
+    op1_re = "|".join(re.escape(s) for s in OPERATORS1)
+    ops_re = r'(?:%s|%s|%s)' % (op3_re, op2_re, op1_re)
+    punctuation_re = "|".join(re.escape(s) for s in PUNCTUATION)
+    alnum = '\w'
+    name_re = r'(?:\.\.\.|[a-z_]%s*[!?]?)' % alnum
+    modname_re = r'[A-Z]%(alnum)s*(?:\.[A-Z]%(alnum)s*)*' % {'alnum': alnum}
+    complex_name_re = r'(?:%s|%s|%s)' % (name_re, modname_re, ops_re)
+    special_atom_re = r'(?:\.\.\.|<<>>|%\{\}|%|\{\})'
+
+    long_hex_char_re = r'(\\x\{)([\da-fA-F]+)(\})'
+    hex_char_re = r'(\\x[\da-fA-F]{1,2})'
+    escape_char_re = r'(\\[abdefnrstv])'
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#.*$', Comment.Single),
+
+            # Various kinds of characters
+            (r'(\?)' + long_hex_char_re,
+                bygroups(String.Char,
+                         String.Escape, Number.Hex, String.Escape)),
+            (r'(\?)' + hex_char_re,
+                bygroups(String.Char, String.Escape)),
+            (r'(\?)' + escape_char_re,
+                bygroups(String.Char, String.Escape)),
+            (r'\?\\?.', String.Char),
+
+            # '::' has to go before atoms
+            (r':::', String.Symbol),
+            (r'::', Operator),
+
+            # atoms
+            (r':' + special_atom_re, String.Symbol),
+            (r':' + complex_name_re, String.Symbol),
+            (r':"', String.Symbol, 'string_double_atom'),
+            (r":'", String.Symbol, 'string_single_atom'),
+
+            # [keywords: ...]
+            (r'(%s|%s)(:)(?=\s|\n)' % (special_atom_re, complex_name_re),
+                bygroups(String.Symbol, Punctuation)),
+
+            # @attributes
+            (r'@' + name_re, Name.Attribute),
+
+            # identifiers
+            (name_re, Name),
+            (r'(%%?)(%s)' % (modname_re,), bygroups(Punctuation, Name.Class)),
+
+            # operators and punctuation
+            (op3_re, Operator),
+            (op2_re, Operator),
+            (punctuation_re, Punctuation),
+            (r'&\d', Name.Entity),   # anon func arguments
+            (op1_re, Operator),
+
+            # numbers
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[\da-fA-F]+', Number.Hex),
+            (r'\d(_?\d)*\.\d(_?\d)*([eE][-+]?\d(_?\d)*)?', Number.Float),
+            (r'\d(_?\d)*', Number.Integer),
+
+            # strings and heredocs
+            (r'"""\s*', String.Heredoc, 'heredoc_double'),
+            (r"'''\s*$", String.Heredoc, 'heredoc_single'),
+            (r'"', String.Double, 'string_double'),
+            (r"'", String.Single, 'string_single'),
+
+            include('sigils'),
+
+            (r'%\{', Punctuation, 'map_key'),
+            (r'\{', Punctuation, 'tuple'),
+        ],
+        'heredoc_double': [
+            (r'^\s*"""', String.Heredoc, '#pop'),
+            include('heredoc_interpol'),
+        ],
+        'heredoc_single': [
+            (r"^\s*'''", String.Heredoc, '#pop'),
+            include('heredoc_interpol'),
+        ],
+        'heredoc_interpol': [
+            (r'[^#\\\n]+', String.Heredoc),
+            include('escapes'),
+            (r'\\.', String.Heredoc),
+            (r'\n+', String.Heredoc),
+            include('interpol'),
+        ],
+        'heredoc_no_interpol': [
+            (r'[^\\\n]+', String.Heredoc),
+            (r'\\.', String.Heredoc),
+            (r'\n+', String.Heredoc),
+        ],
+        'escapes': [
+            (long_hex_char_re,
+                bygroups(String.Escape, Number.Hex, String.Escape)),
+            (hex_char_re, String.Escape),
+            (escape_char_re, String.Escape),
+        ],
+        'interpol': [
+            (r'#\{', String.Interpol, 'interpol_string'),
+        ],
+        'interpol_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'map_key': [
+            include('root'),
+            (r':', Punctuation, 'map_val'),
+            (r'=>', Punctuation, 'map_val'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'map_val': [
+            include('root'),
+            (r',', Punctuation, '#pop'),
+            (r'(?=\})', Punctuation, '#pop'),
+        ],
+        'tuple': [
+            include('root'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+    }
+    tokens.update(gen_elixir_string_rules('double', '"', String.Double))
+    tokens.update(gen_elixir_string_rules('single', "'", String.Single))
+    tokens.update(gen_elixir_string_rules('double_atom', '"', String.Symbol))
+    tokens.update(gen_elixir_string_rules('single_atom', "'", String.Symbol))
+    tokens.update(gen_elixir_sigil_rules())
+
+
+class ElixirConsoleLexer(Lexer):
+    """
+    For Elixir interactive console (iex) output like:
+
+    .. sourcecode:: iex
+
+        iex> [head | tail] = [1,2,3]
+        [1,2,3]
+        iex> head
+        1
+        iex> tail
+        [2,3]
+        iex> [head | tail]
+        [1,2,3]
+        iex> length [head | tail]
+        3
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Elixir iex session'
+    aliases = ['iex']
+    mimetypes = ['text/x-elixir-shellsession']
+
+    _prompt_re = re.compile('(iex|\.{3})(\(\d+\))?> ')
+
+    def get_tokens_unprocessed(self, text):
+        exlexer = ElixirLexer(**self.options)
+
+        curcode = ''
+        in_error = False
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith(u'** '):
+                in_error = True
+                insertions.append((len(curcode),
+                                   [(0, Generic.Error, line[:-1])]))
+                curcode += line[-1:]
+            else:
+                m = self._prompt_re.match(line)
+                if m is not None:
+                    in_error = False
+                    end = m.end()
+                    insertions.append((len(curcode),
+                                       [(0, Generic.Prompt, line[:end])]))
+                    curcode += line[end:]
+                else:
+                    if curcode:
+                        for item in do_insertions(
+                                insertions, exlexer.get_tokens_unprocessed(curcode)):
+                            yield item
+                        curcode = ''
+                        insertions = []
+                    token = Generic.Error if in_error else Generic.Output
+                    yield match.start(), token, line
+        if curcode:
+            for item in do_insertions(
+                    insertions, exlexer.get_tokens_unprocessed(curcode)):
+                yield item
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/web.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/web.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/web.py	(revision 1126)
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.web
+    ~~~~~~~~~~~~~~~~~~~
+
+    Just export previously exported lexers.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexers.html import HtmlLexer, DtdLexer, XmlLexer, XsltLexer, \
+    HamlLexer, ScamlLexer, JadeLexer
+from pygments.lexers.css import CssLexer, SassLexer, ScssLexer
+from pygments.lexers.javascript import JavascriptLexer, LiveScriptLexer, \
+    DartLexer, TypeScriptLexer, LassoLexer, ObjectiveJLexer, CoffeeScriptLexer
+from pygments.lexers.actionscript import ActionScriptLexer, \
+    ActionScript3Lexer, MxmlLexer
+from pygments.lexers.php import PhpLexer
+from pygments.lexers.webmisc import DuelLexer, XQueryLexer, SlimLexer, QmlLexer
+from pygments.lexers.data import JsonLexer
+JSONLexer = JsonLexer  # for backwards compatibility with Pygments 1.5
+
+__all__ = []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/testing.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/testing.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/testing.py	(revision 1126)
@@ -0,0 +1,207 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.testing
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for testing languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Comment, Keyword, Name, String, Number, Generic, Text
+
+__all__ = ['GherkinLexer', 'TAPLexer']
+
+
+class GherkinLexer(RegexLexer):
+    """
+    For `Gherkin <http://github.com/aslakhellesoy/gherkin/>` syntax.
+
+    .. versionadded:: 1.2
+    """
+    name = 'Gherkin'
+    aliases = ['cucumber', 'gherkin']
+    filenames = ['*.feature']
+    mimetypes = ['text/x-gherkin']
+
+    feature_keywords = u'^(기능|機能|功能|フィーチャ|خاصية|תכונה|Функціонал|Функционалност|Функционал|Фича|Особина|Могућност|Özellik|Właściwość|Tính năng|Trajto|Savybė|Požiadavka|Požadavek|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Fīča|Funzionalità|Funktionalität|Funkcionalnost|Funkcionalitāte|Funcționalitate|Functionaliteit|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Feature|Egenskap|Egenskab|Crikey|Característica|Arwedd)(:)(.*)$'
+    feature_element_keywords = u'^(\\s*)(시나리오 개요|시나리오|배경|背景|場景大綱|場景|场景大纲|场景|劇本大綱|劇本|剧本大纲|剧本|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|シナリオ|سيناريو مخطط|سيناريو|الخلفية|תרחיש|תבנית תרחיש|רקע|Тарих|Сценарій|Сценарио|Сценарий структураси|Сценарий|Структура сценарію|Структура сценарија|Структура сценария|Скица|Рамка на сценарий|Пример|Предыстория|Предистория|Позадина|Передумова|Основа|Концепт|Контекст|Założenia|Wharrimean is|Tình huống|The thing of it is|Tausta|Taust|Tapausaihio|Tapaus|Szenariogrundriss|Szenario|Szablon scenariusza|Stsenaarium|Struktura scenarija|Skica|Skenario konsep|Skenario|Situācija|Senaryo taslağı|Senaryo|Scénář|Scénario|Schema dello scenario|Scenārijs pēc parauga|Scenārijs|Scenár|Scenaro|Scenariusz|Scenariul de şablon|Scenariul de sablon|Scenariu|Scenario Outline|Scenario Amlinellol|Scenario|Scenarijus|Scenarijaus šablonas|Scenarij|Scenarie|Rerefons|Raamstsenaarium|Primer|Pozadí|Pozadina|Pozadie|Plan du scénario|Plan du Scénario|Osnova scénáře|Osnova|Náčrt Scénáře|Náčrt Scenáru|Mate|MISHUN SRSLY|MISHUN|Kịch bản|Konturo de la scenaro|Kontext|Konteksts|Kontekstas|Kontekst|Koncept|Khung tình huống|Khung kịch bản|Háttér|Grundlage|Geçmiş|Forgatókönyv vázlat|Forgatókönyv|Fono|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l\'escenari|Escenario|Escenari|Dis is what went down|Dasar|Contexto|Contexte|Contesto|Condiţii|Conditii|Cenário|Cenario|Cefndir|Bối cảnh|Blokes|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|All y\'all|Achtergrond|Abstrakt Scenario|Abstract Scenario)(:)(.*)$'
+    examples_keywords = u'^(\\s*)(예|例子|例|サンプル|امثلة|דוגמאות|Сценарији|Примери|Приклади|Мисоллар|Значения|Örnekler|Voorbeelden|Variantai|Tapaukset|Scenarios|Scenariji|Scenarijai|Příklady|Példák|Príklady|Przykłady|Primjeri|Primeri|Piemēri|Pavyzdžiai|Paraugs|Juhtumid|Exemplos|Exemples|Exemplele|Exempel|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|EXAMPLZ|Dữ liệu|Contoh|Cobber|Beispiele)(:)(.*)$'
+    step_keywords = u'^(\\s*)(하지만|조건|먼저|만일|만약|단|그리고|그러면|那麼|那么|而且|當|当|前提|假設|假设|假如|假定|但是|但し|並且|并且|同時|同时|もし|ならば|ただし|しかし|かつ|و |متى |لكن |عندما |ثم |بفرض |اذاً |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Унда |То |Припустимо, що |Припустимо |Онда |Но |Нехай |Лекин |Когато |Када |Кад |К тому же |И |Задато |Задати |Задате |Если |Допустим |Дадено |Ва |Бирок |Аммо |Али |Але |Агар |А |І |Și |És |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Youse know when youse got |Youse know like when |Yna |Ya know how |Ya gotta |Y |Wun |Wtedy |When y\'all |When |Wenn |WEN |Và |Ve |Und |Un |Thì |Then y\'all |Then |Tapi |Tak |Tada |Tad |Så |Stel |Soit |Siis |Si |Sed |Se |Quando |Quand |Quan |Pryd |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Når |När |Niin |Nhưng |N |Mutta |Men |Mas |Maka |Majd |Mais |Maar |Ma |Lorsque |Lorsqu\'|Kun |Kuid |Kui |Khi |Keď |Ketika |Když |Kaj |Kai |Kada |Kad |Jeżeli |Ja |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y\'all |Given |Gitt |Gegeven |Gegeben sei |Fakat |Eğer ki |Etant donné |Et |Então |Entonces |Entao |En |Eeldades |E |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Dengan |Den youse gotta |De |Dato |Dar |Dann |Dan |Dado |Dacă |Daca |DEN |Când |Cuando |Cho |Cept |Cand |Cal |But y\'all |But |Buh |Biết |Bet |BUT |Atès |Atunci |Atesa |Anrhegedig a |Angenommen |And y\'all |And |An |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Aber |AN |A také |A |\* )'
+
+    tokens = {
+        'comments': [
+            (r'^\s*#.*$', Comment),
+        ],
+        'feature_elements': [
+            (step_keywords, Keyword, "step_content_stack"),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'feature_elements_on_stack': [
+            (step_keywords, Keyword, "#pop:2"),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'examples_table': [
+            (r"\s+\|", Keyword, 'examples_table_header'),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'examples_table_header': [
+            (r"\s+\|\s*$", Keyword, "#pop:2"),
+            include('comments'),
+            (r"\\\|", Name.Variable),
+            (r"\s*\|", Keyword),
+            (r"[^|]", Name.Variable),
+        ],
+        'scenario_sections_on_stack': [
+            (feature_element_keywords,
+             bygroups(Name.Function, Keyword, Keyword, Name.Function),
+             "feature_elements_on_stack"),
+        ],
+        'narrative': [
+            include('scenario_sections_on_stack'),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'table_vars': [
+            (r'(<[^>]+>)', Name.Variable),
+        ],
+        'numbers': [
+            (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', String),
+        ],
+        'string': [
+            include('table_vars'),
+            (r'(\s|.)', String),
+        ],
+        'py_string': [
+            (r'"""', Keyword, "#pop"),
+            include('string'),
+        ],
+        'step_content_root': [
+            (r"$", Keyword, "#pop"),
+            include('step_content'),
+        ],
+        'step_content_stack': [
+            (r"$", Keyword, "#pop:2"),
+            include('step_content'),
+        ],
+        'step_content': [
+            (r'"', Name.Function, "double_string"),
+            include('table_vars'),
+            include('numbers'),
+            include('comments'),
+            (r'(\s|.)', Name.Function),
+        ],
+        'table_content': [
+            (r"\s+\|\s*$", Keyword, "#pop"),
+            include('comments'),
+            (r"\\\|", String),
+            (r"\s*\|", Keyword),
+            include('string'),
+        ],
+        'double_string': [
+            (r'"', Name.Function, "#pop"),
+            include('string'),
+        ],
+        'root': [
+            (r'\n', Name.Function),
+            include('comments'),
+            (r'"""', Keyword, "py_string"),
+            (r'\s+\|', Keyword, 'table_content'),
+            (r'"', Name.Function, "double_string"),
+            include('table_vars'),
+            include('numbers'),
+            (r'(\s*)(@[^@\r\n\t ]+)', bygroups(Name.Function, Name.Tag)),
+            (step_keywords, bygroups(Name.Function, Keyword),
+             'step_content_root'),
+            (feature_keywords, bygroups(Keyword, Keyword, Name.Function),
+             'narrative'),
+            (feature_element_keywords,
+             bygroups(Name.Function, Keyword, Keyword, Name.Function),
+             'feature_elements'),
+            (examples_keywords,
+             bygroups(Name.Function, Keyword, Keyword, Name.Function),
+             'examples_table'),
+            (r'(\s|.)', Name.Function),
+        ]
+    }
+
+
+class TAPLexer(RegexLexer):
+    """
+    For Test Anything Protocol (TAP) output.
+
+    .. versionadded:: 2.1
+    """
+    name = 'TAP'
+    aliases = ['tap']
+    filenames = ['*.tap']
+
+    tokens = {
+        'root': [
+            # A TAP version may be specified.
+            (r'^TAP version \d+\n', Name.Namespace),
+
+            # Specify a plan with a plan line.
+            (r'^1\.\.\d+', Keyword.Declaration, 'plan'),
+
+            # A test failure
+            (r'^(not ok)([^\S\n]*)(\d*)',
+             bygroups(Generic.Error, Text, Number.Integer), 'test'),
+
+            # A test success
+            (r'^(ok)([^\S\n]*)(\d*)',
+             bygroups(Keyword.Reserved, Text, Number.Integer), 'test'),
+
+            # Diagnostics start with a hash.
+            (r'^#.*\n', Comment),
+
+            # TAP's version of an abort statement.
+            (r'^Bail out!.*\n', Generic.Error),
+
+            # TAP ignores any unrecognized lines.
+            (r'^.*\n', Text),
+        ],
+        'plan': [
+            # Consume whitespace (but not newline).
+            (r'[^\S\n]+', Text),
+
+            # A plan may have a directive with it.
+            (r'#', Comment, 'directive'),
+
+            # Or it could just end.
+            (r'\n', Comment, '#pop'),
+
+            # Anything else is wrong.
+            (r'.*\n', Generic.Error, '#pop'),
+        ],
+        'test': [
+            # Consume whitespace (but not newline).
+            (r'[^\S\n]+', Text),
+
+            # A test may have a directive with it.
+            (r'#', Comment, 'directive'),
+
+            (r'\S+', Text),
+
+            (r'\n', Text, '#pop'),
+        ],
+        'directive': [
+            # Consume whitespace (but not newline).
+            (r'[^\S\n]+', Comment),
+
+            # Extract todo items.
+            (r'(?i)\bTODO\b', Comment.Preproc),
+
+            # Extract skip items.
+            (r'(?i)\bSKIP\S*', Comment.Preproc),
+
+            (r'\S+', Comment),
+
+            (r'\n', Comment, '#pop:2'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/installers.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/installers.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/installers.py	(revision 1126)
@@ -0,0 +1,322 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.installers
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for installer/packager DSLs and formats.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation, Generic, Number, Whitespace
+
+__all__ = ['NSISLexer', 'RPMSpecLexer', 'SourcesListLexer',
+           'DebianControlLexer']
+
+
+class NSISLexer(RegexLexer):
+    """
+    For `NSIS <http://nsis.sourceforge.net/>`_ scripts.
+
+    .. versionadded:: 1.6
+    """
+    name = 'NSIS'
+    aliases = ['nsis', 'nsi', 'nsh']
+    filenames = ['*.nsi', '*.nsh']
+    mimetypes = ['text/x-nsis']
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'[;#].*\n', Comment),
+            (r"'.*?'", String.Single),
+            (r'"', String.Double, 'str_double'),
+            (r'`', String.Backtick, 'str_backtick'),
+            include('macro'),
+            include('interpol'),
+            include('basic'),
+            (r'\$\{[a-z_|][\w|]*\}', Keyword.Pseudo),
+            (r'/[a-z_]\w*', Name.Attribute),
+            ('.', Text),
+        ],
+        'basic': [
+            (r'(\n)(Function)(\s+)([._a-z][.\w]*)\b',
+             bygroups(Text, Keyword, Text, Name.Function)),
+            (r'\b([_a-z]\w*)(::)([a-z][a-z0-9]*)\b',
+             bygroups(Keyword.Namespace, Punctuation, Name.Function)),
+            (r'\b([_a-z]\w*)(:)', bygroups(Name.Label, Punctuation)),
+            (r'(\b[ULS]|\B)([!<>=]?=|\<\>?|\>)\B', Operator),
+            (r'[|+-]', Operator),
+            (r'\\', Punctuation),
+            (r'\b(Abort|Add(?:BrandingImage|Size)|'
+             r'Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|'
+             r'BG(?:Font|Gradient)|BrandingText|BringToFront|Call(?:InstDLL)?|'
+             r'(?:Sub)?Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|'
+             r'ComponentText|CopyFiles|CRCCheck|'
+             r'Create(?:Directory|Font|Shortcut)|Delete(?:INI(?:Sec|Str)|'
+             r'Reg(?:Key|Value))?|DetailPrint|DetailsButtonText|'
+             r'Dir(?:Show|Text|Var|Verify)|(?:Disabled|Enabled)Bitmap|'
+             r'EnableWindow|EnumReg(?:Key|Value)|Exch|Exec(?:Shell|Wait)?|'
+             r'ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|'
+             r'Read(?:Byte)?|Seek|Write(?:Byte)?)?|'
+             r'Find(?:Close|First|Next|Window)|FlushINI|Function(?:End)?|'
+             r'Get(?:CurInstType|CurrentAddress|DlgItem|DLLVersion(?:Local)?|'
+             r'ErrorLevel|FileTime(?:Local)?|FullPathName|FunctionAddress|'
+             r'InstDirError|LabelAddress|TempFileName)|'
+             r'Goto|HideWindow|Icon|'
+             r'If(?:Abort|Errors|FileExists|RebootFlag|Silent)|'
+             r'InitPluginsDir|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|'
+             r'Inst(?:ProgressFlags|Type(?:[GS]etText)?)|Int(?:CmpU?|Fmt|Op)|'
+             r'IsWindow|LangString(?:UP)?|'
+             r'License(?:BkColor|Data|ForceSelection|LangString|Text)|'
+             r'LoadLanguageFile|LockWindow|Log(?:Set|Text)|MessageBox|'
+             r'MiscButtonText|Name|Nop|OutFile|(?:Uninst)?Page(?:Ex(?:End)?)?|'
+             r'PluginDir|Pop|Push|Quit|Read(?:(?:Env|INI|Reg)Str|RegDWORD)|'
+             r'Reboot|(?:Un)?RegDLL|Rename|RequestExecutionLevel|ReserveFile|'
+             r'Return|RMDir|SearchPath|Section(?:Divider|End|'
+             r'(?:(?:Get|Set)(?:Flags|InstTypes|Size|Text))|Group(?:End)?|In)?|'
+             r'SendMessage|Set(?:AutoClose|BrandingImage|Compress(?:ionLevel|'
+             r'or(?:DictSize)?)?|CtlColors|CurInstType|DatablockOptimize|'
+             r'DateSave|Details(?:Print|View)|Error(?:s|Level)|FileAttributes|'
+             r'Font|OutPath|Overwrite|PluginUnload|RebootFlag|ShellVarContext|'
+             r'Silent|StaticBkColor)|'
+             r'Show(?:(?:I|Uni)nstDetails|Window)|Silent(?:Un)?Install|Sleep|'
+             r'SpaceTexts|Str(?:CmpS?|Cpy|Len)|SubSection(?:End)?|'
+             r'Uninstall(?:ButtonText|(?:Sub)?Caption|EXEName|Icon|Text)|'
+             r'UninstPage|Var|VI(?:AddVersionKey|ProductVersion)|WindowIcon|'
+             r'Write(?:INIStr|Reg(:?Bin|DWORD|(?:Expand)?Str)|Uninstaller)|'
+             r'XPStyle)\b', Keyword),
+            (r'\b(CUR|END|(?:FILE_ATTRIBUTE_)?'
+             r'(?:ARCHIVE|HIDDEN|NORMAL|OFFLINE|READONLY|SYSTEM|TEMPORARY)|'
+             r'HK(CC|CR|CU|DD|LM|PD|U)|'
+             r'HKEY_(?:CLASSES_ROOT|CURRENT_(?:CONFIG|USER)|DYN_DATA|'
+             r'LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|'
+             r'ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|'
+             r'MB_(?:ABORTRETRYIGNORE|DEFBUTTON[1-4]|'
+             r'ICON(?:EXCLAMATION|INFORMATION|QUESTION|STOP)|'
+             r'OK(?:CANCEL)?|RETRYCANCEL|RIGHT|SETFOREGROUND|TOPMOST|USERICON|'
+             r'YESNO(?:CANCEL)?)|SET|SHCTX|'
+             r'SW_(?:HIDE|SHOW(?:MAXIMIZED|MINIMIZED|NORMAL))|'
+             r'admin|all|auto|both|bottom|bzip2|checkbox|colored|current|false|'
+             r'force|hide|highest|if(?:diff|newer)|lastused|leave|left|'
+             r'listonly|lzma|nevershow|none|normal|off|on|pop|push|'
+             r'radiobuttons|right|show|silent|silentlog|smooth|textonly|top|'
+             r'true|try|user|zlib)\b', Name.Constant),
+        ],
+        'macro': [
+            (r'\!(addincludedir(?:dir)?|addplugindir|appendfile|cd|define|'
+             r'delfilefile|echo(?:message)?|else|endif|error|execute|'
+             r'if(?:macro)?n?(?:def)?|include|insertmacro|macro(?:end)?|packhdr|'
+             r'search(?:parse|replace)|system|tempfilesymbol|undef|verbose|'
+             r'warning)\b', Comment.Preproc),
+        ],
+        'interpol': [
+            (r'\$(R?[0-9])', Name.Builtin.Pseudo),    # registers
+            (r'\$(ADMINTOOLS|APPDATA|CDBURN_AREA|COOKIES|COMMONFILES(?:32|64)|'
+             r'DESKTOP|DOCUMENTS|EXE(?:DIR|FILE|PATH)|FAVORITES|FONTS|HISTORY|'
+             r'HWNDPARENT|INTERNET_CACHE|LOCALAPPDATA|MUSIC|NETHOOD|PICTURES|'
+             r'PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES(?:32|64)|QUICKLAUNCH|'
+             r'RECENT|RESOURCES(?:_LOCALIZED)?|SENDTO|SM(?:PROGRAMS|STARTUP)|'
+             r'STARTMENU|SYSDIR|TEMP(?:LATES)?|VIDEOS|WINDIR|\{NSISDIR\})',
+             Name.Builtin),
+            (r'\$(CMDLINE|INSTDIR|OUTDIR|LANGUAGE)', Name.Variable.Global),
+            (r'\$[a-z_]\w*', Name.Variable),
+        ],
+        'str_double': [
+            (r'"', String, '#pop'),
+            (r'\$(\\[nrt"]|\$)', String.Escape),
+            include('interpol'),
+            (r'.', String.Double),
+        ],
+        'str_backtick': [
+            (r'`', String, '#pop'),
+            (r'\$(\\[nrt"]|\$)', String.Escape),
+            include('interpol'),
+            (r'.', String.Double),
+        ],
+    }
+
+
+class RPMSpecLexer(RegexLexer):
+    """
+    For RPM ``.spec`` files.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'RPMSpec'
+    aliases = ['spec']
+    filenames = ['*.spec']
+    mimetypes = ['text/x-rpm-spec']
+
+    _directives = ('(?:package|prep|build|install|clean|check|pre[a-z]*|'
+                   'post[a-z]*|trigger[a-z]*|files)')
+
+    tokens = {
+        'root': [
+            (r'#.*\n', Comment),
+            include('basic'),
+        ],
+        'description': [
+            (r'^(%' + _directives + ')(.*)$',
+             bygroups(Name.Decorator, Text), '#pop'),
+            (r'\n', Text),
+            (r'.', Text),
+        ],
+        'changelog': [
+            (r'\*.*\n', Generic.Subheading),
+            (r'^(%' + _directives + ')(.*)$',
+             bygroups(Name.Decorator, Text), '#pop'),
+            (r'\n', Text),
+            (r'.', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            include('interpol'),
+            (r'.', String.Double),
+        ],
+        'basic': [
+            include('macro'),
+            (r'(?i)^(Name|Version|Release|Epoch|Summary|Group|License|Packager|'
+             r'Vendor|Icon|URL|Distribution|Prefix|Patch[0-9]*|Source[0-9]*|'
+             r'Requires\(?[a-z]*\)?|[a-z]+Req|Obsoletes|Suggests|Provides|Conflicts|'
+             r'Build[a-z]+|[a-z]+Arch|Auto[a-z]+)(:)(.*)$',
+             bygroups(Generic.Heading, Punctuation, using(this))),
+            (r'^%description', Name.Decorator, 'description'),
+            (r'^%changelog', Name.Decorator, 'changelog'),
+            (r'^(%' + _directives + ')(.*)$', bygroups(Name.Decorator, Text)),
+            (r'%(attr|defattr|dir|doc(?:dir)?|setup|config(?:ure)?|'
+             r'make(?:install)|ghost|patch[0-9]+|find_lang|exclude|verify)',
+             Keyword),
+            include('interpol'),
+            (r"'.*?'", String.Single),
+            (r'"', String.Double, 'string'),
+            (r'.', Text),
+        ],
+        'macro': [
+            (r'%define.*\n', Comment.Preproc),
+            (r'%\{\!\?.*%define.*\}', Comment.Preproc),
+            (r'(%(?:if(?:n?arch)?|else(?:if)?|endif))(.*)$',
+             bygroups(Comment.Preproc, Text)),
+        ],
+        'interpol': [
+            (r'%\{?__[a-z_]+\}?', Name.Function),
+            (r'%\{?_([a-z_]+dir|[a-z_]+path|prefix)\}?', Keyword.Pseudo),
+            (r'%\{\?\w+\}', Name.Variable),
+            (r'\$\{?RPM_[A-Z0-9_]+\}?', Name.Variable.Global),
+            (r'%\{[a-zA-Z]\w+\}', Keyword.Constant),
+        ]
+    }
+
+
+class SourcesListLexer(RegexLexer):
+    """
+    Lexer that highlights debian sources.list files.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'Debian Sourcelist'
+    aliases = ['sourceslist', 'sources.list', 'debsources']
+    filenames = ['sources.list']
+    mimetype = ['application/x-debian-sourceslist']
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#.*?$', Comment),
+            (r'^(deb(?:-src)?)(\s+)',
+             bygroups(Keyword, Text), 'distribution')
+        ],
+        'distribution': [
+            (r'#.*?$', Comment, '#pop'),
+            (r'\$\(ARCH\)', Name.Variable),
+            (r'[^\s$[]+', String),
+            (r'\[', String.Other, 'escaped-distribution'),
+            (r'\$', String),
+            (r'\s+', Text, 'components')
+        ],
+        'escaped-distribution': [
+            (r'\]', String.Other, '#pop'),
+            (r'\$\(ARCH\)', Name.Variable),
+            (r'[^\]$]+', String.Other),
+            (r'\$', String.Other)
+        ],
+        'components': [
+            (r'#.*?$', Comment, '#pop:2'),
+            (r'$', Text, '#pop:2'),
+            (r'\s+', Text),
+            (r'\S+', Keyword.Pseudo),
+        ]
+    }
+
+    def analyse_text(text):
+        for line in text.splitlines():
+            line = line.strip()
+            if line.startswith('deb ') or line.startswith('deb-src '):
+                return True
+
+
+class DebianControlLexer(RegexLexer):
+    """
+    Lexer for Debian ``control`` files and ``apt-cache show <pkg>`` outputs.
+
+    .. versionadded:: 0.9
+    """
+    name = 'Debian Control file'
+    aliases = ['control', 'debcontrol']
+    filenames = ['control']
+
+    tokens = {
+        'root': [
+            (r'^(Description)', Keyword, 'description'),
+            (r'^(Maintainer)(:\s*)', bygroups(Keyword, Text), 'maintainer'),
+            (r'^((Build-)?Depends)', Keyword, 'depends'),
+            (r'^((?:Python-)?Version)(:\s*)(\S+)$',
+             bygroups(Keyword, Text, Number)),
+            (r'^((?:Installed-)?Size)(:\s*)(\S+)$',
+             bygroups(Keyword, Text, Number)),
+            (r'^(MD5Sum|SHA1|SHA256)(:\s*)(\S+)$',
+             bygroups(Keyword, Text, Number)),
+            (r'^([a-zA-Z\-0-9\.]*?)(:\s*)(.*?)$',
+             bygroups(Keyword, Whitespace, String)),
+        ],
+        'maintainer': [
+            (r'<[^>]+>', Generic.Strong),
+            (r'<[^>]+>$', Generic.Strong, '#pop'),
+            (r',\n?', Text),
+            (r'.', Text),
+        ],
+        'description': [
+            (r'(.*)(Homepage)(: )(\S+)',
+             bygroups(Text, String, Name, Name.Class)),
+            (r':.*\n', Generic.Strong),
+            (r' .*\n', Text),
+            default('#pop'),
+        ],
+        'depends': [
+            (r':\s*', Text),
+            (r'(\$)(\{)(\w+\s*:\s*\w+)', bygroups(Operator, Text, Name.Entity)),
+            (r'\(', Text, 'depend_vers'),
+            (r',', Text),
+            (r'\|', Operator),
+            (r'[\s]+', Text),
+            (r'[})]\s*$', Text, '#pop'),
+            (r'\}', Text),
+            (r'[^,]$', Name.Function, '#pop'),
+            (r'([+.a-zA-Z0-9-])(\s*)', bygroups(Name.Function, Text)),
+            (r'\[.*?\]', Name.Entity),
+        ],
+        'depend_vers': [
+            (r'\),', Text, '#pop'),
+            (r'\)[^,]', Text, '#pop:2'),
+            (r'([><=]+)(\s*)([^)]+)', bygroups(Operator, Text, Number))
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/agile.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/agile.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/agile.py	(revision 1126)
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.agile
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexers.lisp import SchemeLexer
+from pygments.lexers.jvm import IokeLexer, ClojureLexer
+from pygments.lexers.python import PythonLexer, PythonConsoleLexer, \
+    PythonTracebackLexer, Python3Lexer, Python3TracebackLexer, DgLexer
+from pygments.lexers.ruby import RubyLexer, RubyConsoleLexer, FancyLexer
+from pygments.lexers.perl import PerlLexer, Perl6Lexer
+from pygments.lexers.d import CrocLexer, MiniDLexer
+from pygments.lexers.iolang import IoLexer
+from pygments.lexers.tcl import TclLexer
+from pygments.lexers.factor import FactorLexer
+from pygments.lexers.scripting import LuaLexer, MoonScriptLexer
+
+__all__ = []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ruby.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ruby.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ruby.py	(revision 1126)
@@ -0,0 +1,519 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ruby
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Ruby and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, ExtendedRegexLexer, include, \
+    bygroups, default, LexerContext, do_insertions, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Generic
+from pygments.util import shebang_matches
+
+__all__ = ['RubyLexer', 'RubyConsoleLexer', 'FancyLexer']
+
+line_re = re.compile('.*?\n')
+
+
+RUBY_OPERATORS = (
+    '*', '**', '-', '+', '-@', '+@', '/', '%', '&', '|', '^', '`', '~',
+    '[]', '[]=', '<<', '>>', '<', '<>', '<=>', '>', '>=', '==', '==='
+)
+
+
+class RubyLexer(ExtendedRegexLexer):
+    """
+    For `Ruby <http://www.ruby-lang.org>`_ source code.
+    """
+
+    name = 'Ruby'
+    aliases = ['rb', 'ruby', 'duby']
+    filenames = ['*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec',
+                 '*.rbx', '*.duby', 'Gemfile']
+    mimetypes = ['text/x-ruby', 'application/x-ruby']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    def heredoc_callback(self, match, ctx):
+        # okay, this is the hardest part of parsing Ruby...
+        # match: 1 = <<-?, 2 = quote? 3 = name 4 = quote? 5 = rest of line
+
+        start = match.start(1)
+        yield start, Operator, match.group(1)        # <<-?
+        yield match.start(2), String.Heredoc, match.group(2)   # quote ", ', `
+        yield match.start(3), String.Delimiter, match.group(3) # heredoc name
+        yield match.start(4), String.Heredoc, match.group(4)   # quote again
+
+        heredocstack = ctx.__dict__.setdefault('heredocstack', [])
+        outermost = not bool(heredocstack)
+        heredocstack.append((match.group(1) == '<<-', match.group(3)))
+
+        ctx.pos = match.start(5)
+        ctx.end = match.end(5)
+        # this may find other heredocs
+        for i, t, v in self.get_tokens_unprocessed(context=ctx):
+            yield i, t, v
+        ctx.pos = match.end()
+
+        if outermost:
+            # this is the outer heredoc again, now we can process them all
+            for tolerant, hdname in heredocstack:
+                lines = []
+                for match in line_re.finditer(ctx.text, ctx.pos):
+                    if tolerant:
+                        check = match.group().strip()
+                    else:
+                        check = match.group().rstrip()
+                    if check == hdname:
+                        for amatch in lines:
+                            yield amatch.start(), String.Heredoc, amatch.group()
+                        yield match.start(), String.Delimiter, match.group()
+                        ctx.pos = match.end()
+                        break
+                    else:
+                        lines.append(match)
+                else:
+                    # end of heredoc not found -- error!
+                    for amatch in lines:
+                        yield amatch.start(), Error, amatch.group()
+            ctx.end = len(ctx.text)
+            del heredocstack[:]
+
+    def gen_rubystrings_rules():
+        def intp_regex_callback(self, match, ctx):
+            yield match.start(1), String.Regex, match.group(1)  # begin
+            nctx = LexerContext(match.group(3), 0, ['interpolated-regex'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Regex, match.group(4)  # end[mixounse]*
+            ctx.pos = match.end()
+
+        def intp_string_callback(self, match, ctx):
+            yield match.start(1), String.Other, match.group(1)
+            nctx = LexerContext(match.group(3), 0, ['interpolated-string'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Other, match.group(4)  # end
+            ctx.pos = match.end()
+
+        states = {}
+        states['strings'] = [
+            # easy ones
+            (r'\:@{0,2}[a-zA-Z_]\w*[!?]?', String.Symbol),
+            (words(RUBY_OPERATORS, prefix=r'\:@{0,2}'), String.Symbol),
+            (r":'(\\\\|\\'|[^'])*'", String.Symbol),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r':"', String.Symbol, 'simple-sym'),
+            (r'([a-zA-Z_]\w*)(:)(?!:)',
+             bygroups(String.Symbol, Punctuation)),  # Since Ruby 1.9
+            (r'"', String.Double, 'simple-string'),
+            (r'(?<!\.)`', String.Backtick, 'simple-backtick'),
+        ]
+
+        # double-quoted string and symbol
+        for name, ttype, end in ('string', String.Double, '"'), \
+                                ('sym', String.Symbol, '"'), \
+                                ('backtick', String.Backtick, '`'):
+            states['simple-'+name] = [
+                include('string-intp-escaped'),
+                (r'[^\\%s#]+' % end, ttype),
+                (r'[\\#]', ttype),
+                (end, ttype, '#pop'),
+            ]
+
+        # braced quoted strings
+        for lbrace, rbrace, bracecc, name in \
+                ('\\{', '\\}', '{}', 'cb'), \
+                ('\\[', '\\]', '\\[\\]', 'sb'), \
+                ('\\(', '\\)', '()', 'pa'), \
+                ('<', '>', '<>', 'ab'):
+            states[name+'-intp-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                include('string-intp-escaped'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%[QWx]?' + lbrace, String.Other,
+                                      name+'-intp-string'))
+            states[name+'-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%[qsw]' + lbrace, String.Other,
+                                      name+'-string'))
+            states[name+'-regex'] = [
+                (r'\\[\\' + bracecc + ']', String.Regex),
+                (lbrace, String.Regex, '#push'),
+                (rbrace + '[mixounse]*', String.Regex, '#pop'),
+                include('string-intp'),
+                (r'[\\#' + bracecc + ']', String.Regex),
+                (r'[^\\#' + bracecc + ']+', String.Regex),
+            ]
+            states['strings'].append((r'%r' + lbrace, String.Regex,
+                                      name+'-regex'))
+
+        # these must come after %<brace>!
+        states['strings'] += [
+            # %r regex
+            (r'(%r([\W_]))((?:\\\2|(?!\2).)*)(\2[mixounse]*)',
+             intp_regex_callback),
+            # regular fancy strings with qsw
+            (r'%[qsw]([\W_])((?:\\\1|(?!\1).)*)\1', String.Other),
+            (r'(%[QWx]([\W_]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+            # special forms of fancy strings after operators or
+            # in method calls with braces
+            (r'(?<=[-+/*%=<>&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Text, String.Other, None)),
+            # and because of fixed width lookbehinds the whole thing a
+            # second time for line startings...
+            (r'^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Text, String.Other, None)),
+            # all regular fancy strings without qsw
+            (r'(%([^a-zA-Z0-9\s]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+        ]
+
+        return states
+
+    tokens = {
+        'root': [
+            (r'\A#!.+?$', Comment.Hashbang),
+            (r'#.*?$', Comment.Single),
+            (r'=begin\s.*?\n=end.*?$', Comment.Multiline),
+            # keywords
+            (words((
+                'BEGIN', 'END', 'alias', 'begin', 'break', 'case', 'defined?',
+                'do', 'else', 'elsif', 'end', 'ensure', 'for', 'if', 'in', 'next', 'redo',
+                'rescue', 'raise', 'retry', 'return', 'super', 'then', 'undef',
+                'unless', 'until', 'when', 'while', 'yield'), suffix=r'\b'),
+             Keyword),
+            # start of function, class and module names
+            (r'(module)(\s+)([a-zA-Z_]\w*'
+             r'(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Text, Name.Namespace)),
+            (r'(def)(\s+)', bygroups(Keyword, Text), 'funcname'),
+            (r'def(?=[*%&^`~+-/\[<>=])', Keyword, 'funcname'),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            # special methods
+            (words((
+                'initialize', 'new', 'loop', 'include', 'extend', 'raise', 'attr_reader',
+                'attr_writer', 'attr_accessor', 'attr', 'catch', 'throw', 'private',
+                'module_function', 'public', 'protected', 'true', 'false', 'nil'),
+                suffix=r'\b'),
+             Keyword.Pseudo),
+            (r'(not|and|or)\b', Operator.Word),
+            (words((
+                'autoload', 'block_given', 'const_defined', 'eql', 'equal', 'frozen', 'include',
+                'instance_of', 'is_a', 'iterator', 'kind_of', 'method_defined', 'nil',
+                'private_method_defined', 'protected_method_defined',
+                'public_method_defined', 'respond_to', 'tainted'), suffix=r'\?'),
+             Name.Builtin),
+            (r'(chomp|chop|exit|gsub|sub)!', Name.Builtin),
+            (words((
+                'Array', 'Float', 'Integer', 'String', '__id__', '__send__', 'abort',
+                'ancestors', 'at_exit', 'autoload', 'binding', 'callcc', 'caller',
+                'catch', 'chomp', 'chop', 'class_eval', 'class_variables',
+                'clone', 'const_defined?', 'const_get', 'const_missing', 'const_set',
+                'constants', 'display', 'dup', 'eval', 'exec', 'exit', 'extend', 'fail', 'fork',
+                'format', 'freeze', 'getc', 'gets', 'global_variables', 'gsub',
+                'hash', 'id', 'included_modules', 'inspect', 'instance_eval',
+                'instance_method', 'instance_methods',
+                'instance_variable_get', 'instance_variable_set', 'instance_variables',
+                'lambda', 'load', 'local_variables', 'loop',
+                'method', 'method_missing', 'methods', 'module_eval', 'name',
+                'object_id', 'open', 'p', 'print', 'printf', 'private_class_method',
+                'private_instance_methods',
+                'private_methods', 'proc', 'protected_instance_methods',
+                'protected_methods', 'public_class_method',
+                'public_instance_methods', 'public_methods',
+                'putc', 'puts', 'raise', 'rand', 'readline', 'readlines', 'require',
+                'scan', 'select', 'self', 'send', 'set_trace_func', 'singleton_methods', 'sleep',
+                'split', 'sprintf', 'srand', 'sub', 'syscall', 'system', 'taint',
+                'test', 'throw', 'to_a', 'to_s', 'trace_var', 'trap', 'untaint',
+                'untrace_var', 'warn'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Builtin),
+            (r'__(FILE|LINE)__\b', Name.Builtin.Pseudo),
+            # normal heredocs
+            (r'(?<!\w)(<<-?)(["`\']?)([a-zA-Z_]\w*)(\2)(.*?\n)',
+             heredoc_callback),
+            # empty string heredocs
+            (r'(<<-?)("|\')()(\2)(.*?\n)', heredoc_callback),
+            (r'__END__', Comment.Preproc, 'end-part'),
+            # multiline regex (after keywords or assignments)
+            (r'(?:^|(?<=[=<>~!:])|'
+             r'(?<=(?:\s|;)when\s)|'
+             r'(?<=(?:\s|;)or\s)|'
+             r'(?<=(?:\s|;)and\s)|'
+             r'(?<=\.index\s)|'
+             r'(?<=\.scan\s)|'
+             r'(?<=\.sub\s)|'
+             r'(?<=\.sub!\s)|'
+             r'(?<=\.gsub\s)|'
+             r'(?<=\.gsub!\s)|'
+             r'(?<=\.match\s)|'
+             r'(?<=(?:\s|;)if\s)|'
+             r'(?<=(?:\s|;)elsif\s)|'
+             r'(?<=^when\s)|'
+             r'(?<=^index\s)|'
+             r'(?<=^scan\s)|'
+             r'(?<=^sub\s)|'
+             r'(?<=^gsub\s)|'
+             r'(?<=^sub!\s)|'
+             r'(?<=^gsub!\s)|'
+             r'(?<=^match\s)|'
+             r'(?<=^if\s)|'
+             r'(?<=^elsif\s)'
+             r')(\s*)(/)', bygroups(Text, String.Regex), 'multiline-regex'),
+            # multiline regex (in method calls or subscripts)
+            (r'(?<=\(|,|\[)/', String.Regex, 'multiline-regex'),
+            # multiline regex (this time the funny no whitespace rule)
+            (r'(\s+)(/)(?![\s=])', bygroups(Text, String.Regex),
+             'multiline-regex'),
+            # lex numbers and ignore following regular expressions which
+            # are division operators in fact (grrrr. i hate that. any
+            # better ideas?)
+            # since pygments 0.7 we also eat a "?" operator after numbers
+            # so that the char operator does not work. Chars are not allowed
+            # there so that you can use the ternary operator.
+            # stupid example:
+            #   x>=0?n[x]:""
+            (r'(0_?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?',
+             bygroups(Number.Oct, Text, Operator)),
+            (r'(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?',
+             bygroups(Number.Hex, Text, Operator)),
+            (r'(0b[01]+(?:_[01]+)*)(\s*)([/?])?',
+             bygroups(Number.Bin, Text, Operator)),
+            (r'([\d]+(?:_\d+)*)(\s*)([/?])?',
+             bygroups(Number.Integer, Text, Operator)),
+            # Names
+            (r'@@[a-zA-Z_]\w*', Name.Variable.Class),
+            (r'@[a-zA-Z_]\w*', Name.Variable.Instance),
+            (r'\$\w+', Name.Variable.Global),
+            (r'\$[!@&`\'+~=/\\,;.<>_*$?:"^-]', Name.Variable.Global),
+            (r'\$-[0adFiIlpvw]', Name.Variable.Global),
+            (r'::', Operator),
+            include('strings'),
+            # chars
+            (r'\?(\\[MC]-)*'  # modifiers
+             r'(\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)'
+             r'(?!\w)',
+             String.Char),
+            (r'[A-Z]\w+', Name.Constant),
+            # this is needed because ruby attributes can look
+            # like keywords (class) or like this: ` ?!?
+            (words(RUBY_OPERATORS, prefix=r'(\.|::)'),
+             bygroups(Operator, Name.Operator)),
+            (r'(\.|::)([a-zA-Z_]\w*[!?]?|[*%&^`~+\-/\[<>=])',
+             bygroups(Operator, Name)),
+            (r'[a-zA-Z_]\w*[!?]?', Name),
+            (r'(\[|\]|\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&!^|~]=?', Operator),
+            (r'[(){};,/?:\\]', Punctuation),
+            (r'\s+', Text)
+        ],
+        'funcname': [
+            (r'\(', Punctuation, 'defexpr'),
+            (r'(?:([a-zA-Z_]\w*)(\.))?'
+             r'([a-zA-Z_]\w*[!?]?|\*\*?|[-+]@?|'
+             r'[/%&|^`~]|\[\]=?|<<|>>|<=?>|>=?|===?)',
+             bygroups(Name.Class, Operator, Name.Function), '#pop'),
+            default('#pop')
+        ],
+        'classname': [
+            (r'\(', Punctuation, 'defexpr'),
+            (r'<<', Operator, '#pop'),
+            (r'[A-Z_]\w*', Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'defexpr': [
+            (r'(\))(\.|::)?', bygroups(Punctuation, Operator), '#pop'),
+            (r'\(', Operator, '#push'),
+            include('root')
+        ],
+        'in-intp': [
+            (r'\{', String.Interpol, '#push'),
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        'string-intp': [
+            (r'#\{', String.Interpol, 'in-intp'),
+            (r'#@@?[a-zA-Z_]\w*', String.Interpol),
+            (r'#\$[a-zA-Z_]\w*', String.Interpol)
+        ],
+        'string-intp-escaped': [
+            include('string-intp'),
+            (r'\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})',
+             String.Escape)
+        ],
+        'interpolated-regex': [
+            include('string-intp'),
+            (r'[\\#]', String.Regex),
+            (r'[^\\#]+', String.Regex),
+        ],
+        'interpolated-string': [
+            include('string-intp'),
+            (r'[\\#]', String.Other),
+            (r'[^\\#]+', String.Other),
+        ],
+        'multiline-regex': [
+            include('string-intp'),
+            (r'\\\\', String.Regex),
+            (r'\\/', String.Regex),
+            (r'[\\#]', String.Regex),
+            (r'[^\\/#]+', String.Regex),
+            (r'/[mixounse]*', String.Regex, '#pop'),
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ]
+    }
+    tokens.update(gen_rubystrings_rules())
+
+    def analyse_text(text):
+        return shebang_matches(text, r'ruby(1\.\d)?')
+
+
+class RubyConsoleLexer(Lexer):
+    """
+    For Ruby interactive console (**irb**) output like:
+
+    .. sourcecode:: rbcon
+
+        irb(main):001:0> a = 1
+        => 1
+        irb(main):002:0> puts a
+        1
+        => nil
+    """
+    name = 'Ruby irb session'
+    aliases = ['rbcon', 'irb']
+    mimetypes = ['text/x-ruby-shellsession']
+
+    _prompt_re = re.compile('irb\([a-zA-Z_]\w*\):\d{3}:\d+[>*"\'] '
+                            '|>> |\?> ')
+
+    def get_tokens_unprocessed(self, text):
+        rblexer = RubyLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            m = self._prompt_re.match(line)
+            if m is not None:
+                end = m.end()
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:end])]))
+                curcode += line[end:]
+            else:
+                if curcode:
+                    for item in do_insertions(
+                            insertions, rblexer.get_tokens_unprocessed(curcode)):
+                        yield item
+                    curcode = ''
+                    insertions = []
+                yield match.start(), Generic.Output, line
+        if curcode:
+            for item in do_insertions(
+                    insertions, rblexer.get_tokens_unprocessed(curcode)):
+                yield item
+
+
+class FancyLexer(RegexLexer):
+    """
+    Pygments Lexer For `Fancy <http://www.fancy-lang.org/>`_.
+
+    Fancy is a self-hosted, pure object-oriented, dynamic,
+    class-based, concurrent general-purpose programming language
+    running on Rubinius, the Ruby VM.
+
+    .. versionadded:: 1.5
+    """
+    name = 'Fancy'
+    filenames = ['*.fy', '*.fancypack']
+    aliases = ['fancy', 'fy']
+    mimetypes = ['text/x-fancysrc']
+
+    tokens = {
+        # copied from PerlLexer:
+        'balanced-regex': [
+            (r'/(\\\\|\\/|[^/])*/[egimosx]*', String.Regex, '#pop'),
+            (r'!(\\\\|\\!|[^!])*![egimosx]*', String.Regex, '#pop'),
+            (r'\\(\\\\|[^\\])*\\[egimosx]*', String.Regex, '#pop'),
+            (r'\{(\\\\|\\\}|[^}])*\}[egimosx]*', String.Regex, '#pop'),
+            (r'<(\\\\|\\>|[^>])*>[egimosx]*', String.Regex, '#pop'),
+            (r'\[(\\\\|\\\]|[^\]])*\][egimosx]*', String.Regex, '#pop'),
+            (r'\((\\\\|\\\)|[^)])*\)[egimosx]*', String.Regex, '#pop'),
+            (r'@(\\\\|\\@|[^@])*@[egimosx]*', String.Regex, '#pop'),
+            (r'%(\\\\|\\%|[^%])*%[egimosx]*', String.Regex, '#pop'),
+            (r'\$(\\\\|\\\$|[^$])*\$[egimosx]*', String.Regex, '#pop'),
+        ],
+        'root': [
+            (r'\s+', Text),
+
+            # balanced delimiters (copied from PerlLexer):
+            (r's\{(\\\\|\\\}|[^}])*\}\s*', String.Regex, 'balanced-regex'),
+            (r's<(\\\\|\\>|[^>])*>\s*', String.Regex, 'balanced-regex'),
+            (r's\[(\\\\|\\\]|[^\]])*\]\s*', String.Regex, 'balanced-regex'),
+            (r's\((\\\\|\\\)|[^)])*\)\s*', String.Regex, 'balanced-regex'),
+            (r'm?/(\\\\|\\/|[^/\n])*/[gcimosx]*', String.Regex),
+            (r'm(?=[/!\\{<\[(@%$])', String.Regex, 'balanced-regex'),
+
+            # Comments
+            (r'#(.*?)\n', Comment.Single),
+            # Symbols
+            (r'\'([^\'\s\[\](){}]+|\[\])', String.Symbol),
+            # Multi-line DoubleQuotedString
+            (r'"""(\\\\|\\"|[^"])*"""', String),
+            # DoubleQuotedString
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # keywords
+            (r'(def|class|try|catch|finally|retry|return|return_local|match|'
+             r'case|->|=>)\b', Keyword),
+            # constants
+            (r'(self|super|nil|false|true)\b', Name.Constant),
+            (r'[(){};,/?|:\\]', Punctuation),
+            # names
+            (words((
+                'Object', 'Array', 'Hash', 'Directory', 'File', 'Class', 'String',
+                'Number', 'Enumerable', 'FancyEnumerable', 'Block', 'TrueClass',
+                'NilClass', 'FalseClass', 'Tuple', 'Symbol', 'Stack', 'Set',
+                'FancySpec', 'Method', 'Package', 'Range'), suffix=r'\b'),
+             Name.Builtin),
+            # functions
+            (r'[a-zA-Z](\w|[-+?!=*/^><%])*:', Name.Function),
+            # operators, must be below functions
+            (r'[-+*/~,<>=&!?%^\[\].$]+', Operator),
+            ('[A-Z]\w*', Name.Constant),
+            ('@[a-zA-Z_]\w*', Name.Variable.Instance),
+            ('@@[a-zA-Z_]\w*', Name.Variable.Class),
+            ('@@?', Operator),
+            ('[a-zA-Z_]\w*', Name),
+            # numbers - / checks are necessary to avoid mismarking regexes,
+            # see comment in RubyLexer
+            (r'(0[oO]?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?',
+             bygroups(Number.Oct, Text, Operator)),
+            (r'(0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?',
+             bygroups(Number.Hex, Text, Operator)),
+            (r'(0[bB][01]+(?:_[01]+)*)(\s*)([/?])?',
+             bygroups(Number.Bin, Text, Operator)),
+            (r'([\d]+(?:_\d+)*)(\s*)([/?])?',
+             bygroups(Number.Integer, Text, Operator)),
+            (r'\d+([eE][+-]?[0-9]+)|\d+\.\d+([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer)
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/haskell.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/haskell.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/haskell.py	(revision 1126)
@@ -0,0 +1,843 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.haskell
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Haskell and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, \
+    default, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic
+from pygments import unistring as uni
+
+__all__ = ['HaskellLexer', 'IdrisLexer', 'AgdaLexer', 'CryptolLexer',
+           'LiterateHaskellLexer', 'LiterateIdrisLexer', 'LiterateAgdaLexer',
+           'LiterateCryptolLexer', 'KokaLexer']
+
+
+line_re = re.compile('.*?\n')
+
+
+class HaskellLexer(RegexLexer):
+    """
+    A Haskell lexer based on the lexemes defined in the Haskell 98 Report.
+
+    .. versionadded:: 0.8
+    """
+    name = 'Haskell'
+    aliases = ['haskell', 'hs']
+    filenames = ['*.hs']
+    mimetypes = ['text/x-haskell']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    reserved = ('case', 'class', 'data', 'default', 'deriving', 'do', 'else',
+                'family', 'if', 'in', 'infix[lr]?', 'instance',
+                'let', 'newtype', 'of', 'then', 'type', 'where', '_')
+    ascii = ('NUL', 'SOH', '[SE]TX', 'EOT', 'ENQ', 'ACK',
+             'BEL', 'BS', 'HT', 'LF', 'VT', 'FF', 'CR', 'S[OI]', 'DLE',
+             'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN',
+             'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL')
+
+    tokens = {
+        'root': [
+            # Whitespace:
+            (r'\s+', Text),
+            # (r'--\s*|.*$', Comment.Doc),
+            (r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            # Lexemes:
+            #  Identifiers
+            (r'\bimport\b', Keyword.Reserved, 'import'),
+            (r'\bmodule\b', Keyword.Reserved, 'module'),
+            (r'\berror\b', Name.Exception),
+            (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved),
+            (r"'[^\\]'", String.Char),  # this has to come before the TH quote
+            (r'^[_' + uni.Ll + r'][\w\']*', Name.Function),
+            (r"'?[_" + uni.Ll + r"][\w']*", Name),
+            (r"('')?[" + uni.Lu + r"][\w\']*", Keyword.Type),
+            (r"(')[" + uni.Lu + r"][\w\']*", Keyword.Type),
+            (r"(')\[[^\]]*\]", Keyword.Type),  # tuples and lists get special treatment in GHC
+            (r"(')\([^)]*\)", Keyword.Type),  # ..
+            #  Operators
+            (r'\\(?![:!#$%&*+.\\/<=>?@^|~-]+)', Name.Function),  # lambda operator
+            (r'(<-|::|->|=>|=)(?![:!#$%&*+.\\/<=>?@^|~-]+)', Operator.Word),  # specials
+            (r':[:!#$%&*+.\\/<=>?@^|~-]*', Keyword.Type),  # Constructor operators
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),  # Other operators
+            #  Numbers
+            (r'\d+[eE][+-]?\d+', Number.Float),
+            (r'\d+\.\d+([eE][+-]?\d+)?', Number.Float),
+            (r'0[oO][0-7]+', Number.Oct),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            #  Character/String Literals
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            #  Special
+            (r'\[\]', Keyword.Type),
+            (r'\(\)', Name.Builtin),
+            (r'[][(),;`{}]', Punctuation),
+        ],
+        'import': [
+            # Import statements
+            (r'\s+', Text),
+            (r'"', String, 'string'),
+            # after "funclist" state
+            (r'\)', Punctuation, '#pop'),
+            (r'qualified\b', Keyword),
+            # import X as Y
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(as)(\s+)([' + uni.Lu + r'][\w.]*)',
+             bygroups(Name.Namespace, Text, Keyword, Text, Name), '#pop'),
+            # import X hiding (functions)
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(hiding)(\s+)(\()',
+             bygroups(Name.Namespace, Text, Keyword, Text, Punctuation), 'funclist'),
+            # import X (functions)
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Text, Punctuation), 'funclist'),
+            # import X
+            (r'[\w.]+', Name.Namespace, '#pop'),
+        ],
+        'module': [
+            (r'\s+', Text),
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Text, Punctuation), 'funclist'),
+            (r'[' + uni.Lu + r'][\w.]*', Name.Namespace, '#pop'),
+        ],
+        'funclist': [
+            (r'\s+', Text),
+            (r'[' + uni.Lu + r']\w*', Keyword.Type),
+            (r'(_[\w\']+|[' + uni.Ll + r'][\w\']*)', Name.Function),
+            (r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r',', Punctuation),
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),
+            # (HACK, but it makes sense to push two instances, believe me)
+            (r'\(', Punctuation, ('funclist', 'funclist')),
+            (r'\)', Punctuation, '#pop:2'),
+        ],
+        # NOTE: the next four states are shared in the AgdaLexer; make sure
+        # any change is compatible with Agda as well or copy over and change
+        'comment': [
+            # Multiline Comments
+            (r'[^-{}]+', Comment.Multiline),
+            (r'\{-', Comment.Multiline, '#push'),
+            (r'-\}', Comment.Multiline, '#pop'),
+            (r'[-{}]', Comment.Multiline),
+        ],
+        'character': [
+            # Allows multi-chars, incorrectly.
+            (r"[^\\']'", String.Char, '#pop'),
+            (r"\\", String.Escape, 'escape'),
+            ("'", String.Char, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r"\\", String.Escape, 'escape'),
+            ('"', String, '#pop'),
+        ],
+        'escape': [
+            (r'[abfnrtv"\'&\\]', String.Escape, '#pop'),
+            (r'\^[][' + uni.Lu + r'@^_]', String.Escape, '#pop'),
+            ('|'.join(ascii), String.Escape, '#pop'),
+            (r'o[0-7]+', String.Escape, '#pop'),
+            (r'x[\da-fA-F]+', String.Escape, '#pop'),
+            (r'\d+', String.Escape, '#pop'),
+            (r'\s+\\', String.Escape, '#pop'),
+        ],
+    }
+
+
+class IdrisLexer(RegexLexer):
+    """
+    A lexer for the dependently typed programming language Idris.
+
+    Based on the Haskell and Agda Lexer.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Idris'
+    aliases = ['idris', 'idr']
+    filenames = ['*.idr']
+    mimetypes = ['text/x-idris']
+
+    reserved = ('case', 'class', 'data', 'default', 'using', 'do', 'else',
+                'if', 'in', 'infix[lr]?', 'instance', 'rewrite', 'auto',
+                'namespace', 'codata', 'mutual', 'private', 'public', 'abstract',
+                'total', 'partial',
+                'let', 'proof', 'of', 'then', 'static', 'where', '_', 'with',
+                'pattern',  'term',  'syntax', 'prefix',
+                'postulate', 'parameters', 'record', 'dsl', 'impossible', 'implicit',
+                'tactics', 'intros', 'intro', 'compute', 'refine', 'exact', 'trivial')
+
+    ascii = ('NUL', 'SOH', '[SE]TX', 'EOT', 'ENQ', 'ACK',
+             'BEL', 'BS', 'HT', 'LF', 'VT', 'FF', 'CR', 'S[OI]', 'DLE',
+             'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN',
+             'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL')
+
+    directives = ('lib', 'link', 'flag', 'include', 'hide', 'freeze', 'access',
+                  'default', 'logging', 'dynamic', 'name', 'error_handlers', 'language')
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'^(\s*)(%%%s)' % '|'.join(directives),
+             bygroups(Text, Keyword.Reserved)),
+            (r'(\s*)(--(?![!#$%&*+./<=>?@^|_~:\\]).*?)$', bygroups(Text, Comment.Single)),
+            (r'(\s*)(\|{3}.*?)$', bygroups(Text, Comment.Single)),
+            (r'(\s*)(\{-)', bygroups(Text, Comment.Multiline), 'comment'),
+            # Declaration
+            (r'^(\s*)([^\s(){}]+)(\s*)(:)(\s*)',
+             bygroups(Text, Name.Function, Text, Operator.Word, Text)),
+            #  Identifiers
+            (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved),
+            (r'(import|module)(\s+)', bygroups(Keyword.Reserved, Text), 'module'),
+            (r"('')?[A-Z][\w\']*", Keyword.Type),
+            (r'[a-z][\w\']*', Text),
+            #  Special Symbols
+            (r'(<-|::|->|=>|=)', Operator.Word),  # specials
+            (r'([(){}\[\]:!#$%&*+.\\/<=>?@^|~-]+)', Operator.Word),  # specials
+            #  Numbers
+            (r'\d+[eE][+-]?\d+', Number.Float),
+            (r'\d+\.\d+([eE][+-]?\d+)?', Number.Float),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            # Strings
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            (r'[^\s(){}]+', Text),
+            (r'\s+?', Text),  # Whitespace
+        ],
+        'module': [
+            (r'\s+', Text),
+            (r'([A-Z][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Text, Punctuation), 'funclist'),
+            (r'[A-Z][\w.]*', Name.Namespace, '#pop'),
+        ],
+        'funclist': [
+            (r'\s+', Text),
+            (r'[A-Z]\w*', Keyword.Type),
+            (r'(_[\w\']+|[a-z][\w\']*)', Name.Function),
+            (r'--.*$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r',', Punctuation),
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),
+            # (HACK, but it makes sense to push two instances, believe me)
+            (r'\(', Punctuation, ('funclist', 'funclist')),
+            (r'\)', Punctuation, '#pop:2'),
+        ],
+        # NOTE: the next four states are shared in the AgdaLexer; make sure
+        # any change is compatible with Agda as well or copy over and change
+        'comment': [
+            # Multiline Comments
+            (r'[^-{}]+', Comment.Multiline),
+            (r'\{-', Comment.Multiline, '#push'),
+            (r'-\}', Comment.Multiline, '#pop'),
+            (r'[-{}]', Comment.Multiline),
+        ],
+        'character': [
+            # Allows multi-chars, incorrectly.
+            (r"[^\\']", String.Char),
+            (r"\\", String.Escape, 'escape'),
+            ("'", String.Char, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r"\\", String.Escape, 'escape'),
+            ('"', String, '#pop'),
+        ],
+        'escape': [
+            (r'[abfnrtv"\'&\\]', String.Escape, '#pop'),
+            (r'\^[][A-Z@^_]', String.Escape, '#pop'),
+            ('|'.join(ascii), String.Escape, '#pop'),
+            (r'o[0-7]+', String.Escape, '#pop'),
+            (r'x[\da-fA-F]+', String.Escape, '#pop'),
+            (r'\d+', String.Escape, '#pop'),
+            (r'\s+\\', String.Escape, '#pop')
+        ],
+    }
+
+
+class AgdaLexer(RegexLexer):
+    """
+    For the `Agda <http://wiki.portal.chalmers.se/agda/pmwiki.php>`_
+    dependently typed functional programming language and proof assistant.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Agda'
+    aliases = ['agda']
+    filenames = ['*.agda']
+    mimetypes = ['text/x-agda']
+
+    reserved = ['abstract', 'codata', 'coinductive', 'constructor', 'data',
+                'field', 'forall', 'hiding', 'in', 'inductive', 'infix',
+                'infixl', 'infixr', 'instance', 'let', 'mutual', 'open',
+                'pattern', 'postulate', 'primitive', 'private',
+                'quote', 'quoteGoal', 'quoteTerm',
+                'record', 'renaming', 'rewrite', 'syntax', 'tactic',
+                'unquote', 'unquoteDecl', 'using', 'where', 'with']
+
+    tokens = {
+        'root': [
+            # Declaration
+            (r'^(\s*)([^\s(){}]+)(\s*)(:)(\s*)',
+             bygroups(Text, Name.Function, Text, Operator.Word, Text)),
+            # Comments
+            (r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            # Holes
+            (r'\{!', Comment.Directive, 'hole'),
+            # Lexemes:
+            #  Identifiers
+            (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved),
+            (r'(import|module)(\s+)', bygroups(Keyword.Reserved, Text), 'module'),
+            (r'\b(Set|Prop)\b', Keyword.Type),
+            #  Special Symbols
+            (r'(\(|\)|\{|\})', Operator),
+            (u'(\\.{1,3}|\\||\u039B|\u2200|\u2192|:|=|->)', Operator.Word),
+            #  Numbers
+            (r'\d+[eE][+-]?\d+', Number.Float),
+            (r'\d+\.\d+([eE][+-]?\d+)?', Number.Float),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            # Strings
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            (r'[^\s(){}]+', Text),
+            (r'\s+?', Text),  # Whitespace
+        ],
+        'hole': [
+            # Holes
+            (r'[^!{}]+', Comment.Directive),
+            (r'\{!', Comment.Directive, '#push'),
+            (r'!\}', Comment.Directive, '#pop'),
+            (r'[!{}]', Comment.Directive),
+        ],
+        'module': [
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'[a-zA-Z][\w.]*', Name, '#pop'),
+            (r'[\W0-9_]+', Text)
+        ],
+        'comment': HaskellLexer.tokens['comment'],
+        'character': HaskellLexer.tokens['character'],
+        'string': HaskellLexer.tokens['string'],
+        'escape': HaskellLexer.tokens['escape']
+    }
+
+
+class CryptolLexer(RegexLexer):
+    """
+    FIXME: A Cryptol2 lexer based on the lexemes defined in the Haskell 98 Report.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Cryptol'
+    aliases = ['cryptol', 'cry']
+    filenames = ['*.cry']
+    mimetypes = ['text/x-cryptol']
+
+    reserved = ('Arith', 'Bit', 'Cmp', 'False', 'Inf', 'True', 'else',
+                'export', 'extern', 'fin', 'if', 'import', 'inf', 'lg2',
+                'max', 'min', 'module', 'newtype', 'pragma', 'property',
+                'then', 'type', 'where', 'width')
+    ascii = ('NUL', 'SOH', '[SE]TX', 'EOT', 'ENQ', 'ACK',
+             'BEL', 'BS', 'HT', 'LF', 'VT', 'FF', 'CR', 'S[OI]', 'DLE',
+             'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN',
+             'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL')
+
+    tokens = {
+        'root': [
+            # Whitespace:
+            (r'\s+', Text),
+            # (r'--\s*|.*$', Comment.Doc),
+            (r'//.*$', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            # Lexemes:
+            #  Identifiers
+            (r'\bimport\b', Keyword.Reserved, 'import'),
+            (r'\bmodule\b', Keyword.Reserved, 'module'),
+            (r'\berror\b', Name.Exception),
+            (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved),
+            (r'^[_a-z][\w\']*', Name.Function),
+            (r"'?[_a-z][\w']*", Name),
+            (r"('')?[A-Z][\w\']*", Keyword.Type),
+            #  Operators
+            (r'\\(?![:!#$%&*+.\\/<=>?@^|~-]+)', Name.Function),  # lambda operator
+            (r'(<-|::|->|=>|=)(?![:!#$%&*+.\\/<=>?@^|~-]+)', Operator.Word),  # specials
+            (r':[:!#$%&*+.\\/<=>?@^|~-]*', Keyword.Type),  # Constructor operators
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),  # Other operators
+            #  Numbers
+            (r'\d+[eE][+-]?\d+', Number.Float),
+            (r'\d+\.\d+([eE][+-]?\d+)?', Number.Float),
+            (r'0[oO][0-7]+', Number.Oct),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            #  Character/String Literals
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            #  Special
+            (r'\[\]', Keyword.Type),
+            (r'\(\)', Name.Builtin),
+            (r'[][(),;`{}]', Punctuation),
+        ],
+        'import': [
+            # Import statements
+            (r'\s+', Text),
+            (r'"', String, 'string'),
+            # after "funclist" state
+            (r'\)', Punctuation, '#pop'),
+            (r'qualified\b', Keyword),
+            # import X as Y
+            (r'([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][\w.]*)',
+             bygroups(Name.Namespace, Text, Keyword, Text, Name), '#pop'),
+            # import X hiding (functions)
+            (r'([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()',
+             bygroups(Name.Namespace, Text, Keyword, Text, Punctuation), 'funclist'),
+            # import X (functions)
+            (r'([A-Z][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Text, Punctuation), 'funclist'),
+            # import X
+            (r'[\w.]+', Name.Namespace, '#pop'),
+        ],
+        'module': [
+            (r'\s+', Text),
+            (r'([A-Z][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Text, Punctuation), 'funclist'),
+            (r'[A-Z][\w.]*', Name.Namespace, '#pop'),
+        ],
+        'funclist': [
+            (r'\s+', Text),
+            (r'[A-Z]\w*', Keyword.Type),
+            (r'(_[\w\']+|[a-z][\w\']*)', Name.Function),
+            # TODO: these don't match the comments in docs, remove.
+            #(r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            #(r'{-', Comment.Multiline, 'comment'),
+            (r',', Punctuation),
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),
+            # (HACK, but it makes sense to push two instances, believe me)
+            (r'\(', Punctuation, ('funclist', 'funclist')),
+            (r'\)', Punctuation, '#pop:2'),
+        ],
+        'comment': [
+            # Multiline Comments
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'character': [
+            # Allows multi-chars, incorrectly.
+            (r"[^\\']'", String.Char, '#pop'),
+            (r"\\", String.Escape, 'escape'),
+            ("'", String.Char, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r"\\", String.Escape, 'escape'),
+            ('"', String, '#pop'),
+        ],
+        'escape': [
+            (r'[abfnrtv"\'&\\]', String.Escape, '#pop'),
+            (r'\^[][A-Z@^_]', String.Escape, '#pop'),
+            ('|'.join(ascii), String.Escape, '#pop'),
+            (r'o[0-7]+', String.Escape, '#pop'),
+            (r'x[\da-fA-F]+', String.Escape, '#pop'),
+            (r'\d+', String.Escape, '#pop'),
+            (r'\s+\\', String.Escape, '#pop'),
+        ],
+    }
+
+    EXTRA_KEYWORDS = set(('join', 'split', 'reverse', 'transpose', 'width',
+                          'length', 'tail', '<<', '>>', '<<<', '>>>', 'const',
+                          'reg', 'par', 'seq', 'ASSERT', 'undefined', 'error',
+                          'trace'))
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name and value in self.EXTRA_KEYWORDS:
+                yield index, Name.Builtin, value
+            else:
+                yield index, token, value
+
+
+class LiterateLexer(Lexer):
+    """
+    Base class for lexers of literate file formats based on LaTeX or Bird-style
+    (prefixing each code line with ">").
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+    """
+
+    bird_re = re.compile(r'(>[ \t]*)(.*\n)')
+
+    def __init__(self, baselexer, **options):
+        self.baselexer = baselexer
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        style = self.options.get('litstyle')
+        if style is None:
+            style = (text.lstrip()[0:1] in '%\\') and 'latex' or 'bird'
+
+        code = ''
+        insertions = []
+        if style == 'bird':
+            # bird-style
+            for match in line_re.finditer(text):
+                line = match.group()
+                m = self.bird_re.match(line)
+                if m:
+                    insertions.append((len(code),
+                                       [(0, Comment.Special, m.group(1))]))
+                    code += m.group(2)
+                else:
+                    insertions.append((len(code), [(0, Text, line)]))
+        else:
+            # latex-style
+            from pygments.lexers.markup import TexLexer
+            lxlexer = TexLexer(**self.options)
+            codelines = 0
+            latex = ''
+            for match in line_re.finditer(text):
+                line = match.group()
+                if codelines:
+                    if line.lstrip().startswith('\\end{code}'):
+                        codelines = 0
+                        latex += line
+                    else:
+                        code += line
+                elif line.lstrip().startswith('\\begin{code}'):
+                    codelines = 1
+                    latex += line
+                    insertions.append((len(code),
+                                       list(lxlexer.get_tokens_unprocessed(latex))))
+                    latex = ''
+                else:
+                    latex += line
+            insertions.append((len(code),
+                               list(lxlexer.get_tokens_unprocessed(latex))))
+        for item in do_insertions(insertions, self.baselexer.get_tokens_unprocessed(code)):
+            yield item
+
+
+class LiterateHaskellLexer(LiterateLexer):
+    """
+    For Literate Haskell (Bird-style or LaTeX) source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+
+    .. versionadded:: 0.9
+    """
+    name = 'Literate Haskell'
+    aliases = ['lhs', 'literate-haskell', 'lhaskell']
+    filenames = ['*.lhs']
+    mimetypes = ['text/x-literate-haskell']
+
+    def __init__(self, **options):
+        hslexer = HaskellLexer(**options)
+        LiterateLexer.__init__(self, hslexer, **options)
+
+
+class LiterateIdrisLexer(LiterateLexer):
+    """
+    For Literate Idris (Bird-style or LaTeX) source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Literate Idris'
+    aliases = ['lidr', 'literate-idris', 'lidris']
+    filenames = ['*.lidr']
+    mimetypes = ['text/x-literate-idris']
+
+    def __init__(self, **options):
+        hslexer = IdrisLexer(**options)
+        LiterateLexer.__init__(self, hslexer, **options)
+
+
+class LiterateAgdaLexer(LiterateLexer):
+    """
+    For Literate Agda source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Literate Agda'
+    aliases = ['lagda', 'literate-agda']
+    filenames = ['*.lagda']
+    mimetypes = ['text/x-literate-agda']
+
+    def __init__(self, **options):
+        agdalexer = AgdaLexer(**options)
+        LiterateLexer.__init__(self, agdalexer, litstyle='latex', **options)
+
+
+class LiterateCryptolLexer(LiterateLexer):
+    """
+    For Literate Cryptol (Bird-style or LaTeX) source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Literate Cryptol'
+    aliases = ['lcry', 'literate-cryptol', 'lcryptol']
+    filenames = ['*.lcry']
+    mimetypes = ['text/x-literate-cryptol']
+
+    def __init__(self, **options):
+        crylexer = CryptolLexer(**options)
+        LiterateLexer.__init__(self, crylexer, **options)
+
+
+class KokaLexer(RegexLexer):
+    """
+    Lexer for the `Koka <http://koka.codeplex.com>`_
+    language.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Koka'
+    aliases = ['koka']
+    filenames = ['*.kk', '*.kki']
+    mimetypes = ['text/x-koka']
+
+    keywords = [
+        'infix', 'infixr', 'infixl',
+        'type', 'cotype', 'rectype', 'alias',
+        'struct', 'con',
+        'fun', 'function', 'val', 'var',
+        'external',
+        'if', 'then', 'else', 'elif', 'return', 'match',
+        'private', 'public', 'private',
+        'module', 'import', 'as',
+        'include', 'inline',
+        'rec',
+        'try', 'yield', 'enum',
+        'interface', 'instance',
+    ]
+
+    # keywords that are followed by a type
+    typeStartKeywords = [
+        'type', 'cotype', 'rectype', 'alias', 'struct', 'enum',
+    ]
+
+    # keywords valid in a type
+    typekeywords = [
+        'forall', 'exists', 'some', 'with',
+    ]
+
+    # builtin names and special names
+    builtin = [
+        'for', 'while', 'repeat',
+        'foreach', 'foreach-indexed',
+        'error', 'catch', 'finally',
+        'cs', 'js', 'file', 'ref', 'assigned',
+    ]
+
+    # symbols that can be in an operator
+    symbols = r'[$%&*+@!/\\^~=.:\-?|<>]+'
+
+    # symbol boundary: an operator keyword should not be followed by any of these
+    sboundary = '(?!'+symbols+')'
+
+    # name boundary: a keyword should not be followed by any of these
+    boundary = '(?![\w/])'
+
+    # koka token abstractions
+    tokenType = Name.Attribute
+    tokenTypeDef = Name.Class
+    tokenConstructor = Generic.Emph
+
+    # main lexer
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # go into type mode
+            (r'::?' + sboundary, tokenType, 'type'),
+            (r'(alias)(\s+)([a-z]\w*)?', bygroups(Keyword, Text, tokenTypeDef),
+             'alias-type'),
+            (r'(struct)(\s+)([a-z]\w*)?', bygroups(Keyword, Text, tokenTypeDef),
+             'struct-type'),
+            ((r'(%s)' % '|'.join(typeStartKeywords)) +
+             r'(\s+)([a-z]\w*)?', bygroups(Keyword, Text, tokenTypeDef),
+             'type'),
+
+            # special sequences of tokens (we use ?: for non-capturing group as
+            # required by 'bygroups')
+            (r'(module)(\s+)(interface\s+)?((?:[a-z]\w*/)*[a-z]\w*)',
+             bygroups(Keyword, Text, Keyword, Name.Namespace)),
+            (r'(import)(\s+)((?:[a-z]\w*/)*[a-z]\w*)'
+             r'(?:(\s*)(=)(\s*)((?:qualified\s*)?)'
+             r'((?:[a-z]\w*/)*[a-z]\w*))?',
+             bygroups(Keyword, Text, Name.Namespace, Text, Keyword, Text,
+                      Keyword, Name.Namespace)),
+
+            (r'(^(?:(?:public|private)\s*)?(?:function|fun|val))'
+             r'(\s+)([a-z]\w*|\((?:' + symbols + r'|/)\))',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'(^(?:(?:public|private)\s*)?external)(\s+)(inline\s+)?'
+             r'([a-z]\w*|\((?:' + symbols + r'|/)\))',
+             bygroups(Keyword, Text, Keyword, Name.Function)),
+
+            # keywords
+            (r'(%s)' % '|'.join(typekeywords) + boundary, Keyword.Type),
+            (r'(%s)' % '|'.join(keywords) + boundary, Keyword),
+            (r'(%s)' % '|'.join(builtin) + boundary, Keyword.Pseudo),
+            (r'::?|:=|\->|[=.]' + sboundary, Keyword),
+
+            # names
+            (r'((?:[a-z]\w*/)*)([A-Z]\w*)',
+             bygroups(Name.Namespace, tokenConstructor)),
+            (r'((?:[a-z]\w*/)*)([a-z]\w*)', bygroups(Name.Namespace, Name)),
+            (r'((?:[a-z]\w*/)*)(\((?:' + symbols + r'|/)\))',
+             bygroups(Name.Namespace, Name)),
+            (r'_\w*', Name.Variable),
+
+            # literal string
+            (r'@"', String.Double, 'litstring'),
+
+            # operators
+            (symbols + "|/(?![*/])", Operator),
+            (r'`', Operator),
+            (r'[{}()\[\];,]', Punctuation),
+
+            # literals. No check for literal characters with len > 1
+            (r'[0-9]+\.[0-9]+([eE][\-+]?[0-9]+)?', Number.Float),
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+
+            (r"'", String.Char, 'char'),
+            (r'"', String.Double, 'string'),
+        ],
+
+        # type started by alias
+        'alias-type': [
+            (r'=', Keyword),
+            include('type')
+        ],
+
+        # type started by struct
+        'struct-type': [
+            (r'(?=\((?!,*\)))', Punctuation, '#pop'),
+            include('type')
+        ],
+
+        # type started by colon
+        'type': [
+            (r'[(\[<]', tokenType, 'type-nested'),
+            include('type-content')
+        ],
+
+        # type nested in brackets: can contain parameters, comma etc.
+        'type-nested': [
+            (r'[)\]>]', tokenType, '#pop'),
+            (r'[(\[<]', tokenType, 'type-nested'),
+            (r',', tokenType),
+            (r'([a-z]\w*)(\s*)(:)(?!:)',
+             bygroups(Name, Text, tokenType)),  # parameter name
+            include('type-content')
+        ],
+
+        # shared contents of a type
+        'type-content': [
+            include('whitespace'),
+
+            # keywords
+            (r'(%s)' % '|'.join(typekeywords) + boundary, Keyword),
+            (r'(?=((%s)' % '|'.join(keywords) + boundary + '))',
+             Keyword, '#pop'),  # need to match because names overlap...
+
+            # kinds
+            (r'[EPHVX]' + boundary, tokenType),
+
+            # type names
+            (r'[a-z][0-9]*(?![\w/])', tokenType),
+            (r'_\w*', tokenType.Variable),  # Generic.Emph
+            (r'((?:[a-z]\w*/)*)([A-Z]\w*)',
+             bygroups(Name.Namespace, tokenType)),
+            (r'((?:[a-z]\w*/)*)([a-z]\w+)',
+             bygroups(Name.Namespace, tokenType)),
+
+            # type keyword operators
+            (r'::|->|[.:|]', tokenType),
+
+            # catchall
+            default('#pop')
+        ],
+
+        # comments and literals
+        'whitespace': [
+            (r'\n\s*#.*$', Comment.Preproc),
+            (r'\s+', Text),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'//.*$', Comment.Single)
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'litstring': [
+            (r'[^"]+', String.Double),
+            (r'""', String.Escape),
+            (r'"', String.Double, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"\n]+', String.Double),
+            include('escape-sequence'),
+            (r'["\n]', String.Double, '#pop'),
+        ],
+        'char': [
+            (r'[^\\\'\n]+', String.Char),
+            include('escape-sequence'),
+            (r'[\'\n]', String.Char, '#pop'),
+        ],
+        'escape-sequence': [
+            (r'\\[nrt\\"\']', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            # Yes, \U literals are 6 hex digits.
+            (r'\\U[0-9a-fA-F]{6}', String.Escape)
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_stata_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_stata_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_stata_builtins.py	(revision 1126)
@@ -0,0 +1,419 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._stata_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtins for Stata
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+builtins_base = (
+    "if", "else", "in", "foreach", "for", "forv", "forva",
+    "forval", "forvalu", "forvalue", "forvalues", "by", "bys",
+    "bysort", "quietly", "qui", "about", "ac",
+    "ac_7", "acprplot", "acprplot_7", "adjust", "ado", "adopath",
+    "adoupdate", "alpha", "ameans", "an", "ano", "anov", "anova",
+    "anova_estat", "anova_terms", "anovadef", "aorder", "ap", "app",
+    "appe", "appen", "append", "arch", "arch_dr", "arch_estat",
+    "arch_p", "archlm", "areg", "areg_p", "args", "arima",
+    "arima_dr", "arima_estat", "arima_p", "as", "asmprobit",
+    "asmprobit_estat", "asmprobit_lf", "asmprobit_mfx__dlg",
+    "asmprobit_p", "ass", "asse", "asser", "assert", "avplot",
+    "avplot_7", "avplots", "avplots_7", "bcskew0", "bgodfrey",
+    "binreg", "bip0_lf", "biplot", "bipp_lf", "bipr_lf",
+    "bipr_p", "biprobit", "bitest", "bitesti", "bitowt", "blogit",
+    "bmemsize", "boot", "bootsamp", "bootstrap", "bootstrap_8",
+    "boxco_l", "boxco_p", "boxcox", "boxcox_6", "boxcox_p",
+    "bprobit", "br", "break", "brier", "bro", "brow", "brows",
+    "browse", "brr", "brrstat", "bs", "bs_7", "bsampl_w",
+    "bsample", "bsample_7", "bsqreg", "bstat", "bstat_7", "bstat_8",
+    "bstrap", "bstrap_7", "ca", "ca_estat", "ca_p", "cabiplot",
+    "camat", "canon", "canon_8", "canon_8_p", "canon_estat",
+    "canon_p", "cap", "caprojection", "capt", "captu", "captur",
+    "capture", "cat", "cc", "cchart", "cchart_7", "cci",
+    "cd", "censobs_table", "centile", "cf", "char", "chdir",
+    "checkdlgfiles", "checkestimationsample", "checkhlpfiles",
+    "checksum", "chelp", "ci", "cii", "cl", "class", "classutil",
+    "clear", "cli", "clis", "clist", "clo", "clog", "clog_lf",
+    "clog_p", "clogi", "clogi_sw", "clogit", "clogit_lf",
+    "clogit_p", "clogitp", "clogl_sw", "cloglog", "clonevar",
+    "clslistarray", "cluster", "cluster_measures", "cluster_stop",
+    "cluster_tree", "cluster_tree_8", "clustermat", "cmdlog",
+    "cnr", "cnre", "cnreg", "cnreg_p", "cnreg_sw", "cnsreg",
+    "codebook", "collaps4", "collapse", "colormult_nb",
+    "colormult_nw", "compare", "compress", "conf", "confi",
+    "confir", "confirm", "conren", "cons", "const", "constr",
+    "constra", "constrai", "constrain", "constraint", "continue",
+    "contract", "copy", "copyright", "copysource", "cor", "corc",
+    "corr", "corr2data", "corr_anti", "corr_kmo", "corr_smc",
+    "corre", "correl", "correla", "correlat", "correlate",
+    "corrgram", "cou", "coun", "count", "cox", "cox_p", "cox_sw",
+    "coxbase", "coxhaz", "coxvar", "cprplot", "cprplot_7",
+    "crc", "cret", "cretu", "cretur", "creturn", "cross", "cs",
+    "cscript", "cscript_log", "csi", "ct", "ct_is", "ctset",
+    "ctst_5", "ctst_st", "cttost", "cumsp", "cumsp_7", "cumul",
+    "cusum", "cusum_7", "cutil", "d", "datasig", "datasign",
+    "datasigna", "datasignat", "datasignatu", "datasignatur",
+    "datasignature", "datetof", "db", "dbeta", "de", "dec",
+    "deco", "decod", "decode", "deff", "des", "desc", "descr",
+    "descri", "describ", "describe", "destring", "dfbeta",
+    "dfgls", "dfuller", "di", "di_g", "dir", "dirstats", "dis",
+    "discard", "disp", "disp_res", "disp_s", "displ", "displa",
+    "display", "distinct", "do", "doe", "doed", "doedi",
+    "doedit", "dotplot", "dotplot_7", "dprobit", "drawnorm",
+    "drop", "ds", "ds_util", "dstdize", "duplicates", "durbina",
+    "dwstat", "dydx", "e", "ed", "edi", "edit", "egen",
+    "eivreg", "emdef", "en", "enc", "enco", "encod", "encode",
+    "eq", "erase", "ereg", "ereg_lf", "ereg_p", "ereg_sw",
+    "ereghet", "ereghet_glf", "ereghet_glf_sh", "ereghet_gp",
+    "ereghet_ilf", "ereghet_ilf_sh", "ereghet_ip", "eret",
+    "eretu", "eretur", "ereturn", "err", "erro", "error", "est",
+    "est_cfexist", "est_cfname", "est_clickable", "est_expand",
+    "est_hold", "est_table", "est_unhold", "est_unholdok",
+    "estat", "estat_default", "estat_summ", "estat_vce_only",
+    "esti", "estimates", "etodow", "etof", "etomdy", "ex",
+    "exi", "exit", "expand", "expandcl", "fac", "fact", "facto",
+    "factor", "factor_estat", "factor_p", "factor_pca_rotated",
+    "factor_rotate", "factormat", "fcast", "fcast_compute",
+    "fcast_graph", "fdades", "fdadesc", "fdadescr", "fdadescri",
+    "fdadescrib", "fdadescribe", "fdasav", "fdasave", "fdause",
+    "fh_st", "open", "read", "close",
+    "file", "filefilter", "fillin", "find_hlp_file", "findfile",
+    "findit", "findit_7", "fit", "fl", "fli", "flis", "flist",
+    "for5_0", "form", "forma", "format", "fpredict", "frac_154",
+    "frac_adj", "frac_chk", "frac_cox", "frac_ddp", "frac_dis",
+    "frac_dv", "frac_in", "frac_mun", "frac_pp", "frac_pq",
+    "frac_pv", "frac_wgt", "frac_xo", "fracgen", "fracplot",
+    "fracplot_7", "fracpoly", "fracpred", "fron_ex", "fron_hn",
+    "fron_p", "fron_tn", "fron_tn2", "frontier", "ftodate", "ftoe",
+    "ftomdy", "ftowdate", "g", "gamhet_glf", "gamhet_gp",
+    "gamhet_ilf", "gamhet_ip", "gamma", "gamma_d2", "gamma_p",
+    "gamma_sw", "gammahet", "gdi_hexagon", "gdi_spokes", "ge",
+    "gen", "gene", "gener", "genera", "generat", "generate",
+    "genrank", "genstd", "genvmean", "gettoken", "gl", "gladder",
+    "gladder_7", "glim_l01", "glim_l02", "glim_l03", "glim_l04",
+    "glim_l05", "glim_l06", "glim_l07", "glim_l08", "glim_l09",
+    "glim_l10", "glim_l11", "glim_l12", "glim_lf", "glim_mu",
+    "glim_nw1", "glim_nw2", "glim_nw3", "glim_p", "glim_v1",
+    "glim_v2", "glim_v3", "glim_v4", "glim_v5", "glim_v6",
+    "glim_v7", "glm", "glm_6", "glm_p", "glm_sw", "glmpred", "glo",
+    "glob", "globa", "global", "glogit", "glogit_8", "glogit_p",
+    "gmeans", "gnbre_lf", "gnbreg", "gnbreg_5", "gnbreg_p",
+    "gomp_lf", "gompe_sw", "gomper_p", "gompertz", "gompertzhet",
+    "gomphet_glf", "gomphet_glf_sh", "gomphet_gp", "gomphet_ilf",
+    "gomphet_ilf_sh", "gomphet_ip", "gphdot", "gphpen",
+    "gphprint", "gprefs", "gprobi_p", "gprobit", "gprobit_8", "gr",
+    "gr7", "gr_copy", "gr_current", "gr_db", "gr_describe",
+    "gr_dir", "gr_draw", "gr_draw_replay", "gr_drop", "gr_edit",
+    "gr_editviewopts", "gr_example", "gr_example2", "gr_export",
+    "gr_print", "gr_qscheme", "gr_query", "gr_read", "gr_rename",
+    "gr_replay", "gr_save", "gr_set", "gr_setscheme", "gr_table",
+    "gr_undo", "gr_use", "graph", "graph7", "grebar", "greigen",
+    "greigen_7", "greigen_8", "grmeanby", "grmeanby_7",
+    "gs_fileinfo", "gs_filetype", "gs_graphinfo", "gs_stat",
+    "gsort", "gwood", "h", "hadimvo", "hareg", "hausman",
+    "haver", "he", "heck_d2", "heckma_p", "heckman", "heckp_lf",
+    "heckpr_p", "heckprob", "hel", "help", "hereg", "hetpr_lf",
+    "hetpr_p", "hetprob", "hettest", "hexdump", "hilite",
+    "hist", "hist_7", "histogram", "hlogit", "hlu", "hmeans",
+    "hotel", "hotelling", "hprobit", "hreg", "hsearch", "icd9",
+    "icd9_ff", "icd9p", "iis", "impute", "imtest", "inbase",
+    "include", "inf", "infi", "infil", "infile", "infix", "inp",
+    "inpu", "input", "ins", "insheet", "insp", "inspe",
+    "inspec", "inspect", "integ", "inten", "intreg", "intreg_7",
+    "intreg_p", "intrg2_ll", "intrg_ll", "intrg_ll2", "ipolate",
+    "iqreg", "ir", "irf", "irf_create", "irfm", "iri", "is_svy",
+    "is_svysum", "isid", "istdize", "ivprob_1_lf", "ivprob_lf",
+    "ivprobit", "ivprobit_p", "ivreg", "ivreg_footnote",
+    "ivtob_1_lf", "ivtob_lf", "ivtobit", "ivtobit_p", "jackknife",
+    "jacknife", "jknife", "jknife_6", "jknife_8", "jkstat",
+    "joinby", "kalarma1", "kap", "kap_3", "kapmeier", "kappa",
+    "kapwgt", "kdensity", "kdensity_7", "keep", "ksm", "ksmirnov",
+    "ktau", "kwallis", "l", "la", "lab", "labe", "label",
+    "labelbook", "ladder", "levels", "levelsof", "leverage",
+    "lfit", "lfit_p", "li", "lincom", "line", "linktest",
+    "lis", "list", "lloghet_glf", "lloghet_glf_sh", "lloghet_gp",
+    "lloghet_ilf", "lloghet_ilf_sh", "lloghet_ip", "llogi_sw",
+    "llogis_p", "llogist", "llogistic", "llogistichet",
+    "lnorm_lf", "lnorm_sw", "lnorma_p", "lnormal", "lnormalhet",
+    "lnormhet_glf", "lnormhet_glf_sh", "lnormhet_gp",
+    "lnormhet_ilf", "lnormhet_ilf_sh", "lnormhet_ip", "lnskew0",
+    "loadingplot", "loc", "loca", "local", "log", "logi",
+    "logis_lf", "logistic", "logistic_p", "logit", "logit_estat",
+    "logit_p", "loglogs", "logrank", "loneway", "lookfor",
+    "lookup", "lowess", "lowess_7", "lpredict", "lrecomp", "lroc",
+    "lroc_7", "lrtest", "ls", "lsens", "lsens_7", "lsens_x",
+    "lstat", "ltable", "ltable_7", "ltriang", "lv", "lvr2plot",
+    "lvr2plot_7", "m", "ma", "mac", "macr", "macro", "makecns",
+    "man", "manova", "manova_estat", "manova_p", "manovatest",
+    "mantel", "mark", "markin", "markout", "marksample", "mat",
+    "mat_capp", "mat_order", "mat_put_rr", "mat_rapp", "mata",
+    "mata_clear", "mata_describe", "mata_drop", "mata_matdescribe",
+    "mata_matsave", "mata_matuse", "mata_memory", "mata_mlib",
+    "mata_mosave", "mata_rename", "mata_which", "matalabel",
+    "matcproc", "matlist", "matname", "matr", "matri",
+    "matrix", "matrix_input__dlg", "matstrik", "mcc", "mcci",
+    "md0_", "md1_", "md1debug_", "md2_", "md2debug_", "mds",
+    "mds_estat", "mds_p", "mdsconfig", "mdslong", "mdsmat",
+    "mdsshepard", "mdytoe", "mdytof", "me_derd", "mean",
+    "means", "median", "memory", "memsize", "meqparse", "mer",
+    "merg", "merge", "mfp", "mfx", "mhelp", "mhodds", "minbound",
+    "mixed_ll", "mixed_ll_reparm", "mkassert", "mkdir",
+    "mkmat", "mkspline", "ml", "ml_5", "ml_adjs", "ml_bhhhs",
+    "ml_c_d", "ml_check", "ml_clear", "ml_cnt", "ml_debug",
+    "ml_defd", "ml_e0", "ml_e0_bfgs", "ml_e0_cycle", "ml_e0_dfp",
+    "ml_e0i", "ml_e1", "ml_e1_bfgs", "ml_e1_bhhh", "ml_e1_cycle",
+    "ml_e1_dfp", "ml_e2", "ml_e2_cycle", "ml_ebfg0", "ml_ebfr0",
+    "ml_ebfr1", "ml_ebh0q", "ml_ebhh0", "ml_ebhr0", "ml_ebr0i",
+    "ml_ecr0i", "ml_edfp0", "ml_edfr0", "ml_edfr1", "ml_edr0i",
+    "ml_eds", "ml_eer0i", "ml_egr0i", "ml_elf", "ml_elf_bfgs",
+    "ml_elf_bhhh", "ml_elf_cycle", "ml_elf_dfp", "ml_elfi",
+    "ml_elfs", "ml_enr0i", "ml_enrr0", "ml_erdu0", "ml_erdu0_bfgs",
+    "ml_erdu0_bhhh", "ml_erdu0_bhhhq", "ml_erdu0_cycle",
+    "ml_erdu0_dfp", "ml_erdu0_nrbfgs", "ml_exde", "ml_footnote",
+    "ml_geqnr", "ml_grad0", "ml_graph", "ml_hbhhh", "ml_hd0",
+    "ml_hold", "ml_init", "ml_inv", "ml_log", "ml_max",
+    "ml_mlout", "ml_mlout_8", "ml_model", "ml_nb0", "ml_opt",
+    "ml_p", "ml_plot", "ml_query", "ml_rdgrd", "ml_repor",
+    "ml_s_e", "ml_score", "ml_searc", "ml_technique", "ml_unhold",
+    "mleval", "mlf_", "mlmatbysum", "mlmatsum", "mlog", "mlogi",
+    "mlogit", "mlogit_footnote", "mlogit_p", "mlopts", "mlsum",
+    "mlvecsum", "mnl0_", "mor", "more", "mov", "move", "mprobit",
+    "mprobit_lf", "mprobit_p", "mrdu0_", "mrdu1_", "mvdecode",
+    "mvencode", "mvreg", "mvreg_estat", "n", "nbreg",
+    "nbreg_al", "nbreg_lf", "nbreg_p", "nbreg_sw", "nestreg", "net",
+    "newey", "newey_7", "newey_p", "news", "nl", "nl_7", "nl_9",
+    "nl_9_p", "nl_p", "nl_p_7", "nlcom", "nlcom_p", "nlexp2",
+    "nlexp2_7", "nlexp2a", "nlexp2a_7", "nlexp3", "nlexp3_7",
+    "nlgom3", "nlgom3_7", "nlgom4", "nlgom4_7", "nlinit", "nllog3",
+    "nllog3_7", "nllog4", "nllog4_7", "nlog_rd", "nlogit",
+    "nlogit_p", "nlogitgen", "nlogittree", "nlpred", "no",
+    "nobreak", "noi", "nois", "noisi", "noisil", "noisily", "note",
+    "notes", "notes_dlg", "nptrend", "numlabel", "numlist", "odbc",
+    "old_ver", "olo", "olog", "ologi", "ologi_sw", "ologit",
+    "ologit_p", "ologitp", "on", "one", "onew", "onewa", "oneway",
+    "op_colnm", "op_comp", "op_diff", "op_inv", "op_str", "opr",
+    "opro", "oprob", "oprob_sw", "oprobi", "oprobi_p", "oprobit",
+    "oprobitp", "opts_exclusive", "order", "orthog", "orthpoly",
+    "ou", "out", "outf", "outfi", "outfil", "outfile", "outs",
+    "outsh", "outshe", "outshee", "outsheet", "ovtest", "pac",
+    "pac_7", "palette", "parse", "parse_dissim", "pause", "pca",
+    "pca_8", "pca_display", "pca_estat", "pca_p", "pca_rotate",
+    "pcamat", "pchart", "pchart_7", "pchi", "pchi_7", "pcorr",
+    "pctile", "pentium", "pergram", "pergram_7", "permute",
+    "permute_8", "personal", "peto_st", "pkcollapse", "pkcross",
+    "pkequiv", "pkexamine", "pkexamine_7", "pkshape", "pksumm",
+    "pksumm_7", "pl", "plo", "plot", "plugin", "pnorm",
+    "pnorm_7", "poisgof", "poiss_lf", "poiss_sw", "poisso_p",
+    "poisson", "poisson_estat", "post", "postclose", "postfile",
+    "postutil", "pperron", "pr", "prais", "prais_e", "prais_e2",
+    "prais_p", "predict", "predictnl", "preserve", "print",
+    "pro", "prob", "probi", "probit", "probit_estat", "probit_p",
+    "proc_time", "procoverlay", "procrustes", "procrustes_estat",
+    "procrustes_p", "profiler", "prog", "progr", "progra",
+    "program", "prop", "proportion", "prtest", "prtesti", "pwcorr",
+    "pwd", "q", "s", "qby", "qbys", "qchi", "qchi_7", "qladder",
+    "qladder_7", "qnorm", "qnorm_7", "qqplot", "qqplot_7", "qreg",
+    "qreg_c", "qreg_p", "qreg_sw", "qu", "quadchk", "quantile",
+    "quantile_7", "que", "quer", "query", "range", "ranksum",
+    "ratio", "rchart", "rchart_7", "rcof", "recast", "reclink",
+    "recode", "reg", "reg3", "reg3_p", "regdw", "regr", "regre",
+    "regre_p2", "regres", "regres_p", "regress", "regress_estat",
+    "regriv_p", "remap", "ren", "rena", "renam", "rename",
+    "renpfix", "repeat", "replace", "report", "reshape",
+    "restore", "ret", "retu", "retur", "return", "rm", "rmdir",
+    "robvar", "roccomp", "roccomp_7", "roccomp_8", "rocf_lf",
+    "rocfit", "rocfit_8", "rocgold", "rocplot", "rocplot_7",
+    "roctab", "roctab_7", "rolling", "rologit", "rologit_p",
+    "rot", "rota", "rotat", "rotate", "rotatemat", "rreg",
+    "rreg_p", "ru", "run", "runtest", "rvfplot", "rvfplot_7",
+    "rvpplot", "rvpplot_7", "sa", "safesum", "sample",
+    "sampsi", "sav", "save", "savedresults", "saveold", "sc",
+    "sca", "scal", "scala", "scalar", "scatter", "scm_mine",
+    "sco", "scob_lf", "scob_p", "scobi_sw", "scobit", "scor",
+    "score", "scoreplot", "scoreplot_help", "scree", "screeplot",
+    "screeplot_help", "sdtest", "sdtesti", "se", "search",
+    "separate", "seperate", "serrbar", "serrbar_7", "serset", "set",
+    "set_defaults", "sfrancia", "sh", "she", "shel", "shell",
+    "shewhart", "shewhart_7", "signestimationsample", "signrank",
+    "signtest", "simul", "simul_7", "simulate", "simulate_8",
+    "sktest", "sleep", "slogit", "slogit_d2", "slogit_p", "smooth",
+    "snapspan", "so", "sor", "sort", "spearman", "spikeplot",
+    "spikeplot_7", "spikeplt", "spline_x", "split", "sqreg",
+    "sqreg_p", "sret", "sretu", "sretur", "sreturn", "ssc", "st",
+    "st_ct", "st_hc", "st_hcd", "st_hcd_sh", "st_is", "st_issys",
+    "st_note", "st_promo", "st_set", "st_show", "st_smpl",
+    "st_subid", "stack", "statsby", "statsby_8", "stbase", "stci",
+    "stci_7", "stcox", "stcox_estat", "stcox_fr", "stcox_fr_ll",
+    "stcox_p", "stcox_sw", "stcoxkm", "stcoxkm_7", "stcstat",
+    "stcurv", "stcurve", "stcurve_7", "stdes", "stem", "stepwise",
+    "stereg", "stfill", "stgen", "stir", "stjoin", "stmc", "stmh",
+    "stphplot", "stphplot_7", "stphtest", "stphtest_7",
+    "stptime", "strate", "strate_7", "streg", "streg_sw", "streset",
+    "sts", "sts_7", "stset", "stsplit", "stsum", "sttocc",
+    "sttoct", "stvary", "stweib", "su", "suest", "suest_8",
+    "sum", "summ", "summa", "summar", "summari", "summariz",
+    "summarize", "sunflower", "sureg", "survcurv", "survsum",
+    "svar", "svar_p", "svmat", "svy", "svy_disp", "svy_dreg",
+    "svy_est", "svy_est_7", "svy_estat", "svy_get", "svy_gnbreg_p",
+    "svy_head", "svy_header", "svy_heckman_p", "svy_heckprob_p",
+    "svy_intreg_p", "svy_ivreg_p", "svy_logistic_p", "svy_logit_p",
+    "svy_mlogit_p", "svy_nbreg_p", "svy_ologit_p", "svy_oprobit_p",
+    "svy_poisson_p", "svy_probit_p", "svy_regress_p", "svy_sub",
+    "svy_sub_7", "svy_x", "svy_x_7", "svy_x_p", "svydes",
+    "svydes_8", "svygen", "svygnbreg", "svyheckman", "svyheckprob",
+    "svyintreg", "svyintreg_7", "svyintrg", "svyivreg", "svylc",
+    "svylog_p", "svylogit", "svymarkout", "svymarkout_8",
+    "svymean", "svymlog", "svymlogit", "svynbreg", "svyolog",
+    "svyologit", "svyoprob", "svyoprobit", "svyopts",
+    "svypois", "svypois_7", "svypoisson", "svyprobit", "svyprobt",
+    "svyprop", "svyprop_7", "svyratio", "svyreg", "svyreg_p",
+    "svyregress", "svyset", "svyset_7", "svyset_8", "svytab",
+    "svytab_7", "svytest", "svytotal", "sw", "sw_8", "swcnreg",
+    "swcox", "swereg", "swilk", "swlogis", "swlogit",
+    "swologit", "swoprbt", "swpois", "swprobit", "swqreg",
+    "swtobit", "swweib", "symmetry", "symmi", "symplot",
+    "symplot_7", "syntax", "sysdescribe", "sysdir", "sysuse",
+    "szroeter", "ta", "tab", "tab1", "tab2", "tab_or", "tabd",
+    "tabdi", "tabdis", "tabdisp", "tabi", "table", "tabodds",
+    "tabodds_7", "tabstat", "tabu", "tabul", "tabula", "tabulat",
+    "tabulate", "te", "tempfile", "tempname", "tempvar", "tes",
+    "test", "testnl", "testparm", "teststd", "tetrachoric",
+    "time_it", "timer", "tis", "tob", "tobi", "tobit", "tobit_p",
+    "tobit_sw", "token", "tokeni", "tokeniz", "tokenize",
+    "tostring", "total", "translate", "translator", "transmap",
+    "treat_ll", "treatr_p", "treatreg", "trim", "trnb_cons",
+    "trnb_mean", "trpoiss_d2", "trunc_ll", "truncr_p", "truncreg",
+    "tsappend", "tset", "tsfill", "tsline", "tsline_ex",
+    "tsreport", "tsrevar", "tsrline", "tsset", "tssmooth",
+    "tsunab", "ttest", "ttesti", "tut_chk", "tut_wait", "tutorial",
+    "tw", "tware_st", "two", "twoway", "twoway__fpfit_serset",
+    "twoway__function_gen", "twoway__histogram_gen",
+    "twoway__ipoint_serset", "twoway__ipoints_serset",
+    "twoway__kdensity_gen", "twoway__lfit_serset",
+    "twoway__normgen_gen", "twoway__pci_serset",
+    "twoway__qfit_serset", "twoway__scatteri_serset",
+    "twoway__sunflower_gen", "twoway_ksm_serset", "ty", "typ",
+    "type", "typeof", "u", "unab", "unabbrev", "unabcmd",
+    "update", "us", "use", "uselabel", "var", "var_mkcompanion",
+    "var_p", "varbasic", "varfcast", "vargranger", "varirf",
+    "varirf_add", "varirf_cgraph", "varirf_create", "varirf_ctable",
+    "varirf_describe", "varirf_dir", "varirf_drop", "varirf_erase",
+    "varirf_graph", "varirf_ograph", "varirf_rename", "varirf_set",
+    "varirf_table", "varlist", "varlmar", "varnorm", "varsoc",
+    "varstable", "varstable_w", "varstable_w2", "varwle",
+    "vce", "vec", "vec_fevd", "vec_mkphi", "vec_p", "vec_p_w",
+    "vecirf_create", "veclmar", "veclmar_w", "vecnorm",
+    "vecnorm_w", "vecrank", "vecstable", "verinst", "vers",
+    "versi", "versio", "version", "view", "viewsource", "vif",
+    "vwls", "wdatetof", "webdescribe", "webseek", "webuse",
+    "weib1_lf", "weib2_lf", "weib_lf", "weib_lf0", "weibhet_glf",
+    "weibhet_glf_sh", "weibhet_glfa", "weibhet_glfa_sh",
+    "weibhet_gp", "weibhet_ilf", "weibhet_ilf_sh", "weibhet_ilfa",
+    "weibhet_ilfa_sh", "weibhet_ip", "weibu_sw", "weibul_p",
+    "weibull", "weibull_c", "weibull_s", "weibullhet",
+    "wh", "whelp", "whi", "which", "whil", "while", "wilc_st",
+    "wilcoxon", "win", "wind", "windo", "window", "winexec",
+    "wntestb", "wntestb_7", "wntestq", "xchart", "xchart_7",
+    "xcorr", "xcorr_7", "xi", "xi_6", "xmlsav", "xmlsave",
+    "xmluse", "xpose", "xsh", "xshe", "xshel", "xshell",
+    "xt_iis", "xt_tis", "xtab_p", "xtabond", "xtbin_p",
+    "xtclog", "xtcloglog", "xtcloglog_8", "xtcloglog_d2",
+    "xtcloglog_pa_p", "xtcloglog_re_p", "xtcnt_p", "xtcorr",
+    "xtdata", "xtdes", "xtfront_p", "xtfrontier", "xtgee",
+    "xtgee_elink", "xtgee_estat", "xtgee_makeivar", "xtgee_p",
+    "xtgee_plink", "xtgls", "xtgls_p", "xthaus", "xthausman",
+    "xtht_p", "xthtaylor", "xtile", "xtint_p", "xtintreg",
+    "xtintreg_8", "xtintreg_d2", "xtintreg_p", "xtivp_1",
+    "xtivp_2", "xtivreg", "xtline", "xtline_ex", "xtlogit",
+    "xtlogit_8", "xtlogit_d2", "xtlogit_fe_p", "xtlogit_pa_p",
+    "xtlogit_re_p", "xtmixed", "xtmixed_estat", "xtmixed_p",
+    "xtnb_fe", "xtnb_lf", "xtnbreg", "xtnbreg_pa_p",
+    "xtnbreg_refe_p", "xtpcse", "xtpcse_p", "xtpois", "xtpoisson",
+    "xtpoisson_d2", "xtpoisson_pa_p", "xtpoisson_refe_p", "xtpred",
+    "xtprobit", "xtprobit_8", "xtprobit_d2", "xtprobit_re_p",
+    "xtps_fe", "xtps_lf", "xtps_ren", "xtps_ren_8", "xtrar_p",
+    "xtrc", "xtrc_p", "xtrchh", "xtrefe_p", "xtreg", "xtreg_be",
+    "xtreg_fe", "xtreg_ml", "xtreg_pa_p", "xtreg_re",
+    "xtregar", "xtrere_p", "xtset", "xtsf_ll", "xtsf_llti",
+    "xtsum", "xttab", "xttest0", "xttobit", "xttobit_8",
+    "xttobit_p", "xttrans", "yx", "yxview__barlike_draw",
+    "yxview_area_draw", "yxview_bar_draw", "yxview_dot_draw",
+    "yxview_dropline_draw", "yxview_function_draw",
+    "yxview_iarrow_draw", "yxview_ilabels_draw",
+    "yxview_normal_draw", "yxview_pcarrow_draw",
+    "yxview_pcbarrow_draw", "yxview_pccapsym_draw",
+    "yxview_pcscatter_draw", "yxview_pcspike_draw",
+    "yxview_rarea_draw", "yxview_rbar_draw", "yxview_rbarm_draw",
+    "yxview_rcap_draw", "yxview_rcapsym_draw",
+    "yxview_rconnected_draw", "yxview_rline_draw",
+    "yxview_rscatter_draw", "yxview_rspike_draw",
+    "yxview_spike_draw", "yxview_sunflower_draw", "zap_s", "zinb",
+    "zinb_llf", "zinb_plf", "zip", "zip_llf", "zip_p", "zip_plf",
+    "zt_ct_5", "zt_hc_5", "zt_hcd_5", "zt_is_5", "zt_iss_5",
+    "zt_sho_5", "zt_smp_5", "ztbase_5", "ztcox_5", "ztdes_5",
+    "ztereg_5", "ztfill_5", "ztgen_5", "ztir_5", "ztjoin_5", "ztnb",
+    "ztnb_p", "ztp", "ztp_p", "zts_5", "ztset_5", "ztspli_5",
+    "ztsum_5", "zttoct_5", "ztvary_5", "ztweib_5"
+)
+
+builtins_functions = (
+    "Cdhms", "Chms", "Clock", "Cmdyhms", "Cofc", "Cofd", "F",
+    "Fden", "Ftail", "I", "J", "_caller", "abbrev", "abs", "acos",
+    "acosh", "asin", "asinh", "atan", "atan2", "atanh",
+    "autocode", "betaden", "binomial", "binomialp", "binomialtail",
+    "binormal", "bofd", "byteorder", "c", "ceil", "char",
+    "chi2", "chi2den", "chi2tail", "cholesky", "chop", "clip",
+    "clock", "cloglog", "cofC", "cofd", "colnumb", "colsof", "comb",
+    "cond", "corr", "cos", "cosh", "d", "daily", "date", "day",
+    "det", "dgammapda", "dgammapdada", "dgammapdadx", "dgammapdx",
+    "dgammapdxdx", "dhms", "diag", "diag0cnt", "digamma",
+    "dofC", "dofb", "dofc", "dofh", "dofm", "dofq", "dofw",
+    "dofy", "dow", "doy", "dunnettprob", "e", "el", "epsdouble",
+    "epsfloat", "exp", "fileexists", "fileread", "filereaderror",
+    "filewrite", "float", "floor", "fmtwidth", "gammaden",
+    "gammap", "gammaptail", "get", "group", "h", "hadamard",
+    "halfyear", "halfyearly", "has_eprop", "hh", "hhC", "hms",
+    "hofd", "hours", "hypergeometric", "hypergeometricp", "ibeta",
+    "ibetatail", "index", "indexnot", "inlist", "inrange", "int",
+    "inv", "invF", "invFtail", "invbinomial", "invbinomialtail",
+    "invchi2", "invchi2tail", "invcloglog", "invdunnettprob",
+    "invgammap", "invgammaptail", "invibeta", "invibetatail",
+    "invlogit", "invnFtail", "invnbinomial", "invnbinomialtail",
+    "invnchi2", "invnchi2tail", "invnibeta", "invnorm", "invnormal",
+    "invnttail", "invpoisson", "invpoissontail", "invsym", "invt",
+    "invttail", "invtukeyprob", "irecode", "issym", "issymmetric",
+    "itrim", "length", "ln", "lnfact", "lnfactorial", "lngamma",
+    "lnnormal", "lnnormalden", "log", "log10", "logit", "lower",
+    "ltrim", "m", "match", "matmissing", "matrix", "matuniform",
+    "max", "maxbyte", "maxdouble", "maxfloat", "maxint", "maxlong",
+    "mdy", "mdyhms", "mi", "min", "minbyte", "mindouble",
+    "minfloat", "minint", "minlong", "minutes", "missing", "mm",
+    "mmC", "mod", "mofd", "month", "monthly", "mreldif",
+    "msofhours", "msofminutes", "msofseconds", "nF", "nFden",
+    "nFtail", "nbetaden", "nbinomial", "nbinomialp", "nbinomialtail",
+    "nchi2", "nchi2den", "nchi2tail", "nibeta", "norm", "normal",
+    "normalden", "normd", "npnF", "npnchi2", "npnt", "nt", "ntden",
+    "nttail", "nullmat", "plural", "poisson", "poissonp",
+    "poissontail", "proper", "q", "qofd", "quarter", "quarterly",
+    "r", "rbeta", "rbinomial", "rchi2", "real", "recode", "regexm",
+    "regexr", "regexs", "reldif", "replay", "return", "reverse",
+    "rgamma", "rhypergeometric", "rnbinomial", "rnormal", "round",
+    "rownumb", "rowsof", "rpoisson", "rt", "rtrim", "runiform", "s",
+    "scalar", "seconds", "sign", "sin", "sinh", "smallestdouble",
+    "soundex", "soundex_nara", "sqrt", "ss", "ssC", "strcat",
+    "strdup", "string", "strlen", "strlower", "strltrim", "strmatch",
+    "strofreal", "strpos", "strproper", "strreverse", "strrtrim",
+    "strtoname", "strtrim", "strupper", "subinstr", "subinword",
+    "substr", "sum", "sweep", "syminv", "t", "tC", "tan", "tanh",
+    "tc", "td", "tden", "th", "tin", "tm", "tq", "trace",
+    "trigamma", "trim", "trunc", "ttail", "tukeyprob", "tw",
+    "twithin", "uniform", "upper", "vec", "vecdiag", "w", "week",
+    "weekly", "wofd", "word", "wordcount", "year", "yearly",
+    "yh", "ym", "yofd", "yq", "yw"
+)
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/c_like.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/c_like.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/c_like.py	(revision 1126)
@@ -0,0 +1,541 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.c_like
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for other C-like languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, inherit, words, \
+    default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+from pygments.lexers.c_cpp import CLexer, CppLexer
+from pygments.lexers import _mql_builtins
+
+__all__ = ['PikeLexer', 'NesCLexer', 'ClayLexer', 'ECLexer', 'ValaLexer',
+           'CudaLexer', 'SwigLexer', 'MqlLexer', 'ArduinoLexer']
+
+
+class PikeLexer(CppLexer):
+    """
+    For `Pike <http://pike.lysator.liu.se/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Pike'
+    aliases = ['pike']
+    filenames = ['*.pike', '*.pmod']
+    mimetypes = ['text/x-pike']
+
+    tokens = {
+        'statements': [
+            (words((
+                'catch', 'new', 'private', 'protected', 'public', 'gauge',
+                'throw', 'throws', 'class', 'interface', 'implement', 'abstract', 'extends', 'from',
+                'this', 'super', 'constant', 'final', 'static', 'import', 'use', 'extern',
+                'inline', 'proto', 'break', 'continue', 'if', 'else', 'for',
+                'while', 'do', 'switch', 'case', 'as', 'in', 'version', 'return', 'true', 'false', 'null',
+                '__VERSION__', '__MAJOR__', '__MINOR__', '__BUILD__', '__REAL_VERSION__',
+                '__REAL_MAJOR__', '__REAL_MINOR__', '__REAL_BUILD__', '__DATE__', '__TIME__',
+                '__FILE__', '__DIR__', '__LINE__', '__AUTO_BIGNUM__', '__NT__', '__PIKE__',
+                '__amigaos__', '_Pragma', 'static_assert', 'defined', 'sscanf'), suffix=r'\b'),
+             Keyword),
+            (r'(bool|int|long|float|short|double|char|string|object|void|mapping|'
+             r'array|multiset|program|function|lambda|mixed|'
+             r'[a-z_][a-z0-9_]*_t)\b',
+             Keyword.Type),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (r'[~!%^&*+=|?:<>/@-]', Operator),
+            inherit,
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            # template specification
+            (r'\s*(?=>)', Text, '#pop'),
+        ],
+    }
+
+
+class NesCLexer(CLexer):
+    """
+    For `nesC <https://github.com/tinyos/nesc>`_ source code with preprocessor
+    directives.
+
+    .. versionadded:: 2.0
+    """
+    name = 'nesC'
+    aliases = ['nesc']
+    filenames = ['*.nc']
+    mimetypes = ['text/x-nescsrc']
+
+    tokens = {
+        'statements': [
+            (words((
+                'abstract', 'as', 'async', 'atomic', 'call', 'command', 'component',
+                'components', 'configuration', 'event', 'extends', 'generic',
+                'implementation', 'includes', 'interface', 'module', 'new', 'norace',
+                'post', 'provides', 'signal', 'task', 'uses'), suffix=r'\b'),
+             Keyword),
+            (words(('nx_struct', 'nx_union', 'nx_int8_t', 'nx_int16_t', 'nx_int32_t',
+                    'nx_int64_t', 'nx_uint8_t', 'nx_uint16_t', 'nx_uint32_t',
+                    'nx_uint64_t'), suffix=r'\b'),
+             Keyword.Type),
+            inherit,
+        ],
+    }
+
+
+class ClayLexer(RegexLexer):
+    """
+    For `Clay <http://claylabs.com/clay/>`_ source.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Clay'
+    filenames = ['*.clay']
+    aliases = ['clay']
+    mimetypes = ['text/x-clay']
+    tokens = {
+        'root': [
+            (r'\s', Text),
+            (r'//.*?$', Comment.Singleline),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'\b(public|private|import|as|record|variant|instance'
+             r'|define|overload|default|external|alias'
+             r'|rvalue|ref|forward|inline|noinline|forceinline'
+             r'|enum|var|and|or|not|if|else|goto|return|while'
+             r'|switch|case|break|continue|for|in|true|false|try|catch|throw'
+             r'|finally|onerror|staticassert|eval|when|newtype'
+             r'|__FILE__|__LINE__|__COLUMN__|__ARG__'
+             r')\b', Keyword),
+            (r'[~!%^&*+=|:<>/-]', Operator),
+            (r'[#(){}\[\],;.]', Punctuation),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'\b(true|false)\b', Name.Builtin),
+            (r'(?i)[a-z_?][\w?]*', Name),
+            (r'"""', String, 'tdqs'),
+            (r'"', String, 'dqs'),
+        ],
+        'strings': [
+            (r'(?i)\\(x[0-9a-f]{2}|.)', String.Escape),
+            (r'.', String),
+        ],
+        'nl': [
+            (r'\n', String),
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            include('strings'),
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+            include('nl'),
+        ],
+    }
+
+
+class ECLexer(CLexer):
+    """
+    For eC source code with preprocessor directives.
+
+    .. versionadded:: 1.5
+    """
+    name = 'eC'
+    aliases = ['ec']
+    filenames = ['*.ec', '*.eh']
+    mimetypes = ['text/x-echdr', 'text/x-ecsrc']
+
+    tokens = {
+        'statements': [
+            (words((
+                'virtual', 'class', 'private', 'public', 'property', 'import',
+                'delete', 'new', 'new0', 'renew', 'renew0', 'define', 'get',
+                'set', 'remote', 'dllexport', 'dllimport', 'stdcall', 'subclass',
+                '__on_register_module', 'namespace', 'using', 'typed_object',
+                'any_object', 'incref', 'register', 'watch', 'stopwatching', 'firewatchers',
+                'watchable', 'class_designer', 'class_fixed', 'class_no_expansion', 'isset',
+                'class_default_property', 'property_category', 'class_data',
+                'class_property', 'thisclass', 'dbtable', 'dbindex',
+                'database_open', 'dbfield'), suffix=r'\b'), Keyword),
+            (words(('uint', 'uint16', 'uint32', 'uint64', 'bool', 'byte',
+                    'unichar', 'int64'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (r'(null|value|this)\b', Name.Builtin),
+            inherit,
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            # template specification
+            (r'\s*(?=>)', Text, '#pop'),
+        ],
+    }
+
+
+class ValaLexer(RegexLexer):
+    """
+    For Vala source code with preprocessor directives.
+
+    .. versionadded:: 1.1
+    """
+    name = 'Vala'
+    aliases = ['vala', 'vapi']
+    filenames = ['*.vala', '*.vapi']
+    mimetypes = ['text/x-vala']
+
+    tokens = {
+        'whitespace': [
+            (r'^\s*#if\s+0', Comment.Preproc, 'if0'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'//(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+        ],
+        'statements': [
+            (r'[L@]?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'",
+             String.Char),
+            (r'(?s)""".*?"""', String),  # verbatim strings
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+            (r'0[0-7]+[Ll]?', Number.Oct),
+            (r'\d+[Ll]?', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'(\[)(Compact|Immutable|(?:Boolean|Simple)Type)(\])',
+             bygroups(Punctuation, Name.Decorator, Punctuation)),
+            # TODO: "correctly" parse complex code attributes
+            (r'(\[)(CCode|(?:Integer|Floating)Type)',
+             bygroups(Punctuation, Name.Decorator)),
+            (r'[()\[\],.]', Punctuation),
+            (words((
+                'as', 'base', 'break', 'case', 'catch', 'construct', 'continue',
+                'default', 'delete', 'do', 'else', 'enum', 'finally', 'for',
+                'foreach', 'get', 'if', 'in', 'is', 'lock', 'new', 'out', 'params',
+                'return', 'set', 'sizeof', 'switch', 'this', 'throw', 'try',
+                'typeof', 'while', 'yield'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'abstract', 'const', 'delegate', 'dynamic', 'ensures', 'extern',
+                'inline', 'internal', 'override', 'owned', 'private', 'protected',
+                'public', 'ref', 'requires', 'signal', 'static', 'throws', 'unowned',
+                'var', 'virtual', 'volatile', 'weak', 'yields'), suffix=r'\b'),
+             Keyword.Declaration),
+            (r'(namespace|using)(\s+)', bygroups(Keyword.Namespace, Text),
+             'namespace'),
+            (r'(class|errordomain|interface|struct)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'class'),
+            (r'(\.)([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            # void is an actual keyword, others are in glib-2.0.vapi
+            (words((
+                'void', 'bool', 'char', 'double', 'float', 'int', 'int8', 'int16',
+                'int32', 'int64', 'long', 'short', 'size_t', 'ssize_t', 'string',
+                'time_t', 'uchar', 'uint', 'uint8', 'uint16', 'uint32', 'uint64',
+                'ulong', 'unichar', 'ushort'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(true|false|null)\b', Name.Builtin),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'root': [
+            include('whitespace'),
+            default('statement'),
+        ],
+        'statement': [
+            include('whitespace'),
+            include('statements'),
+            ('[{}]', Punctuation),
+            (';', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#el(?:se|if).*\n', Comment.Preproc, '#pop'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'namespace': [
+            (r'[a-zA-Z_][\w.]*', Name.Namespace, '#pop')
+        ],
+    }
+
+
+class CudaLexer(CLexer):
+    """
+    For NVIDIA `CUDA™ <http://developer.nvidia.com/category/zone/cuda-zone>`_
+    source.
+
+    .. versionadded:: 1.6
+    """
+    name = 'CUDA'
+    filenames = ['*.cu', '*.cuh']
+    aliases = ['cuda', 'cu']
+    mimetypes = ['text/x-cuda']
+
+    function_qualifiers = set(('__device__', '__global__', '__host__',
+                               '__noinline__', '__forceinline__'))
+    variable_qualifiers = set(('__device__', '__constant__', '__shared__',
+                               '__restrict__'))
+    vector_types = set(('char1', 'uchar1', 'char2', 'uchar2', 'char3', 'uchar3',
+                        'char4', 'uchar4', 'short1', 'ushort1', 'short2', 'ushort2',
+                        'short3', 'ushort3', 'short4', 'ushort4', 'int1', 'uint1',
+                        'int2', 'uint2', 'int3', 'uint3', 'int4', 'uint4', 'long1',
+                        'ulong1', 'long2', 'ulong2', 'long3', 'ulong3', 'long4',
+                        'ulong4', 'longlong1', 'ulonglong1', 'longlong2',
+                        'ulonglong2', 'float1', 'float2', 'float3', 'float4',
+                        'double1', 'double2', 'dim3'))
+    variables = set(('gridDim', 'blockIdx', 'blockDim', 'threadIdx', 'warpSize'))
+    functions = set(('__threadfence_block', '__threadfence', '__threadfence_system',
+                     '__syncthreads', '__syncthreads_count', '__syncthreads_and',
+                     '__syncthreads_or'))
+    execution_confs = set(('<<<', '>>>'))
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in CLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                if value in self.variable_qualifiers:
+                    token = Keyword.Type
+                elif value in self.vector_types:
+                    token = Keyword.Type
+                elif value in self.variables:
+                    token = Name.Builtin
+                elif value in self.execution_confs:
+                    token = Keyword.Pseudo
+                elif value in self.function_qualifiers:
+                    token = Keyword.Reserved
+                elif value in self.functions:
+                    token = Name.Function
+            yield index, token, value
+
+
+class SwigLexer(CppLexer):
+    """
+    For `SWIG <http://www.swig.org/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'SWIG'
+    aliases = ['swig']
+    filenames = ['*.swg', '*.i']
+    mimetypes = ['text/swig']
+    priority = 0.04  # Lower than C/C++ and Objective C/C++
+
+    tokens = {
+        'statements': [
+            # SWIG directives
+            (r'(%[a-z_][a-z0-9_]*)', Name.Function),
+            # Special variables
+            ('\$\**\&?\w+', Name),
+            # Stringification / additional preprocessor directives
+            (r'##*[a-zA-Z_]\w*', Comment.Preproc),
+            inherit,
+        ],
+    }
+
+    # This is a far from complete set of SWIG directives
+    swig_directives = set((
+        # Most common directives
+        '%apply', '%define', '%director', '%enddef', '%exception', '%extend',
+        '%feature', '%fragment', '%ignore', '%immutable', '%import', '%include',
+        '%inline', '%insert', '%module', '%newobject', '%nspace', '%pragma',
+        '%rename', '%shared_ptr', '%template', '%typecheck', '%typemap',
+        # Less common directives
+        '%arg', '%attribute', '%bang', '%begin', '%callback', '%catches', '%clear',
+        '%constant', '%copyctor', '%csconst', '%csconstvalue', '%csenum',
+        '%csmethodmodifiers', '%csnothrowexception', '%default', '%defaultctor',
+        '%defaultdtor', '%defined', '%delete', '%delobject', '%descriptor',
+        '%exceptionclass', '%exceptionvar', '%extend_smart_pointer', '%fragments',
+        '%header', '%ifcplusplus', '%ignorewarn', '%implicit', '%implicitconv',
+        '%init', '%javaconst', '%javaconstvalue', '%javaenum', '%javaexception',
+        '%javamethodmodifiers', '%kwargs', '%luacode', '%mutable', '%naturalvar',
+        '%nestedworkaround', '%perlcode', '%pythonabc', '%pythonappend',
+        '%pythoncallback', '%pythoncode', '%pythondynamic', '%pythonmaybecall',
+        '%pythonnondynamic', '%pythonprepend', '%refobject', '%shadow', '%sizeof',
+        '%trackobjects', '%types', '%unrefobject', '%varargs', '%warn',
+        '%warnfilter'))
+
+    def analyse_text(text):
+        rv = 0
+        # Search for SWIG directives, which are conventionally at the beginning of
+        # a line. The probability of them being within a line is low, so let another
+        # lexer win in this case.
+        matches = re.findall(r'^\s*(%[a-z_][a-z0-9_]*)', text, re.M)
+        for m in matches:
+            if m in SwigLexer.swig_directives:
+                rv = 0.98
+                break
+            else:
+                rv = 0.91  # Fraction higher than MatlabLexer
+        return rv
+
+
+class MqlLexer(CppLexer):
+    """
+    For `MQL4 <http://docs.mql4.com/>`_ and
+    `MQL5 <http://www.mql5.com/en/docs>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'MQL'
+    aliases = ['mql', 'mq4', 'mq5', 'mql4', 'mql5']
+    filenames = ['*.mq4', '*.mq5', '*.mqh']
+    mimetypes = ['text/x-mql']
+
+    tokens = {
+        'statements': [
+            (words(_mql_builtins.keywords, suffix=r'\b'), Keyword),
+            (words(_mql_builtins.c_types, suffix=r'\b'), Keyword.Type),
+            (words(_mql_builtins.types, suffix=r'\b'), Name.Function),
+            (words(_mql_builtins.constants, suffix=r'\b'), Name.Constant),
+            (words(_mql_builtins.colors, prefix='(clr)?', suffix=r'\b'),
+             Name.Constant),
+            inherit,
+        ],
+    }
+
+class ArduinoLexer(CppLexer):
+    """
+    For `Arduino(tm) <https://arduino.cc/>`_ source.
+
+    This is an extension of the CppLexer, as the Arduino® Language is a superset
+    of C++
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Arduino'
+    aliases = ['arduino']
+    filenames = ['*.ino']
+    mimetypes = ['text/x-arduino']
+
+    # Language sketch main structure functions
+    structure = set(('setup', 'loop'))
+
+    # Language operators
+    operators = set(('not', 'or', 'and', 'xor'))
+
+    # Language 'variables'
+    variables = set((
+        'DIGITAL_MESSAGE', 'FIRMATA_STRING', 'ANALOG_MESSAGE', 'REPORT_DIGITAL',
+        'REPORT_ANALOG', 'INPUT_PULLUP', 'SET_PIN_MODE', 'INTERNAL2V56', 'SYSTEM_RESET',
+        'LED_BUILTIN', 'INTERNAL1V1', 'SYSEX_START', 'INTERNAL', 'EXTERNAL', 'HIGH',
+        'LOW', 'INPUT', 'OUTPUT', 'INPUT_PULLUP', 'LED_BUILTIN', 'true', 'false',
+        'void', 'boolean', 'char', 'unsigned char', 'byte', 'int', 'unsigned int',
+        'word', 'long', 'unsigned long', 'short', 'float', 'double', 'string', 'String',
+        'array', 'static', 'volatile', 'const', 'boolean', 'byte', 'word', 'string',
+        'String', 'array', 'int', 'float', 'private', 'char', 'virtual', 'operator',
+        'sizeof', 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t', 'int8_t', 'int16_t',
+        'int32_t', 'int64_t', 'dynamic_cast', 'typedef', 'const_cast', 'const',
+        'struct', 'static_cast', 'union', 'unsigned', 'long', 'volatile', 'static',
+        'protected', 'bool', 'public', 'friend', 'auto', 'void', 'enum', 'extern',
+        'class', 'short', 'reinterpret_cast', 'double', 'register', 'explicit',
+        'signed', 'inline', 'delete', '_Bool', 'complex', '_Complex', '_Imaginary',
+        'atomic_bool', 'atomic_char', 'atomic_schar', 'atomic_uchar', 'atomic_short',
+        'atomic_ushort', 'atomic_int', 'atomic_uint', 'atomic_long', 'atomic_ulong',
+        'atomic_llong', 'atomic_ullong', 'PROGMEM'))
+
+    # Language shipped functions and class ( )
+    functions = set((
+        'KeyboardController', 'MouseController', 'SoftwareSerial', 'EthernetServer',
+        'EthernetClient', 'LiquidCrystal', 'RobotControl', 'GSMVoiceCall',
+        'EthernetUDP', 'EsploraTFT', 'HttpClient', 'RobotMotor', 'WiFiClient',
+        'GSMScanner', 'FileSystem', 'Scheduler', 'GSMServer', 'YunClient', 'YunServer',
+        'IPAddress', 'GSMClient', 'GSMModem', 'Keyboard', 'Ethernet', 'Console',
+        'GSMBand', 'Esplora', 'Stepper', 'Process', 'WiFiUDP', 'GSM_SMS', 'Mailbox',
+        'USBHost', 'Firmata', 'PImage', 'Client', 'Server', 'GSMPIN', 'FileIO',
+        'Bridge', 'Serial', 'EEPROM', 'Stream', 'Mouse', 'Audio', 'Servo', 'File',
+        'Task', 'GPRS', 'WiFi', 'Wire', 'TFT', 'GSM', 'SPI', 'SD',
+        'runShellCommandAsynchronously', 'analogWriteResolution',
+        'retrieveCallingNumber', 'printFirmwareVersion', 'analogReadResolution',
+        'sendDigitalPortPair', 'noListenOnLocalhost', 'readJoystickButton',
+        'setFirmwareVersion', 'readJoystickSwitch', 'scrollDisplayRight',
+        'getVoiceCallStatus', 'scrollDisplayLeft', 'writeMicroseconds',
+        'delayMicroseconds', 'beginTransmission', 'getSignalStrength',
+        'runAsynchronously', 'getAsynchronously', 'listenOnLocalhost',
+        'getCurrentCarrier', 'readAccelerometer', 'messageAvailable',
+        'sendDigitalPorts', 'lineFollowConfig', 'countryNameWrite', 'runShellCommand',
+        'readStringUntil', 'rewindDirectory', 'readTemperature', 'setClockDivider',
+        'readLightSensor', 'endTransmission', 'analogReference', 'detachInterrupt',
+        'countryNameRead', 'attachInterrupt', 'encryptionType', 'readBytesUntil',
+        'robotNameWrite', 'readMicrophone', 'robotNameRead', 'cityNameWrite',
+        'userNameWrite', 'readJoystickY', 'readJoystickX', 'mouseReleased',
+        'openNextFile', 'scanNetworks', 'noInterrupts', 'digitalWrite', 'beginSpeaker',
+        'mousePressed', 'isActionDone', 'mouseDragged', 'displayLogos', 'noAutoscroll',
+        'addParameter', 'remoteNumber', 'getModifiers', 'keyboardRead', 'userNameRead',
+        'waitContinue', 'processInput', 'parseCommand', 'printVersion', 'readNetworks',
+        'writeMessage', 'blinkVersion', 'cityNameRead', 'readMessage', 'setDataMode',
+        'parsePacket', 'isListening', 'setBitOrder', 'beginPacket', 'isDirectory',
+        'motorsWrite', 'drawCompass', 'digitalRead', 'clearScreen', 'serialEvent',
+        'rightToLeft', 'setTextSize', 'leftToRight', 'requestFrom', 'keyReleased',
+        'compassRead', 'analogWrite', 'interrupts', 'WiFiServer', 'disconnect',
+        'playMelody', 'parseFloat', 'autoscroll', 'getPINUsed', 'setPINUsed',
+        'setTimeout', 'sendAnalog', 'readSlider', 'analogRead', 'beginWrite',
+        'createChar', 'motorsStop', 'keyPressed', 'tempoWrite', 'readButton',
+        'subnetMask', 'debugPrint', 'macAddress', 'writeGreen', 'randomSeed',
+        'attachGPRS', 'readString', 'sendString', 'remotePort', 'releaseAll',
+        'mouseMoved', 'background', 'getXChange', 'getYChange', 'answerCall',
+        'getResult', 'voiceCall', 'endPacket', 'constrain', 'getSocket', 'writeJSON',
+        'getButton', 'available', 'connected', 'findUntil', 'readBytes', 'exitValue',
+        'readGreen', 'writeBlue', 'startLoop', 'IPAddress', 'isPressed', 'sendSysex',
+        'pauseMode', 'gatewayIP', 'setCursor', 'getOemKey', 'tuneWrite', 'noDisplay',
+        'loadImage', 'switchPIN', 'onRequest', 'onReceive', 'changePIN', 'playFile',
+        'noBuffer', 'parseInt', 'overflow', 'checkPIN', 'knobRead', 'beginTFT',
+        'bitClear', 'updateIR', 'bitWrite', 'position', 'writeRGB', 'highByte',
+        'writeRed', 'setSpeed', 'readBlue', 'noStroke', 'remoteIP', 'transfer',
+        'shutdown', 'hangCall', 'beginSMS', 'endWrite', 'attached', 'maintain',
+        'noCursor', 'checkReg', 'checkPUK', 'shiftOut', 'isValid', 'shiftIn', 'pulseIn',
+        'connect', 'println', 'localIP', 'pinMode', 'getIMEI', 'display', 'noBlink',
+        'process', 'getBand', 'running', 'beginSD', 'drawBMP', 'lowByte', 'setBand',
+        'release', 'bitRead', 'prepare', 'pointTo', 'readRed', 'setMode', 'noFill',
+        'remove', 'listen', 'stroke', 'detach', 'attach', 'noTone', 'exists', 'buffer',
+        'height', 'bitSet', 'circle', 'config', 'cursor', 'random', 'IRread', 'setDNS',
+        'endSMS', 'getKey', 'micros', 'millis', 'begin', 'print', 'write', 'ready',
+        'flush', 'width', 'isPIN', 'blink', 'clear', 'press', 'mkdir', 'rmdir', 'close',
+        'point', 'yield', 'image', 'BSSID', 'click', 'delay', 'read', 'text', 'move',
+        'peek', 'beep', 'rect', 'line', 'open', 'seek', 'fill', 'size', 'turn', 'stop',
+        'home', 'find', 'step', 'tone', 'sqrt', 'RSSI', 'SSID', 'end', 'bit', 'tan',
+        'cos', 'sin', 'pow', 'map', 'abs', 'max', 'min', 'get', 'run', 'put',
+        'isAlphaNumeric', 'isAlpha', 'isAscii', 'isWhitespace', 'isControl', 'isDigit', 
+        'isGraph', 'isLowerCase', 'isPrintable', 'isPunct', 'isSpace', 'isUpperCase', 
+        'isHexadecimalDigit'))    
+
+    # do not highlight
+    suppress_highlight = set((
+        'namespace', 'template', 'mutable', 'using', 'asm', 'typeid', 
+        'typename', 'this', 'alignof', 'constexpr', 'decltype', 'noexcept', 
+        'static_assert', 'thread_local', 'restrict'))
+
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in CppLexer.get_tokens_unprocessed(self, text):
+            if value in self.structure:
+                yield index, Name.Builtin, value
+            elif value in self.operators:
+                yield index, Operator, value
+            elif value in self.variables:
+                yield index, Keyword.Reserved, value
+            elif value in self.suppress_highlight:
+                yield index, Name, value
+            elif value in self.functions:
+                yield index, Name.Function, value
+            else:
+                yield index, token, value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/j.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/j.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/j.py	(revision 1126)
@@ -0,0 +1,146 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.j
+    ~~~~~~~~~~~~~~~~~
+
+    Lexer for the J programming language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Comment, Keyword, Name, Number, Operator, Punctuation, \
+    String, Text
+
+__all__ = ['JLexer']
+
+
+class JLexer(RegexLexer):
+    """
+    For `J <http://jsoftware.com/>`_ source code.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'J'
+    aliases = ['j']
+    filenames = ['*.ijs']
+    mimetypes = ['text/x-j']
+
+    validName = r'\b[a-zA-Z]\w*'
+
+    tokens = {
+        'root': [
+            # Shebang script
+            (r'#!.*$', Comment.Preproc),
+
+            # Comments
+            (r'NB\..*', Comment.Single),
+            (r'\n+\s*Note', Comment.Multiline, 'comment'),
+            (r'\s*Note.*', Comment.Single),
+
+            # Whitespace
+            (r'\s+', Text),
+
+            # Strings
+            (r"'", String, 'singlequote'),
+
+            # Definitions
+            (r'0\s+:\s*0|noun\s+define\s*$', Name.Entity, 'nounDefinition'),
+            (r'(([1-4]|13)\s+:\s*0|(adverb|conjunction|dyad|monad|verb)\s+define)\b',
+             Name.Function, 'explicitDefinition'),
+
+            # Flow Control
+            (words(('for_', 'goto_', 'label_'), suffix=validName+'\.'), Name.Label),
+            (words((
+                'assert', 'break', 'case', 'catch', 'catchd',
+                'catcht', 'continue', 'do', 'else', 'elseif',
+                'end', 'fcase', 'for', 'if', 'return',
+                'select', 'throw', 'try', 'while', 'whilst',
+                ), suffix='\.'), Name.Label),
+
+            # Variable Names
+            (validName, Name.Variable),
+
+            # Standard Library
+            (words((
+                'ARGV', 'CR', 'CRLF', 'DEL', 'Debug',
+                'EAV', 'EMPTY', 'FF', 'JVERSION', 'LF',
+                'LF2', 'Note', 'TAB', 'alpha17', 'alpha27',
+                'apply', 'bind', 'boxopen', 'boxxopen', 'bx',
+                'clear', 'cutLF', 'cutopen', 'datatype', 'def',
+                'dfh', 'drop', 'each', 'echo', 'empty',
+                'erase', 'every', 'evtloop', 'exit', 'expand',
+                'fetch', 'file2url', 'fixdotdot', 'fliprgb', 'getargs',
+                'getenv', 'hfd', 'inv', 'inverse', 'iospath',
+                'isatty', 'isutf8', 'items', 'leaf', 'list',
+                'nameclass', 'namelist', 'names', 'nc',
+                'nl', 'on', 'pick', 'rows',
+                'script', 'scriptd', 'sign', 'sminfo', 'smoutput',
+                'sort', 'split', 'stderr', 'stdin', 'stdout',
+                'table', 'take', 'timespacex', 'timex', 'tmoutput',
+                'toCRLF', 'toHOST', 'toJ', 'tolower', 'toupper',
+                'type', 'ucp', 'ucpcount', 'usleep', 'utf8',
+                'uucp',
+                )), Name.Function),
+
+            # Copula
+            (r'=[.:]', Operator),
+
+            # Builtins
+            (r'[-=+*#$%@!~`^&";:.,<>{}\[\]\\|/]', Operator),
+
+            # Short Keywords
+            (r'[abCdDeEfHiIjLMoprtT]\.',  Keyword.Reserved),
+            (r'[aDiLpqsStux]\:', Keyword.Reserved),
+            (r'(_[0-9])\:', Keyword.Constant),
+
+            # Parens
+            (r'\(', Punctuation, 'parentheses'),
+
+            # Numbers
+            include('numbers'),
+        ],
+
+        'comment': [
+            (r'[^)]', Comment.Multiline),
+            (r'^\)', Comment.Multiline, '#pop'),
+            (r'[)]', Comment.Multiline),
+        ],
+
+        'explicitDefinition': [
+            (r'\b[nmuvxy]\b', Name.Decorator),
+            include('root'),
+            (r'[^)]', Name),
+            (r'^\)', Name.Label, '#pop'),
+            (r'[)]', Name),
+        ],
+
+        'numbers': [
+            (r'\b_{1,2}\b', Number),
+            (r'_?\d+(\.\d+)?(\s*[ejr]\s*)_?\d+(\.?=\d+)?', Number),
+            (r'_?\d+\.(?=\d+)', Number.Float),
+            (r'_?\d+x', Number.Integer.Long),
+            (r'_?\d+', Number.Integer),
+        ],
+
+        'nounDefinition': [
+            (r'[^)]', String),
+            (r'^\)', Name.Label, '#pop'),
+            (r'[)]', String),
+        ],
+
+        'parentheses': [
+            (r'\)', Punctuation, '#pop'),
+            # include('nounDefinition'),
+            include('explicitDefinition'),
+            include('root'),
+        ],
+
+        'singlequote': [
+            (r"[^']", String),
+            (r"''", String),
+            (r"'", String, '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/eiffel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/eiffel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/eiffel.py	(revision 1126)
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.eiffel
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Eiffel language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['EiffelLexer']
+
+
+class EiffelLexer(RegexLexer):
+    """
+    For `Eiffel <http://www.eiffel.com>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Eiffel'
+    aliases = ['eiffel']
+    filenames = ['*.e']
+    mimetypes = ['text/x-eiffel']
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'--.*?\n', Comment.Single),
+            (r'[^\S\n]+', Text),
+            # Please note that keyword and operator are case insensitive.
+            (r'(?i)(true|false|void|current|result|precursor)\b', Keyword.Constant),
+            (r'(?i)(and(\s+then)?|not|xor|implies|or(\s+else)?)\b', Operator.Word),
+            (words((
+                'across', 'agent', 'alias', 'all', 'as', 'assign', 'attached',
+                'attribute', 'check', 'class', 'convert', 'create', 'debug',
+                'deferred', 'detachable', 'do', 'else', 'elseif', 'end', 'ensure',
+                'expanded', 'export', 'external', 'feature', 'from', 'frozen', 'if',
+                'inherit', 'inspect', 'invariant', 'like', 'local', 'loop', 'none',
+                'note', 'obsolete', 'old', 'once', 'only', 'redefine', 'rename',
+                'require', 'rescue', 'retry', 'select', 'separate', 'then',
+                'undefine', 'until', 'variant', 'when'), prefix=r'(?i)\b', suffix=r'\b'),
+             Keyword.Reserved),
+            (r'"\[(([^\]%]|\n)|%(.|\n)|\][^"])*?\]"', String),
+            (r'"([^"%\n]|%.)*?"', String),
+            include('numbers'),
+            (r"'([^'%]|%'|%%)'", String.Char),
+            (r"(//|\\\\|>=|<=|:=|/=|~|/~|[\\?!#%&@|+/\-=>*$<^\[\]])", Operator),
+            (r"([{}():;,.])", Punctuation),
+            (r'([a-z]\w*)|([A-Z][A-Z0-9_]*[a-z]\w*)', Name),
+            (r'([A-Z][A-Z0-9_]*)', Name.Class),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'0[bB][01]+', Number.Bin),
+            (r'0[cC][0-7]+', Number.Oct),
+            (r'([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/algebra.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/algebra.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/algebra.py	(revision 1126)
@@ -0,0 +1,221 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.algebra
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for computer algebra systems.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['GAPLexer', 'MathematicaLexer', 'MuPADLexer', 'BCLexer']
+
+
+class GAPLexer(RegexLexer):
+    """
+    For `GAP <http://www.gap-system.org>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'GAP'
+    aliases = ['gap']
+    filenames = ['*.g', '*.gd', '*.gi', '*.gap']
+
+    tokens = {
+        'root': [
+            (r'#.*$', Comment.Single),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'\(|\)|\[|\]|\{|\}', Punctuation),
+            (r'''(?x)\b(?:
+                if|then|elif|else|fi|
+                for|while|do|od|
+                repeat|until|
+                break|continue|
+                function|local|return|end|
+                rec|
+                quit|QUIT|
+                IsBound|Unbind|
+                TryNextMethod|
+                Info|Assert
+              )\b''', Keyword),
+            (r'''(?x)\b(?:
+                true|false|fail|infinity
+              )\b''',
+             Name.Constant),
+            (r'''(?x)\b(?:
+                (Declare|Install)([A-Z][A-Za-z]+)|
+                   BindGlobal|BIND_GLOBAL
+              )\b''',
+             Name.Builtin),
+            (r'\.|,|:=|;|=|\+|-|\*|/|\^|>|<', Operator),
+            (r'''(?x)\b(?:
+                and|or|not|mod|in
+              )\b''',
+             Operator.Word),
+            (r'''(?x)
+              (?:\w+|`[^`]*`)
+              (?:::\w+|`[^`]*`)*''', Name.Variable),
+            (r'[0-9]+(?:\.[0-9]*)?(?:e[0-9]+)?', Number),
+            (r'\.[0-9]+(?:e[0-9]+)?', Number),
+            (r'.', Text)
+        ],
+    }
+
+
+class MathematicaLexer(RegexLexer):
+    """
+    Lexer for `Mathematica <http://www.wolfram.com/mathematica/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Mathematica'
+    aliases = ['mathematica', 'mma', 'nb']
+    filenames = ['*.nb', '*.cdf', '*.nbp', '*.ma']
+    mimetypes = ['application/mathematica',
+                 'application/vnd.wolfram.mathematica',
+                 'application/vnd.wolfram.mathematica.package',
+                 'application/vnd.wolfram.cdf']
+
+    # http://reference.wolfram.com/mathematica/guide/Syntax.html
+    operators = (
+        ";;", "=", "=.", "!=" "==", ":=", "->", ":>", "/.", "+", "-", "*", "/",
+        "^", "&&", "||", "!", "<>", "|", "/;", "?", "@", "//", "/@", "@@",
+        "@@@", "~~", "===", "&", "<", ">", "<=", ">=",
+    )
+
+    punctuation = (",", ";", "(", ")", "[", "]", "{", "}")
+
+    def _multi_escape(entries):
+        return '(%s)' % ('|'.join(re.escape(entry) for entry in entries))
+
+    tokens = {
+        'root': [
+            (r'(?s)\(\*.*?\*\)', Comment),
+
+            (r'([a-zA-Z]+[A-Za-z0-9]*`)', Name.Namespace),
+            (r'([A-Za-z0-9]*_+[A-Za-z0-9]*)', Name.Variable),
+            (r'#\d*', Name.Variable),
+            (r'([a-zA-Z]+[a-zA-Z0-9]*)', Name),
+
+            (r'-?\d+\.\d*', Number.Float),
+            (r'-?\d*\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+
+            (words(operators), Operator),
+            (words(punctuation), Punctuation),
+            (r'".*?"', String),
+            (r'\s+', Text.Whitespace),
+        ],
+    }
+
+
+class MuPADLexer(RegexLexer):
+    """
+    A `MuPAD <http://www.mupad.com>`_ lexer.
+    Contributed by Christopher Creutzig <christopher@creutzig.de>.
+
+    .. versionadded:: 0.8
+    """
+    name = 'MuPAD'
+    aliases = ['mupad']
+    filenames = ['*.mu']
+
+    tokens = {
+        'root': [
+            (r'//.*?$', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'\(|\)|\[|\]|\{|\}', Punctuation),
+            (r'''(?x)\b(?:
+                next|break|end|
+                axiom|end_axiom|category|end_category|domain|end_domain|inherits|
+                if|%if|then|elif|else|end_if|
+                case|of|do|otherwise|end_case|
+                while|end_while|
+                repeat|until|end_repeat|
+                for|from|to|downto|step|end_for|
+                proc|local|option|save|begin|end_proc|
+                delete|frame
+              )\b''', Keyword),
+            (r'''(?x)\b(?:
+                DOM_ARRAY|DOM_BOOL|DOM_COMPLEX|DOM_DOMAIN|DOM_EXEC|DOM_EXPR|
+                DOM_FAIL|DOM_FLOAT|DOM_FRAME|DOM_FUNC_ENV|DOM_HFARRAY|DOM_IDENT|
+                DOM_INT|DOM_INTERVAL|DOM_LIST|DOM_NIL|DOM_NULL|DOM_POLY|DOM_PROC|
+                DOM_PROC_ENV|DOM_RAT|DOM_SET|DOM_STRING|DOM_TABLE|DOM_VAR
+              )\b''', Name.Class),
+            (r'''(?x)\b(?:
+                PI|EULER|E|CATALAN|
+                NIL|FAIL|undefined|infinity|
+                TRUE|FALSE|UNKNOWN
+              )\b''',
+             Name.Constant),
+            (r'\b(?:dom|procname)\b', Name.Builtin.Pseudo),
+            (r'\.|,|:|;|=|\+|-|\*|/|\^|@|>|<|\$|\||!|\'|%|~=', Operator),
+            (r'''(?x)\b(?:
+                and|or|not|xor|
+                assuming|
+                div|mod|
+                union|minus|intersect|in|subset
+              )\b''',
+             Operator.Word),
+            (r'\b(?:I|RDN_INF|RD_NINF|RD_NAN)\b', Number),
+            # (r'\b(?:adt|linalg|newDomain|hold)\b', Name.Builtin),
+            (r'''(?x)
+              ((?:[a-zA-Z_#][\w#]*|`[^`]*`)
+              (?:::[a-zA-Z_#][\w#]*|`[^`]*`)*)(\s*)([(])''',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'''(?x)
+              (?:[a-zA-Z_#][\w#]*|`[^`]*`)
+              (?:::[a-zA-Z_#][\w#]*|`[^`]*`)*''', Name.Variable),
+            (r'[0-9]+(?:\.[0-9]*)?(?:e[0-9]+)?', Number),
+            (r'\.[0-9]+(?:e[0-9]+)?', Number),
+            (r'.', Text)
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
+
+
+class BCLexer(RegexLexer):
+    """
+    A `BC <https://www.gnu.org/software/bc/>`_ lexer.
+
+    .. versionadded:: 2.1
+    """
+    name = 'BC'
+    aliases = ['bc']
+    filenames = ['*.bc']
+
+    tokens = {
+        'root': [
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'[{}();,]', Punctuation),
+            (words(('if', 'else', 'while', 'for', 'break', 'continue',
+                    'halt', 'return', 'define', 'auto', 'print', 'read',
+                    'length', 'scale', 'sqrt', 'limits', 'quit',
+                    'warranty'), suffix=r'\b'), Keyword),
+            (r'\+\+|--|\|\||&&|'
+             r'([-<>+*%\^/!=])=?', Operator),
+            # bc doesn't support exponential
+            (r'[0-9]+(\.[0-9]*)?', Number),
+            (r'\.[0-9]+', Number),
+            (r'.', Text)
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/r.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/r.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/r.py	(revision 1126)
@@ -0,0 +1,453 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.r
+    ~~~~~~~~~~~~~~~~~
+
+    Lexers for the R/S languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, words, do_insertions
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic
+
+__all__ = ['RConsoleLexer', 'SLexer', 'RdLexer']
+
+
+line_re  = re.compile('.*?\n')
+
+
+class RConsoleLexer(Lexer):
+    """
+    For R console transcripts or R CMD BATCH output files.
+    """
+
+    name = 'RConsole'
+    aliases = ['rconsole', 'rout']
+    filenames = ['*.Rout']
+
+    def get_tokens_unprocessed(self, text):
+        slexer = SLexer(**self.options)
+
+        current_code_block = ''
+        insertions = []
+
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith('>') or line.startswith('+'):
+                # Colorize the prompt as such,
+                # then put rest of line into current_code_block
+                insertions.append((len(current_code_block),
+                                   [(0, Generic.Prompt, line[:2])]))
+                current_code_block += line[2:]
+            else:
+                # We have reached a non-prompt line!
+                # If we have stored prompt lines, need to process them first.
+                if current_code_block:
+                    # Weave together the prompts and highlight code.
+                    for item in do_insertions(
+                            insertions, slexer.get_tokens_unprocessed(current_code_block)):
+                        yield item
+                    # Reset vars for next code block.
+                    current_code_block = ''
+                    insertions = []
+                # Now process the actual line itself, this is output from R.
+                yield match.start(), Generic.Output, line
+
+        # If we happen to end on a code block with nothing after it, need to
+        # process the last code block. This is neither elegant nor DRY so
+        # should be changed.
+        if current_code_block:
+            for item in do_insertions(
+                    insertions, slexer.get_tokens_unprocessed(current_code_block)):
+                yield item
+
+
+class SLexer(RegexLexer):
+    """
+    For S, S-plus, and R source code.
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'S'
+    aliases = ['splus', 's', 'r']
+    filenames = ['*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron']
+    mimetypes = ['text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r',
+                 'text/x-R', 'text/x-r-history', 'text/x-r-profile']
+
+    builtins_base = (
+        'Arg', 'Conj', 'Cstack_info', 'Encoding', 'FALSE',
+        'Filter', 'Find', 'I', 'ISOdate', 'ISOdatetime', 'Im', 'Inf',
+        'La.svd', 'Map', 'Math.Date', 'Math.POSIXt', 'Math.data.frame',
+        'Math.difftime', 'Math.factor', 'Mod', 'NA_character_',
+        'NA_complex_', 'NA_real_', 'NCOL', 'NROW', 'NULLNA_integer_', 'NaN',
+        'Negate', 'NextMethod', 'Ops.Date', 'Ops.POSIXt', 'Ops.data.frame',
+        'Ops.difftime', 'Ops.factor', 'Ops.numeric_version', 'Ops.ordered',
+        'Position', 'R.Version', 'R.home', 'R.version', 'R.version.string',
+        'RNGkind', 'RNGversion', 'R_system_version', 'Re', 'Recall',
+        'Reduce', 'Summary.Date', 'Summary.POSIXct', 'Summary.POSIXlt',
+        'Summary.data.frame', 'Summary.difftime', 'Summary.factor',
+        'Summary.numeric_version', 'Summary.ordered', 'Sys.Date',
+        'Sys.chmod', 'Sys.getenv', 'Sys.getlocale', 'Sys.getpid',
+        'Sys.glob', 'Sys.info', 'Sys.localeconv', 'Sys.readlink',
+        'Sys.setFileTime', 'Sys.setenv', 'Sys.setlocale', 'Sys.sleep',
+        'Sys.time', 'Sys.timezone', 'Sys.umask', 'Sys.unsetenv',
+        'Sys.which', 'TRUE', 'UseMethod', 'Vectorize', 'abbreviate', 'abs',
+        'acos', 'acosh', 'addNA', 'addTaskCallback', 'agrep', 'alist',
+        'all', 'all.equal', 'all.equal.POSIXct', 'all.equal.character',
+        'all.equal.default', 'all.equal.factor', 'all.equal.formula',
+        'all.equal.language', 'all.equal.list', 'all.equal.numeric',
+        'all.equal.raw', 'all.names', 'all.vars', 'any', 'anyDuplicated',
+        'anyDuplicated.array', 'anyDuplicated.data.frame',
+        'anyDuplicated.default', 'anyDuplicated.matrix', 'aperm',
+        'aperm.default', 'aperm.table', 'append', 'apply', 'args',
+        'arrayInd', 'as.Date', 'as.Date.POSIXct', 'as.Date.POSIXlt',
+        'as.Date.character', 'as.Date.date', 'as.Date.dates',
+        'as.Date.default', 'as.Date.factor', 'as.Date.numeric',
+        'as.POSIXct', 'as.POSIXct.Date', 'as.POSIXct.POSIXlt',
+        'as.POSIXct.date', 'as.POSIXct.dates', 'as.POSIXct.default',
+        'as.POSIXct.numeric', 'as.POSIXlt', 'as.POSIXlt.Date',
+        'as.POSIXlt.POSIXct', 'as.POSIXlt.character', 'as.POSIXlt.date',
+        'as.POSIXlt.dates', 'as.POSIXlt.default', 'as.POSIXlt.factor',
+        'as.POSIXlt.numeric', 'as.array', 'as.array.default', 'as.call',
+        'as.character', 'as.character.Date', 'as.character.POSIXt',
+        'as.character.condition', 'as.character.default',
+        'as.character.error', 'as.character.factor', 'as.character.hexmode',
+        'as.character.numeric_version', 'as.character.octmode',
+        'as.character.srcref', 'as.complex', 'as.data.frame',
+        'as.data.frame.AsIs', 'as.data.frame.Date', 'as.data.frame.POSIXct',
+        'as.data.frame.POSIXlt', 'as.data.frame.array',
+        'as.data.frame.character', 'as.data.frame.complex',
+        'as.data.frame.data.frame', 'as.data.frame.default',
+        'as.data.frame.difftime', 'as.data.frame.factor',
+        'as.data.frame.integer', 'as.data.frame.list',
+        'as.data.frame.logical', 'as.data.frame.matrix',
+        'as.data.frame.model.matrix', 'as.data.frame.numeric',
+        'as.data.frame.numeric_version', 'as.data.frame.ordered',
+        'as.data.frame.raw', 'as.data.frame.table', 'as.data.frame.ts',
+        'as.data.frame.vector', 'as.difftime', 'as.double',
+        'as.double.POSIXlt', 'as.double.difftime', 'as.environment',
+        'as.expression', 'as.expression.default', 'as.factor',
+        'as.function', 'as.function.default', 'as.hexmode', 'as.integer',
+        'as.list', 'as.list.Date', 'as.list.POSIXct', 'as.list.data.frame',
+        'as.list.default', 'as.list.environment', 'as.list.factor',
+        'as.list.function', 'as.list.numeric_version', 'as.logical',
+        'as.logical.factor', 'as.matrix', 'as.matrix.POSIXlt',
+        'as.matrix.data.frame', 'as.matrix.default', 'as.matrix.noquote',
+        'as.name', 'as.null', 'as.null.default', 'as.numeric',
+        'as.numeric_version', 'as.octmode', 'as.ordered',
+        'as.package_version', 'as.pairlist', 'as.qr', 'as.raw', 'as.single',
+        'as.single.default', 'as.symbol', 'as.table', 'as.table.default',
+        'as.vector', 'as.vector.factor', 'asNamespace', 'asS3', 'asS4',
+        'asin', 'asinh', 'assign', 'atan', 'atan2', 'atanh',
+        'attachNamespace', 'attr', 'attr.all.equal', 'attributes',
+        'autoload', 'autoloader', 'backsolve', 'baseenv', 'basename',
+        'besselI', 'besselJ', 'besselK', 'besselY', 'beta',
+        'bindingIsActive', 'bindingIsLocked', 'bindtextdomain', 'bitwAnd',
+        'bitwNot', 'bitwOr', 'bitwShiftL', 'bitwShiftR', 'bitwXor', 'body',
+        'bquote', 'browser', 'browserCondition', 'browserSetDebug',
+        'browserText', 'builtins', 'by', 'by.data.frame', 'by.default',
+        'bzfile', 'c.Date', 'c.POSIXct', 'c.POSIXlt', 'c.noquote',
+        'c.numeric_version', 'call', 'callCC', 'capabilities', 'casefold',
+        'cat', 'category', 'cbind', 'cbind.data.frame', 'ceiling',
+        'char.expand', 'charToRaw', 'charmatch', 'chartr', 'check_tzones',
+        'chol', 'chol.default', 'chol2inv', 'choose', 'class',
+        'clearPushBack', 'close', 'close.connection', 'close.srcfile',
+        'close.srcfilealias', 'closeAllConnections', 'col', 'colMeans',
+        'colSums', 'colnames', 'commandArgs', 'comment', 'computeRestarts',
+        'conditionCall', 'conditionCall.condition', 'conditionMessage',
+        'conditionMessage.condition', 'conflicts', 'contributors', 'cos',
+        'cosh', 'crossprod', 'cummax', 'cummin', 'cumprod', 'cumsum', 'cut',
+        'cut.Date', 'cut.POSIXt', 'cut.default', 'dQuote', 'data.class',
+        'data.matrix', 'date', 'debug', 'debugonce',
+        'default.stringsAsFactors', 'delayedAssign', 'deparse', 'det',
+        'determinant', 'determinant.matrix', 'dget', 'diag', 'diff',
+        'diff.Date', 'diff.POSIXt', 'diff.default', 'difftime', 'digamma',
+        'dim', 'dim.data.frame', 'dimnames', 'dimnames.data.frame', 'dir',
+        'dir.create', 'dirname', 'do.call', 'dput', 'drop', 'droplevels',
+        'droplevels.data.frame', 'droplevels.factor', 'dump', 'duplicated',
+        'duplicated.POSIXlt', 'duplicated.array', 'duplicated.data.frame',
+        'duplicated.default', 'duplicated.matrix',
+        'duplicated.numeric_version', 'dyn.load', 'dyn.unload', 'eapply',
+        'eigen', 'else', 'emptyenv', 'enc2native', 'enc2utf8',
+        'encodeString', 'enquote', 'env.profile', 'environment',
+        'environmentIsLocked', 'environmentName', 'eval', 'eval.parent',
+        'evalq', 'exists', 'exp', 'expand.grid', 'expm1', 'expression',
+        'factor', 'factorial', 'fifo', 'file', 'file.access', 'file.append',
+        'file.choose', 'file.copy', 'file.create', 'file.exists',
+        'file.info', 'file.link', 'file.path', 'file.remove', 'file.rename',
+        'file.show', 'file.symlink', 'find.package', 'findInterval',
+        'findPackageEnv', 'findRestart', 'floor', 'flush',
+        'flush.connection', 'force', 'formals', 'format',
+        'format.AsIs', 'format.Date', 'format.POSIXct', 'format.POSIXlt',
+        'format.data.frame', 'format.default', 'format.difftime',
+        'format.factor', 'format.hexmode', 'format.info',
+        'format.libraryIQR', 'format.numeric_version', 'format.octmode',
+        'format.packageInfo', 'format.pval', 'format.summaryDefault',
+        'formatC', 'formatDL', 'forwardsolve', 'gamma', 'gc', 'gc.time',
+        'gcinfo', 'gctorture', 'gctorture2', 'get', 'getAllConnections',
+        'getCallingDLL', 'getCallingDLLe', 'getConnection',
+        'getDLLRegisteredRoutines', 'getDLLRegisteredRoutines.DLLInfo',
+        'getDLLRegisteredRoutines.character', 'getElement',
+        'getExportedValue', 'getHook', 'getLoadedDLLs', 'getNamespace',
+        'getNamespaceExports', 'getNamespaceImports', 'getNamespaceInfo',
+        'getNamespaceName', 'getNamespaceUsers', 'getNamespaceVersion',
+        'getNativeSymbolInfo', 'getOption', 'getRversion', 'getSrcLines',
+        'getTaskCallbackNames', 'geterrmessage', 'gettext', 'gettextf',
+        'getwd', 'gl', 'globalenv', 'gregexpr', 'grep', 'grepRaw', 'grepl',
+        'gsub', 'gzcon', 'gzfile', 'head', 'iconv', 'iconvlist',
+        'icuSetCollate', 'identical', 'identity', 'ifelse', 'importIntoEnv',
+        'in', 'inherits', 'intToBits', 'intToUtf8', 'interaction', 'interactive',
+        'intersect', 'inverse.rle', 'invisible', 'invokeRestart',
+        'invokeRestartInteractively', 'is.R', 'is.array', 'is.atomic',
+        'is.call', 'is.character', 'is.complex', 'is.data.frame',
+        'is.double', 'is.element', 'is.environment', 'is.expression',
+        'is.factor', 'is.finite', 'is.function', 'is.infinite',
+        'is.integer', 'is.language', 'is.list', 'is.loaded', 'is.logical',
+        'is.matrix', 'is.na', 'is.na.POSIXlt', 'is.na.data.frame',
+        'is.na.numeric_version', 'is.name', 'is.nan', 'is.null',
+        'is.numeric', 'is.numeric.Date', 'is.numeric.POSIXt',
+        'is.numeric.difftime', 'is.numeric_version', 'is.object',
+        'is.ordered', 'is.package_version', 'is.pairlist', 'is.primitive',
+        'is.qr', 'is.raw', 'is.recursive', 'is.single', 'is.symbol',
+        'is.table', 'is.unsorted', 'is.vector', 'isBaseNamespace',
+        'isIncomplete', 'isNamespace', 'isOpen', 'isRestart', 'isS4',
+        'isSeekable', 'isSymmetric', 'isSymmetric.matrix', 'isTRUE',
+        'isatty', 'isdebugged', 'jitter', 'julian', 'julian.Date',
+        'julian.POSIXt', 'kappa', 'kappa.default', 'kappa.lm', 'kappa.qr',
+        'kronecker', 'l10n_info', 'labels', 'labels.default', 'lapply',
+        'lazyLoad', 'lazyLoadDBexec', 'lazyLoadDBfetch', 'lbeta', 'lchoose',
+        'length', 'length.POSIXlt', 'letters', 'levels', 'levels.default',
+        'lfactorial', 'lgamma', 'library.dynam', 'library.dynam.unload',
+        'licence', 'license', 'list.dirs', 'list.files', 'list2env', 'load',
+        'loadNamespace', 'loadedNamespaces', 'loadingNamespaceInfo',
+        'local', 'lockBinding', 'lockEnvironment', 'log', 'log10', 'log1p',
+        'log2', 'logb', 'lower.tri', 'ls', 'make.names', 'make.unique',
+        'makeActiveBinding', 'mapply', 'margin.table', 'mat.or.vec',
+        'match', 'match.arg', 'match.call', 'match.fun', 'max', 'max.col',
+        'mean', 'mean.Date', 'mean.POSIXct', 'mean.POSIXlt', 'mean.default',
+        'mean.difftime', 'mem.limits', 'memCompress', 'memDecompress',
+        'memory.profile', 'merge', 'merge.data.frame', 'merge.default',
+        'message', 'mget', 'min', 'missing', 'mode', 'month.abb',
+        'month.name', 'months', 'months.Date', 'months.POSIXt',
+        'months.abb', 'months.nameletters', 'names', 'names.POSIXlt',
+        'namespaceExport', 'namespaceImport', 'namespaceImportClasses',
+        'namespaceImportFrom', 'namespaceImportMethods', 'nargs', 'nchar',
+        'ncol', 'new.env', 'ngettext', 'nlevels', 'noquote', 'norm',
+        'normalizePath', 'nrow', 'numeric_version', 'nzchar', 'objects',
+        'oldClass', 'on.exit', 'open', 'open.connection', 'open.srcfile',
+        'open.srcfilealias', 'open.srcfilecopy', 'options', 'order',
+        'ordered', 'outer', 'packBits', 'packageEvent',
+        'packageHasNamespace', 'packageStartupMessage', 'package_version',
+        'pairlist', 'parent.env', 'parent.frame', 'parse',
+        'parseNamespaceFile', 'paste', 'paste0', 'path.expand',
+        'path.package', 'pipe', 'pmatch', 'pmax', 'pmax.int', 'pmin',
+        'pmin.int', 'polyroot', 'pos.to.env', 'pretty', 'pretty.default',
+        'prettyNum', 'print', 'print.AsIs', 'print.DLLInfo',
+        'print.DLLInfoList', 'print.DLLRegisteredRoutines', 'print.Date',
+        'print.NativeRoutineList', 'print.POSIXct', 'print.POSIXlt',
+        'print.by', 'print.condition', 'print.connection',
+        'print.data.frame', 'print.default', 'print.difftime',
+        'print.factor', 'print.function', 'print.hexmode',
+        'print.libraryIQR', 'print.listof', 'print.noquote',
+        'print.numeric_version', 'print.octmode', 'print.packageInfo',
+        'print.proc_time', 'print.restart', 'print.rle',
+        'print.simple.list', 'print.srcfile', 'print.srcref',
+        'print.summary.table', 'print.summaryDefault', 'print.table',
+        'print.warnings', 'prmatrix', 'proc.time', 'prod', 'prop.table',
+        'provideDimnames', 'psigamma', 'pushBack', 'pushBackLength', 'q',
+        'qr', 'qr.Q', 'qr.R', 'qr.X', 'qr.coef', 'qr.default', 'qr.fitted',
+        'qr.qty', 'qr.qy', 'qr.resid', 'qr.solve', 'quarters',
+        'quarters.Date', 'quarters.POSIXt', 'quit', 'quote', 'range',
+        'range.default', 'rank', 'rapply', 'raw', 'rawConnection',
+        'rawConnectionValue', 'rawShift', 'rawToBits', 'rawToChar', 'rbind',
+        'rbind.data.frame', 'rcond', 'read.dcf', 'readBin', 'readChar',
+        'readLines', 'readRDS', 'readRenviron', 'readline', 'reg.finalizer',
+        'regexec', 'regexpr', 'registerS3method', 'registerS3methods',
+        'regmatches', 'remove', 'removeTaskCallback', 'rep', 'rep.Date',
+        'rep.POSIXct', 'rep.POSIXlt', 'rep.factor', 'rep.int',
+        'rep.numeric_version', 'rep_len', 'replace', 'replicate',
+        'requireNamespace', 'restartDescription', 'restartFormals',
+        'retracemem', 'rev', 'rev.default', 'rle', 'rm', 'round',
+        'round.Date', 'round.POSIXt', 'row', 'row.names',
+        'row.names.data.frame', 'row.names.default', 'rowMeans', 'rowSums',
+        'rownames', 'rowsum', 'rowsum.data.frame', 'rowsum.default',
+        'sQuote', 'sample', 'sample.int', 'sapply', 'save', 'save.image',
+        'saveRDS', 'scale', 'scale.default', 'scan', 'search',
+        'searchpaths', 'seek', 'seek.connection', 'seq', 'seq.Date',
+        'seq.POSIXt', 'seq.default', 'seq.int', 'seq_along', 'seq_len',
+        'sequence', 'serialize', 'set.seed', 'setHook', 'setNamespaceInfo',
+        'setSessionTimeLimit', 'setTimeLimit', 'setdiff', 'setequal',
+        'setwd', 'shQuote', 'showConnections', 'sign', 'signalCondition',
+        'signif', 'simpleCondition', 'simpleError', 'simpleMessage',
+        'simpleWarning', 'simplify2array', 'sin', 'single',
+        'sinh', 'sink', 'sink.number', 'slice.index', 'socketConnection',
+        'socketSelect', 'solve', 'solve.default', 'solve.qr', 'sort',
+        'sort.POSIXlt', 'sort.default', 'sort.int', 'sort.list', 'split',
+        'split.Date', 'split.POSIXct', 'split.data.frame', 'split.default',
+        'sprintf', 'sqrt', 'srcfile', 'srcfilealias', 'srcfilecopy',
+        'srcref', 'standardGeneric', 'stderr', 'stdin', 'stdout', 'stop',
+        'stopifnot', 'storage.mode', 'strftime', 'strptime', 'strsplit',
+        'strtoi', 'strtrim', 'structure', 'strwrap', 'sub', 'subset',
+        'subset.data.frame', 'subset.default', 'subset.matrix',
+        'substitute', 'substr', 'substring', 'sum', 'summary',
+        'summary.Date', 'summary.POSIXct', 'summary.POSIXlt',
+        'summary.connection', 'summary.data.frame', 'summary.default',
+        'summary.factor', 'summary.matrix', 'summary.proc_time',
+        'summary.srcfile', 'summary.srcref', 'summary.table',
+        'suppressMessages', 'suppressPackageStartupMessages',
+        'suppressWarnings', 'svd', 'sweep', 'sys.call', 'sys.calls',
+        'sys.frame', 'sys.frames', 'sys.function', 'sys.load.image',
+        'sys.nframe', 'sys.on.exit', 'sys.parent', 'sys.parents',
+        'sys.save.image', 'sys.source', 'sys.status', 'system',
+        'system.file', 'system.time', 'system2', 't', 't.data.frame',
+        't.default', 'table', 'tabulate', 'tail', 'tan', 'tanh', 'tapply',
+        'taskCallbackManager', 'tcrossprod', 'tempdir', 'tempfile',
+        'testPlatformEquivalence', 'textConnection', 'textConnectionValue',
+        'toString', 'toString.default', 'tolower', 'topenv', 'toupper',
+        'trace', 'traceback', 'tracemem', 'tracingState', 'transform',
+        'transform.data.frame', 'transform.default', 'trigamma', 'trunc',
+        'trunc.Date', 'trunc.POSIXt', 'truncate', 'truncate.connection',
+        'try', 'tryCatch', 'typeof', 'unclass', 'undebug', 'union',
+        'unique', 'unique.POSIXlt', 'unique.array', 'unique.data.frame',
+        'unique.default', 'unique.matrix', 'unique.numeric_version',
+        'units', 'units.difftime', 'unix.time', 'unlink', 'unlist',
+        'unloadNamespace', 'unlockBinding', 'unname', 'unserialize',
+        'unsplit', 'untrace', 'untracemem', 'unz', 'upper.tri', 'url',
+        'utf8ToInt', 'vapply', 'version', 'warning', 'warnings', 'weekdays',
+        'weekdays.Date', 'weekdays.POSIXt', 'which', 'which.max',
+        'which.min', 'with', 'with.default', 'withCallingHandlers',
+        'withRestarts', 'withVisible', 'within', 'within.data.frame',
+        'within.list', 'write', 'write.dcf', 'writeBin', 'writeChar',
+        'writeLines', 'xor', 'xor.hexmode', 'xor.octmode',
+        'xpdrows.data.frame', 'xtfrm', 'xtfrm.AsIs', 'xtfrm.Date',
+        'xtfrm.POSIXct', 'xtfrm.POSIXlt', 'xtfrm.Surv', 'xtfrm.default',
+        'xtfrm.difftime', 'xtfrm.factor', 'xtfrm.numeric_version', 'xzfile',
+        'zapsmall'
+    )
+
+    tokens = {
+        'comments': [
+            (r'#.*$', Comment.Single),
+        ],
+        'valid_name': [
+            (r'[a-zA-Z][\w.]*', Text),
+            # can begin with ., but not if that is followed by a digit
+            (r'\.[a-zA-Z_][\w.]*', Text),
+        ],
+        'punctuation': [
+            (r'\[{1,2}|\]{1,2}|\(|\)|;|,', Punctuation),
+        ],
+        'keywords': [
+            (words(builtins_base, suffix=r'(?![\w. =])'),
+             Keyword.Pseudo),
+            (r'(if|else|for|while|repeat|in|next|break|return|switch|function)'
+             r'(?![\w.])',
+             Keyword.Reserved),
+            (r'(array|category|character|complex|double|function|integer|list|'
+             r'logical|matrix|numeric|vector|data.frame|c)'
+             r'(?![\w.])',
+             Keyword.Type),
+            (r'(library|require|attach|detach|source)'
+             r'(?![\w.])',
+             Keyword.Namespace)
+        ],
+        'operators': [
+            (r'<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\?', Operator),
+            (r'\*|\+|\^|/|!|%[^%]*%|=|~|\$|@|:{1,3}', Operator)
+        ],
+        'builtin_symbols': [
+            (r'(NULL|NA(_(integer|real|complex|character)_)?|'
+             r'letters|LETTERS|Inf|TRUE|FALSE|NaN|pi|\.\.(\.|[0-9]+))'
+             r'(?![\w.])',
+             Keyword.Constant),
+            (r'(T|F)\b', Name.Builtin.Pseudo),
+        ],
+        'numbers': [
+            # hex number
+            (r'0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?', Number.Hex),
+            # decimal number
+            (r'[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)([eE][+-]?[0-9]+)?[Li]?',
+             Number),
+        ],
+        'statements': [
+            include('comments'),
+            # whitespaces
+            (r'\s+', Text),
+            (r'`.*?`', String.Backtick),
+            (r'\'', String, 'string_squote'),
+            (r'\"', String, 'string_dquote'),
+            include('builtin_symbols'),
+            include('numbers'),
+            include('keywords'),
+            include('punctuation'),
+            include('operators'),
+            include('valid_name'),
+        ],
+        'root': [
+            include('statements'),
+            # blocks:
+            (r'\{|\}', Punctuation),
+            # (r'\{', Punctuation, 'block'),
+            (r'.', Text),
+        ],
+        # 'block': [
+        #    include('statements'),
+        #    ('\{', Punctuation, '#push'),
+        #    ('\}', Punctuation, '#pop')
+        # ],
+        'string_squote': [
+            (r'([^\'\\]|\\.)*\'', String, '#pop'),
+        ],
+        'string_dquote': [
+            (r'([^"\\]|\\.)*"', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search(r'[a-z0-9_\])\s]<-(?!-)', text):
+            return 0.11
+
+
+class RdLexer(RegexLexer):
+    """
+    Pygments Lexer for R documentation (Rd) files
+
+    This is a very minimal implementation, highlighting little more
+    than the macros. A description of Rd syntax is found in `Writing R
+    Extensions <http://cran.r-project.org/doc/manuals/R-exts.html>`_
+    and `Parsing Rd files <developer.r-project.org/parseRd.pdf>`_.
+
+    .. versionadded:: 1.6
+    """
+    name = 'Rd'
+    aliases = ['rd']
+    filenames = ['*.Rd']
+    mimetypes = ['text/x-r-doc']
+
+    # To account for verbatim / LaTeX-like / and R-like areas
+    # would require parsing.
+    tokens = {
+        'root': [
+            # catch escaped brackets and percent sign
+            (r'\\[\\{}%]', String.Escape),
+            # comments
+            (r'%.*$', Comment),
+            # special macros with no arguments
+            (r'\\(?:cr|l?dots|R|tab)\b', Keyword.Constant),
+            # macros
+            (r'\\[a-zA-Z]+\b', Keyword),
+            # special preprocessor macros
+            (r'^\s*#(?:ifn?def|endif).*\b', Comment.Preproc),
+            # non-escaped brackets
+            (r'[{}]', Name.Builtin),
+            # everything else
+            (r'[^\\%\n{}]+', Text),
+            (r'.', Text),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/scripting.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/scripting.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/scripting.py	(revision 1126)
@@ -0,0 +1,1222 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.scripting
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for scripting and embedded languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, combined, \
+    words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Whitespace, Other
+from pygments.util import get_bool_opt, get_list_opt, iteritems
+
+__all__ = ['LuaLexer', 'MoonScriptLexer', 'ChaiscriptLexer', 'LSLLexer',
+           'AppleScriptLexer', 'RexxLexer', 'MOOCodeLexer', 'HybrisLexer',
+           'EasytrieveLexer', 'JclLexer']
+
+
+class LuaLexer(RegexLexer):
+    """
+    For `Lua <http://www.lua.org>`_ source code.
+
+    Additional options accepted:
+
+    `func_name_highlighting`
+        If given and ``True``, highlight builtin function names
+        (default: ``True``).
+    `disabled_modules`
+        If given, must be a list of module names whose function names
+        should not be highlighted. By default all modules are highlighted.
+
+        To get a list of allowed modules have a look into the
+        `_lua_builtins` module:
+
+        .. sourcecode:: pycon
+
+            >>> from pygments.lexers._lua_builtins import MODULES
+            >>> MODULES.keys()
+            ['string', 'coroutine', 'modules', 'io', 'basic', ...]
+    """
+
+    name = 'Lua'
+    aliases = ['lua']
+    filenames = ['*.lua', '*.wlua']
+    mimetypes = ['text/x-lua', 'application/x-lua']
+
+    _comment_multiline = r'(?:--\[(?P<level>=*)\[[\w\W]*?\](?P=level)\])'
+    _comment_single = r'(?:--.*$)'
+    _space = r'(?:\s+)'
+    _s = r'(?:%s|%s|%s)' % (_comment_multiline, _comment_single, _space)
+    _name = r'(?:[^\W\d]\w*)'
+
+    tokens = {
+        'root': [
+            # Lua allows a file to start with a shebang.
+            (r'#!.*', Comment.Preproc),
+            default('base'),
+        ],
+        'ws': [
+            (_comment_multiline, Comment.Multiline),
+            (_comment_single, Comment.Single),
+            (_space, Text),
+        ],
+        'base': [
+            include('ws'),
+
+            (r'(?i)0x[\da-f]*(\.[\da-f]*)?(p[+-]?\d+)?', Number.Hex),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float),
+            (r'(?i)\d+e[+-]?\d+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            # multiline strings
+            (r'(?s)\[(=*)\[.*?\]\1\]', String),
+
+            (r'::', Punctuation, 'label'),
+            (r'\.{3}', Punctuation),
+            (r'[=<>|~&+\-*/%#^]+|\.\.', Operator),
+            (r'[\[\]{}().,:;]', Punctuation),
+            (r'(and|or|not)\b', Operator.Word),
+
+            ('(break|do|else|elseif|end|for|if|in|repeat|return|then|until|'
+             r'while)\b', Keyword.Reserved),
+            (r'goto\b', Keyword.Reserved, 'goto'),
+            (r'(local)\b', Keyword.Declaration),
+            (r'(true|false|nil)\b', Keyword.Constant),
+
+            (r'(function)\b', Keyword.Reserved, 'funcname'),
+
+            (r'[A-Za-z_]\w*(\.[A-Za-z_]\w*)?', Name),
+
+            ("'", String.Single, combined('stringescape', 'sqs')),
+            ('"', String.Double, combined('stringescape', 'dqs'))
+        ],
+
+        'funcname': [
+            include('ws'),
+            (r'[.:]', Punctuation),
+            (r'%s(?=%s*[.:])' % (_name, _s), Name.Class),
+            (_name, Name.Function, '#pop'),
+            # inline function
+            ('\(', Punctuation, '#pop'),
+        ],
+
+        'goto': [
+            include('ws'),
+            (_name, Name.Label, '#pop'),
+        ],
+
+        'label': [
+            include('ws'),
+            (r'::', Punctuation, '#pop'),
+            (_name, Name.Label),
+        ],
+
+        'stringescape': [
+            (r'\\([abfnrtv\\"\']|[\r\n]{1,2}|z\s*|x[0-9a-fA-F]{2}|\d{1,3}|'
+             r'u\{[0-9a-fA-F]+\})', String.Escape),
+        ],
+
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"[^\\']+", String.Single),
+        ],
+
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'[^\\"]+', String.Double),
+        ]
+    }
+
+    def __init__(self, **options):
+        self.func_name_highlighting = get_bool_opt(
+            options, 'func_name_highlighting', True)
+        self.disabled_modules = get_list_opt(options, 'disabled_modules', [])
+
+        self._functions = set()
+        if self.func_name_highlighting:
+            from pygments.lexers._lua_builtins import MODULES
+            for mod, func in iteritems(MODULES):
+                if mod not in self.disabled_modules:
+                    self._functions.update(func)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                if value in self._functions:
+                    yield index, Name.Builtin, value
+                    continue
+                elif '.' in value:
+                    a, b = value.split('.')
+                    yield index, Name, a
+                    yield index + len(a), Punctuation, u'.'
+                    yield index + len(a) + 1, Name, b
+                    continue
+            yield index, token, value
+
+
+class MoonScriptLexer(LuaLexer):
+    """
+    For `MoonScript <http://moonscript.org>`_ source code.
+
+    .. versionadded:: 1.5
+    """
+
+    name = "MoonScript"
+    aliases = ["moon", "moonscript"]
+    filenames = ["*.moon"]
+    mimetypes = ['text/x-moonscript', 'application/x-moonscript']
+
+    tokens = {
+        'root': [
+            (r'#!(.*?)$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            ('--.*$', Comment.Single),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float),
+            (r'(?i)\d+e[+-]?\d+', Number.Float),
+            (r'(?i)0x[0-9a-f]*', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'(?s)\[(=*)\[.*?\]\1\]', String),
+            (r'(->|=>)', Name.Function),
+            (r':[a-zA-Z_]\w*', Name.Variable),
+            (r'(==|!=|~=|<=|>=|\.\.\.|\.\.|[=+\-*/%^<>#!.\\:])', Operator),
+            (r'[;,]', Punctuation),
+            (r'[\[\]{}()]', Keyword.Type),
+            (r'[a-zA-Z_]\w*:', Name.Variable),
+            (words((
+                'class', 'extends', 'if', 'then', 'super', 'do', 'with',
+                'import', 'export', 'while', 'elseif', 'return', 'for', 'in',
+                'from', 'when', 'using', 'else', 'and', 'or', 'not', 'switch',
+                'break'), suffix=r'\b'),
+             Keyword),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (r'(and|or|not)\b', Operator.Word),
+            (r'(self)\b', Name.Builtin.Pseudo),
+            (r'@@?([a-zA-Z_]\w*)?', Name.Variable.Class),
+            (r'[A-Z]\w*', Name.Class),  # proper name
+            (r'[A-Za-z_]\w*(\.[A-Za-z_]\w*)?', Name),
+            ("'", String.Single, combined('stringescape', 'sqs')),
+            ('"', String.Double, combined('stringescape', 'dqs'))
+        ],
+        'stringescape': [
+            (r'''\\([abfnrtv\\"']|\d{1,3})''', String.Escape)
+        ],
+        'sqs': [
+            ("'", String.Single, '#pop'),
+            (".", String)
+        ],
+        'dqs': [
+            ('"', String.Double, '#pop'),
+            (".", String)
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        # set . as Operator instead of Punctuation
+        for index, token, value in LuaLexer.get_tokens_unprocessed(self, text):
+            if token == Punctuation and value == ".":
+                token = Operator
+            yield index, token, value
+
+
+class ChaiscriptLexer(RegexLexer):
+    """
+    For `ChaiScript <http://chaiscript.com/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'ChaiScript'
+    aliases = ['chai', 'chaiscript']
+    filenames = ['*.chai']
+    mimetypes = ['text/x-chaiscript', 'application/x-chaiscript']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'^\#.*?\n', Comment.Single)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            include('commentsandwhitespace'),
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|\.\.'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'[=+\-*/]', Operator),
+            (r'(for|in|while|do|break|return|continue|if|else|'
+             r'throw|try|catch'
+             r')\b', Keyword, 'slashstartsregex'),
+            (r'(var)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(attr|def|fun)\b', Keyword.Reserved),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(eval|throw)\b', Name.Builtin),
+            (r'`\S+`', Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"', String.Double, 'dqstring'),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+        ],
+        'dqstring': [
+            (r'\$\{[^"}]+?\}', String.Interpol),
+            (r'\$', String.Double),
+            (r'\\\\', String.Double),
+            (r'\\"', String.Double),
+            (r'[^\\"$]+', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+    }
+
+
+class LSLLexer(RegexLexer):
+    """
+    For Second Life's Linden Scripting Language source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'LSL'
+    aliases = ['lsl']
+    filenames = ['*.lsl']
+    mimetypes = ['text/x-lsl']
+
+    flags = re.MULTILINE
+
+    lsl_keywords = r'\b(?:do|else|for|if|jump|return|while)\b'
+    lsl_types = r'\b(?:float|integer|key|list|quaternion|rotation|string|vector)\b'
+    lsl_states = r'\b(?:(?:state)\s+\w+|default)\b'
+    lsl_events = r'\b(?:state_(?:entry|exit)|touch(?:_(?:start|end))?|(?:land_)?collision(?:_(?:start|end))?|timer|listen|(?:no_)?sensor|control|(?:not_)?at_(?:rot_)?target|money|email|run_time_permissions|changed|attach|dataserver|moving_(?:start|end)|link_message|(?:on|object)_rez|remote_data|http_re(?:sponse|quest)|path_update|transaction_result)\b'
+    lsl_functions_builtin = r'\b(?:ll(?:ReturnObjectsBy(?:ID|Owner)|Json(?:2List|[GS]etValue|ValueType)|Sin|Cos|Tan|Atan2|Sqrt|Pow|Abs|Fabs|Frand|Floor|Ceil|Round|Vec(?:Mag|Norm|Dist)|Rot(?:Between|2(?:Euler|Fwd|Left|Up))|(?:Euler|Axes)2Rot|Whisper|(?:Region|Owner)?Say|Shout|Listen(?:Control|Remove)?|Sensor(?:Repeat|Remove)?|Detected(?:Name|Key|Owner|Type|Pos|Vel|Grab|Rot|Group|LinkNumber)|Die|Ground|Wind|(?:[GS]et)(?:AnimationOverride|MemoryLimit|PrimMediaParams|ParcelMusicURL|Object(?:Desc|Name)|PhysicsMaterial|Status|Scale|Color|Alpha|Texture|Pos|Rot|Force|Torque)|ResetAnimationOverride|(?:Scale|Offset|Rotate)Texture|(?:Rot)?Target(?:Remove)?|(?:Stop)?MoveToTarget|Apply(?:Rotational)?Impulse|Set(?:KeyframedMotion|ContentType|RegionPos|(?:Angular)?Velocity|Buoyancy|HoverHeight|ForceAndTorque|TimerEvent|ScriptState|Damage|TextureAnim|Sound(?:Queueing|Radius)|Vehicle(?:Type|(?:Float|Vector|Rotation)Param)|(?:Touch|Sit)?Text|Camera(?:Eye|At)Offset|PrimitiveParams|ClickAction|Link(?:Alpha|Color|PrimitiveParams(?:Fast)?|Texture(?:Anim)?|Camera|Media)|RemoteScriptAccessPin|PayPrice|LocalRot)|ScaleByFactor|Get(?:(?:Max|Min)ScaleFactor|ClosestNavPoint|StaticPath|SimStats|Env|PrimitiveParams|Link(?:PrimitiveParams|Number(?:OfSides)?|Key|Name|Media)|HTTPHeader|FreeURLs|Object(?:Details|PermMask|PrimCount)|Parcel(?:MaxPrims|Details|Prim(?:Count|Owners))|Attached|(?:SPMax|Free|Used)Memory|Region(?:Name|TimeDilation|FPS|Corner|AgentCount)|Root(?:Position|Rotation)|UnixTime|(?:Parcel|Region)Flags|(?:Wall|GMT)clock|SimulatorHostname|BoundingBox|GeometricCenter|Creator|NumberOf(?:Prims|NotecardLines|Sides)|Animation(?:List)?|(?:Camera|Local)(?:Pos|Rot)|Vel|Accel|Omega|Time(?:stamp|OfDay)|(?:Object|CenterOf)?Mass|MassMKS|Energy|Owner|(?:Owner)?Key|SunDirection|Texture(?:Offset|Scale|Rot)|Inventory(?:Number|Name|Key|Type|Creator|PermMask)|Permissions(?:Key)?|StartParameter|List(?:Length|EntryType)|Date|Agent(?:Size|Info|Language|List)|LandOwnerAt|NotecardLine|Script(?:Name|State))|(?:Get|Reset|GetAndReset)Time|PlaySound(?:Slave)?|LoopSound(?:Master|Slave)?|(?:Trigger|Stop|Preload)Sound|(?:(?:Get|Delete)Sub|Insert)String|To(?:Upper|Lower)|Give(?:InventoryList|Money)|RezObject|(?:Stop)?LookAt|Sleep|CollisionFilter|(?:Take|Release)Controls|DetachFromAvatar|AttachToAvatar(?:Temp)?|InstantMessage|(?:GetNext)?Email|StopHover|MinEventDelay|RotLookAt|String(?:Length|Trim)|(?:Start|Stop)Animation|TargetOmega|RequestPermissions|(?:Create|Break)Link|BreakAllLinks|(?:Give|Remove)Inventory|Water|PassTouches|Request(?:Agent|Inventory)Data|TeleportAgent(?:Home|GlobalCoords)?|ModifyLand|CollisionSound|ResetScript|MessageLinked|PushObject|PassCollisions|AxisAngle2Rot|Rot2(?:Axis|Angle)|A(?:cos|sin)|AngleBetween|AllowInventoryDrop|SubStringIndex|List2(?:CSV|Integer|Json|Float|String|Key|Vector|Rot|List(?:Strided)?)|DeleteSubList|List(?:Statistics|Sort|Randomize|(?:Insert|Find|Replace)List)|EdgeOfWorld|AdjustSoundVolume|Key2Name|TriggerSoundLimited|EjectFromLand|(?:CSV|ParseString)2List|OverMyLand|SameGroup|UnSit|Ground(?:Slope|Normal|Contour)|GroundRepel|(?:Set|Remove)VehicleFlags|(?:AvatarOn)?(?:Link)?SitTarget|Script(?:Danger|Profiler)|Dialog|VolumeDetect|ResetOtherScript|RemoteLoadScriptPin|(?:Open|Close)RemoteDataChannel|SendRemoteData|RemoteDataReply|(?:Integer|String)ToBase64|XorBase64|Log(?:10)?|Base64To(?:String|Integer)|ParseStringKeepNulls|RezAtRoot|RequestSimulatorData|ForceMouselook|(?:Load|Release|(?:E|Une)scape)URL|ParcelMedia(?:CommandList|Query)|ModPow|MapDestination|(?:RemoveFrom|AddTo|Reset)Land(?:Pass|Ban)List|(?:Set|Clear)CameraParams|HTTP(?:Request|Response)|TextBox|DetectedTouch(?:UV|Face|Pos|(?:N|Bin)ormal|ST)|(?:MD5|SHA1|DumpList2)String|Request(?:Secure)?URL|Clear(?:Prim|Link)Media|(?:Link)?ParticleSystem|(?:Get|Request)(?:Username|DisplayName)|RegionSayTo|CastRay|GenerateKey|TransferLindenDollars|ManageEstateAccess|(?:Create|Delete)Character|ExecCharacterCmd|Evade|FleeFrom|NavigateTo|PatrolPoints|Pursue|UpdateCharacter|WanderWithin))\b'
+    lsl_constants_float = r'\b(?:DEG_TO_RAD|PI(?:_BY_TWO)?|RAD_TO_DEG|SQRT2|TWO_PI)\b'
+    lsl_constants_integer = r'\b(?:JSON_APPEND|STATUS_(?:PHYSICS|ROTATE_[XYZ]|PHANTOM|SANDBOX|BLOCK_GRAB(?:_OBJECT)?|(?:DIE|RETURN)_AT_EDGE|CAST_SHADOWS|OK|MALFORMED_PARAMS|TYPE_MISMATCH|BOUNDS_ERROR|NOT_(?:FOUND|SUPPORTED)|INTERNAL_ERROR|WHITELIST_FAILED)|AGENT(?:_(?:BY_(?:LEGACY_|USER)NAME|FLYING|ATTACHMENTS|SCRIPTED|MOUSELOOK|SITTING|ON_OBJECT|AWAY|WALKING|IN_AIR|TYPING|CROUCHING|BUSY|ALWAYS_RUN|AUTOPILOT|LIST_(?:PARCEL(?:_OWNER)?|REGION)))?|CAMERA_(?:PITCH|DISTANCE|BEHINDNESS_(?:ANGLE|LAG)|(?:FOCUS|POSITION)(?:_(?:THRESHOLD|LOCKED|LAG))?|FOCUS_OFFSET|ACTIVE)|ANIM_ON|LOOP|REVERSE|PING_PONG|SMOOTH|ROTATE|SCALE|ALL_SIDES|LINK_(?:ROOT|SET|ALL_(?:OTHERS|CHILDREN)|THIS)|ACTIVE|PASSIVE|SCRIPTED|CONTROL_(?:FWD|BACK|(?:ROT_)?(?:LEFT|RIGHT)|UP|DOWN|(?:ML_)?LBUTTON)|PERMISSION_(?:RETURN_OBJECTS|DEBIT|OVERRIDE_ANIMATIONS|SILENT_ESTATE_MANAGEMENT|TAKE_CONTROLS|TRIGGER_ANIMATION|ATTACH|CHANGE_LINKS|(?:CONTROL|TRACK)_CAMERA|TELEPORT)|INVENTORY_(?:TEXTURE|SOUND|OBJECT|SCRIPT|LANDMARK|CLOTHING|NOTECARD|BODYPART|ANIMATION|GESTURE|ALL|NONE)|CHANGED_(?:INVENTORY|COLOR|SHAPE|SCALE|TEXTURE|LINK|ALLOWED_DROP|OWNER|REGION(?:_START)?|TELEPORT|MEDIA)|OBJECT_(?:(?:PHYSICS|SERVER|STREAMING)_COST|UNKNOWN_DETAIL|CHARACTER_TIME|PHANTOM|PHYSICS|TEMP_ON_REZ|NAME|DESC|POS|PRIM_EQUIVALENCE|RETURN_(?:PARCEL(?:_OWNER)?|REGION)|ROO?T|VELOCITY|OWNER|GROUP|CREATOR|ATTACHED_POINT|RENDER_WEIGHT|PATHFINDING_TYPE|(?:RUNNING|TOTAL)_SCRIPT_COUNT|SCRIPT_(?:MEMORY|TIME))|TYPE_(?:INTEGER|FLOAT|STRING|KEY|VECTOR|ROTATION|INVALID)|(?:DEBUG|PUBLIC)_CHANNEL|ATTACH_(?:AVATAR_CENTER|CHEST|HEAD|BACK|PELVIS|MOUTH|CHIN|NECK|NOSE|BELLY|[LR](?:SHOULDER|HAND|FOOT|EAR|EYE|[UL](?:ARM|LEG)|HIP)|(?:LEFT|RIGHT)_PEC|HUD_(?:CENTER_[12]|TOP_(?:RIGHT|CENTER|LEFT)|BOTTOM(?:_(?:RIGHT|LEFT))?))|LAND_(?:LEVEL|RAISE|LOWER|SMOOTH|NOISE|REVERT)|DATA_(?:ONLINE|NAME|BORN|SIM_(?:POS|STATUS|RATING)|PAYINFO)|PAYMENT_INFO_(?:ON_FILE|USED)|REMOTE_DATA_(?:CHANNEL|REQUEST|REPLY)|PSYS_(?:PART_(?:BF_(?:ZERO|ONE(?:_MINUS_(?:DEST_COLOR|SOURCE_(ALPHA|COLOR)))?|DEST_COLOR|SOURCE_(ALPHA|COLOR))|BLEND_FUNC_(DEST|SOURCE)|FLAGS|(?:START|END)_(?:COLOR|ALPHA|SCALE|GLOW)|MAX_AGE|(?:RIBBON|WIND|INTERP_(?:COLOR|SCALE)|BOUNCE|FOLLOW_(?:SRC|VELOCITY)|TARGET_(?:POS|LINEAR)|EMISSIVE)_MASK)|SRC_(?:MAX_AGE|PATTERN|ANGLE_(?:BEGIN|END)|BURST_(?:RATE|PART_COUNT|RADIUS|SPEED_(?:MIN|MAX))|ACCEL|TEXTURE|TARGET_KEY|OMEGA|PATTERN_(?:DROP|EXPLODE|ANGLE(?:_CONE(?:_EMPTY)?)?)))|VEHICLE_(?:REFERENCE_FRAME|TYPE_(?:NONE|SLED|CAR|BOAT|AIRPLANE|BALLOON)|(?:LINEAR|ANGULAR)_(?:FRICTION_TIMESCALE|MOTOR_DIRECTION)|LINEAR_MOTOR_OFFSET|HOVER_(?:HEIGHT|EFFICIENCY|TIMESCALE)|BUOYANCY|(?:LINEAR|ANGULAR)_(?:DEFLECTION_(?:EFFICIENCY|TIMESCALE)|MOTOR_(?:DECAY_)?TIMESCALE)|VERTICAL_ATTRACTION_(?:EFFICIENCY|TIMESCALE)|BANKING_(?:EFFICIENCY|MIX|TIMESCALE)|FLAG_(?:NO_DEFLECTION_UP|LIMIT_(?:ROLL_ONLY|MOTOR_UP)|HOVER_(?:(?:WATER|TERRAIN|UP)_ONLY|GLOBAL_HEIGHT)|MOUSELOOK_(?:STEER|BANK)|CAMERA_DECOUPLED))|PRIM_(?:TYPE(?:_(?:BOX|CYLINDER|PRISM|SPHERE|TORUS|TUBE|RING|SCULPT))?|HOLE_(?:DEFAULT|CIRCLE|SQUARE|TRIANGLE)|MATERIAL(?:_(?:STONE|METAL|GLASS|WOOD|FLESH|PLASTIC|RUBBER))?|SHINY_(?:NONE|LOW|MEDIUM|HIGH)|BUMP_(?:NONE|BRIGHT|DARK|WOOD|BARK|BRICKS|CHECKER|CONCRETE|TILE|STONE|DISKS|GRAVEL|BLOBS|SIDING|LARGETILE|STUCCO|SUCTION|WEAVE)|TEXGEN_(?:DEFAULT|PLANAR)|SCULPT_(?:TYPE_(?:SPHERE|TORUS|PLANE|CYLINDER|MASK)|FLAG_(?:MIRROR|INVERT))|PHYSICS(?:_(?:SHAPE_(?:CONVEX|NONE|PRIM|TYPE)))?|(?:POS|ROT)_LOCAL|SLICE|TEXT|FLEXIBLE|POINT_LIGHT|TEMP_ON_REZ|PHANTOM|POSITION|SIZE|ROTATION|TEXTURE|NAME|OMEGA|DESC|LINK_TARGET|COLOR|BUMP_SHINY|FULLBRIGHT|TEXGEN|GLOW|MEDIA_(?:ALT_IMAGE_ENABLE|CONTROLS|(?:CURRENT|HOME)_URL|AUTO_(?:LOOP|PLAY|SCALE|ZOOM)|FIRST_CLICK_INTERACT|(?:WIDTH|HEIGHT)_PIXELS|WHITELIST(?:_ENABLE)?|PERMS_(?:INTERACT|CONTROL)|PARAM_MAX|CONTROLS_(?:STANDARD|MINI)|PERM_(?:NONE|OWNER|GROUP|ANYONE)|MAX_(?:URL_LENGTH|WHITELIST_(?:SIZE|COUNT)|(?:WIDTH|HEIGHT)_PIXELS)))|MASK_(?:BASE|OWNER|GROUP|EVERYONE|NEXT)|PERM_(?:TRANSFER|MODIFY|COPY|MOVE|ALL)|PARCEL_(?:MEDIA_COMMAND_(?:STOP|PAUSE|PLAY|LOOP|TEXTURE|URL|TIME|AGENT|UNLOAD|AUTO_ALIGN|TYPE|SIZE|DESC|LOOP_SET)|FLAG_(?:ALLOW_(?:FLY|(?:GROUP_)?SCRIPTS|LANDMARK|TERRAFORM|DAMAGE|CREATE_(?:GROUP_)?OBJECTS)|USE_(?:ACCESS_(?:GROUP|LIST)|BAN_LIST|LAND_PASS_LIST)|LOCAL_SOUND_ONLY|RESTRICT_PUSHOBJECT|ALLOW_(?:GROUP|ALL)_OBJECT_ENTRY)|COUNT_(?:TOTAL|OWNER|GROUP|OTHER|SELECTED|TEMP)|DETAILS_(?:NAME|DESC|OWNER|GROUP|AREA|ID|SEE_AVATARS))|LIST_STAT_(?:MAX|MIN|MEAN|MEDIAN|STD_DEV|SUM(?:_SQUARES)?|NUM_COUNT|GEOMETRIC_MEAN|RANGE)|PAY_(?:HIDE|DEFAULT)|REGION_FLAG_(?:ALLOW_DAMAGE|FIXED_SUN|BLOCK_TERRAFORM|SANDBOX|DISABLE_(?:COLLISIONS|PHYSICS)|BLOCK_FLY|ALLOW_DIRECT_TELEPORT|RESTRICT_PUSHOBJECT)|HTTP_(?:METHOD|MIMETYPE|BODY_(?:MAXLENGTH|TRUNCATED)|CUSTOM_HEADER|PRAGMA_NO_CACHE|VERBOSE_THROTTLE|VERIFY_CERT)|STRING_(?:TRIM(?:_(?:HEAD|TAIL))?)|CLICK_ACTION_(?:NONE|TOUCH|SIT|BUY|PAY|OPEN(?:_MEDIA)?|PLAY|ZOOM)|TOUCH_INVALID_FACE|PROFILE_(?:NONE|SCRIPT_MEMORY)|RC_(?:DATA_FLAGS|DETECT_PHANTOM|GET_(?:LINK_NUM|NORMAL|ROOT_KEY)|MAX_HITS|REJECT_(?:TYPES|AGENTS|(?:NON)?PHYSICAL|LAND))|RCERR_(?:CAST_TIME_EXCEEDED|SIM_PERF_LOW|UNKNOWN)|ESTATE_ACCESS_(?:ALLOWED_(?:AGENT|GROUP)_(?:ADD|REMOVE)|BANNED_AGENT_(?:ADD|REMOVE))|DENSITY|FRICTION|RESTITUTION|GRAVITY_MULTIPLIER|KFM_(?:COMMAND|CMD_(?:PLAY|STOP|PAUSE|SET_MODE)|MODE|FORWARD|LOOP|PING_PONG|REVERSE|DATA|ROTATION|TRANSLATION)|ERR_(?:GENERIC|PARCEL_PERMISSIONS|MALFORMED_PARAMS|RUNTIME_PERMISSIONS|THROTTLED)|CHARACTER_(?:CMD_(?:(?:SMOOTH_)?STOP|JUMP)|DESIRED_(?:TURN_)?SPEED|RADIUS|STAY_WITHIN_PARCEL|LENGTH|ORIENTATION|ACCOUNT_FOR_SKIPPED_FRAMES|AVOIDANCE_MODE|TYPE(?:_(?:[A-D]|NONE))?|MAX_(?:DECEL|TURN_RADIUS|(?:ACCEL|SPEED)))|PURSUIT_(?:OFFSET|FUZZ_FACTOR|GOAL_TOLERANCE|INTERCEPT)|REQUIRE_LINE_OF_SIGHT|FORCE_DIRECT_PATH|VERTICAL|HORIZONTAL|AVOID_(?:CHARACTERS|DYNAMIC_OBSTACLES|NONE)|PU_(?:EVADE_(?:HIDDEN|SPOTTED)|FAILURE_(?:DYNAMIC_PATHFINDING_DISABLED|INVALID_(?:GOAL|START)|NO_(?:NAVMESH|VALID_DESTINATION)|OTHER|TARGET_GONE|(?:PARCEL_)?UNREACHABLE)|(?:GOAL|SLOWDOWN_DISTANCE)_REACHED)|TRAVERSAL_TYPE(?:_(?:FAST|NONE|SLOW))?|CONTENT_TYPE_(?:ATOM|FORM|HTML|JSON|LLSD|RSS|TEXT|XHTML|XML)|GCNP_(?:RADIUS|STATIC)|(?:PATROL|WANDER)_PAUSE_AT_WAYPOINTS|OPT_(?:AVATAR|CHARACTER|EXCLUSION_VOLUME|LEGACY_LINKSET|MATERIAL_VOLUME|OTHER|STATIC_OBSTACLE|WALKABLE)|SIM_STAT_PCT_CHARS_STEPPED)\b'
+    lsl_constants_integer_boolean = r'\b(?:FALSE|TRUE)\b'
+    lsl_constants_rotation = r'\b(?:ZERO_ROTATION)\b'
+    lsl_constants_string = r'\b(?:EOF|JSON_(?:ARRAY|DELETE|FALSE|INVALID|NULL|NUMBER|OBJECT|STRING|TRUE)|NULL_KEY|TEXTURE_(?:BLANK|DEFAULT|MEDIA|PLYWOOD|TRANSPARENT)|URL_REQUEST_(?:GRANTED|DENIED))\b'
+    lsl_constants_vector = r'\b(?:TOUCH_INVALID_(?:TEXCOORD|VECTOR)|ZERO_VECTOR)\b'
+    lsl_invalid_broken = r'\b(?:LAND_(?:LARGE|MEDIUM|SMALL)_BRUSH)\b'
+    lsl_invalid_deprecated = r'\b(?:ATTACH_[LR]PEC|DATA_RATING|OBJECT_ATTACHMENT_(?:GEOMETRY_BYTES|SURFACE_AREA)|PRIM_(?:CAST_SHADOWS|MATERIAL_LIGHT|TYPE_LEGACY)|PSYS_SRC_(?:INNER|OUTER)ANGLE|VEHICLE_FLAG_NO_FLY_UP|ll(?:Cloud|Make(?:Explosion|Fountain|Smoke|Fire)|RemoteDataSetRegion|Sound(?:Preload)?|XorBase64Strings(?:Correct)?))\b'
+    lsl_invalid_illegal = r'\b(?:event)\b'
+    lsl_invalid_unimplemented = r'\b(?:CHARACTER_(?:MAX_ANGULAR_(?:ACCEL|SPEED)|TURN_SPEED_MULTIPLIER)|PERMISSION_(?:CHANGE_(?:JOINTS|PERMISSIONS)|RELEASE_OWNERSHIP|REMAP_CONTROLS)|PRIM_PHYSICS_MATERIAL|PSYS_SRC_OBJ_REL_MASK|ll(?:CollisionSprite|(?:Stop)?PointAt|(?:(?:Refresh|Set)Prim)URL|(?:Take|Release)Camera|RemoteLoadScript))\b'
+    lsl_reserved_godmode = r'\b(?:ll(?:GodLikeRezObject|Set(?:Inventory|Object)PermMask))\b'
+    lsl_reserved_log = r'\b(?:print)\b'
+    lsl_operators = r'\+\+|\-\-|<<|>>|&&?|\|\|?|\^|~|[!%<>=*+\-/]=?'
+
+    tokens = {
+        'root':
+        [
+            (r'//.*?\n',                          Comment.Single),
+            (r'/\*',                              Comment.Multiline, 'comment'),
+            (r'"',                                String.Double, 'string'),
+            (lsl_keywords,                        Keyword),
+            (lsl_types,                           Keyword.Type),
+            (lsl_states,                          Name.Class),
+            (lsl_events,                          Name.Builtin),
+            (lsl_functions_builtin,               Name.Function),
+            (lsl_constants_float,                 Keyword.Constant),
+            (lsl_constants_integer,               Keyword.Constant),
+            (lsl_constants_integer_boolean,       Keyword.Constant),
+            (lsl_constants_rotation,              Keyword.Constant),
+            (lsl_constants_string,                Keyword.Constant),
+            (lsl_constants_vector,                Keyword.Constant),
+            (lsl_invalid_broken,                  Error),
+            (lsl_invalid_deprecated,              Error),
+            (lsl_invalid_illegal,                 Error),
+            (lsl_invalid_unimplemented,           Error),
+            (lsl_reserved_godmode,                Keyword.Reserved),
+            (lsl_reserved_log,                    Keyword.Reserved),
+            (r'\b([a-zA-Z_]\w*)\b',     Name.Variable),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d*', Number.Float),
+            (r'(\d+\.\d*|\.\d+)',                 Number.Float),
+            (r'0[xX][0-9a-fA-F]+',                Number.Hex),
+            (r'\d+',                              Number.Integer),
+            (lsl_operators,                       Operator),
+            (r':=?',                              Error),
+            (r'[,;{}()\[\]]',                     Punctuation),
+            (r'\n+',                              Whitespace),
+            (r'\s+',                              Whitespace)
+        ],
+        'comment':
+        [
+            (r'[^*/]+',                           Comment.Multiline),
+            (r'/\*',                              Comment.Multiline, '#push'),
+            (r'\*/',                              Comment.Multiline, '#pop'),
+            (r'[*/]',                             Comment.Multiline)
+        ],
+        'string':
+        [
+            (r'\\([nt"\\])',                      String.Escape),
+            (r'"',                                String.Double, '#pop'),
+            (r'\\.',                              Error),
+            (r'[^"\\]+',                          String.Double),
+        ]
+    }
+
+
+class AppleScriptLexer(RegexLexer):
+    """
+    For `AppleScript source code
+    <http://developer.apple.com/documentation/AppleScript/
+    Conceptual/AppleScriptLangGuide>`_,
+    including `AppleScript Studio
+    <http://developer.apple.com/documentation/AppleScript/
+    Reference/StudioReference>`_.
+    Contributed by Andreas Amann <aamann@mac.com>.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'AppleScript'
+    aliases = ['applescript']
+    filenames = ['*.applescript']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    Identifiers = r'[a-zA-Z]\w*'
+
+    # XXX: use words() for all of these
+    Literals = ('AppleScript', 'current application', 'false', 'linefeed',
+                'missing value', 'pi', 'quote', 'result', 'return', 'space',
+                'tab', 'text item delimiters', 'true', 'version')
+    Classes = ('alias ', 'application ', 'boolean ', 'class ', 'constant ',
+               'date ', 'file ', 'integer ', 'list ', 'number ', 'POSIX file ',
+               'real ', 'record ', 'reference ', 'RGB color ', 'script ',
+               'text ', 'unit types', '(?:Unicode )?text', 'string')
+    BuiltIn = ('attachment', 'attribute run', 'character', 'day', 'month',
+               'paragraph', 'word', 'year')
+    HandlerParams = ('about', 'above', 'against', 'apart from', 'around',
+                     'aside from', 'at', 'below', 'beneath', 'beside',
+                     'between', 'for', 'given', 'instead of', 'on', 'onto',
+                     'out of', 'over', 'since')
+    Commands = ('ASCII (character|number)', 'activate', 'beep', 'choose URL',
+                'choose application', 'choose color', 'choose file( name)?',
+                'choose folder', 'choose from list',
+                'choose remote application', 'clipboard info',
+                'close( access)?', 'copy', 'count', 'current date', 'delay',
+                'delete', 'display (alert|dialog)', 'do shell script',
+                'duplicate', 'exists', 'get eof', 'get volume settings',
+                'info for', 'launch', 'list (disks|folder)', 'load script',
+                'log', 'make', 'mount volume', 'new', 'offset',
+                'open( (for access|location))?', 'path to', 'print', 'quit',
+                'random number', 'read', 'round', 'run( script)?',
+                'say', 'scripting components',
+                'set (eof|the clipboard to|volume)', 'store script',
+                'summarize', 'system attribute', 'system info',
+                'the clipboard', 'time to GMT', 'write', 'quoted form')
+    References = ('(in )?back of', '(in )?front of', '[0-9]+(st|nd|rd|th)',
+                  'first', 'second', 'third', 'fourth', 'fifth', 'sixth',
+                  'seventh', 'eighth', 'ninth', 'tenth', 'after', 'back',
+                  'before', 'behind', 'every', 'front', 'index', 'last',
+                  'middle', 'some', 'that', 'through', 'thru', 'where', 'whose')
+    Operators = ("and", "or", "is equal", "equals", "(is )?equal to", "is not",
+                 "isn't", "isn't equal( to)?", "is not equal( to)?",
+                 "doesn't equal", "does not equal", "(is )?greater than",
+                 "comes after", "is not less than or equal( to)?",
+                 "isn't less than or equal( to)?", "(is )?less than",
+                 "comes before", "is not greater than or equal( to)?",
+                 "isn't greater than or equal( to)?",
+                 "(is  )?greater than or equal( to)?", "is not less than",
+                 "isn't less than", "does not come before",
+                 "doesn't come before", "(is )?less than or equal( to)?",
+                 "is not greater than", "isn't greater than",
+                 "does not come after", "doesn't come after", "starts? with",
+                 "begins? with", "ends? with", "contains?", "does not contain",
+                 "doesn't contain", "is in", "is contained by", "is not in",
+                 "is not contained by", "isn't contained by", "div", "mod",
+                 "not", "(a  )?(ref( to)?|reference to)", "is", "does")
+    Control = ('considering', 'else', 'error', 'exit', 'from', 'if',
+               'ignoring', 'in', 'repeat', 'tell', 'then', 'times', 'to',
+               'try', 'until', 'using terms from', 'while', 'whith',
+               'with timeout( of)?', 'with transaction', 'by', 'continue',
+               'end', 'its?', 'me', 'my', 'return', 'of', 'as')
+    Declarations = ('global', 'local', 'prop(erty)?', 'set', 'get')
+    Reserved = ('but', 'put', 'returning', 'the')
+    StudioClasses = ('action cell', 'alert reply', 'application', 'box',
+                     'browser( cell)?', 'bundle', 'button( cell)?', 'cell',
+                     'clip view', 'color well', 'color-panel',
+                     'combo box( item)?', 'control',
+                     'data( (cell|column|item|row|source))?', 'default entry',
+                     'dialog reply', 'document', 'drag info', 'drawer',
+                     'event', 'font(-panel)?', 'formatter',
+                     'image( (cell|view))?', 'matrix', 'menu( item)?', 'item',
+                     'movie( view)?', 'open-panel', 'outline view', 'panel',
+                     'pasteboard', 'plugin', 'popup button',
+                     'progress indicator', 'responder', 'save-panel',
+                     'scroll view', 'secure text field( cell)?', 'slider',
+                     'sound', 'split view', 'stepper', 'tab view( item)?',
+                     'table( (column|header cell|header view|view))',
+                     'text( (field( cell)?|view))?', 'toolbar( item)?',
+                     'user-defaults', 'view', 'window')
+    StudioEvents = ('accept outline drop', 'accept table drop', 'action',
+                    'activated', 'alert ended', 'awake from nib', 'became key',
+                    'became main', 'begin editing', 'bounds changed',
+                    'cell value', 'cell value changed', 'change cell value',
+                    'change item value', 'changed', 'child of item',
+                    'choose menu item', 'clicked', 'clicked toolbar item',
+                    'closed', 'column clicked', 'column moved',
+                    'column resized', 'conclude drop', 'data representation',
+                    'deminiaturized', 'dialog ended', 'document nib name',
+                    'double clicked', 'drag( (entered|exited|updated))?',
+                    'drop', 'end editing', 'exposed', 'idle', 'item expandable',
+                    'item value', 'item value changed', 'items changed',
+                    'keyboard down', 'keyboard up', 'launched',
+                    'load data representation', 'miniaturized', 'mouse down',
+                    'mouse dragged', 'mouse entered', 'mouse exited',
+                    'mouse moved', 'mouse up', 'moved',
+                    'number of browser rows', 'number of items',
+                    'number of rows', 'open untitled', 'opened', 'panel ended',
+                    'parameters updated', 'plugin loaded', 'prepare drop',
+                    'prepare outline drag', 'prepare outline drop',
+                    'prepare table drag', 'prepare table drop',
+                    'read from file', 'resigned active', 'resigned key',
+                    'resigned main', 'resized( sub views)?',
+                    'right mouse down', 'right mouse dragged',
+                    'right mouse up', 'rows changed', 'scroll wheel',
+                    'selected tab view item', 'selection changed',
+                    'selection changing', 'should begin editing',
+                    'should close', 'should collapse item',
+                    'should end editing', 'should expand item',
+                    'should open( untitled)?',
+                    'should quit( after last window closed)?',
+                    'should select column', 'should select item',
+                    'should select row', 'should select tab view item',
+                    'should selection change', 'should zoom', 'shown',
+                    'update menu item', 'update parameters',
+                    'update toolbar item', 'was hidden', 'was miniaturized',
+                    'will become active', 'will close', 'will dismiss',
+                    'will display browser cell', 'will display cell',
+                    'will display item cell', 'will display outline cell',
+                    'will finish launching', 'will hide', 'will miniaturize',
+                    'will move', 'will open', 'will pop up', 'will quit',
+                    'will resign active', 'will resize( sub views)?',
+                    'will select tab view item', 'will show', 'will zoom',
+                    'write to file', 'zoomed')
+    StudioCommands = ('animate', 'append', 'call method', 'center',
+                      'close drawer', 'close panel', 'display',
+                      'display alert', 'display dialog', 'display panel', 'go',
+                      'hide', 'highlight', 'increment', 'item for',
+                      'load image', 'load movie', 'load nib', 'load panel',
+                      'load sound', 'localized string', 'lock focus', 'log',
+                      'open drawer', 'path for', 'pause', 'perform action',
+                      'play', 'register', 'resume', 'scroll', 'select( all)?',
+                      'show', 'size to fit', 'start', 'step back',
+                      'step forward', 'stop', 'synchronize', 'unlock focus',
+                      'update')
+    StudioProperties = ('accepts arrow key', 'action method', 'active',
+                        'alignment', 'allowed identifiers',
+                        'allows branch selection', 'allows column reordering',
+                        'allows column resizing', 'allows column selection',
+                        'allows customization',
+                        'allows editing text attributes',
+                        'allows empty selection', 'allows mixed state',
+                        'allows multiple selection', 'allows reordering',
+                        'allows undo', 'alpha( value)?', 'alternate image',
+                        'alternate increment value', 'alternate title',
+                        'animation delay', 'associated file name',
+                        'associated object', 'auto completes', 'auto display',
+                        'auto enables items', 'auto repeat',
+                        'auto resizes( outline column)?',
+                        'auto save expanded items', 'auto save name',
+                        'auto save table columns', 'auto saves configuration',
+                        'auto scroll', 'auto sizes all columns to fit',
+                        'auto sizes cells', 'background color', 'bezel state',
+                        'bezel style', 'bezeled', 'border rect', 'border type',
+                        'bordered', 'bounds( rotation)?', 'box type',
+                        'button returned', 'button type',
+                        'can choose directories', 'can choose files',
+                        'can draw', 'can hide',
+                        'cell( (background color|size|type))?', 'characters',
+                        'class', 'click count', 'clicked( data)? column',
+                        'clicked data item', 'clicked( data)? row',
+                        'closeable', 'collating', 'color( (mode|panel))',
+                        'command key down', 'configuration',
+                        'content(s| (size|view( margins)?))?', 'context',
+                        'continuous', 'control key down', 'control size',
+                        'control tint', 'control view',
+                        'controller visible', 'coordinate system',
+                        'copies( on scroll)?', 'corner view', 'current cell',
+                        'current column', 'current( field)?  editor',
+                        'current( menu)? item', 'current row',
+                        'current tab view item', 'data source',
+                        'default identifiers', 'delta (x|y|z)',
+                        'destination window', 'directory', 'display mode',
+                        'displayed cell', 'document( (edited|rect|view))?',
+                        'double value', 'dragged column', 'dragged distance',
+                        'dragged items', 'draws( cell)? background',
+                        'draws grid', 'dynamically scrolls', 'echos bullets',
+                        'edge', 'editable', 'edited( data)? column',
+                        'edited data item', 'edited( data)? row', 'enabled',
+                        'enclosing scroll view', 'ending page',
+                        'error handling', 'event number', 'event type',
+                        'excluded from windows menu', 'executable path',
+                        'expanded', 'fax number', 'field editor', 'file kind',
+                        'file name', 'file type', 'first responder',
+                        'first visible column', 'flipped', 'floating',
+                        'font( panel)?', 'formatter', 'frameworks path',
+                        'frontmost', 'gave up', 'grid color', 'has data items',
+                        'has horizontal ruler', 'has horizontal scroller',
+                        'has parent data item', 'has resize indicator',
+                        'has shadow', 'has sub menu', 'has vertical ruler',
+                        'has vertical scroller', 'header cell', 'header view',
+                        'hidden', 'hides when deactivated', 'highlights by',
+                        'horizontal line scroll', 'horizontal page scroll',
+                        'horizontal ruler view', 'horizontally resizable',
+                        'icon image', 'id', 'identifier',
+                        'ignores multiple clicks',
+                        'image( (alignment|dims when disabled|frame style|scaling))?',
+                        'imports graphics', 'increment value',
+                        'indentation per level', 'indeterminate', 'index',
+                        'integer value', 'intercell spacing', 'item height',
+                        'key( (code|equivalent( modifier)?|window))?',
+                        'knob thickness', 'label', 'last( visible)? column',
+                        'leading offset', 'leaf', 'level', 'line scroll',
+                        'loaded', 'localized sort', 'location', 'loop mode',
+                        'main( (bunde|menu|window))?', 'marker follows cell',
+                        'matrix mode', 'maximum( content)? size',
+                        'maximum visible columns',
+                        'menu( form representation)?', 'miniaturizable',
+                        'miniaturized', 'minimized image', 'minimized title',
+                        'minimum column width', 'minimum( content)? size',
+                        'modal', 'modified', 'mouse down state',
+                        'movie( (controller|file|rect))?', 'muted', 'name',
+                        'needs display', 'next state', 'next text',
+                        'number of tick marks', 'only tick mark values',
+                        'opaque', 'open panel', 'option key down',
+                        'outline table column', 'page scroll', 'pages across',
+                        'pages down', 'palette label', 'pane splitter',
+                        'parent data item', 'parent window', 'pasteboard',
+                        'path( (names|separator))?', 'playing',
+                        'plays every frame', 'plays selection only', 'position',
+                        'preferred edge', 'preferred type', 'pressure',
+                        'previous text', 'prompt', 'properties',
+                        'prototype cell', 'pulls down', 'rate',
+                        'released when closed', 'repeated',
+                        'requested print time', 'required file type',
+                        'resizable', 'resized column', 'resource path',
+                        'returns records', 'reuses columns', 'rich text',
+                        'roll over', 'row height', 'rulers visible',
+                        'save panel', 'scripts path', 'scrollable',
+                        'selectable( identifiers)?', 'selected cell',
+                        'selected( data)? columns?', 'selected data items?',
+                        'selected( data)? rows?', 'selected item identifier',
+                        'selection by rect', 'send action on arrow key',
+                        'sends action when done editing', 'separates columns',
+                        'separator item', 'sequence number', 'services menu',
+                        'shared frameworks path', 'shared support path',
+                        'sheet', 'shift key down', 'shows alpha',
+                        'shows state by', 'size( mode)?',
+                        'smart insert delete enabled', 'sort case sensitivity',
+                        'sort column', 'sort order', 'sort type',
+                        'sorted( data rows)?', 'sound', 'source( mask)?',
+                        'spell checking enabled', 'starting page', 'state',
+                        'string value', 'sub menu', 'super menu', 'super view',
+                        'tab key traverses cells', 'tab state', 'tab type',
+                        'tab view', 'table view', 'tag', 'target( printer)?',
+                        'text color', 'text container insert',
+                        'text container origin', 'text returned',
+                        'tick mark position', 'time stamp',
+                        'title(d| (cell|font|height|position|rect))?',
+                        'tool tip', 'toolbar', 'trailing offset', 'transparent',
+                        'treat packages as directories', 'truncated labels',
+                        'types', 'unmodified characters', 'update views',
+                        'use sort indicator', 'user defaults',
+                        'uses data source', 'uses ruler',
+                        'uses threaded animation',
+                        'uses title from previous column', 'value wraps',
+                        'version',
+                        'vertical( (line scroll|page scroll|ruler view))?',
+                        'vertically resizable', 'view',
+                        'visible( document rect)?', 'volume', 'width', 'window',
+                        'windows menu', 'wraps', 'zoomable', 'zoomed')
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (u'¬\\n', String.Escape),
+            (r"'s\s+", Text),  # This is a possessive, consider moving
+            (r'(--|#).*?$', Comment),
+            (r'\(\*', Comment.Multiline, 'comment'),
+            (r'[(){}!,.:]', Punctuation),
+            (u'(«)([^»]+)(»)',
+             bygroups(Text, Name.Builtin, Text)),
+            (r'\b((?:considering|ignoring)\s*)'
+             r'(application responses|case|diacriticals|hyphens|'
+             r'numeric strings|punctuation|white space)',
+             bygroups(Keyword, Name.Builtin)),
+            (u'(-|\\*|\\+|&|≠|>=?|<=?|=|≥|≤|/|÷|\\^)', Operator),
+            (r"\b(%s)\b" % '|'.join(Operators), Operator.Word),
+            (r'^(\s*(?:on|end)\s+)'
+             r'(%s)' % '|'.join(StudioEvents[::-1]),
+             bygroups(Keyword, Name.Function)),
+            (r'^(\s*)(in|on|script|to)(\s+)', bygroups(Text, Keyword, Text)),
+            (r'\b(as )(%s)\b' % '|'.join(Classes),
+             bygroups(Keyword, Name.Class)),
+            (r'\b(%s)\b' % '|'.join(Literals), Name.Constant),
+            (r'\b(%s)\b' % '|'.join(Commands), Name.Builtin),
+            (r'\b(%s)\b' % '|'.join(Control), Keyword),
+            (r'\b(%s)\b' % '|'.join(Declarations), Keyword),
+            (r'\b(%s)\b' % '|'.join(Reserved), Name.Builtin),
+            (r'\b(%s)s?\b' % '|'.join(BuiltIn), Name.Builtin),
+            (r'\b(%s)\b' % '|'.join(HandlerParams), Name.Builtin),
+            (r'\b(%s)\b' % '|'.join(StudioProperties), Name.Attribute),
+            (r'\b(%s)s?\b' % '|'.join(StudioClasses), Name.Builtin),
+            (r'\b(%s)\b' % '|'.join(StudioCommands), Name.Builtin),
+            (r'\b(%s)\b' % '|'.join(References), Name.Builtin),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r'\b(%s)\b' % Identifiers, Name.Variable),
+            (r'[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?', Number.Float),
+            (r'[-+]?\d+', Number.Integer),
+        ],
+        'comment': [
+            ('\(\*', Comment.Multiline, '#push'),
+            ('\*\)', Comment.Multiline, '#pop'),
+            ('[^*(]+', Comment.Multiline),
+            ('[*(]', Comment.Multiline),
+        ],
+    }
+
+
+class RexxLexer(RegexLexer):
+    """
+    `Rexx <http://www.rexxinfo.org/>`_ is a scripting language available for
+    a wide range of different platforms with its roots found on mainframe
+    systems. It is popular for I/O- and data based tasks and can act as glue
+    language to bind different applications together.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Rexx'
+    aliases = ['rexx', 'arexx']
+    filenames = ['*.rexx', '*.rex', '*.rx', '*.arexx']
+    mimetypes = ['text/x-rexx']
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s', Whitespace),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"', String, 'string_double'),
+            (r"'", String, 'string_single'),
+            (r'[0-9]+(\.[0-9]+)?(e[+-]?[0-9])?', Number),
+            (r'([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b',
+             bygroups(Name.Function, Whitespace, Operator, Whitespace,
+                      Keyword.Declaration)),
+            (r'([a-z_]\w*)(\s*)(:)',
+             bygroups(Name.Label, Whitespace, Operator)),
+            include('function'),
+            include('keyword'),
+            include('operator'),
+            (r'[a-z_]\w*', Text),
+        ],
+        'function': [
+            (words((
+                'abbrev', 'abs', 'address', 'arg', 'b2x', 'bitand', 'bitor', 'bitxor',
+                'c2d', 'c2x', 'center', 'charin', 'charout', 'chars', 'compare',
+                'condition', 'copies', 'd2c', 'd2x', 'datatype', 'date', 'delstr',
+                'delword', 'digits', 'errortext', 'form', 'format', 'fuzz', 'insert',
+                'lastpos', 'left', 'length', 'linein', 'lineout', 'lines', 'max',
+                'min', 'overlay', 'pos', 'queued', 'random', 'reverse', 'right', 'sign',
+                'sourceline', 'space', 'stream', 'strip', 'substr', 'subword', 'symbol',
+                'time', 'trace', 'translate', 'trunc', 'value', 'verify', 'word',
+                'wordindex', 'wordlength', 'wordpos', 'words', 'x2b', 'x2c', 'x2d',
+                'xrange'), suffix=r'(\s*)(\()'),
+             bygroups(Name.Builtin, Whitespace, Operator)),
+        ],
+        'keyword': [
+            (r'(address|arg|by|call|do|drop|else|end|exit|for|forever|if|'
+             r'interpret|iterate|leave|nop|numeric|off|on|options|parse|'
+             r'pull|push|queue|return|say|select|signal|to|then|trace|until|'
+             r'while)\b', Keyword.Reserved),
+        ],
+        'operator': [
+            (r'(-|//|/|\(|\)|\*\*|\*|\\<<|\\<|\\==|\\=|\\>>|\\>|\\|\|\||\||'
+             r'&&|&|%|\+|<<=|<<|<=|<>|<|==|=|><|>=|>>=|>>|>|¬<<|¬<|¬==|¬=|'
+             r'¬>>|¬>|¬|\.|,)', Operator),
+        ],
+        'string_double': [
+            (r'[^"\n]+', String),
+            (r'""', String),
+            (r'"', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ],
+        'string_single': [
+            (r'[^\'\n]', String),
+            (r'\'\'', String),
+            (r'\'', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ],
+        'comment': [
+            (r'[^*]+', Comment.Multiline),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ]
+    }
+
+    _c = lambda s: re.compile(s, re.MULTILINE)
+    _ADDRESS_COMMAND_PATTERN = _c(r'^\s*address\s+command\b')
+    _ADDRESS_PATTERN = _c(r'^\s*address\s+')
+    _DO_WHILE_PATTERN = _c(r'^\s*do\s+while\b')
+    _IF_THEN_DO_PATTERN = _c(r'^\s*if\b.+\bthen\s+do\s*$')
+    _PROCEDURE_PATTERN = _c(r'^\s*([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b')
+    _ELSE_DO_PATTERN = _c(r'\belse\s+do\s*$')
+    _PARSE_ARG_PATTERN = _c(r'^\s*parse\s+(upper\s+)?(arg|value)\b')
+    PATTERNS_AND_WEIGHTS = (
+        (_ADDRESS_COMMAND_PATTERN, 0.2),
+        (_ADDRESS_PATTERN, 0.05),
+        (_DO_WHILE_PATTERN, 0.1),
+        (_ELSE_DO_PATTERN, 0.1),
+        (_IF_THEN_DO_PATTERN, 0.1),
+        (_PROCEDURE_PATTERN, 0.5),
+        (_PARSE_ARG_PATTERN, 0.2),
+    )
+
+    def analyse_text(text):
+        """
+        Check for inital comment and patterns that distinguish Rexx from other
+        C-like languages.
+        """
+        if re.search(r'/\*\**\s*rexx', text, re.IGNORECASE):
+            # Header matches MVS Rexx requirements, this is certainly a Rexx
+            # script.
+            return 1.0
+        elif text.startswith('/*'):
+            # Header matches general Rexx requirements; the source code might
+            # still be any language using C comments such as C++, C# or Java.
+            lowerText = text.lower()
+            result = sum(weight
+                         for (pattern, weight) in RexxLexer.PATTERNS_AND_WEIGHTS
+                         if pattern.search(lowerText)) + 0.01
+            return min(result, 1.0)
+
+
+class MOOCodeLexer(RegexLexer):
+    """
+    For `MOOCode <http://www.moo.mud.org/>`_ (the MOO scripting
+    language).
+
+    .. versionadded:: 0.9
+    """
+    name = 'MOOCode'
+    filenames = ['*.moo']
+    aliases = ['moocode', 'moo']
+    mimetypes = ['text/x-moocode']
+
+    tokens = {
+        'root': [
+            # Numbers
+            (r'(0|[1-9][0-9_]*)', Number.Integer),
+            # Strings
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # exceptions
+            (r'(E_PERM|E_DIV)', Name.Exception),
+            # db-refs
+            (r'((#[-0-9]+)|(\$\w+))', Name.Entity),
+            # Keywords
+            (r'\b(if|else|elseif|endif|for|endfor|fork|endfork|while'
+             r'|endwhile|break|continue|return|try'
+             r'|except|endtry|finally|in)\b', Keyword),
+            # builtins
+            (r'(random|length)', Name.Builtin),
+            # special variables
+            (r'(player|caller|this|args)', Name.Variable.Instance),
+            # skip whitespace
+            (r'\s+', Text),
+            (r'\n', Text),
+            # other operators
+            (r'([!;=,{}&|:.\[\]@()<>?]+)', Operator),
+            # function call
+            (r'(\w+)(\()', bygroups(Name.Function, Operator)),
+            # variables
+            (r'(\w+)', Text),
+        ]
+    }
+
+
+class HybrisLexer(RegexLexer):
+    """
+    For `Hybris <http://www.hybris-lang.org>`_ source code.
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'Hybris'
+    aliases = ['hybris', 'hy']
+    filenames = ['*.hy', '*.hyb']
+    mimetypes = ['text/x-hybris', 'application/x-hybris']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:function|method|operator\s+)+?)'
+             r'([a-zA-Z_]\w*)'
+             r'(\s*)(\()', bygroups(Keyword, Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(break|case|catch|next|default|do|else|finally|for|foreach|of|'
+             r'unless|if|new|return|switch|me|throw|try|while)\b', Keyword),
+            (r'(extends|private|protected|public|static|throws|function|method|'
+             r'operator)\b', Keyword.Declaration),
+            (r'(true|false|null|__FILE__|__LINE__|__VERSION__|__LIB_PATH__|'
+             r'__INC_PATH__)\b', Keyword.Constant),
+            (r'(class|struct)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'class'),
+            (r'(import|include)(\s+)',
+             bygroups(Keyword.Namespace, Text), 'import'),
+            (words((
+                'gc_collect', 'gc_mm_items', 'gc_mm_usage', 'gc_collect_threshold',
+                'urlencode', 'urldecode', 'base64encode', 'base64decode', 'sha1', 'crc32',
+                'sha2', 'md5', 'md5_file', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos',
+                'cosh', 'exp', 'fabs', 'floor', 'fmod', 'log', 'log10', 'pow', 'sin',
+                'sinh', 'sqrt', 'tan', 'tanh', 'isint', 'isfloat', 'ischar', 'isstring',
+                'isarray', 'ismap', 'isalias', 'typeof', 'sizeof', 'toint', 'tostring',
+                'fromxml', 'toxml', 'binary', 'pack', 'load', 'eval', 'var_names',
+                'var_values', 'user_functions', 'dyn_functions', 'methods', 'call',
+                'call_method', 'mknod', 'mkfifo', 'mount', 'umount2', 'umount', 'ticks',
+                'usleep', 'sleep', 'time', 'strtime', 'strdate', 'dllopen', 'dlllink',
+                'dllcall', 'dllcall_argv', 'dllclose', 'env', 'exec', 'fork', 'getpid',
+                'wait', 'popen', 'pclose', 'exit', 'kill', 'pthread_create',
+                'pthread_create_argv', 'pthread_exit', 'pthread_join', 'pthread_kill',
+                'smtp_send', 'http_get', 'http_post', 'http_download', 'socket', 'bind',
+                'listen', 'accept', 'getsockname', 'getpeername', 'settimeout', 'connect',
+                'server', 'recv', 'send', 'close', 'print', 'println', 'printf', 'input',
+                'readline', 'serial_open', 'serial_fcntl', 'serial_get_attr',
+                'serial_get_ispeed', 'serial_get_ospeed', 'serial_set_attr',
+                'serial_set_ispeed', 'serial_set_ospeed', 'serial_write', 'serial_read',
+                'serial_close', 'xml_load', 'xml_parse', 'fopen', 'fseek', 'ftell',
+                'fsize', 'fread', 'fwrite', 'fgets', 'fclose', 'file', 'readdir',
+                'pcre_replace', 'size', 'pop', 'unmap', 'has', 'keys', 'values',
+                'length', 'find', 'substr', 'replace', 'split', 'trim', 'remove',
+                'contains', 'join'), suffix=r'\b'),
+             Name.Builtin),
+            (words((
+                'MethodReference', 'Runner', 'Dll', 'Thread', 'Pipe', 'Process',
+                'Runnable', 'CGI', 'ClientSocket', 'Socket', 'ServerSocket',
+                'File', 'Console', 'Directory', 'Exception'), suffix=r'\b'),
+             Keyword.Type),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),
+            (r'(\.)([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?\-@]+', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text),
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+
+class EasytrieveLexer(RegexLexer):
+    """
+    Easytrieve Plus is a programming language for extracting, filtering and
+    converting sequential data. Furthermore it can layout data for reports.
+    It is mainly used on mainframe platforms and can access several of the
+    mainframe's native file formats. It is somewhat comparable to awk.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Easytrieve'
+    aliases = ['easytrieve']
+    filenames = ['*.ezt', '*.mac']
+    mimetypes = ['text/x-easytrieve']
+    flags = 0
+
+    # Note: We cannot use r'\b' at the start and end of keywords because
+    # Easytrieve Plus delimiter characters are:
+    #
+    #   * space ( )
+    #   * apostrophe (')
+    #   * period (.)
+    #   * comma (,)
+    #   * paranthesis ( and )
+    #   * colon (:)
+    #
+    # Additionally words end once a '*' appears, indicatins a comment.
+    _DELIMITERS = r' \'.,():\n'
+    _DELIMITERS_OR_COMENT = _DELIMITERS + '*'
+    _DELIMITER_PATTERN = '[' + _DELIMITERS + ']'
+    _DELIMITER_PATTERN_CAPTURE = '(' + _DELIMITER_PATTERN + ')'
+    _NON_DELIMITER_OR_COMMENT_PATTERN = '[^' + _DELIMITERS_OR_COMENT + ']'
+    _OPERATORS_PATTERN = u'[.+\\-/=\\[\\](){}<>;,&%¬]'
+    _KEYWORDS = [
+        'AFTER-BREAK', 'AFTER-LINE', 'AFTER-SCREEN', 'AIM', 'AND', 'ATTR',
+        'BEFORE', 'BEFORE-BREAK', 'BEFORE-LINE', 'BEFORE-SCREEN', 'BUSHU',
+        'BY', 'CALL', 'CASE', 'CHECKPOINT', 'CHKP', 'CHKP-STATUS', 'CLEAR',
+        'CLOSE', 'COL', 'COLOR', 'COMMIT', 'CONTROL', 'COPY', 'CURSOR', 'D',
+        'DECLARE', 'DEFAULT', 'DEFINE', 'DELETE', 'DENWA', 'DISPLAY', 'DLI',
+        'DO', 'DUPLICATE', 'E', 'ELSE', 'ELSE-IF', 'END', 'END-CASE',
+        'END-DO', 'END-IF', 'END-PROC', 'ENDPAGE', 'ENDTABLE', 'ENTER', 'EOF',
+        'EQ', 'ERROR', 'EXIT', 'EXTERNAL', 'EZLIB', 'F1', 'F10', 'F11', 'F12',
+        'F13', 'F14', 'F15', 'F16', 'F17', 'F18', 'F19', 'F2', 'F20', 'F21',
+        'F22', 'F23', 'F24', 'F25', 'F26', 'F27', 'F28', 'F29', 'F3', 'F30',
+        'F31', 'F32', 'F33', 'F34', 'F35', 'F36', 'F4', 'F5', 'F6', 'F7',
+        'F8', 'F9', 'FETCH', 'FILE-STATUS', 'FILL', 'FINAL', 'FIRST',
+        'FIRST-DUP', 'FOR', 'GE', 'GET', 'GO', 'GOTO', 'GQ', 'GR', 'GT',
+        'HEADING', 'HEX', 'HIGH-VALUES', 'IDD', 'IDMS', 'IF', 'IN', 'INSERT',
+        'JUSTIFY', 'KANJI-DATE', 'KANJI-DATE-LONG', 'KANJI-TIME', 'KEY',
+        'KEY-PRESSED', 'KOKUGO', 'KUN', 'LAST-DUP', 'LE', 'LEVEL', 'LIKE',
+        'LINE', 'LINE-COUNT', 'LINE-NUMBER', 'LINK', 'LIST', 'LOW-VALUES',
+        'LQ', 'LS', 'LT', 'MACRO', 'MASK', 'MATCHED', 'MEND', 'MESSAGE',
+        'MOVE', 'MSTART', 'NE', 'NEWPAGE', 'NOMASK', 'NOPRINT', 'NOT',
+        'NOTE', 'NOVERIFY', 'NQ', 'NULL', 'OF', 'OR', 'OTHERWISE', 'PA1',
+        'PA2', 'PA3', 'PAGE-COUNT', 'PAGE-NUMBER', 'PARM-REGISTER',
+        'PATH-ID', 'PATTERN', 'PERFORM', 'POINT', 'POS', 'PRIMARY', 'PRINT',
+        'PROCEDURE', 'PROGRAM', 'PUT', 'READ', 'RECORD', 'RECORD-COUNT',
+        'RECORD-LENGTH', 'REFRESH', 'RELEASE', 'RENUM', 'REPEAT', 'REPORT',
+        'REPORT-INPUT', 'RESHOW', 'RESTART', 'RETRIEVE', 'RETURN-CODE',
+        'ROLLBACK', 'ROW', 'S', 'SCREEN', 'SEARCH', 'SECONDARY', 'SELECT',
+        'SEQUENCE', 'SIZE', 'SKIP', 'SOKAKU', 'SORT', 'SQL', 'STOP', 'SUM',
+        'SYSDATE', 'SYSDATE-LONG', 'SYSIN', 'SYSIPT', 'SYSLST', 'SYSPRINT',
+        'SYSSNAP', 'SYSTIME', 'TALLY', 'TERM-COLUMNS', 'TERM-NAME',
+        'TERM-ROWS', 'TERMINATION', 'TITLE', 'TO', 'TRANSFER', 'TRC',
+        'UNIQUE', 'UNTIL', 'UPDATE', 'UPPERCASE', 'USER', 'USERID', 'VALUE',
+        'VERIFY', 'W', 'WHEN', 'WHILE', 'WORK', 'WRITE', 'X', 'XDM', 'XRST'
+    ]
+
+    tokens = {
+        'root': [
+            (r'\*.*\n', Comment.Single),
+            (r'\n+', Whitespace),
+            # Macro argument
+            (r'&' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+\.', Name.Variable,
+             'after_macro_argument'),
+            # Macro call
+            (r'%' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Variable),
+            (r'(FILE|MACRO|REPORT)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'after_declaration'),
+            (r'(JOB|PARM)' + r'(' + _DELIMITER_PATTERN + r')',
+             bygroups(Keyword.Declaration, Operator)),
+            (words(_KEYWORDS, suffix=_DELIMITER_PATTERN_CAPTURE),
+             bygroups(Keyword.Reserved, Operator)),
+            (_OPERATORS_PATTERN, Operator),
+            # Procedure declaration
+            (r'(' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+)(\s*)(\.?)(\s*)(PROC)(\s*\n)',
+             bygroups(Name.Function, Whitespace, Operator, Whitespace,
+                      Keyword.Declaration, Whitespace)),
+            (r'[0-9]+\.[0-9]*', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r"'(''|[^'])*'", String),
+            (r'\s+', Whitespace),
+            # Everything else just belongs to a name
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name),
+         ],
+        'after_declaration': [
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Function),
+            default('#pop'),
+        ],
+        'after_macro_argument': [
+            (r'\*.*\n', Comment.Single, '#pop'),
+            (r'\s+', Whitespace, '#pop'),
+            (_OPERATORS_PATTERN, Operator, '#pop'),
+            (r"'(''|[^'])*'", String, '#pop'),
+            # Everything else just belongs to a name
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name),
+        ],
+    }
+    _COMMENT_LINE_REGEX = re.compile(r'^\s*\*')
+    _MACRO_HEADER_REGEX = re.compile(r'^\s*MACRO')
+
+    def analyse_text(text):
+        """
+        Perform a structural analysis for basic Easytrieve constructs.
+        """
+        result = 0.0
+        lines = text.split('\n')
+        hasEndProc = False
+        hasHeaderComment = False
+        hasFile = False
+        hasJob = False
+        hasProc = False
+        hasParm = False
+        hasReport = False
+
+        def isCommentLine(line):
+            return EasytrieveLexer._COMMENT_LINE_REGEX.match(lines[0]) is not None
+
+        def isEmptyLine(line):
+            return not bool(line.strip())
+
+        # Remove possible empty lines and header comments.
+        while lines and (isEmptyLine(lines[0]) or isCommentLine(lines[0])):
+            if not isEmptyLine(lines[0]):
+                hasHeaderComment = True
+            del lines[0]
+
+        if EasytrieveLexer._MACRO_HEADER_REGEX.match(lines[0]):
+            # Looks like an Easytrieve macro.
+            result = 0.4
+            if hasHeaderComment:
+                result += 0.4
+        else:
+            # Scan the source for lines starting with indicators.
+            for line in lines:
+                words = line.split()
+                if (len(words) >= 2):
+                    firstWord = words[0]
+                    if not hasReport:
+                        if not hasJob:
+                            if not hasFile:
+                                if not hasParm:
+                                    if firstWord == 'PARM':
+                                        hasParm = True
+                                if firstWord == 'FILE':
+                                    hasFile = True
+                            if firstWord == 'JOB':
+                                hasJob = True
+                        elif firstWord == 'PROC':
+                            hasProc = True
+                        elif firstWord == 'END-PROC':
+                            hasEndProc = True
+                        elif firstWord == 'REPORT':
+                            hasReport = True
+
+            # Weight the findings.
+            if hasJob and (hasProc == hasEndProc):
+                if hasHeaderComment:
+                    result += 0.1
+                if hasParm:
+                    if hasProc:
+                        # Found PARM, JOB and PROC/END-PROC:
+                        # pretty sure this is Easytrieve.
+                        result += 0.8
+                    else:
+                        # Found PARAM and  JOB: probably this is Easytrieve
+                        result += 0.5
+                else:
+                    # Found JOB and possibly other keywords: might be Easytrieve
+                    result += 0.11
+                    if hasParm:
+                        # Note: PARAM is not a proper English word, so this is
+                        # regarded a much better indicator for Easytrieve than
+                        # the other words.
+                        result += 0.2
+                    if hasFile:
+                        result += 0.01
+                    if hasReport:
+                        result += 0.01
+        assert 0.0 <= result <= 1.0
+        return result
+
+
+class JclLexer(RegexLexer):
+    """
+    `Job Control Language (JCL)
+    <http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/IEA2B570/CCONTENTS>`_
+    is a scripting language used on mainframe platforms to instruct the system
+    on how to run a batch job or start a subsystem. It is somewhat
+    comparable to MS DOS batch and Unix shell scripts.
+
+    .. versionadded:: 2.1
+    """
+    name = 'JCL'
+    aliases = ['jcl']
+    filenames = ['*.jcl']
+    mimetypes = ['text/x-jcl']
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'//\*.*\n', Comment.Single),
+            (r'//', Keyword.Pseudo, 'statement'),
+            (r'/\*', Keyword.Pseudo, 'jes2_statement'),
+            # TODO: JES3 statement
+            (r'.*\n', Other)  # Input text or inline code in any language.
+        ],
+        'statement': [
+            (r'\s*\n', Whitespace, '#pop'),
+            (r'([a-z]\w*)(\s+)(exec|job)(\s*)',
+             bygroups(Name.Label, Whitespace, Keyword.Reserved, Whitespace),
+             'option'),
+            (r'[a-z]\w*', Name.Variable, 'statement_command'),
+            (r'\s+', Whitespace, 'statement_command'),
+        ],
+        'statement_command': [
+            (r'\s+(command|cntl|dd|endctl|endif|else|include|jcllib|'
+             r'output|pend|proc|set|then|xmit)\s+', Keyword.Reserved, 'option'),
+            include('option')
+        ],
+        'jes2_statement': [
+            (r'\s*\n', Whitespace, '#pop'),
+            (r'\$', Keyword, 'option'),
+            (r'\b(jobparam|message|netacct|notify|output|priority|route|'
+             r'setup|signoff|xeq|xmit)\b', Keyword, 'option'),
+        ],
+        'option': [
+            # (r'\n', Text, 'root'),
+            (r'\*', Name.Builtin),
+            (r'[\[\](){}<>;,]', Punctuation),
+            (r'[-+*/=&%]', Operator),
+            (r'[a-z_]\w*', Name),
+            (r'\d+\.\d*', Number.Float),
+            (r'\.\d+', Number.Float),
+            (r'\d+', Number.Integer),
+            (r"'", String, 'option_string'),
+            (r'[ \t]+', Whitespace, 'option_comment'),
+            (r'\.', Punctuation),
+        ],
+        'option_string': [
+            (r"(\n)(//)", bygroups(Text, Keyword.Pseudo)),
+            (r"''", String),
+            (r"[^']", String),
+            (r"'", String, '#pop'),
+        ],
+        'option_comment': [
+            # (r'\n', Text, 'root'),
+            (r'.+', Comment.Single),
+        ]
+    }
+
+    _JOB_HEADER_PATTERN = re.compile(r'^//[a-z#$@][a-z0-9#$@]{0,7}\s+job(\s+.*)?$',
+                                     re.IGNORECASE)
+
+    def analyse_text(text):
+        """
+        Recognize JCL job by header.
+        """
+        result = 0.0
+        lines = text.split('\n')
+        if len(lines) > 0:
+            if JclLexer._JOB_HEADER_PATTERN.match(lines[0]):
+                result = 1.0
+        assert 0.0 <= result <= 1.0
+        return result
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/actionscript.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/actionscript.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/actionscript.py	(revision 1126)
@@ -0,0 +1,240 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.actionscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for ActionScript and MXML.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, using, this, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['ActionScriptLexer', 'ActionScript3Lexer', 'MxmlLexer']
+
+
+class ActionScriptLexer(RegexLexer):
+    """
+    For ActionScript source code.
+
+    .. versionadded:: 0.9
+    """
+
+    name = 'ActionScript'
+    aliases = ['as', 'actionscript']
+    filenames = ['*.as']
+    mimetypes = ['application/x-actionscript', 'text/x-actionscript',
+                 'text/actionscript']
+
+    flags = re.DOTALL
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'/(\\\\|\\/|[^/\n])*/[gim]*', String.Regex),
+            (r'[~^*!%&<>|+=:;,/?\\-]+', Operator),
+            (r'[{}\[\]();.]+', Punctuation),
+            (words((
+                'case', 'default', 'for', 'each', 'in', 'while', 'do', 'break',
+                'return', 'continue', 'if', 'else', 'throw', 'try', 'catch',
+                'var', 'with', 'new', 'typeof', 'arguments', 'instanceof', 'this',
+                'switch'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'class', 'public', 'final', 'internal', 'native', 'override', 'private',
+                'protected', 'static', 'import', 'extends', 'implements', 'interface',
+                'intrinsic', 'return', 'super', 'dynamic', 'function', 'const', 'get',
+                'namespace', 'package', 'set'), suffix=r'\b'),
+             Keyword.Declaration),
+            (r'(true|false|null|NaN|Infinity|-Infinity|undefined|Void)\b',
+             Keyword.Constant),
+            (words((
+                'Accessibility', 'AccessibilityProperties', 'ActionScriptVersion',
+                'ActivityEvent', 'AntiAliasType', 'ApplicationDomain', 'AsBroadcaster', 'Array',
+                'AsyncErrorEvent', 'AVM1Movie', 'BevelFilter', 'Bitmap', 'BitmapData',
+                'BitmapDataChannel', 'BitmapFilter', 'BitmapFilterQuality', 'BitmapFilterType',
+                'BlendMode', 'BlurFilter', 'Boolean', 'ByteArray', 'Camera', 'Capabilities', 'CapsStyle',
+                'Class', 'Color', 'ColorMatrixFilter', 'ColorTransform', 'ContextMenu',
+                'ContextMenuBuiltInItems', 'ContextMenuEvent', 'ContextMenuItem',
+                'ConvultionFilter', 'CSMSettings', 'DataEvent', 'Date', 'DefinitionError',
+                'DeleteObjectSample', 'Dictionary', 'DisplacmentMapFilter', 'DisplayObject',
+                'DisplacmentMapFilterMode', 'DisplayObjectContainer', 'DropShadowFilter',
+                'Endian', 'EOFError', 'Error', 'ErrorEvent', 'EvalError', 'Event', 'EventDispatcher',
+                'EventPhase', 'ExternalInterface', 'FileFilter', 'FileReference',
+                'FileReferenceList', 'FocusDirection', 'FocusEvent', 'Font', 'FontStyle', 'FontType',
+                'FrameLabel', 'FullScreenEvent', 'Function', 'GlowFilter', 'GradientBevelFilter',
+                'GradientGlowFilter', 'GradientType', 'Graphics', 'GridFitType', 'HTTPStatusEvent',
+                'IBitmapDrawable', 'ID3Info', 'IDataInput', 'IDataOutput', 'IDynamicPropertyOutput'
+                'IDynamicPropertyWriter', 'IEventDispatcher', 'IExternalizable',
+                'IllegalOperationError', 'IME', 'IMEConversionMode', 'IMEEvent', 'int',
+                'InteractiveObject', 'InterpolationMethod', 'InvalidSWFError', 'InvokeEvent',
+                'IOError', 'IOErrorEvent', 'JointStyle', 'Key', 'Keyboard', 'KeyboardEvent', 'KeyLocation',
+                'LineScaleMode', 'Loader', 'LoaderContext', 'LoaderInfo', 'LoadVars', 'LocalConnection',
+                'Locale', 'Math', 'Matrix', 'MemoryError', 'Microphone', 'MorphShape', 'Mouse', 'MouseEvent',
+                'MovieClip', 'MovieClipLoader', 'Namespace', 'NetConnection', 'NetStatusEvent',
+                'NetStream', 'NewObjectSample', 'Number', 'Object', 'ObjectEncoding', 'PixelSnapping',
+                'Point', 'PrintJob', 'PrintJobOptions', 'PrintJobOrientation', 'ProgressEvent', 'Proxy',
+                'QName', 'RangeError', 'Rectangle', 'ReferenceError', 'RegExp', 'Responder', 'Sample',
+                'Scene', 'ScriptTimeoutError', 'Security', 'SecurityDomain', 'SecurityError',
+                'SecurityErrorEvent', 'SecurityPanel', 'Selection', 'Shape', 'SharedObject',
+                'SharedObjectFlushStatus', 'SimpleButton', 'Socket', 'Sound', 'SoundChannel',
+                'SoundLoaderContext', 'SoundMixer', 'SoundTransform', 'SpreadMethod', 'Sprite',
+                'StackFrame', 'StackOverflowError', 'Stage', 'StageAlign', 'StageDisplayState',
+                'StageQuality', 'StageScaleMode', 'StaticText', 'StatusEvent', 'String', 'StyleSheet',
+                'SWFVersion', 'SyncEvent', 'SyntaxError', 'System', 'TextColorType', 'TextField',
+                'TextFieldAutoSize', 'TextFieldType', 'TextFormat', 'TextFormatAlign',
+                'TextLineMetrics', 'TextRenderer', 'TextSnapshot', 'Timer', 'TimerEvent', 'Transform',
+                'TypeError', 'uint', 'URIError', 'URLLoader', 'URLLoaderDataFormat', 'URLRequest',
+                'URLRequestHeader', 'URLRequestMethod', 'URLStream', 'URLVariabeles', 'VerifyError',
+                'Video', 'XML', 'XMLDocument', 'XMLList', 'XMLNode', 'XMLNodeType', 'XMLSocket',
+                'XMLUI'), suffix=r'\b'),
+             Name.Builtin),
+            (words((
+                'decodeURI', 'decodeURIComponent', 'encodeURI', 'escape', 'eval', 'isFinite', 'isNaN',
+                'isXMLName', 'clearInterval', 'fscommand', 'getTimer', 'getURL', 'getVersion',
+                'parseFloat', 'parseInt', 'setInterval', 'trace', 'updateAfterEvent',
+                'unescape'), suffix=r'\b'),
+             Name.Function),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+        ]
+    }
+
+
+class ActionScript3Lexer(RegexLexer):
+    """
+    For ActionScript 3 source code.
+
+    .. versionadded:: 0.11
+    """
+
+    name = 'ActionScript 3'
+    aliases = ['as3', 'actionscript3']
+    filenames = ['*.as']
+    mimetypes = ['application/x-actionscript3', 'text/x-actionscript3',
+                 'text/actionscript3']
+
+    identifier = r'[$a-zA-Z_]\w*'
+    typeidentifier = identifier + '(?:\.<\w+>)?'
+
+    flags = re.DOTALL | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(function\s+)(' + identifier + r')(\s*)(\()',
+             bygroups(Keyword.Declaration, Name.Function, Text, Operator),
+             'funcparams'),
+            (r'(var|const)(\s+)(' + identifier + r')(\s*)(:)(\s*)(' +
+             typeidentifier + r')',
+             bygroups(Keyword.Declaration, Text, Name, Text, Punctuation, Text,
+                      Keyword.Type)),
+            (r'(import|package)(\s+)((?:' + identifier + r'|\.)+)(\s*)',
+             bygroups(Keyword, Text, Name.Namespace, Text)),
+            (r'(new)(\s+)(' + typeidentifier + r')(\s*)(\()',
+             bygroups(Keyword, Text, Keyword.Type, Text, Operator)),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'/(\\\\|\\/|[^\n])*/[gisx]*', String.Regex),
+            (r'(\.)(' + identifier + r')', bygroups(Operator, Name.Attribute)),
+            (r'(case|default|for|each|in|while|do|break|return|continue|if|else|'
+             r'throw|try|catch|with|new|typeof|arguments|instanceof|this|'
+             r'switch|import|include|as|is)\b',
+             Keyword),
+            (r'(class|public|final|internal|native|override|private|protected|'
+             r'static|import|extends|implements|interface|intrinsic|return|super|'
+             r'dynamic|function|const|get|namespace|package|set)\b',
+             Keyword.Declaration),
+            (r'(true|false|null|NaN|Infinity|-Infinity|undefined|void)\b',
+             Keyword.Constant),
+            (r'(decodeURI|decodeURIComponent|encodeURI|escape|eval|isFinite|isNaN|'
+             r'isXMLName|clearInterval|fscommand|getTimer|getURL|getVersion|'
+             r'isFinite|parseFloat|parseInt|setInterval|trace|updateAfterEvent|'
+             r'unescape)\b', Name.Function),
+            (identifier, Name),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'[~^*!%&<>|+=:;,/?\\{}\[\]().-]+', Operator),
+        ],
+        'funcparams': [
+            (r'\s+', Text),
+            (r'(\s*)(\.\.\.)?(' + identifier + r')(\s*)(:)(\s*)(' +
+             typeidentifier + r'|\*)(\s*)',
+             bygroups(Text, Punctuation, Name, Text, Operator, Text,
+                      Keyword.Type, Text), 'defval'),
+            (r'\)', Operator, 'type')
+        ],
+        'type': [
+            (r'(\s*)(:)(\s*)(' + typeidentifier + r'|\*)',
+             bygroups(Text, Operator, Text, Keyword.Type), '#pop:2'),
+            (r'\s+', Text, '#pop:2'),
+            default('#pop:2')
+        ],
+        'defval': [
+            (r'(=)(\s*)([^(),]+)(\s*)(,?)',
+             bygroups(Operator, Text, using(this), Text, Operator), '#pop'),
+            (r',', Operator, '#pop'),
+            default('#pop')
+        ]
+    }
+
+    def analyse_text(text):
+        if re.match(r'\w+\s*:\s*\w', text):
+            return 0.3
+        return 0
+
+
+class MxmlLexer(RegexLexer):
+    """
+    For MXML markup.
+    Nested AS3 in <script> tags is highlighted by the appropriate lexer.
+
+    .. versionadded:: 1.1
+    """
+    flags = re.MULTILINE | re.DOTALL
+    name = 'MXML'
+    aliases = ['mxml']
+    filenames = ['*.mxml']
+    mimetimes = ['text/xml', 'application/xml']
+
+    tokens = {
+        'root': [
+            ('[^<&]+', Text),
+            (r'&\S*?;', Name.Entity),
+            (r'(\<\!\[CDATA\[)(.*?)(\]\]\>)',
+             bygroups(String, using(ActionScript3Lexer), String)),
+            ('<!--', Comment, 'comment'),
+            (r'<\?.*?\?>', Comment.Preproc),
+            ('<![^>]*>', Comment.Preproc),
+            (r'<\s*[\w:.-]+', Name.Tag, 'tag'),
+            (r'<\s*/\s*[\w:.-]+\s*>', Name.Tag),
+        ],
+        'comment': [
+            ('[^-]+', Comment),
+            ('-->', Comment, '#pop'),
+            ('-', Comment),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'[\w.:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'attr': [
+            ('\s+', Text),
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_asy_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_asy_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_asy_builtins.py	(revision 1126)
@@ -0,0 +1,1645 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._asy_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the asy-function names and asy-variable names of
+    Asymptote.
+
+    Do not edit the ASYFUNCNAME and ASYVARNAME sets by hand.
+    TODO: perl/python script in Asymptote SVN similar to asy-list.pl but only
+    for function and variable names.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+ASYFUNCNAME = set((
+    'AND',
+    'Arc',
+    'ArcArrow',
+    'ArcArrows',
+    'Arrow',
+    'Arrows',
+    'Automatic',
+    'AvantGarde',
+    'BBox',
+    'BWRainbow',
+    'BWRainbow2',
+    'Bar',
+    'Bars',
+    'BeginArcArrow',
+    'BeginArrow',
+    'BeginBar',
+    'BeginDotMargin',
+    'BeginMargin',
+    'BeginPenMargin',
+    'Blank',
+    'Bookman',
+    'Bottom',
+    'BottomTop',
+    'Bounds',
+    'Break',
+    'Broken',
+    'BrokenLog',
+    'Ceil',
+    'Circle',
+    'CircleBarIntervalMarker',
+    'Cos',
+    'Courier',
+    'CrossIntervalMarker',
+    'DefaultFormat',
+    'DefaultLogFormat',
+    'Degrees',
+    'Dir',
+    'DotMargin',
+    'DotMargins',
+    'Dotted',
+    'Draw',
+    'Drawline',
+    'Embed',
+    'EndArcArrow',
+    'EndArrow',
+    'EndBar',
+    'EndDotMargin',
+    'EndMargin',
+    'EndPenMargin',
+    'Fill',
+    'FillDraw',
+    'Floor',
+    'Format',
+    'Full',
+    'Gaussian',
+    'Gaussrand',
+    'Gaussrandpair',
+    'Gradient',
+    'Grayscale',
+    'Helvetica',
+    'Hermite',
+    'HookHead',
+    'InOutTicks',
+    'InTicks',
+    'J',
+    'Label',
+    'Landscape',
+    'Left',
+    'LeftRight',
+    'LeftTicks',
+    'Legend',
+    'Linear',
+    'Link',
+    'Log',
+    'LogFormat',
+    'Margin',
+    'Margins',
+    'Mark',
+    'MidArcArrow',
+    'MidArrow',
+    'NOT',
+    'NewCenturySchoolBook',
+    'NoBox',
+    'NoMargin',
+    'NoModifier',
+    'NoTicks',
+    'NoTicks3',
+    'NoZero',
+    'NoZeroFormat',
+    'None',
+    'OR',
+    'OmitFormat',
+    'OmitTick',
+    'OutTicks',
+    'Ox',
+    'Oy',
+    'Palatino',
+    'PaletteTicks',
+    'Pen',
+    'PenMargin',
+    'PenMargins',
+    'Pentype',
+    'Portrait',
+    'RadialShade',
+    'Rainbow',
+    'Range',
+    'Relative',
+    'Right',
+    'RightTicks',
+    'Rotate',
+    'Round',
+    'SQR',
+    'Scale',
+    'ScaleX',
+    'ScaleY',
+    'ScaleZ',
+    'Seascape',
+    'Shift',
+    'Sin',
+    'Slant',
+    'Spline',
+    'StickIntervalMarker',
+    'Straight',
+    'Symbol',
+    'Tan',
+    'TeXify',
+    'Ticks',
+    'Ticks3',
+    'TildeIntervalMarker',
+    'TimesRoman',
+    'Top',
+    'TrueMargin',
+    'UnFill',
+    'UpsideDown',
+    'Wheel',
+    'X',
+    'XEquals',
+    'XOR',
+    'XY',
+    'XYEquals',
+    'XYZero',
+    'XYgrid',
+    'XZEquals',
+    'XZZero',
+    'XZero',
+    'XZgrid',
+    'Y',
+    'YEquals',
+    'YXgrid',
+    'YZ',
+    'YZEquals',
+    'YZZero',
+    'YZero',
+    'YZgrid',
+    'Z',
+    'ZX',
+    'ZXgrid',
+    'ZYgrid',
+    'ZapfChancery',
+    'ZapfDingbats',
+    '_cputime',
+    '_draw',
+    '_eval',
+    '_image',
+    '_labelpath',
+    '_projection',
+    '_strokepath',
+    '_texpath',
+    'aCos',
+    'aSin',
+    'aTan',
+    'abort',
+    'abs',
+    'accel',
+    'acos',
+    'acosh',
+    'acot',
+    'acsc',
+    'add',
+    'addArrow',
+    'addMargins',
+    'addSaveFunction',
+    'addnode',
+    'addnodes',
+    'addpenarc',
+    'addpenline',
+    'addseg',
+    'adjust',
+    'alias',
+    'align',
+    'all',
+    'altitude',
+    'angabscissa',
+    'angle',
+    'angpoint',
+    'animate',
+    'annotate',
+    'anticomplementary',
+    'antipedal',
+    'apply',
+    'approximate',
+    'arc',
+    'arcarrowsize',
+    'arccircle',
+    'arcdir',
+    'arcfromcenter',
+    'arcfromfocus',
+    'arclength',
+    'arcnodesnumber',
+    'arcpoint',
+    'arcsubtended',
+    'arcsubtendedcenter',
+    'arctime',
+    'arctopath',
+    'array',
+    'arrow',
+    'arrow2',
+    'arrowbase',
+    'arrowbasepoints',
+    'arrowsize',
+    'asec',
+    'asin',
+    'asinh',
+    'ask',
+    'assert',
+    'asy',
+    'asycode',
+    'asydir',
+    'asyfigure',
+    'asyfilecode',
+    'asyinclude',
+    'asywrite',
+    'atan',
+    'atan2',
+    'atanh',
+    'atbreakpoint',
+    'atexit',
+    'atime',
+    'attach',
+    'attract',
+    'atupdate',
+    'autoformat',
+    'autoscale',
+    'autoscale3',
+    'axes',
+    'axes3',
+    'axialshade',
+    'axis',
+    'axiscoverage',
+    'azimuth',
+    'babel',
+    'background',
+    'bangles',
+    'bar',
+    'barmarksize',
+    'barsize',
+    'basealign',
+    'baseline',
+    'bbox',
+    'beep',
+    'begin',
+    'beginclip',
+    'begingroup',
+    'beginpoint',
+    'between',
+    'bevel',
+    'bezier',
+    'bezierP',
+    'bezierPP',
+    'bezierPPP',
+    'bezulate',
+    'bibliography',
+    'bibliographystyle',
+    'binarytree',
+    'binarytreeNode',
+    'binomial',
+    'binput',
+    'bins',
+    'bisector',
+    'bisectorpoint',
+    'blend',
+    'boutput',
+    'box',
+    'bqe',
+    'breakpoint',
+    'breakpoints',
+    'brick',
+    'buildRestoreDefaults',
+    'buildRestoreThunk',
+    'buildcycle',
+    'bulletcolor',
+    'canonical',
+    'canonicalcartesiansystem',
+    'cartesiansystem',
+    'case1',
+    'case2',
+    'case3',
+    'cbrt',
+    'cd',
+    'ceil',
+    'center',
+    'centerToFocus',
+    'centroid',
+    'cevian',
+    'change2',
+    'changecoordsys',
+    'checkSegment',
+    'checkconditionlength',
+    'checker',
+    'checklengths',
+    'checkposition',
+    'checktriangle',
+    'choose',
+    'circle',
+    'circlebarframe',
+    'circlemarkradius',
+    'circlenodesnumber',
+    'circumcenter',
+    'circumcircle',
+    'clamped',
+    'clear',
+    'clip',
+    'clipdraw',
+    'close',
+    'cmyk',
+    'code',
+    'colatitude',
+    'collect',
+    'collinear',
+    'color',
+    'colorless',
+    'colors',
+    'colorspace',
+    'comma',
+    'compassmark',
+    'complement',
+    'complementary',
+    'concat',
+    'concurrent',
+    'cone',
+    'conic',
+    'conicnodesnumber',
+    'conictype',
+    'conj',
+    'connect',
+    'containmentTree',
+    'contains',
+    'contour',
+    'contour3',
+    'controlSpecifier',
+    'convert',
+    'coordinates',
+    'coordsys',
+    'copy',
+    'cos',
+    'cosh',
+    'cot',
+    'countIntersections',
+    'cputime',
+    'crop',
+    'cropcode',
+    'cross',
+    'crossframe',
+    'crosshatch',
+    'crossmarksize',
+    'csc',
+    'cubicroots',
+    'curabscissa',
+    'curlSpecifier',
+    'curpoint',
+    'currentarrow',
+    'currentexitfunction',
+    'currentmomarrow',
+    'currentpolarconicroutine',
+    'curve',
+    'cut',
+    'cutafter',
+    'cutbefore',
+    'cyclic',
+    'cylinder',
+    'debugger',
+    'deconstruct',
+    'defaultdir',
+    'defaultformat',
+    'defaultpen',
+    'defined',
+    'degenerate',
+    'degrees',
+    'delete',
+    'deletepreamble',
+    'determinant',
+    'diagonal',
+    'diamond',
+    'diffdiv',
+    'dir',
+    'dirSpecifier',
+    'dirtime',
+    'display',
+    'distance',
+    'divisors',
+    'do_overpaint',
+    'dot',
+    'dotframe',
+    'dotsize',
+    'downcase',
+    'draw',
+    'drawAll',
+    'drawDoubleLine',
+    'drawFermion',
+    'drawGhost',
+    'drawGluon',
+    'drawMomArrow',
+    'drawPhoton',
+    'drawScalar',
+    'drawVertex',
+    'drawVertexBox',
+    'drawVertexBoxO',
+    'drawVertexBoxX',
+    'drawVertexO',
+    'drawVertexOX',
+    'drawVertexTriangle',
+    'drawVertexTriangleO',
+    'drawVertexX',
+    'drawarrow',
+    'drawarrow2',
+    'drawline',
+    'drawtick',
+    'duplicate',
+    'elle',
+    'ellipse',
+    'ellipsenodesnumber',
+    'embed',
+    'embed3',
+    'empty',
+    'enclose',
+    'end',
+    'endScript',
+    'endclip',
+    'endgroup',
+    'endl',
+    'endpoint',
+    'endpoints',
+    'eof',
+    'eol',
+    'equation',
+    'equations',
+    'erase',
+    'erasestep',
+    'erf',
+    'erfc',
+    'error',
+    'errorbar',
+    'errorbars',
+    'eval',
+    'excenter',
+    'excircle',
+    'exit',
+    'exitXasyMode',
+    'exitfunction',
+    'exp',
+    'expfactors',
+    'expi',
+    'expm1',
+    'exradius',
+    'extend',
+    'extension',
+    'extouch',
+    'fabs',
+    'factorial',
+    'fermat',
+    'fft',
+    'fhorner',
+    'figure',
+    'file',
+    'filecode',
+    'fill',
+    'filldraw',
+    'filloutside',
+    'fillrule',
+    'filltype',
+    'find',
+    'finite',
+    'finiteDifferenceJacobian',
+    'firstcut',
+    'firstframe',
+    'fit',
+    'fit2',
+    'fixedscaling',
+    'floor',
+    'flush',
+    'fmdefaults',
+    'fmod',
+    'focusToCenter',
+    'font',
+    'fontcommand',
+    'fontsize',
+    'foot',
+    'format',
+    'frac',
+    'frequency',
+    'fromCenter',
+    'fromFocus',
+    'fspline',
+    'functionshade',
+    'gamma',
+    'generate_random_backtrace',
+    'generateticks',
+    'gergonne',
+    'getc',
+    'getint',
+    'getpair',
+    'getreal',
+    'getstring',
+    'gettriple',
+    'gluon',
+    'gouraudshade',
+    'graph',
+    'graphic',
+    'gray',
+    'grestore',
+    'grid',
+    'grid3',
+    'gsave',
+    'halfbox',
+    'hatch',
+    'hdiffdiv',
+    'hermite',
+    'hex',
+    'histogram',
+    'history',
+    'hline',
+    'hprojection',
+    'hsv',
+    'hyperbola',
+    'hyperbolanodesnumber',
+    'hyperlink',
+    'hypot',
+    'identity',
+    'image',
+    'incenter',
+    'incentral',
+    'incircle',
+    'increasing',
+    'incrementposition',
+    'indexedTransform',
+    'indexedfigure',
+    'initXasyMode',
+    'initdefaults',
+    'input',
+    'inradius',
+    'insert',
+    'inside',
+    'integrate',
+    'interactive',
+    'interior',
+    'interp',
+    'interpolate',
+    'intersect',
+    'intersection',
+    'intersectionpoint',
+    'intersectionpoints',
+    'intersections',
+    'intouch',
+    'inverse',
+    'inversion',
+    'invisible',
+    'is3D',
+    'isDuplicate',
+    'isogonal',
+    'isogonalconjugate',
+    'isotomic',
+    'isotomicconjugate',
+    'isparabola',
+    'italic',
+    'item',
+    'key',
+    'kurtosis',
+    'kurtosisexcess',
+    'label',
+    'labelaxis',
+    'labelmargin',
+    'labelpath',
+    'labels',
+    'labeltick',
+    'labelx',
+    'labelx3',
+    'labely',
+    'labely3',
+    'labelz',
+    'labelz3',
+    'lastcut',
+    'latex',
+    'latitude',
+    'latticeshade',
+    'layer',
+    'layout',
+    'ldexp',
+    'leastsquares',
+    'legend',
+    'legenditem',
+    'length',
+    'lift',
+    'light',
+    'limits',
+    'line',
+    'linear',
+    'linecap',
+    'lineinversion',
+    'linejoin',
+    'linemargin',
+    'lineskip',
+    'linetype',
+    'linewidth',
+    'link',
+    'list',
+    'lm_enorm',
+    'lm_evaluate_default',
+    'lm_lmdif',
+    'lm_lmpar',
+    'lm_minimize',
+    'lm_print_default',
+    'lm_print_quiet',
+    'lm_qrfac',
+    'lm_qrsolv',
+    'locale',
+    'locate',
+    'locatefile',
+    'location',
+    'log',
+    'log10',
+    'log1p',
+    'logaxiscoverage',
+    'longitude',
+    'lookup',
+    'magnetize',
+    'makeNode',
+    'makedraw',
+    'makepen',
+    'map',
+    'margin',
+    'markangle',
+    'markangleradius',
+    'markanglespace',
+    'markarc',
+    'marker',
+    'markinterval',
+    'marknodes',
+    'markrightangle',
+    'markuniform',
+    'mass',
+    'masscenter',
+    'massformat',
+    'math',
+    'max',
+    'max3',
+    'maxbezier',
+    'maxbound',
+    'maxcoords',
+    'maxlength',
+    'maxratio',
+    'maxtimes',
+    'mean',
+    'medial',
+    'median',
+    'midpoint',
+    'min',
+    'min3',
+    'minbezier',
+    'minbound',
+    'minipage',
+    'minratio',
+    'mintimes',
+    'miterlimit',
+    'momArrowPath',
+    'momarrowsize',
+    'monotonic',
+    'multifigure',
+    'nativeformat',
+    'natural',
+    'needshipout',
+    'newl',
+    'newpage',
+    'newslide',
+    'newton',
+    'newtree',
+    'nextframe',
+    'nextnormal',
+    'nextpage',
+    'nib',
+    'nodabscissa',
+    'none',
+    'norm',
+    'normalvideo',
+    'notaknot',
+    'nowarn',
+    'numberpage',
+    'nurb',
+    'object',
+    'offset',
+    'onpath',
+    'opacity',
+    'opposite',
+    'orientation',
+    'orig_circlenodesnumber',
+    'orig_circlenodesnumber1',
+    'orig_draw',
+    'orig_ellipsenodesnumber',
+    'orig_ellipsenodesnumber1',
+    'orig_hyperbolanodesnumber',
+    'orig_parabolanodesnumber',
+    'origin',
+    'orthic',
+    'orthocentercenter',
+    'outformat',
+    'outline',
+    'outprefix',
+    'output',
+    'overloadedMessage',
+    'overwrite',
+    'pack',
+    'pad',
+    'pairs',
+    'palette',
+    'parabola',
+    'parabolanodesnumber',
+    'parallel',
+    'partialsum',
+    'path',
+    'path3',
+    'pattern',
+    'pause',
+    'pdf',
+    'pedal',
+    'periodic',
+    'perp',
+    'perpendicular',
+    'perpendicularmark',
+    'phantom',
+    'phi1',
+    'phi2',
+    'phi3',
+    'photon',
+    'piecewisestraight',
+    'point',
+    'polar',
+    'polarconicroutine',
+    'polargraph',
+    'polygon',
+    'postcontrol',
+    'postscript',
+    'pow10',
+    'ppoint',
+    'prc',
+    'prc0',
+    'precision',
+    'precontrol',
+    'prepend',
+    'print_random_addresses',
+    'project',
+    'projection',
+    'purge',
+    'pwhermite',
+    'quadrant',
+    'quadraticroots',
+    'quantize',
+    'quarticroots',
+    'quotient',
+    'radialshade',
+    'radians',
+    'radicalcenter',
+    'radicalline',
+    'radius',
+    'rand',
+    'randompath',
+    'rd',
+    'readline',
+    'realmult',
+    'realquarticroots',
+    'rectangle',
+    'rectangular',
+    'rectify',
+    'reflect',
+    'relabscissa',
+    'relative',
+    'relativedistance',
+    'reldir',
+    'relpoint',
+    'reltime',
+    'remainder',
+    'remark',
+    'removeDuplicates',
+    'rename',
+    'replace',
+    'report',
+    'resetdefaultpen',
+    'restore',
+    'restoredefaults',
+    'reverse',
+    'reversevideo',
+    'rf',
+    'rfind',
+    'rgb',
+    'rgba',
+    'rgbint',
+    'rms',
+    'rotate',
+    'rotateO',
+    'rotation',
+    'round',
+    'roundbox',
+    'roundedpath',
+    'roundrectangle',
+    'samecoordsys',
+    'sameside',
+    'sample',
+    'save',
+    'savedefaults',
+    'saveline',
+    'scale',
+    'scale3',
+    'scaleO',
+    'scaleT',
+    'scaleless',
+    'scientific',
+    'search',
+    'searchtree',
+    'sec',
+    'secondaryX',
+    'secondaryY',
+    'seconds',
+    'section',
+    'sector',
+    'seek',
+    'seekeof',
+    'segment',
+    'sequence',
+    'setpens',
+    'sgn',
+    'sgnd',
+    'sharpangle',
+    'sharpdegrees',
+    'shift',
+    'shiftless',
+    'shipout',
+    'shipout3',
+    'show',
+    'side',
+    'simeq',
+    'simpson',
+    'sin',
+    'single',
+    'sinh',
+    'size',
+    'size3',
+    'skewness',
+    'skip',
+    'slant',
+    'sleep',
+    'slope',
+    'slopefield',
+    'solve',
+    'solveBVP',
+    'sort',
+    'sourceline',
+    'sphere',
+    'split',
+    'sqrt',
+    'square',
+    'srand',
+    'standardizecoordsys',
+    'startScript',
+    'startTrembling',
+    'stdev',
+    'step',
+    'stickframe',
+    'stickmarksize',
+    'stickmarkspace',
+    'stop',
+    'straight',
+    'straightness',
+    'string',
+    'stripdirectory',
+    'stripextension',
+    'stripfile',
+    'strokepath',
+    'subdivide',
+    'subitem',
+    'subpath',
+    'substr',
+    'sum',
+    'surface',
+    'symmedial',
+    'symmedian',
+    'system',
+    'tab',
+    'tableau',
+    'tan',
+    'tangent',
+    'tangential',
+    'tangents',
+    'tanh',
+    'tell',
+    'tensionSpecifier',
+    'tensorshade',
+    'tex',
+    'texcolor',
+    'texify',
+    'texpath',
+    'texpreamble',
+    'texreset',
+    'texshipout',
+    'texsize',
+    'textpath',
+    'thick',
+    'thin',
+    'tick',
+    'tickMax',
+    'tickMax3',
+    'tickMin',
+    'tickMin3',
+    'ticklabelshift',
+    'ticklocate',
+    'tildeframe',
+    'tildemarksize',
+    'tile',
+    'tiling',
+    'time',
+    'times',
+    'title',
+    'titlepage',
+    'topbox',
+    'transform',
+    'transformation',
+    'transpose',
+    'tremble',
+    'trembleFuzz',
+    'tremble_circlenodesnumber',
+    'tremble_circlenodesnumber1',
+    'tremble_draw',
+    'tremble_ellipsenodesnumber',
+    'tremble_ellipsenodesnumber1',
+    'tremble_hyperbolanodesnumber',
+    'tremble_marknodes',
+    'tremble_markuniform',
+    'tremble_parabolanodesnumber',
+    'triangle',
+    'triangleAbc',
+    'triangleabc',
+    'triangulate',
+    'tricoef',
+    'tridiagonal',
+    'trilinear',
+    'trim',
+    'trueMagnetize',
+    'truepoint',
+    'tube',
+    'uncycle',
+    'unfill',
+    'uniform',
+    'unit',
+    'unitrand',
+    'unitsize',
+    'unityroot',
+    'unstraighten',
+    'upcase',
+    'updatefunction',
+    'uperiodic',
+    'upscale',
+    'uptodate',
+    'usepackage',
+    'usersetting',
+    'usetypescript',
+    'usleep',
+    'value',
+    'variance',
+    'variancebiased',
+    'vbox',
+    'vector',
+    'vectorfield',
+    'verbatim',
+    'view',
+    'vline',
+    'vperiodic',
+    'vprojection',
+    'warn',
+    'warning',
+    'windingnumber',
+    'write',
+    'xaxis',
+    'xaxis3',
+    'xaxis3At',
+    'xaxisAt',
+    'xequals',
+    'xinput',
+    'xlimits',
+    'xoutput',
+    'xpart',
+    'xscale',
+    'xscaleO',
+    'xtick',
+    'xtick3',
+    'xtrans',
+    'yaxis',
+    'yaxis3',
+    'yaxis3At',
+    'yaxisAt',
+    'yequals',
+    'ylimits',
+    'ypart',
+    'yscale',
+    'yscaleO',
+    'ytick',
+    'ytick3',
+    'ytrans',
+    'zaxis3',
+    'zaxis3At',
+    'zero',
+    'zero3',
+    'zlimits',
+    'zpart',
+    'ztick',
+    'ztick3',
+    'ztrans'
+))
+
+ASYVARNAME = set((
+    'AliceBlue',
+    'Align',
+    'Allow',
+    'AntiqueWhite',
+    'Apricot',
+    'Aqua',
+    'Aquamarine',
+    'Aspect',
+    'Azure',
+    'BeginPoint',
+    'Beige',
+    'Bisque',
+    'Bittersweet',
+    'Black',
+    'BlanchedAlmond',
+    'Blue',
+    'BlueGreen',
+    'BlueViolet',
+    'Both',
+    'Break',
+    'BrickRed',
+    'Brown',
+    'BurlyWood',
+    'BurntOrange',
+    'CCW',
+    'CW',
+    'CadetBlue',
+    'CarnationPink',
+    'Center',
+    'Centered',
+    'Cerulean',
+    'Chartreuse',
+    'Chocolate',
+    'Coeff',
+    'Coral',
+    'CornflowerBlue',
+    'Cornsilk',
+    'Crimson',
+    'Crop',
+    'Cyan',
+    'Dandelion',
+    'DarkBlue',
+    'DarkCyan',
+    'DarkGoldenrod',
+    'DarkGray',
+    'DarkGreen',
+    'DarkKhaki',
+    'DarkMagenta',
+    'DarkOliveGreen',
+    'DarkOrange',
+    'DarkOrchid',
+    'DarkRed',
+    'DarkSalmon',
+    'DarkSeaGreen',
+    'DarkSlateBlue',
+    'DarkSlateGray',
+    'DarkTurquoise',
+    'DarkViolet',
+    'DeepPink',
+    'DeepSkyBlue',
+    'DefaultHead',
+    'DimGray',
+    'DodgerBlue',
+    'Dotted',
+    'Draw',
+    'E',
+    'ENE',
+    'EPS',
+    'ESE',
+    'E_Euler',
+    'E_PC',
+    'E_RK2',
+    'E_RK3BS',
+    'Emerald',
+    'EndPoint',
+    'Euler',
+    'Fill',
+    'FillDraw',
+    'FireBrick',
+    'FloralWhite',
+    'ForestGreen',
+    'Fuchsia',
+    'Gainsboro',
+    'GhostWhite',
+    'Gold',
+    'Goldenrod',
+    'Gray',
+    'Green',
+    'GreenYellow',
+    'Honeydew',
+    'HookHead',
+    'Horizontal',
+    'HotPink',
+    'I',
+    'IgnoreAspect',
+    'IndianRed',
+    'Indigo',
+    'Ivory',
+    'JOIN_IN',
+    'JOIN_OUT',
+    'JungleGreen',
+    'Khaki',
+    'LM_DWARF',
+    'LM_MACHEP',
+    'LM_SQRT_DWARF',
+    'LM_SQRT_GIANT',
+    'LM_USERTOL',
+    'Label',
+    'Lavender',
+    'LavenderBlush',
+    'LawnGreen',
+    'LeftJustified',
+    'LeftSide',
+    'LemonChiffon',
+    'LightBlue',
+    'LightCoral',
+    'LightCyan',
+    'LightGoldenrodYellow',
+    'LightGreen',
+    'LightGrey',
+    'LightPink',
+    'LightSalmon',
+    'LightSeaGreen',
+    'LightSkyBlue',
+    'LightSlateGray',
+    'LightSteelBlue',
+    'LightYellow',
+    'Lime',
+    'LimeGreen',
+    'Linear',
+    'Linen',
+    'Log',
+    'Logarithmic',
+    'Magenta',
+    'Mahogany',
+    'Mark',
+    'MarkFill',
+    'Maroon',
+    'Max',
+    'MediumAquamarine',
+    'MediumBlue',
+    'MediumOrchid',
+    'MediumPurple',
+    'MediumSeaGreen',
+    'MediumSlateBlue',
+    'MediumSpringGreen',
+    'MediumTurquoise',
+    'MediumVioletRed',
+    'Melon',
+    'MidPoint',
+    'MidnightBlue',
+    'Min',
+    'MintCream',
+    'MistyRose',
+    'Moccasin',
+    'Move',
+    'MoveQuiet',
+    'Mulberry',
+    'N',
+    'NE',
+    'NNE',
+    'NNW',
+    'NW',
+    'NavajoWhite',
+    'Navy',
+    'NavyBlue',
+    'NoAlign',
+    'NoCrop',
+    'NoFill',
+    'NoSide',
+    'OldLace',
+    'Olive',
+    'OliveDrab',
+    'OliveGreen',
+    'Orange',
+    'OrangeRed',
+    'Orchid',
+    'Ox',
+    'Oy',
+    'PC',
+    'PaleGoldenrod',
+    'PaleGreen',
+    'PaleTurquoise',
+    'PaleVioletRed',
+    'PapayaWhip',
+    'Peach',
+    'PeachPuff',
+    'Periwinkle',
+    'Peru',
+    'PineGreen',
+    'Pink',
+    'Plum',
+    'PowderBlue',
+    'ProcessBlue',
+    'Purple',
+    'RK2',
+    'RK3',
+    'RK3BS',
+    'RK4',
+    'RK5',
+    'RK5DP',
+    'RK5F',
+    'RawSienna',
+    'Red',
+    'RedOrange',
+    'RedViolet',
+    'Rhodamine',
+    'RightJustified',
+    'RightSide',
+    'RosyBrown',
+    'RoyalBlue',
+    'RoyalPurple',
+    'RubineRed',
+    'S',
+    'SE',
+    'SSE',
+    'SSW',
+    'SW',
+    'SaddleBrown',
+    'Salmon',
+    'SandyBrown',
+    'SeaGreen',
+    'Seashell',
+    'Sepia',
+    'Sienna',
+    'Silver',
+    'SimpleHead',
+    'SkyBlue',
+    'SlateBlue',
+    'SlateGray',
+    'Snow',
+    'SpringGreen',
+    'SteelBlue',
+    'Suppress',
+    'SuppressQuiet',
+    'Tan',
+    'TeXHead',
+    'Teal',
+    'TealBlue',
+    'Thistle',
+    'Ticksize',
+    'Tomato',
+    'Turquoise',
+    'UnFill',
+    'VERSION',
+    'Value',
+    'Vertical',
+    'Violet',
+    'VioletRed',
+    'W',
+    'WNW',
+    'WSW',
+    'Wheat',
+    'White',
+    'WhiteSmoke',
+    'WildStrawberry',
+    'XYAlign',
+    'YAlign',
+    'Yellow',
+    'YellowGreen',
+    'YellowOrange',
+    'addpenarc',
+    'addpenline',
+    'align',
+    'allowstepping',
+    'angularsystem',
+    'animationdelay',
+    'appendsuffix',
+    'arcarrowangle',
+    'arcarrowfactor',
+    'arrow2sizelimit',
+    'arrowangle',
+    'arrowbarb',
+    'arrowdir',
+    'arrowfactor',
+    'arrowhookfactor',
+    'arrowlength',
+    'arrowsizelimit',
+    'arrowtexfactor',
+    'authorpen',
+    'axis',
+    'axiscoverage',
+    'axislabelfactor',
+    'background',
+    'backgroundcolor',
+    'backgroundpen',
+    'barfactor',
+    'barmarksizefactor',
+    'basealign',
+    'baselinetemplate',
+    'beveljoin',
+    'bigvertexpen',
+    'bigvertexsize',
+    'black',
+    'blue',
+    'bm',
+    'bottom',
+    'bp',
+    'brown',
+    'bullet',
+    'byfoci',
+    'byvertices',
+    'camerafactor',
+    'chartreuse',
+    'circlemarkradiusfactor',
+    'circlenodesnumberfactor',
+    'circleprecision',
+    'circlescale',
+    'cm',
+    'codefile',
+    'codepen',
+    'codeskip',
+    'colorPen',
+    'coloredNodes',
+    'coloredSegments',
+    'conditionlength',
+    'conicnodesfactor',
+    'count',
+    'cputimeformat',
+    'crossmarksizefactor',
+    'currentcoordsys',
+    'currentlight',
+    'currentpatterns',
+    'currentpen',
+    'currentpicture',
+    'currentposition',
+    'currentprojection',
+    'curvilinearsystem',
+    'cuttings',
+    'cyan',
+    'darkblue',
+    'darkbrown',
+    'darkcyan',
+    'darkgray',
+    'darkgreen',
+    'darkgrey',
+    'darkmagenta',
+    'darkolive',
+    'darkred',
+    'dashdotted',
+    'dashed',
+    'datepen',
+    'dateskip',
+    'debuggerlines',
+    'debugging',
+    'deepblue',
+    'deepcyan',
+    'deepgray',
+    'deepgreen',
+    'deepgrey',
+    'deepmagenta',
+    'deepred',
+    'default',
+    'defaultControl',
+    'defaultS',
+    'defaultbackpen',
+    'defaultcoordsys',
+    'defaultfilename',
+    'defaultformat',
+    'defaultmassformat',
+    'defaultpen',
+    'diagnostics',
+    'differentlengths',
+    'dot',
+    'dotfactor',
+    'dotframe',
+    'dotted',
+    'doublelinepen',
+    'doublelinespacing',
+    'down',
+    'duplicateFuzz',
+    'ellipsenodesnumberfactor',
+    'eps',
+    'epsgeo',
+    'epsilon',
+    'evenodd',
+    'extendcap',
+    'fermionpen',
+    'figureborder',
+    'figuremattpen',
+    'firstnode',
+    'firststep',
+    'foregroundcolor',
+    'fuchsia',
+    'fuzz',
+    'gapfactor',
+    'ghostpen',
+    'gluonamplitude',
+    'gluonpen',
+    'gluonratio',
+    'gray',
+    'green',
+    'grey',
+    'hatchepsilon',
+    'havepagenumber',
+    'heavyblue',
+    'heavycyan',
+    'heavygray',
+    'heavygreen',
+    'heavygrey',
+    'heavymagenta',
+    'heavyred',
+    'hline',
+    'hwratio',
+    'hyperbolanodesnumberfactor',
+    'identity4',
+    'ignore',
+    'inXasyMode',
+    'inch',
+    'inches',
+    'includegraphicscommand',
+    'inf',
+    'infinity',
+    'institutionpen',
+    'intMax',
+    'intMin',
+    'invert',
+    'invisible',
+    'itempen',
+    'itemskip',
+    'itemstep',
+    'labelmargin',
+    'landscape',
+    'lastnode',
+    'left',
+    'legendhskip',
+    'legendlinelength',
+    'legendmargin',
+    'legendmarkersize',
+    'legendmaxrelativewidth',
+    'legendvskip',
+    'lightblue',
+    'lightcyan',
+    'lightgray',
+    'lightgreen',
+    'lightgrey',
+    'lightmagenta',
+    'lightolive',
+    'lightred',
+    'lightyellow',
+    'linemargin',
+    'lm_infmsg',
+    'lm_shortmsg',
+    'longdashdotted',
+    'longdashed',
+    'magenta',
+    'magneticPoints',
+    'magneticRadius',
+    'mantissaBits',
+    'markangleradius',
+    'markangleradiusfactor',
+    'markanglespace',
+    'markanglespacefactor',
+    'mediumblue',
+    'mediumcyan',
+    'mediumgray',
+    'mediumgreen',
+    'mediumgrey',
+    'mediummagenta',
+    'mediumred',
+    'mediumyellow',
+    'middle',
+    'minDistDefault',
+    'minblockheight',
+    'minblockwidth',
+    'mincirclediameter',
+    'minipagemargin',
+    'minipagewidth',
+    'minvertexangle',
+    'miterjoin',
+    'mm',
+    'momarrowfactor',
+    'momarrowlength',
+    'momarrowmargin',
+    'momarrowoffset',
+    'momarrowpen',
+    'monoPen',
+    'morepoints',
+    'nCircle',
+    'newbulletcolor',
+    'ngraph',
+    'nil',
+    'nmesh',
+    'nobasealign',
+    'nodeMarginDefault',
+    'nodesystem',
+    'nomarker',
+    'nopoint',
+    'noprimary',
+    'nullpath',
+    'nullpen',
+    'numarray',
+    'ocgindex',
+    'oldbulletcolor',
+    'olive',
+    'orange',
+    'origin',
+    'overpaint',
+    'page',
+    'pageheight',
+    'pagemargin',
+    'pagenumberalign',
+    'pagenumberpen',
+    'pagenumberposition',
+    'pagewidth',
+    'paleblue',
+    'palecyan',
+    'palegray',
+    'palegreen',
+    'palegrey',
+    'palemagenta',
+    'palered',
+    'paleyellow',
+    'parabolanodesnumberfactor',
+    'perpfactor',
+    'phi',
+    'photonamplitude',
+    'photonpen',
+    'photonratio',
+    'pi',
+    'pink',
+    'plain',
+    'plus',
+    'preamblenodes',
+    'pt',
+    'purple',
+    'r3',
+    'r4a',
+    'r4b',
+    'randMax',
+    'realDigits',
+    'realEpsilon',
+    'realMax',
+    'realMin',
+    'red',
+    'relativesystem',
+    'reverse',
+    'right',
+    'roundcap',
+    'roundjoin',
+    'royalblue',
+    'salmon',
+    'saveFunctions',
+    'scalarpen',
+    'sequencereal',
+    'settings',
+    'shipped',
+    'signedtrailingzero',
+    'solid',
+    'springgreen',
+    'sqrtEpsilon',
+    'squarecap',
+    'squarepen',
+    'startposition',
+    'stdin',
+    'stdout',
+    'stepfactor',
+    'stepfraction',
+    'steppagenumberpen',
+    'stepping',
+    'stickframe',
+    'stickmarksizefactor',
+    'stickmarkspacefactor',
+    'textpen',
+    'ticksize',
+    'tildeframe',
+    'tildemarksizefactor',
+    'tinv',
+    'titlealign',
+    'titlepagepen',
+    'titlepageposition',
+    'titlepen',
+    'titleskip',
+    'top',
+    'trailingzero',
+    'treeLevelStep',
+    'treeMinNodeWidth',
+    'treeNodeStep',
+    'trembleAngle',
+    'trembleFrequency',
+    'trembleRandom',
+    'tremblingMode',
+    'undefined',
+    'unitcircle',
+    'unitsquare',
+    'up',
+    'urlpen',
+    'urlskip',
+    'version',
+    'vertexpen',
+    'vertexsize',
+    'viewportmargin',
+    'viewportsize',
+    'vline',
+    'white',
+    'wye',
+    'xformStack',
+    'yellow',
+    'ylabelwidth',
+    'zerotickfuzz',
+    'zerowinding'
+))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/smv.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/smv.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/smv.py	(revision 1126)
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.smv
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the SMV languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Generic, Keyword, Name, Number, \
+    Operator, Punctuation, Text
+
+__all__ = ['NuSMVLexer']
+
+
+class NuSMVLexer(RegexLexer):
+    """
+    Lexer for the NuSMV language.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'NuSMV'
+    aliases = ['nusmv']
+    filenames = ['*.smv']
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'(?s)\/\-\-.*?\-\-/', Comment),
+            (r'--.*\n', Comment),
+
+            # Reserved
+            (words(('MODULE', 'DEFINE', 'MDEFINE', 'CONSTANTS', 'VAR', 'IVAR',
+                    'FROZENVAR', 'INIT', 'TRANS', 'INVAR', 'SPEC', 'CTLSPEC',
+                    'LTLSPEC', 'PSLSPEC', 'COMPUTE', 'NAME', 'INVARSPEC',
+                    'FAIRNESS', 'JUSTICE', 'COMPASSION', 'ISA', 'ASSIGN',
+                    'CONSTRAINT', 'SIMPWFF', 'CTLWFF', 'LTLWFF', 'PSLWFF',
+                    'COMPWFF', 'IN', 'MIN', 'MAX', 'MIRROR', 'PRED',
+                    'PREDICATES'), suffix=r'(?![\w$#-])'),
+             Keyword.Declaration),
+            (r'process(?![\w$#-])', Keyword),
+            (words(('array', 'of', 'boolean', 'integer', 'real', 'word'),
+                   suffix=r'(?![\w$#-])'), Keyword.Type),
+            (words(('case', 'esac'), suffix=r'(?![\w$#-])'), Keyword),
+            (words(('word1', 'bool', 'signed', 'unsigned', 'extend', 'resize',
+                    'sizeof', 'uwconst', 'swconst', 'init', 'self', 'count',
+                    'abs', 'max', 'min'), suffix=r'(?![\w$#-])'),
+             Name.Builtin),
+            (words(('EX', 'AX', 'EF', 'AF', 'EG', 'AG', 'E', 'F', 'O', 'G',
+                    'H', 'X', 'Y', 'Z', 'A', 'U', 'S', 'V', 'T', 'BU', 'EBF',
+                    'ABF', 'EBG', 'ABG', 'next', 'mod', 'union', 'in', 'xor',
+                    'xnor'), suffix=r'(?![\w$#-])'),
+                Operator.Word),
+            (words(('TRUE', 'FALSE'), suffix=r'(?![\w$#-])'), Keyword.Constant),
+
+            # Names
+            (r'[a-zA-Z_][\w$#-]*', Name.Variable),
+
+            # Operators
+            (r':=', Operator),
+            (r'[-&|+*/<>!=]', Operator),
+
+            # Literals
+            (r'\-?\d+\b', Number.Integer),
+            (r'0[su][bB]\d*_[01_]+', Number.Bin),
+            (r'0[su][oO]\d*_[0-7_]+', Number.Oct),
+            (r'0[su][dD]\d*_[\d_]+', Number.Dec),
+            (r'0[su][hH]\d*_[\da-fA-F_]+', Number.Hex),
+
+            # Whitespace, punctuation and the rest
+            (r'\s+', Text.Whitespace),
+            (r'[()\[\]{};?:.,]', Punctuation),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/lisp.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/lisp.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/lisp.py	(revision 1126)
@@ -0,0 +1,2621 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.lisp
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Lispy languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal, Error
+
+from pygments.lexers.python import PythonLexer
+
+__all__ = ['SchemeLexer', 'CommonLispLexer', 'HyLexer', 'RacketLexer',
+           'NewLispLexer', 'EmacsLispLexer', 'ShenLexer', 'CPSALexer',
+           'XtlangLexer']
+
+
+class SchemeLexer(RegexLexer):
+    """
+    A Scheme lexer, parsing a stream and outputting the tokens
+    needed to highlight scheme code.
+    This lexer could be most probably easily subclassed to parse
+    other LISP-Dialects like Common Lisp, Emacs Lisp or AutoLisp.
+
+    This parser is checked with pastes from the LISP pastebin
+    at http://paste.lisp.org/ to cover as much syntax as possible.
+
+    It supports the full Scheme syntax as defined in R5RS.
+
+    .. versionadded:: 0.6
+    """
+    name = 'Scheme'
+    aliases = ['scheme', 'scm']
+    filenames = ['*.scm', '*.ss']
+    mimetypes = ['text/x-scheme', 'application/x-scheme']
+
+    # list of known keywords and builtins taken form vim 6.4 scheme.vim
+    # syntax file.
+    keywords = (
+        'lambda', 'define', 'if', 'else', 'cond', 'and', 'or', 'case', 'let',
+        'let*', 'letrec', 'begin', 'do', 'delay', 'set!', '=>', 'quote',
+        'quasiquote', 'unquote', 'unquote-splicing', 'define-syntax',
+        'let-syntax', 'letrec-syntax', 'syntax-rules'
+    )
+    builtins = (
+        '*', '+', '-', '/', '<', '<=', '=', '>', '>=', 'abs', 'acos', 'angle',
+        'append', 'apply', 'asin', 'assoc', 'assq', 'assv', 'atan',
+        'boolean?', 'caaaar', 'caaadr', 'caaar', 'caadar', 'caaddr', 'caadr',
+        'caar', 'cadaar', 'cadadr', 'cadar', 'caddar', 'cadddr', 'caddr',
+        'cadr', 'call-with-current-continuation', 'call-with-input-file',
+        'call-with-output-file', 'call-with-values', 'call/cc', 'car',
+        'cdaaar', 'cdaadr', 'cdaar', 'cdadar', 'cdaddr', 'cdadr', 'cdar',
+        'cddaar', 'cddadr', 'cddar', 'cdddar', 'cddddr', 'cdddr', 'cddr',
+        'cdr', 'ceiling', 'char->integer', 'char-alphabetic?', 'char-ci<=?',
+        'char-ci<?', 'char-ci=?', 'char-ci>=?', 'char-ci>?', 'char-downcase',
+        'char-lower-case?', 'char-numeric?', 'char-ready?', 'char-upcase',
+        'char-upper-case?', 'char-whitespace?', 'char<=?', 'char<?', 'char=?',
+        'char>=?', 'char>?', 'char?', 'close-input-port', 'close-output-port',
+        'complex?', 'cons', 'cos', 'current-input-port', 'current-output-port',
+        'denominator', 'display', 'dynamic-wind', 'eof-object?', 'eq?',
+        'equal?', 'eqv?', 'eval', 'even?', 'exact->inexact', 'exact?', 'exp',
+        'expt', 'floor', 'for-each', 'force', 'gcd', 'imag-part',
+        'inexact->exact', 'inexact?', 'input-port?', 'integer->char',
+        'integer?', 'interaction-environment', 'lcm', 'length', 'list',
+        'list->string', 'list->vector', 'list-ref', 'list-tail', 'list?',
+        'load', 'log', 'magnitude', 'make-polar', 'make-rectangular',
+        'make-string', 'make-vector', 'map', 'max', 'member', 'memq', 'memv',
+        'min', 'modulo', 'negative?', 'newline', 'not', 'null-environment',
+        'null?', 'number->string', 'number?', 'numerator', 'odd?',
+        'open-input-file', 'open-output-file', 'output-port?', 'pair?',
+        'peek-char', 'port?', 'positive?', 'procedure?', 'quotient',
+        'rational?', 'rationalize', 'read', 'read-char', 'real-part', 'real?',
+        'remainder', 'reverse', 'round', 'scheme-report-environment',
+        'set-car!', 'set-cdr!', 'sin', 'sqrt', 'string', 'string->list',
+        'string->number', 'string->symbol', 'string-append', 'string-ci<=?',
+        'string-ci<?', 'string-ci=?', 'string-ci>=?', 'string-ci>?',
+        'string-copy', 'string-fill!', 'string-length', 'string-ref',
+        'string-set!', 'string<=?', 'string<?', 'string=?', 'string>=?',
+        'string>?', 'string?', 'substring', 'symbol->string', 'symbol?',
+        'tan', 'transcript-off', 'transcript-on', 'truncate', 'values',
+        'vector', 'vector->list', 'vector-fill!', 'vector-length',
+        'vector-ref', 'vector-set!', 'vector?', 'with-input-from-file',
+        'with-output-to-file', 'write', 'write-char', 'zero?'
+    )
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+    valid_name = r'[\w!$%&*+,/:<=>?@^~|-]+'
+
+    tokens = {
+        'root': [
+            # the comments
+            # and going to the end of the line
+            (r';.*$', Comment.Single),
+            # multi-line comment
+            (r'#\|', Comment.Multiline, 'multiline-comment'),
+            # commented form (entire sexpr folliwng)
+            (r'#;\s*\(', Comment, 'commented-form'),
+            # signifies that the program text that follows is written with the
+            # lexical and datum syntax described in r6rs
+            (r'#!r6rs', Comment),
+
+            # whitespaces - usually not relevant
+            (r'\s+', Text),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            # support for uncommon kinds of numbers -
+            # have to figure out what the characters mean
+            # (r'(#e|#i|#b|#o|#d|#x)[\d.]+', Number),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'" + valid_name, String.Symbol),
+            (r"#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)", String.Char),
+
+            # constants
+            (r'(#t|#f)', Name.Constant),
+
+            # special operators
+            (r"('|#|`|,@|,|\.)", Operator),
+
+            # highlight the keywords
+            ('(%s)' % '|'.join(re.escape(entry) + ' ' for entry in keywords),
+             Keyword),
+
+            # first variable in a quoted string like
+            # '(this is syntactic sugar)
+            (r"(?<='\()" + valid_name, Name.Variable),
+            (r"(?<=#\()" + valid_name, Name.Variable),
+
+            # highlight the builtins
+            ("(?<=\()(%s)" % '|'.join(re.escape(entry) + ' ' for entry in builtins),
+             Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+            (r'(\[|\])', Punctuation),
+        ],
+        'multiline-comment': [
+            (r'#\|', Comment.Multiline, '#push'),
+            (r'\|#', Comment.Multiline, '#pop'),
+            (r'[^|#]+', Comment.Multiline),
+            (r'[|#]', Comment.Multiline),
+        ],
+        'commented-form': [
+            (r'\(', Comment, '#push'),
+            (r'\)', Comment, '#pop'),
+            (r'[^()]+', Comment),
+        ],
+    }
+
+
+class CommonLispLexer(RegexLexer):
+    """
+    A Common Lisp lexer.
+
+    .. versionadded:: 0.9
+    """
+    name = 'Common Lisp'
+    aliases = ['common-lisp', 'cl', 'lisp']
+    filenames = ['*.cl', '*.lisp']
+    mimetypes = ['text/x-common-lisp']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    # couple of useful regexes
+
+    # characters that are not macro-characters and can be used to begin a symbol
+    nonmacro = r'\\.|[\w!$%&*+-/<=>?@\[\]^{}~]'
+    constituent = nonmacro + '|[#.:]'
+    terminated = r'(?=[ "()\'\n,;`])'  # whitespace or terminating macro characters
+
+    # symbol token, reverse-engineered from hyperspec
+    # Take a deep breath...
+    symbol = r'(\|[^|]+\||(?:%s)(?:%s)*)' % (nonmacro, constituent)
+
+    def __init__(self, **options):
+        from pygments.lexers._cl_builtins import BUILTIN_FUNCTIONS, \
+            SPECIAL_FORMS, MACROS, LAMBDA_LIST_KEYWORDS, DECLARATIONS, \
+            BUILTIN_TYPES, BUILTIN_CLASSES
+        self.builtin_function = BUILTIN_FUNCTIONS
+        self.special_forms = SPECIAL_FORMS
+        self.macros = MACROS
+        self.lambda_list_keywords = LAMBDA_LIST_KEYWORDS
+        self.declarations = DECLARATIONS
+        self.builtin_types = BUILTIN_TYPES
+        self.builtin_classes = BUILTIN_CLASSES
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name.Variable:
+                if value in self.builtin_function:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in self.special_forms:
+                    yield index, Keyword, value
+                    continue
+                if value in self.macros:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in self.lambda_list_keywords:
+                    yield index, Keyword, value
+                    continue
+                if value in self.declarations:
+                    yield index, Keyword, value
+                    continue
+                if value in self.builtin_types:
+                    yield index, Keyword.Type, value
+                    continue
+                if value in self.builtin_classes:
+                    yield index, Name.Class, value
+                    continue
+            yield index, token, value
+
+    tokens = {
+        'root': [
+            default('body'),
+        ],
+        'multiline-comment': [
+            (r'#\|', Comment.Multiline, '#push'),  # (cf. Hyperspec 2.4.8.19)
+            (r'\|#', Comment.Multiline, '#pop'),
+            (r'[^|#]+', Comment.Multiline),
+            (r'[|#]', Comment.Multiline),
+        ],
+        'commented-form': [
+            (r'\(', Comment.Preproc, '#push'),
+            (r'\)', Comment.Preproc, '#pop'),
+            (r'[^()]+', Comment.Preproc),
+        ],
+        'body': [
+            # whitespace
+            (r'\s+', Text),
+
+            # single-line comment
+            (r';.*$', Comment.Single),
+
+            # multi-line comment
+            (r'#\|', Comment.Multiline, 'multiline-comment'),
+
+            # encoding comment (?)
+            (r'#\d*Y.*$', Comment.Special),
+
+            # strings and characters
+            (r'"(\\.|\\\n|[^"\\])*"', String),
+            # quoting
+            (r":" + symbol, String.Symbol),
+            (r"::" + symbol, String.Symbol),
+            (r":#" + symbol, String.Symbol),
+            (r"'" + symbol, String.Symbol),
+            (r"'", Operator),
+            (r"`", Operator),
+
+            # decimal numbers
+            (r'[-+]?\d+\.?' + terminated, Number.Integer),
+            (r'[-+]?\d+/\d+' + terminated, Number),
+            (r'[-+]?(\d*\.\d+([defls][-+]?\d+)?|\d+(\.\d*)?[defls][-+]?\d+)' +
+             terminated, Number.Float),
+
+            # sharpsign strings and characters
+            (r"#\\." + terminated, String.Char),
+            (r"#\\" + symbol, String.Char),
+
+            # vector
+            (r'#\(', Operator, 'body'),
+
+            # bitstring
+            (r'#\d*\*[01]*', Literal.Other),
+
+            # uninterned symbol
+            (r'#:' + symbol, String.Symbol),
+
+            # read-time and load-time evaluation
+            (r'#[.,]', Operator),
+
+            # function shorthand
+            (r'#\'', Name.Function),
+
+            # binary rational
+            (r'#b[+-]?[01]+(/[01]+)?', Number.Bin),
+
+            # octal rational
+            (r'#o[+-]?[0-7]+(/[0-7]+)?', Number.Oct),
+
+            # hex rational
+            (r'#x[+-]?[0-9a-f]+(/[0-9a-f]+)?', Number.Hex),
+
+            # radix rational
+            (r'#\d+r[+-]?[0-9a-z]+(/[0-9a-z]+)?', Number),
+
+            # complex
+            (r'(#c)(\()', bygroups(Number, Punctuation), 'body'),
+
+            # array
+            (r'(#\d+a)(\()', bygroups(Literal.Other, Punctuation), 'body'),
+
+            # structure
+            (r'(#s)(\()', bygroups(Literal.Other, Punctuation), 'body'),
+
+            # path
+            (r'#p?"(\\.|[^"])*"', Literal.Other),
+
+            # reference
+            (r'#\d+=', Operator),
+            (r'#\d+#', Operator),
+
+            # read-time comment
+            (r'#+nil' + terminated + '\s*\(', Comment.Preproc, 'commented-form'),
+
+            # read-time conditional
+            (r'#[+-]', Operator),
+
+            # special operators that should have been parsed already
+            (r'(,@|,|\.)', Operator),
+
+            # special constants
+            (r'(t|nil)' + terminated, Name.Constant),
+
+            # functions and variables
+            (r'\*' + symbol + '\*', Name.Variable.Global),
+            (symbol, Name.Variable),
+
+            # parentheses
+            (r'\(', Punctuation, 'body'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+    }
+
+
+class HyLexer(RegexLexer):
+    """
+    Lexer for `Hy <http://hylang.org/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Hy'
+    aliases = ['hylang']
+    filenames = ['*.hy']
+    mimetypes = ['text/x-hy', 'application/x-hy']
+
+    special_forms = (
+        'cond', 'for', '->', '->>', 'car',
+        'cdr', 'first', 'rest', 'let', 'when', 'unless',
+        'import', 'do', 'progn', 'get', 'slice', 'assoc', 'with-decorator',
+        ',', 'list_comp', 'kwapply', '~', 'is', 'in', 'is-not', 'not-in',
+        'quasiquote', 'unquote', 'unquote-splice', 'quote', '|', '<<=', '>>=',
+        'foreach', 'while',
+        'eval-and-compile', 'eval-when-compile'
+    )
+
+    declarations = (
+        'def', 'defn', 'defun', 'defmacro', 'defclass', 'lambda', 'fn', 'setv'
+    )
+
+    hy_builtins = ()
+
+    hy_core = (
+        'cycle', 'dec', 'distinct', 'drop', 'even?', 'filter', 'inc',
+        'instance?', 'iterable?', 'iterate', 'iterator?', 'neg?',
+        'none?', 'nth', 'numeric?', 'odd?', 'pos?', 'remove', 'repeat',
+        'repeatedly', 'take', 'take_nth', 'take_while', 'zero?'
+    )
+
+    builtins = hy_builtins + hy_core
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+    valid_name = r'(?!#)[\w!$%*+<=>?/.#-]+'
+
+    def _multi_escape(entries):
+        return words(entries, suffix=' ')
+
+    tokens = {
+        'root': [
+            # the comments - always starting with semicolon
+            # and going to the end of the line
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r'[,\s]+', Text),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'" + valid_name, String.Symbol),
+            (r"\\(.|[a-z]+)", String.Char),
+            (r'^(\s*)([rRuU]{,2}"""(?:.|\n)*?""")', bygroups(Text, String.Doc)),
+            (r"^(\s*)([rRuU]{,2}'''(?:.|\n)*?''')", bygroups(Text, String.Doc)),
+
+            # keywords
+            (r'::?' + valid_name, String.Symbol),
+
+            # special operators
+            (r'~@|[`\'#^~&@]', Operator),
+
+            include('py-keywords'),
+            include('py-builtins'),
+
+            # highlight the special forms
+            (_multi_escape(special_forms), Keyword),
+
+            # Technically, only the special forms are 'keywords'. The problem
+            # is that only treating them as keywords means that things like
+            # 'defn' and 'ns' need to be highlighted as builtins. This is ugly
+            # and weird for most styles. So, as a compromise we're going to
+            # highlight them as Keyword.Declarations.
+            (_multi_escape(declarations), Keyword.Declaration),
+
+            # highlight the builtins
+            (_multi_escape(builtins), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # Hy accepts vector notation
+            (r'(\[|\])', Punctuation),
+
+            # Hy accepts map notation
+            (r'(\{|\})', Punctuation),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+
+        ],
+        'py-keywords': PythonLexer.tokens['keywords'],
+        'py-builtins': PythonLexer.tokens['builtins'],
+    }
+
+    def analyse_text(text):
+        if '(import ' in text or '(defn ' in text:
+            return 0.9
+
+
+class RacketLexer(RegexLexer):
+    """
+    Lexer for `Racket <http://racket-lang.org/>`_ source code (formerly
+    known as PLT Scheme).
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Racket'
+    aliases = ['racket', 'rkt']
+    filenames = ['*.rkt', '*.rktd', '*.rktl']
+    mimetypes = ['text/x-racket', 'application/x-racket']
+
+    # Generated by example.rkt
+    _keywords = (
+        u'#%app', u'#%datum', u'#%declare', u'#%expression', u'#%module-begin',
+        u'#%plain-app', u'#%plain-lambda', u'#%plain-module-begin',
+        u'#%printing-module-begin', u'#%provide', u'#%require',
+        u'#%stratified-body', u'#%top', u'#%top-interaction',
+        u'#%variable-reference', u'->', u'->*', u'->*m', u'->d', u'->dm', u'->i',
+        u'->m', u'...', u':do-in', u'==', u'=>', u'_', u'absent', u'abstract',
+        u'all-defined-out', u'all-from-out', u'and', u'any', u'augment', u'augment*',
+        u'augment-final', u'augment-final*', u'augride', u'augride*', u'begin',
+        u'begin-for-syntax', u'begin0', u'case', u'case->', u'case->m',
+        u'case-lambda', u'class', u'class*', u'class-field-accessor',
+        u'class-field-mutator', u'class/c', u'class/derived', u'combine-in',
+        u'combine-out', u'command-line', u'compound-unit', u'compound-unit/infer',
+        u'cond', u'cons/dc', u'contract', u'contract-out', u'contract-struct',
+        u'contracted', u'define', u'define-compound-unit',
+        u'define-compound-unit/infer', u'define-contract-struct',
+        u'define-custom-hash-types', u'define-custom-set-types',
+        u'define-for-syntax', u'define-local-member-name', u'define-logger',
+        u'define-match-expander', u'define-member-name',
+        u'define-module-boundary-contract', u'define-namespace-anchor',
+        u'define-opt/c', u'define-sequence-syntax', u'define-serializable-class',
+        u'define-serializable-class*', u'define-signature',
+        u'define-signature-form', u'define-struct', u'define-struct/contract',
+        u'define-struct/derived', u'define-syntax', u'define-syntax-rule',
+        u'define-syntaxes', u'define-unit', u'define-unit-binding',
+        u'define-unit-from-context', u'define-unit/contract',
+        u'define-unit/new-import-export', u'define-unit/s', u'define-values',
+        u'define-values-for-export', u'define-values-for-syntax',
+        u'define-values/invoke-unit', u'define-values/invoke-unit/infer',
+        u'define/augment', u'define/augment-final', u'define/augride',
+        u'define/contract', u'define/final-prop', u'define/match',
+        u'define/overment', u'define/override', u'define/override-final',
+        u'define/private', u'define/public', u'define/public-final',
+        u'define/pubment', u'define/subexpression-pos-prop',
+        u'define/subexpression-pos-prop/name', u'delay', u'delay/idle',
+        u'delay/name', u'delay/strict', u'delay/sync', u'delay/thread', u'do',
+        u'else', u'except', u'except-in', u'except-out', u'export', u'extends',
+        u'failure-cont', u'false', u'false/c', u'field', u'field-bound?', u'file',
+        u'flat-murec-contract', u'flat-rec-contract', u'for', u'for*', u'for*/and',
+        u'for*/async', u'for*/first', u'for*/fold', u'for*/fold/derived',
+        u'for*/hash', u'for*/hasheq', u'for*/hasheqv', u'for*/last', u'for*/list',
+        u'for*/lists', u'for*/mutable-set', u'for*/mutable-seteq',
+        u'for*/mutable-seteqv', u'for*/or', u'for*/product', u'for*/set',
+        u'for*/seteq', u'for*/seteqv', u'for*/stream', u'for*/sum', u'for*/vector',
+        u'for*/weak-set', u'for*/weak-seteq', u'for*/weak-seteqv', u'for-label',
+        u'for-meta', u'for-syntax', u'for-template', u'for/and', u'for/async',
+        u'for/first', u'for/fold', u'for/fold/derived', u'for/hash', u'for/hasheq',
+        u'for/hasheqv', u'for/last', u'for/list', u'for/lists', u'for/mutable-set',
+        u'for/mutable-seteq', u'for/mutable-seteqv', u'for/or', u'for/product',
+        u'for/set', u'for/seteq', u'for/seteqv', u'for/stream', u'for/sum',
+        u'for/vector', u'for/weak-set', u'for/weak-seteq', u'for/weak-seteqv',
+        u'gen:custom-write', u'gen:dict', u'gen:equal+hash', u'gen:set',
+        u'gen:stream', u'generic', u'get-field', u'hash/dc', u'if', u'implies',
+        u'import', u'include', u'include-at/relative-to',
+        u'include-at/relative-to/reader', u'include/reader', u'inherit',
+        u'inherit-field', u'inherit/inner', u'inherit/super', u'init',
+        u'init-depend', u'init-field', u'init-rest', u'inner', u'inspect',
+        u'instantiate', u'interface', u'interface*', u'invariant-assertion',
+        u'invoke-unit', u'invoke-unit/infer', u'lambda', u'lazy', u'let', u'let*',
+        u'let*-values', u'let-syntax', u'let-syntaxes', u'let-values', u'let/cc',
+        u'let/ec', u'letrec', u'letrec-syntax', u'letrec-syntaxes',
+        u'letrec-syntaxes+values', u'letrec-values', u'lib', u'link', u'local',
+        u'local-require', u'log-debug', u'log-error', u'log-fatal', u'log-info',
+        u'log-warning', u'match', u'match*', u'match*/derived', u'match-define',
+        u'match-define-values', u'match-lambda', u'match-lambda*',
+        u'match-lambda**', u'match-let', u'match-let*', u'match-let*-values',
+        u'match-let-values', u'match-letrec', u'match-letrec-values',
+        u'match/derived', u'match/values', u'member-name-key', u'mixin', u'module',
+        u'module*', u'module+', u'nand', u'new', u'nor', u'object-contract',
+        u'object/c', u'only', u'only-in', u'only-meta-in', u'open', u'opt/c', u'or',
+        u'overment', u'overment*', u'override', u'override*', u'override-final',
+        u'override-final*', u'parameterize', u'parameterize*',
+        u'parameterize-break', u'parametric->/c', u'place', u'place*',
+        u'place/context', u'planet', u'prefix', u'prefix-in', u'prefix-out',
+        u'private', u'private*', u'prompt-tag/c', u'protect-out', u'provide',
+        u'provide-signature-elements', u'provide/contract', u'public', u'public*',
+        u'public-final', u'public-final*', u'pubment', u'pubment*', u'quasiquote',
+        u'quasisyntax', u'quasisyntax/loc', u'quote', u'quote-syntax',
+        u'quote-syntax/prune', u'recontract-out', u'recursive-contract',
+        u'relative-in', u'rename', u'rename-in', u'rename-inner', u'rename-out',
+        u'rename-super', u'require', u'send', u'send*', u'send+', u'send-generic',
+        u'send/apply', u'send/keyword-apply', u'set!', u'set!-values',
+        u'set-field!', u'shared', u'stream', u'stream*', u'stream-cons', u'struct',
+        u'struct*', u'struct-copy', u'struct-field-index', u'struct-out',
+        u'struct/c', u'struct/ctc', u'struct/dc', u'submod', u'super',
+        u'super-instantiate', u'super-make-object', u'super-new', u'syntax',
+        u'syntax-case', u'syntax-case*', u'syntax-id-rules', u'syntax-rules',
+        u'syntax/loc', u'tag', u'this', u'this%', u'thunk', u'thunk*', u'time',
+        u'unconstrained-domain->', u'unit', u'unit-from-context', u'unit/c',
+        u'unit/new-import-export', u'unit/s', u'unless', u'unquote',
+        u'unquote-splicing', u'unsyntax', u'unsyntax-splicing', u'values/drop',
+        u'when', u'with-continuation-mark', u'with-contract',
+        u'with-contract-continuation-mark', u'with-handlers', u'with-handlers*',
+        u'with-method', u'with-syntax', u'λ'
+    )
+
+    # Generated by example.rkt
+    _builtins = (
+        u'*', u'*list/c', u'+', u'-', u'/', u'<', u'</c', u'<=', u'<=/c', u'=', u'=/c',
+        u'>', u'>/c', u'>=', u'>=/c', u'abort-current-continuation', u'abs',
+        u'absolute-path?', u'acos', u'add-between', u'add1', u'alarm-evt',
+        u'always-evt', u'and/c', u'andmap', u'angle', u'any/c', u'append', u'append*',
+        u'append-map', u'apply', u'argmax', u'argmin', u'arithmetic-shift',
+        u'arity-at-least', u'arity-at-least-value', u'arity-at-least?',
+        u'arity-checking-wrapper', u'arity-includes?', u'arity=?',
+        u'arrow-contract-info', u'arrow-contract-info-accepts-arglist',
+        u'arrow-contract-info-chaperone-procedure',
+        u'arrow-contract-info-check-first-order', u'arrow-contract-info?',
+        u'asin', u'assf', u'assoc', u'assq', u'assv', u'atan',
+        u'bad-number-of-results', u'banner', u'base->-doms/c', u'base->-rngs/c',
+        u'base->?', u'between/c', u'bitwise-and', u'bitwise-bit-field',
+        u'bitwise-bit-set?', u'bitwise-ior', u'bitwise-not', u'bitwise-xor',
+        u'blame-add-car-context', u'blame-add-cdr-context', u'blame-add-context',
+        u'blame-add-missing-party', u'blame-add-nth-arg-context',
+        u'blame-add-range-context', u'blame-add-unknown-context',
+        u'blame-context', u'blame-contract', u'blame-fmt->-string',
+        u'blame-missing-party?', u'blame-negative', u'blame-original?',
+        u'blame-positive', u'blame-replace-negative', u'blame-source',
+        u'blame-swap', u'blame-swapped?', u'blame-update', u'blame-value',
+        u'blame?', u'boolean=?', u'boolean?', u'bound-identifier=?', u'box',
+        u'box-cas!', u'box-immutable', u'box-immutable/c', u'box/c', u'box?',
+        u'break-enabled', u'break-parameterization?', u'break-thread',
+        u'build-chaperone-contract-property', u'build-compound-type-name',
+        u'build-contract-property', u'build-flat-contract-property',
+        u'build-list', u'build-path', u'build-path/convention-type',
+        u'build-string', u'build-vector', u'byte-pregexp', u'byte-pregexp?',
+        u'byte-ready?', u'byte-regexp', u'byte-regexp?', u'byte?', u'bytes',
+        u'bytes->immutable-bytes', u'bytes->list', u'bytes->path',
+        u'bytes->path-element', u'bytes->string/latin-1', u'bytes->string/locale',
+        u'bytes->string/utf-8', u'bytes-append', u'bytes-append*',
+        u'bytes-close-converter', u'bytes-convert', u'bytes-convert-end',
+        u'bytes-converter?', u'bytes-copy', u'bytes-copy!',
+        u'bytes-environment-variable-name?', u'bytes-fill!', u'bytes-join',
+        u'bytes-length', u'bytes-no-nuls?', u'bytes-open-converter', u'bytes-ref',
+        u'bytes-set!', u'bytes-utf-8-index', u'bytes-utf-8-length',
+        u'bytes-utf-8-ref', u'bytes<?', u'bytes=?', u'bytes>?', u'bytes?', u'caaaar',
+        u'caaadr', u'caaar', u'caadar', u'caaddr', u'caadr', u'caar', u'cadaar',
+        u'cadadr', u'cadar', u'caddar', u'cadddr', u'caddr', u'cadr',
+        u'call-in-nested-thread', u'call-with-atomic-output-file',
+        u'call-with-break-parameterization',
+        u'call-with-composable-continuation', u'call-with-continuation-barrier',
+        u'call-with-continuation-prompt', u'call-with-current-continuation',
+        u'call-with-default-reading-parameterization',
+        u'call-with-escape-continuation', u'call-with-exception-handler',
+        u'call-with-file-lock/timeout', u'call-with-immediate-continuation-mark',
+        u'call-with-input-bytes', u'call-with-input-file',
+        u'call-with-input-file*', u'call-with-input-string',
+        u'call-with-output-bytes', u'call-with-output-file',
+        u'call-with-output-file*', u'call-with-output-string',
+        u'call-with-parameterization', u'call-with-semaphore',
+        u'call-with-semaphore/enable-break', u'call-with-values', u'call/cc',
+        u'call/ec', u'car', u'cartesian-product', u'cdaaar', u'cdaadr', u'cdaar',
+        u'cdadar', u'cdaddr', u'cdadr', u'cdar', u'cddaar', u'cddadr', u'cddar',
+        u'cdddar', u'cddddr', u'cdddr', u'cddr', u'cdr', u'ceiling', u'channel-get',
+        u'channel-put', u'channel-put-evt', u'channel-put-evt?',
+        u'channel-try-get', u'channel/c', u'channel?', u'chaperone-box',
+        u'chaperone-channel', u'chaperone-continuation-mark-key',
+        u'chaperone-contract-property?', u'chaperone-contract?', u'chaperone-evt',
+        u'chaperone-hash', u'chaperone-hash-set', u'chaperone-of?',
+        u'chaperone-procedure', u'chaperone-procedure*', u'chaperone-prompt-tag',
+        u'chaperone-struct', u'chaperone-struct-type', u'chaperone-vector',
+        u'chaperone?', u'char->integer', u'char-alphabetic?', u'char-blank?',
+        u'char-ci<=?', u'char-ci<?', u'char-ci=?', u'char-ci>=?', u'char-ci>?',
+        u'char-downcase', u'char-foldcase', u'char-general-category',
+        u'char-graphic?', u'char-in', u'char-in/c', u'char-iso-control?',
+        u'char-lower-case?', u'char-numeric?', u'char-punctuation?',
+        u'char-ready?', u'char-symbolic?', u'char-title-case?', u'char-titlecase',
+        u'char-upcase', u'char-upper-case?', u'char-utf-8-length',
+        u'char-whitespace?', u'char<=?', u'char<?', u'char=?', u'char>=?', u'char>?',
+        u'char?', u'check-duplicate-identifier', u'check-duplicates',
+        u'checked-procedure-check-and-extract', u'choice-evt',
+        u'class->interface', u'class-info', u'class-seal', u'class-unseal',
+        u'class?', u'cleanse-path', u'close-input-port', u'close-output-port',
+        u'coerce-chaperone-contract', u'coerce-chaperone-contracts',
+        u'coerce-contract', u'coerce-contract/f', u'coerce-contracts',
+        u'coerce-flat-contract', u'coerce-flat-contracts', u'collect-garbage',
+        u'collection-file-path', u'collection-path', u'combinations', u'compile',
+        u'compile-allow-set!-undefined', u'compile-context-preservation-enabled',
+        u'compile-enforce-module-constants', u'compile-syntax',
+        u'compiled-expression-recompile', u'compiled-expression?',
+        u'compiled-module-expression?', u'complete-path?', u'complex?', u'compose',
+        u'compose1', u'conjoin', u'conjugate', u'cons', u'cons/c', u'cons?', u'const',
+        u'continuation-mark-key/c', u'continuation-mark-key?',
+        u'continuation-mark-set->context', u'continuation-mark-set->list',
+        u'continuation-mark-set->list*', u'continuation-mark-set-first',
+        u'continuation-mark-set?', u'continuation-marks',
+        u'continuation-prompt-available?', u'continuation-prompt-tag?',
+        u'continuation?', u'contract-continuation-mark-key',
+        u'contract-custom-write-property-proc', u'contract-exercise',
+        u'contract-first-order', u'contract-first-order-passes?',
+        u'contract-late-neg-projection', u'contract-name', u'contract-proc',
+        u'contract-projection', u'contract-property?',
+        u'contract-random-generate', u'contract-random-generate-fail',
+        u'contract-random-generate-fail?',
+        u'contract-random-generate-get-current-environment',
+        u'contract-random-generate-stash', u'contract-random-generate/choose',
+        u'contract-stronger?', u'contract-struct-exercise',
+        u'contract-struct-generate', u'contract-struct-late-neg-projection',
+        u'contract-struct-list-contract?', u'contract-val-first-projection',
+        u'contract?', u'convert-stream', u'copy-directory/files', u'copy-file',
+        u'copy-port', u'cos', u'cosh', u'count', u'current-blame-format',
+        u'current-break-parameterization', u'current-code-inspector',
+        u'current-command-line-arguments', u'current-compile',
+        u'current-compiled-file-roots', u'current-continuation-marks',
+        u'current-contract-region', u'current-custodian', u'current-directory',
+        u'current-directory-for-user', u'current-drive',
+        u'current-environment-variables', u'current-error-port', u'current-eval',
+        u'current-evt-pseudo-random-generator',
+        u'current-force-delete-permissions', u'current-future',
+        u'current-gc-milliseconds', u'current-get-interaction-input-port',
+        u'current-inexact-milliseconds', u'current-input-port',
+        u'current-inspector', u'current-library-collection-links',
+        u'current-library-collection-paths', u'current-load',
+        u'current-load-extension', u'current-load-relative-directory',
+        u'current-load/use-compiled', u'current-locale', u'current-logger',
+        u'current-memory-use', u'current-milliseconds',
+        u'current-module-declare-name', u'current-module-declare-source',
+        u'current-module-name-resolver', u'current-module-path-for-load',
+        u'current-namespace', u'current-output-port', u'current-parameterization',
+        u'current-plumber', u'current-preserved-thread-cell-values',
+        u'current-print', u'current-process-milliseconds', u'current-prompt-read',
+        u'current-pseudo-random-generator', u'current-read-interaction',
+        u'current-reader-guard', u'current-readtable', u'current-seconds',
+        u'current-security-guard', u'current-subprocess-custodian-mode',
+        u'current-thread', u'current-thread-group',
+        u'current-thread-initial-stack-size',
+        u'current-write-relative-directory', u'curry', u'curryr',
+        u'custodian-box-value', u'custodian-box?', u'custodian-limit-memory',
+        u'custodian-managed-list', u'custodian-memory-accounting-available?',
+        u'custodian-require-memory', u'custodian-shutdown-all', u'custodian?',
+        u'custom-print-quotable-accessor', u'custom-print-quotable?',
+        u'custom-write-accessor', u'custom-write-property-proc', u'custom-write?',
+        u'date', u'date*', u'date*-nanosecond', u'date*-time-zone-name', u'date*?',
+        u'date-day', u'date-dst?', u'date-hour', u'date-minute', u'date-month',
+        u'date-second', u'date-time-zone-offset', u'date-week-day', u'date-year',
+        u'date-year-day', u'date?', u'datum->syntax', u'datum-intern-literal',
+        u'default-continuation-prompt-tag', u'degrees->radians',
+        u'delete-directory', u'delete-directory/files', u'delete-file',
+        u'denominator', u'dict->list', u'dict-can-functional-set?',
+        u'dict-can-remove-keys?', u'dict-clear', u'dict-clear!', u'dict-copy',
+        u'dict-count', u'dict-empty?', u'dict-for-each', u'dict-has-key?',
+        u'dict-implements/c', u'dict-implements?', u'dict-iter-contract',
+        u'dict-iterate-first', u'dict-iterate-key', u'dict-iterate-next',
+        u'dict-iterate-value', u'dict-key-contract', u'dict-keys', u'dict-map',
+        u'dict-mutable?', u'dict-ref', u'dict-ref!', u'dict-remove',
+        u'dict-remove!', u'dict-set', u'dict-set!', u'dict-set*', u'dict-set*!',
+        u'dict-update', u'dict-update!', u'dict-value-contract', u'dict-values',
+        u'dict?', u'directory-exists?', u'directory-list', u'disjoin', u'display',
+        u'display-lines', u'display-lines-to-file', u'display-to-file',
+        u'displayln', u'double-flonum?', u'drop', u'drop-common-prefix',
+        u'drop-right', u'dropf', u'dropf-right', u'dump-memory-stats',
+        u'dup-input-port', u'dup-output-port', u'dynamic->*', u'dynamic-get-field',
+        u'dynamic-object/c', u'dynamic-place', u'dynamic-place*',
+        u'dynamic-require', u'dynamic-require-for-syntax', u'dynamic-send',
+        u'dynamic-set-field!', u'dynamic-wind', u'eighth', u'empty',
+        u'empty-sequence', u'empty-stream', u'empty?',
+        u'environment-variables-copy', u'environment-variables-names',
+        u'environment-variables-ref', u'environment-variables-set!',
+        u'environment-variables?', u'eof', u'eof-evt', u'eof-object?',
+        u'ephemeron-value', u'ephemeron?', u'eprintf', u'eq-contract-val',
+        u'eq-contract?', u'eq-hash-code', u'eq?', u'equal-contract-val',
+        u'equal-contract?', u'equal-hash-code', u'equal-secondary-hash-code',
+        u'equal<%>', u'equal?', u'equal?/recur', u'eqv-hash-code', u'eqv?', u'error',
+        u'error-display-handler', u'error-escape-handler',
+        u'error-print-context-length', u'error-print-source-location',
+        u'error-print-width', u'error-value->string-handler', u'eval',
+        u'eval-jit-enabled', u'eval-syntax', u'even?', u'evt/c', u'evt?',
+        u'exact->inexact', u'exact-ceiling', u'exact-floor', u'exact-integer?',
+        u'exact-nonnegative-integer?', u'exact-positive-integer?', u'exact-round',
+        u'exact-truncate', u'exact?', u'executable-yield-handler', u'exit',
+        u'exit-handler', u'exn', u'exn-continuation-marks', u'exn-message',
+        u'exn:break', u'exn:break-continuation', u'exn:break:hang-up',
+        u'exn:break:hang-up?', u'exn:break:terminate', u'exn:break:terminate?',
+        u'exn:break?', u'exn:fail', u'exn:fail:contract',
+        u'exn:fail:contract:arity', u'exn:fail:contract:arity?',
+        u'exn:fail:contract:blame', u'exn:fail:contract:blame-object',
+        u'exn:fail:contract:blame?', u'exn:fail:contract:continuation',
+        u'exn:fail:contract:continuation?', u'exn:fail:contract:divide-by-zero',
+        u'exn:fail:contract:divide-by-zero?',
+        u'exn:fail:contract:non-fixnum-result',
+        u'exn:fail:contract:non-fixnum-result?', u'exn:fail:contract:variable',
+        u'exn:fail:contract:variable-id', u'exn:fail:contract:variable?',
+        u'exn:fail:contract?', u'exn:fail:filesystem',
+        u'exn:fail:filesystem:errno', u'exn:fail:filesystem:errno-errno',
+        u'exn:fail:filesystem:errno?', u'exn:fail:filesystem:exists',
+        u'exn:fail:filesystem:exists?', u'exn:fail:filesystem:missing-module',
+        u'exn:fail:filesystem:missing-module-path',
+        u'exn:fail:filesystem:missing-module?', u'exn:fail:filesystem:version',
+        u'exn:fail:filesystem:version?', u'exn:fail:filesystem?',
+        u'exn:fail:network', u'exn:fail:network:errno',
+        u'exn:fail:network:errno-errno', u'exn:fail:network:errno?',
+        u'exn:fail:network?', u'exn:fail:object', u'exn:fail:object?',
+        u'exn:fail:out-of-memory', u'exn:fail:out-of-memory?', u'exn:fail:read',
+        u'exn:fail:read-srclocs', u'exn:fail:read:eof', u'exn:fail:read:eof?',
+        u'exn:fail:read:non-char', u'exn:fail:read:non-char?', u'exn:fail:read?',
+        u'exn:fail:syntax', u'exn:fail:syntax-exprs',
+        u'exn:fail:syntax:missing-module',
+        u'exn:fail:syntax:missing-module-path',
+        u'exn:fail:syntax:missing-module?', u'exn:fail:syntax:unbound',
+        u'exn:fail:syntax:unbound?', u'exn:fail:syntax?', u'exn:fail:unsupported',
+        u'exn:fail:unsupported?', u'exn:fail:user', u'exn:fail:user?',
+        u'exn:fail?', u'exn:misc:match?', u'exn:missing-module-accessor',
+        u'exn:missing-module?', u'exn:srclocs-accessor', u'exn:srclocs?', u'exn?',
+        u'exp', u'expand', u'expand-once', u'expand-syntax', u'expand-syntax-once',
+        u'expand-syntax-to-top-form', u'expand-to-top-form', u'expand-user-path',
+        u'explode-path', u'expt', u'externalizable<%>', u'failure-result/c',
+        u'false?', u'field-names', u'fifth', u'file->bytes', u'file->bytes-lines',
+        u'file->lines', u'file->list', u'file->string', u'file->value',
+        u'file-exists?', u'file-name-from-path', u'file-or-directory-identity',
+        u'file-or-directory-modify-seconds', u'file-or-directory-permissions',
+        u'file-position', u'file-position*', u'file-size',
+        u'file-stream-buffer-mode', u'file-stream-port?', u'file-truncate',
+        u'filename-extension', u'filesystem-change-evt',
+        u'filesystem-change-evt-cancel', u'filesystem-change-evt?',
+        u'filesystem-root-list', u'filter', u'filter-map', u'filter-not',
+        u'filter-read-input-port', u'find-executable-path', u'find-files',
+        u'find-library-collection-links', u'find-library-collection-paths',
+        u'find-relative-path', u'find-system-path', u'findf', u'first',
+        u'first-or/c', u'fixnum?', u'flat-contract', u'flat-contract-predicate',
+        u'flat-contract-property?', u'flat-contract?', u'flat-named-contract',
+        u'flatten', u'floating-point-bytes->real', u'flonum?', u'floor',
+        u'flush-output', u'fold-files', u'foldl', u'foldr', u'for-each', u'force',
+        u'format', u'fourth', u'fprintf', u'free-identifier=?',
+        u'free-label-identifier=?', u'free-template-identifier=?',
+        u'free-transformer-identifier=?', u'fsemaphore-count', u'fsemaphore-post',
+        u'fsemaphore-try-wait?', u'fsemaphore-wait', u'fsemaphore?', u'future',
+        u'future?', u'futures-enabled?', u'gcd', u'generate-member-key',
+        u'generate-temporaries', u'generic-set?', u'generic?', u'gensym',
+        u'get-output-bytes', u'get-output-string', u'get-preference',
+        u'get/build-late-neg-projection', u'get/build-val-first-projection',
+        u'getenv', u'global-port-print-handler', u'group-by', u'group-execute-bit',
+        u'group-read-bit', u'group-write-bit', u'guard-evt', u'handle-evt',
+        u'handle-evt?', u'has-blame?', u'has-contract?', u'hash', u'hash->list',
+        u'hash-clear', u'hash-clear!', u'hash-copy', u'hash-copy-clear',
+        u'hash-count', u'hash-empty?', u'hash-eq?', u'hash-equal?', u'hash-eqv?',
+        u'hash-for-each', u'hash-has-key?', u'hash-iterate-first',
+        u'hash-iterate-key', u'hash-iterate-key+value', u'hash-iterate-next',
+        u'hash-iterate-pair', u'hash-iterate-value', u'hash-keys', u'hash-map',
+        u'hash-placeholder?', u'hash-ref', u'hash-ref!', u'hash-remove',
+        u'hash-remove!', u'hash-set', u'hash-set!', u'hash-set*', u'hash-set*!',
+        u'hash-update', u'hash-update!', u'hash-values', u'hash-weak?', u'hash/c',
+        u'hash?', u'hasheq', u'hasheqv', u'identifier-binding',
+        u'identifier-binding-symbol', u'identifier-label-binding',
+        u'identifier-prune-lexical-context',
+        u'identifier-prune-to-source-module',
+        u'identifier-remove-from-definition-context',
+        u'identifier-template-binding', u'identifier-transformer-binding',
+        u'identifier?', u'identity', u'if/c', u'imag-part', u'immutable?',
+        u'impersonate-box', u'impersonate-channel',
+        u'impersonate-continuation-mark-key', u'impersonate-hash',
+        u'impersonate-hash-set', u'impersonate-procedure',
+        u'impersonate-procedure*', u'impersonate-prompt-tag',
+        u'impersonate-struct', u'impersonate-vector', u'impersonator-contract?',
+        u'impersonator-ephemeron', u'impersonator-of?',
+        u'impersonator-prop:application-mark', u'impersonator-prop:blame',
+        u'impersonator-prop:contracted',
+        u'impersonator-property-accessor-procedure?', u'impersonator-property?',
+        u'impersonator?', u'implementation?', u'implementation?/c', u'in-bytes',
+        u'in-bytes-lines', u'in-combinations', u'in-cycle', u'in-dict',
+        u'in-dict-keys', u'in-dict-pairs', u'in-dict-values', u'in-directory',
+        u'in-hash', u'in-hash-keys', u'in-hash-pairs', u'in-hash-values',
+        u'in-immutable-hash', u'in-immutable-hash-keys',
+        u'in-immutable-hash-pairs', u'in-immutable-hash-values',
+        u'in-immutable-set', u'in-indexed', u'in-input-port-bytes',
+        u'in-input-port-chars', u'in-lines', u'in-list', u'in-mlist',
+        u'in-mutable-hash', u'in-mutable-hash-keys', u'in-mutable-hash-pairs',
+        u'in-mutable-hash-values', u'in-mutable-set', u'in-naturals',
+        u'in-parallel', u'in-permutations', u'in-port', u'in-producer', u'in-range',
+        u'in-sequences', u'in-set', u'in-slice', u'in-stream', u'in-string',
+        u'in-syntax', u'in-value', u'in-values*-sequence', u'in-values-sequence',
+        u'in-vector', u'in-weak-hash', u'in-weak-hash-keys', u'in-weak-hash-pairs',
+        u'in-weak-hash-values', u'in-weak-set', u'inexact->exact',
+        u'inexact-real?', u'inexact?', u'infinite?', u'input-port-append',
+        u'input-port?', u'inspector?', u'instanceof/c', u'integer->char',
+        u'integer->integer-bytes', u'integer-bytes->integer', u'integer-in',
+        u'integer-length', u'integer-sqrt', u'integer-sqrt/remainder', u'integer?',
+        u'interface->method-names', u'interface-extension?', u'interface?',
+        u'internal-definition-context-binding-identifiers',
+        u'internal-definition-context-introduce',
+        u'internal-definition-context-seal', u'internal-definition-context?',
+        u'is-a?', u'is-a?/c', u'keyword->string', u'keyword-apply', u'keyword<?',
+        u'keyword?', u'keywords-match', u'kill-thread', u'last', u'last-pair',
+        u'lcm', u'length', u'liberal-define-context?', u'link-exists?', u'list',
+        u'list*', u'list*of', u'list->bytes', u'list->mutable-set',
+        u'list->mutable-seteq', u'list->mutable-seteqv', u'list->set',
+        u'list->seteq', u'list->seteqv', u'list->string', u'list->vector',
+        u'list->weak-set', u'list->weak-seteq', u'list->weak-seteqv',
+        u'list-contract?', u'list-prefix?', u'list-ref', u'list-set', u'list-tail',
+        u'list-update', u'list/c', u'list?', u'listen-port-number?', u'listof',
+        u'load', u'load-extension', u'load-on-demand-enabled', u'load-relative',
+        u'load-relative-extension', u'load/cd', u'load/use-compiled',
+        u'local-expand', u'local-expand/capture-lifts',
+        u'local-transformer-expand', u'local-transformer-expand/capture-lifts',
+        u'locale-string-encoding', u'log', u'log-all-levels', u'log-level-evt',
+        u'log-level?', u'log-max-level', u'log-message', u'log-receiver?',
+        u'logger-name', u'logger?', u'magnitude', u'make-arity-at-least',
+        u'make-base-empty-namespace', u'make-base-namespace', u'make-bytes',
+        u'make-channel', u'make-chaperone-contract',
+        u'make-continuation-mark-key', u'make-continuation-prompt-tag',
+        u'make-contract', u'make-custodian', u'make-custodian-box',
+        u'make-custom-hash', u'make-custom-hash-types', u'make-custom-set',
+        u'make-custom-set-types', u'make-date', u'make-date*',
+        u'make-derived-parameter', u'make-directory', u'make-directory*',
+        u'make-do-sequence', u'make-empty-namespace',
+        u'make-environment-variables', u'make-ephemeron', u'make-exn',
+        u'make-exn:break', u'make-exn:break:hang-up', u'make-exn:break:terminate',
+        u'make-exn:fail', u'make-exn:fail:contract',
+        u'make-exn:fail:contract:arity', u'make-exn:fail:contract:blame',
+        u'make-exn:fail:contract:continuation',
+        u'make-exn:fail:contract:divide-by-zero',
+        u'make-exn:fail:contract:non-fixnum-result',
+        u'make-exn:fail:contract:variable', u'make-exn:fail:filesystem',
+        u'make-exn:fail:filesystem:errno', u'make-exn:fail:filesystem:exists',
+        u'make-exn:fail:filesystem:missing-module',
+        u'make-exn:fail:filesystem:version', u'make-exn:fail:network',
+        u'make-exn:fail:network:errno', u'make-exn:fail:object',
+        u'make-exn:fail:out-of-memory', u'make-exn:fail:read',
+        u'make-exn:fail:read:eof', u'make-exn:fail:read:non-char',
+        u'make-exn:fail:syntax', u'make-exn:fail:syntax:missing-module',
+        u'make-exn:fail:syntax:unbound', u'make-exn:fail:unsupported',
+        u'make-exn:fail:user', u'make-file-or-directory-link',
+        u'make-flat-contract', u'make-fsemaphore', u'make-generic',
+        u'make-handle-get-preference-locked', u'make-hash',
+        u'make-hash-placeholder', u'make-hasheq', u'make-hasheq-placeholder',
+        u'make-hasheqv', u'make-hasheqv-placeholder',
+        u'make-immutable-custom-hash', u'make-immutable-hash',
+        u'make-immutable-hasheq', u'make-immutable-hasheqv',
+        u'make-impersonator-property', u'make-input-port',
+        u'make-input-port/read-to-peek', u'make-inspector',
+        u'make-keyword-procedure', u'make-known-char-range-list',
+        u'make-limited-input-port', u'make-list', u'make-lock-file-name',
+        u'make-log-receiver', u'make-logger', u'make-mixin-contract',
+        u'make-mutable-custom-set', u'make-none/c', u'make-object',
+        u'make-output-port', u'make-parameter', u'make-parent-directory*',
+        u'make-phantom-bytes', u'make-pipe', u'make-pipe-with-specials',
+        u'make-placeholder', u'make-plumber', u'make-polar', u'make-prefab-struct',
+        u'make-primitive-class', u'make-proj-contract',
+        u'make-pseudo-random-generator', u'make-reader-graph', u'make-readtable',
+        u'make-rectangular', u'make-rename-transformer',
+        u'make-resolved-module-path', u'make-security-guard', u'make-semaphore',
+        u'make-set!-transformer', u'make-shared-bytes', u'make-sibling-inspector',
+        u'make-special-comment', u'make-srcloc', u'make-string',
+        u'make-struct-field-accessor', u'make-struct-field-mutator',
+        u'make-struct-type', u'make-struct-type-property',
+        u'make-syntax-delta-introducer', u'make-syntax-introducer',
+        u'make-temporary-file', u'make-tentative-pretty-print-output-port',
+        u'make-thread-cell', u'make-thread-group', u'make-vector',
+        u'make-weak-box', u'make-weak-custom-hash', u'make-weak-custom-set',
+        u'make-weak-hash', u'make-weak-hasheq', u'make-weak-hasheqv',
+        u'make-will-executor', u'map', u'match-equality-test',
+        u'matches-arity-exactly?', u'max', u'mcar', u'mcdr', u'mcons', u'member',
+        u'member-name-key-hash-code', u'member-name-key=?', u'member-name-key?',
+        u'memf', u'memq', u'memv', u'merge-input', u'method-in-interface?', u'min',
+        u'mixin-contract', u'module->exports', u'module->imports',
+        u'module->language-info', u'module->namespace',
+        u'module-compiled-cross-phase-persistent?', u'module-compiled-exports',
+        u'module-compiled-imports', u'module-compiled-language-info',
+        u'module-compiled-name', u'module-compiled-submodules',
+        u'module-declared?', u'module-path-index-join',
+        u'module-path-index-resolve', u'module-path-index-split',
+        u'module-path-index-submodule', u'module-path-index?', u'module-path?',
+        u'module-predefined?', u'module-provide-protected?', u'modulo', u'mpair?',
+        u'mutable-set', u'mutable-seteq', u'mutable-seteqv', u'n->th',
+        u'nack-guard-evt', u'namespace-anchor->empty-namespace',
+        u'namespace-anchor->namespace', u'namespace-anchor?',
+        u'namespace-attach-module', u'namespace-attach-module-declaration',
+        u'namespace-base-phase', u'namespace-mapped-symbols',
+        u'namespace-module-identifier', u'namespace-module-registry',
+        u'namespace-require', u'namespace-require/constant',
+        u'namespace-require/copy', u'namespace-require/expansion-time',
+        u'namespace-set-variable-value!', u'namespace-symbol->identifier',
+        u'namespace-syntax-introduce', u'namespace-undefine-variable!',
+        u'namespace-unprotect-module', u'namespace-variable-value', u'namespace?',
+        u'nan?', u'natural-number/c', u'negate', u'negative?', u'never-evt',
+        u'new-∀/c', u'new-∃/c', u'newline', u'ninth', u'non-empty-listof',
+        u'non-empty-string?', u'none/c', u'normal-case-path', u'normalize-arity',
+        u'normalize-path', u'normalized-arity?', u'not', u'not/c', u'null', u'null?',
+        u'number->string', u'number?', u'numerator', u'object%', u'object->vector',
+        u'object-info', u'object-interface', u'object-method-arity-includes?',
+        u'object-name', u'object-or-false=?', u'object=?', u'object?', u'odd?',
+        u'one-of/c', u'open-input-bytes', u'open-input-file',
+        u'open-input-output-file', u'open-input-string', u'open-output-bytes',
+        u'open-output-file', u'open-output-nowhere', u'open-output-string',
+        u'or/c', u'order-of-magnitude', u'ormap', u'other-execute-bit',
+        u'other-read-bit', u'other-write-bit', u'output-port?', u'pair?',
+        u'parameter-procedure=?', u'parameter/c', u'parameter?',
+        u'parameterization?', u'parse-command-line', u'partition', u'path->bytes',
+        u'path->complete-path', u'path->directory-path', u'path->string',
+        u'path-add-suffix', u'path-convention-type', u'path-element->bytes',
+        u'path-element->string', u'path-element?', u'path-for-some-system?',
+        u'path-list-string->path-list', u'path-only', u'path-replace-suffix',
+        u'path-string?', u'path<?', u'path?', u'pathlist-closure', u'peek-byte',
+        u'peek-byte-or-special', u'peek-bytes', u'peek-bytes!', u'peek-bytes!-evt',
+        u'peek-bytes-avail!', u'peek-bytes-avail!*', u'peek-bytes-avail!-evt',
+        u'peek-bytes-avail!/enable-break', u'peek-bytes-evt', u'peek-char',
+        u'peek-char-or-special', u'peek-string', u'peek-string!',
+        u'peek-string!-evt', u'peek-string-evt', u'peeking-input-port',
+        u'permutations', u'phantom-bytes?', u'pi', u'pi.f', u'pipe-content-length',
+        u'place-break', u'place-channel', u'place-channel-get',
+        u'place-channel-put', u'place-channel-put/get', u'place-channel?',
+        u'place-dead-evt', u'place-enabled?', u'place-kill', u'place-location?',
+        u'place-message-allowed?', u'place-sleep', u'place-wait', u'place?',
+        u'placeholder-get', u'placeholder-set!', u'placeholder?',
+        u'plumber-add-flush!', u'plumber-flush-all',
+        u'plumber-flush-handle-remove!', u'plumber-flush-handle?', u'plumber?',
+        u'poll-guard-evt', u'port->bytes', u'port->bytes-lines', u'port->lines',
+        u'port->list', u'port->string', u'port-closed-evt', u'port-closed?',
+        u'port-commit-peeked', u'port-count-lines!', u'port-count-lines-enabled',
+        u'port-counts-lines?', u'port-display-handler', u'port-file-identity',
+        u'port-file-unlock', u'port-next-location', u'port-number?',
+        u'port-print-handler', u'port-progress-evt',
+        u'port-provides-progress-evts?', u'port-read-handler',
+        u'port-try-file-lock?', u'port-write-handler', u'port-writes-atomic?',
+        u'port-writes-special?', u'port?', u'positive?', u'predicate/c',
+        u'prefab-key->struct-type', u'prefab-key?', u'prefab-struct-key',
+        u'preferences-lock-file-mode', u'pregexp', u'pregexp?', u'pretty-display',
+        u'pretty-format', u'pretty-print', u'pretty-print-.-symbol-without-bars',
+        u'pretty-print-abbreviate-read-macros', u'pretty-print-columns',
+        u'pretty-print-current-style-table', u'pretty-print-depth',
+        u'pretty-print-exact-as-decimal', u'pretty-print-extend-style-table',
+        u'pretty-print-handler', u'pretty-print-newline',
+        u'pretty-print-post-print-hook', u'pretty-print-pre-print-hook',
+        u'pretty-print-print-hook', u'pretty-print-print-line',
+        u'pretty-print-remap-stylable', u'pretty-print-show-inexactness',
+        u'pretty-print-size-hook', u'pretty-print-style-table?',
+        u'pretty-printing', u'pretty-write', u'primitive-closure?',
+        u'primitive-result-arity', u'primitive?', u'print', u'print-as-expression',
+        u'print-boolean-long-form', u'print-box', u'print-graph',
+        u'print-hash-table', u'print-mpair-curly-braces',
+        u'print-pair-curly-braces', u'print-reader-abbreviations',
+        u'print-struct', u'print-syntax-width', u'print-unreadable',
+        u'print-vector-length', u'printable/c', u'printable<%>', u'printf',
+        u'println', u'procedure->method', u'procedure-arity',
+        u'procedure-arity-includes/c', u'procedure-arity-includes?',
+        u'procedure-arity?', u'procedure-closure-contents-eq?',
+        u'procedure-extract-target', u'procedure-keywords',
+        u'procedure-reduce-arity', u'procedure-reduce-keyword-arity',
+        u'procedure-rename', u'procedure-result-arity', u'procedure-specialize',
+        u'procedure-struct-type?', u'procedure?', u'process', u'process*',
+        u'process*/ports', u'process/ports', u'processor-count', u'progress-evt?',
+        u'promise-forced?', u'promise-running?', u'promise/c', u'promise/name?',
+        u'promise?', u'prop:arity-string', u'prop:arrow-contract',
+        u'prop:arrow-contract-get-info', u'prop:arrow-contract?', u'prop:blame',
+        u'prop:chaperone-contract', u'prop:checked-procedure', u'prop:contract',
+        u'prop:contracted', u'prop:custom-print-quotable', u'prop:custom-write',
+        u'prop:dict', u'prop:dict/contract', u'prop:equal+hash', u'prop:evt',
+        u'prop:exn:missing-module', u'prop:exn:srclocs',
+        u'prop:expansion-contexts', u'prop:flat-contract',
+        u'prop:impersonator-of', u'prop:input-port',
+        u'prop:liberal-define-context', u'prop:object-name',
+        u'prop:opt-chaperone-contract', u'prop:opt-chaperone-contract-get-test',
+        u'prop:opt-chaperone-contract?', u'prop:orc-contract',
+        u'prop:orc-contract-get-subcontracts', u'prop:orc-contract?',
+        u'prop:output-port', u'prop:place-location', u'prop:procedure',
+        u'prop:recursive-contract', u'prop:recursive-contract-unroll',
+        u'prop:recursive-contract?', u'prop:rename-transformer', u'prop:sequence',
+        u'prop:set!-transformer', u'prop:stream', u'proper-subset?',
+        u'pseudo-random-generator->vector', u'pseudo-random-generator-vector?',
+        u'pseudo-random-generator?', u'put-preferences', u'putenv', u'quotient',
+        u'quotient/remainder', u'radians->degrees', u'raise',
+        u'raise-argument-error', u'raise-arguments-error', u'raise-arity-error',
+        u'raise-blame-error', u'raise-contract-error', u'raise-mismatch-error',
+        u'raise-not-cons-blame-error', u'raise-range-error',
+        u'raise-result-error', u'raise-syntax-error', u'raise-type-error',
+        u'raise-user-error', u'random', u'random-seed', u'range', u'rational?',
+        u'rationalize', u'read', u'read-accept-bar-quote', u'read-accept-box',
+        u'read-accept-compiled', u'read-accept-dot', u'read-accept-graph',
+        u'read-accept-infix-dot', u'read-accept-lang', u'read-accept-quasiquote',
+        u'read-accept-reader', u'read-byte', u'read-byte-or-special',
+        u'read-bytes', u'read-bytes!', u'read-bytes!-evt', u'read-bytes-avail!',
+        u'read-bytes-avail!*', u'read-bytes-avail!-evt',
+        u'read-bytes-avail!/enable-break', u'read-bytes-evt', u'read-bytes-line',
+        u'read-bytes-line-evt', u'read-case-sensitive', u'read-cdot', u'read-char',
+        u'read-char-or-special', u'read-curly-brace-as-paren',
+        u'read-curly-brace-with-tag', u'read-decimal-as-inexact',
+        u'read-eval-print-loop', u'read-language', u'read-line', u'read-line-evt',
+        u'read-on-demand-source', u'read-square-bracket-as-paren',
+        u'read-square-bracket-with-tag', u'read-string', u'read-string!',
+        u'read-string!-evt', u'read-string-evt', u'read-syntax',
+        u'read-syntax/recursive', u'read/recursive', u'readtable-mapping',
+        u'readtable?', u'real->decimal-string', u'real->double-flonum',
+        u'real->floating-point-bytes', u'real->single-flonum', u'real-in',
+        u'real-part', u'real?', u'reencode-input-port', u'reencode-output-port',
+        u'regexp', u'regexp-match', u'regexp-match*', u'regexp-match-evt',
+        u'regexp-match-exact?', u'regexp-match-peek',
+        u'regexp-match-peek-immediate', u'regexp-match-peek-positions',
+        u'regexp-match-peek-positions*',
+        u'regexp-match-peek-positions-immediate',
+        u'regexp-match-peek-positions-immediate/end',
+        u'regexp-match-peek-positions/end', u'regexp-match-positions',
+        u'regexp-match-positions*', u'regexp-match-positions/end',
+        u'regexp-match/end', u'regexp-match?', u'regexp-max-lookbehind',
+        u'regexp-quote', u'regexp-replace', u'regexp-replace*',
+        u'regexp-replace-quote', u'regexp-replaces', u'regexp-split',
+        u'regexp-try-match', u'regexp?', u'relative-path?', u'relocate-input-port',
+        u'relocate-output-port', u'remainder', u'remf', u'remf*', u'remove',
+        u'remove*', u'remove-duplicates', u'remq', u'remq*', u'remv', u'remv*',
+        u'rename-contract', u'rename-file-or-directory',
+        u'rename-transformer-target', u'rename-transformer?', u'replace-evt',
+        u'reroot-path', u'resolve-path', u'resolved-module-path-name',
+        u'resolved-module-path?', u'rest', u'reverse', u'round', u'second',
+        u'seconds->date', u'security-guard?', u'semaphore-peek-evt',
+        u'semaphore-peek-evt?', u'semaphore-post', u'semaphore-try-wait?',
+        u'semaphore-wait', u'semaphore-wait/enable-break', u'semaphore?',
+        u'sequence->list', u'sequence->stream', u'sequence-add-between',
+        u'sequence-andmap', u'sequence-append', u'sequence-count',
+        u'sequence-filter', u'sequence-fold', u'sequence-for-each',
+        u'sequence-generate', u'sequence-generate*', u'sequence-length',
+        u'sequence-map', u'sequence-ormap', u'sequence-ref', u'sequence-tail',
+        u'sequence/c', u'sequence?', u'set', u'set!-transformer-procedure',
+        u'set!-transformer?', u'set->list', u'set->stream', u'set-add', u'set-add!',
+        u'set-box!', u'set-clear', u'set-clear!', u'set-copy', u'set-copy-clear',
+        u'set-count', u'set-empty?', u'set-eq?', u'set-equal?', u'set-eqv?',
+        u'set-first', u'set-for-each', u'set-implements/c', u'set-implements?',
+        u'set-intersect', u'set-intersect!', u'set-map', u'set-mcar!', u'set-mcdr!',
+        u'set-member?', u'set-mutable?', u'set-phantom-bytes!',
+        u'set-port-next-location!', u'set-remove', u'set-remove!', u'set-rest',
+        u'set-some-basic-contracts!', u'set-subtract', u'set-subtract!',
+        u'set-symmetric-difference', u'set-symmetric-difference!', u'set-union',
+        u'set-union!', u'set-weak?', u'set/c', u'set=?', u'set?', u'seteq', u'seteqv',
+        u'seventh', u'sgn', u'shared-bytes', u'shell-execute', u'shrink-path-wrt',
+        u'shuffle', u'simple-form-path', u'simplify-path', u'sin',
+        u'single-flonum?', u'sinh', u'sixth', u'skip-projection-wrapper?', u'sleep',
+        u'some-system-path->string', u'sort', u'special-comment-value',
+        u'special-comment?', u'special-filter-input-port', u'split-at',
+        u'split-at-right', u'split-common-prefix', u'split-path', u'splitf-at',
+        u'splitf-at-right', u'sqr', u'sqrt', u'srcloc', u'srcloc->string',
+        u'srcloc-column', u'srcloc-line', u'srcloc-position', u'srcloc-source',
+        u'srcloc-span', u'srcloc?', u'stop-after', u'stop-before', u'stream->list',
+        u'stream-add-between', u'stream-andmap', u'stream-append', u'stream-count',
+        u'stream-empty?', u'stream-filter', u'stream-first', u'stream-fold',
+        u'stream-for-each', u'stream-length', u'stream-map', u'stream-ormap',
+        u'stream-ref', u'stream-rest', u'stream-tail', u'stream/c', u'stream?',
+        u'string', u'string->bytes/latin-1', u'string->bytes/locale',
+        u'string->bytes/utf-8', u'string->immutable-string', u'string->keyword',
+        u'string->list', u'string->number', u'string->path',
+        u'string->path-element', u'string->some-system-path', u'string->symbol',
+        u'string->uninterned-symbol', u'string->unreadable-symbol',
+        u'string-append', u'string-append*', u'string-ci<=?', u'string-ci<?',
+        u'string-ci=?', u'string-ci>=?', u'string-ci>?', u'string-contains?',
+        u'string-copy', u'string-copy!', u'string-downcase',
+        u'string-environment-variable-name?', u'string-fill!', u'string-foldcase',
+        u'string-join', u'string-len/c', u'string-length', u'string-locale-ci<?',
+        u'string-locale-ci=?', u'string-locale-ci>?', u'string-locale-downcase',
+        u'string-locale-upcase', u'string-locale<?', u'string-locale=?',
+        u'string-locale>?', u'string-no-nuls?', u'string-normalize-nfc',
+        u'string-normalize-nfd', u'string-normalize-nfkc',
+        u'string-normalize-nfkd', u'string-normalize-spaces', u'string-port?',
+        u'string-prefix?', u'string-ref', u'string-replace', u'string-set!',
+        u'string-split', u'string-suffix?', u'string-titlecase', u'string-trim',
+        u'string-upcase', u'string-utf-8-length', u'string<=?', u'string<?',
+        u'string=?', u'string>=?', u'string>?', u'string?', u'struct->vector',
+        u'struct-accessor-procedure?', u'struct-constructor-procedure?',
+        u'struct-info', u'struct-mutator-procedure?',
+        u'struct-predicate-procedure?', u'struct-type-info',
+        u'struct-type-make-constructor', u'struct-type-make-predicate',
+        u'struct-type-property-accessor-procedure?', u'struct-type-property/c',
+        u'struct-type-property?', u'struct-type?', u'struct:arity-at-least',
+        u'struct:arrow-contract-info', u'struct:date', u'struct:date*',
+        u'struct:exn', u'struct:exn:break', u'struct:exn:break:hang-up',
+        u'struct:exn:break:terminate', u'struct:exn:fail',
+        u'struct:exn:fail:contract', u'struct:exn:fail:contract:arity',
+        u'struct:exn:fail:contract:blame',
+        u'struct:exn:fail:contract:continuation',
+        u'struct:exn:fail:contract:divide-by-zero',
+        u'struct:exn:fail:contract:non-fixnum-result',
+        u'struct:exn:fail:contract:variable', u'struct:exn:fail:filesystem',
+        u'struct:exn:fail:filesystem:errno',
+        u'struct:exn:fail:filesystem:exists',
+        u'struct:exn:fail:filesystem:missing-module',
+        u'struct:exn:fail:filesystem:version', u'struct:exn:fail:network',
+        u'struct:exn:fail:network:errno', u'struct:exn:fail:object',
+        u'struct:exn:fail:out-of-memory', u'struct:exn:fail:read',
+        u'struct:exn:fail:read:eof', u'struct:exn:fail:read:non-char',
+        u'struct:exn:fail:syntax', u'struct:exn:fail:syntax:missing-module',
+        u'struct:exn:fail:syntax:unbound', u'struct:exn:fail:unsupported',
+        u'struct:exn:fail:user', u'struct:srcloc',
+        u'struct:wrapped-extra-arg-arrow', u'struct?', u'sub1', u'subbytes',
+        u'subclass?', u'subclass?/c', u'subprocess', u'subprocess-group-enabled',
+        u'subprocess-kill', u'subprocess-pid', u'subprocess-status',
+        u'subprocess-wait', u'subprocess?', u'subset?', u'substring', u'suggest/c',
+        u'symbol->string', u'symbol-interned?', u'symbol-unreadable?', u'symbol<?',
+        u'symbol=?', u'symbol?', u'symbols', u'sync', u'sync/enable-break',
+        u'sync/timeout', u'sync/timeout/enable-break', u'syntax->datum',
+        u'syntax->list', u'syntax-arm', u'syntax-column', u'syntax-debug-info',
+        u'syntax-disarm', u'syntax-e', u'syntax-line',
+        u'syntax-local-bind-syntaxes', u'syntax-local-certifier',
+        u'syntax-local-context', u'syntax-local-expand-expression',
+        u'syntax-local-get-shadower', u'syntax-local-identifier-as-binding',
+        u'syntax-local-introduce', u'syntax-local-lift-context',
+        u'syntax-local-lift-expression', u'syntax-local-lift-module',
+        u'syntax-local-lift-module-end-declaration',
+        u'syntax-local-lift-provide', u'syntax-local-lift-require',
+        u'syntax-local-lift-values-expression',
+        u'syntax-local-make-definition-context',
+        u'syntax-local-make-delta-introducer',
+        u'syntax-local-module-defined-identifiers',
+        u'syntax-local-module-exports',
+        u'syntax-local-module-required-identifiers', u'syntax-local-name',
+        u'syntax-local-phase-level', u'syntax-local-submodules',
+        u'syntax-local-transforming-module-provides?', u'syntax-local-value',
+        u'syntax-local-value/immediate', u'syntax-original?', u'syntax-position',
+        u'syntax-property', u'syntax-property-preserved?',
+        u'syntax-property-symbol-keys', u'syntax-protect', u'syntax-rearm',
+        u'syntax-recertify', u'syntax-shift-phase-level', u'syntax-source',
+        u'syntax-source-module', u'syntax-span', u'syntax-taint',
+        u'syntax-tainted?', u'syntax-track-origin',
+        u'syntax-transforming-module-expression?',
+        u'syntax-transforming-with-lifts?', u'syntax-transforming?', u'syntax/c',
+        u'syntax?', u'system', u'system*', u'system*/exit-code',
+        u'system-big-endian?', u'system-idle-evt', u'system-language+country',
+        u'system-library-subpath', u'system-path-convention-type', u'system-type',
+        u'system/exit-code', u'tail-marks-match?', u'take', u'take-common-prefix',
+        u'take-right', u'takef', u'takef-right', u'tan', u'tanh',
+        u'tcp-abandon-port', u'tcp-accept', u'tcp-accept-evt',
+        u'tcp-accept-ready?', u'tcp-accept/enable-break', u'tcp-addresses',
+        u'tcp-close', u'tcp-connect', u'tcp-connect/enable-break', u'tcp-listen',
+        u'tcp-listener?', u'tcp-port?', u'tentative-pretty-print-port-cancel',
+        u'tentative-pretty-print-port-transfer', u'tenth', u'terminal-port?',
+        u'the-unsupplied-arg', u'third', u'thread', u'thread-cell-ref',
+        u'thread-cell-set!', u'thread-cell-values?', u'thread-cell?',
+        u'thread-dead-evt', u'thread-dead?', u'thread-group?', u'thread-receive',
+        u'thread-receive-evt', u'thread-resume', u'thread-resume-evt',
+        u'thread-rewind-receive', u'thread-running?', u'thread-send',
+        u'thread-suspend', u'thread-suspend-evt', u'thread-try-receive',
+        u'thread-wait', u'thread/suspend-to-kill', u'thread?', u'time-apply',
+        u'touch', u'transplant-input-port', u'transplant-output-port', u'true',
+        u'truncate', u'udp-addresses', u'udp-bind!', u'udp-bound?', u'udp-close',
+        u'udp-connect!', u'udp-connected?', u'udp-multicast-interface',
+        u'udp-multicast-join-group!', u'udp-multicast-leave-group!',
+        u'udp-multicast-loopback?', u'udp-multicast-set-interface!',
+        u'udp-multicast-set-loopback!', u'udp-multicast-set-ttl!',
+        u'udp-multicast-ttl', u'udp-open-socket', u'udp-receive!',
+        u'udp-receive!*', u'udp-receive!-evt', u'udp-receive!/enable-break',
+        u'udp-receive-ready-evt', u'udp-send', u'udp-send*', u'udp-send-evt',
+        u'udp-send-ready-evt', u'udp-send-to', u'udp-send-to*', u'udp-send-to-evt',
+        u'udp-send-to/enable-break', u'udp-send/enable-break', u'udp?', u'unbox',
+        u'uncaught-exception-handler', u'unit?', u'unspecified-dom',
+        u'unsupplied-arg?', u'use-collection-link-paths',
+        u'use-compiled-file-paths', u'use-user-specific-search-paths',
+        u'user-execute-bit', u'user-read-bit', u'user-write-bit', u'value-blame',
+        u'value-contract', u'values', u'variable-reference->empty-namespace',
+        u'variable-reference->module-base-phase',
+        u'variable-reference->module-declaration-inspector',
+        u'variable-reference->module-path-index',
+        u'variable-reference->module-source', u'variable-reference->namespace',
+        u'variable-reference->phase',
+        u'variable-reference->resolved-module-path',
+        u'variable-reference-constant?', u'variable-reference?', u'vector',
+        u'vector->immutable-vector', u'vector->list',
+        u'vector->pseudo-random-generator', u'vector->pseudo-random-generator!',
+        u'vector->values', u'vector-append', u'vector-argmax', u'vector-argmin',
+        u'vector-copy', u'vector-copy!', u'vector-count', u'vector-drop',
+        u'vector-drop-right', u'vector-fill!', u'vector-filter',
+        u'vector-filter-not', u'vector-immutable', u'vector-immutable/c',
+        u'vector-immutableof', u'vector-length', u'vector-map', u'vector-map!',
+        u'vector-member', u'vector-memq', u'vector-memv', u'vector-ref',
+        u'vector-set!', u'vector-set*!', u'vector-set-performance-stats!',
+        u'vector-split-at', u'vector-split-at-right', u'vector-take',
+        u'vector-take-right', u'vector/c', u'vector?', u'vectorof', u'version',
+        u'void', u'void?', u'weak-box-value', u'weak-box?', u'weak-set',
+        u'weak-seteq', u'weak-seteqv', u'will-execute', u'will-executor?',
+        u'will-register', u'will-try-execute', u'with-input-from-bytes',
+        u'with-input-from-file', u'with-input-from-string',
+        u'with-output-to-bytes', u'with-output-to-file', u'with-output-to-string',
+        u'would-be-future', u'wrap-evt', u'wrapped-extra-arg-arrow',
+        u'wrapped-extra-arg-arrow-extra-neg-party-argument',
+        u'wrapped-extra-arg-arrow-real-func', u'wrapped-extra-arg-arrow?',
+        u'writable<%>', u'write', u'write-byte', u'write-bytes',
+        u'write-bytes-avail', u'write-bytes-avail*', u'write-bytes-avail-evt',
+        u'write-bytes-avail/enable-break', u'write-char', u'write-special',
+        u'write-special-avail*', u'write-special-evt', u'write-string',
+        u'write-to-file', u'writeln', u'xor', u'zero?', u'~.a', u'~.s', u'~.v', u'~a',
+        u'~e', u'~r', u'~s', u'~v'
+    )
+
+    _opening_parenthesis = r'[([{]'
+    _closing_parenthesis = r'[)\]}]'
+    _delimiters = r'()[\]{}",\'`;\s'
+    _symbol = r'(?u)(?:\|[^|]*\||\\[\w\W]|[^|\\%s]+)+' % _delimiters
+    _exact_decimal_prefix = r'(?:#e)?(?:#d)?(?:#e)?'
+    _exponent = r'(?:[defls][-+]?\d+)'
+    _inexact_simple_no_hashes = r'(?:\d+(?:/\d+|\.\d*)?|\.\d+)'
+    _inexact_simple = (r'(?:%s|(?:\d+#+(?:\.#*|/\d+#*)?|\.\d+#+|'
+                       r'\d+(?:\.\d*#+|/\d+#+)))' % _inexact_simple_no_hashes)
+    _inexact_normal_no_hashes = r'(?:%s%s?)' % (_inexact_simple_no_hashes,
+                                                _exponent)
+    _inexact_normal = r'(?:%s%s?)' % (_inexact_simple, _exponent)
+    _inexact_special = r'(?:(?:inf|nan)\.[0f])'
+    _inexact_real = r'(?:[-+]?%s|[-+]%s)' % (_inexact_normal,
+                                             _inexact_special)
+    _inexact_unsigned = r'(?:%s|%s)' % (_inexact_normal, _inexact_special)
+
+    tokens = {
+        'root': [
+            (_closing_parenthesis, Error),
+            (r'(?!\Z)', Text, 'unquoted-datum')
+        ],
+        'datum': [
+            (r'(?s)#;|#![ /]([^\\\n]|\\.)*', Comment),
+            (u';[^\\n\\r\x85\u2028\u2029]*', Comment.Single),
+            (r'#\|', Comment.Multiline, 'block-comment'),
+
+            # Whitespaces
+            (r'(?u)\s+', Text),
+
+            # Numbers: Keep in mind Racket reader hash prefixes, which
+            # can denote the base or the type. These don't map neatly
+            # onto Pygments token types; some judgment calls here.
+
+            # #d or no prefix
+            (r'(?i)%s[-+]?\d+(?=[%s])' % (_exact_decimal_prefix, _delimiters),
+             Number.Integer, '#pop'),
+            (r'(?i)%s[-+]?(\d+(\.\d*)?|\.\d+)([deflst][-+]?\d+)?(?=[%s])' %
+             (_exact_decimal_prefix, _delimiters), Number.Float, '#pop'),
+            (r'(?i)%s[-+]?(%s([-+]%s?i)?|[-+]%s?i)(?=[%s])' %
+             (_exact_decimal_prefix, _inexact_normal_no_hashes,
+              _inexact_normal_no_hashes, _inexact_normal_no_hashes,
+              _delimiters), Number, '#pop'),
+
+            # Inexact without explicit #i
+            (r'(?i)(#d)?(%s([-+]%s?i)?|[-+]%s?i|%s@%s)(?=[%s])' %
+             (_inexact_real, _inexact_unsigned, _inexact_unsigned,
+              _inexact_real, _inexact_real, _delimiters), Number.Float,
+             '#pop'),
+
+            # The remaining extflonums
+            (r'(?i)(([-+]?%st[-+]?\d+)|[-+](inf|nan)\.t)(?=[%s])' %
+             (_inexact_simple, _delimiters), Number.Float, '#pop'),
+
+            # #b
+            (r'(?i)(#[ei])?#b%s' % _symbol, Number.Bin, '#pop'),
+
+            # #o
+            (r'(?i)(#[ei])?#o%s' % _symbol, Number.Oct, '#pop'),
+
+            # #x
+            (r'(?i)(#[ei])?#x%s' % _symbol, Number.Hex, '#pop'),
+
+            # #i is always inexact, i.e. float
+            (r'(?i)(#d)?#i%s' % _symbol, Number.Float, '#pop'),
+
+            # Strings and characters
+            (r'#?"', String.Double, ('#pop', 'string')),
+            (r'#<<(.+)\n(^(?!\1$).*$\n)*^\1$', String.Heredoc, '#pop'),
+            (r'#\\(u[\da-fA-F]{1,4}|U[\da-fA-F]{1,8})', String.Char, '#pop'),
+            (r'(?is)#\\([0-7]{3}|[a-z]+|.)', String.Char, '#pop'),
+            (r'(?s)#[pr]x#?"(\\?.)*?"', String.Regex, '#pop'),
+
+            # Constants
+            (r'#(true|false|[tTfF])', Name.Constant, '#pop'),
+
+            # Keyword argument names (e.g. #:keyword)
+            (r'#:%s' % _symbol, Keyword.Declaration, '#pop'),
+
+            # Reader extensions
+            (r'(#lang |#!)(\S+)',
+             bygroups(Keyword.Namespace, Name.Namespace)),
+            (r'#reader', Keyword.Namespace, 'quoted-datum'),
+
+            # Other syntax
+            (r"(?i)\.(?=[%s])|#c[is]|#['`]|#,@?" % _delimiters, Operator),
+            (r"'|#[s&]|#hash(eqv?)?|#\d*(?=%s)" % _opening_parenthesis,
+             Operator, ('#pop', 'quoted-datum'))
+        ],
+        'datum*': [
+            (r'`|,@?', Operator),
+            (_symbol, String.Symbol, '#pop'),
+            (r'[|\\]', Error),
+            default('#pop')
+        ],
+        'list': [
+            (_closing_parenthesis, Punctuation, '#pop')
+        ],
+        'unquoted-datum': [
+            include('datum'),
+            (r'quote(?=[%s])' % _delimiters, Keyword,
+             ('#pop', 'quoted-datum')),
+            (r'`', Operator, ('#pop', 'quasiquoted-datum')),
+            (r'quasiquote(?=[%s])' % _delimiters, Keyword,
+             ('#pop', 'quasiquoted-datum')),
+            (_opening_parenthesis, Punctuation, ('#pop', 'unquoted-list')),
+            (words(_keywords, prefix='(?u)', suffix='(?=[%s])' % _delimiters),
+             Keyword, '#pop'),
+            (words(_builtins, prefix='(?u)', suffix='(?=[%s])' % _delimiters),
+             Name.Builtin, '#pop'),
+            (_symbol, Name, '#pop'),
+            include('datum*')
+        ],
+        'unquoted-list': [
+            include('list'),
+            (r'(?!\Z)', Text, 'unquoted-datum')
+        ],
+        'quasiquoted-datum': [
+            include('datum'),
+            (r',@?', Operator, ('#pop', 'unquoted-datum')),
+            (r'unquote(-splicing)?(?=[%s])' % _delimiters, Keyword,
+             ('#pop', 'unquoted-datum')),
+            (_opening_parenthesis, Punctuation, ('#pop', 'quasiquoted-list')),
+            include('datum*')
+        ],
+        'quasiquoted-list': [
+            include('list'),
+            (r'(?!\Z)', Text, 'quasiquoted-datum')
+        ],
+        'quoted-datum': [
+            include('datum'),
+            (_opening_parenthesis, Punctuation, ('#pop', 'quoted-list')),
+            include('datum*')
+        ],
+        'quoted-list': [
+            include('list'),
+            (r'(?!\Z)', Text, 'quoted-datum')
+        ],
+        'block-comment': [
+            (r'#\|', Comment.Multiline, '#push'),
+            (r'\|#', Comment.Multiline, '#pop'),
+            (r'[^#|]+|.', Comment.Multiline)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)\\([0-7]{1,3}|x[\da-fA-F]{1,2}|u[\da-fA-F]{1,4}|'
+             r'U[\da-fA-F]{1,8}|.)', String.Escape),
+            (r'[^\\"]+', String.Double)
+        ]
+    }
+
+
+class NewLispLexer(RegexLexer):
+    """
+    For `newLISP. <www.newlisp.org>`_ source code (version 10.3.0).
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'NewLisp'
+    aliases = ['newlisp']
+    filenames = ['*.lsp', '*.nl', '*.kif']
+    mimetypes = ['text/x-newlisp', 'application/x-newlisp']
+
+    flags = re.IGNORECASE | re.MULTILINE | re.UNICODE
+
+    # list of built-in functions for newLISP version 10.3
+    builtins = (
+        '^', '--', '-', ':', '!', '!=', '?', '@', '*', '/', '&', '%', '+', '++',
+        '<', '<<', '<=', '=', '>', '>=', '>>', '|', '~', '$', '$0', '$1', '$10',
+        '$11', '$12', '$13', '$14', '$15', '$2', '$3', '$4', '$5', '$6', '$7',
+        '$8', '$9', '$args', '$idx', '$it', '$main-args', 'abort', 'abs',
+        'acos', 'acosh', 'add', 'address', 'amb', 'and',  'append-file',
+        'append', 'apply', 'args', 'array-list', 'array?', 'array', 'asin',
+        'asinh', 'assoc', 'atan', 'atan2', 'atanh', 'atom?', 'base64-dec',
+        'base64-enc', 'bayes-query', 'bayes-train', 'begin',
+        'beta', 'betai', 'bind', 'binomial', 'bits', 'callback',
+        'case', 'catch', 'ceil', 'change-dir', 'char', 'chop', 'Class', 'clean',
+        'close', 'command-event', 'cond', 'cons', 'constant',
+        'context?', 'context', 'copy-file', 'copy', 'cos', 'cosh', 'count',
+        'cpymem', 'crc32', 'crit-chi2', 'crit-z', 'current-line', 'curry',
+        'date-list', 'date-parse', 'date-value', 'date', 'debug', 'dec',
+        'def-new', 'default', 'define-macro', 'define',
+        'delete-file', 'delete-url', 'delete', 'destroy', 'det', 'device',
+        'difference', 'directory?', 'directory', 'div', 'do-until', 'do-while',
+        'doargs',  'dolist',  'dostring', 'dotimes',  'dotree', 'dump', 'dup',
+        'empty?', 'encrypt', 'ends-with', 'env', 'erf', 'error-event',
+        'eval-string', 'eval', 'exec', 'exists', 'exit', 'exp', 'expand',
+        'explode', 'extend', 'factor', 'fft', 'file-info', 'file?', 'filter',
+        'find-all', 'find', 'first', 'flat', 'float?', 'float', 'floor', 'flt',
+        'fn', 'for-all', 'for', 'fork', 'format', 'fv', 'gammai', 'gammaln',
+        'gcd', 'get-char', 'get-float', 'get-int', 'get-long', 'get-string',
+        'get-url', 'global?', 'global', 'if-not', 'if', 'ifft', 'import', 'inc',
+        'index', 'inf?', 'int', 'integer?', 'integer', 'intersect', 'invert',
+        'irr', 'join', 'lambda-macro', 'lambda?', 'lambda', 'last-error',
+        'last', 'legal?', 'length', 'let', 'letex', 'letn',
+        'list?', 'list', 'load', 'local', 'log', 'lookup',
+        'lower-case', 'macro?', 'main-args', 'MAIN', 'make-dir', 'map', 'mat',
+        'match', 'max', 'member', 'min', 'mod', 'module', 'mul', 'multiply',
+        'NaN?', 'net-accept', 'net-close', 'net-connect', 'net-error',
+        'net-eval', 'net-interface', 'net-ipv', 'net-listen', 'net-local',
+        'net-lookup', 'net-packet', 'net-peek', 'net-peer', 'net-ping',
+        'net-receive-from', 'net-receive-udp', 'net-receive', 'net-select',
+        'net-send-to', 'net-send-udp', 'net-send', 'net-service',
+        'net-sessions', 'new', 'nil?', 'nil', 'normal', 'not', 'now', 'nper',
+        'npv', 'nth', 'null?', 'number?', 'open', 'or', 'ostype', 'pack',
+        'parse-date', 'parse', 'peek', 'pipe', 'pmt', 'pop-assoc', 'pop',
+        'post-url', 'pow', 'prefix', 'pretty-print', 'primitive?', 'print',
+        'println', 'prob-chi2', 'prob-z', 'process', 'prompt-event',
+        'protected?', 'push', 'put-url', 'pv', 'quote?', 'quote', 'rand',
+        'random', 'randomize', 'read', 'read-char', 'read-expr', 'read-file',
+        'read-key', 'read-line', 'read-utf8', 'reader-event',
+        'real-path', 'receive', 'ref-all', 'ref', 'regex-comp', 'regex',
+        'remove-dir', 'rename-file', 'replace', 'reset', 'rest', 'reverse',
+        'rotate', 'round', 'save', 'search', 'seed', 'seek', 'select', 'self',
+        'semaphore', 'send', 'sequence', 'series', 'set-locale', 'set-ref-all',
+        'set-ref', 'set', 'setf',  'setq', 'sgn', 'share', 'signal', 'silent',
+        'sin', 'sinh', 'sleep', 'slice', 'sort', 'source', 'spawn', 'sqrt',
+        'starts-with', 'string?', 'string', 'sub', 'swap', 'sym', 'symbol?',
+        'symbols', 'sync', 'sys-error', 'sys-info', 'tan', 'tanh', 'term',
+        'throw-error', 'throw', 'time-of-day', 'time', 'timer', 'title-case',
+        'trace-highlight', 'trace', 'transpose', 'Tree', 'trim', 'true?',
+        'true', 'unicode', 'unify', 'unique', 'unless', 'unpack', 'until',
+        'upper-case', 'utf8', 'utf8len', 'uuid', 'wait-pid', 'when', 'while',
+        'write', 'write-char', 'write-file', 'write-line',
+        'xfer-event', 'xml-error', 'xml-parse', 'xml-type-tags', 'zero?',
+    )
+
+    # valid names
+    valid_name = r'([\w!$%&*+.,/<=>?@^~|-])+|(\[.*?\])+'
+
+    tokens = {
+        'root': [
+            # shebang
+            (r'#!(.*?)$', Comment.Preproc),
+            # comments starting with semicolon
+            (r';.*$', Comment.Single),
+            # comments starting with #
+            (r'#.*$', Comment.Single),
+
+            # whitespace
+            (r'\s+', Text),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\"|[^"])*"', String),
+
+            # braces
+            (r'\{', String, "bracestring"),
+
+            # [text] ... [/text] delimited strings
+            (r'\[text\]*', String, "tagstring"),
+
+            # 'special' operators...
+            (r"('|:)", Operator),
+
+            # highlight the builtins
+            (words(builtins, suffix=r'\b'),
+             Keyword),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Variable),
+
+            # the remaining variables
+            (valid_name, String.Symbol),
+
+            # parentheses
+            (r'(\(|\))', Punctuation),
+        ],
+
+        # braced strings...
+        'bracestring': [
+            (r'\{', String, "#push"),
+            (r'\}', String, "#pop"),
+            ('[^{}]+', String),
+        ],
+
+        # tagged [text]...[/text] delimited strings...
+        'tagstring': [
+            (r'(?s)(.*?)(\[/text\])', String, '#pop'),
+        ],
+    }
+
+
+class EmacsLispLexer(RegexLexer):
+    """
+    An ELisp lexer, parsing a stream and outputting the tokens
+    needed to highlight elisp code.
+
+    .. versionadded:: 2.1
+    """
+    name = 'EmacsLisp'
+    aliases = ['emacs', 'elisp', 'emacs-lisp']
+    filenames = ['*.el']
+    mimetypes = ['text/x-elisp', 'application/x-elisp']
+
+    flags = re.MULTILINE
+
+    # couple of useful regexes
+
+    # characters that are not macro-characters and can be used to begin a symbol
+    nonmacro = r'\\.|[\w!$%&*+-/<=>?@^{}~|]'
+    constituent = nonmacro + '|[#.:]'
+    terminated = r'(?=[ "()\]\'\n,;`])'  # whitespace or terminating macro characters
+
+    # symbol token, reverse-engineered from hyperspec
+    # Take a deep breath...
+    symbol = r'((?:%s)(?:%s)*)' % (nonmacro, constituent)
+
+    macros = set((
+        'atomic-change-group', 'case', 'block', 'cl-block', 'cl-callf', 'cl-callf2',
+        'cl-case', 'cl-decf', 'cl-declaim', 'cl-declare',
+        'cl-define-compiler-macro', 'cl-defmacro', 'cl-defstruct',
+        'cl-defsubst', 'cl-deftype', 'cl-defun', 'cl-destructuring-bind',
+        'cl-do', 'cl-do*', 'cl-do-all-symbols', 'cl-do-symbols', 'cl-dolist',
+        'cl-dotimes', 'cl-ecase', 'cl-etypecase', 'eval-when', 'cl-eval-when', 'cl-flet',
+        'cl-flet*', 'cl-function', 'cl-incf', 'cl-labels', 'cl-letf',
+        'cl-letf*', 'cl-load-time-value', 'cl-locally', 'cl-loop',
+        'cl-macrolet', 'cl-multiple-value-bind', 'cl-multiple-value-setq',
+        'cl-progv', 'cl-psetf', 'cl-psetq', 'cl-pushnew', 'cl-remf',
+        'cl-return', 'cl-return-from', 'cl-rotatef', 'cl-shiftf',
+        'cl-symbol-macrolet', 'cl-tagbody', 'cl-the', 'cl-typecase',
+        'combine-after-change-calls', 'condition-case-unless-debug', 'decf',
+        'declaim', 'declare', 'declare-function', 'def-edebug-spec',
+        'defadvice', 'defclass', 'defcustom', 'defface', 'defgeneric',
+        'defgroup', 'define-advice', 'define-alternatives',
+        'define-compiler-macro', 'define-derived-mode', 'define-generic-mode',
+        'define-global-minor-mode', 'define-globalized-minor-mode',
+        'define-minor-mode', 'define-modify-macro',
+        'define-obsolete-face-alias', 'define-obsolete-function-alias',
+        'define-obsolete-variable-alias', 'define-setf-expander',
+        'define-skeleton', 'defmacro', 'defmethod', 'defsetf', 'defstruct',
+        'defsubst', 'deftheme', 'deftype', 'defun', 'defvar-local',
+        'delay-mode-hooks', 'destructuring-bind', 'do', 'do*',
+        'do-all-symbols', 'do-symbols', 'dolist', 'dont-compile', 'dotimes',
+        'dotimes-with-progress-reporter', 'ecase', 'ert-deftest', 'etypecase',
+        'eval-and-compile', 'eval-when-compile', 'flet', 'ignore-errors',
+        'incf', 'labels', 'lambda', 'letrec', 'lexical-let', 'lexical-let*',
+        'loop', 'multiple-value-bind', 'multiple-value-setq', 'noreturn',
+        'oref', 'oref-default', 'oset', 'oset-default', 'pcase',
+        'pcase-defmacro', 'pcase-dolist', 'pcase-exhaustive', 'pcase-let',
+        'pcase-let*', 'pop', 'psetf', 'psetq', 'push', 'pushnew', 'remf',
+        'return', 'rotatef', 'rx', 'save-match-data', 'save-selected-window',
+        'save-window-excursion', 'setf', 'setq-local', 'shiftf',
+        'track-mouse', 'typecase', 'unless', 'use-package', 'when',
+        'while-no-input', 'with-case-table', 'with-category-table',
+        'with-coding-priority', 'with-current-buffer', 'with-demoted-errors',
+        'with-eval-after-load', 'with-file-modes', 'with-local-quit',
+        'with-output-to-string', 'with-output-to-temp-buffer',
+        'with-parsed-tramp-file-name', 'with-selected-frame',
+        'with-selected-window', 'with-silent-modifications', 'with-slots',
+        'with-syntax-table', 'with-temp-buffer', 'with-temp-file',
+        'with-temp-message', 'with-timeout', 'with-tramp-connection-property',
+        'with-tramp-file-property', 'with-tramp-progress-reporter',
+        'with-wrapper-hook', 'load-time-value', 'locally', 'macrolet', 'progv',
+        'return-from',
+    ))
+
+    special_forms = set((
+        'and', 'catch', 'cond', 'condition-case', 'defconst', 'defvar',
+        'function', 'if', 'interactive', 'let', 'let*', 'or', 'prog1',
+        'prog2', 'progn', 'quote', 'save-current-buffer', 'save-excursion',
+        'save-restriction', 'setq', 'setq-default', 'subr-arity',
+        'unwind-protect', 'while',
+    ))
+
+    builtin_function = set((
+        '%', '*', '+', '-', '/', '/=', '1+', '1-', '<', '<=', '=', '>', '>=',
+        'Snarf-documentation', 'abort-recursive-edit', 'abs',
+        'accept-process-output', 'access-file', 'accessible-keymaps', 'acos',
+        'active-minibuffer-window', 'add-face-text-property',
+        'add-name-to-file', 'add-text-properties', 'all-completions',
+        'append', 'apply', 'apropos-internal', 'aref', 'arrayp', 'aset',
+        'ash', 'asin', 'assoc', 'assoc-string', 'assq', 'atan', 'atom',
+        'autoload', 'autoload-do-load', 'backtrace', 'backtrace--locals',
+        'backtrace-debug', 'backtrace-eval', 'backtrace-frame',
+        'backward-char', 'backward-prefix-chars', 'barf-if-buffer-read-only',
+        'base64-decode-region', 'base64-decode-string',
+        'base64-encode-region', 'base64-encode-string', 'beginning-of-line',
+        'bidi-find-overridden-directionality', 'bidi-resolved-levels',
+        'bitmap-spec-p', 'bobp', 'bolp', 'bool-vector',
+        'bool-vector-count-consecutive', 'bool-vector-count-population',
+        'bool-vector-exclusive-or', 'bool-vector-intersection',
+        'bool-vector-not', 'bool-vector-p', 'bool-vector-set-difference',
+        'bool-vector-subsetp', 'bool-vector-union', 'boundp',
+        'buffer-base-buffer', 'buffer-chars-modified-tick',
+        'buffer-enable-undo', 'buffer-file-name', 'buffer-has-markers-at',
+        'buffer-list', 'buffer-live-p', 'buffer-local-value',
+        'buffer-local-variables', 'buffer-modified-p', 'buffer-modified-tick',
+        'buffer-name', 'buffer-size', 'buffer-string', 'buffer-substring',
+        'buffer-substring-no-properties', 'buffer-swap-text', 'bufferp',
+        'bury-buffer-internal', 'byte-code', 'byte-code-function-p',
+        'byte-to-position', 'byte-to-string', 'byteorder',
+        'call-interactively', 'call-last-kbd-macro', 'call-process',
+        'call-process-region', 'cancel-kbd-macro-events', 'capitalize',
+        'capitalize-region', 'capitalize-word', 'car', 'car-less-than-car',
+        'car-safe', 'case-table-p', 'category-docstring',
+        'category-set-mnemonics', 'category-table', 'category-table-p',
+        'ccl-execute', 'ccl-execute-on-string', 'ccl-program-p', 'cdr',
+        'cdr-safe', 'ceiling', 'char-after', 'char-before',
+        'char-category-set', 'char-charset', 'char-equal', 'char-or-string-p',
+        'char-resolve-modifiers', 'char-syntax', 'char-table-extra-slot',
+        'char-table-p', 'char-table-parent', 'char-table-range',
+        'char-table-subtype', 'char-to-string', 'char-width', 'characterp',
+        'charset-after', 'charset-id-internal', 'charset-plist',
+        'charset-priority-list', 'charsetp', 'check-coding-system',
+        'check-coding-systems-region', 'clear-buffer-auto-save-failure',
+        'clear-charset-maps', 'clear-face-cache', 'clear-font-cache',
+        'clear-image-cache', 'clear-string', 'clear-this-command-keys',
+        'close-font', 'clrhash', 'coding-system-aliases',
+        'coding-system-base', 'coding-system-eol-type', 'coding-system-p',
+        'coding-system-plist', 'coding-system-priority-list',
+        'coding-system-put', 'color-distance', 'color-gray-p',
+        'color-supported-p', 'combine-after-change-execute',
+        'command-error-default-function', 'command-remapping', 'commandp',
+        'compare-buffer-substrings', 'compare-strings',
+        'compare-window-configurations', 'completing-read',
+        'compose-region-internal', 'compose-string-internal',
+        'composition-get-gstring', 'compute-motion', 'concat', 'cons',
+        'consp', 'constrain-to-field', 'continue-process',
+        'controlling-tty-p', 'coordinates-in-window-p', 'copy-alist',
+        'copy-category-table', 'copy-file', 'copy-hash-table', 'copy-keymap',
+        'copy-marker', 'copy-sequence', 'copy-syntax-table', 'copysign',
+        'cos', 'current-active-maps', 'current-bidi-paragraph-direction',
+        'current-buffer', 'current-case-table', 'current-column',
+        'current-global-map', 'current-idle-time', 'current-indentation',
+        'current-input-mode', 'current-local-map', 'current-message',
+        'current-minor-mode-maps', 'current-time', 'current-time-string',
+        'current-time-zone', 'current-window-configuration',
+        'cygwin-convert-file-name-from-windows',
+        'cygwin-convert-file-name-to-windows', 'daemon-initialized',
+        'daemonp', 'dbus--init-bus', 'dbus-get-unique-name',
+        'dbus-message-internal', 'debug-timer-check', 'declare-equiv-charset',
+        'decode-big5-char', 'decode-char', 'decode-coding-region',
+        'decode-coding-string', 'decode-sjis-char', 'decode-time',
+        'default-boundp', 'default-file-modes', 'default-printer-name',
+        'default-toplevel-value', 'default-value', 'define-category',
+        'define-charset-alias', 'define-charset-internal',
+        'define-coding-system-alias', 'define-coding-system-internal',
+        'define-fringe-bitmap', 'define-hash-table-test', 'define-key',
+        'define-prefix-command', 'delete',
+        'delete-all-overlays', 'delete-and-extract-region', 'delete-char',
+        'delete-directory-internal', 'delete-field', 'delete-file',
+        'delete-frame', 'delete-other-windows-internal', 'delete-overlay',
+        'delete-process', 'delete-region', 'delete-terminal',
+        'delete-window-internal', 'delq', 'describe-buffer-bindings',
+        'describe-vector', 'destroy-fringe-bitmap', 'detect-coding-region',
+        'detect-coding-string', 'ding', 'directory-file-name',
+        'directory-files', 'directory-files-and-attributes', 'discard-input',
+        'display-supports-face-attributes-p', 'do-auto-save', 'documentation',
+        'documentation-property', 'downcase', 'downcase-region',
+        'downcase-word', 'draw-string', 'dump-colors', 'dump-emacs',
+        'dump-face', 'dump-frame-glyph-matrix', 'dump-glyph-matrix',
+        'dump-glyph-row', 'dump-redisplay-history', 'dump-tool-bar-row',
+        'elt', 'emacs-pid', 'encode-big5-char', 'encode-char',
+        'encode-coding-region', 'encode-coding-string', 'encode-sjis-char',
+        'encode-time', 'end-kbd-macro', 'end-of-line', 'eobp', 'eolp', 'eq',
+        'eql', 'equal', 'equal-including-properties', 'erase-buffer',
+        'error-message-string', 'eval', 'eval-buffer', 'eval-region',
+        'event-convert-list', 'execute-kbd-macro', 'exit-recursive-edit',
+        'exp', 'expand-file-name', 'expt', 'external-debugging-output',
+        'face-attribute-relative-p', 'face-attributes-as-vector', 'face-font',
+        'fboundp', 'fceiling', 'fetch-bytecode', 'ffloor',
+        'field-beginning', 'field-end', 'field-string',
+        'field-string-no-properties', 'file-accessible-directory-p',
+        'file-acl', 'file-attributes', 'file-attributes-lessp',
+        'file-directory-p', 'file-executable-p', 'file-exists-p',
+        'file-locked-p', 'file-modes', 'file-name-absolute-p',
+        'file-name-all-completions', 'file-name-as-directory',
+        'file-name-completion', 'file-name-directory',
+        'file-name-nondirectory', 'file-newer-than-file-p', 'file-readable-p',
+        'file-regular-p', 'file-selinux-context', 'file-symlink-p',
+        'file-system-info', 'file-system-info', 'file-writable-p',
+        'fillarray', 'find-charset-region', 'find-charset-string',
+        'find-coding-systems-region-internal', 'find-composition-internal',
+        'find-file-name-handler', 'find-font', 'find-operation-coding-system',
+        'float', 'float-time', 'floatp', 'floor', 'fmakunbound',
+        'following-char', 'font-at', 'font-drive-otf', 'font-face-attributes',
+        'font-family-list', 'font-get', 'font-get-glyphs',
+        'font-get-system-font', 'font-get-system-normal-font', 'font-info',
+        'font-match-p', 'font-otf-alternates', 'font-put',
+        'font-shape-gstring', 'font-spec', 'font-variation-glyphs',
+        'font-xlfd-name', 'fontp', 'fontset-font', 'fontset-info',
+        'fontset-list', 'fontset-list-all', 'force-mode-line-update',
+        'force-window-update', 'format', 'format-mode-line',
+        'format-network-address', 'format-time-string', 'forward-char',
+        'forward-comment', 'forward-line', 'forward-word',
+        'frame-border-width', 'frame-bottom-divider-width',
+        'frame-can-run-window-configuration-change-hook', 'frame-char-height',
+        'frame-char-width', 'frame-face-alist', 'frame-first-window',
+        'frame-focus', 'frame-font-cache', 'frame-fringe-width', 'frame-list',
+        'frame-live-p', 'frame-or-buffer-changed-p', 'frame-parameter',
+        'frame-parameters', 'frame-pixel-height', 'frame-pixel-width',
+        'frame-pointer-visible-p', 'frame-right-divider-width',
+        'frame-root-window', 'frame-scroll-bar-height',
+        'frame-scroll-bar-width', 'frame-selected-window', 'frame-terminal',
+        'frame-text-cols', 'frame-text-height', 'frame-text-lines',
+        'frame-text-width', 'frame-total-cols', 'frame-total-lines',
+        'frame-visible-p', 'framep', 'frexp', 'fringe-bitmaps-at-pos',
+        'fround', 'fset', 'ftruncate', 'funcall', 'funcall-interactively',
+        'function-equal', 'functionp', 'gap-position', 'gap-size',
+        'garbage-collect', 'gc-status', 'generate-new-buffer-name', 'get',
+        'get-buffer', 'get-buffer-create', 'get-buffer-process',
+        'get-buffer-window', 'get-byte', 'get-char-property',
+        'get-char-property-and-overlay', 'get-file-buffer', 'get-file-char',
+        'get-internal-run-time', 'get-load-suffixes', 'get-pos-property',
+        'get-process', 'get-screen-color', 'get-text-property',
+        'get-unicode-property-internal', 'get-unused-category',
+        'get-unused-iso-final-char', 'getenv-internal', 'gethash',
+        'gfile-add-watch', 'gfile-rm-watch', 'global-key-binding',
+        'gnutls-available-p', 'gnutls-boot', 'gnutls-bye', 'gnutls-deinit',
+        'gnutls-error-fatalp', 'gnutls-error-string', 'gnutls-errorp',
+        'gnutls-get-initstage', 'gnutls-peer-status',
+        'gnutls-peer-status-warning-describe', 'goto-char', 'gpm-mouse-start',
+        'gpm-mouse-stop', 'group-gid', 'group-real-gid',
+        'handle-save-session', 'handle-switch-frame', 'hash-table-count',
+        'hash-table-p', 'hash-table-rehash-size',
+        'hash-table-rehash-threshold', 'hash-table-size', 'hash-table-test',
+        'hash-table-weakness', 'iconify-frame', 'identity', 'image-flush',
+        'image-mask-p', 'image-metadata', 'image-size', 'imagemagick-types',
+        'imagep', 'indent-to', 'indirect-function', 'indirect-variable',
+        'init-image-library', 'inotify-add-watch', 'inotify-rm-watch',
+        'input-pending-p', 'insert', 'insert-and-inherit',
+        'insert-before-markers', 'insert-before-markers-and-inherit',
+        'insert-buffer-substring', 'insert-byte', 'insert-char',
+        'insert-file-contents', 'insert-startup-screen', 'int86',
+        'integer-or-marker-p', 'integerp', 'interactive-form', 'intern',
+        'intern-soft', 'internal--track-mouse', 'internal-char-font',
+        'internal-complete-buffer', 'internal-copy-lisp-face',
+        'internal-default-process-filter',
+        'internal-default-process-sentinel', 'internal-describe-syntax-value',
+        'internal-event-symbol-parse-modifiers',
+        'internal-face-x-get-resource', 'internal-get-lisp-face-attribute',
+        'internal-lisp-face-attribute-values', 'internal-lisp-face-empty-p',
+        'internal-lisp-face-equal-p', 'internal-lisp-face-p',
+        'internal-make-lisp-face', 'internal-make-var-non-special',
+        'internal-merge-in-global-face',
+        'internal-set-alternative-font-family-alist',
+        'internal-set-alternative-font-registry-alist',
+        'internal-set-font-selection-order',
+        'internal-set-lisp-face-attribute',
+        'internal-set-lisp-face-attribute-from-resource',
+        'internal-show-cursor', 'internal-show-cursor-p', 'interrupt-process',
+        'invisible-p', 'invocation-directory', 'invocation-name', 'isnan',
+        'iso-charset', 'key-binding', 'key-description',
+        'keyboard-coding-system', 'keymap-parent', 'keymap-prompt', 'keymapp',
+        'keywordp', 'kill-all-local-variables', 'kill-buffer', 'kill-emacs',
+        'kill-local-variable', 'kill-process', 'last-nonminibuffer-frame',
+        'lax-plist-get', 'lax-plist-put', 'ldexp', 'length',
+        'libxml-parse-html-region', 'libxml-parse-xml-region',
+        'line-beginning-position', 'line-end-position', 'line-pixel-height',
+        'list', 'list-fonts', 'list-system-processes', 'listp', 'load',
+        'load-average', 'local-key-binding', 'local-variable-if-set-p',
+        'local-variable-p', 'locale-info', 'locate-file-internal',
+        'lock-buffer', 'log', 'logand', 'logb', 'logior', 'lognot', 'logxor',
+        'looking-at', 'lookup-image', 'lookup-image-map', 'lookup-key',
+        'lower-frame', 'lsh', 'macroexpand', 'make-bool-vector',
+        'make-byte-code', 'make-category-set', 'make-category-table',
+        'make-char', 'make-char-table', 'make-directory-internal',
+        'make-frame-invisible', 'make-frame-visible', 'make-hash-table',
+        'make-indirect-buffer', 'make-keymap', 'make-list',
+        'make-local-variable', 'make-marker', 'make-network-process',
+        'make-overlay', 'make-serial-process', 'make-sparse-keymap',
+        'make-string', 'make-symbol', 'make-symbolic-link', 'make-temp-name',
+        'make-terminal-frame', 'make-variable-buffer-local',
+        'make-variable-frame-local', 'make-vector', 'makunbound',
+        'map-char-table', 'map-charset-chars', 'map-keymap',
+        'map-keymap-internal', 'mapatoms', 'mapc', 'mapcar', 'mapconcat',
+        'maphash', 'mark-marker', 'marker-buffer', 'marker-insertion-type',
+        'marker-position', 'markerp', 'match-beginning', 'match-data',
+        'match-end', 'matching-paren', 'max', 'max-char', 'md5', 'member',
+        'memory-info', 'memory-limit', 'memory-use-counts', 'memq', 'memql',
+        'menu-bar-menu-at-x-y', 'menu-or-popup-active-p',
+        'menu-or-popup-active-p', 'merge-face-attribute', 'message',
+        'message-box', 'message-or-box', 'min',
+        'minibuffer-completion-contents', 'minibuffer-contents',
+        'minibuffer-contents-no-properties', 'minibuffer-depth',
+        'minibuffer-prompt', 'minibuffer-prompt-end',
+        'minibuffer-selected-window', 'minibuffer-window', 'minibufferp',
+        'minor-mode-key-binding', 'mod', 'modify-category-entry',
+        'modify-frame-parameters', 'modify-syntax-entry',
+        'mouse-pixel-position', 'mouse-position', 'move-overlay',
+        'move-point-visually', 'move-to-column', 'move-to-window-line',
+        'msdos-downcase-filename', 'msdos-long-file-names', 'msdos-memget',
+        'msdos-memput', 'msdos-mouse-disable', 'msdos-mouse-enable',
+        'msdos-mouse-init', 'msdos-mouse-p', 'msdos-remember-default-colors',
+        'msdos-set-keyboard', 'msdos-set-mouse-buttons',
+        'multibyte-char-to-unibyte', 'multibyte-string-p', 'narrow-to-region',
+        'natnump', 'nconc', 'network-interface-info',
+        'network-interface-list', 'new-fontset', 'newline-cache-check',
+        'next-char-property-change', 'next-frame', 'next-overlay-change',
+        'next-property-change', 'next-read-file-uses-dialog-p',
+        'next-single-char-property-change', 'next-single-property-change',
+        'next-window', 'nlistp', 'nreverse', 'nth', 'nthcdr', 'null',
+        'number-or-marker-p', 'number-to-string', 'numberp',
+        'open-dribble-file', 'open-font', 'open-termscript',
+        'optimize-char-table', 'other-buffer', 'other-window-for-scrolling',
+        'overlay-buffer', 'overlay-end', 'overlay-get', 'overlay-lists',
+        'overlay-properties', 'overlay-put', 'overlay-recenter',
+        'overlay-start', 'overlayp', 'overlays-at', 'overlays-in',
+        'parse-partial-sexp', 'play-sound-internal', 'plist-get',
+        'plist-member', 'plist-put', 'point', 'point-marker', 'point-max',
+        'point-max-marker', 'point-min', 'point-min-marker',
+        'pos-visible-in-window-p', 'position-bytes', 'posix-looking-at',
+        'posix-search-backward', 'posix-search-forward', 'posix-string-match',
+        'posn-at-point', 'posn-at-x-y', 'preceding-char',
+        'prefix-numeric-value', 'previous-char-property-change',
+        'previous-frame', 'previous-overlay-change',
+        'previous-property-change', 'previous-single-char-property-change',
+        'previous-single-property-change', 'previous-window', 'prin1',
+        'prin1-to-string', 'princ', 'print', 'process-attributes',
+        'process-buffer', 'process-coding-system', 'process-command',
+        'process-connection', 'process-contact', 'process-datagram-address',
+        'process-exit-status', 'process-filter', 'process-filter-multibyte-p',
+        'process-id', 'process-inherit-coding-system-flag', 'process-list',
+        'process-mark', 'process-name', 'process-plist',
+        'process-query-on-exit-flag', 'process-running-child-p',
+        'process-send-eof', 'process-send-region', 'process-send-string',
+        'process-sentinel', 'process-status', 'process-tty-name',
+        'process-type', 'processp', 'profiler-cpu-log',
+        'profiler-cpu-running-p', 'profiler-cpu-start', 'profiler-cpu-stop',
+        'profiler-memory-log', 'profiler-memory-running-p',
+        'profiler-memory-start', 'profiler-memory-stop', 'propertize',
+        'purecopy', 'put', 'put-text-property',
+        'put-unicode-property-internal', 'puthash', 'query-font',
+        'query-fontset', 'quit-process', 'raise-frame', 'random', 'rassoc',
+        'rassq', 're-search-backward', 're-search-forward', 'read',
+        'read-buffer', 'read-char', 'read-char-exclusive',
+        'read-coding-system', 'read-command', 'read-event',
+        'read-from-minibuffer', 'read-from-string', 'read-function',
+        'read-key-sequence', 'read-key-sequence-vector',
+        'read-no-blanks-input', 'read-non-nil-coding-system', 'read-string',
+        'read-variable', 'recent-auto-save-p', 'recent-doskeys',
+        'recent-keys', 'recenter', 'recursion-depth', 'recursive-edit',
+        'redirect-debugging-output', 'redirect-frame-focus', 'redisplay',
+        'redraw-display', 'redraw-frame', 'regexp-quote', 'region-beginning',
+        'region-end', 'register-ccl-program', 'register-code-conversion-map',
+        'remhash', 'remove-list-of-text-properties', 'remove-text-properties',
+        'rename-buffer', 'rename-file', 'replace-match',
+        'reset-this-command-lengths', 'resize-mini-window-internal',
+        'restore-buffer-modified-p', 'resume-tty', 'reverse', 'round',
+        'run-hook-with-args', 'run-hook-with-args-until-failure',
+        'run-hook-with-args-until-success', 'run-hook-wrapped', 'run-hooks',
+        'run-window-configuration-change-hook', 'run-window-scroll-functions',
+        'safe-length', 'scan-lists', 'scan-sexps', 'scroll-down',
+        'scroll-left', 'scroll-other-window', 'scroll-right', 'scroll-up',
+        'search-backward', 'search-forward', 'secure-hash', 'select-frame',
+        'select-window', 'selected-frame', 'selected-window',
+        'self-insert-command', 'send-string-to-terminal', 'sequencep',
+        'serial-process-configure', 'set', 'set-buffer',
+        'set-buffer-auto-saved', 'set-buffer-major-mode',
+        'set-buffer-modified-p', 'set-buffer-multibyte', 'set-case-table',
+        'set-category-table', 'set-char-table-extra-slot',
+        'set-char-table-parent', 'set-char-table-range', 'set-charset-plist',
+        'set-charset-priority', 'set-coding-system-priority',
+        'set-cursor-size', 'set-default', 'set-default-file-modes',
+        'set-default-toplevel-value', 'set-file-acl', 'set-file-modes',
+        'set-file-selinux-context', 'set-file-times', 'set-fontset-font',
+        'set-frame-height', 'set-frame-position', 'set-frame-selected-window',
+        'set-frame-size', 'set-frame-width', 'set-fringe-bitmap-face',
+        'set-input-interrupt-mode', 'set-input-meta-mode', 'set-input-mode',
+        'set-keyboard-coding-system-internal', 'set-keymap-parent',
+        'set-marker', 'set-marker-insertion-type', 'set-match-data',
+        'set-message-beep', 'set-minibuffer-window',
+        'set-mouse-pixel-position', 'set-mouse-position',
+        'set-network-process-option', 'set-output-flow-control',
+        'set-process-buffer', 'set-process-coding-system',
+        'set-process-datagram-address', 'set-process-filter',
+        'set-process-filter-multibyte',
+        'set-process-inherit-coding-system-flag', 'set-process-plist',
+        'set-process-query-on-exit-flag', 'set-process-sentinel',
+        'set-process-window-size', 'set-quit-char',
+        'set-safe-terminal-coding-system-internal', 'set-screen-color',
+        'set-standard-case-table', 'set-syntax-table',
+        'set-terminal-coding-system-internal', 'set-terminal-local-value',
+        'set-terminal-parameter', 'set-text-properties', 'set-time-zone-rule',
+        'set-visited-file-modtime', 'set-window-buffer',
+        'set-window-combination-limit', 'set-window-configuration',
+        'set-window-dedicated-p', 'set-window-display-table',
+        'set-window-fringes', 'set-window-hscroll', 'set-window-margins',
+        'set-window-new-normal', 'set-window-new-pixel',
+        'set-window-new-total', 'set-window-next-buffers',
+        'set-window-parameter', 'set-window-point', 'set-window-prev-buffers',
+        'set-window-redisplay-end-trigger', 'set-window-scroll-bars',
+        'set-window-start', 'set-window-vscroll', 'setcar', 'setcdr',
+        'setplist', 'show-face-resources', 'signal', 'signal-process', 'sin',
+        'single-key-description', 'skip-chars-backward', 'skip-chars-forward',
+        'skip-syntax-backward', 'skip-syntax-forward', 'sleep-for', 'sort',
+        'sort-charsets', 'special-variable-p', 'split-char',
+        'split-window-internal', 'sqrt', 'standard-case-table',
+        'standard-category-table', 'standard-syntax-table', 'start-kbd-macro',
+        'start-process', 'stop-process', 'store-kbd-macro-event', 'string',
+        'string-as-multibyte', 'string-as-unibyte', 'string-bytes',
+        'string-collate-equalp', 'string-collate-lessp', 'string-equal',
+        'string-lessp', 'string-make-multibyte', 'string-make-unibyte',
+        'string-match', 'string-to-char', 'string-to-multibyte',
+        'string-to-number', 'string-to-syntax', 'string-to-unibyte',
+        'string-width', 'stringp', 'subr-name', 'subrp',
+        'subst-char-in-region', 'substitute-command-keys',
+        'substitute-in-file-name', 'substring', 'substring-no-properties',
+        'suspend-emacs', 'suspend-tty', 'suspicious-object', 'sxhash',
+        'symbol-function', 'symbol-name', 'symbol-plist', 'symbol-value',
+        'symbolp', 'syntax-table', 'syntax-table-p', 'system-groups',
+        'system-move-file-to-trash', 'system-name', 'system-users', 'tan',
+        'terminal-coding-system', 'terminal-list', 'terminal-live-p',
+        'terminal-local-value', 'terminal-name', 'terminal-parameter',
+        'terminal-parameters', 'terpri', 'test-completion',
+        'text-char-description', 'text-properties-at', 'text-property-any',
+        'text-property-not-all', 'this-command-keys',
+        'this-command-keys-vector', 'this-single-command-keys',
+        'this-single-command-raw-keys', 'time-add', 'time-less-p',
+        'time-subtract', 'tool-bar-get-system-style', 'tool-bar-height',
+        'tool-bar-pixel-width', 'top-level', 'trace-redisplay',
+        'trace-to-stderr', 'translate-region-internal', 'transpose-regions',
+        'truncate', 'try-completion', 'tty-display-color-cells',
+        'tty-display-color-p', 'tty-no-underline',
+        'tty-suppress-bold-inverse-default-colors', 'tty-top-frame',
+        'tty-type', 'type-of', 'undo-boundary', 'unencodable-char-position',
+        'unhandled-file-name-directory', 'unibyte-char-to-multibyte',
+        'unibyte-string', 'unicode-property-table-internal', 'unify-charset',
+        'unintern', 'unix-sync', 'unlock-buffer', 'upcase', 'upcase-initials',
+        'upcase-initials-region', 'upcase-region', 'upcase-word',
+        'use-global-map', 'use-local-map', 'user-full-name',
+        'user-login-name', 'user-real-login-name', 'user-real-uid',
+        'user-uid', 'variable-binding-locus', 'vconcat', 'vector',
+        'vector-or-char-table-p', 'vectorp', 'verify-visited-file-modtime',
+        'vertical-motion', 'visible-frame-list', 'visited-file-modtime',
+        'w16-get-clipboard-data', 'w16-selection-exists-p',
+        'w16-set-clipboard-data', 'w32-battery-status',
+        'w32-default-color-map', 'w32-define-rgb-color',
+        'w32-display-monitor-attributes-list', 'w32-frame-menu-bar-size',
+        'w32-frame-rect', 'w32-get-clipboard-data',
+        'w32-get-codepage-charset', 'w32-get-console-codepage',
+        'w32-get-console-output-codepage', 'w32-get-current-locale-id',
+        'w32-get-default-locale-id', 'w32-get-keyboard-layout',
+        'w32-get-locale-info', 'w32-get-valid-codepages',
+        'w32-get-valid-keyboard-layouts', 'w32-get-valid-locale-ids',
+        'w32-has-winsock', 'w32-long-file-name', 'w32-reconstruct-hot-key',
+        'w32-register-hot-key', 'w32-registered-hot-keys',
+        'w32-selection-exists-p', 'w32-send-sys-command',
+        'w32-set-clipboard-data', 'w32-set-console-codepage',
+        'w32-set-console-output-codepage', 'w32-set-current-locale',
+        'w32-set-keyboard-layout', 'w32-set-process-priority',
+        'w32-shell-execute', 'w32-short-file-name', 'w32-toggle-lock-key',
+        'w32-unload-winsock', 'w32-unregister-hot-key', 'w32-window-exists-p',
+        'w32notify-add-watch', 'w32notify-rm-watch',
+        'waiting-for-user-input-p', 'where-is-internal', 'widen',
+        'widget-apply', 'widget-get', 'widget-put',
+        'window-absolute-pixel-edges', 'window-at', 'window-body-height',
+        'window-body-width', 'window-bottom-divider-width', 'window-buffer',
+        'window-combination-limit', 'window-configuration-frame',
+        'window-configuration-p', 'window-dedicated-p',
+        'window-display-table', 'window-edges', 'window-end', 'window-frame',
+        'window-fringes', 'window-header-line-height', 'window-hscroll',
+        'window-inside-absolute-pixel-edges', 'window-inside-edges',
+        'window-inside-pixel-edges', 'window-left-child',
+        'window-left-column', 'window-line-height', 'window-list',
+        'window-list-1', 'window-live-p', 'window-margins',
+        'window-minibuffer-p', 'window-mode-line-height', 'window-new-normal',
+        'window-new-pixel', 'window-new-total', 'window-next-buffers',
+        'window-next-sibling', 'window-normal-size', 'window-old-point',
+        'window-parameter', 'window-parameters', 'window-parent',
+        'window-pixel-edges', 'window-pixel-height', 'window-pixel-left',
+        'window-pixel-top', 'window-pixel-width', 'window-point',
+        'window-prev-buffers', 'window-prev-sibling',
+        'window-redisplay-end-trigger', 'window-resize-apply',
+        'window-resize-apply-total', 'window-right-divider-width',
+        'window-scroll-bar-height', 'window-scroll-bar-width',
+        'window-scroll-bars', 'window-start', 'window-system',
+        'window-text-height', 'window-text-pixel-size', 'window-text-width',
+        'window-top-child', 'window-top-line', 'window-total-height',
+        'window-total-width', 'window-use-time', 'window-valid-p',
+        'window-vscroll', 'windowp', 'write-char', 'write-region',
+        'x-backspace-delete-keys-p', 'x-change-window-property',
+        'x-change-window-property', 'x-close-connection',
+        'x-close-connection', 'x-create-frame', 'x-create-frame',
+        'x-delete-window-property', 'x-delete-window-property',
+        'x-disown-selection-internal', 'x-display-backing-store',
+        'x-display-backing-store', 'x-display-color-cells',
+        'x-display-color-cells', 'x-display-grayscale-p',
+        'x-display-grayscale-p', 'x-display-list', 'x-display-list',
+        'x-display-mm-height', 'x-display-mm-height', 'x-display-mm-width',
+        'x-display-mm-width', 'x-display-monitor-attributes-list',
+        'x-display-pixel-height', 'x-display-pixel-height',
+        'x-display-pixel-width', 'x-display-pixel-width', 'x-display-planes',
+        'x-display-planes', 'x-display-save-under', 'x-display-save-under',
+        'x-display-screens', 'x-display-screens', 'x-display-visual-class',
+        'x-display-visual-class', 'x-family-fonts', 'x-file-dialog',
+        'x-file-dialog', 'x-file-dialog', 'x-focus-frame', 'x-frame-geometry',
+        'x-frame-geometry', 'x-get-atom-name', 'x-get-resource',
+        'x-get-selection-internal', 'x-hide-tip', 'x-hide-tip',
+        'x-list-fonts', 'x-load-color-file', 'x-menu-bar-open-internal',
+        'x-menu-bar-open-internal', 'x-open-connection', 'x-open-connection',
+        'x-own-selection-internal', 'x-parse-geometry', 'x-popup-dialog',
+        'x-popup-menu', 'x-register-dnd-atom', 'x-select-font',
+        'x-select-font', 'x-selection-exists-p', 'x-selection-owner-p',
+        'x-send-client-message', 'x-server-max-request-size',
+        'x-server-max-request-size', 'x-server-vendor', 'x-server-vendor',
+        'x-server-version', 'x-server-version', 'x-show-tip', 'x-show-tip',
+        'x-synchronize', 'x-synchronize', 'x-uses-old-gtk-dialog',
+        'x-window-property', 'x-window-property', 'x-wm-set-size-hint',
+        'xw-color-defined-p', 'xw-color-defined-p', 'xw-color-values',
+        'xw-color-values', 'xw-display-color-p', 'xw-display-color-p',
+        'yes-or-no-p', 'zlib-available-p', 'zlib-decompress-region',
+        'forward-point',
+    ))
+
+    builtin_function_highlighted = set((
+        'defvaralias', 'provide', 'require',
+        'with-no-warnings', 'define-widget', 'with-electric-help',
+        'throw', 'defalias', 'featurep'
+    ))
+
+    lambda_list_keywords = set((
+        '&allow-other-keys', '&aux', '&body', '&environment', '&key', '&optional',
+        '&rest', '&whole',
+    ))
+
+    error_keywords = set((
+        'cl-assert', 'cl-check-type', 'error', 'signal',
+        'user-error', 'warn',
+    ))
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name.Variable:
+                if value in EmacsLispLexer.builtin_function:
+                    yield index, Name.Function, value
+                    continue
+                if value in EmacsLispLexer.special_forms:
+                    yield index, Keyword, value
+                    continue
+                if value in EmacsLispLexer.error_keywords:
+                    yield index, Name.Exception, value
+                    continue
+                if value in EmacsLispLexer.builtin_function_highlighted:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in EmacsLispLexer.macros:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in EmacsLispLexer.lambda_list_keywords:
+                    yield index, Keyword.Pseudo, value
+                    continue
+            yield index, token, value
+
+    tokens = {
+        'root': [
+            default('body'),
+        ],
+        'body': [
+            # whitespace
+            (r'\s+', Text),
+
+            # single-line comment
+            (r';.*$', Comment.Single),
+
+            # strings and characters
+            (r'"', String, 'string'),
+            (r'\?([^\\]|\\.)', String.Char),
+            # quoting
+            (r":" + symbol, Name.Builtin),
+            (r"::" + symbol, String.Symbol),
+            (r"'" + symbol, String.Symbol),
+            (r"'", Operator),
+            (r"`", Operator),
+
+            # decimal numbers
+            (r'[-+]?\d+\.?' + terminated, Number.Integer),
+            (r'[-+]?\d+/\d+' + terminated, Number),
+            (r'[-+]?(\d*\.\d+([defls][-+]?\d+)?|\d+(\.\d*)?[defls][-+]?\d+)' +
+             terminated, Number.Float),
+
+            # vectors
+            (r'\[|\]', Punctuation),
+
+            # uninterned symbol
+            (r'#:' + symbol, String.Symbol),
+
+            # read syntax for char tables
+            (r'#\^\^?', Operator),
+
+            # function shorthand
+            (r'#\'', Name.Function),
+
+            # binary rational
+            (r'#[bB][+-]?[01]+(/[01]+)?', Number.Bin),
+
+            # octal rational
+            (r'#[oO][+-]?[0-7]+(/[0-7]+)?', Number.Oct),
+
+            # hex rational
+            (r'#[xX][+-]?[0-9a-fA-F]+(/[0-9a-fA-F]+)?', Number.Hex),
+
+            # radix rational
+            (r'#\d+r[+-]?[0-9a-zA-Z]+(/[0-9a-zA-Z]+)?', Number),
+
+            # reference
+            (r'#\d+=', Operator),
+            (r'#\d+#', Operator),
+
+            # special operators that should have been parsed already
+            (r'(,@|,|\.|:)', Operator),
+
+            # special constants
+            (r'(t|nil)' + terminated, Name.Constant),
+
+            # functions and variables
+            (r'\*' + symbol + '\*', Name.Variable.Global),
+            (symbol, Name.Variable),
+
+            # parentheses
+            (r'#\(', Operator, 'body'),
+            (r'\(', Punctuation, 'body'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r'[^"\\`]+', String),
+            (r'`%s\'' % symbol, String.Symbol),
+            (r'`', String),
+            (r'\\.', String),
+            (r'\\\n', String),
+            (r'"', String, '#pop'),
+        ],
+    }
+
+
+class ShenLexer(RegexLexer):
+    """
+    Lexer for `Shen <http://shenlanguage.org/>`_ source code.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Shen'
+    aliases = ['shen']
+    filenames = ['*.shen']
+    mimetypes = ['text/x-shen', 'application/x-shen']
+
+    DECLARATIONS = (
+        'datatype', 'define', 'defmacro', 'defprolog', 'defcc',
+        'synonyms', 'declare', 'package', 'type', 'function',
+    )
+
+    SPECIAL_FORMS = (
+        'lambda', 'get', 'let', 'if', 'cases', 'cond', 'put', 'time', 'freeze',
+        'value', 'load', '$', 'protect', 'or', 'and', 'not', 'do', 'output',
+        'prolog?', 'trap-error', 'error', 'make-string', '/.', 'set', '@p',
+        '@s', '@v',
+    )
+
+    BUILTINS = (
+        '==', '=', '*', '+', '-', '/', '<', '>', '>=', '<=', '<-address',
+        '<-vector', 'abort', 'absvector', 'absvector?', 'address->', 'adjoin',
+        'append', 'arity', 'assoc', 'bind', 'boolean?', 'bound?', 'call', 'cd',
+        'close', 'cn', 'compile', 'concat', 'cons', 'cons?', 'cut', 'destroy',
+        'difference', 'element?', 'empty?', 'enable-type-theory',
+        'error-to-string', 'eval', 'eval-kl', 'exception', 'explode', 'external',
+        'fail', 'fail-if', 'file', 'findall', 'fix', 'fst', 'fwhen', 'gensym',
+        'get-time', 'hash', 'hd', 'hdstr', 'hdv', 'head', 'identical',
+        'implementation', 'in', 'include', 'include-all-but', 'inferences',
+        'input', 'input+', 'integer?', 'intern', 'intersection', 'is', 'kill',
+        'language', 'length', 'limit', 'lineread', 'loaded', 'macro', 'macroexpand',
+        'map', 'mapcan', 'maxinferences', 'mode', 'n->string', 'nl', 'nth', 'null',
+        'number?', 'occurrences', 'occurs-check', 'open', 'os', 'out', 'port',
+        'porters', 'pos', 'pr', 'preclude', 'preclude-all-but', 'print', 'profile',
+        'profile-results', 'ps', 'quit', 'read', 'read+', 'read-byte', 'read-file',
+        'read-file-as-bytelist', 'read-file-as-string', 'read-from-string',
+        'release', 'remove', 'return', 'reverse', 'run', 'save', 'set',
+        'simple-error', 'snd', 'specialise', 'spy', 'step', 'stinput', 'stoutput',
+        'str', 'string->n', 'string->symbol', 'string?', 'subst', 'symbol?',
+        'systemf', 'tail', 'tc', 'tc?', 'thaw', 'tl', 'tlstr', 'tlv', 'track',
+        'tuple?', 'undefmacro', 'unify', 'unify!', 'union', 'unprofile',
+        'unspecialise', 'untrack', 'variable?', 'vector', 'vector->', 'vector?',
+        'verified', 'version', 'warn', 'when', 'write-byte', 'write-to-file',
+        'y-or-n?',
+    )
+
+    BUILTINS_ANYWHERE = ('where', 'skip', '>>', '_', '!', '<e>', '<!>')
+
+    MAPPINGS = dict((s, Keyword) for s in DECLARATIONS)
+    MAPPINGS.update((s, Name.Builtin) for s in BUILTINS)
+    MAPPINGS.update((s, Keyword) for s in SPECIAL_FORMS)
+
+    valid_symbol_chars = r'[\w!$%*+,<=>?/.\'@&#:-]'
+    valid_name = '%s+' % valid_symbol_chars
+    symbol_name = r'[a-z!$%%*+,<=>?/.\'@&#_-]%s*' % valid_symbol_chars
+    variable = r'[A-Z]%s*' % valid_symbol_chars
+
+    tokens = {
+        'string': [
+            (r'"', String, '#pop'),
+            (r'c#\d{1,3};', String.Escape),
+            (r'~[ARS%]', String.Interpol),
+            (r'(?s).', String),
+        ],
+
+        'root': [
+            (r'(?s)\\\*.*?\*\\', Comment.Multiline),  # \* ... *\
+            (r'\\\\.*', Comment.Single),              # \\ ...
+            (r'\s+', Text),
+            (r'_{5,}', Punctuation),
+            (r'={5,}', Punctuation),
+            (r'(;|:=|\||--?>|<--?)', Punctuation),
+            (r'(:-|:|\{|\})', Literal),
+            (r'[+-]*\d*\.\d+(e[+-]?\d+)?', Number.Float),
+            (r'[+-]*\d+', Number.Integer),
+            (r'"', String, 'string'),
+            (variable, Name.Variable),
+            (r'(true|false|<>|\[\])', Keyword.Pseudo),
+            (symbol_name, Literal),
+            (r'(\[|\]|\(|\))', Punctuation),
+        ],
+    }
+
+    def get_tokens_unprocessed(self, text):
+        tokens = RegexLexer.get_tokens_unprocessed(self, text)
+        tokens = self._process_symbols(tokens)
+        tokens = self._process_declarations(tokens)
+        return tokens
+
+    def _relevant(self, token):
+        return token not in (Text, Comment.Single, Comment.Multiline)
+
+    def _process_declarations(self, tokens):
+        opening_paren = False
+        for index, token, value in tokens:
+            yield index, token, value
+            if self._relevant(token):
+                if opening_paren and token == Keyword and value in self.DECLARATIONS:
+                    declaration = value
+                    for index, token, value in \
+                            self._process_declaration(declaration, tokens):
+                        yield index, token, value
+                opening_paren = value == '(' and token == Punctuation
+
+    def _process_symbols(self, tokens):
+        opening_paren = False
+        for index, token, value in tokens:
+            if opening_paren and token in (Literal, Name.Variable):
+                token = self.MAPPINGS.get(value, Name.Function)
+            elif token == Literal and value in self.BUILTINS_ANYWHERE:
+                token = Name.Builtin
+            opening_paren = value == '(' and token == Punctuation
+            yield index, token, value
+
+    def _process_declaration(self, declaration, tokens):
+        for index, token, value in tokens:
+            if self._relevant(token):
+                break
+            yield index, token, value
+
+        if declaration == 'datatype':
+            prev_was_colon = False
+            token = Keyword.Type if token == Literal else token
+            yield index, token, value
+            for index, token, value in tokens:
+                if prev_was_colon and token == Literal:
+                    token = Keyword.Type
+                yield index, token, value
+                if self._relevant(token):
+                    prev_was_colon = token == Literal and value == ':'
+        elif declaration == 'package':
+            token = Name.Namespace if token == Literal else token
+            yield index, token, value
+        elif declaration == 'define':
+            token = Name.Function if token == Literal else token
+            yield index, token, value
+            for index, token, value in tokens:
+                if self._relevant(token):
+                    break
+                yield index, token, value
+            if value == '{' and token == Literal:
+                yield index, Punctuation, value
+                for index, token, value in self._process_signature(tokens):
+                    yield index, token, value
+            else:
+                yield index, token, value
+        else:
+            token = Name.Function if token == Literal else token
+            yield index, token, value
+
+        raise StopIteration
+
+    def _process_signature(self, tokens):
+        for index, token, value in tokens:
+            if token == Literal and value == '}':
+                yield index, Punctuation, value
+                raise StopIteration
+            elif token in (Literal, Name.Function):
+                token = Name.Variable if value.istitle() else Keyword.Type
+            yield index, token, value
+
+
+class CPSALexer(SchemeLexer):
+    """
+    A CPSA lexer based on the CPSA language as of version 2.2.12
+
+    .. versionadded:: 2.1
+    """
+    name = 'CPSA'
+    aliases = ['cpsa']
+    filenames = ['*.cpsa']
+    mimetypes = []
+
+    # list of known keywords and builtins taken form vim 6.4 scheme.vim
+    # syntax file.
+    _keywords = (
+        'herald', 'vars', 'defmacro', 'include', 'defprotocol', 'defrole',
+        'defskeleton', 'defstrand', 'deflistener', 'non-orig', 'uniq-orig',
+        'pen-non-orig', 'precedes', 'trace', 'send', 'recv', 'name', 'text',
+        'skey', 'akey', 'data', 'mesg',
+    )
+    _builtins = (
+        'cat', 'enc', 'hash', 'privk', 'pubk', 'invk', 'ltk', 'gen', 'exp',
+    )
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+    valid_name = r'[\w!$%&*+,/:<=>?@^~|-]+'
+
+    tokens = {
+        'root': [
+            # the comments - always starting with semicolon
+            # and going to the end of the line
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r'\s+', Text),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            # support for uncommon kinds of numbers -
+            # have to figure out what the characters mean
+            # (r'(#e|#i|#b|#o|#d|#x)[\d.]+', Number),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'" + valid_name, String.Symbol),
+            (r"#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)", String.Char),
+
+            # constants
+            (r'(#t|#f)', Name.Constant),
+
+            # special operators
+            (r"('|#|`|,@|,|\.)", Operator),
+
+            # highlight the keywords
+            (words(_keywords, suffix=r'\b'), Keyword),
+
+            # first variable in a quoted string like
+            # '(this is syntactic sugar)
+            (r"(?<='\()" + valid_name, Name.Variable),
+            (r"(?<=#\()" + valid_name, Name.Variable),
+
+            # highlight the builtins
+            (words(_builtins, prefix=r'(?<=\()', suffix=r'\b'), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+            (r'(\[|\])', Punctuation),
+        ],
+    }
+
+
+class XtlangLexer(RegexLexer):
+    """An xtlang lexer for the `Extempore programming environment
+    <http://extempore.moso.com.au>`_.
+
+    This is a mixture of Scheme and xtlang, really. Keyword lists are
+    taken from the Extempore Emacs mode
+    (https://github.com/extemporelang/extempore-emacs-mode)
+
+    .. versionadded:: 2.2
+    """
+    name = 'xtlang'
+    aliases = ['extempore']
+    filenames = ['*.xtm']
+    mimetypes = []
+
+    common_keywords = (
+        'lambda', 'define', 'if', 'else', 'cond', 'and',
+        'or', 'let', 'begin', 'set!', 'map', 'for-each',
+    )
+    scheme_keywords = (
+        'do', 'delay', 'quasiquote', 'unquote', 'unquote-splicing', 'eval',
+        'case', 'let*', 'letrec', 'quote',
+    )
+    xtlang_bind_keywords = (
+        'bind-func', 'bind-val', 'bind-lib', 'bind-type', 'bind-alias',
+        'bind-poly', 'bind-dylib', 'bind-lib-func', 'bind-lib-val',
+    )
+    xtlang_keywords = (
+        'letz', 'memzone', 'cast', 'convert', 'dotimes', 'doloop',
+    )
+    common_functions = (
+        '*', '+', '-', '/', '<', '<=', '=', '>', '>=', '%', 'abs', 'acos',
+        'angle', 'append', 'apply', 'asin', 'assoc', 'assq', 'assv',
+        'atan', 'boolean?', 'caaaar', 'caaadr', 'caaar', 'caadar',
+        'caaddr', 'caadr', 'caar', 'cadaar', 'cadadr', 'cadar',
+        'caddar', 'cadddr', 'caddr', 'cadr', 'car', 'cdaaar',
+        'cdaadr', 'cdaar', 'cdadar', 'cdaddr', 'cdadr', 'cdar',
+        'cddaar', 'cddadr', 'cddar', 'cdddar', 'cddddr', 'cdddr',
+        'cddr', 'cdr', 'ceiling', 'cons', 'cos', 'floor', 'length',
+        'list', 'log', 'max', 'member', 'min', 'modulo', 'not',
+        'reverse', 'round', 'sin', 'sqrt', 'substring', 'tan',
+        'println', 'random', 'null?', 'callback', 'now',
+    )
+    scheme_functions = (
+        'call-with-current-continuation', 'call-with-input-file',
+        'call-with-output-file', 'call-with-values', 'call/cc',
+        'char->integer', 'char-alphabetic?', 'char-ci<=?', 'char-ci<?',
+        'char-ci=?', 'char-ci>=?', 'char-ci>?', 'char-downcase',
+        'char-lower-case?', 'char-numeric?', 'char-ready?',
+        'char-upcase', 'char-upper-case?', 'char-whitespace?',
+        'char<=?', 'char<?', 'char=?', 'char>=?', 'char>?', 'char?',
+        'close-input-port', 'close-output-port', 'complex?',
+        'current-input-port', 'current-output-port', 'denominator',
+        'display', 'dynamic-wind', 'eof-object?', 'eq?', 'equal?',
+        'eqv?', 'even?', 'exact->inexact', 'exact?', 'exp', 'expt',
+        'force', 'gcd', 'imag-part', 'inexact->exact', 'inexact?',
+        'input-port?', 'integer->char', 'integer?',
+        'interaction-environment', 'lcm', 'list->string',
+        'list->vector', 'list-ref', 'list-tail', 'list?', 'load',
+        'magnitude', 'make-polar', 'make-rectangular', 'make-string',
+        'make-vector', 'memq', 'memv', 'negative?', 'newline',
+        'null-environment', 'number->string', 'number?',
+        'numerator', 'odd?', 'open-input-file', 'open-output-file',
+        'output-port?', 'pair?', 'peek-char', 'port?', 'positive?',
+        'procedure?', 'quotient', 'rational?', 'rationalize', 'read',
+        'read-char', 'real-part', 'real?',
+        'remainder', 'scheme-report-environment', 'set-car!', 'set-cdr!',
+        'string', 'string->list', 'string->number', 'string->symbol',
+        'string-append', 'string-ci<=?', 'string-ci<?', 'string-ci=?',
+        'string-ci>=?', 'string-ci>?', 'string-copy', 'string-fill!',
+        'string-length', 'string-ref', 'string-set!', 'string<=?',
+        'string<?', 'string=?', 'string>=?', 'string>?', 'string?',
+        'symbol->string', 'symbol?', 'transcript-off', 'transcript-on',
+        'truncate', 'values', 'vector', 'vector->list', 'vector-fill!',
+        'vector-length', 'vector?',
+        'with-input-from-file', 'with-output-to-file', 'write',
+        'write-char', 'zero?',
+    )
+    xtlang_functions = (
+        'toString', 'afill!', 'pfill!', 'tfill!', 'tbind', 'vfill!',
+        'array-fill!', 'pointer-fill!', 'tuple-fill!', 'vector-fill!', 'free',
+        'array', 'tuple', 'list', '~', 'cset!', 'cref', '&', 'bor',
+        'ang-names', '<<', '>>', 'nil', 'printf', 'sprintf', 'null', 'now',
+        'pset!', 'pref-ptr', 'vset!', 'vref', 'aset!', 'aref', 'aref-ptr',
+        'tset!', 'tref', 'tref-ptr', 'salloc', 'halloc', 'zalloc', 'alloc',
+        'schedule', 'exp', 'log', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan',
+        'sqrt', 'expt', 'floor', 'ceiling', 'truncate', 'round',
+        'llvm_printf', 'push_zone', 'pop_zone', 'memzone', 'callback',
+        'llvm_sprintf', 'make-array', 'array-set!', 'array-ref',
+        'array-ref-ptr', 'pointer-set!', 'pointer-ref', 'pointer-ref-ptr',
+        'stack-alloc', 'heap-alloc', 'zone-alloc', 'make-tuple', 'tuple-set!',
+        'tuple-ref', 'tuple-ref-ptr', 'closure-set!', 'closure-ref', 'pref',
+        'pdref', 'impc_null', 'bitcast', 'void', 'ifret', 'ret->', 'clrun->',
+        'make-env-zone', 'make-env', '<>', 'dtof', 'ftod', 'i1tof',
+        'i1tod', 'i1toi8', 'i1toi32', 'i1toi64', 'i8tof', 'i8tod',
+        'i8toi1', 'i8toi32', 'i8toi64', 'i32tof', 'i32tod', 'i32toi1',
+        'i32toi8', 'i32toi64', 'i64tof', 'i64tod', 'i64toi1',
+        'i64toi8', 'i64toi32',
+    )
+
+    # valid names for Scheme identifiers (names cannot consist fully
+    # of numbers, but this should be good enough for now)
+    valid_scheme_name = r'[\w!$%&*+,/:<=>?@^~|-]+'
+
+    # valid characters in xtlang names & types
+    valid_xtlang_name = r'[\w.!-]+'
+    valid_xtlang_type = r'[]{}[\w<>,*/|!-]+'
+
+    tokens = {
+        # keep track of when we're exiting the xtlang form
+        'xtlang': [
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+
+            (r'(?<=bind-func\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-val\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-type\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-alias\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-poly\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-lib\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-dylib\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-lib-func\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-lib-val\s)' + valid_xtlang_name, Name.Function),
+
+            # type annotations
+            (r':' + valid_xtlang_type, Keyword.Type),
+
+            # types
+            (r'(<' + valid_xtlang_type + r'>|\|' + valid_xtlang_type + r'\||/' +
+             valid_xtlang_type + r'/|' + valid_xtlang_type + r'\*)\**',
+             Keyword.Type),
+
+            # keywords
+            (words(xtlang_keywords, prefix=r'(?<=\()'), Keyword),
+
+            # builtins
+            (words(xtlang_functions, prefix=r'(?<=\()'), Name.Function),
+
+            include('common'),
+
+            # variables
+            (valid_xtlang_name, Name.Variable),
+        ],
+        'scheme': [
+            # quoted symbols
+            (r"'" + valid_scheme_name, String.Symbol),
+
+            # char literals
+            (r"#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)", String.Char),
+
+            # special operators
+            (r"('|#|`|,@|,|\.)", Operator),
+
+            # keywords
+            (words(scheme_keywords, prefix=r'(?<=\()'), Keyword),
+
+            # builtins
+            (words(scheme_functions, prefix=r'(?<=\()'), Name.Function),
+
+            include('common'),
+
+            # variables
+            (valid_scheme_name, Name.Variable),
+        ],
+        # common to both xtlang and Scheme
+        'common': [
+            # comments
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r'\s+', Text),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+
+            # binary/oct/hex literals
+            (r'(#b|#o|#x)[\d.]+', Number),
+
+            # strings
+            (r'"(\\\\|\\"|[^"])*"', String),
+
+            # true/false constants
+            (r'(#t|#f)', Name.Constant),
+
+            # keywords
+            (words(common_keywords, prefix=r'(?<=\()'), Keyword),
+
+            # builtins
+            (words(common_functions, prefix=r'(?<=\()'), Name.Function),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+        ],
+        'root': [
+            # go into xtlang mode
+            (words(xtlang_bind_keywords, prefix=r'(?<=\()', suffix=r'\b'),
+             Keyword, 'xtlang'),
+
+            include('scheme')
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/objective.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/objective.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/objective.py	(revision 1126)
@@ -0,0 +1,504 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.objective
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Objective-C family languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, words, \
+    inherit, default
+from pygments.token import Text, Keyword, Name, String, Operator, \
+    Number, Punctuation, Literal, Comment
+
+from pygments.lexers.c_cpp import CLexer, CppLexer
+
+__all__ = ['ObjectiveCLexer', 'ObjectiveCppLexer', 'LogosLexer', 'SwiftLexer']
+
+
+def objective(baselexer):
+    """
+    Generate a subclass of baselexer that accepts the Objective-C syntax
+    extensions.
+    """
+
+    # Have to be careful not to accidentally match JavaDoc/Doxygen syntax here,
+    # since that's quite common in ordinary C/C++ files.  It's OK to match
+    # JavaDoc/Doxygen keywords that only apply to Objective-C, mind.
+    #
+    # The upshot of this is that we CANNOT match @class or @interface
+    _oc_keywords = re.compile(r'@(?:end|implementation|protocol)')
+
+    # Matches [ <ws>? identifier <ws> ( identifier <ws>? ] |  identifier? : )
+    # (note the identifier is *optional* when there is a ':'!)
+    _oc_message = re.compile(r'\[\s*[a-zA-Z_]\w*\s+'
+                             r'(?:[a-zA-Z_]\w*\s*\]|'
+                             r'(?:[a-zA-Z_]\w*)?:)')
+
+    class GeneratedObjectiveCVariant(baselexer):
+        """
+        Implements Objective-C syntax on top of an existing C family lexer.
+        """
+
+        tokens = {
+            'statements': [
+                (r'@"', String, 'string'),
+                (r'@(YES|NO)', Number),
+                (r"@'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+                (r'@(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+                (r'@(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+                (r'@0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+                (r'@0[0-7]+[Ll]?', Number.Oct),
+                (r'@\d+[Ll]?', Number.Integer),
+                (r'@\(', Literal, 'literal_number'),
+                (r'@\[', Literal, 'literal_array'),
+                (r'@\{', Literal, 'literal_dictionary'),
+                (words((
+                    '@selector', '@private', '@protected', '@public', '@encode',
+                    '@synchronized', '@try', '@throw', '@catch', '@finally',
+                    '@end', '@property', '@synthesize', '__bridge', '__bridge_transfer',
+                    '__autoreleasing', '__block', '__weak', '__strong', 'weak', 'strong',
+                    'copy', 'retain', 'assign', 'unsafe_unretained', 'atomic', 'nonatomic',
+                    'readonly', 'readwrite', 'setter', 'getter', 'typeof', 'in',
+                    'out', 'inout', 'release', 'class', '@dynamic', '@optional',
+                    '@required', '@autoreleasepool'), suffix=r'\b'),
+                 Keyword),
+                (words(('id', 'instancetype', 'Class', 'IMP', 'SEL', 'BOOL',
+                        'IBOutlet', 'IBAction', 'unichar'), suffix=r'\b'),
+                 Keyword.Type),
+                (r'@(true|false|YES|NO)\n', Name.Builtin),
+                (r'(YES|NO|nil|self|super)\b', Name.Builtin),
+                # Carbon types
+                (r'(Boolean|UInt8|SInt8|UInt16|SInt16|UInt32|SInt32)\b', Keyword.Type),
+                # Carbon built-ins
+                (r'(TRUE|FALSE)\b', Name.Builtin),
+                (r'(@interface|@implementation)(\s+)', bygroups(Keyword, Text),
+                 ('#pop', 'oc_classname')),
+                (r'(@class|@protocol)(\s+)', bygroups(Keyword, Text),
+                 ('#pop', 'oc_forward_classname')),
+                # @ can also prefix other expressions like @{...} or @(...)
+                (r'@', Punctuation),
+                inherit,
+            ],
+            'oc_classname': [
+                # interface definition that inherits
+                ('([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?(\s*)(\{)',
+                 bygroups(Name.Class, Text, Name.Class, Text, Punctuation),
+                 ('#pop', 'oc_ivars')),
+                ('([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?',
+                 bygroups(Name.Class, Text, Name.Class), '#pop'),
+                # interface definition for a category
+                ('([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))(\s*)(\{)',
+                 bygroups(Name.Class, Text, Name.Label, Text, Punctuation),
+                 ('#pop', 'oc_ivars')),
+                ('([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))',
+                 bygroups(Name.Class, Text, Name.Label), '#pop'),
+                # simple interface / implementation
+                ('([a-zA-Z$_][\w$]*)(\s*)(\{)',
+                 bygroups(Name.Class, Text, Punctuation), ('#pop', 'oc_ivars')),
+                ('([a-zA-Z$_][\w$]*)', Name.Class, '#pop')
+            ],
+            'oc_forward_classname': [
+                ('([a-zA-Z$_][\w$]*)(\s*,\s*)',
+                 bygroups(Name.Class, Text), 'oc_forward_classname'),
+                ('([a-zA-Z$_][\w$]*)(\s*;?)',
+                 bygroups(Name.Class, Text), '#pop')
+            ],
+            'oc_ivars': [
+                include('whitespace'),
+                include('statements'),
+                (';', Punctuation),
+                (r'\{', Punctuation, '#push'),
+                (r'\}', Punctuation, '#pop'),
+            ],
+            'root': [
+                # methods
+                (r'^([-+])(\s*)'                         # method marker
+                 r'(\(.*?\))?(\s*)'                      # return type
+                 r'([a-zA-Z$_][\w$]*:?)',        # begin of method name
+                 bygroups(Punctuation, Text, using(this),
+                          Text, Name.Function),
+                 'method'),
+                inherit,
+            ],
+            'method': [
+                include('whitespace'),
+                # TODO unsure if ellipses are allowed elsewhere, see
+                # discussion in Issue 789
+                (r',', Punctuation),
+                (r'\.\.\.', Punctuation),
+                (r'(\(.*?\))(\s*)([a-zA-Z$_][\w$]*)',
+                 bygroups(using(this), Text, Name.Variable)),
+                (r'[a-zA-Z$_][\w$]*:', Name.Function),
+                (';', Punctuation, '#pop'),
+                (r'\{', Punctuation, 'function'),
+                default('#pop'),
+            ],
+            'literal_number': [
+                (r'\(', Punctuation, 'literal_number_inner'),
+                (r'\)', Literal, '#pop'),
+                include('statement'),
+            ],
+            'literal_number_inner': [
+                (r'\(', Punctuation, '#push'),
+                (r'\)', Punctuation, '#pop'),
+                include('statement'),
+            ],
+            'literal_array': [
+                (r'\[', Punctuation, 'literal_array_inner'),
+                (r'\]', Literal, '#pop'),
+                include('statement'),
+            ],
+            'literal_array_inner': [
+                (r'\[', Punctuation, '#push'),
+                (r'\]', Punctuation, '#pop'),
+                include('statement'),
+            ],
+            'literal_dictionary': [
+                (r'\}', Literal, '#pop'),
+                include('statement'),
+            ],
+        }
+
+        def analyse_text(text):
+            if _oc_keywords.search(text):
+                return 1.0
+            elif '@"' in text:  # strings
+                return 0.8
+            elif re.search('@[0-9]+', text):
+                return 0.7
+            elif _oc_message.search(text):
+                return 0.8
+            return 0
+
+        def get_tokens_unprocessed(self, text):
+            from pygments.lexers._cocoa_builtins import COCOA_INTERFACES, \
+                COCOA_PROTOCOLS, COCOA_PRIMITIVES
+
+            for index, token, value in \
+                    baselexer.get_tokens_unprocessed(self, text):
+                if token is Name or token is Name.Class:
+                    if value in COCOA_INTERFACES or value in COCOA_PROTOCOLS \
+                       or value in COCOA_PRIMITIVES:
+                        token = Name.Builtin.Pseudo
+
+                yield index, token, value
+
+    return GeneratedObjectiveCVariant
+
+
+class ObjectiveCLexer(objective(CLexer)):
+    """
+    For Objective-C source code with preprocessor directives.
+    """
+
+    name = 'Objective-C'
+    aliases = ['objective-c', 'objectivec', 'obj-c', 'objc']
+    filenames = ['*.m', '*.h']
+    mimetypes = ['text/x-objective-c']
+    priority = 0.05    # Lower than C
+
+
+class ObjectiveCppLexer(objective(CppLexer)):
+    """
+    For Objective-C++ source code with preprocessor directives.
+    """
+
+    name = 'Objective-C++'
+    aliases = ['objective-c++', 'objectivec++', 'obj-c++', 'objc++']
+    filenames = ['*.mm', '*.hh']
+    mimetypes = ['text/x-objective-c++']
+    priority = 0.05    # Lower than C++
+
+
+class LogosLexer(ObjectiveCppLexer):
+    """
+    For Logos + Objective-C source code with preprocessor directives.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Logos'
+    aliases = ['logos']
+    filenames = ['*.x', '*.xi', '*.xm', '*.xmi']
+    mimetypes = ['text/x-logos']
+    priority = 0.25
+
+    tokens = {
+        'statements': [
+            (r'(%orig|%log)\b', Keyword),
+            (r'(%c)\b(\()(\s*)([a-zA-Z$_][\w$]*)(\s*)(\))',
+             bygroups(Keyword, Punctuation, Text, Name.Class, Text, Punctuation)),
+            (r'(%init)\b(\()',
+             bygroups(Keyword, Punctuation), 'logos_init_directive'),
+            (r'(%init)(?=\s*;)', bygroups(Keyword)),
+            (r'(%hook|%group)(\s+)([a-zA-Z$_][\w$]+)',
+             bygroups(Keyword, Text, Name.Class), '#pop'),
+            (r'(%subclass)(\s+)', bygroups(Keyword, Text),
+             ('#pop', 'logos_classname')),
+            inherit,
+        ],
+        'logos_init_directive': [
+            ('\s+', Text),
+            (',', Punctuation, ('logos_init_directive', '#pop')),
+            ('([a-zA-Z$_][\w$]*)(\s*)(=)(\s*)([^);]*)',
+             bygroups(Name.Class, Text, Punctuation, Text, Text)),
+            ('([a-zA-Z$_][\w$]*)', Name.Class),
+            ('\)', Punctuation, '#pop'),
+        ],
+        'logos_classname': [
+            ('([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?',
+             bygroups(Name.Class, Text, Name.Class), '#pop'),
+            ('([a-zA-Z$_][\w$]*)', Name.Class, '#pop')
+        ],
+        'root': [
+            (r'(%subclass)(\s+)', bygroups(Keyword, Text),
+             'logos_classname'),
+            (r'(%hook|%group)(\s+)([a-zA-Z$_][\w$]+)',
+             bygroups(Keyword, Text, Name.Class)),
+            (r'(%config)(\s*\(\s*)(\w+)(\s*=\s*)(.*?)(\s*\)\s*)',
+             bygroups(Keyword, Text, Name.Variable, Text, String, Text)),
+            (r'(%ctor)(\s*)(\{)', bygroups(Keyword, Text, Punctuation),
+             'function'),
+            (r'(%new)(\s*)(\()(\s*.*?\s*)(\))',
+             bygroups(Keyword, Text, Keyword, String, Keyword)),
+            (r'(\s*)(%end)(\s*)', bygroups(Text, Keyword, Text)),
+            inherit,
+        ],
+    }
+
+    _logos_keywords = re.compile(r'%(?:hook|ctor|init|c\()')
+
+    def analyse_text(text):
+        if LogosLexer._logos_keywords.search(text):
+            return 1.0
+        return 0
+
+
+class SwiftLexer(RegexLexer):
+    """
+    For `Swift <https://developer.apple.com/swift/>`_ source.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Swift'
+    filenames = ['*.swift']
+    aliases = ['swift']
+    mimetypes = ['text/x-swift']
+
+    tokens = {
+        'root': [
+            # Whitespace and Comments
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'//', Comment.Single, 'comment-single'),
+            (r'/\*', Comment.Multiline, 'comment-multi'),
+            (r'#(if|elseif|else|endif|available)\b', Comment.Preproc, 'preproc'),
+
+            # Keywords
+            include('keywords'),
+
+            # Global Types
+            (words((
+                'Array', 'AutoreleasingUnsafeMutablePointer', 'BidirectionalReverseView',
+                'Bit', 'Bool', 'CFunctionPointer', 'COpaquePointer', 'CVaListPointer',
+                'Character', 'ClosedInterval', 'CollectionOfOne', 'ContiguousArray',
+                'Dictionary', 'DictionaryGenerator', 'DictionaryIndex', 'Double',
+                'EmptyCollection', 'EmptyGenerator', 'EnumerateGenerator',
+                'EnumerateSequence', 'FilterCollectionView',
+                'FilterCollectionViewIndex', 'FilterGenerator', 'FilterSequenceView',
+                'Float', 'Float80', 'FloatingPointClassification', 'GeneratorOf',
+                'GeneratorOfOne', 'GeneratorSequence', 'HalfOpenInterval', 'HeapBuffer',
+                'HeapBufferStorage', 'ImplicitlyUnwrappedOptional', 'IndexingGenerator',
+                'Int', 'Int16', 'Int32', 'Int64', 'Int8', 'LazyBidirectionalCollection',
+                'LazyForwardCollection', 'LazyRandomAccessCollection',
+                'LazySequence', 'MapCollectionView', 'MapSequenceGenerator',
+                'MapSequenceView', 'MirrorDisposition', 'ObjectIdentifier', 'OnHeap',
+                'Optional', 'PermutationGenerator', 'QuickLookObject',
+                'RandomAccessReverseView', 'Range', 'RangeGenerator', 'RawByte', 'Repeat',
+                'ReverseBidirectionalIndex', 'ReverseRandomAccessIndex', 'SequenceOf',
+                'SinkOf', 'Slice', 'StaticString', 'StrideThrough', 'StrideThroughGenerator',
+                'StrideTo', 'StrideToGenerator', 'String', 'UInt', 'UInt16', 'UInt32',
+                'UInt64', 'UInt8', 'UTF16', 'UTF32', 'UTF8', 'UnicodeDecodingResult',
+                'UnicodeScalar', 'Unmanaged', 'UnsafeBufferPointer',
+                'UnsafeBufferPointerGenerator', 'UnsafeMutableBufferPointer',
+                'UnsafeMutablePointer', 'UnsafePointer', 'Zip2', 'ZipGenerator2',
+                # Protocols
+                'AbsoluteValuable', 'AnyObject', 'ArrayLiteralConvertible',
+                'BidirectionalIndexType', 'BitwiseOperationsType',
+                'BooleanLiteralConvertible', 'BooleanType', 'CVarArgType',
+                'CollectionType', 'Comparable', 'DebugPrintable',
+                'DictionaryLiteralConvertible', 'Equatable',
+                'ExtendedGraphemeClusterLiteralConvertible',
+                'ExtensibleCollectionType', 'FloatLiteralConvertible',
+                'FloatingPointType', 'ForwardIndexType', 'GeneratorType', 'Hashable',
+                'IntegerArithmeticType', 'IntegerLiteralConvertible', 'IntegerType',
+                'IntervalType', 'MirrorType', 'MutableCollectionType', 'MutableSliceable',
+                'NilLiteralConvertible', 'OutputStreamType', 'Printable',
+                'RandomAccessIndexType', 'RangeReplaceableCollectionType',
+                'RawOptionSetType', 'RawRepresentable', 'Reflectable', 'SequenceType',
+                'SignedIntegerType', 'SignedNumberType', 'SinkType', 'Sliceable',
+                'Streamable', 'Strideable', 'StringInterpolationConvertible',
+                'StringLiteralConvertible', 'UnicodeCodecType',
+                'UnicodeScalarLiteralConvertible', 'UnsignedIntegerType',
+                '_ArrayBufferType', '_BidirectionalIndexType', '_CocoaStringType',
+                '_CollectionType', '_Comparable', '_ExtensibleCollectionType',
+                '_ForwardIndexType', '_Incrementable', '_IntegerArithmeticType',
+                '_IntegerType', '_ObjectiveCBridgeable', '_RandomAccessIndexType',
+                '_RawOptionSetType', '_SequenceType', '_Sequence_Type',
+                '_SignedIntegerType', '_SignedNumberType', '_Sliceable', '_Strideable',
+                '_SwiftNSArrayRequiredOverridesType', '_SwiftNSArrayType',
+                '_SwiftNSCopyingType', '_SwiftNSDictionaryRequiredOverridesType',
+                '_SwiftNSDictionaryType', '_SwiftNSEnumeratorType',
+                '_SwiftNSFastEnumerationType', '_SwiftNSStringRequiredOverridesType',
+                '_SwiftNSStringType', '_UnsignedIntegerType',
+                # Variables
+                'C_ARGC', 'C_ARGV', 'Process',
+                # Typealiases
+                'Any', 'AnyClass', 'BooleanLiteralType', 'CBool', 'CChar', 'CChar16',
+                'CChar32', 'CDouble', 'CFloat', 'CInt', 'CLong', 'CLongLong', 'CShort',
+                'CSignedChar', 'CUnsignedInt', 'CUnsignedLong', 'CUnsignedShort',
+                'CWideChar', 'ExtendedGraphemeClusterType', 'Float32', 'Float64',
+                'FloatLiteralType', 'IntMax', 'IntegerLiteralType', 'StringLiteralType',
+                'UIntMax', 'UWord', 'UnicodeScalarType', 'Void', 'Word',
+                # Foundation/Cocoa
+                'NSErrorPointer', 'NSObjectProtocol', 'Selector'), suffix=r'\b'),
+             Name.Builtin),
+            # Functions
+            (words((
+                'abs', 'advance', 'alignof', 'alignofValue', 'assert', 'assertionFailure',
+                'contains', 'count', 'countElements', 'debugPrint', 'debugPrintln',
+                'distance', 'dropFirst', 'dropLast', 'dump', 'enumerate', 'equal',
+                'extend', 'fatalError', 'filter', 'find', 'first', 'getVaList', 'indices',
+                'insert', 'isEmpty', 'join', 'last', 'lazy', 'lexicographicalCompare',
+                'map', 'max', 'maxElement', 'min', 'minElement', 'numericCast', 'overlaps',
+                'partition', 'precondition', 'preconditionFailure', 'prefix', 'print',
+                'println', 'reduce', 'reflect', 'removeAll', 'removeAtIndex', 'removeLast',
+                'removeRange', 'reverse', 'sizeof', 'sizeofValue', 'sort', 'sorted',
+                'splice', 'split', 'startsWith', 'stride', 'strideof', 'strideofValue',
+                'suffix', 'swap', 'toDebugString', 'toString', 'transcode',
+                'underestimateCount', 'unsafeAddressOf', 'unsafeBitCast', 'unsafeDowncast',
+                'withExtendedLifetime', 'withUnsafeMutablePointer',
+                'withUnsafeMutablePointers', 'withUnsafePointer', 'withUnsafePointers',
+                'withVaList'), suffix=r'\b'),
+             Name.Builtin.Pseudo),
+
+            # Implicit Block Variables
+            (r'\$\d+', Name.Variable),
+
+            # Binary Literal
+            (r'0b[01_]+', Number.Bin),
+            # Octal Literal
+            (r'0o[0-7_]+', Number.Oct),
+            # Hexadecimal Literal
+            (r'0x[0-9a-fA-F_]+', Number.Hex),
+            # Decimal Literal
+            (r'[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*|[eE][+\-]?[0-9_]+)', Number.Float),
+            (r'[0-9][0-9_]*', Number.Integer),
+            # String Literal
+            (r'"', String, 'string'),
+
+            # Operators and Punctuation
+            (r'[(){}\[\].,:;=@#`?]|->|[<&?](?=\w)|(?<=\w)[>!?]', Punctuation),
+            (r'[/=\-+!*%<>&|^?~]+', Operator),
+
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name)
+        ],
+        'keywords': [
+            (words((
+                'as', 'break', 'case', 'catch', 'continue', 'default', 'defer',
+                'do', 'else', 'fallthrough', 'for', 'guard', 'if', 'in', 'is',
+                'repeat', 'return', '#selector', 'switch', 'throw', 'try',
+                'where', 'while'), suffix=r'\b'),
+             Keyword),
+            (r'@availability\([^)]+\)', Keyword.Reserved),
+            (words((
+                'associativity', 'convenience', 'dynamic', 'didSet', 'final',
+                'get', 'indirect', 'infix', 'inout', 'lazy', 'left', 'mutating',
+                'none', 'nonmutating', 'optional', 'override', 'postfix',
+                'precedence', 'prefix', 'Protocol', 'required', 'rethrows',
+                'right', 'set', 'throws', 'Type', 'unowned', 'weak', 'willSet',
+                '@availability', '@autoclosure', '@noreturn',
+                '@NSApplicationMain', '@NSCopying', '@NSManaged', '@objc',
+                '@UIApplicationMain', '@IBAction', '@IBDesignable',
+                '@IBInspectable', '@IBOutlet'), suffix=r'\b'),
+             Keyword.Reserved),
+            (r'(as|dynamicType|false|is|nil|self|Self|super|true|__COLUMN__'
+             r'|__FILE__|__FUNCTION__|__LINE__|_'
+             r'|#(?:file|line|column|function))\b', Keyword.Constant),
+            (r'import\b', Keyword.Declaration, 'module'),
+            (r'(class|enum|extension|struct|protocol)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Text, Name.Class)),
+            (r'(func)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Text, Name.Function)),
+            (r'(var|let)(\s+)([a-zA-Z_]\w*)', bygroups(Keyword.Declaration,
+             Text, Name.Variable)),
+            (words((
+                'class', 'deinit', 'enum', 'extension', 'func', 'import', 'init',
+                'internal', 'let', 'operator', 'private', 'protocol', 'public',
+                'static', 'struct', 'subscript', 'typealias', 'var'), suffix=r'\b'),
+             Keyword.Declaration)
+        ],
+        'comment': [
+            (r':param: [a-zA-Z_]\w*|:returns?:|(FIXME|MARK|TODO):',
+             Comment.Special)
+        ],
+
+        # Nested
+        'comment-single': [
+            (r'\n', Text, '#pop'),
+            include('comment'),
+            (r'[^\n]', Comment.Single)
+        ],
+        'comment-multi': [
+            include('comment'),
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'module': [
+            (r'\n', Text, '#pop'),
+            (r'[a-zA-Z_]\w*', Name.Class),
+            include('root')
+        ],
+        'preproc': [
+            (r'\n', Text, '#pop'),
+            include('keywords'),
+            (r'[A-Za-z]\w*', Comment.Preproc),
+            include('root')
+        ],
+        'string': [
+            (r'\\\(', String.Interpol, 'string-intp'),
+            (r'"', String, '#pop'),
+            (r"""\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}""", String.Escape),
+            (r'[^\\"]+', String),
+            (r'\\', String)
+        ],
+        'string-intp': [
+            (r'\(', String.Interpol, '#push'),
+            (r'\)', String.Interpol, '#pop'),
+            include('root')
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        from pygments.lexers._cocoa_builtins import COCOA_INTERFACES, \
+            COCOA_PROTOCOLS, COCOA_PRIMITIVES
+
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name or token is Name.Class:
+                if value in COCOA_INTERFACES or value in COCOA_PROTOCOLS \
+                   or value in COCOA_PRIMITIVES:
+                    token = Name.Builtin.Pseudo
+
+            yield index, token, value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/fortran.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/fortran.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/fortran.py	(revision 1126)
@@ -0,0 +1,205 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.fortran
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Fortran languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, include, words, using, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic
+
+__all__ = ['FortranLexer', 'FortranFixedLexer']
+
+
+class FortranLexer(RegexLexer):
+    """
+    Lexer for FORTRAN 90 code.
+
+    .. versionadded:: 0.10
+    """
+    name = 'Fortran'
+    aliases = ['fortran']
+    filenames = ['*.f03', '*.f90', '*.F03', '*.F90']
+    mimetypes = ['text/x-fortran']
+    flags = re.IGNORECASE | re.MULTILINE
+
+    # Data Types: INTEGER, REAL, COMPLEX, LOGICAL, CHARACTER and DOUBLE PRECISION
+    # Operators: **, *, +, -, /, <, >, <=, >=, ==, /=
+    # Logical (?): NOT, AND, OR, EQV, NEQV
+
+    # Builtins:
+    # http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Table-of-Intrinsic-Functions.html
+
+    tokens = {
+        'root': [
+            (r'^#.*\n', Comment.Preproc),
+            (r'!.*\n', Comment),
+            include('strings'),
+            include('core'),
+            (r'[a-z][\w$]*', Name),
+            include('nums'),
+            (r'[\s]+', Text),
+        ],
+        'core': [
+            # Statements
+            (words((
+                'ABSTRACT', 'ACCEPT', 'ALL', 'ALLSTOP', 'ALLOCATABLE', 'ALLOCATE',
+                'ARRAY', 'ASSIGN', 'ASSOCIATE', 'ASYNCHRONOUS', 'BACKSPACE', 'BIND',
+                'BLOCK', 'BLOCKDATA', 'BYTE', 'CALL', 'CASE', 'CLASS', 'CLOSE',
+                'CODIMENSION', 'COMMON', 'CONCURRRENT', 'CONTIGUOUS', 'CONTAINS',
+                'CONTINUE', 'CRITICAL', 'CYCLE', 'DATA', 'DEALLOCATE', 'DECODE',
+                'DEFERRED', 'DIMENSION', 'DO', 'ELEMENTAL', 'ELSE', 'ENCODE', 'END',
+                'ENTRY', 'ENUM', 'ENUMERATOR', 'EQUIVALENCE', 'EXIT', 'EXTENDS',
+                'EXTERNAL', 'EXTRINSIC', 'FILE', 'FINAL', 'FORALL', 'FORMAT',
+                'FUNCTION', 'GENERIC', 'GOTO', 'IF', 'IMAGES', 'IMPLICIT',
+                'IMPORT', 'IMPURE', 'INCLUDE', 'INQUIRE', 'INTENT', 'INTERFACE',
+                'INTRINSIC', 'IS', 'LOCK', 'MEMORY', 'MODULE', 'NAMELIST', 'NULLIFY',
+                'NONE', 'NON_INTRINSIC', 'NON_OVERRIDABLE', 'NOPASS', 'OPEN', 'OPTIONAL',
+                'OPTIONS', 'PARAMETER', 'PASS', 'PAUSE', 'POINTER', 'PRINT', 'PRIVATE',
+                'PROGRAM', 'PROCEDURE', 'PROTECTED', 'PUBLIC', 'PURE', 'READ',
+                'RECURSIVE', 'RESULT', 'RETURN', 'REWIND', 'SAVE', 'SELECT', 'SEQUENCE',
+                'STOP', 'SUBMODULE', 'SUBROUTINE', 'SYNC', 'SYNCALL', 'SYNCIMAGES',
+                'SYNCMEMORY', 'TARGET', 'THEN', 'TYPE', 'UNLOCK', 'USE', 'VALUE',
+                'VOLATILE', 'WHERE', 'WRITE', 'WHILE'), prefix=r'\b', suffix=r'\s*\b'),
+             Keyword),
+
+            # Data Types
+            (words((
+                'CHARACTER', 'COMPLEX', 'DOUBLE PRECISION', 'DOUBLE COMPLEX', 'INTEGER',
+                'LOGICAL', 'REAL', 'C_INT', 'C_SHORT', 'C_LONG', 'C_LONG_LONG',
+                'C_SIGNED_CHAR', 'C_SIZE_T', 'C_INT8_T', 'C_INT16_T', 'C_INT32_T',
+                'C_INT64_T', 'C_INT_LEAST8_T', 'C_INT_LEAST16_T', 'C_INT_LEAST32_T',
+                'C_INT_LEAST64_T', 'C_INT_FAST8_T', 'C_INT_FAST16_T', 'C_INT_FAST32_T',
+                'C_INT_FAST64_T', 'C_INTMAX_T', 'C_INTPTR_T', 'C_FLOAT', 'C_DOUBLE',
+                'C_LONG_DOUBLE', 'C_FLOAT_COMPLEX', 'C_DOUBLE_COMPLEX',
+                'C_LONG_DOUBLE_COMPLEX', 'C_BOOL', 'C_CHAR', 'C_PTR', 'C_FUNPTR'),
+                   prefix=r'\b', suffix=r'\s*\b'),
+             Keyword.Type),
+
+            # Operators
+            (r'(\*\*|\*|\+|-|\/|<|>|<=|>=|==|\/=|=)', Operator),
+
+            (r'(::)', Keyword.Declaration),
+
+            (r'[()\[\],:&%;.]', Punctuation),
+            # Intrinsics
+            (words((
+                'Abort', 'Abs', 'Access', 'AChar', 'ACos', 'ACosH', 'AdjustL',
+                'AdjustR', 'AImag', 'AInt', 'Alarm', 'All', 'Allocated', 'ALog',
+                'AMax', 'AMin', 'AMod', 'And', 'ANInt', 'Any', 'ASin', 'ASinH',
+                'Associated', 'ATan', 'ATanH', 'Atomic_Define', 'Atomic_Ref',
+                'BesJ', 'BesJN', 'Bessel_J0', 'Bessel_J1', 'Bessel_JN', 'Bessel_Y0',
+                'Bessel_Y1', 'Bessel_YN', 'BesY', 'BesYN', 'BGE', 'BGT', 'BLE',
+                'BLT', 'Bit_Size', 'BTest', 'CAbs', 'CCos', 'Ceiling', 'CExp',
+                'Char', 'ChDir', 'ChMod', 'CLog', 'Cmplx', 'Command_Argument_Count',
+                'Complex', 'Conjg', 'Cos', 'CosH', 'Count', 'CPU_Time', 'CShift',
+                'CSin', 'CSqRt', 'CTime', 'C_Loc', 'C_Associated',
+                'C_Null_Ptr', 'C_Null_Funptr', 'C_F_Pointer', 'C_F_ProcPointer',
+                'C_Null_Char', 'C_Alert', 'C_Backspace', 'C_Form_Feed', 'C_FunLoc',
+                'C_Sizeof', 'C_New_Line', 'C_Carriage_Return',
+                'C_Horizontal_Tab', 'C_Vertical_Tab', 'DAbs', 'DACos', 'DASin',
+                'DATan', 'Date_and_Time', 'DbesJ', 'DbesJN', 'DbesY',
+                'DbesYN', 'Dble', 'DCos', 'DCosH', 'DDiM', 'DErF',
+                'DErFC', 'DExp', 'Digits', 'DiM', 'DInt', 'DLog', 'DMax',
+                'DMin', 'DMod', 'DNInt', 'Dot_Product', 'DProd', 'DSign', 'DSinH',
+                'DShiftL', 'DShiftR', 'DSin', 'DSqRt', 'DTanH', 'DTan', 'DTime',
+                'EOShift', 'Epsilon', 'ErF', 'ErFC', 'ErFC_Scaled', 'ETime',
+                'Execute_Command_Line', 'Exit', 'Exp', 'Exponent', 'Extends_Type_Of',
+                'FDate', 'FGet', 'FGetC', 'FindLoc', 'Float', 'Floor', 'Flush',
+                'FNum', 'FPutC', 'FPut', 'Fraction', 'FSeek', 'FStat', 'FTell',
+                'Gamma', 'GError', 'GetArg', 'Get_Command', 'Get_Command_Argument',
+                'Get_Environment_Variable', 'GetCWD', 'GetEnv', 'GetGId', 'GetLog',
+                'GetPId', 'GetUId', 'GMTime', 'HostNm', 'Huge', 'Hypot', 'IAbs',
+                'IAChar', 'IAll', 'IAnd', 'IAny', 'IArgC', 'IBClr', 'IBits',
+                'IBSet', 'IChar', 'IDate', 'IDiM', 'IDInt', 'IDNInt', 'IEOr',
+                'IErrNo', 'IFix', 'Imag', 'ImagPart', 'Image_Index', 'Index',
+                'Int', 'IOr', 'IParity', 'IRand', 'IsaTty', 'IShft', 'IShftC',
+                'ISign', 'Iso_C_Binding', 'Is_Contiguous', 'Is_Iostat_End',
+                'Is_Iostat_Eor', 'ITime', 'Kill', 'Kind', 'LBound', 'LCoBound',
+                'Len', 'Len_Trim', 'LGe', 'LGt', 'Link', 'LLe', 'LLt', 'LnBlnk',
+                'Loc', 'Log', 'Log_Gamma', 'Logical', 'Long', 'LShift', 'LStat',
+                'LTime', 'MaskL', 'MaskR', 'MatMul', 'Max', 'MaxExponent',
+                'MaxLoc', 'MaxVal', 'MClock', 'Merge', 'Merge_Bits', 'Move_Alloc',
+                'Min', 'MinExponent', 'MinLoc', 'MinVal', 'Mod', 'Modulo', 'MvBits',
+                'Nearest', 'New_Line', 'NInt', 'Norm2', 'Not', 'Null', 'Num_Images',
+                'Or', 'Pack', 'Parity', 'PError', 'Precision', 'Present', 'Product',
+                'Radix', 'Rand', 'Random_Number', 'Random_Seed', 'Range', 'Real',
+                'RealPart', 'Rename', 'Repeat', 'Reshape', 'RRSpacing', 'RShift',
+                'Same_Type_As', 'Scale', 'Scan', 'Second', 'Selected_Char_Kind',
+                'Selected_Int_Kind', 'Selected_Real_Kind', 'Set_Exponent', 'Shape',
+                'ShiftA', 'ShiftL', 'ShiftR', 'Short', 'Sign', 'Signal', 'SinH',
+                'Sin', 'Sleep', 'Sngl', 'Spacing', 'Spread', 'SqRt', 'SRand',
+                'Stat', 'Storage_Size', 'Sum', 'SymLnk', 'System', 'System_Clock',
+                'Tan', 'TanH', 'Time', 'This_Image', 'Tiny', 'TrailZ', 'Transfer',
+                'Transpose', 'Trim', 'TtyNam', 'UBound', 'UCoBound', 'UMask',
+                'Unlink', 'Unpack', 'Verify', 'XOr', 'ZAbs', 'ZCos', 'ZExp',
+                'ZLog', 'ZSin', 'ZSqRt'), prefix=r'\b', suffix=r'\s*\b'),
+             Name.Builtin),
+
+            # Booleans
+            (r'\.(true|false)\.', Name.Builtin),
+            # Comparing Operators
+            (r'\.(eq|ne|lt|le|gt|ge|not|and|or|eqv|neqv)\.', Operator.Word),
+        ],
+
+        'strings': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+        ],
+
+        'nums': [
+            (r'\d+(?![.e])(_[a-z]\w+)?', Number.Integer),
+            (r'[+-]?\d*\.\d+([ed][-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+            (r'[+-]?\d+\.\d*([ed][-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+        ],
+    }
+
+
+class FortranFixedLexer(RegexLexer):
+    """
+    Lexer for fixed format Fortran.
+
+    .. versionadded:: 2.1
+    """
+    name = 'FortranFixed'
+    aliases = ['fortranfixed']
+    filenames = ['*.f', '*.F']
+
+    flags = re.IGNORECASE
+
+    def _lex_fortran(self, match, ctx=None):
+        """Lex a line just as free form fortran without line break."""
+        lexer = FortranLexer()
+        text = match.group(0) + "\n"
+        for index, token, value in lexer.get_tokens_unprocessed(text):
+            value = value.replace('\n', '')
+            if value != '':
+                yield index, token, value
+
+    tokens = {
+        'root': [
+            (r'[C*].*\n', Comment),
+            (r'#.*\n', Comment.Preproc),
+            (r' {0,4}!.*\n', Comment),
+            (r'(.{5})', Name.Label, 'cont-char'),
+            (r'.*\n', using(FortranLexer)),
+        ],
+        'cont-char': [
+            (' ', Text, 'code'),
+            ('0', Comment, 'code'),
+            ('.', Generic.Strong, 'code'),
+        ],
+        'code': [
+            (r'(.{66})(.*)(\n)',
+             bygroups(_lex_fortran, Comment, Text), 'root'),
+            (r'(.*)(\n)', bygroups(_lex_fortran, Text), 'root'),
+            default('root'),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/supercollider.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/supercollider.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/supercollider.py	(revision 1126)
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.supercollider
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for SuperCollider
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SuperColliderLexer']
+
+
+class SuperColliderLexer(RegexLexer):
+    """
+    For `SuperCollider <http://supercollider.github.io/>`_ source code.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'SuperCollider'
+    aliases = ['sc', 'supercollider']
+    filenames = ['*.sc', '*.scd']
+    mimetypes = ['application/supercollider', 'text/supercollider', ]
+
+    flags = re.DOTALL | re.MULTILINE
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'<!--', Comment),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop'),
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (words((
+                'for', 'in', 'while', 'do', 'break', 'return', 'continue',
+                'switch', 'case', 'default', 'if', 'else', 'throw', 'try',
+                'catch', 'finally', 'new', 'delete', 'typeof', 'instanceof',
+                'void'), suffix=r'\b'),
+             Keyword, 'slashstartsregex'),
+            (words(('var', 'let', 'with', 'function', 'arg'), suffix=r'\b'),
+             Keyword.Declaration, 'slashstartsregex'),
+            (words((
+                '(abstract', 'boolean', 'byte', 'char', 'class', 'const',
+                'debugger', 'double', 'enum', 'export', 'extends', 'final',
+                'float', 'goto', 'implements', 'import', 'int', 'interface',
+                'long', 'native', 'package', 'private', 'protected', 'public',
+                'short', 'static', 'super', 'synchronized', 'throws',
+                'transient', 'volatile'), suffix=r'\b'),
+             Keyword.Reserved),
+            (words(('true', 'false', 'nil', 'inf'), suffix=r'\b'), Keyword.Constant),
+            (words((
+                'Array', 'Boolean', 'Date', 'Error', 'Function', 'Number',
+                'Object', 'Packages', 'RegExp', 'String',
+                'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'super',
+                'thisFunctionDef', 'thisFunction', 'thisMethod', 'thisProcess',
+                'thisThread', 'this'), suffix=r'\b'),
+             Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'\\?[$a-zA-Z_]\w*', String.Symbol),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/stata.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/stata.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/stata.py	(revision 1126)
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.stata
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Stata
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Keyword, Name, Number, \
+    String, Text, Operator
+
+from pygments.lexers._stata_builtins import builtins_base, builtins_functions
+
+__all__ = ['StataLexer']
+
+
+class StataLexer(RegexLexer):
+    """
+    For `Stata <http://www.stata.com/>`_ do files.
+
+    .. versionadded:: 2.2
+    """
+    # Syntax based on
+    # - http://fmwww.bc.edu/RePEc/bocode/s/synlightlist.ado
+    # - http://github.com/isagalaev/highlight.js/blob/master/src/languages/stata.js
+    # - http://github.com/jpitblado/vim-stata/blob/master/syntax/stata.vim
+
+    name      = 'Stata'
+    aliases   = ['stata', 'do']
+    filenames = ['*.do', '*.ado']
+    mimetypes = ['text/x-stata', 'text/stata', 'application/x-stata']
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('vars-strings'),
+            include('numbers'),
+            include('keywords'),
+            (r'.', Text),
+        ],
+        # Global and local macros; regular and special strings
+        'vars-strings': [
+            (r'\$[\w{]', Name.Variable.Global, 'var_validglobal'),
+            (r'`\w{0,31}\'', Name.Variable),
+            (r'"', String, 'string_dquote'),
+            (r'`"', String, 'string_mquote'),
+        ],
+        # For either string type, highlight macros as macros
+        'string_dquote': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            (r'\$', Name.Variable.Global, 'var_validglobal'),
+            (r'`', Name.Variable, 'var_validlocal'),
+            (r'[^$`"\\]+', String),
+            (r'[$"\\]', String),
+        ],
+        'string_mquote': [
+            (r'"\'', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            (r'\$', Name.Variable.Global, 'var_validglobal'),
+            (r'`', Name.Variable, 'var_validlocal'),
+            (r'[^$`"\\]+', String),
+            (r'[$"\\]', String),
+        ],
+        'var_validglobal': [
+            (r'\{\w{0,32}\}', Name.Variable.Global, '#pop'),
+            (r'\w{1,32}', Name.Variable.Global, '#pop'),
+        ],
+        'var_validlocal': [
+            (r'\w{0,31}\'', Name.Variable, '#pop'),
+        ],
+        # * only OK at line start, // OK anywhere
+        'comments': [
+            (r'^\s*\*.*$', Comment),
+            (r'//.*', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+        ],
+        # Built in functions and statements
+        'keywords': [
+            (words(builtins_functions, prefix = r'\b', suffix = r'\('),
+             Name.Function),
+            (words(builtins_base, prefix = r'(^\s*|\s)', suffix = r'\b'),
+             Keyword),
+        ],
+        # http://www.stata.com/help.cgi?operators
+        'operators': [
+            (r'-|==|<=|>=|<|>|&|!=', Operator),
+            (r'\*|\+|\^|/|!|~|==|~=', Operator)
+        ],
+        # Stata numbers
+        'numbers': [
+            # decimal number
+            (r'\b[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)([eE][+-]?[0-9]+)?[i]?\b',
+             Number),
+        ],
+        # Stata formats
+        'format': [
+            (r'%-?\d{1,2}(\.\d{1,2})?[gfe]c?', Name.Variable),
+            (r'%(21x|16H|16L|8H|8L)', Name.Variable),
+            (r'%-?(tc|tC|td|tw|tm|tq|th|ty|tg).{0,32}', Name.Variable),
+            (r'%[-~]?\d{1,4}s', Name.Variable),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ncl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ncl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ncl.py	(revision 1126)
@@ -0,0 +1,894 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ncl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for NCAR Command Language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['NCLLexer']
+
+
+class NCLLexer(RegexLexer):
+    """
+    Lexer for NCL code.
+
+    .. versionadded:: 2.2
+    """
+    name = 'NCL'
+    aliases = ['ncl']
+    filenames = ['*.ncl']
+    mimetypes = ['text/ncl']
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r';.*\n', Comment),
+            include('strings'),
+            include('core'),
+            (r'[a-zA-Z_]\w*', Name),
+            include('nums'),
+            (r'[\s]+', Text),
+        ],
+        'core': [
+            # Statements
+            (words((
+                'begin', 'break', 'continue', 'create', 'defaultapp', 'do',
+                'else', 'end', 'external', 'exit', 'True', 'False', 'file', 'function',
+                'getvalues', 'graphic', 'group', 'if', 'list', 'load', 'local',
+                'new', '_Missing', 'Missing', 'noparent', 'procedure',
+                'quit', 'QUIT', 'Quit', 'record', 'return', 'setvalues', 'stop',
+                'then', 'while'), prefix=r'\b', suffix=r'\s*\b'),
+             Keyword),
+
+            # Data Types
+            (words((
+                'ubyte', 'uint', 'uint64', 'ulong', 'string', 'byte',
+                'character', 'double', 'float', 'integer', 'int64', 'logical',
+                'long', 'short', 'ushort', 'enumeric', 'numeric', 'snumeric'),
+                prefix=r'\b', suffix=r'\s*\b'),
+             Keyword.Type),
+
+            # Operators
+            (r'[\%^*+\-/<>]', Operator),
+
+            # punctuation:
+            (r'[\[\]():@$!&|.,\\{}]', Punctuation),
+            (r'[=:]', Punctuation),
+
+            # Intrinsics
+            (words((
+                'abs', 'acos', 'addfile', 'addfiles', 'all', 'angmom_atm', 'any',
+                'area_conserve_remap', 'area_hi2lores', 'area_poly_sphere',
+                'asciiread', 'asciiwrite', 'asin', 'atan', 'atan2', 'attsetvalues',
+                'avg', 'betainc', 'bin_avg', 'bin_sum', 'bw_bandpass_filter',
+                'cancor', 'cbinread', 'cbinwrite', 'cd_calendar', 'cd_inv_calendar',
+                'cdfbin_p', 'cdfbin_pr', 'cdfbin_s', 'cdfbin_xn', 'cdfchi_p',
+                'cdfchi_x', 'cdfgam_p', 'cdfgam_x', 'cdfnor_p', 'cdfnor_x',
+                'cdft_p', 'cdft_t', 'ceil', 'center_finite_diff',
+                'center_finite_diff_n', 'cfftb', 'cfftf', 'cfftf_frq_reorder',
+                'charactertodouble', 'charactertofloat', 'charactertointeger',
+                'charactertolong', 'charactertoshort', 'charactertostring',
+                'chartodouble', 'chartofloat', 'chartoint', 'chartointeger',
+                'chartolong', 'chartoshort', 'chartostring', 'chiinv', 'clear',
+                'color_index_to_rgba', 'conform', 'conform_dims', 'cos', 'cosh',
+                'count_unique_values', 'covcorm', 'covcorm_xy', 'craybinnumrec',
+                'craybinrecread', 'create_graphic', 'csa1', 'csa1d', 'csa1s',
+                'csa1x', 'csa1xd', 'csa1xs', 'csa2', 'csa2d', 'csa2l', 'csa2ld',
+                'csa2ls', 'csa2lx', 'csa2lxd', 'csa2lxs', 'csa2s', 'csa2x',
+                'csa2xd', 'csa2xs', 'csa3', 'csa3d', 'csa3l', 'csa3ld', 'csa3ls',
+                'csa3lx', 'csa3lxd', 'csa3lxs', 'csa3s', 'csa3x', 'csa3xd',
+                'csa3xs', 'csc2s', 'csgetp', 'css2c', 'cssetp', 'cssgrid', 'csstri',
+                'csvoro', 'cumsum', 'cz2ccm', 'datatondc', 'day_of_week',
+                'day_of_year', 'days_in_month', 'default_fillvalue', 'delete',
+                'depth_to_pres', 'destroy', 'determinant', 'dewtemp_trh',
+                'dgeevx_lapack', 'dim_acumrun_n', 'dim_avg', 'dim_avg_n',
+                'dim_avg_wgt', 'dim_avg_wgt_n', 'dim_cumsum', 'dim_cumsum_n',
+                'dim_gamfit_n', 'dim_gbits', 'dim_max', 'dim_max_n', 'dim_median',
+                'dim_median_n', 'dim_min', 'dim_min_n', 'dim_num', 'dim_num_n',
+                'dim_numrun_n', 'dim_pqsort', 'dim_pqsort_n', 'dim_product',
+                'dim_product_n', 'dim_rmsd', 'dim_rmsd_n', 'dim_rmvmean',
+                'dim_rmvmean_n', 'dim_rmvmed', 'dim_rmvmed_n', 'dim_spi_n',
+                'dim_standardize', 'dim_standardize_n', 'dim_stat4', 'dim_stat4_n',
+                'dim_stddev', 'dim_stddev_n', 'dim_sum', 'dim_sum_n', 'dim_sum_wgt',
+                'dim_sum_wgt_n', 'dim_variance', 'dim_variance_n', 'dimsizes',
+                'doubletobyte', 'doubletochar', 'doubletocharacter',
+                'doubletofloat', 'doubletoint', 'doubletointeger', 'doubletolong',
+                'doubletoshort', 'dpres_hybrid_ccm', 'dpres_plevel', 'draw',
+                'draw_color_palette', 'dsgetp', 'dsgrid2', 'dsgrid2d', 'dsgrid2s',
+                'dsgrid3', 'dsgrid3d', 'dsgrid3s', 'dspnt2', 'dspnt2d', 'dspnt2s',
+                'dspnt3', 'dspnt3d', 'dspnt3s', 'dssetp', 'dtrend', 'dtrend_msg',
+                'dtrend_msg_n', 'dtrend_n', 'dtrend_quadratic',
+                'dtrend_quadratic_msg_n', 'dv2uvf', 'dv2uvg', 'dz_height',
+                'echo_off', 'echo_on', 'eof2data', 'eof_varimax', 'eofcor',
+                'eofcor_pcmsg', 'eofcor_ts', 'eofcov', 'eofcov_pcmsg', 'eofcov_ts',
+                'eofunc', 'eofunc_ts', 'eofunc_varimax', 'equiv_sample_size', 'erf',
+                'erfc', 'esacr', 'esacv', 'esccr', 'esccv', 'escorc', 'escorc_n',
+                'escovc', 'exit', 'exp', 'exp_tapersh', 'exp_tapersh_wgts',
+                'exp_tapershC', 'ezfftb', 'ezfftb_n', 'ezfftf', 'ezfftf_n',
+                'f2fosh', 'f2foshv', 'f2fsh', 'f2fshv', 'f2gsh', 'f2gshv', 'fabs',
+                'fbindirread', 'fbindirwrite', 'fbinnumrec', 'fbinread',
+                'fbinrecread', 'fbinrecwrite', 'fbinwrite', 'fft2db', 'fft2df',
+                'fftshift', 'fileattdef', 'filechunkdimdef', 'filedimdef',
+                'fileexists', 'filegrpdef', 'filevarattdef', 'filevarchunkdef',
+                'filevarcompressleveldef', 'filevardef', 'filevardimsizes',
+                'filwgts_lancos', 'filwgts_lanczos', 'filwgts_normal',
+                'floattobyte', 'floattochar', 'floattocharacter', 'floattoint',
+                'floattointeger', 'floattolong', 'floattoshort', 'floor',
+                'fluxEddy', 'fo2fsh', 'fo2fshv', 'fourier_info', 'frame', 'fspan',
+                'ftcurv', 'ftcurvd', 'ftcurvi', 'ftcurvp', 'ftcurvpi', 'ftcurvps',
+                'ftcurvs', 'ftest', 'ftgetp', 'ftkurv', 'ftkurvd', 'ftkurvp',
+                'ftkurvpd', 'ftsetp', 'ftsurf', 'g2fsh', 'g2fshv', 'g2gsh',
+                'g2gshv', 'gamma', 'gammainc', 'gaus', 'gaus_lobat',
+                'gaus_lobat_wgt', 'gc_aangle', 'gc_clkwise', 'gc_dangle',
+                'gc_inout', 'gc_latlon', 'gc_onarc', 'gc_pnt2gc', 'gc_qarea',
+                'gc_tarea', 'generate_2d_array', 'get_color_index',
+                'get_color_rgba', 'get_cpu_time', 'get_isolines', 'get_ncl_version',
+                'get_script_name', 'get_script_prefix_name', 'get_sphere_radius',
+                'get_unique_values', 'getbitsone', 'getenv', 'getfiledimsizes',
+                'getfilegrpnames', 'getfilepath', 'getfilevaratts',
+                'getfilevarchunkdimsizes', 'getfilevardims', 'getfilevardimsizes',
+                'getfilevarnames', 'getfilevartypes', 'getvaratts', 'getvardims',
+                'gradsf', 'gradsg', 'greg2jul', 'grid2triple', 'hlsrgb', 'hsvrgb',
+                'hydro', 'hyi2hyo', 'idsfft', 'igradsf', 'igradsg', 'ilapsf',
+                'ilapsg', 'ilapvf', 'ilapvg', 'ind', 'ind_resolve', 'int2p',
+                'int2p_n', 'integertobyte', 'integertochar', 'integertocharacter',
+                'integertoshort', 'inttobyte', 'inttochar', 'inttoshort',
+                'inverse_matrix', 'isatt', 'isbigendian', 'isbyte', 'ischar',
+                'iscoord', 'isdefined', 'isdim', 'isdimnamed', 'isdouble',
+                'isenumeric', 'isfile', 'isfilepresent', 'isfilevar',
+                'isfilevaratt', 'isfilevarcoord', 'isfilevardim', 'isfloat',
+                'isfunc', 'isgraphic', 'isint', 'isint64', 'isinteger',
+                'isleapyear', 'islogical', 'islong', 'ismissing', 'isnan_ieee',
+                'isnumeric', 'ispan', 'isproc', 'isshort', 'issnumeric', 'isstring',
+                'isubyte', 'isuint', 'isuint64', 'isulong', 'isunlimited',
+                'isunsigned', 'isushort', 'isvar', 'jul2greg', 'kmeans_as136',
+                'kolsm2_n', 'kron_product', 'lapsf', 'lapsg', 'lapvf', 'lapvg',
+                'latlon2utm', 'lclvl', 'lderuvf', 'lderuvg', 'linint1', 'linint1_n',
+                'linint2', 'linint2_points', 'linmsg', 'linmsg_n', 'linrood_latwgt',
+                'linrood_wgt', 'list_files', 'list_filevars', 'list_hlus',
+                'list_procfuncs', 'list_vars', 'ListAppend', 'ListCount',
+                'ListGetType', 'ListIndex', 'ListIndexFromName', 'ListPop',
+                'ListPush', 'ListSetType', 'loadscript', 'local_max', 'local_min',
+                'log', 'log10', 'longtobyte', 'longtochar', 'longtocharacter',
+                'longtoint', 'longtointeger', 'longtoshort', 'lspoly', 'lspoly_n',
+                'mask', 'max', 'maxind', 'min', 'minind', 'mixed_layer_depth',
+                'mixhum_ptd', 'mixhum_ptrh', 'mjo_cross_coh2pha',
+                'mjo_cross_segment', 'moc_globe_atl', 'monthday', 'natgrid',
+                'natgridd', 'natgrids', 'ncargpath', 'ncargversion', 'ndctodata',
+                'ndtooned', 'new', 'NewList', 'ngezlogo', 'nggcog', 'nggetp',
+                'nglogo', 'ngsetp', 'NhlAddAnnotation', 'NhlAddData',
+                'NhlAddOverlay', 'NhlAddPrimitive', 'NhlAppGetDefaultParentId',
+                'NhlChangeWorkstation', 'NhlClassName', 'NhlClearWorkstation',
+                'NhlDataPolygon', 'NhlDataPolyline', 'NhlDataPolymarker',
+                'NhlDataToNDC', 'NhlDestroy', 'NhlDraw', 'NhlFrame', 'NhlFreeColor',
+                'NhlGetBB', 'NhlGetClassResources', 'NhlGetErrorObjectId',
+                'NhlGetNamedColorIndex', 'NhlGetParentId',
+                'NhlGetParentWorkstation', 'NhlGetWorkspaceObjectId',
+                'NhlIsAllocatedColor', 'NhlIsApp', 'NhlIsDataComm', 'NhlIsDataItem',
+                'NhlIsDataSpec', 'NhlIsTransform', 'NhlIsView', 'NhlIsWorkstation',
+                'NhlName', 'NhlNDCPolygon', 'NhlNDCPolyline', 'NhlNDCPolymarker',
+                'NhlNDCToData', 'NhlNewColor', 'NhlNewDashPattern', 'NhlNewMarker',
+                'NhlPalGetDefined', 'NhlRemoveAnnotation', 'NhlRemoveData',
+                'NhlRemoveOverlay', 'NhlRemovePrimitive', 'NhlSetColor',
+                'NhlSetDashPattern', 'NhlSetMarker', 'NhlUpdateData',
+                'NhlUpdateWorkstation', 'nice_mnmxintvl', 'nngetaspectd',
+                'nngetaspects', 'nngetp', 'nngetsloped', 'nngetslopes', 'nngetwts',
+                'nngetwtsd', 'nnpnt', 'nnpntd', 'nnpntend', 'nnpntendd',
+                'nnpntinit', 'nnpntinitd', 'nnpntinits', 'nnpnts', 'nnsetp', 'num',
+                'obj_anal_ic', 'omega_ccm', 'onedtond', 'overlay', 'paleo_outline',
+                'pdfxy_bin', 'poisson_grid_fill', 'pop_remap', 'potmp_insitu_ocn',
+                'prcwater_dp', 'pres2hybrid', 'pres_hybrid_ccm', 'pres_sigma',
+                'print', 'print_table', 'printFileVarSummary', 'printVarSummary',
+                'product', 'pslec', 'pslhor', 'pslhyp', 'qsort', 'rand',
+                'random_chi', 'random_gamma', 'random_normal', 'random_setallseed',
+                'random_uniform', 'rcm2points', 'rcm2rgrid', 'rdsstoi',
+                'read_colormap_file', 'reg_multlin', 'regcoef', 'regCoef_n',
+                'regline', 'relhum', 'replace_ieeenan', 'reshape', 'reshape_ind',
+                'rgba_to_color_index', 'rgbhls', 'rgbhsv', 'rgbyiq', 'rgrid2rcm',
+                'rhomb_trunc', 'rip_cape_2d', 'rip_cape_3d', 'round', 'rtest',
+                'runave', 'runave_n', 'set_default_fillvalue', 'set_sphere_radius',
+                'setfileoption', 'sfvp2uvf', 'sfvp2uvg', 'shaec', 'shagc',
+                'shgetnp', 'shgetp', 'shgrid', 'shorttobyte', 'shorttochar',
+                'shorttocharacter', 'show_ascii', 'shsec', 'shsetp', 'shsgc',
+                'shsgc_R42', 'sigma2hybrid', 'simpeq', 'simpne', 'sin',
+                'sindex_yrmo', 'sinh', 'sizeof', 'sleep', 'smth9', 'snindex_yrmo',
+                'solve_linsys', 'span_color_indexes', 'span_color_rgba',
+                'sparse_matrix_mult', 'spcorr', 'spcorr_n', 'specx_anal',
+                'specxy_anal', 'spei', 'sprintf', 'sprinti', 'sqrt', 'sqsort',
+                'srand', 'stat2', 'stat4', 'stat_medrng', 'stat_trim',
+                'status_exit', 'stdatmus_p2tdz', 'stdatmus_z2tdp', 'stddev',
+                'str_capital', 'str_concat', 'str_fields_count', 'str_get_cols',
+                'str_get_dq', 'str_get_field', 'str_get_nl', 'str_get_sq',
+                'str_get_tab', 'str_index_of_substr', 'str_insert', 'str_is_blank',
+                'str_join', 'str_left_strip', 'str_lower', 'str_match',
+                'str_match_ic', 'str_match_ic_regex', 'str_match_ind',
+                'str_match_ind_ic', 'str_match_ind_ic_regex', 'str_match_ind_regex',
+                'str_match_regex', 'str_right_strip', 'str_split',
+                'str_split_by_length', 'str_split_csv', 'str_squeeze', 'str_strip',
+                'str_sub_str', 'str_switch', 'str_upper', 'stringtochar',
+                'stringtocharacter', 'stringtodouble', 'stringtofloat',
+                'stringtoint', 'stringtointeger', 'stringtolong', 'stringtoshort',
+                'strlen', 'student_t', 'sum', 'svd_lapack', 'svdcov', 'svdcov_sv',
+                'svdstd', 'svdstd_sv', 'system', 'systemfunc', 'tan', 'tanh',
+                'taper', 'taper_n', 'tdclrs', 'tdctri', 'tdcudp', 'tdcurv',
+                'tddtri', 'tdez2d', 'tdez3d', 'tdgetp', 'tdgrds', 'tdgrid',
+                'tdgtrs', 'tdinit', 'tditri', 'tdlbla', 'tdlblp', 'tdlbls',
+                'tdline', 'tdlndp', 'tdlnpa', 'tdlpdp', 'tdmtri', 'tdotri',
+                'tdpara', 'tdplch', 'tdprpa', 'tdprpi', 'tdprpt', 'tdsetp',
+                'tdsort', 'tdstri', 'tdstrs', 'tdttri', 'thornthwaite', 'tobyte',
+                'tochar', 'todouble', 'tofloat', 'toint', 'toint64', 'tointeger',
+                'tolong', 'toshort', 'tosigned', 'tostring', 'tostring_with_format',
+                'totype', 'toubyte', 'touint', 'touint64', 'toulong', 'tounsigned',
+                'toushort', 'trend_manken', 'tri_trunc', 'triple2grid',
+                'triple2grid2d', 'trop_wmo', 'ttest', 'typeof', 'undef',
+                'unique_string', 'update', 'ushorttoint', 'ut_calendar',
+                'ut_inv_calendar', 'utm2latlon', 'uv2dv_cfd', 'uv2dvf', 'uv2dvg',
+                'uv2sfvpf', 'uv2sfvpg', 'uv2vr_cfd', 'uv2vrdvf', 'uv2vrdvg',
+                'uv2vrf', 'uv2vrg', 'v5d_close', 'v5d_create', 'v5d_setLowLev',
+                'v5d_setUnits', 'v5d_write', 'v5d_write_var', 'variance', 'vhaec',
+                'vhagc', 'vhsec', 'vhsgc', 'vibeta', 'vinth2p', 'vinth2p_ecmwf',
+                'vinth2p_ecmwf_nodes', 'vinth2p_nodes', 'vintp2p_ecmwf', 'vr2uvf',
+                'vr2uvg', 'vrdv2uvf', 'vrdv2uvg', 'wavelet', 'wavelet_default',
+                'weibull', 'wgt_area_smooth', 'wgt_areaave', 'wgt_areaave2',
+                'wgt_arearmse', 'wgt_arearmse2', 'wgt_areasum2', 'wgt_runave',
+                'wgt_runave_n', 'wgt_vert_avg_beta', 'wgt_volave', 'wgt_volave_ccm',
+                'wgt_volrmse', 'wgt_volrmse_ccm', 'where', 'wk_smooth121', 'wmbarb',
+                'wmbarbmap', 'wmdrft', 'wmgetp', 'wmlabs', 'wmsetp', 'wmstnm',
+                'wmvect', 'wmvectmap', 'wmvlbl', 'wrf_avo', 'wrf_cape_2d',
+                'wrf_cape_3d', 'wrf_dbz', 'wrf_eth', 'wrf_helicity', 'wrf_ij_to_ll',
+                'wrf_interp_1d', 'wrf_interp_2d_xy', 'wrf_interp_3d_z',
+                'wrf_latlon_to_ij', 'wrf_ll_to_ij', 'wrf_omega', 'wrf_pvo',
+                'wrf_rh', 'wrf_slp', 'wrf_smooth_2d', 'wrf_td', 'wrf_tk',
+                'wrf_updraft_helicity', 'wrf_uvmet', 'wrf_virtual_temp',
+                'wrf_wetbulb', 'wrf_wps_close_int', 'wrf_wps_open_int',
+                'wrf_wps_rddata_int', 'wrf_wps_rdhead_int', 'wrf_wps_read_int',
+                'wrf_wps_write_int', 'write_matrix', 'write_table', 'yiqrgb',
+                'z2geouv', 'zonal_mpsi', 'addfiles_GetVar', 'advect_variable',
+                'area_conserve_remap_Wrap', 'area_hi2lores_Wrap',
+                'array_append_record', 'assignFillValue', 'byte2flt',
+                'byte2flt_hdf', 'calcDayAnomTLL', 'calcMonAnomLLLT',
+                'calcMonAnomLLT', 'calcMonAnomTLL', 'calcMonAnomTLLL',
+                'calculate_monthly_values', 'cd_convert', 'changeCase',
+                'changeCaseChar', 'clmDayTLL', 'clmDayTLLL', 'clmMon2clmDay',
+                'clmMonLLLT', 'clmMonLLT', 'clmMonTLL', 'clmMonTLLL', 'closest_val',
+                'copy_VarAtts', 'copy_VarCoords', 'copy_VarCoords_1',
+                'copy_VarCoords_2', 'copy_VarMeta', 'copyatt', 'crossp3',
+                'cshstringtolist', 'cssgrid_Wrap', 'dble2flt', 'decimalPlaces',
+                'delete_VarAtts', 'dim_avg_n_Wrap', 'dim_avg_wgt_n_Wrap',
+                'dim_avg_wgt_Wrap', 'dim_avg_Wrap', 'dim_cumsum_n_Wrap',
+                'dim_cumsum_Wrap', 'dim_max_n_Wrap', 'dim_min_n_Wrap',
+                'dim_rmsd_n_Wrap', 'dim_rmsd_Wrap', 'dim_rmvmean_n_Wrap',
+                'dim_rmvmean_Wrap', 'dim_rmvmed_n_Wrap', 'dim_rmvmed_Wrap',
+                'dim_standardize_n_Wrap', 'dim_standardize_Wrap',
+                'dim_stddev_n_Wrap', 'dim_stddev_Wrap', 'dim_sum_n_Wrap',
+                'dim_sum_wgt_n_Wrap', 'dim_sum_wgt_Wrap', 'dim_sum_Wrap',
+                'dim_variance_n_Wrap', 'dim_variance_Wrap', 'dpres_plevel_Wrap',
+                'dtrend_leftdim', 'dv2uvF_Wrap', 'dv2uvG_Wrap', 'eof_north',
+                'eofcor_Wrap', 'eofcov_Wrap', 'eofunc_north', 'eofunc_ts_Wrap',
+                'eofunc_varimax_reorder', 'eofunc_varimax_Wrap', 'eofunc_Wrap',
+                'epsZero', 'f2fosh_Wrap', 'f2foshv_Wrap', 'f2fsh_Wrap',
+                'f2fshv_Wrap', 'f2gsh_Wrap', 'f2gshv_Wrap', 'fbindirSwap',
+                'fbinseqSwap1', 'fbinseqSwap2', 'flt2dble', 'flt2string',
+                'fo2fsh_Wrap', 'fo2fshv_Wrap', 'g2fsh_Wrap', 'g2fshv_Wrap',
+                'g2gsh_Wrap', 'g2gshv_Wrap', 'generate_resample_indices',
+                'generate_sample_indices', 'generate_unique_indices',
+                'genNormalDist', 'get1Dindex', 'get1Dindex_Collapse',
+                'get1Dindex_Exclude', 'get_file_suffix', 'GetFillColor',
+                'GetFillColorIndex', 'getFillValue', 'getind_latlon2d',
+                'getVarDimNames', 'getVarFillValue', 'grib_stime2itime',
+                'hyi2hyo_Wrap', 'ilapsF_Wrap', 'ilapsG_Wrap', 'ind_nearest_coord',
+                'indStrSubset', 'int2dble', 'int2flt', 'int2p_n_Wrap', 'int2p_Wrap',
+                'isMonotonic', 'isStrSubset', 'latGau', 'latGauWgt', 'latGlobeF',
+                'latGlobeFo', 'latRegWgt', 'linint1_n_Wrap', 'linint1_Wrap',
+                'linint2_points_Wrap', 'linint2_Wrap', 'local_max_1d',
+                'local_min_1d', 'lonFlip', 'lonGlobeF', 'lonGlobeFo', 'lonPivot',
+                'merge_levels_sfc', 'mod', 'month_to_annual',
+                'month_to_annual_weighted', 'month_to_season', 'month_to_season12',
+                'month_to_seasonN', 'monthly_total_to_daily_mean', 'nameDim',
+                'natgrid_Wrap', 'NewCosWeight', 'niceLatLon2D', 'NormCosWgtGlobe',
+                'numAsciiCol', 'numAsciiRow', 'numeric2int',
+                'obj_anal_ic_deprecated', 'obj_anal_ic_Wrap', 'omega_ccm_driver',
+                'omega_to_w', 'oneDtostring', 'pack_values', 'pattern_cor', 'pdfx',
+                'pdfxy', 'pdfxy_conform', 'pot_temp', 'pot_vort_hybrid',
+                'pot_vort_isobaric', 'pres2hybrid_Wrap', 'print_clock',
+                'printMinMax', 'quadroots', 'rcm2points_Wrap', 'rcm2rgrid_Wrap',
+                'readAsciiHead', 'readAsciiTable', 'reg_multlin_stats',
+                'region_ind', 'regline_stats', 'relhum_ttd', 'replaceSingleChar',
+                'RGBtoCmap', 'rgrid2rcm_Wrap', 'rho_mwjf', 'rm_single_dims',
+                'rmAnnCycle1D', 'rmInsufData', 'rmMonAnnCycLLLT', 'rmMonAnnCycLLT',
+                'rmMonAnnCycTLL', 'runave_n_Wrap', 'runave_Wrap', 'short2flt',
+                'short2flt_hdf', 'shsgc_R42_Wrap', 'sign_f90', 'sign_matlab',
+                'smth9_Wrap', 'smthClmDayTLL', 'smthClmDayTLLL', 'SqrtCosWeight',
+                'stat_dispersion', 'static_stability', 'stdMonLLLT', 'stdMonLLT',
+                'stdMonTLL', 'stdMonTLLL', 'symMinMaxPlt', 'table_attach_columns',
+                'table_attach_rows', 'time_to_newtime', 'transpose',
+                'triple2grid_Wrap', 'ut_convert', 'uv2dvF_Wrap', 'uv2dvG_Wrap',
+                'uv2vrF_Wrap', 'uv2vrG_Wrap', 'vr2uvF_Wrap', 'vr2uvG_Wrap',
+                'w_to_omega', 'wallClockElapseTime', 'wave_number_spc',
+                'wgt_areaave_Wrap', 'wgt_runave_leftdim', 'wgt_runave_n_Wrap',
+                'wgt_runave_Wrap', 'wgt_vertical_n', 'wind_component',
+                'wind_direction', 'yyyyddd_to_yyyymmdd', 'yyyymm_time',
+                'yyyymm_to_yyyyfrac', 'yyyymmdd_time', 'yyyymmdd_to_yyyyddd',
+                'yyyymmdd_to_yyyyfrac', 'yyyymmddhh_time', 'yyyymmddhh_to_yyyyfrac',
+                'zonal_mpsi_Wrap', 'zonalAve', 'calendar_decode2', 'cd_string',
+                'kf_filter', 'run_cor', 'time_axis_labels', 'ut_string',
+                'wrf_contour', 'wrf_map', 'wrf_map_overlay', 'wrf_map_overlays',
+                'wrf_map_resources', 'wrf_map_zoom', 'wrf_overlay', 'wrf_overlays',
+                'wrf_user_getvar', 'wrf_user_ij_to_ll', 'wrf_user_intrp2d',
+                'wrf_user_intrp3d', 'wrf_user_latlon_to_ij', 'wrf_user_list_times',
+                'wrf_user_ll_to_ij', 'wrf_user_unstagger', 'wrf_user_vert_interp',
+                'wrf_vector', 'gsn_add_annotation', 'gsn_add_polygon',
+                'gsn_add_polyline', 'gsn_add_polymarker',
+                'gsn_add_shapefile_polygons', 'gsn_add_shapefile_polylines',
+                'gsn_add_shapefile_polymarkers', 'gsn_add_text', 'gsn_attach_plots',
+                'gsn_blank_plot', 'gsn_contour', 'gsn_contour_map',
+                'gsn_contour_shade', 'gsn_coordinates', 'gsn_create_labelbar',
+                'gsn_create_legend', 'gsn_create_text',
+                'gsn_csm_attach_zonal_means', 'gsn_csm_blank_plot',
+                'gsn_csm_contour', 'gsn_csm_contour_map', 'gsn_csm_contour_map_ce',
+                'gsn_csm_contour_map_overlay', 'gsn_csm_contour_map_polar',
+                'gsn_csm_hov', 'gsn_csm_lat_time', 'gsn_csm_map', 'gsn_csm_map_ce',
+                'gsn_csm_map_polar', 'gsn_csm_pres_hgt',
+                'gsn_csm_pres_hgt_streamline', 'gsn_csm_pres_hgt_vector',
+                'gsn_csm_streamline', 'gsn_csm_streamline_contour_map',
+                'gsn_csm_streamline_contour_map_ce',
+                'gsn_csm_streamline_contour_map_polar', 'gsn_csm_streamline_map',
+                'gsn_csm_streamline_map_ce', 'gsn_csm_streamline_map_polar',
+                'gsn_csm_streamline_scalar', 'gsn_csm_streamline_scalar_map',
+                'gsn_csm_streamline_scalar_map_ce',
+                'gsn_csm_streamline_scalar_map_polar', 'gsn_csm_time_lat',
+                'gsn_csm_vector', 'gsn_csm_vector_map', 'gsn_csm_vector_map_ce',
+                'gsn_csm_vector_map_polar', 'gsn_csm_vector_scalar',
+                'gsn_csm_vector_scalar_map', 'gsn_csm_vector_scalar_map_ce',
+                'gsn_csm_vector_scalar_map_polar', 'gsn_csm_x2y', 'gsn_csm_x2y2',
+                'gsn_csm_xy', 'gsn_csm_xy2', 'gsn_csm_xy3', 'gsn_csm_y',
+                'gsn_define_colormap', 'gsn_draw_colormap', 'gsn_draw_named_colors',
+                'gsn_histogram', 'gsn_labelbar_ndc', 'gsn_legend_ndc', 'gsn_map',
+                'gsn_merge_colormaps', 'gsn_open_wks', 'gsn_panel', 'gsn_polygon',
+                'gsn_polygon_ndc', 'gsn_polyline', 'gsn_polyline_ndc',
+                'gsn_polymarker', 'gsn_polymarker_ndc', 'gsn_retrieve_colormap',
+                'gsn_reverse_colormap', 'gsn_streamline', 'gsn_streamline_map',
+                'gsn_streamline_scalar', 'gsn_streamline_scalar_map', 'gsn_table',
+                'gsn_text', 'gsn_text_ndc', 'gsn_vector', 'gsn_vector_map',
+                'gsn_vector_scalar', 'gsn_vector_scalar_map', 'gsn_xy', 'gsn_y',
+                'hsv2rgb', 'maximize_output', 'namedcolor2rgb', 'namedcolor2rgba',
+                'reset_device_coordinates', 'span_named_colors'), prefix=r'\b'),
+             Name.Builtin),
+
+            # Resources
+            (words((
+                'amDataXF', 'amDataYF', 'amJust', 'amOn', 'amOrthogonalPosF',
+                'amParallelPosF', 'amResizeNotify', 'amSide', 'amTrackData',
+                'amViewId', 'amZone', 'appDefaultParent', 'appFileSuffix',
+                'appResources', 'appSysDir', 'appUsrDir', 'caCopyArrays',
+                'caXArray', 'caXCast', 'caXMaxV', 'caXMinV', 'caXMissingV',
+                'caYArray', 'caYCast', 'caYMaxV', 'caYMinV', 'caYMissingV',
+                'cnCellFillEdgeColor', 'cnCellFillMissingValEdgeColor',
+                'cnConpackParams', 'cnConstFEnableFill', 'cnConstFLabelAngleF',
+                'cnConstFLabelBackgroundColor', 'cnConstFLabelConstantSpacingF',
+                'cnConstFLabelFont', 'cnConstFLabelFontAspectF',
+                'cnConstFLabelFontColor', 'cnConstFLabelFontHeightF',
+                'cnConstFLabelFontQuality', 'cnConstFLabelFontThicknessF',
+                'cnConstFLabelFormat', 'cnConstFLabelFuncCode', 'cnConstFLabelJust',
+                'cnConstFLabelOn', 'cnConstFLabelOrthogonalPosF',
+                'cnConstFLabelParallelPosF', 'cnConstFLabelPerimColor',
+                'cnConstFLabelPerimOn', 'cnConstFLabelPerimSpaceF',
+                'cnConstFLabelPerimThicknessF', 'cnConstFLabelSide',
+                'cnConstFLabelString', 'cnConstFLabelTextDirection',
+                'cnConstFLabelZone', 'cnConstFUseInfoLabelRes',
+                'cnExplicitLabelBarLabelsOn', 'cnExplicitLegendLabelsOn',
+                'cnExplicitLineLabelsOn', 'cnFillBackgroundColor', 'cnFillColor',
+                'cnFillColors', 'cnFillDotSizeF', 'cnFillDrawOrder', 'cnFillMode',
+                'cnFillOn', 'cnFillOpacityF', 'cnFillPalette', 'cnFillPattern',
+                'cnFillPatterns', 'cnFillScaleF', 'cnFillScales', 'cnFixFillBleed',
+                'cnGridBoundFillColor', 'cnGridBoundFillPattern',
+                'cnGridBoundFillScaleF', 'cnGridBoundPerimColor',
+                'cnGridBoundPerimDashPattern', 'cnGridBoundPerimOn',
+                'cnGridBoundPerimThicknessF', 'cnHighLabelAngleF',
+                'cnHighLabelBackgroundColor', 'cnHighLabelConstantSpacingF',
+                'cnHighLabelCount', 'cnHighLabelFont', 'cnHighLabelFontAspectF',
+                'cnHighLabelFontColor', 'cnHighLabelFontHeightF',
+                'cnHighLabelFontQuality', 'cnHighLabelFontThicknessF',
+                'cnHighLabelFormat', 'cnHighLabelFuncCode', 'cnHighLabelPerimColor',
+                'cnHighLabelPerimOn', 'cnHighLabelPerimSpaceF',
+                'cnHighLabelPerimThicknessF', 'cnHighLabelString', 'cnHighLabelsOn',
+                'cnHighLowLabelOverlapMode', 'cnHighUseLineLabelRes',
+                'cnInfoLabelAngleF', 'cnInfoLabelBackgroundColor',
+                'cnInfoLabelConstantSpacingF', 'cnInfoLabelFont',
+                'cnInfoLabelFontAspectF', 'cnInfoLabelFontColor',
+                'cnInfoLabelFontHeightF', 'cnInfoLabelFontQuality',
+                'cnInfoLabelFontThicknessF', 'cnInfoLabelFormat',
+                'cnInfoLabelFuncCode', 'cnInfoLabelJust', 'cnInfoLabelOn',
+                'cnInfoLabelOrthogonalPosF', 'cnInfoLabelParallelPosF',
+                'cnInfoLabelPerimColor', 'cnInfoLabelPerimOn',
+                'cnInfoLabelPerimSpaceF', 'cnInfoLabelPerimThicknessF',
+                'cnInfoLabelSide', 'cnInfoLabelString', 'cnInfoLabelTextDirection',
+                'cnInfoLabelZone', 'cnLabelBarEndLabelsOn', 'cnLabelBarEndStyle',
+                'cnLabelDrawOrder', 'cnLabelMasking', 'cnLabelScaleFactorF',
+                'cnLabelScaleValueF', 'cnLabelScalingMode', 'cnLegendLevelFlags',
+                'cnLevelCount', 'cnLevelFlag', 'cnLevelFlags', 'cnLevelSelectionMode',
+                'cnLevelSpacingF', 'cnLevels', 'cnLineColor', 'cnLineColors',
+                'cnLineDashPattern', 'cnLineDashPatterns', 'cnLineDashSegLenF',
+                'cnLineDrawOrder', 'cnLineLabelAngleF', 'cnLineLabelBackgroundColor',
+                'cnLineLabelConstantSpacingF', 'cnLineLabelCount',
+                'cnLineLabelDensityF', 'cnLineLabelFont', 'cnLineLabelFontAspectF',
+                'cnLineLabelFontColor', 'cnLineLabelFontColors',
+                'cnLineLabelFontHeightF', 'cnLineLabelFontQuality',
+                'cnLineLabelFontThicknessF', 'cnLineLabelFormat',
+                'cnLineLabelFuncCode', 'cnLineLabelInterval', 'cnLineLabelPerimColor',
+                'cnLineLabelPerimOn', 'cnLineLabelPerimSpaceF',
+                'cnLineLabelPerimThicknessF', 'cnLineLabelPlacementMode',
+                'cnLineLabelStrings', 'cnLineLabelsOn', 'cnLinePalette',
+                'cnLineThicknessF', 'cnLineThicknesses', 'cnLinesOn',
+                'cnLowLabelAngleF', 'cnLowLabelBackgroundColor',
+                'cnLowLabelConstantSpacingF', 'cnLowLabelCount', 'cnLowLabelFont',
+                'cnLowLabelFontAspectF', 'cnLowLabelFontColor',
+                'cnLowLabelFontHeightF', 'cnLowLabelFontQuality',
+                'cnLowLabelFontThicknessF', 'cnLowLabelFormat', 'cnLowLabelFuncCode',
+                'cnLowLabelPerimColor', 'cnLowLabelPerimOn', 'cnLowLabelPerimSpaceF',
+                'cnLowLabelPerimThicknessF', 'cnLowLabelString', 'cnLowLabelsOn',
+                'cnLowUseHighLabelRes', 'cnMaxDataValueFormat', 'cnMaxLevelCount',
+                'cnMaxLevelValF', 'cnMaxPointDistanceF', 'cnMinLevelValF',
+                'cnMissingValFillColor', 'cnMissingValFillPattern',
+                'cnMissingValFillScaleF', 'cnMissingValPerimColor',
+                'cnMissingValPerimDashPattern', 'cnMissingValPerimGridBoundOn',
+                'cnMissingValPerimOn', 'cnMissingValPerimThicknessF',
+                'cnMonoFillColor', 'cnMonoFillPattern', 'cnMonoFillScale',
+                'cnMonoLevelFlag', 'cnMonoLineColor', 'cnMonoLineDashPattern',
+                'cnMonoLineLabelFontColor', 'cnMonoLineThickness', 'cnNoDataLabelOn',
+                'cnNoDataLabelString', 'cnOutOfRangeFillColor',
+                'cnOutOfRangeFillPattern', 'cnOutOfRangeFillScaleF',
+                'cnOutOfRangePerimColor', 'cnOutOfRangePerimDashPattern',
+                'cnOutOfRangePerimOn', 'cnOutOfRangePerimThicknessF',
+                'cnRasterCellSizeF', 'cnRasterMinCellSizeF', 'cnRasterModeOn',
+                'cnRasterSampleFactorF', 'cnRasterSmoothingOn', 'cnScalarFieldData',
+                'cnSmoothingDistanceF', 'cnSmoothingOn', 'cnSmoothingTensionF',
+                'cnSpanFillPalette', 'cnSpanLinePalette', 'ctCopyTables',
+                'ctXElementSize', 'ctXMaxV', 'ctXMinV', 'ctXMissingV', 'ctXTable',
+                'ctXTableLengths', 'ctXTableType', 'ctYElementSize', 'ctYMaxV',
+                'ctYMinV', 'ctYMissingV', 'ctYTable', 'ctYTableLengths',
+                'ctYTableType', 'dcDelayCompute', 'errBuffer',
+                'errFileName', 'errFilePtr', 'errLevel', 'errPrint', 'errUnitNumber',
+                'gsClipOn', 'gsColors', 'gsEdgeColor', 'gsEdgeDashPattern',
+                'gsEdgeDashSegLenF', 'gsEdgeThicknessF', 'gsEdgesOn',
+                'gsFillBackgroundColor', 'gsFillColor', 'gsFillDotSizeF',
+                'gsFillIndex', 'gsFillLineThicknessF', 'gsFillOpacityF',
+                'gsFillScaleF', 'gsFont', 'gsFontAspectF', 'gsFontColor',
+                'gsFontHeightF', 'gsFontOpacityF', 'gsFontQuality',
+                'gsFontThicknessF', 'gsLineColor', 'gsLineDashPattern',
+                'gsLineDashSegLenF', 'gsLineLabelConstantSpacingF', 'gsLineLabelFont',
+                'gsLineLabelFontAspectF', 'gsLineLabelFontColor',
+                'gsLineLabelFontHeightF', 'gsLineLabelFontQuality',
+                'gsLineLabelFontThicknessF', 'gsLineLabelFuncCode',
+                'gsLineLabelString', 'gsLineOpacityF', 'gsLineThicknessF',
+                'gsMarkerColor', 'gsMarkerIndex', 'gsMarkerOpacityF', 'gsMarkerSizeF',
+                'gsMarkerThicknessF', 'gsSegments', 'gsTextAngleF',
+                'gsTextConstantSpacingF', 'gsTextDirection', 'gsTextFuncCode',
+                'gsTextJustification', 'gsnAboveYRefLineBarColors',
+                'gsnAboveYRefLineBarFillScales', 'gsnAboveYRefLineBarPatterns',
+                'gsnAboveYRefLineColor', 'gsnAddCyclic', 'gsnAttachBorderOn',
+                'gsnAttachPlotsXAxis', 'gsnBelowYRefLineBarColors',
+                'gsnBelowYRefLineBarFillScales', 'gsnBelowYRefLineBarPatterns',
+                'gsnBelowYRefLineColor', 'gsnBoxMargin', 'gsnCenterString',
+                'gsnCenterStringFontColor', 'gsnCenterStringFontHeightF',
+                'gsnCenterStringFuncCode', 'gsnCenterStringOrthogonalPosF',
+                'gsnCenterStringParallelPosF', 'gsnContourLineThicknessesScale',
+                'gsnContourNegLineDashPattern', 'gsnContourPosLineDashPattern',
+                'gsnContourZeroLineThicknessF', 'gsnDebugWriteFileName', 'gsnDraw',
+                'gsnFrame', 'gsnHistogramBarWidthPercent', 'gsnHistogramBinIntervals',
+                'gsnHistogramBinMissing', 'gsnHistogramBinWidth',
+                'gsnHistogramClassIntervals', 'gsnHistogramCompare',
+                'gsnHistogramComputePercentages',
+                'gsnHistogramComputePercentagesNoMissing',
+                'gsnHistogramDiscreteBinValues', 'gsnHistogramDiscreteClassValues',
+                'gsnHistogramHorizontal', 'gsnHistogramMinMaxBinsOn',
+                'gsnHistogramNumberOfBins', 'gsnHistogramPercentSign',
+                'gsnHistogramSelectNiceIntervals', 'gsnLeftString',
+                'gsnLeftStringFontColor', 'gsnLeftStringFontHeightF',
+                'gsnLeftStringFuncCode', 'gsnLeftStringOrthogonalPosF',
+                'gsnLeftStringParallelPosF', 'gsnMajorLatSpacing',
+                'gsnMajorLonSpacing', 'gsnMaskLambertConformal',
+                'gsnMaskLambertConformalOutlineOn', 'gsnMaximize',
+                'gsnMinorLatSpacing', 'gsnMinorLonSpacing', 'gsnPanelBottom',
+                'gsnPanelCenter', 'gsnPanelDebug', 'gsnPanelFigureStrings',
+                'gsnPanelFigureStringsBackgroundFillColor',
+                'gsnPanelFigureStringsFontHeightF', 'gsnPanelFigureStringsJust',
+                'gsnPanelFigureStringsPerimOn', 'gsnPanelLabelBar', 'gsnPanelLeft',
+                'gsnPanelMainFont', 'gsnPanelMainFontColor',
+                'gsnPanelMainFontHeightF', 'gsnPanelMainString', 'gsnPanelRight',
+                'gsnPanelRowSpec', 'gsnPanelScalePlotIndex', 'gsnPanelTop',
+                'gsnPanelXF', 'gsnPanelXWhiteSpacePercent', 'gsnPanelYF',
+                'gsnPanelYWhiteSpacePercent', 'gsnPaperHeight', 'gsnPaperMargin',
+                'gsnPaperOrientation', 'gsnPaperWidth', 'gsnPolar',
+                'gsnPolarLabelDistance', 'gsnPolarLabelFont',
+                'gsnPolarLabelFontHeightF', 'gsnPolarLabelSpacing', 'gsnPolarTime',
+                'gsnPolarUT', 'gsnRightString', 'gsnRightStringFontColor',
+                'gsnRightStringFontHeightF', 'gsnRightStringFuncCode',
+                'gsnRightStringOrthogonalPosF', 'gsnRightStringParallelPosF',
+                'gsnScalarContour', 'gsnScale', 'gsnShape', 'gsnSpreadColorEnd',
+                'gsnSpreadColorStart', 'gsnSpreadColors', 'gsnStringFont',
+                'gsnStringFontColor', 'gsnStringFontHeightF', 'gsnStringFuncCode',
+                'gsnTickMarksOn', 'gsnXAxisIrregular2Linear', 'gsnXAxisIrregular2Log',
+                'gsnXRefLine', 'gsnXRefLineColor', 'gsnXRefLineDashPattern',
+                'gsnXRefLineThicknessF', 'gsnXYAboveFillColors', 'gsnXYBarChart',
+                'gsnXYBarChartBarWidth', 'gsnXYBarChartColors',
+                'gsnXYBarChartColors2', 'gsnXYBarChartFillDotSizeF',
+                'gsnXYBarChartFillLineThicknessF', 'gsnXYBarChartFillOpacityF',
+                'gsnXYBarChartFillScaleF', 'gsnXYBarChartOutlineOnly',
+                'gsnXYBarChartOutlineThicknessF', 'gsnXYBarChartPatterns',
+                'gsnXYBarChartPatterns2', 'gsnXYBelowFillColors', 'gsnXYFillColors',
+                'gsnXYFillOpacities', 'gsnXYLeftFillColors', 'gsnXYRightFillColors',
+                'gsnYAxisIrregular2Linear', 'gsnYAxisIrregular2Log', 'gsnYRefLine',
+                'gsnYRefLineColor', 'gsnYRefLineColors', 'gsnYRefLineDashPattern',
+                'gsnYRefLineDashPatterns', 'gsnYRefLineThicknessF',
+                'gsnYRefLineThicknesses', 'gsnZonalMean', 'gsnZonalMeanXMaxF',
+                'gsnZonalMeanXMinF', 'gsnZonalMeanYRefLine', 'lbAutoManage',
+                'lbBottomMarginF', 'lbBoxCount', 'lbBoxEndCapStyle', 'lbBoxFractions',
+                'lbBoxLineColor', 'lbBoxLineDashPattern', 'lbBoxLineDashSegLenF',
+                'lbBoxLineThicknessF', 'lbBoxLinesOn', 'lbBoxMajorExtentF',
+                'lbBoxMinorExtentF', 'lbBoxSeparatorLinesOn', 'lbBoxSizing',
+                'lbFillBackground', 'lbFillColor', 'lbFillColors', 'lbFillDotSizeF',
+                'lbFillLineThicknessF', 'lbFillPattern', 'lbFillPatterns',
+                'lbFillScaleF', 'lbFillScales', 'lbJustification', 'lbLabelAlignment',
+                'lbLabelAngleF', 'lbLabelAutoStride', 'lbLabelBarOn',
+                'lbLabelConstantSpacingF', 'lbLabelDirection', 'lbLabelFont',
+                'lbLabelFontAspectF', 'lbLabelFontColor', 'lbLabelFontHeightF',
+                'lbLabelFontQuality', 'lbLabelFontThicknessF', 'lbLabelFuncCode',
+                'lbLabelJust', 'lbLabelOffsetF', 'lbLabelPosition', 'lbLabelStride',
+                'lbLabelStrings', 'lbLabelsOn', 'lbLeftMarginF', 'lbMaxLabelLenF',
+                'lbMinLabelSpacingF', 'lbMonoFillColor', 'lbMonoFillPattern',
+                'lbMonoFillScale', 'lbOrientation', 'lbPerimColor',
+                'lbPerimDashPattern', 'lbPerimDashSegLenF', 'lbPerimFill',
+                'lbPerimFillColor', 'lbPerimOn', 'lbPerimThicknessF',
+                'lbRasterFillOn', 'lbRightMarginF', 'lbTitleAngleF',
+                'lbTitleConstantSpacingF', 'lbTitleDirection', 'lbTitleExtentF',
+                'lbTitleFont', 'lbTitleFontAspectF', 'lbTitleFontColor',
+                'lbTitleFontHeightF', 'lbTitleFontQuality', 'lbTitleFontThicknessF',
+                'lbTitleFuncCode', 'lbTitleJust', 'lbTitleOffsetF', 'lbTitleOn',
+                'lbTitlePosition', 'lbTitleString', 'lbTopMarginF', 'lgAutoManage',
+                'lgBottomMarginF', 'lgBoxBackground', 'lgBoxLineColor',
+                'lgBoxLineDashPattern', 'lgBoxLineDashSegLenF', 'lgBoxLineThicknessF',
+                'lgBoxLinesOn', 'lgBoxMajorExtentF', 'lgBoxMinorExtentF',
+                'lgDashIndex', 'lgDashIndexes', 'lgItemCount', 'lgItemOrder',
+                'lgItemPlacement', 'lgItemPositions', 'lgItemType', 'lgItemTypes',
+                'lgJustification', 'lgLabelAlignment', 'lgLabelAngleF',
+                'lgLabelAutoStride', 'lgLabelConstantSpacingF', 'lgLabelDirection',
+                'lgLabelFont', 'lgLabelFontAspectF', 'lgLabelFontColor',
+                'lgLabelFontHeightF', 'lgLabelFontQuality', 'lgLabelFontThicknessF',
+                'lgLabelFuncCode', 'lgLabelJust', 'lgLabelOffsetF', 'lgLabelPosition',
+                'lgLabelStride', 'lgLabelStrings', 'lgLabelsOn', 'lgLeftMarginF',
+                'lgLegendOn', 'lgLineColor', 'lgLineColors', 'lgLineDashSegLenF',
+                'lgLineDashSegLens', 'lgLineLabelConstantSpacingF', 'lgLineLabelFont',
+                'lgLineLabelFontAspectF', 'lgLineLabelFontColor',
+                'lgLineLabelFontColors', 'lgLineLabelFontHeightF',
+                'lgLineLabelFontHeights', 'lgLineLabelFontQuality',
+                'lgLineLabelFontThicknessF', 'lgLineLabelFuncCode',
+                'lgLineLabelStrings', 'lgLineLabelsOn', 'lgLineThicknessF',
+                'lgLineThicknesses', 'lgMarkerColor', 'lgMarkerColors',
+                'lgMarkerIndex', 'lgMarkerIndexes', 'lgMarkerSizeF', 'lgMarkerSizes',
+                'lgMarkerThicknessF', 'lgMarkerThicknesses', 'lgMonoDashIndex',
+                'lgMonoItemType', 'lgMonoLineColor', 'lgMonoLineDashSegLen',
+                'lgMonoLineLabelFontColor', 'lgMonoLineLabelFontHeight',
+                'lgMonoLineThickness', 'lgMonoMarkerColor', 'lgMonoMarkerIndex',
+                'lgMonoMarkerSize', 'lgMonoMarkerThickness', 'lgOrientation',
+                'lgPerimColor', 'lgPerimDashPattern', 'lgPerimDashSegLenF',
+                'lgPerimFill', 'lgPerimFillColor', 'lgPerimOn', 'lgPerimThicknessF',
+                'lgRightMarginF', 'lgTitleAngleF', 'lgTitleConstantSpacingF',
+                'lgTitleDirection', 'lgTitleExtentF', 'lgTitleFont',
+                'lgTitleFontAspectF', 'lgTitleFontColor', 'lgTitleFontHeightF',
+                'lgTitleFontQuality', 'lgTitleFontThicknessF', 'lgTitleFuncCode',
+                'lgTitleJust', 'lgTitleOffsetF', 'lgTitleOn', 'lgTitlePosition',
+                'lgTitleString', 'lgTopMarginF', 'mpAreaGroupCount',
+                'mpAreaMaskingOn', 'mpAreaNames', 'mpAreaTypes', 'mpBottomAngleF',
+                'mpBottomMapPosF', 'mpBottomNDCF', 'mpBottomNPCF',
+                'mpBottomPointLatF', 'mpBottomPointLonF', 'mpBottomWindowF',
+                'mpCenterLatF', 'mpCenterLonF', 'mpCenterRotF', 'mpCountyLineColor',
+                'mpCountyLineDashPattern', 'mpCountyLineDashSegLenF',
+                'mpCountyLineThicknessF', 'mpDataBaseVersion', 'mpDataResolution',
+                'mpDataSetName', 'mpDefaultFillColor', 'mpDefaultFillPattern',
+                'mpDefaultFillScaleF', 'mpDynamicAreaGroups', 'mpEllipticalBoundary',
+                'mpFillAreaSpecifiers', 'mpFillBoundarySets', 'mpFillColor',
+                'mpFillColors', 'mpFillColors-default', 'mpFillDotSizeF',
+                'mpFillDrawOrder', 'mpFillOn', 'mpFillPatternBackground',
+                'mpFillPattern', 'mpFillPatterns', 'mpFillPatterns-default',
+                'mpFillScaleF', 'mpFillScales', 'mpFillScales-default',
+                'mpFixedAreaGroups', 'mpGeophysicalLineColor',
+                'mpGeophysicalLineDashPattern', 'mpGeophysicalLineDashSegLenF',
+                'mpGeophysicalLineThicknessF', 'mpGreatCircleLinesOn',
+                'mpGridAndLimbDrawOrder', 'mpGridAndLimbOn', 'mpGridLatSpacingF',
+                'mpGridLineColor', 'mpGridLineDashPattern', 'mpGridLineDashSegLenF',
+                'mpGridLineThicknessF', 'mpGridLonSpacingF', 'mpGridMaskMode',
+                'mpGridMaxLatF', 'mpGridPolarLonSpacingF', 'mpGridSpacingF',
+                'mpInlandWaterFillColor', 'mpInlandWaterFillPattern',
+                'mpInlandWaterFillScaleF', 'mpLabelDrawOrder', 'mpLabelFontColor',
+                'mpLabelFontHeightF', 'mpLabelsOn', 'mpLambertMeridianF',
+                'mpLambertParallel1F', 'mpLambertParallel2F', 'mpLandFillColor',
+                'mpLandFillPattern', 'mpLandFillScaleF', 'mpLeftAngleF',
+                'mpLeftCornerLatF', 'mpLeftCornerLonF', 'mpLeftMapPosF',
+                'mpLeftNDCF', 'mpLeftNPCF', 'mpLeftPointLatF',
+                'mpLeftPointLonF', 'mpLeftWindowF', 'mpLimbLineColor',
+                'mpLimbLineDashPattern', 'mpLimbLineDashSegLenF',
+                'mpLimbLineThicknessF', 'mpLimitMode', 'mpMaskAreaSpecifiers',
+                'mpMaskOutlineSpecifiers', 'mpMaxLatF', 'mpMaxLonF',
+                'mpMinLatF', 'mpMinLonF', 'mpMonoFillColor', 'mpMonoFillPattern',
+                'mpMonoFillScale', 'mpNationalLineColor', 'mpNationalLineDashPattern',
+                'mpNationalLineThicknessF', 'mpOceanFillColor', 'mpOceanFillPattern',
+                'mpOceanFillScaleF', 'mpOutlineBoundarySets', 'mpOutlineDrawOrder',
+                'mpOutlineMaskingOn', 'mpOutlineOn', 'mpOutlineSpecifiers',
+                'mpPerimDrawOrder', 'mpPerimLineColor', 'mpPerimLineDashPattern',
+                'mpPerimLineDashSegLenF', 'mpPerimLineThicknessF', 'mpPerimOn',
+                'mpPolyMode', 'mpProjection', 'mpProvincialLineColor',
+                'mpProvincialLineDashPattern', 'mpProvincialLineDashSegLenF',
+                'mpProvincialLineThicknessF', 'mpRelativeCenterLat',
+                'mpRelativeCenterLon', 'mpRightAngleF', 'mpRightCornerLatF',
+                'mpRightCornerLonF', 'mpRightMapPosF', 'mpRightNDCF',
+                'mpRightNPCF', 'mpRightPointLatF', 'mpRightPointLonF',
+                'mpRightWindowF', 'mpSatelliteAngle1F', 'mpSatelliteAngle2F',
+                'mpSatelliteDistF', 'mpShapeMode', 'mpSpecifiedFillColors',
+                'mpSpecifiedFillDirectIndexing', 'mpSpecifiedFillPatterns',
+                'mpSpecifiedFillPriority', 'mpSpecifiedFillScales',
+                'mpTopAngleF', 'mpTopMapPosF', 'mpTopNDCF', 'mpTopNPCF',
+                'mpTopPointLatF', 'mpTopPointLonF', 'mpTopWindowF',
+                'mpUSStateLineColor', 'mpUSStateLineDashPattern',
+                'mpUSStateLineDashSegLenF', 'mpUSStateLineThicknessF',
+                'pmAnnoManagers', 'pmAnnoViews', 'pmLabelBarDisplayMode',
+                'pmLabelBarHeightF', 'pmLabelBarKeepAspect', 'pmLabelBarOrthogonalPosF',
+                'pmLabelBarParallelPosF', 'pmLabelBarSide', 'pmLabelBarWidthF',
+                'pmLabelBarZone', 'pmLegendDisplayMode', 'pmLegendHeightF',
+                'pmLegendKeepAspect', 'pmLegendOrthogonalPosF',
+                'pmLegendParallelPosF', 'pmLegendSide', 'pmLegendWidthF',
+                'pmLegendZone', 'pmOverlaySequenceIds', 'pmTickMarkDisplayMode',
+                'pmTickMarkZone', 'pmTitleDisplayMode', 'pmTitleZone',
+                'prGraphicStyle', 'prPolyType', 'prXArray', 'prYArray',
+                'sfCopyData', 'sfDataArray', 'sfDataMaxV', 'sfDataMinV',
+                'sfElementNodes', 'sfExchangeDimensions', 'sfFirstNodeIndex',
+                'sfMissingValueV', 'sfXArray', 'sfXCActualEndF', 'sfXCActualStartF',
+                'sfXCEndIndex', 'sfXCEndSubsetV', 'sfXCEndV', 'sfXCStartIndex',
+                'sfXCStartSubsetV', 'sfXCStartV', 'sfXCStride', 'sfXCellBounds',
+                'sfYArray', 'sfYCActualEndF', 'sfYCActualStartF', 'sfYCEndIndex',
+                'sfYCEndSubsetV', 'sfYCEndV', 'sfYCStartIndex', 'sfYCStartSubsetV',
+                'sfYCStartV', 'sfYCStride', 'sfYCellBounds', 'stArrowLengthF',
+                'stArrowStride', 'stCrossoverCheckCount',
+                'stExplicitLabelBarLabelsOn', 'stLabelBarEndLabelsOn',
+                'stLabelFormat', 'stLengthCheckCount', 'stLevelColors',
+                'stLevelCount', 'stLevelPalette', 'stLevelSelectionMode',
+                'stLevelSpacingF', 'stLevels', 'stLineColor', 'stLineOpacityF',
+                'stLineStartStride', 'stLineThicknessF', 'stMapDirection',
+                'stMaxLevelCount', 'stMaxLevelValF', 'stMinArrowSpacingF',
+                'stMinDistanceF', 'stMinLevelValF', 'stMinLineSpacingF',
+                'stMinStepFactorF', 'stMonoLineColor', 'stNoDataLabelOn',
+                'stNoDataLabelString', 'stScalarFieldData', 'stScalarMissingValColor',
+                'stSpanLevelPalette', 'stStepSizeF', 'stStreamlineDrawOrder',
+                'stUseScalarArray', 'stVectorFieldData', 'stZeroFLabelAngleF',
+                'stZeroFLabelBackgroundColor', 'stZeroFLabelConstantSpacingF',
+                'stZeroFLabelFont', 'stZeroFLabelFontAspectF',
+                'stZeroFLabelFontColor', 'stZeroFLabelFontHeightF',
+                'stZeroFLabelFontQuality', 'stZeroFLabelFontThicknessF',
+                'stZeroFLabelFuncCode', 'stZeroFLabelJust', 'stZeroFLabelOn',
+                'stZeroFLabelOrthogonalPosF', 'stZeroFLabelParallelPosF',
+                'stZeroFLabelPerimColor', 'stZeroFLabelPerimOn',
+                'stZeroFLabelPerimSpaceF', 'stZeroFLabelPerimThicknessF',
+                'stZeroFLabelSide', 'stZeroFLabelString', 'stZeroFLabelTextDirection',
+                'stZeroFLabelZone', 'tfDoNDCOverlay', 'tfPlotManagerOn',
+                'tfPolyDrawList', 'tfPolyDrawOrder', 'tiDeltaF', 'tiMainAngleF',
+                'tiMainConstantSpacingF', 'tiMainDirection', 'tiMainFont',
+                'tiMainFontAspectF', 'tiMainFontColor', 'tiMainFontHeightF',
+                'tiMainFontQuality', 'tiMainFontThicknessF', 'tiMainFuncCode',
+                'tiMainJust', 'tiMainOffsetXF', 'tiMainOffsetYF', 'tiMainOn',
+                'tiMainPosition', 'tiMainSide', 'tiMainString', 'tiUseMainAttributes',
+                'tiXAxisAngleF', 'tiXAxisConstantSpacingF', 'tiXAxisDirection',
+                'tiXAxisFont', 'tiXAxisFontAspectF', 'tiXAxisFontColor',
+                'tiXAxisFontHeightF', 'tiXAxisFontQuality', 'tiXAxisFontThicknessF',
+                'tiXAxisFuncCode', 'tiXAxisJust', 'tiXAxisOffsetXF',
+                'tiXAxisOffsetYF', 'tiXAxisOn', 'tiXAxisPosition', 'tiXAxisSide',
+                'tiXAxisString', 'tiYAxisAngleF', 'tiYAxisConstantSpacingF',
+                'tiYAxisDirection', 'tiYAxisFont', 'tiYAxisFontAspectF',
+                'tiYAxisFontColor', 'tiYAxisFontHeightF', 'tiYAxisFontQuality',
+                'tiYAxisFontThicknessF', 'tiYAxisFuncCode', 'tiYAxisJust',
+                'tiYAxisOffsetXF', 'tiYAxisOffsetYF', 'tiYAxisOn', 'tiYAxisPosition',
+                'tiYAxisSide', 'tiYAxisString', 'tmBorderLineColor',
+                'tmBorderThicknessF', 'tmEqualizeXYSizes', 'tmLabelAutoStride',
+                'tmSciNoteCutoff', 'tmXBAutoPrecision', 'tmXBBorderOn',
+                'tmXBDataLeftF', 'tmXBDataRightF', 'tmXBFormat', 'tmXBIrrTensionF',
+                'tmXBIrregularPoints', 'tmXBLabelAngleF', 'tmXBLabelConstantSpacingF',
+                'tmXBLabelDeltaF', 'tmXBLabelDirection', 'tmXBLabelFont',
+                'tmXBLabelFontAspectF', 'tmXBLabelFontColor', 'tmXBLabelFontHeightF',
+                'tmXBLabelFontQuality', 'tmXBLabelFontThicknessF',
+                'tmXBLabelFuncCode', 'tmXBLabelJust', 'tmXBLabelStride', 'tmXBLabels',
+                'tmXBLabelsOn', 'tmXBMajorLengthF', 'tmXBMajorLineColor',
+                'tmXBMajorOutwardLengthF', 'tmXBMajorThicknessF', 'tmXBMaxLabelLenF',
+                'tmXBMaxTicks', 'tmXBMinLabelSpacingF', 'tmXBMinorLengthF',
+                'tmXBMinorLineColor', 'tmXBMinorOn', 'tmXBMinorOutwardLengthF',
+                'tmXBMinorPerMajor', 'tmXBMinorThicknessF', 'tmXBMinorValues',
+                'tmXBMode', 'tmXBOn', 'tmXBPrecision', 'tmXBStyle', 'tmXBTickEndF',
+                'tmXBTickSpacingF', 'tmXBTickStartF', 'tmXBValues', 'tmXMajorGrid',
+                'tmXMajorGridLineColor', 'tmXMajorGridLineDashPattern',
+                'tmXMajorGridThicknessF', 'tmXMinorGrid', 'tmXMinorGridLineColor',
+                'tmXMinorGridLineDashPattern', 'tmXMinorGridThicknessF',
+                'tmXTAutoPrecision', 'tmXTBorderOn', 'tmXTDataLeftF',
+                'tmXTDataRightF', 'tmXTFormat', 'tmXTIrrTensionF',
+                'tmXTIrregularPoints', 'tmXTLabelAngleF', 'tmXTLabelConstantSpacingF',
+                'tmXTLabelDeltaF', 'tmXTLabelDirection', 'tmXTLabelFont',
+                'tmXTLabelFontAspectF', 'tmXTLabelFontColor', 'tmXTLabelFontHeightF',
+                'tmXTLabelFontQuality', 'tmXTLabelFontThicknessF',
+                'tmXTLabelFuncCode', 'tmXTLabelJust', 'tmXTLabelStride', 'tmXTLabels',
+                'tmXTLabelsOn', 'tmXTMajorLengthF', 'tmXTMajorLineColor',
+                'tmXTMajorOutwardLengthF', 'tmXTMajorThicknessF', 'tmXTMaxLabelLenF',
+                'tmXTMaxTicks', 'tmXTMinLabelSpacingF', 'tmXTMinorLengthF',
+                'tmXTMinorLineColor', 'tmXTMinorOn', 'tmXTMinorOutwardLengthF',
+                'tmXTMinorPerMajor', 'tmXTMinorThicknessF', 'tmXTMinorValues',
+                'tmXTMode', 'tmXTOn', 'tmXTPrecision', 'tmXTStyle', 'tmXTTickEndF',
+                'tmXTTickSpacingF', 'tmXTTickStartF', 'tmXTValues', 'tmXUseBottom',
+                'tmYLAutoPrecision', 'tmYLBorderOn', 'tmYLDataBottomF',
+                'tmYLDataTopF', 'tmYLFormat', 'tmYLIrrTensionF',
+                'tmYLIrregularPoints', 'tmYLLabelAngleF', 'tmYLLabelConstantSpacingF',
+                'tmYLLabelDeltaF', 'tmYLLabelDirection', 'tmYLLabelFont',
+                'tmYLLabelFontAspectF', 'tmYLLabelFontColor', 'tmYLLabelFontHeightF',
+                'tmYLLabelFontQuality', 'tmYLLabelFontThicknessF',
+                'tmYLLabelFuncCode', 'tmYLLabelJust', 'tmYLLabelStride', 'tmYLLabels',
+                'tmYLLabelsOn', 'tmYLMajorLengthF', 'tmYLMajorLineColor',
+                'tmYLMajorOutwardLengthF', 'tmYLMajorThicknessF', 'tmYLMaxLabelLenF',
+                'tmYLMaxTicks', 'tmYLMinLabelSpacingF', 'tmYLMinorLengthF',
+                'tmYLMinorLineColor', 'tmYLMinorOn', 'tmYLMinorOutwardLengthF',
+                'tmYLMinorPerMajor', 'tmYLMinorThicknessF', 'tmYLMinorValues',
+                'tmYLMode', 'tmYLOn', 'tmYLPrecision', 'tmYLStyle', 'tmYLTickEndF',
+                'tmYLTickSpacingF', 'tmYLTickStartF', 'tmYLValues', 'tmYMajorGrid',
+                'tmYMajorGridLineColor', 'tmYMajorGridLineDashPattern',
+                'tmYMajorGridThicknessF', 'tmYMinorGrid', 'tmYMinorGridLineColor',
+                'tmYMinorGridLineDashPattern', 'tmYMinorGridThicknessF',
+                'tmYRAutoPrecision', 'tmYRBorderOn', 'tmYRDataBottomF',
+                'tmYRDataTopF', 'tmYRFormat', 'tmYRIrrTensionF',
+                'tmYRIrregularPoints', 'tmYRLabelAngleF', 'tmYRLabelConstantSpacingF',
+                'tmYRLabelDeltaF', 'tmYRLabelDirection', 'tmYRLabelFont',
+                'tmYRLabelFontAspectF', 'tmYRLabelFontColor', 'tmYRLabelFontHeightF',
+                'tmYRLabelFontQuality', 'tmYRLabelFontThicknessF',
+                'tmYRLabelFuncCode', 'tmYRLabelJust', 'tmYRLabelStride', 'tmYRLabels',
+                'tmYRLabelsOn', 'tmYRMajorLengthF', 'tmYRMajorLineColor',
+                'tmYRMajorOutwardLengthF', 'tmYRMajorThicknessF', 'tmYRMaxLabelLenF',
+                'tmYRMaxTicks', 'tmYRMinLabelSpacingF', 'tmYRMinorLengthF',
+                'tmYRMinorLineColor', 'tmYRMinorOn', 'tmYRMinorOutwardLengthF',
+                'tmYRMinorPerMajor', 'tmYRMinorThicknessF', 'tmYRMinorValues',
+                'tmYRMode', 'tmYROn', 'tmYRPrecision', 'tmYRStyle', 'tmYRTickEndF',
+                'tmYRTickSpacingF', 'tmYRTickStartF', 'tmYRValues', 'tmYUseLeft',
+                'trGridType', 'trLineInterpolationOn',
+                'trXAxisType', 'trXCoordPoints', 'trXInterPoints', 'trXLog',
+                'trXMaxF', 'trXMinF', 'trXReverse', 'trXSamples', 'trXTensionF',
+                'trYAxisType', 'trYCoordPoints', 'trYInterPoints', 'trYLog',
+                'trYMaxF', 'trYMinF', 'trYReverse', 'trYSamples', 'trYTensionF',
+                'txAngleF', 'txBackgroundFillColor', 'txConstantSpacingF', 'txDirection',
+                'txFont', 'HLU-Fonts', 'txFontAspectF', 'txFontColor',
+                'txFontHeightF', 'txFontOpacityF', 'txFontQuality',
+                'txFontThicknessF', 'txFuncCode', 'txJust', 'txPerimColor',
+                'txPerimDashLengthF', 'txPerimDashPattern', 'txPerimOn',
+                'txPerimSpaceF', 'txPerimThicknessF', 'txPosXF', 'txPosYF',
+                'txString', 'vcExplicitLabelBarLabelsOn', 'vcFillArrowEdgeColor',
+                'vcFillArrowEdgeThicknessF', 'vcFillArrowFillColor',
+                'vcFillArrowHeadInteriorXF', 'vcFillArrowHeadMinFracXF',
+                'vcFillArrowHeadMinFracYF', 'vcFillArrowHeadXF', 'vcFillArrowHeadYF',
+                'vcFillArrowMinFracWidthF', 'vcFillArrowWidthF', 'vcFillArrowsOn',
+                'vcFillOverEdge', 'vcGlyphOpacityF', 'vcGlyphStyle',
+                'vcLabelBarEndLabelsOn', 'vcLabelFontColor', 'vcLabelFontHeightF',
+                'vcLabelsOn', 'vcLabelsUseVectorColor', 'vcLevelColors',
+                'vcLevelCount', 'vcLevelPalette', 'vcLevelSelectionMode',
+                'vcLevelSpacingF', 'vcLevels', 'vcLineArrowColor',
+                'vcLineArrowHeadMaxSizeF', 'vcLineArrowHeadMinSizeF',
+                'vcLineArrowThicknessF', 'vcMagnitudeFormat',
+                'vcMagnitudeScaleFactorF', 'vcMagnitudeScaleValueF',
+                'vcMagnitudeScalingMode', 'vcMapDirection', 'vcMaxLevelCount',
+                'vcMaxLevelValF', 'vcMaxMagnitudeF', 'vcMinAnnoAngleF',
+                'vcMinAnnoArrowAngleF', 'vcMinAnnoArrowEdgeColor',
+                'vcMinAnnoArrowFillColor', 'vcMinAnnoArrowLineColor',
+                'vcMinAnnoArrowMinOffsetF', 'vcMinAnnoArrowSpaceF',
+                'vcMinAnnoArrowUseVecColor', 'vcMinAnnoBackgroundColor',
+                'vcMinAnnoConstantSpacingF', 'vcMinAnnoExplicitMagnitudeF',
+                'vcMinAnnoFont', 'vcMinAnnoFontAspectF', 'vcMinAnnoFontColor',
+                'vcMinAnnoFontHeightF', 'vcMinAnnoFontQuality',
+                'vcMinAnnoFontThicknessF', 'vcMinAnnoFuncCode', 'vcMinAnnoJust',
+                'vcMinAnnoOn', 'vcMinAnnoOrientation', 'vcMinAnnoOrthogonalPosF',
+                'vcMinAnnoParallelPosF', 'vcMinAnnoPerimColor', 'vcMinAnnoPerimOn',
+                'vcMinAnnoPerimSpaceF', 'vcMinAnnoPerimThicknessF', 'vcMinAnnoSide',
+                'vcMinAnnoString1', 'vcMinAnnoString1On', 'vcMinAnnoString2',
+                'vcMinAnnoString2On', 'vcMinAnnoTextDirection', 'vcMinAnnoZone',
+                'vcMinDistanceF', 'vcMinFracLengthF', 'vcMinLevelValF',
+                'vcMinMagnitudeF', 'vcMonoFillArrowEdgeColor',
+                'vcMonoFillArrowFillColor', 'vcMonoLineArrowColor',
+                'vcMonoWindBarbColor', 'vcNoDataLabelOn', 'vcNoDataLabelString',
+                'vcPositionMode', 'vcRefAnnoAngleF', 'vcRefAnnoArrowAngleF',
+                'vcRefAnnoArrowEdgeColor', 'vcRefAnnoArrowFillColor',
+                'vcRefAnnoArrowLineColor', 'vcRefAnnoArrowMinOffsetF',
+                'vcRefAnnoArrowSpaceF', 'vcRefAnnoArrowUseVecColor',
+                'vcRefAnnoBackgroundColor', 'vcRefAnnoConstantSpacingF',
+                'vcRefAnnoExplicitMagnitudeF', 'vcRefAnnoFont',
+                'vcRefAnnoFontAspectF', 'vcRefAnnoFontColor', 'vcRefAnnoFontHeightF',
+                'vcRefAnnoFontQuality', 'vcRefAnnoFontThicknessF',
+                'vcRefAnnoFuncCode', 'vcRefAnnoJust', 'vcRefAnnoOn',
+                'vcRefAnnoOrientation', 'vcRefAnnoOrthogonalPosF',
+                'vcRefAnnoParallelPosF', 'vcRefAnnoPerimColor', 'vcRefAnnoPerimOn',
+                'vcRefAnnoPerimSpaceF', 'vcRefAnnoPerimThicknessF', 'vcRefAnnoSide',
+                'vcRefAnnoString1', 'vcRefAnnoString1On', 'vcRefAnnoString2',
+                'vcRefAnnoString2On', 'vcRefAnnoTextDirection', 'vcRefAnnoZone',
+                'vcRefLengthF', 'vcRefMagnitudeF', 'vcScalarFieldData',
+                'vcScalarMissingValColor', 'vcScalarValueFormat',
+                'vcScalarValueScaleFactorF', 'vcScalarValueScaleValueF',
+                'vcScalarValueScalingMode', 'vcSpanLevelPalette', 'vcUseRefAnnoRes',
+                'vcUseScalarArray', 'vcVectorDrawOrder', 'vcVectorFieldData',
+                'vcWindBarbCalmCircleSizeF', 'vcWindBarbColor',
+                'vcWindBarbLineThicknessF', 'vcWindBarbScaleFactorF',
+                'vcWindBarbTickAngleF', 'vcWindBarbTickLengthF',
+                'vcWindBarbTickSpacingF', 'vcZeroFLabelAngleF',
+                'vcZeroFLabelBackgroundColor', 'vcZeroFLabelConstantSpacingF',
+                'vcZeroFLabelFont', 'vcZeroFLabelFontAspectF',
+                'vcZeroFLabelFontColor', 'vcZeroFLabelFontHeightF',
+                'vcZeroFLabelFontQuality', 'vcZeroFLabelFontThicknessF',
+                'vcZeroFLabelFuncCode', 'vcZeroFLabelJust', 'vcZeroFLabelOn',
+                'vcZeroFLabelOrthogonalPosF', 'vcZeroFLabelParallelPosF',
+                'vcZeroFLabelPerimColor', 'vcZeroFLabelPerimOn',
+                'vcZeroFLabelPerimSpaceF', 'vcZeroFLabelPerimThicknessF',
+                'vcZeroFLabelSide', 'vcZeroFLabelString', 'vcZeroFLabelTextDirection',
+                'vcZeroFLabelZone', 'vfCopyData', 'vfDataArray',
+                'vfExchangeDimensions', 'vfExchangeUVData', 'vfMagMaxV', 'vfMagMinV',
+                'vfMissingUValueV', 'vfMissingVValueV', 'vfPolarData',
+                'vfSingleMissingValue', 'vfUDataArray', 'vfUMaxV', 'vfUMinV',
+                'vfVDataArray', 'vfVMaxV', 'vfVMinV', 'vfXArray', 'vfXCActualEndF',
+                'vfXCActualStartF', 'vfXCEndIndex', 'vfXCEndSubsetV', 'vfXCEndV',
+                'vfXCStartIndex', 'vfXCStartSubsetV', 'vfXCStartV', 'vfXCStride',
+                'vfYArray', 'vfYCActualEndF', 'vfYCActualStartF', 'vfYCEndIndex',
+                'vfYCEndSubsetV', 'vfYCEndV', 'vfYCStartIndex', 'vfYCStartSubsetV',
+                'vfYCStartV', 'vfYCStride', 'vpAnnoManagerId', 'vpClipOn',
+                'vpHeightF', 'vpKeepAspect', 'vpOn', 'vpUseSegments', 'vpWidthF',
+                'vpXF', 'vpYF', 'wkAntiAlias', 'wkBackgroundColor', 'wkBackgroundOpacityF',
+                'wkColorMapLen', 'wkColorMap', 'wkColorModel', 'wkDashTableLength',
+                'wkDefGraphicStyleId', 'wkDeviceLowerX', 'wkDeviceLowerY',
+                'wkDeviceUpperX', 'wkDeviceUpperY', 'wkFileName', 'wkFillTableLength',
+                'wkForegroundColor', 'wkFormat', 'wkFullBackground', 'wkGksWorkId',
+                'wkHeight', 'wkMarkerTableLength', 'wkMetaName', 'wkOrientation',
+                'wkPDFFileName', 'wkPDFFormat', 'wkPDFResolution', 'wkPSFileName',
+                'wkPSFormat', 'wkPSResolution', 'wkPaperHeightF', 'wkPaperSize',
+                'wkPaperWidthF', 'wkPause', 'wkTopLevelViews', 'wkViews',
+                'wkVisualType', 'wkWidth', 'wkWindowId', 'wkXColorMode', 'wsCurrentSize',
+                'wsMaximumSize', 'wsThresholdSize', 'xyComputeXMax',
+                'xyComputeXMin', 'xyComputeYMax', 'xyComputeYMin', 'xyCoordData',
+                'xyCoordDataSpec', 'xyCurveDrawOrder', 'xyDashPattern',
+                'xyDashPatterns', 'xyExplicitLabels', 'xyExplicitLegendLabels',
+                'xyLabelMode', 'xyLineColor', 'xyLineColors', 'xyLineDashSegLenF',
+                'xyLineLabelConstantSpacingF', 'xyLineLabelFont',
+                'xyLineLabelFontAspectF', 'xyLineLabelFontColor',
+                'xyLineLabelFontColors', 'xyLineLabelFontHeightF',
+                'xyLineLabelFontQuality', 'xyLineLabelFontThicknessF',
+                'xyLineLabelFuncCode', 'xyLineThicknessF', 'xyLineThicknesses',
+                'xyMarkLineMode', 'xyMarkLineModes', 'xyMarker', 'xyMarkerColor',
+                'xyMarkerColors', 'xyMarkerSizeF', 'xyMarkerSizes',
+                'xyMarkerThicknessF', 'xyMarkerThicknesses', 'xyMarkers',
+                'xyMonoDashPattern', 'xyMonoLineColor', 'xyMonoLineLabelFontColor',
+                'xyMonoLineThickness', 'xyMonoMarkLineMode', 'xyMonoMarker',
+                'xyMonoMarkerColor', 'xyMonoMarkerSize', 'xyMonoMarkerThickness',
+                'xyXIrrTensionF', 'xyXIrregularPoints', 'xyXStyle', 'xyYIrrTensionF',
+                'xyYIrregularPoints', 'xyYStyle'), prefix=r'\b'),
+             Name.Builtin),
+
+            # Booleans
+            (r'\.(True|False)\.', Name.Builtin),
+            # Comparing Operators
+            (r'\.(eq|ne|lt|le|gt|ge|not|and|or|xor)\.', Operator.Word),
+        ],
+
+        'strings': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+        ],
+
+        'nums': [
+            (r'\d+(?![.e])(_[a-z]\w+)?', Number.Integer),
+            (r'[+-]?\d*\.\d+(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+            (r'[+-]?\d+\.\d*(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/textfmts.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/textfmts.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/textfmts.py	(revision 1126)
@@ -0,0 +1,297 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.textfmts
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various text formats.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Generic, Literal
+from pygments.util import ClassNotFound
+
+__all__ = ['IrcLogsLexer', 'TodotxtLexer', 'HttpLexer', 'GettextLexer']
+
+
+class IrcLogsLexer(RegexLexer):
+    """
+    Lexer for IRC logs in *irssi*, *xchat* or *weechat* style.
+    """
+
+    name = 'IRC logs'
+    aliases = ['irc']
+    filenames = ['*.weechatlog']
+    mimetypes = ['text/x-irclog']
+
+    flags = re.VERBOSE | re.MULTILINE
+    timestamp = r"""
+        (
+          # irssi / xchat and others
+          (?: \[|\()?                  # Opening bracket or paren for the timestamp
+            (?:                        # Timestamp
+                (?: (?:\d{1,4} [-/])*  # Date as - or /-separated groups of digits
+                    (?:\d{1,4})
+                 [T ])?                # Date/time separator: T or space
+                (?: \d?\d [:.])*       # Time as :/.-separated groups of 1 or 2 digits
+                    (?: \d?\d)
+            )
+          (?: \]|\))?\s+               # Closing bracket or paren for the timestamp
+        |
+          # weechat
+          \d{4}\s\w{3}\s\d{2}\s        # Date
+          \d{2}:\d{2}:\d{2}\s+         # Time + Whitespace
+        |
+          # xchat
+          \w{3}\s\d{2}\s               # Date
+          \d{2}:\d{2}:\d{2}\s+         # Time + Whitespace
+        )?
+    """
+    tokens = {
+        'root': [
+            # log start/end
+            (r'^\*\*\*\*(.*)\*\*\*\*$', Comment),
+            # hack
+            ("^" + timestamp + r'(\s*<[^>]*>\s*)$', bygroups(Comment.Preproc, Name.Tag)),
+            # normal msgs
+            ("^" + timestamp + r"""
+                (\s*<.*?>\s*)          # Nick """,
+             bygroups(Comment.Preproc, Name.Tag), 'msg'),
+            # /me msgs
+            ("^" + timestamp + r"""
+                (\s*[*]\s+)            # Star
+                (\S+\s+.*?\n)          # Nick + rest of message """,
+             bygroups(Comment.Preproc, Keyword, Generic.Inserted)),
+            # join/part msgs
+            ("^" + timestamp + r"""
+                (\s*(?:\*{3}|<?-[!@=P]?->?)\s*)  # Star(s) or symbols
+                (\S+\s+)                     # Nick + Space
+                (.*?\n)                         # Rest of message """,
+             bygroups(Comment.Preproc, Keyword, String, Comment)),
+            (r"^.*?\n", Text),
+        ],
+        'msg': [
+            (r"\S+:(?!//)", Name.Attribute),  # Prefix
+            (r".*\n", Text, '#pop'),
+        ],
+    }
+
+
+class GettextLexer(RegexLexer):
+    """
+    Lexer for Gettext catalog files.
+
+    .. versionadded:: 0.9
+    """
+    name = 'Gettext Catalog'
+    aliases = ['pot', 'po']
+    filenames = ['*.pot', '*.po']
+    mimetypes = ['application/x-gettext', 'text/x-gettext', 'text/gettext']
+
+    tokens = {
+        'root': [
+            (r'^#,\s.*?$', Keyword.Type),
+            (r'^#:\s.*?$', Keyword.Declaration),
+            # (r'^#$', Comment),
+            (r'^(#|#\.\s|#\|\s|#~\s|#\s).*$', Comment.Single),
+            (r'^(")([A-Za-z-]+:)(.*")$',
+             bygroups(String, Name.Property, String)),
+            (r'^".*"$', String),
+            (r'^(msgid|msgid_plural|msgstr|msgctxt)(\s+)(".*")$',
+             bygroups(Name.Variable, Text, String)),
+            (r'^(msgstr\[)(\d)(\])(\s+)(".*")$',
+             bygroups(Name.Variable, Number.Integer, Name.Variable, Text, String)),
+        ]
+    }
+
+
+class HttpLexer(RegexLexer):
+    """
+    Lexer for HTTP sessions.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'HTTP'
+    aliases = ['http']
+
+    flags = re.DOTALL
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        """Reset the content-type state."""
+        self.content_type = None
+        return RegexLexer.get_tokens_unprocessed(self, text, stack)
+
+    def header_callback(self, match):
+        if match.group(1).lower() == 'content-type':
+            content_type = match.group(5).strip()
+            if ';' in content_type:
+                content_type = content_type[:content_type.find(';')].strip()
+            self.content_type = content_type
+        yield match.start(1), Name.Attribute, match.group(1)
+        yield match.start(2), Text, match.group(2)
+        yield match.start(3), Operator, match.group(3)
+        yield match.start(4), Text, match.group(4)
+        yield match.start(5), Literal, match.group(5)
+        yield match.start(6), Text, match.group(6)
+
+    def continuous_header_callback(self, match):
+        yield match.start(1), Text, match.group(1)
+        yield match.start(2), Literal, match.group(2)
+        yield match.start(3), Text, match.group(3)
+
+    def content_callback(self, match):
+        content_type = getattr(self, 'content_type', None)
+        content = match.group()
+        offset = match.start()
+        if content_type:
+            from pygments.lexers import get_lexer_for_mimetype
+            possible_lexer_mimetypes = [content_type]
+            if '+' in content_type:
+                # application/calendar+xml can be treated as application/xml
+                # if there's not a better match.
+                general_type = re.sub(r'^(.*)/.*\+(.*)$', r'\1/\2',
+                                      content_type)
+                possible_lexer_mimetypes.append(general_type)
+
+            for i in possible_lexer_mimetypes:
+                try:
+                    lexer = get_lexer_for_mimetype(i)
+                except ClassNotFound:
+                    pass
+                else:
+                    for idx, token, value in lexer.get_tokens_unprocessed(content):
+                        yield offset + idx, token, value
+                    return
+        yield offset, Text, content
+
+    tokens = {
+        'root': [
+            (r'(GET|POST|PUT|DELETE|HEAD|OPTIONS|TRACE|PATCH)( +)([^ ]+)( +)'
+             r'(HTTP)(/)(1\.[01])(\r?\n|\Z)',
+             bygroups(Name.Function, Text, Name.Namespace, Text,
+                      Keyword.Reserved, Operator, Number, Text),
+             'headers'),
+            (r'(HTTP)(/)(1\.[01])( +)(\d{3})( +)([^\r\n]+)(\r?\n|\Z)',
+             bygroups(Keyword.Reserved, Operator, Number, Text, Number,
+                      Text, Name.Exception, Text),
+             'headers'),
+        ],
+        'headers': [
+            (r'([^\s:]+)( *)(:)( *)([^\r\n]+)(\r?\n|\Z)', header_callback),
+            (r'([\t ]+)([^\r\n]+)(\r?\n|\Z)', continuous_header_callback),
+            (r'\r?\n', Text, 'content')
+        ],
+        'content': [
+            (r'.+', content_callback)
+        ]
+    }
+
+    def analyse_text(text):
+        return text.startswith(('GET /', 'POST /', 'PUT /', 'DELETE /', 'HEAD /',
+                                'OPTIONS /', 'TRACE /', 'PATCH /'))
+
+
+class TodotxtLexer(RegexLexer):
+    """
+    Lexer for `Todo.txt <http://todotxt.com/>`_ todo list format.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Todotxt'
+    aliases = ['todotxt']
+    # *.todotxt is not a standard extension for Todo.txt files; including it
+    # makes testing easier, and also makes autodetecting file type easier.
+    filenames = ['todo.txt', '*.todotxt']
+    mimetypes = ['text/x-todo']
+
+    # Aliases mapping standard token types of Todo.txt format concepts
+    CompleteTaskText = Operator  # Chosen to de-emphasize complete tasks
+    IncompleteTaskText = Text    # Incomplete tasks should look like plain text
+
+    # Priority should have most emphasis to indicate importance of tasks
+    Priority = Generic.Heading
+    # Dates should have next most emphasis because time is important
+    Date = Generic.Subheading
+
+    # Project and context should have equal weight, and be in different colors
+    Project = Generic.Error
+    Context = String
+
+    # If tag functionality is added, it should have the same weight as Project
+    # and Context, and a different color. Generic.Traceback would work well.
+
+    # Regex patterns for building up rules; dates, priorities, projects, and
+    # contexts are all atomic
+    # TODO: Make date regex more ISO 8601 compliant
+    date_regex = r'\d{4,}-\d{2}-\d{2}'
+    priority_regex = r'\([A-Z]\)'
+    project_regex = r'\+\S+'
+    context_regex = r'@\S+'
+
+    # Compound regex expressions
+    complete_one_date_regex = r'(x )(' + date_regex + r')'
+    complete_two_date_regex = (complete_one_date_regex + r'( )(' +
+                               date_regex + r')')
+    priority_date_regex = r'(' + priority_regex + r')( )(' + date_regex + r')'
+
+    tokens = {
+        # Should parse starting at beginning of line; each line is a task
+        'root': [
+            # Complete task entry points: two total:
+            # 1. Complete task with two dates
+            (complete_two_date_regex, bygroups(CompleteTaskText, Date,
+                                               CompleteTaskText, Date),
+             'complete'),
+            # 2. Complete task with one date
+            (complete_one_date_regex, bygroups(CompleteTaskText, Date),
+             'complete'),
+
+            # Incomplete task entry points: six total:
+            # 1. Priority plus date
+            (priority_date_regex, bygroups(Priority, IncompleteTaskText, Date),
+             'incomplete'),
+            # 2. Priority only
+            (priority_regex, Priority, 'incomplete'),
+            # 3. Leading date
+            (date_regex, Date, 'incomplete'),
+            # 4. Leading context
+            (context_regex, Context, 'incomplete'),
+            # 5. Leading project
+            (project_regex, Project, 'incomplete'),
+            # 6. Non-whitespace catch-all
+            ('\S+', IncompleteTaskText, 'incomplete'),
+        ],
+
+        # Parse a complete task
+        'complete': [
+            # Newline indicates end of task, should return to root
+            (r'\s*\n', CompleteTaskText, '#pop'),
+            # Tokenize contexts and projects
+            (context_regex, Context),
+            (project_regex, Project),
+            # Tokenize non-whitespace text
+            ('\S+', CompleteTaskText),
+            # Tokenize whitespace not containing a newline
+            ('\s+', CompleteTaskText),
+        ],
+
+        # Parse an incomplete task
+        'incomplete': [
+            # Newline indicates end of task, should return to root
+            (r'\s*\n', IncompleteTaskText, '#pop'),
+            # Tokenize contexts and projects
+            (context_regex, Context),
+            (project_regex, Project),
+            # Tokenize non-whitespace text
+            ('\S+', IncompleteTaskText),
+            # Tokenize whitespace not containing a newline
+            ('\s+', IncompleteTaskText),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/special.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/special.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/special.py	(revision 1126)
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.special
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Special lexers.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer
+from pygments.token import Token, Error, Text
+from pygments.util import get_choice_opt, text_type, BytesIO
+
+
+__all__ = ['TextLexer', 'RawTokenLexer']
+
+
+class TextLexer(Lexer):
+    """
+    "Null" lexer, doesn't highlight anything.
+    """
+    name = 'Text only'
+    aliases = ['text']
+    filenames = ['*.txt']
+    mimetypes = ['text/plain']
+    priority = 0.01
+
+    def get_tokens_unprocessed(self, text):
+        yield 0, Text, text
+
+    def analyse_text(text):
+        return TextLexer.priority
+
+_ttype_cache = {}
+
+line_re = re.compile(b'.*?\n')
+
+
+class RawTokenLexer(Lexer):
+    """
+    Recreate a token stream formatted with the `RawTokenFormatter`.  This
+    lexer raises exceptions during parsing if the token stream in the
+    file is malformed.
+
+    Additional options accepted:
+
+    `compress`
+        If set to ``"gz"`` or ``"bz2"``, decompress the token stream with
+        the given compression algorithm before lexing (default: ``""``).
+    """
+    name = 'Raw token data'
+    aliases = ['raw']
+    filenames = []
+    mimetypes = ['application/x-pygments-tokens']
+
+    def __init__(self, **options):
+        self.compress = get_choice_opt(options, 'compress',
+                                       ['', 'none', 'gz', 'bz2'], '')
+        Lexer.__init__(self, **options)
+
+    def get_tokens(self, text):
+        if isinstance(text, text_type):
+            # raw token stream never has any non-ASCII characters
+            text = text.encode('ascii')
+        if self.compress == 'gz':
+            import gzip
+            gzipfile = gzip.GzipFile('', 'rb', 9, BytesIO(text))
+            text = gzipfile.read()
+        elif self.compress == 'bz2':
+            import bz2
+            text = bz2.decompress(text)
+
+        # do not call Lexer.get_tokens() because we do not want Unicode
+        # decoding to occur, and stripping is not optional.
+        text = text.strip(b'\n') + b'\n'
+        for i, t, v in self.get_tokens_unprocessed(text):
+            yield t, v
+
+    def get_tokens_unprocessed(self, text):
+        length = 0
+        for match in line_re.finditer(text):
+            try:
+                ttypestr, val = match.group().split(b'\t', 1)
+            except ValueError:
+                val = match.group().decode('ascii', 'replace')
+                ttype = Error
+            else:
+                ttype = _ttype_cache.get(ttypestr)
+                if not ttype:
+                    ttype = Token
+                    ttypes = ttypestr.split('.')[1:]
+                    for ttype_ in ttypes:
+                        if not ttype_ or not ttype_[0].isupper():
+                            raise ValueError('malformed token name')
+                        ttype = getattr(ttype, ttype_)
+                    _ttype_cache[ttypestr] = ttype
+                val = val[2:-2].decode('unicode-escape')
+            yield length, ttype, val
+            length += len(val)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/verification.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/verification.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/verification.py	(revision 1126)
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.verification
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Intermediate Verification Languages (IVLs).
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Operator, Keyword, Name, Number, \
+    Punctuation, Whitespace
+
+__all__ = ['BoogieLexer', 'SilverLexer']
+
+
+class BoogieLexer(RegexLexer):
+    """
+    For `Boogie <https://boogie.codeplex.com/>`_ source code.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Boogie'
+    aliases = ['boogie']
+    filenames = ['*.bpl']
+
+    tokens = {
+        'root': [
+            # Whitespace and Comments
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'//[/!](.*?)\n', Comment.Doc),
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            (words((
+                'axiom', 'break', 'call', 'ensures', 'else', 'exists', 'function',
+                'forall', 'if', 'invariant', 'modifies', 'procedure',  'requires',
+                'then', 'var', 'while'),
+             suffix=r'\b'), Keyword),
+            (words(('const',), suffix=r'\b'), Keyword.Reserved),
+
+            (words(('bool', 'int', 'ref'), suffix=r'\b'), Keyword.Type),
+            include('numbers'),
+            (r"(>=|<=|:=|!=|==>|&&|\|\||[+/\-=>*<\[\]])", Operator),
+            (r"([{}():;,.])", Punctuation),
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'numbers': [
+            (r'[0-9]+', Number.Integer),
+        ],
+    }
+
+
+class SilverLexer(RegexLexer):
+    """
+    For `Silver <https://bitbucket.org/viperproject/silver>`_ source code.
+
+    .. versionadded:: 2.2
+    """
+    name = 'Silver'
+    aliases = ['silver']
+    filenames = ['*.sil', '*.vpr']
+
+    tokens = {
+        'root': [
+            # Whitespace and Comments
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'//[/!](.*?)\n', Comment.Doc),
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            (words((
+                'result', 'true', 'false', 'null', 'method', 'function',
+                'predicate', 'program', 'domain', 'axiom', 'var', 'returns',
+                'field', 'define', 'requires', 'ensures', 'invariant',
+                'fold', 'unfold', 'inhale', 'exhale', 'new', 'assert',
+                'assume', 'goto', 'while', 'if', 'elseif', 'else', 'fresh',
+                'constraining', 'Seq', 'Set', 'Multiset', 'union', 'intersection',
+                'setminus', 'subset', 'unfolding', 'in', 'old', 'forall', 'exists',
+                'acc', 'wildcard', 'write', 'none', 'epsilon', 'perm', 'unique',
+                'apply', 'package', 'folding', 'label', 'forperm'),
+             suffix=r'\b'), Keyword),
+            (words(('Int', 'Perm', 'Bool', 'Ref'), suffix=r'\b'), Keyword.Type),
+            include('numbers'),
+
+            (r'[!%&*+=|?:<>/\-\[\]]', Operator),
+            (r'([{}():;,.])', Punctuation),
+            # Identifier
+            (r'[\w$]\w*', Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'numbers': [
+            (r'[0-9]+', Number.Integer),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/c_cpp.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/c_cpp.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/c_cpp.py	(revision 1126)
@@ -0,0 +1,252 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.c_cpp
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for C/C++ languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, \
+    this, inherit, default, words
+from pygments.util import get_bool_opt
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['CLexer', 'CppLexer']
+
+
+class CFamilyLexer(RegexLexer):
+    """
+    For C family source code.  This is used as a base class to avoid repetitious
+    definitions.
+    """
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+
+    # The trailing ?, rather than *, avoids a geometric performance drop here.
+    #: only one /* */ style comment
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)?'
+
+    tokens = {
+        'whitespace': [
+            # preprocessor directives: without whitespace
+            ('^#if\s+0', Comment.Preproc, 'if0'),
+            ('^#', Comment.Preproc, 'macro'),
+            # or with whitespace
+            ('^(' + _ws1 + r')(#if\s+0)',
+             bygroups(using(this), Comment.Preproc), 'if0'),
+            ('^(' + _ws1 + ')(#)',
+             bygroups(using(this), Comment.Preproc), 'macro'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'//(\n|[\w\W]*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*][\w\W]*?[*](\\\n)?/', Comment.Multiline),
+            # Open until EOF, so no ending delimeter
+            (r'/(\\\n)?[*][\w\W]*', Comment.Multiline),
+        ],
+        'statements': [
+            (r'(L?)(")', bygroups(String.Affix, String), 'string'),
+            (r"(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')",
+             bygroups(String.Affix, String.Char, String.Char, String.Char)),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'\*/', Error),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.]', Punctuation),
+            (words(('asm', 'auto', 'break', 'case', 'const', 'continue',
+                    'default', 'do', 'else', 'enum', 'extern', 'for', 'goto',
+                    'if', 'register', 'restricted', 'return', 'sizeof',
+                    'static', 'struct', 'switch', 'typedef', 'union',
+                    'volatile', 'while'),
+                   suffix=r'\b'), Keyword),
+            (r'(bool|int|long|float|short|double|char|unsigned|signed|void)\b',
+             Keyword.Type),
+            (words(('inline', '_inline', '__inline', 'naked', 'restrict',
+                    'thread', 'typename'), suffix=r'\b'), Keyword.Reserved),
+            # Vector intrinsics
+            (r'(__m(128i|128d|128|64))\b', Keyword.Reserved),
+            # Microsoft-isms
+            (words((
+                'asm', 'int8', 'based', 'except', 'int16', 'stdcall', 'cdecl',
+                'fastcall', 'int32', 'declspec', 'finally', 'int64', 'try',
+                'leave', 'wchar_t', 'w64', 'unaligned', 'raise', 'noop',
+                'identifier', 'forceinline', 'assume'),
+                prefix=r'__', suffix=r'\b'), Keyword.Reserved),
+            (r'(true|false|NULL)\b', Name.Builtin),
+            (r'([a-zA-Z_]\w*)(\s*)(:)(?!:)', bygroups(Name.Label, Text, Punctuation)),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'root': [
+            include('whitespace'),
+            # functions
+            (r'((?:[\w*\s])+?(?:\s|[*]))'  # return arguments
+             r'([a-zA-Z_]\w*)'             # method name
+             r'(\s*\([^;]*?\))'            # signature
+             r'([^;{]*)(\{)',
+             bygroups(using(this), Name.Function, using(this), using(this),
+                      Punctuation),
+             'function'),
+            # function declarations
+            (r'((?:[\w*\s])+?(?:\s|[*]))'  # return arguments
+             r'([a-zA-Z_]\w*)'             # method name
+             r'(\s*\([^;]*?\))'            # signature
+             r'([^;]*)(;)',
+             bygroups(using(this), Name.Function, using(this), using(this),
+                      Punctuation)),
+            default('statement'),
+        ],
+        'statement': [
+            include('whitespace'),
+            include('statements'),
+            ('[{}]', Punctuation),
+            (';', Punctuation, '#pop'),
+        ],
+        'function': [
+            include('whitespace'),
+            include('statements'),
+            (';', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'(include)(' + _ws1 + r')([^\n]+)',
+             bygroups(Comment.Preproc, Text, Comment.PreprocFile)),
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#el(?:se|if).*\n', Comment.Preproc, '#pop'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ]
+    }
+
+    stdlib_types = set((
+        'size_t', 'ssize_t', 'off_t', 'wchar_t', 'ptrdiff_t', 'sig_atomic_t', 'fpos_t',
+        'clock_t', 'time_t', 'va_list', 'jmp_buf', 'FILE', 'DIR', 'div_t', 'ldiv_t',
+        'mbstate_t', 'wctrans_t', 'wint_t', 'wctype_t'))
+    c99_types = set((
+        '_Bool', '_Complex', 'int8_t', 'int16_t', 'int32_t', 'int64_t', 'uint8_t',
+        'uint16_t', 'uint32_t', 'uint64_t', 'int_least8_t', 'int_least16_t',
+        'int_least32_t', 'int_least64_t', 'uint_least8_t', 'uint_least16_t',
+        'uint_least32_t', 'uint_least64_t', 'int_fast8_t', 'int_fast16_t', 'int_fast32_t',
+        'int_fast64_t', 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+        'intptr_t', 'uintptr_t', 'intmax_t', 'uintmax_t'))
+    linux_types = set((
+        'clockid_t', 'cpu_set_t', 'cpumask_t', 'dev_t', 'gid_t', 'id_t', 'ino_t', 'key_t',
+        'mode_t', 'nfds_t', 'pid_t', 'rlim_t', 'sig_t', 'sighandler_t', 'siginfo_t',
+        'sigset_t', 'sigval_t', 'socklen_t', 'timer_t', 'uid_t'))
+
+    def __init__(self, **options):
+        self.stdlibhighlighting = get_bool_opt(options, 'stdlibhighlighting', True)
+        self.c99highlighting = get_bool_opt(options, 'c99highlighting', True)
+        self.platformhighlighting = get_bool_opt(options, 'platformhighlighting', True)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                if self.stdlibhighlighting and value in self.stdlib_types:
+                    token = Keyword.Type
+                elif self.c99highlighting and value in self.c99_types:
+                    token = Keyword.Type
+                elif self.platformhighlighting and value in self.linux_types:
+                    token = Keyword.Type
+            yield index, token, value
+
+
+class CLexer(CFamilyLexer):
+    """
+    For C source code with preprocessor directives.
+    """
+    name = 'C'
+    aliases = ['c']
+    filenames = ['*.c', '*.h', '*.idc']
+    mimetypes = ['text/x-chdr', 'text/x-csrc']
+    priority = 0.1
+
+    def analyse_text(text):
+        if re.search('^\s*#include [<"]', text, re.MULTILINE):
+            return 0.1
+        if re.search('^\s*#ifn?def ', text, re.MULTILINE):
+            return 0.1
+
+
+class CppLexer(CFamilyLexer):
+    """
+    For C++ source code with preprocessor directives.
+    """
+    name = 'C++'
+    aliases = ['cpp', 'c++']
+    filenames = ['*.cpp', '*.hpp', '*.c++', '*.h++',
+                 '*.cc', '*.hh', '*.cxx', '*.hxx',
+                 '*.C', '*.H', '*.cp', '*.CPP']
+    mimetypes = ['text/x-c++hdr', 'text/x-c++src']
+    priority = 0.1
+
+    tokens = {
+        'statements': [
+            (words((
+                'catch', 'const_cast', 'delete', 'dynamic_cast', 'explicit',
+                'export', 'friend', 'mutable', 'namespace', 'new', 'operator',
+                'private', 'protected', 'public', 'reinterpret_cast',
+                'restrict', 'static_cast', 'template', 'this', 'throw', 'throws',
+                'try', 'typeid', 'typename', 'using', 'virtual',
+                'constexpr', 'nullptr', 'decltype', 'thread_local',
+                'alignas', 'alignof', 'static_assert', 'noexcept', 'override',
+                'final'), suffix=r'\b'), Keyword),
+            (r'char(16_t|32_t)\b', Keyword.Type),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            # C++11 raw strings
+            (r'(R)(")([^\\()\s]{,16})(\()((?:.|\n)*?)(\)\3)(")',
+             bygroups(String.Affix, String, String.Delimiter, String.Delimiter,
+                      String, String.Delimiter, String)),
+            # C++11 UTF-8/16/32 strings
+            (r'(u8|u|U)(")', bygroups(String.Affix, String), 'string'),
+            inherit,
+        ],
+        'root': [
+            inherit,
+            # C++ Microsoft-isms
+            (words(('virtual_inheritance', 'uuidof', 'super', 'single_inheritance',
+                    'multiple_inheritance', 'interface', 'event'),
+                   prefix=r'__', suffix=r'\b'), Keyword.Reserved),
+            # Offload C++ extensions, http://offload.codeplay.com/
+            (r'__(offload|blockingoffload|outer)\b', Keyword.Pseudo),
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            # template specification
+            (r'\s*(?=>)', Text, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search('#include <[a-z_]+>', text):
+            return 0.2
+        if re.search('using namespace ', text):
+            return 0.4
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/webmisc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/webmisc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/webmisc.py	(revision 1126)
@@ -0,0 +1,988 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.webmisc
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for misc. web stuff.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \
+    default, using
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+from pygments.util import unirange
+
+from pygments.lexers.css import _indentation, _starts_block
+from pygments.lexers.html import HtmlLexer
+from pygments.lexers.javascript import JavascriptLexer
+from pygments.lexers.ruby import RubyLexer
+
+__all__ = ['DuelLexer', 'SlimLexer', 'XQueryLexer', 'QmlLexer', 'CirruLexer']
+
+
+class DuelLexer(RegexLexer):
+    """
+    Lexer for Duel Views Engine (formerly JBST) markup with JavaScript code blocks.
+    See http://duelengine.org/.
+    See http://jsonml.org/jbst/.
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'Duel'
+    aliases = ['duel', 'jbst', 'jsonml+bst']
+    filenames = ['*.duel', '*.jbst']
+    mimetypes = ['text/x-duel', 'text/x-jbst']
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'(<%[@=#!:]?)(.*?)(%>)',
+             bygroups(Name.Tag, using(JavascriptLexer), Name.Tag)),
+            (r'(<%\$)(.*?)(:)(.*?)(%>)',
+             bygroups(Name.Tag, Name.Function, Punctuation, String, Name.Tag)),
+            (r'(<%--)(.*?)(--%>)',
+             bygroups(Name.Tag, Comment.Multiline, Name.Tag)),
+            (r'(<script.*?>)(.*?)(</script>)',
+             bygroups(using(HtmlLexer),
+                      using(JavascriptLexer), using(HtmlLexer))),
+            (r'(.+?)(?=<)', using(HtmlLexer)),
+            (r'.+', using(HtmlLexer)),
+        ],
+    }
+
+
+class XQueryLexer(ExtendedRegexLexer):
+    """
+    An XQuery lexer, parsing a stream and outputting the tokens needed to
+    highlight xquery code.
+
+    .. versionadded:: 1.4
+    """
+    name = 'XQuery'
+    aliases = ['xquery', 'xqy', 'xq', 'xql', 'xqm']
+    filenames = ['*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm']
+    mimetypes = ['text/xquery', 'application/xquery']
+
+    xquery_parse_state = []
+
+    # FIX UNICODE LATER
+    # ncnamestartchar = (
+    #    ur"[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|"
+    #    ur"[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|"
+    #    ur"[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|"
+    #    ur"[\u10000-\uEFFFF]"
+    # )
+    ncnamestartchar = r"(?:[A-Z]|_|[a-z])"
+    # FIX UNICODE LATER
+    # ncnamechar = ncnamestartchar + (ur"|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|"
+    #                                 ur"[\u203F-\u2040]")
+    ncnamechar = r"(?:" + ncnamestartchar + r"|-|\.|[0-9])"
+    ncname = "(?:%s+%s*)" % (ncnamestartchar, ncnamechar)
+    pitarget_namestartchar = r"(?:[A-KN-WYZ]|_|:|[a-kn-wyz])"
+    pitarget_namechar = r"(?:" + pitarget_namestartchar + r"|-|\.|[0-9])"
+    pitarget = "%s+%s*" % (pitarget_namestartchar, pitarget_namechar)
+    prefixedname = "%s:%s" % (ncname, ncname)
+    unprefixedname = ncname
+    qname = "(?:%s|%s)" % (prefixedname, unprefixedname)
+
+    entityref = r'(?:&(?:lt|gt|amp|quot|apos|nbsp);)'
+    charref = r'(?:&#[0-9]+;|&#x[0-9a-fA-F]+;)'
+
+    stringdouble = r'(?:"(?:' + entityref + r'|' + charref + r'|""|[^&"])*")'
+    stringsingle = r"(?:'(?:" + entityref + r"|" + charref + r"|''|[^&'])*')"
+
+    # FIX UNICODE LATER
+    # elementcontentchar = (ur'\t|\r|\n|[\u0020-\u0025]|[\u0028-\u003b]|'
+    #                       ur'[\u003d-\u007a]|\u007c|[\u007e-\u007F]')
+    elementcontentchar = r'[A-Za-z]|\s|\d|[!"#$%()*+,\-./:;=?@\[\\\]^_\'`|~]'
+    # quotattrcontentchar = (ur'\t|\r|\n|[\u0020-\u0021]|[\u0023-\u0025]|'
+    #                        ur'[\u0027-\u003b]|[\u003d-\u007a]|\u007c|[\u007e-\u007F]')
+    quotattrcontentchar = r'[A-Za-z]|\s|\d|[!#$%()*+,\-./:;=?@\[\\\]^_\'`|~]'
+    # aposattrcontentchar = (ur'\t|\r|\n|[\u0020-\u0025]|[\u0028-\u003b]|'
+    #                        ur'[\u003d-\u007a]|\u007c|[\u007e-\u007F]')
+    aposattrcontentchar = r'[A-Za-z]|\s|\d|[!"#$%()*+,\-./:;=?@\[\\\]^_`|~]'
+
+    # CHAR elements - fix the above elementcontentchar, quotattrcontentchar,
+    #                 aposattrcontentchar
+    # x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+
+    flags = re.DOTALL | re.MULTILINE | re.UNICODE
+
+    def punctuation_root_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        # transition to root always - don't pop off stack
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def operator_root_callback(lexer, match, ctx):
+        yield match.start(), Operator, match.group(1)
+        # transition to root always - don't pop off stack
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def popstate_tag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        ctx.stack.append(lexer.xquery_parse_state.pop())
+        ctx.pos = match.end()
+
+    def popstate_xmlcomment_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append(lexer.xquery_parse_state.pop())
+        ctx.pos = match.end()
+
+    def popstate_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        next_state = lexer.xquery_parse_state.pop()
+        if next_state == 'occurrenceindicator':
+            if re.match("[?*+]+", match.group(2)):
+                yield match.start(), Punctuation, match.group(2)
+                ctx.stack.append('operator')
+                ctx.pos = match.end()
+            else:
+                ctx.stack.append('operator')
+                ctx.pos = match.end(1)
+        else:
+            ctx.stack.append(next_state)
+            ctx.pos = match.end(1)
+
+    def popstate_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        # if we have run out of our state stack, pop whatever is on the pygments
+        # state stack
+        if len(lexer.xquery_parse_state) == 0:
+            ctx.stack.pop()
+        elif len(ctx.stack) > 1:
+            ctx.stack.append(lexer.xquery_parse_state.pop())
+        else:
+            # i don't know if i'll need this, but in case, default back to root
+            ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_element_content_starttag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        lexer.xquery_parse_state.append('element_content')
+        ctx.stack.append('start_tag')
+        ctx.pos = match.end()
+
+    def pushstate_cdata_section_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('cdata_section')
+        lexer.xquery_parse_state.append(ctx.state.pop)
+        ctx.pos = match.end()
+
+    def pushstate_starttag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        lexer.xquery_parse_state.append(ctx.state.pop)
+        ctx.stack.append('start_tag')
+        ctx.pos = match.end()
+
+    def pushstate_operator_order_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_map_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_validate(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_validate_withmode(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Keyword, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_processing_instruction_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('processing_instruction')
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_element_content_processing_instruction_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('processing_instruction')
+        lexer.xquery_parse_state.append('element_content')
+        ctx.pos = match.end()
+
+    def pushstate_element_content_cdata_section_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('cdata_section')
+        lexer.xquery_parse_state.append('element_content')
+        ctx.pos = match.end()
+
+    def pushstate_operator_cdata_section_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('cdata_section')
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_element_content_xmlcomment_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('xml_comment')
+        lexer.xquery_parse_state.append('element_content')
+        ctx.pos = match.end()
+
+    def pushstate_operator_xmlcomment_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('xml_comment')
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('kindtest')
+        ctx.stack.append('kindtest')
+        ctx.pos = match.end()
+
+    def pushstate_operator_kindtestforpi_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack.append('kindtestforpi')
+        ctx.pos = match.end()
+
+    def pushstate_operator_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack.append('kindtest')
+        ctx.pos = match.end()
+
+    def pushstate_occurrenceindicator_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('occurrenceindicator')
+        ctx.stack.append('kindtest')
+        ctx.pos = match.end()
+
+    def pushstate_operator_starttag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack.append('start_tag')
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_construct_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_root_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        cur_state = ctx.stack.pop()
+        lexer.xquery_parse_state.append(cur_state)
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_operator_attribute_callback(lexer, match, ctx):
+        yield match.start(), Name.Attribute, match.group(1)
+        ctx.stack.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Text, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    tokens = {
+        'comment': [
+            # xquery comments
+            (r'(:\))', Comment, '#pop'),
+            (r'(\(:)', Comment, '#push'),
+            (r'[^:)]', Comment),
+            (r'([^:)]|:|\))', Comment),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+        'operator': [
+            include('whitespace'),
+            (r'(\})', popstate_callback),
+            (r'\(:', Comment, 'comment'),
+
+            (r'(\{)', pushstate_root_callback),
+            (r'then|else|external|at|div|except', Keyword, 'root'),
+            (r'order by', Keyword, 'root'),
+            (r'group by', Keyword, 'root'),
+            (r'is|mod|order\s+by|stable\s+order\s+by', Keyword, 'root'),
+            (r'and|or', Operator.Word, 'root'),
+            (r'(eq|ge|gt|le|lt|ne|idiv|intersect|in)(?=\b)',
+             Operator.Word, 'root'),
+            (r'return|satisfies|to|union|where|count|preserve\s+strip',
+             Keyword, 'root'),
+            (r'(>=|>>|>|<=|<<|<|-|\*|!=|\+|\|\||\||:=|=|!)',
+             operator_root_callback),
+            (r'(::|:|;|\[|//|/|,)',
+             punctuation_root_callback),
+            (r'(castable|cast)(\s+)(as)\b',
+             bygroups(Keyword, Text, Keyword), 'singletype'),
+            (r'(instance)(\s+)(of)\b',
+             bygroups(Keyword, Text, Keyword), 'itemtype'),
+            (r'(treat)(\s+)(as)\b',
+             bygroups(Keyword, Text, Keyword), 'itemtype'),
+            (r'(case)(\s+)(' + stringdouble + ')',
+             bygroups(Keyword, Text, String.Double), 'itemtype'),
+            (r'(case)(\s+)(' + stringsingle + ')',
+             bygroups(Keyword, Text, String.Single), 'itemtype'),
+            (r'(case|as)\b', Keyword, 'itemtype'),
+            (r'(\))(\s*)(as)',
+             bygroups(Punctuation, Text, Keyword), 'itemtype'),
+            (r'\$', Name.Variable, 'varname'),
+            (r'(for|let|previous|next)(\s+)(\$)',
+             bygroups(Keyword, Text, Name.Variable), 'varname'),
+            (r'(for)(\s+)(tumbling|sliding)(\s+)(window)(\s+)(\$)',
+             bygroups(Keyword, Text, Keyword, Text, Keyword, Text, Name.Variable),
+             'varname'),
+            # (r'\)|\?|\]', Punctuation, '#push'),
+            (r'\)|\?|\]', Punctuation),
+            (r'(empty)(\s+)(greatest|least)', bygroups(Keyword, Text, Keyword)),
+            (r'ascending|descending|default', Keyword, '#push'),
+            (r'(allowing)(\s+)(empty)', bygroups(Keyword, Text, Keyword)),
+            (r'external', Keyword),
+            (r'(start|when|end)', Keyword, 'root'),
+            (r'(only)(\s+)(end)', bygroups(Keyword, Text, Keyword), 'root'),
+            (r'collation', Keyword, 'uritooperator'),
+
+            # eXist specific XQUF
+            (r'(into|following|preceding|with)', Keyword, 'root'),
+
+            # support for current context on rhs of Simple Map Operator
+            (r'\.', Operator),
+
+            # finally catch all string literals and stay in operator state
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+
+            (r'(catch)(\s*)', bygroups(Keyword, Text), 'root'),
+        ],
+        'uritooperator': [
+            (stringdouble, String.Double, '#pop'),
+            (stringsingle, String.Single, '#pop'),
+        ],
+        'namespacedecl': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'(at)(\s+)('+stringdouble+')', bygroups(Keyword, Text, String.Double)),
+            (r"(at)(\s+)("+stringsingle+')', bygroups(Keyword, Text, String.Single)),
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+            (r',', Punctuation),
+            (r'=', Operator),
+            (r';', Punctuation, 'root'),
+            (ncname, Name.Namespace),
+        ],
+        'namespacekeyword': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (stringdouble, String.Double, 'namespacedecl'),
+            (stringsingle, String.Single, 'namespacedecl'),
+            (r'inherit|no-inherit', Keyword, 'root'),
+            (r'namespace', Keyword, 'namespacedecl'),
+            (r'(default)(\s+)(element)', bygroups(Keyword, Text, Keyword)),
+            (r'preserve|no-preserve', Keyword),
+            (r',', Punctuation),
+        ],
+        'annotationname': [
+            (r'\(:', Comment, 'comment'),
+            (qname, Name.Decorator),
+            (r'(\()(' + stringdouble + ')', bygroups(Punctuation, String.Double)),
+            (r'(\()(' + stringsingle + ')', bygroups(Punctuation, String.Single)),
+            (r'(\,)(\s+)(' + stringdouble + ')',
+             bygroups(Punctuation, Text, String.Double)),
+            (r'(\,)(\s+)(' + stringsingle + ')',
+             bygroups(Punctuation, Text, String.Single)),
+            (r'\)', Punctuation),
+            (r'(\s+)(\%)', bygroups(Text, Name.Decorator), 'annotationname'),
+            (r'(\s+)(variable)(\s+)(\$)',
+             bygroups(Text, Keyword.Declaration, Text, Name.Variable), 'varname'),
+            (r'(\s+)(function)(\s+)',
+             bygroups(Text, Keyword.Declaration, Text), 'root')
+        ],
+        'varname': [
+            (r'\(:', Comment, 'comment'),
+            (r'(' + qname + ')(\()?', bygroups(Name, Punctuation), 'operator'),
+        ],
+        'singletype': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (ncname + r'(:\*)', Name.Variable, 'operator'),
+            (qname, Name.Variable, 'operator'),
+        ],
+        'itemtype': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'\$', Name.Variable, 'varname'),
+            (r'(void)(\s*)(\()(\s*)(\))',
+             bygroups(Keyword, Text, Punctuation, Text, Punctuation), 'operator'),
+            (r'(element|attribute|schema-element|schema-attribute|comment|text|'
+             r'node|binary|document-node|empty-sequence)(\s*)(\()',
+             pushstate_occurrenceindicator_kindtest_callback),
+            # Marklogic specific type?
+            (r'(processing-instruction)(\s*)(\()',
+             bygroups(Keyword, Text, Punctuation),
+             ('occurrenceindicator', 'kindtestforpi')),
+            (r'(item)(\s*)(\()(\s*)(\))(?=[*+?])',
+             bygroups(Keyword, Text, Punctuation, Text, Punctuation),
+             'occurrenceindicator'),
+            (r'(\(\#)(\s*)', bygroups(Punctuation, Text), 'pragma'),
+            (r';', Punctuation, '#pop'),
+            (r'then|else', Keyword, '#pop'),
+            (r'(at)(\s+)(' + stringdouble + ')',
+             bygroups(Keyword, Text, String.Double), 'namespacedecl'),
+            (r'(at)(\s+)(' + stringsingle + ')',
+             bygroups(Keyword, Text, String.Single), 'namespacedecl'),
+            (r'except|intersect|in|is|return|satisfies|to|union|where|count',
+             Keyword, 'root'),
+            (r'and|div|eq|ge|gt|le|lt|ne|idiv|mod|or', Operator.Word, 'root'),
+            (r':=|=|,|>=|>>|>|\[|\(|<=|<<|<|-|!=|\|\||\|', Operator, 'root'),
+            (r'external|at', Keyword, 'root'),
+            (r'(stable)(\s+)(order)(\s+)(by)',
+             bygroups(Keyword, Text, Keyword, Text, Keyword), 'root'),
+            (r'(castable|cast)(\s+)(as)',
+             bygroups(Keyword, Text, Keyword), 'singletype'),
+            (r'(treat)(\s+)(as)', bygroups(Keyword, Text, Keyword)),
+            (r'(instance)(\s+)(of)', bygroups(Keyword, Text, Keyword)),
+            (r'(case)(\s+)(' + stringdouble + ')',
+             bygroups(Keyword, Text, String.Double), 'itemtype'),
+            (r'(case)(\s+)(' + stringsingle + ')',
+             bygroups(Keyword, Text, String.Single), 'itemtype'),
+            (r'case|as', Keyword, 'itemtype'),
+            (r'(\))(\s*)(as)', bygroups(Operator, Text, Keyword), 'itemtype'),
+            (ncname + r':\*', Keyword.Type, 'operator'),
+            (r'(function|map|array)(\()', bygroups(Keyword.Type, Punctuation)),
+            (qname, Keyword.Type, 'occurrenceindicator'),
+        ],
+        'kindtest': [
+            (r'\(:', Comment, 'comment'),
+            (r'\{', Punctuation, 'root'),
+            (r'(\))([*+?]?)', popstate_kindtest_callback),
+            (r'\*', Name, 'closekindtest'),
+            (qname, Name, 'closekindtest'),
+            (r'(element|schema-element)(\s*)(\()', pushstate_kindtest_callback),
+        ],
+        'kindtestforpi': [
+            (r'\(:', Comment, 'comment'),
+            (r'\)', Punctuation, '#pop'),
+            (ncname, Name.Variable),
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+        ],
+        'closekindtest': [
+            (r'\(:', Comment, 'comment'),
+            (r'(\))', popstate_callback),
+            (r',', Punctuation),
+            (r'(\{)', pushstate_operator_root_callback),
+            (r'\?', Punctuation),
+        ],
+        'xml_comment': [
+            (r'(-->)', popstate_xmlcomment_callback),
+            (r'[^-]{1,2}', Literal),
+            (u'\\t|\\r|\\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|' +
+             unirange(0x10000, 0x10ffff), Literal),
+        ],
+        'processing_instruction': [
+            (r'\s+', Text, 'processing_instruction_content'),
+            (r'\?>', String.Doc, '#pop'),
+            (pitarget, Name),
+        ],
+        'processing_instruction_content': [
+            (r'\?>', String.Doc, '#pop'),
+            (u'\\t|\\r|\\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|' +
+             unirange(0x10000, 0x10ffff), Literal),
+        ],
+        'cdata_section': [
+            (r']]>', String.Doc, '#pop'),
+            (u'\\t|\\r|\\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|' +
+             unirange(0x10000, 0x10ffff), Literal),
+        ],
+        'start_tag': [
+            include('whitespace'),
+            (r'(/>)', popstate_tag_callback),
+            (r'>', Name.Tag, 'element_content'),
+            (r'"', Punctuation, 'quot_attribute_content'),
+            (r"'", Punctuation, 'apos_attribute_content'),
+            (r'=', Operator),
+            (qname, Name.Tag),
+        ],
+        'quot_attribute_content': [
+            (r'"', Punctuation, 'start_tag'),
+            (r'(\{)', pushstate_root_callback),
+            (r'""', Name.Attribute),
+            (quotattrcontentchar, Name.Attribute),
+            (entityref, Name.Attribute),
+            (charref, Name.Attribute),
+            (r'\{\{|\}\}', Name.Attribute),
+        ],
+        'apos_attribute_content': [
+            (r"'", Punctuation, 'start_tag'),
+            (r'\{', Punctuation, 'root'),
+            (r"''", Name.Attribute),
+            (aposattrcontentchar, Name.Attribute),
+            (entityref, Name.Attribute),
+            (charref, Name.Attribute),
+            (r'\{\{|\}\}', Name.Attribute),
+        ],
+        'element_content': [
+            (r'</', Name.Tag, 'end_tag'),
+            (r'(\{)', pushstate_root_callback),
+            (r'(<!--)', pushstate_element_content_xmlcomment_callback),
+            (r'(<\?)', pushstate_element_content_processing_instruction_callback),
+            (r'(<!\[CDATA\[)', pushstate_element_content_cdata_section_callback),
+            (r'(<)', pushstate_element_content_starttag_callback),
+            (elementcontentchar, Literal),
+            (entityref, Literal),
+            (charref, Literal),
+            (r'\{\{|\}\}', Literal),
+        ],
+        'end_tag': [
+            include('whitespace'),
+            (r'(>)', popstate_tag_callback),
+            (qname, Name.Tag),
+        ],
+        'xmlspace_decl': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'preserve|strip', Keyword, '#pop'),
+        ],
+        'declareordering': [
+            (r'\(:', Comment, 'comment'),
+            include('whitespace'),
+            (r'ordered|unordered', Keyword, '#pop'),
+        ],
+        'xqueryversion': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+            (r'encoding', Keyword),
+            (r';', Punctuation, '#pop'),
+        ],
+        'pragma': [
+            (qname, Name.Variable, 'pragmacontents'),
+        ],
+        'pragmacontents': [
+            (r'#\)', Punctuation, 'operator'),
+            (u'\\t|\\r|\\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|' +
+             unirange(0x10000, 0x10ffff), Literal),
+            (r'(\s+)', Text),
+        ],
+        'occurrenceindicator': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'\*|\?|\+', Operator, 'operator'),
+            (r':=', Operator, 'root'),
+            default('operator'),
+        ],
+        'option': [
+            include('whitespace'),
+            (qname, Name.Variable, '#pop'),
+        ],
+        'qname_braren': [
+            include('whitespace'),
+            (r'(\{)', pushstate_operator_root_callback),
+            (r'(\()', Punctuation, 'root'),
+        ],
+        'element_qname': [
+            (qname, Name.Variable, 'root'),
+        ],
+        'attribute_qname': [
+            (qname, Name.Variable, 'root'),
+        ],
+        'root': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+
+            # handle operator state
+            # order on numbers matters - handle most complex first
+            (r'\d+(\.\d*)?[eE][+-]?\d+', Number.Float, 'operator'),
+            (r'(\.\d+)[eE][+-]?\d+', Number.Float, 'operator'),
+            (r'(\.\d+|\d+\.\d*)', Number.Float, 'operator'),
+            (r'(\d+)', Number.Integer, 'operator'),
+            (r'(\.\.|\.|\))', Punctuation, 'operator'),
+            (r'(declare)(\s+)(construction)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'operator'),
+            (r'(declare)(\s+)(default)(\s+)(order)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration, Text, Keyword.Declaration), 'operator'),
+            (r'(declare)(\s+)(context)(\s+)(item)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration, Text, Keyword.Declaration), 'operator'),
+            (ncname + ':\*', Name, 'operator'),
+            ('\*:'+ncname, Name.Tag, 'operator'),
+            ('\*', Name.Tag, 'operator'),
+            (stringdouble, String.Double, 'operator'),
+            (stringsingle, String.Single, 'operator'),
+
+            (r'(\}|\])', popstate_callback),
+
+            # NAMESPACE DECL
+            (r'(declare)(\s+)(default)(\s+)(collation)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration, Text, Keyword.Declaration)),
+            (r'(module|declare)(\s+)(namespace)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'namespacedecl'),
+            (r'(declare)(\s+)(base-uri)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'namespacedecl'),
+
+            # NAMESPACE KEYWORD
+            (r'(declare)(\s+)(default)(\s+)(element|function)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration, Text, Keyword.Declaration), 'namespacekeyword'),
+            (r'(import)(\s+)(schema|module)',
+             bygroups(Keyword.Pseudo, Text, Keyword.Pseudo), 'namespacekeyword'),
+            (r'(declare)(\s+)(copy-namespaces)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'namespacekeyword'),
+
+            # VARNAMEs
+            (r'(for|let|some|every)(\s+)(\$)',
+             bygroups(Keyword, Text, Name.Variable), 'varname'),
+            (r'(for)(\s+)(tumbling|sliding)(\s+)(window)(\s+)(\$)',
+             bygroups(Keyword, Text, Keyword, Text, Keyword, Text, Name.Variable), 'varname'),
+            (r'\$', Name.Variable, 'varname'),
+            (r'(declare)(\s+)(variable)(\s+)(\$)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration, Text, Name.Variable), 'varname'),
+
+            # ANNOTATED GLOBAL VARIABLES AND FUNCTIONS
+            (r'(declare)(\s+)(\%)', bygroups(Keyword.Declaration, Text, Name.Decorator), 'annotationname'),
+
+            # ITEMTYPE
+            (r'(\))(\s+)(as)', bygroups(Operator, Text, Keyword), 'itemtype'),
+
+            (r'(element|attribute|schema-element|schema-attribute|comment|'
+             r'text|node|document-node|empty-sequence)(\s+)(\()',
+             pushstate_operator_kindtest_callback),
+
+            (r'(processing-instruction)(\s+)(\()',
+             pushstate_operator_kindtestforpi_callback),
+
+            (r'(<!--)', pushstate_operator_xmlcomment_callback),
+
+            (r'(<\?)', pushstate_operator_processing_instruction_callback),
+
+            (r'(<!\[CDATA\[)', pushstate_operator_cdata_section_callback),
+
+            # (r'</', Name.Tag, 'end_tag'),
+            (r'(<)', pushstate_operator_starttag_callback),
+
+            (r'(declare)(\s+)(boundary-space)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'xmlspace_decl'),
+
+            (r'(validate)(\s+)(lax|strict)',
+             pushstate_operator_root_validate_withmode),
+            (r'(validate)(\s*)(\{)', pushstate_operator_root_validate),
+            (r'(typeswitch)(\s*)(\()', bygroups(Keyword, Text, Punctuation)),
+            (r'(switch)(\s*)(\()', bygroups(Keyword, Text, Punctuation)),
+            (r'(element|attribute|namespace)(\s*)(\{)',
+             pushstate_operator_root_construct_callback),
+
+            (r'(document|text|processing-instruction|comment)(\s*)(\{)',
+             pushstate_operator_root_construct_callback),
+            # ATTRIBUTE
+            (r'(attribute)(\s+)(?=' + qname + r')',
+             bygroups(Keyword, Text), 'attribute_qname'),
+            # ELEMENT
+            (r'(element)(\s+)(?=' + qname + r')',
+             bygroups(Keyword, Text), 'element_qname'),
+            # PROCESSING_INSTRUCTION
+            (r'(processing-instruction|namespace)(\s+)(' + ncname + r')(\s*)(\{)',
+             bygroups(Keyword, Text, Name.Variable, Text, Punctuation),
+             'operator'),
+
+            (r'(declare|define)(\s+)(function)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration)),
+
+            (r'(\{|\[)', pushstate_operator_root_callback),
+
+            (r'(unordered|ordered)(\s*)(\{)',
+             pushstate_operator_order_callback),
+
+            (r'(map|array)(\s*)(\{)',
+             pushstate_operator_map_callback),
+
+            (r'(declare)(\s+)(ordering)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'declareordering'),
+
+            (r'(xquery)(\s+)(version)',
+             bygroups(Keyword.Pseudo, Text, Keyword.Pseudo), 'xqueryversion'),
+
+            (r'(\(#)(\s*)', bygroups(Punctuation, Text), 'pragma'),
+
+            # sometimes return can occur in root state
+            (r'return', Keyword),
+
+            (r'(declare)(\s+)(option)', bygroups(Keyword.Declaration, Text, Keyword.Declaration),
+             'option'),
+
+            # URI LITERALS - single and double quoted
+            (r'(at)(\s+)('+stringdouble+')', String.Double, 'namespacedecl'),
+            (r'(at)(\s+)('+stringsingle+')', String.Single, 'namespacedecl'),
+
+            (r'(ancestor-or-self|ancestor|attribute|child|descendant-or-self)(::)',
+             bygroups(Keyword, Punctuation)),
+            (r'(descendant|following-sibling|following|parent|preceding-sibling'
+             r'|preceding|self)(::)', bygroups(Keyword, Punctuation)),
+
+            (r'(if)(\s*)(\()', bygroups(Keyword, Text, Punctuation)),
+
+            (r'then|else', Keyword),
+
+            # eXist specific XQUF
+            (r'(update)(\s*)(insert|delete|replace|value|rename)', bygroups(Keyword, Text, Keyword)),
+            (r'(into|following|preceding|with)', Keyword),
+
+            # Marklogic specific
+            (r'(try)(\s*)', bygroups(Keyword, Text), 'root'),
+            (r'(catch)(\s*)(\()(\$)',
+             bygroups(Keyword, Text, Punctuation, Name.Variable), 'varname'),
+
+
+            (r'(@'+qname+')', Name.Attribute, 'operator'),
+            (r'(@'+ncname+')', Name.Attribute, 'operator'),
+            (r'@\*:'+ncname, Name.Attribute, 'operator'),
+            (r'@\*', Name.Attribute, 'operator'),
+            (r'(@)', Name.Attribute, 'operator'),
+
+            (r'//|/|\+|-|;|,|\(|\)', Punctuation),
+
+            # STANDALONE QNAMES
+            (qname + r'(?=\s*\{)', Name.Tag, 'qname_braren'),
+            (qname + r'(?=\s*\([^:])', Name.Function, 'qname_braren'),
+            (r'(' + qname + ')(#)([0-9]+)', bygroups(Name.Function, Keyword.Type, Number.Integer)),
+            (qname, Name.Tag, 'operator'),
+        ]
+    }
+
+
+class QmlLexer(RegexLexer):
+    """
+    For QML files. See http://doc.qt.digia.com/4.7/qdeclarativeintroduction.html.
+
+    .. versionadded:: 1.6
+    """
+
+    # QML is based on javascript, so much of this is taken from the
+    # JavascriptLexer above.
+
+    name = 'QML'
+    aliases = ['qml', 'qbs']
+    filenames = ['*.qml', '*.qbs']
+    mimetypes = ['application/x-qml', 'application/x-qt.qbs+qml']
+
+    # pasted from JavascriptLexer, with some additions
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'<!--', Comment),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+
+            # QML insertions
+            (r'\bid\s*:\s*[A-Za-z][\w.]*', Keyword.Declaration,
+             'slashstartsregex'),
+            (r'\b[A-Za-z][\w.]*\s*:', Keyword, 'slashstartsregex'),
+
+            # the rest from JavascriptLexer
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'this)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(abstract|boolean|byte|char|class|const|debugger|double|enum|export|'
+             r'extends|final|float|goto|implements|import|int|interface|long|native|'
+             r'package|private|protected|public|short|static|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Reserved),
+            (r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'Error|eval|isFinite|isNaN|parseFloat|parseInt|document|this|'
+             r'window)\b', Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+        ]
+    }
+
+
+class CirruLexer(RegexLexer):
+    """
+    Syntax rules of Cirru can be found at:
+    http://cirru.org/
+
+    * using ``()`` for expressions, but restricted in a same line
+    * using ``""`` for strings, with ``\`` for escaping chars
+    * using ``$`` as folding operator
+    * using ``,`` as unfolding operator
+    * using indentations for nested blocks
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Cirru'
+    aliases = ['cirru']
+    filenames = ['*.cirru']
+    mimetypes = ['text/x-cirru']
+    flags = re.MULTILINE
+
+    tokens = {
+        'string': [
+            (r'[^"\\\n]', String),
+            (r'\\', String.Escape, 'escape'),
+            (r'"', String, '#pop'),
+        ],
+        'escape': [
+            (r'.', String.Escape, '#pop'),
+        ],
+        'function': [
+            (r'\,', Operator, '#pop'),
+            (r'[^\s"()]+', Name.Function, '#pop'),
+            (r'\)', Operator, '#pop'),
+            (r'(?=\n)', Text, '#pop'),
+            (r'\(', Operator, '#push'),
+            (r'"', String, ('#pop', 'string')),
+            (r'[ ]+', Text.Whitespace),
+        ],
+        'line': [
+            (r'(?<!\w)\$(?!\w)', Operator, 'function'),
+            (r'\(', Operator, 'function'),
+            (r'\)', Operator),
+            (r'\n', Text, '#pop'),
+            (r'"', String, 'string'),
+            (r'[ ]+', Text.Whitespace),
+            (r'[+-]?[\d.]+\b', Number),
+            (r'[^\s"()]+', Name.Variable)
+        ],
+        'root': [
+            (r'^\n+', Text.Whitespace),
+            default(('line', 'function')),
+        ]
+    }
+
+
+class SlimLexer(ExtendedRegexLexer):
+    """
+    For Slim markup.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Slim'
+    aliases = ['slim']
+    filenames = ['*.slim']
+    mimetypes = ['text/x-slim']
+
+    flags = re.IGNORECASE
+    _dot = r'(?: \|\n(?=.* \|)|.)'
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'([ \t]*==?)(.*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             'root'),
+            (r'[ \t]+[\w:-]+(?==)', Name.Attribute, 'html-attributes'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'[\w:-]+:[ \t]*\n', Text, 'plain'),
+            (r'(-)(.*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             '#pop'),
+            (r'\|' + _dot + r'*\n', _starts_block(Text, 'plain'), '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment.Preproc, 'slim-comment-block'), '#pop'),
+            (r'[\w:-]+', Name.Tag, 'tag'),
+            include('eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            (r'[ \t]+\n', Punctuation, '#pop:2'),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(.*?)(\})',
+             bygroups(String.Interpol, using(RubyLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'=', Punctuation),
+            (r'"[^"]+"', using(RubyLexer), 'tag'),
+            (r'\'[^\']+\'', using(RubyLexer), 'tag'),
+            (r'\w+', Text, 'tag'),
+        ],
+
+        'slim-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nit.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nit.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nit.py	(revision 1126)
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.nit
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Nit language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['NitLexer']
+
+
+class NitLexer(RegexLexer):
+    """
+    For `nit <http://nitlanguage.org>`_ source.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Nit'
+    aliases = ['nit']
+    filenames = ['*.nit']
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment.Single),
+            (words((
+                'package', 'module', 'import', 'class', 'abstract', 'interface',
+                'universal', 'enum', 'end', 'fun', 'type', 'init', 'redef',
+                'isa', 'do', 'readable', 'writable', 'var', 'intern', 'extern',
+                'public', 'protected', 'private', 'intrude', 'if', 'then',
+                'else', 'while', 'loop', 'for', 'in', 'and', 'or', 'not',
+                'implies', 'return', 'continue', 'break', 'abort', 'assert',
+                'new', 'is', 'once', 'super', 'self', 'true', 'false', 'nullable',
+                'null', 'as', 'isset', 'label', '__debug__'), suffix=r'(?=[\r\n\t( ])'),
+             Keyword),
+            (r'[A-Z]\w*', Name.Class),
+            (r'"""(([^\'\\]|\\.)|\\r|\\n)*((\{\{?)?(""?\{\{?)*""""*)', String),  # Simple long string
+            (r'\'\'\'(((\\.|[^\'\\])|\\r|\\n)|\'((\\.|[^\'\\])|\\r|\\n)|'
+             r'\'\'((\\.|[^\'\\])|\\r|\\n))*\'\'\'', String),  # Simple long string alt
+            (r'"""(([^\'\\]|\\.)|\\r|\\n)*((""?)?(\{\{?""?)*\{\{\{\{*)', String),  # Start long string
+            (r'\}\}\}(((\\.|[^\'\\])|\\r|\\n))*(""?)?(\{\{?""?)*\{\{\{\{*', String),  # Mid long string
+            (r'\}\}\}(((\\.|[^\'\\])|\\r|\\n))*(\{\{?)?(""?\{\{?)*""""*', String),  # End long string
+            (r'"(\\.|([^"}{\\]))*"', String),  # Simple String
+            (r'"(\\.|([^"}{\\]))*\{', String),  # Start string
+            (r'\}(\\.|([^"}{\\]))*\{', String),  # Mid String
+            (r'\}(\\.|([^"}{\\]))*"', String),  # End String
+            (r'(\'[^\'\\]\')|(\'\\.\')', String.Char),
+            (r'[0-9]+', Number.Integer),
+            (r'[0-9]*.[0-9]+', Number.Float),
+            (r'0(x|X)[0-9A-Fa-f]+', Number.Hex),
+            (r'[a-z]\w*', Name),
+            (r'_\w+', Name.Variable.Instance),
+            (r'==|!=|<==>|>=|>>|>|<=|<<|<|\+|-|=|/|\*|%|\+=|-=|!|@', Operator),
+            (r'\(|\)|\[|\]|,|\.\.\.|\.\.|\.|::|:', Punctuation),
+            (r'`\{[^`]*`\}', Text),  # Extern blocks won't be Lexed by Nit
+            (r'[\r\n\t ]+', Text),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/__init__.py	(revision 1126)
@@ -0,0 +1,329 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers
+    ~~~~~~~~~~~~~~~
+
+    Pygments lexers.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import sys
+import types
+import fnmatch
+from os.path import basename
+
+from pygments.lexers._mapping import LEXERS
+from pygments.modeline import get_filetype_from_buffer
+from pygments.plugin import find_plugin_lexers
+from pygments.util import ClassNotFound, itervalues, guess_decode
+
+
+__all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class',
+           'guess_lexer', 'load_lexer_from_file'] + list(LEXERS)
+
+_lexer_cache = {}
+_pattern_cache = {}
+
+
+def _fn_matches(fn, glob):
+    """Return whether the supplied file name fn matches pattern filename."""
+    if glob not in _pattern_cache:
+        pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
+        return pattern.match(fn)
+    return _pattern_cache[glob].match(fn)
+
+
+def _load_lexers(module_name):
+    """Load a lexer (and all others in the module too)."""
+    mod = __import__(module_name, None, None, ['__all__'])
+    for lexer_name in mod.__all__:
+        cls = getattr(mod, lexer_name)
+        _lexer_cache[cls.name] = cls
+
+
+def get_all_lexers():
+    """Return a generator of tuples in the form ``(name, aliases,
+    filenames, mimetypes)`` of all know lexers.
+    """
+    for item in itervalues(LEXERS):
+        yield item[1:]
+    for lexer in find_plugin_lexers():
+        yield lexer.name, lexer.aliases, lexer.filenames, lexer.mimetypes
+
+
+def find_lexer_class(name):
+    """Lookup a lexer class by name.
+
+    Return None if not found.
+    """
+    if name in _lexer_cache:
+        return _lexer_cache[name]
+    # lookup builtin lexers
+    for module_name, lname, aliases, _, _ in itervalues(LEXERS):
+        if name == lname:
+            _load_lexers(module_name)
+            return _lexer_cache[name]
+    # continue with lexers from setuptools entrypoints
+    for cls in find_plugin_lexers():
+        if cls.name == name:
+            return cls
+
+
+def find_lexer_class_by_name(_alias):
+    """Lookup a lexer class by alias.
+
+    Like `get_lexer_by_name`, but does not instantiate the class.
+
+    .. versionadded:: 2.2
+    """
+    if not _alias:
+        raise ClassNotFound('no lexer for alias %r found' % _alias)
+    # lookup builtin lexers
+    for module_name, name, aliases, _, _ in itervalues(LEXERS):
+        if _alias.lower() in aliases:
+            if name not in _lexer_cache:
+                _load_lexers(module_name)
+            return _lexer_cache[name]
+    # continue with lexers from setuptools entrypoints
+    for cls in find_plugin_lexers():
+        if _alias.lower() in cls.aliases:
+            return cls
+    raise ClassNotFound('no lexer for alias %r found' % _alias)
+
+
+def get_lexer_by_name(_alias, **options):
+    """Get a lexer by an alias.
+
+    Raises ClassNotFound if not found.
+    """
+    if not _alias:
+        raise ClassNotFound('no lexer for alias %r found' % _alias)
+
+    # lookup builtin lexers
+    for module_name, name, aliases, _, _ in itervalues(LEXERS):
+        if _alias.lower() in aliases:
+            if name not in _lexer_cache:
+                _load_lexers(module_name)
+            return _lexer_cache[name](**options)
+    # continue with lexers from setuptools entrypoints
+    for cls in find_plugin_lexers():
+        if _alias.lower() in cls.aliases:
+            return cls(**options)
+    raise ClassNotFound('no lexer for alias %r found' % _alias)
+
+
+def load_lexer_from_file(filename, lexername="CustomLexer", **options):
+    """Load a lexer from a file.
+
+    This method expects a file located relative to the current working
+    directory, which contains a Lexer class. By default, it expects the
+    Lexer to be name CustomLexer; you can specify your own class name
+    as the second argument to this function.
+
+    Users should be very careful with the input, because this method
+    is equivalent to running eval on the input file.
+
+    Raises ClassNotFound if there are any problems importing the Lexer.
+
+    .. versionadded:: 2.2
+    """
+    try:
+        # This empty dict will contain the namespace for the exec'd file
+        custom_namespace = {}
+        exec(open(filename, 'rb').read(), custom_namespace)
+        # Retrieve the class `lexername` from that namespace
+        if lexername not in custom_namespace:
+            raise ClassNotFound('no valid %s class found in %s' %
+                                (lexername, filename))
+        lexer_class = custom_namespace[lexername]
+        # And finally instantiate it with the options
+        return lexer_class(**options)
+    except IOError as err:
+        raise ClassNotFound('cannot read %s' % filename)
+    except ClassNotFound as err:
+        raise
+    except Exception as err:
+        raise ClassNotFound('error when loading custom lexer: %s' % err)
+
+
+def find_lexer_class_for_filename(_fn, code=None):
+    """Get a lexer for a filename.
+
+    If multiple lexers match the filename pattern, use ``analyse_text()`` to
+    figure out which one is more appropriate.
+
+    Returns None if not found.
+    """
+    matches = []
+    fn = basename(_fn)
+    for modname, name, _, filenames, _ in itervalues(LEXERS):
+        for filename in filenames:
+            if _fn_matches(fn, filename):
+                if name not in _lexer_cache:
+                    _load_lexers(modname)
+                matches.append((_lexer_cache[name], filename))
+    for cls in find_plugin_lexers():
+        for filename in cls.filenames:
+            if _fn_matches(fn, filename):
+                matches.append((cls, filename))
+
+    if sys.version_info > (3,) and isinstance(code, bytes):
+        # decode it, since all analyse_text functions expect unicode
+        code = guess_decode(code)
+
+    def get_rating(info):
+        cls, filename = info
+        # explicit patterns get a bonus
+        bonus = '*' not in filename and 0.5 or 0
+        # The class _always_ defines analyse_text because it's included in
+        # the Lexer class.  The default implementation returns None which
+        # gets turned into 0.0.  Run scripts/detect_missing_analyse_text.py
+        # to find lexers which need it overridden.
+        if code:
+            return cls.analyse_text(code) + bonus, cls.__name__
+        return cls.priority + bonus, cls.__name__
+
+    if matches:
+        matches.sort(key=get_rating)
+        # print "Possible lexers, after sort:", matches
+        return matches[-1][0]
+
+
+def get_lexer_for_filename(_fn, code=None, **options):
+    """Get a lexer for a filename.
+
+    If multiple lexers match the filename pattern, use ``analyse_text()`` to
+    figure out which one is more appropriate.
+
+    Raises ClassNotFound if not found.
+    """
+    res = find_lexer_class_for_filename(_fn, code)
+    if not res:
+        raise ClassNotFound('no lexer for filename %r found' % _fn)
+    return res(**options)
+
+
+def get_lexer_for_mimetype(_mime, **options):
+    """Get a lexer for a mimetype.
+
+    Raises ClassNotFound if not found.
+    """
+    for modname, name, _, _, mimetypes in itervalues(LEXERS):
+        if _mime in mimetypes:
+            if name not in _lexer_cache:
+                _load_lexers(modname)
+            return _lexer_cache[name](**options)
+    for cls in find_plugin_lexers():
+        if _mime in cls.mimetypes:
+            return cls(**options)
+    raise ClassNotFound('no lexer for mimetype %r found' % _mime)
+
+
+def _iter_lexerclasses(plugins=True):
+    """Return an iterator over all lexer classes."""
+    for key in sorted(LEXERS):
+        module_name, name = LEXERS[key][:2]
+        if name not in _lexer_cache:
+            _load_lexers(module_name)
+        yield _lexer_cache[name]
+    if plugins:
+        for lexer in find_plugin_lexers():
+            yield lexer
+
+
+def guess_lexer_for_filename(_fn, _text, **options):
+    """
+    Lookup all lexers that handle those filenames primary (``filenames``)
+    or secondary (``alias_filenames``). Then run a text analysis for those
+    lexers and choose the best result.
+
+    usage::
+
+        >>> from pygments.lexers import guess_lexer_for_filename
+        >>> guess_lexer_for_filename('hello.html', '<%= @foo %>')
+        <pygments.lexers.templates.RhtmlLexer object at 0xb7d2f32c>
+        >>> guess_lexer_for_filename('hello.html', '<h1>{{ title|e }}</h1>')
+        <pygments.lexers.templates.HtmlDjangoLexer object at 0xb7d2f2ac>
+        >>> guess_lexer_for_filename('style.css', 'a { color: <?= $link ?> }')
+        <pygments.lexers.templates.CssPhpLexer object at 0xb7ba518c>
+    """
+    fn = basename(_fn)
+    primary = {}
+    matching_lexers = set()
+    for lexer in _iter_lexerclasses():
+        for filename in lexer.filenames:
+            if _fn_matches(fn, filename):
+                matching_lexers.add(lexer)
+                primary[lexer] = True
+        for filename in lexer.alias_filenames:
+            if _fn_matches(fn, filename):
+                matching_lexers.add(lexer)
+                primary[lexer] = False
+    if not matching_lexers:
+        raise ClassNotFound('no lexer for filename %r found' % fn)
+    if len(matching_lexers) == 1:
+        return matching_lexers.pop()(**options)
+    result = []
+    for lexer in matching_lexers:
+        rv = lexer.analyse_text(_text)
+        if rv == 1.0:
+            return lexer(**options)
+        result.append((rv, lexer))
+
+    def type_sort(t):
+        # sort by:
+        # - analyse score
+        # - is primary filename pattern?
+        # - priority
+        # - last resort: class name
+        return (t[0], primary[t[1]], t[1].priority, t[1].__name__)
+    result.sort(key=type_sort)
+
+    return result[-1][1](**options)
+
+
+def guess_lexer(_text, **options):
+    """Guess a lexer by strong distinctions in the text (eg, shebang)."""
+
+    # try to get a vim modeline first
+    ft = get_filetype_from_buffer(_text)
+
+    if ft is not None:
+        try:
+            return get_lexer_by_name(ft, **options)
+        except ClassNotFound:
+            pass
+
+    best_lexer = [0.0, None]
+    for lexer in _iter_lexerclasses():
+        rv = lexer.analyse_text(_text)
+        if rv == 1.0:
+            return lexer(**options)
+        if rv > best_lexer[0]:
+            best_lexer[:] = (rv, lexer)
+    if not best_lexer[0] or best_lexer[1] is None:
+        raise ClassNotFound('no lexer matching the text found')
+    return best_lexer[1](**options)
+
+
+class _automodule(types.ModuleType):
+    """Automatically import lexers."""
+
+    def __getattr__(self, name):
+        info = LEXERS.get(name)
+        if info:
+            _load_lexers(info[0])
+            cls = _lexer_cache[info[1]]
+            setattr(self, name, cls)
+            return cls
+        raise AttributeError(name)
+
+
+oldmod = sys.modules[__name__]
+newmod = _automodule(__name__)
+newmod.__dict__.update(oldmod.__dict__)
+sys.modules[__name__] = newmod
+del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/whiley.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/whiley.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/whiley.py	(revision 1126)
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.whiley
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Whiley language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+
+__all__ = ['WhileyLexer']
+
+
+class WhileyLexer(RegexLexer):
+    """
+    Lexer for the Whiley programming language.
+
+    .. versionadded:: 2.2
+    """
+    name = 'Whiley'
+    filenames = ['*.whiley']
+    aliases = ['whiley']
+    mimetypes = ['text/x-whiley']
+
+    # See the language specification:
+    # http://whiley.org/download/WhileyLanguageSpec.pdf
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'\s+', Text),
+
+            # Comments
+            (r'//.*', Comment.Single),
+            # don't parse empty comment as doc comment
+            (r'/\*\*/', Comment.Multiline),
+            (r'(?s)/\*\*.*?\*/', String.Doc),
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+
+            # Keywords
+            (words((
+                'if', 'else', 'while', 'for', 'do', 'return',
+                'switch', 'case', 'default', 'break', 'continue',
+                'requires', 'ensures', 'where', 'assert', 'assume',
+                'all', 'no', 'some', 'in', 'is', 'new',
+                'throw', 'try', 'catch', 'debug', 'skip', 'fail',
+                'finite', 'total'), suffix=r'\b'), Keyword.Reserved),
+            (words((
+                'function', 'method', 'public', 'private', 'protected',
+                'export', 'native'), suffix=r'\b'), Keyword.Declaration),
+            # "constant" & "type" are not keywords unless used in declarations
+            (r'(constant|type)(\s+)([a-zA-Z_]\w*)(\s+)(is)\b',
+             bygroups(Keyword.Declaration, Text, Name, Text, Keyword.Reserved)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(bool|byte|int|real|any|void)\b', Keyword.Type),
+            # "from" is not a keyword unless used with import
+            (r'(import)(\s+)(\*)([^\S\n]+)(from)\b',
+             bygroups(Keyword.Namespace, Text, Punctuation, Text, Keyword.Namespace)),
+            (r'(import)(\s+)([a-zA-Z_]\w*)([^\S\n]+)(from)\b',
+             bygroups(Keyword.Namespace, Text, Name, Text, Keyword.Namespace)),
+            (r'(package|import)\b', Keyword.Namespace),
+
+            # standard library: https://github.com/Whiley/WhileyLibs/
+            (words((
+                # types defined in whiley.lang.Int
+                'i8', 'i16', 'i32', 'i64',
+                'u8', 'u16', 'u32', 'u64',
+                'uint', 'nat',
+
+                # whiley.lang.Any
+                'toString'), suffix=r'\b'), Name.Builtin),
+
+            # byte literal
+            (r'[01]+b', Number.Bin),
+
+            # decimal literal
+            (r'[0-9]+\.[0-9]+', Number.Float),
+            # match "1." but not ranges like "3..5"
+            (r'[0-9]+\.(?!\.)', Number.Float),
+
+            # integer literal
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+
+            # character literal
+            (r"""'[^\\]'""", String.Char),
+            (r"""(')(\\['"\\btnfr])(')""",
+             bygroups(String.Char, String.Escape, String.Char)),
+
+            # string literal
+            (r'"', String, 'string'),
+
+            # operators and punctuation
+            (r'[{}()\[\],.;]', Punctuation),
+            (u'[+\\-*/%&|<>^!~@=:?'
+             # unicode operators
+             u'\u2200\u2203\u2205\u2282\u2286\u2283\u2287'
+             u'\u222A\u2229\u2264\u2265\u2208\u2227\u2228'
+             u']', Operator),
+
+            # identifier
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\[btnfr]', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\.', String),
+            (r'[^\\"]+', String),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rebol.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rebol.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rebol.py	(revision 1126)
@@ -0,0 +1,431 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.rebol
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the REBOL and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Generic, Whitespace
+
+__all__ = ['RebolLexer', 'RedLexer']
+
+
+class RebolLexer(RegexLexer):
+    """
+    A `REBOL <http://www.rebol.com/>`_ lexer.
+
+    .. versionadded:: 1.1
+    """
+    name = 'REBOL'
+    aliases = ['rebol']
+    filenames = ['*.r', '*.r3', '*.reb']
+    mimetypes = ['text/x-rebol']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    escape_re = r'(?:\^\([0-9a-f]{1,4}\)*)'
+
+    def word_callback(lexer, match):
+        word = match.group()
+
+        if re.match(".*:$", word):
+            yield match.start(), Generic.Subheading, word
+        elif re.match(
+            r'(native|alias|all|any|as-string|as-binary|bind|bound\?|case|'
+            r'catch|checksum|comment|debase|dehex|exclude|difference|disarm|'
+            r'either|else|enbase|foreach|remove-each|form|free|get|get-env|if|'
+            r'in|intersect|loop|minimum-of|maximum-of|mold|new-line|'
+            r'new-line\?|not|now|prin|print|reduce|compose|construct|repeat|'
+            r'reverse|save|script\?|set|shift|switch|throw|to-hex|trace|try|'
+            r'type\?|union|unique|unless|unprotect|unset|until|use|value\?|'
+            r'while|compress|decompress|secure|open|close|read|read-io|'
+            r'write-io|write|update|query|wait|input\?|exp|log-10|log-2|'
+            r'log-e|square-root|cosine|sine|tangent|arccosine|arcsine|'
+            r'arctangent|protect|lowercase|uppercase|entab|detab|connected\?|'
+            r'browse|launch|stats|get-modes|set-modes|to-local-file|'
+            r'to-rebol-file|encloak|decloak|create-link|do-browser|bind\?|'
+            r'hide|draw|show|size-text|textinfo|offset-to-caret|'
+            r'caret-to-offset|local-request-file|rgb-to-hsv|hsv-to-rgb|'
+            r'crypt-strength\?|dh-make-key|dh-generate-key|dh-compute-key|'
+            r'dsa-make-key|dsa-generate-key|dsa-make-signature|'
+            r'dsa-verify-signature|rsa-make-key|rsa-generate-key|'
+            r'rsa-encrypt)$', word):
+            yield match.start(), Name.Builtin, word
+        elif re.match(
+            r'(add|subtract|multiply|divide|remainder|power|and~|or~|xor~|'
+            r'minimum|maximum|negate|complement|absolute|random|head|tail|'
+            r'next|back|skip|at|pick|first|second|third|fourth|fifth|sixth|'
+            r'seventh|eighth|ninth|tenth|last|path|find|select|make|to|copy\*|'
+            r'insert|remove|change|poke|clear|trim|sort|min|max|abs|cp|'
+            r'copy)$', word):
+            yield match.start(), Name.Function, word
+        elif re.match(
+            r'(error|source|input|license|help|install|echo|Usage|with|func|'
+            r'throw-on-error|function|does|has|context|probe|\?\?|as-pair|'
+            r'mod|modulo|round|repend|about|set-net|append|join|rejoin|reform|'
+            r'remold|charset|array|replace|move|extract|forskip|forall|alter|'
+            r'first+|also|take|for|forever|dispatch|attempt|what-dir|'
+            r'change-dir|clean-path|list-dir|dirize|rename|split-path|delete|'
+            r'make-dir|delete-dir|in-dir|confirm|dump-obj|upgrade|what|'
+            r'build-tag|process-source|build-markup|decode-cgi|read-cgi|'
+            r'write-user|save-user|set-user-name|protect-system|parse-xml|'
+            r'cvs-date|cvs-version|do-boot|get-net-info|desktop|layout|'
+            r'scroll-para|get-face|alert|set-face|uninstall|unfocus|'
+            r'request-dir|center-face|do-events|net-error|decode-url|'
+            r'parse-header|parse-header-date|parse-email-addrs|import-email|'
+            r'send|build-attach-body|resend|show-popup|hide-popup|open-events|'
+            r'find-key-face|do-face|viewtop|confine|find-window|'
+            r'insert-event-func|remove-event-func|inform|dump-pane|dump-face|'
+            r'flag-face|deflag-face|clear-fields|read-net|vbug|path-thru|'
+            r'read-thru|load-thru|do-thru|launch-thru|load-image|'
+            r'request-download|do-face-alt|set-font|set-para|get-style|'
+            r'set-style|make-face|stylize|choose|hilight-text|hilight-all|'
+            r'unlight-text|focus|scroll-drag|clear-face|reset-face|scroll-face|'
+            r'resize-face|load-stock|load-stock-block|notify|request|flash|'
+            r'request-color|request-pass|request-text|request-list|'
+            r'request-date|request-file|dbug|editor|link-relative-path|'
+            r'emailer|parse-error)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match(
+            r'(halt|quit|do|load|q|recycle|call|run|ask|parse|view|unview|'
+            r'return|exit|break)$', word):
+            yield match.start(), Name.Exception, word
+        elif re.match('REBOL$', word):
+            yield match.start(), Generic.Heading, word
+        elif re.match("to-.*", word):
+            yield match.start(), Keyword, word
+        elif re.match('(\+|-|\*|/|//|\*\*|and|or|xor|=\?|=|==|<>|<|>|<=|>=)$',
+                      word):
+            yield match.start(), Operator, word
+        elif re.match(".*\?$", word):
+            yield match.start(), Keyword, word
+        elif re.match(".*\!$", word):
+            yield match.start(), Keyword.Type, word
+        elif re.match("'.*", word):
+            yield match.start(), Name.Variable.Instance, word  # lit-word
+        elif re.match("#.*", word):
+            yield match.start(), Name.Label, word  # issue
+        elif re.match("%.*", word):
+            yield match.start(), Name.Decorator, word  # file
+        else:
+            yield match.start(), Name.Variable, word
+
+    tokens = {
+        'root': [
+            (r'[^R]+', Comment),
+            (r'REBOL\s+\[', Generic.Strong, 'script'),
+            (r'R', Comment)
+        ],
+        'script': [
+            (r'\s+', Text),
+            (r'#"', String.Char, 'char'),
+            (r'#\{[0-9a-f]*\}', Number.Hex),
+            (r'2#\{', Number.Hex, 'bin2'),
+            (r'64#\{[0-9a-z+/=\s]*\}', Number.Hex),
+            (r'"', String, 'string'),
+            (r'\{', String, 'string2'),
+            (r';#+.*\n', Comment.Special),
+            (r';\*+.*\n', Comment.Preproc),
+            (r';.*\n', Comment),
+            (r'%"', Name.Decorator, 'stringFile'),
+            (r'%[^(^{")\s\[\]]+', Name.Decorator),
+            (r'[+-]?([a-z]{1,3})?\$\d+(\.\d+)?', Number.Float),  # money
+            (r'[+-]?\d+\:\d+(\:\d+)?(\.\d+)?', String.Other),    # time
+            (r'\d+[\-/][0-9a-z]+[\-/]\d+(\/\d+\:\d+((\:\d+)?'
+             r'([.\d+]?([+-]?\d+:\d+)?)?)?)?', String.Other),   # date
+            (r'\d+(\.\d+)+\.\d+', Keyword.Constant),             # tuple
+            (r'\d+X\d+', Keyword.Constant),                   # pair
+            (r'[+-]?\d+(\'\d+)?([.,]\d*)?E[+-]?\d+', Number.Float),
+            (r'[+-]?\d+(\'\d+)?[.,]\d*', Number.Float),
+            (r'[+-]?\d+(\'\d+)?', Number),
+            (r'[\[\]()]', Generic.Strong),
+            (r'[a-z]+[^(^{"\s:)]*://[^(^{"\s)]*', Name.Decorator),  # url
+            (r'mailto:[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),  # url
+            (r'[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),         # email
+            (r'comment\s"', Comment, 'commentString1'),
+            (r'comment\s\{', Comment, 'commentString2'),
+            (r'comment\s\[', Comment, 'commentBlock'),
+            (r'comment\s[^(\s{"\[]+', Comment),
+            (r'/[^(^{")\s/[\]]*', Name.Attribute),
+            (r'([^(^{")\s/[\]]+)(?=[:({"\s/\[\]])', word_callback),
+            (r'<[\w:.-]*>', Name.Tag),
+            (r'<[^(<>\s")]+', Name.Tag, 'tag'),
+            (r'([^(^{")\s]+)', Text),
+        ],
+        'string': [
+            (r'[^(^")]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'"', String, '#pop'),
+        ],
+        'string2': [
+            (r'[^(^{})]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+        'stringFile': [
+            (r'[^(^")]+', Name.Decorator),
+            (escape_re, Name.Decorator),
+            (r'\^.', Name.Decorator),
+            (r'"', Name.Decorator, '#pop'),
+        ],
+        'char': [
+            (escape_re + '"', String.Char, '#pop'),
+            (r'\^."', String.Char, '#pop'),
+            (r'."', String.Char, '#pop'),
+        ],
+        'tag': [
+            (escape_re, Name.Tag),
+            (r'"', Name.Tag, 'tagString'),
+            (r'[^(<>\r\n")]+', Name.Tag),
+            (r'>', Name.Tag, '#pop'),
+        ],
+        'tagString': [
+            (r'[^(^")]+', Name.Tag),
+            (escape_re, Name.Tag),
+            (r'[(|)]+', Name.Tag),
+            (r'\^.', Name.Tag),
+            (r'"', Name.Tag, '#pop'),
+        ],
+        'tuple': [
+            (r'(\d+\.)+', Keyword.Constant),
+            (r'\d+', Keyword.Constant, '#pop'),
+        ],
+        'bin2': [
+            (r'\s+', Number.Hex),
+            (r'([01]\s*){8}', Number.Hex),
+            (r'\}', Number.Hex, '#pop'),
+        ],
+        'commentString1': [
+            (r'[^(^")]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'"', Comment, '#pop'),
+        ],
+        'commentString2': [
+            (r'[^(^{})]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'\{', Comment, '#push'),
+            (r'\}', Comment, '#pop'),
+        ],
+        'commentBlock': [
+            (r'\[', Comment, '#push'),
+            (r'\]', Comment, '#pop'),
+            (r'"', Comment, "commentString1"),
+            (r'\{', Comment, "commentString2"),
+            (r'[^(\[\]"{)]+', Comment),
+        ],
+    }
+
+    def analyse_text(text):
+        """
+        Check if code contains REBOL header and so it probably not R code
+        """
+        if re.match(r'^\s*REBOL\s*\[', text, re.IGNORECASE):
+            # The code starts with REBOL header
+            return 1.0
+        elif re.search(r'\s*REBOL\s*[', text, re.IGNORECASE):
+            # The code contains REBOL header but also some text before it
+            return 0.5
+
+
+class RedLexer(RegexLexer):
+    """
+    A `Red-language <http://www.red-lang.org/>`_ lexer.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Red'
+    aliases = ['red', 'red/system']
+    filenames = ['*.red', '*.reds']
+    mimetypes = ['text/x-red', 'text/x-red-system']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    escape_re = r'(?:\^\([0-9a-f]{1,4}\)*)'
+
+    def word_callback(lexer, match):
+        word = match.group()
+
+        if re.match(".*:$", word):
+            yield match.start(), Generic.Subheading, word
+        elif re.match(r'(if|unless|either|any|all|while|until|loop|repeat|'
+                      r'foreach|forall|func|function|does|has|switch|'
+                      r'case|reduce|compose|get|set|print|prin|equal\?|'
+                      r'not-equal\?|strict-equal\?|lesser\?|greater\?|lesser-or-equal\?|'
+                      r'greater-or-equal\?|same\?|not|type\?|stats|'
+                      r'bind|union|replace|charset|routine)$', word):
+            yield match.start(), Name.Builtin, word
+        elif re.match(r'(make|random|reflect|to|form|mold|absolute|add|divide|multiply|negate|'
+                      r'power|remainder|round|subtract|even\?|odd\?|and~|complement|or~|xor~|'
+                      r'append|at|back|change|clear|copy|find|head|head\?|index\?|insert|'
+                      r'length\?|next|pick|poke|remove|reverse|select|sort|skip|swap|tail|tail\?|'
+                      r'take|trim|create|close|delete|modify|open|open\?|query|read|rename|'
+                      r'update|write)$', word):
+            yield match.start(), Name.Function, word
+        elif re.match(r'(yes|on|no|off|true|false|tab|cr|lf|newline|escape|slash|sp|space|null|'
+                      r'none|crlf|dot|null-byte)$', word):
+            yield match.start(), Name.Builtin.Pseudo, word
+        elif re.match(r'(#system-global|#include|#enum|#define|#either|#if|#import|#export|'
+                      r'#switch|#default|#get-definition)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match(r'(system|halt|quit|quit-return|do|load|q|recycle|call|run|ask|parse|'
+                      r'raise-error|return|exit|break|alias|push|pop|probe|\?\?|spec-of|body-of|'
+                      r'quote|forever)$', word):
+            yield match.start(), Name.Exception, word
+        elif re.match(r'(action\?|block\?|char\?|datatype\?|file\?|function\?|get-path\?|zero\?|'
+                      r'get-word\?|integer\?|issue\?|lit-path\?|lit-word\?|logic\?|native\?|'
+                      r'op\?|paren\?|path\?|refinement\?|set-path\?|set-word\?|string\?|unset\?|'
+                      r'any-struct\?|none\?|word\?|any-series\?)$', word):
+            yield match.start(), Keyword, word
+        elif re.match(r'(JNICALL|stdcall|cdecl|infix)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match("to-.*", word):
+            yield match.start(), Keyword, word
+        elif re.match('(\+|-\*\*|-|\*\*|//|/|\*|and|or|xor|=\?|===|==|=|<>|<=|>=|'
+                      '<<<|>>>|<<|>>|<|>%)$', word):
+            yield match.start(), Operator, word
+        elif re.match(".*\!$", word):
+            yield match.start(), Keyword.Type, word
+        elif re.match("'.*", word):
+            yield match.start(), Name.Variable.Instance, word  # lit-word
+        elif re.match("#.*", word):
+            yield match.start(), Name.Label, word  # issue
+        elif re.match("%.*", word):
+            yield match.start(), Name.Decorator, word  # file
+        elif re.match(":.*", word):
+            yield match.start(), Generic.Subheading, word  # get-word
+        else:
+            yield match.start(), Name.Variable, word
+
+    tokens = {
+        'root': [
+            (r'[^R]+', Comment),
+            (r'Red/System\s+\[', Generic.Strong, 'script'),
+            (r'Red\s+\[', Generic.Strong, 'script'),
+            (r'R', Comment)
+        ],
+        'script': [
+            (r'\s+', Text),
+            (r'#"', String.Char, 'char'),
+            (r'#\{[0-9a-f\s]*\}', Number.Hex),
+            (r'2#\{', Number.Hex, 'bin2'),
+            (r'64#\{[0-9a-z+/=\s]*\}', Number.Hex),
+            (r'([0-9a-f]+)(h)((\s)|(?=[\[\]{}"()]))',
+             bygroups(Number.Hex, Name.Variable, Whitespace)),
+            (r'"', String, 'string'),
+            (r'\{', String, 'string2'),
+            (r';#+.*\n', Comment.Special),
+            (r';\*+.*\n', Comment.Preproc),
+            (r';.*\n', Comment),
+            (r'%"', Name.Decorator, 'stringFile'),
+            (r'%[^(^{")\s\[\]]+', Name.Decorator),
+            (r'[+-]?([a-z]{1,3})?\$\d+(\.\d+)?', Number.Float),  # money
+            (r'[+-]?\d+\:\d+(\:\d+)?(\.\d+)?', String.Other),    # time
+            (r'\d+[\-/][0-9a-z]+[\-/]\d+(/\d+:\d+((:\d+)?'
+             r'([\.\d+]?([+-]?\d+:\d+)?)?)?)?', String.Other),   # date
+            (r'\d+(\.\d+)+\.\d+', Keyword.Constant),             # tuple
+            (r'\d+X\d+', Keyword.Constant),                   # pair
+            (r'[+-]?\d+(\'\d+)?([.,]\d*)?E[+-]?\d+', Number.Float),
+            (r'[+-]?\d+(\'\d+)?[.,]\d*', Number.Float),
+            (r'[+-]?\d+(\'\d+)?', Number),
+            (r'[\[\]()]', Generic.Strong),
+            (r'[a-z]+[^(^{"\s:)]*://[^(^{"\s)]*', Name.Decorator),  # url
+            (r'mailto:[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),  # url
+            (r'[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),         # email
+            (r'comment\s"', Comment, 'commentString1'),
+            (r'comment\s\{', Comment, 'commentString2'),
+            (r'comment\s\[', Comment, 'commentBlock'),
+            (r'comment\s[^(\s{"\[]+', Comment),
+            (r'/[^(^{^")\s/[\]]*', Name.Attribute),
+            (r'([^(^{^")\s/[\]]+)(?=[:({"\s/\[\]])', word_callback),
+            (r'<[\w:.-]*>', Name.Tag),
+            (r'<[^(<>\s")]+', Name.Tag, 'tag'),
+            (r'([^(^{")\s]+)', Text),
+        ],
+        'string': [
+            (r'[^(^")]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'"', String, '#pop'),
+        ],
+        'string2': [
+            (r'[^(^{})]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+        'stringFile': [
+            (r'[^(^")]+', Name.Decorator),
+            (escape_re, Name.Decorator),
+            (r'\^.', Name.Decorator),
+            (r'"', Name.Decorator, '#pop'),
+        ],
+        'char': [
+            (escape_re + '"', String.Char, '#pop'),
+            (r'\^."', String.Char, '#pop'),
+            (r'."', String.Char, '#pop'),
+        ],
+        'tag': [
+            (escape_re, Name.Tag),
+            (r'"', Name.Tag, 'tagString'),
+            (r'[^(<>\r\n")]+', Name.Tag),
+            (r'>', Name.Tag, '#pop'),
+        ],
+        'tagString': [
+            (r'[^(^")]+', Name.Tag),
+            (escape_re, Name.Tag),
+            (r'[(|)]+', Name.Tag),
+            (r'\^.', Name.Tag),
+            (r'"', Name.Tag, '#pop'),
+        ],
+        'tuple': [
+            (r'(\d+\.)+', Keyword.Constant),
+            (r'\d+', Keyword.Constant, '#pop'),
+        ],
+        'bin2': [
+            (r'\s+', Number.Hex),
+            (r'([01]\s*){8}', Number.Hex),
+            (r'\}', Number.Hex, '#pop'),
+        ],
+        'commentString1': [
+            (r'[^(^")]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'"', Comment, '#pop'),
+        ],
+        'commentString2': [
+            (r'[^(^{})]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'\{', Comment, '#push'),
+            (r'\}', Comment, '#pop'),
+        ],
+        'commentBlock': [
+            (r'\[', Comment, '#push'),
+            (r'\]', Comment, '#pop'),
+            (r'"', Comment, "commentString1"),
+            (r'\{', Comment, "commentString2"),
+            (r'[^(\[\]"{)]+', Comment),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_csound_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_csound_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_csound_builtins.py	(revision 1126)
@@ -0,0 +1,1346 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._csound_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Opcodes in Csound 6.05 from
+#   csound --list-opcodes
+# except
+#   cggoto  <http://www.csounds.com/manual/html/cggoto.html>
+#   cigoto  <http://www.csounds.com/manual/html/cigoto.html>
+#   cingoto (undocumented)
+#   ckgoto  <http://www.csounds.com/manual/html/ckgoto.html>
+#   cngoto  <http://www.csounds.com/manual/html/cngoto.html>
+#   endin   <http://www.csounds.com/manual/html/endin.html
+#   endop   <http://www.csounds.com/manual/html/endop.html
+#   goto    <http://www.csounds.com/manual/html/goto.html>
+#   igoto   <http://www.csounds.com/manual/html/igoto.html>
+#   instr   <http://www.csounds.com/manual/html/instr.html>
+#   kgoto   <http://www.csounds.com/manual/html/kgoto.html>
+#   loop_ge <http://www.csounds.com/manual/html/loop_ge.html>
+#   loop_gt <http://www.csounds.com/manual/html/loop_gt.html>
+#   loop_le <http://www.csounds.com/manual/html/loop_le.html>
+#   loop_lt <http://www.csounds.com/manual/html/loop_lt.html>
+#   opcode  <http://www.csounds.com/manual/html/opcode.html>
+#   return  <http://www.csounds.com/manual/html/return.html>
+#   rigoto  <http://www.csounds.com/manual/html/rigoto.html>
+#   tigoto  <http://www.csounds.com/manual/html/tigoto.html>
+#   timout  <http://www.csounds.com/manual/html/timout.html>
+# which are treated as keywords; the scoreline opcodes
+#   scoreline <http://www.csounds.com/manual/html/scoreline.html>
+#   scoreline_i <http://www.csounds.com/manual/html/scoreline_i.html>
+# which allow Csound Score highlighting; the pyrun opcodes
+# <http://www.csounds.com/manual/html/pyrun.html> 
+#   pylrun
+#   pylruni
+#   pylrunt
+#   pyrun
+#   pyruni
+#   pyrunt
+# which allow Python highlighting; and the Lua opcodes
+#   lua_exec  <http://www.csounds.com/manual/html/lua_exec.html>
+#   lua_opdef <http://www.csounds.com/manual/html/lua_opdef.html>
+# which allow Lua highlighting.
+OPCODES = set((
+    'ATSadd',
+    'ATSaddnz',
+    'ATSbufread',
+    'ATScross',
+    'ATSinfo',
+    'ATSinterpread',
+    'ATSpartialtap',
+    'ATSread',
+    'ATSreadnz',
+    'ATSsinnoi',
+    'FLbox',
+    'FLbutBank',
+    'FLbutton',
+    'FLcloseButton',
+    'FLcolor',
+    'FLcolor2',
+    'FLcount',
+    'FLexecButton',
+    'FLgetsnap',
+    'FLgroup',
+    'FLgroupEnd',
+    'FLgroup_end',
+    'FLhide',
+    'FLhvsBox',
+    'FLhvsBoxSetValue',
+    'FLjoy',
+    'FLkeyIn',
+    'FLknob',
+    'FLlabel',
+    'FLloadsnap',
+    'FLmouse',
+    'FLpack',
+    'FLpackEnd',
+    'FLpack_end',
+    'FLpanel',
+    'FLpanelEnd',
+    'FLpanel_end',
+    'FLprintk',
+    'FLprintk2',
+    'FLroller',
+    'FLrun',
+    'FLsavesnap',
+    'FLscroll',
+    'FLscrollEnd',
+    'FLscroll_end',
+    'FLsetAlign',
+    'FLsetBox',
+    'FLsetColor',
+    'FLsetColor2',
+    'FLsetFont',
+    'FLsetPosition',
+    'FLsetSize',
+    'FLsetSnapGroup',
+    'FLsetText',
+    'FLsetTextColor',
+    'FLsetTextSize',
+    'FLsetTextType',
+    'FLsetVal',
+    'FLsetVal_i',
+    'FLsetVali',
+    'FLsetsnap',
+    'FLshow',
+    'FLslidBnk',
+    'FLslidBnk2',
+    'FLslidBnk2Set',
+    'FLslidBnk2Setk',
+    'FLslidBnkGetHandle',
+    'FLslidBnkSet',
+    'FLslidBnkSetk',
+    'FLslider',
+    'FLtabs',
+    'FLtabsEnd',
+    'FLtabs_end',
+    'FLtext',
+    'FLupdate',
+    'FLvalue',
+    'FLvkeybd',
+    'FLvslidBnk',
+    'FLvslidBnk2',
+    'FLxyin',
+    'MixerClear',
+    'MixerGetLevel',
+    'MixerReceive',
+    'MixerSend',
+    'MixerSetLevel',
+    'MixerSetLevel_i',
+    'OSCinit',
+    'OSClisten',
+    'OSCsend',
+    'a',
+    'abs',
+    'active',
+    'adsr',
+    'adsyn',
+    'adsynt',
+    'adsynt2',
+    'aftouch',
+    'alpass',
+    'alwayson',
+    'ampdb',
+    'ampdbfs',
+    'ampmidi',
+    'ampmidid',
+    'areson',
+    'aresonk',
+    'array',
+    'atone',
+    'atonek',
+    'atonex',
+    'babo',
+    'balance',
+    'bamboo',
+    'barmodel',
+    'bbcutm',
+    'bbcuts',
+    'betarand',
+    'bexprnd',
+    'bformdec',
+    'bformdec1',
+    'bformenc',
+    'bformenc1',
+    'binit',
+    'biquad',
+    'biquada',
+    'birnd',
+    'bqrez',
+    'buchla',
+    'butbp',
+    'butbr',
+    'buthp',
+    'butlp',
+    'butterbp',
+    'butterbr',
+    'butterhp',
+    'butterlp',
+    'button',
+    'buzz',
+    'c2r',
+    'cabasa',
+    'cauchy',
+    'cauchyi',
+    'ceil',
+    'cell',
+    'cent',
+    'centroid',
+    'ceps',
+   #'cggoto',
+    'chanctrl',
+    'changed',
+    'chani',
+    'chano',
+    'chebyshevpoly',
+    'checkbox',
+    'chn_S',
+    'chn_a',
+    'chn_k',
+    'chnclear',
+    'chnexport',
+    'chnget',
+    'chnmix',
+    'chnparams',
+    'chnset',
+    'chuap',
+   #'cigoto',
+   #'cingoto',
+   #'ckgoto',
+    'clear',
+    'clfilt',
+    'clip',
+    'clockoff',
+    'clockon',
+    'cmplxprod',
+   #'cngoto',
+    'comb',
+    'combinv',
+    'compilecsd',
+    'compileorc',
+    'compilestr',
+    'compress',
+    'connect',
+    'control',
+    'convle',
+    'convolve',
+    'copy2ftab',
+    'copy2ttab',
+    'copya2ftab',
+    'copyf2array',
+    'cos',
+    'cosh',
+    'cosinv',
+    'cosseg',
+    'cossegb',
+    'cossegr',
+    'cps2pch',
+    'cpsmidi',
+    'cpsmidib',
+    'cpsmidinn',
+    'cpsoct',
+    'cpspch',
+    'cpstmid',
+    'cpstun',
+    'cpstuni',
+    'cpsxpch',
+    'cpuprc',
+    'cross2',
+    'crossfm',
+    'crossfmi',
+    'crossfmpm',
+    'crossfmpmi',
+    'crosspm',
+    'crosspmi',
+    'crunch',
+    'ctlchn',
+    'ctrl14',
+    'ctrl21',
+    'ctrl7',
+    'ctrlinit',
+    'cuserrnd',
+    'dam',
+    'date',
+    'dates',
+    'db',
+    'dbamp',
+    'dbfsamp',
+    'dcblock',
+    'dcblock2',
+    'dconv',
+    'delay',
+    'delay1',
+    'delayk',
+    'delayr',
+    'delayw',
+    'deltap',
+    'deltap3',
+    'deltapi',
+    'deltapn',
+    'deltapx',
+    'deltapxw',
+    'denorm',
+    'diff',
+    'diskgrain',
+    'diskin',
+    'diskin2',
+    'dispfft',
+    'display',
+    'distort',
+    'distort1',
+    'divz',
+    'doppler',
+    'downsamp',
+    'dripwater',
+    'dumpk',
+    'dumpk2',
+    'dumpk3',
+    'dumpk4',
+    'duserrnd',
+    'dust',
+    'dust2',
+   #'endin',
+   #'endop',
+    'envlpx',
+    'envlpxr',
+    'ephasor',
+    'eqfil',
+    'evalstr',
+    'event',
+    'event_i',
+    'exciter',
+    'exitnow',
+    'exp',
+    'expcurve',
+    'expon',
+    'exprand',
+    'exprandi',
+    'expseg',
+    'expsega',
+    'expsegb',
+    'expsegba',
+    'expsegr',
+    'fareylen',
+    'fareyleni',
+    'faustaudio',
+    'faustcompile',
+    'faustctl',
+    'faustgen',
+    'fft',
+    'fftinv',
+    'ficlose',
+    'filebit',
+    'filelen',
+    'filenchnls',
+    'filepeak',
+    'filesr',
+    'filevalid',
+    'fillarray',
+    'filter2',
+    'fin',
+    'fini',
+    'fink',
+    'fiopen',
+    'flanger',
+    'flashtxt',
+    'flooper',
+    'flooper2',
+    'floor',
+    'fluidAllOut',
+    'fluidCCi',
+    'fluidCCk',
+    'fluidControl',
+    'fluidEngine',
+    'fluidLoad',
+    'fluidNote',
+    'fluidOut',
+    'fluidProgramSelect',
+    'fluidSetInterpMethod',
+    'fmb3',
+    'fmbell',
+    'fmmetal',
+    'fmpercfl',
+    'fmrhode',
+    'fmvoice',
+    'fmwurlie',
+    'fof',
+    'fof2',
+    'fofilter',
+    'fog',
+    'fold',
+    'follow',
+    'follow2',
+    'foscil',
+    'foscili',
+    'fout',
+    'fouti',
+    'foutir',
+    'foutk',
+    'fprintks',
+    'fprints',
+    'frac',
+    'fractalnoise',
+    'freeverb',
+    'ftchnls',
+    'ftconv',
+    'ftcps',
+    'ftfree',
+    'ftgen',
+    'ftgenonce',
+    'ftgentmp',
+    'ftlen',
+    'ftload',
+    'ftloadk',
+    'ftlptim',
+    'ftmorf',
+    'ftresize',
+    'ftresizei',
+    'ftsave',
+    'ftsavek',
+    'ftsr',
+    'gain',
+    'gainslider',
+    'gauss',
+    'gaussi',
+    'gausstrig',
+    'gbuzz',
+    'genarray',
+    'genarray_i',
+    'gendy',
+    'gendyc',
+    'gendyx',
+    'getcfg',
+    'getcol',
+    'getrow',
+    'gogobel',
+   #'goto',
+    'grain',
+    'grain2',
+    'grain3',
+    'granule',
+    'guiro',
+    'harmon',
+    'harmon2',
+    'harmon3',
+    'harmon4',
+    'hdf5read',
+    'hdf5write',
+    'hilbert',
+    'hrtfearly',
+    'hrtfer',
+    'hrtfmove',
+    'hrtfmove2',
+    'hrtfreverb',
+    'hrtfstat',
+    'hsboscil',
+    'hvs1',
+    'hvs2',
+    'hvs3',
+    'i',
+    'iceps',
+   #'igoto',
+    'ihold',
+    'imagecreate',
+    'imagefree',
+    'imagegetpixel',
+    'imageload',
+    'imagesave',
+    'imagesetpixel',
+    'imagesize',
+    'in',
+    'in32',
+    'inch',
+    'inh',
+    'init',
+    'initc14',
+    'initc21',
+    'initc7',
+    'inleta',
+    'inletf',
+    'inletk',
+    'inletkid',
+    'inletv',
+    'ino',
+    'inq',
+    'inrg',
+    'ins',
+    'insglobal',
+    'insremot',
+   #'instr',
+    'int',
+    'integ',
+    'interp',
+    'invalue',
+    'inx',
+    'inz',
+    'jitter',
+    'jitter2',
+    'jspline',
+    'k',
+   #'kgoto',
+    'ktableseg',
+    'lenarray',
+    'lentab',
+    'lfo',
+    'limit',
+    'line',
+    'linen',
+    'linenr',
+    'lineto',
+    'linrand',
+    'linseg',
+    'linsegb',
+    'linsegr',
+    'locsend',
+    'locsig',
+    'log',
+    'log10',
+    'log2',
+    'logbtwo',
+    'logcurve',
+   #'loop_ge',
+   #'loop_gt',
+   #'loop_le',
+   #'loop_lt',
+    'loopseg',
+    'loopsegp',
+    'looptseg',
+    'loopxseg',
+    'lorenz',
+    'loscil',
+    'loscil3',
+    'loscilx',
+    'lowpass2',
+    'lowres',
+    'lowresx',
+    'lpf18',
+    'lpform',
+    'lpfreson',
+    'lphasor',
+    'lpinterp',
+    'lposcil',
+    'lposcil3',
+    'lposcila',
+    'lposcilsa',
+    'lposcilsa2',
+    'lpread',
+    'lpreson',
+    'lpshold',
+    'lpsholdp',
+    'lpslot',
+   #'lua_exec',
+    'lua_ikopcall',
+   #'lua_opdef',
+    'mac',
+    'maca',
+    'madsr',
+    'mags',
+    'mandel',
+    'mandol',
+    'maparray',
+    'maparray_i',
+    'marimba',
+    'massign',
+    'max',
+    'max_k',
+    'maxabs',
+    'maxabsaccum',
+    'maxaccum',
+    'maxalloc',
+    'maxarray',
+    'maxtab',
+    'mclock',
+    'mdelay',
+    'median',
+    'mediank',
+    'metro',
+    'midglobal',
+    'midic14',
+    'midic21',
+    'midic7',
+    'midichannelaftertouch',
+    'midichn',
+    'midicontrolchange',
+    'midictrl',
+    'mididefault',
+    'midifilestatus',
+    'midiin',
+    'midinoteoff',
+    'midinoteoncps',
+    'midinoteonkey',
+    'midinoteonoct',
+    'midinoteonpch',
+    'midion',
+    'midion2',
+    'midiout',
+    'midipgm',
+    'midipitchbend',
+    'midipolyaftertouch',
+    'midiprogramchange',
+    'miditempo',
+    'midremot',
+    'min',
+    'minabs',
+    'minabsaccum',
+    'minaccum',
+    'minarray',
+    'mincer',
+    'mintab',
+    'mirror',
+    'mode',
+    'modmatrix',
+    'monitor',
+    'moog',
+    'moogladder',
+    'moogvcf',
+    'moogvcf2',
+    'moscil',
+    'mp3bitrate',
+    'mp3in',
+    'mp3len',
+    'mp3nchnls',
+    'mp3sr',
+    'mpulse',
+    'mrtmsg',
+    'multitap',
+    'mute',
+    'mxadsr',
+    'nestedap',
+    'nlalp',
+    'nlfilt',
+    'nlfilt2',
+    'noise',
+    'noteoff',
+    'noteon',
+    'noteondur',
+    'noteondur2',
+    'notnum',
+    'nreverb',
+    'nrpn',
+    'nsamp',
+    'nstance',
+    'nstrnum',
+    'ntrpol',
+    'octave',
+    'octcps',
+    'octmidi',
+    'octmidib',
+    'octmidinn',
+    'octpch',
+   #'opcode',
+    'oscbnk',
+    'oscil',
+    'oscil1',
+    'oscil1i',
+    'oscil3',
+    'oscili',
+    'oscilikt',
+    'osciliktp',
+    'oscilikts',
+    'osciln',
+    'oscils',
+    'oscilx',
+    'out',
+    'out32',
+    'outc',
+    'outch',
+    'outh',
+    'outiat',
+    'outic',
+    'outic14',
+    'outipat',
+    'outipb',
+    'outipc',
+    'outkat',
+    'outkc',
+    'outkc14',
+    'outkpat',
+    'outkpb',
+    'outkpc',
+    'outleta',
+    'outletf',
+    'outletk',
+    'outletkid',
+    'outletv',
+    'outo',
+    'outq',
+    'outq1',
+    'outq2',
+    'outq3',
+    'outq4',
+    'outrg',
+    'outs',
+    'outs1',
+    'outs2',
+    'outvalue',
+    'outx',
+    'outz',
+    'p',
+    'pan',
+    'pan2',
+    'pareq',
+    'partials',
+    'partikkel',
+    'partikkelget',
+    'partikkelset',
+    'partikkelsync',
+    'passign',
+    'pcauchy',
+    'pchbend',
+    'pchmidi',
+    'pchmidib',
+    'pchmidinn',
+    'pchoct',
+    'pconvolve',
+    'pcount',
+    'pdclip',
+    'pdhalf',
+    'pdhalfy',
+    'peak',
+    'pgmassign',
+    'pgmchn',
+    'phaser1',
+    'phaser2',
+    'phasor',
+    'phasorbnk',
+    'phs',
+    'pindex',
+    'pinker',
+    'pinkish',
+    'pitch',
+    'pitchac',
+    'pitchamdf',
+    'planet',
+    'platerev',
+    'plltrack',
+    'pluck',
+    'poisson',
+    'pol2rect',
+    'polyaft',
+    'polynomial',
+    'pop',
+    'pop_f',
+    'port',
+    'portk',
+    'poscil',
+    'poscil3',
+    'pow',
+    'powershape',
+    'powoftwo',
+    'prealloc',
+    'prepiano',
+    'print',
+    'print_type',
+    'printf',
+    'printf_i',
+    'printk',
+    'printk2',
+    'printks',
+    'printks2',
+    'prints',
+    'product',
+    'pset',
+    'ptable',
+    'ptable3',
+    'ptablei',
+    'ptableiw',
+    'ptablew',
+    'ptrack',
+    'push',
+    'push_f',
+    'puts',
+    'pvadd',
+    'pvbufread',
+    'pvcross',
+    'pvinterp',
+    'pvoc',
+    'pvread',
+    'pvs2array',
+    'pvs2tab',
+    'pvsadsyn',
+    'pvsanal',
+    'pvsarp',
+    'pvsbandp',
+    'pvsbandr',
+    'pvsbin',
+    'pvsblur',
+    'pvsbuffer',
+    'pvsbufread',
+    'pvsbufread2',
+    'pvscale',
+    'pvscent',
+    'pvsceps',
+    'pvscross',
+    'pvsdemix',
+    'pvsdiskin',
+    'pvsdisp',
+    'pvsenvftw',
+    'pvsfilter',
+    'pvsfread',
+    'pvsfreeze',
+    'pvsfromarray',
+    'pvsftr',
+    'pvsftw',
+    'pvsfwrite',
+    'pvsgain',
+    'pvsgendy',
+    'pvshift',
+    'pvsifd',
+    'pvsin',
+    'pvsinfo',
+    'pvsinit',
+    'pvslock',
+    'pvsmaska',
+    'pvsmix',
+    'pvsmooth',
+    'pvsmorph',
+    'pvsosc',
+    'pvsout',
+    'pvspitch',
+    'pvstanal',
+    'pvstencil',
+    'pvsvoc',
+    'pvswarp',
+    'pvsynth',
+    'pwd',
+    'pyassign',
+    'pyassigni',
+    'pyassignt',
+    'pycall',
+    'pycall1',
+    'pycall1i',
+    'pycall1t',
+    'pycall2',
+    'pycall2i',
+    'pycall2t',
+    'pycall3',
+    'pycall3i',
+    'pycall3t',
+    'pycall4',
+    'pycall4i',
+    'pycall4t',
+    'pycall5',
+    'pycall5i',
+    'pycall5t',
+    'pycall6',
+    'pycall6i',
+    'pycall6t',
+    'pycall7',
+    'pycall7i',
+    'pycall7t',
+    'pycall8',
+    'pycall8i',
+    'pycall8t',
+    'pycalli',
+    'pycalln',
+    'pycallni',
+    'pycallt',
+    'pyeval',
+    'pyevali',
+    'pyevalt',
+    'pyexec',
+    'pyexeci',
+    'pyexect',
+    'pyinit',
+    'pylassign',
+    'pylassigni',
+    'pylassignt',
+    'pylcall',
+    'pylcall1',
+    'pylcall1i',
+    'pylcall1t',
+    'pylcall2',
+    'pylcall2i',
+    'pylcall2t',
+    'pylcall3',
+    'pylcall3i',
+    'pylcall3t',
+    'pylcall4',
+    'pylcall4i',
+    'pylcall4t',
+    'pylcall5',
+    'pylcall5i',
+    'pylcall5t',
+    'pylcall6',
+    'pylcall6i',
+    'pylcall6t',
+    'pylcall7',
+    'pylcall7i',
+    'pylcall7t',
+    'pylcall8',
+    'pylcall8i',
+    'pylcall8t',
+    'pylcalli',
+    'pylcalln',
+    'pylcallni',
+    'pylcallt',
+    'pyleval',
+    'pylevali',
+    'pylevalt',
+    'pylexec',
+    'pylexeci',
+    'pylexect',
+   #'pylrun',
+   #'pylruni',
+   #'pylrunt',
+   #'pyrun',
+   #'pyruni',
+   #'pyrunt',
+    'qinf',
+    'qnan',
+    'r2c',
+    'rand',
+    'randh',
+    'randi',
+    'random',
+    'randomh',
+    'randomi',
+    'rbjeq',
+    'readclock',
+    'readf',
+    'readfi',
+    'readk',
+    'readk2',
+    'readk3',
+    'readk4',
+    'readks',
+    'readscore',
+    'readscratch',
+    'rect2pol',
+    'reinit',
+    'release',
+    'remoteport',
+    'remove',
+    'repluck',
+    'reson',
+    'resonk',
+    'resonr',
+    'resonx',
+    'resonxk',
+    'resony',
+    'resonz',
+    'resyn',
+   #'return',
+    'reverb',
+    'reverb2',
+    'reverbsc',
+    'rewindscore',
+    'rezzy',
+    'rfft',
+    'rifft',
+   #'rigoto',
+    'rireturn',
+    'rms',
+    'rnd',
+    'rnd31',
+    'round',
+    'rspline',
+    'rtclock',
+    's16b14',
+    's32b14',
+    'samphold',
+    'sandpaper',
+    'scale',
+    'scalearray',
+    'scalet',
+    'scanhammer',
+    'scans',
+    'scantable',
+    'scanu',
+    'schedkwhen',
+    'schedkwhennamed',
+    'schedule',
+    'schedwhen',
+   #'scoreline',
+   #'scoreline_i',
+    'seed',
+    'sekere',
+    'semitone',
+    'sense',
+    'sensekey',
+    'seqtime',
+    'seqtime2',
+    'serialBegin',
+    'serialEnd',
+    'serialFlush',
+    'serialPrint',
+    'serialRead',
+    'serialWrite',
+    'serialWrite_i',
+    'setcol',
+    'setctrl',
+    'setksmps',
+    'setrow',
+    'setscorepos',
+    'sfilist',
+    'sfinstr',
+    'sfinstr3',
+    'sfinstr3m',
+    'sfinstrm',
+    'sfload',
+    'sflooper',
+    'sfpassign',
+    'sfplay',
+    'sfplay3',
+    'sfplay3m',
+    'sfplaym',
+    'sfplist',
+    'sfpreset',
+    'shaker',
+    'shiftin',
+    'shiftout',
+    'signalflowgraph',
+    'signum',
+    'sin',
+    'sinh',
+    'sininv',
+    'sinsyn',
+    'sleighbells',
+    'slicearray',
+    'slider16',
+    'slider16f',
+    'slider16table',
+    'slider16tablef',
+    'slider32',
+    'slider32f',
+    'slider32table',
+    'slider32tablef',
+    'slider64',
+    'slider64f',
+    'slider64table',
+    'slider64tablef',
+    'slider8',
+    'slider8f',
+    'slider8table',
+    'slider8tablef',
+    'sliderKawai',
+    'sndload',
+    'sndloop',
+    'sndwarp',
+    'sndwarpst',
+    'sockrecv',
+    'sockrecvs',
+    'socksend',
+    'socksends',
+    'soundin',
+    'soundout',
+    'soundouts',
+    'space',
+    'spat3d',
+    'spat3di',
+    'spat3dt',
+    'spdist',
+    'specaddm',
+    'specdiff',
+    'specdisp',
+    'specfilt',
+    'spechist',
+    'specptrk',
+    'specscal',
+    'specsum',
+    'spectrum',
+    'splitrig',
+    'sprintf',
+    'sprintfk',
+    'spsend',
+    'sqrt',
+    'stack',
+    'statevar',
+    'stix',
+    'strcat',
+    'strcatk',
+    'strchar',
+    'strchark',
+    'strcmp',
+    'strcmpk',
+    'strcpy',
+    'strcpyk',
+    'strecv',
+    'streson',
+    'strfromurl',
+    'strget',
+    'strindex',
+    'strindexk',
+    'strlen',
+    'strlenk',
+    'strlower',
+    'strlowerk',
+    'strrindex',
+    'strrindexk',
+    'strset',
+    'strsub',
+    'strsubk',
+    'strtod',
+    'strtodk',
+    'strtol',
+    'strtolk',
+    'strupper',
+    'strupperk',
+    'stsend',
+    'subinstr',
+    'subinstrinit',
+    'sum',
+    'sumarray',
+    'sumtab',
+    'svfilter',
+    'syncgrain',
+    'syncloop',
+    'syncphasor',
+    'system',
+    'system_i',
+    'tab',
+    'tab2pvs',
+    'tab_i',
+    'tabgen',
+    'table',
+    'table3',
+    'table3kt',
+    'tablecopy',
+    'tablefilter',
+    'tablefilteri',
+    'tablegpw',
+    'tablei',
+    'tableicopy',
+    'tableigpw',
+    'tableikt',
+    'tableimix',
+    'tableiw',
+    'tablekt',
+    'tablemix',
+    'tableng',
+    'tablera',
+    'tableseg',
+    'tableshuffle',
+    'tableshufflei',
+    'tablew',
+    'tablewa',
+    'tablewkt',
+    'tablexkt',
+    'tablexseg',
+    'tabmap',
+    'tabmap_i',
+    'tabmorph',
+    'tabmorpha',
+    'tabmorphak',
+    'tabmorphi',
+    'tabplay',
+    'tabrec',
+    'tabslice',
+    'tabsum',
+    'tabw',
+    'tabw_i',
+    'tambourine',
+    'tan',
+    'tanh',
+    'taninv',
+    'taninv2',
+    'tb0',
+    'tb0_init',
+    'tb1',
+    'tb10',
+    'tb10_init',
+    'tb11',
+    'tb11_init',
+    'tb12',
+    'tb12_init',
+    'tb13',
+    'tb13_init',
+    'tb14',
+    'tb14_init',
+    'tb15',
+    'tb15_init',
+    'tb1_init',
+    'tb2',
+    'tb2_init',
+    'tb3',
+    'tb3_init',
+    'tb4',
+    'tb4_init',
+    'tb5',
+    'tb5_init',
+    'tb6',
+    'tb6_init',
+    'tb7',
+    'tb7_init',
+    'tb8',
+    'tb8_init',
+    'tb9',
+    'tb9_init',
+    'tbvcf',
+    'tempest',
+    'tempo',
+    'temposcal',
+    'tempoval',
+   #'tigoto',
+    'timedseq',
+    'timeinstk',
+    'timeinsts',
+    'timek',
+    'times',
+   #'timout',
+    'tival',
+    'tlineto',
+    'tone',
+    'tonek',
+    'tonex',
+    'tradsyn',
+    'trandom',
+    'transeg',
+    'transegb',
+    'transegr',
+    'trcross',
+    'trfilter',
+    'trhighest',
+    'trigger',
+    'trigseq',
+    'trirand',
+    'trlowest',
+    'trmix',
+    'trscale',
+    'trshift',
+    'trsplit',
+    'turnoff',
+    'turnoff2',
+    'turnon',
+    'unirand',
+    'unwrap',
+    'upsamp',
+    'urd',
+    'vactrol',
+    'vadd',
+    'vadd_i',
+    'vaddv',
+    'vaddv_i',
+    'vaget',
+    'valpass',
+    'vaset',
+    'vbap',
+    'vbap16',
+    'vbap4',
+    'vbap4move',
+    'vbap8',
+    'vbap8move',
+    'vbapg',
+    'vbapgmove',
+    'vbaplsinit',
+    'vbapmove',
+    'vbapz',
+    'vbapzmove',
+    'vcella',
+    'vco',
+    'vco2',
+    'vco2ft',
+    'vco2ift',
+    'vco2init',
+    'vcomb',
+    'vcopy',
+    'vcopy_i',
+    'vdel_k',
+    'vdelay',
+    'vdelay3',
+    'vdelayk',
+    'vdelayx',
+    'vdelayxq',
+    'vdelayxs',
+    'vdelayxw',
+    'vdelayxwq',
+    'vdelayxws',
+    'vdivv',
+    'vdivv_i',
+    'vecdelay',
+    'veloc',
+    'vexp',
+    'vexp_i',
+    'vexpseg',
+    'vexpv',
+    'vexpv_i',
+    'vibes',
+    'vibr',
+    'vibrato',
+    'vincr',
+    'vlimit',
+    'vlinseg',
+    'vlowres',
+    'vmap',
+    'vmirror',
+    'vmult',
+    'vmult_i',
+    'vmultv',
+    'vmultv_i',
+    'voice',
+    'vosim',
+    'vphaseseg',
+    'vport',
+    'vpow',
+    'vpow_i',
+    'vpowv',
+    'vpowv_i',
+    'vpvoc',
+    'vrandh',
+    'vrandi',
+    'vsubv',
+    'vsubv_i',
+    'vtaba',
+    'vtabi',
+    'vtabk',
+    'vtable1k',
+    'vtablea',
+    'vtablei',
+    'vtablek',
+    'vtablewa',
+    'vtablewi',
+    'vtablewk',
+    'vtabwa',
+    'vtabwi',
+    'vtabwk',
+    'vwrap',
+    'waveset',
+    'weibull',
+    'wgbow',
+    'wgbowedbar',
+    'wgbrass',
+    'wgclar',
+    'wgflute',
+    'wgpluck',
+    'wgpluck2',
+    'wguide1',
+    'wguide2',
+    'wiiconnect',
+    'wiidata',
+    'wiirange',
+    'wiisend',
+    'window',
+    'wrap',
+    'writescratch',
+    'wterrain',
+    'xadsr',
+    'xin',
+    'xout',
+    'xscanmap',
+    'xscans',
+    'xscansmap',
+    'xscanu',
+    'xtratim',
+    'xyin',
+    'zacl',
+    'zakinit',
+    'zamod',
+    'zar',
+    'zarg',
+    'zaw',
+    'zawm',
+    'zfilter2',
+    'zir',
+    'ziw',
+    'ziwm',
+    'zkcl',
+    'zkmod',
+    'zkr',
+    'zkw',
+    'zkwm'
+))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/hexdump.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/hexdump.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/hexdump.py	(revision 1126)
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.hexdump
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for hexadecimal dumps.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include
+from pygments.token import Text, Name, Number, String, Punctuation
+
+__all__ = ['HexdumpLexer']
+
+
+class HexdumpLexer(RegexLexer):
+    """
+    For typical hex dump output formats by the UNIX and GNU/Linux tools ``hexdump``,
+    ``hd``, ``hexcat``, ``od`` and ``xxd``, and the DOS tool ``DEBUG``. For example:
+
+    .. sourcecode:: hexdump
+
+        00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
+        00000010  02 00 3e 00 01 00 00 00  c5 48 40 00 00 00 00 00  |..>......H@.....|
+
+    The specific supported formats are the outputs of:
+
+    * ``hexdump FILE``
+    * ``hexdump -C FILE`` -- the `canonical` format used in the example.
+    * ``hd FILE`` -- same as ``hexdump -C FILE``.
+    * ``hexcat FILE``
+    * ``od -t x1z FILE``
+    * ``xxd FILE``
+    * ``DEBUG.EXE FILE.COM`` and entering ``d`` to the prompt.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Hexdump'
+    aliases = ['hexdump']
+
+    hd = r'[0-9A-Ha-h]'
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            include('offset'),
+            (r'('+hd+r'{2})(\-)('+hd+r'{2})',
+             bygroups(Number.Hex, Punctuation, Number.Hex)),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{2,3})(\>)(.{16})(\<)$',
+             bygroups(Text, Punctuation, String, Punctuation), 'bracket-strings'),
+            (r'(\s{2,3})(\|)(.{16})(\|)$',
+             bygroups(Text, Punctuation, String, Punctuation), 'piped-strings'),
+            (r'(\s{2,3})(\>)(.{1,15})(\<)$',
+             bygroups(Text, Punctuation, String, Punctuation)),
+            (r'(\s{2,3})(\|)(.{1,15})(\|)$',
+             bygroups(Text, Punctuation, String, Punctuation)),
+            (r'(\s{2,3})(.{1,15})$', bygroups(Text, String)),
+            (r'(\s{2,3})(.{16}|.{20})$', bygroups(Text, String), 'nonpiped-strings'),
+            (r'\s', Text),
+            (r'^\*', Punctuation),
+        ],
+        'offset': [
+            (r'^('+hd+'+)(:)', bygroups(Name.Label, Punctuation), 'offset-mode'),
+            (r'^'+hd+'+', Name.Label),
+        ],
+        'offset-mode': [
+            (r'\s', Text, '#pop'),
+            (hd+'+', Name.Label),
+            (r':', Punctuation)
+        ],
+        'piped-strings': [
+            (r'\n', Text),
+            include('offset'),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{2,3})(\|)(.{1,16})(\|)$',
+             bygroups(Text, Punctuation, String, Punctuation)),
+            (r'\s', Text),
+            (r'^\*', Punctuation),
+        ],
+        'bracket-strings': [
+            (r'\n', Text),
+            include('offset'),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{2,3})(\>)(.{1,16})(\<)$',
+             bygroups(Text, Punctuation, String, Punctuation)),
+            (r'\s', Text),
+            (r'^\*', Punctuation),
+        ],
+        'nonpiped-strings': [
+            (r'\n', Text),
+            include('offset'),
+            (r'('+hd+r'{2})(\-)('+hd+r'{2})',
+             bygroups(Number.Hex, Punctuation, Number.Hex)),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{19,})(.{1,20}?)$', bygroups(Text, String)),
+            (r'(\s{2,3})(.{1,20})$', bygroups(Text, String)),
+            (r'\s', Text),
+            (r'^\*', Punctuation),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dalvik.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dalvik.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/dalvik.py	(revision 1126)
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.dalvik
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for Dalvik VM-related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Keyword, Text, Comment, Name, String, Number, \
+    Punctuation
+
+__all__ = ['SmaliLexer']
+
+
+class SmaliLexer(RegexLexer):
+    """
+    For `Smali <http://code.google.com/p/smali/>`_ (Android/Dalvik) assembly
+    code.
+
+    .. versionadded:: 1.6
+    """
+    name = 'Smali'
+    aliases = ['smali']
+    filenames = ['*.smali']
+    mimetypes = ['text/smali']
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('label'),
+            include('field'),
+            include('method'),
+            include('class'),
+            include('directive'),
+            include('access-modifier'),
+            include('instruction'),
+            include('literal'),
+            include('punctuation'),
+            include('type'),
+            include('whitespace')
+        ],
+        'directive': [
+            (r'^[ \t]*\.(class|super|implements|field|subannotation|annotation|'
+             r'enum|method|registers|locals|array-data|packed-switch|'
+             r'sparse-switch|catchall|catch|line|parameter|local|prologue|'
+             r'epilogue|source)', Keyword),
+            (r'^[ \t]*\.end (field|subannotation|annotation|method|array-data|'
+             'packed-switch|sparse-switch|parameter|local)', Keyword),
+            (r'^[ \t]*\.restart local', Keyword),
+        ],
+        'access-modifier': [
+            (r'(public|private|protected|static|final|synchronized|bridge|'
+             r'varargs|native|abstract|strictfp|synthetic|constructor|'
+             r'declared-synchronized|interface|enum|annotation|volatile|'
+             r'transient)', Keyword),
+        ],
+        'whitespace': [
+            (r'\n', Text),
+            (r'\s+', Text),
+        ],
+        'instruction': [
+            (r'\b[vp]\d+\b', Name.Builtin),  # registers
+            (r'\b[a-z][A-Za-z0-9/-]+\s+', Text),  # instructions
+        ],
+        'literal': [
+            (r'".*"', String),
+            (r'0x[0-9A-Fa-f]+t?', Number.Hex),
+            (r'[0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+L?', Number.Integer),
+        ],
+        'field': [
+            (r'(\$?\b)([\w$]*)(:)',
+             bygroups(Punctuation, Name.Variable, Punctuation)),
+        ],
+        'method': [
+            (r'<(?:cl)?init>', Name.Function),  # constructor
+            (r'(\$?\b)([\w$]*)(\()',
+             bygroups(Punctuation, Name.Function, Punctuation)),
+        ],
+        'label': [
+            (r':\w+', Name.Label),
+        ],
+        'class': [
+            # class names in the form Lcom/namespace/ClassName;
+            # I only want to color the ClassName part, so the namespace part is
+            # treated as 'Text'
+            (r'(L)((?:[\w$]+/)*)([\w$]+)(;)',
+                bygroups(Keyword.Type, Text, Name.Class, Text)),
+        ],
+        'punctuation': [
+            (r'->', Punctuation),
+            (r'[{},():=.-]', Punctuation),
+        ],
+        'type': [
+            (r'[ZBSCIJFDV\[]+', Keyword.Type),
+        ],
+        'comment': [
+            (r'#.*?\n', Comment),
+        ],
+    }
+
+    def analyse_text(text):
+        score = 0
+        if re.search(r'^\s*\.class\s', text, re.MULTILINE):
+            score += 0.5
+            if re.search(r'\b((check-cast|instance-of|throw-verification-error'
+                         r')\b|(-to|add|[ais]get|[ais]put|and|cmpl|const|div|'
+                         r'if|invoke|move|mul|neg|not|or|rem|return|rsub|shl|'
+                         r'shr|sub|ushr)[-/])|{|}', text, re.MULTILINE):
+                score += 0.3
+        if re.search(r'(\.(catchall|epilogue|restart local|prologue)|'
+                     r'\b(array-data|class-change-error|declared-synchronized|'
+                     r'(field|inline|vtable)@0x[0-9a-fA-F]|generic-error|'
+                     r'illegal-class-access|illegal-field-access|'
+                     r'illegal-method-access|instantiation-error|no-error|'
+                     r'no-such-class|no-such-field|no-such-method|'
+                     r'packed-switch|sparse-switch))\b', text, re.MULTILINE):
+            score += 0.6
+        return score
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/forth.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/forth.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/forth.py	(revision 1126)
@@ -0,0 +1,177 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.forth
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Error, Punctuation, Literal, Token, \
+     Text, Comment, Operator, Keyword, Name, String, Number, Generic
+
+
+__all__ = ['ForthLexer']
+
+
+class ForthLexer(RegexLexer):
+    """
+    Lexer for Forth files.
+
+    .. versionadded:: 2.2
+    """
+    name = 'Forth'
+    aliases = ['forth']
+    filenames = ['*.frt', '*.fs']
+    mimetypes = ['application/x-forth']
+
+    delimiter = r'\s'
+    delimiter_end = r'(?=[%s])' % delimiter
+
+    valid_name_chars = r'[^%s]' % delimiter
+    valid_name = r"%s+%s" % (valid_name_chars, delimiter_end)
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # All comment types
+            (r'\\.*?\n', Comment.Single),
+            (r'\([\s].*?\)', Comment.Single),
+            # defining words. The next word is a new command name
+            (r'(:|variable|constant|value|buffer:)(\s+)',
+             bygroups(Keyword.Namespace, Text), 'worddef'),
+            # strings are rather simple
+            (r'([.sc]")(\s+?)', bygroups(String, Text), 'stringdef'),
+            # keywords from the various wordsets
+            # *** Wordset BLOCK
+            (r'(blk|block|buffer|evaluate|flush|load|save-buffers|update|'
+             # *** Wordset BLOCK-EXT
+             r'empty-buffers|list|refill|scr|thru|'
+             # *** Wordset CORE
+             r'\#s|\*\/mod|\+loop|\/mod|0<|0=|1\+|1-|2!|'
+             r'2\*|2\/|2@|2drop|2dup|2over|2swap|>body|'
+             r'>in|>number|>r|\?dup|abort|abort\"|abs|'
+             r'accept|align|aligned|allot|and|base|begin|'
+             r'bl|c!|c,|c@|cell\+|cells|char|char\+|'
+             r'chars|constant|count|cr|create|decimal|'
+             r'depth|do|does>|drop|dup|else|emit|environment\?|'
+             r'evaluate|execute|exit|fill|find|fm\/mod|'
+             r'here|hold|i|if|immediate|invert|j|key|'
+             r'leave|literal|loop|lshift|m\*|max|min|'
+             r'mod|move|negate|or|over|postpone|quit|'
+             r'r>|r@|recurse|repeat|rot|rshift|s\"|s>d|'
+             r'sign|sm\/rem|source|space|spaces|state|swap|'
+             r'then|type|u\.|u\<|um\*|um\/mod|unloop|until|'
+             r'variable|while|word|xor|\[char\]|\[\'\]|'
+             r'@|!|\#|<\#|\#>|:|;|\+|-|\*|\/|,|<|>|\|1\+|1-|\.|'
+            # *** Wordset CORE-EXT
+             r'\.r|0<>|'
+             r'0>|2>r|2r>|2r@|:noname|\?do|again|c\"|'
+             r'case|compile,|endcase|endof|erase|false|'
+             r'hex|marker|nip|of|pad|parse|pick|refill|'
+             r'restore-input|roll|save-input|source-id|to|'
+             r'true|tuck|u\.r|u>|unused|value|within|'
+             r'\[compile\]|'
+            # *** Wordset CORE-EXT-obsolescent
+             r'\#tib|convert|expect|query|span|'
+             r'tib|'
+            # *** Wordset DOUBLE
+             r'2constant|2literal|2variable|d\+|d-|'
+             r'd\.|d\.r|d0<|d0=|d2\*|d2\/|d<|d=|d>s|'
+             r'dabs|dmax|dmin|dnegate|m\*\/|m\+|'
+            # *** Wordset DOUBLE-EXT
+             r'2rot|du<|'
+            # *** Wordset EXCEPTION
+             r'catch|throw|'
+            # *** Wordset EXCEPTION-EXT
+             r'abort|abort\"|'
+            # *** Wordset FACILITY
+             r'at-xy|key\?|page|'
+            # *** Wordset FACILITY-EXT
+             r'ekey|ekey>char|ekey\?|emit\?|ms|time&date|'
+            # *** Wordset FILE
+             r'BIN|CLOSE-FILE|CREATE-FILE|DELETE-FILE|FILE-POSITION|'
+             r'FILE-SIZE|INCLUDE-FILE|INCLUDED|OPEN-FILE|R\/O|'
+             r'R\/W|READ-FILE|READ-LINE|REPOSITION-FILE|RESIZE-FILE|'
+             r'S\"|SOURCE-ID|W/O|WRITE-FILE|WRITE-LINE|'
+            # *** Wordset FILE-EXT
+             r'FILE-STATUS|FLUSH-FILE|REFILL|RENAME-FILE|'
+            # *** Wordset FLOAT
+             r'>float|d>f|'
+             r'f!|f\*|f\+|f-|f\/|f0<|f0=|f<|f>d|f@|'
+             r'falign|faligned|fconstant|fdepth|fdrop|fdup|'
+             r'fliteral|float\+|floats|floor|fmax|fmin|'
+             r'fnegate|fover|frot|fround|fswap|fvariable|'
+             r'represent|'
+            # *** Wordset FLOAT-EXT
+             r'df!|df@|dfalign|dfaligned|dfloat\+|'
+             r'dfloats|f\*\*|f\.|fabs|facos|facosh|falog|'
+             r'fasin|fasinh|fatan|fatan2|fatanh|fcos|fcosh|'
+             r'fe\.|fexp|fexpm1|fln|flnp1|flog|fs\.|fsin|'
+             r'fsincos|fsinh|fsqrt|ftan|ftanh|f~|precision|'
+             r'set-precision|sf!|sf@|sfalign|sfaligned|sfloat\+|'
+             r'sfloats|'
+            # *** Wordset LOCAL
+             r'\(local\)|to|'
+            # *** Wordset LOCAL-EXT
+             r'locals\||'
+            # *** Wordset MEMORY
+             r'allocate|free|resize|'
+            # *** Wordset SEARCH
+             r'definitions|find|forth-wordlist|get-current|'
+             r'get-order|search-wordlist|set-current|set-order|'
+             r'wordlist|'
+            # *** Wordset SEARCH-EXT
+             r'also|forth|only|order|previous|'
+            # *** Wordset STRING
+             r'-trailing|\/string|blank|cmove|cmove>|compare|'
+             r'search|sliteral|'
+            # *** Wordset TOOLS
+             r'.s|dump|see|words|'
+            # *** Wordset TOOLS-EXT
+             r';code|'
+             r'ahead|assembler|bye|code|cs-pick|cs-roll|'
+             r'editor|state|\[else\]|\[if\]|\[then\]|'
+            # *** Wordset TOOLS-EXT-obsolescent
+            r'forget|'
+            # Forth 2012
+            r'defer|defer@|defer!|action-of|begin-structure|field:|buffer:|'
+            r'parse-name|buffer:|traverse-wordlist|n>r|nr>|2value|fvalue|'
+            r'name>interpret|name>compile|name>string|'
+            r'cfield:|end-structure)'+delimiter, Keyword),
+
+            # Numbers
+            (r'(\$[0-9A-F]+)', Number.Hex),
+            (r'(\#|%|&|\-|\+)?[0-9]+', Number.Integer),
+            (r'(\#|%|&|\-|\+)?[0-9.]+', Keyword.Type),
+            # amforth specific
+            (r'(@i|!i|@e|!e|pause|noop|turnkey|sleep|'
+             r'itype|icompare|sp@|sp!|rp@|rp!|up@|up!|'
+             r'>a|a>|a@|a!|a@+|a@-|>b|b>|b@|b!|b@+|b@-|'
+             r'find-name|1ms|'
+             r'sp0|rp0|\(evaluate\)|int-trap|int!)' + delimiter,
+             Name.Constant),
+            # a proposal
+            (r'(do-recognizer|r:fail|recognizer:|get-recognizers|'
+             r'set-recognizers|r:float|r>comp|r>int|r>post|'
+             r'r:name|r:word|r:dnum|r:num|recognizer|forth-recognizer|'
+             r'rec:num|rec:float|rec:word)' + delimiter, Name.Decorator),
+            # defining words. The next word is a new command name
+            (r'(Evalue|Rvalue|Uvalue|Edefer|Rdefer|Udefer)(\s+)',
+             bygroups(Keyword.Namespace, Text), 'worddef'),
+
+            (valid_name, Name.Function),      # Anything else is executed
+
+        ],
+        'worddef': [
+            (r'\S+', Name.Class, '#pop'),
+        ],
+        'stringdef': [
+            (r'[^"]+', String, '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/fantom.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/fantom.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/fantom.py	(revision 1126)
@@ -0,0 +1,250 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.fantom
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Fantom language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from string import Template
+
+from pygments.lexer import RegexLexer, include, bygroups, using, \
+    this, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['FantomLexer']
+
+
+class FantomLexer(RegexLexer):
+    """
+    For Fantom source code.
+
+    .. versionadded:: 1.5
+    """
+    name = 'Fantom'
+    aliases = ['fan']
+    filenames = ['*.fan']
+    mimetypes = ['application/x-fantom']
+
+    # often used regexes
+    def s(str):
+        return Template(str).substitute(
+            dict(
+                pod=r'[\"\w\.]+',
+                eos=r'\n|;',
+                id=r'[a-zA-Z_]\w*',
+                # all chars which can be part of type definition. Starts with
+                # either letter, or [ (maps), or | (funcs)
+                type=r'(?:\[|[a-zA-Z_]|\|)[:\w\[\]|\->?]*?',
+            )
+        )
+
+    tokens = {
+        'comments': [
+            (r'(?s)/\*.*?\*/', Comment.Multiline),           # Multiline
+            (r'//.*?\n', Comment.Single),                    # Single line
+            # TODO: highlight references in fandocs
+            (r'\*\*.*?\n', Comment.Special),                 # Fandoc
+            (r'#.*\n', Comment.Single)                       # Shell-style
+        ],
+        'literals': [
+            (r'\b-?[\d_]+(ns|ms|sec|min|hr|day)', Number),   # Duration
+            (r'\b-?[\d_]*\.[\d_]+(ns|ms|sec|min|hr|day)', Number),  # Duration with dot
+            (r'\b-?(\d+)?\.\d+(f|F|d|D)?', Number.Float),    # Float/Decimal
+            (r'\b-?0x[0-9a-fA-F_]+', Number.Hex),            # Hex
+            (r'\b-?[\d_]+', Number.Integer),                 # Int
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),  # Char
+            (r'"', Punctuation, 'insideStr'),                # Opening quote
+            (r'`', Punctuation, 'insideUri'),                # Opening accent
+            (r'\b(true|false|null)\b', Keyword.Constant),    # Bool & null
+            (r'(?:(\w+)(::))?(\w+)(<\|)(.*?)(\|>)',          # DSL
+             bygroups(Name.Namespace, Punctuation, Name.Class,
+                      Punctuation, String, Punctuation)),
+            (r'(?:(\w+)(::))?(\w+)?(#)(\w+)?',               # Type/slot literal
+             bygroups(Name.Namespace, Punctuation, Name.Class,
+                      Punctuation, Name.Function)),
+            (r'\[,\]', Literal),                             # Empty list
+            (s(r'($type)(\[,\])'),                           # Typed empty list
+             bygroups(using(this, state='inType'), Literal)),
+            (r'\[:\]', Literal),                             # Empty Map
+            (s(r'($type)(\[:\])'),
+             bygroups(using(this, state='inType'), Literal)),
+        ],
+        'insideStr': [
+            (r'\\\\', String.Escape),                        # Escaped backslash
+            (r'\\"', String.Escape),                         # Escaped "
+            (r'\\`', String.Escape),                         # Escaped `
+            (r'\$\w+', String.Interpol),                     # Subst var
+            (r'\$\{.*?\}', String.Interpol),                 # Subst expr
+            (r'"', Punctuation, '#pop'),                     # Closing quot
+            (r'.', String)                                   # String content
+        ],
+        'insideUri': [  # TODO: remove copy/paste str/uri
+            (r'\\\\', String.Escape),                        # Escaped backslash
+            (r'\\"', String.Escape),                         # Escaped "
+            (r'\\`', String.Escape),                         # Escaped `
+            (r'\$\w+', String.Interpol),                     # Subst var
+            (r'\$\{.*?\}', String.Interpol),                 # Subst expr
+            (r'`', Punctuation, '#pop'),                     # Closing tick
+            (r'.', String.Backtick)                          # URI content
+        ],
+        'protectionKeywords': [
+            (r'\b(public|protected|private|internal)\b', Keyword),
+        ],
+        'typeKeywords': [
+            (r'\b(abstract|final|const|native|facet|enum)\b', Keyword),
+        ],
+        'methodKeywords': [
+            (r'\b(abstract|native|once|override|static|virtual|final)\b',
+             Keyword),
+        ],
+        'fieldKeywords': [
+            (r'\b(abstract|const|final|native|override|static|virtual|'
+             r'readonly)\b', Keyword)
+        ],
+        'otherKeywords': [
+            (words((
+                'try', 'catch', 'throw', 'finally', 'for', 'if', 'else', 'while',
+                'as', 'is', 'isnot', 'switch', 'case', 'default', 'continue',
+                'break', 'do', 'return', 'get', 'set'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (r'\b(it|this|super)\b', Name.Builtin.Pseudo),
+        ],
+        'operators': [
+            (r'\+\+|\-\-|\+|\-|\*|/|\|\||&&|<=>|<=|<|>=|>|=|!|\[|\]', Operator)
+        ],
+        'inType': [
+            (r'[\[\]|\->:?]', Punctuation),
+            (s(r'$id'), Name.Class),
+            default('#pop'),
+
+        ],
+        'root': [
+            include('comments'),
+            include('protectionKeywords'),
+            include('typeKeywords'),
+            include('methodKeywords'),
+            include('fieldKeywords'),
+            include('literals'),
+            include('otherKeywords'),
+            include('operators'),
+            (r'using\b', Keyword.Namespace, 'using'),         # Using stmt
+            (r'@\w+', Name.Decorator, 'facet'),               # Symbol
+            (r'(class|mixin)(\s+)(\w+)', bygroups(Keyword, Text, Name.Class),
+             'inheritance'),                                  # Inheritance list
+
+            # Type var := val
+            (s(r'($type)([ \t]+)($id)(\s*)(:=)'),
+             bygroups(using(this, state='inType'), Text,
+                      Name.Variable, Text, Operator)),
+
+            # var := val
+            (s(r'($id)(\s*)(:=)'),
+             bygroups(Name.Variable, Text, Operator)),
+
+            # .someId( or ->someId( ###
+            (s(r'(\.|(?:\->))($id)(\s*)(\()'),
+             bygroups(Operator, Name.Function, Text, Punctuation),
+             'insideParen'),
+
+            # .someId  or ->someId
+            (s(r'(\.|(?:\->))($id)'),
+             bygroups(Operator, Name.Function)),
+
+            # new makeXXX (
+            (r'(new)(\s+)(make\w*)(\s*)(\()',
+             bygroups(Keyword, Text, Name.Function, Text, Punctuation),
+             'insideMethodDeclArgs'),
+
+            # Type name (
+            (s(r'($type)([ \t]+)'  # Return type and whitespace
+               r'($id)(\s*)(\()'),  # method name + open brace
+             bygroups(using(this, state='inType'), Text,
+                      Name.Function, Text, Punctuation),
+             'insideMethodDeclArgs'),
+
+            # ArgType argName,
+            (s(r'($type)(\s+)($id)(\s*)(,)'),
+             bygroups(using(this, state='inType'), Text, Name.Variable,
+                      Text, Punctuation)),
+
+            # ArgType argName)
+            # Covered in 'insideParen' state
+
+            # ArgType argName -> ArgType|
+            (s(r'($type)(\s+)($id)(\s*)(\->)(\s*)($type)(\|)'),
+             bygroups(using(this, state='inType'), Text, Name.Variable,
+                      Text, Punctuation, Text, using(this, state='inType'),
+                      Punctuation)),
+
+            # ArgType argName|
+            (s(r'($type)(\s+)($id)(\s*)(\|)'),
+             bygroups(using(this, state='inType'), Text, Name.Variable,
+                      Text, Punctuation)),
+
+            # Type var
+            (s(r'($type)([ \t]+)($id)'),
+             bygroups(using(this, state='inType'), Text,
+                      Name.Variable)),
+
+            (r'\(', Punctuation, 'insideParen'),
+            (r'\{', Punctuation, 'insideBrace'),
+            (r'.', Text)
+        ],
+        'insideParen': [
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'insideMethodDeclArgs': [
+            (r'\)', Punctuation, '#pop'),
+            (s(r'($type)(\s+)($id)(\s*)(\))'),
+             bygroups(using(this, state='inType'), Text, Name.Variable,
+                      Text, Punctuation), '#pop'),
+            include('root'),
+        ],
+        'insideBrace': [
+            (r'\}', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'inheritance': [
+            (r'\s+', Text),                                      # Whitespace
+            (r':|,', Punctuation),
+            (r'(?:(\w+)(::))?(\w+)',
+             bygroups(Name.Namespace, Punctuation, Name.Class)),
+            (r'\{', Punctuation, '#pop')
+        ],
+        'using': [
+            (r'[ \t]+', Text),  # consume whitespaces
+            (r'(\[)(\w+)(\])',
+             bygroups(Punctuation, Comment.Special, Punctuation)),  # ffi
+            (r'(\")?([\w.]+)(\")?',
+             bygroups(Punctuation, Name.Namespace, Punctuation)),  # podname
+            (r'::', Punctuation, 'usingClass'),
+            default('#pop')
+        ],
+        'usingClass': [
+            (r'[ \t]+', Text),  # consume whitespaces
+            (r'(as)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Text, Name.Class), '#pop:2'),
+            (r'[\w$]+', Name.Class),
+            default('#pop:2')  # jump out to root state
+        ],
+        'facet': [
+            (r'\s+', Text),
+            (r'\{', Punctuation, 'facetFields'),
+            default('#pop')
+        ],
+        'facetFields': [
+            include('comments'),
+            include('literals'),
+            include('operators'),
+            (r'\s+', Text),
+            (r'(\s*)(\w+)(\s*)(=)', bygroups(Text, Name, Text, Operator)),
+            (r'\}', Punctuation, '#pop'),
+            (r'.', Text)
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/math.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/math.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/math.py	(revision 1126)
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.math
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexers that were contained in this module.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexers.python import NumPyLexer
+from pygments.lexers.matlab import MatlabLexer, MatlabSessionLexer, \
+    OctaveLexer, ScilabLexer
+from pygments.lexers.julia import JuliaLexer, JuliaConsoleLexer
+from pygments.lexers.r import RConsoleLexer, SLexer, RdLexer
+from pygments.lexers.modeling import BugsLexer, JagsLexer, StanLexer
+from pygments.lexers.idl import IDLLexer
+from pygments.lexers.algebra import MuPADLexer
+
+__all__ = []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ampl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ampl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ampl.py	(revision 1126)
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ampl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the ampl language. <http://ampl.com/>
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, using, this, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['AmplLexer']
+
+
+class AmplLexer(RegexLexer):
+    """
+    For AMPL source code.
+
+    .. versionadded:: 2.2
+    """
+    name = 'Ampl'
+    aliases = ['ampl']
+    filenames = ['*.run']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text.Whitespace),
+            (r'#.*?\n', Comment.Single),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (words((
+                'call', 'cd', 'close', 'commands', 'data', 'delete', 'display',
+                'drop', 'end', 'environ', 'exit', 'expand', 'include', 'load',
+                'model', 'objective', 'option', 'problem', 'purge', 'quit',
+                'redeclare', 'reload', 'remove', 'reset', 'restore', 'shell',
+                'show', 'solexpand', 'solution', 'solve', 'update', 'unload',
+                'xref', 'coeff', 'coef', 'cover', 'obj', 'interval', 'default',
+                'from', 'to', 'to_come', 'net_in', 'net_out', 'dimen',
+                'dimension', 'check', 'complements', 'write', 'function',
+                'pipe', 'format', 'if', 'then', 'else', 'in', 'while', 'repeat',
+                'for'), suffix=r'\b'), Keyword.Reserved),
+            (r'(integer|binary|symbolic|ordered|circular|reversed|INOUT|IN|OUT|LOCAL)',
+             Keyword.Type),
+            (r'\".*?\"', String.Double),
+            (r'\'.*?\'', String.Single),
+            (r'[()\[\]{},;:]+', Punctuation),
+            (r'\b(\w+)(\.)(astatus|init0|init|lb0|lb1|lb2|lb|lrc|'
+             r'lslack|rc|relax|slack|sstatus|status|ub0|ub1|ub2|'
+             r'ub|urc|uslack|val)',
+             bygroups(Name.Variable, Punctuation, Keyword.Reserved)),
+            (r'(set|param|var|arc|minimize|maximize|subject to|s\.t\.|subj to|'
+             r'node|table|suffix|read table|write table)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Text, Name.Variable)),
+            (r'(param)(\s*)(:)(\s*)(\w+)(\s*)(:)(\s*)((\w|\s)+)',
+             bygroups(Keyword.Declaration, Text, Punctuation, Text,
+                      Name.Variable, Text, Punctuation, Text, Name.Variable)),
+            (r'(let|fix|unfix)(\s*)((?:\{.*\})?)(\s*)(\w+)',
+             bygroups(Keyword.Declaration, Text, using(this), Text, Name.Variable)),
+            (words((
+                'abs', 'acos', 'acosh', 'alias', 'asin', 'asinh', 'atan', 'atan2',
+                'atanh', 'ceil', 'ctime', 'cos', 'exp', 'floor', 'log', 'log10',
+                'max', 'min', 'precision', 'round', 'sin', 'sinh', 'sqrt', 'tan',
+                'tanh', 'time', 'trunc', 'Beta', 'Cauchy', 'Exponential', 'Gamma',
+                'Irand224', 'Normal', 'Normal01', 'Poisson', 'Uniform', 'Uniform01',
+                'num', 'num0', 'ichar', 'char', 'length', 'substr', 'sprintf',
+                'match', 'sub', 'gsub', 'print', 'printf', 'next', 'nextw', 'prev',
+                'prevw', 'first', 'last', 'ord', 'ord0', 'card', 'arity',
+                'indexarity'), prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (r'(\+|\-|\*|/|\*\*|=|<=|>=|==|\||\^|<|>|\!|\.\.|:=|\&|\!=|<<|>>)',
+             Operator),
+            (words((
+                'or', 'exists', 'forall', 'and', 'in', 'not', 'within', 'union',
+                'diff', 'difference', 'symdiff', 'inter', 'intersect',
+                'intersection', 'cross', 'setof', 'by', 'less', 'sum', 'prod',
+                'product', 'div', 'mod'), suffix=r'\b'),
+             Keyword.Reserved),  # Operator.Name but not enough emphasized with that
+            (r'(\d+\.(?!\.)\d*|\.(?!.)\d+)([eE][+-]?\d+)?', Number.Float),
+            (r'\d+([eE][+-]?\d+)?', Number.Integer),
+            (r'[+-]?Infinity', Number.Integer),
+            (r'(\w+|(\.(?!\.)))', Text)
+        ]
+
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_lasso_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_lasso_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_lasso_builtins.py	(revision 1126)
@@ -0,0 +1,5327 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._lasso_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Built-in Lasso types, traits, methods, and members.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+BUILTINS = {
+    'Types': (
+        'array',
+        'atbegin',
+        'boolean',
+        'bson_iter',
+        'bson',
+        'bytes_document_body',
+        'bytes',
+        'cache_server_element',
+        'cache_server',
+        'capture',
+        'client_address',
+        'client_ip',
+        'component_container',
+        'component_render_state',
+        'component',
+        'curl',
+        'curltoken',
+        'currency',
+        'custom',
+        'data_document',
+        'database_registry',
+        'date',
+        'dateandtime',
+        'dbgp_packet',
+        'dbgp_server',
+        'debugging_stack',
+        'decimal',
+        'delve',
+        'dir',
+        'dirdesc',
+        'dns_response',
+        'document_base',
+        'document_body',
+        'document_header',
+        'dsinfo',
+        'duration',
+        'eacher',
+        'email_compose',
+        'email_parse',
+        'email_pop',
+        'email_queue_impl_base',
+        'email_queue_impl',
+        'email_smtp',
+        'email_stage_impl_base',
+        'email_stage_impl',
+        'fastcgi_each_fcgi_param',
+        'fastcgi_server',
+        'fcgi_record',
+        'fcgi_request',
+        'file',
+        'filedesc',
+        'filemaker_datasource',
+        'generateforeachkeyed',
+        'generateforeachunkeyed',
+        'generateseries',
+        'hash_map',
+        'html_atomic_element',
+        'html_attr',
+        'html_base',
+        'html_binary',
+        'html_br',
+        'html_cdata',
+        'html_container_element',
+        'html_div',
+        'html_document_body',
+        'html_document_head',
+        'html_eol',
+        'html_fieldset',
+        'html_form',
+        'html_h1',
+        'html_h2',
+        'html_h3',
+        'html_h4',
+        'html_h5',
+        'html_h6',
+        'html_hr',
+        'html_img',
+        'html_input',
+        'html_json',
+        'html_label',
+        'html_legend',
+        'html_link',
+        'html_meta',
+        'html_object',
+        'html_option',
+        'html_raw',
+        'html_script',
+        'html_select',
+        'html_span',
+        'html_style',
+        'html_table',
+        'html_td',
+        'html_text',
+        'html_th',
+        'html_tr',
+        'http_document_header',
+        'http_document',
+        'http_error',
+        'http_header_field',
+        'http_server_connection_handler_globals',
+        'http_server_connection_handler',
+        'http_server_request_logger_thread',
+        'http_server_web_connection',
+        'http_server',
+        'image',
+        'include_cache',
+        'inline_type',
+        'integer',
+        'java_jnienv',
+        'jbyte',
+        'jbytearray',
+        'jchar',
+        'jchararray',
+        'jfieldid',
+        'jfloat',
+        'jint',
+        'jmethodid',
+        'jobject',
+        'jshort',
+        'json_decode',
+        'json_encode',
+        'json_literal',
+        'json_object',
+        'keyword',
+        'lassoapp_compiledsrc_appsource',
+        'lassoapp_compiledsrc_fileresource',
+        'lassoapp_content_rep_halt',
+        'lassoapp_dirsrc_appsource',
+        'lassoapp_dirsrc_fileresource',
+        'lassoapp_installer',
+        'lassoapp_livesrc_appsource',
+        'lassoapp_livesrc_fileresource',
+        'lassoapp_long_expiring_bytes',
+        'lassoapp_manualsrc_appsource',
+        'lassoapp_zip_file_server',
+        'lassoapp_zipsrc_appsource',
+        'lassoapp_zipsrc_fileresource',
+        'ldap',
+        'library_thread_loader',
+        'list_node',
+        'list',
+        'locale',
+        'log_impl_base',
+        'log_impl',
+        'magick_image',
+        'map_node',
+        'map',
+        'memberstream',
+        'memory_session_driver_impl_entry',
+        'memory_session_driver_impl',
+        'memory_session_driver',
+        'mime_reader',
+        'mongo_client',
+        'mongo_collection',
+        'mongo_cursor',
+        'mustache_ctx',
+        'mysql_session_driver_impl',
+        'mysql_session_driver',
+        'net_named_pipe',
+        'net_tcp_ssl',
+        'net_tcp',
+        'net_udp_packet',
+        'net_udp',
+        'null',
+        'odbc_session_driver_impl',
+        'odbc_session_driver',
+        'opaque',
+        'os_process',
+        'pair_compare',
+        'pair',
+        'pairup',
+        'pdf_barcode',
+        'pdf_chunk',
+        'pdf_color',
+        'pdf_doc',
+        'pdf_font',
+        'pdf_hyphenator',
+        'pdf_image',
+        'pdf_list',
+        'pdf_paragraph',
+        'pdf_phrase',
+        'pdf_read',
+        'pdf_table',
+        'pdf_text',
+        'pdf_typebase',
+        'percent',
+        'portal_impl',
+        'queriable_groupby',
+        'queriable_grouping',
+        'queriable_groupjoin',
+        'queriable_join',
+        'queriable_orderby',
+        'queriable_orderbydescending',
+        'queriable_select',
+        'queriable_selectmany',
+        'queriable_skip',
+        'queriable_take',
+        'queriable_thenby',
+        'queriable_thenbydescending',
+        'queriable_where',
+        'queue',
+        'raw_document_body',
+        'regexp',
+        'repeat',
+        'scientific',
+        'security_registry',
+        'serialization_element',
+        'serialization_object_identity_compare',
+        'serialization_reader',
+        'serialization_writer_ref',
+        'serialization_writer_standin',
+        'serialization_writer',
+        'session_delete_expired_thread',
+        'set',
+        'signature',
+        'sourcefile',
+        'sqlite_column',
+        'sqlite_currentrow',
+        'sqlite_db',
+        'sqlite_results',
+        'sqlite_session_driver_impl_entry',
+        'sqlite_session_driver_impl',
+        'sqlite_session_driver',
+        'sqlite_table',
+        'sqlite3_stmt',
+        'sqlite3',
+        'staticarray',
+        'string',
+        'sys_process',
+        'tag',
+        'text_document',
+        'tie',
+        'timeonly',
+        'trait',
+        'tree_base',
+        'tree_node',
+        'tree_nullnode',
+        'ucal',
+        'usgcpu',
+        'usgvm',
+        'void',
+        'web_error_atend',
+        'web_node_base',
+        'web_node_content_representation_css_specialized',
+        'web_node_content_representation_html_specialized',
+        'web_node_content_representation_js_specialized',
+        'web_node_content_representation_xhr_container',
+        'web_node_echo',
+        'web_node_root',
+        'web_request_impl',
+        'web_request',
+        'web_response_impl',
+        'web_response',
+        'web_router',
+        'websocket_handler',
+        'worker_pool',
+        'xml_attr',
+        'xml_cdatasection',
+        'xml_characterdata',
+        'xml_comment',
+        'xml_document',
+        'xml_documentfragment',
+        'xml_documenttype',
+        'xml_domimplementation',
+        'xml_element',
+        'xml_entity',
+        'xml_entityreference',
+        'xml_namednodemap_attr',
+        'xml_namednodemap_ht',
+        'xml_namednodemap',
+        'xml_node',
+        'xml_nodelist',
+        'xml_notation',
+        'xml_processinginstruction',
+        'xml_text',
+        'xmlstream',
+        'zip_file_impl',
+        'zip_file',
+        'zip_impl',
+        'zip',
+    ),
+    'Traits': (
+        'any',
+        'formattingbase',
+        'html_attributed',
+        'html_element_coreattrs',
+        'html_element_eventsattrs',
+        'html_element_i18nattrs',
+        'lassoapp_capabilities',
+        'lassoapp_resource',
+        'lassoapp_source',
+        'queriable_asstring',
+        'session_driver',
+        'trait_array',
+        'trait_asstring',
+        'trait_backcontractible',
+        'trait_backended',
+        'trait_backexpandable',
+        'trait_close',
+        'trait_contractible',
+        'trait_decompose_assignment',
+        'trait_doubleended',
+        'trait_each_sub',
+        'trait_encodeurl',
+        'trait_endedfullymutable',
+        'trait_expandable',
+        'trait_file',
+        'trait_finite',
+        'trait_finiteforeach',
+        'trait_foreach',
+        'trait_foreachtextelement',
+        'trait_frontcontractible',
+        'trait_frontended',
+        'trait_frontexpandable',
+        'trait_fullymutable',
+        'trait_generator',
+        'trait_generatorcentric',
+        'trait_hashable',
+        'trait_json_serialize',
+        'trait_keyed',
+        'trait_keyedfinite',
+        'trait_keyedforeach',
+        'trait_keyedmutable',
+        'trait_list',
+        'trait_map',
+        'trait_net',
+        'trait_pathcomponents',
+        'trait_positionallykeyed',
+        'trait_positionallysearchable',
+        'trait_queriable',
+        'trait_queriablelambda',
+        'trait_readbytes',
+        'trait_readstring',
+        'trait_scalar',
+        'trait_searchable',
+        'trait_serializable',
+        'trait_setencoding',
+        'trait_setoperations',
+        'trait_stack',
+        'trait_treenode',
+        'trait_writebytes',
+        'trait_writestring',
+        'trait_xml_elementcompat',
+        'trait_xml_nodecompat',
+        'web_connection',
+        'web_node_container',
+        'web_node_content_css_specialized',
+        'web_node_content_document',
+        'web_node_content_html_specialized',
+        'web_node_content_js_specialized',
+        'web_node_content_json_specialized',
+        'web_node_content_representation',
+        'web_node_content',
+        'web_node_postable',
+        'web_node',
+    ),
+    'Unbound Methods': (
+        'abort_clear',
+        'abort_now',
+        'abort',
+        'action_param',
+        'action_params',
+        'action_statement',
+        'admin_authorization',
+        'admin_currentgroups',
+        'admin_currentuserid',
+        'admin_currentusername',
+        'admin_getpref',
+        'admin_initialize',
+        'admin_lassoservicepath',
+        'admin_removepref',
+        'admin_setpref',
+        'admin_userexists',
+        'all',
+        'auth_admin',
+        'auth_check',
+        'auth_custom',
+        'auth_group',
+        'auth_prompt',
+        'auth_user',
+        'bom_utf16be',
+        'bom_utf16le',
+        'bom_utf32be',
+        'bom_utf32le',
+        'bom_utf8',
+        'bw',
+        'capture_nearestloopabort',
+        'capture_nearestloopcontinue',
+        'capture_nearestloopcount',
+        'checked',
+        'cipher_decrypt_private',
+        'cipher_decrypt_public',
+        'cipher_decrypt',
+        'cipher_digest',
+        'cipher_encrypt_private',
+        'cipher_encrypt_public',
+        'cipher_encrypt',
+        'cipher_generate_key',
+        'cipher_hmac',
+        'cipher_keylength',
+        'cipher_list',
+        'cipher_open',
+        'cipher_seal',
+        'cipher_sign',
+        'cipher_verify',
+        'client_addr',
+        'client_authorization',
+        'client_browser',
+        'client_contentlength',
+        'client_contenttype',
+        'client_cookielist',
+        'client_cookies',
+        'client_encoding',
+        'client_formmethod',
+        'client_getargs',
+        'client_getparam',
+        'client_getparams',
+        'client_headers',
+        'client_integertoip',
+        'client_iptointeger',
+        'client_password',
+        'client_postargs',
+        'client_postparam',
+        'client_postparams',
+        'client_type',
+        'client_url',
+        'client_username',
+        'cn',
+        'column_name',
+        'column_names',
+        'column_type',
+        'column',
+        'compress',
+        'content_addheader',
+        'content_body',
+        'content_encoding',
+        'content_header',
+        'content_replaceheader',
+        'content_type',
+        'cookie_set',
+        'cookie',
+        'curl_easy_cleanup',
+        'curl_easy_duphandle',
+        'curl_easy_getinfo',
+        'curl_easy_init',
+        'curl_easy_reset',
+        'curl_easy_setopt',
+        'curl_easy_strerror',
+        'curl_getdate',
+        'curl_http_version_1_0',
+        'curl_http_version_1_1',
+        'curl_http_version_none',
+        'curl_ipresolve_v4',
+        'curl_ipresolve_v6',
+        'curl_ipresolve_whatever',
+        'curl_multi_perform',
+        'curl_multi_result',
+        'curl_netrc_ignored',
+        'curl_netrc_optional',
+        'curl_netrc_required',
+        'curl_sslversion_default',
+        'curl_sslversion_sslv2',
+        'curl_sslversion_sslv3',
+        'curl_sslversion_tlsv1',
+        'curl_version_asynchdns',
+        'curl_version_debug',
+        'curl_version_gssnegotiate',
+        'curl_version_idn',
+        'curl_version_info',
+        'curl_version_ipv6',
+        'curl_version_kerberos4',
+        'curl_version_largefile',
+        'curl_version_libz',
+        'curl_version_ntlm',
+        'curl_version_spnego',
+        'curl_version_ssl',
+        'curl_version',
+        'curlauth_any',
+        'curlauth_anysafe',
+        'curlauth_basic',
+        'curlauth_digest',
+        'curlauth_gssnegotiate',
+        'curlauth_none',
+        'curlauth_ntlm',
+        'curle_aborted_by_callback',
+        'curle_bad_calling_order',
+        'curle_bad_content_encoding',
+        'curle_bad_download_resume',
+        'curle_bad_function_argument',
+        'curle_bad_password_entered',
+        'curle_couldnt_connect',
+        'curle_couldnt_resolve_host',
+        'curle_couldnt_resolve_proxy',
+        'curle_failed_init',
+        'curle_file_couldnt_read_file',
+        'curle_filesize_exceeded',
+        'curle_ftp_access_denied',
+        'curle_ftp_cant_get_host',
+        'curle_ftp_cant_reconnect',
+        'curle_ftp_couldnt_get_size',
+        'curle_ftp_couldnt_retr_file',
+        'curle_ftp_couldnt_set_ascii',
+        'curle_ftp_couldnt_set_binary',
+        'curle_ftp_couldnt_use_rest',
+        'curle_ftp_port_failed',
+        'curle_ftp_quote_error',
+        'curle_ftp_ssl_failed',
+        'curle_ftp_user_password_incorrect',
+        'curle_ftp_weird_227_format',
+        'curle_ftp_weird_pass_reply',
+        'curle_ftp_weird_pasv_reply',
+        'curle_ftp_weird_server_reply',
+        'curle_ftp_weird_user_reply',
+        'curle_ftp_write_error',
+        'curle_function_not_found',
+        'curle_got_nothing',
+        'curle_http_post_error',
+        'curle_http_range_error',
+        'curle_http_returned_error',
+        'curle_interface_failed',
+        'curle_ldap_cannot_bind',
+        'curle_ldap_invalid_url',
+        'curle_ldap_search_failed',
+        'curle_library_not_found',
+        'curle_login_denied',
+        'curle_malformat_user',
+        'curle_obsolete',
+        'curle_ok',
+        'curle_operation_timeouted',
+        'curle_out_of_memory',
+        'curle_partial_file',
+        'curle_read_error',
+        'curle_recv_error',
+        'curle_send_error',
+        'curle_send_fail_rewind',
+        'curle_share_in_use',
+        'curle_ssl_cacert',
+        'curle_ssl_certproblem',
+        'curle_ssl_cipher',
+        'curle_ssl_connect_error',
+        'curle_ssl_engine_initfailed',
+        'curle_ssl_engine_notfound',
+        'curle_ssl_engine_setfailed',
+        'curle_ssl_peer_certificate',
+        'curle_telnet_option_syntax',
+        'curle_too_many_redirects',
+        'curle_unknown_telnet_option',
+        'curle_unsupported_protocol',
+        'curle_url_malformat_user',
+        'curle_url_malformat',
+        'curle_write_error',
+        'curlftpauth_default',
+        'curlftpauth_ssl',
+        'curlftpauth_tls',
+        'curlftpssl_all',
+        'curlftpssl_control',
+        'curlftpssl_last',
+        'curlftpssl_none',
+        'curlftpssl_try',
+        'curlinfo_connect_time',
+        'curlinfo_content_length_download',
+        'curlinfo_content_length_upload',
+        'curlinfo_content_type',
+        'curlinfo_effective_url',
+        'curlinfo_filetime',
+        'curlinfo_header_size',
+        'curlinfo_http_connectcode',
+        'curlinfo_httpauth_avail',
+        'curlinfo_namelookup_time',
+        'curlinfo_num_connects',
+        'curlinfo_os_errno',
+        'curlinfo_pretransfer_time',
+        'curlinfo_proxyauth_avail',
+        'curlinfo_redirect_count',
+        'curlinfo_redirect_time',
+        'curlinfo_request_size',
+        'curlinfo_response_code',
+        'curlinfo_size_download',
+        'curlinfo_size_upload',
+        'curlinfo_speed_download',
+        'curlinfo_speed_upload',
+        'curlinfo_ssl_engines',
+        'curlinfo_ssl_verifyresult',
+        'curlinfo_starttransfer_time',
+        'curlinfo_total_time',
+        'curlmsg_done',
+        'curlopt_autoreferer',
+        'curlopt_buffersize',
+        'curlopt_cainfo',
+        'curlopt_capath',
+        'curlopt_connecttimeout',
+        'curlopt_cookie',
+        'curlopt_cookiefile',
+        'curlopt_cookiejar',
+        'curlopt_cookiesession',
+        'curlopt_crlf',
+        'curlopt_customrequest',
+        'curlopt_dns_use_global_cache',
+        'curlopt_egdsocket',
+        'curlopt_encoding',
+        'curlopt_failonerror',
+        'curlopt_filetime',
+        'curlopt_followlocation',
+        'curlopt_forbid_reuse',
+        'curlopt_fresh_connect',
+        'curlopt_ftp_account',
+        'curlopt_ftp_create_missing_dirs',
+        'curlopt_ftp_response_timeout',
+        'curlopt_ftp_ssl',
+        'curlopt_ftp_use_eprt',
+        'curlopt_ftp_use_epsv',
+        'curlopt_ftpappend',
+        'curlopt_ftplistonly',
+        'curlopt_ftpport',
+        'curlopt_ftpsslauth',
+        'curlopt_header',
+        'curlopt_http_version',
+        'curlopt_http200aliases',
+        'curlopt_httpauth',
+        'curlopt_httpget',
+        'curlopt_httpheader',
+        'curlopt_httppost',
+        'curlopt_httpproxytunnel',
+        'curlopt_infilesize_large',
+        'curlopt_infilesize',
+        'curlopt_interface',
+        'curlopt_ipresolve',
+        'curlopt_krb4level',
+        'curlopt_low_speed_limit',
+        'curlopt_low_speed_time',
+        'curlopt_mail_from',
+        'curlopt_mail_rcpt',
+        'curlopt_maxconnects',
+        'curlopt_maxfilesize_large',
+        'curlopt_maxfilesize',
+        'curlopt_maxredirs',
+        'curlopt_netrc_file',
+        'curlopt_netrc',
+        'curlopt_nobody',
+        'curlopt_noprogress',
+        'curlopt_port',
+        'curlopt_post',
+        'curlopt_postfields',
+        'curlopt_postfieldsize_large',
+        'curlopt_postfieldsize',
+        'curlopt_postquote',
+        'curlopt_prequote',
+        'curlopt_proxy',
+        'curlopt_proxyauth',
+        'curlopt_proxyport',
+        'curlopt_proxytype',
+        'curlopt_proxyuserpwd',
+        'curlopt_put',
+        'curlopt_quote',
+        'curlopt_random_file',
+        'curlopt_range',
+        'curlopt_readdata',
+        'curlopt_referer',
+        'curlopt_resume_from_large',
+        'curlopt_resume_from',
+        'curlopt_ssl_cipher_list',
+        'curlopt_ssl_verifyhost',
+        'curlopt_ssl_verifypeer',
+        'curlopt_sslcert',
+        'curlopt_sslcerttype',
+        'curlopt_sslengine_default',
+        'curlopt_sslengine',
+        'curlopt_sslkey',
+        'curlopt_sslkeypasswd',
+        'curlopt_sslkeytype',
+        'curlopt_sslversion',
+        'curlopt_tcp_nodelay',
+        'curlopt_timecondition',
+        'curlopt_timeout',
+        'curlopt_timevalue',
+        'curlopt_transfertext',
+        'curlopt_unrestricted_auth',
+        'curlopt_upload',
+        'curlopt_url',
+        'curlopt_use_ssl',
+        'curlopt_useragent',
+        'curlopt_userpwd',
+        'curlopt_verbose',
+        'curlopt_writedata',
+        'curlproxy_http',
+        'curlproxy_socks4',
+        'curlproxy_socks5',
+        'database_adddefaultsqlitehost',
+        'database_database',
+        'database_initialize',
+        'database_name',
+        'database_qs',
+        'database_table_database_tables',
+        'database_table_datasource_databases',
+        'database_table_datasource_hosts',
+        'database_table_datasources',
+        'database_table_table_fields',
+        'database_util_cleanpath',
+        'dbgp_stop_stack_name',
+        'debugging_break',
+        'debugging_breakpoint_get',
+        'debugging_breakpoint_list',
+        'debugging_breakpoint_remove',
+        'debugging_breakpoint_set',
+        'debugging_breakpoint_update',
+        'debugging_context_locals',
+        'debugging_context_self',
+        'debugging_context_vars',
+        'debugging_detach',
+        'debugging_enabled',
+        'debugging_get_context',
+        'debugging_get_stack',
+        'debugging_run',
+        'debugging_step_in',
+        'debugging_step_out',
+        'debugging_step_over',
+        'debugging_stop',
+        'debugging_terminate',
+        'decimal_random',
+        'decompress',
+        'decrypt_blowfish',
+        'define_atbegin',
+        'define_atend',
+        'dns_default',
+        'dns_lookup',
+        'document',
+        'email_attachment_mime_type',
+        'email_batch',
+        'email_digestchallenge',
+        'email_digestresponse',
+        'email_extract',
+        'email_findemails',
+        'email_fix_address_list',
+        'email_fix_address',
+        'email_fs_error_clean',
+        'email_immediate',
+        'email_initialize',
+        'email_merge',
+        'email_mxlookup',
+        'email_pop_priv_extract',
+        'email_pop_priv_quote',
+        'email_pop_priv_substring',
+        'email_queue',
+        'email_result',
+        'email_safeemail',
+        'email_send',
+        'email_status',
+        'email_token',
+        'email_translatebreakstocrlf',
+        'encode_qheader',
+        'encoding_iso88591',
+        'encoding_utf8',
+        'encrypt_blowfish',
+        'encrypt_crammd5',
+        'encrypt_hmac',
+        'encrypt_md5',
+        'eol',
+        'eq',
+        'error_code_aborted',
+        'error_code_dividebyzero',
+        'error_code_filenotfound',
+        'error_code_invalidparameter',
+        'error_code_methodnotfound',
+        'error_code_networkerror',
+        'error_code_noerror',
+        'error_code_resnotfound',
+        'error_code_runtimeassertion',
+        'error_code',
+        'error_msg_aborted',
+        'error_msg_dividebyzero',
+        'error_msg_filenotfound',
+        'error_msg_invalidparameter',
+        'error_msg_methodnotfound',
+        'error_msg_networkerror',
+        'error_msg_noerror',
+        'error_msg_resnotfound',
+        'error_msg_runtimeassertion',
+        'error_msg',
+        'error_obj',
+        'error_pop',
+        'error_push',
+        'error_reset',
+        'error_stack',
+        'escape_tag',
+        'evdns_resolve_ipv4',
+        'evdns_resolve_ipv6',
+        'evdns_resolve_reverse_ipv6',
+        'evdns_resolve_reverse',
+        'ew',
+        'fail_if',
+        'fail_ifnot',
+        'fail_now',
+        'fail',
+        'failure_clear',
+        'fastcgi_createfcgirequest',
+        'fastcgi_handlecon',
+        'fastcgi_handlereq',
+        'fastcgi_initialize',
+        'fastcgi_initiate_request',
+        'fcgi_abort_request',
+        'fcgi_authorize',
+        'fcgi_begin_request',
+        'fcgi_bodychunksize',
+        'fcgi_cant_mpx_conn',
+        'fcgi_data',
+        'fcgi_end_request',
+        'fcgi_filter',
+        'fcgi_get_values_result',
+        'fcgi_get_values',
+        'fcgi_keep_conn',
+        'fcgi_makeendrequestbody',
+        'fcgi_makestdoutbody',
+        'fcgi_max_conns',
+        'fcgi_max_reqs',
+        'fcgi_mpxs_conns',
+        'fcgi_null_request_id',
+        'fcgi_overloaded',
+        'fcgi_params',
+        'fcgi_read_timeout_seconds',
+        'fcgi_readparam',
+        'fcgi_request_complete',
+        'fcgi_responder',
+        'fcgi_stderr',
+        'fcgi_stdin',
+        'fcgi_stdout',
+        'fcgi_unknown_role',
+        'fcgi_unknown_type',
+        'fcgi_version_1',
+        'fcgi_x_stdin',
+        'field_name',
+        'field_names',
+        'field',
+        'file_copybuffersize',
+        'file_defaultencoding',
+        'file_forceroot',
+        'file_modechar',
+        'file_modeline',
+        'file_stderr',
+        'file_stdin',
+        'file_stdout',
+        'file_tempfile',
+        'filemakerds_initialize',
+        'filemakerds',
+        'found_count',
+        'ft',
+        'ftp_deletefile',
+        'ftp_getdata',
+        'ftp_getfile',
+        'ftp_getlisting',
+        'ftp_putdata',
+        'ftp_putfile',
+        'full',
+        'generateforeach',
+        'gt',
+        'gte',
+        'handle_failure',
+        'handle',
+        'hash_primes',
+        'html_comment',
+        'http_char_colon',
+        'http_char_cr',
+        'http_char_htab',
+        'http_char_lf',
+        'http_char_question',
+        'http_char_space',
+        'http_default_files',
+        'http_read_headers',
+        'http_read_timeout_secs',
+        'http_server_apps_path',
+        'http_server_request_logger',
+        'if_empty',
+        'if_false',
+        'if_null',
+        'if_true',
+        'include_cache_compare',
+        'include_currentpath',
+        'include_filepath',
+        'include_localpath',
+        'include_once',
+        'include_path',
+        'include_raw',
+        'include_url',
+        'include',
+        'includes',
+        'inline_colinfo_name_pos',
+        'inline_colinfo_type_pos',
+        'inline_colinfo_valuelist_pos',
+        'inline_columninfo_pos',
+        'inline_foundcount_pos',
+        'inline_namedget',
+        'inline_namedput',
+        'inline_resultrows_pos',
+        'inline_scopeget',
+        'inline_scopepop',
+        'inline_scopepush',
+        'inline',
+        'integer_bitor',
+        'integer_random',
+        'io_dir_dt_blk',
+        'io_dir_dt_chr',
+        'io_dir_dt_dir',
+        'io_dir_dt_fifo',
+        'io_dir_dt_lnk',
+        'io_dir_dt_reg',
+        'io_dir_dt_sock',
+        'io_dir_dt_unknown',
+        'io_dir_dt_wht',
+        'io_file_access',
+        'io_file_chdir',
+        'io_file_chmod',
+        'io_file_chown',
+        'io_file_dirname',
+        'io_file_f_dupfd',
+        'io_file_f_getfd',
+        'io_file_f_getfl',
+        'io_file_f_getlk',
+        'io_file_f_rdlck',
+        'io_file_f_setfd',
+        'io_file_f_setfl',
+        'io_file_f_setlk',
+        'io_file_f_setlkw',
+        'io_file_f_test',
+        'io_file_f_tlock',
+        'io_file_f_ulock',
+        'io_file_f_unlck',
+        'io_file_f_wrlck',
+        'io_file_fd_cloexec',
+        'io_file_fioasync',
+        'io_file_fioclex',
+        'io_file_fiodtype',
+        'io_file_fiogetown',
+        'io_file_fionbio',
+        'io_file_fionclex',
+        'io_file_fionread',
+        'io_file_fiosetown',
+        'io_file_getcwd',
+        'io_file_lchown',
+        'io_file_link',
+        'io_file_lockf',
+        'io_file_lstat_atime',
+        'io_file_lstat_mode',
+        'io_file_lstat_mtime',
+        'io_file_lstat_size',
+        'io_file_mkdir',
+        'io_file_mkfifo',
+        'io_file_mkstemp',
+        'io_file_o_append',
+        'io_file_o_async',
+        'io_file_o_creat',
+        'io_file_o_excl',
+        'io_file_o_exlock',
+        'io_file_o_fsync',
+        'io_file_o_nofollow',
+        'io_file_o_nonblock',
+        'io_file_o_rdonly',
+        'io_file_o_rdwr',
+        'io_file_o_shlock',
+        'io_file_o_sync',
+        'io_file_o_trunc',
+        'io_file_o_wronly',
+        'io_file_pipe',
+        'io_file_readlink',
+        'io_file_realpath',
+        'io_file_remove',
+        'io_file_rename',
+        'io_file_rmdir',
+        'io_file_s_ifblk',
+        'io_file_s_ifchr',
+        'io_file_s_ifdir',
+        'io_file_s_ififo',
+        'io_file_s_iflnk',
+        'io_file_s_ifmt',
+        'io_file_s_ifreg',
+        'io_file_s_ifsock',
+        'io_file_s_irgrp',
+        'io_file_s_iroth',
+        'io_file_s_irusr',
+        'io_file_s_irwxg',
+        'io_file_s_irwxo',
+        'io_file_s_irwxu',
+        'io_file_s_isgid',
+        'io_file_s_isuid',
+        'io_file_s_isvtx',
+        'io_file_s_iwgrp',
+        'io_file_s_iwoth',
+        'io_file_s_iwusr',
+        'io_file_s_ixgrp',
+        'io_file_s_ixoth',
+        'io_file_s_ixusr',
+        'io_file_seek_cur',
+        'io_file_seek_end',
+        'io_file_seek_set',
+        'io_file_stat_atime',
+        'io_file_stat_mode',
+        'io_file_stat_mtime',
+        'io_file_stat_size',
+        'io_file_stderr',
+        'io_file_stdin',
+        'io_file_stdout',
+        'io_file_symlink',
+        'io_file_tempnam',
+        'io_file_truncate',
+        'io_file_umask',
+        'io_file_unlink',
+        'io_net_accept',
+        'io_net_af_inet',
+        'io_net_af_inet6',
+        'io_net_af_unix',
+        'io_net_bind',
+        'io_net_connect',
+        'io_net_getpeername',
+        'io_net_getsockname',
+        'io_net_ipproto_ip',
+        'io_net_ipproto_udp',
+        'io_net_listen',
+        'io_net_msg_oob',
+        'io_net_msg_peek',
+        'io_net_msg_waitall',
+        'io_net_recv',
+        'io_net_recvfrom',
+        'io_net_send',
+        'io_net_sendto',
+        'io_net_shut_rd',
+        'io_net_shut_rdwr',
+        'io_net_shut_wr',
+        'io_net_shutdown',
+        'io_net_so_acceptconn',
+        'io_net_so_broadcast',
+        'io_net_so_debug',
+        'io_net_so_dontroute',
+        'io_net_so_error',
+        'io_net_so_keepalive',
+        'io_net_so_linger',
+        'io_net_so_oobinline',
+        'io_net_so_rcvbuf',
+        'io_net_so_rcvlowat',
+        'io_net_so_rcvtimeo',
+        'io_net_so_reuseaddr',
+        'io_net_so_sndbuf',
+        'io_net_so_sndlowat',
+        'io_net_so_sndtimeo',
+        'io_net_so_timestamp',
+        'io_net_so_type',
+        'io_net_so_useloopback',
+        'io_net_sock_dgram',
+        'io_net_sock_raw',
+        'io_net_sock_rdm',
+        'io_net_sock_seqpacket',
+        'io_net_sock_stream',
+        'io_net_socket',
+        'io_net_sol_socket',
+        'io_net_ssl_accept',
+        'io_net_ssl_begin',
+        'io_net_ssl_connect',
+        'io_net_ssl_end',
+        'io_net_ssl_error',
+        'io_net_ssl_errorstring',
+        'io_net_ssl_funcerrorstring',
+        'io_net_ssl_liberrorstring',
+        'io_net_ssl_read',
+        'io_net_ssl_reasonerrorstring',
+        'io_net_ssl_setacceptstate',
+        'io_net_ssl_setconnectstate',
+        'io_net_ssl_setverifylocations',
+        'io_net_ssl_shutdown',
+        'io_net_ssl_usecertificatechainfile',
+        'io_net_ssl_useprivatekeyfile',
+        'io_net_ssl_write',
+        'java_jvm_create',
+        'java_jvm_getenv',
+        'jdbc_initialize',
+        'json_back_slash',
+        'json_back_space',
+        'json_close_array',
+        'json_close_object',
+        'json_colon',
+        'json_comma',
+        'json_consume_array',
+        'json_consume_object',
+        'json_consume_string',
+        'json_consume_token',
+        'json_cr',
+        'json_debug',
+        'json_deserialize',
+        'json_e_lower',
+        'json_e_upper',
+        'json_f_lower',
+        'json_form_feed',
+        'json_forward_slash',
+        'json_lf',
+        'json_n_lower',
+        'json_negative',
+        'json_open_array',
+        'json_open_object',
+        'json_period',
+        'json_positive',
+        'json_quote_double',
+        'json_rpccall',
+        'json_serialize',
+        'json_t_lower',
+        'json_tab',
+        'json_white_space',
+        'keycolumn_name',
+        'keycolumn_value',
+        'keyfield_name',
+        'keyfield_value',
+        'lasso_currentaction',
+        'lasso_errorreporting',
+        'lasso_executiontimelimit',
+        'lasso_methodexists',
+        'lasso_tagexists',
+        'lasso_uniqueid',
+        'lasso_version',
+        'lassoapp_current_app',
+        'lassoapp_current_include',
+        'lassoapp_do_with_include',
+        'lassoapp_exists',
+        'lassoapp_find_missing_file',
+        'lassoapp_format_mod_date',
+        'lassoapp_get_capabilities_name',
+        'lassoapp_include_current',
+        'lassoapp_include',
+        'lassoapp_initialize_db',
+        'lassoapp_initialize',
+        'lassoapp_invoke_resource',
+        'lassoapp_issourcefileextension',
+        'lassoapp_link',
+        'lassoapp_load_module',
+        'lassoapp_mime_get',
+        'lassoapp_mime_type_appcache',
+        'lassoapp_mime_type_css',
+        'lassoapp_mime_type_csv',
+        'lassoapp_mime_type_doc',
+        'lassoapp_mime_type_docx',
+        'lassoapp_mime_type_eof',
+        'lassoapp_mime_type_eot',
+        'lassoapp_mime_type_gif',
+        'lassoapp_mime_type_html',
+        'lassoapp_mime_type_ico',
+        'lassoapp_mime_type_jpg',
+        'lassoapp_mime_type_js',
+        'lassoapp_mime_type_lasso',
+        'lassoapp_mime_type_map',
+        'lassoapp_mime_type_pdf',
+        'lassoapp_mime_type_png',
+        'lassoapp_mime_type_ppt',
+        'lassoapp_mime_type_rss',
+        'lassoapp_mime_type_svg',
+        'lassoapp_mime_type_swf',
+        'lassoapp_mime_type_tif',
+        'lassoapp_mime_type_ttf',
+        'lassoapp_mime_type_txt',
+        'lassoapp_mime_type_woff',
+        'lassoapp_mime_type_xaml',
+        'lassoapp_mime_type_xap',
+        'lassoapp_mime_type_xbap',
+        'lassoapp_mime_type_xhr',
+        'lassoapp_mime_type_xml',
+        'lassoapp_mime_type_zip',
+        'lassoapp_path_to_method_name',
+        'lassoapp_settingsdb',
+        'layout_name',
+        'lcapi_datasourceadd',
+        'lcapi_datasourcecloseconnection',
+        'lcapi_datasourcedelete',
+        'lcapi_datasourceduplicate',
+        'lcapi_datasourceexecsql',
+        'lcapi_datasourcefindall',
+        'lcapi_datasourceimage',
+        'lcapi_datasourceinfo',
+        'lcapi_datasourceinit',
+        'lcapi_datasourcematchesname',
+        'lcapi_datasourcenames',
+        'lcapi_datasourcenothing',
+        'lcapi_datasourceopand',
+        'lcapi_datasourceopany',
+        'lcapi_datasourceopbw',
+        'lcapi_datasourceopct',
+        'lcapi_datasourceopeq',
+        'lcapi_datasourceopew',
+        'lcapi_datasourceopft',
+        'lcapi_datasourceopgt',
+        'lcapi_datasourceopgteq',
+        'lcapi_datasourceopin',
+        'lcapi_datasourceoplt',
+        'lcapi_datasourceoplteq',
+        'lcapi_datasourceopnbw',
+        'lcapi_datasourceopnct',
+        'lcapi_datasourceopneq',
+        'lcapi_datasourceopnew',
+        'lcapi_datasourceopnin',
+        'lcapi_datasourceopno',
+        'lcapi_datasourceopnot',
+        'lcapi_datasourceopnrx',
+        'lcapi_datasourceopor',
+        'lcapi_datasourceoprx',
+        'lcapi_datasourcepreparesql',
+        'lcapi_datasourceprotectionnone',
+        'lcapi_datasourceprotectionreadonly',
+        'lcapi_datasourcerandom',
+        'lcapi_datasourceschemanames',
+        'lcapi_datasourcescripts',
+        'lcapi_datasourcesearch',
+        'lcapi_datasourcesortascending',
+        'lcapi_datasourcesortcustom',
+        'lcapi_datasourcesortdescending',
+        'lcapi_datasourcetablenames',
+        'lcapi_datasourceterm',
+        'lcapi_datasourcetickle',
+        'lcapi_datasourcetypeblob',
+        'lcapi_datasourcetypeboolean',
+        'lcapi_datasourcetypedate',
+        'lcapi_datasourcetypedecimal',
+        'lcapi_datasourcetypeinteger',
+        'lcapi_datasourcetypestring',
+        'lcapi_datasourceunpreparesql',
+        'lcapi_datasourceupdate',
+        'lcapi_fourchartointeger',
+        'lcapi_listdatasources',
+        'lcapi_loadmodule',
+        'lcapi_loadmodules',
+        'lcapi_updatedatasourceslist',
+        'ldap_scope_base',
+        'ldap_scope_children',
+        'ldap_scope_onelevel',
+        'ldap_scope_subtree',
+        'library_once',
+        'library',
+        'ljapi_initialize',
+        'locale_availablelocales',
+        'locale_canada',
+        'locale_canadafrench',
+        'locale_china',
+        'locale_chinese',
+        'locale_default',
+        'locale_english',
+        'locale_format_style_date_time',
+        'locale_format_style_default',
+        'locale_format_style_full',
+        'locale_format_style_long',
+        'locale_format_style_medium',
+        'locale_format_style_none',
+        'locale_format_style_short',
+        'locale_format',
+        'locale_france',
+        'locale_french',
+        'locale_german',
+        'locale_germany',
+        'locale_isocountries',
+        'locale_isolanguages',
+        'locale_italian',
+        'locale_italy',
+        'locale_japan',
+        'locale_japanese',
+        'locale_korea',
+        'locale_korean',
+        'locale_prc',
+        'locale_setdefault',
+        'locale_simplifiedchinese',
+        'locale_taiwan',
+        'locale_traditionalchinese',
+        'locale_uk',
+        'locale_us',
+        'log_always',
+        'log_critical',
+        'log_deprecated',
+        'log_destination_console',
+        'log_destination_database',
+        'log_destination_file',
+        'log_detail',
+        'log_initialize',
+        'log_level_critical',
+        'log_level_deprecated',
+        'log_level_detail',
+        'log_level_sql',
+        'log_level_warning',
+        'log_max_file_size',
+        'log_setdestination',
+        'log_sql',
+        'log_trim_file_size',
+        'log_warning',
+        'log',
+        'loop_abort',
+        'loop_continue',
+        'loop_count',
+        'loop_key_pop',
+        'loop_key_push',
+        'loop_key',
+        'loop_pop',
+        'loop_push',
+        'loop_value_pop',
+        'loop_value_push',
+        'loop_value',
+        'loop',
+        'lt',
+        'lte',
+        'main_thread_only',
+        'max',
+        'maxrecords_value',
+        'median',
+        'method_name',
+        'micros',
+        'millis',
+        'min',
+        'minimal',
+        'mongo_insert_continue_on_error',
+        'mongo_insert_no_validate',
+        'mongo_insert_none',
+        'mongo_query_await_data',
+        'mongo_query_exhaust',
+        'mongo_query_no_cursor_timeout',
+        'mongo_query_none',
+        'mongo_query_oplog_replay',
+        'mongo_query_partial',
+        'mongo_query_slave_ok',
+        'mongo_query_tailable_cursor',
+        'mongo_remove_none',
+        'mongo_remove_single_remove',
+        'mongo_update_multi_update',
+        'mongo_update_no_validate',
+        'mongo_update_none',
+        'mongo_update_upsert',
+        'mustache_compile_file',
+        'mustache_compile_string',
+        'mustache_include',
+        'mysqlds',
+        'namespace_global',
+        'namespace_import',
+        'namespace_using',
+        'nbw',
+        'ncn',
+        'neq',
+        'net_connectinprogress',
+        'net_connectok',
+        'net_typessl',
+        'net_typessltcp',
+        'net_typessludp',
+        'net_typetcp',
+        'net_typeudp',
+        'net_waitread',
+        'net_waittimeout',
+        'net_waitwrite',
+        'new',
+        'none',
+        'nrx',
+        'nslookup',
+        'odbc_session_driver_mssql',
+        'odbc',
+        'output_none',
+        'output',
+        'pdf_package',
+        'pdf_rectangle',
+        'pdf_serve',
+        'pi',
+        'portal',
+        'postgresql',
+        'process',
+        'protect_now',
+        'protect',
+        'queriable_average',
+        'queriable_defaultcompare',
+        'queriable_do',
+        'queriable_internal_combinebindings',
+        'queriable_max',
+        'queriable_min',
+        'queriable_qsort',
+        'queriable_reversecompare',
+        'queriable_sum',
+        'random_seed',
+        'range',
+        'records_array',
+        'records_map',
+        'records',
+        'redirect_url',
+        'referer_url',
+        'referrer_url',
+        'register_thread',
+        'register',
+        'response_filepath',
+        'response_localpath',
+        'response_path',
+        'response_realm',
+        'response_root',
+        'resultset_count',
+        'resultset',
+        'resultsets',
+        'rows_array',
+        'rows_impl',
+        'rows',
+        'rx',
+        'schema_name',
+        'security_database',
+        'security_default_realm',
+        'security_initialize',
+        'security_table_groups',
+        'security_table_ug_map',
+        'security_table_users',
+        'selected',
+        'series',
+        'server_admin',
+        'server_ip',
+        'server_name',
+        'server_port',
+        'server_protocol',
+        'server_push',
+        'server_signature',
+        'server_software',
+        'session_abort',
+        'session_addvar',
+        'session_decorate',
+        'session_deleteexpired',
+        'session_end',
+        'session_getdefaultdriver',
+        'session_id',
+        'session_initialize',
+        'session_removevar',
+        'session_result',
+        'session_setdefaultdriver',
+        'session_start',
+        'shown_count',
+        'shown_first',
+        'shown_last',
+        'site_id',
+        'site_name',
+        'skiprecords_value',
+        'sleep',
+        'split_thread',
+        'sqlite_abort',
+        'sqlite_auth',
+        'sqlite_blob',
+        'sqlite_busy',
+        'sqlite_cantopen',
+        'sqlite_constraint',
+        'sqlite_corrupt',
+        'sqlite_createdb',
+        'sqlite_done',
+        'sqlite_empty',
+        'sqlite_error',
+        'sqlite_float',
+        'sqlite_format',
+        'sqlite_full',
+        'sqlite_integer',
+        'sqlite_internal',
+        'sqlite_interrupt',
+        'sqlite_ioerr',
+        'sqlite_locked',
+        'sqlite_mismatch',
+        'sqlite_misuse',
+        'sqlite_nolfs',
+        'sqlite_nomem',
+        'sqlite_notadb',
+        'sqlite_notfound',
+        'sqlite_null',
+        'sqlite_ok',
+        'sqlite_perm',
+        'sqlite_protocol',
+        'sqlite_range',
+        'sqlite_readonly',
+        'sqlite_row',
+        'sqlite_schema',
+        'sqlite_setsleepmillis',
+        'sqlite_setsleeptries',
+        'sqlite_text',
+        'sqlite_toobig',
+        'sqliteconnector',
+        'staticarray_join',
+        'stdout',
+        'stdoutnl',
+        'string_validcharset',
+        'suspend',
+        'sys_appspath',
+        'sys_chroot',
+        'sys_clock',
+        'sys_clockspersec',
+        'sys_credits',
+        'sys_databasespath',
+        'sys_detach_exec',
+        'sys_difftime',
+        'sys_dll_ext',
+        'sys_drand48',
+        'sys_environ',
+        'sys_eol',
+        'sys_erand48',
+        'sys_errno',
+        'sys_exec_pid_to_os_pid',
+        'sys_exec',
+        'sys_exit',
+        'sys_fork',
+        'sys_garbagecollect',
+        'sys_getbytessincegc',
+        'sys_getchar',
+        'sys_getegid',
+        'sys_getenv',
+        'sys_geteuid',
+        'sys_getgid',
+        'sys_getgrnam',
+        'sys_getheapfreebytes',
+        'sys_getheapsize',
+        'sys_getlogin',
+        'sys_getpid',
+        'sys_getppid',
+        'sys_getpwnam',
+        'sys_getpwuid',
+        'sys_getstartclock',
+        'sys_getthreadcount',
+        'sys_getuid',
+        'sys_growheapby',
+        'sys_homepath',
+        'sys_is_full_path',
+        'sys_is_windows',
+        'sys_isfullpath',
+        'sys_iswindows',
+        'sys_iterate',
+        'sys_jrand48',
+        'sys_kill_exec',
+        'sys_kill',
+        'sys_lcong48',
+        'sys_librariespath',
+        'sys_listtraits',
+        'sys_listtypes',
+        'sys_listunboundmethods',
+        'sys_loadlibrary',
+        'sys_lrand48',
+        'sys_masterhomepath',
+        'sys_mrand48',
+        'sys_nrand48',
+        'sys_pid_exec',
+        'sys_pointersize',
+        'sys_rand',
+        'sys_random',
+        'sys_seed48',
+        'sys_setenv',
+        'sys_setgid',
+        'sys_setsid',
+        'sys_setuid',
+        'sys_sigabrt',
+        'sys_sigalrm',
+        'sys_sigbus',
+        'sys_sigchld',
+        'sys_sigcont',
+        'sys_sigfpe',
+        'sys_sighup',
+        'sys_sigill',
+        'sys_sigint',
+        'sys_sigkill',
+        'sys_sigpipe',
+        'sys_sigprof',
+        'sys_sigquit',
+        'sys_sigsegv',
+        'sys_sigstop',
+        'sys_sigsys',
+        'sys_sigterm',
+        'sys_sigtrap',
+        'sys_sigtstp',
+        'sys_sigttin',
+        'sys_sigttou',
+        'sys_sigurg',
+        'sys_sigusr1',
+        'sys_sigusr2',
+        'sys_sigvtalrm',
+        'sys_sigxcpu',
+        'sys_sigxfsz',
+        'sys_srand',
+        'sys_srand48',
+        'sys_srandom',
+        'sys_strerror',
+        'sys_supportpath',
+        'sys_test_exec',
+        'sys_time',
+        'sys_uname',
+        'sys_unsetenv',
+        'sys_usercapimodulepath',
+        'sys_userstartuppath',
+        'sys_version',
+        'sys_wait_exec',
+        'sys_waitpid',
+        'sys_wcontinued',
+        'sys_while',
+        'sys_wnohang',
+        'sys_wuntraced',
+        'table_name',
+        'tag_exists',
+        'tag_name',
+        'thread_var_get',
+        'thread_var_pop',
+        'thread_var_push',
+        'threadvar_find',
+        'threadvar_get',
+        'threadvar_set_asrt',
+        'threadvar_set',
+        'timer',
+        'token_value',
+        'treemap',
+        'u_lb_alphabetic',
+        'u_lb_ambiguous',
+        'u_lb_break_after',
+        'u_lb_break_before',
+        'u_lb_break_both',
+        'u_lb_break_symbols',
+        'u_lb_carriage_return',
+        'u_lb_close_punctuation',
+        'u_lb_combining_mark',
+        'u_lb_complex_context',
+        'u_lb_contingent_break',
+        'u_lb_exclamation',
+        'u_lb_glue',
+        'u_lb_h2',
+        'u_lb_h3',
+        'u_lb_hyphen',
+        'u_lb_ideographic',
+        'u_lb_infix_numeric',
+        'u_lb_inseparable',
+        'u_lb_jl',
+        'u_lb_jt',
+        'u_lb_jv',
+        'u_lb_line_feed',
+        'u_lb_mandatory_break',
+        'u_lb_next_line',
+        'u_lb_nonstarter',
+        'u_lb_numeric',
+        'u_lb_open_punctuation',
+        'u_lb_postfix_numeric',
+        'u_lb_prefix_numeric',
+        'u_lb_quotation',
+        'u_lb_space',
+        'u_lb_surrogate',
+        'u_lb_unknown',
+        'u_lb_word_joiner',
+        'u_lb_zwspace',
+        'u_nt_decimal',
+        'u_nt_digit',
+        'u_nt_none',
+        'u_nt_numeric',
+        'u_sb_aterm',
+        'u_sb_close',
+        'u_sb_format',
+        'u_sb_lower',
+        'u_sb_numeric',
+        'u_sb_oletter',
+        'u_sb_other',
+        'u_sb_sep',
+        'u_sb_sp',
+        'u_sb_sterm',
+        'u_sb_upper',
+        'u_wb_aletter',
+        'u_wb_extendnumlet',
+        'u_wb_format',
+        'u_wb_katakana',
+        'u_wb_midletter',
+        'u_wb_midnum',
+        'u_wb_numeric',
+        'u_wb_other',
+        'ucal_ampm',
+        'ucal_dayofmonth',
+        'ucal_dayofweek',
+        'ucal_dayofweekinmonth',
+        'ucal_dayofyear',
+        'ucal_daysinfirstweek',
+        'ucal_dowlocal',
+        'ucal_dstoffset',
+        'ucal_era',
+        'ucal_extendedyear',
+        'ucal_firstdayofweek',
+        'ucal_hour',
+        'ucal_hourofday',
+        'ucal_julianday',
+        'ucal_lenient',
+        'ucal_listtimezones',
+        'ucal_millisecond',
+        'ucal_millisecondsinday',
+        'ucal_minute',
+        'ucal_month',
+        'ucal_second',
+        'ucal_weekofmonth',
+        'ucal_weekofyear',
+        'ucal_year',
+        'ucal_yearwoy',
+        'ucal_zoneoffset',
+        'uchar_age',
+        'uchar_alphabetic',
+        'uchar_ascii_hex_digit',
+        'uchar_bidi_class',
+        'uchar_bidi_control',
+        'uchar_bidi_mirrored',
+        'uchar_bidi_mirroring_glyph',
+        'uchar_block',
+        'uchar_canonical_combining_class',
+        'uchar_case_folding',
+        'uchar_case_sensitive',
+        'uchar_dash',
+        'uchar_decomposition_type',
+        'uchar_default_ignorable_code_point',
+        'uchar_deprecated',
+        'uchar_diacritic',
+        'uchar_east_asian_width',
+        'uchar_extender',
+        'uchar_full_composition_exclusion',
+        'uchar_general_category_mask',
+        'uchar_general_category',
+        'uchar_grapheme_base',
+        'uchar_grapheme_cluster_break',
+        'uchar_grapheme_extend',
+        'uchar_grapheme_link',
+        'uchar_hangul_syllable_type',
+        'uchar_hex_digit',
+        'uchar_hyphen',
+        'uchar_id_continue',
+        'uchar_ideographic',
+        'uchar_ids_binary_operator',
+        'uchar_ids_trinary_operator',
+        'uchar_iso_comment',
+        'uchar_join_control',
+        'uchar_joining_group',
+        'uchar_joining_type',
+        'uchar_lead_canonical_combining_class',
+        'uchar_line_break',
+        'uchar_logical_order_exception',
+        'uchar_lowercase_mapping',
+        'uchar_lowercase',
+        'uchar_math',
+        'uchar_name',
+        'uchar_nfc_inert',
+        'uchar_nfc_quick_check',
+        'uchar_nfd_inert',
+        'uchar_nfd_quick_check',
+        'uchar_nfkc_inert',
+        'uchar_nfkc_quick_check',
+        'uchar_nfkd_inert',
+        'uchar_nfkd_quick_check',
+        'uchar_noncharacter_code_point',
+        'uchar_numeric_type',
+        'uchar_numeric_value',
+        'uchar_pattern_syntax',
+        'uchar_pattern_white_space',
+        'uchar_posix_alnum',
+        'uchar_posix_blank',
+        'uchar_posix_graph',
+        'uchar_posix_print',
+        'uchar_posix_xdigit',
+        'uchar_quotation_mark',
+        'uchar_radical',
+        'uchar_s_term',
+        'uchar_script',
+        'uchar_segment_starter',
+        'uchar_sentence_break',
+        'uchar_simple_case_folding',
+        'uchar_simple_lowercase_mapping',
+        'uchar_simple_titlecase_mapping',
+        'uchar_simple_uppercase_mapping',
+        'uchar_soft_dotted',
+        'uchar_terminal_punctuation',
+        'uchar_titlecase_mapping',
+        'uchar_trail_canonical_combining_class',
+        'uchar_unicode_1_name',
+        'uchar_unified_ideograph',
+        'uchar_uppercase_mapping',
+        'uchar_uppercase',
+        'uchar_variation_selector',
+        'uchar_white_space',
+        'uchar_word_break',
+        'uchar_xid_continue',
+        'uncompress',
+        'usage',
+        'uuid_compare',
+        'uuid_copy',
+        'uuid_generate_random',
+        'uuid_generate_time',
+        'uuid_generate',
+        'uuid_is_null',
+        'uuid_parse',
+        'uuid_unparse_lower',
+        'uuid_unparse_upper',
+        'uuid_unparse',
+        'value_list',
+        'value_listitem',
+        'valuelistitem',
+        'var_keys',
+        'var_values',
+        'wap_isenabled',
+        'wap_maxbuttons',
+        'wap_maxcolumns',
+        'wap_maxhorzpixels',
+        'wap_maxrows',
+        'wap_maxvertpixels',
+        'web_handlefcgirequest',
+        'web_node_content_representation_css',
+        'web_node_content_representation_html',
+        'web_node_content_representation_js',
+        'web_node_content_representation_xhr',
+        'web_node_forpath',
+        'web_nodes_initialize',
+        'web_nodes_normalizeextension',
+        'web_nodes_processcontentnode',
+        'web_nodes_requesthandler',
+        'web_response_nodesentry',
+        'web_router_database',
+        'web_router_initialize',
+        'websocket_handler_timeout',
+        'wexitstatus',
+        'wifcontinued',
+        'wifexited',
+        'wifsignaled',
+        'wifstopped',
+        'wstopsig',
+        'wtermsig',
+        'xml_transform',
+        'xml',
+        'zip_add_dir',
+        'zip_add',
+        'zip_checkcons',
+        'zip_close',
+        'zip_cm_bzip2',
+        'zip_cm_default',
+        'zip_cm_deflate',
+        'zip_cm_deflate64',
+        'zip_cm_implode',
+        'zip_cm_pkware_implode',
+        'zip_cm_reduce_1',
+        'zip_cm_reduce_2',
+        'zip_cm_reduce_3',
+        'zip_cm_reduce_4',
+        'zip_cm_shrink',
+        'zip_cm_store',
+        'zip_create',
+        'zip_delete',
+        'zip_em_3des_112',
+        'zip_em_3des_168',
+        'zip_em_aes_128',
+        'zip_em_aes_192',
+        'zip_em_aes_256',
+        'zip_em_des',
+        'zip_em_none',
+        'zip_em_rc2_old',
+        'zip_em_rc2',
+        'zip_em_rc4',
+        'zip_em_trad_pkware',
+        'zip_em_unknown',
+        'zip_er_changed',
+        'zip_er_close',
+        'zip_er_compnotsupp',
+        'zip_er_crc',
+        'zip_er_deleted',
+        'zip_er_eof',
+        'zip_er_exists',
+        'zip_er_incons',
+        'zip_er_internal',
+        'zip_er_inval',
+        'zip_er_memory',
+        'zip_er_multidisk',
+        'zip_er_noent',
+        'zip_er_nozip',
+        'zip_er_ok',
+        'zip_er_open',
+        'zip_er_read',
+        'zip_er_remove',
+        'zip_er_rename',
+        'zip_er_seek',
+        'zip_er_tmpopen',
+        'zip_er_write',
+        'zip_er_zipclosed',
+        'zip_er_zlib',
+        'zip_error_get_sys_type',
+        'zip_error_get',
+        'zip_error_to_str',
+        'zip_et_none',
+        'zip_et_sys',
+        'zip_et_zlib',
+        'zip_excl',
+        'zip_fclose',
+        'zip_file_error_get',
+        'zip_file_strerror',
+        'zip_fl_compressed',
+        'zip_fl_nocase',
+        'zip_fl_nodir',
+        'zip_fl_unchanged',
+        'zip_fopen_index',
+        'zip_fopen',
+        'zip_fread',
+        'zip_get_archive_comment',
+        'zip_get_file_comment',
+        'zip_get_name',
+        'zip_get_num_files',
+        'zip_name_locate',
+        'zip_open',
+        'zip_rename',
+        'zip_replace',
+        'zip_set_archive_comment',
+        'zip_set_file_comment',
+        'zip_stat_index',
+        'zip_stat',
+        'zip_strerror',
+        'zip_unchange_all',
+        'zip_unchange_archive',
+        'zip_unchange',
+        'zlib_version',
+    ),
+    'Lasso 8 Tags': (
+        '__char',
+        '__sync_timestamp__',
+        '_admin_addgroup',
+        '_admin_adduser',
+        '_admin_defaultconnector',
+        '_admin_defaultconnectornames',
+        '_admin_defaultdatabase',
+        '_admin_defaultfield',
+        '_admin_defaultgroup',
+        '_admin_defaulthost',
+        '_admin_defaulttable',
+        '_admin_defaultuser',
+        '_admin_deleteconnector',
+        '_admin_deletedatabase',
+        '_admin_deletefield',
+        '_admin_deletegroup',
+        '_admin_deletehost',
+        '_admin_deletetable',
+        '_admin_deleteuser',
+        '_admin_duplicategroup',
+        '_admin_internaldatabase',
+        '_admin_listconnectors',
+        '_admin_listdatabases',
+        '_admin_listfields',
+        '_admin_listgroups',
+        '_admin_listhosts',
+        '_admin_listtables',
+        '_admin_listusers',
+        '_admin_refreshconnector',
+        '_admin_refreshsecurity',
+        '_admin_servicepath',
+        '_admin_updateconnector',
+        '_admin_updatedatabase',
+        '_admin_updatefield',
+        '_admin_updategroup',
+        '_admin_updatehost',
+        '_admin_updatetable',
+        '_admin_updateuser',
+        '_chartfx_activation_string',
+        '_chartfx_getchallengestring',
+        '_chop_args',
+        '_chop_mimes',
+        '_client_addr_old',
+        '_client_address_old',
+        '_client_ip_old',
+        '_database_names',
+        '_datasource_reload',
+        '_date_current',
+        '_date_format',
+        '_date_msec',
+        '_date_parse',
+        '_execution_timelimit',
+        '_file_chmod',
+        '_initialize',
+        '_jdbc_acceptsurl',
+        '_jdbc_debug',
+        '_jdbc_deletehost',
+        '_jdbc_driverclasses',
+        '_jdbc_driverinfo',
+        '_jdbc_metainfo',
+        '_jdbc_propertyinfo',
+        '_jdbc_setdriver',
+        '_lasso_param',
+        '_log_helper',
+        '_proc_noparam',
+        '_proc_withparam',
+        '_recursion_limit',
+        '_request_param',
+        '_security_binaryexpiration',
+        '_security_flushcaches',
+        '_security_isserialized',
+        '_security_serialexpiration',
+        '_srand',
+        '_strict_literals',
+        '_substring',
+        '_xmlrpc_exconverter',
+        '_xmlrpc_inconverter',
+        '_xmlrpc_xmlinconverter',
+        'abort',
+        'action_addinfo',
+        'action_addrecord',
+        'action_param',
+        'action_params',
+        'action_setfoundcount',
+        'action_setrecordid',
+        'action_settotalcount',
+        'action_statement',
+        'admin_allowedfileroots',
+        'admin_changeuser',
+        'admin_createuser',
+        'admin_currentgroups',
+        'admin_currentuserid',
+        'admin_currentusername',
+        'admin_getpref',
+        'admin_groupassignuser',
+        'admin_grouplistusers',
+        'admin_groupremoveuser',
+        'admin_lassoservicepath',
+        'admin_listgroups',
+        'admin_refreshlicensing',
+        'admin_refreshsecurity',
+        'admin_reloaddatasource',
+        'admin_removepref',
+        'admin_setpref',
+        'admin_userexists',
+        'admin_userlistgroups',
+        'all',
+        'and',
+        'array',
+        'array_iterator',
+        'auth',
+        'auth_admin',
+        'auth_auth',
+        'auth_custom',
+        'auth_group',
+        'auth_prompt',
+        'auth_user',
+        'base64',
+        'bean',
+        'bigint',
+        'bom_utf16be',
+        'bom_utf16le',
+        'bom_utf32be',
+        'bom_utf32le',
+        'bom_utf8',
+        'boolean',
+        'bw',
+        'bytes',
+        'cache',
+        'cache_delete',
+        'cache_empty',
+        'cache_exists',
+        'cache_fetch',
+        'cache_internal',
+        'cache_maintenance',
+        'cache_object',
+        'cache_preferences',
+        'cache_store',
+        'case',
+        'chartfx',
+        'chartfx_records',
+        'chartfx_serve',
+        'checked',
+        'choice_list',
+        'choice_listitem',
+        'choicelistitem',
+        'cipher_decrypt',
+        'cipher_digest',
+        'cipher_encrypt',
+        'cipher_hmac',
+        'cipher_keylength',
+        'cipher_list',
+        'click_text',
+        'client_addr',
+        'client_address',
+        'client_authorization',
+        'client_browser',
+        'client_contentlength',
+        'client_contenttype',
+        'client_cookielist',
+        'client_cookies',
+        'client_encoding',
+        'client_formmethod',
+        'client_getargs',
+        'client_getparams',
+        'client_headers',
+        'client_ip',
+        'client_ipfrominteger',
+        'client_iptointeger',
+        'client_password',
+        'client_postargs',
+        'client_postparams',
+        'client_type',
+        'client_url',
+        'client_username',
+        'cn',
+        'column',
+        'column_name',
+        'column_names',
+        'compare_beginswith',
+        'compare_contains',
+        'compare_endswith',
+        'compare_equalto',
+        'compare_greaterthan',
+        'compare_greaterthanorequals',
+        'compare_greaterthanorequls',
+        'compare_lessthan',
+        'compare_lessthanorequals',
+        'compare_notbeginswith',
+        'compare_notcontains',
+        'compare_notendswith',
+        'compare_notequalto',
+        'compare_notregexp',
+        'compare_regexp',
+        'compare_strictequalto',
+        'compare_strictnotequalto',
+        'compiler_removecacheddoc',
+        'compiler_setdefaultparserflags',
+        'compress',
+        'content_body',
+        'content_encoding',
+        'content_header',
+        'content_type',
+        'cookie',
+        'cookie_set',
+        'curl_ftp_getfile',
+        'curl_ftp_getlisting',
+        'curl_ftp_putfile',
+        'curl_include_url',
+        'currency',
+        'database_changecolumn',
+        'database_changefield',
+        'database_createcolumn',
+        'database_createfield',
+        'database_createtable',
+        'database_fmcontainer',
+        'database_hostinfo',
+        'database_inline',
+        'database_name',
+        'database_nameitem',
+        'database_names',
+        'database_realname',
+        'database_removecolumn',
+        'database_removefield',
+        'database_removetable',
+        'database_repeating',
+        'database_repeating_valueitem',
+        'database_repeatingvalueitem',
+        'database_schemanameitem',
+        'database_schemanames',
+        'database_tablecolumn',
+        'database_tablenameitem',
+        'database_tablenames',
+        'datasource_name',
+        'datasource_register',
+        'date',
+        'date__date_current',
+        'date__date_format',
+        'date__date_msec',
+        'date__date_parse',
+        'date_add',
+        'date_date',
+        'date_difference',
+        'date_duration',
+        'date_format',
+        'date_getcurrentdate',
+        'date_getday',
+        'date_getdayofweek',
+        'date_gethour',
+        'date_getlocaltimezone',
+        'date_getminute',
+        'date_getmonth',
+        'date_getsecond',
+        'date_gettime',
+        'date_getyear',
+        'date_gmttolocal',
+        'date_localtogmt',
+        'date_maximum',
+        'date_minimum',
+        'date_msec',
+        'date_setformat',
+        'date_subtract',
+        'db_layoutnameitem',
+        'db_layoutnames',
+        'db_nameitem',
+        'db_names',
+        'db_tablenameitem',
+        'db_tablenames',
+        'dbi_column_names',
+        'dbi_field_names',
+        'decimal',
+        'decimal_setglobaldefaultprecision',
+        'decode_base64',
+        'decode_bheader',
+        'decode_hex',
+        'decode_html',
+        'decode_json',
+        'decode_qheader',
+        'decode_quotedprintable',
+        'decode_quotedprintablebytes',
+        'decode_url',
+        'decode_xml',
+        'decompress',
+        'decrypt_blowfish',
+        'decrypt_blowfish2',
+        'default',
+        'define_atbegin',
+        'define_atend',
+        'define_constant',
+        'define_prototype',
+        'define_tag',
+        'define_tagp',
+        'define_type',
+        'define_typep',
+        'deserialize',
+        'directory_directorynameitem',
+        'directory_lister',
+        'directory_nameitem',
+        'directorynameitem',
+        'dns_default',
+        'dns_lookup',
+        'dns_response',
+        'duration',
+        'else',
+        'email_batch',
+        'email_compose',
+        'email_digestchallenge',
+        'email_digestresponse',
+        'email_extract',
+        'email_findemails',
+        'email_immediate',
+        'email_merge',
+        'email_mxerror',
+        'email_mxlookup',
+        'email_parse',
+        'email_pop',
+        'email_queue',
+        'email_result',
+        'email_safeemail',
+        'email_send',
+        'email_smtp',
+        'email_status',
+        'email_token',
+        'email_translatebreakstocrlf',
+        'encode_base64',
+        'encode_bheader',
+        'encode_break',
+        'encode_breaks',
+        'encode_crc32',
+        'encode_hex',
+        'encode_html',
+        'encode_htmltoxml',
+        'encode_json',
+        'encode_qheader',
+        'encode_quotedprintable',
+        'encode_quotedprintablebytes',
+        'encode_set',
+        'encode_smart',
+        'encode_sql',
+        'encode_sql92',
+        'encode_stricturl',
+        'encode_url',
+        'encode_xml',
+        'encrypt_blowfish',
+        'encrypt_blowfish2',
+        'encrypt_crammd5',
+        'encrypt_hmac',
+        'encrypt_md5',
+        'eq',
+        'error_adderror',
+        'error_code',
+        'error_code_aborted',
+        'error_code_assert',
+        'error_code_bof',
+        'error_code_connectioninvalid',
+        'error_code_couldnotclosefile',
+        'error_code_couldnotcreateoropenfile',
+        'error_code_couldnotdeletefile',
+        'error_code_couldnotdisposememory',
+        'error_code_couldnotlockmemory',
+        'error_code_couldnotreadfromfile',
+        'error_code_couldnotunlockmemory',
+        'error_code_couldnotwritetofile',
+        'error_code_criterianotmet',
+        'error_code_datasourceerror',
+        'error_code_directoryfull',
+        'error_code_diskfull',
+        'error_code_dividebyzero',
+        'error_code_eof',
+        'error_code_failure',
+        'error_code_fieldrestriction',
+        'error_code_file',
+        'error_code_filealreadyexists',
+        'error_code_filecorrupt',
+        'error_code_fileinvalid',
+        'error_code_fileinvalidaccessmode',
+        'error_code_fileisclosed',
+        'error_code_fileisopen',
+        'error_code_filelocked',
+        'error_code_filenotfound',
+        'error_code_fileunlocked',
+        'error_code_httpfilenotfound',
+        'error_code_illegalinstruction',
+        'error_code_illegaluseoffrozeninstance',
+        'error_code_invaliddatabase',
+        'error_code_invalidfilename',
+        'error_code_invalidmemoryobject',
+        'error_code_invalidparameter',
+        'error_code_invalidpassword',
+        'error_code_invalidpathname',
+        'error_code_invalidusername',
+        'error_code_ioerror',
+        'error_code_loopaborted',
+        'error_code_memory',
+        'error_code_network',
+        'error_code_nilpointer',
+        'error_code_noerr',
+        'error_code_nopermission',
+        'error_code_outofmemory',
+        'error_code_outofstackspace',
+        'error_code_overflow',
+        'error_code_postconditionfailed',
+        'error_code_preconditionfailed',
+        'error_code_resnotfound',
+        'error_code_resource',
+        'error_code_streamreaderror',
+        'error_code_streamwriteerror',
+        'error_code_syntaxerror',
+        'error_code_tagnotfound',
+        'error_code_unknownerror',
+        'error_code_varnotfound',
+        'error_code_volumedoesnotexist',
+        'error_code_webactionnotsupported',
+        'error_code_webadderror',
+        'error_code_webdeleteerror',
+        'error_code_webmodulenotfound',
+        'error_code_webnosuchobject',
+        'error_code_webrepeatingrelatedfield',
+        'error_code_webrequiredfieldmissing',
+        'error_code_webtimeout',
+        'error_code_webupdateerror',
+        'error_columnrestriction',
+        'error_currenterror',
+        'error_databaseconnectionunavailable',
+        'error_databasetimeout',
+        'error_deleteerror',
+        'error_fieldrestriction',
+        'error_filenotfound',
+        'error_invaliddatabase',
+        'error_invalidpassword',
+        'error_invalidusername',
+        'error_modulenotfound',
+        'error_msg',
+        'error_msg_aborted',
+        'error_msg_assert',
+        'error_msg_bof',
+        'error_msg_connectioninvalid',
+        'error_msg_couldnotclosefile',
+        'error_msg_couldnotcreateoropenfile',
+        'error_msg_couldnotdeletefile',
+        'error_msg_couldnotdisposememory',
+        'error_msg_couldnotlockmemory',
+        'error_msg_couldnotreadfromfile',
+        'error_msg_couldnotunlockmemory',
+        'error_msg_couldnotwritetofile',
+        'error_msg_criterianotmet',
+        'error_msg_datasourceerror',
+        'error_msg_directoryfull',
+        'error_msg_diskfull',
+        'error_msg_dividebyzero',
+        'error_msg_eof',
+        'error_msg_failure',
+        'error_msg_fieldrestriction',
+        'error_msg_file',
+        'error_msg_filealreadyexists',
+        'error_msg_filecorrupt',
+        'error_msg_fileinvalid',
+        'error_msg_fileinvalidaccessmode',
+        'error_msg_fileisclosed',
+        'error_msg_fileisopen',
+        'error_msg_filelocked',
+        'error_msg_filenotfound',
+        'error_msg_fileunlocked',
+        'error_msg_httpfilenotfound',
+        'error_msg_illegalinstruction',
+        'error_msg_illegaluseoffrozeninstance',
+        'error_msg_invaliddatabase',
+        'error_msg_invalidfilename',
+        'error_msg_invalidmemoryobject',
+        'error_msg_invalidparameter',
+        'error_msg_invalidpassword',
+        'error_msg_invalidpathname',
+        'error_msg_invalidusername',
+        'error_msg_ioerror',
+        'error_msg_loopaborted',
+        'error_msg_memory',
+        'error_msg_network',
+        'error_msg_nilpointer',
+        'error_msg_noerr',
+        'error_msg_nopermission',
+        'error_msg_outofmemory',
+        'error_msg_outofstackspace',
+        'error_msg_overflow',
+        'error_msg_postconditionfailed',
+        'error_msg_preconditionfailed',
+        'error_msg_resnotfound',
+        'error_msg_resource',
+        'error_msg_streamreaderror',
+        'error_msg_streamwriteerror',
+        'error_msg_syntaxerror',
+        'error_msg_tagnotfound',
+        'error_msg_unknownerror',
+        'error_msg_varnotfound',
+        'error_msg_volumedoesnotexist',
+        'error_msg_webactionnotsupported',
+        'error_msg_webadderror',
+        'error_msg_webdeleteerror',
+        'error_msg_webmodulenotfound',
+        'error_msg_webnosuchobject',
+        'error_msg_webrepeatingrelatedfield',
+        'error_msg_webrequiredfieldmissing',
+        'error_msg_webtimeout',
+        'error_msg_webupdateerror',
+        'error_noerror',
+        'error_nopermission',
+        'error_norecordsfound',
+        'error_outofmemory',
+        'error_pop',
+        'error_push',
+        'error_reqcolumnmissing',
+        'error_reqfieldmissing',
+        'error_requiredcolumnmissing',
+        'error_requiredfieldmissing',
+        'error_reset',
+        'error_seterrorcode',
+        'error_seterrormessage',
+        'error_updateerror',
+        'euro',
+        'event_schedule',
+        'ew',
+        'fail',
+        'fail_if',
+        'false',
+        'field',
+        'field_name',
+        'field_names',
+        'file',
+        'file_autoresolvefullpaths',
+        'file_chmod',
+        'file_control',
+        'file_copy',
+        'file_create',
+        'file_creationdate',
+        'file_currenterror',
+        'file_delete',
+        'file_exists',
+        'file_getlinecount',
+        'file_getsize',
+        'file_isdirectory',
+        'file_listdirectory',
+        'file_moddate',
+        'file_modechar',
+        'file_modeline',
+        'file_move',
+        'file_openread',
+        'file_openreadwrite',
+        'file_openwrite',
+        'file_openwriteappend',
+        'file_openwritetruncate',
+        'file_probeeol',
+        'file_processuploads',
+        'file_read',
+        'file_readline',
+        'file_rename',
+        'file_serve',
+        'file_setsize',
+        'file_stream',
+        'file_streamcopy',
+        'file_uploads',
+        'file_waitread',
+        'file_waittimeout',
+        'file_waitwrite',
+        'file_write',
+        'find_soap_ops',
+        'form_param',
+        'found_count',
+        'ft',
+        'ftp_getfile',
+        'ftp_getlisting',
+        'ftp_putfile',
+        'full',
+        'global',
+        'global_defined',
+        'global_remove',
+        'global_reset',
+        'globals',
+        'gt',
+        'gte',
+        'handle',
+        'handle_error',
+        'header',
+        'html_comment',
+        'http_getfile',
+        'ical_alarm',
+        'ical_attribute',
+        'ical_calendar',
+        'ical_daylight',
+        'ical_event',
+        'ical_freebusy',
+        'ical_item',
+        'ical_journal',
+        'ical_parse',
+        'ical_standard',
+        'ical_timezone',
+        'ical_todo',
+        'if',
+        'if_empty',
+        'if_false',
+        'if_null',
+        'if_true',
+        'image',
+        'image_url',
+        'img',
+        'include',
+        'include_cgi',
+        'include_currentpath',
+        'include_once',
+        'include_raw',
+        'include_url',
+        'inline',
+        'integer',
+        'iterate',
+        'iterator',
+        'java',
+        'java_bean',
+        'json_records',
+        'json_rpccall',
+        'keycolumn_name',
+        'keycolumn_value',
+        'keyfield_name',
+        'keyfield_value',
+        'lasso_comment',
+        'lasso_currentaction',
+        'lasso_datasourceis',
+        'lasso_datasourceis4d',
+        'lasso_datasourceisfilemaker',
+        'lasso_datasourceisfilemaker7',
+        'lasso_datasourceisfilemaker9',
+        'lasso_datasourceisfilemakersa',
+        'lasso_datasourceisjdbc',
+        'lasso_datasourceislassomysql',
+        'lasso_datasourceismysql',
+        'lasso_datasourceisodbc',
+        'lasso_datasourceisopenbase',
+        'lasso_datasourceisoracle',
+        'lasso_datasourceispostgresql',
+        'lasso_datasourceisspotlight',
+        'lasso_datasourceissqlite',
+        'lasso_datasourceissqlserver',
+        'lasso_datasourcemodulename',
+        'lasso_datatype',
+        'lasso_disableondemand',
+        'lasso_errorreporting',
+        'lasso_executiontimelimit',
+        'lasso_parser',
+        'lasso_process',
+        'lasso_sessionid',
+        'lasso_siteid',
+        'lasso_siteisrunning',
+        'lasso_sitename',
+        'lasso_siterestart',
+        'lasso_sitestart',
+        'lasso_sitestop',
+        'lasso_tagexists',
+        'lasso_tagmodulename',
+        'lasso_uniqueid',
+        'lasso_updatecheck',
+        'lasso_uptime',
+        'lasso_version',
+        'lassoapp_create',
+        'lassoapp_dump',
+        'lassoapp_flattendir',
+        'lassoapp_getappdata',
+        'lassoapp_link',
+        'lassoapp_list',
+        'lassoapp_process',
+        'lassoapp_unitize',
+        'layout_name',
+        'ldap',
+        'ldap_scope_base',
+        'ldap_scope_onelevel',
+        'ldap_scope_subtree',
+        'ldml',
+        'ldml_ldml',
+        'library',
+        'library_once',
+        'link',
+        'link_currentaction',
+        'link_currentactionparams',
+        'link_currentactionurl',
+        'link_currentgroup',
+        'link_currentgroupparams',
+        'link_currentgroupurl',
+        'link_currentrecord',
+        'link_currentrecordparams',
+        'link_currentrecordurl',
+        'link_currentsearch',
+        'link_currentsearchparams',
+        'link_currentsearchurl',
+        'link_detail',
+        'link_detailparams',
+        'link_detailurl',
+        'link_firstgroup',
+        'link_firstgroupparams',
+        'link_firstgroupurl',
+        'link_firstrecord',
+        'link_firstrecordparams',
+        'link_firstrecordurl',
+        'link_lastgroup',
+        'link_lastgroupparams',
+        'link_lastgroupurl',
+        'link_lastrecord',
+        'link_lastrecordparams',
+        'link_lastrecordurl',
+        'link_nextgroup',
+        'link_nextgroupparams',
+        'link_nextgroupurl',
+        'link_nextrecord',
+        'link_nextrecordparams',
+        'link_nextrecordurl',
+        'link_params',
+        'link_prevgroup',
+        'link_prevgroupparams',
+        'link_prevgroupurl',
+        'link_prevrecord',
+        'link_prevrecordparams',
+        'link_prevrecordurl',
+        'link_setformat',
+        'link_url',
+        'list',
+        'list_additem',
+        'list_fromlist',
+        'list_fromstring',
+        'list_getitem',
+        'list_itemcount',
+        'list_iterator',
+        'list_removeitem',
+        'list_replaceitem',
+        'list_reverseiterator',
+        'list_tostring',
+        'literal',
+        'ljax_end',
+        'ljax_hastarget',
+        'ljax_include',
+        'ljax_start',
+        'ljax_target',
+        'local',
+        'local_defined',
+        'local_remove',
+        'local_reset',
+        'locale_format',
+        'locals',
+        'log',
+        'log_always',
+        'log_critical',
+        'log_deprecated',
+        'log_destination_console',
+        'log_destination_database',
+        'log_destination_file',
+        'log_detail',
+        'log_level_critical',
+        'log_level_deprecated',
+        'log_level_detail',
+        'log_level_sql',
+        'log_level_warning',
+        'log_setdestination',
+        'log_sql',
+        'log_warning',
+        'logicalop_value',
+        'logicaloperator_value',
+        'loop',
+        'loop_abort',
+        'loop_continue',
+        'loop_count',
+        'lt',
+        'lte',
+        'magick_image',
+        'map',
+        'map_iterator',
+        'match_comparator',
+        'match_notrange',
+        'match_notregexp',
+        'match_range',
+        'match_regexp',
+        'math_abs',
+        'math_acos',
+        'math_add',
+        'math_asin',
+        'math_atan',
+        'math_atan2',
+        'math_ceil',
+        'math_converteuro',
+        'math_cos',
+        'math_div',
+        'math_exp',
+        'math_floor',
+        'math_internal_rand',
+        'math_internal_randmax',
+        'math_internal_srand',
+        'math_ln',
+        'math_log',
+        'math_log10',
+        'math_max',
+        'math_min',
+        'math_mod',
+        'math_mult',
+        'math_pow',
+        'math_random',
+        'math_range',
+        'math_rint',
+        'math_roman',
+        'math_round',
+        'math_sin',
+        'math_sqrt',
+        'math_sub',
+        'math_tan',
+        'maxrecords_value',
+        'memory_session_driver',
+        'mime_type',
+        'minimal',
+        'misc__srand',
+        'misc_randomnumber',
+        'misc_roman',
+        'misc_valid_creditcard',
+        'mysql_session_driver',
+        'named_param',
+        'namespace_current',
+        'namespace_delimiter',
+        'namespace_exists',
+        'namespace_file_fullpathexists',
+        'namespace_global',
+        'namespace_import',
+        'namespace_load',
+        'namespace_page',
+        'namespace_unload',
+        'namespace_using',
+        'neq',
+        'net',
+        'net_connectinprogress',
+        'net_connectok',
+        'net_typessl',
+        'net_typessltcp',
+        'net_typessludp',
+        'net_typetcp',
+        'net_typeudp',
+        'net_waitread',
+        'net_waittimeout',
+        'net_waitwrite',
+        'no_default_output',
+        'none',
+        'noprocess',
+        'not',
+        'nrx',
+        'nslookup',
+        'null',
+        'object',
+        'once',
+        'oneoff',
+        'op_logicalvalue',
+        'operator_logicalvalue',
+        'option',
+        'or',
+        'os_process',
+        'output',
+        'output_none',
+        'pair',
+        'params_up',
+        'pdf_barcode',
+        'pdf_color',
+        'pdf_doc',
+        'pdf_font',
+        'pdf_image',
+        'pdf_list',
+        'pdf_read',
+        'pdf_serve',
+        'pdf_table',
+        'pdf_text',
+        'percent',
+        'portal',
+        'postcondition',
+        'precondition',
+        'prettyprintingnsmap',
+        'prettyprintingtypemap',
+        'priorityqueue',
+        'private',
+        'proc_convert',
+        'proc_convertbody',
+        'proc_convertone',
+        'proc_extract',
+        'proc_extractone',
+        'proc_find',
+        'proc_first',
+        'proc_foreach',
+        'proc_get',
+        'proc_join',
+        'proc_lasso',
+        'proc_last',
+        'proc_map_entry',
+        'proc_null',
+        'proc_regexp',
+        'proc_xml',
+        'proc_xslt',
+        'process',
+        'protect',
+        'queue',
+        'rand',
+        'randomnumber',
+        'raw',
+        'recid_value',
+        'record_count',
+        'recordcount',
+        'recordid_value',
+        'records',
+        'records_array',
+        'records_map',
+        'redirect_url',
+        'reference',
+        'referer',
+        'referer_url',
+        'referrer',
+        'referrer_url',
+        'regexp',
+        'repeating',
+        'repeating_valueitem',
+        'repeatingvalueitem',
+        'repetition',
+        'req_column',
+        'req_field',
+        'required_column',
+        'required_field',
+        'response_fileexists',
+        'response_filepath',
+        'response_localpath',
+        'response_path',
+        'response_realm',
+        'resultset',
+        'resultset_count',
+        'return',
+        'return_value',
+        'reverseiterator',
+        'roman',
+        'row_count',
+        'rows',
+        'rows_array',
+        'run_children',
+        'rx',
+        'schema_name',
+        'scientific',
+        'search_args',
+        'search_arguments',
+        'search_columnitem',
+        'search_fielditem',
+        'search_operatoritem',
+        'search_opitem',
+        'search_valueitem',
+        'searchfielditem',
+        'searchoperatoritem',
+        'searchopitem',
+        'searchvalueitem',
+        'select',
+        'selected',
+        'self',
+        'serialize',
+        'series',
+        'server_date',
+        'server_day',
+        'server_ip',
+        'server_name',
+        'server_port',
+        'server_push',
+        'server_siteisrunning',
+        'server_sitestart',
+        'server_sitestop',
+        'server_time',
+        'session_abort',
+        'session_addoutputfilter',
+        'session_addvar',
+        'session_addvariable',
+        'session_deleteexpired',
+        'session_driver',
+        'session_end',
+        'session_id',
+        'session_removevar',
+        'session_removevariable',
+        'session_result',
+        'session_setdriver',
+        'session_start',
+        'set',
+        'set_iterator',
+        'set_reverseiterator',
+        'shown_count',
+        'shown_first',
+        'shown_last',
+        'site_atbegin',
+        'site_id',
+        'site_name',
+        'site_restart',
+        'skiprecords_value',
+        'sleep',
+        'soap_convertpartstopairs',
+        'soap_definetag',
+        'soap_info',
+        'soap_lastrequest',
+        'soap_lastresponse',
+        'soap_stub',
+        'sort_args',
+        'sort_arguments',
+        'sort_columnitem',
+        'sort_fielditem',
+        'sort_orderitem',
+        'sortcolumnitem',
+        'sortfielditem',
+        'sortorderitem',
+        'sqlite_createdb',
+        'sqlite_session_driver',
+        'sqlite_setsleepmillis',
+        'sqlite_setsleeptries',
+        'srand',
+        'stack',
+        'stock_quote',
+        'string',
+        'string_charfromname',
+        'string_concatenate',
+        'string_countfields',
+        'string_endswith',
+        'string_extract',
+        'string_findposition',
+        'string_findregexp',
+        'string_fordigit',
+        'string_getfield',
+        'string_getunicodeversion',
+        'string_insert',
+        'string_isalpha',
+        'string_isalphanumeric',
+        'string_isdigit',
+        'string_ishexdigit',
+        'string_islower',
+        'string_isnumeric',
+        'string_ispunctuation',
+        'string_isspace',
+        'string_isupper',
+        'string_length',
+        'string_lowercase',
+        'string_remove',
+        'string_removeleading',
+        'string_removetrailing',
+        'string_replace',
+        'string_replaceregexp',
+        'string_todecimal',
+        'string_tointeger',
+        'string_uppercase',
+        'string_validcharset',
+        'table_name',
+        'table_realname',
+        'tag',
+        'tag_name',
+        'tags',
+        'tags_find',
+        'tags_list',
+        'tcp_close',
+        'tcp_open',
+        'tcp_send',
+        'tcp_tcp_close',
+        'tcp_tcp_open',
+        'tcp_tcp_send',
+        'thread_abort',
+        'thread_atomic',
+        'thread_event',
+        'thread_exists',
+        'thread_getcurrentid',
+        'thread_getpriority',
+        'thread_info',
+        'thread_list',
+        'thread_lock',
+        'thread_pipe',
+        'thread_priority_default',
+        'thread_priority_high',
+        'thread_priority_low',
+        'thread_rwlock',
+        'thread_semaphore',
+        'thread_setpriority',
+        'token_value',
+        'total_records',
+        'treemap',
+        'treemap_iterator',
+        'true',
+        'url_rewrite',
+        'valid_creditcard',
+        'valid_date',
+        'valid_email',
+        'valid_url',
+        'value_list',
+        'value_listitem',
+        'valuelistitem',
+        'var',
+        'var_defined',
+        'var_remove',
+        'var_reset',
+        'var_set',
+        'variable',
+        'variable_defined',
+        'variable_set',
+        'variables',
+        'variant_count',
+        'vars',
+        'wap_isenabled',
+        'wap_maxbuttons',
+        'wap_maxcolumns',
+        'wap_maxhorzpixels',
+        'wap_maxrows',
+        'wap_maxvertpixels',
+        'while',
+        'wsdl_extract',
+        'wsdl_getbinding',
+        'wsdl_getbindingforoperation',
+        'wsdl_getbindingoperations',
+        'wsdl_getmessagenamed',
+        'wsdl_getmessageparts',
+        'wsdl_getmessagetriofromporttype',
+        'wsdl_getopbodystyle',
+        'wsdl_getopbodyuse',
+        'wsdl_getoperation',
+        'wsdl_getoplocation',
+        'wsdl_getopmessagetypes',
+        'wsdl_getopsoapaction',
+        'wsdl_getportaddress',
+        'wsdl_getportsforservice',
+        'wsdl_getporttype',
+        'wsdl_getporttypeoperation',
+        'wsdl_getservicedocumentation',
+        'wsdl_getservices',
+        'wsdl_gettargetnamespace',
+        'wsdl_issoapoperation',
+        'wsdl_listoperations',
+        'wsdl_maketest',
+        'xml',
+        'xml_extract',
+        'xml_rpc',
+        'xml_rpccall',
+        'xml_rw',
+        'xml_serve',
+        'xml_transform',
+        'xml_xml',
+        'xml_xmlstream',
+        'xmlstream',
+        'xsd_attribute',
+        'xsd_blankarraybase',
+        'xsd_blankbase',
+        'xsd_buildtype',
+        'xsd_cache',
+        'xsd_checkcardinality',
+        'xsd_continueall',
+        'xsd_continueannotation',
+        'xsd_continueany',
+        'xsd_continueanyattribute',
+        'xsd_continueattribute',
+        'xsd_continueattributegroup',
+        'xsd_continuechoice',
+        'xsd_continuecomplexcontent',
+        'xsd_continuecomplextype',
+        'xsd_continuedocumentation',
+        'xsd_continueextension',
+        'xsd_continuegroup',
+        'xsd_continuekey',
+        'xsd_continuelist',
+        'xsd_continuerestriction',
+        'xsd_continuesequence',
+        'xsd_continuesimplecontent',
+        'xsd_continuesimpletype',
+        'xsd_continueunion',
+        'xsd_deserialize',
+        'xsd_fullyqualifyname',
+        'xsd_generate',
+        'xsd_generateblankfromtype',
+        'xsd_generateblanksimpletype',
+        'xsd_generatetype',
+        'xsd_getschematype',
+        'xsd_issimpletype',
+        'xsd_loadschema',
+        'xsd_lookupnamespaceuri',
+        'xsd_lookuptype',
+        'xsd_processany',
+        'xsd_processattribute',
+        'xsd_processattributegroup',
+        'xsd_processcomplextype',
+        'xsd_processelement',
+        'xsd_processgroup',
+        'xsd_processimport',
+        'xsd_processinclude',
+        'xsd_processschema',
+        'xsd_processsimpletype',
+        'xsd_ref',
+        'xsd_type',
+    )
+}
+MEMBERS = {
+    'Member Methods': (
+        'abort',
+        'abs',
+        'accept_charset',
+        'accept',
+        'acceptconnections',
+        'acceptdeserializedelement',
+        'acceptnossl',
+        'acceptpost',
+        'accesskey',
+        'acos',
+        'acosh',
+        'action',
+        'actionparams',
+        'active_tick',
+        'add',
+        'addatend',
+        'addattachment',
+        'addbarcode',
+        'addchapter',
+        'addcheckbox',
+        'addcolumninfo',
+        'addcombobox',
+        'addcomment',
+        'addcomponent',
+        'addcomponents',
+        'addcss',
+        'adddatabasetable',
+        'adddatasource',
+        'adddatasourcedatabase',
+        'adddatasourcehost',
+        'adddir',
+        'adddirpath',
+        'addendjs',
+        'addendjstext',
+        'adderror',
+        'addfavicon',
+        'addfile',
+        'addgroup',
+        'addheader',
+        'addhiddenfield',
+        'addhtmlpart',
+        'addimage',
+        'addjavascript',
+        'addjs',
+        'addjstext',
+        'addlist',
+        'addmathfunctions',
+        'addmember',
+        'addoneheaderline',
+        'addpage',
+        'addparagraph',
+        'addpart',
+        'addpasswordfield',
+        'addphrase',
+        'addpostdispatch',
+        'addpredispatch',
+        'addradiobutton',
+        'addradiogroup',
+        'addresetbutton',
+        'addrow',
+        'addsection',
+        'addselectlist',
+        'addset',
+        'addsubmitbutton',
+        'addsubnode',
+        'addtable',
+        'addtask',
+        'addtext',
+        'addtextarea',
+        'addtextfield',
+        'addtextpart',
+        'addtobuffer',
+        'addtrait',
+        'adduser',
+        'addusertogroup',
+        'addwarning',
+        'addzip',
+        'allocobject',
+        'am',
+        'ampm',
+        'annotate',
+        'answer',
+        'apop',
+        'append',
+        'appendarray',
+        'appendarraybegin',
+        'appendarrayend',
+        'appendbool',
+        'appendbytes',
+        'appendchar',
+        'appendchild',
+        'appendcolon',
+        'appendcomma',
+        'appenddata',
+        'appenddatetime',
+        'appenddbpointer',
+        'appenddecimal',
+        'appenddocument',
+        'appendimagetolist',
+        'appendinteger',
+        'appendnowutc',
+        'appendnull',
+        'appendoid',
+        'appendregex',
+        'appendreplacement',
+        'appendstring',
+        'appendtail',
+        'appendtime',
+        'applyheatcolors',
+        'appmessage',
+        'appname',
+        'appprefix',
+        'appstatus',
+        'arc',
+        'archive',
+        'arguments',
+        'argumentvalue',
+        'asarray',
+        'asarraystring',
+        'asasync',
+        'asbytes',
+        'ascopy',
+        'ascopydeep',
+        'asdecimal',
+        'asgenerator',
+        'asin',
+        'asinh',
+        'asinteger',
+        'askeyedgenerator',
+        'aslazystring',
+        'aslist',
+        'asraw',
+        'asstaticarray',
+        'asstring',
+        'asstringhex',
+        'asstringoct',
+        'asxml',
+        'atan',
+        'atan2',
+        'atanh',
+        'atend',
+        'atends',
+        'atime',
+        'attributecount',
+        'attributes',
+        'attrs',
+        'auth',
+        'authenticate',
+        'authorize',
+        'autocollectbuffer',
+        'average',
+        'back',
+        'basename',
+        'basepaths',
+        'baseuri',
+        'bcc',
+        'beginssl',
+        'beginswith',
+        'begintls',
+        'bestcharset',
+        'bind_blob',
+        'bind_double',
+        'bind_int',
+        'bind_null',
+        'bind_parameter_index',
+        'bind_text',
+        'bind',
+        'bindcount',
+        'bindone',
+        'bindparam',
+        'bitand',
+        'bitclear',
+        'bitflip',
+        'bitformat',
+        'bitnot',
+        'bitor',
+        'bitset',
+        'bitshiftleft',
+        'bitshiftright',
+        'bittest',
+        'bitxor',
+        'blur',
+        'body',
+        'bodybytes',
+        'boundary',
+        'bptoxml',
+        'bptypetostr',
+        'bucketnumber',
+        'buff',
+        'buildquery',
+        'businessdaysbetween',
+        'by',
+        'bytes',
+        'cachedappprefix',
+        'cachedroot',
+        'callboolean',
+        'callbooleanmethod',
+        'callbytemethod',
+        'callcharmethod',
+        'calldoublemethod',
+        'calledname',
+        'callfirst',
+        'callfloat',
+        'callfloatmethod',
+        'callint',
+        'callintmethod',
+        'calllongmethod',
+        'callnonvirtualbooleanmethod',
+        'callnonvirtualbytemethod',
+        'callnonvirtualcharmethod',
+        'callnonvirtualdoublemethod',
+        'callnonvirtualfloatmethod',
+        'callnonvirtualintmethod',
+        'callnonvirtuallongmethod',
+        'callnonvirtualobjectmethod',
+        'callnonvirtualshortmethod',
+        'callnonvirtualvoidmethod',
+        'callobject',
+        'callobjectmethod',
+        'callshortmethod',
+        'callsite_col',
+        'callsite_file',
+        'callsite_line',
+        'callstack',
+        'callstaticboolean',
+        'callstaticbooleanmethod',
+        'callstaticbytemethod',
+        'callstaticcharmethod',
+        'callstaticdoublemethod',
+        'callstaticfloatmethod',
+        'callstaticint',
+        'callstaticintmethod',
+        'callstaticlongmethod',
+        'callstaticobject',
+        'callstaticobjectmethod',
+        'callstaticshortmethod',
+        'callstaticstring',
+        'callstaticvoidmethod',
+        'callstring',
+        'callvoid',
+        'callvoidmethod',
+        'cancel',
+        'cap',
+        'capa',
+        'capabilities',
+        'capi',
+        'cbrt',
+        'cc',
+        'ceil',
+        'chardigitvalue',
+        'charname',
+        'charset',
+        'chartype',
+        'checkdebugging',
+        'checked',
+        'checkuser',
+        'childnodes',
+        'chk',
+        'chmod',
+        'choosecolumntype',
+        'chown',
+        'chunked',
+        'circle',
+        'class',
+        'classid',
+        'clear',
+        'clonenode',
+        'close',
+        'closepath',
+        'closeprepared',
+        'closewrite',
+        'code',
+        'codebase',
+        'codetype',
+        'colmap',
+        'colorspace',
+        'column_blob',
+        'column_count',
+        'column_decltype',
+        'column_double',
+        'column_int64',
+        'column_name',
+        'column_text',
+        'column_type',
+        'command',
+        'comments',
+        'compare',
+        'comparecodepointorder',
+        'componentdelimiter',
+        'components',
+        'composite',
+        'compress',
+        'concat',
+        'condtoint',
+        'configureds',
+        'configuredskeys',
+        'connect',
+        'connection',
+        'connectionhandler',
+        'connhandler',
+        'consume_domain',
+        'consume_label',
+        'consume_message',
+        'consume_rdata',
+        'consume_string',
+        'contains',
+        'content_disposition',
+        'content_transfer_encoding',
+        'content_type',
+        'content',
+        'contentlength',
+        'contents',
+        'contenttype',
+        'continuation',
+        'continuationpacket',
+        'continuationpoint',
+        'continuationstack',
+        'continue',
+        'contrast',
+        'conventionaltop',
+        'convert',
+        'cookie',
+        'cookies',
+        'cookiesarray',
+        'cookiesary',
+        'copyto',
+        'cos',
+        'cosh',
+        'count',
+        'countkeys',
+        'country',
+        'countusersbygroup',
+        'crc',
+        'create',
+        'createattribute',
+        'createattributens',
+        'createcdatasection',
+        'createcomment',
+        'createdocument',
+        'createdocumentfragment',
+        'createdocumenttype',
+        'createelement',
+        'createelementns',
+        'createentityreference',
+        'createindex',
+        'createprocessinginstruction',
+        'createtable',
+        'createtextnode',
+        'criteria',
+        'crop',
+        'csscontent',
+        'curl',
+        'current',
+        'currentfile',
+        'curveto',
+        'd',
+        'data',
+        'databasecolumnnames',
+        'databasecolumns',
+        'databasemap',
+        'databasename',
+        'datasourcecolumnnames',
+        'datasourcecolumns',
+        'datasourcemap',
+        'date',
+        'day',
+        'dayofmonth',
+        'dayofweek',
+        'dayofweekinmonth',
+        'dayofyear',
+        'days',
+        'daysbetween',
+        'db',
+        'dbtablestable',
+        'debug',
+        'declare',
+        'decodebase64',
+        'decodehex',
+        'decodehtml',
+        'decodeqp',
+        'decodeurl',
+        'decodexml',
+        'decompose',
+        'decomposeassignment',
+        'defaultcontentrepresentation',
+        'defer',
+        'deg2rad',
+        'dele',
+        'delete',
+        'deletedata',
+        'deleteglobalref',
+        'deletelocalref',
+        'delim',
+        'depth',
+        'dereferencepointer',
+        'describe',
+        'description',
+        'deserialize',
+        'detach',
+        'detectcharset',
+        'didinclude',
+        'difference',
+        'digit',
+        'dir',
+        'displaycountry',
+        'displaylanguage',
+        'displayname',
+        'displayscript',
+        'displayvariant',
+        'div',
+        'dns_response',
+        'do',
+        'doatbegins',
+        'doatends',
+        'doccomment',
+        'doclose',
+        'doctype',
+        'document',
+        'documentelement',
+        'documentroot',
+        'domainbody',
+        'done',
+        'dosessions',
+        'dowithclose',
+        'dowlocal',
+        'download',
+        'drawtext',
+        'drop',
+        'dropindex',
+        'dsdbtable',
+        'dshoststable',
+        'dsinfo',
+        'dst',
+        'dstable',
+        'dstoffset',
+        'dtdid',
+        'dup',
+        'dup2',
+        'each',
+        'eachbyte',
+        'eachcharacter',
+        'eachchild',
+        'eachcomponent',
+        'eachdir',
+        'eachdirpath',
+        'eachdirpathrecursive',
+        'eachentry',
+        'eachfile',
+        'eachfilename',
+        'eachfilepath',
+        'eachfilepathrecursive',
+        'eachkey',
+        'eachline',
+        'eachlinebreak',
+        'eachmatch',
+        'eachnode',
+        'eachpair',
+        'eachpath',
+        'eachpathrecursive',
+        'eachrow',
+        'eachsub',
+        'eachword',
+        'eachwordbreak',
+        'element',
+        'eligiblepath',
+        'eligiblepaths',
+        'encodebase64',
+        'encodehex',
+        'encodehtml',
+        'encodehtmltoxml',
+        'encodemd5',
+        'encodepassword',
+        'encodeqp',
+        'encodesql',
+        'encodesql92',
+        'encodeurl',
+        'encodevalue',
+        'encodexml',
+        'encoding',
+        'enctype',
+        'end',
+        'endjs',
+        'endssl',
+        'endswith',
+        'endtls',
+        'enhance',
+        'ensurestopped',
+        'entities',
+        'entry',
+        'env',
+        'equals',
+        'era',
+        'erf',
+        'erfc',
+        'err',
+        'errcode',
+        'errmsg',
+        'error',
+        'errors',
+        'errstack',
+        'escape_member',
+        'establisherrorstate',
+        'exceptioncheck',
+        'exceptionclear',
+        'exceptiondescribe',
+        'exceptionoccurred',
+        'exchange',
+        'execinits',
+        'execinstalls',
+        'execute',
+        'executelazy',
+        'executenow',
+        'exists',
+        'exit',
+        'exitcode',
+        'exp',
+        'expire',
+        'expireminutes',
+        'expiresminutes',
+        'expm1',
+        'export16bits',
+        'export32bits',
+        'export64bits',
+        'export8bits',
+        'exportas',
+        'exportbytes',
+        'exportfdf',
+        'exportpointerbits',
+        'exportsigned16bits',
+        'exportsigned32bits',
+        'exportsigned64bits',
+        'exportsigned8bits',
+        'exportstring',
+        'expose',
+        'extendedyear',
+        'extensiondelimiter',
+        'extensions',
+        'extract',
+        'extractfast',
+        'extractfastone',
+        'extractimage',
+        'extractone',
+        'f',
+        'fabs',
+        'fail',
+        'failnoconnectionhandler',
+        'family',
+        'fatalerror',
+        'fcgireq',
+        'fchdir',
+        'fchmod',
+        'fchown',
+        'fd',
+        'features',
+        'fetchdata',
+        'fieldnames',
+        'fieldposition',
+        'fieldstable',
+        'fieldtype',
+        'fieldvalue',
+        'file',
+        'filename',
+        'filenames',
+        'filequeue',
+        'fileuploads',
+        'fileuploadsary',
+        'filterinputcolumn',
+        'finalize',
+        'find',
+        'findall',
+        'findandmodify',
+        'findbucket',
+        'findcase',
+        'findclass',
+        'findcount',
+        'finddescendant',
+        'findfirst',
+        'findinclude',
+        'findinctx',
+        'findindex',
+        'findlast',
+        'findpattern',
+        'findposition',
+        'findsymbols',
+        'first',
+        'firstchild',
+        'firstcomponent',
+        'firstdayofweek',
+        'firstnode',
+        'fixformat',
+        'flags',
+        'fliph',
+        'flipv',
+        'floor',
+        'flush',
+        'foldcase',
+        'foo',
+        'for',
+        'forcedrowid',
+        'foreach',
+        'foreachaccept',
+        'foreachbyte',
+        'foreachcharacter',
+        'foreachchild',
+        'foreachday',
+        'foreachentry',
+        'foreachfile',
+        'foreachfilename',
+        'foreachkey',
+        'foreachline',
+        'foreachlinebreak',
+        'foreachmatch',
+        'foreachnode',
+        'foreachpair',
+        'foreachpathcomponent',
+        'foreachrow',
+        'foreachspool',
+        'foreachsub',
+        'foreachwordbreak',
+        'form',
+        'format',
+        'formatas',
+        'formatcontextelement',
+        'formatcontextelements',
+        'formatnumber',
+        'free',
+        'frexp',
+        'from',
+        'fromname',
+        'fromport',
+        'fromreflectedfield',
+        'fromreflectedmethod',
+        'front',
+        'fsync',
+        'ftpdeletefile',
+        'ftpgetlisting',
+        'ftruncate',
+        'fullpath',
+        'fx',
+        'gamma',
+        'gatewayinterface',
+        'gen',
+        'generatechecksum',
+        'get',
+        'getabswidth',
+        'getalignment',
+        'getappsource',
+        'getarraylength',
+        'getattr',
+        'getattribute',
+        'getattributenamespace',
+        'getattributenode',
+        'getattributenodens',
+        'getattributens',
+        'getbarheight',
+        'getbarmultiplier',
+        'getbarwidth',
+        'getbaseline',
+        'getbold',
+        'getbooleanarrayelements',
+        'getbooleanarrayregion',
+        'getbooleanfield',
+        'getbordercolor',
+        'getborderwidth',
+        'getbytearrayelements',
+        'getbytearrayregion',
+        'getbytefield',
+        'getchararrayelements',
+        'getchararrayregion',
+        'getcharfield',
+        'getclass',
+        'getcode',
+        'getcolor',
+        'getcolumn',
+        'getcolumncount',
+        'getcolumns',
+        'getdatabasebyalias',
+        'getdatabasebyid',
+        'getdatabasebyname',
+        'getdatabasehost',
+        'getdatabasetable',
+        'getdatabasetablebyalias',
+        'getdatabasetablebyid',
+        'getdatabasetablepart',
+        'getdatasource',
+        'getdatasourcedatabase',
+        'getdatasourcedatabasebyid',
+        'getdatasourcehost',
+        'getdatasourceid',
+        'getdatasourcename',
+        'getdefaultstorage',
+        'getdoublearrayelements',
+        'getdoublearrayregion',
+        'getdoublefield',
+        'getelementbyid',
+        'getelementsbytagname',
+        'getelementsbytagnamens',
+        'getencoding',
+        'getface',
+        'getfield',
+        'getfieldid',
+        'getfile',
+        'getfloatarrayelements',
+        'getfloatarrayregion',
+        'getfloatfield',
+        'getfont',
+        'getformat',
+        'getfullfontname',
+        'getgroup',
+        'getgroupid',
+        'getheader',
+        'getheaders',
+        'gethostdatabase',
+        'gethtmlattr',
+        'gethtmlattrstring',
+        'getinclude',
+        'getintarrayelements',
+        'getintarrayregion',
+        'getintfield',
+        'getisocomment',
+        'getitalic',
+        'getlasterror',
+        'getlcapitype',
+        'getlibrary',
+        'getlongarrayelements',
+        'getlongarrayregion',
+        'getlongfield',
+        'getmargins',
+        'getmethodid',
+        'getmode',
+        'getnameditem',
+        'getnameditemns',
+        'getnode',
+        'getnumericvalue',
+        'getobjectarrayelement',
+        'getobjectclass',
+        'getobjectfield',
+        'getpadding',
+        'getpagenumber',
+        'getparts',
+        'getprefs',
+        'getpropertyvalue',
+        'getprowcount',
+        'getpsfontname',
+        'getrange',
+        'getrowcount',
+        'getset',
+        'getshortarrayelements',
+        'getshortarrayregion',
+        'getshortfield',
+        'getsize',
+        'getsortfieldspart',
+        'getspacing',
+        'getstaticbooleanfield',
+        'getstaticbytefield',
+        'getstaticcharfield',
+        'getstaticdoublefield',
+        'getstaticfieldid',
+        'getstaticfloatfield',
+        'getstaticintfield',
+        'getstaticlongfield',
+        'getstaticmethodid',
+        'getstaticobjectfield',
+        'getstaticshortfield',
+        'getstatus',
+        'getstringchars',
+        'getstringlength',
+        'getstyle',
+        'getsupportedencodings',
+        'gettablebyid',
+        'gettext',
+        'gettextalignment',
+        'gettextsize',
+        'gettrigger',
+        'gettype',
+        'getunderline',
+        'getuniquealiasname',
+        'getuser',
+        'getuserbykey',
+        'getuserid',
+        'getversion',
+        'getzipfilebytes',
+        'givenblock',
+        'gmt',
+        'gotconnection',
+        'gotfileupload',
+        'groupby',
+        'groupcolumns',
+        'groupcount',
+        'groupjoin',
+        'handlebreakpointget',
+        'handlebreakpointlist',
+        'handlebreakpointremove',
+        'handlebreakpointset',
+        'handlebreakpointupdate',
+        'handlecontextget',
+        'handlecontextnames',
+        'handlecontinuation',
+        'handledefinitionbody',
+        'handledefinitionhead',
+        'handledefinitionresource',
+        'handledevconnection',
+        'handleevalexpired',
+        'handlefeatureget',
+        'handlefeatureset',
+        'handlelassoappcontent',
+        'handlelassoappresponse',
+        'handlenested',
+        'handlenormalconnection',
+        'handlepop',
+        'handleresource',
+        'handlesource',
+        'handlestackget',
+        'handlestderr',
+        'handlestdin',
+        'handlestdout',
+        'handshake',
+        'hasattribute',
+        'hasattributens',
+        'hasattributes',
+        'hasbinaryproperty',
+        'haschildnodes',
+        'hasexpired',
+        'hasfeature',
+        'hasfield',
+        'hash',
+        'hashtmlattr',
+        'hasmethod',
+        'hastable',
+        'hastrailingcomponent',
+        'hasvalue',
+        'head',
+        'header',
+        'headerbytes',
+        'headers',
+        'headersarray',
+        'headersmap',
+        'height',
+        'histogram',
+        'home',
+        'host',
+        'hostcolumnnames',
+        'hostcolumnnames2',
+        'hostcolumns',
+        'hostcolumns2',
+        'hostdatasource',
+        'hostextra',
+        'hostid',
+        'hostisdynamic',
+        'hostmap',
+        'hostmap2',
+        'hostname',
+        'hostpassword',
+        'hostport',
+        'hostschema',
+        'hosttableencoding',
+        'hosttonet16',
+        'hosttonet32',
+        'hosttonet64',
+        'hostusername',
+        'hour',
+        'hourofampm',
+        'hourofday',
+        'hoursbetween',
+        'href',
+        'hreflang',
+        'htmlcontent',
+        'htmlizestacktrace',
+        'htmlizestacktracelink',
+        'httpaccept',
+        'httpacceptencoding',
+        'httpacceptlanguage',
+        'httpauthorization',
+        'httpcachecontrol',
+        'httpconnection',
+        'httpcookie',
+        'httpequiv',
+        'httphost',
+        'httpreferer',
+        'httpreferrer',
+        'httpuseragent',
+        'hypot',
+        'id',
+        'idealinmemory',
+        'idle',
+        'idmap',
+        'ifempty',
+        'ifkey',
+        'ifnotempty',
+        'ifnotkey',
+        'ignorecase',
+        'ilogb',
+        'imgptr',
+        'implementation',
+        'import16bits',
+        'import32bits',
+        'import64bits',
+        'import8bits',
+        'importas',
+        'importbytes',
+        'importfdf',
+        'importnode',
+        'importpointer',
+        'importstring',
+        'in',
+        'include',
+        'includebytes',
+        'includelibrary',
+        'includelibraryonce',
+        'includeonce',
+        'includes',
+        'includestack',
+        'indaylighttime',
+        'index',
+        'init',
+        'initialize',
+        'initrequest',
+        'inits',
+        'inneroncompare',
+        'input',
+        'inputcolumns',
+        'inputtype',
+        'insert',
+        'insertback',
+        'insertbefore',
+        'insertdata',
+        'insertfirst',
+        'insertfrom',
+        'insertfront',
+        'insertinternal',
+        'insertlast',
+        'insertpage',
+        'install',
+        'installs',
+        'integer',
+        'internalsubset',
+        'interrupt',
+        'intersection',
+        'inttocond',
+        'invoke',
+        'invokeautocollect',
+        'invokeuntil',
+        'invokewhile',
+        'ioctl',
+        'isa',
+        'isalive',
+        'isallof',
+        'isalnum',
+        'isalpha',
+        'isanyof',
+        'isbase',
+        'isblank',
+        'iscntrl',
+        'isdigit',
+        'isdir',
+        'isdirectory',
+        'isempty',
+        'isemptyelement',
+        'isfirststep',
+        'isfullpath',
+        'isgraph',
+        'ishttps',
+        'isidle',
+        'isinstanceof',
+        'islink',
+        'islower',
+        'ismultipart',
+        'isnan',
+        'isnota',
+        'isnotempty',
+        'isnothing',
+        'iso3country',
+        'iso3language',
+        'isopen',
+        'isprint',
+        'ispunct',
+        'issameobject',
+        'isset',
+        'issourcefile',
+        'isspace',
+        'isssl',
+        'issupported',
+        'istitle',
+        'istruetype',
+        'istype',
+        'isualphabetic',
+        'isulowercase',
+        'isupper',
+        'isuuppercase',
+        'isuwhitespace',
+        'isvalid',
+        'iswhitespace',
+        'isxdigit',
+        'isxhr',
+        'item',
+        'j0',
+        'j1',
+        'javascript',
+        'jbarcode',
+        'jcolor',
+        'jfont',
+        'jimage',
+        'jlist',
+        'jn',
+        'jobjectisa',
+        'join',
+        'jread',
+        'jscontent',
+        'jsonfornode',
+        'jsonhtml',
+        'jsonisleaf',
+        'jsonlabel',
+        'jtable',
+        'jtext',
+        'julianday',
+        'kernel',
+        'key',
+        'keycolumns',
+        'keys',
+        'keywords',
+        'kill',
+        'label',
+        'lang',
+        'language',
+        'last_insert_rowid',
+        'last',
+        'lastaccessdate',
+        'lastaccesstime',
+        'lastchild',
+        'lastcomponent',
+        'lasterror',
+        'lastinsertid',
+        'lastnode',
+        'lastpoint',
+        'lasttouched',
+        'lazyvalue',
+        'ldexp',
+        'leaveopen',
+        'left',
+        'length',
+        'lgamma',
+        'line',
+        'linediffers',
+        'linkto',
+        'linktype',
+        'list',
+        'listactivedatasources',
+        'listalldatabases',
+        'listalltables',
+        'listdatabasetables',
+        'listdatasourcedatabases',
+        'listdatasourcehosts',
+        'listdatasources',
+        'listen',
+        'listgroups',
+        'listgroupsbyuser',
+        'listhostdatabases',
+        'listhosts',
+        'listmethods',
+        'listnode',
+        'listusers',
+        'listusersbygroup',
+        'loadcerts',
+        'loaddatasourcehostinfo',
+        'loaddatasourceinfo',
+        'loadlibrary',
+        'localaddress',
+        'localname',
+        'locals',
+        'lock',
+        'log',
+        'log10',
+        'log1p',
+        'logb',
+        'lookupnamespace',
+        'lop',
+        'lowagiefont',
+        'lowercase',
+        'makecolor',
+        'makecolumnlist',
+        'makecolumnmap',
+        'makecookieyumyum',
+        'makefullpath',
+        'makeinheritedcopy',
+        'makenonrelative',
+        'makeurl',
+        'map',
+        'marker',
+        'matches',
+        'matchesstart',
+        'matchposition',
+        'matchstring',
+        'matchtriggers',
+        'max',
+        'maxinmemory',
+        'maxlength',
+        'maxrows',
+        'maxworkers',
+        'maybeslash',
+        'maybevalue',
+        'md5hex',
+        'media',
+        'members',
+        'merge',
+        'meta',
+        'method',
+        'methodname',
+        'millisecond',
+        'millisecondsinday',
+        'mime_boundary',
+        'mime_contenttype',
+        'mime_hdrs',
+        'mime',
+        'mimes',
+        'min',
+        'minute',
+        'minutesbetween',
+        'moddatestr',
+        'mode',
+        'modf',
+        'modificationdate',
+        'modificationtime',
+        'modulate',
+        'monitorenter',
+        'monitorexit',
+        'month',
+        'moveto',
+        'movetoattribute',
+        'movetoattributenamespace',
+        'movetoelement',
+        'movetofirstattribute',
+        'movetonextattribute',
+        'msg',
+        'mtime',
+        'multiple',
+        'n',
+        'name',
+        'named',
+        'namespaceuri',
+        'needinitialization',
+        'net',
+        'nettohost16',
+        'nettohost32',
+        'nettohost64',
+        'new',
+        'newbooleanarray',
+        'newbytearray',
+        'newchararray',
+        'newdoublearray',
+        'newfloatarray',
+        'newglobalref',
+        'newintarray',
+        'newlongarray',
+        'newobject',
+        'newobjectarray',
+        'newshortarray',
+        'newstring',
+        'next',
+        'nextafter',
+        'nextnode',
+        'nextprime',
+        'nextprune',
+        'nextprunedelta',
+        'nextsibling',
+        'nodeforpath',
+        'nodelist',
+        'nodename',
+        'nodetype',
+        'nodevalue',
+        'noop',
+        'normalize',
+        'notationname',
+        'notations',
+        'novaluelists',
+        'numsets',
+        'object',
+        'objects',
+        'objecttype',
+        'onclick',
+        'oncompare',
+        'oncomparestrict',
+        'onconvert',
+        'oncreate',
+        'ondblclick',
+        'onkeydown',
+        'onkeypress',
+        'onkeyup',
+        'onmousedown',
+        'onmousemove',
+        'onmouseout',
+        'onmouseover',
+        'onmouseup',
+        'onreset',
+        'onsubmit',
+        'ontop',
+        'open',
+        'openappend',
+        'openread',
+        'opentruncate',
+        'openwith',
+        'openwrite',
+        'openwriteonly',
+        'orderby',
+        'orderbydescending',
+        'out',
+        'output',
+        'outputencoding',
+        'ownerdocument',
+        'ownerelement',
+        'padleading',
+        'padtrailing',
+        'padzero',
+        'pagecount',
+        'pagerotation',
+        'pagesize',
+        'param',
+        'paramdescs',
+        'params',
+        'parent',
+        'parentdir',
+        'parentnode',
+        'parse_body',
+        'parse_boundary',
+        'parse_charset',
+        'parse_content_disposition',
+        'parse_content_transfer_encoding',
+        'parse_content_type',
+        'parse_hdrs',
+        'parse_mode',
+        'parse_msg',
+        'parse_parts',
+        'parse_rawhdrs',
+        'parse',
+        'parseas',
+        'parsedocument',
+        'parsenumber',
+        'parseoneheaderline',
+        'pass',
+        'path',
+        'pathinfo',
+        'pathtouri',
+        'pathtranslated',
+        'pause',
+        'payload',
+        'pdifference',
+        'perform',
+        'performonce',
+        'perms',
+        'pid',
+        'pixel',
+        'pm',
+        'polldbg',
+        'pollide',
+        'pop_capa',
+        'pop_cmd',
+        'pop_debug',
+        'pop_err',
+        'pop_get',
+        'pop_ids',
+        'pop_index',
+        'pop_log',
+        'pop_mode',
+        'pop_net',
+        'pop_res',
+        'pop_server',
+        'pop_timeout',
+        'pop_token',
+        'pop',
+        'popctx',
+        'popinclude',
+        'populate',
+        'port',
+        'position',
+        'postdispatch',
+        'postparam',
+        'postparams',
+        'postparamsary',
+        'poststring',
+        'pow',
+        'predispatch',
+        'prefix',
+        'preflight',
+        'prepare',
+        'prepared',
+        'pretty',
+        'prev',
+        'previoussibling',
+        'printsimplemsg',
+        'private_compare',
+        'private_find',
+        'private_findlast',
+        'private_merge',
+        'private_rebalanceforinsert',
+        'private_rebalanceforremove',
+        'private_replaceall',
+        'private_replacefirst',
+        'private_rotateleft',
+        'private_rotateright',
+        'private_setrange',
+        'private_split',
+        'probemimetype',
+        'provides',
+        'proxying',
+        'prune',
+        'publicid',
+        'pullhttpheader',
+        'pullmimepost',
+        'pulloneheaderline',
+        'pullpost',
+        'pullrawpost',
+        'pullrawpostchunks',
+        'pullrequest',
+        'pullrequestline',
+        'push',
+        'pushctx',
+        'pushinclude',
+        'qdarray',
+        'qdcount',
+        'queryparam',
+        'queryparams',
+        'queryparamsary',
+        'querystring',
+        'queue_maintenance',
+        'queue_messages',
+        'queue_status',
+        'queue',
+        'quit',
+        'r',
+        'raw',
+        'rawcontent',
+        'rawdiff',
+        'rawheader',
+        'rawheaders',
+        'rawinvokable',
+        'read',
+        'readattributevalue',
+        'readbytes',
+        'readbytesfully',
+        'readdestinations',
+        'readerror',
+        'readidobjects',
+        'readline',
+        'readmessage',
+        'readnumber',
+        'readobject',
+        'readobjecttcp',
+        'readpacket',
+        'readsomebytes',
+        'readstring',
+        'ready',
+        'realdoc',
+        'realpath',
+        'receivefd',
+        'recipients',
+        'recover',
+        'rect',
+        'rectype',
+        'red',
+        'redirectto',
+        'referrals',
+        'refid',
+        'refobj',
+        'refresh',
+        'rel',
+        'remainder',
+        'remoteaddr',
+        'remoteaddress',
+        'remoteport',
+        'remove',
+        'removeall',
+        'removeattribute',
+        'removeattributenode',
+        'removeattributens',
+        'removeback',
+        'removechild',
+        'removedatabasetable',
+        'removedatasource',
+        'removedatasourcedatabase',
+        'removedatasourcehost',
+        'removefield',
+        'removefirst',
+        'removefront',
+        'removegroup',
+        'removelast',
+        'removeleading',
+        'removenameditem',
+        'removenameditemns',
+        'removenode',
+        'removesubnode',
+        'removetrailing',
+        'removeuser',
+        'removeuserfromallgroups',
+        'removeuserfromgroup',
+        'rename',
+        'renderbytes',
+        'renderdocumentbytes',
+        'renderstring',
+        'replace',
+        'replaceall',
+        'replacechild',
+        'replacedata',
+        'replacefirst',
+        'replaceheader',
+        'replacepattern',
+        'representnode',
+        'representnoderesult',
+        'reqid',
+        'requestid',
+        'requestmethod',
+        'requestparams',
+        'requesturi',
+        'requires',
+        'reserve',
+        'reset',
+        'resize',
+        'resolutionh',
+        'resolutionv',
+        'resolvelinks',
+        'resourcedata',
+        'resourceinvokable',
+        'resourcename',
+        'resources',
+        'respond',
+        'restart',
+        'restname',
+        'result',
+        'results',
+        'resume',
+        'retr',
+        'retrieve',
+        'returncolumns',
+        'returntype',
+        'rev',
+        'reverse',
+        'rewind',
+        'right',
+        'rint',
+        'roll',
+        'root',
+        'rootmap',
+        'rotate',
+        'route',
+        'rowsfound',
+        'rset',
+        'rule',
+        'rules',
+        'run',
+        'running',
+        'runonce',
+        's',
+        'sa',
+        'safeexport8bits',
+        'sameas',
+        'save',
+        'savedata',
+        'scalb',
+        'scale',
+        'scanfordatasource',
+        'scantasks',
+        'scanworkers',
+        'schemaname',
+        'scheme',
+        'script',
+        'scriptextensions',
+        'scriptfilename',
+        'scriptname',
+        'scripttype',
+        'scripturi',
+        'scripturl',
+        'scrubkeywords',
+        'search',
+        'searchinbucket',
+        'searchurl',
+        'second',
+        'secondsbetween',
+        'seek',
+        'select',
+        'selected',
+        'selectmany',
+        'self',
+        'send',
+        'sendchunk',
+        'sendfd',
+        'sendfile',
+        'sendpacket',
+        'sendresponse',
+        'separator',
+        'serializationelements',
+        'serialize',
+        'serveraddr',
+        'serveradmin',
+        'servername',
+        'serverport',
+        'serverprotocol',
+        'serversignature',
+        'serversoftware',
+        'sessionsdump',
+        'sessionsmap',
+        'set',
+        'setalignment',
+        'setattr',
+        'setattribute',
+        'setattributenode',
+        'setattributenodens',
+        'setattributens',
+        'setbarheight',
+        'setbarmultiplier',
+        'setbarwidth',
+        'setbaseline',
+        'setbold',
+        'setbooleanarrayregion',
+        'setbooleanfield',
+        'setbordercolor',
+        'setborderwidth',
+        'setbytearrayregion',
+        'setbytefield',
+        'setchararrayregion',
+        'setcharfield',
+        'setcode',
+        'setcolor',
+        'setcolorspace',
+        'setcookie',
+        'setcwd',
+        'setdefaultstorage',
+        'setdestination',
+        'setdoublearrayregion',
+        'setdoublefield',
+        'setencoding',
+        'setface',
+        'setfieldvalue',
+        'setfindpattern',
+        'setfloatarrayregion',
+        'setfloatfield',
+        'setfont',
+        'setformat',
+        'setgeneratechecksum',
+        'setheaders',
+        'sethtmlattr',
+        'setignorecase',
+        'setinput',
+        'setintarrayregion',
+        'setintfield',
+        'setitalic',
+        'setlinewidth',
+        'setlongarrayregion',
+        'setlongfield',
+        'setmarker',
+        'setmaxfilesize',
+        'setmode',
+        'setname',
+        'setnameditem',
+        'setnameditemns',
+        'setobjectarrayelement',
+        'setobjectfield',
+        'setpadding',
+        'setpagenumber',
+        'setpagerange',
+        'setposition',
+        'setrange',
+        'setreplacepattern',
+        'setshortarrayregion',
+        'setshortfield',
+        'setshowchecksum',
+        'setsize',
+        'setspacing',
+        'setstaticbooleanfield',
+        'setstaticbytefield',
+        'setstaticcharfield',
+        'setstaticdoublefield',
+        'setstaticfloatfield',
+        'setstaticintfield',
+        'setstaticlongfield',
+        'setstaticobjectfield',
+        'setstaticshortfield',
+        'setstatus',
+        'settextalignment',
+        'settextsize',
+        'settimezone',
+        'settrait',
+        'setunderline',
+        'sharpen',
+        'shouldabort',
+        'shouldclose',
+        'showchecksum',
+        'showcode39startstop',
+        'showeanguardbars',
+        'shutdownrd',
+        'shutdownrdwr',
+        'shutdownwr',
+        'sin',
+        'sinh',
+        'size',
+        'skip',
+        'skiprows',
+        'sort',
+        'sortcolumns',
+        'source',
+        'sourcecolumn',
+        'sourcefile',
+        'sourceline',
+        'specified',
+        'split',
+        'splitconnection',
+        'splitdebuggingthread',
+        'splitextension',
+        'splittext',
+        'splitthread',
+        'splittoprivatedev',
+        'splituppath',
+        'sql',
+        'sqlite3',
+        'sqrt',
+        'src',
+        'srcpath',
+        'sslerrfail',
+        'stack',
+        'standby',
+        'start',
+        'startone',
+        'startup',
+        'stat',
+        'statement',
+        'statementonly',
+        'stats',
+        'status',
+        'statuscode',
+        'statusmsg',
+        'stdin',
+        'step',
+        'stls',
+        'stop',
+        'stoprunning',
+        'storedata',
+        'stripfirstcomponent',
+        'striplastcomponent',
+        'style',
+        'styletype',
+        'sub',
+        'subject',
+        'subnode',
+        'subnodes',
+        'substringdata',
+        'subtract',
+        'subtraits',
+        'sum',
+        'supportscontentrepresentation',
+        'swapbytes',
+        'systemid',
+        't',
+        'tabindex',
+        'table',
+        'tablecolumnnames',
+        'tablecolumns',
+        'tablehascolumn',
+        'tableizestacktrace',
+        'tableizestacktracelink',
+        'tablemap',
+        'tablename',
+        'tables',
+        'tabs',
+        'tabstr',
+        'tag',
+        'tagname',
+        'take',
+        'tan',
+        'tanh',
+        'target',
+        'tasks',
+        'tb',
+        'tell',
+        'testexitcode',
+        'testlock',
+        'textwidth',
+        'thenby',
+        'thenbydescending',
+        'threadreaddesc',
+        'throw',
+        'thrownew',
+        'time',
+        'timezone',
+        'title',
+        'titlecase',
+        'to',
+        'token',
+        'tolower',
+        'top',
+        'toreflectedfield',
+        'toreflectedmethod',
+        'total_changes',
+        'totitle',
+        'touch',
+        'toupper',
+        'toxmlstring',
+        'trace',
+        'trackingid',
+        'trait',
+        'transform',
+        'trigger',
+        'trim',
+        'trunk',
+        'tryfinderrorfile',
+        'trylock',
+        'tryreadobject',
+        'type',
+        'typename',
+        'uidl',
+        'uncompress',
+        'unescape',
+        'union',
+        'uniqueid',
+        'unlock',
+        'unspool',
+        'up',
+        'update',
+        'updategroup',
+        'upload',
+        'uppercase',
+        'url',
+        'used',
+        'usemap',
+        'user',
+        'usercolumns',
+        'valid',
+        'validate',
+        'validatesessionstable',
+        'value',
+        'values',
+        'valuetype',
+        'variant',
+        'version',
+        'wait',
+        'waitforcompletion',
+        'warnings',
+        'week',
+        'weekofmonth',
+        'weekofyear',
+        'where',
+        'width',
+        'workers',
+        'workinginputcolumns',
+        'workingkeycolumns',
+        'workingkeyfield_name',
+        'workingreturncolumns',
+        'workingsortcolumns',
+        'write',
+        'writebodybytes',
+        'writebytes',
+        'writeheader',
+        'writeheaderbytes',
+        'writeheaderline',
+        'writeid',
+        'writemessage',
+        'writeobject',
+        'writeobjecttcp',
+        'writestring',
+        'wroteheaders',
+        'xhtml',
+        'xmllang',
+        'y0',
+        'y1',
+        'year',
+        'yearwoy',
+        'yn',
+        'z',
+        'zip',
+        'zipfile',
+        'zipfilename',
+        'zipname',
+        'zips',
+        'zoneoffset',
+    ),
+    'Lasso 8 Member Tags': (
+        'accept',
+        'add',
+        'addattachment',
+        'addattribute',
+        'addbarcode',
+        'addchapter',
+        'addcheckbox',
+        'addchild',
+        'addcombobox',
+        'addcomment',
+        'addcontent',
+        'addhiddenfield',
+        'addhtmlpart',
+        'addimage',
+        'addjavascript',
+        'addlist',
+        'addnamespace',
+        'addnextsibling',
+        'addpage',
+        'addparagraph',
+        'addparenttype',
+        'addpart',
+        'addpasswordfield',
+        'addphrase',
+        'addprevsibling',
+        'addradiobutton',
+        'addradiogroup',
+        'addresetbutton',
+        'addsection',
+        'addselectlist',
+        'addsibling',
+        'addsubmitbutton',
+        'addtable',
+        'addtext',
+        'addtextarea',
+        'addtextfield',
+        'addtextpart',
+        'alarms',
+        'annotate',
+        'answer',
+        'append',
+        'appendreplacement',
+        'appendtail',
+        'arc',
+        'asasync',
+        'astype',
+        'atbegin',
+        'atbottom',
+        'atend',
+        'atfarleft',
+        'atfarright',
+        'attop',
+        'attributecount',
+        'attributes',
+        'authenticate',
+        'authorize',
+        'backward',
+        'baseuri',
+        'bcc',
+        'beanproperties',
+        'beginswith',
+        'bind',
+        'bitand',
+        'bitclear',
+        'bitflip',
+        'bitformat',
+        'bitnot',
+        'bitor',
+        'bitset',
+        'bitshiftleft',
+        'bitshiftright',
+        'bittest',
+        'bitxor',
+        'blur',
+        'body',
+        'boundary',
+        'bytes',
+        'call',
+        'cancel',
+        'capabilities',
+        'cc',
+        'chardigitvalue',
+        'charname',
+        'charset',
+        'chartype',
+        'children',
+        'circle',
+        'close',
+        'closepath',
+        'closewrite',
+        'code',
+        'colorspace',
+        'command',
+        'comments',
+        'compare',
+        'comparecodepointorder',
+        'compile',
+        'composite',
+        'connect',
+        'contains',
+        'content_disposition',
+        'content_transfer_encoding',
+        'content_type',
+        'contents',
+        'contrast',
+        'convert',
+        'crop',
+        'curveto',
+        'data',
+        'date',
+        'day',
+        'daylights',
+        'dayofweek',
+        'dayofyear',
+        'decrement',
+        'delete',
+        'depth',
+        'describe',
+        'description',
+        'deserialize',
+        'detach',
+        'detachreference',
+        'difference',
+        'digit',
+        'document',
+        'down',
+        'drawtext',
+        'dst',
+        'dump',
+        'endswith',
+        'enhance',
+        'equals',
+        'errors',
+        'eval',
+        'events',
+        'execute',
+        'export16bits',
+        'export32bits',
+        'export64bits',
+        'export8bits',
+        'exportfdf',
+        'exportstring',
+        'extract',
+        'extractone',
+        'fieldnames',
+        'fieldtype',
+        'fieldvalue',
+        'file',
+        'find',
+        'findindex',
+        'findnamespace',
+        'findnamespacebyhref',
+        'findpattern',
+        'findposition',
+        'first',
+        'firstchild',
+        'fliph',
+        'flipv',
+        'flush',
+        'foldcase',
+        'foreach',
+        'format',
+        'forward',
+        'freebusies',
+        'freezetype',
+        'freezevalue',
+        'from',
+        'fulltype',
+        'generatechecksum',
+        'get',
+        'getabswidth',
+        'getalignment',
+        'getattribute',
+        'getattributenamespace',
+        'getbarheight',
+        'getbarmultiplier',
+        'getbarwidth',
+        'getbaseline',
+        'getbordercolor',
+        'getborderwidth',
+        'getcode',
+        'getcolor',
+        'getcolumncount',
+        'getencoding',
+        'getface',
+        'getfont',
+        'getformat',
+        'getfullfontname',
+        'getheaders',
+        'getmargins',
+        'getmethod',
+        'getnumericvalue',
+        'getpadding',
+        'getpagenumber',
+        'getparams',
+        'getproperty',
+        'getpsfontname',
+        'getrange',
+        'getrowcount',
+        'getsize',
+        'getspacing',
+        'getsupportedencodings',
+        'gettextalignment',
+        'gettextsize',
+        'gettype',
+        'gmt',
+        'groupcount',
+        'hasattribute',
+        'haschildren',
+        'hasvalue',
+        'header',
+        'headers',
+        'height',
+        'histogram',
+        'hosttonet16',
+        'hosttonet32',
+        'hour',
+        'id',
+        'ignorecase',
+        'import16bits',
+        'import32bits',
+        'import64bits',
+        'import8bits',
+        'importfdf',
+        'importstring',
+        'increment',
+        'input',
+        'insert',
+        'insertatcurrent',
+        'insertfirst',
+        'insertfrom',
+        'insertlast',
+        'insertpage',
+        'integer',
+        'intersection',
+        'invoke',
+        'isa',
+        'isalnum',
+        'isalpha',
+        'isbase',
+        'iscntrl',
+        'isdigit',
+        'isemptyelement',
+        'islower',
+        'isopen',
+        'isprint',
+        'isspace',
+        'istitle',
+        'istruetype',
+        'isualphabetic',
+        'isulowercase',
+        'isupper',
+        'isuuppercase',
+        'isuwhitespace',
+        'iswhitespace',
+        'iterator',
+        'javascript',
+        'join',
+        'journals',
+        'key',
+        'keys',
+        'last',
+        'lastchild',
+        'lasterror',
+        'left',
+        'length',
+        'line',
+        'listen',
+        'localaddress',
+        'localname',
+        'lock',
+        'lookupnamespace',
+        'lowercase',
+        'marker',
+        'matches',
+        'matchesstart',
+        'matchposition',
+        'matchstring',
+        'merge',
+        'millisecond',
+        'minute',
+        'mode',
+        'modulate',
+        'month',
+        'moveto',
+        'movetoattributenamespace',
+        'movetoelement',
+        'movetofirstattribute',
+        'movetonextattribute',
+        'name',
+        'namespaces',
+        'namespaceuri',
+        'nettohost16',
+        'nettohost32',
+        'newchild',
+        'next',
+        'nextsibling',
+        'nodetype',
+        'open',
+        'output',
+        'padleading',
+        'padtrailing',
+        'pagecount',
+        'pagesize',
+        'paraminfo',
+        'params',
+        'parent',
+        'path',
+        'pixel',
+        'position',
+        'prefix',
+        'previoussibling',
+        'properties',
+        'rawheaders',
+        'read',
+        'readattributevalue',
+        'readerror',
+        'readfrom',
+        'readline',
+        'readlock',
+        'readstring',
+        'readunlock',
+        'recipients',
+        'rect',
+        'refcount',
+        'referrals',
+        'remoteaddress',
+        'remove',
+        'removeall',
+        'removeattribute',
+        'removechild',
+        'removecurrent',
+        'removefirst',
+        'removelast',
+        'removeleading',
+        'removenamespace',
+        'removetrailing',
+        'render',
+        'replace',
+        'replaceall',
+        'replacefirst',
+        'replacepattern',
+        'replacewith',
+        'reserve',
+        'reset',
+        'resolutionh',
+        'resolutionv',
+        'response',
+        'results',
+        'retrieve',
+        'returntype',
+        'reverse',
+        'reverseiterator',
+        'right',
+        'rotate',
+        'run',
+        'save',
+        'scale',
+        'search',
+        'second',
+        'send',
+        'serialize',
+        'set',
+        'setalignment',
+        'setbarheight',
+        'setbarmultiplier',
+        'setbarwidth',
+        'setbaseline',
+        'setblocking',
+        'setbordercolor',
+        'setborderwidth',
+        'setbytes',
+        'setcode',
+        'setcolor',
+        'setcolorspace',
+        'setdatatype',
+        'setencoding',
+        'setface',
+        'setfieldvalue',
+        'setfont',
+        'setformat',
+        'setgeneratechecksum',
+        'setheight',
+        'setlassodata',
+        'setlinewidth',
+        'setmarker',
+        'setmode',
+        'setname',
+        'setpadding',
+        'setpagenumber',
+        'setpagerange',
+        'setposition',
+        'setproperty',
+        'setrange',
+        'setshowchecksum',
+        'setsize',
+        'setspacing',
+        'settemplate',
+        'settemplatestr',
+        'settextalignment',
+        'settextdata',
+        'settextsize',
+        'settype',
+        'setunderline',
+        'setwidth',
+        'setxmldata',
+        'sharpen',
+        'showchecksum',
+        'showcode39startstop',
+        'showeanguardbars',
+        'signal',
+        'signalall',
+        'size',
+        'smooth',
+        'sort',
+        'sortwith',
+        'split',
+        'standards',
+        'steal',
+        'subject',
+        'substring',
+        'subtract',
+        'swapbytes',
+        'textwidth',
+        'time',
+        'timezones',
+        'titlecase',
+        'to',
+        'todos',
+        'tolower',
+        'totitle',
+        'toupper',
+        'transform',
+        'trim',
+        'type',
+        'unescape',
+        'union',
+        'uniqueid',
+        'unlock',
+        'unserialize',
+        'up',
+        'uppercase',
+        'value',
+        'values',
+        'valuetype',
+        'wait',
+        'waskeyword',
+        'week',
+        'width',
+        'write',
+        'writelock',
+        'writeto',
+        'writeunlock',
+        'xmllang',
+        'xmlschematype',
+        'year',
+    )
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/sql.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/sql.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/sql.py	(revision 1126)
@@ -0,0 +1,681 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.sql
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various SQL dialects and related interactive sessions.
+
+    Postgres specific lexers:
+
+    `PostgresLexer`
+        A SQL lexer for the PostgreSQL dialect. Differences w.r.t. the SQL
+        lexer are:
+
+        - keywords and data types list parsed from the PG docs (run the
+          `_postgres_builtins` module to update them);
+        - Content of $-strings parsed using a specific lexer, e.g. the content
+          of a PL/Python function is parsed using the Python lexer;
+        - parse PG specific constructs: E-strings, $-strings, U&-strings,
+          different operators and punctuation.
+
+    `PlPgsqlLexer`
+        A lexer for the PL/pgSQL language. Adds a few specific construct on
+        top of the PG SQL lexer (such as <<label>>).
+
+    `PostgresConsoleLexer`
+        A lexer to highlight an interactive psql session:
+
+        - identifies the prompt and does its best to detect the end of command
+          in multiline statement where not all the lines are prefixed by a
+          prompt, telling them apart from the output;
+        - highlights errors in the output and notification levels;
+        - handles psql backslash commands.
+
+    The ``tests/examplefiles`` contains a few test files with data to be
+    parsed by these lexers.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, words
+from pygments.token import Punctuation, Whitespace, Error, \
+    Text, Comment, Operator, Keyword, Name, String, Number, Generic
+from pygments.lexers import get_lexer_by_name, ClassNotFound
+from pygments.util import iteritems
+
+from pygments.lexers._postgres_builtins import KEYWORDS, DATATYPES, \
+    PSEUDO_TYPES, PLPGSQL_KEYWORDS
+from pygments.lexers import _tsql_builtins
+
+
+__all__ = ['PostgresLexer', 'PlPgsqlLexer', 'PostgresConsoleLexer',
+           'SqlLexer', 'TransactSqlLexer', 'MySqlLexer',
+           'SqliteConsoleLexer', 'RqlLexer']
+
+line_re  = re.compile('.*?\n')
+
+language_re = re.compile(r"\s+LANGUAGE\s+'?(\w+)'?", re.IGNORECASE)
+
+do_re = re.compile(r'\bDO\b', re.IGNORECASE) 
+
+
+def language_callback(lexer, match):
+    """Parse the content of a $-string using a lexer
+
+    The lexer is chosen looking for a nearby LANGUAGE or assumed as
+    plpgsql if inside a DO statement and no LANGUAGE has been found.
+    """
+    l = None
+    m = language_re.match(lexer.text[match.end():match.end()+100])
+    if m is not None:
+        l = lexer._get_lexer(m.group(1))
+    else:
+        m = list(language_re.finditer(
+            lexer.text[max(0, match.start()-100):match.start()]))
+        if m:
+            l = lexer._get_lexer(m[-1].group(1))
+        else:
+            m = list(do_re.finditer(
+                lexer.text[max(0, match.start()-25):match.start()]))
+            if m:
+                l = lexer._get_lexer('plpgsql')
+    
+    # 1 = $, 2 = delimiter, 3 = $
+    yield (match.start(1), String, match.group(1))
+    yield (match.start(2), String.Delimiter, match.group(2))
+    yield (match.start(3), String, match.group(3))
+    # 4 = string contents
+    if l:
+        for x in l.get_tokens_unprocessed(match.group(4)):
+            yield x
+    else:
+        yield (match.start(4), String, match.group(4))
+    # 5 = $, 6 = delimiter, 7 = $
+    yield (match.start(5), String, match.group(5))
+    yield (match.start(6), String.Delimiter, match.group(6))
+    yield (match.start(7), String, match.group(7))
+
+
+class PostgresBase(object):
+    """Base class for Postgres-related lexers.
+
+    This is implemented as a mixin to avoid the Lexer metaclass kicking in.
+    this way the different lexer don't have a common Lexer ancestor. If they
+    had, _tokens could be created on this ancestor and not updated for the
+    other classes, resulting e.g. in PL/pgSQL parsed as SQL. This shortcoming
+    seem to suggest that regexp lexers are not really subclassable.
+    """
+    def get_tokens_unprocessed(self, text, *args):
+        # Have a copy of the entire text to be used by `language_callback`.
+        self.text = text
+        for x in super(PostgresBase, self).get_tokens_unprocessed(
+                text, *args):
+            yield x
+
+    def _get_lexer(self, lang):
+        if lang.lower() == 'sql':
+            return get_lexer_by_name('postgresql', **self.options)
+
+        tries = [lang]
+        if lang.startswith('pl'):
+            tries.append(lang[2:])
+        if lang.endswith('u'):
+            tries.append(lang[:-1])
+        if lang.startswith('pl') and lang.endswith('u'):
+            tries.append(lang[2:-1])
+
+        for l in tries:
+            try:
+                return get_lexer_by_name(l, **self.options)
+            except ClassNotFound:
+                pass
+        else:
+            # TODO: better logging
+            # print >>sys.stderr, "language not found:", lang
+            return None
+
+
+class PostgresLexer(PostgresBase, RegexLexer):
+    """
+    Lexer for the PostgreSQL dialect of SQL.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'PostgreSQL SQL dialect'
+    aliases = ['postgresql', 'postgres']
+    mimetypes = ['text/x-postgresql']
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'--.*\n?', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'(' + '|'.join(s.replace(" ", "\s+")
+                             for s in DATATYPES + PSEUDO_TYPES)
+             + r')\b', Name.Builtin),
+            (words(KEYWORDS, suffix=r'\b'), Keyword),
+            (r'[+*/<>=~!@#%^&|`?-]+', Operator),
+            (r'::', Operator),  # cast
+            (r'\$\d+', Name.Variable),
+            (r'([0-9]*\.[0-9]*|[0-9]+)(e[+-]?[0-9]+)?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r"((?:E|U&)?)(')", bygroups(String.Affix, String.Single), 'string'),
+            # quoted identifier
+            (r'((?:U&)?)(")', bygroups(String.Affix, String.Name), 'quoted-ident'),
+            (r'(?s)(\$)([^$]*)(\$)(.*?)(\$)(\2)(\$)', language_callback),
+            (r'[a-z_]\w*', Name),
+
+            # psql variable in SQL
+            (r""":(['"]?)[a-z]\w*\b\1""", Name.Variable),
+
+            (r'[;:()\[\]{},.]', Punctuation),
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ],
+        'string': [
+            (r"[^']+", String.Single),
+            (r"''", String.Single),
+            (r"'", String.Single, '#pop'),
+        ],
+        'quoted-ident': [
+            (r'[^"]+', String.Name),
+            (r'""', String.Name),
+            (r'"', String.Name, '#pop'),
+        ],
+    }
+
+
+class PlPgsqlLexer(PostgresBase, RegexLexer):
+    """
+    Handle the extra syntax in Pl/pgSQL language.
+
+    .. versionadded:: 1.5
+    """
+    name = 'PL/pgSQL'
+    aliases = ['plpgsql']
+    mimetypes = ['text/x-plpgsql']
+
+    flags = re.IGNORECASE
+    tokens = dict((k, l[:]) for (k, l) in iteritems(PostgresLexer.tokens))
+
+    # extend the keywords list
+    for i, pattern in enumerate(tokens['root']):
+        if pattern[1] == Keyword:
+            tokens['root'][i] = (
+                words(KEYWORDS + PLPGSQL_KEYWORDS, suffix=r'\b'),
+                Keyword)
+            del i
+            break
+    else:
+        assert 0, "SQL keywords not found"
+
+    # Add specific PL/pgSQL rules (before the SQL ones)
+    tokens['root'][:0] = [
+        (r'\%[a-z]\w*\b', Name.Builtin),     # actually, a datatype
+        (r':=', Operator),
+        (r'\<\<[a-z]\w*\>\>', Name.Label),
+        (r'\#[a-z]\w*\b', Keyword.Pseudo),   # #variable_conflict
+    ]
+
+
+class PsqlRegexLexer(PostgresBase, RegexLexer):
+    """
+    Extend the PostgresLexer adding support specific for psql commands.
+
+    This is not a complete psql lexer yet as it lacks prompt support
+    and output rendering.
+    """
+
+    name = 'PostgreSQL console - regexp based lexer'
+    aliases = []    # not public
+
+    flags = re.IGNORECASE
+    tokens = dict((k, l[:]) for (k, l) in iteritems(PostgresLexer.tokens))
+
+    tokens['root'].append(
+        (r'\\[^\s]+', Keyword.Pseudo, 'psql-command'))
+    tokens['psql-command'] = [
+        (r'\n', Text, 'root'),
+        (r'\s+', Text),
+        (r'\\[^\s]+', Keyword.Pseudo),
+        (r""":(['"]?)[a-z]\w*\b\1""", Name.Variable),
+        (r"'(''|[^'])*'", String.Single),
+        (r"`([^`])*`", String.Backtick),
+        (r"[^\s]+", String.Symbol),
+    ]
+
+re_prompt = re.compile(r'^(\S.*?)??[=\-\(\$\'\"][#>]')
+re_psql_command = re.compile(r'\s*\\')
+re_end_command = re.compile(r';\s*(--.*?)?$')
+re_psql_command = re.compile(r'(\s*)(\\.+?)(\s+)$')
+re_error = re.compile(r'(ERROR|FATAL):')
+re_message = re.compile(
+    r'((?:DEBUG|INFO|NOTICE|WARNING|ERROR|'
+    r'FATAL|HINT|DETAIL|CONTEXT|LINE [0-9]+):)(.*?\n)')
+
+
+class lookahead(object):
+    """Wrap an iterator and allow pushing back an item."""
+    def __init__(self, x):
+        self.iter = iter(x)
+        self._nextitem = None
+
+    def __iter__(self):
+        return self
+
+    def send(self, i):
+        self._nextitem = i
+        return i
+
+    def __next__(self):
+        if self._nextitem is not None:
+            ni = self._nextitem
+            self._nextitem = None
+            return ni
+        return next(self.iter)
+    next = __next__
+
+
+class PostgresConsoleLexer(Lexer):
+    """
+    Lexer for psql sessions.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'PostgreSQL console (psql)'
+    aliases = ['psql', 'postgresql-console', 'postgres-console']
+    mimetypes = ['text/x-postgresql-psql']
+
+    def get_tokens_unprocessed(self, data):
+        sql = PsqlRegexLexer(**self.options)
+
+        lines = lookahead(line_re.findall(data))
+
+        # prompt-output cycle
+        while 1:
+
+            # consume the lines of the command: start with an optional prompt
+            # and continue until the end of command is detected
+            curcode = ''
+            insertions = []
+            while 1:
+                try:
+                    line = next(lines)
+                except StopIteration:
+                    # allow the emission of partially collected items
+                    # the repl loop will be broken below
+                    break
+
+                # Identify a shell prompt in case of psql commandline example
+                if line.startswith('$') and not curcode:
+                    lexer = get_lexer_by_name('console', **self.options)
+                    for x in lexer.get_tokens_unprocessed(line):
+                        yield x
+                    break
+
+                # Identify a psql prompt
+                mprompt = re_prompt.match(line)
+                if mprompt is not None:
+                    insertions.append((len(curcode),
+                                       [(0, Generic.Prompt, mprompt.group())]))
+                    curcode += line[len(mprompt.group()):]
+                else:
+                    curcode += line
+
+                # Check if this is the end of the command
+                # TODO: better handle multiline comments at the end with
+                # a lexer with an external state?
+                if re_psql_command.match(curcode) \
+                   or re_end_command.search(curcode):
+                    break
+
+            # Emit the combined stream of command and prompt(s)
+            for item in do_insertions(insertions,
+                                      sql.get_tokens_unprocessed(curcode)):
+                yield item
+
+            # Emit the output lines
+            out_token = Generic.Output
+            while 1:
+                line = next(lines)
+                mprompt = re_prompt.match(line)
+                if mprompt is not None:
+                    # push the line back to have it processed by the prompt
+                    lines.send(line)
+                    break
+
+                mmsg = re_message.match(line)
+                if mmsg is not None:
+                    if mmsg.group(1).startswith("ERROR") \
+                       or mmsg.group(1).startswith("FATAL"):
+                        out_token = Generic.Error
+                    yield (mmsg.start(1), Generic.Strong, mmsg.group(1))
+                    yield (mmsg.start(2), out_token, mmsg.group(2))
+                else:
+                    yield (0, out_token, line)
+
+
+class SqlLexer(RegexLexer):
+    """
+    Lexer for Structured Query Language. Currently, this lexer does
+    not recognize any special syntax except ANSI SQL.
+    """
+
+    name = 'SQL'
+    aliases = ['sql']
+    filenames = ['*.sql']
+    mimetypes = ['text/x-sql']
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'--.*\n?', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (words((
+                'ABORT', 'ABS', 'ABSOLUTE', 'ACCESS', 'ADA', 'ADD', 'ADMIN', 'AFTER', 'AGGREGATE',
+                'ALIAS', 'ALL', 'ALLOCATE', 'ALTER', 'ANALYSE', 'ANALYZE', 'AND', 'ANY', 'ARE', 'AS',
+                'ASC', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT', 'ASYMMETRIC', 'AT', 'ATOMIC',
+                'AUTHORIZATION', 'AVG', 'BACKWARD', 'BEFORE', 'BEGIN', 'BETWEEN', 'BITVAR',
+                'BIT_LENGTH', 'BOTH', 'BREADTH', 'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY',
+                'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATALOG_NAME', 'CHAIN',
+                'CHARACTERISTICS', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG',
+                'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHAR_LENGTH', 'CHECK',
+                'CHECKED', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE', 'CLUSTER',
+                'COALSECE', 'COBOL', 'COLLATE', 'COLLATION', 'COLLATION_CATALOG',
+                'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLUMN', 'COLUMN_NAME',
+                'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT', 'COMMIT',
+                'COMMITTED', 'COMPLETION', 'CONDITION_NUMBER', 'CONNECT', 'CONNECTION',
+                'CONNECTION_NAME', 'CONSTRAINT', 'CONSTRAINTS', 'CONSTRAINT_CATALOG',
+                'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA', 'CONSTRUCTOR', 'CONTAINS',
+                'CONTINUE', 'CONVERSION', 'CONVERT', 'COPY', 'CORRESPONTING', 'COUNT',
+                'CREATE', 'CREATEDB', 'CREATEUSER', 'CROSS', 'CUBE', 'CURRENT', 'CURRENT_DATE',
+                'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP',
+                'CURRENT_USER', 'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE',
+                'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY',
+                'DEALLOCATE', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE', 'DEFERRED',
+                'DEFINED', 'DEFINER', 'DELETE', 'DELIMITER', 'DELIMITERS', 'DEREF', 'DESC',
+                'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR', 'DETERMINISTIC',
+                'DIAGNOSTICS', 'DICTIONARY', 'DISCONNECT', 'DISPATCH', 'DISTINCT', 'DO',
+                'DOMAIN', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION', 'DYNAMIC_FUNCTION_CODE', 'EACH',
+                'ELSE', 'ELSIF', 'ENCODING', 'ENCRYPTED', 'END', 'END-EXEC', 'EQUALS', 'ESCAPE', 'EVERY',
+                'EXCEPTION', 'EXCEPT', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTING',
+                'EXISTS', 'EXPLAIN', 'EXTERNAL', 'EXTRACT', 'FALSE', 'FETCH', 'FINAL', 'FIRST', 'FOR',
+                'FORCE', 'FOREIGN', 'FORTRAN', 'FORWARD', 'FOUND', 'FREE', 'FREEZE', 'FROM', 'FULL',
+                'FUNCTION', 'G', 'GENERAL', 'GENERATED', 'GET', 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRANTED',
+                'GROUP', 'GROUPING', 'HANDLER', 'HAVING', 'HIERARCHY', 'HOLD', 'HOST', 'IDENTITY', 'IF',
+                'IGNORE', 'ILIKE', 'IMMEDIATE', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT', 'IN',
+                'INCLUDING', 'INCREMENT', 'INDEX', 'INDITCATOR', 'INFIX', 'INHERITS', 'INITIALIZE',
+                'INITIALLY', 'INNER', 'INOUT', 'INPUT', 'INSENSITIVE', 'INSERT', 'INSTANTIABLE',
+                'INSTEAD', 'INTERSECT', 'INTO', 'INVOKER', 'IS', 'ISNULL', 'ISOLATION', 'ITERATE', 'JOIN',
+                'KEY', 'KEY_MEMBER', 'KEY_TYPE', 'LANCOMPILER', 'LANGUAGE', 'LARGE', 'LAST',
+                'LATERAL', 'LEADING', 'LEFT', 'LENGTH', 'LESS', 'LEVEL', 'LIKE', 'LIMIT', 'LISTEN', 'LOAD',
+                'LOCAL', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATION', 'LOCATOR', 'LOCK', 'LOWER',
+                'MAP', 'MATCH', 'MAX', 'MAXVALUE', 'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH',
+                'MESSAGE_TEXT', 'METHOD', 'MIN', 'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES',
+                'MODIFY', 'MONTH', 'MORE', 'MOVE', 'MUMPS', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR',
+                'NCLOB', 'NEW', 'NEXT', 'NO', 'NOCREATEDB', 'NOCREATEUSER', 'NONE', 'NOT', 'NOTHING',
+                'NOTIFY', 'NOTNULL', 'NULL', 'NULLABLE', 'NULLIF', 'OBJECT', 'OCTET_LENGTH', 'OF', 'OFF',
+                'OFFSET', 'OIDS', 'OLD', 'ON', 'ONLY', 'OPEN', 'OPERATION', 'OPERATOR', 'OPTION', 'OPTIONS',
+                'OR', 'ORDER', 'ORDINALITY', 'OUT', 'OUTER', 'OUTPUT', 'OVERLAPS', 'OVERLAY', 'OVERRIDING',
+                'OWNER', 'PAD', 'PARAMETER', 'PARAMETERS', 'PARAMETER_MODE', 'PARAMATER_NAME',
+                'PARAMATER_ORDINAL_POSITION', 'PARAMETER_SPECIFIC_CATALOG',
+                'PARAMETER_SPECIFIC_NAME', 'PARAMATER_SPECIFIC_SCHEMA', 'PARTIAL',
+                'PASCAL', 'PENDANT', 'PLACING', 'PLI', 'POSITION', 'POSTFIX', 'PRECISION', 'PREFIX',
+                'PREORDER', 'PREPARE', 'PRESERVE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL',
+                'PROCEDURE', 'PUBLIC', 'READ', 'READS', 'RECHECK', 'RECURSIVE', 'REF', 'REFERENCES',
+                'REFERENCING', 'REINDEX', 'RELATIVE', 'RENAME', 'REPEATABLE', 'REPLACE', 'RESET',
+                'RESTART', 'RESTRICT', 'RESULT', 'RETURN', 'RETURNED_LENGTH',
+                'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE', 'RETURNS', 'REVOKE', 'RIGHT',
+                'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE', 'ROUTINE_CATALOG', 'ROUTINE_NAME',
+                'ROUTINE_SCHEMA', 'ROW', 'ROWS', 'ROW_COUNT', 'RULE', 'SAVE_POINT', 'SCALE', 'SCHEMA',
+                'SCHEMA_NAME', 'SCOPE', 'SCROLL', 'SEARCH', 'SECOND', 'SECURITY', 'SELECT', 'SELF',
+                'SENSITIVE', 'SERIALIZABLE', 'SERVER_NAME', 'SESSION', 'SESSION_USER', 'SET',
+                'SETOF', 'SETS', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE', 'SIZE', 'SOME', 'SOURCE', 'SPACE',
+                'SPECIFIC', 'SPECIFICTYPE', 'SPECIFIC_NAME', 'SQL', 'SQLCODE', 'SQLERROR',
+                'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNINIG', 'STABLE', 'START', 'STATE', 'STATEMENT',
+                'STATIC', 'STATISTICS', 'STDIN', 'STDOUT', 'STORAGE', 'STRICT', 'STRUCTURE', 'STYPE',
+                'SUBCLASS_ORIGIN', 'SUBLIST', 'SUBSTRING', 'SUM', 'SYMMETRIC', 'SYSID', 'SYSTEM',
+                'SYSTEM_USER', 'TABLE', 'TABLE_NAME', ' TEMP', 'TEMPLATE', 'TEMPORARY', 'TERMINATE',
+                'THAN', 'THEN', 'TIMESTAMP', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE', 'TO', 'TOAST',
+                'TRAILING', 'TRANSATION', 'TRANSACTIONS_COMMITTED',
+                'TRANSACTIONS_ROLLED_BACK', 'TRANSATION_ACTIVE', 'TRANSFORM',
+                'TRANSFORMS', 'TRANSLATE', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRIGGER_CATALOG',
+                'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM', 'TRUE', 'TRUNCATE', 'TRUSTED', 'TYPE',
+                'UNCOMMITTED', 'UNDER', 'UNENCRYPTED', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLISTEN',
+                'UNNAMED', 'UNNEST', 'UNTIL', 'UPDATE', 'UPPER', 'USAGE', 'USER',
+                'USER_DEFINED_TYPE_CATALOG', 'USER_DEFINED_TYPE_NAME',
+                'USER_DEFINED_TYPE_SCHEMA', 'USING', 'VACUUM', 'VALID', 'VALIDATOR', 'VALUES',
+                'VARIABLE', 'VERBOSE', 'VERSION', 'VIEW', 'VOLATILE', 'WHEN', 'WHENEVER', 'WHERE',
+                'WITH', 'WITHOUT', 'WORK', 'WRITE', 'YEAR', 'ZONE'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'ARRAY', 'BIGINT', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'CHAR', 'CHARACTER', 'DATE',
+                'DEC', 'DECIMAL', 'FLOAT', 'INT', 'INTEGER', 'INTERVAL', 'NUMBER', 'NUMERIC', 'REAL',
+                'SERIAL', 'SMALLINT', 'VARCHAR', 'VARYING', 'INT8', 'SERIAL8', 'TEXT'), suffix=r'\b'),
+             Name.Builtin),
+            (r'[+*/<>=~!@#%^&|`?-]', Operator),
+            (r'[0-9]+', Number.Integer),
+            # TODO: Backslash escapes?
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Symbol),  # not a real string literal in ANSI SQL
+            (r'[a-z_][\w$]*', Name),  # allow $s in strings for Oracle
+            (r'[;:()\[\],.]', Punctuation)
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ]
+    }
+
+
+class TransactSqlLexer(RegexLexer):
+    """
+    Transact-SQL (T-SQL) is Microsoft's and Sybase's proprietary extension to
+    SQL.
+
+    The list of keywords includes ODBC and keywords reserved for future use..
+    """
+
+    name = 'Transact-SQL'
+    aliases = ['tsql', 't-sql']
+    filenames = ['*.sql']
+    mimetypes = ['text/x-tsql']
+
+    # Use re.UNICODE to allow non ASCII letters in names.
+    flags = re.IGNORECASE | re.UNICODE
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'--(?m).*?$\n?', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (words(_tsql_builtins.OPERATORS), Operator),
+            (words(_tsql_builtins.OPERATOR_WORDS, suffix=r'\b'), Operator.Word),
+            (words(_tsql_builtins.TYPES, suffix=r'\b'), Name.Class),
+            (words(_tsql_builtins.FUNCTIONS, suffix=r'\b'), Name.Function),
+            (r'(goto)(\s+)(\w+\b)', bygroups(Keyword, Whitespace, Name.Label)),
+            (words(_tsql_builtins.KEYWORDS, suffix=r'\b'), Keyword),
+            (r'(\[)([^]]+)(\])', bygroups(Operator, Name, Operator)),
+            (r'0x[0-9a-f]+', Number.Hex),
+            # Float variant 1, for example: 1., 1.e2, 1.2e3
+            (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float),
+            # Float variant 2, for example: .1, .1e2
+            (r'\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),
+            # Float variant 3, for example: 123e45
+            (r'[0-9]+e[+-]?[0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Symbol),
+            (r'[;(),.]', Punctuation),
+            # Below we use \w even for the first "real" character because
+            # tokens starting with a digit have already been recognized
+            # as Number above.
+            (r'@@\w+', Name.Builtin),
+            (r'@\w+', Name.Variable),
+            (r'(\w+)(:)', bygroups(Name.Label, Punctuation)),
+            (r'#?#?\w+', Name),  # names for temp tables and anything else
+            (r'\?', Name.Variable.Magic),  # parameter for prepared statements
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ]
+    }
+
+
+class MySqlLexer(RegexLexer):
+    """
+    Special lexer for MySQL.
+    """
+
+    name = 'MySQL'
+    aliases = ['mysql']
+    mimetypes = ['text/x-mysql']
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(#|--\s+).*\n?', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'[0-9]+', Number.Integer),
+            (r'[0-9]*\.[0-9]+(e[+-][0-9]+)', Number.Float),
+            (r"'(\\\\|\\'|''|[^'])*'", String.Single),
+            (r'"(\\\\|\\"|""|[^"])*"', String.Double),
+            (r"`(\\\\|\\`|``|[^`])*`", String.Symbol),
+            (r'[+*/<>=~!@#%^&|`?-]', Operator),
+            (r'\b(tinyint|smallint|mediumint|int|integer|bigint|date|'
+             r'datetime|time|bit|bool|tinytext|mediumtext|longtext|text|'
+             r'tinyblob|mediumblob|longblob|blob|float|double|double\s+'
+             r'precision|real|numeric|dec|decimal|timestamp|year|char|'
+             r'varchar|varbinary|varcharacter|enum|set)(\b\s*)(\()?',
+             bygroups(Keyword.Type, Text, Punctuation)),
+            (r'\b(add|all|alter|analyze|and|as|asc|asensitive|before|between|'
+             r'bigint|binary|blob|both|by|call|cascade|case|change|char|'
+             r'character|check|collate|column|condition|constraint|continue|'
+             r'convert|create|cross|current_date|current_time|'
+             r'current_timestamp|current_user|cursor|database|databases|'
+             r'day_hour|day_microsecond|day_minute|day_second|dec|decimal|'
+             r'declare|default|delayed|delete|desc|describe|deterministic|'
+             r'distinct|distinctrow|div|double|drop|dual|each|else|elseif|'
+             r'enclosed|escaped|exists|exit|explain|fetch|flush|float|float4|'
+             r'float8|for|force|foreign|from|fulltext|grant|group|having|'
+             r'high_priority|hour_microsecond|hour_minute|hour_second|if|'
+             r'ignore|in|index|infile|inner|inout|insensitive|insert|int|'
+             r'int1|int2|int3|int4|int8|integer|interval|into|is|iterate|'
+             r'join|key|keys|kill|leading|leave|left|like|limit|lines|load|'
+             r'localtime|localtimestamp|lock|long|loop|low_priority|match|'
+             r'minute_microsecond|minute_second|mod|modifies|natural|'
+             r'no_write_to_binlog|not|numeric|on|optimize|option|optionally|'
+             r'or|order|out|outer|outfile|precision|primary|procedure|purge|'
+             r'raid0|read|reads|real|references|regexp|release|rename|repeat|'
+             r'replace|require|restrict|return|revoke|right|rlike|schema|'
+             r'schemas|second_microsecond|select|sensitive|separator|set|'
+             r'show|smallint|soname|spatial|specific|sql|sql_big_result|'
+             r'sql_calc_found_rows|sql_small_result|sqlexception|sqlstate|'
+             r'sqlwarning|ssl|starting|straight_join|table|terminated|then|'
+             r'to|trailing|trigger|undo|union|unique|unlock|unsigned|update|'
+             r'usage|use|using|utc_date|utc_time|utc_timestamp|values|'
+             r'varying|when|where|while|with|write|x509|xor|year_month|'
+             r'zerofill)\b', Keyword),
+            # TODO: this list is not complete
+            (r'\b(auto_increment|engine|charset|tables)\b', Keyword.Pseudo),
+            (r'(true|false|null)', Name.Constant),
+            (r'([a-z_]\w*)(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[a-z_]\w*', Name),
+            (r'@[a-z0-9]*[._]*[a-z0-9]*', Name.Variable),
+            (r'[;:()\[\],.]', Punctuation)
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ]
+    }
+
+
+class SqliteConsoleLexer(Lexer):
+    """
+    Lexer for example sessions using sqlite3.
+
+    .. versionadded:: 0.11
+    """
+
+    name = 'sqlite3con'
+    aliases = ['sqlite3']
+    filenames = ['*.sqlite3-console']
+    mimetypes = ['text/x-sqlite3-console']
+
+    def get_tokens_unprocessed(self, data):
+        sql = SqlLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(data):
+            line = match.group()
+            if line.startswith('sqlite> ') or line.startswith('   ...> '):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:8])]))
+                curcode += line[8:]
+            else:
+                if curcode:
+                    for item in do_insertions(insertions,
+                                              sql.get_tokens_unprocessed(curcode)):
+                        yield item
+                    curcode = ''
+                    insertions = []
+                if line.startswith('SQL error: '):
+                    yield (match.start(), Generic.Traceback, line)
+                else:
+                    yield (match.start(), Generic.Output, line)
+        if curcode:
+            for item in do_insertions(insertions,
+                                      sql.get_tokens_unprocessed(curcode)):
+                yield item
+
+
+class RqlLexer(RegexLexer):
+    """
+    Lexer for Relation Query Language.
+
+    `RQL <http://www.logilab.org/project/rql>`_
+
+    .. versionadded:: 2.0
+    """
+    name = 'RQL'
+    aliases = ['rql']
+    filenames = ['*.rql']
+    mimetypes = ['text/x-rql']
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(DELETE|SET|INSERT|UNION|DISTINCT|WITH|WHERE|BEING|OR'
+             r'|AND|NOT|GROUPBY|HAVING|ORDERBY|ASC|DESC|LIMIT|OFFSET'
+             r'|TODAY|NOW|TRUE|FALSE|NULL|EXISTS)\b', Keyword),
+            (r'[+*/<>=%-]', Operator),
+            (r'(Any|is|instance_of|CWEType|CWRelation)\b', Name.Builtin),
+            (r'[0-9]+', Number.Integer),
+            (r'[A-Z_]\w*\??', Name),
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Single),
+            (r'[;:()\[\],.]', Punctuation)
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/igor.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/igor.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/igor.py	(revision 1126)
@@ -0,0 +1,288 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.igor
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Igor Pro.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Keyword, Name, String
+
+__all__ = ['IgorLexer']
+
+
+class IgorLexer(RegexLexer):
+    """
+    Pygments Lexer for Igor Pro procedure files (.ipf).
+    See http://www.wavemetrics.com/ and http://www.igorexchange.com/.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Igor'
+    aliases = ['igor', 'igorpro']
+    filenames = ['*.ipf']
+    mimetypes = ['text/ipf']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    flowControl = (
+        'if', 'else', 'elseif', 'endif', 'for', 'endfor', 'strswitch', 'switch',
+        'case', 'default', 'endswitch', 'do', 'while', 'try', 'catch', 'endtry',
+        'break', 'continue', 'return', 'AbortOnRTE', 'AbortOnValue'
+    )
+    types = (
+        'variable', 'string', 'constant', 'strconstant', 'NVAR', 'SVAR', 'WAVE',
+        'STRUCT', 'dfref', 'funcref', 'char', 'uchar', 'int16', 'uint16', 'int32',
+        'uint32', 'int64', 'uint64', 'float', 'double'
+    )
+    keywords = (
+        'override', 'ThreadSafe', 'MultiThread', 'static',  'Proc',
+        'Picture', 'Prompt', 'DoPrompt', 'macro', 'window', 'function', 'end',
+        'Structure', 'EndStructure', 'EndMacro', 'Menu', 'SubMenu'
+    )
+    operations = (
+        'Abort', 'AddFIFOData', 'AddFIFOVectData', 'AddMovieAudio', 'AddMovieFrame',
+        'AdoptFiles', 'APMath', 'Append', 'AppendImage', 'AppendLayoutObject',
+        'AppendMatrixContour', 'AppendText', 'AppendToGizmo', 'AppendToGraph',
+        'AppendToLayout', 'AppendToTable', 'AppendXYZContour', 'AutoPositionWindow',
+        'BackgroundInfo', 'Beep', 'BoundingBall', 'BoxSmooth', 'BrowseURL', 'BuildMenu',
+        'Button', 'cd', 'Chart', 'CheckBox', 'CheckDisplayed', 'ChooseColor', 'Close',
+        'CloseHelp', 'CloseMovie', 'CloseProc', 'ColorScale', 'ColorTab2Wave',
+        'Concatenate', 'ControlBar', 'ControlInfo', 'ControlUpdate',
+        'ConvertGlobalStringTextEncoding', 'ConvexHull', 'Convolve', 'CopyFile',
+        'CopyFolder', 'CopyScales', 'Correlate', 'CreateAliasShortcut', 'CreateBrowser',
+        'Cross', 'CtrlBackground', 'CtrlFIFO', 'CtrlNamedBackground', 'Cursor',
+        'CurveFit', 'CustomControl', 'CWT', 'Debugger', 'DebuggerOptions', 'DefaultFont',
+        'DefaultGuiControls', 'DefaultGuiFont', 'DefaultTextEncoding', 'DefineGuide',
+        'DelayUpdate', 'DeleteAnnotations', 'DeleteFile', 'DeleteFolder', 'DeletePoints',
+        'Differentiate', 'dir', 'Display', 'DisplayHelpTopic', 'DisplayProcedure',
+        'DoAlert', 'DoIgorMenu', 'DoUpdate', 'DoWindow', 'DoXOPIdle', 'DPSS',
+        'DrawAction', 'DrawArc', 'DrawBezier', 'DrawLine', 'DrawOval', 'DrawPICT',
+        'DrawPoly', 'DrawRect', 'DrawRRect', 'DrawText', 'DrawUserShape', 'DSPDetrend',
+        'DSPPeriodogram', 'Duplicate', 'DuplicateDataFolder', 'DWT', 'EdgeStats', 'Edit',
+        'ErrorBars', 'EstimatePeakSizes', 'Execute', 'ExecuteScriptText',
+        'ExperimentModified', 'ExportGizmo', 'Extract', 'FastGaussTransform', 'FastOp',
+        'FBinRead', 'FBinWrite', 'FFT', 'FIFOStatus', 'FIFO2Wave', 'FilterFIR',
+        'FilterIIR', 'FindAPeak', 'FindContour', 'FindDuplicates', 'FindLevel',
+        'FindLevels', 'FindPeak', 'FindPointsInPoly', 'FindRoots', 'FindSequence',
+        'FindValue', 'FPClustering', 'fprintf', 'FReadLine', 'FSetPos', 'FStatus',
+        'FTPCreateDirectory', 'FTPDelete', 'FTPDownload', 'FTPUpload', 'FuncFit',
+        'FuncFitMD', 'GBLoadWave', 'GetAxis', 'GetCamera', 'GetFileFolderInfo',
+        'GetGizmo', 'GetLastUserMenuInfo', 'GetMarquee', 'GetMouse', 'GetSelection',
+        'GetWindow', 'GPIBReadBinaryWave2', 'GPIBReadBinary2', 'GPIBReadWave2',
+        'GPIBRead2', 'GPIBWriteBinaryWave2', 'GPIBWriteBinary2', 'GPIBWriteWave2',
+        'GPIBWrite2', 'GPIB2', 'GraphNormal', 'GraphWaveDraw', 'GraphWaveEdit', 'Grep',
+        'GroupBox', 'Hanning', 'HDF5CloseFile', 'HDF5CloseGroup', 'HDF5ConvertColors',
+        'HDF5CreateFile', 'HDF5CreateGroup', 'HDF5CreateLink', 'HDF5Dump',
+        'HDF5DumpErrors', 'HDF5DumpState', 'HDF5ListAttributes', 'HDF5ListGroup',
+        'HDF5LoadData', 'HDF5LoadGroup', 'HDF5LoadImage', 'HDF5OpenFile', 'HDF5OpenGroup',
+        'HDF5SaveData', 'HDF5SaveGroup', 'HDF5SaveImage', 'HDF5TestOperation',
+        'HDF5UnlinkObject', 'HideIgorMenus', 'HideInfo', 'HideProcedures', 'HideTools',
+        'HilbertTransform', 'Histogram', 'ICA', 'IFFT', 'ImageAnalyzeParticles',
+        'ImageBlend', 'ImageBoundaryToMask', 'ImageEdgeDetection', 'ImageFileInfo',
+        'ImageFilter', 'ImageFocus', 'ImageFromXYZ', 'ImageGenerateROIMask', 'ImageGLCM',
+        'ImageHistModification', 'ImageHistogram', 'ImageInterpolate', 'ImageLineProfile',
+        'ImageLoad', 'ImageMorphology', 'ImageRegistration', 'ImageRemoveBackground',
+        'ImageRestore', 'ImageRotate', 'ImageSave', 'ImageSeedFill', 'ImageSkeleton3d',
+        'ImageSnake', 'ImageStats', 'ImageThreshold', 'ImageTransform',
+        'ImageUnwrapPhase', 'ImageWindow', 'IndexSort', 'InsertPoints', 'Integrate',
+        'IntegrateODE', 'Integrate2D', 'Interpolate2', 'Interpolate3D', 'Interp3DPath',
+        'JCAMPLoadWave', 'JointHistogram', 'KillBackground', 'KillControl',
+        'KillDataFolder', 'KillFIFO', 'KillFreeAxis', 'KillPath', 'KillPICTs',
+        'KillStrings', 'KillVariables', 'KillWaves', 'KillWindow', 'KMeans', 'Label',
+        'Layout', 'LayoutPageAction', 'LayoutSlideShow', 'Legend',
+        'LinearFeedbackShiftRegister', 'ListBox', 'LoadData', 'LoadPackagePreferences',
+        'LoadPICT', 'LoadWave', 'Loess', 'LombPeriodogram', 'Make', 'MakeIndex',
+        'MarkPerfTestTime', 'MatrixConvolve', 'MatrixCorr', 'MatrixEigenV',
+        'MatrixFilter', 'MatrixGaussJ', 'MatrixGLM', 'MatrixInverse', 'MatrixLinearSolve',
+        'MatrixLinearSolveTD', 'MatrixLLS', 'MatrixLUBkSub', 'MatrixLUD', 'MatrixLUDTD',
+        'MatrixMultiply', 'MatrixOP', 'MatrixSchur', 'MatrixSolve', 'MatrixSVBkSub',
+        'MatrixSVD', 'MatrixTranspose', 'MeasureStyledText', 'MLLoadWave', 'Modify',
+        'ModifyBrowser', 'ModifyCamera', 'ModifyContour', 'ModifyControl',
+        'ModifyControlList', 'ModifyFreeAxis', 'ModifyGizmo', 'ModifyGraph',
+        'ModifyImage', 'ModifyLayout', 'ModifyPanel', 'ModifyTable', 'ModifyWaterfall',
+        'MoveDataFolder', 'MoveFile', 'MoveFolder', 'MoveString', 'MoveSubwindow',
+        'MoveVariable', 'MoveWave', 'MoveWindow', 'MultiTaperPSD',
+        'MultiThreadingControl', 'NeuralNetworkRun', 'NeuralNetworkTrain', 'NewCamera',
+        'NewDataFolder', 'NewFIFO', 'NewFIFOChan', 'NewFreeAxis', 'NewGizmo', 'NewImage',
+        'NewLayout', 'NewMovie', 'NewNotebook', 'NewPanel', 'NewPath', 'NewWaterfall',
+        'NI4882', 'Note', 'Notebook', 'NotebookAction', 'Open', 'OpenHelp',
+        'OpenNotebook', 'Optimize', 'ParseOperationTemplate', 'PathInfo', 'PauseForUser',
+        'PauseUpdate', 'PCA', 'PlayMovie', 'PlayMovieAction', 'PlaySound',
+        'PopupContextualMenu', 'PopupMenu', 'Preferences', 'PrimeFactors', 'Print',
+        'printf', 'PrintGraphs', 'PrintLayout', 'PrintNotebook', 'PrintSettings',
+        'PrintTable', 'Project', 'PulseStats', 'PutScrapText', 'pwd', 'Quit',
+        'RatioFromNumber', 'Redimension', 'Remove', 'RemoveContour', 'RemoveFromGizmo',
+        'RemoveFromGraph', 'RemoveFromLayout', 'RemoveFromTable', 'RemoveImage',
+        'RemoveLayoutObjects', 'RemovePath', 'Rename', 'RenameDataFolder', 'RenamePath',
+        'RenamePICT', 'RenameWindow', 'ReorderImages', 'ReorderTraces', 'ReplaceText',
+        'ReplaceWave', 'Resample', 'ResumeUpdate', 'Reverse', 'Rotate', 'Save',
+        'SaveData', 'SaveExperiment', 'SaveGraphCopy', 'SaveNotebook',
+        'SavePackagePreferences', 'SavePICT', 'SaveTableCopy', 'SetActiveSubwindow',
+        'SetAxis', 'SetBackground', 'SetDashPattern', 'SetDataFolder', 'SetDimLabel',
+        'SetDrawEnv', 'SetDrawLayer', 'SetFileFolderInfo', 'SetFormula', 'SetIgorHook',
+        'SetIgorMenuMode', 'SetIgorOption', 'SetMarquee', 'SetProcessSleep',
+        'SetRandomSeed', 'SetScale', 'SetVariable', 'SetWaveLock', 'SetWaveTextEncoding',
+        'SetWindow', 'ShowIgorMenus', 'ShowInfo', 'ShowTools', 'Silent', 'Sleep',
+        'Slider', 'Smooth', 'SmoothCustom', 'Sort', 'SortColumns', 'SoundInRecord',
+        'SoundInSet', 'SoundInStartChart', 'SoundInStatus', 'SoundInStopChart',
+        'SoundLoadWave', 'SoundSaveWave', 'SphericalInterpolate', 'SphericalTriangulate',
+        'SplitString', 'SplitWave', 'sprintf', 'sscanf', 'Stack', 'StackWindows',
+        'StatsAngularDistanceTest', 'StatsANOVA1Test', 'StatsANOVA2NRTest',
+        'StatsANOVA2RMTest', 'StatsANOVA2Test', 'StatsChiTest',
+        'StatsCircularCorrelationTest', 'StatsCircularMeans', 'StatsCircularMoments',
+        'StatsCircularTwoSampleTest', 'StatsCochranTest', 'StatsContingencyTable',
+        'StatsDIPTest', 'StatsDunnettTest', 'StatsFriedmanTest', 'StatsFTest',
+        'StatsHodgesAjneTest', 'StatsJBTest', 'StatsKDE', 'StatsKendallTauTest',
+        'StatsKSTest', 'StatsKWTest', 'StatsLinearCorrelationTest',
+        'StatsLinearRegression', 'StatsMultiCorrelationTest', 'StatsNPMCTest',
+        'StatsNPNominalSRTest', 'StatsQuantiles', 'StatsRankCorrelationTest',
+        'StatsResample', 'StatsSample', 'StatsScheffeTest', 'StatsShapiroWilkTest',
+        'StatsSignTest', 'StatsSRTest', 'StatsTTest', 'StatsTukeyTest',
+        'StatsVariancesTest', 'StatsWatsonUSquaredTest', 'StatsWatsonWilliamsTest',
+        'StatsWheelerWatsonTest', 'StatsWilcoxonRankTest', 'StatsWRCorrelationTest',
+        'String', 'StructGet', 'StructPut', 'SumDimension', 'SumSeries', 'TabControl',
+        'Tag', 'TextBox', 'ThreadGroupPutDF', 'ThreadStart', 'Tile', 'TileWindows',
+        'TitleBox', 'ToCommandLine', 'ToolsGrid', 'Triangulate3d', 'Unwrap', 'URLRequest',
+        'ValDisplay', 'Variable', 'VDTClosePort2', 'VDTGetPortList2', 'VDTGetStatus2',
+        'VDTOpenPort2', 'VDTOperationsPort2', 'VDTReadBinaryWave2', 'VDTReadBinary2',
+        'VDTReadHexWave2', 'VDTReadHex2', 'VDTReadWave2', 'VDTRead2', 'VDTTerminalPort2',
+        'VDTWriteBinaryWave2', 'VDTWriteBinary2', 'VDTWriteHexWave2', 'VDTWriteHex2',
+        'VDTWriteWave2', 'VDTWrite2', 'VDT2', 'WaveMeanStdv', 'WaveStats',
+        'WaveTransform', 'wfprintf', 'WignerTransform', 'WindowFunction', 'XLLoadWave'
+    )
+    functions = (
+        'abs', 'acos', 'acosh', 'AddListItem', 'AiryA', 'AiryAD', 'AiryB', 'AiryBD',
+        'alog', 'AnnotationInfo', 'AnnotationList', 'area', 'areaXY', 'asin', 'asinh',
+        'atan', 'atanh', 'atan2', 'AxisInfo', 'AxisList', 'AxisValFromPixel', 'Besseli',
+        'Besselj', 'Besselk', 'Bessely', 'beta', 'betai', 'BinarySearch',
+        'BinarySearchInterp', 'binomial', 'binomialln', 'binomialNoise', 'cabs',
+        'CaptureHistory', 'CaptureHistoryStart', 'ceil', 'cequal', 'char2num',
+        'chebyshev', 'chebyshevU', 'CheckName', 'ChildWindowList', 'CleanupName', 'cmplx',
+        'cmpstr', 'conj', 'ContourInfo', 'ContourNameList', 'ContourNameToWaveRef',
+        'ContourZ', 'ControlNameList', 'ConvertTextEncoding', 'cos', 'cosh',
+        'cosIntegral', 'cot', 'coth', 'CountObjects', 'CountObjectsDFR', 'cpowi',
+        'CreationDate', 'csc', 'csch', 'CsrInfo', 'CsrWave', 'CsrWaveRef', 'CsrXWave',
+        'CsrXWaveRef', 'CTabList', 'DataFolderDir', 'DataFolderExists',
+        'DataFolderRefsEqual', 'DataFolderRefStatus', 'date', 'datetime', 'DateToJulian',
+        'date2secs', 'Dawson', 'DDERequestString', 'defined', 'deltax', 'digamma',
+        'dilogarithm', 'DimDelta', 'DimOffset', 'DimSize', 'ei', 'enoise', 'equalWaves',
+        'erf', 'erfc', 'erfcw', 'exists', 'exp', 'ExpConvExp', 'ExpConvExpFit',
+        'ExpConvExpFitBL', 'ExpConvExpFit1Shape', 'ExpConvExpFit1ShapeBL', 'ExpGauss',
+        'ExpGaussFit', 'ExpGaussFitBL', 'ExpGaussFit1Shape', 'ExpGaussFit1ShapeBL',
+        'expInt', 'expIntegralE1', 'expNoise', 'factorial', 'fakedata', 'faverage',
+        'faverageXY', 'FetchURL', 'FindDimLabel', 'FindListItem', 'floor', 'FontList',
+        'FontSizeHeight', 'FontSizeStringWidth', 'FresnelCos', 'FresnelSin',
+        'FuncRefInfo', 'FunctionInfo', 'FunctionList', 'FunctionPath', 'gamma',
+        'gammaEuler', 'gammaInc', 'gammaNoise', 'gammln', 'gammp', 'gammq', 'Gauss',
+        'GaussFit', 'GaussFitBL', 'GaussFit1Width', 'GaussFit1WidthBL', 'Gauss1D',
+        'Gauss2D', 'gcd', 'GetBrowserLine', 'GetBrowserSelection', 'GetDataFolder',
+        'GetDataFolderDFR', 'GetDefaultFont', 'GetDefaultFontSize', 'GetDefaultFontStyle',
+        'GetDimLabel', 'GetEnvironmentVariable', 'GetErrMessage', 'GetFormula',
+        'GetIndependentModuleName', 'GetIndexedObjName', 'GetIndexedObjNameDFR',
+        'GetKeyState', 'GetRTErrMessage', 'GetRTError', 'GetRTLocation', 'GetRTLocInfo',
+        'GetRTStackInfo', 'GetScrapText', 'GetUserData', 'GetWavesDataFolder',
+        'GetWavesDataFolderDFR', 'GizmoInfo', 'GizmoScale', 'gnoise', 'GrepList',
+        'GrepString', 'GuideInfo', 'GuideNameList', 'Hash', 'hcsr', 'HDF5AttributeInfo',
+        'HDF5DatasetInfo', 'HDF5LibraryInfo', 'HDF5TypeInfo', 'hermite', 'hermiteGauss',
+        'HyperGNoise', 'HyperGPFQ', 'HyperG0F1', 'HyperG1F1', 'HyperG2F1', 'IgorInfo',
+        'IgorVersion', 'imag', 'ImageInfo', 'ImageNameList', 'ImageNameToWaveRef',
+        'IndependentModuleList', 'IndexedDir', 'IndexedFile', 'Inf', 'Integrate1D',
+        'interp', 'Interp2D', 'Interp3D', 'inverseERF', 'inverseERFC', 'ItemsInList',
+        'JacobiCn', 'JacobiSn', 'JulianToDate', 'Laguerre', 'LaguerreA', 'LaguerreGauss',
+        'LambertW', 'LayoutInfo', 'leftx', 'LegendreA', 'limit', 'ListMatch',
+        'ListToTextWave', 'ListToWaveRefWave', 'ln', 'log', 'logNormalNoise',
+        'LorentzianFit', 'LorentzianFitBL', 'LorentzianFit1Width',
+        'LorentzianFit1WidthBL', 'lorentzianNoise', 'LowerStr', 'MacroList', 'magsqr',
+        'MandelbrotPoint', 'MarcumQ', 'MatrixCondition', 'MatrixDet', 'MatrixDot',
+        'MatrixRank', 'MatrixTrace', 'max', 'mean', 'median', 'min', 'mod', 'ModDate',
+        'MPFXEMGPeak', 'MPFXExpConvExpPeak', 'MPFXGaussPeak', 'MPFXLorenzianPeak',
+        'MPFXVoigtPeak', 'NameOfWave', 'NaN', 'NewFreeDataFolder', 'NewFreeWave', 'norm',
+        'NormalizeUnicode', 'note', 'NumberByKey', 'numpnts', 'numtype',
+        'NumVarOrDefault', 'num2char', 'num2istr', 'num2str', 'NVAR_Exists',
+        'OperationList', 'PadString', 'PanelResolution', 'ParamIsDefault',
+        'ParseFilePath', 'PathList', 'pcsr', 'Pi', 'PICTInfo', 'PICTList',
+        'PixelFromAxisVal', 'pnt2x', 'poissonNoise', 'poly', 'PolygonArea', 'poly2D',
+        'PossiblyQuoteName', 'ProcedureText', 'p2rect', 'qcsr', 'real', 'RemoveByKey',
+        'RemoveEnding', 'RemoveFromList', 'RemoveListItem', 'ReplaceNumberByKey',
+        'ReplaceString', 'ReplaceStringByKey', 'rightx', 'round', 'r2polar', 'sawtooth',
+        'scaleToIndex', 'ScreenResolution', 'sec', 'sech', 'Secs2Date', 'Secs2Time',
+        'SelectNumber', 'SelectString', 'SetEnvironmentVariable', 'sign', 'sin', 'sinc',
+        'sinh', 'sinIntegral', 'SortList', 'SpecialCharacterInfo', 'SpecialCharacterList',
+        'SpecialDirPath', 'SphericalBessJ', 'SphericalBessJD', 'SphericalBessY',
+        'SphericalBessYD', 'SphericalHarmonics', 'sqrt', 'StartMSTimer', 'StatsBetaCDF',
+        'StatsBetaPDF', 'StatsBinomialCDF', 'StatsBinomialPDF', 'StatsCauchyCDF',
+        'StatsCauchyPDF', 'StatsChiCDF', 'StatsChiPDF', 'StatsCMSSDCDF',
+        'StatsCorrelation', 'StatsDExpCDF', 'StatsDExpPDF', 'StatsErlangCDF',
+        'StatsErlangPDF', 'StatsErrorPDF', 'StatsEValueCDF', 'StatsEValuePDF',
+        'StatsExpCDF', 'StatsExpPDF', 'StatsFCDF', 'StatsFPDF', 'StatsFriedmanCDF',
+        'StatsGammaCDF', 'StatsGammaPDF', 'StatsGeometricCDF', 'StatsGeometricPDF',
+        'StatsGEVCDF', 'StatsGEVPDF', 'StatsHyperGCDF', 'StatsHyperGPDF',
+        'StatsInvBetaCDF', 'StatsInvBinomialCDF', 'StatsInvCauchyCDF', 'StatsInvChiCDF',
+        'StatsInvCMSSDCDF', 'StatsInvDExpCDF', 'StatsInvEValueCDF', 'StatsInvExpCDF',
+        'StatsInvFCDF', 'StatsInvFriedmanCDF', 'StatsInvGammaCDF', 'StatsInvGeometricCDF',
+        'StatsInvKuiperCDF', 'StatsInvLogisticCDF', 'StatsInvLogNormalCDF',
+        'StatsInvMaxwellCDF', 'StatsInvMooreCDF', 'StatsInvNBinomialCDF',
+        'StatsInvNCChiCDF', 'StatsInvNCFCDF', 'StatsInvNormalCDF', 'StatsInvParetoCDF',
+        'StatsInvPoissonCDF', 'StatsInvPowerCDF', 'StatsInvQCDF', 'StatsInvQpCDF',
+        'StatsInvRayleighCDF', 'StatsInvRectangularCDF', 'StatsInvSpearmanCDF',
+        'StatsInvStudentCDF', 'StatsInvTopDownCDF', 'StatsInvTriangularCDF',
+        'StatsInvUsquaredCDF', 'StatsInvVonMisesCDF', 'StatsInvWeibullCDF',
+        'StatsKuiperCDF', 'StatsLogisticCDF', 'StatsLogisticPDF', 'StatsLogNormalCDF',
+        'StatsLogNormalPDF', 'StatsMaxwellCDF', 'StatsMaxwellPDF', 'StatsMedian',
+        'StatsMooreCDF', 'StatsNBinomialCDF', 'StatsNBinomialPDF', 'StatsNCChiCDF',
+        'StatsNCChiPDF', 'StatsNCFCDF', 'StatsNCFPDF', 'StatsNCTCDF', 'StatsNCTPDF',
+        'StatsNormalCDF', 'StatsNormalPDF', 'StatsParetoCDF', 'StatsParetoPDF',
+        'StatsPermute', 'StatsPoissonCDF', 'StatsPoissonPDF', 'StatsPowerCDF',
+        'StatsPowerNoise', 'StatsPowerPDF', 'StatsQCDF', 'StatsQpCDF', 'StatsRayleighCDF',
+        'StatsRayleighPDF', 'StatsRectangularCDF', 'StatsRectangularPDF', 'StatsRunsCDF',
+        'StatsSpearmanRhoCDF', 'StatsStudentCDF', 'StatsStudentPDF', 'StatsTopDownCDF',
+        'StatsTriangularCDF', 'StatsTriangularPDF', 'StatsTrimmedMean',
+        'StatsUSquaredCDF', 'StatsVonMisesCDF', 'StatsVonMisesNoise', 'StatsVonMisesPDF',
+        'StatsWaldCDF', 'StatsWaldPDF', 'StatsWeibullCDF', 'StatsWeibullPDF',
+        'StopMSTimer', 'StringByKey', 'stringCRC', 'StringFromList', 'StringList',
+        'stringmatch', 'strlen', 'strsearch', 'StrVarOrDefault', 'str2num', 'StudentA',
+        'StudentT', 'sum', 'SVAR_Exists', 'TableInfo', 'TagVal', 'TagWaveRef', 'tan',
+        'tanh', 'TextEncodingCode', 'TextEncodingName', 'TextFile', 'ThreadGroupCreate',
+        'ThreadGroupGetDF', 'ThreadGroupGetDFR', 'ThreadGroupRelease', 'ThreadGroupWait',
+        'ThreadProcessorCount', 'ThreadReturnValue', 'ticks', 'time', 'TraceFromPixel',
+        'TraceInfo', 'TraceNameList', 'TraceNameToWaveRef', 'trunc', 'UniqueName',
+        'UnPadString', 'UnsetEnvironmentVariable', 'UpperStr', 'URLDecode', 'URLEncode',
+        'VariableList', 'Variance', 'vcsr', 'Voigt', 'VoigtFit', 'VoigtFitBL',
+        'VoigtFit1Shape', 'VoigtFit1ShapeBL', 'VoigtFit1Shape1Width',
+        'VoigtFit1Shape1WidthBL', 'VoigtFunc', 'WaveCRC', 'WaveDims', 'WaveExists',
+        'WaveInfo', 'WaveList', 'WaveMax', 'WaveMin', 'WaveName', 'WaveRefIndexed',
+        'WaveRefIndexedDFR', 'WaveRefsEqual', 'WaveRefWaveToList', 'WaveTextEncoding',
+        'WaveType', 'WaveUnits', 'WhichListItem', 'WinList', 'WinName', 'WinRecreation',
+        'WinType', 'WMFindWholeWord', 'WNoise', 'xcsr', 'XWaveName', 'XWaveRefFromTrace',
+        'x2pnt', 'zcsr', 'ZernikeR', 'zeta'
+    )
+
+    tokens = {
+        'root': [
+            (r'//.*$', Comment.Single),
+            (r'"([^"\\]|\\.)*"', String),
+            # Flow Control.
+            (words(flowControl, prefix=r'\b', suffix=r'\b'), Keyword),
+            # Types.
+            (words(types, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            # Keywords.
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword.Reserved),
+            # Built-in operations.
+            (words(operations, prefix=r'\b', suffix=r'\b'), Name.Class),
+            # Built-in functions.
+            (words(functions, prefix=r'\b', suffix=r'\b'), Name.Function),
+            # Compiler directives.
+            (r'^#(include|pragma|define|undef|ifdef|ifndef|if|elif|else|endif)',
+             Name.Decorator),
+            (r'[^a-z"/]+$', Text),
+            (r'.', Text),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/graphics.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/graphics.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/graphics.py	(revision 1126)
@@ -0,0 +1,553 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.graphics
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for computer graphics and plotting related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include, bygroups, using, \
+    this, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, \
+    Number, Punctuation, String
+
+__all__ = ['GLShaderLexer', 'PostScriptLexer', 'AsymptoteLexer', 'GnuplotLexer',
+           'PovrayLexer']
+
+
+class GLShaderLexer(RegexLexer):
+    """
+    GLSL (OpenGL Shader) lexer.
+
+    .. versionadded:: 1.1
+    """
+    name = 'GLSL'
+    aliases = ['glsl']
+    filenames = ['*.vert', '*.frag', '*.geo']
+    mimetypes = ['text/x-glslsrc']
+
+    tokens = {
+        'root': [
+            (r'^#.*', Comment.Preproc),
+            (r'//.*', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'\+|-|~|!=?|\*|/|%|<<|>>|<=?|>=?|==?|&&?|\^|\|\|?',
+             Operator),
+            (r'[?:]', Operator),  # quick hack for ternary
+            (r'\bdefined\b', Operator),
+            (r'[;{}(),\[\]]', Punctuation),
+            # FIXME when e is present, no decimal point needed
+            (r'[+-]?\d*\.\d+([eE][-+]?\d+)?', Number.Float),
+            (r'[+-]?\d+\.\d*([eE][-+]?\d+)?', Number.Float),
+            (r'0[xX][0-9a-fA-F]*', Number.Hex),
+            (r'0[0-7]*', Number.Oct),
+            (r'[1-9][0-9]*', Number.Integer),
+            (words((
+                'attribute', 'const', 'uniform', 'varying', 'centroid', 'break',
+                'continue', 'do', 'for', 'while', 'if', 'else', 'in', 'out',
+                'inout', 'float', 'int', 'void', 'bool', 'true', 'false',
+                'invariant', 'discard', 'return', 'mat2', 'mat3' 'mat4',
+                'mat2x2', 'mat3x2', 'mat4x2', 'mat2x3', 'mat3x3', 'mat4x3',
+                'mat2x4', 'mat3x4', 'mat4x4', 'vec2', 'vec3', 'vec4',
+                'ivec2', 'ivec3', 'ivec4', 'bvec2', 'bvec3', 'bvec4',
+                'sampler1D', 'sampler2D', 'sampler3D' 'samplerCube',
+                'sampler1DShadow', 'sampler2DShadow', 'struct'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words((
+                'asm', 'class', 'union', 'enum', 'typedef', 'template', 'this',
+                'packed', 'goto', 'switch', 'default', 'inline', 'noinline',
+                'volatile', 'public', 'static', 'extern', 'external', 'interface',
+                'long', 'short', 'double', 'half', 'fixed', 'unsigned', 'lowp',
+                'mediump', 'highp', 'precision', 'input', 'output',
+                'hvec2', 'hvec3', 'hvec4', 'dvec2', 'dvec3', 'dvec4',
+                'fvec2', 'fvec3', 'fvec4', 'sampler2DRect', 'sampler3DRect',
+                'sampler2DRectShadow', 'sizeof', 'cast', 'namespace', 'using'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword),  # future use
+            (r'[a-zA-Z_]\w*', Name),
+            (r'\.', Punctuation),
+            (r'\s+', Text),
+        ],
+    }
+
+
+class PostScriptLexer(RegexLexer):
+    """
+    Lexer for PostScript files.
+
+    The PostScript Language Reference published by Adobe at
+    <http://partners.adobe.com/public/developer/en/ps/PLRM.pdf>
+    is the authority for this.
+
+    .. versionadded:: 1.4
+    """
+    name = 'PostScript'
+    aliases = ['postscript', 'postscr']
+    filenames = ['*.ps', '*.eps']
+    mimetypes = ['application/postscript']
+
+    delimiter = r'()<>\[\]{}/%\s'
+    delimiter_end = r'(?=[%s])' % delimiter
+
+    valid_name_chars = r'[^%s]' % delimiter
+    valid_name = r"%s+%s" % (valid_name_chars, delimiter_end)
+
+    tokens = {
+        'root': [
+            # All comment types
+            (r'^%!.+\n', Comment.Preproc),
+            (r'%%.*\n', Comment.Special),
+            (r'(^%.*\n){2,}', Comment.Multiline),
+            (r'%.*\n', Comment.Single),
+
+            # String literals are awkward; enter separate state.
+            (r'\(', String, 'stringliteral'),
+
+            (r'[{}<>\[\]]', Punctuation),
+
+            # Numbers
+            (r'<[0-9A-Fa-f]+>' + delimiter_end, Number.Hex),
+            # Slight abuse: use Oct to signify any explicit base system
+            (r'[0-9]+\#(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)'
+             r'((e|E)[0-9]+)?' + delimiter_end, Number.Oct),
+            (r'(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)((e|E)[0-9]+)?'
+             + delimiter_end, Number.Float),
+            (r'(\-|\+)?[0-9]+' + delimiter_end, Number.Integer),
+
+            # References
+            (r'\/%s' % valid_name, Name.Variable),
+
+            # Names
+            (valid_name, Name.Function),      # Anything else is executed
+
+            # These keywords taken from
+            # <http://www.math.ubc.ca/~cass/graphics/manual/pdf/a1.pdf>
+            # Is there an authoritative list anywhere that doesn't involve
+            # trawling documentation?
+
+            (r'(false|true)' + delimiter_end, Keyword.Constant),
+
+            # Conditionals / flow control
+            (r'(eq|ne|g[et]|l[et]|and|or|not|if(?:else)?|for(?:all)?)'
+             + delimiter_end, Keyword.Reserved),
+
+            (words((
+                'abs', 'add', 'aload', 'arc', 'arcn', 'array', 'atan', 'begin',
+                'bind', 'ceiling', 'charpath', 'clip', 'closepath', 'concat',
+                'concatmatrix', 'copy', 'cos', 'currentlinewidth', 'currentmatrix',
+                'currentpoint', 'curveto', 'cvi', 'cvs', 'def', 'defaultmatrix',
+                'dict', 'dictstackoverflow', 'div', 'dtransform', 'dup', 'end',
+                'exch', 'exec', 'exit', 'exp', 'fill', 'findfont', 'floor', 'get',
+                'getinterval', 'grestore', 'gsave', 'gt', 'identmatrix', 'idiv',
+                'idtransform', 'index', 'invertmatrix', 'itransform', 'length',
+                'lineto', 'ln', 'load', 'log', 'loop', 'matrix', 'mod', 'moveto',
+                'mul', 'neg', 'newpath', 'pathforall', 'pathbbox', 'pop', 'print',
+                'pstack', 'put', 'quit', 'rand', 'rangecheck', 'rcurveto', 'repeat',
+                'restore', 'rlineto', 'rmoveto', 'roll', 'rotate', 'round', 'run',
+                'save', 'scale', 'scalefont', 'setdash', 'setfont', 'setgray',
+                'setlinecap', 'setlinejoin', 'setlinewidth', 'setmatrix',
+                'setrgbcolor', 'shfill', 'show', 'showpage', 'sin', 'sqrt',
+                'stack', 'stringwidth', 'stroke', 'strokepath', 'sub', 'syntaxerror',
+                'transform', 'translate', 'truncate', 'typecheck', 'undefined',
+                'undefinedfilename', 'undefinedresult'), suffix=delimiter_end),
+             Name.Builtin),
+
+            (r'\s+', Text),
+        ],
+
+        'stringliteral': [
+            (r'[^()\\]+', String),
+            (r'\\', String.Escape, 'escape'),
+            (r'\(', String, '#push'),
+            (r'\)', String, '#pop'),
+        ],
+
+        'escape': [
+            (r'[0-8]{3}|n|r|t|b|f|\\|\(|\)', String.Escape, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class AsymptoteLexer(RegexLexer):
+    """
+    For `Asymptote <http://asymptote.sf.net/>`_ source code.
+
+    .. versionadded:: 1.2
+    """
+    name = 'Asymptote'
+    aliases = ['asy', 'asymptote']
+    filenames = ['*.asy']
+    mimetypes = ['text/x-asymptote']
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+'
+
+    tokens = {
+        'whitespace': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'//(\n|(.|\n)*?[^\\]\n)', Comment),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment),
+        ],
+        'statements': [
+            # simple string (TeX friendly)
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # C style string (with character escapes)
+            (r"'", String, 'string'),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+            (r'0[0-7]+[Ll]?', Number.Oct),
+            (r'\d+[Ll]?', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.]', Punctuation),
+            (r'\b(case)(.+?)(:)', bygroups(Keyword, using(this), Text)),
+            (r'(and|controls|tension|atleast|curl|if|else|while|for|do|'
+             r'return|break|continue|struct|typedef|new|access|import|'
+             r'unravel|from|include|quote|static|public|private|restricted|'
+             r'this|explicit|true|false|null|cycle|newframe|operator)\b', Keyword),
+            # Since an asy-type-name can be also an asy-function-name,
+            # in the following we test if the string "  [a-zA-Z]" follows
+            # the Keyword.Type.
+            # Of course it is not perfect !
+            (r'(Braid|FitResult|Label|Legend|TreeNode|abscissa|arc|arrowhead|'
+             r'binarytree|binarytreeNode|block|bool|bool3|bounds|bqe|circle|'
+             r'conic|coord|coordsys|cputime|ellipse|file|filltype|frame|grid3|'
+             r'guide|horner|hsv|hyperbola|indexedTransform|int|inversion|key|'
+             r'light|line|linefit|marginT|marker|mass|object|pair|parabola|path|'
+             r'path3|pen|picture|point|position|projection|real|revolution|'
+             r'scaleT|scientific|segment|side|slice|splitface|string|surface|'
+             r'tensionSpecifier|ticklocate|ticksgridT|tickvalues|transform|'
+             r'transformation|tree|triangle|trilinear|triple|vector|'
+             r'vertex|void)(?=\s+[a-zA-Z])', Keyword.Type),
+            # Now the asy-type-name which are not asy-function-name
+            # except yours !
+            # Perhaps useless
+            (r'(Braid|FitResult|TreeNode|abscissa|arrowhead|block|bool|bool3|'
+             r'bounds|coord|frame|guide|horner|int|linefit|marginT|pair|pen|'
+             r'picture|position|real|revolution|slice|splitface|ticksgridT|'
+             r'tickvalues|tree|triple|vertex|void)\b', Keyword.Type),
+            ('[a-zA-Z_]\w*:(?!:)', Name.Label),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'root': [
+            include('whitespace'),
+            # functions
+            (r'((?:[\w*\s])+?(?:\s|\*))'  # return arguments
+             r'([a-zA-Z_]\w*)'            # method name
+             r'(\s*\([^;]*?\))'           # signature
+             r'(' + _ws + r')(\{)',
+             bygroups(using(this), Name.Function, using(this), using(this),
+                      Punctuation),
+             'function'),
+            # function declarations
+            (r'((?:[\w*\s])+?(?:\s|\*))'  # return arguments
+             r'([a-zA-Z_]\w*)'            # method name
+             r'(\s*\([^;]*?\))'           # signature
+             r'(' + _ws + r')(;)',
+             bygroups(using(this), Name.Function, using(this), using(this),
+                      Punctuation)),
+            default('statement'),
+        ],
+        'statement': [
+            include('whitespace'),
+            include('statements'),
+            ('[{}]', Punctuation),
+            (';', Punctuation, '#pop'),
+        ],
+        'function': [
+            include('whitespace'),
+            include('statements'),
+            (';', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r"'", String, '#pop'),
+            (r'\\([\\abfnrtv"\'?]|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'\n', String),
+            (r"[^\\'\n]+", String),  # all other characters
+            (r'\\\n', String),
+            (r'\\n', String),        # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+    }
+
+    def get_tokens_unprocessed(self, text):
+        from pygments.lexers._asy_builtins import ASYFUNCNAME, ASYVARNAME
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name and value in ASYFUNCNAME:
+                token = Name.Function
+            elif token is Name and value in ASYVARNAME:
+                token = Name.Variable
+            yield index, token, value
+
+
+def _shortened(word):
+    dpos = word.find('$')
+    return '|'.join(word[:dpos] + word[dpos+1:i] + r'\b'
+                    for i in range(len(word), dpos, -1))
+
+
+def _shortened_many(*words):
+    return '|'.join(map(_shortened, words))
+
+
+class GnuplotLexer(RegexLexer):
+    """
+    For `Gnuplot <http://gnuplot.info/>`_ plotting scripts.
+
+    .. versionadded:: 0.11
+    """
+
+    name = 'Gnuplot'
+    aliases = ['gnuplot']
+    filenames = ['*.plot', '*.plt']
+    mimetypes = ['text/x-gnuplot']
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (_shortened('bi$nd'), Keyword, 'bind'),
+            (_shortened_many('ex$it', 'q$uit'), Keyword, 'quit'),
+            (_shortened('f$it'), Keyword, 'fit'),
+            (r'(if)(\s*)(\()', bygroups(Keyword, Text, Punctuation), 'if'),
+            (r'else\b', Keyword),
+            (_shortened('pa$use'), Keyword, 'pause'),
+            (_shortened_many('p$lot', 'rep$lot', 'sp$lot'), Keyword, 'plot'),
+            (_shortened('sa$ve'), Keyword, 'save'),
+            (_shortened('se$t'), Keyword, ('genericargs', 'optionarg')),
+            (_shortened_many('sh$ow', 'uns$et'),
+             Keyword, ('noargs', 'optionarg')),
+            (_shortened_many('low$er', 'ra$ise', 'ca$ll', 'cd$', 'cl$ear',
+                             'h$elp', '\\?$', 'hi$story', 'l$oad', 'pr$int',
+                             'pwd$', 're$read', 'res$et', 'scr$eendump',
+                             'she$ll', 'sy$stem', 'up$date'),
+             Keyword, 'genericargs'),
+            (_shortened_many('pwd$', 're$read', 'res$et', 'scr$eendump',
+                             'she$ll', 'test$'),
+             Keyword, 'noargs'),
+            ('([a-zA-Z_]\w*)(\s*)(=)',
+             bygroups(Name.Variable, Text, Operator), 'genericargs'),
+            ('([a-zA-Z_]\w*)(\s*\(.*?\)\s*)(=)',
+             bygroups(Name.Function, Text, Operator), 'genericargs'),
+            (r'@[a-zA-Z_]\w*', Name.Constant),  # macros
+            (r';', Keyword),
+        ],
+        'comment': [
+            (r'[^\\\n]', Comment),
+            (r'\\\n', Comment),
+            (r'\\', Comment),
+            # don't add the newline to the Comment token
+            default('#pop'),
+        ],
+        'whitespace': [
+            ('#', Comment, 'comment'),
+            (r'[ \t\v\f]+', Text),
+        ],
+        'noargs': [
+            include('whitespace'),
+            # semicolon and newline end the argument list
+            (r';', Punctuation, '#pop'),
+            (r'\n', Text, '#pop'),
+        ],
+        'dqstring': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),   # all other characters
+            (r'\\\n', String),        # line continuation
+            (r'\\', String),          # stray backslash
+            (r'\n', String, '#pop'),  # newline ends the string too
+        ],
+        'sqstring': [
+            (r"''", String),          # escaped single quote
+            (r"'", String, '#pop'),
+            (r"[^\\'\n]+", String),   # all other characters
+            (r'\\\n', String),        # line continuation
+            (r'\\', String),          # normal backslash
+            (r'\n', String, '#pop'),  # newline ends the string too
+        ],
+        'genericargs': [
+            include('noargs'),
+            (r'"', String, 'dqstring'),
+            (r"'", String, 'sqstring'),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'(\d+\.\d*|\.\d+)', Number.Float),
+            (r'-?\d+', Number.Integer),
+            ('[,.~!%^&*+=|?:<>/-]', Operator),
+            ('[{}()\[\]]', Punctuation),
+            (r'(eq|ne)\b', Operator.Word),
+            (r'([a-zA-Z_]\w*)(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'@[a-zA-Z_]\w*', Name.Constant),  # macros
+            (r'\\\n', Text),
+        ],
+        'optionarg': [
+            include('whitespace'),
+            (_shortened_many(
+                "a$ll", "an$gles", "ar$row", "au$toscale", "b$ars", "bor$der",
+                "box$width", "cl$abel", "c$lip", "cn$trparam", "co$ntour", "da$ta",
+                "data$file", "dg$rid3d", "du$mmy", "enc$oding", "dec$imalsign",
+                "fit$", "font$path", "fo$rmat", "fu$nction", "fu$nctions", "g$rid",
+                "hid$den3d", "his$torysize", "is$osamples", "k$ey", "keyt$itle",
+                "la$bel", "li$nestyle", "ls$", "loa$dpath", "loc$ale", "log$scale",
+                "mac$ros", "map$ping", "map$ping3d", "mar$gin", "lmar$gin",
+                "rmar$gin", "tmar$gin", "bmar$gin", "mo$use", "multi$plot",
+                "mxt$ics", "nomxt$ics", "mx2t$ics", "nomx2t$ics", "myt$ics",
+                "nomyt$ics", "my2t$ics", "nomy2t$ics", "mzt$ics", "nomzt$ics",
+                "mcbt$ics", "nomcbt$ics", "of$fsets", "or$igin", "o$utput",
+                "pa$rametric", "pm$3d", "pal$ette", "colorb$ox", "p$lot",
+                "poi$ntsize", "pol$ar", "pr$int", "obj$ect", "sa$mples", "si$ze",
+                "st$yle", "su$rface", "table$", "t$erminal", "termo$ptions", "ti$cs",
+                "ticsc$ale", "ticsl$evel", "timef$mt", "tim$estamp", "tit$le",
+                "v$ariables", "ve$rsion", "vi$ew", "xyp$lane", "xda$ta", "x2da$ta",
+                "yda$ta", "y2da$ta", "zda$ta", "cbda$ta", "xl$abel", "x2l$abel",
+                "yl$abel", "y2l$abel", "zl$abel", "cbl$abel", "xti$cs", "noxti$cs",
+                "x2ti$cs", "nox2ti$cs", "yti$cs", "noyti$cs", "y2ti$cs", "noy2ti$cs",
+                "zti$cs", "nozti$cs", "cbti$cs", "nocbti$cs", "xdti$cs", "noxdti$cs",
+                "x2dti$cs", "nox2dti$cs", "ydti$cs", "noydti$cs", "y2dti$cs",
+                "noy2dti$cs", "zdti$cs", "nozdti$cs", "cbdti$cs", "nocbdti$cs",
+                "xmti$cs", "noxmti$cs", "x2mti$cs", "nox2mti$cs", "ymti$cs",
+                "noymti$cs", "y2mti$cs", "noy2mti$cs", "zmti$cs", "nozmti$cs",
+                "cbmti$cs", "nocbmti$cs", "xr$ange", "x2r$ange", "yr$ange",
+                "y2r$ange", "zr$ange", "cbr$ange", "rr$ange", "tr$ange", "ur$ange",
+                "vr$ange", "xzeroa$xis", "x2zeroa$xis", "yzeroa$xis", "y2zeroa$xis",
+                "zzeroa$xis", "zeroa$xis", "z$ero"), Name.Builtin, '#pop'),
+        ],
+        'bind': [
+            ('!', Keyword, '#pop'),
+            (_shortened('all$windows'), Name.Builtin),
+            include('genericargs'),
+        ],
+        'quit': [
+            (r'gnuplot\b', Keyword),
+            include('noargs'),
+        ],
+        'fit': [
+            (r'via\b', Name.Builtin),
+            include('plot'),
+        ],
+        'if': [
+            (r'\)', Punctuation, '#pop'),
+            include('genericargs'),
+        ],
+        'pause': [
+            (r'(mouse|any|button1|button2|button3)\b', Name.Builtin),
+            (_shortened('key$press'), Name.Builtin),
+            include('genericargs'),
+        ],
+        'plot': [
+            (_shortened_many('ax$es', 'axi$s', 'bin$ary', 'ev$ery', 'i$ndex',
+                             'mat$rix', 's$mooth', 'thru$', 't$itle',
+                             'not$itle', 'u$sing', 'w$ith'),
+             Name.Builtin),
+            include('genericargs'),
+        ],
+        'save': [
+            (_shortened_many('f$unctions', 's$et', 't$erminal', 'v$ariables'),
+             Name.Builtin),
+            include('genericargs'),
+        ],
+    }
+
+
+class PovrayLexer(RegexLexer):
+    """
+    For `Persistence of Vision Raytracer <http://www.povray.org/>`_ files.
+
+    .. versionadded:: 0.11
+    """
+    name = 'POVRay'
+    aliases = ['pov']
+    filenames = ['*.pov', '*.inc']
+    mimetypes = ['text/x-povray']
+
+    tokens = {
+        'root': [
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'//.*\n', Comment.Single),
+            (r'(?s)"(?:\\.|[^"\\])+"', String.Double),
+            (words((
+                'break', 'case', 'debug', 'declare', 'default', 'define', 'else',
+                'elseif', 'end', 'error', 'fclose', 'fopen', 'for', 'if', 'ifdef',
+                'ifndef', 'include', 'local', 'macro', 'range', 'read', 'render',
+                'statistics', 'switch', 'undef', 'version', 'warning', 'while',
+                'write'), prefix=r'#', suffix=r'\b'),
+             Comment.Preproc),
+            (words((
+                'aa_level', 'aa_threshold', 'abs', 'acos', 'acosh', 'adaptive', 'adc_bailout',
+                'agate', 'agate_turb', 'all', 'alpha', 'ambient', 'ambient_light', 'angle',
+                'aperture', 'arc_angle', 'area_light', 'asc', 'asin', 'asinh', 'assumed_gamma',
+                'atan', 'atan2', 'atanh', 'atmosphere', 'atmospheric_attenuation',
+                'attenuating', 'average', 'background', 'black_hole', 'blue', 'blur_samples',
+                'bounded_by', 'box_mapping', 'bozo', 'break', 'brick', 'brick_size',
+                'brightness', 'brilliance', 'bumps', 'bumpy1', 'bumpy2', 'bumpy3', 'bump_map',
+                'bump_size', 'case', 'caustics', 'ceil', 'checker', 'chr', 'clipped_by', 'clock',
+                'color', 'color_map', 'colour', 'colour_map', 'component', 'composite', 'concat',
+                'confidence', 'conic_sweep', 'constant', 'control0', 'control1', 'cos', 'cosh',
+                'count', 'crackle', 'crand', 'cube', 'cubic_spline', 'cylindrical_mapping',
+                'debug', 'declare', 'default', 'degrees', 'dents', 'diffuse', 'direction',
+                'distance', 'distance_maximum', 'div', 'dust', 'dust_type', 'eccentricity',
+                'else', 'emitting', 'end', 'error', 'error_bound', 'exp', 'exponent',
+                'fade_distance', 'fade_power', 'falloff', 'falloff_angle', 'false',
+                'file_exists', 'filter', 'finish', 'fisheye', 'flatness', 'flip', 'floor',
+                'focal_point', 'fog', 'fog_alt', 'fog_offset', 'fog_type', 'frequency', 'gif',
+                'global_settings', 'glowing', 'gradient', 'granite', 'gray_threshold',
+                'green', 'halo', 'hexagon', 'hf_gray_16', 'hierarchy', 'hollow', 'hypercomplex',
+                'if', 'ifdef', 'iff', 'image_map', 'incidence', 'include', 'int', 'interpolate',
+                'inverse', 'ior', 'irid', 'irid_wavelength', 'jitter', 'lambda', 'leopard',
+                'linear', 'linear_spline', 'linear_sweep', 'location', 'log', 'looks_like',
+                'look_at', 'low_error_factor', 'mandel', 'map_type', 'marble', 'material_map',
+                'matrix', 'max', 'max_intersections', 'max_iteration', 'max_trace_level',
+                'max_value', 'metallic', 'min', 'minimum_reuse', 'mod', 'mortar',
+                'nearest_count', 'no', 'normal', 'normal_map', 'no_shadow', 'number_of_waves',
+                'octaves', 'off', 'offset', 'omega', 'omnimax', 'on', 'once', 'onion', 'open',
+                'orthographic', 'panoramic', 'pattern1', 'pattern2', 'pattern3',
+                'perspective', 'pgm', 'phase', 'phong', 'phong_size', 'pi', 'pigment',
+                'pigment_map', 'planar_mapping', 'png', 'point_at', 'pot', 'pow', 'ppm',
+                'precision', 'pwr', 'quadratic_spline', 'quaternion', 'quick_color',
+                'quick_colour', 'quilted', 'radial', 'radians', 'radiosity', 'radius', 'rainbow',
+                'ramp_wave', 'rand', 'range', 'reciprocal', 'recursion_limit', 'red',
+                'reflection', 'refraction', 'render', 'repeat', 'rgb', 'rgbf', 'rgbft', 'rgbt',
+                'right', 'ripples', 'rotate', 'roughness', 'samples', 'scale', 'scallop_wave',
+                'scattering', 'seed', 'shadowless', 'sin', 'sine_wave', 'sinh', 'sky', 'sky_sphere',
+                'slice', 'slope_map', 'smooth', 'specular', 'spherical_mapping', 'spiral',
+                'spiral1', 'spiral2', 'spotlight', 'spotted', 'sqr', 'sqrt', 'statistics', 'str',
+                'strcmp', 'strength', 'strlen', 'strlwr', 'strupr', 'sturm', 'substr', 'switch', 'sys',
+                't', 'tan', 'tanh', 'test_camera_1', 'test_camera_2', 'test_camera_3',
+                'test_camera_4', 'texture', 'texture_map', 'tga', 'thickness', 'threshold',
+                'tightness', 'tile2', 'tiles', 'track', 'transform', 'translate', 'transmit',
+                'triangle_wave', 'true', 'ttf', 'turbulence', 'turb_depth', 'type',
+                'ultra_wide_angle', 'up', 'use_color', 'use_colour', 'use_index', 'u_steps',
+                'val', 'variance', 'vaxis_rotate', 'vcross', 'vdot', 'version', 'vlength',
+                'vnormalize', 'volume_object', 'volume_rendered', 'vol_with_light',
+                'vrotate', 'v_steps', 'warning', 'warp', 'water_level', 'waves', 'while', 'width',
+                'wood', 'wrinkles', 'yes'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words((
+                'bicubic_patch', 'blob', 'box', 'camera', 'cone', 'cubic', 'cylinder', 'difference',
+                'disc', 'height_field', 'intersection', 'julia_fractal', 'lathe',
+                'light_source', 'merge', 'mesh', 'object', 'plane', 'poly', 'polygon', 'prism',
+                'quadric', 'quartic', 'smooth_triangle', 'sor', 'sphere', 'superellipsoid',
+                'text', 'torus', 'triangle', 'union'), suffix=r'\b'),
+             Name.Builtin),
+            # TODO: <=, etc
+            (r'[\[\](){}<>;,]', Punctuation),
+            (r'[-+*/=]', Operator),
+            (r'\b(x|y|z|u|v)\b', Name.Builtin.Pseudo),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'[0-9]+\.[0-9]*', Number.Float),
+            (r'\.[0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r'\s+', Text),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/urbi.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/urbi.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/urbi.py	(revision 1126)
@@ -0,0 +1,133 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.urbi
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for UrbiScript language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['UrbiscriptLexer']
+
+
+class UrbiscriptLexer(ExtendedRegexLexer):
+    """
+    For UrbiScript source code.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'UrbiScript'
+    aliases = ['urbiscript']
+    filenames = ['*.u']
+    mimetypes = ['application/x-urbiscript']
+
+    flags = re.DOTALL
+
+    # TODO
+    # - handle Experimental and deprecated tags with specific tokens
+    # - handle Angles and Durations with specific tokens
+
+    def blob_callback(lexer, match, ctx):
+        text_before_blob = match.group(1)
+        blob_start = match.group(2)
+        blob_size_str = match.group(3)
+        blob_size = int(blob_size_str)
+        yield match.start(), String, text_before_blob
+        ctx.pos += len(text_before_blob)
+
+        # if blob size doesn't match blob format (example : "\B(2)(aaa)")
+        # yield blob as a string
+        if ctx.text[match.end() + blob_size] != ")":
+            result = "\\B(" + blob_size_str + ")("
+            yield match.start(), String, result
+            ctx.pos += len(result)
+            return
+
+        # if blob is well formated, yield as Escape
+        blob_text = blob_start + ctx.text[match.end():match.end()+blob_size] + ")"
+        yield match.start(), String.Escape, blob_text
+        ctx.pos = match.end() + blob_size + 1  # +1 is the ending ")"
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # comments
+            (r'//.*?\n', Comment),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'(every|for|loop|while)(?:;|&|\||,)', Keyword),
+            (words((
+                'assert', 'at', 'break', 'case', 'catch', 'closure', 'compl',
+                'continue', 'default', 'else', 'enum', 'every', 'external',
+                'finally', 'for', 'freezeif', 'if', 'new', 'onleave', 'return',
+                'stopif', 'switch', 'this', 'throw', 'timeout', 'try',
+                'waituntil', 'whenever', 'while'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'asm', 'auto', 'bool', 'char', 'const_cast', 'delete', 'double',
+                'dynamic_cast', 'explicit', 'export', 'extern', 'float', 'friend',
+                'goto', 'inline', 'int', 'long', 'mutable', 'namespace', 'register',
+                'reinterpret_cast', 'short', 'signed', 'sizeof', 'static_cast',
+                'struct', 'template', 'typedef', 'typeid', 'typename', 'union',
+                'unsigned', 'using', 'virtual', 'volatile', 'wchar_t'), suffix=r'\b'),
+             Keyword.Reserved),
+            # deprecated keywords, use a meaningfull token when available
+            (r'(emit|foreach|internal|loopn|static)\b', Keyword),
+            # ignored keywords, use a meaningfull token when available
+            (r'(private|protected|public)\b', Keyword),
+            (r'(var|do|const|function|class)\b', Keyword.Declaration),
+            (r'(true|false|nil|void)\b', Keyword.Constant),
+            (words((
+                'Barrier', 'Binary', 'Boolean', 'CallMessage', 'Channel', 'Code',
+                'Comparable', 'Container', 'Control', 'Date', 'Dictionary', 'Directory',
+                'Duration', 'Enumeration', 'Event', 'Exception', 'Executable', 'File',
+                'Finalizable', 'Float', 'FormatInfo', 'Formatter', 'Global', 'Group',
+                'Hash', 'InputStream', 'IoService', 'Job', 'Kernel', 'Lazy', 'List',
+                'Loadable', 'Lobby', 'Location', 'Logger', 'Math', 'Mutex', 'nil',
+                'Object', 'Orderable', 'OutputStream', 'Pair', 'Path', 'Pattern',
+                'Position', 'Primitive', 'Process', 'Profile', 'PseudoLazy', 'PubSub',
+                'RangeIterable', 'Regexp', 'Semaphore', 'Server', 'Singleton', 'Socket',
+                'StackFrame', 'Stream', 'String', 'System', 'Tag', 'Timeout',
+                'Traceable', 'TrajectoryGenerator', 'Triplet', 'Tuple', 'UObject',
+                'UValue', 'UVar'), suffix=r'\b'),
+             Name.Builtin),
+            (r'(?:this)\b', Name.Builtin.Pseudo),
+            # don't match single | and &
+            (r'(?:[-=+*%/<>~^:]+|\.&?|\|\||&&)', Operator),
+            (r'(?:and_eq|and|bitand|bitor|in|not|not_eq|or_eq|or|xor_eq|xor)\b',
+             Operator.Word),
+            (r'[{}\[\]()]+', Punctuation),
+            (r'(?:;|\||,|&|\?|!)+', Punctuation),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            # Float, Integer, Angle and Duration
+            (r'(?:[0-9]+(?:(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)?'
+             r'((?:rad|deg|grad)|(?:ms|s|min|h|d))?)\b', Number.Float),
+            # handle binary blob in strings
+            (r'"', String.Double, "string.double"),
+            (r"'", String.Single, "string.single"),
+        ],
+        'string.double': [
+            (r'((?:\\\\|\\"|[^"])*?)(\\B\((\d+)\)\()', blob_callback),
+            (r'(\\\\|\\"|[^"])*?"', String.Double, '#pop'),
+        ],
+        'string.single': [
+            (r"((?:\\\\|\\'|[^'])*?)(\\B\((\d+)\)\()", blob_callback),
+            (r"(\\\\|\\'|[^'])*?'", String.Single, '#pop'),
+        ],
+        # from http://pygments.org/docs/lexerdevelopment/#changing-states
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_mql_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_mql_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_mql_builtins.py	(revision 1126)
@@ -0,0 +1,1172 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._mql_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtins for the MqlLexer.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+types = (
+    'AccountBalance',
+    'AccountCompany',
+    'AccountCredit',
+    'AccountCurrency',
+    'AccountEquity',
+    'AccountFreeMarginCheck',
+    'AccountFreeMarginMode',
+    'AccountFreeMargin',
+    'AccountInfoDouble',
+    'AccountInfoInteger',
+    'AccountInfoString',
+    'AccountLeverage',
+    'AccountMargin',
+    'AccountName',
+    'AccountNumber',
+    'AccountProfit',
+    'AccountServer',
+    'AccountStopoutLevel',
+    'AccountStopoutMode',
+    'Alert',
+    'ArrayBsearch',
+    'ArrayCompare',
+    'ArrayCopyRates',
+    'ArrayCopySeries',
+    'ArrayCopy',
+    'ArrayDimension',
+    'ArrayFill',
+    'ArrayFree',
+    'ArrayGetAsSeries',
+    'ArrayInitialize',
+    'ArrayIsDynamic',
+    'ArrayIsSeries',
+    'ArrayMaximum',
+    'ArrayMinimum',
+    'ArrayRange',
+    'ArrayResize',
+    'ArraySetAsSeries',
+    'ArraySize',
+    'ArraySort',
+    'CharArrayToString',
+    'CharToString',
+    'CharToStr',
+    'CheckPointer',
+    'ColorToARGB',
+    'ColorToString',
+    'Comment',
+    'CopyClose',
+    'CopyHigh',
+    'CopyLow',
+    'CopyOpen',
+    'CopyRates',
+    'CopyRealVolume',
+    'CopySpread',
+    'CopyTickVolume',
+    'CopyTime',
+    'DayOfWeek',
+    'DayOfYear',
+    'Day',
+    'DebugBreak',
+    'Digits',
+    'DoubleToString',
+    'DoubleToStr',
+    'EnumToString',
+    'EventChartCustom',
+    'EventKillTimer',
+    'EventSetMillisecondTimer',
+    'EventSetTimer',
+    'ExpertRemove',
+    'FileClose',
+    'FileCopy',
+    'FileDelete',
+    'FileFindClose',
+    'FileFindFirst',
+    'FileFindNext',
+    'FileFlush',
+    'FileGetInteger',
+    'FileIsEnding',
+    'FileIsExist',
+    'FileIsLineEnding',
+    'FileMove',
+    'FileOpenHistory',
+    'FileOpen',
+    'FileReadArray',
+    'FileReadBool',
+    'FileReadDatetime',
+    'FileReadDouble',
+    'FileReadFloat',
+    'FileReadInteger',
+    'FileReadLong',
+    'FileReadNumber',
+    'FileReadString',
+    'FileReadStruct',
+    'FileSeek',
+    'FileSize',
+    'FileTell',
+    'FileWriteArray',
+    'FileWriteDouble',
+    'FileWriteFloat',
+    'FileWriteInteger',
+    'FileWriteLong',
+    'FileWriteString',
+    'FileWriteStruct',
+    'FileWrite',
+    'FolderClean',
+    'FolderCreate',
+    'FolderDelete',
+    'GetLastError',
+    'GetPointer',
+    'GetTickCount',
+    'GlobalVariableCheck',
+    'GlobalVariableDel',
+    'GlobalVariableGet',
+    'GlobalVariableName',
+    'GlobalVariableSetOnCondition',
+    'GlobalVariableSet',
+    'GlobalVariableTemp',
+    'GlobalVariableTime',
+    'GlobalVariablesDeleteAll',
+    'GlobalVariablesFlush',
+    'GlobalVariablesTotal',
+    'HideTestIndicators',
+    'Hour',
+    'IndicatorBuffers',
+    'IndicatorCounted',
+    'IndicatorDigits',
+    'IndicatorSetDouble',
+    'IndicatorSetInteger',
+    'IndicatorSetString',
+    'IndicatorShortName',
+    'IntegerToString',
+    'IsConnected',
+    'IsDemo',
+    'IsDllsAllowed',
+    'IsExpertEnabled',
+    'IsLibrariesAllowed',
+    'IsOptimization',
+    'IsStopped',
+    'IsTesting',
+    'IsTradeAllowed',
+    'IsTradeContextBusy',
+    'IsVisualMode',
+    'MQLInfoInteger',
+    'MQLInfoString',
+    'MarketInfo',
+    'MathAbs',
+    'MathArccos',
+    'MathArcsin',
+    'MathArctan',
+    'MathCeil',
+    'MathCos',
+    'MathExp',
+    'MathFloor',
+    'MathIsValidNumber',
+    'MathLog',
+    'MathMax',
+    'MathMin',
+    'MathMod',
+    'MathPow',
+    'MathRand',
+    'MathRound',
+    'MathSin',
+    'MathSqrt',
+    'MathSrand',
+    'MathTan',
+    'MessageBox',
+    'Minute',
+    'Month',
+    'NormalizeDouble',
+    'ObjectCreate',
+    'ObjectDelete',
+    'ObjectDescription',
+    'ObjectFind',
+    'ObjectGetDouble',
+    'ObjectGetFiboDescription',
+    'ObjectGetInteger',
+    'ObjectGetShiftByValue',
+    'ObjectGetString',
+    'ObjectGetTimeByValue',
+    'ObjectGetValueByShift',
+    'ObjectGetValueByTime',
+    'ObjectGet',
+    'ObjectMove',
+    'ObjectName',
+    'ObjectSetDouble',
+    'ObjectSetFiboDescription',
+    'ObjectSetInteger',
+    'ObjectSetString',
+    'ObjectSetText',
+    'ObjectSet',
+    'ObjectType',
+    'ObjectsDeleteAll',
+    'ObjectsTotal',
+    'OrderCloseBy',
+    'OrderClosePrice',
+    'OrderCloseTime',
+    'OrderClose',
+    'OrderComment',
+    'OrderCommission',
+    'OrderDelete',
+    'OrderExpiration',
+    'OrderLots',
+    'OrderMagicNumber',
+    'OrderModify',
+    'OrderOpenPrice',
+    'OrderOpenTime',
+    'OrderPrint',
+    'OrderProfit',
+    'OrderSelect',
+    'OrderSend',
+    'OrderStopLoss',
+    'OrderSwap',
+    'OrderSymbol',
+    'OrderTakeProfit',
+    'OrderTicket',
+    'OrderType',
+    'OrdersHistoryTotal',
+    'OrdersTotal',
+    'PeriodSeconds',
+    'Period',
+    'PlaySound',
+    'Point',
+    'PrintFormat',
+    'Print',
+    'RefreshRates',
+    'ResetLastError',
+    'ResourceCreate',
+    'ResourceFree',
+    'ResourceReadImage',
+    'ResourceSave',
+    'Seconds',
+    'SendFTP',
+    'SendMail',
+    'SendNotification',
+    'SeriesInfoInteger',
+    'SetIndexArrow',
+    'SetIndexBuffer',
+    'SetIndexDrawBegin',
+    'SetIndexEmptyValue',
+    'SetIndexLabel',
+    'SetIndexShift',
+    'SetIndexStyle',
+    'SetLevelStyle',
+    'SetLevelValue',
+    'ShortArrayToString',
+    'ShortToString',
+    'Sleep',
+    'StrToDouble',
+    'StrToInteger',
+    'StrToTime',
+    'StringAdd',
+    'StringBufferLen',
+    'StringCompare',
+    'StringConcatenate',
+    'StringFill',
+    'StringFind',
+    'StringFormat',
+    'StringGetCharacter',
+    'StringGetChar',
+    'StringInit',
+    'StringLen',
+    'StringReplace',
+    'StringSetCharacter',
+    'StringSetChar',
+    'StringSplit',
+    'StringSubstr',
+    'StringToCharArray',
+    'StringToColor',
+    'StringToDouble',
+    'StringToInteger',
+    'StringToLower',
+    'StringToShortArray',
+    'StringToTime',
+    'StringToUpper',
+    'StringTrimLeft',
+    'StringTrimRight',
+    'StructToTime',
+    'SymbolInfoDouble',
+    'SymbolInfoInteger',
+    'SymbolInfoSessionQuote',
+    'SymbolInfoSessionTrade',
+    'SymbolInfoString',
+    'SymbolInfoTick',
+    'SymbolIsSynchronized',
+    'SymbolName',
+    'SymbolSelect',
+    'SymbolsTotal',
+    'Symbol',
+    'TerminalClose',
+    'TerminalCompany',
+    'TerminalName',
+    'TerminalPath',
+    'TesterStatistics',
+    'TextGetSize',
+    'TextOut',
+    'TextSetFont',
+    'TimeCurrent',
+    'TimeDayOfWeek',
+    'TimeDayOfYear',
+    'TimeDaylightSavings',
+    'TimeDay',
+    'TimeGMTOffset',
+    'TimeGMT',
+    'TimeHour',
+    'TimeLocal',
+    'TimeMinute',
+    'TimeMonth',
+    'TimeSeconds',
+    'TimeToString',
+    'TimeToStruct',
+    'TimeToStr',
+    'TimeTradeServer',
+    'TimeYear',
+    'UninitializeReason',
+    'WindowBarsPerChart',
+    'WindowExpertName',
+    'WindowFind',
+    'WindowFirstVisibleBar',
+    'WindowHandle',
+    'WindowIsVisible',
+    'WindowOnDropped',
+    'WindowPriceMax',
+    'WindowPriceMin',
+    'WindowPriceOnDropped',
+    'WindowRedraw',
+    'WindowScreenShot',
+    'WindowTimeOnDropped',
+    'WindowXOnDropped',
+    'WindowYOnDropped',
+    'WindowsTotal',
+    'Year',
+    'ZeroMemory',
+    'iAC',
+    'iADX',
+    'iAD',
+    'iAO',
+    'iATR',
+    'iAlligator',
+    'iBWMFI',
+    'iBandsOnArray',
+    'iBands',
+    'iBarShift',
+    'iBars',
+    'iBearsPower',
+    'iBullsPower',
+    'iCCIOnArray',
+    'iCCI',
+    'iClose',
+    'iCustom',
+    'iDeMarker',
+    'iEnvelopesOnArray',
+    'iEnvelopes',
+    'iForce',
+    'iFractals',
+    'iGator',
+    'iHighest',
+    'iHigh',
+    'iIchimoku',
+    'iLowest',
+    'iLow',
+    'iMACD',
+    'iMAOnArray',
+    'iMA',
+    'iMFI',
+    'iMomentumOnArray',
+    'iMomentum',
+    'iOBV',
+    'iOpen',
+    'iOsMA',
+    'iRSIOnArray',
+    'iRSI',
+    'iRVI',
+    'iSAR',
+    'iStdDevOnArray',
+    'iStdDev',
+    'iStochastic',
+    'iTime',
+    'iVolume',
+    'iWPR',
+)
+
+constants = (
+    'ACCOUNT_BALANCE',
+    'ACCOUNT_COMPANY',
+    'ACCOUNT_CREDIT',
+    'ACCOUNT_CURRENCY',
+    'ACCOUNT_EQUITY',
+    'ACCOUNT_FREEMARGIN',
+    'ACCOUNT_LEVERAGE',
+    'ACCOUNT_LIMIT_ORDERS',
+    'ACCOUNT_LOGIN',
+    'ACCOUNT_MARGIN',
+    'ACCOUNT_MARGIN_LEVEL',
+    'ACCOUNT_MARGIN_SO_CALL',
+    'ACCOUNT_MARGIN_SO_MODE',
+    'ACCOUNT_MARGIN_SO_SO',
+    'ACCOUNT_NAME',
+    'ACCOUNT_PROFIT',
+    'ACCOUNT_SERVER',
+    'ACCOUNT_STOPOUT_MODE_MONEY',
+    'ACCOUNT_STOPOUT_MODE_PERCENT',
+    'ACCOUNT_TRADE_ALLOWED',
+    'ACCOUNT_TRADE_EXPERT',
+    'ACCOUNT_TRADE_MODE',
+    'ACCOUNT_TRADE_MODE_CONTEST',
+    'ACCOUNT_TRADE_MODE_DEMO',
+    'ACCOUNT_TRADE_MODE_REAL',
+    'ALIGN_CENTER',
+    'ALIGN_LEFT',
+    'ALIGN_RIGHT',
+    'ANCHOR_BOTTOM',
+    'ANCHOR_CENTER',
+    'ANCHOR_LEFT',
+    'ANCHOR_LEFT_LOWER',
+    'ANCHOR_LEFT_UPPER',
+    'ANCHOR_LOWER',
+    'ANCHOR_RIGHT',
+    'ANCHOR_RIGHT_LOWER',
+    'ANCHOR_RIGHT_UPPER',
+    'ANCHOR_TOP',
+    'ANCHOR_UPPER',
+    'BORDER_FLAT',
+    'BORDER_RAISED',
+    'BORDER_SUNKEN',
+    'CHARTEVENT_CHART_CHANGE',
+    'CHARTEVENT_CLICK',
+    'CHARTEVENT_CUSTOM',
+    'CHARTEVENT_CUSTOM_LAST',
+    'CHARTEVENT_KEYDOWN',
+    'CHARTEVENT_MOUSE_MOVE',
+    'CHARTEVENT_OBJECT_CHANGE',
+    'CHARTEVENT_OBJECT_CLICK',
+    'CHARTEVENT_OBJECT_CREATE',
+    'CHARTEVENT_OBJECT_DELETE',
+    'CHARTEVENT_OBJECT_DRAG',
+    'CHARTEVENT_OBJECT_ENDEDIT',
+    'CHARTS_MAX',
+    'CHART_AUTOSCROLL',
+    'CHART_BARS',
+    'CHART_BEGIN',
+    'CHART_BRING_TO_TOP',
+    'CHART_CANDLES',
+    'CHART_COLOR_ASK',
+    'CHART_COLOR_BACKGROUND',
+    'CHART_COLOR_BID',
+    'CHART_COLOR_CANDLE_BEAR',
+    'CHART_COLOR_CANDLE_BULL',
+    'CHART_COLOR_CHART_DOWN',
+    'CHART_COLOR_CHART_LINE',
+    'CHART_COLOR_CHART_UP',
+    'CHART_COLOR_FOREGROUND',
+    'CHART_COLOR_GRID',
+    'CHART_COLOR_LAST',
+    'CHART_COLOR_STOP_LEVEL',
+    'CHART_COLOR_VOLUME',
+    'CHART_COMMENT',
+    'CHART_CURRENT_POS',
+    'CHART_DRAG_TRADE_LEVELS',
+    'CHART_END',
+    'CHART_EVENT_MOUSE_MOVE',
+    'CHART_EVENT_OBJECT_CREATE',
+    'CHART_EVENT_OBJECT_DELETE',
+    'CHART_FIRST_VISIBLE_BAR',
+    'CHART_FIXED_MAX',
+    'CHART_FIXED_MIN',
+    'CHART_FIXED_POSITION',
+    'CHART_FOREGROUND',
+    'CHART_HEIGHT_IN_PIXELS',
+    'CHART_IS_OBJECT',
+    'CHART_LINE',
+    'CHART_MODE',
+    'CHART_MOUSE_SCROLL',
+    'CHART_POINTS_PER_BAR',
+    'CHART_PRICE_MAX',
+    'CHART_PRICE_MIN',
+    'CHART_SCALEFIX',
+    'CHART_SCALEFIX_11',
+    'CHART_SCALE',
+    'CHART_SCALE_PT_PER_BAR',
+    'CHART_SHIFT',
+    'CHART_SHIFT_SIZE',
+    'CHART_SHOW_ASK_LINE',
+    'CHART_SHOW_BID_LINE',
+    'CHART_SHOW_DATE_SCALE',
+    'CHART_SHOW_GRID',
+    'CHART_SHOW_LAST_LINE',
+    'CHART_SHOW_OBJECT_DESCR',
+    'CHART_SHOW_OHLC',
+    'CHART_SHOW_PERIOD_SEP',
+    'CHART_SHOW_PRICE_SCALE',
+    'CHART_SHOW_TRADE_LEVELS',
+    'CHART_SHOW_VOLUMES',
+    'CHART_VISIBLE_BARS',
+    'CHART_VOLUME_HIDE',
+    'CHART_VOLUME_REAL',
+    'CHART_VOLUME_TICK',
+    'CHART_WIDTH_IN_BARS',
+    'CHART_WIDTH_IN_PIXELS',
+    'CHART_WINDOWS_TOTAL',
+    'CHART_WINDOW_HANDLE',
+    'CHART_WINDOW_IS_VISIBLE',
+    'CHART_WINDOW_YDISTANCE',
+    'CHAR_MAX',
+    'CHAR_MIN',
+    'CLR_NONE',
+    'CORNER_LEFT_LOWER',
+    'CORNER_LEFT_UPPER',
+    'CORNER_RIGHT_LOWER',
+    'CORNER_RIGHT_UPPER',
+    'CP_ACP',
+    'CP_MACCP',
+    'CP_OEMCP',
+    'CP_SYMBOL',
+    'CP_THREAD_ACP',
+    'CP_UTF7',
+    'CP_UTF8',
+    'DBL_DIG',
+    'DBL_EPSILON',
+    'DBL_MANT_DIG',
+    'DBL_MAX',
+    'DBL_MAX_10_EXP',
+    'DBL_MAX_EXP',
+    'DBL_MIN',
+    'DBL_MIN_10_EXP',
+    'DBL_MIN_EXP',
+    'DRAW_ARROW',
+    'DRAW_FILLING',
+    'DRAW_HISTOGRAM',
+    'DRAW_LINE',
+    'DRAW_NONE',
+    'DRAW_SECTION',
+    'DRAW_ZIGZAG',
+    'EMPTY',
+    'EMPTY_VALUE',
+    'ERR_ACCOUNT_DISABLED',
+    'ERR_BROKER_BUSY',
+    'ERR_COMMON_ERROR',
+    'ERR_INVALID_ACCOUNT',
+    'ERR_INVALID_PRICE',
+    'ERR_INVALID_STOPS',
+    'ERR_INVALID_TRADE_PARAMETERS',
+    'ERR_INVALID_TRADE_VOLUME',
+    'ERR_LONG_POSITIONS_ONLY_ALLOWED',
+    'ERR_MALFUNCTIONAL_TRADE',
+    'ERR_MARKET_CLOSED',
+    'ERR_NOT_ENOUGH_MONEY',
+    'ERR_NOT_ENOUGH_RIGHTS',
+    'ERR_NO_CONNECTION',
+    'ERR_NO_ERROR',
+    'ERR_NO_RESULT',
+    'ERR_OFF_QUOTES',
+    'ERR_OLD_VERSION',
+    'ERR_ORDER_LOCKED',
+    'ERR_PRICE_CHANGED',
+    'ERR_REQUOTE',
+    'ERR_SERVER_BUSY',
+    'ERR_TOO_FREQUENT_REQUESTS',
+    'ERR_TOO_MANY_REQUESTS',
+    'ERR_TRADE_CONTEXT_BUSY',
+    'ERR_TRADE_DISABLED',
+    'ERR_TRADE_EXPIRATION_DENIED',
+    'ERR_TRADE_HEDGE_PROHIBITED',
+    'ERR_TRADE_MODIFY_DENIED',
+    'ERR_TRADE_PROHIBITED_BY_FIFO',
+    'ERR_TRADE_TIMEOUT',
+    'ERR_TRADE_TOO_MANY_ORDERS',
+    'FILE_ACCESS_DATE',
+    'FILE_ANSI',
+    'FILE_BIN',
+    'FILE_COMMON',
+    'FILE_CREATE_DATE',
+    'FILE_CSV',
+    'FILE_END',
+    'FILE_EXISTS',
+    'FILE_IS_ANSI',
+    'FILE_IS_BINARY',
+    'FILE_IS_COMMON',
+    'FILE_IS_CSV',
+    'FILE_IS_READABLE',
+    'FILE_IS_TEXT',
+    'FILE_IS_WRITABLE',
+    'FILE_LINE_END',
+    'FILE_MODIFY_DATE',
+    'FILE_POSITION',
+    'FILE_READ',
+    'FILE_REWRITE',
+    'FILE_SHARE_READ',
+    'FILE_SHARE_WRITE',
+    'FILE_SIZE',
+    'FILE_TXT',
+    'FILE_UNICODE',
+    'FILE_WRITE',
+    'FLT_DIG',
+    'FLT_EPSILON',
+    'FLT_MANT_DIG',
+    'FLT_MAX',
+    'FLT_MAX_10_EXP',
+    'FLT_MAX_EXP',
+    'FLT_MIN',
+    'FLT_MIN_10_EXP',
+    'FLT_MIN_EXP',
+    'FRIDAY',
+    'GANN_DOWN_TREND',
+    'GANN_UP_TREND',
+    'IDABORT',
+    'IDCANCEL',
+    'IDCONTINUE',
+    'IDIGNORE',
+    'IDNO',
+    'IDOK',
+    'IDRETRY',
+    'IDTRYAGAIN',
+    'IDYES',
+    'INDICATOR_CALCULATIONS',
+    'INDICATOR_COLOR_INDEX',
+    'INDICATOR_DATA',
+    'INDICATOR_DIGITS',
+    'INDICATOR_HEIGHT',
+    'INDICATOR_LEVELCOLOR',
+    'INDICATOR_LEVELSTYLE',
+    'INDICATOR_LEVELS',
+    'INDICATOR_LEVELTEXT',
+    'INDICATOR_LEVELVALUE',
+    'INDICATOR_LEVELWIDTH',
+    'INDICATOR_MAXIMUM',
+    'INDICATOR_MINIMUM',
+    'INDICATOR_SHORTNAME',
+    'INT_MAX',
+    'INT_MIN',
+    'INVALID_HANDLE',
+    'IS_DEBUG_MODE',
+    'IS_PROFILE_MODE',
+    'LICENSE_DEMO',
+    'LICENSE_FREE',
+    'LICENSE_FULL',
+    'LICENSE_TIME',
+    'LONG_MAX',
+    'LONG_MIN',
+    'MB_ABORTRETRYIGNORE',
+    'MB_CANCELTRYCONTINUE',
+    'MB_DEFBUTTON1',
+    'MB_DEFBUTTON2',
+    'MB_DEFBUTTON3',
+    'MB_DEFBUTTON4',
+    'MB_ICONASTERISK',
+    'MB_ICONERROR',
+    'MB_ICONEXCLAMATION',
+    'MB_ICONHAND',
+    'MB_ICONINFORMATION',
+    'MB_ICONQUESTION',
+    'MB_ICONSTOP',
+    'MB_ICONWARNING',
+    'MB_OKCANCEL',
+    'MB_OK',
+    'MB_RETRYCANCEL',
+    'MB_YESNOCANCEL',
+    'MB_YESNO',
+    'MODE_ASK',
+    'MODE_BID',
+    'MODE_CHINKOUSPAN',
+    'MODE_CLOSE',
+    'MODE_DIGITS',
+    'MODE_EMA',
+    'MODE_EXPIRATION',
+    'MODE_FREEZELEVEL',
+    'MODE_GATORJAW',
+    'MODE_GATORLIPS',
+    'MODE_GATORTEETH',
+    'MODE_HIGH',
+    'MODE_KIJUNSEN',
+    'MODE_LOTSIZE',
+    'MODE_LOTSTEP',
+    'MODE_LOWER',
+    'MODE_LOW',
+    'MODE_LWMA',
+    'MODE_MAIN',
+    'MODE_MARGINCALCMODE',
+    'MODE_MARGINHEDGED',
+    'MODE_MARGININIT',
+    'MODE_MARGINMAINTENANCE',
+    'MODE_MARGINREQUIRED',
+    'MODE_MAXLOT',
+    'MODE_MINLOT',
+    'MODE_MINUSDI',
+    'MODE_OPEN',
+    'MODE_PLUSDI',
+    'MODE_POINT',
+    'MODE_PROFITCALCMODE',
+    'MODE_SENKOUSPANA',
+    'MODE_SENKOUSPANB',
+    'MODE_SIGNAL',
+    'MODE_SMA',
+    'MODE_SMMA',
+    'MODE_SPREAD',
+    'MODE_STARTING',
+    'MODE_STOPLEVEL',
+    'MODE_SWAPLONG',
+    'MODE_SWAPSHORT',
+    'MODE_SWAPTYPE',
+    'MODE_TENKANSEN',
+    'MODE_TICKSIZE',
+    'MODE_TICKVALUE',
+    'MODE_TIME',
+    'MODE_TRADEALLOWED',
+    'MODE_UPPER',
+    'MODE_VOLUME',
+    'MONDAY',
+    'MQL_DEBUG',
+    'MQL_DLLS_ALLOWED',
+    'MQL_FRAME_MODE',
+    'MQL_LICENSE_TYPE',
+    'MQL_OPTIMIZATION',
+    'MQL_PROFILER',
+    'MQL_PROGRAM_NAME',
+    'MQL_PROGRAM_PATH',
+    'MQL_PROGRAM_TYPE',
+    'MQL_TESTER',
+    'MQL_TRADE_ALLOWED',
+    'MQL_VISUAL_MODE',
+    'M_1_PI',
+    'M_2_PI',
+    'M_2_SQRTPI',
+    'M_E',
+    'M_LN2',
+    'M_LN10',
+    'M_LOG2E',
+    'M_LOG10E',
+    'M_PI',
+    'M_PI_2',
+    'M_PI_4',
+    'M_SQRT1_2',
+    'M_SQRT2',
+    'NULL',
+    'OBJPROP_ALIGN',
+    'OBJPROP_ANCHOR',
+    'OBJPROP_ANGLE',
+    'OBJPROP_ARROWCODE',
+    'OBJPROP_BACK',
+    'OBJPROP_BGCOLOR',
+    'OBJPROP_BMPFILE',
+    'OBJPROP_BORDER_COLOR',
+    'OBJPROP_BORDER_TYPE',
+    'OBJPROP_CHART_ID',
+    'OBJPROP_CHART_SCALE',
+    'OBJPROP_COLOR',
+    'OBJPROP_CORNER',
+    'OBJPROP_CREATETIME',
+    'OBJPROP_DATE_SCALE',
+    'OBJPROP_DEVIATION',
+    'OBJPROP_DRAWLINES',
+    'OBJPROP_ELLIPSE',
+    'OBJPROP_FIBOLEVELS',
+    'OBJPROP_FILL',
+    'OBJPROP_FIRSTLEVEL',
+    'OBJPROP_FONTSIZE',
+    'OBJPROP_FONT',
+    'OBJPROP_HIDDEN',
+    'OBJPROP_LEVELCOLOR',
+    'OBJPROP_LEVELSTYLE',
+    'OBJPROP_LEVELS',
+    'OBJPROP_LEVELTEXT',
+    'OBJPROP_LEVELVALUE',
+    'OBJPROP_LEVELWIDTH',
+    'OBJPROP_NAME',
+    'OBJPROP_PERIOD',
+    'OBJPROP_PRICE1',
+    'OBJPROP_PRICE2',
+    'OBJPROP_PRICE3',
+    'OBJPROP_PRICE',
+    'OBJPROP_PRICE_SCALE',
+    'OBJPROP_RAY',
+    'OBJPROP_RAY_RIGHT',
+    'OBJPROP_READONLY',
+    'OBJPROP_SCALE',
+    'OBJPROP_SELECTABLE',
+    'OBJPROP_SELECTED',
+    'OBJPROP_STATE',
+    'OBJPROP_STYLE',
+    'OBJPROP_SYMBOL',
+    'OBJPROP_TEXT',
+    'OBJPROP_TIME1',
+    'OBJPROP_TIME2',
+    'OBJPROP_TIME3',
+    'OBJPROP_TIMEFRAMES',
+    'OBJPROP_TIME',
+    'OBJPROP_TOOLTIP',
+    'OBJPROP_TYPE',
+    'OBJPROP_WIDTH',
+    'OBJPROP_XDISTANCE',
+    'OBJPROP_XOFFSET',
+    'OBJPROP_XSIZE',
+    'OBJPROP_YDISTANCE',
+    'OBJPROP_YOFFSET',
+    'OBJPROP_YSIZE',
+    'OBJPROP_ZORDER',
+    'OBJ_ALL_PERIODS',
+    'OBJ_ARROW',
+    'OBJ_ARROW_BUY',
+    'OBJ_ARROW_CHECK',
+    'OBJ_ARROW_DOWN',
+    'OBJ_ARROW_LEFT_PRICE',
+    'OBJ_ARROW_RIGHT_PRICE',
+    'OBJ_ARROW_SELL',
+    'OBJ_ARROW_STOP',
+    'OBJ_ARROW_THUMB_DOWN',
+    'OBJ_ARROW_THUMB_UP',
+    'OBJ_ARROW_UP',
+    'OBJ_BITMAP',
+    'OBJ_BITMAP_LABEL',
+    'OBJ_BUTTON',
+    'OBJ_CHANNEL',
+    'OBJ_CYCLES',
+    'OBJ_EDIT',
+    'OBJ_ELLIPSE',
+    'OBJ_EVENT',
+    'OBJ_EXPANSION',
+    'OBJ_FIBOARC',
+    'OBJ_FIBOCHANNEL',
+    'OBJ_FIBOFAN',
+    'OBJ_FIBOTIMES',
+    'OBJ_FIBO',
+    'OBJ_GANNFAN',
+    'OBJ_GANNGRID',
+    'OBJ_GANNLINE',
+    'OBJ_HLINE',
+    'OBJ_LABEL',
+    'OBJ_NO_PERIODS',
+    'OBJ_PERIOD_D1',
+    'OBJ_PERIOD_H1',
+    'OBJ_PERIOD_H4',
+    'OBJ_PERIOD_M1',
+    'OBJ_PERIOD_M5',
+    'OBJ_PERIOD_M15',
+    'OBJ_PERIOD_M30',
+    'OBJ_PERIOD_MN1',
+    'OBJ_PERIOD_W1',
+    'OBJ_PITCHFORK',
+    'OBJ_RECTANGLE',
+    'OBJ_RECTANGLE_LABEL',
+    'OBJ_REGRESSION',
+    'OBJ_STDDEVCHANNEL',
+    'OBJ_TEXT',
+    'OBJ_TRENDBYANGLE',
+    'OBJ_TREND',
+    'OBJ_TRIANGLE',
+    'OBJ_VLINE',
+    'OP_BUYLIMIT',
+    'OP_BUYSTOP',
+    'OP_BUY',
+    'OP_SELLLIMIT',
+    'OP_SELLSTOP',
+    'OP_SELL',
+    'PERIOD_CURRENT',
+    'PERIOD_D1',
+    'PERIOD_H1',
+    'PERIOD_H2',
+    'PERIOD_H3',
+    'PERIOD_H4',
+    'PERIOD_H6',
+    'PERIOD_H8',
+    'PERIOD_H12',
+    'PERIOD_M1',
+    'PERIOD_M2',
+    'PERIOD_M3',
+    'PERIOD_M4',
+    'PERIOD_M5',
+    'PERIOD_M6',
+    'PERIOD_M10',
+    'PERIOD_M12',
+    'PERIOD_M15',
+    'PERIOD_M20',
+    'PERIOD_M30',
+    'PERIOD_MN1',
+    'PERIOD_W1',
+    'POINTER_AUTOMATIC',
+    'POINTER_DYNAMIC',
+    'POINTER_INVALID'
+    'PRICE_CLOSE',
+    'PRICE_HIGH',
+    'PRICE_LOW',
+    'PRICE_MEDIAN',
+    'PRICE_OPEN',
+    'PRICE_TYPICAL',
+    'PRICE_WEIGHTED',
+    'PROGRAM_EXPERT',
+    'PROGRAM_INDICATOR',
+    'PROGRAM_SCRIPT',
+    'REASON_ACCOUNT',
+    'REASON_CHARTCHANGE',
+    'REASON_CHARTCLOSE',
+    'REASON_CLOSE',
+    'REASON_INITFAILED',
+    'REASON_PARAMETERS',
+    'REASON_PROGRAM'
+    'REASON_RECOMPILE',
+    'REASON_REMOVE',
+    'REASON_TEMPLATE',
+    'SATURDAY',
+    'SEEK_CUR',
+    'SEEK_END',
+    'SEEK_SET',
+    'SERIES_BARS_COUNT',
+    'SERIES_FIRSTDATE',
+    'SERIES_LASTBAR_DATE',
+    'SERIES_SERVER_FIRSTDATE',
+    'SERIES_SYNCHRONIZED',
+    'SERIES_TERMINAL_FIRSTDATE',
+    'SHORT_MAX',
+    'SHORT_MIN',
+    'STAT_BALANCEDD_PERCENT',
+    'STAT_BALANCEMIN',
+    'STAT_BALANCE_DDREL_PERCENT',
+    'STAT_BALANCE_DD',
+    'STAT_BALANCE_DD_RELATIVE',
+    'STAT_CONLOSSMAX',
+    'STAT_CONLOSSMAX_TRADES',
+    'STAT_CONPROFITMAX',
+    'STAT_CONPROFITMAX_TRADES',
+    'STAT_CUSTOM_ONTESTER',
+    'STAT_DEALS',
+    'STAT_EQUITYDD_PERCENT',
+    'STAT_EQUITYMIN',
+    'STAT_EQUITY_DDREL_PERCENT',
+    'STAT_EQUITY_DD',
+    'STAT_EQUITY_DD_RELATIVE',
+    'STAT_EXPECTED_PAYOFF',
+    'STAT_GROSS_LOSS',
+    'STAT_GROSS_PROFIT',
+    'STAT_INITIAL_DEPOSIT',
+    'STAT_LONG_TRADES',
+    'STAT_LOSSTRADES_AVGCON',
+    'STAT_LOSS_TRADES',
+    'STAT_MAX_CONLOSSES',
+    'STAT_MAX_CONLOSS_TRADES',
+    'STAT_MAX_CONPROFIT_TRADES',
+    'STAT_MAX_CONWINS',
+    'STAT_MAX_LOSSTRADE',
+    'STAT_MAX_PROFITTRADE',
+    'STAT_MIN_MARGINLEVEL',
+    'STAT_PROFITTRADES_AVGCON',
+    'STAT_PROFIT',
+    'STAT_PROFIT_FACTOR',
+    'STAT_PROFIT_LONGTRADES',
+    'STAT_PROFIT_SHORTTRADES',
+    'STAT_PROFIT_TRADES',
+    'STAT_RECOVERY_FACTOR',
+    'STAT_SHARPE_RATIO',
+    'STAT_SHORT_TRADES',
+    'STAT_TRADES',
+    'STAT_WITHDRAWAL',
+    'STO_CLOSECLOSE',
+    'STO_LOWHIGH',
+    'STYLE_DASHDOTDOT',
+    'STYLE_DASHDOT',
+    'STYLE_DASH',
+    'STYLE_DOT',
+    'STYLE_SOLID',
+    'SUNDAY',
+    'SYMBOL_ARROWDOWN',
+    'SYMBOL_ARROWUP',
+    'SYMBOL_CHECKSIGN',
+    'SYMBOL_LEFTPRICE',
+    'SYMBOL_RIGHTPRICE',
+    'SYMBOL_STOPSIGN',
+    'SYMBOL_THUMBSDOWN',
+    'SYMBOL_THUMBSUP',
+    'TERMINAL_BUILD',
+    'TERMINAL_CODEPAGE',
+    'TERMINAL_COMMONDATA_PATH',
+    'TERMINAL_COMPANY',
+    'TERMINAL_CONNECTED',
+    'TERMINAL_CPU_CORES',
+    'TERMINAL_DATA_PATH',
+    'TERMINAL_DISK_SPACE',
+    'TERMINAL_DLLS_ALLOWED',
+    'TERMINAL_EMAIL_ENABLED',
+    'TERMINAL_FTP_ENABLED',
+    'TERMINAL_LANGUAGE',
+    'TERMINAL_MAXBARS',
+    'TERMINAL_MEMORY_AVAILABLE',
+    'TERMINAL_MEMORY_PHYSICAL',
+    'TERMINAL_MEMORY_TOTAL',
+    'TERMINAL_MEMORY_USED',
+    'TERMINAL_NAME',
+    'TERMINAL_OPENCL_SUPPORT',
+    'TERMINAL_PATH',
+    'TERMINAL_TRADE_ALLOWED',
+    'TERMINAL_X64',
+    'THURSDAY',
+    'TRADE_ACTION_DEAL',
+    'TRADE_ACTION_MODIFY',
+    'TRADE_ACTION_PENDING',
+    'TRADE_ACTION_REMOVE',
+    'TRADE_ACTION_SLTP',
+    'TUESDAY',
+    'UCHAR_MAX',
+    'UINT_MAX',
+    'ULONG_MAX',
+    'USHORT_MAX',
+    'VOLUME_REAL',
+    'VOLUME_TICK',
+    'WEDNESDAY',
+    'WHOLE_ARRAY',
+    'WRONG_VALUE',
+    'clrNONE',
+    '__DATETIME__',
+    '__DATE__',
+    '__FILE__',
+    '__FUNCSIG__',
+    '__FUNCTION__',
+    '__LINE__',
+    '__MQL4BUILD__',
+    '__MQLBUILD__',
+    '__PATH__',
+)
+
+colors = (
+    'AliceBlue',
+    'AntiqueWhite',
+    'Aquamarine',
+    'Aqua',
+    'Beige',
+    'Bisque',
+    'Black',
+    'BlanchedAlmond',
+    'BlueViolet',
+    'Blue',
+    'Brown',
+    'BurlyWood',
+    'CadetBlue',
+    'Chartreuse',
+    'Chocolate',
+    'Coral',
+    'CornflowerBlue',
+    'Cornsilk',
+    'Crimson',
+    'DarkBlue',
+    'DarkGoldenrod',
+    'DarkGray',
+    'DarkGreen',
+    'DarkKhaki',
+    'DarkOliveGreen',
+    'DarkOrange',
+    'DarkOrchid',
+    'DarkSalmon',
+    'DarkSeaGreen',
+    'DarkSlateBlue',
+    'DarkSlateGray',
+    'DarkTurquoise',
+    'DarkViolet',
+    'DeepPink',
+    'DeepSkyBlue',
+    'DimGray',
+    'DodgerBlue',
+    'FireBrick',
+    'ForestGreen',
+    'Gainsboro',
+    'Goldenrod',
+    'Gold',
+    'Gray',
+    'GreenYellow',
+    'Green',
+    'Honeydew',
+    'HotPink',
+    'IndianRed',
+    'Indigo',
+    'Ivory',
+    'Khaki',
+    'LavenderBlush',
+    'Lavender',
+    'LawnGreen',
+    'LemonChiffon',
+    'LightBlue',
+    'LightCoral',
+    'LightCyan',
+    'LightGoldenrod',
+    'LightGray',
+    'LightGreen',
+    'LightPink',
+    'LightSalmon',
+    'LightSeaGreen',
+    'LightSkyBlue',
+    'LightSlateGray',
+    'LightSteelBlue',
+    'LightYellow',
+    'LimeGreen',
+    'Lime',
+    'Linen',
+    'Magenta',
+    'Maroon',
+    'MediumAquamarine',
+    'MediumBlue',
+    'MediumOrchid',
+    'MediumPurple',
+    'MediumSeaGreen',
+    'MediumSlateBlue',
+    'MediumSpringGreen',
+    'MediumTurquoise',
+    'MediumVioletRed',
+    'MidnightBlue',
+    'MintCream',
+    'MistyRose',
+    'Moccasin',
+    'NavajoWhite',
+    'Navy',
+    'OldLace',
+    'OliveDrab',
+    'Olive',
+    'OrangeRed',
+    'Orange',
+    'Orchid',
+    'PaleGoldenrod',
+    'PaleGreen',
+    'PaleTurquoise',
+    'PaleVioletRed',
+    'PapayaWhip',
+    'PeachPuff',
+    'Peru',
+    'Pink',
+    'Plum',
+    'PowderBlue',
+    'Purple',
+    'Red',
+    'RosyBrown',
+    'RoyalBlue',
+    'SaddleBrown',
+    'Salmon',
+    'SandyBrown',
+    'SeaGreen',
+    'Seashell',
+    'Sienna',
+    'Silver',
+    'SkyBlue',
+    'SlateBlue',
+    'SlateGray',
+    'Snow',
+    'SpringGreen',
+    'SteelBlue',
+    'Tan',
+    'Teal',
+    'Thistle',
+    'Tomato',
+    'Turquoise',
+    'Violet',
+    'Wheat',
+    'WhiteSmoke',
+    'White',
+    'YellowGreen',
+    'Yellow',
+)
+
+keywords = (
+    'input', '_Digits', '_Point', '_LastError', '_Period', '_RandomSeed',
+    '_StopFlag', '_Symbol', '_UninitReason', 'Ask', 'Bars', 'Bid',
+    'Close', 'Digits', 'High', 'Low', 'Open', 'Point', 'Time',
+    'Volume',
+)
+c_types = (
+    'void', 'char', 'uchar', 'bool', 'short', 'ushort', 'int', 'uint',
+    'color', 'long', 'ulong', 'datetime', 'float', 'double',
+    'string',
+)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/theorem.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/theorem.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/theorem.py	(revision 1126)
@@ -0,0 +1,458 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.theorem
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for theorem-proving languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic
+
+__all__ = ['CoqLexer', 'IsabelleLexer', 'LeanLexer']
+
+
+class CoqLexer(RegexLexer):
+    """
+    For the `Coq <http://coq.inria.fr/>`_ theorem prover.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Coq'
+    aliases = ['coq']
+    filenames = ['*.v']
+    mimetypes = ['text/x-coq']
+
+    keywords1 = (
+        # Vernacular commands
+        'Section', 'Module', 'End', 'Require', 'Import', 'Export', 'Variable',
+        'Variables', 'Parameter', 'Parameters', 'Axiom', 'Hypothesis',
+        'Hypotheses', 'Notation', 'Local', 'Tactic', 'Reserved', 'Scope',
+        'Open', 'Close', 'Bind', 'Delimit', 'Definition', 'Let', 'Ltac',
+        'Fixpoint', 'CoFixpoint', 'Morphism', 'Relation', 'Implicit',
+        'Arguments', 'Set', 'Unset', 'Contextual', 'Strict', 'Prenex',
+        'Implicits', 'Inductive', 'CoInductive', 'Record', 'Structure',
+        'Canonical', 'Coercion', 'Theorem', 'Lemma', 'Corollary',
+        'Proposition', 'Fact', 'Remark', 'Example', 'Proof', 'Goal', 'Save',
+        'Qed', 'Defined', 'Hint', 'Resolve', 'Rewrite', 'View', 'Search',
+        'Show', 'Print', 'Printing', 'All', 'Graph', 'Projections', 'inside',
+        'outside', 'Check', 'Global', 'Instance', 'Class', 'Existing',
+        'Universe', 'Polymorphic', 'Monomorphic', 'Context'
+    )
+    keywords2 = (
+        # Gallina
+        'forall', 'exists', 'exists2', 'fun', 'fix', 'cofix', 'struct',
+        'match', 'end',  'in', 'return', 'let', 'if', 'is', 'then', 'else',
+        'for', 'of', 'nosimpl', 'with', 'as',
+    )
+    keywords3 = (
+        # Sorts
+        'Type', 'Prop',
+    )
+    keywords4 = (
+        # Tactics
+        'pose', 'set', 'move', 'case', 'elim', 'apply', 'clear', 'hnf', 'intro',
+        'intros', 'generalize', 'rename', 'pattern', 'after', 'destruct',
+        'induction', 'using', 'refine', 'inversion', 'injection', 'rewrite',
+        'congr', 'unlock', 'compute', 'ring', 'field', 'replace', 'fold',
+        'unfold', 'change', 'cutrewrite', 'simpl', 'have', 'suff', 'wlog',
+        'suffices', 'without', 'loss', 'nat_norm', 'assert', 'cut', 'trivial',
+        'revert', 'bool_congr', 'nat_congr', 'symmetry', 'transitivity', 'auto',
+        'split', 'left', 'right', 'autorewrite', 'tauto', 'setoid_rewrite',
+        'intuition', 'eauto', 'eapply', 'econstructor', 'etransitivity',
+        'constructor', 'erewrite', 'red', 'cbv', 'lazy', 'vm_compute',
+        'native_compute', 'subst',
+    )
+    keywords5 = (
+        # Terminators
+        'by', 'done', 'exact', 'reflexivity', 'tauto', 'romega', 'omega',
+        'assumption', 'solve', 'contradiction', 'discriminate',
+        'congruence',
+    )
+    keywords6 = (
+        # Control
+        'do', 'last', 'first', 'try', 'idtac', 'repeat',
+    )
+    # 'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done',
+    # 'downto', 'else', 'end', 'exception', 'external', 'false',
+    # 'for', 'fun', 'function', 'functor', 'if', 'in', 'include',
+    # 'inherit', 'initializer', 'lazy', 'let', 'match', 'method',
+    # 'module', 'mutable', 'new', 'object', 'of', 'open', 'private',
+    # 'raise', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
+    # 'type', 'val', 'virtual', 'when', 'while', 'with'
+    keyopts = (
+        '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-', r'-\.',
+        '->', r'\.', r'\.\.', ':', '::', ':=', ':>', ';', ';;', '<', '<-',
+        '<->', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
+        r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|]', r'\}', '~', '=>',
+        r'/\\', r'\\/', r'\{\|', r'\|\}',
+        u'Π', u'λ',
+    )
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = ('unit', 'nat', 'bool', 'string', 'ascii', 'list')
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\(\*', Comment, 'comment'),
+            (words(keywords1, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (words(keywords2, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keywords3, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            (words(keywords4, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keywords5, prefix=r'\b', suffix=r'\b'), Keyword.Pseudo),
+            (words(keywords6, prefix=r'\b', suffix=r'\b'), Keyword.Reserved),
+            # (r'\b([A-Z][\w\']*)(\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name),
+            (r'(%s)' % '|'.join(keyopts[::-1]), Operator),
+            (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator),
+            (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'\d[\d_]*', Number.Integer),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name),
+        ],
+        'comment': [
+            (r'[^(*)]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'string': [
+            (r'[^"]+', String.Double),
+            (r'""', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z][a-z0-9_\']*', Name, '#pop'),
+            default('#pop')
+        ],
+    }
+
+    def analyse_text(text):
+        if text.startswith('(*'):
+            return True
+
+
+class IsabelleLexer(RegexLexer):
+    """
+    For the `Isabelle <http://isabelle.in.tum.de/>`_ proof assistant.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Isabelle'
+    aliases = ['isabelle']
+    filenames = ['*.thy']
+    mimetypes = ['text/x-isabelle']
+
+    keyword_minor = (
+        'and', 'assumes', 'attach', 'avoids', 'binder', 'checking',
+        'class_instance', 'class_relation', 'code_module', 'congs',
+        'constant', 'constrains', 'datatypes', 'defines', 'file', 'fixes',
+        'for', 'functions', 'hints', 'identifier', 'if', 'imports', 'in',
+        'includes', 'infix', 'infixl', 'infixr', 'is', 'keywords', 'lazy',
+        'module_name', 'monos', 'morphisms', 'no_discs_sels', 'notes',
+        'obtains', 'open', 'output', 'overloaded', 'parametric', 'permissive',
+        'pervasive', 'rep_compat', 'shows', 'structure', 'type_class',
+        'type_constructor', 'unchecked', 'unsafe', 'where',
+    )
+
+    keyword_diag = (
+        'ML_command', 'ML_val', 'class_deps', 'code_deps', 'code_thms',
+        'display_drafts', 'find_consts', 'find_theorems', 'find_unused_assms',
+        'full_prf', 'help', 'locale_deps', 'nitpick', 'pr', 'prf',
+        'print_abbrevs', 'print_antiquotations', 'print_attributes',
+        'print_binds', 'print_bnfs', 'print_bundles',
+        'print_case_translations', 'print_cases', 'print_claset',
+        'print_classes', 'print_codeproc', 'print_codesetup',
+        'print_coercions', 'print_commands', 'print_context',
+        'print_defn_rules', 'print_dependencies', 'print_facts',
+        'print_induct_rules', 'print_inductives', 'print_interps',
+        'print_locale', 'print_locales', 'print_methods', 'print_options',
+        'print_orders', 'print_quot_maps', 'print_quotconsts',
+        'print_quotients', 'print_quotientsQ3', 'print_quotmapsQ3',
+        'print_rules', 'print_simpset', 'print_state', 'print_statement',
+        'print_syntax', 'print_theorems', 'print_theory', 'print_trans_rules',
+        'prop', 'pwd', 'quickcheck', 'refute', 'sledgehammer', 'smt_status',
+        'solve_direct', 'spark_status', 'term', 'thm', 'thm_deps', 'thy_deps',
+        'try', 'try0', 'typ', 'unused_thms', 'value', 'values', 'welcome',
+        'print_ML_antiquotations', 'print_term_bindings', 'values_prolog',
+    )
+
+    keyword_thy = ('theory', 'begin', 'end')
+
+    keyword_section = ('header', 'chapter')
+
+    keyword_subsection = (
+        'section', 'subsection', 'subsubsection', 'sect', 'subsect',
+        'subsubsect',
+    )
+
+    keyword_theory_decl = (
+        'ML', 'ML_file', 'abbreviation', 'adhoc_overloading', 'arities',
+        'atom_decl', 'attribute_setup', 'axiomatization', 'bundle',
+        'case_of_simps', 'class', 'classes', 'classrel', 'codatatype',
+        'code_abort', 'code_class', 'code_const', 'code_datatype',
+        'code_identifier', 'code_include', 'code_instance', 'code_modulename',
+        'code_monad', 'code_printing', 'code_reflect', 'code_reserved',
+        'code_type', 'coinductive', 'coinductive_set', 'consts', 'context',
+        'datatype', 'datatype_new', 'datatype_new_compat', 'declaration',
+        'declare', 'default_sort', 'defer_recdef', 'definition', 'defs',
+        'domain', 'domain_isomorphism', 'domaindef', 'equivariance',
+        'export_code', 'extract', 'extract_type', 'fixrec', 'fun',
+        'fun_cases', 'hide_class', 'hide_const', 'hide_fact', 'hide_type',
+        'import_const_map', 'import_file', 'import_tptp', 'import_type_map',
+        'inductive', 'inductive_set', 'instantiation', 'judgment', 'lemmas',
+        'lifting_forget', 'lifting_update', 'local_setup', 'locale',
+        'method_setup', 'nitpick_params', 'no_adhoc_overloading',
+        'no_notation', 'no_syntax', 'no_translations', 'no_type_notation',
+        'nominal_datatype', 'nonterminal', 'notation', 'notepad', 'oracle',
+        'overloading', 'parse_ast_translation', 'parse_translation',
+        'partial_function', 'primcorec', 'primrec', 'primrec_new',
+        'print_ast_translation', 'print_translation', 'quickcheck_generator',
+        'quickcheck_params', 'realizability', 'realizers', 'recdef', 'record',
+        'refute_params', 'setup', 'setup_lifting', 'simproc_setup',
+        'simps_of_case', 'sledgehammer_params', 'spark_end', 'spark_open',
+        'spark_open_siv', 'spark_open_vcg', 'spark_proof_functions',
+        'spark_types', 'statespace', 'syntax', 'syntax_declaration', 'text',
+        'text_raw', 'theorems', 'translations', 'type_notation',
+        'type_synonym', 'typed_print_translation', 'typedecl', 'hoarestate',
+        'install_C_file', 'install_C_types', 'wpc_setup', 'c_defs', 'c_types',
+        'memsafe', 'SML_export', 'SML_file', 'SML_import', 'approximate',
+        'bnf_axiomatization', 'cartouche', 'datatype_compat',
+        'free_constructors', 'functor', 'nominal_function',
+        'nominal_termination', 'permanent_interpretation',
+        'binds', 'defining', 'smt2_status', 'term_cartouche',
+        'boogie_file', 'text_cartouche',
+    )
+
+    keyword_theory_script = ('inductive_cases', 'inductive_simps')
+
+    keyword_theory_goal = (
+        'ax_specification', 'bnf', 'code_pred', 'corollary', 'cpodef',
+        'crunch', 'crunch_ignore',
+        'enriched_type', 'function', 'instance', 'interpretation', 'lemma',
+        'lift_definition', 'nominal_inductive', 'nominal_inductive2',
+        'nominal_primrec', 'pcpodef', 'primcorecursive',
+        'quotient_definition', 'quotient_type', 'recdef_tc', 'rep_datatype',
+        'schematic_corollary', 'schematic_lemma', 'schematic_theorem',
+        'spark_vc', 'specification', 'subclass', 'sublocale', 'termination',
+        'theorem', 'typedef', 'wrap_free_constructors',
+    )
+
+    keyword_qed = ('by', 'done', 'qed')
+    keyword_abandon_proof = ('sorry', 'oops')
+
+    keyword_proof_goal = ('have', 'hence', 'interpret')
+
+    keyword_proof_block = ('next', 'proof')
+
+    keyword_proof_chain = (
+        'finally', 'from', 'then', 'ultimately', 'with',
+    )
+
+    keyword_proof_decl = (
+        'ML_prf', 'also', 'include', 'including', 'let', 'moreover', 'note',
+        'txt', 'txt_raw', 'unfolding', 'using', 'write',
+    )
+
+    keyword_proof_asm = ('assume', 'case', 'def', 'fix', 'presume')
+
+    keyword_proof_asm_goal = ('guess', 'obtain', 'show', 'thus')
+
+    keyword_proof_script = (
+        'apply', 'apply_end', 'apply_trace', 'back', 'defer', 'prefer',
+    )
+
+    operators = (
+        '::', ':', '(', ')', '[', ']', '_', '=', ',', '|',
+        '+', '-', '!', '?',
+    )
+
+    proof_operators = ('{', '}', '.', '..')
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'\(\*', Comment, 'comment'),
+            (r'\{\*', Comment, 'text'),
+
+            (words(operators), Operator),
+            (words(proof_operators), Operator.Word),
+
+            (words(keyword_minor, prefix=r'\b', suffix=r'\b'), Keyword.Pseudo),
+
+            (words(keyword_diag, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+
+            (words(keyword_thy, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_theory_decl, prefix=r'\b', suffix=r'\b'), Keyword),
+
+            (words(keyword_section, prefix=r'\b', suffix=r'\b'), Generic.Heading),
+            (words(keyword_subsection, prefix=r'\b', suffix=r'\b'), Generic.Subheading),
+
+            (words(keyword_theory_goal, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (words(keyword_theory_script, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+
+            (words(keyword_abandon_proof, prefix=r'\b', suffix=r'\b'), Generic.Error),
+
+            (words(keyword_qed, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_goal, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_block, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_decl, prefix=r'\b', suffix=r'\b'), Keyword),
+
+            (words(keyword_proof_chain, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_asm, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_asm_goal, prefix=r'\b', suffix=r'\b'), Keyword),
+
+            (words(keyword_proof_script, prefix=r'\b', suffix=r'\b'), Keyword.Pseudo),
+
+            (r'\\<\w*>', Text.Symbol),
+
+            (r"[^\W\d][.\w']*", Name),
+            (r"\?[^\W\d][.\w']*", Name),
+            (r"'[^\W\d][.\w']*", Name.Type),
+
+            (r'\d[\d_]*', Name),  # display numbers as name
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+
+            (r'"', String, 'string'),
+            (r'`', String.Other, 'fact'),
+        ],
+        'comment': [
+            (r'[^(*)]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'text': [
+            (r'[^*}]+', Comment),
+            (r'\*\}', Comment, '#pop'),
+            (r'\*', Comment),
+            (r'\}', Comment),
+        ],
+        'string': [
+            (r'[^"\\]+', String),
+            (r'\\<\w*>', String.Symbol),
+            (r'\\"', String),
+            (r'\\', String),
+            (r'"', String, '#pop'),
+        ],
+        'fact': [
+            (r'[^`\\]+', String.Other),
+            (r'\\<\w*>', String.Symbol),
+            (r'\\`', String.Other),
+            (r'\\', String.Other),
+            (r'`', String.Other, '#pop'),
+        ],
+    }
+
+
+class LeanLexer(RegexLexer):
+    """
+    For the `Lean <https://github.com/leanprover/lean>`_
+    theorem prover.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Lean'
+    aliases = ['lean']
+    filenames = ['*.lean']
+    mimetypes = ['text/x-lean']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    keywords1 = (
+        'import', 'abbreviation', 'opaque_hint', 'tactic_hint', 'definition',
+        'renaming', 'inline', 'hiding', 'exposing', 'parameter', 'parameters',
+        'conjecture', 'hypothesis', 'lemma', 'corollary', 'variable', 'variables',
+        'theorem', 'axiom', 'inductive', 'structure', 'universe', 'alias',
+        'help', 'options', 'precedence', 'postfix', 'prefix', 'calc_trans',
+        'calc_subst', 'calc_refl', 'infix', 'infixl', 'infixr', 'notation', 'eval',
+        'check', 'exit', 'coercion', 'end', 'private', 'using', 'namespace',
+        'including', 'instance', 'section', 'context', 'protected', 'expose',
+        'export', 'set_option', 'add_rewrite', 'extends', 'open', 'example',
+        'constant', 'constants', 'print', 'opaque', 'reducible', 'irreducible',
+    )
+
+    keywords2 = (
+        'forall', 'fun', 'Pi', 'obtain', 'from', 'have', 'show', 'assume',
+        'take', 'let', 'if', 'else', 'then', 'by', 'in', 'with', 'begin',
+        'proof', 'qed', 'calc', 'match',
+    )
+
+    keywords3 = (
+        # Sorts
+        'Type', 'Prop',
+    )
+
+    operators = (
+        u'!=', u'#', u'&', u'&&', u'*', u'+', u'-', u'/', u'@', u'!', u'`',
+        u'-.', u'->', u'.', u'..', u'...', u'::', u':>', u';', u';;', u'<',
+        u'<-', u'=', u'==', u'>', u'_', u'|', u'||', u'~', u'=>', u'<=', u'>=',
+        u'/\\', u'\\/', u'∀', u'Π', u'λ', u'↔', u'∧', u'∨', u'≠', u'≤', u'≥',
+        u'¬', u'⁻¹', u'⬝', u'▸', u'→', u'∃', u'ℕ', u'ℤ', u'≈', u'×', u'⌞',
+        u'⌟', u'≡', u'⟨', u'⟩',
+    )
+
+    punctuation = (u'(', u')', u':', u'{', u'}', u'[', u']', u'⦃', u'⦄',
+                   u':=', u',')
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'/-', Comment, 'comment'),
+            (r'--.*?$', Comment.Single),
+            (words(keywords1, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (words(keywords2, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keywords3, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            (words(operators), Name.Builtin.Pseudo),
+            (words(punctuation), Operator),
+            (u"[A-Za-z_\u03b1-\u03ba\u03bc-\u03fb\u1f00-\u1ffe\u2100-\u214f]"
+             u"[A-Za-z_'\u03b1-\u03ba\u03bc-\u03fb\u1f00-\u1ffe\u2070-\u2079"
+             u"\u207f-\u2089\u2090-\u209c\u2100-\u214f0-9]*", Name),
+            (r'\d+', Number.Integer),
+            (r'"', String.Double, 'string'),
+            (r'[~?][a-z][\w\']*:', Name.Variable)
+        ],
+        'comment': [
+            # Multiline Comments
+            (r'[^/-]', Comment.Multiline),
+            (r'/-', Comment.Multiline, '#push'),
+            (r'-/', Comment.Multiline, '#pop'),
+            (r'[/-]', Comment.Multiline)
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            (r'\\[n"\\]', String.Escape),
+            ('"', String.Double, '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/julia.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/julia.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/julia.py	(revision 1126)
@@ -0,0 +1,333 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.julia
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Julia language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, \
+    words, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic
+from pygments.util import shebang_matches, unirange
+
+__all__ = ['JuliaLexer', 'JuliaConsoleLexer']
+
+allowed_variable = (
+    u'(?:[a-zA-Z_\u00A1-\uffff]|%s)(?:[a-zA-Z_0-9\u00A1-\uffff]|%s)*!*' %
+    ((unirange(0x10000, 0x10ffff),) * 2))
+
+
+class JuliaLexer(RegexLexer):
+    """
+    For `Julia <http://julialang.org/>`_ source code.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Julia'
+    aliases = ['julia', 'jl']
+    filenames = ['*.jl']
+    mimetypes = ['text/x-julia', 'application/x-julia']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'#=', Comment.Multiline, "blockcomment"),
+            (r'#.*$', Comment),
+            (r'[\[\]{}(),;]', Punctuation),
+
+            # keywords
+            (r'in\b', Keyword.Pseudo),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(local|global|const)\b', Keyword.Declaration),
+            (words([
+                'function', 'type', 'typealias', 'abstract', 'immutable',
+                'baremodule', 'begin', 'bitstype', 'break', 'catch', 'ccall',
+                'continue', 'do', 'else', 'elseif', 'end', 'export', 'finally',
+                'for', 'if', 'import', 'importall', 'let', 'macro', 'module',
+                'quote', 'return', 'try', 'using', 'while'],
+                suffix=r'\b'), Keyword),
+
+            # NOTE
+            # Patterns below work only for definition sites and thus hardly reliable.
+            #
+            # functions
+            # (r'(function)(\s+)(' + allowed_variable + ')',
+            #  bygroups(Keyword, Text, Name.Function)),
+            #
+            # types
+            # (r'(type|typealias|abstract|immutable)(\s+)(' + allowed_variable + ')',
+            #  bygroups(Keyword, Text, Name.Class)),
+
+            # type names
+            (words([
+                'ANY', 'ASCIIString', 'AbstractArray', 'AbstractChannel',
+                'AbstractFloat', 'AbstractMatrix', 'AbstractRNG',
+                'AbstractSparseArray', 'AbstractSparseMatrix',
+                'AbstractSparseVector', 'AbstractString', 'AbstractVecOrMat',
+                'AbstractVector', 'Any', 'ArgumentError', 'Array',
+                'AssertionError', 'Associative', 'Base64DecodePipe',
+                'Base64EncodePipe', 'Bidiagonal', 'BigFloat', 'BigInt',
+                'BitArray', 'BitMatrix', 'BitVector', 'Bool', 'BoundsError',
+                'Box', 'BufferStream', 'CapturedException', 'CartesianIndex',
+                'CartesianRange', 'Cchar', 'Cdouble', 'Cfloat', 'Channel',
+                'Char', 'Cint', 'Cintmax_t', 'Clong', 'Clonglong',
+                'ClusterManager', 'Cmd', 'Coff_t', 'Colon', 'Complex',
+                'Complex128', 'Complex32', 'Complex64', 'CompositeException',
+                'Condition', 'Cptrdiff_t', 'Cshort', 'Csize_t', 'Cssize_t',
+                'Cstring', 'Cuchar', 'Cuint', 'Cuintmax_t', 'Culong',
+                'Culonglong', 'Cushort', 'Cwchar_t', 'Cwstring', 'DataType',
+                'Date', 'DateTime', 'DenseArray', 'DenseMatrix',
+                'DenseVecOrMat', 'DenseVector', 'Diagonal', 'Dict',
+                'DimensionMismatch', 'Dims', 'DirectIndexString', 'Display',
+                'DivideError', 'DomainError', 'EOFError', 'EachLine', 'Enum',
+                'Enumerate', 'ErrorException', 'Exception', 'Expr',
+                'Factorization', 'FileMonitor', 'FileOffset', 'Filter',
+                'Float16', 'Float32', 'Float64', 'FloatRange', 'Function',
+                'GenSym', 'GlobalRef', 'GotoNode', 'HTML', 'Hermitian', 'IO',
+                'IOBuffer', 'IOStream', 'IPv4', 'IPv6', 'InexactError',
+                'InitError', 'Int', 'Int128', 'Int16', 'Int32', 'Int64', 'Int8',
+                'IntSet', 'Integer', 'InterruptException', 'IntrinsicFunction',
+                'InvalidStateException', 'Irrational', 'KeyError', 'LabelNode',
+                'LambdaStaticData', 'LinSpace', 'LineNumberNode', 'LoadError',
+                'LocalProcess', 'LowerTriangular', 'MIME', 'Matrix',
+                'MersenneTwister', 'Method', 'MethodError', 'MethodTable',
+                'Module', 'NTuple', 'NewvarNode', 'NullException', 'Nullable',
+                'Number', 'ObjectIdDict', 'OrdinalRange', 'OutOfMemoryError',
+                'OverflowError', 'Pair', 'ParseError', 'PartialQuickSort',
+                'Pipe', 'PollingFileWatcher', 'ProcessExitedException',
+                'ProcessGroup', 'Ptr', 'QuoteNode', 'RandomDevice', 'Range',
+                'Rational', 'RawFD', 'ReadOnlyMemoryError', 'Real',
+                'ReentrantLock', 'Ref', 'Regex', 'RegexMatch',
+                'RemoteException', 'RemoteRef', 'RepString', 'RevString',
+                'RopeString', 'RoundingMode', 'SegmentationFault',
+                'SerializationState', 'Set', 'SharedArray', 'SharedMatrix',
+                'SharedVector', 'Signed', 'SimpleVector', 'SparseMatrixCSC',
+                'StackOverflowError', 'StatStruct', 'StepRange', 'StridedArray',
+                'StridedMatrix', 'StridedVecOrMat', 'StridedVector', 'SubArray',
+                'SubString', 'SymTridiagonal', 'Symbol', 'SymbolNode',
+                'Symmetric', 'SystemError', 'TCPSocket', 'Task', 'Text',
+                'TextDisplay', 'Timer', 'TopNode', 'Tridiagonal', 'Tuple',
+                'Type', 'TypeConstructor', 'TypeError', 'TypeName', 'TypeVar',
+                'UDPSocket', 'UInt', 'UInt128', 'UInt16', 'UInt32', 'UInt64',
+                'UInt8', 'UTF16String', 'UTF32String', 'UTF8String',
+                'UndefRefError', 'UndefVarError', 'UnicodeError', 'UniformScaling',
+                'Union', 'UnitRange', 'Unsigned', 'UpperTriangular', 'Val',
+                'Vararg', 'VecOrMat', 'Vector', 'VersionNumber', 'Void', 'WString',
+                'WeakKeyDict', 'WeakRef', 'WorkerConfig', 'Zip'], suffix=r'\b'),
+                Keyword.Type),
+
+            # builtins
+            (words([
+                u'ARGS', u'CPU_CORES', u'C_NULL', u'DevNull', u'ENDIAN_BOM',
+                u'ENV', u'I', u'Inf', u'Inf16', u'Inf32', u'Inf64',
+                u'InsertionSort', u'JULIA_HOME', u'LOAD_PATH', u'MergeSort',
+                u'NaN', u'NaN16', u'NaN32', u'NaN64', u'OS_NAME',
+                u'QuickSort', u'RoundDown', u'RoundFromZero', u'RoundNearest',
+                u'RoundNearestTiesAway', u'RoundNearestTiesUp',
+                u'RoundToZero', u'RoundUp', u'STDERR', u'STDIN', u'STDOUT',
+                u'VERSION', u'WORD_SIZE', u'catalan', u'e', u'eu',
+                u'eulergamma', u'golden', u'im', u'nothing', u'pi', u'γ',
+                u'π', u'φ'],
+                suffix=r'\b'), Name.Builtin),
+
+            # operators
+            # see: https://github.com/JuliaLang/julia/blob/master/src/julia-parser.scm
+            (words([
+                # prec-assignment
+                u'=', u':=', u'+=', u'-=', u'*=', u'/=', u'//=', u'.//=', u'.*=', u'./=',
+                u'\=', u'.\=', u'^=', u'.^=', u'÷=', u'.÷=', u'%=', u'.%=', u'|=', u'&=',
+                u'$=', u'=>', u'<<=', u'>>=', u'>>>=', u'~', u'.+=', u'.-=',
+                # prec-conditional
+                u'?',
+                # prec-arrow
+                u'--', u'-->',
+                # prec-lazy-or
+                u'||',
+                # prec-lazy-and
+                u'&&',
+                # prec-comparison
+                u'>', u'<', u'>=', u'≥', u'<=', u'≤', u'==', u'===', u'≡', u'!=', u'≠',
+                u'!==', u'≢', u'.>', u'.<', u'.>=', u'.≥', u'.<=', u'.≤', u'.==', u'.!=',
+                u'.≠', u'.=', u'.!', u'<:', u'>:', u'∈', u'∉', u'∋', u'∌', u'⊆',
+                u'⊈', u'⊂',
+                u'⊄', u'⊊',
+                # prec-pipe
+                u'|>', u'<|',
+                # prec-colon
+                u':',
+                # prec-plus
+                u'+', u'-', u'.+', u'.-', u'|', u'∪', u'$',
+                # prec-bitshift
+                u'<<', u'>>', u'>>>', u'.<<', u'.>>', u'.>>>',
+                # prec-times
+                u'*', u'/', u'./', u'÷', u'.÷', u'%', u'⋅', u'.%', u'.*', u'\\', u'.\\', u'&', u'∩',
+                # prec-rational
+                u'//', u'.//',
+                # prec-power
+                u'^', u'.^',
+                # prec-decl
+                u'::',
+                # prec-dot
+                u'.',
+                # unary op
+                u'+', u'-', u'!', u'~', u'√', u'∛', u'∜'
+            ]), Operator),
+
+            # chars
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|"
+             r"\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'", String.Char),
+
+            # try to match trailing transpose
+            (r'(?<=[.\w)\]])\'+', Operator),
+
+            # strings
+            (r'"""', String, 'tqstring'),
+            (r'"', String, 'string'),
+
+            # regular expressions
+            (r'r"""', String.Regex, 'tqregex'),
+            (r'r"', String.Regex, 'regex'),
+
+            # backticks
+            (r'`', String.Backtick, 'command'),
+
+            # names
+            (allowed_variable, Name),
+            (r'@' + allowed_variable, Name.Decorator),
+
+            # numbers
+            (r'(\d+(_\d+)+\.\d*|\d*\.\d+(_\d+)+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+(_\d+)+[eEf][+-]?[0-9]+', Number.Float),
+            (r'\d+[eEf][+-]?[0-9]+', Number.Float),
+            (r'0b[01]+(_[01]+)+', Number.Bin),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+(_[0-7]+)+', Number.Oct),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[a-fA-F0-9]+(_[a-fA-F0-9]+)+', Number.Hex),
+            (r'0x[a-fA-F0-9]+', Number.Hex),
+            (r'\d+(_\d+)+', Number.Integer),
+            (r'\d+', Number.Integer)
+        ],
+
+        "blockcomment": [
+            (r'[^=#]', Comment.Multiline),
+            (r'#=', Comment.Multiline, '#push'),
+            (r'=#', Comment.Multiline, '#pop'),
+            (r'[=#]', Comment.Multiline),
+        ],
+
+        'string': [
+            (r'"', String, '#pop'),
+            # FIXME: This escape pattern is not perfect.
+            (r'\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)', String.Escape),
+            # Interpolation is defined as "$" followed by the shortest full
+            # expression, which is something we can't parse.
+            # Include the most common cases here: $word, and $(paren'd expr).
+            (r'\$' + allowed_variable, String.Interpol),
+            # (r'\$[a-zA-Z_]+', String.Interpol),
+            (r'(\$)(\()', bygroups(String.Interpol, Punctuation), 'in-intp'),
+            # @printf and @sprintf formats
+            (r'%[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]',
+             String.Interpol),
+            (r'.|\s', String),
+        ],
+
+        'tqstring': [
+            (r'"""', String, '#pop'),
+            (r'\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)', String.Escape),
+            (r'\$' + allowed_variable, String.Interpol),
+            (r'(\$)(\()', bygroups(String.Interpol, Punctuation), 'in-intp'),
+            (r'.|\s', String),
+        ],
+
+        'regex': [
+            (r'"', String.Regex, '#pop'),
+            (r'\\"', String.Regex),
+            (r'.|\s', String.Regex),
+        ],
+
+        'tqregex': [
+            (r'"""', String.Regex, '#pop'),
+            (r'.|\s', String.Regex),
+        ],
+
+        'command': [
+            (r'`', String.Backtick, '#pop'),
+            (r'\$' + allowed_variable, String.Interpol),
+            (r'(\$)(\()', bygroups(String.Interpol, Punctuation), 'in-intp'),
+            (r'.|\s', String.Backtick)
+        ],
+
+        'in-intp': [
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ]
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'julia')
+
+
+class JuliaConsoleLexer(Lexer):
+    """
+    For Julia console sessions. Modeled after MatlabSessionLexer.
+
+    .. versionadded:: 1.6
+    """
+    name = 'Julia console'
+    aliases = ['jlcon']
+
+    def get_tokens_unprocessed(self, text):
+        jllexer = JuliaLexer(**self.options)
+        start = 0
+        curcode = ''
+        insertions = []
+        output = False
+        error = False
+
+        for line in text.splitlines(True):
+            if line.startswith('julia>'):
+                insertions.append((len(curcode), [(0, Generic.Prompt, line[:6])]))
+                curcode += line[6:]
+                output = False
+                error = False
+            elif line.startswith('help?>') or line.startswith('shell>'):
+                yield start, Generic.Prompt, line[:6]
+                yield start + 6, Text, line[6:]
+                output = False
+                error = False
+            elif line.startswith('      ') and not output:
+                insertions.append((len(curcode), [(0, Text, line[:6])]))
+                curcode += line[6:]
+            else:
+                if curcode:
+                    for item in do_insertions(
+                            insertions, jllexer.get_tokens_unprocessed(curcode)):
+                        yield item
+                    curcode = ''
+                    insertions = []
+                if line.startswith('ERROR: ') or error:
+                    yield start, Generic.Error, line
+                    error = True
+                else:
+                    yield start, Generic.Output, line
+                output = True
+            start += len(line)
+
+        if curcode:
+            for item in do_insertions(
+                    insertions, jllexer.get_tokens_unprocessed(curcode)):
+                yield item
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/int_fiction.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/int_fiction.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/int_fiction.py	(revision 1126)
@@ -0,0 +1,1343 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.int_fiction
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for interactive fiction languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, \
+    this, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Generic
+
+__all__ = ['Inform6Lexer', 'Inform6TemplateLexer', 'Inform7Lexer',
+           'Tads3Lexer']
+
+
+class Inform6Lexer(RegexLexer):
+    """
+    For `Inform 6 <http://inform-fiction.org/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Inform 6'
+    aliases = ['inform6', 'i6']
+    filenames = ['*.inf']
+
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    _name = r'[a-zA-Z_]\w*'
+
+    # Inform 7 maps these four character classes to their ASCII
+    # equivalents. To support Inform 6 inclusions within Inform 7,
+    # Inform6Lexer maps them too.
+    _dash = u'\\-\u2010-\u2014'
+    _dquote = u'"\u201c\u201d'
+    _squote = u"'\u2018\u2019"
+    _newline = u'\\n\u0085\u2028\u2029'
+
+    tokens = {
+        'root': [
+            (r'\A(!%%[^%s]*[%s])+' % (_newline, _newline), Comment.Preproc,
+             'directive'),
+            default('directive')
+        ],
+        '_whitespace': [
+            (r'\s+', Text),
+            (r'![^%s]*' % _newline, Comment.Single)
+        ],
+        'default': [
+            include('_whitespace'),
+            (r'\[', Punctuation, 'many-values'),  # Array initialization
+            (r':|(?=;)', Punctuation, '#pop'),
+            (r'<', Punctuation),  # Second angle bracket in an action statement
+            default(('expression', '_expression'))
+        ],
+
+        # Expressions
+        '_expression': [
+            include('_whitespace'),
+            (r'(?=sp\b)', Text, '#pop'),
+            (r'(?=[%s%s$0-9#a-zA-Z_])' % (_dquote, _squote), Text,
+             ('#pop', 'value')),
+            (r'\+\+|[%s]{1,2}(?!>)|~~?' % _dash, Operator),
+            (r'(?=[()\[%s,?@{:;])' % _dash, Text, '#pop')
+        ],
+        'expression': [
+            include('_whitespace'),
+            (r'\(', Punctuation, ('expression', '_expression')),
+            (r'\)', Punctuation, '#pop'),
+            (r'\[', Punctuation, ('#pop', 'statements', 'locals')),
+            (r'>(?=(\s+|(![^%s]*))*[>;])' % _newline, Punctuation),
+            (r'\+\+|[%s]{2}(?!>)' % _dash, Operator),
+            (r',', Punctuation, '_expression'),
+            (r'&&?|\|\|?|[=~><]?=|[%s]{1,2}>?|\.\.?[&#]?|::|[<>+*/%%]' % _dash,
+             Operator, '_expression'),
+            (r'(has|hasnt|in|notin|ofclass|or|provides)\b', Operator.Word,
+             '_expression'),
+            (r'sp\b', Name),
+            (r'\?~?', Name.Label, 'label?'),
+            (r'[@{]', Error),
+            default('#pop')
+        ],
+        '_assembly-expression': [
+            (r'\(', Punctuation, ('#push', '_expression')),
+            (r'[\[\]]', Punctuation),
+            (r'[%s]>' % _dash, Punctuation, '_expression'),
+            (r'sp\b', Keyword.Pseudo),
+            (r';', Punctuation, '#pop:3'),
+            include('expression')
+        ],
+        '_for-expression': [
+            (r'\)', Punctuation, '#pop:2'),
+            (r':', Punctuation, '#pop'),
+            include('expression')
+        ],
+        '_keyword-expression': [
+            (r'(from|near|to)\b', Keyword, '_expression'),
+            include('expression')
+        ],
+        '_list-expression': [
+            (r',', Punctuation, '#pop'),
+            include('expression')
+        ],
+        '_object-expression': [
+            (r'has\b', Keyword.Declaration, '#pop'),
+            include('_list-expression')
+        ],
+
+        # Values
+        'value': [
+            include('_whitespace'),
+            # Strings
+            (r'[%s][^@][%s]' % (_squote, _squote), String.Char, '#pop'),
+            (r'([%s])(@\{[0-9a-fA-F]{1,4}\})([%s])' % (_squote, _squote),
+             bygroups(String.Char, String.Escape, String.Char), '#pop'),
+            (r'([%s])(@.{2})([%s])' % (_squote, _squote),
+             bygroups(String.Char, String.Escape, String.Char), '#pop'),
+            (r'[%s]' % _squote, String.Single, ('#pop', 'dictionary-word')),
+            (r'[%s]' % _dquote, String.Double, ('#pop', 'string')),
+            # Numbers
+            (r'\$[+%s][0-9]*\.?[0-9]*([eE][+%s]?[0-9]+)?' % (_dash, _dash),
+             Number.Float, '#pop'),
+            (r'\$[0-9a-fA-F]+', Number.Hex, '#pop'),
+            (r'\$\$[01]+', Number.Bin, '#pop'),
+            (r'[0-9]+', Number.Integer, '#pop'),
+            # Values prefixed by hashes
+            (r'(##|#a\$)(%s)' % _name, bygroups(Operator, Name), '#pop'),
+            (r'(#g\$)(%s)' % _name,
+             bygroups(Operator, Name.Variable.Global), '#pop'),
+            (r'#[nw]\$', Operator, ('#pop', 'obsolete-dictionary-word')),
+            (r'(#r\$)(%s)' % _name, bygroups(Operator, Name.Function), '#pop'),
+            (r'#', Name.Builtin, ('#pop', 'system-constant')),
+            # System functions
+            (words((
+                'child', 'children', 'elder', 'eldest', 'glk', 'indirect', 'metaclass',
+                'parent', 'random', 'sibling', 'younger', 'youngest'), suffix=r'\b'),
+             Name.Builtin, '#pop'),
+            # Metaclasses
+            (r'(?i)(Class|Object|Routine|String)\b', Name.Builtin, '#pop'),
+            # Veneer routines
+            (words((
+                'Box__Routine', 'CA__Pr', 'CDefArt', 'CInDefArt', 'Cl__Ms',
+                'Copy__Primitive', 'CP__Tab', 'DA__Pr', 'DB__Pr', 'DefArt', 'Dynam__String',
+                'EnglishNumber', 'Glk__Wrap', 'IA__Pr', 'IB__Pr', 'InDefArt', 'Main__',
+                'Meta__class', 'OB__Move', 'OB__Remove', 'OC__Cl', 'OP__Pr', 'Print__Addr',
+                'Print__PName', 'PrintShortName', 'RA__Pr', 'RA__Sc', 'RL__Pr', 'R_Process',
+                'RT__ChG', 'RT__ChGt', 'RT__ChLDB', 'RT__ChLDW', 'RT__ChPR', 'RT__ChPrintA',
+                'RT__ChPrintC', 'RT__ChPrintO', 'RT__ChPrintS', 'RT__ChPS', 'RT__ChR',
+                'RT__ChSTB', 'RT__ChSTW', 'RT__ChT', 'RT__Err', 'RT__TrPS', 'RV__Pr',
+                'Symb__Tab', 'Unsigned__Compare', 'WV__Pr', 'Z__Region'),
+                prefix='(?i)', suffix=r'\b'),
+             Name.Builtin, '#pop'),
+            # Other built-in symbols
+            (words((
+                'call', 'copy', 'create', 'DEBUG', 'destroy', 'DICT_CHAR_SIZE',
+                'DICT_ENTRY_BYTES', 'DICT_IS_UNICODE', 'DICT_WORD_SIZE', 'false',
+                'FLOAT_INFINITY', 'FLOAT_NAN', 'FLOAT_NINFINITY', 'GOBJFIELD_CHAIN',
+                'GOBJFIELD_CHILD', 'GOBJFIELD_NAME', 'GOBJFIELD_PARENT',
+                'GOBJFIELD_PROPTAB', 'GOBJFIELD_SIBLING', 'GOBJ_EXT_START',
+                'GOBJ_TOTAL_LENGTH', 'Grammar__Version', 'INDIV_PROP_START', 'INFIX',
+                'infix__watching', 'MODULE_MODE', 'name', 'nothing', 'NUM_ATTR_BYTES', 'print',
+                'print_to_array', 'recreate', 'remaining', 'self', 'sender', 'STRICT_MODE',
+                'sw__var', 'sys__glob0', 'sys__glob1', 'sys__glob2', 'sys_statusline_flag',
+                'TARGET_GLULX', 'TARGET_ZCODE', 'temp__global2', 'temp__global3',
+                'temp__global4', 'temp_global', 'true', 'USE_MODULES', 'WORDSIZE'),
+                prefix='(?i)', suffix=r'\b'),
+             Name.Builtin, '#pop'),
+            # Other values
+            (_name, Name, '#pop')
+        ],
+        # Strings
+        'dictionary-word': [
+            (r'[~^]+', String.Escape),
+            (r'[^~^\\@({%s]+' % _squote, String.Single),
+            (r'[({]', String.Single),
+            (r'@\{[0-9a-fA-F]{,4}\}', String.Escape),
+            (r'@.{2}', String.Escape),
+            (r'[%s]' % _squote, String.Single, '#pop')
+        ],
+        'string': [
+            (r'[~^]+', String.Escape),
+            (r'[^~^\\@({%s]+' % _dquote, String.Double),
+            (r'[({]', String.Double),
+            (r'\\', String.Escape),
+            (r'@(\\\s*[%s]\s*)*@((\\\s*[%s]\s*)*[0-9])*' %
+             (_newline, _newline), String.Escape),
+            (r'@(\\\s*[%s]\s*)*\{((\\\s*[%s]\s*)*[0-9a-fA-F]){,4}'
+             r'(\\\s*[%s]\s*)*\}' % (_newline, _newline, _newline),
+             String.Escape),
+            (r'@(\\\s*[%s]\s*)*.(\\\s*[%s]\s*)*.' % (_newline, _newline),
+             String.Escape),
+            (r'[%s]' % _dquote, String.Double, '#pop')
+        ],
+        'plain-string': [
+            (r'[^~^\\({\[\]%s]+' % _dquote, String.Double),
+            (r'[~^({\[\]]', String.Double),
+            (r'\\', String.Escape),
+            (r'[%s]' % _dquote, String.Double, '#pop')
+        ],
+        # Names
+        '_constant': [
+            include('_whitespace'),
+            (_name, Name.Constant, '#pop'),
+            include('value')
+        ],
+        '_global': [
+            include('_whitespace'),
+            (_name, Name.Variable.Global, '#pop'),
+            include('value')
+        ],
+        'label?': [
+            include('_whitespace'),
+            (_name, Name.Label, '#pop'),
+            default('#pop')
+        ],
+        'variable?': [
+            include('_whitespace'),
+            (_name, Name.Variable, '#pop'),
+            default('#pop')
+        ],
+        # Values after hashes
+        'obsolete-dictionary-word': [
+            (r'\S\w*', String.Other, '#pop')
+        ],
+        'system-constant': [
+            include('_whitespace'),
+            (_name, Name.Builtin, '#pop')
+        ],
+
+        # Directives
+        'directive': [
+            include('_whitespace'),
+            (r'#', Punctuation),
+            (r';', Punctuation, '#pop'),
+            (r'\[', Punctuation,
+             ('default', 'statements', 'locals', 'routine-name?')),
+            (words((
+                'abbreviate', 'endif', 'dictionary', 'ifdef', 'iffalse', 'ifndef', 'ifnot',
+                'iftrue', 'ifv3', 'ifv5', 'release', 'serial', 'switches', 'system_file',
+                'version'), prefix='(?i)', suffix=r'\b'),
+             Keyword, 'default'),
+            (r'(?i)(array|global)\b', Keyword,
+             ('default', 'directive-keyword?', '_global')),
+            (r'(?i)attribute\b', Keyword, ('default', 'alias?', '_constant')),
+            (r'(?i)class\b', Keyword,
+             ('object-body', 'duplicates', 'class-name')),
+            (r'(?i)(constant|default)\b', Keyword,
+             ('default', 'expression', '_constant')),
+            (r'(?i)(end\b)(.*)', bygroups(Keyword, Text)),
+            (r'(?i)(extend|verb)\b', Keyword, 'grammar'),
+            (r'(?i)fake_action\b', Keyword, ('default', '_constant')),
+            (r'(?i)import\b', Keyword, 'manifest'),
+            (r'(?i)(include|link)\b', Keyword,
+             ('default', 'before-plain-string')),
+            (r'(?i)(lowstring|undef)\b', Keyword, ('default', '_constant')),
+            (r'(?i)message\b', Keyword, ('default', 'diagnostic')),
+            (r'(?i)(nearby|object)\b', Keyword,
+             ('object-body', '_object-head')),
+            (r'(?i)property\b', Keyword,
+             ('default', 'alias?', '_constant', 'property-keyword*')),
+            (r'(?i)replace\b', Keyword,
+             ('default', 'routine-name?', 'routine-name?')),
+            (r'(?i)statusline\b', Keyword, ('default', 'directive-keyword?')),
+            (r'(?i)stub\b', Keyword, ('default', 'routine-name?')),
+            (r'(?i)trace\b', Keyword,
+             ('default', 'trace-keyword?', 'trace-keyword?')),
+            (r'(?i)zcharacter\b', Keyword,
+             ('default', 'directive-keyword?', 'directive-keyword?')),
+            (_name, Name.Class, ('object-body', '_object-head'))
+        ],
+        # [, Replace, Stub
+        'routine-name?': [
+            include('_whitespace'),
+            (_name, Name.Function, '#pop'),
+            default('#pop')
+        ],
+        'locals': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r'\*', Punctuation),
+            (r'"', String.Double, 'plain-string'),
+            (_name, Name.Variable)
+        ],
+        # Array
+        'many-values': [
+            include('_whitespace'),
+            (r';', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+            (r':', Error),
+            default(('expression', '_expression'))
+        ],
+        # Attribute, Property
+        'alias?': [
+            include('_whitespace'),
+            (r'alias\b', Keyword, ('#pop', '_constant')),
+            default('#pop')
+        ],
+        # Class, Object, Nearby
+        'class-name': [
+            include('_whitespace'),
+            (r'(?=[,;]|(class|has|private|with)\b)', Text, '#pop'),
+            (_name, Name.Class, '#pop')
+        ],
+        'duplicates': [
+            include('_whitespace'),
+            (r'\(', Punctuation, ('#pop', 'expression', '_expression')),
+            default('#pop')
+        ],
+        '_object-head': [
+            (r'[%s]>' % _dash, Punctuation),
+            (r'(class|has|private|with)\b', Keyword.Declaration, '#pop'),
+            include('_global')
+        ],
+        'object-body': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop:2'),
+            (r',', Punctuation),
+            (r'class\b', Keyword.Declaration, 'class-segment'),
+            (r'(has|private|with)\b', Keyword.Declaration),
+            (r':', Error),
+            default(('_object-expression', '_expression'))
+        ],
+        'class-segment': [
+            include('_whitespace'),
+            (r'(?=[,;]|(class|has|private|with)\b)', Text, '#pop'),
+            (_name, Name.Class),
+            default('value')
+        ],
+        # Extend, Verb
+        'grammar': [
+            include('_whitespace'),
+            (r'=', Punctuation, ('#pop', 'default')),
+            (r'\*', Punctuation, ('#pop', 'grammar-line')),
+            default('_directive-keyword')
+        ],
+        'grammar-line': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r'[/*]', Punctuation),
+            (r'[%s]>' % _dash, Punctuation, 'value'),
+            (r'(noun|scope)\b', Keyword, '=routine'),
+            default('_directive-keyword')
+        ],
+        '=routine': [
+            include('_whitespace'),
+            (r'=', Punctuation, 'routine-name?'),
+            default('#pop')
+        ],
+        # Import
+        'manifest': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'(?i)global\b', Keyword, '_global'),
+            default('_global')
+        ],
+        # Include, Link, Message
+        'diagnostic': [
+            include('_whitespace'),
+            (r'[%s]' % _dquote, String.Double, ('#pop', 'message-string')),
+            default(('#pop', 'before-plain-string', 'directive-keyword?'))
+        ],
+        'before-plain-string': [
+            include('_whitespace'),
+            (r'[%s]' % _dquote, String.Double, ('#pop', 'plain-string'))
+        ],
+        'message-string': [
+            (r'[~^]+', String.Escape),
+            include('plain-string')
+        ],
+
+        # Keywords used in directives
+        '_directive-keyword!': [
+            include('_whitespace'),
+            (words((
+                'additive', 'alias', 'buffer', 'class', 'creature', 'data', 'error', 'fatalerror',
+                'first', 'has', 'held', 'initial', 'initstr', 'last', 'long', 'meta', 'multi',
+                'multiexcept', 'multiheld', 'multiinside', 'noun', 'number', 'only', 'private',
+                'replace', 'reverse', 'scope', 'score', 'special', 'string', 'table', 'terminating',
+                'time', 'topic', 'warning', 'with'), suffix=r'\b'),
+             Keyword, '#pop'),
+            (r'[%s]{1,2}>|[+=]' % _dash, Punctuation, '#pop')
+        ],
+        '_directive-keyword': [
+            include('_directive-keyword!'),
+            include('value')
+        ],
+        'directive-keyword?': [
+            include('_directive-keyword!'),
+            default('#pop')
+        ],
+        'property-keyword*': [
+            include('_whitespace'),
+            (r'(additive|long)\b', Keyword),
+            default('#pop')
+        ],
+        'trace-keyword?': [
+            include('_whitespace'),
+            (words((
+                'assembly', 'dictionary', 'expressions', 'lines', 'linker',
+                'objects', 'off', 'on', 'symbols', 'tokens', 'verbs'), suffix=r'\b'),
+             Keyword, '#pop'),
+            default('#pop')
+        ],
+
+        # Statements
+        'statements': [
+            include('_whitespace'),
+            (r'\]', Punctuation, '#pop'),
+            (r'[;{}]', Punctuation),
+            (words((
+                'box', 'break', 'continue', 'default', 'give', 'inversion',
+                'new_line', 'quit', 'read', 'remove', 'return', 'rfalse', 'rtrue',
+                'spaces', 'string', 'until'), suffix=r'\b'),
+             Keyword, 'default'),
+            (r'(do|else)\b', Keyword),
+            (r'(font|style)\b', Keyword,
+             ('default', 'miscellaneous-keyword?')),
+            (r'for\b', Keyword, ('for', '(?')),
+            (r'(if|switch|while)', Keyword,
+             ('expression', '_expression', '(?')),
+            (r'(jump|save|restore)\b', Keyword, ('default', 'label?')),
+            (r'objectloop\b', Keyword,
+             ('_keyword-expression', 'variable?', '(?')),
+            (r'print(_ret)?\b|(?=[%s])' % _dquote, Keyword, 'print-list'),
+            (r'\.', Name.Label, 'label?'),
+            (r'@', Keyword, 'opcode'),
+            (r'#(?![agrnw]\$|#)', Punctuation, 'directive'),
+            (r'<', Punctuation, 'default'),
+            (r'move\b', Keyword,
+             ('default', '_keyword-expression', '_expression')),
+            default(('default', '_keyword-expression', '_expression'))
+        ],
+        'miscellaneous-keyword?': [
+            include('_whitespace'),
+            (r'(bold|fixed|from|near|off|on|reverse|roman|to|underline)\b',
+             Keyword, '#pop'),
+            (r'(a|A|an|address|char|name|number|object|property|string|the|'
+             r'The)\b(?=(\s+|(![^%s]*))*\))' % _newline, Keyword.Pseudo,
+             '#pop'),
+            (r'%s(?=(\s+|(![^%s]*))*\))' % (_name, _newline), Name.Function,
+             '#pop'),
+            default('#pop')
+        ],
+        '(?': [
+            include('_whitespace'),
+            (r'\(', Punctuation, '#pop'),
+            default('#pop')
+        ],
+        'for': [
+            include('_whitespace'),
+            (r';', Punctuation, ('_for-expression', '_expression')),
+            default(('_for-expression', '_expression'))
+        ],
+        'print-list': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r':', Error),
+            default(('_list-expression', '_expression', '_list-expression', 'form'))
+        ],
+        'form': [
+            include('_whitespace'),
+            (r'\(', Punctuation, ('#pop', 'miscellaneous-keyword?')),
+            default('#pop')
+        ],
+
+        # Assembly
+        'opcode': [
+            include('_whitespace'),
+            (r'[%s]' % _dquote, String.Double, ('operands', 'plain-string')),
+            (_name, Keyword, 'operands')
+        ],
+        'operands': [
+            (r':', Error),
+            default(('_assembly-expression', '_expression'))
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        # 'in' is either a keyword or an operator.
+        # If the token two tokens after 'in' is ')', 'in' is a keyword:
+        #   objectloop(a in b)
+        # Otherwise, it is an operator:
+        #   objectloop(a in b && true)
+        objectloop_queue = []
+        objectloop_token_count = -1
+        previous_token = None
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self,
+                                                                     text):
+            if previous_token is Name.Variable and value == 'in':
+                objectloop_queue = [[index, token, value]]
+                objectloop_token_count = 2
+            elif objectloop_token_count > 0:
+                if token not in Comment and token not in Text:
+                    objectloop_token_count -= 1
+                objectloop_queue.append((index, token, value))
+            else:
+                if objectloop_token_count == 0:
+                    if objectloop_queue[-1][2] == ')':
+                        objectloop_queue[0][1] = Keyword
+                    while objectloop_queue:
+                        yield objectloop_queue.pop(0)
+                    objectloop_token_count = -1
+                yield index, token, value
+            if token not in Comment and token not in Text:
+                previous_token = token
+        while objectloop_queue:
+            yield objectloop_queue.pop(0)
+
+
+class Inform7Lexer(RegexLexer):
+    """
+    For `Inform 7 <http://inform7.com/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Inform 7'
+    aliases = ['inform7', 'i7']
+    filenames = ['*.ni', '*.i7x']
+
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    _dash = Inform6Lexer._dash
+    _dquote = Inform6Lexer._dquote
+    _newline = Inform6Lexer._newline
+    _start = r'\A|(?<=[%s])' % _newline
+
+    # There are three variants of Inform 7, differing in how to
+    # interpret at signs and braces in I6T. In top-level inclusions, at
+    # signs in the first column are inweb syntax. In phrase definitions
+    # and use options, tokens in braces are treated as I7. Use options
+    # also interpret "{N}".
+    tokens = {}
+    token_variants = ['+i6t-not-inline', '+i6t-inline', '+i6t-use-option']
+
+    for level in token_variants:
+        tokens[level] = {
+            '+i6-root': list(Inform6Lexer.tokens['root']),
+            '+i6t-root': [  # For Inform6TemplateLexer
+                (r'[^%s]*' % Inform6Lexer._newline, Comment.Preproc,
+                 ('directive', '+p'))
+            ],
+            'root': [
+                (r'(\|?\s)+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'[%s]' % _dquote, Generic.Heading,
+                 ('+main', '+titling', '+titling-string')),
+                default(('+main', '+heading?'))
+            ],
+            '+titling-string': [
+                (r'[^%s]+' % _dquote, Generic.Heading),
+                (r'[%s]' % _dquote, Generic.Heading, '#pop')
+            ],
+            '+titling': [
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'[^%s.;:|%s]+' % (_dquote, _newline), Generic.Heading),
+                (r'[%s]' % _dquote, Generic.Heading, '+titling-string'),
+                (r'[%s]{2}|(?<=[\s%s])\|[\s%s]' % (_newline, _dquote, _dquote),
+                 Text, ('#pop', '+heading?')),
+                (r'[.;:]|(?<=[\s%s])\|' % _dquote, Text, '#pop'),
+                (r'[|%s]' % _newline, Generic.Heading)
+            ],
+            '+main': [
+                (r'(?i)[^%s:a\[(|%s]+' % (_dquote, _newline), Text),
+                (r'[%s]' % _dquote, String.Double, '+text'),
+                (r':', Text, '+phrase-definition'),
+                (r'(?i)\bas\b', Text, '+use-option'),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash),
+                 bygroups(Punctuation,
+                          using(this, state=('+i6-root', 'directive'),
+                                i6t='+i6t-not-inline'), Punctuation)),
+                (r'(%s|(?<=[\s;:.%s]))\|\s|[%s]{2,}' %
+                 (_start, _dquote, _newline), Text, '+heading?'),
+                (r'(?i)[a(|%s]' % _newline, Text)
+            ],
+            '+phrase-definition': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash),
+                 bygroups(Punctuation,
+                          using(this, state=('+i6-root', 'directive',
+                                             'default', 'statements'),
+                                i6t='+i6t-inline'), Punctuation), '#pop'),
+                default('#pop')
+            ],
+            '+use-option': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash),
+                 bygroups(Punctuation,
+                          using(this, state=('+i6-root', 'directive'),
+                                i6t='+i6t-use-option'), Punctuation), '#pop'),
+                default('#pop')
+            ],
+            '+comment': [
+                (r'[^\[\]]+', Comment.Multiline),
+                (r'\[', Comment.Multiline, '#push'),
+                (r'\]', Comment.Multiline, '#pop')
+            ],
+            '+text': [
+                (r'[^\[%s]+' % _dquote, String.Double),
+                (r'\[.*?\]', String.Interpol),
+                (r'[%s]' % _dquote, String.Double, '#pop')
+            ],
+            '+heading?': [
+                (r'(\|?\s)+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'[%s]{4}\s+' % _dash, Text, '+documentation-heading'),
+                (r'[%s]{1,3}' % _dash, Text),
+                (r'(?i)(volume|book|part|chapter|section)\b[^%s]*' % _newline,
+                 Generic.Heading, '#pop'),
+                default('#pop')
+            ],
+            '+documentation-heading': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'(?i)documentation\s+', Text, '+documentation-heading2'),
+                default('#pop')
+            ],
+            '+documentation-heading2': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'[%s]{4}\s' % _dash, Text, '+documentation'),
+                default('#pop:2')
+            ],
+            '+documentation': [
+                (r'(?i)(%s)\s*(chapter|example)\s*:[^%s]*' %
+                 (_start, _newline), Generic.Heading),
+                (r'(?i)(%s)\s*section\s*:[^%s]*' % (_start, _newline),
+                 Generic.Subheading),
+                (r'((%s)\t.*?[%s])+' % (_start, _newline),
+                 using(this, state='+main')),
+                (r'[^%s\[]+|[%s\[]' % (_newline, _newline), Text),
+                (r'\[', Comment.Multiline, '+comment'),
+            ],
+            '+i6t-not-inline': [
+                (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline),
+                 Comment.Preproc),
+                (r'(%s)@([%s]+|Purpose:)[^%s]*' % (_start, _dash, _newline),
+                 Comment.Preproc),
+                (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline),
+                 Generic.Heading, '+p')
+            ],
+            '+i6t-use-option': [
+                include('+i6t-not-inline'),
+                (r'(\{)(N)(\})', bygroups(Punctuation, Text, Punctuation))
+            ],
+            '+i6t-inline': [
+                (r'(\{)(\S[^}]*)?(\})',
+                 bygroups(Punctuation, using(this, state='+main'),
+                          Punctuation))
+            ],
+            '+i6t': [
+                (r'(\{[%s])(![^}]*)(\}?)' % _dash,
+                 bygroups(Punctuation, Comment.Single, Punctuation)),
+                (r'(\{[%s])(lines)(:)([^}]*)(\}?)' % _dash,
+                 bygroups(Punctuation, Keyword, Punctuation, Text,
+                          Punctuation), '+lines'),
+                (r'(\{[%s])([^:}]*)(:?)([^}]*)(\}?)' % _dash,
+                 bygroups(Punctuation, Keyword, Punctuation, Text,
+                          Punctuation)),
+                (r'(\(\+)(.*?)(\+\)|\Z)',
+                 bygroups(Punctuation, using(this, state='+main'),
+                          Punctuation))
+            ],
+            '+p': [
+                (r'[^@]+', Comment.Preproc),
+                (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline),
+                 Comment.Preproc, '#pop'),
+                (r'(%s)@([%s]|Purpose:)' % (_start, _dash), Comment.Preproc),
+                (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline),
+                 Generic.Heading),
+                (r'@', Comment.Preproc)
+            ],
+            '+lines': [
+                (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline),
+                 Comment.Preproc),
+                (r'(%s)@([%s]|Purpose:)[^%s]*' % (_start, _dash, _newline),
+                 Comment.Preproc),
+                (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline),
+                 Generic.Heading, '+p'),
+                (r'(%s)@\w*[ %s]' % (_start, _newline), Keyword),
+                (r'![^%s]*' % _newline, Comment.Single),
+                (r'(\{)([%s]endlines)(\})' % _dash,
+                 bygroups(Punctuation, Keyword, Punctuation), '#pop'),
+                (r'[^@!{]+?([%s]|\Z)|.' % _newline, Text)
+            ]
+        }
+        # Inform 7 can include snippets of Inform 6 template language,
+        # so all of Inform6Lexer's states are copied here, with
+        # modifications to account for template syntax. Inform7Lexer's
+        # own states begin with '+' to avoid name conflicts. Some of
+        # Inform6Lexer's states begin with '_': these are not modified.
+        # They deal with template syntax either by including modified
+        # states, or by matching r'' then pushing to modified states.
+        for token in Inform6Lexer.tokens:
+            if token == 'root':
+                continue
+            tokens[level][token] = list(Inform6Lexer.tokens[token])
+            if not token.startswith('_'):
+                tokens[level][token][:0] = [include('+i6t'), include(level)]
+
+    def __init__(self, **options):
+        level = options.get('i6t', '+i6t-not-inline')
+        if level not in self._all_tokens:
+            self._tokens = self.__class__.process_tokendef(level)
+        else:
+            self._tokens = self._all_tokens[level]
+        RegexLexer.__init__(self, **options)
+
+
+class Inform6TemplateLexer(Inform7Lexer):
+    """
+    For `Inform 6 template
+    <http://inform7.com/sources/src/i6template/Woven/index.html>`_ code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Inform 6 template'
+    aliases = ['i6t']
+    filenames = ['*.i6t']
+
+    def get_tokens_unprocessed(self, text, stack=('+i6t-root',)):
+        return Inform7Lexer.get_tokens_unprocessed(self, text, stack)
+
+
+class Tads3Lexer(RegexLexer):
+    """
+    For `TADS 3 <http://www.tads.org/>`_ source code.
+    """
+
+    name = 'TADS 3'
+    aliases = ['tads3']
+    filenames = ['*.t']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    _comment_single = r'(?://(?:[^\\\n]|\\+[\w\W])*$)'
+    _comment_multiline = r'(?:/\*(?:[^*]|\*(?!/))*\*/)'
+    _escape = (r'(?:\\(?:[\n\\<>"\'^v bnrt]|u[\da-fA-F]{,4}|x[\da-fA-F]{,2}|'
+               r'[0-3]?[0-7]{1,2}))')
+    _name = r'(?:[_a-zA-Z]\w*)'
+    _no_quote = r'(?=\s|\\?>)'
+    _operator = (r'(?:&&|\|\||\+\+|--|\?\?|::|[.,@\[\]~]|'
+                 r'(?:[=+\-*/%!&|^]|<<?|>>?>?)=?)')
+    _ws = r'(?:\\|\s|%s|%s)' % (_comment_single, _comment_multiline)
+    _ws_pp = r'(?:\\\n|[^\S\n]|%s|%s)' % (_comment_single, _comment_multiline)
+
+    def _make_string_state(triple, double, verbatim=None, _escape=_escape):
+        if verbatim:
+            verbatim = ''.join(['(?:%s|%s)' % (re.escape(c.lower()),
+                                               re.escape(c.upper()))
+                                for c in verbatim])
+        char = r'"' if double else r"'"
+        token = String.Double if double else String.Single
+        escaped_quotes = r'+|%s(?!%s{2})' % (char, char) if triple else r''
+        prefix = '%s%s' % ('t' if triple else '', 'd' if double else 's')
+        tag_state_name = '%sqt' % prefix
+        state = []
+        if triple:
+            state += [
+                (r'%s{3,}' % char, token, '#pop'),
+                (r'\\%s+' % char, String.Escape),
+                (char, token)
+            ]
+        else:
+            state.append((char, token, '#pop'))
+        state += [
+            include('s/verbatim'),
+            (r'[^\\<&{}%s]+' % char, token)
+        ]
+        if verbatim:
+            # This regex can't use `(?i)` because escape sequences are
+            # case-sensitive. `<\XMP>` works; `<\xmp>` doesn't.
+            state.append((r'\\?<(/|\\\\|(?!%s)\\)%s(?=[\s=>])' %
+                          (_escape, verbatim),
+                          Name.Tag, ('#pop', '%sqs' % prefix, tag_state_name)))
+        else:
+            state += [
+                (r'\\?<!([^><\\%s]|<(?!<)|\\%s%s|%s|\\.)*>?' %
+                 (char, char, escaped_quotes, _escape), Comment.Multiline),
+                (r'(?i)\\?<listing(?=[\s=>]|\\>)', Name.Tag,
+                 ('#pop', '%sqs/listing' % prefix, tag_state_name)),
+                (r'(?i)\\?<xmp(?=[\s=>]|\\>)', Name.Tag,
+                 ('#pop', '%sqs/xmp' % prefix, tag_state_name)),
+                (r'\\?<([^\s=><\\%s]|<(?!<)|\\%s%s|%s|\\.)*' %
+                 (char, char, escaped_quotes, _escape), Name.Tag,
+                 tag_state_name),
+                include('s/entity')
+            ]
+        state += [
+            include('s/escape'),
+            (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' %
+             (char, char, escaped_quotes, _escape), String.Interpol),
+            (r'[\\&{}<]', token)
+        ]
+        return state
+
+    def _make_tag_state(triple, double, _escape=_escape):
+        char = r'"' if double else r"'"
+        quantifier = r'{3,}' if triple else r''
+        state_name = '%s%sqt' % ('t' if triple else '', 'd' if double else 's')
+        token = String.Double if double else String.Single
+        escaped_quotes = r'+|%s(?!%s{2})' % (char, char) if triple else r''
+        return [
+            (r'%s%s' % (char, quantifier), token, '#pop:2'),
+            (r'(\s|\\\n)+', Text),
+            (r'(=)(\\?")', bygroups(Punctuation, String.Double),
+             'dqs/%s' % state_name),
+            (r"(=)(\\?')", bygroups(Punctuation, String.Single),
+             'sqs/%s' % state_name),
+            (r'=', Punctuation, 'uqs/%s' % state_name),
+            (r'\\?>', Name.Tag, '#pop'),
+            (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' %
+             (char, char, escaped_quotes, _escape), String.Interpol),
+            (r'([^\s=><\\%s]|<(?!<)|\\%s%s|%s|\\.)+' %
+             (char, char, escaped_quotes, _escape), Name.Attribute),
+            include('s/escape'),
+            include('s/verbatim'),
+            include('s/entity'),
+            (r'[\\{}&]', Name.Attribute)
+        ]
+
+    def _make_attribute_value_state(terminator, host_triple, host_double,
+                                    _escape=_escape):
+        token = (String.Double if terminator == r'"' else
+                 String.Single if terminator == r"'" else String.Other)
+        host_char = r'"' if host_double else r"'"
+        host_quantifier = r'{3,}' if host_triple else r''
+        host_token = String.Double if host_double else String.Single
+        escaped_quotes = (r'+|%s(?!%s{2})' % (host_char, host_char)
+                          if host_triple else r'')
+        return [
+            (r'%s%s' % (host_char, host_quantifier), host_token, '#pop:3'),
+            (r'%s%s' % (r'' if token is String.Other else r'\\?', terminator),
+             token, '#pop'),
+            include('s/verbatim'),
+            include('s/entity'),
+            (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' %
+             (host_char, host_char, escaped_quotes, _escape), String.Interpol),
+            (r'([^\s"\'<%s{}\\&])+' % (r'>' if token is String.Other else r''),
+             token),
+            include('s/escape'),
+            (r'["\'\s&{<}\\]', token)
+        ]
+
+    tokens = {
+        'root': [
+            (u'\ufeff', Text),
+            (r'\{', Punctuation, 'object-body'),
+            (r';+', Punctuation),
+            (r'(?=(argcount|break|case|catch|continue|default|definingobj|'
+             r'delegated|do|else|for|foreach|finally|goto|if|inherited|'
+             r'invokee|local|nil|new|operator|replaced|return|self|switch|'
+             r'targetobj|targetprop|throw|true|try|while)\b)', Text, 'block'),
+            (r'(%s)(%s*)(\()' % (_name, _ws),
+             bygroups(Name.Function, using(this, state='whitespace'),
+                      Punctuation),
+             ('block?/root', 'more/parameters', 'main/parameters')),
+            include('whitespace'),
+            (r'\++', Punctuation),
+            (r'[^\s!"%-(*->@-_a-z{-~]+', Error),  # Averts an infinite loop
+            (r'(?!\Z)', Text, 'main/root')
+        ],
+        'main/root': [
+            include('main/basic'),
+            default(('#pop', 'object-body/no-braces', 'classes', 'class'))
+        ],
+        'object-body/no-braces': [
+            (r';', Punctuation, '#pop'),
+            (r'\{', Punctuation, ('#pop', 'object-body')),
+            include('object-body')
+        ],
+        'object-body': [
+            (r';', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            (r':', Punctuation, ('classes', 'class')),
+            (r'(%s?)(%s*)(\()' % (_name, _ws),
+             bygroups(Name.Function, using(this, state='whitespace'),
+                      Punctuation),
+             ('block?', 'more/parameters', 'main/parameters')),
+            (r'(%s)(%s*)(\{)' % (_name, _ws),
+             bygroups(Name.Function, using(this, state='whitespace'),
+                      Punctuation), 'block'),
+            (r'(%s)(%s*)(:)' % (_name, _ws),
+             bygroups(Name.Variable, using(this, state='whitespace'),
+                      Punctuation),
+             ('object-body/no-braces', 'classes', 'class')),
+            include('whitespace'),
+            (r'->|%s' % _operator, Punctuation, 'main'),
+            default('main/object-body')
+        ],
+        'main/object-body': [
+            include('main/basic'),
+            (r'(%s)(%s*)(=?)' % (_name, _ws),
+             bygroups(Name.Variable, using(this, state='whitespace'),
+                      Punctuation), ('#pop', 'more', 'main')),
+            default('#pop:2')
+        ],
+        'block?/root': [
+            (r'\{', Punctuation, ('#pop', 'block')),
+            include('whitespace'),
+            (r'(?=[[\'"<(:])', Text,  # It might be a VerbRule macro.
+             ('#pop', 'object-body/no-braces', 'grammar', 'grammar-rules')),
+            # It might be a macro like DefineAction.
+            default(('#pop', 'object-body/no-braces'))
+        ],
+        'block?': [
+            (r'\{', Punctuation, ('#pop', 'block')),
+            include('whitespace'),
+            default('#pop')
+        ],
+        'block/basic': [
+            (r'[;:]+', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            (r'default\b', Keyword.Reserved),
+            (r'(%s)(%s*)(:)' % (_name, _ws),
+             bygroups(Name.Label, using(this, state='whitespace'),
+                      Punctuation)),
+            include('whitespace')
+        ],
+        'block': [
+            include('block/basic'),
+            (r'(?!\Z)', Text, ('more', 'main'))
+        ],
+        'block/embed': [
+            (r'>>', String.Interpol, '#pop'),
+            include('block/basic'),
+            (r'(?!\Z)', Text, ('more/embed', 'main'))
+        ],
+        'main/basic': [
+            include('whitespace'),
+            (r'\(', Punctuation, ('#pop', 'more', 'main')),
+            (r'\[', Punctuation, ('#pop', 'more/list', 'main')),
+            (r'\{', Punctuation, ('#pop', 'more/inner', 'main/inner',
+                                  'more/parameters', 'main/parameters')),
+            (r'\*|\.{3}', Punctuation, '#pop'),
+            (r'(?i)0x[\da-f]+', Number.Hex, '#pop'),
+            (r'(\d+\.(?!\.)\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+',
+             Number.Float, '#pop'),
+            (r'0[0-7]+', Number.Oct, '#pop'),
+            (r'\d+', Number.Integer, '#pop'),
+            (r'"""', String.Double, ('#pop', 'tdqs')),
+            (r"'''", String.Single, ('#pop', 'tsqs')),
+            (r'"', String.Double, ('#pop', 'dqs')),
+            (r"'", String.Single, ('#pop', 'sqs')),
+            (r'R"""', String.Regex, ('#pop', 'tdqr')),
+            (r"R'''", String.Regex, ('#pop', 'tsqr')),
+            (r'R"', String.Regex, ('#pop', 'dqr')),
+            (r"R'", String.Regex, ('#pop', 'sqr')),
+            # Two-token keywords
+            (r'(extern)(%s+)(object\b)' % _ws,
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Keyword.Reserved)),
+            (r'(function|method)(%s*)(\()' % _ws,
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Punctuation),
+             ('#pop', 'block?', 'more/parameters', 'main/parameters')),
+            (r'(modify)(%s+)(grammar\b)' % _ws,
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Keyword.Reserved),
+             ('#pop', 'object-body/no-braces', ':', 'grammar')),
+            (r'(new)(%s+(?=(?:function|method)\b))' % _ws,
+             bygroups(Keyword.Reserved, using(this, state='whitespace'))),
+            (r'(object)(%s+)(template\b)' % _ws,
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Keyword.Reserved), ('#pop', 'template')),
+            (r'(string)(%s+)(template\b)' % _ws,
+             bygroups(Keyword, using(this, state='whitespace'),
+                      Keyword.Reserved), ('#pop', 'function-name')),
+            # Keywords
+            (r'(argcount|definingobj|invokee|replaced|targetobj|targetprop)\b',
+             Name.Builtin, '#pop'),
+            (r'(break|continue|goto)\b', Keyword.Reserved, ('#pop', 'label')),
+            (r'(case|extern|if|intrinsic|return|static|while)\b',
+             Keyword.Reserved),
+            (r'catch\b', Keyword.Reserved, ('#pop', 'catch')),
+            (r'class\b', Keyword.Reserved,
+             ('#pop', 'object-body/no-braces', 'class')),
+            (r'(default|do|else|finally|try)\b', Keyword.Reserved, '#pop'),
+            (r'(dictionary|property)\b', Keyword.Reserved,
+             ('#pop', 'constants')),
+            (r'enum\b', Keyword.Reserved, ('#pop', 'enum')),
+            (r'export\b', Keyword.Reserved, ('#pop', 'main')),
+            (r'(for|foreach)\b', Keyword.Reserved,
+             ('#pop', 'more/inner', 'main/inner')),
+            (r'(function|method)\b', Keyword.Reserved,
+             ('#pop', 'block?', 'function-name')),
+            (r'grammar\b', Keyword.Reserved,
+             ('#pop', 'object-body/no-braces', 'grammar')),
+            (r'inherited\b', Keyword.Reserved, ('#pop', 'inherited')),
+            (r'local\b', Keyword.Reserved,
+             ('#pop', 'more/local', 'main/local')),
+            (r'(modify|replace|switch|throw|transient)\b', Keyword.Reserved,
+             '#pop'),
+            (r'new\b', Keyword.Reserved, ('#pop', 'class')),
+            (r'(nil|true)\b', Keyword.Constant, '#pop'),
+            (r'object\b', Keyword.Reserved, ('#pop', 'object-body/no-braces')),
+            (r'operator\b', Keyword.Reserved, ('#pop', 'operator')),
+            (r'propertyset\b', Keyword.Reserved,
+             ('#pop', 'propertyset', 'main')),
+            (r'self\b', Name.Builtin.Pseudo, '#pop'),
+            (r'template\b', Keyword.Reserved, ('#pop', 'template')),
+            # Operators
+            (r'(__objref|defined)(%s*)(\()' % _ws,
+             bygroups(Operator.Word, using(this, state='whitespace'),
+                      Operator), ('#pop', 'more/__objref', 'main')),
+            (r'delegated\b', Operator.Word),
+            # Compiler-defined macros and built-in properties
+            (r'(__DATE__|__DEBUG|__LINE__|__FILE__|'
+             r'__TADS_MACRO_FORMAT_VERSION|__TADS_SYS_\w*|__TADS_SYSTEM_NAME|'
+             r'__TADS_VERSION_MAJOR|__TADS_VERSION_MINOR|__TADS3|__TIME__|'
+             r'construct|finalize|grammarInfo|grammarTag|lexicalParent|'
+             r'miscVocab|sourceTextGroup|sourceTextGroupName|'
+             r'sourceTextGroupOrder|sourceTextOrder)\b', Name.Builtin, '#pop')
+        ],
+        'main': [
+            include('main/basic'),
+            (_name, Name, '#pop'),
+            default('#pop')
+        ],
+        'more/basic': [
+            (r'\(', Punctuation, ('more/list', 'main')),
+            (r'\[', Punctuation, ('more', 'main')),
+            (r'\.{3}', Punctuation),
+            (r'->|\.\.', Punctuation, 'main'),
+            (r'(?=;)|[:)\]]', Punctuation, '#pop'),
+            include('whitespace'),
+            (_operator, Operator, 'main'),
+            (r'\?', Operator, ('main', 'more/conditional', 'main')),
+            (r'(is|not)(%s+)(in\b)' % _ws,
+             bygroups(Operator.Word, using(this, state='whitespace'),
+                      Operator.Word)),
+            (r'[^\s!"%-_a-z{-~]+', Error)  # Averts an infinite loop
+        ],
+        'more': [
+            include('more/basic'),
+            default('#pop')
+        ],
+        # Then expression (conditional operator)
+        'more/conditional': [
+            (r':(?!:)', Operator, '#pop'),
+            include('more')
+        ],
+        # Embedded expressions
+        'more/embed': [
+            (r'>>', String.Interpol, '#pop:2'),
+            include('more')
+        ],
+        # For/foreach loop initializer or short-form anonymous function
+        'main/inner': [
+            (r'\(', Punctuation, ('#pop', 'more/inner', 'main/inner')),
+            (r'local\b', Keyword.Reserved, ('#pop', 'main/local')),
+            include('main')
+        ],
+        'more/inner': [
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation, 'main/inner'),
+            (r'(in|step)\b', Keyword, 'main/inner'),
+            include('more')
+        ],
+        # Local
+        'main/local': [
+            (_name, Name.Variable, '#pop'),
+            include('whitespace')
+        ],
+        'more/local': [
+            (r',', Punctuation, 'main/local'),
+            include('more')
+        ],
+        # List
+        'more/list': [
+            (r'[,:]', Punctuation, 'main'),
+            include('more')
+        ],
+        # Parameter list
+        'main/parameters': [
+            (r'(%s)(%s*)(?=:)' % (_name, _ws),
+             bygroups(Name.Variable, using(this, state='whitespace')), '#pop'),
+            (r'(%s)(%s+)(%s)' % (_name, _ws, _name),
+             bygroups(Name.Class, using(this, state='whitespace'),
+                      Name.Variable), '#pop'),
+            (r'\[+', Punctuation),
+            include('main/basic'),
+            (_name, Name.Variable, '#pop'),
+            default('#pop')
+        ],
+        'more/parameters': [
+            (r'(:)(%s*(?=[?=,:)]))' % _ws,
+             bygroups(Punctuation, using(this, state='whitespace'))),
+            (r'[?\]]+', Punctuation),
+            (r'[:)]', Punctuation, ('#pop', 'multimethod?')),
+            (r',', Punctuation, 'main/parameters'),
+            (r'=', Punctuation, ('more/parameter', 'main')),
+            include('more')
+        ],
+        'more/parameter': [
+            (r'(?=[,)])', Text, '#pop'),
+            include('more')
+        ],
+        'multimethod?': [
+            (r'multimethod\b', Keyword, '#pop'),
+            include('whitespace'),
+            default('#pop')
+        ],
+
+        # Statements and expressions
+        'more/__objref': [
+            (r',', Punctuation, 'mode'),
+            (r'\)', Operator, '#pop'),
+            include('more')
+        ],
+        'mode': [
+            (r'(error|warn)\b', Keyword, '#pop'),
+            include('whitespace')
+        ],
+        'catch': [
+            (r'\(+', Punctuation),
+            (_name, Name.Exception, ('#pop', 'variables')),
+            include('whitespace')
+        ],
+        'enum': [
+            include('whitespace'),
+            (r'token\b', Keyword, ('#pop', 'constants')),
+            default(('#pop', 'constants'))
+        ],
+        'grammar': [
+            (r'\)+', Punctuation),
+            (r'\(', Punctuation, 'grammar-tag'),
+            (r':', Punctuation, 'grammar-rules'),
+            (_name, Name.Class),
+            include('whitespace')
+        ],
+        'grammar-tag': [
+            include('whitespace'),
+            (r'"""([^\\"<]|""?(?!")|\\"+|\\.|<(?!<))+("{3,}|<<)|'
+             r'R"""([^\\"]|""?(?!")|\\"+|\\.)+"{3,}|'
+             r"'''([^\\'<]|''?(?!')|\\'+|\\.|<(?!<))+('{3,}|<<)|"
+             r"R'''([^\\']|''?(?!')|\\'+|\\.)+'{3,}|"
+             r'"([^\\"<]|\\.|<(?!<))+("|<<)|R"([^\\"]|\\.)+"|'
+             r"'([^\\'<]|\\.|<(?!<))+('|<<)|R'([^\\']|\\.)+'|"
+             r"([^)\s\\/]|/(?![/*]))+|\)", String.Other, '#pop')
+        ],
+        'grammar-rules': [
+            include('string'),
+            include('whitespace'),
+            (r'(\[)(%s*)(badness)' % _ws,
+             bygroups(Punctuation, using(this, state='whitespace'), Keyword),
+             'main'),
+            (r'->|%s|[()]' % _operator, Punctuation),
+            (_name, Name.Constant),
+            default('#pop:2')
+        ],
+        ':': [
+            (r':', Punctuation, '#pop')
+        ],
+        'function-name': [
+            (r'(<<([^>]|>>>|>(?!>))*>>)+', String.Interpol),
+            (r'(?=%s?%s*[({])' % (_name, _ws), Text, '#pop'),
+            (_name, Name.Function, '#pop'),
+            include('whitespace')
+        ],
+        'inherited': [
+            (r'<', Punctuation, ('#pop', 'classes', 'class')),
+            include('whitespace'),
+            (_name, Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'operator': [
+            (r'negate\b', Operator.Word, '#pop'),
+            include('whitespace'),
+            (_operator, Operator),
+            default('#pop')
+        ],
+        'propertyset': [
+            (r'\(', Punctuation, ('more/parameters', 'main/parameters')),
+            (r'\{', Punctuation, ('#pop', 'object-body')),
+            include('whitespace')
+        ],
+        'template': [
+            (r'(?=;)', Text, '#pop'),
+            include('string'),
+            (r'inherited\b', Keyword.Reserved),
+            include('whitespace'),
+            (r'->|\?|%s' % _operator, Punctuation),
+            (_name, Name.Variable)
+        ],
+
+        # Identifiers
+        'class': [
+            (r'\*|\.{3}', Punctuation, '#pop'),
+            (r'object\b', Keyword.Reserved, '#pop'),
+            (r'transient\b', Keyword.Reserved),
+            (_name, Name.Class, '#pop'),
+            include('whitespace'),
+            default('#pop')
+        ],
+        'classes': [
+            (r'[:,]', Punctuation, 'class'),
+            include('whitespace'),
+            (r'>', Punctuation, '#pop'),
+            default('#pop')
+        ],
+        'constants': [
+            (r',+', Punctuation),
+            (r';', Punctuation, '#pop'),
+            (r'property\b', Keyword.Reserved),
+            (_name, Name.Constant),
+            include('whitespace')
+        ],
+        'label': [
+            (_name, Name.Label, '#pop'),
+            include('whitespace'),
+            default('#pop')
+        ],
+        'variables': [
+            (r',+', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            include('whitespace'),
+            (_name, Name.Variable)
+        ],
+
+        # Whitespace and comments
+        'whitespace': [
+            (r'^%s*#(%s|[^\n]|(?<=\\)\n)*\n?' % (_ws_pp, _comment_multiline),
+             Comment.Preproc),
+            (_comment_single, Comment.Single),
+            (_comment_multiline, Comment.Multiline),
+            (r'\\+\n+%s*#?|\n+|([^\S\n]|\\)+' % _ws_pp, Text)
+        ],
+
+        # Strings
+        'string': [
+            (r'"""', String.Double, 'tdqs'),
+            (r"'''", String.Single, 'tsqs'),
+            (r'"', String.Double, 'dqs'),
+            (r"'", String.Single, 'sqs')
+        ],
+        's/escape': [
+            (r'\{\{|\}\}|%s' % _escape, String.Escape)
+        ],
+        's/verbatim': [
+            (r'<<\s*(as\s+decreasingly\s+likely\s+outcomes|cycling|else|end|'
+             r'first\s+time|one\s+of|only|or|otherwise|'
+             r'(sticky|(then\s+)?(purely\s+)?at)\s+random|stopping|'
+             r'(then\s+)?(half\s+)?shuffled|\|\|)\s*>>', String.Interpol),
+            (r'<<(%%(_(%s|\\?.)|[\-+ ,#]|\[\d*\]?)*\d*\.?\d*(%s|\\?.)|'
+             r'\s*((else|otherwise)\s+)?(if|unless)\b)?' % (_escape, _escape),
+             String.Interpol, ('block/embed', 'more/embed', 'main'))
+        ],
+        's/entity': [
+            (r'(?i)&(#(x[\da-f]+|\d+)|[a-z][\da-z]*);?', Name.Entity)
+        ],
+        'tdqs': _make_string_state(True, True),
+        'tsqs': _make_string_state(True, False),
+        'dqs': _make_string_state(False, True),
+        'sqs': _make_string_state(False, False),
+        'tdqs/listing': _make_string_state(True, True, 'listing'),
+        'tsqs/listing': _make_string_state(True, False, 'listing'),
+        'dqs/listing': _make_string_state(False, True, 'listing'),
+        'sqs/listing': _make_string_state(False, False, 'listing'),
+        'tdqs/xmp': _make_string_state(True, True, 'xmp'),
+        'tsqs/xmp': _make_string_state(True, False, 'xmp'),
+        'dqs/xmp': _make_string_state(False, True, 'xmp'),
+        'sqs/xmp': _make_string_state(False, False, 'xmp'),
+
+        # Tags
+        'tdqt': _make_tag_state(True, True),
+        'tsqt': _make_tag_state(True, False),
+        'dqt': _make_tag_state(False, True),
+        'sqt': _make_tag_state(False, False),
+        'dqs/tdqt': _make_attribute_value_state(r'"', True, True),
+        'dqs/tsqt': _make_attribute_value_state(r'"', True, False),
+        'dqs/dqt': _make_attribute_value_state(r'"', False, True),
+        'dqs/sqt': _make_attribute_value_state(r'"', False, False),
+        'sqs/tdqt': _make_attribute_value_state(r"'", True, True),
+        'sqs/tsqt': _make_attribute_value_state(r"'", True, False),
+        'sqs/dqt': _make_attribute_value_state(r"'", False, True),
+        'sqs/sqt': _make_attribute_value_state(r"'", False, False),
+        'uqs/tdqt': _make_attribute_value_state(_no_quote, True, True),
+        'uqs/tsqt': _make_attribute_value_state(_no_quote, True, False),
+        'uqs/dqt': _make_attribute_value_state(_no_quote, False, True),
+        'uqs/sqt': _make_attribute_value_state(_no_quote, False, False),
+
+        # Regular expressions
+        'tdqr': [
+            (r'[^\\"]+', String.Regex),
+            (r'\\"*', String.Regex),
+            (r'"{3,}', String.Regex, '#pop'),
+            (r'"', String.Regex)
+        ],
+        'tsqr': [
+            (r"[^\\']+", String.Regex),
+            (r"\\'*", String.Regex),
+            (r"'{3,}", String.Regex, '#pop'),
+            (r"'", String.Regex)
+        ],
+        'dqr': [
+            (r'[^\\"]+', String.Regex),
+            (r'\\"?', String.Regex),
+            (r'"', String.Regex, '#pop')
+        ],
+        'sqr': [
+            (r"[^\\']+", String.Regex),
+            (r"\\'?", String.Regex),
+            (r"'", String.Regex, '#pop')
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text, **kwargs):
+        pp = r'^%s*#%s*' % (self._ws_pp, self._ws_pp)
+        if_false_level = 0
+        for index, token, value in (
+            RegexLexer.get_tokens_unprocessed(self, text, **kwargs)):
+            if if_false_level == 0:  # Not in a false #if
+                if (token is Comment.Preproc and
+                    re.match(r'%sif%s+(0|nil)%s*$\n?' %
+                             (pp, self._ws_pp, self._ws_pp), value)):
+                    if_false_level = 1
+            else:  # In a false #if
+                if token is Comment.Preproc:
+                    if (if_false_level == 1 and
+                          re.match(r'%sel(if|se)\b' % pp, value)):
+                        if_false_level = 0
+                    elif re.match(r'%sif' % pp, value):
+                        if_false_level += 1
+                    elif re.match(r'%sendif\b' % pp, value):
+                        if_false_level -= 1
+                else:
+                    token = Comment
+            yield index, token, value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/pawn.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/pawn.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/pawn.py	(revision 1126)
@@ -0,0 +1,199 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.pawn
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Pawn languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+from pygments.util import get_bool_opt
+
+__all__ = ['SourcePawnLexer', 'PawnLexer']
+
+
+class SourcePawnLexer(RegexLexer):
+    """
+    For SourcePawn source code with preprocessor directives.
+
+    .. versionadded:: 1.6
+    """
+    name = 'SourcePawn'
+    aliases = ['sp']
+    filenames = ['*.sp']
+    mimetypes = ['text/x-sourcepawn']
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+'
+    #: only one /* */ style comment
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)*'
+
+    tokens = {
+        'root': [
+            # preprocessor directives: without whitespace
+            ('^#if\s+0', Comment.Preproc, 'if0'),
+            ('^#', Comment.Preproc, 'macro'),
+            # or with whitespace
+            ('^' + _ws1 + r'#if\s+0', Comment.Preproc, 'if0'),
+            ('^' + _ws1 + '#', Comment.Preproc, 'macro'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
+            (r'[{}]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'\*/', Error),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;]', Punctuation),
+            (r'(case|const|continue|native|'
+             r'default|else|enum|for|if|new|operator|'
+             r'public|return|sizeof|static|decl|struct|switch)\b', Keyword),
+            (r'(bool|Float)\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),       # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ]
+    }
+
+    SM_TYPES = set(('Action', 'bool', 'Float', 'Plugin', 'String', 'any',
+                    'AdminFlag', 'OverrideType', 'OverrideRule', 'ImmunityType',
+                    'GroupId', 'AdminId', 'AdmAccessMode', 'AdminCachePart',
+                    'CookieAccess', 'CookieMenu', 'CookieMenuAction', 'NetFlow',
+                    'ConVarBounds', 'QueryCookie', 'ReplySource',
+                    'ConVarQueryResult', 'ConVarQueryFinished', 'Function',
+                    'Action', 'Identity', 'PluginStatus', 'PluginInfo', 'DBResult',
+                    'DBBindType', 'DBPriority', 'PropType', 'PropFieldType',
+                    'MoveType', 'RenderMode', 'RenderFx', 'EventHookMode',
+                    'EventHook', 'FileType', 'FileTimeMode', 'PathType',
+                    'ParamType', 'ExecType', 'DialogType', 'Handle', 'KvDataTypes',
+                    'NominateResult', 'MapChange', 'MenuStyle', 'MenuAction',
+                    'MenuSource', 'RegexError', 'SDKCallType', 'SDKLibrary',
+                    'SDKFuncConfSource', 'SDKType', 'SDKPassMethod', 'RayType',
+                    'TraceEntityFilter', 'ListenOverride', 'SortOrder', 'SortType',
+                    'SortFunc2D', 'APLRes', 'FeatureType', 'FeatureStatus',
+                    'SMCResult', 'SMCError', 'TFClassType', 'TFTeam', 'TFCond',
+                    'TFResourceType', 'Timer', 'TopMenuAction', 'TopMenuObjectType',
+                    'TopMenuPosition', 'TopMenuObject', 'UserMsg'))
+
+    def __init__(self, **options):
+        self.smhighlighting = get_bool_opt(options,
+                                           'sourcemod', True)
+
+        self._functions = set()
+        if self.smhighlighting:
+            from pygments.lexers._sourcemod_builtins import FUNCTIONS
+            self._functions.update(FUNCTIONS)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                if self.smhighlighting:
+                    if value in self.SM_TYPES:
+                        token = Keyword.Type
+                    elif value in self._functions:
+                        token = Name.Builtin
+            yield index, token, value
+
+
+class PawnLexer(RegexLexer):
+    """
+    For Pawn source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Pawn'
+    aliases = ['pawn']
+    filenames = ['*.p', '*.pwn', '*.inc']
+    mimetypes = ['text/x-pawn']
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*][\w\W]*?[*]/)+'
+    #: only one /* */ style comment
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)*'
+
+    tokens = {
+        'root': [
+            # preprocessor directives: without whitespace
+            ('^#if\s+0', Comment.Preproc, 'if0'),
+            ('^#', Comment.Preproc, 'macro'),
+            # or with whitespace
+            ('^' + _ws1 + r'#if\s+0', Comment.Preproc, 'if0'),
+            ('^' + _ws1 + '#', Comment.Preproc, 'macro'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?\*[\w\W]*?\*(\\\n)?/', Comment.Multiline),
+            (r'[{}]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'\*/', Error),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;]', Punctuation),
+            (r'(switch|case|default|const|new|static|char|continue|break|'
+             r'if|else|for|while|do|operator|enum|'
+             r'public|return|sizeof|tagof|state|goto)\b', Keyword),
+            (r'(bool|Float)\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),       # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_cl_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_cl_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_cl_builtins.py	(revision 1126)
@@ -0,0 +1,232 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._cl_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    ANSI Common Lisp builtins.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+BUILTIN_FUNCTIONS = set((  # 638 functions
+    '<', '<=', '=', '>', '>=', '-', '/', '/=', '*', '+', '1-', '1+',
+    'abort', 'abs', 'acons', 'acos', 'acosh', 'add-method', 'adjoin',
+    'adjustable-array-p', 'adjust-array', 'allocate-instance',
+    'alpha-char-p', 'alphanumericp', 'append', 'apply', 'apropos',
+    'apropos-list', 'aref', 'arithmetic-error-operands',
+    'arithmetic-error-operation', 'array-dimension', 'array-dimensions',
+    'array-displacement', 'array-element-type', 'array-has-fill-pointer-p',
+    'array-in-bounds-p', 'arrayp', 'array-rank', 'array-row-major-index',
+    'array-total-size', 'ash', 'asin', 'asinh', 'assoc', 'assoc-if',
+    'assoc-if-not', 'atan', 'atanh', 'atom', 'bit', 'bit-and', 'bit-andc1',
+    'bit-andc2', 'bit-eqv', 'bit-ior', 'bit-nand', 'bit-nor', 'bit-not',
+    'bit-orc1', 'bit-orc2', 'bit-vector-p', 'bit-xor', 'boole',
+    'both-case-p', 'boundp', 'break', 'broadcast-stream-streams',
+    'butlast', 'byte', 'byte-position', 'byte-size', 'caaaar', 'caaadr',
+    'caaar', 'caadar', 'caaddr', 'caadr', 'caar', 'cadaar', 'cadadr',
+    'cadar', 'caddar', 'cadddr', 'caddr', 'cadr', 'call-next-method', 'car',
+    'cdaaar', 'cdaadr', 'cdaar', 'cdadar', 'cdaddr', 'cdadr', 'cdar',
+    'cddaar', 'cddadr', 'cddar', 'cdddar', 'cddddr', 'cdddr', 'cddr', 'cdr',
+    'ceiling', 'cell-error-name', 'cerror', 'change-class', 'char', 'char<',
+    'char<=', 'char=', 'char>', 'char>=', 'char/=', 'character',
+    'characterp', 'char-code', 'char-downcase', 'char-equal',
+    'char-greaterp', 'char-int', 'char-lessp', 'char-name',
+    'char-not-equal', 'char-not-greaterp', 'char-not-lessp', 'char-upcase',
+    'cis', 'class-name', 'class-of', 'clear-input', 'clear-output',
+    'close', 'clrhash', 'code-char', 'coerce', 'compile',
+    'compiled-function-p', 'compile-file', 'compile-file-pathname',
+    'compiler-macro-function', 'complement', 'complex', 'complexp',
+    'compute-applicable-methods', 'compute-restarts', 'concatenate',
+    'concatenated-stream-streams', 'conjugate', 'cons', 'consp',
+    'constantly', 'constantp', 'continue', 'copy-alist', 'copy-list',
+    'copy-pprint-dispatch', 'copy-readtable', 'copy-seq', 'copy-structure',
+    'copy-symbol', 'copy-tree', 'cos', 'cosh', 'count', 'count-if',
+    'count-if-not', 'decode-float', 'decode-universal-time', 'delete',
+    'delete-duplicates', 'delete-file', 'delete-if', 'delete-if-not',
+    'delete-package', 'denominator', 'deposit-field', 'describe',
+    'describe-object', 'digit-char', 'digit-char-p', 'directory',
+    'directory-namestring', 'disassemble', 'documentation', 'dpb',
+    'dribble', 'echo-stream-input-stream', 'echo-stream-output-stream',
+    'ed', 'eighth', 'elt', 'encode-universal-time', 'endp',
+    'enough-namestring', 'ensure-directories-exist',
+    'ensure-generic-function', 'eq', 'eql', 'equal', 'equalp', 'error',
+    'eval', 'evenp', 'every', 'exp', 'export', 'expt', 'fboundp',
+    'fceiling', 'fdefinition', 'ffloor', 'fifth', 'file-author',
+    'file-error-pathname', 'file-length', 'file-namestring',
+    'file-position', 'file-string-length', 'file-write-date',
+    'fill', 'fill-pointer', 'find', 'find-all-symbols', 'find-class',
+    'find-if', 'find-if-not', 'find-method', 'find-package', 'find-restart',
+    'find-symbol', 'finish-output', 'first', 'float', 'float-digits',
+    'floatp', 'float-precision', 'float-radix', 'float-sign', 'floor',
+    'fmakunbound', 'force-output', 'format', 'fourth', 'fresh-line',
+    'fround', 'ftruncate', 'funcall', 'function-keywords',
+    'function-lambda-expression', 'functionp', 'gcd', 'gensym', 'gentemp',
+    'get', 'get-decoded-time', 'get-dispatch-macro-character', 'getf',
+    'gethash', 'get-internal-real-time', 'get-internal-run-time',
+    'get-macro-character', 'get-output-stream-string', 'get-properties',
+    'get-setf-expansion', 'get-universal-time', 'graphic-char-p',
+    'hash-table-count', 'hash-table-p', 'hash-table-rehash-size',
+    'hash-table-rehash-threshold', 'hash-table-size', 'hash-table-test',
+    'host-namestring', 'identity', 'imagpart', 'import',
+    'initialize-instance', 'input-stream-p', 'inspect',
+    'integer-decode-float', 'integer-length', 'integerp',
+    'interactive-stream-p', 'intern', 'intersection',
+    'invalid-method-error', 'invoke-debugger', 'invoke-restart',
+    'invoke-restart-interactively', 'isqrt', 'keywordp', 'last', 'lcm',
+    'ldb', 'ldb-test', 'ldiff', 'length', 'lisp-implementation-type',
+    'lisp-implementation-version', 'list', 'list*', 'list-all-packages',
+    'listen', 'list-length', 'listp', 'load',
+    'load-logical-pathname-translations', 'log', 'logand', 'logandc1',
+    'logandc2', 'logbitp', 'logcount', 'logeqv', 'logical-pathname',
+    'logical-pathname-translations', 'logior', 'lognand', 'lognor',
+    'lognot', 'logorc1', 'logorc2', 'logtest', 'logxor', 'long-site-name',
+    'lower-case-p', 'machine-instance', 'machine-type', 'machine-version',
+    'macroexpand', 'macroexpand-1', 'macro-function', 'make-array',
+    'make-broadcast-stream', 'make-concatenated-stream', 'make-condition',
+    'make-dispatch-macro-character', 'make-echo-stream', 'make-hash-table',
+    'make-instance', 'make-instances-obsolete', 'make-list',
+    'make-load-form', 'make-load-form-saving-slots', 'make-package',
+    'make-pathname', 'make-random-state', 'make-sequence', 'make-string',
+    'make-string-input-stream', 'make-string-output-stream', 'make-symbol',
+    'make-synonym-stream', 'make-two-way-stream', 'makunbound', 'map',
+    'mapc', 'mapcan', 'mapcar', 'mapcon', 'maphash', 'map-into', 'mapl',
+    'maplist', 'mask-field', 'max', 'member', 'member-if', 'member-if-not',
+    'merge', 'merge-pathnames', 'method-combination-error',
+    'method-qualifiers', 'min', 'minusp', 'mismatch', 'mod',
+    'muffle-warning', 'name-char', 'namestring', 'nbutlast', 'nconc',
+    'next-method-p', 'nintersection', 'ninth', 'no-applicable-method',
+    'no-next-method', 'not', 'notany', 'notevery', 'nreconc', 'nreverse',
+    'nset-difference', 'nset-exclusive-or', 'nstring-capitalize',
+    'nstring-downcase', 'nstring-upcase', 'nsublis', 'nsubst', 'nsubst-if',
+    'nsubst-if-not', 'nsubstitute', 'nsubstitute-if', 'nsubstitute-if-not',
+    'nth', 'nthcdr', 'null', 'numberp', 'numerator', 'nunion', 'oddp',
+    'open', 'open-stream-p', 'output-stream-p', 'package-error-package',
+    'package-name', 'package-nicknames', 'packagep',
+    'package-shadowing-symbols', 'package-used-by-list', 'package-use-list',
+    'pairlis', 'parse-integer', 'parse-namestring', 'pathname',
+    'pathname-device', 'pathname-directory', 'pathname-host',
+    'pathname-match-p', 'pathname-name', 'pathnamep', 'pathname-type',
+    'pathname-version', 'peek-char', 'phase', 'plusp', 'position',
+    'position-if', 'position-if-not', 'pprint', 'pprint-dispatch',
+    'pprint-fill', 'pprint-indent', 'pprint-linear', 'pprint-newline',
+    'pprint-tab', 'pprint-tabular', 'prin1', 'prin1-to-string', 'princ',
+    'princ-to-string', 'print', 'print-object', 'probe-file', 'proclaim',
+    'provide', 'random', 'random-state-p', 'rassoc', 'rassoc-if',
+    'rassoc-if-not', 'rational', 'rationalize', 'rationalp', 'read',
+    'read-byte', 'read-char', 'read-char-no-hang', 'read-delimited-list',
+    'read-from-string', 'read-line', 'read-preserving-whitespace',
+    'read-sequence', 'readtable-case', 'readtablep', 'realp', 'realpart',
+    'reduce', 'reinitialize-instance', 'rem', 'remhash', 'remove',
+    'remove-duplicates', 'remove-if', 'remove-if-not', 'remove-method',
+    'remprop', 'rename-file', 'rename-package', 'replace', 'require',
+    'rest', 'restart-name', 'revappend', 'reverse', 'room', 'round',
+    'row-major-aref', 'rplaca', 'rplacd', 'sbit', 'scale-float', 'schar',
+    'search', 'second', 'set', 'set-difference',
+    'set-dispatch-macro-character', 'set-exclusive-or',
+    'set-macro-character', 'set-pprint-dispatch', 'set-syntax-from-char',
+    'seventh', 'shadow', 'shadowing-import', 'shared-initialize',
+    'short-site-name', 'signal', 'signum', 'simple-bit-vector-p',
+    'simple-condition-format-arguments', 'simple-condition-format-control',
+    'simple-string-p', 'simple-vector-p', 'sin', 'sinh', 'sixth', 'sleep',
+    'slot-boundp', 'slot-exists-p', 'slot-makunbound', 'slot-missing',
+    'slot-unbound', 'slot-value', 'software-type', 'software-version',
+    'some', 'sort', 'special-operator-p', 'sqrt', 'stable-sort',
+    'standard-char-p', 'store-value', 'stream-element-type',
+    'stream-error-stream', 'stream-external-format', 'streamp', 'string',
+    'string<', 'string<=', 'string=', 'string>', 'string>=', 'string/=',
+    'string-capitalize', 'string-downcase', 'string-equal',
+    'string-greaterp', 'string-left-trim', 'string-lessp',
+    'string-not-equal', 'string-not-greaterp', 'string-not-lessp',
+    'stringp', 'string-right-trim', 'string-trim', 'string-upcase',
+    'sublis', 'subseq', 'subsetp', 'subst', 'subst-if', 'subst-if-not',
+    'substitute', 'substitute-if', 'substitute-if-not', 'subtypep','svref',
+    'sxhash', 'symbol-function', 'symbol-name', 'symbolp', 'symbol-package',
+    'symbol-plist', 'symbol-value', 'synonym-stream-symbol', 'syntax:',
+    'tailp', 'tan', 'tanh', 'tenth', 'terpri', 'third',
+    'translate-logical-pathname', 'translate-pathname', 'tree-equal',
+    'truename', 'truncate', 'two-way-stream-input-stream',
+    'two-way-stream-output-stream', 'type-error-datum',
+    'type-error-expected-type', 'type-of', 'typep', 'unbound-slot-instance',
+    'unexport', 'unintern', 'union', 'unread-char', 'unuse-package',
+    'update-instance-for-different-class',
+    'update-instance-for-redefined-class', 'upgraded-array-element-type',
+    'upgraded-complex-part-type', 'upper-case-p', 'use-package',
+    'user-homedir-pathname', 'use-value', 'values', 'values-list', 'vector',
+    'vectorp', 'vector-pop', 'vector-push', 'vector-push-extend', 'warn',
+    'wild-pathname-p', 'write', 'write-byte', 'write-char', 'write-line',
+    'write-sequence', 'write-string', 'write-to-string', 'yes-or-no-p',
+    'y-or-n-p', 'zerop',
+))
+
+SPECIAL_FORMS = set((
+    'block', 'catch', 'declare', 'eval-when', 'flet', 'function', 'go', 'if',
+    'labels', 'lambda', 'let', 'let*', 'load-time-value', 'locally', 'macrolet',
+    'multiple-value-call', 'multiple-value-prog1', 'progn', 'progv', 'quote',
+    'return-from', 'setq', 'symbol-macrolet', 'tagbody', 'the', 'throw',
+    'unwind-protect',
+))
+
+MACROS = set((
+    'and', 'assert', 'call-method', 'case', 'ccase', 'check-type', 'cond',
+    'ctypecase', 'decf', 'declaim', 'defclass', 'defconstant', 'defgeneric',
+    'define-compiler-macro', 'define-condition', 'define-method-combination',
+    'define-modify-macro', 'define-setf-expander', 'define-symbol-macro',
+    'defmacro', 'defmethod', 'defpackage', 'defparameter', 'defsetf',
+    'defstruct', 'deftype', 'defun', 'defvar', 'destructuring-bind', 'do',
+    'do*', 'do-all-symbols', 'do-external-symbols', 'dolist', 'do-symbols',
+    'dotimes', 'ecase', 'etypecase', 'formatter', 'handler-bind',
+    'handler-case', 'ignore-errors', 'incf', 'in-package', 'lambda', 'loop',
+    'loop-finish', 'make-method', 'multiple-value-bind', 'multiple-value-list',
+    'multiple-value-setq', 'nth-value', 'or', 'pop',
+    'pprint-exit-if-list-exhausted', 'pprint-logical-block', 'pprint-pop',
+    'print-unreadable-object', 'prog', 'prog*', 'prog1', 'prog2', 'psetf',
+    'psetq', 'push', 'pushnew', 'remf', 'restart-bind', 'restart-case',
+    'return', 'rotatef', 'setf', 'shiftf', 'step', 'time', 'trace', 'typecase',
+    'unless', 'untrace', 'when', 'with-accessors', 'with-compilation-unit',
+    'with-condition-restarts', 'with-hash-table-iterator',
+    'with-input-from-string', 'with-open-file', 'with-open-stream',
+    'with-output-to-string', 'with-package-iterator', 'with-simple-restart',
+    'with-slots', 'with-standard-io-syntax',
+))
+
+LAMBDA_LIST_KEYWORDS = set((
+    '&allow-other-keys', '&aux', '&body', '&environment', '&key', '&optional',
+    '&rest', '&whole',
+))
+
+DECLARATIONS = set((
+    'dynamic-extent', 'ignore', 'optimize', 'ftype', 'inline', 'special',
+    'ignorable', 'notinline', 'type',
+))
+
+BUILTIN_TYPES = set((
+    'atom', 'boolean', 'base-char', 'base-string', 'bignum', 'bit',
+    'compiled-function', 'extended-char', 'fixnum', 'keyword', 'nil',
+    'signed-byte', 'short-float', 'single-float', 'double-float', 'long-float',
+    'simple-array', 'simple-base-string', 'simple-bit-vector', 'simple-string',
+    'simple-vector', 'standard-char', 'unsigned-byte',
+
+    # Condition Types
+    'arithmetic-error', 'cell-error', 'condition', 'control-error',
+    'division-by-zero', 'end-of-file', 'error', 'file-error',
+    'floating-point-inexact', 'floating-point-overflow',
+    'floating-point-underflow', 'floating-point-invalid-operation',
+    'parse-error', 'package-error', 'print-not-readable', 'program-error',
+    'reader-error', 'serious-condition', 'simple-condition', 'simple-error',
+    'simple-type-error', 'simple-warning', 'stream-error', 'storage-condition',
+    'style-warning', 'type-error', 'unbound-variable', 'unbound-slot',
+    'undefined-function', 'warning',
+))
+
+BUILTIN_CLASSES = set((
+    'array', 'broadcast-stream', 'bit-vector', 'built-in-class', 'character',
+    'class', 'complex', 'concatenated-stream', 'cons', 'echo-stream',
+    'file-stream', 'float', 'function', 'generic-function', 'hash-table',
+    'integer', 'list', 'logical-pathname', 'method-combination', 'method',
+    'null', 'number', 'package', 'pathname', 'ratio', 'rational', 'readtable',
+    'real', 'random-state', 'restart', 'sequence', 'standard-class',
+    'standard-generic-function', 'standard-method', 'standard-object',
+    'string-stream', 'stream', 'string', 'structure-class', 'structure-object',
+    'symbol', 'synonym-stream', 't', 'two-way-stream', 'vector',
+))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/iolang.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/iolang.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/iolang.py	(revision 1126)
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.iolang
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Io language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number
+
+__all__ = ['IoLexer']
+
+
+class IoLexer(RegexLexer):
+    """
+    For `Io <http://iolanguage.com/>`_ (a small, prototype-based
+    programming language) source.
+
+    .. versionadded:: 0.10
+    """
+    name = 'Io'
+    filenames = ['*.io']
+    aliases = ['io']
+    mimetypes = ['text/x-iosrc']
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            # Comments
+            (r'//(.*?)\n', Comment.Single),
+            (r'#(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'/\+', Comment.Multiline, 'nestedcomment'),
+            # DoubleQuotedString
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # Operators
+            (r'::=|:=|=|\(|\)|;|,|\*|-|\+|>|<|@|!|/|\||\^|\.|%|&|\[|\]|\{|\}',
+             Operator),
+            # keywords
+            (r'(clone|do|doFile|doString|method|for|if|else|elseif|then)\b',
+             Keyword),
+            # constants
+            (r'(nil|false|true)\b', Name.Constant),
+            # names
+            (r'(Object|list|List|Map|args|Sequence|Coroutine|File)\b',
+             Name.Builtin),
+            ('[a-zA-Z_]\w*', Name),
+            # numbers
+            (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+        'nestedcomment': [
+            (r'[^+/]+', Comment.Multiline),
+            (r'/\+', Comment.Multiline, '#push'),
+            (r'\+/', Comment.Multiline, '#pop'),
+            (r'[+/]', Comment.Multiline),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ezhil.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ezhil.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ezhil.py	(revision 1126)
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ezhil
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for Ezhil language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Keyword, Text, Comment, Name
+from pygments.token import String, Number, Punctuation, Operator
+
+__all__ = ['EzhilLexer']
+
+
+class EzhilLexer(RegexLexer):
+    """
+    Lexer for `Ezhil, a Tamil script-based programming language <http://ezhillang.org>`_
+
+    .. versionadded:: 2.1
+    """
+    name = 'Ezhil'
+    aliases = ['ezhil']
+    filenames = ['*.n']
+    mimetypes = ['text/x-ezhil']
+    flags = re.MULTILINE | re.UNICODE
+    # Refer to tamil.utf8.tamil_letters from open-tamil for a stricter version of this.
+    # This much simpler version is close enough, and includes combining marks.
+    _TALETTERS = u'[a-zA-Z_]|[\u0b80-\u0bff]'
+    tokens = {
+        'root': [
+            include('keywords'),
+            (r'#.*\n', Comment.Single),
+            (r'[@+/*,^\-%]|[!<>=]=?|&&?|\|\|?', Operator),
+            (u'இல்', Operator.Word),
+            (words((u'assert', u'max', u'min',
+                    u'நீளம்', u'சரம்_இடமாற்று', u'சரம்_கண்டுபிடி',
+                    u'பட்டியல்', u'பின்இணை', u'வரிசைப்படுத்து',
+                    u'எடு', u'தலைகீழ்', u'நீட்டிக்க', u'நுழைக்க', u'வை',
+                    u'கோப்பை_திற', u'கோப்பை_எழுது', u'கோப்பை_மூடு',
+                    u'pi', u'sin', u'cos', u'tan', u'sqrt', u'hypot', u'pow',
+                    u'exp', u'log', u'log10', u'exit',
+                    ), suffix=r'\b'), Name.Builtin),
+            (r'(True|False)\b', Keyword.Constant),
+            (r'[^\S\n]+', Text),
+            include('identifier'),
+            include('literal'),
+            (r'[(){}\[\]:;.]', Punctuation),
+        ],
+        'keywords': [
+            (u'பதிப்பி|தேர்ந்தெடு|தேர்வு|ஏதேனில்|ஆனால்|இல்லைஆனால்|இல்லை|ஆக|ஒவ்வொன்றாக|இல்|வரை|செய்|முடியேனில்|பின்கொடு|முடி|நிரல்பாகம்|தொடர்|நிறுத்து|நிரல்பாகம்', Keyword),
+        ],
+        'identifier': [
+            (u'(?:'+_TALETTERS+u')(?:[0-9]|'+_TALETTERS+u')*', Name),
+        ],
+        'literal': [
+            (r'".*?"', String),
+            (r'(?u)\d+((\.\d*)?[eE][+-]?\d+|\.\d*)', Number.Float),
+            (r'(?u)\d+', Number.Integer),
+        ]
+    }
+
+    def __init__(self, **options):
+        super(EzhilLexer, self).__init__(**options)
+        self.encoding = options.get('encoding', 'utf-8')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/elm.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/elm.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/elm.py	(revision 1126)
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.elm
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Elm programming language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Comment, Keyword, Name, Number, Punctuation, String, Text
+
+__all__ = ['ElmLexer']
+
+
+class ElmLexer(RegexLexer):
+    """
+    For `Elm <http://elm-lang.org/>`_ source code.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Elm'
+    aliases = ['elm']
+    filenames = ['*.elm']
+    mimetypes = ['text/x-elm']
+
+    validName = r'[a-z_][a-zA-Z_\']*'
+
+    specialName = r'^main '
+
+    builtinOps = (
+        '~', '||', '|>', '|', '`', '^', '\\', '\'', '>>', '>=', '>', '==',
+        '=', '<~', '<|', '<=', '<<', '<-', '<', '::', ':', '/=', '//', '/',
+        '..', '.', '->', '-', '++', '+', '*', '&&', '%',
+    )
+
+    reservedWords = words((
+        'alias', 'as', 'case', 'else', 'if', 'import', 'in',
+        'let', 'module', 'of', 'port', 'then', 'type', 'where',
+        ), suffix=r'\b')
+
+    tokens = {
+        'root': [
+
+            # Comments
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'--.*', Comment.Single),
+
+            # Whitespace
+            (r'\s+', Text),
+
+            # Strings
+            (r'"', String, 'doublequote'),
+
+            # Modules
+            (r'^\s*module\s*', Keyword.Namespace, 'imports'),
+
+            # Imports
+            (r'^\s*import\s*', Keyword.Namespace, 'imports'),
+
+            # Shaders
+            (r'\[glsl\|.*', Name.Entity, 'shader'),
+
+            # Keywords
+            (reservedWords, Keyword.Reserved),
+
+            # Types
+            (r'[A-Z]\w*', Keyword.Type),
+
+            # Main
+            (specialName, Keyword.Reserved),
+
+            # Prefix Operators
+            (words((builtinOps), prefix=r'\(', suffix=r'\)'), Name.Function),
+
+            # Infix Operators
+            (words((builtinOps)), Name.Function),
+
+            # Numbers
+            include('numbers'),
+
+            # Variable Names
+            (validName, Name.Variable),
+
+            # Parens
+            (r'[,()\[\]{}]', Punctuation),
+
+        ],
+
+        'comment': [
+            (r'-(?!\})', Comment.Multiline),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'[^-}]', Comment.Multiline),
+            (r'-\}', Comment.Multiline, '#pop'),
+        ],
+
+        'doublequote': [
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\[nrfvb\\"]', String.Escape),
+            (r'[^"]', String),
+            (r'"', String, '#pop'),
+        ],
+
+        'imports': [
+            (r'\w+(\.\w+)*', Name.Class, '#pop'),
+        ],
+
+        'numbers': [
+            (r'_?\d+\.(?=\d+)', Number.Float),
+            (r'_?\d+', Number.Integer),
+        ],
+
+        'shader': [
+            (r'\|(?!\])', Name.Entity),
+            (r'\|\]', Name.Entity, '#pop'),
+            (r'.*\n', Name.Entity),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/bibtex.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/bibtex.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/bibtex.py	(revision 1126)
@@ -0,0 +1,160 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.bibtex
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for BibTeX bibliography data and styles
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, default, \
+    words
+from pygments.token import Name, Comment, String, Error, Number, Text, \
+    Keyword, Punctuation
+
+__all__ = ['BibTeXLexer', 'BSTLexer']
+
+
+class BibTeXLexer(ExtendedRegexLexer):
+    """
+    A lexer for BibTeX bibliography data format.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'BibTeX'
+    aliases = ['bib', 'bibtex']
+    filenames = ['*.bib']
+    mimetypes = ["text/x-bibtex"]
+    flags = re.IGNORECASE
+
+    ALLOWED_CHARS = r'@!$&*+\-./:;<>?\[\\\]^`|~'
+    IDENTIFIER = '[{0}][{1}]*'.format('a-z_' + ALLOWED_CHARS, r'\w' + ALLOWED_CHARS)
+
+    def open_brace_callback(self, match, ctx):
+        opening_brace = match.group()
+        ctx.opening_brace = opening_brace
+        yield match.start(), Punctuation, opening_brace
+        ctx.pos = match.end()
+
+    def close_brace_callback(self, match, ctx):
+        closing_brace = match.group()
+        if (
+            ctx.opening_brace == '{' and closing_brace != '}' or
+            ctx.opening_brace == '(' and closing_brace != ')'
+        ):
+            yield match.start(), Error, closing_brace
+        else:
+            yield match.start(), Punctuation, closing_brace
+        del ctx.opening_brace
+        ctx.pos = match.end()
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            ('@comment', Comment),
+            ('@preamble', Name.Class, ('closing-brace', 'value', 'opening-brace')),
+            ('@string', Name.Class, ('closing-brace', 'field', 'opening-brace')),
+            ('@' + IDENTIFIER, Name.Class,
+             ('closing-brace', 'command-body', 'opening-brace')),
+            ('.+', Comment),
+        ],
+        'opening-brace': [
+            include('whitespace'),
+            (r'[{(]', open_brace_callback, '#pop'),
+        ],
+        'closing-brace': [
+            include('whitespace'),
+            (r'[})]', close_brace_callback, '#pop'),
+        ],
+        'command-body': [
+            include('whitespace'),
+            (r'[^\s\,\}]+', Name.Label, ('#pop', 'fields')),
+        ],
+        'fields': [
+            include('whitespace'),
+            (',', Punctuation, 'field'),
+            default('#pop'),
+        ],
+        'field': [
+            include('whitespace'),
+            (IDENTIFIER, Name.Attribute, ('value', '=')),
+            default('#pop'),
+        ],
+        '=': [
+            include('whitespace'),
+            ('=', Punctuation, '#pop'),
+        ],
+        'value': [
+            include('whitespace'),
+            (IDENTIFIER, Name.Variable),
+            ('"', String, 'quoted-string'),
+            (r'\{', String, 'braced-string'),
+            (r'[\d]+', Number),
+            ('#', Punctuation),
+            default('#pop'),
+        ],
+        'quoted-string': [
+            (r'\{', String, 'braced-string'),
+            ('"', String, '#pop'),
+            ('[^\{\"]+', String),
+        ],
+        'braced-string': [
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+            ('[^\{\}]+', String),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+    }
+
+
+class BSTLexer(RegexLexer):
+    """
+    A lexer for BibTeX bibliography styles.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'BST'
+    aliases = ['bst', 'bst-pybtex']
+    filenames = ['*.bst']
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (words(['read', 'sort']), Keyword),
+            (words(['execute', 'integers', 'iterate', 'reverse', 'strings']),
+             Keyword, ('group')),
+            (words(['function', 'macro']), Keyword, ('group', 'group')),
+            (words(['entry']), Keyword, ('group', 'group', 'group')),
+        ],
+        'group': [
+            include('whitespace'),
+            (r'\{', Punctuation, ('#pop', 'group-end', 'body')),
+        ],
+        'group-end': [
+            include('whitespace'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'body': [
+            include('whitespace'),
+            (r"\'[^#\"\{\}\s]+", Name.Function),
+            (r'[^#\"\{\}\s]+\$', Name.Builtin),
+            (r'[^#\"\{\}\s]+', Name.Variable),
+            (r'"[^\"]*"', String),
+            (r'#-?\d+', Number),
+            (r'\{', Punctuation, ('group-end', 'body')),
+            default('#pop'),
+        ],
+        'whitespace': [
+            ('\s+', Text),
+            ('%.*?$', Comment.SingleLine),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/asm.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/asm.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/asm.py	(revision 1126)
@@ -0,0 +1,641 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.asm
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for assembly languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, words, \
+    DelegatingLexer
+from pygments.lexers.c_cpp import CppLexer, CLexer
+from pygments.lexers.d import DLexer
+from pygments.token import Text, Name, Number, String, Comment, Punctuation, \
+    Other, Keyword, Operator
+
+__all__ = ['GasLexer', 'ObjdumpLexer', 'DObjdumpLexer', 'CppObjdumpLexer',
+           'CObjdumpLexer', 'HsailLexer', 'LlvmLexer', 'NasmLexer',
+           'NasmObjdumpLexer', 'TasmLexer', 'Ca65Lexer']
+
+
+class GasLexer(RegexLexer):
+    """
+    For Gas (AT&T) assembly code.
+    """
+    name = 'GAS'
+    aliases = ['gas', 'asm']
+    filenames = ['*.s', '*.S']
+    mimetypes = ['text/x-gas']
+
+    #: optional Comment or Whitespace
+    string = r'"(\\"|[^"])*"'
+    char = r'[\w$.@-]'
+    identifier = r'(?:[a-zA-Z$_]' + char + '*|\.' + char + '+)'
+    number = r'(?:0[xX][a-zA-Z0-9]+|\d+)'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (identifier + ':', Name.Label),
+            (r'\.' + identifier, Name.Attribute, 'directive-args'),
+            (r'lock|rep(n?z)?|data\d+', Name.Attribute),
+            (identifier, Name.Function, 'instruction-args'),
+            (r'[\r\n]+', Text)
+        ],
+        'directive-args': [
+            (identifier, Name.Constant),
+            (string, String),
+            ('@' + identifier, Name.Attribute),
+            (number, Number.Integer),
+            (r'[\r\n]+', Text, '#pop'),
+
+            include('punctuation'),
+            include('whitespace')
+        ],
+        'instruction-args': [
+            # For objdump-disassembled code, shouldn't occur in
+            # actual assembler input
+            ('([a-z0-9]+)( )(<)('+identifier+')(>)',
+                bygroups(Number.Hex, Text, Punctuation, Name.Constant,
+                         Punctuation)),
+            ('([a-z0-9]+)( )(<)('+identifier+')([-+])('+number+')(>)',
+                bygroups(Number.Hex, Text, Punctuation, Name.Constant,
+                         Punctuation, Number.Integer, Punctuation)),
+
+            # Address constants
+            (identifier, Name.Constant),
+            (number, Number.Integer),
+            # Registers
+            ('%' + identifier, Name.Variable),
+            # Numeric constants
+            ('$'+number, Number.Integer),
+            (r"$'(.|\\')'", String.Char),
+            (r'[\r\n]+', Text, '#pop'),
+
+            include('punctuation'),
+            include('whitespace')
+        ],
+        'whitespace': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'[;#].*?\n', Comment)
+        ],
+        'punctuation': [
+            (r'[-*,.()\[\]!:]+', Punctuation)
+        ]
+    }
+
+    def analyse_text(text):
+        if re.match(r'^\.(text|data|section)', text, re.M):
+            return True
+        elif re.match(r'^\.\w+', text, re.M):
+            return 0.1
+
+
+def _objdump_lexer_tokens(asm_lexer):
+    """
+    Common objdump lexer tokens to wrap an ASM lexer.
+    """
+    hex_re = r'[0-9A-Za-z]'
+    return {
+        'root': [
+            # File name & format:
+            ('(.*?)(:)( +file format )(.*?)$',
+                bygroups(Name.Label, Punctuation, Text, String)),
+            # Section header
+            ('(Disassembly of section )(.*?)(:)$',
+                bygroups(Text, Name.Label, Punctuation)),
+            # Function labels
+            # (With offset)
+            ('('+hex_re+'+)( )(<)(.*?)([-+])(0[xX][A-Za-z0-9]+)(>:)$',
+                bygroups(Number.Hex, Text, Punctuation, Name.Function,
+                         Punctuation, Number.Hex, Punctuation)),
+            # (Without offset)
+            ('('+hex_re+'+)( )(<)(.*?)(>:)$',
+                bygroups(Number.Hex, Text, Punctuation, Name.Function,
+                         Punctuation)),
+            # Code line with disassembled instructions
+            ('( *)('+hex_re+r'+:)(\t)((?:'+hex_re+hex_re+' )+)( *\t)([a-zA-Z].*?)$',
+                bygroups(Text, Name.Label, Text, Number.Hex, Text,
+                         using(asm_lexer))),
+            # Code line with ascii
+            ('( *)('+hex_re+r'+:)(\t)((?:'+hex_re+hex_re+' )+)( *)(.*?)$',
+                bygroups(Text, Name.Label, Text, Number.Hex, Text, String)),
+            # Continued code line, only raw opcodes without disassembled
+            # instruction
+            ('( *)('+hex_re+r'+:)(\t)((?:'+hex_re+hex_re+' )+)$',
+                bygroups(Text, Name.Label, Text, Number.Hex)),
+            # Skipped a few bytes
+            (r'\t\.\.\.$', Text),
+            # Relocation line
+            # (With offset)
+            (r'(\t\t\t)('+hex_re+r'+:)( )([^\t]+)(\t)(.*?)([-+])(0x'+hex_re+'+)$',
+                bygroups(Text, Name.Label, Text, Name.Property, Text,
+                         Name.Constant, Punctuation, Number.Hex)),
+            # (Without offset)
+            (r'(\t\t\t)('+hex_re+r'+:)( )([^\t]+)(\t)(.*?)$',
+                bygroups(Text, Name.Label, Text, Name.Property, Text,
+                         Name.Constant)),
+            (r'[^\n]+\n', Other)
+        ]
+    }
+
+
+class ObjdumpLexer(RegexLexer):
+    """
+    For the output of 'objdump -dr'
+    """
+    name = 'objdump'
+    aliases = ['objdump']
+    filenames = ['*.objdump']
+    mimetypes = ['text/x-objdump']
+
+    tokens = _objdump_lexer_tokens(GasLexer)
+
+
+class DObjdumpLexer(DelegatingLexer):
+    """
+    For the output of 'objdump -Sr on compiled D files'
+    """
+    name = 'd-objdump'
+    aliases = ['d-objdump']
+    filenames = ['*.d-objdump']
+    mimetypes = ['text/x-d-objdump']
+
+    def __init__(self, **options):
+        super(DObjdumpLexer, self).__init__(DLexer, ObjdumpLexer, **options)
+
+
+class CppObjdumpLexer(DelegatingLexer):
+    """
+    For the output of 'objdump -Sr on compiled C++ files'
+    """
+    name = 'cpp-objdump'
+    aliases = ['cpp-objdump', 'c++-objdumb', 'cxx-objdump']
+    filenames = ['*.cpp-objdump', '*.c++-objdump', '*.cxx-objdump']
+    mimetypes = ['text/x-cpp-objdump']
+
+    def __init__(self, **options):
+        super(CppObjdumpLexer, self).__init__(CppLexer, ObjdumpLexer, **options)
+
+
+class CObjdumpLexer(DelegatingLexer):
+    """
+    For the output of 'objdump -Sr on compiled C files'
+    """
+    name = 'c-objdump'
+    aliases = ['c-objdump']
+    filenames = ['*.c-objdump']
+    mimetypes = ['text/x-c-objdump']
+
+    def __init__(self, **options):
+        super(CObjdumpLexer, self).__init__(CLexer, ObjdumpLexer, **options)
+
+
+class HsailLexer(RegexLexer):
+    """
+    For HSAIL assembly code.
+
+    .. versionadded:: 2.2
+    """
+    name = 'HSAIL'
+    aliases = ['hsail', 'hsa']
+    filenames = ['*.hsail']
+    mimetypes = ['text/x-hsail']
+
+    string = r'"[^"]*?"'
+    identifier = r'[a-zA-Z_][\w.]*'
+    # Registers
+    register_number = r'[0-9]+'
+    register = r'(\$(c|s|d|q)' + register_number + ')'
+    # Qualifiers
+    alignQual = r'(align\(\d+\))'
+    widthQual = r'(width\((\d+|all)\))'
+    allocQual = r'(alloc\(agent\))'
+    # Instruction Modifiers
+    roundingMod = (r'((_ftz)?(_up|_down|_zero|_near))')
+    datatypeMod = (r'_('
+                   # packedTypes
+                   r'u8x4|s8x4|u16x2|s16x2|u8x8|s8x8|u16x4|s16x4|u32x2|s32x2|'
+                   r'u8x16|s8x16|u16x8|s16x8|u32x4|s32x4|u64x2|s64x2|'
+                   r'f16x2|f16x4|f16x8|f32x2|f32x4|f64x2|'
+                   # baseTypes
+                   r'u8|s8|u16|s16|u32|s32|u64|s64|'
+                   r'b128|b8|b16|b32|b64|b1|'
+                   r'f16|f32|f64|'
+                   # opaqueType
+                   r'roimg|woimg|rwimg|samp|sig32|sig64)')
+
+    # Numeric Constant
+    float = r'((\d+\.)|(\d*\.\d+))[eE][+-]?\d+'
+    hexfloat = r'0[xX](([0-9a-fA-F]+\.[0-9a-fA-F]*)|([0-9a-fA-F]*\.[0-9a-fA-F]+))[pP][+-]?\d+'
+    ieeefloat = r'0((h|H)[0-9a-fA-F]{4}|(f|F)[0-9a-fA-F]{8}|(d|D)[0-9a-fA-F]{16})'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+
+            (string, String),
+
+            (r'@' + identifier + ':?', Name.Label),
+
+            (register, Name.Variable.Anonymous),
+
+            include('keyword'),
+
+            (r'&' + identifier, Name.Variable.Global),
+            (r'%' + identifier, Name.Variable),
+
+            (hexfloat, Number.Hex),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (ieeefloat, Number.Float),
+            (float, Number.Float),
+            ('\d+', Number.Integer),
+
+            (r'[=<>{}\[\]()*.,:;!]|x\b', Punctuation)
+        ],
+        'whitespace': [
+            (r'(\n|\s)+', Text),
+        ],
+        'comments': [
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Singleline),
+        ],
+        'keyword': [
+            # Types
+            (r'kernarg' + datatypeMod, Keyword.Type),
+
+            # Regular keywords
+            (r'\$(full|base|small|large|default|zero|near)', Keyword),
+            (words((
+                'module', 'extension', 'pragma', 'prog', 'indirect', 'signature',
+                'decl', 'kernel', 'function', 'enablebreakexceptions',
+                'enabledetectexceptions', 'maxdynamicgroupsize', 'maxflatgridsize',
+                'maxflatworkgroupsize', 'requireddim', 'requiredgridsize',
+                'requiredworkgroupsize', 'requirenopartialworkgroups'),
+                suffix=r'\b'), Keyword),
+
+            # instructions
+            (roundingMod, Keyword),
+            (datatypeMod, Keyword),
+            (r'_(' + alignQual + '|' + widthQual + ')', Keyword),
+            (r'_kernarg', Keyword),
+            (r'(nop|imagefence)\b', Keyword),
+            (words((
+                'cleardetectexcept', 'clock', 'cuid', 'debugtrap', 'dim',
+                'getdetectexcept', 'groupbaseptr', 'kernargbaseptr', 'laneid',
+                'maxcuid', 'maxwaveid', 'packetid', 'setdetectexcept', 'waveid',
+                'workitemflatabsid', 'workitemflatid', 'nullptr', 'abs', 'bitrev',
+                'currentworkgroupsize', 'currentworkitemflatid', 'fract', 'ncos',
+                'neg', 'nexp2', 'nlog2', 'nrcp', 'nrsqrt', 'nsin', 'nsqrt',
+                'gridgroups', 'gridsize', 'not', 'sqrt', 'workgroupid',
+                'workgroupsize', 'workitemabsid', 'workitemid', 'ceil', 'floor',
+                'rint', 'trunc', 'add', 'bitmask', 'borrow', 'carry', 'copysign',
+                'div', 'rem', 'sub', 'shl', 'shr', 'and', 'or', 'xor', 'unpackhi',
+                'unpacklo', 'max', 'min', 'fma', 'mad', 'bitextract', 'bitselect',
+                'shuffle', 'cmov', 'bitalign', 'bytealign', 'lerp', 'nfma', 'mul',
+                'mulhi', 'mul24hi', 'mul24', 'mad24', 'mad24hi', 'bitinsert',
+                'combine', 'expand', 'lda', 'mov', 'pack', 'unpack', 'packcvt',
+                'unpackcvt', 'sad', 'sementp', 'ftos', 'stof', 'cmp', 'ld', 'st',
+                '_eq', '_ne', '_lt', '_le', '_gt', '_ge', '_equ', '_neu', '_ltu',
+                '_leu', '_gtu', '_geu', '_num', '_nan', '_seq', '_sne', '_slt',
+                '_sle', '_sgt', '_sge', '_snum', '_snan', '_sequ', '_sneu', '_sltu',
+                '_sleu', '_sgtu', '_sgeu', 'atomic', '_ld', '_st', '_cas', '_add',
+                '_and', '_exch', '_max', '_min', '_or', '_sub', '_wrapdec',
+                '_wrapinc', '_xor', 'ret', 'cvt', '_readonly', '_kernarg', '_global',
+                'br', 'cbr', 'sbr', '_scacq', '_screl', '_scar', '_rlx', '_wave',
+                '_wg', '_agent', '_system', 'ldimage', 'stimage', '_v2', '_v3', '_v4',
+                '_1d', '_2d', '_3d', '_1da', '_2da', '_1db', '_2ddepth', '_2dadepth',
+                '_width', '_height', '_depth', '_array', '_channelorder',
+                '_channeltype', 'querysampler', '_coord', '_filter', '_addressing',
+                'barrier', 'wavebarrier', 'initfbar', 'joinfbar', 'waitfbar',
+                'arrivefbar', 'leavefbar', 'releasefbar', 'ldf', 'activelaneid',
+                'activelanecount', 'activelanemask', 'activelanepermute', 'call',
+                'scall', 'icall', 'alloca', 'packetcompletionsig',
+                'addqueuewriteindex', 'casqueuewriteindex', 'ldqueuereadindex',
+                'stqueuereadindex', 'readonly', 'global', 'private', 'group',
+                'spill', 'arg', '_upi', '_downi', '_zeroi', '_neari', '_upi_sat',
+                '_downi_sat', '_zeroi_sat', '_neari_sat', '_supi', '_sdowni',
+                '_szeroi', '_sneari', '_supi_sat', '_sdowni_sat', '_szeroi_sat',
+                '_sneari_sat', '_pp', '_ps', '_sp', '_ss', '_s', '_p', '_pp_sat',
+                '_ps_sat', '_sp_sat', '_ss_sat', '_s_sat', '_p_sat')), Keyword),
+
+            # Integer types
+            (r'i[1-9]\d*', Keyword)
+        ]
+    }
+
+
+class LlvmLexer(RegexLexer):
+    """
+    For LLVM assembly code.
+    """
+    name = 'LLVM'
+    aliases = ['llvm']
+    filenames = ['*.ll']
+    mimetypes = ['text/x-llvm']
+
+    #: optional Comment or Whitespace
+    string = r'"[^"]*?"'
+    identifier = r'([-a-zA-Z$._][\w\-$.]*|' + string + ')'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # Before keywords, because keywords are valid label names :(...
+            (identifier + '\s*:', Name.Label),
+
+            include('keyword'),
+
+            (r'%' + identifier, Name.Variable),
+            (r'@' + identifier, Name.Variable.Global),
+            (r'%\d+', Name.Variable.Anonymous),
+            (r'@\d+', Name.Variable.Global),
+            (r'#\d+', Name.Variable.Global),
+            (r'!' + identifier, Name.Variable),
+            (r'!\d+', Name.Variable.Anonymous),
+            (r'c?' + string, String),
+
+            (r'0[xX][a-fA-F0-9]+', Number),
+            (r'-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?', Number),
+
+            (r'[=<>{}\[\]()*.,!]|x\b', Punctuation)
+        ],
+        'whitespace': [
+            (r'(\n|\s)+', Text),
+            (r';.*?\n', Comment)
+        ],
+        'keyword': [
+            # Regular keywords
+            (words((
+                'begin', 'end', 'true', 'false', 'declare', 'define', 'global',
+                'constant', 'private', 'linker_private', 'internal',
+                'available_externally', 'linkonce', 'linkonce_odr', 'weak',
+                'weak_odr', 'appending', 'dllimport', 'dllexport', 'common',
+                'default', 'hidden', 'protected', 'extern_weak', 'external',
+                'thread_local', 'zeroinitializer', 'undef', 'null', 'to', 'tail',
+                'target', 'triple', 'datalayout', 'volatile', 'nuw', 'nsw', 'nnan',
+                'ninf', 'nsz', 'arcp', 'fast', 'exact', 'inbounds', 'align',
+                'addrspace', 'section', 'alias', 'module', 'asm', 'sideeffect',
+                'gc', 'dbg', 'linker_private_weak', 'attributes', 'blockaddress',
+                'initialexec', 'localdynamic', 'localexec', 'prefix', 'unnamed_addr',
+                'ccc', 'fastcc', 'coldcc', 'x86_stdcallcc', 'x86_fastcallcc',
+                'arm_apcscc', 'arm_aapcscc', 'arm_aapcs_vfpcc', 'ptx_device',
+                'ptx_kernel', 'intel_ocl_bicc', 'msp430_intrcc', 'spir_func',
+                'spir_kernel', 'x86_64_sysvcc', 'x86_64_win64cc', 'x86_thiscallcc',
+                'cc', 'c', 'signext', 'zeroext', 'inreg', 'sret', 'nounwind',
+                'noreturn', 'noalias', 'nocapture', 'byval', 'nest', 'readnone',
+                'readonly', 'inlinehint', 'noinline', 'alwaysinline', 'optsize', 'ssp',
+                'sspreq', 'noredzone', 'noimplicitfloat', 'naked', 'builtin', 'cold',
+                'nobuiltin', 'noduplicate', 'nonlazybind', 'optnone', 'returns_twice',
+                'sanitize_address', 'sanitize_memory', 'sanitize_thread', 'sspstrong',
+                'uwtable', 'returned', 'type', 'opaque', 'eq', 'ne', 'slt', 'sgt',
+                'sle', 'sge', 'ult', 'ugt', 'ule', 'uge', 'oeq', 'one', 'olt', 'ogt',
+                'ole', 'oge', 'ord', 'uno', 'ueq', 'une', 'x', 'acq_rel', 'acquire',
+                'alignstack', 'atomic', 'catch', 'cleanup', 'filter', 'inteldialect',
+                'max', 'min', 'monotonic', 'nand', 'personality', 'release', 'seq_cst',
+                'singlethread', 'umax', 'umin', 'unordered', 'xchg', 'add', 'fadd',
+                'sub', 'fsub', 'mul', 'fmul', 'udiv', 'sdiv', 'fdiv', 'urem', 'srem',
+                'frem', 'shl', 'lshr', 'ashr', 'and', 'or', 'xor', 'icmp', 'fcmp',
+                'phi', 'call', 'trunc', 'zext', 'sext', 'fptrunc', 'fpext', 'uitofp',
+                'sitofp', 'fptoui', 'fptosi', 'inttoptr', 'ptrtoint', 'bitcast',
+                'addrspacecast', 'select', 'va_arg', 'ret', 'br', 'switch', 'invoke',
+                'unwind', 'unreachable', 'indirectbr', 'landingpad', 'resume',
+                'malloc', 'alloca', 'free', 'load', 'store', 'getelementptr',
+                'extractelement', 'insertelement', 'shufflevector', 'getresult',
+                'extractvalue', 'insertvalue', 'atomicrmw', 'cmpxchg', 'fence',
+                'allocsize', 'amdgpu_cs', 'amdgpu_gs', 'amdgpu_kernel', 'amdgpu_ps',
+                'amdgpu_vs', 'any', 'anyregcc', 'argmemonly', 'avr_intrcc',
+                'avr_signalcc', 'caller', 'catchpad', 'catchret', 'catchswitch',
+                'cleanuppad', 'cleanupret', 'comdat', 'convergent', 'cxx_fast_tlscc',
+                'deplibs', 'dereferenceable', 'dereferenceable_or_null', 'distinct',
+                'exactmatch', 'externally_initialized', 'from', 'ghccc', 'hhvm_ccc',
+                'hhvmcc', 'ifunc', 'inaccessiblemem_or_argmemonly', 'inaccessiblememonly',
+                'inalloca', 'jumptable', 'largest', 'local_unnamed_addr', 'minsize',
+                'musttail', 'noduplicates', 'none', 'nonnull', 'norecurse', 'notail',
+                'preserve_allcc', 'preserve_mostcc', 'prologue', 'safestack', 'samesize',
+                'source_filename', 'swiftcc', 'swifterror', 'swiftself', 'webkit_jscc',
+                'within', 'writeonly', 'x86_intrcc', 'x86_vectorcallcc'),
+                suffix=r'\b'), Keyword),
+
+            # Types
+            (words(('void', 'half', 'float', 'double', 'x86_fp80', 'fp128',
+                    'ppc_fp128', 'label', 'metadata', 'token')), Keyword.Type),
+
+            # Integer types
+            (r'i[1-9]\d*', Keyword)
+        ]
+    }
+
+
+class NasmLexer(RegexLexer):
+    """
+    For Nasm (Intel) assembly code.
+    """
+    name = 'NASM'
+    aliases = ['nasm']
+    filenames = ['*.asm', '*.ASM']
+    mimetypes = ['text/x-nasm']
+
+    identifier = r'[a-z$._?][\w$.?#@~]*'
+    hexn = r'(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)'
+    octn = r'[0-7]+q'
+    binn = r'[01]+b'
+    decn = r'[0-9]+'
+    floatn = decn + r'\.e?' + decn
+    string = r'"(\\"|[^"\n])*"|' + r"'(\\'|[^'\n])*'|" + r"`(\\`|[^`\n])*`"
+    declkw = r'(?:res|d)[bwdqt]|times'
+    register = (r'r[0-9][0-5]?[bwd]|'
+                r'[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|'
+                r'mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]')
+    wordop = r'seg|wrt|strict'
+    type = r'byte|[dq]?word'
+    directives = (r'BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|'
+                  r'ORG|ALIGN|STRUC|ENDSTRUC|COMMON|CPU|GROUP|UPPERCASE|IMPORT|'
+                  r'EXPORT|LIBRARY|MODULE')
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'^\s*%', Comment.Preproc, 'preproc'),
+            include('whitespace'),
+            (identifier + ':', Name.Label),
+            (r'(%s)(\s+)(equ)' % identifier,
+                bygroups(Name.Constant, Keyword.Declaration, Keyword.Declaration),
+                'instruction-args'),
+            (directives, Keyword, 'instruction-args'),
+            (declkw, Keyword.Declaration, 'instruction-args'),
+            (identifier, Name.Function, 'instruction-args'),
+            (r'[\r\n]+', Text)
+        ],
+        'instruction-args': [
+            (string, String),
+            (hexn, Number.Hex),
+            (octn, Number.Oct),
+            (binn, Number.Bin),
+            (floatn, Number.Float),
+            (decn, Number.Integer),
+            include('punctuation'),
+            (register, Name.Builtin),
+            (identifier, Name.Variable),
+            (r'[\r\n]+', Text, '#pop'),
+            include('whitespace')
+        ],
+        'preproc': [
+            (r'[^;\n]+', Comment.Preproc),
+            (r';.*?\n', Comment.Single, '#pop'),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'whitespace': [
+            (r'\n', Text),
+            (r'[ \t]+', Text),
+            (r';.*', Comment.Single)
+        ],
+        'punctuation': [
+            (r'[,():\[\]]+', Punctuation),
+            (r'[&|^<>+*/%~-]+', Operator),
+            (r'[$]+', Keyword.Constant),
+            (wordop, Operator.Word),
+            (type, Keyword.Type)
+        ],
+    }
+
+
+class NasmObjdumpLexer(ObjdumpLexer):
+    """
+    For the output of 'objdump -d -M intel'.
+
+    .. versionadded:: 2.0
+    """
+    name = 'objdump-nasm'
+    aliases = ['objdump-nasm']
+    filenames = ['*.objdump-intel']
+    mimetypes = ['text/x-nasm-objdump']
+
+    tokens = _objdump_lexer_tokens(NasmLexer)
+
+
+class TasmLexer(RegexLexer):
+    """
+    For Tasm (Turbo Assembler) assembly code.
+    """
+    name = 'TASM'
+    aliases = ['tasm']
+    filenames = ['*.asm', '*.ASM', '*.tasm']
+    mimetypes = ['text/x-tasm']
+
+    identifier = r'[@a-z$._?][\w$.?#@~]*'
+    hexn = r'(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)'
+    octn = r'[0-7]+q'
+    binn = r'[01]+b'
+    decn = r'[0-9]+'
+    floatn = decn + r'\.e?' + decn
+    string = r'"(\\"|[^"\n])*"|' + r"'(\\'|[^'\n])*'|" + r"`(\\`|[^`\n])*`"
+    declkw = r'(?:res|d)[bwdqt]|times'
+    register = (r'r[0-9][0-5]?[bwd]|'
+                r'[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|'
+                r'mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]')
+    wordop = r'seg|wrt|strict'
+    type = r'byte|[dq]?word'
+    directives = (r'BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|'
+                  r'ORG|ALIGN|STRUC|ENDSTRUC|ENDS|COMMON|CPU|GROUP|UPPERCASE|INCLUDE|'
+                  r'EXPORT|LIBRARY|MODULE|PROC|ENDP|USES|ARG|DATASEG|UDATASEG|END|IDEAL|'
+                  r'P386|MODEL|ASSUME|CODESEG|SIZE')
+    # T[A-Z][a-z] is more of a convention. Lexer should filter out STRUC definitions
+    # and then 'add' them to datatype somehow.
+    datatype = (r'db|dd|dw|T[A-Z][a-z]+')
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'^\s*%', Comment.Preproc, 'preproc'),
+            include('whitespace'),
+            (identifier + ':', Name.Label),
+            (directives, Keyword, 'instruction-args'),
+            (r'(%s)(\s+)(%s)' % (identifier, datatype),
+                bygroups(Name.Constant, Keyword.Declaration, Keyword.Declaration),
+                'instruction-args'),
+            (declkw, Keyword.Declaration, 'instruction-args'),
+            (identifier, Name.Function, 'instruction-args'),
+            (r'[\r\n]+', Text)
+        ],
+        'instruction-args': [
+            (string, String),
+            (hexn, Number.Hex),
+            (octn, Number.Oct),
+            (binn, Number.Bin),
+            (floatn, Number.Float),
+            (decn, Number.Integer),
+            include('punctuation'),
+            (register, Name.Builtin),
+            (identifier, Name.Variable),
+            # Do not match newline when it's preceeded by a backslash
+            (r'(\\\s*)(;.*)([\r\n])', bygroups(Text, Comment.Single, Text)),
+            (r'[\r\n]+', Text, '#pop'),
+            include('whitespace')
+        ],
+        'preproc': [
+            (r'[^;\n]+', Comment.Preproc),
+            (r';.*?\n', Comment.Single, '#pop'),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'whitespace': [
+            (r'[\n\r]', Text),
+            (r'\\[\n\r]', Text),
+            (r'[ \t]+', Text),
+            (r';.*', Comment.Single)
+        ],
+        'punctuation': [
+            (r'[,():\[\]]+', Punctuation),
+            (r'[&|^<>+*=/%~-]+', Operator),
+            (r'[$]+', Keyword.Constant),
+            (wordop, Operator.Word),
+            (type, Keyword.Type)
+        ],
+    }
+
+
+class Ca65Lexer(RegexLexer):
+    """
+    For ca65 assembler sources.
+
+    .. versionadded:: 1.6
+    """
+    name = 'ca65 assembler'
+    aliases = ['ca65']
+    filenames = ['*.s']
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r';.*', Comment.Single),
+            (r'\s+', Text),
+            (r'[a-z_.@$][\w.@$]*:', Name.Label),
+            (r'((ld|st)[axy]|(in|de)[cxy]|asl|lsr|ro[lr]|adc|sbc|cmp|cp[xy]'
+             r'|cl[cvdi]|se[cdi]|jmp|jsr|bne|beq|bpl|bmi|bvc|bvs|bcc|bcs'
+             r'|p[lh][ap]|rt[is]|brk|nop|ta[xy]|t[xy]a|txs|tsx|and|ora|eor'
+             r'|bit)\b', Keyword),
+            (r'\.\w+', Keyword.Pseudo),
+            (r'[-+~*/^&|!<>=]', Operator),
+            (r'"[^"\n]*.', String),
+            (r"'[^'\n]*.", String.Char),
+            (r'\$[0-9a-f]+|[0-9a-f]+h\b', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'%[01]+', Number.Bin),
+            (r'[#,.:()=\[\]]', Punctuation),
+            (r'[a-z_.@$][\w.@$]*', Name),
+        ]
+    }
+
+    def analyse_text(self, text):
+        # comments in GAS start with "#"
+        if re.match(r'^\s*;', text, re.MULTILINE):
+            return 0.9
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ooc.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ooc.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ooc.py	(revision 1126)
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ooc
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Ooc language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['OocLexer']
+
+
+class OocLexer(RegexLexer):
+    """
+    For `Ooc <http://ooc-lang.org/>`_ source code
+
+    .. versionadded:: 1.2
+    """
+    name = 'Ooc'
+    aliases = ['ooc']
+    filenames = ['*.ooc']
+    mimetypes = ['text/x-ooc']
+
+    tokens = {
+        'root': [
+            (words((
+                'class', 'interface', 'implement', 'abstract', 'extends', 'from',
+                'this', 'super', 'new', 'const', 'final', 'static', 'import',
+                'use', 'extern', 'inline', 'proto', 'break', 'continue',
+                'fallthrough', 'operator', 'if', 'else', 'for', 'while', 'do',
+                'switch', 'case', 'as', 'in', 'version', 'return', 'true',
+                'false', 'null'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (r'include\b', Keyword, 'include'),
+            (r'(cover)([ \t]+)(from)([ \t]+)(\w+[*@]?)',
+             bygroups(Keyword, Text, Keyword, Text, Name.Class)),
+            (r'(func)((?:[ \t]|\\\n)+)(~[a-z_]\w*)',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'\bfunc\b', Keyword),
+            # Note: %= and ^= not listed on http://ooc-lang.org/syntax
+            (r'//.*', Comment),
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            (r'(==?|\+=?|-[=>]?|\*=?|/=?|:=|!=?|%=?|\?|>{1,3}=?|<{1,3}=?|\.\.|'
+             r'&&?|\|\|?|\^=?)', Operator),
+            (r'(\.)([ \t]*)([a-z]\w*)', bygroups(Operator, Text,
+                                                 Name.Function)),
+            (r'[A-Z][A-Z0-9_]+', Name.Constant),
+            (r'[A-Z]\w*([@*]|\[[ \t]*\])?', Name.Class),
+
+            (r'([a-z]\w*(?:~[a-z]\w*)?)((?:[ \t]|\\\n)*)(?=\()',
+             bygroups(Name.Function, Text)),
+            (r'[a-z]\w*', Name.Variable),
+
+            # : introduces types
+            (r'[:(){}\[\];,]', Punctuation),
+
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'0c[0-9]+', Number.Oct),
+            (r'0b[01]+', Number.Bin),
+            (r'[0-9_]\.[0-9_]*(?!\.)', Number.Float),
+            (r'[0-9_]+', Number.Decimal),
+
+            (r'"(?:\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\"])*"',
+             String.Double),
+            (r"'(?:\\.|\\[0-9]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'",
+             String.Char),
+            (r'@', Punctuation),  # pointer dereference
+            (r'\.', Punctuation),  # imports or chain operator
+
+            (r'\\[ \t\n]', Text),
+            (r'[ \t]+', Text),
+        ],
+        'include': [
+            (r'[\w/]+', Name),
+            (r',', Punctuation),
+            (r'[ \t]', Text),
+            (r'[;\n]', Text, '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/basic.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/basic.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/basic.py	(revision 1126)
@@ -0,0 +1,500 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.basic
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for BASIC like languages (other than VB.net).
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default, words, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['BlitzBasicLexer', 'BlitzMaxLexer', 'MonkeyLexer', 'CbmBasicV2Lexer',
+           'QBasicLexer']
+
+
+class BlitzMaxLexer(RegexLexer):
+    """
+    For `BlitzMax <http://blitzbasic.com>`_ source code.
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'BlitzMax'
+    aliases = ['blitzmax', 'bmax']
+    filenames = ['*.bmx']
+    mimetypes = ['text/x-bmx']
+
+    bmax_vopwords = r'\b(Shl|Shr|Sar|Mod)\b'
+    bmax_sktypes = r'@{1,2}|[!#$%]'
+    bmax_lktypes = r'\b(Int|Byte|Short|Float|Double|Long)\b'
+    bmax_name = r'[a-z_]\w*'
+    bmax_var = (r'(%s)(?:(?:([ \t]*)(%s)|([ \t]*:[ \t]*\b(?:Shl|Shr|Sar|Mod)\b)'
+                r'|([ \t]*)(:)([ \t]*)(?:%s|(%s)))(?:([ \t]*)(Ptr))?)') % \
+        (bmax_name, bmax_sktypes, bmax_lktypes, bmax_name)
+    bmax_func = bmax_var + r'?((?:[ \t]|\.\.\n)*)([(])'
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            # Text
+            (r'[ \t]+', Text),
+            (r'\.\.\n', Text),  # Line continuation
+            # Comments
+            (r"'.*?\n", Comment.Single),
+            (r'([ \t]*)\bRem\n(\n|.)*?\s*\bEnd([ \t]*)Rem', Comment.Multiline),
+            # Data types
+            ('"', String.Double, 'string'),
+            # Numbers
+            (r'[0-9]+\.[0-9]*(?!\.)', Number.Float),
+            (r'\.[0-9]*(?!\.)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\$[0-9a-f]+', Number.Hex),
+            (r'\%[10]+', Number.Bin),
+            # Other
+            (r'(?:(?:(:)?([ \t]*)(:?%s|([+\-*/&|~]))|Or|And|Not|[=<>^]))' %
+             (bmax_vopwords), Operator),
+            (r'[(),.:\[\]]', Punctuation),
+            (r'(?:#[\w \t]*)', Name.Label),
+            (r'(?:\?[\w \t]*)', Comment.Preproc),
+            # Identifiers
+            (r'\b(New)\b([ \t]?)([(]?)(%s)' % (bmax_name),
+             bygroups(Keyword.Reserved, Text, Punctuation, Name.Class)),
+            (r'\b(Import|Framework|Module)([ \t]+)(%s\.%s)' %
+             (bmax_name, bmax_name),
+             bygroups(Keyword.Reserved, Text, Keyword.Namespace)),
+            (bmax_func, bygroups(Name.Function, Text, Keyword.Type,
+                                 Operator, Text, Punctuation, Text,
+                                 Keyword.Type, Name.Class, Text,
+                                 Keyword.Type, Text, Punctuation)),
+            (bmax_var, bygroups(Name.Variable, Text, Keyword.Type, Operator,
+                                Text, Punctuation, Text, Keyword.Type,
+                                Name.Class, Text, Keyword.Type)),
+            (r'\b(Type|Extends)([ \t]+)(%s)' % (bmax_name),
+             bygroups(Keyword.Reserved, Text, Name.Class)),
+            # Keywords
+            (r'\b(Ptr)\b', Keyword.Type),
+            (r'\b(Pi|True|False|Null|Self|Super)\b', Keyword.Constant),
+            (r'\b(Local|Global|Const|Field)\b', Keyword.Declaration),
+            (words((
+                'TNullMethodException', 'TNullFunctionException',
+                'TNullObjectException', 'TArrayBoundsException',
+                'TRuntimeException'), prefix=r'\b', suffix=r'\b'), Name.Exception),
+            (words((
+                'Strict', 'SuperStrict', 'Module', 'ModuleInfo',
+                'End', 'Return', 'Continue', 'Exit', 'Public', 'Private',
+                'Var', 'VarPtr', 'Chr', 'Len', 'Asc', 'SizeOf', 'Sgn', 'Abs', 'Min', 'Max',
+                'New', 'Release', 'Delete', 'Incbin', 'IncbinPtr', 'IncbinLen',
+                'Framework', 'Include', 'Import', 'Extern', 'EndExtern',
+                'Function', 'EndFunction', 'Type', 'EndType', 'Extends', 'Method', 'EndMethod',
+                'Abstract', 'Final', 'If', 'Then', 'Else', 'ElseIf', 'EndIf',
+                'For', 'To', 'Next', 'Step', 'EachIn', 'While', 'Wend', 'EndWhile',
+                'Repeat', 'Until', 'Forever', 'Select', 'Case', 'Default', 'EndSelect',
+                'Try', 'Catch', 'EndTry', 'Throw', 'Assert', 'Goto', 'DefData', 'ReadData',
+                'RestoreData'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            # Final resolve (for variable names and such)
+            (r'(%s)' % (bmax_name), Name.Variable),
+        ],
+        'string': [
+            (r'""', String.Double),
+            (r'"C?', String.Double, '#pop'),
+            (r'[^"]+', String.Double),
+        ],
+    }
+
+
+class BlitzBasicLexer(RegexLexer):
+    """
+    For `BlitzBasic <http://blitzbasic.com>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'BlitzBasic'
+    aliases = ['blitzbasic', 'b3d', 'bplus']
+    filenames = ['*.bb', '*.decls']
+    mimetypes = ['text/x-bb']
+
+    bb_sktypes = r'@{1,2}|[#$%]'
+    bb_name = r'[a-z]\w*'
+    bb_var = (r'(%s)(?:([ \t]*)(%s)|([ \t]*)([.])([ \t]*)(?:(%s)))?') % \
+             (bb_name, bb_sktypes, bb_name)
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            # Text
+            (r'[ \t]+', Text),
+            # Comments
+            (r";.*?\n", Comment.Single),
+            # Data types
+            ('"', String.Double, 'string'),
+            # Numbers
+            (r'[0-9]+\.[0-9]*(?!\.)', Number.Float),
+            (r'\.[0-9]+(?!\.)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\$[0-9a-f]+', Number.Hex),
+            (r'\%[10]+', Number.Bin),
+            # Other
+            (words(('Shl', 'Shr', 'Sar', 'Mod', 'Or', 'And', 'Not',
+                    'Abs', 'Sgn', 'Handle', 'Int', 'Float', 'Str',
+                    'First', 'Last', 'Before', 'After'),
+                   prefix=r'\b', suffix=r'\b'),
+             Operator),
+            (r'([+\-*/~=<>^])', Operator),
+            (r'[(),:\[\]\\]', Punctuation),
+            (r'\.([ \t]*)(%s)' % bb_name, Name.Label),
+            # Identifiers
+            (r'\b(New)\b([ \t]+)(%s)' % (bb_name),
+             bygroups(Keyword.Reserved, Text, Name.Class)),
+            (r'\b(Gosub|Goto)\b([ \t]+)(%s)' % (bb_name),
+             bygroups(Keyword.Reserved, Text, Name.Label)),
+            (r'\b(Object)\b([ \t]*)([.])([ \t]*)(%s)\b' % (bb_name),
+             bygroups(Operator, Text, Punctuation, Text, Name.Class)),
+            (r'\b%s\b([ \t]*)(\()' % bb_var,
+             bygroups(Name.Function, Text, Keyword.Type, Text, Punctuation,
+                      Text, Name.Class, Text, Punctuation)),
+            (r'\b(Function)\b([ \t]+)%s' % bb_var,
+             bygroups(Keyword.Reserved, Text, Name.Function, Text, Keyword.Type,
+                      Text, Punctuation, Text, Name.Class)),
+            (r'\b(Type)([ \t]+)(%s)' % (bb_name),
+             bygroups(Keyword.Reserved, Text, Name.Class)),
+            # Keywords
+            (r'\b(Pi|True|False|Null)\b', Keyword.Constant),
+            (r'\b(Local|Global|Const|Field|Dim)\b', Keyword.Declaration),
+            (words((
+                'End', 'Return', 'Exit', 'Chr', 'Len', 'Asc', 'New', 'Delete', 'Insert',
+                'Include', 'Function', 'Type', 'If', 'Then', 'Else', 'ElseIf', 'EndIf',
+                'For', 'To', 'Next', 'Step', 'Each', 'While', 'Wend',
+                'Repeat', 'Until', 'Forever', 'Select', 'Case', 'Default',
+                'Goto', 'Gosub', 'Data', 'Read', 'Restore'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            # Final resolve (for variable names and such)
+            # (r'(%s)' % (bb_name), Name.Variable),
+            (bb_var, bygroups(Name.Variable, Text, Keyword.Type,
+                              Text, Punctuation, Text, Name.Class)),
+        ],
+        'string': [
+            (r'""', String.Double),
+            (r'"C?', String.Double, '#pop'),
+            (r'[^"]+', String.Double),
+        ],
+    }
+
+
+class MonkeyLexer(RegexLexer):
+    """
+    For
+    `Monkey <https://en.wikipedia.org/wiki/Monkey_(programming_language)>`_
+    source code.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Monkey'
+    aliases = ['monkey']
+    filenames = ['*.monkey']
+    mimetypes = ['text/x-monkey']
+
+    name_variable = r'[a-z_]\w*'
+    name_function = r'[A-Z]\w*'
+    name_constant = r'[A-Z_][A-Z0-9_]*'
+    name_class = r'[A-Z]\w*'
+    name_module = r'[a-z0-9_]*'
+
+    keyword_type = r'(?:Int|Float|String|Bool|Object|Array|Void)'
+    # ? == Bool // % == Int // # == Float // $ == String
+    keyword_type_special = r'[?%#$]'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            # Text
+            (r'\s+', Text),
+            # Comments
+            (r"'.*", Comment),
+            (r'(?i)^#rem\b', Comment.Multiline, 'comment'),
+            # preprocessor directives
+            (r'(?i)^(?:#If|#ElseIf|#Else|#EndIf|#End|#Print|#Error)\b', Comment.Preproc),
+            # preprocessor variable (any line starting with '#' that is not a directive)
+            (r'^#', Comment.Preproc, 'variables'),
+            # String
+            ('"', String.Double, 'string'),
+            # Numbers
+            (r'[0-9]+\.[0-9]*(?!\.)', Number.Float),
+            (r'\.[0-9]+(?!\.)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\$[0-9a-fA-Z]+', Number.Hex),
+            (r'\%[10]+', Number.Bin),
+            # Native data types
+            (r'\b%s\b' % keyword_type, Keyword.Type),
+            # Exception handling
+            (r'(?i)\b(?:Try|Catch|Throw)\b', Keyword.Reserved),
+            (r'Throwable', Name.Exception),
+            # Builtins
+            (r'(?i)\b(?:Null|True|False)\b', Name.Builtin),
+            (r'(?i)\b(?:Self|Super)\b', Name.Builtin.Pseudo),
+            (r'\b(?:HOST|LANG|TARGET|CONFIG)\b', Name.Constant),
+            # Keywords
+            (r'(?i)^(Import)(\s+)(.*)(\n)',
+             bygroups(Keyword.Namespace, Text, Name.Namespace, Text)),
+            (r'(?i)^Strict\b.*\n', Keyword.Reserved),
+            (r'(?i)(Const|Local|Global|Field)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'variables'),
+            (r'(?i)(New|Class|Interface|Extends|Implements)(\s+)',
+             bygroups(Keyword.Reserved, Text), 'classname'),
+            (r'(?i)(Function|Method)(\s+)',
+             bygroups(Keyword.Reserved, Text), 'funcname'),
+            (r'(?i)(?:End|Return|Public|Private|Extern|Property|'
+             r'Final|Abstract)\b', Keyword.Reserved),
+            # Flow Control stuff
+            (r'(?i)(?:If|Then|Else|ElseIf|EndIf|'
+             r'Select|Case|Default|'
+             r'While|Wend|'
+             r'Repeat|Until|Forever|'
+             r'For|To|Until|Step|EachIn|Next|'
+             r'Exit|Continue)\s+', Keyword.Reserved),
+            # not used yet
+            (r'(?i)\b(?:Module|Inline)\b', Keyword.Reserved),
+            # Array
+            (r'[\[\]]', Punctuation),
+            # Other
+            (r'<=|>=|<>|\*=|/=|\+=|-=|&=|~=|\|=|[-&*/^+=<>|~]', Operator),
+            (r'(?i)(?:Not|Mod|Shl|Shr|And|Or)', Operator.Word),
+            (r'[(){}!#,.:]', Punctuation),
+            # catch the rest
+            (r'%s\b' % name_constant, Name.Constant),
+            (r'%s\b' % name_function, Name.Function),
+            (r'%s\b' % name_variable, Name.Variable),
+        ],
+        'funcname': [
+            (r'(?i)%s\b' % name_function, Name.Function),
+            (r':', Punctuation, 'classname'),
+            (r'\s+', Text),
+            (r'\(', Punctuation, 'variables'),
+            (r'\)', Punctuation, '#pop')
+        ],
+        'classname': [
+            (r'%s\.' % name_module, Name.Namespace),
+            (r'%s\b' % keyword_type, Keyword.Type),
+            (r'%s\b' % name_class, Name.Class),
+            # array (of given size)
+            (r'(\[)(\s*)(\d*)(\s*)(\])',
+             bygroups(Punctuation, Text, Number.Integer, Text, Punctuation)),
+            # generics
+            (r'\s+(?!<)', Text, '#pop'),
+            (r'<', Punctuation, '#push'),
+            (r'>', Punctuation, '#pop'),
+            (r'\n', Text, '#pop'),
+            default('#pop')
+        ],
+        'variables': [
+            (r'%s\b' % name_constant, Name.Constant),
+            (r'%s\b' % name_variable, Name.Variable),
+            (r'%s' % keyword_type_special, Keyword.Type),
+            (r'\s+', Text),
+            (r':', Punctuation, 'classname'),
+            (r',', Punctuation, '#push'),
+            default('#pop')
+        ],
+        'string': [
+            (r'[^"~]+', String.Double),
+            (r'~q|~n|~r|~t|~z|~~', String.Escape),
+            (r'"', String.Double, '#pop'),
+        ],
+        'comment': [
+            (r'(?i)^#rem.*?', Comment.Multiline, "#push"),
+            (r'(?i)^#end.*?', Comment.Multiline, "#pop"),
+            (r'\n', Comment.Multiline),
+            (r'.+', Comment.Multiline),
+        ],
+    }
+
+
+class CbmBasicV2Lexer(RegexLexer):
+    """
+    For CBM BASIC V2 sources.
+
+    .. versionadded:: 1.6
+    """
+    name = 'CBM BASIC V2'
+    aliases = ['cbmbas']
+    filenames = ['*.bas']
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'rem.*\n', Comment.Single),
+            (r'\s+', Text),
+            (r'new|run|end|for|to|next|step|go(to|sub)?|on|return|stop|cont'
+             r'|if|then|input#?|read|wait|load|save|verify|poke|sys|print#?'
+             r'|list|clr|cmd|open|close|get#?', Keyword.Reserved),
+            (r'data|restore|dim|let|def|fn', Keyword.Declaration),
+            (r'tab|spc|sgn|int|abs|usr|fre|pos|sqr|rnd|log|exp|cos|sin|tan|atn'
+             r'|peek|len|val|asc|(str|chr|left|right|mid)\$', Name.Builtin),
+            (r'[-+*/^<>=]', Operator),
+            (r'not|and|or', Operator.Word),
+            (r'"[^"\n]*.', String),
+            (r'\d+|[-+]?\d*\.\d*(e[-+]?\d+)?', Number.Float),
+            (r'[(),:;]', Punctuation),
+            (r'\w+[$%]?', Name),
+        ]
+    }
+
+    def analyse_text(self, text):
+        # if it starts with a line number, it shouldn't be a "modern" Basic
+        # like VB.net
+        if re.match(r'\d+', text):
+            return 0.2
+
+
+class QBasicLexer(RegexLexer):
+    """
+    For
+    `QBasic <http://en.wikipedia.org/wiki/QBasic>`_
+    source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'QBasic'
+    aliases = ['qbasic', 'basic']
+    filenames = ['*.BAS', '*.bas']
+    mimetypes = ['text/basic']
+
+    declarations = ('DATA', 'LET')
+
+    functions = (
+        'ABS', 'ASC', 'ATN', 'CDBL', 'CHR$', 'CINT', 'CLNG',
+        'COMMAND$', 'COS', 'CSNG', 'CSRLIN', 'CVD', 'CVDMBF', 'CVI',
+        'CVL', 'CVS', 'CVSMBF', 'DATE$', 'ENVIRON$', 'EOF', 'ERDEV',
+        'ERDEV$', 'ERL', 'ERR', 'EXP', 'FILEATTR', 'FIX', 'FRE',
+        'FREEFILE', 'HEX$', 'INKEY$', 'INP', 'INPUT$', 'INSTR', 'INT',
+        'IOCTL$', 'LBOUND', 'LCASE$', 'LEFT$', 'LEN', 'LOC', 'LOF',
+        'LOG', 'LPOS', 'LTRIM$', 'MID$', 'MKD$', 'MKDMBF$', 'MKI$',
+        'MKL$', 'MKS$', 'MKSMBF$', 'OCT$', 'PEEK', 'PEN', 'PLAY',
+        'PMAP', 'POINT', 'POS', 'RIGHT$', 'RND', 'RTRIM$', 'SADD',
+        'SCREEN', 'SEEK', 'SETMEM', 'SGN', 'SIN', 'SPACE$', 'SPC',
+        'SQR', 'STICK', 'STR$', 'STRIG', 'STRING$', 'TAB', 'TAN',
+        'TIME$', 'TIMER', 'UBOUND', 'UCASE$', 'VAL', 'VARPTR',
+        'VARPTR$', 'VARSEG'
+    )
+
+    metacommands = ('$DYNAMIC', '$INCLUDE', '$STATIC')
+
+    operators = ('AND', 'EQV', 'IMP', 'NOT', 'OR', 'XOR')
+
+    statements = (
+        'BEEP', 'BLOAD', 'BSAVE', 'CALL', 'CALL ABSOLUTE',
+        'CALL INTERRUPT', 'CALLS', 'CHAIN', 'CHDIR', 'CIRCLE', 'CLEAR',
+        'CLOSE', 'CLS', 'COLOR', 'COM', 'COMMON', 'CONST', 'DATA',
+        'DATE$', 'DECLARE', 'DEF FN', 'DEF SEG', 'DEFDBL', 'DEFINT',
+        'DEFLNG', 'DEFSNG', 'DEFSTR', 'DEF', 'DIM', 'DO', 'LOOP',
+        'DRAW', 'END', 'ENVIRON', 'ERASE', 'ERROR', 'EXIT', 'FIELD',
+        'FILES', 'FOR', 'NEXT', 'FUNCTION', 'GET', 'GOSUB', 'GOTO',
+        'IF', 'THEN', 'INPUT', 'INPUT #', 'IOCTL', 'KEY', 'KEY',
+        'KILL', 'LET', 'LINE', 'LINE INPUT', 'LINE INPUT #', 'LOCATE',
+        'LOCK', 'UNLOCK', 'LPRINT', 'LSET', 'MID$', 'MKDIR', 'NAME',
+        'ON COM', 'ON ERROR', 'ON KEY', 'ON PEN', 'ON PLAY',
+        'ON STRIG', 'ON TIMER', 'ON UEVENT', 'ON', 'OPEN', 'OPEN COM',
+        'OPTION BASE', 'OUT', 'PAINT', 'PALETTE', 'PCOPY', 'PEN',
+        'PLAY', 'POKE', 'PRESET', 'PRINT', 'PRINT #', 'PRINT USING',
+        'PSET', 'PUT', 'PUT', 'RANDOMIZE', 'READ', 'REDIM', 'REM',
+        'RESET', 'RESTORE', 'RESUME', 'RETURN', 'RMDIR', 'RSET', 'RUN',
+        'SCREEN', 'SEEK', 'SELECT CASE', 'SHARED', 'SHELL', 'SLEEP',
+        'SOUND', 'STATIC', 'STOP', 'STRIG', 'SUB', 'SWAP', 'SYSTEM',
+        'TIME$', 'TIMER', 'TROFF', 'TRON', 'TYPE', 'UEVENT', 'UNLOCK',
+        'VIEW', 'WAIT', 'WHILE', 'WEND', 'WIDTH', 'WINDOW', 'WRITE'
+    )
+
+    keywords = (
+        'ACCESS', 'ALIAS', 'ANY', 'APPEND', 'AS', 'BASE', 'BINARY',
+        'BYVAL', 'CASE', 'CDECL', 'DOUBLE', 'ELSE', 'ELSEIF', 'ENDIF',
+        'INTEGER', 'IS', 'LIST', 'LOCAL', 'LONG', 'LOOP', 'MOD',
+        'NEXT', 'OFF', 'ON', 'OUTPUT', 'RANDOM', 'SIGNAL', 'SINGLE',
+        'STEP', 'STRING', 'THEN', 'TO', 'UNTIL', 'USING', 'WEND'
+    )
+
+    tokens = {
+        'root': [
+            (r'\n+', Text),
+            (r'\s+', Text.Whitespace),
+            (r'^(\s*)(\d*)(\s*)(REM .*)$',
+             bygroups(Text.Whitespace, Name.Label, Text.Whitespace,
+                      Comment.Single)),
+            (r'^(\s*)(\d+)(\s*)',
+             bygroups(Text.Whitespace, Name.Label, Text.Whitespace)),
+            (r'(?=[\s]*)(\w+)(?=[\s]*=)', Name.Variable.Global),
+            (r'(?=[^"]*)\'.*$', Comment.Single),
+            (r'"[^\n"]*"', String.Double),
+            (r'(END)(\s+)(FUNCTION|IF|SELECT|SUB)',
+             bygroups(Keyword.Reserved, Text.Whitespace, Keyword.Reserved)),
+            (r'(DECLARE)(\s+)([A-Z]+)(\s+)(\S+)',
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable,
+                      Text.Whitespace, Name)),
+            (r'(DIM)(\s+)(SHARED)(\s+)([^\s(]+)',
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable,
+                      Text.Whitespace, Name.Variable.Global)),
+            (r'(DIM)(\s+)([^\s(]+)',
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable.Global)),
+            (r'^(\s*)([a-zA-Z_]+)(\s*)(\=)',
+             bygroups(Text.Whitespace, Name.Variable.Global, Text.Whitespace,
+                      Operator)),
+            (r'(GOTO|GOSUB)(\s+)(\w+\:?)',
+             bygroups(Keyword.Reserved, Text.Whitespace, Name.Label)),
+            (r'(SUB)(\s+)(\w+\:?)',
+             bygroups(Keyword.Reserved, Text.Whitespace, Name.Label)),
+            include('declarations'),
+            include('functions'),
+            include('metacommands'),
+            include('operators'),
+            include('statements'),
+            include('keywords'),
+            (r'[a-zA-Z_]\w*[$@#&!]', Name.Variable.Global),
+            (r'[a-zA-Z_]\w*\:', Name.Label),
+            (r'\-?\d*\.\d+[@|#]?', Number.Float),
+            (r'\-?\d+[@|#]', Number.Float),
+            (r'\-?\d+#?', Number.Integer.Long),
+            (r'\-?\d+#?', Number.Integer),
+            (r'!=|==|:=|\.=|<<|>>|[-~+/\\*%=<>&^|?:!.]', Operator),
+            (r'[\[\]{}(),;]', Punctuation),
+            (r'[\w]+', Name.Variable.Global),
+        ],
+        # can't use regular \b because of X$()
+        # XXX: use words() here
+        'declarations': [
+            (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, declarations)),
+             Keyword.Declaration),
+        ],
+        'functions': [
+            (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, functions)),
+             Keyword.Reserved),
+        ],
+        'metacommands': [
+            (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, metacommands)),
+             Keyword.Constant),
+        ],
+        'operators': [
+            (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, operators)), Operator.Word),
+        ],
+        'statements': [
+            (r'\b(%s)\b' % '|'.join(map(re.escape, statements)),
+             Keyword.Reserved),
+        ],
+        'keywords': [
+            (r'\b(%s)\b' % '|'.join(keywords), Keyword),
+        ],
+    }
+
+    def analyse_text(text):
+        if '$DYNAMIC' in text or '$STATIC' in text:
+            return 0.9
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/smalltalk.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/smalltalk.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/smalltalk.py	(revision 1126)
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.smalltalk
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Smalltalk and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SmalltalkLexer', 'NewspeakLexer']
+
+
+class SmalltalkLexer(RegexLexer):
+    """
+    For `Smalltalk <http://www.smalltalk.org/>`_ syntax.
+    Contributed by Stefan Matthias Aust.
+    Rewritten by Nils Winter.
+
+    .. versionadded:: 0.10
+    """
+    name = 'Smalltalk'
+    filenames = ['*.st']
+    aliases = ['smalltalk', 'squeak', 'st']
+    mimetypes = ['text/x-smalltalk']
+
+    tokens = {
+        'root': [
+            (r'(<)(\w+:)(.*?)(>)', bygroups(Text, Keyword, Text, Text)),
+            include('squeak fileout'),
+            include('whitespaces'),
+            include('method definition'),
+            (r'(\|)([\w\s]*)(\|)', bygroups(Operator, Name.Variable, Operator)),
+            include('objects'),
+            (r'\^|\:=|\_', Operator),
+            # temporaries
+            (r'[\]({}.;!]', Text),
+        ],
+        'method definition': [
+            # Not perfect can't allow whitespaces at the beginning and the
+            # without breaking everything
+            (r'([a-zA-Z]+\w*:)(\s*)(\w+)',
+             bygroups(Name.Function, Text, Name.Variable)),
+            (r'^(\b[a-zA-Z]+\w*\b)(\s*)$', bygroups(Name.Function, Text)),
+            (r'^([-+*/\\~<>=|&!?,@%]+)(\s*)(\w+)(\s*)$',
+             bygroups(Name.Function, Text, Name.Variable, Text)),
+        ],
+        'blockvariables': [
+            include('whitespaces'),
+            (r'(:)(\s*)(\w+)',
+             bygroups(Operator, Text, Name.Variable)),
+            (r'\|', Operator, '#pop'),
+            default('#pop'),  # else pop
+        ],
+        'literals': [
+            (r"'(''|[^'])*'", String, 'afterobject'),
+            (r'\$.', String.Char, 'afterobject'),
+            (r'#\(', String.Symbol, 'parenth'),
+            (r'\)', Text, 'afterobject'),
+            (r'(\d+r)?-?\d+(\.\d+)?(e-?\d+)?', Number, 'afterobject'),
+        ],
+        '_parenth_helper': [
+            include('whitespaces'),
+            (r'(\d+r)?-?\d+(\.\d+)?(e-?\d+)?', Number),
+            (r'[-+*/\\~<>=|&#!?,@%\w:]+', String.Symbol),
+            # literals
+            (r"'(''|[^'])*'", String),
+            (r'\$.', String.Char),
+            (r'#*\(', String.Symbol, 'inner_parenth'),
+        ],
+        'parenth': [
+            # This state is a bit tricky since
+            # we can't just pop this state
+            (r'\)', String.Symbol, ('root', 'afterobject')),
+            include('_parenth_helper'),
+        ],
+        'inner_parenth': [
+            (r'\)', String.Symbol, '#pop'),
+            include('_parenth_helper'),
+        ],
+        'whitespaces': [
+            # skip whitespace and comments
+            (r'\s+', Text),
+            (r'"(""|[^"])*"', Comment),
+        ],
+        'objects': [
+            (r'\[', Text, 'blockvariables'),
+            (r'\]', Text, 'afterobject'),
+            (r'\b(self|super|true|false|nil|thisContext)\b',
+             Name.Builtin.Pseudo, 'afterobject'),
+            (r'\b[A-Z]\w*(?!:)\b', Name.Class, 'afterobject'),
+            (r'\b[a-z]\w*(?!:)\b', Name.Variable, 'afterobject'),
+            (r'#("(""|[^"])*"|[-+*/\\~<>=|&!?,@%]+|[\w:]+)',
+             String.Symbol, 'afterobject'),
+            include('literals'),
+        ],
+        'afterobject': [
+            (r'! !$', Keyword, '#pop'),  # squeak chunk delimiter
+            include('whitespaces'),
+            (r'\b(ifTrue:|ifFalse:|whileTrue:|whileFalse:|timesRepeat:)',
+             Name.Builtin, '#pop'),
+            (r'\b(new\b(?!:))', Name.Builtin),
+            (r'\:=|\_', Operator, '#pop'),
+            (r'\b[a-zA-Z]+\w*:', Name.Function, '#pop'),
+            (r'\b[a-zA-Z]+\w*', Name.Function),
+            (r'\w+:?|[-+*/\\~<>=|&!?,@%]+', Name.Function, '#pop'),
+            (r'\.', Punctuation, '#pop'),
+            (r';', Punctuation),
+            (r'[\])}]', Text),
+            (r'[\[({]', Text, '#pop'),
+        ],
+        'squeak fileout': [
+            # Squeak fileout format (optional)
+            (r'^"(""|[^"])*"!', Keyword),
+            (r"^'(''|[^'])*'!", Keyword),
+            (r'^(!)(\w+)( commentStamp: )(.*?)( prior: .*?!\n)(.*?)(!)',
+                bygroups(Keyword, Name.Class, Keyword, String, Keyword, Text, Keyword)),
+            (r"^(!)(\w+(?: class)?)( methodsFor: )('(?:''|[^'])*')(.*?!)",
+                bygroups(Keyword, Name.Class, Keyword, String, Keyword)),
+            (r'^(\w+)( subclass: )(#\w+)'
+             r'(\s+instanceVariableNames: )(.*?)'
+             r'(\s+classVariableNames: )(.*?)'
+             r'(\s+poolDictionaries: )(.*?)'
+             r'(\s+category: )(.*?)(!)',
+                bygroups(Name.Class, Keyword, String.Symbol, Keyword, String, Keyword,
+                         String, Keyword, String, Keyword, String, Keyword)),
+            (r'^(\w+(?: class)?)(\s+instanceVariableNames: )(.*?)(!)',
+                bygroups(Name.Class, Keyword, String, Keyword)),
+            (r'(!\n)(\].*)(! !)$', bygroups(Keyword, Text, Keyword)),
+            (r'! !$', Keyword),
+        ],
+    }
+
+
+class NewspeakLexer(RegexLexer):
+    """
+    For `Newspeak <http://newspeaklanguage.org/>` syntax.
+
+    .. versionadded:: 1.1
+    """
+    name = 'Newspeak'
+    filenames = ['*.ns2']
+    aliases = ['newspeak', ]
+    mimetypes = ['text/x-newspeak']
+
+    tokens = {
+        'root': [
+            (r'\b(Newsqueak2)\b', Keyword.Declaration),
+            (r"'[^']*'", String),
+            (r'\b(class)(\s+)(\w+)(\s*)',
+             bygroups(Keyword.Declaration, Text, Name.Class, Text)),
+            (r'\b(mixin|self|super|private|public|protected|nil|true|false)\b',
+             Keyword),
+            (r'(\w+\:)(\s*)([a-zA-Z_]\w+)',
+             bygroups(Name.Function, Text, Name.Variable)),
+            (r'(\w+)(\s*)(=)',
+             bygroups(Name.Attribute, Text, Operator)),
+            (r'<\w+>', Comment.Special),
+            include('expressionstat'),
+            include('whitespace')
+        ],
+
+        'expressionstat': [
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r':\w+', Name.Variable),
+            (r'(\w+)(::)', bygroups(Name.Variable, Operator)),
+            (r'\w+:', Name.Function),
+            (r'\w+', Name.Variable),
+            (r'\(|\)', Punctuation),
+            (r'\[|\]', Punctuation),
+            (r'\{|\}', Punctuation),
+
+            (r'(\^|\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-|:)', Operator),
+            (r'\.|;', Punctuation),
+            include('whitespace'),
+            include('literals'),
+        ],
+        'literals': [
+            (r'\$.', String),
+            (r"'[^']*'", String),
+            (r"#'[^']*'", String.Symbol),
+            (r"#\w+:?", String.Symbol),
+            (r"#(\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-)+", String.Symbol)
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+            (r'"[^"]*"', Comment)
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/haxe.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/haxe.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/haxe.py	(revision 1126)
@@ -0,0 +1,936 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.haxe
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Haxe and related stuff.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, RegexLexer, include, bygroups, \
+    default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+__all__ = ['HaxeLexer', 'HxmlLexer']
+
+
+class HaxeLexer(ExtendedRegexLexer):
+    """
+    For Haxe source code (http://haxe.org/).
+
+    .. versionadded:: 1.3
+    """
+
+    name = 'Haxe'
+    aliases = ['hx', 'haxe', 'hxsl']
+    filenames = ['*.hx', '*.hxsl']
+    mimetypes = ['text/haxe', 'text/x-haxe', 'text/x-hx']
+
+    # keywords extracted from lexer.mll in the haxe compiler source
+    keyword = (r'(?:function|class|static|var|if|else|while|do|for|'
+               r'break|return|continue|extends|implements|import|'
+               r'switch|case|default|public|private|try|untyped|'
+               r'catch|new|this|throw|extern|enum|in|interface|'
+               r'cast|override|dynamic|typedef|package|'
+               r'inline|using|null|true|false|abstract)\b')
+
+    # idtype in lexer.mll
+    typeid = r'_*[A-Z]\w*'
+
+    # combined ident and dollar and idtype
+    ident = r'(?:_*[a-z]\w*|_+[0-9]\w*|' + typeid + '|_+|\$\w+)'
+
+    binop = (r'(?:%=|&=|\|=|\^=|\+=|\-=|\*=|/=|<<=|>\s*>\s*=|>\s*>\s*>\s*=|==|'
+             r'!=|<=|>\s*=|&&|\|\||<<|>>>|>\s*>|\.\.\.|<|>|%|&|\||\^|\+|\*|'
+             r'/|\-|=>|=)')
+
+    # ident except keywords
+    ident_no_keyword = r'(?!' + keyword + ')' + ident
+
+    flags = re.DOTALL | re.MULTILINE
+
+    preproc_stack = []
+
+    def preproc_callback(self, match, ctx):
+        proc = match.group(2)
+
+        if proc == 'if':
+            # store the current stack
+            self.preproc_stack.append(ctx.stack[:])
+        elif proc in ['else', 'elseif']:
+            # restore the stack back to right before #if
+            if self.preproc_stack:
+                ctx.stack = self.preproc_stack[-1][:]
+        elif proc == 'end':
+            # remove the saved stack of previous #if
+            if self.preproc_stack:
+                self.preproc_stack.pop()
+
+        # #if and #elseif should follow by an expr
+        if proc in ['if', 'elseif']:
+            ctx.stack.append('preproc-expr')
+
+        # #error can be optionally follow by the error msg
+        if proc in ['error']:
+            ctx.stack.append('preproc-error')
+
+        yield match.start(), Comment.Preproc, '#' + proc
+        ctx.pos = match.end()
+
+    tokens = {
+        'root': [
+            include('spaces'),
+            include('meta'),
+            (r'(?:package)\b', Keyword.Namespace, ('semicolon', 'package')),
+            (r'(?:import)\b', Keyword.Namespace, ('semicolon', 'import')),
+            (r'(?:using)\b', Keyword.Namespace, ('semicolon', 'using')),
+            (r'(?:extern|private)\b', Keyword.Declaration),
+            (r'(?:abstract)\b', Keyword.Declaration, 'abstract'),
+            (r'(?:class|interface)\b', Keyword.Declaration, 'class'),
+            (r'(?:enum)\b', Keyword.Declaration, 'enum'),
+            (r'(?:typedef)\b', Keyword.Declaration, 'typedef'),
+
+            # top-level expression
+            # although it is not supported in haxe, but it is common to write
+            # expression in web pages the positive lookahead here is to prevent
+            # an infinite loop at the EOF
+            (r'(?=.)', Text, 'expr-statement'),
+        ],
+
+        # space/tab/comment/preproc
+        'spaces': [
+            (r'\s+', Text),
+            (r'//[^\n\r]*', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(#)(if|elseif|else|end|error)\b', preproc_callback),
+        ],
+
+        'string-single-interpol': [
+            (r'\$\{', String.Interpol, ('string-interpol-close', 'expr')),
+            (r'\$\$', String.Escape),
+            (r'\$(?=' + ident + ')', String.Interpol, 'ident'),
+            include('string-single'),
+        ],
+
+        'string-single': [
+            (r"'", String.Single, '#pop'),
+            (r'\\.', String.Escape),
+            (r'.', String.Single),
+        ],
+
+        'string-double': [
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Escape),
+            (r'.', String.Double),
+        ],
+
+        'string-interpol-close': [
+            (r'\$'+ident, String.Interpol),
+            (r'\}', String.Interpol, '#pop'),
+        ],
+
+        'package': [
+            include('spaces'),
+            (ident, Name.Namespace),
+            (r'\.', Punctuation, 'import-ident'),
+            default('#pop'),
+        ],
+
+        'import': [
+            include('spaces'),
+            (ident, Name.Namespace),
+            (r'\*', Keyword),  # wildcard import
+            (r'\.', Punctuation, 'import-ident'),
+            (r'in', Keyword.Namespace, 'ident'),
+            default('#pop'),
+        ],
+
+        'import-ident': [
+            include('spaces'),
+            (r'\*', Keyword, '#pop'),  # wildcard import
+            (ident, Name.Namespace, '#pop'),
+        ],
+
+        'using': [
+            include('spaces'),
+            (ident, Name.Namespace),
+            (r'\.', Punctuation, 'import-ident'),
+            default('#pop'),
+        ],
+
+        'preproc-error': [
+            (r'\s+', Comment.Preproc),
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+            default('#pop'),
+        ],
+
+        'preproc-expr': [
+            (r'\s+', Comment.Preproc),
+            (r'\!', Comment.Preproc),
+            (r'\(', Comment.Preproc, ('#pop', 'preproc-parenthesis')),
+
+            (ident, Comment.Preproc, '#pop'),
+
+            # Float
+            (r'\.[0-9]+', Number.Float),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float),
+            (r'[0-9]+\.[0-9]+', Number.Float),
+            (r'[0-9]+\.(?!' + ident + '|\.\.)', Number.Float),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+
+            # String
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+        ],
+
+        'preproc-parenthesis': [
+            (r'\s+', Comment.Preproc),
+            (r'\)', Comment.Preproc, '#pop'),
+            default('preproc-expr-in-parenthesis'),
+        ],
+
+        'preproc-expr-chain': [
+            (r'\s+', Comment.Preproc),
+            (binop, Comment.Preproc, ('#pop', 'preproc-expr-in-parenthesis')),
+            default('#pop'),
+        ],
+
+        # same as 'preproc-expr' but able to chain 'preproc-expr-chain'
+        'preproc-expr-in-parenthesis': [
+            (r'\s+', Comment.Preproc),
+            (r'\!', Comment.Preproc),
+            (r'\(', Comment.Preproc,
+             ('#pop', 'preproc-expr-chain', 'preproc-parenthesis')),
+
+            (ident, Comment.Preproc, ('#pop', 'preproc-expr-chain')),
+
+            # Float
+            (r'\.[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+\.[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+\.(?!' + ident + '|\.\.)', Number.Float, ('#pop', 'preproc-expr-chain')),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+', Number.Integer, ('#pop', 'preproc-expr-chain')),
+
+            # String
+            (r"'", String.Single,
+             ('#pop', 'preproc-expr-chain', 'string-single')),
+            (r'"', String.Double,
+             ('#pop', 'preproc-expr-chain', 'string-double')),
+        ],
+
+        'abstract': [
+            include('spaces'),
+            default(('#pop', 'abstract-body', 'abstract-relation',
+                    'abstract-opaque', 'type-param-constraint', 'type-name')),
+        ],
+
+        'abstract-body': [
+            include('spaces'),
+            (r'\{', Punctuation, ('#pop', 'class-body')),
+        ],
+
+        'abstract-opaque': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'parenthesis-close', 'type')),
+            default('#pop'),
+        ],
+
+        'abstract-relation': [
+            include('spaces'),
+            (r'(?:to|from)', Keyword.Declaration, 'type'),
+            (r',', Punctuation),
+            default('#pop'),
+        ],
+
+        'meta': [
+            include('spaces'),
+            (r'@', Name.Decorator, ('meta-body', 'meta-ident', 'meta-colon')),
+        ],
+
+        # optional colon
+        'meta-colon': [
+            include('spaces'),
+            (r':', Name.Decorator, '#pop'),
+            default('#pop'),
+        ],
+
+        # same as 'ident' but set token as Name.Decorator instead of Name
+        'meta-ident': [
+            include('spaces'),
+            (ident, Name.Decorator, '#pop'),
+        ],
+
+        'meta-body': [
+            include('spaces'),
+            (r'\(', Name.Decorator, ('#pop', 'meta-call')),
+            default('#pop'),
+        ],
+
+        'meta-call': [
+            include('spaces'),
+            (r'\)', Name.Decorator, '#pop'),
+            default(('#pop', 'meta-call-sep', 'expr')),
+        ],
+
+        'meta-call-sep': [
+            include('spaces'),
+            (r'\)', Name.Decorator, '#pop'),
+            (r',', Punctuation, ('#pop', 'meta-call')),
+        ],
+
+        'typedef': [
+            include('spaces'),
+            default(('#pop', 'typedef-body', 'type-param-constraint',
+                     'type-name')),
+        ],
+
+        'typedef-body': [
+            include('spaces'),
+            (r'=', Operator, ('#pop', 'optional-semicolon', 'type')),
+        ],
+
+        'enum': [
+            include('spaces'),
+            default(('#pop', 'enum-body', 'bracket-open',
+                     'type-param-constraint', 'type-name')),
+        ],
+
+        'enum-body': [
+            include('spaces'),
+            include('meta'),
+            (r'\}', Punctuation, '#pop'),
+            (ident_no_keyword, Name, ('enum-member', 'type-param-constraint')),
+        ],
+
+        'enum-member': [
+            include('spaces'),
+            (r'\(', Punctuation,
+             ('#pop', 'semicolon', 'flag', 'function-param')),
+            default(('#pop', 'semicolon', 'flag')),
+        ],
+
+        'class': [
+            include('spaces'),
+            default(('#pop', 'class-body', 'bracket-open', 'extends',
+                     'type-param-constraint', 'type-name')),
+        ],
+
+        'extends': [
+            include('spaces'),
+            (r'(?:extends|implements)\b', Keyword.Declaration, 'type'),
+            (r',', Punctuation),  # the comma is made optional here, since haxe2
+                                  # requires the comma but haxe3 does not allow it
+            default('#pop'),
+        ],
+
+        'bracket-open': [
+            include('spaces'),
+            (r'\{', Punctuation, '#pop'),
+        ],
+
+        'bracket-close': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+
+        'class-body': [
+            include('spaces'),
+            include('meta'),
+            (r'\}', Punctuation, '#pop'),
+            (r'(?:static|public|private|override|dynamic|inline|macro)\b',
+             Keyword.Declaration),
+            default('class-member'),
+        ],
+
+        'class-member': [
+            include('spaces'),
+            (r'(var)\b', Keyword.Declaration,
+             ('#pop', 'optional-semicolon', 'var')),
+            (r'(function)\b', Keyword.Declaration,
+             ('#pop', 'optional-semicolon', 'class-method')),
+        ],
+
+        # local function, anonymous or not
+        'function-local': [
+            include('spaces'),
+            (ident_no_keyword, Name.Function,
+             ('#pop', 'optional-expr', 'flag', 'function-param',
+              'parenthesis-open', 'type-param-constraint')),
+            default(('#pop', 'optional-expr', 'flag', 'function-param',
+                     'parenthesis-open', 'type-param-constraint')),
+        ],
+
+        'optional-expr': [
+            include('spaces'),
+            include('expr'),
+            default('#pop'),
+        ],
+
+        'class-method': [
+            include('spaces'),
+            (ident, Name.Function, ('#pop', 'optional-expr', 'flag',
+                                    'function-param', 'parenthesis-open',
+                                    'type-param-constraint')),
+        ],
+
+        # function arguments
+        'function-param': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r'\?', Punctuation),
+            (ident_no_keyword, Name,
+             ('#pop', 'function-param-sep', 'assign', 'flag')),
+        ],
+
+        'function-param-sep': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'function-param')),
+        ],
+
+        'prop-get-set': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'parenthesis-close',
+                                  'prop-get-set-opt', 'comma', 'prop-get-set-opt')),
+            default('#pop'),
+        ],
+
+        'prop-get-set-opt': [
+            include('spaces'),
+            (r'(?:default|null|never|dynamic|get|set)\b', Keyword, '#pop'),
+            (ident_no_keyword, Text, '#pop'),  # custom getter/setter
+        ],
+
+        'expr-statement': [
+            include('spaces'),
+            # makes semicolon optional here, just to avoid checking the last
+            # one is bracket or not.
+            default(('#pop', 'optional-semicolon', 'expr')),
+        ],
+
+        'expr': [
+            include('spaces'),
+            (r'@', Name.Decorator, ('#pop', 'optional-expr', 'meta-body',
+                                    'meta-ident', 'meta-colon')),
+            (r'(?:\+\+|\-\-|~(?!/)|!|\-)', Operator),
+            (r'\(', Punctuation, ('#pop', 'expr-chain', 'parenthesis')),
+            (r'(?:static|public|private|override|dynamic|inline)\b',
+             Keyword.Declaration),
+            (r'(?:function)\b', Keyword.Declaration, ('#pop', 'expr-chain',
+                                                      'function-local')),
+            (r'\{', Punctuation, ('#pop', 'expr-chain', 'bracket')),
+            (r'(?:true|false|null)\b', Keyword.Constant, ('#pop', 'expr-chain')),
+            (r'(?:this)\b', Keyword, ('#pop', 'expr-chain')),
+            (r'(?:cast)\b', Keyword, ('#pop', 'expr-chain', 'cast')),
+            (r'(?:try)\b', Keyword, ('#pop', 'catch', 'expr')),
+            (r'(?:var)\b', Keyword.Declaration, ('#pop', 'var')),
+            (r'(?:new)\b', Keyword, ('#pop', 'expr-chain', 'new')),
+            (r'(?:switch)\b', Keyword, ('#pop', 'switch')),
+            (r'(?:if)\b', Keyword, ('#pop', 'if')),
+            (r'(?:do)\b', Keyword, ('#pop', 'do')),
+            (r'(?:while)\b', Keyword, ('#pop', 'while')),
+            (r'(?:for)\b', Keyword, ('#pop', 'for')),
+            (r'(?:untyped|throw)\b', Keyword),
+            (r'(?:return)\b', Keyword, ('#pop', 'optional-expr')),
+            (r'(?:macro)\b', Keyword, ('#pop', 'macro')),
+            (r'(?:continue|break)\b', Keyword, '#pop'),
+            (r'(?:\$\s*[a-z]\b|\$(?!'+ident+'))', Name, ('#pop', 'dollar')),
+            (ident_no_keyword, Name, ('#pop', 'expr-chain')),
+
+            # Float
+            (r'\.[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+\.[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+\.(?!' + ident + '|\.\.)', Number.Float, ('#pop', 'expr-chain')),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex, ('#pop', 'expr-chain')),
+            (r'[0-9]+', Number.Integer, ('#pop', 'expr-chain')),
+
+            # String
+            (r"'", String.Single, ('#pop', 'expr-chain', 'string-single-interpol')),
+            (r'"', String.Double, ('#pop', 'expr-chain', 'string-double')),
+
+            # EReg
+            (r'~/(\\\\|\\/|[^/\n])*/[gimsu]*', String.Regex, ('#pop', 'expr-chain')),
+
+            # Array
+            (r'\[', Punctuation, ('#pop', 'expr-chain', 'array-decl')),
+        ],
+
+        'expr-chain': [
+            include('spaces'),
+            (r'(?:\+\+|\-\-)', Operator),
+            (binop, Operator, ('#pop', 'expr')),
+            (r'(?:in)\b', Keyword, ('#pop', 'expr')),
+            (r'\?', Operator, ('#pop', 'expr', 'ternary', 'expr')),
+            (r'(\.)(' + ident_no_keyword + ')', bygroups(Punctuation, Name)),
+            (r'\[', Punctuation, 'array-access'),
+            (r'\(', Punctuation, 'call'),
+            default('#pop'),
+        ],
+
+        # macro reification
+        'macro': [
+            include('spaces'),
+            include('meta'),
+            (r':', Punctuation, ('#pop', 'type')),
+
+            (r'(?:extern|private)\b', Keyword.Declaration),
+            (r'(?:abstract)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'abstract')),
+            (r'(?:class|interface)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'macro-class')),
+            (r'(?:enum)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'enum')),
+            (r'(?:typedef)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'typedef')),
+
+            default(('#pop', 'expr')),
+        ],
+
+        'macro-class': [
+            (r'\{', Punctuation, ('#pop', 'class-body')),
+            include('class')
+        ],
+
+        # cast can be written as "cast expr" or "cast(expr, type)"
+        'cast': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'parenthesis-close',
+                                  'cast-type', 'expr')),
+            default(('#pop', 'expr')),
+        ],
+
+        # optionally give a type as the 2nd argument of cast()
+        'cast-type': [
+            include('spaces'),
+            (r',', Punctuation, ('#pop', 'type')),
+            default('#pop'),
+        ],
+
+        'catch': [
+            include('spaces'),
+            (r'(?:catch)\b', Keyword, ('expr', 'function-param',
+                                       'parenthesis-open')),
+            default('#pop'),
+        ],
+
+        # do-while loop
+        'do': [
+            include('spaces'),
+            default(('#pop', 'do-while', 'expr')),
+        ],
+
+        # the while after do
+        'do-while': [
+            include('spaces'),
+            (r'(?:while)\b', Keyword, ('#pop', 'parenthesis',
+                                       'parenthesis-open')),
+        ],
+
+        'while': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'expr', 'parenthesis')),
+        ],
+
+        'for': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'expr', 'parenthesis')),
+        ],
+
+        'if': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'else', 'optional-semicolon', 'expr',
+                                  'parenthesis')),
+        ],
+
+        'else': [
+            include('spaces'),
+            (r'(?:else)\b', Keyword, ('#pop', 'expr')),
+            default('#pop'),
+        ],
+
+        'switch': [
+            include('spaces'),
+            default(('#pop', 'switch-body', 'bracket-open', 'expr')),
+        ],
+
+        'switch-body': [
+            include('spaces'),
+            (r'(?:case|default)\b', Keyword, ('case-block', 'case')),
+            (r'\}', Punctuation, '#pop'),
+        ],
+
+        'case': [
+            include('spaces'),
+            (r':', Punctuation, '#pop'),
+            default(('#pop', 'case-sep', 'case-guard', 'expr')),
+        ],
+
+        'case-sep': [
+            include('spaces'),
+            (r':', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'case')),
+        ],
+
+        'case-guard': [
+            include('spaces'),
+            (r'(?:if)\b', Keyword, ('#pop', 'parenthesis', 'parenthesis-open')),
+            default('#pop'),
+        ],
+
+        # optional multiple expr under a case
+        'case-block': [
+            include('spaces'),
+            (r'(?!(?:case|default)\b|\})', Keyword, 'expr-statement'),
+            default('#pop'),
+        ],
+
+        'new': [
+            include('spaces'),
+            default(('#pop', 'call', 'parenthesis-open', 'type')),
+        ],
+
+        'array-decl': [
+            include('spaces'),
+            (r'\]', Punctuation, '#pop'),
+            default(('#pop', 'array-decl-sep', 'expr')),
+        ],
+
+        'array-decl-sep': [
+            include('spaces'),
+            (r'\]', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'array-decl')),
+        ],
+
+        'array-access': [
+            include('spaces'),
+            default(('#pop', 'array-access-close', 'expr')),
+        ],
+
+        'array-access-close': [
+            include('spaces'),
+            (r'\]', Punctuation, '#pop'),
+        ],
+
+        'comma': [
+            include('spaces'),
+            (r',', Punctuation, '#pop'),
+        ],
+
+        'colon': [
+            include('spaces'),
+            (r':', Punctuation, '#pop'),
+        ],
+
+        'semicolon': [
+            include('spaces'),
+            (r';', Punctuation, '#pop'),
+        ],
+
+        'optional-semicolon': [
+            include('spaces'),
+            (r';', Punctuation, '#pop'),
+            default('#pop'),
+        ],
+
+        # identity that CAN be a Haxe keyword
+        'ident': [
+            include('spaces'),
+            (ident, Name, '#pop'),
+        ],
+
+        'dollar': [
+            include('spaces'),
+            (r'\{', Punctuation, ('#pop', 'expr-chain', 'bracket-close', 'expr')),
+            default(('#pop', 'expr-chain')),
+        ],
+
+        'type-name': [
+            include('spaces'),
+            (typeid, Name, '#pop'),
+        ],
+
+        'type-full-name': [
+            include('spaces'),
+            (r'\.', Punctuation, 'ident'),
+            default('#pop'),
+        ],
+
+        'type': [
+            include('spaces'),
+            (r'\?', Punctuation),
+            (ident, Name, ('#pop', 'type-check', 'type-full-name')),
+            (r'\{', Punctuation, ('#pop', 'type-check', 'type-struct')),
+            (r'\(', Punctuation, ('#pop', 'type-check', 'type-parenthesis')),
+        ],
+
+        'type-parenthesis': [
+            include('spaces'),
+            default(('#pop', 'parenthesis-close', 'type')),
+        ],
+
+        'type-check': [
+            include('spaces'),
+            (r'->', Punctuation, ('#pop', 'type')),
+            (r'<(?!=)', Punctuation, 'type-param'),
+            default('#pop'),
+        ],
+
+        'type-struct': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            (r'\?', Punctuation),
+            (r'>', Punctuation, ('comma', 'type')),
+            (ident_no_keyword, Name, ('#pop', 'type-struct-sep', 'type', 'colon')),
+            include('class-body'),
+        ],
+
+        'type-struct-sep': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'type-struct')),
+        ],
+
+        # type-param can be a normal type or a constant literal...
+        'type-param-type': [
+            # Float
+            (r'\.[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+\.[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+\.(?!' + ident + '|\.\.)', Number.Float, '#pop'),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex, '#pop'),
+            (r'[0-9]+', Number.Integer, '#pop'),
+
+            # String
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+
+            # EReg
+            (r'~/(\\\\|\\/|[^/\n])*/[gim]*', String.Regex, '#pop'),
+
+            # Array
+            (r'\[', Operator, ('#pop', 'array-decl')),
+
+            include('type'),
+        ],
+
+        # type-param part of a type
+        # ie. the <A,B> path in Map<A,B>
+        'type-param': [
+            include('spaces'),
+            default(('#pop', 'type-param-sep', 'type-param-type')),
+        ],
+
+        'type-param-sep': [
+            include('spaces'),
+            (r'>', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'type-param')),
+        ],
+
+        # optional type-param that may include constraint
+        # ie. <T:Constraint, T2:(ConstraintA,ConstraintB)>
+        'type-param-constraint': [
+            include('spaces'),
+            (r'<(?!=)', Punctuation, ('#pop', 'type-param-constraint-sep',
+                                      'type-param-constraint-flag', 'type-name')),
+            default('#pop'),
+        ],
+
+        'type-param-constraint-sep': [
+            include('spaces'),
+            (r'>', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'type-param-constraint-sep',
+                                 'type-param-constraint-flag', 'type-name')),
+        ],
+
+        # the optional constraint inside type-param
+        'type-param-constraint-flag': [
+            include('spaces'),
+            (r':', Punctuation, ('#pop', 'type-param-constraint-flag-type')),
+            default('#pop'),
+        ],
+
+        'type-param-constraint-flag-type': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'type-param-constraint-flag-type-sep',
+                                  'type')),
+            default(('#pop', 'type')),
+        ],
+
+        'type-param-constraint-flag-type-sep': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation, 'type'),
+        ],
+
+        # a parenthesis expr that contain exactly one expr
+        'parenthesis': [
+            include('spaces'),
+            default(('#pop', 'parenthesis-close', 'flag', 'expr')),
+        ],
+
+        'parenthesis-open': [
+            include('spaces'),
+            (r'\(', Punctuation, '#pop'),
+        ],
+
+        'parenthesis-close': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+
+        'var': [
+            include('spaces'),
+            (ident_no_keyword, Text, ('#pop', 'var-sep', 'assign', 'flag', 'prop-get-set')),
+        ],
+
+        # optional more var decl.
+        'var-sep': [
+            include('spaces'),
+            (r',', Punctuation, ('#pop', 'var')),
+            default('#pop'),
+        ],
+
+        # optional assignment
+        'assign': [
+            include('spaces'),
+            (r'=', Operator, ('#pop', 'expr')),
+            default('#pop'),
+        ],
+
+        # optional type flag
+        'flag': [
+            include('spaces'),
+            (r':', Punctuation, ('#pop', 'type')),
+            default('#pop'),
+        ],
+
+        # colon as part of a ternary operator (?:)
+        'ternary': [
+            include('spaces'),
+            (r':', Operator, '#pop'),
+        ],
+
+        # function call
+        'call': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            default(('#pop', 'call-sep', 'expr')),
+        ],
+
+        # after a call param
+        'call-sep': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'call')),
+        ],
+
+        # bracket can be block or object
+        'bracket': [
+            include('spaces'),
+            (r'(?!(?:\$\s*[a-z]\b|\$(?!'+ident+')))' + ident_no_keyword, Name,
+             ('#pop', 'bracket-check')),
+            (r"'", String.Single, ('#pop', 'bracket-check', 'string-single')),
+            (r'"', String.Double, ('#pop', 'bracket-check', 'string-double')),
+            default(('#pop', 'block')),
+        ],
+
+        'bracket-check': [
+            include('spaces'),
+            (r':', Punctuation, ('#pop', 'object-sep', 'expr')),  # is object
+            default(('#pop', 'block', 'optional-semicolon', 'expr-chain')),  # is block
+        ],
+
+        # code block
+        'block': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            default('expr-statement'),
+        ],
+
+        # object in key-value pairs
+        'object': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            default(('#pop', 'object-sep', 'expr', 'colon', 'ident-or-string'))
+        ],
+
+        # a key of an object
+        'ident-or-string': [
+            include('spaces'),
+            (ident_no_keyword, Name, '#pop'),
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+        ],
+
+        # after a key-value pair in object
+        'object-sep': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'object')),
+        ],
+
+
+
+    }
+
+    def analyse_text(text):
+        if re.match(r'\w+\s*:\s*\w', text):
+            return 0.3
+
+
+class HxmlLexer(RegexLexer):
+    """
+    Lexer for `haXe build <http://haxe.org/doc/compiler>`_ files.
+
+    .. versionadded:: 1.6
+    """
+    name = 'Hxml'
+    aliases = ['haxeml', 'hxml']
+    filenames = ['*.hxml']
+
+    tokens = {
+        'root': [
+            # Seperator
+            (r'(--)(next)', bygroups(Punctuation, Generic.Heading)),
+            # Compiler switches with one dash
+            (r'(-)(prompt|debug|v)', bygroups(Punctuation, Keyword.Keyword)),
+            # Compilerswitches with two dashes
+            (r'(--)(neko-source|flash-strict|flash-use-stage|no-opt|no-traces|'
+             r'no-inline|times|no-output)', bygroups(Punctuation, Keyword)),
+            # Targets and other options that take an argument
+            (r'(-)(cpp|js|neko|x|as3|swf9?|swf-lib|php|xml|main|lib|D|resource|'
+             r'cp|cmd)( +)(.+)',
+             bygroups(Punctuation, Keyword, Whitespace, String)),
+            # Options that take only numerical arguments
+            (r'(-)(swf-version)( +)(\d+)',
+             bygroups(Punctuation, Keyword, Number.Integer)),
+            # An Option that defines the size, the fps and the background
+            # color of an flash movie
+            (r'(-)(swf-header)( +)(\d+)(:)(\d+)(:)(\d+)(:)([A-Fa-f0-9]{6})',
+             bygroups(Punctuation, Keyword, Whitespace, Number.Integer,
+                      Punctuation, Number.Integer, Punctuation, Number.Integer,
+                      Punctuation, Number.Hex)),
+            # options with two dashes that takes arguments
+            (r'(--)(js-namespace|php-front|php-lib|remap|gen-hx-classes)( +)'
+             r'(.+)', bygroups(Punctuation, Keyword, Whitespace, String)),
+            # Single line comment, multiline ones are not allowed.
+            (r'#.*', Comment.Single)
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/php.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/php.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/php.py	(revision 1126)
@@ -0,0 +1,267 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.php
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for PHP and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, using, \
+    this, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Other
+from pygments.util import get_bool_opt, get_list_opt, iteritems
+
+__all__ = ['ZephirLexer', 'PhpLexer']
+
+
+class ZephirLexer(RegexLexer):
+    """
+    For `Zephir language <http://zephir-lang.com/>`_ source code.
+
+    Zephir is a compiled high level language aimed
+    to the creation of C-extensions for PHP.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Zephir'
+    aliases = ['zephir']
+    filenames = ['*.zep']
+
+    zephir_keywords = ['fetch', 'echo', 'isset', 'empty']
+    zephir_type = ['bit', 'bits', 'string']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|->|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|loop|'
+             r'require|inline|throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'namespace|use|extends|this|fetch|isset|unset|echo|fetch|likely|unlikely|'
+             r'empty)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(abstract|boolean|bool|char|class|const|double|enum|export|extends|final|'
+             r'native|goto|implements|import|int|string|interface|long|ulong|char|uchar|'
+             r'float|unsigned|private|protected|public|short|static|self|throws|reverse|'
+             r'transient|volatile)\b', Keyword.Reserved),
+            (r'(true|false|null|undefined)\b', Keyword.Constant),
+            (r'(Array|Boolean|Date|_REQUEST|_COOKIE|_SESSION|'
+             r'_GET|_POST|_SERVER|this|stdClass|range|count|iterator|'
+             r'window)\b', Name.Builtin),
+            (r'[$a-zA-Z_][\w\\]*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+        ]
+    }
+
+
+class PhpLexer(RegexLexer):
+    """
+    For `PHP <http://www.php.net/>`_ source code.
+    For PHP embedded in HTML, use the `HtmlPhpLexer`.
+
+    Additional options accepted:
+
+    `startinline`
+        If given and ``True`` the lexer starts highlighting with
+        php code (i.e.: no starting ``<?php`` required).  The default
+        is ``False``.
+    `funcnamehighlighting`
+        If given and ``True``, highlight builtin function names
+        (default: ``True``).
+    `disabledmodules`
+        If given, must be a list of module names whose function names
+        should not be highlighted. By default all modules are highlighted
+        except the special ``'unknown'`` module that includes functions
+        that are known to php but are undocumented.
+
+        To get a list of allowed modules have a look into the
+        `_php_builtins` module:
+
+        .. sourcecode:: pycon
+
+            >>> from pygments.lexers._php_builtins import MODULES
+            >>> MODULES.keys()
+            ['PHP Options/Info', 'Zip', 'dba', ...]
+
+        In fact the names of those modules match the module names from
+        the php documentation.
+    """
+
+    name = 'PHP'
+    aliases = ['php', 'php3', 'php4', 'php5']
+    filenames = ['*.php', '*.php[345]', '*.inc']
+    mimetypes = ['text/x-php']
+
+    # Note that a backslash is included in the following two patterns
+    # PHP uses a backslash as a namespace separator
+    _ident_char = r'[\\\w]|[^\x00-\x7f]'
+    _ident_begin = r'(?:[\\_a-z]|[^\x00-\x7f])'
+    _ident_end = r'(?:' + _ident_char + ')*'
+    _ident_inner = _ident_begin + _ident_end
+
+    flags = re.IGNORECASE | re.DOTALL | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'<\?(php)?', Comment.Preproc, 'php'),
+            (r'[^<]+', Other),
+            (r'<', Other)
+        ],
+        'php': [
+            (r'\?>', Comment.Preproc, '#pop'),
+            (r'(<<<)([\'"]?)(' + _ident_inner + r')(\2\n.*?\n\s*)(\3)(;?)(\n)',
+             bygroups(String, String, String.Delimiter, String, String.Delimiter,
+                      Punctuation, Text)),
+            (r'\s+', Text),
+            (r'#.*?\n', Comment.Single),
+            (r'//.*?\n', Comment.Single),
+            # put the empty comment here, it is otherwise seen as
+            # the start of a docstring
+            (r'/\*\*/', Comment.Multiline),
+            (r'/\*\*.*?\*/', String.Doc),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(->|::)(\s*)(' + _ident_inner + ')',
+             bygroups(Operator, Text, Name.Attribute)),
+            (r'[~!%^&*+=|:.<>/@-]+', Operator),
+            (r'\?', Operator),  # don't add to the charclass above!
+            (r'[\[\]{}();,]+', Punctuation),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (r'(function)(\s*)(?=\()', bygroups(Keyword, Text)),
+            (r'(function)(\s+)(&?)(\s*)',
+             bygroups(Keyword, Text, Operator, Text), 'functionname'),
+            (r'(const)(\s+)(' + _ident_inner + ')',
+             bygroups(Keyword, Text, Name.Constant)),
+            (r'(and|E_PARSE|old_function|E_ERROR|or|as|E_WARNING|parent|'
+             r'eval|PHP_OS|break|exit|case|extends|PHP_VERSION|cfunction|'
+             r'FALSE|print|for|require|continue|foreach|require_once|'
+             r'declare|return|default|static|do|switch|die|stdClass|'
+             r'echo|else|TRUE|elseif|var|empty|if|xor|enddeclare|include|'
+             r'virtual|endfor|include_once|while|endforeach|global|'
+             r'endif|list|endswitch|new|endwhile|not|'
+             r'array|E_ALL|NULL|final|php_user_filter|interface|'
+             r'implements|public|private|protected|abstract|clone|try|'
+             r'catch|throw|this|use|namespace|trait|yield|'
+             r'finally)\b', Keyword),
+            (r'(true|false|null)\b', Keyword.Constant),
+            include('magicconstants'),
+            (r'\$\{\$+' + _ident_inner + '\}', Name.Variable),
+            (r'\$+' + _ident_inner, Name.Variable),
+            (_ident_inner, Name.Other),
+            (r'(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?', Number.Float),
+            (r'\d+e[+-]?[0-9]+', Number.Float),
+            (r'0[0-7]+', Number.Oct),
+            (r'0x[a-f0-9]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'0b[01]+', Number.Bin),
+            (r"'([^'\\]*(?:\\.[^'\\]*)*)'", String.Single),
+            (r'`([^`\\]*(?:\\.[^`\\]*)*)`', String.Backtick),
+            (r'"', String.Double, 'string'),
+        ],
+        'magicfuncs': [
+            # source: http://php.net/manual/en/language.oop5.magic.php
+            (words((
+                '__construct', '__destruct', '__call', '__callStatic', '__get', '__set',
+                '__isset', '__unset', '__sleep', '__wakeup', '__toString', '__invoke',
+                '__set_state', '__clone', '__debugInfo',), suffix=r'\b'),
+             Name.Function.Magic),
+        ],
+        'magicconstants': [
+            # source: http://php.net/manual/en/language.constants.predefined.php
+            (words((
+                '__LINE__', '__FILE__', '__DIR__', '__FUNCTION__', '__CLASS__',
+                '__TRAIT__', '__METHOD__', '__NAMESPACE__',),
+                suffix=r'\b'),
+             Name.Constant),
+        ],
+        'classname': [
+            (_ident_inner, Name.Class, '#pop')
+        ],
+        'functionname': [
+            include('magicfuncs'),
+            (_ident_inner, Name.Function, '#pop'),
+            default('#pop')
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'[^{$"\\]+', String.Double),
+            (r'\\([nrt"$\\]|[0-7]{1,3}|x[0-9a-f]{1,2})', String.Escape),
+            (r'\$' + _ident_inner + '(\[\S+?\]|->' + _ident_inner + ')?',
+             String.Interpol),
+            (r'(\{\$\{)(.*?)(\}\})',
+             bygroups(String.Interpol, using(this, _startinline=True),
+                      String.Interpol)),
+            (r'(\{)(\$.*?)(\})',
+             bygroups(String.Interpol, using(this, _startinline=True),
+                      String.Interpol)),
+            (r'(\$\{)(\S+)(\})',
+             bygroups(String.Interpol, Name.Variable, String.Interpol)),
+            (r'[${\\]', String.Double)
+        ],
+    }
+
+    def __init__(self, **options):
+        self.funcnamehighlighting = get_bool_opt(
+            options, 'funcnamehighlighting', True)
+        self.disabledmodules = get_list_opt(
+            options, 'disabledmodules', ['unknown'])
+        self.startinline = get_bool_opt(options, 'startinline', False)
+
+        # private option argument for the lexer itself
+        if '_startinline' in options:
+            self.startinline = options.pop('_startinline')
+
+        # collect activated functions in a set
+        self._functions = set()
+        if self.funcnamehighlighting:
+            from pygments.lexers._php_builtins import MODULES
+            for key, value in iteritems(MODULES):
+                if key not in self.disabledmodules:
+                    self._functions.update(value)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        if self.startinline:
+            stack.append('php')
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name.Other:
+                if value in self._functions:
+                    yield index, Name.Builtin, value
+                    continue
+            yield index, token, value
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'<\?(?!xml)', text):
+            rv += 0.3
+        return rv
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/business.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/business.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/business.py	(revision 1126)
@@ -0,0 +1,612 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.business
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for "business-oriented" languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+from pygments.lexers._openedge_builtins import OPENEDGEKEYWORDS
+
+__all__ = ['CobolLexer', 'CobolFreeformatLexer', 'ABAPLexer', 'OpenEdgeLexer',
+           'GoodDataCLLexer', 'MaqlLexer']
+
+
+class CobolLexer(RegexLexer):
+    """
+    Lexer for OpenCOBOL code.
+
+    .. versionadded:: 1.6
+    """
+    name = 'COBOL'
+    aliases = ['cobol']
+    filenames = ['*.cob', '*.COB', '*.cpy', '*.CPY']
+    mimetypes = ['text/x-cobol']
+    flags = re.IGNORECASE | re.MULTILINE
+
+    # Data Types: by PICTURE and USAGE
+    # Operators: **, *, +, -, /, <, >, <=, >=, =, <>
+    # Logical (?): NOT, AND, OR
+
+    # Reserved words:
+    # http://opencobol.add1tocobol.com/#reserved-words
+    # Intrinsics:
+    # http://opencobol.add1tocobol.com/#does-opencobol-implement-any-intrinsic-functions
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('strings'),
+            include('core'),
+            include('nums'),
+            (r'[a-z0-9]([\w\-]*[a-z0-9]+)?', Name.Variable),
+            # (r'[\s]+', Text),
+            (r'[ \t]+', Text),
+        ],
+        'comment': [
+            (r'(^.{6}[*/].*\n|^.{6}|\*>.*\n)', Comment),
+        ],
+        'core': [
+            # Figurative constants
+            (r'(^|(?<=[^\w\-]))(ALL\s+)?'
+             r'((ZEROES)|(HIGH-VALUE|LOW-VALUE|QUOTE|SPACE|ZERO)(S)?)'
+             r'\s*($|(?=[^\w\-]))',
+             Name.Constant),
+
+            # Reserved words STATEMENTS and other bolds
+            (words((
+                'ACCEPT', 'ADD', 'ALLOCATE', 'CALL', 'CANCEL', 'CLOSE', 'COMPUTE',
+                'CONFIGURATION', 'CONTINUE', 'DATA', 'DELETE', 'DISPLAY', 'DIVIDE',
+                'DIVISION', 'ELSE', 'END', 'END-ACCEPT',
+                'END-ADD', 'END-CALL', 'END-COMPUTE', 'END-DELETE', 'END-DISPLAY',
+                'END-DIVIDE', 'END-EVALUATE', 'END-IF', 'END-MULTIPLY', 'END-OF-PAGE',
+                'END-PERFORM', 'END-READ', 'END-RETURN', 'END-REWRITE', 'END-SEARCH',
+                'END-START', 'END-STRING', 'END-SUBTRACT', 'END-UNSTRING', 'END-WRITE',
+                'ENVIRONMENT', 'EVALUATE', 'EXIT', 'FD', 'FILE', 'FILE-CONTROL', 'FOREVER',
+                'FREE', 'GENERATE', 'GO', 'GOBACK', 'IDENTIFICATION', 'IF', 'INITIALIZE',
+                'INITIATE', 'INPUT-OUTPUT', 'INSPECT', 'INVOKE', 'I-O-CONTROL', 'LINKAGE',
+                'LOCAL-STORAGE', 'MERGE', 'MOVE', 'MULTIPLY', 'OPEN', 'PERFORM',
+                'PROCEDURE', 'PROGRAM-ID', 'RAISE', 'READ', 'RELEASE', 'RESUME',
+                'RETURN', 'REWRITE', 'SCREEN', 'SD', 'SEARCH', 'SECTION', 'SET',
+                'SORT', 'START', 'STOP', 'STRING', 'SUBTRACT', 'SUPPRESS',
+                'TERMINATE', 'THEN', 'UNLOCK', 'UNSTRING', 'USE', 'VALIDATE',
+                'WORKING-STORAGE', 'WRITE'), prefix=r'(^|(?<=[^\w\-]))',
+                suffix=r'\s*($|(?=[^\w\-]))'),
+             Keyword.Reserved),
+
+            # Reserved words
+            (words((
+                'ACCESS', 'ADDRESS', 'ADVANCING', 'AFTER', 'ALL',
+                'ALPHABET', 'ALPHABETIC', 'ALPHABETIC-LOWER', 'ALPHABETIC-UPPER',
+                'ALPHANUMERIC', 'ALPHANUMERIC-EDITED', 'ALSO', 'ALTER', 'ALTERNATE'
+                'ANY', 'ARE', 'AREA', 'AREAS', 'ARGUMENT-NUMBER', 'ARGUMENT-VALUE', 'AS',
+                'ASCENDING', 'ASSIGN', 'AT', 'AUTO', 'AUTO-SKIP', 'AUTOMATIC',
+                'AUTOTERMINATE', 'BACKGROUND-COLOR', 'BASED', 'BEEP', 'BEFORE', 'BELL',
+                'BLANK', 'BLINK', 'BLOCK', 'BOTTOM', 'BY', 'BYTE-LENGTH', 'CHAINING',
+                'CHARACTER', 'CHARACTERS', 'CLASS', 'CODE', 'CODE-SET', 'COL',
+                'COLLATING', 'COLS', 'COLUMN', 'COLUMNS', 'COMMA', 'COMMAND-LINE',
+                'COMMIT', 'COMMON', 'CONSTANT', 'CONTAINS', 'CONTENT', 'CONTROL',
+                'CONTROLS', 'CONVERTING', 'COPY', 'CORR', 'CORRESPONDING', 'COUNT', 'CRT',
+                'CURRENCY', 'CURSOR', 'CYCLE', 'DATE', 'DAY', 'DAY-OF-WEEK', 'DE',
+                'DEBUGGING', 'DECIMAL-POINT', 'DECLARATIVES', 'DEFAULT', 'DELIMITED',
+                'DELIMITER', 'DEPENDING', 'DESCENDING', 'DETAIL', 'DISK',
+                'DOWN', 'DUPLICATES', 'DYNAMIC', 'EBCDIC',
+                'ENTRY', 'ENVIRONMENT-NAME', 'ENVIRONMENT-VALUE', 'EOL', 'EOP',
+                'EOS', 'ERASE', 'ERROR', 'ESCAPE', 'EXCEPTION',
+                'EXCLUSIVE', 'EXTEND', 'EXTERNAL', 'FILE-ID', 'FILLER', 'FINAL',
+                'FIRST', 'FIXED', 'FLOAT-LONG', 'FLOAT-SHORT',
+                'FOOTING', 'FOR', 'FOREGROUND-COLOR', 'FORMAT', 'FROM', 'FULL',
+                'FUNCTION', 'FUNCTION-ID', 'GIVING', 'GLOBAL', 'GROUP',
+                'HEADING', 'HIGHLIGHT', 'I-O', 'ID',
+                'IGNORE', 'IGNORING', 'IN', 'INDEX', 'INDEXED', 'INDICATE',
+                'INITIAL', 'INITIALIZED', 'INPUT', 'INTO', 'INTRINSIC', 'INVALID',
+                'IS', 'JUST', 'JUSTIFIED', 'KEY', 'LABEL',
+                'LAST', 'LEADING', 'LEFT', 'LENGTH', 'LIMIT', 'LIMITS', 'LINAGE',
+                'LINAGE-COUNTER', 'LINE', 'LINES', 'LOCALE', 'LOCK',
+                'LOWLIGHT', 'MANUAL', 'MEMORY', 'MINUS', 'MODE', 'MULTIPLE',
+                'NATIONAL', 'NATIONAL-EDITED', 'NATIVE', 'NEGATIVE', 'NEXT', 'NO',
+                'NULL', 'NULLS', 'NUMBER', 'NUMBERS', 'NUMERIC', 'NUMERIC-EDITED',
+                'OBJECT-COMPUTER', 'OCCURS', 'OF', 'OFF', 'OMITTED', 'ON', 'ONLY',
+                'OPTIONAL', 'ORDER', 'ORGANIZATION', 'OTHER', 'OUTPUT', 'OVERFLOW',
+                'OVERLINE', 'PACKED-DECIMAL', 'PADDING', 'PAGE', 'PARAGRAPH',
+                'PLUS', 'POINTER', 'POSITION', 'POSITIVE', 'PRESENT', 'PREVIOUS',
+                'PRINTER', 'PRINTING', 'PROCEDURE-POINTER', 'PROCEDURES',
+                'PROCEED', 'PROGRAM', 'PROGRAM-POINTER', 'PROMPT', 'QUOTE',
+                'QUOTES', 'RANDOM', 'RD', 'RECORD', 'RECORDING', 'RECORDS', 'RECURSIVE',
+                'REDEFINES', 'REEL', 'REFERENCE', 'RELATIVE', 'REMAINDER', 'REMOVAL',
+                'RENAMES', 'REPLACING', 'REPORT', 'REPORTING', 'REPORTS', 'REPOSITORY',
+                'REQUIRED', 'RESERVE', 'RETURNING', 'REVERSE-VIDEO', 'REWIND',
+                'RIGHT', 'ROLLBACK', 'ROUNDED', 'RUN', 'SAME', 'SCROLL',
+                'SECURE', 'SEGMENT-LIMIT', 'SELECT', 'SENTENCE', 'SEPARATE',
+                'SEQUENCE', 'SEQUENTIAL', 'SHARING', 'SIGN', 'SIGNED', 'SIGNED-INT',
+                'SIGNED-LONG', 'SIGNED-SHORT', 'SIZE', 'SORT-MERGE', 'SOURCE',
+                'SOURCE-COMPUTER', 'SPECIAL-NAMES', 'STANDARD',
+                'STANDARD-1', 'STANDARD-2', 'STATUS', 'SUM',
+                'SYMBOLIC', 'SYNC', 'SYNCHRONIZED', 'TALLYING', 'TAPE',
+                'TEST', 'THROUGH', 'THRU', 'TIME', 'TIMES', 'TO', 'TOP', 'TRAILING',
+                'TRANSFORM', 'TYPE', 'UNDERLINE', 'UNIT', 'UNSIGNED',
+                'UNSIGNED-INT', 'UNSIGNED-LONG', 'UNSIGNED-SHORT', 'UNTIL', 'UP',
+                'UPDATE', 'UPON', 'USAGE', 'USING', 'VALUE', 'VALUES', 'VARYING',
+                'WAIT', 'WHEN', 'WITH', 'WORDS', 'YYYYDDD', 'YYYYMMDD'),
+                prefix=r'(^|(?<=[^\w\-]))', suffix=r'\s*($|(?=[^\w\-]))'),
+             Keyword.Pseudo),
+
+            # inactive reserved words
+            (words((
+                'ACTIVE-CLASS', 'ALIGNED', 'ANYCASE', 'ARITHMETIC', 'ATTRIBUTE',
+                'B-AND', 'B-NOT', 'B-OR', 'B-XOR', 'BIT', 'BOOLEAN', 'CD', 'CENTER',
+                'CF', 'CH', 'CHAIN', 'CLASS-ID', 'CLASSIFICATION', 'COMMUNICATION',
+                'CONDITION', 'DATA-POINTER', 'DESTINATION', 'DISABLE', 'EC', 'EGI',
+                'EMI', 'ENABLE', 'END-RECEIVE', 'ENTRY-CONVENTION', 'EO', 'ESI',
+                'EXCEPTION-OBJECT', 'EXPANDS', 'FACTORY', 'FLOAT-BINARY-16',
+                'FLOAT-BINARY-34', 'FLOAT-BINARY-7', 'FLOAT-DECIMAL-16',
+                'FLOAT-DECIMAL-34', 'FLOAT-EXTENDED', 'FORMAT', 'FUNCTION-POINTER',
+                'GET', 'GROUP-USAGE', 'IMPLEMENTS', 'INFINITY', 'INHERITS',
+                'INTERFACE', 'INTERFACE-ID', 'INVOKE', 'LC_ALL', 'LC_COLLATE',
+                'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME',
+                'LINE-COUNTER', 'MESSAGE', 'METHOD', 'METHOD-ID', 'NESTED', 'NONE',
+                'NORMAL', 'OBJECT', 'OBJECT-REFERENCE', 'OPTIONS', 'OVERRIDE',
+                'PAGE-COUNTER', 'PF', 'PH', 'PROPERTY', 'PROTOTYPE', 'PURGE',
+                'QUEUE', 'RAISE', 'RAISING', 'RECEIVE', 'RELATION', 'REPLACE',
+                'REPRESENTS-NOT-A-NUMBER', 'RESET', 'RESUME', 'RETRY', 'RF', 'RH',
+                'SECONDS', 'SEGMENT', 'SELF', 'SEND', 'SOURCES', 'STATEMENT',
+                'STEP', 'STRONG', 'SUB-QUEUE-1', 'SUB-QUEUE-2', 'SUB-QUEUE-3',
+                'SUPER', 'SYMBOL', 'SYSTEM-DEFAULT', 'TABLE', 'TERMINAL', 'TEXT',
+                'TYPEDEF', 'UCS-4', 'UNIVERSAL', 'USER-DEFAULT', 'UTF-16', 'UTF-8',
+                'VAL-STATUS', 'VALID', 'VALIDATE', 'VALIDATE-STATUS'),
+                   prefix=r'(^|(?<=[^\w\-]))', suffix=r'\s*($|(?=[^\w\-]))'),
+             Error),
+
+            # Data Types
+            (r'(^|(?<=[^\w\-]))'
+             r'(PIC\s+.+?(?=(\s|\.\s))|PICTURE\s+.+?(?=(\s|\.\s))|'
+             r'(COMPUTATIONAL)(-[1-5X])?|(COMP)(-[1-5X])?|'
+             r'BINARY-C-LONG|'
+             r'BINARY-CHAR|BINARY-DOUBLE|BINARY-LONG|BINARY-SHORT|'
+             r'BINARY)\s*($|(?=[^\w\-]))', Keyword.Type),
+
+            # Operators
+            (r'(\*\*|\*|\+|-|/|<=|>=|<|>|==|/=|=)', Operator),
+
+            # (r'(::)', Keyword.Declaration),
+
+            (r'([(),;:&%.])', Punctuation),
+
+            # Intrinsics
+            (r'(^|(?<=[^\w\-]))(ABS|ACOS|ANNUITY|ASIN|ATAN|BYTE-LENGTH|'
+             r'CHAR|COMBINED-DATETIME|CONCATENATE|COS|CURRENT-DATE|'
+             r'DATE-OF-INTEGER|DATE-TO-YYYYMMDD|DAY-OF-INTEGER|DAY-TO-YYYYDDD|'
+             r'EXCEPTION-(?:FILE|LOCATION|STATEMENT|STATUS)|EXP10|EXP|E|'
+             r'FACTORIAL|FRACTION-PART|INTEGER-OF-(?:DATE|DAY|PART)|INTEGER|'
+             r'LENGTH|LOCALE-(?:DATE|TIME(?:-FROM-SECONDS)?)|LOG(?:10)?|'
+             r'LOWER-CASE|MAX|MEAN|MEDIAN|MIDRANGE|MIN|MOD|NUMVAL(?:-C)?|'
+             r'ORD(?:-MAX|-MIN)?|PI|PRESENT-VALUE|RANDOM|RANGE|REM|REVERSE|'
+             r'SECONDS-FROM-FORMATTED-TIME|SECONDS-PAST-MIDNIGHT|SIGN|SIN|SQRT|'
+             r'STANDARD-DEVIATION|STORED-CHAR-LENGTH|SUBSTITUTE(?:-CASE)?|'
+             r'SUM|TAN|TEST-DATE-YYYYMMDD|TEST-DAY-YYYYDDD|TRIM|'
+             r'UPPER-CASE|VARIANCE|WHEN-COMPILED|YEAR-TO-YYYY)\s*'
+             r'($|(?=[^\w\-]))', Name.Function),
+
+            # Booleans
+            (r'(^|(?<=[^\w\-]))(true|false)\s*($|(?=[^\w\-]))', Name.Builtin),
+            # Comparing Operators
+            (r'(^|(?<=[^\w\-]))(equal|equals|ne|lt|le|gt|ge|'
+             r'greater|less|than|not|and|or)\s*($|(?=[^\w\-]))', Operator.Word),
+        ],
+
+        # \"[^\"\n]*\"|\'[^\'\n]*\'
+        'strings': [
+            # apparently strings can be delimited by EOL if they are continued
+            # in the next line
+            (r'"[^"\n]*("|\n)', String.Double),
+            (r"'[^'\n]*('|\n)", String.Single),
+        ],
+
+        'nums': [
+            (r'\d+(\s*|\.$|$)', Number.Integer),
+            (r'[+-]?\d*\.\d+(E[-+]?\d+)?', Number.Float),
+            (r'[+-]?\d+\.\d*(E[-+]?\d+)?', Number.Float),
+        ],
+    }
+
+
+class CobolFreeformatLexer(CobolLexer):
+    """
+    Lexer for Free format OpenCOBOL code.
+
+    .. versionadded:: 1.6
+    """
+    name = 'COBOLFree'
+    aliases = ['cobolfree']
+    filenames = ['*.cbl', '*.CBL']
+    mimetypes = []
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'comment': [
+            (r'(\*>.*\n|^\w*\*.*$)', Comment),
+        ],
+    }
+
+
+class ABAPLexer(RegexLexer):
+    """
+    Lexer for ABAP, SAP's integrated language.
+
+    .. versionadded:: 1.1
+    """
+    name = 'ABAP'
+    aliases = ['abap']
+    filenames = ['*.abap', '*.ABAP']
+    mimetypes = ['text/x-abap']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'common': [
+            (r'\s+', Text),
+            (r'^\*.*$', Comment.Single),
+            (r'\".*?\n', Comment.Single),
+            (r'##\w+', Comment.Special),
+        ],
+        'variable-names': [
+            (r'<\S+>', Name.Variable),
+            (r'\w[\w~]*(?:(\[\])|->\*)?', Name.Variable),
+        ],
+        'root': [
+            include('common'),
+            # function calls
+            (r'CALL\s+(?:BADI|CUSTOMER-FUNCTION|FUNCTION)',
+             Keyword),
+            (r'(CALL\s+(?:DIALOG|SCREEN|SUBSCREEN|SELECTION-SCREEN|'
+             r'TRANSACTION|TRANSFORMATION))\b',
+             Keyword),
+            (r'(FORM|PERFORM)(\s+)(\w+)',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'(PERFORM)(\s+)(\()(\w+)(\))',
+             bygroups(Keyword, Text, Punctuation, Name.Variable, Punctuation)),
+            (r'(MODULE)(\s+)(\S+)(\s+)(INPUT|OUTPUT)',
+             bygroups(Keyword, Text, Name.Function, Text, Keyword)),
+
+            # method implementation
+            (r'(METHOD)(\s+)([\w~]+)',
+             bygroups(Keyword, Text, Name.Function)),
+            # method calls
+            (r'(\s+)([\w\-]+)([=\-]>)([\w\-~]+)',
+             bygroups(Text, Name.Variable, Operator, Name.Function)),
+            # call methodnames returning style
+            (r'(?<=(=|-)>)([\w\-~]+)(?=\()', Name.Function),
+
+            # text elements
+            (r'(TEXT)(-)(\d{3})',
+             bygroups(Keyword, Punctuation, Number.Integer)),
+            (r'(TEXT)(-)(\w{3})',
+             bygroups(Keyword, Punctuation, Name.Variable)),
+
+            # keywords with dashes in them.
+            # these need to be first, because for instance the -ID part
+            # of MESSAGE-ID wouldn't get highlighted if MESSAGE was
+            # first in the list of keywords.
+            (r'(ADD-CORRESPONDING|AUTHORITY-CHECK|'
+             r'CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|'
+             r'DELETE-ADJACENT|DIVIDE-CORRESPONDING|'
+             r'EDITOR-CALL|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|EXIT-COMMAND|'
+             r'FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|'
+             r'INTERFACE-POOL|INVERTED-DATE|'
+             r'LOAD-OF-PROGRAM|LOG-POINT|'
+             r'MESSAGE-ID|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|'
+             r'NEW-LINE|NEW-PAGE|NEW-SECTION|NO-EXTENSION|'
+             r'OUTPUT-LENGTH|PRINT-CONTROL|'
+             r'SELECT-OPTIONS|START-OF-SELECTION|SUBTRACT-CORRESPONDING|'
+             r'SYNTAX-CHECK|SYSTEM-EXCEPTIONS|'
+             r'TYPE-POOL|TYPE-POOLS|NO-DISPLAY'
+             r')\b', Keyword),
+
+            # keyword kombinations
+            (r'(?<![-\>])(CREATE\s+(PUBLIC|PRIVATE|DATA|OBJECT)|'
+             r'(PUBLIC|PRIVATE|PROTECTED)\s+SECTION|'
+             r'(TYPE|LIKE)\s+((LINE\s+OF|REF\s+TO|'
+             r'(SORTED|STANDARD|HASHED)\s+TABLE\s+OF))?|'
+             r'FROM\s+(DATABASE|MEMORY)|CALL\s+METHOD|'
+             r'(GROUP|ORDER) BY|HAVING|SEPARATED BY|'
+             r'GET\s+(BADI|BIT|CURSOR|DATASET|LOCALE|PARAMETER|'
+             r'PF-STATUS|(PROPERTY|REFERENCE)\s+OF|'
+             r'RUN\s+TIME|TIME\s+(STAMP)?)?|'
+             r'SET\s+(BIT|BLANK\s+LINES|COUNTRY|CURSOR|DATASET|EXTENDED\s+CHECK|'
+             r'HANDLER|HOLD\s+DATA|LANGUAGE|LEFT\s+SCROLL-BOUNDARY|'
+             r'LOCALE|MARGIN|PARAMETER|PF-STATUS|PROPERTY\s+OF|'
+             r'RUN\s+TIME\s+(ANALYZER|CLOCK\s+RESOLUTION)|SCREEN|'
+             r'TITLEBAR|UPADTE\s+TASK\s+LOCAL|USER-COMMAND)|'
+             r'CONVERT\s+((INVERTED-)?DATE|TIME|TIME\s+STAMP|TEXT)|'
+             r'(CLOSE|OPEN)\s+(DATASET|CURSOR)|'
+             r'(TO|FROM)\s+(DATA BUFFER|INTERNAL TABLE|MEMORY ID|'
+             r'DATABASE|SHARED\s+(MEMORY|BUFFER))|'
+             r'DESCRIBE\s+(DISTANCE\s+BETWEEN|FIELD|LIST|TABLE)|'
+             r'FREE\s(MEMORY|OBJECT)?|'
+             r'PROCESS\s+(BEFORE\s+OUTPUT|AFTER\s+INPUT|'
+             r'ON\s+(VALUE-REQUEST|HELP-REQUEST))|'
+             r'AT\s+(LINE-SELECTION|USER-COMMAND|END\s+OF|NEW)|'
+             r'AT\s+SELECTION-SCREEN(\s+(ON(\s+(BLOCK|(HELP|VALUE)-REQUEST\s+FOR|'
+             r'END\s+OF|RADIOBUTTON\s+GROUP))?|OUTPUT))?|'
+             r'SELECTION-SCREEN:?\s+((BEGIN|END)\s+OF\s+((TABBED\s+)?BLOCK|LINE|'
+             r'SCREEN)|COMMENT|FUNCTION\s+KEY|'
+             r'INCLUDE\s+BLOCKS|POSITION|PUSHBUTTON|'
+             r'SKIP|ULINE)|'
+             r'LEAVE\s+(LIST-PROCESSING|PROGRAM|SCREEN|'
+             r'TO LIST-PROCESSING|TO TRANSACTION)'
+             r'(ENDING|STARTING)\s+AT|'
+             r'FORMAT\s+(COLOR|INTENSIFIED|INVERSE|HOTSPOT|INPUT|FRAMES|RESET)|'
+             r'AS\s+(CHECKBOX|SUBSCREEN|WINDOW)|'
+             r'WITH\s+(((NON-)?UNIQUE)?\s+KEY|FRAME)|'
+             r'(BEGIN|END)\s+OF|'
+             r'DELETE(\s+ADJACENT\s+DUPLICATES\sFROM)?|'
+             r'COMPARING(\s+ALL\s+FIELDS)?|'
+             r'(INSERT|APPEND)(\s+INITIAL\s+LINE\s+(IN)?TO|\s+LINES\s+OF)?|'
+             r'IN\s+((BYTE|CHARACTER)\s+MODE|PROGRAM)|'
+             r'END-OF-(DEFINITION|PAGE|SELECTION)|'
+             r'WITH\s+FRAME(\s+TITLE)|'
+             r'(REPLACE|FIND)\s+((FIRST|ALL)\s+OCCURRENCES?\s+OF\s+)?(SUBSTRING|REGEX)?|'
+             r'MATCH\s+(LENGTH|COUNT|LINE|OFFSET)|'
+             r'(RESPECTING|IGNORING)\s+CASE|'
+             r'IN\s+UPDATE\s+TASK|'
+             r'(SOURCE|RESULT)\s+(XML)?|'
+             r'REFERENCE\s+INTO|'
+
+             # simple kombinations
+             r'AND\s+(MARK|RETURN)|CLIENT\s+SPECIFIED|CORRESPONDING\s+FIELDS\s+OF|'
+             r'IF\s+FOUND|FOR\s+EVENT|INHERITING\s+FROM|LEAVE\s+TO\s+SCREEN|'
+             r'LOOP\s+AT\s+(SCREEN)?|LOWER\s+CASE|MATCHCODE\s+OBJECT|MODIF\s+ID|'
+             r'MODIFY\s+SCREEN|NESTING\s+LEVEL|NO\s+INTERVALS|OF\s+STRUCTURE|'
+             r'RADIOBUTTON\s+GROUP|RANGE\s+OF|REF\s+TO|SUPPRESS DIALOG|'
+             r'TABLE\s+OF|UPPER\s+CASE|TRANSPORTING\s+NO\s+FIELDS|'
+             r'VALUE\s+CHECK|VISIBLE\s+LENGTH|HEADER\s+LINE|COMMON\s+PART)\b', Keyword),
+
+            # single word keywords.
+            (r'(^|(?<=(\s|\.)))(ABBREVIATED|ABSTRACT|ADD|ALIASES|ALIGN|ALPHA|'
+             r'ASSERT|AS|ASSIGN(ING)?|AT(\s+FIRST)?|'
+             r'BACK|BLOCK|BREAK-POINT|'
+             r'CASE|CATCH|CHANGING|CHECK|CLASS|CLEAR|COLLECT|COLOR|COMMIT|'
+             r'CREATE|COMMUNICATION|COMPONENTS?|COMPUTE|CONCATENATE|CONDENSE|'
+             r'CONSTANTS|CONTEXTS|CONTINUE|CONTROLS|COUNTRY|CURRENCY|'
+             r'DATA|DATE|DECIMALS|DEFAULT|DEFINE|DEFINITION|DEFERRED|DEMAND|'
+             r'DETAIL|DIRECTORY|DIVIDE|DO|DUMMY|'
+             r'ELSE(IF)?|ENDAT|ENDCASE|ENDCATCH|ENDCLASS|ENDDO|ENDFORM|ENDFUNCTION|'
+             r'ENDIF|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDSELECT|ENDTRY|ENDWHILE|'
+             r'ENHANCEMENT|EVENTS|EXACT|EXCEPTIONS?|EXIT|EXPONENT|EXPORT|EXPORTING|EXTRACT|'
+             r'FETCH|FIELDS?|FOR|FORM|FORMAT|FREE|FROM|FUNCTION|'
+             r'HIDE|'
+             r'ID|IF|IMPORT|IMPLEMENTATION|IMPORTING|IN|INCLUDE|INCLUDING|'
+             r'INDEX|INFOTYPES|INITIALIZATION|INTERFACE|INTERFACES|INTO|'
+             r'LANGUAGE|LEAVE|LENGTH|LINES|LOAD|LOCAL|'
+             r'JOIN|'
+             r'KEY|'
+             r'NEXT|'
+             r'MAXIMUM|MESSAGE|METHOD[S]?|MINIMUM|MODULE|MODIFIER|MODIFY|MOVE|MULTIPLY|'
+             r'NODES|NUMBER|'
+             r'OBLIGATORY|OBJECT|OF|OFF|ON|OTHERS|OVERLAY|'
+             r'PACK|PAD|PARAMETERS|PERCENTAGE|POSITION|PROGRAM|PROVIDE|PUBLIC|PUT|PF\d\d|'
+             r'RAISE|RAISING|RANGES?|READ|RECEIVE|REDEFINITION|REFRESH|REJECT|REPORT|RESERVE|'
+             r'RESUME|RETRY|RETURN|RETURNING|RIGHT|ROLLBACK|REPLACE|'
+             r'SCROLL|SEARCH|SELECT|SHIFT|SIGN|SINGLE|SIZE|SKIP|SORT|SPLIT|STATICS|STOP|'
+             r'STYLE|SUBMATCHES|SUBMIT|SUBTRACT|SUM(?!\()|SUMMARY|SUMMING|SUPPLY|'
+             r'TABLE|TABLES|TIMESTAMP|TIMES?|TIMEZONE|TITLE|\??TO|'
+             r'TOP-OF-PAGE|TRANSFER|TRANSLATE|TRY|TYPES|'
+             r'ULINE|UNDER|UNPACK|UPDATE|USING|'
+             r'VALUE|VALUES|VIA|VARYING|VARY|'
+             r'WAIT|WHEN|WHERE|WIDTH|WHILE|WITH|WINDOW|WRITE|XSD|ZERO)\b', Keyword),
+
+            # builtins
+            (r'(abs|acos|asin|atan|'
+             r'boolc|boolx|bit_set|'
+             r'char_off|charlen|ceil|cmax|cmin|condense|contains|'
+             r'contains_any_of|contains_any_not_of|concat_lines_of|cos|cosh|'
+             r'count|count_any_of|count_any_not_of|'
+             r'dbmaxlen|distance|'
+             r'escape|exp|'
+             r'find|find_end|find_any_of|find_any_not_of|floor|frac|from_mixed|'
+             r'insert|'
+             r'lines|log|log10|'
+             r'match|matches|'
+             r'nmax|nmin|numofchar|'
+             r'repeat|replace|rescale|reverse|round|'
+             r'segment|shift_left|shift_right|sign|sin|sinh|sqrt|strlen|'
+             r'substring|substring_after|substring_from|substring_before|substring_to|'
+             r'tan|tanh|to_upper|to_lower|to_mixed|translate|trunc|'
+             r'xstrlen)(\()\b', bygroups(Name.Builtin, Punctuation)),
+
+            (r'&[0-9]', Name),
+            (r'[0-9]+', Number.Integer),
+
+            # operators which look like variable names before
+            # parsing variable names.
+            (r'(?<=(\s|.))(AND|OR|EQ|NE|GT|LT|GE|LE|CO|CN|CA|NA|CS|NOT|NS|CP|NP|'
+             r'BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS|'
+             r'IS\s+(NOT\s+)?(INITIAL|ASSIGNED|REQUESTED|BOUND))\b', Operator.Word),
+
+            include('variable-names'),
+
+            # standard operators after variable names,
+            # because < and > are part of field symbols.
+            (r'[?*<>=\-+&]', Operator),
+            (r"'(''|[^'])*'", String.Single),
+            (r"`([^`])*`", String.Single),
+            (r"([|}])([^{}|]*?)([|{])",
+             bygroups(Punctuation, String.Single, Punctuation)),
+            (r'[/;:()\[\],.]', Punctuation),
+            (r'(!)(\w+)', bygroups(Operator, Name)),
+        ],
+    }
+
+
+class OpenEdgeLexer(RegexLexer):
+    """
+    Lexer for `OpenEdge ABL (formerly Progress)
+    <http://web.progress.com/en/openedge/abl.html>`_ source code.
+
+    .. versionadded:: 1.5
+    """
+    name = 'OpenEdge ABL'
+    aliases = ['openedge', 'abl', 'progress']
+    filenames = ['*.p', '*.cls']
+    mimetypes = ['text/x-openedge', 'application/x-openedge']
+
+    types = (r'(?i)(^|(?<=[^\w\-]))(CHARACTER|CHAR|CHARA|CHARAC|CHARACT|CHARACTE|'
+             r'COM-HANDLE|DATE|DATETIME|DATETIME-TZ|'
+             r'DECIMAL|DEC|DECI|DECIM|DECIMA|HANDLE|'
+             r'INT64|INTEGER|INT|INTE|INTEG|INTEGE|'
+             r'LOGICAL|LONGCHAR|MEMPTR|RAW|RECID|ROWID)\s*($|(?=[^\w\-]))')
+
+    keywords = words(OPENEDGEKEYWORDS,
+                     prefix=r'(?i)(^|(?<=[^\w\-]))',
+                     suffix=r'\s*($|(?=[^\w\-]))')
+
+    tokens = {
+        'root': [
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'\{', Comment.Preproc, 'preprocessor'),
+            (r'\s*&.*', Comment.Preproc),
+            (r'0[xX][0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'(?i)(DEFINE|DEF|DEFI|DEFIN)\b', Keyword.Declaration),
+            (types, Keyword.Type),
+            (keywords, Name.Builtin),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\s+', Text),
+            (r'[+*/=-]', Operator),
+            (r'[.:()]', Punctuation),
+            (r'.', Name.Variable),  # Lazy catch-all
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'preprocessor': [
+            (r'[^{}]', Comment.Preproc),
+            (r'\{', Comment.Preproc, '#push'),
+            (r'\}', Comment.Preproc, '#pop'),
+        ],
+    }
+
+
+class GoodDataCLLexer(RegexLexer):
+    """
+    Lexer for `GoodData-CL
+    <http://github.com/gooddata/GoodData-CL/raw/master/cli/src/main/resources/\
+com/gooddata/processor/COMMANDS.txt>`_
+    script files.
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'GoodData-CL'
+    aliases = ['gooddata-cl']
+    filenames = ['*.gdc']
+    mimetypes = ['text/x-gooddata-cl']
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            # Comments
+            (r'#.*', Comment.Single),
+            # Function call
+            (r'[a-z]\w*', Name.Function),
+            # Argument list
+            (r'\(', Punctuation, 'args-list'),
+            # Punctuation
+            (r';', Punctuation),
+            # Space is not significant
+            (r'\s+', Text)
+        ],
+        'args-list': [
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'[a-z]\w*', Name.Variable),
+            (r'=', Operator),
+            (r'"', String, 'string-literal'),
+            (r'[0-9]+(?:\.[0-9]+)?(?:e[+-]?[0-9]{1,3})?', Number),
+            # Space is not significant
+            (r'\s', Text)
+        ],
+        'string-literal': [
+            (r'\\[tnrfbae"\\]', String.Escape),
+            (r'"', String, '#pop'),
+            (r'[^\\"]+', String)
+        ]
+    }
+
+
+class MaqlLexer(RegexLexer):
+    """
+    Lexer for `GoodData MAQL
+    <https://secure.gooddata.com/docs/html/advanced.metric.tutorial.html>`_
+    scripts.
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'MAQL'
+    aliases = ['maql']
+    filenames = ['*.maql']
+    mimetypes = ['text/x-gooddata-maql', 'application/x-gooddata-maql']
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            # IDENTITY
+            (r'IDENTIFIER\b', Name.Builtin),
+            # IDENTIFIER
+            (r'\{[^}]+\}', Name.Variable),
+            # NUMBER
+            (r'[0-9]+(?:\.[0-9]+)?(?:e[+-]?[0-9]{1,3})?', Number),
+            # STRING
+            (r'"', String, 'string-literal'),
+            #  RELATION
+            (r'\<\>|\!\=', Operator),
+            (r'\=|\>\=|\>|\<\=|\<', Operator),
+            # :=
+            (r'\:\=', Operator),
+            # OBJECT
+            (r'\[[^]]+\]', Name.Variable.Class),
+            # keywords
+            (words((
+                'DIMENSION', 'DIMENSIONS', 'BOTTOM', 'METRIC', 'COUNT', 'OTHER',
+                'FACT', 'WITH', 'TOP', 'OR', 'ATTRIBUTE', 'CREATE', 'PARENT',
+                'FALSE', 'ROW', 'ROWS', 'FROM', 'ALL', 'AS', 'PF', 'COLUMN',
+                'COLUMNS', 'DEFINE', 'REPORT', 'LIMIT', 'TABLE', 'LIKE', 'AND',
+                'BY', 'BETWEEN', 'EXCEPT', 'SELECT', 'MATCH', 'WHERE', 'TRUE',
+                'FOR', 'IN', 'WITHOUT', 'FILTER', 'ALIAS', 'WHEN', 'NOT', 'ON',
+                'KEYS', 'KEY', 'FULLSET', 'PRIMARY', 'LABELS', 'LABEL',
+                'VISUAL', 'TITLE', 'DESCRIPTION', 'FOLDER', 'ALTER', 'DROP',
+                'ADD', 'DATASET', 'DATATYPE', 'INT', 'BIGINT', 'DOUBLE', 'DATE',
+                'VARCHAR', 'DECIMAL', 'SYNCHRONIZE', 'TYPE', 'DEFAULT', 'ORDER',
+                'ASC', 'DESC', 'HYPERLINK', 'INCLUDE', 'TEMPLATE', 'MODIFY'),
+                suffix=r'\b'),
+             Keyword),
+            # FUNCNAME
+            (r'[a-z]\w*\b', Name.Function),
+            # Comments
+            (r'#.*', Comment.Single),
+            # Punctuation
+            (r'[,;()]', Punctuation),
+            # Space is not significant
+            (r'\s+', Text)
+        ],
+        'string-literal': [
+            (r'\\[tnrfbae"\\]', String.Escape),
+            (r'"', String, '#pop'),
+            (r'[^\\"]+', String)
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/templates.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/templates.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/templates.py	(revision 1126)
@@ -0,0 +1,2283 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.templates
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various template engines' markup.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexers.html import HtmlLexer, XmlLexer
+from pygments.lexers.javascript import JavascriptLexer, LassoLexer
+from pygments.lexers.css import CssLexer
+from pygments.lexers.php import PhpLexer
+from pygments.lexers.python import PythonLexer
+from pygments.lexers.perl import PerlLexer
+from pygments.lexers.jvm import JavaLexer, TeaLangLexer
+from pygments.lexers.data import YamlLexer
+from pygments.lexer import Lexer, DelegatingLexer, RegexLexer, bygroups, \
+    include, using, this, default, combined
+from pygments.token import Error, Punctuation, Whitespace, \
+    Text, Comment, Operator, Keyword, Name, String, Number, Other, Token
+from pygments.util import html_doctype_matches, looks_like_xml
+
+__all__ = ['HtmlPhpLexer', 'XmlPhpLexer', 'CssPhpLexer',
+           'JavascriptPhpLexer', 'ErbLexer', 'RhtmlLexer',
+           'XmlErbLexer', 'CssErbLexer', 'JavascriptErbLexer',
+           'SmartyLexer', 'HtmlSmartyLexer', 'XmlSmartyLexer',
+           'CssSmartyLexer', 'JavascriptSmartyLexer', 'DjangoLexer',
+           'HtmlDjangoLexer', 'CssDjangoLexer', 'XmlDjangoLexer',
+           'JavascriptDjangoLexer', 'GenshiLexer', 'HtmlGenshiLexer',
+           'GenshiTextLexer', 'CssGenshiLexer', 'JavascriptGenshiLexer',
+           'MyghtyLexer', 'MyghtyHtmlLexer', 'MyghtyXmlLexer',
+           'MyghtyCssLexer', 'MyghtyJavascriptLexer', 'MasonLexer', 'MakoLexer',
+           'MakoHtmlLexer', 'MakoXmlLexer', 'MakoJavascriptLexer',
+           'MakoCssLexer', 'JspLexer', 'CheetahLexer', 'CheetahHtmlLexer',
+           'CheetahXmlLexer', 'CheetahJavascriptLexer', 'EvoqueLexer',
+           'EvoqueHtmlLexer', 'EvoqueXmlLexer', 'ColdfusionLexer',
+           'ColdfusionHtmlLexer', 'ColdfusionCFCLexer', 'VelocityLexer',
+           'VelocityHtmlLexer', 'VelocityXmlLexer', 'SspLexer',
+           'TeaTemplateLexer', 'LassoHtmlLexer', 'LassoXmlLexer',
+           'LassoCssLexer', 'LassoJavascriptLexer', 'HandlebarsLexer',
+           'HandlebarsHtmlLexer', 'YamlJinjaLexer', 'LiquidLexer',
+           'TwigLexer', 'TwigHtmlLexer', 'Angular2Lexer', 'Angular2HtmlLexer']
+
+
+class ErbLexer(Lexer):
+    """
+    Generic `ERB <http://ruby-doc.org/core/classes/ERB.html>`_ (Ruby Templating)
+    lexer.
+
+    Just highlights ruby code between the preprocessor directives, other data
+    is left untouched by the lexer.
+
+    All options are also forwarded to the `RubyLexer`.
+    """
+
+    name = 'ERB'
+    aliases = ['erb']
+    mimetypes = ['application/x-ruby-templating']
+
+    _block_re = re.compile(r'(<%%|%%>|<%=|<%#|<%-|<%|-%>|%>|^%[^%].*?$)', re.M)
+
+    def __init__(self, **options):
+        from pygments.lexers.ruby import RubyLexer
+        self.ruby_lexer = RubyLexer(**options)
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        """
+        Since ERB doesn't allow "<%" and other tags inside of ruby
+        blocks we have to use a split approach here that fails for
+        that too.
+        """
+        tokens = self._block_re.split(text)
+        tokens.reverse()
+        state = idx = 0
+        try:
+            while True:
+                # text
+                if state == 0:
+                    val = tokens.pop()
+                    yield idx, Other, val
+                    idx += len(val)
+                    state = 1
+                # block starts
+                elif state == 1:
+                    tag = tokens.pop()
+                    # literals
+                    if tag in ('<%%', '%%>'):
+                        yield idx, Other, tag
+                        idx += 3
+                        state = 0
+                    # comment
+                    elif tag == '<%#':
+                        yield idx, Comment.Preproc, tag
+                        val = tokens.pop()
+                        yield idx + 3, Comment, val
+                        idx += 3 + len(val)
+                        state = 2
+                    # blocks or output
+                    elif tag in ('<%', '<%=', '<%-'):
+                        yield idx, Comment.Preproc, tag
+                        idx += len(tag)
+                        data = tokens.pop()
+                        r_idx = 0
+                        for r_idx, r_token, r_value in \
+                                self.ruby_lexer.get_tokens_unprocessed(data):
+                            yield r_idx + idx, r_token, r_value
+                        idx += len(data)
+                        state = 2
+                    elif tag in ('%>', '-%>'):
+                        yield idx, Error, tag
+                        idx += len(tag)
+                        state = 0
+                    # % raw ruby statements
+                    else:
+                        yield idx, Comment.Preproc, tag[0]
+                        r_idx = 0
+                        for r_idx, r_token, r_value in \
+                                self.ruby_lexer.get_tokens_unprocessed(tag[1:]):
+                            yield idx + 1 + r_idx, r_token, r_value
+                        idx += len(tag)
+                        state = 0
+                # block ends
+                elif state == 2:
+                    tag = tokens.pop()
+                    if tag not in ('%>', '-%>'):
+                        yield idx, Other, tag
+                    else:
+                        yield idx, Comment.Preproc, tag
+                    idx += len(tag)
+                    state = 0
+        except IndexError:
+            return
+
+    def analyse_text(text):
+        if '<%' in text and '%>' in text:
+            return 0.4
+
+
+class SmartyLexer(RegexLexer):
+    """
+    Generic `Smarty <http://smarty.php.net/>`_ template lexer.
+
+    Just highlights smarty code between the preprocessor directives, other
+    data is left untouched by the lexer.
+    """
+
+    name = 'Smarty'
+    aliases = ['smarty']
+    filenames = ['*.tpl']
+    mimetypes = ['application/x-smarty']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+            (r'(\{)(\*.*?\*)(\})',
+             bygroups(Comment.Preproc, Comment, Comment.Preproc)),
+            (r'(\{php\})(.*?)(\{/php\})',
+             bygroups(Comment.Preproc, using(PhpLexer, startinline=True),
+                      Comment.Preproc)),
+            (r'(\{)(/?[a-zA-Z_]\w*)(\s*)',
+             bygroups(Comment.Preproc, Name.Function, Text), 'smarty'),
+            (r'\{', Comment.Preproc, 'smarty')
+        ],
+        'smarty': [
+            (r'\s+', Text),
+            (r'\{', Comment.Preproc, '#push'),
+            (r'\}', Comment.Preproc, '#pop'),
+            (r'#[a-zA-Z_]\w*#', Name.Variable),
+            (r'\$[a-zA-Z_]\w*(\.\w+)*', Name.Variable),
+            (r'[~!%^&*()+=|\[\]:;,.<>/?@-]', Operator),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'[a-zA-Z_]\w*', Name.Attribute)
+        ]
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search('\{if\s+.*?\}.*?\{/if\}', text):
+            rv += 0.15
+        if re.search('\{include\s+file=.*?\}', text):
+            rv += 0.15
+        if re.search('\{foreach\s+.*?\}.*?\{/foreach\}', text):
+            rv += 0.15
+        if re.search('\{\$.*?\}', text):
+            rv += 0.01
+        return rv
+
+
+class VelocityLexer(RegexLexer):
+    """
+    Generic `Velocity <http://velocity.apache.org/>`_ template lexer.
+
+    Just highlights velocity directives and variable references, other
+    data is left untouched by the lexer.
+    """
+
+    name = 'Velocity'
+    aliases = ['velocity']
+    filenames = ['*.vm', '*.fhtml']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    identifier = r'[a-zA-Z_]\w*'
+
+    tokens = {
+        'root': [
+            (r'[^{#$]+', Other),
+            (r'(#)(\*.*?\*)(#)',
+             bygroups(Comment.Preproc, Comment, Comment.Preproc)),
+            (r'(##)(.*?$)',
+             bygroups(Comment.Preproc, Comment)),
+            (r'(#\{?)(' + identifier + r')(\}?)(\s?\()',
+             bygroups(Comment.Preproc, Name.Function, Comment.Preproc, Punctuation),
+             'directiveparams'),
+            (r'(#\{?)(' + identifier + r')(\}|\b)',
+             bygroups(Comment.Preproc, Name.Function, Comment.Preproc)),
+            (r'\$\{?', Punctuation, 'variable')
+        ],
+        'variable': [
+            (identifier, Name.Variable),
+            (r'\(', Punctuation, 'funcparams'),
+            (r'(\.)(' + identifier + r')',
+             bygroups(Punctuation, Name.Variable), '#push'),
+            (r'\}', Punctuation, '#pop'),
+            default('#pop')
+        ],
+        'directiveparams': [
+            (r'(&&|\|\||==?|!=?|[-<>+*%&|^/])|\b(eq|ne|gt|lt|ge|le|not|in)\b',
+             Operator),
+            (r'\[', Operator, 'rangeoperator'),
+            (r'\b' + identifier + r'\b', Name.Function),
+            include('funcparams')
+        ],
+        'rangeoperator': [
+            (r'\.\.', Operator),
+            include('funcparams'),
+            (r'\]', Operator, '#pop')
+        ],
+        'funcparams': [
+            (r'\$\{?', Punctuation, 'variable'),
+            (r'\s+', Text),
+            (r'[,:]', Punctuation),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+            (r"\b[0-9]+\b", Number),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'#\{?macro\}?\(.*?\).*?#\{?end\}?', text):
+            rv += 0.25
+        if re.search(r'#\{?if\}?\(.+?\).*?#\{?end\}?', text):
+            rv += 0.15
+        if re.search(r'#\{?foreach\}?\(.+?\).*?#\{?end\}?', text):
+            rv += 0.15
+        if re.search(r'\$\{?[a-zA-Z_]\w*(\([^)]*\))?'
+                     r'(\.\w+(\([^)]*\))?)*\}?', text):
+            rv += 0.01
+        return rv
+
+
+class VelocityHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `VelocityLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+
+    """
+
+    name = 'HTML+Velocity'
+    aliases = ['html+velocity']
+    alias_filenames = ['*.html', '*.fhtml']
+    mimetypes = ['text/html+velocity']
+
+    def __init__(self, **options):
+        super(VelocityHtmlLexer, self).__init__(HtmlLexer, VelocityLexer,
+                                                **options)
+
+
+class VelocityXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `VelocityLexer` that highlights unlexed data
+    with the `XmlLexer`.
+
+    """
+
+    name = 'XML+Velocity'
+    aliases = ['xml+velocity']
+    alias_filenames = ['*.xml', '*.vm']
+    mimetypes = ['application/xml+velocity']
+
+    def __init__(self, **options):
+        super(VelocityXmlLexer, self).__init__(XmlLexer, VelocityLexer,
+                                               **options)
+
+    def analyse_text(text):
+        rv = VelocityLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class DjangoLexer(RegexLexer):
+    """
+    Generic `django <http://www.djangoproject.com/documentation/templates/>`_
+    and `jinja <http://wsgiarea.pocoo.org/jinja/>`_ template lexer.
+
+    It just highlights django/jinja code between the preprocessor directives,
+    other data is left untouched by the lexer.
+    """
+
+    name = 'Django/Jinja'
+    aliases = ['django', 'jinja']
+    mimetypes = ['application/x-django-templating', 'application/x-jinja']
+
+    flags = re.M | re.S
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+            (r'\{\{', Comment.Preproc, 'var'),
+            # jinja/django comments
+            (r'\{[*#].*?[*#]\}', Comment),
+            # django comments
+            (r'(\{%)(-?\s*)(comment)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endcomment)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Comment, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            # raw jinja blocks
+            (r'(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endraw)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Text, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            # filter blocks
+            (r'(\{%)(-?\s*)(filter)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Name.Function),
+             'block'),
+            (r'(\{%)(-?\s*)([a-zA-Z_]\w*)',
+             bygroups(Comment.Preproc, Text, Keyword), 'block'),
+            (r'\{', Other)
+        ],
+        'varnames': [
+            (r'(\|)(\s*)([a-zA-Z_]\w*)',
+             bygroups(Operator, Text, Name.Function)),
+            (r'(is)(\s+)(not)?(\s+)?([a-zA-Z_]\w*)',
+             bygroups(Keyword, Text, Keyword, Text, Name.Function)),
+            (r'(_|true|false|none|True|False|None)\b', Keyword.Pseudo),
+            (r'(in|as|reversed|recursive|not|and|or|is|if|else|import|'
+             r'with(?:(?:out)?\s*context)?|scoped|ignore\s+missing)\b',
+             Keyword),
+            (r'(loop|block|super|forloop)\b', Name.Builtin),
+            (r'[a-zA-Z_][\w-]*', Name.Variable),
+            (r'\.\w+', Name.Variable),
+            (r':?"(\\\\|\\"|[^"])*"', String.Double),
+            (r":?'(\\\\|\\'|[^'])*'", String.Single),
+            (r'([{}()\[\]+\-*/,:~]|[><=]=?)', Operator),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+        ],
+        'var': [
+            (r'\s+', Text),
+            (r'(-?)(\}\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames')
+        ],
+        'block': [
+            (r'\s+', Text),
+            (r'(-?)(%\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames'),
+            (r'.', Punctuation)
+        ]
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'\{%\s*(block|extends)', text) is not None:
+            rv += 0.4
+        if re.search(r'\{%\s*if\s*.*?%\}', text) is not None:
+            rv += 0.1
+        if re.search(r'\{\{.*?\}\}', text) is not None:
+            rv += 0.1
+        return rv
+
+
+class MyghtyLexer(RegexLexer):
+    """
+    Generic `myghty templates`_ lexer. Code that isn't Myghty
+    markup is yielded as `Token.Other`.
+
+    .. versionadded:: 0.6
+
+    .. _myghty templates: http://www.myghty.org/
+    """
+
+    name = 'Myghty'
+    aliases = ['myghty']
+    filenames = ['*.myt', 'autodelegate']
+    mimetypes = ['application/x-myghty']
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(<%(?:def|method))(\s*)(.*?)(>)(.*?)(</%\2\s*>)(?s)',
+             bygroups(Name.Tag, Text, Name.Function, Name.Tag,
+                      using(this), Name.Tag)),
+            (r'(<%\w+)(.*?)(>)(.*?)(</%\2\s*>)(?s)',
+             bygroups(Name.Tag, Name.Function, Name.Tag,
+                      using(PythonLexer), Name.Tag)),
+            (r'(<&[^|])(.*?)(,.*?)?(&>)',
+             bygroups(Name.Tag, Name.Function, using(PythonLexer), Name.Tag)),
+            (r'(<&\|)(.*?)(,.*?)?(&>)(?s)',
+             bygroups(Name.Tag, Name.Function, using(PythonLexer), Name.Tag)),
+            (r'</&>', Name.Tag),
+            (r'(<%!?)(.*?)(%>)(?s)',
+             bygroups(Name.Tag, using(PythonLexer), Name.Tag)),
+            (r'(?<=^)#[^\n]*(\n|\Z)', Comment),
+            (r'(?<=^)(%)([^\n]*)(\n|\Z)',
+             bygroups(Name.Tag, using(PythonLexer), Other)),
+            (r"""(?sx)
+                 (.+?)               # anything, followed by:
+                 (?:
+                  (?<=\n)(?=[%#]) |  # an eval or comment line
+                  (?=</?[%&]) |      # a substitution or block or
+                                     # call start or end
+                                     # - don't consume
+                  (\\\n) |           # an escaped newline
+                  \Z                 # end of string
+                 )""", bygroups(Other, Operator)),
+        ]
+    }
+
+
+class MyghtyHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'HTML+Myghty'
+    aliases = ['html+myghty']
+    mimetypes = ['text/html+myghty']
+
+    def __init__(self, **options):
+        super(MyghtyHtmlLexer, self).__init__(HtmlLexer, MyghtyLexer,
+                                              **options)
+
+
+class MyghtyXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `XmlLexer`.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'XML+Myghty'
+    aliases = ['xml+myghty']
+    mimetypes = ['application/xml+myghty']
+
+    def __init__(self, **options):
+        super(MyghtyXmlLexer, self).__init__(XmlLexer, MyghtyLexer,
+                                             **options)
+
+
+class MyghtyJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `JavascriptLexer`.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'JavaScript+Myghty'
+    aliases = ['js+myghty', 'javascript+myghty']
+    mimetypes = ['application/x-javascript+myghty',
+                 'text/x-javascript+myghty',
+                 'text/javascript+mygthy']
+
+    def __init__(self, **options):
+        super(MyghtyJavascriptLexer, self).__init__(JavascriptLexer,
+                                                    MyghtyLexer, **options)
+
+
+class MyghtyCssLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `CssLexer`.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'CSS+Myghty'
+    aliases = ['css+myghty']
+    mimetypes = ['text/css+myghty']
+
+    def __init__(self, **options):
+        super(MyghtyCssLexer, self).__init__(CssLexer, MyghtyLexer,
+                                             **options)
+
+
+class MasonLexer(RegexLexer):
+    """
+    Generic `mason templates`_ lexer. Stolen from Myghty lexer. Code that isn't
+    Mason markup is HTML.
+
+    .. _mason templates: http://www.masonhq.com/
+
+    .. versionadded:: 1.4
+    """
+    name = 'Mason'
+    aliases = ['mason']
+    filenames = ['*.m', '*.mhtml', '*.mc', '*.mi', 'autohandler', 'dhandler']
+    mimetypes = ['application/x-mason']
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(<%doc>)(.*?)(</%doc>)(?s)',
+             bygroups(Name.Tag, Comment.Multiline, Name.Tag)),
+            (r'(<%(?:def|method))(\s*)(.*?)(>)(.*?)(</%\2\s*>)(?s)',
+             bygroups(Name.Tag, Text, Name.Function, Name.Tag,
+                      using(this), Name.Tag)),
+            (r'(<%\w+)(.*?)(>)(.*?)(</%\2\s*>)(?s)',
+             bygroups(Name.Tag, Name.Function, Name.Tag,
+                      using(PerlLexer), Name.Tag)),
+            (r'(<&[^|])(.*?)(,.*?)?(&>)(?s)',
+             bygroups(Name.Tag, Name.Function, using(PerlLexer), Name.Tag)),
+            (r'(<&\|)(.*?)(,.*?)?(&>)(?s)',
+             bygroups(Name.Tag, Name.Function, using(PerlLexer), Name.Tag)),
+            (r'</&>', Name.Tag),
+            (r'(<%!?)(.*?)(%>)(?s)',
+             bygroups(Name.Tag, using(PerlLexer), Name.Tag)),
+            (r'(?<=^)#[^\n]*(\n|\Z)', Comment),
+            (r'(?<=^)(%)([^\n]*)(\n|\Z)',
+             bygroups(Name.Tag, using(PerlLexer), Other)),
+            (r"""(?sx)
+                 (.+?)               # anything, followed by:
+                 (?:
+                  (?<=\n)(?=[%#]) |  # an eval or comment line
+                  (?=</?[%&]) |      # a substitution or block or
+                                     # call start or end
+                                     # - don't consume
+                  (\\\n) |           # an escaped newline
+                  \Z                 # end of string
+                 )""", bygroups(using(HtmlLexer), Operator)),
+        ]
+    }
+
+    def analyse_text(text):
+        result = 0.0
+        if re.search(r'</%(class|doc|init)%>', text) is not None:
+            result = 1.0
+        elif re.search(r'<&.+&>', text, re.DOTALL) is not None:
+            result = 0.11
+        return result
+
+
+class MakoLexer(RegexLexer):
+    """
+    Generic `mako templates`_ lexer. Code that isn't Mako
+    markup is yielded as `Token.Other`.
+
+    .. versionadded:: 0.7
+
+    .. _mako templates: http://www.makotemplates.org/
+    """
+
+    name = 'Mako'
+    aliases = ['mako']
+    filenames = ['*.mao']
+    mimetypes = ['application/x-mako']
+
+    tokens = {
+        'root': [
+            (r'(\s*)(%)(\s*end(?:\w+))(\n|\Z)',
+             bygroups(Text, Comment.Preproc, Keyword, Other)),
+            (r'(\s*)(%)([^\n]*)(\n|\Z)',
+             bygroups(Text, Comment.Preproc, using(PythonLexer), Other)),
+            (r'(\s*)(##[^\n]*)(\n|\Z)',
+             bygroups(Text, Comment.Preproc, Other)),
+            (r'(?s)<%doc>.*?</%doc>', Comment.Preproc),
+            (r'(<%)([\w.:]+)',
+             bygroups(Comment.Preproc, Name.Builtin), 'tag'),
+            (r'(</%)([\w.:]+)(>)',
+             bygroups(Comment.Preproc, Name.Builtin, Comment.Preproc)),
+            (r'<%(?=([\w.:]+))', Comment.Preproc, 'ondeftags'),
+            (r'(<%(?:!?))(.*?)(%>)(?s)',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'(\$\{)(.*?)(\})',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'''(?sx)
+                (.+?)                # anything, followed by:
+                (?:
+                 (?<=\n)(?=%|\#\#) | # an eval or comment line
+                 (?=\#\*) |          # multiline comment
+                 (?=</?%) |          # a python block
+                                     # call start or end
+                 (?=\$\{) |          # a substitution
+                 (?<=\n)(?=\s*%) |
+                                     # - don't consume
+                 (\\\n) |            # an escaped newline
+                 \Z                  # end of string
+                )
+            ''', bygroups(Other, Operator)),
+            (r'\s+', Text),
+        ],
+        'ondeftags': [
+            (r'<%', Comment.Preproc),
+            (r'(?<=<%)(include|inherit|namespace|page)', Name.Builtin),
+            include('tag'),
+        ],
+        'tag': [
+            (r'((?:\w+)\s*=)(\s*)(".*?")',
+             bygroups(Name.Attribute, Text, String)),
+            (r'/?\s*>', Comment.Preproc, '#pop'),
+            (r'\s+', Text),
+        ],
+        'attr': [
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+
+class MakoHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'HTML+Mako'
+    aliases = ['html+mako']
+    mimetypes = ['text/html+mako']
+
+    def __init__(self, **options):
+        super(MakoHtmlLexer, self).__init__(HtmlLexer, MakoLexer,
+                                            **options)
+
+
+class MakoXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `XmlLexer`.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'XML+Mako'
+    aliases = ['xml+mako']
+    mimetypes = ['application/xml+mako']
+
+    def __init__(self, **options):
+        super(MakoXmlLexer, self).__init__(XmlLexer, MakoLexer,
+                                           **options)
+
+
+class MakoJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `JavascriptLexer`.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'JavaScript+Mako'
+    aliases = ['js+mako', 'javascript+mako']
+    mimetypes = ['application/x-javascript+mako',
+                 'text/x-javascript+mako',
+                 'text/javascript+mako']
+
+    def __init__(self, **options):
+        super(MakoJavascriptLexer, self).__init__(JavascriptLexer,
+                                                  MakoLexer, **options)
+
+
+class MakoCssLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `CssLexer`.
+
+    .. versionadded:: 0.7
+    """
+
+    name = 'CSS+Mako'
+    aliases = ['css+mako']
+    mimetypes = ['text/css+mako']
+
+    def __init__(self, **options):
+        super(MakoCssLexer, self).__init__(CssLexer, MakoLexer,
+                                           **options)
+
+
+# Genshi and Cheetah lexers courtesy of Matt Good.
+
+class CheetahPythonLexer(Lexer):
+    """
+    Lexer for handling Cheetah's special $ tokens in Python syntax.
+    """
+
+    def get_tokens_unprocessed(self, text):
+        pylexer = PythonLexer(**self.options)
+        for pos, type_, value in pylexer.get_tokens_unprocessed(text):
+            if type_ == Token.Error and value == '$':
+                type_ = Comment.Preproc
+            yield pos, type_, value
+
+
+class CheetahLexer(RegexLexer):
+    """
+    Generic `cheetah templates`_ lexer. Code that isn't Cheetah
+    markup is yielded as `Token.Other`.  This also works for
+    `spitfire templates`_ which use the same syntax.
+
+    .. _cheetah templates: http://www.cheetahtemplate.org/
+    .. _spitfire templates: http://code.google.com/p/spitfire/
+    """
+
+    name = 'Cheetah'
+    aliases = ['cheetah', 'spitfire']
+    filenames = ['*.tmpl', '*.spt']
+    mimetypes = ['application/x-cheetah', 'application/x-spitfire']
+
+    tokens = {
+        'root': [
+            (r'(##[^\n]*)$',
+             (bygroups(Comment))),
+            (r'#[*](.|\n)*?[*]#', Comment),
+            (r'#end[^#\n]*(?:#|$)', Comment.Preproc),
+            (r'#slurp$', Comment.Preproc),
+            (r'(#[a-zA-Z]+)([^#\n]*)(#|$)',
+             (bygroups(Comment.Preproc, using(CheetahPythonLexer),
+                       Comment.Preproc))),
+            # TODO support other Python syntax like $foo['bar']
+            (r'(\$)([a-zA-Z_][\w.]*\w)',
+             bygroups(Comment.Preproc, using(CheetahPythonLexer))),
+            (r'(\$\{!?)(.*?)(\})(?s)',
+             bygroups(Comment.Preproc, using(CheetahPythonLexer),
+                      Comment.Preproc)),
+            (r'''(?sx)
+                (.+?)               # anything, followed by:
+                (?:
+                 (?=\#[#a-zA-Z]*) | # an eval comment
+                 (?=\$[a-zA-Z_{]) | # a substitution
+                 \Z                 # end of string
+                )
+            ''', Other),
+            (r'\s+', Text),
+        ],
+    }
+
+
+class CheetahHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `CheetahLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+    """
+
+    name = 'HTML+Cheetah'
+    aliases = ['html+cheetah', 'html+spitfire', 'htmlcheetah']
+    mimetypes = ['text/html+cheetah', 'text/html+spitfire']
+
+    def __init__(self, **options):
+        super(CheetahHtmlLexer, self).__init__(HtmlLexer, CheetahLexer,
+                                               **options)
+
+
+class CheetahXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `CheetahLexer` that highlights unlexed data
+    with the `XmlLexer`.
+    """
+
+    name = 'XML+Cheetah'
+    aliases = ['xml+cheetah', 'xml+spitfire']
+    mimetypes = ['application/xml+cheetah', 'application/xml+spitfire']
+
+    def __init__(self, **options):
+        super(CheetahXmlLexer, self).__init__(XmlLexer, CheetahLexer,
+                                              **options)
+
+
+class CheetahJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `CheetahLexer` that highlights unlexed data
+    with the `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Cheetah'
+    aliases = ['js+cheetah', 'javascript+cheetah',
+               'js+spitfire', 'javascript+spitfire']
+    mimetypes = ['application/x-javascript+cheetah',
+                 'text/x-javascript+cheetah',
+                 'text/javascript+cheetah',
+                 'application/x-javascript+spitfire',
+                 'text/x-javascript+spitfire',
+                 'text/javascript+spitfire']
+
+    def __init__(self, **options):
+        super(CheetahJavascriptLexer, self).__init__(JavascriptLexer,
+                                                     CheetahLexer, **options)
+
+
+class GenshiTextLexer(RegexLexer):
+    """
+    A lexer that highlights `genshi <http://genshi.edgewall.org/>`_ text
+    templates.
+    """
+
+    name = 'Genshi Text'
+    aliases = ['genshitext']
+    mimetypes = ['application/x-genshi-text', 'text/x-genshi']
+
+    tokens = {
+        'root': [
+            (r'[^#$\s]+', Other),
+            (r'^(\s*)(##.*)$', bygroups(Text, Comment)),
+            (r'^(\s*)(#)', bygroups(Text, Comment.Preproc), 'directive'),
+            include('variable'),
+            (r'[#$\s]', Other),
+        ],
+        'directive': [
+            (r'\n', Text, '#pop'),
+            (r'(?:def|for|if)\s+.*', using(PythonLexer), '#pop'),
+            (r'(choose|when|with)([^\S\n]+)(.*)',
+             bygroups(Keyword, Text, using(PythonLexer)), '#pop'),
+            (r'(choose|otherwise)\b', Keyword, '#pop'),
+            (r'(end\w*)([^\S\n]*)(.*)', bygroups(Keyword, Text, Comment), '#pop'),
+        ],
+        'variable': [
+            (r'(?<!\$)(\$\{)(.+?)(\})',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'(?<!\$)(\$)([a-zA-Z_][\w.]*)',
+             Name.Variable),
+        ]
+    }
+
+
+class GenshiMarkupLexer(RegexLexer):
+    """
+    Base lexer for Genshi markup, used by `HtmlGenshiLexer` and
+    `GenshiLexer`.
+    """
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'[^<$]+', Other),
+            (r'(<\?python)(.*?)(\?>)',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            # yield style and script blocks as Other
+            (r'<\s*(script|style)\s*.*?>.*?<\s*/\1\s*>', Other),
+            (r'<\s*py:[a-zA-Z0-9]+', Name.Tag, 'pytag'),
+            (r'<\s*[a-zA-Z0-9:.]+', Name.Tag, 'tag'),
+            include('variable'),
+            (r'[<$]', Other),
+        ],
+        'pytag': [
+            (r'\s+', Text),
+            (r'[\w:-]+\s*=', Name.Attribute, 'pyattr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'pyattr': [
+            ('(")(.*?)(")', bygroups(String, using(PythonLexer), String), '#pop'),
+            ("(')(.*?)(')", bygroups(String, using(PythonLexer), String), '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'py:[\w-]+\s*=', Name.Attribute, 'pyattr'),
+            (r'[\w:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'attr': [
+            ('"', String, 'attr-dstring'),
+            ("'", String, 'attr-sstring'),
+            (r'[^\s>]*', String, '#pop')
+        ],
+        'attr-dstring': [
+            ('"', String, '#pop'),
+            include('strings'),
+            ("'", String)
+        ],
+        'attr-sstring': [
+            ("'", String, '#pop'),
+            include('strings'),
+            ("'", String)
+        ],
+        'strings': [
+            ('[^"\'$]+', String),
+            include('variable')
+        ],
+        'variable': [
+            (r'(?<!\$)(\$\{)(.+?)(\})',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'(?<!\$)(\$)([a-zA-Z_][\w\.]*)',
+             Name.Variable),
+        ]
+    }
+
+
+class HtmlGenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights `genshi <http://genshi.edgewall.org/>`_ and
+    `kid <http://kid-templating.org/>`_ kid HTML templates.
+    """
+
+    name = 'HTML+Genshi'
+    aliases = ['html+genshi', 'html+kid']
+    alias_filenames = ['*.html', '*.htm', '*.xhtml']
+    mimetypes = ['text/html+genshi']
+
+    def __init__(self, **options):
+        super(HtmlGenshiLexer, self).__init__(HtmlLexer, GenshiMarkupLexer,
+                                              **options)
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search('\$\{.*?\}', text) is not None:
+            rv += 0.2
+        if re.search('py:(.*?)=["\']', text) is not None:
+            rv += 0.2
+        return rv + HtmlLexer.analyse_text(text) - 0.01
+
+
+class GenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights `genshi <http://genshi.edgewall.org/>`_ and
+    `kid <http://kid-templating.org/>`_ kid XML templates.
+    """
+
+    name = 'Genshi'
+    aliases = ['genshi', 'kid', 'xml+genshi', 'xml+kid']
+    filenames = ['*.kid']
+    alias_filenames = ['*.xml']
+    mimetypes = ['application/x-genshi', 'application/x-kid']
+
+    def __init__(self, **options):
+        super(GenshiLexer, self).__init__(XmlLexer, GenshiMarkupLexer,
+                                          **options)
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search('\$\{.*?\}', text) is not None:
+            rv += 0.2
+        if re.search('py:(.*?)=["\']', text) is not None:
+            rv += 0.2
+        return rv + XmlLexer.analyse_text(text) - 0.01
+
+
+class JavascriptGenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights javascript code in genshi text templates.
+    """
+
+    name = 'JavaScript+Genshi Text'
+    aliases = ['js+genshitext', 'js+genshi', 'javascript+genshitext',
+               'javascript+genshi']
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+genshi',
+                 'text/x-javascript+genshi',
+                 'text/javascript+genshi']
+
+    def __init__(self, **options):
+        super(JavascriptGenshiLexer, self).__init__(JavascriptLexer,
+                                                    GenshiTextLexer,
+                                                    **options)
+
+    def analyse_text(text):
+        return GenshiLexer.analyse_text(text) - 0.05
+
+
+class CssGenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights CSS definitions in genshi text templates.
+    """
+
+    name = 'CSS+Genshi Text'
+    aliases = ['css+genshitext', 'css+genshi']
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+genshi']
+
+    def __init__(self, **options):
+        super(CssGenshiLexer, self).__init__(CssLexer, GenshiTextLexer,
+                                             **options)
+
+    def analyse_text(text):
+        return GenshiLexer.analyse_text(text) - 0.05
+
+
+class RhtmlLexer(DelegatingLexer):
+    """
+    Subclass of the ERB lexer that highlights the unlexed data with the
+    html lexer.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'RHTML'
+    aliases = ['rhtml', 'html+erb', 'html+ruby']
+    filenames = ['*.rhtml']
+    alias_filenames = ['*.html', '*.htm', '*.xhtml']
+    mimetypes = ['text/html+ruby']
+
+    def __init__(self, **options):
+        super(RhtmlLexer, self).__init__(HtmlLexer, ErbLexer, **options)
+
+    def analyse_text(text):
+        rv = ErbLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            # one more than the XmlErbLexer returns
+            rv += 0.5
+        return rv
+
+
+class XmlErbLexer(DelegatingLexer):
+    """
+    Subclass of `ErbLexer` which highlights data outside preprocessor
+    directives with the `XmlLexer`.
+    """
+
+    name = 'XML+Ruby'
+    aliases = ['xml+erb', 'xml+ruby']
+    alias_filenames = ['*.xml']
+    mimetypes = ['application/xml+ruby']
+
+    def __init__(self, **options):
+        super(XmlErbLexer, self).__init__(XmlLexer, ErbLexer, **options)
+
+    def analyse_text(text):
+        rv = ErbLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssErbLexer(DelegatingLexer):
+    """
+    Subclass of `ErbLexer` which highlights unlexed data with the `CssLexer`.
+    """
+
+    name = 'CSS+Ruby'
+    aliases = ['css+erb', 'css+ruby']
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+ruby']
+
+    def __init__(self, **options):
+        super(CssErbLexer, self).__init__(CssLexer, ErbLexer, **options)
+
+    def analyse_text(text):
+        return ErbLexer.analyse_text(text) - 0.05
+
+
+class JavascriptErbLexer(DelegatingLexer):
+    """
+    Subclass of `ErbLexer` which highlights unlexed data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Ruby'
+    aliases = ['js+erb', 'javascript+erb', 'js+ruby', 'javascript+ruby']
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+ruby',
+                 'text/x-javascript+ruby',
+                 'text/javascript+ruby']
+
+    def __init__(self, **options):
+        super(JavascriptErbLexer, self).__init__(JavascriptLexer, ErbLexer,
+                                                 **options)
+
+    def analyse_text(text):
+        return ErbLexer.analyse_text(text) - 0.05
+
+
+class HtmlPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` that highlights unhandled data with the `HtmlLexer`.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'HTML+PHP'
+    aliases = ['html+php']
+    filenames = ['*.phtml']
+    alias_filenames = ['*.php', '*.html', '*.htm', '*.xhtml',
+                       '*.php[345]']
+    mimetypes = ['application/x-php',
+                 'application/x-httpd-php', 'application/x-httpd-php3',
+                 'application/x-httpd-php4', 'application/x-httpd-php5']
+
+    def __init__(self, **options):
+        super(HtmlPhpLexer, self).__init__(HtmlLexer, PhpLexer, **options)
+
+    def analyse_text(text):
+        rv = PhpLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            rv += 0.5
+        return rv
+
+
+class XmlPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` that highlights unhandled data with the `XmlLexer`.
+    """
+
+    name = 'XML+PHP'
+    aliases = ['xml+php']
+    alias_filenames = ['*.xml', '*.php', '*.php[345]']
+    mimetypes = ['application/xml+php']
+
+    def __init__(self, **options):
+        super(XmlPhpLexer, self).__init__(XmlLexer, PhpLexer, **options)
+
+    def analyse_text(text):
+        rv = PhpLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` which highlights unmatched data with the `CssLexer`.
+    """
+
+    name = 'CSS+PHP'
+    aliases = ['css+php']
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+php']
+
+    def __init__(self, **options):
+        super(CssPhpLexer, self).__init__(CssLexer, PhpLexer, **options)
+
+    def analyse_text(text):
+        return PhpLexer.analyse_text(text) - 0.05
+
+
+class JavascriptPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` which highlights unmatched data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+PHP'
+    aliases = ['js+php', 'javascript+php']
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+php',
+                 'text/x-javascript+php',
+                 'text/javascript+php']
+
+    def __init__(self, **options):
+        super(JavascriptPhpLexer, self).__init__(JavascriptLexer, PhpLexer,
+                                                 **options)
+
+    def analyse_text(text):
+        return PhpLexer.analyse_text(text)
+
+
+class HtmlSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'HTML+Smarty'
+    aliases = ['html+smarty']
+    alias_filenames = ['*.html', '*.htm', '*.xhtml', '*.tpl']
+    mimetypes = ['text/html+smarty']
+
+    def __init__(self, **options):
+        super(HtmlSmartyLexer, self).__init__(HtmlLexer, SmartyLexer, **options)
+
+    def analyse_text(text):
+        rv = SmartyLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            rv += 0.5
+        return rv
+
+
+class XmlSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `XmlLexer`.
+    """
+
+    name = 'XML+Smarty'
+    aliases = ['xml+smarty']
+    alias_filenames = ['*.xml', '*.tpl']
+    mimetypes = ['application/xml+smarty']
+
+    def __init__(self, **options):
+        super(XmlSmartyLexer, self).__init__(XmlLexer, SmartyLexer, **options)
+
+    def analyse_text(text):
+        rv = SmartyLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `CssLexer`.
+    """
+
+    name = 'CSS+Smarty'
+    aliases = ['css+smarty']
+    alias_filenames = ['*.css', '*.tpl']
+    mimetypes = ['text/css+smarty']
+
+    def __init__(self, **options):
+        super(CssSmartyLexer, self).__init__(CssLexer, SmartyLexer, **options)
+
+    def analyse_text(text):
+        return SmartyLexer.analyse_text(text) - 0.05
+
+
+class JavascriptSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Smarty'
+    aliases = ['js+smarty', 'javascript+smarty']
+    alias_filenames = ['*.js', '*.tpl']
+    mimetypes = ['application/x-javascript+smarty',
+                 'text/x-javascript+smarty',
+                 'text/javascript+smarty']
+
+    def __init__(self, **options):
+        super(JavascriptSmartyLexer, self).__init__(JavascriptLexer, SmartyLexer,
+                                                    **options)
+
+    def analyse_text(text):
+        return SmartyLexer.analyse_text(text) - 0.05
+
+
+class HtmlDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'HTML+Django/Jinja'
+    aliases = ['html+django', 'html+jinja', 'htmldjango']
+    alias_filenames = ['*.html', '*.htm', '*.xhtml']
+    mimetypes = ['text/html+django', 'text/html+jinja']
+
+    def __init__(self, **options):
+        super(HtmlDjangoLexer, self).__init__(HtmlLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        rv = DjangoLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            rv += 0.5
+        return rv
+
+
+class XmlDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `XmlLexer`.
+    """
+
+    name = 'XML+Django/Jinja'
+    aliases = ['xml+django', 'xml+jinja']
+    alias_filenames = ['*.xml']
+    mimetypes = ['application/xml+django', 'application/xml+jinja']
+
+    def __init__(self, **options):
+        super(XmlDjangoLexer, self).__init__(XmlLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        rv = DjangoLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `CssLexer`.
+    """
+
+    name = 'CSS+Django/Jinja'
+    aliases = ['css+django', 'css+jinja']
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+django', 'text/css+jinja']
+
+    def __init__(self, **options):
+        super(CssDjangoLexer, self).__init__(CssLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        return DjangoLexer.analyse_text(text) - 0.05
+
+
+class JavascriptDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Django/Jinja'
+    aliases = ['js+django', 'javascript+django',
+               'js+jinja', 'javascript+jinja']
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+django',
+                 'application/x-javascript+jinja',
+                 'text/x-javascript+django',
+                 'text/x-javascript+jinja',
+                 'text/javascript+django',
+                 'text/javascript+jinja']
+
+    def __init__(self, **options):
+        super(JavascriptDjangoLexer, self).__init__(JavascriptLexer, DjangoLexer,
+                                                    **options)
+
+    def analyse_text(text):
+        return DjangoLexer.analyse_text(text) - 0.05
+
+
+class JspRootLexer(RegexLexer):
+    """
+    Base for the `JspLexer`. Yields `Token.Other` for area outside of
+    JSP tags.
+
+    .. versionadded:: 0.7
+    """
+
+    tokens = {
+        'root': [
+            (r'<%\S?', Keyword, 'sec'),
+            # FIXME: I want to make these keywords but still parse attributes.
+            (r'</?jsp:(forward|getProperty|include|plugin|setProperty|useBean).*?>',
+             Keyword),
+            (r'[^<]+', Other),
+            (r'<', Other),
+        ],
+        'sec': [
+            (r'%>', Keyword, '#pop'),
+            # note: '\w\W' != '.' without DOTALL.
+            (r'[\w\W]+?(?=%>|\Z)', using(JavaLexer)),
+        ],
+    }
+
+
+class JspLexer(DelegatingLexer):
+    """
+    Lexer for Java Server Pages.
+
+    .. versionadded:: 0.7
+    """
+    name = 'Java Server Page'
+    aliases = ['jsp']
+    filenames = ['*.jsp']
+    mimetypes = ['application/x-jsp']
+
+    def __init__(self, **options):
+        super(JspLexer, self).__init__(XmlLexer, JspRootLexer, **options)
+
+    def analyse_text(text):
+        rv = JavaLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        if '<%' in text and '%>' in text:
+            rv += 0.1
+        return rv
+
+
+class EvoqueLexer(RegexLexer):
+    """
+    For files using the Evoque templating system.
+
+    .. versionadded:: 1.1
+    """
+    name = 'Evoque'
+    aliases = ['evoque']
+    filenames = ['*.evoque']
+    mimetypes = ['application/x-evoque']
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'[^#$]+', Other),
+            (r'#\[', Comment.Multiline, 'comment'),
+            (r'\$\$', Other),
+            # svn keywords
+            (r'\$\w+:[^$\n]*\$', Comment.Multiline),
+            # directives: begin, end
+            (r'(\$)(begin|end)(\{(%)?)(.*?)((?(4)%)\})',
+             bygroups(Punctuation, Name.Builtin, Punctuation, None,
+                      String, Punctuation)),
+            # directives: evoque, overlay
+            # see doc for handling first name arg: /directives/evoque/
+            # + minor inconsistency: the "name" in e.g. $overlay{name=site_base}
+            # should be using(PythonLexer), not passed out as String
+            (r'(\$)(evoque|overlay)(\{(%)?)(\s*[#\w\-"\'.]+[^=,%}]+?)?'
+             r'(.*?)((?(4)%)\})',
+             bygroups(Punctuation, Name.Builtin, Punctuation, None,
+                      String, using(PythonLexer), Punctuation)),
+            # directives: if, for, prefer, test
+            (r'(\$)(\w+)(\{(%)?)(.*?)((?(4)%)\})',
+             bygroups(Punctuation, Name.Builtin, Punctuation, None,
+                      using(PythonLexer), Punctuation)),
+            # directive clauses (no {} expression)
+            (r'(\$)(else|rof|fi)', bygroups(Punctuation, Name.Builtin)),
+            # expressions
+            (r'(\$\{(%)?)(.*?)((!)(.*?))?((?(2)%)\})',
+             bygroups(Punctuation, None, using(PythonLexer),
+                      Name.Builtin, None, None, Punctuation)),
+            (r'#', Other),
+        ],
+        'comment': [
+            (r'[^\]#]', Comment.Multiline),
+            (r'#\[', Comment.Multiline, '#push'),
+            (r'\]#', Comment.Multiline, '#pop'),
+            (r'[\]#]', Comment.Multiline)
+        ],
+    }
+
+
+class EvoqueHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `EvoqueLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    .. versionadded:: 1.1
+    """
+    name = 'HTML+Evoque'
+    aliases = ['html+evoque']
+    filenames = ['*.html']
+    mimetypes = ['text/html+evoque']
+
+    def __init__(self, **options):
+        super(EvoqueHtmlLexer, self).__init__(HtmlLexer, EvoqueLexer,
+                                              **options)
+
+
+class EvoqueXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `EvoqueLexer` that highlights unlexed data with the
+    `XmlLexer`.
+
+    .. versionadded:: 1.1
+    """
+    name = 'XML+Evoque'
+    aliases = ['xml+evoque']
+    filenames = ['*.xml']
+    mimetypes = ['application/xml+evoque']
+
+    def __init__(self, **options):
+        super(EvoqueXmlLexer, self).__init__(XmlLexer, EvoqueLexer,
+                                             **options)
+
+
+class ColdfusionLexer(RegexLexer):
+    """
+    Coldfusion statements
+    """
+    name = 'cfstatement'
+    aliases = ['cfs']
+    filenames = []
+    mimetypes = []
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'//.*?\n', Comment.Single),
+            (r'/\*(?:.|\n)*?\*/', Comment.Multiline),
+            (r'\+\+|--', Operator),
+            (r'[-+*/^&=!]', Operator),
+            (r'<=|>=|<|>|==', Operator),
+            (r'mod\b', Operator),
+            (r'(eq|lt|gt|lte|gte|not|is|and|or)\b', Operator),
+            (r'\|\||&&', Operator),
+            (r'\?', Operator),
+            (r'"', String.Double, 'string'),
+            # There is a special rule for allowing html in single quoted
+            # strings, evidently.
+            (r"'.*?'", String.Single),
+            (r'\d+', Number),
+            (r'(if|else|len|var|xml|default|break|switch|component|property|function|do|'
+             r'try|catch|in|continue|for|return|while|required|any|array|binary|boolean|'
+             r'component|date|guid|numeric|query|string|struct|uuid|case)\b', Keyword),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(application|session|client|cookie|super|this|variables|arguments)\b',
+             Name.Constant),
+            (r'([a-z_$][\w.]*)(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[a-z_$][\w.]*', Name.Variable),
+            (r'[()\[\]{};:,.\\]', Punctuation),
+            (r'\s+', Text),
+        ],
+        'string': [
+            (r'""', String.Double),
+            (r'#.+?#', String.Interp),
+            (r'[^"#]+', String.Double),
+            (r'#', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+    }
+
+
+class ColdfusionMarkupLexer(RegexLexer):
+    """
+    Coldfusion markup only
+    """
+    name = 'Coldfusion'
+    aliases = ['cf']
+    filenames = []
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            (r'[^<]+', Other),
+            include('tags'),
+            (r'<[^<>]*', Other),
+        ],
+        'tags': [
+            (r'<!---', Comment.Multiline, 'cfcomment'),
+            (r'(?s)<!--.*?-->', Comment),
+            (r'<cfoutput.*?>', Name.Builtin, 'cfoutput'),
+            (r'(?s)(<cfscript.*?>)(.+?)(</cfscript.*?>)',
+             bygroups(Name.Builtin, using(ColdfusionLexer), Name.Builtin)),
+            # negative lookbehind is for strings with embedded >
+            (r'(?s)(</?cf(?:component|include|if|else|elseif|loop|return|'
+             r'dbinfo|dump|abort|location|invoke|throw|file|savecontent|'
+             r'mailpart|mail|header|content|zip|image|lock|argument|try|'
+             r'catch|break|directory|http|set|function|param)\b)(.*?)((?<!\\)>)',
+             bygroups(Name.Builtin, using(ColdfusionLexer), Name.Builtin)),
+        ],
+        'cfoutput': [
+            (r'[^#<]+', Other),
+            (r'(#)(.*?)(#)', bygroups(Punctuation, using(ColdfusionLexer),
+                                      Punctuation)),
+            # (r'<cfoutput.*?>', Name.Builtin, '#push'),
+            (r'</cfoutput.*?>', Name.Builtin, '#pop'),
+            include('tags'),
+            (r'(?s)<[^<>]*', Other),
+            (r'#', Other),
+        ],
+        'cfcomment': [
+            (r'<!---', Comment.Multiline, '#push'),
+            (r'--->', Comment.Multiline, '#pop'),
+            (r'([^<-]|<(?!!---)|-(?!-->))+', Comment.Multiline),
+        ],
+    }
+
+
+class ColdfusionHtmlLexer(DelegatingLexer):
+    """
+    Coldfusion markup in html
+    """
+    name = 'Coldfusion HTML'
+    aliases = ['cfm']
+    filenames = ['*.cfm', '*.cfml']
+    mimetypes = ['application/x-coldfusion']
+
+    def __init__(self, **options):
+        super(ColdfusionHtmlLexer, self).__init__(HtmlLexer, ColdfusionMarkupLexer,
+                                                  **options)
+
+
+class ColdfusionCFCLexer(DelegatingLexer):
+    """
+    Coldfusion markup/script components
+
+    .. versionadded:: 2.0
+    """
+    name = 'Coldfusion CFC'
+    aliases = ['cfc']
+    filenames = ['*.cfc']
+    mimetypes = []
+
+    def __init__(self, **options):
+        super(ColdfusionCFCLexer, self).__init__(ColdfusionHtmlLexer, ColdfusionLexer,
+                                                 **options)
+
+
+class SspLexer(DelegatingLexer):
+    """
+    Lexer for Scalate Server Pages.
+
+    .. versionadded:: 1.4
+    """
+    name = 'Scalate Server Page'
+    aliases = ['ssp']
+    filenames = ['*.ssp']
+    mimetypes = ['application/x-ssp']
+
+    def __init__(self, **options):
+        super(SspLexer, self).__init__(XmlLexer, JspRootLexer, **options)
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search('val \w+\s*:', text):
+            rv += 0.6
+        if looks_like_xml(text):
+            rv += 0.2
+        if '<%' in text and '%>' in text:
+            rv += 0.1
+        return rv
+
+
+class TeaTemplateRootLexer(RegexLexer):
+    """
+    Base for the `TeaTemplateLexer`. Yields `Token.Other` for area outside of
+    code blocks.
+
+    .. versionadded:: 1.5
+    """
+
+    tokens = {
+        'root': [
+            (r'<%\S?', Keyword, 'sec'),
+            (r'[^<]+', Other),
+            (r'<', Other),
+        ],
+        'sec': [
+            (r'%>', Keyword, '#pop'),
+            # note: '\w\W' != '.' without DOTALL.
+            (r'[\w\W]+?(?=%>|\Z)', using(TeaLangLexer)),
+        ],
+    }
+
+
+class TeaTemplateLexer(DelegatingLexer):
+    """
+    Lexer for `Tea Templates <http://teatrove.org/>`_.
+
+    .. versionadded:: 1.5
+    """
+    name = 'Tea'
+    aliases = ['tea']
+    filenames = ['*.tea']
+    mimetypes = ['text/x-tea']
+
+    def __init__(self, **options):
+        super(TeaTemplateLexer, self).__init__(XmlLexer,
+                                               TeaTemplateRootLexer, **options)
+
+    def analyse_text(text):
+        rv = TeaLangLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        if '<%' in text and '%>' in text:
+            rv += 0.1
+        return rv
+
+
+class LassoHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `HtmlLexer`.
+
+    Nested JavaScript and CSS is also highlighted.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'HTML+Lasso'
+    aliases = ['html+lasso']
+    alias_filenames = ['*.html', '*.htm', '*.xhtml', '*.lasso', '*.lasso[89]',
+                       '*.incl', '*.inc', '*.las']
+    mimetypes = ['text/html+lasso',
+                 'application/x-httpd-lasso',
+                 'application/x-httpd-lasso[89]']
+
+    def __init__(self, **options):
+        super(LassoHtmlLexer, self).__init__(HtmlLexer, LassoLexer, **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):  # same as HTML lexer
+            rv += 0.5
+        return rv
+
+
+class LassoXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `XmlLexer`.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'XML+Lasso'
+    aliases = ['xml+lasso']
+    alias_filenames = ['*.xml', '*.lasso', '*.lasso[89]',
+                       '*.incl', '*.inc', '*.las']
+    mimetypes = ['application/xml+lasso']
+
+    def __init__(self, **options):
+        super(LassoXmlLexer, self).__init__(XmlLexer, LassoLexer, **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class LassoCssLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `CssLexer`.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'CSS+Lasso'
+    aliases = ['css+lasso']
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+lasso']
+
+    def __init__(self, **options):
+        options['requiredelimiters'] = True
+        super(LassoCssLexer, self).__init__(CssLexer, LassoLexer, **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.05
+        if re.search(r'\w+:.+?;', text):
+            rv += 0.1
+        if 'padding:' in text:
+            rv += 0.1
+        return rv
+
+
+class LassoJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `JavascriptLexer`.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'JavaScript+Lasso'
+    aliases = ['js+lasso', 'javascript+lasso']
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+lasso',
+                 'text/x-javascript+lasso',
+                 'text/javascript+lasso']
+
+    def __init__(self, **options):
+        options['requiredelimiters'] = True
+        super(LassoJavascriptLexer, self).__init__(JavascriptLexer, LassoLexer,
+                                                   **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.05
+        return rv
+
+
+class HandlebarsLexer(RegexLexer):
+    """
+    Generic `handlebars <http://handlebarsjs.com/>` template lexer.
+
+    Highlights only the Handlebars template tags (stuff between `{{` and `}}`).
+    Everything else is left for a delegating lexer.
+
+    .. versionadded:: 2.0
+    """
+
+    name = "Handlebars"
+    aliases = ['handlebars']
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+
+            (r'\{\{!.*\}\}', Comment),
+
+            (r'(\{\{\{)(\s*)', bygroups(Comment.Special, Text), 'tag'),
+            (r'(\{\{)(\s*)', bygroups(Comment.Preproc, Text), 'tag'),
+        ],
+
+        'tag': [
+            (r'\s+', Text),
+            (r'\}\}\}', Comment.Special, '#pop'),
+            (r'\}\}', Comment.Preproc, '#pop'),
+
+            # Handlebars
+            (r'([#/]*)(each|if|unless|else|with|log|in(line)?)', bygroups(Keyword,
+             Keyword)),
+            (r'#\*inline', Keyword),
+
+            # General {{#block}}
+            (r'([#/])([\w-]+)', bygroups(Name.Function, Name.Function)),
+
+            # {{opt=something}}
+            (r'([\w-]+)(=)', bygroups(Name.Attribute, Operator)),
+
+            # Partials {{> ...}}
+            (r'(>)(\s*)(@partial-block)', bygroups(Keyword, Text, Keyword)),
+            (r'(#?>)(\s*)([\w-]+)', bygroups(Keyword, Text, Name.Variable)),
+            (r'(>)(\s*)(\()', bygroups(Keyword, Text, Punctuation),
+             'dynamic-partial'),
+
+            include('generic'),
+        ],
+        'dynamic-partial': [
+            (r'\s+', Text),
+            (r'\)', Punctuation, '#pop'),
+
+            (r'(lookup)(\s+)(\.|this)(\s+)', bygroups(Keyword, Text,
+                                                      Name.Variable, Text)),
+            (r'(lookup)(\s+)(\S+)', bygroups(Keyword, Text,
+                                             using(this, state='variable'))),
+            (r'[\w-]+', Name.Function),
+
+            include('generic'),
+        ],
+        'variable': [
+            (r'[a-zA-Z][\w-]*', Name.Variable),
+            (r'\.[\w-]+', Name.Variable),
+            (r'(this\/|\.\/|(\.\.\/)+)[\w-]+', Name.Variable),
+        ],
+        'generic': [
+            include('variable'),
+
+            # borrowed from DjangoLexer
+            (r':?"(\\\\|\\"|[^"])*"', String.Double),
+            (r":?'(\\\\|\\'|[^'])*'", String.Single),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+        ]
+    }
+
+
+class HandlebarsHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `HandlebarsLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    .. versionadded:: 2.0
+    """
+
+    name = "HTML+Handlebars"
+    aliases = ["html+handlebars"]
+    filenames = ['*.handlebars', '*.hbs']
+    mimetypes = ['text/html+handlebars', 'text/x-handlebars-template']
+
+    def __init__(self, **options):
+        super(HandlebarsHtmlLexer, self).__init__(HtmlLexer, HandlebarsLexer, **options)
+
+
+class YamlJinjaLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `YamlLexer`.
+
+    Commonly used in Saltstack salt states.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'YAML+Jinja'
+    aliases = ['yaml+jinja', 'salt', 'sls']
+    filenames = ['*.sls']
+    mimetypes = ['text/x-yaml+jinja', 'text/x-sls']
+
+    def __init__(self, **options):
+        super(YamlJinjaLexer, self).__init__(YamlLexer, DjangoLexer, **options)
+
+
+class LiquidLexer(RegexLexer):
+    """
+    Lexer for `Liquid templates
+    <http://www.rubydoc.info/github/Shopify/liquid>`_.
+
+    .. versionadded:: 2.0
+    """
+    name = 'liquid'
+    aliases = ['liquid']
+    filenames = ['*.liquid']
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Text),
+            # tags and block tags
+            (r'(\{%)(\s*)', bygroups(Punctuation, Whitespace), 'tag-or-block'),
+            # output tags
+            (r'(\{\{)(\s*)([^\s}]+)',
+             bygroups(Punctuation, Whitespace, using(this, state = 'generic')),
+             'output'),
+            (r'\{', Text)
+        ],
+
+        'tag-or-block': [
+            # builtin logic blocks
+            (r'(if|unless|elsif|case)(?=\s+)', Keyword.Reserved, 'condition'),
+            (r'(when)(\s+)', bygroups(Keyword.Reserved, Whitespace),
+             combined('end-of-block', 'whitespace', 'generic')),
+            (r'(else)(\s*)(%\})',
+             bygroups(Keyword.Reserved, Whitespace, Punctuation), '#pop'),
+
+            # other builtin blocks
+            (r'(capture)(\s+)([^\s%]+)(\s*)(%\})',
+             bygroups(Name.Tag, Whitespace, using(this, state = 'variable'),
+                      Whitespace, Punctuation), '#pop'),
+            (r'(comment)(\s*)(%\})',
+             bygroups(Name.Tag, Whitespace, Punctuation), 'comment'),
+            (r'(raw)(\s*)(%\})',
+             bygroups(Name.Tag, Whitespace, Punctuation), 'raw'),
+
+            # end of block
+            (r'(end(case|unless|if))(\s*)(%\})',
+             bygroups(Keyword.Reserved, None, Whitespace, Punctuation), '#pop'),
+            (r'(end([^\s%]+))(\s*)(%\})',
+             bygroups(Name.Tag, None, Whitespace, Punctuation), '#pop'),
+
+            # builtin tags (assign and include are handled together with usual tags)
+            (r'(cycle)(\s+)(?:([^\s:]*)(:))?(\s*)',
+             bygroups(Name.Tag, Whitespace,
+                      using(this, state='generic'), Punctuation, Whitespace),
+             'variable-tag-markup'),
+
+            # other tags or blocks
+            (r'([^\s%]+)(\s*)', bygroups(Name.Tag, Whitespace), 'tag-markup')
+        ],
+
+        'output': [
+            include('whitespace'),
+            ('\}\}', Punctuation, '#pop'),  # end of output
+
+            (r'\|', Punctuation, 'filters')
+        ],
+
+        'filters': [
+            include('whitespace'),
+            (r'\}\}', Punctuation, ('#pop', '#pop')),  # end of filters and output
+
+            (r'([^\s|:]+)(:?)(\s*)',
+             bygroups(Name.Function, Punctuation, Whitespace), 'filter-markup')
+        ],
+
+        'filter-markup': [
+            (r'\|', Punctuation, '#pop'),
+            include('end-of-tag'),
+            include('default-param-markup')
+        ],
+
+        'condition': [
+            include('end-of-block'),
+            include('whitespace'),
+
+            (r'([^\s=!><]+)(\s*)([=!><]=?)(\s*)(\S+)(\s*)(%\})',
+             bygroups(using(this, state = 'generic'), Whitespace, Operator,
+                      Whitespace, using(this, state = 'generic'), Whitespace,
+                      Punctuation)),
+            (r'\b!', Operator),
+            (r'\bnot\b', Operator.Word),
+            (r'([\w.\'"]+)(\s+)(contains)(\s+)([\w.\'"]+)',
+             bygroups(using(this, state = 'generic'), Whitespace, Operator.Word,
+                      Whitespace, using(this, state = 'generic'))),
+
+            include('generic'),
+            include('whitespace')
+        ],
+
+        'generic-value': [
+            include('generic'),
+            include('end-at-whitespace')
+        ],
+
+        'operator': [
+            (r'(\s*)((=|!|>|<)=?)(\s*)',
+             bygroups(Whitespace, Operator, None, Whitespace), '#pop'),
+            (r'(\s*)(\bcontains\b)(\s*)',
+             bygroups(Whitespace, Operator.Word, Whitespace), '#pop'),
+        ],
+
+        'end-of-tag': [
+            (r'\}\}', Punctuation, '#pop')
+        ],
+
+        'end-of-block': [
+            (r'%\}', Punctuation, ('#pop', '#pop'))
+        ],
+
+        'end-at-whitespace': [
+            (r'\s+', Whitespace, '#pop')
+        ],
+
+        # states for unknown markup
+        'param-markup': [
+            include('whitespace'),
+            # params with colons or equals
+            (r'([^\s=:]+)(\s*)(=|:)',
+             bygroups(Name.Attribute, Whitespace, Operator)),
+            # explicit variables
+            (r'(\{\{)(\s*)([^\s}])(\s*)(\}\})',
+             bygroups(Punctuation, Whitespace, using(this, state = 'variable'),
+                      Whitespace, Punctuation)),
+
+            include('string'),
+            include('number'),
+            include('keyword'),
+            (r',', Punctuation)
+        ],
+
+        'default-param-markup': [
+            include('param-markup'),
+            (r'.', Text)  # fallback for switches / variables / un-quoted strings / ...
+        ],
+
+        'variable-param-markup': [
+            include('param-markup'),
+            include('variable'),
+            (r'.', Text)  # fallback
+        ],
+
+        'tag-markup': [
+            (r'%\}', Punctuation, ('#pop', '#pop')),  # end of tag
+            include('default-param-markup')
+        ],
+
+        'variable-tag-markup': [
+            (r'%\}', Punctuation, ('#pop', '#pop')),  # end of tag
+            include('variable-param-markup')
+        ],
+
+        # states for different values types
+        'keyword': [
+            (r'\b(false|true)\b', Keyword.Constant)
+        ],
+
+        'variable': [
+            (r'[a-zA-Z_]\w*', Name.Variable),
+            (r'(?<=\w)\.(?=\w)', Punctuation)
+        ],
+
+        'string': [
+            (r"'[^']*'", String.Single),
+            (r'"[^"]*"', String.Double)
+        ],
+
+        'number': [
+            (r'\d+\.\d+', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+
+        'generic': [  # decides for variable, string, keyword or number
+            include('keyword'),
+            include('string'),
+            include('number'),
+            include('variable')
+        ],
+
+        'whitespace': [
+            (r'[ \t]+', Whitespace)
+        ],
+
+        # states for builtin blocks
+        'comment': [
+            (r'(\{%)(\s*)(endcomment)(\s*)(%\})',
+             bygroups(Punctuation, Whitespace, Name.Tag, Whitespace,
+                      Punctuation), ('#pop', '#pop')),
+            (r'.', Comment)
+        ],
+
+        'raw': [
+            (r'[^{]+', Text),
+            (r'(\{%)(\s*)(endraw)(\s*)(%\})',
+             bygroups(Punctuation, Whitespace, Name.Tag, Whitespace,
+                      Punctuation), '#pop'),
+            (r'\{', Text)
+        ],
+    }
+
+
+class TwigLexer(RegexLexer):
+    """
+    `Twig <http://twig.sensiolabs.org/>`_ template lexer.
+
+    It just highlights Twig code between the preprocessor directives,
+    other data is left untouched by the lexer.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Twig'
+    aliases = ['twig']
+    mimetypes = ['application/x-twig']
+
+    flags = re.M | re.S
+
+    # Note that a backslash is included in the following two patterns
+    # PHP uses a backslash as a namespace separator
+    _ident_char = r'[\\\w-]|[^\x00-\x7f]'
+    _ident_begin = r'(?:[\\_a-z]|[^\x00-\x7f])'
+    _ident_end = r'(?:' + _ident_char + ')*'
+    _ident_inner = _ident_begin + _ident_end
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+            (r'\{\{', Comment.Preproc, 'var'),
+            # twig comments
+            (r'\{\#.*?\#\}', Comment),
+            # raw twig blocks
+            (r'(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endraw)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Other, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            (r'(\{%)(-?\s*)(verbatim)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endverbatim)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Other, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            # filter blocks
+            (r'(\{%%)(-?\s*)(filter)(\s+)(%s)' % _ident_inner,
+             bygroups(Comment.Preproc, Text, Keyword, Text, Name.Function),
+             'tag'),
+            (r'(\{%)(-?\s*)([a-zA-Z_]\w*)',
+             bygroups(Comment.Preproc, Text, Keyword), 'tag'),
+            (r'\{', Other),
+        ],
+        'varnames': [
+            (r'(\|)(\s*)(%s)' % _ident_inner,
+             bygroups(Operator, Text, Name.Function)),
+            (r'(is)(\s+)(not)?(\s*)(%s)' % _ident_inner,
+             bygroups(Keyword, Text, Keyword, Text, Name.Function)),
+            (r'(?i)(true|false|none|null)\b', Keyword.Pseudo),
+            (r'(in|not|and|b-and|or|b-or|b-xor|is'
+             r'if|elseif|else|import'
+             r'constant|defined|divisibleby|empty|even|iterable|odd|sameas'
+             r'matches|starts\s+with|ends\s+with)\b',
+             Keyword),
+            (r'(loop|block|parent)\b', Name.Builtin),
+            (_ident_inner, Name.Variable),
+            (r'\.' + _ident_inner, Name.Variable),
+            (r'\.[0-9]+', Number),
+            (r':?"(\\\\|\\"|[^"])*"', String.Double),
+            (r":?'(\\\\|\\'|[^'])*'", String.Single),
+            (r'([{}()\[\]+\-*/,:~%]|\.\.|\?|:|\*\*|\/\/|!=|[><=]=?)', Operator),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+        ],
+        'var': [
+            (r'\s+', Text),
+            (r'(-?)(\}\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames')
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'(-?)(%\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames'),
+            (r'.', Punctuation),
+        ],
+    }
+
+
+class TwigHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `TwigLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    .. versionadded:: 2.0
+    """
+
+    name = "HTML+Twig"
+    aliases = ["html+twig"]
+    filenames = ['*.twig']
+    mimetypes = ['text/html+twig']
+
+    def __init__(self, **options):
+        super(TwigHtmlLexer, self).__init__(HtmlLexer, TwigLexer, **options)
+
+
+class Angular2Lexer(RegexLexer):
+    """
+    Generic
+    `angular2 <http://victorsavkin.com/post/119943127151/angular-2-template-syntax>`_
+    template lexer.
+
+    Highlights only the Angular template tags (stuff between `{{` and `}}` and
+    special attributes: '(event)=', '[property]=', '[(twoWayBinding)]=').
+    Everything else is left for a delegating lexer.
+
+    .. versionadded:: 2.1
+    """
+
+    name = "Angular2"
+    aliases = ['ng2']
+
+    tokens = {
+        'root': [
+            (r'[^{([*#]+', Other),
+
+            # {{meal.name}}
+            (r'(\{\{)(\s*)', bygroups(Comment.Preproc, Text), 'ngExpression'),
+
+            # (click)="deleteOrder()"; [value]="test"; [(twoWayTest)]="foo.bar"
+            (r'([([]+)([\w:.-]+)([\])]+)(\s*)(=)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Punctuation, Text, Operator, Text),
+             'attr'),
+            (r'([([]+)([\w:.-]+)([\])]+)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Punctuation, Text)),
+
+            # *ngIf="..."; #f="ngForm"
+            (r'([*#])([\w:.-]+)(\s*)(=)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Punctuation, Operator), 'attr'),
+            (r'([*#])([\w:.-]+)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Punctuation)),
+        ],
+
+        'ngExpression': [
+            (r'\s+(\|\s+)?', Text),
+            (r'\}\}', Comment.Preproc, '#pop'),
+
+            # Literals
+            (r':?(true|false)', String.Boolean),
+            (r':?"(\\\\|\\"|[^"])*"', String.Double),
+            (r":?'(\\\\|\\'|[^'])*'", String.Single),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+
+            # Variabletext
+            (r'[a-zA-Z][\w-]*(\(.*\))?', Name.Variable),
+            (r'\.[\w-]+(\(.*\))?', Name.Variable),
+
+            # inline If
+            (r'(\?)(\s*)([^}\s]+)(\s*)(:)(\s*)([^}\s]+)(\s*)',
+             bygroups(Operator, Text, String, Text, Operator, Text, String, Text)),
+        ],
+        'attr': [
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+
+class Angular2HtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `Angular2Lexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    .. versionadded:: 2.0
+    """
+
+    name = "HTML + Angular2"
+    aliases = ["html+ng2"]
+    filenames = ['*.ng2']
+
+    def __init__(self, **options):
+        super(Angular2HtmlLexer, self).__init__(HtmlLexer, Angular2Lexer, **options)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_openedge_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_openedge_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_openedge_builtins.py	(revision 1126)
@@ -0,0 +1,2547 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._openedge_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtin list for the OpenEdgeLexer.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+OPENEDGEKEYWORDS = (
+    'ABSOLUTE',
+    'ABS',
+    'ABSO',
+    'ABSOL',
+    'ABSOLU',
+    'ABSOLUT',
+    'ACCELERATOR',
+    'ACCUMULATE',
+    'ACCUM',
+    'ACCUMU',
+    'ACCUMUL',
+    'ACCUMULA',
+    'ACCUMULAT',
+    'ACTIVE-FORM',
+    'ACTIVE-WINDOW',
+    'ADD',
+    'ADD-BUFFER',
+    'ADD-CALC-COLUMN',
+    'ADD-COLUMNS-FROM',
+    'ADD-EVENTS-PROCEDURE',
+    'ADD-FIELDS-FROM',
+    'ADD-FIRST',
+    'ADD-INDEX-FIELD',
+    'ADD-LAST',
+    'ADD-LIKE-COLUMN',
+    'ADD-LIKE-FIELD',
+    'ADD-LIKE-INDEX',
+    'ADD-NEW-FIELD',
+    'ADD-NEW-INDEX',
+    'ADD-SCHEMA-LOCATION',
+    'ADD-SUPER-PROCEDURE',
+    'ADM-DATA',
+    'ADVISE',
+    'ALERT-BOX',
+    'ALIAS',
+    'ALL',
+    'ALLOW-COLUMN-SEARCHING',
+    'ALLOW-REPLICATION',
+    'ALTER',
+    'ALWAYS-ON-TOP',
+    'AMBIGUOUS',
+    'AMBIG',
+    'AMBIGU',
+    'AMBIGUO',
+    'AMBIGUOU',
+    'ANALYZE',
+    'ANALYZ',
+    'AND',
+    'ANSI-ONLY',
+    'ANY',
+    'ANYWHERE',
+    'APPEND',
+    'APPL-ALERT-BOXES',
+    'APPL-ALERT',
+    'APPL-ALERT-',
+    'APPL-ALERT-B',
+    'APPL-ALERT-BO',
+    'APPL-ALERT-BOX',
+    'APPL-ALERT-BOXE',
+    'APPL-CONTEXT-ID',
+    'APPLICATION',
+    'APPLY',
+    'APPSERVER-INFO',
+    'APPSERVER-PASSWORD',
+    'APPSERVER-USERID',
+    'ARRAY-MESSAGE',
+    'AS',
+    'ASC',
+    'ASCENDING',
+    'ASCE',
+    'ASCEN',
+    'ASCEND',
+    'ASCENDI',
+    'ASCENDIN',
+    'ASK-OVERWRITE',
+    'ASSEMBLY',
+    'ASSIGN',
+    'ASYNCHRONOUS',
+    'ASYNC-REQUEST-COUNT',
+    'ASYNC-REQUEST-HANDLE',
+    'AT',
+    'ATTACHED-PAIRLIST',
+    'ATTR-SPACE',
+    'ATTR',
+    'ATTRI',
+    'ATTRIB',
+    'ATTRIBU',
+    'ATTRIBUT',
+    'AUDIT-CONTROL',
+    'AUDIT-ENABLED',
+    'AUDIT-EVENT-CONTEXT',
+    'AUDIT-POLICY',
+    'AUTHENTICATION-FAILED',
+    'AUTHORIZATION',
+    'AUTO-COMPLETION',
+    'AUTO-COMP',
+    'AUTO-COMPL',
+    'AUTO-COMPLE',
+    'AUTO-COMPLET',
+    'AUTO-COMPLETI',
+    'AUTO-COMPLETIO',
+    'AUTO-ENDKEY',
+    'AUTO-END-KEY',
+    'AUTO-GO',
+    'AUTO-INDENT',
+    'AUTO-IND',
+    'AUTO-INDE',
+    'AUTO-INDEN',
+    'AUTOMATIC',
+    'AUTO-RESIZE',
+    'AUTO-RETURN',
+    'AUTO-RET',
+    'AUTO-RETU',
+    'AUTO-RETUR',
+    'AUTO-SYNCHRONIZE',
+    'AUTO-ZAP',
+    'AUTO-Z',
+    'AUTO-ZA',
+    'AVAILABLE',
+    'AVAIL',
+    'AVAILA',
+    'AVAILAB',
+    'AVAILABL',
+    'AVAILABLE-FORMATS',
+    'AVERAGE',
+    'AVE',
+    'AVER',
+    'AVERA',
+    'AVERAG',
+    'AVG',
+    'BACKGROUND',
+    'BACK',
+    'BACKG',
+    'BACKGR',
+    'BACKGRO',
+    'BACKGROU',
+    'BACKGROUN',
+    'BACKWARDS',
+    'BACKWARD',
+    'BASE64-DECODE',
+    'BASE64-ENCODE',
+    'BASE-ADE',
+    'BASE-KEY',
+    'BATCH-MODE',
+    'BATCH',
+    'BATCH-',
+    'BATCH-M',
+    'BATCH-MO',
+    'BATCH-MOD',
+    'BATCH-SIZE',
+    'BEFORE-HIDE',
+    'BEFORE-H',
+    'BEFORE-HI',
+    'BEFORE-HID',
+    'BEGIN-EVENT-GROUP',
+    'BEGINS',
+    'BELL',
+    'BETWEEN',
+    'BGCOLOR',
+    'BGC',
+    'BGCO',
+    'BGCOL',
+    'BGCOLO',
+    'BIG-ENDIAN',
+    'BINARY',
+    'BIND',
+    'BIND-WHERE',
+    'BLANK',
+    'BLOCK-ITERATION-DISPLAY',
+    'BORDER-BOTTOM-CHARS',
+    'BORDER-B',
+    'BORDER-BO',
+    'BORDER-BOT',
+    'BORDER-BOTT',
+    'BORDER-BOTTO',
+    'BORDER-BOTTOM-PIXELS',
+    'BORDER-BOTTOM-P',
+    'BORDER-BOTTOM-PI',
+    'BORDER-BOTTOM-PIX',
+    'BORDER-BOTTOM-PIXE',
+    'BORDER-BOTTOM-PIXEL',
+    'BORDER-LEFT-CHARS',
+    'BORDER-L',
+    'BORDER-LE',
+    'BORDER-LEF',
+    'BORDER-LEFT',
+    'BORDER-LEFT-',
+    'BORDER-LEFT-C',
+    'BORDER-LEFT-CH',
+    'BORDER-LEFT-CHA',
+    'BORDER-LEFT-CHAR',
+    'BORDER-LEFT-PIXELS',
+    'BORDER-LEFT-P',
+    'BORDER-LEFT-PI',
+    'BORDER-LEFT-PIX',
+    'BORDER-LEFT-PIXE',
+    'BORDER-LEFT-PIXEL',
+    'BORDER-RIGHT-CHARS',
+    'BORDER-R',
+    'BORDER-RI',
+    'BORDER-RIG',
+    'BORDER-RIGH',
+    'BORDER-RIGHT',
+    'BORDER-RIGHT-',
+    'BORDER-RIGHT-C',
+    'BORDER-RIGHT-CH',
+    'BORDER-RIGHT-CHA',
+    'BORDER-RIGHT-CHAR',
+    'BORDER-RIGHT-PIXELS',
+    'BORDER-RIGHT-P',
+    'BORDER-RIGHT-PI',
+    'BORDER-RIGHT-PIX',
+    'BORDER-RIGHT-PIXE',
+    'BORDER-RIGHT-PIXEL',
+    'BORDER-TOP-CHARS',
+    'BORDER-T',
+    'BORDER-TO',
+    'BORDER-TOP',
+    'BORDER-TOP-',
+    'BORDER-TOP-C',
+    'BORDER-TOP-CH',
+    'BORDER-TOP-CHA',
+    'BORDER-TOP-CHAR',
+    'BORDER-TOP-PIXELS',
+    'BORDER-TOP-P',
+    'BORDER-TOP-PI',
+    'BORDER-TOP-PIX',
+    'BORDER-TOP-PIXE',
+    'BORDER-TOP-PIXEL',
+    'BOX',
+    'BOX-SELECTABLE',
+    'BOX-SELECT',
+    'BOX-SELECTA',
+    'BOX-SELECTAB',
+    'BOX-SELECTABL',
+    'BREAK',
+    'BROWSE',
+    'BUFFER',
+    'BUFFER-CHARS',
+    'BUFFER-COMPARE',
+    'BUFFER-COPY',
+    'BUFFER-CREATE',
+    'BUFFER-DELETE',
+    'BUFFER-FIELD',
+    'BUFFER-HANDLE',
+    'BUFFER-LINES',
+    'BUFFER-NAME',
+    'BUFFER-RELEASE',
+    'BUFFER-VALUE',
+    'BUTTON',
+    'BUTTONS',
+    'BY',
+    'BY-POINTER',
+    'BY-VARIANT-POINTER',
+    'CACHE',
+    'CACHE-SIZE',
+    'CALL',
+    'CALL-NAME',
+    'CALL-TYPE',
+    'CANCEL-BREAK',
+    'CANCEL-BUTTON',
+    'CAN-CREATE',
+    'CAN-DELETE',
+    'CAN-DO',
+    'CAN-FIND',
+    'CAN-QUERY',
+    'CAN-READ',
+    'CAN-SET',
+    'CAN-WRITE',
+    'CAPS',
+    'CAREFUL-PAINT',
+    'CASE',
+    'CASE-SENSITIVE',
+    'CASE-SEN',
+    'CASE-SENS',
+    'CASE-SENSI',
+    'CASE-SENSIT',
+    'CASE-SENSITI',
+    'CASE-SENSITIV',
+    'CAST',
+    'CATCH',
+    'CDECL',
+    'CENTERED',
+    'CENTER',
+    'CENTERE',
+    'CHAINED',
+    'CHARACTER_LENGTH',
+    'CHARSET',
+    'CHECK',
+    'CHECKED',
+    'CHOOSE',
+    'CHR',
+    'CLASS',
+    'CLASS-TYPE',
+    'CLEAR',
+    'CLEAR-APPL-CONTEXT',
+    'CLEAR-LOG',
+    'CLEAR-SELECTION',
+    'CLEAR-SELECT',
+    'CLEAR-SELECTI',
+    'CLEAR-SELECTIO',
+    'CLEAR-SORT-ARROWS',
+    'CLEAR-SORT-ARROW',
+    'CLIENT-CONNECTION-ID',
+    'CLIENT-PRINCIPAL',
+    'CLIENT-TTY',
+    'CLIENT-TYPE',
+    'CLIENT-WORKSTATION',
+    'CLIPBOARD',
+    'CLOSE',
+    'CLOSE-LOG',
+    'CODE',
+    'CODEBASE-LOCATOR',
+    'CODEPAGE',
+    'CODEPAGE-CONVERT',
+    'COLLATE',
+    'COL-OF',
+    'COLON',
+    'COLON-ALIGNED',
+    'COLON-ALIGN',
+    'COLON-ALIGNE',
+    'COLOR',
+    'COLOR-TABLE',
+    'COLUMN',
+    'COL',
+    'COLU',
+    'COLUM',
+    'COLUMN-BGCOLOR',
+    'COLUMN-DCOLOR',
+    'COLUMN-FGCOLOR',
+    'COLUMN-FONT',
+    'COLUMN-LABEL',
+    'COLUMN-LAB',
+    'COLUMN-LABE',
+    'COLUMN-MOVABLE',
+    'COLUMN-OF',
+    'COLUMN-PFCOLOR',
+    'COLUMN-READ-ONLY',
+    'COLUMN-RESIZABLE',
+    'COLUMNS',
+    'COLUMN-SCROLLING',
+    'COMBO-BOX',
+    'COMMAND',
+    'COMPARES',
+    'COMPILE',
+    'COMPILER',
+    'COMPLETE',
+    'COM-SELF',
+    'CONFIG-NAME',
+    'CONNECT',
+    'CONNECTED',
+    'CONSTRUCTOR',
+    'CONTAINS',
+    'CONTENTS',
+    'CONTEXT',
+    'CONTEXT-HELP',
+    'CONTEXT-HELP-FILE',
+    'CONTEXT-HELP-ID',
+    'CONTEXT-POPUP',
+    'CONTROL',
+    'CONTROL-BOX',
+    'CONTROL-FRAME',
+    'CONVERT',
+    'CONVERT-3D-COLORS',
+    'CONVERT-TO-OFFSET',
+    'CONVERT-TO-OFFS',
+    'CONVERT-TO-OFFSE',
+    'COPY-DATASET',
+    'COPY-LOB',
+    'COPY-SAX-ATTRIBUTES',
+    'COPY-TEMP-TABLE',
+    'COUNT',
+    'COUNT-OF',
+    'CPCASE',
+    'CPCOLL',
+    'CPINTERNAL',
+    'CPLOG',
+    'CPPRINT',
+    'CPRCODEIN',
+    'CPRCODEOUT',
+    'CPSTREAM',
+    'CPTERM',
+    'CRC-VALUE',
+    'CREATE',
+    'CREATE-LIKE',
+    'CREATE-LIKE-SEQUENTIAL',
+    'CREATE-NODE-NAMESPACE',
+    'CREATE-RESULT-LIST-ENTRY',
+    'CREATE-TEST-FILE',
+    'CURRENT',
+    'CURRENT_DATE',
+    'CURRENT-CHANGED',
+    'CURRENT-COLUMN',
+    'CURRENT-ENVIRONMENT',
+    'CURRENT-ENV',
+    'CURRENT-ENVI',
+    'CURRENT-ENVIR',
+    'CURRENT-ENVIRO',
+    'CURRENT-ENVIRON',
+    'CURRENT-ENVIRONM',
+    'CURRENT-ENVIRONME',
+    'CURRENT-ENVIRONMEN',
+    'CURRENT-ITERATION',
+    'CURRENT-LANGUAGE',
+    'CURRENT-LANG',
+    'CURRENT-LANGU',
+    'CURRENT-LANGUA',
+    'CURRENT-LANGUAG',
+    'CURRENT-QUERY',
+    'CURRENT-RESULT-ROW',
+    'CURRENT-ROW-MODIFIED',
+    'CURRENT-VALUE',
+    'CURRENT-WINDOW',
+    'CURSOR',
+    'CURS',
+    'CURSO',
+    'CURSOR-CHAR',
+    'CURSOR-LINE',
+    'CURSOR-OFFSET',
+    'DATABASE',
+    'DATA-BIND',
+    'DATA-ENTRY-RETURN',
+    'DATA-ENTRY-RET',
+    'DATA-ENTRY-RETU',
+    'DATA-ENTRY-RETUR',
+    'DATA-RELATION',
+    'DATA-REL',
+    'DATA-RELA',
+    'DATA-RELAT',
+    'DATA-RELATI',
+    'DATA-RELATIO',
+    'DATASERVERS',
+    'DATASET',
+    'DATASET-HANDLE',
+    'DATA-SOURCE',
+    'DATA-SOURCE-COMPLETE-MAP',
+    'DATA-SOURCE-MODIFIED',
+    'DATA-SOURCE-ROWID',
+    'DATA-TYPE',
+    'DATA-T',
+    'DATA-TY',
+    'DATA-TYP',
+    'DATE-FORMAT',
+    'DATE-F',
+    'DATE-FO',
+    'DATE-FOR',
+    'DATE-FORM',
+    'DATE-FORMA',
+    'DAY',
+    'DBCODEPAGE',
+    'DBCOLLATION',
+    'DBNAME',
+    'DBPARAM',
+    'DB-REFERENCES',
+    'DBRESTRICTIONS',
+    'DBREST',
+    'DBRESTR',
+    'DBRESTRI',
+    'DBRESTRIC',
+    'DBRESTRICT',
+    'DBRESTRICTI',
+    'DBRESTRICTIO',
+    'DBRESTRICTION',
+    'DBTASKID',
+    'DBTYPE',
+    'DBVERSION',
+    'DBVERS',
+    'DBVERSI',
+    'DBVERSIO',
+    'DCOLOR',
+    'DDE',
+    'DDE-ERROR',
+    'DDE-ID',
+    'DDE-I',
+    'DDE-ITEM',
+    'DDE-NAME',
+    'DDE-TOPIC',
+    'DEBLANK',
+    'DEBUG',
+    'DEBU',
+    'DEBUG-ALERT',
+    'DEBUGGER',
+    'DEBUG-LIST',
+    'DECIMALS',
+    'DECLARE',
+    'DECLARE-NAMESPACE',
+    'DECRYPT',
+    'DEFAULT',
+    'DEFAULT-BUFFER-HANDLE',
+    'DEFAULT-BUTTON',
+    'DEFAUT-B',
+    'DEFAUT-BU',
+    'DEFAUT-BUT',
+    'DEFAUT-BUTT',
+    'DEFAUT-BUTTO',
+    'DEFAULT-COMMIT',
+    'DEFAULT-EXTENSION',
+    'DEFAULT-EX',
+    'DEFAULT-EXT',
+    'DEFAULT-EXTE',
+    'DEFAULT-EXTEN',
+    'DEFAULT-EXTENS',
+    'DEFAULT-EXTENSI',
+    'DEFAULT-EXTENSIO',
+    'DEFAULT-NOXLATE',
+    'DEFAULT-NOXL',
+    'DEFAULT-NOXLA',
+    'DEFAULT-NOXLAT',
+    'DEFAULT-VALUE',
+    'DEFAULT-WINDOW',
+    'DEFINED',
+    'DEFINE-USER-EVENT-MANAGER',
+    'DELETE',
+    'DEL',
+    'DELE',
+    'DELET',
+    'DELETE-CHARACTER',
+    'DELETE-CHAR',
+    'DELETE-CHARA',
+    'DELETE-CHARAC',
+    'DELETE-CHARACT',
+    'DELETE-CHARACTE',
+    'DELETE-CURRENT-ROW',
+    'DELETE-LINE',
+    'DELETE-RESULT-LIST-ENTRY',
+    'DELETE-SELECTED-ROW',
+    'DELETE-SELECTED-ROWS',
+    'DELIMITER',
+    'DESC',
+    'DESCENDING',
+    'DESCE',
+    'DESCEN',
+    'DESCEND',
+    'DESCENDI',
+    'DESCENDIN',
+    'DESELECT-FOCUSED-ROW',
+    'DESELECTION',
+    'DESELECT-ROWS',
+    'DESELECT-SELECTED-ROW',
+    'DESTRUCTOR',
+    'DIALOG-BOX',
+    'DICTIONARY',
+    'DICT',
+    'DICTI',
+    'DICTIO',
+    'DICTION',
+    'DICTIONA',
+    'DICTIONAR',
+    'DIR',
+    'DISABLE',
+    'DISABLE-AUTO-ZAP',
+    'DISABLED',
+    'DISABLE-DUMP-TRIGGERS',
+    'DISABLE-LOAD-TRIGGERS',
+    'DISCONNECT',
+    'DISCON',
+    'DISCONN',
+    'DISCONNE',
+    'DISCONNEC',
+    'DISP',
+    'DISPLAY',
+    'DISPL',
+    'DISPLA',
+    'DISPLAY-MESSAGE',
+    'DISPLAY-TYPE',
+    'DISPLAY-T',
+    'DISPLAY-TY',
+    'DISPLAY-TYP',
+    'DISTINCT',
+    'DO',
+    'DOMAIN-DESCRIPTION',
+    'DOMAIN-NAME',
+    'DOMAIN-TYPE',
+    'DOS',
+    'DOUBLE',
+    'DOWN',
+    'DRAG-ENABLED',
+    'DROP',
+    'DROP-DOWN',
+    'DROP-DOWN-LIST',
+    'DROP-FILE-NOTIFY',
+    'DROP-TARGET',
+    'DUMP',
+    'DYNAMIC',
+    'DYNAMIC-FUNCTION',
+    'EACH',
+    'ECHO',
+    'EDGE-CHARS',
+    'EDGE',
+    'EDGE-',
+    'EDGE-C',
+    'EDGE-CH',
+    'EDGE-CHA',
+    'EDGE-CHAR',
+    'EDGE-PIXELS',
+    'EDGE-P',
+    'EDGE-PI',
+    'EDGE-PIX',
+    'EDGE-PIXE',
+    'EDGE-PIXEL',
+    'EDIT-CAN-PASTE',
+    'EDIT-CAN-UNDO',
+    'EDIT-CLEAR',
+    'EDIT-COPY',
+    'EDIT-CUT',
+    'EDITING',
+    'EDITOR',
+    'EDIT-PASTE',
+    'EDIT-UNDO',
+    'ELSE',
+    'EMPTY',
+    'EMPTY-TEMP-TABLE',
+    'ENABLE',
+    'ENABLED-FIELDS',
+    'ENCODE',
+    'ENCRYPT',
+    'ENCRYPT-AUDIT-MAC-KEY',
+    'ENCRYPTION-SALT',
+    'END',
+    'END-DOCUMENT',
+    'END-ELEMENT',
+    'END-EVENT-GROUP',
+    'END-FILE-DROP',
+    'ENDKEY',
+    'END-KEY',
+    'END-MOVE',
+    'END-RESIZE',
+    'END-ROW-RESIZE',
+    'END-USER-PROMPT',
+    'ENTERED',
+    'ENTRY',
+    'EQ',
+    'ERROR',
+    'ERROR-COLUMN',
+    'ERROR-COL',
+    'ERROR-COLU',
+    'ERROR-COLUM',
+    'ERROR-ROW',
+    'ERROR-STACK-TRACE',
+    'ERROR-STATUS',
+    'ERROR-STAT',
+    'ERROR-STATU',
+    'ESCAPE',
+    'ETIME',
+    'EVENT-GROUP-ID',
+    'EVENT-PROCEDURE',
+    'EVENT-PROCEDURE-CONTEXT',
+    'EVENTS',
+    'EVENT',
+    'EVENT-TYPE',
+    'EVENT-T',
+    'EVENT-TY',
+    'EVENT-TYP',
+    'EXCEPT',
+    'EXCLUSIVE-ID',
+    'EXCLUSIVE-LOCK',
+    'EXCLUSIVE',
+    'EXCLUSIVE-',
+    'EXCLUSIVE-L',
+    'EXCLUSIVE-LO',
+    'EXCLUSIVE-LOC',
+    'EXCLUSIVE-WEB-USER',
+    'EXECUTE',
+    'EXISTS',
+    'EXP',
+    'EXPAND',
+    'EXPANDABLE',
+    'EXPLICIT',
+    'EXPORT',
+    'EXPORT-PRINCIPAL',
+    'EXTENDED',
+    'EXTENT',
+    'EXTERNAL',
+    'FALSE',
+    'FETCH',
+    'FETCH-SELECTED-ROW',
+    'FGCOLOR',
+    'FGC',
+    'FGCO',
+    'FGCOL',
+    'FGCOLO',
+    'FIELD',
+    'FIELDS',
+    'FILE',
+    'FILE-CREATE-DATE',
+    'FILE-CREATE-TIME',
+    'FILE-INFORMATION',
+    'FILE-INFO',
+    'FILE-INFOR',
+    'FILE-INFORM',
+    'FILE-INFORMA',
+    'FILE-INFORMAT',
+    'FILE-INFORMATI',
+    'FILE-INFORMATIO',
+    'FILE-MOD-DATE',
+    'FILE-MOD-TIME',
+    'FILENAME',
+    'FILE-NAME',
+    'FILE-OFFSET',
+    'FILE-OFF',
+    'FILE-OFFS',
+    'FILE-OFFSE',
+    'FILE-SIZE',
+    'FILE-TYPE',
+    'FILL',
+    'FILLED',
+    'FILL-IN',
+    'FILTERS',
+    'FINAL',
+    'FINALLY',
+    'FIND',
+    'FIND-BY-ROWID',
+    'FIND-CASE-SENSITIVE',
+    'FIND-CURRENT',
+    'FINDER',
+    'FIND-FIRST',
+    'FIND-GLOBAL',
+    'FIND-LAST',
+    'FIND-NEXT-OCCURRENCE',
+    'FIND-PREV-OCCURRENCE',
+    'FIND-SELECT',
+    'FIND-UNIQUE',
+    'FIND-WRAP-AROUND',
+    'FIRST',
+    'FIRST-ASYNCH-REQUEST',
+    'FIRST-CHILD',
+    'FIRST-COLUMN',
+    'FIRST-FORM',
+    'FIRST-OBJECT',
+    'FIRST-OF',
+    'FIRST-PROCEDURE',
+    'FIRST-PROC',
+    'FIRST-PROCE',
+    'FIRST-PROCED',
+    'FIRST-PROCEDU',
+    'FIRST-PROCEDUR',
+    'FIRST-SERVER',
+    'FIRST-TAB-ITEM',
+    'FIRST-TAB-I',
+    'FIRST-TAB-IT',
+    'FIRST-TAB-ITE',
+    'FIT-LAST-COLUMN',
+    'FIXED-ONLY',
+    'FLAT-BUTTON',
+    'FLOAT',
+    'FOCUS',
+    'FOCUSED-ROW',
+    'FOCUSED-ROW-SELECTED',
+    'FONT',
+    'FONT-TABLE',
+    'FOR',
+    'FORCE-FILE',
+    'FOREGROUND',
+    'FORE',
+    'FOREG',
+    'FOREGR',
+    'FOREGRO',
+    'FOREGROU',
+    'FOREGROUN',
+    'FORM',
+    'FORMAT',
+    'FORMA',
+    'FORMATTED',
+    'FORMATTE',
+    'FORM-LONG-INPUT',
+    'FORWARD',
+    'FORWARDS',
+    'FRAGMENT',
+    'FRAGMEN',
+    'FRAME',
+    'FRAM',
+    'FRAME-COL',
+    'FRAME-DB',
+    'FRAME-DOWN',
+    'FRAME-FIELD',
+    'FRAME-FILE',
+    'FRAME-INDEX',
+    'FRAME-INDE',
+    'FRAME-LINE',
+    'FRAME-NAME',
+    'FRAME-ROW',
+    'FRAME-SPACING',
+    'FRAME-SPA',
+    'FRAME-SPAC',
+    'FRAME-SPACI',
+    'FRAME-SPACIN',
+    'FRAME-VALUE',
+    'FRAME-VAL',
+    'FRAME-VALU',
+    'FRAME-X',
+    'FRAME-Y',
+    'FREQUENCY',
+    'FROM',
+    'FROM-CHARS',
+    'FROM-C',
+    'FROM-CH',
+    'FROM-CHA',
+    'FROM-CHAR',
+    'FROM-CURRENT',
+    'FROM-CUR',
+    'FROM-CURR',
+    'FROM-CURRE',
+    'FROM-CURREN',
+    'FROM-PIXELS',
+    'FROM-P',
+    'FROM-PI',
+    'FROM-PIX',
+    'FROM-PIXE',
+    'FROM-PIXEL',
+    'FULL-HEIGHT-CHARS',
+    'FULL-HEIGHT',
+    'FULL-HEIGHT-',
+    'FULL-HEIGHT-C',
+    'FULL-HEIGHT-CH',
+    'FULL-HEIGHT-CHA',
+    'FULL-HEIGHT-CHAR',
+    'FULL-HEIGHT-PIXELS',
+    'FULL-HEIGHT-P',
+    'FULL-HEIGHT-PI',
+    'FULL-HEIGHT-PIX',
+    'FULL-HEIGHT-PIXE',
+    'FULL-HEIGHT-PIXEL',
+    'FULL-PATHNAME',
+    'FULL-PATHN',
+    'FULL-PATHNA',
+    'FULL-PATHNAM',
+    'FULL-WIDTH-CHARS',
+    'FULL-WIDTH',
+    'FULL-WIDTH-',
+    'FULL-WIDTH-C',
+    'FULL-WIDTH-CH',
+    'FULL-WIDTH-CHA',
+    'FULL-WIDTH-CHAR',
+    'FULL-WIDTH-PIXELS',
+    'FULL-WIDTH-P',
+    'FULL-WIDTH-PI',
+    'FULL-WIDTH-PIX',
+    'FULL-WIDTH-PIXE',
+    'FULL-WIDTH-PIXEL',
+    'FUNCTION',
+    'FUNCTION-CALL-TYPE',
+    'GATEWAYS',
+    'GATEWAY',
+    'GE',
+    'GENERATE-MD5',
+    'GENERATE-PBE-KEY',
+    'GENERATE-PBE-SALT',
+    'GENERATE-RANDOM-KEY',
+    'GENERATE-UUID',
+    'GET',
+    'GET-ATTR-CALL-TYPE',
+    'GET-ATTRIBUTE-NODE',
+    'GET-BINARY-DATA',
+    'GET-BLUE-VALUE',
+    'GET-BLUE',
+    'GET-BLUE-',
+    'GET-BLUE-V',
+    'GET-BLUE-VA',
+    'GET-BLUE-VAL',
+    'GET-BLUE-VALU',
+    'GET-BROWSE-COLUMN',
+    'GET-BUFFER-HANDLEGETBYTE',
+    'GET-BYTE',
+    'GET-CALLBACK-PROC-CONTEXT',
+    'GET-CALLBACK-PROC-NAME',
+    'GET-CGI-LIST',
+    'GET-CGI-LONG-VALUE',
+    'GET-CGI-VALUE',
+    'GET-CODEPAGES',
+    'GET-COLLATIONS',
+    'GET-CONFIG-VALUE',
+    'GET-CURRENT',
+    'GET-DOUBLE',
+    'GET-DROPPED-FILE',
+    'GET-DYNAMIC',
+    'GET-ERROR-COLUMN',
+    'GET-ERROR-ROW',
+    'GET-FILE',
+    'GET-FILE-NAME',
+    'GET-FILE-OFFSET',
+    'GET-FILE-OFFSE',
+    'GET-FIRST',
+    'GET-FLOAT',
+    'GET-GREEN-VALUE',
+    'GET-GREEN',
+    'GET-GREEN-',
+    'GET-GREEN-V',
+    'GET-GREEN-VA',
+    'GET-GREEN-VAL',
+    'GET-GREEN-VALU',
+    'GET-INDEX-BY-NAMESPACE-NAME',
+    'GET-INDEX-BY-QNAME',
+    'GET-INT64',
+    'GET-ITERATION',
+    'GET-KEY-VALUE',
+    'GET-KEY-VAL',
+    'GET-KEY-VALU',
+    'GET-LAST',
+    'GET-LOCALNAME-BY-INDEX',
+    'GET-LONG',
+    'GET-MESSAGE',
+    'GET-NEXT',
+    'GET-NUMBER',
+    'GET-POINTER-VALUE',
+    'GET-PREV',
+    'GET-PRINTERS',
+    'GET-PROPERTY',
+    'GET-QNAME-BY-INDEX',
+    'GET-RED-VALUE',
+    'GET-RED',
+    'GET-RED-',
+    'GET-RED-V',
+    'GET-RED-VA',
+    'GET-RED-VAL',
+    'GET-RED-VALU',
+    'GET-REPOSITIONED-ROW',
+    'GET-RGB-VALUE',
+    'GET-SELECTED-WIDGET',
+    'GET-SELECTED',
+    'GET-SELECTED-',
+    'GET-SELECTED-W',
+    'GET-SELECTED-WI',
+    'GET-SELECTED-WID',
+    'GET-SELECTED-WIDG',
+    'GET-SELECTED-WIDGE',
+    'GET-SHORT',
+    'GET-SIGNATURE',
+    'GET-SIZE',
+    'GET-STRING',
+    'GET-TAB-ITEM',
+    'GET-TEXT-HEIGHT-CHARS',
+    'GET-TEXT-HEIGHT',
+    'GET-TEXT-HEIGHT-',
+    'GET-TEXT-HEIGHT-C',
+    'GET-TEXT-HEIGHT-CH',
+    'GET-TEXT-HEIGHT-CHA',
+    'GET-TEXT-HEIGHT-CHAR',
+    'GET-TEXT-HEIGHT-PIXELS',
+    'GET-TEXT-HEIGHT-P',
+    'GET-TEXT-HEIGHT-PI',
+    'GET-TEXT-HEIGHT-PIX',
+    'GET-TEXT-HEIGHT-PIXE',
+    'GET-TEXT-HEIGHT-PIXEL',
+    'GET-TEXT-WIDTH-CHARS',
+    'GET-TEXT-WIDTH',
+    'GET-TEXT-WIDTH-',
+    'GET-TEXT-WIDTH-C',
+    'GET-TEXT-WIDTH-CH',
+    'GET-TEXT-WIDTH-CHA',
+    'GET-TEXT-WIDTH-CHAR',
+    'GET-TEXT-WIDTH-PIXELS',
+    'GET-TEXT-WIDTH-P',
+    'GET-TEXT-WIDTH-PI',
+    'GET-TEXT-WIDTH-PIX',
+    'GET-TEXT-WIDTH-PIXE',
+    'GET-TEXT-WIDTH-PIXEL',
+    'GET-TYPE-BY-INDEX',
+    'GET-TYPE-BY-NAMESPACE-NAME',
+    'GET-TYPE-BY-QNAME',
+    'GET-UNSIGNED-LONG',
+    'GET-UNSIGNED-SHORT',
+    'GET-URI-BY-INDEX',
+    'GET-VALUE-BY-INDEX',
+    'GET-VALUE-BY-NAMESPACE-NAME',
+    'GET-VALUE-BY-QNAME',
+    'GET-WAIT-STATE',
+    'GLOBAL',
+    'GO-ON',
+    'GO-PENDING',
+    'GO-PEND',
+    'GO-PENDI',
+    'GO-PENDIN',
+    'GRANT',
+    'GRAPHIC-EDGE',
+    'GRAPHIC-E',
+    'GRAPHIC-ED',
+    'GRAPHIC-EDG',
+    'GRID-FACTOR-HORIZONTAL',
+    'GRID-FACTOR-H',
+    'GRID-FACTOR-HO',
+    'GRID-FACTOR-HOR',
+    'GRID-FACTOR-HORI',
+    'GRID-FACTOR-HORIZ',
+    'GRID-FACTOR-HORIZO',
+    'GRID-FACTOR-HORIZON',
+    'GRID-FACTOR-HORIZONT',
+    'GRID-FACTOR-HORIZONTA',
+    'GRID-FACTOR-VERTICAL',
+    'GRID-FACTOR-V',
+    'GRID-FACTOR-VE',
+    'GRID-FACTOR-VER',
+    'GRID-FACTOR-VERT',
+    'GRID-FACTOR-VERTI',
+    'GRID-FACTOR-VERTIC',
+    'GRID-FACTOR-VERTICA',
+    'GRID-SNAP',
+    'GRID-UNIT-HEIGHT-CHARS',
+    'GRID-UNIT-HEIGHT',
+    'GRID-UNIT-HEIGHT-',
+    'GRID-UNIT-HEIGHT-C',
+    'GRID-UNIT-HEIGHT-CH',
+    'GRID-UNIT-HEIGHT-CHA',
+    'GRID-UNIT-HEIGHT-PIXELS',
+    'GRID-UNIT-HEIGHT-P',
+    'GRID-UNIT-HEIGHT-PI',
+    'GRID-UNIT-HEIGHT-PIX',
+    'GRID-UNIT-HEIGHT-PIXE',
+    'GRID-UNIT-HEIGHT-PIXEL',
+    'GRID-UNIT-WIDTH-CHARS',
+    'GRID-UNIT-WIDTH',
+    'GRID-UNIT-WIDTH-',
+    'GRID-UNIT-WIDTH-C',
+    'GRID-UNIT-WIDTH-CH',
+    'GRID-UNIT-WIDTH-CHA',
+    'GRID-UNIT-WIDTH-CHAR',
+    'GRID-UNIT-WIDTH-PIXELS',
+    'GRID-UNIT-WIDTH-P',
+    'GRID-UNIT-WIDTH-PI',
+    'GRID-UNIT-WIDTH-PIX',
+    'GRID-UNIT-WIDTH-PIXE',
+    'GRID-UNIT-WIDTH-PIXEL',
+    'GRID-VISIBLE',
+    'GROUP',
+    'GT',
+    'GUID',
+    'HANDLER',
+    'HAS-RECORDS',
+    'HAVING',
+    'HEADER',
+    'HEIGHT-CHARS',
+    'HEIGHT',
+    'HEIGHT-',
+    'HEIGHT-C',
+    'HEIGHT-CH',
+    'HEIGHT-CHA',
+    'HEIGHT-CHAR',
+    'HEIGHT-PIXELS',
+    'HEIGHT-P',
+    'HEIGHT-PI',
+    'HEIGHT-PIX',
+    'HEIGHT-PIXE',
+    'HEIGHT-PIXEL',
+    'HELP',
+    'HEX-DECODE',
+    'HEX-ENCODE',
+    'HIDDEN',
+    'HIDE',
+    'HORIZONTAL',
+    'HORI',
+    'HORIZ',
+    'HORIZO',
+    'HORIZON',
+    'HORIZONT',
+    'HORIZONTA',
+    'HOST-BYTE-ORDER',
+    'HTML-CHARSET',
+    'HTML-END-OF-LINE',
+    'HTML-END-OF-PAGE',
+    'HTML-FRAME-BEGIN',
+    'HTML-FRAME-END',
+    'HTML-HEADER-BEGIN',
+    'HTML-HEADER-END',
+    'HTML-TITLE-BEGIN',
+    'HTML-TITLE-END',
+    'HWND',
+    'ICON',
+    'IF',
+    'IMAGE',
+    'IMAGE-DOWN',
+    'IMAGE-INSENSITIVE',
+    'IMAGE-SIZE',
+    'IMAGE-SIZE-CHARS',
+    'IMAGE-SIZE-C',
+    'IMAGE-SIZE-CH',
+    'IMAGE-SIZE-CHA',
+    'IMAGE-SIZE-CHAR',
+    'IMAGE-SIZE-PIXELS',
+    'IMAGE-SIZE-P',
+    'IMAGE-SIZE-PI',
+    'IMAGE-SIZE-PIX',
+    'IMAGE-SIZE-PIXE',
+    'IMAGE-SIZE-PIXEL',
+    'IMAGE-UP',
+    'IMMEDIATE-DISPLAY',
+    'IMPLEMENTS',
+    'IMPORT',
+    'IMPORT-PRINCIPAL',
+    'IN',
+    'INCREMENT-EXCLUSIVE-ID',
+    'INDEX',
+    'INDEXED-REPOSITION',
+    'INDEX-HINT',
+    'INDEX-INFORMATION',
+    'INDICATOR',
+    'INFORMATION',
+    'INFO',
+    'INFOR',
+    'INFORM',
+    'INFORMA',
+    'INFORMAT',
+    'INFORMATI',
+    'INFORMATIO',
+    'IN-HANDLE',
+    'INHERIT-BGCOLOR',
+    'INHERIT-BGC',
+    'INHERIT-BGCO',
+    'INHERIT-BGCOL',
+    'INHERIT-BGCOLO',
+    'INHERIT-FGCOLOR',
+    'INHERIT-FGC',
+    'INHERIT-FGCO',
+    'INHERIT-FGCOL',
+    'INHERIT-FGCOLO',
+    'INHERITS',
+    'INITIAL',
+    'INIT',
+    'INITI',
+    'INITIA',
+    'INITIAL-DIR',
+    'INITIAL-FILTER',
+    'INITIALIZE-DOCUMENT-TYPE',
+    'INITIATE',
+    'INNER-CHARS',
+    'INNER-LINES',
+    'INPUT',
+    'INPUT-OUTPUT',
+    'INPUT-O',
+    'INPUT-OU',
+    'INPUT-OUT',
+    'INPUT-OUTP',
+    'INPUT-OUTPU',
+    'INPUT-VALUE',
+    'INSERT',
+    'INSERT-ATTRIBUTE',
+    'INSERT-BACKTAB',
+    'INSERT-B',
+    'INSERT-BA',
+    'INSERT-BAC',
+    'INSERT-BACK',
+    'INSERT-BACKT',
+    'INSERT-BACKTA',
+    'INSERT-FILE',
+    'INSERT-ROW',
+    'INSERT-STRING',
+    'INSERT-TAB',
+    'INSERT-T',
+    'INSERT-TA',
+    'INTERFACE',
+    'INTERNAL-ENTRIES',
+    'INTO',
+    'INVOKE',
+    'IS',
+    'IS-ATTR-SPACE',
+    'IS-ATTR',
+    'IS-ATTR-',
+    'IS-ATTR-S',
+    'IS-ATTR-SP',
+    'IS-ATTR-SPA',
+    'IS-ATTR-SPAC',
+    'IS-CLASS',
+    'IS-CLAS',
+    'IS-LEAD-BYTE',
+    'IS-OPEN',
+    'IS-PARAMETER-SET',
+    'IS-ROW-SELECTED',
+    'IS-SELECTED',
+    'ITEM',
+    'ITEMS-PER-ROW',
+    'JOIN',
+    'JOIN-BY-SQLDB',
+    'KBLABEL',
+    'KEEP-CONNECTION-OPEN',
+    'KEEP-FRAME-Z-ORDER',
+    'KEEP-FRAME-Z',
+    'KEEP-FRAME-Z-',
+    'KEEP-FRAME-Z-O',
+    'KEEP-FRAME-Z-OR',
+    'KEEP-FRAME-Z-ORD',
+    'KEEP-FRAME-Z-ORDE',
+    'KEEP-MESSAGES',
+    'KEEP-SECURITY-CACHE',
+    'KEEP-TAB-ORDER',
+    'KEY',
+    'KEYCODE',
+    'KEY-CODE',
+    'KEYFUNCTION',
+    'KEYFUNC',
+    'KEYFUNCT',
+    'KEYFUNCTI',
+    'KEYFUNCTIO',
+    'KEY-FUNCTION',
+    'KEY-FUNC',
+    'KEY-FUNCT',
+    'KEY-FUNCTI',
+    'KEY-FUNCTIO',
+    'KEYLABEL',
+    'KEY-LABEL',
+    'KEYS',
+    'KEYWORD',
+    'KEYWORD-ALL',
+    'LABEL',
+    'LABEL-BGCOLOR',
+    'LABEL-BGC',
+    'LABEL-BGCO',
+    'LABEL-BGCOL',
+    'LABEL-BGCOLO',
+    'LABEL-DCOLOR',
+    'LABEL-DC',
+    'LABEL-DCO',
+    'LABEL-DCOL',
+    'LABEL-DCOLO',
+    'LABEL-FGCOLOR',
+    'LABEL-FGC',
+    'LABEL-FGCO',
+    'LABEL-FGCOL',
+    'LABEL-FGCOLO',
+    'LABEL-FONT',
+    'LABEL-PFCOLOR',
+    'LABEL-PFC',
+    'LABEL-PFCO',
+    'LABEL-PFCOL',
+    'LABEL-PFCOLO',
+    'LABELS',
+    'LANDSCAPE',
+    'LANGUAGES',
+    'LANGUAGE',
+    'LARGE',
+    'LARGE-TO-SMALL',
+    'LAST',
+    'LAST-ASYNCH-REQUEST',
+    'LAST-BATCH',
+    'LAST-CHILD',
+    'LAST-EVENT',
+    'LAST-EVEN',
+    'LAST-FORM',
+    'LASTKEY',
+    'LAST-KEY',
+    'LAST-OBJECT',
+    'LAST-OF',
+    'LAST-PROCEDURE',
+    'LAST-PROCE',
+    'LAST-PROCED',
+    'LAST-PROCEDU',
+    'LAST-PROCEDUR',
+    'LAST-SERVER',
+    'LAST-TAB-ITEM',
+    'LAST-TAB-I',
+    'LAST-TAB-IT',
+    'LAST-TAB-ITE',
+    'LC',
+    'LDBNAME',
+    'LE',
+    'LEAVE',
+    'LEFT-ALIGNED',
+    'LEFT-ALIGN',
+    'LEFT-ALIGNE',
+    'LEFT-TRIM',
+    'LENGTH',
+    'LIBRARY',
+    'LIKE',
+    'LIKE-SEQUENTIAL',
+    'LINE',
+    'LINE-COUNTER',
+    'LINE-COUNT',
+    'LINE-COUNTE',
+    'LIST-EVENTS',
+    'LISTING',
+    'LISTI',
+    'LISTIN',
+    'LIST-ITEM-PAIRS',
+    'LIST-ITEMS',
+    'LIST-PROPERTY-NAMES',
+    'LIST-QUERY-ATTRS',
+    'LIST-SET-ATTRS',
+    'LIST-WIDGETS',
+    'LITERAL-QUESTION',
+    'LITTLE-ENDIAN',
+    'LOAD',
+    'LOAD-DOMAINS',
+    'LOAD-ICON',
+    'LOAD-IMAGE',
+    'LOAD-IMAGE-DOWN',
+    'LOAD-IMAGE-INSENSITIVE',
+    'LOAD-IMAGE-UP',
+    'LOAD-MOUSE-POINTER',
+    'LOAD-MOUSE-P',
+    'LOAD-MOUSE-PO',
+    'LOAD-MOUSE-POI',
+    'LOAD-MOUSE-POIN',
+    'LOAD-MOUSE-POINT',
+    'LOAD-MOUSE-POINTE',
+    'LOAD-PICTURE',
+    'LOAD-SMALL-ICON',
+    'LOCAL-NAME',
+    'LOCATOR-COLUMN-NUMBER',
+    'LOCATOR-LINE-NUMBER',
+    'LOCATOR-PUBLIC-ID',
+    'LOCATOR-SYSTEM-ID',
+    'LOCATOR-TYPE',
+    'LOCKED',
+    'LOCK-REGISTRATION',
+    'LOG',
+    'LOG-AUDIT-EVENT',
+    'LOGIN-EXPIRATION-TIMESTAMP',
+    'LOGIN-HOST',
+    'LOGIN-STATE',
+    'LOG-MANAGER',
+    'LOGOUT',
+    'LOOKAHEAD',
+    'LOOKUP',
+    'LT',
+    'MACHINE-CLASS',
+    'MANDATORY',
+    'MANUAL-HIGHLIGHT',
+    'MAP',
+    'MARGIN-EXTRA',
+    'MARGIN-HEIGHT-CHARS',
+    'MARGIN-HEIGHT',
+    'MARGIN-HEIGHT-',
+    'MARGIN-HEIGHT-C',
+    'MARGIN-HEIGHT-CH',
+    'MARGIN-HEIGHT-CHA',
+    'MARGIN-HEIGHT-CHAR',
+    'MARGIN-HEIGHT-PIXELS',
+    'MARGIN-HEIGHT-P',
+    'MARGIN-HEIGHT-PI',
+    'MARGIN-HEIGHT-PIX',
+    'MARGIN-HEIGHT-PIXE',
+    'MARGIN-HEIGHT-PIXEL',
+    'MARGIN-WIDTH-CHARS',
+    'MARGIN-WIDTH',
+    'MARGIN-WIDTH-',
+    'MARGIN-WIDTH-C',
+    'MARGIN-WIDTH-CH',
+    'MARGIN-WIDTH-CHA',
+    'MARGIN-WIDTH-CHAR',
+    'MARGIN-WIDTH-PIXELS',
+    'MARGIN-WIDTH-P',
+    'MARGIN-WIDTH-PI',
+    'MARGIN-WIDTH-PIX',
+    'MARGIN-WIDTH-PIXE',
+    'MARGIN-WIDTH-PIXEL',
+    'MARK-NEW',
+    'MARK-ROW-STATE',
+    'MATCHES',
+    'MAX-BUTTON',
+    'MAX-CHARS',
+    'MAX-DATA-GUESS',
+    'MAX-HEIGHT',
+    'MAX-HEIGHT-CHARS',
+    'MAX-HEIGHT-C',
+    'MAX-HEIGHT-CH',
+    'MAX-HEIGHT-CHA',
+    'MAX-HEIGHT-CHAR',
+    'MAX-HEIGHT-PIXELS',
+    'MAX-HEIGHT-P',
+    'MAX-HEIGHT-PI',
+    'MAX-HEIGHT-PIX',
+    'MAX-HEIGHT-PIXE',
+    'MAX-HEIGHT-PIXEL',
+    'MAXIMIZE',
+    'MAXIMUM',
+    'MAX',
+    'MAXI',
+    'MAXIM',
+    'MAXIMU',
+    'MAXIMUM-LEVEL',
+    'MAX-ROWS',
+    'MAX-SIZE',
+    'MAX-VALUE',
+    'MAX-VAL',
+    'MAX-VALU',
+    'MAX-WIDTH-CHARS',
+    'MAX-WIDTH',
+    'MAX-WIDTH-',
+    'MAX-WIDTH-C',
+    'MAX-WIDTH-CH',
+    'MAX-WIDTH-CHA',
+    'MAX-WIDTH-CHAR',
+    'MAX-WIDTH-PIXELS',
+    'MAX-WIDTH-P',
+    'MAX-WIDTH-PI',
+    'MAX-WIDTH-PIX',
+    'MAX-WIDTH-PIXE',
+    'MAX-WIDTH-PIXEL',
+    'MD5-DIGEST',
+    'MEMBER',
+    'MEMPTR-TO-NODE-VALUE',
+    'MENU',
+    'MENUBAR',
+    'MENU-BAR',
+    'MENU-ITEM',
+    'MENU-KEY',
+    'MENU-K',
+    'MENU-KE',
+    'MENU-MOUSE',
+    'MENU-M',
+    'MENU-MO',
+    'MENU-MOU',
+    'MENU-MOUS',
+    'MERGE-BY-FIELD',
+    'MESSAGE',
+    'MESSAGE-AREA',
+    'MESSAGE-AREA-FONT',
+    'MESSAGE-LINES',
+    'METHOD',
+    'MIN-BUTTON',
+    'MIN-COLUMN-WIDTH-CHARS',
+    'MIN-COLUMN-WIDTH-C',
+    'MIN-COLUMN-WIDTH-CH',
+    'MIN-COLUMN-WIDTH-CHA',
+    'MIN-COLUMN-WIDTH-CHAR',
+    'MIN-COLUMN-WIDTH-PIXELS',
+    'MIN-COLUMN-WIDTH-P',
+    'MIN-COLUMN-WIDTH-PI',
+    'MIN-COLUMN-WIDTH-PIX',
+    'MIN-COLUMN-WIDTH-PIXE',
+    'MIN-COLUMN-WIDTH-PIXEL',
+    'MIN-HEIGHT-CHARS',
+    'MIN-HEIGHT',
+    'MIN-HEIGHT-',
+    'MIN-HEIGHT-C',
+    'MIN-HEIGHT-CH',
+    'MIN-HEIGHT-CHA',
+    'MIN-HEIGHT-CHAR',
+    'MIN-HEIGHT-PIXELS',
+    'MIN-HEIGHT-P',
+    'MIN-HEIGHT-PI',
+    'MIN-HEIGHT-PIX',
+    'MIN-HEIGHT-PIXE',
+    'MIN-HEIGHT-PIXEL',
+    'MINIMUM',
+    'MIN',
+    'MINI',
+    'MINIM',
+    'MINIMU',
+    'MIN-SIZE',
+    'MIN-VALUE',
+    'MIN-VAL',
+    'MIN-VALU',
+    'MIN-WIDTH-CHARS',
+    'MIN-WIDTH',
+    'MIN-WIDTH-',
+    'MIN-WIDTH-C',
+    'MIN-WIDTH-CH',
+    'MIN-WIDTH-CHA',
+    'MIN-WIDTH-CHAR',
+    'MIN-WIDTH-PIXELS',
+    'MIN-WIDTH-P',
+    'MIN-WIDTH-PI',
+    'MIN-WIDTH-PIX',
+    'MIN-WIDTH-PIXE',
+    'MIN-WIDTH-PIXEL',
+    'MODIFIED',
+    'MODULO',
+    'MOD',
+    'MODU',
+    'MODUL',
+    'MONTH',
+    'MOUSE',
+    'MOUSE-POINTER',
+    'MOUSE-P',
+    'MOUSE-PO',
+    'MOUSE-POI',
+    'MOUSE-POIN',
+    'MOUSE-POINT',
+    'MOUSE-POINTE',
+    'MOVABLE',
+    'MOVE-AFTER-TAB-ITEM',
+    'MOVE-AFTER',
+    'MOVE-AFTER-',
+    'MOVE-AFTER-T',
+    'MOVE-AFTER-TA',
+    'MOVE-AFTER-TAB',
+    'MOVE-AFTER-TAB-',
+    'MOVE-AFTER-TAB-I',
+    'MOVE-AFTER-TAB-IT',
+    'MOVE-AFTER-TAB-ITE',
+    'MOVE-BEFORE-TAB-ITEM',
+    'MOVE-BEFOR',
+    'MOVE-BEFORE',
+    'MOVE-BEFORE-',
+    'MOVE-BEFORE-T',
+    'MOVE-BEFORE-TA',
+    'MOVE-BEFORE-TAB',
+    'MOVE-BEFORE-TAB-',
+    'MOVE-BEFORE-TAB-I',
+    'MOVE-BEFORE-TAB-IT',
+    'MOVE-BEFORE-TAB-ITE',
+    'MOVE-COLUMN',
+    'MOVE-COL',
+    'MOVE-COLU',
+    'MOVE-COLUM',
+    'MOVE-TO-BOTTOM',
+    'MOVE-TO-B',
+    'MOVE-TO-BO',
+    'MOVE-TO-BOT',
+    'MOVE-TO-BOTT',
+    'MOVE-TO-BOTTO',
+    'MOVE-TO-EOF',
+    'MOVE-TO-TOP',
+    'MOVE-TO-T',
+    'MOVE-TO-TO',
+    'MPE',
+    'MULTI-COMPILE',
+    'MULTIPLE',
+    'MULTIPLE-KEY',
+    'MULTITASKING-INTERVAL',
+    'MUST-EXIST',
+    'NAME',
+    'NAMESPACE-PREFIX',
+    'NAMESPACE-URI',
+    'NATIVE',
+    'NE',
+    'NEEDS-APPSERVER-PROMPT',
+    'NEEDS-PROMPT',
+    'NEW',
+    'NEW-INSTANCE',
+    'NEW-ROW',
+    'NEXT',
+    'NEXT-COLUMN',
+    'NEXT-PROMPT',
+    'NEXT-ROWID',
+    'NEXT-SIBLING',
+    'NEXT-TAB-ITEM',
+    'NEXT-TAB-I',
+    'NEXT-TAB-IT',
+    'NEXT-TAB-ITE',
+    'NEXT-VALUE',
+    'NO',
+    'NO-APPLY',
+    'NO-ARRAY-MESSAGE',
+    'NO-ASSIGN',
+    'NO-ATTR-LIST',
+    'NO-ATTR',
+    'NO-ATTR-',
+    'NO-ATTR-L',
+    'NO-ATTR-LI',
+    'NO-ATTR-LIS',
+    'NO-ATTR-SPACE',
+    'NO-ATTR-S',
+    'NO-ATTR-SP',
+    'NO-ATTR-SPA',
+    'NO-ATTR-SPAC',
+    'NO-AUTO-VALIDATE',
+    'NO-BIND-WHERE',
+    'NO-BOX',
+    'NO-CONSOLE',
+    'NO-CONVERT',
+    'NO-CONVERT-3D-COLORS',
+    'NO-CURRENT-VALUE',
+    'NO-DEBUG',
+    'NODE-VALUE-TO-MEMPTR',
+    'NO-DRAG',
+    'NO-ECHO',
+    'NO-EMPTY-SPACE',
+    'NO-ERROR',
+    'NO-FILL',
+    'NO-F',
+    'NO-FI',
+    'NO-FIL',
+    'NO-FOCUS',
+    'NO-HELP',
+    'NO-HIDE',
+    'NO-INDEX-HINT',
+    'NO-INHERIT-BGCOLOR',
+    'NO-INHERIT-BGC',
+    'NO-INHERIT-BGCO',
+    'NO-INHERIT-FGCOLOR',
+    'NO-INHERIT-FGC',
+    'NO-INHERIT-FGCO',
+    'NO-INHERIT-FGCOL',
+    'NO-INHERIT-FGCOLO',
+    'NO-JOIN-BY-SQLDB',
+    'NO-LABELS',
+    'NO-LABE',
+    'NO-LOBS',
+    'NO-LOCK',
+    'NO-LOOKAHEAD',
+    'NO-MAP',
+    'NO-MESSAGE',
+    'NO-MES',
+    'NO-MESS',
+    'NO-MESSA',
+    'NO-MESSAG',
+    'NONAMESPACE-SCHEMA-LOCATION',
+    'NONE',
+    'NO-PAUSE',
+    'NO-PREFETCH',
+    'NO-PREFE',
+    'NO-PREFET',
+    'NO-PREFETC',
+    'NORMALIZE',
+    'NO-ROW-MARKERS',
+    'NO-SCROLLBAR-VERTICAL',
+    'NO-SEPARATE-CONNECTION',
+    'NO-SEPARATORS',
+    'NOT',
+    'NO-TAB-STOP',
+    'NOT-ACTIVE',
+    'NO-UNDERLINE',
+    'NO-UND',
+    'NO-UNDE',
+    'NO-UNDER',
+    'NO-UNDERL',
+    'NO-UNDERLI',
+    'NO-UNDERLIN',
+    'NO-UNDO',
+    'NO-VALIDATE',
+    'NO-VAL',
+    'NO-VALI',
+    'NO-VALID',
+    'NO-VALIDA',
+    'NO-VALIDAT',
+    'NOW',
+    'NO-WAIT',
+    'NO-WORD-WRAP',
+    'NULL',
+    'NUM-ALIASES',
+    'NUM-ALI',
+    'NUM-ALIA',
+    'NUM-ALIAS',
+    'NUM-ALIASE',
+    'NUM-BUFFERS',
+    'NUM-BUTTONS',
+    'NUM-BUT',
+    'NUM-BUTT',
+    'NUM-BUTTO',
+    'NUM-BUTTON',
+    'NUM-COLUMNS',
+    'NUM-COL',
+    'NUM-COLU',
+    'NUM-COLUM',
+    'NUM-COLUMN',
+    'NUM-COPIES',
+    'NUM-DBS',
+    'NUM-DROPPED-FILES',
+    'NUM-ENTRIES',
+    'NUMERIC',
+    'NUMERIC-FORMAT',
+    'NUMERIC-F',
+    'NUMERIC-FO',
+    'NUMERIC-FOR',
+    'NUMERIC-FORM',
+    'NUMERIC-FORMA',
+    'NUM-FIELDS',
+    'NUM-FORMATS',
+    'NUM-ITEMS',
+    'NUM-ITERATIONS',
+    'NUM-LINES',
+    'NUM-LOCKED-COLUMNS',
+    'NUM-LOCKED-COL',
+    'NUM-LOCKED-COLU',
+    'NUM-LOCKED-COLUM',
+    'NUM-LOCKED-COLUMN',
+    'NUM-MESSAGES',
+    'NUM-PARAMETERS',
+    'NUM-REFERENCES',
+    'NUM-REPLACED',
+    'NUM-RESULTS',
+    'NUM-SELECTED-ROWS',
+    'NUM-SELECTED-WIDGETS',
+    'NUM-SELECTED',
+    'NUM-SELECTED-',
+    'NUM-SELECTED-W',
+    'NUM-SELECTED-WI',
+    'NUM-SELECTED-WID',
+    'NUM-SELECTED-WIDG',
+    'NUM-SELECTED-WIDGE',
+    'NUM-SELECTED-WIDGET',
+    'NUM-TABS',
+    'NUM-TO-RETAIN',
+    'NUM-VISIBLE-COLUMNS',
+    'OCTET-LENGTH',
+    'OF',
+    'OFF',
+    'OK',
+    'OK-CANCEL',
+    'OLD',
+    'ON',
+    'ON-FRAME-BORDER',
+    'ON-FRAME',
+    'ON-FRAME-',
+    'ON-FRAME-B',
+    'ON-FRAME-BO',
+    'ON-FRAME-BOR',
+    'ON-FRAME-BORD',
+    'ON-FRAME-BORDE',
+    'OPEN',
+    'OPSYS',
+    'OPTION',
+    'OR',
+    'ORDERED-JOIN',
+    'ORDINAL',
+    'OS-APPEND',
+    'OS-COMMAND',
+    'OS-COPY',
+    'OS-CREATE-DIR',
+    'OS-DELETE',
+    'OS-DIR',
+    'OS-DRIVES',
+    'OS-DRIVE',
+    'OS-ERROR',
+    'OS-GETENV',
+    'OS-RENAME',
+    'OTHERWISE',
+    'OUTPUT',
+    'OVERLAY',
+    'OVERRIDE',
+    'OWNER',
+    'PAGE',
+    'PAGE-BOTTOM',
+    'PAGE-BOT',
+    'PAGE-BOTT',
+    'PAGE-BOTTO',
+    'PAGED',
+    'PAGE-NUMBER',
+    'PAGE-NUM',
+    'PAGE-NUMB',
+    'PAGE-NUMBE',
+    'PAGE-SIZE',
+    'PAGE-TOP',
+    'PAGE-WIDTH',
+    'PAGE-WID',
+    'PAGE-WIDT',
+    'PARAMETER',
+    'PARAM',
+    'PARAME',
+    'PARAMET',
+    'PARAMETE',
+    'PARENT',
+    'PARSE-STATUS',
+    'PARTIAL-KEY',
+    'PASCAL',
+    'PASSWORD-FIELD',
+    'PATHNAME',
+    'PAUSE',
+    'PBE-HASH-ALGORITHM',
+    'PBE-HASH-ALG',
+    'PBE-HASH-ALGO',
+    'PBE-HASH-ALGOR',
+    'PBE-HASH-ALGORI',
+    'PBE-HASH-ALGORIT',
+    'PBE-HASH-ALGORITH',
+    'PBE-KEY-ROUNDS',
+    'PDBNAME',
+    'PERSISTENT',
+    'PERSIST',
+    'PERSISTE',
+    'PERSISTEN',
+    'PERSISTENT-CACHE-DISABLED',
+    'PFCOLOR',
+    'PFC',
+    'PFCO',
+    'PFCOL',
+    'PFCOLO',
+    'PIXELS',
+    'PIXELS-PER-COLUMN',
+    'PIXELS-PER-COL',
+    'PIXELS-PER-COLU',
+    'PIXELS-PER-COLUM',
+    'PIXELS-PER-ROW',
+    'POPUP-MENU',
+    'POPUP-M',
+    'POPUP-ME',
+    'POPUP-MEN',
+    'POPUP-ONLY',
+    'POPUP-O',
+    'POPUP-ON',
+    'POPUP-ONL',
+    'PORTRAIT',
+    'POSITION',
+    'PRECISION',
+    'PREFER-DATASET',
+    'PREPARED',
+    'PREPARE-STRING',
+    'PREPROCESS',
+    'PREPROC',
+    'PREPROCE',
+    'PREPROCES',
+    'PRESELECT',
+    'PRESEL',
+    'PRESELE',
+    'PRESELEC',
+    'PREV',
+    'PREV-COLUMN',
+    'PREV-SIBLING',
+    'PREV-TAB-ITEM',
+    'PREV-TAB-I',
+    'PREV-TAB-IT',
+    'PREV-TAB-ITE',
+    'PRIMARY',
+    'PRINTER',
+    'PRINTER-CONTROL-HANDLE',
+    'PRINTER-HDC',
+    'PRINTER-NAME',
+    'PRINTER-PORT',
+    'PRINTER-SETUP',
+    'PRIVATE',
+    'PRIVATE-DATA',
+    'PRIVATE-D',
+    'PRIVATE-DA',
+    'PRIVATE-DAT',
+    'PRIVILEGES',
+    'PROCEDURE',
+    'PROCE',
+    'PROCED',
+    'PROCEDU',
+    'PROCEDUR',
+    'PROCEDURE-CALL-TYPE',
+    'PROCESS',
+    'PROC-HANDLE',
+    'PROC-HA',
+    'PROC-HAN',
+    'PROC-HAND',
+    'PROC-HANDL',
+    'PROC-STATUS',
+    'PROC-ST',
+    'PROC-STA',
+    'PROC-STAT',
+    'PROC-STATU',
+    'proc-text',
+    'proc-text-buffe',
+    'PROFILER',
+    'PROGRAM-NAME',
+    'PROGRESS',
+    'PROGRESS-SOURCE',
+    'PROGRESS-S',
+    'PROGRESS-SO',
+    'PROGRESS-SOU',
+    'PROGRESS-SOUR',
+    'PROGRESS-SOURC',
+    'PROMPT',
+    'PROMPT-FOR',
+    'PROMPT-F',
+    'PROMPT-FO',
+    'PROMSGS',
+    'PROPATH',
+    'PROPERTY',
+    'PROTECTED',
+    'PROVERSION',
+    'PROVERS',
+    'PROVERSI',
+    'PROVERSIO',
+    'PROXY',
+    'PROXY-PASSWORD',
+    'PROXY-USERID',
+    'PUBLIC',
+    'PUBLIC-ID',
+    'PUBLISH',
+    'PUBLISHED-EVENTS',
+    'PUT',
+    'PUTBYTE',
+    'PUT-BYTE',
+    'PUT-DOUBLE',
+    'PUT-FLOAT',
+    'PUT-INT64',
+    'PUT-KEY-VALUE',
+    'PUT-KEY-VAL',
+    'PUT-KEY-VALU',
+    'PUT-LONG',
+    'PUT-SHORT',
+    'PUT-STRING',
+    'PUT-UNSIGNED-LONG',
+    'QUERY',
+    'QUERY-CLOSE',
+    'QUERY-OFF-END',
+    'QUERY-OPEN',
+    'QUERY-PREPARE',
+    'QUERY-TUNING',
+    'QUESTION',
+    'QUIT',
+    'QUOTER',
+    'RADIO-BUTTONS',
+    'RADIO-SET',
+    'RANDOM',
+    'RAW-TRANSFER',
+    'RCODE-INFORMATION',
+    'RCODE-INFO',
+    'RCODE-INFOR',
+    'RCODE-INFORM',
+    'RCODE-INFORMA',
+    'RCODE-INFORMAT',
+    'RCODE-INFORMATI',
+    'RCODE-INFORMATIO',
+    'READ-AVAILABLE',
+    'READ-EXACT-NUM',
+    'READ-FILE',
+    'READKEY',
+    'READ-ONLY',
+    'READ-XML',
+    'READ-XMLSCHEMA',
+    'REAL',
+    'RECORD-LENGTH',
+    'RECTANGLE',
+    'RECT',
+    'RECTA',
+    'RECTAN',
+    'RECTANG',
+    'RECTANGL',
+    'RECURSIVE',
+    'REFERENCE-ONLY',
+    'REFRESH',
+    'REFRESHABLE',
+    'REFRESH-AUDIT-POLICY',
+    'REGISTER-DOMAIN',
+    'RELEASE',
+    'REMOTE',
+    'REMOVE-EVENTS-PROCEDURE',
+    'REMOVE-SUPER-PROCEDURE',
+    'REPEAT',
+    'REPLACE',
+    'REPLACE-SELECTION-TEXT',
+    'REPOSITION',
+    'REPOSITION-BACKWARD',
+    'REPOSITION-FORWARD',
+    'REPOSITION-MODE',
+    'REPOSITION-TO-ROW',
+    'REPOSITION-TO-ROWID',
+    'REQUEST',
+    'RESET',
+    'RESIZABLE',
+    'RESIZA',
+    'RESIZAB',
+    'RESIZABL',
+    'RESIZE',
+    'RESTART-ROW',
+    'RESTART-ROWID',
+    'RETAIN',
+    'RETAIN-SHAPE',
+    'RETRY',
+    'RETRY-CANCEL',
+    'RETURN',
+    'RETURN-INSERTED',
+    'RETURN-INS',
+    'RETURN-INSE',
+    'RETURN-INSER',
+    'RETURN-INSERT',
+    'RETURN-INSERTE',
+    'RETURNS',
+    'RETURN-TO-START-DIR',
+    'RETURN-TO-START-DI',
+    'RETURN-VALUE',
+    'RETURN-VAL',
+    'RETURN-VALU',
+    'RETURN-VALUE-DATA-TYPE',
+    'REVERSE-FROM',
+    'REVERT',
+    'REVOKE',
+    'RGB-VALUE',
+    'RIGHT-ALIGNED',
+    'RETURN-ALIGN',
+    'RETURN-ALIGNE',
+    'RIGHT-TRIM',
+    'R-INDEX',
+    'ROLES',
+    'ROUND',
+    'ROUTINE-LEVEL',
+    'ROW',
+    'ROW-HEIGHT-CHARS',
+    'ROW-HEIGHT-PIXELS',
+    'ROW-MARKERS',
+    'ROW-OF',
+    'ROW-RESIZABLE',
+    'RULE',
+    'RUN',
+    'RUN-PROCEDURE',
+    'SAVE',
+    'SAVE-AS',
+    'SAVE-FILE',
+    'SAX-COMPLETE',
+    'SAX-COMPLE',
+    'SAX-COMPLET',
+    'SAX-PARSE',
+    'SAX-PARSE-FIRST',
+    'SAX-PARSE-NEXT',
+    'SAX-PARSER-ERROR',
+    'SAX-RUNNING',
+    'SAX-UNINITIALIZED',
+    'SAX-WRITE-BEGIN',
+    'SAX-WRITE-COMPLETE',
+    'SAX-WRITE-CONTENT',
+    'SAX-WRITE-ELEMENT',
+    'SAX-WRITE-ERROR',
+    'SAX-WRITE-IDLE',
+    'SAX-WRITER',
+    'SAX-WRITE-TAG',
+    'SCHEMA',
+    'SCHEMA-LOCATION',
+    'SCHEMA-MARSHAL',
+    'SCHEMA-PATH',
+    'SCREEN',
+    'SCREEN-IO',
+    'SCREEN-LINES',
+    'SCREEN-VALUE',
+    'SCREEN-VAL',
+    'SCREEN-VALU',
+    'SCROLL',
+    'SCROLLABLE',
+    'SCROLLBAR-HORIZONTAL',
+    'SCROLLBAR-H',
+    'SCROLLBAR-HO',
+    'SCROLLBAR-HOR',
+    'SCROLLBAR-HORI',
+    'SCROLLBAR-HORIZ',
+    'SCROLLBAR-HORIZO',
+    'SCROLLBAR-HORIZON',
+    'SCROLLBAR-HORIZONT',
+    'SCROLLBAR-HORIZONTA',
+    'SCROLL-BARS',
+    'SCROLLBAR-VERTICAL',
+    'SCROLLBAR-V',
+    'SCROLLBAR-VE',
+    'SCROLLBAR-VER',
+    'SCROLLBAR-VERT',
+    'SCROLLBAR-VERTI',
+    'SCROLLBAR-VERTIC',
+    'SCROLLBAR-VERTICA',
+    'SCROLL-DELTA',
+    'SCROLLED-ROW-POSITION',
+    'SCROLLED-ROW-POS',
+    'SCROLLED-ROW-POSI',
+    'SCROLLED-ROW-POSIT',
+    'SCROLLED-ROW-POSITI',
+    'SCROLLED-ROW-POSITIO',
+    'SCROLLING',
+    'SCROLL-OFFSET',
+    'SCROLL-TO-CURRENT-ROW',
+    'SCROLL-TO-ITEM',
+    'SCROLL-TO-I',
+    'SCROLL-TO-IT',
+    'SCROLL-TO-ITE',
+    'SCROLL-TO-SELECTED-ROW',
+    'SDBNAME',
+    'SEAL',
+    'SEAL-TIMESTAMP',
+    'SEARCH',
+    'SEARCH-SELF',
+    'SEARCH-TARGET',
+    'SECTION',
+    'SECURITY-POLICY',
+    'SEEK',
+    'SELECT',
+    'SELECTABLE',
+    'SELECT-ALL',
+    'SELECTED',
+    'SELECT-FOCUSED-ROW',
+    'SELECTION',
+    'SELECTION-END',
+    'SELECTION-LIST',
+    'SELECTION-START',
+    'SELECTION-TEXT',
+    'SELECT-NEXT-ROW',
+    'SELECT-PREV-ROW',
+    'SELECT-ROW',
+    'SELF',
+    'SEND',
+    'send-sql-statement',
+    'send-sql',
+    'SENSITIVE',
+    'SEPARATE-CONNECTION',
+    'SEPARATOR-FGCOLOR',
+    'SEPARATORS',
+    'SERVER',
+    'SERVER-CONNECTION-BOUND',
+    'SERVER-CONNECTION-BOUND-REQUEST',
+    'SERVER-CONNECTION-CONTEXT',
+    'SERVER-CONNECTION-ID',
+    'SERVER-OPERATING-MODE',
+    'SESSION',
+    'SESSION-ID',
+    'SET',
+    'SET-APPL-CONTEXT',
+    'SET-ATTR-CALL-TYPE',
+    'SET-ATTRIBUTE-NODE',
+    'SET-BLUE-VALUE',
+    'SET-BLUE',
+    'SET-BLUE-',
+    'SET-BLUE-V',
+    'SET-BLUE-VA',
+    'SET-BLUE-VAL',
+    'SET-BLUE-VALU',
+    'SET-BREAK',
+    'SET-BUFFERS',
+    'SET-CALLBACK',
+    'SET-CLIENT',
+    'SET-COMMIT',
+    'SET-CONTENTS',
+    'SET-CURRENT-VALUE',
+    'SET-DB-CLIENT',
+    'SET-DYNAMIC',
+    'SET-EVENT-MANAGER-OPTION',
+    'SET-GREEN-VALUE',
+    'SET-GREEN',
+    'SET-GREEN-',
+    'SET-GREEN-V',
+    'SET-GREEN-VA',
+    'SET-GREEN-VAL',
+    'SET-GREEN-VALU',
+    'SET-INPUT-SOURCE',
+    'SET-OPTION',
+    'SET-OUTPUT-DESTINATION',
+    'SET-PARAMETER',
+    'SET-POINTER-VALUE',
+    'SET-PROPERTY',
+    'SET-RED-VALUE',
+    'SET-RED',
+    'SET-RED-',
+    'SET-RED-V',
+    'SET-RED-VA',
+    'SET-RED-VAL',
+    'SET-RED-VALU',
+    'SET-REPOSITIONED-ROW',
+    'SET-RGB-VALUE',
+    'SET-ROLLBACK',
+    'SET-SELECTION',
+    'SET-SIZE',
+    'SET-SORT-ARROW',
+    'SETUSERID',
+    'SETUSER',
+    'SETUSERI',
+    'SET-WAIT-STATE',
+    'SHA1-DIGEST',
+    'SHARED',
+    'SHARE-LOCK',
+    'SHARE',
+    'SHARE-',
+    'SHARE-L',
+    'SHARE-LO',
+    'SHARE-LOC',
+    'SHOW-IN-TASKBAR',
+    'SHOW-STATS',
+    'SHOW-STAT',
+    'SIDE-LABEL-HANDLE',
+    'SIDE-LABEL-H',
+    'SIDE-LABEL-HA',
+    'SIDE-LABEL-HAN',
+    'SIDE-LABEL-HAND',
+    'SIDE-LABEL-HANDL',
+    'SIDE-LABELS',
+    'SIDE-LAB',
+    'SIDE-LABE',
+    'SIDE-LABEL',
+    'SILENT',
+    'SIMPLE',
+    'SINGLE',
+    'SIZE',
+    'SIZE-CHARS',
+    'SIZE-C',
+    'SIZE-CH',
+    'SIZE-CHA',
+    'SIZE-CHAR',
+    'SIZE-PIXELS',
+    'SIZE-P',
+    'SIZE-PI',
+    'SIZE-PIX',
+    'SIZE-PIXE',
+    'SIZE-PIXEL',
+    'SKIP',
+    'SKIP-DELETED-RECORD',
+    'SLIDER',
+    'SMALL-ICON',
+    'SMALLINT',
+    'SMALL-TITLE',
+    'SOME',
+    'SORT',
+    'SORT-ASCENDING',
+    'SORT-NUMBER',
+    'SOURCE',
+    'SOURCE-PROCEDURE',
+    'SPACE',
+    'SQL',
+    'SQRT',
+    'SSL-SERVER-NAME',
+    'STANDALONE',
+    'START',
+    'START-DOCUMENT',
+    'START-ELEMENT',
+    'START-MOVE',
+    'START-RESIZE',
+    'START-ROW-RESIZE',
+    'STATE-DETAIL',
+    'STATIC',
+    'STATUS',
+    'STATUS-AREA',
+    'STATUS-AREA-FONT',
+    'STDCALL',
+    'STOP',
+    'STOP-PARSING',
+    'STOPPED',
+    'STOPPE',
+    'STORED-PROCEDURE',
+    'STORED-PROC',
+    'STORED-PROCE',
+    'STORED-PROCED',
+    'STORED-PROCEDU',
+    'STORED-PROCEDUR',
+    'STREAM',
+    'STREAM-HANDLE',
+    'STREAM-IO',
+    'STRETCH-TO-FIT',
+    'STRICT',
+    'STRING',
+    'STRING-VALUE',
+    'STRING-XREF',
+    'SUB-AVERAGE',
+    'SUB-AVE',
+    'SUB-AVER',
+    'SUB-AVERA',
+    'SUB-AVERAG',
+    'SUB-COUNT',
+    'SUB-MAXIMUM',
+    'SUM-MAX',
+    'SUM-MAXI',
+    'SUM-MAXIM',
+    'SUM-MAXIMU',
+    'SUB-MENU',
+    'SUBSUB-',
+    'SUB-MIN',
+    'SUBSCRIBE',
+    'SUBSTITUTE',
+    'SUBST',
+    'SUBSTI',
+    'SUBSTIT',
+    'SUBSTITU',
+    'SUBSTITUT',
+    'SUBSTRING',
+    'SUBSTR',
+    'SUBSTRI',
+    'SUBSTRIN',
+    'SUB-TOTAL',
+    'SUBTYPE',
+    'SUM',
+    'SUPER',
+    'SUPER-PROCEDURES',
+    'SUPPRESS-NAMESPACE-PROCESSING',
+    'SUPPRESS-WARNINGS',
+    'SUPPRESS-W',
+    'SUPPRESS-WA',
+    'SUPPRESS-WAR',
+    'SUPPRESS-WARN',
+    'SUPPRESS-WARNI',
+    'SUPPRESS-WARNIN',
+    'SUPPRESS-WARNING',
+    'SYMMETRIC-ENCRYPTION-ALGORITHM',
+    'SYMMETRIC-ENCRYPTION-IV',
+    'SYMMETRIC-ENCRYPTION-KEY',
+    'SYMMETRIC-SUPPORT',
+    'SYSTEM-ALERT-BOXES',
+    'SYSTEM-ALERT',
+    'SYSTEM-ALERT-',
+    'SYSTEM-ALERT-B',
+    'SYSTEM-ALERT-BO',
+    'SYSTEM-ALERT-BOX',
+    'SYSTEM-ALERT-BOXE',
+    'SYSTEM-DIALOG',
+    'SYSTEM-HELP',
+    'SYSTEM-ID',
+    'TABLE',
+    'TABLE-HANDLE',
+    'TABLE-NUMBER',
+    'TAB-POSITION',
+    'TAB-STOP',
+    'TARGET',
+    'TARGET-PROCEDURE',
+    'TEMP-DIRECTORY',
+    'TEMP-DIR',
+    'TEMP-DIRE',
+    'TEMP-DIREC',
+    'TEMP-DIRECT',
+    'TEMP-DIRECTO',
+    'TEMP-DIRECTOR',
+    'TEMP-TABLE',
+    'TEMP-TABLE-PREPARE',
+    'TERM',
+    'TERMINAL',
+    'TERMI',
+    'TERMIN',
+    'TERMINA',
+    'TERMINATE',
+    'TEXT',
+    'TEXT-CURSOR',
+    'TEXT-SEG-GROW',
+    'TEXT-SELECTED',
+    'THEN',
+    'THIS-OBJECT',
+    'THIS-PROCEDURE',
+    'THREE-D',
+    'THROW',
+    'THROUGH',
+    'THRU',
+    'TIC-MARKS',
+    'TIME',
+    'TIME-SOURCE',
+    'TITLE',
+    'TITLE-BGCOLOR',
+    'TITLE-BGC',
+    'TITLE-BGCO',
+    'TITLE-BGCOL',
+    'TITLE-BGCOLO',
+    'TITLE-DCOLOR',
+    'TITLE-DC',
+    'TITLE-DCO',
+    'TITLE-DCOL',
+    'TITLE-DCOLO',
+    'TITLE-FGCOLOR',
+    'TITLE-FGC',
+    'TITLE-FGCO',
+    'TITLE-FGCOL',
+    'TITLE-FGCOLO',
+    'TITLE-FONT',
+    'TITLE-FO',
+    'TITLE-FON',
+    'TO',
+    'TODAY',
+    'TOGGLE-BOX',
+    'TOOLTIP',
+    'TOOLTIPS',
+    'TOPIC',
+    'TOP-NAV-QUERY',
+    'TOP-ONLY',
+    'TO-ROWID',
+    'TOTAL',
+    'TRAILING',
+    'TRANS',
+    'TRANSACTION',
+    'TRANSACTION-MODE',
+    'TRANS-INIT-PROCEDURE',
+    'TRANSPARENT',
+    'TRIGGER',
+    'TRIGGERS',
+    'TRIM',
+    'TRUE',
+    'TRUNCATE',
+    'TRUNC',
+    'TRUNCA',
+    'TRUNCAT',
+    'TYPE',
+    'TYPE-OF',
+    'UNBOX',
+    'UNBUFFERED',
+    'UNBUFF',
+    'UNBUFFE',
+    'UNBUFFER',
+    'UNBUFFERE',
+    'UNDERLINE',
+    'UNDERL',
+    'UNDERLI',
+    'UNDERLIN',
+    'UNDO',
+    'UNFORMATTED',
+    'UNFORM',
+    'UNFORMA',
+    'UNFORMAT',
+    'UNFORMATT',
+    'UNFORMATTE',
+    'UNION',
+    'UNIQUE',
+    'UNIQUE-ID',
+    'UNIQUE-MATCH',
+    'UNIX',
+    'UNLESS-HIDDEN',
+    'UNLOAD',
+    'UNSIGNED-LONG',
+    'UNSUBSCRIBE',
+    'UP',
+    'UPDATE',
+    'UPDATE-ATTRIBUTE',
+    'URL',
+    'URL-DECODE',
+    'URL-ENCODE',
+    'URL-PASSWORD',
+    'URL-USERID',
+    'USE',
+    'USE-DICT-EXPS',
+    'USE-FILENAME',
+    'USE-INDEX',
+    'USER',
+    'USE-REVVIDEO',
+    'USERID',
+    'USER-ID',
+    'USE-TEXT',
+    'USE-UNDERLINE',
+    'USE-WIDGET-POOL',
+    'USING',
+    'V6DISPLAY',
+    'V6FRAME',
+    'VALIDATE',
+    'VALIDATE-EXPRESSION',
+    'VALIDATE-MESSAGE',
+    'VALIDATE-SEAL',
+    'VALIDATION-ENABLED',
+    'VALID-EVENT',
+    'VALID-HANDLE',
+    'VALID-OBJECT',
+    'VALUE',
+    'VALUE-CHANGED',
+    'VALUES',
+    'VARIABLE',
+    'VAR',
+    'VARI',
+    'VARIA',
+    'VARIAB',
+    'VARIABL',
+    'VERBOSE',
+    'VERSION',
+    'VERTICAL',
+    'VERT',
+    'VERTI',
+    'VERTIC',
+    'VERTICA',
+    'VIEW',
+    'VIEW-AS',
+    'VIEW-FIRST-COLUMN-ON-REOPEN',
+    'VIRTUAL-HEIGHT-CHARS',
+    'VIRTUAL-HEIGHT',
+    'VIRTUAL-HEIGHT-',
+    'VIRTUAL-HEIGHT-C',
+    'VIRTUAL-HEIGHT-CH',
+    'VIRTUAL-HEIGHT-CHA',
+    'VIRTUAL-HEIGHT-CHAR',
+    'VIRTUAL-HEIGHT-PIXELS',
+    'VIRTUAL-HEIGHT-P',
+    'VIRTUAL-HEIGHT-PI',
+    'VIRTUAL-HEIGHT-PIX',
+    'VIRTUAL-HEIGHT-PIXE',
+    'VIRTUAL-HEIGHT-PIXEL',
+    'VIRTUAL-WIDTH-CHARS',
+    'VIRTUAL-WIDTH',
+    'VIRTUAL-WIDTH-',
+    'VIRTUAL-WIDTH-C',
+    'VIRTUAL-WIDTH-CH',
+    'VIRTUAL-WIDTH-CHA',
+    'VIRTUAL-WIDTH-CHAR',
+    'VIRTUAL-WIDTH-PIXELS',
+    'VIRTUAL-WIDTH-P',
+    'VIRTUAL-WIDTH-PI',
+    'VIRTUAL-WIDTH-PIX',
+    'VIRTUAL-WIDTH-PIXE',
+    'VIRTUAL-WIDTH-PIXEL',
+    'VISIBLE',
+    'VOID',
+    'WAIT',
+    'WAIT-FOR',
+    'WARNING',
+    'WEB-CONTEXT',
+    'WEEKDAY',
+    'WHEN',
+    'WHERE',
+    'WHILE',
+    'WIDGET',
+    'WIDGET-ENTER',
+    'WIDGET-E',
+    'WIDGET-EN',
+    'WIDGET-ENT',
+    'WIDGET-ENTE',
+    'WIDGET-ID',
+    'WIDGET-LEAVE',
+    'WIDGET-L',
+    'WIDGET-LE',
+    'WIDGET-LEA',
+    'WIDGET-LEAV',
+    'WIDGET-POOL',
+    'WIDTH-CHARS',
+    'WIDTH',
+    'WIDTH-',
+    'WIDTH-C',
+    'WIDTH-CH',
+    'WIDTH-CHA',
+    'WIDTH-CHAR',
+    'WIDTH-PIXELS',
+    'WIDTH-P',
+    'WIDTH-PI',
+    'WIDTH-PIX',
+    'WIDTH-PIXE',
+    'WIDTH-PIXEL',
+    'WINDOW',
+    'WINDOW-MAXIMIZED',
+    'WINDOW-MAXIM',
+    'WINDOW-MAXIMI',
+    'WINDOW-MAXIMIZ',
+    'WINDOW-MAXIMIZE',
+    'WINDOW-MINIMIZED',
+    'WINDOW-MINIM',
+    'WINDOW-MINIMI',
+    'WINDOW-MINIMIZ',
+    'WINDOW-MINIMIZE',
+    'WINDOW-NAME',
+    'WINDOW-NORMAL',
+    'WINDOW-STATE',
+    'WINDOW-STA',
+    'WINDOW-STAT',
+    'WINDOW-SYSTEM',
+    'WITH',
+    'WORD-INDEX',
+    'WORD-WRAP',
+    'WORK-AREA-HEIGHT-PIXELS',
+    'WORK-AREA-WIDTH-PIXELS',
+    'WORK-AREA-X',
+    'WORK-AREA-Y',
+    'WORKFILE',
+    'WORK-TABLE',
+    'WORK-TAB',
+    'WORK-TABL',
+    'WRITE',
+    'WRITE-CDATA',
+    'WRITE-CHARACTERS',
+    'WRITE-COMMENT',
+    'WRITE-DATA-ELEMENT',
+    'WRITE-EMPTY-ELEMENT',
+    'WRITE-ENTITY-REF',
+    'WRITE-EXTERNAL-DTD',
+    'WRITE-FRAGMENT',
+    'WRITE-MESSAGE',
+    'WRITE-PROCESSING-INSTRUCTION',
+    'WRITE-STATUS',
+    'WRITE-XML',
+    'WRITE-XMLSCHEMA',
+    'X',
+    'XCODE',
+    'XML-DATA-TYPE',
+    'XML-NODE-TYPE',
+    'XML-SCHEMA-PATH',
+    'XML-SUPPRESS-NAMESPACE-PROCESSING',
+    'X-OF',
+    'XREF',
+    'XREF-XML',
+    'Y',
+    'YEAR',
+    'YEAR-OFFSET',
+    'YES',
+    'YES-NO',
+    'YES-NO-CANCEL',
+    'Y-OF'
+)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/grammar_notation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/grammar_notation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/grammar_notation.py	(revision 1126)
@@ -0,0 +1,213 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.grammar_notation
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for grammer notations like BNF.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, include, this, using, words
+from pygments.token import Comment, Keyword, Literal, Name, Number, \
+    Operator, Punctuation, String, Text
+
+__all__ = ['BnfLexer', 'AbnfLexer', 'JsgfLexer']
+
+
+class BnfLexer(RegexLexer):
+    """
+    This lexer is for grammer notations which are similar to
+    original BNF.
+
+    In order to maximize a number of targets of this lexer,
+    let's decide some designs:
+
+    * We don't distinguish `Terminal Symbol`.
+
+    * We do assume that `NonTerminal Symbol` are always enclosed
+      with arrow brackets.
+
+    * We do assume that `NonTerminal Symbol` may include
+      any printable characters except arrow brackets and ASCII 0x20.
+      This assumption is for `RBNF <http://www.rfc-base.org/txt/rfc-5511.txt>`_.
+
+    * We do assume that target notation doesn't support comment.
+
+    * We don't distinguish any operators and punctuation except
+      `::=`.
+
+    Though these desision making might cause too minimal highlighting
+    and you might be disappointed, but it is reasonable for us.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'BNF'
+    aliases = ['bnf']
+    filenames = ['*.bnf']
+    mimetypes = ['text/x-bnf']
+
+    tokens = {
+        'root': [
+            (r'(<)([ -;=?-~]+)(>)',
+             bygroups(Punctuation, Name.Class, Punctuation)),
+
+            # an only operator
+            (r'::=', Operator),
+
+            # fallback
+            (r'[^<>:]+', Text),  # for performance
+            (r'.', Text),
+        ],
+    }
+
+
+class AbnfLexer(RegexLexer):
+    """
+    Lexer for `IETF 7405 ABNF
+    <http://www.ietf.org/rfc/rfc7405.txt>`_
+    (Updates `5234 <http://www.ietf.org/rfc/rfc5234.txt>`_)
+    grammars.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'ABNF'
+    aliases = ['abnf']
+    filenames = ['*.abnf']
+    mimetypes = ['text/x-abnf']
+
+    _core_rules = (
+        'ALPHA', 'BIT', 'CHAR', 'CR', 'CRLF', 'CTL', 'DIGIT',
+        'DQUOTE', 'HEXDIG', 'HTAB', 'LF', 'LWSP', 'OCTET',
+        'SP', 'VCHAR', 'WSP')
+
+    tokens = {
+        'root': [
+            # comment
+            (r';.*$', Comment.Single),
+
+            # quoted
+            #   double quote itself in this state, it is as '%x22'.
+            (r'(%[si])?"[^"]*"', Literal),
+
+            # binary (but i have never seen...)
+            (r'%b[01]+\-[01]+\b', Literal),  # range
+            (r'%b[01]+(\.[01]+)*\b', Literal),  # concat
+
+            # decimal
+            (r'%d[0-9]+\-[0-9]+\b', Literal),  # range
+            (r'%d[0-9]+(\.[0-9]+)*\b', Literal),  # concat
+
+            # hexadecimal
+            (r'%x[0-9a-fA-F]+\-[0-9a-fA-F]+\b', Literal),  # range
+            (r'%x[0-9a-fA-F]+(\.[0-9a-fA-F]+)*\b', Literal),  # concat
+
+            # repetition (<a>*<b>element) including nRule
+            (r'\b[0-9]+\*[0-9]+', Operator),
+            (r'\b[0-9]+\*', Operator),
+            (r'\b[0-9]+', Operator),
+            (r'\*', Operator),
+
+            # Strictly speaking, these are not keyword but
+            # are called `Core Rule'.
+            (words(_core_rules, suffix=r'\b'), Keyword),
+
+            # nonterminals (ALPHA *(ALPHA / DIGIT / "-"))
+            (r'[a-zA-Z][a-zA-Z0-9-]+\b', Name.Class),
+
+            # operators
+            (r'(=/|=|/)', Operator),
+
+            # punctuation
+            (r'[\[\]()]', Punctuation),
+
+            # fallback
+            (r'\s+', Text),
+            (r'.', Text),
+        ],
+    }
+
+
+class JsgfLexer(RegexLexer):
+    """
+    For `JSpeech Grammar Format <https://www.w3.org/TR/jsgf/>`_
+    grammars.
+
+    .. versionadded:: 2.2
+    """
+    name = 'JSGF'
+    aliases = ['jsgf']
+    filenames = ['*.jsgf']
+    mimetypes = ['application/jsgf', 'application/x-jsgf', 'text/jsgf']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('non-comments'),
+        ],
+        'comments': [
+            (r'/\*\*(?!/)', Comment.Multiline, 'documentation comment'),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'//.*', Comment.Single),
+        ],
+        'non-comments': [
+            ('\A#JSGF[^;]*', Comment.Preproc),
+            (r'\s+', Text),
+            (r';', Punctuation),
+            (r'[=|()\[\]*+]', Operator),
+            (r'/[^/]+/', Number.Float),
+            (r'"', String.Double, 'string'),
+            (r'\{', String.Other, 'tag'),
+            (words(('import', 'public'), suffix=r'\b'), Keyword.Reserved),
+            (r'grammar\b', Keyword.Reserved, 'grammar name'),
+            (r'(<)(NULL|VOID)(>)',
+             bygroups(Punctuation, Name.Builtin, Punctuation)),
+            (r'<', Punctuation, 'rulename'),
+            (r'\w+|[^\s;=|()\[\]*+/"{<\w]+', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Escape),
+            (r'[^\\"]+', String.Double),
+        ],
+        'tag': [
+            (r'\}', String.Other, '#pop'),
+            (r'\\.', String.Escape),
+            (r'[^\\}]+', String.Other),
+        ],
+        'grammar name': [
+            (r';', Punctuation, '#pop'),
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[^;\s.]+', Name.Namespace),
+        ],
+        'rulename': [
+            (r'>', Punctuation, '#pop'),
+            (r'\*', Punctuation),
+            (r'\s+', Text),
+            (r'([^.>]+)(\s*)(\.)', bygroups(Name.Namespace, Text, Punctuation)),
+            (r'[^.>]+', Name.Constant),
+        ],
+        'documentation comment': [
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'(^\s*\*?\s*)(@(?:example|see)\s+)'
+             r'([\w\W]*?(?=(?:^\s*\*?\s*@|\*/)))',
+             bygroups(Comment.Multiline, Comment.Special,
+                      using(this, state='example'))),
+            (r'(^\s*\*?\s*)(@\S*)',
+             bygroups(Comment.Multiline, Comment.Special)),
+            (r'[^*\n@]+|\w|\W', Comment.Multiline),
+        ],
+        'example': [
+            (r'\n\s*\*', Comment.Multiline),
+            include('non-comments'),
+            (r'.', Comment.Multiline),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/robotframework.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/robotframework.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/robotframework.py	(revision 1126)
@@ -0,0 +1,560 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.robotframework
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Robot Framework.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+#  Copyright 2012 Nokia Siemens Networks Oyj
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+import re
+
+from pygments.lexer import Lexer
+from pygments.token import Token
+from pygments.util import text_type
+
+__all__ = ['RobotFrameworkLexer']
+
+
+HEADING = Token.Generic.Heading
+SETTING = Token.Keyword.Namespace
+IMPORT = Token.Name.Namespace
+TC_KW_NAME = Token.Generic.Subheading
+KEYWORD = Token.Name.Function
+ARGUMENT = Token.String
+VARIABLE = Token.Name.Variable
+COMMENT = Token.Comment
+SEPARATOR = Token.Punctuation
+SYNTAX = Token.Punctuation
+GHERKIN = Token.Generic.Emph
+ERROR = Token.Error
+
+
+def normalize(string, remove=''):
+    string = string.lower()
+    for char in remove + ' ':
+        if char in string:
+            string = string.replace(char, '')
+    return string
+
+
+class RobotFrameworkLexer(Lexer):
+    """
+    For `Robot Framework <http://robotframework.org>`_ test data.
+
+    Supports both space and pipe separated plain text formats.
+
+    .. versionadded:: 1.6
+    """
+    name = 'RobotFramework'
+    aliases = ['robotframework']
+    filenames = ['*.txt', '*.robot']
+    mimetypes = ['text/x-robotframework']
+
+    def __init__(self, **options):
+        options['tabsize'] = 2
+        options['encoding'] = 'UTF-8'
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        row_tokenizer = RowTokenizer()
+        var_tokenizer = VariableTokenizer()
+        index = 0
+        for row in text.splitlines():
+            for value, token in row_tokenizer.tokenize(row):
+                for value, token in var_tokenizer.tokenize(value, token):
+                    if value:
+                        yield index, token, text_type(value)
+                        index += len(value)
+
+
+class VariableTokenizer(object):
+
+    def tokenize(self, string, token):
+        var = VariableSplitter(string, identifiers='$@%&')
+        if var.start < 0 or token in (COMMENT, ERROR):
+            yield string, token
+            return
+        for value, token in self._tokenize(var, string, token):
+            if value:
+                yield value, token
+
+    def _tokenize(self, var, string, orig_token):
+        before = string[:var.start]
+        yield before, orig_token
+        yield var.identifier + '{', SYNTAX
+        for value, token in self.tokenize(var.base, VARIABLE):
+            yield value, token
+        yield '}', SYNTAX
+        if var.index:
+            yield '[', SYNTAX
+            for value, token in self.tokenize(var.index, VARIABLE):
+                yield value, token
+            yield ']', SYNTAX
+        for value, token in self.tokenize(string[var.end:], orig_token):
+            yield value, token
+
+
+class RowTokenizer(object):
+
+    def __init__(self):
+        self._table = UnknownTable()
+        self._splitter = RowSplitter()
+        testcases = TestCaseTable()
+        settings = SettingTable(testcases.set_default_template)
+        variables = VariableTable()
+        keywords = KeywordTable()
+        self._tables = {'settings': settings, 'setting': settings,
+                        'metadata': settings,
+                        'variables': variables, 'variable': variables,
+                        'testcases': testcases, 'testcase': testcases,
+                        'keywords': keywords, 'keyword': keywords,
+                        'userkeywords': keywords, 'userkeyword': keywords}
+
+    def tokenize(self, row):
+        commented = False
+        heading = False
+        for index, value in enumerate(self._splitter.split(row)):
+            # First value, and every second after that, is a separator.
+            index, separator = divmod(index-1, 2)
+            if value.startswith('#'):
+                commented = True
+            elif index == 0 and value.startswith('*'):
+                self._table = self._start_table(value)
+                heading = True
+            for value, token in self._tokenize(value, index, commented,
+                                               separator, heading):
+                yield value, token
+        self._table.end_row()
+
+    def _start_table(self, header):
+        name = normalize(header, remove='*')
+        return self._tables.get(name, UnknownTable())
+
+    def _tokenize(self, value, index, commented, separator, heading):
+        if commented:
+            yield value, COMMENT
+        elif separator:
+            yield value, SEPARATOR
+        elif heading:
+            yield value, HEADING
+        else:
+            for value, token in self._table.tokenize(value, index):
+                yield value, token
+
+
+class RowSplitter(object):
+    _space_splitter = re.compile('( {2,})')
+    _pipe_splitter = re.compile('((?:^| +)\|(?: +|$))')
+
+    def split(self, row):
+        splitter = (row.startswith('| ') and self._split_from_pipes
+                    or self._split_from_spaces)
+        for value in splitter(row):
+            yield value
+        yield '\n'
+
+    def _split_from_spaces(self, row):
+        yield ''  # Start with (pseudo)separator similarly as with pipes
+        for value in self._space_splitter.split(row):
+            yield value
+
+    def _split_from_pipes(self, row):
+        _, separator, rest = self._pipe_splitter.split(row, 1)
+        yield separator
+        while self._pipe_splitter.search(rest):
+            cell, separator, rest = self._pipe_splitter.split(rest, 1)
+            yield cell
+            yield separator
+        yield rest
+
+
+class Tokenizer(object):
+    _tokens = None
+
+    def __init__(self):
+        self._index = 0
+
+    def tokenize(self, value):
+        values_and_tokens = self._tokenize(value, self._index)
+        self._index += 1
+        if isinstance(values_and_tokens, type(Token)):
+            values_and_tokens = [(value, values_and_tokens)]
+        return values_and_tokens
+
+    def _tokenize(self, value, index):
+        index = min(index, len(self._tokens) - 1)
+        return self._tokens[index]
+
+    def _is_assign(self, value):
+        if value.endswith('='):
+            value = value[:-1].strip()
+        var = VariableSplitter(value, identifiers='$@&')
+        return var.start == 0 and var.end == len(value)
+
+
+class Comment(Tokenizer):
+    _tokens = (COMMENT,)
+
+
+class Setting(Tokenizer):
+    _tokens = (SETTING, ARGUMENT)
+    _keyword_settings = ('suitesetup', 'suiteprecondition', 'suiteteardown',
+                         'suitepostcondition', 'testsetup', 'testprecondition',
+                         'testteardown', 'testpostcondition', 'testtemplate')
+    _import_settings = ('library', 'resource', 'variables')
+    _other_settings = ('documentation', 'metadata', 'forcetags', 'defaulttags',
+                       'testtimeout')
+    _custom_tokenizer = None
+
+    def __init__(self, template_setter=None):
+        Tokenizer.__init__(self)
+        self._template_setter = template_setter
+
+    def _tokenize(self, value, index):
+        if index == 1 and self._template_setter:
+            self._template_setter(value)
+        if index == 0:
+            normalized = normalize(value)
+            if normalized in self._keyword_settings:
+                self._custom_tokenizer = KeywordCall(support_assign=False)
+            elif normalized in self._import_settings:
+                self._custom_tokenizer = ImportSetting()
+            elif normalized not in self._other_settings:
+                return ERROR
+        elif self._custom_tokenizer:
+            return self._custom_tokenizer.tokenize(value)
+        return Tokenizer._tokenize(self, value, index)
+
+
+class ImportSetting(Tokenizer):
+    _tokens = (IMPORT, ARGUMENT)
+
+
+class TestCaseSetting(Setting):
+    _keyword_settings = ('setup', 'precondition', 'teardown', 'postcondition',
+                         'template')
+    _import_settings = ()
+    _other_settings = ('documentation', 'tags', 'timeout')
+
+    def _tokenize(self, value, index):
+        if index == 0:
+            type = Setting._tokenize(self, value[1:-1], index)
+            return [('[', SYNTAX), (value[1:-1], type), (']', SYNTAX)]
+        return Setting._tokenize(self, value, index)
+
+
+class KeywordSetting(TestCaseSetting):
+    _keyword_settings = ('teardown',)
+    _other_settings = ('documentation', 'arguments', 'return', 'timeout', 'tags')
+
+
+class Variable(Tokenizer):
+    _tokens = (SYNTAX, ARGUMENT)
+
+    def _tokenize(self, value, index):
+        if index == 0 and not self._is_assign(value):
+            return ERROR
+        return Tokenizer._tokenize(self, value, index)
+
+
+class KeywordCall(Tokenizer):
+    _tokens = (KEYWORD, ARGUMENT)
+
+    def __init__(self, support_assign=True):
+        Tokenizer.__init__(self)
+        self._keyword_found = not support_assign
+        self._assigns = 0
+
+    def _tokenize(self, value, index):
+        if not self._keyword_found and self._is_assign(value):
+            self._assigns += 1
+            return SYNTAX  # VariableTokenizer tokenizes this later.
+        if self._keyword_found:
+            return Tokenizer._tokenize(self, value, index - self._assigns)
+        self._keyword_found = True
+        return GherkinTokenizer().tokenize(value, KEYWORD)
+
+
+class GherkinTokenizer(object):
+    _gherkin_prefix = re.compile('^(Given|When|Then|And) ', re.IGNORECASE)
+
+    def tokenize(self, value, token):
+        match = self._gherkin_prefix.match(value)
+        if not match:
+            return [(value, token)]
+        end = match.end()
+        return [(value[:end], GHERKIN), (value[end:], token)]
+
+
+class TemplatedKeywordCall(Tokenizer):
+    _tokens = (ARGUMENT,)
+
+
+class ForLoop(Tokenizer):
+
+    def __init__(self):
+        Tokenizer.__init__(self)
+        self._in_arguments = False
+
+    def _tokenize(self, value, index):
+        token = self._in_arguments and ARGUMENT or SYNTAX
+        if value.upper() in ('IN', 'IN RANGE'):
+            self._in_arguments = True
+        return token
+
+
+class _Table(object):
+    _tokenizer_class = None
+
+    def __init__(self, prev_tokenizer=None):
+        self._tokenizer = self._tokenizer_class()
+        self._prev_tokenizer = prev_tokenizer
+        self._prev_values_on_row = []
+
+    def tokenize(self, value, index):
+        if self._continues(value, index):
+            self._tokenizer = self._prev_tokenizer
+            yield value, SYNTAX
+        else:
+            for value_and_token in self._tokenize(value, index):
+                yield value_and_token
+        self._prev_values_on_row.append(value)
+
+    def _continues(self, value, index):
+        return value == '...' and all(self._is_empty(t)
+                                      for t in self._prev_values_on_row)
+
+    def _is_empty(self, value):
+        return value in ('', '\\')
+
+    def _tokenize(self, value, index):
+        return self._tokenizer.tokenize(value)
+
+    def end_row(self):
+        self.__init__(prev_tokenizer=self._tokenizer)
+
+
+class UnknownTable(_Table):
+    _tokenizer_class = Comment
+
+    def _continues(self, value, index):
+        return False
+
+
+class VariableTable(_Table):
+    _tokenizer_class = Variable
+
+
+class SettingTable(_Table):
+    _tokenizer_class = Setting
+
+    def __init__(self, template_setter, prev_tokenizer=None):
+        _Table.__init__(self, prev_tokenizer)
+        self._template_setter = template_setter
+
+    def _tokenize(self, value, index):
+        if index == 0 and normalize(value) == 'testtemplate':
+            self._tokenizer = Setting(self._template_setter)
+        return _Table._tokenize(self, value, index)
+
+    def end_row(self):
+        self.__init__(self._template_setter, prev_tokenizer=self._tokenizer)
+
+
+class TestCaseTable(_Table):
+    _setting_class = TestCaseSetting
+    _test_template = None
+    _default_template = None
+
+    @property
+    def _tokenizer_class(self):
+        if self._test_template or (self._default_template and
+                                   self._test_template is not False):
+            return TemplatedKeywordCall
+        return KeywordCall
+
+    def _continues(self, value, index):
+        return index > 0 and _Table._continues(self, value, index)
+
+    def _tokenize(self, value, index):
+        if index == 0:
+            if value:
+                self._test_template = None
+            return GherkinTokenizer().tokenize(value, TC_KW_NAME)
+        if index == 1 and self._is_setting(value):
+            if self._is_template(value):
+                self._test_template = False
+                self._tokenizer = self._setting_class(self.set_test_template)
+            else:
+                self._tokenizer = self._setting_class()
+        if index == 1 and self._is_for_loop(value):
+            self._tokenizer = ForLoop()
+        if index == 1 and self._is_empty(value):
+            return [(value, SYNTAX)]
+        return _Table._tokenize(self, value, index)
+
+    def _is_setting(self, value):
+        return value.startswith('[') and value.endswith(']')
+
+    def _is_template(self, value):
+        return normalize(value) == '[template]'
+
+    def _is_for_loop(self, value):
+        return value.startswith(':') and normalize(value, remove=':') == 'for'
+
+    def set_test_template(self, template):
+        self._test_template = self._is_template_set(template)
+
+    def set_default_template(self, template):
+        self._default_template = self._is_template_set(template)
+
+    def _is_template_set(self, template):
+        return normalize(template) not in ('', '\\', 'none', '${empty}')
+
+
+class KeywordTable(TestCaseTable):
+    _tokenizer_class = KeywordCall
+    _setting_class = KeywordSetting
+
+    def _is_template(self, value):
+        return False
+
+
+# Following code copied directly from Robot Framework 2.7.5.
+
+class VariableSplitter:
+
+    def __init__(self, string, identifiers):
+        self.identifier = None
+        self.base = None
+        self.index = None
+        self.start = -1
+        self.end = -1
+        self._identifiers = identifiers
+        self._may_have_internal_variables = False
+        try:
+            self._split(string)
+        except ValueError:
+            pass
+        else:
+            self._finalize()
+
+    def get_replaced_base(self, variables):
+        if self._may_have_internal_variables:
+            return variables.replace_string(self.base)
+        return self.base
+
+    def _finalize(self):
+        self.identifier = self._variable_chars[0]
+        self.base = ''.join(self._variable_chars[2:-1])
+        self.end = self.start + len(self._variable_chars)
+        if self._has_list_or_dict_variable_index():
+            self.index = ''.join(self._list_and_dict_variable_index_chars[1:-1])
+            self.end += len(self._list_and_dict_variable_index_chars)
+
+    def _has_list_or_dict_variable_index(self):
+        return self._list_and_dict_variable_index_chars\
+        and self._list_and_dict_variable_index_chars[-1] == ']'
+
+    def _split(self, string):
+        start_index, max_index = self._find_variable(string)
+        self.start = start_index
+        self._open_curly = 1
+        self._state = self._variable_state
+        self._variable_chars = [string[start_index], '{']
+        self._list_and_dict_variable_index_chars = []
+        self._string = string
+        start_index += 2
+        for index, char in enumerate(string[start_index:]):
+            index += start_index  # Giving start to enumerate only in Py 2.6+
+            try:
+                self._state(char, index)
+            except StopIteration:
+                return
+            if index  == max_index and not self._scanning_list_variable_index():
+                return
+
+    def _scanning_list_variable_index(self):
+        return self._state in [self._waiting_list_variable_index_state,
+                               self._list_variable_index_state]
+
+    def _find_variable(self, string):
+        max_end_index = string.rfind('}')
+        if max_end_index == -1:
+            raise ValueError('No variable end found')
+        if self._is_escaped(string, max_end_index):
+            return self._find_variable(string[:max_end_index])
+        start_index = self._find_start_index(string, 1, max_end_index)
+        if start_index == -1:
+            raise ValueError('No variable start found')
+        return start_index, max_end_index
+
+    def _find_start_index(self, string, start, end):
+        index = string.find('{', start, end) - 1
+        if index < 0:
+            return -1
+        if self._start_index_is_ok(string, index):
+            return index
+        return self._find_start_index(string, index+2, end)
+
+    def _start_index_is_ok(self, string, index):
+        return string[index] in self._identifiers\
+        and not self._is_escaped(string, index)
+
+    def _is_escaped(self, string, index):
+        escaped = False
+        while index > 0 and string[index-1] == '\\':
+            index -= 1
+            escaped = not escaped
+        return escaped
+
+    def _variable_state(self, char, index):
+        self._variable_chars.append(char)
+        if char == '}' and not self._is_escaped(self._string, index):
+            self._open_curly -= 1
+            if self._open_curly == 0:
+                if not self._is_list_or_dict_variable():
+                    raise StopIteration
+                self._state = self._waiting_list_variable_index_state
+        elif char in self._identifiers:
+            self._state = self._internal_variable_start_state
+
+    def _is_list_or_dict_variable(self):
+        return self._variable_chars[0] in ('@','&')
+
+    def _internal_variable_start_state(self, char, index):
+        self._state = self._variable_state
+        if char == '{':
+            self._variable_chars.append(char)
+            self._open_curly += 1
+            self._may_have_internal_variables = True
+        else:
+            self._variable_state(char, index)
+
+    def _waiting_list_variable_index_state(self, char, index):
+        if char != '[':
+            raise StopIteration
+        self._list_and_dict_variable_index_chars.append(char)
+        self._state = self._list_variable_index_state
+
+    def _list_variable_index_state(self, char, index):
+        self._list_and_dict_variable_index_chars.append(char)
+        if char == ']':
+            raise StopIteration
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ecl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ecl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/ecl.py	(revision 1126)
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.ecl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the ECL language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['ECLLexer']
+
+
+class ECLLexer(RegexLexer):
+    """
+    Lexer for the declarative big-data `ECL
+    <http://hpccsystems.com/community/docs/ecl-language-reference/html>`_
+    language.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'ECL'
+    aliases = ['ecl']
+    filenames = ['*.ecl']
+    mimetypes = ['application/x-ecl']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('statements'),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+            (r'\/\/.*', Comment.Single),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
+        ],
+        'statements': [
+            include('types'),
+            include('keywords'),
+            include('functions'),
+            include('hash'),
+            (r'"', String, 'string'),
+            (r'\'', String, 'string'),
+            (r'(\d+\.\d*|\.\d+|\d+)e[+-]?\d+[lu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+f)f?', Number.Float),
+            (r'0x[0-9a-f]+[lu]*', Number.Hex),
+            (r'0[0-7]+[lu]*', Number.Oct),
+            (r'\d+[lu]*', Number.Integer),
+            (r'\*/', Error),
+            (r'[~!%^&*+=|?:<>/-]+', Operator),
+            (r'[{}()\[\],.;]', Punctuation),
+            (r'[a-z_]\w*', Name),
+        ],
+        'hash': [
+            (r'^#.*$', Comment.Preproc),
+        ],
+        'types': [
+            (r'(RECORD|END)\D', Keyword.Declaration),
+            (r'((?:ASCII|BIG_ENDIAN|BOOLEAN|DATA|DECIMAL|EBCDIC|INTEGER|PATTERN|'
+             r'QSTRING|REAL|RECORD|RULE|SET OF|STRING|TOKEN|UDECIMAL|UNICODE|'
+             r'UNSIGNED|VARSTRING|VARUNICODE)\d*)(\s+)',
+             bygroups(Keyword.Type, Text)),
+        ],
+        'keywords': [
+            (words((
+                'APPLY', 'ASSERT', 'BUILD', 'BUILDINDEX', 'EVALUATE', 'FAIL',
+                'KEYDIFF', 'KEYPATCH', 'LOADXML', 'NOTHOR', 'NOTIFY', 'OUTPUT',
+                'PARALLEL', 'SEQUENTIAL', 'SOAPCALL', 'CHECKPOINT', 'DEPRECATED',
+                'FAILCODE', 'FAILMESSAGE', 'FAILURE', 'GLOBAL', 'INDEPENDENT',
+                'ONWARNING', 'PERSIST', 'PRIORITY', 'RECOVERY', 'STORED', 'SUCCESS',
+                'WAIT', 'WHEN'), suffix=r'\b'),
+             Keyword.Reserved),
+            # These are classed differently, check later
+            (words((
+                'ALL', 'AND', 'ANY', 'AS', 'ATMOST', 'BEFORE', 'BEGINC++', 'BEST', 'BETWEEN', 'CASE',
+                'CONST', 'COUNTER', 'CSV', 'DESCEND', 'ENCRYPT', 'ENDC++', 'ENDMACRO', 'EXCEPT',
+                'EXCLUSIVE', 'EXPIRE', 'EXPORT', 'EXTEND', 'FALSE', 'FEW', 'FIRST', 'FLAT', 'FULL',
+                'FUNCTION', 'GROUP', 'HEADER', 'HEADING', 'HOLE', 'IFBLOCK', 'IMPORT', 'IN', 'JOINED',
+                'KEEP', 'KEYED', 'LAST', 'LEFT', 'LIMIT', 'LOAD', 'LOCAL', 'LOCALE', 'LOOKUP', 'MACRO',
+                'MANY', 'MAXCOUNT', 'MAXLENGTH', 'MIN SKEW', 'MODULE', 'INTERFACE', 'NAMED', 'NOCASE',
+                'NOROOT', 'NOSCAN', 'NOSORT', 'NOT', 'OF', 'ONLY', 'OPT', 'OR', 'OUTER', 'OVERWRITE',
+                'PACKED', 'PARTITION', 'PENALTY', 'PHYSICALLENGTH', 'PIPE', 'QUOTE', 'RELATIONSHIP',
+                'REPEAT', 'RETURN', 'RIGHT', 'SCAN', 'SELF', 'SEPARATOR', 'SERVICE', 'SHARED', 'SKEW',
+                'SKIP', 'SQL', 'STORE', 'TERMINATOR', 'THOR', 'THRESHOLD', 'TOKEN', 'TRANSFORM', 'TRIM',
+                'TRUE', 'TYPE', 'UNICODEORDER', 'UNSORTED', 'VALIDATE', 'VIRTUAL', 'WHOLE', 'WILD',
+                'WITHIN', 'XML', 'XPATH', '__COMPRESSED__'), suffix=r'\b'),
+             Keyword.Reserved),
+        ],
+        'functions': [
+            (words((
+                'ABS', 'ACOS', 'ALLNODES', 'ASCII', 'ASIN', 'ASSTRING', 'ATAN', 'ATAN2', 'AVE', 'CASE',
+                'CHOOSE', 'CHOOSEN', 'CHOOSESETS', 'CLUSTERSIZE', 'COMBINE', 'CORRELATION', 'COS',
+                'COSH', 'COUNT', 'COVARIANCE', 'CRON', 'DATASET', 'DEDUP', 'DEFINE', 'DENORMALIZE',
+                'DISTRIBUTE', 'DISTRIBUTED', 'DISTRIBUTION', 'EBCDIC', 'ENTH', 'ERROR', 'EVALUATE',
+                'EVENT', 'EVENTEXTRA', 'EVENTNAME', 'EXISTS', 'EXP', 'FAILCODE', 'FAILMESSAGE',
+                'FETCH', 'FROMUNICODE', 'GETISVALID', 'GLOBAL', 'GRAPH', 'GROUP', 'HASH', 'HASH32',
+                'HASH64', 'HASHCRC', 'HASHMD5', 'HAVING', 'IF', 'INDEX', 'INTFORMAT', 'ISVALID',
+                'ITERATE', 'JOIN', 'KEYUNICODE', 'LENGTH', 'LIBRARY', 'LIMIT', 'LN', 'LOCAL', 'LOG', 'LOOP',
+                'MAP', 'MATCHED', 'MATCHLENGTH', 'MATCHPOSITION', 'MATCHTEXT', 'MATCHUNICODE',
+                'MAX', 'MERGE', 'MERGEJOIN', 'MIN', 'NOLOCAL', 'NONEMPTY', 'NORMALIZE', 'PARSE', 'PIPE',
+                'POWER', 'PRELOAD', 'PROCESS', 'PROJECT', 'PULL', 'RANDOM', 'RANGE', 'RANK', 'RANKED',
+                'REALFORMAT', 'RECORDOF', 'REGEXFIND', 'REGEXREPLACE', 'REGROUP', 'REJECTED',
+                'ROLLUP', 'ROUND', 'ROUNDUP', 'ROW', 'ROWDIFF', 'SAMPLE', 'SET', 'SIN', 'SINH', 'SIZEOF',
+                'SOAPCALL', 'SORT', 'SORTED', 'SQRT', 'STEPPED', 'STORED', 'SUM', 'TABLE', 'TAN', 'TANH',
+                'THISNODE', 'TOPN', 'TOUNICODE', 'TRANSFER', 'TRIM', 'TRUNCATE', 'TYPEOF', 'UNGROUP',
+                'UNICODEORDER', 'VARIANCE', 'WHICH', 'WORKUNIT', 'XMLDECODE', 'XMLENCODE',
+                'XMLTEXT', 'XMLUNICODE'), suffix=r'\b'),
+             Name.Function),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\'', String, '#pop'),
+            (r'[^"\']+', String),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/html.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/html.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/html.py	(revision 1126)
@@ -0,0 +1,602 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.html
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for HTML, XML and related markup.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \
+    default, using
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation
+from pygments.util import looks_like_xml, html_doctype_matches
+
+from pygments.lexers.javascript import JavascriptLexer
+from pygments.lexers.jvm import ScalaLexer
+from pygments.lexers.css import CssLexer, _indentation, _starts_block
+from pygments.lexers.ruby import RubyLexer
+
+__all__ = ['HtmlLexer', 'DtdLexer', 'XmlLexer', 'XsltLexer', 'HamlLexer',
+           'ScamlLexer', 'PugLexer']
+
+
+class HtmlLexer(RegexLexer):
+    """
+    For HTML 4 and XHTML 1 markup. Nested JavaScript and CSS is highlighted
+    by the appropriate lexer.
+    """
+
+    name = 'HTML'
+    aliases = ['html']
+    filenames = ['*.html', '*.htm', '*.xhtml', '*.xslt']
+    mimetypes = ['text/html', 'application/xhtml+xml']
+
+    flags = re.IGNORECASE | re.DOTALL
+    tokens = {
+        'root': [
+            ('[^<&]+', Text),
+            (r'&\S*?;', Name.Entity),
+            (r'\<\!\[CDATA\[.*?\]\]\>', Comment.Preproc),
+            ('<!--', Comment, 'comment'),
+            (r'<\?.*?\?>', Comment.Preproc),
+            ('<![^>]*>', Comment.Preproc),
+            (r'(<)(\s*)(script)(\s*)',
+             bygroups(Punctuation, Text, Name.Tag, Text),
+             ('script-content', 'tag')),
+            (r'(<)(\s*)(style)(\s*)',
+             bygroups(Punctuation, Text, Name.Tag, Text),
+             ('style-content', 'tag')),
+            # note: this allows tag names not used in HTML like <x:with-dash>,
+            # this is to support yet-unknown template engines and the like
+            (r'(<)(\s*)([\w:.-]+)',
+             bygroups(Punctuation, Text, Name.Tag), 'tag'),
+            (r'(<)(\s*)(/)(\s*)([\w:.-]+)(\s*)(>)',
+             bygroups(Punctuation, Text, Punctuation, Text, Name.Tag, Text,
+                      Punctuation)),
+        ],
+        'comment': [
+            ('[^-]+', Comment),
+            ('-->', Comment, '#pop'),
+            ('-', Comment),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'([\w:-]+\s*)(=)(\s*)', bygroups(Name.Attribute, Operator, Text),
+             'attr'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'(/?)(\s*)(>)', bygroups(Punctuation, Text, Punctuation), '#pop'),
+        ],
+        'script-content': [
+            (r'(<)(\s*)(/)(\s*)(script)(\s*)(>)',
+             bygroups(Punctuation, Text, Punctuation, Text, Name.Tag, Text,
+                      Punctuation), '#pop'),
+            (r'.+?(?=<\s*/\s*script\s*>)', using(JavascriptLexer)),
+        ],
+        'style-content': [
+            (r'(<)(\s*)(/)(\s*)(style)(\s*)(>)',
+             bygroups(Punctuation, Text, Punctuation, Text, Name.Tag, Text,
+                      Punctuation),'#pop'),
+            (r'.+?(?=<\s*/\s*style\s*>)', using(CssLexer)),
+        ],
+        'attr': [
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if html_doctype_matches(text):
+            return 0.5
+
+
+class DtdLexer(RegexLexer):
+    """
+    A lexer for DTDs (Document Type Definitions).
+
+    .. versionadded:: 1.5
+    """
+
+    flags = re.MULTILINE | re.DOTALL
+
+    name = 'DTD'
+    aliases = ['dtd']
+    filenames = ['*.dtd']
+    mimetypes = ['application/xml-dtd']
+
+    tokens = {
+        'root': [
+            include('common'),
+
+            (r'(<!ELEMENT)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Tag), 'element'),
+            (r'(<!ATTLIST)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Tag), 'attlist'),
+            (r'(<!ENTITY)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Entity), 'entity'),
+            (r'(<!NOTATION)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Tag), 'notation'),
+            (r'(<!\[)([^\[\s]+)(\s*)(\[)',  # conditional sections
+                bygroups(Keyword, Name.Entity, Text, Keyword)),
+
+            (r'(<!DOCTYPE)(\s+)([^>\s]+)',
+                bygroups(Keyword, Text, Name.Tag)),
+            (r'PUBLIC|SYSTEM', Keyword.Constant),
+            (r'[\[\]>]', Keyword),
+        ],
+
+        'common': [
+            (r'\s+', Text),
+            (r'(%|&)[^;]*;', Name.Entity),
+            ('<!--', Comment, 'comment'),
+            (r'[(|)*,?+]', Operator),
+            (r'"[^"]*"', String.Double),
+            (r'\'[^\']*\'', String.Single),
+        ],
+
+        'comment': [
+            ('[^-]+', Comment),
+            ('-->', Comment, '#pop'),
+            ('-', Comment),
+        ],
+
+        'element': [
+            include('common'),
+            (r'EMPTY|ANY|#PCDATA', Keyword.Constant),
+            (r'[^>\s|()?+*,]+', Name.Tag),
+            (r'>', Keyword, '#pop'),
+        ],
+
+        'attlist': [
+            include('common'),
+            (r'CDATA|IDREFS|IDREF|ID|NMTOKENS|NMTOKEN|ENTITIES|ENTITY|NOTATION',
+             Keyword.Constant),
+            (r'#REQUIRED|#IMPLIED|#FIXED', Keyword.Constant),
+            (r'xml:space|xml:lang', Keyword.Reserved),
+            (r'[^>\s|()?+*,]+', Name.Attribute),
+            (r'>', Keyword, '#pop'),
+        ],
+
+        'entity': [
+            include('common'),
+            (r'SYSTEM|PUBLIC|NDATA', Keyword.Constant),
+            (r'[^>\s|()?+*,]+', Name.Entity),
+            (r'>', Keyword, '#pop'),
+        ],
+
+        'notation': [
+            include('common'),
+            (r'SYSTEM|PUBLIC', Keyword.Constant),
+            (r'[^>\s|()?+*,]+', Name.Attribute),
+            (r'>', Keyword, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if not looks_like_xml(text) and \
+           ('<!ELEMENT' in text or '<!ATTLIST' in text or '<!ENTITY' in text):
+            return 0.8
+
+
+class XmlLexer(RegexLexer):
+    """
+    Generic lexer for XML (eXtensible Markup Language).
+    """
+
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    name = 'XML'
+    aliases = ['xml']
+    filenames = ['*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd',
+                 '*.wsdl', '*.wsf']
+    mimetypes = ['text/xml', 'application/xml', 'image/svg+xml',
+                 'application/rss+xml', 'application/atom+xml']
+
+    tokens = {
+        'root': [
+            ('[^<&]+', Text),
+            (r'&\S*?;', Name.Entity),
+            (r'\<\!\[CDATA\[.*?\]\]\>', Comment.Preproc),
+            ('<!--', Comment, 'comment'),
+            (r'<\?.*?\?>', Comment.Preproc),
+            ('<![^>]*>', Comment.Preproc),
+            (r'<\s*[\w:.-]+', Name.Tag, 'tag'),
+            (r'<\s*/\s*[\w:.-]+\s*>', Name.Tag),
+        ],
+        'comment': [
+            ('[^-]+', Comment),
+            ('-->', Comment, '#pop'),
+            ('-', Comment),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'[\w.:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'attr': [
+            ('\s+', Text),
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if looks_like_xml(text):
+            return 0.45  # less than HTML
+
+
+class XsltLexer(XmlLexer):
+    """
+    A lexer for XSLT.
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'XSLT'
+    aliases = ['xslt']
+    filenames = ['*.xsl', '*.xslt', '*.xpl']  # xpl is XProc
+    mimetypes = ['application/xsl+xml', 'application/xslt+xml']
+
+    EXTRA_KEYWORDS = set((
+        'apply-imports', 'apply-templates', 'attribute',
+        'attribute-set', 'call-template', 'choose', 'comment',
+        'copy', 'copy-of', 'decimal-format', 'element', 'fallback',
+        'for-each', 'if', 'import', 'include', 'key', 'message',
+        'namespace-alias', 'number', 'otherwise', 'output', 'param',
+        'preserve-space', 'processing-instruction', 'sort',
+        'strip-space', 'stylesheet', 'template', 'text', 'transform',
+        'value-of', 'variable', 'when', 'with-param'
+    ))
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in XmlLexer.get_tokens_unprocessed(self, text):
+            m = re.match('</?xsl:([^>]*)/?>?', value)
+
+            if token is Name.Tag and m and m.group(1) in self.EXTRA_KEYWORDS:
+                yield index, Keyword, value
+            else:
+                yield index, token, value
+
+    def analyse_text(text):
+        if looks_like_xml(text) and '<xsl' in text:
+            return 0.8
+
+
+class HamlLexer(ExtendedRegexLexer):
+    """
+    For Haml markup.
+
+    .. versionadded:: 1.3
+    """
+
+    name = 'Haml'
+    aliases = ['haml']
+    filenames = ['*.haml']
+    mimetypes = ['text/x-haml']
+
+    flags = re.IGNORECASE
+    # Haml can include " |\n" anywhere,
+    # which is ignored and used to wrap long lines.
+    # To accomodate this, use this custom faux dot instead.
+    _dot = r'(?: \|\n(?=.* \|)|.)'
+
+    # In certain places, a comma at the end of the line
+    # allows line wrapping as well.
+    _comma_dot = r'(?:,\s*\n|' + _dot + ')'
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'[&!]?==', Punctuation, 'plain'),
+            (r'([&!]?[=~])(' + _comma_dot + r'*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             'root'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'%[\w:-]+', Name.Tag, 'tag'),
+            (r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'),
+            (r'(/)(\[' + _dot + '*?\])(' + _dot + r'*\n)',
+             bygroups(Comment, Comment.Special, Comment),
+             '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'),
+             '#pop'),
+            (r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc,
+                                                  'haml-comment-block'), '#pop'),
+            (r'(-)(' + _comma_dot + r'*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             '#pop'),
+            (r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'),
+             '#pop'),
+            include('eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'\{(,\n|' + _dot + ')*?\}', using(RubyLexer)),
+            (r'\[' + _dot + '*?\]', using(RubyLexer)),
+            (r'\(', Text, 'html-attributes'),
+            (r'/[ \t]*\n', Punctuation, '#pop:2'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(' + _dot + '*?)(\})',
+             bygroups(String.Interpol, using(RubyLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'\s+', Text),
+            (r'[\w:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'\)', Text, '#pop'),
+        ],
+
+        'html-attribute-value': [
+            (r'[ \t]+', Text),
+            (r'\w+', Name.Variable, '#pop'),
+            (r'@\w+', Name.Variable.Instance, '#pop'),
+            (r'\$\w+', Name.Variable.Global, '#pop'),
+            (r"'(\\\\|\\'|[^'\n])*'", String, '#pop'),
+            (r'"(\\\\|\\"|[^"\n])*"', String, '#pop'),
+        ],
+
+        'html-comment-block': [
+            (_dot + '+', Comment),
+            (r'\n', Text, 'root'),
+        ],
+
+        'haml-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+
+        'filter-block': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator),
+            (r'(#\{)(' + _dot + '*?)(\})',
+             bygroups(String.Interpol, using(RubyLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+    }
+
+
+class ScamlLexer(ExtendedRegexLexer):
+    """
+    For `Scaml markup <http://scalate.fusesource.org/>`_.  Scaml is Haml for Scala.
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'Scaml'
+    aliases = ['scaml']
+    filenames = ['*.scaml']
+    mimetypes = ['text/x-scaml']
+
+    flags = re.IGNORECASE
+    # Scaml does not yet support the " |\n" notation to
+    # wrap long lines.  Once it does, use the custom faux
+    # dot instead.
+    # _dot = r'(?: \|\n(?=.* \|)|.)'
+    _dot = r'.'
+
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'[&!]?==', Punctuation, 'plain'),
+            (r'([&!]?[=~])(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),
+             'root'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'%[\w:-]+', Name.Tag, 'tag'),
+            (r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'),
+            (r'(/)(\[' + _dot + '*?\])(' + _dot + r'*\n)',
+             bygroups(Comment, Comment.Special, Comment),
+             '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'),
+             '#pop'),
+            (r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc,
+                                                  'scaml-comment-block'), '#pop'),
+            (r'(-@\s*)(import)?(' + _dot + r'*\n)',
+             bygroups(Punctuation, Keyword, using(ScalaLexer)),
+             '#pop'),
+            (r'(-)(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),
+             '#pop'),
+            (r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'),
+             '#pop'),
+            include('eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'\{(,\n|' + _dot + ')*?\}', using(ScalaLexer)),
+            (r'\[' + _dot + '*?\]', using(ScalaLexer)),
+            (r'\(', Text, 'html-attributes'),
+            (r'/[ \t]*\n', Punctuation, '#pop:2'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(' + _dot + '*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'\s+', Text),
+            (r'[\w:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'\)', Text, '#pop'),
+        ],
+
+        'html-attribute-value': [
+            (r'[ \t]+', Text),
+            (r'\w+', Name.Variable, '#pop'),
+            (r'@\w+', Name.Variable.Instance, '#pop'),
+            (r'\$\w+', Name.Variable.Global, '#pop'),
+            (r"'(\\\\|\\'|[^'\n])*'", String, '#pop'),
+            (r'"(\\\\|\\"|[^"\n])*"', String, '#pop'),
+        ],
+
+        'html-comment-block': [
+            (_dot + '+', Comment),
+            (r'\n', Text, 'root'),
+        ],
+
+        'scaml-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+
+        'filter-block': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator),
+            (r'(#\{)(' + _dot + '*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+    }
+
+
+class PugLexer(ExtendedRegexLexer):
+    """
+    For Pug markup.
+    Pug is a variant of Scaml, see:
+    http://scalate.fusesource.org/documentation/scaml-reference.html
+
+    .. versionadded:: 1.4
+    """
+
+    name = 'Pug'
+    aliases = ['pug', 'jade']
+    filenames = ['*.pug', '*.jade']
+    mimetypes = ['text/x-pug', 'text/x-jade']
+
+    flags = re.IGNORECASE
+    _dot = r'.'
+
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'[&!]?==', Punctuation, 'plain'),
+            (r'([&!]?[=~])(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),  'root'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'),
+            (r'(/)(\[' + _dot + '*?\])(' + _dot + r'*\n)',
+             bygroups(Comment, Comment.Special, Comment),
+             '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'),
+             '#pop'),
+            (r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc,
+                                                  'scaml-comment-block'), '#pop'),
+            (r'(-@\s*)(import)?(' + _dot + r'*\n)',
+             bygroups(Punctuation, Keyword, using(ScalaLexer)),
+             '#pop'),
+            (r'(-)(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),
+             '#pop'),
+            (r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'),
+             '#pop'),
+            (r'[\w:-]+', Name.Tag, 'tag'),
+            (r'\|', Text, 'eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'\{(,\n|' + _dot + ')*?\}', using(ScalaLexer)),
+            (r'\[' + _dot + '*?\]', using(ScalaLexer)),
+            (r'\(', Text, 'html-attributes'),
+            (r'/[ \t]*\n', Punctuation, '#pop:2'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(' + _dot + '*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'\s+', Text),
+            (r'[\w:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'\)', Text, '#pop'),
+        ],
+
+        'html-attribute-value': [
+            (r'[ \t]+', Text),
+            (r'\w+', Name.Variable, '#pop'),
+            (r'@\w+', Name.Variable.Instance, '#pop'),
+            (r'\$\w+', Name.Variable.Global, '#pop'),
+            (r"'(\\\\|\\'|[^'\n])*'", String, '#pop'),
+            (r'"(\\\\|\\"|[^"\n])*"', String, '#pop'),
+        ],
+
+        'html-comment-block': [
+            (_dot + '+', Comment),
+            (r'\n', Text, 'root'),
+        ],
+
+        'scaml-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+
+        'filter-block': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator),
+            (r'(#\{)(' + _dot + '*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+    }
+JadeLexer = PugLexer  # compat
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/javascript.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/javascript.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/javascript.py	(revision 1126)
@@ -0,0 +1,1525 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.javascript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for JavaScript and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, using, \
+    this, words, combined
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Other
+from pygments.util import get_bool_opt, iteritems
+import pygments.unistring as uni
+
+__all__ = ['JavascriptLexer', 'KalLexer', 'LiveScriptLexer', 'DartLexer',
+           'TypeScriptLexer', 'LassoLexer', 'ObjectiveJLexer',
+           'CoffeeScriptLexer', 'MaskLexer', 'EarlGreyLexer', 'JuttleLexer']
+
+JS_IDENT_START = ('(?:[$_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') +
+                  ']|\\\\u[a-fA-F0-9]{4})')
+JS_IDENT_PART = ('(?:[$' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
+                                       'Mn', 'Mc', 'Nd', 'Pc') +
+                 u'\u200c\u200d]|\\\\u[a-fA-F0-9]{4})')
+JS_IDENT = JS_IDENT_START + '(?:' + JS_IDENT_PART + ')*'
+
+
+class JavascriptLexer(RegexLexer):
+    """
+    For JavaScript source code.
+    """
+
+    name = 'JavaScript'
+    aliases = ['js', 'javascript']
+    filenames = ['*.js', '*.jsm']
+    mimetypes = ['application/javascript', 'application/x-javascript',
+                 'text/x-javascript', 'text/javascript']
+
+    flags = re.DOTALL | re.UNICODE | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'<!--', Comment),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuy]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'\A#! ?/.*?\n', Comment.Hashbang),  # recognized by node.js
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'(\.\d+|[0-9]+\.[0-9]*)([eE][-+]?[0-9]+)?', Number.Float),
+            (r'0[bB][01]+', Number.Bin),
+            (r'0[oO][0-7]+', Number.Oct),
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'\.\.\.|=>', Punctuation),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|void|yield|'
+             r'this|of)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(abstract|boolean|byte|char|class|const|debugger|double|enum|export|'
+             r'extends|final|float|goto|implements|import|int|interface|long|native|'
+             r'package|private|protected|public|short|static|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Reserved),
+            (r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|Promise|Proxy|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'Error|eval|isFinite|isNaN|isSafeInteger|parseFloat|parseInt|'
+             r'document|this|window)\b', Name.Builtin),
+            (JS_IDENT, Name.Other),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'`', String.Backtick, 'interp'),
+        ],
+        'interp': [
+            (r'`', String.Backtick, '#pop'),
+            (r'\\\\', String.Backtick),
+            (r'\\`', String.Backtick),
+            (r'\$\{', String.Interpol, 'interp-inside'),
+            (r'\$', String.Backtick),
+            (r'[^`\\$]+', String.Backtick),
+        ],
+        'interp-inside': [
+            # TODO: should this include single-line comments and allow nesting strings?
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        # (\\\\|\\`|[^`])*`', String.Backtick),
+    }
+
+
+class KalLexer(RegexLexer):
+    """
+    For `Kal`_ source code.
+
+    .. _Kal: http://rzimmerman.github.io/kal
+
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Kal'
+    aliases = ['kal']
+    filenames = ['*.kal']
+    mimetypes = ['text/kal', 'application/kal']
+
+    flags = re.DOTALL
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'###[^#].*?###', Comment.Multiline),
+            (r'#(?!##[^#]).*?\n', Comment.Single),
+        ],
+        'functiondef': [
+            (r'[$a-zA-Z_][\w$]*\s*', Name.Function, '#pop'),
+            include('commentsandwhitespace'),
+        ],
+        'classdef': [
+            (r'\binherits\s+from\b', Keyword),
+            (r'[$a-zA-Z_][\w$]*\s*\n', Name.Class, '#pop'),
+            (r'[$a-zA-Z_][\w$]*\s*', Name.Class),
+            include('commentsandwhitespace'),
+        ],
+        'listcomprehension': [
+            (r'\]', Punctuation, '#pop'),
+            (r'\b(property|value)\b', Keyword),
+            include('root'),
+        ],
+        'waitfor': [
+            (r'\n', Punctuation, '#pop'),
+            (r'\bfrom\b', Keyword),
+            include('root'),
+        ],
+        'root': [
+            include('commentsandwhitespace'),
+            (r'/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex),
+            (r'\?|:|_(?=\n)|==?|!=|-(?!>)|[<>+*/-]=?',
+             Operator),
+            (r'\b(and|or|isnt|is|not|but|bitwise|mod|\^|xor|exists|'
+             r'doesnt\s+exist)\b', Operator.Word),
+            (r'(?:\([^()]+\))?\s*>', Name.Function),
+            (r'[{(]', Punctuation),
+            (r'\[', Punctuation, 'listcomprehension'),
+            (r'[})\].,]', Punctuation),
+            (r'\b(function|method|task)\b', Keyword.Declaration, 'functiondef'),
+            (r'\bclass\b', Keyword.Declaration, 'classdef'),
+            (r'\b(safe\s+)?wait\s+for\b', Keyword, 'waitfor'),
+            (r'\b(me|this)(\.[$a-zA-Z_][\w.$]*)?\b', Name.Variable.Instance),
+            (r'(?<![.$])(for(\s+(parallel|series))?|in|of|while|until|'
+             r'break|return|continue|'
+             r'when|if|unless|else|otherwise|except\s+when|'
+             r'throw|raise|fail\s+with|try|catch|finally|new|delete|'
+             r'typeof|instanceof|super|run\s+in\s+parallel|'
+             r'inherits\s+from)\b', Keyword),
+            (r'(?<![.$])(true|false|yes|no|on|off|null|nothing|none|'
+             r'NaN|Infinity|undefined)\b',
+             Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'eval|isFinite|isNaN|isSafeInteger|parseFloat|parseInt|document|'
+             r'window|'
+             r'print)\b',
+             Name.Builtin),
+            (r'[$a-zA-Z_][\w.$]*\s*(:|[+\-*/]?\=)?\b', Name.Variable),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            ('"""', String, 'tdqs'),
+            ("'''", String, 'tsqs'),
+            ('"', String, 'dqs'),
+            ("'", String, 'sqs'),
+        ],
+        'strings': [
+            (r'[^#\\\'"]+', String),
+            # note that all kal strings are multi-line.
+            # hashmarks, quotes and backslashes must be parsed one at a time
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\.|\'', String),  # double-quoted string don't need ' escapes
+            (r'#\{', String.Interpol, "interpoling_string"),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r'#|\\.|"', String),  # single quoted strings don't need " escapses
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            (r'\\.|\'|"', String),  # no need to escape quotes in triple-string
+            (r'#\{', String.Interpol, "interpoling_string"),
+            include('strings'),
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            (r'#|\\.|\'|"', String),  # no need to escape quotes in triple-strings
+            include('strings')
+        ],
+    }
+
+
+class LiveScriptLexer(RegexLexer):
+    """
+    For `LiveScript`_ source code.
+
+    .. _LiveScript: http://gkz.github.com/LiveScript/
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'LiveScript'
+    aliases = ['live-script', 'livescript']
+    filenames = ['*.ls']
+    mimetypes = ['text/livescript']
+
+    flags = re.DOTALL
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'#.*?\n', Comment.Single),
+        ],
+        'multilineregex': [
+            include('commentsandwhitespace'),
+            (r'//([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'/', String.Regex),
+            (r'[^/#]+', String.Regex)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'//', String.Regex, ('#pop', 'multilineregex')),
+            (r'/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            default('#pop'),
+        ],
+        'root': [
+            # this next expr leads to infinite loops root -> slashstartsregex
+            # (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'(?:\([^()]+\))?[ ]*[~-]{1,2}>|'
+             r'(?:\(?[^()\n]+\)?)?[ ]*<[~-]{1,2}', Name.Function),
+            (r'\+\+|&&|(?<![.$])\b(?:and|x?or|is|isnt|not)\b|\?|:|=|'
+             r'\|\||\\(?=\n)|(<<|>>>?|==?|!=?|'
+             r'~(?!\~?>)|-(?!\-?>)|<(?!\[)|(?<!\])>|'
+             r'[+*`%&|^/])=?',
+             Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(?<![.$])(for|own|in|of|while|until|loop|break|'
+             r'return|continue|switch|when|then|if|unless|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|super|'
+             r'extends|this|class|by|const|var|to|til)\b', Keyword,
+             'slashstartsregex'),
+            (r'(?<![.$])(true|false|yes|no|on|off|'
+             r'null|NaN|Infinity|undefined|void)\b',
+             Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'eval|isFinite|isNaN|parseFloat|parseInt|document|window)\b',
+             Name.Builtin),
+            (r'[$a-zA-Z_][\w.\-:$]*\s*[:=]\s', Name.Variable,
+             'slashstartsregex'),
+            (r'@[$a-zA-Z_][\w.\-:$]*\s*[:=]\s', Name.Variable.Instance,
+             'slashstartsregex'),
+            (r'@', Name.Other, 'slashstartsregex'),
+            (r'@?[$a-zA-Z_][\w-]*', Name.Other, 'slashstartsregex'),
+            (r'[0-9]+\.[0-9]+([eE][0-9]+)?[fd]?(?:[a-zA-Z_]+)?', Number.Float),
+            (r'[0-9]+(~[0-9a-z]+)?(?:[a-zA-Z_]+)?', Number.Integer),
+            ('"""', String, 'tdqs'),
+            ("'''", String, 'tsqs'),
+            ('"', String, 'dqs'),
+            ("'", String, 'sqs'),
+            (r'\\\S+', String),
+            (r'<\[.*?\]>', String),
+        ],
+        'strings': [
+            (r'[^#\\\'"]+', String),
+            # note that all coffee script strings are multi-line.
+            # hashmarks, quotes and backslashes must be parsed one at a time
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\.|\'', String),  # double-quoted string don't need ' escapes
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r'#|\\.|"', String),  # single quoted strings don't need " escapses
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            (r'\\.|\'|"', String),  # no need to escape quotes in triple-string
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings'),
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            (r'#|\\.|\'|"', String),  # no need to escape quotes in triple-strings
+            include('strings')
+        ],
+    }
+
+
+class DartLexer(RegexLexer):
+    """
+    For `Dart <http://dartlang.org/>`_ source code.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Dart'
+    aliases = ['dart']
+    filenames = ['*.dart']
+    mimetypes = ['text/x-dart']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            include('string_literal'),
+            (r'#!(.*?)$', Comment.Preproc),
+            (r'\b(import|export)\b', Keyword, 'import_decl'),
+            (r'\b(library|source|part of|part)\b', Keyword),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'\b(class)\b(\s+)',
+             bygroups(Keyword.Declaration, Text), 'class'),
+            (r'\b(assert|break|case|catch|continue|default|do|else|finally|for|'
+             r'if|in|is|new|return|super|switch|this|throw|try|while)\b',
+             Keyword),
+            (r'\b(abstract|async|await|const|extends|factory|final|get|'
+             r'implements|native|operator|set|static|sync|typedef|var|with|'
+             r'yield)\b', Keyword.Declaration),
+            (r'\b(bool|double|dynamic|int|num|Object|String|void)\b', Keyword.Type),
+            (r'\b(false|null|true)\b', Keyword.Constant),
+            (r'[~!%^&*+=|?:<>/-]|as\b', Operator),
+            (r'[a-zA-Z_$]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[(){}\[\],.;]', Punctuation),
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            # DIGIT+ (‘.’ DIGIT*)? EXPONENT?
+            (r'\d+(\.\d*)?([eE][+-]?\d+)?', Number),
+            (r'\.\d+([eE][+-]?\d+)?', Number),  # ‘.’ DIGIT+ EXPONENT?
+            (r'\n', Text)
+            # pseudo-keyword negate intentionally left out
+        ],
+        'class': [
+            (r'[a-zA-Z_$]\w*', Name.Class, '#pop')
+        ],
+        'import_decl': [
+            include('string_literal'),
+            (r'\s+', Text),
+            (r'\b(as|show|hide)\b', Keyword),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'\,', Punctuation),
+            (r'\;', Punctuation, '#pop')
+        ],
+        'string_literal': [
+            # Raw strings.
+            (r'r"""([\w\W]*?)"""', String.Double),
+            (r"r'''([\w\W]*?)'''", String.Single),
+            (r'r"(.*?)"', String.Double),
+            (r"r'(.*?)'", String.Single),
+            # Normal Strings.
+            (r'"""', String.Double, 'string_double_multiline'),
+            (r"'''", String.Single, 'string_single_multiline'),
+            (r'"', String.Double, 'string_double'),
+            (r"'", String.Single, 'string_single')
+        ],
+        'string_common': [
+            (r"\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\{[0-9A-Fa-f]*\}|[a-z'\"$\\])",
+             String.Escape),
+            (r'(\$)([a-zA-Z_]\w*)', bygroups(String.Interpol, Name)),
+            (r'(\$\{)(.*?)(\})',
+             bygroups(String.Interpol, using(this), String.Interpol))
+        ],
+        'string_double': [
+            (r'"', String.Double, '#pop'),
+            (r'[^"$\\\n]+', String.Double),
+            include('string_common'),
+            (r'\$+', String.Double)
+        ],
+        'string_double_multiline': [
+            (r'"""', String.Double, '#pop'),
+            (r'[^"$\\]+', String.Double),
+            include('string_common'),
+            (r'(\$|\")+', String.Double)
+        ],
+        'string_single': [
+            (r"'", String.Single, '#pop'),
+            (r"[^'$\\\n]+", String.Single),
+            include('string_common'),
+            (r'\$+', String.Single)
+        ],
+        'string_single_multiline': [
+            (r"'''", String.Single, '#pop'),
+            (r'[^\'$\\]+', String.Single),
+            include('string_common'),
+            (r'(\$|\')+', String.Single)
+        ]
+    }
+
+
+class TypeScriptLexer(RegexLexer):
+    """
+    For `TypeScript <http://typescriptlang.org/>`_ source code.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'TypeScript'
+    aliases = ['ts', 'typescript']
+    filenames = ['*.ts', '*.tsx']
+    mimetypes = ['text/x-typescript']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'<!--', Comment),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'this)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(abstract|boolean|byte|char|class|const|debugger|double|enum|export|'
+             r'extends|final|float|goto|implements|import|int|interface|long|native|'
+             r'package|private|protected|public|short|static|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Reserved),
+            (r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'Error|eval|isFinite|isNaN|parseFloat|parseInt|document|this|'
+             r'window)\b', Name.Builtin),
+            # Match stuff like: module name {...}
+            (r'\b(module)(\s*)(\s*[\w?.$][\w?.$]*)(\s*)',
+             bygroups(Keyword.Reserved, Text, Name.Other, Text), 'slashstartsregex'),
+            # Match variable type keywords
+            (r'\b(string|bool|number)\b', Keyword.Type),
+            # Match stuff like: constructor
+            (r'\b(constructor|declare|interface|as|AS)\b', Keyword.Reserved),
+            # Match stuff like: super(argument, list)
+            (r'(super)(\s*)(\([\w,?.$\s]+\s*\))',
+             bygroups(Keyword.Reserved, Text), 'slashstartsregex'),
+            # Match stuff like: function() {...}
+            (r'([a-zA-Z_?.$][\w?.$]*)\(\) \{', Name.Other, 'slashstartsregex'),
+            # Match stuff like: (function: return type)
+            (r'([\w?.$][\w?.$]*)(\s*:\s*)([\w?.$][\w?.$]*)',
+             bygroups(Name.Other, Text, Keyword.Type)),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'`', String.Backtick, 'interp'),
+            # Match stuff like: Decorators
+            (r'@\w+', Keyword.Declaration),
+        ],
+
+        # The 'interp*' rules match those in JavascriptLexer. Changes made
+        # there should be reflected here as well.
+        'interp': [
+            (r'`', String.Backtick, '#pop'),
+            (r'\\\\', String.Backtick),
+            (r'\\`', String.Backtick),
+            (r'\$\{', String.Interpol, 'interp-inside'),
+            (r'\$', String.Backtick),
+            (r'[^`\\$]+', String.Backtick),
+        ],
+        'interp-inside': [
+            # TODO: should this include single-line comments and allow nesting strings?
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search('^(import.+(from\s+)?["\']|'
+                     '(export\s*)?(interface|class|function)\s+)',
+                     text, re.MULTILINE):
+            return 1.0
+
+
+class LassoLexer(RegexLexer):
+    """
+    For `Lasso <http://www.lassosoft.com/>`_ source code, covering both Lasso 9
+    syntax and LassoScript for Lasso 8.6 and earlier. For Lasso embedded in
+    HTML, use the `LassoHtmlLexer`.
+
+    Additional options accepted:
+
+    `builtinshighlighting`
+        If given and ``True``, highlight builtin types, traits, methods, and
+        members (default: ``True``).
+    `requiredelimiters`
+        If given and ``True``, only highlight code between delimiters as Lasso
+        (default: ``False``).
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Lasso'
+    aliases = ['lasso', 'lassoscript']
+    filenames = ['*.lasso', '*.lasso[89]']
+    alias_filenames = ['*.incl', '*.inc', '*.las']
+    mimetypes = ['text/x-lasso']
+    flags = re.IGNORECASE | re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'^#![ \S]+lasso9\b', Comment.Preproc, 'lasso'),
+            (r'(?=\[|<)', Other, 'delimiters'),
+            (r'\s+', Other),
+            default(('delimiters', 'lassofile')),
+        ],
+        'delimiters': [
+            (r'\[no_square_brackets\]', Comment.Preproc, 'nosquarebrackets'),
+            (r'\[noprocess\]', Comment.Preproc, 'noprocess'),
+            (r'\[', Comment.Preproc, 'squarebrackets'),
+            (r'<\?(lasso(script)?|=)', Comment.Preproc, 'anglebrackets'),
+            (r'<(!--.*?-->)?', Other),
+            (r'[^[<]+', Other),
+        ],
+        'nosquarebrackets': [
+            (r'\[noprocess\]', Comment.Preproc, 'noprocess'),
+            (r'\[', Other),
+            (r'<\?(lasso(script)?|=)', Comment.Preproc, 'anglebrackets'),
+            (r'<(!--.*?-->)?', Other),
+            (r'[^[<]+', Other),
+        ],
+        'noprocess': [
+            (r'\[/noprocess\]', Comment.Preproc, '#pop'),
+            (r'\[', Other),
+            (r'[^[]', Other),
+        ],
+        'squarebrackets': [
+            (r'\]', Comment.Preproc, '#pop'),
+            include('lasso'),
+        ],
+        'anglebrackets': [
+            (r'\?>', Comment.Preproc, '#pop'),
+            include('lasso'),
+        ],
+        'lassofile': [
+            (r'\]|\?>', Comment.Preproc, '#pop'),
+            include('lasso'),
+        ],
+        'whitespacecomments': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*\*!.*?\*/', String.Doc),
+            (r'/\*.*?\*/', Comment.Multiline),
+        ],
+        'lasso': [
+            # whitespace/comments
+            include('whitespacecomments'),
+
+            # literals
+            (r'\d*\.\d+(e[+-]?\d+)?', Number.Float),
+            (r'0x[\da-f]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'(infinity|NaN)\b', Number),
+            (r"'", String.Single, 'singlestring'),
+            (r'"', String.Double, 'doublestring'),
+            (r'`[^`]*`', String.Backtick),
+
+            # names
+            (r'\$[a-z_][\w.]*', Name.Variable),
+            (r'#([a-z_][\w.]*|\d+\b)', Name.Variable.Instance),
+            (r"(\.\s*)('[a-z_][\w.]*')",
+                bygroups(Name.Builtin.Pseudo, Name.Variable.Class)),
+            (r"(self)(\s*->\s*)('[a-z_][\w.]*')",
+                bygroups(Name.Builtin.Pseudo, Operator, Name.Variable.Class)),
+            (r'(\.\.?\s*)([a-z_][\w.]*(=(?!=))?)',
+                bygroups(Name.Builtin.Pseudo, Name.Other.Member)),
+            (r'(->\\?\s*|&\s*)([a-z_][\w.]*(=(?!=))?)',
+                bygroups(Operator, Name.Other.Member)),
+            (r'(?<!->)(self|inherited|currentcapture|givenblock)\b',
+                Name.Builtin.Pseudo),
+            (r'-(?!infinity)[a-z_][\w.]*', Name.Attribute),
+            (r'::\s*[a-z_][\w.]*', Name.Label),
+            (r'(error_(code|msg)_\w+|Error_AddError|Error_ColumnRestriction|'
+             r'Error_DatabaseConnectionUnavailable|Error_DatabaseTimeout|'
+             r'Error_DeleteError|Error_FieldRestriction|Error_FileNotFound|'
+             r'Error_InvalidDatabase|Error_InvalidPassword|'
+             r'Error_InvalidUsername|Error_ModuleNotFound|'
+             r'Error_NoError|Error_NoPermission|Error_OutOfMemory|'
+             r'Error_ReqColumnMissing|Error_ReqFieldMissing|'
+             r'Error_RequiredColumnMissing|Error_RequiredFieldMissing|'
+             r'Error_UpdateError)\b', Name.Exception),
+
+            # definitions
+            (r'(define)(\s+)([a-z_][\w.]*)(\s*=>\s*)(type|trait|thread)\b',
+                bygroups(Keyword.Declaration, Text, Name.Class, Operator, Keyword)),
+            (r'(define)(\s+)([a-z_][\w.]*)(\s*->\s*)([a-z_][\w.]*=?|[-+*/%])',
+                bygroups(Keyword.Declaration, Text, Name.Class, Operator,
+                         Name.Function), 'signature'),
+            (r'(define)(\s+)([a-z_][\w.]*)',
+                bygroups(Keyword.Declaration, Text, Name.Function), 'signature'),
+            (r'(public|protected|private|provide)(\s+)(([a-z_][\w.]*=?|[-+*/%])'
+             r'(?=\s*\())', bygroups(Keyword, Text, Name.Function),
+                'signature'),
+            (r'(public|protected|private|provide)(\s+)([a-z_][\w.]*)',
+                bygroups(Keyword, Text, Name.Function)),
+
+            # keywords
+            (r'(true|false|none|minimal|full|all|void)\b', Keyword.Constant),
+            (r'(local|var|variable|global|data(?=\s))\b', Keyword.Declaration),
+            (r'(array|date|decimal|duration|integer|map|pair|string|tag|xml|'
+             r'null|boolean|bytes|keyword|list|locale|queue|set|stack|'
+             r'staticarray)\b', Keyword.Type),
+            (r'([a-z_][\w.]*)(\s+)(in)\b', bygroups(Name, Text, Keyword)),
+            (r'(let|into)(\s+)([a-z_][\w.]*)', bygroups(Keyword, Text, Name)),
+            (r'require\b', Keyword, 'requiresection'),
+            (r'(/?)(Namespace_Using)\b', bygroups(Punctuation, Keyword.Namespace)),
+            (r'(/?)(Cache|Database_Names|Database_SchemaNames|'
+             r'Database_TableNames|Define_Tag|Define_Type|Email_Batch|'
+             r'Encode_Set|HTML_Comment|Handle|Handle_Error|Header|If|Inline|'
+             r'Iterate|LJAX_Target|Link|Link_CurrentAction|Link_CurrentGroup|'
+             r'Link_CurrentRecord|Link_Detail|Link_FirstGroup|Link_FirstRecord|'
+             r'Link_LastGroup|Link_LastRecord|Link_NextGroup|Link_NextRecord|'
+             r'Link_PrevGroup|Link_PrevRecord|Log|Loop|Output_None|Portal|'
+             r'Private|Protect|Records|Referer|Referrer|Repeating|ResultSet|'
+             r'Rows|Search_Args|Search_Arguments|Select|Sort_Args|'
+             r'Sort_Arguments|Thread_Atomic|Value_List|While|Abort|Case|Else|'
+             r'Fail_If|Fail_IfNot|Fail|If_Empty|If_False|If_Null|If_True|'
+             r'Loop_Abort|Loop_Continue|Loop_Count|Params|Params_Up|Return|'
+             r'Return_Value|Run_Children|SOAP_DefineTag|SOAP_LastRequest|'
+             r'SOAP_LastResponse|Tag_Name|ascending|average|by|define|'
+             r'descending|do|equals|frozen|group|handle_failure|import|in|into|'
+             r'join|let|match|max|min|on|order|parent|protected|provide|public|'
+             r'require|returnhome|skip|split_thread|sum|take|thread|to|trait|'
+             r'type|where|with|yield|yieldhome)\b',
+                bygroups(Punctuation, Keyword)),
+
+            # other
+            (r',', Punctuation, 'commamember'),
+            (r'(and|or|not)\b', Operator.Word),
+            (r'([a-z_][\w.]*)(\s*::\s*[a-z_][\w.]*)?(\s*=(?!=))',
+                bygroups(Name, Name.Label, Operator)),
+            (r'(/?)([\w.]+)', bygroups(Punctuation, Name.Other)),
+            (r'(=)(n?bw|n?ew|n?cn|lte?|gte?|n?eq|n?rx|ft)\b',
+                bygroups(Operator, Operator.Word)),
+            (r':=|[-+*/%=<>&|!?\\]+', Operator),
+            (r'[{}():;,@^]', Punctuation),
+        ],
+        'singlestring': [
+            (r"'", String.Single, '#pop'),
+            (r"[^'\\]+", String.Single),
+            include('escape'),
+            (r"\\", String.Single),
+        ],
+        'doublestring': [
+            (r'"', String.Double, '#pop'),
+            (r'[^"\\]+', String.Double),
+            include('escape'),
+            (r'\\', String.Double),
+        ],
+        'escape': [
+            (r'\\(U[\da-f]{8}|u[\da-f]{4}|x[\da-f]{1,2}|[0-7]{1,3}|:[^:\n\r]+:|'
+             r'[abefnrtv?"\'\\]|$)', String.Escape),
+        ],
+        'signature': [
+            (r'=>', Operator, '#pop'),
+            (r'\)', Punctuation, '#pop'),
+            (r'[(,]', Punctuation, 'parameter'),
+            include('lasso'),
+        ],
+        'parameter': [
+            (r'\)', Punctuation, '#pop'),
+            (r'-?[a-z_][\w.]*', Name.Attribute, '#pop'),
+            (r'\.\.\.', Name.Builtin.Pseudo),
+            include('lasso'),
+        ],
+        'requiresection': [
+            (r'(([a-z_][\w.]*=?|[-+*/%])(?=\s*\())', Name, 'requiresignature'),
+            (r'(([a-z_][\w.]*=?|[-+*/%])(?=(\s*::\s*[\w.]+)?\s*,))', Name),
+            (r'[a-z_][\w.]*=?|[-+*/%]', Name, '#pop'),
+            (r'::\s*[a-z_][\w.]*', Name.Label),
+            (r',', Punctuation),
+            include('whitespacecomments'),
+        ],
+        'requiresignature': [
+            (r'(\)(?=(\s*::\s*[\w.]+)?\s*,))', Punctuation, '#pop'),
+            (r'\)', Punctuation, '#pop:2'),
+            (r'-?[a-z_][\w.]*', Name.Attribute),
+            (r'::\s*[a-z_][\w.]*', Name.Label),
+            (r'\.\.\.', Name.Builtin.Pseudo),
+            (r'[(,]', Punctuation),
+            include('whitespacecomments'),
+        ],
+        'commamember': [
+            (r'(([a-z_][\w.]*=?|[-+*/%])'
+             r'(?=\s*(\(([^()]*\([^()]*\))*[^)]*\)\s*)?(::[\w.\s]+)?=>))',
+                Name.Function, 'signature'),
+            include('whitespacecomments'),
+            default('#pop'),
+        ],
+    }
+
+    def __init__(self, **options):
+        self.builtinshighlighting = get_bool_opt(
+            options, 'builtinshighlighting', True)
+        self.requiredelimiters = get_bool_opt(
+            options, 'requiredelimiters', False)
+
+        self._builtins = set()
+        self._members = set()
+        if self.builtinshighlighting:
+            from pygments.lexers._lasso_builtins import BUILTINS, MEMBERS
+            for key, value in iteritems(BUILTINS):
+                self._builtins.update(value)
+            for key, value in iteritems(MEMBERS):
+                self._members.update(value)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        if self.requiredelimiters:
+            stack.append('delimiters')
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if (token is Name.Other and value.lower() in self._builtins or
+                    token is Name.Other.Member and
+                    value.lower().rstrip('=') in self._members):
+                yield index, Name.Builtin, value
+                continue
+            yield index, token, value
+
+    def analyse_text(text):
+        rv = 0.0
+        if 'bin/lasso9' in text:
+            rv += 0.8
+        if re.search(r'<\?lasso', text, re.I):
+            rv += 0.4
+        if re.search(r'local\(', text, re.I):
+            rv += 0.4
+        return rv
+
+
+class ObjectiveJLexer(RegexLexer):
+    """
+    For Objective-J source code with preprocessor directives.
+
+    .. versionadded:: 1.3
+    """
+
+    name = 'Objective-J'
+    aliases = ['objective-j', 'objectivej', 'obj-j', 'objj']
+    filenames = ['*.j']
+    mimetypes = ['text/x-objective-j']
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)*'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # function definition
+            (r'^(' + _ws + r'[+-]' + _ws + r')([(a-zA-Z_].*?[^(])(' + _ws + r'\{)',
+             bygroups(using(this), using(this, state='function_signature'),
+                      using(this))),
+
+            # class definition
+            (r'(@interface|@implementation)(\s+)', bygroups(Keyword, Text),
+             'classname'),
+            (r'(@class|@protocol)(\s*)', bygroups(Keyword, Text),
+             'forward_classname'),
+            (r'(\s*)(@end)(\s*)', bygroups(Text, Keyword, Text)),
+
+            include('statements'),
+            ('[{()}]', Punctuation),
+            (';', Punctuation),
+        ],
+        'whitespace': [
+            (r'(@import)(\s+)("(?:\\\\|\\"|[^"])*")',
+             bygroups(Comment.Preproc, Text, String.Double)),
+            (r'(@import)(\s+)(<(?:\\\\|\\>|[^>])*>)',
+             bygroups(Comment.Preproc, Text, String.Double)),
+            (r'(#(?:include|import))(\s+)("(?:\\\\|\\"|[^"])*")',
+             bygroups(Comment.Preproc, Text, String.Double)),
+            (r'(#(?:include|import))(\s+)(<(?:\\\\|\\>|[^>])*>)',
+             bygroups(Comment.Preproc, Text, String.Double)),
+
+            (r'#if\s+0', Comment.Preproc, 'if0'),
+            (r'#', Comment.Preproc, 'macro'),
+
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'//(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'<!--', Comment),
+        ],
+        'slashstartsregex': [
+            include('whitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop'),
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop'),
+        ],
+        'statements': [
+            (r'(L|@)?"', String, 'string'),
+            (r"(L|@)?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'",
+             String.Char),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+            (r'0[0-7]+[Ll]?', Number.Oct),
+            (r'\d+[Ll]?', Number.Integer),
+
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?',
+             Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|'
+             r'else|throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'prototype|__proto__)\b', Keyword, 'slashstartsregex'),
+
+            (r'(var|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+
+            (r'(@selector|@private|@protected|@public|@encode|'
+             r'@synchronized|@try|@throw|@catch|@finally|@end|@property|'
+             r'@synthesize|@dynamic|@for|@accessors|new)\b', Keyword),
+
+            (r'(int|long|float|short|double|char|unsigned|signed|void|'
+             r'id|BOOL|bool|boolean|IBOutlet|IBAction|SEL|@outlet|@action)\b',
+             Keyword.Type),
+
+            (r'(self|super)\b', Name.Builtin),
+
+            (r'(TRUE|YES|FALSE|NO|Nil|nil|NULL)\b', Keyword.Constant),
+            (r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant),
+            (r'(ABS|ASIN|ACOS|ATAN|ATAN2|SIN|COS|TAN|EXP|POW|CEIL|FLOOR|ROUND|'
+             r'MIN|MAX|RAND|SQRT|E|LN2|LN10|LOG2E|LOG10E|PI|PI2|PI_2|SQRT1_2|'
+             r'SQRT2)\b', Keyword.Constant),
+
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'Error|eval|isFinite|isNaN|parseFloat|parseInt|document|this|'
+             r'window)\b', Name.Builtin),
+
+            (r'([$a-zA-Z_]\w*)(' + _ws + r')(?=\()',
+             bygroups(Name.Function, using(this))),
+
+            (r'[$a-zA-Z_]\w*', Name),
+        ],
+        'classname': [
+            # interface definition that inherits
+            (r'([a-zA-Z_]\w*)(' + _ws + r':' + _ws +
+             r')([a-zA-Z_]\w*)?',
+             bygroups(Name.Class, using(this), Name.Class), '#pop'),
+            # interface definition for a category
+            (r'([a-zA-Z_]\w*)(' + _ws + r'\()([a-zA-Z_]\w*)(\))',
+             bygroups(Name.Class, using(this), Name.Label, Text), '#pop'),
+            # simple interface / implementation
+            (r'([a-zA-Z_]\w*)', Name.Class, '#pop'),
+        ],
+        'forward_classname': [
+            (r'([a-zA-Z_]\w*)(\s*,\s*)',
+             bygroups(Name.Class, Text), '#push'),
+            (r'([a-zA-Z_]\w*)(\s*;?)',
+             bygroups(Name.Class, Text), '#pop'),
+        ],
+        'function_signature': [
+            include('whitespace'),
+
+            # start of a selector w/ parameters
+            (r'(\(' + _ws + r')'                # open paren
+             r'([a-zA-Z_]\w+)'                  # return type
+             r'(' + _ws + r'\)' + _ws + r')'    # close paren
+             r'([$a-zA-Z_]\w+' + _ws + r':)',   # function name
+             bygroups(using(this), Keyword.Type, using(this),
+                      Name.Function), 'function_parameters'),
+
+            # no-param function
+            (r'(\(' + _ws + r')'                # open paren
+             r'([a-zA-Z_]\w+)'                  # return type
+             r'(' + _ws + r'\)' + _ws + r')'    # close paren
+             r'([$a-zA-Z_]\w+)',                # function name
+             bygroups(using(this), Keyword.Type, using(this),
+                      Name.Function), "#pop"),
+
+            # no return type given, start of a selector w/ parameters
+            (r'([$a-zA-Z_]\w+' + _ws + r':)',   # function name
+             bygroups(Name.Function), 'function_parameters'),
+
+            # no return type given, no-param function
+            (r'([$a-zA-Z_]\w+)',                # function name
+             bygroups(Name.Function), "#pop"),
+
+            default('#pop'),
+        ],
+        'function_parameters': [
+            include('whitespace'),
+
+            # parameters
+            (r'(\(' + _ws + ')'                 # open paren
+             r'([^)]+)'                        # type
+             r'(' + _ws + r'\)' + _ws + r')'    # close paren
+             r'([$a-zA-Z_]\w+)',      # param name
+             bygroups(using(this), Keyword.Type, using(this), Text)),
+
+            # one piece of a selector name
+            (r'([$a-zA-Z_]\w+' + _ws + r':)',   # function name
+             Name.Function),
+
+            # smallest possible selector piece
+            (r'(:)', Name.Function),
+
+            # var args
+            (r'(,' + _ws + r'\.\.\.)', using(this)),
+
+            # param name
+            (r'([$a-zA-Z_]\w+)', Text),
+        ],
+        'expression': [
+            (r'([$a-zA-Z_]\w*)(\()', bygroups(Name.Function,
+                                              Punctuation)),
+            (r'(\))', Punctuation, "#pop"),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search('^\s*@import\s+[<"]', text, re.MULTILINE):
+            # special directive found in most Objective-J files
+            return True
+        return False
+
+
+class CoffeeScriptLexer(RegexLexer):
+    """
+    For `CoffeeScript`_ source code.
+
+    .. _CoffeeScript: http://coffeescript.org
+
+    .. versionadded:: 1.3
+    """
+
+    name = 'CoffeeScript'
+    aliases = ['coffee-script', 'coffeescript', 'coffee']
+    filenames = ['*.coffee']
+    mimetypes = ['text/coffeescript']
+
+
+    _operator_re = (
+        r'\+\+|~|&&|\band\b|\bor\b|\bis\b|\bisnt\b|\bnot\b|\?|:|'
+        r'\|\||\\(?=\n)|'
+        r'(<<|>>>?|==?(?!>)|!=?|=(?!>)|-(?!>)|[<>+*`%&\|\^/])=?')
+
+    flags = re.DOTALL
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'###[^#].*?###', Comment.Multiline),
+            (r'#(?!##[^#]).*?\n', Comment.Single),
+        ],
+        'multilineregex': [
+            (r'[^/#]+', String.Regex),
+            (r'///([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'#\{', String.Interpol, 'interpoling_string'),
+            (r'[/#]', String.Regex),
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'///', String.Regex, ('#pop', 'multilineregex')),
+            (r'/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            # This isn't really guarding against mishighlighting well-formed
+            # code, just the ability to infinite-loop between root and
+            # slashstartsregex.
+            (r'/', Operator),
+            default('#pop'),
+        ],
+        'root': [
+            include('commentsandwhitespace'),
+            (r'^(?=\s|/)', Text, 'slashstartsregex'),
+            (_operator_re, Operator, 'slashstartsregex'),
+            (r'(?:\([^()]*\))?\s*[=-]>', Name.Function, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(?<![.$])(for|own|in|of|while|until|'
+             r'loop|break|return|continue|'
+             r'switch|when|then|if|unless|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|super|'
+             r'extends|this|class|by)\b', Keyword, 'slashstartsregex'),
+            (r'(?<![.$])(true|false|yes|no|on|off|null|'
+             r'NaN|Infinity|undefined)\b',
+             Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'eval|isFinite|isNaN|parseFloat|parseInt|document|window)\b',
+             Name.Builtin),
+            (r'[$a-zA-Z_][\w.:$]*\s*[:=]\s', Name.Variable,
+             'slashstartsregex'),
+            (r'@[$a-zA-Z_][\w.:$]*\s*[:=]\s', Name.Variable.Instance,
+             'slashstartsregex'),
+            (r'@', Name.Other, 'slashstartsregex'),
+            (r'@?[$a-zA-Z_][\w$]*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            ('"""', String, 'tdqs'),
+            ("'''", String, 'tsqs'),
+            ('"', String, 'dqs'),
+            ("'", String, 'sqs'),
+        ],
+        'strings': [
+            (r'[^#\\\'"]+', String),
+            # note that all coffee script strings are multi-line.
+            # hashmarks, quotes and backslashes must be parsed one at a time
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\.|\'', String),  # double-quoted string don't need ' escapes
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r'#|\\.|"', String),  # single quoted strings don't need " escapses
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            (r'\\.|\'|"', String),  # no need to escape quotes in triple-string
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings'),
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            (r'#|\\.|\'|"', String),  # no need to escape quotes in triple-strings
+            include('strings')
+        ],
+    }
+
+
+class MaskLexer(RegexLexer):
+    """
+    For `Mask <http://github.com/atmajs/MaskJS>`__ markup.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Mask'
+    aliases = ['mask']
+    filenames = ['*.mask']
+    mimetypes = ['text/x-mask']
+
+    flags = re.MULTILINE | re.IGNORECASE | re.DOTALL
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'[{};>]', Punctuation),
+            (r"'''", String, 'string-trpl-single'),
+            (r'"""', String, 'string-trpl-double'),
+            (r"'", String, 'string-single'),
+            (r'"', String, 'string-double'),
+            (r'([\w-]+)', Name.Tag, 'node'),
+            (r'([^.#;{>\s]+)', Name.Class, 'node'),
+            (r'(#[\w-]+)', Name.Function, 'node'),
+            (r'(\.[\w-]+)', Name.Variable.Class, 'node')
+        ],
+        'string-base': [
+            (r'\\.', String.Escape),
+            (r'~\[', String.Interpol, 'interpolation'),
+            (r'.', String.Single),
+        ],
+        'string-single': [
+            (r"'", String.Single, '#pop'),
+            include('string-base')
+        ],
+        'string-double': [
+            (r'"', String.Single, '#pop'),
+            include('string-base')
+        ],
+        'string-trpl-single': [
+            (r"'''", String.Single, '#pop'),
+            include('string-base')
+        ],
+        'string-trpl-double': [
+            (r'"""', String.Single, '#pop'),
+            include('string-base')
+        ],
+        'interpolation': [
+            (r'\]', String.Interpol, '#pop'),
+            (r'\s*:', String.Interpol, 'expression'),
+            (r'\s*\w+:', Name.Other),
+            (r'[^\]]+', String.Interpol)
+        ],
+        'expression': [
+            (r'[^\]]+', using(JavascriptLexer), '#pop')
+        ],
+        'node': [
+            (r'\s+', Text),
+            (r'\.', Name.Variable.Class, 'node-class'),
+            (r'\#', Name.Function, 'node-id'),
+            (r'style[ \t]*=', Name.Attribute, 'node-attr-style-value'),
+            (r'[\w:-]+[ \t]*=', Name.Attribute, 'node-attr-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'[>{;]', Punctuation, '#pop')
+        ],
+        'node-class': [
+            (r'[\w-]+', Name.Variable.Class),
+            (r'~\[', String.Interpol, 'interpolation'),
+            default('#pop')
+        ],
+        'node-id': [
+            (r'[\w-]+', Name.Function),
+            (r'~\[', String.Interpol, 'interpolation'),
+            default('#pop')
+        ],
+        'node-attr-value': [
+            (r'\s+', Text),
+            (r'\w+', Name.Variable, '#pop'),
+            (r"'", String, 'string-single-pop2'),
+            (r'"', String, 'string-double-pop2'),
+            default('#pop')
+        ],
+        'node-attr-style-value': [
+            (r'\s+', Text),
+            (r"'", String.Single, 'css-single-end'),
+            (r'"', String.Single, 'css-double-end'),
+            include('node-attr-value')
+        ],
+        'css-base': [
+            (r'\s+', Text),
+            (r";", Punctuation),
+            (r"[\w\-]+\s*:", Name.Builtin)
+        ],
+        'css-single-end': [
+            include('css-base'),
+            (r"'", String.Single, '#pop:2'),
+            (r"[^;']+", Name.Entity)
+        ],
+        'css-double-end': [
+            include('css-base'),
+            (r'"', String.Single, '#pop:2'),
+            (r'[^;"]+', Name.Entity)
+        ],
+        'string-single-pop2': [
+            (r"'", String.Single, '#pop:2'),
+            include('string-base')
+        ],
+        'string-double-pop2': [
+            (r'"', String.Single, '#pop:2'),
+            include('string-base')
+        ],
+    }
+
+
+class EarlGreyLexer(RegexLexer):
+    """
+    For `Earl-Grey`_ source code.
+
+    .. _Earl-Grey: https://breuleux.github.io/earl-grey/
+
+    .. versionadded: 2.1
+    """
+
+    name = 'Earl Grey'
+    aliases = ['earl-grey', 'earlgrey', 'eg']
+    filenames = ['*.eg']
+    mimetypes = ['text/x-earl-grey']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            include('control'),
+            (r'[^\S\n]+', Text),
+            (r';;.*\n', Comment),
+            (r'[\[\]{}:(),;]', Punctuation),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            include('errors'),
+            (words((
+                'with', 'where', 'when', 'and', 'not', 'or', 'in',
+                'as', 'of', 'is'),
+                prefix=r'(?<=\s|\[)', suffix=r'(?![\w$\-])'),
+             Operator.Word),
+            (r'[*@]?->', Name.Function),
+            (r'[+\-*/~^<>%&|?!@#.]*=', Operator.Word),
+            (r'\.{2,3}', Operator.Word),  # Range Operator
+            (r'([+*/~^<>&|?!]+)|([#\-](?=\s))|@@+(?=\s)|=+', Operator),
+            (r'(?<![\w$\-])(var|let)(?:[^\w$])', Keyword.Declaration),
+            include('keywords'),
+            include('builtins'),
+            include('assignment'),
+            (r'''(?x)
+                (?:()([a-zA-Z$_](?:[\w$\-]*[\w$])?)|
+                   (?<=[\s{\[(])(\.)([a-zA-Z$_](?:[\w$\-]*[\w$])?))
+                (?=.*%)''',
+             bygroups(Punctuation, Name.Tag, Punctuation, Name.Class.Start), 'dbs'),
+            (r'[rR]?`', String.Backtick, 'bt'),
+            (r'[rR]?```', String.Backtick, 'tbt'),
+            (r'(?<=[\s\[{(,;])\.([a-zA-Z$_](?:[\w$\-]*[\w$])?)'
+             r'(?=[\s\]}),;])', String.Symbol),
+            include('nested'),
+            (r'(?:[rR]|[rR]\.[gmi]{1,3})?"', String, combined('stringescape', 'dqs')),
+            (r'(?:[rR]|[rR]\.[gmi]{1,3})?\'', String, combined('stringescape', 'sqs')),
+            (r'"""', String, combined('stringescape', 'tdqs')),
+            include('tuple'),
+            include('import_paths'),
+            include('name'),
+            include('numbers'),
+        ],
+        'dbs': [
+            (r'(\.)([a-zA-Z$_](?:[\w$\-]*[\w$])?)(?=[.\[\s])',
+             bygroups(Punctuation, Name.Class.DBS)),
+            (r'(\[)([\^#][a-zA-Z$_](?:[\w$\-]*[\w$])?)(\])',
+             bygroups(Punctuation, Name.Entity.DBS, Punctuation)),
+            (r'\s+', Text),
+            (r'%', Operator.DBS, '#pop'),
+        ],
+        'import_paths': [
+            (r'(?<=[\s:;,])(\.{1,3}(?:[\w\-]*/)*)(\w(?:[\w\-]*\w)*)(?=[\s;,])',
+             bygroups(Text.Whitespace, Text)),
+        ],
+        'assignment': [
+            (r'(\.)?([a-zA-Z$_](?:[\w$\-]*[\w$])?)'
+             r'(?=\s+[+\-*/~^<>%&|?!@#.]*\=\s)',
+             bygroups(Punctuation, Name.Variable))
+        ],
+        'errors': [
+            (words(('Error', 'TypeError', 'ReferenceError'),
+                   prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$.])'),
+             Name.Exception),
+            (r'''(?x)
+                (?<![\w$])
+                E\.[\w$](?:[\w$\-]*[\w$])?
+                (?:\.[\w$](?:[\w$\-]*[\w$])?)*
+                (?=[({\[?!\s])''',
+             Name.Exception),
+        ],
+        'control': [
+            (r'''(?x)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?!\n)\s+
+                (?!and|as|each\*|each|in|is|mod|of|or|when|where|with)
+                (?=(?:[+\-*/~^<>%&|?!@#.])?[a-zA-Z$_](?:[\w$-]*[\w$])?)''',
+             Keyword.Control),
+            (r'([a-zA-Z$_](?:[\w$-]*[\w$])?)(?!\n)\s+(?=[\'"\d{\[(])',
+             Keyword.Control),
+            (r'''(?x)
+                (?:
+                    (?<=[%=])|
+                    (?<=[=\-]>)|
+                    (?<=with|each|with)|
+                    (?<=each\*|where)
+                )(\s+)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)(:)''',
+             bygroups(Text, Keyword.Control, Punctuation)),
+            (r'''(?x)
+                (?<![+\-*/~^<>%&|?!@#.])(\s+)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)(:)''',
+             bygroups(Text, Keyword.Control, Punctuation)),
+        ],
+        'nested': [
+            (r'''(?x)
+                (?<=[\w$\]})])(\.)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?=\s+with(?:\s|\n))''',
+             bygroups(Punctuation, Name.Function)),
+            (r'''(?x)
+                (?<!\s)(\.)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?=[}\]).,;:\s])''',
+             bygroups(Punctuation, Name.Field)),
+            (r'''(?x)
+                (?<=[\w$\]})])(\.)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?=[\[{(:])''',
+             bygroups(Punctuation, Name.Function)),
+        ],
+        'keywords': [
+            (words((
+                'each', 'each*', 'mod', 'await', 'break', 'chain',
+                'continue', 'elif', 'expr-value', 'if', 'match',
+                'return', 'yield', 'pass', 'else', 'require', 'var',
+                'let', 'async', 'method', 'gen'),
+                prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$.])'),
+             Keyword.Pseudo),
+            (words(('this', 'self', '@'),
+                   prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$])'),
+             Keyword.Constant),
+            (words((
+                'Function', 'Object', 'Array', 'String', 'Number',
+                'Boolean', 'ErrorFactory', 'ENode', 'Promise'),
+                prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$])'),
+             Keyword.Type),
+        ],
+        'builtins': [
+            (words((
+                'send', 'object', 'keys', 'items', 'enumerate', 'zip',
+                'product', 'neighbours', 'predicate', 'equal',
+                'nequal', 'contains', 'repr', 'clone', 'range',
+                'getChecker', 'get-checker', 'getProperty', 'get-property',
+                'getProjector', 'get-projector', 'consume', 'take',
+                'promisify', 'spawn', 'constructor'),
+                prefix=r'(?<![\w\-#.])', suffix=r'(?![\w\-.])'),
+             Name.Builtin),
+            (words((
+                'true', 'false', 'null', 'undefined'),
+                prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$.])'),
+             Name.Constant),
+        ],
+        'name': [
+            (r'@([a-zA-Z$_](?:[\w$-]*[\w$])?)', Name.Variable.Instance),
+            (r'([a-zA-Z$_](?:[\w$-]*[\w$])?)(\+\+|\-\-)?',
+             bygroups(Name.Symbol, Operator.Word))
+        ],
+        'tuple': [
+            (r'#[a-zA-Z_][\w\-]*(?=[\s{(,;])', Name.Namespace)
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, '#pop'),
+            include('root')
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings': [
+            (r'[^\\\'"]', String),
+            (r'[\'"\\]', String),
+            (r'\n', String)  # All strings are multiline in EG
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),
+            (r'\{', String.Interpol, 'interpoling_string'),
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+        ],
+        'bt': [
+            (r'`', String.Backtick, '#pop'),
+            (r'(?<!`)\n', String.Backtick),
+            (r'\^=?', String.Escape),
+            (r'.+', String.Backtick),
+        ],
+        'tbt': [
+            (r'```', String.Backtick, '#pop'),
+            (r'\n', String.Backtick),
+            (r'\^=?', String.Escape),
+            (r'[^`]+', String.Backtick),
+        ],
+        'numbers': [
+            (r'\d+\.(?!\.)\d*([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'8r[0-7]+', Number.Oct),
+            (r'2r[01]+', Number.Bin),
+            (r'16r[a-fA-F0-9]+', Number.Hex),
+            (r'([3-79]|[12][0-9]|3[0-6])r[a-zA-Z\d]+(\.[a-zA-Z\d]+)?', Number.Radix),
+            (r'\d+', Number.Integer)
+        ],
+    }
+
+class JuttleLexer(RegexLexer):
+    """
+    For `Juttle`_ source code.
+
+    .. _Juttle: https://github.com/juttle/juttle
+
+    """
+
+    name = 'Juttle'
+    aliases = ['juttle', 'juttle']
+    filenames = ['*.juttle']
+    mimetypes = ['application/juttle', 'application/x-juttle',
+                 'text/x-juttle', 'text/juttle']
+
+    flags = re.DOTALL | re.UNICODE | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r':\d{2}:\d{2}:\d{2}(\.\d*)?:', String.Moment),
+            (r':(now|beginning|end|forever|yesterday|today|tomorrow|(\d+(\.\d*)?|\.\d+)(ms|[smhdwMy])?):', String.Moment),
+            (r':\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d*)?)?(Z|[+-]\d{2}:\d{2}|[+-]\d{4})?:', String.Moment),
+            (r':((\d+(\.\d*)?|\.\d+)[ ]+)?(millisecond|second|minute|hour|day|week|month|year)[s]?'
+             r'(([ ]+and[ ]+(\d+[ ]+)?(millisecond|second|minute|hour|day|week|month|year)[s]?)'
+             r'|[ ]+(ago|from[ ]+now))*:', String.Moment),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(import|return|continue|if|else)\b', Keyword, 'slashstartsregex'),
+            (r'(var|const|function|reducer|sub|input)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(batch|emit|filter|head|join|keep|pace|pass|put|read|reduce|remove|'
+             r'sequence|skip|sort|split|tail|unbatch|uniq|view|write)\b', Keyword.Reserved),
+            (r'(true|false|null|Infinity)\b', Keyword.Constant),
+            (r'(Array|Date|Juttle|Math|Number|Object|RegExp|String)\b', Name.Builtin),
+            (JS_IDENT, Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single)
+        ]
+
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/roboconf.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/roboconf.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/roboconf.py	(revision 1126)
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.roboconf
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Roboconf DSL.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, re
+from pygments.token import Text, Operator, Keyword, Name, Comment
+
+__all__ = ['RoboconfGraphLexer', 'RoboconfInstancesLexer']
+
+
+class RoboconfGraphLexer(RegexLexer):
+    """
+    Lexer for `Roboconf <http://roboconf.net/en/roboconf.html>`_ graph files.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Roboconf Graph'
+    aliases = ['roboconf-graph']
+    filenames = ['*.graph']
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+            # Skip white spaces
+            (r'\s+', Text),
+
+            # There is one operator
+            (r'=', Operator),
+
+            # Keywords
+            (words(('facet', 'import'), suffix=r'\s*\b', prefix=r'\b'), Keyword),
+            (words((
+                'installer', 'extends', 'exports', 'imports', 'facets',
+                'children'), suffix=r'\s*:?', prefix=r'\b'), Name),
+
+            # Comments
+            (r'#.*\n', Comment),
+
+            # Default
+            (r'[^#]', Text),
+            (r'.*\n', Text)
+        ]
+    }
+
+
+class RoboconfInstancesLexer(RegexLexer):
+    """
+    Lexer for `Roboconf <http://roboconf.net/en/roboconf.html>`_ instances files.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Roboconf Instances'
+    aliases = ['roboconf-instances']
+    filenames = ['*.instances']
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+
+            # Skip white spaces
+            (r'\s+', Text),
+
+            # Keywords
+            (words(('instance of', 'import'), suffix=r'\s*\b', prefix=r'\b'), Keyword),
+            (words(('name', 'count'), suffix=r's*:?', prefix=r'\b'), Name),
+            (r'\s*[\w.-]+\s*:', Name),
+
+            # Comments
+            (r'#.*\n', Comment),
+
+            # Default
+            (r'[^#]', Text),
+            (r'.*\n', Text)
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/felix.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/felix.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/felix.py	(revision 1126)
@@ -0,0 +1,273 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.felix
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Felix language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, default, words, \
+    combined
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['FelixLexer']
+
+
+class FelixLexer(RegexLexer):
+    """
+    For `Felix <http://www.felix-lang.org>`_ source code.
+
+    .. versionadded:: 1.2
+    """
+
+    name = 'Felix'
+    aliases = ['felix', 'flx']
+    filenames = ['*.flx', '*.flxh']
+    mimetypes = ['text/x-felix']
+
+    preproc = (
+        'elif', 'else', 'endif', 'if', 'ifdef', 'ifndef',
+    )
+
+    keywords = (
+        '_', '_deref', 'all', 'as',
+        'assert', 'attempt', 'call', 'callback', 'case', 'caseno', 'cclass',
+        'code', 'compound', 'ctypes', 'do', 'done', 'downto', 'elif', 'else',
+        'endattempt', 'endcase', 'endif', 'endmatch', 'enum', 'except',
+        'exceptions', 'expect', 'finally', 'for', 'forall', 'forget', 'fork',
+        'functor', 'goto', 'ident', 'if', 'incomplete', 'inherit', 'instance',
+        'interface', 'jump', 'lambda', 'loop', 'match', 'module', 'namespace',
+        'new', 'noexpand', 'nonterm', 'obj', 'of', 'open', 'parse', 'raise',
+        'regexp', 'reglex', 'regmatch', 'rename', 'return', 'the', 'then',
+        'to', 'type', 'typecase', 'typedef', 'typematch', 'typeof', 'upto',
+        'when', 'whilst', 'with', 'yield',
+    )
+
+    keyword_directives = (
+        '_gc_pointer', '_gc_type', 'body', 'comment', 'const', 'export',
+        'header', 'inline', 'lval', 'macro', 'noinline', 'noreturn',
+        'package', 'private', 'pod', 'property', 'public', 'publish',
+        'requires', 'todo', 'virtual', 'use',
+    )
+
+    keyword_declarations = (
+        'def', 'let', 'ref', 'val', 'var',
+    )
+
+    keyword_types = (
+        'unit', 'void', 'any', 'bool',
+        'byte',  'offset',
+        'address', 'caddress', 'cvaddress', 'vaddress',
+        'tiny', 'short', 'int', 'long', 'vlong',
+        'utiny', 'ushort', 'vshort', 'uint', 'ulong', 'uvlong',
+        'int8', 'int16', 'int32', 'int64',
+        'uint8', 'uint16', 'uint32', 'uint64',
+        'float', 'double', 'ldouble',
+        'complex', 'dcomplex', 'lcomplex',
+        'imaginary', 'dimaginary', 'limaginary',
+        'char', 'wchar', 'uchar',
+        'charp', 'charcp', 'ucharp', 'ucharcp',
+        'string', 'wstring', 'ustring',
+        'cont',
+        'array', 'varray', 'list',
+        'lvalue', 'opt', 'slice',
+    )
+
+    keyword_constants = (
+        'false', 'true',
+    )
+
+    operator_words = (
+        'and', 'not', 'in', 'is', 'isin', 'or', 'xor',
+    )
+
+    name_builtins = (
+        '_svc', 'while',
+    )
+
+    name_pseudo = (
+        'root', 'self', 'this',
+    )
+
+    decimal_suffixes = '([tTsSiIlLvV]|ll|LL|([iIuU])(8|16|32|64))?'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # Keywords
+            (words(('axiom', 'ctor', 'fun', 'gen', 'proc', 'reduce',
+                    'union'), suffix=r'\b'),
+             Keyword, 'funcname'),
+            (words(('class', 'cclass', 'cstruct', 'obj', 'struct'), suffix=r'\b'),
+             Keyword, 'classname'),
+            (r'(instance|module|typeclass)\b', Keyword, 'modulename'),
+
+            (words(keywords, suffix=r'\b'), Keyword),
+            (words(keyword_directives, suffix=r'\b'), Name.Decorator),
+            (words(keyword_declarations, suffix=r'\b'), Keyword.Declaration),
+            (words(keyword_types, suffix=r'\b'), Keyword.Type),
+            (words(keyword_constants, suffix=r'\b'), Keyword.Constant),
+
+            # Operators
+            include('operators'),
+
+            # Float Literal
+            # -- Hex Float
+            (r'0[xX]([0-9a-fA-F_]*\.[0-9a-fA-F_]+|[0-9a-fA-F_]+)'
+             r'[pP][+\-]?[0-9_]+[lLfFdD]?', Number.Float),
+            # -- DecimalFloat
+            (r'[0-9_]+(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*|[eE][+\-]?[0-9_]+)[lLfFdD]?', Number.Float),
+            (r'\.(0|[1-9][0-9_]*)([eE][+\-]?[0-9_]+)?[lLfFdD]?',
+             Number.Float),
+
+            # IntegerLiteral
+            # -- Binary
+            (r'0[Bb][01_]+%s' % decimal_suffixes, Number.Bin),
+            # -- Octal
+            (r'0[0-7_]+%s' % decimal_suffixes, Number.Oct),
+            # -- Hexadecimal
+            (r'0[xX][0-9a-fA-F_]+%s' % decimal_suffixes, Number.Hex),
+            # -- Decimal
+            (r'(0|[1-9][0-9_]*)%s' % decimal_suffixes, Number.Integer),
+
+            # Strings
+            ('([rR][cC]?|[cC][rR])"""', String, 'tdqs'),
+            ("([rR][cC]?|[cC][rR])'''", String, 'tsqs'),
+            ('([rR][cC]?|[cC][rR])"', String, 'dqs'),
+            ("([rR][cC]?|[cC][rR])'", String, 'sqs'),
+            ('[cCfFqQwWuU]?"""', String, combined('stringescape', 'tdqs')),
+            ("[cCfFqQwWuU]?'''", String, combined('stringescape', 'tsqs')),
+            ('[cCfFqQwWuU]?"', String, combined('stringescape', 'dqs')),
+            ("[cCfFqQwWuU]?'", String, combined('stringescape', 'sqs')),
+
+            # Punctuation
+            (r'[\[\]{}:(),;?]', Punctuation),
+
+            # Labels
+            (r'[a-zA-Z_]\w*:>', Name.Label),
+
+            # Identifiers
+            (r'(%s)\b' % '|'.join(name_builtins), Name.Builtin),
+            (r'(%s)\b' % '|'.join(name_pseudo), Name.Builtin.Pseudo),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'whitespace': [
+            (r'\n', Text),
+            (r'\s+', Text),
+
+            include('comment'),
+
+            # Preprocessor
+            (r'#\s*if\s+0', Comment.Preproc, 'if0'),
+            (r'#', Comment.Preproc, 'macro'),
+        ],
+        'operators': [
+            (r'(%s)\b' % '|'.join(operator_words), Operator.Word),
+            (r'!=|==|<<|>>|\|\||&&|[-~+/*%=<>&^|.$]', Operator),
+        ],
+        'comment': [
+            (r'//(.*?)\n', Comment.Single),
+            (r'/[*]', Comment.Multiline, 'comment2'),
+        ],
+        'comment2': [
+            (r'[^/*]', Comment.Multiline),
+            (r'/[*]', Comment.Multiline, '#push'),
+            (r'[*]/', Comment.Multiline, '#pop'),
+            (r'[/*]', Comment.Multiline),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment, '#push'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment, '#pop'),
+            (r'.*?\n', Comment),
+        ],
+        'macro': [
+            include('comment'),
+            (r'(import|include)(\s+)(<[^>]*?>)',
+             bygroups(Comment.Preproc, Text, String), '#pop'),
+            (r'(import|include)(\s+)("[^"]*?")',
+             bygroups(Comment.Preproc, Text, String), '#pop'),
+            (r"(import|include)(\s+)('[^']*?')",
+             bygroups(Comment.Preproc, Text, String), '#pop'),
+            (r'[^/\n]+', Comment.Preproc),
+            # (r'/[*](.|\n)*?[*]/', Comment),
+            # (r'//.*?\n', Comment, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'funcname': [
+            include('whitespace'),
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop'),
+            # anonymous functions
+            (r'(?=\()', Text, '#pop'),
+        ],
+        'classname': [
+            include('whitespace'),
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            # anonymous classes
+            (r'(?=\{)', Text, '#pop'),
+        ],
+        'modulename': [
+            include('whitespace'),
+            (r'\[', Punctuation, ('modulename2', 'tvarlist')),
+            default('modulename2'),
+        ],
+        'modulename2': [
+            include('whitespace'),
+            (r'([a-zA-Z_]\w*)', Name.Namespace, '#pop:2'),
+        ],
+        'tvarlist': [
+            include('whitespace'),
+            include('operators'),
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'(with|where)\b', Keyword),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings': [
+            (r'%(\([a-zA-Z0-9]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            (r'[^\\\'"%\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'%', String)
+            # newlines are an error (use "nl" state)
+        ],
+        'nl': [
+            (r'\n', String)
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            # included here again for raw strings
+            (r'\\\\|\\"|\\\n', String.Escape),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            # included here again for raw strings
+            (r"\\\\|\\'|\\\n", String.Escape),
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/idl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/idl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/idl.py	(revision 1126)
@@ -0,0 +1,270 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.idl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for IDL.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, Number, String
+
+__all__ = ['IDLLexer']
+
+
+class IDLLexer(RegexLexer):
+    """
+    Pygments Lexer for IDL (Interactive Data Language).
+
+    .. versionadded:: 1.6
+    """
+    name = 'IDL'
+    aliases = ['idl']
+    filenames = ['*.pro']
+    mimetypes = ['text/idl']
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    _RESERVED = (
+        'and', 'begin', 'break', 'case', 'common', 'compile_opt',
+        'continue', 'do', 'else', 'end', 'endcase', 'elseelse',
+        'endfor', 'endforeach', 'endif', 'endrep', 'endswitch',
+        'endwhile', 'eq', 'for', 'foreach', 'forward_function',
+        'function', 'ge', 'goto', 'gt', 'if', 'inherits', 'le',
+        'lt', 'mod', 'ne', 'not', 'of', 'on_ioerror', 'or', 'pro',
+        'repeat', 'switch', 'then', 'until', 'while', 'xor')
+    """Reserved words from: http://www.exelisvis.com/docs/reswords.html"""
+
+    _BUILTIN_LIB = (
+        'abs', 'acos', 'adapt_hist_equal', 'alog', 'alog10',
+        'amoeba', 'annotate', 'app_user_dir', 'app_user_dir_query',
+        'arg_present', 'array_equal', 'array_indices', 'arrow',
+        'ascii_template', 'asin', 'assoc', 'atan', 'axis',
+        'a_correlate', 'bandpass_filter', 'bandreject_filter',
+        'barplot', 'bar_plot', 'beseli', 'beselj', 'beselk',
+        'besely', 'beta', 'bilinear', 'binary_template', 'bindgen',
+        'binomial', 'bin_date', 'bit_ffs', 'bit_population',
+        'blas_axpy', 'blk_con', 'box_cursor', 'breakpoint',
+        'broyden', 'butterworth', 'bytarr', 'byte', 'byteorder',
+        'bytscl', 'caldat', 'calendar', 'call_external',
+        'call_function', 'call_method', 'call_procedure', 'canny',
+        'catch', 'cd', 'cdf_\w*', 'ceil', 'chebyshev',
+        'check_math',
+        'chisqr_cvf', 'chisqr_pdf', 'choldc', 'cholsol', 'cindgen',
+        'cir_3pnt', 'close', 'cluster', 'cluster_tree', 'clust_wts',
+        'cmyk_convert', 'colorbar', 'colorize_sample',
+        'colormap_applicable', 'colormap_gradient',
+        'colormap_rotation', 'colortable', 'color_convert',
+        'color_exchange', 'color_quan', 'color_range_map', 'comfit',
+        'command_line_args', 'complex', 'complexarr', 'complexround',
+        'compute_mesh_normals', 'cond', 'congrid', 'conj',
+        'constrained_min', 'contour', 'convert_coord', 'convol',
+        'convol_fft', 'coord2to3', 'copy_lun', 'correlate', 'cos',
+        'cosh', 'cpu', 'cramer', 'create_cursor', 'create_struct',
+        'create_view', 'crossp', 'crvlength', 'cti_test',
+        'ct_luminance', 'cursor', 'curvefit', 'cvttobm', 'cv_coord',
+        'cw_animate', 'cw_animate_getp', 'cw_animate_load',
+        'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index',
+        'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel',
+        'cw_form', 'cw_fslider', 'cw_light_editor',
+        'cw_light_editor_get', 'cw_light_editor_set', 'cw_orient',
+        'cw_palette_editor', 'cw_palette_editor_get',
+        'cw_palette_editor_set', 'cw_pdmenu', 'cw_rgbslider',
+        'cw_tmpl', 'cw_zoom', 'c_correlate', 'dblarr', 'db_exists',
+        'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key',
+        'define_msgblk', 'define_msgblk_from_file', 'defroi',
+        'defsysv', 'delvar', 'dendrogram', 'dendro_plot', 'deriv',
+        'derivsig', 'determ', 'device', 'dfpmin', 'diag_matrix',
+        'dialog_dbconnect', 'dialog_message', 'dialog_pickfile',
+        'dialog_printersetup', 'dialog_printjob',
+        'dialog_read_image', 'dialog_write_image', 'digital_filter',
+        'dilate', 'dindgen', 'dissolve', 'dist', 'distance_measure',
+        'dlm_load', 'dlm_register', 'doc_library', 'double',
+        'draw_roi', 'edge_dog', 'efont', 'eigenql', 'eigenvec',
+        'ellipse', 'elmhes', 'emboss', 'empty', 'enable_sysrtn',
+        'eof', 'eos_\w*', 'erase', 'erf', 'erfc', 'erfcx',
+        'erode', 'errorplot', 'errplot', 'estimator_filter',
+        'execute', 'exit', 'exp', 'expand', 'expand_path', 'expint',
+        'extrac', 'extract_slice', 'factorial', 'fft', 'filepath',
+        'file_basename', 'file_chmod', 'file_copy', 'file_delete',
+        'file_dirname', 'file_expand_path', 'file_info',
+        'file_lines', 'file_link', 'file_mkdir', 'file_move',
+        'file_poll_input', 'file_readlink', 'file_same',
+        'file_search', 'file_test', 'file_which', 'findgen',
+        'finite', 'fix', 'flick', 'float', 'floor', 'flow3',
+        'fltarr', 'flush', 'format_axis_values', 'free_lun',
+        'fstat', 'fulstr', 'funct', 'fv_test', 'fx_root',
+        'fz_roots', 'f_cvf', 'f_pdf', 'gamma', 'gamma_ct',
+        'gauss2dfit', 'gaussfit', 'gaussian_function', 'gaussint',
+        'gauss_cvf', 'gauss_pdf', 'gauss_smooth', 'getenv',
+        'getwindows', 'get_drive_list', 'get_dxf_objects',
+        'get_kbrd', 'get_login_info', 'get_lun', 'get_screen_size',
+        'greg2jul', 'grib_\w*', 'grid3', 'griddata',
+        'grid_input', 'grid_tps', 'gs_iter',
+        'h5[adfgirst]_\w*', 'h5_browser', 'h5_close',
+        'h5_create', 'h5_get_libversion', 'h5_open', 'h5_parse',
+        'hanning', 'hash', 'hdf_\w*', 'heap_free',
+        'heap_gc', 'heap_nosave', 'heap_refcount', 'heap_save',
+        'help', 'hilbert', 'histogram', 'hist_2d', 'hist_equal',
+        'hls', 'hough', 'hqr', 'hsv', 'h_eq_ct', 'h_eq_int',
+        'i18n_multibytetoutf8', 'i18n_multibytetowidechar',
+        'i18n_utf8tomultibyte', 'i18n_widechartomultibyte',
+        'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity',
+        'idlexbr_assistant', 'idlitsys_createtool', 'idl_base64',
+        'idl_validname', 'iellipse', 'igamma', 'igetcurrent',
+        'igetdata', 'igetid', 'igetproperty', 'iimage', 'image',
+        'image_cont', 'image_statistics', 'imaginary', 'imap',
+        'indgen', 'intarr', 'interpol', 'interpolate',
+        'interval_volume', 'int_2d', 'int_3d', 'int_tabulated',
+        'invert', 'ioctl', 'iopen', 'iplot', 'ipolygon',
+        'ipolyline', 'iputdata', 'iregister', 'ireset', 'iresolve',
+        'irotate', 'ir_filter', 'isa', 'isave', 'iscale',
+        'isetcurrent', 'isetproperty', 'ishft', 'isocontour',
+        'isosurface', 'isurface', 'itext', 'itranslate', 'ivector',
+        'ivolume', 'izoom', 'i_beta', 'journal', 'json_parse',
+        'json_serialize', 'jul2greg', 'julday', 'keyword_set',
+        'krig2d', 'kurtosis', 'kw_test', 'l64indgen', 'label_date',
+        'label_region', 'ladfit', 'laguerre', 'laplacian',
+        'la_choldc', 'la_cholmprove', 'la_cholsol', 'la_determ',
+        'la_eigenproblem', 'la_eigenql', 'la_eigenvec', 'la_elmhes',
+        'la_gm_linear_model', 'la_hqr', 'la_invert',
+        'la_least_squares', 'la_least_square_equality',
+        'la_linear_equation', 'la_ludc', 'la_lumprove', 'la_lusol',
+        'la_svd', 'la_tridc', 'la_trimprove', 'la_triql',
+        'la_trired', 'la_trisol', 'least_squares_filter', 'leefilt',
+        'legend', 'legendre', 'linbcg', 'lindgen', 'linfit',
+        'linkimage', 'list', 'll_arc_distance', 'lmfit', 'lmgr',
+        'lngamma', 'lnp_test', 'loadct', 'locale_get',
+        'logical_and', 'logical_or', 'logical_true', 'lon64arr',
+        'lonarr', 'long', 'long64', 'lsode', 'ludc', 'lumprove',
+        'lusol', 'lu_complex', 'machar', 'make_array', 'make_dll',
+        'make_rt', 'map', 'mapcontinents', 'mapgrid', 'map_2points',
+        'map_continents', 'map_grid', 'map_image', 'map_patch',
+        'map_proj_forward', 'map_proj_image', 'map_proj_info',
+        'map_proj_init', 'map_proj_inverse', 'map_set',
+        'matrix_multiply', 'matrix_power', 'max', 'md_test',
+        'mean', 'meanabsdev', 'mean_filter', 'median', 'memory',
+        'mesh_clip', 'mesh_decimate', 'mesh_issolid', 'mesh_merge',
+        'mesh_numtriangles', 'mesh_obj', 'mesh_smooth',
+        'mesh_surfacearea', 'mesh_validate', 'mesh_volume',
+        'message', 'min', 'min_curve_surf', 'mk_html_help',
+        'modifyct', 'moment', 'morph_close', 'morph_distance',
+        'morph_gradient', 'morph_hitormiss', 'morph_open',
+        'morph_thin', 'morph_tophat', 'multi', 'm_correlate',
+        'ncdf_\w*', 'newton', 'noise_hurl', 'noise_pick',
+        'noise_scatter', 'noise_slur', 'norm', 'n_elements',
+        'n_params', 'n_tags', 'objarr', 'obj_class', 'obj_destroy',
+        'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid',
+        'online_help', 'on_error', 'open', 'oplot', 'oploterr',
+        'parse_url', 'particle_trace', 'path_cache', 'path_sep',
+        'pcomp', 'plot', 'plot3d', 'ploterr', 'plots', 'plot_3dbox',
+        'plot_field', 'pnt_line', 'point_lun', 'polarplot',
+        'polar_contour', 'polar_surface', 'poly', 'polyfill',
+        'polyfillv', 'polygon', 'polyline', 'polyshade', 'polywarp',
+        'poly_2d', 'poly_area', 'poly_fit', 'popd', 'powell',
+        'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes',
+        'print', 'printd', 'product', 'profile', 'profiler',
+        'profiles', 'project_vol', 'psafm', 'pseudo',
+        'ps_show_fonts', 'ptrarr', 'ptr_free', 'ptr_new',
+        'ptr_valid', 'pushd', 'p_correlate', 'qgrid3', 'qhull',
+        'qromb', 'qromo', 'qsimp', 'query_ascii', 'query_bmp',
+        'query_csv', 'query_dicom', 'query_gif', 'query_image',
+        'query_jpeg', 'query_jpeg2000', 'query_mrsid', 'query_pict',
+        'query_png', 'query_ppm', 'query_srf', 'query_tiff',
+        'query_wav', 'radon', 'randomn', 'randomu', 'ranks',
+        'rdpix', 'read', 'reads', 'readu', 'read_ascii',
+        'read_binary', 'read_bmp', 'read_csv', 'read_dicom',
+        'read_gif', 'read_image', 'read_interfile', 'read_jpeg',
+        'read_jpeg2000', 'read_mrsid', 'read_pict', 'read_png',
+        'read_ppm', 'read_spr', 'read_srf', 'read_sylk',
+        'read_tiff', 'read_wav', 'read_wave', 'read_x11_bitmap',
+        'read_xwd', 'real_part', 'rebin', 'recall_commands',
+        'recon3', 'reduce_colors', 'reform', 'region_grow',
+        'register_cursor', 'regress', 'replicate',
+        'replicate_inplace', 'resolve_all', 'resolve_routine',
+        'restore', 'retall', 'return', 'reverse', 'rk4', 'roberts',
+        'rot', 'rotate', 'round', 'routine_filepath',
+        'routine_info', 'rs_test', 'r_correlate', 'r_test',
+        'save', 'savgol', 'scale3', 'scale3d', 'scope_level',
+        'scope_traceback', 'scope_varfetch', 'scope_varname',
+        'search2d', 'search3d', 'sem_create', 'sem_delete',
+        'sem_lock', 'sem_release', 'setenv', 'set_plot',
+        'set_shading', 'sfit', 'shade_surf', 'shade_surf_irr',
+        'shade_volume', 'shift', 'shift_diff', 'shmdebug', 'shmmap',
+        'shmunmap', 'shmvar', 'show3', 'showfont', 'simplex', 'sin',
+        'sindgen', 'sinh', 'size', 'skewness', 'skip_lun',
+        'slicer3', 'slide_image', 'smooth', 'sobel', 'socket',
+        'sort', 'spawn', 'spher_harm', 'sph_4pnt', 'sph_scat',
+        'spline', 'spline_p', 'spl_init', 'spl_interp', 'sprsab',
+        'sprsax', 'sprsin', 'sprstp', 'sqrt', 'standardize',
+        'stddev', 'stop', 'strarr', 'strcmp', 'strcompress',
+        'streamline', 'stregex', 'stretch', 'string', 'strjoin',
+        'strlen', 'strlowcase', 'strmatch', 'strmessage', 'strmid',
+        'strpos', 'strput', 'strsplit', 'strtrim', 'struct_assign',
+        'struct_hide', 'strupcase', 'surface', 'surfr', 'svdc',
+        'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace',
+        'symbol', 'systime', 's_test', 't3d', 'tag_names', 'tan',
+        'tanh', 'tek_color', 'temporary', 'tetra_clip',
+        'tetra_surface', 'tetra_volume', 'text', 'thin', 'threed',
+        'timegen', 'time_test2', 'tm_test', 'total', 'trace',
+        'transpose', 'triangulate', 'trigrid', 'triql', 'trired',
+        'trisol', 'tri_surf', 'truncate_lun', 'ts_coef', 'ts_diff',
+        'ts_fcast', 'ts_smooth', 'tv', 'tvcrs', 'tvlct', 'tvrd',
+        'tvscl', 'typename', 't_cvt', 't_pdf', 'uindgen', 'uint',
+        'uintarr', 'ul64indgen', 'ulindgen', 'ulon64arr', 'ulonarr',
+        'ulong', 'ulong64', 'uniq', 'unsharp_mask', 'usersym',
+        'value_locate', 'variance', 'vector', 'vector_field', 'vel',
+        'velovect', 'vert_t3d', 'voigt', 'voronoi', 'voxel_proj',
+        'wait', 'warp_tri', 'watershed', 'wdelete', 'wf_draw',
+        'where', 'widget_base', 'widget_button', 'widget_combobox',
+        'widget_control', 'widget_displaycontextmen', 'widget_draw',
+        'widget_droplist', 'widget_event', 'widget_info',
+        'widget_label', 'widget_list', 'widget_propertysheet',
+        'widget_slider', 'widget_tab', 'widget_table',
+        'widget_text', 'widget_tree', 'widget_tree_move',
+        'widget_window', 'wiener_filter', 'window', 'writeu',
+        'write_bmp', 'write_csv', 'write_gif', 'write_image',
+        'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict',
+        'write_png', 'write_ppm', 'write_spr', 'write_srf',
+        'write_sylk', 'write_tiff', 'write_wav', 'write_wave',
+        'wset', 'wshow', 'wtn', 'wv_applet', 'wv_cwt',
+        'wv_cw_wavelet', 'wv_denoise', 'wv_dwt', 'wv_fn_coiflet',
+        'wv_fn_daubechies', 'wv_fn_gaussian', 'wv_fn_haar',
+        'wv_fn_morlet', 'wv_fn_paul', 'wv_fn_symlet',
+        'wv_import_data', 'wv_import_wavelet', 'wv_plot3d_wps',
+        'wv_plot_multires', 'wv_pwt', 'wv_tool_denoise',
+        'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont',
+        'xinteranimate', 'xloadct', 'xmanager', 'xmng_tmpl',
+        'xmtool', 'xobjview', 'xobjview_rotate',
+        'xobjview_write_image', 'xpalette', 'xpcolor', 'xplot3d',
+        'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit',
+        'xvolume', 'xvolume_rotate', 'xvolume_write_image',
+        'xyouts', 'zoom', 'zoom_24')
+    """Functions from: http://www.exelisvis.com/docs/routines-1.html"""
+
+    tokens = {
+        'root': [
+            (r'^\s*;.*?\n', Comment.Singleline),
+            (words(_RESERVED, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(_BUILTIN_LIB, prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (r'\+=|-=|\^=|\*=|/=|#=|##=|<=|>=|=', Operator),
+            (r'\+\+|--|->|\+|-|##|#|\*|/|<|>|&&|\^|~|\|\|\?|:', Operator),
+            (r'\b(mod=|lt=|le=|eq=|ne=|ge=|gt=|not=|and=|or=|xor=)', Operator),
+            (r'\b(mod|lt|le|eq|ne|ge|gt|not|and|or|xor)\b', Operator),
+            (r'"[^\"]*"', String.Double),
+            (r"'[^\']*'", String.Single),
+            (r'\b[+\-]?([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)(D|E)?([+\-]?[0-9]+)?\b',
+             Number.Float),
+            (r'\b\'[+\-]?[0-9A-F]+\'X(U?(S?|L{1,2})|B)\b', Number.Hex),
+            (r'\b\'[+\-]?[0-7]+\'O(U?(S?|L{1,2})|B)\b', Number.Oct),
+            (r'\b[+\-]?[0-9]+U?L{1,2}\b', Number.Integer.Long),
+            (r'\b[+\-]?[0-9]+U?S?\b', Number.Integer),
+            (r'\b[+\-]?[0-9]+B\b', Number),
+            (r'.', Text),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/x10.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/x10.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/x10.py	(revision 1126)
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.x10
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the X10 programming language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['X10Lexer']
+
+class X10Lexer(RegexLexer):
+    """
+    For the X10 language.
+
+    .. versionadded:: 0.1
+    """
+
+    name = 'X10'
+    aliases = ['x10', 'xten']
+    filenames = ['*.x10']
+    mimetypes = ['text/x-x10']
+
+    keywords = (
+        'as', 'assert', 'async', 'at', 'athome', 'ateach', 'atomic',
+        'break', 'case', 'catch', 'class', 'clocked', 'continue',
+        'def', 'default', 'do', 'else', 'final', 'finally', 'finish',
+        'for', 'goto', 'haszero', 'here', 'if', 'import', 'in',
+        'instanceof', 'interface', 'isref', 'new', 'offer',
+        'operator', 'package', 'return', 'struct', 'switch', 'throw',
+        'try', 'type', 'val', 'var', 'when', 'while'
+    )
+
+    types = (
+        'void'
+    )
+
+    values = (
+        'false', 'null', 'self', 'super', 'this', 'true'
+    )
+
+    modifiers = (
+        'abstract', 'extends', 'implements', 'native', 'offers',
+        'private', 'property', 'protected', 'public', 'static',
+        'throws', 'transient'
+    )
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'\b(%s)\b' % '|'.join(keywords), Keyword),
+            (r'\b(%s)\b' % '|'.join(types), Keyword.Type),
+            (r'\b(%s)\b' % '|'.join(values), Keyword.Constant),
+            (r'\b(%s)\b' % '|'.join(modifiers), Keyword.Declaration),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+            (r'.', Text)
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/apl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/apl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/apl.py	(revision 1126)
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.apl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for APL.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['APLLexer']
+
+
+class APLLexer(RegexLexer):
+    """
+    A simple APL lexer.
+
+    .. versionadded:: 2.0
+    """
+    name = 'APL'
+    aliases = ['apl']
+    filenames = ['*.apl']
+
+    tokens = {
+        'root': [
+            # Whitespace
+            # ==========
+            (r'\s+', Text),
+            #
+            # Comment
+            # =======
+            # '⍝' is traditional; '#' is supported by GNU APL and NGN (but not Dyalog)
+            (u'[⍝#].*$', Comment.Single),
+            #
+            # Strings
+            # =======
+            (r'\'((\'\')|[^\'])*\'', String.Single),
+            (r'"(("")|[^"])*"', String.Double),  # supported by NGN APL
+            #
+            # Punctuation
+            # ===========
+            # This token type is used for diamond and parenthesis
+            # but not for bracket and ; (see below)
+            (u'[⋄◇()]', Punctuation),
+            #
+            # Array indexing
+            # ==============
+            # Since this token type is very important in APL, it is not included in
+            # the punctuation token type but rather in the following one
+            (r'[\[\];]', String.Regex),
+            #
+            # Distinguished names
+            # ===================
+            # following IBM APL2 standard
+            (u'⎕[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*', Name.Function),
+            #
+            # Labels
+            # ======
+            # following IBM APL2 standard
+            # (u'[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*:', Name.Label),
+            #
+            # Variables
+            # =========
+            # following IBM APL2 standard
+            (u'[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*', Name.Variable),
+            #
+            # Numbers
+            # =======
+            (u'¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞)'
+             u'([Jj]¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞))?',
+             Number),
+            #
+            # Operators
+            # ==========
+            (u'[\.\\\/⌿⍀¨⍣⍨⍠⍤∘]', Name.Attribute),  # closest token type
+            (u'[+\-×÷⌈⌊∣|⍳?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⌸⍯↗]',
+             Operator),
+            #
+            # Constant
+            # ========
+            (u'⍬', Name.Constant),
+            #
+            # Quad symbol
+            # ===========
+            (u'[⎕⍞]', Name.Variable.Global),
+            #
+            # Arrows left/right
+            # =================
+            (u'[←→]', Keyword.Declaration),
+            #
+            # D-Fn
+            # ====
+            (u'[⍺⍵⍶⍹∇:]', Name.Builtin.Pseudo),
+            (r'[{}]', Keyword.Type),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_postgres_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_postgres_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_postgres_builtins.py	(revision 1126)
@@ -0,0 +1,621 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._postgres_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Self-updating data files for PostgreSQL lexer.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+# Autogenerated: please edit them if you like wasting your time.
+
+KEYWORDS = (
+    'ABORT',
+    'ABSOLUTE',
+    'ACCESS',
+    'ACTION',
+    'ADD',
+    'ADMIN',
+    'AFTER',
+    'AGGREGATE',
+    'ALL',
+    'ALSO',
+    'ALTER',
+    'ALWAYS',
+    'ANALYSE',
+    'ANALYZE',
+    'AND',
+    'ANY',
+    'ARRAY',
+    'AS',
+    'ASC',
+    'ASSERTION',
+    'ASSIGNMENT',
+    'ASYMMETRIC',
+    'AT',
+    'ATTRIBUTE',
+    'AUTHORIZATION',
+    'BACKWARD',
+    'BEFORE',
+    'BEGIN',
+    'BETWEEN',
+    'BIGINT',
+    'BINARY',
+    'BIT',
+    'BOOLEAN',
+    'BOTH',
+    'BY',
+    'CACHE',
+    'CALLED',
+    'CASCADE',
+    'CASCADED',
+    'CASE',
+    'CAST',
+    'CATALOG',
+    'CHAIN',
+    'CHAR',
+    'CHARACTER',
+    'CHARACTERISTICS',
+    'CHECK',
+    'CHECKPOINT',
+    'CLASS',
+    'CLOSE',
+    'CLUSTER',
+    'COALESCE',
+    'COLLATE',
+    'COLLATION',
+    'COLUMN',
+    'COMMENT',
+    'COMMENTS',
+    'COMMIT',
+    'COMMITTED',
+    'CONCURRENTLY',
+    'CONFIGURATION',
+    'CONNECTION',
+    'CONSTRAINT',
+    'CONSTRAINTS',
+    'CONTENT',
+    'CONTINUE',
+    'CONVERSION',
+    'COPY',
+    'COST',
+    'CREATE',
+    'CROSS',
+    'CSV',
+    'CURRENT',
+    'CURRENT_CATALOG',
+    'CURRENT_DATE',
+    'CURRENT_ROLE',
+    'CURRENT_SCHEMA',
+    'CURRENT_TIME',
+    'CURRENT_TIMESTAMP',
+    'CURRENT_USER',
+    'CURSOR',
+    'CYCLE',
+    'DATA',
+    'DATABASE',
+    'DAY',
+    'DEALLOCATE',
+    'DEC',
+    'DECIMAL',
+    'DECLARE',
+    'DEFAULT',
+    'DEFAULTS',
+    'DEFERRABLE',
+    'DEFERRED',
+    'DEFINER',
+    'DELETE',
+    'DELIMITER',
+    'DELIMITERS',
+    'DESC',
+    'DICTIONARY',
+    'DISABLE',
+    'DISCARD',
+    'DISTINCT',
+    'DO',
+    'DOCUMENT',
+    'DOMAIN',
+    'DOUBLE',
+    'DROP',
+    'EACH',
+    'ELSE',
+    'ENABLE',
+    'ENCODING',
+    'ENCRYPTED',
+    'END',
+    'ENUM',
+    'ESCAPE',
+    'EVENT',
+    'EXCEPT',
+    'EXCLUDE',
+    'EXCLUDING',
+    'EXCLUSIVE',
+    'EXECUTE',
+    'EXISTS',
+    'EXPLAIN',
+    'EXTENSION',
+    'EXTERNAL',
+    'EXTRACT',
+    'FALSE',
+    'FAMILY',
+    'FETCH',
+    'FILTER',
+    'FIRST',
+    'FLOAT',
+    'FOLLOWING',
+    'FOR',
+    'FORCE',
+    'FOREIGN',
+    'FORWARD',
+    'FREEZE',
+    'FROM',
+    'FULL',
+    'FUNCTION',
+    'FUNCTIONS',
+    'GLOBAL',
+    'GRANT',
+    'GRANTED',
+    'GREATEST',
+    'GROUP',
+    'HANDLER',
+    'HAVING',
+    'HEADER',
+    'HOLD',
+    'HOUR',
+    'IDENTITY',
+    'IF',
+    'ILIKE',
+    'IMMEDIATE',
+    'IMMUTABLE',
+    'IMPLICIT',
+    'IN',
+    'INCLUDING',
+    'INCREMENT',
+    'INDEX',
+    'INDEXES',
+    'INHERIT',
+    'INHERITS',
+    'INITIALLY',
+    'INLINE',
+    'INNER',
+    'INOUT',
+    'INPUT',
+    'INSENSITIVE',
+    'INSERT',
+    'INSTEAD',
+    'INT',
+    'INTEGER',
+    'INTERSECT',
+    'INTERVAL',
+    'INTO',
+    'INVOKER',
+    'IS',
+    'ISNULL',
+    'ISOLATION',
+    'JOIN',
+    'KEY',
+    'LABEL',
+    'LANGUAGE',
+    'LARGE',
+    'LAST',
+    'LATERAL',
+    'LC_COLLATE',
+    'LC_CTYPE',
+    'LEADING',
+    'LEAKPROOF',
+    'LEAST',
+    'LEFT',
+    'LEVEL',
+    'LIKE',
+    'LIMIT',
+    'LISTEN',
+    'LOAD',
+    'LOCAL',
+    'LOCALTIME',
+    'LOCALTIMESTAMP',
+    'LOCATION',
+    'LOCK',
+    'MAPPING',
+    'MATCH',
+    'MATERIALIZED',
+    'MAXVALUE',
+    'MINUTE',
+    'MINVALUE',
+    'MODE',
+    'MONTH',
+    'MOVE',
+    'NAME',
+    'NAMES',
+    'NATIONAL',
+    'NATURAL',
+    'NCHAR',
+    'NEXT',
+    'NO',
+    'NONE',
+    'NOT',
+    'NOTHING',
+    'NOTIFY',
+    'NOTNULL',
+    'NOWAIT',
+    'NULL',
+    'NULLIF',
+    'NULLS',
+    'NUMERIC',
+    'OBJECT',
+    'OF',
+    'OFF',
+    'OFFSET',
+    'OIDS',
+    'ON',
+    'ONLY',
+    'OPERATOR',
+    'OPTION',
+    'OPTIONS',
+    'OR',
+    'ORDER',
+    'ORDINALITY',
+    'OUT',
+    'OUTER',
+    'OVER',
+    'OVERLAPS',
+    'OVERLAY',
+    'OWNED',
+    'OWNER',
+    'PARSER',
+    'PARTIAL',
+    'PARTITION',
+    'PASSING',
+    'PASSWORD',
+    'PLACING',
+    'PLANS',
+    'POLICY',
+    'POSITION',
+    'PRECEDING',
+    'PRECISION',
+    'PREPARE',
+    'PREPARED',
+    'PRESERVE',
+    'PRIMARY',
+    'PRIOR',
+    'PRIVILEGES',
+    'PROCEDURAL',
+    'PROCEDURE',
+    'PROGRAM',
+    'QUOTE',
+    'RANGE',
+    'READ',
+    'REAL',
+    'REASSIGN',
+    'RECHECK',
+    'RECURSIVE',
+    'REF',
+    'REFERENCES',
+    'REFRESH',
+    'REINDEX',
+    'RELATIVE',
+    'RELEASE',
+    'RENAME',
+    'REPEATABLE',
+    'REPLACE',
+    'REPLICA',
+    'RESET',
+    'RESTART',
+    'RESTRICT',
+    'RETURNING',
+    'RETURNS',
+    'REVOKE',
+    'RIGHT',
+    'ROLE',
+    'ROLLBACK',
+    'ROW',
+    'ROWS',
+    'RULE',
+    'SAVEPOINT',
+    'SCHEMA',
+    'SCROLL',
+    'SEARCH',
+    'SECOND',
+    'SECURITY',
+    'SELECT',
+    'SEQUENCE',
+    'SEQUENCES',
+    'SERIALIZABLE',
+    'SERVER',
+    'SESSION',
+    'SESSION_USER',
+    'SET',
+    'SETOF',
+    'SHARE',
+    'SHOW',
+    'SIMILAR',
+    'SIMPLE',
+    'SMALLINT',
+    'SNAPSHOT',
+    'SOME',
+    'STABLE',
+    'STANDALONE',
+    'START',
+    'STATEMENT',
+    'STATISTICS',
+    'STDIN',
+    'STDOUT',
+    'STORAGE',
+    'STRICT',
+    'STRIP',
+    'SUBSTRING',
+    'SYMMETRIC',
+    'SYSID',
+    'SYSTEM',
+    'TABLE',
+    'TABLES',
+    'TABLESPACE',
+    'TEMP',
+    'TEMPLATE',
+    'TEMPORARY',
+    'TEXT',
+    'THEN',
+    'TIME',
+    'TIMESTAMP',
+    'TO',
+    'TRAILING',
+    'TRANSACTION',
+    'TREAT',
+    'TRIGGER',
+    'TRIM',
+    'TRUE',
+    'TRUNCATE',
+    'TRUSTED',
+    'TYPE',
+    'TYPES',
+    'UNBOUNDED',
+    'UNCOMMITTED',
+    'UNENCRYPTED',
+    'UNION',
+    'UNIQUE',
+    'UNKNOWN',
+    'UNLISTEN',
+    'UNLOGGED',
+    'UNTIL',
+    'UPDATE',
+    'USER',
+    'USING',
+    'VACUUM',
+    'VALID',
+    'VALIDATE',
+    'VALIDATOR',
+    'VALUE',
+    'VALUES',
+    'VARCHAR',
+    'VARIADIC',
+    'VARYING',
+    'VERBOSE',
+    'VERSION',
+    'VIEW',
+    'VIEWS',
+    'VOLATILE',
+    'WHEN',
+    'WHERE',
+    'WHITESPACE',
+    'WINDOW',
+    'WITH',
+    'WITHIN',
+    'WITHOUT',
+    'WORK',
+    'WRAPPER',
+    'WRITE',
+    'XML',
+    'XMLATTRIBUTES',
+    'XMLCONCAT',
+    'XMLELEMENT',
+    'XMLEXISTS',
+    'XMLFOREST',
+    'XMLPARSE',
+    'XMLPI',
+    'XMLROOT',
+    'XMLSERIALIZE',
+    'YEAR',
+    'YES',
+    'ZONE',
+)
+
+DATATYPES = (
+    'bigint',
+    'bigserial',
+    'bit',
+    'bit varying',
+    'bool',
+    'boolean',
+    'box',
+    'bytea',
+    'char',
+    'character',
+    'character varying',
+    'cidr',
+    'circle',
+    'date',
+    'decimal',
+    'double precision',
+    'float4',
+    'float8',
+    'inet',
+    'int',
+    'int2',
+    'int4',
+    'int8',
+    'integer',
+    'interval',
+    'json',
+    'jsonb',
+    'line',
+    'lseg',
+    'macaddr',
+    'money',
+    'numeric',
+    'path',
+    'pg_lsn',
+    'point',
+    'polygon',
+    'real',
+    'serial',
+    'serial2',
+    'serial4',
+    'serial8',
+    'smallint',
+    'smallserial',
+    'text',
+    'time',
+    'timestamp',
+    'timestamptz',
+    'timetz',
+    'tsquery',
+    'tsvector',
+    'txid_snapshot',
+    'uuid',
+    'varbit',
+    'varchar',
+    'with time zone',
+    'without time zone',
+    'xml',
+)
+
+PSEUDO_TYPES = (
+    'any',
+    'anyelement',
+    'anyarray',
+    'anynonarray',
+    'anyenum',
+    'anyrange',
+    'cstring',
+    'internal',
+    'language_handler',
+    'fdw_handler',
+    'record',
+    'trigger',
+    'void',
+    'opaque',
+)
+
+# Remove 'trigger' from types
+PSEUDO_TYPES = tuple(sorted(set(PSEUDO_TYPES) - set(map(str.lower, KEYWORDS))))
+
+PLPGSQL_KEYWORDS = (
+    'ALIAS', 'CONSTANT', 'DIAGNOSTICS', 'ELSIF', 'EXCEPTION', 'EXIT',
+    'FOREACH', 'GET', 'LOOP', 'NOTICE', 'OPEN', 'PERFORM', 'QUERY', 'RAISE',
+    'RETURN', 'REVERSE', 'SQLSTATE', 'WHILE',
+)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import re
+    try:
+        from urllib import urlopen
+    except ImportError:
+        from urllib.request import urlopen
+
+    from pygments.util import format_lines
+
+    # One man's constant is another man's variable.
+    SOURCE_URL = 'https://github.com/postgres/postgres/raw/master'
+    KEYWORDS_URL = SOURCE_URL + '/doc/src/sgml/keywords.sgml'
+    DATATYPES_URL = SOURCE_URL + '/doc/src/sgml/datatype.sgml'
+
+    def update_myself():
+        data_file = list(urlopen(DATATYPES_URL))
+        datatypes = parse_datatypes(data_file)
+        pseudos = parse_pseudos(data_file)
+
+        keywords = parse_keywords(urlopen(KEYWORDS_URL))
+        update_consts(__file__, 'DATATYPES', datatypes)
+        update_consts(__file__, 'PSEUDO_TYPES', pseudos)
+        update_consts(__file__, 'KEYWORDS', keywords)
+
+    def parse_keywords(f):
+        kw = []
+        for m in re.finditer(
+                r'\s*<entry><token>([^<]+)</token></entry>\s*'
+                r'<entry>([^<]+)</entry>', f.read()):
+            kw.append(m.group(1))
+
+        if not kw:
+            raise ValueError('no keyword found')
+
+        kw.sort()
+        return kw
+
+    def parse_datatypes(f):
+        dt = set()
+        for line in f:
+            if '<sect1' in line:
+                break
+            if '<entry><type>' not in line:
+                continue
+
+            # Parse a string such as
+            # time [ (<replaceable>p</replaceable>) ] [ without time zone ]
+            # into types "time" and "without time zone"
+
+            # remove all the tags
+            line = re.sub("<replaceable>[^<]+</replaceable>", "", line)
+            line = re.sub("<[^>]+>", "", line)
+
+            # Drop the parts containing braces
+            for tmp in [t for tmp in line.split('[')
+                        for t in tmp.split(']') if "(" not in t]:
+                for t in tmp.split(','):
+                    t = t.strip()
+                    if not t: continue
+                    dt.add(" ".join(t.split()))
+
+        dt = list(dt)
+        dt.sort()
+        return dt
+
+    def parse_pseudos(f):
+        dt = []
+        re_start = re.compile(r'\s*<table id="datatype-pseudotypes-table">')
+        re_entry = re.compile(r'\s*<entry><type>([^<]+)</></entry>')
+        re_end = re.compile(r'\s*</table>')
+
+        f = iter(f)
+        for line in f:
+            if re_start.match(line) is not None:
+                break
+        else:
+            raise ValueError('pseudo datatypes table not found')
+
+        for line in f:
+            m = re_entry.match(line)
+            if m is not None:
+                dt.append(m.group(1))
+
+            if re_end.match(line) is not None:
+                break
+        else:
+            raise ValueError('end of pseudo datatypes table not found')
+
+        if not dt:
+            raise ValueError('pseudo datatypes not found')
+
+        return dt
+
+    def update_consts(filename, constname, content):
+        with open(filename) as f:
+            data = f.read()
+
+        # Line to start/end inserting
+        re_match = re.compile(r'^%s\s*=\s*\($.*?^\s*\)$' % constname, re.M | re.S)
+        m = re_match.search(data)
+        if not m:
+            raise ValueError('Could not find existing definition for %s' %
+                             (constname,))
+
+        new_block = format_lines(constname, content)
+        data = data[:m.start()] + new_block + data[m.end():]
+
+        with open(filename, 'w') as f:
+            f.write(data)
+
+    update_myself()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/oberon.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/oberon.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/oberon.py	(revision 1126)
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.oberon
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Oberon family languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['ComponentPascalLexer']
+
+
+class ComponentPascalLexer(RegexLexer):
+    """
+    For `Component Pascal <http://www.oberon.ch/pdf/CP-Lang.pdf>`_ source code.
+
+    .. versionadded:: 2.1
+    """
+    name = 'Component Pascal'
+    aliases = ['componentpascal', 'cp']
+    filenames = ['*.cp', '*.cps']
+    mimetypes = ['text/x-component-pascal']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            include('punctuation'),
+            include('numliterals'),
+            include('strings'),
+            include('operators'),
+            include('builtins'),
+            include('identifiers'),
+        ],
+        'whitespace': [
+            (r'\n+', Text),  # blank lines
+            (r'\s+', Text),  # whitespace
+        ],
+        'comments': [
+            (r'\(\*([^$].*?)\*\)', Comment.Multiline),
+            # TODO: nested comments (* (* ... *) ... (* ... *) *) not supported!
+        ],
+        'punctuation': [
+            (r'[()\[\]{},.:;|]', Punctuation),
+        ],
+        'numliterals': [
+            (r'[0-9A-F]+X\b', Number.Hex),                 # char code
+            (r'[0-9A-F]+[HL]\b', Number.Hex),              # hexadecimal number
+            (r'[0-9]+\.[0-9]+E[+-][0-9]+', Number.Float),  # real number
+            (r'[0-9]+\.[0-9]+', Number.Float),             # real number
+            (r'[0-9]+', Number.Integer),                   # decimal whole number
+        ],
+        'strings': [
+            (r"'[^\n']*'", String),  # single quoted string
+            (r'"[^\n"]*"', String),  # double quoted string
+        ],
+        'operators': [
+            # Arithmetic Operators
+            (r'[+-]', Operator),
+            (r'[*/]', Operator),
+            # Relational Operators
+            (r'[=#<>]', Operator),
+            # Dereferencing Operator
+            (r'\^', Operator),
+            # Logical AND Operator
+            (r'&', Operator),
+            # Logical NOT Operator
+            (r'~', Operator),
+            # Assignment Symbol
+            (r':=', Operator),
+            # Range Constructor
+            (r'\.\.', Operator),
+            (r'\$', Operator),
+        ],
+        'identifiers': [
+            (r'([a-zA-Z_$][\w$]*)', Name),
+        ],
+        'builtins': [
+            (words((
+                'ANYPTR', 'ANYREC', 'BOOLEAN', 'BYTE', 'CHAR', 'INTEGER', 'LONGINT',
+                'REAL', 'SET', 'SHORTCHAR', 'SHORTINT', 'SHORTREAL'
+                ), suffix=r'\b'), Keyword.Type),
+            (words((
+                'ABS', 'ABSTRACT', 'ARRAY', 'ASH', 'ASSERT', 'BEGIN', 'BITS', 'BY',
+                'CAP', 'CASE', 'CHR', 'CLOSE', 'CONST', 'DEC', 'DIV', 'DO', 'ELSE',
+                'ELSIF', 'EMPTY', 'END', 'ENTIER', 'EXCL', 'EXIT', 'EXTENSIBLE', 'FOR',
+                'HALT', 'IF', 'IMPORT', 'IN', 'INC', 'INCL', 'IS', 'LEN', 'LIMITED',
+                'LONG', 'LOOP', 'MAX', 'MIN', 'MOD', 'MODULE', 'NEW', 'ODD', 'OF',
+                'OR', 'ORD', 'OUT', 'POINTER', 'PROCEDURE', 'RECORD', 'REPEAT', 'RETURN',
+                'SHORT', 'SHORTCHAR', 'SHORTINT', 'SIZE', 'THEN', 'TYPE', 'TO', 'UNTIL',
+                'VAR', 'WHILE', 'WITH'
+                ), suffix=r'\b'), Keyword.Reserved),
+            (r'(TRUE|FALSE|NIL|INF)\b', Keyword.Constant),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_lua_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_lua_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_lua_builtins.py	(revision 1126)
@@ -0,0 +1,295 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._lua_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the names and modules of lua functions
+    It is able to re-generate itself, but for adding new functions you
+    probably have to add some callbacks (see function module_callbacks).
+
+    Do not edit the MODULES dict by hand.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+MODULES = {'basic': ('_G',
+           '_VERSION',
+           'assert',
+           'collectgarbage',
+           'dofile',
+           'error',
+           'getmetatable',
+           'ipairs',
+           'load',
+           'loadfile',
+           'next',
+           'pairs',
+           'pcall',
+           'print',
+           'rawequal',
+           'rawget',
+           'rawlen',
+           'rawset',
+           'select',
+           'setmetatable',
+           'tonumber',
+           'tostring',
+           'type',
+           'xpcall'),
+ 'bit32': ('bit32.arshift',
+           'bit32.band',
+           'bit32.bnot',
+           'bit32.bor',
+           'bit32.btest',
+           'bit32.bxor',
+           'bit32.extract',
+           'bit32.lrotate',
+           'bit32.lshift',
+           'bit32.replace',
+           'bit32.rrotate',
+           'bit32.rshift'),
+ 'coroutine': ('coroutine.create',
+               'coroutine.isyieldable',
+               'coroutine.resume',
+               'coroutine.running',
+               'coroutine.status',
+               'coroutine.wrap',
+               'coroutine.yield'),
+ 'debug': ('debug.debug',
+           'debug.gethook',
+           'debug.getinfo',
+           'debug.getlocal',
+           'debug.getmetatable',
+           'debug.getregistry',
+           'debug.getupvalue',
+           'debug.getuservalue',
+           'debug.sethook',
+           'debug.setlocal',
+           'debug.setmetatable',
+           'debug.setupvalue',
+           'debug.setuservalue',
+           'debug.traceback',
+           'debug.upvalueid',
+           'debug.upvaluejoin'),
+ 'io': ('io.close',
+        'io.flush',
+        'io.input',
+        'io.lines',
+        'io.open',
+        'io.output',
+        'io.popen',
+        'io.read',
+        'io.stderr',
+        'io.stdin',
+        'io.stdout',
+        'io.tmpfile',
+        'io.type',
+        'io.write'),
+ 'math': ('math.abs',
+          'math.acos',
+          'math.asin',
+          'math.atan',
+          'math.atan2',
+          'math.ceil',
+          'math.cos',
+          'math.cosh',
+          'math.deg',
+          'math.exp',
+          'math.floor',
+          'math.fmod',
+          'math.frexp',
+          'math.huge',
+          'math.ldexp',
+          'math.log',
+          'math.max',
+          'math.maxinteger',
+          'math.min',
+          'math.mininteger',
+          'math.modf',
+          'math.pi',
+          'math.pow',
+          'math.rad',
+          'math.random',
+          'math.randomseed',
+          'math.sin',
+          'math.sinh',
+          'math.sqrt',
+          'math.tan',
+          'math.tanh',
+          'math.tointeger',
+          'math.type',
+          'math.ult'),
+ 'modules': ('package.config',
+             'package.cpath',
+             'package.loaded',
+             'package.loadlib',
+             'package.path',
+             'package.preload',
+             'package.searchers',
+             'package.searchpath',
+             'require'),
+ 'os': ('os.clock',
+        'os.date',
+        'os.difftime',
+        'os.execute',
+        'os.exit',
+        'os.getenv',
+        'os.remove',
+        'os.rename',
+        'os.setlocale',
+        'os.time',
+        'os.tmpname'),
+ 'string': ('string.byte',
+            'string.char',
+            'string.dump',
+            'string.find',
+            'string.format',
+            'string.gmatch',
+            'string.gsub',
+            'string.len',
+            'string.lower',
+            'string.match',
+            'string.pack',
+            'string.packsize',
+            'string.rep',
+            'string.reverse',
+            'string.sub',
+            'string.unpack',
+            'string.upper'),
+ 'table': ('table.concat',
+           'table.insert',
+           'table.move',
+           'table.pack',
+           'table.remove',
+           'table.sort',
+           'table.unpack'),
+ 'utf8': ('utf8.char',
+          'utf8.charpattern',
+          'utf8.codepoint',
+          'utf8.codes',
+          'utf8.len',
+          'utf8.offset')}
+
+if __name__ == '__main__':  # pragma: no cover
+    import re
+    import sys
+
+    # urllib ends up wanting to import a module called 'math' -- if
+    # pygments/lexers is in the path, this ends badly.
+    for i in range(len(sys.path)-1, -1, -1):
+        if sys.path[i].endswith('/lexers'):
+            del sys.path[i]
+
+    try:
+        from urllib import urlopen
+    except ImportError:
+        from urllib.request import urlopen
+    import pprint
+
+    # you can't generally find out what module a function belongs to if you
+    # have only its name. Because of this, here are some callback functions
+    # that recognize if a gioven function belongs to a specific module
+    def module_callbacks():
+        def is_in_coroutine_module(name):
+            return name.startswith('coroutine.')
+
+        def is_in_modules_module(name):
+            if name in ['require', 'module'] or name.startswith('package'):
+                return True
+            else:
+                return False
+
+        def is_in_string_module(name):
+            return name.startswith('string.')
+
+        def is_in_table_module(name):
+            return name.startswith('table.')
+
+        def is_in_math_module(name):
+            return name.startswith('math')
+
+        def is_in_io_module(name):
+            return name.startswith('io.')
+
+        def is_in_os_module(name):
+            return name.startswith('os.')
+
+        def is_in_debug_module(name):
+            return name.startswith('debug.')
+
+        return {'coroutine': is_in_coroutine_module,
+                'modules': is_in_modules_module,
+                'string': is_in_string_module,
+                'table': is_in_table_module,
+                'math': is_in_math_module,
+                'io': is_in_io_module,
+                'os': is_in_os_module,
+                'debug': is_in_debug_module}
+
+
+
+    def get_newest_version():
+        f = urlopen('http://www.lua.org/manual/')
+        r = re.compile(r'^<A HREF="(\d\.\d)/">(Lua )?\1</A>')
+        for line in f:
+            m = r.match(line)
+            if m is not None:
+                return m.groups()[0]
+
+    def get_lua_functions(version):
+        f = urlopen('http://www.lua.org/manual/%s/' % version)
+        r = re.compile(r'^<A HREF="manual.html#pdf-(?!lua|LUA)([^:]+)">\1</A>')
+        functions = []
+        for line in f:
+            m = r.match(line)
+            if m is not None:
+                functions.append(m.groups()[0])
+        return functions
+
+    def get_function_module(name):
+        for mod, cb in module_callbacks().items():
+            if cb(name):
+                return mod
+        if '.' in name:
+            return name.split('.')[0]
+        else:
+            return 'basic'
+
+    def regenerate(filename, modules):
+        with open(filename) as fp:
+            content = fp.read()
+
+        header = content[:content.find('MODULES = {')]
+        footer = content[content.find("if __name__ == '__main__':"):]
+
+
+        with open(filename, 'w') as fp:
+            fp.write(header)
+            fp.write('MODULES = %s\n\n' % pprint.pformat(modules))
+            fp.write(footer)
+
+    def run():
+        version = get_newest_version()
+        functions = set()
+        for v in ('5.2', version):
+            print('> Downloading function index for Lua %s' % v)
+            f = get_lua_functions(v)
+            print('> %d functions found, %d new:' %
+                  (len(f), len(set(f) - functions)))
+            functions |= set(f)
+
+        functions = sorted(functions)
+
+        modules = {}
+        for full_function_name in functions:
+            print('>> %s' % full_function_name)
+            m = get_function_module(full_function_name)
+            modules.setdefault(m, []).append(full_function_name)
+        modules = {k: tuple(v) for k, v in modules.iteritems()}
+
+        regenerate(__file__, modules)
+
+    run()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/textedit.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/textedit.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/textedit.py	(revision 1126)
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.textedit
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for languages related to text processing.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from bisect import bisect
+
+from pygments.lexer import RegexLexer, include, default, bygroups, using, this
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+from pygments.lexers.python import PythonLexer
+
+__all__ = ['AwkLexer', 'VimLexer']
+
+
+class AwkLexer(RegexLexer):
+    """
+    For Awk scripts.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Awk'
+    aliases = ['awk', 'gawk', 'mawk', 'nawk']
+    filenames = ['*.awk']
+    mimetypes = ['application/x-awk']
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'#.*$', Comment.Single)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'\B', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|\|\||&&|in\b|\$|!?~|'
+             r'(\*\*|[-<>+*%\^/!=|])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(break|continue|do|while|exit|for|if|else|'
+             r'return)\b', Keyword, 'slashstartsregex'),
+            (r'function\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(atan2|cos|exp|int|log|rand|sin|sqrt|srand|gensub|gsub|index|'
+             r'length|match|split|sprintf|sub|substr|tolower|toupper|close|'
+             r'fflush|getline|next|nextfile|print|printf|strftime|systime|'
+             r'delete|system)\b', Keyword.Reserved),
+            (r'(ARGC|ARGIND|ARGV|BEGIN|CONVFMT|ENVIRON|END|ERRNO|FIELDWIDTHS|'
+             r'FILENAME|FNR|FS|IGNORECASE|NF|NR|OFMT|OFS|ORFS|RLENGTH|RS|'
+             r'RSTART|RT|SUBSEP)\b', Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+        ]
+    }
+
+
+class VimLexer(RegexLexer):
+    """
+    Lexer for VimL script files.
+
+    .. versionadded:: 0.8
+    """
+    name = 'VimL'
+    aliases = ['vim']
+    filenames = ['*.vim', '.vimrc', '.exrc', '.gvimrc',
+                 '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc']
+    mimetypes = ['text/x-vim']
+    flags = re.MULTILINE
+
+    _python = r'py(?:t(?:h(?:o(?:n)?)?)?)?'
+
+    tokens = {
+        'root': [
+            (r'^([ \t:]*)(' + _python + r')([ \t]*)(<<)([ \t]*)(.*)((?:\n|.)*)(\6)',
+             bygroups(using(this), Keyword, Text, Operator, Text, Text,
+                      using(PythonLexer), Text)),
+            (r'^([ \t:]*)(' + _python + r')([ \t])(.*)',
+             bygroups(using(this), Keyword, Text, using(PythonLexer))),
+
+            (r'^\s*".*', Comment),
+
+            (r'[ \t]+', Text),
+            # TODO: regexes can have other delims
+            (r'/(\\\\|\\/|[^\n/])*/', String.Regex),
+            (r'"(\\\\|\\"|[^\n"])*"', String.Double),
+            (r"'(''|[^\n'])*'", String.Single),
+
+            # Who decided that doublequote was a good comment character??
+            (r'(?<=\s)"[^\-:.%#=*].*', Comment),
+            (r'-?\d+', Number),
+            (r'#[0-9a-f]{6}', Number.Hex),
+            (r'^:', Punctuation),
+            (r'[()<>+=!|,~-]', Punctuation),  # Inexact list.  Looks decent.
+            (r'\b(let|if|else|endif|elseif|fun|function|endfunction)\b',
+             Keyword),
+            (r'\b(NONE|bold|italic|underline|dark|light)\b', Name.Builtin),
+            (r'\b\w+\b', Name.Other),  # These are postprocessed below
+            (r'.', Text),
+        ],
+    }
+
+    def __init__(self, **options):
+        from pygments.lexers._vim_builtins import command, option, auto
+        self._cmd = command
+        self._opt = option
+        self._aut = auto
+
+        RegexLexer.__init__(self, **options)
+
+    def is_in(self, w, mapping):
+        r"""
+        It's kind of difficult to decide if something might be a keyword
+        in VimL because it allows you to abbreviate them.  In fact,
+        'ab[breviate]' is a good example.  :ab, :abbre, or :abbreviate are
+        valid ways to call it so rather than making really awful regexps
+        like::
+
+            \bab(?:b(?:r(?:e(?:v(?:i(?:a(?:t(?:e)?)?)?)?)?)?)?)?\b
+
+        we match `\b\w+\b` and then call is_in() on those tokens.  See
+        `scripts/get_vimkw.py` for how the lists are extracted.
+        """
+        p = bisect(mapping, (w,))
+        if p > 0:
+            if mapping[p-1][0] == w[:len(mapping[p-1][0])] and \
+               mapping[p-1][1][:len(w)] == w:
+                return True
+        if p < len(mapping):
+            return mapping[p][0] == w[:len(mapping[p][0])] and \
+                mapping[p][1][:len(w)] == w
+        return False
+
+    def get_tokens_unprocessed(self, text):
+        # TODO: builtins are only subsequent tokens on lines
+        #       and 'keywords' only happen at the beginning except
+        #       for :au ones
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name.Other:
+                if self.is_in(value, self._cmd):
+                    yield index, Keyword, value
+                elif self.is_in(value, self._opt) or \
+                        self.is_in(value, self._aut):
+                    yield index, Name.Builtin, value
+                else:
+                    yield index, Text, value
+            else:
+                yield index, token, value
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/csound.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/csound.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/csound.py	(revision 1126)
@@ -0,0 +1,366 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.csound
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for CSound languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default, include, using, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, Punctuation, \
+    String, Text
+from pygments.lexers._csound_builtins import OPCODES
+from pygments.lexers.html import HtmlLexer
+from pygments.lexers.python import PythonLexer
+from pygments.lexers.scripting import LuaLexer
+
+__all__ = ['CsoundScoreLexer', 'CsoundOrchestraLexer', 'CsoundDocumentLexer']
+
+newline = (r'((?:(?:;|//).*)*)(\n)', bygroups(Comment.Single, Text))
+
+
+class CsoundLexer(RegexLexer):
+    # Subclasses must define a 'single-line string' state.
+    tokens = {
+        'whitespace': [
+            (r'[ \t]+', Text),
+            (r'\\\n', Text),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline)
+        ],
+
+        'macro call': [
+            (r'(\$\w+\.?)(\()', bygroups(Comment.Preproc, Punctuation),
+             'function macro call'),
+            (r'\$\w+(\.|\b)', Comment.Preproc)
+        ],
+        'function macro call': [
+            (r"((?:\\['\)]|[^'\)])+)(')", bygroups(Comment.Preproc, Punctuation)),
+            (r"([^'\)]+)(\))", bygroups(Comment.Preproc, Punctuation), '#pop')
+        ],
+
+        'whitespace or macro call': [
+            include('whitespace'),
+            include('macro call')
+        ],
+
+        'preprocessor directives': [
+            (r'#(e(nd(if)?|lse)|ifn?def|undef)\b|##', Comment.Preproc),
+            (r'#include\b', Comment.Preproc, 'include'),
+            (r'#[ \t]*define\b', Comment.Preproc, 'macro name'),
+            (r'@+[ \t]*\d*', Comment.Preproc)
+        ],
+
+        'include': [
+            include('whitespace'),
+            (r'"', String, 'single-line string')
+        ],
+
+        'macro name': [
+            include('whitespace'),
+            (r'(\w+)(\()', bygroups(Comment.Preproc, Text),
+             'function macro argument list'),
+            (r'\w+', Comment.Preproc, 'object macro definition after name')
+        ],
+        'object macro definition after name': [
+            include('whitespace'),
+            (r'#', Punctuation, 'object macro replacement text')
+        ],
+        'object macro replacement text': [
+            (r'(\\#|[^#])+', Comment.Preproc),
+            (r'#', Punctuation, '#pop:3')
+        ],
+        'function macro argument list': [
+            (r"(\w+)(['#])", bygroups(Comment.Preproc, Punctuation)),
+            (r'(\w+)(\))', bygroups(Comment.Preproc, Punctuation),
+             'function macro definition after name')
+        ],
+        'function macro definition after name': [
+            (r'[ \t]+', Text),
+            (r'#', Punctuation, 'function macro replacement text')
+        ],
+        'function macro replacement text': [
+            (r'(\\#|[^#])+', Comment.Preproc),
+            (r'#', Punctuation, '#pop:4')
+        ]
+    }
+
+
+class CsoundScoreLexer(CsoundLexer):
+    """
+    For `Csound <http://csound.github.io>`_ scores.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Csound Score'
+    aliases = ['csound-score', 'csound-sco']
+    filenames = ['*.sco']
+
+    tokens = {
+        'partial statement': [
+            include('preprocessor directives'),
+            (r'\d+e[+-]?\d+|(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?', Number.Float),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'"', String, 'single-line string'),
+            (r'[+\-*/%^!=<>|&#~.]', Operator),
+            (r'[]()[]', Punctuation),
+            (r'\w+', Comment.Preproc)
+        ],
+
+        'statement': [
+            include('whitespace or macro call'),
+            newline + ('#pop',),
+            include('partial statement')
+        ],
+
+        'root': [
+            newline,
+            include('whitespace or macro call'),
+            (r'[{}]', Punctuation, 'statement'),
+            (r'[abefimq-tv-z]|[nN][pP]?', Keyword, 'statement')
+        ],
+
+        'single-line string': [
+            (r'"', String, '#pop'),
+            (r'[^\\"]+', String)
+        ]
+    }
+
+
+class CsoundOrchestraLexer(CsoundLexer):
+    """
+    For `Csound <http://csound.github.io>`_ orchestras.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Csound Orchestra'
+    aliases = ['csound', 'csound-orc']
+    filenames = ['*.orc']
+
+    user_defined_opcodes = set()
+
+    def opcode_name_callback(lexer, match):
+        opcode = match.group(0)
+        lexer.user_defined_opcodes.add(opcode)
+        yield match.start(), Name.Function, opcode
+
+    def name_callback(lexer, match):
+        name = match.group(0)
+        if re.match('p\d+$', name) or name in OPCODES:
+            yield match.start(), Name.Builtin, name
+        elif name in lexer.user_defined_opcodes:
+            yield match.start(), Name.Function, name
+        else:
+            nameMatch = re.search(r'^(g?[aikSw])(\w+)', name)
+            if nameMatch:
+                yield nameMatch.start(1), Keyword.Type, nameMatch.group(1)
+                yield nameMatch.start(2), Name, nameMatch.group(2)
+            else:
+                yield match.start(), Name, name
+
+    tokens = {
+        'label': [
+            (r'\b(\w+)(:)', bygroups(Name.Label, Punctuation))
+        ],
+
+        'partial expression': [
+            include('preprocessor directives'),
+            (r'\b(0dbfs|k(r|smps)|nchnls(_i)?|sr)\b', Name.Variable.Global),
+            (r'\d+e[+-]?\d+|(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?', Number.Float),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'"', String, 'single-line string'),
+            (r'\{\{', String, 'multi-line string'),
+            (r'[+\-*/%^!=&|<>#~¬]', Operator),
+            (r'[](),?:[]', Punctuation),
+            (words((
+                # Keywords
+                'do', 'else', 'elseif', 'endif', 'enduntil', 'fi', 'if', 'ithen', 'kthen',
+                'od', 'then', 'until', 'while',
+                # Opcodes that act as control structures
+                'return', 'timout'
+                ), prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(('goto', 'igoto', 'kgoto', 'rigoto', 'tigoto'),
+                   prefix=r'\b', suffix=r'\b'), Keyword, 'goto label'),
+            (words(('cggoto', 'cigoto', 'cingoto', 'ckgoto', 'cngoto'),
+                   prefix=r'\b', suffix=r'\b'), Keyword,
+             ('goto label', 'goto expression')),
+            (words(('loop_ge', 'loop_gt', 'loop_le', 'loop_lt'),
+                   prefix=r'\b', suffix=r'\b'), Keyword,
+             ('goto label', 'goto expression', 'goto expression', 'goto expression')),
+            (r'\bscoreline(_i)?\b', Name.Builtin, 'scoreline opcode'),
+            (r'\bpyl?run[it]?\b', Name.Builtin, 'python opcode'),
+            (r'\blua_(exec|opdef)\b', Name.Builtin, 'lua opcode'),
+            (r'\b[a-zA-Z_]\w*\b', name_callback)
+        ],
+
+        'expression': [
+            include('whitespace or macro call'),
+            newline + ('#pop',),
+            include('partial expression')
+        ],
+
+        'root': [
+            newline,
+            include('whitespace or macro call'),
+            (r'\binstr\b', Keyword, ('instrument block', 'instrument name list')),
+            (r'\bopcode\b', Keyword, ('opcode block', 'opcode parameter list',
+                                      'opcode types', 'opcode types', 'opcode name')),
+            include('label'),
+            default('expression')
+        ],
+
+        'instrument name list': [
+            include('whitespace or macro call'),
+            (r'\d+|\+?[a-zA-Z_]\w*', Name.Function),
+            (r',', Punctuation),
+            newline + ('#pop',)
+        ],
+        'instrument block': [
+            newline,
+            include('whitespace or macro call'),
+            (r'\bendin\b', Keyword, '#pop'),
+            include('label'),
+            default('expression')
+        ],
+
+        'opcode name': [
+            include('whitespace or macro call'),
+            (r'[a-zA-Z_]\w*', opcode_name_callback, '#pop')
+        ],
+        'opcode types': [
+            include('whitespace or macro call'),
+            (r'0|[]afijkKoOpPStV[]+', Keyword.Type, '#pop'),
+            (r',', Punctuation)
+        ],
+        'opcode parameter list': [
+            include('whitespace or macro call'),
+            newline + ('#pop',)
+        ],
+        'opcode block': [
+            newline,
+            include('whitespace or macro call'),
+            (r'\bendop\b', Keyword, '#pop'),
+            include('label'),
+            default('expression')
+        ],
+
+        'goto label': [
+            include('whitespace or macro call'),
+            (r'\w+', Name.Label, '#pop'),
+            default('#pop')
+        ],
+        'goto expression': [
+            include('whitespace or macro call'),
+            (r',', Punctuation, '#pop'),
+            include('partial expression')
+        ],
+
+        'single-line string': [
+            include('macro call'),
+            (r'"', String, '#pop'),
+            # From https://github.com/csound/csound/blob/develop/Opcodes/fout.c#L1405
+            (r'%\d*(\.\d+)?[cdhilouxX]', String.Interpol),
+            (r'%[!%nNrRtT]|[~^]|\\([\\aAbBnNrRtT"]|[0-7]{1,3})', String.Escape),
+            (r'[^\\"~$%\^\n]+', String),
+            (r'[\\"~$%\^\n]', String)
+        ],
+        'multi-line string': [
+            (r'\}\}', String, '#pop'),
+            (r'[^}]+|\}(?!\})', String)
+        ],
+
+        'scoreline opcode': [
+            include('whitespace or macro call'),
+            (r'\{\{', String, 'scoreline'),
+            default('#pop')
+        ],
+        'scoreline': [
+            (r'\}\}', String, '#pop'),
+            (r'([^}]+)|\}(?!\})', using(CsoundScoreLexer))
+        ],
+
+        'python opcode': [
+            include('whitespace or macro call'),
+            (r'\{\{', String, 'python'),
+            default('#pop')
+        ],
+        'python': [
+            (r'\}\}', String, '#pop'),
+            (r'([^}]+)|\}(?!\})', using(PythonLexer))
+        ],
+
+        'lua opcode': [
+            include('whitespace or macro call'),
+            (r'"', String, 'single-line string'),
+            (r'\{\{', String, 'lua'),
+            (r',', Punctuation),
+            default('#pop')
+        ],
+        'lua': [
+            (r'\}\}', String, '#pop'),
+            (r'([^}]+)|\}(?!\})', using(LuaLexer))
+        ]
+    }
+
+
+class CsoundDocumentLexer(RegexLexer):
+    """
+    For `Csound <http://csound.github.io>`_ documents.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Csound Document'
+    aliases = ['csound-document', 'csound-csd']
+    filenames = ['*.csd']
+
+    # These tokens are based on those in XmlLexer in pygments/lexers/html.py. Making
+    # CsoundDocumentLexer a subclass of XmlLexer rather than RegexLexer may seem like a
+    # better idea, since Csound Document files look like XML files. However, Csound
+    # Documents can contain Csound comments (preceded by //, for example) before and
+    # after the root element, unescaped bitwise AND & and less than < operators, etc. In
+    # other words, while Csound Document files look like XML files, they may not actually
+    # be XML files.
+    tokens = {
+        'root': [
+            newline,
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'[^<&;/]+', Text),
+            (r'<\s*CsInstruments', Name.Tag, ('orchestra', 'tag')),
+            (r'<\s*CsScore', Name.Tag, ('score', 'tag')),
+            (r'<\s*[hH][tT][mM][lL]', Name.Tag, ('HTML', 'tag')),
+            (r'<\s*[\w:.-]+', Name.Tag, 'tag'),
+            (r'<\s*/\s*[\w:.-]+\s*>', Name.Tag)
+        ],
+        'orchestra': [
+            (r'<\s*/\s*CsInstruments\s*>', Name.Tag, '#pop'),
+            (r'(.|\n)+?(?=<\s*/\s*CsInstruments\s*>)', using(CsoundOrchestraLexer))
+        ],
+        'score': [
+            (r'<\s*/\s*CsScore\s*>', Name.Tag, '#pop'),
+            (r'(.|\n)+?(?=<\s*/\s*CsScore\s*>)', using(CsoundScoreLexer))
+        ],
+        'HTML': [
+            (r'<\s*/\s*[hH][tT][mM][lL]\s*>', Name.Tag, '#pop'),
+            (r'(.|\n)+?(?=<\s*/\s*[hH][tT][mM][lL]\s*>)', using(HtmlLexer))
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'[\w.:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop')
+        ],
+        'attr': [
+            (r'\s+', Text),
+            (r'".*?"', String, '#pop'),
+            (r"'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop')
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/jvm.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/jvm.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/jvm.py	(revision 1126)
@@ -0,0 +1,1573 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.jvm
+    ~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for JVM languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, using, \
+    this, combined, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+from pygments.util import shebang_matches
+from pygments import unistring as uni
+
+__all__ = ['JavaLexer', 'ScalaLexer', 'GosuLexer', 'GosuTemplateLexer',
+           'GroovyLexer', 'IokeLexer', 'ClojureLexer', 'ClojureScriptLexer',
+           'KotlinLexer', 'XtendLexer', 'AspectJLexer', 'CeylonLexer',
+           'PigLexer', 'GoloLexer', 'JasminLexer']
+
+
+class JavaLexer(RegexLexer):
+    """
+    For `Java <http://www.sun.com/java/>`_ source code.
+    """
+
+    name = 'Java'
+    aliases = ['java']
+    filenames = ['*.java']
+    mimetypes = ['text/x-java']
+
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            # keywords: go before method names to avoid lexing "throw new XYZ"
+            # as a method signature
+            (r'(assert|break|case|catch|continue|default|do|else|finally|for|'
+             r'if|goto|instanceof|new|return|switch|this|throw|try|while)\b',
+             Keyword),
+            # method names
+            (r'((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)'  # return arguments
+             r'((?:[^\W\d]|\$)[\w$]*)'                  # method name
+             r'(\s*)(\()',                              # signature start
+             bygroups(using(this), Name.Function, Text, Operator)),
+            (r'@[^\W\d][\w.]*', Name.Decorator),
+            (r'(abstract|const|enum|extends|final|implements|native|private|'
+             r'protected|public|static|strictfp|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Declaration),
+            (r'(boolean|byte|char|double|float|int|long|short|void)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface)(\s+)', bygroups(Keyword.Declaration, Text),
+             'class'),
+            (r'(import(?:\s+static)?)(\s+)', bygroups(Keyword.Namespace, Text),
+             'import'),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+            (r'(\.)((?:[^\W\d]|\$)[\w$]*)', bygroups(Operator, Name.Attribute)),
+            (r'^\s*([^\W\d]|\$)[\w$]*:', Name.Label),
+            (r'([^\W\d]|\$)[\w$]*', Name),
+            (r'([0-9][0-9_]*\.([0-9][0-9_]*)?|'
+             r'\.[0-9][0-9_]*)'
+             r'([eE][+\-]?[0-9][0-9_]*)?[fFdD]?|'
+             r'[0-9][eE][+\-]?[0-9][0-9_]*[fFdD]?|'
+             r'[0-9]([eE][+\-]?[0-9][0-9_]*)?[fFdD]|'
+             r'0[xX]([0-9a-fA-F][0-9a-fA-F_]*\.?|'
+             r'([0-9a-fA-F][0-9a-fA-F_]*)?\.[0-9a-fA-F][0-9a-fA-F_]*)'
+             r'[pP][+\-]?[0-9][0-9_]*[fFdD]?', Number.Float),
+            (r'0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?', Number.Hex),
+            (r'0[bB][01][01_]*[lL]?', Number.Bin),
+            (r'0[0-7_]+[lL]?', Number.Oct),
+            (r'0|[1-9][0-9_]*[lL]?', Number.Integer),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?-]', Operator),
+            (r'\n', Text)
+        ],
+        'class': [
+            (r'([^\W\d]|\$)[\w$]*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+
+class AspectJLexer(JavaLexer):
+    """
+    For `AspectJ <http://www.eclipse.org/aspectj/>`_ source code.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'AspectJ'
+    aliases = ['aspectj']
+    filenames = ['*.aj']
+    mimetypes = ['text/x-aspectj']
+
+    aj_keywords = set((
+        'aspect', 'pointcut', 'privileged', 'call', 'execution',
+        'initialization', 'preinitialization', 'handler', 'get', 'set',
+        'staticinitialization', 'target', 'args', 'within', 'withincode',
+        'cflow', 'cflowbelow', 'annotation', 'before', 'after', 'around',
+        'proceed', 'throwing', 'returning', 'adviceexecution', 'declare',
+        'parents', 'warning', 'error', 'soft', 'precedence', 'thisJoinPoint',
+        'thisJoinPointStaticPart', 'thisEnclosingJoinPointStaticPart',
+        'issingleton', 'perthis', 'pertarget', 'percflow', 'percflowbelow',
+        'pertypewithin', 'lock', 'unlock', 'thisAspectInstance'
+    ))
+    aj_inter_type = set(('parents:', 'warning:', 'error:', 'soft:', 'precedence:'))
+    aj_inter_type_annotation = set(('@type', '@method', '@constructor', '@field'))
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in JavaLexer.get_tokens_unprocessed(self, text):
+            if token is Name and value in self.aj_keywords:
+                yield index, Keyword, value
+            elif token is Name.Label and value in self.aj_inter_type:
+                yield index, Keyword, value[:-1]
+                yield index, Operator, value[-1]
+            elif token is Name.Decorator and value in self.aj_inter_type_annotation:
+                yield index, Keyword, value
+            else:
+                yield index, token, value
+
+
+class ScalaLexer(RegexLexer):
+    """
+    For `Scala <http://www.scala-lang.org>`_ source code.
+    """
+
+    name = 'Scala'
+    aliases = ['scala']
+    filenames = ['*.scala']
+    mimetypes = ['text/x-scala']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    # don't use raw unicode strings!
+    op = (u'[-~\\^\\*!%&\\\\<>\\|+=:/?@\u00a6-\u00a7\u00a9\u00ac\u00ae\u00b0-\u00b1'
+          u'\u00b6\u00d7\u00f7\u03f6\u0482\u0606-\u0608\u060e-\u060f\u06e9'
+          u'\u06fd-\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0cf1-\u0cf2'
+          u'\u0d79\u0f01-\u0f03\u0f13-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38'
+          u'\u0fbe-\u0fc5\u0fc7-\u0fcf\u109e-\u109f\u1360\u1390-\u1399\u1940'
+          u'\u19e0-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2044\u2052\u207a-\u207c'
+          u'\u208a-\u208c\u2100-\u2101\u2103-\u2106\u2108-\u2109\u2114\u2116-\u2118'
+          u'\u211e-\u2123\u2125\u2127\u2129\u212e\u213a-\u213b\u2140-\u2144'
+          u'\u214a-\u214d\u214f\u2190-\u2328\u232b-\u244a\u249c-\u24e9\u2500-\u2767'
+          u'\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb'
+          u'\u29fe-\u2b54\u2ce5-\u2cea\u2e80-\u2ffb\u3004\u3012-\u3013\u3020'
+          u'\u3036-\u3037\u303e-\u303f\u3190-\u3191\u3196-\u319f\u31c0-\u31e3'
+          u'\u3200-\u321e\u322a-\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff'
+          u'\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ufb29\ufdfd\ufe62\ufe64-\ufe66'
+          u'\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe4\uffe8-\uffee\ufffc-\ufffd]+')
+
+    letter = (u'[a-zA-Z\\$_\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6'
+              u'\u00f8-\u02af\u0370-\u0373\u0376-\u0377\u037b-\u037d\u0386'
+              u'\u0388-\u03f5\u03f7-\u0481\u048a-\u0556\u0561-\u0587\u05d0-\u05f2'
+              u'\u0621-\u063f\u0641-\u064a\u066e-\u066f\u0671-\u06d3\u06d5'
+              u'\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5'
+              u'\u07b1\u07ca-\u07ea\u0904-\u0939\u093d\u0950\u0958-\u0961'
+              u'\u0972-\u097f\u0985-\u09b9\u09bd\u09ce\u09dc-\u09e1\u09f0-\u09f1'
+              u'\u0a05-\u0a39\u0a59-\u0a5e\u0a72-\u0a74\u0a85-\u0ab9\u0abd'
+              u'\u0ad0-\u0ae1\u0b05-\u0b39\u0b3d\u0b5c-\u0b61\u0b71\u0b83-\u0bb9'
+              u'\u0bd0\u0c05-\u0c3d\u0c58-\u0c61\u0c85-\u0cb9\u0cbd\u0cde-\u0ce1'
+              u'\u0d05-\u0d3d\u0d60-\u0d61\u0d7a-\u0d7f\u0d85-\u0dc6\u0e01-\u0e30'
+              u'\u0e32-\u0e33\u0e40-\u0e45\u0e81-\u0eb0\u0eb2-\u0eb3\u0ebd-\u0ec4'
+              u'\u0edc-\u0f00\u0f40-\u0f6c\u0f88-\u0f8b\u1000-\u102a\u103f'
+              u'\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070'
+              u'\u1075-\u1081\u108e\u10a0-\u10fa\u1100-\u135a\u1380-\u138f'
+              u'\u13a0-\u166c\u166f-\u1676\u1681-\u169a\u16a0-\u16ea\u16ee-\u1711'
+              u'\u1720-\u1731\u1740-\u1751\u1760-\u1770\u1780-\u17b3\u17dc'
+              u'\u1820-\u1842\u1844-\u18a8\u18aa-\u191c\u1950-\u19a9\u19c1-\u19c7'
+              u'\u1a00-\u1a16\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf'
+              u'\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1d00-\u1d2b\u1d62-\u1d77'
+              u'\u1d79-\u1d9a\u1e00-\u1fbc\u1fbe\u1fc2-\u1fcc\u1fd0-\u1fdb'
+              u'\u1fe0-\u1fec\u1ff2-\u1ffc\u2071\u207f\u2102\u2107\u210a-\u2113'
+              u'\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139'
+              u'\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c7c'
+              u'\u2c80-\u2ce4\u2d00-\u2d65\u2d80-\u2dde\u3006-\u3007\u3021-\u3029'
+              u'\u3038-\u303a\u303c\u3041-\u3096\u309f\u30a1-\u30fa\u30ff-\u318e'
+              u'\u31a0-\u31b7\u31f0-\u31ff\u3400-\u4db5\u4e00-\ua014\ua016-\ua48c'
+              u'\ua500-\ua60b\ua610-\ua61f\ua62a-\ua66e\ua680-\ua697\ua722-\ua76f'
+              u'\ua771-\ua787\ua78b-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822'
+              u'\ua840-\ua873\ua882-\ua8b3\ua90a-\ua925\ua930-\ua946\uaa00-\uaa28'
+              u'\uaa40-\uaa42\uaa44-\uaa4b\uac00-\ud7a3\uf900-\ufb1d\ufb1f-\ufb28'
+              u'\ufb2a-\ufd3d\ufd50-\ufdfb\ufe70-\ufefc\uff21-\uff3a\uff41-\uff5a'
+              u'\uff66-\uff6f\uff71-\uff9d\uffa0-\uffdc]')
+
+    upper = (u'[A-Z\\$_\u00c0-\u00d6\u00d8-\u00de\u0100\u0102\u0104\u0106\u0108'
+             u'\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c'
+             u'\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130'
+             u'\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145'
+             u'\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a'
+             u'\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e'
+             u'\u0170\u0172\u0174\u0176\u0178-\u0179\u017b\u017d\u0181-\u0182'
+             u'\u0184\u0186-\u0187\u0189-\u018b\u018e-\u0191\u0193-\u0194'
+             u'\u0196-\u0198\u019c-\u019d\u019f-\u01a0\u01a2\u01a4\u01a6-\u01a7'
+             u'\u01a9\u01ac\u01ae-\u01af\u01b1-\u01b3\u01b5\u01b7-\u01b8\u01bc'
+             u'\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9'
+             u'\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee'
+             u'\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204'
+             u'\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218'
+             u'\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c'
+             u'\u022e\u0230\u0232\u023a-\u023b\u023d-\u023e\u0241\u0243-\u0246'
+             u'\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u0386\u0388-\u038f'
+             u'\u0391-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0'
+             u'\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7'
+             u'\u03f9-\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a'
+             u'\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e'
+             u'\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a'
+             u'\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae'
+             u'\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0-\u04c1'
+             u'\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6'
+             u'\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea'
+             u'\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe'
+             u'\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512'
+             u'\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0531-\u0556'
+             u'\u10a0-\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e'
+             u'\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22'
+             u'\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36'
+             u'\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a'
+             u'\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e'
+             u'\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72'
+             u'\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86'
+             u'\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2'
+             u'\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6'
+             u'\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca'
+             u'\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede'
+             u'\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2'
+             u'\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d'
+             u'\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59-\u1f5f'
+             u'\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb'
+             u'\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112'
+             u'\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133'
+             u'\u213e-\u213f\u2145\u2183\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67'
+             u'\u2c69\u2c6b\u2c6d-\u2c6f\u2c72\u2c75\u2c80\u2c82\u2c84\u2c86'
+             u'\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a'
+             u'\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae'
+             u'\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2'
+             u'\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6'
+             u'\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\ua640\ua642\ua644\ua646'
+             u'\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a'
+             u'\ua65c\ua65e\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682'
+             u'\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696'
+             u'\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736'
+             u'\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a'
+             u'\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e'
+             u'\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b'
+             u'\ua77d-\ua77e\ua780\ua782\ua784\ua786\ua78b\uff21-\uff3a]')
+
+    idrest = u'%s(?:%s|[0-9])*(?:(?<=_)%s)?' % (letter, letter, op)
+    letter_letter_digit = u'%s(?:%s|\d)*' % (letter, letter)
+
+    tokens = {
+        'root': [
+            # method names
+            (r'(class|trait|object)(\s+)', bygroups(Keyword, Text), 'class'),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (u'@%s' % idrest, Name.Decorator),
+            (u'(abstract|ca(?:se|tch)|d(?:ef|o)|e(?:lse|xtends)|'
+             u'f(?:inal(?:ly)?|or(?:Some)?)|i(?:f|mplicit)|'
+             u'lazy|match|new|override|pr(?:ivate|otected)'
+             u'|re(?:quires|turn)|s(?:ealed|uper)|'
+             u't(?:h(?:is|row)|ry)|va[lr]|w(?:hile|ith)|yield)\\b|'
+             u'(<[%:-]|=>|>:|[#=@_\u21D2\u2190])(\\b|(?=\\s)|$)', Keyword),
+            (u':(?!%s)' % op, Keyword, 'type'),
+            (u'%s%s\\b' % (upper, idrest), Name.Class),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(import|package)(\s+)', bygroups(Keyword, Text), 'import'),
+            (r'(type)(\s+)', bygroups(Keyword, Text), 'type'),
+            (r'""".*?"""(?!")', String),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+            (u"'%s" % idrest, Text.Symbol),
+            (r'[fs]"""', String, 'interptriplestring'),  # interpolated strings
+            (r'[fs]"', String, 'interpstring'),  # interpolated strings
+            (r'raw"(\\\\|\\"|[^"])*"', String),  # raw strings
+            # (ur'(\.)(%s|%s|`[^`]+`)' % (idrest, op), bygroups(Operator,
+            # Name.Attribute)),
+            (idrest, Name),
+            (r'`[^`]+`', Name),
+            (r'\[', Operator, 'typeparam'),
+            (r'[(){};,.#]', Operator),
+            (op, Operator),
+            (r'([0-9][0-9]*\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?',
+             Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text)
+        ],
+        'class': [
+            (u'(%s|%s|`[^`]+`)(\\s*)(\\[)' % (idrest, op),
+             bygroups(Name.Class, Text, Operator), 'typeparam'),
+            (r'\s+', Text),
+            (r'\{', Operator, '#pop'),
+            (r'\(', Operator, '#pop'),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (u'%s|%s|`[^`]+`' % (idrest, op), Name.Class, '#pop'),
+        ],
+        'type': [
+            (r'\s+', Text),
+            (r'<[%:]|>:|[#_]|forSome|type', Keyword),
+            (u'([,);}]|=>|=|\u21d2)(\\s*)', bygroups(Operator, Text), '#pop'),
+            (r'[({]', Operator, '#push'),
+            (u'((?:%s|%s|`[^`]+`)(?:\\.(?:%s|%s|`[^`]+`))*)(\\s*)(\\[)' %
+             (idrest, op, idrest, op),
+             bygroups(Keyword.Type, Text, Operator), ('#pop', 'typeparam')),
+            (u'((?:%s|%s|`[^`]+`)(?:\\.(?:%s|%s|`[^`]+`))*)(\\s*)$' %
+             (idrest, op, idrest, op),
+             bygroups(Keyword.Type, Text), '#pop'),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (u'\\.|%s|%s|`[^`]+`' % (idrest, op), Keyword.Type)
+        ],
+        'typeparam': [
+            (r'[\s,]+', Text),
+            (u'<[%:]|=>|>:|[#_\u21D2]|forSome|type', Keyword),
+            (r'([\])}])', Operator, '#pop'),
+            (r'[(\[{]', Operator, '#push'),
+            (u'\\.|%s|%s|`[^`]+`' % (idrest, op), Keyword.Type)
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'import': [
+            (u'(%s|\\.)+' % idrest, Name.Namespace, '#pop')
+        ],
+        'interpstringcommon': [
+            (r'[^"$\\]+', String),
+            (r'\$\$', String),
+            (r'\$' + letter_letter_digit, String.Interpol),
+            (r'\$\{', String.Interpol, 'interpbrace'),
+            (r'\\.', String),
+        ],
+        'interptriplestring': [
+            (r'"""(?!")', String, '#pop'),
+            (r'"', String),
+            include('interpstringcommon'),
+        ],
+        'interpstring': [
+            (r'"', String, '#pop'),
+            include('interpstringcommon'),
+        ],
+        'interpbrace': [
+            (r'\}', String.Interpol, '#pop'),
+            (r'\{', String.Interpol, '#push'),
+            include('root'),
+        ],
+    }
+
+
+class GosuLexer(RegexLexer):
+    """
+    For Gosu source code.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Gosu'
+    aliases = ['gosu']
+    filenames = ['*.gs', '*.gsx', '*.gsp', '*.vark']
+    mimetypes = ['text/x-gosu']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # modifiers etc.
+             r'([a-zA-Z_]\w*)'                       # method name
+             r'(\s*)(\()',                           # signature start
+             bygroups(using(this), Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(in|as|typeof|statictypeof|typeis|typeas|if|else|foreach|for|'
+             r'index|while|do|continue|break|return|try|catch|finally|this|'
+             r'throw|new|switch|case|default|eval|super|outer|classpath|'
+             r'using)\b', Keyword),
+            (r'(var|delegate|construct|function|private|internal|protected|'
+             r'public|abstract|override|final|static|extends|transient|'
+             r'implements|represents|readonly)\b', Keyword.Declaration),
+            (r'(property\s+)(get|set)?', Keyword.Declaration),
+            (r'(boolean|byte|char|double|float|int|long|short|void|block)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Text)),
+            (r'(true|false|null|NaN|Infinity)\b', Keyword.Constant),
+            (r'(class|interface|enhancement|enum)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Text, Name.Class)),
+            (r'(uses)(\s+)([\w.]+\*?)',
+             bygroups(Keyword.Namespace, Text, Name.Namespace)),
+            (r'"', String, 'string'),
+            (r'(\??[.#])([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'(:)([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'and|or|not|[\\~^*!%&\[\](){}<>|+=:;,./?-]', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\n', Text)
+        ],
+        'templateText': [
+            (r'(\\<)|(\\\$)', String),
+            (r'(<%@\s+)(extends|params)',
+             bygroups(Operator, Name.Decorator), 'stringTemplate'),
+            (r'<%!--.*?--%>', Comment.Multiline),
+            (r'(<%)|(<%=)', Operator, 'stringTemplate'),
+            (r'\$\{', Operator, 'stringTemplateShorthand'),
+            (r'.', String)
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            include('templateText')
+        ],
+        'stringTemplate': [
+            (r'"', String, 'string'),
+            (r'%>', Operator, '#pop'),
+            include('root')
+        ],
+        'stringTemplateShorthand': [
+            (r'"', String, 'string'),
+            (r'\{', Operator, 'stringTemplateShorthand'),
+            (r'\}', Operator, '#pop'),
+            include('root')
+        ],
+    }
+
+
+class GosuTemplateLexer(Lexer):
+    """
+    For Gosu templates.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Gosu Template'
+    aliases = ['gst']
+    filenames = ['*.gst']
+    mimetypes = ['text/x-gosu-template']
+
+    def get_tokens_unprocessed(self, text):
+        lexer = GosuLexer()
+        stack = ['templateText']
+        for item in lexer.get_tokens_unprocessed(text, stack):
+            yield item
+
+
+class GroovyLexer(RegexLexer):
+    """
+    For `Groovy <http://groovy.codehaus.org/>`_ source code.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Groovy'
+    aliases = ['groovy']
+    filenames = ['*.groovy','*.gradle']
+    mimetypes = ['text/x-groovy']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # Groovy allows a file to start with a shebang
+            (r'#!(.*?)$', Comment.Preproc, 'base'),
+            default('base'),
+        ],
+        'base': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_]\w*)'                      # method name
+             r'(\s*)(\()',                          # signature start
+             bygroups(using(this), Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(assert|break|case|catch|continue|default|do|else|finally|for|'
+             r'if|goto|instanceof|new|return|switch|this|throw|try|while|in|as)\b',
+             Keyword),
+            (r'(abstract|const|enum|extends|final|implements|native|private|'
+             r'protected|public|static|strictfp|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Declaration),
+            (r'(def|boolean|byte|char|double|float|int|long|short|void)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Text)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface)(\s+)', bygroups(Keyword.Declaration, Text),
+             'class'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
+            (r'""".*?"""', String.Double),
+            (r"'''.*?'''", String.Single),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\\'|[^'])*'", String.Single),
+            (r'\$/((?!/\$).)*/\$', String),
+            (r'/(\\\\|\\"|[^/])*/', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+            (r'(\.)([a-zA-Z_]\w*)', bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?-]', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text)
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'groovy')
+
+
+class IokeLexer(RegexLexer):
+    """
+    For `Ioke <http://ioke.org/>`_ (a strongly typed, dynamic,
+    prototype based programming language) source.
+
+    .. versionadded:: 1.4
+    """
+    name = 'Ioke'
+    filenames = ['*.ik']
+    aliases = ['ioke', 'ik']
+    mimetypes = ['text/x-iokesrc']
+    tokens = {
+        'interpolatableText': [
+            (r'(\\b|\\e|\\t|\\n|\\f|\\r|\\"|\\\\|\\#|\\\Z|\\u[0-9a-fA-F]{1,4}'
+             r'|\\[0-3]?[0-7]?[0-7])', String.Escape),
+            (r'#\{', Punctuation, 'textInterpolationRoot')
+        ],
+
+        'text': [
+            (r'(?<!\\)"', String, '#pop'),
+            include('interpolatableText'),
+            (r'[^"]', String)
+        ],
+
+        'documentation': [
+            (r'(?<!\\)"', String.Doc, '#pop'),
+            include('interpolatableText'),
+            (r'[^"]', String.Doc)
+        ],
+
+        'textInterpolationRoot': [
+            (r'\}', Punctuation, '#pop'),
+            include('root')
+        ],
+
+        'slashRegexp': [
+            (r'(?<!\\)/[im-psux]*', String.Regex, '#pop'),
+            include('interpolatableText'),
+            (r'\\/', String.Regex),
+            (r'[^/]', String.Regex)
+        ],
+
+        'squareRegexp': [
+            (r'(?<!\\)][im-psux]*', String.Regex, '#pop'),
+            include('interpolatableText'),
+            (r'\\]', String.Regex),
+            (r'[^\]]', String.Regex)
+        ],
+
+        'squareText': [
+            (r'(?<!\\)]', String, '#pop'),
+            include('interpolatableText'),
+            (r'[^\]]', String)
+        ],
+
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text),
+
+            # Comments
+            (r';(.*?)\n', Comment),
+            (r'\A#!(.*?)\n', Comment),
+
+            # Regexps
+            (r'#/', String.Regex, 'slashRegexp'),
+            (r'#r\[', String.Regex, 'squareRegexp'),
+
+            # Symbols
+            (r':[\w!:?]+', String.Symbol),
+            (r'[\w!:?]+:(?![\w!?])', String.Other),
+            (r':"(\\\\|\\"|[^"])*"', String.Symbol),
+
+            # Documentation
+            (r'((?<=fn\()|(?<=fnx\()|(?<=method\()|(?<=macro\()|(?<=lecro\()'
+             r'|(?<=syntax\()|(?<=dmacro\()|(?<=dlecro\()|(?<=dlecrox\()'
+             r'|(?<=dsyntax\())\s*"', String.Doc, 'documentation'),
+
+            # Text
+            (r'"', String, 'text'),
+            (r'#\[', String, 'squareText'),
+
+            # Mimic
+            (r'\w[\w!:?]+(?=\s*=.*mimic\s)', Name.Entity),
+
+            # Assignment
+            (r'[a-zA-Z_][\w!:?]*(?=[\s]*[+*/-]?=[^=].*($|\.))',
+             Name.Variable),
+
+            # keywords
+            (r'(break|cond|continue|do|ensure|for|for:dict|for:set|if|let|'
+             r'loop|p:for|p:for:dict|p:for:set|return|unless|until|while|'
+             r'with)(?![\w!:?])', Keyword.Reserved),
+
+            # Origin
+            (r'(eval|mimic|print|println)(?![\w!:?])', Keyword),
+
+            # Base
+            (r'(cell\?|cellNames|cellOwner\?|cellOwner|cells|cell|'
+             r'documentation|hash|identity|mimic|removeCell\!|undefineCell\!)'
+             r'(?![\w!:?])', Keyword),
+
+            # Ground
+            (r'(stackTraceAsText)(?![\w!:?])', Keyword),
+
+            # DefaultBehaviour Literals
+            (r'(dict|list|message|set)(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour Case
+            (r'(case|case:and|case:else|case:nand|case:nor|case:not|case:or|'
+             r'case:otherwise|case:xor)(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour Reflection
+            (r'(asText|become\!|derive|freeze\!|frozen\?|in\?|is\?|kind\?|'
+             r'mimic\!|mimics|mimics\?|prependMimic\!|removeAllMimics\!|'
+             r'removeMimic\!|same\?|send|thaw\!|uniqueHexId)'
+             r'(?![\w!:?])', Keyword),
+
+            # DefaultBehaviour Aspects
+            (r'(after|around|before)(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour
+            (r'(kind|cellDescriptionDict|cellSummary|genSym|inspect|notice)'
+             r'(?![\w!:?])', Keyword),
+            (r'(use|destructuring)', Keyword.Reserved),
+
+            # DefaultBehavior BaseBehavior
+            (r'(cell\?|cellOwner\?|cellOwner|cellNames|cells|cell|'
+             r'documentation|identity|removeCell!|undefineCell)'
+             r'(?![\w!:?])', Keyword),
+
+            # DefaultBehavior Internal
+            (r'(internal:compositeRegexp|internal:concatenateText|'
+             r'internal:createDecimal|internal:createNumber|'
+             r'internal:createRegexp|internal:createText)'
+             r'(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour Conditions
+            (r'(availableRestarts|bind|error\!|findRestart|handle|'
+             r'invokeRestart|rescue|restart|signal\!|warn\!)'
+             r'(?![\w!:?])', Keyword.Reserved),
+
+            # constants
+            (r'(nil|false|true)(?![\w!:?])', Name.Constant),
+
+            # names
+            (r'(Arity|Base|Call|Condition|DateTime|Aspects|Pointcut|'
+             r'Assignment|BaseBehavior|Boolean|Case|AndCombiner|Else|'
+             r'NAndCombiner|NOrCombiner|NotCombiner|OrCombiner|XOrCombiner|'
+             r'Conditions|Definitions|FlowControl|Internal|Literals|'
+             r'Reflection|DefaultMacro|DefaultMethod|DefaultSyntax|Dict|'
+             r'FileSystem|Ground|Handler|Hook|IO|IokeGround|Struct|'
+             r'LexicalBlock|LexicalMacro|List|Message|Method|Mixins|'
+             r'NativeMethod|Number|Origin|Pair|Range|Reflector|Regexp Match|'
+             r'Regexp|Rescue|Restart|Runtime|Sequence|Set|Symbol|'
+             r'System|Text|Tuple)(?![\w!:?])', Name.Builtin),
+
+            # functions
+            (u'(generateMatchMethod|aliasMethod|\u03bb|\u028E|fnx|fn|method|'
+             u'dmacro|dlecro|syntax|macro|dlecrox|lecrox|lecro|syntax)'
+             u'(?![\w!:?])', Name.Function),
+
+            # Numbers
+            (r'-?0[xX][0-9a-fA-F]+', Number.Hex),
+            (r'-?(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'-?\d+', Number.Integer),
+
+            (r'#\(', Punctuation),
+
+            # Operators
+            (r'(&&>>|\|\|>>|\*\*>>|:::|::|\.\.\.|===|\*\*>|\*\*=|&&>|&&=|'
+             r'\|\|>|\|\|=|\->>|\+>>|!>>|<>>>|<>>|&>>|%>>|#>>|@>>|/>>|\*>>|'
+             r'\?>>|\|>>|\^>>|~>>|\$>>|=>>|<<=|>>=|<=>|<\->|=~|!~|=>|\+\+|'
+             r'\-\-|<=|>=|==|!=|&&|\.\.|\+=|\-=|\*=|\/=|%=|&=|\^=|\|=|<\-|'
+             r'\+>|!>|<>|&>|%>|#>|\@>|\/>|\*>|\?>|\|>|\^>|~>|\$>|<\->|\->|'
+             r'<<|>>|\*\*|\?\||\?&|\|\||>|<|\*|\/|%|\+|\-|&|\^|\||=|\$|!|~|'
+             u'\\?|#|\u2260|\u2218|\u2208|\u2209)', Operator),
+            (r'(and|nand|or|xor|nor|return|import)(?![\w!?])',
+             Operator),
+
+            # Punctuation
+            (r'(\`\`|\`|\'\'|\'|\.|\,|@@|@|\[|\]|\(|\)|\{|\})', Punctuation),
+
+            # kinds
+            (r'[A-Z][\w!:?]*', Name.Class),
+
+            # default cellnames
+            (r'[a-z_][\w!:?]*', Name)
+        ]
+    }
+
+
+class ClojureLexer(RegexLexer):
+    """
+    Lexer for `Clojure <http://clojure.org/>`_ source code.
+
+    .. versionadded:: 0.11
+    """
+    name = 'Clojure'
+    aliases = ['clojure', 'clj']
+    filenames = ['*.clj']
+    mimetypes = ['text/x-clojure', 'application/x-clojure']
+
+    special_forms = (
+        '.', 'def', 'do', 'fn', 'if', 'let', 'new', 'quote', 'var', 'loop'
+    )
+
+    # It's safe to consider 'ns' a declaration thing because it defines a new
+    # namespace.
+    declarations = (
+        'def-', 'defn', 'defn-', 'defmacro', 'defmulti', 'defmethod',
+        'defstruct', 'defonce', 'declare', 'definline', 'definterface',
+        'defprotocol', 'defrecord', 'deftype', 'defproject', 'ns'
+    )
+
+    builtins = (
+        '*', '+', '-', '->', '/', '<', '<=', '=', '==', '>', '>=', '..',
+        'accessor', 'agent', 'agent-errors', 'aget', 'alength', 'all-ns',
+        'alter', 'and', 'append-child', 'apply', 'array-map', 'aset',
+        'aset-boolean', 'aset-byte', 'aset-char', 'aset-double', 'aset-float',
+        'aset-int', 'aset-long', 'aset-short', 'assert', 'assoc', 'await',
+        'await-for', 'bean', 'binding', 'bit-and', 'bit-not', 'bit-or',
+        'bit-shift-left', 'bit-shift-right', 'bit-xor', 'boolean', 'branch?',
+        'butlast', 'byte', 'cast', 'char', 'children', 'class',
+        'clear-agent-errors', 'comment', 'commute', 'comp', 'comparator',
+        'complement', 'concat', 'conj', 'cons', 'constantly', 'cond', 'if-not',
+        'construct-proxy', 'contains?', 'count', 'create-ns', 'create-struct',
+        'cycle', 'dec',  'deref', 'difference', 'disj', 'dissoc', 'distinct',
+        'doall', 'doc', 'dorun', 'doseq', 'dosync', 'dotimes', 'doto',
+        'double', 'down', 'drop', 'drop-while', 'edit', 'end?', 'ensure',
+        'eval', 'every?', 'false?', 'ffirst', 'file-seq', 'filter', 'find',
+        'find-doc', 'find-ns', 'find-var', 'first', 'float', 'flush', 'for',
+        'fnseq', 'frest', 'gensym', 'get-proxy-class', 'get',
+        'hash-map', 'hash-set', 'identical?', 'identity', 'if-let', 'import',
+        'in-ns', 'inc', 'index', 'insert-child', 'insert-left', 'insert-right',
+        'inspect-table', 'inspect-tree', 'instance?', 'int', 'interleave',
+        'intersection', 'into', 'into-array', 'iterate', 'join', 'key', 'keys',
+        'keyword', 'keyword?', 'last', 'lazy-cat', 'lazy-cons', 'left',
+        'lefts', 'line-seq', 'list*', 'list', 'load', 'load-file',
+        'locking', 'long', 'loop', 'macroexpand', 'macroexpand-1',
+        'make-array', 'make-node', 'map', 'map-invert', 'map?', 'mapcat',
+        'max', 'max-key', 'memfn', 'merge', 'merge-with', 'meta', 'min',
+        'min-key', 'name', 'namespace', 'neg?', 'new', 'newline', 'next',
+        'nil?', 'node', 'not', 'not-any?', 'not-every?', 'not=', 'ns-imports',
+        'ns-interns', 'ns-map', 'ns-name', 'ns-publics', 'ns-refers',
+        'ns-resolve', 'ns-unmap', 'nth', 'nthrest', 'or', 'parse', 'partial',
+        'path', 'peek', 'pop', 'pos?', 'pr', 'pr-str', 'print', 'print-str',
+        'println', 'println-str', 'prn', 'prn-str', 'project', 'proxy',
+        'proxy-mappings', 'quot', 'rand', 'rand-int', 'range', 're-find',
+        're-groups', 're-matcher', 're-matches', 're-pattern', 're-seq',
+        'read', 'read-line', 'reduce', 'ref', 'ref-set', 'refer', 'rem',
+        'remove', 'remove-method', 'remove-ns', 'rename', 'rename-keys',
+        'repeat', 'replace', 'replicate', 'resolve', 'rest', 'resultset-seq',
+        'reverse', 'rfirst', 'right', 'rights', 'root', 'rrest', 'rseq',
+        'second', 'select', 'select-keys', 'send', 'send-off', 'seq',
+        'seq-zip', 'seq?', 'set', 'short', 'slurp', 'some', 'sort',
+        'sort-by', 'sorted-map', 'sorted-map-by', 'sorted-set',
+        'special-symbol?', 'split-at', 'split-with', 'str', 'string?',
+        'struct', 'struct-map', 'subs', 'subvec', 'symbol', 'symbol?',
+        'sync', 'take', 'take-nth', 'take-while', 'test', 'time', 'to-array',
+        'to-array-2d', 'tree-seq', 'true?', 'union', 'up', 'update-proxy',
+        'val', 'vals', 'var-get', 'var-set', 'var?', 'vector', 'vector-zip',
+        'vector?', 'when', 'when-first', 'when-let', 'when-not',
+        'with-local-vars', 'with-meta', 'with-open', 'with-out-str',
+        'xml-seq', 'xml-zip', 'zero?', 'zipmap', 'zipper')
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+
+    # TODO / should divide keywords/symbols into namespace/rest
+    # but that's hard, so just pretend / is part of the name
+    valid_name = r'(?!#)[\w!$%*+<=>?/.#-]+'
+
+    tokens = {
+        'root': [
+            # the comments - always starting with semicolon
+            # and going to the end of the line
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r'[,\s]+', Text),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            (r'0x-?[abcdef\d]+', Number.Hex),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'" + valid_name, String.Symbol),
+            (r"\\(.|[a-z]+)", String.Char),
+
+            # keywords
+            (r'::?#?' + valid_name, String.Symbol),
+
+            # special operators
+            (r'~@|[`\'#^~&@]', Operator),
+
+            # highlight the special forms
+            (words(special_forms, suffix=' '), Keyword),
+
+            # Technically, only the special forms are 'keywords'. The problem
+            # is that only treating them as keywords means that things like
+            # 'defn' and 'ns' need to be highlighted as builtins. This is ugly
+            # and weird for most styles. So, as a compromise we're going to
+            # highlight them as Keyword.Declarations.
+            (words(declarations, suffix=' '), Keyword.Declaration),
+
+            # highlight the builtins
+            (words(builtins, suffix=' '), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # Clojure accepts vector notation
+            (r'(\[|\])', Punctuation),
+
+            # Clojure accepts map notation
+            (r'(\{|\})', Punctuation),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+        ],
+    }
+
+
+class ClojureScriptLexer(ClojureLexer):
+    """
+    Lexer for `ClojureScript <http://clojure.org/clojurescript>`_
+    source code.
+
+    .. versionadded:: 2.0
+    """
+    name = 'ClojureScript'
+    aliases = ['clojurescript', 'cljs']
+    filenames = ['*.cljs']
+    mimetypes = ['text/x-clojurescript', 'application/x-clojurescript']
+
+
+class TeaLangLexer(RegexLexer):
+    """
+    For `Tea <http://teatrove.org/>`_ source code. Only used within a
+    TeaTemplateLexer.
+
+    .. versionadded:: 1.5
+    """
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w\.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_]\w*)'                       # method name
+             r'(\s*)(\()',                           # signature start
+             bygroups(using(this), Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w\.]*', Name.Decorator),
+            (r'(and|break|else|foreach|if|in|not|or|reverse)\b',
+             Keyword),
+            (r'(as|call|define)\b', Keyword.Declaration),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(template)(\s+)', bygroups(Keyword.Declaration, Text), 'template'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r'\'(\\\\|\\\'|[^\'])*\'', String),
+            (r'(\.)([a-zA-Z_]\w*)', bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_\$]\w*', Name),
+            (r'(isa|[.]{3}|[.]{2}|[=#!<>+-/%&;,.\*\\\(\)\[\]\{\}])', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text)
+        ],
+        'template': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+
+class CeylonLexer(RegexLexer):
+    """
+    For `Ceylon <http://ceylon-lang.org/>`_ source code.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Ceylon'
+    aliases = ['ceylon']
+    filenames = ['*.ceylon']
+    mimetypes = ['text/x-ceylon']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_]\w*)'                      # method name
+             r'(\s*)(\()',                          # signature start
+             bygroups(using(this), Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'(shared|abstract|formal|default|actual|variable|deprecated|small|'
+             r'late|literal|doc|by|see|throws|optional|license|tagged|final|native|'
+             r'annotation|sealed)\b', Name.Decorator),
+            (r'(break|case|catch|continue|else|finally|for|in|'
+             r'if|return|switch|this|throw|try|while|is|exists|dynamic|'
+             r'nonempty|then|outer|assert|let)\b', Keyword),
+            (r'(abstracts|extends|satisfies|'
+             r'super|given|of|out|assign)\b', Keyword.Declaration),
+            (r'(function|value|void|new)\b',
+             Keyword.Type),
+            (r'(assembly|module|package)(\s+)', bygroups(Keyword.Namespace, Text)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface|object|alias)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'class'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'\\.'|'[^\\]'|'\\\{#[0-9a-fA-F]{4}\}'", String.Char),
+            (r'".*``.*``.*"', String.Interpol),
+            (r'(\.)([a-z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?-]', Operator),
+            (r'\d{1,3}(_\d{3})+\.\d{1,3}(_\d{3})+[kMGTPmunpf]?', Number.Float),
+            (r'\d{1,3}(_\d{3})+\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?',
+             Number.Float),
+            (r'[0-9][0-9]*\.\d{1,3}(_\d{3})+[kMGTPmunpf]?', Number.Float),
+            (r'[0-9][0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?',
+             Number.Float),
+            (r'#([0-9a-fA-F]{4})(_[0-9a-fA-F]{4})+', Number.Hex),
+            (r'#[0-9a-fA-F]+', Number.Hex),
+            (r'\$([01]{4})(_[01]{4})+', Number.Bin),
+            (r'\$[01]+', Number.Bin),
+            (r'\d{1,3}(_\d{3})+[kMGTP]?', Number.Integer),
+            (r'[0-9]+[kMGTP]?', Number.Integer),
+            (r'\n', Text)
+        ],
+        'class': [
+            (r'[A-Za-z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[a-z][\w.]*',
+             Name.Namespace, '#pop')
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
+
+
+class KotlinLexer(RegexLexer):
+    """
+    For `Kotlin <http://kotlinlang.org/>`_
+    source code.
+
+    .. versionadded:: 1.5
+    """
+
+    name = 'Kotlin'
+    aliases = ['kotlin']
+    filenames = ['*.kt']
+    mimetypes = ['text/x-kotlin']
+
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    kt_name = ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
+               '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc', 'Cf',
+                                 'Mn', 'Mc') + ']*')
+    kt_id = '(' + kt_name + '|`' + kt_name + '`)'
+
+    tokens = {
+        'root': [
+            (r'^\s*\[.*?\]', Name.Attribute),
+            (r'[^\S\n]+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'//.*?\n', Comment.Single),
+            (r'/[*].*?[*]/', Comment.Multiline),
+            (r'\n', Text),
+            (r'::|!!|\?[:.]', Operator),
+            (r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation),
+            (r'[{}]', Punctuation),
+            (r'@"(""|[^"])*"', String),
+            (r'"(\\\\|\\"|[^"\n])*["\n]', String),
+            (r"'\\.'|'[^\\]'", String.Char),
+            (r"[0-9](\.[0-9]*)?([eE][+-][0-9]+)?[flFL]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+            (r'(class)(\s+)(object)', bygroups(Keyword, Text, Keyword)),
+            (r'(class|interface|object)(\s+)', bygroups(Keyword, Text), 'class'),
+            (r'(package|import)(\s+)', bygroups(Keyword, Text), 'package'),
+            (r'(val|var)(\s+)', bygroups(Keyword, Text), 'property'),
+            (r'(fun)(\s+)', bygroups(Keyword, Text), 'function'),
+            (r'(abstract|annotation|as|break|by|catch|class|companion|const|'
+             r'constructor|continue|crossinline|data|do|dynamic|else|enum|'
+             r'external|false|final|finally|for|fun|get|if|import|in|infix|'
+             r'inline|inner|interface|internal|is|lateinit|noinline|null|'
+             r'object|open|operator|out|override|package|private|protected|'
+             r'public|reified|return|sealed|set|super|tailrec|this|throw|'
+             r'true|try|val|var|vararg|when|where|while)\b', Keyword),
+            (kt_id, Name),
+        ],
+        'package': [
+            (r'\S+', Name.Namespace, '#pop')
+        ],
+        'class': [
+            (kt_id, Name.Class, '#pop')
+        ],
+        'property': [
+            (kt_id, Name.Property, '#pop')
+        ],
+        'function': [
+            (kt_id, Name.Function, '#pop')
+        ],
+    }
+
+
+class XtendLexer(RegexLexer):
+    """
+    For `Xtend <http://xtend-lang.org/>`_ source code.
+
+    .. versionadded:: 1.6
+    """
+
+    name = 'Xtend'
+    aliases = ['xtend']
+    filenames = ['*.xtend']
+    mimetypes = ['text/x-xtend']
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_$][\w$]*)'                  # method name
+             r'(\s*)(\()',                          # signature start
+             bygroups(using(this), Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(assert|break|case|catch|continue|default|do|else|finally|for|'
+             r'if|goto|instanceof|new|return|switch|this|throw|try|while|IF|'
+             r'ELSE|ELSEIF|ENDIF|FOR|ENDFOR|SEPARATOR|BEFORE|AFTER)\b',
+             Keyword),
+            (r'(def|abstract|const|enum|extends|final|implements|native|private|'
+             r'protected|public|static|strictfp|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Declaration),
+            (r'(boolean|byte|char|double|float|int|long|short|void)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Text)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface)(\s+)', bygroups(Keyword.Declaration, Text),
+             'class'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
+            (r"(''')", String, 'template'),
+            (u'(\u00BB)', String, 'template'),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'(\\\\|\\'|[^'])*'", String),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>\|+=:;,./?-]', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text)
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+        'template': [
+            (r"'''", String, '#pop'),
+            (u'\u00AB', String, '#pop'),
+            (r'.', String)
+        ],
+    }
+
+
+class PigLexer(RegexLexer):
+    """
+    For `Pig Latin <https://pig.apache.org/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Pig'
+    aliases = ['pig']
+    filenames = ['*.pig']
+    mimetypes = ['text/x-pig']
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'--.*', Comment),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            (r'\'(?:\\[ntbrf\\\']|\\u[0-9a-f]{4}|[^\'\\\n\r])*\'', String),
+            include('keywords'),
+            include('types'),
+            include('builtins'),
+            include('punct'),
+            include('operators'),
+            (r'[0-9]*\.[0-9]+(e[0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text),
+            (r'([a-z_]\w*)(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[()#:]', Text),
+            (r'[^(:#\'")\s]+', Text),
+            (r'\S+\s+', Text)   # TODO: make tests pass without \s+
+        ],
+        'keywords': [
+            (r'(assert|and|any|all|arrange|as|asc|bag|by|cache|CASE|cat|cd|cp|'
+             r'%declare|%default|define|dense|desc|describe|distinct|du|dump|'
+             r'eval|exex|explain|filter|flatten|foreach|full|generate|group|'
+             r'help|if|illustrate|import|inner|input|into|is|join|kill|left|'
+             r'limit|load|ls|map|matches|mkdir|mv|not|null|onschema|or|order|'
+             r'outer|output|parallel|pig|pwd|quit|register|returns|right|rm|'
+             r'rmf|rollup|run|sample|set|ship|split|stderr|stdin|stdout|store|'
+             r'stream|through|union|using|void)\b', Keyword)
+        ],
+        'builtins': [
+            (r'(AVG|BinStorage|cogroup|CONCAT|copyFromLocal|copyToLocal|COUNT|'
+             r'cross|DIFF|MAX|MIN|PigDump|PigStorage|SIZE|SUM|TextLoader|'
+             r'TOKENIZE)\b', Name.Builtin)
+        ],
+        'types': [
+            (r'(bytearray|BIGINTEGER|BIGDECIMAL|chararray|datetime|double|float|'
+             r'int|long|tuple)\b', Keyword.Type)
+        ],
+        'punct': [
+            (r'[;(){}\[\]]', Punctuation),
+        ],
+        'operators': [
+            (r'[#=,./%+\-?]', Operator),
+            (r'(eq|gt|lt|gte|lte|neq|matches)\b', Operator),
+            (r'(==|<=|<|>=|>|!=)', Operator),
+        ],
+    }
+
+
+class GoloLexer(RegexLexer):
+    """
+    For `Golo <http://golo-lang.org/>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Golo'
+    filenames = ['*.golo']
+    aliases = ['golo']
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+
+            (r'#.*$', Comment),
+
+            (r'(\^|\.\.\.|:|\?:|->|==|!=|=|\+|\*|%|/|<=|<|>=|>|=|\.)',
+                Operator),
+            (r'(?<=[^-])(-)(?=[^-])', Operator),
+
+            (r'(?<=[^`])(is|isnt|and|or|not|oftype|in|orIfNull)\b', Operator.Word),
+            (r'[]{}|(),[]', Punctuation),
+
+            (r'(module|import)(\s+)',
+                bygroups(Keyword.Namespace, Text),
+                'modname'),
+            (r'\b([a-zA-Z_][\w$.]*)(::)',  bygroups(Name.Namespace, Punctuation)),
+            (r'\b([a-zA-Z_][\w$]*(?:\.[a-zA-Z_][\w$]*)+)\b', Name.Namespace),
+
+            (r'(let|var)(\s+)',
+                bygroups(Keyword.Declaration, Text),
+                'varname'),
+            (r'(struct)(\s+)',
+                bygroups(Keyword.Declaration, Text),
+                'structname'),
+            (r'(function)(\s+)',
+                bygroups(Keyword.Declaration, Text),
+                'funcname'),
+
+            (r'(null|true|false)\b', Keyword.Constant),
+            (r'(augment|pimp'
+             r'|if|else|case|match|return'
+             r'|case|when|then|otherwise'
+             r'|while|for|foreach'
+             r'|try|catch|finally|throw'
+             r'|local'
+             r'|continue|break)\b', Keyword),
+
+            (r'(map|array|list|set|vector|tuple)(\[)',
+                bygroups(Name.Builtin, Punctuation)),
+            (r'(print|println|readln|raise|fun'
+             r'|asInterfaceInstance)\b', Name.Builtin),
+            (r'(`?[a-zA-Z_][\w$]*)(\()',
+                bygroups(Name.Function, Punctuation)),
+
+            (r'-?[\d_]*\.[\d_]*([eE][+-]?\d[\d_]*)?F?', Number.Float),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'-?\d[\d_]*L', Number.Integer.Long),
+            (r'-?\d[\d_]*', Number.Integer),
+
+            ('`?[a-zA-Z_][\w$]*', Name),
+            (r'@[a-zA-Z_][\w$.]*', Name.Decorator),
+
+            (r'"""', String, combined('stringescape', 'triplestring')),
+            (r'"', String, combined('stringescape', 'doublestring')),
+            (r"'", String, combined('stringescape', 'singlestring')),
+            (r'----((.|\n)*?)----', String.Doc)
+
+        ],
+
+        'funcname': [
+            (r'`?[a-zA-Z_][\w$]*', Name.Function, '#pop'),
+        ],
+        'modname': [
+            (r'[a-zA-Z_][\w$.]*\*?', Name.Namespace, '#pop')
+        ],
+        'structname': [
+            (r'`?[\w.]+\*?', Name.Class, '#pop')
+        ],
+        'varname': [
+            (r'`?[a-zA-Z_][\w$]*', Name.Variable, '#pop'),
+        ],
+        'string': [
+            (r'[^\\\'"\n]+', String),
+            (r'[\'"\\]', String)
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'triplestring': [
+            (r'"""', String, '#pop'),
+            include('string'),
+            (r'\n', String),
+        ],
+        'doublestring': [
+            (r'"', String.Double, '#pop'),
+            include('string'),
+        ],
+        'singlestring': [
+            (r"'", String, '#pop'),
+            include('string'),
+        ],
+        'operators': [
+            (r'[#=,./%+\-?]', Operator),
+            (r'(eq|gt|lt|gte|lte|neq|matches)\b', Operator),
+            (r'(==|<=|<|>=|>|!=)', Operator),
+        ],
+    }
+
+
+class JasminLexer(RegexLexer):
+    """
+    For `Jasmin <http://jasmin.sourceforge.net/>`_ assembly code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Jasmin'
+    aliases = ['jasmin', 'jasminxt']
+    filenames = ['*.j']
+
+    _whitespace = r' \n\t\r'
+    _ws = r'(?:[%s]+)' % _whitespace
+    _separator = r'%s:=' % _whitespace
+    _break = r'(?=[%s]|$)' % _separator
+    _name = r'[^%s]+' % _separator
+    _unqualified_name = r'(?:[^%s.;\[/]+)' % _separator
+
+    tokens = {
+        'default': [
+            (r'\n', Text, '#pop'),
+            (r"'", String.Single, ('#pop', 'quote')),
+            (r'"', String.Double, 'string'),
+            (r'=', Punctuation),
+            (r':', Punctuation, 'label'),
+            (_ws, Text),
+            (r';.*', Comment.Single),
+            (r'(\$[-+])?0x-?[\da-fA-F]+%s' % _break, Number.Hex),
+            (r'(\$[-+]|\+)?-?\d+%s' % _break, Number.Integer),
+            (r'-?(\d+\.\d*|\.\d+)([eE][-+]?\d+)?[fFdD]?'
+             r'[\x00-\x08\x0b\x0c\x0e-\x1f]*%s' % _break, Number.Float),
+            (r'\$%s' % _name, Name.Variable),
+
+            # Directives
+            (r'\.annotation%s' % _break, Keyword.Reserved, 'annotation'),
+            (r'(\.attribute|\.bytecode|\.debug|\.deprecated|\.enclosing|'
+             r'\.interface|\.line|\.signature|\.source|\.stack|\.var|abstract|'
+             r'annotation|bridge|class|default|enum|field|final|fpstrict|'
+             r'interface|native|private|protected|public|signature|static|'
+             r'synchronized|synthetic|transient|varargs|volatile)%s' % _break,
+             Keyword.Reserved),
+            (r'\.catch%s' % _break, Keyword.Reserved, 'caught-exception'),
+            (r'(\.class|\.implements|\.inner|\.super|inner|invisible|'
+             r'invisibleparam|outer|visible|visibleparam)%s' % _break,
+             Keyword.Reserved, 'class/convert-dots'),
+            (r'\.field%s' % _break, Keyword.Reserved,
+             ('descriptor/convert-dots', 'field')),
+            (r'(\.end|\.limit|use)%s' % _break, Keyword.Reserved,
+             'no-verification'),
+            (r'\.method%s' % _break, Keyword.Reserved, 'method'),
+            (r'\.set%s' % _break, Keyword.Reserved, 'var'),
+            (r'\.throws%s' % _break, Keyword.Reserved, 'exception'),
+            (r'(from|offset|to|using)%s' % _break, Keyword.Reserved, 'label'),
+            (r'is%s' % _break, Keyword.Reserved,
+             ('descriptor/convert-dots', 'var')),
+            (r'(locals|stack)%s' % _break, Keyword.Reserved, 'verification'),
+            (r'method%s' % _break, Keyword.Reserved, 'enclosing-method'),
+
+            # Instructions
+            (words((
+                'aaload', 'aastore', 'aconst_null', 'aload', 'aload_0', 'aload_1', 'aload_2',
+                'aload_3', 'aload_w', 'areturn', 'arraylength', 'astore', 'astore_0', 'astore_1',
+                'astore_2', 'astore_3', 'astore_w', 'athrow', 'baload', 'bastore', 'bipush',
+                'breakpoint', 'caload', 'castore', 'd2f', 'd2i', 'd2l', 'dadd', 'daload', 'dastore',
+                'dcmpg', 'dcmpl', 'dconst_0', 'dconst_1', 'ddiv', 'dload', 'dload_0', 'dload_1',
+                'dload_2', 'dload_3', 'dload_w', 'dmul', 'dneg', 'drem', 'dreturn', 'dstore', 'dstore_0',
+                'dstore_1', 'dstore_2', 'dstore_3', 'dstore_w', 'dsub', 'dup', 'dup2', 'dup2_x1',
+                'dup2_x2', 'dup_x1', 'dup_x2', 'f2d', 'f2i', 'f2l', 'fadd', 'faload', 'fastore', 'fcmpg',
+                'fcmpl', 'fconst_0', 'fconst_1', 'fconst_2', 'fdiv', 'fload', 'fload_0', 'fload_1',
+                'fload_2', 'fload_3', 'fload_w', 'fmul', 'fneg', 'frem', 'freturn', 'fstore', 'fstore_0',
+                'fstore_1', 'fstore_2', 'fstore_3', 'fstore_w', 'fsub', 'i2b', 'i2c', 'i2d', 'i2f', 'i2l',
+                'i2s', 'iadd', 'iaload', 'iand', 'iastore', 'iconst_0', 'iconst_1', 'iconst_2',
+                'iconst_3', 'iconst_4', 'iconst_5', 'iconst_m1', 'idiv', 'iinc', 'iinc_w', 'iload',
+                'iload_0', 'iload_1', 'iload_2', 'iload_3', 'iload_w', 'imul', 'ineg', 'int2byte',
+                'int2char', 'int2short', 'ior', 'irem', 'ireturn', 'ishl', 'ishr', 'istore', 'istore_0',
+                'istore_1', 'istore_2', 'istore_3', 'istore_w', 'isub', 'iushr', 'ixor', 'l2d', 'l2f',
+                'l2i', 'ladd', 'laload', 'land', 'lastore', 'lcmp', 'lconst_0', 'lconst_1', 'ldc2_w',
+                'ldiv', 'lload', 'lload_0', 'lload_1', 'lload_2', 'lload_3', 'lload_w', 'lmul', 'lneg',
+                'lookupswitch', 'lor', 'lrem', 'lreturn', 'lshl', 'lshr', 'lstore', 'lstore_0',
+                'lstore_1', 'lstore_2', 'lstore_3', 'lstore_w', 'lsub', 'lushr', 'lxor',
+                'monitorenter', 'monitorexit', 'nop', 'pop', 'pop2', 'ret', 'ret_w', 'return', 'saload',
+                'sastore', 'sipush', 'swap'), suffix=_break), Keyword.Reserved),
+            (r'(anewarray|checkcast|instanceof|ldc|ldc_w|new)%s' % _break,
+             Keyword.Reserved, 'class/no-dots'),
+            (r'invoke(dynamic|interface|nonvirtual|special|'
+             r'static|virtual)%s' % _break, Keyword.Reserved,
+             'invocation'),
+            (r'(getfield|putfield)%s' % _break, Keyword.Reserved,
+             ('descriptor/no-dots', 'field')),
+            (r'(getstatic|putstatic)%s' % _break, Keyword.Reserved,
+             ('descriptor/no-dots', 'static')),
+            (words((
+                'goto', 'goto_w', 'if_acmpeq', 'if_acmpne', 'if_icmpeq',
+                'if_icmpge', 'if_icmpgt', 'if_icmple', 'if_icmplt', 'if_icmpne',
+                'ifeq', 'ifge', 'ifgt', 'ifle', 'iflt', 'ifne', 'ifnonnull',
+                'ifnull', 'jsr', 'jsr_w'), suffix=_break),
+             Keyword.Reserved, 'label'),
+            (r'(multianewarray|newarray)%s' % _break, Keyword.Reserved,
+             'descriptor/convert-dots'),
+            (r'tableswitch%s' % _break, Keyword.Reserved, 'table')
+        ],
+        'quote': [
+            (r"'", String.Single, '#pop'),
+            (r'\\u[\da-fA-F]{4}', String.Escape),
+            (r"[^'\\]+", String.Single)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\([nrtfb"\'\\]|u[\da-fA-F]{4}|[0-3]?[0-7]{1,2})',
+             String.Escape),
+            (r'[^"\\]+', String.Double)
+        ],
+        'root': [
+            (r'\n+', Text),
+            (r"'", String.Single, 'quote'),
+            include('default'),
+            (r'(%s)([ \t\r]*)(:)' % _name,
+             bygroups(Name.Label, Text, Punctuation)),
+            (_name, String.Other)
+        ],
+        'annotation': [
+            (r'\n', Text, ('#pop', 'annotation-body')),
+            (r'default%s' % _break, Keyword.Reserved,
+             ('#pop', 'annotation-default')),
+            include('default')
+        ],
+        'annotation-body': [
+            (r'\n+', Text),
+            (r'\.end%s' % _break, Keyword.Reserved, '#pop'),
+            include('default'),
+            (_name, String.Other, ('annotation-items', 'descriptor/no-dots'))
+        ],
+        'annotation-default': [
+            (r'\n+', Text),
+            (r'\.end%s' % _break, Keyword.Reserved, '#pop'),
+            include('default'),
+            default(('annotation-items', 'descriptor/no-dots'))
+        ],
+        'annotation-items': [
+            (r"'", String.Single, 'quote'),
+            include('default'),
+            (_name, String.Other)
+        ],
+        'caught-exception': [
+            (r'all%s' % _break, Keyword, '#pop'),
+            include('exception')
+        ],
+        'class/convert-dots': [
+            include('default'),
+            (r'(L)((?:%s[/.])*)(%s)(;)' % (_unqualified_name, _name),
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (r'((?:%s[/.])*)(%s)' % (_unqualified_name, _name),
+             bygroups(Name.Namespace, Name.Class), '#pop')
+        ],
+        'class/no-dots': [
+            include('default'),
+            (r'\[+', Punctuation, ('#pop', 'descriptor/no-dots')),
+            (r'(L)((?:%s/)*)(%s)(;)' % (_unqualified_name, _name),
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (r'((?:%s/)*)(%s)' % (_unqualified_name, _name),
+             bygroups(Name.Namespace, Name.Class), '#pop')
+        ],
+        'descriptor/convert-dots': [
+            include('default'),
+            (r'\[+', Punctuation),
+            (r'(L)((?:%s[/.])*)(%s?)(;)' % (_unqualified_name, _name),
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (r'[^%s\[)L]+' % _separator, Keyword.Type, '#pop'),
+            default('#pop')
+        ],
+        'descriptor/no-dots': [
+            include('default'),
+            (r'\[+', Punctuation),
+            (r'(L)((?:%s/)*)(%s)(;)' % (_unqualified_name, _name),
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (r'[^%s\[)L]+' % _separator, Keyword.Type, '#pop'),
+            default('#pop')
+        ],
+        'descriptors/convert-dots': [
+            (r'\)', Punctuation, '#pop'),
+            default('descriptor/convert-dots')
+        ],
+        'enclosing-method': [
+            (_ws, Text),
+            (r'(?=[^%s]*\()' % _separator, Text, ('#pop', 'invocation')),
+            default(('#pop', 'class/convert-dots'))
+        ],
+        'exception': [
+            include('default'),
+            (r'((?:%s[/.])*)(%s)' % (_unqualified_name, _name),
+             bygroups(Name.Namespace, Name.Exception), '#pop')
+        ],
+        'field': [
+            (r'static%s' % _break, Keyword.Reserved, ('#pop', 'static')),
+            include('default'),
+            (r'((?:%s[/.](?=[^%s]*[/.]))*)(%s[/.])?(%s)' %
+             (_unqualified_name, _separator, _unqualified_name, _name),
+             bygroups(Name.Namespace, Name.Class, Name.Variable.Instance),
+             '#pop')
+        ],
+        'invocation': [
+            include('default'),
+            (r'((?:%s[/.](?=[^%s(]*[/.]))*)(%s[/.])?(%s)(\()' %
+             (_unqualified_name, _separator, _unqualified_name, _name),
+             bygroups(Name.Namespace, Name.Class, Name.Function, Punctuation),
+             ('#pop', 'descriptor/convert-dots', 'descriptors/convert-dots',
+              'descriptor/convert-dots'))
+        ],
+        'label': [
+            include('default'),
+            (_name, Name.Label, '#pop')
+        ],
+        'method': [
+            include('default'),
+            (r'(%s)(\()' % _name, bygroups(Name.Function, Punctuation),
+             ('#pop', 'descriptor/convert-dots', 'descriptors/convert-dots',
+              'descriptor/convert-dots'))
+        ],
+        'no-verification': [
+            (r'(locals|method|stack)%s' % _break, Keyword.Reserved, '#pop'),
+            include('default')
+        ],
+        'static': [
+            include('default'),
+            (r'((?:%s[/.](?=[^%s]*[/.]))*)(%s[/.])?(%s)' %
+             (_unqualified_name, _separator, _unqualified_name, _name),
+             bygroups(Name.Namespace, Name.Class, Name.Variable.Class), '#pop')
+        ],
+        'table': [
+            (r'\n+', Text),
+            (r'default%s' % _break, Keyword.Reserved, '#pop'),
+            include('default'),
+            (_name, Name.Label)
+        ],
+        'var': [
+            include('default'),
+            (_name, Name.Variable, '#pop')
+        ],
+        'verification': [
+            include('default'),
+            (r'(Double|Float|Integer|Long|Null|Top|UninitializedThis)%s' %
+             _break, Keyword, '#pop'),
+            (r'Object%s' % _break, Keyword, ('#pop', 'class/no-dots')),
+            (r'Uninitialized%s' % _break, Keyword, ('#pop', 'label'))
+        ]
+    }
+
+    def analyse_text(text):
+        score = 0
+        if re.search(r'^\s*\.class\s', text, re.MULTILINE):
+            score += 0.5
+            if re.search(r'^\s*[a-z]+_[a-z]+\b', text, re.MULTILINE):
+                score += 0.3
+        if re.search(r'^\s*\.(attribute|bytecode|debug|deprecated|enclosing|'
+                     r'inner|interface|limit|set|signature|stack)\b', text,
+                     re.MULTILINE):
+            score += 0.6
+        return score
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/matlab.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/matlab.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/matlab.py	(revision 1126)
@@ -0,0 +1,663 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.matlab
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Matlab and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, words, do_insertions
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+from pygments.lexers import _scilab_builtins
+
+__all__ = ['MatlabLexer', 'MatlabSessionLexer', 'OctaveLexer', 'ScilabLexer']
+
+
+class MatlabLexer(RegexLexer):
+    """
+    For Matlab source code.
+
+    .. versionadded:: 0.10
+    """
+    name = 'Matlab'
+    aliases = ['matlab']
+    filenames = ['*.m']
+    mimetypes = ['text/matlab']
+
+    #
+    # These lists are generated automatically.
+    # Run the following in bash shell:
+    #
+    # for f in elfun specfun elmat; do
+    #   echo -n "$f = "
+    #   matlab -nojvm -r "help $f;exit;" | perl -ne \
+    #   'push(@c,$1) if /^    (\w+)\s+-/; END {print q{["}.join(q{","},@c).qq{"]\n};}'
+    # done
+    #
+    # elfun: Elementary math functions
+    # specfun: Special Math functions
+    # elmat: Elementary matrices and matrix manipulation
+    #
+    # taken from Matlab version 7.4.0.336 (R2007a)
+    #
+    elfun = ("sin", "sind", "sinh", "asin", "asind", "asinh", "cos", "cosd", "cosh",
+             "acos", "acosd", "acosh", "tan", "tand", "tanh", "atan", "atand", "atan2",
+             "atanh", "sec", "secd", "sech", "asec", "asecd", "asech", "csc", "cscd",
+             "csch", "acsc", "acscd", "acsch", "cot", "cotd", "coth", "acot", "acotd",
+             "acoth", "hypot", "exp", "expm1", "log", "log1p", "log10", "log2", "pow2",
+             "realpow", "reallog", "realsqrt", "sqrt", "nthroot", "nextpow2", "abs",
+             "angle", "complex", "conj", "imag", "real", "unwrap", "isreal", "cplxpair",
+             "fix", "floor", "ceil", "round", "mod", "rem", "sign")
+    specfun = ("airy", "besselj", "bessely", "besselh", "besseli", "besselk", "beta",
+               "betainc", "betaln", "ellipj", "ellipke", "erf", "erfc", "erfcx",
+               "erfinv", "expint", "gamma", "gammainc", "gammaln", "psi", "legendre",
+               "cross", "dot", "factor", "isprime", "primes", "gcd", "lcm", "rat",
+               "rats", "perms", "nchoosek", "factorial", "cart2sph", "cart2pol",
+               "pol2cart", "sph2cart", "hsv2rgb", "rgb2hsv")
+    elmat = ("zeros", "ones", "eye", "repmat", "rand", "randn", "linspace", "logspace",
+             "freqspace", "meshgrid", "accumarray", "size", "length", "ndims", "numel",
+             "disp", "isempty", "isequal", "isequalwithequalnans", "cat", "reshape",
+             "diag", "blkdiag", "tril", "triu", "fliplr", "flipud", "flipdim", "rot90",
+             "find", "end", "sub2ind", "ind2sub", "bsxfun", "ndgrid", "permute",
+             "ipermute", "shiftdim", "circshift", "squeeze", "isscalar", "isvector",
+             "ans", "eps", "realmax", "realmin", "pi", "i", "inf", "nan", "isnan",
+             "isinf", "isfinite", "j", "why", "compan", "gallery", "hadamard", "hankel",
+             "hilb", "invhilb", "magic", "pascal", "rosser", "toeplitz", "vander",
+             "wilkinson")
+
+    tokens = {
+        'root': [
+            # line starting with '!' is sent as a system command.  not sure what
+            # label to use...
+            (r'^!.*', String.Other),
+            (r'%\{\s*\n', Comment.Multiline, 'blockcomment'),
+            (r'%.*$', Comment),
+            (r'^\s*function', Keyword, 'deffunc'),
+
+            # from 'iskeyword' on version 7.11 (R2010):
+            (words((
+                'break', 'case', 'catch', 'classdef', 'continue', 'else', 'elseif',
+                'end', 'enumerated', 'events', 'for', 'function', 'global', 'if',
+                'methods', 'otherwise', 'parfor', 'persistent', 'properties',
+                'return', 'spmd', 'switch', 'try', 'while'), suffix=r'\b'),
+             Keyword),
+
+            ("(" + "|".join(elfun + specfun + elmat) + r')\b',  Name.Builtin),
+
+            # line continuation with following comment:
+            (r'\.\.\..*$', Comment),
+
+            # operators:
+            (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator),
+            # operators requiring escape for re:
+            (r'\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\', Operator),
+
+            # punctuation:
+            (r'\[|\]|\(|\)|\{|\}|:|@|\.|,', Punctuation),
+            (r'=|:|;', Punctuation),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+
+            (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eEf][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            (r'(?<![\w)\].])\'', String, 'string'),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'.', Text),
+        ],
+        'string': [
+            (r'[^\']*\'', String, '#pop')
+        ],
+        'blockcomment': [
+            (r'^\s*%\}', Comment.Multiline, '#pop'),
+            (r'^.*\n', Comment.Multiline),
+            (r'.', Comment.Multiline),
+        ],
+        'deffunc': [
+            (r'(\s*)(?:(.+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
+             bygroups(Whitespace, Text, Whitespace, Punctuation,
+                      Whitespace, Name.Function, Punctuation, Text,
+                      Punctuation, Whitespace), '#pop'),
+            # function with no args
+            (r'(\s*)([a-zA-Z_]\w*)', bygroups(Text, Name.Function), '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.match('^\s*%', text, re.M):  # comment
+            return 0.2
+        elif re.match('^!\w+', text, re.M):  # system cmd
+            return 0.2
+
+
+line_re  = re.compile('.*?\n')
+
+
+class MatlabSessionLexer(Lexer):
+    """
+    For Matlab sessions.  Modeled after PythonConsoleLexer.
+    Contributed by Ken Schutte <kschutte@csail.mit.edu>.
+
+    .. versionadded:: 0.10
+    """
+    name = 'Matlab session'
+    aliases = ['matlabsession']
+
+    def get_tokens_unprocessed(self, text):
+        mlexer = MatlabLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+
+        for match in line_re.finditer(text):
+            line = match.group()
+
+            if line.startswith('>> '):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:3])]))
+                curcode += line[3:]
+
+            elif line.startswith('>>'):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:2])]))
+                curcode += line[2:]
+
+            elif line.startswith('???'):
+
+                idx = len(curcode)
+
+                # without is showing error on same line as before...?
+                # line = "\n" + line
+                token = (0, Generic.Traceback, line)
+                insertions.append((idx, [token]))
+
+            else:
+                if curcode:
+                    for item in do_insertions(
+                            insertions, mlexer.get_tokens_unprocessed(curcode)):
+                        yield item
+                    curcode = ''
+                    insertions = []
+
+                yield match.start(), Generic.Output, line
+
+        if curcode:  # or item:
+            for item in do_insertions(
+                    insertions, mlexer.get_tokens_unprocessed(curcode)):
+                yield item
+
+
+class OctaveLexer(RegexLexer):
+    """
+    For GNU Octave source code.
+
+    .. versionadded:: 1.5
+    """
+    name = 'Octave'
+    aliases = ['octave']
+    filenames = ['*.m']
+    mimetypes = ['text/octave']
+
+    # These lists are generated automatically.
+    # Run the following in bash shell:
+    #
+    # First dump all of the Octave manual into a plain text file:
+    #
+    #   $ info octave --subnodes -o octave-manual
+    #
+    # Now grep through it:
+
+    # for i in \
+    #     "Built-in Function" "Command" "Function File" \
+    #     "Loadable Function" "Mapping Function";
+    # do
+    #     perl -e '@name = qw('"$i"');
+    #              print lc($name[0]),"_kw = [\n"';
+    #
+    #     perl -n -e 'print "\"$1\",\n" if /-- '"$i"': .* (\w*) \(/;' \
+    #         octave-manual | sort | uniq ;
+    #     echo "]" ;
+    #     echo;
+    # done
+
+    # taken from Octave Mercurial changeset 8cc154f45e37 (30-jan-2011)
+
+    builtin_kw = (
+        "addlistener", "addpath", "addproperty", "all",
+        "and", "any", "argnames", "argv", "assignin",
+        "atexit", "autoload",
+        "available_graphics_toolkits", "beep_on_error",
+        "bitand", "bitmax", "bitor", "bitshift", "bitxor",
+        "cat", "cell", "cellstr", "char", "class", "clc",
+        "columns", "command_line_path",
+        "completion_append_char", "completion_matches",
+        "complex", "confirm_recursive_rmdir", "cputime",
+        "crash_dumps_octave_core", "ctranspose", "cumprod",
+        "cumsum", "debug_on_error", "debug_on_interrupt",
+        "debug_on_warning", "default_save_options",
+        "dellistener", "diag", "diff", "disp",
+        "doc_cache_file", "do_string_escapes", "double",
+        "drawnow", "e", "echo_executing_commands", "eps",
+        "eq", "errno", "errno_list", "error", "eval",
+        "evalin", "exec", "exist", "exit", "eye", "false",
+        "fclear", "fclose", "fcntl", "fdisp", "feof",
+        "ferror", "feval", "fflush", "fgetl", "fgets",
+        "fieldnames", "file_in_loadpath", "file_in_path",
+        "filemarker", "filesep", "find_dir_in_path",
+        "fixed_point_format", "fnmatch", "fopen", "fork",
+        "formula", "fprintf", "fputs", "fread", "freport",
+        "frewind", "fscanf", "fseek", "fskipl", "ftell",
+        "functions", "fwrite", "ge", "genpath", "get",
+        "getegid", "getenv", "geteuid", "getgid",
+        "getpgrp", "getpid", "getppid", "getuid", "glob",
+        "gt", "gui_mode", "history_control",
+        "history_file", "history_size",
+        "history_timestamp_format_string", "home",
+        "horzcat", "hypot", "ifelse",
+        "ignore_function_time_stamp", "inferiorto",
+        "info_file", "info_program", "inline", "input",
+        "intmax", "intmin", "ipermute",
+        "is_absolute_filename", "isargout", "isbool",
+        "iscell", "iscellstr", "ischar", "iscomplex",
+        "isempty", "isfield", "isfloat", "isglobal",
+        "ishandle", "isieee", "isindex", "isinteger",
+        "islogical", "ismatrix", "ismethod", "isnull",
+        "isnumeric", "isobject", "isreal",
+        "is_rooted_relative_filename", "issorted",
+        "isstruct", "isvarname", "kbhit", "keyboard",
+        "kill", "lasterr", "lasterror", "lastwarn",
+        "ldivide", "le", "length", "link", "linspace",
+        "logical", "lstat", "lt", "make_absolute_filename",
+        "makeinfo_program", "max_recursion_depth", "merge",
+        "methods", "mfilename", "minus", "mislocked",
+        "mkdir", "mkfifo", "mkstemp", "mldivide", "mlock",
+        "mouse_wheel_zoom", "mpower", "mrdivide", "mtimes",
+        "munlock", "nargin", "nargout",
+        "native_float_format", "ndims", "ne", "nfields",
+        "nnz", "norm", "not", "numel", "nzmax",
+        "octave_config_info", "octave_core_file_limit",
+        "octave_core_file_name",
+        "octave_core_file_options", "ones", "or",
+        "output_max_field_width", "output_precision",
+        "page_output_immediately", "page_screen_output",
+        "path", "pathsep", "pause", "pclose", "permute",
+        "pi", "pipe", "plus", "popen", "power",
+        "print_empty_dimensions", "printf",
+        "print_struct_array_contents", "prod",
+        "program_invocation_name", "program_name",
+        "putenv", "puts", "pwd", "quit", "rats", "rdivide",
+        "readdir", "readlink", "read_readline_init_file",
+        "realmax", "realmin", "rehash", "rename",
+        "repelems", "re_read_readline_init_file", "reset",
+        "reshape", "resize", "restoredefaultpath",
+        "rethrow", "rmdir", "rmfield", "rmpath", "rows",
+        "save_header_format_string", "save_precision",
+        "saving_history", "scanf", "set", "setenv",
+        "shell_cmd", "sighup_dumps_octave_core",
+        "sigterm_dumps_octave_core", "silent_functions",
+        "single", "size", "size_equal", "sizemax",
+        "sizeof", "sleep", "source", "sparse_auto_mutate",
+        "split_long_rows", "sprintf", "squeeze", "sscanf",
+        "stat", "stderr", "stdin", "stdout", "strcmp",
+        "strcmpi", "string_fill_char", "strncmp",
+        "strncmpi", "struct", "struct_levels_to_print",
+        "strvcat", "subsasgn", "subsref", "sum", "sumsq",
+        "superiorto", "suppress_verbose_help_message",
+        "symlink", "system", "tic", "tilde_expand",
+        "times", "tmpfile", "tmpnam", "toc", "toupper",
+        "transpose", "true", "typeinfo", "umask", "uminus",
+        "uname", "undo_string_escapes", "unlink", "uplus",
+        "upper", "usage", "usleep", "vec", "vectorize",
+        "vertcat", "waitpid", "warning", "warranty",
+        "whos_line_format", "yes_or_no", "zeros",
+        "inf", "Inf", "nan", "NaN")
+
+    command_kw = ("close", "load", "who", "whos")
+
+    function_kw = (
+        "accumarray", "accumdim", "acosd", "acotd",
+        "acscd", "addtodate", "allchild", "ancestor",
+        "anova", "arch_fit", "arch_rnd", "arch_test",
+        "area", "arma_rnd", "arrayfun", "ascii", "asctime",
+        "asecd", "asind", "assert", "atand",
+        "autoreg_matrix", "autumn", "axes", "axis", "bar",
+        "barh", "bartlett", "bartlett_test", "beep",
+        "betacdf", "betainv", "betapdf", "betarnd",
+        "bicgstab", "bicubic", "binary", "binocdf",
+        "binoinv", "binopdf", "binornd", "bitcmp",
+        "bitget", "bitset", "blackman", "blanks",
+        "blkdiag", "bone", "box", "brighten", "calendar",
+        "cast", "cauchy_cdf", "cauchy_inv", "cauchy_pdf",
+        "cauchy_rnd", "caxis", "celldisp", "center", "cgs",
+        "chisquare_test_homogeneity",
+        "chisquare_test_independence", "circshift", "cla",
+        "clabel", "clf", "clock", "cloglog", "closereq",
+        "colon", "colorbar", "colormap", "colperm",
+        "comet", "common_size", "commutation_matrix",
+        "compan", "compare_versions", "compass",
+        "computer", "cond", "condest", "contour",
+        "contourc", "contourf", "contrast", "conv",
+        "convhull", "cool", "copper", "copyfile", "cor",
+        "corrcoef", "cor_test", "cosd", "cotd", "cov",
+        "cplxpair", "cross", "cscd", "cstrcat", "csvread",
+        "csvwrite", "ctime", "cumtrapz", "curl", "cut",
+        "cylinder", "date", "datenum", "datestr",
+        "datetick", "datevec", "dblquad", "deal",
+        "deblank", "deconv", "delaunay", "delaunayn",
+        "delete", "demo", "detrend", "diffpara", "diffuse",
+        "dir", "discrete_cdf", "discrete_inv",
+        "discrete_pdf", "discrete_rnd", "display",
+        "divergence", "dlmwrite", "dos", "dsearch",
+        "dsearchn", "duplication_matrix", "durbinlevinson",
+        "ellipsoid", "empirical_cdf", "empirical_inv",
+        "empirical_pdf", "empirical_rnd", "eomday",
+        "errorbar", "etime", "etreeplot", "example",
+        "expcdf", "expinv", "expm", "exppdf", "exprnd",
+        "ezcontour", "ezcontourf", "ezmesh", "ezmeshc",
+        "ezplot", "ezpolar", "ezsurf", "ezsurfc", "factor",
+        "factorial", "fail", "fcdf", "feather", "fftconv",
+        "fftfilt", "fftshift", "figure", "fileattrib",
+        "fileparts", "fill", "findall", "findobj",
+        "findstr", "finv", "flag", "flipdim", "fliplr",
+        "flipud", "fpdf", "fplot", "fractdiff", "freqz",
+        "freqz_plot", "frnd", "fsolve",
+        "f_test_regression", "ftp", "fullfile", "fzero",
+        "gamcdf", "gaminv", "gampdf", "gamrnd", "gca",
+        "gcbf", "gcbo", "gcf", "genvarname", "geocdf",
+        "geoinv", "geopdf", "geornd", "getfield", "ginput",
+        "glpk", "gls", "gplot", "gradient",
+        "graphics_toolkit", "gray", "grid", "griddata",
+        "griddatan", "gtext", "gunzip", "gzip", "hadamard",
+        "hamming", "hankel", "hanning", "hggroup",
+        "hidden", "hilb", "hist", "histc", "hold", "hot",
+        "hotelling_test", "housh", "hsv", "hurst",
+        "hygecdf", "hygeinv", "hygepdf", "hygernd",
+        "idivide", "ifftshift", "image", "imagesc",
+        "imfinfo", "imread", "imshow", "imwrite", "index",
+        "info", "inpolygon", "inputname", "interpft",
+        "interpn", "intersect", "invhilb", "iqr", "isa",
+        "isdefinite", "isdir", "is_duplicate_entry",
+        "isequal", "isequalwithequalnans", "isfigure",
+        "ishermitian", "ishghandle", "is_leap_year",
+        "isletter", "ismac", "ismember", "ispc", "isprime",
+        "isprop", "isscalar", "issquare", "isstrprop",
+        "issymmetric", "isunix", "is_valid_file_id",
+        "isvector", "jet", "kendall",
+        "kolmogorov_smirnov_cdf",
+        "kolmogorov_smirnov_test", "kruskal_wallis_test",
+        "krylov", "kurtosis", "laplace_cdf", "laplace_inv",
+        "laplace_pdf", "laplace_rnd", "legend", "legendre",
+        "license", "line", "linkprop", "list_primes",
+        "loadaudio", "loadobj", "logistic_cdf",
+        "logistic_inv", "logistic_pdf", "logistic_rnd",
+        "logit", "loglog", "loglogerr", "logm", "logncdf",
+        "logninv", "lognpdf", "lognrnd", "logspace",
+        "lookfor", "ls_command", "lsqnonneg", "magic",
+        "mahalanobis", "manova", "matlabroot",
+        "mcnemar_test", "mean", "meansq", "median", "menu",
+        "mesh", "meshc", "meshgrid", "meshz", "mexext",
+        "mget", "mkpp", "mode", "moment", "movefile",
+        "mpoles", "mput", "namelengthmax", "nargchk",
+        "nargoutchk", "nbincdf", "nbininv", "nbinpdf",
+        "nbinrnd", "nchoosek", "ndgrid", "newplot", "news",
+        "nonzeros", "normcdf", "normest", "norminv",
+        "normpdf", "normrnd", "now", "nthroot", "null",
+        "ocean", "ols", "onenormest", "optimget",
+        "optimset", "orderfields", "orient", "orth",
+        "pack", "pareto", "parseparams", "pascal", "patch",
+        "pathdef", "pcg", "pchip", "pcolor", "pcr",
+        "peaks", "periodogram", "perl", "perms", "pie",
+        "pink", "planerot", "playaudio", "plot",
+        "plotmatrix", "plotyy", "poisscdf", "poissinv",
+        "poisspdf", "poissrnd", "polar", "poly",
+        "polyaffine", "polyarea", "polyderiv", "polyfit",
+        "polygcd", "polyint", "polyout", "polyreduce",
+        "polyval", "polyvalm", "postpad", "powerset",
+        "ppder", "ppint", "ppjumps", "ppplot", "ppval",
+        "pqpnonneg", "prepad", "primes", "print",
+        "print_usage", "prism", "probit", "qp", "qqplot",
+        "quadcc", "quadgk", "quadl", "quadv", "quiver",
+        "qzhess", "rainbow", "randi", "range", "rank",
+        "ranks", "rat", "reallog", "realpow", "realsqrt",
+        "record", "rectangle_lw", "rectangle_sw",
+        "rectint", "refresh", "refreshdata",
+        "regexptranslate", "repmat", "residue", "ribbon",
+        "rindex", "roots", "rose", "rosser", "rotdim",
+        "rref", "run", "run_count", "rundemos", "run_test",
+        "runtests", "saveas", "saveaudio", "saveobj",
+        "savepath", "scatter", "secd", "semilogx",
+        "semilogxerr", "semilogy", "semilogyerr",
+        "setaudio", "setdiff", "setfield", "setxor",
+        "shading", "shift", "shiftdim", "sign_test",
+        "sinc", "sind", "sinetone", "sinewave", "skewness",
+        "slice", "sombrero", "sortrows", "spaugment",
+        "spconvert", "spdiags", "spearman", "spectral_adf",
+        "spectral_xdf", "specular", "speed", "spencer",
+        "speye", "spfun", "sphere", "spinmap", "spline",
+        "spones", "sprand", "sprandn", "sprandsym",
+        "spring", "spstats", "spy", "sqp", "stairs",
+        "statistics", "std", "stdnormal_cdf",
+        "stdnormal_inv", "stdnormal_pdf", "stdnormal_rnd",
+        "stem", "stft", "strcat", "strchr", "strjust",
+        "strmatch", "strread", "strsplit", "strtok",
+        "strtrim", "strtrunc", "structfun", "studentize",
+        "subplot", "subsindex", "subspace", "substr",
+        "substruct", "summer", "surf", "surface", "surfc",
+        "surfl", "surfnorm", "svds", "swapbytes",
+        "sylvester_matrix", "symvar", "synthesis", "table",
+        "tand", "tar", "tcdf", "tempdir", "tempname",
+        "test", "text", "textread", "textscan", "tinv",
+        "title", "toeplitz", "tpdf", "trace", "trapz",
+        "treelayout", "treeplot", "triangle_lw",
+        "triangle_sw", "tril", "trimesh", "triplequad",
+        "triplot", "trisurf", "triu", "trnd", "tsearchn",
+        "t_test", "t_test_regression", "type", "unidcdf",
+        "unidinv", "unidpdf", "unidrnd", "unifcdf",
+        "unifinv", "unifpdf", "unifrnd", "union", "unique",
+        "unix", "unmkpp", "unpack", "untabify", "untar",
+        "unwrap", "unzip", "u_test", "validatestring",
+        "vander", "var", "var_test", "vech", "ver",
+        "version", "view", "voronoi", "voronoin",
+        "waitforbuttonpress", "wavread", "wavwrite",
+        "wblcdf", "wblinv", "wblpdf", "wblrnd", "weekday",
+        "welch_test", "what", "white", "whitebg",
+        "wienrnd", "wilcoxon_test", "wilkinson", "winter",
+        "xlabel", "xlim", "ylabel", "yulewalker", "zip",
+        "zlabel", "z_test")
+
+    loadable_kw = (
+        "airy", "amd", "balance", "besselh", "besseli",
+        "besselj", "besselk", "bessely", "bitpack",
+        "bsxfun", "builtin", "ccolamd", "cellfun",
+        "cellslices", "chol", "choldelete", "cholinsert",
+        "cholinv", "cholshift", "cholupdate", "colamd",
+        "colloc", "convhulln", "convn", "csymamd",
+        "cummax", "cummin", "daspk", "daspk_options",
+        "dasrt", "dasrt_options", "dassl", "dassl_options",
+        "dbclear", "dbdown", "dbstack", "dbstatus",
+        "dbstop", "dbtype", "dbup", "dbwhere", "det",
+        "dlmread", "dmperm", "dot", "eig", "eigs",
+        "endgrent", "endpwent", "etree", "fft", "fftn",
+        "fftw", "filter", "find", "full", "gcd",
+        "getgrent", "getgrgid", "getgrnam", "getpwent",
+        "getpwnam", "getpwuid", "getrusage", "givens",
+        "gmtime", "gnuplot_binary", "hess", "ifft",
+        "ifftn", "inv", "isdebugmode", "issparse", "kron",
+        "localtime", "lookup", "lsode", "lsode_options",
+        "lu", "luinc", "luupdate", "matrix_type", "max",
+        "min", "mktime", "pinv", "qr", "qrdelete",
+        "qrinsert", "qrshift", "qrupdate", "quad",
+        "quad_options", "qz", "rand", "rande", "randg",
+        "randn", "randp", "randperm", "rcond", "regexp",
+        "regexpi", "regexprep", "schur", "setgrent",
+        "setpwent", "sort", "spalloc", "sparse", "spparms",
+        "sprank", "sqrtm", "strfind", "strftime",
+        "strptime", "strrep", "svd", "svd_driver", "syl",
+        "symamd", "symbfact", "symrcm", "time", "tsearch",
+        "typecast", "urlread", "urlwrite")
+
+    mapping_kw = (
+        "abs", "acos", "acosh", "acot", "acoth", "acsc",
+        "acsch", "angle", "arg", "asec", "asech", "asin",
+        "asinh", "atan", "atanh", "beta", "betainc",
+        "betaln", "bincoeff", "cbrt", "ceil", "conj", "cos",
+        "cosh", "cot", "coth", "csc", "csch", "erf", "erfc",
+        "erfcx", "erfinv", "exp", "finite", "fix", "floor",
+        "fmod", "gamma", "gammainc", "gammaln", "imag",
+        "isalnum", "isalpha", "isascii", "iscntrl",
+        "isdigit", "isfinite", "isgraph", "isinf",
+        "islower", "isna", "isnan", "isprint", "ispunct",
+        "isspace", "isupper", "isxdigit", "lcm", "lgamma",
+        "log", "lower", "mod", "real", "rem", "round",
+        "roundb", "sec", "sech", "sign", "sin", "sinh",
+        "sqrt", "tan", "tanh", "toascii", "tolower", "xor")
+
+    builtin_consts = (
+        "EDITOR", "EXEC_PATH", "I", "IMAGE_PATH", "NA",
+        "OCTAVE_HOME", "OCTAVE_VERSION", "PAGER",
+        "PAGER_FLAGS", "SEEK_CUR", "SEEK_END", "SEEK_SET",
+        "SIG", "S_ISBLK", "S_ISCHR", "S_ISDIR", "S_ISFIFO",
+        "S_ISLNK", "S_ISREG", "S_ISSOCK", "WCONTINUE",
+        "WCOREDUMP", "WEXITSTATUS", "WIFCONTINUED",
+        "WIFEXITED", "WIFSIGNALED", "WIFSTOPPED", "WNOHANG",
+        "WSTOPSIG", "WTERMSIG", "WUNTRACED")
+
+    tokens = {
+        'root': [
+            # We should look into multiline comments
+            (r'[%#].*$', Comment),
+            (r'^\s*function', Keyword, 'deffunc'),
+
+            # from 'iskeyword' on hg changeset 8cc154f45e37
+            (words((
+                '__FILE__', '__LINE__', 'break', 'case', 'catch', 'classdef', 'continue', 'do', 'else',
+                'elseif', 'end', 'end_try_catch', 'end_unwind_protect', 'endclassdef',
+                'endevents', 'endfor', 'endfunction', 'endif', 'endmethods', 'endproperties',
+                'endswitch', 'endwhile', 'events', 'for', 'function', 'get', 'global', 'if', 'methods',
+                'otherwise', 'persistent', 'properties', 'return', 'set', 'static', 'switch', 'try',
+                'until', 'unwind_protect', 'unwind_protect_cleanup', 'while'), suffix=r'\b'),
+             Keyword),
+
+            (words(builtin_kw + command_kw + function_kw + loadable_kw + mapping_kw,
+                   suffix=r'\b'),  Name.Builtin),
+
+            (words(builtin_consts, suffix=r'\b'), Name.Constant),
+
+            # operators in Octave but not Matlab:
+            (r'-=|!=|!|/=|--', Operator),
+            # operators:
+            (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator),
+            # operators in Octave but not Matlab requiring escape for re:
+            (r'\*=|\+=|\^=|\/=|\\=|\*\*|\+\+|\.\*\*', Operator),
+            # operators requiring escape for re:
+            (r'\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\', Operator),
+
+
+            # punctuation:
+            (r'[\[\](){}:@.,]', Punctuation),
+            (r'=|:|;', Punctuation),
+
+            (r'"[^"]*"', String),
+
+            (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eEf][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+            (r'(?<![\w)\].])\'', String, 'string'),
+
+            (r'[a-zA-Z_]\w*', Name),
+            (r'.', Text),
+        ],
+        'string': [
+            (r"[^']*'", String, '#pop'),
+        ],
+        'deffunc': [
+            (r'(\s*)(?:(.+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
+             bygroups(Whitespace, Text, Whitespace, Punctuation,
+                      Whitespace, Name.Function, Punctuation, Text,
+                      Punctuation, Whitespace), '#pop'),
+            # function with no args
+            (r'(\s*)([a-zA-Z_]\w*)', bygroups(Text, Name.Function), '#pop'),
+        ],
+    }
+
+
+class ScilabLexer(RegexLexer):
+    """
+    For Scilab source code.
+
+    .. versionadded:: 1.5
+    """
+    name = 'Scilab'
+    aliases = ['scilab']
+    filenames = ['*.sci', '*.sce', '*.tst']
+    mimetypes = ['text/scilab']
+
+    tokens = {
+        'root': [
+            (r'//.*?$', Comment.Single),
+            (r'^\s*function', Keyword, 'deffunc'),
+
+            (words((
+                '__FILE__', '__LINE__', 'break', 'case', 'catch', 'classdef', 'continue', 'do', 'else',
+                'elseif', 'end', 'end_try_catch', 'end_unwind_protect', 'endclassdef',
+                'endevents', 'endfor', 'endfunction', 'endif', 'endmethods', 'endproperties',
+                'endswitch', 'endwhile', 'events', 'for', 'function', 'get', 'global', 'if', 'methods',
+                'otherwise', 'persistent', 'properties', 'return', 'set', 'static', 'switch', 'try',
+                'until', 'unwind_protect', 'unwind_protect_cleanup', 'while'), suffix=r'\b'),
+             Keyword),
+
+            (words(_scilab_builtins.functions_kw +
+                   _scilab_builtins.commands_kw +
+                   _scilab_builtins.macros_kw, suffix=r'\b'), Name.Builtin),
+
+            (words(_scilab_builtins.variables_kw, suffix=r'\b'), Name.Constant),
+
+            # operators:
+            (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator),
+            # operators requiring escape for re:
+            (r'\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\', Operator),
+
+            # punctuation:
+            (r'[\[\](){}@.,=:;]', Punctuation),
+
+            (r'"[^"]*"', String),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+            (r'(?<![\w)\].])\'', String, 'string'),
+
+            (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eEf][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            (r'[a-zA-Z_]\w*', Name),
+            (r'.', Text),
+        ],
+        'string': [
+            (r"[^']*'", String, '#pop'),
+            (r'.', String, '#pop'),
+        ],
+        'deffunc': [
+            (r'(\s*)(?:(.+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
+             bygroups(Whitespace, Text, Whitespace, Punctuation,
+                      Whitespace, Name.Function, Punctuation, Text,
+                      Punctuation, Whitespace), '#pop'),
+            # function with no args
+            (r'(\s*)([a-zA-Z_]\w*)', bygroups(Text, Name.Function), '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/inferno.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/inferno.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/inferno.py	(revision 1126)
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.inferno
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Inferno os and all the related stuff.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default
+from pygments.token import Punctuation, Text, Comment, Operator, Keyword, \
+    Name, String, Number
+
+__all__ = ['LimboLexer']
+
+
+class LimboLexer(RegexLexer):
+    """
+    Lexer for `Limbo programming language <http://www.vitanuova.com/inferno/limbo.html>`_
+
+    TODO:
+        - maybe implement better var declaration highlighting
+        - some simple syntax error highlighting
+
+    .. versionadded:: 2.0
+    """
+    name = 'Limbo'
+    aliases = ['limbo']
+    filenames = ['*.b']
+    mimetypes = ['text/limbo']
+
+    tokens = {
+        'whitespace': [
+            (r'^(\s*)([a-zA-Z_]\w*:(\s*)\n)',
+             bygroups(Text, Name.Label)),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'#(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String), # all other characters
+            (r'\\', String), # stray backslash
+        ],
+        'statements': [
+            (r'"', String, 'string'),
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])', Number.Float),
+            (r'16r[0-9a-fA-F]+', Number.Hex),
+            (r'8r[0-7]+', Number.Oct),
+            (r'((([1-3]\d)|([2-9]))r)?(\d+)', Number.Integer),
+            (r'[()\[\],.]', Punctuation),
+            (r'[~!%^&*+=|?:<>/-]|(->)|(<-)|(=>)|(::)', Operator),
+            (r'(alt|break|case|continue|cyclic|do|else|exit'
+             r'for|hd|if|implement|import|include|len|load|or'
+             r'pick|return|spawn|tagof|tl|to|while)\b', Keyword),
+            (r'(byte|int|big|real|string|array|chan|list|adt'
+             r'|fn|ref|of|module|self|type)\b', Keyword.Type),
+            (r'(con|iota|nil)\b', Keyword.Constant),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'statement' : [
+            include('whitespace'),
+            include('statements'),
+            ('[{}]', Punctuation),
+            (';', Punctuation, '#pop'),
+        ],
+        'root': [
+            include('whitespace'),
+            default('statement'),
+        ],
+    }
+
+    def analyse_text(text):
+        # Any limbo module implements something
+        if re.search(r'^implement \w+;', text, re.MULTILINE):
+            return 0.7
+
+# TODO:
+#   - Make lexers for:
+#       - asm sources
+#       - man pages
+#       - mkfiles
+#       - module definitions
+#       - namespace definitions
+#       - shell scripts
+#       - maybe keyfiles and fonts
+#   they all seem to be quite similar to their equivalents
+#   from unix world, so there should not be a lot of problems
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/perl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/perl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/perl.py	(revision 1126)
@@ -0,0 +1,620 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.perl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Perl and related languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \
+    using, this, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+from pygments.util import shebang_matches
+
+__all__ = ['PerlLexer', 'Perl6Lexer']
+
+
+class PerlLexer(RegexLexer):
+    """
+    For `Perl <http://www.perl.org>`_ source code.
+    """
+
+    name = 'Perl'
+    aliases = ['perl', 'pl']
+    filenames = ['*.pl', '*.pm', '*.t']
+    mimetypes = ['text/x-perl', 'application/x-perl']
+
+    flags = re.DOTALL | re.MULTILINE
+    # TODO: give this to a perl guy who knows how to parse perl...
+    tokens = {
+        'balanced-regex': [
+            (r'/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*', String.Regex, '#pop'),
+            (r'!(\\\\|\\[^\\]|[^\\!])*![egimosx]*', String.Regex, '#pop'),
+            (r'\\(\\\\|[^\\])*\\[egimosx]*', String.Regex, '#pop'),
+            (r'\{(\\\\|\\[^\\]|[^\\}])*\}[egimosx]*', String.Regex, '#pop'),
+            (r'<(\\\\|\\[^\\]|[^\\>])*>[egimosx]*', String.Regex, '#pop'),
+            (r'\[(\\\\|\\[^\\]|[^\\\]])*\][egimosx]*', String.Regex, '#pop'),
+            (r'\((\\\\|\\[^\\]|[^\\)])*\)[egimosx]*', String.Regex, '#pop'),
+            (r'@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*', String.Regex, '#pop'),
+            (r'%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*', String.Regex, '#pop'),
+            (r'\$(\\\\|\\[^\\]|[^\\$])*\$[egimosx]*', String.Regex, '#pop'),
+        ],
+        'root': [
+            (r'\A\#!.+?$', Comment.Hashbang),
+            (r'\#.*?$', Comment.Single),
+            (r'^=[a-zA-Z0-9]+\s+.*?\n=cut', Comment.Multiline),
+            (words((
+                'case', 'continue', 'do', 'else', 'elsif', 'for', 'foreach',
+                'if', 'last', 'my', 'next', 'our', 'redo', 'reset', 'then',
+                'unless', 'until', 'while', 'print', 'new', 'BEGIN',
+                'CHECK', 'INIT', 'END', 'return'), suffix=r'\b'),
+             Keyword),
+            (r'(format)(\s+)(\w+)(\s*)(=)(\s*\n)',
+             bygroups(Keyword, Text, Name, Text, Punctuation, Text), 'format'),
+            (r'(eq|lt|gt|le|ge|ne|not|and|or|cmp)\b', Operator.Word),
+            # common delimiters
+            (r's/(\\\\|\\[^\\]|[^\\/])*/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*',
+                String.Regex),
+            (r's!(\\\\|\\!|[^!])*!(\\\\|\\!|[^!])*![egimosx]*', String.Regex),
+            (r's\\(\\\\|[^\\])*\\(\\\\|[^\\])*\\[egimosx]*', String.Regex),
+            (r's@(\\\\|\\[^\\]|[^\\@])*@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*',
+                String.Regex),
+            (r's%(\\\\|\\[^\\]|[^\\%])*%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*',
+                String.Regex),
+            # balanced delimiters
+            (r's\{(\\\\|\\[^\\]|[^\\}])*\}\s*', String.Regex, 'balanced-regex'),
+            (r's<(\\\\|\\[^\\]|[^\\>])*>\s*', String.Regex, 'balanced-regex'),
+            (r's\[(\\\\|\\[^\\]|[^\\\]])*\]\s*', String.Regex,
+                'balanced-regex'),
+            (r's\((\\\\|\\[^\\]|[^\\)])*\)\s*', String.Regex,
+                'balanced-regex'),
+
+            (r'm?/(\\\\|\\[^\\]|[^\\/\n])*/[gcimosx]*', String.Regex),
+            (r'm(?=[/!\\{<\[(@%$])', String.Regex, 'balanced-regex'),
+            (r'((?<==~)|(?<=\())\s*/(\\\\|\\[^\\]|[^\\/])*/[gcimosx]*',
+                String.Regex),
+            (r'\s+', Text),
+            (words((
+                'abs', 'accept', 'alarm', 'atan2', 'bind', 'binmode', 'bless', 'caller', 'chdir',
+                'chmod', 'chomp', 'chop', 'chown', 'chr', 'chroot', 'close', 'closedir', 'connect',
+                'continue', 'cos', 'crypt', 'dbmclose', 'dbmopen', 'defined', 'delete', 'die',
+                'dump', 'each', 'endgrent', 'endhostent', 'endnetent', 'endprotoent',
+                'endpwent', 'endservent', 'eof', 'eval', 'exec', 'exists', 'exit', 'exp', 'fcntl',
+                'fileno', 'flock', 'fork', 'format', 'formline', 'getc', 'getgrent', 'getgrgid',
+                'getgrnam', 'gethostbyaddr', 'gethostbyname', 'gethostent', 'getlogin',
+                'getnetbyaddr', 'getnetbyname', 'getnetent', 'getpeername', 'getpgrp',
+                'getppid', 'getpriority', 'getprotobyname', 'getprotobynumber',
+                'getprotoent', 'getpwent', 'getpwnam', 'getpwuid', 'getservbyname',
+                'getservbyport', 'getservent', 'getsockname', 'getsockopt', 'glob', 'gmtime',
+                'goto', 'grep', 'hex', 'import', 'index', 'int', 'ioctl', 'join', 'keys', 'kill', 'last',
+                'lc', 'lcfirst', 'length', 'link', 'listen', 'local', 'localtime', 'log', 'lstat',
+                'map', 'mkdir', 'msgctl', 'msgget', 'msgrcv', 'msgsnd', 'my', 'next', 'oct', 'open',
+                'opendir', 'ord', 'our', 'pack', 'pipe', 'pop', 'pos', 'printf',
+                'prototype', 'push', 'quotemeta', 'rand', 'read', 'readdir',
+                'readline', 'readlink', 'readpipe', 'recv', 'redo', 'ref', 'rename',
+                'reverse', 'rewinddir', 'rindex', 'rmdir', 'scalar', 'seek', 'seekdir',
+                'select', 'semctl', 'semget', 'semop', 'send', 'setgrent', 'sethostent', 'setnetent',
+                'setpgrp', 'setpriority', 'setprotoent', 'setpwent', 'setservent',
+                'setsockopt', 'shift', 'shmctl', 'shmget', 'shmread', 'shmwrite', 'shutdown',
+                'sin', 'sleep', 'socket', 'socketpair', 'sort', 'splice', 'split', 'sprintf', 'sqrt',
+                'srand', 'stat', 'study', 'substr', 'symlink', 'syscall', 'sysopen', 'sysread',
+                'sysseek', 'system', 'syswrite', 'tell', 'telldir', 'tie', 'tied', 'time', 'times', 'tr',
+                'truncate', 'uc', 'ucfirst', 'umask', 'undef', 'unlink', 'unpack', 'unshift', 'untie',
+                'utime', 'values', 'vec', 'wait', 'waitpid', 'wantarray', 'warn', 'write'), suffix=r'\b'),
+             Name.Builtin),
+            (r'((__(DATA|DIE|WARN)__)|(STD(IN|OUT|ERR)))\b', Name.Builtin.Pseudo),
+            (r'(<<)([\'"]?)([a-zA-Z_]\w*)(\2;?\n.*?\n)(\3)(\n)',
+             bygroups(String, String, String.Delimiter, String, String.Delimiter, Text)),
+            (r'__END__', Comment.Preproc, 'end-part'),
+            (r'\$\^[ADEFHILMOPSTWX]', Name.Variable.Global),
+            (r"\$[\\\"\[\]'&`+*.,;=%~?@$!<>(^|/-](?!\w)", Name.Variable.Global),
+            (r'[$@%#]+', Name.Variable, 'varname'),
+            (r'0_?[0-7]+(_[0-7]+)*', Number.Oct),
+            (r'0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*', Number.Hex),
+            (r'0b[01]+(_[01]+)*', Number.Bin),
+            (r'(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?',
+             Number.Float),
+            (r'(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*', Number.Float),
+            (r'\d+(_\d+)*', Number.Integer),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r'`(\\\\|\\[^\\]|[^`\\])*`', String.Backtick),
+            (r'<([^\s>]+)>', String.Regex),
+            (r'(q|qq|qw|qr|qx)\{', String.Other, 'cb-string'),
+            (r'(q|qq|qw|qr|qx)\(', String.Other, 'rb-string'),
+            (r'(q|qq|qw|qr|qx)\[', String.Other, 'sb-string'),
+            (r'(q|qq|qw|qr|qx)\<', String.Other, 'lt-string'),
+            (r'(q|qq|qw|qr|qx)([\W_])(.|\n)*?\2', String.Other),
+            (r'(package)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Text, Name.Namespace)),
+            (r'(use|require|no)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Text, Name.Namespace)),
+            (r'(sub)(\s+)', bygroups(Keyword, Text), 'funcname'),
+            (words((
+                'no', 'package', 'require', 'use'), suffix=r'\b'),
+             Keyword),
+            (r'(\[\]|\*\*|::|<<|>>|>=|<=>|<=|={3}|!=|=~|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&^|!\\~]=?', Operator),
+            (r'[()\[\]:;,<>/?{}]', Punctuation),  # yes, there's no shortage
+                                                  # of punctuation in Perl!
+            (r'(?=\w)', Name, 'name'),
+        ],
+        'format': [
+            (r'\.\n', String.Interpol, '#pop'),
+            (r'[^\n]*\n', String.Interpol),
+        ],
+        'varname': [
+            (r'\s+', Text),
+            (r'\{', Punctuation, '#pop'),    # hash syntax?
+            (r'\)|,', Punctuation, '#pop'),  # argument specifier
+            (r'\w+::', Name.Namespace),
+            (r'[\w:]+', Name.Variable, '#pop'),
+        ],
+        'name': [
+            (r'[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*(::)?(?=\s*->)', Name.Namespace, '#pop'),
+            (r'[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*::', Name.Namespace, '#pop'),
+            (r'[\w:]+', Name, '#pop'),
+            (r'[A-Z_]+(?=\W)', Name.Constant, '#pop'),
+            (r'(?=\W)', Text, '#pop'),
+        ],
+        'funcname': [
+            (r'[a-zA-Z_]\w*[!?]?', Name.Function),
+            (r'\s+', Text),
+            # argument declaration
+            (r'(\([$@%]*\))(\s*)', bygroups(Punctuation, Text)),
+            (r';', Punctuation, '#pop'),
+            (r'.*?\{', Punctuation, '#pop'),
+        ],
+        'cb-string': [
+            (r'\\[{}\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\{', String.Other, 'cb-string'),
+            (r'\}', String.Other, '#pop'),
+            (r'[^{}\\]+', String.Other)
+        ],
+        'rb-string': [
+            (r'\\[()\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\(', String.Other, 'rb-string'),
+            (r'\)', String.Other, '#pop'),
+            (r'[^()]+', String.Other)
+        ],
+        'sb-string': [
+            (r'\\[\[\]\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\[', String.Other, 'sb-string'),
+            (r'\]', String.Other, '#pop'),
+            (r'[^\[\]]+', String.Other)
+        ],
+        'lt-string': [
+            (r'\\[<>\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\<', String.Other, 'lt-string'),
+            (r'\>', String.Other, '#pop'),
+            (r'[^<>]+', String.Other)
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ]
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'perl'):
+            return True
+        if re.search('(?:my|our)\s+[$@%(]', text):
+            return 0.9
+
+
+class Perl6Lexer(ExtendedRegexLexer):
+    """
+    For `Perl 6 <http://www.perl6.org>`_ source code.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Perl6'
+    aliases = ['perl6', 'pl6']
+    filenames = ['*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6',
+                 '*.6pm', '*.p6m', '*.pm6', '*.t']
+    mimetypes = ['text/x-perl6', 'application/x-perl6']
+    flags = re.MULTILINE | re.DOTALL | re.UNICODE
+
+    PERL6_IDENTIFIER_RANGE = "['\w:-]"
+
+    PERL6_KEYWORDS = (
+        'BEGIN', 'CATCH', 'CHECK', 'CONTROL', 'END', 'ENTER', 'FIRST', 'INIT',
+        'KEEP', 'LAST', 'LEAVE', 'NEXT', 'POST', 'PRE', 'START', 'TEMP',
+        'UNDO', 'as', 'assoc', 'async', 'augment', 'binary', 'break', 'but',
+        'cached', 'category', 'class', 'constant', 'contend', 'continue',
+        'copy', 'deep', 'default', 'defequiv', 'defer', 'die', 'do', 'else',
+        'elsif', 'enum', 'equiv', 'exit', 'export', 'fail', 'fatal', 'for',
+        'gather', 'given', 'goto', 'grammar', 'handles', 'has', 'if', 'inline',
+        'irs', 'is', 'last', 'leave', 'let', 'lift', 'loop', 'looser', 'macro',
+        'make', 'maybe', 'method', 'module', 'multi', 'my', 'next', 'of',
+        'ofs', 'only', 'oo', 'ors', 'our', 'package', 'parsed', 'prec',
+        'proto', 'readonly', 'redo', 'ref', 'regex', 'reparsed', 'repeat',
+        'require', 'required', 'return', 'returns', 'role', 'rule', 'rw',
+        'self', 'slang', 'state', 'sub', 'submethod', 'subset', 'supersede',
+        'take', 'temp', 'tighter', 'token', 'trusts', 'try', 'unary',
+        'unless', 'until', 'use', 'warn', 'when', 'where', 'while', 'will',
+    )
+
+    PERL6_BUILTINS = (
+        'ACCEPTS', 'HOW', 'REJECTS', 'VAR', 'WHAT', 'WHENCE', 'WHERE', 'WHICH',
+        'WHO', 'abs', 'acos', 'acosec', 'acosech', 'acosh', 'acotan', 'acotanh',
+        'all', 'any', 'approx', 'arity', 'asec', 'asech', 'asin', 'asinh',
+        'assuming', 'atan', 'atan2', 'atanh', 'attr', 'bless', 'body', 'by',
+        'bytes', 'caller', 'callsame', 'callwith', 'can', 'capitalize', 'cat',
+        'ceiling', 'chars', 'chmod', 'chomp', 'chop', 'chr', 'chroot',
+        'circumfix', 'cis', 'classify', 'clone', 'close', 'cmp_ok', 'codes',
+        'comb', 'connect', 'contains', 'context', 'cos', 'cosec', 'cosech',
+        'cosh', 'cotan', 'cotanh', 'count', 'defined', 'delete', 'diag',
+        'dies_ok', 'does', 'e', 'each', 'eager', 'elems', 'end', 'eof', 'eval',
+        'eval_dies_ok', 'eval_elsewhere', 'eval_lives_ok', 'evalfile', 'exists',
+        'exp', 'first', 'flip', 'floor', 'flunk', 'flush', 'fmt', 'force_todo',
+        'fork', 'from', 'getc', 'gethost', 'getlogin', 'getpeername', 'getpw',
+        'gmtime', 'graphs', 'grep', 'hints', 'hyper', 'im', 'index', 'infix',
+        'invert', 'is_approx', 'is_deeply', 'isa', 'isa_ok', 'isnt', 'iterator',
+        'join', 'key', 'keys', 'kill', 'kv', 'lastcall', 'lazy', 'lc', 'lcfirst',
+        'like', 'lines', 'link', 'lives_ok', 'localtime', 'log', 'log10', 'map',
+        'max', 'min', 'minmax', 'name', 'new', 'nextsame', 'nextwith', 'nfc',
+        'nfd', 'nfkc', 'nfkd', 'nok_error', 'nonce', 'none', 'normalize', 'not',
+        'nothing', 'ok', 'once', 'one', 'open', 'opendir', 'operator', 'ord',
+        'p5chomp', 'p5chop', 'pack', 'pair', 'pairs', 'pass', 'perl', 'pi',
+        'pick', 'plan', 'plan_ok', 'polar', 'pop', 'pos', 'postcircumfix',
+        'postfix', 'pred', 'prefix', 'print', 'printf', 'push', 'quasi',
+        'quotemeta', 'rand', 're', 'read', 'readdir', 'readline', 'reduce',
+        'reverse', 'rewind', 'rewinddir', 'rindex', 'roots', 'round',
+        'roundrobin', 'run', 'runinstead', 'sameaccent', 'samecase', 'say',
+        'sec', 'sech', 'sech', 'seek', 'shape', 'shift', 'sign', 'signature',
+        'sin', 'sinh', 'skip', 'skip_rest', 'sleep', 'slurp', 'sort', 'splice',
+        'split', 'sprintf', 'sqrt', 'srand', 'strand', 'subst', 'substr', 'succ',
+        'sum', 'symlink', 'tan', 'tanh', 'throws_ok', 'time', 'times', 'to',
+        'todo', 'trim', 'trim_end', 'trim_start', 'true', 'truncate', 'uc',
+        'ucfirst', 'undef', 'undefine', 'uniq', 'unlike', 'unlink', 'unpack',
+        'unpolar', 'unshift', 'unwrap', 'use_ok', 'value', 'values', 'vec',
+        'version_lt', 'void', 'wait', 'want', 'wrap', 'write', 'zip',
+    )
+
+    PERL6_BUILTIN_CLASSES = (
+        'Abstraction', 'Any', 'AnyChar', 'Array', 'Associative', 'Bag', 'Bit',
+        'Blob', 'Block', 'Bool', 'Buf', 'Byte', 'Callable', 'Capture', 'Char', 'Class',
+        'Code', 'Codepoint', 'Comparator', 'Complex', 'Decreasing', 'Exception',
+        'Failure', 'False', 'Grammar', 'Grapheme', 'Hash', 'IO', 'Increasing',
+        'Int', 'Junction', 'KeyBag', 'KeyExtractor', 'KeyHash', 'KeySet',
+        'KitchenSink', 'List', 'Macro', 'Mapping', 'Match', 'Matcher', 'Method',
+        'Module', 'Num', 'Object', 'Ordered', 'Ordering', 'OrderingPair',
+        'Package', 'Pair', 'Positional', 'Proxy', 'Range', 'Rat', 'Regex',
+        'Role', 'Routine', 'Scalar', 'Seq', 'Set', 'Signature', 'Str', 'StrLen',
+        'StrPos', 'Sub', 'Submethod', 'True', 'UInt', 'Undef', 'Version', 'Void',
+        'Whatever', 'bit', 'bool', 'buf', 'buf1', 'buf16', 'buf2', 'buf32',
+        'buf4', 'buf64', 'buf8', 'complex', 'int', 'int1', 'int16', 'int2',
+        'int32', 'int4', 'int64', 'int8', 'num', 'rat', 'rat1', 'rat16', 'rat2',
+        'rat32', 'rat4', 'rat64', 'rat8', 'uint', 'uint1', 'uint16', 'uint2',
+        'uint32', 'uint4', 'uint64', 'uint8', 'utf16', 'utf32', 'utf8',
+    )
+
+    PERL6_OPERATORS = (
+        'X', 'Z', 'after', 'also', 'and', 'andthen', 'before', 'cmp', 'div',
+        'eq', 'eqv', 'extra', 'ff', 'fff', 'ge', 'gt', 'le', 'leg', 'lt', 'm',
+        'mm', 'mod', 'ne', 'or', 'orelse', 'rx', 's', 'tr', 'x', 'xor', 'xx',
+        '++', '--', '**', '!', '+', '-', '~', '?', '|', '||', '+^', '~^', '?^',
+        '^', '*', '/', '%', '%%', '+&', '+<', '+>', '~&', '~<', '~>', '?&',
+        'gcd', 'lcm', '+', '-', '+|', '+^', '~|', '~^', '?|', '?^',
+        '~', '&', '^', 'but', 'does', '<=>', '..', '..^', '^..', '^..^',
+        '!=', '==', '<', '<=', '>', '>=', '~~', '===', '!eqv',
+        '&&', '||', '^^', '//', 'min', 'max', '??', '!!', 'ff', 'fff', 'so',
+        'not', '<==', '==>', '<<==', '==>>',
+    )
+
+    # Perl 6 has a *lot* of possible bracketing characters
+    # this list was lifted from STD.pm6 (https://github.com/perl6/std)
+    PERL6_BRACKETS = {
+        u'\u0028': u'\u0029', u'\u003c': u'\u003e', u'\u005b': u'\u005d',
+        u'\u007b': u'\u007d', u'\u00ab': u'\u00bb', u'\u0f3a': u'\u0f3b',
+        u'\u0f3c': u'\u0f3d', u'\u169b': u'\u169c', u'\u2018': u'\u2019',
+        u'\u201a': u'\u2019', u'\u201b': u'\u2019', u'\u201c': u'\u201d',
+        u'\u201e': u'\u201d', u'\u201f': u'\u201d', u'\u2039': u'\u203a',
+        u'\u2045': u'\u2046', u'\u207d': u'\u207e', u'\u208d': u'\u208e',
+        u'\u2208': u'\u220b', u'\u2209': u'\u220c', u'\u220a': u'\u220d',
+        u'\u2215': u'\u29f5', u'\u223c': u'\u223d', u'\u2243': u'\u22cd',
+        u'\u2252': u'\u2253', u'\u2254': u'\u2255', u'\u2264': u'\u2265',
+        u'\u2266': u'\u2267', u'\u2268': u'\u2269', u'\u226a': u'\u226b',
+        u'\u226e': u'\u226f', u'\u2270': u'\u2271', u'\u2272': u'\u2273',
+        u'\u2274': u'\u2275', u'\u2276': u'\u2277', u'\u2278': u'\u2279',
+        u'\u227a': u'\u227b', u'\u227c': u'\u227d', u'\u227e': u'\u227f',
+        u'\u2280': u'\u2281', u'\u2282': u'\u2283', u'\u2284': u'\u2285',
+        u'\u2286': u'\u2287', u'\u2288': u'\u2289', u'\u228a': u'\u228b',
+        u'\u228f': u'\u2290', u'\u2291': u'\u2292', u'\u2298': u'\u29b8',
+        u'\u22a2': u'\u22a3', u'\u22a6': u'\u2ade', u'\u22a8': u'\u2ae4',
+        u'\u22a9': u'\u2ae3', u'\u22ab': u'\u2ae5', u'\u22b0': u'\u22b1',
+        u'\u22b2': u'\u22b3', u'\u22b4': u'\u22b5', u'\u22b6': u'\u22b7',
+        u'\u22c9': u'\u22ca', u'\u22cb': u'\u22cc', u'\u22d0': u'\u22d1',
+        u'\u22d6': u'\u22d7', u'\u22d8': u'\u22d9', u'\u22da': u'\u22db',
+        u'\u22dc': u'\u22dd', u'\u22de': u'\u22df', u'\u22e0': u'\u22e1',
+        u'\u22e2': u'\u22e3', u'\u22e4': u'\u22e5', u'\u22e6': u'\u22e7',
+        u'\u22e8': u'\u22e9', u'\u22ea': u'\u22eb', u'\u22ec': u'\u22ed',
+        u'\u22f0': u'\u22f1', u'\u22f2': u'\u22fa', u'\u22f3': u'\u22fb',
+        u'\u22f4': u'\u22fc', u'\u22f6': u'\u22fd', u'\u22f7': u'\u22fe',
+        u'\u2308': u'\u2309', u'\u230a': u'\u230b', u'\u2329': u'\u232a',
+        u'\u23b4': u'\u23b5', u'\u2768': u'\u2769', u'\u276a': u'\u276b',
+        u'\u276c': u'\u276d', u'\u276e': u'\u276f', u'\u2770': u'\u2771',
+        u'\u2772': u'\u2773', u'\u2774': u'\u2775', u'\u27c3': u'\u27c4',
+        u'\u27c5': u'\u27c6', u'\u27d5': u'\u27d6', u'\u27dd': u'\u27de',
+        u'\u27e2': u'\u27e3', u'\u27e4': u'\u27e5', u'\u27e6': u'\u27e7',
+        u'\u27e8': u'\u27e9', u'\u27ea': u'\u27eb', u'\u2983': u'\u2984',
+        u'\u2985': u'\u2986', u'\u2987': u'\u2988', u'\u2989': u'\u298a',
+        u'\u298b': u'\u298c', u'\u298d': u'\u298e', u'\u298f': u'\u2990',
+        u'\u2991': u'\u2992', u'\u2993': u'\u2994', u'\u2995': u'\u2996',
+        u'\u2997': u'\u2998', u'\u29c0': u'\u29c1', u'\u29c4': u'\u29c5',
+        u'\u29cf': u'\u29d0', u'\u29d1': u'\u29d2', u'\u29d4': u'\u29d5',
+        u'\u29d8': u'\u29d9', u'\u29da': u'\u29db', u'\u29f8': u'\u29f9',
+        u'\u29fc': u'\u29fd', u'\u2a2b': u'\u2a2c', u'\u2a2d': u'\u2a2e',
+        u'\u2a34': u'\u2a35', u'\u2a3c': u'\u2a3d', u'\u2a64': u'\u2a65',
+        u'\u2a79': u'\u2a7a', u'\u2a7d': u'\u2a7e', u'\u2a7f': u'\u2a80',
+        u'\u2a81': u'\u2a82', u'\u2a83': u'\u2a84', u'\u2a8b': u'\u2a8c',
+        u'\u2a91': u'\u2a92', u'\u2a93': u'\u2a94', u'\u2a95': u'\u2a96',
+        u'\u2a97': u'\u2a98', u'\u2a99': u'\u2a9a', u'\u2a9b': u'\u2a9c',
+        u'\u2aa1': u'\u2aa2', u'\u2aa6': u'\u2aa7', u'\u2aa8': u'\u2aa9',
+        u'\u2aaa': u'\u2aab', u'\u2aac': u'\u2aad', u'\u2aaf': u'\u2ab0',
+        u'\u2ab3': u'\u2ab4', u'\u2abb': u'\u2abc', u'\u2abd': u'\u2abe',
+        u'\u2abf': u'\u2ac0', u'\u2ac1': u'\u2ac2', u'\u2ac3': u'\u2ac4',
+        u'\u2ac5': u'\u2ac6', u'\u2acd': u'\u2ace', u'\u2acf': u'\u2ad0',
+        u'\u2ad1': u'\u2ad2', u'\u2ad3': u'\u2ad4', u'\u2ad5': u'\u2ad6',
+        u'\u2aec': u'\u2aed', u'\u2af7': u'\u2af8', u'\u2af9': u'\u2afa',
+        u'\u2e02': u'\u2e03', u'\u2e04': u'\u2e05', u'\u2e09': u'\u2e0a',
+        u'\u2e0c': u'\u2e0d', u'\u2e1c': u'\u2e1d', u'\u2e20': u'\u2e21',
+        u'\u3008': u'\u3009', u'\u300a': u'\u300b', u'\u300c': u'\u300d',
+        u'\u300e': u'\u300f', u'\u3010': u'\u3011', u'\u3014': u'\u3015',
+        u'\u3016': u'\u3017', u'\u3018': u'\u3019', u'\u301a': u'\u301b',
+        u'\u301d': u'\u301e', u'\ufd3e': u'\ufd3f', u'\ufe17': u'\ufe18',
+        u'\ufe35': u'\ufe36', u'\ufe37': u'\ufe38', u'\ufe39': u'\ufe3a',
+        u'\ufe3b': u'\ufe3c', u'\ufe3d': u'\ufe3e', u'\ufe3f': u'\ufe40',
+        u'\ufe41': u'\ufe42', u'\ufe43': u'\ufe44', u'\ufe47': u'\ufe48',
+        u'\ufe59': u'\ufe5a', u'\ufe5b': u'\ufe5c', u'\ufe5d': u'\ufe5e',
+        u'\uff08': u'\uff09', u'\uff1c': u'\uff1e', u'\uff3b': u'\uff3d',
+        u'\uff5b': u'\uff5d', u'\uff5f': u'\uff60', u'\uff62': u'\uff63',
+    }
+
+    def _build_word_match(words, boundary_regex_fragment=None, prefix='', suffix=''):
+        if boundary_regex_fragment is None:
+            return r'\b(' + prefix + r'|'.join(re.escape(x) for x in words) + \
+                suffix + r')\b'
+        else:
+            return r'(?<!' + boundary_regex_fragment + r')' + prefix + r'(' + \
+                r'|'.join(re.escape(x) for x in words) + r')' + suffix + r'(?!' + \
+                boundary_regex_fragment + r')'
+
+    def brackets_callback(token_class):
+        def callback(lexer, match, context):
+            groups = match.groupdict()
+            opening_chars = groups['delimiter']
+            n_chars = len(opening_chars)
+            adverbs = groups.get('adverbs')
+
+            closer = Perl6Lexer.PERL6_BRACKETS.get(opening_chars[0])
+            text = context.text
+
+            if closer is None:  # it's not a mirrored character, which means we
+                                # just need to look for the next occurrence
+
+                end_pos = text.find(opening_chars, match.start('delimiter') + n_chars)
+            else:   # we need to look for the corresponding closing character,
+                    # keep nesting in mind
+                closing_chars = closer * n_chars
+                nesting_level = 1
+
+                search_pos = match.start('delimiter')
+
+                while nesting_level > 0:
+                    next_open_pos = text.find(opening_chars, search_pos + n_chars)
+                    next_close_pos = text.find(closing_chars, search_pos + n_chars)
+
+                    if next_close_pos == -1:
+                        next_close_pos = len(text)
+                        nesting_level = 0
+                    elif next_open_pos != -1 and next_open_pos < next_close_pos:
+                        nesting_level += 1
+                        search_pos = next_open_pos
+                    else:  # next_close_pos < next_open_pos
+                        nesting_level -= 1
+                        search_pos = next_close_pos
+
+                end_pos = next_close_pos
+
+            if end_pos < 0:     # if we didn't find a closer, just highlight the
+                                # rest of the text in this class
+                end_pos = len(text)
+
+            if adverbs is not None and re.search(r':to\b', adverbs):
+                heredoc_terminator = text[match.start('delimiter') + n_chars:end_pos]
+                end_heredoc = re.search(r'^\s*' + re.escape(heredoc_terminator) +
+                                        r'\s*$', text[end_pos:], re.MULTILINE)
+
+                if end_heredoc:
+                    end_pos += end_heredoc.end()
+                else:
+                    end_pos = len(text)
+
+            yield match.start(), token_class, text[match.start():end_pos + n_chars]
+            context.pos = end_pos + n_chars
+
+        return callback
+
+    def opening_brace_callback(lexer, match, context):
+        stack = context.stack
+
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+
+        # if we encounter an opening brace and we're one level
+        # below a token state, it means we need to increment
+        # the nesting level for braces so we know later when
+        # we should return to the token rules.
+        if len(stack) > 2 and stack[-2] == 'token':
+            context.perl6_token_nesting_level += 1
+
+    def closing_brace_callback(lexer, match, context):
+        stack = context.stack
+
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+
+        # if we encounter a free closing brace and we're one level
+        # below a token state, it means we need to check the nesting
+        # level to see if we need to return to the token state.
+        if len(stack) > 2 and stack[-2] == 'token':
+            context.perl6_token_nesting_level -= 1
+            if context.perl6_token_nesting_level == 0:
+                stack.pop()
+
+    def embedded_perl6_callback(lexer, match, context):
+        context.perl6_token_nesting_level = 1
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+        context.stack.append('root')
+
+    # If you're modifying these rules, be careful if you need to process '{' or '}'
+    # characters. We have special logic for processing these characters (due to the fact
+    # that you can nest Perl 6 code in regex blocks), so if you need to process one of
+    # them, make sure you also process the corresponding one!
+    tokens = {
+        'common': [
+            (r'#[`|=](?P<delimiter>(?P<first_char>[' + ''.join(PERL6_BRACKETS) + r'])(?P=first_char)*)',
+             brackets_callback(Comment.Multiline)),
+            (r'#[^\n]*$', Comment.Singleline),
+            (r'^(\s*)=begin\s+(\w+)\b.*?^\1=end\s+\2', Comment.Multiline),
+            (r'^(\s*)=for.*?\n\s*?\n', Comment.Multiline),
+            (r'^=.*?\n\s*?\n', Comment.Multiline),
+            (r'(regex|token|rule)(\s*' + PERL6_IDENTIFIER_RANGE + '+:sym)',
+             bygroups(Keyword, Name), 'token-sym-brackets'),
+            (r'(regex|token|rule)(?!' + PERL6_IDENTIFIER_RANGE + ')(\s*' + PERL6_IDENTIFIER_RANGE + '+)?',
+             bygroups(Keyword, Name), 'pre-token'),
+            # deal with a special case in the Perl 6 grammar (role q { ... })
+            (r'(role)(\s+)(q)(\s*)', bygroups(Keyword, Text, Name, Text)),
+            (_build_word_match(PERL6_KEYWORDS, PERL6_IDENTIFIER_RANGE), Keyword),
+            (_build_word_match(PERL6_BUILTIN_CLASSES, PERL6_IDENTIFIER_RANGE, suffix='(?::[UD])?'),
+             Name.Builtin),
+            (_build_word_match(PERL6_BUILTINS, PERL6_IDENTIFIER_RANGE), Name.Builtin),
+            # copied from PerlLexer
+            (r'[$@%&][.^:?=!~]?' + PERL6_IDENTIFIER_RANGE + u'+(?:<<.*?>>|<.*?>|«.*?»)*',
+             Name.Variable),
+            (r'\$[!/](?:<<.*?>>|<.*?>|«.*?»)*', Name.Variable.Global),
+            (r'::\?\w+', Name.Variable.Global),
+            (r'[$@%&]\*' + PERL6_IDENTIFIER_RANGE + u'+(?:<<.*?>>|<.*?>|«.*?»)*',
+             Name.Variable.Global),
+            (r'\$(?:<.*?>)+', Name.Variable),
+            (r'(?:q|qq|Q)[a-zA-Z]?\s*(?P<adverbs>:[\w\s:]+)?\s*(?P<delimiter>(?P<first_char>[^0-9a-zA-Z:\s])'
+             r'(?P=first_char)*)', brackets_callback(String)),
+            # copied from PerlLexer
+            (r'0_?[0-7]+(_[0-7]+)*', Number.Oct),
+            (r'0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*', Number.Hex),
+            (r'0b[01]+(_[01]+)*', Number.Bin),
+            (r'(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?',
+             Number.Float),
+            (r'(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*', Number.Float),
+            (r'\d+(_\d+)*', Number.Integer),
+            (r'(?<=~~)\s*/(?:\\\\|\\/|.)*?/', String.Regex),
+            (r'(?<=[=(,])\s*/(?:\\\\|\\/|.)*?/', String.Regex),
+            (r'm\w+(?=\()', Name),
+            (r'(?:m|ms|rx)\s*(?P<adverbs>:[\w\s:]+)?\s*(?P<delimiter>(?P<first_char>[^\w:\s])'
+             r'(?P=first_char)*)', brackets_callback(String.Regex)),
+            (r'(?:s|ss|tr)\s*(?::[\w\s:]+)?\s*/(?:\\\\|\\/|.)*?/(?:\\\\|\\/|.)*?/',
+             String.Regex),
+            (r'<[^\s=].*?\S>', String),
+            (_build_word_match(PERL6_OPERATORS), Operator),
+            (r'\w' + PERL6_IDENTIFIER_RANGE + '*', Name),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+        ],
+        'root': [
+            include('common'),
+            (r'\{', opening_brace_callback),
+            (r'\}', closing_brace_callback),
+            (r'.+?', Text),
+        ],
+        'pre-token': [
+            include('common'),
+            (r'\{', Text, ('#pop', 'token')),
+            (r'.+?', Text),
+        ],
+        'token-sym-brackets': [
+            (r'(?P<delimiter>(?P<first_char>[' + ''.join(PERL6_BRACKETS) + '])(?P=first_char)*)',
+             brackets_callback(Name), ('#pop', 'pre-token')),
+            default(('#pop', 'pre-token')),
+        ],
+        'token': [
+            (r'\}', Text, '#pop'),
+            (r'(?<=:)(?:my|our|state|constant|temp|let).*?;', using(this)),
+            # make sure that quotes in character classes aren't treated as strings
+            (r'<(?:[-!?+.]\s*)?\[.*?\]>', String.Regex),
+            # make sure that '#' characters in quotes aren't treated as comments
+            (r"(?<!\\)'(\\\\|\\[^\\]|[^'\\])*'", String.Regex),
+            (r'(?<!\\)"(\\\\|\\[^\\]|[^"\\])*"', String.Regex),
+            (r'#.*?$', Comment.Singleline),
+            (r'\{', embedded_perl6_callback),
+            ('.+?', String.Regex),
+        ],
+    }
+
+    def analyse_text(text):
+        def strip_pod(lines):
+            in_pod = False
+            stripped_lines = []
+
+            for line in lines:
+                if re.match(r'^=(?:end|cut)', line):
+                    in_pod = False
+                elif re.match(r'^=\w+', line):
+                    in_pod = True
+                elif not in_pod:
+                    stripped_lines.append(line)
+
+            return stripped_lines
+
+        # XXX handle block comments
+        lines = text.splitlines()
+        lines = strip_pod(lines)
+        text = '\n'.join(lines)
+
+        if shebang_matches(text, r'perl6|rakudo|niecza|pugs'):
+            return True
+
+        saw_perl_decl = False
+        rating = False
+
+        # check for my/our/has declarations
+        if re.search("(?:my|our|has)\s+(?:" + Perl6Lexer.PERL6_IDENTIFIER_RANGE +
+                     "+\s+)?[$@%&(]", text):
+            rating = 0.8
+            saw_perl_decl = True
+
+        for line in lines:
+            line = re.sub('#.*', '', line)
+            if re.match('^\s*$', line):
+                continue
+
+            # match v6; use v6; use v6.0; use v6.0.0;
+            if re.match('^\s*(?:use\s+)?v6(?:\.\d(?:\.\d)?)?;', line):
+                return True
+            # match class, module, role, enum, grammar declarations
+            class_decl = re.match('^\s*(?:(?P<scope>my|our)\s+)?(?:module|class|role|enum|grammar)', line)
+            if class_decl:
+                if saw_perl_decl or class_decl.group('scope') is not None:
+                    return True
+                rating = 0.05
+                continue
+            break
+
+        return rating
+
+    def __init__(self, **options):
+        super(Perl6Lexer, self).__init__(**options)
+        self.encoding = options.get('encoding', 'utf-8')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_vim_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_vim_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_vim_builtins.py	(revision 1126)
@@ -0,0 +1,1939 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._vim_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file is autogenerated by scripts/get_vimkw.py
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Split up in multiple functions so it's importable by jython, which has a
+# per-method size limit.
+
+def _getauto():
+    var = (
+        ('BufAdd','BufAdd'),
+        ('BufCreate','BufCreate'),
+        ('BufDelete','BufDelete'),
+        ('BufEnter','BufEnter'),
+        ('BufFilePost','BufFilePost'),
+        ('BufFilePre','BufFilePre'),
+        ('BufHidden','BufHidden'),
+        ('BufLeave','BufLeave'),
+        ('BufNew','BufNew'),
+        ('BufNewFile','BufNewFile'),
+        ('BufRead','BufRead'),
+        ('BufReadCmd','BufReadCmd'),
+        ('BufReadPost','BufReadPost'),
+        ('BufReadPre','BufReadPre'),
+        ('BufUnload','BufUnload'),
+        ('BufWinEnter','BufWinEnter'),
+        ('BufWinLeave','BufWinLeave'),
+        ('BufWipeout','BufWipeout'),
+        ('BufWrite','BufWrite'),
+        ('BufWriteCmd','BufWriteCmd'),
+        ('BufWritePost','BufWritePost'),
+        ('BufWritePre','BufWritePre'),
+        ('Cmd','Cmd'),
+        ('CmdwinEnter','CmdwinEnter'),
+        ('CmdwinLeave','CmdwinLeave'),
+        ('ColorScheme','ColorScheme'),
+        ('CompleteDone','CompleteDone'),
+        ('CursorHold','CursorHold'),
+        ('CursorHoldI','CursorHoldI'),
+        ('CursorMoved','CursorMoved'),
+        ('CursorMovedI','CursorMovedI'),
+        ('EncodingChanged','EncodingChanged'),
+        ('FileAppendCmd','FileAppendCmd'),
+        ('FileAppendPost','FileAppendPost'),
+        ('FileAppendPre','FileAppendPre'),
+        ('FileChangedRO','FileChangedRO'),
+        ('FileChangedShell','FileChangedShell'),
+        ('FileChangedShellPost','FileChangedShellPost'),
+        ('FileEncoding','FileEncoding'),
+        ('FileReadCmd','FileReadCmd'),
+        ('FileReadPost','FileReadPost'),
+        ('FileReadPre','FileReadPre'),
+        ('FileType','FileType'),
+        ('FileWriteCmd','FileWriteCmd'),
+        ('FileWritePost','FileWritePost'),
+        ('FileWritePre','FileWritePre'),
+        ('FilterReadPost','FilterReadPost'),
+        ('FilterReadPre','FilterReadPre'),
+        ('FilterWritePost','FilterWritePost'),
+        ('FilterWritePre','FilterWritePre'),
+        ('FocusGained','FocusGained'),
+        ('FocusLost','FocusLost'),
+        ('FuncUndefined','FuncUndefined'),
+        ('GUIEnter','GUIEnter'),
+        ('GUIFailed','GUIFailed'),
+        ('InsertChange','InsertChange'),
+        ('InsertCharPre','InsertCharPre'),
+        ('InsertEnter','InsertEnter'),
+        ('InsertLeave','InsertLeave'),
+        ('MenuPopup','MenuPopup'),
+        ('QuickFixCmdPost','QuickFixCmdPost'),
+        ('QuickFixCmdPre','QuickFixCmdPre'),
+        ('QuitPre','QuitPre'),
+        ('RemoteReply','RemoteReply'),
+        ('SessionLoadPost','SessionLoadPost'),
+        ('ShellCmdPost','ShellCmdPost'),
+        ('ShellFilterPost','ShellFilterPost'),
+        ('SourceCmd','SourceCmd'),
+        ('SourcePre','SourcePre'),
+        ('SpellFileMissing','SpellFileMissing'),
+        ('StdinReadPost','StdinReadPost'),
+        ('StdinReadPre','StdinReadPre'),
+        ('SwapExists','SwapExists'),
+        ('Syntax','Syntax'),
+        ('TabEnter','TabEnter'),
+        ('TabLeave','TabLeave'),
+        ('TermChanged','TermChanged'),
+        ('TermResponse','TermResponse'),
+        ('TextChanged','TextChanged'),
+        ('TextChangedI','TextChangedI'),
+        ('User','User'),
+        ('UserGettingBored','UserGettingBored'),
+        ('VimEnter','VimEnter'),
+        ('VimLeave','VimLeave'),
+        ('VimLeavePre','VimLeavePre'),
+        ('VimResized','VimResized'),
+        ('WinEnter','WinEnter'),
+        ('WinLeave','WinLeave'),
+        ('event','event'),
+    )
+    return var
+auto = _getauto()
+
+def _getcommand():
+    var = (
+        ('a','a'),
+        ('ab','ab'),
+        ('abc','abclear'),
+        ('abo','aboveleft'),
+        ('al','all'),
+        ('ar','ar'),
+        ('ar','args'),
+        ('arga','argadd'),
+        ('argd','argdelete'),
+        ('argdo','argdo'),
+        ('arge','argedit'),
+        ('argg','argglobal'),
+        ('argl','arglocal'),
+        ('argu','argument'),
+        ('as','ascii'),
+        ('au','au'),
+        ('b','buffer'),
+        ('bN','bNext'),
+        ('ba','ball'),
+        ('bad','badd'),
+        ('bd','bdelete'),
+        ('bel','belowright'),
+        ('bf','bfirst'),
+        ('bl','blast'),
+        ('bm','bmodified'),
+        ('bn','bnext'),
+        ('bo','botright'),
+        ('bp','bprevious'),
+        ('br','br'),
+        ('br','brewind'),
+        ('brea','break'),
+        ('breaka','breakadd'),
+        ('breakd','breakdel'),
+        ('breakl','breaklist'),
+        ('bro','browse'),
+        ('bu','bu'),
+        ('buf','buf'),
+        ('bufdo','bufdo'),
+        ('buffers','buffers'),
+        ('bun','bunload'),
+        ('bw','bwipeout'),
+        ('c','c'),
+        ('c','change'),
+        ('cN','cN'),
+        ('cN','cNext'),
+        ('cNf','cNf'),
+        ('cNf','cNfile'),
+        ('cabc','cabclear'),
+        ('cad','cad'),
+        ('cad','caddexpr'),
+        ('caddb','caddbuffer'),
+        ('caddf','caddfile'),
+        ('cal','call'),
+        ('cat','catch'),
+        ('cb','cbuffer'),
+        ('cc','cc'),
+        ('ccl','cclose'),
+        ('cd','cd'),
+        ('ce','center'),
+        ('cex','cexpr'),
+        ('cf','cfile'),
+        ('cfir','cfirst'),
+        ('cg','cgetfile'),
+        ('cgetb','cgetbuffer'),
+        ('cgete','cgetexpr'),
+        ('changes','changes'),
+        ('chd','chdir'),
+        ('che','checkpath'),
+        ('checkt','checktime'),
+        ('cl','cl'),
+        ('cl','clist'),
+        ('cla','clast'),
+        ('clo','close'),
+        ('cmapc','cmapclear'),
+        ('cn','cn'),
+        ('cn','cnext'),
+        ('cnew','cnewer'),
+        ('cnf','cnf'),
+        ('cnf','cnfile'),
+        ('co','copy'),
+        ('col','colder'),
+        ('colo','colorscheme'),
+        ('com','com'),
+        ('comc','comclear'),
+        ('comp','compiler'),
+        ('con','con'),
+        ('con','continue'),
+        ('conf','confirm'),
+        ('cope','copen'),
+        ('cp','cprevious'),
+        ('cpf','cpfile'),
+        ('cq','cquit'),
+        ('cr','crewind'),
+        ('cs','cs'),
+        ('cscope','cscope'),
+        ('cstag','cstag'),
+        ('cuna','cunabbrev'),
+        ('cw','cwindow'),
+        ('d','d'),
+        ('d','delete'),
+        ('de','de'),
+        ('debug','debug'),
+        ('debugg','debuggreedy'),
+        ('del','del'),
+        ('delc','delcommand'),
+        ('delel','delel'),
+        ('delep','delep'),
+        ('deletel','deletel'),
+        ('deletep','deletep'),
+        ('deletl','deletl'),
+        ('deletp','deletp'),
+        ('delf','delf'),
+        ('delf','delfunction'),
+        ('dell','dell'),
+        ('delm','delmarks'),
+        ('delp','delp'),
+        ('dep','dep'),
+        ('di','di'),
+        ('di','display'),
+        ('diffg','diffget'),
+        ('diffo','diffoff'),
+        ('diffp','diffpatch'),
+        ('diffpu','diffput'),
+        ('diffs','diffsplit'),
+        ('difft','diffthis'),
+        ('diffu','diffupdate'),
+        ('dig','dig'),
+        ('dig','digraphs'),
+        ('dir','dir'),
+        ('dj','djump'),
+        ('dl','dl'),
+        ('dli','dlist'),
+        ('do','do'),
+        ('doau','doau'),
+        ('dp','dp'),
+        ('dr','drop'),
+        ('ds','dsearch'),
+        ('dsp','dsplit'),
+        ('e','e'),
+        ('e','edit'),
+        ('ea','ea'),
+        ('earlier','earlier'),
+        ('ec','ec'),
+        ('echoe','echoerr'),
+        ('echom','echomsg'),
+        ('echon','echon'),
+        ('el','else'),
+        ('elsei','elseif'),
+        ('em','emenu'),
+        ('en','en'),
+        ('en','endif'),
+        ('endf','endf'),
+        ('endf','endfunction'),
+        ('endfo','endfor'),
+        ('endfun','endfun'),
+        ('endt','endtry'),
+        ('endw','endwhile'),
+        ('ene','enew'),
+        ('ex','ex'),
+        ('exi','exit'),
+        ('exu','exusage'),
+        ('f','f'),
+        ('f','file'),
+        ('files','files'),
+        ('filet','filet'),
+        ('filetype','filetype'),
+        ('fin','fin'),
+        ('fin','find'),
+        ('fina','finally'),
+        ('fini','finish'),
+        ('fir','first'),
+        ('fix','fixdel'),
+        ('fo','fold'),
+        ('foldc','foldclose'),
+        ('foldd','folddoopen'),
+        ('folddoc','folddoclosed'),
+        ('foldo','foldopen'),
+        ('for','for'),
+        ('fu','fu'),
+        ('fu','function'),
+        ('fun','fun'),
+        ('g','g'),
+        ('go','goto'),
+        ('gr','grep'),
+        ('grepa','grepadd'),
+        ('gui','gui'),
+        ('gvim','gvim'),
+        ('h','h'),
+        ('h','help'),
+        ('ha','hardcopy'),
+        ('helpf','helpfind'),
+        ('helpg','helpgrep'),
+        ('helpt','helptags'),
+        ('hi','hi'),
+        ('hid','hide'),
+        ('his','history'),
+        ('i','i'),
+        ('ia','ia'),
+        ('iabc','iabclear'),
+        ('if','if'),
+        ('ij','ijump'),
+        ('il','ilist'),
+        ('imapc','imapclear'),
+        ('in','in'),
+        ('intro','intro'),
+        ('is','isearch'),
+        ('isp','isplit'),
+        ('iuna','iunabbrev'),
+        ('j','join'),
+        ('ju','jumps'),
+        ('k','k'),
+        ('kee','keepmarks'),
+        ('keepa','keepa'),
+        ('keepalt','keepalt'),
+        ('keepj','keepjumps'),
+        ('keepp','keeppatterns'),
+        ('l','l'),
+        ('l','list'),
+        ('lN','lN'),
+        ('lN','lNext'),
+        ('lNf','lNf'),
+        ('lNf','lNfile'),
+        ('la','la'),
+        ('la','last'),
+        ('lad','lad'),
+        ('lad','laddexpr'),
+        ('laddb','laddbuffer'),
+        ('laddf','laddfile'),
+        ('lan','lan'),
+        ('lan','language'),
+        ('lat','lat'),
+        ('later','later'),
+        ('lb','lbuffer'),
+        ('lc','lcd'),
+        ('lch','lchdir'),
+        ('lcl','lclose'),
+        ('lcs','lcs'),
+        ('lcscope','lcscope'),
+        ('le','left'),
+        ('lefta','leftabove'),
+        ('lex','lexpr'),
+        ('lf','lfile'),
+        ('lfir','lfirst'),
+        ('lg','lgetfile'),
+        ('lgetb','lgetbuffer'),
+        ('lgete','lgetexpr'),
+        ('lgr','lgrep'),
+        ('lgrepa','lgrepadd'),
+        ('lh','lhelpgrep'),
+        ('ll','ll'),
+        ('lla','llast'),
+        ('lli','llist'),
+        ('lmak','lmake'),
+        ('lmapc','lmapclear'),
+        ('lne','lne'),
+        ('lne','lnext'),
+        ('lnew','lnewer'),
+        ('lnf','lnf'),
+        ('lnf','lnfile'),
+        ('lo','lo'),
+        ('lo','loadview'),
+        ('loadk','loadk'),
+        ('loadkeymap','loadkeymap'),
+        ('loc','lockmarks'),
+        ('lockv','lockvar'),
+        ('lol','lolder'),
+        ('lop','lopen'),
+        ('lp','lprevious'),
+        ('lpf','lpfile'),
+        ('lr','lrewind'),
+        ('ls','ls'),
+        ('lt','ltag'),
+        ('lua','lua'),
+        ('luado','luado'),
+        ('luafile','luafile'),
+        ('lv','lvimgrep'),
+        ('lvimgrepa','lvimgrepadd'),
+        ('lw','lwindow'),
+        ('m','move'),
+        ('ma','ma'),
+        ('ma','mark'),
+        ('mak','make'),
+        ('marks','marks'),
+        ('mat','match'),
+        ('menut','menut'),
+        ('menut','menutranslate'),
+        ('mes','mes'),
+        ('messages','messages'),
+        ('mk','mk'),
+        ('mk','mkexrc'),
+        ('mks','mksession'),
+        ('mksp','mkspell'),
+        ('mkv','mkv'),
+        ('mkv','mkvimrc'),
+        ('mkvie','mkview'),
+        ('mo','mo'),
+        ('mod','mode'),
+        ('mz','mz'),
+        ('mz','mzscheme'),
+        ('mzf','mzfile'),
+        ('n','n'),
+        ('n','next'),
+        ('nb','nbkey'),
+        ('nbc','nbclose'),
+        ('nbs','nbstart'),
+        ('ne','ne'),
+        ('new','new'),
+        ('nmapc','nmapclear'),
+        ('noa','noa'),
+        ('noautocmd','noautocmd'),
+        ('noh','nohlsearch'),
+        ('nu','number'),
+        ('o','o'),
+        ('o','open'),
+        ('ol','oldfiles'),
+        ('omapc','omapclear'),
+        ('on','only'),
+        ('opt','options'),
+        ('ownsyntax','ownsyntax'),
+        ('p','p'),
+        ('p','print'),
+        ('pc','pclose'),
+        ('pe','pe'),
+        ('pe','perl'),
+        ('ped','pedit'),
+        ('perld','perldo'),
+        ('po','pop'),
+        ('popu','popu'),
+        ('popu','popup'),
+        ('pp','ppop'),
+        ('pr','pr'),
+        ('pre','preserve'),
+        ('prev','previous'),
+        ('pro','pro'),
+        ('prof','profile'),
+        ('profd','profdel'),
+        ('promptf','promptfind'),
+        ('promptr','promptrepl'),
+        ('ps','psearch'),
+        ('ptN','ptN'),
+        ('ptN','ptNext'),
+        ('pta','ptag'),
+        ('ptf','ptfirst'),
+        ('ptj','ptjump'),
+        ('ptl','ptlast'),
+        ('ptn','ptn'),
+        ('ptn','ptnext'),
+        ('ptp','ptprevious'),
+        ('ptr','ptrewind'),
+        ('pts','ptselect'),
+        ('pu','put'),
+        ('pw','pwd'),
+        ('py','py'),
+        ('py','python'),
+        ('py3','py3'),
+        ('py3','py3'),
+        ('py3do','py3do'),
+        ('pydo','pydo'),
+        ('pyf','pyfile'),
+        ('python3','python3'),
+        ('q','q'),
+        ('q','quit'),
+        ('qa','qall'),
+        ('quita','quitall'),
+        ('r','r'),
+        ('r','read'),
+        ('re','re'),
+        ('rec','recover'),
+        ('red','red'),
+        ('red','redo'),
+        ('redi','redir'),
+        ('redr','redraw'),
+        ('redraws','redrawstatus'),
+        ('reg','registers'),
+        ('res','resize'),
+        ('ret','retab'),
+        ('retu','return'),
+        ('rew','rewind'),
+        ('ri','right'),
+        ('rightb','rightbelow'),
+        ('ru','ru'),
+        ('ru','runtime'),
+        ('rub','ruby'),
+        ('rubyd','rubydo'),
+        ('rubyf','rubyfile'),
+        ('rundo','rundo'),
+        ('rv','rviminfo'),
+        ('sN','sNext'),
+        ('sa','sargument'),
+        ('sal','sall'),
+        ('san','sandbox'),
+        ('sav','saveas'),
+        ('sb','sbuffer'),
+        ('sbN','sbNext'),
+        ('sba','sball'),
+        ('sbf','sbfirst'),
+        ('sbl','sblast'),
+        ('sbm','sbmodified'),
+        ('sbn','sbnext'),
+        ('sbp','sbprevious'),
+        ('sbr','sbrewind'),
+        ('scrip','scrip'),
+        ('scrip','scriptnames'),
+        ('scripte','scriptencoding'),
+        ('scs','scs'),
+        ('scscope','scscope'),
+        ('se','set'),
+        ('setf','setfiletype'),
+        ('setg','setglobal'),
+        ('setl','setlocal'),
+        ('sf','sfind'),
+        ('sfir','sfirst'),
+        ('sh','shell'),
+        ('si','si'),
+        ('sig','sig'),
+        ('sign','sign'),
+        ('sil','silent'),
+        ('sim','simalt'),
+        ('sl','sl'),
+        ('sl','sleep'),
+        ('sla','slast'),
+        ('sm','smagic'),
+        ('sm','smap'),
+        ('sme','sme'),
+        ('smenu','smenu'),
+        ('sn','snext'),
+        ('sni','sniff'),
+        ('sno','snomagic'),
+        ('snoreme','snoreme'),
+        ('snoremenu','snoremenu'),
+        ('so','so'),
+        ('so','source'),
+        ('sor','sort'),
+        ('sp','split'),
+        ('spe','spe'),
+        ('spe','spellgood'),
+        ('spelld','spelldump'),
+        ('spelli','spellinfo'),
+        ('spellr','spellrepall'),
+        ('spellu','spellundo'),
+        ('spellw','spellwrong'),
+        ('spr','sprevious'),
+        ('sre','srewind'),
+        ('st','st'),
+        ('st','stop'),
+        ('sta','stag'),
+        ('star','star'),
+        ('star','startinsert'),
+        ('start','start'),
+        ('startg','startgreplace'),
+        ('startr','startreplace'),
+        ('stj','stjump'),
+        ('stopi','stopinsert'),
+        ('sts','stselect'),
+        ('sun','sunhide'),
+        ('sunme','sunme'),
+        ('sunmenu','sunmenu'),
+        ('sus','suspend'),
+        ('sv','sview'),
+        ('sw','swapname'),
+        ('sy','sy'),
+        ('syn','syn'),
+        ('sync','sync'),
+        ('syncbind','syncbind'),
+        ('syntime','syntime'),
+        ('t','t'),
+        ('tN','tN'),
+        ('tN','tNext'),
+        ('ta','ta'),
+        ('ta','tag'),
+        ('tab','tab'),
+        ('tabN','tabN'),
+        ('tabN','tabNext'),
+        ('tabc','tabclose'),
+        ('tabd','tabdo'),
+        ('tabe','tabedit'),
+        ('tabf','tabfind'),
+        ('tabfir','tabfirst'),
+        ('tabl','tablast'),
+        ('tabm','tabmove'),
+        ('tabn','tabnext'),
+        ('tabnew','tabnew'),
+        ('tabo','tabonly'),
+        ('tabp','tabprevious'),
+        ('tabr','tabrewind'),
+        ('tabs','tabs'),
+        ('tags','tags'),
+        ('tc','tcl'),
+        ('tcld','tcldo'),
+        ('tclf','tclfile'),
+        ('te','tearoff'),
+        ('tf','tfirst'),
+        ('th','throw'),
+        ('tj','tjump'),
+        ('tl','tlast'),
+        ('tm','tm'),
+        ('tm','tmenu'),
+        ('tn','tn'),
+        ('tn','tnext'),
+        ('to','topleft'),
+        ('tp','tprevious'),
+        ('tr','tr'),
+        ('tr','trewind'),
+        ('try','try'),
+        ('ts','tselect'),
+        ('tu','tu'),
+        ('tu','tunmenu'),
+        ('u','u'),
+        ('u','undo'),
+        ('un','un'),
+        ('una','unabbreviate'),
+        ('undoj','undojoin'),
+        ('undol','undolist'),
+        ('unh','unhide'),
+        ('unl','unl'),
+        ('unlo','unlockvar'),
+        ('uns','unsilent'),
+        ('up','update'),
+        ('v','v'),
+        ('ve','ve'),
+        ('ve','version'),
+        ('verb','verbose'),
+        ('vert','vertical'),
+        ('vi','vi'),
+        ('vi','visual'),
+        ('vie','view'),
+        ('vim','vimgrep'),
+        ('vimgrepa','vimgrepadd'),
+        ('viu','viusage'),
+        ('vmapc','vmapclear'),
+        ('vne','vnew'),
+        ('vs','vsplit'),
+        ('w','w'),
+        ('w','write'),
+        ('wN','wNext'),
+        ('wa','wall'),
+        ('wh','while'),
+        ('win','win'),
+        ('win','winsize'),
+        ('winc','wincmd'),
+        ('windo','windo'),
+        ('winp','winpos'),
+        ('wn','wnext'),
+        ('wp','wprevious'),
+        ('wq','wq'),
+        ('wqa','wqall'),
+        ('ws','wsverb'),
+        ('wundo','wundo'),
+        ('wv','wviminfo'),
+        ('x','x'),
+        ('x','xit'),
+        ('xa','xall'),
+        ('xmapc','xmapclear'),
+        ('xme','xme'),
+        ('xmenu','xmenu'),
+        ('xnoreme','xnoreme'),
+        ('xnoremenu','xnoremenu'),
+        ('xunme','xunme'),
+        ('xunmenu','xunmenu'),
+        ('xwininfo','xwininfo'),
+        ('y','yank'),
+    )
+    return var
+command = _getcommand()
+
+def _getoption():
+    var = (
+        ('acd','acd'),
+        ('ai','ai'),
+        ('akm','akm'),
+        ('al','al'),
+        ('aleph','aleph'),
+        ('allowrevins','allowrevins'),
+        ('altkeymap','altkeymap'),
+        ('ambiwidth','ambiwidth'),
+        ('ambw','ambw'),
+        ('anti','anti'),
+        ('antialias','antialias'),
+        ('ar','ar'),
+        ('arab','arab'),
+        ('arabic','arabic'),
+        ('arabicshape','arabicshape'),
+        ('ari','ari'),
+        ('arshape','arshape'),
+        ('autochdir','autochdir'),
+        ('autoindent','autoindent'),
+        ('autoread','autoread'),
+        ('autowrite','autowrite'),
+        ('autowriteall','autowriteall'),
+        ('aw','aw'),
+        ('awa','awa'),
+        ('background','background'),
+        ('backspace','backspace'),
+        ('backup','backup'),
+        ('backupcopy','backupcopy'),
+        ('backupdir','backupdir'),
+        ('backupext','backupext'),
+        ('backupskip','backupskip'),
+        ('balloondelay','balloondelay'),
+        ('ballooneval','ballooneval'),
+        ('balloonexpr','balloonexpr'),
+        ('bdir','bdir'),
+        ('bdlay','bdlay'),
+        ('beval','beval'),
+        ('bex','bex'),
+        ('bexpr','bexpr'),
+        ('bg','bg'),
+        ('bh','bh'),
+        ('bin','bin'),
+        ('binary','binary'),
+        ('biosk','biosk'),
+        ('bioskey','bioskey'),
+        ('bk','bk'),
+        ('bkc','bkc'),
+        ('bl','bl'),
+        ('bomb','bomb'),
+        ('breakat','breakat'),
+        ('brk','brk'),
+        ('browsedir','browsedir'),
+        ('bs','bs'),
+        ('bsdir','bsdir'),
+        ('bsk','bsk'),
+        ('bt','bt'),
+        ('bufhidden','bufhidden'),
+        ('buflisted','buflisted'),
+        ('buftype','buftype'),
+        ('casemap','casemap'),
+        ('cb','cb'),
+        ('cc','cc'),
+        ('ccv','ccv'),
+        ('cd','cd'),
+        ('cdpath','cdpath'),
+        ('cedit','cedit'),
+        ('cf','cf'),
+        ('cfu','cfu'),
+        ('ch','ch'),
+        ('charconvert','charconvert'),
+        ('ci','ci'),
+        ('cin','cin'),
+        ('cindent','cindent'),
+        ('cink','cink'),
+        ('cinkeys','cinkeys'),
+        ('cino','cino'),
+        ('cinoptions','cinoptions'),
+        ('cinw','cinw'),
+        ('cinwords','cinwords'),
+        ('clipboard','clipboard'),
+        ('cmdheight','cmdheight'),
+        ('cmdwinheight','cmdwinheight'),
+        ('cmp','cmp'),
+        ('cms','cms'),
+        ('co','co'),
+        ('cocu','cocu'),
+        ('cole','cole'),
+        ('colorcolumn','colorcolumn'),
+        ('columns','columns'),
+        ('com','com'),
+        ('comments','comments'),
+        ('commentstring','commentstring'),
+        ('compatible','compatible'),
+        ('complete','complete'),
+        ('completefunc','completefunc'),
+        ('completeopt','completeopt'),
+        ('concealcursor','concealcursor'),
+        ('conceallevel','conceallevel'),
+        ('confirm','confirm'),
+        ('consk','consk'),
+        ('conskey','conskey'),
+        ('copyindent','copyindent'),
+        ('cot','cot'),
+        ('cp','cp'),
+        ('cpo','cpo'),
+        ('cpoptions','cpoptions'),
+        ('cpt','cpt'),
+        ('crb','crb'),
+        ('cryptmethod','cryptmethod'),
+        ('cscopepathcomp','cscopepathcomp'),
+        ('cscopeprg','cscopeprg'),
+        ('cscopequickfix','cscopequickfix'),
+        ('cscoperelative','cscoperelative'),
+        ('cscopetag','cscopetag'),
+        ('cscopetagorder','cscopetagorder'),
+        ('cscopeverbose','cscopeverbose'),
+        ('cspc','cspc'),
+        ('csprg','csprg'),
+        ('csqf','csqf'),
+        ('csre','csre'),
+        ('cst','cst'),
+        ('csto','csto'),
+        ('csverb','csverb'),
+        ('cuc','cuc'),
+        ('cul','cul'),
+        ('cursorbind','cursorbind'),
+        ('cursorcolumn','cursorcolumn'),
+        ('cursorline','cursorline'),
+        ('cwh','cwh'),
+        ('debug','debug'),
+        ('deco','deco'),
+        ('def','def'),
+        ('define','define'),
+        ('delcombine','delcombine'),
+        ('dex','dex'),
+        ('dg','dg'),
+        ('dict','dict'),
+        ('dictionary','dictionary'),
+        ('diff','diff'),
+        ('diffexpr','diffexpr'),
+        ('diffopt','diffopt'),
+        ('digraph','digraph'),
+        ('dip','dip'),
+        ('dir','dir'),
+        ('directory','directory'),
+        ('display','display'),
+        ('dy','dy'),
+        ('ea','ea'),
+        ('ead','ead'),
+        ('eadirection','eadirection'),
+        ('eb','eb'),
+        ('ed','ed'),
+        ('edcompatible','edcompatible'),
+        ('ef','ef'),
+        ('efm','efm'),
+        ('ei','ei'),
+        ('ek','ek'),
+        ('enc','enc'),
+        ('encoding','encoding'),
+        ('endofline','endofline'),
+        ('eol','eol'),
+        ('ep','ep'),
+        ('equalalways','equalalways'),
+        ('equalprg','equalprg'),
+        ('errorbells','errorbells'),
+        ('errorfile','errorfile'),
+        ('errorformat','errorformat'),
+        ('esckeys','esckeys'),
+        ('et','et'),
+        ('eventignore','eventignore'),
+        ('ex','ex'),
+        ('expandtab','expandtab'),
+        ('exrc','exrc'),
+        ('fcl','fcl'),
+        ('fcs','fcs'),
+        ('fdc','fdc'),
+        ('fde','fde'),
+        ('fdi','fdi'),
+        ('fdl','fdl'),
+        ('fdls','fdls'),
+        ('fdm','fdm'),
+        ('fdn','fdn'),
+        ('fdo','fdo'),
+        ('fdt','fdt'),
+        ('fen','fen'),
+        ('fenc','fenc'),
+        ('fencs','fencs'),
+        ('fex','fex'),
+        ('ff','ff'),
+        ('ffs','ffs'),
+        ('fic','fic'),
+        ('fileencoding','fileencoding'),
+        ('fileencodings','fileencodings'),
+        ('fileformat','fileformat'),
+        ('fileformats','fileformats'),
+        ('fileignorecase','fileignorecase'),
+        ('filetype','filetype'),
+        ('fillchars','fillchars'),
+        ('fk','fk'),
+        ('fkmap','fkmap'),
+        ('flp','flp'),
+        ('fml','fml'),
+        ('fmr','fmr'),
+        ('fo','fo'),
+        ('foldclose','foldclose'),
+        ('foldcolumn','foldcolumn'),
+        ('foldenable','foldenable'),
+        ('foldexpr','foldexpr'),
+        ('foldignore','foldignore'),
+        ('foldlevel','foldlevel'),
+        ('foldlevelstart','foldlevelstart'),
+        ('foldmarker','foldmarker'),
+        ('foldmethod','foldmethod'),
+        ('foldminlines','foldminlines'),
+        ('foldnestmax','foldnestmax'),
+        ('foldopen','foldopen'),
+        ('foldtext','foldtext'),
+        ('formatexpr','formatexpr'),
+        ('formatlistpat','formatlistpat'),
+        ('formatoptions','formatoptions'),
+        ('formatprg','formatprg'),
+        ('fp','fp'),
+        ('fs','fs'),
+        ('fsync','fsync'),
+        ('ft','ft'),
+        ('gcr','gcr'),
+        ('gd','gd'),
+        ('gdefault','gdefault'),
+        ('gfm','gfm'),
+        ('gfn','gfn'),
+        ('gfs','gfs'),
+        ('gfw','gfw'),
+        ('ghr','ghr'),
+        ('go','go'),
+        ('gp','gp'),
+        ('grepformat','grepformat'),
+        ('grepprg','grepprg'),
+        ('gtl','gtl'),
+        ('gtt','gtt'),
+        ('guicursor','guicursor'),
+        ('guifont','guifont'),
+        ('guifontset','guifontset'),
+        ('guifontwide','guifontwide'),
+        ('guiheadroom','guiheadroom'),
+        ('guioptions','guioptions'),
+        ('guipty','guipty'),
+        ('guitablabel','guitablabel'),
+        ('guitabtooltip','guitabtooltip'),
+        ('helpfile','helpfile'),
+        ('helpheight','helpheight'),
+        ('helplang','helplang'),
+        ('hf','hf'),
+        ('hh','hh'),
+        ('hi','hi'),
+        ('hid','hid'),
+        ('hidden','hidden'),
+        ('highlight','highlight'),
+        ('history','history'),
+        ('hk','hk'),
+        ('hkmap','hkmap'),
+        ('hkmapp','hkmapp'),
+        ('hkp','hkp'),
+        ('hl','hl'),
+        ('hlg','hlg'),
+        ('hls','hls'),
+        ('hlsearch','hlsearch'),
+        ('ic','ic'),
+        ('icon','icon'),
+        ('iconstring','iconstring'),
+        ('ignorecase','ignorecase'),
+        ('im','im'),
+        ('imactivatefunc','imactivatefunc'),
+        ('imactivatekey','imactivatekey'),
+        ('imaf','imaf'),
+        ('imak','imak'),
+        ('imc','imc'),
+        ('imcmdline','imcmdline'),
+        ('imd','imd'),
+        ('imdisable','imdisable'),
+        ('imi','imi'),
+        ('iminsert','iminsert'),
+        ('ims','ims'),
+        ('imsearch','imsearch'),
+        ('imsf','imsf'),
+        ('imstatusfunc','imstatusfunc'),
+        ('inc','inc'),
+        ('include','include'),
+        ('includeexpr','includeexpr'),
+        ('incsearch','incsearch'),
+        ('inde','inde'),
+        ('indentexpr','indentexpr'),
+        ('indentkeys','indentkeys'),
+        ('indk','indk'),
+        ('inex','inex'),
+        ('inf','inf'),
+        ('infercase','infercase'),
+        ('inoremap','inoremap'),
+        ('insertmode','insertmode'),
+        ('invacd','invacd'),
+        ('invai','invai'),
+        ('invakm','invakm'),
+        ('invallowrevins','invallowrevins'),
+        ('invaltkeymap','invaltkeymap'),
+        ('invanti','invanti'),
+        ('invantialias','invantialias'),
+        ('invar','invar'),
+        ('invarab','invarab'),
+        ('invarabic','invarabic'),
+        ('invarabicshape','invarabicshape'),
+        ('invari','invari'),
+        ('invarshape','invarshape'),
+        ('invautochdir','invautochdir'),
+        ('invautoindent','invautoindent'),
+        ('invautoread','invautoread'),
+        ('invautowrite','invautowrite'),
+        ('invautowriteall','invautowriteall'),
+        ('invaw','invaw'),
+        ('invawa','invawa'),
+        ('invbackup','invbackup'),
+        ('invballooneval','invballooneval'),
+        ('invbeval','invbeval'),
+        ('invbin','invbin'),
+        ('invbinary','invbinary'),
+        ('invbiosk','invbiosk'),
+        ('invbioskey','invbioskey'),
+        ('invbk','invbk'),
+        ('invbl','invbl'),
+        ('invbomb','invbomb'),
+        ('invbuflisted','invbuflisted'),
+        ('invcf','invcf'),
+        ('invci','invci'),
+        ('invcin','invcin'),
+        ('invcindent','invcindent'),
+        ('invcompatible','invcompatible'),
+        ('invconfirm','invconfirm'),
+        ('invconsk','invconsk'),
+        ('invconskey','invconskey'),
+        ('invcopyindent','invcopyindent'),
+        ('invcp','invcp'),
+        ('invcrb','invcrb'),
+        ('invcscoperelative','invcscoperelative'),
+        ('invcscopetag','invcscopetag'),
+        ('invcscopeverbose','invcscopeverbose'),
+        ('invcsre','invcsre'),
+        ('invcst','invcst'),
+        ('invcsverb','invcsverb'),
+        ('invcuc','invcuc'),
+        ('invcul','invcul'),
+        ('invcursorbind','invcursorbind'),
+        ('invcursorcolumn','invcursorcolumn'),
+        ('invcursorline','invcursorline'),
+        ('invdeco','invdeco'),
+        ('invdelcombine','invdelcombine'),
+        ('invdg','invdg'),
+        ('invdiff','invdiff'),
+        ('invdigraph','invdigraph'),
+        ('invea','invea'),
+        ('inveb','inveb'),
+        ('inved','inved'),
+        ('invedcompatible','invedcompatible'),
+        ('invek','invek'),
+        ('invendofline','invendofline'),
+        ('inveol','inveol'),
+        ('invequalalways','invequalalways'),
+        ('inverrorbells','inverrorbells'),
+        ('invesckeys','invesckeys'),
+        ('invet','invet'),
+        ('invex','invex'),
+        ('invexpandtab','invexpandtab'),
+        ('invexrc','invexrc'),
+        ('invfen','invfen'),
+        ('invfic','invfic'),
+        ('invfileignorecase','invfileignorecase'),
+        ('invfk','invfk'),
+        ('invfkmap','invfkmap'),
+        ('invfoldenable','invfoldenable'),
+        ('invgd','invgd'),
+        ('invgdefault','invgdefault'),
+        ('invguipty','invguipty'),
+        ('invhid','invhid'),
+        ('invhidden','invhidden'),
+        ('invhk','invhk'),
+        ('invhkmap','invhkmap'),
+        ('invhkmapp','invhkmapp'),
+        ('invhkp','invhkp'),
+        ('invhls','invhls'),
+        ('invhlsearch','invhlsearch'),
+        ('invic','invic'),
+        ('invicon','invicon'),
+        ('invignorecase','invignorecase'),
+        ('invim','invim'),
+        ('invimc','invimc'),
+        ('invimcmdline','invimcmdline'),
+        ('invimd','invimd'),
+        ('invimdisable','invimdisable'),
+        ('invincsearch','invincsearch'),
+        ('invinf','invinf'),
+        ('invinfercase','invinfercase'),
+        ('invinsertmode','invinsertmode'),
+        ('invis','invis'),
+        ('invjoinspaces','invjoinspaces'),
+        ('invjs','invjs'),
+        ('invlazyredraw','invlazyredraw'),
+        ('invlbr','invlbr'),
+        ('invlinebreak','invlinebreak'),
+        ('invlisp','invlisp'),
+        ('invlist','invlist'),
+        ('invloadplugins','invloadplugins'),
+        ('invlpl','invlpl'),
+        ('invlz','invlz'),
+        ('invma','invma'),
+        ('invmacatsui','invmacatsui'),
+        ('invmagic','invmagic'),
+        ('invmh','invmh'),
+        ('invml','invml'),
+        ('invmod','invmod'),
+        ('invmodeline','invmodeline'),
+        ('invmodifiable','invmodifiable'),
+        ('invmodified','invmodified'),
+        ('invmore','invmore'),
+        ('invmousef','invmousef'),
+        ('invmousefocus','invmousefocus'),
+        ('invmousehide','invmousehide'),
+        ('invnu','invnu'),
+        ('invnumber','invnumber'),
+        ('invodev','invodev'),
+        ('invopendevice','invopendevice'),
+        ('invpaste','invpaste'),
+        ('invpi','invpi'),
+        ('invpreserveindent','invpreserveindent'),
+        ('invpreviewwindow','invpreviewwindow'),
+        ('invprompt','invprompt'),
+        ('invpvw','invpvw'),
+        ('invreadonly','invreadonly'),
+        ('invrelativenumber','invrelativenumber'),
+        ('invremap','invremap'),
+        ('invrestorescreen','invrestorescreen'),
+        ('invrevins','invrevins'),
+        ('invri','invri'),
+        ('invrightleft','invrightleft'),
+        ('invrl','invrl'),
+        ('invrnu','invrnu'),
+        ('invro','invro'),
+        ('invrs','invrs'),
+        ('invru','invru'),
+        ('invruler','invruler'),
+        ('invsb','invsb'),
+        ('invsc','invsc'),
+        ('invscb','invscb'),
+        ('invscrollbind','invscrollbind'),
+        ('invscs','invscs'),
+        ('invsecure','invsecure'),
+        ('invsft','invsft'),
+        ('invshellslash','invshellslash'),
+        ('invshelltemp','invshelltemp'),
+        ('invshiftround','invshiftround'),
+        ('invshortname','invshortname'),
+        ('invshowcmd','invshowcmd'),
+        ('invshowfulltag','invshowfulltag'),
+        ('invshowmatch','invshowmatch'),
+        ('invshowmode','invshowmode'),
+        ('invsi','invsi'),
+        ('invsm','invsm'),
+        ('invsmartcase','invsmartcase'),
+        ('invsmartindent','invsmartindent'),
+        ('invsmarttab','invsmarttab'),
+        ('invsmd','invsmd'),
+        ('invsn','invsn'),
+        ('invsol','invsol'),
+        ('invspell','invspell'),
+        ('invsplitbelow','invsplitbelow'),
+        ('invsplitright','invsplitright'),
+        ('invspr','invspr'),
+        ('invsr','invsr'),
+        ('invssl','invssl'),
+        ('invsta','invsta'),
+        ('invstartofline','invstartofline'),
+        ('invstmp','invstmp'),
+        ('invswapfile','invswapfile'),
+        ('invswf','invswf'),
+        ('invta','invta'),
+        ('invtagbsearch','invtagbsearch'),
+        ('invtagrelative','invtagrelative'),
+        ('invtagstack','invtagstack'),
+        ('invtbi','invtbi'),
+        ('invtbidi','invtbidi'),
+        ('invtbs','invtbs'),
+        ('invtermbidi','invtermbidi'),
+        ('invterse','invterse'),
+        ('invtextauto','invtextauto'),
+        ('invtextmode','invtextmode'),
+        ('invtf','invtf'),
+        ('invtgst','invtgst'),
+        ('invtildeop','invtildeop'),
+        ('invtimeout','invtimeout'),
+        ('invtitle','invtitle'),
+        ('invto','invto'),
+        ('invtop','invtop'),
+        ('invtr','invtr'),
+        ('invttimeout','invttimeout'),
+        ('invttybuiltin','invttybuiltin'),
+        ('invttyfast','invttyfast'),
+        ('invtx','invtx'),
+        ('invudf','invudf'),
+        ('invundofile','invundofile'),
+        ('invvb','invvb'),
+        ('invvisualbell','invvisualbell'),
+        ('invwa','invwa'),
+        ('invwarn','invwarn'),
+        ('invwb','invwb'),
+        ('invweirdinvert','invweirdinvert'),
+        ('invwfh','invwfh'),
+        ('invwfw','invwfw'),
+        ('invwic','invwic'),
+        ('invwildignorecase','invwildignorecase'),
+        ('invwildmenu','invwildmenu'),
+        ('invwinfixheight','invwinfixheight'),
+        ('invwinfixwidth','invwinfixwidth'),
+        ('invwiv','invwiv'),
+        ('invwmnu','invwmnu'),
+        ('invwrap','invwrap'),
+        ('invwrapscan','invwrapscan'),
+        ('invwrite','invwrite'),
+        ('invwriteany','invwriteany'),
+        ('invwritebackup','invwritebackup'),
+        ('invws','invws'),
+        ('is','is'),
+        ('isf','isf'),
+        ('isfname','isfname'),
+        ('isi','isi'),
+        ('isident','isident'),
+        ('isk','isk'),
+        ('iskeyword','iskeyword'),
+        ('isp','isp'),
+        ('isprint','isprint'),
+        ('joinspaces','joinspaces'),
+        ('js','js'),
+        ('key','key'),
+        ('keymap','keymap'),
+        ('keymodel','keymodel'),
+        ('keywordprg','keywordprg'),
+        ('km','km'),
+        ('kmp','kmp'),
+        ('kp','kp'),
+        ('langmap','langmap'),
+        ('langmenu','langmenu'),
+        ('laststatus','laststatus'),
+        ('lazyredraw','lazyredraw'),
+        ('lbr','lbr'),
+        ('lcs','lcs'),
+        ('linebreak','linebreak'),
+        ('lines','lines'),
+        ('linespace','linespace'),
+        ('lisp','lisp'),
+        ('lispwords','lispwords'),
+        ('list','list'),
+        ('listchars','listchars'),
+        ('lm','lm'),
+        ('lmap','lmap'),
+        ('loadplugins','loadplugins'),
+        ('lpl','lpl'),
+        ('ls','ls'),
+        ('lsp','lsp'),
+        ('lw','lw'),
+        ('lz','lz'),
+        ('ma','ma'),
+        ('macatsui','macatsui'),
+        ('magic','magic'),
+        ('makeef','makeef'),
+        ('makeprg','makeprg'),
+        ('mat','mat'),
+        ('matchpairs','matchpairs'),
+        ('matchtime','matchtime'),
+        ('maxcombine','maxcombine'),
+        ('maxfuncdepth','maxfuncdepth'),
+        ('maxmapdepth','maxmapdepth'),
+        ('maxmem','maxmem'),
+        ('maxmempattern','maxmempattern'),
+        ('maxmemtot','maxmemtot'),
+        ('mco','mco'),
+        ('mef','mef'),
+        ('menuitems','menuitems'),
+        ('mfd','mfd'),
+        ('mh','mh'),
+        ('mis','mis'),
+        ('mkspellmem','mkspellmem'),
+        ('ml','ml'),
+        ('mls','mls'),
+        ('mm','mm'),
+        ('mmd','mmd'),
+        ('mmp','mmp'),
+        ('mmt','mmt'),
+        ('mod','mod'),
+        ('modeline','modeline'),
+        ('modelines','modelines'),
+        ('modifiable','modifiable'),
+        ('modified','modified'),
+        ('more','more'),
+        ('mouse','mouse'),
+        ('mousef','mousef'),
+        ('mousefocus','mousefocus'),
+        ('mousehide','mousehide'),
+        ('mousem','mousem'),
+        ('mousemodel','mousemodel'),
+        ('mouses','mouses'),
+        ('mouseshape','mouseshape'),
+        ('mouset','mouset'),
+        ('mousetime','mousetime'),
+        ('mp','mp'),
+        ('mps','mps'),
+        ('msm','msm'),
+        ('mzq','mzq'),
+        ('mzquantum','mzquantum'),
+        ('nf','nf'),
+        ('nnoremap','nnoremap'),
+        ('noacd','noacd'),
+        ('noai','noai'),
+        ('noakm','noakm'),
+        ('noallowrevins','noallowrevins'),
+        ('noaltkeymap','noaltkeymap'),
+        ('noanti','noanti'),
+        ('noantialias','noantialias'),
+        ('noar','noar'),
+        ('noarab','noarab'),
+        ('noarabic','noarabic'),
+        ('noarabicshape','noarabicshape'),
+        ('noari','noari'),
+        ('noarshape','noarshape'),
+        ('noautochdir','noautochdir'),
+        ('noautoindent','noautoindent'),
+        ('noautoread','noautoread'),
+        ('noautowrite','noautowrite'),
+        ('noautowriteall','noautowriteall'),
+        ('noaw','noaw'),
+        ('noawa','noawa'),
+        ('nobackup','nobackup'),
+        ('noballooneval','noballooneval'),
+        ('nobeval','nobeval'),
+        ('nobin','nobin'),
+        ('nobinary','nobinary'),
+        ('nobiosk','nobiosk'),
+        ('nobioskey','nobioskey'),
+        ('nobk','nobk'),
+        ('nobl','nobl'),
+        ('nobomb','nobomb'),
+        ('nobuflisted','nobuflisted'),
+        ('nocf','nocf'),
+        ('noci','noci'),
+        ('nocin','nocin'),
+        ('nocindent','nocindent'),
+        ('nocompatible','nocompatible'),
+        ('noconfirm','noconfirm'),
+        ('noconsk','noconsk'),
+        ('noconskey','noconskey'),
+        ('nocopyindent','nocopyindent'),
+        ('nocp','nocp'),
+        ('nocrb','nocrb'),
+        ('nocscoperelative','nocscoperelative'),
+        ('nocscopetag','nocscopetag'),
+        ('nocscopeverbose','nocscopeverbose'),
+        ('nocsre','nocsre'),
+        ('nocst','nocst'),
+        ('nocsverb','nocsverb'),
+        ('nocuc','nocuc'),
+        ('nocul','nocul'),
+        ('nocursorbind','nocursorbind'),
+        ('nocursorcolumn','nocursorcolumn'),
+        ('nocursorline','nocursorline'),
+        ('nodeco','nodeco'),
+        ('nodelcombine','nodelcombine'),
+        ('nodg','nodg'),
+        ('nodiff','nodiff'),
+        ('nodigraph','nodigraph'),
+        ('noea','noea'),
+        ('noeb','noeb'),
+        ('noed','noed'),
+        ('noedcompatible','noedcompatible'),
+        ('noek','noek'),
+        ('noendofline','noendofline'),
+        ('noeol','noeol'),
+        ('noequalalways','noequalalways'),
+        ('noerrorbells','noerrorbells'),
+        ('noesckeys','noesckeys'),
+        ('noet','noet'),
+        ('noex','noex'),
+        ('noexpandtab','noexpandtab'),
+        ('noexrc','noexrc'),
+        ('nofen','nofen'),
+        ('nofic','nofic'),
+        ('nofileignorecase','nofileignorecase'),
+        ('nofk','nofk'),
+        ('nofkmap','nofkmap'),
+        ('nofoldenable','nofoldenable'),
+        ('nogd','nogd'),
+        ('nogdefault','nogdefault'),
+        ('noguipty','noguipty'),
+        ('nohid','nohid'),
+        ('nohidden','nohidden'),
+        ('nohk','nohk'),
+        ('nohkmap','nohkmap'),
+        ('nohkmapp','nohkmapp'),
+        ('nohkp','nohkp'),
+        ('nohls','nohls'),
+        ('nohlsearch','nohlsearch'),
+        ('noic','noic'),
+        ('noicon','noicon'),
+        ('noignorecase','noignorecase'),
+        ('noim','noim'),
+        ('noimc','noimc'),
+        ('noimcmdline','noimcmdline'),
+        ('noimd','noimd'),
+        ('noimdisable','noimdisable'),
+        ('noincsearch','noincsearch'),
+        ('noinf','noinf'),
+        ('noinfercase','noinfercase'),
+        ('noinsertmode','noinsertmode'),
+        ('nois','nois'),
+        ('nojoinspaces','nojoinspaces'),
+        ('nojs','nojs'),
+        ('nolazyredraw','nolazyredraw'),
+        ('nolbr','nolbr'),
+        ('nolinebreak','nolinebreak'),
+        ('nolisp','nolisp'),
+        ('nolist','nolist'),
+        ('noloadplugins','noloadplugins'),
+        ('nolpl','nolpl'),
+        ('nolz','nolz'),
+        ('noma','noma'),
+        ('nomacatsui','nomacatsui'),
+        ('nomagic','nomagic'),
+        ('nomh','nomh'),
+        ('noml','noml'),
+        ('nomod','nomod'),
+        ('nomodeline','nomodeline'),
+        ('nomodifiable','nomodifiable'),
+        ('nomodified','nomodified'),
+        ('nomore','nomore'),
+        ('nomousef','nomousef'),
+        ('nomousefocus','nomousefocus'),
+        ('nomousehide','nomousehide'),
+        ('nonu','nonu'),
+        ('nonumber','nonumber'),
+        ('noodev','noodev'),
+        ('noopendevice','noopendevice'),
+        ('nopaste','nopaste'),
+        ('nopi','nopi'),
+        ('nopreserveindent','nopreserveindent'),
+        ('nopreviewwindow','nopreviewwindow'),
+        ('noprompt','noprompt'),
+        ('nopvw','nopvw'),
+        ('noreadonly','noreadonly'),
+        ('norelativenumber','norelativenumber'),
+        ('noremap','noremap'),
+        ('norestorescreen','norestorescreen'),
+        ('norevins','norevins'),
+        ('nori','nori'),
+        ('norightleft','norightleft'),
+        ('norl','norl'),
+        ('nornu','nornu'),
+        ('noro','noro'),
+        ('nors','nors'),
+        ('noru','noru'),
+        ('noruler','noruler'),
+        ('nosb','nosb'),
+        ('nosc','nosc'),
+        ('noscb','noscb'),
+        ('noscrollbind','noscrollbind'),
+        ('noscs','noscs'),
+        ('nosecure','nosecure'),
+        ('nosft','nosft'),
+        ('noshellslash','noshellslash'),
+        ('noshelltemp','noshelltemp'),
+        ('noshiftround','noshiftround'),
+        ('noshortname','noshortname'),
+        ('noshowcmd','noshowcmd'),
+        ('noshowfulltag','noshowfulltag'),
+        ('noshowmatch','noshowmatch'),
+        ('noshowmode','noshowmode'),
+        ('nosi','nosi'),
+        ('nosm','nosm'),
+        ('nosmartcase','nosmartcase'),
+        ('nosmartindent','nosmartindent'),
+        ('nosmarttab','nosmarttab'),
+        ('nosmd','nosmd'),
+        ('nosn','nosn'),
+        ('nosol','nosol'),
+        ('nospell','nospell'),
+        ('nosplitbelow','nosplitbelow'),
+        ('nosplitright','nosplitright'),
+        ('nospr','nospr'),
+        ('nosr','nosr'),
+        ('nossl','nossl'),
+        ('nosta','nosta'),
+        ('nostartofline','nostartofline'),
+        ('nostmp','nostmp'),
+        ('noswapfile','noswapfile'),
+        ('noswf','noswf'),
+        ('nota','nota'),
+        ('notagbsearch','notagbsearch'),
+        ('notagrelative','notagrelative'),
+        ('notagstack','notagstack'),
+        ('notbi','notbi'),
+        ('notbidi','notbidi'),
+        ('notbs','notbs'),
+        ('notermbidi','notermbidi'),
+        ('noterse','noterse'),
+        ('notextauto','notextauto'),
+        ('notextmode','notextmode'),
+        ('notf','notf'),
+        ('notgst','notgst'),
+        ('notildeop','notildeop'),
+        ('notimeout','notimeout'),
+        ('notitle','notitle'),
+        ('noto','noto'),
+        ('notop','notop'),
+        ('notr','notr'),
+        ('nottimeout','nottimeout'),
+        ('nottybuiltin','nottybuiltin'),
+        ('nottyfast','nottyfast'),
+        ('notx','notx'),
+        ('noudf','noudf'),
+        ('noundofile','noundofile'),
+        ('novb','novb'),
+        ('novisualbell','novisualbell'),
+        ('nowa','nowa'),
+        ('nowarn','nowarn'),
+        ('nowb','nowb'),
+        ('noweirdinvert','noweirdinvert'),
+        ('nowfh','nowfh'),
+        ('nowfw','nowfw'),
+        ('nowic','nowic'),
+        ('nowildignorecase','nowildignorecase'),
+        ('nowildmenu','nowildmenu'),
+        ('nowinfixheight','nowinfixheight'),
+        ('nowinfixwidth','nowinfixwidth'),
+        ('nowiv','nowiv'),
+        ('nowmnu','nowmnu'),
+        ('nowrap','nowrap'),
+        ('nowrapscan','nowrapscan'),
+        ('nowrite','nowrite'),
+        ('nowriteany','nowriteany'),
+        ('nowritebackup','nowritebackup'),
+        ('nows','nows'),
+        ('nrformats','nrformats'),
+        ('nu','nu'),
+        ('number','number'),
+        ('numberwidth','numberwidth'),
+        ('nuw','nuw'),
+        ('odev','odev'),
+        ('oft','oft'),
+        ('ofu','ofu'),
+        ('omnifunc','omnifunc'),
+        ('opendevice','opendevice'),
+        ('operatorfunc','operatorfunc'),
+        ('opfunc','opfunc'),
+        ('osfiletype','osfiletype'),
+        ('pa','pa'),
+        ('para','para'),
+        ('paragraphs','paragraphs'),
+        ('paste','paste'),
+        ('pastetoggle','pastetoggle'),
+        ('patchexpr','patchexpr'),
+        ('patchmode','patchmode'),
+        ('path','path'),
+        ('pdev','pdev'),
+        ('penc','penc'),
+        ('pex','pex'),
+        ('pexpr','pexpr'),
+        ('pfn','pfn'),
+        ('ph','ph'),
+        ('pheader','pheader'),
+        ('pi','pi'),
+        ('pm','pm'),
+        ('pmbcs','pmbcs'),
+        ('pmbfn','pmbfn'),
+        ('popt','popt'),
+        ('preserveindent','preserveindent'),
+        ('previewheight','previewheight'),
+        ('previewwindow','previewwindow'),
+        ('printdevice','printdevice'),
+        ('printencoding','printencoding'),
+        ('printexpr','printexpr'),
+        ('printfont','printfont'),
+        ('printheader','printheader'),
+        ('printmbcharset','printmbcharset'),
+        ('printmbfont','printmbfont'),
+        ('printoptions','printoptions'),
+        ('prompt','prompt'),
+        ('pt','pt'),
+        ('pumheight','pumheight'),
+        ('pvh','pvh'),
+        ('pvw','pvw'),
+        ('qe','qe'),
+        ('quoteescape','quoteescape'),
+        ('rdt','rdt'),
+        ('re','re'),
+        ('readonly','readonly'),
+        ('redrawtime','redrawtime'),
+        ('regexpengine','regexpengine'),
+        ('relativenumber','relativenumber'),
+        ('remap','remap'),
+        ('report','report'),
+        ('restorescreen','restorescreen'),
+        ('revins','revins'),
+        ('ri','ri'),
+        ('rightleft','rightleft'),
+        ('rightleftcmd','rightleftcmd'),
+        ('rl','rl'),
+        ('rlc','rlc'),
+        ('rnu','rnu'),
+        ('ro','ro'),
+        ('rs','rs'),
+        ('rtp','rtp'),
+        ('ru','ru'),
+        ('ruf','ruf'),
+        ('ruler','ruler'),
+        ('rulerformat','rulerformat'),
+        ('runtimepath','runtimepath'),
+        ('sb','sb'),
+        ('sbo','sbo'),
+        ('sbr','sbr'),
+        ('sc','sc'),
+        ('scb','scb'),
+        ('scr','scr'),
+        ('scroll','scroll'),
+        ('scrollbind','scrollbind'),
+        ('scrolljump','scrolljump'),
+        ('scrolloff','scrolloff'),
+        ('scrollopt','scrollopt'),
+        ('scs','scs'),
+        ('sect','sect'),
+        ('sections','sections'),
+        ('secure','secure'),
+        ('sel','sel'),
+        ('selection','selection'),
+        ('selectmode','selectmode'),
+        ('sessionoptions','sessionoptions'),
+        ('sft','sft'),
+        ('sh','sh'),
+        ('shcf','shcf'),
+        ('shell','shell'),
+        ('shellcmdflag','shellcmdflag'),
+        ('shellpipe','shellpipe'),
+        ('shellquote','shellquote'),
+        ('shellredir','shellredir'),
+        ('shellslash','shellslash'),
+        ('shelltemp','shelltemp'),
+        ('shelltype','shelltype'),
+        ('shellxescape','shellxescape'),
+        ('shellxquote','shellxquote'),
+        ('shiftround','shiftround'),
+        ('shiftwidth','shiftwidth'),
+        ('shm','shm'),
+        ('shortmess','shortmess'),
+        ('shortname','shortname'),
+        ('showbreak','showbreak'),
+        ('showcmd','showcmd'),
+        ('showfulltag','showfulltag'),
+        ('showmatch','showmatch'),
+        ('showmode','showmode'),
+        ('showtabline','showtabline'),
+        ('shq','shq'),
+        ('si','si'),
+        ('sidescroll','sidescroll'),
+        ('sidescrolloff','sidescrolloff'),
+        ('siso','siso'),
+        ('sj','sj'),
+        ('slm','slm'),
+        ('sm','sm'),
+        ('smartcase','smartcase'),
+        ('smartindent','smartindent'),
+        ('smarttab','smarttab'),
+        ('smc','smc'),
+        ('smd','smd'),
+        ('sn','sn'),
+        ('so','so'),
+        ('softtabstop','softtabstop'),
+        ('sol','sol'),
+        ('sp','sp'),
+        ('spc','spc'),
+        ('spell','spell'),
+        ('spellcapcheck','spellcapcheck'),
+        ('spellfile','spellfile'),
+        ('spelllang','spelllang'),
+        ('spellsuggest','spellsuggest'),
+        ('spf','spf'),
+        ('spl','spl'),
+        ('splitbelow','splitbelow'),
+        ('splitright','splitright'),
+        ('spr','spr'),
+        ('sps','sps'),
+        ('sr','sr'),
+        ('srr','srr'),
+        ('ss','ss'),
+        ('ssl','ssl'),
+        ('ssop','ssop'),
+        ('st','st'),
+        ('sta','sta'),
+        ('stal','stal'),
+        ('startofline','startofline'),
+        ('statusline','statusline'),
+        ('stl','stl'),
+        ('stmp','stmp'),
+        ('sts','sts'),
+        ('su','su'),
+        ('sua','sua'),
+        ('suffixes','suffixes'),
+        ('suffixesadd','suffixesadd'),
+        ('sw','sw'),
+        ('swapfile','swapfile'),
+        ('swapsync','swapsync'),
+        ('swb','swb'),
+        ('swf','swf'),
+        ('switchbuf','switchbuf'),
+        ('sws','sws'),
+        ('sxe','sxe'),
+        ('sxq','sxq'),
+        ('syn','syn'),
+        ('synmaxcol','synmaxcol'),
+        ('syntax','syntax'),
+        ('t_AB','t_AB'),
+        ('t_AF','t_AF'),
+        ('t_AL','t_AL'),
+        ('t_CS','t_CS'),
+        ('t_CV','t_CV'),
+        ('t_Ce','t_Ce'),
+        ('t_Co','t_Co'),
+        ('t_Cs','t_Cs'),
+        ('t_DL','t_DL'),
+        ('t_EI','t_EI'),
+        ('t_F1','t_F1'),
+        ('t_F2','t_F2'),
+        ('t_F3','t_F3'),
+        ('t_F4','t_F4'),
+        ('t_F5','t_F5'),
+        ('t_F6','t_F6'),
+        ('t_F7','t_F7'),
+        ('t_F8','t_F8'),
+        ('t_F9','t_F9'),
+        ('t_IE','t_IE'),
+        ('t_IS','t_IS'),
+        ('t_K1','t_K1'),
+        ('t_K3','t_K3'),
+        ('t_K4','t_K4'),
+        ('t_K5','t_K5'),
+        ('t_K6','t_K6'),
+        ('t_K7','t_K7'),
+        ('t_K8','t_K8'),
+        ('t_K9','t_K9'),
+        ('t_KA','t_KA'),
+        ('t_KB','t_KB'),
+        ('t_KC','t_KC'),
+        ('t_KD','t_KD'),
+        ('t_KE','t_KE'),
+        ('t_KF','t_KF'),
+        ('t_KG','t_KG'),
+        ('t_KH','t_KH'),
+        ('t_KI','t_KI'),
+        ('t_KJ','t_KJ'),
+        ('t_KK','t_KK'),
+        ('t_KL','t_KL'),
+        ('t_RI','t_RI'),
+        ('t_RV','t_RV'),
+        ('t_SI','t_SI'),
+        ('t_Sb','t_Sb'),
+        ('t_Sf','t_Sf'),
+        ('t_WP','t_WP'),
+        ('t_WS','t_WS'),
+        ('t_ZH','t_ZH'),
+        ('t_ZR','t_ZR'),
+        ('t_al','t_al'),
+        ('t_bc','t_bc'),
+        ('t_cd','t_cd'),
+        ('t_ce','t_ce'),
+        ('t_cl','t_cl'),
+        ('t_cm','t_cm'),
+        ('t_cs','t_cs'),
+        ('t_da','t_da'),
+        ('t_db','t_db'),
+        ('t_dl','t_dl'),
+        ('t_fs','t_fs'),
+        ('t_k1','t_k1'),
+        ('t_k2','t_k2'),
+        ('t_k3','t_k3'),
+        ('t_k4','t_k4'),
+        ('t_k5','t_k5'),
+        ('t_k6','t_k6'),
+        ('t_k7','t_k7'),
+        ('t_k8','t_k8'),
+        ('t_k9','t_k9'),
+        ('t_kB','t_kB'),
+        ('t_kD','t_kD'),
+        ('t_kI','t_kI'),
+        ('t_kN','t_kN'),
+        ('t_kP','t_kP'),
+        ('t_kb','t_kb'),
+        ('t_kd','t_kd'),
+        ('t_ke','t_ke'),
+        ('t_kh','t_kh'),
+        ('t_kl','t_kl'),
+        ('t_kr','t_kr'),
+        ('t_ks','t_ks'),
+        ('t_ku','t_ku'),
+        ('t_le','t_le'),
+        ('t_mb','t_mb'),
+        ('t_md','t_md'),
+        ('t_me','t_me'),
+        ('t_mr','t_mr'),
+        ('t_ms','t_ms'),
+        ('t_nd','t_nd'),
+        ('t_op','t_op'),
+        ('t_se','t_se'),
+        ('t_so','t_so'),
+        ('t_sr','t_sr'),
+        ('t_te','t_te'),
+        ('t_ti','t_ti'),
+        ('t_ts','t_ts'),
+        ('t_u7','t_u7'),
+        ('t_ue','t_ue'),
+        ('t_us','t_us'),
+        ('t_ut','t_ut'),
+        ('t_vb','t_vb'),
+        ('t_ve','t_ve'),
+        ('t_vi','t_vi'),
+        ('t_vs','t_vs'),
+        ('t_xs','t_xs'),
+        ('ta','ta'),
+        ('tabline','tabline'),
+        ('tabpagemax','tabpagemax'),
+        ('tabstop','tabstop'),
+        ('tag','tag'),
+        ('tagbsearch','tagbsearch'),
+        ('taglength','taglength'),
+        ('tagrelative','tagrelative'),
+        ('tags','tags'),
+        ('tagstack','tagstack'),
+        ('tal','tal'),
+        ('tb','tb'),
+        ('tbi','tbi'),
+        ('tbidi','tbidi'),
+        ('tbis','tbis'),
+        ('tbs','tbs'),
+        ('tenc','tenc'),
+        ('term','term'),
+        ('termbidi','termbidi'),
+        ('termencoding','termencoding'),
+        ('terse','terse'),
+        ('textauto','textauto'),
+        ('textmode','textmode'),
+        ('textwidth','textwidth'),
+        ('tf','tf'),
+        ('tgst','tgst'),
+        ('thesaurus','thesaurus'),
+        ('tildeop','tildeop'),
+        ('timeout','timeout'),
+        ('timeoutlen','timeoutlen'),
+        ('title','title'),
+        ('titlelen','titlelen'),
+        ('titleold','titleold'),
+        ('titlestring','titlestring'),
+        ('tl','tl'),
+        ('tm','tm'),
+        ('to','to'),
+        ('toolbar','toolbar'),
+        ('toolbariconsize','toolbariconsize'),
+        ('top','top'),
+        ('tpm','tpm'),
+        ('tr','tr'),
+        ('ts','ts'),
+        ('tsl','tsl'),
+        ('tsr','tsr'),
+        ('ttimeout','ttimeout'),
+        ('ttimeoutlen','ttimeoutlen'),
+        ('ttm','ttm'),
+        ('tty','tty'),
+        ('ttybuiltin','ttybuiltin'),
+        ('ttyfast','ttyfast'),
+        ('ttym','ttym'),
+        ('ttymouse','ttymouse'),
+        ('ttyscroll','ttyscroll'),
+        ('ttytype','ttytype'),
+        ('tw','tw'),
+        ('tx','tx'),
+        ('uc','uc'),
+        ('udf','udf'),
+        ('udir','udir'),
+        ('ul','ul'),
+        ('undodir','undodir'),
+        ('undofile','undofile'),
+        ('undolevels','undolevels'),
+        ('undoreload','undoreload'),
+        ('updatecount','updatecount'),
+        ('updatetime','updatetime'),
+        ('ur','ur'),
+        ('ut','ut'),
+        ('vb','vb'),
+        ('vbs','vbs'),
+        ('vdir','vdir'),
+        ('ve','ve'),
+        ('verbose','verbose'),
+        ('verbosefile','verbosefile'),
+        ('vfile','vfile'),
+        ('vi','vi'),
+        ('viewdir','viewdir'),
+        ('viewoptions','viewoptions'),
+        ('viminfo','viminfo'),
+        ('virtualedit','virtualedit'),
+        ('visualbell','visualbell'),
+        ('vnoremap','vnoremap'),
+        ('vop','vop'),
+        ('wa','wa'),
+        ('wak','wak'),
+        ('warn','warn'),
+        ('wb','wb'),
+        ('wc','wc'),
+        ('wcm','wcm'),
+        ('wd','wd'),
+        ('weirdinvert','weirdinvert'),
+        ('wfh','wfh'),
+        ('wfw','wfw'),
+        ('wh','wh'),
+        ('whichwrap','whichwrap'),
+        ('wi','wi'),
+        ('wic','wic'),
+        ('wig','wig'),
+        ('wildchar','wildchar'),
+        ('wildcharm','wildcharm'),
+        ('wildignore','wildignore'),
+        ('wildignorecase','wildignorecase'),
+        ('wildmenu','wildmenu'),
+        ('wildmode','wildmode'),
+        ('wildoptions','wildoptions'),
+        ('wim','wim'),
+        ('winaltkeys','winaltkeys'),
+        ('window','window'),
+        ('winfixheight','winfixheight'),
+        ('winfixwidth','winfixwidth'),
+        ('winheight','winheight'),
+        ('winminheight','winminheight'),
+        ('winminwidth','winminwidth'),
+        ('winwidth','winwidth'),
+        ('wiv','wiv'),
+        ('wiw','wiw'),
+        ('wm','wm'),
+        ('wmh','wmh'),
+        ('wmnu','wmnu'),
+        ('wmw','wmw'),
+        ('wop','wop'),
+        ('wrap','wrap'),
+        ('wrapmargin','wrapmargin'),
+        ('wrapscan','wrapscan'),
+        ('write','write'),
+        ('writeany','writeany'),
+        ('writebackup','writebackup'),
+        ('writedelay','writedelay'),
+        ('ws','ws'),
+        ('ww','ww'),
+    )
+    return var
+option = _getoption()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/trafficscript.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/trafficscript.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/trafficscript.py	(revision 1126)
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.trafficscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for RiverBed's TrafficScript (RTS) language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer
+from pygments.token import String, Number, Name, Keyword, Operator, Text, Comment
+
+__all__ = ['RtsLexer']
+
+
+class RtsLexer(RegexLexer):
+    """
+    For `Riverbed Stingray Traffic Manager <http://www.riverbed.com/stingray>`_
+
+    .. versionadded:: 2.1
+    """
+    name = 'TrafficScript'
+    aliases = ['rts','trafficscript']
+    filenames = ['*.rts']
+
+    tokens = {
+        'root' : [
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"', String, 'escapable-string'),
+            (r'(0x[0-9a-fA-F]+|\d+)', Number),
+            (r'\d+\.\d+', Number.Float),
+            (r'\$[a-zA-Z](\w|_)*', Name.Variable),
+            (r'(if|else|for(each)?|in|while|do|break|sub|return|import)', Keyword),
+            (r'[a-zA-Z][\w.]*', Name.Function),
+            (r'[-+*/%=,;(){}<>^.!~|&\[\]\?\:]', Operator),
+            (r'(>=|<=|==|!=|'
+             r'&&|\|\||'
+             r'\+=|.=|-=|\*=|/=|%=|<<=|>>=|&=|\|=|\^=|'
+             r'>>|<<|'
+             r'\+\+|--|=>)', Operator),
+            (r'[ \t\r]+', Text),
+            (r'#[^\n]*', Comment),
+        ],
+        'escapable-string' : [
+            (r'\\[tsn]', String.Escape),
+            (r'[^"]', String),
+            (r'"', String, '#pop'),
+        ],
+
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/capnproto.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/capnproto.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/capnproto.py	(revision 1126)
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.capnproto
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Cap'n Proto schema language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, default
+from pygments.token import Text, Comment, Keyword, Name, Literal
+
+__all__ = ['CapnProtoLexer']
+
+
+class CapnProtoLexer(RegexLexer):
+    """
+    For `Cap'n Proto <https://capnproto.org>`_ source.
+
+    .. versionadded:: 2.2
+    """
+    name = 'Cap\'n Proto'
+    filenames = ['*.capnp']
+    aliases = ['capnp']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment.Single),
+            (r'@[0-9a-zA-Z]*', Name.Decorator),
+            (r'=', Literal, 'expression'),
+            (r':', Name.Class, 'type'),
+            (r'\$', Name.Attribute, 'annotation'),
+            (r'(struct|enum|interface|union|import|using|const|annotation|'
+             r'extends|in|of|on|as|with|from|fixed)\b',
+             Keyword),
+            (r'[\w.]+', Name),
+            (r'[^#@=:$\w]+', Text),
+        ],
+        'type': [
+            (r'[^][=;,(){}$]+', Name.Class),
+            (r'[[(]', Name.Class, 'parentype'),
+            default('#pop'),
+        ],
+        'parentype': [
+            (r'[^][;()]+', Name.Class),
+            (r'[[(]', Name.Class, '#push'),
+            (r'[])]', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'expression': [
+            (r'[^][;,(){}$]+', Literal),
+            (r'[[(]', Literal, 'parenexp'),
+            default('#pop'),
+        ],
+        'parenexp': [
+            (r'[^][;()]+', Literal),
+            (r'[[(]', Literal, '#push'),
+            (r'[])]', Literal, '#pop'),
+            default('#pop'),
+        ],
+        'annotation': [
+            (r'[^][;,(){}=:]+', Name.Attribute),
+            (r'[[(]', Name.Attribute, 'annexp'),
+            default('#pop'),
+        ],
+        'annexp': [
+            (r'[^][;()]+', Name.Attribute),
+            (r'[[(]', Name.Attribute, '#push'),
+            (r'[])]', Name.Attribute, '#pop'),
+            default('#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/praat.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/praat.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/praat.py	(revision 1126)
@@ -0,0 +1,294 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.praat
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Praat
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups, include
+from pygments.token import Name, Text, Comment, Keyword, String, Punctuation, Number, \
+    Operator
+
+__all__ = ['PraatLexer']
+
+
+class PraatLexer(RegexLexer):
+    """
+    For `Praat <http://www.praat.org>`_ scripts.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Praat'
+    aliases = ['praat']
+    filenames = ['*.praat', '*.proc', '*.psc']
+
+    keywords = (
+        'if', 'then', 'else', 'elsif', 'elif', 'endif', 'fi', 'for', 'from', 'to',
+        'endfor', 'endproc', 'while', 'endwhile', 'repeat', 'until', 'select', 'plus',
+        'minus', 'demo', 'assert', 'stopwatch', 'nocheck', 'nowarn', 'noprogress',
+        'editor', 'endeditor', 'clearinfo',
+    )
+
+    functions_string = (
+        'backslashTrigraphsToUnicode', 'chooseDirectory', 'chooseReadFile',
+        'chooseWriteFile', 'date', 'demoKey', 'do', 'environment', 'extractLine',
+        'extractWord', 'fixed', 'info', 'left', 'mid', 'percent', 'readFile', 'replace',
+        'replace_regex', 'right', 'selected', 'string', 'unicodeToBackslashTrigraphs',
+    )
+
+    functions_numeric = (
+        'abs', 'appendFile', 'appendFileLine', 'appendInfo', 'appendInfoLine', 'arccos',
+        'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctan2', 'arctanh', 'barkToHertz',
+        'beginPause', 'beginSendPraat', 'besselI', 'besselK', 'beta', 'beta2',
+        'binomialP', 'binomialQ', 'boolean', 'ceiling', 'chiSquareP', 'chiSquareQ',
+        'choice', 'comment', 'cos', 'cosh', 'createDirectory', 'deleteFile',
+        'demoClicked', 'demoClickedIn', 'demoCommandKeyPressed',
+        'demoExtraControlKeyPressed', 'demoInput', 'demoKeyPressed',
+        'demoOptionKeyPressed', 'demoShiftKeyPressed', 'demoShow', 'demoWaitForInput',
+        'demoWindowTitle', 'demoX', 'demoY', 'differenceLimensToPhon', 'do', 'editor',
+        'endPause', 'endSendPraat', 'endsWith', 'erb', 'erbToHertz', 'erf', 'erfc',
+        'exitScript', 'exp', 'extractNumber', 'fileReadable', 'fisherP', 'fisherQ',
+        'floor', 'gaussP', 'gaussQ', 'hertzToBark', 'hertzToErb', 'hertzToMel',
+        'hertzToSemitones', 'imax', 'imin', 'incompleteBeta', 'incompleteGammaP', 'index',
+        'index_regex', 'invBinomialP', 'invBinomialQ', 'invChiSquareQ', 'invFisherQ',
+        'invGaussQ', 'invSigmoid', 'invStudentQ', 'length', 'ln', 'lnBeta', 'lnGamma',
+        'log10', 'log2', 'max', 'melToHertz', 'min', 'minusObject', 'natural', 'number',
+        'numberOfColumns', 'numberOfRows', 'numberOfSelected', 'objectsAreIdentical',
+        'option', 'optionMenu', 'pauseScript', 'phonToDifferenceLimens', 'plusObject',
+        'positive', 'randomBinomial', 'randomGauss', 'randomInteger', 'randomPoisson',
+        'randomUniform', 'real', 'readFile', 'removeObject', 'rindex', 'rindex_regex',
+        'round', 'runScript', 'runSystem', 'runSystem_nocheck', 'selectObject',
+        'selected', 'semitonesToHertz', 'sentencetext', 'sigmoid', 'sin', 'sinc',
+        'sincpi', 'sinh', 'soundPressureToPhon', 'sqrt', 'startsWith', 'studentP',
+        'studentQ', 'tan', 'tanh', 'variableExists', 'word', 'writeFile', 'writeFileLine',
+        'writeInfo', 'writeInfoLine',
+    )
+
+    functions_array = (
+        'linear', 'randomGauss', 'randomInteger', 'randomUniform', 'zero',
+    )
+
+    objects = (
+        'Activation', 'AffineTransform', 'AmplitudeTier', 'Art', 'Artword',
+        'Autosegment', 'BarkFilter', 'BarkSpectrogram', 'CCA', 'Categories',
+        'Cepstrogram', 'Cepstrum', 'Cepstrumc', 'ChebyshevSeries', 'ClassificationTable',
+        'Cochleagram', 'Collection', 'ComplexSpectrogram', 'Configuration', 'Confusion',
+        'ContingencyTable', 'Corpus', 'Correlation', 'Covariance',
+        'CrossCorrelationTable', 'CrossCorrelationTables', 'DTW', 'DataModeler',
+        'Diagonalizer', 'Discriminant', 'Dissimilarity', 'Distance', 'Distributions',
+        'DurationTier', 'EEG', 'ERP', 'ERPTier', 'EditCostsTable', 'EditDistanceTable',
+        'Eigen', 'Excitation', 'Excitations', 'ExperimentMFC', 'FFNet', 'FeatureWeights',
+        'FileInMemory', 'FilesInMemory', 'Formant', 'FormantFilter', 'FormantGrid',
+        'FormantModeler', 'FormantPoint', 'FormantTier', 'GaussianMixture', 'HMM',
+        'HMM_Observation', 'HMM_ObservationSequence', 'HMM_State', 'HMM_StateSequence',
+        'Harmonicity', 'ISpline', 'Index', 'Intensity', 'IntensityTier', 'IntervalTier',
+        'KNN', 'KlattGrid', 'KlattTable', 'LFCC', 'LPC', 'Label', 'LegendreSeries',
+        'LinearRegression', 'LogisticRegression', 'LongSound', 'Ltas', 'MFCC', 'MSpline',
+        'ManPages', 'Manipulation', 'Matrix', 'MelFilter', 'MelSpectrogram',
+        'MixingMatrix', 'Movie', 'Network', 'OTGrammar', 'OTHistory', 'OTMulti', 'PCA',
+        'PairDistribution', 'ParamCurve', 'Pattern', 'Permutation', 'Photo', 'Pitch',
+        'PitchModeler', 'PitchTier', 'PointProcess', 'Polygon', 'Polynomial',
+        'PowerCepstrogram', 'PowerCepstrum', 'Procrustes', 'RealPoint', 'RealTier',
+        'ResultsMFC', 'Roots', 'SPINET', 'SSCP', 'SVD', 'Salience', 'ScalarProduct',
+        'Similarity', 'SimpleString', 'SortedSetOfString', 'Sound', 'Speaker',
+        'Spectrogram', 'Spectrum', 'SpectrumTier', 'SpeechSynthesizer', 'SpellingChecker',
+        'Strings', 'StringsIndex', 'Table', 'TableOfReal', 'TextGrid', 'TextInterval',
+        'TextPoint', 'TextTier', 'Tier', 'Transition', 'VocalTract', 'VocalTractTier',
+        'Weight', 'WordList',
+    )
+
+    variables_numeric = (
+        'macintosh', 'windows', 'unix', 'praatVersion', 'pi', 'e', 'undefined',
+    )
+
+    variables_string = (
+        'praatVersion', 'tab', 'shellDirectory', 'homeDirectory',
+        'preferencesDirectory', 'newline', 'temporaryDirectory',
+        'defaultDirectory',
+    )
+
+    tokens = {
+        'root': [
+            (r'(\s+)(#.*?$)',  bygroups(Text, Comment.Single)),
+            (r'^#.*?$',        Comment.Single),
+            (r';[^\n]*',       Comment.Single),
+            (r'\s+',           Text),
+
+            (r'\bprocedure\b', Keyword,       'procedure_definition'),
+            (r'\bcall\b',      Keyword,       'procedure_call'),
+            (r'@',             Name.Function, 'procedure_call'),
+
+            include('function_call'),
+
+            (words(keywords, suffix=r'\b'), Keyword),
+
+            (r'(\bform\b)(\s+)([^\n]+)',
+             bygroups(Keyword, Text, String), 'old_form'),
+
+            (r'(print(?:line|tab)?|echo|exit|asserterror|pause|send(?:praat|socket)|'
+             r'include|execute|system(?:_nocheck)?)(\s+)',
+             bygroups(Keyword, Text), 'string_unquoted'),
+
+            (r'(goto|label)(\s+)(\w+)', bygroups(Keyword, Text, Name.Label)),
+
+            include('variable_name'),
+            include('number'),
+
+            (r'"', String, 'string'),
+
+            (words((objects), suffix=r'(?=\s+\S+\n)'), Name.Class, 'string_unquoted'),
+
+            (r'\b[A-Z]', Keyword, 'command'),
+            (r'(\.{3}|[)(,])', Punctuation),
+        ],
+        'command': [
+            (r'( ?[\w()-]+ ?)', Keyword),
+            (r"'(?=.*')", String.Interpol, 'string_interpolated'),
+            (r'\.{3}', Keyword, ('#pop', 'old_arguments')),
+            (r':', Keyword, ('#pop', 'comma_list')),
+            (r'\s', Text, '#pop'),
+        ],
+        'procedure_call': [
+            (r'\s+', Text),
+            (r'([\w.]+)(:|\s*\()',
+             bygroups(Name.Function, Text), '#pop'),
+            (r'([\w.]+)', Name.Function, ('#pop', 'old_arguments')),
+        ],
+        'procedure_definition': [
+            (r'\s', Text),
+            (r'([\w.]+)(\s*?[(:])',
+             bygroups(Name.Function, Text), '#pop'),
+            (r'([\w.]+)([^\n]*)',
+             bygroups(Name.Function, Text), '#pop'),
+        ],
+        'function_call': [
+            (words(functions_string, suffix=r'\$(?=\s*[:(])'), Name.Function, 'function'),
+            (words(functions_array, suffix=r'#(?=\s*[:(])'),   Name.Function, 'function'),
+            (words(functions_numeric, suffix=r'(?=\s*[:(])'),  Name.Function, 'function'),
+        ],
+        'function': [
+            (r'\s+',   Text),
+            (r':',     Punctuation, ('#pop', 'comma_list')),
+            (r'\s*\(', Punctuation, ('#pop', 'comma_list')),
+        ],
+        'comma_list': [
+            (r'(\s*\n\s*)(\.{3})', bygroups(Text, Punctuation)),
+
+            (r'(\s*[])\n])', Text, '#pop'),
+
+            (r'\s+', Text),
+            (r'"',   String, 'string'),
+            (r'\b(if|then|else|fi|endif)\b', Keyword),
+
+            include('function_call'),
+            include('variable_name'),
+            include('operator'),
+            include('number'),
+
+            (r'[()]', Text),
+            (r',', Punctuation),
+        ],
+        'old_arguments': [
+            (r'\n', Text, '#pop'),
+
+            include('variable_name'),
+            include('operator'),
+            include('number'),
+
+            (r'"', String, 'string'),
+            (r'[^\n]', Text),
+        ],
+        'number': [
+            (r'\n', Text, '#pop'),
+            (r'\b\d+(\.\d*)?([eE][-+]?\d+)?%?', Number),
+        ],
+        'object_attributes': [
+            (r'\.?(n(col|row)|[xy]min|[xy]max|[nd][xy])\b', Name.Builtin, '#pop'),
+            (r'(\.?(?:col|row)\$)(\[)',
+             bygroups(Name.Builtin, Text), 'variable_name'),
+            (r'(\$?)(\[)',
+             bygroups(Name.Builtin, Text), ('#pop', 'comma_list')),
+        ],
+        'variable_name': [
+            include('operator'),
+            include('number'),
+
+            (words(variables_string,  suffix=r'\$'), Name.Variable.Global),
+            (words(variables_numeric, suffix=r'\b'), Name.Variable.Global),
+
+            (r'\bObject_\w+', Name.Builtin, 'object_attributes'),
+            (words(objects, prefix=r'\b', suffix=r'_\w+'),
+             Name.Builtin, 'object_attributes'),
+
+            (r"\b(Object_)(')",
+             bygroups(Name.Builtin, String.Interpol),
+             ('object_attributes', 'string_interpolated')),
+            (words(objects, prefix=r'\b', suffix=r"(_)(')"),
+             bygroups(Name.Builtin, Name.Builtin, String.Interpol),
+             ('object_attributes', 'string_interpolated')),
+
+            (r'\.?_?[a-z][\w.]*(\$|#)?', Text),
+            (r'[\[\]]', Punctuation, 'comma_list'),
+            (r"'(?=.*')", String.Interpol, 'string_interpolated'),
+        ],
+        'operator': [
+            (r'([+\/*<>=!-]=?|[&*|][&*|]?|\^|<>)',       Operator),
+            (r'(?<![\w.])(and|or|not|div|mod)(?![\w.])', Operator.Word),
+        ],
+        'string_interpolated': [
+            (r'\.?[_a-z][\w.]*[$#]?(?:\[[a-zA-Z0-9,]+\])?(:[0-9]+)?',
+             String.Interpol),
+            (r"'",          String.Interpol, '#pop'),
+        ],
+        'string_unquoted': [
+            (r'(\n\s*)(\.{3})', bygroups(Text, Punctuation)),
+
+            (r'\n',       Text,            '#pop'),
+            (r'\s',       Text),
+            (r"'(?=.*')", String.Interpol, 'string_interpolated'),
+            (r"'",        String),
+            (r"[^'\n]+",  String),
+        ],
+        'string': [
+            (r'(\n\s*)(\.{3})', bygroups(Text, Punctuation)),
+
+            (r'"',          String,          '#pop'),
+            (r"'(?=.*')",   String.Interpol, 'string_interpolated'),
+            (r"'",          String),
+            (r'[^\'"\n]+',  String),
+        ],
+        'old_form': [
+            (r'\s+', Text),
+
+            (r'(optionmenu|choice)([ \t]+\S+:[ \t]+)',
+             bygroups(Keyword, Text), 'number'),
+
+            (r'(option|button)([ \t]+)',
+             bygroups(Keyword, Text), 'string_unquoted'),
+
+            (r'(sentence|text)([ \t]+\S+)',
+             bygroups(Keyword, Text), 'string_unquoted'),
+
+            (r'(word)([ \t]+\S+[ \t]*)(\S+)?([ \t]+.*)?',
+             bygroups(Keyword, Text, String, Text)),
+
+            (r'(boolean)(\s+\S+\s*)(0|1|"?(?:yes|no)"?)',
+             bygroups(Keyword, Text, Name.Variable)),
+
+            # Ideally processing of the number would happend in the 'number'
+            # but that doesn't seem to work
+            (r'(real|natural|positive|integer)([ \t]+\S+[ \t]*)([+-]?)(\d+(?:\.\d*)?'
+             r'(?:[eE][-+]?\d+)?%?)',
+             bygroups(Keyword, Text, Operator, Number)),
+
+            (r'(comment)(\s+)',
+             bygroups(Keyword, Text), 'string_unquoted'),
+
+            (r'\bendform\b', Keyword, '#pop'),
+        ]
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_sourcemod_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_sourcemod_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_sourcemod_builtins.py	(revision 1126)
@@ -0,0 +1,1163 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._sourcemod_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the names of SourceMod functions.
+    It is able to re-generate itself.
+
+    Do not edit the FUNCTIONS list by hand.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+FUNCTIONS = (
+    'OnEntityCreated',
+    'OnEntityDestroyed',
+    'OnGetGameDescription',
+    'OnLevelInit',
+    'SDKHook',
+    'SDKHookEx',
+    'SDKUnhook',
+    'SDKHooks_TakeDamage',
+    'SDKHooks_DropWeapon',
+    'TopMenuHandler',
+    'CreateTopMenu',
+    'LoadTopMenuConfig',
+    'AddToTopMenu',
+    'GetTopMenuInfoString',
+    'GetTopMenuObjName',
+    'RemoveFromTopMenu',
+    'DisplayTopMenu',
+    'DisplayTopMenuCategory',
+    'FindTopMenuCategory',
+    'SetTopMenuTitleCaching',
+    'OnAdminMenuCreated',
+    'OnAdminMenuReady',
+    'GetAdminTopMenu',
+    'AddTargetsToMenu',
+    'AddTargetsToMenu2',
+    'RedisplayAdminMenu',
+    'TEHook',
+    'AddTempEntHook',
+    'RemoveTempEntHook',
+    'TE_Start',
+    'TE_IsValidProp',
+    'TE_WriteNum',
+    'TE_ReadNum',
+    'TE_WriteFloat',
+    'TE_ReadFloat',
+    'TE_WriteVector',
+    'TE_ReadVector',
+    'TE_WriteAngles',
+    'TE_WriteFloatArray',
+    'TE_Send',
+    'TE_WriteEncodedEnt',
+    'TE_SendToAll',
+    'TE_SendToClient',
+    'CreateKeyValues',
+    'KvSetString',
+    'KvSetNum',
+    'KvSetUInt64',
+    'KvSetFloat',
+    'KvSetColor',
+    'KvSetVector',
+    'KvGetString',
+    'KvGetNum',
+    'KvGetFloat',
+    'KvGetColor',
+    'KvGetUInt64',
+    'KvGetVector',
+    'KvJumpToKey',
+    'KvJumpToKeySymbol',
+    'KvGotoFirstSubKey',
+    'KvGotoNextKey',
+    'KvSavePosition',
+    'KvDeleteKey',
+    'KvDeleteThis',
+    'KvGoBack',
+    'KvRewind',
+    'KvGetSectionName',
+    'KvSetSectionName',
+    'KvGetDataType',
+    'KeyValuesToFile',
+    'FileToKeyValues',
+    'StringToKeyValues',
+    'KvSetEscapeSequences',
+    'KvNodesInStack',
+    'KvCopySubkeys',
+    'KvFindKeyById',
+    'KvGetNameSymbol',
+    'KvGetSectionSymbol',
+    'TE_SetupSparks',
+    'TE_SetupSmoke',
+    'TE_SetupDust',
+    'TE_SetupMuzzleFlash',
+    'TE_SetupMetalSparks',
+    'TE_SetupEnergySplash',
+    'TE_SetupArmorRicochet',
+    'TE_SetupGlowSprite',
+    'TE_SetupExplosion',
+    'TE_SetupBloodSprite',
+    'TE_SetupBeamRingPoint',
+    'TE_SetupBeamPoints',
+    'TE_SetupBeamLaser',
+    'TE_SetupBeamRing',
+    'TE_SetupBeamFollow',
+    'HookEvent',
+    'HookEventEx',
+    'UnhookEvent',
+    'CreateEvent',
+    'FireEvent',
+    'CancelCreatedEvent',
+    'GetEventBool',
+    'SetEventBool',
+    'GetEventInt',
+    'SetEventInt',
+    'GetEventFloat',
+    'SetEventFloat',
+    'GetEventString',
+    'SetEventString',
+    'GetEventName',
+    'SetEventBroadcast',
+    'GetUserMessageType',
+    'GetUserMessageId',
+    'GetUserMessageName',
+    'StartMessage',
+    'StartMessageEx',
+    'EndMessage',
+    'MsgHook',
+    'MsgPostHook',
+    'HookUserMessage',
+    'UnhookUserMessage',
+    'StartMessageAll',
+    'StartMessageOne',
+    'InactivateClient',
+    'ReconnectClient',
+    'GetMaxEntities',
+    'GetEntityCount',
+    'IsValidEntity',
+    'IsValidEdict',
+    'IsEntNetworkable',
+    'CreateEdict',
+    'RemoveEdict',
+    'GetEdictFlags',
+    'SetEdictFlags',
+    'GetEdictClassname',
+    'GetEntityNetClass',
+    'ChangeEdictState',
+    'GetEntData',
+    'SetEntData',
+    'GetEntDataFloat',
+    'SetEntDataFloat',
+    'GetEntDataEnt2',
+    'SetEntDataEnt2',
+    'GetEntDataVector',
+    'SetEntDataVector',
+    'GetEntDataString',
+    'SetEntDataString',
+    'FindSendPropOffs',
+    'FindSendPropInfo',
+    'FindDataMapOffs',
+    'FindDataMapInfo',
+    'GetEntSendPropOffs',
+    'GetEntProp',
+    'SetEntProp',
+    'GetEntPropFloat',
+    'SetEntPropFloat',
+    'GetEntPropEnt',
+    'SetEntPropEnt',
+    'GetEntPropVector',
+    'SetEntPropVector',
+    'GetEntPropString',
+    'SetEntPropString',
+    'GetEntPropArraySize',
+    'GetEntDataArray',
+    'SetEntDataArray',
+    'GetEntityAddress',
+    'GetEntityClassname',
+    'float',
+    'FloatMul',
+    'FloatDiv',
+    'FloatAdd',
+    'FloatSub',
+    'FloatFraction',
+    'RoundToZero',
+    'RoundToCeil',
+    'RoundToFloor',
+    'RoundToNearest',
+    'FloatCompare',
+    'SquareRoot',
+    'Pow',
+    'Exponential',
+    'Logarithm',
+    'Sine',
+    'Cosine',
+    'Tangent',
+    'FloatAbs',
+    'ArcTangent',
+    'ArcCosine',
+    'ArcSine',
+    'ArcTangent2',
+    'RoundFloat',
+    'operator%',
+    'DegToRad',
+    'RadToDeg',
+    'GetURandomInt',
+    'GetURandomFloat',
+    'SetURandomSeed',
+    'SetURandomSeedSimple',
+    'RemovePlayerItem',
+    'GivePlayerItem',
+    'GetPlayerWeaponSlot',
+    'IgniteEntity',
+    'ExtinguishEntity',
+    'TeleportEntity',
+    'ForcePlayerSuicide',
+    'SlapPlayer',
+    'FindEntityByClassname',
+    'GetClientEyeAngles',
+    'CreateEntityByName',
+    'DispatchSpawn',
+    'DispatchKeyValue',
+    'DispatchKeyValueFloat',
+    'DispatchKeyValueVector',
+    'GetClientAimTarget',
+    'GetTeamCount',
+    'GetTeamName',
+    'GetTeamScore',
+    'SetTeamScore',
+    'GetTeamClientCount',
+    'SetEntityModel',
+    'GetPlayerDecalFile',
+    'GetPlayerJingleFile',
+    'GetServerNetStats',
+    'EquipPlayerWeapon',
+    'ActivateEntity',
+    'SetClientInfo',
+    'GivePlayerAmmo',
+    'SetClientListeningFlags',
+    'GetClientListeningFlags',
+    'SetListenOverride',
+    'GetListenOverride',
+    'IsClientMuted',
+    'TR_GetPointContents',
+    'TR_GetPointContentsEnt',
+    'TR_TraceRay',
+    'TR_TraceHull',
+    'TR_TraceRayFilter',
+    'TR_TraceHullFilter',
+    'TR_TraceRayEx',
+    'TR_TraceHullEx',
+    'TR_TraceRayFilterEx',
+    'TR_TraceHullFilterEx',
+    'TR_GetFraction',
+    'TR_GetEndPosition',
+    'TR_GetEntityIndex',
+    'TR_DidHit',
+    'TR_GetHitGroup',
+    'TR_GetPlaneNormal',
+    'TR_PointOutsideWorld',
+    'SortIntegers',
+    'SortFloats',
+    'SortStrings',
+    'SortFunc1D',
+    'SortCustom1D',
+    'SortCustom2D',
+    'SortADTArray',
+    'SortFuncADTArray',
+    'SortADTArrayCustom',
+    'CompileRegex',
+    'MatchRegex',
+    'GetRegexSubString',
+    'SimpleRegexMatch',
+    'TF2_GetPlayerClass',
+    'TF2_SetPlayerClass',
+    'TF2_RemoveWeaponSlot',
+    'TF2_RemoveAllWeapons',
+    'TF2_IsPlayerInCondition',
+    'TF2_GetObjectType',
+    'TF2_GetObjectMode',
+    'NominateMap',
+    'RemoveNominationByMap',
+    'RemoveNominationByOwner',
+    'GetExcludeMapList',
+    'GetNominatedMapList',
+    'CanMapChooserStartVote',
+    'InitiateMapChooserVote',
+    'HasEndOfMapVoteFinished',
+    'EndOfMapVoteEnabled',
+    'OnNominationRemoved',
+    'OnMapVoteStarted',
+    'CreateTimer',
+    'KillTimer',
+    'TriggerTimer',
+    'GetTickedTime',
+    'GetMapTimeLeft',
+    'GetMapTimeLimit',
+    'ExtendMapTimeLimit',
+    'GetTickInterval',
+    'OnMapTimeLeftChanged',
+    'IsServerProcessing',
+    'CreateDataTimer',
+    'ByteCountToCells',
+    'CreateArray',
+    'ClearArray',
+    'CloneArray',
+    'ResizeArray',
+    'GetArraySize',
+    'PushArrayCell',
+    'PushArrayString',
+    'PushArrayArray',
+    'GetArrayCell',
+    'GetArrayString',
+    'GetArrayArray',
+    'SetArrayCell',
+    'SetArrayString',
+    'SetArrayArray',
+    'ShiftArrayUp',
+    'RemoveFromArray',
+    'SwapArrayItems',
+    'FindStringInArray',
+    'FindValueInArray',
+    'ProcessTargetString',
+    'ReplyToTargetError',
+    'MultiTargetFilter',
+    'AddMultiTargetFilter',
+    'RemoveMultiTargetFilter',
+    'OnBanClient',
+    'OnBanIdentity',
+    'OnRemoveBan',
+    'BanClient',
+    'BanIdentity',
+    'RemoveBan',
+    'CreateTrie',
+    'SetTrieValue',
+    'SetTrieArray',
+    'SetTrieString',
+    'GetTrieValue',
+    'GetTrieArray',
+    'GetTrieString',
+    'RemoveFromTrie',
+    'ClearTrie',
+    'GetTrieSize',
+    'GetFunctionByName',
+    'CreateGlobalForward',
+    'CreateForward',
+    'GetForwardFunctionCount',
+    'AddToForward',
+    'RemoveFromForward',
+    'RemoveAllFromForward',
+    'Call_StartForward',
+    'Call_StartFunction',
+    'Call_PushCell',
+    'Call_PushCellRef',
+    'Call_PushFloat',
+    'Call_PushFloatRef',
+    'Call_PushArray',
+    'Call_PushArrayEx',
+    'Call_PushString',
+    'Call_PushStringEx',
+    'Call_Finish',
+    'Call_Cancel',
+    'NativeCall',
+    'CreateNative',
+    'ThrowNativeError',
+    'GetNativeStringLength',
+    'GetNativeString',
+    'SetNativeString',
+    'GetNativeCell',
+    'GetNativeCellRef',
+    'SetNativeCellRef',
+    'GetNativeArray',
+    'SetNativeArray',
+    'FormatNativeString',
+    'RequestFrameCallback',
+    'RequestFrame',
+    'OnRebuildAdminCache',
+    'DumpAdminCache',
+    'AddCommandOverride',
+    'GetCommandOverride',
+    'UnsetCommandOverride',
+    'CreateAdmGroup',
+    'FindAdmGroup',
+    'SetAdmGroupAddFlag',
+    'GetAdmGroupAddFlag',
+    'GetAdmGroupAddFlags',
+    'SetAdmGroupImmuneFrom',
+    'GetAdmGroupImmuneCount',
+    'GetAdmGroupImmuneFrom',
+    'AddAdmGroupCmdOverride',
+    'GetAdmGroupCmdOverride',
+    'RegisterAuthIdentType',
+    'CreateAdmin',
+    'GetAdminUsername',
+    'BindAdminIdentity',
+    'SetAdminFlag',
+    'GetAdminFlag',
+    'GetAdminFlags',
+    'AdminInheritGroup',
+    'GetAdminGroupCount',
+    'GetAdminGroup',
+    'SetAdminPassword',
+    'GetAdminPassword',
+    'FindAdminByIdentity',
+    'RemoveAdmin',
+    'FlagBitsToBitArray',
+    'FlagBitArrayToBits',
+    'FlagArrayToBits',
+    'FlagBitsToArray',
+    'FindFlagByName',
+    'FindFlagByChar',
+    'FindFlagChar',
+    'ReadFlagString',
+    'CanAdminTarget',
+    'CreateAuthMethod',
+    'SetAdmGroupImmunityLevel',
+    'GetAdmGroupImmunityLevel',
+    'SetAdminImmunityLevel',
+    'GetAdminImmunityLevel',
+    'FlagToBit',
+    'BitToFlag',
+    'ServerCommand',
+    'ServerCommandEx',
+    'InsertServerCommand',
+    'ServerExecute',
+    'ClientCommand',
+    'FakeClientCommand',
+    'FakeClientCommandEx',
+    'PrintToServer',
+    'PrintToConsole',
+    'ReplyToCommand',
+    'GetCmdReplySource',
+    'SetCmdReplySource',
+    'IsChatTrigger',
+    'ShowActivity2',
+    'ShowActivity',
+    'ShowActivityEx',
+    'FormatActivitySource',
+    'SrvCmd',
+    'RegServerCmd',
+    'ConCmd',
+    'RegConsoleCmd',
+    'RegAdminCmd',
+    'GetCmdArgs',
+    'GetCmdArg',
+    'GetCmdArgString',
+    'CreateConVar',
+    'FindConVar',
+    'ConVarChanged',
+    'HookConVarChange',
+    'UnhookConVarChange',
+    'GetConVarBool',
+    'SetConVarBool',
+    'GetConVarInt',
+    'SetConVarInt',
+    'GetConVarFloat',
+    'SetConVarFloat',
+    'GetConVarString',
+    'SetConVarString',
+    'ResetConVar',
+    'GetConVarDefault',
+    'GetConVarFlags',
+    'SetConVarFlags',
+    'GetConVarBounds',
+    'SetConVarBounds',
+    'GetConVarName',
+    'QueryClientConVar',
+    'GetCommandIterator',
+    'ReadCommandIterator',
+    'CheckCommandAccess',
+    'CheckAccess',
+    'IsValidConVarChar',
+    'GetCommandFlags',
+    'SetCommandFlags',
+    'FindFirstConCommand',
+    'FindNextConCommand',
+    'SendConVarValue',
+    'AddServerTag',
+    'RemoveServerTag',
+    'CommandListener',
+    'AddCommandListener',
+    'RemoveCommandListener',
+    'CommandExists',
+    'OnClientSayCommand',
+    'OnClientSayCommand_Post',
+    'TF2_IgnitePlayer',
+    'TF2_RespawnPlayer',
+    'TF2_RegeneratePlayer',
+    'TF2_AddCondition',
+    'TF2_RemoveCondition',
+    'TF2_SetPlayerPowerPlay',
+    'TF2_DisguisePlayer',
+    'TF2_RemovePlayerDisguise',
+    'TF2_StunPlayer',
+    'TF2_MakeBleed',
+    'TF2_GetClass',
+    'TF2_CalcIsAttackCritical',
+    'TF2_OnIsHolidayActive',
+    'TF2_IsHolidayActive',
+    'TF2_IsPlayerInDuel',
+    'TF2_RemoveWearable',
+    'TF2_OnConditionAdded',
+    'TF2_OnConditionRemoved',
+    'TF2_OnWaitingForPlayersStart',
+    'TF2_OnWaitingForPlayersEnd',
+    'TF2_OnPlayerTeleport',
+    'SQL_Connect',
+    'SQL_DefConnect',
+    'SQL_ConnectCustom',
+    'SQLite_UseDatabase',
+    'SQL_CheckConfig',
+    'SQL_GetDriver',
+    'SQL_ReadDriver',
+    'SQL_GetDriverIdent',
+    'SQL_GetDriverProduct',
+    'SQL_SetCharset',
+    'SQL_GetAffectedRows',
+    'SQL_GetInsertId',
+    'SQL_GetError',
+    'SQL_EscapeString',
+    'SQL_QuoteString',
+    'SQL_FastQuery',
+    'SQL_Query',
+    'SQL_PrepareQuery',
+    'SQL_FetchMoreResults',
+    'SQL_HasResultSet',
+    'SQL_GetRowCount',
+    'SQL_GetFieldCount',
+    'SQL_FieldNumToName',
+    'SQL_FieldNameToNum',
+    'SQL_FetchRow',
+    'SQL_MoreRows',
+    'SQL_Rewind',
+    'SQL_FetchString',
+    'SQL_FetchFloat',
+    'SQL_FetchInt',
+    'SQL_IsFieldNull',
+    'SQL_FetchSize',
+    'SQL_BindParamInt',
+    'SQL_BindParamFloat',
+    'SQL_BindParamString',
+    'SQL_Execute',
+    'SQL_LockDatabase',
+    'SQL_UnlockDatabase',
+    'SQLTCallback',
+    'SQL_IsSameConnection',
+    'SQL_TConnect',
+    'SQL_TQuery',
+    'SQL_CreateTransaction',
+    'SQL_AddQuery',
+    'SQLTxnSuccess',
+    'SQLTxnFailure',
+    'SQL_ExecuteTransaction',
+    'CloseHandle',
+    'CloneHandle',
+    'MenuHandler',
+    'CreateMenu',
+    'DisplayMenu',
+    'DisplayMenuAtItem',
+    'AddMenuItem',
+    'InsertMenuItem',
+    'RemoveMenuItem',
+    'RemoveAllMenuItems',
+    'GetMenuItem',
+    'GetMenuSelectionPosition',
+    'GetMenuItemCount',
+    'SetMenuPagination',
+    'GetMenuPagination',
+    'GetMenuStyle',
+    'SetMenuTitle',
+    'GetMenuTitle',
+    'CreatePanelFromMenu',
+    'GetMenuExitButton',
+    'SetMenuExitButton',
+    'GetMenuExitBackButton',
+    'SetMenuExitBackButton',
+    'SetMenuNoVoteButton',
+    'CancelMenu',
+    'GetMenuOptionFlags',
+    'SetMenuOptionFlags',
+    'IsVoteInProgress',
+    'CancelVote',
+    'VoteMenu',
+    'VoteMenuToAll',
+    'VoteHandler',
+    'SetVoteResultCallback',
+    'CheckVoteDelay',
+    'IsClientInVotePool',
+    'RedrawClientVoteMenu',
+    'GetMenuStyleHandle',
+    'CreatePanel',
+    'CreateMenuEx',
+    'GetClientMenu',
+    'CancelClientMenu',
+    'GetMaxPageItems',
+    'GetPanelStyle',
+    'SetPanelTitle',
+    'DrawPanelItem',
+    'DrawPanelText',
+    'CanPanelDrawFlags',
+    'SetPanelKeys',
+    'SendPanelToClient',
+    'GetPanelTextRemaining',
+    'GetPanelCurrentKey',
+    'SetPanelCurrentKey',
+    'RedrawMenuItem',
+    'InternalShowMenu',
+    'GetMenuVoteInfo',
+    'IsNewVoteAllowed',
+    'PrefetchSound',
+    'EmitAmbientSound',
+    'FadeClientVolume',
+    'StopSound',
+    'EmitSound',
+    'EmitSentence',
+    'GetDistGainFromSoundLevel',
+    'AmbientSHook',
+    'NormalSHook',
+    'AddAmbientSoundHook',
+    'AddNormalSoundHook',
+    'RemoveAmbientSoundHook',
+    'RemoveNormalSoundHook',
+    'EmitSoundToClient',
+    'EmitSoundToAll',
+    'ATTN_TO_SNDLEVEL',
+    'GetGameSoundParams',
+    'EmitGameSound',
+    'EmitAmbientGameSound',
+    'EmitGameSoundToClient',
+    'EmitGameSoundToAll',
+    'PrecacheScriptSound',
+    'strlen',
+    'StrContains',
+    'strcmp',
+    'strncmp',
+    'StrEqual',
+    'strcopy',
+    'Format',
+    'FormatEx',
+    'VFormat',
+    'StringToInt',
+    'StringToIntEx',
+    'IntToString',
+    'StringToFloat',
+    'StringToFloatEx',
+    'FloatToString',
+    'BreakString',
+    'TrimString',
+    'SplitString',
+    'ReplaceString',
+    'ReplaceStringEx',
+    'GetCharBytes',
+    'IsCharAlpha',
+    'IsCharNumeric',
+    'IsCharSpace',
+    'IsCharMB',
+    'IsCharUpper',
+    'IsCharLower',
+    'StripQuotes',
+    'CharToUpper',
+    'CharToLower',
+    'FindCharInString',
+    'StrCat',
+    'ExplodeString',
+    'ImplodeStrings',
+    'GetVectorLength',
+    'GetVectorDistance',
+    'GetVectorDotProduct',
+    'GetVectorCrossProduct',
+    'NormalizeVector',
+    'GetAngleVectors',
+    'GetVectorAngles',
+    'GetVectorVectors',
+    'AddVectors',
+    'SubtractVectors',
+    'ScaleVector',
+    'NegateVector',
+    'MakeVectorFromPoints',
+    'BaseComm_IsClientGagged',
+    'BaseComm_IsClientMuted',
+    'BaseComm_SetClientGag',
+    'BaseComm_SetClientMute',
+    'FormatUserLogText',
+    'FindPluginByFile',
+    'FindTarget',
+    'AcceptEntityInput',
+    'SetVariantBool',
+    'SetVariantString',
+    'SetVariantInt',
+    'SetVariantFloat',
+    'SetVariantVector3D',
+    'SetVariantPosVector3D',
+    'SetVariantColor',
+    'SetVariantEntity',
+    'GameRules_GetProp',
+    'GameRules_SetProp',
+    'GameRules_GetPropFloat',
+    'GameRules_SetPropFloat',
+    'GameRules_GetPropEnt',
+    'GameRules_SetPropEnt',
+    'GameRules_GetPropVector',
+    'GameRules_SetPropVector',
+    'GameRules_GetPropString',
+    'GameRules_SetPropString',
+    'GameRules_GetRoundState',
+    'OnClientConnect',
+    'OnClientConnected',
+    'OnClientPutInServer',
+    'OnClientDisconnect',
+    'OnClientDisconnect_Post',
+    'OnClientCommand',
+    'OnClientSettingsChanged',
+    'OnClientAuthorized',
+    'OnClientPreAdminCheck',
+    'OnClientPostAdminFilter',
+    'OnClientPostAdminCheck',
+    'GetMaxClients',
+    'GetMaxHumanPlayers',
+    'GetClientCount',
+    'GetClientName',
+    'GetClientIP',
+    'GetClientAuthString',
+    'GetClientAuthId',
+    'GetSteamAccountID',
+    'GetClientUserId',
+    'IsClientConnected',
+    'IsClientInGame',
+    'IsClientInKickQueue',
+    'IsClientAuthorized',
+    'IsFakeClient',
+    'IsClientSourceTV',
+    'IsClientReplay',
+    'IsClientObserver',
+    'IsPlayerAlive',
+    'GetClientInfo',
+    'GetClientTeam',
+    'SetUserAdmin',
+    'GetUserAdmin',
+    'AddUserFlags',
+    'RemoveUserFlags',
+    'SetUserFlagBits',
+    'GetUserFlagBits',
+    'CanUserTarget',
+    'RunAdminCacheChecks',
+    'NotifyPostAdminCheck',
+    'CreateFakeClient',
+    'SetFakeClientConVar',
+    'GetClientHealth',
+    'GetClientModel',
+    'GetClientWeapon',
+    'GetClientMaxs',
+    'GetClientMins',
+    'GetClientAbsAngles',
+    'GetClientAbsOrigin',
+    'GetClientArmor',
+    'GetClientDeaths',
+    'GetClientFrags',
+    'GetClientDataRate',
+    'IsClientTimingOut',
+    'GetClientTime',
+    'GetClientLatency',
+    'GetClientAvgLatency',
+    'GetClientAvgLoss',
+    'GetClientAvgChoke',
+    'GetClientAvgData',
+    'GetClientAvgPackets',
+    'GetClientOfUserId',
+    'KickClient',
+    'KickClientEx',
+    'ChangeClientTeam',
+    'GetClientSerial',
+    'GetClientFromSerial',
+    'FindStringTable',
+    'GetNumStringTables',
+    'GetStringTableNumStrings',
+    'GetStringTableMaxStrings',
+    'GetStringTableName',
+    'FindStringIndex',
+    'ReadStringTable',
+    'GetStringTableDataLength',
+    'GetStringTableData',
+    'SetStringTableData',
+    'AddToStringTable',
+    'LockStringTables',
+    'AddFileToDownloadsTable',
+    'GetEntityFlags',
+    'SetEntityFlags',
+    'GetEntityMoveType',
+    'SetEntityMoveType',
+    'GetEntityRenderMode',
+    'SetEntityRenderMode',
+    'GetEntityRenderFx',
+    'SetEntityRenderFx',
+    'SetEntityRenderColor',
+    'GetEntityGravity',
+    'SetEntityGravity',
+    'SetEntityHealth',
+    'GetClientButtons',
+    'EntityOutput',
+    'HookEntityOutput',
+    'UnhookEntityOutput',
+    'HookSingleEntityOutput',
+    'UnhookSingleEntityOutput',
+    'SMC_CreateParser',
+    'SMC_ParseFile',
+    'SMC_GetErrorString',
+    'SMC_ParseStart',
+    'SMC_SetParseStart',
+    'SMC_ParseEnd',
+    'SMC_SetParseEnd',
+    'SMC_NewSection',
+    'SMC_KeyValue',
+    'SMC_EndSection',
+    'SMC_SetReaders',
+    'SMC_RawLine',
+    'SMC_SetRawLine',
+    'BfWriteBool',
+    'BfWriteByte',
+    'BfWriteChar',
+    'BfWriteShort',
+    'BfWriteWord',
+    'BfWriteNum',
+    'BfWriteFloat',
+    'BfWriteString',
+    'BfWriteEntity',
+    'BfWriteAngle',
+    'BfWriteCoord',
+    'BfWriteVecCoord',
+    'BfWriteVecNormal',
+    'BfWriteAngles',
+    'BfReadBool',
+    'BfReadByte',
+    'BfReadChar',
+    'BfReadShort',
+    'BfReadWord',
+    'BfReadNum',
+    'BfReadFloat',
+    'BfReadString',
+    'BfReadEntity',
+    'BfReadAngle',
+    'BfReadCoord',
+    'BfReadVecCoord',
+    'BfReadVecNormal',
+    'BfReadAngles',
+    'BfGetNumBytesLeft',
+    'CreateProfiler',
+    'StartProfiling',
+    'StopProfiling',
+    'GetProfilerTime',
+    'OnPluginStart',
+    'AskPluginLoad2',
+    'OnPluginEnd',
+    'OnPluginPauseChange',
+    'OnGameFrame',
+    'OnMapStart',
+    'OnMapEnd',
+    'OnConfigsExecuted',
+    'OnAutoConfigsBuffered',
+    'OnAllPluginsLoaded',
+    'GetMyHandle',
+    'GetPluginIterator',
+    'MorePlugins',
+    'ReadPlugin',
+    'GetPluginStatus',
+    'GetPluginFilename',
+    'IsPluginDebugging',
+    'GetPluginInfo',
+    'FindPluginByNumber',
+    'SetFailState',
+    'ThrowError',
+    'GetTime',
+    'FormatTime',
+    'LoadGameConfigFile',
+    'GameConfGetOffset',
+    'GameConfGetKeyValue',
+    'GameConfGetAddress',
+    'GetSysTickCount',
+    'AutoExecConfig',
+    'RegPluginLibrary',
+    'LibraryExists',
+    'GetExtensionFileStatus',
+    'OnLibraryAdded',
+    'OnLibraryRemoved',
+    'ReadMapList',
+    'SetMapListCompatBind',
+    'OnClientFloodCheck',
+    'OnClientFloodResult',
+    'CanTestFeatures',
+    'GetFeatureStatus',
+    'RequireFeature',
+    'LoadFromAddress',
+    'StoreToAddress',
+    'CreateStack',
+    'PushStackCell',
+    'PushStackString',
+    'PushStackArray',
+    'PopStackCell',
+    'PopStackString',
+    'PopStackArray',
+    'IsStackEmpty',
+    'PopStack',
+    'OnPlayerRunCmd',
+    'BuildPath',
+    'OpenDirectory',
+    'ReadDirEntry',
+    'OpenFile',
+    'DeleteFile',
+    'ReadFileLine',
+    'ReadFile',
+    'ReadFileString',
+    'WriteFile',
+    'WriteFileString',
+    'WriteFileLine',
+    'ReadFileCell',
+    'WriteFileCell',
+    'IsEndOfFile',
+    'FileSeek',
+    'FilePosition',
+    'FileExists',
+    'RenameFile',
+    'DirExists',
+    'FileSize',
+    'FlushFile',
+    'RemoveDir',
+    'CreateDirectory',
+    'GetFileTime',
+    'LogToOpenFile',
+    'LogToOpenFileEx',
+    'PbReadInt',
+    'PbReadFloat',
+    'PbReadBool',
+    'PbReadString',
+    'PbReadColor',
+    'PbReadAngle',
+    'PbReadVector',
+    'PbReadVector2D',
+    'PbGetRepeatedFieldCount',
+    'PbSetInt',
+    'PbSetFloat',
+    'PbSetBool',
+    'PbSetString',
+    'PbSetColor',
+    'PbSetAngle',
+    'PbSetVector',
+    'PbSetVector2D',
+    'PbAddInt',
+    'PbAddFloat',
+    'PbAddBool',
+    'PbAddString',
+    'PbAddColor',
+    'PbAddAngle',
+    'PbAddVector',
+    'PbAddVector2D',
+    'PbRemoveRepeatedFieldValue',
+    'PbReadMessage',
+    'PbReadRepeatedMessage',
+    'PbAddMessage',
+    'SetNextMap',
+    'GetNextMap',
+    'ForceChangeLevel',
+    'GetMapHistorySize',
+    'GetMapHistory',
+    'GeoipCode2',
+    'GeoipCode3',
+    'GeoipCountry',
+    'MarkNativeAsOptional',
+    'RegClientCookie',
+    'FindClientCookie',
+    'SetClientCookie',
+    'GetClientCookie',
+    'SetAuthIdCookie',
+    'AreClientCookiesCached',
+    'OnClientCookiesCached',
+    'CookieMenuHandler',
+    'SetCookiePrefabMenu',
+    'SetCookieMenuItem',
+    'ShowCookieMenu',
+    'GetCookieIterator',
+    'ReadCookieIterator',
+    'GetCookieAccess',
+    'GetClientCookieTime',
+    'LoadTranslations',
+    'SetGlobalTransTarget',
+    'GetClientLanguage',
+    'GetServerLanguage',
+    'GetLanguageCount',
+    'GetLanguageInfo',
+    'SetClientLanguage',
+    'GetLanguageByCode',
+    'GetLanguageByName',
+    'CS_OnBuyCommand',
+    'CS_OnCSWeaponDrop',
+    'CS_OnGetWeaponPrice',
+    'CS_OnTerminateRound',
+    'CS_RespawnPlayer',
+    'CS_SwitchTeam',
+    'CS_DropWeapon',
+    'CS_TerminateRound',
+    'CS_GetTranslatedWeaponAlias',
+    'CS_GetWeaponPrice',
+    'CS_GetClientClanTag',
+    'CS_SetClientClanTag',
+    'CS_GetTeamScore',
+    'CS_SetTeamScore',
+    'CS_GetMVPCount',
+    'CS_SetMVPCount',
+    'CS_GetClientContributionScore',
+    'CS_SetClientContributionScore',
+    'CS_GetClientAssists',
+    'CS_SetClientAssists',
+    'CS_AliasToWeaponID',
+    'CS_WeaponIDToAlias',
+    'CS_IsValidWeaponID',
+    'CS_UpdateClientModel',
+    'LogToGame',
+    'SetRandomSeed',
+    'GetRandomFloat',
+    'GetRandomInt',
+    'IsMapValid',
+    'IsDedicatedServer',
+    'GetEngineTime',
+    'GetGameTime',
+    'GetGameTickCount',
+    'GetGameDescription',
+    'GetGameFolderName',
+    'GetCurrentMap',
+    'PrecacheModel',
+    'PrecacheSentenceFile',
+    'PrecacheDecal',
+    'PrecacheGeneric',
+    'IsModelPrecached',
+    'IsDecalPrecached',
+    'IsGenericPrecached',
+    'PrecacheSound',
+    'IsSoundPrecached',
+    'CreateDialog',
+    'GetEngineVersion',
+    'PrintToChat',
+    'PrintToChatAll',
+    'PrintCenterText',
+    'PrintCenterTextAll',
+    'PrintHintText',
+    'PrintHintTextToAll',
+    'ShowVGUIPanel',
+    'CreateHudSynchronizer',
+    'SetHudTextParams',
+    'SetHudTextParamsEx',
+    'ShowSyncHudText',
+    'ClearSyncHud',
+    'ShowHudText',
+    'ShowMOTDPanel',
+    'DisplayAskConnectBox',
+    'EntIndexToEntRef',
+    'EntRefToEntIndex',
+    'MakeCompatEntRef',
+    'SetClientViewEntity',
+    'SetLightStyle',
+    'GetClientEyePosition',
+    'CreateDataPack',
+    'WritePackCell',
+    'WritePackFloat',
+    'WritePackString',
+    'ReadPackCell',
+    'ReadPackFloat',
+    'ReadPackString',
+    'ResetPack',
+    'GetPackPosition',
+    'SetPackPosition',
+    'IsPackReadable',
+    'LogMessage',
+    'LogToFile',
+    'LogToFileEx',
+    'LogAction',
+    'LogError',
+    'OnLogAction',
+    'GameLogHook',
+    'AddGameLogHook',
+    'RemoveGameLogHook',
+    'FindTeamByName',
+    'StartPrepSDKCall',
+    'PrepSDKCall_SetVirtual',
+    'PrepSDKCall_SetSignature',
+    'PrepSDKCall_SetAddress',
+    'PrepSDKCall_SetFromConf',
+    'PrepSDKCall_SetReturnInfo',
+    'PrepSDKCall_AddParameter',
+    'EndPrepSDKCall',
+    'SDKCall',
+    'GetPlayerResourceEntity',
+)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import re
+    import sys
+    try:
+        from urllib import FancyURLopener
+    except ImportError:
+        from urllib.request import FancyURLopener
+
+    from pygments.util import format_lines
+
+    # urllib ends up wanting to import a module called 'math' -- if
+    # pygments/lexers is in the path, this ends badly.
+    for i in range(len(sys.path)-1, -1, -1):
+        if sys.path[i].endswith('/lexers'):
+            del sys.path[i]
+
+    class Opener(FancyURLopener):
+        version = 'Mozilla/5.0 (Pygments Sourcemod Builtins Update)'
+
+    opener = Opener()
+
+    def get_version():
+        f = opener.open('http://docs.sourcemod.net/api/index.php')
+        r = re.compile(r'SourceMod v\.<b>([\d\.]+(?:-\w+)?)</td>')
+        for line in f:
+            m = r.search(line)
+            if m is not None:
+                return m.groups()[0]
+        raise ValueError('No version in api docs')
+
+    def get_sm_functions():
+        f = opener.open('http://docs.sourcemod.net/api/SMfuncs.js')
+        r = re.compile(r'SMfunctions\[\d+\] = Array \("(?:public )?([^,]+)",".+"\);')
+        functions = []
+        for line in f:
+            m = r.match(line)
+            if m is not None:
+                functions.append(m.groups()[0])
+        return functions
+
+    def regenerate(filename, natives):
+        with open(filename) as fp:
+            content = fp.read()
+
+        header = content[:content.find('FUNCTIONS = (')]
+        footer = content[content.find("if __name__ == '__main__':")-1:]
+
+
+        with open(filename, 'w') as fp:
+            fp.write(header)
+            fp.write(format_lines('FUNCTIONS', natives))
+            fp.write(footer)
+
+    def run():
+        version = get_version()
+        print('> Downloading function index for SourceMod %s' % version)
+        functions = get_sm_functions()
+        print('> %d functions found:' % len(functions))
+
+        functionlist = []
+        for full_function_name in functions:
+            print('>> %s' % full_function_name)
+            functionlist.append(full_function_name)
+
+        regenerate(__file__, functionlist)
+
+
+    run()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/qvt.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/qvt.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/qvt.py	(revision 1126)
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.qvt
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for QVT Operational language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, combined, default, \
+    words
+from pygments.token import Text, Comment, Operator, Keyword, Punctuation, \
+    Name, String, Number
+
+__all__ = ['QVToLexer']
+
+
+class QVToLexer(RegexLexer):
+    """
+    For the `QVT Operational Mapping language <http://www.omg.org/spec/QVT/1.1/>`_.
+
+    Reference for implementing this: «Meta Object Facility (MOF) 2.0
+    Query/View/Transformation Specification», Version 1.1 - January 2011
+    (http://www.omg.org/spec/QVT/1.1/), see §8.4, «Concrete Syntax» in
+    particular.
+
+    Notable tokens assignments:
+
+    - Name.Class is assigned to the identifier following any of the following
+      keywords: metamodel, class, exception, primitive, enum, transformation
+      or library
+
+    - Name.Function is assigned to the names of mappings and queries
+
+    - Name.Builtin.Pseudo is assigned to the pre-defined variables 'this',
+      'self' and 'result'.
+    """
+    # With obvious borrowings & inspiration from the Java, Python and C lexers
+
+    name = 'QVTO'
+    aliases = ['qvto', 'qvt']
+    filenames = ['*.qvto']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'(--|//)(\s*)(directive:)?(.*)$',
+             bygroups(Comment, Comment, Comment.Preproc, Comment)),
+            # Uncomment the following if you want to distinguish between
+            # '/*' and '/**', à la javadoc
+            # (r'/[*]{2}(.|\n)*?[*]/', Comment.Multiline),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'\\\n', Text),
+            (r'(and|not|or|xor|##?)\b', Operator.Word),
+            (r'(:{1,2}=|[-+]=)\b', Operator.Word),
+            (r'(@|<<|>>)\b', Keyword),  # stereotypes
+            (r'!=|<>|==|=|!->|->|>=|<=|[.]{3}|[+/*%=<>&|.~]', Operator),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'(true|false|unlimited|null)\b', Keyword.Constant),
+            (r'(this|self|result)\b', Name.Builtin.Pseudo),
+            (r'(var)\b', Keyword.Declaration),
+            (r'(from|import)\b', Keyword.Namespace, 'fromimport'),
+            (r'(metamodel|class|exception|primitive|enum|transformation|'
+             r'library)(\s+)(\w+)',
+             bygroups(Keyword.Word, Text, Name.Class)),
+            (r'(exception)(\s+)(\w+)',
+             bygroups(Keyword.Word, Text, Name.Exception)),
+            (r'(main)\b', Name.Function),
+            (r'(mapping|helper|query)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'operation'),
+            (r'(assert)(\s+)\b', bygroups(Keyword, Text), 'assert'),
+            (r'(Bag|Collection|Dict|OrderedSet|Sequence|Set|Tuple|List)\b',
+             Keyword.Type),
+            include('keywords'),
+            ('"', String, combined('stringescape', 'dqs')),
+            ("'", String, combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+            # (r'([a-zA-Z_]\w*)(::)([a-zA-Z_]\w*)',
+            # bygroups(Text, Text, Text)),
+        ],
+
+        'fromimport': [
+            (r'(?:[ \t]|\\\n)+', Text),
+            (r'[a-zA-Z_][\w.]*', Name.Namespace),
+            default('#pop'),
+        ],
+
+        'operation': [
+            (r'::', Text),
+            (r'(.*::)([a-zA-Z_]\w*)([ \t]*)(\()',
+             bygroups(Text, Name.Function, Text, Punctuation), '#pop')
+        ],
+
+        'assert': [
+            (r'(warning|error|fatal)\b', Keyword, '#pop'),
+            default('#pop'),  # all else: go back
+        ],
+
+        'keywords': [
+            (words((
+                'abstract', 'access', 'any', 'assert', 'blackbox', 'break',
+                'case', 'collect', 'collectNested', 'collectOne', 'collectselect',
+                'collectselectOne', 'composes', 'compute', 'configuration',
+                'constructor', 'continue', 'datatype', 'default', 'derived',
+                'disjuncts', 'do', 'elif', 'else', 'end', 'endif', 'except',
+                'exists', 'extends', 'forAll', 'forEach', 'forOne', 'from', 'if',
+                'implies', 'in', 'inherits', 'init', 'inout', 'intermediate',
+                'invresolve', 'invresolveIn', 'invresolveone', 'invresolveoneIn',
+                'isUnique', 'iterate', 'late', 'let', 'literal', 'log', 'map',
+                'merges', 'modeltype', 'new', 'object', 'one', 'ordered', 'out',
+                'package', 'population', 'property', 'raise', 'readonly',
+                'references', 'refines', 'reject', 'resolve', 'resolveIn',
+                'resolveone', 'resolveoneIn', 'return', 'select', 'selectOne',
+                'sortedBy', 'static', 'switch', 'tag', 'then', 'try', 'typedef',
+                'unlimited', 'uses', 'when', 'where', 'while', 'with', 'xcollect',
+                'xmap', 'xselect'), suffix=r'\b'), Keyword),
+        ],
+
+        # There is no need to distinguish between String.Single and
+        # String.Double: 'strings' is factorised for 'dqs' and 'sqs'
+        'strings': [
+            (r'[^\\\'"\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            ],
+        'stringescape': [
+            (r'\\([\\btnfr"\']|u[0-3][0-7]{2}|u[0-7]{1,2})', String.Escape)
+        ],
+        'dqs': [  # double-quoted string
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"', String.Escape),
+            include('strings')
+            ],
+        'sqs': [  # single-quoted string
+            (r"'", String, '#pop'),
+            (r"\\\\|\\'", String.Escape),
+            include('strings')
+            ],
+        'name': [
+            ('[a-zA-Z_]\w*', Name),
+            ],
+        # numbers: excerpt taken from the python lexer
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/make.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/make.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/make.py	(revision 1126)
@@ -0,0 +1,202 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.make
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Makefiles and similar.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, \
+    do_insertions, using
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation
+from pygments.lexers.shell import BashLexer
+
+__all__ = ['MakefileLexer', 'BaseMakefileLexer', 'CMakeLexer']
+
+
+class MakefileLexer(Lexer):
+    """
+    Lexer for BSD and GNU make extensions (lenient enough to handle both in
+    the same file even).
+
+    *Rewritten in Pygments 0.10.*
+    """
+
+    name = 'Makefile'
+    aliases = ['make', 'makefile', 'mf', 'bsdmake']
+    filenames = ['*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile']
+    mimetypes = ['text/x-makefile']
+
+    r_special = re.compile(
+        r'^(?:'
+        # BSD Make
+        r'\.\s*(include|undef|error|warning|if|else|elif|endif|for|endfor)|'
+        # GNU Make
+        r'\s*(ifeq|ifneq|ifdef|ifndef|else|endif|-?include|define|endef|:|vpath)|'
+        # GNU Automake
+        r'\s*(if|else|endif))(?=\s)')
+    r_comment = re.compile(r'^\s*@?#')
+
+    def get_tokens_unprocessed(self, text):
+        ins = []
+        lines = text.splitlines(True)
+        done = ''
+        lex = BaseMakefileLexer(**self.options)
+        backslashflag = False
+        for line in lines:
+            if self.r_special.match(line) or backslashflag:
+                ins.append((len(done), [(0, Comment.Preproc, line)]))
+                backslashflag = line.strip().endswith('\\')
+            elif self.r_comment.match(line):
+                ins.append((len(done), [(0, Comment, line)]))
+            else:
+                done += line
+        for item in do_insertions(ins, lex.get_tokens_unprocessed(done)):
+            yield item
+
+    def analyse_text(text):
+        # Many makefiles have $(BIG_CAPS) style variables
+        if re.search(r'\$\([A-Z_]+\)', text):
+            return 0.1
+
+
+class BaseMakefileLexer(RegexLexer):
+    """
+    Lexer for simple Makefiles (no preprocessing).
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'Base Makefile'
+    aliases = ['basemake']
+    filenames = []
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            # recipes (need to allow spaces because of expandtabs)
+            (r'^(?:[\t ]+.*\n|\n)+', using(BashLexer)),
+            # special variables
+            (r'\$[<@$+%?|*]', Keyword),
+            (r'\s+', Text),
+            (r'#.*?\n', Comment),
+            (r'(export)(\s+)(?=[\w${}\t -]+\n)',
+             bygroups(Keyword, Text), 'export'),
+            (r'export\s+', Keyword),
+            # assignment
+            (r'([\w${}().-]+)(\s*)([!?:+]?=)([ \t]*)((?:.*\\\n)+|.*\n)',
+             bygroups(Name.Variable, Text, Operator, Text, using(BashLexer))),
+            # strings
+            (r'(?s)"(\\\\|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\.|[^'\\])*'", String.Single),
+            # targets
+            (r'([^\n:]+)(:+)([ \t]*)', bygroups(Name.Function, Operator, Text),
+             'block-header'),
+            # expansions
+            (r'\$\(', Keyword, 'expansion'),
+        ],
+        'expansion': [
+            (r'[^$a-zA-Z_()]+', Text),
+            (r'[a-zA-Z_]+', Name.Variable),
+            (r'\$', Keyword),
+            (r'\(', Keyword, '#push'),
+            (r'\)', Keyword, '#pop'),
+        ],
+        'export': [
+            (r'[\w${}-]+', Name.Variable),
+            (r'\n', Text, '#pop'),
+            (r'\s+', Text),
+        ],
+        'block-header': [
+            (r'[,|]', Punctuation),
+            (r'#.*?\n', Comment, '#pop'),
+            (r'\\\n', Text),  # line continuation
+            (r'\$\(', Keyword, 'expansion'),
+            (r'[a-zA-Z_]+', Name),
+            (r'\n', Text, '#pop'),
+            (r'.', Text),
+        ],
+    }
+
+
+class CMakeLexer(RegexLexer):
+    """
+    Lexer for `CMake <http://cmake.org/Wiki/CMake>`_ files.
+
+    .. versionadded:: 1.2
+    """
+    name = 'CMake'
+    aliases = ['cmake']
+    filenames = ['*.cmake', 'CMakeLists.txt']
+    mimetypes = ['text/x-cmake']
+
+    tokens = {
+        'root': [
+            # (r'(ADD_CUSTOM_COMMAND|ADD_CUSTOM_TARGET|ADD_DEFINITIONS|'
+            # r'ADD_DEPENDENCIES|ADD_EXECUTABLE|ADD_LIBRARY|ADD_SUBDIRECTORY|'
+            # r'ADD_TEST|AUX_SOURCE_DIRECTORY|BUILD_COMMAND|BUILD_NAME|'
+            # r'CMAKE_MINIMUM_REQUIRED|CONFIGURE_FILE|CREATE_TEST_SOURCELIST|'
+            # r'ELSE|ELSEIF|ENABLE_LANGUAGE|ENABLE_TESTING|ENDFOREACH|'
+            # r'ENDFUNCTION|ENDIF|ENDMACRO|ENDWHILE|EXEC_PROGRAM|'
+            # r'EXECUTE_PROCESS|EXPORT_LIBRARY_DEPENDENCIES|FILE|FIND_FILE|'
+            # r'FIND_LIBRARY|FIND_PACKAGE|FIND_PATH|FIND_PROGRAM|FLTK_WRAP_UI|'
+            # r'FOREACH|FUNCTION|GET_CMAKE_PROPERTY|GET_DIRECTORY_PROPERTY|'
+            # r'GET_FILENAME_COMPONENT|GET_SOURCE_FILE_PROPERTY|'
+            # r'GET_TARGET_PROPERTY|GET_TEST_PROPERTY|IF|INCLUDE|'
+            # r'INCLUDE_DIRECTORIES|INCLUDE_EXTERNAL_MSPROJECT|'
+            # r'INCLUDE_REGULAR_EXPRESSION|INSTALL|INSTALL_FILES|'
+            # r'INSTALL_PROGRAMS|INSTALL_TARGETS|LINK_DIRECTORIES|'
+            # r'LINK_LIBRARIES|LIST|LOAD_CACHE|LOAD_COMMAND|MACRO|'
+            # r'MAKE_DIRECTORY|MARK_AS_ADVANCED|MATH|MESSAGE|OPTION|'
+            # r'OUTPUT_REQUIRED_FILES|PROJECT|QT_WRAP_CPP|QT_WRAP_UI|REMOVE|'
+            # r'REMOVE_DEFINITIONS|SEPARATE_ARGUMENTS|SET|'
+            # r'SET_DIRECTORY_PROPERTIES|SET_SOURCE_FILES_PROPERTIES|'
+            # r'SET_TARGET_PROPERTIES|SET_TESTS_PROPERTIES|SITE_NAME|'
+            # r'SOURCE_GROUP|STRING|SUBDIR_DEPENDS|SUBDIRS|'
+            # r'TARGET_LINK_LIBRARIES|TRY_COMPILE|TRY_RUN|UNSET|'
+            # r'USE_MANGLED_MESA|UTILITY_SOURCE|VARIABLE_REQUIRES|'
+            # r'VTK_MAKE_INSTANTIATOR|VTK_WRAP_JAVA|VTK_WRAP_PYTHON|'
+            # r'VTK_WRAP_TCL|WHILE|WRITE_FILE|'
+            # r'COUNTARGS)\b', Name.Builtin, 'args'),
+            (r'\b(\w+)([ \t]*)(\()', bygroups(Name.Builtin, Text,
+                                              Punctuation), 'args'),
+            include('keywords'),
+            include('ws')
+        ],
+        'args': [
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+            (r'(\$\{)(.+?)(\})', bygroups(Operator, Name.Variable, Operator)),
+            (r'(\$ENV\{)(.+?)(\})', bygroups(Operator, Name.Variable, Operator)),
+            (r'(\$<)(.+?)(>)', bygroups(Operator, Name.Variable, Operator)),
+            (r'(?s)".*?"', String.Double),
+            (r'\\\S+', String),
+            (r'[^)$"# \t\n]+', String),
+            (r'\n', Text),  # explicitly legal
+            include('keywords'),
+            include('ws')
+        ],
+        'string': [
+
+        ],
+        'keywords': [
+            (r'\b(WIN32|UNIX|APPLE|CYGWIN|BORLAND|MINGW|MSVC|MSVC_IDE|MSVC60|'
+             r'MSVC70|MSVC71|MSVC80|MSVC90)\b', Keyword),
+        ],
+        'ws': [
+            (r'[ \t]+', Text),
+            (r'#.*\n', Comment),
+        ]
+    }
+
+    def analyse_text(text):
+        exp = r'^ *CMAKE_MINIMUM_REQUIRED *\( *VERSION *\d(\.\d)* *( FATAL_ERROR)? *\) *$'
+        if re.search(exp, text, flags=re.MULTILINE | re.IGNORECASE):
+            return 0.8
+        return 0.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_stan_builtins.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_stan_builtins.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_stan_builtins.py	(revision 1126)
@@ -0,0 +1,532 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._stan_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the names of functions for Stan used by
+    ``pygments.lexers.math.StanLexer. This is for Stan language version 2.8.0.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+KEYWORDS = (
+    'else',
+    'for',
+    'if',
+    'in',
+    'increment_log_prob',
+    'integrate_ode',
+    'lp__',
+    'print',
+    'reject',
+    'return',
+    'while'
+)
+
+TYPES = (
+    'cholesky_factor_corr',
+    'cholesky_factor_cov',
+    'corr_matrix',
+    'cov_matrix',
+    'int',
+    'matrix',
+    'ordered',
+    'positive_ordered',
+    'real',
+    'row_vector',
+    'row_vectormatrix',
+    'simplex',
+    'unit_vector',
+    'vector',
+    'void')
+
+FUNCTIONS = (
+    'Phi',
+    'Phi_approx',
+    'abs',
+    'acos',
+    'acosh',
+    'append_col',
+    'append_row',
+    'asin',
+    'asinh',
+    'atan',
+    'atan2',
+    'atanh',
+    'bernoulli_ccdf_log',
+    'bernoulli_cdf',
+    'bernoulli_cdf_log',
+    'bernoulli_log',
+    'bernoulli_logit_log',
+    'bernoulli_rng',
+    'bessel_first_kind',
+    'bessel_second_kind',
+    'beta_binomial_ccdf_log',
+    'beta_binomial_cdf',
+    'beta_binomial_cdf_log',
+    'beta_binomial_log',
+    'beta_binomial_rng',
+    'beta_ccdf_log',
+    'beta_cdf',
+    'beta_cdf_log',
+    'beta_log',
+    'beta_rng',
+    'binary_log_loss',
+    'binomial_ccdf_log',
+    'binomial_cdf',
+    'binomial_cdf_log',
+    'binomial_coefficient_log',
+    'binomial_log',
+    'binomial_logit_log',
+    'binomial_rng',
+    'block',
+    'categorical_log',
+    'categorical_logit_log',
+    'categorical_rng',
+    'cauchy_ccdf_log',
+    'cauchy_cdf',
+    'cauchy_cdf_log',
+    'cauchy_log',
+    'cauchy_rng',
+    'cbrt',
+    'ceil',
+    'chi_square_ccdf_log',
+    'chi_square_cdf',
+    'chi_square_cdf_log',
+    'chi_square_log',
+    'chi_square_rng',
+    'cholesky_decompose',
+    'col',
+    'cols',
+    'columns_dot_product',
+    'columns_dot_self',
+    'cos',
+    'cosh',
+    'crossprod',
+    'csr_extract_u',
+    'csr_extract_v',
+    'csr_extract_w',
+    'csr_matrix_times_vector',
+    'csr_to_dense_matrix',
+    'cumulative_sum',
+    'determinant',
+    'diag_matrix',
+    'diag_post_multiply',
+    'diag_pre_multiply',
+    'diagonal',
+    'digamma',
+    'dims',
+    'dirichlet_log',
+    'dirichlet_rng',
+    'distance',
+    'dot_product',
+    'dot_self',
+    'double_exponential_ccdf_log',
+    'double_exponential_cdf',
+    'double_exponential_cdf_log',
+    'double_exponential_log',
+    'double_exponential_rng',
+    'e',
+    'eigenvalues_sym',
+    'eigenvectors_sym',
+    'erf',
+    'erfc',
+    'exp',
+    'exp2',
+    'exp_mod_normal_ccdf_log',
+    'exp_mod_normal_cdf',
+    'exp_mod_normal_cdf_log',
+    'exp_mod_normal_log',
+    'exp_mod_normal_rng',
+    'expm1',
+    'exponential_ccdf_log',
+    'exponential_cdf',
+    'exponential_cdf_log',
+    'exponential_log',
+    'exponential_rng',
+    'fabs',
+    'falling_factorial',
+    'fdim',
+    'floor',
+    'fma',
+    'fmax',
+    'fmin',
+    'fmod',
+    'frechet_ccdf_log',
+    'frechet_cdf',
+    'frechet_cdf_log',
+    'frechet_log',
+    'frechet_rng',
+    'gamma_ccdf_log',
+    'gamma_cdf',
+    'gamma_cdf_log',
+    'gamma_log',
+    'gamma_p',
+    'gamma_q',
+    'gamma_rng',
+    'gaussian_dlm_obs_log',
+    'get_lp',
+    'gumbel_ccdf_log',
+    'gumbel_cdf',
+    'gumbel_cdf_log',
+    'gumbel_log',
+    'gumbel_rng',
+    'head',
+    'hypergeometric_log',
+    'hypergeometric_rng',
+    'hypot',
+    'if_else',
+    'int_step',
+    'inv',
+    'inv_chi_square_ccdf_log',
+    'inv_chi_square_cdf',
+    'inv_chi_square_cdf_log',
+    'inv_chi_square_log',
+    'inv_chi_square_rng',
+    'inv_cloglog',
+    'inv_gamma_ccdf_log',
+    'inv_gamma_cdf',
+    'inv_gamma_cdf_log',
+    'inv_gamma_log',
+    'inv_gamma_rng',
+    'inv_logit',
+    'inv_phi',
+    'inv_sqrt',
+    'inv_square',
+    'inv_wishart_log',
+    'inv_wishart_rng',
+    'inverse',
+    'inverse_spd',
+    'is_inf',
+    'is_nan',
+    'lbeta',
+    'lgamma',
+    'lkj_corr_cholesky_log',
+    'lkj_corr_cholesky_rng',
+    'lkj_corr_log',
+    'lkj_corr_rng',
+    'lmgamma',
+    'log',
+    'log10',
+    'log1m',
+    'log1m_exp',
+    'log1m_inv_logit',
+    'log1p',
+    'log1p_exp',
+    'log2',
+    'log_determinant',
+    'log_diff_exp',
+    'log_falling_factorial',
+    'log_inv_logit',
+    'log_mix',
+    'log_rising_factorial',
+    'log_softmax',
+    'log_sum_exp',
+    'logistic_ccdf_log',
+    'logistic_cdf',
+    'logistic_cdf_log',
+    'logistic_log',
+    'logistic_rng',
+    'logit',
+    'lognormal_ccdf_log',
+    'lognormal_cdf',
+    'lognormal_cdf_log',
+    'lognormal_log',
+    'lognormal_rng',
+    'machine_precision',
+    'max',
+    'mdivide_left_tri_low',
+    'mdivide_right_tri_low',
+    'mean',
+    'min',
+    'modified_bessel_first_kind',
+    'modified_bessel_second_kind',
+    'multi_gp_cholesky_log',
+    'multi_gp_log',
+    'multi_normal_cholesky_log',
+    'multi_normal_cholesky_rng',
+    'multi_normal_log',
+    'multi_normal_prec_log',
+    'multi_normal_rng',
+    'multi_student_t_log',
+    'multi_student_t_rng',
+    'multinomial_log',
+    'multinomial_rng',
+    'multiply_log',
+    'multiply_lower_tri_self_transpose',
+    'neg_binomial_2_ccdf_log',
+    'neg_binomial_2_cdf',
+    'neg_binomial_2_cdf_log',
+    'neg_binomial_2_log',
+    'neg_binomial_2_log_log',
+    'neg_binomial_2_log_rng',
+    'neg_binomial_2_rng',
+    'neg_binomial_ccdf_log',
+    'neg_binomial_cdf',
+    'neg_binomial_cdf_log',
+    'neg_binomial_log',
+    'neg_binomial_rng',
+    'negative_infinity',
+    'normal_ccdf_log',
+    'normal_cdf',
+    'normal_cdf_log',
+    'normal_log',
+    'normal_rng',
+    'not_a_number',
+    'num_elements',
+    'ordered_logistic_log',
+    'ordered_logistic_rng',
+    'owens_t',
+    'pareto_ccdf_log',
+    'pareto_cdf',
+    'pareto_cdf_log',
+    'pareto_log',
+    'pareto_rng',
+    'pareto_type_2_ccdf_log',
+    'pareto_type_2_cdf',
+    'pareto_type_2_cdf_log',
+    'pareto_type_2_log',
+    'pareto_type_2_rng',
+    'pi',
+    'poisson_ccdf_log',
+    'poisson_cdf',
+    'poisson_cdf_log',
+    'poisson_log',
+    'poisson_log_log',
+    'poisson_log_rng',
+    'poisson_rng',
+    'positive_infinity',
+    'pow',
+    'prod',
+    'qr_Q',
+    'qr_R',
+    'quad_form',
+    'quad_form_diag',
+    'quad_form_sym',
+    'rank',
+    'rayleigh_ccdf_log',
+    'rayleigh_cdf',
+    'rayleigh_cdf_log',
+    'rayleigh_log',
+    'rayleigh_rng',
+    'rep_array',
+    'rep_matrix',
+    'rep_row_vector',
+    'rep_vector',
+    'rising_factorial',
+    'round',
+    'row',
+    'rows',
+    'rows_dot_product',
+    'rows_dot_self',
+    'scaled_inv_chi_square_ccdf_log',
+    'scaled_inv_chi_square_cdf',
+    'scaled_inv_chi_square_cdf_log',
+    'scaled_inv_chi_square_log',
+    'scaled_inv_chi_square_rng',
+    'sd',
+    'segment',
+    'sin',
+    'singular_values',
+    'sinh',
+    'size',
+    'skew_normal_ccdf_log',
+    'skew_normal_cdf',
+    'skew_normal_cdf_log',
+    'skew_normal_log',
+    'skew_normal_rng',
+    'softmax',
+    'sort_asc',
+    'sort_desc',
+    'sort_indices_asc',
+    'sort_indices_desc',
+    'sqrt',
+    'sqrt2',
+    'square',
+    'squared_distance',
+    'step',
+    'student_t_ccdf_log',
+    'student_t_cdf',
+    'student_t_cdf_log',
+    'student_t_log',
+    'student_t_rng',
+    'sub_col',
+    'sub_row',
+    'sum',
+    'tail',
+    'tan',
+    'tanh',
+    'tcrossprod',
+    'tgamma',
+    'to_array_1d',
+    'to_array_2d',
+    'to_matrix',
+    'to_row_vector',
+    'to_vector',
+    'trace',
+    'trace_gen_quad_form',
+    'trace_quad_form',
+    'trigamma',
+    'trunc',
+    'uniform_ccdf_log',
+    'uniform_cdf',
+    'uniform_cdf_log',
+    'uniform_log',
+    'uniform_rng',
+    'variance',
+    'von_mises_log',
+    'von_mises_rng',
+    'weibull_ccdf_log',
+    'weibull_cdf',
+    'weibull_cdf_log',
+    'weibull_log',
+    'weibull_rng',
+    'wiener_log',
+    'wishart_log',
+    'wishart_rng'
+)
+
+DISTRIBUTIONS = (
+    'bernoulli',
+    'bernoulli_logit',
+    'beta',
+    'beta_binomial',
+    'binomial',
+    'binomial_logit',
+    'categorical',
+    'categorical_logit',
+    'cauchy',
+    'chi_square',
+    'dirichlet',
+    'double_exponential',
+    'exp_mod_normal',
+    'exponential',
+    'frechet',
+    'gamma',
+    'gaussian_dlm_obs',
+    'gumbel',
+    'hypergeometric',
+    'inv_chi_square',
+    'inv_gamma',
+    'inv_wishart',
+    'lkj_corr',
+    'lkj_corr_cholesky',
+    'logistic',
+    'lognormal',
+    'multi_gp',
+    'multi_gp_cholesky',
+    'multi_normal',
+    'multi_normal_cholesky',
+    'multi_normal_prec',
+    'multi_student_t',
+    'multinomial',
+    'neg_binomial',
+    'neg_binomial_2',
+    'neg_binomial_2_log',
+    'normal',
+    'ordered_logistic',
+    'pareto',
+    'pareto_type_2',
+    'poisson',
+    'poisson_log',
+    'rayleigh',
+    'scaled_inv_chi_square',
+    'skew_normal',
+    'student_t',
+    'uniform',
+    'von_mises',
+    'weibull',
+    'wiener',
+    'wishart'
+)
+
+RESERVED = (
+    'alignas',
+    'alignof',
+    'and',
+    'and_eq',
+    'asm',
+    'auto',
+    'bitand',
+    'bitor',
+    'bool',
+    'break',
+    'case',
+    'catch',
+    'char',
+    'char16_t',
+    'char32_t',
+    'class',
+    'compl',
+    'const',
+    'const_cast',
+    'constexpr',
+    'continue',
+    'decltype',
+    'default',
+    'delete',
+    'do',
+    'double',
+    'dynamic_cast',
+    'enum',
+    'explicit',
+    'export',
+    'extern',
+    'false',
+    'false',
+    'float',
+    'friend',
+    'fvar',
+    'goto',
+    'inline',
+    'int',
+    'long',
+    'mutable',
+    'namespace',
+    'new',
+    'noexcept',
+    'not',
+    'not_eq',
+    'nullptr',
+    'operator',
+    'or',
+    'or_eq',
+    'private',
+    'protected',
+    'public',
+    'register',
+    'reinterpret_cast',
+    'repeat',
+    'short',
+    'signed',
+    'sizeof',
+    'static',
+    'static_assert',
+    'static_cast',
+    'struct',
+    'switch',
+    'template',
+    'then',
+    'this',
+    'thread_local',
+    'throw',
+    'true',
+    'true',
+    'try',
+    'typedef',
+    'typeid',
+    'typename',
+    'union',
+    'unsigned',
+    'until',
+    'using',
+    'var',
+    'virtual',
+    'void',
+    'volatile',
+    'wchar_t',
+    'xor',
+    'xor_eq'
+)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/crystal.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/crystal.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/crystal.py	(revision 1126)
@@ -0,0 +1,393 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.crystal
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Crystal.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, include, \
+    bygroups, default, LexerContext, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['CrystalLexer']
+
+line_re = re.compile('.*?\n')
+
+
+CRYSTAL_OPERATORS = [
+    '!=', '!~', '!', '%', '&&', '&', '**', '*', '+', '-', '/', '<=>', '<<', '<=', '<',
+    '===', '==', '=~', '=', '>=', '>>', '>', '[]=', '[]?', '[]', '^', '||', '|', '~'
+]
+
+
+class CrystalLexer(ExtendedRegexLexer):
+    """
+    For `Crystal <http://crystal-lang.org>`_ source code.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'Crystal'
+    aliases = ['cr', 'crystal']
+    filenames = ['*.cr']
+    mimetypes = ['text/x-crystal']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    def heredoc_callback(self, match, ctx):
+        # okay, this is the hardest part of parsing Crystal...
+        # match: 1 = <<-?, 2 = quote? 3 = name 4 = quote? 5 = rest of line
+
+        start = match.start(1)
+        yield start, Operator, match.group(1)        # <<-?
+        yield match.start(2), String.Heredoc, match.group(2)    # quote ", ', `
+        yield match.start(3), String.Delimiter, match.group(3)  # heredoc name
+        yield match.start(4), String.Heredoc, match.group(4)    # quote again
+
+        heredocstack = ctx.__dict__.setdefault('heredocstack', [])
+        outermost = not bool(heredocstack)
+        heredocstack.append((match.group(1) == '<<-', match.group(3)))
+
+        ctx.pos = match.start(5)
+        ctx.end = match.end(5)
+        # this may find other heredocs
+        for i, t, v in self.get_tokens_unprocessed(context=ctx):
+            yield i, t, v
+        ctx.pos = match.end()
+
+        if outermost:
+            # this is the outer heredoc again, now we can process them all
+            for tolerant, hdname in heredocstack:
+                lines = []
+                for match in line_re.finditer(ctx.text, ctx.pos):
+                    if tolerant:
+                        check = match.group().strip()
+                    else:
+                        check = match.group().rstrip()
+                    if check == hdname:
+                        for amatch in lines:
+                            yield amatch.start(), String.Heredoc, amatch.group()
+                        yield match.start(), String.Delimiter, match.group()
+                        ctx.pos = match.end()
+                        break
+                    else:
+                        lines.append(match)
+                else:
+                    # end of heredoc not found -- error!
+                    for amatch in lines:
+                        yield amatch.start(), Error, amatch.group()
+            ctx.end = len(ctx.text)
+            del heredocstack[:]
+
+    def gen_crystalstrings_rules():
+        def intp_regex_callback(self, match, ctx):
+            yield match.start(1), String.Regex, match.group(1)  # begin
+            nctx = LexerContext(match.group(3), 0, ['interpolated-regex'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Regex, match.group(4)  # end[imsx]*
+            ctx.pos = match.end()
+
+        def intp_string_callback(self, match, ctx):
+            yield match.start(1), String.Other, match.group(1)
+            nctx = LexerContext(match.group(3), 0, ['interpolated-string'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Other, match.group(4)  # end
+            ctx.pos = match.end()
+
+        states = {}
+        states['strings'] = [
+            (r'\:@{0,2}[a-zA-Z_]\w*[!?]?', String.Symbol),
+            (words(CRYSTAL_OPERATORS, prefix=r'\:@{0,2}'), String.Symbol),
+            (r":'(\\\\|\\'|[^'])*'", String.Symbol),
+            # This allows arbitrary text after '\ for simplicity
+            (r"'(\\\\|\\'|[^']|\\[^'\\]+)'", String.Char),
+            (r':"', String.Symbol, 'simple-sym'),
+            # Crystal doesn't have "symbol:"s but this simplifies function args
+            (r'([a-zA-Z_]\w*)(:)(?!:)', bygroups(String.Symbol, Punctuation)),
+            (r'"', String.Double, 'simple-string'),
+            (r'(?<!\.)`', String.Backtick, 'simple-backtick'),
+        ]
+
+        # double-quoted string and symbol
+        for name, ttype, end in ('string', String.Double, '"'), \
+                                ('sym', String.Symbol, '"'), \
+                                ('backtick', String.Backtick, '`'):
+            states['simple-'+name] = [
+                include('string-escaped' if name == 'sym' else 'string-intp-escaped'),
+                (r'[^\\%s#]+' % end, ttype),
+                (r'[\\#]', ttype),
+                (end, ttype, '#pop'),
+            ]
+
+        # braced quoted strings
+        for lbrace, rbrace, bracecc, name in \
+                ('\\{', '\\}', '{}', 'cb'), \
+                ('\\[', '\\]', '\\[\\]', 'sb'), \
+                ('\\(', '\\)', '()', 'pa'), \
+                ('<', '>', '<>', 'ab'):
+            states[name+'-intp-string'] = [
+                (r'\\[' + lbrace + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                include('string-intp-escaped'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%' + lbrace, String.Other,
+                                      name+'-intp-string'))
+            states[name+'-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            # http://crystal-lang.org/docs/syntax_and_semantics/literals/array.html
+            states['strings'].append((r'%[wi]' + lbrace, String.Other,
+                                      name+'-string'))
+            states[name+'-regex'] = [
+                (r'\\[\\' + bracecc + ']', String.Regex),
+                (lbrace, String.Regex, '#push'),
+                (rbrace + '[imsx]*', String.Regex, '#pop'),
+                include('string-intp'),
+                (r'[\\#' + bracecc + ']', String.Regex),
+                (r'[^\\#' + bracecc + ']+', String.Regex),
+            ]
+            states['strings'].append((r'%r' + lbrace, String.Regex,
+                                      name+'-regex'))
+
+        # these must come after %<brace>!
+        states['strings'] += [
+            # %r regex
+            (r'(%r([\W_]))((?:\\\2|(?!\2).)*)(\2[imsx]*)',
+             intp_regex_callback),
+            # regular fancy strings with qsw
+            (r'(%[wi]([\W_]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+            # special forms of fancy strings after operators or
+            # in method calls with braces
+            (r'(?<=[-+/*%=<>&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Text, String.Other, None)),
+            # and because of fixed width lookbehinds the whole thing a
+            # second time for line startings...
+            (r'^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Text, String.Other, None)),
+            # all regular fancy strings without qsw
+            (r'(%([\[{(<]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+        ]
+
+        return states
+
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment.Single),
+            # keywords
+            (words('''
+                abstract asm as begin break case do else elsif end ensure extend ifdef if
+                include instance_sizeof next of pointerof private protected rescue return
+                require sizeof super then typeof unless until when while with yield
+            '''.split(), suffix=r'\b'), Keyword),
+            (words(['true', 'false', 'nil'], suffix=r'\b'), Keyword.Constant),
+            # start of function, class and module names
+            (r'(module|lib)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Text, Name.Namespace)),
+            (r'(def|fun|macro)(\s+)((?:[a-zA-Z_]\w*::)*)',
+             bygroups(Keyword, Text, Name.Namespace), 'funcname'),
+            (r'def(?=[*%&^`~+-/\[<>=])', Keyword, 'funcname'),
+            (r'(class|struct|union|type|alias|enum)(\s+)((?:[a-zA-Z_]\w*::)*)',
+             bygroups(Keyword, Text, Name.Namespace), 'classname'),
+            (r'(self|out|uninitialized)\b|(is_a|responds_to)\?', Keyword.Pseudo),
+            # macros
+            (words('''
+                debugger record pp assert_responds_to spawn parallel
+                getter setter property delegate def_hash def_equals def_equals_and_hash
+                forward_missing_to
+            '''.split(), suffix=r'\b'), Name.Builtin.Pseudo),
+            (r'getter[!?]|property[!?]|__(DIR|FILE|LINE)__\b', Name.Builtin.Pseudo),
+            # builtins
+            # http://crystal-lang.org/api/toplevel.html
+            (words('''
+                Object Value Struct Reference Proc Class Nil Symbol Enum Void
+                Bool Number Int Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64
+                Float Float32 Float64 Char String
+                Pointer Slice Range Exception Regex
+                Mutex StaticArray Array Hash Set Tuple Deque Box Process File
+                Dir Time Channel Concurrent Scheduler
+                abort at_exit caller delay exit fork future get_stack_top gets
+                lazy loop main p print printf puts
+                raise rand read_line sleep sprintf system with_color
+            '''.split(), prefix=r'(?<!\.)', suffix=r'\b'), Name.Builtin),
+            # normal heredocs
+            (r'(?<!\w)(<<-?)(["`\']?)([a-zA-Z_]\w*)(\2)(.*?\n)',
+             heredoc_callback),
+            # empty string heredocs
+            (r'(<<-?)("|\')()(\2)(.*?\n)', heredoc_callback),
+            (r'__END__', Comment.Preproc, 'end-part'),
+            # multiline regex (after keywords or assignments)
+            (r'(?:^|(?<=[=<>~!:])|'
+             r'(?<=(?:\s|;)when\s)|'
+             r'(?<=(?:\s|;)or\s)|'
+             r'(?<=(?:\s|;)and\s)|'
+             r'(?<=\.index\s)|'
+             r'(?<=\.scan\s)|'
+             r'(?<=\.sub\s)|'
+             r'(?<=\.sub!\s)|'
+             r'(?<=\.gsub\s)|'
+             r'(?<=\.gsub!\s)|'
+             r'(?<=\.match\s)|'
+             r'(?<=(?:\s|;)if\s)|'
+             r'(?<=(?:\s|;)elsif\s)|'
+             r'(?<=^when\s)|'
+             r'(?<=^index\s)|'
+             r'(?<=^scan\s)|'
+             r'(?<=^sub\s)|'
+             r'(?<=^gsub\s)|'
+             r'(?<=^sub!\s)|'
+             r'(?<=^gsub!\s)|'
+             r'(?<=^match\s)|'
+             r'(?<=^if\s)|'
+             r'(?<=^elsif\s)'
+             r')(\s*)(/)', bygroups(Text, String.Regex), 'multiline-regex'),
+            # multiline regex (in method calls or subscripts)
+            (r'(?<=\(|,|\[)/', String.Regex, 'multiline-regex'),
+            # multiline regex (this time the funny no whitespace rule)
+            (r'(\s+)(/)(?![\s=])', bygroups(Text, String.Regex),
+             'multiline-regex'),
+            # lex numbers and ignore following regular expressions which
+            # are division operators in fact (grrrr. i hate that. any
+            # better ideas?)
+            # since pygments 0.7 we also eat a "?" operator after numbers
+            # so that the char operator does not work. Chars are not allowed
+            # there so that you can use the ternary operator.
+            # stupid example:
+            #   x>=0?n[x]:""
+            (r'(0o[0-7]+(?:_[0-7]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Oct, Text, Operator)),
+            (r'(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Hex, Text, Operator)),
+            (r'(0b[01]+(?:_[01]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Bin, Text, Operator)),
+            # 3 separate expressions for floats because any of the 3 optional
+            # parts makes it a float
+            (r'((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)(?:e[+-]?[0-9]+)?'
+             r'(?:_?f[0-9]+)?)(\s*)([/?])?',
+             bygroups(Number.Float, Text, Operator)),
+            (r'((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)'
+             r'(?:_?f[0-9]+)?)(\s*)([/?])?',
+             bygroups(Number.Float, Text, Operator)),
+            (r'((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)?'
+             r'(?:_?f[0-9]+))(\s*)([/?])?',
+             bygroups(Number.Float, Text, Operator)),
+            (r'(0\b|[1-9][\d]*(?:_\d+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Integer, Text, Operator)),
+            # Names
+            (r'@@[a-zA-Z_]\w*', Name.Variable.Class),
+            (r'@[a-zA-Z_]\w*', Name.Variable.Instance),
+            (r'\$\w+', Name.Variable.Global),
+            (r'\$[!@&`\'+~=/\\,;.<>_*$?:"^-]', Name.Variable.Global),
+            (r'\$-[0adFiIlpvw]', Name.Variable.Global),
+            (r'::', Operator),
+            include('strings'),
+            # chars
+            (r'\?(\\[MC]-)*'  # modifiers
+             r'(\\([\\befnrtv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)'
+             r'(?!\w)',
+             String.Char),
+            (r'[A-Z][A-Z_]+\b', Name.Constant),
+            # macro expansion
+            (r'\{%', String.Interpol, 'in-macro-control'),
+            (r'\{\{', String.Interpol, 'in-macro-expr'),
+            # attributes
+            (r'(@\[)(\s*)([A-Z]\w*)',
+             bygroups(Operator, Text, Name.Decorator), 'in-attr'),
+            # this is needed because Crystal attributes can look
+            # like keywords (class) or like this: ` ?!?
+            (words(CRYSTAL_OPERATORS, prefix=r'(\.|::)'),
+             bygroups(Operator, Name.Operator)),
+            (r'(\.|::)([a-zA-Z_]\w*[!?]?|[*%&^`~+\-/\[<>=])',
+             bygroups(Operator, Name)),
+            # Names can end with [!?] unless it's "!="
+            (r'[a-zA-Z_]\w*(?:[!?](?!=))?', Name),
+            (r'(\[|\]\??|\*\*|<=>?|>=|<<?|>>?|=~|===|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&!^|~]=?', Operator),
+            (r'[(){};,/?:\\]', Punctuation),
+            (r'\s+', Text)
+        ],
+        'funcname': [
+            (r'(?:([a-zA-Z_]\w*)(\.))?'
+             r'([a-zA-Z_]\w*[!?]?|\*\*?|[-+]@?|'
+             r'[/%&|^`~]|\[\]=?|<<|>>|<=?>|>=?|===?)',
+             bygroups(Name.Class, Operator, Name.Function), '#pop'),
+            default('#pop')
+        ],
+        'classname': [
+            (r'[A-Z_]\w*', Name.Class),
+            (r'(\()(\s*)([A-Z_]\w*)(\s*)(\))',
+             bygroups(Punctuation, Text, Name.Class, Text, Punctuation)),
+            default('#pop')
+        ],
+        'in-intp': [
+            (r'\{', String.Interpol, '#push'),
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        'string-intp': [
+            (r'#\{', String.Interpol, 'in-intp'),
+        ],
+        'string-escaped': [
+            (r'\\([\\befnstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})', String.Escape)
+        ],
+        'string-intp-escaped': [
+            include('string-intp'),
+            include('string-escaped'),
+        ],
+        'interpolated-regex': [
+            include('string-intp'),
+            (r'[\\#]', String.Regex),
+            (r'[^\\#]+', String.Regex),
+        ],
+        'interpolated-string': [
+            include('string-intp'),
+            (r'[\\#]', String.Other),
+            (r'[^\\#]+', String.Other),
+        ],
+        'multiline-regex': [
+            include('string-intp'),
+            (r'\\\\', String.Regex),
+            (r'\\/', String.Regex),
+            (r'[\\#]', String.Regex),
+            (r'[^\\/#]+', String.Regex),
+            (r'/[imsx]*', String.Regex, '#pop'),
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ],
+        'in-macro-control': [
+            (r'\{%', String.Interpol, '#push'),
+            (r'%\}', String.Interpol, '#pop'),
+            (r'for\b|in\b', Keyword),
+            include('root'),
+        ],
+        'in-macro-expr': [
+            (r'\{\{', String.Interpol, '#push'),
+            (r'\}\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        'in-attr': [
+            (r'\[', Operator, '#push'),
+            (r'\]', Operator, '#pop'),
+            include('root'),
+        ],
+    }
+    tokens.update(gen_crystalstrings_rules())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/text.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/text.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/text.py	(revision 1126)
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.text
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for non-source code file types.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexers.configs import ApacheConfLexer, NginxConfLexer, \
+    SquidConfLexer, LighttpdConfLexer, IniLexer, RegeditLexer, PropertiesLexer
+from pygments.lexers.console import PyPyLogLexer
+from pygments.lexers.textedit import VimLexer
+from pygments.lexers.markup import BBCodeLexer, MoinWikiLexer, RstLexer, \
+    TexLexer, GroffLexer
+from pygments.lexers.installers import DebianControlLexer, SourcesListLexer
+from pygments.lexers.make import MakefileLexer, BaseMakefileLexer, CMakeLexer
+from pygments.lexers.haxe import HxmlLexer
+from pygments.lexers.diff import DiffLexer, DarcsPatchLexer
+from pygments.lexers.data import YamlLexer
+from pygments.lexers.textfmts import IrcLogsLexer, GettextLexer, HttpLexer
+
+__all__ = []
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_mapping.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_mapping.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/_mapping.py	(revision 1126)
@@ -0,0 +1,500 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers._mapping
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer mapping definitions. This file is generated by itself. Everytime
+    you change something on a builtin lexer definition, run this script from
+    the lexers folder to update it.
+
+    Do not alter the LEXERS dictionary by hand.
+
+    :copyright: Copyright 2006-2014, 2016 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+LEXERS = {
+    'ABAPLexer': ('pygments.lexers.business', 'ABAP', ('abap',), ('*.abap', '*.ABAP'), ('text/x-abap',)),
+    'APLLexer': ('pygments.lexers.apl', 'APL', ('apl',), ('*.apl',), ()),
+    'AbnfLexer': ('pygments.lexers.grammar_notation', 'ABNF', ('abnf',), ('*.abnf',), ('text/x-abnf',)),
+    'ActionScript3Lexer': ('pygments.lexers.actionscript', 'ActionScript 3', ('as3', 'actionscript3'), ('*.as',), ('application/x-actionscript3', 'text/x-actionscript3', 'text/actionscript3')),
+    'ActionScriptLexer': ('pygments.lexers.actionscript', 'ActionScript', ('as', 'actionscript'), ('*.as',), ('application/x-actionscript', 'text/x-actionscript', 'text/actionscript')),
+    'AdaLexer': ('pygments.lexers.pascal', 'Ada', ('ada', 'ada95', 'ada2005'), ('*.adb', '*.ads', '*.ada'), ('text/x-ada',)),
+    'AdlLexer': ('pygments.lexers.archetype', 'ADL', ('adl',), ('*.adl', '*.adls', '*.adlf', '*.adlx'), ()),
+    'AgdaLexer': ('pygments.lexers.haskell', 'Agda', ('agda',), ('*.agda',), ('text/x-agda',)),
+    'AheuiLexer': ('pygments.lexers.esoteric', 'Aheui', ('aheui',), ('*.aheui',), ()),
+    'AlloyLexer': ('pygments.lexers.dsls', 'Alloy', ('alloy',), ('*.als',), ('text/x-alloy',)),
+    'AmbientTalkLexer': ('pygments.lexers.ambient', 'AmbientTalk', ('at', 'ambienttalk', 'ambienttalk/2'), ('*.at',), ('text/x-ambienttalk',)),
+    'AmplLexer': ('pygments.lexers.ampl', 'Ampl', ('ampl',), ('*.run',), ()),
+    'Angular2HtmlLexer': ('pygments.lexers.templates', 'HTML + Angular2', ('html+ng2',), ('*.ng2',), ()),
+    'Angular2Lexer': ('pygments.lexers.templates', 'Angular2', ('ng2',), (), ()),
+    'AntlrActionScriptLexer': ('pygments.lexers.parsers', 'ANTLR With ActionScript Target', ('antlr-as', 'antlr-actionscript'), ('*.G', '*.g'), ()),
+    'AntlrCSharpLexer': ('pygments.lexers.parsers', 'ANTLR With C# Target', ('antlr-csharp', 'antlr-c#'), ('*.G', '*.g'), ()),
+    'AntlrCppLexer': ('pygments.lexers.parsers', 'ANTLR With CPP Target', ('antlr-cpp',), ('*.G', '*.g'), ()),
+    'AntlrJavaLexer': ('pygments.lexers.parsers', 'ANTLR With Java Target', ('antlr-java',), ('*.G', '*.g'), ()),
+    'AntlrLexer': ('pygments.lexers.parsers', 'ANTLR', ('antlr',), (), ()),
+    'AntlrObjectiveCLexer': ('pygments.lexers.parsers', 'ANTLR With ObjectiveC Target', ('antlr-objc',), ('*.G', '*.g'), ()),
+    'AntlrPerlLexer': ('pygments.lexers.parsers', 'ANTLR With Perl Target', ('antlr-perl',), ('*.G', '*.g'), ()),
+    'AntlrPythonLexer': ('pygments.lexers.parsers', 'ANTLR With Python Target', ('antlr-python',), ('*.G', '*.g'), ()),
+    'AntlrRubyLexer': ('pygments.lexers.parsers', 'ANTLR With Ruby Target', ('antlr-ruby', 'antlr-rb'), ('*.G', '*.g'), ()),
+    'ApacheConfLexer': ('pygments.lexers.configs', 'ApacheConf', ('apacheconf', 'aconf', 'apache'), ('.htaccess', 'apache.conf', 'apache2.conf'), ('text/x-apacheconf',)),
+    'AppleScriptLexer': ('pygments.lexers.scripting', 'AppleScript', ('applescript',), ('*.applescript',), ()),
+    'ArduinoLexer': ('pygments.lexers.c_like', 'Arduino', ('arduino',), ('*.ino',), ('text/x-arduino',)),
+    'AspectJLexer': ('pygments.lexers.jvm', 'AspectJ', ('aspectj',), ('*.aj',), ('text/x-aspectj',)),
+    'AsymptoteLexer': ('pygments.lexers.graphics', 'Asymptote', ('asy', 'asymptote'), ('*.asy',), ('text/x-asymptote',)),
+    'AutoItLexer': ('pygments.lexers.automation', 'AutoIt', ('autoit',), ('*.au3',), ('text/x-autoit',)),
+    'AutohotkeyLexer': ('pygments.lexers.automation', 'autohotkey', ('ahk', 'autohotkey'), ('*.ahk', '*.ahkl'), ('text/x-autohotkey',)),
+    'AwkLexer': ('pygments.lexers.textedit', 'Awk', ('awk', 'gawk', 'mawk', 'nawk'), ('*.awk',), ('application/x-awk',)),
+    'BBCodeLexer': ('pygments.lexers.markup', 'BBCode', ('bbcode',), (), ('text/x-bbcode',)),
+    'BCLexer': ('pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()),
+    'BSTLexer': ('pygments.lexers.bibtex', 'BST', ('bst', 'bst-pybtex'), ('*.bst',), ()),
+    'BaseMakefileLexer': ('pygments.lexers.make', 'Base Makefile', ('basemake',), (), ()),
+    'BashLexer': ('pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript')),
+    'BashSessionLexer': ('pygments.lexers.shell', 'Bash Session', ('console', 'shell-session'), ('*.sh-session', '*.shell-session'), ('application/x-shell-session', 'application/x-sh-session')),
+    'BatchLexer': ('pygments.lexers.shell', 'Batchfile', ('bat', 'batch', 'dosbatch', 'winbatch'), ('*.bat', '*.cmd'), ('application/x-dos-batch',)),
+    'BefungeLexer': ('pygments.lexers.esoteric', 'Befunge', ('befunge',), ('*.befunge',), ('application/x-befunge',)),
+    'BibTeXLexer': ('pygments.lexers.bibtex', 'BibTeX', ('bib', 'bibtex'), ('*.bib',), ('text/x-bibtex',)),
+    'BlitzBasicLexer': ('pygments.lexers.basic', 'BlitzBasic', ('blitzbasic', 'b3d', 'bplus'), ('*.bb', '*.decls'), ('text/x-bb',)),
+    'BlitzMaxLexer': ('pygments.lexers.basic', 'BlitzMax', ('blitzmax', 'bmax'), ('*.bmx',), ('text/x-bmx',)),
+    'BnfLexer': ('pygments.lexers.grammar_notation', 'BNF', ('bnf',), ('*.bnf',), ('text/x-bnf',)),
+    'BooLexer': ('pygments.lexers.dotnet', 'Boo', ('boo',), ('*.boo',), ('text/x-boo',)),
+    'BoogieLexer': ('pygments.lexers.verification', 'Boogie', ('boogie',), ('*.bpl',), ()),
+    'BrainfuckLexer': ('pygments.lexers.esoteric', 'Brainfuck', ('brainfuck', 'bf'), ('*.bf', '*.b'), ('application/x-brainfuck',)),
+    'BroLexer': ('pygments.lexers.dsls', 'Bro', ('bro',), ('*.bro',), ()),
+    'BugsLexer': ('pygments.lexers.modeling', 'BUGS', ('bugs', 'winbugs', 'openbugs'), ('*.bug',), ()),
+    'CAmkESLexer': ('pygments.lexers.esoteric', 'CAmkES', ('camkes', 'idl4'), ('*.camkes', '*.idl4'), ()),
+    'CLexer': ('pygments.lexers.c_cpp', 'C', ('c',), ('*.c', '*.h', '*.idc'), ('text/x-chdr', 'text/x-csrc')),
+    'CMakeLexer': ('pygments.lexers.make', 'CMake', ('cmake',), ('*.cmake', 'CMakeLists.txt'), ('text/x-cmake',)),
+    'CObjdumpLexer': ('pygments.lexers.asm', 'c-objdump', ('c-objdump',), ('*.c-objdump',), ('text/x-c-objdump',)),
+    'CPSALexer': ('pygments.lexers.lisp', 'CPSA', ('cpsa',), ('*.cpsa',), ()),
+    'CSharpAspxLexer': ('pygments.lexers.dotnet', 'aspx-cs', ('aspx-cs',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()),
+    'CSharpLexer': ('pygments.lexers.dotnet', 'C#', ('csharp', 'c#'), ('*.cs',), ('text/x-csharp',)),
+    'Ca65Lexer': ('pygments.lexers.asm', 'ca65 assembler', ('ca65',), ('*.s',), ()),
+    'CadlLexer': ('pygments.lexers.archetype', 'cADL', ('cadl',), ('*.cadl',), ()),
+    'CapDLLexer': ('pygments.lexers.esoteric', 'CapDL', ('capdl',), ('*.cdl',), ()),
+    'CapnProtoLexer': ('pygments.lexers.capnproto', "Cap'n Proto", ('capnp',), ('*.capnp',), ()),
+    'CbmBasicV2Lexer': ('pygments.lexers.basic', 'CBM BASIC V2', ('cbmbas',), ('*.bas',), ()),
+    'CeylonLexer': ('pygments.lexers.jvm', 'Ceylon', ('ceylon',), ('*.ceylon',), ('text/x-ceylon',)),
+    'Cfengine3Lexer': ('pygments.lexers.configs', 'CFEngine3', ('cfengine3', 'cf3'), ('*.cf',), ()),
+    'ChaiscriptLexer': ('pygments.lexers.scripting', 'ChaiScript', ('chai', 'chaiscript'), ('*.chai',), ('text/x-chaiscript', 'application/x-chaiscript')),
+    'ChapelLexer': ('pygments.lexers.chapel', 'Chapel', ('chapel', 'chpl'), ('*.chpl',), ()),
+    'CheetahHtmlLexer': ('pygments.lexers.templates', 'HTML+Cheetah', ('html+cheetah', 'html+spitfire', 'htmlcheetah'), (), ('text/html+cheetah', 'text/html+spitfire')),
+    'CheetahJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Cheetah', ('js+cheetah', 'javascript+cheetah', 'js+spitfire', 'javascript+spitfire'), (), ('application/x-javascript+cheetah', 'text/x-javascript+cheetah', 'text/javascript+cheetah', 'application/x-javascript+spitfire', 'text/x-javascript+spitfire', 'text/javascript+spitfire')),
+    'CheetahLexer': ('pygments.lexers.templates', 'Cheetah', ('cheetah', 'spitfire'), ('*.tmpl', '*.spt'), ('application/x-cheetah', 'application/x-spitfire')),
+    'CheetahXmlLexer': ('pygments.lexers.templates', 'XML+Cheetah', ('xml+cheetah', 'xml+spitfire'), (), ('application/xml+cheetah', 'application/xml+spitfire')),
+    'CirruLexer': ('pygments.lexers.webmisc', 'Cirru', ('cirru',), ('*.cirru',), ('text/x-cirru',)),
+    'ClayLexer': ('pygments.lexers.c_like', 'Clay', ('clay',), ('*.clay',), ('text/x-clay',)),
+    'CleanLexer': ('pygments.lexers.clean', 'Clean', ('clean',), ('*.icl', '*.dcl'), ()),
+    'ClojureLexer': ('pygments.lexers.jvm', 'Clojure', ('clojure', 'clj'), ('*.clj',), ('text/x-clojure', 'application/x-clojure')),
+    'ClojureScriptLexer': ('pygments.lexers.jvm', 'ClojureScript', ('clojurescript', 'cljs'), ('*.cljs',), ('text/x-clojurescript', 'application/x-clojurescript')),
+    'CobolFreeformatLexer': ('pygments.lexers.business', 'COBOLFree', ('cobolfree',), ('*.cbl', '*.CBL'), ()),
+    'CobolLexer': ('pygments.lexers.business', 'COBOL', ('cobol',), ('*.cob', '*.COB', '*.cpy', '*.CPY'), ('text/x-cobol',)),
+    'CoffeeScriptLexer': ('pygments.lexers.javascript', 'CoffeeScript', ('coffee-script', 'coffeescript', 'coffee'), ('*.coffee',), ('text/coffeescript',)),
+    'ColdfusionCFCLexer': ('pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()),
+    'ColdfusionHtmlLexer': ('pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)),
+    'ColdfusionLexer': ('pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()),
+    'CommonLispLexer': ('pygments.lexers.lisp', 'Common Lisp', ('common-lisp', 'cl', 'lisp'), ('*.cl', '*.lisp'), ('text/x-common-lisp',)),
+    'ComponentPascalLexer': ('pygments.lexers.oberon', 'Component Pascal', ('componentpascal', 'cp'), ('*.cp', '*.cps'), ('text/x-component-pascal',)),
+    'CoqLexer': ('pygments.lexers.theorem', 'Coq', ('coq',), ('*.v',), ('text/x-coq',)),
+    'CppLexer': ('pygments.lexers.c_cpp', 'C++', ('cpp', 'c++'), ('*.cpp', '*.hpp', '*.c++', '*.h++', '*.cc', '*.hh', '*.cxx', '*.hxx', '*.C', '*.H', '*.cp', '*.CPP'), ('text/x-c++hdr', 'text/x-c++src')),
+    'CppObjdumpLexer': ('pygments.lexers.asm', 'cpp-objdump', ('cpp-objdump', 'c++-objdumb', 'cxx-objdump'), ('*.cpp-objdump', '*.c++-objdump', '*.cxx-objdump'), ('text/x-cpp-objdump',)),
+    'CrmshLexer': ('pygments.lexers.dsls', 'Crmsh', ('crmsh', 'pcmk'), ('*.crmsh', '*.pcmk'), ()),
+    'CrocLexer': ('pygments.lexers.d', 'Croc', ('croc',), ('*.croc',), ('text/x-crocsrc',)),
+    'CryptolLexer': ('pygments.lexers.haskell', 'Cryptol', ('cryptol', 'cry'), ('*.cry',), ('text/x-cryptol',)),
+    'CrystalLexer': ('pygments.lexers.crystal', 'Crystal', ('cr', 'crystal'), ('*.cr',), ('text/x-crystal',)),
+    'CsoundDocumentLexer': ('pygments.lexers.csound', 'Csound Document', ('csound-document', 'csound-csd'), ('*.csd',), ()),
+    'CsoundOrchestraLexer': ('pygments.lexers.csound', 'Csound Orchestra', ('csound', 'csound-orc'), ('*.orc',), ()),
+    'CsoundScoreLexer': ('pygments.lexers.csound', 'Csound Score', ('csound-score', 'csound-sco'), ('*.sco',), ()),
+    'CssDjangoLexer': ('pygments.lexers.templates', 'CSS+Django/Jinja', ('css+django', 'css+jinja'), (), ('text/css+django', 'text/css+jinja')),
+    'CssErbLexer': ('pygments.lexers.templates', 'CSS+Ruby', ('css+erb', 'css+ruby'), (), ('text/css+ruby',)),
+    'CssGenshiLexer': ('pygments.lexers.templates', 'CSS+Genshi Text', ('css+genshitext', 'css+genshi'), (), ('text/css+genshi',)),
+    'CssLexer': ('pygments.lexers.css', 'CSS', ('css',), ('*.css',), ('text/css',)),
+    'CssPhpLexer': ('pygments.lexers.templates', 'CSS+PHP', ('css+php',), (), ('text/css+php',)),
+    'CssSmartyLexer': ('pygments.lexers.templates', 'CSS+Smarty', ('css+smarty',), (), ('text/css+smarty',)),
+    'CudaLexer': ('pygments.lexers.c_like', 'CUDA', ('cuda', 'cu'), ('*.cu', '*.cuh'), ('text/x-cuda',)),
+    'CypherLexer': ('pygments.lexers.graph', 'Cypher', ('cypher',), ('*.cyp', '*.cypher'), ()),
+    'CythonLexer': ('pygments.lexers.python', 'Cython', ('cython', 'pyx', 'pyrex'), ('*.pyx', '*.pxd', '*.pxi'), ('text/x-cython', 'application/x-cython')),
+    'DLexer': ('pygments.lexers.d', 'D', ('d',), ('*.d', '*.di'), ('text/x-dsrc',)),
+    'DObjdumpLexer': ('pygments.lexers.asm', 'd-objdump', ('d-objdump',), ('*.d-objdump',), ('text/x-d-objdump',)),
+    'DarcsPatchLexer': ('pygments.lexers.diff', 'Darcs Patch', ('dpatch',), ('*.dpatch', '*.darcspatch'), ()),
+    'DartLexer': ('pygments.lexers.javascript', 'Dart', ('dart',), ('*.dart',), ('text/x-dart',)),
+    'DebianControlLexer': ('pygments.lexers.installers', 'Debian Control file', ('control', 'debcontrol'), ('control',), ()),
+    'DelphiLexer': ('pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)),
+    'DgLexer': ('pygments.lexers.python', 'dg', ('dg',), ('*.dg',), ('text/x-dg',)),
+    'DiffLexer': ('pygments.lexers.diff', 'Diff', ('diff', 'udiff'), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')),
+    'DjangoLexer': ('pygments.lexers.templates', 'Django/Jinja', ('django', 'jinja'), (), ('application/x-django-templating', 'application/x-jinja')),
+    'DockerLexer': ('pygments.lexers.configs', 'Docker', ('docker', 'dockerfile'), ('Dockerfile', '*.docker'), ('text/x-dockerfile-config',)),
+    'DtdLexer': ('pygments.lexers.html', 'DTD', ('dtd',), ('*.dtd',), ('application/xml-dtd',)),
+    'DuelLexer': ('pygments.lexers.webmisc', 'Duel', ('duel', 'jbst', 'jsonml+bst'), ('*.duel', '*.jbst'), ('text/x-duel', 'text/x-jbst')),
+    'DylanConsoleLexer': ('pygments.lexers.dylan', 'Dylan session', ('dylan-console', 'dylan-repl'), ('*.dylan-console',), ('text/x-dylan-console',)),
+    'DylanLexer': ('pygments.lexers.dylan', 'Dylan', ('dylan',), ('*.dylan', '*.dyl', '*.intr'), ('text/x-dylan',)),
+    'DylanLidLexer': ('pygments.lexers.dylan', 'DylanLID', ('dylan-lid', 'lid'), ('*.lid', '*.hdp'), ('text/x-dylan-lid',)),
+    'ECLLexer': ('pygments.lexers.ecl', 'ECL', ('ecl',), ('*.ecl',), ('application/x-ecl',)),
+    'ECLexer': ('pygments.lexers.c_like', 'eC', ('ec',), ('*.ec', '*.eh'), ('text/x-echdr', 'text/x-ecsrc')),
+    'EarlGreyLexer': ('pygments.lexers.javascript', 'Earl Grey', ('earl-grey', 'earlgrey', 'eg'), ('*.eg',), ('text/x-earl-grey',)),
+    'EasytrieveLexer': ('pygments.lexers.scripting', 'Easytrieve', ('easytrieve',), ('*.ezt', '*.mac'), ('text/x-easytrieve',)),
+    'EbnfLexer': ('pygments.lexers.parsers', 'EBNF', ('ebnf',), ('*.ebnf',), ('text/x-ebnf',)),
+    'EiffelLexer': ('pygments.lexers.eiffel', 'Eiffel', ('eiffel',), ('*.e',), ('text/x-eiffel',)),
+    'ElixirConsoleLexer': ('pygments.lexers.erlang', 'Elixir iex session', ('iex',), (), ('text/x-elixir-shellsession',)),
+    'ElixirLexer': ('pygments.lexers.erlang', 'Elixir', ('elixir', 'ex', 'exs'), ('*.ex', '*.exs'), ('text/x-elixir',)),
+    'ElmLexer': ('pygments.lexers.elm', 'Elm', ('elm',), ('*.elm',), ('text/x-elm',)),
+    'EmacsLispLexer': ('pygments.lexers.lisp', 'EmacsLisp', ('emacs', 'elisp', 'emacs-lisp'), ('*.el',), ('text/x-elisp', 'application/x-elisp')),
+    'ErbLexer': ('pygments.lexers.templates', 'ERB', ('erb',), (), ('application/x-ruby-templating',)),
+    'ErlangLexer': ('pygments.lexers.erlang', 'Erlang', ('erlang',), ('*.erl', '*.hrl', '*.es', '*.escript'), ('text/x-erlang',)),
+    'ErlangShellLexer': ('pygments.lexers.erlang', 'Erlang erl session', ('erl',), ('*.erl-sh',), ('text/x-erl-shellsession',)),
+    'EvoqueHtmlLexer': ('pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), ('*.html',), ('text/html+evoque',)),
+    'EvoqueLexer': ('pygments.lexers.templates', 'Evoque', ('evoque',), ('*.evoque',), ('application/x-evoque',)),
+    'EvoqueXmlLexer': ('pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), ('*.xml',), ('application/xml+evoque',)),
+    'EzhilLexer': ('pygments.lexers.ezhil', 'Ezhil', ('ezhil',), ('*.n',), ('text/x-ezhil',)),
+    'FSharpLexer': ('pygments.lexers.dotnet', 'FSharp', ('fsharp',), ('*.fs', '*.fsi'), ('text/x-fsharp',)),
+    'FactorLexer': ('pygments.lexers.factor', 'Factor', ('factor',), ('*.factor',), ('text/x-factor',)),
+    'FancyLexer': ('pygments.lexers.ruby', 'Fancy', ('fancy', 'fy'), ('*.fy', '*.fancypack'), ('text/x-fancysrc',)),
+    'FantomLexer': ('pygments.lexers.fantom', 'Fantom', ('fan',), ('*.fan',), ('application/x-fantom',)),
+    'FelixLexer': ('pygments.lexers.felix', 'Felix', ('felix', 'flx'), ('*.flx', '*.flxh'), ('text/x-felix',)),
+    'FishShellLexer': ('pygments.lexers.shell', 'Fish', ('fish', 'fishshell'), ('*.fish', '*.load'), ('application/x-fish',)),
+    'FlatlineLexer': ('pygments.lexers.dsls', 'Flatline', ('flatline',), (), ('text/x-flatline',)),
+    'ForthLexer': ('pygments.lexers.forth', 'Forth', ('forth',), ('*.frt', '*.fs'), ('application/x-forth',)),
+    'FortranFixedLexer': ('pygments.lexers.fortran', 'FortranFixed', ('fortranfixed',), ('*.f', '*.F'), ()),
+    'FortranLexer': ('pygments.lexers.fortran', 'Fortran', ('fortran',), ('*.f03', '*.f90', '*.F03', '*.F90'), ('text/x-fortran',)),
+    'FoxProLexer': ('pygments.lexers.foxpro', 'FoxPro', ('foxpro', 'vfp', 'clipper', 'xbase'), ('*.PRG', '*.prg'), ()),
+    'GAPLexer': ('pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()),
+    'GLShaderLexer': ('pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)),
+    'GasLexer': ('pygments.lexers.asm', 'GAS', ('gas', 'asm'), ('*.s', '*.S'), ('text/x-gas',)),
+    'GenshiLexer': ('pygments.lexers.templates', 'Genshi', ('genshi', 'kid', 'xml+genshi', 'xml+kid'), ('*.kid',), ('application/x-genshi', 'application/x-kid')),
+    'GenshiTextLexer': ('pygments.lexers.templates', 'Genshi Text', ('genshitext',), (), ('application/x-genshi-text', 'text/x-genshi')),
+    'GettextLexer': ('pygments.lexers.textfmts', 'Gettext Catalog', ('pot', 'po'), ('*.pot', '*.po'), ('application/x-gettext', 'text/x-gettext', 'text/gettext')),
+    'GherkinLexer': ('pygments.lexers.testing', 'Gherkin', ('cucumber', 'gherkin'), ('*.feature',), ('text/x-gherkin',)),
+    'GnuplotLexer': ('pygments.lexers.graphics', 'Gnuplot', ('gnuplot',), ('*.plot', '*.plt'), ('text/x-gnuplot',)),
+    'GoLexer': ('pygments.lexers.go', 'Go', ('go',), ('*.go',), ('text/x-gosrc',)),
+    'GoloLexer': ('pygments.lexers.jvm', 'Golo', ('golo',), ('*.golo',), ()),
+    'GoodDataCLLexer': ('pygments.lexers.business', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)),
+    'GosuLexer': ('pygments.lexers.jvm', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp', '*.vark'), ('text/x-gosu',)),
+    'GosuTemplateLexer': ('pygments.lexers.jvm', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)),
+    'GroffLexer': ('pygments.lexers.markup', 'Groff', ('groff', 'nroff', 'man'), ('*.[1234567]', '*.man'), ('application/x-troff', 'text/troff')),
+    'GroovyLexer': ('pygments.lexers.jvm', 'Groovy', ('groovy',), ('*.groovy', '*.gradle'), ('text/x-groovy',)),
+    'HamlLexer': ('pygments.lexers.html', 'Haml', ('haml',), ('*.haml',), ('text/x-haml',)),
+    'HandlebarsHtmlLexer': ('pygments.lexers.templates', 'HTML+Handlebars', ('html+handlebars',), ('*.handlebars', '*.hbs'), ('text/html+handlebars', 'text/x-handlebars-template')),
+    'HandlebarsLexer': ('pygments.lexers.templates', 'Handlebars', ('handlebars',), (), ()),
+    'HaskellLexer': ('pygments.lexers.haskell', 'Haskell', ('haskell', 'hs'), ('*.hs',), ('text/x-haskell',)),
+    'HaxeLexer': ('pygments.lexers.haxe', 'Haxe', ('hx', 'haxe', 'hxsl'), ('*.hx', '*.hxsl'), ('text/haxe', 'text/x-haxe', 'text/x-hx')),
+    'HexdumpLexer': ('pygments.lexers.hexdump', 'Hexdump', ('hexdump',), (), ()),
+    'HsailLexer': ('pygments.lexers.asm', 'HSAIL', ('hsail', 'hsa'), ('*.hsail',), ('text/x-hsail',)),
+    'HtmlDjangoLexer': ('pygments.lexers.templates', 'HTML+Django/Jinja', ('html+django', 'html+jinja', 'htmldjango'), (), ('text/html+django', 'text/html+jinja')),
+    'HtmlGenshiLexer': ('pygments.lexers.templates', 'HTML+Genshi', ('html+genshi', 'html+kid'), (), ('text/html+genshi',)),
+    'HtmlLexer': ('pygments.lexers.html', 'HTML', ('html',), ('*.html', '*.htm', '*.xhtml', '*.xslt'), ('text/html', 'application/xhtml+xml')),
+    'HtmlPhpLexer': ('pygments.lexers.templates', 'HTML+PHP', ('html+php',), ('*.phtml',), ('application/x-php', 'application/x-httpd-php', 'application/x-httpd-php3', 'application/x-httpd-php4', 'application/x-httpd-php5')),
+    'HtmlSmartyLexer': ('pygments.lexers.templates', 'HTML+Smarty', ('html+smarty',), (), ('text/html+smarty',)),
+    'HttpLexer': ('pygments.lexers.textfmts', 'HTTP', ('http',), (), ()),
+    'HxmlLexer': ('pygments.lexers.haxe', 'Hxml', ('haxeml', 'hxml'), ('*.hxml',), ()),
+    'HyLexer': ('pygments.lexers.lisp', 'Hy', ('hylang',), ('*.hy',), ('text/x-hy', 'application/x-hy')),
+    'HybrisLexer': ('pygments.lexers.scripting', 'Hybris', ('hybris', 'hy'), ('*.hy', '*.hyb'), ('text/x-hybris', 'application/x-hybris')),
+    'IDLLexer': ('pygments.lexers.idl', 'IDL', ('idl',), ('*.pro',), ('text/idl',)),
+    'IdrisLexer': ('pygments.lexers.haskell', 'Idris', ('idris', 'idr'), ('*.idr',), ('text/x-idris',)),
+    'IgorLexer': ('pygments.lexers.igor', 'Igor', ('igor', 'igorpro'), ('*.ipf',), ('text/ipf',)),
+    'Inform6Lexer': ('pygments.lexers.int_fiction', 'Inform 6', ('inform6', 'i6'), ('*.inf',), ()),
+    'Inform6TemplateLexer': ('pygments.lexers.int_fiction', 'Inform 6 template', ('i6t',), ('*.i6t',), ()),
+    'Inform7Lexer': ('pygments.lexers.int_fiction', 'Inform 7', ('inform7', 'i7'), ('*.ni', '*.i7x'), ()),
+    'IniLexer': ('pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf'), ('text/x-ini', 'text/inf')),
+    'IoLexer': ('pygments.lexers.iolang', 'Io', ('io',), ('*.io',), ('text/x-iosrc',)),
+    'IokeLexer': ('pygments.lexers.jvm', 'Ioke', ('ioke', 'ik'), ('*.ik',), ('text/x-iokesrc',)),
+    'IrcLogsLexer': ('pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)),
+    'IsabelleLexer': ('pygments.lexers.theorem', 'Isabelle', ('isabelle',), ('*.thy',), ('text/x-isabelle',)),
+    'JLexer': ('pygments.lexers.j', 'J', ('j',), ('*.ijs',), ('text/x-j',)),
+    'JagsLexer': ('pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()),
+    'JasminLexer': ('pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()),
+    'JavaLexer': ('pygments.lexers.jvm', 'Java', ('java',), ('*.java',), ('text/x-java',)),
+    'JavascriptDjangoLexer': ('pygments.lexers.templates', 'JavaScript+Django/Jinja', ('js+django', 'javascript+django', 'js+jinja', 'javascript+jinja'), (), ('application/x-javascript+django', 'application/x-javascript+jinja', 'text/x-javascript+django', 'text/x-javascript+jinja', 'text/javascript+django', 'text/javascript+jinja')),
+    'JavascriptErbLexer': ('pygments.lexers.templates', 'JavaScript+Ruby', ('js+erb', 'javascript+erb', 'js+ruby', 'javascript+ruby'), (), ('application/x-javascript+ruby', 'text/x-javascript+ruby', 'text/javascript+ruby')),
+    'JavascriptGenshiLexer': ('pygments.lexers.templates', 'JavaScript+Genshi Text', ('js+genshitext', 'js+genshi', 'javascript+genshitext', 'javascript+genshi'), (), ('application/x-javascript+genshi', 'text/x-javascript+genshi', 'text/javascript+genshi')),
+    'JavascriptLexer': ('pygments.lexers.javascript', 'JavaScript', ('js', 'javascript'), ('*.js', '*.jsm'), ('application/javascript', 'application/x-javascript', 'text/x-javascript', 'text/javascript')),
+    'JavascriptPhpLexer': ('pygments.lexers.templates', 'JavaScript+PHP', ('js+php', 'javascript+php'), (), ('application/x-javascript+php', 'text/x-javascript+php', 'text/javascript+php')),
+    'JavascriptSmartyLexer': ('pygments.lexers.templates', 'JavaScript+Smarty', ('js+smarty', 'javascript+smarty'), (), ('application/x-javascript+smarty', 'text/x-javascript+smarty', 'text/javascript+smarty')),
+    'JclLexer': ('pygments.lexers.scripting', 'JCL', ('jcl',), ('*.jcl',), ('text/x-jcl',)),
+    'JsgfLexer': ('pygments.lexers.grammar_notation', 'JSGF', ('jsgf',), ('*.jsgf',), ('application/jsgf', 'application/x-jsgf', 'text/jsgf')),
+    'JsonBareObjectLexer': ('pygments.lexers.data', 'JSONBareObject', ('json-object',), (), ('application/json-object',)),
+    'JsonLdLexer': ('pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)),
+    'JsonLexer': ('pygments.lexers.data', 'JSON', ('json',), ('*.json',), ('application/json',)),
+    'JspLexer': ('pygments.lexers.templates', 'Java Server Page', ('jsp',), ('*.jsp',), ('application/x-jsp',)),
+    'JuliaConsoleLexer': ('pygments.lexers.julia', 'Julia console', ('jlcon',), (), ()),
+    'JuliaLexer': ('pygments.lexers.julia', 'Julia', ('julia', 'jl'), ('*.jl',), ('text/x-julia', 'application/x-julia')),
+    'JuttleLexer': ('pygments.lexers.javascript', 'Juttle', ('juttle', 'juttle'), ('*.juttle',), ('application/juttle', 'application/x-juttle', 'text/x-juttle', 'text/juttle')),
+    'KalLexer': ('pygments.lexers.javascript', 'Kal', ('kal',), ('*.kal',), ('text/kal', 'application/kal')),
+    'KconfigLexer': ('pygments.lexers.configs', 'Kconfig', ('kconfig', 'menuconfig', 'linux-config', 'kernel-config'), ('Kconfig', '*Config.in*', 'external.in*', 'standard-modules.in'), ('text/x-kconfig',)),
+    'KokaLexer': ('pygments.lexers.haskell', 'Koka', ('koka',), ('*.kk', '*.kki'), ('text/x-koka',)),
+    'KotlinLexer': ('pygments.lexers.jvm', 'Kotlin', ('kotlin',), ('*.kt',), ('text/x-kotlin',)),
+    'LSLLexer': ('pygments.lexers.scripting', 'LSL', ('lsl',), ('*.lsl',), ('text/x-lsl',)),
+    'LassoCssLexer': ('pygments.lexers.templates', 'CSS+Lasso', ('css+lasso',), (), ('text/css+lasso',)),
+    'LassoHtmlLexer': ('pygments.lexers.templates', 'HTML+Lasso', ('html+lasso',), (), ('text/html+lasso', 'application/x-httpd-lasso', 'application/x-httpd-lasso[89]')),
+    'LassoJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Lasso', ('js+lasso', 'javascript+lasso'), (), ('application/x-javascript+lasso', 'text/x-javascript+lasso', 'text/javascript+lasso')),
+    'LassoLexer': ('pygments.lexers.javascript', 'Lasso', ('lasso', 'lassoscript'), ('*.lasso', '*.lasso[89]'), ('text/x-lasso',)),
+    'LassoXmlLexer': ('pygments.lexers.templates', 'XML+Lasso', ('xml+lasso',), (), ('application/xml+lasso',)),
+    'LeanLexer': ('pygments.lexers.theorem', 'Lean', ('lean',), ('*.lean',), ('text/x-lean',)),
+    'LessCssLexer': ('pygments.lexers.css', 'LessCss', ('less',), ('*.less',), ('text/x-less-css',)),
+    'LighttpdConfLexer': ('pygments.lexers.configs', 'Lighttpd configuration file', ('lighty', 'lighttpd'), (), ('text/x-lighttpd-conf',)),
+    'LimboLexer': ('pygments.lexers.inferno', 'Limbo', ('limbo',), ('*.b',), ('text/limbo',)),
+    'LiquidLexer': ('pygments.lexers.templates', 'liquid', ('liquid',), ('*.liquid',), ()),
+    'LiterateAgdaLexer': ('pygments.lexers.haskell', 'Literate Agda', ('lagda', 'literate-agda'), ('*.lagda',), ('text/x-literate-agda',)),
+    'LiterateCryptolLexer': ('pygments.lexers.haskell', 'Literate Cryptol', ('lcry', 'literate-cryptol', 'lcryptol'), ('*.lcry',), ('text/x-literate-cryptol',)),
+    'LiterateHaskellLexer': ('pygments.lexers.haskell', 'Literate Haskell', ('lhs', 'literate-haskell', 'lhaskell'), ('*.lhs',), ('text/x-literate-haskell',)),
+    'LiterateIdrisLexer': ('pygments.lexers.haskell', 'Literate Idris', ('lidr', 'literate-idris', 'lidris'), ('*.lidr',), ('text/x-literate-idris',)),
+    'LiveScriptLexer': ('pygments.lexers.javascript', 'LiveScript', ('live-script', 'livescript'), ('*.ls',), ('text/livescript',)),
+    'LlvmLexer': ('pygments.lexers.asm', 'LLVM', ('llvm',), ('*.ll',), ('text/x-llvm',)),
+    'LogosLexer': ('pygments.lexers.objective', 'Logos', ('logos',), ('*.x', '*.xi', '*.xm', '*.xmi'), ('text/x-logos',)),
+    'LogtalkLexer': ('pygments.lexers.prolog', 'Logtalk', ('logtalk',), ('*.lgt', '*.logtalk'), ('text/x-logtalk',)),
+    'LuaLexer': ('pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')),
+    'MOOCodeLexer': ('pygments.lexers.scripting', 'MOOCode', ('moocode', 'moo'), ('*.moo',), ('text/x-moocode',)),
+    'MSDOSSessionLexer': ('pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), ()),
+    'MakefileLexer': ('pygments.lexers.make', 'Makefile', ('make', 'makefile', 'mf', 'bsdmake'), ('*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'), ('text/x-makefile',)),
+    'MakoCssLexer': ('pygments.lexers.templates', 'CSS+Mako', ('css+mako',), (), ('text/css+mako',)),
+    'MakoHtmlLexer': ('pygments.lexers.templates', 'HTML+Mako', ('html+mako',), (), ('text/html+mako',)),
+    'MakoJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Mako', ('js+mako', 'javascript+mako'), (), ('application/x-javascript+mako', 'text/x-javascript+mako', 'text/javascript+mako')),
+    'MakoLexer': ('pygments.lexers.templates', 'Mako', ('mako',), ('*.mao',), ('application/x-mako',)),
+    'MakoXmlLexer': ('pygments.lexers.templates', 'XML+Mako', ('xml+mako',), (), ('application/xml+mako',)),
+    'MaqlLexer': ('pygments.lexers.business', 'MAQL', ('maql',), ('*.maql',), ('text/x-gooddata-maql', 'application/x-gooddata-maql')),
+    'MarkdownLexer': ('pygments.lexers.markup', 'markdown', ('md',), ('*.md',), ('text/x-markdown',)),
+    'MaskLexer': ('pygments.lexers.javascript', 'Mask', ('mask',), ('*.mask',), ('text/x-mask',)),
+    'MasonLexer': ('pygments.lexers.templates', 'Mason', ('mason',), ('*.m', '*.mhtml', '*.mc', '*.mi', 'autohandler', 'dhandler'), ('application/x-mason',)),
+    'MathematicaLexer': ('pygments.lexers.algebra', 'Mathematica', ('mathematica', 'mma', 'nb'), ('*.nb', '*.cdf', '*.nbp', '*.ma'), ('application/mathematica', 'application/vnd.wolfram.mathematica', 'application/vnd.wolfram.mathematica.package', 'application/vnd.wolfram.cdf')),
+    'MatlabLexer': ('pygments.lexers.matlab', 'Matlab', ('matlab',), ('*.m',), ('text/matlab',)),
+    'MatlabSessionLexer': ('pygments.lexers.matlab', 'Matlab session', ('matlabsession',), (), ()),
+    'MiniDLexer': ('pygments.lexers.d', 'MiniD', ('minid',), (), ('text/x-minidsrc',)),
+    'ModelicaLexer': ('pygments.lexers.modeling', 'Modelica', ('modelica',), ('*.mo',), ('text/x-modelica',)),
+    'Modula2Lexer': ('pygments.lexers.modula2', 'Modula-2', ('modula2', 'm2'), ('*.def', '*.mod'), ('text/x-modula2',)),
+    'MoinWikiLexer': ('pygments.lexers.markup', 'MoinMoin/Trac Wiki markup', ('trac-wiki', 'moin'), (), ('text/x-trac-wiki',)),
+    'MonkeyLexer': ('pygments.lexers.basic', 'Monkey', ('monkey',), ('*.monkey',), ('text/x-monkey',)),
+    'MonteLexer': ('pygments.lexers.monte', 'Monte', ('monte',), ('*.mt',), ()),
+    'MoonScriptLexer': ('pygments.lexers.scripting', 'MoonScript', ('moon', 'moonscript'), ('*.moon',), ('text/x-moonscript', 'application/x-moonscript')),
+    'MozPreprocCssLexer': ('pygments.lexers.markup', 'CSS+mozpreproc', ('css+mozpreproc',), ('*.css.in',), ()),
+    'MozPreprocHashLexer': ('pygments.lexers.markup', 'mozhashpreproc', ('mozhashpreproc',), (), ()),
+    'MozPreprocJavascriptLexer': ('pygments.lexers.markup', 'Javascript+mozpreproc', ('javascript+mozpreproc',), ('*.js.in',), ()),
+    'MozPreprocPercentLexer': ('pygments.lexers.markup', 'mozpercentpreproc', ('mozpercentpreproc',), (), ()),
+    'MozPreprocXulLexer': ('pygments.lexers.markup', 'XUL+mozpreproc', ('xul+mozpreproc',), ('*.xul.in',), ()),
+    'MqlLexer': ('pygments.lexers.c_like', 'MQL', ('mql', 'mq4', 'mq5', 'mql4', 'mql5'), ('*.mq4', '*.mq5', '*.mqh'), ('text/x-mql',)),
+    'MscgenLexer': ('pygments.lexers.dsls', 'Mscgen', ('mscgen', 'msc'), ('*.msc',), ()),
+    'MuPADLexer': ('pygments.lexers.algebra', 'MuPAD', ('mupad',), ('*.mu',), ()),
+    'MxmlLexer': ('pygments.lexers.actionscript', 'MXML', ('mxml',), ('*.mxml',), ()),
+    'MySqlLexer': ('pygments.lexers.sql', 'MySQL', ('mysql',), (), ('text/x-mysql',)),
+    'MyghtyCssLexer': ('pygments.lexers.templates', 'CSS+Myghty', ('css+myghty',), (), ('text/css+myghty',)),
+    'MyghtyHtmlLexer': ('pygments.lexers.templates', 'HTML+Myghty', ('html+myghty',), (), ('text/html+myghty',)),
+    'MyghtyJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Myghty', ('js+myghty', 'javascript+myghty'), (), ('application/x-javascript+myghty', 'text/x-javascript+myghty', 'text/javascript+mygthy')),
+    'MyghtyLexer': ('pygments.lexers.templates', 'Myghty', ('myghty',), ('*.myt', 'autodelegate'), ('application/x-myghty',)),
+    'MyghtyXmlLexer': ('pygments.lexers.templates', 'XML+Myghty', ('xml+myghty',), (), ('application/xml+myghty',)),
+    'NCLLexer': ('pygments.lexers.ncl', 'NCL', ('ncl',), ('*.ncl',), ('text/ncl',)),
+    'NSISLexer': ('pygments.lexers.installers', 'NSIS', ('nsis', 'nsi', 'nsh'), ('*.nsi', '*.nsh'), ('text/x-nsis',)),
+    'NasmLexer': ('pygments.lexers.asm', 'NASM', ('nasm',), ('*.asm', '*.ASM'), ('text/x-nasm',)),
+    'NasmObjdumpLexer': ('pygments.lexers.asm', 'objdump-nasm', ('objdump-nasm',), ('*.objdump-intel',), ('text/x-nasm-objdump',)),
+    'NemerleLexer': ('pygments.lexers.dotnet', 'Nemerle', ('nemerle',), ('*.n',), ('text/x-nemerle',)),
+    'NesCLexer': ('pygments.lexers.c_like', 'nesC', ('nesc',), ('*.nc',), ('text/x-nescsrc',)),
+    'NewLispLexer': ('pygments.lexers.lisp', 'NewLisp', ('newlisp',), ('*.lsp', '*.nl', '*.kif'), ('text/x-newlisp', 'application/x-newlisp')),
+    'NewspeakLexer': ('pygments.lexers.smalltalk', 'Newspeak', ('newspeak',), ('*.ns2',), ('text/x-newspeak',)),
+    'NginxConfLexer': ('pygments.lexers.configs', 'Nginx configuration file', ('nginx',), ('nginx.conf',), ('text/x-nginx-conf',)),
+    'NimrodLexer': ('pygments.lexers.nimrod', 'Nimrod', ('nim', 'nimrod'), ('*.nim', '*.nimrod'), ('text/x-nim',)),
+    'NitLexer': ('pygments.lexers.nit', 'Nit', ('nit',), ('*.nit',), ()),
+    'NixLexer': ('pygments.lexers.nix', 'Nix', ('nixos', 'nix'), ('*.nix',), ('text/x-nix',)),
+    'NuSMVLexer': ('pygments.lexers.smv', 'NuSMV', ('nusmv',), ('*.smv',), ()),
+    'NumPyLexer': ('pygments.lexers.python', 'NumPy', ('numpy',), (), ()),
+    'ObjdumpLexer': ('pygments.lexers.asm', 'objdump', ('objdump',), ('*.objdump',), ('text/x-objdump',)),
+    'ObjectiveCLexer': ('pygments.lexers.objective', 'Objective-C', ('objective-c', 'objectivec', 'obj-c', 'objc'), ('*.m', '*.h'), ('text/x-objective-c',)),
+    'ObjectiveCppLexer': ('pygments.lexers.objective', 'Objective-C++', ('objective-c++', 'objectivec++', 'obj-c++', 'objc++'), ('*.mm', '*.hh'), ('text/x-objective-c++',)),
+    'ObjectiveJLexer': ('pygments.lexers.javascript', 'Objective-J', ('objective-j', 'objectivej', 'obj-j', 'objj'), ('*.j',), ('text/x-objective-j',)),
+    'OcamlLexer': ('pygments.lexers.ml', 'OCaml', ('ocaml',), ('*.ml', '*.mli', '*.mll', '*.mly'), ('text/x-ocaml',)),
+    'OctaveLexer': ('pygments.lexers.matlab', 'Octave', ('octave',), ('*.m',), ('text/octave',)),
+    'OdinLexer': ('pygments.lexers.archetype', 'ODIN', ('odin',), ('*.odin',), ('text/odin',)),
+    'OocLexer': ('pygments.lexers.ooc', 'Ooc', ('ooc',), ('*.ooc',), ('text/x-ooc',)),
+    'OpaLexer': ('pygments.lexers.ml', 'Opa', ('opa',), ('*.opa',), ('text/x-opa',)),
+    'OpenEdgeLexer': ('pygments.lexers.business', 'OpenEdge ABL', ('openedge', 'abl', 'progress'), ('*.p', '*.cls'), ('text/x-openedge', 'application/x-openedge')),
+    'PacmanConfLexer': ('pygments.lexers.configs', 'PacmanConf', ('pacmanconf',), ('pacman.conf',), ()),
+    'PanLexer': ('pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()),
+    'ParaSailLexer': ('pygments.lexers.parasail', 'ParaSail', ('parasail',), ('*.psi', '*.psl'), ('text/x-parasail',)),
+    'PawnLexer': ('pygments.lexers.pawn', 'Pawn', ('pawn',), ('*.p', '*.pwn', '*.inc'), ('text/x-pawn',)),
+    'Perl6Lexer': ('pygments.lexers.perl', 'Perl6', ('perl6', 'pl6'), ('*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6', '*.6pm', '*.p6m', '*.pm6', '*.t'), ('text/x-perl6', 'application/x-perl6')),
+    'PerlLexer': ('pygments.lexers.perl', 'Perl', ('perl', 'pl'), ('*.pl', '*.pm', '*.t'), ('text/x-perl', 'application/x-perl')),
+    'PhpLexer': ('pygments.lexers.php', 'PHP', ('php', 'php3', 'php4', 'php5'), ('*.php', '*.php[345]', '*.inc'), ('text/x-php',)),
+    'PigLexer': ('pygments.lexers.jvm', 'Pig', ('pig',), ('*.pig',), ('text/x-pig',)),
+    'PikeLexer': ('pygments.lexers.c_like', 'Pike', ('pike',), ('*.pike', '*.pmod'), ('text/x-pike',)),
+    'PkgConfigLexer': ('pygments.lexers.configs', 'PkgConfig', ('pkgconfig',), ('*.pc',), ()),
+    'PlPgsqlLexer': ('pygments.lexers.sql', 'PL/pgSQL', ('plpgsql',), (), ('text/x-plpgsql',)),
+    'PostScriptLexer': ('pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)),
+    'PostgresConsoleLexer': ('pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)),
+    'PostgresLexer': ('pygments.lexers.sql', 'PostgreSQL SQL dialect', ('postgresql', 'postgres'), (), ('text/x-postgresql',)),
+    'PovrayLexer': ('pygments.lexers.graphics', 'POVRay', ('pov',), ('*.pov', '*.inc'), ('text/x-povray',)),
+    'PowerShellLexer': ('pygments.lexers.shell', 'PowerShell', ('powershell', 'posh', 'ps1', 'psm1'), ('*.ps1', '*.psm1'), ('text/x-powershell',)),
+    'PowerShellSessionLexer': ('pygments.lexers.shell', 'PowerShell Session', ('ps1con',), (), ()),
+    'PraatLexer': ('pygments.lexers.praat', 'Praat', ('praat',), ('*.praat', '*.proc', '*.psc'), ()),
+    'PrologLexer': ('pygments.lexers.prolog', 'Prolog', ('prolog',), ('*.ecl', '*.prolog', '*.pro', '*.pl'), ('text/x-prolog',)),
+    'PropertiesLexer': ('pygments.lexers.configs', 'Properties', ('properties', 'jproperties'), ('*.properties',), ('text/x-java-properties',)),
+    'ProtoBufLexer': ('pygments.lexers.dsls', 'Protocol Buffer', ('protobuf', 'proto'), ('*.proto',), ()),
+    'PugLexer': ('pygments.lexers.html', 'Pug', ('pug', 'jade'), ('*.pug', '*.jade'), ('text/x-pug', 'text/x-jade')),
+    'PuppetLexer': ('pygments.lexers.dsls', 'Puppet', ('puppet',), ('*.pp',), ()),
+    'PyPyLogLexer': ('pygments.lexers.console', 'PyPy Log', ('pypylog', 'pypy'), ('*.pypylog',), ('application/x-pypylog',)),
+    'Python3Lexer': ('pygments.lexers.python', 'Python 3', ('python3', 'py3'), (), ('text/x-python3', 'application/x-python3')),
+    'Python3TracebackLexer': ('pygments.lexers.python', 'Python 3.0 Traceback', ('py3tb',), ('*.py3tb',), ('text/x-python3-traceback',)),
+    'PythonConsoleLexer': ('pygments.lexers.python', 'Python console session', ('pycon',), (), ('text/x-python-doctest',)),
+    'PythonLexer': ('pygments.lexers.python', 'Python', ('python', 'py', 'sage'), ('*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac', '*.sage'), ('text/x-python', 'application/x-python')),
+    'PythonTracebackLexer': ('pygments.lexers.python', 'Python Traceback', ('pytb',), ('*.pytb',), ('text/x-python-traceback',)),
+    'QBasicLexer': ('pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)),
+    'QVToLexer': ('pygments.lexers.qvt', 'QVTO', ('qvto', 'qvt'), ('*.qvto',), ()),
+    'QmlLexer': ('pygments.lexers.webmisc', 'QML', ('qml', 'qbs'), ('*.qml', '*.qbs'), ('application/x-qml', 'application/x-qt.qbs+qml')),
+    'RConsoleLexer': ('pygments.lexers.r', 'RConsole', ('rconsole', 'rout'), ('*.Rout',), ()),
+    'RNCCompactLexer': ('pygments.lexers.rnc', 'Relax-NG Compact', ('rnc', 'rng-compact'), ('*.rnc',), ()),
+    'RPMSpecLexer': ('pygments.lexers.installers', 'RPMSpec', ('spec',), ('*.spec',), ('text/x-rpm-spec',)),
+    'RacketLexer': ('pygments.lexers.lisp', 'Racket', ('racket', 'rkt'), ('*.rkt', '*.rktd', '*.rktl'), ('text/x-racket', 'application/x-racket')),
+    'RagelCLexer': ('pygments.lexers.parsers', 'Ragel in C Host', ('ragel-c',), ('*.rl',), ()),
+    'RagelCppLexer': ('pygments.lexers.parsers', 'Ragel in CPP Host', ('ragel-cpp',), ('*.rl',), ()),
+    'RagelDLexer': ('pygments.lexers.parsers', 'Ragel in D Host', ('ragel-d',), ('*.rl',), ()),
+    'RagelEmbeddedLexer': ('pygments.lexers.parsers', 'Embedded Ragel', ('ragel-em',), ('*.rl',), ()),
+    'RagelJavaLexer': ('pygments.lexers.parsers', 'Ragel in Java Host', ('ragel-java',), ('*.rl',), ()),
+    'RagelLexer': ('pygments.lexers.parsers', 'Ragel', ('ragel',), (), ()),
+    'RagelObjectiveCLexer': ('pygments.lexers.parsers', 'Ragel in Objective C Host', ('ragel-objc',), ('*.rl',), ()),
+    'RagelRubyLexer': ('pygments.lexers.parsers', 'Ragel in Ruby Host', ('ragel-ruby', 'ragel-rb'), ('*.rl',), ()),
+    'RawTokenLexer': ('pygments.lexers.special', 'Raw token data', ('raw',), (), ('application/x-pygments-tokens',)),
+    'RdLexer': ('pygments.lexers.r', 'Rd', ('rd',), ('*.Rd',), ('text/x-r-doc',)),
+    'RebolLexer': ('pygments.lexers.rebol', 'REBOL', ('rebol',), ('*.r', '*.r3', '*.reb'), ('text/x-rebol',)),
+    'RedLexer': ('pygments.lexers.rebol', 'Red', ('red', 'red/system'), ('*.red', '*.reds'), ('text/x-red', 'text/x-red-system')),
+    'RedcodeLexer': ('pygments.lexers.esoteric', 'Redcode', ('redcode',), ('*.cw',), ()),
+    'RegeditLexer': ('pygments.lexers.configs', 'reg', ('registry',), ('*.reg',), ('text/x-windows-registry',)),
+    'ResourceLexer': ('pygments.lexers.resource', 'ResourceBundle', ('resource', 'resourcebundle'), ('*.txt',), ()),
+    'RexxLexer': ('pygments.lexers.scripting', 'Rexx', ('rexx', 'arexx'), ('*.rexx', '*.rex', '*.rx', '*.arexx'), ('text/x-rexx',)),
+    'RhtmlLexer': ('pygments.lexers.templates', 'RHTML', ('rhtml', 'html+erb', 'html+ruby'), ('*.rhtml',), ('text/html+ruby',)),
+    'RoboconfGraphLexer': ('pygments.lexers.roboconf', 'Roboconf Graph', ('roboconf-graph',), ('*.graph',), ()),
+    'RoboconfInstancesLexer': ('pygments.lexers.roboconf', 'Roboconf Instances', ('roboconf-instances',), ('*.instances',), ()),
+    'RobotFrameworkLexer': ('pygments.lexers.robotframework', 'RobotFramework', ('robotframework',), ('*.txt', '*.robot'), ('text/x-robotframework',)),
+    'RqlLexer': ('pygments.lexers.sql', 'RQL', ('rql',), ('*.rql',), ('text/x-rql',)),
+    'RslLexer': ('pygments.lexers.dsls', 'RSL', ('rsl',), ('*.rsl',), ('text/rsl',)),
+    'RstLexer': ('pygments.lexers.markup', 'reStructuredText', ('rst', 'rest', 'restructuredtext'), ('*.rst', '*.rest'), ('text/x-rst', 'text/prs.fallenstein.rst')),
+    'RtsLexer': ('pygments.lexers.trafficscript', 'TrafficScript', ('rts', 'trafficscript'), ('*.rts',), ()),
+    'RubyConsoleLexer': ('pygments.lexers.ruby', 'Ruby irb session', ('rbcon', 'irb'), (), ('text/x-ruby-shellsession',)),
+    'RubyLexer': ('pygments.lexers.ruby', 'Ruby', ('rb', 'ruby', 'duby'), ('*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec', '*.rbx', '*.duby', 'Gemfile'), ('text/x-ruby', 'application/x-ruby')),
+    'RustLexer': ('pygments.lexers.rust', 'Rust', ('rust',), ('*.rs', '*.rs.in'), ('text/rust',)),
+    'SASLexer': ('pygments.lexers.sas', 'SAS', ('sas',), ('*.SAS', '*.sas'), ('text/x-sas', 'text/sas', 'application/x-sas')),
+    'SLexer': ('pygments.lexers.r', 'S', ('splus', 's', 'r'), ('*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron'), ('text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r', 'text/x-R', 'text/x-r-history', 'text/x-r-profile')),
+    'SMLLexer': ('pygments.lexers.ml', 'Standard ML', ('sml',), ('*.sml', '*.sig', '*.fun'), ('text/x-standardml', 'application/x-standardml')),
+    'SassLexer': ('pygments.lexers.css', 'Sass', ('sass',), ('*.sass',), ('text/x-sass',)),
+    'ScalaLexer': ('pygments.lexers.jvm', 'Scala', ('scala',), ('*.scala',), ('text/x-scala',)),
+    'ScamlLexer': ('pygments.lexers.html', 'Scaml', ('scaml',), ('*.scaml',), ('text/x-scaml',)),
+    'SchemeLexer': ('pygments.lexers.lisp', 'Scheme', ('scheme', 'scm'), ('*.scm', '*.ss'), ('text/x-scheme', 'application/x-scheme')),
+    'ScilabLexer': ('pygments.lexers.matlab', 'Scilab', ('scilab',), ('*.sci', '*.sce', '*.tst'), ('text/scilab',)),
+    'ScssLexer': ('pygments.lexers.css', 'SCSS', ('scss',), ('*.scss',), ('text/x-scss',)),
+    'ShenLexer': ('pygments.lexers.lisp', 'Shen', ('shen',), ('*.shen',), ('text/x-shen', 'application/x-shen')),
+    'SilverLexer': ('pygments.lexers.verification', 'Silver', ('silver',), ('*.sil', '*.vpr'), ()),
+    'SlimLexer': ('pygments.lexers.webmisc', 'Slim', ('slim',), ('*.slim',), ('text/x-slim',)),
+    'SmaliLexer': ('pygments.lexers.dalvik', 'Smali', ('smali',), ('*.smali',), ('text/smali',)),
+    'SmalltalkLexer': ('pygments.lexers.smalltalk', 'Smalltalk', ('smalltalk', 'squeak', 'st'), ('*.st',), ('text/x-smalltalk',)),
+    'SmartyLexer': ('pygments.lexers.templates', 'Smarty', ('smarty',), ('*.tpl',), ('application/x-smarty',)),
+    'SnobolLexer': ('pygments.lexers.snobol', 'Snobol', ('snobol',), ('*.snobol',), ('text/x-snobol',)),
+    'SnowballLexer': ('pygments.lexers.dsls', 'Snowball', ('snowball',), ('*.sbl',), ()),
+    'SourcePawnLexer': ('pygments.lexers.pawn', 'SourcePawn', ('sp',), ('*.sp',), ('text/x-sourcepawn',)),
+    'SourcesListLexer': ('pygments.lexers.installers', 'Debian Sourcelist', ('sourceslist', 'sources.list', 'debsources'), ('sources.list',), ()),
+    'SparqlLexer': ('pygments.lexers.rdf', 'SPARQL', ('sparql',), ('*.rq', '*.sparql'), ('application/sparql-query',)),
+    'SqlLexer': ('pygments.lexers.sql', 'SQL', ('sql',), ('*.sql',), ('text/x-sql',)),
+    'SqliteConsoleLexer': ('pygments.lexers.sql', 'sqlite3con', ('sqlite3',), ('*.sqlite3-console',), ('text/x-sqlite3-console',)),
+    'SquidConfLexer': ('pygments.lexers.configs', 'SquidConf', ('squidconf', 'squid.conf', 'squid'), ('squid.conf',), ('text/x-squidconf',)),
+    'SspLexer': ('pygments.lexers.templates', 'Scalate Server Page', ('ssp',), ('*.ssp',), ('application/x-ssp',)),
+    'StanLexer': ('pygments.lexers.modeling', 'Stan', ('stan',), ('*.stan',), ()),
+    'StataLexer': ('pygments.lexers.stata', 'Stata', ('stata', 'do'), ('*.do', '*.ado'), ('text/x-stata', 'text/stata', 'application/x-stata')),
+    'SuperColliderLexer': ('pygments.lexers.supercollider', 'SuperCollider', ('sc', 'supercollider'), ('*.sc', '*.scd'), ('application/supercollider', 'text/supercollider')),
+    'SwiftLexer': ('pygments.lexers.objective', 'Swift', ('swift',), ('*.swift',), ('text/x-swift',)),
+    'SwigLexer': ('pygments.lexers.c_like', 'SWIG', ('swig',), ('*.swg', '*.i'), ('text/swig',)),
+    'SystemVerilogLexer': ('pygments.lexers.hdl', 'systemverilog', ('systemverilog', 'sv'), ('*.sv', '*.svh'), ('text/x-systemverilog',)),
+    'TAPLexer': ('pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()),
+    'Tads3Lexer': ('pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()),
+    'TasmLexer': ('pygments.lexers.asm', 'TASM', ('tasm',), ('*.asm', '*.ASM', '*.tasm'), ('text/x-tasm',)),
+    'TclLexer': ('pygments.lexers.tcl', 'Tcl', ('tcl',), ('*.tcl', '*.rvt'), ('text/x-tcl', 'text/x-script.tcl', 'application/x-tcl')),
+    'TcshLexer': ('pygments.lexers.shell', 'Tcsh', ('tcsh', 'csh'), ('*.tcsh', '*.csh'), ('application/x-csh',)),
+    'TcshSessionLexer': ('pygments.lexers.shell', 'Tcsh Session', ('tcshcon',), (), ()),
+    'TeaTemplateLexer': ('pygments.lexers.templates', 'Tea', ('tea',), ('*.tea',), ('text/x-tea',)),
+    'TermcapLexer': ('pygments.lexers.configs', 'Termcap', ('termcap',), ('termcap', 'termcap.src'), ()),
+    'TerminfoLexer': ('pygments.lexers.configs', 'Terminfo', ('terminfo',), ('terminfo', 'terminfo.src'), ()),
+    'TerraformLexer': ('pygments.lexers.configs', 'Terraform', ('terraform', 'tf'), ('*.tf',), ('application/x-tf', 'application/x-terraform')),
+    'TexLexer': ('pygments.lexers.markup', 'TeX', ('tex', 'latex'), ('*.tex', '*.aux', '*.toc'), ('text/x-tex', 'text/x-latex')),
+    'TextLexer': ('pygments.lexers.special', 'Text only', ('text',), ('*.txt',), ('text/plain',)),
+    'ThriftLexer': ('pygments.lexers.dsls', 'Thrift', ('thrift',), ('*.thrift',), ('application/x-thrift',)),
+    'TodotxtLexer': ('pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)),
+    'TransactSqlLexer': ('pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)),
+    'TreetopLexer': ('pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()),
+    'TurtleLexer': ('pygments.lexers.rdf', 'Turtle', ('turtle',), ('*.ttl',), ('text/turtle', 'application/x-turtle')),
+    'TwigHtmlLexer': ('pygments.lexers.templates', 'HTML+Twig', ('html+twig',), ('*.twig',), ('text/html+twig',)),
+    'TwigLexer': ('pygments.lexers.templates', 'Twig', ('twig',), (), ('application/x-twig',)),
+    'TypeScriptLexer': ('pygments.lexers.javascript', 'TypeScript', ('ts', 'typescript'), ('*.ts',), ('text/x-typescript',)),
+    'TypoScriptCssDataLexer': ('pygments.lexers.typoscript', 'TypoScriptCssData', ('typoscriptcssdata',), (), ()),
+    'TypoScriptHtmlDataLexer': ('pygments.lexers.typoscript', 'TypoScriptHtmlData', ('typoscripthtmldata',), (), ()),
+    'TypoScriptLexer': ('pygments.lexers.typoscript', 'TypoScript', ('typoscript',), ('*.ts', '*.txt'), ('text/x-typoscript',)),
+    'UrbiscriptLexer': ('pygments.lexers.urbi', 'UrbiScript', ('urbiscript',), ('*.u',), ('application/x-urbiscript',)),
+    'VCLLexer': ('pygments.lexers.varnish', 'VCL', ('vcl',), ('*.vcl',), ('text/x-vclsrc',)),
+    'VCLSnippetLexer': ('pygments.lexers.varnish', 'VCLSnippets', ('vclsnippets', 'vclsnippet'), (), ('text/x-vclsnippet',)),
+    'VCTreeStatusLexer': ('pygments.lexers.console', 'VCTreeStatus', ('vctreestatus',), (), ()),
+    'VGLLexer': ('pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()),
+    'ValaLexer': ('pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)),
+    'VbNetAspxLexer': ('pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()),
+    'VbNetLexer': ('pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')),
+    'VelocityHtmlLexer': ('pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)),
+    'VelocityLexer': ('pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()),
+    'VelocityXmlLexer': ('pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)),
+    'VerilogLexer': ('pygments.lexers.hdl', 'verilog', ('verilog', 'v'), ('*.v',), ('text/x-verilog',)),
+    'VhdlLexer': ('pygments.lexers.hdl', 'vhdl', ('vhdl',), ('*.vhdl', '*.vhd'), ('text/x-vhdl',)),
+    'VimLexer': ('pygments.lexers.textedit', 'VimL', ('vim',), ('*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'), ('text/x-vim',)),
+    'WDiffLexer': ('pygments.lexers.diff', 'WDiff', ('wdiff',), ('*.wdiff',), ()),
+    'WhileyLexer': ('pygments.lexers.whiley', 'Whiley', ('whiley',), ('*.whiley',), ('text/x-whiley',)),
+    'X10Lexer': ('pygments.lexers.x10', 'X10', ('x10', 'xten'), ('*.x10',), ('text/x-x10',)),
+    'XQueryLexer': ('pygments.lexers.webmisc', 'XQuery', ('xquery', 'xqy', 'xq', 'xql', 'xqm'), ('*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm'), ('text/xquery', 'application/xquery')),
+    'XmlDjangoLexer': ('pygments.lexers.templates', 'XML+Django/Jinja', ('xml+django', 'xml+jinja'), (), ('application/xml+django', 'application/xml+jinja')),
+    'XmlErbLexer': ('pygments.lexers.templates', 'XML+Ruby', ('xml+erb', 'xml+ruby'), (), ('application/xml+ruby',)),
+    'XmlLexer': ('pygments.lexers.html', 'XML', ('xml',), ('*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd', '*.wsdl', '*.wsf'), ('text/xml', 'application/xml', 'image/svg+xml', 'application/rss+xml', 'application/atom+xml')),
+    'XmlPhpLexer': ('pygments.lexers.templates', 'XML+PHP', ('xml+php',), (), ('application/xml+php',)),
+    'XmlSmartyLexer': ('pygments.lexers.templates', 'XML+Smarty', ('xml+smarty',), (), ('application/xml+smarty',)),
+    'XsltLexer': ('pygments.lexers.html', 'XSLT', ('xslt',), ('*.xsl', '*.xslt', '*.xpl'), ('application/xsl+xml', 'application/xslt+xml')),
+    'XtendLexer': ('pygments.lexers.jvm', 'Xtend', ('xtend',), ('*.xtend',), ('text/x-xtend',)),
+    'XtlangLexer': ('pygments.lexers.lisp', 'xtlang', ('extempore',), ('*.xtm',), ()),
+    'YamlJinjaLexer': ('pygments.lexers.templates', 'YAML+Jinja', ('yaml+jinja', 'salt', 'sls'), ('*.sls',), ('text/x-yaml+jinja', 'text/x-sls')),
+    'YamlLexer': ('pygments.lexers.data', 'YAML', ('yaml',), ('*.yaml', '*.yml'), ('text/x-yaml',)),
+    'ZephirLexer': ('pygments.lexers.php', 'Zephir', ('zephir',), ('*.zep',), ()),
+}
+
+if __name__ == '__main__':  # pragma: no cover
+    import sys
+    import os
+
+    # lookup lexers
+    found_lexers = []
+    sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
+    for root, dirs, files in os.walk('.'):
+        for filename in files:
+            if filename.endswith('.py') and not filename.startswith('_'):
+                module_name = 'pygments.lexers%s.%s' % (
+                    root[1:].replace('/', '.'), filename[:-3])
+                print(module_name)
+                module = __import__(module_name, None, None, [''])
+                for lexer_name in module.__all__:
+                    lexer = getattr(module, lexer_name)
+                    found_lexers.append(
+                        '%r: %r' % (lexer_name,
+                                    (module_name,
+                                     lexer.name,
+                                     tuple(lexer.aliases),
+                                     tuple(lexer.filenames),
+                                     tuple(lexer.mimetypes))))
+    # sort them to make the diff minimal
+    found_lexers.sort()
+
+    # extract useful sourcecode from this file
+    with open(__file__) as fp:
+        content = fp.read()
+        # replace crnl to nl for Windows.
+        #
+        # Note that, originally, contributers should keep nl of master
+        # repository, for example by using some kind of automatic
+        # management EOL, like `EolExtension
+        #  <https://www.mercurial-scm.org/wiki/EolExtension>`.
+        content = content.replace("\r\n", "\n")
+    header = content[:content.find('LEXERS = {')]
+    footer = content[content.find("if __name__ == '__main__':"):]
+
+    # write new file
+    with open(__file__, 'w') as fp:
+        fp.write(header)
+        fp.write('LEXERS = {\n    %s,\n}\n\n' % ',\n    '.join(found_lexers))
+        fp.write(footer)
+
+    print ('=== %d lexers processed.' % len(found_lexers))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/chapel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/chapel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/chapel.py	(revision 1126)
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.chapel
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Chapel language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['ChapelLexer']
+
+
+class ChapelLexer(RegexLexer):
+    """
+    For `Chapel <http://chapel.cray.com/>`_ source.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Chapel'
+    filenames = ['*.chpl']
+    aliases = ['chapel', 'chpl']
+    # mimetypes = ['text/x-chapel']
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),
+
+            (r'//(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+
+            (r'(config|const|in|inout|out|param|ref|type|var)\b',
+             Keyword.Declaration),
+            (r'(false|nil|true)\b', Keyword.Constant),
+            (r'(bool|complex|imag|int|opaque|range|real|string|uint)\b',
+             Keyword.Type),
+            (words((
+                'align', 'as', 'atomic', 'begin', 'break', 'by', 'cobegin',
+                'coforall', 'continue', 'delete', 'dmapped', 'do', 'domain',
+                'else', 'enum', 'except', 'export', 'extern', 'for', 'forall',
+                'if', 'index', 'inline', 'iter', 'label', 'lambda', 'let',
+                'local', 'new', 'noinit', 'on', 'only', 'otherwise', 'pragma',
+                'private', 'public', 'reduce', 'require', 'return', 'scan',
+                'select', 'serial', 'single', 'sparse', 'subdomain', 'sync',
+                'then', 'use', 'when', 'where', 'while', 'with', 'yield',
+                'zip'), suffix=r'\b'),
+             Keyword),
+            (r'(proc)((?:\s)+)', bygroups(Keyword, Text), 'procname'),
+            (r'(class|module|record|union)(\s+)', bygroups(Keyword, Text),
+             'classname'),
+
+            # imaginary integers
+            (r'\d+i', Number),
+            (r'\d+\.\d*([Ee][-+]\d+)?i', Number),
+            (r'\.\d+([Ee][-+]\d+)?i', Number),
+            (r'\d+[Ee][-+]\d+i', Number),
+
+            # reals cannot end with a period due to lexical ambiguity with
+            # .. operator. See reference for rationale.
+            (r'(\d*\.\d+)([eE][+-]?[0-9]+)?i?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+i?', Number.Float),
+
+            # integer literals
+            # -- binary
+            (r'0[bB][01]+', Number.Bin),
+            # -- hex
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            # -- octal
+            (r'0[oO][0-7]+', Number.Oct),
+            # -- decimal
+            (r'[0-9]+', Number.Integer),
+
+            # strings
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'(\\\\|\\'|[^'])*'", String),
+
+            # tokens
+            (r'(=|\+=|-=|\*=|/=|\*\*=|%=|&=|\|=|\^=|&&=|\|\|=|<<=|>>=|'
+             r'<=>|<~>|\.\.|by|#|\.\.\.|'
+             r'&&|\|\||!|&|\||\^|~|<<|>>|'
+             r'==|!=|<=|>=|<|>|'
+             r'[+\-*/%]|\*\*)', Operator),
+            (r'[:;,.?()\[\]{}]', Punctuation),
+
+            # identifiers
+            (r'[a-zA-Z_][\w$]*', Name.Other),
+        ],
+        'classname': [
+            (r'[a-zA-Z_][\w$]*', Name.Class, '#pop'),
+        ],
+        'procname': [
+            (r'([a-zA-Z_][\w$]+|\~[a-zA-Z_][\w$]+|[+*/!~%<>=&^|\-]{1,2})',
+             Name.Function, '#pop'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rust.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rust.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/rust.py	(revision 1126)
@@ -0,0 +1,220 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.rust
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Rust language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['RustLexer']
+
+
+class RustLexer(RegexLexer):
+    """
+    Lexer for the Rust programming language (version 1.10).
+
+    .. versionadded:: 1.6
+    """
+    name = 'Rust'
+    filenames = ['*.rs', '*.rs.in']
+    aliases = ['rust']
+    mimetypes = ['text/rust']
+
+    keyword_types = (
+        words(('u8', 'u16', 'u32', 'u64', 'i8', 'i16', 'i32', 'i64',
+               'usize', 'isize', 'f32', 'f64', 'str', 'bool'),
+              suffix=r'\b'),
+        Keyword.Type)
+
+    builtin_types = (words((
+        # Reexported core operators
+        'Copy', 'Send', 'Sized', 'Sync',
+        'Drop', 'Fn', 'FnMut', 'FnOnce',
+
+        # Reexported types and traits
+        'Box',
+        'ToOwned',
+        'Clone',
+        'PartialEq', 'PartialOrd', 'Eq', 'Ord',
+        'AsRef', 'AsMut', 'Into', 'From',
+        'Default',
+        'Iterator', 'Extend', 'IntoIterator',
+        'DoubleEndedIterator', 'ExactSizeIterator',
+        'Option',
+        'Some', 'None',
+        'Result',
+        'Ok', 'Err',
+        'SliceConcatExt',
+        'String', 'ToString',
+        'Vec'), suffix=r'\b'),
+        Name.Builtin)
+
+    tokens = {
+        'root': [
+            # rust allows a file to start with a shebang, but if the first line
+            # starts with #![ then it’s not a shebang but a crate attribute.
+            (r'#![^[\r\n].*$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            # Whitespace and Comments
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'//!.*?\n', String.Doc),
+            (r'///(\n|[^/].*?\n)', String.Doc),
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*\*(\n|[^/*])', String.Doc, 'doccomment'),
+            (r'/\*!', String.Doc, 'doccomment'),
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # Macro parameters
+            (r"""\$([a-zA-Z_]\w*|\(,?|\),?|,?)""", Comment.Preproc),
+            # Keywords
+            (words((
+                'as', 'box', 'const', 'crate', 'else', 'extern',
+                'for', 'if', 'impl', 'in', 'loop', 'match', 'move',
+                'mut', 'pub', 'ref', 'return', 'static', 'super',
+                'trait', 'unsafe', 'use', 'where', 'while'), suffix=r'\b'),
+             Keyword),
+            (words(('abstract', 'alignof', 'become', 'do', 'final', 'macro',
+                    'offsetof', 'override', 'priv', 'proc', 'pure', 'sizeof',
+                    'typeof', 'unsized', 'virtual', 'yield'), suffix=r'\b'),
+             Keyword.Reserved),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'mod\b', Keyword, 'modname'),
+            (r'let\b', Keyword.Declaration),
+            (r'fn\b', Keyword, 'funcname'),
+            (r'(struct|enum|type|union)\b', Keyword, 'typename'),
+            (r'(default)(\s+)(type|fn)\b', bygroups(Keyword, Text, Keyword)),
+            keyword_types,
+            (r'self\b', Name.Builtin.Pseudo),
+            # Prelude (taken from Rust’s src/libstd/prelude.rs)
+            builtin_types,
+            # Path seperators, so types don't catch them.
+            (r'::\b', Text),
+            # Types in positions.
+            (r'(?::|->)', Text, 'typename'),
+            # Labels
+            (r'(break|continue)(\s*)(\'[A-Za-z_]\w*)?',
+             bygroups(Keyword, Text.Whitespace, Name.Label)),
+            # Character Literal
+            (r"""'(\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
+             String.Char),
+            (r"""b'(\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
+             String.Char),
+            # Binary Literal
+            (r'0b[01_]+', Number.Bin, 'number_lit'),
+            # Octal Literal
+            (r'0o[0-7_]+', Number.Oct, 'number_lit'),
+            # Hexadecimal Literal
+            (r'0[xX][0-9a-fA-F_]+', Number.Hex, 'number_lit'),
+            # Decimal Literal
+            (r'[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*(?!\.)|[eE][+\-]?[0-9_]+)', Number.Float,
+             'number_lit'),
+            (r'[0-9][0-9_]*', Number.Integer, 'number_lit'),
+            # String Literal
+            (r'b"', String, 'bytestring'),
+            (r'"', String, 'string'),
+            (r'b?r(#*)".*?"\1', String),
+
+            # Lifetime
+            (r"""'static""", Name.Builtin),
+            (r"""'[a-zA-Z_]\w*""", Name.Attribute),
+
+            # Operators and Punctuation
+            (r'[{}()\[\],.;]', Punctuation),
+            (r'[+\-*/%&|<>^!~@=:?]', Operator),
+
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name),
+
+            # Attributes
+            (r'#!?\[', Comment.Preproc, 'attribute['),
+            # Macros
+            (r'([A-Za-z_]\w*)(!)(\s*)([A-Za-z_]\w*)?(\s*)(\{)',
+             bygroups(Comment.Preproc, Punctuation, Whitespace, Name,
+                      Whitespace, Punctuation), 'macro{'),
+            (r'([A-Za-z_]\w*)(!)(\s*)([A-Za-z_]\w*)?(\()',
+             bygroups(Comment.Preproc, Punctuation, Whitespace, Name,
+                      Punctuation), 'macro('),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'doccomment': [
+            (r'[^*/]+', String.Doc),
+            (r'/\*', String.Doc, '#push'),
+            (r'\*/', String.Doc, '#pop'),
+            (r'[*/]', String.Doc),
+        ],
+        'modname': [
+            (r'\s+', Text),
+            (r'[a-zA-Z_]\w*', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'funcname': [
+            (r'\s+', Text),
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop'),
+            default('#pop'),
+        ],
+        'typename': [
+            (r'\s+', Text),
+            (r'&', Keyword.Pseudo),
+            builtin_types,
+            keyword_types,
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'number_lit': [
+            (r'[ui](8|16|32|64|size)', Keyword, '#pop'),
+            (r'f(32|64)', Keyword, '#pop'),
+            default('#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r"""\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}""", String.Escape),
+            (r'[^\\"]+', String),
+            (r'\\', String),
+        ],
+        'bytestring': [
+            (r"""\\x[89a-fA-F][0-9a-fA-F]""", String.Escape),
+            include('string'),
+        ],
+        'macro{': [
+            (r'\{', Operator, '#push'),
+            (r'\}', Operator, '#pop'),
+        ],
+        'macro(': [
+            (r'\(', Operator, '#push'),
+            (r'\)', Operator, '#pop'),
+        ],
+        'attribute_common': [
+            (r'"', String, 'string'),
+            (r'\[', Comment.Preproc, 'attribute['),
+            (r'\(', Comment.Preproc, 'attribute('),
+        ],
+        'attribute[': [
+            include('attribute_common'),
+            (r'\];?', Comment.Preproc, '#pop'),
+            (r'[^"\]]+', Comment.Preproc),
+        ],
+        'attribute(': [
+            include('attribute_common'),
+            (r'\);?', Comment.Preproc, '#pop'),
+            (r'[^")]+', Comment.Preproc),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nix.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nix.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/nix.py	(revision 1126)
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.nix
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the NixOS Nix language.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['NixLexer']
+
+
+class NixLexer(RegexLexer):
+    """
+    For the `Nix language <http://nixos.org/nix/>`_.
+
+    .. versionadded:: 2.0
+    """
+
+    name = 'Nix'
+    aliases = ['nixos', 'nix']
+    filenames = ['*.nix']
+    mimetypes = ['text/x-nix']
+
+    flags = re.MULTILINE | re.UNICODE
+
+    keywords = ['rec', 'with', 'let', 'in', 'inherit', 'assert', 'if',
+                'else', 'then', '...']
+    builtins = ['import', 'abort', 'baseNameOf', 'dirOf', 'isNull', 'builtins',
+                'map', 'removeAttrs', 'throw', 'toString', 'derivation']
+    operators = ['++', '+', '?', '.', '!', '//', '==',
+                 '!=', '&&', '||', '->', '=']
+
+    punctuations = ["(", ")", "[", "]", ";", "{", "}", ":", ",", "@"]
+
+    tokens = {
+        'root': [
+            # comments starting with #
+            (r'#.*$', Comment.Single),
+
+            # multiline comments
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # whitespace
+            (r'\s+', Text),
+
+            # keywords
+            ('(%s)' % '|'.join(re.escape(entry) + '\\b' for entry in keywords), Keyword),
+
+            # highlight the builtins
+            ('(%s)' % '|'.join(re.escape(entry) + '\\b' for entry in builtins),
+             Name.Builtin),
+
+            (r'\b(true|false|null)\b', Name.Constant),
+
+            # operators
+            ('(%s)' % '|'.join(re.escape(entry) for entry in operators),
+             Operator),
+
+            # word operators
+            (r'\b(or|and)\b', Operator.Word),
+
+            # punctuations
+            ('(%s)' % '|'.join(re.escape(entry) for entry in punctuations), Punctuation),
+
+            # integers
+            (r'[0-9]+', Number.Integer),
+
+            # strings
+            (r'"', String.Double, 'doublequote'),
+            (r"''", String.Single, 'singlequote'),
+
+            # paths
+            (r'[\w.+-]*(\/[\w.+-]+)+', Literal),
+            (r'\<[\w.+-]+(\/[\w.+-]+)*\>', Literal),
+
+            # urls
+            (r'[a-zA-Z][a-zA-Z0-9\+\-\.]*\:[\w%/?:@&=+$,\\.!~*\'-]+', Literal),
+
+            # names of variables
+            (r'[\w-]+\s*=', String.Symbol),
+            (r'[a-zA-Z_][\w\'-]*', Text),
+
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'singlequote': [
+            (r"'''", String.Escape),
+            (r"''\$\{", String.Escape),
+            (r"''\n", String.Escape),
+            (r"''\r", String.Escape),
+            (r"''\t", String.Escape),
+            (r"''", String.Single, '#pop'),
+            (r'\$\{', String.Interpol, 'antiquote'),
+            (r"[^']", String.Single),
+        ],
+        'doublequote': [
+            (r'\\', String.Escape),
+            (r'\\"', String.Escape),
+            (r'\\$\{', String.Escape),
+            (r'"', String.Double, '#pop'),
+            (r'\$\{', String.Interpol, 'antiquote'),
+            (r'[^"]', String.Double),
+        ],
+        'antiquote': [
+            (r"\}", String.Interpol, '#pop'),
+            # TODO: we should probably escape also here ''${ \${
+            (r"\$\{", String.Interpol, '#push'),
+            include('root'),
+        ],
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        # TODO: let/in
+        if re.search(r'import.+?<[^>]+>', text):
+            rv += 0.4
+        if re.search(r'mkDerivation\s+(\(|\{|rec)', text):
+            rv += 0.4
+        if re.search(r'=\s+mkIf\s+', text):
+            rv += 0.4
+        if re.search(r'\{[a-zA-Z,\s]+\}:', text):
+            rv += 0.1
+        return rv
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/graph.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/graph.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/graph.py	(revision 1126)
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.graph
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for graph query languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this
+from pygments.token import Keyword, Punctuation, Comment, Operator, Name,\
+    String, Number, Whitespace
+
+
+__all__ = ['CypherLexer']
+
+
+class CypherLexer(RegexLexer):
+    """
+    For `Cypher Query Language
+    <http://docs.neo4j.org/chunked/milestone/cypher-query-lang.html>`_
+
+    For the Cypher version in Neo4J 2.0
+
+    .. versionadded:: 2.0
+    """
+    name = 'Cypher'
+    aliases = ['cypher']
+    filenames = ['*.cyp', '*.cypher']
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('keywords'),
+            include('clauses'),
+            include('relations'),
+            include('strings'),
+            include('whitespace'),
+            include('barewords'),
+        ],
+        'comment': [
+            (r'^.*//.*\n', Comment.Single),
+        ],
+        'keywords': [
+            (r'(create|order|match|limit|set|skip|start|return|with|where|'
+             r'delete|foreach|not|by)\b', Keyword),
+        ],
+        'clauses': [
+            # TODO: many missing ones, see http://docs.neo4j.org/refcard/2.0/
+            (r'(all|any|as|asc|create|create\s+unique|delete|'
+             r'desc|distinct|foreach|in|is\s+null|limit|match|none|'
+             r'order\s+by|return|set|skip|single|start|union|where|with)\b',
+             Keyword),
+        ],
+        'relations': [
+            (r'(-\[)(.*?)(\]->)', bygroups(Operator, using(this), Operator)),
+            (r'(<-\[)(.*?)(\]-)', bygroups(Operator, using(this), Operator)),
+            (r'(-\[)(.*?)(\]-)', bygroups(Operator, using(this), Operator)),
+            (r'-->|<--|\[|\]', Operator),
+            (r'<|>|<>|=|<=|=>|\(|\)|\||:|,|;', Punctuation),
+            (r'[.*{}]', Punctuation),
+        ],
+        'strings': [
+            (r'"(?:\\[tbnrf\'"\\]|[^\\"])*"', String),
+            (r'`(?:``|[^`])+`', Name.Variable),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'barewords': [
+            (r'[a-z]\w*', Name),
+            (r'\d+', Number),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/console.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/console.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/console.py	(revision 1126)
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.console
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for misc console output.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Generic, Comment, String, Text, Keyword, Name, \
+    Punctuation, Number
+
+__all__ = ['VCTreeStatusLexer', 'PyPyLogLexer']
+
+
+class VCTreeStatusLexer(RegexLexer):
+    """
+    For colorizing output of version control status commands, like "hg
+    status" or "svn status".
+
+    .. versionadded:: 2.0
+    """
+    name = 'VCTreeStatus'
+    aliases = ['vctreestatus']
+    filenames = []
+    mimetypes = []
+
+    tokens = {
+        'root': [
+            (r'^A  \+  C\s+', Generic.Error),
+            (r'^A\s+\+?\s+', String),
+            (r'^M\s+', Generic.Inserted),
+            (r'^C\s+', Generic.Error),
+            (r'^D\s+', Generic.Deleted),
+            (r'^[?!]\s+', Comment.Preproc),
+            (r'      >\s+.*\n', Comment.Preproc),
+            (r'.*\n', Text)
+        ]
+    }
+
+
+class PyPyLogLexer(RegexLexer):
+    """
+    Lexer for PyPy log files.
+
+    .. versionadded:: 1.5
+    """
+    name = "PyPy Log"
+    aliases = ["pypylog", "pypy"]
+    filenames = ["*.pypylog"]
+    mimetypes = ['application/x-pypylog']
+
+    tokens = {
+        "root": [
+            (r"\[\w+\] \{jit-log-.*?$", Keyword, "jit-log"),
+            (r"\[\w+\] \{jit-backend-counts$", Keyword, "jit-backend-counts"),
+            include("extra-stuff"),
+        ],
+        "jit-log": [
+            (r"\[\w+\] jit-log-.*?}$", Keyword, "#pop"),
+            (r"^\+\d+: ", Comment),
+            (r"--end of the loop--", Comment),
+            (r"[ifp]\d+", Name),
+            (r"ptr\d+", Name),
+            (r"(\()(\w+(?:\.\w+)?)(\))",
+             bygroups(Punctuation, Name.Builtin, Punctuation)),
+            (r"[\[\]=,()]", Punctuation),
+            (r"(\d+\.\d+|inf|-inf)", Number.Float),
+            (r"-?\d+", Number.Integer),
+            (r"'.*'", String),
+            (r"(None|descr|ConstClass|ConstPtr|TargetToken)", Name),
+            (r"<.*?>+", Name.Builtin),
+            (r"(label|debug_merge_point|jump|finish)", Name.Class),
+            (r"(int_add_ovf|int_add|int_sub_ovf|int_sub|int_mul_ovf|int_mul|"
+             r"int_floordiv|int_mod|int_lshift|int_rshift|int_and|int_or|"
+             r"int_xor|int_eq|int_ne|int_ge|int_gt|int_le|int_lt|int_is_zero|"
+             r"int_is_true|"
+             r"uint_floordiv|uint_ge|uint_lt|"
+             r"float_add|float_sub|float_mul|float_truediv|float_neg|"
+             r"float_eq|float_ne|float_ge|float_gt|float_le|float_lt|float_abs|"
+             r"ptr_eq|ptr_ne|instance_ptr_eq|instance_ptr_ne|"
+             r"cast_int_to_float|cast_float_to_int|"
+             r"force_token|quasiimmut_field|same_as|virtual_ref_finish|"
+             r"virtual_ref|mark_opaque_ptr|"
+             r"call_may_force|call_assembler|call_loopinvariant|"
+             r"call_release_gil|call_pure|call|"
+             r"new_with_vtable|new_array|newstr|newunicode|new|"
+             r"arraylen_gc|"
+             r"getarrayitem_gc_pure|getarrayitem_gc|setarrayitem_gc|"
+             r"getarrayitem_raw|setarrayitem_raw|getfield_gc_pure|"
+             r"getfield_gc|getinteriorfield_gc|setinteriorfield_gc|"
+             r"getfield_raw|setfield_gc|setfield_raw|"
+             r"strgetitem|strsetitem|strlen|copystrcontent|"
+             r"unicodegetitem|unicodesetitem|unicodelen|"
+             r"guard_true|guard_false|guard_value|guard_isnull|"
+             r"guard_nonnull_class|guard_nonnull|guard_class|guard_no_overflow|"
+             r"guard_not_forced|guard_no_exception|guard_not_invalidated)",
+             Name.Builtin),
+            include("extra-stuff"),
+        ],
+        "jit-backend-counts": [
+            (r"\[\w+\] jit-backend-counts}$", Keyword, "#pop"),
+            (r":", Punctuation),
+            (r"\d+", Number),
+            include("extra-stuff"),
+        ],
+        "extra-stuff": [
+            (r"\s+", Text),
+            (r"#.*?$", Comment),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/prolog.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/prolog.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/prolog.py	(revision 1126)
@@ -0,0 +1,306 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.prolog
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Prolog and Prolog-like languages.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['PrologLexer', 'LogtalkLexer']
+
+
+class PrologLexer(RegexLexer):
+    """
+    Lexer for Prolog files.
+    """
+    name = 'Prolog'
+    aliases = ['prolog']
+    filenames = ['*.ecl', '*.prolog', '*.pro', '*.pl']
+    mimetypes = ['text/x-prolog']
+
+    flags = re.UNICODE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'^#.*', Comment.Single),
+            (r'/\*', Comment.Multiline, 'nested-comment'),
+            (r'%.*', Comment.Single),
+            # character literal
+            (r'0\'.', String.Char),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            # literal with prepended base
+            (r'\d\d?\'[a-zA-Z0-9]+', Number.Integer),
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'[\[\](){}|.,;!]', Punctuation),
+            (r':-|-->', Punctuation),
+            (r'"(?:\\x[0-9a-fA-F]+\\|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|'
+             r'\\[0-7]+\\|\\["\nabcefnrstv]|[^\\"])*"', String.Double),
+            (r"'(?:''|[^'])*'", String.Atom),  # quoted atom
+            # Needs to not be followed by an atom.
+            # (r'=(?=\s|[a-zA-Z\[])', Operator),
+            (r'is\b', Operator),
+            (r'(<|>|=<|>=|==|=:=|=|/|//|\*|\+|-)(?=\s|[a-zA-Z0-9\[])',
+             Operator),
+            (r'(mod|div|not)\b', Operator),
+            (r'_', Keyword),  # The don't-care variable
+            (r'([a-z]+)(:)', bygroups(Name.Namespace, Punctuation)),
+            (u'([a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             u'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*)'
+             u'(\\s*)(:-|-->)',
+             bygroups(Name.Function, Text, Operator)),  # function defn
+            (u'([a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             u'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*)'
+             u'(\\s*)(\\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (u'[a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             u'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*',
+             String.Atom),  # atom, characters
+            # This one includes !
+            (u'[#&*+\\-./:<=>?@\\\\^~\u00a1-\u00bf\u2010-\u303f]+',
+             String.Atom),  # atom, graphics
+            (r'[A-Z_]\w*', Name.Variable),
+            (u'\\s+|[\u2000-\u200f\ufff0-\ufffe\uffef]', Text),
+        ],
+        'nested-comment': [
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
+
+    def analyse_text(text):
+        return ':-' in text
+
+
+class LogtalkLexer(RegexLexer):
+    """
+    For `Logtalk <http://logtalk.org/>`_ source code.
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'Logtalk'
+    aliases = ['logtalk']
+    filenames = ['*.lgt', '*.logtalk']
+    mimetypes = ['text/x-logtalk']
+
+    tokens = {
+        'root': [
+            # Directives
+            (r'^\s*:-\s', Punctuation, 'directive'),
+            # Comments
+            (r'%.*?\n', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+            # Whitespace
+            (r'\n', Text),
+            (r'\s+', Text),
+            # Numbers
+            (r"0'.", Number),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+\.?\d*((e|E)(\+|-)?\d+)?', Number),
+            # Variables
+            (r'([A-Z_]\w*)', Name.Variable),
+            # Event handlers
+            (r'(after|before)(?=[(])', Keyword),
+            # Message forwarding handler
+            (r'forward(?=[(])', Keyword),
+            # Execution-context methods
+            (r'(parameter|this|se(lf|nder))(?=[(])', Keyword),
+            # Reflection
+            (r'(current_predicate|predicate_property)(?=[(])', Keyword),
+            # DCGs and term expansion
+            (r'(expand_(goal|term)|(goal|term)_expansion|phrase)(?=[(])', Keyword),
+            # Entity
+            (r'(abolish|c(reate|urrent))_(object|protocol|category)(?=[(])', Keyword),
+            (r'(object|protocol|category)_property(?=[(])', Keyword),
+            # Entity relations
+            (r'co(mplements_object|nforms_to_protocol)(?=[(])', Keyword),
+            (r'extends_(object|protocol|category)(?=[(])', Keyword),
+            (r'imp(lements_protocol|orts_category)(?=[(])', Keyword),
+            (r'(instantiat|specializ)es_class(?=[(])', Keyword),
+            # Events
+            (r'(current_event|(abolish|define)_events)(?=[(])', Keyword),
+            # Flags
+            (r'(current|set)_logtalk_flag(?=[(])', Keyword),
+            # Compiling, loading, and library paths
+            (r'logtalk_(compile|l(ibrary_path|oad|oad_context)|make)(?=[(])', Keyword),
+            (r'\blogtalk_make\b', Keyword),
+            # Database
+            (r'(clause|retract(all)?)(?=[(])', Keyword),
+            (r'a(bolish|ssert(a|z))(?=[(])', Keyword),
+            # Control constructs
+            (r'(ca(ll|tch)|throw)(?=[(])', Keyword),
+            (r'(fa(il|lse)|true)\b', Keyword),
+            # All solutions
+            (r'((bag|set)of|f(ind|or)all)(?=[(])', Keyword),
+            # Multi-threading meta-predicates
+            (r'threaded(_(call|once|ignore|exit|peek|wait|notify))?(?=[(])', Keyword),
+            # Term unification
+            (r'(subsumes_term|unify_with_occurs_check)(?=[(])', Keyword),
+            # Term creation and decomposition
+            (r'(functor|arg|copy_term|numbervars|term_variables)(?=[(])', Keyword),
+            # Evaluable functors
+            (r'(div|rem|m(ax|in|od)|abs|sign)(?=[(])', Keyword),
+            (r'float(_(integer|fractional)_part)?(?=[(])', Keyword),
+            (r'(floor|t(an|runcate)|round|ceiling)(?=[(])', Keyword),
+            # Other arithmetic functors
+            (r'(cos|a(cos|sin|tan|tan2)|exp|log|s(in|qrt)|xor)(?=[(])', Keyword),
+            # Term testing
+            (r'(var|atom(ic)?|integer|float|c(allable|ompound)|n(onvar|umber)|'
+             r'ground|acyclic_term)(?=[(])', Keyword),
+            # Term comparison
+            (r'compare(?=[(])', Keyword),
+            # Stream selection and control
+            (r'(curren|se)t_(in|out)put(?=[(])', Keyword),
+            (r'(open|close)(?=[(])', Keyword),
+            (r'flush_output(?=[(])', Keyword),
+            (r'(at_end_of_stream|flush_output)\b', Keyword),
+            (r'(stream_property|at_end_of_stream|set_stream_position)(?=[(])', Keyword),
+            # Character and byte input/output
+            (r'(nl|(get|peek|put)_(byte|c(har|ode)))(?=[(])', Keyword),
+            (r'\bnl\b', Keyword),
+            # Term input/output
+            (r'read(_term)?(?=[(])', Keyword),
+            (r'write(q|_(canonical|term))?(?=[(])', Keyword),
+            (r'(current_)?op(?=[(])', Keyword),
+            (r'(current_)?char_conversion(?=[(])', Keyword),
+            # Atomic term processing
+            (r'atom_(length|c(hars|o(ncat|des)))(?=[(])', Keyword),
+            (r'(char_code|sub_atom)(?=[(])', Keyword),
+            (r'number_c(har|ode)s(?=[(])', Keyword),
+            # Implementation defined hooks functions
+            (r'(se|curren)t_prolog_flag(?=[(])', Keyword),
+            (r'\bhalt\b', Keyword),
+            (r'halt(?=[(])', Keyword),
+            # Message sending operators
+            (r'(::|:|\^\^)', Operator),
+            # External call
+            (r'[{}]', Keyword),
+            # Logic and control
+            (r'(ignore|once)(?=[(])', Keyword),
+            (r'\brepeat\b', Keyword),
+            # Sorting
+            (r'(key)?sort(?=[(])', Keyword),
+            # Bitwise functors
+            (r'(>>|<<|/\\|\\\\|\\)', Operator),
+            # Predicate aliases
+            (r'\bas\b', Operator),
+            # Arithemtic evaluation
+            (r'\bis\b', Keyword),
+            # Arithemtic comparison
+            (r'(=:=|=\\=|<|=<|>=|>)', Operator),
+            # Term creation and decomposition
+            (r'=\.\.', Operator),
+            # Term unification
+            (r'(=|\\=)', Operator),
+            # Term comparison
+            (r'(==|\\==|@=<|@<|@>=|@>)', Operator),
+            # Evaluable functors
+            (r'(//|[-+*/])', Operator),
+            (r'\b(e|pi|div|mod|rem)\b', Operator),
+            # Other arithemtic functors
+            (r'\b\*\*\b', Operator),
+            # DCG rules
+            (r'-->', Operator),
+            # Control constructs
+            (r'([!;]|->)', Operator),
+            # Logic and control
+            (r'\\+', Operator),
+            # Mode operators
+            (r'[?@]', Operator),
+            # Existential quantifier
+            (r'\^', Operator),
+            # Strings
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # Ponctuation
+            (r'[()\[\],.|]', Text),
+            # Atoms
+            (r"[a-z]\w*", Text),
+            (r"'", String, 'quoted_atom'),
+        ],
+
+        'quoted_atom': [
+            (r"''", String),
+            (r"'", String, '#pop'),
+            (r'\\([\\abfnrtv"\']|(x[a-fA-F0-9]+|[0-7]+)\\)', String.Escape),
+            (r"[^\\'\n]+", String),
+            (r'\\', String),
+        ],
+
+        'directive': [
+            # Conditional compilation directives
+            (r'(el)?if(?=[(])', Keyword, 'root'),
+            (r'(e(lse|ndif))[.]', Keyword, 'root'),
+            # Entity directives
+            (r'(category|object|protocol)(?=[(])', Keyword, 'entityrelations'),
+            (r'(end_(category|object|protocol))[.]', Keyword, 'root'),
+            # Predicate scope directives
+            (r'(public|protected|private)(?=[(])', Keyword, 'root'),
+            # Other directives
+            (r'e(n(coding|sure_loaded)|xport)(?=[(])', Keyword, 'root'),
+            (r'in(clude|itialization|fo)(?=[(])', Keyword, 'root'),
+            (r'(built_in|dynamic|synchronized|threaded)[.]', Keyword, 'root'),
+            (r'(alias|d(ynamic|iscontiguous)|m(eta_(non_terminal|predicate)|ode|ultifile)|'
+             r's(et_(logtalk|prolog)_flag|ynchronized))(?=[(])', Keyword, 'root'),
+            (r'op(?=[(])', Keyword, 'root'),
+            (r'(c(alls|oinductive)|module|reexport|use(s|_module))(?=[(])', Keyword, 'root'),
+            (r'[a-z]\w*(?=[(])', Text, 'root'),
+            (r'[a-z]\w*[.]', Text, 'root'),
+        ],
+
+        'entityrelations': [
+            (r'(complements|extends|i(nstantiates|mp(lements|orts))|specializes)(?=[(])', Keyword),
+            # Numbers
+            (r"0'.", Number),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+\.?\d*((e|E)(\+|-)?\d+)?', Number),
+            # Variables
+            (r'([A-Z_]\w*)', Name.Variable),
+            # Atoms
+            (r"[a-z]\w*", Text),
+            (r"'", String, 'quoted_atom'),
+            # Strings
+            (r'"(\\\\|\\"|[^"])*"', String),
+            # End of entity-opening directive
+            (r'([)]\.)', Text, 'root'),
+            # Scope operator
+            (r'(::)', Operator),
+            # Ponctuation
+            (r'[()\[\],.|]', Text),
+            # Comments
+            (r'%.*?\n', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+            # Whitespace
+            (r'\n', Text),
+            (r'\s+', Text),
+        ]
+    }
+
+    def analyse_text(text):
+        if ':- object(' in text:
+            return 1.0
+        elif ':- protocol(' in text:
+            return 1.0
+        elif ':- category(' in text:
+            return 1.0
+        elif re.search('^:-\s[a-z]', text, re.M):
+            return 0.9
+        else:
+            return 0.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/shell.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/shell.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/shell.py	(revision 1126)
@@ -0,0 +1,794 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.shell
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various shells.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, \
+    include, default, this, using, words
+from pygments.token import Punctuation, \
+    Text, Comment, Operator, Keyword, Name, String, Number, Generic
+from pygments.util import shebang_matches
+
+
+__all__ = ['BashLexer', 'BashSessionLexer', 'TcshLexer', 'BatchLexer',
+           'MSDOSSessionLexer', 'PowerShellLexer',
+           'PowerShellSessionLexer', 'TcshSessionLexer', 'FishShellLexer']
+
+line_re = re.compile('.*?\n')
+
+
+class BashLexer(RegexLexer):
+    """
+    Lexer for (ba|k|z|)sh shell scripts.
+
+    .. versionadded:: 0.6
+    """
+
+    name = 'Bash'
+    aliases = ['bash', 'sh', 'ksh', 'zsh', 'shell']
+    filenames = ['*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass',
+                 '*.exheres-0', '*.exlib', '*.zsh',
+                 '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc',
+                 'PKGBUILD']
+    mimetypes = ['application/x-sh', 'application/x-shellscript']
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'`', String.Backtick, 'backticks'),
+            include('data'),
+            include('interp'),
+        ],
+        'interp': [
+            (r'\$\(\(', Keyword, 'math'),
+            (r'\$\(', Keyword, 'paren'),
+            (r'\$\{#?', String.Interpol, 'curly'),
+            (r'\$[a-zA-Z_]\w*', Name.Variable),  # user variable
+            (r'\$(?:\d+|[#$?!_*@-])', Name.Variable),      # builtin
+            (r'\$', Text),
+        ],
+        'basic': [
+            (r'\b(if|fi|else|while|do|done|for|then|return|function|case|'
+             r'select|continue|until|esac|elif)(\s*)\b',
+             bygroups(Keyword, Text)),
+            (r'\b(alias|bg|bind|break|builtin|caller|cd|command|compgen|'
+             r'complete|declare|dirs|disown|echo|enable|eval|exec|exit|'
+             r'export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|'
+             r'local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|'
+             r'shopt|source|suspend|test|time|times|trap|true|type|typeset|'
+             r'ulimit|umask|unalias|unset|wait)(?=[\s)`])',
+             Name.Builtin),
+            (r'\A#!.+\n', Comment.Hashbang),
+            (r'#.*\n', Comment.Single),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(\+?=)', bygroups(Name.Variable, Text, Operator)),
+            (r'[\[\]{}()=]', Operator),
+            (r'<<<', Operator),  # here-string
+            (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r'&&|\|\|', Operator),
+        ],
+        'data': [
+            (r'(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r"(?s)'.*?'", String.Single),
+            (r';', Punctuation),
+            (r'&', Punctuation),
+            (r'\|', Punctuation),
+            (r'\s+', Text),
+            (r'\d+\b', Number),
+            (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
+            (r'<', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'curly': [
+            (r'\}', String.Interpol, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$\\]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'math': [
+            (r'\)\)', Keyword, '#pop'),
+            (r'[-+*/%^|&]|\*\*|\|\|', Operator),
+            (r'\d+#\d+', Number),
+            (r'\d+#(?! )', Number),
+            (r'\d+', Number),
+            include('root'),
+        ],
+        'backticks': [
+            (r'`', String.Backtick, '#pop'),
+            include('root'),
+        ],
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'(ba|z|)sh'):
+            return 1
+        if text.startswith('$ '):
+            return 0.2
+
+
+class ShellSessionBaseLexer(Lexer):
+    """
+    Base lexer for simplistic shell sessions.
+
+    .. versionadded:: 2.1
+    """
+    def get_tokens_unprocessed(self, text):
+        innerlexer = self._innerLexerCls(**self.options)
+
+        pos = 0
+        curcode = ''
+        insertions = []
+        backslash_continuation = False
+
+        for match in line_re.finditer(text):
+            line = match.group()
+            m = re.match(self._ps1rgx, line)
+            if backslash_continuation:
+                curcode += line
+                backslash_continuation = curcode.endswith('\\\n')
+            elif m:
+                # To support output lexers (say diff output), the output
+                # needs to be broken by prompts whenever the output lexer
+                # changes.
+                if not insertions:
+                    pos = match.start()
+
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, m.group(1))]))
+                curcode += m.group(2)
+                backslash_continuation = curcode.endswith('\\\n')
+            elif line.startswith(self._ps2):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:len(self._ps2)])]))
+                curcode += line[len(self._ps2):]
+                backslash_continuation = curcode.endswith('\\\n')
+            else:
+                if insertions:
+                    toks = innerlexer.get_tokens_unprocessed(curcode)
+                    for i, t, v in do_insertions(insertions, toks):
+                        yield pos+i, t, v
+                yield match.start(), Generic.Output, line
+                insertions = []
+                curcode = ''
+        if insertions:
+            for i, t, v in do_insertions(insertions,
+                                         innerlexer.get_tokens_unprocessed(curcode)):
+                yield pos+i, t, v
+
+
+class BashSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for simplistic shell sessions.
+
+    .. versionadded:: 1.1
+    """
+
+    name = 'Bash Session'
+    aliases = ['console', 'shell-session']
+    filenames = ['*.sh-session', '*.shell-session']
+    mimetypes = ['application/x-shell-session', 'application/x-sh-session']
+
+    _innerLexerCls = BashLexer
+    _ps1rgx = \
+        r'^((?:(?:\[.*?\])|(?:\(\S+\))?(?:| |sh\S*?|\w+\S+[@:]\S+(?:\s+\S+)' \
+        r'?|\[\S+[@:][^\n]+\].+))\s*[$#%])(.*\n?)'
+    _ps2 = '>'
+
+
+class BatchLexer(RegexLexer):
+    """
+    Lexer for the DOS/Windows Batch file format.
+
+    .. versionadded:: 0.7
+    """
+    name = 'Batchfile'
+    aliases = ['bat', 'batch', 'dosbatch', 'winbatch']
+    filenames = ['*.bat', '*.cmd']
+    mimetypes = ['application/x-dos-batch']
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    _nl = r'\n\x1a'
+    _punct = r'&<>|'
+    _ws = r'\t\v\f\r ,;=\xa0'
+    _space = r'(?:(?:(?:\^[%s])?[%s])+)' % (_nl, _ws)
+    _keyword_terminator = (r'(?=(?:\^[%s]?)?[%s+./:[\\\]]|[%s%s(])' %
+                           (_nl, _ws, _nl, _punct))
+    _token_terminator = r'(?=\^?[%s]|[%s%s])' % (_ws, _punct, _nl)
+    _start_label = r'((?:(?<=^[^:])|^[^:]?)[%s]*)(:)' % _ws
+    _label = r'(?:(?:[^%s%s%s+:^]|\^[%s]?[\w\W])*)' % (_nl, _punct, _ws, _nl)
+    _label_compound = (r'(?:(?:[^%s%s%s+:^)]|\^[%s]?[^)])*)' %
+                       (_nl, _punct, _ws, _nl))
+    _number = r'(?:-?(?:0[0-7]+|0x[\da-f]+|\d+)%s)' % _token_terminator
+    _opword = r'(?:equ|geq|gtr|leq|lss|neq)'
+    _string = r'(?:"[^%s"]*(?:"|(?=[%s])))' % (_nl, _nl)
+    _variable = (r'(?:(?:%%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|'
+                 r'[^%%:%s]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%%%s^]|'
+                 r'\^[^%%%s])[^=%s]*=(?:[^%%%s^]|\^[^%%%s])*)?)?%%))|'
+                 r'(?:\^?![^!:%s]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:'
+                 r'[^!%s^]|\^[^!%s])[^=%s]*=(?:[^!%s^]|\^[^!%s])*)?)?\^?!))' %
+                 (_nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl))
+    _core_token = r'(?:(?:(?:\^[%s]?)?[^"%s%s%s])+)' % (_nl, _nl, _punct, _ws)
+    _core_token_compound = r'(?:(?:(?:\^[%s]?)?[^"%s%s%s)])+)' % (_nl, _nl,
+                                                                  _punct, _ws)
+    _token = r'(?:[%s]+|%s)' % (_punct, _core_token)
+    _token_compound = r'(?:[%s]+|%s)' % (_punct, _core_token_compound)
+    _stoken = (r'(?:[%s]+|(?:%s|%s|%s)+)' %
+               (_punct, _string, _variable, _core_token))
+
+    def _make_begin_state(compound, _core_token=_core_token,
+                          _core_token_compound=_core_token_compound,
+                          _keyword_terminator=_keyword_terminator,
+                          _nl=_nl, _punct=_punct, _string=_string,
+                          _space=_space, _start_label=_start_label,
+                          _stoken=_stoken, _token_terminator=_token_terminator,
+                          _variable=_variable, _ws=_ws):
+        rest = '(?:%s|%s|[^"%%%s%s%s])*' % (_string, _variable, _nl, _punct,
+                                            ')' if compound else '')
+        rest_of_line = r'(?:(?:[^%s^]|\^[%s]?[\w\W])*)' % (_nl, _nl)
+        rest_of_line_compound = r'(?:(?:[^%s^)]|\^[%s]?[^)])*)' % (_nl, _nl)
+        set_space = r'((?:(?:\^[%s]?)?[^\S\n])*)' % _nl
+        suffix = ''
+        if compound:
+            _keyword_terminator = r'(?:(?=\))|%s)' % _keyword_terminator
+            _token_terminator = r'(?:(?=\))|%s)' % _token_terminator
+            suffix = '/compound'
+        return [
+            ((r'\)', Punctuation, '#pop') if compound else
+             (r'\)((?=\()|%s)%s' % (_token_terminator, rest_of_line),
+              Comment.Single)),
+            (r'(?=%s)' % _start_label, Text, 'follow%s' % suffix),
+            (_space, using(this, state='text')),
+            include('redirect%s' % suffix),
+            (r'[%s]+' % _nl, Text),
+            (r'\(', Punctuation, 'root/compound'),
+            (r'@+', Punctuation),
+            (r'((?:for|if|rem)(?:(?=(?:\^[%s]?)?/)|(?:(?!\^)|'
+             r'(?<=m))(?:(?=\()|%s)))(%s?%s?(?:\^[%s]?)?/(?:\^[%s]?)?\?)' %
+             (_nl, _token_terminator, _space,
+              _core_token_compound if compound else _core_token, _nl, _nl),
+             bygroups(Keyword, using(this, state='text')),
+             'follow%s' % suffix),
+            (r'(goto%s)(%s(?:\^[%s]?)?/(?:\^[%s]?)?\?%s)' %
+             (_keyword_terminator, rest, _nl, _nl, rest),
+             bygroups(Keyword, using(this, state='text')),
+             'follow%s' % suffix),
+            (words(('assoc', 'break', 'cd', 'chdir', 'cls', 'color', 'copy',
+                    'date', 'del', 'dir', 'dpath', 'echo', 'endlocal', 'erase',
+                    'exit', 'ftype', 'keys', 'md', 'mkdir', 'mklink', 'move',
+                    'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'ren',
+                    'rename', 'rmdir', 'setlocal', 'shift', 'start', 'time',
+                    'title', 'type', 'ver', 'verify', 'vol'),
+                   suffix=_keyword_terminator), Keyword, 'follow%s' % suffix),
+            (r'(call)(%s?)(:)' % _space,
+             bygroups(Keyword, using(this, state='text'), Punctuation),
+             'call%s' % suffix),
+            (r'call%s' % _keyword_terminator, Keyword),
+            (r'(for%s(?!\^))(%s)(/f%s)' %
+             (_token_terminator, _space, _token_terminator),
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             ('for/f', 'for')),
+            (r'(for%s(?!\^))(%s)(/l%s)' %
+             (_token_terminator, _space, _token_terminator),
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             ('for/l', 'for')),
+            (r'for%s(?!\^)' % _token_terminator, Keyword, ('for2', 'for')),
+            (r'(goto%s)(%s?)(:?)' % (_keyword_terminator, _space),
+             bygroups(Keyword, using(this, state='text'), Punctuation),
+             'label%s' % suffix),
+            (r'(if(?:(?=\()|%s)(?!\^))(%s?)((?:/i%s)?)(%s?)((?:not%s)?)(%s?)' %
+             (_token_terminator, _space, _token_terminator, _space,
+              _token_terminator, _space),
+             bygroups(Keyword, using(this, state='text'), Keyword,
+                      using(this, state='text'), Keyword,
+                      using(this, state='text')), ('(?', 'if')),
+            (r'rem(((?=\()|%s)%s?%s?.*|%s%s)' %
+             (_token_terminator, _space, _stoken, _keyword_terminator,
+              rest_of_line_compound if compound else rest_of_line),
+             Comment.Single, 'follow%s' % suffix),
+            (r'(set%s)%s(/a)' % (_keyword_terminator, set_space),
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             'arithmetic%s' % suffix),
+            (r'(set%s)%s((?:/p)?)%s((?:(?:(?:\^[%s]?)?[^"%s%s^=%s]|'
+             r'\^[%s]?[^"=])+)?)((?:(?:\^[%s]?)?=)?)' %
+             (_keyword_terminator, set_space, set_space, _nl, _nl, _punct,
+              ')' if compound else '', _nl, _nl),
+             bygroups(Keyword, using(this, state='text'), Keyword,
+                      using(this, state='text'), using(this, state='variable'),
+                      Punctuation),
+             'follow%s' % suffix),
+            default('follow%s' % suffix)
+        ]
+
+    def _make_follow_state(compound, _label=_label,
+                           _label_compound=_label_compound, _nl=_nl,
+                           _space=_space, _start_label=_start_label,
+                           _token=_token, _token_compound=_token_compound,
+                           _ws=_ws):
+        suffix = '/compound' if compound else ''
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state += [
+            (r'%s([%s]*)(%s)(.*)' %
+             (_start_label, _ws, _label_compound if compound else _label),
+             bygroups(Text, Punctuation, Text, Name.Label, Comment.Single)),
+            include('redirect%s' % suffix),
+            (r'(?=[%s])' % _nl, Text, '#pop'),
+            (r'\|\|?|&&?', Punctuation, '#pop'),
+            include('text')
+        ]
+        return state
+
+    def _make_arithmetic_state(compound, _nl=_nl, _punct=_punct,
+                               _string=_string, _variable=_variable, _ws=_ws):
+        op = r'=+\-*/!~'
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state += [
+            (r'0[0-7]+', Number.Oct),
+            (r'0x[\da-f]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'[(),]+', Punctuation),
+            (r'([%s]|%%|\^\^)+' % op, Operator),
+            (r'(%s|%s|(\^[%s]?)?[^()%s%%^"%s%s%s]|\^[%s%s]?%s)+' %
+             (_string, _variable, _nl, op, _nl, _punct, _ws, _nl, _ws,
+              r'[^)]' if compound else r'[\w\W]'),
+             using(this, state='variable')),
+            (r'(?=[\x00|&])', Text, '#pop'),
+            include('follow')
+        ]
+        return state
+
+    def _make_call_state(compound, _label=_label,
+                         _label_compound=_label_compound):
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state.append((r'(:?)(%s)' % (_label_compound if compound else _label),
+                      bygroups(Punctuation, Name.Label), '#pop'))
+        return state
+
+    def _make_label_state(compound, _label=_label,
+                          _label_compound=_label_compound, _nl=_nl,
+                          _punct=_punct, _string=_string, _variable=_variable):
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state.append((r'(%s?)((?:%s|%s|\^[%s]?%s|[^"%%^%s%s%s])*)' %
+                      (_label_compound if compound else _label, _string,
+                       _variable, _nl, r'[^)]' if compound else r'[\w\W]', _nl,
+                       _punct, r')' if compound else ''),
+                      bygroups(Name.Label, Comment.Single), '#pop'))
+        return state
+
+    def _make_redirect_state(compound,
+                             _core_token_compound=_core_token_compound,
+                             _nl=_nl, _punct=_punct, _stoken=_stoken,
+                             _string=_string, _space=_space,
+                             _variable=_variable, _ws=_ws):
+        stoken_compound = (r'(?:[%s]+|(?:%s|%s|%s)+)' %
+                           (_punct, _string, _variable, _core_token_compound))
+        return [
+            (r'((?:(?<=[%s%s])\d)?)(>>?&|<&)([%s%s]*)(\d)' %
+             (_nl, _ws, _nl, _ws),
+             bygroups(Number.Integer, Punctuation, Text, Number.Integer)),
+            (r'((?:(?<=[%s%s])(?<!\^[%s])\d)?)(>>?|<)(%s?%s)' %
+             (_nl, _ws, _nl, _space, stoken_compound if compound else _stoken),
+             bygroups(Number.Integer, Punctuation, using(this, state='text')))
+        ]
+
+    tokens = {
+        'root': _make_begin_state(False),
+        'follow': _make_follow_state(False),
+        'arithmetic': _make_arithmetic_state(False),
+        'call': _make_call_state(False),
+        'label': _make_label_state(False),
+        'redirect': _make_redirect_state(False),
+        'root/compound': _make_begin_state(True),
+        'follow/compound': _make_follow_state(True),
+        'arithmetic/compound': _make_arithmetic_state(True),
+        'call/compound': _make_call_state(True),
+        'label/compound': _make_label_state(True),
+        'redirect/compound': _make_redirect_state(True),
+        'variable-or-escape': [
+            (_variable, Name.Variable),
+            (r'%%%%|\^[%s]?(\^!|[\w\W])' % _nl, String.Escape)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (_variable, Name.Variable),
+            (r'\^!|%%', String.Escape),
+            (r'[^"%%^%s]+|[%%^]' % _nl, String.Double),
+            default('#pop')
+        ],
+        'sqstring': [
+            include('variable-or-escape'),
+            (r'[^%]+|%', String.Single)
+        ],
+        'bqstring': [
+            include('variable-or-escape'),
+            (r'[^%]+|%', String.Backtick)
+        ],
+        'text': [
+            (r'"', String.Double, 'string'),
+            include('variable-or-escape'),
+            (r'[^"%%^%s%s%s\d)]+|.' % (_nl, _punct, _ws), Text)
+        ],
+        'variable': [
+            (r'"', String.Double, 'string'),
+            include('variable-or-escape'),
+            (r'[^"%%^%s]+|.' % _nl, Name.Variable)
+        ],
+        'for': [
+            (r'(%s)(in)(%s)(\()' % (_space, _space),
+             bygroups(using(this, state='text'), Keyword,
+                      using(this, state='text'), Punctuation), '#pop'),
+            include('follow')
+        ],
+        'for2': [
+            (r'\)', Punctuation),
+            (r'(%s)(do%s)' % (_space, _token_terminator),
+             bygroups(using(this, state='text'), Keyword), '#pop'),
+            (r'[%s]+' % _nl, Text),
+            include('follow')
+        ],
+        'for/f': [
+            (r'(")((?:%s|[^"])*?")([%s%s]*)(\))' % (_variable, _nl, _ws),
+             bygroups(String.Double, using(this, state='string'), Text,
+                      Punctuation)),
+            (r'"', String.Double, ('#pop', 'for2', 'string')),
+            (r"('(?:%%%%|%s|[\w\W])*?')([%s%s]*)(\))" % (_variable, _nl, _ws),
+             bygroups(using(this, state='sqstring'), Text, Punctuation)),
+            (r'(`(?:%%%%|%s|[\w\W])*?`)([%s%s]*)(\))' % (_variable, _nl, _ws),
+             bygroups(using(this, state='bqstring'), Text, Punctuation)),
+            include('for2')
+        ],
+        'for/l': [
+            (r'-?\d+', Number.Integer),
+            include('for2')
+        ],
+        'if': [
+            (r'((?:cmdextversion|errorlevel)%s)(%s)(\d+)' %
+             (_token_terminator, _space),
+             bygroups(Keyword, using(this, state='text'),
+                      Number.Integer), '#pop'),
+            (r'(defined%s)(%s)(%s)' % (_token_terminator, _space, _stoken),
+             bygroups(Keyword, using(this, state='text'),
+                      using(this, state='variable')), '#pop'),
+            (r'(exist%s)(%s%s)' % (_token_terminator, _space, _stoken),
+             bygroups(Keyword, using(this, state='text')), '#pop'),
+            (r'(%s%s)(%s)(%s%s)' % (_number, _space, _opword, _space, _number),
+             bygroups(using(this, state='arithmetic'), Operator.Word,
+                      using(this, state='arithmetic')), '#pop'),
+            (_stoken, using(this, state='text'), ('#pop', 'if2')),
+        ],
+        'if2': [
+            (r'(%s?)(==)(%s?%s)' % (_space, _space, _stoken),
+             bygroups(using(this, state='text'), Operator,
+                      using(this, state='text')), '#pop'),
+            (r'(%s)(%s)(%s%s)' % (_space, _opword, _space, _stoken),
+             bygroups(using(this, state='text'), Operator.Word,
+                      using(this, state='text')), '#pop')
+        ],
+        '(?': [
+            (_space, using(this, state='text')),
+            (r'\(', Punctuation, ('#pop', 'else?', 'root/compound')),
+            default('#pop')
+        ],
+        'else?': [
+            (_space, using(this, state='text')),
+            (r'else%s' % _token_terminator, Keyword, '#pop'),
+            default('#pop')
+        ]
+    }
+
+
+class MSDOSSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for simplistic MSDOS sessions.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'MSDOS Session'
+    aliases = ['doscon']
+    filenames = []
+    mimetypes = []
+
+    _innerLexerCls = BatchLexer
+    _ps1rgx = r'^([^>]+>)(.*\n?)'
+    _ps2 = 'More? '
+
+
+class TcshLexer(RegexLexer):
+    """
+    Lexer for tcsh scripts.
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'Tcsh'
+    aliases = ['tcsh', 'csh']
+    filenames = ['*.tcsh', '*.csh']
+    mimetypes = ['application/x-csh']
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'\$\(', Keyword, 'paren'),
+            (r'\$\{#?', Keyword, 'curly'),
+            (r'`', String.Backtick, 'backticks'),
+            include('data'),
+        ],
+        'basic': [
+            (r'\b(if|endif|else|while|then|foreach|case|default|'
+             r'continue|goto|breaksw|end|switch|endsw)\s*\b',
+             Keyword),
+            (r'\b(alias|alloc|bg|bindkey|break|builtins|bye|caller|cd|chdir|'
+             r'complete|dirs|echo|echotc|eval|exec|exit|fg|filetest|getxvers|'
+             r'glob|getspath|hashstat|history|hup|inlib|jobs|kill|'
+             r'limit|log|login|logout|ls-F|migrate|newgrp|nice|nohup|notify|'
+             r'onintr|popd|printenv|pushd|rehash|repeat|rootnode|popd|pushd|'
+             r'set|shift|sched|setenv|setpath|settc|setty|setxvers|shift|'
+             r'source|stop|suspend|source|suspend|telltc|time|'
+             r'umask|unalias|uncomplete|unhash|universe|unlimit|unset|unsetenv|'
+             r'ver|wait|warp|watchlog|where|which)\s*\b',
+             Name.Builtin),
+            (r'#.*', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
+            (r'[\[\]{}()=]+', Operator),
+            (r'<<\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r';', Punctuation),
+        ],
+        'data': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r'\s+', Text),
+            (r'[^=\s\[\]{}()$"\'`\\;#]+', Text),
+            (r'\d+(?= |\Z)', Number),
+            (r'\$#?(\w+|.)', Name.Variable),
+        ],
+        'curly': [
+            (r'\}', Keyword, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'backticks': [
+            (r'`', String.Backtick, '#pop'),
+            include('root'),
+        ],
+    }
+
+
+class TcshSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for Tcsh sessions.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Tcsh Session'
+    aliases = ['tcshcon']
+    filenames = []
+    mimetypes = []
+
+    _innerLexerCls = TcshLexer
+    _ps1rgx = r'^([^>]+>)(.*\n?)'
+    _ps2 = '? '
+
+
+class PowerShellLexer(RegexLexer):
+    """
+    For Windows PowerShell code.
+
+    .. versionadded:: 1.5
+    """
+    name = 'PowerShell'
+    aliases = ['powershell', 'posh', 'ps1', 'psm1']
+    filenames = ['*.ps1', '*.psm1']
+    mimetypes = ['text/x-powershell']
+
+    flags = re.DOTALL | re.IGNORECASE | re.MULTILINE
+
+    keywords = (
+        'while validateset validaterange validatepattern validatelength '
+        'validatecount until trap switch return ref process param parameter in '
+        'if global: function foreach for finally filter end elseif else '
+        'dynamicparam do default continue cmdletbinding break begin alias \\? '
+        '% #script #private #local #global mandatory parametersetname position '
+        'valuefrompipeline valuefrompipelinebypropertyname '
+        'valuefromremainingarguments helpmessage try catch throw').split()
+
+    operators = (
+        'and as band bnot bor bxor casesensitive ccontains ceq cge cgt cle '
+        'clike clt cmatch cne cnotcontains cnotlike cnotmatch contains '
+        'creplace eq exact f file ge gt icontains ieq ige igt ile ilike ilt '
+        'imatch ine inotcontains inotlike inotmatch ireplace is isnot le like '
+        'lt match ne not notcontains notlike notmatch or regex replace '
+        'wildcard').split()
+
+    verbs = (
+        'write where wait use update unregister undo trace test tee take '
+        'suspend stop start split sort skip show set send select scroll resume '
+        'restore restart resolve resize reset rename remove register receive '
+        'read push pop ping out new move measure limit join invoke import '
+        'group get format foreach export expand exit enter enable disconnect '
+        'disable debug cxnew copy convertto convertfrom convert connect '
+        'complete compare clear checkpoint aggregate add').split()
+
+    commenthelp = (
+        'component description example externalhelp forwardhelpcategory '
+        'forwardhelptargetname functionality inputs link '
+        'notes outputs parameter remotehelprunspace role synopsis').split()
+
+    tokens = {
+        'root': [
+            # we need to count pairs of parentheses for correct highlight
+            # of '$(...)' blocks in strings
+            (r'\(', Punctuation, 'child'),
+            (r'\s+', Text),
+            (r'^(\s*#[#\s]*)(\.(?:%s))([^\n]*$)' % '|'.join(commenthelp),
+             bygroups(Comment, String.Doc, Comment)),
+            (r'#[^\n]*?$', Comment),
+            (r'(&lt;|<)#', Comment.Multiline, 'multline'),
+            (r'@"\n', String.Heredoc, 'heredoc-double'),
+            (r"@'\n.*?\n'@", String.Heredoc),
+            # escaped syntax
+            (r'`[\'"$@-]', Punctuation),
+            (r'"', String.Double, 'string'),
+            (r"'([^']|'')*'", String.Single),
+            (r'(\$|@@|@)((global|script|private|env):)?\w+',
+             Name.Variable),
+            (r'(%s)\b' % '|'.join(keywords), Keyword),
+            (r'-(%s)\b' % '|'.join(operators), Operator),
+            (r'(%s)-[a-z_]\w*\b' % '|'.join(verbs), Name.Builtin),
+            (r'\[[a-z_\[][\w. `,\[\]]*\]', Name.Constant),  # .net [type]s
+            (r'-[a-z_]\w*', Name),
+            (r'\w+', Name),
+            (r'[.,;@{}\[\]$()=+*/\\&%!~?^`|<>-]|::', Punctuation),
+        ],
+        'child': [
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'multline': [
+            (r'[^#&.]+', Comment.Multiline),
+            (r'#(>|&gt;)', Comment.Multiline, '#pop'),
+            (r'\.(%s)' % '|'.join(commenthelp), String.Doc),
+            (r'[#&.]', Comment.Multiline),
+        ],
+        'string': [
+            (r"`[0abfnrtv'\"$`]", String.Escape),
+            (r'[^$`"]+', String.Double),
+            (r'\$\(', Punctuation, 'child'),
+            (r'""', String.Double),
+            (r'[`$]', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'heredoc-double': [
+            (r'\n"@', String.Heredoc, '#pop'),
+            (r'\$\(', Punctuation, 'child'),
+            (r'[^@\n]+"]', String.Heredoc),
+            (r".", String.Heredoc),
+        ]
+    }
+
+
+class PowerShellSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for simplistic Windows PowerShell sessions.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'PowerShell Session'
+    aliases = ['ps1con']
+    filenames = []
+    mimetypes = []
+
+    _innerLexerCls = PowerShellLexer
+    _ps1rgx = r'^(PS [^>]+> )(.*\n?)'
+    _ps2 = '>> '
+
+
+class FishShellLexer(RegexLexer):
+    """
+    Lexer for Fish shell scripts.
+
+    .. versionadded:: 2.1
+    """
+
+    name = 'Fish'
+    aliases = ['fish', 'fishshell']
+    filenames = ['*.fish', '*.load']
+    mimetypes = ['application/x-fish']
+
+    tokens = {
+        'root': [
+            include('basic'),
+            include('data'),
+            include('interp'),
+        ],
+        'interp': [
+            (r'\$\(\(', Keyword, 'math'),
+            (r'\(', Keyword, 'paren'),
+            (r'\$#?(\w+|.)', Name.Variable),
+        ],
+        'basic': [
+            (r'\b(begin|end|if|else|while|break|for|in|return|function|block|'
+             r'case|continue|switch|not|and|or|set|echo|exit|pwd|true|false|'
+             r'cd|count|test)(\s*)\b',
+             bygroups(Keyword, Text)),
+            (r'\b(alias|bg|bind|breakpoint|builtin|command|commandline|'
+             r'complete|contains|dirh|dirs|emit|eval|exec|fg|fish|fish_config|'
+             r'fish_indent|fish_pager|fish_prompt|fish_right_prompt|'
+             r'fish_update_completions|fishd|funced|funcsave|functions|help|'
+             r'history|isatty|jobs|math|mimedb|nextd|open|popd|prevd|psub|'
+             r'pushd|random|read|set_color|source|status|trap|type|ulimit|'
+             r'umask|vared|fc|getopts|hash|kill|printf|time|wait)\s*\b(?!\.)',
+             Name.Builtin),
+            (r'#.*\n', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
+            (r'[\[\]()=]', Operator),
+            (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+        ],
+        'data': [
+            (r'(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r"(?s)'.*?'", String.Single),
+            (r';', Punctuation),
+            (r'&|\||\^|<|>', Operator),
+            (r'\s+', Text),
+            (r'\d+(?= |\Z)', Number),
+            (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'math': [
+            (r'\)\)', Keyword, '#pop'),
+            (r'[-+*/%^|&]|\*\*|\|\|', Operator),
+            (r'\d+#\d+', Number),
+            (r'\d+#(?! )', Number),
+            (r'\d+', Number),
+            include('root'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/diff.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/diff.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/diff.py	(revision 1126)
@@ -0,0 +1,165 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.diff
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for diff/patch formats.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, Generic, \
+    Literal
+
+__all__ = ['DiffLexer', 'DarcsPatchLexer', 'WDiffLexer']
+
+
+class DiffLexer(RegexLexer):
+    """
+    Lexer for unified or context-style diffs or patches.
+    """
+
+    name = 'Diff'
+    aliases = ['diff', 'udiff']
+    filenames = ['*.diff', '*.patch']
+    mimetypes = ['text/x-diff', 'text/x-patch']
+
+    tokens = {
+        'root': [
+            (r' .*\n', Text),
+            (r'\+.*\n', Generic.Inserted),
+            (r'-.*\n', Generic.Deleted),
+            (r'!.*\n', Generic.Strong),
+            (r'@.*\n', Generic.Subheading),
+            (r'([Ii]ndex|diff).*\n', Generic.Heading),
+            (r'=.*\n', Generic.Heading),
+            (r'.*\n', Text),
+        ]
+    }
+
+    def analyse_text(text):
+        if text[:7] == 'Index: ':
+            return True
+        if text[:5] == 'diff ':
+            return True
+        if text[:4] == '--- ':
+            return 0.9
+
+
+class DarcsPatchLexer(RegexLexer):
+    """
+    DarcsPatchLexer is a lexer for the various versions of the darcs patch
+    format.  Examples of this format are derived by commands such as
+    ``darcs annotate --patch`` and ``darcs send``.
+
+    .. versionadded:: 0.10
+    """
+
+    name = 'Darcs Patch'
+    aliases = ['dpatch']
+    filenames = ['*.dpatch', '*.darcspatch']
+
+    DPATCH_KEYWORDS = ('hunk', 'addfile', 'adddir', 'rmfile', 'rmdir', 'move',
+                       'replace')
+
+    tokens = {
+        'root': [
+            (r'<', Operator),
+            (r'>', Operator),
+            (r'\{', Operator),
+            (r'\}', Operator),
+            (r'(\[)((?:TAG )?)(.*)(\n)(.*)(\*\*)(\d+)(\s?)(\])',
+             bygroups(Operator, Keyword, Name, Text, Name, Operator,
+                      Literal.Date, Text, Operator)),
+            (r'(\[)((?:TAG )?)(.*)(\n)(.*)(\*\*)(\d+)(\s?)',
+             bygroups(Operator, Keyword, Name, Text, Name, Operator,
+                      Literal.Date, Text), 'comment'),
+            (r'New patches:', Generic.Heading),
+            (r'Context:', Generic.Heading),
+            (r'Patch bundle hash:', Generic.Heading),
+            (r'(\s*)(%s)(.*\n)' % '|'.join(DPATCH_KEYWORDS),
+                bygroups(Text, Keyword, Text)),
+            (r'\+', Generic.Inserted, "insert"),
+            (r'-', Generic.Deleted, "delete"),
+            (r'.*\n', Text),
+        ],
+        'comment': [
+            (r'[^\]].*\n', Comment),
+            (r'\]', Operator, "#pop"),
+        ],
+        'specialText': [            # darcs add [_CODE_] special operators for clarity
+            (r'\n', Text, "#pop"),  # line-based
+            (r'\[_[^_]*_]', Operator),
+        ],
+        'insert': [
+            include('specialText'),
+            (r'\[', Generic.Inserted),
+            (r'[^\n\[]+', Generic.Inserted),
+        ],
+        'delete': [
+            include('specialText'),
+            (r'\[', Generic.Deleted),
+            (r'[^\n\[]+', Generic.Deleted),
+        ],
+    }
+
+
+class WDiffLexer(RegexLexer):
+    """
+    A `wdiff <https://www.gnu.org/software/wdiff/>`_ lexer.
+
+    Note that:
+
+    * only to normal output (without option like -l).
+    * if target files of wdiff contain "[-", "-]", "{+", "+}",
+      especially they are unbalanced, this lexer will get confusing.
+
+    .. versionadded:: 2.2
+    """
+
+    name = 'WDiff'
+    aliases = ['wdiff']
+    filenames = ['*.wdiff']
+    mimetypes = []
+
+    flags = re.MULTILINE | re.DOTALL
+
+    # We can only assume "[-" after "[-" before "-]" is `nested`,
+    # for instance wdiff to wdiff outputs. We have no way to
+    # distinct these marker is of wdiff output from original text.
+
+    ins_op = r"\{\+"
+    ins_cl = r"\+\}"
+    del_op = r"\[\-"
+    del_cl = r"\-\]"
+    normal = r'[^{}[\]+-]+'  # for performance
+    tokens = {
+        'root': [
+            (ins_op, Generic.Inserted, 'inserted'),
+            (del_op, Generic.Deleted, 'deleted'),
+            (normal, Text),
+            (r'.', Text),
+        ],
+        'inserted': [
+            (ins_op, Generic.Inserted, '#push'),
+            (del_op, Generic.Inserted, '#push'),
+            (del_cl, Generic.Inserted, '#pop'),
+
+            (ins_cl, Generic.Inserted, '#pop'),
+            (normal, Generic.Inserted),
+            (r'.', Generic.Inserted),
+        ],
+        'deleted': [
+            (del_op, Generic.Deleted, '#push'),
+            (ins_op, Generic.Deleted, '#push'),
+            (ins_cl, Generic.Deleted, '#pop'),
+
+            (del_cl, Generic.Deleted, '#pop'),
+            (normal, Generic.Deleted),
+            (r'.', Generic.Deleted),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/varnish.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/varnish.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexers/varnish.py	(revision 1126)
@@ -0,0 +1,190 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexers.varnish
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Varnish configuration
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, \
+    inherit, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['VCLLexer', 'VCLSnippetLexer']
+
+
+class VCLLexer(RegexLexer):
+    """
+    For Varnish Configuration Language (VCL).
+
+    .. versionadded:: 2.2
+    """
+    name = 'VCL'
+    aliases = ['vcl']
+    filenames = ['*.vcl']
+    mimetypes = ['text/x-vclsrc']
+
+    def analyse_text(text):
+        # If the very first line is 'vcl 4.0;' it's pretty much guaranteed
+        # that this is VCL
+        if text.startswith('vcl 4.0;'):
+            return 1.0
+        # Skip over comments and blank lines
+        # This is accurate enough that returning 0.9 is reasonable.
+        # Almost no VCL files start without some comments.
+        elif '\nvcl 4\.0;' in text[:1000]:
+            return 0.9
+
+    tokens = {
+        'probe': [
+            include('whitespace'),
+            include('comments'),
+            (r'(\.\w+)(\s*=\s*)([^;]*)(;)',
+             bygroups(Name.Attribute, Operator, using(this), Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'acl': [
+            include('whitespace'),
+            include('comments'),
+            (r'[!/]+', Operator),
+            (r';', Punctuation),
+            (r'\d+', Number),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'backend': [
+            include('whitespace'),
+            (r'(\.probe)(\s*=\s*)(\w+)(;)',
+             bygroups(Name.Attribute, Operator, Name.Variable.Global, Punctuation)),
+            (r'(\.probe)(\s*=\s*)(\{)',
+             bygroups(Name.Attribute, Operator, Punctuation), 'probe'),
+            (r'(\.\w+\b)(\s*=\s*)([^;]*)(\s*;)',
+             bygroups(Name.Attribute, Operator, using(this), Punctuation)),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'statements': [
+            (r'(\d\.)?\d+[sdwhmy]', Literal.Date),
+            (r'(\d\.)?\d+ms', Literal.Date),
+            (r'(vcl_pass|vcl_hash|vcl_hit|vcl_init|vcl_backend_fetch|vcl_pipe|'
+             r'vcl_backend_response|vcl_synth|vcl_deliver|vcl_backend_error|'
+             r'vcl_fini|vcl_recv|vcl_purge|vcl_miss)\b', Name.Function),
+            (r'(pipe|retry|hash|synth|deliver|purge|abandon|lookup|pass|fail|ok|'
+             r'miss|fetch|restart)\b', Name.Constant),
+            (r'(beresp|obj|resp|req|req_top|bereq)\.http\.[a-zA-Z_-]+\b', Name.Variable),
+            (words((
+                'obj.status', 'req.hash_always_miss', 'beresp.backend', 'req.esi_level',
+                'req.can_gzip', 'beresp.ttl', 'obj.uncacheable', 'req.ttl', 'obj.hits',
+                'client.identity', 'req.hash_ignore_busy', 'obj.reason', 'req.xid',
+                'req_top.proto', 'beresp.age', 'obj.proto', 'obj.age', 'local.ip',
+                'beresp.uncacheable', 'req.method', 'beresp.backend.ip', 'now',
+                'obj.grace', 'req.restarts', 'beresp.keep', 'req.proto', 'resp.proto',
+                'bereq.xid', 'bereq.between_bytes_timeout', 'req.esi',
+                'bereq.first_byte_timeout', 'bereq.method', 'bereq.connect_timeout',
+                'beresp.do_gzip',  'resp.status', 'beresp.do_gunzip',
+                'beresp.storage_hint', 'resp.is_streaming', 'beresp.do_stream',
+                'req_top.method', 'bereq.backend', 'beresp.backend.name', 'beresp.status',
+                'req.url', 'obj.keep', 'obj.ttl', 'beresp.reason', 'bereq.retries',
+                'resp.reason', 'bereq.url', 'beresp.do_esi', 'beresp.proto', 'client.ip',
+                'bereq.proto', 'server.hostname', 'remote.ip', 'req.backend_hint',
+                'server.identity', 'req_top.url', 'beresp.grace', 'beresp.was_304',
+                'server.ip', 'bereq.uncacheable'), suffix=r'\b'),
+             Name.Variable),
+            (r'[!%&+*\-,/<.}{>=|~]+', Operator),
+            (r'[();]', Punctuation),
+
+            (r'[,]+', Punctuation),
+            (words(('hash_data', 'regsub', 'regsuball', 'if', 'else',
+                    'elsif', 'elif', 'synth', 'synthetic', 'ban',
+                    'return', 'set', 'unset', 'import', 'include', 'new',
+                    'rollback', 'call'), suffix=r'\b'),
+             Keyword),
+            (r'storage\.\w+\.\w+\b', Name.Variable),
+            (words(('true', 'false')), Name.Builtin),
+            (r'\d+\b', Number),
+            (r'(backend)(\s+\w+)(\s*\{)',
+             bygroups(Keyword, Name.Variable.Global, Punctuation), 'backend'),
+            (r'(probe\s)(\s*\w+\s)(\{)',
+             bygroups(Keyword, Name.Variable.Global, Punctuation), 'probe'),
+            (r'(acl\s)(\s*\w+\s)(\{)',
+             bygroups(Keyword, Name.Variable.Global, Punctuation), 'acl'),
+            (r'(vcl )(4.0)(;)$',
+             bygroups(Keyword.Reserved, Name.Constant, Punctuation)),
+            (r'(sub\s+)([a-zA-Z]\w*)(\s*\{)',
+                bygroups(Keyword, Name.Function, Punctuation)),
+            (r'([a-zA-Z_]\w*)'
+             r'(\.)'
+             r'([a-zA-Z_]\w*)'
+             r'(\s*\(.*\))',
+             bygroups(Name.Function, Punctuation, Name.Function, using(this))),
+            ('[a-zA-Z_]\w*', Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'comments': [
+            (r'#.*$', Comment),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'//.*$', Comment),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'[^"\n]+', String),  # all other characters
+        ],
+        'multistring': [
+            (r'[^"}]', String),
+            (r'"\}', String, '#pop'),
+            (r'["}]', String),
+        ],
+        'whitespace': [
+            (r'L?"', String, 'string'),
+            (r'\{"', String, 'multistring'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+        ],
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            include('statements'),
+            (r'\s+', Text),
+        ],
+    }
+
+
+class VCLSnippetLexer(VCLLexer):
+    """
+    For Varnish Configuration Language snippets.
+
+    .. versionadded:: 2.2
+    """
+    name = 'VCLSnippets'
+    aliases = ['vclsnippets', 'vclsnippet']
+    mimetypes = ['text/x-vclsnippet']
+    filenames = []
+
+    def analyse_text(text):
+        # override method inherited from VCLLexer
+        return 0
+
+    tokens = {
+        'snippetspre': [
+            (r'\.\.\.+', Comment),
+            (r'(bereq|req|req_top|resp|beresp|obj|client|server|local|remote|'
+             r'storage)($|\.\*)', Name.Variable),
+        ],
+        'snippetspost': [
+            (r'(backend)\b', Keyword.Reserved),
+        ],
+        'root': [
+            include('snippetspre'),
+            inherit,
+            include('snippetspost'),
+        ],
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/util.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/util.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/util.py	(revision 1126)
@@ -0,0 +1,388 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.util
+    ~~~~~~~~~~~~~
+
+    Utility functions.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import sys
+
+
+split_path_re = re.compile(r'[/\\ ]')
+doctype_lookup_re = re.compile(r'''
+    (<\?.*?\?>)?\s*
+    <!DOCTYPE\s+(
+     [a-zA-Z_][a-zA-Z0-9]*
+     (?: \s+      # optional in HTML5
+     [a-zA-Z_][a-zA-Z0-9]*\s+
+     "[^"]*")?
+     )
+     [^>]*>
+''', re.DOTALL | re.MULTILINE | re.VERBOSE)
+tag_re = re.compile(r'<(.+?)(\s.*?)?>.*?</.+?>',
+                    re.UNICODE | re.IGNORECASE | re.DOTALL | re.MULTILINE)
+xml_decl_re = re.compile(r'\s*<\?xml[^>]*\?>', re.I)
+
+
+class ClassNotFound(ValueError):
+    """Raised if one of the lookup functions didn't find a matching class."""
+
+
+class OptionError(Exception):
+    pass
+
+
+def get_choice_opt(options, optname, allowed, default=None, normcase=False):
+    string = options.get(optname, default)
+    if normcase:
+        string = string.lower()
+    if string not in allowed:
+        raise OptionError('Value for option %s must be one of %s' %
+                          (optname, ', '.join(map(str, allowed))))
+    return string
+
+
+def get_bool_opt(options, optname, default=None):
+    string = options.get(optname, default)
+    if isinstance(string, bool):
+        return string
+    elif isinstance(string, int):
+        return bool(string)
+    elif not isinstance(string, string_types):
+        raise OptionError('Invalid type %r for option %s; use '
+                          '1/0, yes/no, true/false, on/off' % (
+                              string, optname))
+    elif string.lower() in ('1', 'yes', 'true', 'on'):
+        return True
+    elif string.lower() in ('0', 'no', 'false', 'off'):
+        return False
+    else:
+        raise OptionError('Invalid value %r for option %s; use '
+                          '1/0, yes/no, true/false, on/off' % (
+                              string, optname))
+
+
+def get_int_opt(options, optname, default=None):
+    string = options.get(optname, default)
+    try:
+        return int(string)
+    except TypeError:
+        raise OptionError('Invalid type %r for option %s; you '
+                          'must give an integer value' % (
+                              string, optname))
+    except ValueError:
+        raise OptionError('Invalid value %r for option %s; you '
+                          'must give an integer value' % (
+                              string, optname))
+
+
+def get_list_opt(options, optname, default=None):
+    val = options.get(optname, default)
+    if isinstance(val, string_types):
+        return val.split()
+    elif isinstance(val, (list, tuple)):
+        return list(val)
+    else:
+        raise OptionError('Invalid type %r for option %s; you '
+                          'must give a list value' % (
+                              val, optname))
+
+
+def docstring_headline(obj):
+    if not obj.__doc__:
+        return ''
+    res = []
+    for line in obj.__doc__.strip().splitlines():
+        if line.strip():
+            res.append(" " + line.strip())
+        else:
+            break
+    return ''.join(res).lstrip()
+
+
+def make_analysator(f):
+    """Return a static text analyser function that returns float values."""
+    def text_analyse(text):
+        try:
+            rv = f(text)
+        except Exception:
+            return 0.0
+        if not rv:
+            return 0.0
+        try:
+            return min(1.0, max(0.0, float(rv)))
+        except (ValueError, TypeError):
+            return 0.0
+    text_analyse.__doc__ = f.__doc__
+    return staticmethod(text_analyse)
+
+
+def shebang_matches(text, regex):
+    r"""Check if the given regular expression matches the last part of the
+    shebang if one exists.
+
+        >>> from pygments.util import shebang_matches
+        >>> shebang_matches('#!/usr/bin/env python', r'python(2\.\d)?')
+        True
+        >>> shebang_matches('#!/usr/bin/python2.4', r'python(2\.\d)?')
+        True
+        >>> shebang_matches('#!/usr/bin/python-ruby', r'python(2\.\d)?')
+        False
+        >>> shebang_matches('#!/usr/bin/python/ruby', r'python(2\.\d)?')
+        False
+        >>> shebang_matches('#!/usr/bin/startsomethingwith python',
+        ...                 r'python(2\.\d)?')
+        True
+
+    It also checks for common windows executable file extensions::
+
+        >>> shebang_matches('#!C:\\Python2.4\\Python.exe', r'python(2\.\d)?')
+        True
+
+    Parameters (``'-f'`` or ``'--foo'`` are ignored so ``'perl'`` does
+    the same as ``'perl -e'``)
+
+    Note that this method automatically searches the whole string (eg:
+    the regular expression is wrapped in ``'^$'``)
+    """
+    index = text.find('\n')
+    if index >= 0:
+        first_line = text[:index].lower()
+    else:
+        first_line = text.lower()
+    if first_line.startswith('#!'):
+        try:
+            found = [x for x in split_path_re.split(first_line[2:].strip())
+                     if x and not x.startswith('-')][-1]
+        except IndexError:
+            return False
+        regex = re.compile(r'^%s(\.(exe|cmd|bat|bin))?$' % regex, re.IGNORECASE)
+        if regex.search(found) is not None:
+            return True
+    return False
+
+
+def doctype_matches(text, regex):
+    """Check if the doctype matches a regular expression (if present).
+
+    Note that this method only checks the first part of a DOCTYPE.
+    eg: 'html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'
+    """
+    m = doctype_lookup_re.match(text)
+    if m is None:
+        return False
+    doctype = m.group(2)
+    return re.compile(regex, re.I).match(doctype.strip()) is not None
+
+
+def html_doctype_matches(text):
+    """Check if the file looks like it has a html doctype."""
+    return doctype_matches(text, r'html')
+
+
+_looks_like_xml_cache = {}
+
+
+def looks_like_xml(text):
+    """Check if a doctype exists or if we have some tags."""
+    if xml_decl_re.match(text):
+        return True
+    key = hash(text)
+    try:
+        return _looks_like_xml_cache[key]
+    except KeyError:
+        m = doctype_lookup_re.match(text)
+        if m is not None:
+            return True
+        rv = tag_re.search(text[:1000]) is not None
+        _looks_like_xml_cache[key] = rv
+        return rv
+
+
+# Python narrow build compatibility
+
+def _surrogatepair(c):
+    # Given a unicode character code
+    # with length greater than 16 bits,
+    # return the two 16 bit surrogate pair.
+    # From example D28 of:
+    # http://www.unicode.org/book/ch03.pdf
+    return (0xd7c0 + (c >> 10), (0xdc00 + (c & 0x3ff)))
+
+
+def unirange(a, b):
+    """Returns a regular expression string to match the given non-BMP range."""
+    if b < a:
+        raise ValueError("Bad character range")
+    if a < 0x10000 or b < 0x10000:
+        raise ValueError("unirange is only defined for non-BMP ranges")
+
+    if sys.maxunicode > 0xffff:
+        # wide build
+        return u'[%s-%s]' % (unichr(a), unichr(b))
+    else:
+        # narrow build stores surrogates, and the 're' module handles them
+        # (incorrectly) as characters.  Since there is still ordering among
+        # these characters, expand the range to one that it understands.  Some
+        # background in http://bugs.python.org/issue3665 and
+        # http://bugs.python.org/issue12749
+        #
+        # Additionally, the lower constants are using unichr rather than
+        # literals because jython [which uses the wide path] can't load this
+        # file if they are literals.
+        ah, al = _surrogatepair(a)
+        bh, bl = _surrogatepair(b)
+        if ah == bh:
+            return u'(?:%s[%s-%s])' % (unichr(ah), unichr(al), unichr(bl))
+        else:
+            buf = []
+            buf.append(u'%s[%s-%s]' %
+                       (unichr(ah), unichr(al),
+                        ah == bh and unichr(bl) or unichr(0xdfff)))
+            if ah - bh > 1:
+                buf.append(u'[%s-%s][%s-%s]' %
+                           unichr(ah+1), unichr(bh-1), unichr(0xdc00), unichr(0xdfff))
+            if ah != bh:
+                buf.append(u'%s[%s-%s]' %
+                           (unichr(bh), unichr(0xdc00), unichr(bl)))
+
+            return u'(?:' + u'|'.join(buf) + u')'
+
+
+def format_lines(var_name, seq, raw=False, indent_level=0):
+    """Formats a sequence of strings for output."""
+    lines = []
+    base_indent = ' ' * indent_level * 4
+    inner_indent = ' ' * (indent_level + 1) * 4
+    lines.append(base_indent + var_name + ' = (')
+    if raw:
+        # These should be preformatted reprs of, say, tuples.
+        for i in seq:
+            lines.append(inner_indent + i + ',')
+    else:
+        for i in seq:
+            # Force use of single quotes
+            r = repr(i + '"')
+            lines.append(inner_indent + r[:-2] + r[-1] + ',')
+    lines.append(base_indent + ')')
+    return '\n'.join(lines)
+
+
+def duplicates_removed(it, already_seen=()):
+    """
+    Returns a list with duplicates removed from the iterable `it`.
+
+    Order is preserved.
+    """
+    lst = []
+    seen = set()
+    for i in it:
+        if i in seen or i in already_seen:
+            continue
+        lst.append(i)
+        seen.add(i)
+    return lst
+
+
+class Future(object):
+    """Generic class to defer some work.
+
+    Handled specially in RegexLexerMeta, to support regex string construction at
+    first use.
+    """
+    def get(self):
+        raise NotImplementedError
+
+
+def guess_decode(text):
+    """Decode *text* with guessed encoding.
+
+    First try UTF-8; this should fail for non-UTF-8 encodings.
+    Then try the preferred locale encoding.
+    Fall back to latin-1, which always works.
+    """
+    try:
+        text = text.decode('utf-8')
+        return text, 'utf-8'
+    except UnicodeDecodeError:
+        try:
+            import locale
+            prefencoding = locale.getpreferredencoding()
+            text = text.decode()
+            return text, prefencoding
+        except (UnicodeDecodeError, LookupError):
+            text = text.decode('latin1')
+            return text, 'latin1'
+
+
+def guess_decode_from_terminal(text, term):
+    """Decode *text* coming from terminal *term*.
+
+    First try the terminal encoding, if given.
+    Then try UTF-8.  Then try the preferred locale encoding.
+    Fall back to latin-1, which always works.
+    """
+    if getattr(term, 'encoding', None):
+        try:
+            text = text.decode(term.encoding)
+        except UnicodeDecodeError:
+            pass
+        else:
+            return text, term.encoding
+    return guess_decode(text)
+
+
+def terminal_encoding(term):
+    """Return our best guess of encoding for the given *term*."""
+    if getattr(term, 'encoding', None):
+        return term.encoding
+    import locale
+    return locale.getpreferredencoding()
+
+
+# Python 2/3 compatibility
+
+if sys.version_info < (3, 0):
+    unichr = unichr
+    xrange = xrange
+    string_types = (str, unicode)
+    text_type = unicode
+    u_prefix = 'u'
+    iteritems = dict.iteritems
+    itervalues = dict.itervalues
+    import StringIO
+    import cStringIO
+    # unfortunately, io.StringIO in Python 2 doesn't accept str at all
+    StringIO = StringIO.StringIO
+    BytesIO = cStringIO.StringIO
+else:
+    unichr = chr
+    xrange = range
+    string_types = (str,)
+    text_type = str
+    u_prefix = ''
+    iteritems = dict.items
+    itervalues = dict.values
+    from io import StringIO, BytesIO, TextIOWrapper
+
+    class UnclosingTextIOWrapper(TextIOWrapper):
+        # Don't close underlying buffer on destruction.
+        def close(self):
+            self.flush()
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        for slots_var in orig_vars.get('__slots__', ()):
+            orig_vars.pop(slots_var)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexer.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexer.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/pygments/lexer.py	(revision 1126)
@@ -0,0 +1,871 @@
+# -*- coding: utf-8 -*-
+"""
+    pygments.lexer
+    ~~~~~~~~~~~~~~
+
+    Base lexer classes.
+
+    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+import re
+import sys
+import time
+
+from pygments.filter import apply_filters, Filter
+from pygments.filters import get_filter_by_name
+from pygments.token import Error, Text, Other, _TokenType
+from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
+    make_analysator, text_type, add_metaclass, iteritems, Future, guess_decode
+from pygments.regexopt import regex_opt
+
+__all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer',
+           'LexerContext', 'include', 'inherit', 'bygroups', 'using', 'this',
+           'default', 'words']
+
+
+_encoding_map = [(b'\xef\xbb\xbf', 'utf-8'),
+                 (b'\xff\xfe\0\0', 'utf-32'),
+                 (b'\0\0\xfe\xff', 'utf-32be'),
+                 (b'\xff\xfe', 'utf-16'),
+                 (b'\xfe\xff', 'utf-16be')]
+
+_default_analyse = staticmethod(lambda x: 0.0)
+
+
+class LexerMeta(type):
+    """
+    This metaclass automagically converts ``analyse_text`` methods into
+    static methods which always return float values.
+    """
+
+    def __new__(mcs, name, bases, d):
+        if 'analyse_text' in d:
+            d['analyse_text'] = make_analysator(d['analyse_text'])
+        return type.__new__(mcs, name, bases, d)
+
+
+@add_metaclass(LexerMeta)
+class Lexer(object):
+    """
+    Lexer for a specific language.
+
+    Basic options recognized:
+    ``stripnl``
+        Strip leading and trailing newlines from the input (default: True).
+    ``stripall``
+        Strip all leading and trailing whitespace from the input
+        (default: False).
+    ``ensurenl``
+        Make sure that the input ends with a newline (default: True).  This
+        is required for some lexers that consume input linewise.
+
+        .. versionadded:: 1.3
+
+    ``tabsize``
+        If given and greater than 0, expand tabs in the input (default: 0).
+    ``encoding``
+        If given, must be an encoding name. This encoding will be used to
+        convert the input string to Unicode, if it is not already a Unicode
+        string (default: ``'guess'``, which uses a simple UTF-8 / Locale /
+        Latin1 detection.  Can also be ``'chardet'`` to use the chardet
+        library, if it is installed.
+    ``inencoding``
+        Overrides the ``encoding`` if given.
+    """
+
+    #: Name of the lexer
+    name = None
+
+    #: Shortcuts for the lexer
+    aliases = []
+
+    #: File name globs
+    filenames = []
+
+    #: Secondary file name globs
+    alias_filenames = []
+
+    #: MIME types
+    mimetypes = []
+
+    #: Priority, should multiple lexers match and no content is provided
+    priority = 0
+
+    def __init__(self, **options):
+        self.options = options
+        self.stripnl = get_bool_opt(options, 'stripnl', True)
+        self.stripall = get_bool_opt(options, 'stripall', False)
+        self.ensurenl = get_bool_opt(options, 'ensurenl', True)
+        self.tabsize = get_int_opt(options, 'tabsize', 0)
+        self.encoding = options.get('encoding', 'guess')
+        self.encoding = options.get('inencoding') or self.encoding
+        self.filters = []
+        for filter_ in get_list_opt(options, 'filters', ()):
+            self.add_filter(filter_)
+
+    def __repr__(self):
+        if self.options:
+            return '<pygments.lexers.%s with %r>' % (self.__class__.__name__,
+                                                     self.options)
+        else:
+            return '<pygments.lexers.%s>' % self.__class__.__name__
+
+    def add_filter(self, filter_, **options):
+        """
+        Add a new stream filter to this lexer.
+        """
+        if not isinstance(filter_, Filter):
+            filter_ = get_filter_by_name(filter_, **options)
+        self.filters.append(filter_)
+
+    def analyse_text(text):
+        """
+        Has to return a float between ``0`` and ``1`` that indicates
+        if a lexer wants to highlight this text. Used by ``guess_lexer``.
+        If this method returns ``0`` it won't highlight it in any case, if
+        it returns ``1`` highlighting with this lexer is guaranteed.
+
+        The `LexerMeta` metaclass automatically wraps this function so
+        that it works like a static method (no ``self`` or ``cls``
+        parameter) and the return value is automatically converted to
+        `float`. If the return value is an object that is boolean `False`
+        it's the same as if the return values was ``0.0``.
+        """
+
+    def get_tokens(self, text, unfiltered=False):
+        """
+        Return an iterable of (tokentype, value) pairs generated from
+        `text`. If `unfiltered` is set to `True`, the filtering mechanism
+        is bypassed even if filters are defined.
+
+        Also preprocess the text, i.e. expand tabs and strip it if
+        wanted and applies registered filters.
+        """
+        if not isinstance(text, text_type):
+            if self.encoding == 'guess':
+                text, _ = guess_decode(text)
+            elif self.encoding == 'chardet':
+                try:
+                    import chardet
+                except ImportError:
+                    raise ImportError('To enable chardet encoding guessing, '
+                                      'please install the chardet library '
+                                      'from http://chardet.feedparser.org/')
+                # check for BOM first
+                decoded = None
+                for bom, encoding in _encoding_map:
+                    if text.startswith(bom):
+                        decoded = text[len(bom):].decode(encoding, 'replace')
+                        break
+                # no BOM found, so use chardet
+                if decoded is None:
+                    enc = chardet.detect(text[:1024])  # Guess using first 1KB
+                    decoded = text.decode(enc.get('encoding') or 'utf-8',
+                                          'replace')
+                text = decoded
+            else:
+                text = text.decode(self.encoding)
+                if text.startswith(u'\ufeff'):
+                    text = text[len(u'\ufeff'):]
+        else:
+            if text.startswith(u'\ufeff'):
+                text = text[len(u'\ufeff'):]
+
+        # text now *is* a unicode string
+        text = text.replace('\r\n', '\n')
+        text = text.replace('\r', '\n')
+        if self.stripall:
+            text = text.strip()
+        elif self.stripnl:
+            text = text.strip('\n')
+        if self.tabsize > 0:
+            text = text.expandtabs(self.tabsize)
+        if self.ensurenl and not text.endswith('\n'):
+            text += '\n'
+
+        def streamer():
+            for _, t, v in self.get_tokens_unprocessed(text):
+                yield t, v
+        stream = streamer()
+        if not unfiltered:
+            stream = apply_filters(stream, self.filters, self)
+        return stream
+
+    def get_tokens_unprocessed(self, text):
+        """
+        Return an iterable of (index, tokentype, value) pairs where "index"
+        is the starting position of the token within the input text.
+
+        In subclasses, implement this method as a generator to
+        maximize effectiveness.
+        """
+        raise NotImplementedError
+
+
+class DelegatingLexer(Lexer):
+    """
+    This lexer takes two lexer as arguments. A root lexer and
+    a language lexer. First everything is scanned using the language
+    lexer, afterwards all ``Other`` tokens are lexed using the root
+    lexer.
+
+    The lexers from the ``template`` lexer package use this base lexer.
+    """
+
+    def __init__(self, _root_lexer, _language_lexer, _needle=Other, **options):
+        self.root_lexer = _root_lexer(**options)
+        self.language_lexer = _language_lexer(**options)
+        self.needle = _needle
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        buffered = ''
+        insertions = []
+        lng_buffer = []
+        for i, t, v in self.language_lexer.get_tokens_unprocessed(text):
+            if t is self.needle:
+                if lng_buffer:
+                    insertions.append((len(buffered), lng_buffer))
+                    lng_buffer = []
+                buffered += v
+            else:
+                lng_buffer.append((i, t, v))
+        if lng_buffer:
+            insertions.append((len(buffered), lng_buffer))
+        return do_insertions(insertions,
+                             self.root_lexer.get_tokens_unprocessed(buffered))
+
+
+# ------------------------------------------------------------------------------
+# RegexLexer and ExtendedRegexLexer
+#
+
+
+class include(str):  # pylint: disable=invalid-name
+    """
+    Indicates that a state should include rules from another state.
+    """
+    pass
+
+
+class _inherit(object):
+    """
+    Indicates the a state should inherit from its superclass.
+    """
+    def __repr__(self):
+        return 'inherit'
+
+inherit = _inherit()  # pylint: disable=invalid-name
+
+
+class combined(tuple):  # pylint: disable=invalid-name
+    """
+    Indicates a state combined from multiple states.
+    """
+
+    def __new__(cls, *args):
+        return tuple.__new__(cls, args)
+
+    def __init__(self, *args):
+        # tuple.__init__ doesn't do anything
+        pass
+
+
+class _PseudoMatch(object):
+    """
+    A pseudo match object constructed from a string.
+    """
+
+    def __init__(self, start, text):
+        self._text = text
+        self._start = start
+
+    def start(self, arg=None):
+        return self._start
+
+    def end(self, arg=None):
+        return self._start + len(self._text)
+
+    def group(self, arg=None):
+        if arg:
+            raise IndexError('No such group')
+        return self._text
+
+    def groups(self):
+        return (self._text,)
+
+    def groupdict(self):
+        return {}
+
+
+def bygroups(*args):
+    """
+    Callback that yields multiple actions for each group in the match.
+    """
+    def callback(lexer, match, ctx=None):
+        for i, action in enumerate(args):
+            if action is None:
+                continue
+            elif type(action) is _TokenType:
+                data = match.group(i + 1)
+                if data:
+                    yield match.start(i + 1), action, data
+            else:
+                data = match.group(i + 1)
+                if data is not None:
+                    if ctx:
+                        ctx.pos = match.start(i + 1)
+                    for item in action(lexer,
+                                       _PseudoMatch(match.start(i + 1), data), ctx):
+                        if item:
+                            yield item
+        if ctx:
+            ctx.pos = match.end()
+    return callback
+
+
+class _This(object):
+    """
+    Special singleton used for indicating the caller class.
+    Used by ``using``.
+    """
+this = _This()
+
+
+def using(_other, **kwargs):
+    """
+    Callback that processes the match with a different lexer.
+
+    The keyword arguments are forwarded to the lexer, except `state` which
+    is handled separately.
+
+    `state` specifies the state that the new lexer will start in, and can
+    be an enumerable such as ('root', 'inline', 'string') or a simple
+    string which is assumed to be on top of the root state.
+
+    Note: For that to work, `_other` must not be an `ExtendedRegexLexer`.
+    """
+    gt_kwargs = {}
+    if 'state' in kwargs:
+        s = kwargs.pop('state')
+        if isinstance(s, (list, tuple)):
+            gt_kwargs['stack'] = s
+        else:
+            gt_kwargs['stack'] = ('root', s)
+
+    if _other is this:
+        def callback(lexer, match, ctx=None):
+            # if keyword arguments are given the callback
+            # function has to create a new lexer instance
+            if kwargs:
+                # XXX: cache that somehow
+                kwargs.update(lexer.options)
+                lx = lexer.__class__(**kwargs)
+            else:
+                lx = lexer
+            s = match.start()
+            for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs):
+                yield i + s, t, v
+            if ctx:
+                ctx.pos = match.end()
+    else:
+        def callback(lexer, match, ctx=None):
+            # XXX: cache that somehow
+            kwargs.update(lexer.options)
+            lx = _other(**kwargs)
+
+            s = match.start()
+            for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs):
+                yield i + s, t, v
+            if ctx:
+                ctx.pos = match.end()
+    return callback
+
+
+class default:
+    """
+    Indicates a state or state action (e.g. #pop) to apply.
+    For example default('#pop') is equivalent to ('', Token, '#pop')
+    Note that state tuples may be used as well.
+
+    .. versionadded:: 2.0
+    """
+    def __init__(self, state):
+        self.state = state
+
+
+class words(Future):
+    """
+    Indicates a list of literal words that is transformed into an optimized
+    regex that matches any of the words.
+
+    .. versionadded:: 2.0
+    """
+    def __init__(self, words, prefix='', suffix=''):
+        self.words = words
+        self.prefix = prefix
+        self.suffix = suffix
+
+    def get(self):
+        return regex_opt(self.words, prefix=self.prefix, suffix=self.suffix)
+
+
+class RegexLexerMeta(LexerMeta):
+    """
+    Metaclass for RegexLexer, creates the self._tokens attribute from
+    self.tokens on the first instantiation.
+    """
+
+    def _process_regex(cls, regex, rflags, state):
+        """Preprocess the regular expression component of a token definition."""
+        if isinstance(regex, Future):
+            regex = regex.get()
+        return re.compile(regex, rflags).match
+
+    def _process_token(cls, token):
+        """Preprocess the token component of a token definition."""
+        assert type(token) is _TokenType or callable(token), \
+            'token type must be simple type or callable, not %r' % (token,)
+        return token
+
+    def _process_new_state(cls, new_state, unprocessed, processed):
+        """Preprocess the state transition action of a token definition."""
+        if isinstance(new_state, str):
+            # an existing state
+            if new_state == '#pop':
+                return -1
+            elif new_state in unprocessed:
+                return (new_state,)
+            elif new_state == '#push':
+                return new_state
+            elif new_state[:5] == '#pop:':
+                return -int(new_state[5:])
+            else:
+                assert False, 'unknown new state %r' % new_state
+        elif isinstance(new_state, combined):
+            # combine a new state from existing ones
+            tmp_state = '_tmp_%d' % cls._tmpname
+            cls._tmpname += 1
+            itokens = []
+            for istate in new_state:
+                assert istate != new_state, 'circular state ref %r' % istate
+                itokens.extend(cls._process_state(unprocessed,
+                                                  processed, istate))
+            processed[tmp_state] = itokens
+            return (tmp_state,)
+        elif isinstance(new_state, tuple):
+            # push more than one state
+            for istate in new_state:
+                assert (istate in unprocessed or
+                        istate in ('#pop', '#push')), \
+                    'unknown new state ' + istate
+            return new_state
+        else:
+            assert False, 'unknown new state def %r' % new_state
+
+    def _process_state(cls, unprocessed, processed, state):
+        """Preprocess a single state definition."""
+        assert type(state) is str, "wrong state name %r" % state
+        assert state[0] != '#', "invalid state name %r" % state
+        if state in processed:
+            return processed[state]
+        tokens = processed[state] = []
+        rflags = cls.flags
+        for tdef in unprocessed[state]:
+            if isinstance(tdef, include):
+                # it's a state reference
+                assert tdef != state, "circular state reference %r" % state
+                tokens.extend(cls._process_state(unprocessed, processed,
+                                                 str(tdef)))
+                continue
+            if isinstance(tdef, _inherit):
+                # should be processed already, but may not in the case of:
+                # 1. the state has no counterpart in any parent
+                # 2. the state includes more than one 'inherit'
+                continue
+            if isinstance(tdef, default):
+                new_state = cls._process_new_state(tdef.state, unprocessed, processed)
+                tokens.append((re.compile('').match, None, new_state))
+                continue
+
+            assert type(tdef) is tuple, "wrong rule def %r" % tdef
+
+            try:
+                rex = cls._process_regex(tdef[0], rflags, state)
+            except Exception as err:
+                raise ValueError("uncompilable regex %r in state %r of %r: %s" %
+                                 (tdef[0], state, cls, err))
+
+            token = cls._process_token(tdef[1])
+
+            if len(tdef) == 2:
+                new_state = None
+            else:
+                new_state = cls._process_new_state(tdef[2],
+                                                   unprocessed, processed)
+
+            tokens.append((rex, token, new_state))
+        return tokens
+
+    def process_tokendef(cls, name, tokendefs=None):
+        """Preprocess a dictionary of token definitions."""
+        processed = cls._all_tokens[name] = {}
+        tokendefs = tokendefs or cls.tokens[name]
+        for state in list(tokendefs):
+            cls._process_state(tokendefs, processed, state)
+        return processed
+
+    def get_tokendefs(cls):
+        """
+        Merge tokens from superclasses in MRO order, returning a single tokendef
+        dictionary.
+
+        Any state that is not defined by a subclass will be inherited
+        automatically.  States that *are* defined by subclasses will, by
+        default, override that state in the superclass.  If a subclass wishes to
+        inherit definitions from a superclass, it can use the special value
+        "inherit", which will cause the superclass' state definition to be
+        included at that point in the state.
+        """
+        tokens = {}
+        inheritable = {}
+        for c in cls.__mro__:
+            toks = c.__dict__.get('tokens', {})
+
+            for state, items in iteritems(toks):
+                curitems = tokens.get(state)
+                if curitems is None:
+                    # N.b. because this is assigned by reference, sufficiently
+                    # deep hierarchies are processed incrementally (e.g. for
+                    # A(B), B(C), C(RegexLexer), B will be premodified so X(B)
+                    # will not see any inherits in B).
+                    tokens[state] = items
+                    try:
+                        inherit_ndx = items.index(inherit)
+                    except ValueError:
+                        continue
+                    inheritable[state] = inherit_ndx
+                    continue
+
+                inherit_ndx = inheritable.pop(state, None)
+                if inherit_ndx is None:
+                    continue
+
+                # Replace the "inherit" value with the items
+                curitems[inherit_ndx:inherit_ndx+1] = items
+                try:
+                    # N.b. this is the index in items (that is, the superclass
+                    # copy), so offset required when storing below.
+                    new_inh_ndx = items.index(inherit)
+                except ValueError:
+                    pass
+                else:
+                    inheritable[state] = inherit_ndx + new_inh_ndx
+
+        return tokens
+
+    def __call__(cls, *args, **kwds):
+        """Instantiate cls after preprocessing its token definitions."""
+        if '_tokens' not in cls.__dict__:
+            cls._all_tokens = {}
+            cls._tmpname = 0
+            if hasattr(cls, 'token_variants') and cls.token_variants:
+                # don't process yet
+                pass
+            else:
+                cls._tokens = cls.process_tokendef('', cls.get_tokendefs())
+
+        return type.__call__(cls, *args, **kwds)
+
+
+@add_metaclass(RegexLexerMeta)
+class RegexLexer(Lexer):
+    """
+    Base for simple stateful regular expression-based lexers.
+    Simplifies the lexing process so that you need only
+    provide a list of states and regular expressions.
+    """
+
+    #: Flags for compiling the regular expressions.
+    #: Defaults to MULTILINE.
+    flags = re.MULTILINE
+
+    #: Dict of ``{'state': [(regex, tokentype, new_state), ...], ...}``
+    #:
+    #: The initial state is 'root'.
+    #: ``new_state`` can be omitted to signify no state transition.
+    #: If it is a string, the state is pushed on the stack and changed.
+    #: If it is a tuple of strings, all states are pushed on the stack and
+    #: the current state will be the topmost.
+    #: It can also be ``combined('state1', 'state2', ...)``
+    #: to signify a new, anonymous state combined from the rules of two
+    #: or more existing ones.
+    #: Furthermore, it can be '#pop' to signify going back one step in
+    #: the state stack, or '#push' to push the current state on the stack
+    #: again.
+    #:
+    #: The tuple can also be replaced with ``include('state')``, in which
+    #: case the rules from the state named by the string are included in the
+    #: current one.
+    tokens = {}
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        """
+        Split ``text`` into (tokentype, text) pairs.
+
+        ``stack`` is the inital stack (default: ``['root']``)
+        """
+        pos = 0
+        tokendefs = self._tokens
+        statestack = list(stack)
+        statetokens = tokendefs[statestack[-1]]
+        while 1:
+            for rexmatch, action, new_state in statetokens:
+                m = rexmatch(text, pos)
+                if m:
+                    if action is not None:
+                        if type(action) is _TokenType:
+                            yield pos, action, m.group()
+                        else:
+                            for item in action(self, m):
+                                yield item
+                    pos = m.end()
+                    if new_state is not None:
+                        # state transition
+                        if isinstance(new_state, tuple):
+                            for state in new_state:
+                                if state == '#pop':
+                                    statestack.pop()
+                                elif state == '#push':
+                                    statestack.append(statestack[-1])
+                                else:
+                                    statestack.append(state)
+                        elif isinstance(new_state, int):
+                            # pop
+                            del statestack[new_state:]
+                        elif new_state == '#push':
+                            statestack.append(statestack[-1])
+                        else:
+                            assert False, "wrong state def: %r" % new_state
+                        statetokens = tokendefs[statestack[-1]]
+                    break
+            else:
+                # We are here only if all state tokens have been considered
+                # and there was not a match on any of them.
+                try:
+                    if text[pos] == '\n':
+                        # at EOL, reset state to "root"
+                        statestack = ['root']
+                        statetokens = tokendefs['root']
+                        yield pos, Text, u'\n'
+                        pos += 1
+                        continue
+                    yield pos, Error, text[pos]
+                    pos += 1
+                except IndexError:
+                    break
+
+
+class LexerContext(object):
+    """
+    A helper object that holds lexer position data.
+    """
+
+    def __init__(self, text, pos, stack=None, end=None):
+        self.text = text
+        self.pos = pos
+        self.end = end or len(text)  # end=0 not supported ;-)
+        self.stack = stack or ['root']
+
+    def __repr__(self):
+        return 'LexerContext(%r, %r, %r)' % (
+            self.text, self.pos, self.stack)
+
+
+class ExtendedRegexLexer(RegexLexer):
+    """
+    A RegexLexer that uses a context object to store its state.
+    """
+
+    def get_tokens_unprocessed(self, text=None, context=None):
+        """
+        Split ``text`` into (tokentype, text) pairs.
+        If ``context`` is given, use this lexer context instead.
+        """
+        tokendefs = self._tokens
+        if not context:
+            ctx = LexerContext(text, 0)
+            statetokens = tokendefs['root']
+        else:
+            ctx = context
+            statetokens = tokendefs[ctx.stack[-1]]
+            text = ctx.text
+        while 1:
+            for rexmatch, action, new_state in statetokens:
+                m = rexmatch(text, ctx.pos, ctx.end)
+                if m:
+                    if action is not None:
+                        if type(action) is _TokenType:
+                            yield ctx.pos, action, m.group()
+                            ctx.pos = m.end()
+                        else:
+                            for item in action(self, m, ctx):
+                                yield item
+                            if not new_state:
+                                # altered the state stack?
+                                statetokens = tokendefs[ctx.stack[-1]]
+                    # CAUTION: callback must set ctx.pos!
+                    if new_state is not None:
+                        # state transition
+                        if isinstance(new_state, tuple):
+                            for state in new_state:
+                                if state == '#pop':
+                                    ctx.stack.pop()
+                                elif state == '#push':
+                                    ctx.stack.append(ctx.stack[-1])
+                                else:
+                                    ctx.stack.append(state)
+                        elif isinstance(new_state, int):
+                            # pop
+                            del ctx.stack[new_state:]
+                        elif new_state == '#push':
+                            ctx.stack.append(ctx.stack[-1])
+                        else:
+                            assert False, "wrong state def: %r" % new_state
+                        statetokens = tokendefs[ctx.stack[-1]]
+                    break
+            else:
+                try:
+                    if ctx.pos >= ctx.end:
+                        break
+                    if text[ctx.pos] == '\n':
+                        # at EOL, reset state to "root"
+                        ctx.stack = ['root']
+                        statetokens = tokendefs['root']
+                        yield ctx.pos, Text, u'\n'
+                        ctx.pos += 1
+                        continue
+                    yield ctx.pos, Error, text[ctx.pos]
+                    ctx.pos += 1
+                except IndexError:
+                    break
+
+
+def do_insertions(insertions, tokens):
+    """
+    Helper for lexers which must combine the results of several
+    sublexers.
+
+    ``insertions`` is a list of ``(index, itokens)`` pairs.
+    Each ``itokens`` iterable should be inserted at position
+    ``index`` into the token stream given by the ``tokens``
+    argument.
+
+    The result is a combined token stream.
+
+    TODO: clean up the code here.
+    """
+    insertions = iter(insertions)
+    try:
+        index, itokens = next(insertions)
+    except StopIteration:
+        # no insertions
+        for item in tokens:
+            yield item
+        return
+
+    realpos = None
+    insleft = True
+
+    # iterate over the token stream where we want to insert
+    # the tokens from the insertion list.
+    for i, t, v in tokens:
+        # first iteration. store the postition of first item
+        if realpos is None:
+            realpos = i
+        oldi = 0
+        while insleft and i + len(v) >= index:
+            tmpval = v[oldi:index - i]
+            yield realpos, t, tmpval
+            realpos += len(tmpval)
+            for it_index, it_token, it_value in itokens:
+                yield realpos, it_token, it_value
+                realpos += len(it_value)
+            oldi = index - i
+            try:
+                index, itokens = next(insertions)
+            except StopIteration:
+                insleft = False
+                break  # not strictly necessary
+        yield realpos, t, v[oldi:]
+        realpos += len(v) - oldi
+
+    # leftover tokens
+    while insleft:
+        # no normal tokens, set realpos to zero
+        realpos = realpos or 0
+        for p, t, v in itokens:
+            yield realpos, t, v
+            realpos += len(v)
+        try:
+            index, itokens = next(insertions)
+        except StopIteration:
+            insleft = False
+            break  # not strictly necessary
+
+
+class ProfilingRegexLexerMeta(RegexLexerMeta):
+    """Metaclass for ProfilingRegexLexer, collects regex timing info."""
+
+    def _process_regex(cls, regex, rflags, state):
+        if isinstance(regex, words):
+            rex = regex_opt(regex.words, prefix=regex.prefix,
+                            suffix=regex.suffix)
+        else:
+            rex = regex
+        compiled = re.compile(rex, rflags)
+
+        def match_func(text, pos, endpos=sys.maxsize):
+            info = cls._prof_data[-1].setdefault((state, rex), [0, 0.0])
+            t0 = time.time()
+            res = compiled.match(text, pos, endpos)
+            t1 = time.time()
+            info[0] += 1
+            info[1] += t1 - t0
+            return res
+        return match_func
+
+
+@add_metaclass(ProfilingRegexLexerMeta)
+class ProfilingRegexLexer(RegexLexer):
+    """Drop-in replacement for RegexLexer that does profiling of its regexes."""
+
+    _prof_data = []
+    _prof_sort_index = 4  # defaults to time per call
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        # this needs to be a stack, since using(this) will produce nested calls
+        self.__class__._prof_data.append({})
+        for tok in RegexLexer.get_tokens_unprocessed(self, text, stack):
+            yield tok
+        rawdata = self.__class__._prof_data.pop()
+        data = sorted(((s, repr(r).strip('u\'').replace('\\\\', '\\')[:65],
+                        n, 1000 * t, 1000 * t / n)
+                       for ((s, r), (n, t)) in rawdata.items()),
+                      key=lambda x: x[self._prof_sort_index],
+                      reverse=True)
+        sum_total = sum(x[3] for x in data)
+
+        print()
+        print('Profiling result for %s lexing %d chars in %.3f ms' %
+              (self.__class__.__name__, len(text), sum_total))
+        print('=' * 110)
+        print('%-20s %-64s ncalls  tottime  percall' % ('state', 'regex'))
+        print('-' * 110)
+        for d in data:
+            print('%-20s %-65s %5d %8.4f %8.4f' % d)
+        print('=' * 110)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/common.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/common.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/common.py	(revision 1126)
@@ -0,0 +1,439 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.common
+~~~~~~~~~~~~~~
+
+This module provides data structures and utilities common
+to all implementations of OAuth.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import collections
+import datetime
+import logging
+import random
+import re
+import sys
+import time
+
+try:
+    from urllib import quote as _quote
+    from urllib import unquote as _unquote
+    from urllib import urlencode as _urlencode
+except ImportError:
+    from urllib.parse import quote as _quote
+    from urllib.parse import unquote as _unquote
+    from urllib.parse import urlencode as _urlencode
+try:
+    import urlparse
+except ImportError:
+    import urllib.parse as urlparse
+
+UNICODE_ASCII_CHARACTER_SET = ('abcdefghijklmnopqrstuvwxyz'
+                               'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+                               '0123456789')
+
+CLIENT_ID_CHARACTER_SET = (r' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN'
+                           'OPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}')
+
+PASSWORD_PATTERN = re.compile(r'password=[^&]+')
+INVALID_HEX_PATTERN = re.compile(r'%[^0-9A-Fa-f]|%[0-9A-Fa-f][^0-9A-Fa-f]')
+
+always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+               'abcdefghijklmnopqrstuvwxyz'
+               '0123456789' '_.-')
+
+log = logging.getLogger('oauthlib')
+
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    unicode_type = str
+    bytes_type = bytes
+else:
+    unicode_type = unicode
+    bytes_type = str
+
+
+# 'safe' must be bytes (Python 2.6 requires bytes, other versions allow either)
+def quote(s, safe=b'/'):
+    s = s.encode('utf-8') if isinstance(s, unicode_type) else s
+    s = _quote(s, safe)
+    # PY3 always returns unicode.  PY2 may return either, depending on whether
+    # it had to modify the string.
+    if isinstance(s, bytes_type):
+        s = s.decode('utf-8')
+    return s
+
+
+def unquote(s):
+    s = _unquote(s)
+    # PY3 always returns unicode.  PY2 seems to always return what you give it,
+    # which differs from quote's behavior.  Just to be safe, make sure it is
+    # unicode before we return.
+    if isinstance(s, bytes_type):
+        s = s.decode('utf-8')
+    return s
+
+
+def urlencode(params):
+    utf8_params = encode_params_utf8(params)
+    urlencoded = _urlencode(utf8_params)
+    if isinstance(urlencoded, unicode_type):  # PY3 returns unicode
+        return urlencoded
+    else:
+        return urlencoded.decode("utf-8")
+
+
+def encode_params_utf8(params):
+    """Ensures that all parameters in a list of 2-element tuples are encoded to
+    bytestrings using UTF-8
+    """
+    encoded = []
+    for k, v in params:
+        encoded.append((
+            k.encode('utf-8') if isinstance(k, unicode_type) else k,
+            v.encode('utf-8') if isinstance(v, unicode_type) else v))
+    return encoded
+
+
+def decode_params_utf8(params):
+    """Ensures that all parameters in a list of 2-element tuples are decoded to
+    unicode using UTF-8.
+    """
+    decoded = []
+    for k, v in params:
+        decoded.append((
+            k.decode('utf-8') if isinstance(k, bytes_type) else k,
+            v.decode('utf-8') if isinstance(v, bytes_type) else v))
+    return decoded
+
+
+urlencoded = set(always_safe) | set('=&;%+~,*@!')
+
+
+def urldecode(query):
+    """Decode a query string in x-www-form-urlencoded format into a sequence
+    of two-element tuples.
+
+    Unlike urlparse.parse_qsl(..., strict_parsing=True) urldecode will enforce
+    correct formatting of the query string by validation. If validation fails
+    a ValueError will be raised. urllib.parse_qsl will only raise errors if
+    any of name-value pairs omits the equals sign.
+    """
+    # Check if query contains invalid characters
+    if query and not set(query) <= urlencoded:
+        error = ("Error trying to decode a non urlencoded string. "
+                 "Found invalid characters: %s "
+                 "in the string: '%s'. "
+                 "Please ensure the request/response body is "
+                 "x-www-form-urlencoded.")
+        raise ValueError(error % (set(query) - urlencoded, query))
+
+    # Check for correctly hex encoded values using a regular expression
+    # All encoded values begin with % followed by two hex characters
+    # correct = %00, %A0, %0A, %FF
+    # invalid = %G0, %5H, %PO
+    if INVALID_HEX_PATTERN.search(query):
+        raise ValueError('Invalid hex encoding in query string.')
+
+    # We encode to utf-8 prior to parsing because parse_qsl behaves
+    # differently on unicode input in python 2 and 3.
+    # Python 2.7
+    # >>> urlparse.parse_qsl(u'%E5%95%A6%E5%95%A6')
+    # u'\xe5\x95\xa6\xe5\x95\xa6'
+    # Python 2.7, non unicode input gives the same
+    # >>> urlparse.parse_qsl('%E5%95%A6%E5%95%A6')
+    # '\xe5\x95\xa6\xe5\x95\xa6'
+    # but now we can decode it to unicode
+    # >>> urlparse.parse_qsl('%E5%95%A6%E5%95%A6').decode('utf-8')
+    # u'\u5566\u5566'
+    # Python 3.3 however
+    # >>> urllib.parse.parse_qsl(u'%E5%95%A6%E5%95%A6')
+    # u'\u5566\u5566'
+    query = query.encode(
+        'utf-8') if not PY3 and isinstance(query, unicode_type) else query
+    # We want to allow queries such as "c2" whereas urlparse.parse_qsl
+    # with the strict_parsing flag will not.
+    params = urlparse.parse_qsl(query, keep_blank_values=True)
+
+    # unicode all the things
+    return decode_params_utf8(params)
+
+
+def extract_params(raw):
+    """Extract parameters and return them as a list of 2-tuples.
+
+    Will successfully extract parameters from urlencoded query strings,
+    dicts, or lists of 2-tuples. Empty strings/dicts/lists will return an
+    empty list of parameters. Any other input will result in a return
+    value of None.
+    """
+    if isinstance(raw, bytes_type) or isinstance(raw, unicode_type):
+        try:
+            params = urldecode(raw)
+        except ValueError:
+            params = None
+    elif hasattr(raw, '__iter__'):
+        try:
+            dict(raw)
+        except ValueError:
+            params = None
+        except TypeError:
+            params = None
+        else:
+            params = list(raw.items() if isinstance(raw, dict) else raw)
+            params = decode_params_utf8(params)
+    else:
+        params = None
+
+    return params
+
+
+def generate_nonce():
+    """Generate pseudorandom nonce that is unlikely to repeat.
+
+    Per `section 3.3`_ of the OAuth 1 RFC 5849 spec.
+    Per `section 3.2.1`_ of the MAC Access Authentication spec.
+
+    A random 64-bit number is appended to the epoch timestamp for both
+    randomness and to decrease the likelihood of collisions.
+
+    .. _`section 3.2.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-3.2.1
+    .. _`section 3.3`: http://tools.ietf.org/html/rfc5849#section-3.3
+    """
+    return unicode_type(unicode_type(random.getrandbits(64)) + generate_timestamp())
+
+
+def generate_timestamp():
+    """Get seconds since epoch (UTC).
+
+    Per `section 3.3`_ of the OAuth 1 RFC 5849 spec.
+    Per `section 3.2.1`_ of the MAC Access Authentication spec.
+
+    .. _`section 3.2.1`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-3.2.1
+    .. _`section 3.3`: http://tools.ietf.org/html/rfc5849#section-3.3
+    """
+    return unicode_type(int(time.time()))
+
+
+def generate_token(length=30, chars=UNICODE_ASCII_CHARACTER_SET):
+    """Generates a non-guessable OAuth token
+
+    OAuth (1 and 2) does not specify the format of tokens except that they
+    should be strings of random characters. Tokens should not be guessable
+    and entropy when generating the random characters is important. Which is
+    why SystemRandom is used instead of the default random.choice method.
+    """
+    rand = random.SystemRandom()
+    return ''.join(rand.choice(chars) for x in range(length))
+
+
+def generate_signed_token(private_pem, request):
+    import jwt
+
+    now = datetime.datetime.utcnow()
+
+    claims = {
+        'scope': request.scope,
+        'exp': now + datetime.timedelta(seconds=request.expires_in)
+    }
+
+    claims.update(request.claims)
+
+    token = jwt.encode(claims, private_pem, 'RS256')
+    token = to_unicode(token, "UTF-8")
+
+    return token
+
+
+def verify_signed_token(public_pem, token):
+    import jwt
+
+    return jwt.decode(token, public_pem, algorithms=['RS256'])
+
+
+def generate_client_id(length=30, chars=CLIENT_ID_CHARACTER_SET):
+    """Generates an OAuth client_id
+
+    OAuth 2 specify the format of client_id in
+    http://tools.ietf.org/html/rfc6749#appendix-A.
+    """
+    return generate_token(length, chars)
+
+
+def add_params_to_qs(query, params):
+    """Extend a query with a list of two-tuples."""
+    if isinstance(params, dict):
+        params = params.items()
+    queryparams = urlparse.parse_qsl(query, keep_blank_values=True)
+    queryparams.extend(params)
+    return urlencode(queryparams)
+
+
+def add_params_to_uri(uri, params, fragment=False):
+    """Add a list of two-tuples to the uri query components."""
+    sch, net, path, par, query, fra = urlparse.urlparse(uri)
+    if fragment:
+        fra = add_params_to_qs(fra, params)
+    else:
+        query = add_params_to_qs(query, params)
+    return urlparse.urlunparse((sch, net, path, par, query, fra))
+
+
+def safe_string_equals(a, b):
+    """ Near-constant time string comparison.
+
+    Used in order to avoid timing attacks on sensitive information such
+    as secret keys during request verification (`rootLabs`_).
+
+    .. _`rootLabs`: http://rdist.root.org/2010/01/07/timing-independent-array-comparison/
+
+    """
+    if len(a) != len(b):
+        return False
+
+    result = 0
+    for x, y in zip(a, b):
+        result |= ord(x) ^ ord(y)
+    return result == 0
+
+
+def to_unicode(data, encoding='UTF-8'):
+    """Convert a number of different types of objects to unicode."""
+    if isinstance(data, unicode_type):
+        return data
+
+    if isinstance(data, bytes_type):
+        return unicode_type(data, encoding=encoding)
+
+    if hasattr(data, '__iter__'):
+        try:
+            dict(data)
+        except TypeError:
+            pass
+        except ValueError:
+            # Assume it's a one dimensional data structure
+            return (to_unicode(i, encoding) for i in data)
+        else:
+            # We support 2.6 which lacks dict comprehensions
+            if hasattr(data, 'items'):
+                data = data.items()
+            return dict(((to_unicode(k, encoding), to_unicode(v, encoding)) for k, v in data))
+
+    return data
+
+
+class CaseInsensitiveDict(dict):
+
+    """Basic case insensitive dict with strings only keys."""
+
+    proxy = {}
+
+    def __init__(self, data):
+        self.proxy = dict((k.lower(), k) for k in data)
+        for k in data:
+            self[k] = data[k]
+
+    def __contains__(self, k):
+        return k.lower() in self.proxy
+
+    def __delitem__(self, k):
+        key = self.proxy[k.lower()]
+        super(CaseInsensitiveDict, self).__delitem__(key)
+        del self.proxy[k.lower()]
+
+    def __getitem__(self, k):
+        key = self.proxy[k.lower()]
+        return super(CaseInsensitiveDict, self).__getitem__(key)
+
+    def get(self, k, default=None):
+        return self[k] if k in self else default
+
+    def __setitem__(self, k, v):
+        super(CaseInsensitiveDict, self).__setitem__(k, v)
+        self.proxy[k.lower()] = k
+
+
+class Request(object):
+
+    """A malleable representation of a signable HTTP request.
+
+    Body argument may contain any data, but parameters will only be decoded if
+    they are one of:
+
+    * urlencoded query string
+    * dict
+    * list of 2-tuples
+
+    Anything else will be treated as raw body data to be passed through
+    unmolested.
+    """
+
+    def __init__(self, uri, http_method='GET', body=None, headers=None,
+                 encoding='utf-8'):
+        # Convert to unicode using encoding if given, else assume unicode
+        encode = lambda x: to_unicode(x, encoding) if encoding else x
+
+        self.uri = encode(uri)
+        self.http_method = encode(http_method)
+        self.headers = CaseInsensitiveDict(encode(headers or {}))
+        self.body = encode(body)
+        self.decoded_body = extract_params(self.body)
+        self.oauth_params = []
+        self.validator_log = {}
+
+        self._params = {
+            "access_token": None,
+            "client": None,
+            "client_id": None,
+            "client_secret": None,
+            "code": None,
+            "extra_credentials": None,
+            "grant_type": None,
+            "redirect_uri": None,
+            "refresh_token": None,
+            "response_type": None,
+            "scope": None,
+            "scopes": None,
+            "state": None,
+            "token": None,
+            "user": None,
+            "token_type_hint": None,
+        }
+        self._params.update(dict(urldecode(self.uri_query)))
+        self._params.update(dict(self.decoded_body or []))
+        self._params.update(self.headers)
+
+    def __getattr__(self, name):
+        if name in self._params:
+            return self._params[name]
+        else:
+            raise AttributeError(name)
+
+    def __repr__(self):
+        body = self.body
+        if body and 'password=' in body:
+            body = PASSWORD_PATTERN.sub('password=***', body)
+        return '<oauthlib.Request url="%s", http_method="%s", headers="%s", body="%s">' % (
+            self.uri, self.http_method, self.headers, body)
+
+    @property
+    def uri_query(self):
+        return urlparse.urlparse(self.uri).query
+
+    @property
+    def uri_query_params(self):
+        if not self.uri_query:
+            return []
+        return urlparse.parse_qsl(self.uri_query, keep_blank_values=True,
+                                  strict_parsing=True)
+
+    @property
+    def duplicate_params(self):
+        seen_keys = collections.defaultdict(int)
+        all_keys = (p[0]
+                    for p in (self.decoded_body or []) + self.uri_query_params)
+        for k in all_keys:
+            seen_keys[k] += 1
+        return [k for k, c in seen_keys.items() if c > 1]
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/uri_validate.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/uri_validate.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/uri_validate.py	(revision 1126)
@@ -0,0 +1,215 @@
+"""
+Regex for URIs
+
+These regex are directly derived from the collected ABNF in RFC3986
+(except for DIGIT, ALPHA and HEXDIG, defined by RFC2234).
+
+They should be processed with re.VERBOSE.
+
+Thanks Mark Nottingham for this code - https://gist.github.com/138549
+"""
+from __future__ import unicode_literals
+import re
+
+# basics
+
+DIGIT = r"[\x30-\x39]"
+
+ALPHA = r"[\x41-\x5A\x61-\x7A]"
+
+HEXDIG = r"[\x30-\x39A-Fa-f]"
+
+#   pct-encoded   = "%" HEXDIG HEXDIG
+pct_encoded = r" %% %(HEXDIG)s %(HEXDIG)s" % locals()
+
+#   unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+unreserved = r"(?: %(ALPHA)s | %(DIGIT)s | \- | \. | _ | ~ )" % locals()
+
+# gen-delims    = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+gen_delims = r"(?: : | / | \? | \# | \[ | \] | @ )"
+
+#   sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+#                 / "*" / "+" / "," / ";" / "="
+sub_delims = r"""(?: ! | \$ | & | ' | \( | \) |
+                     \* | \+ | , | ; | = )"""
+
+#   pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+pchar = r"(?: %(unreserved)s | %(pct_encoded)s | %(sub_delims)s | : | @ )" % locals(
+)
+
+#   reserved      = gen-delims / sub-delims
+reserved = r"(?: %(gen_delims)s | %(sub_delims)s )" % locals()
+
+
+# scheme
+
+#   scheme        = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+scheme = r"%(ALPHA)s (?: %(ALPHA)s | %(DIGIT)s | \+ | \- | \. )*" % locals()
+
+
+# authority
+
+#   dec-octet     = DIGIT                 ; 0-9
+#                 / %x31-39 DIGIT         ; 10-99
+#                 / "1" 2DIGIT            ; 100-199
+#                 / "2" %x30-34 DIGIT     ; 200-249
+#                 / "25" %x30-35          ; 250-255
+dec_octet = r"""(?: %(DIGIT)s |
+                    [\x31-\x39] %(DIGIT)s |
+                    1 %(DIGIT)s{2} |
+                    2 [\x30-\x34] %(DIGIT)s |
+                    25 [\x30-\x35]
+                )
+""" % locals()
+
+#  IPv4address   = dec-octet "." dec-octet "." dec-octet "." dec-octet
+IPv4address = r"%(dec_octet)s \. %(dec_octet)s \. %(dec_octet)s \. %(dec_octet)s" % locals(
+)
+
+#  h16           = 1*4HEXDIG
+h16 = r"(?: %(HEXDIG)s ){1,4}" % locals()
+
+#  ls32          = ( h16 ":" h16 ) / IPv4address
+ls32 = r"(?: (?: %(h16)s : %(h16)s ) | %(IPv4address)s )" % locals()
+
+#   IPv6address   =                            6( h16 ":" ) ls32
+#                 /                       "::" 5( h16 ":" ) ls32
+#                 / [               h16 ] "::" 4( h16 ":" ) ls32
+#                 / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
+#                 / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
+#                 / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
+#                 / [ *4( h16 ":" ) h16 ] "::"              ls32
+#                 / [ *5( h16 ":" ) h16 ] "::"              h16
+#                 / [ *6( h16 ":" ) h16 ] "::"
+IPv6address = r"""(?:                                  (?: %(h16)s : ){6} %(ls32)s |
+                                                    :: (?: %(h16)s : ){5} %(ls32)s |
+                                            %(h16)s :: (?: %(h16)s : ){4} %(ls32)s |
+                         (?: %(h16)s : )    %(h16)s :: (?: %(h16)s : ){3} %(ls32)s |
+                         (?: %(h16)s : ){2} %(h16)s :: (?: %(h16)s : ){2} %(ls32)s |
+                         (?: %(h16)s : ){3} %(h16)s ::     %(h16)s :      %(ls32)s |
+                         (?: %(h16)s : ){4} %(h16)s ::                    %(ls32)s |
+                         (?: %(h16)s : ){5} %(h16)s ::                    %(h16)s  |
+                         (?: %(h16)s : ){6} %(h16)s ::
+                  )
+""" % locals()
+
+#   IPvFuture     = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
+IPvFuture = r"v %(HEXDIG)s+ \. (?: %(unreserved)s | %(sub_delims)s | : )+" % locals()
+
+#   IP-literal    = "[" ( IPv6address / IPvFuture  ) "]"
+IP_literal = r"\[ (?: %(IPv6address)s | %(IPvFuture)s ) \]" % locals()
+
+#   reg-name      = *( unreserved / pct-encoded / sub-delims )
+reg_name = r"(?: %(unreserved)s | %(pct_encoded)s | %(sub_delims)s )*" % locals()
+
+#   userinfo      = *( unreserved / pct-encoded / sub-delims / ":" )
+userinfo = r"(?: %(unreserved)s | %(pct_encoded)s | %(sub_delims)s | : )" % locals(
+)
+
+#   host          = IP-literal / IPv4address / reg-name
+host = r"(?: %(IP_literal)s | %(IPv4address)s | %(reg_name)s )" % locals()
+
+#   port          = *DIGIT
+port = r"(?: %(DIGIT)s )*" % locals()
+
+#   authority     = [ userinfo "@" ] host [ ":" port ]
+authority = r"(?: %(userinfo)s @)? %(host)s (?: : %(port)s)?" % locals()
+
+# Path
+
+#   segment       = *pchar
+segment = r"%(pchar)s*" % locals()
+
+#   segment-nz    = 1*pchar
+segment_nz = r"%(pchar)s+" % locals()
+
+#   segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
+#                 ; non-zero-length segment without any colon ":"
+segment_nz_nc = r"(?: %(unreserved)s | %(pct_encoded)s | %(sub_delims)s | @ )+" % locals()
+
+#   path-abempty  = *( "/" segment )
+path_abempty = r"(?: / %(segment)s )*" % locals()
+
+#   path-absolute = "/" [ segment-nz *( "/" segment ) ]
+path_absolute = r"/ (?: %(segment_nz)s (?: / %(segment)s )* )?" % locals()
+
+#   path-noscheme = segment-nz-nc *( "/" segment )
+path_noscheme = r"%(segment_nz_nc)s (?: / %(segment)s )*" % locals()
+
+#   path-rootless = segment-nz *( "/" segment )
+path_rootless = r"%(segment_nz)s (?: / %(segment)s )*" % locals()
+
+#   path-empty    = 0<pchar>
+path_empty = r""  # FIXME
+
+#   path          = path-abempty    ; begins with "/" or is empty
+#                 / path-absolute   ; begins with "/" but not "//"
+#                 / path-noscheme   ; begins with a non-colon segment
+#                 / path-rootless   ; begins with a segment
+#                 / path-empty      ; zero characters
+path = r"""(?: %(path_abempty)s |
+               %(path_absolute)s |
+               %(path_noscheme)s |
+               %(path_rootless)s |
+               %(path_empty)s
+            )
+""" % locals()
+
+### Query and Fragment
+
+#   query         = *( pchar / "/" / "?" )
+query = r"(?: %(pchar)s | / | \? )*" % locals()
+
+#   fragment      = *( pchar / "/" / "?" )
+fragment = r"(?: %(pchar)s | / | \? )*" % locals()
+
+# URIs
+
+#   hier-part     = "//" authority path-abempty
+#                 / path-absolute
+#                 / path-rootless
+#                 / path-empty
+hier_part = r"""(?: (?: // %(authority)s %(path_abempty)s ) |
+                    %(path_absolute)s |
+                    %(path_rootless)s |
+                    %(path_empty)s
+                )
+""" % locals()
+
+#   relative-part = "//" authority path-abempty
+#                 / path-absolute
+#                 / path-noscheme
+#                 / path-empty
+relative_part = r"""(?: (?: // %(authority)s %(path_abempty)s ) |
+                        %(path_absolute)s |
+                        %(path_noscheme)s |
+                        %(path_empty)s
+                    )
+""" % locals()
+
+# relative-ref  = relative-part [ "?" query ] [ "#" fragment ]
+relative_ref = r"%(relative_part)s (?: \? %(query)s)? (?: \# %(fragment)s)?" % locals(
+)
+
+# URI           = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
+URI = r"^(?: %(scheme)s : %(hier_part)s (?: \? %(query)s )? (?: \# %(fragment)s )? )$" % locals(
+)
+
+#   URI-reference = URI / relative-ref
+URI_reference = r"^(?: %(URI)s | %(relative_ref)s )$" % locals()
+
+#   absolute-URI  = scheme ":" hier-part [ "?" query ]
+absolute_URI = r"^(?: %(scheme)s : %(hier_part)s (?: \? %(query)s )? )$" % locals(
+)
+
+
+def is_uri(uri):
+    return re.match(URI, uri, re.VERBOSE)
+
+
+def is_uri_reference(uri):
+    return re.match(URI_reference, uri, re.VERBOSE)
+
+
+def is_absolute_uri(uri):
+    return re.match(absolute_URI, uri, re.VERBOSE)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/request_validator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/request_validator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/request_validator.py	(revision 1126)
@@ -0,0 +1,823 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849
+~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for signing and checking OAuth 1.0 RFC 5849 requests.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from . import SIGNATURE_METHODS, utils
+
+
+class RequestValidator(object):
+
+    """A validator/datastore interaction base class for OAuth 1 providers.
+
+    OAuth providers should inherit from RequestValidator and implement the
+    methods and properties outlined below. Further details are provided in the
+    documentation for each method and property.
+
+    Methods used to check the format of input parameters. Common tests include
+    length, character set, membership, range or pattern. These tests are
+    referred to as `whitelisting or blacklisting`_. Whitelisting is better
+    but blacklisting can be usefull to spot malicious activity.
+    The following have methods a default implementation:
+
+    - check_client_key
+    - check_request_token
+    - check_access_token
+    - check_nonce
+    - check_verifier
+    - check_realms
+
+    The methods above default to whitelist input parameters, checking that they
+    are alphanumerical and between a minimum and maximum length. Rather than
+    overloading the methods a few properties can be used to configure these
+    methods.
+
+    * @safe_characters -> (character set)
+    * @client_key_length -> (min, max)
+    * @request_token_length -> (min, max)
+    * @access_token_length -> (min, max)
+    * @nonce_length -> (min, max)
+    * @verifier_length -> (min, max)
+    * @realms -> [list, of, realms]
+
+    Methods used to validate/invalidate input parameters. These checks usually
+    hit either persistent or temporary storage such as databases or the
+    filesystem. See each methods documentation for detailed usage.
+    The following methods must be implemented:
+
+    - validate_client_key
+    - validate_request_token
+    - validate_access_token
+    - validate_timestamp_and_nonce
+    - validate_redirect_uri
+    - validate_requested_realms
+    - validate_realms
+    - validate_verifier
+    - invalidate_request_token
+
+    Methods used to retrieve sensitive information from storage.
+    The following methods must be implemented:
+
+    - get_client_secret
+    - get_request_token_secret
+    - get_access_token_secret
+    - get_rsa_key
+    - get_realms
+    - get_default_realms
+    - get_redirect_uri
+
+    Methods used to save credentials.
+    The following methods must be implemented:
+
+    - save_request_token
+    - save_verifier
+    - save_access_token
+
+    Methods used to verify input parameters. This methods are used during
+    authorizing request token by user (AuthorizationEndpoint), to check if
+    parameters are valid. During token authorization request is not signed,
+    thus 'validation' methods can not be used. The following methods must be
+    implemented:
+
+    - verify_realms
+    - verify_request_token
+
+    To prevent timing attacks it is necessary to not exit early even if the
+    client key or resource owner key is invalid. Instead dummy values should
+    be used during the remaining verification process. It is very important
+    that the dummy client and token are valid input parameters to the methods
+    get_client_secret, get_rsa_key and get_(access/request)_token_secret and
+    that the running time of those methods when given a dummy value remain
+    equivalent to the running time when given a valid client/resource owner.
+    The following properties must be implemented:
+
+    * @dummy_client
+    * @dummy_request_token
+    * @dummy_access_token
+
+    Example implementations have been provided, note that the database used is
+    a simple dictionary and serves only an illustrative purpose. Use whichever
+    database suits your project and how to access it is entirely up to you.
+    The methods are introduced in an order which should make understanding
+    their use more straightforward and as such it could be worth reading what
+    follows in chronological order.
+
+    .. _`whitelisting or blacklisting`: http://www.schneier.com/blog/archives/2011/01/whitelisting_vs.html
+    """
+
+    def __init__(self):
+        pass
+
+    @property
+    def allowed_signature_methods(self):
+        return SIGNATURE_METHODS
+
+    @property
+    def safe_characters(self):
+        return set(utils.UNICODE_ASCII_CHARACTER_SET)
+
+    @property
+    def client_key_length(self):
+        return 20, 30
+
+    @property
+    def request_token_length(self):
+        return 20, 30
+
+    @property
+    def access_token_length(self):
+        return 20, 30
+
+    @property
+    def timestamp_lifetime(self):
+        return 600
+
+    @property
+    def nonce_length(self):
+        return 20, 30
+
+    @property
+    def verifier_length(self):
+        return 20, 30
+
+    @property
+    def realms(self):
+        return []
+
+    @property
+    def enforce_ssl(self):
+        return True
+
+    def check_client_key(self, client_key):
+        """Check that the client key only contains safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.client_key_length
+        return (set(client_key) <= self.safe_characters and
+                lower <= len(client_key) <= upper)
+
+    def check_request_token(self, request_token):
+        """Checks that the request token contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.request_token_length
+        return (set(request_token) <= self.safe_characters and
+                lower <= len(request_token) <= upper)
+
+    def check_access_token(self, request_token):
+        """Checks that the token contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.access_token_length
+        return (set(request_token) <= self.safe_characters and
+                lower <= len(request_token) <= upper)
+
+    def check_nonce(self, nonce):
+        """Checks that the nonce only contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.nonce_length
+        return (set(nonce) <= self.safe_characters and
+                lower <= len(nonce) <= upper)
+
+    def check_verifier(self, verifier):
+        """Checks that the verifier contains only safe characters
+        and is no shorter than lower and no longer than upper.
+        """
+        lower, upper = self.verifier_length
+        return (set(verifier) <= self.safe_characters and
+                lower <= len(verifier) <= upper)
+
+    def check_realms(self, realms):
+        """Check that the realm is one of a set allowed realms."""
+        return all((r in self.realms for r in realms))
+
+    @property
+    def dummy_client(self):
+        """Dummy client used when an invalid client key is supplied.
+
+        :returns: The dummy client key string.
+
+        The dummy client should be associated with either a client secret,
+        a rsa key or both depending on which signature methods are supported.
+        Providers should make sure that
+
+        get_client_secret(dummy_client)
+        get_rsa_key(dummy_client)
+
+        return a valid secret or key for the dummy client.
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        * RequestTokenEndpoint
+        * ResourceEndpoint
+        * SignatureOnlyEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    @property
+    def dummy_request_token(self):
+        """Dummy request token used when an invalid token was supplied.
+
+        :returns: The dummy request token string.
+
+        The dummy request token should be associated with a request token
+        secret such that get_request_token_secret(.., dummy_request_token)
+        returns a valid secret.
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    @property
+    def dummy_access_token(self):
+        """Dummy access token used when an invalid token was supplied.
+
+        :returns: The dummy access token string.
+
+        The dummy access token should be associated with an access token
+        secret such that get_access_token_secret(.., dummy_access_token)
+        returns a valid secret.
+
+        This method is used by
+
+        * ResourceEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_client_secret(self, client_key, request):
+        """Retrieves the client secret associated with the client key.
+
+        :param client_key: The client/consumer key.
+        :param request: An oauthlib.common.Request object.
+        :returns: The client secret as a string.
+
+        This method must allow the use of a dummy client_key value.
+        Fetching the secret using the dummy key must take the same amount of
+        time as fetching a secret for a valid client::
+
+            # Unlikely to be near constant time as it uses two database
+            # lookups for a valid client, and only one for an invalid.
+            from your_datastore import ClientSecret
+            if ClientSecret.has(client_key):
+                return ClientSecret.get(client_key)
+            else:
+                return 'dummy'
+
+            # Aim to mimic number of latency inducing operations no matter
+            # whether the client is valid or not.
+            from your_datastore import ClientSecret
+            return ClientSecret.get(client_key, 'dummy')
+
+        Note that the returned key must be in plaintext.
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        * RequestTokenEndpoint
+        * ResourceEndpoint
+        * SignatureOnlyEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_request_token_secret(self, client_key, token, request):
+        """Retrieves the shared secret associated with the request token.
+
+        :param client_key: The client/consumer key.
+        :param token: The request token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: The token secret as a string.
+
+        This method must allow the use of a dummy values and the running time
+        must be roughly equivalent to that of the running time of valid values::
+
+            # Unlikely to be near constant time as it uses two database
+            # lookups for a valid client, and only one for an invalid.
+            from your_datastore import RequestTokenSecret
+            if RequestTokenSecret.has(client_key):
+                return RequestTokenSecret.get((client_key, request_token))
+            else:
+                return 'dummy'
+
+            # Aim to mimic number of latency inducing operations no matter
+            # whether the client is valid or not.
+            from your_datastore import RequestTokenSecret
+            return ClientSecret.get((client_key, request_token), 'dummy')
+
+        Note that the returned key must be in plaintext.
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_access_token_secret(self, client_key, token, request):
+        """Retrieves the shared secret associated with the access token.
+
+        :param client_key: The client/consumer key.
+        :param token: The access token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: The token secret as a string.
+
+        This method must allow the use of a dummy values and the running time
+        must be roughly equivalent to that of the running time of valid values::
+
+            # Unlikely to be near constant time as it uses two database
+            # lookups for a valid client, and only one for an invalid.
+            from your_datastore import AccessTokenSecret
+            if AccessTokenSecret.has(client_key):
+                return AccessTokenSecret.get((client_key, request_token))
+            else:
+                return 'dummy'
+
+            # Aim to mimic number of latency inducing operations no matter
+            # whether the client is valid or not.
+            from your_datastore import AccessTokenSecret
+            return ClientSecret.get((client_key, request_token), 'dummy')
+
+        Note that the returned key must be in plaintext.
+
+        This method is used by
+
+        * ResourceEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_default_realms(self, client_key, request):
+        """Get the default realms for a client.
+
+        :param client_key: The client/consumer key.
+        :param request: An oauthlib.common.Request object.
+        :returns: The list of default realms associated with the client.
+
+        The list of default realms will be set during client registration and
+        is outside the scope of OAuthLib.
+
+        This method is used by
+
+        * RequestTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_realms(self, token, request):
+        """Get realms associated with a request token.
+
+        :param token: The request token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: The list of realms associated with the request token.
+
+        This method is used by
+
+        * AuthorizationEndpoint
+        * AccessTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_redirect_uri(self, token, request):
+        """Get the redirect URI associated with a request token.
+
+        :param token: The request token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: The redirect URI associated with the request token.
+
+        It may be desirable to return a custom URI if the redirect is set to "oob".
+        In this case, the user will be redirected to the returned URI and at that
+        endpoint the verifier can be displayed.
+
+        This method is used by
+
+        * AuthorizationEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def get_rsa_key(self, client_key, request):
+        """Retrieves a previously stored client provided RSA key.
+
+        :param client_key: The client/consumer key.
+        :param request: An oauthlib.common.Request object.
+        :returns: The rsa public key as a string.
+
+        This method must allow the use of a dummy client_key value. Fetching
+        the rsa key using the dummy key must take the same amount of time
+        as fetching a key for a valid client. The dummy key must also be of
+        the same bit length as client keys.
+
+        Note that the key must be returned in plaintext.
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        * RequestTokenEndpoint
+        * ResourceEndpoint
+        * SignatureOnlyEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def invalidate_request_token(self, client_key, request_token, request):
+        """Invalidates a used request token.
+
+        :param client_key: The client/consumer key.
+        :param request_token: The request token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: None
+
+        Per `Section 2.3`__ of the spec:
+
+        "The server MUST (...) ensure that the temporary
+        credentials have not expired or been used before."
+
+        .. _`Section 2.3`: http://tools.ietf.org/html/rfc5849#section-2.3
+
+        This method should ensure that provided token won't validate anymore.
+        It can be simply removing RequestToken from storage or setting
+        specific flag that makes it invalid (note that such flag should be
+        also validated during request token validation).
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_client_key(self, client_key, request):
+        """Validates that supplied client key is a registered and valid client.
+
+        :param client_key: The client/consumer key.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        Note that if the dummy client is supplied it should validate in same
+        or nearly the same amount of time as a valid one.
+
+        Ensure latency inducing tasks are mimiced even for dummy clients.
+        For example, use::
+
+            from your_datastore import Client
+            try:
+                return Client.exists(client_key, access_token)
+            except DoesNotExist:
+                return False
+
+        Rather than::
+
+            from your_datastore import Client
+            if access_token == self.dummy_access_token:
+                return False
+            else:
+                return Client.exists(client_key, access_token)
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        * RequestTokenEndpoint
+        * ResourceEndpoint
+        * SignatureOnlyEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_request_token(self, client_key, token, request):
+        """Validates that supplied request token is registered and valid.
+
+        :param client_key: The client/consumer key.
+        :param token: The request token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        Note that if the dummy request_token is supplied it should validate in
+        the same nearly the same amount of time as a valid one.
+
+        Ensure latency inducing tasks are mimiced even for dummy clients.
+        For example, use::
+
+            from your_datastore import RequestToken
+            try:
+                return RequestToken.exists(client_key, access_token)
+            except DoesNotExist:
+                return False
+
+        Rather than::
+
+            from your_datastore import RequestToken
+            if access_token == self.dummy_access_token:
+                return False
+            else:
+                return RequestToken.exists(client_key, access_token)
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_access_token(self, client_key, token, request):
+        """Validates that supplied access token is registered and valid.
+
+        :param client_key: The client/consumer key.
+        :param token: The access token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        Note that if the dummy access token is supplied it should validate in
+        the same or nearly the same amount of time as a valid one.
+
+        Ensure latency inducing tasks are mimiced even for dummy clients.
+        For example, use::
+
+            from your_datastore import AccessToken
+            try:
+                return AccessToken.exists(client_key, access_token)
+            except DoesNotExist:
+                return False
+
+        Rather than::
+
+            from your_datastore import AccessToken
+            if access_token == self.dummy_access_token:
+                return False
+            else:
+                return AccessToken.exists(client_key, access_token)
+
+        This method is used by
+
+        * ResourceEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_timestamp_and_nonce(self, client_key, timestamp, nonce,
+                                     request, request_token=None, access_token=None):
+        """Validates that the nonce has not been used before.
+
+        :param client_key: The client/consumer key.
+        :param timestamp: The ``oauth_timestamp`` parameter.
+        :param nonce: The ``oauth_nonce`` parameter.
+        :param request_token: Request token string, if any.
+        :param access_token: Access token string, if any.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        Per `Section 3.3`_ of the spec.
+
+        "A nonce is a random string, uniquely generated by the client to allow
+        the server to verify that a request has never been made before and
+        helps prevent replay attacks when requests are made over a non-secure
+        channel.  The nonce value MUST be unique across all requests with the
+        same timestamp, client credentials, and token combinations."
+
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc5849#section-3.3
+
+        One of the first validation checks that will be made is for the validity
+        of the nonce and timestamp, which are associated with a client key and
+        possibly a token. If invalid then immediately fail the request
+        by returning False. If the nonce/timestamp pair has been used before and
+        you may just have detected a replay attack. Therefore it is an essential
+        part of OAuth security that you not allow nonce/timestamp reuse.
+        Note that this validation check is done before checking the validity of
+        the client and token.::
+
+           nonces_and_timestamps_database = [
+              (u'foo', 1234567890, u'rannoMstrInghere', u'bar')
+           ]
+
+           def validate_timestamp_and_nonce(self, client_key, timestamp, nonce,
+              request_token=None, access_token=None):
+
+              return ((client_key, timestamp, nonce, request_token or access_token)
+                       not in self.nonces_and_timestamps_database)
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        * RequestTokenEndpoint
+        * ResourceEndpoint
+        * SignatureOnlyEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_redirect_uri(self, client_key, redirect_uri, request):
+        """Validates the client supplied redirection URI.
+
+        :param client_key: The client/consumer key.
+        :param redirect_uri: The URI the client which to redirect back to after
+                             authorization is successful.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        It is highly recommended that OAuth providers require their clients
+        to register all redirection URIs prior to using them in requests and
+        register them as absolute URIs. See `CWE-601`_ for more information
+        about open redirection attacks.
+
+        By requiring registration of all redirection URIs it should be
+        straightforward for the provider to verify whether the supplied
+        redirect_uri is valid or not.
+
+        Alternatively per `Section 2.1`_ of the spec:
+
+        "If the client is unable to receive callbacks or a callback URI has
+        been established via other means, the parameter value MUST be set to
+        "oob" (case sensitive), to indicate an out-of-band configuration."
+
+        .. _`CWE-601`: http://cwe.mitre.org/top25/index.html#CWE-601
+        .. _`Section 2.1`: https://tools.ietf.org/html/rfc5849#section-2.1
+
+        This method is used by
+
+        * RequestTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_requested_realms(self, client_key, realms, request):
+        """Validates that the client may request access to the realm.
+
+        :param client_key: The client/consumer key.
+        :param realms: The list of realms that client is requesting access to.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        This method is invoked when obtaining a request token and should
+        tie a realm to the request token and after user authorization
+        this realm restriction should transfer to the access token.
+
+        This method is used by
+
+        * RequestTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_realms(self, client_key, token, request, uri=None,
+                        realms=None):
+        """Validates access to the request realm.
+
+        :param client_key: The client/consumer key.
+        :param token: A request token string.
+        :param request: An oauthlib.common.Request object.
+        :param uri: The URI the realms is protecting.
+        :param realms: A list of realms that must have been granted to
+                       the access token.
+        :returns: True or False
+
+        How providers choose to use the realm parameter is outside the OAuth
+        specification but it is commonly used to restrict access to a subset
+        of protected resources such as "photos".
+
+        realms is a convenience parameter which can be used to provide
+        a per view method pre-defined list of allowed realms.
+
+        Can be as simple as::
+
+            from your_datastore import RequestToken
+            request_token = RequestToken.get(token, None)
+
+            if not request_token:
+                return False
+            return set(request_token.realms).issuperset(set(realms))
+
+        This method is used by
+
+        * ResourceEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def validate_verifier(self, client_key, token, verifier, request):
+        """Validates a verification code.
+
+        :param client_key: The client/consumer key.
+        :param token: A request token string.
+        :param verifier: The authorization verifier string.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        OAuth providers issue a verification code to clients after the
+        resource owner authorizes access. This code is used by the client to
+        obtain token credentials and the provider must verify that the
+        verifier is valid and associated with the client as well as the
+        resource owner.
+
+        Verifier validation should be done in near constant time
+        (to avoid verifier enumeration). To achieve this we need a
+        constant time string comparison which is provided by OAuthLib
+        in ``oauthlib.common.safe_string_equals``::
+
+            from your_datastore import Verifier
+            correct_verifier = Verifier.get(client_key, request_token)
+            from oauthlib.common import safe_string_equals
+            return safe_string_equals(verifier, correct_verifier)
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def verify_request_token(self, token, request):
+        """Verify that the given OAuth1 request token is valid.
+
+        :param token: A request token string.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        This method is used only in AuthorizationEndpoint to check whether the
+        oauth_token given in the authorization URL is valid or not.
+        This request is not signed and thus similar ``validate_request_token``
+        method can not be used.
+
+        This method is used by
+
+        * AuthorizationEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def verify_realms(self, token, realms, request):
+        """Verify authorized realms to see if they match those given to token.
+
+        :param token: An access token string.
+        :param realms: A list of realms the client attempts to access.
+        :param request: An oauthlib.common.Request object.
+        :returns: True or False
+
+        This prevents the list of authorized realms sent by the client during
+        the authorization step to be altered to include realms outside what
+        was bound with the request token.
+
+        Can be as simple as::
+
+            valid_realms = self.get_realms(token)
+            return all((r in valid_realms for r in realms))
+
+        This method is used by
+
+        * AuthorizationEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def save_access_token(self, token, request):
+        """Save an OAuth1 access token.
+
+        :param token: A dict with token credentials.
+        :param request: An oauthlib.common.Request object.
+
+        The token dictionary will at minimum include
+
+        * ``oauth_token`` the access token string.
+        * ``oauth_token_secret`` the token specific secret used in signing.
+        * ``oauth_authorized_realms`` a space separated list of realms.
+
+        Client key can be obtained from ``request.client_key``.
+
+        The list of realms (not joined string) can be obtained from
+        ``request.realm``.
+
+        This method is used by
+
+        * AccessTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def save_request_token(self, token, request):
+        """Save an OAuth1 request token.
+
+        :param token: A dict with token credentials.
+        :param request: An oauthlib.common.Request object.
+
+        The token dictionary will at minimum include
+
+        * ``oauth_token`` the request token string.
+        * ``oauth_token_secret`` the token specific secret used in signing.
+        * ``oauth_callback_confirmed`` the string ``true``.
+
+        Client key can be obtained from ``request.client_key``.
+
+        This method is used by
+
+        * RequestTokenEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
+
+    def save_verifier(self, token, verifier, request):
+        """Associate an authorization verifier with a request token.
+
+        :param token: A request token string.
+        :param verifier A dictionary containing the oauth_verifier and
+                        oauth_token
+        :param request: An oauthlib.common.Request object.
+
+        We need to associate verifiers with tokens for validation during the
+        access token request.
+
+        Note that unlike save_x_token token here is the ``oauth_token`` token
+        string from the request token saved previously.
+
+        This method is used by
+
+        * AuthorizationEndpoint
+        """
+        raise NotImplementedError("Subclasses must implement this function.")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/__init__.py	(revision 1126)
@@ -0,0 +1,327 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849
+~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for signing and checking OAuth 1.0 RFC 5849 requests.
+"""
+from __future__ import absolute_import, unicode_literals
+import base64
+import hashlib
+import logging
+log = logging.getLogger(__name__)
+
+import sys
+try:
+    import urlparse
+except ImportError:
+    import urllib.parse as urlparse
+
+if sys.version_info[0] == 3:
+    bytes_type = bytes
+else:
+    bytes_type = str
+
+from oauthlib.common import Request, urlencode, generate_nonce
+from oauthlib.common import generate_timestamp, to_unicode
+from . import parameters, signature
+
+SIGNATURE_HMAC = "HMAC-SHA1"
+SIGNATURE_RSA = "RSA-SHA1"
+SIGNATURE_PLAINTEXT = "PLAINTEXT"
+SIGNATURE_METHODS = (SIGNATURE_HMAC, SIGNATURE_RSA, SIGNATURE_PLAINTEXT)
+
+SIGNATURE_TYPE_AUTH_HEADER = 'AUTH_HEADER'
+SIGNATURE_TYPE_QUERY = 'QUERY'
+SIGNATURE_TYPE_BODY = 'BODY'
+
+CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
+
+
+class Client(object):
+
+    """A client used to sign OAuth 1.0 RFC 5849 requests."""
+    SIGNATURE_METHODS = {
+        SIGNATURE_HMAC: signature.sign_hmac_sha1_with_client,
+        SIGNATURE_RSA: signature.sign_rsa_sha1_with_client,
+        SIGNATURE_PLAINTEXT: signature.sign_plaintext_with_client
+    }
+
+    @classmethod
+    def register_signature_method(cls, method_name, method_callback):
+        cls.SIGNATURE_METHODS[method_name] = method_callback
+
+    def __init__(self, client_key,
+                 client_secret=None,
+                 resource_owner_key=None,
+                 resource_owner_secret=None,
+                 callback_uri=None,
+                 signature_method=SIGNATURE_HMAC,
+                 signature_type=SIGNATURE_TYPE_AUTH_HEADER,
+                 rsa_key=None, verifier=None, realm=None,
+                 encoding='utf-8', decoding=None,
+                 nonce=None, timestamp=None):
+        """Create an OAuth 1 client.
+
+        :param client_key: Client key (consumer key), mandatory.
+        :param resource_owner_key: Resource owner key (oauth token).
+        :param resource_owner_secret: Resource owner secret (oauth token secret).
+        :param callback_uri: Callback used when obtaining request token.
+        :param signature_method: SIGNATURE_HMAC, SIGNATURE_RSA or SIGNATURE_PLAINTEXT.
+        :param signature_type: SIGNATURE_TYPE_AUTH_HEADER (default),
+                               SIGNATURE_TYPE_QUERY or SIGNATURE_TYPE_BODY
+                               depending on where you want to embed the oauth
+                               credentials.
+        :param rsa_key: RSA key used with SIGNATURE_RSA.
+        :param verifier: Verifier used when obtaining an access token.
+        :param realm: Realm (scope) to which access is being requested.
+        :param encoding: If you provide non-unicode input you may use this
+                         to have oauthlib automatically convert.
+        :param decoding: If you wish that the returned uri, headers and body
+                         from sign be encoded back from unicode, then set
+                         decoding to your preferred encoding, i.e. utf-8.
+        :param nonce: Use this nonce instead of generating one. (Mainly for testing)
+        :param timestamp: Use this timestamp instead of using current. (Mainly for testing)
+        """
+        # Convert to unicode using encoding if given, else assume unicode
+        encode = lambda x: to_unicode(x, encoding) if encoding else x
+
+        self.client_key = encode(client_key)
+        self.client_secret = encode(client_secret)
+        self.resource_owner_key = encode(resource_owner_key)
+        self.resource_owner_secret = encode(resource_owner_secret)
+        self.signature_method = encode(signature_method)
+        self.signature_type = encode(signature_type)
+        self.callback_uri = encode(callback_uri)
+        self.rsa_key = encode(rsa_key)
+        self.verifier = encode(verifier)
+        self.realm = encode(realm)
+        self.encoding = encode(encoding)
+        self.decoding = encode(decoding)
+        self.nonce = encode(nonce)
+        self.timestamp = encode(timestamp)
+
+    def __repr__(self):
+        attrs = vars(self).copy()
+        attrs['client_secret'] = '****' if attrs['client_secret'] else None
+        attrs[
+            'resource_owner_secret'] = '****' if attrs['resource_owner_secret'] else None
+        attribute_str = ', '.join('%s=%s' % (k, v) for k, v in attrs.items())
+        return '<%s %s>' % (self.__class__.__name__, attribute_str)
+
+    def get_oauth_signature(self, request):
+        """Get an OAuth signature to be used in signing a request
+
+        To satisfy `section 3.4.1.2`_ item 2, if the request argument's
+        headers dict attribute contains a Host item, its value will
+        replace any netloc part of the request argument's uri attribute
+        value.
+
+        .. _`section 3.4.1.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.2
+        """
+        if self.signature_method == SIGNATURE_PLAINTEXT:
+            # fast-path
+            return signature.sign_plaintext(self.client_secret,
+                                            self.resource_owner_secret)
+
+        uri, headers, body = self._render(request)
+
+        collected_params = signature.collect_parameters(
+            uri_query=urlparse.urlparse(uri).query,
+            body=body,
+            headers=headers)
+        log.debug("Collected params: {0}".format(collected_params))
+
+        normalized_params = signature.normalize_parameters(collected_params)
+        normalized_uri = signature.normalize_base_string_uri(uri,
+                                                             headers.get('Host', None))
+        log.debug("Normalized params: {0}".format(normalized_params))
+        log.debug("Normalized URI: {0}".format(normalized_uri))
+
+        base_string = signature.construct_base_string(request.http_method,
+                                                      normalized_uri, normalized_params)
+
+        log.debug("Base signing string: {0}".format(base_string))
+
+        if self.signature_method not in self.SIGNATURE_METHODS:
+            raise ValueError('Invalid signature method.')
+
+        sig = self.SIGNATURE_METHODS[self.signature_method](base_string, self)
+
+        log.debug("Signature: {0}".format(sig))
+        return sig
+
+    def get_oauth_params(self, request):
+        """Get the basic OAuth parameters to be used in generating a signature.
+        """
+        nonce = (generate_nonce()
+                 if self.nonce is None else self.nonce)
+        timestamp = (generate_timestamp()
+                     if self.timestamp is None else self.timestamp)
+        params = [
+            ('oauth_nonce', nonce),
+            ('oauth_timestamp', timestamp),
+            ('oauth_version', '1.0'),
+            ('oauth_signature_method', self.signature_method),
+            ('oauth_consumer_key', self.client_key),
+        ]
+        if self.resource_owner_key:
+            params.append(('oauth_token', self.resource_owner_key))
+        if self.callback_uri:
+            params.append(('oauth_callback', self.callback_uri))
+        if self.verifier:
+            params.append(('oauth_verifier', self.verifier))
+
+        # providing body hash for requests other than x-www-form-urlencoded
+        # as described in http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html
+        # 4.1.1. When to include the body hash
+        #    *  [...] MUST NOT include an oauth_body_hash parameter on requests with form-encoded request bodies
+        #    *  [...] SHOULD include the oauth_body_hash parameter on all other requests.
+        content_type = request.headers.get('Content-Type', None)
+        content_type_eligible = content_type and content_type.find('application/x-www-form-urlencoded') < 0
+        if request.body is not None and content_type_eligible:
+            params.append(('oauth_body_hash', base64.b64encode(hashlib.sha1(request.body.encode('utf-8')).digest()).decode('utf-8')))
+
+        return params
+
+    def _render(self, request, formencode=False, realm=None):
+        """Render a signed request according to signature type
+
+        Returns a 3-tuple containing the request URI, headers, and body.
+
+        If the formencode argument is True and the body contains parameters, it
+        is escaped and returned as a valid formencoded string.
+        """
+        # TODO what if there are body params on a header-type auth?
+        # TODO what if there are query params on a body-type auth?
+
+        uri, headers, body = request.uri, request.headers, request.body
+
+        # TODO: right now these prepare_* methods are very narrow in scope--they
+        # only affect their little thing. In some cases (for example, with
+        # header auth) it might be advantageous to allow these methods to touch
+        # other parts of the request, like the headers—so the prepare_headers
+        # method could also set the Content-Type header to x-www-form-urlencoded
+        # like the spec requires. This would be a fundamental change though, and
+        # I'm not sure how I feel about it.
+        if self.signature_type == SIGNATURE_TYPE_AUTH_HEADER:
+            headers = parameters.prepare_headers(
+                request.oauth_params, request.headers, realm=realm)
+        elif self.signature_type == SIGNATURE_TYPE_BODY and request.decoded_body is not None:
+            body = parameters.prepare_form_encoded_body(
+                request.oauth_params, request.decoded_body)
+            if formencode:
+                body = urlencode(body)
+            headers['Content-Type'] = 'application/x-www-form-urlencoded'
+        elif self.signature_type == SIGNATURE_TYPE_QUERY:
+            uri = parameters.prepare_request_uri_query(
+                request.oauth_params, request.uri)
+        else:
+            raise ValueError('Unknown signature type specified.')
+
+        return uri, headers, body
+
+    def sign(self, uri, http_method='GET', body=None, headers=None, realm=None):
+        """Sign a request
+
+        Signs an HTTP request with the specified parts.
+
+        Returns a 3-tuple of the signed request's URI, headers, and body.
+        Note that http_method is not returned as it is unaffected by the OAuth
+        signing process. Also worth noting is that duplicate parameters
+        will be included in the signature, regardless of where they are
+        specified (query, body).
+
+        The body argument may be a dict, a list of 2-tuples, or a formencoded
+        string. The Content-Type header must be 'application/x-www-form-urlencoded'
+        if it is present.
+
+        If the body argument is not one of the above, it will be returned
+        verbatim as it is unaffected by the OAuth signing process. Attempting to
+        sign a request with non-formencoded data using the OAuth body signature
+        type is invalid and will raise an exception.
+
+        If the body does contain parameters, it will be returned as a properly-
+        formatted formencoded string.
+
+        Body may not be included if the http_method is either GET or HEAD as
+        this changes the semantic meaning of the request.
+
+        All string data MUST be unicode or be encoded with the same encoding
+        scheme supplied to the Client constructor, default utf-8. This includes
+        strings inside body dicts, for example.
+        """
+        # normalize request data
+        request = Request(uri, http_method, body, headers,
+                          encoding=self.encoding)
+
+        # sanity check
+        content_type = request.headers.get('Content-Type', None)
+        multipart = content_type and content_type.startswith('multipart/')
+        should_have_params = content_type == CONTENT_TYPE_FORM_URLENCODED
+        has_params = request.decoded_body is not None
+        # 3.4.1.3.1.  Parameter Sources
+        # [Parameters are collected from the HTTP request entity-body, but only
+        # if [...]:
+        #    *  The entity-body is single-part.
+        if multipart and has_params:
+            raise ValueError(
+                "Headers indicate a multipart body but body contains parameters.")
+        #    *  The entity-body follows the encoding requirements of the
+        #       "application/x-www-form-urlencoded" content-type as defined by
+        #       [W3C.REC-html40-19980424].
+        elif should_have_params and not has_params:
+            raise ValueError(
+                "Headers indicate a formencoded body but body was not decodable.")
+        #    *  The HTTP request entity-header includes the "Content-Type"
+        #       header field set to "application/x-www-form-urlencoded".
+        elif not should_have_params and has_params:
+            raise ValueError(
+                "Body contains parameters but Content-Type header was {0} "
+                "instead of {1}".format(content_type or "not set",
+                                        CONTENT_TYPE_FORM_URLENCODED))
+
+        # 3.5.2.  Form-Encoded Body
+        # Protocol parameters can be transmitted in the HTTP request entity-
+        # body, but only if the following REQUIRED conditions are met:
+        # o  The entity-body is single-part.
+        # o  The entity-body follows the encoding requirements of the
+        #    "application/x-www-form-urlencoded" content-type as defined by
+        #    [W3C.REC-html40-19980424].
+        # o  The HTTP request entity-header includes the "Content-Type" header
+        #    field set to "application/x-www-form-urlencoded".
+        elif self.signature_type == SIGNATURE_TYPE_BODY and not (
+                should_have_params and has_params and not multipart):
+            raise ValueError(
+                'Body signatures may only be used with form-urlencoded content')
+
+        # We amend http://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
+        # with the clause that parameters from body should only be included
+        # in non GET or HEAD requests. Extracting the request body parameters
+        # and including them in the signature base string would give semantic
+        # meaning to the body, which it should not have according to the
+        # HTTP 1.1 spec.
+        elif http_method.upper() in ('GET', 'HEAD') and has_params:
+            raise ValueError('GET/HEAD requests should not include body.')
+
+        # generate the basic OAuth parameters
+        request.oauth_params = self.get_oauth_params(request)
+
+        # generate the signature
+        request.oauth_params.append(
+            ('oauth_signature', self.get_oauth_signature(request)))
+
+        # render the signed request and return it
+        uri, headers, body = self._render(request, formencode=True,
+                                          realm=(realm or self.realm))
+
+        if self.decoding:
+            log.debug('Encoding URI, headers and body to %s.', self.decoding)
+            uri = uri.encode(self.decoding)
+            body = body.encode(self.decoding) if body else body
+            new_headers = {}
+            for k, v in headers.items():
+                new_headers[k.encode(self.decoding)] = v.encode(self.decoding)
+            headers = new_headers
+        return uri, headers, body
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/utils.py	(revision 1126)
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.utils
+~~~~~~~~~~~~~~
+
+This module contains utility methods used by various parts of the OAuth
+spec.
+"""
+from __future__ import absolute_import, unicode_literals
+
+try:
+    import urllib2
+except ImportError:
+    import urllib.request as urllib2
+
+from oauthlib.common import quote, unquote, bytes_type, unicode_type
+
+UNICODE_ASCII_CHARACTER_SET = ('abcdefghijklmnopqrstuvwxyz'
+                               'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+                               '0123456789')
+
+
+def filter_params(target):
+    """Decorator which filters params to remove non-oauth_* parameters
+
+    Assumes the decorated method takes a params dict or list of tuples as its
+    first argument.
+    """
+    def wrapper(params, *args, **kwargs):
+        params = filter_oauth_params(params)
+        return target(params, *args, **kwargs)
+
+    wrapper.__doc__ = target.__doc__
+    return wrapper
+
+
+def filter_oauth_params(params):
+    """Removes all non oauth parameters from a dict or a list of params."""
+    is_oauth = lambda kv: kv[0].startswith("oauth_")
+    if isinstance(params, dict):
+        return list(filter(is_oauth, list(params.items())))
+    else:
+        return list(filter(is_oauth, params))
+
+
+def escape(u):
+    """Escape a unicode string in an OAuth-compatible fashion.
+
+    Per `section 3.6`_ of the spec.
+
+    .. _`section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+
+    """
+    if not isinstance(u, unicode_type):
+        raise ValueError('Only unicode objects are escapable. ' +
+                         'Got %s of type %s.' % (u, type(u)))
+    # Letters, digits, and the characters '_.-' are already treated as safe
+    # by urllib.quote(). We need to add '~' to fully support rfc5849.
+    return quote(u, safe=b'~')
+
+
+def unescape(u):
+    if not isinstance(u, unicode_type):
+        raise ValueError('Only unicode objects are unescapable.')
+    return unquote(u)
+
+
+def parse_keqv_list(l):
+    """A unicode-safe version of urllib2.parse_keqv_list"""
+    # With Python 2.6, parse_http_list handles unicode fine
+    return urllib2.parse_keqv_list(l)
+
+
+def parse_http_list(u):
+    """A unicode-safe version of urllib2.parse_http_list"""
+    # With Python 2.6, parse_http_list handles unicode fine
+    return urllib2.parse_http_list(u)
+
+
+def parse_authorization_header(authorization_header):
+    """Parse an OAuth authorization header into a list of 2-tuples"""
+    auth_scheme = 'OAuth '.lower()
+    if authorization_header[:len(auth_scheme)].lower().startswith(auth_scheme):
+        items = parse_http_list(authorization_header[len(auth_scheme):])
+        try:
+            return list(parse_keqv_list(items).items())
+        except (IndexError, ValueError):
+            pass
+    raise ValueError('Malformed authorization header')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/signature.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/signature.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/signature.py	(revision 1126)
@@ -0,0 +1,611 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849.signature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module represents a direct implementation of `section 3.4`_ of the spec.
+
+Terminology:
+ * Client: software interfacing with an OAuth API
+ * Server: the API provider
+ * Resource Owner: the user who is granting authorization to the client
+
+Steps for signing a request:
+
+1. Collect parameters from the uri query, auth header, & body
+2. Normalize those parameters
+3. Normalize the uri
+4. Pass the normalized uri, normalized parameters, and http method to
+   construct the base string
+5. Pass the base string and any keys needed to a signing function
+
+.. _`section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+"""
+from __future__ import absolute_import, unicode_literals
+
+import binascii
+import hashlib
+import hmac
+try:
+    import urlparse
+except ImportError:
+    import urllib.parse as urlparse
+from . import utils
+from oauthlib.common import urldecode, extract_params, safe_string_equals
+from oauthlib.common import bytes_type, unicode_type
+
+
+def construct_base_string(http_method, base_string_uri,
+                          normalized_encoded_request_parameters):
+    """**String Construction**
+    Per `section 3.4.1.1`_ of the spec.
+
+    For example, the HTTP request::
+
+        POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+        Host: example.com
+        Content-Type: application/x-www-form-urlencoded
+        Authorization: OAuth realm="Example",
+            oauth_consumer_key="9djdj82h48djs9d2",
+            oauth_token="kkk9d7dh3k39sjv7",
+            oauth_signature_method="HMAC-SHA1",
+            oauth_timestamp="137131201",
+            oauth_nonce="7d8f3e4a",
+            oauth_signature="bYT5CMsGcbgUdFHObYMEfcx6bsw%3D"
+
+        c2&a3=2+q
+
+    is represented by the following signature base string (line breaks
+    are for display purposes only)::
+
+        POST&http%3A%2F%2Fexample.com%2Frequest&a2%3Dr%2520b%26a3%3D2%2520q
+        %26a3%3Da%26b5%3D%253D%25253D%26c%2540%3D%26c2%3D%26oauth_consumer_
+        key%3D9djdj82h48djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_m
+        ethod%3DHMAC-SHA1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk
+        9d7dh3k39sjv7
+
+    .. _`section 3.4.1.1`: http://tools.ietf.org/html/rfc5849#section-3.4.1.1
+    """
+
+    # The signature base string is constructed by concatenating together,
+    # in order, the following HTTP request elements:
+
+    # 1.  The HTTP request method in uppercase.  For example: "HEAD",
+    #     "GET", "POST", etc.  If the request uses a custom HTTP method, it
+    #     MUST be encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    base_string = utils.escape(http_method.upper())
+
+    # 2.  An "&" character (ASCII code 38).
+    base_string += '&'
+
+    # 3.  The base string URI from `Section 3.4.1.2`_, after being encoded
+    #     (`Section 3.6`_).
+    #
+    # .. _`Section 3.4.1.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.2
+    # .. _`Section 3.4.6`: http://tools.ietf.org/html/rfc5849#section-3.4.6
+    base_string += utils.escape(base_string_uri)
+
+    # 4.  An "&" character (ASCII code 38).
+    base_string += '&'
+
+    # 5.  The request parameters as normalized in `Section 3.4.1.3.2`_, after
+    #     being encoded (`Section 3.6`).
+    #
+    # .. _`Section 3.4.1.3.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2
+    # .. _`Section 3.4.6`: http://tools.ietf.org/html/rfc5849#section-3.4.6
+    base_string += utils.escape(normalized_encoded_request_parameters)
+
+    return base_string
+
+
+def normalize_base_string_uri(uri, host=None):
+    """**Base String URI**
+    Per `section 3.4.1.2`_ of the spec.
+
+    For example, the HTTP request::
+
+        GET /r%20v/X?id=123 HTTP/1.1
+        Host: EXAMPLE.COM:80
+
+    is represented by the base string URI: "http://example.com/r%20v/X".
+
+    In another example, the HTTPS request::
+
+        GET /?q=1 HTTP/1.1
+        Host: www.example.net:8080
+
+    is represented by the base string URI: "https://www.example.net:8080/".
+
+    .. _`section 3.4.1.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.2
+
+    The host argument overrides the netloc part of the uri argument.
+    """
+    if not isinstance(uri, unicode_type):
+        raise ValueError('uri must be a unicode object.')
+
+    # FIXME: urlparse does not support unicode
+    scheme, netloc, path, params, query, fragment = urlparse.urlparse(uri)
+
+    # The scheme, authority, and path of the request resource URI `RFC3986`
+    # are included by constructing an "http" or "https" URI representing
+    # the request resource (without the query or fragment) as follows:
+    #
+    # .. _`RFC3986`: http://tools.ietf.org/html/rfc3986
+
+    if not scheme or not netloc:
+        raise ValueError('uri must include a scheme and netloc')
+
+    # Per `RFC 2616 section 5.1.2`_:
+    #
+    # Note that the absolute path cannot be empty; if none is present in
+    # the original URI, it MUST be given as "/" (the server root).
+    #
+    # .. _`RFC 2616 section 5.1.2`: http://tools.ietf.org/html/rfc2616#section-5.1.2
+    if not path:
+        path = '/'
+
+    # 1.  The scheme and host MUST be in lowercase.
+    scheme = scheme.lower()
+    netloc = netloc.lower()
+
+    # 2.  The host and port values MUST match the content of the HTTP
+    #     request "Host" header field.
+    if host is not None:
+        netloc = host.lower()
+
+    # 3.  The port MUST be included if it is not the default port for the
+    #     scheme, and MUST be excluded if it is the default.  Specifically,
+    #     the port MUST be excluded when making an HTTP request `RFC2616`_
+    #     to port 80 or when making an HTTPS request `RFC2818`_ to port 443.
+    #     All other non-default port numbers MUST be included.
+    #
+    # .. _`RFC2616`: http://tools.ietf.org/html/rfc2616
+    # .. _`RFC2818`: http://tools.ietf.org/html/rfc2818
+    default_ports = (
+        ('http', '80'),
+        ('https', '443'),
+    )
+    if ':' in netloc:
+        host, port = netloc.split(':', 1)
+        if (scheme, port) in default_ports:
+            netloc = host
+
+    return urlparse.urlunparse((scheme, netloc, path, params, '', ''))
+
+
+# ** Request Parameters **
+#
+#    Per `section 3.4.1.3`_ of the spec.
+#
+#    In order to guarantee a consistent and reproducible representation of
+#    the request parameters, the parameters are collected and decoded to
+#    their original decoded form.  They are then sorted and encoded in a
+#    particular manner that is often different from their original
+#    encoding scheme, and concatenated into a single string.
+#
+# .. _`section 3.4.1.3`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3
+
+def collect_parameters(uri_query='', body=[], headers=None,
+                       exclude_oauth_signature=True, with_realm=False):
+    """**Parameter Sources**
+
+    Parameters starting with `oauth_` will be unescaped.
+
+    Body parameters must be supplied as a dict, a list of 2-tuples, or a
+    formencoded query string.
+
+    Headers must be supplied as a dict.
+
+    Per `section 3.4.1.3.1`_ of the spec.
+
+    For example, the HTTP request::
+
+        POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+        Host: example.com
+        Content-Type: application/x-www-form-urlencoded
+        Authorization: OAuth realm="Example",
+            oauth_consumer_key="9djdj82h48djs9d2",
+            oauth_token="kkk9d7dh3k39sjv7",
+            oauth_signature_method="HMAC-SHA1",
+            oauth_timestamp="137131201",
+            oauth_nonce="7d8f3e4a",
+            oauth_signature="djosJKDKJSD8743243%2Fjdk33klY%3D"
+
+        c2&a3=2+q
+
+    contains the following (fully decoded) parameters used in the
+    signature base sting::
+
+        +------------------------+------------------+
+        |          Name          |       Value      |
+        +------------------------+------------------+
+        |           b5           |       =%3D       |
+        |           a3           |         a        |
+        |           c@           |                  |
+        |           a2           |        r b       |
+        |   oauth_consumer_key   | 9djdj82h48djs9d2 |
+        |       oauth_token      | kkk9d7dh3k39sjv7 |
+        | oauth_signature_method |     HMAC-SHA1    |
+        |     oauth_timestamp    |     137131201    |
+        |       oauth_nonce      |     7d8f3e4a     |
+        |           c2           |                  |
+        |           a3           |        2 q       |
+        +------------------------+------------------+
+
+    Note that the value of "b5" is "=%3D" and not "==".  Both "c@" and
+    "c2" have empty values.  While the encoding rules specified in this
+    specification for the purpose of constructing the signature base
+    string exclude the use of a "+" character (ASCII code 43) to
+    represent an encoded space character (ASCII code 32), this practice
+    is widely used in "application/x-www-form-urlencoded" encoded values,
+    and MUST be properly decoded, as demonstrated by one of the "a3"
+    parameter instances (the "a3" parameter is used twice in this
+    request).
+
+    .. _`section 3.4.1.3.1`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
+    """
+    headers = headers or {}
+    params = []
+
+    # The parameters from the following sources are collected into a single
+    # list of name/value pairs:
+
+    # *  The query component of the HTTP request URI as defined by
+    #    `RFC3986, Section 3.4`_.  The query component is parsed into a list
+    #    of name/value pairs by treating it as an
+    #    "application/x-www-form-urlencoded" string, separating the names
+    #    and values and decoding them as defined by
+    #    `W3C.REC-html40-19980424`_, Section 17.13.4.
+    #
+    # .. _`RFC3986, Section 3.4`: http://tools.ietf.org/html/rfc3986#section-3.4
+    # .. _`W3C.REC-html40-19980424`: http://tools.ietf.org/html/rfc5849#ref-W3C.REC-html40-19980424
+    if uri_query:
+        params.extend(urldecode(uri_query))
+
+    # *  The OAuth HTTP "Authorization" header field (`Section 3.5.1`_) if
+    #    present.  The header's content is parsed into a list of name/value
+    #    pairs excluding the "realm" parameter if present.  The parameter
+    #    values are decoded as defined by `Section 3.5.1`_.
+    #
+    # .. _`Section 3.5.1`: http://tools.ietf.org/html/rfc5849#section-3.5.1
+    if headers:
+        headers_lower = dict((k.lower(), v) for k, v in headers.items())
+        authorization_header = headers_lower.get('authorization')
+        if authorization_header is not None:
+            params.extend([i for i in utils.parse_authorization_header(
+                authorization_header) if with_realm or i[0] != 'realm'])
+
+    # *  The HTTP request entity-body, but only if all of the following
+    #    conditions are met:
+    #     *  The entity-body is single-part.
+    #
+    #     *  The entity-body follows the encoding requirements of the
+    #        "application/x-www-form-urlencoded" content-type as defined by
+    #        `W3C.REC-html40-19980424`_.
+
+    #     *  The HTTP request entity-header includes the "Content-Type"
+    #        header field set to "application/x-www-form-urlencoded".
+    #
+    # .._`W3C.REC-html40-19980424`: http://tools.ietf.org/html/rfc5849#ref-W3C.REC-html40-19980424
+
+    # TODO: enforce header param inclusion conditions
+    bodyparams = extract_params(body) or []
+    params.extend(bodyparams)
+
+    # ensure all oauth params are unescaped
+    unescaped_params = []
+    for k, v in params:
+        if k.startswith('oauth_'):
+            v = utils.unescape(v)
+        unescaped_params.append((k, v))
+
+    # The "oauth_signature" parameter MUST be excluded from the signature
+    # base string if present.
+    if exclude_oauth_signature:
+        unescaped_params = list(filter(lambda i: i[0] != 'oauth_signature',
+                                       unescaped_params))
+
+    return unescaped_params
+
+
+def normalize_parameters(params):
+    """**Parameters Normalization**
+    Per `section 3.4.1.3.2`_ of the spec.
+
+    For example, the list of parameters from the previous section would
+    be normalized as follows:
+
+    Encoded::
+
+    +------------------------+------------------+
+    |          Name          |       Value      |
+    +------------------------+------------------+
+    |           b5           |     %3D%253D     |
+    |           a3           |         a        |
+    |          c%40          |                  |
+    |           a2           |       r%20b      |
+    |   oauth_consumer_key   | 9djdj82h48djs9d2 |
+    |       oauth_token      | kkk9d7dh3k39sjv7 |
+    | oauth_signature_method |     HMAC-SHA1    |
+    |     oauth_timestamp    |     137131201    |
+    |       oauth_nonce      |     7d8f3e4a     |
+    |           c2           |                  |
+    |           a3           |       2%20q      |
+    +------------------------+------------------+
+
+    Sorted::
+
+    +------------------------+------------------+
+    |          Name          |       Value      |
+    +------------------------+------------------+
+    |           a2           |       r%20b      |
+    |           a3           |       2%20q      |
+    |           a3           |         a        |
+    |           b5           |     %3D%253D     |
+    |          c%40          |                  |
+    |           c2           |                  |
+    |   oauth_consumer_key   | 9djdj82h48djs9d2 |
+    |       oauth_nonce      |     7d8f3e4a     |
+    | oauth_signature_method |     HMAC-SHA1    |
+    |     oauth_timestamp    |     137131201    |
+    |       oauth_token      | kkk9d7dh3k39sjv7 |
+    +------------------------+------------------+
+
+    Concatenated Pairs::
+
+    +-------------------------------------+
+    |              Name=Value             |
+    +-------------------------------------+
+    |               a2=r%20b              |
+    |               a3=2%20q              |
+    |                 a3=a                |
+    |             b5=%3D%253D             |
+    |                c%40=                |
+    |                 c2=                 |
+    | oauth_consumer_key=9djdj82h48djs9d2 |
+    |         oauth_nonce=7d8f3e4a        |
+    |   oauth_signature_method=HMAC-SHA1  |
+    |      oauth_timestamp=137131201      |
+    |     oauth_token=kkk9d7dh3k39sjv7    |
+    +-------------------------------------+
+
+    and concatenated together into a single string (line breaks are for
+    display purposes only)::
+
+        a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=&oauth_consumer_key=9dj
+        dj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1
+        &oauth_timestamp=137131201&oauth_token=kkk9d7dh3k39sjv7
+
+    .. _`section 3.4.1.3.2`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2
+    """
+
+    # The parameters collected in `Section 3.4.1.3`_ are normalized into a
+    # single string as follows:
+    #
+    # .. _`Section 3.4.1.3`: http://tools.ietf.org/html/rfc5849#section-3.4.1.3
+
+    # 1.  First, the name and value of each parameter are encoded
+    #     (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    key_values = [(utils.escape(k), utils.escape(v)) for k, v in params]
+
+    # 2.  The parameters are sorted by name, using ascending byte value
+    #     ordering.  If two or more parameters share the same name, they
+    #     are sorted by their value.
+    key_values.sort()
+
+    # 3.  The name of each parameter is concatenated to its corresponding
+    #     value using an "=" character (ASCII code 61) as a separator, even
+    #     if the value is empty.
+    parameter_parts = ['{0}={1}'.format(k, v) for k, v in key_values]
+
+    # 4.  The sorted name/value pairs are concatenated together into a
+    #     single string by using an "&" character (ASCII code 38) as
+    #     separator.
+    return '&'.join(parameter_parts)
+
+
+def sign_hmac_sha1_with_client(base_string, client):
+    return sign_hmac_sha1(base_string,
+                          client.client_secret,
+                          client.resource_owner_secret
+                          )
+
+
+def sign_hmac_sha1(base_string, client_secret, resource_owner_secret):
+    """**HMAC-SHA1**
+
+    The "HMAC-SHA1" signature method uses the HMAC-SHA1 signature
+    algorithm as defined in `RFC2104`_::
+
+        digest = HMAC-SHA1 (key, text)
+
+    Per `section 3.4.2`_ of the spec.
+
+    .. _`RFC2104`: http://tools.ietf.org/html/rfc2104
+    .. _`section 3.4.2`: http://tools.ietf.org/html/rfc5849#section-3.4.2
+    """
+
+    # The HMAC-SHA1 function variables are used in following way:
+
+    # text is set to the value of the signature base string from
+    # `Section 3.4.1.1`_.
+    #
+    # .. _`Section 3.4.1.1`: http://tools.ietf.org/html/rfc5849#section-3.4.1.1
+    text = base_string
+
+    # key is set to the concatenated values of:
+    # 1.  The client shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    key = utils.escape(client_secret or '')
+
+    # 2.  An "&" character (ASCII code 38), which MUST be included
+    #     even when either secret is empty.
+    key += '&'
+
+    # 3.  The token shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    key += utils.escape(resource_owner_secret or '')
+
+    # FIXME: HMAC does not support unicode!
+    key_utf8 = key.encode('utf-8')
+    text_utf8 = text.encode('utf-8')
+    signature = hmac.new(key_utf8, text_utf8, hashlib.sha1)
+
+    # digest  is used to set the value of the "oauth_signature" protocol
+    #         parameter, after the result octet string is base64-encoded
+    #         per `RFC2045, Section 6.8`.
+    #
+    # .. _`RFC2045, Section 6.8`: http://tools.ietf.org/html/rfc2045#section-6.8
+    return binascii.b2a_base64(signature.digest())[:-1].decode('utf-8')
+
+_jwtrs1 = None
+
+#jwt has some nice pycrypto/cryptography abstractions
+def _jwt_rs1_signing_algorithm():
+    global _jwtrs1
+    if _jwtrs1 is None:
+        import jwt.algorithms as jwtalgo
+        _jwtrs1 = jwtalgo.RSAAlgorithm(jwtalgo.hashes.SHA1)
+    return _jwtrs1
+
+def sign_rsa_sha1(base_string, rsa_private_key):
+    """**RSA-SHA1**
+
+    Per `section 3.4.3`_ of the spec.
+
+    The "RSA-SHA1" signature method uses the RSASSA-PKCS1-v1_5 signature
+    algorithm as defined in `RFC3447, Section 8.2`_ (also known as
+    PKCS#1), using SHA-1 as the hash function for EMSA-PKCS1-v1_5.  To
+    use this method, the client MUST have established client credentials
+    with the server that included its RSA public key (in a manner that is
+    beyond the scope of this specification).
+
+    .. _`section 3.4.3`: http://tools.ietf.org/html/rfc5849#section-3.4.3
+    .. _`RFC3447, Section 8.2`: http://tools.ietf.org/html/rfc3447#section-8.2
+
+    """
+    if isinstance(base_string, unicode_type):
+        base_string = base_string.encode('utf-8')
+    # TODO: finish RSA documentation
+    alg = _jwt_rs1_signing_algorithm()
+    key = _prepare_key_plus(alg, rsa_private_key)
+    s=alg.sign(base_string, key)
+    return binascii.b2a_base64(s)[:-1].decode('utf-8')
+
+
+def sign_rsa_sha1_with_client(base_string, client):
+    if not client.rsa_key:
+        raise ValueError('rsa_key is required when using RSA signature method.')
+    return sign_rsa_sha1(base_string, client.rsa_key)
+
+
+def sign_plaintext(client_secret, resource_owner_secret):
+    """Sign a request using plaintext.
+
+    Per `section 3.4.4`_ of the spec.
+
+    The "PLAINTEXT" method does not employ a signature algorithm.  It
+    MUST be used with a transport-layer mechanism such as TLS or SSL (or
+    sent over a secure channel with equivalent protections).  It does not
+    utilize the signature base string or the "oauth_timestamp" and
+    "oauth_nonce" parameters.
+
+    .. _`section 3.4.4`: http://tools.ietf.org/html/rfc5849#section-3.4.4
+
+    """
+
+    # The "oauth_signature" protocol parameter is set to the concatenated
+    # value of:
+
+    # 1.  The client shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    signature = utils.escape(client_secret or '')
+
+    # 2.  An "&" character (ASCII code 38), which MUST be included even
+    #     when either secret is empty.
+    signature += '&'
+
+    # 3.  The token shared-secret, after being encoded (`Section 3.6`_).
+    #
+    # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+    signature += utils.escape(resource_owner_secret or '')
+
+    return signature
+
+
+def sign_plaintext_with_client(base_string, client):
+    return sign_plaintext(client.client_secret, client.resource_owner_secret)
+
+
+def verify_hmac_sha1(request, client_secret=None,
+                     resource_owner_secret=None):
+    """Verify a HMAC-SHA1 signature.
+
+    Per `section 3.4`_ of the spec.
+
+    .. _`section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+
+    To satisfy `RFC2616 section 5.2`_ item 1, the request argument's uri
+    attribute MUST be an absolute URI whose netloc part identifies the
+    origin server or gateway on which the resource resides. Any Host
+    item of the request argument's headers dict attribute will be
+    ignored.
+
+    .. _`RFC2616 section 5.2`: http://tools.ietf.org/html/rfc2616#section-5.2
+
+    """
+    norm_params = normalize_parameters(request.params)
+    uri = normalize_base_string_uri(request.uri)
+    base_string = construct_base_string(request.http_method, uri, norm_params)
+    signature = sign_hmac_sha1(base_string, client_secret,
+                               resource_owner_secret)
+    return safe_string_equals(signature, request.signature)
+
+def _prepare_key_plus(alg, keystr):
+    if isinstance(keystr, bytes_type):
+        keystr = keystr.decode('utf-8')
+    return alg.prepare_key(keystr)
+
+def verify_rsa_sha1(request, rsa_public_key):
+    """Verify a RSASSA-PKCS #1 v1.5 base64 encoded signature.
+
+    Per `section 3.4.3`_ of the spec.
+
+    Note this method requires the jwt and cryptography libraries.
+
+    .. _`section 3.4.3`: http://tools.ietf.org/html/rfc5849#section-3.4.3
+
+    To satisfy `RFC2616 section 5.2`_ item 1, the request argument's uri
+    attribute MUST be an absolute URI whose netloc part identifies the
+    origin server or gateway on which the resource resides. Any Host
+    item of the request argument's headers dict attribute will be
+    ignored.
+
+    .. _`RFC2616 section 5.2`: http://tools.ietf.org/html/rfc2616#section-5.2
+    """
+    norm_params = normalize_parameters(request.params)
+    uri = normalize_base_string_uri(request.uri)
+    message = construct_base_string(request.http_method, uri, norm_params).encode('utf-8')
+    sig = binascii.a2b_base64(request.signature.encode('utf-8'))
+
+    alg = _jwt_rs1_signing_algorithm()
+    key = _prepare_key_plus(alg, rsa_public_key)
+    return alg.verify(message, key, sig)
+
+
+def verify_plaintext(request, client_secret=None, resource_owner_secret=None):
+    """Verify a PLAINTEXT signature.
+
+    Per `section 3.4`_ of the spec.
+
+    .. _`section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+    """
+    signature = sign_plaintext(client_secret, resource_owner_secret)
+    return safe_string_equals(signature, request.signature)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/parameters.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/parameters.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/parameters.py	(revision 1126)
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.parameters
+~~~~~~~~~~~~~~~~~~~
+
+This module contains methods related to `section 3.5`_ of the OAuth 1.0a spec.
+
+.. _`section 3.5`: http://tools.ietf.org/html/rfc5849#section-3.5
+"""
+from __future__ import absolute_import, unicode_literals
+
+try:
+    from urlparse import urlparse, urlunparse
+except ImportError:
+    from urllib.parse import urlparse, urlunparse
+from . import utils
+from oauthlib.common import extract_params, urlencode
+
+
+# TODO: do we need filter_params now that oauth_params are handled by Request?
+#       We can easily pass in just oauth protocol params.
+@utils.filter_params
+def prepare_headers(oauth_params, headers=None, realm=None):
+    """**Prepare the Authorization header.**
+    Per `section 3.5.1`_ of the spec.
+
+    Protocol parameters can be transmitted using the HTTP "Authorization"
+    header field as defined by `RFC2617`_ with the auth-scheme name set to
+    "OAuth" (case insensitive).
+
+    For example::
+
+        Authorization: OAuth realm="Example",
+            oauth_consumer_key="0685bd9184jfhq22",
+            oauth_token="ad180jjd733klru7",
+            oauth_signature_method="HMAC-SHA1",
+            oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+            oauth_timestamp="137131200",
+            oauth_nonce="4572616e48616d6d65724c61686176",
+            oauth_version="1.0"
+
+
+    .. _`section 3.5.1`: http://tools.ietf.org/html/rfc5849#section-3.5.1
+    .. _`RFC2617`: http://tools.ietf.org/html/rfc2617
+    """
+    headers = headers or {}
+
+    # Protocol parameters SHALL be included in the "Authorization" header
+    # field as follows:
+    authorization_header_parameters_parts = []
+    for oauth_parameter_name, value in oauth_params:
+        # 1.  Parameter names and values are encoded per Parameter Encoding
+        #     (`Section 3.6`_)
+        #
+        # .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
+        escaped_name = utils.escape(oauth_parameter_name)
+        escaped_value = utils.escape(value)
+
+        # 2.  Each parameter's name is immediately followed by an "=" character
+        #     (ASCII code 61), a """ character (ASCII code 34), the parameter
+        #     value (MAY be empty), and another """ character (ASCII code 34).
+        part = '{0}="{1}"'.format(escaped_name, escaped_value)
+
+        authorization_header_parameters_parts.append(part)
+
+    # 3.  Parameters are separated by a "," character (ASCII code 44) and
+    #     OPTIONAL linear whitespace per `RFC2617`_.
+    #
+    # .. _`RFC2617`: http://tools.ietf.org/html/rfc2617
+    authorization_header_parameters = ', '.join(
+        authorization_header_parameters_parts)
+
+    # 4.  The OPTIONAL "realm" parameter MAY be added and interpreted per
+    #     `RFC2617 section 1.2`_.
+    #
+    # .. _`RFC2617 section 1.2`: http://tools.ietf.org/html/rfc2617#section-1.2
+    if realm:
+        # NOTE: realm should *not* be escaped
+        authorization_header_parameters = ('realm="%s", ' % realm +
+                                           authorization_header_parameters)
+
+    # the auth-scheme name set to "OAuth" (case insensitive).
+    authorization_header = 'OAuth %s' % authorization_header_parameters
+
+    # contribute the Authorization header to the given headers
+    full_headers = {}
+    full_headers.update(headers)
+    full_headers['Authorization'] = authorization_header
+    return full_headers
+
+
+def _append_params(oauth_params, params):
+    """Append OAuth params to an existing set of parameters.
+
+    Both params and oauth_params is must be lists of 2-tuples.
+
+    Per `section 3.5.2`_ and `3.5.3`_ of the spec.
+
+    .. _`section 3.5.2`: http://tools.ietf.org/html/rfc5849#section-3.5.2
+    .. _`3.5.3`: http://tools.ietf.org/html/rfc5849#section-3.5.3
+
+    """
+    merged = list(params)
+    merged.extend(oauth_params)
+    # The request URI / entity-body MAY include other request-specific
+    # parameters, in which case, the protocol parameters SHOULD be appended
+    # following the request-specific parameters, properly separated by an "&"
+    # character (ASCII code 38)
+    merged.sort(key=lambda i: i[0].startswith('oauth_'))
+    return merged
+
+
+def prepare_form_encoded_body(oauth_params, body):
+    """Prepare the Form-Encoded Body.
+
+    Per `section 3.5.2`_ of the spec.
+
+    .. _`section 3.5.2`: http://tools.ietf.org/html/rfc5849#section-3.5.2
+
+    """
+    # append OAuth params to the existing body
+    return _append_params(oauth_params, body)
+
+
+def prepare_request_uri_query(oauth_params, uri):
+    """Prepare the Request URI Query.
+
+    Per `section 3.5.3`_ of the spec.
+
+    .. _`section 3.5.3`: http://tools.ietf.org/html/rfc5849#section-3.5.3
+
+    """
+    # append OAuth params to the existing set of query components
+    sch, net, path, par, query, fra = urlparse(uri)
+    query = urlencode(
+        _append_params(oauth_params, extract_params(query) or []))
+    return urlunparse((sch, net, path, par, query, fra))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/__init__.py	(revision 1126)
@@ -0,0 +1,9 @@
+from __future__ import absolute_import
+
+from .base import BaseEndpoint
+from .request_token import RequestTokenEndpoint
+from .authorization import AuthorizationEndpoint
+from .access_token import AccessTokenEndpoint
+from .resource import ResourceEndpoint
+from .signature_only import SignatureOnlyEndpoint
+from .pre_configured import WebApplicationServer
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/authorization.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/authorization.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/authorization.py	(revision 1126)
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849.endpoints.authorization
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for signing and checking OAuth 1.0 RFC 5849 requests.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from oauthlib.common import Request, add_params_to_uri
+
+from .base import BaseEndpoint
+from .. import errors
+try:
+    from urllib import urlencode
+except ImportError:
+    from urllib.parse import urlencode
+
+
+class AuthorizationEndpoint(BaseEndpoint):
+
+    """An endpoint responsible for letting authenticated users authorize access
+    to their protected resources to a client.
+
+    Typical use would be to have two views, one for displaying the authorization
+    form and one to process said form on submission.
+
+    The first view will want to utilize ``get_realms_and_credentials`` to fetch
+    requested realms and useful client credentials, such as name and
+    description, to be used when creating the authorization form.
+
+    During form processing you can use ``create_authorization_response`` to
+    validate the request, create a verifier as well as prepare the final
+    redirection URI used to send the user back to the client.
+
+    See :doc:`/oauth1/validator` for details on which validator methods to implement
+    for this endpoint.
+    """
+
+    def create_verifier(self, request, credentials):
+        """Create and save a new request token.
+
+        :param request: An oauthlib.common.Request object.
+        :param credentials: A dict of extra token credentials.
+        :returns: The verifier as a dict.
+        """
+        verifier = {
+            'oauth_token': request.resource_owner_key,
+            'oauth_verifier': self.token_generator(),
+        }
+        verifier.update(credentials)
+        self.request_validator.save_verifier(
+            request.resource_owner_key, verifier, request)
+        return verifier
+
+    def create_authorization_response(self, uri, http_method='GET', body=None,
+                                      headers=None, realms=None, credentials=None):
+        """Create an authorization response, with a new request token if valid.
+
+        :param uri: The full URI of the token request.
+        :param http_method: A valid HTTP verb, i.e. GET, POST, PUT, HEAD, etc.
+        :param body: The request body as a string.
+        :param headers: The request headers as a dict.
+        :param credentials: A list of credentials to include in the verifier.
+        :returns: A tuple of 3 elements.
+                  1. A dict of headers to set on the response.
+                  2. The response body as a string.
+                  3. The response status code as an integer.
+
+        If the callback URI tied to the current token is "oob", a response with
+        a 200 status code will be returned. In this case, it may be desirable to
+        modify the response to better display the verifier to the client.
+
+        An example of an authorization request::
+
+            >>> from your_validator import your_validator
+            >>> from oauthlib.oauth1 import AuthorizationEndpoint
+            >>> endpoint = AuthorizationEndpoint(your_validator)
+            >>> h, b, s = endpoint.create_authorization_response(
+            ...     'https://your.provider/authorize?oauth_token=...',
+            ...     credentials={
+            ...         'extra': 'argument',
+            ...     })
+            >>> h
+            {'Location': 'https://the.client/callback?oauth_verifier=...&extra=argument'}
+            >>> b
+            None
+            >>> s
+            302
+
+        An example of a request with an "oob" callback::
+
+            >>> from your_validator import your_validator
+            >>> from oauthlib.oauth1 import AuthorizationEndpoint
+            >>> endpoint = AuthorizationEndpoint(your_validator)
+            >>> h, b, s = endpoint.create_authorization_response(
+            ...     'https://your.provider/authorize?foo=bar',
+            ...     credentials={
+            ...         'extra': 'argument',
+            ...     })
+            >>> h
+            {'Content-Type': 'application/x-www-form-urlencoded'}
+            >>> b
+            'oauth_verifier=...&extra=argument'
+            >>> s
+            200
+        """
+        request = self._create_request(uri, http_method=http_method, body=body,
+                                       headers=headers)
+
+        if not request.resource_owner_key:
+            raise errors.InvalidRequestError(
+                'Missing mandatory parameter oauth_token.')
+        if not self.request_validator.verify_request_token(
+                request.resource_owner_key, request):
+            raise errors.InvalidClientError()
+
+        request.realms = realms
+        if (request.realms and not self.request_validator.verify_realms(
+                request.resource_owner_key, request.realms, request)):
+            raise errors.InvalidRequestError(
+                description=('User granted access to realms outside of '
+                             'what the client may request.'))
+
+        verifier = self.create_verifier(request, credentials or {})
+        redirect_uri = self.request_validator.get_redirect_uri(
+            request.resource_owner_key, request)
+        if redirect_uri == 'oob':
+            response_headers = {
+                'Content-Type': 'application/x-www-form-urlencoded'}
+            response_body = urlencode(verifier)
+            return response_headers, response_body, 200
+        else:
+            populated_redirect = add_params_to_uri(
+                redirect_uri, verifier.items())
+            return {'Location': populated_redirect}, None, 302
+
+    def get_realms_and_credentials(self, uri, http_method='GET', body=None,
+                                   headers=None):
+        """Fetch realms and credentials for the presented request token.
+
+        :param uri: The full URI of the token request.
+        :param http_method: A valid HTTP verb, i.e. GET, POST, PUT, HEAD, etc.
+        :param body: The request body as a string.
+        :param headers: The request headers as a dict.
+        :returns: A tuple of 2 elements.
+                  1. A list of request realms.
+                  2. A dict of credentials which may be useful in creating the
+                  authorization form.
+        """
+        request = self._create_request(uri, http_method=http_method, body=body,
+                                       headers=headers)
+
+        if not self.request_validator.verify_request_token(
+                request.resource_owner_key, request):
+            raise errors.InvalidClientError()
+
+        realms = self.request_validator.get_realms(
+            request.resource_owner_key, request)
+        return realms, {'resource_owner_key': request.resource_owner_key}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/access_token.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/access_token.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/access_token.py	(revision 1126)
@@ -0,0 +1,215 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849.endpoints.access_token
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of the access token provider logic of
+OAuth 1.0 RFC 5849. It validates the correctness of access token requests,
+creates and persists tokens as well as create the proper response to be
+returned to the client.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from oauthlib.common import urlencode
+
+from .base import BaseEndpoint
+from .. import errors
+
+log = logging.getLogger(__name__)
+
+
+class AccessTokenEndpoint(BaseEndpoint):
+
+    """An endpoint responsible for providing OAuth 1 access tokens.
+
+    Typical use is to instantiate with a request validator and invoke the
+    ``create_access_token_response`` from a view function. The tuple returned
+    has all information necessary (body, status, headers) to quickly form
+    and return a proper response. See :doc:`/oauth1/validator` for details on which
+    validator methods to implement for this endpoint.
+    """
+
+    def create_access_token(self, request, credentials):
+        """Create and save a new access token.
+
+        Similar to OAuth 2, indication of granted scopes will be included as a
+        space separated list in ``oauth_authorized_realms``.
+
+        :param request: An oauthlib.common.Request object.
+        :returns: The token as an urlencoded string.
+        """
+        request.realms = self.request_validator.get_realms(
+            request.resource_owner_key, request)
+        token = {
+            'oauth_token': self.token_generator(),
+            'oauth_token_secret': self.token_generator(),
+            # Backport the authorized scopes indication used in OAuth2
+            'oauth_authorized_realms': ' '.join(request.realms)
+        }
+        token.update(credentials)
+        self.request_validator.save_access_token(token, request)
+        return urlencode(token.items())
+
+    def create_access_token_response(self, uri, http_method='GET', body=None,
+                                     headers=None, credentials=None):
+        """Create an access token response, with a new request token if valid.
+
+        :param uri: The full URI of the token request.
+        :param http_method: A valid HTTP verb, i.e. GET, POST, PUT, HEAD, etc.
+        :param body: The request body as a string.
+        :param headers: The request headers as a dict.
+        :param credentials: A list of extra credentials to include in the token.
+        :returns: A tuple of 3 elements.
+                  1. A dict of headers to set on the response.
+                  2. The response body as a string.
+                  3. The response status code as an integer.
+
+        An example of a valid request::
+
+            >>> from your_validator import your_validator
+            >>> from oauthlib.oauth1 import AccessTokenEndpoint
+            >>> endpoint = AccessTokenEndpoint(your_validator)
+            >>> h, b, s = endpoint.create_access_token_response(
+            ...     'https://your.provider/access_token?foo=bar',
+            ...     headers={
+            ...         'Authorization': 'OAuth oauth_token=234lsdkf....'
+            ...     },
+            ...     credentials={
+            ...         'my_specific': 'argument',
+            ...     })
+            >>> h
+            {'Content-Type': 'application/x-www-form-urlencoded'}
+            >>> b
+            'oauth_token=lsdkfol23w54jlksdef&oauth_token_secret=qwe089234lkjsdf&oauth_authorized_realms=movies+pics&my_specific=argument'
+            >>> s
+            200
+
+        An response to invalid request would have a different body and status::
+
+            >>> b
+            'error=invalid_request&description=missing+resource+owner+key'
+            >>> s
+            400
+
+        The same goes for an an unauthorized request:
+
+            >>> b
+            ''
+            >>> s
+            401
+        """
+        resp_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
+        try:
+            request = self._create_request(uri, http_method, body, headers)
+            valid, processed_request = self.validate_access_token_request(
+                request)
+            if valid:
+                token = self.create_access_token(request, credentials or {})
+                self.request_validator.invalidate_request_token(
+                    request.client_key,
+                    request.resource_owner_key,
+                    request)
+                return resp_headers, token, 200
+            else:
+                return {}, None, 401
+        except errors.OAuth1Error as e:
+            return resp_headers, e.urlencoded, e.status_code
+
+    def validate_access_token_request(self, request):
+        """Validate an access token request.
+
+        :param request: An oauthlib.common.Request object.
+        :raises: OAuth1Error if the request is invalid.
+        :returns: A tuple of 2 elements.
+                  1. The validation result (True or False).
+                  2. The request object.
+        """
+        self._check_transport_security(request)
+        self._check_mandatory_parameters(request)
+
+        if not request.resource_owner_key:
+            raise errors.InvalidRequestError(
+                description='Missing resource owner.')
+
+        if not self.request_validator.check_request_token(
+                request.resource_owner_key):
+            raise errors.InvalidRequestError(
+                description='Invalid resource owner key format.')
+
+        if not request.verifier:
+            raise errors.InvalidRequestError(
+                description='Missing verifier.')
+
+        if not self.request_validator.check_verifier(request.verifier):
+            raise errors.InvalidRequestError(
+                description='Invalid verifier format.')
+
+        if not self.request_validator.validate_timestamp_and_nonce(
+                request.client_key, request.timestamp, request.nonce, request,
+                request_token=request.resource_owner_key):
+            return False, request
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid client credentials.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy client is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable client enumeration
+        valid_client = self.request_validator.validate_client_key(
+            request.client_key, request)
+        if not valid_client:
+            request.client_key = self.request_validator.dummy_client
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid or expired token.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy token is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable resource owner enumeration
+        valid_resource_owner = self.request_validator.validate_request_token(
+            request.client_key, request.resource_owner_key, request)
+        if not valid_resource_owner:
+            request.resource_owner_key = self.request_validator.dummy_request_token
+
+        # The server MUST verify (Section 3.2) the validity of the request,
+        # ensure that the resource owner has authorized the provisioning of
+        # token credentials to the client, and ensure that the temporary
+        # credentials have not expired or been used before.  The server MUST
+        # also verify the verification code received from the client.
+        # .. _`Section 3.2`: http://tools.ietf.org/html/rfc5849#section-3.2
+        #
+        # Note that early exit would enable resource owner authorization
+        # verifier enumertion.
+        valid_verifier = self.request_validator.validate_verifier(
+            request.client_key,
+            request.resource_owner_key,
+            request.verifier,
+            request)
+
+        valid_signature = self._check_signature(request, is_token_request=True)
+
+        # log the results to the validator_log
+        # this lets us handle internal reporting and analysis
+        request.validator_log['client'] = valid_client
+        request.validator_log['resource_owner'] = valid_resource_owner
+        request.validator_log['verifier'] = valid_verifier
+        request.validator_log['signature'] = valid_signature
+
+        # We delay checking validity until the very end, using dummy values for
+        # calculations and fetching secrets/keys to ensure the flow of every
+        # request remains almost identical regardless of whether valid values
+        # have been supplied. This ensures near constant time execution and
+        # prevents malicious users from guessing sensitive information
+        v = all((valid_client, valid_resource_owner, valid_verifier,
+                 valid_signature))
+        if not v:
+            log.info("[Failure] request verification failed.")
+            log.info("Valid client:, %s", valid_client)
+            log.info("Valid token:, %s", valid_resource_owner)
+            log.info("Valid verifier:, %s", valid_verifier)
+            log.info("Valid signature:, %s", valid_signature)
+        return v, request
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/signature_only.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/signature_only.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/signature_only.py	(revision 1126)
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849.endpoints.signature_only
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of the signing logic of OAuth 1.0 RFC 5849.
+"""
+
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from .base import BaseEndpoint
+from .. import errors
+
+log = logging.getLogger(__name__)
+
+
+class SignatureOnlyEndpoint(BaseEndpoint):
+
+    """An endpoint only responsible for verifying an oauth signature."""
+
+    def validate_request(self, uri, http_method='GET',
+                         body=None, headers=None):
+        """Validate a signed OAuth request.
+
+        :param uri: The full URI of the token request.
+        :param http_method: A valid HTTP verb, i.e. GET, POST, PUT, HEAD, etc.
+        :param body: The request body as a string.
+        :param headers: The request headers as a dict.
+        :returns: A tuple of 2 elements.
+                  1. True if valid, False otherwise.
+                  2. An oauthlib.common.Request object.
+        """
+        try:
+            request = self._create_request(uri, http_method, body, headers)
+        except errors.OAuth1Error:
+            return False, None
+
+        try:
+            self._check_transport_security(request)
+            self._check_mandatory_parameters(request)
+        except errors.OAuth1Error:
+            return False, request
+
+        if not self.request_validator.validate_timestamp_and_nonce(
+                request.client_key, request.timestamp, request.nonce, request):
+            return False, request
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid client credentials.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy client is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable client enumeration
+        valid_client = self.request_validator.validate_client_key(
+            request.client_key, request)
+        if not valid_client:
+            request.client_key = self.request_validator.dummy_client
+
+        valid_signature = self._check_signature(request)
+
+        # log the results to the validator_log
+        # this lets us handle internal reporting and analysis
+        request.validator_log['client'] = valid_client
+        request.validator_log['signature'] = valid_signature
+
+        # We delay checking validity until the very end, using dummy values for
+        # calculations and fetching secrets/keys to ensure the flow of every
+        # request remains almost identical regardless of whether valid values
+        # have been supplied. This ensures near constant time execution and
+        # prevents malicious users from guessing sensitive information
+        v = all((valid_client, valid_signature))
+        if not v:
+            log.info("[Failure] request verification failed.")
+            log.info("Valid client: %s", valid_client)
+            log.info("Valid signature: %s", valid_signature)
+        return v, request
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/resource.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/resource.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/resource.py	(revision 1126)
@@ -0,0 +1,165 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849.endpoints.resource
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of the resource protection provider logic of
+OAuth 1.0 RFC 5849.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from .base import BaseEndpoint
+from .. import errors
+
+log = logging.getLogger(__name__)
+
+
+class ResourceEndpoint(BaseEndpoint):
+
+    """An endpoint responsible for protecting resources.
+
+    Typical use is to instantiate with a request validator and invoke the
+    ``validate_protected_resource_request`` in a decorator around a view
+    function. If the request is valid, invoke and return the response of the
+    view. If invalid create and return an error response directly from the
+    decorator.
+
+    See :doc:`/oauth1/validator` for details on which validator methods to implement
+    for this endpoint.
+
+    An example decorator::
+
+        from functools import wraps
+        from your_validator import your_validator
+        from oauthlib.oauth1 import ResourceEndpoint
+        endpoint = ResourceEndpoint(your_validator)
+
+        def require_oauth(realms=None):
+            def decorator(f):
+                @wraps(f)
+                def wrapper(request, *args, **kwargs):
+                    v, r = provider.validate_protected_resource_request(
+                            request.url,
+                            http_method=request.method,
+                            body=request.data,
+                            headers=request.headers,
+                            realms=realms or [])
+                    if v:
+                        return f(*args, **kwargs)
+                    else:
+                        return abort(403)
+    """
+
+    def validate_protected_resource_request(self, uri, http_method='GET',
+                                            body=None, headers=None, realms=None):
+        """Create a request token response, with a new request token if valid.
+
+        :param uri: The full URI of the token request.
+        :param http_method: A valid HTTP verb, i.e. GET, POST, PUT, HEAD, etc.
+        :param body: The request body as a string.
+        :param headers: The request headers as a dict.
+        :param realms: A list of realms the resource is protected under.
+                       This will be supplied to the ``validate_realms``
+                       method of the request validator.
+        :returns: A tuple of 2 elements.
+                  1. True if valid, False otherwise.
+                  2. An oauthlib.common.Request object.
+        """
+        try:
+            request = self._create_request(uri, http_method, body, headers)
+        except errors.OAuth1Error:
+            return False, None
+
+        try:
+            self._check_transport_security(request)
+            self._check_mandatory_parameters(request)
+        except errors.OAuth1Error:
+            return False, request
+
+        if not request.resource_owner_key:
+            return False, request
+
+        if not self.request_validator.check_access_token(
+                request.resource_owner_key):
+            return False, request
+
+        if not self.request_validator.validate_timestamp_and_nonce(
+                request.client_key, request.timestamp, request.nonce, request,
+                access_token=request.resource_owner_key):
+            return False, request
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid client credentials.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy client is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable client enumeration
+        valid_client = self.request_validator.validate_client_key(
+            request.client_key, request)
+        if not valid_client:
+            request.client_key = self.request_validator.dummy_client
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid or expired token.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy token is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable resource owner enumeration
+        valid_resource_owner = self.request_validator.validate_access_token(
+            request.client_key, request.resource_owner_key, request)
+        if not valid_resource_owner:
+            request.resource_owner_key = self.request_validator.dummy_access_token
+
+        # Note that `realm`_ is only used in authorization headers and how
+        # it should be interepreted is not included in the OAuth spec.
+        # However they could be seen as a scope or realm to which the
+        # client has access and as such every client should be checked
+        # to ensure it is authorized access to that scope or realm.
+        # .. _`realm`: http://tools.ietf.org/html/rfc2617#section-1.2
+        #
+        # Note that early exit would enable client realm access enumeration.
+        #
+        # The require_realm indicates this is the first step in the OAuth
+        # workflow where a client requests access to a specific realm.
+        # This first step (obtaining request token) need not require a realm
+        # and can then be identified by checking the require_resource_owner
+        # flag and abscence of realm.
+        #
+        # Clients obtaining an access token will not supply a realm and it will
+        # not be checked. Instead the previously requested realm should be
+        # transferred from the request token to the access token.
+        #
+        # Access to protected resources will always validate the realm but note
+        # that the realm is now tied to the access token and not provided by
+        # the client.
+        valid_realm = self.request_validator.validate_realms(request.client_key,
+                                                             request.resource_owner_key, request, uri=request.uri,
+                                                             realms=realms)
+
+        valid_signature = self._check_signature(request)
+
+        # log the results to the validator_log
+        # this lets us handle internal reporting and analysis
+        request.validator_log['client'] = valid_client
+        request.validator_log['resource_owner'] = valid_resource_owner
+        request.validator_log['realm'] = valid_realm
+        request.validator_log['signature'] = valid_signature
+
+        # We delay checking validity until the very end, using dummy values for
+        # calculations and fetching secrets/keys to ensure the flow of every
+        # request remains almost identical regardless of whether valid values
+        # have been supplied. This ensures near constant time execution and
+        # prevents malicious users from guessing sensitive information
+        v = all((valid_client, valid_resource_owner, valid_realm,
+                 valid_signature))
+        if not v:
+            log.info("[Failure] request verification failed.")
+            log.info("Valid client: %s", valid_client)
+            log.info("Valid token: %s", valid_resource_owner)
+            log.info("Valid realm: %s", valid_realm)
+            log.info("Valid signature: %s", valid_signature)
+        return v, request
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/request_token.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/request_token.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/request_token.py	(revision 1126)
@@ -0,0 +1,209 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849.endpoints.request_token
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of the request token provider logic of
+OAuth 1.0 RFC 5849. It validates the correctness of request token requests,
+creates and persists tokens as well as create the proper response to be
+returned to the client.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from oauthlib.common import urlencode
+
+from .base import BaseEndpoint
+from .. import errors
+
+log = logging.getLogger(__name__)
+
+
+class RequestTokenEndpoint(BaseEndpoint):
+
+    """An endpoint responsible for providing OAuth 1 request tokens.
+
+    Typical use is to instantiate with a request validator and invoke the
+    ``create_request_token_response`` from a view function. The tuple returned
+    has all information necessary (body, status, headers) to quickly form
+    and return a proper response. See :doc:`/oauth1/validator` for details on which
+    validator methods to implement for this endpoint.
+    """
+
+    def create_request_token(self, request, credentials):
+        """Create and save a new request token.
+
+        :param request: An oauthlib.common.Request object.
+        :param credentials: A dict of extra token credentials.
+        :returns: The token as an urlencoded string.
+        """
+        token = {
+            'oauth_token': self.token_generator(),
+            'oauth_token_secret': self.token_generator(),
+            'oauth_callback_confirmed': 'true'
+        }
+        token.update(credentials)
+        self.request_validator.save_request_token(token, request)
+        return urlencode(token.items())
+
+    def create_request_token_response(self, uri, http_method='GET', body=None,
+                                      headers=None, credentials=None):
+        """Create a request token response, with a new request token if valid.
+
+        :param uri: The full URI of the token request.
+        :param http_method: A valid HTTP verb, i.e. GET, POST, PUT, HEAD, etc.
+        :param body: The request body as a string.
+        :param headers: The request headers as a dict.
+        :param credentials: A list of extra credentials to include in the token.
+        :returns: A tuple of 3 elements.
+                  1. A dict of headers to set on the response.
+                  2. The response body as a string.
+                  3. The response status code as an integer.
+
+        An example of a valid request::
+
+            >>> from your_validator import your_validator
+            >>> from oauthlib.oauth1 import RequestTokenEndpoint
+            >>> endpoint = RequestTokenEndpoint(your_validator)
+            >>> h, b, s = endpoint.create_request_token_response(
+            ...     'https://your.provider/request_token?foo=bar',
+            ...     headers={
+            ...         'Authorization': 'OAuth realm=movies user, oauth_....'
+            ...     },
+            ...     credentials={
+            ...         'my_specific': 'argument',
+            ...     })
+            >>> h
+            {'Content-Type': 'application/x-www-form-urlencoded'}
+            >>> b
+            'oauth_token=lsdkfol23w54jlksdef&oauth_token_secret=qwe089234lkjsdf&oauth_callback_confirmed=true&my_specific=argument'
+            >>> s
+            200
+
+        An response to invalid request would have a different body and status::
+
+            >>> b
+            'error=invalid_request&description=missing+callback+uri'
+            >>> s
+            400
+
+        The same goes for an an unauthorized request:
+
+            >>> b
+            ''
+            >>> s
+            401
+        """
+        resp_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
+        try:
+            request = self._create_request(uri, http_method, body, headers)
+            valid, processed_request = self.validate_request_token_request(
+                request)
+            if valid:
+                token = self.create_request_token(request, credentials or {})
+                return resp_headers, token, 200
+            else:
+                return {}, None, 401
+        except errors.OAuth1Error as e:
+            return resp_headers, e.urlencoded, e.status_code
+
+    def validate_request_token_request(self, request):
+        """Validate a request token request.
+
+        :param request: An oauthlib.common.Request object.
+        :raises: OAuth1Error if the request is invalid.
+        :returns: A tuple of 2 elements.
+                  1. The validation result (True or False).
+                  2. The request object.
+        """
+        self._check_transport_security(request)
+        self._check_mandatory_parameters(request)
+
+        if request.realm:
+            request.realms = request.realm.split(' ')
+        else:
+            request.realms = self.request_validator.get_default_realms(
+                request.client_key, request)
+        if not self.request_validator.check_realms(request.realms):
+            raise errors.InvalidRequestError(
+                description='Invalid realm %s. Allowed are %r.' % (
+                    request.realms, self.request_validator.realms))
+
+        if not request.redirect_uri:
+            raise errors.InvalidRequestError(
+                description='Missing callback URI.')
+
+        if not self.request_validator.validate_timestamp_and_nonce(
+                request.client_key, request.timestamp, request.nonce, request,
+                request_token=request.resource_owner_key):
+            return False, request
+
+        # The server SHOULD return a 401 (Unauthorized) status code when
+        # receiving a request with invalid client credentials.
+        # Note: This is postponed in order to avoid timing attacks, instead
+        # a dummy client is assigned and used to maintain near constant
+        # time request verification.
+        #
+        # Note that early exit would enable client enumeration
+        valid_client = self.request_validator.validate_client_key(
+            request.client_key, request)
+        if not valid_client:
+            request.client_key = self.request_validator.dummy_client
+
+        # Note that `realm`_ is only used in authorization headers and how
+        # it should be interepreted is not included in the OAuth spec.
+        # However they could be seen as a scope or realm to which the
+        # client has access and as such every client should be checked
+        # to ensure it is authorized access to that scope or realm.
+        # .. _`realm`: http://tools.ietf.org/html/rfc2617#section-1.2
+        #
+        # Note that early exit would enable client realm access enumeration.
+        #
+        # The require_realm indicates this is the first step in the OAuth
+        # workflow where a client requests access to a specific realm.
+        # This first step (obtaining request token) need not require a realm
+        # and can then be identified by checking the require_resource_owner
+        # flag and abscence of realm.
+        #
+        # Clients obtaining an access token will not supply a realm and it will
+        # not be checked. Instead the previously requested realm should be
+        # transferred from the request token to the access token.
+        #
+        # Access to protected resources will always validate the realm but note
+        # that the realm is now tied to the access token and not provided by
+        # the client.
+        valid_realm = self.request_validator.validate_requested_realms(
+            request.client_key, request.realms, request)
+
+        # Callback is normally never required, except for requests for
+        # a Temporary Credential as described in `Section 2.1`_
+        # .._`Section 2.1`: http://tools.ietf.org/html/rfc5849#section-2.1
+        valid_redirect = self.request_validator.validate_redirect_uri(
+            request.client_key, request.redirect_uri, request)
+        if not request.redirect_uri:
+            raise NotImplementedError('Redirect URI must either be provided '
+                                      'or set to a default during validation.')
+
+        valid_signature = self._check_signature(request)
+
+        # log the results to the validator_log
+        # this lets us handle internal reporting and analysis
+        request.validator_log['client'] = valid_client
+        request.validator_log['realm'] = valid_realm
+        request.validator_log['callback'] = valid_redirect
+        request.validator_log['signature'] = valid_signature
+
+        # We delay checking validity until the very end, using dummy values for
+        # calculations and fetching secrets/keys to ensure the flow of every
+        # request remains almost identical regardless of whether valid values
+        # have been supplied. This ensures near constant time execution and
+        # prevents malicious users from guessing sensitive information
+        v = all((valid_client, valid_realm, valid_redirect, valid_signature))
+        if not v:
+            log.info("[Failure] request verification failed.")
+            log.info("Valid client: %s.", valid_client)
+            log.info("Valid realm: %s.", valid_realm)
+            log.info("Valid callback: %s.", valid_redirect)
+            log.info("Valid signature: %s.", valid_signature)
+        return v, request
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/base.py	(revision 1126)
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1.rfc5849.endpoints.base
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for signing and checking OAuth 1.0 RFC 5849 requests.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import time
+
+from oauthlib.common import Request, generate_token
+
+from .. import signature, utils, errors
+from .. import CONTENT_TYPE_FORM_URLENCODED
+from .. import SIGNATURE_HMAC, SIGNATURE_RSA
+from .. import SIGNATURE_TYPE_AUTH_HEADER
+from .. import SIGNATURE_TYPE_QUERY
+from .. import SIGNATURE_TYPE_BODY
+
+
+class BaseEndpoint(object):
+
+    def __init__(self, request_validator, token_generator=None):
+        self.request_validator = request_validator
+        self.token_generator = token_generator or generate_token
+
+    def _get_signature_type_and_params(self, request):
+        """Extracts parameters from query, headers and body. Signature type
+        is set to the source in which parameters were found.
+        """
+        # Per RFC5849, only the Authorization header may contain the 'realm'
+        # optional parameter.
+        header_params = signature.collect_parameters(headers=request.headers,
+                                                     exclude_oauth_signature=False, with_realm=True)
+        body_params = signature.collect_parameters(body=request.body,
+                                                   exclude_oauth_signature=False)
+        query_params = signature.collect_parameters(uri_query=request.uri_query,
+                                                    exclude_oauth_signature=False)
+
+        params = []
+        params.extend(header_params)
+        params.extend(body_params)
+        params.extend(query_params)
+        signature_types_with_oauth_params = list(filter(lambda s: s[2], (
+            (SIGNATURE_TYPE_AUTH_HEADER, params,
+                utils.filter_oauth_params(header_params)),
+            (SIGNATURE_TYPE_BODY, params,
+                utils.filter_oauth_params(body_params)),
+            (SIGNATURE_TYPE_QUERY, params,
+                utils.filter_oauth_params(query_params))
+        )))
+
+        if len(signature_types_with_oauth_params) > 1:
+            found_types = [s[0] for s in signature_types_with_oauth_params]
+            raise errors.InvalidRequestError(
+                description=('oauth_ params must come from only 1 signature'
+                             'type but were found in %s',
+                             ', '.join(found_types)))
+
+        try:
+            signature_type, params, oauth_params = signature_types_with_oauth_params[
+                0]
+        except IndexError:
+            raise errors.InvalidRequestError(
+                description='Missing mandatory OAuth parameters.')
+
+        return signature_type, params, oauth_params
+
+    def _create_request(self, uri, http_method, body, headers):
+        # Only include body data from x-www-form-urlencoded requests
+        headers = headers or {}
+        if ("Content-Type" in headers and
+                CONTENT_TYPE_FORM_URLENCODED in headers["Content-Type"]):
+            request = Request(uri, http_method, body, headers)
+        else:
+            request = Request(uri, http_method, '', headers)
+
+        signature_type, params, oauth_params = (
+            self._get_signature_type_and_params(request))
+
+        # The server SHOULD return a 400 (Bad Request) status code when
+        # receiving a request with duplicated protocol parameters.
+        if len(dict(oauth_params)) != len(oauth_params):
+            raise errors.InvalidRequestError(
+                description='Duplicate OAuth1 entries.')
+
+        oauth_params = dict(oauth_params)
+        request.signature = oauth_params.get('oauth_signature')
+        request.client_key = oauth_params.get('oauth_consumer_key')
+        request.resource_owner_key = oauth_params.get('oauth_token')
+        request.nonce = oauth_params.get('oauth_nonce')
+        request.timestamp = oauth_params.get('oauth_timestamp')
+        request.redirect_uri = oauth_params.get('oauth_callback')
+        request.verifier = oauth_params.get('oauth_verifier')
+        request.signature_method = oauth_params.get('oauth_signature_method')
+        request.realm = dict(params).get('realm')
+        request.oauth_params = oauth_params
+
+        # Parameters to Client depend on signature method which may vary
+        # for each request. Note that HMAC-SHA1 and PLAINTEXT share parameters
+        request.params = [(k, v) for k, v in params if k != "oauth_signature"]
+
+        if 'realm' in request.headers.get('Authorization', ''):
+            request.params = [(k, v)
+                              for k, v in request.params if k != "realm"]
+
+        return request
+
+    def _check_transport_security(self, request):
+        # TODO: move into oauthlib.common from oauth2.utils
+        if (self.request_validator.enforce_ssl and
+                not request.uri.lower().startswith("https://")):
+            raise errors.InsecureTransportError()
+
+    def _check_mandatory_parameters(self, request):
+        # The server SHOULD return a 400 (Bad Request) status code when
+        # receiving a request with missing parameters.
+        if not all((request.signature, request.client_key,
+                    request.nonce, request.timestamp,
+                    request.signature_method)):
+            raise errors.InvalidRequestError(
+                description='Missing mandatory OAuth parameters.')
+
+        # OAuth does not mandate a particular signature method, as each
+        # implementation can have its own unique requirements.  Servers are
+        # free to implement and document their own custom methods.
+        # Recommending any particular method is beyond the scope of this
+        # specification.  Implementers should review the Security
+        # Considerations section (`Section 4`_) before deciding on which
+        # method to support.
+        # .. _`Section 4`: http://tools.ietf.org/html/rfc5849#section-4
+        if (not request.signature_method in
+                self.request_validator.allowed_signature_methods):
+            raise errors.InvalidSignatureMethodError(
+                description="Invalid signature, %s not in %r." % (
+                    request.signature_method,
+                    self.request_validator.allowed_signature_methods))
+
+        # Servers receiving an authenticated request MUST validate it by:
+        #   If the "oauth_version" parameter is present, ensuring its value is
+        #   "1.0".
+        if ('oauth_version' in request.oauth_params and
+                request.oauth_params['oauth_version'] != '1.0'):
+            raise errors.InvalidRequestError(
+                description='Invalid OAuth version.')
+
+        # The timestamp value MUST be a positive integer. Unless otherwise
+        # specified by the server's documentation, the timestamp is expressed
+        # in the number of seconds since January 1, 1970 00:00:00 GMT.
+        if len(request.timestamp) != 10:
+            raise errors.InvalidRequestError(
+                description='Invalid timestamp size')
+
+        try:
+            ts = int(request.timestamp)
+
+        except ValueError:
+            raise errors.InvalidRequestError(
+                description='Timestamp must be an integer.')
+
+        else:
+            # To avoid the need to retain an infinite number of nonce values for
+            # future checks, servers MAY choose to restrict the time period after
+            # which a request with an old timestamp is rejected.
+            if abs(time.time() - ts) > self.request_validator.timestamp_lifetime:
+                raise errors.InvalidRequestError(
+                    description=('Timestamp given is invalid, differ from '
+                                 'allowed by over %s seconds.' % (
+                                     self.request_validator.timestamp_lifetime)))
+
+        # Provider specific validation of parameters, used to enforce
+        # restrictions such as character set and length.
+        if not self.request_validator.check_client_key(request.client_key):
+            raise errors.InvalidRequestError(
+                description='Invalid client key format.')
+
+        if not self.request_validator.check_nonce(request.nonce):
+            raise errors.InvalidRequestError(
+                description='Invalid nonce format.')
+
+    def _check_signature(self, request, is_token_request=False):
+        # ---- RSA Signature verification ----
+        if request.signature_method == SIGNATURE_RSA:
+            # The server verifies the signature per `[RFC3447] section 8.2.2`_
+            # .. _`[RFC3447] section 8.2.2`: http://tools.ietf.org/html/rfc3447#section-8.2.1
+            rsa_key = self.request_validator.get_rsa_key(
+                request.client_key, request)
+            valid_signature = signature.verify_rsa_sha1(request, rsa_key)
+
+        # ---- HMAC or Plaintext Signature verification ----
+        else:
+            # Servers receiving an authenticated request MUST validate it by:
+            #   Recalculating the request signature independently as described in
+            #   `Section 3.4`_ and comparing it to the value received from the
+            #   client via the "oauth_signature" parameter.
+            # .. _`Section 3.4`: http://tools.ietf.org/html/rfc5849#section-3.4
+            client_secret = self.request_validator.get_client_secret(
+                request.client_key, request)
+            resource_owner_secret = None
+            if request.resource_owner_key:
+                if is_token_request:
+                    resource_owner_secret = self.request_validator.get_request_token_secret(
+                        request.client_key, request.resource_owner_key, request)
+                else:
+                    resource_owner_secret = self.request_validator.get_access_token_secret(
+                        request.client_key, request.resource_owner_key, request)
+
+            if request.signature_method == SIGNATURE_HMAC:
+                valid_signature = signature.verify_hmac_sha1(request,
+                                                             client_secret, resource_owner_secret)
+            else:
+                valid_signature = signature.verify_plaintext(request,
+                                                             client_secret, resource_owner_secret)
+        return valid_signature
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py	(revision 1126)
@@ -0,0 +1,14 @@
+from __future__ import absolute_import, unicode_literals
+
+from . import RequestTokenEndpoint, AuthorizationEndpoint
+from . import AccessTokenEndpoint, ResourceEndpoint
+
+
+class WebApplicationServer(RequestTokenEndpoint, AuthorizationEndpoint,
+                           AccessTokenEndpoint, ResourceEndpoint):
+
+    def __init__(self, request_validator):
+        RequestTokenEndpoint.__init__(self, request_validator)
+        AuthorizationEndpoint.__init__(self, request_validator)
+        AccessTokenEndpoint.__init__(self, request_validator)
+        ResourceEndpoint.__init__(self, request_validator)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/errors.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/errors.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/rfc5849/errors.py	(revision 1126)
@@ -0,0 +1,79 @@
+# coding=utf-8
+"""
+oauthlib.oauth1.rfc5849.errors
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Error used both by OAuth 1 clients and provicers to represent the spec
+defined error responses for all four core grant types.
+"""
+from __future__ import unicode_literals
+
+from oauthlib.common import urlencode, add_params_to_uri
+
+
+class OAuth1Error(Exception):
+    error = None
+    description = ''
+
+    def __init__(self, description=None, uri=None, status_code=400,
+                 request=None):
+        """
+        description:    A human-readable ASCII [USASCII] text providing
+                        additional information, used to assist the client
+                        developer in understanding the error that occurred.
+                        Values for the "error_description" parameter MUST NOT
+                        include characters outside the set
+                        x20-21 / x23-5B / x5D-7E.
+
+        uri:    A URI identifying a human-readable web page with information
+                about the error, used to provide the client developer with
+                additional information about the error.  Values for the
+                "error_uri" parameter MUST conform to the URI- Reference
+                syntax, and thus MUST NOT include characters outside the set
+                x21 / x23-5B / x5D-7E.
+
+        state:  A CSRF protection value received from the client.
+
+        request:  Oauthlib Request object
+        """
+        self.description = description or self.description
+        message = '(%s) %s' % (self.error, self.description)
+        if request:
+            message += ' ' + repr(request)
+        super(OAuth1Error, self).__init__(message)
+
+        self.uri = uri
+        self.status_code = status_code
+
+    def in_uri(self, uri):
+        return add_params_to_uri(uri, self.twotuples)
+
+    @property
+    def twotuples(self):
+        error = [('error', self.error)]
+        if self.description:
+            error.append(('error_description', self.description))
+        if self.uri:
+            error.append(('error_uri', self.uri))
+        return error
+
+    @property
+    def urlencoded(self):
+        return urlencode(self.twotuples)
+
+
+class InsecureTransportError(OAuth1Error):
+    error = 'insecure_transport_protocol'
+    description = 'Only HTTPS connections are permitted.'
+
+
+class InvalidSignatureMethodError(OAuth1Error):
+    error = 'invalid_signature_method'
+
+
+class InvalidRequestError(OAuth1Error):
+    error = 'invalid_request'
+
+
+class InvalidClientError(OAuth1Error):
+    error = 'invalid_client'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth1/__init__.py	(revision 1126)
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth1
+~~~~~~~~~~~~~~
+
+This module is a wrapper for the most recent implementation of OAuth 1.0 Client
+and Server classes.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .rfc5849 import Client
+from .rfc5849 import SIGNATURE_HMAC, SIGNATURE_RSA, SIGNATURE_PLAINTEXT
+from .rfc5849 import SIGNATURE_TYPE_AUTH_HEADER, SIGNATURE_TYPE_QUERY
+from .rfc5849 import SIGNATURE_TYPE_BODY
+from .rfc5849.request_validator import RequestValidator
+from .rfc5849.endpoints import RequestTokenEndpoint, AuthorizationEndpoint
+from .rfc5849.endpoints import AccessTokenEndpoint, ResourceEndpoint
+from .rfc5849.endpoints import SignatureOnlyEndpoint, WebApplicationServer
+from .rfc5849.errors import *
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/utils.py	(revision 1126)
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.utils
+~~~~~~~~~~~~~~
+
+This module contains utility methods used by various parts of the OAuth 2 spec.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import os
+import datetime
+try:
+    from urllib import quote
+except ImportError:
+    from urllib.parse import quote
+try:
+    from urlparse import urlparse
+except ImportError:
+    from urllib.parse import urlparse
+from oauthlib.common import unicode_type, urldecode
+
+
+def list_to_scope(scope):
+    """Convert a list of scopes to a space separated string."""
+    if isinstance(scope, unicode_type) or scope is None:
+        return scope
+    elif isinstance(scope, (set, tuple, list)):
+        return " ".join([unicode_type(s) for s in scope])
+    else:
+        raise ValueError("Invalid scope (%s), must be string, tuple, set, or list." % scope)
+
+
+def scope_to_list(scope):
+    """Convert a space separated string to a list of scopes."""
+    if isinstance(scope, (tuple, list, set)):
+        return [unicode_type(s) for s in scope]
+    elif scope is None:
+        return None
+    else:
+        return scope.strip().split(" ")
+
+
+def params_from_uri(uri):
+    params = dict(urldecode(urlparse(uri).query))
+    if 'scope' in params:
+        params['scope'] = scope_to_list(params['scope'])
+    return params
+
+
+def host_from_uri(uri):
+    """Extract hostname and port from URI.
+
+    Will use default port for HTTP and HTTPS if none is present in the URI.
+    """
+    default_ports = {
+        'HTTP': '80',
+        'HTTPS': '443',
+    }
+
+    sch, netloc, path, par, query, fra = urlparse(uri)
+    if ':' in netloc:
+        netloc, port = netloc.split(':', 1)
+    else:
+        port = default_ports.get(sch.upper())
+
+    return netloc, port
+
+
+def escape(u):
+    """Escape a string in an OAuth-compatible fashion.
+
+    TODO: verify whether this can in fact be used for OAuth 2
+
+    """
+    if not isinstance(u, unicode_type):
+        raise ValueError('Only unicode objects are escapable.')
+    return quote(u.encode('utf-8'), safe=b'~')
+
+
+def generate_age(issue_time):
+    """Generate a age parameter for MAC authentication draft 00."""
+    td = datetime.datetime.now() - issue_time
+    age = (td.microseconds + (td.seconds + td.days * 24 * 3600)
+           * 10 ** 6) / 10 ** 6
+    return unicode_type(age)
+
+
+def is_secure_transport(uri):
+    """Check if the uri is over ssl."""
+    if os.environ.get('OAUTHLIB_INSECURE_TRANSPORT'):
+        return True
+    return uri.lower().startswith('https://')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/parameters.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/parameters.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/parameters.py	(revision 1126)
@@ -0,0 +1,406 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module contains methods related to `Section 4`_ of the OAuth 2 RFC.
+
+.. _`Section 4`: http://tools.ietf.org/html/rfc6749#section-4
+"""
+from __future__ import absolute_import, unicode_literals
+
+import json
+import os
+import time
+try:
+    import urlparse
+except ImportError:
+    import urllib.parse as urlparse
+from oauthlib.common import add_params_to_uri, add_params_to_qs, unicode_type
+from oauthlib.signals import scope_changed
+from .errors import raise_from_error, MissingTokenError, MissingTokenTypeError
+from .errors import MismatchingStateError, MissingCodeError
+from .errors import InsecureTransportError
+from .tokens import OAuth2Token
+from .utils import list_to_scope, scope_to_list, is_secure_transport
+
+
+def prepare_grant_uri(uri, client_id, response_type, redirect_uri=None,
+                      scope=None, state=None, **kwargs):
+    """Prepare the authorization grant request URI.
+
+    The client constructs the request URI by adding the following
+    parameters to the query component of the authorization endpoint URI
+    using the ``application/x-www-form-urlencoded`` format as defined by
+    [`W3C.REC-html401-19991224`_]:
+
+    :param response_type: To indicate which OAuth 2 grant/flow is required,
+                          "code" and "token".
+    :param client_id: The client identifier as described in `Section 2.2`_.
+    :param redirect_uri: The client provided URI to redirect back to after
+                         authorization as described in `Section 3.1.2`_.
+    :param scope: The scope of the access request as described by
+                  `Section 3.3`_.
+
+    :param state: An opaque value used by the client to maintain
+                  state between the request and callback.  The authorization
+                  server includes this value when redirecting the user-agent
+                  back to the client.  The parameter SHOULD be used for
+                  preventing cross-site request forgery as described in
+                  `Section 10.12`_.
+    :param kwargs: Extra arguments to embed in the grant/authorization URL.
+
+    An example of an authorization code grant authorization URL:
+
+    .. code-block:: http
+
+        GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
+            &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
+        Host: server.example.com
+
+    .. _`W3C.REC-html401-19991224`: http://tools.ietf.org/html/rfc6749#ref-W3C.REC-html401-19991224
+    .. _`Section 2.2`: http://tools.ietf.org/html/rfc6749#section-2.2
+    .. _`Section 3.1.2`: http://tools.ietf.org/html/rfc6749#section-3.1.2
+    .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+    .. _`section 10.12`: http://tools.ietf.org/html/rfc6749#section-10.12
+    """
+    if not is_secure_transport(uri):
+        raise InsecureTransportError()
+
+    params = [(('response_type', response_type)),
+              (('client_id', client_id))]
+
+    if redirect_uri:
+        params.append(('redirect_uri', redirect_uri))
+    if scope:
+        params.append(('scope', list_to_scope(scope)))
+    if state:
+        params.append(('state', state))
+
+    for k in kwargs:
+        if kwargs[k]:
+            params.append((unicode_type(k), kwargs[k]))
+
+    return add_params_to_uri(uri, params)
+
+
+def prepare_token_request(grant_type, body='', **kwargs):
+    """Prepare the access token request.
+
+    The client makes a request to the token endpoint by adding the
+    following parameters using the ``application/x-www-form-urlencoded``
+    format in the HTTP request entity-body:
+
+    :param grant_type: To indicate grant type being used, i.e. "password",
+            "authorization_code" or "client_credentials".
+    :param body: Existing request body to embed parameters in.
+    :param code: If using authorization code grant, pass the previously
+                 obtained authorization code as the ``code`` argument.
+    :param redirect_uri: If the "redirect_uri" parameter was included in the
+                         authorization request as described in
+                         `Section 4.1.1`_, and their values MUST be identical.
+    :param kwargs: Extra arguments to embed in the request body.
+
+    An example of an authorization code token request body:
+
+    .. code-block:: http
+
+        grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
+        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
+
+    .. _`Section 4.1.1`: http://tools.ietf.org/html/rfc6749#section-4.1.1
+    """
+    params = [('grant_type', grant_type)]
+
+    if 'scope' in kwargs:
+        kwargs['scope'] = list_to_scope(kwargs['scope'])
+
+    for k in kwargs:
+        if kwargs[k]:
+            params.append((unicode_type(k), kwargs[k]))
+
+    return add_params_to_qs(body, params)
+
+
+def prepare_token_revocation_request(url, token, token_type_hint="access_token",
+        callback=None, body='', **kwargs):
+    """Prepare a token revocation request.
+
+    The client constructs the request by including the following parameters
+    using the "application/x-www-form-urlencoded" format in the HTTP request
+    entity-body:
+
+    token   REQUIRED.  The token that the client wants to get revoked.
+
+    token_type_hint  OPTIONAL.  A hint about the type of the token submitted
+    for revocation.  Clients MAY pass this parameter in order to help the
+    authorization server to optimize the token lookup.  If the server is unable
+    to locate the token using the given hint, it MUST extend its search across
+    all of its supported token types.  An authorization server MAY ignore this
+    parameter, particularly if it is able to detect the token type
+    automatically.  This specification defines two such values:
+
+        * access_token: An access token as defined in [RFC6749],
+             `Section 1.4`_
+
+        * refresh_token: A refresh token as defined in [RFC6749],
+             `Section 1.5`_
+
+        Specific implementations, profiles, and extensions of this
+        specification MAY define other values for this parameter using the
+        registry defined in `Section 4.1.2`_.
+
+    .. _`Section 1.4`: http://tools.ietf.org/html/rfc6749#section-1.4
+    .. _`Section 1.5`: http://tools.ietf.org/html/rfc6749#section-1.5
+    .. _`Section 4.1.2`: http://tools.ietf.org/html/rfc7009#section-4.1.2
+
+    """
+    if not is_secure_transport(url):
+        raise InsecureTransportError()
+
+    params = [('token', token)]
+
+    if token_type_hint:
+        params.append(('token_type_hint', token_type_hint))
+
+    for k in kwargs:
+        if kwargs[k]:
+            params.append((unicode_type(k), kwargs[k]))
+
+    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
+
+    if callback:
+        params.append(('callback', callback))
+        return add_params_to_uri(url, params), headers, body
+    else:
+        return url, headers, add_params_to_qs(body, params)
+
+
+def parse_authorization_code_response(uri, state=None):
+    """Parse authorization grant response URI into a dict.
+
+    If the resource owner grants the access request, the authorization
+    server issues an authorization code and delivers it to the client by
+    adding the following parameters to the query component of the
+    redirection URI using the ``application/x-www-form-urlencoded`` format:
+
+    **code**
+            REQUIRED.  The authorization code generated by the
+            authorization server.  The authorization code MUST expire
+            shortly after it is issued to mitigate the risk of leaks.  A
+            maximum authorization code lifetime of 10 minutes is
+            RECOMMENDED.  The client MUST NOT use the authorization code
+            more than once.  If an authorization code is used more than
+            once, the authorization server MUST deny the request and SHOULD
+            revoke (when possible) all tokens previously issued based on
+            that authorization code.  The authorization code is bound to
+            the client identifier and redirection URI.
+
+    **state**
+            REQUIRED if the "state" parameter was present in the client
+            authorization request.  The exact value received from the
+            client.
+
+    :param uri: The full redirect URL back to the client.
+    :param state: The state parameter from the authorization request.
+
+    For example, the authorization server redirects the user-agent by
+    sending the following HTTP response:
+
+    .. code-block:: http
+
+        HTTP/1.1 302 Found
+        Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
+                &state=xyz
+
+    """
+    if not is_secure_transport(uri):
+        raise InsecureTransportError()
+
+    query = urlparse.urlparse(uri).query
+    params = dict(urlparse.parse_qsl(query))
+
+    if not 'code' in params:
+        raise MissingCodeError("Missing code parameter in response.")
+
+    if state and params.get('state', None) != state:
+        raise MismatchingStateError()
+
+    return params
+
+
+def parse_implicit_response(uri, state=None, scope=None):
+    """Parse the implicit token response URI into a dict.
+
+    If the resource owner grants the access request, the authorization
+    server issues an access token and delivers it to the client by adding
+    the following parameters to the fragment component of the redirection
+    URI using the ``application/x-www-form-urlencoded`` format:
+
+    **access_token**
+            REQUIRED.  The access token issued by the authorization server.
+
+    **token_type**
+            REQUIRED.  The type of the token issued as described in
+            Section 7.1.  Value is case insensitive.
+
+    **expires_in**
+            RECOMMENDED.  The lifetime in seconds of the access token.  For
+            example, the value "3600" denotes that the access token will
+            expire in one hour from the time the response was generated.
+            If omitted, the authorization server SHOULD provide the
+            expiration time via other means or document the default value.
+
+    **scope**
+            OPTIONAL, if identical to the scope requested by the client,
+            otherwise REQUIRED.  The scope of the access token as described
+            by Section 3.3.
+
+    **state**
+            REQUIRED if the "state" parameter was present in the client
+            authorization request.  The exact value received from the
+            client.
+
+    Similar to the authorization code response, but with a full token provided
+    in the URL fragment:
+
+    .. code-block:: http
+
+        HTTP/1.1 302 Found
+        Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
+                &state=xyz&token_type=example&expires_in=3600
+    """
+    if not is_secure_transport(uri):
+        raise InsecureTransportError()
+
+    fragment = urlparse.urlparse(uri).fragment
+    params = dict(urlparse.parse_qsl(fragment, keep_blank_values=True))
+
+    if 'scope' in params:
+        params['scope'] = scope_to_list(params['scope'])
+
+    if 'expires_in' in params:
+        params['expires_at'] = time.time() + int(params['expires_in'])
+
+    if state and params.get('state', None) != state:
+        raise ValueError("Mismatching or missing state in params.")
+
+    params = OAuth2Token(params, old_scope=scope)
+    validate_token_parameters(params)
+    return params
+
+
+def parse_token_response(body, scope=None):
+    """Parse the JSON token response body into a dict.
+
+    The authorization server issues an access token and optional refresh
+    token, and constructs the response by adding the following parameters
+    to the entity body of the HTTP response with a 200 (OK) status code:
+
+    access_token
+            REQUIRED.  The access token issued by the authorization server.
+    token_type
+            REQUIRED.  The type of the token issued as described in
+            `Section 7.1`_.  Value is case insensitive.
+    expires_in
+            RECOMMENDED.  The lifetime in seconds of the access token.  For
+            example, the value "3600" denotes that the access token will
+            expire in one hour from the time the response was generated.
+            If omitted, the authorization server SHOULD provide the
+            expiration time via other means or document the default value.
+    refresh_token
+            OPTIONAL.  The refresh token which can be used to obtain new
+            access tokens using the same authorization grant as described
+            in `Section 6`_.
+    scope
+            OPTIONAL, if identical to the scope requested by the client,
+            otherwise REQUIRED.  The scope of the access token as described
+            by `Section 3.3`_.
+
+    The parameters are included in the entity body of the HTTP response
+    using the "application/json" media type as defined by [`RFC4627`_].  The
+    parameters are serialized into a JSON structure by adding each
+    parameter at the highest structure level.  Parameter names and string
+    values are included as JSON strings.  Numerical values are included
+    as JSON numbers.  The order of parameters does not matter and can
+    vary.
+
+    :param body: The full json encoded response body.
+    :param scope: The scope requested during authorization.
+
+    For example:
+
+    .. code-block:: http
+
+        HTTP/1.1 200 OK
+        Content-Type: application/json
+        Cache-Control: no-store
+        Pragma: no-cache
+
+        {
+            "access_token":"2YotnFZFEjr1zCsicMWpAA",
+            "token_type":"example",
+            "expires_in":3600,
+            "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
+            "example_parameter":"example_value"
+        }
+
+    .. _`Section 7.1`: http://tools.ietf.org/html/rfc6749#section-7.1
+    .. _`Section 6`: http://tools.ietf.org/html/rfc6749#section-6
+    .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+    .. _`RFC4627`: http://tools.ietf.org/html/rfc4627
+    """
+    try:
+        params = json.loads(body)
+    except ValueError:
+
+        # Fall back to URL-encoded string, to support old implementations,
+        # including (at time of writing) Facebook. See:
+        #   https://github.com/idan/oauthlib/issues/267
+
+        params = dict(urlparse.parse_qsl(body))
+        for key in ('expires_in', 'expires'):
+            if key in params:  # cast a couple things to int
+                params[key] = int(params[key])
+
+    if 'scope' in params:
+        params['scope'] = scope_to_list(params['scope'])
+
+    if 'expires' in params:
+        params['expires_in'] = params.pop('expires')
+
+    if 'expires_in' in params:
+        params['expires_at'] = time.time() + int(params['expires_in'])
+
+    params = OAuth2Token(params, old_scope=scope)
+    validate_token_parameters(params)
+    return params
+
+
+def validate_token_parameters(params):
+    """Ensures token precence, token type, expiration and scope in params."""
+    if 'error' in params:
+        raise_from_error(params.get('error'), params)
+
+    if not 'access_token' in params:
+        raise MissingTokenError(description="Missing access token parameter.")
+
+    if not 'token_type' in params:
+        if os.environ.get('OAUTHLIB_STRICT_TOKEN_TYPE'):
+            raise MissingTokenTypeError()
+
+    # If the issued access token scope is different from the one requested by
+    # the client, the authorization server MUST include the "scope" response
+    # parameter to inform the client of the actual scope granted.
+    # http://tools.ietf.org/html/rfc6749#section-3.3
+    if params.scope_changed:
+        message = 'Scope has changed from "{old}" to "{new}".'.format(
+            old=params.old_scope, new=params.scope,
+        )
+        scope_changed.send(message=message, old=params.old_scopes, new=params.scopes)
+        if not os.environ.get('OAUTHLIB_RELAX_TOKEN_SCOPE', None):
+            w = Warning(message)
+            w.token = params
+            w.old_scope = params.old_scopes
+            w.new_scope = params.scopes
+            raise w
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/tokens.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/tokens.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/tokens.py	(revision 1126)
@@ -0,0 +1,294 @@
+"""
+oauthlib.oauth2.rfc6749.tokens
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This module contains methods for adding two types of access tokens to requests.
+
+- Bearer http://tools.ietf.org/html/rfc6750
+- MAC http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01
+"""
+from __future__ import absolute_import, unicode_literals
+
+from binascii import b2a_base64
+import hashlib
+import hmac
+try:
+    from urlparse import urlparse
+except ImportError:
+    from urllib.parse import urlparse
+
+from oauthlib.common import add_params_to_uri, add_params_to_qs, unicode_type
+from oauthlib import common
+
+from . import utils
+
+
+class OAuth2Token(dict):
+
+    def __init__(self, params, old_scope=None):
+        super(OAuth2Token, self).__init__(params)
+        self._new_scope = None
+        if 'scope' in params:
+            self._new_scope = set(utils.scope_to_list(params['scope']))
+        if old_scope is not None:
+            self._old_scope = set(utils.scope_to_list(old_scope))
+            if self._new_scope is None:
+                # the rfc says that if the scope hasn't changed, it's optional
+                # in params so set the new scope to the old scope
+                self._new_scope = self._old_scope
+        else:
+            self._old_scope = self._new_scope
+
+    @property
+    def scope_changed(self):
+        return self._new_scope != self._old_scope
+
+    @property
+    def old_scope(self):
+        return utils.list_to_scope(self._old_scope)
+
+    @property
+    def old_scopes(self):
+        return list(self._old_scope)
+
+    @property
+    def scope(self):
+        return utils.list_to_scope(self._new_scope)
+
+    @property
+    def scopes(self):
+        return list(self._new_scope)
+
+    @property
+    def missing_scopes(self):
+        return list(self._old_scope - self._new_scope)
+
+    @property
+    def additional_scopes(self):
+        return list(self._new_scope - self._old_scope)
+
+
+def prepare_mac_header(token, uri, key, http_method,
+                       nonce=None,
+                       headers=None,
+                       body=None,
+                       ext='',
+                       hash_algorithm='hmac-sha-1',
+                       issue_time=None,
+                       draft=0):
+    """Add an `MAC Access Authentication`_ signature to headers.
+
+    Unlike OAuth 1, this HMAC signature does not require inclusion of the
+    request payload/body, neither does it use a combination of client_secret
+    and token_secret but rather a mac_key provided together with the access
+    token.
+
+    Currently two algorithms are supported, "hmac-sha-1" and "hmac-sha-256",
+    `extension algorithms`_ are not supported.
+
+    Example MAC Authorization header, linebreaks added for clarity
+
+    Authorization: MAC id="h480djs93hd8",
+                       nonce="1336363200:dj83hs9s",
+                       mac="bhCQXTVyfj5cmA9uKkPFx1zeOXM="
+
+    .. _`MAC Access Authentication`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01
+    .. _`extension algorithms`: http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-7.1
+
+    :param uri: Request URI.
+    :param headers: Request headers as a dictionary.
+    :param http_method: HTTP Request method.
+    :param key: MAC given provided by token endpoint.
+    :param hash_algorithm: HMAC algorithm provided by token endpoint.
+    :param issue_time: Time when the MAC credentials were issued (datetime).
+    :param draft: MAC authentication specification version.
+    :return: headers dictionary with the authorization field added.
+    """
+    http_method = http_method.upper()
+    host, port = utils.host_from_uri(uri)
+
+    if hash_algorithm.lower() == 'hmac-sha-1':
+        h = hashlib.sha1
+    elif hash_algorithm.lower() == 'hmac-sha-256':
+        h = hashlib.sha256
+    else:
+        raise ValueError('unknown hash algorithm')
+
+    if draft == 0:
+        nonce = nonce or '{0}:{1}'.format(utils.generate_age(issue_time),
+                                          common.generate_nonce())
+    else:
+        ts = common.generate_timestamp()
+        nonce = common.generate_nonce()
+
+    sch, net, path, par, query, fra = urlparse(uri)
+
+    if query:
+        request_uri = path + '?' + query
+    else:
+        request_uri = path
+
+    # Hash the body/payload
+    if body is not None and draft == 0:
+        body = body.encode('utf-8')
+        bodyhash = b2a_base64(h(body).digest())[:-1].decode('utf-8')
+    else:
+        bodyhash = ''
+
+    # Create the normalized base string
+    base = []
+    if draft == 0:
+        base.append(nonce)
+    else:
+        base.append(ts)
+        base.append(nonce)
+    base.append(http_method.upper())
+    base.append(request_uri)
+    base.append(host)
+    base.append(port)
+    if draft == 0:
+        base.append(bodyhash)
+    base.append(ext or '')
+    base_string = '\n'.join(base) + '\n'
+
+    # hmac struggles with unicode strings - http://bugs.python.org/issue5285
+    if isinstance(key, unicode_type):
+        key = key.encode('utf-8')
+    sign = hmac.new(key, base_string.encode('utf-8'), h)
+    sign = b2a_base64(sign.digest())[:-1].decode('utf-8')
+
+    header = []
+    header.append('MAC id="%s"' % token)
+    if draft != 0:
+        header.append('ts="%s"' % ts)
+    header.append('nonce="%s"' % nonce)
+    if bodyhash:
+        header.append('bodyhash="%s"' % bodyhash)
+    if ext:
+        header.append('ext="%s"' % ext)
+    header.append('mac="%s"' % sign)
+
+    headers = headers or {}
+    headers['Authorization'] = ', '.join(header)
+    return headers
+
+
+def prepare_bearer_uri(token, uri):
+    """Add a `Bearer Token`_ to the request URI.
+    Not recommended, use only if client can't use authorization header or body.
+
+    http://www.example.com/path?access_token=h480djs93hd8
+
+    .. _`Bearer Token`: http://tools.ietf.org/html/rfc6750
+    """
+    return add_params_to_uri(uri, [(('access_token', token))])
+
+
+def prepare_bearer_headers(token, headers=None):
+    """Add a `Bearer Token`_ to the request URI.
+    Recommended method of passing bearer tokens.
+
+    Authorization: Bearer h480djs93hd8
+
+    .. _`Bearer Token`: http://tools.ietf.org/html/rfc6750
+    """
+    headers = headers or {}
+    headers['Authorization'] = 'Bearer %s' % token
+    return headers
+
+
+def prepare_bearer_body(token, body=''):
+    """Add a `Bearer Token`_ to the request body.
+
+    access_token=h480djs93hd8
+
+    .. _`Bearer Token`: http://tools.ietf.org/html/rfc6750
+    """
+    return add_params_to_qs(body, [(('access_token', token))])
+
+
+def random_token_generator(request, refresh_token=False):
+    return common.generate_token()
+
+
+def signed_token_generator(private_pem, **kwargs):
+    def signed_token_generator(request):
+        request.claims = kwargs
+        return common.generate_signed_token(private_pem, request)
+
+    return signed_token_generator
+
+
+class TokenBase(object):
+
+    def __call__(self, request, refresh_token=False):
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_request(self, request):
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def estimate_type(self, request):
+        raise NotImplementedError('Subclasses must implement this method.')
+
+
+class BearerToken(TokenBase):
+
+    def __init__(self, request_validator=None, token_generator=None,
+                 expires_in=None, refresh_token_generator=None):
+        self.request_validator = request_validator
+        self.token_generator = token_generator or random_token_generator
+        self.refresh_token_generator = (
+            refresh_token_generator or self.token_generator
+        )
+        self.expires_in = expires_in or 3600
+
+    def create_token(self, request, refresh_token=False):
+        """Create a BearerToken, by default without refresh token."""
+
+        if callable(self.expires_in):
+            expires_in = self.expires_in(request)
+        else:
+            expires_in = self.expires_in
+
+        request.expires_in = expires_in
+
+        token = {
+            'access_token': self.token_generator(request),
+            'expires_in': expires_in,
+            'token_type': 'Bearer',
+        }
+
+        if request.scopes is not None:
+            token['scope'] = ' '.join(request.scopes)
+
+        if request.state is not None:
+            token['state'] = request.state
+
+        if refresh_token:
+            if (request.refresh_token and
+                    not self.request_validator.rotate_refresh_token(request)):
+                token['refresh_token'] = request.refresh_token
+            else:
+                token['refresh_token'] = self.refresh_token_generator(request)
+
+        token.update(request.extra_credentials or {})
+        token = OAuth2Token(token)
+        self.request_validator.save_bearer_token(token, request)
+        return token
+
+    def validate_request(self, request):
+        token = None
+        if 'Authorization' in request.headers:
+            token = request.headers.get('Authorization')[7:]
+        else:
+            token = request.access_token
+        return self.request_validator.validate_bearer_token(
+            token, request.scopes, request)
+
+    def estimate_type(self, request):
+        if request.headers.get('Authorization', '').startswith('Bearer'):
+            return 9
+        elif request.access_token is not None:
+            return 5
+        else:
+            return 0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py	(revision 1126)
@@ -0,0 +1,401 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+import json
+import logging
+
+from oauthlib import common
+from oauthlib.uri_validate import is_absolute_uri
+
+from .base import GrantTypeBase
+from .. import errors
+from ..request_validator import RequestValidator
+
+log = logging.getLogger(__name__)
+
+
+class AuthorizationCodeGrant(GrantTypeBase):
+
+    """`Authorization Code Grant`_
+
+    The authorization code grant type is used to obtain both access
+    tokens and refresh tokens and is optimized for confidential clients.
+    Since this is a redirection-based flow, the client must be capable of
+    interacting with the resource owner's user-agent (typically a web
+    browser) and capable of receiving incoming requests (via redirection)
+    from the authorization server::
+
+        +----------+
+        | Resource |
+        |   Owner  |
+        |          |
+        +----------+
+             ^
+             |
+            (B)
+        +----|-----+          Client Identifier      +---------------+
+        |         -+----(A)-- & Redirection URI ---->|               |
+        |  User-   |                                 | Authorization |
+        |  Agent  -+----(B)-- User authenticates --->|     Server    |
+        |          |                                 |               |
+        |         -+----(C)-- Authorization Code ---<|               |
+        +-|----|---+                                 +---------------+
+          |    |                                         ^      v
+         (A)  (C)                                        |      |
+          |    |                                         |      |
+          ^    v                                         |      |
+        +---------+                                      |      |
+        |         |>---(D)-- Authorization Code ---------'      |
+        |  Client |          & Redirection URI                  |
+        |         |                                             |
+        |         |<---(E)----- Access Token -------------------'
+        +---------+       (w/ Optional Refresh Token)
+
+    Note: The lines illustrating steps (A), (B), and (C) are broken into
+    two parts as they pass through the user-agent.
+
+    Figure 3: Authorization Code Flow
+
+    The flow illustrated in Figure 3 includes the following steps:
+
+    (A)  The client initiates the flow by directing the resource owner's
+         user-agent to the authorization endpoint.  The client includes
+         its client identifier, requested scope, local state, and a
+         redirection URI to which the authorization server will send the
+         user-agent back once access is granted (or denied).
+
+    (B)  The authorization server authenticates the resource owner (via
+         the user-agent) and establishes whether the resource owner
+         grants or denies the client's access request.
+
+    (C)  Assuming the resource owner grants access, the authorization
+         server redirects the user-agent back to the client using the
+         redirection URI provided earlier (in the request or during
+         client registration).  The redirection URI includes an
+         authorization code and any local state provided by the client
+         earlier.
+
+    (D)  The client requests an access token from the authorization
+         server's token endpoint by including the authorization code
+         received in the previous step.  When making the request, the
+         client authenticates with the authorization server.  The client
+         includes the redirection URI used to obtain the authorization
+         code for verification.
+
+    (E)  The authorization server authenticates the client, validates the
+         authorization code, and ensures that the redirection URI
+         received matches the URI used to redirect the client in
+         step (C).  If valid, the authorization server responds back with
+         an access token and, optionally, a refresh token.
+
+    .. _`Authorization Code Grant`: http://tools.ietf.org/html/rfc6749#section-4.1
+    """
+
+    def __init__(self, request_validator=None):
+        self.request_validator = request_validator or RequestValidator()
+
+    def create_authorization_code(self, request):
+        """Generates an authorization grant represented as a dictionary."""
+        grant = {'code': common.generate_token()}
+        if hasattr(request, 'state') and request.state:
+            grant['state'] = request.state
+        log.debug('Created authorization code grant %r for request %r.',
+                  grant, request)
+        return grant
+
+    def create_authorization_response(self, request, token_handler):
+        """
+        The client constructs the request URI by adding the following
+        parameters to the query component of the authorization endpoint URI
+        using the "application/x-www-form-urlencoded" format, per `Appendix B`_:
+
+        response_type
+                REQUIRED.  Value MUST be set to "code".
+        client_id
+                REQUIRED.  The client identifier as described in `Section 2.2`_.
+        redirect_uri
+                OPTIONAL.  As described in `Section 3.1.2`_.
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                `Section 3.3`_.
+        state
+                RECOMMENDED.  An opaque value used by the client to maintain
+                state between the request and callback.  The authorization
+                server includes this value when redirecting the user-agent back
+                to the client.  The parameter SHOULD be used for preventing
+                cross-site request forgery as described in `Section 10.12`_.
+
+        The client directs the resource owner to the constructed URI using an
+        HTTP redirection response, or by other means available to it via the
+        user-agent.
+
+        :param request: oauthlib.commong.Request
+        :param token_handler: A token handler instace, for example of type
+                              oauthlib.oauth2.BearerToken.
+        :returns: headers, body, status
+        :raises: FatalClientError on invalid redirect URI or client id.
+                 ValueError if scopes are not set on the request object.
+
+        A few examples::
+
+            >>> from your_validator import your_validator
+            >>> request = Request('https://example.com/authorize?client_id=valid'
+            ...                   '&redirect_uri=http%3A%2F%2Fclient.com%2F')
+            >>> from oauthlib.common import Request
+            >>> from oauthlib.oauth2 import AuthorizationCodeGrant, BearerToken
+            >>> token = BearerToken(your_validator)
+            >>> grant = AuthorizationCodeGrant(your_validator)
+            >>> grant.create_authorization_response(request, token)
+            Traceback (most recent call last):
+                File "<stdin>", line 1, in <module>
+                File "oauthlib/oauth2/rfc6749/grant_types.py", line 513, in create_authorization_response
+                    raise ValueError('Scopes must be set on post auth.')
+            ValueError: Scopes must be set on post auth.
+            >>> request.scopes = ['authorized', 'in', 'some', 'form']
+            >>> grant.create_authorization_response(request, token)
+            (u'http://client.com/?error=invalid_request&error_description=Missing+response_type+parameter.', None, None, 400)
+            >>> request = Request('https://example.com/authorize?client_id=valid'
+            ...                   '&redirect_uri=http%3A%2F%2Fclient.com%2F'
+            ...                   '&response_type=code')
+            >>> request.scopes = ['authorized', 'in', 'some', 'form']
+            >>> grant.create_authorization_response(request, token)
+            (u'http://client.com/?code=u3F05aEObJuP2k7DordviIgW5wl52N', None, None, 200)
+            >>> # If the client id or redirect uri fails validation
+            >>> grant.create_authorization_response(request, token)
+            Traceback (most recent call last):
+                File "<stdin>", line 1, in <module>
+                File "oauthlib/oauth2/rfc6749/grant_types.py", line 515, in create_authorization_response
+                    >>> grant.create_authorization_response(request, token)
+                File "oauthlib/oauth2/rfc6749/grant_types.py", line 591, in validate_authorization_request
+            oauthlib.oauth2.rfc6749.errors.InvalidClientIdError
+
+        .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+        .. _`Section 2.2`: http://tools.ietf.org/html/rfc6749#section-2.2
+        .. _`Section 3.1.2`: http://tools.ietf.org/html/rfc6749#section-3.1.2
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 10.12`: http://tools.ietf.org/html/rfc6749#section-10.12
+        """
+        try:
+            # request.scopes is only mandated in post auth and both pre and
+            # post auth use validate_authorization_request
+            if not request.scopes:
+                raise ValueError('Scopes must be set on post auth.')
+
+            self.validate_authorization_request(request)
+            log.debug('Pre resource owner authorization validation ok for %r.',
+                      request)
+
+        # If the request fails due to a missing, invalid, or mismatching
+        # redirection URI, or if the client identifier is missing or invalid,
+        # the authorization server SHOULD inform the resource owner of the
+        # error and MUST NOT automatically redirect the user-agent to the
+        # invalid redirection URI.
+        except errors.FatalClientError as e:
+            log.debug('Fatal client error during validation of %r. %r.',
+                      request, e)
+            raise
+
+        # If the resource owner denies the access request or if the request
+        # fails for reasons other than a missing or invalid redirection URI,
+        # the authorization server informs the client by adding the following
+        # parameters to the query component of the redirection URI using the
+        # "application/x-www-form-urlencoded" format, per Appendix B:
+        # http://tools.ietf.org/html/rfc6749#appendix-B
+        except errors.OAuth2Error as e:
+            log.debug('Client error during validation of %r. %r.', request, e)
+            request.redirect_uri = request.redirect_uri or self.error_uri
+            return {'Location': common.add_params_to_uri(request.redirect_uri, e.twotuples)}, None, 302
+
+        grant = self.create_authorization_code(request)
+        log.debug('Saving grant %r for %r.', grant, request)
+        self.request_validator.save_authorization_code(
+            request.client_id, grant, request)
+        return {'Location': common.add_params_to_uri(request.redirect_uri, grant.items())}, None, 302
+
+    def create_token_response(self, request, token_handler):
+        """Validate the authorization code.
+
+        The client MUST NOT use the authorization code more than once. If an
+        authorization code is used more than once, the authorization server
+        MUST deny the request and SHOULD revoke (when possible) all tokens
+        previously issued based on that authorization code. The authorization
+        code is bound to the client identifier and redirection URI.
+        """
+        headers = {
+            'Content-Type': 'application/json',
+            'Cache-Control': 'no-store',
+            'Pragma': 'no-cache',
+        }
+        try:
+            self.validate_token_request(request)
+            log.debug('Token request validation ok for %r.', request)
+        except errors.OAuth2Error as e:
+            log.debug('Client error during validation of %r. %r.', request, e)
+            return headers, e.json, e.status_code
+
+        token = token_handler.create_token(request, refresh_token=True)
+        self.request_validator.invalidate_authorization_code(
+            request.client_id, request.code, request)
+        return headers, json.dumps(token), 200
+
+    def validate_authorization_request(self, request):
+        """Check the authorization request for normal and fatal errors.
+
+        A normal error could be a missing response_type parameter or the client
+        attempting to access scope it is not allowed to ask authorization for.
+        Normal errors can safely be included in the redirection URI and
+        sent back to the client.
+
+        Fatal errors occur when the client_id or redirect_uri is invalid or
+        missing. These must be caught by the provider and handled, how this
+        is done is outside of the scope of OAuthLib but showing an error
+        page describing the issue is a good idea.
+        """
+
+        # First check for fatal errors
+
+        # If the request fails due to a missing, invalid, or mismatching
+        # redirection URI, or if the client identifier is missing or invalid,
+        # the authorization server SHOULD inform the resource owner of the
+        # error and MUST NOT automatically redirect the user-agent to the
+        # invalid redirection URI.
+
+        # First check duplicate parameters
+        for param in ('client_id', 'response_type', 'redirect_uri', 'scope', 'state'):
+            try:
+                duplicate_params = request.duplicate_params
+            except ValueError:
+                raise errors.InvalidRequestFatalError(description='Unable to parse query string', request=request)
+            if param in duplicate_params:
+                raise errors.InvalidRequestFatalError(description='Duplicate %s parameter.' % param, request=request)
+
+        # REQUIRED. The client identifier as described in Section 2.2.
+        # http://tools.ietf.org/html/rfc6749#section-2.2
+        if not request.client_id:
+            raise errors.MissingClientIdError(request=request)
+
+        if not self.request_validator.validate_client_id(request.client_id, request):
+            raise errors.InvalidClientIdError(request=request)
+
+        # OPTIONAL. As described in Section 3.1.2.
+        # http://tools.ietf.org/html/rfc6749#section-3.1.2
+        log.debug('Validating redirection uri %s for client %s.',
+                  request.redirect_uri, request.client_id)
+        if request.redirect_uri is not None:
+            request.using_default_redirect_uri = False
+            log.debug('Using provided redirect_uri %s', request.redirect_uri)
+            if not is_absolute_uri(request.redirect_uri):
+                raise errors.InvalidRedirectURIError(request=request)
+
+            if not self.request_validator.validate_redirect_uri(
+                    request.client_id, request.redirect_uri, request):
+                raise errors.MismatchingRedirectURIError(request=request)
+        else:
+            request.redirect_uri = self.request_validator.get_default_redirect_uri(
+                request.client_id, request)
+            request.using_default_redirect_uri = True
+            log.debug('Using default redirect_uri %s.', request.redirect_uri)
+            if not request.redirect_uri:
+                raise errors.MissingRedirectURIError(request=request)
+
+        # Then check for normal errors.
+
+        # If the resource owner denies the access request or if the request
+        # fails for reasons other than a missing or invalid redirection URI,
+        # the authorization server informs the client by adding the following
+        # parameters to the query component of the redirection URI using the
+        # "application/x-www-form-urlencoded" format, per Appendix B.
+        # http://tools.ietf.org/html/rfc6749#appendix-B
+
+        # Note that the correct parameters to be added are automatically
+        # populated through the use of specific exceptions.
+
+        # REQUIRED.
+        if request.response_type is None:
+            raise errors.MissingResponseTypeError(request=request)
+        # Value MUST be set to "code".
+        elif request.response_type != 'code':
+            raise errors.UnsupportedResponseTypeError(request=request)
+
+        if not self.request_validator.validate_response_type(request.client_id,
+                                                             request.response_type,
+                                                             request.client, request):
+
+            log.debug('Client %s is not authorized to use response_type %s.',
+                      request.client_id, request.response_type)
+            raise errors.UnauthorizedClientError(request=request)
+
+        # OPTIONAL. The scope of the access request as described by Section 3.3
+        # http://tools.ietf.org/html/rfc6749#section-3.3
+        self.validate_scopes(request)
+
+        return request.scopes, {
+            'client_id': request.client_id,
+            'redirect_uri': request.redirect_uri,
+            'response_type': request.response_type,
+            'state': request.state,
+            'request': request,
+        }
+
+    def validate_token_request(self, request):
+        # REQUIRED. Value MUST be set to "authorization_code".
+        if request.grant_type != 'authorization_code':
+            raise errors.UnsupportedGrantTypeError(request=request)
+
+        if request.code is None:
+            raise errors.InvalidRequestError(
+                description='Missing code parameter.', request=request)
+
+        for param in ('client_id', 'grant_type', 'redirect_uri'):
+            if param in request.duplicate_params:
+                raise errors.InvalidRequestError(description='Duplicate %s parameter.' % param,
+                                                 request=request)
+
+        if self.request_validator.client_authentication_required(request):
+            # If the client type is confidential or the client was issued client
+            # credentials (or assigned other authentication requirements), the
+            # client MUST authenticate with the authorization server as described
+            # in Section 3.2.1.
+            # http://tools.ietf.org/html/rfc6749#section-3.2.1
+            if not self.request_validator.authenticate_client(request):
+                log.debug('Client authentication failed, %r.', request)
+                raise errors.InvalidClientError(request=request)
+        elif not self.request_validator.authenticate_client_id(request.client_id, request):
+            # REQUIRED, if the client is not authenticating with the
+            # authorization server as described in Section 3.2.1.
+            # http://tools.ietf.org/html/rfc6749#section-3.2.1
+            log.debug('Client authentication failed, %r.', request)
+            raise errors.InvalidClientError(request=request)
+
+        if not hasattr(request.client, 'client_id'):
+            raise NotImplementedError('Authenticate client must set the '
+                                      'request.client.client_id attribute '
+                                      'in authenticate_client.')
+
+        # Ensure client is authorized use of this grant type
+        self.validate_grant_type(request)
+
+        # REQUIRED. The authorization code received from the
+        # authorization server.
+        if not self.request_validator.validate_code(request.client_id,
+                                                    request.code, request.client, request):
+            log.debug('Client, %r (%r), is not allowed access to scopes %r.',
+                      request.client_id, request.client, request.scopes)
+            raise errors.InvalidGrantError(request=request)
+
+        for attr in ('user', 'scopes'):
+            if getattr(request, attr, None) is None:
+                log.debug('request.%s was not set on code validation.', attr)
+
+        # REQUIRED, if the "redirect_uri" parameter was included in the
+        # authorization request as described in Section 4.1.1, and their
+        # values MUST be identical.
+        if not self.request_validator.confirm_redirect_uri(request.client_id, request.code,
+                                                           request.redirect_uri, request.client):
+            log.debug('Redirect_uri (%r) invalid for client %r (%r).',
+                      request.redirect_uri, request.client_id, request.client)
+            raise errors.AccessDeniedError(request=request)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/base.py	(revision 1126)
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+import logging
+
+from oauthlib.oauth2.rfc6749 import errors, utils
+
+log = logging.getLogger(__name__)
+
+
+class GrantTypeBase(object):
+    error_uri = None
+    request_validator = None
+
+    def create_authorization_response(self, request, token_handler):
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def create_token_response(self, request, token_handler):
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_grant_type(self, request):
+        client_id = getattr(request, 'client_id', None)
+        if not self.request_validator.validate_grant_type(client_id,
+                                                          request.grant_type, request.client, request):
+            log.debug('Unauthorized from %r (%r) access to grant type %s.',
+                      request.client_id, request.client, request.grant_type)
+            raise errors.UnauthorizedClientError(request=request)
+
+    def validate_scopes(self, request):
+        if not request.scopes:
+            request.scopes = utils.scope_to_list(request.scope) or utils.scope_to_list(
+                self.request_validator.get_default_scopes(request.client_id, request))
+        log.debug('Validating access to scopes %r for client %r (%r).',
+                  request.scopes, request.client_id, request.client)
+        if not self.request_validator.validate_scopes(request.client_id,
+                                                      request.scopes, request.client, request):
+            raise errors.InvalidScopeError(request=request)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/implicit.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/implicit.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/implicit.py	(revision 1126)
@@ -0,0 +1,345 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+import logging
+
+from oauthlib import common
+from oauthlib.uri_validate import is_absolute_uri
+
+from .base import GrantTypeBase
+from .. import errors
+from ..request_validator import RequestValidator
+
+log = logging.getLogger(__name__)
+
+
+class ImplicitGrant(GrantTypeBase):
+
+    """`Implicit Grant`_
+
+    The implicit grant type is used to obtain access tokens (it does not
+    support the issuance of refresh tokens) and is optimized for public
+    clients known to operate a particular redirection URI.  These clients
+    are typically implemented in a browser using a scripting language
+    such as JavaScript.
+
+    Unlike the authorization code grant type, in which the client makes
+    separate requests for authorization and for an access token, the
+    client receives the access token as the result of the authorization
+    request.
+
+    The implicit grant type does not include client authentication, and
+    relies on the presence of the resource owner and the registration of
+    the redirection URI.  Because the access token is encoded into the
+    redirection URI, it may be exposed to the resource owner and other
+    applications residing on the same device::
+
+        +----------+
+        | Resource |
+        |  Owner   |
+        |          |
+        +----------+
+             ^
+             |
+            (B)
+        +----|-----+          Client Identifier     +---------------+
+        |         -+----(A)-- & Redirection URI --->|               |
+        |  User-   |                                | Authorization |
+        |  Agent  -|----(B)-- User authenticates -->|     Server    |
+        |          |                                |               |
+        |          |<---(C)--- Redirection URI ----<|               |
+        |          |          with Access Token     +---------------+
+        |          |            in Fragment
+        |          |                                +---------------+
+        |          |----(D)--- Redirection URI ---->|   Web-Hosted  |
+        |          |          without Fragment      |     Client    |
+        |          |                                |    Resource   |
+        |     (F)  |<---(E)------- Script ---------<|               |
+        |          |                                +---------------+
+        +-|--------+
+          |    |
+         (A)  (G) Access Token
+          |    |
+          ^    v
+        +---------+
+        |         |
+        |  Client |
+        |         |
+        +---------+
+
+   Note: The lines illustrating steps (A) and (B) are broken into two
+   parts as they pass through the user-agent.
+
+   Figure 4: Implicit Grant Flow
+
+   The flow illustrated in Figure 4 includes the following steps:
+
+   (A)  The client initiates the flow by directing the resource owner's
+        user-agent to the authorization endpoint.  The client includes
+        its client identifier, requested scope, local state, and a
+        redirection URI to which the authorization server will send the
+        user-agent back once access is granted (or denied).
+
+   (B)  The authorization server authenticates the resource owner (via
+        the user-agent) and establishes whether the resource owner
+        grants or denies the client's access request.
+
+   (C)  Assuming the resource owner grants access, the authorization
+        server redirects the user-agent back to the client using the
+        redirection URI provided earlier.  The redirection URI includes
+        the access token in the URI fragment.
+
+   (D)  The user-agent follows the redirection instructions by making a
+        request to the web-hosted client resource (which does not
+        include the fragment per [RFC2616]).  The user-agent retains the
+        fragment information locally.
+
+   (E)  The web-hosted client resource returns a web page (typically an
+        HTML document with an embedded script) capable of accessing the
+        full redirection URI including the fragment retained by the
+        user-agent, and extracting the access token (and other
+        parameters) contained in the fragment.
+
+   (F)  The user-agent executes the script provided by the web-hosted
+        client resource locally, which extracts the access token.
+
+   (G)  The user-agent passes the access token to the client.
+
+    See `Section 10.3`_ and `Section 10.16`_ for important security considerations
+    when using the implicit grant.
+
+    .. _`Implicit Grant`: http://tools.ietf.org/html/rfc6749#section-4.2
+    .. _`Section 10.3`: http://tools.ietf.org/html/rfc6749#section-10.3
+    .. _`Section 10.16`: http://tools.ietf.org/html/rfc6749#section-10.16
+    """
+
+    def __init__(self, request_validator=None):
+        self.request_validator = request_validator or RequestValidator()
+
+    def create_authorization_response(self, request, token_handler):
+        """Create an authorization response.
+        The client constructs the request URI by adding the following
+        parameters to the query component of the authorization endpoint URI
+        using the "application/x-www-form-urlencoded" format, per `Appendix B`_:
+
+        response_type
+                REQUIRED.  Value MUST be set to "token".
+
+        client_id
+                REQUIRED.  The client identifier as described in `Section 2.2`_.
+
+        redirect_uri
+                OPTIONAL.  As described in `Section 3.1.2`_.
+
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                `Section 3.3`_.
+
+        state
+                RECOMMENDED.  An opaque value used by the client to maintain
+                state between the request and callback.  The authorization
+                server includes this value when redirecting the user-agent back
+                to the client.  The parameter SHOULD be used for preventing
+                cross-site request forgery as described in `Section 10.12`_.
+
+        The authorization server validates the request to ensure that all
+        required parameters are present and valid.  The authorization server
+        MUST verify that the redirection URI to which it will redirect the
+        access token matches a redirection URI registered by the client as
+        described in `Section 3.1.2`_.
+
+        .. _`Section 2.2`: http://tools.ietf.org/html/rfc6749#section-2.2
+        .. _`Section 3.1.2`: http://tools.ietf.org/html/rfc6749#section-3.1.2
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 10.12`: http://tools.ietf.org/html/rfc6749#section-10.12
+        .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+        """
+        return self.create_token_response(request, token_handler)
+
+    def create_token_response(self, request, token_handler):
+        """Return token or error embedded in the URI fragment.
+
+        If the resource owner grants the access request, the authorization
+        server issues an access token and delivers it to the client by adding
+        the following parameters to the fragment component of the redirection
+        URI using the "application/x-www-form-urlencoded" format, per
+        `Appendix B`_:
+
+        access_token
+                REQUIRED.  The access token issued by the authorization server.
+
+        token_type
+                REQUIRED.  The type of the token issued as described in
+                `Section 7.1`_.  Value is case insensitive.
+
+        expires_in
+                RECOMMENDED.  The lifetime in seconds of the access token.  For
+                example, the value "3600" denotes that the access token will
+                expire in one hour from the time the response was generated.
+                If omitted, the authorization server SHOULD provide the
+                expiration time via other means or document the default value.
+
+        scope
+                OPTIONAL, if identical to the scope requested by the client;
+                otherwise, REQUIRED.  The scope of the access token as
+                described by `Section 3.3`_.
+
+        state
+                REQUIRED if the "state" parameter was present in the client
+                authorization request.  The exact value received from the
+                client.
+
+        The authorization server MUST NOT issue a refresh token.
+
+        .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 7.1`: http://tools.ietf.org/html/rfc6749#section-7.1
+        """
+        try:
+            # request.scopes is only mandated in post auth and both pre and
+            # post auth use validate_authorization_request
+            if not request.scopes:
+                raise ValueError('Scopes must be set on post auth.')
+
+            self.validate_token_request(request)
+
+        # If the request fails due to a missing, invalid, or mismatching
+        # redirection URI, or if the client identifier is missing or invalid,
+        # the authorization server SHOULD inform the resource owner of the
+        # error and MUST NOT automatically redirect the user-agent to the
+        # invalid redirection URI.
+        except errors.FatalClientError as e:
+            log.debug('Fatal client error during validation of %r. %r.',
+                      request, e)
+            raise
+
+        # If the resource owner denies the access request or if the request
+        # fails for reasons other than a missing or invalid redirection URI,
+        # the authorization server informs the client by adding the following
+        # parameters to the fragment component of the redirection URI using the
+        # "application/x-www-form-urlencoded" format, per Appendix B:
+        # http://tools.ietf.org/html/rfc6749#appendix-B
+        except errors.OAuth2Error as e:
+            log.debug('Client error during validation of %r. %r.', request, e)
+            return {'Location': common.add_params_to_uri(request.redirect_uri, e.twotuples,
+                                                         fragment=True)}, None, 302
+
+        token = token_handler.create_token(request, refresh_token=False)
+        return {'Location': common.add_params_to_uri(request.redirect_uri, token.items(),
+                                                     fragment=True)}, None, 302
+
+    def validate_authorization_request(self, request):
+        return self.validate_token_request(request)
+
+    def validate_token_request(self, request):
+        """Check the token request for normal and fatal errors.
+
+        This method is very similar to validate_authorization_request in
+        the AuthorizationCodeGrant but differ in a few subtle areas.
+
+        A normal error could be a missing response_type parameter or the client
+        attempting to access scope it is not allowed to ask authorization for.
+        Normal errors can safely be included in the redirection URI and
+        sent back to the client.
+
+        Fatal errors occur when the client_id or redirect_uri is invalid or
+        missing. These must be caught by the provider and handled, how this
+        is done is outside of the scope of OAuthLib but showing an error
+        page describing the issue is a good idea.
+        """
+
+        # First check for fatal errors
+
+        # If the request fails due to a missing, invalid, or mismatching
+        # redirection URI, or if the client identifier is missing or invalid,
+        # the authorization server SHOULD inform the resource owner of the
+        # error and MUST NOT automatically redirect the user-agent to the
+        # invalid redirection URI.
+
+        # First check duplicate parameters
+        for param in ('client_id', 'response_type', 'redirect_uri', 'scope', 'state'):
+            try:
+                duplicate_params = request.duplicate_params
+            except ValueError:
+                raise errors.InvalidRequestFatalError(description='Unable to parse query string', request=request)
+            if param in duplicate_params:
+                raise errors.InvalidRequestFatalError(description='Duplicate %s parameter.' % param, request=request)
+
+        # REQUIRED. The client identifier as described in Section 2.2.
+        # http://tools.ietf.org/html/rfc6749#section-2.2
+        if not request.client_id:
+            raise errors.MissingClientIdError(request=request)
+
+        if not self.request_validator.validate_client_id(request.client_id, request):
+            raise errors.InvalidClientIdError(request=request)
+
+        # OPTIONAL. As described in Section 3.1.2.
+        # http://tools.ietf.org/html/rfc6749#section-3.1.2
+        if request.redirect_uri is not None:
+            request.using_default_redirect_uri = False
+            log.debug('Using provided redirect_uri %s', request.redirect_uri)
+            if not is_absolute_uri(request.redirect_uri):
+                raise errors.InvalidRedirectURIError(request=request)
+
+            # The authorization server MUST verify that the redirection URI
+            # to which it will redirect the access token matches a
+            # redirection URI registered by the client as described in
+            # Section 3.1.2.
+            # http://tools.ietf.org/html/rfc6749#section-3.1.2
+            if not self.request_validator.validate_redirect_uri(
+                    request.client_id, request.redirect_uri, request):
+                raise errors.MismatchingRedirectURIError(request=request)
+        else:
+            request.redirect_uri = self.request_validator.get_default_redirect_uri(
+                request.client_id, request)
+            request.using_default_redirect_uri = True
+            log.debug('Using default redirect_uri %s.', request.redirect_uri)
+            if not request.redirect_uri:
+                raise errors.MissingRedirectURIError(request=request)
+            if not is_absolute_uri(request.redirect_uri):
+                raise errors.InvalidRedirectURIError(request=request)
+
+        # Then check for normal errors.
+
+        # If the resource owner denies the access request or if the request
+        # fails for reasons other than a missing or invalid redirection URI,
+        # the authorization server informs the client by adding the following
+        # parameters to the fragment component of the redirection URI using the
+        # "application/x-www-form-urlencoded" format, per Appendix B.
+        # http://tools.ietf.org/html/rfc6749#appendix-B
+
+        # Note that the correct parameters to be added are automatically
+        # populated through the use of specific exceptions
+
+        # REQUIRED.
+        if request.response_type is None:
+            raise errors.MissingResponseTypeError(request=request)
+        # Value MUST be set to "token".
+        elif request.response_type != 'token':
+            raise errors.UnsupportedResponseTypeError(request=request)
+
+        log.debug('Validating use of response_type token for client %r (%r).',
+                  request.client_id, request.client)
+        if not self.request_validator.validate_response_type(request.client_id,
+                                                             request.response_type,
+                                                             request.client, request):
+
+            log.debug('Client %s is not authorized to use response_type %s.',
+                      request.client_id, request.response_type)
+            raise errors.UnauthorizedClientError(request=request)
+
+        # OPTIONAL. The scope of the access request as described by Section 3.3
+        # http://tools.ietf.org/html/rfc6749#section-3.3
+        self.validate_scopes(request)
+
+        return request.scopes, {
+            'client_id': request.client_id,
+            'redirect_uri': request.redirect_uri,
+            'response_type': request.response_type,
+            'state': request.state,
+            'request': request,
+        }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py	(revision 1126)
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+import json
+import logging
+
+from .base import GrantTypeBase
+from .. import errors
+from ..request_validator import RequestValidator
+
+log = logging.getLogger(__name__)
+
+
+class ClientCredentialsGrant(GrantTypeBase):
+
+    """`Client Credentials Grant`_
+
+    The client can request an access token using only its client
+    credentials (or other supported means of authentication) when the
+    client is requesting access to the protected resources under its
+    control, or those of another resource owner that have been previously
+    arranged with the authorization server (the method of which is beyond
+    the scope of this specification).
+
+    The client credentials grant type MUST only be used by confidential
+    clients::
+
+        +---------+                                  +---------------+
+        :         :                                  :               :
+        :         :>-- A - Client Authentication --->: Authorization :
+        : Client  :                                  :     Server    :
+        :         :<-- B ---- Access Token ---------<:               :
+        :         :                                  :               :
+        +---------+                                  +---------------+
+
+    Figure 6: Client Credentials Flow
+
+    The flow illustrated in Figure 6 includes the following steps:
+
+    (A)  The client authenticates with the authorization server and
+            requests an access token from the token endpoint.
+
+    (B)  The authorization server authenticates the client, and if valid,
+            issues an access token.
+
+    .. _`Client Credentials Grant`: http://tools.ietf.org/html/rfc6749#section-4.4
+    """
+
+    def __init__(self, request_validator=None):
+        self.request_validator = request_validator or RequestValidator()
+
+    def create_token_response(self, request, token_handler):
+        """Return token or error in JSON format.
+
+        If the access token request is valid and authorized, the
+        authorization server issues an access token as described in
+        `Section 5.1`_.  A refresh token SHOULD NOT be included.  If the request
+        failed client authentication or is invalid, the authorization server
+        returns an error response as described in `Section 5.2`_.
+
+        .. _`Section 5.1`: http://tools.ietf.org/html/rfc6749#section-5.1
+        .. _`Section 5.2`: http://tools.ietf.org/html/rfc6749#section-5.2
+        """
+        headers = {
+            'Content-Type': 'application/json',
+            'Cache-Control': 'no-store',
+            'Pragma': 'no-cache',
+        }
+        try:
+            log.debug('Validating access token request, %r.', request)
+            self.validate_token_request(request)
+        except errors.OAuth2Error as e:
+            log.debug('Client error in token request. %s.', e)
+            return headers, e.json, e.status_code
+
+        token = token_handler.create_token(request, refresh_token=False)
+        log.debug('Issuing token to client id %r (%r), %r.',
+                  request.client_id, request.client, token)
+        return headers, json.dumps(token), 200
+
+    def validate_token_request(self, request):
+        if not getattr(request, 'grant_type', None):
+            raise errors.InvalidRequestError('Request is missing grant type.',
+                                             request=request)
+
+        if not request.grant_type == 'client_credentials':
+            raise errors.UnsupportedGrantTypeError(request=request)
+
+        for param in ('grant_type', 'scope'):
+            if param in request.duplicate_params:
+                raise errors.InvalidRequestError(description='Duplicate %s parameter.' % param,
+                                                 request=request)
+
+        log.debug('Authenticating client, %r.', request)
+        if not self.request_validator.authenticate_client(request):
+            log.debug('Client authentication failed, %r.', request)
+            raise errors.InvalidClientError(request=request)
+        else:
+            if not hasattr(request.client, 'client_id'):
+                raise NotImplementedError('Authenticate client must set the '
+                                          'request.client.client_id attribute '
+                                          'in authenticate_client.')
+        # Ensure client is authorized use of this grant type
+        self.validate_grant_type(request)
+
+        log.debug('Authorizing access to user %r.', request.user)
+        request.client_id = request.client_id or request.client.client_id
+        self.validate_scopes(request)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py	(revision 1126)
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+import json
+import logging
+
+from .base import GrantTypeBase
+from .. import errors, utils
+from ..request_validator import RequestValidator
+
+log = logging.getLogger(__name__)
+
+
+class RefreshTokenGrant(GrantTypeBase):
+
+    """`Refresh token grant`_
+
+    .. _`Refresh token grant`: http://tools.ietf.org/html/rfc6749#section-6
+    """
+
+    @property
+    def issue_new_refresh_tokens(self):
+        return True
+
+    def __init__(self, request_validator=None, issue_new_refresh_tokens=True):
+        self.request_validator = request_validator or RequestValidator()
+
+    def create_token_response(self, request, token_handler):
+        """Create a new access token from a refresh_token.
+
+        If valid and authorized, the authorization server issues an access
+        token as described in `Section 5.1`_. If the request failed
+        verification or is invalid, the authorization server returns an error
+        response as described in `Section 5.2`_.
+
+        The authorization server MAY issue a new refresh token, in which case
+        the client MUST discard the old refresh token and replace it with the
+        new refresh token. The authorization server MAY revoke the old
+        refresh token after issuing a new refresh token to the client. If a
+        new refresh token is issued, the refresh token scope MUST be
+        identical to that of the refresh token included by the client in the
+        request.
+
+        .. _`Section 5.1`: http://tools.ietf.org/html/rfc6749#section-5.1
+        .. _`Section 5.2`: http://tools.ietf.org/html/rfc6749#section-5.2
+        """
+        headers = {
+            'Content-Type': 'application/json',
+            'Cache-Control': 'no-store',
+            'Pragma': 'no-cache',
+        }
+        try:
+            log.debug('Validating refresh token request, %r.', request)
+            self.validate_token_request(request)
+        except errors.OAuth2Error as e:
+            return headers, e.json, e.status_code
+
+        token = token_handler.create_token(request,
+                                           refresh_token=self.issue_new_refresh_tokens)
+        log.debug('Issuing new token to client id %r (%r), %r.',
+                  request.client_id, request.client, token)
+        return headers, json.dumps(token), 200
+
+    def validate_token_request(self, request):
+        # REQUIRED. Value MUST be set to "refresh_token".
+        if request.grant_type != 'refresh_token':
+            raise errors.UnsupportedGrantTypeError(request=request)
+
+        if request.refresh_token is None:
+            raise errors.InvalidRequestError(
+                description='Missing refresh token parameter.',
+                request=request)
+
+        # Because refresh tokens are typically long-lasting credentials used to
+        # request additional access tokens, the refresh token is bound to the
+        # client to which it was issued.  If the client type is confidential or
+        # the client was issued client credentials (or assigned other
+        # authentication requirements), the client MUST authenticate with the
+        # authorization server as described in Section 3.2.1.
+        # http://tools.ietf.org/html/rfc6749#section-3.2.1
+        if self.request_validator.client_authentication_required(request):
+            log.debug('Authenticating client, %r.', request)
+            if not self.request_validator.authenticate_client(request):
+                log.debug('Invalid client (%r), denying access.', request)
+                raise errors.InvalidClientError(request=request)
+        elif not self.request_validator.authenticate_client_id(request.client_id, request):
+            log.debug('Client authentication failed, %r.', request)
+            raise errors.InvalidClientError(request=request)
+
+        # Ensure client is authorized use of this grant type
+        self.validate_grant_type(request)
+
+        # REQUIRED. The refresh token issued to the client.
+        log.debug('Validating refresh token %s for client %r.',
+                  request.refresh_token, request.client)
+        if not self.request_validator.validate_refresh_token(
+                request.refresh_token, request.client, request):
+            log.debug('Invalid refresh token, %s, for client %r.',
+                      request.refresh_token, request.client)
+            raise errors.InvalidGrantError(request=request)
+
+        original_scopes = utils.scope_to_list(
+            self.request_validator.get_original_scopes(
+                request.refresh_token, request))
+
+        if request.scope:
+            request.scopes = utils.scope_to_list(request.scope)
+            if (not all((s in original_scopes for s in request.scopes))
+                and not self.request_validator.is_within_original_scope(
+                    request.scopes, request.refresh_token, request)):
+                log.debug('Refresh token %s lack requested scopes, %r.',
+                          request.refresh_token, request.scopes)
+                raise errors.InvalidScopeError(request=request)
+        else:
+            request.scopes = original_scopes
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/__init__.py	(revision 1126)
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+from .authorization_code import AuthorizationCodeGrant
+from .implicit import ImplicitGrant
+from .resource_owner_password_credentials import ResourceOwnerPasswordCredentialsGrant
+from .client_credentials import ClientCredentialsGrant
+from .refresh_token import RefreshTokenGrant
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py	(revision 1126)
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+import json
+import logging
+
+from .base import GrantTypeBase
+from .. import errors
+from ..request_validator import RequestValidator
+
+log = logging.getLogger(__name__)
+
+
+class ResourceOwnerPasswordCredentialsGrant(GrantTypeBase):
+
+    """`Resource Owner Password Credentials Grant`_
+
+    The resource owner password credentials grant type is suitable in
+    cases where the resource owner has a trust relationship with the
+    client, such as the device operating system or a highly privileged
+    application.  The authorization server should take special care when
+    enabling this grant type and only allow it when other flows are not
+    viable.
+
+    This grant type is suitable for clients capable of obtaining the
+    resource owner's credentials (username and password, typically using
+    an interactive form).  It is also used to migrate existing clients
+    using direct authentication schemes such as HTTP Basic or Digest
+    authentication to OAuth by converting the stored credentials to an
+    access token::
+
+            +----------+
+            | Resource |
+            |  Owner   |
+            |          |
+            +----------+
+                 v
+                 |    Resource Owner
+                (A) Password Credentials
+                 |
+                 v
+            +---------+                                  +---------------+
+            |         |>--(B)---- Resource Owner ------->|               |
+            |         |         Password Credentials     | Authorization |
+            | Client  |                                  |     Server    |
+            |         |<--(C)---- Access Token ---------<|               |
+            |         |    (w/ Optional Refresh Token)   |               |
+            +---------+                                  +---------------+
+
+    Figure 5: Resource Owner Password Credentials Flow
+
+    The flow illustrated in Figure 5 includes the following steps:
+
+    (A)  The resource owner provides the client with its username and
+            password.
+
+    (B)  The client requests an access token from the authorization
+            server's token endpoint by including the credentials received
+            from the resource owner.  When making the request, the client
+            authenticates with the authorization server.
+
+    (C)  The authorization server authenticates the client and validates
+            the resource owner credentials, and if valid, issues an access
+            token.
+
+    .. _`Resource Owner Password Credentials Grant`: http://tools.ietf.org/html/rfc6749#section-4.3
+    """
+
+    def __init__(self, request_validator=None, refresh_token=True):
+        """
+        If the refresh_token keyword argument is False, do not return
+        a refresh token in the response.
+        """
+        self.request_validator = request_validator or RequestValidator()
+        self.refresh_token = refresh_token
+
+    def create_token_response(self, request, token_handler):
+        """Return token or error in json format.
+
+        If the access token request is valid and authorized, the
+        authorization server issues an access token and optional refresh
+        token as described in `Section 5.1`_.  If the request failed client
+        authentication or is invalid, the authorization server returns an
+        error response as described in `Section 5.2`_.
+
+        .. _`Section 5.1`: http://tools.ietf.org/html/rfc6749#section-5.1
+        .. _`Section 5.2`: http://tools.ietf.org/html/rfc6749#section-5.2
+        """
+        headers = {
+            'Content-Type': 'application/json',
+            'Cache-Control': 'no-store',
+            'Pragma': 'no-cache',
+        }
+        try:
+            if self.request_validator.client_authentication_required(request):
+                log.debug('Authenticating client, %r.', request)
+                if not self.request_validator.authenticate_client(request):
+                    log.debug('Client authentication failed, %r.', request)
+                    raise errors.InvalidClientError(request=request)
+            elif not self.request_validator.authenticate_client_id(request.client_id, request):
+                log.debug('Client authentication failed, %r.', request)
+                raise errors.InvalidClientError(request=request)
+            log.debug('Validating access token request, %r.', request)
+            self.validate_token_request(request)
+        except errors.OAuth2Error as e:
+            log.debug('Client error in token request, %s.', e)
+            return headers, e.json, e.status_code
+
+        token = token_handler.create_token(request, self.refresh_token)
+        log.debug('Issuing token %r to client id %r (%r) and username %s.',
+                  token, request.client_id, request.client, request.username)
+        return headers, json.dumps(token), 200
+
+    def validate_token_request(self, request):
+        """
+        The client makes a request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format per Appendix B with a character encoding of UTF-8 in the HTTP
+        request entity-body:
+
+        grant_type
+                REQUIRED.  Value MUST be set to "password".
+
+        username
+                REQUIRED.  The resource owner username.
+
+        password
+                REQUIRED.  The resource owner password.
+
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                `Section 3.3`_.
+
+        If the client type is confidential or the client was issued client
+        credentials (or assigned other authentication requirements), the
+        client MUST authenticate with the authorization server as described
+        in `Section 3.2.1`_.
+
+        The authorization server MUST:
+
+        o  require client authentication for confidential clients or for any
+            client that was issued client credentials (or with other
+            authentication requirements),
+
+        o  authenticate the client if client authentication is included, and
+
+        o  validate the resource owner password credentials using its
+            existing password validation algorithm.
+
+        Since this access token request utilizes the resource owner's
+        password, the authorization server MUST protect the endpoint against
+        brute force attacks (e.g., using rate-limitation or generating
+        alerts).
+
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 3.2.1`: http://tools.ietf.org/html/rfc6749#section-3.2.1
+        """
+        for param in ('grant_type', 'username', 'password'):
+            if not getattr(request, param, None):
+                raise errors.InvalidRequestError(
+                    'Request is missing %s parameter.' % param, request=request)
+
+        for param in ('grant_type', 'username', 'password', 'scope'):
+            if param in request.duplicate_params:
+                raise errors.InvalidRequestError(description='Duplicate %s parameter.' % param, request=request)
+
+        # This error should rarely (if ever) occur if requests are routed to
+        # grant type handlers based on the grant_type parameter.
+        if not request.grant_type == 'password':
+            raise errors.UnsupportedGrantTypeError(request=request)
+
+        log.debug('Validating username %s.', request.username)
+        if not self.request_validator.validate_user(request.username,
+                                                    request.password, request.client, request):
+            raise errors.InvalidGrantError(
+                'Invalid credentials given.', request=request)
+        else:
+            if not hasattr(request.client, 'client_id'):
+                raise NotImplementedError(
+                    'Validate user must set the '
+                    'request.client.client_id attribute '
+                    'in authenticate_client.')
+        log.debug('Authorizing access to user %r.', request.user)
+
+        # Ensure client is authorized use of this grant type
+        self.validate_grant_type(request)
+
+        if request.client:
+            request.client_id = request.client_id or request.client.client_id
+        self.validate_scopes(request)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/__init__.py	(revision 1126)
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .base import *
+from .web_application import WebApplicationClient
+from .mobile_application import MobileApplicationClient
+from .legacy_application import LegacyApplicationClient
+from .backend_application import BackendApplicationClient
+from .service_application import ServiceApplicationClient
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/web_application.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/web_application.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/web_application.py	(revision 1126)
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .base import Client
+from ..parameters import prepare_grant_uri, prepare_token_request
+from ..parameters import parse_authorization_code_response
+from ..parameters import parse_token_response
+
+
+class WebApplicationClient(Client):
+
+    """A client utilizing the authorization code grant workflow.
+
+    A web application is a confidential client running on a web
+    server.  Resource owners access the client via an HTML user
+    interface rendered in a user-agent on the device used by the
+    resource owner.  The client credentials as well as any access
+    token issued to the client are stored on the web server and are
+    not exposed to or accessible by the resource owner.
+
+    The authorization code grant type is used to obtain both access
+    tokens and refresh tokens and is optimized for confidential clients.
+    As a redirection-based flow, the client must be capable of
+    interacting with the resource owner's user-agent (typically a web
+    browser) and capable of receiving incoming requests (via redirection)
+    from the authorization server.
+    """
+
+    def __init__(self, client_id, code=None, **kwargs):
+        super(WebApplicationClient, self).__init__(client_id, **kwargs)
+        self.code = code
+
+    def prepare_request_uri(self, uri, redirect_uri=None, scope=None,
+                            state=None, **kwargs):
+        """Prepare the authorization code request URI
+
+        The client constructs the request URI by adding the following
+        parameters to the query component of the authorization endpoint URI
+        using the "application/x-www-form-urlencoded" format, per `Appendix B`_:
+
+        :param redirect_uri:  OPTIONAL. The redirect URI must be an absolute URI
+                              and it should have been registerd with the OAuth
+                              provider prior to use. As described in `Section 3.1.2`_.
+
+        :param scope:  OPTIONAL. The scope of the access request as described by
+                       Section 3.3`_. These may be any string but are commonly
+                       URIs or various categories such as ``videos`` or ``documents``.
+
+        :param state:   RECOMMENDED.  An opaque value used by the client to maintain
+                        state between the request and callback.  The authorization
+                        server includes this value when redirecting the user-agent back
+                        to the client.  The parameter SHOULD be used for preventing
+                        cross-site request forgery as described in `Section 10.12`_.
+
+        :param kwargs:  Extra arguments to include in the request URI.
+
+        In addition to supplied parameters, OAuthLib will append the ``client_id``
+        that was provided in the constructor as well as the mandatory ``response_type``
+        argument, set to ``code``::
+
+            >>> from oauthlib.oauth2 import WebApplicationClient
+            >>> client = WebApplicationClient('your_id')
+            >>> client.prepare_request_uri('https://example.com')
+            'https://example.com?client_id=your_id&response_type=code'
+            >>> client.prepare_request_uri('https://example.com', redirect_uri='https://a.b/callback')
+            'https://example.com?client_id=your_id&response_type=code&redirect_uri=https%3A%2F%2Fa.b%2Fcallback'
+            >>> client.prepare_request_uri('https://example.com', scope=['profile', 'pictures'])
+            'https://example.com?client_id=your_id&response_type=code&scope=profile+pictures'
+            >>> client.prepare_request_uri('https://example.com', foo='bar')
+            'https://example.com?client_id=your_id&response_type=code&foo=bar'
+
+        .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+        .. _`Section 2.2`: http://tools.ietf.org/html/rfc6749#section-2.2
+        .. _`Section 3.1.2`: http://tools.ietf.org/html/rfc6749#section-3.1.2
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 10.12`: http://tools.ietf.org/html/rfc6749#section-10.12
+        """
+        return prepare_grant_uri(uri, self.client_id, 'code',
+                                 redirect_uri=redirect_uri, scope=scope, state=state, **kwargs)
+
+    def prepare_request_body(self, client_id=None, code=None, body='',
+                             redirect_uri=None, **kwargs):
+        """Prepare the access token request body.
+
+        The client makes a request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format in the HTTP request entity-body:
+
+        :param client_id:   REQUIRED, if the client is not authenticating with the
+                            authorization server as described in `Section 3.2.1`_.
+
+        :param code:    REQUIRED. The authorization code received from the
+                        authorization server.
+
+        :param redirect_uri:    REQUIRED, if the "redirect_uri" parameter was included in the
+                                authorization request as described in `Section 4.1.1`_, and their
+                                values MUST be identical.
+
+        :param kwargs: Extra parameters to include in the token request.
+
+        In addition OAuthLib will add the ``grant_type`` parameter set to
+        ``authorization_code``.
+
+        If the client type is confidential or the client was issued client
+        credentials (or assigned other authentication requirements), the
+        client MUST authenticate with the authorization server as described
+        in `Section 3.2.1`_::
+
+            >>> from oauthlib.oauth2 import WebApplicationClient
+            >>> client = WebApplicationClient('your_id')
+            >>> client.prepare_request_body(code='sh35ksdf09sf')
+            'grant_type=authorization_code&code=sh35ksdf09sf'
+            >>> client.prepare_request_body(code='sh35ksdf09sf', foo='bar')
+            'grant_type=authorization_code&code=sh35ksdf09sf&foo=bar'
+
+        .. _`Section 4.1.1`: http://tools.ietf.org/html/rfc6749#section-4.1.1
+        .. _`Section 3.2.1`: http://tools.ietf.org/html/rfc6749#section-3.2.1
+        """
+        code = code or self.code
+        return prepare_token_request('authorization_code', code=code, body=body,
+                                     client_id=self.client_id, redirect_uri=redirect_uri, **kwargs)
+
+    def parse_request_uri_response(self, uri, state=None):
+        """Parse the URI query for code and state.
+
+        If the resource owner grants the access request, the authorization
+        server issues an authorization code and delivers it to the client by
+        adding the following parameters to the query component of the
+        redirection URI using the "application/x-www-form-urlencoded" format:
+
+        :param uri: The callback URI that resulted from the user being redirected
+                    back from the provider to you, the client.
+        :param state: The state provided in the authorization request.
+
+        **code**
+            The authorization code generated by the authorization server.
+            The authorization code MUST expire shortly after it is issued
+            to mitigate the risk of leaks. A maximum authorization code
+            lifetime of 10 minutes is RECOMMENDED. The client MUST NOT
+            use the authorization code more than once. If an authorization
+            code is used more than once, the authorization server MUST deny
+            the request and SHOULD revoke (when possible) all tokens
+            previously issued based on that authorization code.
+            The authorization code is bound to the client identifier and
+            redirection URI.
+
+        **state**
+                If the "state" parameter was present in the authorization request.
+
+        This method is mainly intended to enforce strict state checking with
+        the added benefit of easily extracting parameters from the URI::
+
+            >>> from oauthlib.oauth2 import WebApplicationClient
+            >>> client = WebApplicationClient('your_id')
+            >>> uri = 'https://example.com/callback?code=sdfkjh345&state=sfetw45'
+            >>> client.parse_request_uri_response(uri, state='sfetw45')
+            {'state': 'sfetw45', 'code': 'sdfkjh345'}
+            >>> client.parse_request_uri_response(uri, state='other')
+            Traceback (most recent call last):
+                File "<stdin>", line 1, in <module>
+                File "oauthlib/oauth2/rfc6749/__init__.py", line 357, in parse_request_uri_response
+                    back from the provider to you, the client.
+                File "oauthlib/oauth2/rfc6749/parameters.py", line 153, in parse_authorization_code_response
+                    raise MismatchingStateError()
+            oauthlib.oauth2.rfc6749.errors.MismatchingStateError
+        """
+        response = parse_authorization_code_response(uri, state=state)
+        self._populate_attributes(response)
+        return response
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/service_application.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/service_application.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/service_application.py	(revision 1126)
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import time
+
+from oauthlib.common import to_unicode
+
+from .base import Client
+from ..parameters import prepare_token_request
+from ..parameters import parse_token_response
+
+
+class ServiceApplicationClient(Client):
+    """A public client utilizing the JWT bearer grant.
+
+    JWT bearer tokes can be used to request an access token when a client
+    wishes to utilize an existing trust relationship, expressed through the
+    semantics of (and digital signature or keyed message digest calculated
+    over) the JWT, without a direct user approval step at the authorization
+    server.
+
+    This grant type does not involve an authorization step. It may be
+    used by both public and confidential clients.
+    """
+
+    grant_type = 'urn:ietf:params:oauth:grant-type:jwt-bearer'
+
+    def __init__(self, client_id, private_key=None, subject=None, issuer=None,
+                 audience=None, **kwargs):
+        """Initalize a JWT client with defaults for implicit use later.
+
+        :param client_id: Client identifier given by the OAuth provider upon
+                          registration.
+
+        :param private_key: Private key used for signing and encrypting.
+                            Must be given as a string.
+
+        :param subject: The principal that is the subject of the JWT, i.e. 
+                        which user is the token requested on behalf of.
+                        For example, ``foo@example.com.
+
+        :param issuer: The JWT MUST contain an "iss" (issuer) claim that
+                       contains a unique identifier for the entity that issued
+                       the JWT. For example, ``your-client@provider.com``. 
+
+        :param audience: A value identifying the authorization server as an
+                         intended audience, e.g.
+                         ``https://provider.com/oauth2/token``.
+
+        :param kwargs: Additional arguments to pass to base client, such as
+                       state and token. See Client.__init__.__doc__ for 
+                       details.
+        """
+        super(ServiceApplicationClient, self).__init__(client_id, **kwargs)
+        self.private_key = private_key
+        self.subject = subject
+        self.issuer = issuer
+        self.audience = audience
+
+    def prepare_request_body(self, 
+                             private_key=None,
+                             subject=None, 
+                             issuer=None, 
+                             audience=None, 
+                             expires_at=None, 
+                             issued_at=None,
+                             extra_claims=None,
+                             body='', 
+                             scope=None, 
+                             **kwargs):
+        """Create and add a JWT assertion to the request body.
+
+        :param private_key: Private key used for signing and encrypting.
+                            Must be given as a string.
+
+        :param subject: (sub) The principal that is the subject of the JWT,
+                        i.e.  which user is the token requested on behalf of.
+                        For example, ``foo@example.com.
+
+        :param issuer: (iss) The JWT MUST contain an "iss" (issuer) claim that
+                       contains a unique identifier for the entity that issued
+                       the JWT. For example, ``your-client@provider.com``. 
+
+        :param audience: (aud) A value identifying the authorization server as an
+                         intended audience, e.g.
+                         ``https://provider.com/oauth2/token``.
+
+        :param expires_at: A unix expiration timestamp for the JWT. Defaults
+                           to an hour from now, i.e. ``time.time() + 3600``.
+
+        :param issued_at: A unix timestamp of when the JWT was created.
+                          Defaults to now, i.e. ``time.time()``.
+
+        :param not_before: A unix timestamp after which the JWT may be used.
+                           Not included unless provided.
+
+        :param jwt_id: A unique JWT token identifier. Not included unless
+                       provided.
+
+        :param extra_claims: A dict of additional claims to include in the JWT.
+
+        :param scope: The scope of the access request.
+
+        :param body: Request body (string) with extra parameters.
+
+        :param kwargs: Extra credentials to include in the token request.
+
+        The "scope" parameter may be used, as defined in the Assertion
+        Framework for OAuth 2.0 Client Authentication and Authorization Grants
+        [I-D.ietf-oauth-assertions] specification, to indicate the requested
+        scope.
+
+        Authentication of the client is optional, as described in 
+        `Section 3.2.1`_ of OAuth 2.0 [RFC6749] and consequently, the
+        "client_id" is only needed when a form of client authentication that
+        relies on the parameter is used.
+
+        The following non-normative example demonstrates an Access Token
+        Request with a JWT as an authorization grant (with extra line breaks
+        for display purposes only):
+
+        .. code-block: http
+
+            POST /token.oauth2 HTTP/1.1
+            Host: as.example.com
+            Content-Type: application/x-www-form-urlencoded
+
+            grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
+            &assertion=eyJhbGciOiJFUzI1NiJ9.
+            eyJpc3Mi[...omitted for brevity...].
+            J9l-ZhwP[...omitted for brevity...]
+
+        .. _`Section 3.2.1`: http://tools.ietf.org/html/rfc6749#section-3.2.1
+        """
+        import jwt
+
+        key = private_key or self.private_key
+        if not key:
+            raise ValueError('An encryption key must be supplied to make JWT'
+                             ' token requests.')
+        claim = {
+            'iss': issuer or self.issuer,
+            'aud': audience or self.issuer,
+            'sub': subject or self.issuer,
+            'exp': int(expires_at or time.time() + 3600),
+            'iat': int(issued_at or time.time()),
+        }
+
+        for attr in ('iss', 'aud', 'sub'):
+            if claim[attr] is None:
+                raise ValueError(
+                        'Claim must include %s but none was given.' % attr)
+
+        if 'not_before' in kwargs:
+            claim['nbf'] = kwargs.pop('not_before')
+
+        if 'jwt_id' in kwargs:
+            claim['jti'] = kwargs.pop('jwt_id')
+
+        claim.update(extra_claims or {})
+
+        assertion = jwt.encode(claim, key, 'RS256')
+        assertion = to_unicode(assertion)
+
+        return prepare_token_request(self.grant_type,
+                                     body=body,
+                                     assertion=assertion,
+                                     scope=scope, 
+                                     **kwargs)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/legacy_application.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/legacy_application.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/legacy_application.py	(revision 1126)
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .base import Client
+from ..parameters import prepare_token_request
+from ..parameters import parse_token_response
+
+
+class LegacyApplicationClient(Client):
+
+    """A public client using the resource owner password and username directly.
+
+    The resource owner password credentials grant type is suitable in
+    cases where the resource owner has a trust relationship with the
+    client, such as the device operating system or a highly privileged
+    application.  The authorization server should take special care when
+    enabling this grant type, and only allow it when other flows are not
+    viable.
+
+    The grant type is suitable for clients capable of obtaining the
+    resource owner's credentials (username and password, typically using
+    an interactive form).  It is also used to migrate existing clients
+    using direct authentication schemes such as HTTP Basic or Digest
+    authentication to OAuth by converting the stored credentials to an
+    access token.
+
+    The method through which the client obtains the resource owner
+    credentials is beyond the scope of this specification.  The client
+    MUST discard the credentials once an access token has been obtained.
+    """
+
+    def __init__(self, client_id, **kwargs):
+        super(LegacyApplicationClient, self).__init__(client_id, **kwargs)
+
+    def prepare_request_body(self, username, password, body='', scope=None, **kwargs):
+        """Add the resource owner password and username to the request body.
+
+        The client makes a request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format per `Appendix B`_ in the HTTP request entity-body:
+
+        :param username:    The resource owner username.
+        :param password:    The resource owner password.
+        :param scope:   The scope of the access request as described by
+                        `Section 3.3`_.
+        :param kwargs:  Extra credentials to include in the token request.
+
+        If the client type is confidential or the client was issued client
+        credentials (or assigned other authentication requirements), the
+        client MUST authenticate with the authorization server as described
+        in `Section 3.2.1`_.
+
+        The prepared body will include all provided credentials as well as
+        the ``grant_type`` parameter set to ``password``::
+
+            >>> from oauthlib.oauth2 import LegacyApplicationClient
+            >>> client = LegacyApplicationClient('your_id')
+            >>> client.prepare_request_body(username='foo', password='bar', scope=['hello', 'world'])
+            'grant_type=password&username=foo&scope=hello+world&password=bar'
+
+        .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 3.2.1`: http://tools.ietf.org/html/rfc6749#section-3.2.1
+        """
+        return prepare_token_request('password', body=body, username=username,
+                                     password=password, scope=scope, **kwargs)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/backend_application.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/backend_application.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/backend_application.py	(revision 1126)
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .base import Client
+from ..parameters import prepare_token_request
+from ..parameters import parse_token_response
+
+
+class BackendApplicationClient(Client):
+
+    """A public client utilizing the client credentials grant workflow.
+
+    The client can request an access token using only its client
+    credentials (or other supported means of authentication) when the
+    client is requesting access to the protected resources under its
+    control, or those of another resource owner which has been previously
+    arranged with the authorization server (the method of which is beyond
+    the scope of this specification).
+
+    The client credentials grant type MUST only be used by confidential
+    clients.
+
+    Since the client authentication is used as the authorization grant,
+    no additional authorization request is needed.
+    """
+
+    def prepare_request_body(self, body='', scope=None, **kwargs):
+        """Add the client credentials to the request body.
+
+        The client makes a request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format per `Appendix B`_ in the HTTP request entity-body:
+
+        :param scope:   The scope of the access request as described by
+                        `Section 3.3`_.
+        :param kwargs:  Extra credentials to include in the token request.
+
+        The client MUST authenticate with the authorization server as
+        described in `Section 3.2.1`_.
+
+        The prepared body will include all provided credentials as well as
+        the ``grant_type`` parameter set to ``client_credentials``::
+
+            >>> from oauthlib.oauth2 import BackendApplicationClient
+            >>> client = BackendApplicationClient('your_id')
+            >>> client.prepare_request_body(scope=['hello', 'world'])
+            'grant_type=client_credentials&scope=hello+world'
+
+        .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 3.2.1`: http://tools.ietf.org/html/rfc6749#section-3.2.1
+        """
+        return prepare_token_request('client_credentials', body=body,
+                                     scope=scope, **kwargs)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/base.py	(revision 1126)
@@ -0,0 +1,490 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import time
+
+from oauthlib.common import generate_token
+from oauthlib.oauth2.rfc6749 import tokens
+from oauthlib.oauth2.rfc6749.parameters import parse_token_response
+from oauthlib.oauth2.rfc6749.parameters import prepare_token_request
+from oauthlib.oauth2.rfc6749.parameters import prepare_token_revocation_request
+from oauthlib.oauth2.rfc6749.errors import TokenExpiredError
+from oauthlib.oauth2.rfc6749.errors import InsecureTransportError
+from oauthlib.oauth2.rfc6749.utils import is_secure_transport
+
+
+AUTH_HEADER = 'auth_header'
+URI_QUERY = 'query'
+BODY = 'body'
+
+FORM_ENC_HEADERS = {
+    'Content-Type': 'application/x-www-form-urlencoded'
+}
+
+class Client(object):
+
+    """Base OAuth2 client responsible for access token management.
+
+    This class also acts as a generic interface providing methods common to all
+    client types such as ``prepare_authorization_request`` and
+    ``prepare_token_revocation_request``. The ``prepare_x_request`` methods are
+    the recommended way of interacting with clients (as opposed to the abstract
+    prepare uri/body/etc methods). They are recommended over the older set
+    because they are easier to use (more consistent) and add a few additional
+    security checks, such as HTTPS and state checking.
+
+    Some of these methods require further implementation only provided by the
+    specific purpose clients such as
+    :py:class:`oauthlib.oauth2.MobileApplicationClient` and thus you should always
+    seek to use the client class matching the OAuth workflow you need. For
+    Python, this is usually :py:class:`oauthlib.oauth2.WebApplicationClient`.
+
+    """
+
+    def __init__(self, client_id,
+                 default_token_placement=AUTH_HEADER,
+                 token_type='Bearer',
+                 access_token=None,
+                 refresh_token=None,
+                 mac_key=None,
+                 mac_algorithm=None,
+                 token=None,
+                 scope=None,
+                 state=None,
+                 redirect_url=None,
+                 state_generator=generate_token,
+                 **kwargs):
+        """Initialize a client with commonly used attributes.
+
+        :param client_id: Client identifier given by the OAuth provider upon
+        registration.
+
+        :param default_token_placement: Tokens can be supplied in the Authorization
+        header (default), the URL query component (``query``) or the request
+        body (``body``).
+
+        :param token_type: OAuth 2 token type. Defaults to Bearer. Change this
+        if you specify the ``access_token`` parameter and know it is of a
+        different token type, such as a MAC, JWT or SAML token. Can
+        also be supplied as ``token_type`` inside the ``token`` dict parameter.
+
+        :param access_token: An access token (string) used to authenticate
+        requests to protected resources. Can also be supplied inside the
+        ``token`` dict parameter.
+
+        :param refresh_token: A refresh token (string) used to refresh expired
+        tokens. Can also be supplide inside the ``token`` dict parameter.
+
+        :param mac_key: Encryption key used with MAC tokens.
+
+        :param mac_algorithm:  Hashing algorithm for MAC tokens.
+
+        :param token: A dict of token attributes such as ``access_token``,
+        ``token_type`` and ``expires_at``.
+
+        :param scope: A list of default scopes to request authorization for.
+
+        :param state: A CSRF protection string used during authorization.
+
+        :param redirect_url: The redirection endpoint on the client side to which
+        the user returns after authorization.
+
+        :param state_generator: A no argument state generation callable. Defaults
+        to :py:meth:`oauthlib.common.generate_token`.
+        """
+
+        self.client_id = client_id
+        self.default_token_placement = default_token_placement
+        self.token_type = token_type
+        self.access_token = access_token
+        self.refresh_token = refresh_token
+        self.mac_key = mac_key
+        self.mac_algorithm = mac_algorithm
+        self.token = token or {}
+        self.scope = scope
+        self.state_generator = state_generator
+        self.state = state
+        self.redirect_url = redirect_url
+        self._expires_at = None
+        self._populate_attributes(self.token)
+
+    @property
+    def token_types(self):
+        """Supported token types and their respective methods
+
+        Additional tokens can be supported by extending this dictionary.
+
+        The Bearer token spec is stable and safe to use.
+
+        The MAC token spec is not yet stable and support for MAC tokens
+        is experimental and currently matching version 00 of the spec.
+        """
+        return {
+            'Bearer': self._add_bearer_token,
+            'MAC': self._add_mac_token
+        }
+
+    def prepare_request_uri(self, *args, **kwargs):
+        """Abstract method used to create request URIs."""
+        raise NotImplementedError("Must be implemented by inheriting classes.")
+
+    def prepare_request_body(self, *args, **kwargs):
+        """Abstract method used to create request bodies."""
+        raise NotImplementedError("Must be implemented by inheriting classes.")
+
+    def parse_request_uri_response(self, *args, **kwargs):
+        """Abstract method used to parse redirection responses."""
+
+    def add_token(self, uri, http_method='GET', body=None, headers=None,
+                  token_placement=None, **kwargs):
+        """Add token to the request uri, body or authorization header.
+
+        The access token type provides the client with the information
+        required to successfully utilize the access token to make a protected
+        resource request (along with type-specific attributes).  The client
+        MUST NOT use an access token if it does not understand the token
+        type.
+
+        For example, the "bearer" token type defined in
+        [`I-D.ietf-oauth-v2-bearer`_] is utilized by simply including the access
+        token string in the request:
+
+        .. code-block:: http
+
+            GET /resource/1 HTTP/1.1
+            Host: example.com
+            Authorization: Bearer mF_9.B5f-4.1JqM
+
+        while the "mac" token type defined in [`I-D.ietf-oauth-v2-http-mac`_] is
+        utilized by issuing a MAC key together with the access token which is
+        used to sign certain components of the HTTP requests:
+
+        .. code-block:: http
+
+            GET /resource/1 HTTP/1.1
+            Host: example.com
+            Authorization: MAC id="h480djs93hd8",
+                                nonce="274312:dj83hs9s",
+                                mac="kDZvddkndxvhGRXZhvuDjEWhGeE="
+
+        .. _`I-D.ietf-oauth-v2-bearer`: http://tools.ietf.org/html/rfc6749#section-12.2
+        .. _`I-D.ietf-oauth-v2-http-mac`: http://tools.ietf.org/html/rfc6749#section-12.2
+        """
+        if not is_secure_transport(uri):
+            raise InsecureTransportError()
+
+        token_placement = token_placement or self.default_token_placement
+
+        case_insensitive_token_types = dict(
+            (k.lower(), v) for k, v in self.token_types.items())
+        if not self.token_type.lower() in case_insensitive_token_types:
+            raise ValueError("Unsupported token type: %s" % self.token_type)
+
+        if not self.access_token:
+            raise ValueError("Missing access token.")
+
+        if self._expires_at and self._expires_at < time.time():
+            raise TokenExpiredError()
+
+        return case_insensitive_token_types[self.token_type.lower()](uri, http_method, body,
+                                                                     headers, token_placement, **kwargs)
+
+    def prepare_authorization_request(self, authorization_url, state=None,
+            redirect_url=None, scope=None, **kwargs):
+        """Prepare the authorization request.
+
+        This is the first step in many OAuth flows in which the user is
+        redirected to a certain authorization URL. This method adds
+        required parameters to the authorization URL.
+
+        :param authorization_url: Provider authorization endpoint URL.
+
+        :param state: CSRF protection string. Will be automatically created if
+        not provided. The generated state is available via the ``state``
+        attribute. Clients should verify that the state is unchanged and
+        present in the authorization response. This verification is done
+        automatically if using the ``authorization_response`` parameter
+        with ``prepare_token_request``.
+
+        :param redirect_url: Redirect URL to which the user will be returned
+        after authorization. Must be provided unless previously setup with
+        the provider. If provided then it must also be provided in the
+        token request.
+
+        :param kwargs: Additional parameters to included in the request.
+
+        :returns: The prepared request tuple with (url, headers, body).
+        """
+        if not is_secure_transport(authorization_url):
+            raise InsecureTransportError()
+
+        self.state = state or self.state_generator()
+        self.redirect_url = redirect_url or self.redirect_url
+        self.scope = scope or self.scope
+        auth_url = self.prepare_request_uri(
+                authorization_url, redirect_uri=self.redirect_url,
+                scope=self.scope, state=self.state, **kwargs)
+        return auth_url, FORM_ENC_HEADERS, ''
+
+    def prepare_token_request(self, token_url, authorization_response=None,
+            redirect_url=None, state=None, body='', **kwargs):
+        """Prepare a token creation request.
+
+        Note that these requests usually require client authentication, either
+        by including client_id or a set of provider specific authentication
+        credentials.
+
+        :param token_url: Provider token creation endpoint URL.
+
+        :param authorization_response: The full redirection URL string, i.e.
+        the location to which the user was redirected after successfull
+        authorization. Used to mine credentials needed to obtain a token
+        in this step, such as authorization code.
+
+        :param redirect_url: The redirect_url supplied with the authorization
+        request (if there was one).
+
+        :param body: Request body (URL encoded string).
+
+        :param kwargs: Additional parameters to included in the request.
+
+        :returns: The prepared request tuple with (url, headers, body).
+        """
+        if not is_secure_transport(token_url):
+            raise InsecureTransportError()
+
+        state = state or self.state
+        if authorization_response:
+            self.parse_request_uri_response(
+                    authorization_response, state=state)
+        self.redirect_url = redirect_url or self.redirect_url
+        body = self.prepare_request_body(body=body,
+                redirect_uri=self.redirect_url, **kwargs)
+
+        return token_url, FORM_ENC_HEADERS, body
+
+    def prepare_refresh_token_request(self, token_url, refresh_token=None,
+            body='', scope=None, **kwargs):
+        """Prepare an access token refresh request.
+
+        Expired access tokens can be replaced by new access tokens without
+        going through the OAuth dance if the client obtained a refresh token.
+        This refresh token and authentication credentials can be used to
+        obtain a new access token, and possibly a new refresh token.
+
+        :param token_url: Provider token refresh endpoint URL.
+
+        :param refresh_token: Refresh token string.
+
+        :param body: Request body (URL encoded string).
+
+        :param scope: List of scopes to request. Must be equal to
+        or a subset of the scopes granted when obtaining the refresh
+        token.
+
+        :param kwargs: Additional parameters to included in the request.
+
+        :returns: The prepared request tuple with (url, headers, body).
+        """
+        if not is_secure_transport(token_url):
+            raise InsecureTransportError()
+
+        self.scope = scope or self.scope
+        body = self.prepare_refresh_body(body=body,
+                refresh_token=refresh_token, scope=self.scope, **kwargs)
+        return token_url, FORM_ENC_HEADERS, body
+
+    def prepare_token_revocation_request(self, revocation_url, token,
+            token_type_hint="access_token", body='', callback=None, **kwargs):
+        """Prepare a token revocation request.
+
+        :param revocation_url: Provider token revocation endpoint URL.
+
+        :param token: The access or refresh token to be revoked (string).
+
+        :param token_type_hint: ``"access_token"`` (default) or
+        ``"refresh_token"``. This is optional and if you wish to not pass it you
+        must provide ``token_type_hint=None``.
+
+        :param callback: A jsonp callback such as ``package.callback`` to be invoked
+        upon receiving the response. Not that it should not include a () suffix.
+
+        :param kwargs: Additional parameters to included in the request.
+
+        :returns: The prepared request tuple with (url, headers, body).
+
+        Note that JSONP request may use GET requests as the parameters will
+        be added to the request URL query as opposed to the request body.
+
+        An example of a revocation request
+
+        .. code-block: http
+
+            POST /revoke HTTP/1.1
+            Host: server.example.com
+            Content-Type: application/x-www-form-urlencoded
+            Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
+
+            token=45ghiukldjahdnhzdauz&token_type_hint=refresh_token
+
+        An example of a jsonp revocation request
+
+        .. code-block: http
+
+            GET /revoke?token=agabcdefddddafdd&callback=package.myCallback HTTP/1.1
+            Host: server.example.com
+            Content-Type: application/x-www-form-urlencoded
+            Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
+
+        and an error response
+
+        .. code-block: http
+
+        package.myCallback({"error":"unsupported_token_type"});
+
+        Note that these requests usually require client credentials, client_id in
+        the case for public clients and provider specific authentication
+        credentials for confidential clients.
+        """
+        if not is_secure_transport(revocation_url):
+            raise InsecureTransportError()
+
+        return prepare_token_revocation_request(revocation_url, token,
+                token_type_hint=token_type_hint, body=body, callback=callback,
+                **kwargs)
+
+    def parse_request_body_response(self, body, scope=None, **kwargs):
+        """Parse the JSON response body.
+
+        If the access token request is valid and authorized, the
+        authorization server issues an access token as described in
+        `Section 5.1`_.  A refresh token SHOULD NOT be included.  If the request
+        failed client authentication or is invalid, the authorization server
+        returns an error response as described in `Section 5.2`_.
+
+        :param body: The response body from the token request.
+        :param scope: Scopes originally requested.
+        :return: Dictionary of token parameters.
+        :raises: Warning if scope has changed. OAuth2Error if response is invalid.
+
+        These response are json encoded and could easily be parsed without
+        the assistance of OAuthLib. However, there are a few subtle issues
+        to be aware of regarding the response which are helpfully addressed
+        through the raising of various errors.
+
+        A successful response should always contain
+
+        **access_token**
+                The access token issued by the authorization server. Often
+                a random string.
+
+        **token_type**
+            The type of the token issued as described in `Section 7.1`_.
+            Commonly ``Bearer``.
+
+        While it is not mandated it is recommended that the provider include
+
+        **expires_in**
+            The lifetime in seconds of the access token.  For
+            example, the value "3600" denotes that the access token will
+            expire in one hour from the time the response was generated.
+            If omitted, the authorization server SHOULD provide the
+            expiration time via other means or document the default value.
+
+        **scope**
+            Providers may supply this in all responses but are required to only
+            if it has changed since the authorization request.
+
+        .. _`Section 5.1`: http://tools.ietf.org/html/rfc6749#section-5.1
+        .. _`Section 5.2`: http://tools.ietf.org/html/rfc6749#section-5.2
+        .. _`Section 7.1`: http://tools.ietf.org/html/rfc6749#section-7.1
+        """
+        self.token = parse_token_response(body, scope=scope)
+        self._populate_attributes(self.token)
+        return self.token
+
+    def prepare_refresh_body(self, body='', refresh_token=None, scope=None, **kwargs):
+        """Prepare an access token request, using a refresh token.
+
+        If the authorization server issued a refresh token to the client, the
+        client makes a refresh request to the token endpoint by adding the
+        following parameters using the "application/x-www-form-urlencoded"
+        format in the HTTP request entity-body:
+
+        grant_type
+                REQUIRED.  Value MUST be set to "refresh_token".
+        refresh_token
+                REQUIRED.  The refresh token issued to the client.
+        scope
+                OPTIONAL.  The scope of the access request as described by
+                Section 3.3.  The requested scope MUST NOT include any scope
+                not originally granted by the resource owner, and if omitted is
+                treated as equal to the scope originally granted by the
+                resource owner.
+        """
+        refresh_token = refresh_token or self.refresh_token
+        return prepare_token_request('refresh_token', body=body, scope=scope,
+                                     refresh_token=refresh_token, **kwargs)
+
+    def _add_bearer_token(self, uri, http_method='GET', body=None,
+                          headers=None, token_placement=None):
+        """Add a bearer token to the request uri, body or authorization header."""
+        if token_placement == AUTH_HEADER:
+            headers = tokens.prepare_bearer_headers(self.access_token, headers)
+
+        elif token_placement == URI_QUERY:
+            uri = tokens.prepare_bearer_uri(self.access_token, uri)
+
+        elif token_placement == BODY:
+            body = tokens.prepare_bearer_body(self.access_token, body)
+
+        else:
+            raise ValueError("Invalid token placement.")
+        return uri, headers, body
+
+    def _add_mac_token(self, uri, http_method='GET', body=None,
+                       headers=None, token_placement=AUTH_HEADER, ext=None, **kwargs):
+        """Add a MAC token to the request authorization header.
+
+        Warning: MAC token support is experimental as the spec is not yet stable.
+        """
+        headers = tokens.prepare_mac_header(self.access_token, uri,
+                                            self.mac_key, http_method, headers=headers, body=body, ext=ext,
+                                            hash_algorithm=self.mac_algorithm, **kwargs)
+        return uri, headers, body
+
+    def _populate_attributes(self, response):
+        """Add commonly used values such as access_token to self."""
+
+        if 'access_token' in response:
+            self.access_token = response.get('access_token')
+
+        if 'refresh_token' in response:
+            self.refresh_token = response.get('refresh_token')
+
+        if 'token_type' in response:
+            self.token_type = response.get('token_type')
+
+        if 'expires_in' in response:
+            self.expires_in = response.get('expires_in')
+            self._expires_at = time.time() + int(self.expires_in)
+
+        if 'expires_at' in response:
+            self._expires_at = int(response.get('expires_at'))
+
+        if 'code' in response:
+            self.code = response.get('code')
+
+        if 'mac_key' in response:
+            self.mac_key = response.get('mac_key')
+
+        if 'mac_algorithm' in response:
+            self.mac_algorithm = response.get('mac_algorithm')
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/mobile_application.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/mobile_application.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/clients/mobile_application.py	(revision 1126)
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .base import Client
+from ..parameters import prepare_grant_uri
+from ..parameters import parse_implicit_response
+
+
+class MobileApplicationClient(Client):
+
+    """A public client utilizing the implicit code grant workflow.
+
+    A user-agent-based application is a public client in which the
+    client code is downloaded from a web server and executes within a
+    user-agent (e.g. web browser) on the device used by the resource
+    owner.  Protocol data and credentials are easily accessible (and
+    often visible) to the resource owner.  Since such applications
+    reside within the user-agent, they can make seamless use of the
+    user-agent capabilities when requesting authorization.
+
+    The implicit grant type is used to obtain access tokens (it does not
+    support the issuance of refresh tokens) and is optimized for public
+    clients known to operate a particular redirection URI.  These clients
+    are typically implemented in a browser using a scripting language
+    such as JavaScript.
+
+    As a redirection-based flow, the client must be capable of
+    interacting with the resource owner's user-agent (typically a web
+    browser) and capable of receiving incoming requests (via redirection)
+    from the authorization server.
+
+    Unlike the authorization code grant type in which the client makes
+    separate requests for authorization and access token, the client
+    receives the access token as the result of the authorization request.
+
+    The implicit grant type does not include client authentication, and
+    relies on the presence of the resource owner and the registration of
+    the redirection URI.  Because the access token is encoded into the
+    redirection URI, it may be exposed to the resource owner and other
+    applications residing on the same device.
+    """
+
+    def prepare_request_uri(self, uri, redirect_uri=None, scope=None,
+                            state=None, **kwargs):
+        """Prepare the implicit grant request URI.
+
+        The client constructs the request URI by adding the following
+        parameters to the query component of the authorization endpoint URI
+        using the "application/x-www-form-urlencoded" format, per `Appendix B`_:
+
+        :param redirect_uri:  OPTIONAL. The redirect URI must be an absolute URI
+                              and it should have been registerd with the OAuth
+                              provider prior to use. As described in `Section 3.1.2`_.
+
+        :param scope:  OPTIONAL. The scope of the access request as described by
+                       Section 3.3`_. These may be any string but are commonly
+                       URIs or various categories such as ``videos`` or ``documents``.
+
+        :param state:   RECOMMENDED.  An opaque value used by the client to maintain
+                        state between the request and callback.  The authorization
+                        server includes this value when redirecting the user-agent back
+                        to the client.  The parameter SHOULD be used for preventing
+                        cross-site request forgery as described in `Section 10.12`_.
+
+        :param kwargs:  Extra arguments to include in the request URI.
+
+        In addition to supplied parameters, OAuthLib will append the ``client_id``
+        that was provided in the constructor as well as the mandatory ``response_type``
+        argument, set to ``token``::
+
+            >>> from oauthlib.oauth2 import MobileApplicationClient
+            >>> client = MobileApplicationClient('your_id')
+            >>> client.prepare_request_uri('https://example.com')
+            'https://example.com?client_id=your_id&response_type=token'
+            >>> client.prepare_request_uri('https://example.com', redirect_uri='https://a.b/callback')
+            'https://example.com?client_id=your_id&response_type=token&redirect_uri=https%3A%2F%2Fa.b%2Fcallback'
+            >>> client.prepare_request_uri('https://example.com', scope=['profile', 'pictures'])
+            'https://example.com?client_id=your_id&response_type=token&scope=profile+pictures'
+            >>> client.prepare_request_uri('https://example.com', foo='bar')
+            'https://example.com?client_id=your_id&response_type=token&foo=bar'
+
+        .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+        .. _`Section 2.2`: http://tools.ietf.org/html/rfc6749#section-2.2
+        .. _`Section 3.1.2`: http://tools.ietf.org/html/rfc6749#section-3.1.2
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        .. _`Section 10.12`: http://tools.ietf.org/html/rfc6749#section-10.12
+        """
+        return prepare_grant_uri(uri, self.client_id, 'token',
+                                 redirect_uri=redirect_uri, state=state, scope=scope, **kwargs)
+
+    def parse_request_uri_response(self, uri, state=None, scope=None):
+        """Parse the response URI fragment.
+
+        If the resource owner grants the access request, the authorization
+        server issues an access token and delivers it to the client by adding
+        the following parameters to the fragment component of the redirection
+        URI using the "application/x-www-form-urlencoded" format:
+
+        :param uri: The callback URI that resulted from the user being redirected
+                    back from the provider to you, the client.
+        :param state: The state provided in the authorization request.
+        :param scope: The scopes provided in the authorization request.
+        :return: Dictionary of token parameters.
+        :raises: OAuth2Error if response is invalid.
+
+        A successful response should always contain
+
+        **access_token**
+                The access token issued by the authorization server. Often
+                a random string.
+
+        **token_type**
+            The type of the token issued as described in `Section 7.1`_.
+            Commonly ``Bearer``.
+
+        **state**
+            If you provided the state parameter in the authorization phase, then
+            the provider is required to include that exact state value in the
+            response.
+
+        While it is not mandated it is recommended that the provider include
+
+        **expires_in**
+            The lifetime in seconds of the access token.  For
+            example, the value "3600" denotes that the access token will
+            expire in one hour from the time the response was generated.
+            If omitted, the authorization server SHOULD provide the
+            expiration time via other means or document the default value.
+
+        **scope**
+            Providers may supply this in all responses but are required to only
+            if it has changed since the authorization request.
+
+        A few example responses can be seen below::
+
+            >>> response_uri = 'https://example.com/callback#access_token=sdlfkj452&state=ss345asyht&token_type=Bearer&scope=hello+world'
+            >>> from oauthlib.oauth2 import MobileApplicationClient
+            >>> client = MobileApplicationClient('your_id')
+            >>> client.parse_request_uri_response(response_uri)
+            {
+                'access_token': 'sdlfkj452',
+                'token_type': 'Bearer',
+                'state': 'ss345asyht',
+                'scope': [u'hello', u'world']
+            }
+            >>> client.parse_request_uri_response(response_uri, state='other')
+            Traceback (most recent call last):
+                File "<stdin>", line 1, in <module>
+                File "oauthlib/oauth2/rfc6749/__init__.py", line 598, in parse_request_uri_response
+                    **scope**
+                File "oauthlib/oauth2/rfc6749/parameters.py", line 197, in parse_implicit_response
+                    raise ValueError("Mismatching or missing state in params.")
+            ValueError: Mismatching or missing state in params.
+            >>> def alert_scope_changed(message, old, new):
+            ...     print(message, old, new)
+            ...
+            >>> oauthlib.signals.scope_changed.connect(alert_scope_changed)
+            >>> client.parse_request_body_response(response_body, scope=['other'])
+            ('Scope has changed from "other" to "hello world".', ['other'], ['hello', 'world'])
+
+        .. _`Section 7.1`: http://tools.ietf.org/html/rfc6749#section-7.1
+        .. _`Section 3.3`: http://tools.ietf.org/html/rfc6749#section-3.3
+        """
+        self.token = parse_implicit_response(uri, state=state, scope=scope)
+        self._populate_attributes(self.token)
+        return self.token
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/__init__.py	(revision 1126)
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .authorization import AuthorizationEndpoint
+from .token import TokenEndpoint
+from .resource import ResourceEndpoint
+from .revocation import RevocationEndpoint
+from .pre_configured import Server
+from .pre_configured import WebApplicationServer
+from .pre_configured import MobileApplicationServer
+from .pre_configured import LegacyApplicationServer
+from .pre_configured import BackendApplicationServer
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/authorization.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/authorization.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/authorization.py	(revision 1126)
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from oauthlib.common import Request
+
+from .base import BaseEndpoint, catch_errors_and_unavailability
+
+log = logging.getLogger(__name__)
+
+
+class AuthorizationEndpoint(BaseEndpoint):
+
+    """Authorization endpoint - used by the client to obtain authorization
+    from the resource owner via user-agent redirection.
+
+    The authorization endpoint is used to interact with the resource
+    owner and obtain an authorization grant.  The authorization server
+    MUST first verify the identity of the resource owner.  The way in
+    which the authorization server authenticates the resource owner (e.g.
+    username and password login, session cookies) is beyond the scope of
+    this specification.
+
+    The endpoint URI MAY include an "application/x-www-form-urlencoded"
+    formatted (per `Appendix B`_) query component,
+    which MUST be retained when adding additional query parameters.  The
+    endpoint URI MUST NOT include a fragment component::
+
+        https://example.com/path?query=component             # OK
+        https://example.com/path?query=component#fragment    # Not OK
+
+    Since requests to the authorization endpoint result in user
+    authentication and the transmission of clear-text credentials (in the
+    HTTP response), the authorization server MUST require the use of TLS
+    as described in Section 1.6 when sending requests to the
+    authorization endpoint::
+
+        # We will deny any request which URI schema is not with https
+
+    The authorization server MUST support the use of the HTTP "GET"
+    method [RFC2616] for the authorization endpoint, and MAY support the
+    use of the "POST" method as well::
+
+        # HTTP method is currently not enforced
+
+    Parameters sent without a value MUST be treated as if they were
+    omitted from the request.  The authorization server MUST ignore
+    unrecognized request parameters.  Request and response parameters
+    MUST NOT be included more than once::
+
+        # Enforced through the design of oauthlib.common.Request
+
+    .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+    """
+
+    def __init__(self, default_response_type, default_token_type,
+                 response_types):
+        BaseEndpoint.__init__(self)
+        self._response_types = response_types
+        self._default_response_type = default_response_type
+        self._default_token_type = default_token_type
+
+    @property
+    def response_types(self):
+        return self._response_types
+
+    @property
+    def default_response_type(self):
+        return self._default_response_type
+
+    @property
+    def default_response_type_handler(self):
+        return self.response_types.get(self.default_response_type)
+
+    @property
+    def default_token_type(self):
+        return self._default_token_type
+
+    @catch_errors_and_unavailability
+    def create_authorization_response(self, uri, http_method='GET', body=None,
+                                      headers=None, scopes=None, credentials=None):
+        """Extract response_type and route to the designated handler."""
+        request = Request(
+            uri, http_method=http_method, body=body, headers=headers)
+        request.scopes = scopes
+        # TODO: decide whether this should be a required argument
+        request.user = None     # TODO: explain this in docs
+        for k, v in (credentials or {}).items():
+            setattr(request, k, v)
+        response_type_handler = self.response_types.get(
+            request.response_type, self.default_response_type_handler)
+        log.debug('Dispatching response_type %s request to %r.',
+                  request.response_type, response_type_handler)
+        return response_type_handler.create_authorization_response(
+            request, self.default_token_type)
+
+    @catch_errors_and_unavailability
+    def validate_authorization_request(self, uri, http_method='GET', body=None,
+                                       headers=None):
+        """Extract response_type and route to the designated handler."""
+        request = Request(
+            uri, http_method=http_method, body=body, headers=headers)
+        request.scopes = None
+        response_type_handler = self.response_types.get(
+            request.response_type, self.default_response_type_handler)
+        return response_type_handler.validate_authorization_request(request)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/token.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/token.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/token.py	(revision 1126)
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from oauthlib.common import Request
+
+from .base import BaseEndpoint, catch_errors_and_unavailability
+
+
+log = logging.getLogger(__name__)
+
+
+class TokenEndpoint(BaseEndpoint):
+
+    """Token issuing endpoint.
+
+    The token endpoint is used by the client to obtain an access token by
+    presenting its authorization grant or refresh token.  The token
+    endpoint is used with every authorization grant except for the
+    implicit grant type (since an access token is issued directly).
+
+    The means through which the client obtains the location of the token
+    endpoint are beyond the scope of this specification, but the location
+    is typically provided in the service documentation.
+
+    The endpoint URI MAY include an "application/x-www-form-urlencoded"
+    formatted (per `Appendix B`_) query component,
+    which MUST be retained when adding additional query parameters.  The
+    endpoint URI MUST NOT include a fragment component::
+
+        https://example.com/path?query=component             # OK
+        https://example.com/path?query=component#fragment    # Not OK
+
+    Since requests to the authorization endpoint result in user
+    Since requests to the token endpoint result in the transmission of
+    clear-text credentials (in the HTTP request and response), the
+    authorization server MUST require the use of TLS as described in
+    Section 1.6 when sending requests to the token endpoint::
+
+        # We will deny any request which URI schema is not with https
+
+    The client MUST use the HTTP "POST" method when making access token
+    requests::
+
+        # HTTP method is currently not enforced
+
+    Parameters sent without a value MUST be treated as if they were
+    omitted from the request.  The authorization server MUST ignore
+    unrecognized request parameters.  Request and response parameters
+    MUST NOT be included more than once::
+
+        # Delegated to each grant type.
+
+    .. _`Appendix B`: http://tools.ietf.org/html/rfc6749#appendix-B
+    """
+
+    def __init__(self, default_grant_type, default_token_type, grant_types):
+        BaseEndpoint.__init__(self)
+        self._grant_types = grant_types
+        self._default_token_type = default_token_type
+        self._default_grant_type = default_grant_type
+
+    @property
+    def grant_types(self):
+        return self._grant_types
+
+    @property
+    def default_grant_type(self):
+        return self._default_grant_type
+
+    @property
+    def default_grant_type_handler(self):
+        return self.grant_types.get(self.default_grant_type)
+
+    @property
+    def default_token_type(self):
+        return self._default_token_type
+
+    @catch_errors_and_unavailability
+    def create_token_response(self, uri, http_method='GET', body=None,
+                              headers=None, credentials=None):
+        """Extract grant_type and route to the designated handler."""
+        request = Request(
+            uri, http_method=http_method, body=body, headers=headers)
+        request.scopes = None
+        request.extra_credentials = credentials
+        grant_type_handler = self.grant_types.get(request.grant_type,
+                                                  self.default_grant_type_handler)
+        log.debug('Dispatching grant_type %s request to %r.',
+                  request.grant_type, grant_type_handler)
+        return grant_type_handler.create_token_response(
+            request, self.default_token_type)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/resource.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/resource.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/resource.py	(revision 1126)
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from oauthlib.common import Request
+
+from .base import BaseEndpoint, catch_errors_and_unavailability
+
+log = logging.getLogger(__name__)
+
+
+class ResourceEndpoint(BaseEndpoint):
+
+    """Authorizes access to protected resources.
+
+    The client accesses protected resources by presenting the access
+    token to the resource server.  The resource server MUST validate the
+    access token and ensure that it has not expired and that its scope
+    covers the requested resource.  The methods used by the resource
+    server to validate the access token (as well as any error responses)
+    are beyond the scope of this specification but generally involve an
+    interaction or coordination between the resource server and the
+    authorization server::
+
+        # For most cases, returning a 403 should suffice.
+
+    The method in which the client utilizes the access token to
+    authenticate with the resource server depends on the type of access
+    token issued by the authorization server.  Typically, it involves
+    using the HTTP "Authorization" request header field [RFC2617] with an
+    authentication scheme defined by the specification of the access
+    token type used, such as [RFC6750]::
+
+        # Access tokens may also be provided in query and body
+        https://example.com/protected?access_token=kjfch2345sdf   # Query
+        access_token=sdf23409df   # Body
+    """
+
+    def __init__(self, default_token, token_types):
+        BaseEndpoint.__init__(self)
+        self._tokens = token_types
+        self._default_token = default_token
+
+    @property
+    def default_token(self):
+        return self._default_token
+
+    @property
+    def default_token_type_handler(self):
+        return self.tokens.get(self.default_token)
+
+    @property
+    def tokens(self):
+        return self._tokens
+
+    @catch_errors_and_unavailability
+    def verify_request(self, uri, http_method='GET', body=None, headers=None,
+                       scopes=None):
+        """Validate client, code etc, return body + headers"""
+        request = Request(uri, http_method, body, headers)
+        request.token_type = self.find_token_type(request)
+        request.scopes = scopes
+        token_type_handler = self.tokens.get(request.token_type,
+                                             self.default_token_type_handler)
+        log.debug('Dispatching token_type %s request to %r.',
+                  request.token_type, token_type_handler)
+        return token_type_handler.validate_request(request), request
+
+    def find_token_type(self, request):
+        """Token type identification.
+
+        RFC 6749 does not provide a method for easily differentiating between
+        different token types during protected resource access. We estimate
+        the most likely token type (if any) by asking each known token type
+        to give an estimation based on the request.
+        """
+        estimates = sorted(((t.estimate_type(request), n)
+                            for n, t in self.tokens.items()))
+        return estimates[0][1] if len(estimates) else None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/revocation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/revocation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/revocation.py	(revision 1126)
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.endpoint.revocation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+An implementation of the OAuth 2 `Token Revocation`_ spec (draft 11).
+
+.. _`Token Revocation`: http://tools.ietf.org/html/draft-ietf-oauth-revocation-11
+"""
+from __future__ import absolute_import, unicode_literals
+
+import logging
+
+from oauthlib.common import Request
+
+from .base import BaseEndpoint, catch_errors_and_unavailability
+from ..errors import InvalidClientError, UnsupportedTokenTypeError
+from ..errors import InvalidRequestError, OAuth2Error
+
+log = logging.getLogger(__name__)
+
+
+class RevocationEndpoint(BaseEndpoint):
+
+    """Token revocation endpoint.
+
+    Endpoint used by authenticated clients to revoke access and refresh tokens.
+    Commonly this will be part of the Authorization Endpoint.
+    """
+
+    valid_token_types = ('access_token', 'refresh_token')
+
+    def __init__(self, request_validator, supported_token_types=None,
+            enable_jsonp=False):
+        BaseEndpoint.__init__(self)
+        self.request_validator = request_validator
+        self.supported_token_types = (
+            supported_token_types or self.valid_token_types)
+        self.enable_jsonp = enable_jsonp
+
+    @catch_errors_and_unavailability
+    def create_revocation_response(self, uri, http_method='POST', body=None,
+                                   headers=None):
+        """Revoke supplied access or refresh token.
+
+
+        The authorization server responds with HTTP status code 200 if the
+        token has been revoked sucessfully or if the client submitted an
+        invalid token.
+
+        Note: invalid tokens do not cause an error response since the client
+        cannot handle such an error in a reasonable way.  Moreover, the purpose
+        of the revocation request, invalidating the particular token, is
+        already achieved.
+
+        The content of the response body is ignored by the client as all
+        necessary information is conveyed in the response code.
+
+        An invalid token type hint value is ignored by the authorization server
+        and does not influence the revocation response.
+        """
+        request = Request(
+            uri, http_method=http_method, body=body, headers=headers)
+        try:
+            self.validate_revocation_request(request)
+            log.debug('Token revocation valid for %r.', request)
+        except OAuth2Error as e:
+            log.debug('Client error during validation of %r. %r.', request, e)
+            response_body = e.json
+            if self.enable_jsonp and request.callback:
+                response_body = '%s(%s);' % (request.callback, response_body)
+            return {}, response_body, e.status_code
+
+        self.request_validator.revoke_token(request.token,
+                                            request.token_type_hint, request)
+
+        response_body = ''
+        if self.enable_jsonp and request.callback:
+            response_body = request.callback + '();'
+        return {}, response_body, 200
+
+    def validate_revocation_request(self, request):
+        """Ensure the request is valid.
+
+        The client constructs the request by including the following parameters
+        using the "application/x-www-form-urlencoded" format in the HTTP
+        request entity-body:
+
+        token (REQUIRED).  The token that the client wants to get revoked.
+
+        token_type_hint (OPTIONAL).  A hint about the type of the token
+        submitted for revocation.  Clients MAY pass this parameter in order to
+        help the authorization server to optimize the token lookup.  If the
+        server is unable to locate the token using the given hint, it MUST
+        extend its search accross all of its supported token types.  An
+        authorization server MAY ignore this parameter, particularly if it is
+        able to detect the token type automatically.  This specification
+        defines two such values:
+
+                *  access_token: An Access Token as defined in [RFC6749],
+                    `section 1.4`_
+
+                *  refresh_token: A Refresh Token as defined in [RFC6749],
+                    `section 1.5`_
+
+                Specific implementations, profiles, and extensions of this
+                specification MAY define other values for this parameter using
+                the registry defined in `Section 4.1.2`_.
+
+        The client also includes its authentication credentials as described in
+        `Section 2.3`_. of [`RFC6749`_].
+
+        .. _`section 1.4`: http://tools.ietf.org/html/rfc6749#section-1.4
+        .. _`section 1.5`: http://tools.ietf.org/html/rfc6749#section-1.5
+        .. _`section 2.3`: http://tools.ietf.org/html/rfc6749#section-2.3
+        .. _`Section 4.1.2`: http://tools.ietf.org/html/draft-ietf-oauth-revocation-11#section-4.1.2
+        .. _`RFC6749`: http://tools.ietf.org/html/rfc6749
+        """
+        if not request.token:
+            raise InvalidRequestError(request=request,
+                                      description='Missing token parameter.')
+
+        if self.request_validator.client_authentication_required(request):
+            if not self.request_validator.authenticate_client(request):
+                raise InvalidClientError(request=request)
+
+        if (request.token_type_hint and
+                request.token_type_hint in self.valid_token_types and
+                request.token_type_hint not in self.supported_token_types):
+            raise UnsupportedTokenTypeError(request=request)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/base.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/base.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/base.py	(revision 1126)
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import functools
+import logging
+
+from ..errors import TemporarilyUnavailableError, ServerError
+from ..errors import FatalClientError, OAuth2Error
+
+log = logging.getLogger(__name__)
+
+
+class BaseEndpoint(object):
+
+    def __init__(self):
+        self._available = True
+        self._catch_errors = False
+
+    @property
+    def available(self):
+        return self._available
+
+    @available.setter
+    def available(self, available):
+        self._available = available
+
+    @property
+    def catch_errors(self):
+        return self._catch_errors
+
+    @catch_errors.setter
+    def catch_errors(self, catch_errors):
+        self._catch_errors = catch_errors
+
+
+def catch_errors_and_unavailability(f):
+    @functools.wraps(f)
+    def wrapper(endpoint, uri, *args, **kwargs):
+        if not endpoint.available:
+            e = TemporarilyUnavailableError()
+            log.info('Endpoint unavailable, ignoring request %s.' % uri)
+            return {}, e.json, 503
+
+        if endpoint.catch_errors:
+            try:
+                return f(endpoint, uri, *args, **kwargs)
+            except OAuth2Error:
+                raise
+            except FatalClientError:
+                raise
+            except Exception as e:
+                error = ServerError()
+                log.warning(
+                    'Exception caught while processing request, %s.' % e)
+                return {}, error.json, 500
+        else:
+            return f(endpoint, uri, *args, **kwargs)
+    return wrapper
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py	(revision 1126)
@@ -0,0 +1,209 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from ..tokens import BearerToken
+from ..grant_types import AuthorizationCodeGrant
+from ..grant_types import ImplicitGrant
+from ..grant_types import ResourceOwnerPasswordCredentialsGrant
+from ..grant_types import ClientCredentialsGrant
+from ..grant_types import RefreshTokenGrant
+
+from .authorization import AuthorizationEndpoint
+from .token import TokenEndpoint
+from .resource import ResourceEndpoint
+from .revocation import RevocationEndpoint
+
+
+class Server(AuthorizationEndpoint, TokenEndpoint, ResourceEndpoint,
+             RevocationEndpoint):
+
+    """An all-in-one endpoint featuring all four major grant types."""
+
+    def __init__(self, request_validator, token_expires_in=None,
+                 token_generator=None, refresh_token_generator=None,
+                 *args, **kwargs):
+        """Construct a new all-grants-in-one server.
+
+        :param request_validator: An implementation of
+                                  oauthlib.oauth2.RequestValidator.
+        :param token_expires_in: An int or a function to generate a token
+                                 expiration offset (in seconds) given a
+                                 oauthlib.common.Request object.
+        :param token_generator: A function to generate a token from a request.
+        :param refresh_token_generator: A function to generate a token from a
+                                        request for the refresh token.
+        :param kwargs: Extra parameters to pass to authorization-,
+                       token-, resource-, and revocation-endpoint constructors.
+        """
+        auth_grant = AuthorizationCodeGrant(request_validator)
+        implicit_grant = ImplicitGrant(request_validator)
+        password_grant = ResourceOwnerPasswordCredentialsGrant(
+            request_validator)
+        credentials_grant = ClientCredentialsGrant(request_validator)
+        refresh_grant = RefreshTokenGrant(request_validator)
+        bearer = BearerToken(request_validator, token_generator,
+                             token_expires_in, refresh_token_generator)
+        AuthorizationEndpoint.__init__(self, default_response_type='code',
+                                       response_types={
+                                           'code': auth_grant,
+                                           'token': implicit_grant,
+                                       },
+                                       default_token_type=bearer)
+        TokenEndpoint.__init__(self, default_grant_type='authorization_code',
+                               grant_types={
+                                   'authorization_code': auth_grant,
+                                   'password': password_grant,
+                                   'client_credentials': credentials_grant,
+                                   'refresh_token': refresh_grant,
+                               },
+                               default_token_type=bearer)
+        ResourceEndpoint.__init__(self, default_token='Bearer',
+                                  token_types={'Bearer': bearer})
+        RevocationEndpoint.__init__(self, request_validator)
+
+
+class WebApplicationServer(AuthorizationEndpoint, TokenEndpoint, ResourceEndpoint,
+                           RevocationEndpoint):
+
+    """An all-in-one endpoint featuring Authorization code grant and Bearer tokens."""
+
+    def __init__(self, request_validator, token_generator=None,
+                 token_expires_in=None, refresh_token_generator=None, **kwargs):
+        """Construct a new web application server.
+
+        :param request_validator: An implementation of
+                                  oauthlib.oauth2.RequestValidator.
+        :param token_expires_in: An int or a function to generate a token
+                                 expiration offset (in seconds) given a
+                                 oauthlib.common.Request object.
+        :param token_generator: A function to generate a token from a request.
+        :param refresh_token_generator: A function to generate a token from a
+                                        request for the refresh token.
+        :param kwargs: Extra parameters to pass to authorization-,
+                       token-, resource-, and revocation-endpoint constructors.
+        """
+        auth_grant = AuthorizationCodeGrant(request_validator)
+        refresh_grant = RefreshTokenGrant(request_validator)
+        bearer = BearerToken(request_validator, token_generator,
+                             token_expires_in, refresh_token_generator)
+        AuthorizationEndpoint.__init__(self, default_response_type='code',
+                                       response_types={'code': auth_grant},
+                                       default_token_type=bearer)
+        TokenEndpoint.__init__(self, default_grant_type='authorization_code',
+                               grant_types={
+                                   'authorization_code': auth_grant,
+                                   'refresh_token': refresh_grant,
+                               },
+                               default_token_type=bearer)
+        ResourceEndpoint.__init__(self, default_token='Bearer',
+                                  token_types={'Bearer': bearer})
+        RevocationEndpoint.__init__(self, request_validator)
+
+
+class MobileApplicationServer(AuthorizationEndpoint, ResourceEndpoint,
+                              RevocationEndpoint):
+
+    """An all-in-one endpoint featuring Implicit code grant and Bearer tokens."""
+
+    def __init__(self, request_validator, token_generator=None,
+                 token_expires_in=None, refresh_token_generator=None, **kwargs):
+        """Construct a new implicit grant server.
+
+        :param request_validator: An implementation of
+                                  oauthlib.oauth2.RequestValidator.
+        :param token_expires_in: An int or a function to generate a token
+                                 expiration offset (in seconds) given a
+                                 oauthlib.common.Request object.
+        :param token_generator: A function to generate a token from a request.
+        :param refresh_token_generator: A function to generate a token from a
+                                        request for the refresh token.
+        :param kwargs: Extra parameters to pass to authorization-,
+                       token-, resource-, and revocation-endpoint constructors.
+        """
+        implicit_grant = ImplicitGrant(request_validator)
+        bearer = BearerToken(request_validator, token_generator,
+                             token_expires_in, refresh_token_generator)
+        AuthorizationEndpoint.__init__(self, default_response_type='token',
+                                       response_types={
+                                           'token': implicit_grant},
+                                       default_token_type=bearer)
+        ResourceEndpoint.__init__(self, default_token='Bearer',
+                                  token_types={'Bearer': bearer})
+        RevocationEndpoint.__init__(self, request_validator,
+                                    supported_token_types=['access_token'])
+
+
+class LegacyApplicationServer(TokenEndpoint, ResourceEndpoint,
+                              RevocationEndpoint):
+
+    """An all-in-one endpoint featuring Resource Owner Password Credentials grant and Bearer tokens."""
+
+    def __init__(self, request_validator, token_generator=None,
+                 token_expires_in=None, refresh_token_generator=None, **kwargs):
+        """Construct a resource owner password credentials grant server.
+
+        :param request_validator: An implementation of
+                                  oauthlib.oauth2.RequestValidator.
+        :param token_expires_in: An int or a function to generate a token
+                                 expiration offset (in seconds) given a
+                                 oauthlib.common.Request object.
+        :param token_generator: A function to generate a token from a request.
+        :param refresh_token_generator: A function to generate a token from a
+                                        request for the refresh token.
+        :param kwargs: Extra parameters to pass to authorization-,
+                       token-, resource-, and revocation-endpoint constructors.
+        """
+        password_grant = ResourceOwnerPasswordCredentialsGrant(
+            request_validator)
+        refresh_grant = RefreshTokenGrant(request_validator)
+        bearer = BearerToken(request_validator, token_generator,
+                             token_expires_in, refresh_token_generator)
+        TokenEndpoint.__init__(self, default_grant_type='password',
+                               grant_types={
+                                   'password': password_grant,
+                                   'refresh_token': refresh_grant,
+                               },
+                               default_token_type=bearer)
+        ResourceEndpoint.__init__(self, default_token='Bearer',
+                                  token_types={'Bearer': bearer})
+        RevocationEndpoint.__init__(self, request_validator)
+
+
+class BackendApplicationServer(TokenEndpoint, ResourceEndpoint,
+                               RevocationEndpoint):
+
+    """An all-in-one endpoint featuring Client Credentials grant and Bearer tokens."""
+
+    def __init__(self, request_validator, token_generator=None,
+                 token_expires_in=None, refresh_token_generator=None, **kwargs):
+        """Construct a client credentials grant server.
+
+        :param request_validator: An implementation of
+                                  oauthlib.oauth2.RequestValidator.
+        :param token_expires_in: An int or a function to generate a token
+                                 expiration offset (in seconds) given a
+                                 oauthlib.common.Request object.
+        :param token_generator: A function to generate a token from a request.
+        :param refresh_token_generator: A function to generate a token from a
+                                        request for the refresh token.
+        :param kwargs: Extra parameters to pass to authorization-,
+                       token-, resource-, and revocation-endpoint constructors.
+        """
+        credentials_grant = ClientCredentialsGrant(request_validator)
+        bearer = BearerToken(request_validator, token_generator,
+                             token_expires_in, refresh_token_generator)
+        TokenEndpoint.__init__(self, default_grant_type='client_credentials',
+                               grant_types={
+                                   'client_credentials': credentials_grant},
+                               default_token_type=bearer)
+        ResourceEndpoint.__init__(self, default_token='Bearer',
+                                  token_types={'Bearer': bearer})
+        RevocationEndpoint.__init__(self, request_validator,
+                                    supported_token_types=['access_token'])
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/errors.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/errors.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/errors.py	(revision 1126)
@@ -0,0 +1,271 @@
+# coding=utf-8
+"""
+oauthlib.oauth2.rfc6749.errors
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Error used both by OAuth 2 clients and providers to represent the spec
+defined error responses for all four core grant types.
+"""
+from __future__ import unicode_literals
+import json
+from oauthlib.common import urlencode, add_params_to_uri
+
+
+class OAuth2Error(Exception):
+    error = None
+    status_code = 400
+    description = ''
+
+    def __init__(self, description=None, uri=None, state=None, status_code=None,
+                 request=None):
+        """
+        description:    A human-readable ASCII [USASCII] text providing
+                        additional information, used to assist the client
+                        developer in understanding the error that occurred.
+                        Values for the "error_description" parameter MUST NOT
+                        include characters outside the set
+                        x20-21 / x23-5B / x5D-7E.
+
+        uri:    A URI identifying a human-readable web page with information
+                about the error, used to provide the client developer with
+                additional information about the error.  Values for the
+                "error_uri" parameter MUST conform to the URI- Reference
+                syntax, and thus MUST NOT include characters outside the set
+                x21 / x23-5B / x5D-7E.
+
+        state:  A CSRF protection value received from the client.
+
+        request:  Oauthlib Request object
+        """
+        self.description = description or self.description
+        message = '(%s) %s' % (self.error, self.description)
+        if request:
+            message += ' ' + repr(request)
+        super(OAuth2Error, self).__init__(message)
+
+        self.uri = uri
+        self.state = state
+
+        if status_code:
+            self.status_code = status_code
+
+        if request:
+            self.redirect_uri = request.redirect_uri
+            self.client_id = request.client_id
+            self.scopes = request.scopes
+            self.response_type = request.response_type
+            self.grant_type = request.grant_type
+            if not state:
+                self.state = request.state
+
+    def in_uri(self, uri):
+        return add_params_to_uri(uri, self.twotuples)
+
+    @property
+    def twotuples(self):
+        error = [('error', self.error)]
+        if self.description:
+            error.append(('error_description', self.description))
+        if self.uri:
+            error.append(('error_uri', self.uri))
+        if self.state:
+            error.append(('state', self.state))
+        return error
+
+    @property
+    def urlencoded(self):
+        return urlencode(self.twotuples)
+
+    @property
+    def json(self):
+        return json.dumps(dict(self.twotuples))
+
+
+class TokenExpiredError(OAuth2Error):
+    error = 'token_expired'
+
+
+class InsecureTransportError(OAuth2Error):
+    error = 'insecure_transport'
+    description = 'OAuth 2 MUST utilize https.'
+
+
+class MismatchingStateError(OAuth2Error):
+    error = 'mismatching_state'
+    description = 'CSRF Warning! State not equal in request and response.'
+
+
+class MissingCodeError(OAuth2Error):
+    error = 'missing_code'
+
+
+class MissingTokenError(OAuth2Error):
+    error = 'missing_token'
+
+
+class MissingTokenTypeError(OAuth2Error):
+    error = 'missing_token_type'
+
+
+class FatalClientError(OAuth2Error):
+
+    """Errors during authorization where user should not be redirected back.
+
+    If the request fails due to a missing, invalid, or mismatching
+    redirection URI, or if the client identifier is missing or invalid,
+    the authorization server SHOULD inform the resource owner of the
+    error and MUST NOT automatically redirect the user-agent to the
+    invalid redirection URI.
+
+    Instead the user should be informed of the error by the provider itself.
+    """
+    pass
+
+
+class InvalidRequestFatalError(FatalClientError):
+    """For fatal errors, the request is missing a required parameter, includes
+    an invalid parameter value, includes a parameter more than once, or is
+    otherwise malformed.
+    """
+    error = 'invalid_request'
+
+
+class InvalidRedirectURIError(InvalidRequestFatalError):
+    description = 'Invalid redirect URI.'
+
+
+class MissingRedirectURIError(InvalidRequestFatalError):
+    description = 'Missing redirect URI.'
+
+
+class MismatchingRedirectURIError(InvalidRequestFatalError):
+    description = 'Mismatching redirect URI.'
+
+
+class InvalidClientIdError(InvalidRequestFatalError):
+    description = 'Invalid client_id parameter value.'
+
+
+class MissingClientIdError(InvalidRequestFatalError):
+    description = 'Missing client_id parameter.'
+
+
+class InvalidRequestError(OAuth2Error):
+
+    """The request is missing a required parameter, includes an invalid
+    parameter value, includes a parameter more than once, or is
+    otherwise malformed.
+    """
+    error = 'invalid_request'
+
+
+class MissingResponseTypeError(InvalidRequestError):
+    description = 'Missing response_type parameter.'
+
+
+class AccessDeniedError(OAuth2Error):
+
+    """The resource owner or authorization server denied the request."""
+    error = 'access_denied'
+    status_code = 401
+
+
+class UnsupportedResponseTypeError(OAuth2Error):
+
+    """The authorization server does not support obtaining an authorization
+    code using this method.
+    """
+    error = 'unsupported_response_type'
+
+
+class InvalidScopeError(OAuth2Error):
+
+    """The requested scope is invalid, unknown, or malformed."""
+    error = 'invalid_scope'
+    status_code = 401
+
+
+class ServerError(OAuth2Error):
+
+    """The authorization server encountered an unexpected condition that
+    prevented it from fulfilling the request.  (This error code is needed
+    because a 500 Internal Server Error HTTP status code cannot be returned
+    to the client via a HTTP redirect.)
+    """
+    error = 'server_error'
+
+
+class TemporarilyUnavailableError(OAuth2Error):
+
+    """The authorization server is currently unable to handle the request
+    due to a temporary overloading or maintenance of the server.
+    (This error code is needed because a 503 Service Unavailable HTTP
+    status code cannot be returned to the client via a HTTP redirect.)
+    """
+    error = 'temporarily_unavailable'
+
+
+class InvalidClientError(OAuth2Error):
+
+    """Client authentication failed (e.g. unknown client, no client
+    authentication included, or unsupported authentication method).
+    The authorization server MAY return an HTTP 401 (Unauthorized) status
+    code to indicate which HTTP authentication schemes are supported.
+    If the client attempted to authenticate via the "Authorization" request
+    header field, the authorization server MUST respond with an
+    HTTP 401 (Unauthorized) status code, and include the "WWW-Authenticate"
+    response header field matching the authentication scheme used by the
+    client.
+    """
+    error = 'invalid_client'
+    status_code = 401
+
+
+class InvalidGrantError(OAuth2Error):
+
+    """The provided authorization grant (e.g. authorization code, resource
+    owner credentials) or refresh token is invalid, expired, revoked, does
+    not match the redirection URI used in the authorization request, or was
+    issued to another client.
+    """
+    error = 'invalid_grant'
+    status_code = 401
+
+
+class UnauthorizedClientError(OAuth2Error):
+
+    """The authenticated client is not authorized to use this authorization
+    grant type.
+    """
+    error = 'unauthorized_client'
+    status_code = 401
+
+
+class UnsupportedGrantTypeError(OAuth2Error):
+
+    """The authorization grant type is not supported by the authorization
+    server.
+    """
+    error = 'unsupported_grant_type'
+
+
+class UnsupportedTokenTypeError(OAuth2Error):
+
+    """The authorization server does not support the revocation of the
+    presented token type.  I.e. the client tried to revoke an access token
+    on a server not supporting this feature.
+    """
+    error = 'unsupported_token_type'
+
+
+def raise_from_error(error, params=None):
+    import inspect
+    import sys
+    kwargs = {
+        'description': params.get('error_description'),
+        'uri': params.get('error_uri'),
+        'state': params.get('state')
+    }
+    for _, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass):
+        if cls.error == error:
+            raise cls(**kwargs)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/request_validator.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/request_validator.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/request_validator.py	(revision 1126)
@@ -0,0 +1,465 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749.grant_types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"""
+from __future__ import unicode_literals, absolute_import
+
+import logging
+
+log = logging.getLogger(__name__)
+
+
+class RequestValidator(object):
+
+    def client_authentication_required(self, request, *args, **kwargs):
+        """Determine if client authentication is required for current request.
+
+        According to the rfc6749, client authentication is required in the following cases:
+            - Resource Owner Password Credentials Grant, when Client type is Confidential or when
+              Client was issued client credentials or whenever Client provided client
+              authentication, see `Section 4.3.2`_.
+            - Authorization Code Grant, when Client type is Confidential or when Client was issued
+              client credentials or whenever Client provided client authentication,
+              see `Section 4.1.3`_.
+            - Refresh Token Grant, when Client type is Confidential or when Client was issued
+              client credentials or whenever Client provided client authentication, see
+              `Section 6`_
+
+        :param request: oauthlib.common.Request
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+            - Resource Owner Password Credentials Grant
+            - Refresh Token Grant
+
+        .. _`Section 4.3.2`: http://tools.ietf.org/html/rfc6749#section-4.3.2
+        .. _`Section 4.1.3`: http://tools.ietf.org/html/rfc6749#section-4.1.3
+        .. _`Section 6`: http://tools.ietf.org/html/rfc6749#section-6
+        """
+        return True
+
+    def authenticate_client(self, request, *args, **kwargs):
+        """Authenticate client through means outside the OAuth 2 spec.
+
+        Means of authentication is negotiated beforehand and may for example
+        be `HTTP Basic Authentication Scheme`_ which utilizes the Authorization
+        header.
+
+        Headers may be accesses through request.headers and parameters found in
+        both body and query can be obtained by direct attribute access, i.e.
+        request.client_id for client_id in the URL query.
+
+        :param request: oauthlib.common.Request
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+            - Resource Owner Password Credentials Grant (may be disabled)
+            - Client Credentials Grant
+            - Refresh Token Grant
+
+        .. _`HTTP Basic Authentication Scheme`: http://tools.ietf.org/html/rfc1945#section-11.1
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def authenticate_client_id(self, client_id, request, *args, **kwargs):
+        """Ensure client_id belong to a non-confidential client.
+
+        A non-confidential client is one that is not required to authenticate
+        through other means, such as using HTTP Basic.
+
+        Note, while not strictly necessary it can often be very convenient
+        to set request.client to the client object associated with the
+        given client_id.
+
+        :param request: oauthlib.common.Request
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def confirm_redirect_uri(self, client_id, code, redirect_uri, client,
+                             *args, **kwargs):
+        """Ensure that the authorization process represented by this authorization
+        code began with this 'redirect_uri'.
+
+        If the client specifies a redirect_uri when obtaining code then that
+        redirect URI must be bound to the code and verified equal in this
+        method, according to RFC 6749 section 4.1.3.  Do not compare against
+        the client's allowed redirect URIs, but against the URI used when the
+        code was saved.
+
+        :param client_id: Unicode client identifier
+        :param code: Unicode authorization_code.
+        :param redirect_uri: Unicode absolute URI
+        :param client: Client object set by you, see authenticate_client.
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant (during token request)
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def get_default_redirect_uri(self, client_id, request, *args, **kwargs):
+        """Get the default redirect URI for the client.
+
+        :param client_id: Unicode client identifier
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: The default redirect URI for the client
+
+        Method is used by:
+            - Authorization Code Grant
+            - Implicit Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def get_default_scopes(self, client_id, request, *args, **kwargs):
+        """Get the default scopes for the client.
+
+        :param client_id: Unicode client identifier
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: List of default scopes
+
+        Method is used by all core grant types:
+            - Authorization Code Grant
+            - Implicit Grant
+            - Resource Owner Password Credentials Grant
+            - Client Credentials grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def get_original_scopes(self, refresh_token, request, *args, **kwargs):
+        """Get the list of scopes associated with the refresh token.
+
+        :param refresh_token: Unicode refresh token
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: List of scopes.
+
+        Method is used by:
+            - Refresh token grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def is_within_original_scope(self, request_scopes, refresh_token, request, *args, **kwargs):
+        """Check if requested scopes are within a scope of the refresh token.
+
+        When access tokens are refreshed the scope of the new token
+        needs to be within the scope of the original token. This is
+        ensured by checking that all requested scopes strings are on
+        the list returned by the get_original_scopes. If this check
+        fails, is_within_original_scope is called. The method can be
+        used in situations where returning all valid scopes from the
+        get_original_scopes is not practical.
+
+        :param request_scopes: A list of scopes that were requested by client
+        :param refresh_token: Unicode refresh_token
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Refresh token grant
+        """
+        return False
+
+    def invalidate_authorization_code(self, client_id, code, request, *args, **kwargs):
+        """Invalidate an authorization code after use.
+
+        :param client_id: Unicode client identifier
+        :param code: The authorization code grant (request.code).
+        :param request: The HTTP Request (oauthlib.common.Request)
+
+        Method is used by:
+            - Authorization Code Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def revoke_token(self, token, token_type_hint, request, *args, **kwargs):
+        """Revoke an access or refresh token.
+
+        :param token: The token string.
+        :param token_type_hint: access_token or refresh_token.
+        :param request: The HTTP Request (oauthlib.common.Request)
+
+        Method is used by:
+            - Revocation Endpoint
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def rotate_refresh_token(self, request):
+        """Determine whether to rotate the refresh token. Default, yes.
+
+        When access tokens are refreshed the old refresh token can be kept
+        or replaced with a new one (rotated). Return True to rotate and
+        and False for keeping original.
+
+        :param request: oauthlib.common.Request
+        :rtype: True or False
+
+        Method is used by:
+            - Refresh Token Grant
+        """
+        return True
+
+    def save_authorization_code(self, client_id, code, request, *args, **kwargs):
+        """Persist the authorization_code.
+
+        The code should at minimum be stored with:
+            - the client_id (client_id)
+            - the redirect URI used (request.redirect_uri)
+            - a resource owner / user (request.user)
+            - the authorized scopes (request.scopes)
+            - the client state, if given (code.get('state'))
+
+        The 'code' argument is actually a dictionary, containing at least a
+        'code' key with the actual authorization code:
+
+            {'code': 'sdf345jsdf0934f'}
+
+        It may also have a 'state' key containing a nonce for the client, if it
+        chose to send one.  That value should be saved and used in
+        'validate_code'.
+
+        :param client_id: Unicode client identifier
+        :param code: A dict of the authorization code grant and, optionally, state.
+        :param request: The HTTP Request (oauthlib.common.Request)
+
+        Method is used by:
+            - Authorization Code Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def save_bearer_token(self, token, request, *args, **kwargs):
+        """Persist the Bearer token.
+
+        The Bearer token should at minimum be associated with:
+            - a client and it's client_id, if available
+            - a resource owner / user (request.user)
+            - authorized scopes (request.scopes)
+            - an expiration time
+            - a refresh token, if issued
+
+        The Bearer token dict may hold a number of items::
+
+            {
+                'token_type': 'Bearer',
+                'access_token': 'askfjh234as9sd8',
+                'expires_in': 3600,
+                'scope': 'string of space separated authorized scopes',
+                'refresh_token': '23sdf876234',  # if issued
+                'state': 'given_by_client',  # if supplied by client
+            }
+
+        Note that while "scope" is a string-separated list of authorized scopes,
+        the original list is still available in request.scopes
+
+        :param client_id: Unicode client identifier
+        :param token: A Bearer token dict
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: The default redirect URI for the client
+
+        Method is used by all core grant types issuing Bearer tokens:
+            - Authorization Code Grant
+            - Implicit Grant
+            - Resource Owner Password Credentials Grant (might not associate a client)
+            - Client Credentials grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_bearer_token(self, token, scopes, request):
+        """Ensure the Bearer token is valid and authorized access to scopes.
+
+        :param token: A string of random characters.
+        :param scopes: A list of scopes associated with the protected resource.
+        :param request: The HTTP Request (oauthlib.common.Request)
+
+        A key to OAuth 2 security and restricting impact of leaked tokens is
+        the short expiration time of tokens, *always ensure the token has not
+        expired!*.
+
+        Two different approaches to scope validation:
+
+            1) all(scopes). The token must be authorized access to all scopes
+                            associated with the resource. For example, the
+                            token has access to ``read-only`` and ``images``,
+                            thus the client can view images but not upload new.
+                            Allows for fine grained access control through
+                            combining various scopes.
+
+            2) any(scopes). The token must be authorized access to one of the
+                            scopes associated with the resource. For example,
+                            token has access to ``read-only-images``.
+                            Allows for fine grained, although arguably less
+                            convenient, access control.
+
+        A powerful way to use scopes would mimic UNIX ACLs and see a scope
+        as a group with certain privileges. For a restful API these might
+        map to HTTP verbs instead of read, write and execute.
+
+        Note, the request.user attribute can be set to the resource owner
+        associated with this token. Similarly the request.client and
+        request.scopes attribute can be set to associated client object
+        and authorized scopes. If you then use a decorator such as the
+        one provided for django these attributes will be made available
+        in all protected views as keyword arguments.
+
+        :param token: Unicode Bearer token
+        :param scopes: List of scopes (defined by you)
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is indirectly used by all core Bearer token issuing grant types:
+            - Authorization Code Grant
+            - Implicit Grant
+            - Resource Owner Password Credentials Grant
+            - Client Credentials Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_client_id(self, client_id, request, *args, **kwargs):
+        """Ensure client_id belong to a valid and active client.
+
+        Note, while not strictly necessary it can often be very convenient
+        to set request.client to the client object associated with the
+        given client_id.
+
+        :param request: oauthlib.common.Request
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+            - Implicit Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_code(self, client_id, code, client, request, *args, **kwargs):
+        """Verify that the authorization_code is valid and assigned to the given
+        client.
+
+        Before returning true, set the following based on the information stored
+        with the code in 'save_authorization_code':
+
+            - request.user
+            - request.state (if given)
+            - request.scopes
+        OBS! The request.user attribute should be set to the resource owner
+        associated with this authorization code. Similarly request.scopes
+        must also be set.
+
+        :param client_id: Unicode client identifier
+        :param code: Unicode authorization code
+        :param client: Client object set by you, see authenticate_client.
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_grant_type(self, client_id, grant_type, client, request, *args, **kwargs):
+        """Ensure client is authorized to use the grant_type requested.
+
+        :param client_id: Unicode client identifier
+        :param grant_type: Unicode grant type, i.e. authorization_code, password.
+        :param client: Client object set by you, see authenticate_client.
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+            - Resource Owner Password Credentials Grant
+            - Client Credentials Grant
+            - Refresh Token Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_redirect_uri(self, client_id, redirect_uri, request, *args, **kwargs):
+        """Ensure client is authorized to redirect to the redirect_uri requested.
+
+        All clients should register the absolute URIs of all URIs they intend
+        to redirect to. The registration is outside of the scope of oauthlib.
+
+        :param client_id: Unicode client identifier
+        :param redirect_uri: Unicode absolute URI
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+            - Implicit Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_refresh_token(self, refresh_token, client, request, *args, **kwargs):
+        """Ensure the Bearer token is valid and authorized access to scopes.
+
+        OBS! The request.user attribute should be set to the resource owner
+        associated with this refresh token.
+
+        :param refresh_token: Unicode refresh token
+        :param client: Client object set by you, see authenticate_client.
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant (indirectly by issuing refresh tokens)
+            - Resource Owner Password Credentials Grant (also indirectly)
+            - Refresh Token Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_response_type(self, client_id, response_type, client, request, *args, **kwargs):
+        """Ensure client is authorized to use the response_type requested.
+
+        :param client_id: Unicode client identifier
+        :param response_type: Unicode response type, i.e. code, token.
+        :param client: Client object set by you, see authenticate_client.
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Authorization Code Grant
+            - Implicit Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_scopes(self, client_id, scopes, client, request, *args, **kwargs):
+        """Ensure the client is authorized access to requested scopes.
+
+        :param client_id: Unicode client identifier
+        :param scopes: List of scopes (defined by you)
+        :param client: Client object set by you, see authenticate_client.
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by all core grant types:
+            - Authorization Code Grant
+            - Implicit Grant
+            - Resource Owner Password Credentials Grant
+            - Client Credentials Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def validate_user(self, username, password, client, request, *args, **kwargs):
+        """Ensure the username and password is valid.
+
+        OBS! The validation should also set the user attribute of the request
+        to a valid resource owner, i.e. request.user = username or similar. If
+        not set you will be unable to associate a token with a user in the
+        persistance method used (commonly, save_bearer_token).
+
+        :param username: Unicode username
+        :param password: Unicode password
+        :param client: Client object set by you, see authenticate_client.
+        :param request: The HTTP Request (oauthlib.common.Request)
+        :rtype: True or False
+
+        Method is used by:
+            - Resource Owner Password Credentials Grant
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/rfc6749/__init__.py	(revision 1126)
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2.rfc6749
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This module is an implementation of various logic needed
+for consuming and providing OAuth 2.0 RFC6749.
+"""
+from __future__ import absolute_import, unicode_literals
+
+import functools
+import logging
+
+from .errors import TemporarilyUnavailableError, ServerError
+from .errors import FatalClientError, OAuth2Error
+
+
+log = logging.getLogger(__name__)
+
+
+class BaseEndpoint(object):
+
+    def __init__(self):
+        self._available = True
+        self._catch_errors = False
+
+    @property
+    def available(self):
+        return self._available
+
+    @available.setter
+    def available(self, available):
+        self._available = available
+
+    @property
+    def catch_errors(self):
+        return self._catch_errors
+
+    @catch_errors.setter
+    def catch_errors(self, catch_errors):
+        self._catch_errors = catch_errors
+
+
+def catch_errors_and_unavailability(f):
+    @functools.wraps(f)
+    def wrapper(endpoint, uri, *args, **kwargs):
+        if not endpoint.available:
+            e = TemporarilyUnavailableError()
+            log.info('Endpoint unavailable, ignoring request %s.' % uri)
+            return {}, e.json, 503
+
+        if endpoint.catch_errors:
+            try:
+                return f(endpoint, uri, *args, **kwargs)
+            except OAuth2Error:
+                raise
+            except FatalClientError:
+                raise
+            except Exception as e:
+                error = ServerError()
+                log.warning(
+                    'Exception caught while processing request, %s.' % e)
+                return {}, error.json, 500
+        else:
+            return f(endpoint, uri, *args, **kwargs)
+    return wrapper
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/oauth2/__init__.py	(revision 1126)
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+"""
+oauthlib.oauth2
+~~~~~~~~~~~~~~
+
+This module is a wrapper for the most recent implementation of OAuth 2.0 Client
+and Server classes.
+"""
+from __future__ import absolute_import, unicode_literals
+
+from .rfc6749.clients import Client
+from .rfc6749.clients import WebApplicationClient
+from .rfc6749.clients import MobileApplicationClient
+from .rfc6749.clients import LegacyApplicationClient
+from .rfc6749.clients import BackendApplicationClient
+from .rfc6749.clients import ServiceApplicationClient
+from .rfc6749.endpoints import AuthorizationEndpoint
+from .rfc6749.endpoints import TokenEndpoint
+from .rfc6749.endpoints import ResourceEndpoint
+from .rfc6749.endpoints import RevocationEndpoint
+from .rfc6749.endpoints import Server
+from .rfc6749.endpoints import WebApplicationServer
+from .rfc6749.endpoints import MobileApplicationServer
+from .rfc6749.endpoints import LegacyApplicationServer
+from .rfc6749.endpoints import BackendApplicationServer
+from .rfc6749.errors import *
+from .rfc6749.grant_types import AuthorizationCodeGrant
+from .rfc6749.grant_types import ImplicitGrant
+from .rfc6749.grant_types import ResourceOwnerPasswordCredentialsGrant
+from .rfc6749.grant_types import ClientCredentialsGrant
+from .rfc6749.grant_types import RefreshTokenGrant
+from .rfc6749.request_validator import RequestValidator
+from .rfc6749.tokens import BearerToken, OAuth2Token
+from .rfc6749.utils import is_secure_transport
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/__init__.py	(revision 1126)
@@ -0,0 +1,25 @@
+"""
+    oauthlib
+    ~~~~~~~~
+
+    A generic, spec-compliant, thorough implementation of the OAuth
+    request-signing logic.
+
+    :copyright: (c) 2011 by Idan Gazit.
+    :license: BSD, see LICENSE for details.
+"""
+
+__author__ = 'Idan Gazit <idan@gazit.me>'
+__version__ = '1.0.3'
+
+
+import logging
+try:  # Python 2.7+
+    from logging import NullHandler
+except ImportError:
+    class NullHandler(logging.Handler):
+
+        def emit(self, record):
+            pass
+
+logging.getLogger('oauthlib').addHandler(NullHandler())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/signals.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/signals.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/oauthlib/signals.py	(revision 1126)
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+"""
+    Implements signals based on blinker if available, otherwise
+    falls silently back to a noop. Shamelessly stolen from flask.signals:
+    https://github.com/mitsuhiko/flask/blob/master/flask/signals.py
+"""
+signals_available = False
+try:
+    from blinker import Namespace
+    signals_available = True
+except ImportError:
+    class Namespace(object):
+        def signal(self, name, doc=None):
+            return _FakeSignal(name, doc)
+
+    class _FakeSignal(object):
+        """If blinker is unavailable, create a fake class with the same
+        interface that allows sending of signals but will fail with an
+        error on anything else.  Instead of doing anything on send, it
+        will just ignore the arguments and do nothing instead.
+        """
+
+        def __init__(self, name, doc=None):
+            self.name = name
+            self.__doc__ = doc
+        def _fail(self, *args, **kwargs):
+            raise RuntimeError('signalling support is unavailable '
+                               'because the blinker library is '
+                               'not installed.')
+        send = lambda *a, **kw: None
+        connect = disconnect = has_receivers_for = receivers_for = \
+            temporarily_connected_to = connected_to = _fail
+        del _fail
+
+# The namespace for code signals.  If you are not oauthlib code, do
+# not put signals in here.  Create your own namespace instead.
+_signals = Namespace()
+
+
+# Core signals.
+scope_changed = _signals.signal('scope-changed')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_codec2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_codec2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_codec2.py	(revision 1126)
@@ -0,0 +1,584 @@
+#!/usr/bin/env python
+"""Python codec for CSS."""
+__docformat__ = 'restructuredtext'
+__author__ = 'Walter Doerwald'
+__version__ = '$Id: util.py 1114 2008-03-05 13:22:59Z cthedot $'
+
+import codecs
+import marshal
+
+# We're using bits to store all possible candidate encodings (or variants, i.e.
+# we have two bits for the variants of UTF-16 and two for the
+# variants of UTF-32).
+#
+# Prefixes for various CSS encodings
+# UTF-8-SIG   xEF  xBB  xBF
+# UTF-16 (LE) xFF  xFE ~x00|~x00
+# UTF-16 (BE) xFE  xFF
+# UTF-16-LE    @   x00   @   x00
+# UTF-16-BE   x00   @
+# UTF-32 (LE) xFF  xFE  x00  x00
+# UTF-32 (BE) x00  x00  xFE  xFF
+# UTF-32-LE    @   x00  x00  x00
+# UTF-32-BE   x00  x00  x00   @
+# CHARSET      @    c    h    a  ...
+
+
+def detectencoding_str(input, final=False):
+    """
+    Detect the encoding of the byte string ``input``, which contains the
+    beginning of a CSS file. This function returns the detected encoding (or
+    ``None`` if it hasn't got enough data), and a flag that indicates whether
+    that encoding has been detected explicitely or implicitely. To detect the
+    encoding the first few bytes are used (or if ``input`` is ASCII compatible
+    and starts with a charset rule the encoding name from the rule). "Explicit"
+    detection means that the bytes start with a BOM or a charset rule.
+
+    If the encoding can't be detected yet, ``None`` is returned as the encoding.
+    ``final`` specifies whether more data will be available in later calls or
+    not. If ``final`` is true, ``detectencoding_str()`` will never return
+    ``None`` as the encoding.
+    """
+
+    # A bit for every candidate
+    CANDIDATE_UTF_8_SIG    =   1
+    CANDIDATE_UTF_16_AS_LE =   2
+    CANDIDATE_UTF_16_AS_BE =   4
+    CANDIDATE_UTF_16_LE    =   8
+    CANDIDATE_UTF_16_BE    =  16
+    CANDIDATE_UTF_32_AS_LE =  32
+    CANDIDATE_UTF_32_AS_BE =  64
+    CANDIDATE_UTF_32_LE    = 128
+    CANDIDATE_UTF_32_BE    = 256
+    CANDIDATE_CHARSET      = 512
+
+    candidates = 1023 # all candidates
+
+    li = len(input)
+    if li>=1:
+        # Check first byte
+        c = input[0]
+        if c != "\xef":
+            candidates &= ~CANDIDATE_UTF_8_SIG
+        if c != "\xff":
+            candidates &= ~(CANDIDATE_UTF_32_AS_LE|CANDIDATE_UTF_16_AS_LE)
+        if c != "\xfe":
+            candidates &= ~CANDIDATE_UTF_16_AS_BE
+        if c != "@":
+            candidates &= ~(CANDIDATE_UTF_32_LE|CANDIDATE_UTF_16_LE|CANDIDATE_CHARSET)
+        if c != "\x00":
+            candidates &= ~(CANDIDATE_UTF_32_AS_BE|CANDIDATE_UTF_32_BE|CANDIDATE_UTF_16_BE)
+        if li>=2:
+            # Check second byte
+            c = input[1]
+            if c != "\xbb":
+                candidates &= ~CANDIDATE_UTF_8_SIG
+            if c != "\xfe":
+                candidates &= ~(CANDIDATE_UTF_16_AS_LE|CANDIDATE_UTF_32_AS_LE)
+            if c != "\xff":
+                candidates &= ~CANDIDATE_UTF_16_AS_BE
+            if c != "\x00":
+                candidates &= ~(CANDIDATE_UTF_16_LE|CANDIDATE_UTF_32_AS_BE|CANDIDATE_UTF_32_LE|CANDIDATE_UTF_32_BE)
+            if c != "@":
+                candidates &= ~CANDIDATE_UTF_16_BE
+            if c != "c":
+                candidates &= ~CANDIDATE_CHARSET
+            if li>=3:
+                # Check third byte
+                c = input[2]
+                if c != "\xbf":
+                    candidates &= ~CANDIDATE_UTF_8_SIG
+                if c != "c":
+                    candidates &= ~CANDIDATE_UTF_16_LE
+                if c != "\x00":
+                    candidates &= ~(CANDIDATE_UTF_32_AS_LE|CANDIDATE_UTF_32_LE|CANDIDATE_UTF_32_BE)
+                if c != "\xfe":
+                    candidates &= ~CANDIDATE_UTF_32_AS_BE
+                if c != "h":
+                    candidates &= ~CANDIDATE_CHARSET
+                if li>=4:
+                    # Check fourth byte
+                    c = input[3]
+                    if input[2:4] == "\x00\x00":
+                        candidates &= ~CANDIDATE_UTF_16_AS_LE
+                    if c != "\x00":
+                        candidates &= ~(CANDIDATE_UTF_16_LE|CANDIDATE_UTF_32_AS_LE|CANDIDATE_UTF_32_LE)
+                    if c != "\xff":
+                        candidates &= ~CANDIDATE_UTF_32_AS_BE
+                    if c != "@":
+                        candidates &= ~CANDIDATE_UTF_32_BE
+                    if c != "a":
+                        candidates &= ~CANDIDATE_CHARSET
+    if candidates == 0:
+        return ("utf-8", False)
+    if not (candidates & (candidates-1)): # only one candidate remaining
+        if candidates == CANDIDATE_UTF_8_SIG and li >= 3:
+            return ("utf-8-sig", True)
+        elif candidates == CANDIDATE_UTF_16_AS_LE and li >= 2:
+            return ("utf-16", True)
+        elif candidates == CANDIDATE_UTF_16_AS_BE and li >= 2:
+            return ("utf-16", True)
+        elif candidates == CANDIDATE_UTF_16_LE and li >= 4:
+            return ("utf-16-le", False)
+        elif candidates == CANDIDATE_UTF_16_BE and li >= 2:
+            return ("utf-16-be", False)
+        elif candidates == CANDIDATE_UTF_32_AS_LE and li >= 4:
+            return ("utf-32", True)
+        elif candidates == CANDIDATE_UTF_32_AS_BE and li >= 4:
+            return ("utf-32", True)
+        elif candidates == CANDIDATE_UTF_32_LE and li >= 4:
+            return ("utf-32-le", False)
+        elif candidates == CANDIDATE_UTF_32_BE and li >= 4:
+            return ("utf-32-be", False)
+        elif candidates == CANDIDATE_CHARSET and li >= 4:
+            prefix = '@charset "'
+            if input[:len(prefix)] == prefix:
+                pos = input.find('"', len(prefix))
+                if pos >= 0:
+                    return (input[len(prefix):pos], True)
+    # if this is the last call, and we haven't determined an encoding yet,
+    # we default to UTF-8
+    if final:
+        return ("utf-8", False)
+    return (None, False) # dont' know yet
+
+
+def detectencoding_unicode(input, final=False):
+    """
+    Detect the encoding of the unicode string ``input``, which contains the
+    beginning of a CSS file. The encoding is detected from the charset rule
+    at the beginning of ``input``. If there is no charset rule, ``"utf-8"``
+    will be returned.
+
+    If the encoding can't be detected yet, ``None`` is returned. ``final``
+    specifies whether more data will be available in later calls or not. If
+    ``final`` is true, ``detectencoding_unicode()`` will never return ``None``.
+    """
+    prefix = u'@charset "'
+    if input.startswith(prefix):
+        pos = input.find(u'"', len(prefix))
+        if pos >= 0:
+            return (input[len(prefix):pos], True)
+    elif final or not prefix.startswith(input):
+        # if this is the last call, and we haven't determined an encoding yet,
+        # (or the string definitely doesn't start with prefix) we default to UTF-8
+        return ("utf-8", False)
+    return (None, False) # don't know yet
+
+
+def _fixencoding(input, encoding, final=False):
+    """
+    Replace the name of the encoding in the charset rule at the beginning of
+    ``input`` with ``encoding``. If ``input`` doesn't starts with a charset
+    rule, ``input`` will be returned unmodified.
+
+    If the encoding can't be found yet, ``None`` is returned. ``final``
+    specifies whether more data will be available in later calls or not.
+    If ``final`` is true, ``_fixencoding()`` will never return ``None``.
+    """
+    prefix = u'@charset "'
+    if len(input) > len(prefix):
+        if input.startswith(prefix):
+            pos = input.find(u'"', len(prefix))
+            if pos >= 0:
+                if encoding.replace("_", "-").lower() == "utf-8-sig":
+                    encoding = u"utf-8"
+                return prefix + encoding + input[pos:]
+            # we haven't seen the end of the encoding name yet => fall through
+        else:
+            return input # doesn't start with prefix, so nothing to fix
+    elif not prefix.startswith(input) or final:
+        # can't turn out to be a @charset rule later (or there is no "later")
+        return input
+    if final:
+        return input
+    return None # don't know yet
+
+
+def decode(input, errors="strict", encoding=None, force=True):
+    if encoding is None or not force:
+        (_encoding, explicit) = detectencoding_str(input, True)
+        if _encoding == "css":
+            raise ValueError("css not allowed as encoding name")
+        if (explicit and not force) or encoding is None: # Take the encoding from the input
+            encoding = _encoding
+    (input, consumed) = codecs.getdecoder(encoding)(input, errors)
+    return (_fixencoding(input, unicode(encoding), True), consumed)
+
+
+def encode(input, errors="strict", encoding=None):
+    consumed = len(input)
+    if encoding is None:
+        encoding = detectencoding_unicode(input, True)[0]
+        if encoding.replace("_", "-").lower() == "utf-8-sig":
+            input = _fixencoding(input, u"utf-8", True)
+    else:
+        input = _fixencoding(input, unicode(encoding), True)
+    if encoding == "css":
+        raise ValueError("css not allowed as encoding name")
+    encoder = codecs.getencoder(encoding)
+    return (encoder(input, errors)[0], consumed)
+
+
+def _bytes2int(bytes):
+    # Helper: convert an 8 bit string into an ``int``.
+    i = 0
+    for byte in bytes:
+        i = (i<<8) + ord(byte)
+    return i
+
+
+def _int2bytes(i):
+    # Helper: convert an ``int`` into an 8-bit string.
+    v = []
+    while i:
+        v.insert(0, chr(i&0xff))
+        i >>= 8
+    return "".join(v)
+
+
+if hasattr(codecs, "IncrementalDecoder"):
+    class IncrementalDecoder(codecs.IncrementalDecoder):
+        def __init__(self, errors="strict", encoding=None, force=True):
+            self.decoder = None
+            self.encoding = encoding
+            self.force = force
+            codecs.IncrementalDecoder.__init__(self, errors)
+            # Store ``errors`` somewhere else,
+            # because we have to hide it in a property
+            self._errors = errors
+            self.buffer = u"".encode()
+            self.headerfixed = False
+
+        def iterdecode(self, input):
+            for part in input:
+                result = self.decode(part, False)
+                if result:
+                    yield result
+            result = self.decode("", True)
+            if result:
+                yield result
+
+        def decode(self, input, final=False):
+            # We're doing basically the same as a ``BufferedIncrementalDecoder``,
+            # but since the buffer is only relevant until the encoding has been
+            # detected (in which case the buffer of the underlying codec might
+            # kick in), we're implementing buffering ourselves to avoid some
+            # overhead.
+            if self.decoder is None:
+                input = self.buffer + input
+                # Do we have to detect the encoding from the input?
+                if self.encoding is None or not self.force:
+                    (encoding, explicit) = detectencoding_str(input, final)
+                    if encoding is None: # no encoding determined yet
+                        self.buffer = input # retry the complete input on the next call
+                        return u"" # no encoding determined yet, so no output
+                    elif encoding == "css":
+                        raise ValueError("css not allowed as encoding name")
+                    if (explicit and not self.force) or self.encoding is None: # Take the encoding from the input
+                        self.encoding = encoding
+                self.buffer = "" # drop buffer, as the decoder might keep its own
+                decoder = codecs.getincrementaldecoder(self.encoding)
+                self.decoder = decoder(self._errors)
+            if self.headerfixed:
+                return self.decoder.decode(input, final)
+            # If we haven't fixed the header yet,
+            # the content of ``self.buffer`` is a ``unicode`` object
+            output = self.buffer + self.decoder.decode(input, final)
+            encoding = self.encoding
+            if encoding.replace("_", "-").lower() == "utf-8-sig":
+                encoding = "utf-8"
+            newoutput = _fixencoding(output, unicode(encoding), final)
+            if newoutput is None:
+                # retry fixing the @charset rule (but keep the decoded stuff)
+                self.buffer = output
+                return u""
+            self.headerfixed = True
+            return newoutput
+
+        def reset(self):
+            codecs.IncrementalDecoder.reset(self)
+            self.decoder = None
+            self.buffer = u"".encode()
+            self.headerfixed = False
+
+        def _geterrors(self):
+            return self._errors
+
+        def _seterrors(self, errors):
+            # Setting ``errors`` must be done on the real decoder too
+            if self.decoder is not None:
+                self.decoder.errors = errors
+            self._errors = errors
+        errors = property(_geterrors, _seterrors)
+
+        def getstate(self):
+            if self.decoder is not None:
+                state = (self.encoding, self.buffer, self.headerfixed, True, self.decoder.getstate())
+            else:
+                state = (self.encoding, self.buffer, self.headerfixed, False, None)
+            return ("", _bytes2int(marshal.dumps(state)))
+
+        def setstate(self, state):
+            state = _int2bytes(marshal.loads(state[1])) # ignore buffered input
+            self.encoding = state[0]
+            self.buffer = state[1]
+            self.headerfixed = state[2]
+            if state[3] is not None:
+                self.decoder = codecs.getincrementaldecoder(self.encoding)(self._errors)
+                self.decoder.setstate(state[4])
+            else:
+                self.decoder = None
+
+
+if hasattr(codecs, "IncrementalEncoder"):
+    class IncrementalEncoder(codecs.IncrementalEncoder):
+        def __init__(self, errors="strict", encoding=None):
+            self.encoder = None
+            self.encoding = encoding
+            codecs.IncrementalEncoder.__init__(self, errors)
+            # Store ``errors`` somewhere else,
+            # because we have to hide it in a property
+            self._errors = errors
+            self.buffer = u""
+
+        def iterencode(self, input):
+            for part in input:
+                result = self.encode(part, False)
+                if result:
+                    yield result
+            result = self.encode(u"", True)
+            if result:
+                yield result
+
+        def encode(self, input, final=False):
+            if self.encoder is None:
+                input = self.buffer + input
+                if self.encoding is not None:
+                    # Replace encoding in the @charset rule with the specified one
+                    encoding = self.encoding
+                    if encoding.replace("_", "-").lower() == "utf-8-sig":
+                        encoding = "utf-8"
+                    newinput = _fixencoding(input, unicode(encoding), final)
+                    if newinput is None: # @charset rule incomplete => Retry next time
+                        self.buffer = input
+                        return ""
+                    input = newinput
+                else:
+                    # Use encoding from the @charset declaration
+                    self.encoding = detectencoding_unicode(input, final)[0]
+                if self.encoding is not None:
+                    if self.encoding == "css":
+                        raise ValueError("css not allowed as encoding name")
+                    info = codecs.lookup(self.encoding)
+                    encoding = self.encoding
+                    if self.encoding.replace("_", "-").lower() == "utf-8-sig":
+                        input = _fixencoding(input, u"utf-8", True)
+                    self.encoder = info.incrementalencoder(self._errors)
+                    self.buffer = u""
+                else:
+                    self.buffer = input
+                    return ""
+            return self.encoder.encode(input, final)
+
+        def reset(self):
+            codecs.IncrementalEncoder.reset(self)
+            self.encoder = None
+            self.buffer = u""
+
+        def _geterrors(self):
+            return self._errors
+
+        def _seterrors(self, errors):
+            # Setting ``errors ``must be done on the real encoder too
+            if self.encoder is not None:
+                self.encoder.errors = errors
+            self._errors = errors
+        errors = property(_geterrors, _seterrors)
+
+        def getstate(self):
+            if self.encoder is not None:
+                state = (self.encoding, self.buffer, True, self.encoder.getstate())
+            else:
+                state = (self.encoding, self.buffer, False, None)
+            return _bytes2int(marshal.dumps(state))
+
+        def setstate(self, state):
+            state = _int2bytes(marshal.loads(state))
+            self.encoding = state[0]
+            self.buffer = state[1]
+            if state[2] is not None:
+                self.encoder = codecs.getincrementalencoder(self.encoding)(self._errors)
+                self.encoder.setstate(state[4])
+            else:
+                self.encoder = None
+
+
+class StreamWriter(codecs.StreamWriter):
+    def __init__(self, stream, errors="strict", encoding=None, header=False):
+        codecs.StreamWriter.__init__(self, stream, errors)
+        self.streamwriter = None
+        self.encoding = encoding
+        self._errors = errors
+        self.buffer = u""
+
+    def encode(self, input, errors='strict'):
+        li = len(input)
+        if self.streamwriter is None:
+            input = self.buffer + input
+            li = len(input)
+            if self.encoding is not None:
+                # Replace encoding in the @charset rule with the specified one
+                encoding = self.encoding
+                if encoding.replace("_", "-").lower() == "utf-8-sig":
+                    encoding = "utf-8"
+                newinput = _fixencoding(input, unicode(encoding), False)
+                if newinput is None: # @charset rule incomplete => Retry next time
+                    self.buffer = input
+                    return ("", 0)
+                input = newinput
+            else:
+                # Use encoding from the @charset declaration
+                self.encoding = detectencoding_unicode(input, False)[0]
+            if self.encoding is not None:
+                if self.encoding == "css":
+                    raise ValueError("css not allowed as encoding name")
+                self.streamwriter = codecs.getwriter(self.encoding)(self.stream, self._errors)
+                encoding = self.encoding
+                if self.encoding.replace("_", "-").lower() == "utf-8-sig":
+                    input = _fixencoding(input, u"utf-8", True)
+                self.buffer = u""
+            else:
+                self.buffer = input
+                return ("", 0)
+        return (self.streamwriter.encode(input, errors)[0], li)
+
+    def _geterrors(self):
+        return self._errors
+
+    def _seterrors(self, errors):
+        # Setting ``errors`` must be done on the streamwriter too
+        if self.streamwriter is not None:
+            self.streamwriter.errors = errors
+        self._errors = errors
+        
+    errors = property(_geterrors, _seterrors)
+
+
+class StreamReader(codecs.StreamReader):
+    def __init__(self, stream, errors="strict", encoding=None, force=True):
+        codecs.StreamReader.__init__(self, stream, errors)
+        self.streamreader = None
+        self.encoding = encoding
+        self.force = force
+        self._errors = errors
+
+    def decode(self, input, errors='strict'):
+        if self.streamreader is None:
+            if self.encoding is None or not self.force:
+                (encoding, explicit) = detectencoding_str(input, False)
+                if encoding is None: # no encoding determined yet
+                    return (u"", 0) # no encoding determined yet, so no output
+                elif encoding == "css":
+                    raise ValueError("css not allowed as encoding name")
+                if (explicit and not self.force) or self.encoding is None: # Take the encoding from the input
+                    self.encoding = encoding
+            streamreader = codecs.getreader(self.encoding)
+            streamreader = streamreader(self.stream, self._errors)
+            (output, consumed) = streamreader.decode(input, errors)
+            encoding = self.encoding
+            if encoding.replace("_", "-").lower() == "utf-8-sig":
+                encoding = "utf-8"
+            newoutput = _fixencoding(output, unicode(encoding), False)
+            if newoutput is not None:
+                self.streamreader = streamreader
+                return (newoutput, consumed)
+            return (u"", 0) # we will create a new streamreader on the next call
+        return self.streamreader.decode(input, errors)
+
+    def _geterrors(self):
+        return self._errors
+
+    def _seterrors(self, errors):
+        # Setting ``errors`` must be done on the streamreader too
+        if self.streamreader is not None:
+            self.streamreader.errors = errors
+        self._errors = errors
+        
+    errors = property(_geterrors, _seterrors)
+
+
+if hasattr(codecs, "CodecInfo"):
+    # We're running on Python 2.5 or better
+    def search_function(name):
+        if name == "css":
+            return codecs.CodecInfo(
+                name="css",
+                encode=encode,
+                decode=decode,
+                incrementalencoder=IncrementalEncoder,
+                incrementaldecoder=IncrementalDecoder,
+                streamwriter=StreamWriter,
+                streamreader=StreamReader,
+            )
+else:
+    # If we're running on Python 2.4, define the utf-8-sig codec here
+    def utf8sig_encode(input, errors='strict'):
+        return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input))
+
+    def utf8sig_decode(input, errors='strict'):
+        prefix = 0
+        if input[:3] == codecs.BOM_UTF8:
+            input = input[3:]
+            prefix = 3
+        (output, consumed) = codecs.utf_8_decode(input, errors, True)
+        return (output, consumed+prefix)
+
+    class UTF8SigStreamWriter(codecs.StreamWriter):
+        def reset(self):
+            codecs.StreamWriter.reset(self)
+            try:
+                del self.encode
+            except AttributeError:
+                pass
+
+        def encode(self, input, errors='strict'):
+            self.encode = codecs.utf_8_encode
+            return utf8sig_encode(input, errors)
+
+    class UTF8SigStreamReader(codecs.StreamReader):
+        def reset(self):
+            codecs.StreamReader.reset(self)
+            try:
+                del self.decode
+            except AttributeError:
+                pass
+
+        def decode(self, input, errors='strict'):
+            if len(input) < 3 and codecs.BOM_UTF8.startswith(input):
+                # not enough data to decide if this is a BOM
+                # => try again on the next call
+                return (u"", 0)
+            self.decode = codecs.utf_8_decode
+            return utf8sig_decode(input, errors)
+
+    def search_function(name):
+        import encodings
+        name = encodings.normalize_encoding(name)
+        if name == "css":
+            return (encode, decode, StreamReader, StreamWriter)
+        elif name == "utf_8_sig":
+            return (utf8sig_encode, utf8sig_decode, UTF8SigStreamReader, UTF8SigStreamWriter)
+
+
+codecs.register(search_function)
+
+
+# Error handler for CSS escaping
+
+def cssescape(exc):
+    if not isinstance(exc, UnicodeEncodeError):
+        raise TypeError("don't know how to handle %r" % exc)
+    return (u"".join(u"\\%06x" % ord(c) for c in exc.object[exc.start:exc.end]), exc.end)
+
+codecs.register_error("cssescape", cssescape)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/__init__.py	(revision 1126)
@@ -0,0 +1,385 @@
+#!/usr/bin/env python
+"""cssutils - CSS Cascading Style Sheets library for Python
+
+    Copyright (C) 2004-2013 Christof Hoeke
+
+    cssutils is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+A Python package to parse and build CSS Cascading Style Sheets. DOM only, not
+any rendering facilities!
+
+Based upon and partly implementing the following specifications :
+
+`CSS 2.1 <http://www.w3.org/TR/CSS2/>`__
+    General CSS rules and properties are defined here
+`CSS 2.1 Errata  <http://www.w3.org/Style/css2-updates/CR-CSS21-20070719-errata.html>`__
+    A few errata, mainly the definition of CHARSET_SYM tokens
+`CSS3 Module: Syntax <http://www.w3.org/TR/css3-syntax/>`__
+    Used in parts since cssutils 0.9.4. cssutils tries to use the features from
+    CSS 2.1 and CSS 3 with preference to CSS3 but as this is not final yet some
+    parts are from CSS 2.1
+`MediaQueries <http://www.w3.org/TR/css3-mediaqueries/>`__
+    MediaQueries are part of ``stylesheets.MediaList`` since v0.9.4, used in
+    @import and @media rules.
+`Namespaces <http://dev.w3.org/csswg/css3-namespace/>`__
+    Added in v0.9.1, updated to definition in CSSOM in v0.9.4, updated in 0.9.5
+    for dev version
+`CSS3 Module: Pages Media <http://www.w3.org/TR/css3-page/>`__
+    Most properties of this spec are implemented including MarginRules
+`Selectors <http://www.w3.org/TR/css3-selectors/>`__
+    The selector syntax defined here (and not in CSS 2.1) should be parsable
+    with cssutils (*should* mind though ;) )
+
+`DOM Level 2 Style CSS <http://www.w3.org/TR/DOM-Level-2-Style/css.html>`__
+    DOM for package css. 0.9.8 removes support for CSSValue and related API,
+    see PropertyValue and Value API for now
+`DOM Level 2 Style Stylesheets <http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html>`__
+    DOM for package stylesheets
+`CSSOM <http://dev.w3.org/csswg/cssom/>`__
+    A few details (mainly the NamespaceRule DOM) is taken from here. Plan is
+    to move implementation to the stuff defined here which is newer but still
+    no REC so might change anytime...
+
+
+The cssutils tokenizer is a customized implementation of `CSS3 Module: Syntax
+(W3C Working Draft 13 August 2003) <http://www.w3.org/TR/css3-syntax/>`__ which
+itself is based on the CSS 2.1 tokenizer. It tries to be as compliant as
+possible but uses some (helpful) parts of the CSS 2.1 tokenizer.
+
+I guess cssutils is neither CSS 2.1 nor CSS 3 compliant but tries to at least
+be able to parse both grammars including some more real world cases (some CSS
+hacks are actually parsed and serialized). Both official grammars are not final
+nor bugfree but still feasible. cssutils aim is not to be fully compliant to
+any CSS specification (the specifications seem to be in a constant flow anyway)
+but cssutils *should* be able to read and write as many as possible CSS
+stylesheets "in the wild" while at the same time implement the official APIs
+which are well documented. Some minor extensions are provided as well.
+
+Please visit http://cthedot.de/cssutils/ for more details.
+
+
+Tested with Python 2.7.6 and 3.3.3 on Windows 8.1 64bit.
+
+
+This library may be used ``from cssutils import *`` which
+import subpackages ``css`` and ``stylesheets``, CSSParser and
+CSSSerializer classes only.
+
+Usage may be::
+
+    >>> from cssutils import *
+    >>> parser = CSSParser()
+    >>> sheet = parser.parseString(u'a { color: red}')
+    >>> print sheet.cssText
+    a {
+        color: red
+        }
+
+"""
+__all__ = ['css', 'stylesheets', 'CSSParser', 'CSSSerializer']
+__docformat__ = 'restructuredtext'
+__author__ = 'Christof Hoeke with contributions by Walter Doerwald'
+__date__ = '$LastChangedDate::                            $:'
+
+VERSION = '1.0'
+
+__version__ = '%s $Id$' % VERSION
+
+import sys
+if sys.version_info < (2,6):
+    bytes = str
+
+import codec
+import os.path
+import urllib
+import urlparse
+import xml.dom
+
+# order of imports is important (partly circular)
+from . import util
+import errorhandler
+log = errorhandler.ErrorHandler()
+
+import css
+import stylesheets
+from parse import CSSParser
+
+from serialize import CSSSerializer
+ser = CSSSerializer()
+
+from profiles import Profiles
+profile = Profiles(log=log)
+
+# used by Selector defining namespace prefix '*'
+_ANYNS = -1
+
+class DOMImplementationCSS(object):
+    """This interface allows the DOM user to create a CSSStyleSheet
+    outside the context of a document. There is no way to associate
+    the new CSSStyleSheet with a document in DOM Level 2.
+
+    This class is its *own factory*, as it is given to
+    xml.dom.registerDOMImplementation which simply calls it and receives
+    an instance of this class then.
+    """
+    _features = [
+        ('css', '1.0'),
+        ('css', '2.0'),
+        ('stylesheets', '1.0'),
+        ('stylesheets', '2.0')
+    ]
+
+    def createCSSStyleSheet(self, title, media):
+        """
+        Creates a new CSSStyleSheet.
+
+        title of type DOMString
+            The advisory title. See also the Style Sheet Interfaces
+            section.
+        media of type DOMString
+            The comma-separated list of media associated with the new style
+            sheet. See also the Style Sheet Interfaces section.
+
+        returns
+            CSSStyleSheet: A new CSS style sheet.
+
+        TODO: DOMException
+            SYNTAX_ERR: Raised if the specified media string value has a
+            syntax error and is unparsable.
+        """
+        return css.CSSStyleSheet(title=title, media=media)
+
+    def createDocument(self, *args):
+        # not needed to HTML, also not for CSS?
+        raise NotImplementedError
+
+    def createDocumentType(self, *args):
+        # not needed to HTML, also not for CSS?
+        raise NotImplementedError
+
+    def hasFeature(self, feature, version):
+        return (feature.lower(), unicode(version)) in self._features
+
+xml.dom.registerDOMImplementation('cssutils', DOMImplementationCSS)
+
+
+def parseString(*a, **k):
+    return CSSParser().parseString(*a, **k)
+parseString.__doc__ = CSSParser.parseString.__doc__
+
+def parseFile(*a, **k):
+    return CSSParser().parseFile(*a, **k)
+parseFile.__doc__ = CSSParser.parseFile.__doc__
+
+def parseUrl(*a, **k):
+    return CSSParser().parseUrl(*a, **k)
+parseUrl.__doc__ = CSSParser.parseUrl.__doc__
+
+def parseStyle(*a, **k):
+    return CSSParser().parseStyle(*a, **k)
+parseStyle.__doc__ = CSSParser.parseStyle.__doc__
+
+# set "ser", default serializer
+def setSerializer(serializer):
+    """Set the global serializer used by all class in cssutils."""
+    global ser
+    ser = serializer
+
+def getUrls(sheet):
+    """Retrieve all ``url(urlstring)`` values (in e.g.
+    :class:`cssutils.css.CSSImportRule` or :class:`cssutils.css.CSSValue`
+    objects of given `sheet`.
+
+    :param sheet:
+        :class:`cssutils.css.CSSStyleSheet` object whose URLs are yielded
+
+    This function is a generator. The generated URL values exclude ``url(`` and
+    ``)`` and surrounding single or double quotes.
+    """
+    for importrule in (r for r in sheet if r.type == r.IMPORT_RULE):
+        yield importrule.href
+
+    def styleDeclarations(base):
+        "recursive generator to find all CSSStyleDeclarations"
+        if hasattr(base, 'cssRules'):
+            for rule in base.cssRules:
+                for s in styleDeclarations(rule):
+                    yield s
+        elif hasattr(base, 'style'):
+            yield base.style
+
+    for style in styleDeclarations(sheet):
+        for p in style.getProperties(all=True):
+            for v in p.propertyValue:
+                if v.type == 'URI':
+                    yield v.uri
+
+def replaceUrls(sheetOrStyle, replacer, ignoreImportRules=False):
+    """Replace all URLs in :class:`cssutils.css.CSSImportRule` or
+    :class:`cssutils.css.CSSValue` objects of given `sheetOrStyle`.
+
+    :param sheetOrStyle:
+        a :class:`cssutils.css.CSSStyleSheet` or a
+        :class:`cssutils.css.CSSStyleDeclaration` which is changed in place
+    :param replacer:
+        a function which is called with a single argument `url` which
+        is the current value of each url() excluding ``url(``, ``)`` and
+        surrounding (single or double) quotes.
+    :param ignoreImportRules:
+        if ``True`` does not call `replacer` with URLs from @import rules.
+    """
+    if not ignoreImportRules and not isinstance(sheetOrStyle,
+                                                css.CSSStyleDeclaration):
+        for importrule in (r for r in sheetOrStyle if r.type == r.IMPORT_RULE):
+            importrule.href = replacer(importrule.href)
+
+    def styleDeclarations(base):
+        "recursive generator to find all CSSStyleDeclarations"
+        if hasattr(base, 'cssRules'):
+            for rule in base.cssRules:
+                for s in styleDeclarations(rule):
+                    yield s
+        elif hasattr(base, 'style'):
+            yield base.style
+        elif isinstance(sheetOrStyle, css.CSSStyleDeclaration):
+            # base is a style already
+            yield base
+
+    for style in styleDeclarations(sheetOrStyle):
+        for p in style.getProperties(all=True):
+            for v in p.propertyValue:
+                if v.type == v.URI:
+                    v.uri = replacer(v.uri)
+
+def resolveImports(sheet, target=None):
+    """Recurcively combine all rules in given `sheet` into a `target` sheet.
+    @import rules which use media information are tried to be wrapped into
+    @media rules so keeping the media information. This may not work in
+    all instances (if e.g. an @import rule itself contains an @import rule
+    with different media infos or if it contains rules which may not be
+    used inside an @media block like @namespace rules.). In these cases
+    the @import rule is kept as in the original sheet and a WARNING is issued.
+
+    :param sheet:
+        in this given :class:`cssutils.css.CSSStyleSheet` all import rules are
+        resolved and added to a resulting *flat* sheet.
+    :param target:
+        A :class:`cssutils.css.CSSStyleSheet` object which will be the
+        resulting *flat* sheet if given
+    :returns: given `target` or a new :class:`cssutils.css.CSSStyleSheet`
+        object
+    """
+    if not target:
+        target = css.CSSStyleSheet(href=sheet.href,
+                                   media=sheet.media,
+                                   title=sheet.title)
+
+    def getReplacer(targetbase):
+        "Return a replacer which uses base to return adjusted URLs"
+        basesch, baseloc, basepath, basequery, basefrag = urlparse.urlsplit(targetbase)
+        basepath, basepathfilename = os.path.split(basepath)
+
+        def replacer(uri):
+            scheme, location, path, query, fragment = urlparse.urlsplit(uri)
+            if not scheme and not location and not path.startswith(u'/'):
+                # relative
+                path, filename = os.path.split(path)
+                combined = os.path.normpath(os.path.join(basepath, path, filename))
+                return urllib.pathname2url(combined)
+            else:
+                # keep anything absolute
+                return uri
+
+        return replacer
+
+    for rule in sheet.cssRules:
+        if rule.type == rule.CHARSET_RULE:
+            pass
+        elif rule.type == rule.IMPORT_RULE:
+            log.info(u'Processing @import %r' % rule.href, neverraise=True)
+
+            if rule.hrefFound:
+                # add all rules of @import to current sheet
+                target.add(css.CSSComment(cssText=u'/* START @import "%s" */'
+                                          % rule.href))
+
+                try:
+                    # nested imports
+                    importedSheet = resolveImports(rule.styleSheet)
+                except xml.dom.HierarchyRequestErr, e:
+                    log.warn(u'@import: Cannot resolve target, keeping rule: %s'
+                             % e, neverraise=True)
+                    target.add(rule)
+                else:
+                    # adjust relative URI references
+                    log.info(u'@import: Adjusting paths for %r' % rule.href,
+                             neverraise=True)
+                    replaceUrls(importedSheet,
+                                getReplacer(rule.href),
+                                ignoreImportRules=True)
+
+                    # might have to wrap rules in @media if media given
+                    if rule.media.mediaText == u'all':
+                        mediaproxy = None
+                    else:
+                        keepimport = False
+                        for r in importedSheet:
+                            # check if rules present which may not be
+                            # combined with media
+                            if r.type not in (r.COMMENT,
+                                              r.STYLE_RULE,
+                                              r.IMPORT_RULE):
+                                keepimport = True
+                                break
+                        if keepimport:
+                            log.warn(u'Cannot combine imported sheet with'
+                                     u' given media as other rules then'
+                                     u' comments or stylerules found %r,'
+                                     u' keeping %r' % (r,
+                                                       rule.cssText),
+                                     neverraise=True)
+                            target.add(rule)
+                            continue
+
+                        # wrap in @media if media is not `all`
+                        log.info(u'@import: Wrapping some rules in @media '
+                                 u' to keep media: %s'
+                                 % rule.media.mediaText, neverraise=True)
+                        mediaproxy = css.CSSMediaRule(rule.media.mediaText)
+
+                    for r in importedSheet:
+                        if mediaproxy:
+                            mediaproxy.add(r)
+                        else:
+                            # add to top sheet directly but are difficult anyway
+                            target.add(r)
+
+                    if mediaproxy:
+                        target.add(mediaproxy)
+
+            else:
+                # keep @import as it is
+                log.error(u'Cannot get referenced stylesheet %r, keeping rule'
+                          % rule.href, neverraise=True)
+                target.add(rule)
+
+        else:
+            target.add(rule)
+
+    return target
+
+
+if __name__ == '__main__':
+    print __doc__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_codec3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_codec3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_codec3.py	(revision 1126)
@@ -0,0 +1,608 @@
+#!/usr/bin/env python
+"""Python codec for CSS."""
+__docformat__ = 'restructuredtext'
+__author__ = 'Walter Doerwald'
+__version__ = '$Id: util.py 1114 2008-03-05 13:22:59Z cthedot $'
+
+import sys
+import codecs
+import marshal
+
+# We're using bits to store all possible candidate encodings (or variants, i.e.
+# we have two bits for the variants of UTF-16 and two for the
+# variants of UTF-32).
+#
+# Prefixes for various CSS encodings
+# UTF-8-SIG   xEF  xBB  xBF
+# UTF-16 (LE) xFF  xFE ~x00|~x00
+# UTF-16 (BE) xFE  xFF
+# UTF-16-LE    @   x00   @   x00
+# UTF-16-BE   x00   @
+# UTF-32 (LE) xFF  xFE  x00  x00
+# UTF-32 (BE) x00  x00  xFE  xFF
+# UTF-32-LE    @   x00  x00  x00
+# UTF-32-BE   x00  x00  x00   @
+# CHARSET      @    c    h    a  ...
+
+
+def chars(bytestring):
+    return ''.join(chr(byte) for byte in bytestring)
+
+
+def detectencoding_str(input, final=False):
+    """
+    Detect the encoding of the byte string ``input``, which contains the
+    beginning of a CSS file. This function returns the detected encoding (or
+    ``None`` if it hasn't got enough data), and a flag that indicates whether
+    that encoding has been detected explicitely or implicitely. To detect the
+    encoding the first few bytes are used (or if ``input`` is ASCII compatible
+    and starts with a charset rule the encoding name from the rule). "Explicit"
+    detection means that the bytes start with a BOM or a charset rule.
+
+    If the encoding can't be detected yet, ``None`` is returned as the encoding.
+    ``final`` specifies whether more data will be available in later calls or
+    not. If ``final`` is true, ``detectencoding_str()`` will never return
+    ``None`` as the encoding.
+    """
+
+    # A bit for every candidate
+    CANDIDATE_UTF_8_SIG    =   1
+    CANDIDATE_UTF_16_AS_LE =   2
+    CANDIDATE_UTF_16_AS_BE =   4
+    CANDIDATE_UTF_16_LE    =   8
+    CANDIDATE_UTF_16_BE    =  16
+    CANDIDATE_UTF_32_AS_LE =  32
+    CANDIDATE_UTF_32_AS_BE =  64
+    CANDIDATE_UTF_32_LE    = 128
+    CANDIDATE_UTF_32_BE    = 256
+    CANDIDATE_CHARSET      = 512
+
+    candidates = 1023 # all candidates
+
+    #input = chars(input)
+    li = len(input)
+    if li>=1:
+        # Check first byte
+        c = input[0]
+        if c != b"\xef"[0]:
+            candidates &= ~CANDIDATE_UTF_8_SIG
+        if c != b"\xff"[0]:
+            candidates &= ~(CANDIDATE_UTF_32_AS_LE|CANDIDATE_UTF_16_AS_LE)
+        if c != b"\xfe"[0]:
+            candidates &= ~CANDIDATE_UTF_16_AS_BE
+        if c != b"@"[0]:
+            candidates &= ~(CANDIDATE_UTF_32_LE|CANDIDATE_UTF_16_LE|CANDIDATE_CHARSET)
+        if c != b"\x00"[0]:
+            candidates &= ~(CANDIDATE_UTF_32_AS_BE|CANDIDATE_UTF_32_BE|CANDIDATE_UTF_16_BE)
+        if li>=2:
+            # Check second byte
+            c = input[1]
+            if c != b"\xbb"[0]:
+                candidates &= ~CANDIDATE_UTF_8_SIG
+            if c != b"\xfe"[0]:
+                candidates &= ~(CANDIDATE_UTF_16_AS_LE|CANDIDATE_UTF_32_AS_LE)
+            if c != b"\xff"[0]:
+                candidates &= ~CANDIDATE_UTF_16_AS_BE
+            if c != b"\x00"[0]:
+                candidates &= ~(CANDIDATE_UTF_16_LE|CANDIDATE_UTF_32_AS_BE|CANDIDATE_UTF_32_LE|CANDIDATE_UTF_32_BE)
+            if c != b"@"[0]:
+                candidates &= ~CANDIDATE_UTF_16_BE
+            if c != b"c"[0]:
+                candidates &= ~CANDIDATE_CHARSET
+            if li>=3:
+                # Check third byte
+                c = input[2]
+                if c != b"\xbf"[0]:
+                    candidates &= ~CANDIDATE_UTF_8_SIG
+                if c != b"c"[0]:
+                    candidates &= ~CANDIDATE_UTF_16_LE
+                if c != b"\x00"[0]:
+                    candidates &= ~(CANDIDATE_UTF_32_AS_LE|CANDIDATE_UTF_32_LE|CANDIDATE_UTF_32_BE)
+                if c != b"\xfe"[0]:
+                    candidates &= ~CANDIDATE_UTF_32_AS_BE
+                if c != b"h"[0]:
+                    candidates &= ~CANDIDATE_CHARSET
+                if li>=4:
+                    # Check fourth byte
+                    c = input[3]
+                    if input[2:4] == b"\x00\x00"[0:2]:
+                        candidates &= ~CANDIDATE_UTF_16_AS_LE
+                    if c != b"\x00"[0]:
+                        candidates &= ~(CANDIDATE_UTF_16_LE|CANDIDATE_UTF_32_AS_LE|CANDIDATE_UTF_32_LE)
+                    if c != b"\xff"[0]:
+                        candidates &= ~CANDIDATE_UTF_32_AS_BE
+                    if c != b"@"[0]:
+                        candidates &= ~CANDIDATE_UTF_32_BE
+                    if c != b"a"[0]:
+                        candidates &= ~CANDIDATE_CHARSET
+    if candidates == 0:
+        return ("utf-8", False)
+    if not (candidates & (candidates-1)): # only one candidate remaining
+        if candidates == CANDIDATE_UTF_8_SIG and li >= 3:
+            return ("utf-8-sig", True)
+        elif candidates == CANDIDATE_UTF_16_AS_LE and li >= 2:
+            return ("utf-16", True)
+        elif candidates == CANDIDATE_UTF_16_AS_BE and li >= 2:
+            return ("utf-16", True)
+        elif candidates == CANDIDATE_UTF_16_LE and li >= 4:
+            return ("utf-16-le", False)
+        elif candidates == CANDIDATE_UTF_16_BE and li >= 2:
+            return ("utf-16-be", False)
+        elif candidates == CANDIDATE_UTF_32_AS_LE and li >= 4:
+            return ("utf-32", True)
+        elif candidates == CANDIDATE_UTF_32_AS_BE and li >= 4:
+            return ("utf-32", True)
+        elif candidates == CANDIDATE_UTF_32_LE and li >= 4:
+            return ("utf-32-le", False)
+        elif candidates == CANDIDATE_UTF_32_BE and li >= 4:
+            return ("utf-32-be", False)
+        elif candidates == CANDIDATE_CHARSET and li >= 4:
+            prefix = '@charset "'
+            charsinput = chars(input) 
+            if charsinput[:len(prefix)] == prefix:
+                pos = charsinput.find('"', len(prefix))
+                if pos >= 0:
+                    # TODO: return str and not bytes!
+                    return (charsinput[len(prefix):pos], True)
+    # if this is the last call, and we haven't determined an encoding yet,
+    # we default to UTF-8
+    if final:
+        return ("utf-8", False)
+    return (None, False) # dont' know yet
+
+
+def detectencoding_unicode(input, final=False):
+    """
+    Detect the encoding of the unicode string ``input``, which contains the
+    beginning of a CSS file. The encoding is detected from the charset rule
+    at the beginning of ``input``. If there is no charset rule, ``"utf-8"``
+    will be returned.
+
+    If the encoding can't be detected yet, ``None`` is returned. ``final``
+    specifies whether more data will be available in later calls or not. If
+    ``final`` is true, ``detectencoding_unicode()`` will never return ``None``.
+    """
+    prefix = '@charset "'
+    if input.startswith(prefix):
+        pos = input.find('"', len(prefix))
+        if pos >= 0:
+            return (input[len(prefix):pos], True)
+    elif final or not prefix.startswith(input):
+        # if this is the last call, and we haven't determined an encoding yet,
+        # (or the string definitely doesn't start with prefix) we default to UTF-8
+        return ("utf-8", False)
+    return (None, False) # don't know yet
+
+
+def _fixencoding(input, encoding, final=False):
+    """
+    Replace the name of the encoding in the charset rule at the beginning of
+    ``input`` with ``encoding``. If ``input`` doesn't starts with a charset
+    rule, ``input`` will be returned unmodified.
+
+    If the encoding can't be found yet, ``None`` is returned. ``final``
+    specifies whether more data will be available in later calls or not.
+    If ``final`` is true, ``_fixencoding()`` will never return ``None``.
+    """
+    prefix = '@charset "'
+    if len(input) > len(prefix):
+        if input.startswith(prefix):
+            pos = input.find('"', len(prefix))
+            if pos >= 0:
+                if encoding.replace("_", "-").lower() == "utf-8-sig":
+                    encoding = "utf-8"
+                return prefix + encoding + input[pos:]
+            # we haven't seen the end of the encoding name yet => fall through
+        else:
+            return input # doesn't start with prefix, so nothing to fix
+    elif not prefix.startswith(input) or final:
+        # can't turn out to be a @charset rule later (or there is no "later")
+        return input
+    if final:
+        return input
+    return None # don't know yet
+
+
+def decode(input, errors="strict", encoding=None, force=True):
+    try:
+        # py 3 only, memory?! object to bytes
+        input = input.tobytes()
+    except AttributeError as e:
+        pass
+    
+    if encoding is None or not force:
+        (_encoding, explicit) = detectencoding_str(input, True)
+        if _encoding == "css":
+            raise ValueError("css not allowed as encoding name")
+        if (explicit and not force) or encoding is None: # Take the encoding from the input
+            encoding = _encoding
+            
+    # NEEDS: change in parse.py (str to bytes!)
+    (input, consumed) = codecs.getdecoder(encoding)(input, errors)
+    return (_fixencoding(input, str(encoding), True), consumed)
+
+
+def encode(input, errors="strict", encoding=None):
+    consumed = len(input)
+    if encoding is None:
+        encoding = detectencoding_unicode(input, True)[0]
+        if encoding.replace("_", "-").lower() == "utf-8-sig":
+            input = _fixencoding(input, "utf-8", True)
+    else:
+        input = _fixencoding(input, str(encoding), True)
+    if encoding == "css":
+        raise ValueError("css not allowed as encoding name")
+    encoder = codecs.getencoder(encoding)
+    return (encoder(input, errors)[0], consumed)
+
+
+def _bytes2int(bytes):
+    # Helper: convert an 8 bit string into an ``int``.
+    i = 0
+    for byte in bytes:
+        i = (i<<8) + ord(byte)
+    return i
+
+
+def _int2bytes(i):
+    # Helper: convert an ``int`` into an 8-bit string.
+    v = []
+    while i:
+        v.insert(0, chr(i&0xff))
+        i >>= 8
+    return "".join(v)
+
+
+if hasattr(codecs, "IncrementalDecoder"):
+    class IncrementalDecoder(codecs.IncrementalDecoder):
+        def __init__(self, errors="strict", encoding=None, force=True):
+            self.decoder = None
+            self.encoding = encoding
+            self.force = force
+            codecs.IncrementalDecoder.__init__(self, errors)
+            # Store ``errors`` somewhere else,
+            # because we have to hide it in a property
+            self._errors = errors
+            self.buffer = b""
+            self.headerfixed = False
+
+        def iterdecode(self, input):
+            for part in input:
+                result = self.decode(part, False)
+                if result:
+                    yield result
+            result = self.decode("", True)
+            if result:
+                yield result
+
+        def decode(self, input, final=False):
+            # We're doing basically the same as a ``BufferedIncrementalDecoder``,
+            # but since the buffer is only relevant until the encoding has been
+            # detected (in which case the buffer of the underlying codec might
+            # kick in), we're implementing buffering ourselves to avoid some
+            # overhead.
+            if self.decoder is None:
+                input = self.buffer + input
+                # Do we have to detect the encoding from the input?
+                if self.encoding is None or not self.force:
+                    (encoding, explicit) = detectencoding_str(input, final)
+                    if encoding is None: # no encoding determined yet
+                        self.buffer = input # retry the complete input on the next call
+                        return "" # no encoding determined yet, so no output
+                    elif encoding == "css":
+                        raise ValueError("css not allowed as encoding name")
+                    if (explicit and not self.force) or self.encoding is None: # Take the encoding from the input
+                        self.encoding = encoding
+                self.buffer = "" # drop buffer, as the decoder might keep its own
+                decoder = codecs.getincrementaldecoder(self.encoding)
+                self.decoder = decoder(self._errors)
+            if self.headerfixed:
+                return self.decoder.decode(input, final)
+            # If we haven't fixed the header yet,
+            # the content of ``self.buffer`` is a ``unicode`` object
+            output = self.buffer + self.decoder.decode(input, final)
+            encoding = self.encoding
+            if encoding.replace("_", "-").lower() == "utf-8-sig":
+                encoding = "utf-8"
+            newoutput = _fixencoding(output, str(encoding), final)
+            if newoutput is None:
+                # retry fixing the @charset rule (but keep the decoded stuff)
+                self.buffer = output
+                return ""
+            self.headerfixed = True
+            return newoutput
+
+        def reset(self):
+            codecs.IncrementalDecoder.reset(self)
+            self.decoder = None
+            self.buffer = b""
+            self.headerfixed = False
+
+        def _geterrors(self):
+            return self._errors
+
+        def _seterrors(self, errors):
+            # Setting ``errors`` must be done on the real decoder too
+            if self.decoder is not None:
+                self.decoder.errors = errors
+            self._errors = errors
+        errors = property(_geterrors, _seterrors)
+
+        def getstate(self):
+            if self.decoder is not None:
+                state = (self.encoding, self.buffer, self.headerfixed, True, self.decoder.getstate())
+            else:
+                state = (self.encoding, self.buffer, self.headerfixed, False, None)
+            return ("", _bytes2int(marshal.dumps(state)))
+
+        def setstate(self, state):
+            state = _int2bytes(marshal.loads(state[1])) # ignore buffered input
+            self.encoding = state[0]
+            self.buffer = state[1]
+            self.headerfixed = state[2]
+            if state[3] is not None:
+                self.decoder = codecs.getincrementaldecoder(self.encoding)(self._errors)
+                self.decoder.setstate(state[4])
+            else:
+                self.decoder = None
+
+
+if hasattr(codecs, "IncrementalEncoder"):
+    class IncrementalEncoder(codecs.IncrementalEncoder):
+        def __init__(self, errors="strict", encoding=None):
+            self.encoder = None
+            self.encoding = encoding
+            codecs.IncrementalEncoder.__init__(self, errors)
+            # Store ``errors`` somewhere else,
+            # because we have to hide it in a property
+            self._errors = errors
+            self.buffer = ""
+
+        def iterencode(self, input):
+            for part in input:
+                result = self.encode(part, False)
+                if result:
+                    yield result
+            result = self.encode("", True)
+            if result:
+                yield result
+
+        def encode(self, input, final=False):
+            if self.encoder is None:
+                input = self.buffer + input
+                if self.encoding is not None:
+                    # Replace encoding in the @charset rule with the specified one
+                    encoding = self.encoding
+                    if encoding.replace("_", "-").lower() == "utf-8-sig":
+                        encoding = "utf-8"
+                    newinput = _fixencoding(input, str(encoding), final)
+                    if newinput is None: # @charset rule incomplete => Retry next time
+                        self.buffer = input
+                        return ""
+                    input = newinput
+                else:
+                    # Use encoding from the @charset declaration
+                    self.encoding = detectencoding_unicode(input, final)[0]
+                if self.encoding is not None:
+                    if self.encoding == "css":
+                        raise ValueError("css not allowed as encoding name")
+                    info = codecs.lookup(self.encoding)
+                    encoding = self.encoding
+                    if self.encoding.replace("_", "-").lower() == "utf-8-sig":
+                        input = _fixencoding(input, "utf-8", True)
+                    self.encoder = info.incrementalencoder(self._errors)
+                    self.buffer = ""
+                else:
+                    self.buffer = input
+                    return ""
+            return self.encoder.encode(input, final)
+
+        def reset(self):
+            codecs.IncrementalEncoder.reset(self)
+            self.encoder = None
+            self.buffer = ""
+
+        def _geterrors(self):
+            return self._errors
+
+        def _seterrors(self, errors):
+            # Setting ``errors ``must be done on the real encoder too
+            if self.encoder is not None:
+                self.encoder.errors = errors
+            self._errors = errors
+        errors = property(_geterrors, _seterrors)
+
+        def getstate(self):
+            if self.encoder is not None:
+                state = (self.encoding, self.buffer, True, self.encoder.getstate())
+            else:
+                state = (self.encoding, self.buffer, False, None)
+            return _bytes2int(marshal.dumps(state))
+
+        def setstate(self, state):
+            state = _int2bytes(marshal.loads(state))
+            self.encoding = state[0]
+            self.buffer = state[1]
+            if state[2] is not None:
+                self.encoder = codecs.getincrementalencoder(self.encoding)(self._errors)
+                self.encoder.setstate(state[4])
+            else:
+                self.encoder = None
+
+
+class StreamWriter(codecs.StreamWriter):
+    def __init__(self, stream, errors="strict", encoding=None, header=False):
+        codecs.StreamWriter.__init__(self, stream, errors)
+        self.streamwriter = None
+        self.encoding = encoding
+        self._errors = errors
+        self.buffer = ""
+
+    def encode(self, input, errors='strict'):
+        li = len(input)
+        if self.streamwriter is None:
+            input = self.buffer + input
+            li = len(input)
+            if self.encoding is not None:
+                # Replace encoding in the @charset rule with the specified one
+                encoding = self.encoding
+                if encoding.replace("_", "-").lower() == "utf-8-sig":
+                    encoding = "utf-8"
+                newinput = _fixencoding(input, str(encoding), False)
+                if newinput is None: # @charset rule incomplete => Retry next time
+                    self.buffer = input
+                    return ("", 0)
+                input = newinput
+            else:
+                # Use encoding from the @charset declaration
+                self.encoding = detectencoding_unicode(input, False)[0]
+            if self.encoding is not None:
+                if self.encoding == "css":
+                    raise ValueError("css not allowed as encoding name")
+                self.streamwriter = codecs.getwriter(self.encoding)(self.stream, self._errors)
+                encoding = self.encoding
+                if self.encoding.replace("_", "-").lower() == "utf-8-sig":
+                    input = _fixencoding(input, "utf-8", True)
+                self.buffer = ""
+            else:
+                self.buffer = input
+                return ("", 0)
+        return (self.streamwriter.encode(input, errors)[0], li)
+
+    def _geterrors(self):
+        return self._errors
+
+    def _seterrors(self, errors):
+        # Setting ``errors`` must be done on the streamwriter too
+        try:
+            if self.streamwriter is not None:
+                self.streamwriter.errors = errors
+        except AttributeError as e:
+            # TODO: py3 only exception?
+            pass
+        
+        self._errors = errors
+    errors = property(_geterrors, _seterrors)
+
+
+class StreamReader(codecs.StreamReader):
+    def __init__(self, stream, errors="strict", encoding=None, force=True):
+        codecs.StreamReader.__init__(self, stream, errors)
+        self.streamreader = None
+        self.encoding = encoding
+        self.force = force
+        self._errors = errors
+
+    def decode(self, input, errors='strict'):
+        if self.streamreader is None:
+            if self.encoding is None or not self.force:
+                (encoding, explicit) = detectencoding_str(input, False)
+                if encoding is None: # no encoding determined yet
+                    return ("", 0) # no encoding determined yet, so no output
+                elif encoding == "css":
+                    raise ValueError("css not allowed as encoding name")
+                if (explicit and not self.force) or self.encoding is None: # Take the encoding from the input
+                    self.encoding = encoding
+            streamreader = codecs.getreader(self.encoding)
+            streamreader = streamreader(self.stream, self._errors)
+            (output, consumed) = streamreader.decode(input, errors)
+            encoding = self.encoding
+            if encoding.replace("_", "-").lower() == "utf-8-sig":
+                encoding = "utf-8"
+            newoutput = _fixencoding(output, str(encoding), False)
+            if newoutput is not None:
+                self.streamreader = streamreader
+                return (newoutput, consumed)
+            return ("", 0) # we will create a new streamreader on the next call
+        return self.streamreader.decode(input, errors)
+
+    def _geterrors(self):
+        return self._errors
+
+    def _seterrors(self, errors):
+        # Setting ``errors`` must be done on the streamreader too
+        try:
+            if self.streamreader is not None:
+                self.streamreader.errors = errors
+        except AttributeError as e:
+            # TODO: py3 only exception?
+            pass
+        
+        self._errors = errors
+    errors = property(_geterrors, _seterrors)
+
+
+if hasattr(codecs, "CodecInfo"):
+    # We're running on Python 2.5 or better
+    def search_function(name):
+        if name == "css":
+            return codecs.CodecInfo(
+                name="css",
+                encode=encode,
+                decode=decode,
+                incrementalencoder=IncrementalEncoder,
+                incrementaldecoder=IncrementalDecoder,
+                streamwriter=StreamWriter,
+                streamreader=StreamReader,
+            )
+else:
+    # If we're running on Python 2.4, define the utf-8-sig codec here
+    def utf8sig_encode(input, errors='strict'):
+        return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input))
+
+    def utf8sig_decode(input, errors='strict'):
+        prefix = 0
+        if input[:3] == codecs.BOM_UTF8:
+            input = input[3:]
+            prefix = 3
+        (output, consumed) = codecs.utf_8_decode(input, errors, True)
+        return (output, consumed+prefix)
+
+    class UTF8SigStreamWriter(codecs.StreamWriter):
+        def reset(self):
+            codecs.StreamWriter.reset(self)
+            try:
+                del self.encode
+            except AttributeError:
+                pass
+
+        def encode(self, input, errors='strict'):
+            self.encode = codecs.utf_8_encode
+            return utf8sig_encode(input, errors)
+
+    class UTF8SigStreamReader(codecs.StreamReader):
+        def reset(self):
+            codecs.StreamReader.reset(self)
+            try:
+                del self.decode
+            except AttributeError:
+                pass
+
+        def decode(self, input, errors='strict'):
+            if len(input) < 3 and codecs.BOM_UTF8.startswith(input):
+                # not enough data to decide if this is a BOM
+                # => try again on the next call
+                return ("", 0)
+            self.decode = codecs.utf_8_decode
+            return utf8sig_decode(input, errors)
+
+    def search_function(name):
+        import encodings
+        name = encodings.normalize_encoding(name)
+        if name == "css":
+            return (encode, decode, StreamReader, StreamWriter)
+        elif name == "utf_8_sig":
+            return (utf8sig_encode, utf8sig_decode, UTF8SigStreamReader, UTF8SigStreamWriter)
+
+
+codecs.register(search_function)
+
+
+# Error handler for CSS escaping
+
+def cssescape(exc):
+    if not isinstance(exc, UnicodeEncodeError):
+        raise TypeError("don't know how to handle %r" % exc)
+    return ("".join("\\%06x" % ord(c) for c in exc.object[exc.start:exc.end]), exc.end)
+
+codecs.register_error("cssescape", cssescape)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/settings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/settings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/settings.py	(revision 1126)
@@ -0,0 +1,15 @@
+"""Experimental settings for special stuff."""
+
+def set(key, value):
+    """Call to enable special settings:
+    
+    ('DXImageTransform.Microsoft', True)
+        enable support for parsing special MS only filter values
+    
+    Clears the tokenizer cache which holds the compiled productions!
+    """
+    if key == 'DXImageTransform.Microsoft' and value == True:
+        import cssproductions
+        import tokenize2
+        tokenize2._TOKENIZER_CACHE.clear()
+        cssproductions.PRODUCTIONS.insert(1, cssproductions._DXImageTransform)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/cssparse.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/cssparse.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/cssparse.py	(revision 1126)
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+"""utility script to parse given filenames or string
+"""
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssutils
+import logging
+import optparse
+import sys
+
+def main(args=None):
+    """
+    Parses given filename(s) or string or URL (using optional encoding) and 
+    prints the parsed style sheet to stdout.
+
+    Redirect stdout to save CSS. Redirect stderr to save parser log infos.
+    """
+    usage = """usage: %prog [options] filename1.css [filename2.css ...]
+        [>filename_combined.css] [2>parserinfo.log] """
+    p = optparse.OptionParser(usage=usage)
+    p.add_option('-s', '--string', action='store_true', dest='string',
+        help='parse given string')
+    p.add_option('-u', '--url', action='store', dest='url',
+        help='parse given url')
+    p.add_option('-e', '--encoding', action='store', dest='encoding',
+        help='encoding of the file or override encoding found')
+    p.add_option('-m', '--minify', action='store_true', dest='minify',
+        help='minify parsed CSS', default=False)
+    p.add_option('-d', '--debug', action='store_true', dest='debug',
+        help='activate debugging output')
+
+    (options, params) = p.parse_args(args)
+
+    if not params and not options.url:
+        p.error("no filename given")
+
+    if options.debug:
+        p = cssutils.CSSParser(loglevel=logging.DEBUG)
+    else:
+        p = cssutils.CSSParser()
+
+    if options.minify:
+        cssutils.ser.prefs.useMinified()
+
+    if options.string:
+        sheet = p.parseString(u''.join(params), encoding=options.encoding)
+        print sheet.cssText
+    elif options.url:
+        sheet = p.parseUrl(options.url, encoding=options.encoding)
+        print sheet.cssText
+    else:
+        for filename in params:
+            sys.stderr.write('=== CSS FILE: "%s" ===\n' % filename)
+            sheet = p.parseFile(filename, encoding=options.encoding)
+            print sheet.cssText
+            print
+            sys.stderr.write('\n')
+
+
+if __name__ == "__main__":
+     sys.exit(main())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/csscombine.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/csscombine.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/csscombine.py	(revision 1126)
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+"""Combine all sheets referred to a given CSS *proxy* sheet
+into a single new sheet.
+
+- no ``url()`` values are adjusted so currently when using relative references
+  for e.g. images it is best to have all sheets in a single folder 
+- in @import rules only relative paths do work for now but should be used
+  anyway
+- messages are send to stderr
+- output to stdout.
+
+Example::
+
+    csscombine sheets\csscombine-proxy.css -m -t ascii -s utf-8
+        1>combined.css 2>log.txt
+
+results in log.txt::
+
+    COMBINING sheets/csscombine-proxy.css
+    USING SOURCE ENCODING: css
+    * PROCESSING @import sheets\csscombine-1.css
+    * PROCESSING @import sheets\csscombine-2.css
+    INFO    Nested @imports are not combined: @import "1.css";
+    SETTING TARGET ENCODING: ascii
+
+and combined.css::
+
+    @charset "ascii";@import"1.css";@namespaces2"uri";s2|sheet-1{top:1px}s2|sheet-2{top:2px}proxy{top:3px}
+
+or without option -m::
+
+    @charset "ascii";
+    @import "1.css";
+    @namespace s2 "uri";
+    @namespace other "other";
+    /* proxy sheet were imported sheets should be combined */
+    /* non-ascii chars: \F6 \E4 \FC  */
+    /* @import "csscombine-1.css"; */
+    /* combined sheet 1 */
+    s2|sheet-1 {
+        top: 1px
+        }
+    /* @import url(csscombine-2.css); */
+    /* combined sheet 2 */
+    s2|sheet-2 {
+        top: 2px
+        }
+    proxy {
+        top: 3px
+        }
+
+"""
+__all__ = ['csscombine']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.script import csscombine
+import optparse
+import sys
+
+def main(args=None):
+    usage = "usage: %prog [options] [path]"
+    parser = optparse.OptionParser(usage=usage)
+    parser.add_option('-u', '--url', action='store',
+        dest='url', 
+        help='URL to parse (path is ignored if URL given)')
+    parser.add_option('-s', '--sourceencoding', action='store',
+        dest='sourceencoding', 
+        help='encoding of input, defaulting to "css". If given overwrites other encoding information like @charset declarations')
+    parser.add_option('-t', '--targetencoding', action='store',
+        dest='targetencoding',
+        help='encoding of output, defaulting to "UTF-8"', default='utf-8')
+    parser.add_option('-m', '--minify', action='store_true', dest='minify',
+        default=False,
+        help='saves minified version of combined files, defaults to False')
+    options, path = parser.parse_args()
+
+    if options.url:
+        print csscombine(url=options.url,
+                         sourceencoding=options.sourceencoding, 
+                         targetencoding=options.targetencoding,
+                         minify=options.minify)
+    elif path:
+        print csscombine(path=path[0],
+                         sourceencoding=options.sourceencoding, 
+                         targetencoding=options.targetencoding,
+                         minify=options.minify)
+    else:
+        parser.error('no path or URL (-u) given')
+
+
+
+if __name__ == '__main__':
+    sys.exit(main())
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/csscapture.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/csscapture.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/csscapture.py	(revision 1126)
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+"""Retrieve all CSS stylesheets including embedded for a given URL.
+Retrieve as StyleSheetList or save to disk - raw, parsed or minified version.
+
+TODO:
+- maybe use DOM 3 load/save?
+- logger class which handles all cases when no log is given...
+- saveto: why does urllib2 hang?
+"""
+__all__ = ['CSSCapture']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.script import CSSCapture
+import logging
+import optparse
+import sys
+
+def main(args=None):
+    usage = "usage: %prog [options] URL"
+    parser = optparse.OptionParser(usage=usage)
+    parser.add_option('-d', '--debug', action='store_true', dest='debug',
+        help='show debug messages during capturing')
+    parser.add_option('-m', '--minified', action='store_true', dest='minified',
+        help='saves minified version of captured files')
+    parser.add_option('-n', '--notsave', action='store_true', dest='notsave',
+        help='if given files are NOT saved, only log is written')
+#    parser.add_option('-r', '--saveraw', action='store_true', dest='saveraw',
+#        help='if given saves raw css otherwise cssutils\' parsed files')
+    parser.add_option('-s', '--saveto', action='store', dest='saveto',
+        help='saving retrieved files to "saveto", defaults to "_CSSCapture_SAVED"')
+    parser.add_option('-u', '--useragent', action='store', dest='ua',
+        help='useragent to use for request of URL, default is urllib2s default')
+    options, url = parser.parse_args()
+    
+    # TODO:
+    options.saveraw = False 
+
+    if not url:
+        parser.error('no URL given')
+    else:
+        url = url[0]
+
+    if options.debug:
+        level = logging.DEBUG
+    else:
+        level = logging.INFO
+
+    # START
+    c = CSSCapture(ua=options.ua, defaultloglevel=level)
+
+    stylesheetlist = c.capture(url)
+
+    if options.notsave is None or not options.notsave:
+        if options.saveto:
+            saveto = options.saveto
+        else:
+            saveto = u'_CSSCapture_SAVED'
+        c.saveto(saveto, saveraw=options.saveraw, minified=options.minified)
+    else:
+        for i, s in enumerate(stylesheetlist):
+            print u'''%s.
+    encoding: %r
+    title: %r
+    href: %r''' % (i + 1, s.encoding, s.title, s.href)
+
+
+if __name__ == "__main__":
+    sys.exit(main())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/scripts/__init__.py	(revision 1126)
@@ -0,0 +1,4 @@
+from csscombine import csscombine
+__all__ = ["csscapture", "csscombine", "cssparse"]
+ 
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csscharsetrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csscharsetrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csscharsetrule.py	(revision 1126)
@@ -0,0 +1,159 @@
+"""CSSCharsetRule implements DOM Level 2 CSS CSSCharsetRule."""
+__all__ = ['CSSCharsetRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import codecs
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSCharsetRule(cssrule.CSSRule):
+    """
+    The CSSCharsetRule interface represents an @charset rule in a CSS style
+    sheet. The value of the encoding attribute does not affect the encoding
+    of text data in the DOM objects; this encoding is always UTF-16
+    (also in Python?). After a stylesheet is loaded, the value of the
+    encoding attribute is the value found in the @charset rule. If there
+    was no @charset in the original document, then no CSSCharsetRule is
+    created. The value of the encoding attribute may also be used as a hint
+    for the encoding used on serialization of the style sheet.
+
+    The value of the @charset rule (and therefore of the CSSCharsetRule)
+    may not correspond to the encoding the document actually came in;
+    character encoding information e.g. in an HTTP header, has priority
+    (see CSS document representation) but this is not reflected in the
+    CSSCharsetRule.
+    
+    This rule is not really needed anymore as setting 
+    :attr:`CSSStyleSheet.encoding` is much easier.
+
+    Format::
+
+        charsetrule:
+            CHARSET_SYM S* STRING S* ';'
+
+    BUT: Only valid format is (single space, double quotes!)::
+    
+        @charset "ENCODING";
+    """
+    def __init__(self, encoding=None, parentRule=None, 
+                 parentStyleSheet=None, readonly=False):
+        """
+        :param encoding:
+            a valid character encoding
+        :param readonly:
+            defaults to False, not used yet
+        """
+        super(CSSCharsetRule, self).__init__(parentRule=parentRule, 
+                                             parentStyleSheet=parentStyleSheet)
+        self._atkeyword = '@charset'
+        
+        if encoding:
+            self.encoding = encoding
+        else:
+            self._encoding = None
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(encoding=%r)" % (
+                self.__class__.__name__, 
+                self.encoding)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object encoding=%r at 0x%x>" % (
+                self.__class__.__name__, 
+                self.encoding, 
+                id(self))
+
+    def _getCssText(self):
+        """The parsable textual representation."""
+        return cssutils.ser.do_CSSCharsetRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :param cssText:
+            A parsable DOMString.
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        super(CSSCharsetRule, self)._setCssText(cssText)
+
+        wellformed = True
+        tokenizer = self._tokenize2(cssText)
+        
+        if self._type(self._nexttoken(tokenizer)) != self._prods.CHARSET_SYM: 
+            wellformed = False
+            self._log.error(u'CSSCharsetRule must start with "@charset "',
+                            error=xml.dom.InvalidModificationErr)
+        
+        encodingtoken = self._nexttoken(tokenizer)
+        encodingtype = self._type(encodingtoken)
+        encoding = self._stringtokenvalue(encodingtoken)
+        if self._prods.STRING != encodingtype or not encoding:
+            wellformed = False
+            self._log.error(u'CSSCharsetRule: no encoding found; %r.' % 
+                            self._valuestr(cssText))
+            
+        semicolon = self._tokenvalue(self._nexttoken(tokenizer))
+        EOFtype = self._type(self._nexttoken(tokenizer))
+        if u';' != semicolon or EOFtype not in ('EOF', None):
+            wellformed = False
+            self._log.error(u'CSSCharsetRule: Syntax Error: %r.' % 
+                            self._valuestr(cssText))
+        
+        if wellformed:
+            self.encoding = encoding
+            
+    cssText = property(fget=_getCssText, fset=_setCssText,
+                       doc=u"(DOM) The parsable textual representation.")
+
+    def _setEncoding(self, encoding):
+        """
+        :param encoding:
+            a valid encoding to be used. Currently only valid Python encodings
+            are allowed.
+        :exceptions:
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this encoding rule is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified encoding value has a syntax error and
+              is unparsable.  
+        """
+        self._checkReadonly()
+        tokenizer = self._tokenize2(encoding)
+        encodingtoken = self._nexttoken(tokenizer)
+        unexpected = self._nexttoken(tokenizer)
+
+        if not encodingtoken or unexpected or\
+           self._prods.IDENT != self._type(encodingtoken):
+            self._log.error(u'CSSCharsetRule: Syntax Error in encoding value '
+                            u'%r.' % encoding)
+        else:
+            try:
+                codecs.lookup(encoding)
+            except LookupError:
+                self._log.error(u'CSSCharsetRule: Unknown (Python) encoding %r.'
+                                % encoding)
+            else:
+                self._encoding = encoding.lower()
+
+    encoding = property(lambda self: self._encoding, _setEncoding,
+        doc=u"(DOM)The encoding information used in this @charset rule.")
+
+    type = property(lambda self: self.CHARSET_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+
+    wellformed = property(lambda self: bool(self.encoding))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssnamespacerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssnamespacerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssnamespacerule.py	(revision 1126)
@@ -0,0 +1,295 @@
+"""CSSNamespaceRule currently implements http://dev.w3.org/csswg/css3-namespace/
+"""
+__all__ = ['CSSNamespaceRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSNamespaceRule(cssrule.CSSRule):
+    """
+    Represents an @namespace rule within a CSS style sheet.
+
+    The @namespace at-rule declares a namespace prefix and associates
+    it with a given namespace (a string). This namespace prefix can then be
+    used in namespace-qualified names such as those described in the
+    Selectors Module [SELECT] or the Values and Units module [CSS3VAL].
+    
+    Dealing with these rules directly is not needed anymore, easier is 
+    the use of :attr:`cssutils.css.CSSStyleSheet.namespaces`.
+
+    Format::
+
+        namespace
+          : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S*
+          ;
+        namespace_prefix
+          : IDENT
+          ;
+    """
+    def __init__(self, namespaceURI=None, prefix=None, cssText=None, 
+                 parentRule=None, parentStyleSheet=None, readonly=False):
+        """
+        :Parameters:
+            namespaceURI
+                The namespace URI (a simple string!) which is bound to the
+                given prefix. If no prefix is set
+                (``CSSNamespaceRule.prefix==''``) the namespace defined by
+                namespaceURI is set as the default namespace
+            prefix
+                The prefix used in the stylesheet for the given
+                ``CSSNamespaceRule.uri``.
+            cssText
+                if no namespaceURI is given cssText must be given to set
+                a namespaceURI as this is readonly later on
+            parentStyleSheet
+                sheet where this rule belongs to
+
+        Do not use as positional but as keyword parameters only!
+
+        If readonly allows setting of properties in constructor only
+
+        format namespace::
+
+            namespace
+              : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S*
+              ;
+            namespace_prefix
+              : IDENT
+              ;
+        """
+        super(CSSNamespaceRule, self).__init__(parentRule=parentRule, 
+                                               parentStyleSheet=parentStyleSheet)
+        self._atkeyword = u'@namespace'
+        self._prefix = u''
+        self._namespaceURI = None
+        
+        if namespaceURI:
+            self.namespaceURI = namespaceURI
+            self.prefix = prefix
+            tempseq = self._tempSeq()
+            tempseq.append(self.prefix, 'prefix')
+            tempseq.append(self.namespaceURI, 'namespaceURI')
+            self._setSeq(tempseq)
+            
+        elif cssText is not None:
+            self.cssText = cssText
+
+        if parentStyleSheet:
+            self._parentStyleSheet = parentStyleSheet
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(namespaceURI=%r, prefix=%r)" % (
+                self.__class__.__name__,
+                self.namespaceURI,
+                self.prefix)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object namespaceURI=%r prefix=%r at 0x%x>" % (
+                self.__class__.__name__,
+                self.namespaceURI,
+                self.prefix,
+                id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText"""
+        return cssutils.ser.do_CSSNamespaceRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :param cssText: initial value for this rules cssText which is parsed
+        :exceptions:
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+        """
+        super(CSSNamespaceRule, self)._setCssText(cssText)
+        tokenizer = self._tokenize2(cssText)
+        attoken = self._nexttoken(tokenizer, None)
+        if self._type(attoken) != self._prods.NAMESPACE_SYM:
+            self._log.error(u'CSSNamespaceRule: No CSSNamespaceRule found: %s' %
+                            self._valuestr(cssText),
+                            error=xml.dom.InvalidModificationErr)
+        else:
+            # for closures: must be a mutable
+            new = {'keyword': self._tokenvalue(attoken),
+                   'prefix': u'',
+                   'uri': None,
+                   'wellformed': True
+                   }
+
+            def _ident(expected, seq, token, tokenizer=None):
+                # the namespace prefix, optional
+                if 'prefix or uri' == expected:
+                    new['prefix'] = self._tokenvalue(token)
+                    seq.append(new['prefix'], 'prefix')
+                    return 'uri'
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'CSSNamespaceRule: Unexpected ident.', token)
+                    return expected
+
+            def _string(expected, seq, token, tokenizer=None):
+                # the namespace URI as a STRING
+                if expected.endswith('uri'):
+                    new['uri'] = self._stringtokenvalue(token)
+                    seq.append(new['uri'], 'namespaceURI')
+                    return ';'
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'CSSNamespaceRule: Unexpected string.', token)
+                    return expected
+
+            def _uri(expected, seq, token, tokenizer=None):
+                # the namespace URI as URI which is DEPRECATED
+                if expected.endswith('uri'):
+                    uri = self._uritokenvalue(token)
+                    new['uri'] = uri
+                    seq.append(new['uri'], 'namespaceURI')
+                    return ';'
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'CSSNamespaceRule: Unexpected URI.', token)
+                    return expected
+
+            def _char(expected, seq, token, tokenizer=None):
+                # final ;
+                val = self._tokenvalue(token)
+                if ';' == expected and u';' == val:
+                    return 'EOF'
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'CSSNamespaceRule: Unexpected char.', token)
+                    return expected
+
+            # "NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S*"
+            newseq = self._tempSeq()
+            wellformed, expected = self._parse(expected='prefix or uri',
+                seq=newseq, tokenizer=tokenizer,
+                productions={'IDENT': _ident,
+                             'STRING': _string,
+                             'URI': _uri,
+                             'CHAR': _char},
+                new=new)
+
+            # wellformed set by parse
+            wellformed = wellformed and new['wellformed']
+
+            # post conditions
+            if new['uri'] is None:
+                wellformed = False
+                self._log.error(u'CSSNamespaceRule: No namespace URI found: %s'
+                                % self._valuestr(cssText))
+
+            if expected != 'EOF':
+                wellformed = False
+                self._log.error(u'CSSNamespaceRule: No ";" found: %s' %
+                                self._valuestr(cssText))
+
+            # set all
+            if wellformed:
+                self.atkeyword = new['keyword']
+                self._prefix = new['prefix']
+                self.namespaceURI = new['uri']
+                self._setSeq(newseq)
+
+    cssText = property(fget=_getCssText, fset=_setCssText,
+                       doc=u"(DOM) The parsable textual representation of this "
+                           u"rule.")
+
+    def _setNamespaceURI(self, namespaceURI):
+        """
+        :param namespaceURI: the initial value for this rules namespaceURI
+        :exceptions:
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              (CSSRule) Raised if this rule is readonly or a namespaceURI is 
+              already set in this rule.
+        """
+        self._checkReadonly()
+        if not self._namespaceURI:
+            # initial setting
+            self._namespaceURI = namespaceURI
+            tempseq = self._tempSeq()
+            tempseq.append(namespaceURI, 'namespaceURI')
+            self._setSeq(tempseq) # makes seq readonly!
+        elif self._namespaceURI != namespaceURI:
+            self._log.error(u'CSSNamespaceRule: namespaceURI is readonly.',
+                            error=xml.dom.NoModificationAllowedErr)
+
+    namespaceURI = property(lambda self: self._namespaceURI, _setNamespaceURI,
+        doc="URI (handled as simple string) of the defined namespace.")
+
+    def _replaceNamespaceURI(self, namespaceURI):
+        """Used during parse of new sheet only!
+        
+        :param namespaceURI: the new value for this rules namespaceURI
+        """
+        self._namespaceURI = namespaceURI
+        for i, x in enumerate(self._seq):
+            if 'namespaceURI' == x.type:
+                self._seq._readonly = False 
+                self._seq.replace(i, namespaceURI, 'namespaceURI')
+                self._seq._readonly = True
+                break
+
+    def _setPrefix(self, prefix=None):
+        """
+        :param prefix: the new prefix 
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this rule is readonly.
+        """
+        self._checkReadonly()
+        if not prefix:
+            prefix = u''
+        else:        
+            tokenizer = self._tokenize2(prefix)
+            prefixtoken = self._nexttoken(tokenizer, None)
+            if not prefixtoken or self._type(prefixtoken) != self._prods.IDENT:
+                self._log.error(u'CSSNamespaceRule: No valid prefix "%s".' %
+                                self._valuestr(prefix),
+                                error=xml.dom.SyntaxErr)
+                return
+            else:
+                prefix = self._tokenvalue(prefixtoken)
+        # update seq
+        for i, x in enumerate(self._seq):
+            if x == self._prefix:
+                self._seq[i] = (prefix, 'prefix', None, None)
+                break
+        else:
+            # put prefix at the beginning!
+            self._seq[0] = (prefix, 'prefix', None, None) 
+
+        # set new prefix
+        self._prefix = prefix
+
+    prefix = property(lambda self: self._prefix, _setPrefix,
+                      doc=u"Prefix used for the defined namespace.")
+
+    type = property(lambda self: self.NAMESPACE_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+    
+    wellformed = property(lambda self: self.namespaceURI is not None)
+    
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/__init__.py	(revision 1126)
@@ -0,0 +1,80 @@
+"""Implements Document Object Model Level 2 CSS
+http://www.w3.org/TR/2000/PR-DOM-Level-2-Style-20000927/css.html
+
+currently implemented
+    - CSSStyleSheet
+    - CSSRuleList
+    - CSSRule
+    - CSSComment (cssutils addon)
+    - CSSCharsetRule
+    - CSSFontFaceRule
+    - CSSImportRule
+    - CSSMediaRule
+    - CSSNamespaceRule (WD)
+    - CSSPageRule
+    - CSSStyleRule
+    - CSSUnkownRule
+    - Selector and SelectorList
+    - CSSStyleDeclaration
+    - CSS2Properties
+    - CSSValue
+    - CSSPrimitiveValue
+    - CSSValueList
+    - CSSVariablesRule
+    - CSSVariablesDeclaration
+
+todo
+    - RGBColor, Rect, Counter
+"""
+__all__ = [
+    'CSSStyleSheet',
+    'CSSRuleList',
+    'CSSRule',
+    'CSSComment',
+    'CSSCharsetRule',
+    'CSSFontFaceRule'
+    'CSSImportRule',
+    'CSSMediaRule',
+    'CSSNamespaceRule',
+    'CSSPageRule',
+    'MarginRule',
+    'CSSStyleRule',
+    'CSSUnknownRule',
+    'CSSVariablesRule',
+    'CSSVariablesDeclaration',
+    'Selector', 'SelectorList',
+    'CSSStyleDeclaration', 'Property',
+    #'CSSValue', 'CSSPrimitiveValue', 'CSSValueList'
+    'PropertyValue',
+           'Value',
+           'ColorValue',
+           'DimensionValue',
+           'URIValue',
+           'CSSFunction', 
+           'CSSVariable',
+           'MSValue'
+    ]
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssstylesheet import *
+from cssrulelist import *
+from cssrule import *
+from csscomment import *
+from csscharsetrule import *
+from cssfontfacerule import *
+from cssimportrule import *
+from cssmediarule import *
+from cssnamespacerule import *
+from csspagerule import *
+from marginrule import *
+from cssstylerule import *
+from cssvariablesrule import *
+from cssunknownrule import *
+from selector import *
+from selectorlist import *
+from cssstyledeclaration import *
+from cssvariablesdeclaration import *
+from property import *
+#from cssvalue import *
+from value import *
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssunknownrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssunknownrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssunknownrule.py	(revision 1126)
@@ -0,0 +1,209 @@
+"""CSSUnknownRule implements DOM Level 2 CSS CSSUnknownRule."""
+__all__ = ['CSSUnknownRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSUnknownRule(cssrule.CSSRule):
+    """
+    Represents an at-rule not supported by this user agent, so in 
+    effect all other at-rules not defined in cssutils.
+
+    Format::
+
+        @xxx until ';' or block {...}
+    """
+    def __init__(self, cssText=u'', parentRule=None, 
+                 parentStyleSheet=None, readonly=False):
+        """
+        :param cssText:
+            of type string
+        """
+        super(CSSUnknownRule, self).__init__(parentRule=parentRule, 
+                                             parentStyleSheet=parentStyleSheet)
+        self._atkeyword = None
+        if cssText:
+            self.cssText = cssText
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(cssText=%r)" % (
+                self.__class__.__name__,
+                self.cssText)
+        
+    def __str__(self):
+        return u"<cssutils.css.%s object cssText=%r at 0x%x>" % (
+                self.__class__.__name__,
+                self.cssText,
+                id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSUnknownRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        super(CSSUnknownRule, self)._setCssText(cssText)
+        tokenizer = self._tokenize2(cssText)
+        attoken = self._nexttoken(tokenizer, None)
+        if not attoken or self._type(attoken) != self._prods.ATKEYWORD:
+            self._log.error(u'CSSUnknownRule: No CSSUnknownRule found: %s' %
+                self._valuestr(cssText),
+                error=xml.dom.InvalidModificationErr)
+        else:
+            # for closures: must be a mutable
+            new = {'nesting': [], # {} [] or ()
+                   'wellformed': True
+                   }
+
+            def CHAR(expected, seq, token, tokenizer=None):
+                type_, val, line, col = token
+                if expected != 'EOF':
+                    if val in u'{[(':
+                        new['nesting'].append(val)
+                    elif val in u'}])':
+                        opening = {u'}': u'{', u']': u'[', u')': u'('}[val]
+                        try:
+                            if new['nesting'][-1] == opening:
+                                new['nesting'].pop()
+                            else:
+                                raise IndexError()
+                        except IndexError:
+                            new['wellformed'] = False
+                            self._log.error(u'CSSUnknownRule: Wrong nesting of '
+                                            u'{, [ or (.', token=token)
+    
+                    if val in u'};' and not new['nesting']:
+                        expected = 'EOF' 
+    
+                    seq.append(val, type_, line=line, col=col)
+                    return expected
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'CSSUnknownRule: Expected end of rule.',
+                                    token=token)
+                    return expected
+
+            def FUNCTION(expected, seq, token, tokenizer=None):
+                # handled as opening (
+                type_, val, line, col = token
+                val = self._tokenvalue(token)
+                if expected != 'EOF':
+                    new['nesting'].append(u'(')
+                    seq.append(val, type_, line=line, col=col)
+                    return expected
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'CSSUnknownRule: Expected end of rule.',
+                                    token=token)
+                    return expected                
+
+            def EOF(expected, seq, token, tokenizer=None):
+                "close all blocks and return 'EOF'"
+                for x in reversed(new['nesting']):
+                    closing = {u'{': u'}', u'[': u']', u'(': u')'}[x]
+                    seq.append(closing, closing)
+                new['nesting'] = []
+                return 'EOF'
+                
+            def INVALID(expected, seq, token, tokenizer=None):
+                # makes rule invalid
+                self._log.error(u'CSSUnknownRule: Bad syntax.',
+                                token=token, error=xml.dom.SyntaxErr)
+                new['wellformed'] = False
+                return expected
+
+            def STRING(expected, seq, token, tokenizer=None):
+                type_, val, line, col = token
+                val = self._stringtokenvalue(token)
+                if expected != 'EOF':
+                    seq.append(val, type_, line=line, col=col)
+                    return expected
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'CSSUnknownRule: Expected end of rule.',
+                                    token=token)
+                    return expected                
+
+            def URI(expected, seq, token, tokenizer=None):
+                type_, val, line, col = token
+                val = self._uritokenvalue(token)
+                if expected != 'EOF':
+                    seq.append(val, type_, line=line, col=col)
+                    return expected
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'CSSUnknownRule: Expected end of rule.',
+                                    token=token)
+                    return expected                
+
+            def default(expected, seq, token, tokenizer=None):
+                type_, val, line, col = token
+                if expected != 'EOF':
+                    seq.append(val, type_, line=line, col=col)
+                    return expected
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'CSSUnknownRule: Expected end of rule.',
+                                    token=token)
+                    return expected                
+
+            # unknown : ATKEYWORD S* ... ; | }
+            newseq = self._tempSeq()
+            wellformed, expected = self._parse(expected=None,
+                seq=newseq, tokenizer=tokenizer,
+                productions={'CHAR': CHAR,
+                             'EOF': EOF,
+                             'FUNCTION': FUNCTION,
+                             'INVALID': INVALID,
+                             'STRING': STRING,
+                             'URI': URI,
+                             'S': default # overwrite default default!
+                }, 
+                default=default,
+                new=new)
+
+            # wellformed set by parse
+            wellformed = wellformed and new['wellformed']
+            
+            # post conditions
+            if expected != 'EOF':
+                wellformed = False
+                self._log.error(u'CSSUnknownRule: No ending ";" or "}" found: '
+                                u'%r' % self._valuestr(cssText))
+            elif new['nesting']:
+                wellformed = False
+                self._log.error(u'CSSUnknownRule: Unclosed "{", "[" or "(": %r'
+                                % self._valuestr(cssText))
+
+            # set all
+            if wellformed:
+                self.atkeyword = self._tokenvalue(attoken)
+                self._setSeq(newseq)
+
+    cssText = property(fget=_getCssText, fset=_setCssText,
+                       doc=u"(DOM) The parsable textual representation.")
+    
+    type = property(lambda self: self.UNKNOWN_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+    
+    wellformed = property(lambda self: bool(self.atkeyword))
+    
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstylerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstylerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstylerule.py	(revision 1126)
@@ -0,0 +1,234 @@
+"""CSSStyleRule implements DOM Level 2 CSS CSSStyleRule."""
+__all__ = ['CSSStyleRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssstyledeclaration import CSSStyleDeclaration
+from selectorlist import SelectorList
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSStyleRule(cssrule.CSSRule):
+    """The CSSStyleRule object represents a ruleset specified (if any) in a CSS
+    style sheet. It provides access to a declaration block as well as to the
+    associated group of selectors.
+
+    Format::
+
+        : selector [ COMMA S* selector ]*
+        LBRACE S* declaration [ ';' S* declaration ]* '}' S*
+        ;
+    """
+    def __init__(self, selectorText=None, style=None, parentRule=None,
+                 parentStyleSheet=None, readonly=False):
+        """
+        :Parameters:
+            selectorText
+                string parsed into selectorList
+            style
+                string parsed into CSSStyleDeclaration for this CSSStyleRule
+            readonly
+                if True allows setting of properties in constructor only
+        """
+        super(CSSStyleRule, self).__init__(parentRule=parentRule,
+                                           parentStyleSheet=parentStyleSheet)
+
+        self.selectorList = SelectorList()
+        if selectorText:
+            self.selectorText = selectorText
+
+        if style:
+            self.style = style
+        else:
+            self.style = CSSStyleDeclaration()
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        if self._namespaces:
+            st = (self.selectorText, self._namespaces)
+        else:
+            st = self.selectorText
+        return u"cssutils.css.%s(selectorText=%r, style=%r)" % (
+                self.__class__.__name__, st, self.style.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object selectorText=%r style=%r _namespaces=%r "\
+               u"at 0x%x>" % (self.__class__.__name__,
+                              self.selectorText,
+                              self.style.cssText,
+                              self._namespaces,
+                              id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSStyleRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :param cssText:
+            a parseable string or a tuple of (cssText, dict-of-namespaces)
+        :exceptions:
+            - :exc:`~xml.dom.NamespaceErr`:
+              Raised if the specified selector uses an unknown namespace
+              prefix.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        super(CSSStyleRule, self)._setCssText(cssText)
+
+        # might be (cssText, namespaces)
+        cssText, namespaces = self._splitNamespacesOff(cssText)
+        try:
+            # use parent style sheet ones if available
+            namespaces = self.parentStyleSheet.namespaces
+        except AttributeError:
+            pass
+
+        tokenizer = self._tokenize2(cssText)
+        selectortokens = self._tokensupto2(tokenizer, blockstartonly=True)
+        styletokens = self._tokensupto2(tokenizer, blockendonly=True)
+        trail = self._nexttoken(tokenizer)
+        if trail:
+            self._log.error(u'CSSStyleRule: Trailing content: %s' %
+                            self._valuestr(cssText), token=trail)
+        elif not selectortokens:
+            self._log.error(u'CSSStyleRule: No selector found: %r' %
+                            self._valuestr(cssText))
+        elif self._tokenvalue(selectortokens[0]).startswith(u'@'):
+            self._log.error(u'CSSStyleRule: No style rule: %r' %
+                            self._valuestr(cssText),
+                            error=xml.dom.InvalidModificationErr)
+        else:
+            newSelectorList = SelectorList(parentRule=self)
+            newStyle = CSSStyleDeclaration(parentRule=self)
+            ok = True
+
+            bracetoken = selectortokens.pop()
+            if self._tokenvalue(bracetoken) != u'{':
+                ok = False
+                self._log.error(
+                    u'CSSStyleRule: No start { of style declaration found: %r' %
+                    self._valuestr(cssText), bracetoken)
+            elif not selectortokens:
+                ok = False
+                self._log.error(u'CSSStyleRule: No selector found: %r.' %
+                            self._valuestr(cssText), bracetoken)
+            # SET
+            newSelectorList.selectorText = (selectortokens,
+                                              namespaces)
+
+            if not styletokens:
+                ok = False
+                self._log.error(
+                    u'CSSStyleRule: No style declaration or "}" found: %r' %
+                    self._valuestr(cssText))
+            else:
+                braceorEOFtoken = styletokens.pop()
+                val, typ = self._tokenvalue(braceorEOFtoken),\
+                           self._type(braceorEOFtoken)
+                if val != u'}' and typ != 'EOF':
+                    ok = False
+                    self._log.error(u'CSSStyleRule: No "}" after style '
+                                    u'declaration found: %r'
+                                    % self._valuestr(cssText))
+                else:
+                    if 'EOF' == typ:
+                        # add again as style needs it
+                        styletokens.append(braceorEOFtoken)
+                    # SET, may raise:
+                    newStyle.cssText = styletokens
+
+            if ok:
+                self.selectorList = newSelectorList
+                self.style = newStyle
+
+    cssText = property(_getCssText, _setCssText,
+                       doc=u"(DOM) The parsable textual representation of this "
+                       u"rule.")
+
+    def __getNamespaces(self):
+        """Uses children namespaces if not attached to a sheet, else the sheet's
+        ones."""
+        try:
+            return self.parentStyleSheet.namespaces
+        except AttributeError:
+            return self.selectorList._namespaces
+
+    _namespaces = property(__getNamespaces,
+                           doc=u"If this Rule is attached to a CSSStyleSheet "
+                               u"the namespaces of that sheet are mirrored "
+                               u"here. While the Rule is not attached the "
+                               u"namespaces of selectorList are used.""")
+
+    def _setSelectorList(self, selectorList):
+        """
+        :param selectorList: A SelectorList which replaces the current
+            selectorList object
+        """
+        self._checkReadonly()
+        selectorList._parentRule = self
+        self._selectorList = selectorList
+
+    _selectorList = None
+    selectorList = property(lambda self: self._selectorList, _setSelectorList,
+                            doc=u"The SelectorList of this rule.")
+
+    def _setSelectorText(self, selectorText):
+        """
+        wrapper for cssutils SelectorList object
+
+        :param selectorText:
+            of type string, might also be a comma separated list
+            of selectors
+        :exceptions:
+            - :exc:`~xml.dom.NamespaceErr`:
+              Raised if the specified selector uses an unknown namespace
+              prefix.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error
+              and is unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this rule is readonly.
+        """
+        self._checkReadonly()
+
+        sl = SelectorList(selectorText=selectorText, parentRule=self)
+        if sl.wellformed:
+            self._selectorList = sl
+
+    selectorText = property(lambda self: self._selectorList.selectorText,
+                            _setSelectorText,
+                            doc=u"(DOM) The textual representation of the "
+                                u"selector for the rule set.")
+
+    def _setStyle(self, style):
+        """
+        :param style: A string or CSSStyleDeclaration which replaces the
+            current style object.
+        """
+        self._checkReadonly()
+        if isinstance(style, basestring):
+            self._style = CSSStyleDeclaration(cssText=style, parentRule=self)
+        else:
+            style._parentRule = self
+            self._style = style
+
+    style = property(lambda self: self._style, _setStyle,
+                     doc=u"(DOM) The declaration-block of this rule set.")
+
+    type = property(lambda self: self.STYLE_RULE,
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        "type constant.")
+
+    wellformed = property(lambda self: self.selectorList.wellformed)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/colors.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/colors.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/colors.py	(revision 1126)
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+"""
+Built from something like this:
+
+    print [
+        (
+            row[2].text_content().strip(),
+            eval(row[4].text_content().strip())
+        )
+        for row in lxml.html.parse('http://www.w3.org/TR/css3-color/')
+            .xpath("//*[@class='colortable']//tr[position()>1]")
+    ]
+
+by Simon Sapin
+"""
+
+COLORS = {
+    'transparent': (0, 0, 0, 0.0),
+
+    'black': (0, 0, 0, 1.0),
+    'silver': (192, 192, 192, 1.0),
+    'gray': (128, 128, 128, 1.0),
+    'white': (255, 255, 255, 1.0),
+    'maroon': (128, 0, 0, 1.0),
+    'red': (255, 0, 0, 1.0),
+    'purple': (128, 0, 128, 1.0),
+    'fuchsia': (255, 0, 255, 1.0),
+    'green': (0, 128, 0, 1.0),
+    'lime': (0, 255, 0, 1.0),
+    'olive': (128, 128, 0, 1.0),
+    'yellow': (255, 255, 0, 1.0),
+    'navy': (0, 0, 128, 1.0),
+    'blue': (0, 0, 255, 1.0),
+    'teal': (0, 128, 128, 1.0),
+
+    'aqua': (0, 255, 255, 1.0),
+    'aliceblue': (240, 248, 255, 1.0),
+    'antiquewhite': (250, 235, 215, 1.0),
+    'aqua': (0, 255, 255, 1.0),
+    'aquamarine': (127, 255, 212, 1.0),
+    'azure': (240, 255, 255, 1.0),
+    'beige': (245, 245, 220, 1.0),
+    'bisque': (255, 228, 196, 1.0),
+    'black': (0, 0, 0, 1.0),
+    'blanchedalmond': (255, 235, 205, 1.0),
+    'blue': (0, 0, 255, 1.0),
+    'blueviolet': (138, 43, 226, 1.0),
+    'brown': (165, 42, 42, 1.0),
+    'burlywood': (222, 184, 135, 1.0),
+    'cadetblue': (95, 158, 160, 1.0),
+    'chartreuse': (127, 255, 0, 1.0),
+    'chocolate': (210, 105, 30, 1.0),
+    'coral': (255, 127, 80, 1.0),
+    'cornflowerblue': (100, 149, 237, 1.0),
+    'cornsilk': (255, 248, 220, 1.0),
+    'crimson': (220, 20, 60, 1.0),
+    'cyan': (0, 255, 255, 1.0),
+    'darkblue': (0, 0, 139, 1.0),
+    'darkcyan': (0, 139, 139, 1.0),
+    'darkgoldenrod': (184, 134, 11, 1.0),
+    'darkgray': (169, 169, 169, 1.0),
+    'darkgreen': (0, 100, 0, 1.0),
+    'darkgrey': (169, 169, 169, 1.0),
+    'darkkhaki': (189, 183, 107, 1.0),
+    'darkmagenta': (139, 0, 139, 1.0),
+    'darkolivegreen': (85, 107, 47, 1.0),
+    'darkorange': (255, 140, 0, 1.0),
+    'darkorchid': (153, 50, 204, 1.0),
+    'darkred': (139, 0, 0, 1.0),
+    'darksalmon': (233, 150, 122, 1.0),
+    'darkseagreen': (143, 188, 143, 1.0),
+    'darkslateblue': (72, 61, 139, 1.0),
+    'darkslategray': (47, 79, 79, 1.0),
+    'darkslategrey': (47, 79, 79, 1.0),
+    'darkturquoise': (0, 206, 209, 1.0),
+    'darkviolet': (148, 0, 211, 1.0),
+    'deeppink': (255, 20, 147, 1.0),
+    'deepskyblue': (0, 191, 255, 1.0),
+    'dimgray': (105, 105, 105, 1.0),
+    'dimgrey': (105, 105, 105, 1.0),
+    'dodgerblue': (30, 144, 255, 1.0),
+    'firebrick': (178, 34, 34, 1.0),
+    'floralwhite': (255, 250, 240, 1.0),
+    'forestgreen': (34, 139, 34, 1.0),
+    'fuchsia': (255, 0, 255, 1.0),
+    'gainsboro': (220, 220, 220, 1.0),
+    'ghostwhite': (248, 248, 255, 1.0),
+    'gold': (255, 215, 0, 1.0),
+    'goldenrod': (218, 165, 32, 1.0),
+    'gray': (128, 128, 128, 1.0),
+    'green': (0, 128, 0, 1.0),
+    'greenyellow': (173, 255, 47, 1.0),
+    'grey': (128, 128, 128, 1.0),
+    'honeydew': (240, 255, 240, 1.0),
+    'hotpink': (255, 105, 180, 1.0),
+    'indianred': (205, 92, 92, 1.0),
+    'indigo': (75, 0, 130, 1.0),
+    'ivory': (255, 255, 240, 1.0),
+    'khaki': (240, 230, 140, 1.0),
+    'lavender': (230, 230, 250, 1.0),
+    'lavenderblush': (255, 240, 245, 1.0),
+    'lawngreen': (124, 252, 0, 1.0),
+    'lemonchiffon': (255, 250, 205, 1.0),
+    'lightblue': (173, 216, 230, 1.0),
+    'lightcoral': (240, 128, 128, 1.0),
+    'lightcyan': (224, 255, 255, 1.0),
+    'lightgoldenrodyellow': (250, 250, 210, 1.0),
+    'lightgray': (211, 211, 211, 1.0),
+    'lightgreen': (144, 238, 144, 1.0),
+    'lightgrey': (211, 211, 211, 1.0),
+    'lightpink': (255, 182, 193, 1.0),
+    'lightsalmon': (255, 160, 122, 1.0),
+    'lightseagreen': (32, 178, 170, 1.0),
+    'lightskyblue': (135, 206, 250, 1.0),
+    'lightslategray': (119, 136, 153, 1.0),
+    'lightslategrey': (119, 136, 153, 1.0),
+    'lightsteelblue': (176, 196, 222, 1.0),
+    'lightyellow': (255, 255, 224, 1.0),
+    'lime': (0, 255, 0, 1.0),
+    'limegreen': (50, 205, 50, 1.0),
+    'linen': (250, 240, 230, 1.0),
+    'magenta': (255, 0, 255, 1.0),
+    'maroon': (128, 0, 0, 1.0),
+    'mediumaquamarine': (102, 205, 170, 1.0),
+    'mediumblue': (0, 0, 205, 1.0),
+    'mediumorchid': (186, 85, 211, 1.0),
+    'mediumpurple': (147, 112, 219, 1.0),
+    'mediumseagreen': (60, 179, 113, 1.0),
+    'mediumslateblue': (123, 104, 238, 1.0),
+    'mediumspringgreen': (0, 250, 154, 1.0),
+    'mediumturquoise': (72, 209, 204, 1.0),
+    'mediumvioletred': (199, 21, 133, 1.0),
+    'midnightblue': (25, 25, 112, 1.0),
+    'mintcream': (245, 255, 250, 1.0),
+    'mistyrose': (255, 228, 225, 1.0),
+    'moccasin': (255, 228, 181, 1.0),
+    'navajowhite': (255, 222, 173, 1.0),
+    'navy': (0, 0, 128, 1.0),
+    'oldlace': (253, 245, 230, 1.0),
+    'olive': (128, 128, 0, 1.0),
+    'olivedrab': (107, 142, 35, 1.0),
+    'orange': (255, 165, 0, 1.0),
+    'orangered': (255, 69, 0, 1.0),
+    'orchid': (218, 112, 214, 1.0),
+    'palegoldenrod': (238, 232, 170, 1.0),
+    'palegreen': (152, 251, 152, 1.0),
+    'paleturquoise': (175, 238, 238, 1.0),
+    'palevioletred': (219, 112, 147, 1.0),
+    'papayawhip': (255, 239, 213, 1.0),
+    'peachpuff': (255, 218, 185, 1.0),
+    'peru': (205, 133, 63, 1.0),
+    'pink': (255, 192, 203, 1.0),
+    'plum': (221, 160, 221, 1.0),
+    'powderblue': (176, 224, 230, 1.0),
+    'purple': (128, 0, 128, 1.0),
+    'red': (255, 0, 0, 1.0),
+    'rosybrown': (188, 143, 143, 1.0),
+    'royalblue': (65, 105, 225, 1.0),
+    'saddlebrown': (139, 69, 19, 1.0),
+    'salmon': (250, 128, 114, 1.0),
+    'sandybrown': (244, 164, 96, 1.0),
+    'seagreen': (46, 139, 87, 1.0),
+    'seashell': (255, 245, 238, 1.0),
+    'sienna': (160, 82, 45, 1.0),
+    'silver': (192, 192, 192, 1.0),
+    'skyblue': (135, 206, 235, 1.0),
+    'slateblue': (106, 90, 205, 1.0),
+    'slategray': (112, 128, 144, 1.0),
+    'slategrey': (112, 128, 144, 1.0),
+    'snow': (255, 250, 250, 1.0),
+    'springgreen': (0, 255, 127, 1.0),
+    'steelblue': (70, 130, 180, 1.0),
+    'tan': (210, 180, 140, 1.0),
+    'teal': (0, 128, 128, 1.0),
+    'thistle': (216, 191, 216, 1.0),
+    'tomato': (255, 99, 71, 1.0),
+    'turquoise': (64, 224, 208, 1.0),
+    'violet': (238, 130, 238, 1.0),
+    'wheat': (245, 222, 179, 1.0),
+    'white': (255, 255, 255, 1.0),
+    'whitesmoke': (245, 245, 245, 1.0),
+    'yellow': (255, 255, 0, 1.0),
+    'yellowgreen': (154, 205, 50, 1.0),
+}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstylesheet.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstylesheet.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstylesheet.py	(revision 1126)
@@ -0,0 +1,804 @@
+"""CSSStyleSheet implements DOM Level 2 CSS CSSStyleSheet.
+
+Partly also:
+    - http://dev.w3.org/csswg/cssom/#the-cssstylesheet
+    - http://www.w3.org/TR/2006/WD-css3-namespace-20060828/
+
+TODO:
+    - ownerRule and ownerNode
+"""
+__all__ = ['CSSStyleSheet']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.helper import Deprecated
+from cssutils.util import _Namespaces, _SimpleNamespaces, _readUrl
+from cssrule import CSSRule
+from cssvariablesdeclaration import CSSVariablesDeclaration
+import cssutils.stylesheets
+import xml.dom
+
+class CSSStyleSheet(cssutils.stylesheets.StyleSheet):
+    """CSSStyleSheet represents a CSS style sheet.
+
+    Format::
+
+        stylesheet
+          : [ CHARSET_SYM S* STRING S* ';' ]?
+            [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*
+            [ namespace [S|CDO|CDC]* ]* # according to @namespace WD
+            [ [ ruleset | media | page ] [S|CDO|CDC]* ]*
+
+    ``cssRules``
+        All Rules in this style sheet, a :class:`~cssutils.css.CSSRuleList`.
+    """
+    def __init__(self, href=None, media=None, title=u'', disabled=None,
+                 ownerNode=None, parentStyleSheet=None, readonly=False,
+                 ownerRule=None,
+                 validating=True):
+        """
+        For parameters see :class:`~cssutils.stylesheets.StyleSheet`
+        """
+        super(CSSStyleSheet, self).__init__(
+                'text/css', href, media, title, disabled,
+                ownerNode, parentStyleSheet, 
+                validating=validating)
+
+        self._ownerRule = ownerRule
+        self.cssRules = cssutils.css.CSSRuleList()
+        self._namespaces = _Namespaces(parentStyleSheet=self, log=self._log)
+        self._variables = CSSVariablesDeclaration()
+        self._readonly = readonly
+
+        # used only during setting cssText by parse*()
+        self.__encodingOverride = None
+        self._fetcher = None
+
+    def __iter__(self):
+        "Generator which iterates over cssRules."
+        for rule in self._cssRules:
+            yield rule
+
+    def __repr__(self):
+        if self.media:
+            mediaText = self.media.mediaText
+        else:
+            mediaText = None
+        return "cssutils.css.%s(href=%r, media=%r, title=%r)" % (
+                self.__class__.__name__,
+                self.href, mediaText, self.title)
+
+    def __str__(self):
+        if self.media:
+            mediaText = self.media.mediaText
+        else:
+            mediaText = None
+        return "<cssutils.css.%s object encoding=%r href=%r "\
+               "media=%r title=%r namespaces=%r at 0x%x>" % (
+                self.__class__.__name__, self.encoding, self.href,
+                mediaText, self.title, self.namespaces.namespaces,
+                id(self))
+
+    def _cleanNamespaces(self):
+        "Remove all namespace rules with same namespaceURI but last."
+        rules = self.cssRules
+        namespaceitems = self.namespaces.items()
+        i = 0
+        while i < len(rules):
+            rule = rules[i]
+            if rule.type == rule.NAMESPACE_RULE and \
+               (rule.prefix, rule.namespaceURI) not in namespaceitems:
+                self.deleteRule(i)
+            else:
+                i += 1
+
+    def _getUsedURIs(self):
+        "Return set of URIs used in the sheet."
+        useduris = set()
+        for r1 in self:
+            if r1.STYLE_RULE == r1.type:
+                useduris.update(r1.selectorList._getUsedUris())
+            elif r1.MEDIA_RULE == r1.type:
+                for r2 in r1:
+                    if r2.type == r2.STYLE_RULE:
+                        useduris.update(r2.selectorList._getUsedUris())
+        return useduris
+
+    def _setCssRules(self, cssRules):
+        "Set new cssRules and update contained rules refs."
+        cssRules.append = self.insertRule
+        cssRules.extend = self.insertRule
+        cssRules.__delitem__ = self.deleteRule
+
+        for rule in cssRules:
+            rule._parentStyleSheet = self
+
+        self._cssRules = cssRules
+
+    cssRules = property(lambda self: self._cssRules, _setCssRules,
+                        u"All Rules in this style sheet, a "
+                        u":class:`~cssutils.css.CSSRuleList`.")
+
+    def _getCssText(self):
+        "Textual representation of the stylesheet (a byte string)."
+        return cssutils.ser.do_CSSStyleSheet(self)
+
+    def _setCssText(self, cssText):
+        """Parse `cssText` and overwrites the whole stylesheet.
+
+        :param cssText:
+            a parseable string or a tuple of (cssText, dict-of-namespaces)
+        :exceptions:
+            - :exc:`~xml.dom.NamespaceErr`:
+              If a namespace prefix is found which is not declared.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+        """
+        self._checkReadonly()
+
+        cssText, namespaces = self._splitNamespacesOff(cssText)
+        tokenizer = self._tokenize2(cssText)
+
+        def S(expected, seq, token, tokenizer=None):
+            # @charset must be at absolute beginning of style sheet
+            # or 0 for py3
+            return max(1, expected or 0)
+
+        def COMMENT(expected, seq, token, tokenizer=None):
+            "special: sets parent*"
+            self.insertRule(cssutils.css.CSSComment([token],
+                            parentStyleSheet=self))
+            # or 0 for py3
+            return max(1, expected or 0)
+
+        def charsetrule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSCharsetRule(parentStyleSheet=self)
+            rule.cssText = self._tokensupto2(tokenizer, token)
+
+            if expected > 0:
+                self._log.error(u'CSSStylesheet: CSSCharsetRule only allowed '
+                                u'at beginning of stylesheet.',
+                                token, xml.dom.HierarchyRequestErr)
+                return expected
+            elif rule.wellformed:
+                self.insertRule(rule)
+
+            return 1
+
+        def importrule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSImportRule(parentStyleSheet=self)
+            rule.cssText = self._tokensupto2(tokenizer, token)
+
+            if expected > 1:
+                self._log.error(u'CSSStylesheet: CSSImportRule not allowed '
+                                u'here.', token, xml.dom.HierarchyRequestErr)
+                return expected
+            elif rule.wellformed:
+                self.insertRule(rule)
+
+            return 1
+
+        def namespacerule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSNamespaceRule(cssText=self._tokensupto2(tokenizer,
+                                                                           token),
+                                                 parentStyleSheet=self)
+
+            if expected > 2:
+                self._log.error(u'CSSStylesheet: CSSNamespaceRule not allowed '
+                                u'here.', token, xml.dom.HierarchyRequestErr)
+                return expected
+            elif rule.wellformed:
+                if rule.prefix not in self.namespaces:
+                    # add new if not same prefix
+                    self.insertRule(rule, _clean=False)
+                else:
+                    # same prefix => replace namespaceURI
+                    for r in self.cssRules.rulesOfType(rule.NAMESPACE_RULE):
+                        if r.prefix == rule.prefix:
+                            r._replaceNamespaceURI(rule.namespaceURI)
+
+                self._namespaces[rule.prefix] = rule.namespaceURI
+
+            return 2
+
+        def variablesrule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSVariablesRule(parentStyleSheet=self)
+            rule.cssText = self._tokensupto2(tokenizer, token)
+
+            if expected > 2:
+                self._log.error(u'CSSStylesheet: CSSVariablesRule not allowed '
+                                u'here.', token, xml.dom.HierarchyRequestErr)
+                return expected
+            elif rule.wellformed:
+                self.insertRule(rule)
+                self._updateVariables()
+
+            return 2
+
+        def fontfacerule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSFontFaceRule(parentStyleSheet=self)
+            rule.cssText = self._tokensupto2(tokenizer, token)
+            if rule.wellformed:
+                self.insertRule(rule)
+            return 3
+
+        def mediarule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSMediaRule(parentStyleSheet=self)
+            rule.cssText = self._tokensupto2(tokenizer, token)
+            if rule.wellformed:
+                self.insertRule(rule)
+            return 3
+
+        def pagerule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSPageRule(parentStyleSheet=self)
+            rule.cssText = self._tokensupto2(tokenizer, token)
+            if rule.wellformed:
+                self.insertRule(rule)
+            return 3
+        
+        def unknownrule(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            if token[1] in cssutils.css.MarginRule.margins:
+                self._log.error(u'CSSStylesheet: MarginRule out CSSPageRule.',
+                                token, neverraise=True)
+                rule = cssutils.css.MarginRule(parentStyleSheet=self)
+                rule.cssText = self._tokensupto2(tokenizer, token)
+            else:
+                self._log.warn(u'CSSStylesheet: Unknown @rule found.',
+                               token, neverraise=True)
+                rule = cssutils.css.CSSUnknownRule(parentStyleSheet=self)
+                rule.cssText = self._tokensupto2(tokenizer, token)
+                
+            if rule.wellformed:
+                self.insertRule(rule)
+
+            # or 0 for py3
+            return max(1, expected or 0)
+
+        def ruleset(expected, seq, token, tokenizer):
+            # parse and consume tokens in any case
+            rule = cssutils.css.CSSStyleRule(parentStyleSheet=self)
+            rule.cssText = self._tokensupto2(tokenizer, token)
+            if rule.wellformed:
+                self.insertRule(rule)
+            return 3
+
+        # save for possible reset
+        oldCssRules = self.cssRules
+        oldNamespaces = self._namespaces
+
+        self.cssRules = cssutils.css.CSSRuleList()
+        # simple during parse
+        self._namespaces = namespaces
+        self._variables = CSSVariablesDeclaration()
+
+        # not used?!
+        newseq = []
+
+        # ['CHARSET', 'IMPORT', ('VAR', NAMESPACE'), ('PAGE', 'MEDIA', ruleset)]
+        wellformed, expected = self._parse(0, newseq, tokenizer,
+            {'S': S,
+             'COMMENT': COMMENT,
+             'CDO': lambda *ignored: None,
+             'CDC': lambda *ignored: None,
+             'CHARSET_SYM': charsetrule,
+             'FONT_FACE_SYM': fontfacerule,
+             'IMPORT_SYM': importrule,
+             'NAMESPACE_SYM': namespacerule,
+             'PAGE_SYM': pagerule,
+             'MEDIA_SYM': mediarule,
+             'VARIABLES_SYM': variablesrule,
+             'ATKEYWORD': unknownrule
+             },
+             default=ruleset)
+
+        if wellformed:
+            # use proper namespace object
+            self._namespaces = _Namespaces(parentStyleSheet=self, log=self._log)
+            self._cleanNamespaces()
+
+        else:
+            # reset
+            self._cssRules = oldCssRules
+            self._namespaces = oldNamespaces
+            self._updateVariables()
+            self._cleanNamespaces()
+
+    cssText = property(_getCssText, _setCssText,
+            "Textual representation of the stylesheet (a byte string)")
+
+    def _resolveImport(self, url):
+        """Read (encoding, enctype, decodedContent) from `url` for @import
+        sheets."""
+        try:
+            # only available during parsing of a complete sheet
+            parentEncoding = self.__newEncoding
+
+        except AttributeError:
+            try:
+                # explicit @charset
+                parentEncoding = self._cssRules[0].encoding
+            except (IndexError, AttributeError):
+                # default not UTF-8 but None!
+                parentEncoding = None
+
+
+        return _readUrl(url, fetcher=self._fetcher,
+                        overrideEncoding=self.__encodingOverride,
+                        parentEncoding=parentEncoding)
+
+    def _setCssTextWithEncodingOverride(self, cssText, encodingOverride=None,
+                                        encoding=None):
+        """Set `cssText` but use `encodingOverride` to overwrite detected
+        encoding. This is used by parse and @import during setting of cssText.
+
+        If `encoding` is given use this but do not save as `encodingOverride`.
+        """
+        if encodingOverride:
+            # encoding during resolving of @import
+            self.__encodingOverride = encodingOverride
+
+        if encoding:
+            # save for nested @import
+            self.__newEncoding = encoding
+
+        self.cssText = cssText
+
+        if encodingOverride:
+            # set encodingOverride explicit again!
+            self.encoding = self.__encodingOverride
+            # del?
+            self.__encodingOverride = None
+        elif encoding:
+            # may e.g. be httpEncoding
+            self.encoding = encoding
+            try:
+                del self.__newEncoding
+            except AttributeError, e:
+                pass
+
+    def _setFetcher(self, fetcher=None):
+        """Set @import URL loader, if None the default is used."""
+        self._fetcher = fetcher
+
+    def _getEncoding(self):
+        """Encoding set in :class:`~cssutils.css.CSSCharsetRule` or if ``None``
+        resulting in default ``utf-8`` encoding being used."""
+        try:
+            return self._cssRules[0].encoding
+        except (IndexError, AttributeError):
+            return 'utf-8'
+
+    def _setEncoding(self, encoding):
+        """Set `encoding` of charset rule if present in sheet or insert a new
+        :class:`~cssutils.css.CSSCharsetRule` with given `encoding`.
+        If `encoding` is None removes charsetrule if present resulting in
+        default encoding of utf-8.
+        """
+        try:
+            rule = self._cssRules[0]
+        except IndexError:
+            rule = None
+        if rule and rule.CHARSET_RULE == rule.type:
+            if encoding:
+                rule.encoding = encoding
+            else:
+                self.deleteRule(0)
+        elif encoding:
+            self.insertRule(cssutils.css.CSSCharsetRule(encoding=encoding), 0)
+
+    encoding = property(_getEncoding, _setEncoding,
+            "(cssutils) Reflect encoding of an @charset rule or 'utf-8' "
+            "(default) if set to ``None``")
+
+    namespaces = property(lambda self: self._namespaces,
+                          doc="All Namespaces used in this CSSStyleSheet.")
+
+    def _updateVariables(self):
+        """Updates self._variables, called when @import or @variables rules
+        is added to sheet.
+        """
+        for r in self.cssRules.rulesOfType(CSSRule.IMPORT_RULE):
+            s = r.styleSheet
+            if s:
+                for var in s.variables:
+                    self._variables.setVariable(var, s.variables[var])
+#        for r in self.cssRules.rulesOfType(CSSRule.IMPORT_RULE):
+#            for vr in r.styleSheet.cssRules.rulesOfType(CSSRule.VARIABLES_RULE):
+#                for var in vr.variables:
+#                    self._variables.setVariable(var, vr.variables[var])
+        for vr in self.cssRules.rulesOfType(CSSRule.VARIABLES_RULE):
+            for var in vr.variables:
+                self._variables.setVariable(var, vr.variables[var])
+
+    variables = property(lambda self: self._variables,
+                         doc=u"A :class:`cssutils.css.CSSVariablesDeclaration` "
+                         u"containing all available variables in this "
+                         u"CSSStyleSheet including the ones defined in "
+                         u"imported sheets.")
+
+    def add(self, rule):
+        """Add `rule` to style sheet at appropriate position.
+        Same as ``insertRule(rule, inOrder=True)``.
+        """
+        return self.insertRule(rule, index=None, inOrder=True)
+
+    def deleteRule(self, index):
+        """Delete rule at `index` from the style sheet.
+
+        :param index:
+            The `index` of the rule to be removed from the StyleSheet's rule
+            list. For an `index` < 0 **no** :exc:`~xml.dom.IndexSizeErr` is
+            raised but rules for normal Python lists are used. E.g.
+            ``deleteRule(-1)`` removes the last rule in cssRules.
+
+            `index` may also be a CSSRule object which will then be removed
+            from the StyleSheet.
+
+        :exceptions:
+            - :exc:`~xml.dom.IndexSizeErr`:
+              Raised if the specified index does not correspond to a rule in
+              the style sheet's rule list.
+            - :exc:`~xml.dom.NamespaceErr`:
+              Raised if removing this rule would result in an invalid StyleSheet
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this style sheet is readonly.
+        """
+        self._checkReadonly()
+
+        if isinstance(index, CSSRule):
+            for i, r in enumerate(self.cssRules):
+                if index == r:
+                    index = i
+                    break
+            else:
+                raise xml.dom.IndexSizeErr(u"CSSStyleSheet: Not a rule in"
+                                           " this sheets'a cssRules list: %s"
+                                           % index)
+
+        try:
+            rule = self._cssRules[index]
+        except IndexError:
+            raise xml.dom.IndexSizeErr(
+                u'CSSStyleSheet: %s is not a valid index in the rulelist of '
+                u'length %i' % (index, self._cssRules.length))
+        else:
+            if rule.type == rule.NAMESPACE_RULE:
+                # check all namespacerules if used
+                uris = [r.namespaceURI for r in self
+                        if r.type == r.NAMESPACE_RULE]
+                useduris = self._getUsedURIs()
+                if rule.namespaceURI in useduris and\
+                   uris.count(rule.namespaceURI) == 1:
+                    raise xml.dom.NoModificationAllowedErr(
+                        u'CSSStyleSheet: NamespaceURI defined in this rule is '
+                        u'used, cannot remove.')
+                    return
+
+            rule._parentStyleSheet = None # detach
+            del self._cssRules[index] # delete from StyleSheet
+
+    def insertRule(self, rule, index=None, inOrder=False, _clean=True):
+        """
+        Used to insert a new rule into the style sheet. The new rule now
+        becomes part of the cascade.
+
+        :param rule:
+            a parsable DOMString, in cssutils also a
+            :class:`~cssutils.css.CSSRule` or :class:`~cssutils.css.CSSRuleList`
+        :param index:
+            of the rule before the new rule will be inserted.
+            If the specified `index` is equal to the length of the
+            StyleSheet's rule collection, the rule will be added to the end
+            of the style sheet.
+            If `index` is not given or ``None`` rule will be appended to rule
+            list.
+        :param inOrder:
+            if ``True`` the rule will be put to a proper location while
+            ignoring `index` and without raising
+            :exc:`~xml.dom.HierarchyRequestErr`.
+            The resulting index is returned nevertheless.
+        :returns: The index within the style sheet's rule collection
+        :Exceptions:
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at the specified `index`
+              e.g. if an @import rule is inserted after a standard rule set
+              or other at-rule.
+            - :exc:`~xml.dom.IndexSizeErr`:
+              Raised if the specified `index` is not a valid insertion point.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this style sheet is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified rule has a syntax error and is
+              unparsable.
+        """
+        self._checkReadonly()
+
+        # check position
+        if index is None:
+            index = len(self._cssRules)
+        elif index < 0 or index > self._cssRules.length:
+            raise xml.dom.IndexSizeErr(
+                u'CSSStyleSheet: Invalid index %s for CSSRuleList with a '
+                u'length of %s.' % (index, self._cssRules.length))
+            return
+
+        if isinstance(rule, basestring):
+            # init a temp sheet which has the same properties as self
+            tempsheet = CSSStyleSheet(href=self.href,
+                                      media=self.media,
+                                      title=self.title,
+                                      parentStyleSheet=self.parentStyleSheet,
+                                      ownerRule=self.ownerRule)
+            tempsheet._ownerNode = self.ownerNode
+            tempsheet._fetcher = self._fetcher
+            # prepend encoding if in this sheet to be able to use it in
+            # @import rules encoding resolution
+            # do not add if new rule startswith "@charset" (which is exact!)
+            if not rule.startswith(u'@charset') and (self._cssRules and
+                self._cssRules[0].type == self._cssRules[0].CHARSET_RULE):
+                # rule 0 is @charset!
+                newrulescount, newruleindex = 2, 1
+                rule = self._cssRules[0].cssText + rule
+            else:
+                newrulescount, newruleindex = 1, 0
+
+            # parse the new rule(s)
+            tempsheet.cssText = (rule, self._namespaces)
+
+            if len(tempsheet.cssRules) != newrulescount or (not isinstance(
+               tempsheet.cssRules[newruleindex], cssutils.css.CSSRule)):
+                self._log.error(u'CSSStyleSheet: Not a CSSRule: %s' % rule)
+                return
+            rule = tempsheet.cssRules[newruleindex]
+            rule._parentStyleSheet = None # done later?
+
+            # TODO:
+            #tempsheet._namespaces = self._namespaces
+            #variables?
+
+        elif isinstance(rule, cssutils.css.CSSRuleList):
+            # insert all rules
+            for i, r in enumerate(rule):
+                self.insertRule(r, index + i)
+            return index
+
+        if not rule.wellformed:
+            self._log.error(u'CSSStyleSheet: Invalid rules cannot be added.')
+            return
+
+        # CHECK HIERARCHY
+        # @charset
+        if rule.type == rule.CHARSET_RULE:
+            if inOrder:
+                index = 0
+                # always first and only
+                if (self._cssRules
+                    and self._cssRules[0].type == rule.CHARSET_RULE):
+                    self._cssRules[0].encoding = rule.encoding
+                else:
+                    self._cssRules.insert(0, rule)
+            elif index != 0 or (self._cssRules and
+                              self._cssRules[0].type == rule.CHARSET_RULE):
+                self._log.error(
+                    u'CSSStylesheet: @charset only allowed once at the'
+                    ' beginning of a stylesheet.',
+                    error=xml.dom.HierarchyRequestErr)
+                return
+            else:
+                self._cssRules.insert(index, rule)
+
+        # @unknown or comment
+        elif rule.type in (rule.UNKNOWN_RULE, rule.COMMENT) and not inOrder:
+            if index == 0 and self._cssRules and\
+               self._cssRules[0].type == rule.CHARSET_RULE:
+                self._log.error(
+                    u'CSSStylesheet: @charset must be the first rule.',
+                    error=xml.dom.HierarchyRequestErr)
+                return
+            else:
+                self._cssRules.insert(index, rule)
+
+        # @import
+        elif rule.type == rule.IMPORT_RULE:
+            if inOrder:
+                # automatic order
+                if rule.type in (r.type for r in self):
+                    # find last of this type
+                    for i, r in enumerate(reversed(self._cssRules)):
+                        if r.type == rule.type:
+                            index = len(self._cssRules) - i
+                            break
+                else:
+                    # find first point to insert
+                    if self._cssRules and\
+                       self._cssRules[0].type in (rule.CHARSET_RULE,
+                                                  rule.COMMENT):
+                        index = 1
+                    else:
+                        index = 0
+            else:
+                # after @charset
+                if index == 0 and self._cssRules and\
+                   self._cssRules[0].type == rule.CHARSET_RULE:
+                    self._log.error(
+                        u'CSSStylesheet: Found @charset at index 0.',
+                        error=xml.dom.HierarchyRequestErr)
+                    return
+                # before @namespace @variables @page @font-face @media stylerule
+                for r in self._cssRules[:index]:
+                    if r.type in (r.NAMESPACE_RULE,
+                                  r.VARIABLES_RULE,
+                                  r.MEDIA_RULE,
+                                  r.PAGE_RULE,
+                                  r.STYLE_RULE,
+                                  r.FONT_FACE_RULE):
+                        self._log.error(
+                            u'CSSStylesheet: Cannot insert @import here,'
+                             ' found @namespace, @variables, @media, @page or'
+                             ' CSSStyleRule before index %s.' %
+                            index,
+                            error=xml.dom.HierarchyRequestErr)
+                        return
+            self._cssRules.insert(index, rule)
+            self._updateVariables()
+
+        # @namespace
+        elif rule.type == rule.NAMESPACE_RULE:
+            if inOrder:
+                if rule.type in (r.type for r in self):
+                    # find last of this type
+                    for i, r in enumerate(reversed(self._cssRules)):
+                        if r.type == rule.type:
+                            index = len(self._cssRules) - i
+                            break
+                else:
+                    # find first point to insert
+                    for i, r in enumerate(self._cssRules):
+                        if r.type in (r.VARIABLES_RULE, r.MEDIA_RULE,
+                                      r.PAGE_RULE, r.STYLE_RULE,
+                                      r.FONT_FACE_RULE, r.UNKNOWN_RULE,
+                                      r.COMMENT):
+                            index = i # before these
+                            break
+            else:
+                # after @charset and @import
+                for r in self._cssRules[index:]:
+                    if r.type in (r.CHARSET_RULE, r.IMPORT_RULE):
+                        self._log.error(
+                            u'CSSStylesheet: Cannot insert @namespace here,'
+                            ' found @charset or @import after index %s.' %
+                            index,
+                            error=xml.dom.HierarchyRequestErr)
+                        return
+                # before @variables @media @page @font-face and stylerule
+                for r in self._cssRules[:index]:
+                    if r.type in (r.VARIABLES_RULE,
+                                  r.MEDIA_RULE,
+                                  r.PAGE_RULE,
+                                  r.STYLE_RULE,
+                                  r.FONT_FACE_RULE):
+                        self._log.error(
+                            u'CSSStylesheet: Cannot insert @namespace here,'
+                            ' found @variables, @media, @page or CSSStyleRule'
+                            ' before index %s.' %
+                            index,
+                            error=xml.dom.HierarchyRequestErr)
+                        return
+
+            if not (rule.prefix in self.namespaces and
+               self.namespaces[rule.prefix] == rule.namespaceURI):
+                # no doublettes
+                self._cssRules.insert(index, rule)
+                if _clean:
+                    self._cleanNamespaces()
+
+
+        # @variables
+        elif rule.type == rule.VARIABLES_RULE:
+            if inOrder:
+                if rule.type in (r.type for r in self):
+                    # find last of this type
+                    for i, r in enumerate(reversed(self._cssRules)):
+                        if r.type == rule.type:
+                            index = len(self._cssRules) - i
+                            break
+                else:
+                    # find first point to insert
+                    for i, r in enumerate(self._cssRules):
+                        if r.type in (r.MEDIA_RULE,
+                                      r.PAGE_RULE,
+                                      r.STYLE_RULE,
+                                      r.FONT_FACE_RULE,
+                                      r.UNKNOWN_RULE,
+                                      r.COMMENT):
+                            index = i # before these
+                            break
+            else:
+                # after @charset @import @namespace
+                for r in self._cssRules[index:]:
+                    if r.type in (r.CHARSET_RULE,
+                                  r.IMPORT_RULE,
+                                  r.NAMESPACE_RULE):
+                        self._log.error(
+                            u'CSSStylesheet: Cannot insert @variables here,'
+                            ' found @charset, @import or @namespace after'
+                            ' index %s.' %
+                            index,
+                            error=xml.dom.HierarchyRequestErr)
+                        return
+                # before @media @page @font-face and stylerule
+                for r in self._cssRules[:index]:
+                    if r.type in (r.MEDIA_RULE,
+                                  r.PAGE_RULE,
+                                  r.STYLE_RULE,
+                                  r.FONT_FACE_RULE):
+                        self._log.error(
+                            u'CSSStylesheet: Cannot insert @variables here,'
+                            ' found @media, @page or CSSStyleRule'
+                            ' before index %s.' %
+                            index,
+                            error=xml.dom.HierarchyRequestErr)
+                        return
+
+            self._cssRules.insert(index, rule)
+            self._updateVariables()
+
+        # all other where order is not important
+        else:
+            if inOrder:
+                # simply add to end as no specific order
+                self._cssRules.append(rule)
+                index = len(self._cssRules) - 1
+            else:
+                for r in self._cssRules[index:]:
+                    if r.type in (r.CHARSET_RULE,
+                                  r.IMPORT_RULE,
+                                  r.NAMESPACE_RULE):
+                        self._log.error(
+                            u'CSSStylesheet: Cannot insert rule here, found '
+                            u'@charset, @import or @namespace before index %s.'
+                            % index, error=xml.dom.HierarchyRequestErr)
+                        return
+                self._cssRules.insert(index, rule)
+
+        # post settings
+        rule._parentStyleSheet = self
+
+        if rule.IMPORT_RULE == rule.type and not rule.hrefFound:
+            # try loading the imported sheet which has new relative href now
+            rule.href = rule.href
+
+        return index
+
+    ownerRule = property(lambda self: self._ownerRule,
+                         doc=u'A ref to an @import rule if it is imported, '
+                             u'else ``None``.')
+
+
+    @Deprecated(u'Use ``cssutils.setSerializer(serializer)`` instead.')
+    def setSerializer(self, cssserializer):
+        """Set the cssutils global Serializer used for all output."""
+        if isinstance(cssserializer, cssutils.CSSSerializer):
+            cssutils.ser = cssserializer
+        else:
+            raise ValueError(u'Serializer must be an instance of '
+                             u'cssutils.CSSSerializer.')
+
+    @Deprecated(u'Set pref in ``cssutils.ser.prefs`` instead.')
+    def setSerializerPref(self, pref, value):
+        """Set a Preference of CSSSerializer used for output.
+        See :class:`cssutils.serialize.Preferences` for possible
+        preferences to be set.
+        """
+        cssutils.ser.prefs.__setattr__(pref, value)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssproperties.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssproperties.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssproperties.py	(revision 1126)
@@ -0,0 +1,122 @@
+"""CSS2Properties (partly!) implements DOM Level 2 CSS CSS2Properties used
+by CSSStyleDeclaration
+
+TODO: CSS2Properties
+    If an implementation does implement this interface, it is expected to
+    understand the specific syntax of the shorthand properties, and apply
+    their semantics; when the margin property is set, for example, the
+    marginTop, marginRight, marginBottom and marginLeft properties are
+    actually being set by the underlying implementation.
+
+    When dealing with CSS "shorthand" properties, the shorthand properties
+    should be decomposed into their component longhand properties as
+    appropriate, and when querying for their value, the form returned
+    should be the shortest form exactly equivalent to the declarations made
+    in the ruleset. However, if there is no shorthand declaration that
+    could be added to the ruleset without changing in any way the rules
+    already declared in the ruleset (i.e., by adding longhand rules that
+    were previously not declared in the ruleset), then the empty string
+    should be returned for the shorthand property.
+
+    For example, querying for the font property should not return
+    "normal normal normal 14pt/normal Arial, sans-serif", when
+    "14pt Arial, sans-serif" suffices. (The normals are initial values, and
+    are implied by use of the longhand property.)
+
+    If the values for all the longhand properties that compose a particular
+    string are the initial values, then a string consisting of all the
+    initial values should be returned (e.g. a border-width value of
+    "medium" should be returned as such, not as "").
+
+    For some shorthand properties that take missing values from other
+    sides, such as the margin, padding, and border-[width|style|color]
+    properties, the minimum number of sides possible should be used; i.e.,
+    "0px 10px" will be returned instead of "0px 10px 0px 10px".
+
+    If the value of a shorthand property can not be decomposed into its
+    component longhand properties, as is the case for the font property
+    with a value of "menu", querying for the values of the component
+    longhand properties should return the empty string.
+
+TODO: CSS2Properties DOMImplementation
+    The interface found within this section are not mandatory. A DOM
+    application can use the hasFeature method of the DOMImplementation
+    interface to determine whether it is supported or not. The feature
+    string for this extended interface listed in this section is "CSS2"
+    and the version is "2.0".
+
+"""
+__all__ = ['CSS2Properties']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssutils.profiles
+import re
+
+class CSS2Properties(object):
+    """The CSS2Properties interface represents a convenience mechanism
+    for retrieving and setting properties within a CSSStyleDeclaration.
+    The attributes of this interface correspond to all the properties
+    specified in CSS2. Getting an attribute of this interface is
+    equivalent to calling the getPropertyValue method of the
+    CSSStyleDeclaration interface. Setting an attribute of this
+    interface is equivalent to calling the setProperty method of the
+    CSSStyleDeclaration interface.
+
+    cssutils actually also allows usage of ``del`` to remove a CSS property
+    from a CSSStyleDeclaration.
+
+    This is an abstract class, the following functions need to be present
+    in inheriting class:
+
+    - ``_getP``
+    - ``_setP``
+    - ``_delP``
+    """
+    # actual properties are set after the class definition!
+    def _getP(self, CSSname): pass
+    def _setP(self, CSSname, value): pass
+    def _delP(self, CSSname): pass
+    
+
+_reCSStoDOMname = re.compile('-[a-z]', re.I)
+def _toDOMname(CSSname):
+    """Returns DOMname for given CSSname e.g. for CSSname 'font-style' returns
+    'fontStyle'.
+    """
+    def _doCSStoDOMname2(m): return m.group(0)[1].capitalize()
+    return _reCSStoDOMname.sub(_doCSStoDOMname2, CSSname)
+
+_reDOMtoCSSname = re.compile('([A-Z])[a-z]+')
+def _toCSSname(DOMname):
+    """Return CSSname for given DOMname e.g. for DOMname 'fontStyle' returns
+    'font-style'.
+    """
+    def _doDOMtoCSSname2(m): return '-' + m.group(0).lower()
+    return _reDOMtoCSSname.sub(_doDOMtoCSSname2, DOMname)
+
+# add list of DOMname properties to CSS2Properties
+# used for CSSStyleDeclaration to check if allowed properties
+# but somehow doubled, any better way?
+CSS2Properties._properties = []
+for group in cssutils.profiles.properties:
+    for name in cssutils.profiles.properties[group]:
+        CSS2Properties._properties.append(_toDOMname(name))
+
+
+# add CSS2Properties to CSSStyleDeclaration:
+def __named_property_def(DOMname):
+    """
+    Closure to keep name known in each properties accessor function
+    DOMname is converted to CSSname here, so actual calls use CSSname.
+    """
+    CSSname = _toCSSname(DOMname)
+    def _get(self): return self._getP(CSSname)
+    def _set(self, value): self._setP(CSSname, value)
+    def _del(self): self._delP(CSSname)
+    return _get, _set, _del
+
+# add all CSS2Properties to CSSStyleDeclaration
+for DOMname in CSS2Properties._properties:
+    setattr(CSS2Properties, DOMname,
+        property(*__named_property_def(DOMname)))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/marginrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/marginrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/marginrule.py	(revision 1126)
@@ -0,0 +1,215 @@
+"""MarginRule implements DOM Level 2 CSS MarginRule."""
+__all__ = ['MarginRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.prodparser import *
+from cssstyledeclaration import CSSStyleDeclaration
+import cssrule
+import cssutils
+import xml.dom
+
+class MarginRule(cssrule.CSSRule):
+    """
+    A margin at-rule consists of an ATKEYWORD that identifies the margin box
+    (e.g. '@top-left') and a block of declarations (said to be in the margin
+    context).
+
+    Format::
+        
+        margin :
+               margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*
+               ;
+        
+        margin_sym :
+               TOPLEFTCORNER_SYM | 
+               TOPLEFT_SYM | 
+               TOPCENTER_SYM | 
+               TOPRIGHT_SYM | 
+               TOPRIGHTCORNER_SYM |
+               BOTTOMLEFTCORNER_SYM | 
+               BOTTOMLEFT_SYM | 
+               BOTTOMCENTER_SYM | 
+               BOTTOMRIGHT_SYM |
+               BOTTOMRIGHTCORNER_SYM |
+               LEFTTOP_SYM |
+               LEFTMIDDLE_SYM |
+               LEFTBOTTOM_SYM |
+               RIGHTTOP_SYM |
+               RIGHTMIDDLE_SYM |
+               RIGHTBOTTOM_SYM 
+               ;
+        
+    e.g.::
+    
+        @top-left {
+            content: "123";
+            }
+    """
+    margins = ['@top-left-corner',
+               '@top-left',
+               '@top-center',
+               '@top-right',
+               '@top-right-corner',
+               '@bottom-left-corner',
+               '@bottom-left',
+               '@bottom-center',
+               '@bottom-right',
+               '@bottom-right-corner',
+               '@left-top',
+               '@left-middle',
+               '@left-bottom',
+               '@right-top',
+               '@right-middle',
+               '@right-bottom'
+               ]
+    
+    def __init__(self, margin=None, style=None, parentRule=None, 
+                 parentStyleSheet=None, readonly=False):
+        """
+        :param atkeyword:
+            The margin area, e.g. '@top-left' for this rule
+        :param style:
+            CSSStyleDeclaration for this MarginRule
+        """
+        super(MarginRule, self).__init__(parentRule=parentRule, 
+                                         parentStyleSheet=parentStyleSheet)
+        
+        self._atkeyword = self._keyword = None
+        
+        if margin:
+            self.margin = margin
+            
+        if style:
+            self.style = style
+        else:
+            self.style = CSSStyleDeclaration(parentRule=self)
+        
+        self._readonly = readonly
+
+    def _setMargin(self, margin):
+        """Check if new keyword fits the rule it is used for."""
+        n = self._normalize(margin)
+        
+        if n not in MarginRule.margins:
+            self._log.error(u'Invalid margin @keyword for this %s rule: %r' %
+                            (self.margin, margin),
+                            error=xml.dom.InvalidModificationErr)
+    
+        else:
+            self._atkeyword = n
+            self._keyword = margin
+
+    margin = property(lambda self: self._atkeyword, _setMargin,
+                      doc=u"Margin area of parent CSSPageRule. "
+                          u"`margin` and `atkeyword` are both normalized "
+                          u"@keyword of the @rule.")
+
+    atkeyword = margin 
+
+    def __repr__(self):
+        return u"cssutils.css.%s(margin=%r, style=%r)" % (self.__class__.__name__,
+                                                          self.margin, 
+                                                          self.style.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object margin=%r style=%r "\
+               u"at 0x%x>" % (self.__class__.__name__,
+                              self.margin,
+                              self.style.cssText,
+                              id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_MarginRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        super(MarginRule, self)._setCssText(cssText)
+                
+        # TEMP: all style tokens are saved in store to fill styledeclaration
+        # TODO: resolve when all generators
+        styletokens = Prod(name='styletokens',
+                           match=lambda t, v: v != u'}',
+                           #toSeq=False,
+                           toStore='styletokens',
+                           storeToken=True 
+                           )
+                
+        prods = Sequence(Prod(name='@ margin', 
+                              match=lambda t, v: 
+                                t == 'ATKEYWORD' and 
+                                self._normalize(v) in MarginRule.margins,
+                              toStore='margin'
+                              # TODO?
+                              #, exception=xml.dom.InvalidModificationErr 
+                              ),
+                         PreDef.char('OPEN', u'{'),
+                         Sequence(Choice(PreDef.unknownrule(toStore='@'), 
+                                         styletokens),
+                                  minmax=lambda: (0, None)
+                         ),
+                         PreDef.char('CLOSE', u'}', stopAndKeep=True)
+                )
+        # parse
+        ok, seq, store, unused = ProdParser().parse(cssText,
+                                                    u'MarginRule',
+                                                    prods)
+        
+        if ok:
+            # TODO: use seq for serializing instead of fixed stuff?
+            self._setSeq(seq)
+            
+            if 'margin' in store:
+                # may raise:
+                self.margin = store['margin'].value
+            else:
+                self._log.error(u'No margin @keyword for this %s rule' %
+                                self.margin,
+                                error=xml.dom.InvalidModificationErr)
+            
+            # new empty style
+            self.style = CSSStyleDeclaration(parentRule=self)
+            
+            if 'styletokens' in store:
+                # may raise:
+                self.style.cssText = store['styletokens']
+            
+                
+    cssText = property(fget=_getCssText, fset=_setCssText,
+                       doc=u"(DOM) The parsable textual representation.")
+    
+    def _setStyle(self, style):
+        """
+        :param style: A string or CSSStyleDeclaration which replaces the
+            current style object.
+        """
+        self._checkReadonly()
+        if isinstance(style, basestring):
+            self._style = CSSStyleDeclaration(cssText=style, parentRule=self)
+        else:
+            style._parentRule = self
+            self._style = style
+
+    style = property(lambda self: self._style, _setStyle,
+                     doc=u"(DOM) The declaration-block of this rule set.")
+    
+    type = property(lambda self: self.MARGIN_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+    
+    wellformed = property(lambda self: bool(self.atkeyword))
+    
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvariablesrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvariablesrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvariablesrule.py	(revision 1126)
@@ -0,0 +1,198 @@
+"""CSSVariables implements (and only partly) experimental 
+`CSS Variables <http://disruptive-innovations.com/zoo/cssvariables/>`_
+"""
+__all__ = ['CSSVariablesRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: cssfontfacerule.py 1818 2009-07-30 21:39:00Z cthedot $'
+
+from cssvariablesdeclaration import CSSVariablesDeclaration
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSVariablesRule(cssrule.CSSRule):
+    """
+    The CSSVariablesRule interface represents a @variables rule within a CSS
+    style sheet. The @variables rule is used to specify variables.
+
+    cssutils uses a :class:`~cssutils.css.CSSVariablesDeclaration`  to
+    represent the variables.
+    
+    Format::
+    
+        variables
+            VARIABLES_SYM S* medium [ COMMA S* medium ]* LBRACE S* 
+            variableset* '}' S*
+            ;
+        
+    for variableset see :class:`cssutils.css.CSSVariablesDeclaration`
+         
+    **Media are not implemented. Reason is that cssutils is using CSS
+    variables in a kind of preprocessing and therefor no media information
+    is available at this stage. For now do not use media!**
+    
+    Example::
+    
+        @variables {
+          CorporateLogoBGColor: #fe8d12;
+        }
+        
+        div.logoContainer {
+          background-color: var(CorporateLogoBGColor);
+        }
+    """
+    def __init__(self, mediaText=None, variables=None, parentRule=None, 
+                 parentStyleSheet=None, readonly=False):
+        """
+        If readonly allows setting of properties in constructor only.
+        """
+        super(CSSVariablesRule, self).__init__(parentRule=parentRule, 
+                                              parentStyleSheet=parentStyleSheet)
+        self._atkeyword = u'@variables'
+        
+        # dummy
+        self._media = cssutils.stylesheets.MediaList(mediaText, 
+                                                     readonly=readonly)
+        
+        if variables:
+            self.variables = variables
+        else: 
+            self.variables = CSSVariablesDeclaration(parentRule=self)
+
+        self._readonly = readonly
+        
+    def __repr__(self):
+        return u"cssutils.css.%s(mediaText=%r, variables=%r)" % (
+                self.__class__.__name__, 
+                self._media.mediaText,
+                self.variables.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object mediaText=%r variables=%r valid=%r " \
+               u"at 0x%x>" % (self.__class__.__name__,
+                              self._media.mediaText,
+                              self.variables.cssText,
+                              self.valid,
+                              id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSVariablesRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+              
+        Format::
+        
+            variables
+            : VARIABLES_SYM S* medium [ COMMA S* medium ]* LBRACE S* 
+              variableset* '}' S*
+            ;
+            
+            variableset
+            : LBRACE S* vardeclaration [ ';' S* vardeclaration ]* '}' S*
+            ;
+        """
+        super(CSSVariablesRule, self)._setCssText(cssText)
+
+        tokenizer = self._tokenize2(cssText)
+        attoken = self._nexttoken(tokenizer, None)
+        if self._type(attoken) != self._prods.VARIABLES_SYM:
+            self._log.error(u'CSSVariablesRule: No CSSVariablesRule found: %s' %
+                            self._valuestr(cssText),
+                            error=xml.dom.InvalidModificationErr)
+        else:
+            newVariables = CSSVariablesDeclaration(parentRule=self)
+            ok = True
+            
+            beforetokens, brace = self._tokensupto2(tokenizer, 
+                                                    blockstartonly=True,
+                                                    separateEnd=True)            
+            if self._tokenvalue(brace) != u'{':
+                ok = False
+                self._log.error(u'CSSVariablesRule: No start { of variable '
+                                u'declaration found: %r' 
+                                % self._valuestr(cssText), brace)
+            
+            # parse stuff before { which should be comments and S only
+            new = {'wellformed': True}
+            newseq = self._tempSeq()#[]
+            
+            beforewellformed, expected = self._parse(expected=':',
+                seq=newseq, tokenizer=self._tokenize2(beforetokens),
+                productions={})
+            ok = ok and beforewellformed and new['wellformed']
+    
+            variablestokens, braceorEOFtoken = self._tokensupto2(tokenizer, 
+                                                             blockendonly=True,
+                                                             separateEnd=True)
+
+            val, type_ = self._tokenvalue(braceorEOFtoken), \
+                         self._type(braceorEOFtoken)
+            if val != u'}' and type_ != 'EOF':
+                ok = False
+                self._log.error(u'CSSVariablesRule: No "}" after variables '
+                                u'declaration found: %r'
+                                % self._valuestr(cssText))
+                
+            nonetoken = self._nexttoken(tokenizer)
+            if nonetoken:
+                ok = False
+                self._log.error(u'CSSVariablesRule: Trailing content found.',
+                                token=nonetoken)
+
+            if 'EOF' == type_:
+                # add again as variables needs it
+                variablestokens.append(braceorEOFtoken)
+            # SET but may raise:
+            newVariables.cssText = variablestokens
+
+            if ok:
+                # contains probably comments only upto {
+                self._setSeq(newseq)
+                self.variables = newVariables
+
+    cssText = property(_getCssText, _setCssText,
+                       doc=u"(DOM) The parsable textual representation of this "
+                           u"rule.")
+
+    media = property(doc=u"NOT IMPLEMENTED! As cssutils resolves variables "\
+                         u"during serializing media information is lost.")
+
+    def _setVariables(self, variables):
+        """
+        :param variables:
+            a CSSVariablesDeclaration or string
+        """
+        self._checkReadonly()
+        if isinstance(variables, basestring):
+            self._variables = CSSVariablesDeclaration(cssText=variables, 
+                                                      parentRule=self)
+        else:
+            variables._parentRule = self
+            self._variables = variables
+
+    variables = property(lambda self: self._variables, _setVariables,
+                         doc=u"(DOM) The variables of this rule set, a "
+                             u":class:`cssutils.css.CSSVariablesDeclaration`.")
+
+    type = property(lambda self: self.VARIABLES_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+
+    valid = property(lambda self: True, doc='NOT IMPLEMTED REALLY (TODO)')
+    
+    # constant but needed:
+    wellformed = property(lambda self: True)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csscomment.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csscomment.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csscomment.py	(revision 1126)
@@ -0,0 +1,87 @@
+"""CSSComment is not defined in DOM Level 2 at all but a cssutils defined
+class only.
+
+Implements CSSRule which is also extended for a CSSComment rule type.
+"""
+__all__ = ['CSSComment']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSComment(cssrule.CSSRule):
+    """
+    Represents a CSS comment (cssutils only).
+
+    Format::
+
+        /*...*/
+    """
+    def __init__(self, cssText=None, parentRule=None, 
+                 parentStyleSheet=None, readonly=False):
+        super(CSSComment, self).__init__(parentRule=parentRule, 
+                                         parentStyleSheet=parentStyleSheet)
+
+        self._cssText = None
+        if cssText:
+            self._setCssText(cssText)
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(cssText=%r)" % (
+                self.__class__.__name__, 
+                self.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object cssText=%r at 0x%x>" % (
+                self.__class__.__name__, 
+                self.cssText, 
+                id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSComment(self)
+
+    def _setCssText(self, cssText):
+        """
+        :param cssText:
+            textual text to set or tokenlist which is not tokenized
+            anymore. May also be a single token for this rule
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        super(CSSComment, self)._setCssText(cssText)
+        tokenizer = self._tokenize2(cssText)
+
+        commenttoken = self._nexttoken(tokenizer)
+        unexpected = self._nexttoken(tokenizer)
+
+        if not commenttoken or\
+           self._type(commenttoken) != self._prods.COMMENT or\
+           unexpected:
+            self._log.error(u'CSSComment: Not a CSSComment: %r' %
+                self._valuestr(cssText),
+                error=xml.dom.InvalidModificationErr)
+        else:
+            self._cssText = self._tokenvalue(commenttoken)
+
+    cssText = property(_getCssText, _setCssText,
+        doc=u"The parsable textual representation of this rule.")
+
+    type = property(lambda self: self.COMMENT, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+    
+    # constant but needed:
+    wellformed = property(lambda self: True)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssimportrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssimportrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssimportrule.py	(revision 1126)
@@ -0,0 +1,396 @@
+"""CSSImportRule implements DOM Level 2 CSS CSSImportRule plus the 
+``name`` property from http://www.w3.org/TR/css3-cascade/#cascading."""
+__all__ = ['CSSImportRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssrule
+import cssutils
+import os
+import urlparse
+import xml.dom
+
+class CSSImportRule(cssrule.CSSRule):
+    """
+    Represents an @import rule within a CSS style sheet.  The @import rule
+    is used to import style rules from other style sheets.
+
+    Format::
+
+        import
+          : IMPORT_SYM S*
+          [STRING|URI] S* [ medium [ COMMA S* medium]* ]? S* STRING? S* ';' S*
+          ;
+    """
+    def __init__(self, href=None, mediaText=None, name=None,
+                 parentRule=None, parentStyleSheet=None, readonly=False):
+        """
+        If readonly allows setting of properties in constructor only
+
+        :param href:
+            location of the style sheet to be imported.
+        :param mediaText:
+            A list of media types for which this style sheet may be used
+            as a string
+        :param name:
+            Additional name of imported style sheet
+        """
+        super(CSSImportRule, self).__init__(parentRule=parentRule,
+                                            parentStyleSheet=parentStyleSheet)
+        self._atkeyword = u'@import'
+        self._styleSheet = None
+
+        # string or uri used for reserialization
+        self.hreftype = None
+
+        # prepare seq
+        seq = self._tempSeq()
+        seq.append(None, 'href')
+        #seq.append(None, 'media')
+        seq.append(None, 'name')            
+        self._setSeq(seq)
+
+        # 1. media 
+        if mediaText:
+            self.media = mediaText
+        else:
+            # must be all for @import
+            self.media = cssutils.stylesheets.MediaList(mediaText=u'all')
+        # 2. name
+        self.name = name
+        # 3. href and styleSheet
+        self.href = href
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        if self._usemedia:
+            mediaText = self.media.mediaText
+        else:
+            mediaText = None
+        return u"cssutils.css.%s(href=%r, mediaText=%r, name=%r)" % (
+                self.__class__.__name__,
+                self.href, 
+                self.media.mediaText, 
+                self.name)
+
+    def __str__(self):
+        if self._usemedia:
+            mediaText = self.media.mediaText
+        else:
+            mediaText = None
+        return u"<cssutils.css.%s object href=%r mediaText=%r name=%r at 0x%x>"\
+               % (self.__class__.__name__, 
+                  self.href, 
+                  mediaText, 
+                  self.name, 
+                  id(self))
+
+    _usemedia = property(lambda self: self.media.mediaText not in (u'', u'all'),
+                         doc="if self.media is used (or simply empty)")
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSImportRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :exceptions:    
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+        """
+        super(CSSImportRule, self)._setCssText(cssText)
+        tokenizer = self._tokenize2(cssText)
+        attoken = self._nexttoken(tokenizer, None)
+        if self._type(attoken) != self._prods.IMPORT_SYM:
+            self._log.error(u'CSSImportRule: No CSSImportRule found: %s' %
+                            self._valuestr(cssText),
+                            error=xml.dom.InvalidModificationErr)
+        else:
+            # for closures: must be a mutable
+            new = {'keyword': self._tokenvalue(attoken),
+                   'href': None,
+                   'hreftype': None,
+                   'media': None,
+                   'name': None,
+                   'wellformed': True
+                   }
+
+            def __doname(seq, token):
+                # called by _string or _ident
+                new['name'] = self._stringtokenvalue(token)
+                seq.append(new['name'], 'name')
+                return ';'
+
+            def _string(expected, seq, token, tokenizer=None):
+                if 'href' == expected:
+                    # href
+                    new['href'] = self._stringtokenvalue(token)
+                    new['hreftype'] = 'string'
+                    seq.append(new['href'], 'href')
+                    return 'media name ;'
+                elif 'name' in expected:
+                    # name
+                    return __doname(seq, token)
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'CSSImportRule: Unexpected string.', token)
+                    return expected
+
+            def _uri(expected, seq, token, tokenizer=None):
+                # href
+                if 'href' == expected:
+                    uri = self._uritokenvalue(token)
+                    new['hreftype'] = 'uri'
+                    new['href'] = uri
+                    seq.append(new['href'], 'href')
+                    return 'media name ;'
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'CSSImportRule: Unexpected URI.', token)
+                    return expected
+
+            def _ident(expected, seq, token, tokenizer=None):
+                # medialist ending with ; which is checked upon too
+                if expected.startswith('media'):
+                    mediatokens = self._tokensupto2(
+                        tokenizer, importmediaqueryendonly=True)
+                    mediatokens.insert(0, token) # push found token
+
+                    last = mediatokens.pop() # retrieve ;
+                    lastval, lasttyp = self._tokenvalue(last), self._type(last)
+                    if lastval != u';' and lasttyp not in ('EOF', 
+                                                           self._prods.STRING):
+                        new['wellformed'] = False
+                        self._log.error(u'CSSImportRule: No ";" found: %s' %
+                                        self._valuestr(cssText), token=token)
+
+                    newMedia = cssutils.stylesheets.MediaList(parentRule=self)
+                    newMedia.mediaText = mediatokens
+                    if newMedia.wellformed:
+                        new['media'] = newMedia
+                        seq.append(newMedia, 'media')
+                    else:
+                        new['wellformed'] = False
+                        self._log.error(u'CSSImportRule: Invalid MediaList: %s' %
+                                        self._valuestr(cssText), token=token)
+
+                    if lasttyp == self._prods.STRING:
+                        # name
+                        return __doname(seq, last)
+                    else:
+                        return 'EOF' # ';' is token "last"
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'CSSImportRule: Unexpected ident.', token)
+                    return expected
+
+            def _char(expected, seq, token, tokenizer=None):
+                # final ;
+                val = self._tokenvalue(token)
+                if expected.endswith(';') and u';' == val:
+                    return 'EOF'
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'CSSImportRule: Unexpected char.', token)
+                    return expected
+
+            # import : IMPORT_SYM S* [STRING|URI]
+            #            S* [ medium [ ',' S* medium]* ]? ';' S*
+            #         STRING? # see http://www.w3.org/TR/css3-cascade/#cascading
+            #        ;
+            newseq = self._tempSeq()
+            wellformed, expected = self._parse(expected='href',
+                seq=newseq, tokenizer=tokenizer,
+                productions={'STRING': _string,
+                             'URI': _uri,
+                             'IDENT': _ident,
+                             'CHAR': _char},
+                new=new)
+
+            # wellformed set by parse
+            ok = wellformed and new['wellformed']
+
+            # post conditions
+            if not new['href']:
+                ok = False
+                self._log.error(u'CSSImportRule: No href found: %s' %
+                    self._valuestr(cssText))
+
+            if expected != 'EOF':
+                ok = False
+                self._log.error(u'CSSImportRule: No ";" found: %s' %
+                    self._valuestr(cssText))
+
+            # set all
+            if ok:
+                self._setSeq(newseq)
+                
+                self.atkeyword = new['keyword']
+                self.hreftype = new['hreftype']
+                self.name = new['name']
+                
+                if new['media']:
+                    self.media = new['media']
+                else:
+                    # must be all for @import
+                    self.media = cssutils.stylesheets.MediaList(mediaText=u'all')
+
+                # needs new self.media
+                self.href = new['href']
+
+    cssText = property(fget=_getCssText, fset=_setCssText,
+        doc="(DOM) The parsable textual representation of this rule.")
+
+    def _setHref(self, href):
+        # set new href
+        self._href = href
+        # update seq
+        for i, item in enumerate(self.seq):
+            val, type_ = item.value, item.type
+            if 'href' == type_:
+                self._seq[i] = (href, type_, item.line, item.col)
+                break
+
+        importedSheet = cssutils.css.CSSStyleSheet(media=self.media,
+                                                   ownerRule=self,
+                                                   title=self.name)
+        self.hrefFound = False  
+        # set styleSheet
+        if href and self.parentStyleSheet:
+            # loading errors are all catched!
+
+            # relative href
+            parentHref = self.parentStyleSheet.href
+            if parentHref is None:
+                # use cwd instead
+                parentHref = cssutils.helper.path2url(os.getcwd()) + '/'
+                
+            fullhref = urlparse.urljoin(parentHref, self.href)
+
+            # all possible exceptions are ignored
+            try:
+                usedEncoding, enctype, cssText = \
+                    self.parentStyleSheet._resolveImport(fullhref)
+
+                if cssText is None:
+                    # catched in next except below!
+                    raise IOError('Cannot read Stylesheet.')
+                
+                # contentEncoding with parentStyleSheet.overrideEncoding,
+                # HTTP or parent
+                encodingOverride, encoding = None, None
+
+                if enctype == 0:
+                    encodingOverride = usedEncoding
+                elif 0 < enctype < 5:
+                    encoding = usedEncoding
+
+                # inherit fetcher for @imports in styleSheet
+                importedSheet._href = fullhref
+                importedSheet._setFetcher(self.parentStyleSheet._fetcher)
+                importedSheet._setCssTextWithEncodingOverride(
+                                            cssText, 
+                                            encodingOverride=encodingOverride,
+                                            encoding=encoding)
+
+            except (OSError, IOError, ValueError), e:
+                self._log.warn(u'CSSImportRule: While processing imported '
+                               u'style sheet href=%s: %r'
+                               % (self.href, e), neverraise=True)
+                
+            else:
+                # used by resolveImports if to keep unprocessed href 
+                self.hrefFound = True
+            
+        self._styleSheet = importedSheet   
+
+    _href = None # needs to be set 
+    href = property(lambda self: self._href, _setHref,
+                    doc=u"Location of the style sheet to be imported.")
+
+    def _setMedia(self, media):
+        """
+        :param media:
+            a :class:`~cssutils.stylesheets.MediaList` or string
+        """
+        self._checkReadonly()
+        if isinstance(media, basestring):
+            self._media = cssutils.stylesheets.MediaList(mediaText=media, 
+                                                         parentRule=self)
+        else:
+            media._parentRule = self
+            self._media = media
+        
+        # update seq
+        ihref = 0
+        for i, item in enumerate(self.seq):
+            if item.type == 'href':
+                ihref = i
+            elif item.type == 'media':
+                self.seq[i] = (self._media, 'media', None, None)
+                break
+        else:
+            # if no media until now add after href
+            self.seq.insert(ihref+1, 
+                            self._media, 'media', None, None)
+        
+    media = property(lambda self: self._media, _setMedia,
+                     doc=u"(DOM) A list of media types for this rule "
+                         u"of type :class:`~cssutils.stylesheets.MediaList`.")
+
+    def _setName(self, name=u''):
+        """Raises xml.dom.SyntaxErr if name is not a string."""
+        if name is None or isinstance(name, basestring):
+            # "" or '' handled as None
+            if not name:
+                name = None
+
+            # save name
+            self._name = name
+                
+            # update seq
+            for i, item in enumerate(self.seq):
+                val, typ = item.value, item.type
+                if 'name' == typ:
+                    self._seq[i] = (name, typ, item.line, item.col)
+                    break
+                
+            # set title of imported sheet
+            if self.styleSheet:
+                self.styleSheet.title = name
+                
+        else:
+            self._log.error(u'CSSImportRule: Not a valid name: %s' % name)
+
+    name = property(lambda self: self._name, _setName,
+                    doc=u"An optional name for the imported sheet.")
+
+    styleSheet = property(lambda self: self._styleSheet,
+                          doc=u"(readonly) The style sheet referred to by this "
+                              u"rule.")
+
+    type = property(lambda self: self.IMPORT_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+
+    def _getWellformed(self):
+        "Depending on if media is used at all."
+        if self._usemedia:
+            return bool(self.href and self.media.wellformed)
+        else:
+            return bool(self.href)
+
+    wellformed = property(_getWellformed)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/value.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/value.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/value.py	(revision 1126)
@@ -0,0 +1,998 @@
+"""Value related classes.
+
+DOM Level 2 CSS CSSValue, CSSPrimitiveValue and CSSValueList are **no longer**
+supported and are replaced by these new classes.
+"""
+__all__ = ['PropertyValue',
+           'Value',
+           'ColorValue',
+           'DimensionValue',
+           'URIValue',
+           'CSSFunction',
+           'CSSCalc',
+           'CSSVariable',
+           'MSValue'
+           ]
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.prodparser import *
+import cssutils
+from cssutils.helper import normalize, pushtoken
+import colorsys
+import math
+import re
+import xml.dom
+import urlparse
+
+class PropertyValue(cssutils.util._NewBase):
+    """
+    An unstructured list like holder for all values defined for a
+    :class:`~cssutils.css.Property`. Contains :class:`~cssutils.css.Value`
+    or subclass objects. Currently there is no access to the combinators of
+    the defined values which might simply be space or comma or slash.
+
+    You may:
+
+    - iterate over all contained Value objects (not the separators like ``,``,
+      ``/`` or `` `` though!)
+    - get a Value item by index or use ``PropertyValue[index]``
+    - find out the number of values defined (unstructured)
+    """
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        """
+        :param cssText:
+            the parsable cssText of the value
+        :param readonly:
+            defaults to False
+        """
+        super(PropertyValue, self).__init__()
+
+        self.parent = parent
+        self.wellformed = False
+
+        if cssText is not None: # may be 0
+            if isinstance(cssText, (int, float)):
+                cssText = unicode(cssText) # if it is a number
+            self.cssText = cssText
+
+        self._readonly = readonly
+
+    def __len__(self):
+        return len(list(self.__items()))
+
+    def __getitem__(self, index):
+        try:
+            return list(self.__items())[index]
+        except IndexError:
+            return None
+
+    def __iter__(self):
+        "Generator which iterates over values."
+        for item in self.__items():
+            yield item
+
+    def __repr__(self):
+        return u"cssutils.css.%s(%r)" % (self.__class__.__name__,
+                                         self.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object length=%r cssText=%r at "\
+               u"0x%x>" % (self.__class__.__name__,
+                           self.length, self.cssText, id(self))
+
+    def __items(self, seq=None):
+        "a generator of Value obects only, no , / or ' '"
+        if seq is None:
+            seq = self.seq
+        return (x.value for x in seq if isinstance(x.value, Value))
+
+    def _setCssText(self, cssText):
+        if isinstance(cssText, (int, float)):
+            cssText = unicode(cssText) # if it is a number
+        """
+        Format::
+
+            unary_operator
+              : '-' | '+'
+              ;
+            operator
+              : '/' S* | ',' S* | /* empty */
+              ;
+            expr
+              : term [ operator term ]*
+              ;
+            term
+              : unary_operator?
+                [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* |
+                  ANGLE S* | TIME S* | FREQ S* ]
+              | STRING S* | IDENT S* | URI S* | hexcolor | function
+              | UNICODE-RANGE S*
+              ;
+            function
+              : FUNCTION S* expr ')' S*
+              ;
+            /*
+             * There is a constraint on the color that it must
+             * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F])
+             * after the "#"; e.g., "#000" is OK, but "#abcd" is not.
+             */
+            hexcolor
+              : HASH S*
+              ;
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error
+              (according to the attached property) or is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              TODO: Raised if the specified CSS string value represents a
+              different type of values than the values allowed by the CSS
+              property.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this value is readonly.
+        """
+        self._checkReadonly()
+
+        # used as operator is , / or S
+        nextSor = u',/'
+        term = Choice(_ColorProd(self, nextSor),
+                      _DimensionProd(self, nextSor),
+                      _URIProd(self, nextSor),
+                      _ValueProd(self, nextSor),
+#                      _Rect(self, nextSor),
+                      # all other functions
+                      _CSSVariableProd(self, nextSor),
+                      _MSValueProd(self, nextSor),
+                      _CalcValueProd(self, nextSor),
+                      _CSSFunctionProd(self, nextSor)
+                      )
+        operator = Choice(PreDef.S(toSeq=False),
+                          PreDef.char('comma', ',',
+                                      toSeq=lambda t, tokens: ('operator', t[1]),
+                                      optional=True
+                                      ),
+                          PreDef.char('slash', '/',
+                                      toSeq=lambda t, tokens: ('operator', t[1]),
+                                      optional=True),
+                          optional=True)
+        prods = Sequence(term,
+                         Sequence(# mayEnd this Sequence if whitespace
+                                  operator,
+                                  # TODO: only when setting via other class
+                                  # used by variabledeclaration currently
+                                  PreDef.char('END', ';',
+                                              stopAndKeep=True,
+                                              optional=True),
+                                  # TODO: } and !important ends too!
+                                  term,
+                                  minmax=lambda: (0, None)))
+        # parse
+        ok, seq, store, unused = ProdParser().parse(cssText,
+                                                    u'PropertyValue',
+                                                    prods)
+        # must be at least one value!
+        ok = ok and len(list(self.__items(seq))) > 0
+
+        for item in seq:
+            if hasattr(item.value, 'wellformed') and not item.value.wellformed:
+                ok = False
+                break
+
+        self.wellformed = ok
+        if ok:
+            self._setSeq(seq)
+        else:
+            self._log.error(u'PropertyValue: Unknown syntax or no value: %s' %
+                            self._valuestr(cssText))
+
+    cssText = property(lambda self: cssutils.ser.do_css_PropertyValue(self),
+                       _setCssText,
+                       doc="A string representation of the current value.")
+
+    def item(self, index):
+        """
+        The value at position `index`. Alternatively simple use
+        ``PropertyValue[index]``.
+
+        :param index:
+            the parsable cssText of the value
+        :exceptions:
+            - :exc:`~IndexError`:
+              Raised if index if out of bounds
+        """
+        return self[index]
+
+    length = property(lambda self: len(self),
+                      doc=u"Number of values set.")
+
+    value = property(lambda self: cssutils.ser.do_css_PropertyValue(self,
+                                                                    valuesOnly=True),
+                       doc=u"A string representation of the current value "
+                           u"without any comments used for validation.")
+
+
+class Value(cssutils.util._NewBase):
+    """
+    Represents a single CSS value. For now simple values of
+    IDENT, STRING, or UNICODE-RANGE values are represented directly
+    as Value objects. Other values like e.g. FUNCTIONs are represented by
+    subclasses with an extended API.
+    """
+    IDENT = u'IDENT'
+    STRING = u'STRING'
+    UNICODE_RANGE = u'UNICODE-RANGE'
+    URI = u'URI'
+
+    DIMENSION = u'DIMENSION'
+    NUMBER = u'NUMBER'
+    PERCENTAGE = u'PERCENTAGE'
+
+    COLOR_VALUE = u'COLOR_VALUE'
+    HASH = u'HASH'
+
+    FUNCTION = u'FUNCTION'
+    CALC = u'CALC'
+    VARIABLE = u'VARIABLE'
+
+    _type = None
+    _value = u''
+
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        super(Value, self).__init__()
+
+        self.parent = parent
+        self.wellformed = False
+
+        if cssText:
+            self.cssText = cssText
+
+    def __repr__(self):
+        return u"cssutils.css.%s(%r)" % (self.__class__.__name__,
+                                         self.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object type=%s value=%r cssText=%r at 0x%x>"\
+               % (self.__class__.__name__,
+                  self.type, self.value, self.cssText,
+                  id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+
+        prods = Choice(PreDef.hexcolor(stop=True),
+                       PreDef.ident(stop=True),
+                       PreDef.string(stop=True),
+                       PreDef.unicode_range(stop=True),
+                       )
+        ok, seq, store, unused = ProdParser().parse(cssText, u'Value', prods)
+        self.wellformed = ok
+        if ok:
+            # only 1 value anyway!
+            self._type = seq[0].type
+            self._value = seq[0].value
+
+            self._setSeq(seq)
+
+    cssText = property(lambda self: cssutils.ser.do_css_Value(self),
+                       _setCssText,
+                       doc=u'String value of this value.')
+
+    type = property(lambda self: self._type, #_setType,
+                    doc=u"Type of this value, for now the production type "
+                        u"like e.g. `DIMENSION` or `STRING`. All types are "
+                        u"defined as constants in :class:`~cssutils.css.Value`.")
+
+    def _setValue(self, value):
+        # TODO: check!
+        self._value = value
+
+    value = property(lambda self: self._value, _setValue,
+                     doc=u"Actual value if possible: An int or float or else "
+                         u" a string")
+
+
+class ColorValue(Value):
+    """
+    A color value like rgb(), rgba(), hsl(), hsla() or #rgb, #rrggbb
+
+    TODO: Color Keywords
+    """
+    from colors import COLORS
+
+    type = Value.COLOR_VALUE
+    # hexcolor, FUNCTION?
+    _colorType = None
+    _red = 0
+    _green = 0
+    _blue = 0
+    _alpha = 0
+
+    def __str__(self):
+        return u"<cssutils.css.%s object type=%s value=%r colorType=%r "\
+               u"red=%s blue=%s green=%s alpha=%s at 0x%x>"\
+               % (self.__class__.__name__,
+                  self.type, self.value,
+                  self.colorType, self.red, self.green, self.blue, self.alpha,
+                  id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+        types = self._prods # rename!
+
+        component = Choice(PreDef.unary(toSeq=lambda t, tokens: (t[0],
+                            DimensionValue(pushtoken(t, tokens),
+                            parent=self)
+                           )),
+                           PreDef.number(toSeq=lambda t, tokens: (t[0],
+                            DimensionValue(pushtoken(t, tokens),
+                            parent=self)
+                           )),
+                           PreDef.percentage(toSeq=lambda t, tokens: (t[0],
+                            DimensionValue(pushtoken(t, tokens),
+                            parent=self)
+                           ))
+                   )
+        noalp = Sequence(Prod(name='FUNCTION',
+                              match=lambda t, v: t == types.FUNCTION and
+                                                 v in (u'rgb(', u'hsl('),
+                              toSeq=lambda t, tokens: (t[0], normalize(t[1]))),
+                          component,
+                          Sequence(PreDef.comma(optional=True),
+                                   component,
+                                   minmax=lambda: (2, 2)
+                                   ),
+                          PreDef.funcEnd(stop=True)
+                          )
+        witha = Sequence(Prod(name='FUNCTION',
+                              match=lambda t, v: t == types.FUNCTION and
+                                                 v in (u'rgba(', u'hsla('),
+                              toSeq=lambda t, tokens: (t[0],
+                                 normalize(t[1]))
+                              ),
+                          component,
+                          Sequence(PreDef.comma(optional=True),
+                                   component,
+                                   minmax=lambda: (3, 3)
+                                   ),
+                          PreDef.funcEnd(stop=True)
+                          )
+        namedcolor = Prod(name='Named Color',
+                     match=lambda t, v: t == 'IDENT' and (
+                                        normalize(v) in self.COLORS.keys()
+                                        ),
+                     stop=True)
+
+        prods = Choice(PreDef.hexcolor(stop=True),
+                       namedcolor,
+                       noalp,
+                       witha)
+
+        ok, seq, store, unused = ProdParser().parse(cssText,
+                                                    self.type,
+                                                    prods)
+        self.wellformed = ok
+        if ok:
+            t, v = seq[0].type, seq[0].value
+            if u'IDENT' == t:
+                rgba = self.COLORS[normalize(v)]
+            if u'HASH' == t:
+                if len(v) == 4:
+                    # HASH #rgb
+                    rgba = (int(2*v[1], 16),
+                            int(2*v[2], 16),
+                            int(2*v[3], 16),
+                            1.0)
+                else:
+                    # HASH #rrggbb
+                    rgba = (int(v[1:3], 16),
+                            int(v[3:5], 16),
+                            int(v[5:7], 16),
+                            1.0)
+
+            elif u'FUNCTION' == t:
+                functiontype, raw, check = None, [], u''
+                HSL = False
+
+                for item in seq:
+                    try:
+                        type_ = item.value.type
+                    except AttributeError, e:
+                        # type of function, e.g. rgb(
+                        if item.type == 'FUNCTION':
+                            functiontype = item.value
+                            HSL = functiontype in (u'hsl(', u'hsla(')
+                        continue
+
+                    # save components
+                    if type_ == Value.NUMBER:
+                        raw.append(item.value.value)
+                        check += u'N'
+                    elif type_ == Value.PERCENTAGE:
+                        if HSL:
+                            # save as percentage fraction
+                            raw.append(item.value.value / 100.0)
+                        else:
+                            # save as real value of percentage of 255
+                            raw.append(int(255 * item.value.value / 100))
+                        check += u'P'
+
+                if HSL:
+                    # convert to rgb
+                    # h is 360 based (circle)
+                    h, s, l = raw[0] / 360.0, raw[1], raw[2]
+                    # ORDER h l s !!!
+                    r, g, b = colorsys.hls_to_rgb(h, l, s)
+                    # back to 255 based
+                    rgba = [int(round(r*255)),
+                            int(round(g*255)),
+                            int(round(b*255))]
+
+                    if len(raw) > 3:
+                        rgba.append(raw[3])
+
+                else:
+                    # rgb, rgba
+                    rgba = raw
+
+                if len(rgba) < 4:
+                    rgba.append(1.0)
+
+                # validate
+                checks = {u'rgb(': ('NNN', 'PPP'),
+                         u'rgba(': ('NNNN', 'PPPN'),
+                         u'hsl(': ('NPP',),
+                         u'hsla(': ('NPPN',)
+                         }
+                if check not in checks[functiontype]:
+                    self._log.error(u'ColorValue has invalid %s) parameters: '
+                                    u'%s (N=Number, P=Percentage)' %
+                                    (functiontype, check))
+
+            self._colorType = t
+            self._red, self._green, self._blue, self._alpha = tuple(rgba)
+            self._setSeq(seq)
+
+    cssText = property(lambda self: cssutils.ser.do_css_ColorValue(self),
+                       _setCssText,
+                       doc=u"String value of this value.")
+
+    value = property(lambda self: cssutils.ser.do_css_CSSFunction(self, True),
+                     doc=u'Same as cssText but without comments.')
+
+    type = property(lambda self: Value.COLOR_VALUE,
+                    doc=u"Type is fixed to Value.COLOR_VALUE.")
+
+    def _getName(self):
+        for n, v in self.COLORS.items():
+            if v == (self.red, self.green, self.blue, self.alpha):
+                return n
+
+    colorType = property(lambda self: self._colorType,
+                    doc=u"IDENT (red), HASH (#f00) or FUNCTION (rgb(255, 0, 0).")
+
+    name = property(_getName,
+                    doc=u'Name of the color if known (in ColorValue.COLORS) '
+                        u'else None')
+
+    red = property(lambda self: self._red,
+                   doc=u'red part as integer between 0 and 255')
+    green = property(lambda self: self._green,
+                     doc=u'green part as integer between 0 and 255')
+    blue = property(lambda self: self._blue,
+                    doc=u'blue part as integer between 0 and 255')
+    alpha = property(lambda self: self._alpha,
+                     doc=u'alpha part as float between 0.0 and 1.0')
+
+class DimensionValue(Value):
+    """
+    A numerical value with an optional dimension like e.g. "px" or "%".
+
+    Covers DIMENSION, PERCENTAGE or NUMBER values.
+    """
+    __reUnNumDim = re.compile(ur'^([+-]?)(\d*\.\d+|\d+)(.*)$', re.I | re.U | re.X)
+    _dimension = None
+    _sign = None
+
+    def __str__(self):
+        return u"<cssutils.css.%s object type=%s value=%r dimension=%r cssText=%r at 0x%x>"\
+               % (self.__class__.__name__,
+                  self.type, self.value, self.dimension, self.cssText,
+                  id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+
+        prods = Sequence(#PreDef.unary(),
+                         Choice(PreDef.dimension(stop=True),
+                                PreDef.number(stop=True),
+                                PreDef.percentage(stop=True)
+                                )
+                         )
+        ok, seq, store, unused = ProdParser().parse(cssText,
+                                                    u'DimensionValue',
+                                                    prods)
+        self.wellformed = ok
+        if ok:
+            item = seq[0]
+
+            sign, v, d = self.__reUnNumDim.findall(
+                                normalize(item.value))[0]
+            if u'.' in v:
+                val = float(sign + v)
+            else:
+                val = int(sign + v)
+
+            dim = None
+            if d:
+                dim = d
+
+            self._sign = sign
+            self._value = val
+            self._dimension = dim
+            self._type = item.type
+
+            self._setSeq(seq)
+
+    cssText = property(lambda self: cssutils.ser.do_css_Value(self),
+                       _setCssText,
+                       doc=u"String value of this value including dimension.")
+
+    dimension = property(lambda self: self._dimension, #_setValue,
+                         doc=u"Dimension if a DIMENSION or PERCENTAGE value, "
+                             u"else None")
+class URIValue(Value):
+    """
+    An URI value like ``url(example.png)``.
+    """
+    _type = Value.URI
+    _uri = Value._value
+
+    def __str__(self):
+        return u"<cssutils.css.%s object type=%s value=%r uri=%r cssText=%r at 0x%x>"\
+               % (self.__class__.__name__,
+                  self.type, self.value, self.uri, self.cssText,
+                  id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+
+        prods = Sequence(PreDef.uri(stop=True))
+
+        ok, seq, store, unused = ProdParser().parse(cssText, u'URIValue', prods)
+        self.wellformed = ok
+        if ok:
+            # only 1 value only anyway
+            self._type = seq[0].type
+            self._value = seq[0].value
+
+            self._setSeq(seq)
+
+    cssText = property(lambda self: cssutils.ser.do_css_Value(self),
+                       _setCssText,
+                       doc=u'String value of this value.')
+
+    def _setUri(self, uri):
+        # TODO: check?
+        self._value = uri
+
+    uri = property(lambda self: self._value, _setUri,
+                         doc=u"Actual URL without delimiters or the empty string")
+
+    def absoluteUri(self):
+        """Actual URL, made absolute if possible, else same as `uri`."""
+        # Ancestry: PropertyValue, Property, CSSStyleDeclaration, CSSStyleRule,
+        # CSSStyleSheet
+        try:
+            # TODO: better way?
+            styleSheet = self.parent.parent.parent.parentRule.parentStyleSheet
+        except AttributeError, e:
+            return self.uri
+        else:
+            return urlparse.urljoin(styleSheet.href, self.uri)
+
+    absoluteUri = property(absoluteUri, doc=absoluteUri.__doc__)
+
+
+class CSSFunction(Value):
+    """
+    A function value.
+    """
+    _functionName = 'Function'
+
+    def _productions(self):
+        """Return definition used for parsing."""
+        types = self._prods # rename!
+
+        itemProd = Choice(_ColorProd(self),
+                          _DimensionProd(self),
+                          _URIProd(self),
+                          _ValueProd(self),
+                          _CalcValueProd(self),
+                          _CSSVariableProd(self),
+                          _CSSFunctionProd(self)
+                          )
+        funcProds = Sequence(Prod(name='FUNCTION',
+                                  match=lambda t, v: t == types.FUNCTION,
+                                  toSeq=lambda t, tokens: (t[0],
+                                                           normalize(t[1]))),
+                             Choice(Sequence(itemProd,
+                                             Sequence(PreDef.comma(optional=True),
+                                                      itemProd,
+                                                      minmax=lambda: (0, None)),
+                                             PreDef.funcEnd(stop=True)),
+                                    PreDef.funcEnd(stop=True))
+         )
+        return funcProds
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+        ok, seq, store, unused = ProdParser().parse(cssText,
+                                                    self.type,
+                                                    self._productions())
+        self.wellformed = ok
+        if ok:
+            self._setSeq(seq)
+
+    cssText = property(lambda self: cssutils.ser.do_css_CSSFunction(self),
+                       _setCssText,
+                       doc=u"String value of this value.")
+
+    value = property(lambda self: cssutils.ser.do_css_CSSFunction(self, True),
+                     doc=u'Same as cssText but without comments.')
+
+    type = property(lambda self: Value.FUNCTION,
+                    doc=u"Type is fixed to Value.FUNCTION.")
+
+class MSValue(CSSFunction):
+    """An IE specific Microsoft only function value which is much looser
+    in what is syntactically allowed."""
+    _functionName = 'MSValue'
+
+    def _productions(self):
+        """Return definition used for parsing."""
+        types = self._prods # rename!
+
+        func = Prod(name='MSValue-Sub',
+                    match=lambda t, v: t == self._prods.FUNCTION,
+                    toSeq=lambda t, tokens: (MSValue._functionName,
+                                     MSValue(pushtoken(t,
+                                                                       tokens
+                                                                       ),
+                                            parent=self
+                                            )
+                                         )
+                    )
+
+        funcProds = Sequence(Prod(name='FUNCTION',
+                                  match=lambda t, v: t == types.FUNCTION,
+                                  toSeq=lambda t, tokens: (t[0], t[1])
+                                  ),
+                             Sequence(Choice(_ColorProd(self),
+                                             _DimensionProd(self),
+                                             _URIProd(self),
+                                             _ValueProd(self),
+                                             _MSValueProd(self),
+                                             #_CalcValueProd(self),
+                                             _CSSVariableProd(self),
+                                             func,
+                                             #_CSSFunctionProd(self),
+                                             Prod(name='MSValuePart',
+                                                  match=lambda t, v: v != u')',
+                                                  toSeq=lambda t, tokens: (t[0], t[1])
+                                                  )
+                                             ),
+                                      minmax=lambda: (0, None)
+                                      ),
+                             PreDef.funcEnd(stop=True)
+                             )
+        return funcProds
+
+    def _setCssText(self, cssText):
+        super(MSValue, self)._setCssText(cssText)
+
+    cssText = property(lambda self: cssutils.ser.do_css_MSValue(self),
+                       _setCssText,
+                       doc=u"String value of this value.")
+
+
+class CSSCalc(CSSFunction):
+    """The CSSCalc function represents a CSS calc() function.
+
+    No further API is provided. For multiplication and division no check
+    if one operand is a NUMBER is made.
+    """
+    _functionName = 'CSSCalc'
+
+    def __str__(self):
+        return u"<cssutils.css.%s object at 0x%x>" % (
+                self.__class__.__name__, id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+
+        types = self._prods # rename!
+
+        _operator = Choice(Prod(name='Operator */',
+                                match=lambda t, v: v in u'*/',
+                                toSeq=lambda t, tokens: (t[0], t[1])
+                           ),
+                           Sequence(
+                               PreDef.S(),
+                               Choice(
+                                 Sequence(
+                                    Prod(name='Operator */',
+                                        match=lambda t, v: v in u'*/',
+                                        toSeq=lambda t, tokens: (t[0], t[1])
+                                    ),
+                                    PreDef.S(optional=True)
+                                 ),
+                                 Sequence(
+                                    Prod(name='Operator +-',
+                                        match=lambda t, v: v in u'+-',
+                                        toSeq=lambda t, tokens: (t[0], t[1])
+                                    ),
+                                    PreDef.S()
+                                 ),
+                                 PreDef.funcEnd(stop=True, mayEnd=True)
+                               )
+                           )
+                    )
+
+        _operant = lambda: Choice(_DimensionProd(self),
+                                   _CSSVariableProd(self))
+
+        prods = Sequence(Prod(name='CALC',
+                                  match=lambda t, v: t == types.FUNCTION and
+                                        normalize(v) == u'calc('
+                         ),
+                         PreDef.S(optional=True),
+                         _operant(),
+                         Sequence(_operator,
+                                  _operant(),
+                                  minmax=lambda: (0, None)
+                                  ),
+                         PreDef.funcEnd(stop=True)
+                )
+
+        # store: name of variable
+        ok, seq, store, unused = ProdParser().parse(cssText,
+                                                    u'CSSCalc',
+                                                    prods,
+                                                    checkS=True)
+        self.wellformed = ok
+        if ok:
+            self._setSeq(seq)
+
+
+    cssText = property(lambda self: cssutils.ser.do_css_CSSCalc(self),
+                       _setCssText, doc=u"String representation of calc function.")
+
+    type = property(lambda self: Value.CALC,
+                    doc=u"Type is fixed to Value.CALC.")
+
+
+
+
+class CSSVariable(CSSFunction):
+    """The CSSVariable represents a CSS variables like ``var(varname)``.
+
+    A variable has a (nonnormalized!) `name` and a `value` which is
+    tried to be resolved from any available CSSVariablesRule definition.
+    """
+    _functionName = 'CSSVariable'
+    _name = None
+    _fallback = None
+
+    def __str__(self):
+        return u"<cssutils.css.%s object name=%r value=%r at 0x%x>" % (
+                self.__class__.__name__, self.name, self.value, id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+
+        types = self._prods # rename!
+        prods = Sequence(Prod(name='var',
+                                  match=lambda t, v: t == types.FUNCTION and
+                                        normalize(v) == u'var('
+                             ),
+                             PreDef.ident(toStore='ident'),
+                             Sequence(PreDef.comma(),
+                                      Choice(_ColorProd(self, toStore='fallback'),
+                                             _DimensionProd(self, toStore='fallback'),
+                                             _URIProd(self, toStore='fallback'),
+                                             _ValueProd(self, toStore='fallback'),
+                                             _CalcValueProd(self, toStore='fallback'),
+                                             _CSSVariableProd(self, toStore='fallback'),
+                                             _CSSFunctionProd(self, toStore='fallback')
+                                             ),
+                                      minmax=lambda: (0, 1)
+                                      ),
+                             PreDef.funcEnd(stop=True))
+
+        # store: name of variable
+        store = {'ident': None, 'fallback': None}
+        ok, seq, store, unused = ProdParser().parse(cssText,
+                                                    u'CSSVariable',
+                                                    prods)
+        self.wellformed = ok
+
+        if ok:
+            self._name = store['ident'].value
+            try:
+                self._fallback = store['fallback'].value
+            except KeyError:
+                self._fallback = None
+
+            self._setSeq(seq)
+
+    cssText = property(lambda self: cssutils.ser.do_css_CSSVariable(self),
+                       _setCssText, doc=u"String representation of variable.")
+
+    # TODO: writable? check if var (value) available?
+    name = property(lambda self: self._name,
+                    doc=u"The name identifier of this variable referring to "
+                        u"a value in a "
+                        u":class:`cssutils.css.CSSVariablesDeclaration`.")
+
+    fallback = property(lambda self: self._fallback,
+                doc=u"The fallback Value of this variable")
+
+    type = property(lambda self: Value.VARIABLE,
+                    doc=u"Type is fixed to Value.VARIABLE.")
+
+    def _getValue(self):
+        "Find contained sheet and @variables there"
+        rel = self
+        while True:
+            # find node which has parentRule to get to StyleSheet
+            if hasattr(rel, 'parent'):
+                rel = rel.parent
+            else:
+                break
+        try:
+            variables = rel.parentRule.parentStyleSheet.variables
+        except AttributeError:
+            return None
+        else:
+            try:
+                return variables[self.name]
+            except KeyError:
+                return None
+
+    value = property(_getValue,
+                     doc=u'The resolved actual value or None.')
+
+
+
+# helper for productions
+def _ValueProd(parent, nextSor=False, toStore=None):
+    return Prod(name='Value',
+                match=lambda t, v: t in ('IDENT', 'STRING', 'UNICODE-RANGE'),
+                nextSor = nextSor,
+                toStore=toStore,
+                toSeq=lambda t, tokens: ('Value', Value(pushtoken(t, tokens),
+                                         parent=parent)
+                                         )
+                )
+
+
+def _DimensionProd(parent, nextSor=False, toStore=None):
+    return Prod(name='Dimension',
+                match=lambda t, v: t in (u'DIMENSION',
+                                         u'NUMBER',
+                                         u'PERCENTAGE'),
+                nextSor = nextSor,
+                toStore=toStore,
+                toSeq=lambda t, tokens: (u'DIMENSION', DimensionValue(
+                                            pushtoken(t,
+                                                      tokens),
+                                            parent=parent)
+                                         )
+                )
+
+def _URIProd(parent, nextSor=False, toStore=None):
+    return Prod(name='URIValue',
+                match=lambda t, v: t == 'URI',
+                toStore=toStore,
+                nextSor = nextSor,
+                toSeq=lambda t, tokens: ('URIValue', URIValue(
+                                            pushtoken(t,
+                                                                      tokens),
+                                         parent=parent)
+                                         )
+                )
+
+reHexcolor = re.compile(r'^\#(?:[0-9abcdefABCDEF]{3}|[0-9abcdefABCDEF]{6})$')
+
+def _ColorProd(parent, nextSor=False, toStore=None):
+    return Prod(name='ColorValue',
+                match=lambda t, v:
+                                   (t == 'HASH' and
+                                    reHexcolor.match(v)
+                                    ) or
+                                   (t == 'FUNCTION' and
+                                    normalize(v) in (u'rgb(',
+                                                     u'rgba(',
+                                                     u'hsl(',
+                                                     u'hsla(')
+                                    ) or
+                                   (t == 'IDENT' and
+                                    normalize(v) in ColorValue.COLORS.keys()
+                                    ),
+                nextSor = nextSor,
+                toStore=toStore,
+                toSeq=lambda t, tokens: ('ColorValue', ColorValue(
+                                            pushtoken(t,
+                                                                      tokens),
+                                         parent=parent)
+                                         )
+                )
+
+def _CSSFunctionProd(parent, nextSor=False, toStore=None):
+    return PreDef.function(nextSor=nextSor,
+                           toStore=toStore,
+                           toSeq=lambda t, tokens: (CSSFunction._functionName,
+                                                    CSSFunction(
+                                pushtoken(t, tokens),
+                                parent=parent)
+                                )
+                           )
+
+def _CalcValueProd(parent, nextSor=False, toStore=None):
+    return Prod(name=CSSCalc._functionName,
+                    match=lambda t, v: t == PreDef.types.FUNCTION and
+                        normalize(v) == u'calc(',
+                    toStore=toStore,
+                    toSeq=lambda t, tokens: (CSSCalc._functionName,
+                                                    CSSCalc(
+                                pushtoken(t, tokens),
+                                parent=parent)
+                                                    ),
+                    nextSor=nextSor)
+
+def _CSSVariableProd(parent, nextSor=False, toStore=None):
+    return PreDef.variable(nextSor=nextSor,
+                           toStore=toStore,
+                           toSeq=lambda t, tokens: (CSSVariable._functionName,
+                                                    CSSVariable(
+                                pushtoken(t, tokens),
+                                parent=parent)
+                                                    )
+                           )
+
+def _MSValueProd(parent, nextSor=False):
+    return Prod(name=MSValue._functionName,
+                match=lambda t, v: (#t == self._prods.FUNCTION and (
+                    normalize(v) in (u'expression(',
+                                                     u'alpha(',
+                                                     u'blur(',
+                                                     u'chroma(',
+                                                     u'dropshadow(',
+                                                     u'fliph(',
+                                                     u'flipv(',
+                                                     u'glow(',
+                                                     u'gray(',
+                                                     u'invert(',
+                                                     u'mask(',
+                                                     u'shadow(',
+                                                     u'wave(',
+                                                     u'xray(') or
+                    v.startswith(u'progid:DXImageTransform.Microsoft.')
+                    ),
+                nextSor=nextSor,
+                toSeq=lambda t, tokens: (MSValue._functionName,
+                                         MSValue(pushtoken(t,
+                                                                           tokens
+                                                                           ),
+                                                 parent=parent
+                                                 )
+                                         )
+                )
+
+
+def MediaQueryValueProd(parent):
+    return Choice(_ColorProd(parent),
+                  _DimensionProd(parent),
+                  _ValueProd(parent),
+                  )
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/selectorlist.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/selectorlist.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/selectorlist.py	(revision 1126)
@@ -0,0 +1,234 @@
+"""SelectorList is a list of CSS Selector objects.
+
+TODO
+    - remove duplicate Selectors. -> CSSOM canonicalize
+
+    - ??? CSS2 gives a special meaning to the comma (,) in selectors.
+        However, since it is not known if the comma may acquire other
+        meanings in future versions of CSS, the whole statement should be
+        ignored if there is an error anywhere in the selector, even though
+        the rest of the selector may look reasonable in CSS2.
+
+        Illegal example(s):
+
+        For example, since the "&" is not a valid token in a CSS2 selector,
+        a CSS2 user agent must ignore the whole second line, and not set
+        the color of H3 to red:
+"""
+__all__ = ['SelectorList']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from selector import Selector
+import cssutils
+import xml.dom
+
+class SelectorList(cssutils.util.Base, cssutils.util.ListSeq):
+    """A list of :class:`~cssutils.css.Selector` objects
+    of a :class:`~cssutils.css.CSSStyleRule`."""
+    def __init__(self, selectorText=None, parentRule=None,
+                 readonly=False):
+        """
+        :Parameters:
+            selectorText
+                parsable list of Selectors
+            parentRule
+                the parent CSSRule if available
+        """
+        super(SelectorList, self).__init__()
+
+        self._parentRule = parentRule
+
+        if selectorText:
+            self.selectorText = selectorText
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        if self._namespaces:
+            st = (self.selectorText, self._namespaces)
+        else:
+            st = self.selectorText
+        return u"cssutils.css.%s(selectorText=%r)" % (self.__class__.__name__, 
+                                                      st)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object selectorText=%r _namespaces=%r at " \
+               u"0x%x>" % (self.__class__.__name__,
+                           self.selectorText,
+                           self._namespaces,
+                           id(self))
+
+    def __setitem__(self, index, newSelector):
+        """Overwrite ListSeq.__setitem__
+
+        Any duplicate Selectors are **not** removed.
+        """
+        newSelector = self.__prepareset(newSelector)
+        if newSelector:
+            self.seq[index] = newSelector
+
+    def __prepareset(self, newSelector, namespaces=None):
+        "Used by appendSelector and __setitem__"
+        if not namespaces:
+            namespaces = {}
+        self._checkReadonly()
+        if not isinstance(newSelector, Selector):
+            newSelector = Selector((newSelector, namespaces),
+                                   parent=self)
+        if newSelector.wellformed:
+            newSelector._parent = self # maybe set twice but must be!
+            return newSelector
+
+    def __getNamespaces(self):
+        """Use children namespaces if not attached to a sheet, else the sheet's
+        ones.
+        """
+        try:
+            return self.parentRule.parentStyleSheet.namespaces
+        except AttributeError:
+            namespaces = {}
+            for selector in self.seq:
+                namespaces.update(selector._namespaces)
+            return namespaces
+
+    def _getUsedUris(self):
+        "Used by CSSStyleSheet to check if @namespace rules are needed"
+        uris = set()
+        for s in self:
+            uris.update(s._getUsedUris())
+        return uris
+
+    _namespaces = property(__getNamespaces, doc="""If this SelectorList is
+        attached to a CSSStyleSheet the namespaces of that sheet are mirrored
+        here. While the SelectorList (or parentRule(s) are
+        not attached the namespaces of all children Selectors are used.""")
+
+    def append(self, newSelector):
+        "Same as :meth:`appendSelector`."
+        self.appendSelector(newSelector)
+
+    def appendSelector(self, newSelector):
+        """
+        Append `newSelector` to this list (a string will be converted to a 
+        :class:`~cssutils.css.Selector`).
+
+        :param newSelector:
+            comma-separated list of selectors (as a single string) or a tuple of
+            `(newSelector, dict-of-namespaces)`
+        :returns: New :class:`~cssutils.css.Selector` or ``None`` if 
+            `newSelector` is not wellformed.
+        :exceptions:
+            - :exc:`~xml.dom.NamespaceErr`:
+              Raised if the specified selector uses an unknown namespace
+              prefix.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error
+              and is unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this rule is readonly.
+        """
+        self._checkReadonly()
+
+        # might be (selectorText, namespaces)
+        newSelector, namespaces = self._splitNamespacesOff(newSelector)
+        try:
+            # use parent's only if available
+            namespaces = self.parentRule.parentStyleSheet.namespaces
+        except AttributeError:
+            # use already present namespaces plus new given ones
+            _namespaces = self._namespaces
+            _namespaces.update(namespaces)
+            namespaces = _namespaces
+
+        newSelector = self.__prepareset(newSelector, namespaces)
+        if newSelector:
+            seq = self.seq[:]
+            del self.seq[:]
+            for s in seq:
+                if s.selectorText != newSelector.selectorText:
+                    self.seq.append(s)
+            self.seq.append(newSelector)
+            return newSelector
+
+    def _getSelectorText(self):
+        "Return serialized format."
+        return cssutils.ser.do_css_SelectorList(self)
+
+    def _setSelectorText(self, selectorText):
+        """
+        :param selectorText:
+            comma-separated list of selectors or a tuple of
+            (selectorText, dict-of-namespaces)
+        :exceptions:
+            - :exc:`~xml.dom.NamespaceErr`:
+              Raised if the specified selector uses an unknown namespace
+              prefix.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error
+              and is unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this rule is readonly.
+        """
+        self._checkReadonly()
+
+        # might be (selectorText, namespaces)
+        selectorText, namespaces = self._splitNamespacesOff(selectorText)
+        try:
+            # use parent's only if available
+            namespaces = self.parentRule.parentStyleSheet.namespaces
+        except AttributeError:
+            pass
+
+        wellformed = True
+        tokenizer = self._tokenize2(selectorText)
+        newseq = []
+
+        expected = True
+        while True:
+            # find all upto and including next ",", EOF or nothing
+            selectortokens = self._tokensupto2(tokenizer, listseponly=True)
+            if selectortokens:
+                if self._tokenvalue(selectortokens[-1]) == ',':
+                    expected = selectortokens.pop()
+                else:
+                    expected = None
+
+                selector = Selector((selectortokens, namespaces),
+                                    parent=self)
+                if selector.wellformed:
+                    newseq.append(selector)
+                else:
+                    wellformed = False
+                    self._log.error(u'SelectorList: Invalid Selector: %s' %
+                                    self._valuestr(selectortokens))
+            else:
+                break
+
+        # post condition
+        if u',' == expected:
+            wellformed = False
+            self._log.error(u'SelectorList: Cannot end with ",": %r' %
+                            self._valuestr(selectorText))
+        elif expected:
+            wellformed = False
+            self._log.error(u'SelectorList: Unknown Syntax: %r' %
+                            self._valuestr(selectorText))
+        if wellformed:
+            self.seq = newseq
+
+    selectorText = property(_getSelectorText, _setSelectorText,
+                            doc=u"(cssutils) The textual representation of the "
+                                u"selector for a rule set.")
+
+    length = property(lambda self: len(self),
+                      doc=u"The number of :class:`~cssutils.css.Selector` "
+                          u"objects in the list.")
+
+    parentRule = property(lambda self: self._parentRule,
+                          doc=u"(DOM) The CSS rule that contains this "
+                              u"SelectorList or ``None`` if this SelectorList "
+                              u"is not attached to a CSSRule.")
+
+    wellformed = property(lambda self: bool(len(self.seq)))
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssrulelist.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssrulelist.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssrulelist.py	(revision 1126)
@@ -0,0 +1,53 @@
+"""CSSRuleList implements DOM Level 2 CSS CSSRuleList.
+Partly also http://dev.w3.org/csswg/cssom/#the-cssrulelist."""
+__all__ = ['CSSRuleList']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+class CSSRuleList(list):
+    """The CSSRuleList object represents an (ordered) list of statements.
+
+    The items in the CSSRuleList are accessible via an integral index,
+    starting from 0.
+
+    Subclasses a standard Python list so theoretically all standard list
+    methods are available. Setting methods like ``__init__``, ``append``,
+    ``extend`` or ``__setslice__`` are added later on instances of this
+    class if so desired.
+    E.g. CSSStyleSheet adds ``append`` which is not available in a simple
+    instance of this class! 
+    """
+    def __init__(self, *ignored):
+        "Nothing is set as this must also be defined later."
+        pass
+    
+    def __notimplemented(self, *ignored):
+        "Implemented in class using a CSSRuleList only."
+        raise NotImplementedError(
+            'Must be implemented by class using an instance of this class.')
+    
+    append = extend = __setitem__ = __setslice__ = __notimplemented
+    
+    def item(self, index):
+        """(DOM) Retrieve a CSS rule by ordinal `index`. The order in this
+        collection represents the order of the rules in the CSS style
+        sheet. If index is greater than or equal to the number of rules in
+        the list, this returns None.
+
+        Returns CSSRule, the style rule at the index position in the
+        CSSRuleList, or None if that is not a valid index.
+        """
+        try:
+            return self[index]
+        except IndexError:
+            return None
+
+    length = property(lambda self: len(self),
+                      doc=u"(DOM) The number of CSSRules in the list.")
+
+    def rulesOfType(self, type):
+        """Yield the rules which have the given `type` only, one of the 
+        constants defined in :class:`cssutils.css.CSSRule`."""
+        for r in self:
+            if r.type == type:
+                yield r 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csspagerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csspagerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/csspagerule.py	(revision 1126)
@@ -0,0 +1,436 @@
+"""CSSPageRule implements DOM Level 2 CSS CSSPageRule."""
+__all__ = ['CSSPageRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from itertools import chain
+from cssstyledeclaration import CSSStyleDeclaration
+from marginrule import MarginRule
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSPageRule(cssrule.CSSRuleRules):
+    """
+    The CSSPageRule interface represents a @page rule within a CSS style
+    sheet. The @page rule is used to specify the dimensions, orientation,
+    margins, etc. of a page box for paged media.
+
+    Format::
+
+        page :
+               PAGE_SYM S* IDENT? pseudo_page? S* 
+               '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S*
+               ;
+        
+        pseudo_page :
+               ':' [ "left" | "right" | "first" ]
+               ;
+        
+        margin :
+               margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*
+               ;
+        
+        margin_sym :
+               TOPLEFTCORNER_SYM | 
+               TOPLEFT_SYM | 
+               TOPCENTER_SYM | 
+               TOPRIGHT_SYM | 
+               TOPRIGHTCORNER_SYM |
+               BOTTOMLEFTCORNER_SYM | 
+               BOTTOMLEFT_SYM | 
+               BOTTOMCENTER_SYM | 
+               BOTTOMRIGHT_SYM |
+               BOTTOMRIGHTCORNER_SYM |
+               LEFTTOP_SYM |
+               LEFTMIDDLE_SYM |
+               LEFTBOTTOM_SYM |
+               RIGHTTOP_SYM |
+               RIGHTMIDDLE_SYM |
+               RIGHTBOTTOM_SYM 
+               ;
+          
+    `cssRules` contains a list of `MarginRule` objects.
+    """
+    def __init__(self, selectorText=None, style=None, parentRule=None, 
+                 parentStyleSheet=None, readonly=False):
+        """
+        If readonly allows setting of properties in constructor only.
+
+        :param selectorText:
+            type string
+        :param style:
+            CSSStyleDeclaration for this CSSStyleRule
+        """
+        super(CSSPageRule, self).__init__(parentRule=parentRule, 
+                                          parentStyleSheet=parentStyleSheet)
+        self._atkeyword = u'@page'
+        self._specificity = (0, 0, 0)
+        
+        tempseq = self._tempSeq()
+
+        if selectorText:
+            self.selectorText = selectorText
+            tempseq.append(self.selectorText, 'selectorText')
+        else:
+            self._selectorText = self._tempSeq()
+        
+        if style:
+            self.style = style
+        else:
+            self.style = CSSStyleDeclaration()
+
+        tempseq.append(self.style, 'style')
+
+        self._setSeq(tempseq)        
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(selectorText=%r, style=%r)" % (
+                self.__class__.__name__, 
+                self.selectorText, 
+                self.style.cssText)
+
+    def __str__(self):
+        return (u"<cssutils.css.%s object selectorText=%r specificity=%r "+
+               u"style=%r cssRules=%r at 0x%x>") % (
+                self.__class__.__name__,
+                self.selectorText, 
+                self.specificity,
+                self.style.cssText,
+                len(self.cssRules),
+                id(self))
+
+    def __contains__(self, margin):
+        """Check if margin is set in the rule."""
+        return margin in self.keys()
+    
+    def keys(self):
+        "Return list of all set margins (MarginRule)."
+        return list(r.margin for r in self.cssRules)
+    
+    def __getitem__(self, margin):
+        """Retrieve the style (of MarginRule) 
+        for `margin` (which must be normalized).
+        """
+        for r in self.cssRules:
+            if r.margin == margin:
+                return r.style
+    
+    def __setitem__(self, margin, style):
+        """Set the style (of MarginRule) 
+        for `margin` (which must be normalized).
+        """
+        for i, r in enumerate(self.cssRules):
+            if r.margin == margin:
+                r.style = style
+                return i
+        else:
+            return self.add(MarginRule(margin, style))
+
+    def __delitem__(self, margin):
+        """Delete the style (the MarginRule) 
+        for `margin` (which must be normalized).
+        """
+        for r in self.cssRules:
+            if r.margin == margin:
+                self.deleteRule(r)
+
+    def __parseSelectorText(self, selectorText):
+        """
+        Parse `selectorText` which may also be a list of tokens
+        and returns (selectorText, seq).
+
+        see _setSelectorText for details
+        """
+        # for closures: must be a mutable
+        new = {'wellformed': True, 'last-S': False,
+               'name': 0, 'first': 0, 'lr': 0}
+        specificity = (0, 0, 0)
+
+        def _char(expected, seq, token, tokenizer=None):
+            # pseudo_page, :left, :right or :first
+            val = self._tokenvalue(token)
+            if not new['last-S'] and expected in ['page', ': or EOF']\
+               and u':' == val:
+                try:
+                    identtoken = tokenizer.next()
+                except StopIteration:
+                    self._log.error(
+                        u'CSSPageRule selectorText: No IDENT found.', token)
+                else:
+                    ival, ityp = self._tokenvalue(identtoken),\
+                                 self._type(identtoken)
+                    if self._prods.IDENT != ityp:
+                        self._log.error(u'CSSPageRule selectorText: Expected '
+                                        u'IDENT but found: %r' % ival, token)
+                    else:                        
+                        if not ival in (u'first', u'left', u'right'):
+                            self._log.warn(u'CSSPageRule: Unknown @page '
+                                           u'selector: %r' 
+                                           % (u':'+ival,), neverraise=True)
+                        if ival == u'first':
+                            new['first'] = 1
+                        else:
+                            new['lr'] = 1
+                        seq.append(val + ival, 'pseudo')
+                        return 'EOF'
+                return expected
+            else:
+                new['wellformed'] = False
+                self._log.error(u'CSSPageRule selectorText: Unexpected CHAR: %r'
+                                % val, token)
+                return expected
+
+        def S(expected, seq, token, tokenizer=None):
+            "Does not raise if EOF is found."
+            if expected == ': or EOF':
+                # pseudo must directly follow IDENT if given
+                new['last-S'] = True
+            return expected
+
+        def IDENT(expected, seq, token, tokenizer=None):
+            ""
+            val = self._tokenvalue(token)
+            if 'page' == expected:
+                if self._normalize(val) == u'auto':
+                    self._log.error(u'CSSPageRule selectorText: Invalid pagename.',
+                                    token)
+                else:
+                    new['name'] = 1
+                    seq.append(val, 'IDENT')
+                    
+                return ': or EOF'
+            else:
+                new['wellformed'] = False
+                self._log.error(u'CSSPageRule selectorText: Unexpected IDENT: '
+                                u'%r' % val, token)
+                return expected
+
+        def COMMENT(expected, seq, token, tokenizer=None):
+            "Does not raise if EOF is found."
+            seq.append(cssutils.css.CSSComment([token]), 'COMMENT')
+            return expected 
+
+        newseq = self._tempSeq()
+        wellformed, expected = self._parse(expected='page',
+            seq=newseq, tokenizer=self._tokenize2(selectorText),
+            productions={'CHAR': _char,
+                         'IDENT': IDENT,
+                         'COMMENT': COMMENT, 
+                         'S': S}, 
+            new=new)
+        wellformed = wellformed and new['wellformed']
+        
+        # post conditions
+        if expected == 'ident':
+            self._log.error(
+                u'CSSPageRule selectorText: No valid selector: %r' %
+                    self._valuestr(selectorText))
+        
+        return wellformed, newseq, (new['name'], new['first'], new['lr'])
+
+
+    def __parseMarginAndStyle(self, tokens):
+        "tokens is a list, no generator (yet)"        
+        g = iter(tokens)
+        styletokens = []
+        
+        # new rules until parse done
+        cssRules = []
+        
+        for token in g:
+            if token[0] == 'ATKEYWORD' and \
+               self._normalize(token[1]) in MarginRule.margins:
+                
+                # MarginRule                   
+                m = MarginRule(parentRule=self,
+                               parentStyleSheet=self.parentStyleSheet)
+                m.cssText = chain([token], g)
+                
+                # merge if margin set more than once
+                for r in cssRules:
+                    if r.margin == m.margin:
+                        for p in m.style:
+                            r.style.setProperty(p, replace=False)
+                        break 
+                else:
+                    cssRules.append(m)
+                    
+                continue
+                            
+            # TODO: Properties?
+            styletokens.append(token)
+
+        return cssRules, styletokens
+        
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSPageRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :exceptions:    
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        super(CSSPageRule, self)._setCssText(cssText)
+        
+        tokenizer = self._tokenize2(cssText)
+        if self._type(self._nexttoken(tokenizer)) != self._prods.PAGE_SYM:
+            self._log.error(u'CSSPageRule: No CSSPageRule found: %s' %
+                            self._valuestr(cssText), 
+                            error=xml.dom.InvalidModificationErr)
+        else:
+            newStyle = CSSStyleDeclaration(parentRule=self)
+            ok = True
+            
+            selectortokens, startbrace = self._tokensupto2(tokenizer, 
+                                                           blockstartonly=True,
+                                                           separateEnd=True)
+            styletokens, braceorEOFtoken = self._tokensupto2(tokenizer, 
+                                                             blockendonly=True,
+                                                             separateEnd=True)
+            nonetoken = self._nexttoken(tokenizer)
+            if self._tokenvalue(startbrace) != u'{':
+                ok = False
+                self._log.error(u'CSSPageRule: No start { of style declaration ' 
+                                u'found: %r' % 
+                                self._valuestr(cssText), startbrace)
+            elif nonetoken:
+                ok = False
+                self._log.error(u'CSSPageRule: Trailing content found.', 
+                                token=nonetoken)
+                
+            selok, newselseq, specificity = self.__parseSelectorText(selectortokens)
+            ok = ok and selok
+
+            val, type_ = self._tokenvalue(braceorEOFtoken),\
+                         self._type(braceorEOFtoken)
+                         
+            if val != u'}' and type_ != 'EOF':
+                ok = False
+                self._log.error(
+                    u'CSSPageRule: No "}" after style declaration found: %r' %
+                    self._valuestr(cssText))
+            else:
+                if 'EOF' == type_:
+                    # add again as style needs it
+                    styletokens.append(braceorEOFtoken)
+                    
+                # filter pagemargin rules out first
+                cssRules, styletokens = self.__parseMarginAndStyle(styletokens)
+                    
+                # SET, may raise:
+                newStyle.cssText = styletokens
+
+            if ok:
+                self._selectorText = newselseq
+                self._specificity = specificity
+                self.style = newStyle 
+                self.cssRules = cssutils.css.CSSRuleList()
+                for r in cssRules:
+                    self.cssRules.append(r)
+                
+    cssText = property(_getCssText, _setCssText,
+        doc=u"(DOM) The parsable textual representation of this rule.")
+
+
+    def _getSelectorText(self):
+        """Wrapper for cssutils Selector object."""
+        return cssutils.ser.do_CSSPageRuleSelector(self._selectorText)
+
+    def _setSelectorText(self, selectorText):
+        """Wrapper for cssutils Selector object.
+
+        :param selectorText: 
+            DOM String, in CSS 2.1 one of
+            
+            - :first
+            - :left
+            - :right
+            - empty
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error
+              and is unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this rule is readonly.
+        """
+        self._checkReadonly()
+
+        # may raise SYNTAX_ERR
+        wellformed, newseq, specificity = self.__parseSelectorText(selectorText)
+        if wellformed:
+            self._selectorText = newseq
+            self._specificity = specificity
+
+    selectorText = property(_getSelectorText, _setSelectorText,
+                            doc=u"(DOM) The parsable textual representation of "
+                                u"the page selector for the rule.")
+
+    def _setStyle(self, style):
+        """
+        :param style:
+            a CSSStyleDeclaration or string
+        """
+        self._checkReadonly()
+        if isinstance(style, basestring):
+            self._style = CSSStyleDeclaration(cssText=style, parentRule=self)
+        else:
+            style._parentRule = self
+            self._style = style
+            
+    style = property(lambda self: self._style, _setStyle,
+                     doc=u"(DOM) The declaration-block of this rule set, "
+                         u"a :class:`~cssutils.css.CSSStyleDeclaration`.")
+
+
+    def insertRule(self, rule, index=None):
+        """Implements base ``insertRule``."""
+        rule, index = self._prepareInsertRule(rule, index)
+
+        if rule is False or rule is True:
+            # done or error
+            return
+
+        # check hierarchy
+        if isinstance(rule, cssutils.css.CSSCharsetRule) or \
+           isinstance(rule, cssutils.css.CSSFontFaceRule) or \
+           isinstance(rule, cssutils.css.CSSImportRule) or \
+           isinstance(rule, cssutils.css.CSSNamespaceRule) or \
+           isinstance(rule, CSSPageRule) or \
+           isinstance(rule, cssutils.css.CSSMediaRule):
+            self._log.error(u'%s: This type of rule is not allowed here: %s' 
+                            % (self.__class__.__name__, rule.cssText),
+                            error=xml.dom.HierarchyRequestErr)
+            return
+
+        return self._finishInsertRule(rule, index)
+
+    specificity = property(lambda self: self._specificity, 
+                           doc=u"""Specificity of this page rule (READONLY). 
+Tuple of (f, g, h) where: 
+
+ - if the page selector has a named page, f=1; else f=0
+ - if the page selector has a ':first' pseudo-class, g=1; else g=0
+ - if the page selector has a ':left' or ':right' pseudo-class, h=1; else h=0
+""")
+
+    type = property(lambda self: self.PAGE_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+    
+    # constant but needed:
+    wellformed = property(lambda self: True)
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstyledeclaration.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstyledeclaration.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssstyledeclaration.py	(revision 1126)
@@ -0,0 +1,697 @@
+"""CSSStyleDeclaration implements DOM Level 2 CSS CSSStyleDeclaration and
+extends CSS2Properties
+
+see
+    http://www.w3.org/TR/1998/REC-CSS2-19980512/syndata.html#parsing-errors
+
+Unknown properties
+------------------
+User agents must ignore a declaration with an unknown property.
+For example, if the style sheet is::
+
+    H1 { color: red; rotation: 70minutes }
+
+the user agent will treat this as if the style sheet had been::
+
+    H1 { color: red }
+
+Cssutils gives a message about any unknown properties but
+keeps any property (if syntactically correct).
+
+Illegal values
+--------------
+User agents must ignore a declaration with an illegal value. For example::
+
+    IMG { float: left }       /* correct CSS2 */
+    IMG { float: left here }  /* "here" is not a value of 'float' */
+    IMG { background: "red" } /* keywords cannot be quoted in CSS2 */
+    IMG { border-width: 3 }   /* a unit must be specified for length values */
+
+A CSS2 parser would honor the first rule and ignore the rest, as if the
+style sheet had been::
+
+    IMG { float: left }
+    IMG { }
+    IMG { }
+    IMG { }
+
+Cssutils again will issue a message (WARNING in this case) about invalid
+CSS2 property values.
+
+TODO:
+    This interface is also used to provide a read-only access to the
+    computed values of an element. See also the ViewCSS interface.
+
+    - return computed values and not literal values
+    - simplify unit pairs/triples/quadruples
+      2px 2px 2px 2px -> 2px for border/padding...
+    - normalize compound properties like:
+      background: no-repeat left url()  #fff
+      -> background: #fff url() no-repeat left
+"""
+__all__ = ['CSSStyleDeclaration', 'Property']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssproperties import CSS2Properties
+from property import Property
+import cssutils
+import xml.dom
+
+class CSSStyleDeclaration(CSS2Properties, cssutils.util.Base2):
+    """The CSSStyleDeclaration class represents a single CSS declaration
+    block. This class may be used to determine the style properties
+    currently set in a block or to set style properties explicitly
+    within the block.
+
+    While an implementation may not recognize all CSS properties within
+    a CSS declaration block, it is expected to provide access to all
+    specified properties in the style sheet through the
+    CSSStyleDeclaration interface.
+    Furthermore, implementations that support a specific level of CSS
+    should correctly handle CSS shorthand properties for that level. For
+    a further discussion of shorthand properties, see the CSS2Properties
+    interface.
+
+    Additionally the CSS2Properties interface is implemented.
+
+    $css2propertyname
+        All properties defined in the CSS2Properties class are available
+        as direct properties of CSSStyleDeclaration with their respective
+        DOM name, so e.g. ``fontStyle`` for property 'font-style'.
+
+        These may be used as::
+
+            >>> style = CSSStyleDeclaration(cssText='color: red')
+            >>> style.color = 'green'
+            >>> print style.color
+            green
+            >>> del style.color
+            >>> print style.color
+            <BLANKLINE>
+
+    Format::
+
+        [Property: Value Priority?;]* [Property: Value Priority?]?
+    """
+    def __init__(self, cssText=u'', parentRule=None, readonly=False,
+                 validating=None):
+        """
+        :param cssText:
+            Shortcut, sets CSSStyleDeclaration.cssText
+        :param parentRule:
+            The CSS rule that contains this declaration block or
+            None if this CSSStyleDeclaration is not attached to a CSSRule.
+        :param readonly:
+            defaults to False
+        :param validating:
+            a flag defining if this sheet should be validated on change.
+            Defaults to None, which means defer to the parent stylesheet.
+        """
+        super(CSSStyleDeclaration, self).__init__()
+        self._parentRule = parentRule
+        self.validating = validating
+        self.cssText = cssText
+        self._readonly = readonly
+
+    def __contains__(self, nameOrProperty):
+        """Check if a property (or a property with given name) is in style.
+
+        :param name:
+            a string or Property, uses normalized name and not literalname
+        """
+        if isinstance(nameOrProperty, Property):
+            name = nameOrProperty.name
+        else:
+            name = self._normalize(nameOrProperty)
+        return name in self.__nnames()
+
+    def __iter__(self):
+        """Iterator of set Property objects with different normalized names."""
+        def properties():
+            for name in self.__nnames():
+                yield self.getProperty(name)
+        return properties()
+
+    def keys(self):
+        """Analoguous to standard dict returns property names which are set in
+        this declaration."""
+        return list(self.__nnames())
+
+    def __getitem__(self, CSSName):
+        """Retrieve the value of property ``CSSName`` from this declaration.
+
+        ``CSSName`` will be always normalized.
+        """
+        return self.getPropertyValue(CSSName)
+
+    def __setitem__(self, CSSName, value):
+        """Set value of property ``CSSName``. ``value`` may also be a tuple of
+        (value, priority), e.g. style['color'] = ('red', 'important')
+
+        ``CSSName`` will be always normalized.
+        """
+        priority = None
+        if isinstance(value, tuple):
+            value, priority = value
+
+        return self.setProperty(CSSName, value, priority)
+
+    def __delitem__(self, CSSName):
+        """Delete property ``CSSName`` from this declaration.
+        If property is not in this declaration return u'' just like
+        removeProperty.
+
+        ``CSSName`` will be always normalized.
+        """
+        return self.removeProperty(CSSName)
+
+    def __setattr__(self, n, v):
+        """Prevent setting of unknown properties on CSSStyleDeclaration
+        which would not work anyway. For these
+        ``CSSStyleDeclaration.setProperty`` MUST be called explicitly!
+
+        TODO:
+            implementation of known is not really nice, any alternative?
+        """
+        known = ['_tokenizer', '_log', '_ttypes',
+                 '_seq', 'seq', 'parentRule', '_parentRule', 'cssText',
+                 'valid', 'wellformed', 'validating',
+                 '_readonly', '_profiles', '_validating']
+        known.extend(CSS2Properties._properties)
+        if n in known:
+            super(CSSStyleDeclaration, self).__setattr__(n, v)
+        else:
+            raise AttributeError(u'Unknown CSS Property, '
+                                 u'``CSSStyleDeclaration.setProperty("%s", '
+                                 u'...)`` MUST be used.' % n)
+
+    def __repr__(self):
+        return u"cssutils.css.%s(cssText=%r)" % (
+                self.__class__.__name__,
+                self.getCssText(separator=u' '))
+
+    def __str__(self):
+        return u"<cssutils.css.%s object length=%r (all: %r) at 0x%x>" % (
+                self.__class__.__name__,
+                self.length,
+                len(self.getProperties(all=True)),
+                id(self))
+
+    def __nnames(self):
+        """Return iterator for all different names in order as set
+        if names are set twice the last one is used (double reverse!)
+        """
+        names = []
+        for item in reversed(self.seq):
+            val = item.value
+            if isinstance(val, Property) and not val.name in names:
+                names.append(val.name)
+        return reversed(names)
+
+    # overwritten accessor functions for CSS2Properties' properties
+    def _getP(self, CSSName):
+        """(DOM CSS2Properties) Overwritten here and effectively the same as
+        ``self.getPropertyValue(CSSname)``.
+
+        Parameter is in CSSname format ('font-style'), see CSS2Properties.
+
+        Example::
+
+            >>> style = CSSStyleDeclaration(cssText='font-style:italic;')
+            >>> print style.fontStyle
+            italic
+        """
+        return self.getPropertyValue(CSSName)
+
+    def _setP(self, CSSName, value):
+        """(DOM CSS2Properties) Overwritten here and effectively the same as
+        ``self.setProperty(CSSname, value)``.
+
+        Only known CSS2Properties may be set this way, otherwise an
+        AttributeError is raised.
+        For these unknown properties ``setPropertyValue(CSSname, value)``
+        has to be called explicitly.
+        Also setting the priority of properties needs to be done with a
+        call like ``setPropertyValue(CSSname, value, priority)``.
+
+        Example::
+
+            >>> style = CSSStyleDeclaration()
+            >>> style.fontStyle = 'italic'
+            >>> # or
+            >>> style.setProperty('font-style', 'italic', '!important')
+
+        """
+        self.setProperty(CSSName, value)
+        # TODO: Shorthand ones
+
+    def _delP(self, CSSName):
+        """(cssutils only) Overwritten here and effectively the same as
+        ``self.removeProperty(CSSname)``.
+
+        Example::
+
+            >>> style = CSSStyleDeclaration(cssText='font-style:italic;')
+            >>> del style.fontStyle
+            >>> print style.fontStyle
+            <BLANKLINE>
+
+        """
+        self.removeProperty(CSSName)
+
+    def children(self):
+        """Generator yielding any known child in this declaration including
+         *all* properties, comments or CSSUnknownrules.
+        """
+        for item in self._seq:
+            yield item.value
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_css_CSSStyleDeclaration(self)
+
+    def _setCssText(self, cssText):
+        """Setting this attribute will result in the parsing of the new value
+        and resetting of all the properties in the declaration block
+        including the removal or addition of properties.
+
+        :exceptions:
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this declaration is readonly or a property is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+        """
+        self._checkReadonly()
+        tokenizer = self._tokenize2(cssText)
+
+        # for closures: must be a mutable
+        new = {'wellformed': True}
+        def ident(expected, seq, token, tokenizer=None):
+            # a property
+
+            tokens = self._tokensupto2(tokenizer, starttoken=token,
+                                       semicolon=True)
+            if self._tokenvalue(tokens[-1]) == u';':
+                tokens.pop()
+            property = Property(parent=self)
+            property.cssText = tokens
+            if property.wellformed:
+                seq.append(property, 'Property')
+            else:
+                self._log.error(u'CSSStyleDeclaration: Syntax Error in '
+                                u'Property: %s' % self._valuestr(tokens))
+            # does not matter in this case
+            return expected
+
+        def unexpected(expected, seq, token, tokenizer=None):
+            # error, find next ; or } to omit upto next property
+            ignored = self._tokenvalue(token) + self._valuestr(
+                                self._tokensupto2(tokenizer,
+                                                  propertyvalueendonly=True))
+            self._log.error(u'CSSStyleDeclaration: Unexpected token, ignoring '
+                            'upto %r.' % ignored,token)
+            # does not matter in this case
+            return expected
+
+        def char(expected, seq, token, tokenizer=None):
+            # a standalone ; or error...
+            if self._tokenvalue(token) == u';':
+                self._log.info(u'CSSStyleDeclaration: Stripped standalone semicolon'
+                                u': %s' % self._valuestr([token]), neverraise=True)
+                return expected
+            else:
+                return unexpected(expected, seq, token, tokenizer)
+
+        # [Property: Value;]* Property: Value?
+        newseq = self._tempSeq()
+        wellformed, expected = self._parse(expected=None,
+            seq=newseq, tokenizer=tokenizer,
+            productions={'IDENT': ident, 'CHAR': char},
+            default=unexpected)
+        # wellformed set by parse
+
+        for item in newseq:
+            item.value._parent = self
+
+        # do not check wellformed as invalid things are removed anyway
+        self._setSeq(newseq)
+
+    cssText = property(_getCssText, _setCssText,
+                       doc=u"(DOM) A parsable textual representation of the "
+                           u"declaration block excluding the surrounding curly "
+                           u"braces.")
+
+    def getCssText(self, separator=None):
+        """
+        :returns:
+            serialized property cssText, each property separated by
+            given `separator` which may e.g. be ``u''`` to be able to use
+            cssText directly in an HTML style attribute. ``;`` is part of
+            each property (except the last one) and **cannot** be set with
+            separator!
+        """
+        return cssutils.ser.do_css_CSSStyleDeclaration(self, separator)
+
+    def _setParentRule(self, parentRule):
+        self._parentRule = parentRule
+#        for x in self.children():
+#            x.parent = self
+
+    parentRule = property(lambda self: self._parentRule, _setParentRule,
+        doc="(DOM) The CSS rule that contains this declaration block or "
+            "None if this CSSStyleDeclaration is not attached to a CSSRule.")
+
+    def getProperties(self, name=None, all=False):
+        """
+        :param name:
+            optional `name` of properties which are requested.
+            Only properties with this **always normalized** `name` are returned.
+            If `name` is ``None`` all properties are returned (at least one for
+            each set name depending on parameter `all`).
+        :param all:
+            if ``False`` (DEFAULT) only the effective properties are returned.
+            If name is given a list with only one property is returned.
+
+            if ``True`` all properties including properties set multiple times
+            with different values or priorities for different UAs are returned.
+            The order of the properties is fully kept as in the original
+            stylesheet.
+        :returns:
+            a list of :class:`~cssutils.css.Property` objects set in
+            this declaration.
+        """
+        if name and not all:
+            # single prop but list
+            p = self.getProperty(name)
+            if p:
+                return [p]
+            else:
+                return []
+        elif not all:
+            # effective Properties in name order
+            return [self.getProperty(name) for name in self.__nnames()]
+        else:
+            # all properties or all with this name
+            nname = self._normalize(name)
+            properties = []
+            for item in self.seq:
+                val = item.value
+                if isinstance(val, Property) and (
+                   (bool(nname) == False) or (val.name == nname)):
+                    properties.append(val)
+            return properties
+
+    def getProperty(self, name, normalize=True):
+        """
+        :param name:
+            of the CSS property, always lowercase (even if not normalized)
+        :param normalize:
+            if ``True`` (DEFAULT) name will be normalized (lowercase, no simple
+            escapes) so "color", "COLOR" or "C\olor" will all be equivalent
+
+            If ``False`` may return **NOT** the effective value but the
+            effective for the unnormalized name.
+        :returns:
+            the effective :class:`~cssutils.css.Property` object.
+        """
+        nname = self._normalize(name)
+        found = None
+        for item in reversed(self.seq):
+            val = item.value
+            if isinstance(val, Property):
+                if (normalize and nname == val.name) or name == val.literalname:
+                    if val.priority:
+                        return val
+                    elif not found:
+                        found = val
+        return found
+
+    def getPropertyCSSValue(self, name, normalize=True):
+        """
+        :param name:
+            of the CSS property, always lowercase (even if not normalized)
+        :param normalize:
+            if ``True`` (DEFAULT) name will be normalized (lowercase, no simple
+            escapes) so "color", "COLOR" or "C\olor" will all be equivalent
+
+            If ``False`` may return **NOT** the effective value but the
+            effective for the unnormalized name.
+        :returns:
+            :class:`~cssutils.css.CSSValue`, the value of the effective
+            property if it has been explicitly set for this declaration block.
+
+        (DOM)
+        Used to retrieve the object representation of the value of a CSS
+        property if it has been explicitly set within this declaration
+        block. Returns None if the property has not been set.
+
+        (This method returns None if the property is a shorthand
+        property. Shorthand property values can only be accessed and
+        modified as strings, using the getPropertyValue and setProperty
+        methods.)
+
+        **cssutils currently always returns a CSSValue if the property is
+        set.**
+
+        for more on shorthand properties see
+            http://www.dustindiaz.com/css-shorthand/
+        """
+        nname = self._normalize(name)
+        if nname in self._SHORTHANDPROPERTIES:
+            self._log.info(u'CSSValue for shorthand property "%s" should be '
+                           u'None, this may be implemented later.' %
+                           nname, neverraise=True)
+
+        p = self.getProperty(name, normalize)
+        if p:
+            return p.propertyValue
+        else:
+            return None
+
+    def getPropertyValue(self, name, normalize=True):
+        """
+        :param name:
+            of the CSS property, always lowercase (even if not normalized)
+        :param normalize:
+            if ``True`` (DEFAULT) name will be normalized (lowercase, no simple
+            escapes) so "color", "COLOR" or "C\olor" will all be equivalent
+
+            If ``False`` may return **NOT** the effective value but the
+            effective for the unnormalized name.
+        :returns:
+            the value of the effective property if it has been explicitly set
+            for this declaration block. Returns the empty string if the
+            property has not been set.
+        """
+        p = self.getProperty(name, normalize)
+        if p:
+            return p.value
+        else:
+            return u''
+
+    def getPropertyPriority(self, name, normalize=True):
+        """
+        :param name:
+            of the CSS property, always lowercase (even if not normalized)
+        :param normalize:
+            if ``True`` (DEFAULT) name will be normalized (lowercase, no simple
+            escapes) so "color", "COLOR" or "C\olor" will all be equivalent
+
+            If ``False`` may return **NOT** the effective value but the
+            effective for the unnormalized name.
+        :returns:
+            the priority of the effective CSS property (e.g. the
+            "important" qualifier) if the property has been explicitly set in
+            this declaration block. The empty string if none exists.
+        """
+        p = self.getProperty(name, normalize)
+        if p:
+            return p.priority
+        else:
+            return u''
+
+    def removeProperty(self, name, normalize=True):
+        """
+        (DOM)
+        Used to remove a CSS property if it has been explicitly set within
+        this declaration block.
+
+        :param name:
+            of the CSS property
+        :param normalize:
+            if ``True`` (DEFAULT) name will be normalized (lowercase, no simple
+            escapes) so "color", "COLOR" or "C\olor" will all be equivalent.
+            The effective Property value is returned and *all* Properties
+            with ``Property.name == name`` are removed.
+
+            If ``False`` may return **NOT** the effective value but the
+            effective for the unnormalized `name` only. Also only the
+            Properties with the literal name `name` are removed.
+        :returns:
+            the value of the property if it has been explicitly set for
+            this declaration block. Returns the empty string if the property
+            has not been set or the property name does not correspond to a
+            known CSS property
+
+
+        :exceptions:
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this declaration is readonly or the property is
+              readonly.
+        """
+        self._checkReadonly()
+        r = self.getPropertyValue(name, normalize=normalize)
+        newseq = self._tempSeq()
+        if normalize:
+            # remove all properties with name == nname
+            nname = self._normalize(name)
+            for item in self.seq:
+                if not (isinstance(item.value, Property)
+                        and item.value.name == nname):
+                    newseq.appendItem(item)
+        else:
+            # remove all properties with literalname == name
+            for item in self.seq:
+                if not (isinstance(item.value, Property)
+                        and item.value.literalname == name):
+                    newseq.appendItem(item)
+        self._setSeq(newseq)
+        return r
+
+    def setProperty(self, name, value=None, priority=u'',
+                    normalize=True, replace=True):
+        """(DOM) Set a property value and priority within this declaration
+        block.
+
+        :param name:
+            of the CSS property to set (in W3C DOM the parameter is called
+            "propertyName"), always lowercase (even if not normalized)
+
+            If a property with this `name` is present it will be reset.
+
+            cssutils also allowed `name` to be a
+            :class:`~cssutils.css.Property` object, all other
+            parameter are ignored in this case
+
+        :param value:
+            the new value of the property, ignored if `name` is a Property.
+        :param priority:
+            the optional priority of the property (e.g. "important"),
+            ignored if `name` is a Property.
+        :param normalize:
+            if True (DEFAULT) `name` will be normalized (lowercase, no simple
+            escapes) so "color", "COLOR" or "C\olor" will all be equivalent
+        :param replace:
+            if True (DEFAULT) the given property will replace a present
+            property. If False a new property will be added always.
+            The difference to `normalize` is that two or more properties with
+            the same name may be set, useful for e.g. stuff like::
+
+                background: red;
+                background: rgba(255, 0, 0, 0.5);
+
+            which defines the same property but only capable UAs use the last
+            property value, older ones use the first value.
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified value has a syntax error and is
+              unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this declaration is readonly or the property is
+              readonly.
+        """
+        self._checkReadonly()
+
+        if isinstance(name, Property):
+            newp = name
+            name = newp.literalname
+        elif not value:
+            # empty string or None effectively removed property
+            return self.removeProperty(name)
+        else:
+            newp = Property(name, value, priority)
+
+        if newp.wellformed:
+            if replace:
+                # check if update
+                nname = self._normalize(name)
+                properties = self.getProperties(name, all=(not normalize))
+                for property in reversed(properties):
+                    if normalize and property.name == nname:
+                        property.propertyValue = newp.propertyValue.cssText
+                        property.priority = newp.priority
+                        return
+                    elif property.literalname == name:
+                        property.propertyValue = newp.propertyValue.cssText
+                        property.priority = newp.priority
+                        return
+
+            # not yet set or forced omit replace
+            newp.parent = self
+            self.seq._readonly = False
+            self.seq.append(newp, 'Property')
+            self.seq._readonly = True
+
+        else:
+            self._log.warn(u'Invalid Property: %s: %s %s'
+                           % (name, value, priority))
+
+    def item(self, index):
+        """(DOM) Retrieve the properties that have been explicitly set in
+        this declaration block. The order of the properties retrieved using
+        this method does not have to be the order in which they were set.
+        This method can be used to iterate over all properties in this
+        declaration block.
+
+        :param index:
+            of the property to retrieve, negative values behave like
+            negative indexes on Python lists, so -1 is the last element
+
+        :returns:
+            the name of the property at this ordinal position. The
+            empty string if no property exists at this position.
+
+        **ATTENTION:**
+        Only properties with different names are counted. If two
+        properties with the same name are present in this declaration
+        only the effective one is included.
+
+        :meth:`item` and :attr:`length` work on the same set here.
+        """
+        names = list(self.__nnames())
+        try:
+            return names[index]
+        except IndexError:
+            return u''
+
+    length = property(lambda self: len(list(self.__nnames())),
+                      doc=u"(DOM) The number of distinct properties that have "
+                          u"been explicitly in this declaration block. The "
+                          u"range of valid indices is 0 to length-1 inclusive. "
+                          u"These are properties with a different ``name`` "
+                          u"only. :meth:`item` and :attr:`length` work on the "
+                          u"same set here.")
+
+    def _getValidating(self):
+        try:
+            # CSSParser.parseX() sets validating of stylesheet
+            return self.parentRule.parentStyleSheet.validating
+        except AttributeError:
+            # CSSParser.parseStyle() sets validating of declaration
+            if self._validating is not None:
+                return self._validating
+        # default
+        return True
+
+    def _setValidating(self, validating):
+        self._validating = validating
+
+    validating = property(_getValidating, _setValidating,
+                          doc=u"If ``True`` this declaration validates "
+                          u"contained properties. The parent StyleSheet "
+                          u"validation setting does *always* win though so "
+                          u"even if validating is True it may not validate "
+                          u"if the StyleSheet defines else!")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/selector.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/selector.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/selector.py	(revision 1126)
@@ -0,0 +1,813 @@
+"""Selector is a single Selector of a CSSStyleRule SelectorList.
+Partly implements http://www.w3.org/TR/css3-selectors/.
+
+TODO
+    - .contains(selector)
+    - .isSubselector(selector)
+"""
+__all__ = ['Selector']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.helper import Deprecated
+from cssutils.util import _SimpleNamespaces
+import cssutils
+import xml.dom
+
+class Selector(cssutils.util.Base2):
+    """
+    (cssutils) a single selector in a :class:`~cssutils.css.SelectorList` 
+    of a :class:`~cssutils.css.CSSStyleRule`.
+
+    Format::
+
+        # implemented in SelectorList
+        selectors_group
+          : selector [ COMMA S* selector ]*
+          ;
+
+        selector
+          : simple_selector_sequence [ combinator simple_selector_sequence ]*
+          ;
+
+        combinator
+          /* combinators can be surrounded by white space */
+          : PLUS S* | GREATER S* | TILDE S* | S+
+          ;
+
+        simple_selector_sequence
+          : [ type_selector | universal ]
+            [ HASH | class | attrib | pseudo | negation ]*
+          | [ HASH | class | attrib | pseudo | negation ]+
+          ;
+
+        type_selector
+          : [ namespace_prefix ]? element_name
+          ;
+
+        namespace_prefix
+          : [ IDENT | '*' ]? '|'
+          ;
+
+        element_name
+          : IDENT
+          ;
+
+        universal
+          : [ namespace_prefix ]? '*'
+          ;
+
+        class
+          : '.' IDENT
+          ;
+
+        attrib
+          : '[' S* [ namespace_prefix ]? IDENT S*
+                [ [ PREFIXMATCH |
+                    SUFFIXMATCH |
+                    SUBSTRINGMATCH |
+                    '=' |
+                    INCLUDES |
+                    DASHMATCH ] S* [ IDENT | STRING ] S*
+                ]? ']'
+          ;
+
+        pseudo
+          /* '::' starts a pseudo-element, ':' a pseudo-class */
+          /* Exceptions: :first-line, :first-letter, :before and :after. */
+          /* Note that pseudo-elements are restricted to one per selector and */
+          /* occur only in the last simple_selector_sequence. */
+          : ':' ':'? [ IDENT | functional_pseudo ]
+          ;
+
+        functional_pseudo
+          : FUNCTION S* expression ')'
+          ;
+
+        expression
+          /* In CSS3, the expressions are identifiers, strings, */
+          /* or of the form "an+b" */
+          : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+
+          ;
+
+        negation
+          : NOT S* negation_arg S* ')'
+          ;
+
+        negation_arg
+          : type_selector | universal | HASH | class | attrib | pseudo
+          ;
+
+    """
+    def __init__(self, selectorText=None, parent=None,
+                 readonly=False):
+        """
+        :Parameters:
+            selectorText
+                initial value of this selector
+            parent
+                a SelectorList
+            readonly
+                default to False
+        """
+        super(Selector, self).__init__()
+
+        self.__namespaces = _SimpleNamespaces(log=self._log)
+        self._element = None
+        self._parent = parent
+        self._specificity = (0, 0, 0, 0)
+        
+        if selectorText:
+            self.selectorText = selectorText
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        if self.__getNamespaces():
+            st = (self.selectorText, self._getUsedNamespaces())
+        else:
+            st = self.selectorText
+        return u"cssutils.css.%s(selectorText=%r)" % (self.__class__.__name__, 
+                                                      st)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object selectorText=%r specificity=%r" \
+               u" _namespaces=%r at 0x%x>" % (self.__class__.__name__,
+                                              self.selectorText,
+                                              self.specificity,
+                                              self._getUsedNamespaces(),
+                                              id(self))
+
+    def _getUsedUris(self):
+        "Return list of actually used URIs in this Selector."
+        uris = set()
+        for item in self.seq:
+            type_, val = item.type, item.value
+            if type_.endswith(u'-selector') or type_ == u'universal' and \
+               isinstance(val, tuple) and val[0] not in (None, u'*'):
+                uris.add(val[0])
+        return uris
+
+    def _getUsedNamespaces(self):
+        "Return actually used namespaces only."
+        useduris = self._getUsedUris()
+        namespaces = _SimpleNamespaces(log=self._log)
+        for p, uri in self._namespaces.items():
+            if uri in useduris:
+                namespaces[p] = uri
+        return namespaces
+
+    def __getNamespaces(self):
+        "Use own namespaces if not attached to a sheet, else the sheet's ones."
+        try:
+            return self._parent.parentRule.parentStyleSheet.namespaces
+        except AttributeError:
+            return self.__namespaces
+
+    _namespaces = property(__getNamespaces, 
+                           doc=u"If this Selector is attached to a "
+                               u"CSSStyleSheet the namespaces of that sheet "
+                               u"are mirrored here. While the Selector (or "
+                               u"parent SelectorList or parentRule(s) of that "
+                               u"are not attached a own dict of {prefix: "
+                               u"namespaceURI} is used.")
+
+    
+    element = property(lambda self: self._element, 
+                       doc=u"Effective element target of this selector.")
+
+    parent = property(lambda self: self._parent,
+                      doc=u"(DOM) The SelectorList that contains this Selector "
+                          u"or None if this Selector is not attached to a "
+                          u"SelectorList.")
+                
+    def _getSelectorText(self):
+        """Return serialized format."""
+        return cssutils.ser.do_css_Selector(self)
+
+    def _setSelectorText(self, selectorText):
+        """
+        :param selectorText:
+            parsable string or a tuple of (selectorText, dict-of-namespaces).
+            Given namespaces are ignored if this object is attached to a 
+            CSSStyleSheet!
+        
+        :exceptions:
+            - :exc:`~xml.dom.NamespaceErr`:
+              Raised if the specified selector uses an unknown namespace
+              prefix.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error
+              and is unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this rule is readonly.
+        """
+        self._checkReadonly()
+        
+        # might be (selectorText, namespaces)
+        selectorText, namespaces = self._splitNamespacesOff(selectorText)
+
+        try:
+            # uses parent stylesheets namespaces if available, 
+            # otherwise given ones
+            namespaces = self.parent.parentRule.parentStyleSheet.namespaces
+        except AttributeError:
+            pass
+        tokenizer = self._tokenize2(selectorText)
+        if not tokenizer:
+            self._log.error(u'Selector: No selectorText given.')
+        else:
+            # prepare tokenlist:
+            #     "*" -> type "universal"
+            #     "*"|IDENT + "|" -> combined to "namespace_prefix"
+            #     "|" -> type "namespace_prefix"
+            #     "." + IDENT -> combined to "class"
+            #     ":" + IDENT, ":" + FUNCTION -> pseudo-class
+            #     FUNCTION "not(" -> negation
+            #     "::" + IDENT, "::" + FUNCTION -> pseudo-element
+            tokens = []
+            for t in tokenizer:
+                typ, val, lin, col = t
+                if val == u':' and tokens and\
+                   self._tokenvalue(tokens[-1]) == ':':
+                    # combine ":" and ":"
+                    tokens[-1] = (typ, u'::', lin, col)
+
+                elif typ == 'IDENT' and tokens\
+                     and self._tokenvalue(tokens[-1]) == u'.':
+                    # class: combine to .IDENT
+                    tokens[-1] = ('class', u'.'+val, lin, col)
+                elif typ == 'IDENT' and tokens and \
+                     self._tokenvalue(tokens[-1]).startswith(u':') and\
+                     not self._tokenvalue(tokens[-1]).endswith(u'('):
+                    # pseudo-X: combine to :IDENT or ::IDENT but not ":a(" + "b"
+                    if self._tokenvalue(tokens[-1]).startswith(u'::'): 
+                        t = 'pseudo-element'
+                    else: 
+                        t = 'pseudo-class'
+                    tokens[-1] = (t, self._tokenvalue(tokens[-1])+val, lin, col)
+
+                elif typ == 'FUNCTION' and val == u'not(' and tokens and \
+                     u':' == self._tokenvalue(tokens[-1]):
+                    tokens[-1] = ('negation', u':' + val, lin, tokens[-1][3])
+                elif typ == 'FUNCTION' and tokens\
+                     and self._tokenvalue(tokens[-1]).startswith(u':'):
+                    # pseudo-X: combine to :FUNCTION( or ::FUNCTION(
+                    if self._tokenvalue(tokens[-1]).startswith(u'::'): 
+                        t = 'pseudo-element'
+                    else: 
+                        t = 'pseudo-class'
+                    tokens[-1] = (t, self._tokenvalue(tokens[-1])+val, lin, col)
+
+                elif val == u'*' and tokens and\
+                     self._type(tokens[-1]) == 'namespace_prefix' and\
+                     self._tokenvalue(tokens[-1]).endswith(u'|'):
+                    # combine prefix|*
+                    tokens[-1] = ('universal', self._tokenvalue(tokens[-1])+val, 
+                                  lin, col)
+                elif val == u'*':
+                    # universal: "*"
+                    tokens.append(('universal', val, lin, col))
+
+                elif val == u'|' and tokens and\
+                     self._type(tokens[-1]) in (self._prods.IDENT, 'universal')\
+                     and self._tokenvalue(tokens[-1]).find(u'|') == -1:
+                    # namespace_prefix: "IDENT|" or "*|"
+                    tokens[-1] = ('namespace_prefix', 
+                                  self._tokenvalue(tokens[-1])+u'|', lin, col)
+                elif val == u'|':
+                    # namespace_prefix: "|"
+                    tokens.append(('namespace_prefix', val, lin, col))
+
+                else:
+                    tokens.append(t)
+
+            tokenizer = iter(tokens)
+
+            # for closures: must be a mutable
+            new = {'context': [''], # stack of: 'attrib', 'negation', 'pseudo'
+                   'element': None,
+                   '_PREFIX': None,
+                   'specificity': [0, 0, 0, 0], # mutable, finally a tuple!
+                   'wellformed': True
+                   }
+            # used for equality checks and setting of a space combinator
+            S = u' '
+
+            def append(seq, val, typ=None, token=None):
+                """
+                appends to seq
+                
+                namespace_prefix, IDENT will be combined to a tuple 
+                (prefix, name) where prefix might be None, the empty string
+                or a prefix. 
+
+                Saved are also:
+                    - specificity definition: style, id, class/att, type
+                    - element: the element this Selector is for
+                """
+                context = new['context'][-1]
+                if token:
+                    line, col = token[2], token[3]
+                else:
+                    line, col = None, None
+                    
+                if typ == '_PREFIX':
+                    # SPECIAL TYPE: save prefix for combination with next
+                    new['_PREFIX'] = val[:-1]
+                    # handle next time
+                    return 
+                
+                if new['_PREFIX'] is not None:
+                    # as saved from before and reset to None
+                    prefix, new['_PREFIX'] = new['_PREFIX'], None 
+                elif typ == 'universal' and '|' in val:
+                    # val == *|* or prefix|*
+                    prefix, val = val.split('|')
+                else:
+                    prefix = None
+                
+                # namespace
+                if (typ.endswith('-selector') or typ == 'universal') and not (
+                    'attribute-selector' == typ and not prefix):
+                    # att **IS NOT** in default ns
+                    if prefix == u'*':
+                        # *|name: in ANY_NS
+                        namespaceURI = cssutils._ANYNS
+                    elif prefix is None:
+                        # e or *: default namespace with prefix u'' 
+                        # or local-name()
+                        namespaceURI = namespaces.get(u'', None)
+                    elif prefix == u'':
+                        # |name or |*: in no (or the empty) namespace
+                        namespaceURI = u''
+                    else:
+                        # explicit namespace prefix
+                        # does not raise KeyError, see _SimpleNamespaces
+                        namespaceURI = namespaces[prefix]
+
+                        if namespaceURI is None:
+                            new['wellformed'] = False
+                            self._log.error(u'Selector: No namespaceURI found '
+                                            u'for prefix %r' % prefix, 
+                                            token=token, 
+                                            error=xml.dom.NamespaceErr)
+                            return
+                            
+                    # val is now (namespaceprefix, name) tuple
+                    val = (namespaceURI, val)
+
+                # specificity
+                if not context or context == 'negation':   
+                    if 'id' == typ:
+                        new['specificity'][1] += 1
+                    elif 'class' == typ or '[' == val:
+                        new['specificity'][2] += 1
+                    elif typ in ('type-selector', 'negation-type-selector',
+                                  'pseudo-element'):
+                        new['specificity'][3] += 1
+                if not context and typ in ('type-selector', 'universal'):
+                    # define element
+                    new['element'] = val
+
+                seq.append(val, typ, line=line, col=col)
+
+            # expected constants
+            simple_selector_sequence = 'type_selector universal HASH class ' \
+                                       'attrib pseudo negation '
+            simple_selector_sequence2 = 'HASH class attrib pseudo negation '
+
+            element_name = 'element_name'
+
+            negation_arg = 'type_selector universal HASH class attrib pseudo'
+            negationend = ')'
+            
+            attname = 'prefix attribute'
+            attname2 = 'attribute'
+            attcombinator = 'combinator ]' # optional
+            attvalue = 'value'       # optional
+            attend = ']'
+            
+            expressionstart = 'PLUS - DIMENSION NUMBER STRING IDENT'
+            expression = expressionstart + ' )' 
+            
+            combinator = ' combinator'
+
+            def _COMMENT(expected, seq, token, tokenizer=None):
+                "special implementation for comment token"
+                append(seq, cssutils.css.CSSComment([token]), 'COMMENT', 
+                       token=token)
+                return expected
+
+            def _S(expected, seq, token, tokenizer=None):
+                # S
+                context = new['context'][-1]
+                if context.startswith('pseudo-'):
+                    if seq and seq[-1].value not in u'+-':
+                        # e.g. x:func(a + b)
+                        append(seq, S, 'S', token=token)
+                    return expected
+                
+                elif context != 'attrib' and 'combinator' in expected:
+                    append(seq, S, 'descendant', token=token)
+                    return simple_selector_sequence + combinator
+                
+                else:
+                    return expected
+            
+            def _universal(expected, seq, token, tokenizer=None):
+                # *|* or prefix|*
+                context = new['context'][-1]
+                val = self._tokenvalue(token)
+                if 'universal' in expected:
+                    append(seq, val, 'universal', token=token)
+
+                    if 'negation' == context:
+                        return negationend
+                    else:
+                        return simple_selector_sequence2 + combinator
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected universal.', token=token)
+                    return expected
+
+            def _namespace_prefix(expected, seq, token, tokenizer=None):
+                # prefix| => element_name
+                # or prefix| => attribute_name if attrib
+                context = new['context'][-1]
+                val = self._tokenvalue(token)
+                if 'attrib' == context and 'prefix' in expected:
+                    # [PREFIX|att]
+                    append(seq, val, '_PREFIX', token=token)
+                    return attname2
+                elif 'type_selector' in expected:
+                    # PREFIX|*
+                    append(seq, val, '_PREFIX', token=token)
+                    return element_name
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected namespace prefix.', token=token)
+                    return expected
+
+            def _pseudo(expected, seq, token, tokenizer=None):
+                # pseudo-class or pseudo-element :a ::a :a( ::a(
+                """
+                /* '::' starts a pseudo-element, ':' a pseudo-class */
+                /* Exceptions: :first-line, :first-letter, :before and 
+                :after. */
+                /* Note that pseudo-elements are restricted to one per selector
+                and */
+                /* occur only in the last simple_selector_sequence. */
+                """
+                context = new['context'][-1]
+                val, typ = self._tokenvalue(token, normalize=True),\
+                           self._type(token)
+                if 'pseudo' in expected:                    
+                    if val in (':first-line',
+                               ':first-letter',
+                               ':before',
+                               ':after'):
+                        # always pseudo-element ???
+                        typ = 'pseudo-element'
+                    append(seq, val, typ, token=token)
+                    
+                    if val.endswith(u'('):
+                        # function
+                        # "pseudo-" "class" or "element"
+                        new['context'].append(typ) 
+                        return expressionstart                 
+                    elif 'negation' == context:
+                        return negationend
+                    elif 'pseudo-element' == typ:
+                        # only one per element, check at ) also!
+                        return combinator
+                    else:
+                        return simple_selector_sequence2 + combinator
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected start of pseudo.', token=token)
+                    return expected
+
+            def _expression(expected, seq, token, tokenizer=None):
+                # [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+
+                context = new['context'][-1]
+                val, typ = self._tokenvalue(token), self._type(token)
+                if context.startswith('pseudo-'):
+                    append(seq, val, typ, token=token)
+                    return expression
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected %s.' % typ, token=token)
+                    return expected
+
+            def _attcombinator(expected, seq, token, tokenizer=None):
+                # context: attrib
+                # PREFIXMATCH | SUFFIXMATCH | SUBSTRINGMATCH | INCLUDES | 
+                # DASHMATCH
+                context = new['context'][-1]
+                val, typ = self._tokenvalue(token), self._type(token)
+                if 'attrib' == context and 'combinator' in expected:
+                    # combinator in attrib
+                    append(seq, val, typ.lower(), token=token)
+                    return attvalue
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected %s.' % typ, token=token)
+                    return expected
+
+            def _string(expected, seq, token, tokenizer=None):
+                # identifier
+                context = new['context'][-1]
+                typ, val = self._type(token), self._stringtokenvalue(token)
+                
+                # context: attrib
+                if 'attrib' == context and 'value' in expected:
+                    # attrib: [...=VALUE]
+                    append(seq, val, typ, token=token)
+                    return attend
+
+                # context: pseudo
+                elif context.startswith('pseudo-'):
+                    # :func(...)
+                    append(seq, val, typ, token=token)
+                    return expression
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected STRING.', token=token)
+                    return expected
+
+            def _ident(expected, seq, token, tokenizer=None):
+                # identifier
+                context = new['context'][-1]
+                val, typ = self._tokenvalue(token), self._type(token)
+                
+                # context: attrib
+                if 'attrib' == context and 'attribute' in expected:
+                    # attrib: [...|ATT...]
+                    append(seq, val, 'attribute-selector', token=token)
+                    return attcombinator
+
+                elif 'attrib' == context and 'value' in expected:
+                    # attrib: [...=VALUE]
+                    append(seq, val, 'attribute-value', token=token)
+                    return attend
+
+                # context: negation
+                elif 'negation' == context:
+                    # negation: (prefix|IDENT)
+                    append(seq, val, 'negation-type-selector', token=token)
+                    return negationend
+
+                # context: pseudo
+                elif context.startswith('pseudo-'):
+                    # :func(...)
+                    append(seq, val, typ, token=token)
+                    return expression
+
+                elif 'type_selector' in expected or element_name == expected:
+                    # element name after ns or complete type_selector
+                    append(seq, val, 'type-selector', token=token)
+                    return simple_selector_sequence2 + combinator
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'Selector: Unexpected IDENT.', token=token)
+                    return expected
+
+            def _class(expected, seq, token, tokenizer=None):
+                # .IDENT
+                context = new['context'][-1]
+                val = self._tokenvalue(token)
+                if 'class' in expected:
+                    append(seq, val, 'class', token=token)
+
+                    if 'negation' == context:
+                        return negationend
+                    else:
+                        return simple_selector_sequence2 + combinator
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'Selector: Unexpected class.', token=token)
+                    return expected
+
+            def _hash(expected, seq, token, tokenizer=None):
+                # #IDENT
+                context = new['context'][-1]
+                val = self._tokenvalue(token)
+                if 'HASH' in expected:
+                    append(seq, val, 'id', token=token)
+                    
+                    if 'negation' == context:
+                        return negationend
+                    else:
+                        return simple_selector_sequence2 + combinator
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(u'Selector: Unexpected HASH.', token=token)
+                    return expected
+
+            def _char(expected, seq, token, tokenizer=None):
+                # + > ~ ) [ ] + -
+                context = new['context'][-1]
+                val = self._tokenvalue(token)
+                
+                # context: attrib
+                if u']' == val and 'attrib' == context and ']' in expected:
+                    # end of attrib
+                    append(seq, val, 'attribute-end', token=token)
+                    context = new['context'].pop() # attrib is done
+                    context = new['context'][-1]
+                    if 'negation' == context:
+                        return negationend
+                    else:
+                        return simple_selector_sequence2 + combinator
+
+                elif u'=' == val and 'attrib' == context\
+                     and 'combinator' in expected:
+                    # combinator in attrib
+                    append(seq, val, 'equals', token=token)
+                    return attvalue
+
+                # context: negation
+                elif u')' == val and 'negation' == context and u')' in expected:
+                    # not(negation_arg)"
+                    append(seq, val, 'negation-end', token=token)
+                    new['context'].pop() # negation is done
+                    context = new['context'][-1]
+                    return simple_selector_sequence + combinator                
+
+                # context: pseudo (at least one expression)
+                elif val in u'+-' and context.startswith('pseudo-'):
+                    # :func(+ -)"
+                    _names = {'+': 'plus', '-': 'minus'}
+                    if val == u'+' and seq and seq[-1].value == S:
+                        seq.replace(-1, val, _names[val])
+                    else:
+                        append(seq, val, _names[val], 
+                               token=token)
+                    return expression                
+
+                elif u')' == val and context.startswith('pseudo-') and\
+                     expression == expected:
+                    # :func(expression)"
+                    append(seq, val, 'function-end', token=token)
+                    new['context'].pop() # pseudo is done
+                    if 'pseudo-element' == context:
+                        return combinator
+                    else:
+                        return simple_selector_sequence + combinator                
+
+                # context: ROOT                
+                elif u'[' == val and 'attrib' in expected:
+                    # start of [attrib]
+                    append(seq, val, 'attribute-start', token=token)
+                    new['context'].append('attrib')
+                    return attname
+
+                elif val in u'+>~' and 'combinator' in expected:
+                    # no other combinator except S may be following
+                    _names = {
+                        '>': 'child',
+                        '+': 'adjacent-sibling',
+                        '~': 'following-sibling'}
+                    if seq and seq[-1].value == S:
+                        seq.replace(-1, val, _names[val])
+                    else:
+                        append(seq, val, _names[val], token=token)
+                    return simple_selector_sequence
+
+                elif u',' == val:
+                    # not a selectorlist
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Single selector only.', 
+                        error=xml.dom.InvalidModificationErr, 
+                        token=token)
+                    return expected
+
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected CHAR.', token=token)
+                    return expected
+
+            def _negation(expected, seq, token, tokenizer=None):
+                # not(
+                context = new['context'][-1]
+                val = self._tokenvalue(token, normalize=True)
+                if 'negation' in expected:
+                    new['context'].append('negation')
+                    append(seq, val, 'negation-start', token=token)
+                    return negation_arg
+                else:
+                    new['wellformed'] = False
+                    self._log.error(
+                        u'Selector: Unexpected negation.', token=token)
+                    return expected
+
+            def _atkeyword(expected, seq, token, tokenizer=None):
+                "invalidates selector"
+                new['wellformed'] = False
+                self._log.error(
+                        u'Selector: Unexpected ATKEYWORD.', token=token)
+                return expected
+
+
+            # expected: only|not or mediatype, mediatype, feature, and
+            newseq = self._tempSeq()
+            
+            wellformed, expected = self._parse(
+                expected=simple_selector_sequence,
+                seq=newseq, tokenizer=tokenizer,
+                productions={'CHAR': _char,
+                             'class': _class,
+                             'HASH': _hash,
+                             'STRING': _string,
+                             'IDENT': _ident,
+                             'namespace_prefix': _namespace_prefix,
+                             'negation': _negation,
+                             'pseudo-class': _pseudo,
+                             'pseudo-element': _pseudo,
+                             'universal': _universal,
+                             # pseudo
+                             'NUMBER': _expression,
+                             'DIMENSION': _expression,
+                             # attribute
+                             'PREFIXMATCH': _attcombinator,
+                             'SUFFIXMATCH': _attcombinator,
+                             'SUBSTRINGMATCH': _attcombinator,
+                             'DASHMATCH': _attcombinator,
+                             'INCLUDES': _attcombinator,
+                             
+                             'S': _S,
+                             'COMMENT': _COMMENT,
+                             'ATKEYWORD': _atkeyword})
+            wellformed = wellformed and new['wellformed']
+
+            # post condition         
+            if len(new['context']) > 1 or not newseq:
+                wellformed = False
+                self._log.error(u'Selector: Invalid or incomplete selector: %s' 
+                                % self._valuestr(selectorText))
+            
+            if expected == 'element_name':
+                wellformed = False
+                self._log.error(u'Selector: No element name found: %s'
+                                % self._valuestr(selectorText))
+
+            if expected == simple_selector_sequence and newseq:
+                wellformed = False
+                self._log.error(u'Selector: Cannot end with combinator: %s'
+                                % self._valuestr(selectorText))
+
+            if newseq and hasattr(newseq[-1].value, 'strip') \
+               and newseq[-1].value.strip() == u'':
+                del newseq[-1]
+
+            # set
+            if wellformed:
+                self.__namespaces = namespaces
+                self._element = new['element']
+                self._specificity = tuple(new['specificity'])
+                self._setSeq(newseq)
+                # filter that only used ones are kept
+                self.__namespaces = self._getUsedNamespaces()
+
+    selectorText = property(_getSelectorText, _setSelectorText,
+                            doc=u"(DOM) The parsable textual representation of "
+                                u"the selector.")
+
+    specificity = property(lambda self: self._specificity, 
+         doc="""Specificity of this selector (READONLY). 
+                Tuple of (a, b, c, d) where: 
+                
+                a
+                    presence of style in document, always 0 if not used on a 
+                    document
+                b
+                    number of ID selectors
+                c 
+                    number of .class selectors
+                d 
+                    number of Element (type) selectors""")
+
+    wellformed = property(lambda self: bool(len(self.seq)))
+
+
+    @Deprecated('Use property parent instead')
+    def _getParentList(self):
+        return self.parent
+    
+    parentList = property(_getParentList,
+                          doc="DEPRECATED, see property parent instead")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssmediarule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssmediarule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssmediarule.py	(revision 1126)
@@ -0,0 +1,302 @@
+"""CSSMediaRule implements DOM Level 2 CSS CSSMediaRule."""
+__all__ = ['CSSMediaRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSMediaRule(cssrule.CSSRuleRules):
+    """
+    Objects implementing the CSSMediaRule interface can be identified by the
+    MEDIA_RULE constant. On these objects the type attribute must return the
+    value of that constant.
+
+    Format::
+
+      : MEDIA_SYM S* medium [ COMMA S* medium ]* 
+      
+          STRING? # the name
+      
+      LBRACE S* ruleset* '}' S*;
+      
+    ``cssRules``
+        All Rules in this media rule, a :class:`~cssutils.css.CSSRuleList`.
+    """
+    def __init__(self, mediaText='all', name=None,
+                 parentRule=None, parentStyleSheet=None, readonly=False):
+        """constructor"""
+        super(CSSMediaRule, self).__init__(parentRule=parentRule, 
+                                           parentStyleSheet=parentStyleSheet)
+        self._atkeyword = u'@media'
+        
+        # 1. media 
+        if mediaText:
+            self.media = mediaText
+        else:
+            self.media = cssutils.stylesheets.MediaList()
+
+        self.name = name
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(mediaText=%r)" % (
+                self.__class__.__name__,
+                self.media.mediaText)
+        
+    def __str__(self):
+        return u"<cssutils.css.%s object mediaText=%r at 0x%x>" % (
+                self.__class__.__name__,
+                self.media.mediaText,
+                id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSMediaRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :param cssText:
+            a parseable string or a tuple of (cssText, dict-of-namespaces)
+        :Exceptions:
+            - :exc:`~xml.dom.NamespaceErr`:
+              Raised if a specified selector uses an unknown namespace
+              prefix.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        # media "name"? { cssRules }
+        super(CSSMediaRule, self)._setCssText(cssText)
+        
+        # might be (cssText, namespaces)
+        cssText, namespaces = self._splitNamespacesOff(cssText)
+        
+        try:
+            # use parent style sheet ones if available
+            namespaces = self.parentStyleSheet.namespaces
+        except AttributeError:
+            pass
+        
+        tokenizer = self._tokenize2(cssText)
+        attoken = self._nexttoken(tokenizer, None)
+        if self._type(attoken) != self._prods.MEDIA_SYM:
+            self._log.error(u'CSSMediaRule: No CSSMediaRule found: %s' %
+                self._valuestr(cssText),
+                error=xml.dom.InvalidModificationErr)
+        
+        else:            
+            # save if parse goes wrong
+            oldMedia = self._media
+            oldName = self._name
+            oldCssRules = self._cssRules
+            
+            ok = True
+
+            # media
+            mediatokens, end = self._tokensupto2(tokenizer, 
+                                                 mediaqueryendonly=True,
+                                                 separateEnd=True)        
+            if u'{' == self._tokenvalue(end)\
+               or self._prods.STRING == self._type(end):
+                self.media = cssutils.stylesheets.MediaList(parentRule=self)
+                # TODO: remove special case
+                self.media.mediaText = mediatokens
+                ok = ok and self.media.wellformed
+            else:
+                ok = False
+            
+            # name (optional)
+            name = None
+            nameseq = self._tempSeq()
+            if self._prods.STRING == self._type(end):
+                name = self._stringtokenvalue(end)
+                # TODO: for now comments are lost after name
+                nametokens, end = self._tokensupto2(tokenizer, 
+                                                    blockstartonly=True,
+                                                    separateEnd=True)
+                wellformed, expected = self._parse(None, 
+                                                   nameseq, 
+                                                   nametokens, 
+                                                   {})
+                if not wellformed:
+                    ok = False
+                    self._log.error(u'CSSMediaRule: Syntax Error: %s' % 
+                                    self._valuestr(cssText))
+                    
+
+            # check for {
+            if u'{' != self._tokenvalue(end):
+                self._log.error(u'CSSMediaRule: No "{" found: %s' % 
+                                self._valuestr(cssText))
+                return
+            
+            # cssRules
+            cssrulestokens, braceOrEOF = self._tokensupto2(tokenizer, 
+                                               mediaendonly=True,
+                                               separateEnd=True)
+            nonetoken = self._nexttoken(tokenizer, None)
+            if 'EOF' == self._type(braceOrEOF):
+                # HACK!!!
+                # TODO: Not complete, add EOF to rule and } to @media
+                cssrulestokens.append(braceOrEOF)
+                braceOrEOF = ('CHAR', '}', 0, 0)
+                self._log.debug(u'CSSMediaRule: Incomplete, adding "}".', 
+                                token=braceOrEOF, neverraise=True)
+
+            if u'}' != self._tokenvalue(braceOrEOF):
+                self._log.error(u'CSSMediaRule: No "}" found.', 
+                                token=braceOrEOF)
+            elif nonetoken:
+                self._log.error(u'CSSMediaRule: Trailing content found.',
+                                token=nonetoken)
+            else:                
+                # for closures: must be a mutable
+                new = {'wellformed': True }
+                                   
+                def COMMENT(expected, seq, token, tokenizer=None):
+                    self.insertRule(cssutils.css.CSSComment([token],
+                                                            parentRule=self,
+                                                            parentStyleSheet=self.parentStyleSheet))
+                    return expected
+
+                def ruleset(expected, seq, token, tokenizer):
+                    rule = cssutils.css.CSSStyleRule(parentRule=self,
+                                                     parentStyleSheet=self.parentStyleSheet)
+                    rule.cssText = self._tokensupto2(tokenizer, token)
+                    if rule.wellformed:
+                        self.insertRule(rule)
+                    return expected
+        
+                def atrule(expected, seq, token, tokenizer):
+                    # TODO: get complete rule!
+                    tokens = self._tokensupto2(tokenizer, token)
+                    atval = self._tokenvalue(token)
+                    if atval in ('@charset ', '@font-face', '@import', 
+                                 '@namespace', '@page', '@media', '@variables'):
+                        self._log.error(u'CSSMediaRule: This rule is not '
+                                        u'allowed in CSSMediaRule - ignored: '
+                                        u'%s.' % self._valuestr(tokens),
+                                        token = token, 
+                                        error=xml.dom.HierarchyRequestErr)
+                    else:
+                        rule = cssutils.css.CSSUnknownRule(tokens,
+                                                           parentRule=self, 
+                                        parentStyleSheet=self.parentStyleSheet)
+                        if rule.wellformed:
+                            self.insertRule(rule)
+                    return expected
+                
+                # save for possible reset
+                oldCssRules = self.cssRules
+                
+                self.cssRules = cssutils.css.CSSRuleList()
+                seq = [] # not used really
+
+                tokenizer = iter(cssrulestokens)
+                wellformed, expected = self._parse(braceOrEOF,
+                                                   seq,
+                                                   tokenizer, {
+                                                     'COMMENT': COMMENT,
+                                                     'CHARSET_SYM': atrule,
+                                                     'FONT_FACE_SYM': atrule,
+                                                     'IMPORT_SYM': atrule,
+                                                     'NAMESPACE_SYM': atrule,
+                                                     'PAGE_SYM': atrule,
+                                                     'MEDIA_SYM': atrule,
+                                                     'ATKEYWORD': atrule
+                                                   }, 
+                                                   default=ruleset,
+                                                   new=new)
+                ok = ok and wellformed
+                
+            if ok:
+                self.name = name
+                self._setSeq(nameseq)
+            else:
+                self._media = oldMedia
+                self._cssRules = oldCssRules
+                                            
+    cssText = property(_getCssText, _setCssText,
+                       doc=u"(DOM) The parsable textual representation of this "
+                           u"rule.")
+
+    def _setName(self, name):
+        if isinstance(name, basestring) or name is None:
+            # "" or ''
+            if not name:
+                name = None
+
+            self._name = name
+        else:
+            self._log.error(u'CSSImportRule: Not a valid name: %s' % name)
+
+    name = property(lambda self: self._name, _setName,
+                    doc=u"An optional name for this media rule.")
+
+    def _setMedia(self, media):
+        """
+        :param media:
+            a :class:`~cssutils.stylesheets.MediaList` or string
+        """
+        self._checkReadonly()
+        if isinstance(media, basestring):
+            self._media = cssutils.stylesheets.MediaList(mediaText=media, 
+                                                         parentRule=self)
+        else:
+            media._parentRule = self
+            self._media = media
+        
+        # NOT IN @media seq at all?!
+#        # update seq
+#        for i, item in enumerate(self.seq):
+#            if item.type == 'media':
+#                self._seq[i] = (self._media, 'media', None, None)
+#                break
+#        else:
+#            # insert after @media if not in seq at all
+#            self.seq.insert(0, 
+#                             self._media, 'media', None, None)
+            
+    media = property(lambda self: self._media, _setMedia,
+                     doc=u"(DOM) A list of media types for this rule "
+                         u"of type :class:`~cssutils.stylesheets.MediaList`.")
+    
+            
+    def insertRule(self, rule, index=None):
+        """Implements base ``insertRule``."""
+        rule, index = self._prepareInsertRule(rule, index)
+        
+        if rule is False or rule is True:
+            # done or error
+            return
+        
+        # check hierarchy
+        if isinstance(rule, cssutils.css.CSSCharsetRule) or \
+           isinstance(rule, cssutils.css.CSSFontFaceRule) or \
+           isinstance(rule, cssutils.css.CSSImportRule) or \
+           isinstance(rule, cssutils.css.CSSNamespaceRule) or \
+           isinstance(rule, cssutils.css.CSSPageRule) or \
+           isinstance(rule, cssutils.css.MarginRule) or \
+           isinstance(rule, CSSMediaRule):
+            self._log.error(u'%s: This type of rule is not allowed here: %s' 
+                            % (self.__class__.__name__, rule.cssText),
+                            error=xml.dom.HierarchyRequestErr)
+            return
+
+        return self._finishInsertRule(rule, index)
+
+    type = property(lambda self: self.MEDIA_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+
+    wellformed = property(lambda self: self.media.wellformed)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssrule.py	(revision 1126)
@@ -0,0 +1,304 @@
+"""CSSRule implements DOM Level 2 CSS CSSRule."""
+__all__ = ['CSSRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssutils
+import xml.dom
+
+class CSSRule(cssutils.util.Base2):
+    """Abstract base interface for any type of CSS statement. This includes
+    both rule sets and at-rules. An implementation is expected to preserve
+    all rules specified in a CSS style sheet, even if the rule is not
+    recognized by the parser. Unrecognized rules are represented using the
+    :class:`CSSUnknownRule` interface.
+    """
+
+    """
+    CSSRule type constants.
+    An integer indicating which type of rule this is.
+    """
+    UNKNOWN_RULE = 0 
+    ":class:`cssutils.css.CSSUnknownRule` (not used in CSSOM anymore)"
+    STYLE_RULE = 1
+    ":class:`cssutils.css.CSSStyleRule`"
+    CHARSET_RULE = 2
+    ":class:`cssutils.css.CSSCharsetRule` (not used in CSSOM anymore)"
+    IMPORT_RULE = 3
+    ":class:`cssutils.css.CSSImportRule`"
+    MEDIA_RULE = 4
+    ":class:`cssutils.css.CSSMediaRule`"
+    FONT_FACE_RULE = 5
+    ":class:`cssutils.css.CSSFontFaceRule`"
+    PAGE_RULE = 6
+    ":class:`cssutils.css.CSSPageRule`"
+    NAMESPACE_RULE = 10
+    """:class:`cssutils.css.CSSNamespaceRule`, 
+    Value has changed in 0.9.7a3 due to a change in the CSSOM spec."""
+    COMMENT = 1001 # was -1, cssutils only
+    """:class:`cssutils.css.CSSComment` - not in the offical spec,
+    Value has changed in 0.9.7a3"""
+    VARIABLES_RULE = 1008 
+    """:class:`cssutils.css.CSSVariablesRule` - experimental rule
+    not in the offical spec"""
+
+    MARGIN_RULE = 1006 
+    """:class:`cssutils.css.MarginRule` - experimental rule
+    not in the offical spec"""
+
+    _typestrings = {UNKNOWN_RULE: u'UNKNOWN_RULE', 
+                    STYLE_RULE: u'STYLE_RULE',
+                    CHARSET_RULE: u'CHARSET_RULE', 
+                    IMPORT_RULE: u'IMPORT_RULE',
+                    MEDIA_RULE: u'MEDIA_RULE', 
+                    FONT_FACE_RULE: u'FONT_FACE_RULE', 
+                    PAGE_RULE: u'PAGE_RULE',                     
+                    NAMESPACE_RULE: u'NAMESPACE_RULE',
+                    COMMENT: u'COMMENT',
+                    VARIABLES_RULE: u'VARIABLES_RULE',
+                    MARGIN_RULE: u'MARGIN_RULE'
+                    }
+
+    def __init__(self, parentRule=None, parentStyleSheet=None, readonly=False):
+        """Set common attributes for all rules."""
+        super(CSSRule, self).__init__()
+        self._parent = parentRule
+        self._parentRule = parentRule
+        self._parentStyleSheet = parentStyleSheet
+        self._setSeq(self._tempSeq())
+        #self._atkeyword = None
+        # must be set after initialization of #inheriting rule is done
+        self._readonly = False
+
+    def _setAtkeyword(self, keyword):
+        """Check if new keyword fits the rule it is used for."""
+        atkeyword = self._normalize(keyword)
+        if not self.atkeyword or (self.atkeyword == atkeyword):
+            self._atkeyword = atkeyword
+            self._keyword = keyword
+        else:
+            self._log.error(u'%s: Invalid atkeyword for this rule: %r' %
+                            (self.atkeyword, keyword),
+                            error=xml.dom.InvalidModificationErr)
+
+    atkeyword = property(lambda self: self._atkeyword, _setAtkeyword,
+                         doc=u"Normalized  keyword of an @rule (e.g. ``@import``).")
+
+    def _setCssText(self, cssText):
+        """
+        :param cssText:
+            A parsable DOMString.
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        self._checkReadonly()
+
+    cssText = property(lambda self: u'', _setCssText,
+                       doc=u"(DOM) The parsable textual representation of the "
+                           u"rule. This reflects the current state of the rule "
+                           u"and not its initial value.")
+
+    parent = property(lambda self: self._parent,
+                      doc=u"The Parent Node of this CSSRule or None.")
+
+    parentRule = property(lambda self: self._parentRule,
+                          doc=u"If this rule is contained inside another rule "
+                          u"(e.g. a style rule inside an @media block), this "
+                          u"is the containing rule. If this rule is not nested "
+                          u"inside any other rules, this returns None.")
+
+    def _getParentStyleSheet(self):
+        # rules contained in other rules (@media) use that rules parent
+        if (self.parentRule):
+            return self.parentRule._parentStyleSheet
+        else:
+            return self._parentStyleSheet
+
+    parentStyleSheet = property(_getParentStyleSheet,
+                                doc=u"The style sheet that contains this rule.")
+
+    type = property(lambda self: self.UNKNOWN_RULE,
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+
+    typeString = property(lambda self: CSSRule._typestrings[self.type],
+                          doc=u"Descriptive name of this rule's type.")
+
+    wellformed = property(lambda self: False,
+                          doc=u"If the rule is wellformed.")
+
+
+
+class CSSRuleRules(CSSRule):
+    """Abstract base interface for rules that contain other rules
+    like @media or @page. Methods may be overwritten if a rule
+    has specific stuff to do like checking the order of insertion like 
+    @media does.
+    """
+    
+    def __init__(self, parentRule=None, parentStyleSheet=None):
+        
+        super(CSSRuleRules, self).__init__(parentRule=parentRule, 
+                                           parentStyleSheet=parentStyleSheet)
+        
+        self.cssRules = cssutils.css.CSSRuleList()
+        
+    def __iter__(self):
+        """Generator iterating over these rule's cssRules."""
+        for rule in self._cssRules:
+            yield rule        
+
+    def _setCssRules(self, cssRules):
+        "Set new cssRules and update contained rules refs."
+        cssRules.append = self.insertRule
+        cssRules.extend = self.insertRule
+        cssRules.__delitem__ == self.deleteRule
+        
+        for rule in cssRules:
+            rule._parentRule = self
+            rule._parentStyleSheet = None
+            
+        self._cssRules = cssRules
+
+    cssRules = property(lambda self: self._cssRules, _setCssRules,
+            "All Rules in this style sheet, a "
+            ":class:`~cssutils.css.CSSRuleList`.")    
+    
+    def deleteRule(self, index):
+        """
+        Delete the rule at `index` from rules ``cssRules``.
+        
+        :param index:
+            The `index` of the rule to be removed from the rules cssRules
+            list. For an `index` < 0 **no** :exc:`~xml.dom.IndexSizeErr` is
+            raised but rules for normal Python lists are used. E.g. 
+            ``deleteRule(-1)`` removes the last rule in cssRules.
+            
+            `index` may also be a CSSRule object which will then be removed.
+
+        :Exceptions:
+            - :exc:`~xml.dom.IndexSizeErr`:
+              Raised if the specified index does not correspond to a rule in
+              the media rule list.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this media rule is readonly.
+        """
+        self._checkReadonly()
+
+        if isinstance(index, CSSRule):
+            for i, r in enumerate(self.cssRules):
+                if index == r:
+                    index = i
+                    break
+            else:
+                raise xml.dom.IndexSizeErr(u"%s: Not a rule in "
+                                           u"this rule'a cssRules list: %s"
+                                           % (self.__class__.__name__, index))
+
+        try:
+            # detach
+            self._cssRules[index]._parentRule = None 
+            del self._cssRules[index]
+            
+        except IndexError:
+            raise xml.dom.IndexSizeErr(u'%s: %s is not a valid index '
+                                       u'in the rulelist of length %i' 
+                                       % (self.__class__.__name__, 
+                                          index, self._cssRules.length))
+
+    def _prepareInsertRule(self, rule, index=None):
+        "return checked `index` and optional parsed `rule`"
+        self._checkReadonly()
+
+        # check index
+        if index is None:
+            index = len(self._cssRules)
+            
+        elif index < 0 or index > self._cssRules.length:
+            raise xml.dom.IndexSizeErr(u'%s: Invalid index %s for '
+                                       u'CSSRuleList with a length of %s.'
+                                       % (self.__class__.__name__,
+                                          index, self._cssRules.length))
+        
+        # check and optionally parse rule
+        if isinstance(rule, basestring):
+            tempsheet = cssutils.css.CSSStyleSheet()
+            tempsheet.cssText = rule
+            if len(tempsheet.cssRules) != 1 or (tempsheet.cssRules and
+             not isinstance(tempsheet.cssRules[0], cssutils.css.CSSRule)):
+                self._log.error(u'%s: Invalid Rule: %s' % (self.__class__.__name__,
+                                                           rule))
+                return False, False
+            rule = tempsheet.cssRules[0]
+            
+        elif isinstance(rule, cssutils.css.CSSRuleList):
+            # insert all rules
+            for i, r in enumerate(rule):
+                self.insertRule(r, index + i)
+            return True, True
+            
+        elif not isinstance(rule, cssutils.css.CSSRule):
+            self._log.error(u'%s: Not a CSSRule: %s' % (rule, 
+                                                        self.__class__.__name__))
+            return False, False
+        
+        return rule, index
+
+    def _finishInsertRule(self, rule, index):
+        "add `rule` at `index`"
+        rule._parentRule = self
+        rule._parentStyleSheet = None
+        self._cssRules.insert(index, rule)
+        return index
+
+    def add(self, rule):
+        """Add `rule` to page rule. Same as ``insertRule(rule)``."""
+        return self.insertRule(rule)
+
+    def insertRule(self, rule, index=None):
+        """
+        Insert `rule` into the rules ``cssRules``.
+        
+        :param rule:
+            the parsable text representing the `rule` to be inserted. For rule
+            sets this contains both the selector and the style declaration. 
+            For at-rules, this specifies both the at-identifier and the rule
+            content.
+
+            cssutils also allows rule to be a valid 
+            :class:`~cssutils.css.CSSRule` object.
+
+        :param index:
+            before the `index` the specified `rule` will be inserted. 
+            If the specified `index` is equal to the length of the rules 
+            rule collection, the rule will be added to the end of the rule.
+            If index is not given or None rule will be appended to rule
+            list.
+
+        :returns:
+            the index of the newly inserted rule.
+
+        :exceptions:
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the `rule` cannot be inserted at the specified `index`,
+              e.g., if an @import rule is inserted after a standard rule set
+              or other at-rule.
+            - :exc:`~xml.dom.IndexSizeErr`:
+              Raised if the specified `index` is not a valid insertion point.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this rule is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified `rule` has a syntax error and is
+              unparsable.
+        """
+        return self._prepareInsertRule(rule, index)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/property.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/property.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/property.py	(revision 1126)
@@ -0,0 +1,510 @@
+"""Property is a single CSS property in a CSSStyleDeclaration."""
+__all__ = ['Property']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.helper import Deprecated
+from value import PropertyValue
+import cssutils
+import xml.dom
+
+class Property(cssutils.util.Base):
+    """A CSS property in a StyleDeclaration of a CSSStyleRule (cssutils).
+
+    Format::
+
+        property = name
+          : IDENT S*
+          ;
+
+        expr = value
+          : term [ operator term ]*
+          ;
+        term
+          : unary_operator?
+            [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* |
+              ANGLE S* | TIME S* | FREQ S* | function ]
+          | STRING S* | IDENT S* | URI S* | hexcolor
+          ;
+        function
+          : FUNCTION S* expr ')' S*
+          ;
+        /*
+         * There is a constraint on the color that it must
+         * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F])
+         * after the "#"; e.g., "#000" is OK, but "#abcd" is not.
+         */
+        hexcolor
+          : HASH S*
+          ;
+
+        prio
+          : IMPORTANT_SYM S*
+          ;
+
+    """
+    def __init__(self, name=None, value=None, priority=u'',
+                 _mediaQuery=False, parent=None):
+        """
+        :param name:
+            a property name string (will be normalized)
+        :param value:
+            a property value string
+        :param priority:
+            an optional priority string which currently must be u'',
+            u'!important' or u'important'
+        :param _mediaQuery:
+            if ``True`` value is optional (used by MediaQuery)
+        :param parent:
+            the parent object, normally a
+            :class:`cssutils.css.CSSStyleDeclaration`
+        """
+        super(Property, self).__init__()
+        self.seqs = [[], None, []]
+        self.wellformed = False
+        self._mediaQuery = _mediaQuery
+        self.parent = parent
+
+        self.__nametoken = None
+        self._name = u''
+        self._literalname = u''
+        self.seqs[1] = PropertyValue(parent=self)
+        if name:
+            self.name = name
+            self.propertyValue = value
+
+        self._priority = u''
+        self._literalpriority = u''
+        if priority:
+            self.priority = priority
+
+    def __repr__(self):
+        return u"cssutils.css.%s(name=%r, value=%r, priority=%r)" % (
+                self.__class__.__name__,
+                self.literalname,
+                self.propertyValue.cssText,
+                self.priority)
+
+    def __str__(self):
+        return u"<%s.%s object name=%r value=%r priority=%r valid=%r at 0x%x>" \
+               % (self.__class__.__module__,
+                  self.__class__.__name__,
+                  self.name,
+                  self.propertyValue.cssText,
+                  self.priority,
+                  self.valid,
+                  id(self))
+
+    def _isValidating(self):
+        """Return True if validation is enabled."""
+        try:
+            return self.parent.validating
+        except AttributeError:
+            # default (no parent)
+            return True
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_Property(self)
+
+    def _setCssText(self, cssText):
+        """
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        # check and prepare tokenlists for setting
+        tokenizer = self._tokenize2(cssText)
+        nametokens = self._tokensupto2(tokenizer, propertynameendonly=True)
+        if nametokens:
+            wellformed = True
+
+            valuetokens = self._tokensupto2(tokenizer,
+                                            propertyvalueendonly=True)
+            prioritytokens = self._tokensupto2(tokenizer,
+                                               propertypriorityendonly=True)
+
+            if self._mediaQuery and not valuetokens:
+                # MediaQuery may consist of name only
+                self.name = nametokens
+                self.propertyValue = None
+                self.priority = None
+                return
+
+            # remove colon from nametokens
+            colontoken = nametokens.pop()
+            if self._tokenvalue(colontoken) != u':':
+                wellformed = False
+                self._log.error(u'Property: No ":" after name found: %s' %
+                                self._valuestr(cssText), colontoken)
+            elif not nametokens:
+                wellformed = False
+                self._log.error(u'Property: No property name found: %s' %
+                            self._valuestr(cssText), colontoken)
+
+            if valuetokens:
+                if self._tokenvalue(valuetokens[-1]) == u'!':
+                    # priority given, move "!" to prioritytokens
+                    prioritytokens.insert(0, valuetokens.pop(-1))
+            else:
+                wellformed = False
+                self._log.error(u'Property: No property value found: %s' %
+                                self._valuestr(cssText), colontoken)
+
+            if wellformed:
+                self.wellformed = True
+                self.name = nametokens
+                self.propertyValue = valuetokens
+                self.priority = prioritytokens
+
+                # also invalid values are set!
+
+                if self._isValidating():
+                    self.validate()
+
+        else:
+            self._log.error(u'Property: No property name found: %s' %
+                            self._valuestr(cssText))
+
+    cssText = property(fget=_getCssText, fset=_setCssText,
+        doc="A parsable textual representation.")
+
+    def _setName(self, name):
+        """
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified name has a syntax error and is
+              unparsable.
+        """
+        # for closures: must be a mutable
+        new = {'literalname': None,
+               'wellformed': True}
+
+        def _ident(expected, seq, token, tokenizer=None):
+            # name
+            if 'name' == expected:
+                new['literalname'] = self._tokenvalue(token).lower()
+                seq.append(new['literalname'])
+                return 'EOF'
+            else:
+                new['wellformed'] = False
+                self._log.error(u'Property: Unexpected ident.', token)
+                return expected
+
+        newseq = []
+        wellformed, expected = self._parse(expected='name',
+                                           seq=newseq,
+                                           tokenizer=self._tokenize2(name),
+                                           productions={'IDENT': _ident})
+        wellformed = wellformed and new['wellformed']
+
+        # post conditions
+        # define a token for error logging
+        if isinstance(name, list):
+            token = name[0]
+            self.__nametoken = token
+        else:
+            token = None
+
+        if not new['literalname']:
+            wellformed = False
+            self._log.error(u'Property: No name found: %s' %
+                self._valuestr(name), token=token)
+
+        if wellformed:
+            self.wellformed = True
+            self._literalname = new['literalname']
+            self._name = self._normalize(self._literalname)
+            self.seqs[0] = newseq
+
+            # validate
+            if self._isValidating() and self._name not in cssutils.profile.knownNames:
+                # self.valid = False
+                self._log.warn(u'Property: Unknown Property name.',
+                               token=token, neverraise=True)
+            else:
+                pass
+#                self.valid = True
+#                if self.propertyValue:
+#                    self.propertyValue._propertyName = self._name
+#                    #self.valid = self.propertyValue.valid
+        else:
+            self.wellformed = False
+
+    name = property(lambda self: self._name, _setName,
+                    doc="Name of this property.")
+
+    literalname = property(lambda self: self._literalname,
+                           doc="Readonly literal (not normalized) name "
+                               "of this property")
+
+    def _setPropertyValue(self, cssText):
+        """
+        See css.PropertyValue
+
+        :exceptions:
+        - :exc:`~xml.dom.SyntaxErr`:
+          Raised if the specified CSS string value has a syntax error
+          (according to the attached property) or is unparsable.
+        - :exc:`~xml.dom.InvalidModificationErr`:
+          TODO: Raised if the specified CSS string value represents a different
+          type of values than the values allowed by the CSS property.
+        """
+        if self._mediaQuery and not cssText:
+            self.seqs[1] = PropertyValue(parent=self)
+        else:
+            self.seqs[1].cssText = cssText
+            self.wellformed = self.wellformed and self.seqs[1].wellformed
+
+    propertyValue = property(lambda self: self.seqs[1],
+                             _setPropertyValue,
+                             doc=u"(cssutils) PropertyValue object of property")
+
+
+    def _getValue(self):
+        if self.propertyValue:
+            # value without comments
+            return self.propertyValue.value
+        else:
+            return u''
+
+    def _setValue(self, value):
+        self._setPropertyValue(value)
+
+    value = property(_getValue, _setValue,
+                     doc="The textual value of this Properties propertyValue.")
+
+    def _setPriority(self, priority):
+        """
+        priority
+            a string, currently either u'', u'!important' or u'important'
+
+        Format::
+
+            prio
+              : IMPORTANT_SYM S*
+              ;
+
+            "!"{w}"important"   {return IMPORTANT_SYM;}
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified priority has a syntax error and is
+              unparsable.
+              In this case a priority not equal to None, "" or "!{w}important".
+              As CSSOM defines CSSStyleDeclaration.getPropertyPriority resulting
+              in u'important' this value is also allowed to set a Properties
+              priority
+        """
+        if self._mediaQuery:
+            self._priority = u''
+            self._literalpriority = u''
+            if priority:
+                self._log.error(u'Property: No priority in a MediaQuery - '
+                                u'ignored.')
+            return
+
+        if isinstance(priority, basestring) and\
+           u'important' == self._normalize(priority):
+            priority = u'!%s' % priority
+
+        # for closures: must be a mutable
+        new = {'literalpriority': u'',
+               'wellformed': True}
+
+        def _char(expected, seq, token, tokenizer=None):
+            # "!"
+            val = self._tokenvalue(token)
+            if u'!' == expected == val:
+                seq.append(val)
+                return 'important'
+            else:
+                new['wellformed'] = False
+                self._log.error(u'Property: Unexpected char.', token)
+                return expected
+
+        def _ident(expected, seq, token, tokenizer=None):
+            # "important"
+            val = self._tokenvalue(token)
+            if 'important' == expected:
+                new['literalpriority'] = val
+                seq.append(val)
+                return 'EOF'
+            else:
+                new['wellformed'] = False
+                self._log.error(u'Property: Unexpected ident.', token)
+                return expected
+
+        newseq = []
+        wellformed, expected = self._parse(expected='!',
+                                           seq=newseq,
+                                           tokenizer=self._tokenize2(priority),
+                                           productions={'CHAR': _char,
+                                                        'IDENT': _ident})
+        wellformed = wellformed and new['wellformed']
+
+        # post conditions
+        if priority and not new['literalpriority']:
+            wellformed = False
+            self._log.info(u'Property: Invalid priority: %s' %
+                           self._valuestr(priority))
+
+        if wellformed:
+            self.wellformed = self.wellformed and wellformed
+            self._literalpriority = new['literalpriority']
+            self._priority = self._normalize(self.literalpriority)
+            self.seqs[2] = newseq
+            # validate priority
+            if self._priority not in (u'', u'important'):
+                self._log.error(u'Property: No CSS priority value: %s' %
+                                self._priority)
+
+    priority = property(lambda self: self._priority, _setPriority,
+        doc="Priority of this property.")
+
+    literalpriority = property(lambda self: self._literalpriority,
+        doc="Readonly literal (not normalized) priority of this property")
+
+    def _setParent(self, parent):
+        self._parent = parent
+
+    parent = property(lambda self: self._parent, _setParent,
+        doc="The Parent Node (normally a CSSStyledeclaration) of this "
+            "Property")
+
+    def validate(self):
+        """Validate value against `profiles` which are checked dynamically.
+        properties in e.g. @font-face rules are checked against
+        ``cssutils.profile.CSS3_FONT_FACE`` only.
+
+        For each of the following cases a message is reported:
+
+        - INVALID (so the property is known but not valid)
+            ``ERROR    Property: Invalid value for "{PROFILE-1[/PROFILE-2...]"
+            property: ...``
+
+        - VALID but not in given profiles or defaultProfiles
+            ``WARNING    Property: Not valid for profile "{PROFILE-X}" but valid
+            "{PROFILE-Y}" property: ...``
+
+        - VALID in current profile
+            ``DEBUG    Found valid "{PROFILE-1[/PROFILE-2...]" property...``
+
+        - UNKNOWN property
+            ``WARNING    Unknown Property name...`` is issued
+
+        so for example::
+
+            cssutils.log.setLevel(logging.DEBUG)
+            parser = cssutils.CSSParser()
+            s = parser.parseString('''body {
+                unknown-property: x;
+                color: 4;
+                color: rgba(1,2,3,4);
+                color: red
+            }''')
+
+            # Log output:
+
+            WARNING Property: Unknown Property name. [2:9: unknown-property]
+            ERROR   Property: Invalid value for "CSS Color Module Level 3/CSS Level 2.1" property: 4 [3:9: color]
+            DEBUG   Property: Found valid "CSS Color Module Level 3" value: rgba(1, 2, 3, 4) [4:9: color]
+            DEBUG   Property: Found valid "CSS Level 2.1" value: red [5:9: color]
+
+
+        and when setting an explicit default profile::
+
+            cssutils.profile.defaultProfiles = cssutils.profile.CSS_LEVEL_2
+            s = parser.parseString('''body {
+                unknown-property: x;
+                color: 4;
+                color: rgba(1,2,3,4);
+                color: red
+            }''')
+
+            # Log output:
+
+            WARNING Property: Unknown Property name. [2:9: unknown-property]
+            ERROR   Property: Invalid value for "CSS Color Module Level 3/CSS Level 2.1" property: 4 [3:9: color]
+            WARNING Property: Not valid for profile "CSS Level 2.1" but valid "CSS Color Module Level 3" value: rgba(1, 2, 3, 4)  [4:9: color]
+            DEBUG   Property: Found valid "CSS Level 2.1" value: red [5:9: color]
+        """
+        valid = False
+
+        profiles = None
+        try:
+            # if @font-face use that profile
+            rule = self.parent.parentRule
+        except AttributeError:
+            pass
+        else:
+            if rule is not None:
+                if rule.type == rule.FONT_FACE_RULE:
+                    profiles = [cssutils.profile.CSS3_FONT_FACE]
+                #TODO: same for @page
+
+        if self.name and self.value:
+
+            cv = self.propertyValue
+            # TODO
+#            if cv.cssValueType == cv.CSS_VARIABLE and not cv.value:
+#                # TODO: false alarms too!
+#                cssutils.log.warn(u'No value for variable "%s" found, keeping '
+#                                  u'variable.' % cv.name, neverraise=True)
+
+            if self.name in cssutils.profile.knownNames:
+                # add valid, matching, validprofiles...
+                valid, matching, validprofiles = \
+                    cssutils.profile.validateWithProfile(self.name,
+                                                         self.value,
+                                                         profiles)
+
+                if not valid:
+                    self._log.error(u'Property: Invalid value for '
+                                    u'"%s" property: %s'
+                                    % (u'/'.join(validprofiles), self.value),
+                                    token=self.__nametoken,
+                                    neverraise=True)
+
+                # TODO: remove logic to profiles!
+                elif valid and not matching:#(profiles and profiles not in validprofiles):
+                    if not profiles:
+                        notvalidprofiles = u'/'.join(cssutils.profile.defaultProfiles)
+                    else:
+                        notvalidprofiles = profiles
+                    self._log.warn(u'Property: Not valid for profile "%s" '
+                                   u'but valid "%s" value: %s '
+                                   % (notvalidprofiles, u'/'.join(validprofiles),
+                                      self.value),
+                                   token = self.__nametoken,
+                                   neverraise=True)
+                    valid = False
+
+                elif valid:
+                    self._log.debug(u'Property: Found valid "%s" value: %s'
+                                   % (u'/'.join(validprofiles), self.value),
+                                   token = self.__nametoken,
+                                   neverraise=True)
+
+        if self._priority not in (u'', u'important'):
+            valid = False
+
+        return valid
+
+    valid = property(validate, doc=u"Check if value of this property is valid "
+                                   u"in the properties context.")
+
+
+    @Deprecated(u'Use ``property.propertyValue`` instead.')
+    def _getCSSValue(self):
+        return self.propertyValue
+
+    @Deprecated(u'Use ``property.propertyValue`` instead.')
+    def _setCSSValue(self, cssText):
+        self._setPropertyValue(cssText)
+
+    cssValue = property(_getCSSValue, _setCSSValue,
+                   doc="(DEPRECATED) Use ``property.propertyValue`` instead.")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvalue.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvalue.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvalue.py	(revision 1126)
@@ -0,0 +1,1251 @@
+"""CSSValue related classes
+
+- CSSValue implements DOM Level 2 CSS CSSValue
+- CSSPrimitiveValue implements DOM Level 2 CSS CSSPrimitiveValue
+- CSSValueList implements DOM Level 2 CSS CSSValueList
+
+"""
+__all__ = ['CSSValue', 'CSSPrimitiveValue', 'CSSValueList', 'RGBColor',
+           'CSSVariable']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.prodparser import *
+import cssutils
+import cssutils.helper
+import math
+import re
+import xml.dom
+
+
+class CSSValue(cssutils.util._NewBase):
+    """The CSSValue interface represents a simple or a complex value.
+    A CSSValue object only occurs in a context of a CSS property.
+    """
+
+    # The value is inherited and the cssText contains "inherit".
+    CSS_INHERIT = 0
+    # The value is a CSSPrimitiveValue.
+    CSS_PRIMITIVE_VALUE = 1
+    # The value is a CSSValueList.
+    CSS_VALUE_LIST = 2
+    # The value is a custom value.
+    CSS_CUSTOM = 3
+    # The value is a CSSVariable.
+    CSS_VARIABLE = 4
+
+    _typestrings = {0: 'CSS_INHERIT' ,
+                    1: 'CSS_PRIMITIVE_VALUE',
+                    2: 'CSS_VALUE_LIST',
+                    3: 'CSS_CUSTOM',
+                    4: 'CSS_VARIABLE'}
+
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        """
+        :param cssText:
+            the parsable cssText of the value
+        :param readonly:
+            defaults to False
+        """
+        super(CSSValue, self).__init__()
+
+        self._cssValueType = None
+        self.wellformed = False
+        self.parent = parent
+        if cssText is not None: # may be 0
+            if isinstance(cssText, int):
+                cssText = unicode(cssText) # if it is an integer
+            elif isinstance(cssText, float):
+                cssText = u'%f' % cssText # if it is a floating point number
+
+            self.cssText = cssText
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(%r)" % (self.__class__.__name__,
+                                         self.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object cssValueTypeString=%r cssText=%r at "\
+               u"0x%x>" % (self.__class__.__name__,
+                           self.cssValueTypeString,
+                           self.cssText,
+                           id(self))
+
+    def _setCssText(self, cssText):
+        """
+        Format::
+
+            unary_operator
+              : '-' | '+'
+              ;
+            operator
+              : '/' S* | ',' S* | /* empty */
+              ;
+            expr
+              : term [ operator term ]*
+              ;
+            term
+              : unary_operator?
+                [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* |
+                  ANGLE S* | TIME S* | FREQ S* ]
+              | STRING S* | IDENT S* | URI S* | hexcolor | function
+              | UNICODE-RANGE S*
+              ;
+            function
+              : FUNCTION S* expr ')' S*
+              ;
+            /*
+             * There is a constraint on the color that it must
+             * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F])
+             * after the "#"; e.g., "#000" is OK, but "#abcd" is not.
+             */
+            hexcolor
+              : HASH S*
+              ;
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error
+              (according to the attached property) or is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              TODO: Raised if the specified CSS string value represents a
+              different type of values than the values allowed by the CSS
+              property.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this value is readonly.
+        """
+        self._checkReadonly()
+
+        # used as operator is , / or S
+        nextSor = u',/'
+
+        term = Choice(Sequence(PreDef.unary(),
+                               Choice(PreDef.number(nextSor=nextSor),
+                                      PreDef.percentage(nextSor=nextSor),
+                                      PreDef.dimension(nextSor=nextSor))),
+                      PreDef.string(nextSor=nextSor),
+                      PreDef.ident(nextSor=nextSor),
+                      PreDef.uri(nextSor=nextSor),
+                      PreDef.hexcolor(nextSor=nextSor),
+                      PreDef.unicode_range(nextSor=nextSor),
+                      # special case IE only expression
+                      Prod(name='expression',
+                           match=lambda t, v: t == self._prods.FUNCTION and (
+                              cssutils.helper.normalize(v) in (u'expression(',
+                                                               u'alpha(',
+                                                               u'blur(',
+                                                               u'chroma(',
+                                                               u'dropshadow(',
+                                                               u'fliph(',
+                                                               u'flipv(',
+                                                               u'glow(',
+                                                               u'gray(',
+                                                               u'invert(',
+                                                               u'mask(',
+                                                               u'shadow(',
+                                                               u'wave(',
+                                                               u'xray(') or
+                              v.startswith(u'progid:DXImageTransform.Microsoft.')
+                           ),
+                           nextSor=nextSor,
+                           toSeq=lambda t, tokens: (ExpressionValue._functionName,
+                                                    ExpressionValue(
+                                            cssutils.helper.pushtoken(t, tokens),
+                                            parent=self)
+                                                    )
+                      ),
+                      # CSS Variable var(
+                      PreDef.variable(nextSor=nextSor,
+                                      toSeq=lambda t, tokens: ('CSSVariable',
+                                                               CSSVariable(
+                                        cssutils.helper.pushtoken(t, tokens),
+                                        parent=self)
+                                                               )
+                      ),
+                      # calc(
+                      PreDef.calc(nextSor=nextSor,
+                                  toSeq=lambda t, tokens: (CalcValue._functionName,
+                                                           CalcValue(
+                                        cssutils.helper.pushtoken(t, tokens),
+                                        parent=self)
+                                                           )
+                      ),
+# TODO:
+#                      # rgb/rgba(
+#                      Prod(name='RGBColor',
+#                           match=lambda t, v: t == self._prods.FUNCTION and (
+#                              cssutils.helper.normalize(v) in (u'rgb(',
+#                                                               u'rgba('
+#                                                               )
+#                           ),
+#                           nextSor=nextSor,
+#                                  toSeq=lambda t, tokens: (RGBColor._functionName,
+#                                                           RGBColor(
+#                                        cssutils.helper.pushtoken(t, tokens),
+#                                        parent=self)
+#                                                           )
+#                      ),
+                      # other functions like rgb( etc
+                      PreDef.function(nextSor=nextSor,
+                                      toSeq=lambda t, tokens: ('FUNCTION',
+                                                               CSSFunction(
+                                        cssutils.helper.pushtoken(t, tokens),
+                                        parent=self)
+                                                               )
+                      )
+        )
+        operator = Choice(PreDef.S(),
+                          PreDef.char('comma', ',',
+                                      toSeq=lambda t, tokens: ('operator', t[1])),
+                          PreDef.char('slash', '/',
+                                      toSeq=lambda t, tokens: ('operator', t[1])),
+                          optional=True)
+        # CSSValue PRODUCTIONS
+        valueprods = Sequence(term,
+                              Sequence(operator, # mayEnd this Sequence if whitespace
+
+                                       # TODO: only when setting via other class
+                                       # used by variabledeclaration currently
+                                       PreDef.char('END', ';',
+                                                   stopAndKeep=True,
+                                                   optional=True),
+
+                                       term,
+                                       minmax=lambda: (0, None)))
+        # parse
+        wellformed, seq, store, notused = ProdParser().parse(cssText,
+                                                             u'CSSValue',
+                                                             valueprods,
+                                                             keepS=True)
+        if wellformed:
+            # - count actual values and set firstvalue which is used later on
+            # - combine comma separated list, e.g. font-family to a single item
+            # - remove S which should be an operator but is no needed
+            count, firstvalue = 0, ()
+            newseq = self._tempSeq()
+            i, end = 0, len(seq)
+            while i < end:
+                item = seq[i]
+                if item.type == self._prods.S:
+                    pass
+
+                elif (item.value, item.type) == (u',', 'operator'):
+                    # , separared counts as a single STRING for now
+                    # URI or STRING value might be a single CHAR too!
+                    newseq.appendItem(item)
+                    count -= 1
+                    if firstvalue:
+                        # list of IDENTs is handled as STRING!
+                        if firstvalue[1] == self._prods.IDENT:
+                            firstvalue = firstvalue[0], 'STRING'
+
+                elif item.value == u'/':
+                    # / separated items count as one
+                    newseq.appendItem(item)
+
+                elif item.value == u'-' or item.value == u'+':
+                    # combine +- and following number or other
+                    i += 1
+                    try:
+                        next = seq[i]
+                    except IndexError:
+                        firstvalue = () # raised later
+                        break
+
+                    newval = item.value + next.value
+                    newseq.append(newval, next.type,
+                                  item.line, item.col)
+                    if not firstvalue:
+                        firstvalue = (newval, next.type)
+                    count += 1
+
+                elif item.type != cssutils.css.CSSComment:
+                    newseq.appendItem(item)
+                    if not firstvalue:
+                        firstvalue = (item.value, item.type)
+                    count += 1
+
+                else:
+                    newseq.appendItem(item)
+
+                i += 1
+
+            if not firstvalue:
+                self._log.error(
+                        u'CSSValue: Unknown syntax or no value: %r.' %
+                        self._valuestr(cssText))
+            else:
+                # ok and set
+                self._setSeq(newseq)
+                self.wellformed = wellformed
+
+                if hasattr(self, '_value'):
+                    # only in case of CSSPrimitiveValue, else remove!
+                    del self._value
+
+                if count == 1:
+                    # inherit, primitive or variable
+                    if isinstance(firstvalue[0], basestring) and\
+                       u'inherit' == cssutils.helper.normalize(firstvalue[0]):
+                        self.__class__ = CSSValue
+                        self._cssValueType = CSSValue.CSS_INHERIT
+                    elif 'CSSVariable' == firstvalue[1]:
+                        self.__class__ = CSSVariable
+                        self._value = firstvalue
+                        # TODO: remove major hack!
+                        self._name = firstvalue[0]._name
+                    else:
+                        self.__class__ = CSSPrimitiveValue
+                        self._value = firstvalue
+
+                elif count > 1:
+                    # valuelist
+                    self.__class__ = CSSValueList
+
+                    # change items in list to specific type (primitive etc)
+                    newseq = self._tempSeq()
+                    commalist = []
+                    nexttocommalist = False
+
+                    def itemValue(item):
+                        "Reserialized simple item.value"
+                        if self._prods.STRING == item.type:
+                            return cssutils.helper.string(item.value)
+                        elif self._prods.URI == item.type:
+                            return cssutils.helper.uri(item.value)
+                        elif self._prods.FUNCTION == item.type or\
+                             'CSSVariable' == item.type:
+                            return item.value.cssText
+                        else:
+                            return item.value
+
+                    def saveifcommalist(commalist, newseq):
+                        """
+                        saves items in commalist to seq and items
+                        if anything in there
+                        """
+                        if commalist:
+                            newseq.replace(-1,
+                                           CSSPrimitiveValue(cssText=u''.join(
+                                                    commalist)),
+                                           CSSPrimitiveValue,
+                                           newseq[-1].line,
+                                           newseq[-1].col)
+                            del commalist[:]
+
+                    for i, item in enumerate(self._seq):
+                        if issubclass(type(item.value), CSSValue):
+                            # set parent of CSSValueList items to the lists
+                            # parent
+                            item.value.parent = self.parent
+
+                        if item.type in (self._prods.DIMENSION,
+                                         self._prods.FUNCTION,
+                                         self._prods.HASH,
+                                         self._prods.IDENT,
+                                         self._prods.NUMBER,
+                                         self._prods.PERCENTAGE,
+                                         self._prods.STRING,
+                                         self._prods.URI,
+                                         self._prods.UNICODE_RANGE,
+                                         'CSSVariable'):
+                            if nexttocommalist:
+                                # wait until complete
+                                commalist.append(itemValue(item))
+                            else:
+                                saveifcommalist(commalist, newseq)
+                                # append new item
+                                if hasattr(item.value, 'cssText'):
+                                    newseq.append(item.value,
+                                                  item.value.__class__,
+                                                  item.line, item.col)
+
+                                else:
+                                    newseq.append(CSSPrimitiveValue(
+                                                        itemValue(item)),
+                                                  CSSPrimitiveValue,
+                                                  item.line, item.col)
+
+                            nexttocommalist = False
+
+                        elif u',' == item.value:
+                            if not commalist:
+                                # save last item to commalist
+                                commalist.append(itemValue(self._seq[i - 1]))
+                            commalist.append(u',')
+                            nexttocommalist = True
+
+                        else:
+                            if nexttocommalist:
+                                commalist.append(item.value.cssText)
+                            else:
+                                newseq.appendItem(item)
+
+                    saveifcommalist(commalist, newseq)
+                    self._setSeq(newseq)
+
+                else:
+                    # should not happen...
+                    self.__class__ = CSSValue
+                    self._cssValueType = CSSValue.CSS_CUSTOM
+
+    cssText = property(lambda self: cssutils.ser.do_css_CSSValue(self),
+                       _setCssText,
+                       doc="A string representation of the current value.")
+
+    cssValueType = property(lambda self: self._cssValueType,
+        doc="A (readonly) code defining the type of the value.")
+
+    cssValueTypeString = property(
+        lambda self: CSSValue._typestrings.get(self.cssValueType, None),
+        doc="(readonly) Name of cssValueType.")
+
+
+class CSSPrimitiveValue(CSSValue):
+    """Represents a single CSS Value.  May be used to determine the value of a
+    specific style property currently set in a block or to set a specific
+    style property explicitly within the block. Might be obtained from the
+    getPropertyCSSValue method of CSSStyleDeclaration.
+
+    Conversions are allowed between absolute values (from millimeters to
+    centimeters, from degrees to radians, and so on) but not between
+    relative values. (For example, a pixel value cannot be converted to a
+    centimeter value.) Percentage values can't be converted since they are
+    relative to the parent value (or another property value). There is one
+    exception for color percentage values: since a color percentage value
+    is relative to the range 0-255, a color percentage value can be
+    converted to a number; (see also the RGBColor interface).
+    """
+    # constant: type of this CSSValue class
+    cssValueType = CSSValue.CSS_PRIMITIVE_VALUE
+
+    __types = cssutils.cssproductions.CSSProductions
+
+    # An integer indicating which type of unit applies to the value.
+    CSS_UNKNOWN = 0 # only obtainable via cssText
+    CSS_NUMBER = 1
+    CSS_PERCENTAGE = 2
+    CSS_EMS = 3
+    CSS_EXS = 4
+    CSS_PX = 5
+    CSS_CM = 6
+    CSS_MM = 7
+    CSS_IN = 8
+    CSS_PT = 9
+    CSS_PC = 10
+    CSS_DEG = 11
+    CSS_RAD = 12
+    CSS_GRAD = 13
+    CSS_MS = 14
+    CSS_S = 15
+    CSS_HZ = 16
+    CSS_KHZ = 17
+    CSS_DIMENSION = 18
+    CSS_STRING = 19
+    CSS_URI = 20
+    CSS_IDENT = 21
+    CSS_ATTR = 22
+    CSS_COUNTER = 23
+    CSS_RECT = 24
+    CSS_RGBCOLOR = 25
+    # NOT OFFICIAL:
+    CSS_RGBACOLOR = 26
+    CSS_UNICODE_RANGE = 27
+
+    _floattypes = (CSS_NUMBER, CSS_PERCENTAGE, CSS_EMS, CSS_EXS,
+                   CSS_PX, CSS_CM, CSS_MM, CSS_IN, CSS_PT, CSS_PC,
+                   CSS_DEG, CSS_RAD, CSS_GRAD, CSS_MS, CSS_S,
+                   CSS_HZ, CSS_KHZ, CSS_DIMENSION)
+    _stringtypes = (CSS_ATTR, CSS_IDENT, CSS_STRING, CSS_URI)
+    _countertypes = (CSS_COUNTER,)
+    _recttypes = (CSS_RECT,)
+    _rbgtypes = (CSS_RGBCOLOR, CSS_RGBACOLOR)
+    _lengthtypes = (CSS_NUMBER, CSS_EMS, CSS_EXS,
+                    CSS_PX, CSS_CM, CSS_MM, CSS_IN, CSS_PT, CSS_PC)
+
+    # oldtype: newType: converterfunc
+    _converter = {
+        # cm <-> mm <-> in, 1 inch is equal to 2.54 centimeters.
+        # pt <-> pc, the points used by CSS 2.1 are equal to 1/72nd of an inch.
+        # pc: picas - 1 pica is equal to 12 points
+        (CSS_CM, CSS_MM): lambda x: x * 10,
+        (CSS_MM, CSS_CM): lambda x: x / 10,
+
+        (CSS_PT, CSS_PC): lambda x: x * 12,
+        (CSS_PC, CSS_PT): lambda x: x / 12,
+
+        (CSS_CM, CSS_IN): lambda x: x / 2.54,
+        (CSS_IN, CSS_CM): lambda x: x * 2.54,
+        (CSS_MM, CSS_IN): lambda x: x / 25.4,
+        (CSS_IN, CSS_MM): lambda x: x * 25.4,
+
+        (CSS_IN, CSS_PT): lambda x: x / 72,
+        (CSS_PT, CSS_IN): lambda x: x * 72,
+        (CSS_CM, CSS_PT): lambda x: x / 2.54 / 72,
+        (CSS_PT, CSS_CM): lambda x: x * 72 * 2.54,
+        (CSS_MM, CSS_PT): lambda x: x / 25.4 / 72,
+        (CSS_PT, CSS_MM): lambda x: x * 72 * 25.4,
+
+        (CSS_IN, CSS_PC): lambda x: x / 72 / 12,
+        (CSS_PC, CSS_IN): lambda x: x * 12 * 72,
+        (CSS_CM, CSS_PC): lambda x: x / 2.54 / 72 / 12,
+        (CSS_PC, CSS_CM): lambda x: x * 12 * 72 * 2.54,
+        (CSS_MM, CSS_PC): lambda x: x / 25.4 / 72 / 12,
+        (CSS_PC, CSS_MM): lambda x: x * 12 * 72 * 25.4,
+
+        # hz <-> khz
+        (CSS_KHZ, CSS_HZ): lambda x: x * 1000,
+        (CSS_HZ, CSS_KHZ): lambda x: x / 1000,
+        # s <-> ms
+        (CSS_S, CSS_MS): lambda x: x * 1000,
+        (CSS_MS, CSS_S): lambda x: x / 1000,
+
+        (CSS_RAD, CSS_DEG): lambda x: math.degrees(x),
+        (CSS_DEG, CSS_RAD): lambda x: math.radians(x),
+        # TODO: convert grad <-> deg or rad
+        #(CSS_RAD, CSS_GRAD): lambda x: math.degrees(x),
+        #(CSS_DEG, CSS_GRAD): lambda x: math.radians(x),
+        #(CSS_GRAD, CSS_RAD): lambda x: math.radians(x),
+        #(CSS_GRAD, CSS_DEG): lambda x: math.radians(x)
+    }
+
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        """See CSSPrimitiveValue.__init__()"""
+        super(CSSPrimitiveValue, self).__init__(cssText=cssText,
+                                                parent=parent,
+                                                readonly=readonly)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object primitiveType=%s cssText=%r at 0x%x>"\
+               % (self.__class__.__name__,
+                  self.primitiveTypeString,
+                  self.cssText,
+                  id(self))
+
+    _unitnames = ['CSS_UNKNOWN',
+                  'CSS_NUMBER', 'CSS_PERCENTAGE',
+                  'CSS_EMS', 'CSS_EXS',
+                  'CSS_PX',
+                  'CSS_CM', 'CSS_MM',
+                  'CSS_IN',
+                  'CSS_PT', 'CSS_PC',
+                  'CSS_DEG', 'CSS_RAD', 'CSS_GRAD',
+                  'CSS_MS', 'CSS_S',
+                  'CSS_HZ', 'CSS_KHZ',
+                  'CSS_DIMENSION',
+                  'CSS_STRING', 'CSS_URI', 'CSS_IDENT',
+                  'CSS_ATTR', 'CSS_COUNTER', 'CSS_RECT',
+                  'CSS_RGBCOLOR', 'CSS_RGBACOLOR',
+                  'CSS_UNICODE_RANGE'
+                  ]
+
+    _reNumDim = re.compile(ur'([+-]?\d*\.\d+|[+-]?\d+)(.*)$', re.I | re.U | re.X)
+
+    def _unitDIMENSION(value):
+        """Check val for dimension name."""
+        units = {'em': 'CSS_EMS', 'ex': 'CSS_EXS',
+                 'px': 'CSS_PX',
+                 'cm': 'CSS_CM', 'mm': 'CSS_MM',
+                 'in': 'CSS_IN',
+                 'pt': 'CSS_PT', 'pc': 'CSS_PC',
+                 'deg': 'CSS_DEG', 'rad': 'CSS_RAD', 'grad': 'CSS_GRAD',
+                 'ms': 'CSS_MS', 's': 'CSS_S',
+                 'hz': 'CSS_HZ', 'khz': 'CSS_KHZ'
+                 }
+        val, dim = CSSPrimitiveValue._reNumDim.findall(cssutils.helper.normalize(value))[0]
+        return units.get(dim, 'CSS_DIMENSION')
+
+    def _unitFUNCTION(value):
+        """Check val for function name."""
+        units = {'attr(': 'CSS_ATTR',
+                 'counter(': 'CSS_COUNTER',
+                 'rect(': 'CSS_RECT',
+                 'rgb(': 'CSS_RGBCOLOR',
+                 'rgba(': 'CSS_RGBACOLOR',
+                 }
+        return units.get(re.findall(ur'^(.*?\()',
+                                    cssutils.helper.normalize(value.cssText),
+                                    re.U)[0],
+                         'CSS_UNKNOWN')
+
+    __unitbytype = {
+        __types.NUMBER: 'CSS_NUMBER',
+        __types.PERCENTAGE: 'CSS_PERCENTAGE',
+        __types.STRING: 'CSS_STRING',
+        __types.UNICODE_RANGE: 'CSS_UNICODE_RANGE',
+        __types.URI: 'CSS_URI',
+        __types.IDENT: 'CSS_IDENT',
+        __types.HASH: 'CSS_RGBCOLOR',
+        __types.DIMENSION: _unitDIMENSION,
+        __types.FUNCTION: _unitFUNCTION
+        }
+
+    def __set_primitiveType(self):
+        """primitiveType is readonly but is set lazy if accessed"""
+        # TODO: check unary and font-family STRING a, b, "c"
+        val, type_ = self._value
+        # try get by type_
+        pt = self.__unitbytype.get(type_, 'CSS_UNKNOWN')
+        if callable(pt):
+            # multiple options, check value too
+            pt = pt(val)
+        self._primitiveType = getattr(self, pt)
+
+    def _getPrimitiveType(self):
+        if not hasattr(self, '_primitivetype'):
+            self.__set_primitiveType()
+        return self._primitiveType
+
+    primitiveType = property(_getPrimitiveType,
+                             doc="(readonly) The type of the value as defined "
+                                 "by the constants in this class.")
+
+    def _getPrimitiveTypeString(self):
+        return self._unitnames[self.primitiveType]
+
+    primitiveTypeString = property(_getPrimitiveTypeString,
+                                   doc="Name of primitive type of this value.")
+
+    def _getCSSPrimitiveTypeString(self, type):
+        "get TypeString by given type which may be unknown, used by setters"
+        try:
+            return self._unitnames[type]
+        except (IndexError, TypeError):
+            return u'%r (UNKNOWN TYPE)' % type
+
+    def _getNumDim(self, value=None):
+        "Split self._value in numerical and dimension part."
+        if value is None:
+            value = cssutils.helper.normalize(self._value[0])
+
+        try:
+            val, dim = CSSPrimitiveValue._reNumDim.findall(value)[0]
+        except IndexError:
+            val, dim = value, u''
+        try:
+            val = float(val)
+            if val == int(val):
+                val = int(val)
+        except ValueError:
+            raise xml.dom.InvalidAccessErr(
+                u'CSSPrimitiveValue: No float value %r' % self._value[0])
+
+        return val, dim
+
+    def getFloatValue(self, unitType=None):
+        """(DOM) This method is used to get a float value in a
+        specified unit. If this CSS value doesn't contain a float value
+        or can't be converted into the specified unit, a DOMException
+        is raised.
+
+        :param unitType:
+            to get the float value. The unit code can only be a float unit type
+            (i.e. CSS_NUMBER, CSS_PERCENTAGE, CSS_EMS, CSS_EXS, CSS_PX, CSS_CM,
+            CSS_MM, CSS_IN, CSS_PT, CSS_PC, CSS_DEG, CSS_RAD, CSS_GRAD, CSS_MS,
+            CSS_S, CSS_HZ, CSS_KHZ, CSS_DIMENSION) or None in which case
+            the current dimension is used.
+
+        :returns:
+            not necessarily a float but some cases just an integer
+            e.g. if the value is ``1px`` it return ``1`` and **not** ``1.0``
+
+            Conversions might return strange values like 1.000000000001
+        """
+        if unitType is not None and unitType not in self._floattypes:
+            raise xml.dom.InvalidAccessErr(
+                u'unitType Parameter is not a float type')
+
+        val, dim = self._getNumDim()
+
+        if unitType is not None and self.primitiveType != unitType:
+            # convert if needed
+            try:
+                val = self._converter[self.primitiveType, unitType](val)
+            except KeyError:
+                raise xml.dom.InvalidAccessErr(
+                u'CSSPrimitiveValue: Cannot coerce primitiveType %r to %r'
+                % (self.primitiveTypeString,
+                   self._getCSSPrimitiveTypeString(unitType)))
+
+        if val == int(val):
+            val = int(val)
+
+        return val
+
+    def setFloatValue(self, unitType, floatValue):
+        """(DOM) A method to set the float value with a specified unit.
+        If the property attached with this value can not accept the
+        specified unit or the float value, the value will be unchanged and
+        a DOMException will be raised.
+
+        :param unitType:
+            a unit code as defined above. The unit code can only be a float
+            unit type
+        :param floatValue:
+            the new float value which does not have to be a float value but
+            may simple be an int e.g. if setting::
+
+                setFloatValue(CSS_PX, 1)
+
+        :exceptions:
+            - :exc:`~xml.dom.InvalidAccessErr`:
+              Raised if the attached property doesn't
+              support the float value or the unit type.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this property is readonly.
+        """
+        self._checkReadonly()
+        if unitType not in self._floattypes:
+            raise xml.dom.InvalidAccessErr(
+               u'CSSPrimitiveValue: unitType %r is not a float type' %
+               self._getCSSPrimitiveTypeString(unitType))
+        try:
+            val = float(floatValue)
+        except ValueError, e:
+            raise xml.dom.InvalidAccessErr(
+               u'CSSPrimitiveValue: floatValue %r is not a float' %
+               floatValue)
+
+        oldval, dim = self._getNumDim()
+        if self.primitiveType != unitType:
+            # convert if possible
+            try:
+                val = self._converter[unitType, self.primitiveType](val)
+            except KeyError:
+                raise xml.dom.InvalidAccessErr(
+                u'CSSPrimitiveValue: Cannot coerce primitiveType %r to %r'
+                % (self.primitiveTypeString,
+                   self._getCSSPrimitiveTypeString(unitType)))
+
+        if val == int(val):
+            val = int(val)
+
+        self.cssText = '%s%s' % (val, dim)
+
+    def getStringValue(self):
+        """(DOM) This method is used to get the string value. If the
+        CSS value doesn't contain a string value, a DOMException is raised.
+
+        Some properties (like 'font-family' or 'voice-family')
+        convert a whitespace separated list of idents to a string.
+
+        Only the actual value is returned so e.g. all the following return the
+        actual value ``a``: url(a), attr(a), "a", 'a'
+        """
+        if self.primitiveType not in self._stringtypes:
+            raise xml.dom.InvalidAccessErr(
+                u'CSSPrimitiveValue %r is not a string type'
+                % self.primitiveTypeString)
+
+        if CSSPrimitiveValue.CSS_ATTR == self.primitiveType:
+            return self._value[0].cssText[5:-1]
+        else:
+            return self._value[0]
+
+    def setStringValue(self, stringType, stringValue):
+        """(DOM) A method to set the string value with the specified
+        unit. If the property attached to this value can't accept the
+        specified unit or the string value, the value will be unchanged and
+        a DOMException will be raised.
+
+        :param stringType:
+            a string code as defined above. The string code can only be a
+            string unit type (i.e. CSS_STRING, CSS_URI, CSS_IDENT, and
+            CSS_ATTR).
+        :param stringValue:
+            the new string value
+            Only the actual value is expected so for (CSS_URI, "a") the
+            new value will be ``url(a)``. For (CSS_STRING, "'a'")
+            the new value will be ``"\\'a\\'"`` as the surrounding ``'`` are
+            not part of the string value
+
+        :exceptions:
+            - :exc:`~xml.dom.InvalidAccessErr`:
+              Raised if the CSS value doesn't contain a
+              string value or if the string value can't be converted into
+              the specified unit.
+
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this property is readonly.
+        """
+        self._checkReadonly()
+        # self not stringType
+        if self.primitiveType not in self._stringtypes:
+            raise xml.dom.InvalidAccessErr(
+                u'CSSPrimitiveValue %r is not a string type'
+                % self.primitiveTypeString)
+        # given stringType is no StringType
+        if stringType not in self._stringtypes:
+            raise xml.dom.InvalidAccessErr(
+                u'CSSPrimitiveValue: stringType %s is not a string type'
+                % self._getCSSPrimitiveTypeString(stringType))
+
+        if self._primitiveType != stringType:
+            raise xml.dom.InvalidAccessErr(
+                u'CSSPrimitiveValue: Cannot coerce primitiveType %r to %r'
+                % (self.primitiveTypeString,
+                   self._getCSSPrimitiveTypeString(stringType)))
+
+        if CSSPrimitiveValue.CSS_STRING == self._primitiveType:
+            self.cssText = cssutils.helper.string(stringValue)
+        elif CSSPrimitiveValue.CSS_URI == self._primitiveType:
+            self.cssText = cssutils.helper.uri(stringValue)
+        elif CSSPrimitiveValue.CSS_ATTR == self._primitiveType:
+            self.cssText = u'attr(%s)' % stringValue
+        else:
+            self.cssText = stringValue
+        self._primitiveType = stringType
+
+    def getCounterValue(self):
+        """(DOM) This method is used to get the Counter value. If
+        this CSS value doesn't contain a counter value, a DOMException
+        is raised. Modification to the corresponding style property
+        can be achieved using the Counter interface.
+
+        **Not implemented.**
+        """
+        if not self.CSS_COUNTER == self.primitiveType:
+            raise xml.dom.InvalidAccessErr(u'Value is not a counter type')
+        # TODO: use Counter class
+        raise NotImplementedError()
+
+    def getRGBColorValue(self):
+        """(DOM) This method is used to get the RGB color. If this
+        CSS value doesn't contain a RGB color value, a DOMException
+        is raised. Modification to the corresponding style property
+        can be achieved using the RGBColor interface.
+        """
+        if self.primitiveType not in self._rbgtypes:
+            raise xml.dom.InvalidAccessErr(u'Value is not a RGBColor value')
+        return RGBColor(self._value[0])
+
+    def getRectValue(self):
+        """(DOM) This method is used to get the Rect value. If this CSS
+        value doesn't contain a rect value, a DOMException is raised.
+        Modification to the corresponding style property can be achieved
+        using the Rect interface.
+
+        **Not implemented.**
+        """
+        if self.primitiveType not in self._recttypes:
+            raise xml.dom.InvalidAccessErr(u'value is not a Rect value')
+        # TODO: use Rect class
+        raise NotImplementedError()
+
+    def _getCssText(self):
+        """Overwrites CSSValue."""
+        return cssutils.ser.do_css_CSSPrimitiveValue(self)
+
+    def _setCssText(self, cssText):
+        """Use CSSValue."""
+        return super(CSSPrimitiveValue, self)._setCssText(cssText)
+
+    cssText = property(_getCssText, _setCssText,
+        doc="A string representation of the current value.")
+
+
+class CSSValueList(CSSValue):
+    """The CSSValueList interface provides the abstraction of an ordered
+    collection of CSS values.
+
+    Some properties allow an empty list into their syntax. In that case,
+    these properties take the none identifier. So, an empty list means
+    that the property has the value none.
+
+    The items in the CSSValueList are accessible via an integral index,
+    starting from 0.
+    """
+    cssValueType = CSSValue.CSS_VALUE_LIST
+
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        """Init a new CSSValueList"""
+        super(CSSValueList, self).__init__(cssText=cssText,
+                                           parent=parent,
+                                           readonly=readonly)
+        self._items = []
+
+    def __iter__(self):
+        "CSSValueList is iterable."
+        for item in self.__items():
+            yield item.value
+
+    def __str__(self):
+        return u"<cssutils.css.%s object cssValueType=%r cssText=%r length=%r "\
+               u"at 0x%x>" % (self.__class__.__name__,
+                              self.cssValueTypeString,
+                              self.cssText,
+                              self.length,
+                              id(self))
+
+    def __items(self):
+        return [item for item in self._seq
+                    if isinstance(item.value, CSSValue)]
+
+    def item(self, index):
+        """(DOM) Retrieve a CSSValue by ordinal `index`. The
+        order in this collection represents the order of the values in the
+        CSS style property. If `index` is greater than or equal to the number
+        of values in the list, this returns ``None``.
+        """
+        try:
+            return self.__items()[index].value
+        except IndexError:
+            return None
+
+    length = property(lambda self: len(self.__items()),
+                      doc=u"(DOM attribute) The number of CSSValues in the "
+                          u"list.")
+
+
+class CSSFunction(CSSPrimitiveValue):
+    """A CSS function value like rect() etc."""
+    _functionName = u'CSSFunction'
+    primitiveType = CSSPrimitiveValue.CSS_UNKNOWN
+
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        """
+        Init a new CSSFunction
+
+        :param cssText:
+            the parsable cssText of the value
+        :param readonly:
+            defaults to False
+        """
+        super(CSSFunction, self).__init__(parent=parent)
+        self._funcType = None
+        self.valid = False
+        self.wellformed = False
+        if cssText is not None:
+            self.cssText = cssText
+        self._readonly = readonly
+
+    def _productiondefinition(self):
+        """Return definition used for parsing."""
+        types = self._prods # rename!
+
+        value = Sequence(PreDef.unary(),
+                         Prod(name='PrimitiveValue',
+                              match=lambda t, v: t in (types.DIMENSION,
+                                                       types.HASH,
+                                                       types.IDENT,
+                                                       types.NUMBER,
+                                                       types.PERCENTAGE,
+                                                       types.STRING),
+                              toSeq=lambda t, tokens: (t[0],
+                                                       CSSPrimitiveValue(t[1]))
+                         )
+                )
+        valueOrFunc = Choice(value,
+                             # FUNC is actually not in spec but used in e.g. Prince
+                             PreDef.function(toSeq=lambda t,
+                                                          tokens: ('FUNCTION',
+                                                                   CSSFunction(
+                                                                   cssutils.helper.pushtoken(t, tokens))
+                                                                   )
+                             )
+                      )
+        funcProds = Sequence(Prod(name='FUNC',
+                                  match=lambda t, v: t == types.FUNCTION,
+                                  toSeq=lambda t, tokens: (t[0], cssutils.helper.normalize(t[1]))),
+                             Choice(Sequence(valueOrFunc,
+                                             # more values starting with Comma
+                                             # should use store where colorType is saved to
+                                             # define min and may, closure?
+                                             Sequence(PreDef.comma(),
+                                                      valueOrFunc,
+                                                      minmax=lambda: (0, None)),
+                                             PreDef.funcEnd(stop=True)),
+                                    PreDef.funcEnd(stop=True))
+         )
+        return funcProds
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+        # store: colorType, parts
+        wellformed, seq, store, unusedtokens = ProdParser().parse(cssText,
+                                                                  self._functionName,
+                                                                  self._productiondefinition(),
+                                                                  keepS=True)
+        if wellformed:
+            # combine +/- and following CSSPrimitiveValue, remove S
+            newseq = self._tempSeq()
+            i, end = 0, len(seq)
+            while i < end:
+                item = seq[i]
+                if item.type == self._prods.S:
+                    pass
+                elif item.value == u'+' or item.value == u'-':
+                    i += 1
+                    next = seq[i]
+                    newval = next.value
+                    if isinstance(newval, CSSPrimitiveValue):
+                        newval.setFloatValue(newval.primitiveType,
+                                             float(item.value + str(newval.getFloatValue())))
+                        newseq.append(newval, next.type,
+                                      item.line, item.col)
+                    else:
+                        # expressions only?
+                        newseq.appendItem(item)
+                        newseq.appendItem(next)
+                else:
+                    newseq.appendItem(item)
+
+                i += 1
+
+            self.wellformed = True
+            self._setSeq(newseq)
+            self._funcType = newseq[0].value
+
+    cssText = property(lambda self: cssutils.ser.do_css_FunctionValue(self),
+                       _setCssText)
+
+    funcType = property(lambda self: self._funcType)
+
+
+class RGBColor(CSSFunction):
+    """A CSS color like RGB, RGBA or a simple value like `#000` or `red`."""
+
+    _functionName = u'Function rgb()'
+
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        """
+        Init a new RGBColor
+
+        :param cssText:
+            the parsable cssText of the value
+        :param readonly:
+            defaults to False
+        """
+        super(CSSFunction, self).__init__(parent=parent)
+        self._colorType = None
+        self.valid = False
+        self.wellformed = False
+        if cssText is not None:
+            try:
+                # if it is a Function object
+                cssText = cssText.cssText
+            except AttributeError:
+                pass
+            self.cssText = cssText
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(%r)" % (self.__class__.__name__,
+                                         self.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object colorType=%r cssText=%r at 0x%x>" % (
+                self.__class__.__name__,
+                self.colorType,
+                self.cssText,
+                id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+        types = self._prods # rename!
+        valueProd = Prod(name='value',
+                     match=lambda t, v: t in (types.NUMBER, types.PERCENTAGE),
+                     toSeq=lambda t, v: (CSSPrimitiveValue, CSSPrimitiveValue(v)),
+                     toStore='parts'
+                     )
+        # COLOR PRODUCTION
+        funccolor = Sequence(Prod(name='FUNC',
+                                  match=lambda t, v: t == types.FUNCTION and cssutils.helper.normalize(v) in ('rgb(', 'rgba(', 'hsl(', 'hsla('),
+                                  toSeq=lambda t, v: (t, v),#cssutils.helper.normalize(v)),
+                                  toStore='colorType'),
+                                  PreDef.unary(),
+                                  valueProd,
+                              # 2 or 3 more values starting with Comma
+                             Sequence(PreDef.comma(),
+                                      PreDef.unary(),
+                                      valueProd,
+                                      minmax=lambda: (2, 3)),
+                             PreDef.funcEnd()
+                            )
+        colorprods = Choice(funccolor,
+                            PreDef.hexcolor('colorType'),
+                            Prod(name='named color',
+                                 match=lambda t, v: t == types.IDENT,
+                                 toStore='colorType'
+                                 )
+                            )
+        # store: colorType, parts
+        wellformed, seq, store, unusedtokens = ProdParser().parse(cssText,
+                                                            u'RGBColor',
+                                                            colorprods,
+                                                            keepS=True,
+                                                            store={'parts': []})
+
+        if wellformed:
+            self.wellformed = True
+            if store['colorType'].type == self._prods.HASH:
+                self._colorType = 'HEX'
+            elif store['colorType'].type == self._prods.IDENT:
+                self._colorType = 'Named Color'
+            else:
+                self._colorType = store['colorType'].value[:-1]
+                #self._colorType = cssutils.helper.normalize(store['colorType'].value)[:-1]
+
+            self._setSeq(seq)
+
+    cssText = property(lambda self: cssutils.ser.do_css_RGBColor(self),
+                       _setCssText)
+
+    colorType = property(lambda self: self._colorType)
+
+
+class CalcValue(CSSFunction):
+    """Calc Function"""
+    _functionName = u'Function calc()'
+
+    def _productiondefinition(self):
+        """Return defintion used for parsing."""
+        types = self._prods # rename!
+
+        def toSeq(t, tokens):
+            "Do not normalize function name!"
+            return t[0], t[1]
+
+        funcProds = Sequence(Prod(name='calc',
+                                  match=lambda t, v: t == types.FUNCTION,
+                                  toSeq=toSeq
+                             ),
+                             Sequence(Choice(Prod(name='nested function',
+                                                  match=lambda t, v: t == self._prods.FUNCTION,
+                                                  toSeq=lambda t, tokens: (CSSFunction._functionName,
+                                                                           CSSFunction(cssutils.helper.pushtoken(t,
+                                                                                                                 tokens)))
+                                                  ),
+                                             Prod(name='part',
+                                                  match=lambda t, v: v != u')',
+                                                  toSeq=lambda t, tokens: (t[0], t[1])),
+                                                  ),
+                                      minmax=lambda: (0, None)),
+                             PreDef.funcEnd(stop=True))
+        return funcProds
+
+    def _getCssText(self):
+        return cssutils.ser.do_css_CalcValue(self)
+
+    def _setCssText(self, cssText):
+        return super(CalcValue, self)._setCssText(cssText)
+
+    cssText = property(_getCssText, _setCssText,
+                       doc=u"A string representation of the current value.")
+
+
+class ExpressionValue(CSSFunction):
+    """Special IE only CSSFunction which may contain *anything*.
+    Used for expressions and ``alpha(opacity=100)`` currently."""
+    _functionName = u'Expression (IE only)'
+
+    def _productiondefinition(self):
+        """Return defintion used for parsing."""
+        types = self._prods # rename!
+
+        def toSeq(t, tokens):
+            "Do not normalize function name!"
+            return t[0], t[1]
+
+        funcProds = Sequence(Prod(name='expression',
+                                  match=lambda t, v: t == types.FUNCTION,
+                                  toSeq=toSeq
+                             ),
+                             Sequence(Choice(Prod(name='nested function',
+                                                  match=lambda t, v: t == self._prods.FUNCTION,
+                                                  toSeq=lambda t, tokens: (ExpressionValue._functionName,
+                                                                           ExpressionValue(cssutils.helper.pushtoken(t,
+                                                                                                                 tokens)))
+                                                  ),
+                                             Prod(name='part',
+                                                  match=lambda t, v: v != u')',
+                                                  toSeq=lambda t, tokens: (t[0], t[1])),
+                                                  ),
+                                      minmax=lambda: (0, None)),
+                             PreDef.funcEnd(stop=True))
+        return funcProds
+
+    def _getCssText(self):
+        return cssutils.ser.do_css_ExpressionValue(self)
+
+    def _setCssText(self, cssText):
+        #self._log.warn(u'CSSValue: Unoffial and probably invalid MS value used!')
+        return super(ExpressionValue, self)._setCssText(cssText)
+
+    cssText = property(_getCssText, _setCssText,
+                       doc=u"A string representation of the current value.")
+
+
+class CSSVariable(CSSValue):
+    """The CSSVariable represents a call to CSS Variable."""
+
+    def __init__(self, cssText=None, parent=None, readonly=False):
+        """Init a new CSSVariable.
+
+        :param cssText:
+            the parsable cssText of the value, e.g. ``var(x)``
+        :param readonly:
+            defaults to False
+        """
+        self._name = None
+        super(CSSVariable, self).__init__(cssText=cssText,
+                                          parent=parent,
+                                          readonly=readonly)
+
+    def __repr__(self):
+        return u"cssutils.css.%s(%r)" % (self.__class__.__name__, self.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object name=%r value=%r at 0x%x>" % (
+                self.__class__.__name__,
+                self.name,
+                self.value,
+                id(self))
+
+    def _setCssText(self, cssText):
+        self._checkReadonly()
+
+        types = self._prods # rename!
+
+        funcProds = Sequence(Prod(name='var',
+                                  match=lambda t, v: t == types.FUNCTION
+                             ),
+                             PreDef.ident(toStore='ident'),
+                             PreDef.funcEnd(stop=True))
+
+        # store: name of variable
+        store = {'ident': None}
+        wellformed, seq, store, unusedtokens = ProdParser().parse(cssText,
+                                                                  u'CSSVariable',
+                                                                  funcProds,
+                                                                  keepS=True)
+        if wellformed:
+            self._name = store['ident'].value
+            self._setSeq(seq)
+            self.wellformed = True
+
+    cssText = property(lambda self: cssutils.ser.do_css_CSSVariable(self),
+                       _setCssText,
+                       doc=u"A string representation of the current variable.")
+
+    cssValueType = CSSValue.CSS_VARIABLE
+
+    # TODO: writable? check if var (value) available?
+    name = property(lambda self: self._name)
+
+    def _getValue(self):
+        "Find contained sheet and @variables there"
+        try:
+            variables = self.parent.parent.parentRule.parentStyleSheet.variables
+        except AttributeError:
+            return None
+        else:
+            try:
+                return variables[self.name]
+            except KeyError:
+                return None
+
+    value = property(_getValue)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssfontfacerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssfontfacerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssfontfacerule.py	(revision 1126)
@@ -0,0 +1,184 @@
+"""CSSFontFaceRule implements DOM Level 2 CSS CSSFontFaceRule.
+
+From cssutils 0.9.6 additions from CSS Fonts Module Level 3 are
+added http://www.w3.org/TR/css3-fonts/.
+"""
+__all__ = ['CSSFontFaceRule']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssstyledeclaration import CSSStyleDeclaration
+import cssrule
+import cssutils
+import xml.dom
+
+class CSSFontFaceRule(cssrule.CSSRule):
+    """
+    The CSSFontFaceRule interface represents a @font-face rule in a CSS
+    style sheet. The @font-face rule is used to hold a set of font 
+    descriptions.
+
+    Format::
+
+        font_face
+          : FONT_FACE_SYM S*
+            '{' S* declaration [ ';' S* declaration ]* '}' S*
+          ;
+          
+    cssutils uses a :class:`~cssutils.css.CSSStyleDeclaration`  to
+    represent the font descriptions. For validation a specific profile
+    is used though were some properties have other valid values than
+    when used in e.g. a :class:`~cssutils.css.CSSStyleRule`.
+    """
+    def __init__(self, style=None, parentRule=None, 
+                 parentStyleSheet=None, readonly=False):
+        """
+        If readonly allows setting of properties in constructor only.
+
+        :param style:
+            CSSStyleDeclaration used to hold any font descriptions 
+            for this CSSFontFaceRule
+        """
+        super(CSSFontFaceRule, self).__init__(parentRule=parentRule, 
+                                              parentStyleSheet=parentStyleSheet)
+        self._atkeyword = u'@font-face'
+            
+        if style:
+            self.style = style
+        else:
+            self.style = CSSStyleDeclaration()
+        
+        self._readonly = readonly
+        
+    def __repr__(self):
+        return u"cssutils.css.%s(style=%r)" % (
+                self.__class__.__name__, 
+                self.style.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object style=%r valid=%r at 0x%x>" % (
+                self.__class__.__name__, 
+                self.style.cssText, 
+                self.valid, 
+                id(self))
+
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_CSSFontFaceRule(self)
+
+    def _setCssText(self, cssText):
+        """
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              Raised if the specified CSS string value represents a different
+              type of rule than the current one.
+            - :exc:`~xml.dom.HierarchyRequestErr`:
+              Raised if the rule cannot be inserted at this point in the
+              style sheet.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if the rule is readonly.
+        """
+        super(CSSFontFaceRule, self)._setCssText(cssText)
+        
+        tokenizer = self._tokenize2(cssText)
+        attoken = self._nexttoken(tokenizer, None)
+        if self._type(attoken) != self._prods.FONT_FACE_SYM:
+            self._log.error(u'CSSFontFaceRule: No CSSFontFaceRule found: %s' %
+                self._valuestr(cssText),
+                error=xml.dom.InvalidModificationErr)
+        else:
+            newStyle = CSSStyleDeclaration(parentRule=self)
+            ok = True
+            
+            beforetokens, brace = self._tokensupto2(tokenizer, 
+                                                    blockstartonly=True,
+                                                    separateEnd=True)            
+            if self._tokenvalue(brace) != u'{':
+                ok = False
+                self._log.error(u'CSSFontFaceRule: No start { of style '
+                                u'declaration found: %r' 
+                                % self._valuestr(cssText), brace)
+            
+            # parse stuff before { which should be comments and S only
+            new = {'wellformed': True}
+            newseq = self._tempSeq()
+            
+            beforewellformed, expected = self._parse(expected=':',
+                seq=newseq, tokenizer=self._tokenize2(beforetokens),
+                productions={})
+            ok = ok and beforewellformed and new['wellformed']
+    
+            styletokens, braceorEOFtoken = self._tokensupto2(tokenizer, 
+                                                             blockendonly=True,
+                                                             separateEnd=True)
+
+            val, type_ = self._tokenvalue(braceorEOFtoken),\
+                         self._type(braceorEOFtoken)
+            if val != u'}' and type_ != 'EOF':
+                ok = False
+                self._log.error(u'CSSFontFaceRule: No "}" after style '
+                                u'declaration found: %r'
+                                % self._valuestr(cssText))
+                
+            nonetoken = self._nexttoken(tokenizer)
+            if nonetoken:
+                ok = False
+                self._log.error(u'CSSFontFaceRule: Trailing content found.',
+                                token=nonetoken)
+
+            if 'EOF' == type_:
+                # add again as style needs it
+                styletokens.append(braceorEOFtoken)
+
+            # SET, may raise:
+            newStyle.cssText = styletokens
+
+            if ok:
+                # contains probably comments only (upto ``{``)
+                self._setSeq(newseq)
+                self.style = newStyle                 
+                
+    cssText = property(_getCssText, _setCssText,
+                       doc=u"(DOM) The parsable textual representation of this "
+                           u"rule.")
+
+    def _setStyle(self, style):
+        """
+        :param style:
+            a CSSStyleDeclaration or string
+        """
+        self._checkReadonly()
+        if isinstance(style, basestring):
+            self._style = CSSStyleDeclaration(cssText=style, parentRule=self)
+        else:
+            style._parentRule = self
+            self._style = style
+
+    style = property(lambda self: self._style, _setStyle,
+                     doc=u"(DOM) The declaration-block of this rule set, "
+                         u"a :class:`~cssutils.css.CSSStyleDeclaration`.")
+
+    type = property(lambda self: self.FONT_FACE_RULE, 
+                    doc=u"The type of this rule, as defined by a CSSRule "
+                        u"type constant.")
+
+    def _getValid(self):
+        needed = ['font-family', 'src']
+        for p in self.style.getProperties(all=True):
+            if not p.valid:
+                return False
+            try:
+                needed.remove(p.name)
+            except ValueError:
+                pass
+        return not bool(needed)
+
+    valid = property(_getValid, 
+                     doc=u"CSSFontFace is valid if properties `font-family` "
+                         u"and `src` are set and all properties are valid.")
+    
+    # constant but needed:
+    wellformed = property(lambda self: True)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvariablesdeclaration.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvariablesdeclaration.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css/cssvariablesdeclaration.py	(revision 1126)
@@ -0,0 +1,331 @@
+"""CSSVariablesDeclaration
+http://disruptive-innovations.com/zoo/cssvariables/#mozTocId496530
+"""
+__all__ = ['CSSVariablesDeclaration']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: cssstyledeclaration.py 1819 2009-08-01 20:52:43Z cthedot $'
+
+from cssutils.prodparser import *
+from cssutils.helper import normalize
+from value import PropertyValue
+import cssutils
+import itertools
+import xml.dom
+
+class CSSVariablesDeclaration(cssutils.util._NewBase):
+    """The CSSVariablesDeclaration interface represents a single block of
+    variable declarations. 
+    """
+    def __init__(self, cssText=u'', parentRule=None, readonly=False):
+        """
+        :param cssText:
+            Shortcut, sets CSSVariablesDeclaration.cssText
+        :param parentRule:
+            The CSS rule that contains this declaration block or
+            None if this CSSVariablesDeclaration is not attached to a CSSRule.
+        :param readonly:
+            defaults to False
+            
+        Format::
+        
+            variableset
+                : vardeclaration [ ';' S* vardeclaration ]* S*
+                ;
+            
+            vardeclaration
+                : varname ':' S* term
+                ;
+            
+            varname
+                : IDENT S*
+                ;
+        """
+        super(CSSVariablesDeclaration, self).__init__()
+        self._parentRule = parentRule
+        self._vars = {}
+        if cssText:
+            self.cssText = cssText
+            
+        self._readonly = readonly
+
+    def __repr__(self):
+        return u"cssutils.css.%s(cssText=%r)" % (self.__class__.__name__,
+                                                 self.cssText)
+
+    def __str__(self):
+        return u"<cssutils.css.%s object length=%r at 0x%x>" % (
+                self.__class__.__name__,
+                self.length,
+                id(self))
+        
+    def __contains__(self, variableName):
+        """Check if a variable is in variable declaration block.
+        
+        :param variableName:
+            a string
+        """
+        return normalize(variableName) in self.keys()
+    
+    def __getitem__(self, variableName):
+        """Retrieve the value of variable ``variableName`` from this 
+        declaration.
+        """
+        return self.getVariableValue(variableName)
+    
+    def __setitem__(self, variableName, value):
+        self.setVariable(variableName, value)
+
+    def __delitem__(self, variableName):
+        return self.removeVariable(variableName)
+
+    def __iter__(self):
+        """Iterator of names of set variables."""
+        for name in self.keys():
+            yield name
+
+    def keys(self):
+        """Analoguous to standard dict returns variable names which are set in
+        this declaration."""
+        return self._vars.keys()
+    
+    def _getCssText(self):
+        """Return serialized property cssText."""
+        return cssutils.ser.do_css_CSSVariablesDeclaration(self)
+
+    def _setCssText(self, cssText):
+        """Setting this attribute will result in the parsing of the new value
+        and resetting of all the properties in the declaration block
+        including the removal or addition of properties.
+
+        :exceptions:
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this declaration is readonly or a property is readonly.
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified CSS string value has a syntax error and
+              is unparsable.
+
+        Format::
+        
+            variableset
+            : vardeclaration [ ';' S* vardeclaration ]*
+            ;
+            
+            vardeclaration
+            : varname ':' S* term
+            ;
+            
+            varname
+            : IDENT S*
+            ;
+            
+            expr
+            : [ VARCALL | term ] [ operator [ VARCALL | term ] ]*
+            ;
+
+        """
+        self._checkReadonly()
+
+        vardeclaration = Sequence(
+            PreDef.ident(),
+            PreDef.char(u':', u':', toSeq=False, optional=True),
+            #PreDef.S(toSeq=False, optional=True),
+            Prod(name=u'term', match=lambda t, v: True,
+                 toSeq=lambda t, tokens: (u'value', 
+                                          PropertyValue(itertools.chain([t], 
+                                                                        tokens), 
+                                          parent=self)
+                 )
+            )
+        )
+        prods = Sequence(vardeclaration,                         
+                         Sequence(PreDef.S(optional=True),
+                                  PreDef.char(u';', u';', toSeq=False, optional=True),
+                                  PreDef.S(optional=True),
+                                  vardeclaration,
+                                  minmax=lambda: (0, None)),
+                         PreDef.S(optional=True),
+                         PreDef.char(u';', u';', toSeq=False, optional=True)
+                         )
+        # parse
+        wellformed, seq, store, notused = \
+            ProdParser().parse(cssText, 
+                               u'CSSVariableDeclaration',
+                               prods,
+                               emptyOk=True)
+        if wellformed:
+            newseq = self._tempSeq()
+            newvars = {}
+
+            # seq contains only name: value pairs plus comments etc
+            nameitem = None
+            for item in seq:
+                if u'IDENT' == item.type:
+                    nameitem = item
+                elif u'value' == item.type:
+                    nname = normalize(nameitem.value)
+                    if nname in newvars:
+                        # replace var with same name
+                        for i, it in enumerate(newseq):
+                            if normalize(it.value[0]) == nname:
+                                newseq.replace(i,
+                                               (nameitem.value, item.value),
+                                               'var',
+                                               nameitem.line, nameitem.col)
+                    else: 
+                        # saved non normalized name for reserialization
+                        newseq.append((nameitem.value, item.value), 
+                                      'var',
+                                      nameitem.line, nameitem.col)
+
+#                    newseq.append((nameitem.value, item.value), 
+#                                  'var',
+#                                  nameitem.line, nameitem.col)
+                    
+                    newvars[nname] = item.value
+                    
+                else:
+                    newseq.appendItem(item)
+
+            self._setSeq(newseq)
+            self._vars = newvars
+            self.wellformed = True
+
+    cssText = property(_getCssText, _setCssText,
+        doc=u"(DOM) A parsable textual representation of the declaration "
+            u"block excluding the surrounding curly braces.")
+
+    def _setParentRule(self, parentRule):
+        self._parentRule = parentRule
+    
+    parentRule = property(lambda self: self._parentRule, _setParentRule,
+                          doc=u"(DOM) The CSS rule that contains this"
+                              u" declaration block or None if this block"
+                              u" is not attached to a CSSRule.")
+
+    def getVariableValue(self, variableName):
+        """Used to retrieve the value of a variable if it has been explicitly
+        set within this variable declaration block.
+         
+        :param variableName:
+            The name of the variable.
+        :returns:
+            the value of the variable if it has been explicitly set in this
+            variable declaration block. Returns the empty string if the
+            variable has not been set.
+        """
+        try:
+            return self._vars[normalize(variableName)].cssText
+        except KeyError, e:
+            return u''
+
+    def removeVariable(self, variableName):
+        """Used to remove a variable if it has been explicitly set within this
+        variable declaration block.
+
+        :param variableName:
+            The name of the variable.
+        :returns:
+            the value of the variable if it has been explicitly set for this
+            variable declaration block. Returns the empty string if the
+            variable has not been set.
+
+        :exceptions:
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this declaration is readonly is readonly.
+        """
+        normalname = variableName
+        try:
+            r = self._vars[normalname]
+        except KeyError, e:
+            return u''
+        else: 
+            self.seq._readonly = False
+            if normalname in self._vars:
+                for i, x in enumerate(self.seq):
+                    if x.value[0] == variableName:
+                        del self.seq[i]
+            self.seq._readonly = True
+            del self._vars[normalname]
+
+        return r.cssText
+
+    def setVariable(self, variableName, value):
+        """Used to set a variable value within this variable declaration block.
+
+        :param variableName:
+            The name of the CSS variable. 
+        :param value:
+            The new value of the variable, may also be a PropertyValue object.
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified value has a syntax error and is
+              unparsable.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this declaration is readonly or the property is
+              readonly.
+        """
+        self._checkReadonly()
+                
+        # check name
+        wellformed, seq, store, unused = \
+            ProdParser().parse(normalize(variableName),
+                               u'variableName',
+                               Sequence(PreDef.ident()))
+        if not wellformed:
+            self._log.error(u'Invalid variableName: %r: %r'
+                            % (variableName, value))
+        else:
+            # check value
+            if isinstance(value, PropertyValue):
+                v = value 
+            else:
+                v = PropertyValue(cssText=value, parent=self)
+                                
+            if not v.wellformed:
+                self._log.error(u'Invalid variable value: %r: %r'
+                                % (variableName, value))
+            else:
+                # update seq
+                self.seq._readonly = False
+                
+                variableName = normalize(variableName)
+                
+                if variableName in self._vars:
+                    for i, x in enumerate(self.seq):
+                        if x.value[0] == variableName:
+                            self.seq.replace(i, 
+                                      [variableName, v], 
+                                      x.type, 
+                                      x.line,
+                                      x.col)
+                            break
+                else:
+                    self.seq.append([variableName, v], 'var')                
+                self.seq._readonly = True
+                self._vars[variableName] = v
+                
+    def item(self, index):
+        """Used to retrieve the variables that have been explicitly set in
+        this variable declaration block. The order of the variables
+        retrieved using this method does not have to be the order in which
+        they were set. This method can be used to iterate over all variables
+        in this variable declaration block.
+
+        :param index:
+            of the variable name to retrieve, negative values behave like
+            negative indexes on Python lists, so -1 is the last element
+
+        :returns:
+            The name of the variable at this ordinal position. The empty
+            string if no variable exists at this position.
+        """
+        try:
+            return self.keys()[index]
+        except IndexError:
+            return u''
+
+    length = property(lambda self: len(self._vars),
+        doc=u"The number of variables that have been explicitly set in this"
+            u" variable declaration block. The range of valid indices is 0"
+            u" to length-1 inclusive.")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css2productions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css2productions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/css2productions.py	(revision 1126)
@@ -0,0 +1,131 @@
+"""productions for CSS 2.1
+
+CSS2_1_MACROS and CSS2_1_PRODUCTIONS are from both
+http://www.w3.org/TR/CSS21/grammar.html and
+http://www.w3.org/TR/css3-syntax/#grammar0
+
+
+"""
+__all__ = ['CSSProductions', 'MACROS', 'PRODUCTIONS']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+# option case-insensitive
+MACROS = {
+    'h': r'[0-9a-f]',
+    #'nonascii': r'[\200-\377]',
+    'nonascii': r'[^\0-\177]', # CSS3
+    'unicode': r'\\{h}{1,6}(\r\n|[ \t\r\n\f])?',
+
+    'escape': r'{unicode}|\\[^\r\n\f0-9a-f]',
+    'nmstart': r'[_a-zA-Z]|{nonascii}|{escape}',
+    'nmchar': r'[_a-zA-Z0-9-]|{nonascii}|{escape}',
+    'string1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*\"',
+    'string2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*\'",
+    'invalid1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*',
+    'invalid2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*",
+    'comment': r'\/\*[^*]*\*+([^/*][^*]*\*+)*\/',
+    # CSS list 080725 19:43 
+    # \/\*([^*\\]|{escape})*\*+(([^/*\\]|{escape})[^*]*\*+)*\/
+
+    'ident':  r'[-]?{nmstart}{nmchar}*',
+    'name': r'{nmchar}+',
+    # CHANGED TO SPEC: added "-?"
+    'num': r'-?[0-9]*\.[0-9]+|[0-9]+',
+    'string': r'{string1}|{string2}',
+    'invalid': r'{invalid1}|{invalid2}',
+    'url': r'([!#$%&*-~]|{nonascii}|{escape})*',
+    's': r'[ \t\r\n\f]+',
+    'w': r'{s}?',
+    'nl': r'\n|\r\n|\r|\f',
+    'range': r'\?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h})))))',
+
+    'A': r'a|\\0{0,4}(41|61)(\r\n|[ \t\r\n\f])?',
+    'C': r'c|\\0{0,4}(43|63)(\r\n|[ \t\r\n\f])?',
+    'D': r'd|\\0{0,4}(44|64)(\r\n|[ \t\r\n\f])?',
+    'E': r'e|\\0{0,4}(45|65)(\r\n|[ \t\r\n\f])?',
+    'F': r'f|\\0{0,4}(46|66)(\r\n|[ \t\r\n\f])?',
+    'G': r'g|\\0{0,4}(47|67)(\r\n|[ \t\r\n\f])?|\\g',
+    'H': r'h|\\0{0,4}(48|68)(\r\n|[ \t\r\n\f])?|\\h',
+    'I': r'i|\\0{0,4}(49|69)(\r\n|[ \t\r\n\f])?|\\i',
+    'K': r'k|\\0{0,4}(4b|6b)(\r\n|[ \t\r\n\f])?|\\k',
+    'M': r'm|\\0{0,4}(4d|6d)(\r\n|[ \t\r\n\f])?|\\m',
+    'N': r'n|\\0{0,4}(4e|6e)(\r\n|[ \t\r\n\f])?|\\n',
+    'O': r'o|\\0{0,4}(51|71)(\r\n|[ \t\r\n\f])?|\\o',
+    'P': r'p|\\0{0,4}(50|70)(\r\n|[ \t\r\n\f])?|\\p',
+    'R': r'r|\\0{0,4}(52|72)(\r\n|[ \t\r\n\f])?|\\r',
+    'S': r's|\\0{0,4}(53|73)(\r\n|[ \t\r\n\f])?|\\s',
+    'T': r't|\\0{0,4}(54|74)(\r\n|[ \t\r\n\f])?|\\t',
+    'X': r'x|\\0{0,4}(58|78)(\r\n|[ \t\r\n\f])?|\\x',
+    'Z': r'z|\\0{0,4}(5a|7a)(\r\n|[ \t\r\n\f])?|\\z',
+    }
+
+PRODUCTIONS = [
+    ('URI', r'url\({w}{string}{w}\)'), #"url("{w}{string}{w}")"    {return URI;}
+    ('URI', r'url\({w}{url}{w}\)'), #"url("{w}{url}{w}")"    {return URI;}
+    ('FUNCTION', r'{ident}\('), #{ident}"("        {return FUNCTION;}
+
+    ('IMPORT_SYM', r'@{I}{M}{P}{O}{R}{T}'), #"@import"        {return IMPORT_SYM;}
+    ('PAGE_SYM', r'@{P}{A}{G}{E}'), #"@page"            {return PAGE_SYM;}
+    ('MEDIA_SYM', r'@{M}{E}{D}{I}{A}'), #"@media"        {return MEDIA_SYM;}
+    ('FONT_FACE_SYM', r'@{F}{O}{N}{T}\-{F}{A}{C}{E}'), #"@font-face"        {return FONT_FACE_SYM;}
+
+    # CHANGED TO SPEC: only @charset
+    ('CHARSET_SYM', r'@charset '), #"@charset "        {return CHARSET_SYM;}
+
+    ('NAMESPACE_SYM', r'@{N}{A}{M}{E}{S}{P}{A}{C}{E}'), #"@namespace"        {return NAMESPACE_SYM;}
+
+    # CHANGED TO SPEC: ATKEYWORD
+    ('ATKEYWORD', r'\@{ident}'),
+
+    ('IDENT', r'{ident}'), #{ident}            {return IDENT;}
+    ('STRING', r'{string}'), #{string}        {return STRING;}
+    ('INVALID', r'{invalid}'), #        {return INVALID; /* unclosed string */}
+    ('HASH', r'\#{name}'), #"#"{name}        {return HASH;}
+    ('PERCENTAGE', r'{num}%'), #{num}%            {return PERCENTAGE;}
+    ('LENGTH', r'{num}{E}{M}'), #{num}em            {return EMS;}
+    ('LENGTH', r'{num}{E}{X}'), #{num}ex            {return EXS;}
+    ('LENGTH', r'{num}{P}{X}'), #{num}px            {return LENGTH;}
+    ('LENGTH', r'{num}{C}{M}'), #{num}cm            {return LENGTH;}
+    ('LENGTH', r'{num}{M}{M}'), #{num}mm            {return LENGTH;}
+    ('LENGTH', r'{num}{I}{N}'), #{num}in            {return LENGTH;}
+    ('LENGTH', r'{num}{P}{T}'), #{num}pt            {return LENGTH;}
+    ('LENGTH', r'{num}{P}{C}'), #{num}pc            {return LENGTH;}
+    ('ANGLE', r'{num}{D}{E}{G}'), #{num}deg        {return ANGLE;}
+    ('ANGLE', r'{num}{R}{A}{D}'), #{num}rad        {return ANGLE;}
+    ('ANGLE', r'{num}{G}{R}{A}{D}'), #{num}grad        {return ANGLE;}
+    ('TIME', r'{num}{M}{S}'), #{num}ms            {return TIME;}
+    ('TIME', r'{num}{S}'), #{num}s            {return TIME;}
+    ('FREQ', r'{num}{H}{Z}'), #{num}Hz            {return FREQ;}
+    ('FREQ', r'{num}{K}{H}{Z}'), #{num}kHz        {return FREQ;}
+    ('DIMEN', r'{num}{ident}'), #{num}{ident}        {return DIMEN;}
+    ('NUMBER', r'{num}'), #{num}            {return NUMBER;}
+    #('UNICODERANGE', r'U\+{range}'), #U\+{range}        {return UNICODERANGE;}
+    #('UNICODERANGE', r'U\+{h}{1,6}-{h}{1,6}'), #U\+{h}{1,6}-{h}{1,6}    {return UNICODERANGE;}
+    # --- CSS3 ---
+    ('UNICODE-RANGE', r'[0-9A-F?]{1,6}(\-[0-9A-F]{1,6})?'),
+    ('CDO', r'\<\!\-\-'), #"<!--"            {return CDO;}
+    ('CDC', r'\-\-\>'), #"-->"            {return CDC;}
+    ('S', r'{s}'),#		{return S;}
+
+    # \/\*[^*]*\*+([^/*][^*]*\*+)*\/		/* ignore comments */
+    # {s}+\/\*[^*]*\*+([^/*][^*]*\*+)*\/	{unput(' '); /*replace by space*/}
+
+    ('INCLUDES', r'\~\='), #"~="			{return INCLUDES;}
+    ('DASHMATCH', r'\|\='), #"|="			{return DASHMATCH;}
+    ('LBRACE', r'\{'), #{w}"{"			{return LBRACE;}
+    ('PLUS', r'\+'), #{w}"+"			{return PLUS;}
+    ('GREATER', r'\>'), #{w}">"			{return GREATER;}
+    ('COMMA', r'\,'), #{w}","			{return COMMA;}
+    ('IMPORTANT_SYM', r'\!({w}|{comment})*{I}{M}{P}{O}{R}{T}{A}{N}{T}'), #"!{w}important"        {return IMPORTANT_SYM;}
+    ('COMMENT', '\/\*[^*]*\*+([^/][^*]*\*+)*\/'), #    /* ignore comments */
+    ('CLASS', r'\.'), #.			{return *yytext;}
+
+    # --- CSS3! ---
+    ('CHAR', r'[^"\']'),
+    ]
+
+class CSSProductions(object):
+    pass
+for i, t in enumerate(PRODUCTIONS):
+    setattr(CSSProductions, t[0].replace('-', '_'), t[0])
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/script.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/script.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/script.py	(revision 1126)
@@ -0,0 +1,362 @@
+"""classes and functions used by cssutils scripts
+"""
+__all__ = ['CSSCapture', 'csscombine']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: parse.py 1323 2008-07-06 18:13:57Z cthedot $'
+
+import HTMLParser
+import codecs
+import cssutils
+import errno
+import logging
+import os
+import sys
+import urllib2
+import urlparse
+
+try:
+    import cssutils.encutils as encutils
+except ImportError:
+    try:
+        import encutils
+    except ImportError:
+        sys.exit("You need encutils from http://cthedot.de/encutils/")
+
+# types of sheets in HTML
+LINK = 0 # <link rel="stylesheet" type="text/css" href="..." [@title="..." @media="..."]/>
+STYLE = 1 # <style type="text/css" [@title="..."]>...</style>
+
+class CSSCaptureHTMLParser(HTMLParser.HTMLParser):
+    """CSSCapture helper: Parse given data for link and style elements"""
+    curtag = u''
+    sheets = [] # (type, [atts, cssText])
+
+    def _loweratts(self, atts):
+        return dict([(a.lower(), v.lower()) for a, v in atts])
+
+    def handle_starttag(self, tag, atts):
+        if tag == u'link':
+            atts = self._loweratts(atts)
+            if u'text/css' == atts.get(u'type', u''):
+                self.sheets.append((LINK, atts))
+        elif tag == u'style':
+            # also get content of style
+            atts = self._loweratts(atts)
+            if u'text/css' == atts.get(u'type', u''):
+                self.sheets.append((STYLE, [atts, u'']))
+                self.curtag = tag
+        else:
+            # close as only intersting <style> cannot contain any elements
+            self.curtag = u''
+
+    def handle_data(self, data):
+        if self.curtag == u'style':
+            self.sheets[-1][1][1] = data # replace cssText
+
+    def handle_comment(self, data):
+        # style might have comment content, treat same as data
+        self.handle_data(data)
+
+    def handle_endtag(self, tag):
+        # close as style cannot contain any elements
+        self.curtag = u''
+
+
+class CSSCapture(object):
+    """
+    Retrieve all CSS stylesheets including embedded for a given URL.
+    Optional setting of User-Agent used for retrieval possible
+    to handle browser sniffing servers.
+
+    raises urllib2.HTTPError
+    """
+    def __init__(self, ua=None, log=None, defaultloglevel=logging.INFO):
+        """
+        initialize a new Capture object
+
+        ua
+            init User-Agent to use for requests
+        log
+            supply a log object which is used instead of the default
+            log which writes to sys.stderr
+        defaultloglevel
+            constant of logging package which defines the level of the
+            default log if no explicit log given
+        """
+        self._ua = ua
+
+        if log:
+            self._log = log
+        else:
+            self._log = logging.getLogger('CSSCapture')
+            hdlr = logging.StreamHandler(sys.stderr)
+            formatter = logging.Formatter('%(message)s')
+            hdlr.setFormatter(formatter)
+            self._log.addHandler(hdlr)
+            self._log.setLevel(defaultloglevel)
+            self._log.debug(u'Using default log')
+
+        self._htmlparser = CSSCaptureHTMLParser()
+        self._cssparser = cssutils.CSSParser(log = self._log)
+
+    def _doRequest(self, url):
+        """Do an HTTP request
+
+        Return (url, rawcontent)
+            url might have been changed by server due to redirects etc
+        """
+        self._log.debug(u'    CSSCapture._doRequest\n        * URL: %s' % url)
+
+        req = urllib2.Request(url)
+        if self._ua:
+            req.add_header('User-agent', self._ua)
+            self._log.info('        * Using User-Agent: %s', self._ua)
+
+        try:
+            res = urllib2.urlopen(req)
+        except urllib2.HTTPError, e:
+            self._log.critical('    %s\n%s %s\n%s' % (
+                e.geturl(), e.code, e.msg, e.headers))
+            return None, None
+
+        # get real url
+        if url != res.geturl():
+            url = res.geturl()
+            self._log.info('        URL retrieved: %s', url)
+
+        return url, res
+
+    def _createStyleSheet(self, href=None,
+                          media=None,
+                          parentStyleSheet=None,
+                          title=u'',
+                          cssText=None,
+                          encoding=None):
+        """
+        Return CSSStyleSheet read from href or if cssText is given use that.
+
+        encoding
+            used if inline style found, same as self.docencoding
+        """
+        if cssText is None:
+            encoding, enctype, cssText = cssutils.util._readUrl(href, parentEncoding=self.docencoding)
+            encoding = None # already decoded???
+
+        sheet = self._cssparser.parseString(cssText, href=href, media=media, title=title,
+                                            encoding=encoding)
+
+        if not sheet:
+            return None
+
+        else:
+            self._log.info(u'    %s\n' % sheet)
+            self._nonparsed[sheet] = cssText
+            return sheet
+
+    def _findStyleSheets(self, docurl, doctext):
+        """
+        parse text for stylesheets
+        fills stylesheetlist with all found StyleSheets
+
+        docurl
+            to build a full url of found StyleSheets @href
+        doctext
+            to parse
+        """
+        # TODO: ownerNode should be set to the <link> node
+        self._htmlparser.feed(doctext)
+
+        for typ, data in self._htmlparser.sheets:
+            sheet = None
+
+            if LINK == typ:
+                self._log.info(u'+ PROCESSING <link> %r' % data)
+
+                atts = data
+                href = urlparse.urljoin(docurl, atts.get(u'href', None))
+                sheet = self._createStyleSheet(href=href,
+                                               media=atts.get(u'media', None),
+                                               title=atts.get(u'title', None))
+            elif STYLE == typ:
+                self._log.info(u'+ PROCESSING <style> %r' % data)
+
+                atts, cssText = data
+                sheet = self._createStyleSheet(cssText=cssText,
+                                               href = docurl,
+                                               media=atts.get(u'media', None),
+                                               title=atts.get(u'title', None),
+                                               encoding=self.docencoding)
+                if sheet:
+                    sheet._href = None # inline have no href!
+                print sheet.cssText
+
+            if sheet:
+                self.stylesheetlist.append(sheet)
+                self._doImports(sheet, base=docurl)
+
+
+    def _doImports(self, parentStyleSheet, base=None):
+        """
+        handle all @import CSS stylesheet recursively
+        found CSS stylesheets are appended to stylesheetlist
+        """
+        # TODO: only if not parsed these have to be read extra!
+
+        for rule in parentStyleSheet.cssRules:
+            if rule.type == rule.IMPORT_RULE:
+                self._log.info(u'+ PROCESSING @import:')
+                self._log.debug(u'    IN: %s\n' % parentStyleSheet.href)
+                sheet = rule.styleSheet
+                href = urlparse.urljoin(base, rule.href)
+                if sheet:
+                    self._log.info(u'    %s\n' % sheet)
+                    self.stylesheetlist.append(sheet)
+                    self._doImports(sheet, base=href)
+
+    def capture(self, url):
+        """
+        Capture all stylesheets at given URL's HTML document.
+        Any HTTPError is raised to caller.
+
+        url
+            to capture CSS from
+
+        Returns ``cssutils.stylesheets.StyleSheetList``.
+        """
+        self._log.info(u'\nCapturing CSS from URL:\n    %s\n', url)
+        self._nonparsed = {}
+        self.stylesheetlist = cssutils.stylesheets.StyleSheetList()
+
+        # used to save inline styles
+        scheme, loc, path, query, fragment = urlparse.urlsplit(url)
+        self._filename = os.path.basename(path)
+
+        # get url content
+        url, res = self._doRequest(url)
+        if not res:
+            sys.exit(1)
+
+        rawdoc = res.read()
+
+        self.docencoding = encutils.getEncodingInfo(
+            res, rawdoc, log=self._log).encoding
+        self._log.info(u'\nUsing Encoding: %s\n', self.docencoding)
+
+        doctext = rawdoc.decode(self.docencoding)
+
+        # fill list of stylesheets and list of raw css
+        self._findStyleSheets(url, doctext)
+
+        return self.stylesheetlist
+
+    def saveto(self, dir, saveraw=False, minified=False):
+        """
+        saves css in "dir" in the same layout as on the server
+        internal stylesheets are saved as "dir/__INLINE_STYLE__.html.css"
+
+        dir
+            directory to save files to
+        saveparsed
+            save literal CSS from server or save the parsed CSS
+        minified
+            save minified CSS
+
+        Both parsed and minified (which is also parsed of course) will
+        loose information which cssutils is unable to understand or where
+        it is simple buggy. You might to first save the raw version before
+        parsing of even minifying it.
+        """
+        msg = 'parsed'
+        if saveraw:
+            msg = 'raw'
+        if minified:
+            cssutils.ser.prefs.useMinified()
+            msg = 'minified'
+
+        inlines = 0
+        for i, sheet in enumerate(self.stylesheetlist):
+            url = sheet.href
+            if not url:
+                inlines += 1
+                url = u'%s_INLINE_%s.css' % (self._filename, inlines)
+
+            # build savepath
+            scheme, loc, path, query, fragment = urlparse.urlsplit(url)
+            # no absolute path
+            if path and path.startswith('/'):
+                path = path[1:]
+            path = os.path.normpath(path)
+            path, fn = os.path.split(path)
+            savepath = os.path.join(dir, path)
+            savefn = os.path.join(savepath, fn)
+            try:
+                os.makedirs(savepath)
+            except OSError, e:
+                if e.errno != errno.EEXIST:
+                    raise e
+                self._log.debug(u'Path "%s" already exists.', savepath)
+
+            self._log.info(u'SAVING %s, %s %r' % (i+1, msg, savefn))
+
+            sf = open(savefn, 'wb')
+            if saveraw:
+                cssText = self._nonparsed[sheet]
+                uf = codecs.getwriter('css')(sf)
+                uf.write(cssText)
+            else:
+                sf.write(sheet.cssText)
+            sf.close()
+
+def csscombine(path=None, url=None, cssText=None, href=None,
+               sourceencoding=None, targetencoding=None, 
+               minify=True, resolveVariables=True):
+    """Combine sheets referred to by @import rules in given CSS proxy sheet
+    into a single new sheet.
+
+    :returns: combined cssText, normal or minified
+    :Parameters:
+        `path` or `url` or `cssText` + `href`
+            path or URL to a CSSStyleSheet or a cssText of a sheet which imports
+            other sheets which are then combined into one sheet.
+            `cssText` normally needs `href` to be able to resolve relative
+            imports.
+        `sourceencoding` = 'utf-8'
+            explicit encoding of the source proxysheet
+        `targetencoding`
+            encoding of the combined stylesheet
+        `minify` = True
+            defines if the combined sheet should be minified, in this case
+            comments are not parsed at all!
+        `resolveVariables` = True
+            defines if variables in combined sheet should be resolved
+    """
+    cssutils.log.info(u'Combining files from %r' % url, 
+                      neverraise=True)
+    if sourceencoding is not None:
+        cssutils.log.info(u'Using source encoding %r' % sourceencoding,
+                          neverraise=True)
+        
+    parser = cssutils.CSSParser(parseComments=not minify)
+        
+    if path and not cssText:
+        src = parser.parseFile(path, encoding=sourceencoding)
+    elif url:
+        src = parser.parseUrl(url, encoding=sourceencoding)
+    elif cssText:
+        src = parser.parseString(cssText, href=href, encoding=sourceencoding)
+    else:
+        sys.exit('Path or URL must be given')
+
+    result = cssutils.resolveImports(src)
+    result.encoding = targetencoding
+    cssutils.log.info(u'Using target encoding: %r' % targetencoding, neverraise=True)
+
+    oldser = cssutils.ser
+    cssutils.setSerializer(cssutils.serialize.CSSSerializer())
+    if minify:
+        cssutils.ser.prefs.useMinified()
+    cssutils.ser.prefs.resolveVariables = resolveVariables
+    cssText = result.cssText
+    cssutils.setSerializer(oldser)
+    
+    return cssText
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_fetchgae.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_fetchgae.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_fetchgae.py	(revision 1126)
@@ -0,0 +1,68 @@
+"""GAE specific URL reading functions"""
+__all__ = ['_defaultFetcher']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: tokenize2.py 1547 2008-12-10 20:42:26Z cthedot $'
+
+# raises ImportError of not on GAE
+from google.appengine.api import urlfetch
+import cgi
+import errorhandler
+import util
+
+log = errorhandler.ErrorHandler()
+
+def _defaultFetcher(url):
+    """
+    uses GoogleAppEngine (GAE)
+        fetch(url, payload=None, method=GET, headers={}, allow_truncated=False)
+
+    Response
+        content
+            The body content of the response.
+        content_was_truncated
+            True if the allow_truncated parameter to fetch() was True and
+            the response exceeded the maximum response size. In this case,
+            the content attribute contains the truncated response.
+        status_code
+            The HTTP status code.
+        headers
+            The HTTP response headers, as a mapping of names to values.
+
+    Exceptions
+        exception InvalidURLError()
+            The URL of the request was not a valid URL, or it used an
+            unsupported method. Only http and https URLs are supported.
+        exception DownloadError()
+            There was an error retrieving the data.
+
+            This exception is not raised if the server returns an HTTP
+            error code: In that case, the response data comes back intact,
+            including the error code.
+
+        exception ResponseTooLargeError()
+            The response data exceeded the maximum allowed size, and the
+            allow_truncated parameter passed to fetch() was False.
+    """
+    #from google.appengine.api import urlfetch
+    try:
+        r = urlfetch.fetch(url, method=urlfetch.GET)
+    except urlfetch.Error, e:
+        log.warn(u'Error opening url=%r: %s' % (url, e),
+                          error=IOError)
+    else:
+        if r.status_code == 200:
+            # find mimetype and encoding
+            mimetype = 'application/octet-stream'
+            try:
+                mimetype, params = cgi.parse_header(r.headers['content-type'])
+                encoding = params['charset']
+            except KeyError:
+                encoding = None
+            if mimetype != u'text/css':
+                log.error(u'Expected "text/css" mime type for url %r but found: %r' % 
+                              (url, mimetype), error=ValueError)
+            return encoding, r.content
+        else:
+            # TODO: 301 etc
+            log.warn(u'Error opening url=%r: HTTP status %s' % 
+                              (url, r.status_code), error=IOError)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/sac.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/sac.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/sac.py	(revision 1126)
@@ -0,0 +1,428 @@
+#!/usr/bin/env python
+"""A validating CSSParser"""
+__all__ = ['CSSParser']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: parse.py 1754 2009-05-30 14:50:13Z cthedot $'
+
+import helper
+import codecs
+import errorhandler
+import os
+import tokenize2
+import urllib
+import sys
+ 
+    
+class ErrorHandler(object):
+    """Basic class for CSS error handlers.
+    
+    This class class provides a default implementation ignoring warnings and
+    recoverable errors and throwing a SAXParseException for fatal errors.
+
+    If a CSS application needs to implement customized error handling, it must
+    extend this class and then register an instance with the CSS parser
+    using the parser's setErrorHandler method. The parser will then report all
+    errors and warnings through this interface.
+
+    The parser shall use this class instead of throwing an exception: it is
+    up to the application whether to throw an exception for different types of
+    errors and warnings. Note, however, that there is no requirement that the
+    parser continue to provide useful information after a call to fatalError
+    (in other words, a CSS driver class could catch an exception and report a 
+    fatalError).
+    """
+    def __init__(self):
+        self._log = errorhandler.ErrorHandler()
+    
+    def error(self, exception, token=None):
+        self._log.error(exception, token, neverraise=True)
+
+    def fatal(self, exception, token=None):
+        self._log.fatal(exception, token)
+
+    def warn(self, exception, token=None):
+        self._log.warn(exception, token, neverraise=True)
+
+     
+class DocumentHandler(object):
+    """
+     void     endFontFace()
+              Receive notification of the end of a font face statement.
+     void     endMedia(SACMediaList media)
+              Receive notification of the end of a media statement.
+     void     endPage(java.lang.String name, java.lang.String pseudo_page)
+              Receive notification of the end of a media statement.
+     void     importStyle(java.lang.String uri, SACMediaList media, java.lang.String defaultNamespaceURI)
+              Receive notification of a import statement in the style sheet.
+     void     startFontFace()
+              Receive notification of the beginning of a font face statement.
+     void     startMedia(SACMediaList media)
+              Receive notification of the beginning of a media statement.
+     void     startPage(java.lang.String name, java.lang.String pseudo_page)
+              Receive notification of the beginning of a page statement.
+    """
+    def __init__(self):
+        def log(msg):
+            sys.stderr.write('INFO\t%s\n' % msg)
+        self._log = log
+    
+    def comment(self, text, line=None, col=None):
+        "Receive notification of a comment."
+        self._log("comment %r at [%s, %s]" % (text, line, col))
+    
+    def startDocument(self, encoding):
+        "Receive notification of the beginning of a style sheet."
+        # source
+        self._log("startDocument encoding=%s" % encoding)
+
+    def endDocument(self, source=None, line=None, col=None):
+        "Receive notification of the end of a document."
+        self._log("endDocument EOF")
+    
+    def importStyle(self, uri, media, name, line=None, col=None):
+        "Receive notification of a import statement in the style sheet."
+        # defaultNamespaceURI???
+        self._log("importStyle at [%s, %s]" % (line, col))
+    
+    def namespaceDeclaration(self, prefix, uri, line=None, col=None):
+        "Receive notification of an unknown rule t-rule not supported by this parser."
+        # prefix might be None!
+        self._log("namespaceDeclaration at [%s, %s]" % (line, col))
+    
+    def startSelector(self, selectors=None, line=None, col=None):
+        "Receive notification of the beginning of a rule statement."
+        # TODO selectorList!
+        self._log("startSelector at [%s, %s]" % (line, col))
+
+    def endSelector(self, selectors=None, line=None, col=None):
+        "Receive notification of the end of a rule statement."
+        self._log("endSelector at [%s, %s]" % (line, col))
+    
+    def property(self, name, value='TODO', important=False, line=None, col=None):
+        "Receive notification of a declaration."
+        # TODO: value is LexicalValue?
+        self._log("property %r at [%s, %s]" % (name, line, col))
+
+    def ignorableAtRule(self, atRule, line=None, col=None):
+        "Receive notification of an unknown rule t-rule not supported by this parser."
+        self._log("ignorableAtRule %r at [%s, %s]" % (atRule, line, col))
+        
+
+
+class EchoHandler(DocumentHandler):
+    "Echos all input to property `out`"
+    def __init__(self):
+        super(EchoHandler, self).__init__()
+        self._out = []
+        
+    out = property(lambda self: u''.join(self._out))
+
+    def startDocument(self, encoding):
+        super(EchoHandler, self).startDocument(encoding)
+        if u'utf-8' != encoding:
+            self._out.append(u'@charset "%s";\n' % encoding)
+    
+#    def comment(self, text, line=None, col=None):
+#        self._out.append(u'/*%s*/' % text)
+
+    def importStyle(self, uri, media, name, line=None, col=None):
+        "Receive notification of a import statement in the style sheet."
+        # defaultNamespaceURI???
+        super(EchoHandler, self).importStyle(uri, media, name, line, col)
+        self._out.append(u'@import %s%s%s;\n' % (helper.string(uri),
+                                               u'%s ' % media if media else u'',
+                                               u'%s ' % name if name else u'')
+        )
+        
+        
+    def namespaceDeclaration(self, prefix, uri, line=None, col=None):
+        super(EchoHandler, self).namespaceDeclaration(prefix, uri, line, col)
+        self._out.append(u'@namespace %s%s;\n' % (u'%s ' % prefix if prefix else u'', 
+                                                helper.string(uri)))
+
+    def startSelector(self, selectors=None, line=None, col=None):
+        super(EchoHandler, self).startSelector(selectors, line, col)
+        if selectors:
+            self._out.append(u', '.join(selectors))
+        self._out.append(u' {\n')
+
+    def endSelector(self, selectors=None, line=None, col=None):
+        self._out.append(u'    }')
+        
+    def property(self, name, value, important=False, line=None, col=None):
+        super(EchoHandler, self).property(name, value,  line, col)
+        self._out.append(u'    %s: %s%s;\n' % (name, value, 
+                                        u' !important' if important else u''))
+  
+
+class Parser(object):
+    """
+    java.lang.String     getParserVersion()
+        Returns a string about which CSS language is supported by this parser.
+     boolean     parsePriority(InputSource source)
+          Parse a CSS priority value (e.g.
+     LexicalUnit     parsePropertyValue(InputSource source)
+          Parse a CSS property value.
+     void     parseRule(InputSource source)
+          Parse a CSS rule.
+     SelectorList     parseSelectors(InputSource source)
+          Parse a comma separated list of selectors.
+     void     parseStyleDeclaration(InputSource source)
+          Parse a CSS style declaration (without '{' and '}').
+     void     parseStyleSheet(InputSource source)
+          Parse a CSS document.
+     void     parseStyleSheet(java.lang.String uri)
+          Parse a CSS document from a URI.
+     void     setConditionFactory(ConditionFactory conditionFactory)
+           
+     void     setDocumentHandler(DocumentHandler handler)
+          Allow an application to register a document event handler.
+     void     setErrorHandler(ErrorHandler handler)
+          Allow an application to register an error event handler.
+     void     setLocale(java.util.Locale locale)
+          Allow an application to request a locale for errors and warnings.
+     void     setSelectorFactory(SelectorFactory selectorFactory) 
+    """
+    def __init__(self, documentHandler=None, errorHandler=None):
+        self._tokenizer = tokenize2.Tokenizer()
+        if documentHandler:
+            self.setDocumentHandler(documentHandler)
+        else:
+            self.setDocumentHandler(DocumentHandler())
+
+        if errorHandler:
+            self.setErrorHandler(errorHandler)
+        else:
+            self.setErrorHandler(ErrorHandler())
+    
+    def parseString(self, cssText, encoding=None):
+        if isinstance(cssText, str):
+            cssText = codecs.getdecoder('css')(cssText, encoding=encoding)[0]
+        
+        tokens = self._tokenizer.tokenize(cssText, fullsheet=True)
+                
+        def COMMENT(val, line, col):
+            self._handler.comment(val[2:-2], line, col)
+
+        def EOF(val, line, col):
+            self._handler.endDocument(val, line, col)
+                
+        def simple(t):            
+            map = {'COMMENT': COMMENT,
+                   'S': lambda val, line, col: None,
+                   'EOF': EOF}
+            type_, val, line, col = t
+            if type_ in map:
+                map[type_](val, line, col)
+                return True
+            else:
+                return False
+                        
+        # START PARSING
+        t = tokens.next()
+        type_, val, line, col = t
+        
+        encoding = 'utf-8'                
+        if 'CHARSET_SYM' == type_:
+            # @charset "encoding";
+            # S
+            encodingtoken = tokens.next()
+            semicolontoken = tokens.next()
+            if 'STRING' == type_:
+                encoding = helper.stringvalue(val)
+            # ;
+            if 'STRING' == encodingtoken[0] and semicolontoken:
+                encoding = helper.stringvalue(encodingtoken[1])    
+            else:
+                self._errorHandler.fatal(u'Invalid @charset')
+                
+            t = tokens.next()
+            type_, val, line, col = t
+            
+        self._handler.startDocument(encoding)
+                
+        while True:
+            start = (line, col)
+            try:
+                if simple(t):
+                    pass
+
+                elif 'ATKEYWORD' == type_ or type_ in ('PAGE_SYM', 'MEDIA_SYM', 'FONT_FACE_SYM'):
+                    atRule = [val]
+                    braces = 0
+                    while True:
+                        # read till end ; 
+                        # TODO: or {}
+                        t = tokens.next()
+                        type_, val, line, col = t
+                        atRule.append(val) 
+                        if u';' == val and not braces:
+                            break
+                        elif u'{' == val:
+                            braces += 1
+                        elif u'}' == val:
+                            braces -= 1
+                            if braces == 0:
+                                break
+                            
+                    self._handler.ignorableAtRule(u''.join(atRule), *start)
+
+                elif 'IMPORT_SYM' == type_:
+                    # import URI or STRING media? name?
+                    uri, media, name = None, None, None
+                    while True:
+                        t = tokens.next()
+                        type_, val, line, col = t
+                        if 'STRING' == type_:
+                            uri = helper.stringvalue(val)
+                        elif 'URI' == type_:
+                            uri = helper.urivalue(val)
+                        elif u';' == val:
+                            break
+                    
+                    if uri:    
+                        self._handler.importStyle(uri, media, name)
+                    else:
+                        self._errorHandler.error(u'Invalid @import'
+                                                 u' declaration at %r' 
+                                                 % (start,))
+                        
+                elif 'NAMESPACE_SYM' == type_:
+                    prefix, uri = None, None
+                    while True:
+                        t = tokens.next()
+                        type_, val, line, col = t
+                        if 'IDENT' == type_:
+                            prefix = val
+                        elif 'STRING' == type_:
+                            uri = helper.stringvalue(val)
+                        elif 'URI' == type_:
+                            uri = helper.urivalue(val)
+                        elif u';' == val:
+                            break
+                    if uri:
+                        self._handler.namespaceDeclaration(prefix, uri, *start)
+                    else:
+                        self._errorHandler.error(u'Invalid @namespace'
+                                                 u' declaration at %r' 
+                                                 % (start,))
+    
+                else:
+                    # CSSSTYLERULE
+                    selector = []
+                    selectors = []
+                    while True:
+                        # selectors[, selector]* {
+                        if 'S' == type_:
+                            selector.append(u' ')
+                        elif simple(t):
+                            pass
+                        elif u',' == val:
+                            selectors.append(u''.join(selector).strip())
+                            selector = []
+                        elif u'{' == val:
+                            selectors.append(u''.join(selector).strip())
+                            self._handler.startSelector(selectors, *start)
+                            break
+                        else:
+                            selector.append(val)
+                            
+                        t = tokens.next()
+                        type_, val, line, col = t
+                                            
+                    end = None
+                    while True:
+                        # name: value [!important][;name: value [!important]]*;?
+                        name, value, important = None, [], False
+                        
+                        while True:
+                            # name:
+                            t = tokens.next()
+                            type_, val, line, col = t
+                            if 'S' == type_:
+                                pass
+                            elif simple(t):
+                                pass
+                            elif 'IDENT' == type_:
+                                if name:
+                                    self._errorHandler.error('more than one property name', t)
+                                else:
+                                    name = val
+                            elif u':' == val:
+                                if not name:
+                                    self._errorHandler.error('no property name', t)
+                                break
+                            elif u';' == val:
+                                self._errorHandler.error('premature end of property', t)
+                                end = val
+                                break
+                            elif u'}' == val:
+                                if name:
+                                    self._errorHandler.error('premature end of property', t)
+                                end = val
+                                break
+                            else:
+                                self._errorHandler.error('unexpected property name token %r' % val, t)
+
+                        while not u';' == end and not u'}' == end:
+                            # value !;}
+                            t = tokens.next()
+                            type_, val, line, col = t
+                            
+                            if 'S' == type_:
+                                value.append(u' ')
+                            elif simple(t):
+                                pass
+                            elif u'!' == val or u';' == val or u'}' == val:
+                                value = ''.join(value).strip()
+                                if not value:
+                                    self._errorHandler.error('premature end of property (no value)', t)
+                                end = val
+                                break
+                            else:
+                                value.append(val)
+
+                        while u'!' == end:
+                            # !important
+                            t = tokens.next()
+                            type_, val, line, col = t
+                            
+                            if simple(t):
+                                pass
+                            elif u'IDENT' == type_ and not important:
+                                important = True
+                            elif u';' == val or u'}' == val:
+                                end = val
+                                break
+                            else:
+                                self._errorHandler.error('unexpected priority token %r' % val)
+
+                        if name and value:
+                            self._handler.property(name, value, important)
+                            
+                        if u'}' == end:
+                            self._handler.endSelector(selectors, line=line, col=col)
+                            break
+                        else:
+                            # reset
+                            end = None
+
+                    else:
+                        self._handler.endSelector(selectors, line=line, col=col)
+
+                t = tokens.next()
+                type_, val, line, col = t
+
+            except StopIteration:
+                break
+            
+
+    
+    def setDocumentHandler(self, handler):
+        "Allow an application to register a document event `handler`."
+        self._handler = handler
+        
+    def setErrorHandler(self, handler):
+        "TODO"
+        self._errorHandler = handler
+        
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/parse.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/parse.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/parse.py	(revision 1126)
@@ -0,0 +1,236 @@
+#!/usr/bin/env python
+"""A validating CSSParser"""
+__all__ = ['CSSParser']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from helper import path2url
+import codecs
+import cssutils
+import os
+import sys
+import tokenize2
+import urllib
+
+from cssutils import css
+
+if sys.version_info < (2,6):
+    bytes = str
+
+class CSSParser(object):
+    """Parse a CSS StyleSheet from URL, string or file and return a DOM Level 2
+    CSS StyleSheet object.
+
+    Usage::
+
+        parser = CSSParser()
+        # optionally
+        parser.setFetcher(fetcher)
+        sheet = parser.parseFile('test1.css', 'ascii')
+        print sheet.cssText
+    """
+    def __init__(self, log=None, loglevel=None, raiseExceptions=None,
+                 fetcher=None, parseComments=True,
+                 validate=True):
+        """
+        :param log:
+            logging object
+        :param loglevel:
+            logging loglevel
+        :param raiseExceptions:
+            if log should simply log (default) or raise errors during
+            parsing. Later while working with the resulting sheets
+            the setting used in cssutils.log.raiseExeptions is used
+        :param fetcher:
+            see ``setFetcher(fetcher)``
+        :param parseComments:
+            if comments should be added to CSS DOM or simply omitted
+        :param validate:
+            if parsing should validate, may be overwritten in parse methods
+        """
+        if log is not None:
+            cssutils.log.setLog(log)
+        if loglevel is not None:
+            cssutils.log.setLevel(loglevel)
+
+        # remember global setting
+        self.__globalRaising = cssutils.log.raiseExceptions
+        if raiseExceptions:
+            self.__parseRaising = raiseExceptions
+        else:
+            # DEFAULT during parse
+            self.__parseRaising = False
+
+        self.__tokenizer = tokenize2.Tokenizer(doComments=parseComments)
+        self.setFetcher(fetcher)
+
+        self._validate = validate
+
+    def __parseSetting(self, parse):
+        """during parse exceptions may be handled differently depending on
+        init parameter ``raiseExceptions``
+        """
+        if parse:
+            cssutils.log.raiseExceptions = self.__parseRaising
+        else:
+            cssutils.log.raiseExceptions = self.__globalRaising
+
+    def parseStyle(self, cssText, encoding='utf-8', validate=None):
+        """Parse given `cssText` which is assumed to be the content of
+        a HTML style attribute.
+
+        :param cssText:
+            CSS string to parse
+        :param encoding:
+            It will be used to decode `cssText` if given as a (byte)
+            string.
+        :param validate:
+            If given defines if validation is used. Uses CSSParser settings as
+            fallback
+        :returns:
+            :class:`~cssutils.css.CSSStyleDeclaration`
+        """
+        self.__parseSetting(True)
+        if isinstance(cssText, bytes):
+            # TODO: use codecs.getdecoder('css') here?
+            cssText = cssText.decode(encoding)
+        if validate is None:
+            validate = self._validate
+        style = css.CSSStyleDeclaration(cssText, validating=validate)
+        self.__parseSetting(False)
+        return style
+
+    def parseString(self, cssText, encoding=None, href=None, media=None,
+                    title=None,
+                    validate=None):
+        """Parse `cssText` as :class:`~cssutils.css.CSSStyleSheet`.
+        Errors may be raised (e.g. UnicodeDecodeError).
+
+        :param cssText:
+            CSS string to parse
+        :param encoding:
+            If ``None`` the encoding will be read from BOM or an @charset
+            rule or defaults to UTF-8.
+            If given overrides any found encoding including the ones for
+            imported sheets.
+            It also will be used to decode `cssText` if given as a (byte)
+            string.
+        :param href:
+            The ``href`` attribute to assign to the parsed style sheet.
+            Used to resolve other urls in the parsed sheet like @import hrefs.
+        :param media:
+            The ``media`` attribute to assign to the parsed style sheet
+            (may be a MediaList, list or a string).
+        :param title:
+            The ``title`` attribute to assign to the parsed style sheet.
+        :param validate:
+            If given defines if validation is used. Uses CSSParser settings as
+            fallback
+        :returns:
+            :class:`~cssutils.css.CSSStyleSheet`.
+        """
+        self.__parseSetting(True)
+        # TODO: py3 needs bytes here!
+        if isinstance(cssText, bytes):
+            cssText = codecs.getdecoder('css')(cssText, encoding=encoding)[0]
+
+        if validate is None:
+            validate = self._validate
+
+        sheet = cssutils.css.CSSStyleSheet(href=href,
+                                           media=cssutils.stylesheets.MediaList(media),
+                                           title=title,
+                                           validating=validate)
+        sheet._setFetcher(self.__fetcher)
+        # tokenizing this ways closes open constructs and adds EOF
+        sheet._setCssTextWithEncodingOverride(self.__tokenizer.tokenize(cssText,
+                                                                        fullsheet=True),
+                                              encodingOverride=encoding)
+        self.__parseSetting(False)
+        return sheet
+
+    def parseFile(self, filename, encoding=None,
+                  href=None, media=None, title=None,
+                  validate=None):
+        """Retrieve content from `filename` and parse it. Errors may be raised
+        (e.g. IOError).
+
+        :param filename:
+            of the CSS file to parse, if no `href` is given filename is
+            converted to a (file:) URL and set as ``href`` of resulting
+            stylesheet.
+            If `href` is given it is set as ``sheet.href``. Either way
+            ``sheet.href`` is used to resolve e.g. stylesheet imports via
+            @import rules.
+        :param encoding:
+            Value ``None`` defaults to encoding detection via BOM or an
+            @charset rule.
+            Other values override detected encoding for the sheet at
+            `filename` including any imported sheets.
+        :returns:
+            :class:`~cssutils.css.CSSStyleSheet`.
+        """
+        if not href:
+            # prepend // for file URL, urllib does not do this?
+            #href = u'file:' + urllib.pathname2url(os.path.abspath(filename))
+            href = path2url(filename)
+
+        f = open(filename, 'rb')
+        css = f.read()
+        f.close()
+
+        return self.parseString(css,
+                                encoding=encoding, # read returns a str
+                                href=href, media=media, title=title,
+                                validate=validate)
+
+    def parseUrl(self, href, encoding=None, media=None, title=None,
+                 validate=None):
+        """Retrieve content from URL `href` and parse it. Errors may be raised
+        (e.g. URLError).
+
+        :param href:
+            URL of the CSS file to parse, will also be set as ``href`` of
+            resulting stylesheet
+        :param encoding:
+            Value ``None`` defaults to encoding detection via HTTP, BOM or an
+            @charset rule.
+            A value overrides detected encoding for the sheet at ``href``
+            including any imported sheets.
+        :returns:
+            :class:`~cssutils.css.CSSStyleSheet`.
+        """
+        encoding, enctype, text = cssutils.util._readUrl(href,
+                                                         fetcher=self.__fetcher,
+                                                         overrideEncoding=encoding)
+        if enctype == 5:
+            # do not use if defaulting to UTF-8
+            encoding = None
+
+        if text is not None:
+            return self.parseString(text, encoding=encoding,
+                                    href=href, media=media, title=title,
+                                    validate=validate)
+
+    def setFetcher(self, fetcher=None):
+        """Replace the default URL fetch function with a custom one.
+
+        :param fetcher:
+            A function which gets a single parameter
+
+            ``url``
+                the URL to read
+
+            and must return ``(encoding, content)`` where ``encoding`` is the
+            HTTP charset normally given via the Content-Type header (which may
+            simply omit the charset in which case ``encoding`` would be
+            ``None``) and ``content`` being the string (or unicode) content.
+
+            The Mimetype should be 'text/css' but this has to be checked by the
+            fetcher itself (the default fetcher emits a warning if encountering
+            a different mimetype).
+
+            Calling ``setFetcher`` with ``fetcher=None`` resets cssutils
+            to use its default function.
+        """
+        self.__fetcher = fetcher
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tokenize2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tokenize2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tokenize2.py	(revision 1126)
@@ -0,0 +1,223 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""New CSS Tokenizer (a generator)
+"""
+__all__ = ['Tokenizer', 'CSSProductions']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssproductions import *
+from helper import normalize
+import itertools
+import re
+import sys
+
+_TOKENIZER_CACHE = {}
+
+class Tokenizer(object):
+    """
+    generates a list of Token tuples:
+        (Tokenname, value, startline, startcolumn)
+    """
+    _atkeywords = {
+        u'@font-face': CSSProductions.FONT_FACE_SYM,
+        u'@import': CSSProductions.IMPORT_SYM,
+        u'@media': CSSProductions.MEDIA_SYM,
+        u'@namespace': CSSProductions.NAMESPACE_SYM,
+        u'@page': CSSProductions.PAGE_SYM,
+        u'@variables': CSSProductions.VARIABLES_SYM
+        }
+    _linesep = u'\n'
+    unicodesub = re.compile(r'\\[0-9a-fA-F]{1,6}(?:\r\n|[\t\r\n\f\x20])?').sub
+    cleanstring = re.compile(r'\\((\r\n)|[\n\r\f])').sub
+
+    def __init__(self, macros=None, productions=None, doComments=True):
+        """
+        inits tokenizer with given macros and productions which default to
+        cssutils own macros and productions
+        """
+        if isinstance(macros, dict):
+            macros_hash_key = sorted(macros.items())
+        else:
+            macros_hash_key = macros
+        hash_key = str((macros_hash_key, productions))
+        if hash_key in _TOKENIZER_CACHE:
+            (tokenmatches, commentmatcher, urimatcher) = _TOKENIZER_CACHE[hash_key]
+        else:
+            if not macros:
+                macros = MACROS
+            if not productions:
+                productions = PRODUCTIONS
+            tokenmatches = self._compile_productions(self._expand_macros(macros,
+                                                                         productions))
+            commentmatcher = [x[1] for x in tokenmatches if x[0] == 'COMMENT'][0]
+            urimatcher = [x[1] for x in tokenmatches if x[0] == 'URI'][0]
+            _TOKENIZER_CACHE[hash_key] = (tokenmatches, commentmatcher, urimatcher)
+
+        self.tokenmatches = tokenmatches
+        self.commentmatcher = commentmatcher
+        self.urimatcher = urimatcher
+
+        self._doComments = doComments
+        self._pushed = []
+
+    def _expand_macros(self, macros, productions):
+        """returns macro expanded productions, order of productions is kept"""
+        def macro_value(m):
+            return '(?:%s)' % macros[m.groupdict()['macro']]
+        expanded = []
+        for key, value in productions:
+            while re.search(r'{[a-zA-Z][a-zA-Z0-9-]*}', value):
+                value = re.sub(r'{(?P<macro>[a-zA-Z][a-zA-Z0-9-]*)}',
+                               macro_value, value)
+            expanded.append((key, value))
+        return expanded
+
+    def _compile_productions(self, expanded_productions):
+        """compile productions into callable match objects, order is kept"""
+        compiled = []
+        for key, value in expanded_productions:
+            compiled.append((key, re.compile('^(?:%s)' % value, re.U).match))
+        return compiled
+
+    def push(self, *tokens):
+        """Push back tokens which have been pulled but not processed."""
+        self._pushed = itertools.chain(tokens, self._pushed)
+
+    def clear(self):
+        self._pushed = []
+
+    def tokenize(self, text, fullsheet=False):
+        """Generator: Tokenize text and yield tokens, each token is a tuple
+        of::
+
+            (name, value, line, col)
+
+        The token value will contain a normal string, meaning CSS unicode
+        escapes have been resolved to normal characters. The serializer
+        escapes needed characters back to unicode escapes depending on
+        the stylesheet target encoding.
+
+        text
+            to be tokenized
+        fullsheet
+            if ``True`` appends EOF token as last one and completes incomplete
+            COMMENT or INVALID (to STRING) tokens
+        """
+        def _repl(m):
+            "used by unicodesub"
+            num = int(m.group(0)[1:], 16)
+            if num <= sys.maxunicode:
+                return unichr(num)
+            else:
+                return m.group(0)
+
+        def _normalize(value):
+            "normalize and do unicodesub"
+            return normalize(self.unicodesub(_repl, value))
+
+        line = col = 1
+
+        # check for BOM first as it should only be max one at the start
+        (BOM, matcher), productions = self.tokenmatches[0], self.tokenmatches[1:]
+        match = matcher(text)
+        if match:
+            found = match.group(0)
+            yield (BOM, found, line, col)
+            text = text[len(found):]
+
+        # check for @charset which is valid only at start of CSS
+        if text.startswith('@charset '):
+            found = '@charset ' # production has trailing S!
+            yield (CSSProductions.CHARSET_SYM, found, line, col)
+            text = text[len(found):]
+            col += len(found)
+
+        while text:
+            # do pushed tokens before new ones
+            for pushed in self._pushed:
+                yield pushed
+
+            # speed test for most used CHARs, sadly . not possible :(
+            c = text[0]
+            if c in u',:;{}>[]': # + but in num!
+                yield ('CHAR', c, line, col)
+                col += 1
+                text = text[1:]
+
+            else:
+                # check all other productions, at least CHAR must match
+                for name, matcher in productions:
+
+                    # TODO: USE bad comment?
+                    if fullsheet and name == 'CHAR' and text.startswith(u'/*'):
+                        # before CHAR production test for incomplete comment
+                        possiblecomment = u'%s*/' % text
+                        match = self.commentmatcher(possiblecomment)
+                        if match and self._doComments:
+                            yield ('COMMENT', possiblecomment, line, col)
+                            text = None # ate all remaining text
+                            break
+
+                    match = matcher(text) # if no match try next production
+                    if match:
+                        found = match.group(0) # needed later for line/col
+                        if fullsheet:
+                            # check if found may be completed into a full token
+                            if 'INVALID' == name and text == found:
+                                # complete INVALID to STRING with start char " or '
+                                name, found = 'STRING', '%s%s' % (found, found[0])
+
+                            elif 'FUNCTION' == name and\
+                                 u'url(' == _normalize(found):
+                                # url( is a FUNCTION if incomplete sheet
+                                # FUNCTION production MUST BE after URI production
+                                for end in (u"')", u'")', u')'):
+                                    possibleuri = '%s%s' % (text, end)
+                                    match = self.urimatcher(possibleuri)
+                                    if match:
+                                        name, found = 'URI', match.group(0)
+                                        break
+
+                        if name in ('DIMENSION', 'IDENT', 'STRING', 'URI',
+                                    'HASH', 'COMMENT', 'FUNCTION', 'INVALID',
+                                    'UNICODE-RANGE'):
+                            # may contain unicode escape, replace with normal
+                            # char but do not _normalize (?)
+                            value = self.unicodesub(_repl, found)
+                            if name in ('STRING', 'INVALID'): #'URI'?
+                                # remove \ followed by nl (so escaped) from string
+                                value = self.cleanstring('', value)
+
+                        else:
+                            if 'ATKEYWORD' == name:
+                                try:
+                                    # get actual ATKEYWORD SYM
+                                    name = self._atkeywords[_normalize(found)]
+                                except KeyError, e:
+                                    # might also be misplace @charset...
+                                    if '@charset' == found and u' ' == text[len(found):len(found)+1]:
+                                        # @charset needs tailing S!
+                                        name = CSSProductions.CHARSET_SYM
+                                        found += u' '
+                                    else:
+                                        name = 'ATKEYWORD'
+
+                            value = found # should not contain unicode escape (?)
+
+                        if self._doComments or (not self._doComments and
+                                                name != 'COMMENT'):
+                            yield (name, value, line, col)
+
+                        text = text[len(found):]
+                        nls = found.count(self._linesep)
+                        line += nls
+                        if nls:
+                            col = len(found[found.rfind(self._linesep):])
+                        else:
+                            col += len(found)
+
+                        break
+
+        if fullsheet:
+            yield ('EOF', u'', line, col)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_profiles.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_profiles.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_profiles.py	(revision 1126)
@@ -0,0 +1,542 @@
+"""Testcases for cssutils.css.CSSValue and CSSPrimitiveValue."""
+__version__ = '$Id: test_cssvalue.py 1443 2008-08-31 13:54:39Z cthedot $'
+
+import sys
+import basetest
+import cssutils
+
+CSS2 = (cssutils.profile.CSS_LEVEL_2,)
+C3BUI = (cssutils.profile.CSS3_BASIC_USER_INTERFACE,)
+C3BB = (cssutils.profile.CSS3_BACKGROUNDS_AND_BORDERS,)
+CM3 = (cssutils.profile.CSS3_COLOR,)
+FM3 = (cssutils.profile.CSS3_FONTS,)
+C3PM = (cssutils.profile.CSS3_PAGED_MEDIA,)
+C3T = (cssutils.profile.CSS3_TEXT,)
+FM3FF = (cssutils.profile.CSS3_FONT_FACE,)
+CSS2_CM3 = (CM3[0], CSS2[0])
+CSS2_FM3 = (FM3[0], CSS2[0])
+
+
+class ProfilesTestCase(basetest.BaseTestCase):
+    M1 = {
+          'testvalue': 'x'
+          }
+    P1 = {
+        '-test-tokenmacro': '({num}{w}){1,2}', 
+        '-test-macro': '{ident}|{percentage}',
+        '-test-custommacro': '{testvalue}',
+        # custom validation function 
+        '-test-funcval': lambda(v): int(v) > 0 
+        }  
+
+    def test_knownNames(self):
+        "Profiles.knownNames"
+        p = cssutils.profiles.Profiles()
+        p.removeProfile(all=True)
+        p.addProfile('test', self.P1, self.M1)
+        self.assertEqual(p.knownNames, self.P1.keys())
+        p.removeProfile(all=True)
+        self.assertEqual(p.knownNames, [])
+        
+    def test_profiles(self):
+        "Profiles.profiles"
+        p = cssutils.profiles.Profiles()
+        p.removeProfile(all=True)
+        p.addProfile('test', self.P1, self.M1)
+        self.assertEqual(p.profiles, ['test'])
+        p.removeProfile(all=True)
+        self.assertEqual(p.profiles, [])
+
+    def test_validate2(self):
+        "Profiles.validate()"
+        #save
+        saved = cssutils.profile
+        
+        # test        
+        p = cssutils.profiles.Profiles()
+        cssutils.profile = p
+        
+        pvs = [('color', 'red'),
+               ('color', 'rgba(0,0,0,0)'),
+               ('color', 'XXX')
+               ]
+        
+        def check(*results):
+            for i, pv in enumerate(pvs):
+                self.assertEqual(p.validate(*pv), results[i])
+                        
+        check(True, True, False)
+
+        p.removeProfile(p.CSS3_COLOR)
+        check(True, False, False)
+
+        cssutils.profile.addProfile('test', {}, {'color': 'XXX'})
+        check(False, False, True)
+
+        p.removeProfile(all=True)
+        check(False, False, False)
+
+        # TODO: validateWithProfile
+        
+        # restore
+        cssutils.profile = saved
+
+    def test_addProfile(self):
+        "Profiles.addProfile with custom validation function"
+        # unknown profile
+        self.assertRaises(cssutils.profiles.NoSuchProfileException, 
+                          lambda: list(cssutils.profile.propertiesByProfile('NOTSET')) )
+
+        # new profile
+        cssutils.profile.addProfile('test', self.P1, self.M1)
+        
+        props = self.P1.keys()
+        props.sort()
+        self.assertEqual(props, list(cssutils.profile.propertiesByProfile('test')))
+        
+        cssutils.log.raiseExceptions = False
+        tests = {
+            ('-test-tokenmacro', '1'): True,     
+            ('-test-tokenmacro', '1 -2'): True,     
+            ('-test-tokenmacro', '1 2 3'): False,     
+            ('-test-tokenmacro', 'a'): False,     
+            ('-test-macro', 'a'): True,     
+            ('-test-macro', '0.1%'): True,
+            ('-test-custommacro', 'x'): True,     
+            ('-test-custommacro', '1'): False,     
+            ('-test-custommacro', 'y'): False,     
+            ('-test-funcval', '1'): True,     
+            ('-test-funcval', '-1'): False,     
+            ('-test-funcval', 'x'): False     
+            }
+        for test, v in tests.items():
+            self.assertEqual(v, cssutils.profile.validate(*test))
+            
+            self.assertEqual((v, v, ['test']), 
+                             cssutils.profile.validateWithProfile(*test))
+            
+        cssutils.log.raiseExceptions = True
+        
+        # raises:
+        expmsg = u"invalid literal for int() with base 10: 'x'"        
+        # Python upto 2.4 and Jython have different msg format...
+        if sys.version_info[0:2] == (2,4):
+            expmsg = u"invalid literal for int(): x" 
+        elif sys.platform.startswith('java'):
+            expmsg = u"invalid literal for int() with base 10: x"
+            
+        self.assertRaisesMsg(Exception, expmsg, 
+                             cssutils.profile.validate, u'-test-funcval', u'x')
+
+    def test_removeProfile(self):
+        "Profiles.removeProfile()"
+        p = cssutils.profiles.Profiles()
+        self.assertEqual(9, len(p.profiles))
+        p.removeProfile(p.CSS_LEVEL_2)
+        self.assertEqual(8, len(p.profiles))
+        p.removeProfile(all=True)
+        self.assertEqual(0, len(p.profiles))
+
+    # TODO: FIX
+#    def test_validateWithProfile(self):
+#        "Profiles.validate(), Profiles.validateWithProfile()"
+#        p = cssutils.profiles.Profiles()
+#        tests = {
+#            ('color', 'red', None): (True, True, [p.CSS_LEVEL_2]),
+#            ('color', 'red', p.CSS_LEVEL_2): (True, True,[p.CSS_LEVEL_2]),
+#            ('color', 'red', p.CSS3_COLOR): (True, False, [p.CSS_LEVEL_2]),
+#            ('color', 'rgba(0,0,0,0)', None): (True, True, [p.CSS3_COLOR]),
+#            ('color', 'rgba(0,0,0,0)', p.CSS_LEVEL_2): (True, False, [p.CSS3_COLOR]),
+#            ('color', 'rgba(0,0,0,0)', p.CSS3_COLOR): (True, True, [p.CSS3_COLOR]),
+#            ('color', '1px', None): (False, False, [p.CSS3_COLOR, p.CSS_LEVEL_2]),
+#            ('color', '1px', p.CSS_LEVEL_2): (False, False, [p.CSS3_COLOR, p.CSS_LEVEL_2]),
+#            ('color', '1px', p.CSS3_COLOR): (False, False, [p.CSS3_COLOR, p.CSS_LEVEL_2]),
+#            ('color', 'aliceblue', None): (True, True, [p.CSS_LEVEL_2]),
+#
+#            ('opacity', '1', None): (True, True, [p.CSS3_COLOR]),
+#            ('opacity', '1', p.CSS_LEVEL_2): (True, False, [p.CSS3_COLOR]),
+#            ('opacity', '1', p.CSS3_COLOR): (True, True, [p.CSS3_COLOR]),
+#            ('opacity', '1px', None): (False, False, [p.CSS3_COLOR]),
+#            ('opacity', '1px', p.CSS_LEVEL_2): (False, False, [p.CSS3_COLOR]),
+#            ('opacity', '1px', p.CSS3_COLOR): (False, False, [p.CSS3_COLOR]),
+#
+#            ('-x', '1', None): (False, False, []),
+#            ('-x', '1', p.CSS_LEVEL_2): (False, False, []),
+#            ('-x', '1', p.CSS3_COLOR): (False, False, []),
+#        }
+#        for test, r in tests.items():
+#            self.assertEqual(p.validate(test[0], test[1]), r[0])
+#            self.assertEqual(p.validateWithProfile(*test), r)
+           
+    def test_propertiesByProfile(self):
+        "Profiles.propertiesByProfile"
+        self.assertEqual(['opacity'], #'color',  
+                         list(cssutils.profile.propertiesByProfile(
+                                            cssutils.profile.CSS3_COLOR)))
+        
+    def test_csscolorlevel3(self):
+        "CSS Color Module Level 3"
+        # (propname, propvalue): (valid, validprofile)
+        namedcolors = '''transparent, orange,
+                         aqua, black, blue, fuchsia, gray, green, lime, maroon,
+                         navy, olive, purple, red, silver, teal, white, yellow'''
+        for color in namedcolors.split(','):
+            color = color.strip()            
+            self.assertEqual(True, cssutils.profile.validate('color', color))
+            
+            self.assertEqual((True, True, list(CSS2)), 
+                             cssutils.profile.validateWithProfile('color', color))
+
+            # CSS2 only:
+        uicolor = 'ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText'
+        for color in uicolor.split('|'):
+            self.assertEqual(False, cssutils.profile.validate('color', color))
+            
+            # TODO: Fix
+            #self.assertEqual((True, True, list(CSS2)), 
+            #                 cssutils.profile.validateWithProfile('color', color))
+        
+    def test_validate(self):
+        "Profiles.validate()"
+        tests = {
+            # name, values: valid, matching, profile
+            
+            # background-position
+            ('background-position', ('inherit',
+                                     '0',
+                                     '1%',
+                                     '1px',
+                                     '0 0',
+                                     '1% 1%',
+                                     '1px 1px',
+                                     '1px 1%',
+                                     'top', 'bottom',
+                                     'left', 'right',
+                                     'center center',
+                                     'center',
+                                     'top left', 'top center', 'top right',
+                                     'bottom left', 'bottom center', 'bottom right',
+                                     'center left', 'center center', 'center right',
+                                     '0 center', 'center 0',
+                                     '0 top', '10% bottom',
+                                     'left 0', 'right 10%',
+                                     '1% center', 'center 1%'
+                                     )): (True, True, CSS2),
+            ('background-position', ('0 left',
+                                     'top 0'
+                                     )): (False, False, CSS2),
+
+
+            ('border-top-right-radius', ('1px',
+                                         '1%',
+                                         '1% -1px',
+                                         '1% 0',
+                                         )): (True, True, C3BB),
+            ('border-top-right-radius', ('1px 2px 2px', 
+                                         '/ 1px',
+                                         'black')): (False, False, C3BB),
+
+            ('border-radius', ('1px',
+                               '1%',
+                               '0',
+                               '1px 1px', 
+                               '1px/ 1px', 
+                               '1px /1px', 
+                               '1px  /  1px', 
+                               '1px 1px 1px 1px',
+                               '1px 1px 1px 1px / 1px 1px 1px 1px',
+                               )): (True, True, C3BB),
+            ('border-radius', ('1px /', 
+                               '/ 1px',
+                               '1px / 1px / 1px',
+                               '1px 1px 1px 1px 1px',
+                               '1px / 1px 1px 1px 1px 1px',
+                               'black')): (False, False, C3BB),
+
+            ('border', ('1px',
+                        'solid',
+                        'red',
+                        '1px solid red',
+                        '1px red solid',
+                        'red 1px solid',
+                        'red solid 1px',
+                        'solid 1px red',
+                        'solid red 1px',
+                               )): (True, True, C3BB),
+            ('border', ('1px 1px', 
+                        'red red 1px',
+                        )): (False, False, C3BB),
+            
+            ('box-shadow', ('none',
+                            '1px 1px', 
+                            '1px 1px 1px',
+                            '1px 1px 1px 1px',
+                            '1px 1px 1px 1px red',
+                            'inset 1px 1px',
+                            'inset 1px 1px 1px 1px black')): (True, True, C3BB),
+            ('box-shadow', ('1px', 
+                            '1px 1px 1px 1px 1px',
+                            'x 1px 1px',
+                            'inset',
+                            '1px black',
+                            'black')): (False, False, C3BB),
+            
+            # color
+            ('color', ('x',
+                       '#',
+                       '#0',
+                       '#00',
+                       '#0000',
+                       '#00000',
+                       '#0000000',
+                       '#00j',
+                       '#j00000',
+                       'rgb(0.0,1,1)',
+                       'rgb(0)',
+                       'rgb(0, 1)',
+                       'rgb(0, 1, 1, 1)',
+                       'rgb(0, 1, 0%)',
+                       'rgba(0)',
+                       'rgba(0, 1, 1.0, 1)',
+                       'rgba(0, 1)',
+                       'rgba(0, 1, 1, 1, 1)',
+                       'rgba(100%, 0%, 0%, 1%)',
+                       'rgba(100%, 0%, 0, 1)',
+                       'hsl(1.5,1%,1%)',
+                       'hsl(1,1,1%)',
+                       'hsl(1,1%,1)',
+                       'hsla(1.5,1%,1%, 1)',
+                       'hsla(1,1,1%, 1)',
+                       'hsla(1,1%,1, 1)',
+                       'hsla(1,1%,1%, 1%)'
+                       )): (False,False, CSS2_CM3),
+            ('color', ('inherit',
+                       'black',
+                       '#000',
+                       '#000000',
+                       'rgb(0,1,1)',
+                       'rgb( 0 , 1 , 1 )',
+                       'rgb(-10,555,1)',
+                       'rgb(100%, 1.5%, 0%)',
+                       'rgb(150%, -20%, 0%)',
+                       )): (True, True, CSS2),
+            ('color', ('currentcolor',
+                       'aliceblue',
+                       'rgba(1,1,1,1)',
+                       'rgba( 1 , 1 , 1 , 1 )',
+                       'rgba(100%, 0%, 0%, 1)',
+                       'hsl(1,1%,1%)',
+                       'hsl( 1 , 1% , 1% )',
+                       'hsl(-1000,555.5%,-61.5%)',
+                       'hsla(1,1%,1%,1)',
+                       'hsla( 1, 1% , 1% , 1 )',
+                       'hsla(-1000,555.5%,-61.5%, 0.5)'                      
+                       )): (True, True, CM3),
+            # TODO?:
+            #('color', 'rgb(/**/ 0 /**/ , /**/ 1 /**/ , /**/ 1 /**/ )'): (True, True, CSS2),
+
+            # content
+            ('content', ('none', 
+                         'normal',
+                         '""',
+                         "'x'",
+                         )): (True, True, CSS2),
+
+            ('cursor', ('url(1), auto', 
+                        'url(1) 2 3, help',
+                        'wait',
+                        'inherit',
+                        'none')): (True, True, C3BUI),
+            ('cursor', ('url(1), auto, wait', 
+                        'url(1) 2, help',
+                        '1')): (False, False, C3BUI),
+            
+            # FONTS
+            ('font-family', ('serif, x',
+                             )): (True, True, CSS2), #CSS2_FM3),
+                             
+            ('font-family', ('inherit',
+                             'a, b',
+                             'a,b,c',
+                             'a, "b", c',
+                             '"a", b, "c"',
+                             '"a", "b", "c"',
+                             '"x y"',
+                             'serif',
+                             '"serif"', # valid but CSS2: font with name serif, CSS3: same as `serif`
+                             'a  b', # should use quotes but valid
+                             'a, b   b, d',
+                             )): (True, True, CSS2),
+
+            ('font-weight', ('normal', 'bold', 'bolder', 'lighter', 'inherit', 
+                             '100', '200', '300', '400', '500', '600', '700', '800', '900'
+                             )): (True, True, CSS2),
+
+            ('font-stretch', ('normal', 'wider', 'narrower', 'ultra-condensed',
+                              'extra-condensed', 'condensed', 'semi-condensed',
+                              'semi-expanded', 'expanded', 'extra-expanded',
+                              'ultra-expanded', 'inherit'                          
+                             )): (True, True, FM3),
+
+            ('font-style', ('normal', 'italic', 'oblique', 'inherit'
+                             )): (True, True, CSS2),
+
+            ('font-variant', ('normal', 'small-caps', 'inherit'
+                             )): (True, True, CSS2),
+            ('font-size', ('-1em',
+                           )): (False, False, CSS2),
+            ('font-size', ('xx-small', 'x-small', 'small', 'medium', 'large', 
+                           'x-large', 'xx-large', 'larger', 'smaller', 
+                           '1em', '1%', 'inherit'
+                           )): (True, True, CSS2),
+
+            ('font-size-adjust', ('1.0', 
+                                  'none', 'inherit'
+                                  )): (True, True, FM3),
+
+            ('font', ('italic small-caps bold 1px/3 a, "b", serif',
+                      '12pt/14pt sans-serif',
+                      '80% sans-serif',
+                      'x-large/110% "new century schoolbook", serif',
+                      'bold italic large Palatino, serif',
+                      'normal small-caps 120%/120% fantasy',                     
+                      'oblique 12pt "Helvetica Nue", serif', 
+                      'caption', 'icon', 'menu', 'message-box', 'small-caption',
+                      'status-bar', 'inherit'
+                      )): (True, True, CSS2),
+            
+            ('nav-index', ('1', 'auto', 'inherit')): (True, True, C3BUI),
+            ('nav-index', ('x', '1 2', '1px')): (False, False, C3BUI),
+            
+            ('opacity', ('inherit',
+                         '0', '0.0', '0.42342', '1', '1.0',
+                         # should be clipped but valid
+                         '-0', '-0.1', '-10', '2'
+                         )): (True, True, CM3),
+            ('opacity', ('a', '#000', '+1')): (False, False, CM3),
+
+            ('outline', ('red dotted 1px', 
+                         'dotted 1px red',
+                         '1px red dotted',
+                         'red', '1px', 'dotted',
+                         'red 1px', '1px dotted', 'red dotted',
+                         'inherit'
+                               )): (True, True, C3BUI),
+            ('outline', ('red #fff', 'solid dotted', 'Url(x)', '1px 1px'
+                               )): (False, False, C3BUI),
+            ('outline-color', ('red', '#fff', 'inherit'
+                               )): (True, True, C3BUI),
+            ('outline-color', ('0', '1em'
+                               )): (False, False, C3BUI),
+            ('outline-offset', ('0', '1em', 'inherit'
+                               )): (True, True, C3BUI),
+            ('outline-offset', ('1%', 'red'
+                               )): (False, False, C3BUI),
+            ('outline-style', ('auto', 'dotted', 'inherit'
+                               )): (True, True, C3BUI),
+            ('outline-style', ('0', '1em', 'red'
+                               )): (False, False, C3BUI),
+            ('outline-width', ('0', '1em', 'inherit'
+                               )): (True, True, C3BUI),
+            ('outline-width', ('auto', 'red', 'dotted'
+                               )): (False, False, C3BUI),
+            
+            ('resize', ('none', 
+                        'both', 
+                        'horizontal', 
+                        'vertical',
+                        'inherit')): (True, True, C3BUI),
+            ('resize', ('1', 
+                        'auto', 
+                        '1px', 
+                        '2%')): (False, False, C3BUI),
+
+            ('size', ('1cm',
+                      '1mm 20cm',
+                      'auto',
+                      'landscape letter', 
+                      'a4 portrait', 
+                      'landscape', 
+                      'a5', 
+                      #'inherit'
+                      )): (True, True, C3PM),
+            ('size', ( 
+                      'portrait landscape', 
+                      'a5 letter', 
+                      '2%')): (False, False, C3PM),
+
+            ('src', ('url(  a  )',
+                     'local(  x  )',
+                     'local("x")',
+                     'local(  "x"  )',
+                     'url(../fonts/LateefRegAAT.ttf) format(  "truetype-aat"  )',
+                     'url(a) format(  "123x"  , "a"   )',
+                     'url(a) format( "123x"  , "a"   ), url(a) format( "123x"  , "a"   )',
+                     'local(HiraKakuPro-W3), local(Meiryo), local(IPAPGothic)',
+                     'local(Gentium), url(/fonts/Gentium.ttf)',
+                     'local("Gentium"), url("/fonts/Gentium.ttf")',
+                     'local(Futura-Medium), url(fonts.svg#MyGeometricModern) format("svg")',
+                    )): (True, True, FM3FF),
+
+
+            ('text-shadow', ('none',
+                            '1px 1px', 
+                            '1px 1px 1px',
+                            '1px 1px 1px 1px',
+                            '1px 1px 1px 1px red',
+                            'inset 1px 1px',
+                            'inset 1px 1px 1px 1px black')): (True, True, C3T),
+            ('text-shadow', ('1px', 
+                            '1px 1px 1px 1px 1px',
+                            'x 1px 1px',
+                            'inset',
+                            '1px black',
+                            'black')): (False, False, C3T),
+
+            ('unicode-range', ('u+1', 'U+111111-ffffff',
+                               'u+123456  ,  U+1-f'
+                               )): (True, True, FM3FF),
+        
+        }
+        # TODO!!!
+        for (name, values), (valid, matching, profile) in tests.items(): 
+            for value in values:
+                self.assertEqual(valid, cssutils.profile.validate(name, value))
+                
+                
+#                if (valid, matching, list(profile)) != cssutils.profile.validateWithProfile(name, value):
+#                    print
+#                    print '###############', name, value
+#                    print (valid, matching, list(profile)), cssutils.profile.validateWithProfile(name, value)
+             
+             # TODO: fix                       
+#                self.assertEqual((valid, matching, list(profile)), 
+#                                 cssutils.profile.validateWithProfile(name, value))
+
+     # TODO: fix                       
+#    def test_validateByProfile(self):
+#        "Profiles.validateByProfile()"
+#        # testing for valid values overwritten in a profile
+#        tests = {
+#            (FM3FF, 'font-family', ('y', '"y"' # => name should be "y"!!!
+#                                     )): (True, True, FM3FF),    
+#            (FM3FF, 'font-family', ('"y", "a"', 'a, b', 'a a'
+#                                     )): (True, False, CSS2),    
+#            (FM3FF, 'font-stretch', ('normal', 'wider', 'narrower', 'inherit'
+#                                     )): (True, False, FM3),    
+#            (FM3FF, 'font-style', ('inherit',
+#                                     )): (True, False, CSS2),    
+#            (FM3FF, 'font-weight', ('bolder', 'lighter', 'inherit',
+#                                     )): (True, False, CSS2),    
+#            }
+#        for (profiles, name, values), (v, m, p) in tests.items():            
+#            for value in values:
+#                self.assertEqual((v, m, list(p)), 
+#                                 cssutils.profile.validateWithProfile(name, 
+#                                                                      value, 
+#                                                                      profiles))
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssfontfacerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssfontfacerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssfontfacerule.py	(revision 1126)
@@ -0,0 +1,241 @@
+"""Testcases for cssutils.css.CSSFontFaceRule"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class CSSFontFaceRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSFontFaceRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSFontFaceRule()
+        self.rRO = cssutils.css.CSSFontFaceRule(readonly=True)
+        self.r_type = cssutils.css.CSSFontFaceRule.FONT_FACE_RULE#
+        self.r_typeString = 'FONT_FACE_RULE'
+
+    def test_init(self):
+        "CSSFontFaceRule.__init__()"
+        super(CSSFontFaceRuleTestCase, self).test_init()
+
+        r = cssutils.css.CSSFontFaceRule()
+        self.assertTrue(isinstance(r.style, cssutils.css.CSSStyleDeclaration))
+        self.assertEqual(r, r.style.parentRule)
+
+        # until any properties
+        self.assertEqual(u'', r.cssText)
+
+        # only possible to set @... similar name
+        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
+
+        def checkrefs(ff):
+            self.assertEqual(ff, ff.style.parentRule)
+            for p in ff.style:
+                self.assertEqual(ff.style, p.parent)
+
+        checkrefs(cssutils.css.CSSFontFaceRule(
+                    style=cssutils.css.CSSStyleDeclaration('font-family: x')))
+        
+        r = cssutils.css.CSSFontFaceRule()
+        r.cssText = '@font-face { font-family: x }'
+        checkrefs(r)
+        
+        r = cssutils.css.CSSFontFaceRule()
+        r.style.setProperty('font-family', 'y')
+        checkrefs(r)
+
+        r = cssutils.css.CSSFontFaceRule()
+        r.style['font-family'] = 'z'
+        checkrefs(r)
+
+        r = cssutils.css.CSSFontFaceRule()
+        r.style.fontFamily = 'a'
+        checkrefs(r)
+
+    def test_cssText(self):
+        "CSSFontFaceRule.cssText"
+        tests = {
+            u'''@font-face {
+    font-family: x;
+    src: url(../fonts/LateefRegAAT.ttf) format("truetype-aat"), url(../fonts/LateefRegOT.ttf) format("opentype");
+    font-style: italic;
+    font-weight: 500;
+    font-stretch: condensed;
+    unicode-range: u+1-ff, u+111
+    }''': None,
+            u'@font-face{font-family: x;}': u'@font-face {\n    font-family: x\n    }',
+            u'@font-face  {  font-family: x;  }': u'@font-face {\n    font-family: x\n    }',
+            u'@f\\ont\\-face{font-family : x;}': u'@font-face {\n    font-family: x\n    }',
+            # comments
+            u'@font-face/*1*//*2*/{font-family: x;}':
+                u'@font-face /*1*/ /*2*/ {\n    font-family: x\n    }',
+            # WS
+            u'@font-face\n\t\f {\n\t\f font-family:x;\n\t\f }': 
+                u'@font-face {\n    font-family: x\n    }',
+            }
+        self.do_equal_r(tests)
+        self.do_equal_p(tests)
+
+        tests = {
+            u'@font-face;': xml.dom.SyntaxErr,
+            u'@font-face }': xml.dom.SyntaxErr,
+            }
+        self.do_raise_p(tests) # parse
+        tests.update({
+            u'@font-face {': xml.dom.SyntaxErr, # no }
+            # trailing
+            u'@font-face {}1': xml.dom.SyntaxErr, 
+            u'@font-face {}/**/': xml.dom.SyntaxErr, 
+            u'@font-face {} ': xml.dom.SyntaxErr, 
+            })
+        self.do_raise_r(tests) # set cssText
+
+    def test_style(self):
+        "CSSFontFaceRule.style (and references)"
+        r = cssutils.css.CSSFontFaceRule()
+        s1 = r.style
+        self.assertEqual(r, s1.parentRule)
+        self.assertEqual(u'', s1.cssText)
+        
+        # set rule.cssText
+        r.cssText = '@font-face { font-family: x1 }'
+        self.assertNotEqual(r.style, s1)
+        self.assertEqual(r, r.style.parentRule)
+        self.assertEqual(r.cssText, u'@font-face {\n    font-family: x1\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: x1')
+        self.assertEqual(s1.cssText, u'')
+        s2 = r.style
+        
+        # set invalid rule.cssText
+        try: 
+            r.cssText = '@font-face { $ }'
+        except xml.dom.SyntaxErr, e:
+            pass
+        self.assertEqual(r.style, s2)
+        self.assertEqual(r, s2.parentRule)
+        self.assertEqual(r.cssText, u'@font-face {\n    font-family: x1\n    }')
+        self.assertEqual(s2.cssText, u'font-family: x1')
+        self.assertEqual(r.style.cssText, u'font-family: x1')
+
+        # set rule.style.cssText
+        r.style.cssText = 'font-family: x2'
+        self.assertEqual(r.style, s2)
+        self.assertEqual(r, s2.parentRule)
+        self.assertEqual(r.cssText, u'@font-face {\n    font-family: x2\n    }')
+        self.assertEqual(s2.cssText, u'font-family: x2')
+        self.assertEqual(r.style.cssText, u'font-family: x2')
+
+        # set new style object s2
+        sn = cssutils.css.CSSStyleDeclaration('font-family: y1')
+        r.style = sn
+        self.assertEqual(r.style, sn)
+        self.assertEqual(r, sn.parentRule)
+        self.assertEqual(r.cssText, u'@font-face {\n    font-family: y1\n    }')
+        self.assertEqual(sn.cssText, u'font-family: y1')
+        self.assertEqual(r.style.cssText, u'font-family: y1')
+        self.assertEqual(s2.cssText, u'font-family: x2') # old
+
+        # set s2.cssText
+        sn.cssText = 'font-family: y2'
+        self.assertEqual(r.style, sn)
+        self.assertEqual(r.cssText, u'@font-face {\n    font-family: y2\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: y2')
+        self.assertEqual(s2.cssText, u'font-family: x2') # old
+        
+        # set invalid s2.cssText
+        try: 
+            sn.cssText = '$'
+        except xml.dom.SyntaxErr, e:
+            pass
+        self.assertEqual(r.style, sn)
+        self.assertEqual(r.style.cssText, u'font-family: y2')
+        self.assertEqual(r.cssText, u'@font-face {\n    font-family: y2\n    }')
+        
+        # set r.style with text
+        r.style = 'font-family: z'
+        self.assertNotEqual(r.style, sn)
+        self.assertEqual(r.cssText, u'@font-face {\n    font-family: z\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: z')
+        self.assertEqual(sn.cssText, u'font-family: y2')
+
+    def test_properties(self):
+        "CSSFontFaceRule.style properties"
+        r = cssutils.css.CSSFontFaceRule()
+        r.style.cssText = '''
+        src: url(x)
+        '''
+        exp = u'''@font-face {
+    src: url(x)
+    }'''
+        self.assertEqual(exp, r.cssText)
+        
+        tests = {
+            'font-family': [#('serif', True),
+#                            ('x', True),
+#                            ('"x"', True),
+                            ('x, y', False),
+                            ('"x", y', False),
+                            ('x, "y"', False),
+#                            ('"x", "y"', False)
+                            ]
+            }
+        for n, t in tests.items():
+            for (v, valid) in t:
+                r = cssutils.css.CSSFontFaceRule()
+                r.style[n] = v
+                self.assertEqual(r.style.getProperty(n).parent, r.style)
+                self.assertEqual(r.style.getProperty(n).valid, valid)
+
+    def test_incomplete(self):
+        "CSSFontFaceRule (incomplete)"
+        tests = {
+            u'@font-face{':
+                u'', # no } and no content
+            u'@font-face { ':
+                u'', # no } and no content
+            u'@font-face { font-family: x':
+                u'@font-face {\n    font-family: x\n    }', # no }
+        }
+        self.do_equal_p(tests) # parse
+
+    def test_InvalidModificationErr(self):
+        "CSSFontFaceRule.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@font-face')
+        tests = {
+            u'@font-fac {}': xml.dom.InvalidModificationErr,
+            }
+        self.do_raise_r(tests)
+
+    def test_valid(self):
+        "CSSFontFaceRule.valid"
+        r = cssutils.css.CSSFontFaceRule()
+        self.assertEqual(False, r.valid)
+        N = 'font-family: x; src: local(x);'
+        tests = {
+            True: (N,
+                   N + 'font-style: italic; font-weight: bold',
+                   ),
+            False: ('',
+                    'font-family: x, y; src: local(x);',
+                    N + 'font-style: inherit',
+                    N + 'invalid: 1')
+            }
+        for valid, testlist in tests.items():
+            for test in testlist:
+                r.style.cssText = test
+                self.assertEqual(valid, r.valid)
+
+    def test_reprANDstr(self):
+        "CSSFontFaceRule.__repr__(), .__str__()"
+        style='src: url(x)'        
+        s = cssutils.css.CSSFontFaceRule(style=style)
+        
+        self.assertTrue(style in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(style == s2.style.cssText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvariablesdeclaration.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvariablesdeclaration.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvariablesdeclaration.py	(revision 1126)
@@ -0,0 +1,350 @@
+"""Testcases for cssutils.css.cssvariablesdelaration.CSSVariablesDeclaration."""
+__version__ = '$Id: test_cssstyledeclaration.py 1869 2009-10-17 19:37:40Z cthedot $'
+
+import xml.dom
+import basetest
+import cssutils
+
+class CSSVariablesDeclarationTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        self.r = cssutils.css.CSSVariablesDeclaration()
+        cssutils.ser.prefs.useDefaults()
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+
+    def test_init(self):
+        "CSSVariablesDeclaration.__init__()"
+        v = cssutils.css.CSSVariablesDeclaration()
+        self.assertEqual(u'', v.cssText)
+        self.assertEqual(0, v.length)
+        self.assertEqual(None, v.parentRule)
+
+        v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0')
+        self.assertEqual(u'x: 0', v.cssText)
+        self.assertEqual('0', v.getVariableValue('x'))
+
+        rule = cssutils.css.CSSVariablesRule()
+        v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0',
+                                                 parentRule=rule)
+        self.assertEqual(rule, v.parentRule)
+
+    def test__contains__(self):
+        "CSSVariablesDeclaration.__contains__(name)"
+        v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0; y: 2')
+        for test in ('x', 'y'):
+            self.assertTrue(test in v)
+            self.assertTrue(test.upper() in v)
+
+        self.assertTrue('z' not in v)
+
+    def test_items(self):
+        "CSSVariablesDeclaration[variableName]"
+        v = cssutils.css.CSSVariablesDeclaration()
+        
+        value = '0'
+        v['X'] = value
+        self.assertEqual(value, v['X'])
+        self.assertEqual(value, v.getVariableValue('X'))
+        self.assertEqual(value, v['x'])
+        self.assertEqual(value, v.getVariableValue('x'))
+
+        self.assertEqual(u'', v['y'])
+        self.assertEqual(u'', v.getVariableValue('y'))
+
+        v['z'] = '1'
+        self.assertEqual(2, v.length)
+        
+        items = []
+        # unsorted!
+        self.assertEqual(sorted(v), ['x', 'z'])
+        
+        del v['z']        
+        self.assertEqual(1, v.length)
+        self.assertEqual(1, v.length)
+
+        self.assertEqual(u'0', v.removeVariable('x'))
+        self.assertEqual(u'', v.removeVariable('z'))
+        self.assertEqual(0, v.length)
+
+        v.cssText = 'x:0; y:1'
+        keys = []
+        # unsorted!
+        for i in range(0, v.length):
+            keys.append(v.item(i))
+        self.assertEqual(sorted(keys), [u'x', u'y'])
+
+    def test_keys(self):
+        "CSSVariablesDeclaration.keys()"
+        v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0; Y: 2')
+        self.assertEqual(['x', 'y'], sorted(v.keys()))
+
+    def test_cssText(self):
+        "CSSVariablesDeclaration.cssText"
+        # empty
+        tests = {
+            u'': u'',
+            u' ': u'',
+            u' \t \n  ': u'',
+            u'x: 1': None,
+            u'x: "a"': None,
+            u'x: rgb(1, 2, 3)': None,
+            u'x: 1px 2px 3px': None,
+
+            u'x:1': u'x: 1',
+            u'x:1;': u'x: 1',
+
+            u'x  :  1  ': u'x: 1',
+            u'x  :  1  ;  ': u'x: 1',
+            
+            u'x:1;y:2': u'x: 1;\ny: 2',
+            u'x:1;y:2;': u'x: 1;\ny: 2',
+            u'x  :  1  ;  y  :  2  ': u'x: 1;\ny: 2',
+            u'x  :  1  ;  y  :  2  ;  ': u'x: 1;\ny: 2',
+            
+            u'/*x*/': u'/*x*/',
+            u'x555: 5': None,
+            u'xxx:1;yyy:2': u'xxx: 1;\nyyy: 2',
+            u'xxx : 1; yyy : 2': u'xxx: 1;\nyyy: 2',
+            u'x:1;x:2;X:2': u'x: 2',
+            u'same:1;SAME:2;': u'same: 2',
+            u'/**/x/**/:/**/1/**/;/**/y/**/:/**/2/**/': 
+                u'/**/ \n /**/ \n /**/ \n x: 1 /**/;\n/**/ \n /**/ \n /**/ \n y: 2 /**/'
+            }
+        self.do_equal_r(tests)
+ 
+    # TODO: Fix?
+#    def test_cssText2(self):
+#        "CSSVariablesDeclaration.cssText"        
+#        # exception
+#        tests = {
+#                 u'top': xml.dom.SyntaxErr,
+#                 u'top:': xml.dom.SyntaxErr,
+#                 u'top : ': xml.dom.SyntaxErr,
+#                 u'top:;': xml.dom.SyntaxErr,
+#                 u'top 0': xml.dom.SyntaxErr,
+#                 u'top 0;': xml.dom.SyntaxErr,
+#    
+#                 u':': xml.dom.SyntaxErr,
+#                 u':0': xml.dom.SyntaxErr,
+#                 u':0;': xml.dom.SyntaxErr,
+#                 u':;': xml.dom.SyntaxErr,
+#                 u': ;': xml.dom.SyntaxErr,
+#    
+#                 u'0': xml.dom.SyntaxErr,
+#                 u'0;': xml.dom.SyntaxErr,
+#    
+#                 u';': xml.dom.SyntaxErr,
+#            }
+#        self.do_raise_r(tests)
+
+    def test_xVariable(self):
+        "CSSVariablesDeclaration.xVariable()"
+        v = cssutils.css.CSSVariablesDeclaration()
+        # unset
+        self.assertEqual(u'', v.getVariableValue('x'))
+        # set
+        v.setVariable('x', '0')
+        self.assertEqual(u'0', v.getVariableValue('x'))
+        self.assertEqual(u'0', v.getVariableValue('X'))
+        self.assertEqual(u'x: 0', v.cssText)
+        v.setVariable('X', '0')
+        self.assertEqual(u'0', v.getVariableValue('x'))
+        self.assertEqual(u'0', v.getVariableValue('X'))
+        self.assertEqual(u'x: 0', v.cssText)
+        # remove
+        self.assertEqual(u'0', v.removeVariable('x'))
+        self.assertEqual(u'', v.removeVariable('x'))
+        self.assertEqual(u'', v.getVariableValue('x'))
+        self.assertEqual(u'', v.cssText)
+
+
+    def test_imports(self):
+        "CSSVariables imports"
+        def fetcher(url):
+            url = url.replace('\\', '/')
+            url = url[url.rfind('/')+1:]
+            return (None, {
+                '3.css': '''
+                    @variables {
+                        over3-2-1-0: 3;
+                        over3-2-1: 3;
+                        over3-2: 3;
+                        over3-2-0: 3;
+                        over3-1: 3;
+                        over3-1-0: 3;
+                        over3-0: 3;
+                        local3: 3;
+                    }
+                
+                ''',
+                '2.css': '''
+                    @variables {
+                        over3-2-1-0: 2;
+                        over3-2-1: 2;
+                        over3-2-0: 2;
+                        over3-2: 2;
+                        over2-1: 2;
+                        over2-1-0: 2;
+                        over2-0: 2;
+                        local2: 2;
+                    }
+                
+                ''',
+                '1.css': '''
+                    @import "3.css";
+                    @import "2.css";
+                    @variables {
+                        over3-2-1-0: 1;
+                        over3-2-1: 1;
+                        over3-1: 1;
+                        over3-1-0: 1;
+                        over2-1: 1;
+                        over2-1-0: 1;
+                        over1-0: 1;
+                        local1: 1;
+                    }
+                
+                '''
+                }[url])
+        
+        css = '''
+            @import "1.css";
+            @variables {
+                over3-2-1-0: 0;
+                over3-2-0: 0;
+                over3-1-0: 0;
+                over2-1-0: 0;
+                over3-0: 0;
+                over2-0: 0;
+                over1-0: 0;
+                local0: 0;
+            }
+            a {
+                local0: var(local0);
+                local1: var(local1);
+                local2: var(local2);
+                local3: var(local3);
+                over1-0: var(over1-0);
+                over2-0: var(over2-0);
+                over3-0: var(over3-0);
+                over2-1: var(over2-1);
+                over3-1: var(over3-1);
+                over3-2: var(over3-2);
+                over2-1-0: var(over2-1-0);
+                over3-2-0: var(over3-2-0);
+                over3-2-1: var(over3-2-1);
+                over3-2-1-0: var(over3-2-1-0);
+            }
+        '''
+        p = cssutils.CSSParser(fetcher=fetcher)
+        s = p.parseString(css)
+
+        # only these in rule of this sheet        
+        self.assertEqual(s.cssRules[1].variables.length, 8)
+        # but all vars in s available!
+        self.assertEqual(s.variables.length, 15)
+        self.assertEqual([u'local0', u'local1', u'local2', u'local3', 
+                          u'over1-0', u'over2-0', u'over2-1', u'over2-1-0', 
+                          u'over3-0', u'over3-1', u'over3-1-0', u'over3-2', 
+                          u'over3-2-0', u'over3-2-1', u'over3-2-1-0'],
+                          sorted(s.variables.keys()))
+        
+        
+        # test with variables rule
+        cssutils.ser.prefs.resolveVariables = False
+        self.assertEqual(s.cssText, '''@import "1.css";
+@variables {
+    over3-2-1-0: 0;
+    over3-2-0: 0;
+    over3-1-0: 0;
+    over2-1-0: 0;
+    over3-0: 0;
+    over2-0: 0;
+    over1-0: 0;
+    local0: 0
+    }
+a {
+    local0: var(local0);
+    local1: var(local1);
+    local2: var(local2);
+    local3: var(local3);
+    over1-0: var(over1-0);
+    over2-0: var(over2-0);
+    over3-0: var(over3-0);
+    over2-1: var(over2-1);
+    over3-1: var(over3-1);
+    over3-2: var(over3-2);
+    over2-1-0: var(over2-1-0);
+    over3-2-0: var(over3-2-0);
+    over3-2-1: var(over3-2-1);
+    over3-2-1-0: var(over3-2-1-0)
+    }'''.encode())
+        
+        # test with resolved vars
+        cssutils.ser.prefs.resolveVariables = True
+        self.assertEqual(s.cssText, '''@import "1.css";
+a {
+    local0: 0;
+    local1: 1;
+    local2: 2;
+    local3: 3;
+    over1-0: 0;
+    over2-0: 0;
+    over3-0: 0;
+    over2-1: 1;
+    over3-1: 1;
+    over3-2: 2;
+    over2-1-0: 0;
+    over3-2-0: 0;
+    over3-2-1: 1;
+    over3-2-1-0: 0
+    }'''.encode())
+        
+
+        s = cssutils.resolveImports(s)
+        self.assertEqual(s.cssText, '''/* START @import "1.css" */
+/* START @import "3.css" */
+/* START @import "2.css" */
+a {
+    local0: 0;
+    local1: 1;
+    local2: 2;
+    local3: 3;
+    over1-0: 0;
+    over2-0: 0;
+    over3-0: 0;
+    over2-1: 1;
+    over3-1: 1;
+    over3-2: 2;
+    over2-1-0: 0;
+    over3-2-0: 0;
+    over3-2-1: 1;
+    over3-2-1-0: 0
+    }'''.encode())
+    
+    def test_parentRule(self):
+        "CSSVariablesDeclaration.parentRule"
+        s = cssutils.parseString(u'@variables { a:1}')
+        r = s.cssRules[0]
+        d = r.variables 
+        self.assertEqual(r, d.parentRule)
+        
+        d2 = cssutils.css.CSSVariablesDeclaration('b: 2')
+        r.variables = d2
+        self.assertEqual(r, d2.parentRule)
+        
+    def test_reprANDstr(self):
+        "CSSVariablesDeclaration.__repr__(), .__str__()"
+        s = cssutils.css.CSSVariablesDeclaration(cssText='a:1;b:2')
+
+        self.assertTrue("2" in str(s)) # length
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_stylesheet.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_stylesheet.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_stylesheet.py	(revision 1126)
@@ -0,0 +1,44 @@
+"""Testcases for cssutils.stylesheets.StyleSheet"""
+__version__ = '$Id: test_csspagerule.py 1869 2009-10-17 19:37:40Z cthedot $'
+
+import xml.dom
+import basetest
+import cssutils
+
+class StyleSheetTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "StyleSheet.__init__()"
+        s = cssutils.stylesheets.StyleSheet()
+
+        self.assertEqual(s.type, 'text/css')
+        self.assertEqual(s.href, None)
+        self.assertEqual(s.media, None)
+        self.assertEqual(s.title, u'')
+        self.assertEqual(s.ownerNode, None)
+        self.assertEqual(s.parentStyleSheet, None)
+        self.assertEqual(s.alternate, False)
+        self.assertEqual(s.disabled, False)
+
+
+        s = cssutils.stylesheets.StyleSheet(type='unknown',
+                                            href='test.css',
+                                            media=None,
+                                            title=u'title',
+                                            ownerNode=None,
+                                            parentStyleSheet=None,
+                                            alternate=True,
+                                            disabled=True)
+
+        self.assertEqual(s.type, 'unknown')
+        self.assertEqual(s.href, 'test.css')
+        self.assertEqual(s.media, None)
+        self.assertEqual(s.title, u'title')
+        self.assertEqual(s.ownerNode, None)
+        self.assertEqual(s.parentStyleSheet, None)
+        self.assertEqual(s.alternate, True)
+        self.assertEqual(s.disabled, True)
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_properties.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_properties.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_properties.py	(revision 1126)
@@ -0,0 +1,209 @@
+"""Testcases for cssutils.css.property._Property."""
+__version__ = '$Id: test_property.py 1529 2008-11-30 15:12:01Z cthedot $'
+
+import copy
+import xml.dom
+import basetest
+import cssutils
+from cssutils.css.property import Property
+
+debug = False
+
+class PropertiesTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        "init test values"
+        V = {
+            '0': ('0', '-0'),#, '+0'),
+            'NUMBER': ('0', '-0', '100.1', '-100.1'),#, '+0', '+100.1'),
+            'PERCENTAGE': ('0%', '-0%', '100.1%', '-100.1%'),#, '+0%', '+100.1%'),
+            
+            'EM': '1.2em',
+            'EX': '1.2ex',
+            'PX': '1.2px',
+            'CM': '1.2cm',
+            'MM': '1.2mm',
+            'IN': '1.2in',
+            'PT': '1.2pt',
+            'PC': '1.2pc',
+    
+            'ANGLES': ('1deg', '1rad', '1grad'),
+            'TIMES': ('1s', '1ms'),
+            'FREQUENCIES': ('1hz', '1khz'),
+            'DIMENSION': ('1dimension', '1_dimension', '1dimension2'),
+            'STRING': ('"string"', "'STRING'"),
+            'URI': ('url(x)', 'URL("x")', "url(')')"),
+            'IDENT': ('ident', 'IDENT', '_IDENT', '_2', 'i-2'),
+            #'AUTO': 'auto', # explicit in list as an IDENT too
+            #'INHERIT': 'inherit', # explicit in list as an IDENT too
+            'ATTR': ('attr(x)'),
+            'RECT': ('rect(1,2,3,4)'),
+            #?
+            'CLIP': ('rect(1,2,3,4)'),
+            'FUNCTION': (),
+            
+            'HEX3': '#123',
+            'HEX6': '#123abc',
+            'RGB': 'rgb(1,2,3)',
+            'RGB100': 'rgb(1%,2%,100%)',
+            'RGBA': 'rgba(1,2,3, 1)',
+            'RGBA100': 'rgba(1%,2%,100%, 0)',
+            'HSL': 'hsl(1,2%,3%)',
+            'HSLA': 'hsla(1,2%,3%, 1.0)'            
+             }        
+        def expanded(*keys):
+            r = []
+            for k in keys:
+                if isinstance(V[k], basestring):
+                    r.append(V[k])
+                else:
+                    r.extend(list(V[k]))
+            return r
+
+        # before adding combined
+        self.V = V
+        self.ALL = list(self._valuesofkeys(V.keys())) 
+        
+        # combined values, only keys of V may be used!
+        self.V['LENGTHS'] = expanded('0', 'EM', 'EX', 'PX', 'CM', 'MM', 'IN', 'PT', 'PC')
+        self.V['COLORS'] = expanded('HEX3', 'HEX6', 'RGB', 'RGB100')
+        self.V['COLORS3'] = expanded('RGBA', 'RGBA100', 'HSL', 'HSLA')
+        
+    def _allvalues(self):
+        "Return list of **all** possible values as simple list"
+        return copy.copy(self.ALL)
+            
+    def _valuesofkeys(self, keys):
+        "Generate all distinct values in given keys of self.V"
+        done = []
+        for key in keys:
+            if isinstance(key, list):
+                # not a key but a list of values, return directly
+                for v in key:
+                    yield v
+            else:
+                v = self.V[key]
+                if isinstance(v, basestring):
+                    # single value
+                    if v not in done: 
+                        done.append(v)
+                        yield v
+                else:
+                    # a list of values
+                    for value in v:
+                        if value not in done: 
+                            done.append(value)
+                            yield value
+        
+    def _check(self, name, keys):
+        """
+        Check each value in values if for property name p.name==exp.
+        """
+        notvalid = self._allvalues()
+
+        for value in self._valuesofkeys(keys):
+            if name == debug:
+                print '+True?', Property(name, value).valid, value
+            self.assertEqual(True, Property(name, value).valid)
+            if value in notvalid:
+                notvalid.remove(value)
+        for value in notvalid:
+            if name == debug:
+                print '-False?', Property(name, value).valid, value
+            self.assertEqual(False, Property(name, value).valid)
+                
+    def test_properties(self):
+        "properties"
+        tests = {
+            # propname: key or [list of values]
+            'color': ('COLORS', 'COLORS3', ['inherit', 'red']),
+            
+            'fit': (['fill', 'hidden', 'meet', 'slice'],),
+            'fit-position': ('LENGTHS', 'PERCENTAGE', 
+                             ['auto',
+                              'top left', 
+                              '0% 50%',
+                              '1cm 5em',
+                              'bottom']),
+            'font-family': ('STRING', 'IDENT', ['a, b',
+                                               '"a", "b"',
+                                               'a, "b"',
+                                               '"a", b',
+                                               r'a\{b',
+                                               r'a\ b',
+                                               'a b'
+                                               'a b, c  d  , e'
+                                               ]),
+            #'src': ('STRING',),
+                                               
+            'font-weight': (['normal', 'bold', 'bolder', 'lighter', 'inherit', 
+                             '100', '200', '300', '400', '500', '600', '700',
+                             '800', '900'],),
+            'font-stretch': (['normal', 'wider', 'narrower', 'ultra-condensed',
+                              'extra-condensed', 'condensed', 'semi-condensed',
+                              'semi-expanded', 'expanded', 'extra-expanded',
+                              'ultra-expanded', 'inherit'],),
+            'font-style': (['normal', 'italic', 'oblique', 'inherit'],),
+            'font-variant': (['normal', 'small-caps', 'inherit'],),
+            'font-size': ('LENGTHS', 'PERCENTAGE', ['xx-small', 'x-small',
+                                                   'small', 'medium', 'large', 
+                                                   'x-large', 'xx-large',
+                                                   'larger', 'smaller',
+                                                   '1em', '1%', 'inherit']),
+            'font-size-adjust': ('NUMBER', ['none', 'inherit']),
+#            'font': (['italic small-caps bold 1px/3 a, "b", serif',
+#                      'caption', 'icon', 'menu', 'message-box', 'small-caption',
+#                      'status-bar', 'inherit'],),
+            
+            'image-orientation': ('0', 'ANGLES', ['auto']),
+            'left': ('LENGTHS', 'PERCENTAGE', ['inherit', 'auto']),
+            'opacity': ('NUMBER', ['inherit']),
+            
+            'orphans': ('0', ['1', '99999', 'inherit']),
+            'page': ('IDENT',), 
+            'page-break-inside': (['auto', 'inherit', 'avoid'],),
+            'size': ('LENGTHS', ['auto', 
+                                 '1em 1em', 
+                                 'a4 portrait',
+                                 'b4 landscape',
+                                 'A5 PORTRAIT']),
+            
+            'widows': ('0', ['1', '99999', 'inherit'])
+        }
+        for name, keys in tests.items():
+            # keep track of valid keys
+            self._check(name, keys)
+
+    def test_validate(self):
+        "Property.validate() and Property.valid"
+        tests = {
+            # (default L2, no default, no profile, L2, Color L3)
+            'red': (True, True, True, True, True),
+            'rgba(1,2,3,1)': (False, True, True, False, True),
+            '1': (False, False, False, False, False)
+        }
+        for v, rs in tests.items():
+            p = Property('color', v)
+            
+            # TODO: Fix
+#            cssutils.profile.defaultProfiles = \
+#                cssutils.profile.CSS_LEVEL_2
+#            self.assertEqual(rs[0], p.valid)
+
+            cssutils.profile.defaultProfiles = None
+            self.assertEqual(rs[1], p.valid)
+
+            self.assertEqual(rs[2], p.validate())
+#            self.assertEqual(rs[3], p.validate(
+#                profiles=cssutils.profile.CSS_LEVEL_2))
+#            self.assertEqual(rs[4], p.validate(
+#                cssutils.profile.CSS3_COLOR))
+
+
+if __name__ == '__main__':
+    debug = 'font-family'
+    import logging
+    import unittest
+    cssutils.log.setLevel(logging.FATAL)
+    #debug = True
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_scripts_csscombine.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_scripts_csscombine.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_scripts_csscombine.py	(revision 1126)
@@ -0,0 +1,76 @@
+"""Testcases for cssutils.scripts.csscombine"""
+
+from cssutils.script import csscombine
+import basetest
+import cssutils
+import os
+
+class CSSCombine(basetest.BaseTestCase):
+
+    C = '@namespace s2"uri";s2|sheet-1{top:1px}s2|sheet-2{top:2px}proxy{top:3px}' 
+
+    def setUp(self):
+        self._saved = cssutils.log.raiseExceptions
+    
+    def tearDown(self):
+        cssutils.log.raiseExceptions = self._saved
+
+    def test_combine(self):
+        "scripts.csscombine()"
+              
+        # path, SHOULD be keyword argument!
+        csspath = os.path.join(os.path.dirname(__file__), '..', '..', '..',
+                               'sheets', 'csscombine-proxy.css')
+        combined = csscombine(csspath)
+        self.assertEqual(combined, self.C.encode())
+        combined = csscombine(path=csspath, targetencoding='ascii')
+        self.assertEqual(combined, ('@charset "ascii";' + self.C).encode())
+
+        # url
+        cssurl = cssutils.helper.path2url(csspath)
+        combined = csscombine(url=cssurl)
+        self.assertEqual(combined, self.C.encode())
+        combined = csscombine(url=cssurl, targetencoding='ascii')
+        self.assertEqual(combined, ('@charset "ascii";' + self.C).encode())
+
+        # cssText
+        # TODO: really need binary or can handle str too?
+        f = open(csspath, mode="rb")
+        cssText=f.read()
+        f.close()
+        combined = csscombine(cssText=cssText, href=cssurl)
+        self.assertEqual(combined, self.C.encode())
+        combined = csscombine(cssText=cssText, href=cssurl, 
+                              targetencoding='ascii')
+        self.assertEqual(combined, ('@charset "ascii";' + self.C).encode())
+ 
+    def test_combine_resolveVariables(self):
+        "scripts.csscombine(minify=..., resolveVariables=...)"
+        # no actual imports but checking if minify and resolveVariables work
+        cssText = '''
+        @variables {
+            c: #0f0;
+        }
+        a {
+            color: var(c);
+        }
+        '''
+        # default minify
+        self.assertEqual(csscombine(cssText=cssText,
+                                    resolveVariables=False),
+                         '@variables{c:#0f0}a{color:var(c)}'.encode())
+        self.assertEqual(csscombine(cssText=cssText),
+                         'a{color:#0f0}'.encode())
+
+        # no minify
+        self.assertEqual(csscombine(cssText=cssText, 
+                                    minify=False,
+                                    resolveVariables=False),
+                         '@variables {\n    c: #0f0\n    }\na {\n    color: var(c)\n    }'.encode())
+        self.assertEqual(csscombine(cssText=cssText, minify=False),
+                         'a {\n    color: #0f0\n    }'.encode())
+        
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssnamespacerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssnamespacerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssnamespacerule.py	(revision 1126)
@@ -0,0 +1,232 @@
+"""Testcases for cssutils.css.CSSImportRule"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class CSSNamespaceRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSNamespaceRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSNamespaceRule(namespaceURI='x')
+        #self.rRO = cssutils.css.CSSNamespaceRule(namespaceURI='x',
+        #                                         readonly=True)
+        self.r_type = cssutils.css.CSSRule.NAMESPACE_RULE
+        self.r_typeString = 'NAMESPACE_RULE'
+
+    def test_init(self):
+        "CSSNamespaceRule.__init__()"
+        # cannot use here as self.r and self rRO and not useful
+        #super(CSSNamespaceRuleTestCase, self).test_init()       
+        tests = [
+                 (None, None),
+                 ('', ''),
+                 (None, u''),
+                 (u'', None),
+                 (u'', u'no-uri'),
+                 ]
+        for uri, p in tests:            
+            r = cssutils.css.CSSNamespaceRule(namespaceURI=uri, prefix=p)
+            self.assertEqual(None, r.namespaceURI)
+            self.assertEqual(u'', r.prefix)
+            self.assertEqual(u'', r.cssText)
+            self.assertEqual(None, r.parentStyleSheet)
+            self.assertEqual(None, r.parentRule)
+        
+        r = cssutils.css.CSSNamespaceRule(namespaceURI='example')
+        self.assertEqual('example', r.namespaceURI)
+        self.assertEqual(u'', r.prefix)
+        self.assertEqual(u'@namespace "example";', r.cssText)
+        self.sheet.add(r)
+        self.assertEqual(self.sheet, r.parentStyleSheet)
+
+        r = cssutils.css.CSSNamespaceRule(namespaceURI='example', prefix='p')
+        self.assertEqual('example', r.namespaceURI)
+        self.assertEqual(u'p', r.prefix)
+        self.assertEqual(u'@namespace p "example";', r.cssText)
+        
+        css = u'@namespace p "u";'
+        r = cssutils.css.CSSNamespaceRule(cssText=css)
+        self.assertEqual(r.cssText, css)       
+
+        # only possible to set @... similar name
+        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
+
+    def test_cssText(self):
+        "CSSNamespaceRule.cssText"
+        # cssText may only be set initalially
+        r = cssutils.css.CSSNamespaceRule()
+        css = u'@namespace p "u";'
+        r.cssText = css
+        self.assertEqual(r.cssText, css)
+        self.assertRaises(xml.dom.NoModificationAllowedErr, r._setCssText, 
+                          u'@namespace p "OTHER";')
+        
+        tests = {
+            u'@namespace "";': None,
+            u'@namespace "u";': None,
+            u'@namespace p "u";': None,
+            u'@namespace empty "";': None,
+            
+            u'@namespace p "p";': None,
+            u"@namespace p 'u';": u'@namespace p "u";',
+
+            u'@\\namespace p "u";': u'@namespace p "u";',
+            u'@NAMESPACE p "u";': u'@namespace p "u";',
+
+            u'@namespace  p  "u"  ;': u'@namespace p "u";',
+            u'@namespace p"u";': u'@namespace p "u";',
+            u'@namespace p "u";': u'@namespace p "u";',
+
+            u'@namespace/*1*/"u"/*2*/;': u'@namespace /*1*/ "u" /*2*/;',
+            u'@namespace/*1*/p/*2*/"u"/*3*/;': u'@namespace /*1*/ p /*2*/ "u" /*3*/;',
+
+            u'@namespace p url(u);': u'@namespace p "u";',
+            u'@namespace p url(\'u\');': u'@namespace p "u";',
+            u'@namespace p url(\"u\");': u'@namespace p "u";',
+            u'@namespace p url( \"u\" );': u'@namespace p "u";',
+            
+            # comments
+            u'@namespace/*1*//*2*/p/*3*//*4*/url(u)/*5*//*6*/;': 
+                u'@namespace /*1*/ /*2*/ p /*3*/ /*4*/ "u" /*5*/ /*6*/;',
+            u'@namespace/*1*//*2*/p/*3*//*4*/"u"/*5*//*6*/;': 
+                u'@namespace /*1*/ /*2*/ p /*3*/ /*4*/ "u" /*5*/ /*6*/;',
+            u'@namespace/*1*//*2*/p/*3*//*4*/url("u")/*5*//*6*/;': 
+                u'@namespace /*1*/ /*2*/ p /*3*/ /*4*/ "u" /*5*/ /*6*/;',
+
+            u'@namespace/*1*//*2*/url(u)/*5*//*6*/;': 
+                u'@namespace /*1*/ /*2*/ "u" /*5*/ /*6*/;',
+            
+            # WS
+            u'@namespace\n\r\t\f p\n\r\t\f url(\n\r\t\f u\n\r\t\f )\n\r\t\f ;': 
+                u'@namespace p "u";',
+            u'@namespace\n\r\t\f p\n\r\t\f url(\n\r\t\f "u"\n\r\t\f )\n\r\t\f ;': 
+                u'@namespace p "u";',
+            u'@namespace\n\r\t\f p\n\r\t\f "str"\n\r\t\f ;': 
+                u'@namespace p "str";',
+            u'@namespace\n\r\t\f "str"\n\r\t\f ;': 
+                u'@namespace "str";'
+            }
+        self.do_equal_p(tests)
+        #self.do_equal_r(tests) # cannot use here as always new r is needed
+        for test, expected in tests.items():
+            r = cssutils.css.CSSNamespaceRule(cssText=test)
+            if expected is None:
+                expected = test
+            self.assertEqual(expected, r.cssText)
+
+        tests = {
+            u'@namespace;': xml.dom.SyntaxErr, # nothing
+            u'@namespace p;': xml.dom.SyntaxErr, # no namespaceURI
+            u'@namespace "u" p;': xml.dom.SyntaxErr, # order
+            u'@namespace "u";EXTRA': xml.dom.SyntaxErr,
+            u'@namespace p "u";EXTRA': xml.dom.SyntaxErr,
+            }
+        self.do_raise_p(tests) # parse
+        tests.update({
+            u'@namespace p url(x)': xml.dom.SyntaxErr, # missing ;
+            u'@namespace p "u"': xml.dom.SyntaxErr, # missing ;
+            # trailing
+            u'@namespace "u"; ': xml.dom.SyntaxErr,
+            u'@namespace "u";/**/': xml.dom.SyntaxErr,
+            u'@namespace p "u"; ': xml.dom.SyntaxErr,
+            u'@namespace p "u";/**/': xml.dom.SyntaxErr,
+            })
+        def _do(test):
+            r = cssutils.css.CSSNamespaceRule(cssText=test)
+        for test, expected in tests.items():
+            self.assertRaises(expected, _do, test)
+
+    def test_namespaceURI(self):
+        "CSSNamespaceRule.namespaceURI"
+        # set only initially
+        r = cssutils.css.CSSNamespaceRule(namespaceURI='x')
+        self.assertEqual(u'x' , r.namespaceURI)
+        self.assertEqual(u'@namespace "x";', r.cssText)
+
+        r = cssutils.css.CSSNamespaceRule(namespaceURI='"')
+        self.assertEqual(u'@namespace "\\"";', r.cssText)
+        
+        self.assertRaises(xml.dom.NoModificationAllowedErr, 
+                          r._setNamespaceURI, u'x')
+
+        self.assertRaises(xml.dom.NoModificationAllowedErr, 
+                          r._setCssText, u'@namespace "u";')
+        
+        r._replaceNamespaceURI(u'http://example.com/new')
+        self.assertEqual(u'http://example.com/new' , r.namespaceURI)
+
+    def test_prefix(self):
+        "CSSNamespaceRule.prefix"
+        r = cssutils.css.CSSNamespaceRule(namespaceURI='u')
+        r.prefix = 'p'
+        self.assertEqual('p' , r.prefix)
+        self.assertEqual(u'@namespace p "u";', r.cssText)
+
+        r = cssutils.css.CSSNamespaceRule(cssText='@namespace x "u";')
+        r.prefix = 'p'
+        self.assertEqual('p' , r.prefix)
+        self.assertEqual(u'@namespace p "u";', r.cssText)
+
+        valid = (None, u'')
+        for prefix in valid:
+            r.prefix = prefix
+            self.assertEqual(r.prefix, u'')
+            self.assertEqual(u'@namespace "u";', r.cssText)
+            
+        valid = ('a', '_x', 'a1', 'a-1')
+        for prefix in valid:
+            r.prefix = prefix
+            self.assertEqual(r.prefix, prefix)
+            self.assertEqual(u'@namespace %s "u";' % prefix, r.cssText)
+                    
+        invalid = ('1', ' x', ' ', ',')
+        for prefix in invalid:
+            self.assertRaises(xml.dom.SyntaxErr, r._setPrefix, prefix)
+
+    def test_InvalidModificationErr(self):
+        "CSSNamespaceRule.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@namespace')        
+
+    def test_incomplete(self):
+        "CSSNamespaceRule (incomplete)"
+        tests = {
+            u'@namespace "uri': u'@namespace "uri";',
+            u"@namespace url(x": u'@namespace "x";',
+            u"@namespace url('x": u'@namespace "x";',
+            u'@namespace url("x;': u'@namespace "x;";',
+            u'@namespace url( "x;': u'@namespace "x;";',
+            u'@namespace url("x ': u'@namespace "x ";',
+            u'@namespace url(x ': u'@namespace "x";',
+        }
+        self.do_equal_p(tests) # parse
+        tests = {
+            u'@namespace "uri': xml.dom.SyntaxErr,
+            u"@namespace url(x": xml.dom.SyntaxErr,
+            u"@namespace url('x": xml.dom.SyntaxErr,
+            u'@namespace url("x;': xml.dom.SyntaxErr,
+            u'@namespace url( "x;': xml.dom.SyntaxErr,
+            u'@namespace url("x ': xml.dom.SyntaxErr,
+            u'@namespace url(x ': xml.dom.SyntaxErr           
+            }
+        self.do_raise_r(tests) # set cssText
+
+    def test_reprANDstr(self):
+        "CSSNamespaceRule.__repr__(), .__str__()"
+        namespaceURI=u'http://example.com'
+        prefix=u'prefix'
+
+        s = cssutils.css.CSSNamespaceRule(namespaceURI=namespaceURI, prefix=prefix)
+
+        self.assertTrue(namespaceURI in str(s))
+        self.assertTrue(prefix in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(namespaceURI == s2.namespaceURI)
+        self.assertTrue(prefix == s2.prefix)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/__init__.py	(revision 1126)
@@ -0,0 +1 @@
+"""cssutils unittests"""
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssunknownrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssunknownrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssunknownrule.py	(revision 1126)
@@ -0,0 +1,151 @@
+"""testcases for cssutils.css.CSSUnkownRule"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class CSSUnknownRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSUnknownRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSUnknownRule()
+        self.rRO = cssutils.css.CSSUnknownRule(readonly=True)
+        self.r_type = cssutils.css.CSSUnknownRule.UNKNOWN_RULE
+        self.r_typeString = 'UNKNOWN_RULE'
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+        
+    def test_init(self):
+        "CSSUnknownRule.type and init"
+        super(CSSUnknownRuleTestCase, self).test_init()
+
+        self.assertFalse(self.r.wellformed)
+
+        # only name
+        r = cssutils.css.CSSUnknownRule(cssText=u'@init;')
+        self.assertEqual(u'@init', r.atkeyword)
+        self.assertEqual(u'@init;', r.cssText)
+        self.assertTrue(r.wellformed)
+
+        # @-... not allowed?
+        r = cssutils.css.CSSUnknownRule(cssText=u'@-init;')
+        self.assertEqual(u'@-init;', r.cssText)
+        self.assertEqual(u'@-init', r.atkeyword)
+        self.assertTrue(r.wellformed)
+
+        r = cssutils.css.CSSUnknownRule(cssText=u'@_w-h-a-012;')
+        self.assertEqual(u'@_w-h-a-012;', r.cssText)
+        self.assertEqual(u'@_w-h-a-012', r.atkeyword)
+        self.assertTrue(r.wellformed)
+
+        # name and content
+        r = cssutils.css.CSSUnknownRule(cssText=u'@init xxx;')
+        self.assertEqual(u'@init', r.atkeyword)
+        self.assertEqual(u'@init xxx;', r.cssText)
+        self.assertTrue(r.wellformed)
+
+        # name and block
+        r = cssutils.css.CSSUnknownRule(cssText=u'@init { xxx }')
+        self.assertEqual(u'@init', r.atkeyword)
+        self.assertEqual(u'@init {\n    xxx\n    }', r.cssText)
+        self.assertTrue(r.wellformed)
+
+        # name and content and block
+        r = cssutils.css.CSSUnknownRule(cssText=u'@init xxx { yyy }')
+        self.assertEqual(u'@init', r.atkeyword)
+        self.assertEqual(u'@init xxx {\n    yyy\n    }', r.cssText)
+        self.assertTrue(r.wellformed)
+
+    def test_cssText(self):
+        "CSSUnknownRule.cssText"
+        tests = {
+            # not normal rules!
+            u'@font-facex{}': u'@font-facex {\n    }',
+            u'@importurl(x.css);': u'@importurl (x . css);',
+            u'@mediaAll{}': u'@mediaall {\n    }',
+            u'@namespacep"x";': u'@namespacep "x";',
+            u'@pageX{}': u'@pagex {\n    }',
+            u'@xbottom { content: counter(page) }': u'@xbottom {\n    content: counter(page)\n    }', 
+            u'@xbottom { content: "x" counter(page) "y"}': u'@xbottom {\n    content: "x" counter(page) "y"\n    }' 
+            }
+        self.do_equal_p(tests)
+        
+        # expects the same atkeyword for self.r so do a new one each test
+        oldr = self.r
+        for t, e in tests.items():
+            self.r = cssutils.css.CSSUnknownRule()
+            self.do_equal_r({t:e})
+        self.r = oldr
+
+        tests = {
+            '@x;': None,
+            '@x {}': u'@x {\n    }',
+            '@x{ \n \t \f\r}': u'@x {\n    }',
+            '@x {\n    [()]([ {\n        }]) {\n        }\n    }': None,
+            '@x {\n    @b;\n    }': None,
+            '''@x {
+    @b {
+        x: 1x;
+        y: 2y;
+        }
+    }''': None,
+            '@x "string" url(x);': None,
+            
+            # comments
+            '@x/*1*//*2*/"str"/*3*//*4*/url("x");': 
+                '@x /*1*/ /*2*/ "str" /*3*/ /*4*/ url(x);',
+            # WS
+            '@x"string"url("x");': '@x "string" url(x);',
+            '@x\n\r\t\f "string"\n\r\t\f url(\n\r\t\f "x"\n\r\t\f )\n\r\t\f ;': 
+                '@x "string" url(x);',
+        }
+        self.do_equal_p(tests)
+        self.do_equal_r(tests)
+
+        tests = {
+                 u'@;': xml.dom.InvalidModificationErr,
+                 u'@{}': xml.dom.InvalidModificationErr,
+                 u'@ ;': xml.dom.InvalidModificationErr,
+                 u'@ {};': xml.dom.InvalidModificationErr,
+                 
+                 u'@x ;{}': xml.dom.SyntaxErr,
+                 u'@x ;;': xml.dom.SyntaxErr,
+                 u'@x }  ': xml.dom.SyntaxErr,
+                 u'@x }  ;': xml.dom.SyntaxErr,
+                 u'@x {  ': xml.dom.SyntaxErr,
+                 u'@x {  ;': xml.dom.SyntaxErr,
+                 u'@x ': xml.dom.SyntaxErr,
+                 u'@x (;': xml.dom.SyntaxErr,
+                 u'@x );': xml.dom.SyntaxErr,
+                 u'@x [;': xml.dom.SyntaxErr,
+                 u'@x ];': xml.dom.SyntaxErr,
+                 u'@x {[(]()}': xml.dom.SyntaxErr,
+                 # trailing
+                 u'@x{}{}': xml.dom.SyntaxErr,
+                 u'@x{};': xml.dom.SyntaxErr,
+                 u'@x{}1': xml.dom.SyntaxErr,
+                 u'@x{} ': xml.dom.SyntaxErr,
+                 u'@x{}/**/': xml.dom.SyntaxErr,
+                 u'@x;1': xml.dom.SyntaxErr,
+                 u'@x; ': xml.dom.SyntaxErr,
+                 u'@x;/**/': xml.dom.SyntaxErr,
+
+                 }
+        self.do_raise_r(tests)
+
+    def test_InvalidModificationErr(self):
+        "CSSUnknownRule.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@unknown')
+
+    def test_reprANDstr(self):
+        "CSSUnknownRule.__repr__(), .__str__()"        
+        s = cssutils.css.CSSUnknownRule(cssText='@x;')
+        
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssutilsimport.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssutilsimport.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssutilsimport.py	(revision 1126)
@@ -0,0 +1,34 @@
+"""Testcase for cssutils imports"""
+
+before = len(locals()) # to check is only exp amount is imported
+from cssutils import *
+after = len(locals()) # to check is only exp amount is imported
+
+import unittest
+
+class CSSutilsImportTestCase(unittest.TestCase):
+
+    def test_import_all(self):
+        "from cssutils import *"
+        import cssutils
+
+        act = globals()
+        exp = {'CSSParser': CSSParser,
+               'CSSSerializer': CSSSerializer,
+               'css': cssutils.css,
+               'stylesheets': cssutils.stylesheets,
+        }
+        exptotal = before + len(exp) + 1
+        # imports before + * + "after"
+        self.assertTrue(after == exptotal, 'too many imported')
+
+        found = 0
+        for e in exp:
+            self.assertTrue(e in act, '%s not found' %e)
+            self.assertTrue(act[e] == exp[e], '%s not the same' %e)
+            found += 1
+        self.assertTrue(found == len(exp))
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_mediaquery.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_mediaquery.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_mediaquery.py	(revision 1126)
@@ -0,0 +1,103 @@
+# -*- coding: iso-8859-1 -*-
+"""Testcases for cssutils.stylesheets.MediaQuery"""
+
+import xml.dom
+import basetest
+import cssutils.stylesheets
+
+class MediaQueryTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        super(MediaQueryTestCase, self).setUp()
+        self.r = cssutils.stylesheets.MediaQuery()
+
+    def test_mediaText(self):
+        "MediaQuery.mediaText"
+        tests = {
+            u'all': None,
+            u'braille': None,
+            u'embossed': None,
+            u'handheld': None,
+            u'print': None,
+            u'projection': None,
+            u'screen': None,
+            u'speech': None,
+            u'tty': None,
+            u'tv': None,
+            u'ALL': None,
+            u'a\\ll': None,
+            u'not tv': None,
+            u'n\\ot t\\v': None,
+            u'only tv': None,
+            u'\\only \\tv': None,
+            u'PRINT': None,
+            u'NOT PRINT': None,
+            u'ONLY PRINT': None,
+            u'tv and (color)': None,
+            u'not tv and (color)': None,
+            u'only tv and (color)': None,
+            u'print and(color)': u'print and (color)'
+            }
+        self.do_equal_r(tests, att='mediaText')
+
+        tests = {
+            u'': xml.dom.SyntaxErr,
+            u'two values': xml.dom.SyntaxErr,
+            u'or even three': xml.dom.SyntaxErr,
+            u'aural': xml.dom.SyntaxErr, # a dimension
+            u'3d': xml.dom.SyntaxErr, # a dimension
+            }
+        self.do_raise_r(tests, att='_setMediaText')        
+
+    def test_mediaType(self):
+        "MediaQuery.mediaType"
+        mq = cssutils.stylesheets.MediaQuery()
+
+        self.assertEqual(u'', mq.mediaText)
+
+        for mt in cssutils.stylesheets.MediaQuery.MEDIA_TYPES:
+            mq.mediaType = mt
+            self.assertEqual(mq.mediaType, mt)
+            mq.mediaType = mt.upper()
+            self.assertEqual(mq.mediaType, mt.upper())
+
+        mt = u'3D-UNKOwn-MEDIAtype0123'
+        #mq.mediaType = mt
+        self.assertRaises(xml.dom.SyntaxErr, mq._setMediaType, mt)
+        #self.assertRaises(xml.dom.InvalidCharacterErr, mq._setMediaType, mt)
+
+    def test_comments(self):
+        "MediaQuery.mediaText comments"
+        tests = {
+            u'all': None,
+            u'print': None,
+            u'not print': None,
+            u'only print': None,
+            u'print and (color)': None,
+            u'print and (color) and (width)': None,
+            u'print and (color: 2)': None,
+            u'print and (min-width: 100px)': None,
+            u'print and (min-width: 100px) and (color: red)': None,
+            u'not print and (min-width: 100px)': None,
+            u'only print and (min-width: 100px)': None,
+            u'/*1*/ tv /*2*/': None,
+            u'/*0*/ only /*1*/ tv /*2*/': None,
+            u'/*0* /not /*1*/ tv /*2*/': None,
+            u'/*x*/ only /*x*/ print /*x*/ and /*x*/ (/*x*/ min-width /*x*/: /*x*/ 100px /*x*/)': None,
+            u'print and/*1*/(color)': u'print and /*1*/ (color)'
+            }
+        self.do_equal_r(tests, att='mediaText')
+
+    def test_reprANDstr(self):
+        "MediaQuery.__repr__(), .__str__()"
+        mediaText='tv and (color)'
+        s = cssutils.stylesheets.MediaQuery(mediaText=mediaText)
+        self.assertTrue(mediaText in str(s))
+        s2 = eval(repr(s))
+        self.assertEqual(mediaText, s2.mediaText)
+        self.assertTrue(isinstance(s2, s.__class__))
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_x.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_x.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_x.py	(revision 1126)
@@ -0,0 +1,54 @@
+"""Testcases for cssutils.css.CSSValue and CSSPrimitiveValue."""
+__version__ = '$Id: test_cssvalue.py 1473 2008-09-15 21:15:54Z cthedot $'
+
+# from decimal import Decimal # maybe for later tests?
+import xml.dom
+import basetest
+import cssutils
+import types
+
+class XTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        cssutils.ser.prefs.useDefaults()
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+        
+    def test_prioriy(self):
+        "Property.priority"
+        s = cssutils.parseString(u'a { color: red }')
+        self.assertEqual(s.cssText, u'a {\n    color: red\n    }'.encode())
+#        self.assertEqual(u'', s.cssRules[0].style.getPropertyPriority('color'))
+#
+#        s = cssutils.parseString('a { color: red !important }')
+#        self.assertEqual(u'a {\n    color: red !important\n    }', s.cssText)
+#        self.assertEqual(u'important', s.cssRules[0].style.getPropertyPriority('color'))
+#        
+#        cssutils.log.raiseExceptions = True
+#        p = cssutils.css.Property(u'color', u'red', u'')
+#        self.assertEqual(p.priority, u'')
+#        p = cssutils.css.Property(u'color', u'red', u'!important')
+#        self.assertEqual(p.priority, u'important')
+#        self.assertRaisesMsg(xml.dom.SyntaxErr, 
+#                             u'', 
+#                             cssutils.css.Property, u'color', u'red', u'x')
+#
+#        cssutils.log.raiseExceptions = False
+#        p = cssutils.css.Property(u'color', u'red', u'!x')
+#        self.assertEqual(p.priority, u'x')
+#        p = cssutils.css.Property(u'color', u'red', u'!x')
+#        self.assertEqual(p.priority, u'x')
+#        cssutils.log.raiseExceptions = True
+#        
+#        
+#        # invalid but kept!
+##        #cssutils.log.raiseExceptions = False
+##        s = cssutils.parseString('a { color: red !x }')
+##        self.assertEqual(u'a {\n    color: red !x\n    }', s.cssText)
+##        self.assertEqual(u'x', s.cssRules[0].style.getPropertyPriority('color'))
+#        
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvariablesrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvariablesrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvariablesrule.py	(revision 1126)
@@ -0,0 +1,155 @@
+"""Testcases for cssutils.css.CSSPageRule"""
+__version__ = '$Id: test_csspagerule.py 1869 2009-10-17 19:37:40Z cthedot $'
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class CSSVariablesRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSVariablesRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSVariablesRule()
+        self.rRO = cssutils.css.CSSVariablesRule(readonly=True)
+        self.r_type = cssutils.css.CSSPageRule.VARIABLES_RULE
+        self.r_typeString = 'VARIABLES_RULE'
+        
+        cssutils.ser.prefs.resolveVariables = False
+
+    def test_init(self):
+        "CSSVariablesRule.__init__()"
+        super(CSSVariablesRuleTestCase, self).test_init()
+
+        r = cssutils.css.CSSVariablesRule()
+        self.assertEqual(cssutils.css.CSSVariablesDeclaration, 
+                         type(r.variables))
+        self.assertEqual(r, r.variables.parentRule)
+
+        # until any variables
+        self.assertEqual(u'', r.cssText)
+
+        # only possible to set @... similar name
+        self.assertRaises(xml.dom.InvalidModificationErr, 
+                          self.r._setAtkeyword, 'x')
+
+    def test_InvalidModificationErr(self):
+        "CSSVariablesRule.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@variables')
+        tests = {
+            u'@var {}': xml.dom.InvalidModificationErr,
+            }
+        self.do_raise_r(tests)
+
+    def test_incomplete(self):
+        "CSSVariablesRule (incomplete)"
+        tests = {
+            u'@variables { ':
+                u'', # no } and no content
+            u'@variables { x: red':
+                u'@variables {\n    x: red\n    }', # no }
+        }
+        self.do_equal_p(tests) # parse
+
+    def test_cssText(self):
+        "CSSVariablesRule"
+        EXP = u'@variables {\n    margin: 0\n    }'
+        tests = {
+             u'@variables {}': u'',
+             u'@variables     {margin:0;}': EXP,
+             u'@variables     {margin:0}': EXP,
+             u'@VaRIables {   margin    :   0   ;    }': EXP,
+            u'@\\VaRIables {    margin : 0    }': EXP,
+
+            u'@variables {a:1;b:2}': 
+                u'@variables {\n    a: 1;\n    b: 2\n    }',
+
+            # comments
+            u'@variables   /*1*/   {margin:0;}': 
+                u'@variables /*1*/ {\n    margin: 0\n    }',
+            u'@variables/*1*/{margin:0;}': 
+                u'@variables /*1*/ {\n    margin: 0\n    }',
+            }
+        self.do_equal_r(tests)
+        self.do_equal_p(tests)
+
+    def test_media(self):
+        "CSSVariablesRule.media"
+        r = cssutils.css.CSSVariablesRule()
+        self.assertRaises(AttributeError, r.__getattribute__, 'media')
+        self.assertRaises(AttributeError, r.__setattr__, 'media', '?')
+        
+    def test_variables(self):
+        "CSSVariablesRule.variables"                
+        r = cssutils.css.CSSVariablesRule(
+                 variables=cssutils.css.CSSVariablesDeclaration('x: 1'))
+        self.assertEqual(r, r.variables.parentRule)
+
+        # cssText
+        r = cssutils.css.CSSVariablesRule()
+        r.cssText = u'@variables { x: 1 }'
+        vars1 = r.variables
+        self.assertEqual(r, r.variables.parentRule)
+        self.assertEqual(vars1, r.variables)
+        self.assertEqual(r.variables.cssText, u'x: 1')
+        self.assertEqual(r.cssText, u'@variables {\n    x: 1\n    }')
+        
+        r.cssText = u'@variables {y:2}'
+        self.assertEqual(r, r.variables.parentRule)
+        self.assertNotEqual(vars1, r.variables)
+        self.assertEqual(r.variables.cssText, u'y: 2')
+        self.assertEqual(r.cssText, u'@variables {\n    y: 2\n    }')
+
+        vars2 = r.variables
+        
+        # fail
+        try:
+            r.cssText = u'@variables {$:1}'
+        except xml.dom.DOMException, e:
+            pass
+
+        self.assertEqual(vars2, r.variables)
+        self.assertEqual(r.variables.cssText, u'y: 2')
+        self.assertEqual(r.cssText, u'@variables {\n    y: 2\n    }')
+
+        # var decl
+        vars3 = cssutils.css.CSSVariablesDeclaration('z: 3')
+        r.variables = vars3
+
+        self.assertEqual(r, r.variables.parentRule)
+        self.assertEqual(vars3, r.variables)
+        self.assertEqual(r.variables.cssText, u'z: 3')
+        self.assertEqual(r.cssText, u'@variables {\n    z: 3\n    }')
+
+        # string
+        r.variables = 'a: x'
+        self.assertNotEqual(vars3, r.variables)
+        self.assertEqual(r, r.variables.parentRule)
+        self.assertEqual(r.variables.cssText, u'a: x')
+        self.assertEqual(r.cssText, u'@variables {\n    a: x\n    }')
+        vars4 = r.variables
+
+        # string fail
+        try:
+            r.variables = '$: x'
+        except xml.dom.DOMException, e:
+            pass
+        self.assertEqual(vars4, r.variables)
+        self.assertEqual(r, r.variables.parentRule)
+        self.assertEqual(r.variables.cssText, u'a: x')
+        self.assertEqual(r.cssText, u'@variables {\n    a: x\n    }')
+        
+        
+    def test_reprANDstr(self):
+        "CSSVariablesRule.__repr__(), .__str__()"
+        r = cssutils.css.CSSVariablesRule()
+        r.cssText = '@variables { xxx: 1 }'
+        self.assertTrue('xxx' in str(r))
+
+        r2 = eval(repr(r))
+        self.assertTrue(isinstance(r2, r.__class__))
+        self.assertTrue(r.cssText == r2.cssText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_tokenize2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_tokenize2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_tokenize2.py	(revision 1126)
@@ -0,0 +1,861 @@
+# -*- coding: utf-8 -*-
+"""Testcases for new cssutils.tokenize.Tokenizer
+
+TODO: old tests as new ones are **not complete**!
+"""
+
+import sys
+import xml.dom
+import basetest
+from cssutils.tokenize2 import *
+
+class TokenizerTestCase(basetest.BaseTestCase):
+
+    testsall = {
+        # IDENT
+        u'äöüß€': [('IDENT', u'äöüß€', 1, 1)],
+        u' a ': [('S', u' ', 1, 1),
+                 ('IDENT', u'a', 1, 2),
+                 ('S', u' ', 1, 3)],
+        u'_a': [('IDENT', u'_a', 1, 1)],
+        u'-a': [('IDENT', u'-a', 1, 1)],
+        u'aA-_\200\377': [('IDENT', u'aA-_\200\377', 1, 1)],
+        u'a1': [('IDENT', u'a1', 1, 1)],
+        # escapes must end with S or max 6 digits:
+        u'\\44 b': [('IDENT', u'Db', 1, 1)],
+        u'\\44  b': [('IDENT', u'D', 1, 1),
+                     ('S', u' ', 1, 5),
+                     ('IDENT', u'b', 1, 6)],
+        u'\\44\nb': [('IDENT', u'Db', 1, 1)],
+        u'\\44\rb': [('IDENT', u'Db', 1, 1)],
+        u'\\44\fb': [('IDENT', u'Db', 1, 1)],
+        u'\\44\n*': [('IDENT', u'D', 1, 1),
+                    ('CHAR', u'*', 2, 1)],
+        u'\\44  a': [('IDENT', u'D', 1, 1),
+                    ('S', u' ', 1, 5),
+                    ('IDENT', u'a', 1, 6)],
+        # TODO:
+        # Note that this means that a "real" space after the escape sequence
+        # must itself either be escaped or doubled:
+        u'\\44\ x': [('IDENT', u'D\\ x', 1, 1)],
+        u'\\44  ': [('IDENT', u'D', 1, 1),
+                     ('S', u' ', 1, 5)],
+
+        ur'\44': [('IDENT', u'D', 1, 1)],
+        ur'\\': [('IDENT', ur'\\', 1, 1)],
+        ur'\{': [('IDENT', ur'\{', 1, 1)],
+        ur'\"': [('IDENT', ur'\"', 1, 1)],
+        ur'\(': [('IDENT', ur'\(', 1, 1)],
+        ur'\1 \22 \333 \4444 \55555 \666666 \777777 7 \7777777':
+            [(
+                ('IDENT', u'\x01"\u0333\u4444\U00055555\\666666 \\777777 7', 1, 1)
+                if sys.maxunicode > 0x10000 else
+                ('IDENT', u'\x01"\u0333\u4444\\55555 \\666666 \\777777 7', 1, 1)
+            ),
+            ('S', ' ', 1, 43),
+            ('IDENT', '\\7777777', 1, 44)
+        ],
+
+
+        u'\\1 b': [('IDENT', u'\x01b', 1, 1)],
+        u'\\44 b': [('IDENT', u'Db', 1, 1)],
+        u'\\123 b': [('IDENT', u'\u0123b', 1, 1)],
+        u'\\1234 b': [('IDENT', u'\u1234b', 1, 1)],
+        u'\\12345 b':
+            [(
+                ('IDENT', u'\U00012345b', 1, 1)
+                if sys.maxunicode > 0x10000 else
+                ('IDENT', u'\\12345 b', 1, 1)
+            )],
+        u'\\123456 b': [('IDENT', u'\\123456 b', 1, 1)],
+        u'\\1234567 b': [('IDENT', u'\\1234567', 1, 1),
+                         ('S', u' ', 1, 9),
+                         ('IDENT', u'b', 1, 10)],
+        u'\\{\\}\\(\\)\\[\\]\\#\\@\\.\\,':
+            [('IDENT', u'\\{\\}\\(\\)\\[\\]\\#\\@\\.\\,', 1, 1)],
+
+        # STRING
+        u' "" ': [('S', u' ', 1, 1),
+                 ('STRING', u'""', 1, 2),
+                 ('S', u' ', 1, 4)],
+        u' "\'" ': [('S', u' ', 1, 1),
+                 ('STRING', u'"\'"', 1, 2),
+                 ('S', u' ', 1, 5)],
+        u" '' ": [('S', u' ', 1, 1),
+                 ('STRING', u"''", 1, 2),
+                 ('S', u' ', 1, 4)],
+        u" '' ": [('S', u' ', 1, 1),
+                 ('STRING', u"''", 1, 2),
+                 ('S', u' ', 1, 4)],
+        # until 0.9.5.x
+        #u"'\\\n'": [('STRING', u"'\\\n'", 1, 1)],
+        #u"'\\\n\\\n\\\n'": [('STRING', u"'\\\n\\\n\\\n'", 1, 1)],
+        #u"'\\\f'": [('STRING', u"'\\\f'", 1, 1)],
+        #u"'\\\r'": [('STRING', u"'\\\r'", 1, 1)],
+        #u"'\\\r\n'": [('STRING', u"'\\\r\n'", 1, 1)],
+        #u"'1\\\n2'": [('STRING', u"'1\\\n2'", 1, 1)],
+        # from 0.9.6a0 escaped nl is removed from string
+        u"'\\\n'": [('STRING', u"''", 1, 1)],
+        u"'\\\n\\\n\\\n'": [('STRING', u"''", 1, 1)],
+        u"'\\\f'": [('STRING', u"''", 1, 1)],
+        u"'\\\r'": [('STRING', u"''", 1, 1)],
+        u"'1\\\n2'": [('STRING', u"'12'", 1, 1)],
+        u"'1\\\r\n2'": [('STRING', u"'12'", 1, 1)],
+        #ur'"\0020|\0020"': [('STRING', u'"\\0020|\\0020"', 1, 1)],
+        ur'"\61|\0061"': [('STRING', u'"a|a"', 1, 1)],
+
+        # HASH
+        u' #a ': [('S', u' ', 1, 1),
+                 ('HASH', u'#a', 1, 2),
+                 ('S', u' ', 1, 4)],
+
+        u'#ccc': [('HASH', u'#ccc', 1, 1)],
+        u'#111': [('HASH', u'#111', 1, 1)],
+        u'#a1a1a1': [('HASH', u'#a1a1a1', 1, 1)],
+        u'#1a1a1a': [('HASH', u'#1a1a1a', 1, 1)],
+
+        # NUMBER, for plus see CSS3
+        u' 0 ': [('S', u' ', 1, 1),
+                 ('NUMBER', u'0', 1, 2),
+                 ('S', u' ', 1, 3)],
+        u' 0.1 ': [('S', u' ', 1, 1),
+                 ('NUMBER', u'0.1', 1, 2),
+                 ('S', u' ', 1, 5)],
+        u' .0 ': [('S', u' ', 1, 1),
+                 ('NUMBER', u'.0', 1, 2),
+                 ('S', u' ', 1, 4)],
+
+        u' -0 ': [('S', u' ', 1, 1),
+                 #('CHAR', u'-', 1, 2),
+                 #('NUMBER', u'0', 1, 3),
+                 ('NUMBER', u'-0', 1, 2),
+                 ('S', u' ', 1, 4)],
+
+        # PERCENTAGE
+        u' 0% ': [('S', u' ', 1, 1),
+                 ('PERCENTAGE', u'0%', 1, 2),
+                 ('S', u' ', 1, 4)],
+        u' .5% ': [('S', u' ', 1, 1),
+                 ('PERCENTAGE', u'.5%', 1, 2),
+                 ('S', u' ', 1, 5)],
+
+        # URI
+        u' url() ': [('S', u' ', 1, 1),
+                 ('URI', u'url()', 1, 2),
+                 ('S', u' ', 1, 7)],
+        u' url(a) ': [('S', u' ', 1, 1),
+                 ('URI', u'url(a)', 1, 2),
+                 ('S', u' ', 1, 8)],
+        u' url("a") ': [('S', u' ', 1, 1),
+                 ('URI', u'url("a")', 1, 2),
+                 ('S', u' ', 1, 10)],
+        u' url( a ) ': [('S', u' ', 1, 1),
+                 ('URI', u'url( a )', 1, 2),
+                 ('S', u' ', 1, 10)],
+
+        # UNICODE-RANGE
+
+        # CDO
+        u' <!-- ': [('S', u' ', 1, 1),
+                   ('CDO', u'<!--', 1, 2),
+                   ('S', u' ', 1, 6)],
+        u'"<!--""-->"': [('STRING', u'"<!--"', 1, 1),
+                    ('STRING', u'"-->"', 1, 7)],
+
+        # CDC
+        u' --> ': [('S', u' ', 1, 1),
+                  ('CDC', u'-->', 1, 2),
+                  ('S', u' ', 1, 5)],
+
+        # S
+        u' ': [('S', u' ', 1, 1)],
+        u'  ': [('S', u'  ', 1, 1)],
+        u'\r': [('S', u'\r', 1, 1)],
+        u'\n': [('S', u'\n', 1, 1)],
+        u'\r\n': [('S', u'\r\n', 1, 1)],
+        u'\f': [('S', u'\f', 1, 1)],
+        u'\r': [('S', u'\r', 1, 1)],
+        u'\t': [('S', u'\t', 1, 1)],
+        u'\r\n\r\n\f\t ': [('S', u'\r\n\r\n\f\t ', 1, 1)],
+
+        # COMMENT, for incomplete see later
+        u'/*x*/ ': [('COMMENT', u'/*x*/', 1, 1),
+                    ('S', u' ', 1, 6)],
+
+        # FUNCTION
+        u' x( ': [('S', u' ', 1, 1),
+                  ('FUNCTION', u'x(', 1, 2),
+                  ('S', u' ', 1, 4)],
+
+        # INCLUDES
+        u' ~= ': [('S', u' ', 1, 1),
+                  ('INCLUDES', u'~=', 1, 2),
+                  ('S', u' ', 1, 4)],
+        u'~==': [('INCLUDES', u'~=', 1, 1), ('CHAR', u'=', 1, 3)],
+
+        # DASHMATCH
+        u' |= ': [('S', u' ', 1, 1),
+                  ('DASHMATCH', u'|=', 1, 2),
+                  ('S', u' ', 1, 4)],
+        u'|==': [('DASHMATCH', u'|=', 1, 1), ('CHAR', u'=', 1, 3)],
+
+        # CHAR
+        u' @ ': [('S', u' ', 1, 1),
+                  ('CHAR', u'@', 1, 2),
+                  ('S', u' ', 1, 3)],
+
+        # --- overwritten for CSS 2.1 ---
+        # LBRACE
+        u' { ': [('S', u' ', 1, 1),
+                 ('CHAR', u'{', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # PLUS
+        u' + ': [('S', u' ', 1, 1),
+                 ('CHAR', u'+', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # GREATER
+        u' > ': [('S', u' ', 1, 1),
+                 ('CHAR', u'>', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # COMMA
+        u' , ': [('S', u' ', 1, 1),
+                 ('CHAR', u',', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # class
+        u' . ': [('S', u' ', 1, 1),
+                  ('CHAR', u'.', 1, 2),
+                  ('S', u' ', 1, 3)],
+        }
+
+    tests3 = {
+        # UNICODE-RANGE
+        u' u+0 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+0', 1, 2),
+                  ('S', u' ', 1, 5)],
+        u' u+01 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+01', 1, 2),
+                  ('S', u' ', 1, 6)],
+        u' u+012 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+012', 1, 2),
+                  ('S', u' ', 1, 7)],
+        u' u+0123 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+0123', 1, 2),
+                  ('S', u' ', 1, 8)],
+        u' u+01234 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+01234', 1, 2),
+                  ('S', u' ', 1, 9)],
+        u' u+012345 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+012345', 1, 2),
+                  ('S', u' ', 1, 10)],
+        u' u+0123456 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+012345', 1, 2),
+                  ('NUMBER', u'6', 1, 10),
+                  ('S', u' ', 1, 11)],
+        u' U+123456 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'U+123456', 1, 2),
+                  ('S', u' ', 1, 10)],
+        u' \\55+abcdef ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'U+abcdef', 1, 2),
+                  ('S', u' ', 1, 12)],
+        u' \\75+abcdef ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+abcdef', 1, 2),
+                  ('S', u' ', 1, 12)],
+        u' u+0-1 ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+0-1', 1, 2),
+                  ('S', u' ', 1, 7)],
+        u' u+0-1, u+123456-abcdef ': [('S', u' ', 1, 1),
+                  ('UNICODE-RANGE', u'u+0-1', 1, 2),
+                  ('CHAR', u',', 1, 7),
+                  ('S', u' ', 1, 8),
+                  ('UNICODE-RANGE', u'u+123456-abcdef', 1, 9),
+                  ('S', u' ', 1, 24)],
+
+        # specials
+        u'c\\olor': [('IDENT', u'c\\olor', 1, 1)],
+        #u'-1': [('CHAR', u'-', 1, 1), ('NUMBER', u'1', 1, 2)],
+        #u'-1px': [('CHAR', u'-', 1, 1), ('DIMENSION', u'1px', 1, 2)],
+        u'-1': [('NUMBER', u'-1', 1, 1)],
+        u'-1px': [('DIMENSION', u'-1px', 1, 1)],
+
+        # ATKEYWORD
+        u' @x ': [('S', u' ', 1, 1),
+                  ('ATKEYWORD', u'@x', 1, 2),
+                  ('S', u' ', 1, 4)],
+        u'@X': [('ATKEYWORD', u'@X', 1, 1)],
+        u'@\\x': [('ATKEYWORD', u'@\\x', 1, 1)],
+        # -
+        u'@1x': [('CHAR', u'@', 1, 1),
+                  ('DIMENSION', u'1x', 1, 2)],
+
+        # DIMENSION
+        u' 0px ': [('S', u' ', 1, 1),
+                 ('DIMENSION', u'0px', 1, 2),
+                 ('S', u' ', 1, 5)],
+        u' 1s ': [('S', u' ', 1, 1),
+                 ('DIMENSION', u'1s', 1, 2),
+                 ('S', u' ', 1, 4)],
+        u'0.2EM': [('DIMENSION', u'0.2EM', 1, 1)],
+        u'1p\\x': [('DIMENSION', u'1p\\x', 1, 1)],
+        u'1PX': [('DIMENSION', u'1PX', 1, 1)],
+
+        # NUMBER
+        u' - 0 ': [('S', u' ', 1, 1),
+                 ('CHAR', u'-', 1, 2),
+                 ('S', u' ', 1, 3),
+                 ('NUMBER', u'0', 1, 4),
+                 ('S', u' ', 1, 5)],
+        u' + 0 ': [('S', u' ', 1, 1),
+                 ('CHAR', u'+', 1, 2),
+                 ('S', u' ', 1, 3),
+                 ('NUMBER', u'0', 1, 4),
+                 ('S', u' ', 1, 5)],
+
+        # PREFIXMATCH
+        u' ^= ': [('S', u' ', 1, 1),
+                  ('PREFIXMATCH', u'^=', 1, 2),
+                  ('S', u' ', 1, 4)],
+        u'^==': [('PREFIXMATCH', u'^=', 1, 1), ('CHAR', u'=', 1, 3)],
+
+        # SUFFIXMATCH
+        u' $= ': [('S', u' ', 1, 1),
+                  ('SUFFIXMATCH', u'$=', 1, 2),
+                  ('S', u' ', 1, 4)],
+        u'$==': [('SUFFIXMATCH', u'$=', 1, 1), ('CHAR', u'=', 1, 3)],
+
+        # SUBSTRINGMATCH
+        u' *= ': [('S', u' ', 1, 1),
+                  ('SUBSTRINGMATCH', u'*=', 1, 2),
+                  ('S', u' ', 1, 4)],
+        u'*==': [('SUBSTRINGMATCH', u'*=', 1, 1), ('CHAR', u'=', 1, 3)],
+
+        # BOM only at start
+#        u'\xFEFF ': [('BOM', u'\xfeFF', 1, 1),
+#                  ('S', u' ', 1, 1)],
+#        u' \xFEFF ': [('S', u' ', 1, 1),
+#                  ('IDENT', u'\xfeFF', 1, 2),
+#                  ('S', u' ', 1, 5)],
+        u'\xfe\xff ': [('BOM', u'\xfe\xff', 1, 1),
+                  ('S', u' ', 1, 1)],
+        u' \xfe\xff ': [('S', u' ', 1, 1),
+                  ('IDENT', u'\xfe\xff', 1, 2),
+                  ('S', u' ', 1, 4)],
+        u'\xef\xbb\xbf ': [('BOM', u'\xef\xbb\xbf', 1, 1),
+                  ('S', u' ', 1, 1)],
+        u' \xef\xbb\xbf ': [('S', u' ', 1, 1),
+                  ('IDENT', u'\xef\xbb\xbf', 1, 2),
+                  ('S', u' ', 1, 5)],        }
+
+    tests2 = {
+        # escapes work not for a-f!
+        # IMPORT_SYM
+        u' @import ': [('S', u' ', 1, 1),
+                 ('IMPORT_SYM', u'@import', 1, 2),
+                 ('S', u' ', 1, 9)],
+        u'@IMPORT': [('IMPORT_SYM', u'@IMPORT', 1, 1)],
+        u'@\\49\r\nMPORT': [('IMPORT_SYM', u'@\\49\r\nMPORT', 1, 1)],
+        ur'@\i\m\p\o\r\t': [('IMPORT_SYM', ur'@\i\m\p\o\r\t', 1, 1)],
+        ur'@\I\M\P\O\R\T': [('IMPORT_SYM', ur'@\I\M\P\O\R\T', 1, 1)],
+        ur'@\49 \04d\0050\0004f\000052\54': [('IMPORT_SYM',
+                                        ur'@\49 \04d\0050\0004f\000052\54',
+                                        1, 1)],
+        ur'@\69 \06d\0070\0006f\000072\74': [('IMPORT_SYM',
+                                        ur'@\69 \06d\0070\0006f\000072\74',
+                                        1, 1)],
+
+        # PAGE_SYM
+        u' @page ': [('S', u' ', 1, 1),
+                 ('PAGE_SYM', u'@page', 1, 2),
+                 ('S', u' ', 1, 7)],
+        u'@PAGE': [('PAGE_SYM', u'@PAGE', 1, 1)],
+        ur'@\pa\ge': [('PAGE_SYM', ur'@\pa\ge', 1, 1)],
+        ur'@\PA\GE': [('PAGE_SYM', ur'@\PA\GE', 1, 1)],
+        ur'@\50\41\47\45': [('PAGE_SYM', ur'@\50\41\47\45', 1, 1)],
+        ur'@\70\61\67\65': [('PAGE_SYM', ur'@\70\61\67\65', 1, 1)],
+
+        # MEDIA_SYM
+        u' @media ': [('S', u' ', 1, 1),
+                 ('MEDIA_SYM', u'@media', 1, 2),
+                 ('S', u' ', 1, 8)],
+        u'@MEDIA': [('MEDIA_SYM', u'@MEDIA', 1, 1)],
+        ur'@\med\ia': [('MEDIA_SYM', ur'@\med\ia', 1, 1)],
+        ur'@\MED\IA': [('MEDIA_SYM', ur'@\MED\IA', 1, 1)],
+        u'@\\4d\n\\45\r\\44\t\\49\r\nA': [('MEDIA_SYM', u'@\\4d\n\\45\r\\44\t\\49\r\nA', 1, 1)],
+        u'@\\4d\n\\45\r\\44\t\\49\r\\41\f': [('MEDIA_SYM',
+                                        u'@\\4d\n\\45\r\\44\t\\49\r\\41\f',
+                                        1, 1)],
+        u'@\\6d\n\\65\r\\64\t\\69\r\\61\f': [('MEDIA_SYM',
+                                        u'@\\6d\n\\65\r\\64\t\\69\r\\61\f',
+                                        1, 1)],
+
+        # FONT_FACE_SYM
+        u' @font-face ': [('S', u' ', 1, 1),
+                 ('FONT_FACE_SYM', u'@font-face', 1, 2),
+                 ('S', u' ', 1, 12)],
+        u'@FONT-FACE': [('FONT_FACE_SYM', u'@FONT-FACE', 1, 1)],
+        ur'@f\o\n\t\-face': [('FONT_FACE_SYM', ur'@f\o\n\t\-face', 1, 1)],
+        ur'@F\O\N\T\-FACE': [('FONT_FACE_SYM', ur'@F\O\N\T\-FACE', 1, 1)],
+        # TODO: "-" as hex!
+        ur'@\46\4f\4e\54\-\46\41\43\45': [('FONT_FACE_SYM',
+            ur'@\46\4f\4e\54\-\46\41\43\45', 1, 1)],
+        ur'@\66\6f\6e\74\-\66\61\63\65': [('FONT_FACE_SYM',
+            ur'@\66\6f\6e\74\-\66\61\63\65', 1, 1)],
+
+        # CHARSET_SYM only if "@charset "!
+        u'@charset  ': [('CHARSET_SYM', u'@charset ', 1, 1),
+                        ('S', u' ', 1, 10)],
+        u' @charset  ': [('S', u' ', 1, 1),
+                 ('CHARSET_SYM', u'@charset ', 1, 2), # not at start
+                 ('S', u' ', 1, 11)],
+        u'@charset': [('ATKEYWORD', u'@charset', 1, 1)], # no ending S
+        u'@CHARSET ': [('ATKEYWORD', u'@CHARSET', 1, 1),# uppercase
+                       ('S', u' ', 1, 9)],
+        u'@cha\\rset ': [('ATKEYWORD', u'@cha\\rset', 1, 1), # not literal
+                         ('S', u' ', 1, 10)],
+
+        # NAMESPACE_SYM
+        u' @namespace ': [('S', u' ', 1, 1),
+                 ('NAMESPACE_SYM', u'@namespace', 1, 2),
+                 ('S', u' ', 1, 12)],
+        ur'@NAMESPACE': [('NAMESPACE_SYM', ur'@NAMESPACE', 1, 1)],
+        ur'@\na\me\s\pace': [('NAMESPACE_SYM', ur'@\na\me\s\pace', 1, 1)],
+        ur'@\NA\ME\S\PACE': [('NAMESPACE_SYM', ur'@\NA\ME\S\PACE', 1, 1)],
+        ur'@\4e\41\4d\45\53\50\41\43\45': [('NAMESPACE_SYM',
+            ur'@\4e\41\4d\45\53\50\41\43\45', 1, 1)],
+        ur'@\6e\61\6d\65\73\70\61\63\65': [('NAMESPACE_SYM',
+            ur'@\6e\61\6d\65\73\70\61\63\65', 1, 1)],
+
+        # ATKEYWORD
+        u' @unknown ': [('S', u' ', 1, 1),
+                 ('ATKEYWORD', u'@unknown', 1, 2),
+                 ('S', u' ', 1, 10)],
+
+        # STRING
+        # strings with linebreak in it
+        u' "\\na"\na': [('S', u' ', 1, 1),
+                   ('STRING', u'"\\na"', 1, 2),
+                   ('S', u'\n', 1, 7),
+                   ('IDENT', u'a', 2, 1)],
+        u" '\\na'\na": [('S', u' ', 1, 1),
+                   ('STRING', u"'\\na'", 1, 2),
+                   ('S', u'\n', 1, 7),
+                   ('IDENT', u'a', 2, 1)],
+        u' "\\r\\n\\t\\n\\ra"a': [('S', u' ', 1, 1),
+                   ('STRING', u'"\\r\\n\\t\\n\\ra"', 1, 2),
+                   ('IDENT', u'a', 1, 15)],
+
+        # IMPORTANT_SYM is not IDENT!!!
+        u' !important ': [('S', u' ', 1, 1),
+                ('CHAR', u'!', 1, 2),
+                 ('IDENT', u'important', 1, 3),
+                 ('S', u' ', 1, 12)],
+        u'! /*1*/ important ': [
+                ('CHAR', u'!', 1, 1),
+                ('S', u' ', 1, 2),
+                ('COMMENT', u'/*1*/', 1, 3),
+                ('S', u' ', 1, 8),
+                 ('IDENT', u'important', 1, 9),
+                 ('S', u' ', 1, 18)],
+        u'! important': [('CHAR', u'!', 1, 1),
+                         ('S', u' ', 1, 2),
+                         ('IDENT', u'important', 1, 3)],
+        u'!\n\timportant': [('CHAR', u'!', 1, 1),
+                            ('S', u'\n\t', 1, 2),
+                            ('IDENT', u'important', 2, 2)],
+        u'!IMPORTANT': [('CHAR', u'!', 1, 1),
+                        ('IDENT', u'IMPORTANT', 1, 2)],
+        ur'!\i\m\p\o\r\ta\n\t': [('CHAR', u'!', 1, 1),
+                                 ('IDENT',
+                                  ur'\i\m\p\o\r\ta\n\t', 1, 2)],
+        ur'!\I\M\P\O\R\Ta\N\T': [('CHAR', u'!', 1, 1),
+                                 ('IDENT',
+                                  ur'\I\M\P\O\R\Ta\N\T', 1, 2)],
+        ur'!\49\4d\50\4f\52\54\41\4e\54': [('CHAR', u'!', 1, 1),
+                                           ('IDENT',
+                                            ur'IMPORTANT',
+                                            1, 2)],
+        ur'!\69\6d\70\6f\72\74\61\6e\74': [('CHAR', u'!', 1, 1),
+                                           ('IDENT',
+                                            ur'important',
+                                            1, 2)],
+        }
+
+    # overwriting tests in testsall
+    tests2only = {
+        # LBRACE
+        u' { ': [('S', u' ', 1, 1),
+                 ('LBRACE', u'{', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # PLUS
+        u' + ': [('S', u' ', 1, 1),
+                 ('PLUS', u'+', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # GREATER
+        u' > ': [('S', u' ', 1, 1),
+                 ('GREATER', u'>', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # COMMA
+        u' , ': [('S', u' ', 1, 1),
+                 ('COMMA', u',', 1, 2),
+                 ('S', u' ', 1, 3)],
+        # class
+        u' . ': [('S', u' ', 1, 1),
+                 ('CLASS', u'.', 1, 2),
+                 ('S', u' ', 1, 3)],
+        }
+
+    testsfullsheet = {
+        # escape ends with explicit space but \r\n as single space
+        u'\\65\r\nb': [('IDENT', u'eb', 1, 1)],
+
+        # STRING
+        ur'"\""': [('STRING', ur'"\""', 1, 1)],
+        ur'"\" "': [('STRING', ur'"\" "', 1, 1)],
+        u"""'\\''""": [('STRING', u"""'\\''""", 1, 1)],
+        u'''"\\""''': [('STRING', u'''"\\""''', 1, 1)],
+        u' "\na': [('S', u' ', 1, 1),
+                   ('INVALID', u'"', 1, 2),
+                   ('S', u'\n', 1, 3),
+                   ('IDENT', u'a', 2, 1)],
+
+        # strings with linebreak in it
+        u' "\\na\na': [('S', u' ', 1, 1),
+                   ('INVALID', u'"\\na', 1, 2),
+                   ('S', u'\n', 1, 6),
+                   ('IDENT', u'a', 2, 1)],
+        u' "\\r\\n\\t\\n\\ra\na': [('S', u' ', 1, 1),
+                   ('INVALID', u'"\\r\\n\\t\\n\\ra', 1, 2),
+                   ('S', u'\n', 1, 14),
+                   ('IDENT', u'a', 2, 1)],
+        # URI
+        u'ur\\l(a)': [('URI', u'ur\\l(a)', 1, 1)],
+        u'url(a)': [('URI', u'url(a)', 1, 1)],
+        u'\\55r\\4c(a)': [('URI', u'UrL(a)', 1, 1)],
+        u'\\75r\\6c(a)': [('URI', u'url(a)', 1, 1)],
+        u' url())': [('S', u' ', 1, 1),
+                 ('URI', u'url()', 1, 2),
+                 ('CHAR', u')', 1, 7)],
+        u'url("x"))': [('URI', u'url("x")', 1, 1),
+                       ('CHAR', u')', 1, 9)],
+        u"url('x'))": [('URI', u"url('x')", 1, 1),
+                       ('CHAR', u')', 1, 9)],
+        }
+
+    # tests if fullsheet=False is set on tokenizer
+    testsfullsheetfalse = {
+        # COMMENT incomplete
+        u'/*': [('CHAR', u'/', 1, 1),
+                ('CHAR', u'*', 1, 2)],
+
+        # INVALID incomplete
+        u' " ': [('S', u' ', 1, 1),
+                 ('INVALID', u'" ', 1, 2)],
+        u" 'abc\"with quote\" in it": [('S', u' ', 1, 1),
+                 ('INVALID', u"'abc\"with quote\" in it", 1, 2)],
+
+        # URI incomplete
+        u'url(a': [('FUNCTION', u'url(', 1, 1),
+                   ('IDENT', u'a', 1, 5)],
+        u'url("a': [('FUNCTION', u'url(', 1, 1),
+                   ('INVALID', u'"a', 1, 5)],
+        u"url('a": [('FUNCTION', u'url(', 1, 1),
+                   ('INVALID', u"'a", 1, 5)],
+        u"UR\\l('a": [('FUNCTION', u'UR\\l(', 1, 1),
+                   ('INVALID', u"'a", 1, 6)],
+        }
+
+    # tests if fullsheet=True is set on tokenizer
+    testsfullsheettrue = {
+        # COMMENT incomplete
+        u'/*': [('COMMENT', u'/**/', 1, 1)],
+
+#        # INVALID incomplete => STRING
+        u' " ': [('S', u' ', 1, 1),
+                 ('STRING', u'" "', 1, 2)],
+        u" 'abc\"with quote\" in it": [('S', u' ', 1, 1),
+                 ('STRING', u"'abc\"with quote\" in it'", 1, 2)],
+
+        # URI incomplete FUNC => URI
+        u'url(a': [('URI', u'url(a)', 1, 1)],
+        u'url( a': [('URI', u'url( a)', 1, 1)],
+        u'url("a': [('URI', u'url("a")', 1, 1)],
+        u'url( "a ': [('URI', u'url( "a ")', 1, 1)],
+        u"url('a": [('URI', u"url('a')", 1, 1)],
+        u'url("a"': [('URI', u'url("a")', 1, 1)],
+        u"url('a'": [('URI', u"url('a')", 1, 1)],
+        }
+
+    def setUp(self):
+        #log = cssutils.errorhandler.ErrorHandler()
+        self.tokenizer = Tokenizer()
+
+#    NOT USED
+#    def test_push(self):
+#        "Tokenizer.push()"
+#        r = []
+#        def do():
+#            T = Tokenizer()
+#            x = False
+#            for t in T.tokenize('1 x 2 3'):
+#                if not x and t[1] == 'x':
+#                    T.push(t)
+#                    x = True
+#                r.append(t[1])
+#            return ''.join(r)
+#
+#        # push reinserts token into token stream, so x is doubled
+#        self.assertEqual('1 xx 2 3', do())
+
+#    def test_linenumbers(self):
+#        "Tokenizer line + col"
+#        pass
+
+    def test_tokenize(self):
+        "cssutils Tokenizer().tokenize()"
+        import cssutils.cssproductions
+        tokenizer = Tokenizer(cssutils.cssproductions.MACROS,
+                              cssutils.cssproductions.PRODUCTIONS)
+        tests = {}
+        tests.update(self.testsall)
+        tests.update(self.tests2)
+        tests.update(self.tests3)
+        tests.update(self.testsfullsheet)
+        tests.update(self.testsfullsheetfalse)
+        for css in tests:
+            # check token format
+            tokens = tokenizer.tokenize(css)
+            for i, actual in enumerate(tokens):
+                expected = tests[css][i]
+                self.assertEqual(expected, actual)
+
+            # check if all same number of tokens
+            tokens = list(tokenizer.tokenize(css))
+            self.assertEqual(len(tokens), len(tests[css]))
+
+    def test_tokenizefullsheet(self):
+        "cssutils Tokenizer().tokenize(fullsheet=True)"
+        import cssutils.cssproductions
+        tokenizer = Tokenizer(cssutils.cssproductions.MACROS,
+                              cssutils.cssproductions.PRODUCTIONS)
+        tests = {}
+        tests.update(self.testsall)
+        tests.update(self.tests2)
+        tests.update(self.tests3)
+        tests.update(self.testsfullsheet)
+        tests.update(self.testsfullsheettrue)
+        for css in tests:
+            # check token format
+            tokens = tokenizer.tokenize(css, fullsheet=True)
+            for i, actual in enumerate(tokens):
+                try:
+                    expected = tests[css][i]
+                except IndexError:
+                    # EOF is added
+                    self.assertEqual(actual[0], 'EOF')
+                else:
+                    self.assertEqual(expected, actual)
+
+            # check if all same number of tokens
+            tokens = list(tokenizer.tokenize(css, fullsheet=True))
+            # EOF is added so -1
+            self.assertEqual(len(tokens) - 1, len(tests[css]))
+
+
+    # --------------
+
+    def __old(self):
+
+        testsOLD = {
+            u'x x1 -x .-x #_x -': [(1, 1, tt.IDENT, u'x'),
+               (1, 2, 'S', u' '),
+               (1, 3, tt.IDENT, u'x1'),
+               (1, 5, 'S', u' '),
+               (1, 6, tt.IDENT, u'-x'),
+               (1, 8, 'S', u' '),
+               (1, 9, tt.CLASS, u'.'),
+               (1, 10, tt.IDENT, u'-x'),
+               (1, 12, 'S', u' '),
+               (1, 13, tt.HASH, u'#_x'),
+               (1, 16, 'S', u' '),
+               (1, 17, 'DELIM', u'-')],
+
+            # num
+            u'1 1.1 -1 -1.1 .1 -.1 1.': [(1, 1, tt.NUMBER, u'1'),
+               (1, 2, 'S', u' '), (1, 3, tt.NUMBER, u'1.1'),
+               (1, 6, 'S', u' '), (1, 7, tt.NUMBER, u'-1'),
+               (1, 9, 'S', u' '), (1, 10, tt.NUMBER, u'-1.1'),
+               (1, 14, 'S', u' '), (1, 15, tt.NUMBER, u'0.1'),
+               (1, 17, 'S', u' '), (1, 18, tt.NUMBER, u'-0.1'),
+               (1, 21, 'S', u' '),
+               (1, 22, tt.NUMBER, u'1'), (1, 23, tt.CLASS, u'.')
+                                         ],
+            # CSS3 pseudo
+            u'::': [(1, 1, tt.PSEUDO_ELEMENT, u'::')],
+
+            # SPECIALS
+            u'*+>~{},': [(1, 1, tt.UNIVERSAL, u'*'),
+               (1, 2, tt.PLUS, u'+'),
+               (1, 3, tt.GREATER, u'>'),
+               (1, 4, tt.TILDE, u'~'),
+               (1, 5, tt.LBRACE, u'{'),
+               (1, 6, tt.RBRACE, u'}'),
+               (1, 7, tt.COMMA, u',')],
+
+            # DELIM
+            u'!%:&$|': [(1, 1, 'DELIM', u'!'),
+               (1, 2, 'DELIM', u'%'),
+               (1, 3, 'DELIM', u':'),
+               (1, 4, 'DELIM', u'&'),
+               (1, 5, 'DELIM', u'$'),
+               (1, 6, 'DELIM', u'|')],
+
+
+            # DIMENSION
+            u'5em': [(1, 1, tt.DIMENSION, u'5em')],
+            u' 5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'5em')],
+            u'5em ': [(1, 1, tt.DIMENSION, u'5em'), (1, 4, 'S', u' ')],
+
+            u'-5em': [(1, 1, tt.DIMENSION, u'-5em')],
+            u' -5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'-5em')],
+            u'-5em ': [(1, 1, tt.DIMENSION, u'-5em'), (1, 5, 'S', u' ')],
+
+            u'.5em': [(1, 1, tt.DIMENSION, u'0.5em')],
+            u' .5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'0.5em')],
+            u'.5em ': [(1, 1, tt.DIMENSION, u'0.5em'), (1, 5, 'S', u' ')],
+
+            u'-.5em': [(1, 1, tt.DIMENSION, u'-0.5em')],
+            u' -.5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'-0.5em')],
+            u'-.5em ': [(1, 1, tt.DIMENSION, u'-0.5em'), (1, 6, 'S', u' ')],
+
+            u'5em5_-': [(1, 1, tt.DIMENSION, u'5em5_-')],
+
+            u'a a5 a5a 5 5a 5a5': [(1, 1, tt.IDENT, u'a'),
+               (1, 2, 'S', u' '),
+               (1, 3, tt.IDENT, u'a5'),
+               (1, 5, 'S', u' '),
+               (1, 6, tt.IDENT, u'a5a'),
+               (1, 9, 'S', u' '),
+               (1, 10, tt.NUMBER, u'5'),
+               (1, 11, 'S', u' '),
+               (1, 12, tt.DIMENSION, u'5a'),
+               (1, 14, 'S', u' '),
+               (1, 15, tt.DIMENSION, u'5a5')],
+
+            # URI
+            u'url()': [(1, 1, tt.URI, u'url()')],
+            u'url();': [(1, 1, tt.URI, u'url()'), (1, 6, tt.SEMICOLON, ';')],
+            u'url("x")': [(1, 1, tt.URI, u'url("x")')],
+            u'url( "x")': [(1, 1, tt.URI, u'url("x")')],
+            u'url("x" )': [(1, 1, tt.URI, u'url("x")')],
+            u'url( "x" )': [(1, 1, tt.URI, u'url("x")')],
+            u' url("x")': [
+                (1, 1, 'S', u' '),
+                (1, 2, tt.URI, u'url("x")')],
+            u'url("x") ': [
+                (1, 1, tt.URI, u'url("x")'),
+                (1, 9, 'S', u' '),
+                ],
+            u'url(ab)': [(1, 1, tt.URI, u'url(ab)')],
+            u'url($#/ab)': [(1, 1, tt.URI, u'url($#/ab)')],
+            u'url(\1233/a/b)': [(1, 1, tt.URI, u'url(\1233/a/b)')],
+            # not URI
+            u'url("1""2")': [
+                (1, 1, tt.FUNCTION, u'url('),
+                (1, 5, tt.STRING, u'"1"'),
+                (1, 8, tt.STRING, u'"2"'),
+                (1, 11, tt.RPARANTHESIS, u')'),
+                ],
+            u'url(a"2")': [
+                (1, 1, tt.FUNCTION, u'url('),
+                (1, 5, tt.IDENT, u'a'),
+                (1, 6, tt.STRING, u'"2"'),
+                (1, 9, tt.RPARANTHESIS, u')'),
+                ],
+            u'url(a b)': [
+                (1, 1, tt.FUNCTION, u'url('),
+                (1, 5, tt.IDENT, u'a'),
+                (1, 6, 'S', u' '),
+                (1, 7, tt.IDENT, u'b'),
+                (1, 8, tt.RPARANTHESIS, u')'),
+                ],
+
+            # FUNCTION
+            u' counter("x")': [
+               (1,1, 'S', u' '),
+               (1, 2, tt.FUNCTION, u'counter('),
+               (1, 10, tt.STRING, u'"x"'),
+               (1, 13, tt.RPARANTHESIS, u')')],
+            # HASH
+            u'# #a #_a #-a #1': [
+                (1, 1, 'DELIM', u'#'),
+                (1, 2, 'S', u' '),
+                (1, 3, tt.HASH, u'#a'),
+                (1, 5, 'S', u' '),
+                (1, 6, tt.HASH, u'#_a'),
+                (1, 9, 'S', u' '),
+                (1, 10, tt.HASH, u'#-a'),
+                (1, 13, 'S', u' '),
+                (1, 14, tt.HASH, u'#1')
+                ],
+            u'#1a1 ': [
+                (1, 1, tt.HASH, u'#1a1'),
+                (1, 5, 'S', u' '),
+                ],
+            u'#1a1\n': [
+                (1, 1, tt.HASH, u'#1a1'),
+                (1, 5, 'S', u'\n'),
+                ],
+            u'#1a1{': [
+                (1, 1, tt.HASH, u'#1a1'),
+                (1, 5, tt.LBRACE, u'{'),
+                ],
+            u'#1a1 {': [
+                (1, 1, tt.HASH, u'#1a1'),
+                (1, 5, 'S', u' '),
+                (1, 6, tt.LBRACE, u'{'),
+                ],
+            u'#1a1\n{': [
+                (1, 1, tt.HASH, u'#1a1'),
+                (1, 5, 'S', u'\n'),
+                (2, 1, tt.LBRACE, u'{'),
+                ],
+            u'#1a1\n {': [
+                (1, 1, tt.HASH, u'#1a1'),
+                (1, 5, 'S', u'\n '),
+                (2, 2, tt.LBRACE, u'{'),
+                ],
+            u'#1a1 \n{': [
+                (1, 1, tt.HASH, u'#1a1'),
+                (1, 5, 'S', u' \n'),
+                (2, 1, tt.LBRACE, u'{'),
+                ],
+            # STRINGS with NL
+            u'"x\n': [(1,1, tt.INVALID, u'"x\n')],
+            u'"x\r': [(1,1, tt.INVALID, u'"x\r')],
+            u'"x\f': [(1,1, tt.INVALID, u'"x\f')],
+            u'"x\n ': [
+               (1,1, tt.INVALID, u'"x\n'),
+               (2,1, 'S', u' ')
+               ]
+
+            }
+
+        tests = {
+            u'/*a': xml.dom.SyntaxErr,
+            u'"a': xml.dom.SyntaxErr,
+            u"'a": xml.dom.SyntaxErr,
+            u"\\0 a": xml.dom.SyntaxErr,
+            u"\\00": xml.dom.SyntaxErr,
+            u"\\000": xml.dom.SyntaxErr,
+            u"\\0000": xml.dom.SyntaxErr,
+            u"\\00000": xml.dom.SyntaxErr,
+            u"\\000000": xml.dom.SyntaxErr,
+            u"\\0000001": xml.dom.SyntaxErr
+            }
+#        self.tokenizer.log.raiseExceptions = True #!!
+#        for css, exception in tests.items():
+#            self.assertRaises(exception, self.tokenizer.tokenize, css)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_parse.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_parse.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_parse.py	(revision 1126)
@@ -0,0 +1,496 @@
+# -*- coding: utf-8 -*-
+"""Tests for parsing which does not raise Exceptions normally"""
+from __future__ import with_statement
+
+
+import sys
+import xml.dom
+import basetest
+import cssutils
+import urllib2
+
+try:
+    import mock
+except ImportError:
+    mock = None
+    print "install mock library to run all tests"
+
+
+class CSSParserTestCase(basetest.BaseTestCase):
+
+    def _make_fetcher(self, encoding, content):
+        "make an URL fetcher with specified data"
+        def fetcher(url):
+            return encoding, content            
+        return fetcher
+
+    def setUp(self):
+        self._saved = cssutils.log.raiseExceptions
+
+    def tearDown(self):
+        cssutils.log.raiseExceptions = self._saved
+
+    def test_init(self):
+        "CSSParser.__init__()"
+        self.assertEqual(True, cssutils.log.raiseExceptions)
+
+        # also the default:
+        cssutils.log.raiseExceptions = True
+
+        # default non raising parser
+        p = cssutils.CSSParser()
+        s = p.parseString('$')
+        self.assertEqual(s.cssText, u''.encode())
+
+        # explicit raiseExceptions=False
+        p = cssutils.CSSParser(raiseExceptions=False)
+        s = p.parseString('$')
+        self.assertEqual(s.cssText, u''.encode())
+
+        # working with sheet does raise though!
+        self.assertRaises(xml.dom.DOMException, s.__setattr__, u'cssText', u'$')
+
+        # ----
+
+        # raiseExceptions=True
+        p = cssutils.CSSParser(raiseExceptions=True)
+        self.assertRaises(xml.dom.SyntaxErr, p.parseString, u'$')
+
+        # working with a sheet does raise too
+        s = cssutils.css.CSSStyleSheet()
+        self.assertRaises(xml.dom.DOMException, s.__setattr__, u'cssText', u'$')
+
+        # RESET cssutils.log.raiseExceptions
+        cssutils.log.raiseExceptions = False
+        s = cssutils.css.CSSStyleSheet()
+        # does not raise!
+        s.__setattr__(u'cssText', u'$')
+        self.assertEqual(s.cssText, ''.encode())
+
+    def test_parseComments(self):
+        "cssutils.CSSParser(parseComments=False)"
+        css = u'/*1*/ a { color: /*2*/ red; }'
+
+        p = cssutils.CSSParser(parseComments=False)
+        self.assertEqual(p.parseString(css).cssText,
+                         u'a {\n    color: red\n    }'.encode())
+        p = cssutils.CSSParser(parseComments=True)
+        self.assertEqual(p.parseString(css).cssText,
+                         u'/*1*/\na {\n    color: /*2*/ red\n    }'.encode())
+
+#    def test_parseFile(self):
+#        "CSSParser.parseFile()"
+#        # see test_cssutils
+
+    def test_parseUrl(self):
+        "CSSParser.parseUrl()"
+        if mock:
+            # parseUrl(self, href, encoding=None, media=None, title=None):
+            parser = cssutils.CSSParser()
+            m = mock.Mock()
+            with mock.patch('cssutils.util._defaultFetcher', m):
+                m.return_value = (None, '')                 
+                sheet = parser.parseUrl('http://example.com',
+                                        media='tv,print',
+                                        title='test')
+                
+            self.assertEqual(sheet.href, u'http://example.com')
+            self.assertEqual(sheet.encoding, u'utf-8')
+            self.assertEqual(sheet.media.mediaText, u'tv, print')
+            self.assertEqual(sheet.title, u'test')
+
+            # URL and content tests
+            tests = {
+                # (url, content): isSheet, encoding, cssText
+                ('', None): (False, None, None),
+                ('1', None): (False, None, None),
+                ('mailto:a@bb.cd', None): (False, None, None),
+                ('http://cthedot.de/test.css', None): (False, None, None),
+                ('http://cthedot.de/test.css', ''): (True, u'utf-8', u''),
+                ('http://cthedot.de/test.css', 'a'): (True, u'utf-8', u''),
+                ('http://cthedot.de/test.css', 'a {color: red}'): (True, u'utf-8',
+                                                                 u'a {\n    color: red\n    }'),
+                ('http://cthedot.de/test.css', 'a {color: red}'): (True, u'utf-8',
+                                                                 u'a {\n    color: red\n    }'),
+                ('http://cthedot.de/test.css', '@charset "ascii";a {color: red}'): (True, u'ascii',
+                                                                 u'@charset "ascii";\na {\n    color: red\n    }'),
+            }
+            override = 'iso-8859-1'
+            overrideprefix = u'@charset "iso-8859-1";'
+            httpencoding = None
+
+            for (url, content), (isSheet, expencoding, cssText) in tests.items():
+                parser.setFetcher(self._make_fetcher(httpencoding, content))
+                sheet1 = parser.parseUrl(url)
+                sheet2 = parser.parseUrl(url, encoding=override)
+                if isSheet:
+                    self.assertEqual(sheet1.encoding, expencoding)
+                    self.assertEqual(sheet1.cssText, cssText.encode())
+                    self.assertEqual(sheet2.encoding, override)
+                    if sheet1.cssText and cssText.startswith('@charset'):
+                        self.assertEqual(sheet2.cssText, (cssText.replace('ascii', override).encode()))
+                    elif sheet1.cssText:
+                        self.assertEqual(sheet2.cssText, (overrideprefix + '\n' + cssText).encode())
+                    else:
+                        self.assertEqual(sheet2.cssText, (overrideprefix + cssText).encode())
+                else:
+                    self.assertEqual(sheet1, None)
+                    self.assertEqual(sheet2, None)
+
+            parser.setFetcher(None)
+
+            self.assertRaises(ValueError, parser.parseUrl, '../not-valid-in-urllib')
+            self.assertRaises(urllib2.HTTPError, parser.parseUrl, 'http://cthedot.de/not-present.css')
+
+        else:
+            self.assertEqual(False, u'Mock needed for this test')
+
+    def test_parseString(self):
+        "CSSParser.parseString()"
+        tests = {
+            # (byte) string, encoding: encoding, cssText
+            ('/*a*/', None): (u'utf-8', u'/*a*/'.encode('utf-8')),
+            ('/*a*/', 'ascii'): (u'ascii', u'@charset "ascii";\n/*a*/'.encode('ascii')),
+
+            # org
+            #('/*\xc3\xa4*/', None): (u'utf-8', u'/*\xc3\xa4*/'.encode('utf-8')),
+            #('/*\xc3\xa4*/', 'utf-8'): (u'utf-8', u'@charset "utf-8";\n/*\xc3\xa4*/'.encode('utf-8')),
+            # new for 2.x and 3.x
+            (u'/*\xe4*/'.encode('utf-8'), None): (u'utf-8', u'/*\xe4*/'.encode('utf-8')),
+            (u'/*\xe4*/'.encode('utf-8'), 'utf-8'): (u'utf-8', u'@charset "utf-8";\n/*\xe4*/'.encode('utf-8')),
+
+            ('@charset "ascii";/*a*/', None): (u'ascii', u'@charset "ascii";\n/*a*/'.encode('ascii')),
+            ('@charset "utf-8";/*a*/', None): (u'utf-8', u'@charset "utf-8";\n/*a*/'.encode('utf-8')),
+            ('@charset "iso-8859-1";/*a*/', None): (u'iso-8859-1', u'@charset "iso-8859-1";\n/*a*/'.encode('iso-8859-1')),
+
+            # unicode string, no encoding: encoding, cssText
+            (u'/*€*/', None): (
+               u'utf-8', u'/*€*/'.encode('utf-8')),
+            (u'@charset "iso-8859-1";/*ä*/', None): (
+               u'iso-8859-1', u'@charset "iso-8859-1";\n/*ä*/'.encode('iso-8859-1')),
+            (u'@charset "utf-8";/*€*/', None): (
+               u'utf-8', u'@charset "utf-8";\n/*€*/'.encode('utf-8')),
+            (u'@charset "utf-16";/**/', None): (
+               u'utf-16', u'@charset "utf-16";\n/**/'.encode('utf-16')),
+            # unicode string, encoding utf-8: encoding, cssText
+            (u'/*€*/', 'utf-8'): ('utf-8',
+               u'@charset "utf-8";\n/*€*/'.encode('utf-8')),
+            (u'@charset "iso-8859-1";/*ä*/', 'utf-8'): (
+               u'utf-8', u'@charset "utf-8";\n/*ä*/'.encode('utf-8')),
+            (u'@charset "utf-8";/*€*/', 'utf-8'): (
+               u'utf-8', u'@charset "utf-8";\n/*€*/'.encode('utf-8')),
+            (u'@charset "utf-16";/**/', 'utf-8'): (
+               u'utf-8', u'@charset "utf-8";\n/**/'.encode('utf-8')),
+            # probably not what is wanted but does not raise:
+            (u'/*€*/', 'ascii'): (
+               u'ascii', u'@charset "ascii";\n/*\\20AC */'.encode('utf-8')),
+            (u'/*€*/', 'iso-8859-1'): (
+               u'iso-8859-1', u'@charset "iso-8859-1";\n/*\\20AC */'.encode('utf-8')),
+        }
+        for test in tests:
+            css, encoding = test
+            sheet = cssutils.parseString(css, encoding=encoding)
+            encoding, cssText = tests[test]
+            self.assertEqual(encoding, sheet.encoding)
+            self.assertEqual(cssText, sheet.cssText)
+
+        tests = [
+            # encoded css, overiding encoding
+            (u'/*€*/'.encode('utf-16'), 'utf-8'),
+            (u'/*ä*/'.encode('iso-8859-1'), 'ascii'),
+            (u'/*€*/'.encode('utf-8'), 'ascii'),
+            (u'a'.encode('ascii'), 'utf-16'),
+        ]
+        for test in tests:
+            #self.assertEqual(None, cssutils.parseString(css, encoding=encoding))
+            self.assertRaises(UnicodeDecodeError, cssutils.parseString, test[0], test[1])
+
+    def test_validate(self):
+        """CSSParser(validate)"""
+        style = 'color: red'
+        t = 'a { %s }' % style
+
+        # helper
+        s = cssutils.parseString(t)
+        self.assertEqual(s.validating, True)
+        s = cssutils.parseString(t, validate=False)
+        self.assertEqual(s.validating, False)
+        s = cssutils.parseString(t, validate=True)
+        self.assertEqual(s.validating, True)
+
+        d = cssutils.parseStyle(style)
+        self.assertEqual(d.validating, True)
+        d = cssutils.parseStyle(style, validate=True)
+        self.assertEqual(d.validating, True)
+        d = cssutils.parseStyle(style, validate=False)
+        self.assertEqual(d.validating, False)
+
+        # parser
+        p = cssutils.CSSParser()
+        s = p.parseString(t)
+        self.assertEqual(s.validating, True)
+        s = p.parseString(t, validate=False)
+        self.assertEqual(s.validating, False)
+        s = p.parseString(t, validate=True)
+        self.assertEqual(s.validating, True)
+        d = p.parseStyle(style)
+        self.assertEqual(d.validating, True)
+
+        p = cssutils.CSSParser(validate=True)
+        s = p.parseString(t)
+        self.assertEqual(s.validating, True)
+        s = p.parseString(t, validate=False)
+        self.assertEqual(s.validating, False)
+        s = p.parseString(t, validate=True)
+        self.assertEqual(s.validating, True)
+        d = p.parseStyle(style)
+        self.assertEqual(d.validating, True)
+
+        p = cssutils.CSSParser(validate=False)
+        s = p.parseString(t)
+        self.assertEqual(s.validating, False)
+        s = p.parseString(t, validate=False)
+        self.assertEqual(s.validating, False)
+        s = p.parseString(t, validate=True)
+        self.assertEqual(s.validating, True)
+        d = p.parseStyle(style)
+        self.assertEqual(d.validating, False)
+
+        # url        
+        p = cssutils.CSSParser(validate=False)
+        p.setFetcher(self._make_fetcher('utf-8', t))
+        u = 'url'
+        s = p.parseUrl(u)
+        self.assertEqual(s.validating, False)
+        s = p.parseUrl(u, validate=False)
+        self.assertEqual(s.validating, False)
+        s = p.parseUrl(u, validate=True)
+        self.assertEqual(s.validating, True)
+
+        # check if it raises see log test
+
+
+    def test_fetcher(self):
+        """CSSParser.fetcher
+
+        order:
+           0. explicity given encoding OVERRIDE (cssutils only)
+
+           1. An HTTP "charset" parameter in a "Content-Type" field (or similar parameters in other protocols)
+           2. BOM and/or @charset (see below)
+           3. <link charset=""> or other metadata from the linking mechanism (if any)
+           4. charset of referring style sheet or document (if any)
+           5. Assume UTF-8
+        """
+        tests = {
+            # css, encoding, (mimetype, encoding, importcss):
+            #    encoding, importIndex, importEncoding, importText
+
+            # 0/0 override/override => ASCII/ASCII
+            (u'@charset "utf-16"; @import "x";', 'ASCII', ('iso-8859-1',
+                                                          u'@charset "latin1";/*t*/')): (
+                 'ascii', 1, 'ascii', u'@charset "ascii";\n/*t*/'.encode()),
+            # 1/1 not tested her but same as next
+            # 2/1 @charset/HTTP => UTF-16/ISO-8859-1
+            (u'@charset "UTF-16"; @import "x";', None, ('ISO-8859-1',
+                                                       u'@charset "latin1";/*t*/')): (
+                 'utf-16', 1, 'iso-8859-1', u'@charset "iso-8859-1";\n/*t*/'.encode('iso-8859-1')),
+            # 2/2 @charset/@charset => UTF-16/ISO-8859-1
+            (u'@charset "UTF-16"; @import "x";', None, 
+                (None, u'@charset "ISO-8859-1";/*t*/')): (
+                 'utf-16', 1, 'iso-8859-1', u'@charset "iso-8859-1";\n/*t*/'.encode('iso-8859-1')),
+            # 2/4 @charset/referrer => ASCII/ASCII
+            ('@charset "ASCII"; @import "x";', None, (None, u'/*t*/')): (
+                 'ascii', 1, 'ascii', u'@charset "ascii";\n/*t*/'.encode()),
+            # 5/5 default/default or referrer
+            ('@import "x";', None, (None, u'/*t*/')): (
+                 'utf-8', 0, 'utf-8', u'/*t*/'.encode()),
+            # 0/0 override/override+unicode
+            ('@charset "utf-16"; @import "x";', 'ASCII', (
+                     None, u'@charset "latin1";/*\u0287*/')): (
+                 'ascii', 1, 'ascii', u'@charset "ascii";\n/*\\287 */'.encode()),
+            # 2/1 @charset/HTTP+unicode
+            ('@charset "ascii"; @import "x";', None, ('iso-8859-1', u'/*\u0287*/')): (
+                 'ascii', 1, 'iso-8859-1', u'@charset "iso-8859-1";\n/*\\287 */'.encode()),
+            # 2/4 @charset/referrer+unicode
+            ('@charset "ascii"; @import "x";', None, (None, u'/*\u0287*/')): (
+                 'ascii', 1, 'ascii', u'@charset "ascii";\n/*\\287 */'.encode()),
+            # 5/1 default/HTTP+unicode
+            ('@import "x";', None, ('ascii', u'/*\u0287*/')): (
+                 'utf-8', 0, 'ascii', u'@charset "ascii";\n/*\\287 */'.encode()),
+            # 5/5 default+unicode/default+unicode
+            ('@import "x";', None, (None, u'/*\u0287*/')): (
+                 'utf-8', 0, 'utf-8', u'/*\u0287*/'.encode('utf-8'))
+        }
+        parser = cssutils.CSSParser()
+        for test in tests:
+            css, encoding, fetchdata = test
+            sheetencoding, importIndex, importEncoding, importText = tests[test]
+
+            # use setFetcher
+            parser.setFetcher(self._make_fetcher(*fetchdata))
+            # use init
+            parser2 = cssutils.CSSParser(fetcher=self._make_fetcher(*fetchdata))
+
+            sheet = parser.parseString(css, encoding=encoding)
+            sheet2 = parser2.parseString(css, encoding=encoding)
+
+            # sheet
+            self.assertEqual(sheet.encoding, sheetencoding)
+            self.assertEqual(sheet2.encoding, sheetencoding)
+            # imported sheet
+            self.assertEqual(sheet.cssRules[importIndex].styleSheet.encoding,
+                             importEncoding)
+            self.assertEqual(sheet2.cssRules[importIndex].styleSheet.encoding,
+                             importEncoding)
+            self.assertEqual(sheet.cssRules[importIndex].styleSheet.cssText,
+                             importText)
+            self.assertEqual(sheet2.cssRules[importIndex].styleSheet.cssText,
+                             importText)
+
+    def test_roundtrip(self):
+        "cssutils encodings"
+        css1 = ur'''@charset "utf-8";
+/* ä */'''
+        s = cssutils.parseString(css1)
+        css2 = unicode(s.cssText, 'utf-8')
+        self.assertEqual(css1, css2)
+
+        s = cssutils.parseString(css2)
+        s.cssRules[0].encoding='ascii'
+        css3 = ur'''@charset "ascii";
+/* \E4  */'''
+        self.assertEqual(css3, unicode(s.cssText, 'utf-8'))
+
+    def test_escapes(self):
+        "cssutils escapes"
+        css = ur'\43\x { \43\x: \43\x !import\41nt }'
+        sheet = cssutils.parseString(css)
+        self.assertEqual(sheet.cssText, ur'''C\x {
+    c\x: C\x !important
+    }'''.encode())
+
+        css = ur'\ x{\ x :\ x ;y:1} '
+        sheet = cssutils.parseString(css)
+        self.assertEqual(sheet.cssText, ur'''\ x {
+    \ x: \ x;
+    y: 1
+    }'''.encode())
+
+    def test_invalidstring(self):
+        "cssutils.parseString(INVALID_STRING)"
+        validfromhere = '@namespace "x";'
+        csss = (
+            u'''@charset "ascii
+                ;''' + validfromhere,
+            u'''@charset 'ascii
+                ;''' + validfromhere,
+            u'''@namespace "y
+                ;''' + validfromhere,
+            u'''@import "y
+                ;''' + validfromhere,
+            u'''@import url('a
+                );''' + validfromhere,
+            u'''@unknown "y
+                ;''' + validfromhere)
+        for css in csss:
+            s = cssutils.parseString(css)
+            self.assertEqual(validfromhere.encode(), s.cssText)
+
+        csss = (u'''a { font-family: "Courier
+                ; }''',
+                ur'''a { content: "\"; }
+                ''',
+                ur'''a { content: "\\\"; }
+                '''
+        )
+        for css in csss:
+            self.assertEqual(u''.encode(), cssutils.parseString(css).cssText)
+
+    def test_invalid(self):
+        "cssutils.parseString(INVALID_CSS)"
+        tests = {
+            u'a {color: blue}} a{color: red} a{color: green}':
+                u'''a {
+    color: blue
+    }
+a {
+    color: green
+    }''',
+            u'p @here {color: red} p {color: green}': u'p {\n    color: green\n    }'
+            }
+
+        for css in tests:
+            exp = tests[css]
+            if exp == None:
+                exp = css
+            s = cssutils.parseString(css)
+            self.assertEqual(exp.encode(), s.cssText)
+
+    def test_nesting(self):
+        "cssutils.parseString nesting"
+        # examples from csslist 27.11.2007
+        tests = {
+            '@1; div{color:green}': u'div {\n    color: green\n    }',
+            '@1 []; div{color:green}': u'div {\n    color: green\n    }',
+            '@1 [{}]; div { color:green; }': u'div {\n    color: green\n    }',
+            '@media all { @ } div{color:green}':
+                u'div {\n    color: green\n    }',
+            # should this be u''?
+            '@1 { [ } div{color:green}': u'',
+            # red was eaten:
+            '@1 { [ } ] div{color:red}div{color:green}': u'div {\n    color: green\n    }',
+             }
+        for css, exp in tests.items():
+            self.assertEqual(exp.encode(), cssutils.parseString(css).cssText)
+
+    def test_specialcases(self):
+        "cssutils.parseString(special_case)"
+        tests = {
+            u'''
+    a[title="a not s\
+o very long title"] {/*...*/}''': u'''a[title="a not so very long title"] {
+    /*...*/
+    }'''
+        }
+        for css in tests:
+            exp = tests[css]
+            if exp == None:
+                exp = css
+            s = cssutils.parseString(css)
+            self.assertEqual(exp.encode(), s.cssText)
+
+    def test_iehack(self):
+        "IEhack: $property (not since 0.9.5b3)"
+        # $color is not color!
+        css = 'a { color: green; $color: red; }'
+        s = cssutils.parseString(css)
+
+        p1 = s.cssRules[0].style.getProperty('color')
+        self.assertEqual('color', p1.name)
+        self.assertEqual('color', p1.literalname)
+        self.assertEqual('', s.cssRules[0].style.getPropertyValue('$color'))
+
+        p2 = s.cssRules[0].style.getProperty('$color')
+        self.assertEqual(None, p2)
+
+        self.assertEqual('green', s.cssRules[0].style.getPropertyValue('color'))
+        self.assertEqual('green', s.cssRules[0].style.color)
+
+    def test_attributes(self):
+        "cssutils.parseString(href, media)"
+        s = cssutils.parseString("a{}", href="file:foo.css", media="screen, projection, tv")
+        self.assertEqual(s.href, "file:foo.css")
+        self.assertEqual(s.media.mediaText, "screen, projection, tv")
+
+        s = cssutils.parseString("a{}", href="file:foo.css", media=["screen", "projection", "tv"])
+        self.assertEqual(s.media.mediaText, "screen, projection, tv")
+
+    def tearDown(self):
+        # needs to be reenabled here for other tests
+        cssutils.log.raiseExceptions = True
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/basetest.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/basetest.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/basetest.py	(revision 1126)
@@ -0,0 +1,175 @@
+"""Base class for all tests"""
+
+import logging
+import os
+import sys
+import StringIO
+import unittest
+import urllib2
+from email import message_from_string, message_from_file
+
+# add src to PYTHONPATH
+sys.path.append(os.path.join(os.path.abspath('.'), '..'))
+
+import cssutils
+
+
+PY2x = sys.version_info < (3,0)
+
+def msg3x(msg):
+    """msg might contain unicode repr `u'...'` which in py3 is `u'...`
+    needed by tests using ``assertRaisesMsg``"""
+    if not PY2x and msg.find("u'"):
+        msg = msg.replace("u'", "'")
+    return msg
+
+
+class BaseTestCase(unittest.TestCase):
+
+    def _tempSer(self):
+        "Replace default ser with temp ser."
+        self._ser = cssutils.ser
+        cssutils.ser = cssutils.serialize.CSSSerializer()
+
+    def _restoreSer(self):
+        "Restore the default ser."
+        cssutils.ser = self._ser
+
+    def setUp(self):
+        # a raising parser!!!
+        cssutils.log.raiseExceptions = True
+        cssutils.log.setLevel(logging.FATAL)
+        self.p = cssutils.CSSParser(raiseExceptions=True)
+
+    def tearDown(self):
+        if hasattr(self, '_ser'):
+            self._restoreSer()
+
+    def assertRaisesEx(self, exception, callable, *args, **kwargs):
+        """
+        from
+        http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/307970
+        """
+        if "exc_args" in kwargs:
+            exc_args = kwargs["exc_args"]
+            del kwargs["exc_args"]
+        else:
+            exc_args = None
+        if "exc_pattern" in kwargs:
+            exc_pattern = kwargs["exc_pattern"]
+            del kwargs["exc_pattern"]
+        else:
+            exc_pattern = None
+
+        argv = [repr(a) for a in args]\
+               + ["%s=%r" % (k,v)  for k,v in kwargs.items()]
+        callsig = "%s(%s)" % (callable.__name__, ", ".join(argv))
+
+        try:
+            callable(*args, **kwargs)
+        except exception, exc:
+            if exc_args is not None:
+                self.failIf(exc.args != exc_args,
+                            "%s raised %s with unexpected args: "\
+                            "expected=%r, actual=%r"\
+                            % (callsig, exc.__class__, exc_args, exc.args))
+            if exc_pattern is not None:
+                self.assertTrue(exc_pattern.search(str(exc)),
+                                "%s raised %s, but the exception "\
+                                "does not match '%s': %r"\
+                                % (callsig, exc.__class__, exc_pattern.pattern,
+                                   str(exc)))
+        except:
+            exc_info = sys.exc_info()
+            print exc_info
+            self.fail("%s raised an unexpected exception type: "\
+                      "expected=%s, actual=%s"\
+                      % (callsig, exception, exc_info[0]))
+        else:
+            self.fail("%s did not raise %s" % (callsig, exception))
+
+    def assertRaisesMsg(self, excClass, msg, callableObj, *args, **kwargs):
+        """
+        Just like unittest.TestCase.assertRaises,
+        but checks that the message is right too.
+
+        Usage::
+
+            self.assertRaisesMsg(
+                MyException, "Exception message",
+                my_function, (arg1, arg2)
+                )
+
+        from
+        http://www.nedbatchelder.com/blog/200609.html#e20060905T064418
+        """
+        try:
+            callableObj(*args, **kwargs)
+        except excClass, exc:
+            excMsg = unicode(exc)
+            if not msg:
+                # No message provided: any message is fine.
+                return
+            elif excMsg == msg:
+                # Message provided, and we got the right message: passes.
+                return
+            else:
+                # Message provided, and it didn't match: fail!
+                raise self.failureException(
+                    u"Right exception, wrong message: got '%s' instead of '%s'" %
+                    (excMsg, msg))
+        else:
+            if hasattr(excClass, '__name__'):
+                excName = excClass.__name__
+            else:
+                excName = str(excClass)
+            raise self.failureException(
+                "Expected to raise %s, didn't get an exception at all" %
+                excName
+                )
+
+    def do_equal_p(self, tests, att='cssText', debug=False, raising=True):
+        """
+        if raising self.p is used for parsing, else self.pf
+        """
+        p = cssutils.CSSParser(raiseExceptions=raising)
+        # parses with self.p and checks att of result
+        for test, expected in tests.items():
+            if debug:
+                print '"%s"' % test
+            s = p.parseString(test)
+            if expected is None:
+                expected = test
+            self.assertEqual(expected, unicode(s.__getattribute__(att), 'utf-8'))
+
+    def do_raise_p(self, tests, debug=False, raising=True):
+        # parses with self.p and expects raise
+        p = cssutils.CSSParser(raiseExceptions=raising)
+        for test, expected in tests.items():
+            if debug:
+                print '"%s"' % test
+            self.assertRaises(expected, p.parseString, test)
+
+    def do_equal_r(self, tests, att='cssText', debug=False):
+        # sets attribute att of self.r and asserts Equal
+        for test, expected in tests.items():
+            if debug:
+                print '"%s"' % test
+            self.r.__setattr__(att, test)
+            if expected is None:
+                expected = test
+            self.assertEqual(expected, self.r.__getattribute__(att))
+
+    def do_raise_r(self, tests, att='_setCssText', debug=False):
+        # sets self.r and asserts raise
+        for test, expected in tests.items():
+            if debug:
+                print '"%s"' % test
+            self.assertRaises(expected, self.r.__getattribute__(att), test)
+
+    def do_raise_r_list(self, tests, err, att='_setCssText', debug=False):
+        # sets self.r and asserts raise
+        for test in tests:
+            if debug:
+                print '"%s"' % test
+            self.assertRaises(err, self.r.__getattribute__(att), test)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_value.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_value.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_value.py	(revision 1126)
@@ -0,0 +1,1148 @@
+"""Testcases for cssutils.css.CSSValue and CSSPrimitiveValue."""
+
+# from decimal import Decimal # maybe for later tests?
+import xml.dom
+import basetest
+import cssutils
+import types
+
+
+class PropertyValueTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        self.r = cssutils.css.PropertyValue()
+
+    def test_init(self):
+        "PropertyValue.__init__() .item() .length"
+        pv = cssutils.css.PropertyValue()
+        self.assertEqual(u'', pv.cssText)
+        self.assertEqual(0, pv.length)
+        self.assertEqual(u'', pv.value)
+
+        cssText = u'0, 0/0 1px var(x) url(x)'
+        items = [u'0', u'0', u'0', u'1px', u'var(x)', 'url(x)']
+        pv = cssutils.css.PropertyValue(cssText)
+        self.assertEqual(cssText, pv.cssText)
+        self.assertEqual(6, len(pv))
+        self.assertEqual(6, pv.length)
+
+        # __iter__
+        for i, x in enumerate(pv):
+            self.assertEqual(x.cssText, items[i])
+
+        # cssText
+        for i, item in enumerate(items):
+            self.assertEqual(item, pv[i].cssText)
+            self.assertEqual(item, pv.item(i).cssText)
+
+    def test_cssText(self):
+        "PropertyValue.cssText"
+        tests = {
+                 u'0': (None, 1, None),
+                 u'0 0': (None, 2, None),
+                 u'0, 0': (None, 2, None),
+                 u'0,0': (u'0, 0', 2, None),
+                 u'0  ,   0': (u'0, 0', 2, None),
+                 u'0/0': (None, 2, None),
+                 u'/**/ 0 /**/': (None, 1, u'0'),
+                 u'0 /**/ 0 /**/ 0': (None, 3, u'0 0 0'),
+                 u'0, /**/ 0, /**/ 0': (None, 3, u'0, 0, 0'),
+                 u'0//**/ 0//**/ 0': (None, 3, u'0/0/0'),
+                 u'/**/ red': (None, 1, u'red'),
+                 u'/**/red': (u'/**/ red', 1, u'red'),
+                 u'red /**/': (None, 1, u'red'),
+                 u'red/**/': (u'red /**/', 1, u'red'),
+
+                 u'a()1,-1,+1,1%,-1%,1px,-1px,"a",a,url(a),#aabb44': (
+                 u'a() 1, -1, +1, 1%, -1%, 1px, -1px, "a", a, url(a), #ab4',
+                    12, u'a() 1, -1, +1, 1%, -1%, 1px, -1px, "a", a, url(a), #ab4'),
+
+                # calc values
+                 u'calc(1)': (None, 1, u'calc(1)'),
+                 u'calc( 1)': (u'calc(1)', 1, u'calc(1)'),
+                 u'calc(1 )': (u'calc(1)', 1, u'calc(1)'),
+                 u'calc(1px)': (None, 1, u'calc(1px)'),
+                 u'calc(1p-x-)': (None, 1, u'calc(1p-x-)'),
+                 u'calc(1%)': (None, 1, u'calc(1%)'),
+                 u'calc(-1)': (None, 1, u'calc(-1)'),
+                 u'calc(+1)': (None, 1, u'calc(+1)'),
+                 u'calc(1  +   1px)': (u'calc(1 + 1px)', 1, u'calc(1 + 1px)'),
+                 u'calc(1 - 1px)': (None, 1, u'calc(1 - 1px)'),
+                 u'calc(1*1px)': (u'calc(1 * 1px)', 1, u'calc(1 * 1px)'),
+                 u'calc(1  /  1px)': (u'calc(1 / 1px)', 1, u'calc(1 / 1px)'),
+                 u'calc( 1*1px)': (u'calc(1 * 1px)', 1, u'calc(1 * 1px)'),
+                 u'calc( 1  /  1px)': (u'calc(1 / 1px)', 1, u'calc(1 / 1px)'),
+                 u'calc(1*1px )': (u'calc(1 * 1px)', 1, u'calc(1 * 1px)'),
+                 u'calc(1  /  1px )': (u'calc(1 / 1px)', 1, u'calc(1 / 1px)'),
+                 u'calc( 1*1px )': (u'calc(1 * 1px)', 1, u'calc(1 * 1px)'),
+                 u'calc( 1  /  1px )': (u'calc(1 / 1px)', 1, u'calc(1 / 1px)'),
+                 u'calc(var(X))': (None, 1, None),
+                 u'calc(2 * var(X))': (None, 1, None),
+                 u'calc(2px + var(X))': (None, 1, None),
+
+                 #issue #24
+                 u'rgb(0, 10, 255)': (None, 1, u'rgb(0, 10, 255)'),
+                 u'hsl(10, 10%, 25%)': (None, 1, u'hsl(10, 10%, 25%)'),
+                 u'rgba(0, 10, 255, 0.5)': (None, 1, u'rgba(0, 10, 255, 0.5)'),
+                 u'hsla(10, 10%, 25%, 0.5)': (None, 1, u'hsla(10, 10%, 25%, 0.5)'),
+
+                #issue #27
+                u'matrix(0.000092, 0.2500010, -0.250000, 0.000092, 0, 0)': (
+                    u'matrix(0.000092, 0.250001, -0.25, 0.000092, 0, 0)', 1,
+                    u'matrix(0.000092, 0.250001, -0.25, 0.000092, 0, 0)')
+                 }
+        for (cssText, (c, l, v)) in tests.items():
+            if c is None:
+                c = cssText
+            if v is None:
+                v = c
+
+            pv = cssutils.css.PropertyValue(cssText)
+            self.assertEqual(c, pv.cssText)
+            self.assertEqual(l, pv.length)
+            self.assertEqual(v, pv.value)
+
+        tests = {
+                u'0 0px -0px +0px': (u'0 0 0 0', 4),
+                u'1 2 3 4': (None, 4),
+                u'-1 -2 -3 -4': (None, 4),
+                u'-1 2': (None, 2),
+                u'-1px red "x"': (None, 3),
+                u'a, b c': (None, 3),
+                u'1px1 2% 3': (u'1px1 2% 3', 3),
+                u'f(+1pX, -2, 5%) 1': (u'f(+1px, -2, 5%) 1', 2),
+                u'0 f()0': (u'0 f() 0', 3),
+                u'f()0': (u'f() 0', 2),
+                u'f()1%': (u'f() 1%', 2),
+                u'f()1px': (u'f() 1px', 2),
+                u'f()"str"': (u'f() "str"', 2),
+                u'f()ident': (u'f() ident', 2),
+                u'f()#123': (u'f() #123', 2),
+                u'f()url()': (u'f() url()', 2),
+                u'f()f()': (u'f() f()', 2),
+                u'url(x.gif)0 0': (u'url(x.gif) 0 0', 3),
+                u'url(x.gif)no-repeat': (u'url(x.gif) no-repeat', 2)
+                }
+        for (cssText, (c, l)) in tests.items():
+            if c is None:
+                c = cssText
+            pv = cssutils.css.PropertyValue(cssText)
+            self.assertEqual(c, pv.cssText)
+            self.assertEqual(l, pv.length)
+
+        tests = {
+            # hash and rgb/a
+            u'#112234': u'#112234',
+            u'#112233': u'#123',
+            u'rgb(1,2,3)': u'rgb(1, 2, 3)',
+            u'rgb(  1  ,  2  ,  3  )': u'rgb(1, 2, 3)',
+            u'rgba(1,2,3,4)': u'rgba(1, 2, 3, 4)',
+            u'rgba(  1  ,  2  ,  3  ,  4 )': u'rgba(1, 2, 3, 4)',
+            u'rgb(-1,+2,0)': u'rgb(-1, +2, 0)',
+            u'rgba(-1,+2,0, 0)': u'rgba(-1, +2, 0, 0)',
+
+            # FUNCTION
+            u'f(1,2)': u'f(1, 2)',
+            u'f(  1  ,  2  )': u'f(1, 2)',
+            u'f(-1,+2)': u'f(-1, +2)',
+            u'f(  -1  ,  +2  )': u'f(-1, +2)',
+            u'fun(  -1  ,  +2  )': u'fun(-1, +2)',
+            u'local( x )': u'local(x)',
+            u'test(1px, #111, y, 1, 1%, "1", y(), var(x))':
+                u'test(1px, #111, y, 1, 1%, "1", y(), var(x))',
+            u'test(-1px, #111, y, -1, -1%, "1", -y())':
+                u'test(-1px, #111, y, -1, -1%, "1", -y())',
+            u'url(y)  format( "x" ,  "y" )': u'url(y) format("x", "y")',
+            u'f(1 2,3 4)': u'f(1 2, 3 4)',
+
+            # IE expression
+            ur'Expression()': u'Expression()',
+            ur'expression(-1 < +2)': u'expression(-1<+2)',
+            ur'expression(document.width == "1")': u'expression(document.width=="1")',
+            u'alpha(opacity=80)': u'alpha(opacity=80)',
+            u'alpha( opacity = 80 , x=2  )': u'alpha(opacity=80, x=2)',
+            u'expression(eval(document.documentElement.scrollTop))':
+                u'expression(eval(document.documentElement.scrollTop))',
+            #TODO
+#            u'expression((function(ele){ele.style.behavior="none";})(this))':
+#                u'expression((function(ele){ele.style.behavior="none";})(this))',
+
+            # unicode-range
+            'u+f': 'u+f',
+            'U+ABCdef': 'u+abcdef',
+
+            # url
+            'url(a)': 'url(a)',
+            'uRl(a)': 'url(a)',
+            'u\\rl(a)': 'url(a)',
+            'url("a")': 'url(a)',
+            'url(  "a"  )': 'url(a)',
+            'url(a)': 'url(a)',
+            'url(";")': 'url(";")',
+            'url(",")': 'url(",")',
+            'url(")")': 'url(")")',
+            '''url("'")''': '''url("'")''',
+            '''url('"')''': '''url("\\"")''',
+            '''url("'")''': '''url("'")''',
+
+            # operator
+            '1': '1',
+            '1 2': '1 2',
+            '1   2': '1 2',
+            '1,2': '1, 2',
+            '1,  2': '1, 2',
+            '1  ,2': '1, 2',
+            '1  ,  2': '1, 2',
+            '1/2': '1/2',
+            '1/  2': '1/2',
+            '1  /2': '1/2',
+            '1  /  2': '1/2',
+             # comment
+            '1/**/2': '1 /**/ 2',
+            '1 /**/2': '1 /**/ 2',
+            '1/**/ 2': '1 /**/ 2',
+            '1 /**/ 2': '1 /**/ 2',
+            '1  /*a*/  /*b*/  2': '1 /*a*/ /*b*/ 2',
+            # , before
+            '1,/**/2': '1, /**/ 2',
+            '1 ,/**/2': '1, /**/ 2',
+            '1, /**/2': '1, /**/ 2',
+            '1 , /**/2': '1, /**/ 2',
+            # , after
+            '1/**/,2': '1 /**/, 2',
+            '1/**/ ,2': '1 /**/, 2',
+            '1/**/, 2': '1 /**/, 2',
+            '1/**/ , 2': '1 /**/, 2',
+            # all
+            '1/*a*/  ,/*b*/  2': '1 /*a*/, /*b*/ 2',
+            '1  /*a*/,  /*b*/2': '1 /*a*/, /*b*/ 2',
+            '1  /*a*/  ,  /*b*/  2': '1 /*a*/, /*b*/ 2',
+
+            # list
+            'a b1,b2 b2,b3,b4': 'a b1, b2 b2, b3, b4',
+            'a b1  ,   b2   b2  ,  b3  ,   b4': 'a b1, b2 b2, b3, b4',
+            'u+1  ,   u+2-5': 'u+1, u+2-5',
+            u'local( x ),  url(y)  format( "x" ,  "y" )':
+                u'local(x), url(y) format("x", "y")',
+            # FUNCTION
+            u'attr( href )': u'attr(href)',
+            # PrinceXML extende FUNC syntax with nested FUNC
+            u'target-counter(attr(href),page)': u'target-counter(attr(href), page)'
+                 }
+        self.do_equal_r(tests)
+
+        tests = [
+                    u'a+',
+                    u'-',
+                    u'+',
+                    u'-%',
+                    u'+a',
+                    u'--1px',
+                    u'++1px',
+                    u'#',
+                    u'#00',
+                    u'#12x',
+                    u'#xyz',
+                    u'#0000',
+                    u'#00000',
+                    u'#0000000',
+                    u'-#0',
+                    # operator
+                    u',',
+                    u'1,,2',
+                    u'1,/**/,2',
+                    u'1  ,  /**/  ,  2',
+                    u'1,',
+                    u'1, ',
+                    u'1 ,',
+                    u'1 , ',
+                    u'1  ,  ',
+                    u'1//2',
+                    # URL
+                    u'url(x))',
+                    # string
+                    u'"',
+                    u"'",
+                    # function
+                    u'f(-)',
+                    u'f(x))',
+                    #calc
+                    u'calc(',
+                    u'calc(1',
+                    u'calc(1 + 1',
+                    u'calc(1+1)',
+                    u'calc(1-1)',
+                    u'calc(1 +1)',
+                    u'calc(1+ 1)',
+                    u'calc(1 -1)',
+                    u'calc(1- 1)',
+                    u'calc(+)',
+                    u'calc(+ 1)',
+                    u'calc(-)',
+                    u'calc(- 1)',
+                    u'calc(*)',
+                    u'calc(*1)',
+                    u'calc(* 2)',
+                    u'calc(/)',
+                    u'calc(/1)',
+                    u'calc(/ 2)',
+                    u'calc(1+)',
+                    u'calc(1 +)',
+                    u'calc(1 + )',
+                    u'calc(2px -)',
+                    u'calc(3px*)',
+                    u'calc(3px *)',
+                    u'calc(3px * )',
+                    u'calc(4em/)',
+                    u'calc(4em /)',
+                    u'calc(4em / )',
+                    u'calc(1 + + 1)',
+                    u'calc(1 ++ 1)'
+                    ]
+        self.do_raise_r_list(tests, xml.dom.SyntaxErr)
+
+    def test_list(self):
+        "PropertyValue[index]"
+        # issue #41
+        css = """div.one {color: rgb(255, 0, 0);}   """
+        sheet = cssutils.parseString(css)
+        pv = sheet.cssRules[0].style.getProperty('color').propertyValue
+        self.assertEqual(pv.value, 'rgb(255, 0, 0)')
+        self.assertEqual(pv[0].value, 'rgb(255, 0, 0)')
+
+        # issue #42
+        sheet = cssutils.parseString('body { font-family: "A", b, serif }')
+        pv = sheet.cssRules[0].style.getProperty('font-family').propertyValue
+        self.assertEqual(3, pv.length)
+        self.assertEqual(pv[0].value, 'A')
+        self.assertEqual(pv[1].value, 'b')
+        self.assertEqual(pv[2].value, 'serif')
+
+    def test_comments(self):
+        "PropertyValue with comment"
+        # issue #45
+        for t in (u'green',
+                  u'green /* comment */',
+                  u'/* comment */green',
+                  u'/* comment */green/* comment */',
+                  u'/* comment */  green  /* comment */',
+                  u'/* comment *//**/  green  /* comment *//**/',
+                  ):
+            sheet = cssutils.parseString('body {color: %s; }' % t)
+            p = sheet.cssRules[0].style.getProperties()[0]
+            self.assertEqual(p.valid, True)
+        for t in (u'gree',
+                  u'gree /* comment */',
+                  u'/* comment */gree',
+                  u'/* comment */gree/* comment */',
+                  u'/* comment */  gree  /* comment */',
+                  u'/* comment *//**/  gree  /* comment *//**/',
+                  ):
+            sheet = cssutils.parseString('body {color: %s; }' % t)
+            p = sheet.cssRules[0].style.getProperties()[0]
+            self.assertEqual(p.valid, False)
+
+    def test_incomplete(self):
+        "PropertyValue (incomplete)"
+        tests = {
+            u'url("a': u'url(a)',
+            u'url(a': u'url(a)'
+        }
+        for v, exp in tests.items():
+            s = cssutils.parseString('a { background: %s' % v)
+            v = s.cssRules[0].style.background
+            self.assertEqual(v, exp)
+
+    def test_readonly(self):
+        "PropertyValue._readonly"
+        v = cssutils.css.PropertyValue(cssText='inherit')
+        self.assertTrue(False is v._readonly)
+
+        v = cssutils.css.PropertyValue(cssText='inherit', readonly=True)
+        self.assertTrue(True is v._readonly)
+        self.assertTrue(u'inherit', v.cssText)
+        self.assertRaises(xml.dom.NoModificationAllowedErr, v._setCssText, u'x')
+        self.assertTrue(u'inherit', v.cssText)
+
+    def test_reprANDstr(self):
+        "PropertyValue.__repr__(), .__str__()"
+        cssText='inherit'
+
+        s = cssutils.css.PropertyValue(cssText=cssText)
+
+        self.assertTrue(cssText in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(cssText == s2.cssText)
+
+
+class ValueTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "Value.__init__()"
+        v = cssutils.css.Value()
+        self.assertTrue(u'' == v.cssText)
+        self.assertTrue(u'' == v.value)
+        self.assertTrue(None is  v.type)
+
+    def test_cssText(self):
+        "Value.cssText"
+        # HASH IDENT STRING UNICODE-RANGE
+        tests = {
+                 u'#123': (u'#123', u'#123', u'HASH'),
+                 u'#123456': (u'#123456', u'#123456', u'HASH'),
+                 u'#112233': (u'#123', u'#112233', u'HASH'),
+                 u'  #112233  ': (u'#123', u'#112233', u'HASH'),
+
+                 u'red': (u'red', u'red', u'IDENT'),
+                 u'  red  ': (u'red', u'red', u'IDENT'),
+                 u'red  ': (u'red', u'red', u'IDENT'),
+                 u'  red': (u'red', u'red', u'IDENT'),
+                 u'red-': (u'red-', u'red-', u'IDENT'),
+                 u'-red': (u'-red', u'-red', u'IDENT'),
+
+                 u'"red"': (u'"red"', u'red', u'STRING'),
+                 u"'red'": (u'"red"', u'red', u'STRING'),
+                 u'  "red"  ': (u'"red"', u'red', u'STRING'),
+                 ur'"red\""': (ur'"red\""', ur'red"', u'STRING'),
+                 ur"'x\"'": (ur'"x\\""', ur'x\"', 'STRING'), #???
+                 u'''"x\
+y"''': (u'"xy"', u'xy', u'STRING'),
+                 }
+        for (p, (r, n, t)) in tests.items():
+            v = cssutils.css.Value(p)
+            self.assertEqual(r, v.cssText)
+            self.assertEqual(t, v.type)
+            self.assertEqual(n, v.value)
+
+
+class ColorValueTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "ColorValue.__init__()"
+        v = cssutils.css.ColorValue()
+        self.assertEqual(v.COLOR_VALUE, v.type)
+        self.assertTrue(u'' == v.cssText)
+        self.assertTrue(u'' == v.value)
+        self.assertEqual(u'transparent', v.name)
+        self.assertEqual(None, v.colorType)
+
+    def test_cssText(self):
+        "ColorValue.cssText"
+        tests = {
+                 # HASH
+                 u'#123': (u'#123',),
+                 u'#112233': (u'#123',),
+                 # rgb
+                 u'rgb(1,2,3)': (u'rgb(1, 2, 3)',),
+                 u'rgb(1%,2%,3%)': (u'rgb(1%, 2%, 3%)',),
+                 u'rgb(-1,-1,-1)': (u'rgb(-1, -1, -1)',),
+                 u'rgb(-1%,-2%,-3%)': (u'rgb(-1%, -2%, -3%)',),
+                 # rgba
+                 u'rgba(1,2,3, 0)': (u'rgba(1, 2, 3, 0)',),
+                 # hsl
+                 u'hsl(1,2%,3%)': (u'hsl(1, 2%, 3%)',),
+                 u'hsla(1,2%,3%, 1.0)': (u'hsla(1, 2%, 3%, 1)',),
+
+                 }
+        for (p, (r, )) in tests.items():
+            v = cssutils.css.ColorValue(p)
+            self.assertEqual(v.COLOR_VALUE, v.type)
+            self.assertEqual(r, v.cssText)
+            self.assertEqual(r, v.value)
+
+            v = cssutils.css.ColorValue()
+            v.cssText = p
+            self.assertEqual(v.COLOR_VALUE, v.type)
+            self.assertEqual(r, v.cssText)
+            self.assertEqual(r, v.value)
+
+        tests = {
+             u'1': xml.dom.SyntaxErr,
+             u'a': xml.dom.SyntaxErr,
+
+             u'#12': xml.dom.SyntaxErr,
+             u'#1234': xml.dom.SyntaxErr,
+             u'#1234567': xml.dom.SyntaxErr,
+             u'#12345678': xml.dom.SyntaxErr,
+
+             u'rgb(1,1%,1%)': xml.dom.SyntaxErr,
+             u'rgb(1%,1,1)': xml.dom.SyntaxErr,
+             u'rgb(-1,-1%,-1%)': xml.dom.SyntaxErr,
+             u'rgb(-1%,-1,-1)': xml.dom.SyntaxErr,
+
+             u'rgb(1,1,1, 0)': xml.dom.SyntaxErr,
+             u'rgb(1%,1%,1%, 0)': xml.dom.SyntaxErr,
+             u'rgba(1,1,1)': xml.dom.SyntaxErr,
+             u'rgba(1%,1%,1%)': xml.dom.SyntaxErr,
+             u'rgba(1,1,1, 0%)': xml.dom.SyntaxErr,
+             u'rgba(1%,1%,1%, 0%)': xml.dom.SyntaxErr,
+
+             u'hsl(1,2%,3%, 1)': xml.dom.SyntaxErr,
+             u'hsla(1,2%,3%)': xml.dom.SyntaxErr,
+
+             u'hsl(1,2,3)': xml.dom.SyntaxErr,
+             u'hsl(1%,2,3)': xml.dom.SyntaxErr,
+             u'hsl(1%,2,3%)': xml.dom.SyntaxErr,
+             u'hsl(1%,2%,3)': xml.dom.SyntaxErr,
+
+             u'hsla(1,2%,3%, 0%)': xml.dom.SyntaxErr,
+             u'hsla(1,2,3, 0.0)': xml.dom.SyntaxErr,
+             u'hsla(1%,2,3, 0.0)': xml.dom.SyntaxErr,
+             u'hsla(1%,2,3%, 0.0)': xml.dom.SyntaxErr,
+             u'hsla(1%,2%,3, 0.0)': xml.dom.SyntaxErr,
+        }
+        self.r = cssutils.css.ColorValue()
+        self.do_raise_r(tests)
+
+    def test_rgb(self):
+        "ColorValue.red .green .blue"
+        tests = {
+            (u'#0A0AD2', 'rgb(10, 10, 210)' ): (10, 10, 210, 1.0),
+            # TODO: Fix rounding?
+            (u'hsl(240, 91%, 43%)', ): (10, 10, 209, 1.0),
+            (u'#ff8800', u'#f80',
+             'rgb(255, 136, 0)', 'rgba(255, 136, 0, 1.0)'): (255, 136, 0, 1.0),
+            (u'red', u'#ff0000', u'#f00',
+             u'hsl(0, 100%, 50%)', u'hsla(0, 100%, 50%, 1.0)'):
+                (255, 0, 0, 1.0),
+            (u'lime', u'#00ff00', u'#0f0', u'hsl(120, 100%, 50%)'):
+                (0, 255, 0, 1.0),
+            (u'rgba(255, 127, 0, .1)', u'rgba(100%, 50%, 0%, .1)'):
+                (255, 127, 0, 0.1),
+            (u'transparent', u'rgba(0, 0, 0, 0)'): (0, 0, 0, 0),
+            (u'aqua',): (0, 255, 255, 1.0)
+        }
+        for colors, rgba in tests.items():
+            for color in colors:
+                c = cssutils.css.ColorValue(color);
+                self.assertEqual(c.red, rgba[0])
+                self.assertEqual(c.green, rgba[1])
+                self.assertEqual(c.blue, rgba[2])
+                self.assertEqual(c.alpha, rgba[3])
+
+
+class URIValueTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "URIValue.__init__()"
+        v = cssutils.css.URIValue()
+        self.assertTrue(u'url()' == v.cssText)
+        self.assertTrue(u'' == v.value)
+        self.assertTrue(u'' == v.uri)
+        self.assertTrue(v.URI is  v.type)
+
+        v.uri = '1'
+        self.assertTrue(u'1' == v.value)
+        self.assertTrue(u'1' == v.uri)
+        self.assertEqual(u'url(1)', v.cssText)
+
+        v.value = '2'
+        self.assertTrue(u'2' == v.value)
+        self.assertTrue(u'2' == v.uri)
+        self.assertEqual(u'url(2)', v.cssText)
+
+    def test_absoluteUri(self):
+        "URIValue.absoluteUri"
+        s = cssutils.parseString('a { background-image: url(x.gif)}', href="/path/to/x.css")
+        v = s.cssRules[0].style.getProperty('background-image').propertyValue[0]
+        self.assertEqual(u'x.gif', v.uri)
+        self.assertEqual(u'/path/to/x.gif', v.absoluteUri)
+
+        v = cssutils.css.URIValue(u'url(x.gif)')
+        self.assertEqual(u'x.gif', v.uri)
+        self.assertEqual(u'x.gif', v.absoluteUri)
+
+    def test_cssText(self):
+        "URIValue.cssText"
+        tests = {
+                 u'url()': (u'url()', u'', u'URI'),
+                 # comments are part of the url!
+                 u'url(/**/)': (u'url(/**/)', u'/**/', u'URI'),
+                 u'url(/**/1)': (u'url(/**/1)', u'/**/1', u'URI'),
+                 u'url(1/**/)': (u'url(1/**/)', u'1/**/', u'URI'),
+                 u'url(/**/1/**/)': (u'url(/**/1/**/)', u'/**/1/**/', u'URI'),
+                 u'url(some.gif)': (u'url(some.gif)', u'some.gif', u'URI'),
+                 u'  url(some.gif)  ': (u'url(some.gif)', u'some.gif', u'URI'),
+                 u'url(   some.gif  )': (u'url(some.gif)', u'some.gif', u'URI'),
+                 }
+        for (p, (r, n, t)) in tests.items():
+            v = cssutils.css.URIValue(p)
+            self.assertEqual(r, v.cssText)
+            self.assertEqual(t, v.type)
+            self.assertEqual(n, v.value)
+            self.assertEqual(n, v.uri)
+
+            v = cssutils.css.URIValue()
+            v.cssText = p
+            self.assertEqual(r, v.cssText)
+            self.assertEqual(t, v.type)
+            self.assertEqual(n, v.value)
+            self.assertEqual(n, v.uri)
+
+        tests = {
+             u'a()': xml.dom.SyntaxErr,
+             u'1': xml.dom.SyntaxErr,
+             u'url(': xml.dom.SyntaxErr,
+             u'url("': xml.dom.SyntaxErr,
+             u'url(\'': xml.dom.SyntaxErr,
+             }
+        self.r = cssutils.css.URIValue()
+        self.do_raise_r(tests)
+
+class DimensionValueTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "DimensionValue.__init__()"
+        v = cssutils.css.DimensionValue()
+        self.assertTrue(u'' == v.cssText)
+        self.assertTrue(u'' == v.value)
+        self.assertTrue(None is  v.type)
+        self.assertTrue(None is  v.dimension)
+
+    def test_cssText(self):
+        "DimensionValue.cssText"
+        # NUMBER DIMENSION PERCENTAGE
+        tests = {
+
+                 u'0': (u'0', 0, None, u'NUMBER'),
+                 u'00': (u'0', 0, None, u'NUMBER'),
+                 u'.0': (u'0', 0, None, u'NUMBER'),
+                 u'0.0': (u'0', 0, None, u'NUMBER'),
+                 u'+0': (u'0', 0, None, u'NUMBER'),
+                 u'+00': (u'0', 0, None, u'NUMBER'),
+                 u'+.0': (u'0', 0, None, u'NUMBER'),
+                 u'+0.0': (u'0', 0, None, u'NUMBER'),
+                 u'-0': (u'0', 0, None, u'NUMBER'),
+                 u'-00': (u'0', 0, None, u'NUMBER'),
+                 u'-.0': (u'0', 0, None, u'NUMBER'),
+                 u'-0.0': (u'0', 0, None, u'NUMBER'),
+
+                 u'1': (u'1', 1, None, u'NUMBER'),
+                 u'1.0': (u'1', 1.0, None, u'NUMBER'),
+                 u'1.1': (u'1.1', 1.1, None, u'NUMBER'),
+                 u'+1': (u'+1', 1, None, u'NUMBER'),
+                 u'+1.0': (u'+1', 1.0, None, u'NUMBER'),
+                 u'+1.1': (u'+1.1', 1.1, None, u'NUMBER'),
+                 u'-1': (u'-1', -1, None, u'NUMBER'),
+                 u'-1.0': (u'-1', -1, None, u'NUMBER'),
+                 u'-1.1': (u'-1.1', -1.1, None, u'NUMBER'),
+
+                 u'0px': (u'0', 0, u'px', u'DIMENSION'),
+                 u'1px': (u'1px', 1, u'px', u'DIMENSION'),
+                 u'1.0px': (u'1px', 1.0, u'px', u'DIMENSION'),
+                 u'1.1px': (u'1.1px', 1.1, u'px', u'DIMENSION'),
+                 u'-1px': (u'-1px', -1, u'px', u'DIMENSION'),
+                 u'-1.1px': (u'-1.1px', -1.1, u'px', u'DIMENSION'),
+                 u'+1px': (u'+1px', 1, u'px', u'DIMENSION'),
+
+                 u'1px1': (u'1px1', 1, u'px1', u'DIMENSION'),
+
+                 u'0%': (u'0%', 0, u'%', u'PERCENTAGE'),
+                 u'1%': (u'1%', 1, u'%', u'PERCENTAGE'),
+                 u'1.1%': (u'1.1%', 1.1, u'%', u'PERCENTAGE'),
+                 u'-1%': (u'-1%', -1, u'%', u'PERCENTAGE'),
+                 u'-1.1%': (u'-1.1%', -1.1, u'%', u'PERCENTAGE'),
+                 u'+1%': (u'+1%', 1, u'%', u'PERCENTAGE'),
+                 }
+        for (p, (r, n, d, t)) in tests.items():
+            v = cssutils.css.DimensionValue(p)
+            self.assertEqual(r, v.cssText)
+            self.assertEqual(t, v.type)
+            self.assertEqual(n, v.value)
+            self.assertEqual(d, v.dimension)
+
+
+class CSSFunctionTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "CSSFunction.__init__()"
+        v = cssutils.css.CSSFunction()
+        self.assertEqual(u'', v.cssText)
+        self.assertEqual(u'FUNCTION', v.type)
+        self.assertEqual(v.value, u'')
+
+    def test_cssText(self):
+        "CSSFunction.cssText"
+        tests = {
+                 u'x(x)': (u'x(x)', None),
+                 u'X(  X  )': (u'x(X)', None),
+                 u'x(1,2)': (u'x(1, 2)', None),
+                 u'x(1/**/)': (u'x(1 /**/)', u'x(1)'),
+                 u'x(/**/1)': (u'x(/**/ 1)', u'x(1)'),
+                 u'x(/**/1/**/)': (u'x(/**/ 1 /**/)', u'x(1)'),
+                 u'x(/**/1,x/**/)': (u'x(/**/ 1, x /**/)', u'x(1, x)'),
+                 u'x(1,2)': (u'x(1, 2)', None),
+                 }
+        for (f, (cssText, value)) in tests.items():
+            if value is None:
+                value = cssText
+            v = cssutils.css.CSSFunction(f)
+            self.assertEqual(cssText, v.cssText)
+            self.assertEqual('FUNCTION', v.type)
+            self.assertEqual(value, v.value)
+
+
+class CSSVariableTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "CSSVariable.__init__()"
+        v = cssutils.css.CSSVariable()
+        self.assertEqual(u'', v.cssText)
+        self.assertEqual(u'VARIABLE', v.type)
+        self.assertTrue(None is v.name)
+        self.assertTrue(None is v.value)
+
+    def test_cssText(self):
+        "CSSVariable.cssText"
+        tests = {
+                 u'var(x)': (u'var(x)', u'x', None),
+                 u'VAR(  X  )': (u'var(X)', u'X', None),
+                 u'var(c1,rgb(14,14,14))': (u'var(c1, rgb(14, 14, 14))', u'c1', u'rgb(14, 14, 14)'),
+                 u'var( L, 1px )': (u'var(L, 1px)', u'L', u'1px'),
+                 u'var(L,1)': (u'var(L, 1)', u'L', u'1'),
+                 u'var(T, calc( 2 * 1px ))': (u'var(T, calc(2 * 1px))', u'T', 'calc(2 * 1px)'),
+                 u'var(U, url( example.png ) )': (u'var(U, url(example.png))', u'U', u'url(example.png)'),
+                 u'var(C, #f00 )': (u'var(C, #f00)', u'C', '#fff')
+                 }
+        for (var, (cssText, name, fallback)) in tests.items():
+            v = cssutils.css.CSSVariable(var)
+            self.assertEqual(cssText, v.cssText)
+            self.assertEqual('VARIABLE', v.type)
+            self.assertEqual(name, v.name)
+            # not resolved so it is None
+            self.assertEqual(None, v.value)
+
+
+
+#    def test_cssValueType(self):
+#        "CSSValue.cssValueType .cssValueTypeString"
+#        tests = [
+#            ([u'inherit', u'INhe\\rit'], 'CSS_INHERIT', cssutils.css.CSSValue),
+#            (['1', '1%', '1em', '1ex', '1px', '1cm', '1mm', '1in', '1pt', '1pc',
+#              '1deg', '1rad', '1grad', '1ms', '1s', '1hz', '1khz', '1other',
+#               '"string"', "'string'", 'url(x)', 'red',
+#               'attr(a)', 'counter(x)', 'rect(1px, 2px, 3px, 4px)',
+#               'rgb(0, 0, 0)', '#000', '#123456', 'rgba(0, 0, 0, 0)',
+#               'hsl(0, 0, 0)', 'hsla(0, 0, 0, 0)',
+#               ],
+#             'CSS_PRIMITIVE_VALUE', cssutils.css.CSSPrimitiveValue),
+#            ([u'1px 1px', 'red blue green x'], 'CSS_VALUE_LIST', cssutils.css.CSSValueList),
+#            # what is a custom value?
+#            #([], 'CSS_CUSTOM', cssutils.css.CSSValue)
+#            ]
+#        for values, name, cls in tests:
+#            for value in values:
+#                v = cssutils.css.CSSValue(cssText=value)
+#                if value == "'string'":
+#                    # will be changed to " always
+#                    value = '"string"'
+#                self.assertEqual(value, v.cssText)
+#                self.assertEqual(name, v.cssValueTypeString)
+#                self.assertEqual(getattr(v, name), v.cssValueType)
+#                self.assertEqual(cls, type(v))
+
+
+#class CSSPrimitiveValueTestCase(basetest.BaseTestCase):
+#
+#    def test_init(self):
+#        "CSSPrimitiveValue.__init__()"
+#        v = cssutils.css.CSSPrimitiveValue(u'1')
+#        self.assertTrue(u'1' == v.cssText)
+#
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue("CSS_PRIMITIVE_VALUE" == v.cssValueTypeString)
+#
+#        self.assertTrue(v.CSS_NUMBER == v.primitiveType)
+#        self.assertTrue("CSS_NUMBER" == v.primitiveTypeString)
+#
+#        # DUMMY to be able to test empty constructor call
+#        #self.assertRaises(xml.dom.SyntaxErr, v.__init__, None)
+#
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getCounterValue)
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getRGBColorValue)
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getRectValue)
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getStringValue)
+#
+#    def test_CSS_UNKNOWN(self):
+#        "CSSPrimitiveValue.CSS_UNKNOWN"
+#        v = cssutils.css.CSSPrimitiveValue(u'expression(false)')
+#        self.assertTrue(v.CSS_UNKNOWN == v.primitiveType)
+#        self.assertTrue('CSS_UNKNOWN' == v.primitiveTypeString)
+#
+#    def test_CSS_NUMBER_AND_OTHER_DIMENSIONS(self):
+#        "CSSPrimitiveValue.CSS_NUMBER .. CSS_DIMENSION"
+#        defs = [
+#            ('', 'CSS_NUMBER'),
+#            ('%', 'CSS_PERCENTAGE'),
+#            ('em', 'CSS_EMS'),
+#            ('ex', 'CSS_EXS'),
+#            ('px', 'CSS_PX'),
+#            ('cm', 'CSS_CM'),
+#            ('mm', 'CSS_MM'),
+#            ('in', 'CSS_IN'),
+#            ('pt', 'CSS_PT'),
+#            ('pc', 'CSS_PC'),
+#            ('deg', 'CSS_DEG'),
+#            ('rad', 'CSS_RAD'),
+#            ('grad', 'CSS_GRAD'),
+#            ('ms', 'CSS_MS'),
+#            ('s', 'CSS_S'),
+#            ('hz', 'CSS_HZ'),
+#            ('khz', 'CSS_KHZ'),
+#            ('other_dimension', 'CSS_DIMENSION')
+#            ]
+#        for dim, name in defs:
+#            for n in (0, 1, 1.1, -1, -1.1, -0):
+#                v = cssutils.css.CSSPrimitiveValue('%i%s' % (n, dim))
+#                self.assertEqual(name, v.primitiveTypeString)
+#                self.assertEqual(getattr(v, name), v.primitiveType)
+#
+#    def test_CSS_STRING_AND_OTHER(self):
+#        "CSSPrimitiveValue.CSS_STRING .. CSS_RGBCOLOR"
+#        defs = [
+#                (('""', "''", '"some thing"', "' A\\ND '",
+#                  # comma separated lists are STRINGS FOR NOW!
+#                  'a, b',
+#                  '"a", "b"',
+#                  ), 'CSS_STRING'),
+#                (('url(a)', 'url("a b")', "url(' ')"), 'CSS_URI'),
+#                (('some', 'or_anth-er'), 'CSS_IDENT'),
+#                (('attr(a)', 'attr(b)'), 'CSS_ATTR'),
+#                (('counter(1)', 'counter(2)'), 'CSS_COUNTER'),
+#                (('rect(1,2,3,4)',), 'CSS_RECT'),
+#                (('rgb(1,2,3)', 'rgb(10%, 20%, 30%)', '#123', '#123456'),
+#                 'CSS_RGBCOLOR'),
+#                (('rgba(1,2,3,4)','rgba(10%, 20%, 30%, 40%)', ),
+#                 'CSS_RGBACOLOR'),
+#                (('U+0', 'u+ffffff', 'u+000000-f',
+#                  'u+0-f, U+ee-ff'), 'CSS_UNICODE_RANGE')
+#                ]
+#
+#        for examples, name in defs:
+#            for x in examples:
+#                v = cssutils.css.CSSPrimitiveValue(x)
+#                self.assertEqual(getattr(v, name), v.primitiveType)
+#                self.assertEqual(name, v.primitiveTypeString)
+#
+#    def test_getFloat(self):
+#        "CSSPrimitiveValue.getFloatValue()"
+#        # NOT TESTED are float values as it seems difficult to
+#        # compare these. Maybe use decimal.Decimal?
+#
+#        v = cssutils.css.CSSPrimitiveValue(u'1px')
+#        tests = {
+#            '0': (v.CSS_NUMBER, 0),
+#            '-1.1': (v.CSS_NUMBER, -1.1),
+#            '1%': (v.CSS_PERCENTAGE, 1),
+#            '-1%': (v.CSS_PERCENTAGE, -1),
+#            '1em': (v.CSS_EMS, 1),
+#            '-1.1em': (v.CSS_EMS, -1.1),
+#            '1ex': (v.CSS_EXS, 1),
+#            '1px': (v.CSS_PX, 1),
+#
+#            '1cm': (v.CSS_CM, 1),
+#            '1cm': (v.CSS_MM, 10),
+#            '254cm': (v.CSS_IN, 100),
+#            '1mm': (v.CSS_MM, 1),
+#            '10mm': (v.CSS_CM, 1),
+#            '254mm': (v.CSS_IN, 10),
+#            '1in': (v.CSS_IN, 1),
+#            '100in': (v.CSS_CM, 254), # ROUNDED!!!
+#            '10in': (v.CSS_MM, 254), # ROUNDED!!!
+#
+#            '1pt': (v.CSS_PT, 1),
+#            '1pc': (v.CSS_PC, 1),
+#
+#            '1deg': (v.CSS_DEG, 1),
+#            '1rad': (v.CSS_RAD, 1),
+#            '1grad': (v.CSS_GRAD, 1),
+#
+#            '1ms': (v.CSS_MS, 1),
+#            '1000ms': (v.CSS_S, 1),
+#            '1s': (v.CSS_S, 1),
+#            '1s': (v.CSS_MS, 1000),
+#
+#            '1hz': (v.CSS_HZ, 1),
+#            '1000hz': (v.CSS_KHZ, 1),
+#            '1khz': (v.CSS_KHZ, 1),
+#            '1khz': (v.CSS_HZ, 1000),
+#
+#            '1DIMENSION': (v.CSS_DIMENSION, 1),
+#            }
+#        for cssText in tests:
+#            v.cssText = cssText
+#            unitType, exp = tests[cssText]
+#            val = v.getFloatValue(unitType)
+#            if unitType in (v.CSS_IN, v.CSS_CM):
+#                val = round(val)
+#            self.assertEqual(val , exp)
+#
+#    def test_setFloat(self):
+#        "CSSPrimitiveValue.setFloatValue()"
+#        V = cssutils.css.CSSPrimitiveValue
+#
+#        tests = {
+#            # unitType, value
+#            (V.CSS_NUMBER, 1): [
+#                # unitType, setvalue,
+#                #    getvalue or expected exception, msg or cssText
+#                (V.CSS_NUMBER, 0, 0, '0'),
+#                (V.CSS_NUMBER, 0.1, 0.1, '0.1'),
+#                (V.CSS_NUMBER, -0, 0, '0'),
+#                (V.CSS_NUMBER, 2, 2, '2'),
+#                (V.CSS_NUMBER, 2.0, 2, '2'),
+#                (V.CSS_NUMBER, 2.1, 2.1, '2.1'),
+#                (V.CSS_NUMBER, -2.1, -2.1, '-2.1'),
+#                # setting with string does work
+#                (V.CSS_NUMBER, '1', 1, '1'),
+#                (V.CSS_NUMBER, '1.1', 1.1, '1.1'),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_RAD, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_GRAD, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_S, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_MS, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_KHZ, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_HZ, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DIMENSION, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_MM, 2, xml.dom.InvalidAccessErr, None),
+#
+#                (V.CSS_NUMBER, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: floatValue 'x' is not a float"),
+#                (V.CSS_NUMBER, '1x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: floatValue '1x' is not a float"),
+#
+#                (V.CSS_STRING, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_STRING' is not a float type"),
+#                (V.CSS_URI, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_URI' is not a float type"),
+#                (V.CSS_ATTR, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_ATTR' is not a float type"),
+#                (V.CSS_IDENT, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_IDENT' is not a float type"),
+#                (V.CSS_RGBCOLOR, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_RGBCOLOR' is not a float type"),
+#                (V.CSS_RGBACOLOR, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_RGBACOLOR' is not a float type"),
+#                (V.CSS_RECT, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_RECT' is not a float type"),
+#                (V.CSS_COUNTER, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_COUNTER' is not a float type"),
+#                (V.CSS_EMS, 1, xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_NUMBER' to 'CSS_EMS'"),
+#                (V.CSS_EXS, 1, xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_NUMBER' to 'CSS_EXS'")
+#            ],
+#            (V.CSS_MM, '1mm'): [
+#                (V.CSS_MM, 2, 2, '2mm'),
+#                (V.CSS_MM, 0, 0, '0mm'),
+#                (V.CSS_MM, 0.1, 0.1, '0.1mm'),
+#                (V.CSS_MM, -0, -0, '0mm'),
+#                (V.CSS_MM, 3.0, 3, '3mm'),
+#                (V.CSS_MM, 3.1, 3.1, '3.1mm'),
+#                (V.CSS_MM, -3.1, -3.1, '-3.1mm'),
+#                (V.CSS_CM, 1, 10, '10mm'),
+#                (V.CSS_IN, 10, 254, '254mm'),
+#                (V.CSS_PT, 1, 1828.8, '1828.8mm'),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_NUMBER, 2, xml.dom.InvalidAccessErr, None)
+#            ],
+#            (V.CSS_PT, '1pt'): [
+#                (V.CSS_PT, 2, 2, '2pt'),
+#                (V.CSS_PC, 12, 1, '1pt'),
+#                (V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None)
+#            ],
+#            (V.CSS_KHZ, '1khz'): [
+#                (V.CSS_HZ, 2000, 2, '2khz'),
+#                (V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None)
+#            ]
+#        }
+#        for test in tests:
+#            initialType, initialValue = test
+#            pv = cssutils.css.CSSPrimitiveValue(initialValue)
+#            for setType, setValue, exp, cssText in tests[test]:
+#                if type(exp) == types.TypeType or\
+#                   type(exp) == types.ClassType: # 2.4 compatibility
+#                    if cssText:
+#                        self.assertRaisesMsg(
+#                            exp, cssText, pv.setFloatValue, setType, setValue)
+#                    else:
+#                        self.assertRaises(
+#                            exp, pv.setFloatValue, setType, setValue)
+#                else:
+#                    pv.setFloatValue(setType, setValue)
+#                    self.assertEqual(pv._value[0], cssText)
+#                    if cssText == '0mm':
+#                        cssText = '0'
+#                    self.assertEqual(pv.cssText, cssText)
+#                    self.assertEqual(pv.getFloatValue(initialType), exp)
+#
+#    def test_getString(self):
+#        "CSSPrimitiveValue.getStringValue()"
+#        v = cssutils.css.CSSPrimitiveValue(u'1px')
+#        self.assertTrue(v.primitiveType == v.CSS_PX)
+#        self.assertRaises(xml.dom.InvalidAccessErr,
+#                          v.getStringValue)
+#
+#        pv = cssutils.css.CSSPrimitiveValue
+#        tests = {
+#            pv.CSS_STRING: ("'red'", 'red'),
+#            pv.CSS_STRING: ('"red"', 'red'),
+#            pv.CSS_URI: ('url(http://example.com)', None),
+#            pv.CSS_URI: ("url('http://example.com')",
+#                         u"http://example.com"),
+#            pv.CSS_URI: ('url("http://example.com")',
+#                         u'http://example.com'),
+#            pv.CSS_URI: ('url("http://example.com?)")',
+#                         u'http://example.com?)'),
+#            pv.CSS_IDENT: ('red', None),
+#            pv.CSS_ATTR: ('attr(att-name)',
+#                         u'att-name'), # the name of the attrr
+#            }
+#        for t in tests:
+#            val, exp = tests[t]
+#            if not exp:
+#                exp = val
+#
+#            v = cssutils.css.CSSPrimitiveValue(val)
+#            self.assertEqual(v.primitiveType, t)
+#            self.assertEqual(v.getStringValue(), exp)
+#
+#    def test_setString(self):
+#        "CSSPrimitiveValue.setStringValue()"
+#        # CSS_STRING
+#        v = cssutils.css.CSSPrimitiveValue(u'"a"')
+#        self.assertTrue(v.CSS_STRING == v.primitiveType)
+#        v.setStringValue(v.CSS_STRING, 'b')
+#        self.assertTrue(('b', 'STRING') == v._value)
+#        self.assertEqual('b', v.getStringValue())
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_URI'",
+#            v.setStringValue, *(v.CSS_URI, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_IDENT'",
+#            v.setStringValue, *(v.CSS_IDENT, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_ATTR'",
+#            v.setStringValue, *(v.CSS_ATTR, 'x'))
+#
+#        # CSS_IDENT
+#        v = cssutils.css.CSSPrimitiveValue('new')
+#        v.setStringValue(v.CSS_IDENT, 'ident')
+#        self.assertTrue(v.CSS_IDENT == v.primitiveType)
+#        self.assertTrue(('ident', 'IDENT') == v._value)
+#        self.assertTrue('ident' == v.getStringValue())
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_URI'",
+#            v.setStringValue, *(v.CSS_URI, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_STRING'",
+#            v.setStringValue, *(v.CSS_STRING, '"x"'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_ATTR'",
+#            v.setStringValue, *(v.CSS_ATTR, 'x'))
+#
+#        # CSS_URI
+#        v = cssutils.css.CSSPrimitiveValue('url(old)')
+#        v.setStringValue(v.CSS_URI, '(')
+#        self.assertEqual((u'(', 'URI'), v._value)
+#        self.assertEqual(u'(', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, ')')
+#        self.assertEqual((u')', 'URI'), v._value)
+#        self.assertEqual(u')', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, '"')
+#        self.assertEqual(ur'"', v.getStringValue())
+#        self.assertEqual((ur'"', 'URI'), v._value)
+#
+#        v.setStringValue(v.CSS_URI, "''")
+#        self.assertEqual(ur"''", v.getStringValue())
+#        self.assertEqual((ur"''", 'URI'), v._value)
+#
+#        v.setStringValue(v.CSS_URI, ',')
+#        self.assertEqual(ur',', v.getStringValue())
+#        self.assertEqual((ur',', 'URI'), v._value)
+#
+#        v.setStringValue(v.CSS_URI, ' ')
+#        self.assertEqual((u' ', 'URI'), v._value)
+#        self.assertEqual(u' ', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, 'a)')
+#        self.assertEqual((u'a)', 'URI'), v._value)
+#        self.assertEqual(u'a)', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, 'a')
+#        self.assertTrue(v.CSS_URI == v.primitiveType)
+#        self.assertEqual((u'a', 'URI'), v._value)
+#        self.assertEqual(u'a', v.getStringValue())
+#
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_IDENT'",
+#            v.setStringValue, *(v.CSS_IDENT, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_STRING'",
+#            v.setStringValue, *(v.CSS_STRING, '"x"'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_ATTR'",
+#            v.setStringValue, *(v.CSS_ATTR, 'x'))
+#
+#        # CSS_ATTR
+#        v = cssutils.css.CSSPrimitiveValue('attr(old)')
+#        v.setStringValue(v.CSS_ATTR, 'a')
+#        self.assertTrue(v.CSS_ATTR == v.primitiveType)
+#        self.assertTrue('a' == v.getStringValue())
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_IDENT'",
+#            v.setStringValue, *(v.CSS_IDENT, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_STRING'",
+#            v.setStringValue, *(v.CSS_STRING, '"x"'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_URI'",
+#            v.setStringValue, *(v.CSS_URI, 'x'))
+#
+#        # TypeError as 'x' is no valid type
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: stringType 'x' (UNKNOWN TYPE) is not a string type",
+#            v.setStringValue, *('x', 'brown'))
+#        # IndexError as 111 is no valid type
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: stringType 111 (UNKNOWN TYPE) is not a string type",
+#            v.setStringValue, *(111, 'brown'))
+#        # CSS_PX is no string type
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: stringType CSS_PX is not a string type",
+#            v.setStringValue, *(v.CSS_PX, 'brown'))
+#
+#    def test_typeRGBColor(self):
+#        "RGBColor"
+#        v = cssutils.css.CSSPrimitiveValue('RGB(1, 5, 10)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        self.assertEqual(u'rgb(1, 5, 10)', v.cssText)
+#
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1, 5, 10)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        self.assertEqual(u'rgb(1, 5, 10)', v.cssText)
+#
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1%, 5%, 10%)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        self.assertEqual(u'rgb(1%, 5%, 10%)', v.cssText)
+#
+#        v = cssutils.css.CSSPrimitiveValue('  rgb(  1 ,5,  10  )')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1,5,10)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1%, .5%, 10.1%)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_codec.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_codec.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_codec.py	(revision 1126)
@@ -0,0 +1,342 @@
+"""Testcases for cssutils.codec"""
+
+import codecs
+import unittest
+import sys
+
+PY2x = sys.version_info < (3,0)
+if PY2x:
+    import StringIO
+    iostream = StringIO.StringIO
+else:
+    import io
+    iostream = io.BytesIO 
+
+from cssutils import codec
+
+try:
+    codecs.lookup("utf-32")
+except LookupError:
+    haveutf32 = False
+else:
+    haveutf32 = True
+
+
+class Queue(object):
+    """
+    queue: write bytes at one end, read bytes from the other end
+    """
+    def __init__(self):
+        self._buffer = "".encode()
+
+    def write(self, chars):
+        # TODO ???
+        if not PY2x:
+            if isinstance(chars, str):
+                chars = chars.encode()
+            elif isinstance(chars, int):
+                chars = bytes([chars])
+            
+        self._buffer += chars
+
+    def read(self, size=-1):
+        if size<0:
+            s = self._buffer
+            self._buffer = "".encode()
+            return s
+        else:
+            s = self._buffer[:size]
+            self._buffer = self._buffer[size:]
+            return s
+
+
+class CodecTestCase(unittest.TestCase):
+
+    def test_detectencoding_str(self):
+        "codec.detectencoding_str()"
+        self.assertEqual(codec.detectencoding_str(u''.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\xef'.encode('latin1')), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\xef\x33'.encode("utf-8")), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'\xc3\xaf3'.encode("utf-8")), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'\xef\xbb'.encode("latin1")), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\xef\xbb\x33'.encode("utf-8")), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'\xef\xbb\xbf'.encode("utf-8-sig")), ("utf-8-sig", True))
+        self.assertEqual(codec.detectencoding_str(u'\xff'.encode("latin1")), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\xff\x33'.encode("utf-8")), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'\xff\xfe'.encode("latin1")), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\xff\xfe\x33'.encode("utf-16")), ("utf-16", True))
+        self.assertEqual(codec.detectencoding_str(u'\xff\xfe\x00'.encode("latin1")), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\xff\xfe\x00\x33'.encode("utf-16")), ("utf-16", True))
+        if haveutf32:
+            self.assertEqual(codec.detectencoding_str(u'\xff\xfe\x00\x00'.encode("utf-32")), ("utf-32", True))
+        self.assertEqual(codec.detectencoding_str(u'\x00'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\x00\x33'.encode()), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'\x00\x00'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\x00\x00\x33'.encode()), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'\x00\x00\xfe'.encode('latin1')), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'\x00\x00\x00\x33'.encode()), ("utf-8", False))
+        if haveutf32:
+            self.assertEqual(codec.detectencoding_str(u'\x00\x00\x00@'.encode()), ("utf-32-be", False))
+            self.assertEqual(codec.detectencoding_str(u'\x00\x00\xfe\xff'.encode('utf-32')), ("utf-32", True))
+        self.assertEqual(codec.detectencoding_str(u'@'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@\x33'.encode()), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'@\x00'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@\x00\x33'.encode()), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u'@\x00\x00'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@\x00\x00\x33'.encode()), ("utf-8", False))
+        if haveutf32:
+            self.assertEqual(codec.detectencoding_str(u'@\x00\x00\x00'.encode()), ("utf-32-le", False))
+        self.assertEqual(codec.detectencoding_str(u'@c'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@ch'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@cha'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@char'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@chars'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@charse'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@charset'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@charset '.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@charset "'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@charset "x'.encode()), (None, False))
+        self.assertEqual(codec.detectencoding_str(u'@charset ""'.encode()), ("", True))
+        self.assertEqual(codec.detectencoding_str(u'@charset "x"'.encode()), ("x", True))
+        self.assertEqual(codec.detectencoding_str(u"@".encode(), False), (None, False))
+        self.assertEqual(codec.detectencoding_str(u"@".encode(), True), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_str(u"@c".encode(), False), (None, False))
+        self.assertEqual(codec.detectencoding_str(u"@c".encode(), True), ("utf-8", False))
+
+    def test_detectencoding_unicode(self):
+        "codec.detectencoding_unicode()"
+        # Unicode version (only parses the header)
+        self.assertEqual(codec.detectencoding_unicode(u'@charset "x'), (None, False))
+        self.assertEqual(codec.detectencoding_unicode(u'a {}'), ("utf-8", False))
+        self.assertEqual(codec.detectencoding_unicode(u'@charset "x', True), (None, False))
+        self.assertEqual(codec.detectencoding_unicode(u'@charset "x"'), ("x", True))
+
+    def test_fixencoding(self):
+        "codec._fixencoding()"
+        s = u'@charset "'
+        self.assertTrue(codec._fixencoding(s, u"utf-8") is None)
+
+        s = u'@charset "x'
+        self.assertTrue(codec._fixencoding(s, u"utf-8") is None)
+
+        s = u'@charset "x'
+        self.assertEqual(codec._fixencoding(s, u"utf-8", True), s)
+
+        s = u'@charset x'
+        self.assertEqual(codec._fixencoding(s, u"utf-8"), s)
+
+        s = u'@charset "x"'
+        self.assertEqual(codec._fixencoding(s, u"utf-8"), s.replace('"x"', '"utf-8"'))
+
+    def test_decoder(self):
+        "codecs.decoder"
+        def checkauto(encoding, input=u'@charset "x";g\xfcrk\u20ac{}'):
+            outputencoding = encoding
+            if outputencoding == "utf-8-sig":
+                outputencoding = "utf-8"
+            # Check stateless decoder with encoding autodetection
+            d = codecs.getdecoder("css")
+            self.assertEqual(d(input.encode(encoding))[0], input.replace('"x"', '"%s"' % outputencoding))
+
+            # Check stateless decoder with specified encoding
+            self.assertEqual(d(input.encode(encoding), encoding=encoding)[0], input.replace('"x"', '"%s"' % outputencoding))
+
+            if hasattr(codec, "getincrementaldecoder"):
+                # Check incremental decoder with encoding autodetection
+                id = codecs.getincrementaldecoder("css")()
+                self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input.replace('"x"', '"%s"' % outputencoding))
+
+                # Check incremental decoder with specified encoding
+                id = codecs.getincrementaldecoder("css")(encoding=encoding)
+                self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input.replace('"x"', '"%s"' % outputencoding))
+
+            # Check stream reader with encoding autodetection
+            q = Queue()
+            sr = codecs.getreader("css")(q)
+            result = []
+            # TODO: py3 only???
+            for c in input.encode(encoding):
+                q.write(c)
+                result.append(sr.read())
+            self.assertEqual("".join(result), input.replace('"x"', '"%s"' % outputencoding))
+
+            # Check stream reader with specified encoding
+            q = Queue()
+            sr = codecs.getreader("css")(q, encoding=encoding)
+            result = []
+            for c in input.encode(encoding):
+                q.write(c)
+                result.append(sr.read())
+            self.assertEqual("".join(result), input.replace('"x"', '"%s"' % outputencoding))
+
+        # Autodetectable encodings
+        checkauto("utf-8-sig")
+        checkauto("utf-16")
+        checkauto("utf-16-le")
+        checkauto("utf-16-be")
+        if haveutf32:
+            checkauto("utf-32")
+            checkauto("utf-32-le")
+            checkauto("utf-32-be")
+
+        def checkdecl(encoding, input=u'@charset "%s";g\xfcrk{}'):
+            # Check stateless decoder with encoding autodetection
+            d = codecs.getdecoder("css")
+            input = input % encoding
+            outputencoding = encoding
+            if outputencoding == "utf-8-sig":
+                outputencoding = "utf-8"
+            self.assertEqual(d(input.encode(encoding))[0], input)
+
+            # Check stateless decoder with specified encoding
+            self.assertEqual(d(input.encode(encoding), encoding=encoding)[0], input)
+
+            if hasattr(codec, "getincrementaldecoder"):
+                # Check incremental decoder with encoding autodetection
+                id = codecs.getincrementaldecoder("css")()
+                self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input)
+
+                # Check incremental decoder with specified encoding
+                id = codecs.getincrementaldecoder("css")(encoding)
+                self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input)
+
+            # Check stream reader with encoding autodetection
+            q = Queue()
+            sr = codecs.getreader("css")(q)
+            result = []
+            for c in input.encode(encoding):
+                q.write(c)
+                result.append(sr.read())
+            self.assertEqual("".join(result), input)
+
+            # Check stream reader with specified encoding
+            q = Queue()
+            sr = codecs.getreader("css")(q, encoding=encoding)
+            result = []
+            for c in input.encode(encoding):
+                q.write(c)
+                result.append(sr.read())
+            self.assertEqual("".join(result), input)
+
+        # Use correct declaration
+        checkdecl("utf-8")
+        checkdecl("iso-8859-1", u'@charset "%s";g\xfcrk')
+        checkdecl("iso-8859-15")
+        checkdecl("cp1252")
+
+        # No recursion
+        self.assertRaises(ValueError, u'@charset "css";div{}'.encode().decode, "css")
+
+    def test_encoder(self):
+        "codec.encoder"
+        def check(encoding, input=u'@charset "x";g\xfcrk\u20ac{}'):
+            outputencoding = encoding
+            if outputencoding == "utf-8-sig":
+                outputencoding = "utf-8"
+
+            # Check stateless encoder with encoding autodetection
+            e = codecs.getencoder("css")
+            inputdecl = input.replace('"x"', '"%s"' % encoding)
+            outputdecl = input.replace('"x"', '"%s"' % outputencoding)
+            self.assertEqual(e(inputdecl)[0].decode(encoding), outputdecl)
+
+            # Check stateless encoder with specified encoding
+            self.assertEqual(e(input, encoding=encoding)[0].decode(encoding), outputdecl)
+
+            if hasattr(codec, "getincrementalencoder"):
+                # Check incremental encoder with encoding autodetection
+                ie = codecs.getincrementalencoder("css")()
+                self.assertEqual("".join(ie.iterencode(inputdecl)).decode(encoding), outputdecl)
+
+                # Check incremental encoder with specified encoding
+                ie = codecs.getincrementalencoder("css")(encoding=encoding)
+                self.assertEqual("".join(ie.iterencode(input)).decode(encoding), outputdecl)
+
+            # Check stream writer with encoding autodetection
+            q = Queue()
+            sw = codecs.getwriter("css")(q)
+            for c in inputdecl:#.encode(outputencoding): # TODO: .encode()???
+                sw.write(c)
+            self.assertEqual(q.read().decode(encoding), input.replace('"x"', '"%s"' % outputencoding))
+
+            # Check stream writer with specified encoding
+            q = Queue()
+            sw = codecs.getwriter("css")(q, encoding=encoding)
+            for c in input:
+                sw.write(c)
+            self.assertEqual(q.read().decode(encoding), input.replace('"x"', '"%s"' % outputencoding))
+
+        # Autodetectable encodings
+        check("utf-8-sig")
+        check("utf-16")
+        check("utf-16-le")
+        check("utf-16-be")
+        if haveutf32:
+            check("utf-32")
+            check("utf-32-le")
+            check("utf-32-be")
+        check("utf-8")
+        check("iso-8859-1", u'@charset "x";g\xfcrk{}')
+        check("iso-8859-15")
+        check("cp1252")
+
+        # No recursion
+        self.assertRaises(ValueError, u'@charset "css";div{}'.encode, "css")
+
+    def test_decode_force(self):
+        "codec.decode (force)"
+        info = codecs.lookup("css")
+
+        def decodeall(input, **kwargs):
+            # Py 2.5: info.decode('@charset "utf-8"; x')
+            return info[1](input, **kwargs)[0]
+
+        def incdecode(input, **kwargs):
+            decoder = info.incrementaldecoder(**kwargs)
+            return decoder.decode(input)
+
+        def streamdecode(input, **kwargs):
+            stream = iostream(input) # py3 .decode('utf-8') but still error?!
+            reader = info.streamreader(stream, **kwargs)
+            return reader.read()
+
+        for d in (decodeall, incdecode, streamdecode):
+#            input = '@charset "utf-8"; \xc3\xbf'
+#            output = u'@charset "utf-8"; \xff'
+#            self.assertEqual(d(input), output)
+#
+#            input = '@charset "utf-8"; \xc3\xbf'
+#            output = u'@charset "iso-8859-1"; \xc3\xbf'
+#            self.assertEqual(d(input, encoding="iso-8859-1", force=True), output)
+#
+#            input = '\xc3\xbf'
+#            output = u'\xc3\xbf'
+#            self.assertEqual(d(input, encoding="iso-8859-1", force=True), output)
+#
+#            input = '@charset "utf-8"; \xc3\xbf'
+#            output = u'@charset "utf-8"; \xff'
+#            self.assertEqual(d(input, encoding="iso-8859-1", force=False), output)
+
+            input = u'@charset "utf-8"; \xff'.encode('utf-8')
+            output = u'@charset "utf-8"; \xff'
+            self.assertEqual(d(input), output)
+
+            #input = b'@charset "utf-8"; \xc3\xbf'
+            input = u'@charset "utf-8"; \xff'.encode('utf-8')
+            output = u'@charset "iso-8859-1"; \xc3\xbf'
+            self.assertEqual(d(input, encoding="iso-8859-1", force=True), output)
+
+            #input = b'\xc3\xbf'
+            input = u'\xff'.encode('utf-8')
+            output = u'\xc3\xbf'
+            self.assertEqual(d(input, encoding="iso-8859-1", force=True), output)
+
+            #input = b'@charset "utf-8"; \xc3\xbf'
+            input = u'@charset "utf-8"; \xff'.encode('utf-8')
+            output = u'@charset "utf-8"; \xff'
+            self.assertEqual(d(input, encoding="iso-8859-1", force=False), output)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_helper.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_helper.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_helper.py	(revision 1126)
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+"""Testcases for cssutils.helper"""
+__version__ = '$Id: test_util.py 1437 2008-08-18 20:30:38Z cthedot $'
+
+import basetest
+from cssutils.helper import * 
+
+class HelperTestCase(basetest.BaseTestCase):
+
+    def test_normalize(self):
+        "helper._normalize()"
+        tests = {u'abcdefg ABCDEFG äöüß€ AÖÜ': ur'abcdefg abcdefg äöüß€ aöü',
+                 ur'\ga\Ga\\\ ': ur'gaga\ ',
+                 ur'0123456789': ur'0123456789',
+                 ur'"\x"': ur'"x"',
+                 # unicode escape seqs should have been done by
+                 # the tokenizer...
+                 }
+        for test, exp in tests.items():
+            self.assertEqual(normalize(test), exp)
+            # static too
+            self.assertEqual(normalize(test), exp)
+
+#    def test_normalnumber(self):
+#        "helper.normalnumber()"
+#        tests = {
+#                 '0': '0',
+#                 '00': '0',
+#                 '0.0': '0',
+#                 '00.0': '0',
+#                 '1': '1',
+#                 '01': '1',
+#                 '00.1': '0.1',
+#                 '0.00001': '0.00001',
+#                 '-0': '0',
+#                 '-00': '0',
+#                 '-0.0': '0',
+#                 '-00.0': '0',
+#                 '-1': '-1',
+#                 '-01': '-1',
+#                 '-00.1': '-0.1',
+#                 '-0.00001': '-0.00001',
+#                 }
+#        for test, exp in tests.items():
+#            self.assertEqual(exp, normalnumber(test))
+
+    def test_string(self):
+        "helper.string()"
+        self.assertEqual(u'"x"', string(u'x'))
+        self.assertEqual(u'"1 2ä€"', string(u'1 2ä€'))
+        self.assertEqual(ur'''"'"''', string(u"'"))
+        self.assertEqual(ur'"\""', string(u'"'))
+        # \n = 0xa, \r = 0xd, \f = 0xc
+        self.assertEqual(ur'"\a "', string('''
+'''))
+        self.assertEqual(ur'"\c "', string('\f'))
+        self.assertEqual(ur'"\d "', string('\r'))
+        self.assertEqual(ur'"\d \a "', string('\r\n'))
+
+    def test_stringvalue(self):
+        "helper.stringvalue()"
+        self.assertEqual(u'x', stringvalue(u'"x"'))
+        self.assertEqual(u'"', stringvalue(u'"\\""'))
+        self.assertEqual(ur'x', stringvalue(ur"\x "))
+        
+        # escapes should have been done by tokenizer
+        # so this shoule not happen at all:
+        self.assertEqual(ur'a', stringvalue(ur"\a "))
+
+    def test_uri(self):
+        "helper.uri()"
+        self.assertEqual(u'url(x)', uri('x'))
+        self.assertEqual(u'url("(")', uri('('))
+        self.assertEqual(u'url(")")', uri(')'))
+        self.assertEqual(u'url(" ")', uri(' '))
+        self.assertEqual(u'url(";")', uri(';'))
+        self.assertEqual(u'url(",")', uri(','))
+        self.assertEqual(u'url("x)x")', uri('x)x'))
+
+    def test_urivalue(self):
+        "helper.urivalue()"
+        self.assertEqual(u'x', urivalue('url(x)'))
+        self.assertEqual(u'x', urivalue('url("x")'))
+        self.assertEqual(u')', urivalue('url(")")'))
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstyledeclaration.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstyledeclaration.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstyledeclaration.py	(revision 1126)
@@ -0,0 +1,594 @@
+"""Testcases for cssutils.css.cssstyledelaration.CSSStyleDeclaration."""
+
+import xml.dom
+import basetest
+import cssutils
+
+class CSSStyleDeclarationTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        self.r = cssutils.css.CSSStyleDeclaration()
+
+    def test_init(self):
+        "CSSStyleDeclaration.__init__()"
+        s = cssutils.css.CSSStyleDeclaration()
+        self.assertEqual(u'', s.cssText)
+        self.assertEqual(0, s.length)
+        self.assertEqual(None, s.parentRule)
+
+        s = cssutils.css.CSSStyleDeclaration(cssText='left: 0')
+        self.assertEqual(u'left: 0', s.cssText)
+        self.assertEqual('0', s.getPropertyValue('left'))
+
+        sheet = cssutils.css.CSSStyleRule()
+        s = cssutils.css.CSSStyleDeclaration(parentRule=sheet)
+        self.assertEqual(sheet, s.parentRule)
+
+        # should not be used but ordered parameter test
+        s = cssutils.css.CSSStyleDeclaration('top: 0', sheet)
+        self.assertEqual(u'top: 0', s.cssText)
+        self.assertEqual(sheet, s.parentRule)
+
+    def test_items(self):
+        "CSSStyleDeclaration[CSSName]"
+        s = cssutils.css.CSSStyleDeclaration()
+        name, value, priority = 'color', 'name', ''
+        s[name] = value
+        self.assertEqual(value, s[name])
+        self.assertEqual(value, s.__getattribute__(name))
+        self.assertEqual(value, s.getProperty(name).value)
+        self.assertEqual(priority, s.getProperty(name).priority)
+
+        name, value, priority = 'UnKnown-ProPERTY', 'unknown value', 'important'
+        s[name] = (value, priority)
+        self.assertEqual(value, s[name])
+        self.assertEqual(value, s[name.lower()]) # will be normalized
+        self.assertRaises(AttributeError, s.__getattribute__, name)
+        self.assertEqual(value, s.getProperty(name).value)
+        self.assertEqual(priority, s.getProperty(name).priority)
+
+        name, value, priority = 'item', '1', ''
+        s[name] = value
+        self.assertEqual(value, s[name])
+        self.assertEqual(value, s.getProperty(name).value)
+        self.assertEqual(priority, s.getProperty(name).priority)
+
+        del s[name]
+        self.assertEqual(u'', s[name])
+        self.assertEqual(u'', s['never set'])
+
+    def test__contains__(self):
+        "CSSStyleDeclaration.__contains__(nameOrProperty)"
+        s = cssutils.css.CSSStyleDeclaration(cssText=r'x: 1;\y: 2')
+        for test in ('x', r'x', 'y', r'y'):
+            self.assertTrue(test in s)
+            self.assertTrue(test.upper() in s)
+            self.assertTrue(cssutils.css.Property(test, '1') in s)
+        self.assertTrue('z' not in s)
+        self.assertTrue(cssutils.css.Property('z', '1') not in s)
+
+    def test__iter__item(self):
+        "CSSStyleDeclaration.__iter__ and .item"
+        s = cssutils.css.CSSStyleDeclaration()
+        s.cssText = ur'''
+            color: red; c\olor: blue; CO\lor: green;
+            left: 1px !important; left: 0;
+            border: 0;
+        '''
+        # __iter__
+        ps = []
+        for p in s:
+            ps.append((p.literalname, p.value, p.priority))
+        self.assertEqual(len(ps), 3)
+        self.assertEqual(ps[0], (ur'co\lor', 'green', ''))
+        self.assertEqual(ps[1], (ur'left', '1px', 'important'))
+        self.assertEqual(ps[2], (ur'border', '0', ''))
+
+        # item
+        self.assertEqual(s.length, 3)
+        self.assertEqual(s.item(0), u'color')
+        self.assertEqual(s.item(1), u'left')
+        self.assertEqual(s.item(2), u'border')
+        self.assertEqual(s.item(10), u'')
+
+    def test_keys(self):
+        "CSSStyleDeclaration.keys()"
+        s = cssutils.parseStyle('x:1; x:2; y:1')
+        self.assertEqual(['x', 'y'], s.keys())
+        self.assertEqual(s['x'], '2')
+        self.assertEqual(s['y'], '1')
+
+    def test_parse(self):
+        "CSSStyleDeclaration parse"
+        # error but parse
+        tests = {
+            # property names are caseinsensitive
+            u'TOP:0': u'top: 0',
+            u'top:0': u'top: 0',
+            # simple escape
+            u'c\\olor: red; color:green': u'color: green',
+            u'color:g\\reen': u'color: g\\reen',
+            # http://www.w3.org/TR/2009/CR-CSS2-20090423/syndata.html#illegalvalues
+            u'color:green': u'color: green',
+            u'color:green; color': u'color: green',
+            u'color:red;   color; color:green': u'color: green',
+            u'color:green; color:': u'color: green',
+            u'color:red;   color:; color:green': u'color: green',
+            u'color:green; color{;color:maroon}': u'color: green',
+            u'color:red; color{;color:maroon}; color:green': u'color: green',
+            # tantek hack
+            ur'''color: red;
+voice-family: "\"}\"";
+voice-family:inherit;
+color: green;''': 'voice-family: inherit;\ncolor: green',
+            ur'''col\or: blue;
+                font-family: 'Courier New Times
+                color: red;
+                color: green;''': u'color: green',
+
+            # special IE hacks are not preserved anymore (>=0.9.5b3)
+            u'/color: red; color: green': u'color: green',
+            u'/ color: red; color: green': u'color: green',
+            u'1px: red; color: green': u'color: green',
+            u'0: red; color: green': u'color: green',
+            u'1px:: red; color: green': u'color: green',
+            ur'$top: 0': u'',
+            ur'$: 0': u'', # really invalid!
+            # unknown rule but valid
+            u'@x;\ncolor: red': None,
+            u'@x {\n    }\ncolor: red': None,
+            u'/**/\ncolor: red': None,
+            u'/**/\ncolor: red;\n/**/': None,
+            #issue #28
+            u';color: red': u'color: red',
+            u';;color: red;;': u'color: red'
+            }
+        cssutils.ser.prefs.keepAllProperties = False
+        for test, exp in tests.items():
+            sh = cssutils.parseString('a { %s }' % test)
+            if exp is None:
+                exp = u'%s' % test
+            elif exp != u'':
+                exp = u'%s' % exp
+            self.assertEqual(exp, sh.cssRules[0].style.cssText)
+
+        cssutils.ser.prefs.useDefaults()
+
+    def test_serialize(self):
+        "CSSStyleDeclaration serialize"
+        s = cssutils.css.CSSStyleDeclaration()
+        tests = {
+            u'a:1 !important; a:2;b:1': (u'a: 1 !important;\nb: 1',
+                                         u'a: 1 !important;\na: 2;\nb: 1')
+        }
+        for test, exp in tests.items():
+            s.cssText = test
+            cssutils.ser.prefs.keepAllProperties = False
+            self.assertEqual(exp[0], s.cssText)
+            cssutils.ser.prefs.keepAllProperties = True
+            self.assertEqual(exp[1], s.cssText)
+
+        cssutils.ser.prefs.useDefaults()
+
+    def test_children(self):
+        "CSSStyleDeclaration.children()"
+        style = u'/*1*/color: red; color: green; @x;'
+        types = [
+            cssutils.css.CSSComment,
+            cssutils.css.Property,
+            cssutils.css.Property,
+            cssutils.css.CSSUnknownRule
+        ]
+        def t(s):
+            for i, x in enumerate(s.children()):
+                self.assertEqual(types[i], type(x))
+                self.assertEqual(x.parent, s)
+
+        t(cssutils.parseStyle(style))
+        t(cssutils.parseString(u'a {'+style+'}').cssRules[0].style)
+        t(cssutils.parseString(u'@media all {a {'+style+'}}').cssRules[0].cssRules[0].style)
+
+        s = cssutils.parseStyle(style)
+        s['x'] = '0'
+        self.assertEqual(s, s.getProperty('x').parent)
+        s.setProperty('y', '1')
+        self.assertEqual(s, s.getProperty('y').parent)
+
+    def test_cssText(self):
+        "CSSStyleDeclaration.cssText"
+        # empty
+        s = cssutils.css.CSSStyleDeclaration()
+        tests = {
+            u'': u'',
+            u' ': u'',
+            u' \t \n  ': u'',
+            u'/*x*/': u'/*x*/'
+            }
+        for test, exp in tests.items():
+            s.cssText = 'left: 0;' # dummy to reset s
+            s.cssText = test
+            self.assertEqual(exp, s.cssText)
+
+        # normal
+        s = cssutils.css.CSSStyleDeclaration()
+        tests = {
+            u';': u'',
+            u'left: 0': u'left: 0',
+            u'left:0': u'left: 0',
+            u' left : 0 ': u'left: 0',
+            u'left: 0;': u'left: 0',
+            u'left: 0 !important ': u'left: 0 !important',
+            u'left:0!important': u'left: 0 !important',
+            u'left: 0; top: 1': u'left: 0;\ntop: 1',
+            # comments
+            # TODO: spaces?
+            u'/*1*//*2*/left/*3*//*4*/:/*5*//*6*/0/*7*//*8*/!/*9*//*a*/important/*b*//*c*/;':
+                u'/*1*/\n/*2*/\nleft/*3*//*4*/: /*5*/ /*6*/ 0 /*7*/ /*8*/ !/*9*//*a*/important/*b*//*c*/',
+            u'/*1*/left: 0;/*2*/ top: 1/*3*/':
+                u'/*1*/\nleft: 0;\n/*2*/\ntop: 1 /*3*/',
+            u'left:0; top:1;': u'left: 0;\ntop: 1',
+            u'/*1*/left: 0;/*2*/ top: 1;/*3*/':
+                u'/*1*/\nleft: 0;\n/*2*/\ntop: 1;\n/*3*/',
+            # WS
+            u'left:0!important;margin:1px 2px 3px 4px!important;': u'left: 0 !important;\nmargin: 1px 2px 3px 4px !important',
+            u'\n\r\f\t left\n\r\f\t :\n\r\f\t 0\n\r\f\t !\n\r\f\t important\n\r\f\t ;\n\r\f\t margin\n\r\f\t :\n\r\f\t 1px\n\r\f\t 2px\n\r\f\t 3px\n\r\f\t 4px;':
+            u'left: 0 !important;\nmargin: 1px 2px 3px 4px',
+            }
+        for test, exp in tests.items():
+            s.cssText = test
+            self.assertEqual(exp, s.cssText)
+
+        # exception
+        tests = {
+            u'color: #xyz': xml.dom.SyntaxErr,
+            u'top': xml.dom.SyntaxErr,
+            u'top:': xml.dom.SyntaxErr,
+            u'top : ': xml.dom.SyntaxErr,
+            u'top:!important': xml.dom.SyntaxErr,
+            u'top:!important;': xml.dom.SyntaxErr,
+            u'top:;': xml.dom.SyntaxErr,
+            u'top 0': xml.dom.SyntaxErr,
+            u'top 0;': xml.dom.SyntaxErr,
+
+            u':': xml.dom.SyntaxErr,
+            u':0': xml.dom.SyntaxErr,
+            u':0;': xml.dom.SyntaxErr,
+            u':0!important': xml.dom.SyntaxErr,
+            u':;': xml.dom.SyntaxErr,
+            u': ;': xml.dom.SyntaxErr,
+            u':!important;': xml.dom.SyntaxErr,
+            u': !important;': xml.dom.SyntaxErr,
+
+            u'0': xml.dom.SyntaxErr,
+            u'0!important': xml.dom.SyntaxErr,
+            u'0!important;': xml.dom.SyntaxErr,
+            u'0;': xml.dom.SyntaxErr,
+
+            u'!important': xml.dom.SyntaxErr,
+            u'!important;': xml.dom.SyntaxErr,
+            }
+        self.do_raise_r(tests)
+
+    def test_getCssText(self):
+        "CSSStyleDeclaration.getCssText(separator)"
+        s = cssutils.css.CSSStyleDeclaration(cssText=u'a:1;b:2')
+        self.assertEqual(u'a: 1;\nb: 2', s.getCssText())
+        self.assertEqual(u'a: 1;b: 2', s.getCssText(separator=u''))
+        self.assertEqual(u'a: 1;/*x*/b: 2', s.getCssText(separator=u'/*x*/'))
+
+    def test_parentRule(self):
+        "CSSStyleDeclaration.parentRule"
+        s = cssutils.css.CSSStyleDeclaration()
+        sheet = cssutils.css.CSSStyleRule()
+        s.parentRule = sheet
+        self.assertEqual(sheet, s.parentRule)
+
+        sheet = cssutils.parseString(u'a{x:1}')
+        s = sheet.cssRules[0]
+        d = s.style
+        self.assertEqual(s, d.parentRule)
+
+        s = cssutils.parseString('''
+        @font-face {
+            font-weight: bold;
+            }
+        a {
+            font-weight: bolder;
+            }
+        @page {
+            font-weight: bolder;
+            }
+        ''')
+        for r in s:
+            self.assertEqual(r.style.parentRule, r)
+
+    def test_getProperty(self):
+        "CSSStyleDeclaration.getProperty"
+        s = cssutils.css.CSSStyleDeclaration()
+        P = cssutils.css.Property
+        s.cssText = ur'''
+            color: red; c\olor: blue; CO\lor: green;
+            left: 1px !important; left: 0;
+            border: 0;
+        '''
+        self.assertEqual(s.getProperty('color').cssText, ur'co\lor: green')
+        self.assertEqual(s.getProperty(r'COLO\r').cssText, ur'co\lor: green')
+        self.assertEqual(s.getProperty('left').cssText, ur'left: 1px !important')
+        self.assertEqual(s.getProperty('border').cssText, ur'border: 0')
+
+    def test_getProperties(self):
+        "CSSStyleDeclaration.getProperties()"
+        s = cssutils.css.CSSStyleDeclaration(cssText=
+                                             u'/*1*/y:0;x:a !important;y:1; \\x:b;')
+        tests = {
+            # name, all
+            (None, False): [(u'y', u'1', u''),
+                            (u'x', u'a', u'important')],
+            (None, True): [(u'y', u'0', u''),
+                           (u'x', u'a', u'important'),
+                           (u'y', u'1', u''),
+                           (u'\\x', u'b', u'')
+                           ],
+            ('x', False): [(u'x', u'a', u'important')],
+            ('\\x', False): [(u'x', u'a', u'important')],
+            ('x', True): [(u'x', u'a', u'important'),
+                           (u'\\x', u'b', u'')],
+            ('\\x', True): [(u'x', u'a', u'important'),
+                           (u'\\x', u'b', u'')],
+            }
+        for test in tests:
+            name, all = test
+            expected = tests[test]
+            actual = s.getProperties(name, all)
+            self.assertEqual(len(expected), len(actual))
+            for i, ex in enumerate(expected):
+                a = actual[i]
+                self.assertEqual(ex, (a.literalname, a.value, a.priority))
+
+        # order is be effective properties set
+        s = cssutils.css.CSSStyleDeclaration(cssText=
+                                             u'a:0;b:1;a:1')
+        self.assertEqual(u'ba', u''.join([p.name for p in s]))
+
+    def test_getPropertyCSSValue(self):
+        "CSSStyleDeclaration.getPropertyCSSValue()"
+        s = cssutils.css.CSSStyleDeclaration(cssText='color: red;c\\olor: green')
+        self.assertEqual(u'green', s.getPropertyCSSValue('color').cssText)
+        self.assertEqual(u'green', s.getPropertyCSSValue('c\\olor').cssText)
+        self.assertEqual(u'red', s.getPropertyCSSValue('color', False).cssText)
+        self.assertEqual(u'green', s.getPropertyCSSValue('c\\olor', False).cssText)
+#        # shorthand CSSValue should be None
+#        SHORTHAND = [
+#            u'background',
+#            u'border',
+#            u'border-left', u'border-right',
+#            u'border-top', u'border-bottom',
+#            u'border-color', u'border-style', u'border-width',
+#            u'cue',
+#            u'font',
+#            u'list-style',
+#            u'margin',
+#            u'outline',
+#            u'padding',
+#            u'pause']
+#        for short in SHORTHAND:
+#            s.setProperty(short, u'inherit')
+#            self.assertEqual(None, s.getPropertyCSSValue(short))
+
+    def test_getPropertyValue(self):
+        "CSSStyleDeclaration.getPropertyValue()"
+        s = cssutils.css.CSSStyleDeclaration()
+        self.assertEqual(u'', s.getPropertyValue('unset'))
+
+        s.setProperty(u'left', '0')
+        self.assertEqual(u'0', s.getPropertyValue('left'))
+
+        s.setProperty(u'border', '1px  solid  green')
+        self.assertEqual(u'1px solid green', s.getPropertyValue('border'))
+
+        s = cssutils.css.CSSStyleDeclaration(cssText='color: red;c\\olor: green')
+        self.assertEqual(u'green', s.getPropertyValue('color'))
+        self.assertEqual(u'green', s.getPropertyValue('c\\olor'))
+        self.assertEqual(u'red', s.getPropertyValue('color', False))
+        self.assertEqual(u'green', s.getPropertyValue('c\\olor', False))
+
+        tests = {
+            ur'color: red; color: green': 'green',
+            ur'c\olor: red; c\olor: green': 'green',
+            ur'color: red; c\olor: green': 'green',
+            ur'color: red !important; color: green !important': 'green',
+            ur'color: green !important; color: red': 'green',
+            }
+        for test in tests:
+            s = cssutils.css.CSSStyleDeclaration(cssText=test)
+            self.assertEqual(tests[test], s.getPropertyValue('color'))
+
+    def test_getPropertyPriority(self):
+        "CSSStyleDeclaration.getPropertyPriority()"
+        s = cssutils.css.CSSStyleDeclaration()
+        self.assertEqual(u'', s.getPropertyPriority('unset'))
+
+        s.setProperty(u'left', u'0', u'!important')
+        self.assertEqual(u'important', s.getPropertyPriority('left'))
+
+        s = cssutils.css.CSSStyleDeclaration(cssText=
+            'x: 1 !important;\\x: 2;x: 3 !important;\\x: 4')
+        self.assertEqual(u'important', s.getPropertyPriority('x'))
+        self.assertEqual(u'important', s.getPropertyPriority('\\x'))
+        self.assertEqual(u'important', s.getPropertyPriority('x', True))
+        self.assertEqual(u'', s.getPropertyPriority('\\x', False))
+
+    def test_removeProperty(self):
+        "CSSStyleDeclaration.removeProperty()"
+        cssutils.ser.prefs.useDefaults()
+        s = cssutils.css.CSSStyleDeclaration()
+        css = ur'\x:0 !important; x:1; \x:2; x:3'
+
+        # normalize=True DEFAULT
+        s.cssText = css
+        self.assertEqual(u'0', s.removeProperty('x'))
+        self.assertEqual(u'', s.cssText)
+
+        # normalize=False
+        s.cssText = css
+        self.assertEqual(u'3', s.removeProperty('x', normalize=False))
+        self.assertEqual(ur'\x: 0 !important;\x: 2', s.getCssText(separator=u''))
+        self.assertEqual(u'0', s.removeProperty(r'\x', normalize=False))
+        self.assertEqual(u'', s.cssText)
+
+        s.cssText = css
+        self.assertEqual(u'0', s.removeProperty(r'\x', normalize=False))
+        self.assertEqual(ur'x: 1;x: 3', s.getCssText(separator=u''))
+        self.assertEqual(u'3', s.removeProperty('x', normalize=False))
+        self.assertEqual(u'', s.cssText)
+
+    def test_setProperty(self):
+        "CSSStyleDeclaration.setProperty()"
+        s = cssutils.css.CSSStyleDeclaration()
+        s.setProperty('top', '0', '!important')
+        self.assertEqual('0', s.getPropertyValue('top'))
+        self.assertEqual('important', s.getPropertyPriority('top'))
+        s.setProperty('top', '1px')
+        self.assertEqual('1px', s.getPropertyValue('top'))
+        self.assertEqual('', s.getPropertyPriority('top'))
+
+        s.setProperty('top', '2px')
+        self.assertEqual('2px', s.getPropertyValue('top'))
+
+        s.setProperty('\\top', '3px')
+        self.assertEqual('3px', s.getPropertyValue('top'))
+
+        s.setProperty('\\top', '4px', normalize=False)
+        self.assertEqual('4px', s.getPropertyValue('top'))
+        self.assertEqual('4px', s.getPropertyValue('\\top', False))
+        self.assertEqual('3px', s.getPropertyValue('top', False))
+
+        # case insensitive
+        s.setProperty('TOP', '0', '!IMPORTANT')
+        self.assertEqual('0', s.getPropertyValue('top'))
+        self.assertEqual('important', s.getPropertyPriority('top'))
+
+        tests = {
+            (u'left', u'0', u''): u'left: 0',
+            (u'left', u'0', u'important'): u'left: 0 !important',
+            (u'LEFT', u'0', u'important'): u'left: 0 !important',
+            (u'left', u'0', u'important'): u'left: 0 !important',
+            }
+        for test, exp in tests.items():
+            s = cssutils.css.CSSStyleDeclaration()
+            n, v, p = test
+            s.setProperty(n, v, p)
+            self.assertEqual(exp, s.cssText)
+            self.assertEqual(v, s.getPropertyValue(n))
+            self.assertEqual(p, s.getPropertyPriority(n))
+
+        # empty
+        s = cssutils.css.CSSStyleDeclaration()
+        self.assertEqual('', s.top)
+        s.top = '0'
+        self.assertEqual('0', s.top)
+        s.top = ''
+        self.assertEqual('', s.top)
+        s.top = None
+        self.assertEqual('', s.top)
+
+    def test_setProperty(self):
+        "CSSStyleDeclaration.setProperty(replace=)"
+        s = cssutils.css.CSSStyleDeclaration()
+        s.setProperty('top', '1px')
+        self.assertEqual(len(s.getProperties('top', all=True)), 1)
+
+        s.setProperty('top', '2px')
+        self.assertEqual(len(s.getProperties('top', all=True)), 1)
+        self.assertEqual(s.getPropertyValue('top'), '2px')
+
+        s.setProperty('top', '3px', replace=False)
+        self.assertEqual(len(s.getProperties('top', all=True)), 2)
+        self.assertEqual(s.getPropertyValue('top'), '3px')
+
+    def test_length(self):
+        "CSSStyleDeclaration.length"
+        s = cssutils.css.CSSStyleDeclaration()
+
+        # cssText
+        s.cssText = u'left: 0'
+        self.assertEqual(1, s.length)
+        self.assertEqual(1, len(s.seq))
+        s.cssText = u'/*1*/left/*x*/:/*x*/0/*x*/;/*2*/ top: 1;/*3*/'
+        self.assertEqual(2, s.length)
+        self.assertEqual(5, len(s.seq))
+
+        # set
+        s = cssutils.css.CSSStyleDeclaration()
+        s.setProperty('top', '0', '!important')
+        self.assertEqual(1, s.length)
+        s.setProperty('top', '1px')
+        self.assertEqual(1, s.length)
+        s.setProperty('left', '1px')
+
+    def test_nameParameter(self):
+        "CSSStyleDeclaration.XXX(name)"
+        s = cssutils.css.CSSStyleDeclaration()
+        s.setProperty('top', '1px', '!important')
+
+        self.assertEqual('1px', s.getPropertyValue('top'))
+        self.assertEqual('1px', s.getPropertyValue('TOP'))
+        self.assertEqual('1px', s.getPropertyValue('T\op'))
+
+        self.assertEqual('important', s.getPropertyPriority('top'))
+        self.assertEqual('important', s.getPropertyPriority('TOP'))
+        self.assertEqual('important', s.getPropertyPriority('T\op'))
+
+        s.setProperty('top', '2px', '!important')
+        self.assertEqual('2px', s.removeProperty('top'))
+        s.setProperty('top', '2px', '!important')
+        self.assertEqual('2px', s.removeProperty('TOP'))
+        s.setProperty('top', '2px', '!important')
+        self.assertEqual('2px', s.removeProperty('T\op'))
+
+    def test_css2properties(self):
+        "CSSStyleDeclaration.$css2property get set del"
+        s = cssutils.css.CSSStyleDeclaration(
+            cssText='left: 1px;color: red; font-style: italic')
+
+        s.color = 'green'
+        s.fontStyle = 'normal'
+        self.assertEqual('green', s.color)
+        self.assertEqual('normal', s.fontStyle)
+        self.assertEqual('green', s.getPropertyValue('color'))
+        self.assertEqual('normal', s.getPropertyValue('font-style'))
+        self.assertEqual(
+            u'''left: 1px;\ncolor: green;\nfont-style: normal''',
+            s.cssText)
+
+        del s.color
+        self.assertEqual(
+            u'''left: 1px;\nfont-style: normal''',
+            s.cssText)
+        del s.fontStyle
+        self.assertEqual(u'left: 1px', s.cssText)
+
+        self.assertRaises(AttributeError, s.__setattr__, 'UNKNOWN', 'red')
+        # unknown properties must be set with setProperty!
+        s.setProperty('UNKNOWN', 'red')
+        # but are still not usable as property!
+        self.assertRaises(AttributeError, s.__getattribute__, 'UNKNOWN')
+        self.assertRaises(AttributeError, s.__delattr__, 'UNKNOWN')
+        # but are kept
+        self.assertEqual('red', s.getPropertyValue('UNKNOWN'))
+        self.assertEqual(
+            '''left: 1px;\nunknown: red''', s.cssText)
+
+    def test_reprANDstr(self):
+        "CSSStyleDeclaration.__repr__(), .__str__()"
+        s = cssutils.css.CSSStyleDeclaration(cssText='a:1;b:2')
+
+        self.assertTrue("2" in str(s)) # length
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssmediarule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssmediarule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssmediarule.py	(revision 1126)
@@ -0,0 +1,446 @@
+"""Testcases for cssutils.css.CSSMediaRule"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class CSSMediaRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSMediaRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSMediaRule()
+        self.rRO = cssutils.css.CSSMediaRule(readonly=True)
+        self.r_type = cssutils.css.CSSMediaRule.MEDIA_RULE
+        self.r_typeString = 'MEDIA_RULE'
+        # for tests
+        self.stylerule = cssutils.css.CSSStyleRule()
+        self.stylerule.cssText = u'a {}'
+        
+    def test_init(self):
+        "CSSMediaRule.__init__()"
+        super(CSSMediaRuleTestCase, self).test_init()
+
+        r = cssutils.css.CSSMediaRule()
+        self.assertEqual(cssutils.css.CSSRuleList, type(r.cssRules))
+        self.assertEqual([], r.cssRules)
+        self.assertEqual(u'', r.cssText)
+        self.assertEqual(cssutils.stylesheets.MediaList, type(r.media))
+        self.assertEqual('all', r.media.mediaText)
+        self.assertEqual(None, r.name)
+
+        r = cssutils.css.CSSMediaRule(mediaText='print', name='name')
+        self.assertEqual(cssutils.css.CSSRuleList, type(r.cssRules))
+        self.assertEqual([], r.cssRules)
+        self.assertEqual(u'', r.cssText)
+        self.assertEqual(cssutils.stylesheets.MediaList, type(r.media))
+        self.assertEqual('print', r.media.mediaText)
+        self.assertEqual('name', r.name)
+
+        # only possible to set @... similar name
+        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
+
+    def test_iter(self):
+        "CSSMediaRule.__iter__()"
+        m = cssutils.css.CSSMediaRule()
+        m.cssText = '''@media all { /*1*/a { left: 0} b{ top:0} }'''
+        types = [cssutils.css.CSSRule.COMMENT,
+                 cssutils.css.CSSRule.STYLE_RULE,
+                 cssutils.css.CSSRule.STYLE_RULE]
+        for i, rule in enumerate(m):
+            self.assertEqual(rule, m.cssRules[i])
+            self.assertEqual(rule.type, types[i])
+            self.assertEqual(rule.parentRule, m)
+
+    def test_refs(self):
+        """CSSStylesheet references"""
+        s = cssutils.parseString('@media all {a {color: red}}')
+        r = s.cssRules[0]
+        rules = r.cssRules
+        self.assertEqual(r.cssRules[0].parentStyleSheet, s)
+        self.assertEqual(rules[0].parentStyleSheet, s)
+
+        # set cssText
+        r.cssText = '@media all {a {color: blue}}'
+        # not anymore: self.assertEqual(rules, r.cssRules)
+
+        # set cssRules 
+        r.cssRules = cssutils.parseString('''
+            /**/
+            @x;
+            b {}').cssRules''').cssRules
+        # new object
+        self.assertNotEqual(rules, r.cssRules)
+        for i, sr in enumerate(r.cssRules):
+            self.assertEqual(sr.parentStyleSheet, s)
+            self.assertEqual(sr.parentRule, r)
+            
+    def test_cssRules(self):
+        "CSSMediaRule.cssRules"
+        r = cssutils.css.CSSMediaRule()
+        self.assertEqual([], r.cssRules)
+        sr = cssutils.css.CSSStyleRule()
+        r.cssRules.append(sr)
+        self.assertEqual([sr], r.cssRules)
+        ir = cssutils.css.CSSImportRule()
+        self.assertRaises(xml.dom.HierarchyRequestErr, r.cssRules.append, ir)
+
+        s = cssutils.parseString('@media all { /*1*/a {x:1} }')
+        m = s.cssRules[0]
+        self.assertEqual(2, m.cssRules.length)
+        del m.cssRules[0]
+        self.assertEqual(1, m.cssRules.length)
+        m.cssRules.append('/*2*/')
+        self.assertEqual(2, m.cssRules.length)
+        m.cssRules.extend(cssutils.parseString('/*3*/x {y:2}').cssRules)
+        self.assertEqual(4, m.cssRules.length)
+        self.assertEqual(u'@media all {\n    a {\n        x: 1\n        }\n    /*2*/\n    /*3*/\n    x {\n        y: 2\n        }\n    }', 
+                         m.cssText)
+        
+        for rule in m.cssRules:
+            self.assertEqual(rule.parentStyleSheet, s)
+            self.assertEqual(rule.parentRule, m)
+
+    def test_cssText(self):
+        "CSSMediaRule.cssText"
+        style = '''{
+    a {
+        color: red
+        }
+    }'''
+
+        mls = {
+            u' (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx) ': None,
+            u' tv ': None,
+            u' only tv ': None,
+            u' not tv ': None,
+            u' only tv and (color) ': None,
+            u' only tv and(color)': u' only tv and (color) ',
+            u' only tv and (color: red) ': None,
+            u' only tv and (color: red) and (width: 100px) ': None,
+            u' only tv and (color: red) and (width: 100px), tv ': None,
+            u' only tv and (color: red) and (width: 100px), tv and (width: 20px) ': None,
+            u' only tv and(color :red)and(  width :100px  )  ,tv and(width: 20px) ': 
+                u' only tv and (color: red) and (width: 100px), tv and (width: 20px) ',
+            u' (color: red) and (width: 100px), (width: 20px) ': None,
+            u' /*1*/ only /*2*/ tv /*3*/ and /*4*/ (/*5*/ width) /*5*/ /*6*/, (color) and (height) ': None,
+            u'(color)and(width),(height)': u' (color) and (width), (height) '
+        }
+        tests = {}
+        for b, a in mls.items(): 
+            if a is None:
+                a = b
+            tests[u'@media%s%s' % (b, style)] = u'@media%s%s' % (a, style)
+
+        self.do_equal_p(tests)
+        self.do_equal_r(tests)
+
+        tests = {
+            u'@media only tv{}': u'',
+            u'@media not tv{}': u'',
+            u'@media only tv and (color){}': u'',
+            u'@media only tv and (color: red){}': u'',
+            u'@media only tv and (color: red) and (width: 100px){}': u'',
+            u'@media only tv and (color: red) and (width: 100px), tv{}': u'',
+            u'@media only tv and (color: red) and (width: 100px), tv and (width: 20px){}': u'',
+            u'@media (color: red) and (width: 100px), (width: 20px){}': u'',
+            u'@media (width){}': u'',
+            u'@media (width:10px){}': u'',
+            u'@media (width), (color){}': u'',
+            u'@media (width)  ,  (color),(height){}': u'',
+            u'@media (width)  ,  (color) and (height){}': u'',
+            u'@media (width) and (color){}': u'',
+            u'@media all and (width){}': u'',
+            u'@media all and (width:10px){}': u'',
+            u'@media all and (width), (color){}': u'',
+            u'@media all and (width)  ,  (color),(height){}': u'',
+            u'@media all and (width)  ,  (color) and (height){}': u'',
+            u'@media all and (width) and (color){}': u'',
+            u'@media only tv and (width){}': u'',
+            u'@media only tv and (width:10px){}': u'',
+            u'@media only tv and (width), (color){}': u'',
+            u'@media only tv and (width)  ,  (color),(height){}': u'',
+            u'@media only tv and (width)  ,  (color) and (height){}': u'',
+            u'@media only tv and (width) and (color){}': u'',
+
+            u'@media only tv and (width) "name" {}': u'',
+            u'@media only tv and (width:10px) "name" {}': u'',
+            u'@media only tv and (width), (color){}': u'',
+            u'@media only tv and (width)  ,  (color),(height){}': u'',
+            u'@media only tv and (width)  ,  (color) and (height){}': u'',
+            u'@media only tv and (width) and (color){}': u'',
+
+            
+
+            u'@media all "name"{}': u'',
+            u'@media all {}': u'',
+            u'@media/*x*/all{}': u'',
+            u'@media all { a{ x: 1} }': u'@media all {\n    a {\n        x: 1\n        }\n    }',
+            u'@media all "name" { a{ x: 1} }': u'@media all "name" {\n    a {\n        x: 1\n        }\n    }',
+            u'@MEDIA all { a{x:1} }': u'@media all {\n    a {\n        x: 1\n        }\n    }',
+            u'@\\media all { a{x:1} }': u'@media all {\n    a {\n        x: 1\n        }\n    }',
+            u'@media all {@x some;a{color: red;}b{color: green;}}':
+                u'''@media all {
+    @x some;
+    a {
+        color: red
+        }
+    b {
+        color: green
+        }
+    }''',
+            u'@media all { @x{}}': u'@media all {\n    @x {\n        }\n    }',
+            u'@media all "n" /**/ { @x{}}': 
+                u'@media all "n" /**/ {\n    @x {\n        }\n    }',
+            # comments
+            u'@media/*1*//*2*/all/*3*//*4*/{/*5*/a{x:1}}': 
+                u'@media /*1*/ /*2*/ all /*3*/ /*4*/ {\n    /*5*/\n    a {\n        x: 1\n        }\n    }',
+            u'@media  /*1*/  /*2*/  all  /*3*/  /*4*/  {  /*5*/  a{ x: 1} }': 
+                u'@media /*1*/ /*2*/ all /*3*/ /*4*/ {\n    /*5*/\n    a {\n        x: 1\n        }\n    }',
+            # WS
+            u'@media\n\t\f all\n\t\f {\n\t\f a{ x: 1}\n\t\f }': 
+                u'@media all {\n    a {\n        x: 1\n        }\n    }',
+            }
+        self.do_equal_p(tests)
+        self.do_equal_r(tests)
+
+        tests = {
+            u'@media {}': xml.dom.SyntaxErr,
+            u'@media;': xml.dom.SyntaxErr,
+            u'@media/*only comment*/{}': xml.dom.SyntaxErr,
+            u'@media all;': xml.dom.SyntaxErr,
+            u'@media all "n";': xml.dom.SyntaxErr,
+            u'@media all; @x{}': xml.dom.SyntaxErr,
+            u'@media { a{ x: 1} }': xml.dom.SyntaxErr,
+            u'@media "name" { a{ x: 1} }': xml.dom.SyntaxErr,
+            u'@media "name" all { a{ x: 1} }': xml.dom.SyntaxErr,
+            u'@media all { @charset "x"; a{}}': xml.dom.HierarchyRequestErr,
+            u'@media all { @import "x"; a{}}': xml.dom.HierarchyRequestErr,
+            u'@media all { @media all {} }': xml.dom.HierarchyRequestErr,
+            u'@media all { , }': xml.dom.SyntaxErr,
+            u'@media all {}EXTRA': xml.dom.SyntaxErr,
+            u'@media ({}': xml.dom.SyntaxErr,
+            u'@media (color{}': xml.dom.SyntaxErr,
+            u'@media (color:{}': xml.dom.SyntaxErr,
+            u'@media (color:red{}': xml.dom.SyntaxErr,
+            u'@media (:red){}': xml.dom.SyntaxErr,
+            u'@media (:){}': xml.dom.SyntaxErr,
+            u'@media color:red){}': xml.dom.SyntaxErr,
+
+            }
+        self.do_raise_p(tests)
+        self.do_raise_r(tests)
+
+        tests = {
+            # extra stuff
+            '@media all { x{} } a{}': xml.dom.SyntaxErr,
+            }
+        self.do_raise_r(tests)
+
+        m = cssutils.css.CSSMediaRule()
+        m.cssText = u'''@media all {@x; /*1*/a{color: red;}}'''
+        for r in m.cssRules:
+            self.assertEqual(m, r.parentRule)
+            self.assertEqual(m.parentStyleSheet, r.parentStyleSheet)
+
+        cssutils.ser.prefs.useDefaults()
+
+    def test_media(self):
+        "CSSMediaRule.media"
+        # see CSSImportRule.media
+
+        # setting not allowed
+        self.assertRaises(AttributeError,
+                          self.r.__setattr__, 'media', None)
+        self.assertRaises(AttributeError,
+                          self.r.__setattr__, 'media', 0)
+
+        # set mediaText instead
+        self.r.media.mediaText = 'print'
+        self.r.insertRule(self.stylerule)
+        self.assertEqual(u'', self.r.cssText)
+        cssutils.ser.prefs.keepEmptyRules = True
+        self.assertEqual(u'@media print {\n    a {}\n    }', self.r.cssText)
+        cssutils.ser.prefs.useDefaults()
+
+    def test_name(self):
+        "CSSMediaRule.name"
+        r = cssutils.css.CSSMediaRule()
+        r.cssText = '@media all "\\n\\"ame" {a{left: 0}}'
+
+        self.assertEqual('\\n"ame', r.name)
+        r.name = "n"
+        self.assertEqual('n', r.name)
+        self.assertEqual(u'@media all "n" {\n    a {\n        left: 0\n        }\n    }', 
+                         r.cssText)
+        r.name = '"'
+        self.assertEqual('"', r.name)
+        self.assertEqual(u'@media all "\\"" {\n    a {\n        left: 0\n        }\n    }',
+                         r.cssText)
+
+        r.name = ''
+        self.assertEqual(None, r.name)
+        self.assertEqual(u'@media all {\n    a {\n        left: 0\n        }\n    }',
+                         r.cssText)
+
+        r.name = None
+        self.assertEqual(None, r.name)
+        self.assertEqual(u'@media all {\n    a {\n        left: 0\n        }\n    }',
+                         r.cssText)
+                
+        self.assertRaises(xml.dom.SyntaxErr, r._setName, 0)
+        self.assertRaises(xml.dom.SyntaxErr, r._setName, 123)
+
+    def test_deleteRuleIndex(self):
+        "CSSMediaRule.deleteRule(index)"
+        # see CSSStyleSheet.deleteRule
+        m = cssutils.css.CSSMediaRule()
+        m.cssText = u'''@media all {
+            @a;
+            /* x */
+            @b;
+            @c;
+            @d;
+        }'''
+        self.assertEqual(5, m.cssRules.length)
+        self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, 5)
+
+        # end -1
+        # check parentRule
+        r = m.cssRules[-1]
+        self.assertEqual(m, r.parentRule)
+        m.deleteRule(-1)
+        self.assertEqual(None, r.parentRule)
+
+        self.assertEqual(4, m.cssRules.length)
+        self.assertEqual(
+            u'@media all {\n    @a;\n    /* x */\n    @b;\n    @c;\n    }', m.cssText)
+        # beginning
+        m.deleteRule(0)
+        self.assertEqual(3, m.cssRules.length)
+        self.assertEqual(u'@media all {\n    /* x */\n    @b;\n    @c;\n    }', m.cssText)
+        # middle
+        m.deleteRule(1)
+        self.assertEqual(2, m.cssRules.length)
+        self.assertEqual(u'@media all {\n    /* x */\n    @c;\n    }', m.cssText)
+        # end
+        m.deleteRule(1)
+        self.assertEqual(1, m.cssRules.length)
+        self.assertEqual(u'@media all {\n    /* x */\n    }', m.cssText)
+
+    def test_deleteRule(self):
+        "CSSMediaRule.deleteRule(rule)"
+        m = cssutils.css.CSSMediaRule()
+        m.cssText='''@media all {
+            a { color: red; }
+            b { color: blue; }
+            c { color: green; }
+        }'''
+        s1, s2, s3 = m.cssRules
+        
+        r = cssutils.css.CSSStyleRule()
+        self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, r)
+
+        self.assertEqual(3, m.cssRules.length)
+        m.deleteRule(s2)
+        self.assertEqual(2, m.cssRules.length)
+        self.assertEqual(m.cssText, '@media all {\n    a {\n        color: red\n        }\n    c {\n        color: green\n        }\n    }')
+        self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, s2)
+
+    def test_add(self):
+        "CSSMediaRule.add()"
+        # see CSSStyleSheet.add
+        r = cssutils.css.CSSMediaRule()
+        stylerule1 = cssutils.css.CSSStyleRule()
+        stylerule2 = cssutils.css.CSSStyleRule()
+        r.add(stylerule1)
+        r.add(stylerule2)
+        self.assertEqual(r.cssRules[0], stylerule1)
+        self.assertEqual(r.cssRules[1], stylerule2)
+
+    def test_insertRule(self):
+        "CSSMediaRule.insertRule"
+        # see CSSStyleSheet.insertRule
+        r = cssutils.css.CSSMediaRule()
+        charsetrule = cssutils.css.CSSCharsetRule('ascii')
+        importrule = cssutils.css.CSSImportRule('x')
+        namespacerule = cssutils.css.CSSNamespaceRule()
+        pagerule = cssutils.css.CSSPageRule()
+        mediarule = cssutils.css.CSSMediaRule()
+        unknownrule = cssutils.css.CSSUnknownRule('@x;')
+        stylerule = cssutils.css.CSSStyleRule('a')
+        stylerule.cssText = u'a { x: 1}'
+        comment1 = cssutils.css.CSSComment(u'/*1*/')
+        comment2 = cssutils.css.CSSComment(u'/*2*/')
+
+        # hierarchy
+        self.assertRaises(xml.dom.HierarchyRequestErr,
+                          r.insertRule, charsetrule, 0)
+        self.assertRaises(xml.dom.HierarchyRequestErr,
+                          r.insertRule, importrule, 0)
+        self.assertRaises(xml.dom.HierarchyRequestErr,
+                          r.insertRule, namespacerule, 0)
+        self.assertRaises(xml.dom.HierarchyRequestErr,
+                          r.insertRule, pagerule, 0)
+        self.assertRaises(xml.dom.HierarchyRequestErr,
+                          r.insertRule, mediarule, 0)
+
+        # start insert
+        r.insertRule(stylerule, 0)
+        self.assertEqual(r, stylerule.parentRule)
+        self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
+        # before
+        r.insertRule(comment1, 0)
+        self.assertEqual(r, comment1.parentRule)
+        self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
+        # end explicit
+        r.insertRule(unknownrule, 2)
+        self.assertEqual(r, unknownrule.parentRule)
+        self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
+        # end implicit
+        r.insertRule(comment2)
+        self.assertEqual(r, comment2.parentRule)
+        self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
+        self.assertEqual(
+            '@media all {\n    /*1*/\n    a {\n        x: 1\n        }\n    @x;\n    /*2*/\n    }',
+            r.cssText)
+
+        # index
+        self.assertRaises(xml.dom.IndexSizeErr,
+                  r.insertRule, stylerule, -1)
+        self.assertRaises(xml.dom.IndexSizeErr,
+                  r.insertRule, stylerule, r.cssRules.length + 1)
+
+    def test_InvalidModificationErr(self):
+        "CSSMediaRule.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@media')
+
+    def test_incomplete(self):
+        "CSSMediaRule (incomplete)"
+        tests = {
+            u'@media all { @unknown;': # no }
+                u'@media all {\n    @unknown;\n    }',
+            u'@media all { a {x:"1"}': # no }
+                u'@media all {\n    a {\n        x: "1"\n        }\n    }',
+            u'@media all { a {x:"1"': # no }}
+                u'@media all {\n    a {\n        x: "1"\n        }\n    }',
+            u'@media all { a {x:"1': # no "}}
+                u'@media all {\n    a {\n        x: "1"\n        }\n    }',
+        }
+        self.do_equal_p(tests) # parse
+
+    def test_reprANDstr(self):
+        "CSSMediaRule.__repr__(), .__str__()"
+        mediaText='tv, print'
+        
+        s = cssutils.css.CSSMediaRule(mediaText=mediaText)
+        
+        self.assertTrue(mediaText in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(mediaText == s2.media.mediaText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_selector.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_selector.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_selector.py	(revision 1126)
@@ -0,0 +1,495 @@
+"""Testcases for cssutils.css.selector.Selector.
+
+what should happen here?
+    - star 7 hack::
+        x*
+        does not validate but works in IE>5 and FF, does it???
+
+"""
+import xml.dom
+import basetest
+import cssutils
+
+class SelectorTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        self.r = cssutils.css.Selector('*')
+
+    def test_init(self):
+        "Selector.__init__()"
+        s = cssutils.css.Selector('*')
+        self.assertEqual((None, '*'), s.element)
+        self.assertEqual({}, s._namespaces.namespaces)
+        self.assertEqual(None, s.parent)
+        self.assertEqual('*', s.selectorText)
+        self.assertEqual((0,0,0,0), s.specificity)
+        self.assertEqual(True, s.wellformed)
+
+        s = cssutils.css.Selector(('p|b', {'p': 'URI'}) )
+        self.assertEqual(('URI', 'b'), s.element)
+        self.assertEqual({'p': 'URI'}, s._namespaces.namespaces)
+        self.assertEqual(None, s.parent)
+        self.assertEqual('p|b', s.selectorText)
+        self.assertEqual((0,0,0,1), s.specificity)
+        self.assertEqual(True, s.wellformed)
+
+        self.assertRaisesEx(xml.dom.NamespaceErr, cssutils.css.Selector, 'p|b')
+
+    def test_element(self):
+        "Selector.element (TODO: RESOLVE)"
+        tests = {
+            '*': (None, '*'),
+            'x': (None, 'x'),
+            '\\x': (None, '\\x'),
+            '|x': (u'', 'x'),
+            '*|x': (cssutils._ANYNS, 'x'),
+            'ex|x': (u'example', 'x'),
+            'a x': (None, 'x'),
+            'a+x': (None, 'x'),
+            'a>x': (None, 'x'),
+            'a~x': (None, 'x'),
+            'a+b~c x': (None, 'x'),
+            'x[href]': (None, 'x'),
+            'x[href="123"]': (None, 'x'),
+            'x:hover': (None, 'x'),
+            'x:first-letter': (None, 'x'), # TODO: Really?
+            'x::first-line': (None, 'x'), # TODO: Really?
+            'x:not(href)': (None, 'x'), # TODO: Really?
+
+            '#id': None,
+            '.c': None,
+            'x#id': (None, 'x'),
+            'x.c': (None, 'x')
+        }
+        for test, ele in tests.items():
+            s = cssutils.css.Selector((test,{'ex': 'example'}))
+            self.assertEqual(ele, s.element)
+
+    def test_namespaces(self):
+        "Selector.namespaces"
+        namespaces = [
+            {'p': 'other'}, # no default
+            {'': 'default', 'p': 'other'}, # with default
+            {'': 'default', 'p': 'default' } # same default
+            ]
+        tests = {
+            # selector: with default, no default, same default
+            '*': ('*', '*', '*'),
+            'x': ('x', 'x', 'x'),
+            '|*': ('|*', '|*', '|*'),
+            '|x': ('|x', '|x', '|x'),
+            '*|*': ('*|*', '*|*', '*|*'),
+            '*|x': ('*|x', '*|x', '*|x'),
+            'p|*': ('p|*', 'p|*', '*'),
+            'p|x': ('p|x', 'p|x', 'x'),
+            'x[a][|a][*|a][p|a]': ('x[a][a][*|a][p|a]',
+                                   'x[a][a][*|a][p|a]',
+                                   'x[a][a][*|a][a]')
+        }
+        for sel, exp in tests.items():
+            for i, result in enumerate(exp):
+                s = cssutils.css.Selector((sel, namespaces[i]))
+                self.assertEqual(result, s.selectorText)
+
+        # add to CSSStyleSheet
+        sheet = cssutils.css.CSSStyleSheet()
+        sheet.cssText = '@namespace p "u"; a { color: green }'
+
+        r = sheet.cssRules[1]
+
+        self.assertEqual(r.selectorText, u'a')
+
+        # add default namespace
+        sheet.namespaces[''] = 'a';
+        self.assertEqual(r.selectorText, u'|a')
+
+        del sheet.namespaces[''];
+        self.assertEqual(r.selectorText, u'a')
+
+#        r.selectorList.append('a')
+#        self.assertEqual(r.selectorText, u'|a, a')
+#        r.selectorList.append('*|a')
+#        self.assertEqual(r.selectorText, u'|a, a, *|a')
+
+    def test_default_namespace(self):
+        "Selector.namespaces default"
+        css = '''@namespace "default";
+                a[att] { color:green; }
+        '''
+        sheet = cssutils.css.CSSStyleSheet()
+        sheet.cssText = css
+        self.assertEqual(sheet.cssText,
+                         u'@namespace "default";\na[att] {\n    color: green\n    }'.encode())
+        # use a prefix for default namespace, does not goes for atts!
+        sheet.namespaces['p'] = 'default'
+        self.assertEqual(sheet.cssText,
+                         u'@namespace p "default";\np|a[att] {\n    color: green\n    }'.encode())
+
+    def test_parent(self):
+        "Selector.parent"
+        sl = cssutils.css.SelectorList('a, b')
+        for sel in sl:
+            self.assertEqual(sl, sel.parent)
+
+        newsel = cssutils.css.Selector('x')
+        sl.append(newsel)
+        self.assertEqual(sl, newsel.parent)
+
+        newsel = cssutils.css.Selector('y')
+        sl.appendSelector(newsel)
+        self.assertEqual(sl, newsel.parent)
+
+    def test_selectorText(self):
+        "Selector.selectorText"
+        tests = {
+            # combinators
+            u'a+b>c~e f': u'a + b > c ~ e f',
+            u'a  +  b  >  c  ~  e   f': u'a + b > c ~ e f',
+            u'a+b': u'a + b',
+            u'a  +  b': 'a + b',
+            u'a\n  +\t  b': 'a + b',
+            u'a~b': u'a ~ b',
+            u'a b': None,
+            u'a   b': 'a b',
+            u'a\nb': 'a b',
+            u'a\tb': 'a b',
+            u'a   #b': 'a #b',
+            u'a   .b': 'a .b',
+            u'a * b': None,
+            # >
+            u'a>b': u'a > b',
+            u'a> b': 'a > b',
+            u'a >b': 'a > b',
+            u'a > b': 'a > b',
+            # +
+            u'a+b': u'a + b',
+            u'a+ b': 'a + b',
+            u'a +b': 'a + b',
+            u'a + b': 'a + b',
+            # ~
+            u'a~b': u'a ~ b',
+            u'a~ b': 'a ~ b',
+            u'a ~b': 'a ~ b',
+            u'a ~ b': 'a ~ b',
+
+            # type selector
+            u'a': None,
+            u'h1-a_x__--': None,
+            u'a-a': None,
+            u'a_a': None,
+            u'-a': None,
+            u'_': None,
+            u'-_': None,
+            ur'-\72': u'-r',
+            #ur'\25': u'%', # TODO: should be escaped!
+            u'.a a': None,
+            u'a1': None,
+            u'a1-1': None,
+            u'.a1-1': None,
+
+            # universal
+            u'*': None,
+            u'*/*x*/': None,
+            u'* /*x*/': None,
+            u'*:hover': None,
+            u'* :hover': None,
+            u'*:lang(fr)': None,
+            u'* :lang(fr)': None,
+            u'*::first-line': None,
+            u'* ::first-line': None,
+            u'*[lang=fr]': None,
+            u'[lang=fr]': None,
+
+            # HASH
+            u'''#a''': None,
+            u'''#a1''': None,
+            u'''#1a''': None, # valid to grammar but not for HTML
+            u'''#1''': None, # valid to grammar but not for HTML
+            u'''a#b''': None,
+            u'''a #b''': None,
+            u'''a#b.c''': None,
+            u'''a.c#b''': None,
+            u'''a #b.c''': None,
+            u'''a .c#b''': None,
+
+            # class
+            u'ab': 'ab',
+            u'a.b': None,
+            u'a.b.c': None,
+            u'.a1._1': None,
+
+            # attrib
+            u'''[x]''': None,
+            u'''*[x]''': None,
+            u'''a[x]''': None,
+            u'''a[ x]''': 'a[x]',
+            u'''a[x ]''': 'a[x]',
+            u'''a [x]''': 'a [x]',
+            u'''* [x]''': None, # is really * *[x]
+
+            u'''a[x="1"]''': None,
+            u'''a[x ="1"]''': 'a[x="1"]',
+            u'''a[x= "1"]''': 'a[x="1"]',
+            u'''a[x = "1"]''': 'a[x="1"]',
+            u'''a[ x = "1"]''': 'a[x="1"]',
+            u'''a[x = "1" ]''': 'a[x="1"]',
+            u'''a[ x = "1" ]''': 'a[x="1"]',
+            u'''a [ x = "1" ]''': 'a [x="1"]',
+
+            u'''a[x~=a1]''': None,
+            u'''a[x ~=a1]''': 'a[x~=a1]',
+            u'''a[x~= a1]''': 'a[x~=a1]',
+            u'''a[x ~= a1]''': 'a[x~=a1]',
+            u'''a[ x ~= a1]''': 'a[x~=a1]',
+            u'''a[x ~= a1 ]''': 'a[x~=a1]',
+            u'''a[ x ~= a1 ]''': 'a[x~=a1]',
+            u'''a [ x ~= a1 ]''': 'a [x~=a1]', # same as next!
+            u'''a *[ x ~= a1 ]''': 'a *[x~=a1]',
+
+            u'''a[x|=en]''': None,
+            u'''a[x|= en]''': 'a[x|=en]',
+            u'''a[x |=en]''': 'a[x|=en]',
+            u'''a[x |= en]''': 'a[x|=en]',
+            u'''a[ x |= en]''': 'a[x|=en]',
+            u'''a[x |= en ]''': 'a[x|=en]',
+            u'''a[ x |= en]''': 'a[x|=en]',
+            u'''a [ x |= en]''': 'a [x|=en]',
+            # CSS3
+            u'''a[x^=en]''': None,
+            u'''a[x$=en]''': None,
+            u'''a[x*=en]''': None,
+
+            u'''a[/*1*/x/*2*/]''': None,
+            u'''a[/*1*/x/*2*/=/*3*/a/*4*/]''': None,
+            u'''a[/*1*/x/*2*/~=/*3*/a/*4*/]''': None,
+            u'''a[/*1*/x/*2*/|=/*3*/a/*4*/]''': None,
+
+            # pseudo-elements
+            u'a x:first-line': None,
+            u'a x:first-letter': None,
+            u'a x:before': None,
+            u'a x:after': None,
+            u'a x::selection': None,
+            u'a:hover+b:hover>c:hover~e:hover f:hover':
+                u'a:hover + b:hover > c:hover ~ e:hover f:hover',
+            u'a:hover  +  b:hover  >  c:hover  ~  e:hover   f:hover':
+                u'a:hover + b:hover > c:hover ~ e:hover f:hover',
+            u'a::selection+b::selection>c::selection~e::selection f::selection':
+                u'a::selection + b::selection > c::selection ~ e::selection f::selection',
+            u'a::selection  +  b::selection  >  c::selection  ~  e::selection   f::selection':
+                u'a::selection + b::selection > c::selection ~ e::selection f::selection',
+
+            u'x:lang(de) y': None,
+            u'x:nth-child(odd) y': None,
+            # functional pseudo
+            u'x:func(a + b-2px22.3"s"i)': None,
+            u'x:func(1 + 1)': None,
+            u'x:func(1+1)': u'x:func(1+1)',
+            u'x:func(1   +   1)': u'x:func(1 + 1)',
+            u'x:func(1-1)': u'x:func(1-1)',
+            u'x:func(1  -  1)': u'x:func(1 -1)', # TODO: FIX!
+            u'x:func(a-1)': u'x:func(a-1)',
+            u'x:func(a -1px)': u'x:func(a -1px)',
+            u'x:func(1px)': None,
+            u'x:func(23.4)': None,
+            u'x:func("s")': None,
+            u'x:func(i)': None,
+
+            # negation
+            u':not(y)': None,
+            u':not(   y  \t\n)': u':not(y)',
+            u'*:not(y)': None,
+            u'x:not(y)': None,
+            u'.x:not(y)': None,
+            u':not(*)': None,
+            u':not(#a)': None,
+            u':not(.a)': None,
+            u':not([a])': None,
+            u':not(:first-letter)': None,
+            u':not(::first-letter)': None,
+
+            # escapes
+            ur'\74\72 td': 'trtd',
+            ur'\74\72  td': 'tr td',
+            ur'\74\000072 td': 'trtd',
+            ur'\74\000072  td': 'tr td',
+
+            # comments
+            u'a/**/ b': None,
+            u'a /**/b': None,
+            u'a /**/ b': None,
+            u'a  /**/ b': u'a /**/ b',
+            u'a /**/  b': u'a /**/ b',
+
+            # namespaces
+            u'|e': None,
+            u'*|e': None,
+            u'*|*': None,
+            (u'p|*', (('p', 'uri'),)): u'p|*',
+            (u'p|e', (('p', 'uri'),)): u'p|e',
+            (u'-a_x12|e', (('-a_x12', 'uri'),)): u'-a_x12|e',
+            (u'*|b[p|a]', (('p', 'uri'),)): '*|b[p|a]',
+
+            # case
+            u'elemenT.clasS#iD[atT="valuE"]:noT(x)::firsT-linE':
+                u'elemenT.clasS#iD[atT="valuE"]:not(x)::first-line'
+            }
+        # do not parse as not complete
+        self.do_equal_r(tests, att='selectorText')
+
+        tests = {
+            u'x|a': xml.dom.NamespaceErr,
+            (u'p|*', (('x', 'uri'),)): xml.dom.NamespaceErr,
+
+            u'': xml.dom.SyntaxErr,
+            u'1': xml.dom.SyntaxErr,
+            u'-1': xml.dom.SyntaxErr,
+            u'a*b': xml.dom.SyntaxErr,
+            u'a *b': xml.dom.SyntaxErr,
+            u'a* b': xml.dom.SyntaxErr,
+            u'a/**/b': xml.dom.SyntaxErr,
+
+            u'#': xml.dom.SyntaxErr,
+            u'|': xml.dom.SyntaxErr,
+
+            u':': xml.dom.SyntaxErr,
+            u'::': xml.dom.SyntaxErr,
+            u': a': xml.dom.SyntaxErr,
+            u':: a': xml.dom.SyntaxErr,
+            u':a()': xml.dom.SyntaxErr, # no value
+            u'::a()': xml.dom.SyntaxErr, # no value
+            u':::a': xml.dom.SyntaxErr,
+            u':1': xml.dom.SyntaxErr,
+
+            u'#.x': xml.dom.SyntaxErr,
+            u'.': xml.dom.SyntaxErr,
+            u'.1': xml.dom.SyntaxErr,
+            u'.a.1': xml.dom.SyntaxErr,
+
+            u'[a': xml.dom.SyntaxErr,
+            u'a]': xml.dom.SyntaxErr,
+            u'[a b]': xml.dom.SyntaxErr,
+            u'[=b]': xml.dom.SyntaxErr,
+            u'[a=]': xml.dom.SyntaxErr,
+            u'[a|=]': xml.dom.SyntaxErr,
+            u'[a~=]': xml.dom.SyntaxErr,
+            u'[a=1]': xml.dom.SyntaxErr,
+
+            u'a +': xml.dom.SyntaxErr,
+            u'a >': xml.dom.SyntaxErr,
+            u'a ++ b': xml.dom.SyntaxErr,
+            u'a + > b': xml.dom.SyntaxErr,
+
+            # functional pseudo
+            u'*:lang(': xml.dom.SyntaxErr,
+            u'*:lang()': xml.dom.SyntaxErr, # no arg
+
+            # negation
+            u'not(x)': xml.dom.SyntaxErr, # no valid function
+            u':not()': xml.dom.SyntaxErr, # no arg
+            u':not(x': xml.dom.SyntaxErr, # no )
+            u':not(-': xml.dom.SyntaxErr, # not allowed
+            u':not(+': xml.dom.SyntaxErr, # not allowed
+
+            # only one selector!
+            u',': xml.dom.InvalidModificationErr,
+            u',a': xml.dom.InvalidModificationErr,
+            u'a,': xml.dom.InvalidModificationErr,
+
+            # @
+            u'p @here': xml.dom.SyntaxErr, # not allowed
+
+            }
+        # only set as not complete
+        self.do_raise_r(tests, att='_setSelectorText')
+
+    def test_specificity(self):
+        "Selector.specificity"
+        selector = cssutils.css.Selector()
+
+        # readonly
+        def _set(): selector.specificity = 1
+        self.assertRaisesMsg(AttributeError, "can't set attribute", _set)
+
+        tests = {
+            u'*': (0,0,0,0),
+            u'li': (0,0,0,1),
+            u'li:first-line': (0,0,0,2),
+            u'ul li': (0,0,0,2),
+            u'ul ol+li': (0,0,0,3),
+            u'h1 + *[rel=up]': (0,0,1,1),
+            u'ul ol li.red': (0,0,1,3),
+            u'li.red.level': (0,0,2,1),
+            u'#x34y': (0,1,0,0),
+
+            u'UL OL LI.red': (0,0,1,3),
+            u'LI.red.level': (0,0,2,1),
+            u'#s12:not(FOO)': (0,1,0,1),
+            u'button:not([DISABLED])': (0,0,1,1), #?
+            u'*:not(FOO)': (0,0,0,1),
+
+            # elements
+            u'a+b': (0,0,0,2),
+            u'a>b': (0,0,0,2),
+            u'a b': (0,0,0,2),
+            u'* a': (0,0,0,1),
+            u'a *': (0,0,0,1),
+            u'a * b': (0,0,0,2),
+
+            u'a:hover': (0,0,0,1),
+
+            u'a:first-line': (0,0,0,2),
+            u'a:first-letter': (0,0,0,2),
+            u'a:before': (0,0,0,2),
+            u'a:after': (0,0,0,2),
+
+            # classes and attributes
+            u'.a': (0,0,1,0),
+            u'*.a': (0,0,1,0),
+            u'a.a': (0,0,1,1),
+            u'.a.a': (0,0,2,0), # IE<7 False (0,0,1,0)
+            u'a.a.a': (0,0,2,1),
+            u'.a.b': (0,0,2,0),
+            u'a.a.b': (0,0,2,1),
+            u'.a .a': (0,0,2,0),
+            u'*[x]': (0,0,1,0),
+            u'*[x]': (0,0,1,0),
+            u'*[x]': (0,0,1,0),
+            u'*[x=a]': (0,0,1,0),
+            u'*[x~=a]': (0,0,1,0),
+            u'*[x|=a]': (0,0,1,0),
+            u'*[x^=a]': (0,0,1,0),
+            u'*[x*=a]': (0,0,1,0),
+            u'*[x$=a]': (0,0,1,0),
+            u'*[x][y]': (0,0,2,0),
+
+            # ids
+            u'#a': (0,1,0,0),
+            u'*#a': (0,1,0,0),
+            u'x#a': (0,1,0,1),
+            u'.x#a': (0,1,1,0),
+            u'a.x#a': (0,1,1,1),
+            u'#a#a': (0,2,0,0), # e.g. html:id + xml:id
+            u'#a#b': (0,2,0,0),
+            u'#a #b': (0,2,0,0),
+            }
+        for text in tests:
+            selector.selectorText = text
+            self.assertEqual(tests[text], selector.specificity)
+
+    def test_reprANDstr(self):
+        "Selector.__repr__(), .__str__()"
+        sel=u'a + b'
+
+        s = cssutils.css.Selector(selectorText=sel)
+
+        self.assertTrue(sel in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(sel == s2.selectorText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssrule.py	(revision 1126)
@@ -0,0 +1,238 @@
+"""Testcases for cssutils.css.CSSRule"""
+
+import xml.dom
+import basetest
+import cssutils.css
+
+class CSSRuleTestCase(basetest.BaseTestCase):
+    """
+    base class for all CSSRule subclass tests
+
+    overwrite setUp with the appriopriate values, will be used in
+    test_init and test_readonly
+    overwrite all tests as you please, use::
+
+        super(CLASSNAME, self).test_TESTNAME(params)
+
+    to use the base class tests too
+    """
+    def setUp(self):
+        """
+        OVERWRITE!
+        self.r is the rule
+        self.rRO the readonly rule
+        relf.r_type the type as defined in CSSRule
+        """
+        super(CSSRuleTestCase, self).setUp()
+        
+        self.sheet = cssutils.css.CSSStyleSheet()
+        self.r = cssutils.css.CSSRule()
+        self.rRO = cssutils.css.CSSRule()
+        self.rRO._readonly = True # must be set here!
+        self.r_type = cssutils.css.CSSRule.UNKNOWN_RULE
+        self.r_typeString = 'UNKNOWN_RULE'
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+        
+    def test_init(self):
+        "CSSRule.type and init"
+        self.assertEqual(self.r_type, self.r.type)
+        self.assertEqual(self.r_typeString, self.r.typeString)
+        self.assertEqual(u'', self.r.cssText)
+        self.assertEqual(None, self.r.parentRule)
+        self.assertEqual(None, self.r.parentStyleSheet)
+
+    def test_parentRule_parentStyleSheet_type(self):
+        "CSSRule.parentRule .parentStyleSheet .type"
+        rules = [
+             ('@charset "ascii";', cssutils.css.CSSRule.CHARSET_RULE),
+             ('@import "x";', cssutils.css.CSSRule.IMPORT_RULE),
+             ('@namespace "x";', cssutils.css.CSSRule.NAMESPACE_RULE),
+             ('@font-face { src: url(x) }', cssutils.css.CSSRule.FONT_FACE_RULE),
+             ('''@media all {
+                    @x;
+                    a { color: red }
+                    /* c  */
+                }''', cssutils.css.CSSRule.MEDIA_RULE),
+             ('@page :left { color: red }', cssutils.css.CSSRule.PAGE_RULE),
+             ('@unknown;', cssutils.css.CSSRule.UNKNOWN_RULE),
+             ('b { left: 0 }', cssutils.css.CSSRule.STYLE_RULE),        
+             ('/*1*/', cssutils.css.CSSRule.COMMENT) # must be last for add test
+        ]
+        mrt = [cssutils.css.CSSRule.UNKNOWN_RULE,  
+               cssutils.css.CSSRule.STYLE_RULE,
+               cssutils.css.CSSRule.COMMENT]
+        def test(s):
+            for i, rule in enumerate(s):                    
+                self.assertEqual(rule.parentRule, None)
+                self.assertEqual(rule.parentStyleSheet, s)
+                #self.assertEqual(rule.type, rules[i][1])
+                if rule.MEDIA_RULE == rule.type:
+                    for j, r in enumerate(rule):
+                        self.assertEqual(r.parentRule, rule)
+                        self.assertEqual(r.parentStyleSheet, s)
+                        self.assertEqual(r.type, mrt[j])
+
+                if i == 0: # check encoding
+                    self.assertEqual('ascii', s.encoding)
+                elif i == 2: # check namespaces
+                    self.assertEqual('x', s.namespaces[''])
+
+        cssText = u''.join(r[0] for r in rules)
+        # parsing               
+        s = cssutils.parseString(cssText)
+        test(s)
+        # sheet.cssText
+        s = cssutils.css.CSSStyleSheet()
+        s.cssText = cssText
+        test(s)
+        # sheet.add CSS
+        s = cssutils.css.CSSStyleSheet()
+        for css, type_ in rules:
+            s.add(css)
+        test(s)
+        # sheet.insertRule CSS
+        s = cssutils.css.CSSStyleSheet()
+        for css, type_ in rules:
+            s.insertRule(css)
+        test(s)
+        
+        types = [cssutils.css.CSSCharsetRule, 
+                 cssutils.css.CSSImportRule,
+                 cssutils.css.CSSNamespaceRule, 
+                 cssutils.css.CSSFontFaceRule,
+                 cssutils.css.CSSMediaRule, 
+                 cssutils.css.CSSPageRule,
+                 cssutils.css.CSSUnknownRule,
+                 cssutils.css.CSSStyleRule, 
+                 cssutils.css.CSSComment]
+        # sheet.add CSSRule
+        s = cssutils.css.CSSStyleSheet()
+        for i, (css, type_) in enumerate(rules):
+            rule = types[i]()
+            rule.cssText = css
+            s.add(rule)
+        test(s)
+        # sheet.insertRule CSSRule
+        s = cssutils.css.CSSStyleSheet()
+        for i, (css, type_) in enumerate(rules):
+            rule = types[i]()
+            rule.cssText = css
+            s.insertRule(rule)
+        test(s)
+
+    def test_CSSMediaRule_cssRules_parentRule_parentStyleSheet_type(self):
+        "CSSMediaRule.cssRules.parentRule .parentStyleSheet .type"
+        rules = [
+             ('b { left: 0 }', cssutils.css.CSSRule.STYLE_RULE),        
+             ('/*1*/', cssutils.css.CSSRule.COMMENT),
+             ('@x;', cssutils.css.CSSRule.UNKNOWN_RULE)
+        ]
+        def test(s):
+            mr = s.cssRules[0]
+            for i, rule in enumerate(mr):                    
+                self.assertEqual(rule.parentRule, mr)
+                self.assertEqual(rule.parentStyleSheet, s)
+                self.assertEqual(rule.parentStyleSheet, mr.parentStyleSheet)
+                self.assertEqual(rule.type, rules[i][1])
+
+        cssText = '@media all { %s }' % u''.join(r[0] for r in rules)
+        # parsing               
+        s = cssutils.parseString(cssText)
+        test(s)
+        # sheet.cssText
+        s = cssutils.css.CSSStyleSheet()
+        s.cssText = cssText
+        test(s)
+
+        def getMediaSheet():
+            s = cssutils.css.CSSStyleSheet()
+            s.cssText = '@media all {}'
+            return s, s.cssRules[0]
+        # sheet.add CSS
+        s, mr = getMediaSheet()
+        for css, type_ in rules:
+            mr.add(css)
+        test(s)
+        # sheet.insertRule CSS
+        s, mr = getMediaSheet()
+        for css, type_ in rules:
+            mr.insertRule(css)
+        test(s)
+        
+        types = [cssutils.css.CSSStyleRule, 
+                 cssutils.css.CSSComment,
+                 cssutils.css.CSSUnknownRule]
+        # sheet.add CSSRule
+        s, mr = getMediaSheet()
+        for i, (css, type_) in enumerate(rules):
+            rule = types[i]()
+            rule.cssText = css
+            mr.add(rule)
+        test(s)
+        # sheet.insertRule CSSRule
+        s, mr = getMediaSheet()
+        for i, (css, type_) in enumerate(rules):
+            rule = types[i]()
+            rule.cssText = css
+            mr.insertRule(rule)
+        test(s)
+
+    def test_readonly(self):
+        "CSSRule readonly"
+        self.rRO = cssutils.css.CSSRule()
+        self.rRO._readonly = True
+        self.assertEqual(True, self.rRO._readonly)
+        self.assertEqual(u'', self.rRO.cssText)
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          self.rRO._setCssText, u'x')
+        self.assertEqual(u'', self.rRO.cssText)
+
+    def _test_InvalidModificationErr(self, startwithspace):
+        """
+        CSSRule.cssText InvalidModificationErr
+
+        called by subclasses
+
+        startwithspace
+
+        for test starting with this not the test but " test" is tested
+        e.g. " @page {}"
+        exception is the style rule test
+        """
+        tests = (u'',
+                 u'/* comment */',
+                 u'@charset "utf-8";',
+                 u'@font-face {}',
+                 u'@import url(x);',
+                 u'@media all {}',
+                 u'@namespace "x";'
+                 u'@page {}',
+                 u'@unknown;',
+                 u'@variables;',
+                 # TODO:
+                 #u'@top-left {}'
+                 u'a style rule {}'
+                 )
+        for test in tests:
+            if startwithspace in (u'a style rule', ) and test in (
+                u'/* comment */', u'a style rule {}'):
+                continue
+
+            if test.startswith(startwithspace):
+                test = u' %s' % test
+
+            self.assertRaises(xml.dom.InvalidModificationErr,
+                 self.r._setCssText, test)
+
+        # check that type is readonly
+        self.assertRaises(AttributeError, self.r.__setattr__, 'parentRule', None)
+        self.assertRaises(AttributeError, self.r.__setattr__, 'parentStyleSheet', None)
+        self.assertRaises(AttributeError, self.r.__setattr__, 'type', 1)
+        self.assertRaises(AttributeError, self.r.__setattr__, 'typeString', "")
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_property.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_property.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_property.py	(revision 1126)
@@ -0,0 +1,272 @@
+"""Testcases for cssutils.css.property._Property."""
+
+import xml.dom
+import basetest
+import cssutils
+
+class PropertyTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        self.r = cssutils.css.property.Property('top', '1px')#, 'important')
+
+    def test_init(self):
+        "Property.__init__()"
+        p = cssutils.css.property.Property('top', '1px')
+        self.assertEqual('top: 1px', p.cssText)
+        self.assertEqual('top', p.literalname)
+        self.assertEqual('top', p.name)
+        self.assertEqual('1px', p.value)
+        #self.assertEqual('1px', p.cssValue.cssText)
+        self.assertEqual('1px', p.propertyValue.cssText)
+        self.assertEqual(u'', p.priority)
+        self.assertEqual(True, p.valid)
+        self.assertEqual(True, p.wellformed)
+
+        self.assertEqual([u'top'], p.seqs[0])
+        self.assertEqual(type(cssutils.css.PropertyValue(cssText="2px")), type(p.seqs[1]))
+        self.assertEqual([], p.seqs[2])
+
+        self.assertEqual(True, p.valid)
+
+        # Prop of MediaQuery
+        p = cssutils.css.property.Property('top', _mediaQuery=True)
+        self.assertEqual('top', p.cssText)
+        self.assertEqual('top', p.literalname)
+        self.assertEqual('top', p.name)
+        self.assertEqual('', p.value)
+        #self.assertEqual('', p.cssValue.cssText)
+        self.assertEqual('', p.propertyValue.cssText)
+        self.assertEqual(u'', p.priority)
+        self.assertEqual(False, p.valid)
+        #p.cssValue.cssText = '1px'
+        p.propertyValue.cssText = '1px'
+        self.assertEqual('top: 1px', p.cssText)
+        #p.cssValue = ''
+        p.propertyValue = ''
+        self.assertEqual('top', p.cssText)
+
+        self.assertRaises(xml.dom.SyntaxErr, cssutils.css.property.Property, 'top', '')
+        self.assertRaises(xml.dom.SyntaxErr, cssutils.css.property.Property, 'top')
+        p = cssutils.css.property.Property('top', '0')
+        self.assertEqual('0', p.value)
+        self.assertEqual(True, p.wellformed)
+        self.assertRaises(xml.dom.SyntaxErr, p._setValue, '')
+        self.assertEqual('0', p.value)
+        self.assertEqual(True, p.wellformed)
+
+#        self.assertEqual(True, p.valid)
+
+#    def test_valid(self):
+#        "Property.valid"
+#        # context property must be set
+#        tests = [
+#            ('color', r'INHe\rIT', True),
+#            ('color', '1', False),
+#            ('color', 'red', True),
+#            ('left', '1', False),
+#            ('left', '1px', True),
+#            ('font', 'normal 1em/1.5 serif', True),
+#            ('background', 'url(x.gif) 1 0', False)
+#            ]
+#        for n, v, exp in tests:
+#            v = cssutils.css.CSSValue(cssText=v)
+#            self.assertTrue(v.wellformed, True)
+
+    def test_cssText(self):
+        "Property.cssText"
+        p = cssutils.css.property.Property()
+
+        tests = {
+            u'a: 1': None,
+            u'a: 1px 2px': None,
+            u'a: 1 !important': None,
+            u'a: 1 !IMPORTANT': u'a: 1 !important',
+            u'a: 1 !impor\\tant': u'a: 1 !important',
+            # TODO: important with unicode escapes!
+            u'font: normal 1em/1.5 serif': None,
+            u'font: normal 1em/serif': None
+            }
+        self.do_equal_r(tests)
+
+        tests = {
+            u'': (xml.dom.SyntaxErr,
+                   u'Property: No property name found: '),
+            u':': (xml.dom.SyntaxErr,
+                   u'Property: No property name found: : [1:1: :]'),
+            u'a': (xml.dom.SyntaxErr,
+                   u'Property: No ":" after name found: a [1:1: a]'),
+            u'b !': (xml.dom.SyntaxErr,
+                     u'Property: No ":" after name found: b ! [1:3: !]'),
+            u'/**/x': (xml.dom.SyntaxErr,
+                       u'Property: No ":" after name found: /**/x [1:5: x]'),
+            u'c:': (xml.dom.SyntaxErr,
+                   u"Property: No property value found: c: [1:2: :]"),
+            u'd: ': (xml.dom.SyntaxErr,
+                   u"No content to parse."),
+            u'e:!important': (xml.dom.SyntaxErr,
+                   u"No content to parse."),
+            u'f: 1!': (xml.dom.SyntaxErr,
+                       u'Property: Invalid priority: !'),
+            u'g: 1!importantX': (xml.dom.SyntaxErr,
+                   u"Property: No CSS priority value: importantx"),
+
+            # TODO?
+            #u'a: 1;': (xml.dom.SyntaxErr,
+            #       u'''CSSValue: No match: ('CHAR', u';', 1, 5)''')
+            }
+        for test in tests:
+            ecp, msg = tests[test]
+            self.assertRaisesMsg(ecp, msg, p._setCssText, test)
+
+    def test_name(self):
+        "Property.name"
+        p = cssutils.css.property.Property('top', '1px')
+        p.name = 'left'
+        self.assertEqual('left', p.name)
+
+        tests = {
+            u'top': None,
+            u' top': u'top',
+            u'top ': u'top',
+            u' top ': u'top',
+            u'/*x*/ top ': u'top',
+            u' top /*x*/': u'top',
+            u'/*x*/top/*x*/': u'top',
+            u'\\x': u'x',
+            u'a\\010': u'a\x10',
+            u'a\\01': u'a\x01'
+            }
+        self.do_equal_r(tests, att='name')
+
+        tests = {
+            u'': xml.dom.SyntaxErr,
+            u' ': xml.dom.SyntaxErr,
+            u'"\n': xml.dom.SyntaxErr,
+            u'/*x*/': xml.dom.SyntaxErr,
+            u':': xml.dom.SyntaxErr,
+            u';': xml.dom.SyntaxErr,
+            u'top:': xml.dom.SyntaxErr,
+            u'top;': xml.dom.SyntaxErr,
+            u'color: #xyz': xml.dom.SyntaxErr,
+            }
+        self.do_raise_r(tests, att='_setName')
+
+        p = cssutils.css.property.Property(r'c\olor', 'red')
+        self.assertEqual(r'c\olor', p.literalname)
+        self.assertEqual('color', p.name)
+
+    def test_literalname(self):
+        "Property.literalname"
+        p = cssutils.css.property.Property(r'c\olor', 'red')
+        self.assertEqual(r'c\olor', p.literalname)
+        self.assertRaisesMsg(AttributeError, "can't set attribute", p.__setattr__,
+                             'literalname', 'color')
+
+    def test_validate(self):
+        "Property.valid"
+        p = cssutils.css.property.Property('left', '1px', '')
+
+        self.assertEqual(p.valid, True)
+
+        p.name = 'color'
+        self.assertEqual(p.valid, False)
+
+        p.name = 'top'
+        self.assertEqual(p.valid, True)
+
+        p.value = 'red'
+        self.assertEqual(p.valid, False)
+
+    #def test_cssValue(self):
+    #    "Property.cssValue"
+    #    pass
+    #    # DEPRECATED
+
+    def test_priority(self):
+        "Property.priority"
+        p = cssutils.css.property.Property('top', '1px', 'important')
+
+        for prio in (None, u''):
+            p.priority = prio
+            self.assertEqual(u'', p.priority)
+            self.assertEqual(u'', p.literalpriority)
+
+        for prio in (u'!important',
+                     u'! important',
+                     u'!/* x */ important',
+                     u'!/* x */ important /**/',
+                     u'important',
+                     u'IMPORTANT',
+                     ur'im\portant'
+                     ):
+            p.priority = prio
+            self.assertEqual(u'important', p.priority)
+            if prio.startswith('!'):
+                prio = prio[1:].strip()
+            if u'/*' in prio:
+                check = 'important'
+            else:
+                check = prio
+            self.assertEqual(check, p.literalpriority)
+
+        tests = {
+            u' ': xml.dom.SyntaxErr,
+            u'"\n': xml.dom.SyntaxErr,
+            #u'important': xml.dom.SyntaxErr,
+            u';': xml.dom.SyntaxErr,
+            u'!important !important': xml.dom.SyntaxErr
+            }
+        self.do_raise_r(tests, att='_setPriority')
+
+    def test_value(self):
+        "Property.value"
+        p = cssutils.css.property.Property('top', u'1px')
+        self.assertEqual('1px', p.value)
+        p.value = '2px'
+        self.assertEqual('2px', p.value)
+
+        tests = {
+            u'1px': None,
+            u' 2px': u'2px',
+            u'3px ': u'3px',
+            u' 4px ': u'4px',
+            u'5px 1px': u'5px 1px',
+            }
+        self.do_equal_r(tests, att='value')
+
+        tests = {
+            # no value
+            None: xml.dom.SyntaxErr,
+            u'': xml.dom.SyntaxErr,
+            u' ': xml.dom.SyntaxErr,
+            u'"\n': xml.dom.SyntaxErr,
+            u'/*x*/': xml.dom.SyntaxErr,
+            # not allowed:
+            u':': xml.dom.SyntaxErr,
+            u';': xml.dom.SyntaxErr,
+            u'!important': xml.dom.SyntaxErr,
+            }
+        self.do_raise_r(tests, att='_setValue')
+
+    def test_reprANDstr(self):
+        "Property.__repr__(), .__str__()"
+        name="color"
+        value="red"
+        priority="important"
+
+        s = cssutils.css.property.Property(name=name, value=value, priority=priority)
+
+        self.assertTrue(name in str(s))
+        self.assertTrue(value in str(s))
+        self.assertTrue(priority in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(name == s2.name)
+        self.assertTrue(value == s2.value)
+        self.assertTrue(priority == s2.priority)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvalue.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvalue.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssvalue.py	(revision 1126)
@@ -0,0 +1,819 @@
+"""Testcases for cssutils.css.CSSValue and CSSPrimitiveValue."""
+
+#
+## from decimal import Decimal # maybe for later tests?
+#import xml.dom
+#import basetest
+#import cssutils
+#import types
+#
+#class CSSValueTestCase(basetest.BaseTestCase):
+#
+#    def setUp(self):
+#        self.r = cssutils.css.CSSValue() # needed for tests
+#
+#    def test_init(self):
+#        "CSSValue.__init__()"
+#        v = cssutils.css.CSSValue()
+#        self.assertTrue(u'' == v.cssText)
+#        self.assertTrue(None is  v.cssValueType)
+#        self.assertTrue(None == v.cssValueTypeString)
+#
+#    def test_escapes(self):
+#        "CSSValue Escapes"
+#        v = cssutils.css.CSSValue()
+#        v.cssText = u'1px'
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue(v.CSS_PX == v.primitiveType)
+#        self.assertTrue(u'1px' == v.cssText)
+#
+#        v.cssText = u'1PX'
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue(v.CSS_PX == v.primitiveType)
+#        self.assertTrue(u'1px' == v.cssText)
+#        
+#        v.cssText = u'1p\\x'
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue(v.CSS_PX == v.primitiveType)
+#        self.assertTrue(u'1px' == v.cssText)
+#
+#    def test_cssText(self):
+#        "CSSValue.cssText"
+#        v = cssutils.css.CSSValue()
+#        v.cssText = u'1px'
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue(v.CSS_PX == v.primitiveType)
+#        self.assertTrue(u'1px' == v.cssText)
+#
+#        v = cssutils.css.CSSValue()
+#        v.cssText = u'1px'
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue(v.CSS_PX == v.primitiveType)
+#        self.assertTrue(u'1px' == v.cssText)
+#
+#        v = cssutils.css.CSSValue()
+#        v.cssText = u'a  ,b,  c  ,"d or d", "e, " '
+#        self.assertEqual(v.CSS_PRIMITIVE_VALUE, v.cssValueType)
+#        self.assertEqual(v.CSS_STRING, v.primitiveType)
+#        self.assertEqual(u'a, b, c, "d or d", "e, "', v.cssText)
+#
+#        v.cssText = u'  1   px    '
+#        self.assertTrue(v.CSS_VALUE_LIST == v.cssValueType)
+#        self.assertTrue('1 px' == v.cssText)
+#
+#        v.cssText = u'  normal 1px a, b, "c" end   '
+#        self.assertTrue(v.CSS_VALUE_LIST == v.cssValueType)
+#        self.assertEqual('normal 1px a, b, "c" end', v.cssText)
+#
+#        for i, x in enumerate(v):
+#            self.assertEqual(x.CSS_PRIMITIVE_VALUE, x.cssValueType)
+#            if x == 0:
+#                self.assertEqual(x.CSS_IDENT, x.primitiveType)
+#                self.assertEqual(u'normal', x.cssText)
+#            elif x == 1:
+#                self.assertEqual(x.CSS_PX, x.primitiveType)
+#                self.assertEqual(u'1px', x.cssText)
+#            if x == 2:
+#                self.assertEqual(x.CSS_STRING, x.primitiveType)
+#                self.assertEqual(u'a, b, "c"', x.cssText)
+#            if x == 3:
+#                self.assertEqual(x.CSS_IDENT, x.primitiveType)
+#                self.assertEqual(u'end', x.cssText)
+#
+#
+#        v = cssutils.css.CSSValue()
+#        v.cssText = u'  1   px    '
+#        self.assertTrue(v.CSS_VALUE_LIST == v.cssValueType)
+#        self.assertTrue(u'1 px' == v.cssText)
+#
+#        v.cssText = u'expression(document.body.clientWidth > 972 ? "1014px": "100%" )'
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue(v.CSS_UNKNOWN == v.primitiveType)
+#        self.assertEqual(u'expression(document.body.clientWidth > 972?"1014px": "100%")',
+#                         v.cssText)
+#
+#    def test_cssText2(self):
+#        "CSSValue.cssText 2"
+#        tests = {
+#            # mix
+#            u'a()1,-1,+1,1%,-1%,1px,-1px,"a",a,url(a),#aabb44':
+#                u'a() 1, -1, 1, 1%, -1%, 1px, -1px, "a", a, url(a), #ab4',
+#            
+#            # S or COMMENT
+#            u'red': u'red',
+#            u'red ': u'red',
+#            u' red ': u'red',
+#            u'/**/red': u'/**/ red',
+#            u'red/**/': u'red /**/',
+#            u'/**/red/**/': u'/**/ red /**/',
+#            u'/**/ red': u'/**/ red',
+#            u'red /**/': u'red /**/',
+#            u'/**/ red /**/': u'/**/ red /**/',
+#            u'red-': u'red-',
+#            
+#            # num / dimension 
+#            u'.0': u'0',
+#            u'0': u'0',
+#            u'0.0': u'0',
+#            u'00': u'0',
+#            u'0%': u'0%',
+#            u'0px': u'0',
+#            u'-.0': u'0',
+#            u'-0': u'0',
+#            u'-0.0': u'0',
+#            u'-00': u'0',
+#            u'-0%': u'0%',
+#            u'-0px': u'0',
+#            u'+.0': u'0',
+#            u'+0': u'0',
+#            u'+0.0': u'0',
+#            u'+00': u'0',
+#            u'+0%': u'0%',
+#            u'+0px': u'0',
+#            u'1': u'1',
+#            u'1.0': u'1',
+#            u'1px': u'1px',
+#            u'1%': u'1%',
+#            u'1px1': u'1px1',
+#            u'+1': u'1',
+#            u'-1': u'-1',
+#            u'+1.0': u'1',
+#            u'-1.0': u'-1',
+#            
+#            # string, escaped nl is removed during tokenizing
+#            u'"x"': u'"x"',
+#            u"'x'": u'"x"',
+#            #ur''' "1\'2" ''': u'''"1'2"''', #???
+#            #ur"'x\"'": ur'"x\""', #???
+#            ur'''"x\
+#y"''': u'''"xy"''', 
+#
+#            # hash and rgb/a
+#            u'#112234': u'#112234',
+#            u'#112233': u'#123',
+#            u'rgb(1,2,3)': u'rgb(1, 2, 3)',
+#            u'rgb(  1  ,  2  ,  3  )': u'rgb(1, 2, 3)',
+#            u'rgb(-1,+2,0)': u'rgb(-1, 2, 0)',
+#            u'rgba(1,2,3,4)': u'rgba(1, 2, 3, 4)',
+#            u'rgba(  1  ,  2  ,  3  ,  4 )': u'rgba(1, 2, 3, 4)',
+#            u'rgba(-1,+2,0, 0)': u'rgba(-1, 2, 0, 0)',
+#            
+#            # FUNCTION 
+#            u'f(1,2)': u'f(1, 2)',
+#            u'f(  1  ,  2  )': u'f(1, 2)',
+#            u'f(-1,+2)': u'f(-1, 2)',
+#            u'f(  -1  ,  +2  )': u'f(-1, 2)',
+#            u'fun(  -1  ,  +2  )': u'fun(-1, 2)',
+#            u'local( x )': u'local(x)',
+#            u'test(1px, #111, y, 1, 1%, "1", y(), var(x))': 
+#                u'test(1px, #111, y, 1, 1%, "1", y(), var(x))',
+#            u'test(-1px, #111, y, -1, -1%, "1", -y())': 
+#                u'test(-1px, #111, y, -1, -1%, "1", -y())',
+#            u'url(y)  format( "x" ,  "y" )': u'url(y) format("x", "y")',
+#            u'f(1 2,3 4)': u'f(1 2, 3 4)',
+#
+#            # IE expression
+#            ur'Expression()': u'Expression()',
+#            ur'expression(-1 < +2)': u'expression(-1< + 2)',
+#            ur'expression(document.width == "1")': u'expression(document.width=="1")',
+#            u'alpha(opacity=80)': u'alpha(opacity=80)',
+#            u'alpha( opacity = 80 , x=2  )': u'alpha(opacity=80, x=2)',
+#
+#            # unicode-range
+#            'u+f': 'u+f',
+#            'U+ABCdef': 'u+abcdef',
+#
+#            # url
+#            'url(a)': 'url(a)',
+#            'uRl(a)': 'url(a)',
+#            'u\\rl(a)': 'url(a)',
+#            'url("a")': 'url(a)',
+#            'url(  "a"  )': 'url(a)',
+#            'url(a)': 'url(a)',
+#            'url(";")': 'url(";")',
+#            'url(",")': 'url(",")',
+#            'url(")")': 'url(")")',
+#            '''url("'")''': '''url("'")''',
+#            '''url('"')''': '''url("\\"")''',
+#            '''url("'")''': '''url("'")''',
+#            
+#            # operator
+#            '1': '1',
+#            '1 2': '1 2',
+#            '1   2': '1 2',
+#            '1,2': '1, 2',
+#            '1,  2': '1, 2',
+#            '1  ,2': '1, 2',
+#            '1  ,  2': '1, 2',
+#            '1/2': '1/2',
+#            '1/  2': '1/2',
+#            '1  /2': '1/2',
+#            '1  /  2': '1/2',
+#             # comment
+#            '1/**/2': '1 /**/ 2',
+#            '1 /**/2': '1 /**/ 2',
+#            '1/**/ 2': '1 /**/ 2',
+#            '1 /**/ 2': '1 /**/ 2',
+#            '1  /*a*/  /*b*/  2': '1 /*a*/ /*b*/ 2',
+#            # , before
+#            '1,/**/2': '1, /**/ 2',
+#            '1 ,/**/2': '1, /**/ 2',
+#            '1, /**/2': '1, /**/ 2',
+#            '1 , /**/2': '1, /**/ 2',
+#            # , after
+#            '1/**/,2': '1 /**/, 2',
+#            '1/**/ ,2': '1 /**/, 2',
+#            '1/**/, 2': '1 /**/, 2',
+#            '1/**/ , 2': '1 /**/, 2',
+#            # all
+#            '1/*a*/  ,/*b*/  2': '1 /*a*/, /*b*/ 2',
+#            '1  /*a*/,  /*b*/2': '1 /*a*/, /*b*/ 2',
+#            '1  /*a*/  ,  /*b*/  2': '1 /*a*/, /*b*/ 2',
+#            
+#            # list
+#            'a b1,b2 b2,b3,b4': 'a b1, b2 b2, b3, b4',
+#            'a b1  ,   b2   b2  ,  b3  ,   b4': 'a b1, b2 b2, b3, b4',
+#            'u+1  ,   u+2-5': 'u+1, u+2-5',
+#            u'local( x ),  url(y)  format( "x" ,  "y" )': 
+#                u'local(x), url(y) format("x", "y")',
+#            # FUNCTION
+#            u'attr( href )': u'attr(href)',
+#            # PrinceXML extende FUNC syntax with nested FUNC
+#            u'target-counter(attr(href),page)': u'target-counter(attr(href), page)'
+#            }
+#
+#        self.do_equal_r(tests)
+#
+#        tests = {
+#            u'a+': xml.dom.SyntaxErr,
+#            u'-': xml.dom.SyntaxErr,
+#            u'+': xml.dom.SyntaxErr,
+#            u'-%': xml.dom.SyntaxErr,
+#            u'+a': xml.dom.SyntaxErr,
+#            u'--1px': xml.dom.SyntaxErr,
+#            u'++1px': xml.dom.SyntaxErr,
+#            u'#': xml.dom.SyntaxErr,
+#            u'#00': xml.dom.SyntaxErr,
+#            u'#0000': xml.dom.SyntaxErr,
+#            u'#00000': xml.dom.SyntaxErr,
+#            u'#0000000': xml.dom.SyntaxErr,
+#            u'-#0': xml.dom.SyntaxErr,
+#            # operator
+#            u',': xml.dom.SyntaxErr,
+#            u'1,,2': xml.dom.SyntaxErr,
+#            u'1,/**/,2': xml.dom.SyntaxErr,
+#            u'1  ,  /**/  ,  2': xml.dom.SyntaxErr,
+#            u'1,': xml.dom.SyntaxErr,
+#            u'1, ': xml.dom.SyntaxErr,
+#            u'1 ,': xml.dom.SyntaxErr,
+#            u'1 , ': xml.dom.SyntaxErr,
+#            u'1  ,  ': xml.dom.SyntaxErr,
+#            u'1//2': xml.dom.SyntaxErr,
+#            # URL
+#            u'url(x))': xml.dom.SyntaxErr,
+#            # string
+#            u'"': xml.dom.SyntaxErr,
+#            u"'": xml.dom.SyntaxErr,
+#            # function 
+#            u'f(-)': xml.dom.SyntaxErr,
+#            u'f(x))': xml.dom.SyntaxErr
+#            }
+#        self.do_raise_r(tests)
+#
+#    def test_incomplete(self):
+#        "CSSValue (incomplete)"
+#        tests = {
+#            u'url("a': u'url(a)',
+#            u'url(a': u'url(a)'
+#        }
+#        for v, exp in tests.items():
+#            s = cssutils.parseString('a { background: %s' % v)
+#            v = s.cssRules[0].style.background
+#            self.assertEqual(v, exp)
+#
+#    def test_cssValueType(self):
+#        "CSSValue.cssValueType .cssValueTypeString"
+#        tests = [
+#            ([u'inherit', u'INhe\\rit'], 'CSS_INHERIT', cssutils.css.CSSValue),
+#            (['1', '1%', '1em', '1ex', '1px', '1cm', '1mm', '1in', '1pt', '1pc',
+#              '1deg', '1rad', '1grad', '1ms', '1s', '1hz', '1khz', '1other',
+#               '"string"', "'string'", 'url(x)', 'red',
+#               'attr(a)', 'counter(x)', 'rect(1px, 2px, 3px, 4px)',
+#               'rgb(0, 0, 0)', '#000', '#123456', 'rgba(0, 0, 0, 0)',
+#               'hsl(0, 0, 0)', 'hsla(0, 0, 0, 0)',
+#               ],
+#             'CSS_PRIMITIVE_VALUE', cssutils.css.CSSPrimitiveValue),
+#            ([u'1px 1px', 'red blue green x'], 'CSS_VALUE_LIST', cssutils.css.CSSValueList),
+#            # what is a custom value?
+#            #([], 'CSS_CUSTOM', cssutils.css.CSSValue) 
+#            ]
+#        for values, name, cls in tests:
+#            for value in values:
+#                v = cssutils.css.CSSValue(cssText=value)
+#                if value == "'string'":
+#                    # will be changed to " always
+#                    value = '"string"'
+#                self.assertEqual(value, v.cssText)
+#                self.assertEqual(name, v.cssValueTypeString)
+#                self.assertEqual(getattr(v, name), v.cssValueType)
+#                self.assertEqual(cls, type(v))
+#
+#    def test_readonly(self):
+#        "(CSSValue._readonly)"
+#        v = cssutils.css.CSSValue(cssText='inherit')
+#        self.assertTrue(False is v._readonly)
+#
+#        v = cssutils.css.CSSValue(cssText='inherit', readonly=True)
+#        self.assertTrue(True is v._readonly)
+#        self.assertTrue(u'inherit', v.cssText)
+#        self.assertRaises(xml.dom.NoModificationAllowedErr, v._setCssText, u'x')
+#        self.assertTrue(u'inherit', v.cssText)
+#
+#    def test_reprANDstr(self):
+#        "CSSValue.__repr__(), .__str__()"
+#        cssText='inherit'
+#
+#        s = cssutils.css.CSSValue(cssText=cssText)
+#
+#        self.assertTrue(cssText in str(s))
+#
+#        s2 = eval(repr(s))
+#        self.assertTrue(isinstance(s2, s.__class__))
+#        self.assertTrue(cssText == s2.cssText)
+#
+#
+#class CSSPrimitiveValueTestCase(basetest.BaseTestCase):
+#
+#    def test_init(self):
+#        "CSSPrimitiveValue.__init__()"
+#        v = cssutils.css.CSSPrimitiveValue(u'1')
+#        self.assertTrue(u'1' == v.cssText)
+#
+#        self.assertTrue(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
+#        self.assertTrue("CSS_PRIMITIVE_VALUE" == v.cssValueTypeString)
+#
+#        self.assertTrue(v.CSS_NUMBER == v.primitiveType)
+#        self.assertTrue("CSS_NUMBER" == v.primitiveTypeString)
+#
+#        # DUMMY to be able to test empty constructor call
+#        #self.assertRaises(xml.dom.SyntaxErr, v.__init__, None)
+#
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getCounterValue)
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getRGBColorValue)
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getRectValue)
+#        self.assertRaises(xml.dom.InvalidAccessErr, v.getStringValue)
+#
+#    def test_CSS_UNKNOWN(self):
+#        "CSSPrimitiveValue.CSS_UNKNOWN"
+#        v = cssutils.css.CSSPrimitiveValue(u'expression(false)')
+#        self.assertTrue(v.CSS_UNKNOWN == v.primitiveType)
+#        self.assertTrue('CSS_UNKNOWN' == v.primitiveTypeString)
+#
+#    def test_CSS_NUMBER_AND_OTHER_DIMENSIONS(self):
+#        "CSSPrimitiveValue.CSS_NUMBER .. CSS_DIMENSION"
+#        defs = [
+#            ('', 'CSS_NUMBER'),
+#            ('%', 'CSS_PERCENTAGE'),
+#            ('em', 'CSS_EMS'),
+#            ('ex', 'CSS_EXS'),
+#            ('px', 'CSS_PX'),
+#            ('cm', 'CSS_CM'),
+#            ('mm', 'CSS_MM'),
+#            ('in', 'CSS_IN'),
+#            ('pt', 'CSS_PT'),
+#            ('pc', 'CSS_PC'),
+#            ('deg', 'CSS_DEG'),
+#            ('rad', 'CSS_RAD'),
+#            ('grad', 'CSS_GRAD'),
+#            ('ms', 'CSS_MS'),
+#            ('s', 'CSS_S'),
+#            ('hz', 'CSS_HZ'),
+#            ('khz', 'CSS_KHZ'),
+#            ('other_dimension', 'CSS_DIMENSION')
+#            ]
+#        for dim, name in defs:
+#            for n in (0, 1, 1.1, -1, -1.1, -0):
+#                v = cssutils.css.CSSPrimitiveValue('%i%s' % (n, dim))
+#                self.assertEqual(name, v.primitiveTypeString)
+#                self.assertEqual(getattr(v, name), v.primitiveType)
+#
+#    def test_CSS_STRING_AND_OTHER(self):
+#        "CSSPrimitiveValue.CSS_STRING .. CSS_RGBCOLOR"
+#        defs = [
+#                (('""', "''", '"some thing"', "' A\\ND '",
+#                  # comma separated lists are STRINGS FOR NOW!
+#                  'a, b',
+#                  '"a", "b"',
+#                  ), 'CSS_STRING'),
+#                (('url(a)', 'url("a b")', "url(' ')"), 'CSS_URI'),
+#                (('some', 'or_anth-er'), 'CSS_IDENT'),            
+#                (('attr(a)', 'attr(b)'), 'CSS_ATTR'),
+#                (('counter(1)', 'counter(2)'), 'CSS_COUNTER'),
+#                (('rect(1,2,3,4)',), 'CSS_RECT'),
+#                (('rgb(1,2,3)', 'rgb(10%, 20%, 30%)', '#123', '#123456'),
+#                 'CSS_RGBCOLOR'),
+#                (('rgba(1,2,3,4)','rgba(10%, 20%, 30%, 40%)', ),
+#                 'CSS_RGBACOLOR'),
+#                (('U+0', 'u+ffffff', 'u+000000-f',
+#                  'u+0-f, U+ee-ff'), 'CSS_UNICODE_RANGE')
+#                ]
+#
+#        for examples, name in defs:
+#            for x in examples:
+#                v = cssutils.css.CSSPrimitiveValue(x)
+#                self.assertEqual(getattr(v, name), v.primitiveType)
+#                self.assertEqual(name, v.primitiveTypeString)
+#
+#    def test_getFloat(self):
+#        "CSSPrimitiveValue.getFloatValue()"
+#        # NOT TESTED are float values as it seems difficult to
+#        # compare these. Maybe use decimal.Decimal?
+#
+#        v = cssutils.css.CSSPrimitiveValue(u'1px')
+#        tests = {
+#            '0': (v.CSS_NUMBER, 0),
+#            '-1.1': (v.CSS_NUMBER, -1.1),
+#            '1%': (v.CSS_PERCENTAGE, 1),
+#            '-1%': (v.CSS_PERCENTAGE, -1),
+#            '1em': (v.CSS_EMS, 1),
+#            '-1.1em': (v.CSS_EMS, -1.1),
+#            '1ex': (v.CSS_EXS, 1),
+#            '1px': (v.CSS_PX, 1),
+#
+#            '1cm': (v.CSS_CM, 1),
+#            '1cm': (v.CSS_MM, 10),
+#            '254cm': (v.CSS_IN, 100),
+#            '1mm': (v.CSS_MM, 1),
+#            '10mm': (v.CSS_CM, 1),
+#            '254mm': (v.CSS_IN, 10),
+#            '1in': (v.CSS_IN, 1),
+#            '100in': (v.CSS_CM, 254), # ROUNDED!!!
+#            '10in': (v.CSS_MM, 254), # ROUNDED!!!
+#
+#            '1pt': (v.CSS_PT, 1),
+#            '1pc': (v.CSS_PC, 1),
+#
+#            '1deg': (v.CSS_DEG, 1),
+#            '1rad': (v.CSS_RAD, 1),
+#            '1grad': (v.CSS_GRAD, 1),
+#
+#            '1ms': (v.CSS_MS, 1),
+#            '1000ms': (v.CSS_S, 1),
+#            '1s': (v.CSS_S, 1),
+#            '1s': (v.CSS_MS, 1000),
+#
+#            '1hz': (v.CSS_HZ, 1),
+#            '1000hz': (v.CSS_KHZ, 1),
+#            '1khz': (v.CSS_KHZ, 1),
+#            '1khz': (v.CSS_HZ, 1000),
+#
+#            '1DIMENSION': (v.CSS_DIMENSION, 1),            
+#            }
+#        for cssText in tests:
+#            v.cssText = cssText
+#            unitType, exp = tests[cssText]
+#            val = v.getFloatValue(unitType)
+#            if unitType in (v.CSS_IN, v.CSS_CM):
+#                val = round(val)
+#            self.assertEqual(val , exp)
+#
+#    def test_setFloat(self):
+#        "CSSPrimitiveValue.setFloatValue()"
+#        V = cssutils.css.CSSPrimitiveValue
+#
+#        tests = {
+#            # unitType, value
+#            (V.CSS_NUMBER, 1): [
+#                # unitType, setvalue,
+#                #    getvalue or expected exception, msg or cssText
+#                (V.CSS_NUMBER, 0, 0, '0'),
+#                (V.CSS_NUMBER, 0.1, 0.1, '0.1'),
+#                (V.CSS_NUMBER, -0, 0, '0'),
+#                (V.CSS_NUMBER, 2, 2, '2'),
+#                (V.CSS_NUMBER, 2.0, 2, '2'),
+#                (V.CSS_NUMBER, 2.1, 2.1, '2.1'),
+#                (V.CSS_NUMBER, -2.1, -2.1, '-2.1'),
+#                # setting with string does work
+#                (V.CSS_NUMBER, '1', 1, '1'),
+#                (V.CSS_NUMBER, '1.1', 1.1, '1.1'),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_RAD, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_GRAD, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_S, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_MS, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_KHZ, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_HZ, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DIMENSION, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_MM, 2, xml.dom.InvalidAccessErr, None),
+#
+#                (V.CSS_NUMBER, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: floatValue 'x' is not a float"),
+#                (V.CSS_NUMBER, '1x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: floatValue '1x' is not a float"),
+#
+#                (V.CSS_STRING, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_STRING' is not a float type"),
+#                (V.CSS_URI, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_URI' is not a float type"),
+#                (V.CSS_ATTR, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_ATTR' is not a float type"),
+#                (V.CSS_IDENT, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_IDENT' is not a float type"),
+#                (V.CSS_RGBCOLOR, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_RGBCOLOR' is not a float type"),
+#                (V.CSS_RGBACOLOR, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_RGBACOLOR' is not a float type"),
+#                (V.CSS_RECT, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_RECT' is not a float type"),
+#                (V.CSS_COUNTER, 'x', xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: unitType 'CSS_COUNTER' is not a float type"),
+#                (V.CSS_EMS, 1, xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_NUMBER' to 'CSS_EMS'"),
+#                (V.CSS_EXS, 1, xml.dom.InvalidAccessErr,
+#                 "CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_NUMBER' to 'CSS_EXS'")
+#            ],
+#            (V.CSS_MM, '1mm'): [
+#                (V.CSS_MM, 2, 2, '2mm'),
+#                (V.CSS_MM, 0, 0, '0mm'),
+#                (V.CSS_MM, 0.1, 0.1, '0.1mm'),
+#                (V.CSS_MM, -0, -0, '0mm'),
+#                (V.CSS_MM, 3.0, 3, '3mm'),
+#                (V.CSS_MM, 3.1, 3.1, '3.1mm'),
+#                (V.CSS_MM, -3.1, -3.1, '-3.1mm'),
+#                (V.CSS_CM, 1, 10, '10mm'),
+#                (V.CSS_IN, 10, 254, '254mm'),
+#                (V.CSS_PT, 1, 1828.8, '1828.8mm'),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_NUMBER, 2, xml.dom.InvalidAccessErr, None)
+#            ],
+#            (V.CSS_PT, '1pt'): [
+#                (V.CSS_PT, 2, 2, '2pt'),
+#                (V.CSS_PC, 12, 1, '1pt'),
+#                (V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None)
+#            ],
+#            (V.CSS_KHZ, '1khz'): [
+#                (V.CSS_HZ, 2000, 2, '2khz'),
+#                (V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
+#                (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None)
+#            ]
+#        }
+#        for test in tests:
+#            initialType, initialValue = test
+#            pv = cssutils.css.CSSPrimitiveValue(initialValue)
+#            for setType, setValue, exp, cssText in tests[test]:
+#                if type(exp) == types.TypeType or\
+#                   type(exp) == types.ClassType: # 2.4 compatibility
+#                    if cssText:
+#                        self.assertRaisesMsg(
+#                            exp, cssText, pv.setFloatValue, setType, setValue)
+#                    else:
+#                        self.assertRaises(
+#                            exp, pv.setFloatValue, setType, setValue)
+#                else:
+#                    pv.setFloatValue(setType, setValue)
+#                    self.assertEqual(pv._value[0], cssText)
+#                    if cssText == '0mm':
+#                        cssText = '0'
+#                    self.assertEqual(pv.cssText, cssText)
+#                    self.assertEqual(pv.getFloatValue(initialType), exp)
+#
+#    def test_getString(self):
+#        "CSSPrimitiveValue.getStringValue()"
+#        v = cssutils.css.CSSPrimitiveValue(u'1px')
+#        self.assertTrue(v.primitiveType == v.CSS_PX)
+#        self.assertRaises(xml.dom.InvalidAccessErr,
+#                          v.getStringValue)
+#
+#        pv = cssutils.css.CSSPrimitiveValue
+#        tests = {
+#            pv.CSS_STRING: ("'red'", 'red'),
+#            pv.CSS_STRING: ('"red"', 'red'),
+#            pv.CSS_URI: ('url(http://example.com)', None),
+#            pv.CSS_URI: ("url('http://example.com')",
+#                         u"http://example.com"),
+#            pv.CSS_URI: ('url("http://example.com")',
+#                         u'http://example.com'),
+#            pv.CSS_URI: ('url("http://example.com?)")',
+#                         u'http://example.com?)'),
+#            pv.CSS_IDENT: ('red', None),
+#            pv.CSS_ATTR: ('attr(att-name)',
+#                         u'att-name'), # the name of the attrr
+#            }
+#        for t in tests:
+#            val, exp = tests[t]
+#            if not exp:
+#                exp = val
+#
+#            v = cssutils.css.CSSPrimitiveValue(val)
+#            self.assertEqual(v.primitiveType, t)
+#            self.assertEqual(v.getStringValue(), exp)
+#
+#    def test_setString(self):
+#        "CSSPrimitiveValue.setStringValue()"
+#        # CSS_STRING
+#        v = cssutils.css.CSSPrimitiveValue(u'"a"')
+#        self.assertTrue(v.CSS_STRING == v.primitiveType)
+#        v.setStringValue(v.CSS_STRING, 'b')
+#        self.assertTrue(('b', 'STRING') == v._value)
+#        self.assertEqual('b', v.getStringValue())
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_URI'",
+#            v.setStringValue, *(v.CSS_URI, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_IDENT'",
+#            v.setStringValue, *(v.CSS_IDENT, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_ATTR'",
+#            v.setStringValue, *(v.CSS_ATTR, 'x'))
+#
+#        # CSS_IDENT
+#        v = cssutils.css.CSSPrimitiveValue('new')
+#        v.setStringValue(v.CSS_IDENT, 'ident')
+#        self.assertTrue(v.CSS_IDENT == v.primitiveType)
+#        self.assertTrue(('ident', 'IDENT') == v._value)
+#        self.assertTrue('ident' == v.getStringValue())
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_URI'",
+#            v.setStringValue, *(v.CSS_URI, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_STRING'",
+#            v.setStringValue, *(v.CSS_STRING, '"x"'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_ATTR'",
+#            v.setStringValue, *(v.CSS_ATTR, 'x'))
+#
+#        # CSS_URI
+#        v = cssutils.css.CSSPrimitiveValue('url(old)')
+#        v.setStringValue(v.CSS_URI, '(')
+#        self.assertEqual((u'(', 'URI'), v._value)
+#        self.assertEqual(u'(', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, ')')
+#        self.assertEqual((u')', 'URI'), v._value)
+#        self.assertEqual(u')', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, '"') 
+#        self.assertEqual(ur'"', v.getStringValue())
+#        self.assertEqual((ur'"', 'URI'), v._value)
+#
+#        v.setStringValue(v.CSS_URI, "''") 
+#        self.assertEqual(ur"''", v.getStringValue())
+#        self.assertEqual((ur"''", 'URI'), v._value)
+#
+#        v.setStringValue(v.CSS_URI, ',') 
+#        self.assertEqual(ur',', v.getStringValue())
+#        self.assertEqual((ur',', 'URI'), v._value)
+#
+#        v.setStringValue(v.CSS_URI, ' ')
+#        self.assertEqual((u' ', 'URI'), v._value)
+#        self.assertEqual(u' ', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, 'a)')
+#        self.assertEqual((u'a)', 'URI'), v._value)
+#        self.assertEqual(u'a)', v.getStringValue())
+#
+#        v.setStringValue(v.CSS_URI, 'a')
+#        self.assertTrue(v.CSS_URI == v.primitiveType)
+#        self.assertEqual((u'a', 'URI'), v._value)
+#        self.assertEqual(u'a', v.getStringValue())
+#
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_IDENT'",
+#            v.setStringValue, *(v.CSS_IDENT, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_STRING'",
+#            v.setStringValue, *(v.CSS_STRING, '"x"'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_ATTR'",
+#            v.setStringValue, *(v.CSS_ATTR, 'x'))
+#
+#        # CSS_ATTR
+#        v = cssutils.css.CSSPrimitiveValue('attr(old)')
+#        v.setStringValue(v.CSS_ATTR, 'a')
+#        self.assertTrue(v.CSS_ATTR == v.primitiveType)
+#        self.assertTrue('a' == v.getStringValue())
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_IDENT'",
+#            v.setStringValue, *(v.CSS_IDENT, 'x'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_STRING'",
+#            v.setStringValue, *(v.CSS_STRING, '"x"'))
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_URI'",
+#            v.setStringValue, *(v.CSS_URI, 'x'))
+#
+#        # TypeError as 'x' is no valid type
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: stringType 'x' (UNKNOWN TYPE) is not a string type",
+#            v.setStringValue, *('x', 'brown'))
+#        # IndexError as 111 is no valid type
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: stringType 111 (UNKNOWN TYPE) is not a string type",
+#            v.setStringValue, *(111, 'brown'))
+#        # CSS_PX is no string type
+#        self.assertRaisesMsg(xml.dom.InvalidAccessErr,
+#            u"CSSPrimitiveValue: stringType CSS_PX is not a string type",
+#            v.setStringValue, *(v.CSS_PX, 'brown'))
+#
+#    def test_typeRGBColor(self):
+#        "RGBColor"
+#        v = cssutils.css.CSSPrimitiveValue('RGB(1, 5, 10)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        self.assertEqual(u'rgb(1, 5, 10)', v.cssText)
+#
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1, 5, 10)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        self.assertEqual(u'rgb(1, 5, 10)', v.cssText)
+#
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1%, 5%, 10%)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        self.assertEqual(u'rgb(1%, 5%, 10%)', v.cssText)
+#
+#        v = cssutils.css.CSSPrimitiveValue('  rgb(  1 ,5,  10  )')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1,5,10)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#        v = cssutils.css.CSSPrimitiveValue('rgb(1%, .5%, 10.1%)')
+#        self.assertEqual(v.CSS_RGBCOLOR, v.primitiveType)
+#
+#    def test_reprANDstr(self):
+#        "CSSPrimitiveValue.__repr__(), .__str__()"
+#        v='111'
+#
+#        s = cssutils.css.CSSPrimitiveValue(v)
+#
+#        self.assertTrue(v in str(s))
+#        self.assertTrue('CSS_NUMBER' in str(s))
+#
+#        s2 = eval(repr(s))
+#        self.assertTrue(isinstance(s2, s.__class__))
+#        self.assertTrue(v == s2.cssText)
+#
+#
+#class CSSValueListTestCase(basetest.BaseTestCase):
+#
+#    def test_init(self):
+#        "CSSValueList.__init__()"
+#        v = cssutils.css.CSSValue(cssText=u'red blue')
+#        self.assertTrue(v.CSS_VALUE_LIST == v.cssValueType)
+#        self.assertEqual('red blue', v.cssText)
+#
+#        self.assertTrue(2 == v.length)
+#
+#        item = v.item(0)
+#        item.setStringValue(item.CSS_IDENT, 'green')
+#        self.assertEqual('green blue', v.cssText)
+#
+#    def test_numbers(self):
+#        "CSSValueList.cssText"
+#        tests = {
+#            u'0 0px -0px +0px': (u'0 0 0 0', 4),
+#            u'1 2 3 4': (None, 4),
+#            u'-1 -2 -3 -4': (None, 4),
+#            u'-1 2': (None, 2),
+#            u'-1px red "x"': (None, 3),
+#            u'a, b c': (None, 2),
+#            u'1px1 2% 3': (u'1px1 2% 3', 3),
+#            u'f(+1pX, -2, 5%) 1': (u'f(1px, -2, 5%) 1', 2),
+#            u'0 f()0': (u'0 f() 0', 3),
+#            u'f()0': (u'f() 0', 2),
+#            u'f()1%': (u'f() 1%', 2),
+#            u'f()1px': (u'f() 1px', 2),
+#            u'f()"str"': (u'f() "str"', 2),
+#            u'f()ident': (u'f() ident', 2),
+#            u'f()#123': (u'f() #123', 2),
+#            u'f()url()': (u'f() url()', 2),
+#            u'f()f()': (u'f() f()', 2),
+#            u'url(x.gif)0 0': (u'url(x.gif) 0 0', 3),
+#            u'url(x.gif)no-repeat': (u'url(x.gif) no-repeat', 2)
+#            }
+#        for test in tests:
+#            exp, num = tests[test]
+#            if not exp:
+#                exp = test
+#            v = cssutils.css.CSSValue(cssText=test)
+#            self.assertTrue(v.CSS_VALUE_LIST == v.cssValueType)
+#            self.assertEqual(num, v.length)
+#            self.assertEqual(exp, v.cssText)
+#
+#    def test_reprANDstr(self):
+#        "CSSValueList.__repr__(), .__str__()"
+#        v='1px 2px'
+#
+#        s = cssutils.css.CSSValue(v)
+#        self.assertTrue(isinstance(s, cssutils.css.CSSValueList))
+#
+#        self.assertTrue('length=2' in str(s))
+#        self.assertTrue(v in str(s))
+#
+#        # not "eval()"able!
+#        #s2 = eval(repr(s))
+#
+#
+#if __name__ == '__main__':
+#    import unittest
+#    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_domimplementation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_domimplementation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_domimplementation.py	(revision 1126)
@@ -0,0 +1,42 @@
+"""Testcases for cssutils.css.DOMImplementation"""
+
+import xml.dom
+import unittest
+import cssutils
+
+class DOMImplementationTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.domimpl = xml.dom.getDOMImplementation()
+
+    def test_createCSSStyleSheet(self):
+        "DOMImplementationCSS.createCSSStyleSheet()"
+        title, media = 'Test Title', cssutils.stylesheets.MediaList('all')
+        sheet = self.domimpl.createCSSStyleSheet(title, media)
+        self.assertEqual(True, isinstance(sheet, cssutils.css.CSSStyleSheet))
+        self.assertEqual(title, sheet.title)
+        self.assertEqual(media, sheet.media)
+
+    def test_createDocument(self):
+        "DOMImplementationCSS.createDocument()"
+        self.assertRaises(NotImplementedError, self.domimpl.createDocument)
+        self.assertRaises(NotImplementedError, self.domimpl.createDocument)
+
+    def test_createDocumentType(self):
+        "DOMImplementationCSS.createDocumentType()"
+        self.assertRaises(NotImplementedError, self.domimpl.createDocumentType)
+
+    def test_hasFeature(self):
+        "DOMImplementationCSS.hasFeature()"
+        tests = [
+            ('css', '1.0'),
+            ('css', '2.0'),
+            ('stylesheets', '1.0'),
+            ('stylesheets', '2.0')
+        ]
+        for name, version in tests:
+            self.assertEqual(True, self.domimpl.hasFeature(name, version))
+
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_errorhandler.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_errorhandler.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_errorhandler.py	(revision 1126)
@@ -0,0 +1,150 @@
+"""Tests for parsing which does not raise Exceptions normally"""
+__version__ = '$Id: test_parse.py 1281 2008-06-04 21:12:29Z cthedot $'
+
+import logging
+import StringIO
+import sys
+import xml.dom
+import basetest
+import cssutils
+
+class ErrorHandlerTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        "replace default log and ignore its output"
+        self._oldlog = cssutils.log._log
+        self._saved = cssutils.log.raiseExceptions
+
+        cssutils.log.raiseExceptions = False
+        cssutils.log.setLog(logging.getLogger('IGNORED-CSSUTILS-TEST'))
+
+    def tearDown(self):
+        "reset default log"
+        cssutils.log.setLog(self._oldlog)
+        # for tests only
+        cssutils.log.setLevel(logging.FATAL)
+        cssutils.log.raiseExceptions = self._saved
+
+    def _setHandler(self):
+        "sets new handler and returns StringIO instance to getvalue"
+        s = StringIO.StringIO()
+        h = logging.StreamHandler(s)
+        h.setFormatter(logging.Formatter('%(levelname)s    %(message)s'))
+        # remove if present already
+        cssutils.log.removeHandler(h)
+        cssutils.log.addHandler(h)
+        return s
+
+    def test_calls(self):
+        "cssutils.log.*"
+        s = self._setHandler()
+        cssutils.log.setLevel(logging.DEBUG)
+        cssutils.log.debug('msg', neverraise=True)
+        self.assertEqual(s.getvalue(), u'DEBUG    msg\n')
+
+        s = self._setHandler()
+        cssutils.log.setLevel(logging.INFO)
+        cssutils.log.info('msg', neverraise=True)
+        self.assertEqual(s.getvalue(), u'INFO    msg\n')
+
+        s = self._setHandler()
+        cssutils.log.setLevel(logging.WARNING)
+        cssutils.log.warn('msg', neverraise=True)
+        self.assertEqual(s.getvalue(), u'WARNING    msg\n')
+
+        s = self._setHandler()
+        cssutils.log.setLevel(logging.ERROR)
+        cssutils.log.error('msg', neverraise=True)
+        self.assertEqual(s.getvalue(), u'ERROR    msg\n')
+
+        s = self._setHandler()
+        cssutils.log.setLevel(logging.FATAL)
+        cssutils.log.fatal('msg', neverraise=True)
+        self.assertEqual(s.getvalue(), u'CRITICAL    msg\n')
+
+        s = self._setHandler()
+        cssutils.log.setLevel(logging.CRITICAL)
+        cssutils.log.critical('msg', neverraise=True)
+        self.assertEqual(s.getvalue(), u'CRITICAL    msg\n')
+
+        s = self._setHandler()
+        cssutils.log.setLevel(logging.CRITICAL)
+        cssutils.log.error('msg', neverraise=True)
+        self.assertEqual(s.getvalue(), u'')
+
+    def test_linecol(self):
+        "cssutils.log line col"
+        o = cssutils.log.raiseExceptions
+        cssutils.log.raiseExceptions = True
+        
+        s = cssutils.css.CSSStyleSheet()
+        try:
+            s.cssText = '@import x;'
+        except xml.dom.DOMException, e:                
+            self.assertEqual(str(e), 'CSSImportRule: Unexpected ident. [1:9: x]')
+            self.assertEqual(e.line, 1)
+            self.assertEqual(e.col, 9)
+            if sys.platform.startswith('java'):
+                self.assertEqual(e.msg, u'CSSImportRule: Unexpected ident. [1:9: x]')
+            else:
+                self.assertEqual(e.args, (u'CSSImportRule: Unexpected ident. [1:9: x]',))
+        
+        cssutils.log.raiseExceptions = o
+
+    def test_handlers(self):
+        "cssutils.log"
+        s = self._setHandler()
+
+        cssutils.log.setLevel(logging.FATAL)
+        self.assertEqual(cssutils.log.getEffectiveLevel(), logging.FATAL)
+
+        cssutils.parseString('a { color: 1 }')
+        self.assertEqual(s.getvalue(), u'')
+
+        cssutils.log.setLevel(logging.DEBUG)
+        cssutils.parseString('a { color: 1 }')
+        # TODO: Fix?
+#        self.assertEqual(s.getvalue(),
+#                         u'ERROR    Property: Invalid value for "CSS Color Module Level 3/CSS Level 2.1" property: 1 [1:5: color]\n')
+        self.assertEqual(s.getvalue(),
+                         u'ERROR    Property: Invalid value for "CSS Level 2.1" property: 1 [1:5: color]\n')
+
+        s = self._setHandler()
+
+        cssutils.log.setLevel(logging.ERROR)
+        cssutils.parseUrl('http://example.com')
+        self.assertEqual(s.getvalue()[:38],
+                         u'ERROR    Expected "text/css" mime type')
+
+    def test_parsevalidation(self):
+        style = 'color: 1'
+        t = 'a { %s }' % style
+                
+        cssutils.log.setLevel(logging.DEBUG)
+        
+        # sheet
+        s = self._setHandler()
+        cssutils.parseString(t)
+        self.assertNotEqual(len(s.getvalue()), 0)
+        
+        s = self._setHandler()
+        cssutils.parseString(t, validate=False)
+        self.assertEqual(s.getvalue(), '')
+
+        # style
+        s = self._setHandler()
+        cssutils.parseStyle(style)
+        self.assertNotEqual(len(s.getvalue()), 0)
+
+        s = self._setHandler()
+        cssutils.parseStyle(style, validate=True)
+        self.assertNotEqual(len(s.getvalue()), 0)
+
+        s = self._setHandler()
+        cssutils.parseStyle(style, validate=False)
+        self.assertEqual(s.getvalue(), '')
+               
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_serialize.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_serialize.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_serialize.py	(revision 1126)
@@ -0,0 +1,740 @@
+# -*- coding: utf-8 -*-
+"""Testcases for cssutils.CSSSerializer"""
+
+import basetest
+import cssutils
+import sys
+
+
+class PreferencesTestCase(basetest.BaseTestCase):
+    """
+    testcases for cssutils.serialize.Preferences
+    """
+    def setUp(self):
+        cssutils.ser.prefs.useDefaults()
+    
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+    
+#    def testkeepUnkownAtRules(self):
+#        "Preferences.keepUnkownAtRules"
+#        # py >=2.6 only
+#        # v = sys.version_info; if v[0]*10+v[1] >= 26:
+#        from warnings import catch_warnings
+#        with catch_warnings(record=True) as log:
+#            x = cssutils.ser.prefs.keepUnkownAtRules
+#        
+#        if log:
+#            # unpack the only member of log
+#            warning, = log
+#            self.assertEqual(warning.category, DeprecationWarning)
+    
+    def test_resolveVariables(self):
+        "Preferences.resolveVariables"
+        self.assertEqual(cssutils.ser.prefs.resolveVariables, True)
+        
+        cssutils.ser.prefs.resolveVariables = False
+        
+        vars = u'''
+            @variables {
+                c1: red;
+                c2: #0f0;
+                px: 1px 2px;
+            }
+        '''
+        tests = {
+            u'''a {\n    color: var(c1)\n    }''':
+            u'''a {\n    color: red\n    }''',
+            u'''a {\n    color: var(c1)\n; color: var(  c2   )    }''':
+            u'''a {\n    color: red;\n    color: #0f0\n    }''',
+            u'''a {\n    margin: var(px)\n    }''':
+            u'''a {\n    margin: 1px 2px\n    }''',
+            u'''@media all {
+                a {
+                    margin: var(px) var(px);
+                    color: var(c1);
+                    left: var(unknown)
+                    }
+            }''': 
+            u'''@media all {\n    a {\n        margin: 1px 2px 1px 2px;\n        color: red;\n        left: var(unknown)\n        }\n    }''',
+        }
+        cssutils.ser.prefs.resolveVariables = True
+        
+        for test, exp in tests.items():
+            s = cssutils.parseString(vars + test)
+            self.assertEqual(exp.encode(), s.cssText)
+            
+        cssutils.ser.prefs.resolveVariables = True
+
+            
+    def test_useDefaults(self):
+        "Preferences.useDefaults()"
+        cssutils.ser.prefs.useMinified()
+        cssutils.ser.prefs.useDefaults()
+        self.assertEqual(cssutils.ser.prefs.defaultAtKeyword, True)
+        self.assertEqual(cssutils.ser.prefs.defaultPropertyName, True)
+        self.assertEqual(cssutils.ser.prefs.defaultPropertyPriority, True)
+        self.assertEqual(cssutils.ser.prefs.importHrefFormat, None)
+        self.assertEqual(cssutils.ser.prefs.indent, 4 * u' ')
+        self.assertEqual(cssutils.ser.prefs.indentClosingBrace, True)
+        self.assertEqual(cssutils.ser.prefs.keepAllProperties, True)
+        self.assertEqual(cssutils.ser.prefs.keepComments, True)
+        self.assertEqual(cssutils.ser.prefs.keepEmptyRules, False)
+        self.assertEqual(cssutils.ser.prefs.keepUnknownAtRules, True)
+        self.assertEqual(cssutils.ser.prefs.keepUsedNamespaceRulesOnly, False)
+        self.assertEqual(cssutils.ser.prefs.lineNumbers, False)
+        self.assertEqual(cssutils.ser.prefs.lineSeparator, u'\n')
+        self.assertEqual(cssutils.ser.prefs.listItemSpacer, u' ')
+        self.assertEqual(cssutils.ser.prefs.omitLastSemicolon, True)
+        self.assertEqual(cssutils.ser.prefs.omitLeadingZero, False)
+        self.assertEqual(cssutils.ser.prefs.paranthesisSpacer, u' ')
+        self.assertEqual(cssutils.ser.prefs.propertyNameSpacer, u' ')
+        self.assertEqual(cssutils.ser.prefs.selectorCombinatorSpacer, u' ')
+        self.assertEqual(cssutils.ser.prefs.spacer, u' ')
+        self.assertEqual(cssutils.ser.prefs.validOnly, False)
+        css = u'''
+    /*1*/
+    @import url(x) tv , print;
+    @namespace prefix "uri";
+    @namespace unused "unused";
+    @media all {}
+    @media all {
+        a {}
+    }
+    @media   all  {
+    a { color: red; }
+        }
+    @page     { left: 0; }
+    a {}
+    prefix|x, a  +  b  >  c  ~  d  ,  b { top : 1px ;
+        font-family : arial ,'some'
+        }
+    '''
+        parsedcss = u'''/*1*/
+@import url(x) tv, print;
+@namespace prefix "uri";
+@namespace unused "unused";
+@media all {
+    a {
+        color: red
+        }
+    }
+@page {
+    left: 0
+    }
+prefix|x, a + b > c ~ d, b {
+    top: 1px;
+    font-family: arial, "some"
+    }'''
+        s = cssutils.parseString(css)
+        self.assertEqual(s.cssText, parsedcss.encode())
+        
+        tests = {
+            u'0.1 .1 0.1px .1px 0.1% .1% +0.1 +.1 +0.1px +.1px +0.1% +.1% -0.1 -.1 -0.1px -.1px -0.1% -.1%': 
+            u'0.1 0.1 0.1px 0.1px 0.1% 0.1% +0.1 +0.1 +0.1px +0.1px +0.1% +0.1% -0.1 -0.1 -0.1px -0.1px -0.1% -0.1%' 
+        }
+        cssutils.ser.prefs.useDefaults()
+        for test, exp in tests.items():
+            s = cssutils.parseString(u'a{x:%s}' % test)
+            self.assertEqual((u'a {\n    x: %s\n    }' % exp).encode(), s.cssText)
+
+
+    def test_useMinified(self):
+        "Preferences.useMinified()"
+        cssutils.ser.prefs.useDefaults()
+        cssutils.ser.prefs.useMinified()
+        self.assertEqual(cssutils.ser.prefs.defaultAtKeyword, True)
+        self.assertEqual(cssutils.ser.prefs.defaultPropertyName, True)
+        self.assertEqual(cssutils.ser.prefs.importHrefFormat, 'string')
+        self.assertEqual(cssutils.ser.prefs.indent, u'')
+        self.assertEqual(cssutils.ser.prefs.keepAllProperties, True)
+        self.assertEqual(cssutils.ser.prefs.keepComments, False)
+        self.assertEqual(cssutils.ser.prefs.keepEmptyRules, False)
+        self.assertEqual(cssutils.ser.prefs.keepUnknownAtRules, False)
+        self.assertEqual(cssutils.ser.prefs.keepUsedNamespaceRulesOnly, True)
+        self.assertEqual(cssutils.ser.prefs.lineNumbers, False)
+        self.assertEqual(cssutils.ser.prefs.lineSeparator, u'')
+        self.assertEqual(cssutils.ser.prefs.listItemSpacer, u'')
+        self.assertEqual(cssutils.ser.prefs.omitLastSemicolon, True)
+        self.assertEqual(cssutils.ser.prefs.omitLeadingZero, True)
+        self.assertEqual(cssutils.ser.prefs.paranthesisSpacer, u'')
+        self.assertEqual(cssutils.ser.prefs.propertyNameSpacer, u'')
+        self.assertEqual(cssutils.ser.prefs.selectorCombinatorSpacer, u'')
+        self.assertEqual(cssutils.ser.prefs.spacer, u'')
+        self.assertEqual(cssutils.ser.prefs.validOnly, False)
+        
+        css = u'''
+    /*1*/
+    @import   url(x) tv , print;
+    @namespace   prefix "uri";
+    @namespace   unused "unused";
+    @media  all {}
+    @media  all {
+        a {}
+    }
+    @media all "name" {
+        a { color: red; }
+    }
+    @page:left {
+    left: 0
+    }
+    a {}
+    prefix|x, a + b > c ~ d , b { top : 1px ;
+        font-family : arial ,  'some'
+        }
+    @x  x;
+    '''
+        s = cssutils.parseString(css)
+        cssutils.ser.prefs.keepUnknownAtRules = True
+        self.assertEqual(s.cssText,
+            u'''@import"x"tv,print;@namespace prefix"uri";@media all"name"{a{color:red}}@page :left{left:0}prefix|x,a+b>c~d,b{top:1px;font-family:arial,"some"}@x x;'''.encode() 
+            )
+        cssutils.ser.prefs.keepUnknownAtRules = False
+        self.assertEqual(s.cssText,
+            u'''@import"x"tv,print;@namespace prefix"uri";@media all"name"{a{color:red}}@page :left{left:0}prefix|x,a+b>c~d,b{top:1px;font-family:arial,"some"}'''.encode()
+            )
+        # Values
+        valuetests = {
+            u'  a  a1  a-1  a-1a  ': 'a a1 a-1 a-1a',
+            u'a b 1 c 1em d -1em e': u'a b 1 c 1em d -1em e',
+            u'  1em  /  5  ': u'1em/5',
+            u'1em/5': u'1em/5',
+            u'a 0 a .0 a 0.0 a -0 a -.0 a -0.0 a +0 a +.0 a +0.0':
+                u'a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0',
+            u'a  0px  a  .0px  a  0.0px  a  -0px  a  -.0px  a  -0.0px  a  +0px  a  +.0px  a  +0.0px ':
+                u'a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0',
+            u'a  1  a  .1  a  1.0  a  0.1  a  -1  a  -.1  a  -1.0  a  -0.1  a  +1  a  +.1  a  +1.0':
+                u'a 1 a .1 a 1 a .1 a -1 a -.1 a -1 a -.1 a +1 a +.1 a +1',
+            u'  url(x)  f()': 'url(x) f()',
+            u'#112233': '#123',
+            u'#112234': '#112234',
+            u'#123': '#123',
+            u'#123 url() f()': '#123 url() f()',
+            u'1 +2 +3 -4': u'1 +2 +3 -4', # ?
+            u'0.1 .1 0.1px .1px 0.1% .1% +0.1 +.1 +0.1px +.1px +0.1% +.1% -0.1 -.1 -0.1px -.1px -0.1% -.1%':
+            u'.1 .1 .1px .1px .1% .1% +.1 +.1 +.1px +.1px +.1% +.1% -.1 -.1 -.1px -.1px -.1% -.1%'
+        }
+        for test, exp in valuetests.items():
+            s = cssutils.parseString(u'a{x:%s}' % test)
+            self.assertEqual((u'a{x:%s}' % exp).encode(), s.cssText)
+
+        
+            
+    def test_defaultAtKeyword(self):
+        "Preferences.defaultAtKeyword"
+        s = cssutils.parseString(u'@im\\port "x";')
+        self.assertEqual(u'@import "x";'.encode(), s.cssText)
+        cssutils.ser.prefs.defaultAtKeyword = True
+        self.assertEqual(u'@import "x";'.encode(), s.cssText)
+        cssutils.ser.prefs.defaultAtKeyword = False
+        self.assertEqual(u'@im\\port "x";'.encode(), s.cssText)
+        
+    def test_defaultPropertyName(self):
+        "Preferences.defaultPropertyName"
+        cssutils.ser.prefs.keepAllProperties = False
+
+        # does not actually work as once the name is set it is used also
+        # if used with a backslash in it later...
+
+        s = cssutils.parseString(ur'a { c\olor: green; }')
+        self.assertEqual(u'a {\n    color: green\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.defaultPropertyName = True
+        self.assertEqual(u'a {\n    color: green\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.defaultPropertyName = False
+        self.assertEqual(u'a {\n    c\\olor: green\n    }'.encode(), s.cssText)
+
+        s = cssutils.parseString(u'a { color: red; c\olor: green; }')
+        self.assertEqual(u'a {\n    c\\olor: green\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.defaultPropertyName = False
+        self.assertEqual(u'a {\n    c\\olor: green\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.defaultPropertyName = True
+        self.assertEqual(u'a {\n    color: green\n    }'.encode(), s.cssText)
+        
+    def test_defaultPropertyPriority(self):
+        "Preferences.defaultPropertyPriority"
+        css = u'a {\n    color: green !IM\\portant\n    }'
+        s = cssutils.parseString(css)
+        self.assertEqual(s.cssText, u'a {\n    color: green !important\n    }'.encode())
+        cssutils.ser.prefs.defaultPropertyPriority = False
+        self.assertEqual(s.cssText, css.encode())
+        
+    def test_importHrefFormat(self):
+        "Preferences.importHrefFormat"
+        r0 = cssutils.css.CSSImportRule()
+        r0.cssText=u'@import url("not");'
+        r1 = cssutils.css.CSSImportRule()
+        r1.cssText=u'@import "str";'
+        self.assertEqual(u'@import url(not);', r0.cssText)
+        self.assertEqual(u'@import "str";', r1.cssText)
+
+        cssutils.ser.prefs.importHrefFormat = 'string'
+        self.assertEqual(u'@import "not";', r0.cssText)
+        self.assertEqual(u'@import "str";', r1.cssText)
+
+        cssutils.ser.prefs.importHrefFormat = 'uri'
+        self.assertEqual(u'@import url(not);', r0.cssText)
+        self.assertEqual(u'@import url(str);', r1.cssText)
+
+        cssutils.ser.prefs.importHrefFormat = 'not defined'
+        self.assertEqual(u'@import url(not);', r0.cssText)
+        self.assertEqual(u'@import "str";', r1.cssText)
+        
+    def test_indent(self):
+        "Preferences.ident"
+        s = cssutils.parseString(u'a { left: 0 }')
+        exp4 = u'''a {
+    left: 0
+    }'''
+        exp1 = u'''a {
+ left: 0
+ }'''
+        cssutils.ser.prefs.indent = ' '
+        self.assertEqual(exp1.encode(), s.cssText)
+        cssutils.ser.prefs.indent = 4* ' '
+        self.assertEqual(exp4.encode(), s.cssText)
+
+    def test_indentClosingBrace(self):
+        "Preferences.indentClosingBrace"
+        s = cssutils.parseString(u'@media all {a {left: 0}} b { top: 0 }')
+        expT = u'''@media all {
+    a {
+        left: 0
+        }
+    }
+b {
+    top: 0
+    }'''
+        expF = u'''@media all {
+    a {
+        left: 0
+    }
+}
+b {
+    top: 0
+}'''
+        cssutils.ser.prefs.useDefaults()
+        self.assertEqual(expT.encode(), s.cssText)
+        cssutils.ser.prefs.indentClosingBrace = False
+        self.assertEqual(expF.encode(), s.cssText)
+        
+    def test_keepAllProperties(self):
+        "Preferences.keepAllProperties"
+        css = '''a {
+            color: pink;
+            color: red;
+            c\olor: blue;
+            c\olor: green;
+            }'''
+        s = cssutils.parseString(css)
+        # keep only last
+        cssutils.ser.prefs.keepAllProperties = False
+        self.assertEqual(u'a {\n    color: green\n    }'.encode(), s.cssText)
+        # keep all
+        cssutils.ser.prefs.keepAllProperties = True
+        self.assertEqual(u'a {\n    color: pink;\n    color: red;\n    c\olor: blue;\n    c\olor: green\n    }'.encode(), s.cssText)
+        
+    def test_keepComments(self):
+        "Preferences.keepComments"
+        s = cssutils.parseString('/*1*/ a { /*2*/ }')
+        cssutils.ser.prefs.keepComments = False
+        self.assertEqual(''.encode(), s.cssText)
+        cssutils.ser.prefs.keepEmptyRules = True
+        self.assertEqual('a {}'.encode(), s.cssText)
+        
+    def test_keepEmptyRules(self):
+        "Preferences.keepEmptyRules"
+        # CSSStyleRule
+        css = u'''a {}
+a {
+    /*1*/
+    }
+a {
+    color: red
+    }'''
+        s = cssutils.parseString(css)
+        cssutils.ser.prefs.useDefaults()
+        cssutils.ser.prefs.keepEmptyRules = True
+        self.assertEqual(css.encode(), s.cssText)
+        cssutils.ser.prefs.keepEmptyRules = False
+        self.assertEqual(u'a {\n    /*1*/\n    }\na {\n    color: red\n    }'.encode(),
+                         s.cssText)
+        cssutils.ser.prefs.keepComments = False
+        self.assertEqual(u'a {\n    color: red\n    }'.encode(), s.cssText)
+
+        # CSSMediaRule
+        css = u'''@media tv {
+    }
+@media all {
+    /*1*/
+    }
+@media print {
+    a {}
+    }
+@media print {
+    a {
+        /*1*/
+        }
+    }
+@media all {
+    a {
+        color: red
+        }
+    }'''
+        s = cssutils.parseString(css)
+        cssutils.ser.prefs.useDefaults()
+        cssutils.ser.prefs.keepEmptyRules = True
+   #     self.assertEqual(css, s.cssText)
+        cssutils.ser.prefs.keepEmptyRules = False
+        self.assertEqual('''@media all {
+    /*1*/
+    }
+@media print {
+    a {
+        /*1*/
+        }
+    }
+@media all {
+    a {
+        color: red
+        }
+    }'''.encode(), s.cssText)
+        cssutils.ser.prefs.keepComments = False
+        self.assertEqual('''@media all {
+    a {
+        color: red
+        }
+    }'''.encode(), s.cssText)
+        
+    def test_keepUnknownAtRules(self):
+        "Preferences.keepUnknownAtRules"
+        tests = {
+            u'''@three-dee {
+              @background-lighting {
+                azimuth: 30deg;
+                elevation: 190deg;
+              }
+              h1 { color: red }
+            }
+            h1 { color: blue }''': (u'''@three-dee {
+    @background-lighting {
+        azimuth: 30deg;
+        elevation: 190deg;
+        } h1 {
+        color: red
+        }
+    }
+h1 {
+    color: blue
+    }''', u'''h1 {
+    color: blue
+    }''')
+        }
+        for test in tests:
+            s = cssutils.parseString(test)
+            expwith, expwithout = tests[test]
+            cssutils.ser.prefs.keepUnknownAtRules = True
+            self.assertEqual(s.cssText, expwith.encode())
+            cssutils.ser.prefs.keepUnknownAtRules = False
+            self.assertEqual(s.cssText, expwithout.encode())
+            
+    def test_keepUsedNamespaceRulesOnly(self):
+        "Preferences.keepUsedNamespaceRulesOnly"
+        tests = {
+            # default == prefix => both are combined
+            '@namespace p "u"; @namespace "u"; p|a, a {top: 0}':
+                ('@namespace "u";\na, a {\n    top: 0\n    }',
+                 '@namespace "u";\na, a {\n    top: 0\n    }'),
+            '@namespace "u"; @namespace p "u"; p|a, a {top: 0}':
+                ('@namespace p "u";\np|a, p|a {\n    top: 0\n    }',
+                 '@namespace p "u";\np|a, p|a {\n    top: 0\n    }'),
+            # default and prefix
+            '@namespace p "u"; @namespace "d"; p|a, a {top: 0}':
+                ('@namespace p "u";\n@namespace "d";\np|a, a {\n    top: 0\n    }',
+                 '@namespace p "u";\n@namespace "d";\np|a, a {\n    top: 0\n    }'),
+            # prefix only
+            '@namespace p "u"; @namespace "d"; p|a {top: 0}':
+                ('@namespace p "u";\n@namespace "d";\np|a {\n    top: 0\n    }',
+                 '@namespace p "u";\np|a {\n    top: 0\n    }'),
+            # default only
+            '@namespace p "u"; @namespace "d"; a {top: 0}':
+                ('@namespace p "u";\n@namespace "d";\na {\n    top: 0\n    }',
+                 '@namespace "d";\na {\n    top: 0\n    }'),
+            # prefix-ns only
+            '@namespace p "u"; @namespace d "d"; p|a {top: 0}':
+                ('@namespace p "u";\n@namespace d "d";\np|a {\n    top: 0\n    }',
+                 '@namespace p "u";\np|a {\n    top: 0\n    }'),
+        }
+        for test in tests:
+            s = cssutils.parseString(test)
+            expwith, expwithout = tests[test]
+            cssutils.ser.prefs.keepUsedNamespaceRulesOnly = False
+            self.assertEqual(s.cssText, expwith.encode())
+            cssutils.ser.prefs.keepUsedNamespaceRulesOnly = True
+            self.assertEqual(s.cssText, expwithout.encode())
+        
+    def test_lineNumbers(self):
+        "Preferences.lineNumbers"
+
+        s = cssutils.parseString('a {top: 1; left: 2}')
+        exp0 = '''a {
+    top: 1;
+    left: 2
+    }'''
+        exp1 = '''1: a {
+2:     top: 1;
+3:     left: 2
+4:     }'''
+        self.assertEqual(False, cssutils.ser.prefs.lineNumbers)
+        self.assertEqual(exp0.encode(), s.cssText)
+        cssutils.ser.prefs.lineNumbers = True
+        self.assertEqual(True, cssutils.ser.prefs.lineNumbers)
+        self.assertEqual(exp1.encode(), s.cssText)
+
+    def test_lineSeparator(self):
+        "Preferences.lineSeparator"
+        s = cssutils.parseString('a { x:1;y:2}')
+        self.assertEqual('a {\n    x: 1;\n    y: 2\n    }'.encode(), s.cssText)
+        # cannot be indented as no split possible
+        cssutils.ser.prefs.lineSeparator = u''
+        self.assertEqual('a {x: 1;y: 2    }'.encode(), s.cssText)
+        # no valid css but should work
+        cssutils.ser.prefs.lineSeparator = u'XXX'
+        self.assertEqual('a {XXX    x: 1;XXX    y: 2XXX    }'.encode(), s.cssText)
+
+    def test_listItemSpacer(self):
+        "Preferences.listItemSpacer"
+        cssutils.ser.prefs.keepEmptyRules = True
+        
+        css = '''
+        @import "x" print, tv;
+a, b {}'''
+        s = cssutils.parseString(css)
+        self.assertEqual(u'@import "x" print, tv;\na, b {}'.encode(), s.cssText)
+        cssutils.ser.prefs.listItemSpacer = u''
+        self.assertEqual(u'@import "x" print,tv;\na,b {}'.encode(), s.cssText)
+        
+    def test_omitLastSemicolon(self):
+        "Preferences.omitLastSemicolon"
+        css = 'a { x: 1; y: 2 }'
+        s = cssutils.parseString(css)
+        self.assertEqual(u'a {\n    x: 1;\n    y: 2\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.omitLastSemicolon = False
+        self.assertEqual(u'a {\n    x: 1;\n    y: 2;\n    }'.encode(), s.cssText)
+        
+    def test_normalizedVarNames(self):
+        "Preferences.normalizedVarNames"
+        cssutils.ser.prefs.resolveVariables = False
+        
+        css = '@variables { A: 1 }'
+        s = cssutils.parseString(css)
+        self.assertEqual(u'@variables {\n    a: 1\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.normalizedVarNames = False
+        self.assertEqual(u'@variables {\n    A: 1\n    }'.encode(), s.cssText)
+
+        cssutils.ser.prefs.resolveVariables = True
+
+    def test_paranthesisSpacer(self):
+        "Preferences.paranthesisSpacer"
+        css = 'a { x: 1; y: 2 }'
+        s = cssutils.parseString(css)
+        self.assertEqual(u'a {\n    x: 1;\n    y: 2\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.paranthesisSpacer = u''
+        self.assertEqual(u'a{\n    x: 1;\n    y: 2\n    }'.encode(), s.cssText)
+        
+    def test_propertyNameSpacer(self):
+        "Preferences.propertyNameSpacer"
+        css = 'a { x: 1; y: 2 }'
+        s = cssutils.parseString(css)
+        self.assertEqual(u'a {\n    x: 1;\n    y: 2\n    }'.encode(), s.cssText)
+        cssutils.ser.prefs.propertyNameSpacer = u''
+        self.assertEqual(u'a {\n    x:1;\n    y:2\n    }'.encode(), s.cssText)
+        
+    def test_selectorCombinatorSpacer(self):
+        "Preferences.selectorCombinatorSpacer"
+        s = cssutils.css.Selector(selectorText='a+b>c~d  e')
+        self.assertEqual(u'a + b > c ~ d e', s.selectorText)
+        cssutils.ser.prefs.selectorCombinatorSpacer = u''
+        self.assertEqual(u'a+b>c~d e', s.selectorText)
+        
+    def test_spacer(self):
+        cssutils.ser.prefs.spacer = u''
+        tests = {
+            u'@font-face {a:1}': u'@font-face {\n    a: 1\n    }',
+            u'@import  url( a );': u'@import url(a);',
+            u'@media  all{a{color:red}}': u'@media all {\n    a {\n        color: red\n        }\n    }',
+            u'@namespace "a";': u'@namespace"a";',
+            u'@namespace a  "a";': u'@namespace a"a";',
+            u'@page  :left {   a  :1  }': u'@page :left {\n    a: 1\n    }',
+            u'@x  x;': u'@x x;',
+            u'@import"x"tv': u'@import"x"tv;' # ?
+            }
+        for css, exp in tests.items():
+            self.assertEqual(exp.encode(), cssutils.parseString(css).cssText)
+            
+    def test_validOnly(self):
+        "Preferences.validOnly"
+        # Property
+        p = cssutils.css.Property('color', '1px')
+        self.assertEqual(p.cssText, 'color: 1px')
+        p.value = '1px'
+        cssutils.ser.prefs.validOnly = True
+        self.assertEqual(p.cssText, '')
+        cssutils.ser.prefs.validOnly = False
+        self.assertEqual(p.cssText, 'color: 1px')
+        
+        # CSSStyleDeclaration has no actual property valid
+        # but is empty if containing invalid Properties only
+        s = cssutils.css.CSSStyleDeclaration()
+        s.cssText = u'left: x;top: x'
+        self.assertEqual(s.cssText, u'left: x;\ntop: x')
+        cssutils.ser.prefs.validOnly = True
+        self.assertEqual(s.cssText, u'')
+
+        cssutils.ser.prefs.useDefaults()
+        cssutils.ser.prefs.keepComments = False
+        cssutils.ser.prefs.validOnly = True
+        tests = {
+            u'h1 { color: red; rotation: 70minutes }': 'h1 {\n    color: red;\n    }',
+            u'''img { float: left }       /* correct CSS 2.1 */
+img { float: left here }  /* "here" is not a value of 'float' */
+img { background: "red" } /* keywords cannot be quoted */
+img { border-width: 3 }   /* a unit must be specified for length values */''': 'img {\n    float: left\n    }'
+            
+        }
+        self.do_equal_p(tests, raising=False)
+        
+
+class CSSSerializerTestCase(basetest.BaseTestCase):
+    """
+    testcases for cssutils.CSSSerializer
+    """
+    def setUp(self):
+        cssutils.ser.prefs.useDefaults()
+    
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+
+    def test_canonical(self):
+        tests = {
+            u'''1''': u'''1''',
+            # => remove +
+            u'''+1''': u'''+1''',
+            # 0 => remove unit
+            u'''0''': u'''0''',
+            u'''+0''': u'''0''',
+            u'''-0''': u'''0''',
+            u'''0.0''': u'''0''',
+            u'''00.0''': u'''0''',
+            u'''00.0px''': u'''0''',
+            u'''00.0pc''': u'''0''',
+            u'''00.0em''': u'''0''',
+            u'''00.0ex''': u'''0''',
+            u'''00.0cm''': u'''0''',
+            u'''00.0mm''': u'''0''',
+            u'''00.0in''': u'''0''',
+            # 0 => keep unit
+            u'''00.0%''': u'''0%''',
+            u'''00.0ms''': u'''0ms''',
+            u'''00.0s''': u'''0s''',
+            u'''00.0khz''': u'''0khz''',
+            u'''00.0hz''': u'''0hz''',
+            u'''00.0khz''': u'''0khz''',
+            u'''00.0deg''': u'''0deg''',
+            u'''00.0rad''': u'''0rad''',
+            u'''00.0grad''': u'''0grad''',
+            u'''00.0xx''': u'''0xx''',
+            # 11. 
+            u'''a, 'b"', serif''': ur'''a, "b\"", serif''',
+            # SHOULD: \[ => [ but keep!
+            ur"""url('h)i') '\[\]'""": ur'''url("h)i") "\[\]"''',
+            u'''rgb(18, 52, 86)''': u'''rgb(18, 52, 86)''',
+            u'''#123456''': u'''#123456''',
+            # SHOULD => #112233
+            u'''#112233''': u'''#123''',
+            # SHOULD => #000000
+#            u'rgba(000001, 0, 0, 1)': u'#000'
+            }
+        for test, exp in tests.items():
+            v = cssutils.css.PropertyValue(test)
+            self.assertEqual(exp, v.cssText)
+
+
+    def test_CSSStyleSheet(self):
+        "CSSSerializer.do_CSSStyleSheet"
+        css = u'/* κουρος */'
+        sheet = cssutils.parseString(css)
+        self.assertEqual(css, unicode(sheet.cssText, 'utf-8'))
+        
+        css = u'@charset "utf-8";\n/* κουρος */'
+        sheet = cssutils.parseString(css)
+        self.assertEqual(css, unicode(sheet.cssText, 'utf-8'))
+        sheet.cssRules[0].encoding = 'ascii'
+        self.assertEqual('@charset "ascii";\n/* \\3BA \\3BF \\3C5 \\3C1 \\3BF \\3C2  */'.encode(), 
+                         sheet.cssText)
+        
+    def test_Property(self):
+        "CSSSerializer.do_Property"
+
+        name="color"
+        value="red"
+        priority="!important"
+
+        s = cssutils.css.property.Property(
+            name=name, value=value, priority=priority)
+        self.assertEqual(u'color: red !important',
+                    cssutils.ser.do_Property(s))
+
+        s = cssutils.css.property.Property(
+            name=name, value=value)
+        self.assertEqual(u'color: red',
+                    cssutils.ser.do_Property(s))
+
+    def test_escapestring(self):
+        "CSSSerializer._escapestring"
+        #'"\a\22\27"'  
+        css = ur'''@import url("ABC\a");
+@import "ABC\a";
+@import 'ABC\a';
+a[href='"\a\22\27"'] {
+    a: "\a\d\c";
+    b: "\a \d \c ";
+    c: "\"";
+    d: "\22";
+    e: '\'';
+    f: "\\";
+    g: "2\\ 1\ 2\\";
+    content: '\27';
+    }'''
+#        exp = ur'''@import url("ABC\a ");
+#@import "ABC\a";
+#@import "ABC\a";
+#a[href="\"\a\22\27\""] {
+#    a: "\a\d\c";
+#    b: "\a \d \c ";
+#    c: "\"";
+#    d: "\22";
+#    e: "'";
+#    f: "\\";
+#    g: "2\\ 1\ 2\\";
+#    content: "\27"
+#    }'''
+        exp = ur'''@import url("ABC\a ");
+@import "ABC\a ";
+@import "ABC\a ";
+a[href="\"\a \"'\""] {
+    a: "\a \d \c ";
+    b: "\a \d \c ";
+    c: "\"";
+    d: "\"";
+    e: "'";
+    f: "\\";
+    g: "2\\ 1\ 2\\";
+    content: "'"
+    }'''
+        sheet = cssutils.parseString(css)
+        self.assertEqual(sheet.cssText, exp.encode())
+    
+    
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csscharsetrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csscharsetrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csscharsetrule.py	(revision 1126)
@@ -0,0 +1,123 @@
+"""Testcases for cssutils.css.CSSCharsetRule"""
+
+import re
+import xml.dom
+import test_cssrule
+import cssutils.css
+
+class CSSCharsetRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSCharsetRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSCharsetRule()
+        self.rRO = cssutils.css.CSSCharsetRule(readonly=True)
+        self.r_type = cssutils.css.CSSCharsetRule.CHARSET_RULE
+        self.r_typeString = 'CHARSET_RULE'
+
+    def test_init(self):
+        "CSSCharsetRule.__init__()"      
+        super(CSSCharsetRuleTestCase, self).test_init()
+        self.assertEqual(None, self.r.encoding)
+        self.assertEqual(u'', self.r.cssText)
+        
+        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setCssText, u'xxx')
+
+    def test_InvalidModificationErr(self):
+        "CSSCharsetRule InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@charset')
+
+    def test_init_encoding(self):
+        "CSSCharsetRule.__init__(encoding)"
+        for enc in (None, u'UTF-8', u'utf-8', u'iso-8859-1', u'ascii'):
+            r = cssutils.css.CSSCharsetRule(enc)
+            if enc is None:
+                self.assertEqual(None, r.encoding)
+                self.assertEqual(u'', r.cssText)
+            else:
+                self.assertEqual(enc.lower(), r.encoding)
+                self.assertEqual(
+                    u'@charset "%s";' % enc.lower(), r.cssText)
+
+        for enc in (' ascii ', ' ascii', 'ascii '):
+            self.assertRaisesEx(xml.dom.SyntaxErr,
+                    cssutils.css.CSSCharsetRule, enc,
+                    exc_pattern=re.compile("Syntax Error"))
+
+        for enc in (u'unknown', ):
+            self.assertRaisesEx(xml.dom.SyntaxErr,
+                    cssutils.css.CSSCharsetRule, enc,
+                    exc_pattern=re.compile("Unknown \(Python\) encoding"))
+
+    def test_encoding(self):
+        "CSSCharsetRule.encoding"
+        for enc in (u'UTF-8', u'utf-8', u'iso-8859-1', u'ascii'):
+            self.r.encoding = enc
+            self.assertEqual(enc.lower(), self.r.encoding)
+            self.assertEqual(
+                u'@charset "%s";' % enc.lower(), self.r.cssText)
+
+        for enc in (None,' ascii ', ' ascii', 'ascii '):
+            self.assertRaisesEx(xml.dom.SyntaxErr,
+                    self.r.__setattr__, 'encoding', enc,
+                    exc_pattern=re.compile("Syntax Error"))
+
+        for enc in (u'unknown', ):
+            self.assertRaisesEx(xml.dom.SyntaxErr,
+                    self.r.__setattr__, 'encoding', enc,
+                    exc_pattern=re.compile("Unknown \(Python\) encoding"))
+
+    def test_cssText(self):
+        """CSSCharsetRule.cssText
+
+        setting cssText is ok to use @CHARSET or other but a file
+        using parse MUST use ``@charset "ENCODING";``
+        """
+        tests = {
+            u'@charset "utf-8";': None,
+            u"@charset 'utf-8';": u'@charset "utf-8";',
+            }
+        self.do_equal_r(tests)
+        self.do_equal_p(tests) # also parse
+
+        tests = {
+            # token is "@charset " with space!
+            u'@charset;"': xml.dom.InvalidModificationErr,
+            u'@CHARSET "UTF-8";': xml.dom.InvalidModificationErr,
+            u'@charset "";': xml.dom.SyntaxErr,
+            u'''@charset /*1*/"utf-8"/*2*/;''': xml.dom.SyntaxErr,
+            u'''@charset /*1*/"utf-8";''': xml.dom.SyntaxErr,
+            u'''@charset "utf-8"/*2*/;''': xml.dom.SyntaxErr,
+            u'@charset { utf-8 }': xml.dom.SyntaxErr,
+            u'@charset "utf-8"': xml.dom.SyntaxErr,
+            u'@charset a;': xml.dom.SyntaxErr,
+            u'@charset /**/;': xml.dom.SyntaxErr,
+            # trailing content
+            u'@charset "utf-8";s': xml.dom.SyntaxErr,
+            u'@charset "utf-8";/**/': xml.dom.SyntaxErr,
+            u'@charset "utf-8"; ': xml.dom.SyntaxErr,
+            
+            # comments do not work in this rule!
+            u'@charset "utf-8"/*1*//*2*/;': xml.dom.SyntaxErr
+            }
+        self.do_raise_r(tests)
+
+    def test_repr(self):
+        "CSSCharsetRule.__repr__()"
+        self.r.encoding = 'utf-8'
+        self.assertTrue('utf-8' in repr(self.r))
+
+    def test_reprANDstr(self):
+        "CSSCharsetRule.__repr__(), .__str__()"
+        encoding='utf-8'
+
+        s = cssutils.css.CSSCharsetRule(encoding=encoding)
+
+        self.assertTrue(encoding in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(encoding == s2.encoding)
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_encutils/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_encutils/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_encutils/__init__.py	(revision 1126)
@@ -0,0 +1,409 @@
+# -*- coding: utf-8 -*-
+"""
+tests for encutils.py
+"""
+import httplib
+from StringIO import StringIO
+import sys
+import unittest
+
+PY2x = sys.version_info < (3,0)
+
+try:
+    import cssutils.encutils as encutils
+except ImportError:
+    import encutils
+
+# helper log
+log = encutils.buildlog(stream=StringIO())
+
+class AutoEncodingTestCase(unittest.TestCase):
+
+    def _fakeRes(self, content):
+        "build a fake HTTP response"
+        class FakeRes:
+            def __init__(self, content):
+                if PY2x:
+                    fp = StringIO(content)
+                    self._info = httplib.HTTPMessage(fp)
+                else:
+                    self._info = httplib.HTTPMessage()
+                    # Adjust to testdata.
+                    l = content.split(':')
+                    if len(l) > 1:
+                        # Get the type by just
+                        # using the data at the end.
+                        t = l[-1].strip()
+                        self._info.set_type(t)
+
+            def info(self):
+                return self._info
+
+            def read(self):
+                return content
+
+        return FakeRes(content)
+
+    def test_getTextTypeByMediaType(self):
+        "encutils._getTextTypeByMediaType"
+        tests = {
+            'application/xml': encutils._XML_APPLICATION_TYPE,
+            'application/xml-dtd': encutils._XML_APPLICATION_TYPE,
+            'application/xml-external-parsed-entity': encutils._XML_APPLICATION_TYPE,
+            'application/xhtml+xml': encutils._XML_APPLICATION_TYPE,
+            'text/xml': encutils._XML_TEXT_TYPE,
+            'text/xml-external-parsed-entity': encutils._XML_TEXT_TYPE,
+            'text/xhtml+xml': encutils._XML_TEXT_TYPE,
+            'text/html': encutils._HTML_TEXT_TYPE,
+            'text/css': encutils._TEXT_UTF8,
+            'text/plain': encutils._TEXT_TYPE,
+            'x/x': encutils._OTHER_TYPE,
+            'ANYTHING': encutils._OTHER_TYPE
+            }
+        for test, exp in tests.items():
+            self.assertEqual(
+                exp, encutils._getTextTypeByMediaType(test, log=log))
+
+    def test_getTextType(self):
+        "encutils._getTextType"
+        tests = {
+            u'\x00\x00\xFE\xFF<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
+            u'\xFF\xFE\x00\x00<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
+            u'\xFE\xFF<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
+            u'\xFF\xFE<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
+            u'\xef\xbb\xbf<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
+            u'<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
+            u'\x00\x00\xFE\xFFanything': encutils._OTHER_TYPE,
+            u'\xFF\xFE\x00\x00anything': encutils._OTHER_TYPE,
+            u'\xFE\xFFanything': encutils._OTHER_TYPE,
+            u'\xFF\xFEanything': encutils._OTHER_TYPE,
+            u'\xef\xbb\xbfanything': encutils._OTHER_TYPE,
+            u'x/x': encutils._OTHER_TYPE,
+            u'ANYTHING': encutils._OTHER_TYPE
+            }
+        for test, exp in tests.items():
+            self.assertEqual(
+                exp, encutils._getTextType(test, log=log))
+
+    def test_encodingByMediaType(self):
+        "encutils.encodingByMediaType"
+        tests = {
+            'application/xml': 'utf-8',
+            'application/xml-dtd': 'utf-8',
+            'application/xml-external-parsed-entity': 'utf-8',
+            'application/ANYTHING+xml': 'utf-8',
+            '  application/xml  ': 'utf-8',
+            'text/xml': 'ascii',
+            'text/xml-external-parsed-entity': 'ascii',
+            'text/ANYTHING+xml': 'ascii',
+            'text/html': 'iso-8859-1',
+            'text/css': 'utf-8',
+            'text/plain': 'iso-8859-1',
+            'ANYTHING': None
+            }
+        for test, exp in tests.items():
+            self.assertEqual(exp,
+                             encutils.encodingByMediaType(test, log=log))
+
+    def test_getMetaInfo(self):
+        "encutils.getMetaInfo"
+        tests = {
+            """<meta tp-equiv='Content-Type' content='text/html; charset=ascii'>""":
+                (None, None),
+            """<meta http-equiv='ontent-Type' content='text/html; charset=ascii'>""":
+                (None, None),
+
+            """<meta http-equiv='Content-Type' content='text/html'>""":
+                ('text/html', None),
+
+            """<meta content='text/html' http-equiv='Content-Type'>""":
+                ('text/html', None),
+            """<meta content='text/html;charset=ascii' http-equiv='Content-Type'>""":
+                ('text/html', 'ascii'),
+
+            """<meta http-equiv='Content-Type' content='text/html ;charset=ascii'>""":
+                ('text/html', 'ascii'),
+            """<meta content='text/html;charset=iso-8859-1' http-equiv='Content-Type'>""":
+                ('text/html', 'iso-8859-1'),
+            """<meta http-equiv="Content-Type" content="text/html;charset = ascii">""":
+                ('text/html', 'ascii'),
+
+            """<meta http-equiv="Content-Type" content="text/html;charset=ascii;x=2">""":
+                ('text/html', 'ascii'),
+            """<meta http-equiv="Content-Type" content="text/html;x=2;charset=ascii">""":
+                ('text/html', 'ascii'),
+            """<meta http-equiv="Content-Type" content="text/html;x=2;charset=ascii;y=2">""":
+                ('text/html', 'ascii'),
+
+            """<meta http-equiv='Content-Type' content="text/html;charset=ascii">""":
+                ('text/html', 'ascii'),
+            """<meta http-equiv='Content-Type' content='text/html;charset=ascii'  />""":
+                ('text/html', 'ascii'),
+            """<meta http-equiv = " Content-Type" content = " text/html;charset=ascii " >""":
+                ('text/html', 'ascii'),
+            """<meta http-equiv = " \n Content-Type " content = "  \t text/html   ;  charset=ascii " >""":
+                ('text/html', 'ascii'),
+
+            """<meta content="text/html;charset=ascii" http-equiv="Content-Type">""":
+                ('text/html', 'ascii'),
+            """<meta content="text/html;charset=ascii" http-equiv="cONTENT-type">""":
+                ('text/html', 'ascii'),
+            """raises exception: </ >""":
+                (None, None),
+            """<meta content="text/html;charset=ascii" http-equiv="cONTENT-type">
+                </ >""":
+                ('text/html', 'ascii'),
+            """</ >
+                <meta content="text/html;charset=ascii" http-equiv="cONTENT-type">""":
+                ('text/html', 'ascii'),
+            # py 2.7.3 fixed HTMLParser so:  (None, None)
+            """<meta content="text/html" http-equiv="cONTENT-type">
+                </ >
+                <meta content="text/html;charset=ascii" http-equiv="cONTENT-type">""":
+                ('text/html', None)
+            }
+        for test, exp in tests.items():
+            self.assertEqual(exp, encutils.getMetaInfo(test, log=log))
+
+    def test_detectXMLEncoding(self):
+        "encutils.detectXMLEncoding"
+        tests = {
+            # BOM
+            ('utf_32_be'): u'\x00\x00\xFE\xFFanything',
+            ('utf_32_le'): u'\xFF\xFE\x00\x00anything',
+            ('utf_16_be'): u'\xFE\xFFanything',
+            ('utf_16_le'): u'\xFF\xFEanything',
+            ('utf-8'): u'\xef\xbb\xbfanything',
+            # encoding=
+            ('ascii'): '<?xml version="1.0" encoding="ascii" ?>',
+            ('ascii'): "<?xml version='1.0' encoding='ascii' ?>",
+            ('iso-8859-1'): "<?xml version='1.0' encoding='iso-8859-1' ?>",
+            # default
+            ('utf-8'): '<?xml version="1.0" ?>',
+            ('utf-8'): '<?xml version="1.0"?><x encoding="ascii"/>'
+            }
+        for exp, test in tests.items():
+            self.assertEqual(exp, encutils.detectXMLEncoding(test, log=log))
+
+    def test_tryEncodings(self):
+        "encutils.tryEncodings"
+        try:
+            import chardet
+            tests = [
+                ('ascii', u'abc'.encode('ascii')),
+                ('windows-1252', u'€'.encode('windows-1252')),
+                ('ascii', u'1'.encode('utf-8'))
+                ]
+        except ImportError:
+            tests = [
+                ('ascii', u'abc'.encode('ascii')),
+                ('windows-1252', u'€'.encode('windows-1252')),
+                ('iso-8859-1', u'äöüß'.encode('iso-8859-1')),
+                ('iso-8859-1', u'äöüß'.encode('windows-1252')),
+                #('utf-8', u'\u1111'.encode('utf-8'))
+                ]
+        for exp, test in tests:
+            self.assertEqual(exp, encutils.tryEncodings(test))
+
+
+    def test_getEncodingInfo(self):
+        "encutils.getEncodingInfo"
+        # (expectedencoding, expectedmismatch): (httpheader, filecontent)
+        tests = [
+
+            # --- application/xhtml+xml ---
+
+            # header default and XML default
+            (('utf-8', False), (
+                '''Content-Type: application/xhtml+xml''',
+                '''<?xml version="1.0" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="application/xhtml+xml"/>
+                    </example>''')),
+            # XML default
+            (('utf-8', False), (
+                None,
+                '''<?xml version="1.0" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="application/xhtml+xml"/>
+                    </example>''')),
+            # meta is ignored!
+            (('utf-8', False), (
+                '''Content-Type: application/xhtml+xml''',
+                '''<?xml version="1.0" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="application/xhtml+xml;charset=iso_M"/>
+                    </example>''')),
+
+            # header enc and XML default
+            (('iso-h', True), (
+                '''Content-Type: application/xhtml+xml;charset=iso-H''',
+                '''<?xml version="1.0" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="application/xhtml+xml"/>
+                    </example>''')),
+
+            # mismatch header and XML explicit, header wins
+            (('iso-h', True), (
+                '''Content-Type: application/xhtml+xml;charset=iso-H''',
+                '''<?xml version="1.0" encoding="iso-X" ?>
+                    <example/>''')),
+
+            # header == XML, meta ignored!
+            (('iso-h', False), (
+                '''Content-Type: application/xhtml+xml;charset=iso-H''',
+                '''<?xml version="1.0" encoding="iso-h" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="application/xhtml+xml;charset=iso_M"/>
+                    </example>''')),
+
+            # XML only, meta ignored!
+            (('iso-x', False), (
+                '''Content-Type: application/xhtml+xml''',
+                '''<?xml version="1.0" encoding="iso-X" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="application/xhtml+xml;charset=iso_M"/>
+                    </example>''')),
+
+
+            # no text or not enough text:
+            (('iso-h', False), ('Content-Type: application/xml;charset=iso-h',
+                             '1')),
+            (('utf-8', False), ('Content-Type: application/xml',
+                                None)),
+            ((None, False), ('Content-Type: application/xml',
+                             '1')),
+
+
+            # --- text/xml ---
+
+            # default enc
+            (('ascii', False), (
+                '''Content-Type: text/xml''',
+                '''<?xml version="1.0" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="text/xml"/>
+                    </example>''')),
+            # default as XML ignored and meta completely ignored
+            (('ascii', False), (
+                '''Content-Type: text/xml''',
+                '''<?xml version="1.0" encoding="iso-X" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="text/xml;charset=iso_M"/>
+                    </example>''')),
+            (('ascii', False), ('Content-Type: text/xml',
+                                '1')),
+            (('ascii', False), ('Content-Type: text/xml',
+                                None)),
+
+            # header enc
+            (('iso-h', False), (
+                '''Content-Type: text/xml;charset=iso-H''',
+                '''<?xml version="1.0" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="text/xml"/>
+                    </example>''')),
+
+            # header only, XML and meta ignored!
+            (('iso-h', False), (
+                '''Content-Type: text/xml;charset=iso-H''',
+                '''<?xml version="1.0" encoding="iso-X" ?>
+                    <example/>''')),
+            (('iso-h', False), (
+                '''Content-Type: text/xml;charset=iso-H''',
+                '''<?xml version="1.0"  encoding="iso-h" ?>
+                    <example>
+                        <meta http-equiv="Content-Type"
+                            content="text/xml;charset=iso_M"/>
+                    </example>''')),
+
+
+            # --- text/html ---
+
+            # default enc
+            (('iso-8859-1', False), ('Content-Type: text/html;',
+                                     '''<meta http-equiv="Content-Type"
+                                        content="text/html">''')),
+            (('iso-8859-1', False), ('Content-Type: text/html;',
+                                     None)),
+
+            # header enc
+            (('iso-h', False), ('Content-Type: text/html;charset=iso-H',
+                                '''<meta http-equiv="Content-Type"
+                                    content="text/html">''')),
+            # meta enc
+            (('iso-m', False), ('Content-Type: text/html',
+                                '''<meta http-equiv="Content-Type"
+                                    content="text/html;charset=iso-m">''')),
+
+            # mismatch header and meta, header wins
+            (('iso-h', True), ('Content-Type: text/html;charset=iso-H',
+                               '''<meta http-equiv="Content-Type"
+                                    content="text/html;charset=iso-m">''')),
+
+            # no header:
+            ((None, False), (None,
+                             '''<meta http-equiv="Content-Type"
+                                content="text/html;charset=iso-m">''')),
+            # no encoding at all
+            ((None, False), (None,
+                             '''<meta http-equiv="Content-Type"
+                                content="text/html">''')),
+
+
+            ((None, False), (None,
+                             '''text''')),
+
+
+            # --- no header ---
+
+            ((None, False), (None, '')),
+            (('iso-8859-1', False), ('''NoContentType''',
+                                     '''OnlyText''')),
+            (('iso-8859-1', False), ('Content-Type: text/html;',
+                                     None)),
+            (('iso-8859-1', False), ('Content-Type: text/html;',
+                                     '1')),
+
+            # XML
+            (('utf-8', False), (None,
+                                '''<?xml version=''')),
+            (('iso-x', False), (None,
+                                '''<?xml version="1.0" encoding="iso-X"?>''')),
+            # meta ignored
+            (('utf-8', False), (None,
+                                '''<?xml version="1.0" ?>
+                                    <html><meta http-equiv="Content-Type"
+                                    content="text/html;charset=iso-m"></html>''')),
+
+            (('utf-8', False), ('Content-Type: text/css;',
+                                '1')),
+            (('iso-h', False), ('Content-Type: text/css;charset=iso-h',
+                                '1')),
+            # only header is used by encutils
+            (('utf-8', False), ('Content-Type: text/css',
+                                '@charset "ascii";')),
+
+        ]
+        for exp, test in tests:
+            header, text = test
+            if header:
+                res = encutils.getEncodingInfo(self._fakeRes(header), text)
+            else:
+                res = encutils.getEncodingInfo(text=text)
+
+            res = (res.encoding, res.mismatch)
+            self.assertEqual(exp, res)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_settings.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_settings.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_settings.py	(revision 1126)
@@ -0,0 +1,26 @@
+"""Testcases for cssutils.settings"""
+__version__ = '$Id: test_csscharsetrule.py 1356 2008-07-13 17:29:09Z cthedot $'
+
+import test_cssrule
+import cssutils
+import cssutils.settings
+
+class Settings(test_cssrule.CSSRuleTestCase):
+        
+    def test_set(self):
+        "settings.set()"
+        cssutils.ser.prefs.useMinified()
+        text = u'a {filter: progid:DXImageTransform.Microsoft.BasicImage( rotation = 90 )}'
+        
+        self.assertEqual(cssutils.parseString(text).cssText, ''.encode())
+        
+        cssutils.settings.set('DXImageTransform.Microsoft', True)
+        self.assertEqual(cssutils.parseString(text).cssText,
+                         'a{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=90)}'.encode())
+
+        cssutils.ser.prefs.useDefaults()
+        
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstylerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstylerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstylerule.py	(revision 1126)
@@ -0,0 +1,250 @@
+"""Testcases for cssutils.css.CSSStyleRuleTestCase"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class CSSStyleRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSStyleRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSStyleRule()
+        self.rRO = cssutils.css.CSSStyleRule(readonly=True)
+        self.r_type = cssutils.css.CSSStyleRule.STYLE_RULE
+        self.r_typeString = 'STYLE_RULE'
+
+    def test_init(self):
+        "CSSStyleRule.type and init"
+        super(CSSStyleRuleTestCase, self).test_init()
+        self.assertEqual(u'', self.r.cssText)
+        self.assertEqual(cssutils.css.selectorlist.SelectorList,
+                         type(self.r.selectorList))
+        self.assertEqual(u'', self.r.selectorText)
+        self.assertEqual(cssutils.css.CSSStyleDeclaration,
+                         type(self.r.style))
+        self.assertEqual(self.r, self.r.style.parentRule)
+
+    def test_refs(self):
+        "CSSStyleRule references"
+        s = cssutils.css.CSSStyleRule()
+        sel, style = s.selectorList, s.style
+
+        self.assertEqual(s, sel.parentRule)
+        self.assertEqual(s, style.parentRule)
+
+        s.cssText = 'a { x:1 }'
+        self.assertNotEqual(sel, s.selectorList)
+        self.assertEqual('a', s.selectorList.selectorText)
+        self.assertNotEqual(style, s.style)
+        self.assertEqual('1', s.style.getPropertyValue('x'))
+
+        sel, style = s.selectorList, s.style
+
+        invalids = ('$b { x:2 }', # invalid selector
+                    'c { $x3 }', # invalid style
+                    '/b { 2 }' # both invalid
+                    )
+        for invalid in invalids:
+            try:
+                s.cssText = invalid
+            except xml.dom.DOMException, e:
+                pass
+            self.assertEqual(sel, s.selectorList)
+            self.assertEqual(u'a', s.selectorList.selectorText)
+            self.assertEqual(style, s.style)
+            self.assertEqual(u'1', s.style.getPropertyValue('x'))
+
+        # CHANGING
+        s = cssutils.parseString(u'a {s1: 1}')
+        r = s.cssRules[0]
+        sel1 = r.selectorList
+        st1 = r.style
+
+        # selectorList
+        r.selectorText = 'b'
+        self.assertNotEqual(sel1, r.selectorList)
+        self.assertEqual('b', r.selectorList.selectorText)
+        self.assertEqual('b', r.selectorText)
+        sel1b = r.selectorList
+
+        sel1b.selectorText = 'c'
+        self.assertEqual(sel1b, r.selectorList)
+        self.assertEqual('c', r.selectorList.selectorText)
+        self.assertEqual('c', r.selectorText)
+
+        sel2 = cssutils.css.SelectorList('sel2')
+        s.selectorList = sel2
+        self.assertEqual(sel2, s.selectorList)
+        self.assertEqual('sel2', s.selectorList.selectorText)
+
+        sel2.selectorText = 'sel2b'
+        self.assertEqual('sel2b', sel2.selectorText)
+        self.assertEqual('sel2b', s.selectorList.selectorText)
+
+        s.selectorList.selectorText = 'sel2c'
+        self.assertEqual('sel2c', sel2.selectorText)
+        self.assertEqual('sel2c', s.selectorList.selectorText)
+
+        # style
+        r.style = 's1: 2'
+        self.assertNotEqual(st1, r.style)
+        self.assertEqual('s1: 2', r.style.cssText)
+
+        st2 = cssutils.parseStyle(u's2: 1')
+        r.style = st2
+        self.assertEqual(st2, r.style)
+        self.assertEqual('s2: 1', r.style.cssText)
+
+        # cssText
+        sl, st = r.selectorList, r.style
+        # fails
+        try:
+            r.cssText = '$ {content: "new"}'
+        except xml.dom.SyntaxErr, e:
+            pass
+        self.assertEqual(sl, r.selectorList)
+        self.assertEqual(st, r.style)
+
+        r.cssText = 'a {content: "new"}'
+        self.assertNotEqual(sl, r.selectorList)
+        self.assertNotEqual(st, r.style)
+
+    def test_cssText(self):
+        "CSSStyleRule.cssText"
+        tests = {
+            u'* {}': u'',
+            u'a {}': u'',
+            }
+        self.do_equal_p(tests) # parse
+        #self.do_equal_r(tests) # set cssText # TODO: WHY?
+
+        cssutils.ser.prefs.keepEmptyRules = True
+        tests = {
+            #u'''a{;display:block;float:left}''': 'a {\n    display:block;\n    float:left\n    }', # issue 28
+
+            u'''a\n{color: #000}''': 'a {\n    color: #000\n    }', # issue 4
+            u'''a\n{color: #000000}''': 'a {\n    color: #000\n    }', # issue 4
+            u'''a\n{color: #abc}''': 'a {\n    color: #abc\n    }', # issue 4
+            u'''a\n{color: #abcdef}''': 'a {\n    color: #abcdef\n    }', # issue 4
+            u'''a\n{color: #00a}''': 'a {\n    color: #00a\n    }', # issue 4
+            u'''a\n{color: #1a1a1a}''': 'a {\n    color: #1a1a1a\n    }', # issue 4
+            u'''#id\n{ color: red }''': '#id {\n    color: red\n    }', # issue 3
+            u'''* {}''': None,
+            u'a {}': None,
+            u'b { a: 1; }': u'b {\n    a: 1\n    }',
+            # mix of comments and properties
+            u'c1 {/*1*/a:1;}': u'c1 {\n    /*1*/\n    a: 1\n    }',
+            u'c2 {a:1;/*2*/}': u'c2 {\n    a: 1;\n    /*2*/\n    }',
+            u'd1 {/*0*/}': u'd1 {\n    /*0*/\n    }',
+            u'd2 {/*0*//*1*/}': u'd2 {\n    /*0*/\n    /*1*/\n    }',
+            # comments
+            # TODO: spaces?
+            u'''a/*1*//*2*/,/*3*//*4*/b/*5*//*6*/{color: #000}''':
+                u'a/*1*//*2*/, /*3*//*4*/b/*5*//*6*/ {\n    color: #000\n    }',
+
+            u'''a,b{color: #000}''': 'a, b {\n    color: #000\n    }', # issue 4
+            u'''a\n\r\t\f ,\n\r\t\f b\n\r\t\f {color: #000}''': 'a, b {\n    color: #000\n    }', # issue 4
+            }
+        self.do_equal_p(tests) # parse
+        self.do_equal_r(tests) # set cssText
+
+        tests = {
+            u'''a;''': xml.dom.SyntaxErr,
+            u'''a {{}''': xml.dom.SyntaxErr,
+            u'''a }''': xml.dom.SyntaxErr,
+            }
+        self.do_raise_p(tests) # parse
+        tests.update({
+            u'''/*x*/''': xml.dom.SyntaxErr,
+            u'''a {''': xml.dom.SyntaxErr,
+            # trailing
+            u'''a {}x''': xml.dom.SyntaxErr,
+            u'''a {/**/''': xml.dom.SyntaxErr,
+            u'''a {} ''': xml.dom.SyntaxErr,
+            })
+        self.do_raise_r(tests) # set cssText
+        cssutils.ser.prefs.useDefaults()
+
+    def test_selectorList(self):
+        "CSSStyleRule.selectorList"
+        r = cssutils.css.CSSStyleRule()
+
+        r.selectorList.appendSelector(u'a')
+        self.assertEqual(1, r.selectorList.length)
+        self.assertEqual(u'a', r.selectorText)
+
+        r.selectorList.appendSelector(u' b  ')
+        # only simple selector!
+        self.assertRaises(xml.dom.InvalidModificationErr,
+                          r.selectorList.appendSelector, u'  h1, x ')
+
+        self.assertEqual(2, r.selectorList.length)
+        self.assertEqual(u'a, b', r.selectorText)
+
+    def test_selectorText(self):
+        "CSSStyleRule.selectorText"
+        r = cssutils.css.CSSStyleRule()
+
+        r.selectorText = u'a'
+        self.assertEqual(1, r.selectorList.length)
+        self.assertEqual(u'a', r.selectorText)
+
+        r.selectorText = u' b, h1  '
+        self.assertEqual(2, r.selectorList.length)
+        self.assertEqual(u'b, h1', r.selectorText)
+
+    def test_style(self):
+        "CSSStyleRule.style"
+        d = cssutils.css.CSSStyleDeclaration()
+        self.r.style = d
+        self.assertEqual(d.cssText, self.r.style.cssText)
+
+        # check if parentRule of d is set
+        self.assertEqual(self.r, d.parentRule)
+
+    def test_incomplete(self):
+        "CSSStyleRule (incomplete)"
+        cssutils.ser.prefs.keepEmptyRules = True
+        tests = {
+            u'a {': u'a {}', # no }
+            u'a { font-family: "arial sans': # no "}
+                u'a {\n    font-family: "arial sans"\n    }',
+            u'a { font-family: "arial sans";': # no }
+                u'a {\n    font-family: "arial sans"\n    }',
+            u'''p {
+                color: green;
+                font-family: 'Courier New Times
+                color: red;
+                color: green;
+                }''': u'''p {\n    color: green;\n    color: green\n    }''',
+            # no ;
+            u'''p {
+                color: green;
+                font-family: 'Courier New Times'
+                color: red;
+                color: green;
+                ''': u'''p {\n    color: green;\n    color: green\n    }'''
+        }
+        self.do_equal_p(tests, raising=False) # parse
+        cssutils.ser.prefs.useDefaults()
+
+# TODO:   def test_InvalidModificationErr(self):
+#        "CSSStyleRule.cssText InvalidModificationErr"
+#        self._test_InvalidModificationErr(u'@a a {}')
+
+    def test_reprANDstr(self):
+        "CSSStyleRule.__repr__(), .__str__()"
+        sel=u'a > b + c'
+
+        s = cssutils.css.CSSStyleRule(selectorText=sel)
+
+        self.assertTrue(sel in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(sel == s2.selectorText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstylesheet.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstylesheet.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssstylesheet.py	(revision 1126)
@@ -0,0 +1,879 @@
+# -*- coding: utf-8 -*-
+"""Tests for css.CSSStyleSheet"""
+
+import xml.dom
+import basetest
+import cssutils.css
+
+class CSSStyleSheetTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        super(CSSStyleSheetTestCase, self).setUp()
+        self.r = cssutils.css.CSSStyleSheet() # used by basetest
+        self.s = self.r # used here
+        self.rule = cssutils.css.CSSStyleRule()
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+
+    def test_init(self):
+        "CSSStyleSheet.__init__()"
+        self.assertEqual('text/css', self.s.type)
+        self.assertEqual(False, self.s._readonly)
+        self.assertEqual([], self.s.cssRules)
+        self.assertEqual(False, self.s.disabled)
+        self.assertEqual(None, self.s.href)
+        self.assertEqual(None, self.s.media)
+        self.assertEqual(None, self.s.ownerNode)
+        self.assertEqual(None, self.s.parentStyleSheet)
+        self.assertEqual(u'', self.s.title)
+
+        # check that type is readonly
+        self.assertRaises(AttributeError, self.r.__setattr__, 'href', 'x')
+        self.assertRaises(AttributeError, self.r.__setattr__, 'parentStyleSheet', 'x')
+        self.assertRaises(AttributeError, self.r.__setattr__, 'ownerNode', 'x')
+        self.assertRaises(AttributeError, self.r.__setattr__, 'type', 'x')
+
+    def test_iter(self):
+        "CSSStyleSheet.__iter__()"
+        s = cssutils.css.CSSStyleSheet()
+        s.cssText = '''@import "x";@import "y";@namespace "u";'''
+        types = [cssutils.css.CSSRule.IMPORT_RULE,
+                 cssutils.css.CSSRule.IMPORT_RULE,
+                 cssutils.css.CSSRule.NAMESPACE_RULE]
+        for i, rule in enumerate(s):
+            self.assertEqual(rule, s.cssRules[i])
+            self.assertEqual(rule.type, types[i])
+
+    def test_refs(self):
+        """CSSStylesheet references"""
+        s = cssutils.parseString('a {}')
+        rules = s.cssRules
+        self.assertEqual(s.cssRules[0].parentStyleSheet, s)
+        self.assertEqual(rules[0].parentStyleSheet, s)
+
+        # set cssText
+        s.cssText = 'b{}'
+
+        # from 0.9.7b1
+        self.assertNotEqual(rules, s.cssRules)
+
+        # set cssRules
+        s.cssRules = cssutils.parseString('''
+            @charset "ascii";
+            /**/
+            @import "x";
+            @namespace "http://example.com/ns0";
+            @media all {
+                a { color: green; }
+                }
+            @font-face {
+                font-family: x;
+                }
+            @page {
+                font-family: Arial;
+                }
+            @x;
+            b {}').cssRules''').cssRules
+        # new object
+        self.assertNotEqual(rules, s.cssRules)
+        for i, r in enumerate(s.cssRules):
+            self.assertEqual(r.parentStyleSheet, s)
+
+        # namespaces
+        s = cssutils.parseString('@namespace "http://example.com/ns1"; a {}')
+        namespaces = s.namespaces
+        self.assertEqual(s.namespaces.items(), [(u'', 'http://example.com/ns1')])
+        s.cssText = '@namespace x "http://example.com/ns2"; x|a {}'
+        # not anymore!
+        self.assertNotEqual(namespaces, s.namespaces)
+        self.assertEqual(s.namespaces.items(), [(u'x', 'http://example.com/ns2')])
+
+        # variables
+        s = cssutils.parseString(u'@variables { a:1}')
+        vars1 = s.variables
+        self.assertEqual(vars1[u'a'], u'1')
+
+        s = cssutils.parseString(u'@variables { a:2}')
+        vars2 = s.variables
+        self.assertNotEqual(vars1, vars2)
+        self.assertEqual(vars1[u'a'], u'1')
+        self.assertEqual(vars2[u'a'], u'2')
+
+    def test_cssRules(self):
+        "CSSStyleSheet.cssRules"
+        s = cssutils.parseString('/*1*/a {x:1}')
+        self.assertEqual(2, s.cssRules.length)
+        del s.cssRules[0]
+        self.assertEqual(1, s.cssRules.length)
+        s.cssRules.append('/*2*/')
+        self.assertEqual(2, s.cssRules.length)
+        s.cssRules.extend(cssutils.parseString('/*3*/x {y:2}').cssRules)
+        self.assertEqual(4, s.cssRules.length)
+        self.assertEqual(u'a {\n    x: 1\n    }\n/*2*/\n/*3*/\nx {\n    y: 2\n    }'.encode(),
+                         s.cssText)
+
+        for r in s.cssRules:
+            self.assertEqual(r.parentStyleSheet, s)
+
+    def test_cssText(self):
+        "CSSStyleSheet.cssText"
+        tests = {
+            '': ''.encode(),
+            # @charset
+            '@charset "ascii";\n@import "x";':
+                '@charset "ascii";\n@import "x";'.encode(),
+            '@charset "ascii";\n@media all {}': '@charset "ascii";'.encode(),
+            '@charset "ascii";\n@x;': '@charset "ascii";\n@x;'.encode(),
+            '@charset "ascii";\na {\n    x: 1\n    }':
+                '@charset "ascii";\na {\n    x: 1\n    }'.encode(),
+            # @import
+            '@x;\n@import "x";': '@x;\n@import "x";'.encode(),
+            '@import "x";\n@import "y";': '@import "x";\n@import "y";'.encode(),
+            '@import "x";\n@media all {}': '@import "x";'.encode(),
+            '@import "x";\n@x;': '@import "x";\n@x;'.encode(),
+            '@import "x";\na {\n    x: 1\n    }':
+                '@import "x";\na {\n    x: 1\n    }'.encode(),
+            # @namespace
+            '@x;\n@namespace a "x";': '@x;\n@namespace a "x";'.encode(),
+            '@namespace a "x";\n@namespace b "y";':
+                '@namespace a "x";\n@namespace b "y";'.encode(),
+            '@import "x";\n@namespace a "x";\n@media all {}':
+                '@import "x";\n@namespace a "x";'.encode(),
+            '@namespace a "x";\n@x;': '@namespace a "x";\n@x;'.encode(),
+            '@namespace a "x";\na {\n    x: 1\n    }':
+                '@namespace a "x";\na {\n    x: 1\n    }'.encode(),
+            """@namespace url("e1");
+                @namespace url("e2");
+                @namespace x url("x1");
+                @namespace x url("x2");
+                test{color: green}
+                x|test {color: green}""": """@namespace "e2";
+@namespace x "x2";
+test {
+    color: green
+    }
+x|test {
+    color: green
+    }""".encode()
+#            ur'\1 { \2: \3 }': ur'''\x01 {
+#    \x02: \x03
+#    }''',
+#            ur'''
+#            \@ { \@: \@ }
+#            \1 { \2: \3 }
+#            \{{\::\;;}
+#            ''': ur'''\@ {
+#    \@: \@
+#    }
+#\1 {
+#    \2: \3
+#    }
+#\{
+#    {\:: \;
+#    }'''
+            }
+        self.do_equal_r(tests)
+
+        tests = {
+            '': None,
+            # @charset
+            '@charset "ascii";\n@import "x";': None,
+            '@charset "ascii";\n@media all {}': '@charset "ascii";',
+            '@charset "ascii";\n@x;': None,
+            '@charset "ascii";\na {\n    x: 1\n    }': None,
+            # @import
+            '@x;\n@import "x";': None,
+            '@import "x";\n@import "y";': None,
+            '@import "x";\n@media all {}': '@import "x";',
+            '@import "x";\n@x;': None,
+            '@import "x";\na {\n    x: 1\n    }': None,
+            # @namespace
+            '@x;\n@namespace a "x";': None,
+            '@namespace a "x";\n@namespace b "y";': None,
+            '@import "x";\n@namespace a "x";\n@media all {}':
+                '@import "x";\n@namespace a "x";',
+            '@namespace a "x";\n@x;': None,
+            '@namespace a "x";\na {\n    x: 1\n    }': None,
+            """@namespace url("e1");
+                @namespace url("e2");
+                @namespace x url("x1");
+                @namespace x url("x2");
+                test{color: green}
+                x|test {color: green}""": """@namespace "e2";
+@namespace x "x2";
+test {
+    color: green
+    }
+x|test {
+    color: green
+    }"""
+#            ur'\1 { \2: \3 }': ur'''\x01 {
+#    \x02: \x03
+#    }''',
+#            ur'''
+#            \@ { \@: \@ }
+#            \1 { \2: \3 }
+#            \{{\::\;;}
+#            ''': ur'''\@ {
+#    \@: \@
+#    }
+#\1 {
+#    \2: \3
+#    }
+#\{
+#    {\:: \;
+#    }'''
+            }
+        self.do_equal_p(tests)
+
+        s = cssutils.css.CSSStyleSheet()
+        s.cssText = u'''@charset "ascii";@import "x";@namespace a "x";
+        @media all {/*1*/}@page {margin: 0}a {\n    x: 1\n    }@unknown;/*comment*/'''
+        for r in s.cssRules:
+            self.assertEqual(s, r.parentStyleSheet)
+
+    def test_cssText_HierarchyRequestErr(self):
+        "CSSStyleSheet.cssText HierarchyRequestErr"
+        tests = {
+            # @charset: only one and always 1st
+            u' @charset "utf-8";': xml.dom.HierarchyRequestErr,
+            u'@charset "ascii";@charset "ascii";': xml.dom.HierarchyRequestErr,            u'/*c*/@charset "ascii";': xml.dom.HierarchyRequestErr,
+            u'@import "x"; @charset "ascii";': xml.dom.HierarchyRequestErr,
+            u'@namespace a "x"; @charset "ascii";': xml.dom.HierarchyRequestErr,
+            u'@media all {} @charset "ascii";': xml.dom.HierarchyRequestErr,
+            u'@page {} @charset "ascii";': xml.dom.HierarchyRequestErr,
+            u'a {} @charset "ascii";': xml.dom.HierarchyRequestErr,
+
+            # @import: before @namespace, @media, @page, sr
+            u'@namespace a "x"; @import "x";': xml.dom.HierarchyRequestErr,
+            u'@media all {} @import "x";': xml.dom.HierarchyRequestErr,
+            u'@page {} @import "x";': xml.dom.HierarchyRequestErr,
+            u'a {} @import "x";': xml.dom.HierarchyRequestErr,
+
+            # @namespace: before @media, @page, sr
+            u'@media all {} @namespace a "x";': xml.dom.HierarchyRequestErr,
+            u'@page {} @namespace a "x";': xml.dom.HierarchyRequestErr,
+            u'a {} @namespace a "x";': xml.dom.HierarchyRequestErr,
+            }
+        self.do_raise_r(tests)
+        self.do_raise_p(tests)
+
+    def test_cssText_SyntaxErr(self):
+        """CSSStyleSheet.cssText SyntaxErr
+
+        for single {, } or ;
+        """
+        tests = {
+            u'{': xml.dom.SyntaxErr,
+            u'}': xml.dom.SyntaxErr,
+            u';': xml.dom.SyntaxErr,
+            u'@charset "ascii";{': xml.dom.SyntaxErr,
+            u'@charset "ascii";}': xml.dom.SyntaxErr,
+            u'@charset "ascii";;': xml.dom.SyntaxErr,
+            }
+        self.do_raise_r(tests)
+        self.do_raise_p(tests)
+
+    def test_encoding(self):
+        "CSSStyleSheet.encoding"
+        self.s.cssText=''
+        self.assertEqual('utf-8', self.s.encoding)
+
+        self.s.encoding = 'ascii'
+        self.assertEqual('ascii', self.s.encoding)
+        self.assertEqual(1, self.s.cssRules.length)
+        self.assertEqual('ascii', self.s.cssRules[0].encoding)
+
+        self.s.encoding = None
+        self.assertEqual('utf-8', self.s.encoding)
+        self.assertEqual(0, self.s.cssRules.length)
+
+        self.s.encoding = 'UTF-8'
+        self.assertEqual('utf-8', self.s.encoding)
+        self.assertEqual(1, self.s.cssRules.length)
+
+        self.assertRaises(xml.dom.SyntaxErr, self.s._setEncoding,
+                          'INVALID ENCODING')
+        self.assertEqual('utf-8', self.s.encoding)
+        self.assertEqual(1, self.s.cssRules.length)
+
+    def test_namespaces1(self):
+        "CSSStyleSheet.namespaces.namespaces"
+        # tests for namespaces internal methods
+        s = cssutils.css.CSSStyleSheet()
+        self.assertEqual(0, len(s.namespaces))
+
+        css = u'''@namespace "default";
+@namespace ex "example";
+@namespace ex2 "example";
+ex2|x { top: 0 }'''
+        expcss = u'''@namespace "default";
+@namespace ex2 "example";
+ex2|x {
+    top: 0
+    }'''
+        s.cssText = css
+        self.assertEqual(s.cssText, expcss.encode())
+        self.assertEqual(s.namespaces.namespaces,
+                         { u'': u'default', u'ex2': u'example'})
+
+        # __contains__
+        self.assertTrue('' in s.namespaces)
+        self.assertTrue('ex2' in s.namespaces)
+        self.assertFalse('NOTSET' in s.namespaces)
+        # __delitem__
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          s.namespaces.__delitem__, 'ex2')
+        s.namespaces['del'] = 'del'
+        del s.namespaces['del']
+        self.assertRaises(xml.dom.NamespaceErr, s.namespaces.__getitem__, 'del')
+        # __getitem__
+        self.assertEqual('default', s.namespaces[''])
+        self.assertEqual('example', s.namespaces['ex2'])
+        self.assertRaises(xml.dom.NamespaceErr, s.namespaces.__getitem__, 'UNSET')
+        # __iter__
+        self.assertEqual(['', 'ex2'], sorted(list(s.namespaces)))
+        # __len__
+        self.assertEqual(2, len(s.namespaces))
+        # __setitem__
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          s.namespaces.__setitem__, 'ex2', 'NEWURI')
+        s.namespaces['n1'] = 'new'
+        self.assertEqual(s.namespaces.namespaces,
+                         { u'': u'default', u'ex2': u'example', u'n1': 'new'})
+        s.namespaces['n'] = 'new' # replaces prefix!
+        self.assertEqual(s.namespaces.namespaces,
+                         { u'': u'default', u'ex2': u'example', u'n': 'new'})
+        # prefixForNamespaceURI
+        self.assertEqual('', s.namespaces.prefixForNamespaceURI('default'))
+        self.assertEqual('ex2', s.namespaces.prefixForNamespaceURI('example'))
+        self.assertRaises(IndexError,
+                          s.namespaces.prefixForNamespaceURI, 'UNSET')
+        # .keys
+        self.assertEqual(set(s.namespaces.keys()), set(['', 'ex2', 'n']))
+        # .get
+        self.assertEqual('x', s.namespaces.get('UNKNOWN', 'x'))
+        self.assertEqual('example', s.namespaces.get('ex2', 'not used defa'))
+
+    def test_namespaces2(self):
+        "CSSStyleSheet.namespaces"
+        # tests using CSSStyleSheet.namespaces
+
+        s = cssutils.css.CSSStyleSheet()
+        css = '@namespace n "new";'
+        # doubles will be removed
+        s.insertRule(css + css)
+        self.assertEqual(s.cssText, css.encode())
+        r = cssutils.css.CSSNamespaceRule(prefix='ex2', namespaceURI='example')
+        s.insertRule(r)
+        r = cssutils.css.CSSNamespaceRule(namespaceURI='default')
+        s.insertRule(r)
+
+        expcss = '''@namespace n "new";
+@namespace ex2 "example";
+@namespace "default";'''
+        self.assertEqual(s.cssText, expcss.encode())
+        r.prefix = 'DEFAULT'
+        expcss = '''@namespace n "new";
+@namespace ex2 "example";
+@namespace DEFAULT "default";'''
+        self.assertEqual(s.cssText, expcss.encode())
+
+        # CSSMediaRule
+        self.assertRaises(xml.dom.NamespaceErr, s.add, '@media all {x|a {left: 0}}')
+        mcss = '@media all {\n    ex2|SEL1 {\n        left: 0\n        }\n    }'
+        s.add(mcss)
+        expcss += '\n' + mcss
+        self.assertEqual(s.cssText, expcss.encode())
+
+        # CSSStyleRule
+        self.assertRaises(xml.dom.NamespaceErr, s.add, 'x|a {top: 0}')
+        scss = 'n|SEL2 {\n    top: 0\n    }'
+        s.add(scss)
+        expcss += '\n' + scss
+        self.assertEqual(s.cssText, expcss.encode())
+
+        mr = s.cssRules[3]
+        sr = s.cssRules[4]
+
+        # SelectorList @media
+        self.assertRaises(xml.dom.NamespaceErr,
+                          mr.cssRules[0]._setSelectorText, 'x|b')
+        oldsel, newsel = mr.cssRules[0].selectorText, 'n|SEL3, a'
+        mr.cssRules[0].selectorText = newsel
+        expcss = expcss.replace(oldsel, newsel)
+        self.assertEqual(s.cssText, expcss.encode())
+        # SelectorList stylerule
+        self.assertRaises(xml.dom.NamespaceErr,
+                          sr._setSelectorText, 'x|b')
+        oldsel, newsel = sr.selectorText, 'ex2|SEL4, a'
+        sr.selectorText = newsel
+        expcss = expcss.replace(oldsel, newsel)
+        self.assertEqual(s.cssText, expcss.encode())
+
+        # Selector @media
+        self.assertRaises(xml.dom.NamespaceErr,
+                          mr.cssRules[0].selectorList.append, 'x|b')
+        oldsel, newsel = mr.cssRules[0].selectorText, 'ex2|SELMR'
+        mr.cssRules[0].selectorList.append(newsel)
+        expcss = expcss.replace(oldsel, oldsel + ', ' + newsel)
+        self.assertEqual(s.cssText, expcss.encode())
+        # Selector stylerule
+        self.assertRaises(xml.dom.NamespaceErr,
+                          sr.selectorList.append, 'x|b')
+        oldsel, newsel = sr.selectorText, 'ex2|SELSR'
+        sr.selectorList.append(newsel)
+        expcss = expcss.replace(oldsel, oldsel + ', ' + newsel)
+        self.assertEqual(s.cssText, expcss.encode())
+
+        self.assertEqual(s.cssText, u'''@namespace n "new";
+@namespace ex2 "example";
+@namespace DEFAULT "default";
+@media all {
+    n|SEL3, a, ex2|SELMR {
+        left: 0
+        }
+    }
+ex2|SEL4, a, ex2|SELSR {
+    top: 0
+    }'''.encode())
+
+    def test_namespaces3(self):
+        "CSSStyleSheet.namespaces 3"
+        # tests setting namespaces with new {}
+        s = cssutils.css.CSSStyleSheet()
+        css = u'h|a { top: 0 }'
+        self.assertRaises(xml.dom.NamespaceErr, s.add, css)
+
+        s.add('@namespace x "html";')
+        self.assertTrue(s.namespaces['x'] == 'html')
+
+        r = cssutils.css.CSSStyleRule()
+        r.cssText = ((css, {'h': 'html'}))
+        s.add(r) # uses x as set before! h is temporary only
+        self.assertEqual(s.cssText, '@namespace x "html";\nx|a {\n    top: 0\n    }'.encode())
+
+        # prefix is now "x"!
+        self.assertRaises(xml.dom.NamespaceErr, r.selectorList.append, 'h|b')
+        self.assertRaises(xml.dom.NamespaceErr, r.selectorList.append, 'y|b')
+        s.namespaces['y'] = 'html'
+        r.selectorList.append('y|b')
+        self.assertEqual(s.cssText,
+            u'@namespace y "html";\ny|a, y|b {\n    top: 0\n    }'.encode())
+
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          s.namespaces.__delitem__, 'y')
+        self.assertEqual(s.cssText,
+            u'@namespace y "html";\ny|a, y|b {\n    top: 0\n    }'.encode())
+
+        s.cssRules[0].prefix = ''
+        self.assertEqual(s.cssText,
+            u'@namespace "html";\na, b {\n    top: 0\n    }'.encode())
+
+        # remove need of namespace
+        s.cssRules[0].prefix = 'x'
+        s.cssRules[1].selectorText = 'a, b'
+        self.assertEqual(s.cssText,
+            u'@namespace x "html";\na, b {\n    top: 0\n    }'.encode())
+
+
+    def test_namespaces4(self):
+        "CSSStyleSheet.namespaces 4"
+        # tests setting namespaces with new {}
+        s = cssutils.css.CSSStyleSheet()
+        self.assertEqual({}, s.namespaces.namespaces)
+
+        s.namespaces.namespaces['a'] = 'no setting possible'
+        self.assertEqual({}, s.namespaces.namespaces)
+
+        s.namespaces[None] = 'default'
+        self.assertEqual({u'': 'default'}, s.namespaces.namespaces)
+
+        del s.namespaces['']
+        self.assertEqual({}, s.namespaces.namespaces)
+
+        s.namespaces[''] = 'default'
+        self.assertEqual({u'': 'default'}, s.namespaces.namespaces)
+
+        del s.namespaces[None]
+        self.assertEqual({}, s.namespaces.namespaces)
+
+        s.namespaces['p'] = 'uri'
+        # cannot use namespaces.namespaces
+        del s.namespaces.namespaces['p']
+        self.assertEqual({u'p': 'uri'}, s.namespaces.namespaces)
+
+        self.assertRaisesMsg(xml.dom.NamespaceErr, u"Prefix undefined not found.",
+                             s.namespaces.__delitem__, 'undefined')
+
+    def test_namespaces5(self):
+        "CSSStyleSheet.namespaces 5"
+        # unknown namespace
+        s = cssutils.parseString('a|a { color: red }')
+        self.assertEqual(s.cssText, ''.encode())
+
+        s = cssutils.css.CSSStyleSheet()
+        self.assertRaisesMsg(xml.dom.NamespaceErr, "Prefix a not found.",
+                             s._setCssText, 'a|a { color: red }')
+
+    def test_deleteRuleIndex(self):
+        "CSSStyleSheet.deleteRule(index)"
+        self.s.cssText = u'@charset "ascii"; @import "x"; @x; a {\n    x: 1\n    }@y;'
+        self.assertEqual(5, self.s.cssRules.length)
+
+        self.assertRaises(xml.dom.IndexSizeErr, self.s.deleteRule, 5)
+
+        # end -1
+        # check parentStyleSheet
+        r = self.s.cssRules[-1]
+        self.assertEqual(self.s, r.parentStyleSheet)
+        self.s.deleteRule(-1)
+        self.assertEqual(None, r.parentStyleSheet)
+
+        self.assertEqual(4, self.s.cssRules.length)
+        self.assertEqual(
+            u'@charset "ascii";\n@import "x";\n@x;\na {\n    x: 1\n    }'.encode(), self.s.cssText)
+        # beginning
+        self.s.deleteRule(0)
+        self.assertEqual(3, self.s.cssRules.length)
+        self.assertEqual(u'@import "x";\n@x;\na {\n    x: 1\n    }'.encode(), self.s.cssText)
+        # middle
+        self.s.deleteRule(1)
+        self.assertEqual(2, self.s.cssRules.length)
+        self.assertEqual(u'@import "x";\na {\n    x: 1\n    }'.encode(), self.s.cssText)
+        # end
+        self.s.deleteRule(1)
+        self.assertEqual(1, self.s.cssRules.length)
+        self.assertEqual(u'@import "x";'.encode(), self.s.cssText)
+
+    def test_deleteRule(self):
+        "CSSStyleSheet.deleteRule(rule)"
+        s = cssutils.css.CSSStyleSheet()
+        s.cssText='''
+        @namespace x "http://example.com";
+        a { color: red; }
+        b { color: blue; }
+        c { color: green; }
+        '''
+        n, s1, s2, s3 = s.cssRules
+
+        r = cssutils.css.CSSStyleRule()
+        self.assertRaises(xml.dom.IndexSizeErr, s.deleteRule, r)
+
+        self.assertEqual(4, s.cssRules.length)
+        s.deleteRule(n)
+        self.assertEqual(3, s.cssRules.length)
+        self.assertEqual(s.cssText, 'a {\n    color: red\n    }\nb {\n    color: blue\n    }\nc {\n    color: green\n    }'.encode())
+        self.assertRaises(xml.dom.IndexSizeErr, s.deleteRule, n)
+        s.deleteRule(s2)
+        self.assertEqual(2, s.cssRules.length)
+        self.assertEqual(s.cssText, 'a {\n    color: red\n    }\nc {\n    color: green\n    }'.encode())
+        self.assertRaises(xml.dom.IndexSizeErr, s.deleteRule, s2)
+
+    def _gets(self):
+        # complete
+        self.cr = cssutils.css.CSSCharsetRule('ascii')
+        self.c = cssutils.css.CSSComment(u'/*c*/')
+        self.ur = cssutils.css.CSSUnknownRule('@x;')
+        self.ir = cssutils.css.CSSImportRule('x')
+        self.nr = cssutils.css.CSSNamespaceRule('uri', 'p')
+        self.mr = cssutils.css.CSSMediaRule()
+        self.mr.cssText = u'@media all { @m; }'
+        self.pr = cssutils.css.CSSPageRule()
+        self.pr.style = u'margin: 0;'
+        self.sr = cssutils.css.CSSStyleRule()
+        self.sr.cssText = 'a {\n    x: 1\n    }'
+
+        s = cssutils.css.CSSStyleSheet()
+        s.insertRule(self.cr) # 0
+        s.insertRule(self.ir) # 1
+        s.insertRule(self.nr) # 2
+        s.insertRule(self.mr) # 3
+        s.insertRule(self.sr) # 4
+        s.insertRule(self.mr) # 5
+        s.insertRule(self.pr) # 6
+        s.insertRule(self.sr) # 7
+        self.assertEqual(u'@charset "ascii";\n@import url(x);\n@namespace p "uri";\n@media all {\n    @m;\n    }\na {\n    x: 1\n    }\n@media all {\n    @m;\n    }\n@page {\n    margin: 0\n    }\na {\n    x: 1\n    }'.encode(), s.cssText)
+        return s, s.cssRules.length
+
+    def test_add(self):
+        "CSSStyleSheet.add()"
+        full = cssutils.css.CSSStyleSheet()
+        sheet = cssutils.css.CSSStyleSheet()
+        css = ['@charset "ascii";',
+               '@import "x";',
+               '@namespace p "u";',
+               '@page {\n    left: 0\n    }',
+               '@font-face {\n    src: local(x)\n    }',
+               '@media all {\n    a {\n        color: red\n        }\n    }',
+               'a {\n    color: green\n    }',
+               '/*comment*/',
+               '@x;'
+               ]
+
+        fullcss = u'\n'.join(css)
+        full.cssText = fullcss
+        self.assertEqual(full.cssText, fullcss.encode())
+        for i, line in enumerate(css):
+            # sheet without same ruletype
+            before = css[:i]
+            after = css[i+1:]
+            sheet.cssText = u''.join(before + after)
+
+            index = sheet.add(line)
+            if i < 3:
+                # specific insertion point
+                self.assertEqual(fullcss.encode(), sheet.cssText)
+                self.assertEqual(i, index)
+            else:
+                # end of sheet
+                expected = before
+                expected.extend(after)
+                expected.append(line)
+                self.assertEqual(u'\n'.join(expected).encode(), sheet.cssText)
+                self.assertEqual(len(expected)-1, index) # no same rule present
+
+            # sheet with the same ruletype
+            if i == 1: line = '@import "x2";'
+            if i == 2: line = '@namespace p2 "u2";'
+
+            full.cssText = fullcss
+            index = full.add(line)
+            if i < 1:
+                self.assertEqual(fullcss.encode(), sheet.cssText)
+                self.assertEqual(i, index) # no same rule present
+            else:
+                if i < 3:
+                    # in order
+                    expected = css[:i+1] # including same rule
+                    expected.append(line)
+                    expected.extend(css[i+1:])
+                    expectedindex = i+1
+                else:
+                    # just appended as no order needed
+                    expected = css[:]
+                    expected.append(line)
+                    expectedindex = len(expected) - 1
+
+                self.assertEqual(u'\n'.join(expected).encode(), full.cssText)
+                self.assertEqual(expectedindex, index) # no same rule present
+
+    def test_addimport(self):
+        p = cssutils.CSSParser(fetcher=lambda url: (None, '/**/'))
+
+        cssrulessheet = p.parseString('@import "example.css";')
+        imports = (
+            '@import "example.css";', # string
+            cssutils.css.CSSImportRule(href="example.css"), # CSSRule
+            cssrulessheet.cssRules # CSSRuleList
+            )
+        for imp in imports:
+            sheet = p.parseString('', href='http://example.com')
+            sheet.add(imp)
+            added = sheet.cssRules[0]
+            self.assertEqual(sheet, added.parentStyleSheet)
+            self.assertEqual(u'example.css', added.href)
+            self.assertEqual(u'utf-8', added.styleSheet.encoding)
+            self.assertEqual(u'/**/'.encode(), added.styleSheet.cssText)
+
+        cssrulessheet = p.parseString('@import "example.css";')
+        imports = (
+            ('@import "example.css";', 'ascii'), # string
+            (cssutils.css.CSSImportRule(href="example.css"), 'ascii'), # CSSRule
+            # got encoding from old parent already
+            (cssrulessheet.cssRules, 'utf-8') # CSSRuleList
+            )
+        for imp, enc in imports:
+            sheet = p.parseString('', href='http://example.com', encoding='ascii')
+            sheet.add(imp)
+            added = sheet.cssRules[1]
+            self.assertEqual(sheet, added.parentStyleSheet)
+            self.assertEqual(u'example.css', added.href)
+            self.assertEqual(enc, added.styleSheet.encoding)
+            if enc == 'ascii':
+                self.assertEqual(u'@charset "ascii";\n/**/'.encode(), added.styleSheet.cssText)
+            else:
+                self.assertEqual(u'/**/'.encode(), added.styleSheet.cssText)
+
+        # if styleSheet is already there encoding is not set new
+        impsheet = p.parseString('@import "example.css";')
+        imp = impsheet.cssRules[0]
+        sheet = p.parseString('', href='http://example.com', encoding='ascii')
+        sheet.add(imp)
+        added = sheet.cssRules[1]
+        self.assertEqual(sheet, added.parentStyleSheet)
+        self.assertEqual(u'example.css', added.href)
+        self.assertEqual(u'utf-8', added.styleSheet.encoding)
+        self.assertEqual(u'/**/'.encode(), added.styleSheet.cssText)
+
+    def test_insertRule(self):
+        "CSSStyleSheet.insertRule()"
+        s, L = self._gets()
+
+        # INVALID index
+        self.assertRaises(xml.dom.IndexSizeErr,
+                  s.insertRule, self.sr, -1)
+        self.assertRaises(xml.dom.IndexSizeErr,
+                  s.insertRule, self.sr, s.cssRules.length + 1)
+        #   check if rule is really not in
+        self.assertEqual(L, s.cssRules.length)
+
+        # insert string
+        s.insertRule('a {}')
+        self.assertEqual(L+1, s.cssRules.length)
+        # insert rule
+        s.insertRule(self.sr)
+        self.assertEqual(L+2, s.cssRules.length)
+        # insert rulelist
+        s2, L2 = self._gets()
+        rulelist = s2.cssRules
+        del rulelist[:-2]
+        s.insertRule(rulelist)
+        self.assertEqual(L+2 + 2, s.cssRules.length)
+
+    def _insertRule(self, rules, notbefore, notafter, anywhere,
+                    checkdoubles=True):
+        """
+        helper
+        test if any rule in rules cannot be inserted before rules in before
+        or after rules in after but before and after rules in anywhere
+        """
+        for rule in rules:
+            for r in notbefore:
+                s = cssutils.css.CSSStyleSheet()
+                s.insertRule(r)
+                self.assertRaises(xml.dom.HierarchyRequestErr,
+                                  s.insertRule, rule, 0)
+                s = cssutils.css.CSSStyleSheet()
+                s.add(r)
+                self.assertRaises(xml.dom.HierarchyRequestErr,
+                                  s.insertRule, rule, 0)
+            for r in notafter:
+                s = cssutils.css.CSSStyleSheet()
+                s.insertRule(r)
+                self.assertRaises(xml.dom.HierarchyRequestErr,
+                                  s.insertRule, rule, 1)
+                s = cssutils.css.CSSStyleSheet()
+                s.add(r)
+                s.add(rule) # never raises
+                self.assertEqual(s, r.parentStyleSheet)
+
+            for r in anywhere:
+                s = cssutils.css.CSSStyleSheet()
+                s.insertRule(r)
+                s.insertRule(rule, 0) # before
+                s.insertRule(rule) # after
+                if checkdoubles:
+                    self.assertEqual(s.cssRules.length, 3)
+                self.assertEqual(s, r.parentStyleSheet)
+
+    def test_insertRule_charset(self):
+        "CSSStyleSheet.insertRule(@charset)"
+        s, L = self._gets()
+        notbefore = (self.cr,)
+        notafter = (self.cr, self.ir, self.nr, self.mr, self.pr, self.sr,
+                    self.c, self.ur)
+        anywhere = ()
+        self._insertRule((self.cr,),
+                         notbefore, notafter, anywhere)
+
+    def test_insertRule_import(self):
+        "CSSStyleSheet.insertRule(@import)"
+        s, L = self._gets()
+        notbefore = (self.cr,)
+        notafter = (self.nr, self.pr, self.mr, self.sr)
+        anywhere = (self.c, self.ur, self.ir)
+        self._insertRule((self.ir,),
+                         notbefore, notafter, anywhere)
+
+    def test_insertRule_namespace(self):
+        "CSSStyleSheet.insertRule(@namespace)"
+        s, L = self._gets()
+        notbefore = (self.cr, self.ir)
+        notafter = (self.pr, self.mr, self.sr)
+        anywhere = (self.c, self.ur, self.nr)
+        self._insertRule((self.nr,), notbefore, notafter, anywhere,
+                         checkdoubles=False)
+
+    def test_insertRule_media_page_style(self):
+        "CSSStyleSheet.insertRule(@media, @page, stylerule)"
+        s, L = self._gets()
+        notbefore = (self.cr, self.ir, self.nr)
+        notafter = ()
+        anywhere = (self.c, self.ur, self.mr, self.pr, self.sr)
+        self._insertRule((self.pr, self.mr, self.sr),
+                         notbefore, notafter, anywhere)
+
+    def test_insertRule_unknownandcomment(self):
+        "CSSStyleSheet.insertRule(@ unknown, comment)"
+        s, L = self._gets()
+        notbefore = (self.cr,)
+        notafter = ()
+        anywhere = (self.c, self.ur, self.ir, self.nr, self.mr, self.pr,
+                    self.sr)
+        self._insertRule((self.ur,),
+                         notbefore, notafter, anywhere)
+
+    def test_HTMLComments(self):
+        "CSSStyleSheet CDO CDC"
+        css = u'''body { color: red }
+<!-- comment -->
+body { color: blue }
+body { color: pink }
+<!-- comment -->
+body { color: green }
+'''
+        exp = u'''body {
+    color: red
+    }
+body {
+    color: pink
+    }'''
+        sheet = cssutils.parseString(css)
+        self.assertEqual(sheet.cssText, exp.encode())
+
+    def test_incomplete(self):
+        "CSSStyleRule (incomplete)"
+        tests = {
+            u'@import "a': u'@import "a";', # no }
+            u'a { x: 1': u'a {\n    x: 1\n    }', # no }
+            u'a { font-family: "arial sans': # no "
+                u'a {\n    font-family: "arial sans"\n    }',
+        }
+        self.do_equal_p(tests) # parse
+
+    def test_NoModificationAllowedErr(self):
+        "CSSStyleSheet NoModificationAllowedErr"
+        css = cssutils.css.CSSStyleSheet(readonly=True)
+
+        self.assertEqual(True, css._readonly) # internal...
+
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          css._setCssText, u'@x;')
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          css.insertRule, self.rule)
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          css.insertRule, self.rule, 0)
+        self.assertRaises(xml.dom.NoModificationAllowedErr,
+                          css.deleteRule, 0)
+
+    def test_reprANDstr(self):
+        "CSSStyleSheet.__repr__(), .__str__()"
+        href = 'file:foo.css'
+        title = 'title-of-css'
+
+        s = cssutils.css.CSSStyleSheet(href=href, title=title)
+
+        self.assertTrue(href in str(s))
+        self.assertTrue(title in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(href == s2.href)
+        self.assertTrue(title == s2.title)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_marginrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_marginrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_marginrule.py	(revision 1126)
@@ -0,0 +1,97 @@
+"""Testcases for cssutils.css.CSSPageRule"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class MarginRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(MarginRuleTestCase, self).setUp()
+        
+        cssutils.ser.prefs.useDefaults()
+        self.r = cssutils.css.MarginRule()
+        self.rRO = cssutils.css.MarginRule(readonly=True)
+        self.r_type = cssutils.css.MarginRule.MARGIN_RULE
+        self.r_typeString = 'MARGIN_RULE'
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+            
+    def test_init(self):
+        "MarginRule.__init__()"
+        
+        r = cssutils.css.MarginRule()
+        self.assertEqual(r.margin, None)
+        self.assertEqual(r.atkeyword, None)
+        self.assertEqual(r._keyword, None)
+        self.assertEqual(r.style.cssText, u'')
+        self.assertEqual(r.cssText, u'')
+
+        r = cssutils.css.MarginRule(margin=u'@TOP-left')
+        self.assertEqual(r.margin, u'@top-left')
+        self.assertEqual(r.atkeyword, u'@top-left')
+        self.assertEqual(r._keyword, u'@TOP-left')
+        self.assertEqual(r.style.cssText, u'')
+        self.assertEqual(r.cssText, u'')
+        
+        self.assertRaises(xml.dom.InvalidModificationErr, cssutils.css.MarginRule, u'@x')
+    
+    def test_InvalidModificationErr(self):
+        "MarginRule.cssText InvalidModificationErr"
+        # TODO: !!!
+#        self._test_InvalidModificationErr(u'@top-left')
+#        tests = {
+#            u'@x {}': xml.dom.InvalidModificationErr,
+#            }
+#        self.do_raise_r(tests)
+
+    def test_incomplete(self):
+        "MarginRule (incomplete)"
+        # must be inside @page as not valid outside
+        tests = {
+            u'@page { @top-left { ': u'', # no } and no content
+            u'@page { @top-left { /*1*/ ': u'', # no } and no content
+            u'@page { @top-left { color: red':
+                u'@page {\n    @top-left {\n        color: red\n        }\n    }'
+        }
+        self.do_equal_p(tests) # parse
+
+    def test_cssText(self):
+        tests = {
+            u'@top-left {}': u'',
+            u'@top-left { /**/ }': u'',
+            u'@top-left { color: red }': u'@top-left {\n    color: red\n    }',
+            u'@top-left{color:red;}': u'@top-left {\n    color: red\n    }',
+            u'@top-left{color:red}': u'@top-left {\n    color: red\n    }',
+            u'@top-left { color: red; left: 0 }': u'@top-left {\n    color: red;\n    left: 0\n    }'
+        }
+        self.do_equal_r(tests)
+        
+        # TODO
+        tests.update({
+            # false selector
+#            u'@top-left { color:': xml.dom.SyntaxErr, # no }
+#            u'@top-left { color': xml.dom.SyntaxErr, # no }
+#            u'@top-left {': xml.dom.SyntaxErr, # no }
+#            u'@top-left': xml.dom.SyntaxErr, # no }
+#            u'@top-left;': xml.dom.SyntaxErr, # no }
+            })
+#        self.do_raise_r(tests) # set cssText
+        
+        
+    def test_reprANDstr(self):
+        "MarginRule.__repr__(), .__str__()"
+        margin = u'@top-left'
+        
+        s = cssutils.css.MarginRule(margin=margin, style=u'left: 0')
+        
+        self.assertTrue(margin in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(margin == s2.margin)
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssproperties.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssproperties.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssproperties.py	(revision 1126)
@@ -0,0 +1,63 @@
+"""Testcases for cssutils.css.cssproperties."""
+
+import xml.dom
+import basetest
+import cssutils.css
+import cssutils.profiles
+
+class CSSPropertiesTestCase(basetest.BaseTestCase):
+
+#    def test_cssvalues(self):
+#        "cssproperties cssvalues"
+#        # does actually return match object, so a very simplified test...
+#        match = cssutils.css.cssproperties.cssvalues
+#
+#        self.assertEqual(True, bool(match['color']('red')))
+#        self.assertEqual(False, bool(match['top']('red')))
+#
+#        self.assertEqual(True, bool(match['left']('0')))
+#        self.assertEqual(True, bool(match['left']('1px')))
+#        self.assertEqual(True, bool(match['left']('.1px')))
+#        self.assertEqual(True, bool(match['left']('-1px')))
+#        self.assertEqual(True, bool(match['left']('-.1px')))
+#        self.assertEqual(True, bool(match['left']('-0.1px')))
+
+    def test_toDOMname(self):
+        "cssproperties _toDOMname(CSSname)"
+        _toDOMname = cssutils.css.cssproperties._toDOMname
+
+        self.assertEqual('color', _toDOMname('color'))
+        self.assertEqual('fontStyle', _toDOMname('font-style'))
+        self.assertEqual('MozOpacity', _toDOMname('-moz-opacity'))
+        self.assertEqual('UNKNOWN', _toDOMname('UNKNOWN'))
+        self.assertEqual('AnUNKNOWN', _toDOMname('-anUNKNOWN'))
+
+    def test_toCSSname(self):
+        "cssproperties _toCSSname(DOMname)"
+        _toCSSname = cssutils.css.cssproperties._toCSSname
+
+        self.assertEqual('color', _toCSSname('color'))
+        self.assertEqual('font-style', _toCSSname('fontStyle'))
+        self.assertEqual('-moz-opacity', _toCSSname('MozOpacity'))
+        self.assertEqual('UNKNOWN', _toCSSname('UNKNOWN'))
+        self.assertEqual('-anUNKNOWN', _toCSSname('AnUNKNOWN'))
+
+    def test_CSS2Properties(self):
+        "CSS2Properties"
+        CSS2Properties = cssutils.css.cssproperties.CSS2Properties
+        self.assertEqual(type(property()), type(CSS2Properties.color))
+        self.assertEqual(sum([len(x) for x in cssutils.profiles.properties.values()]),
+                          len(CSS2Properties._properties))
+
+        c2 = CSS2Properties()
+        # CSS2Properties has simplified implementation return always None
+        self.assertEqual(None, c2.color)
+        self.assertEqual(None, c2.__setattr__('color', 1))
+        self.assertEqual(None, c2.__delattr__('color'))
+        # only defined properties
+        self.assertRaises(AttributeError, c2.__getattribute__, 'UNKNOWN')
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssutils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssutils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssutils.py	(revision 1126)
@@ -0,0 +1,426 @@
+# -*- coding: utf-8 -*-
+"""Testcases for cssutils.css.CSSCharsetRule"""
+from __future__ import with_statement
+
+import basetest
+import codecs
+import cssutils
+import os
+import sys
+import tempfile
+import xml.dom
+
+try:
+    import mock
+except ImportError:
+    mock = None
+    print "install mock library to run all tests"
+
+
+class CSSutilsTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        cssutils.ser.prefs.useDefaults()
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+
+    exp = u'''@import "import/import2.css";
+.import {
+    /* ./import.css */
+    background-image: url(images/example.gif)
+    }'''
+
+    def test_VERSION(self):
+        self.assertEqual('1.0', cssutils.VERSION)
+
+    def test_parseString(self):
+        "cssutils.parseString()"
+        s = cssutils.parseString(self.exp,
+                                 media='handheld, screen',
+                                 title='from string')
+        self.assertTrue(isinstance(s, cssutils.css.CSSStyleSheet))
+        self.assertEqual(None, s.href)
+        self.assertEqual(self.exp.encode(), s.cssText)
+        self.assertEqual(u'utf-8', s.encoding)
+        self.assertEqual(u'handheld, screen', s.media.mediaText)
+        self.assertEqual(u'from string', s.title)
+        self.assertEqual(self.exp.encode(), s.cssText)
+
+        ir = s.cssRules[0]
+        self.assertEqual('import/import2.css', ir.href)
+        irs = ir.styleSheet
+        self.assertEqual(cssutils.css.CSSStyleSheet, type(irs))
+
+        href = os.path.join(os.path.dirname(__file__),
+                            '..', '..', '..', 'sheets', 'import.css')
+        href = cssutils.helper.path2url(href)
+        s = cssutils.parseString(self.exp,
+                                 href=href)
+        self.assertEqual(href, s.href)
+
+        ir = s.cssRules[0]
+        self.assertEqual('import/import2.css', ir.href)
+        irs = ir.styleSheet
+        self.assertTrue(isinstance(irs, cssutils.css.CSSStyleSheet))
+        self.assertEqual(irs.cssText, '@import "../import3.css";\n@import "import-impossible.css" print;\n.import2 {\n    /* sheets/import2.css */\n    background: url(http://example.com/images/example.gif);\n    background: url(//example.com/images/example.gif);\n    background: url(/images/example.gif);\n    background: url(images2/example.gif);\n    background: url(./images2/example.gif);\n    background: url(../images/example.gif);\n    background: url(./../images/example.gif)\n    }'.encode())
+
+        tests = {
+                 'a {color: red}': u'a {\n    color: red\n    }',
+                 'a {color: rgb(1,2,3)}': u'a {\n    color: rgb(1, 2, 3)\n    }'
+                 }
+        self.do_equal_p(tests)
+
+    def test_parseFile(self):
+        "cssutils.parseFile()"
+        # name if used with open, href used for @import resolving
+        name = os.path.join(os.path.dirname(__file__),
+                            '..', '..', '..', 'sheets', 'import.css')
+        href = cssutils.helper.path2url(name)
+
+        s = cssutils.parseFile(name, href=href, media='screen', title='from file')
+        self.assertTrue(isinstance(s, cssutils.css.CSSStyleSheet))
+        if sys.platform.startswith('java'):
+            # on Jython only file:
+            self.assertTrue(s.href.startswith('file:'))
+        else:
+            # normally file:/// on win and file:/ on unix
+            self.assertTrue(s.href.startswith('file:/'))
+        self.assertTrue(s.href.endswith('/sheets/import.css'))
+        self.assertEqual(u'utf-8', s.encoding)
+        self.assertEqual(u'screen', s.media.mediaText)
+        self.assertEqual(u'from file', s.title)
+        self.assertEqual(self.exp.encode(), s.cssText)
+
+        ir = s.cssRules[0]
+        self.assertEqual('import/import2.css', ir.href)
+        irs = ir.styleSheet
+        self.assertTrue(isinstance(irs, cssutils.css.CSSStyleSheet))
+        self.assertEqual(irs.cssText, '@import "../import3.css";\n@import "import-impossible.css" print;\n.import2 {\n    /* sheets/import2.css */\n    background: url(http://example.com/images/example.gif);\n    background: url(//example.com/images/example.gif);\n    background: url(/images/example.gif);\n    background: url(images2/example.gif);\n    background: url(./images2/example.gif);\n    background: url(../images/example.gif);\n    background: url(./../images/example.gif)\n    }'.encode())
+
+        # name is used for open and setting of href automatically
+        # test needs to be relative to this test file!
+        os.chdir(os.path.dirname(__file__))
+        name = os.path.join('..', '..', '..', 'sheets', 'import.css')
+
+        s = cssutils.parseFile(name, media='screen', title='from file')
+        self.assertTrue(isinstance(s, cssutils.css.CSSStyleSheet))
+        if sys.platform.startswith('java'):
+            # on Jython only file:
+            self.assertTrue(s.href.startswith('file:'))
+        else:
+            # normally file:/// on win and file:/ on unix
+            self.assertTrue(s.href.startswith('file:/'))
+        self.assertTrue(s.href.endswith('/sheets/import.css'))
+        self.assertEqual(u'utf-8', s.encoding)
+        self.assertEqual(u'screen', s.media.mediaText)
+        self.assertEqual(u'from file', s.title)
+        self.assertEqual(self.exp.encode(), s.cssText)
+
+        ir = s.cssRules[0]
+        self.assertEqual('import/import2.css', ir.href)
+        irs = ir.styleSheet
+        self.assertTrue(isinstance(irs, cssutils.css.CSSStyleSheet))
+        self.assertEqual(irs.cssText, '@import "../import3.css";\n@import "import-impossible.css" print;\n.import2 {\n    /* sheets/import2.css */\n    background: url(http://example.com/images/example.gif);\n    background: url(//example.com/images/example.gif);\n    background: url(/images/example.gif);\n    background: url(images2/example.gif);\n    background: url(./images2/example.gif);\n    background: url(../images/example.gif);\n    background: url(./../images/example.gif)\n    }'.encode())
+
+        # next test
+        css = u'a:after { content: "羊蹄€\u2020" }'
+
+        fd, name = tempfile.mkstemp('_cssutilstest.css')
+        t = os.fdopen(fd, 'wb')
+        t.write(css.encode('utf-8'))
+        t.close()
+
+        self.assertRaises(UnicodeDecodeError, cssutils.parseFile, name, 'ascii')
+
+        # ???
+        s = cssutils.parseFile(name, encoding='iso-8859-1')
+        self.assertEqual(cssutils.css.CSSStyleSheet, type(s))
+        self.assertEqual(s.cssRules[1].selectorText, 'a:after')
+
+        s = cssutils.parseFile(name, encoding='utf-8')
+        self.assertEqual(cssutils.css.CSSStyleSheet, type(s))
+        self.assertEqual(s.cssRules[1].selectorText, 'a:after')
+
+        css = u'@charset "iso-8859-1"; a:after { content: "ä" }'
+        t = codecs.open(name, 'w', 'iso-8859-1')
+        t.write(css)
+        t.close()
+
+        self.assertRaises(
+            UnicodeDecodeError, cssutils.parseFile, name, 'ascii')
+
+        s = cssutils.parseFile(name, encoding='iso-8859-1')
+        self.assertEqual(cssutils.css.CSSStyleSheet, type(s))
+        self.assertEqual(s.cssRules[1].selectorText, 'a:after')
+
+        self.assertRaises(
+            UnicodeDecodeError, cssutils.parseFile, name, 'utf-8')
+
+        # clean up
+        try:
+            os.remove(name)
+        except OSError, e:
+            pass
+
+    def test_parseUrl(self):
+        "cssutils.parseUrl()"
+        href = os.path.join(os.path.dirname(__file__),
+                            '..', '..', '..', 'sheets', 'import.css')
+        #href = u'file:' + urllib.pathname2url(href)
+        href = cssutils.helper.path2url(href)
+        #href = 'http://seewhatever.de/sheets/import.css'
+        s = cssutils.parseUrl(href,
+                              media='tv, print',
+                              title='from url')
+        self.assertTrue(isinstance(s, cssutils.css.CSSStyleSheet))
+        self.assertEqual(href, s.href)
+        self.assertEqual(self.exp.encode(), s.cssText)
+        self.assertEqual(u'utf-8', s.encoding)
+        self.assertEqual(u'tv, print', s.media.mediaText)
+        self.assertEqual('from url', s.title)
+
+        sr = s.cssRules[1]
+        img = sr.style.getProperty('background-image').propertyValue[0].value
+        self.assertEqual(img, 'images/example.gif')
+
+        ir = s.cssRules[0]
+        self.assertEqual(u'import/import2.css', ir.href)
+        irs = ir.styleSheet
+        self.assertEqual(irs.cssText, '@import "../import3.css";\n@import "import-impossible.css" print;\n.import2 {\n    /* sheets/import2.css */\n    background: url(http://example.com/images/example.gif);\n    background: url(//example.com/images/example.gif);\n    background: url(/images/example.gif);\n    background: url(images2/example.gif);\n    background: url(./images2/example.gif);\n    background: url(../images/example.gif);\n    background: url(./../images/example.gif)\n    }'.encode())
+
+        ir2 = irs.cssRules[0]
+        self.assertEqual(u'../import3.css', ir2.href)
+        irs2 = ir2.styleSheet
+        self.assertEqual(irs2.cssText, '/* import3 */\n.import3 {\n    /* from ./import/../import3.css */\n    background: url(images/example3.gif);\n    background: url(./images/example3.gif);\n    background: url(import/images2/example2.gif);\n    background: url(./import/images2/example2.gif);\n    background: url(import/images2/../../images/example3.gif)\n    }'.encode())
+
+    def test_setCSSSerializer(self):
+        "cssutils.setSerializer() and cssutils.ser"
+        s = cssutils.parseString('a { left: 0 }')
+        exp4 = '''a {
+    left: 0
+    }'''
+        exp1 = '''a {
+ left: 0
+ }'''
+        self.assertEqual(exp4.encode(), s.cssText)
+        newser = cssutils.CSSSerializer(cssutils.serialize.Preferences(indent=' '))
+        cssutils.setSerializer(newser)
+        self.assertEqual(exp1.encode(), s.cssText)
+        newser = cssutils.CSSSerializer(cssutils.serialize.Preferences(indent='    '))
+        cssutils.ser = newser
+        self.assertEqual(exp4.encode(), s.cssText)
+
+    def test_parseStyle(self):
+        "cssutils.parseStyle()"
+        s = cssutils.parseStyle('x:0; y:red')
+        self.assertEqual(type(s), cssutils.css.CSSStyleDeclaration)
+        self.assertEqual(s.cssText,  u'x: 0;\ny: red')
+
+        s = cssutils.parseStyle('@import "x";')
+        self.assertEqual(type(s), cssutils.css.CSSStyleDeclaration)
+        self.assertEqual(s.cssText, u'')
+
+        tests = [
+            (u'content: "ä"', 'iso-8859-1'),
+            (u'content: "€"', 'utf-8')
+        ]
+        for v, e in tests:
+            s = cssutils.parseStyle(v.encode(e), encoding=e)
+            self.assertEqual(s.cssText, v)
+
+        self.assertRaises(UnicodeDecodeError, cssutils.parseStyle,
+                          u'content: "ä"'.encode('utf-8'), 'ascii')
+
+
+    def test_getUrls(self):
+        "cssutils.getUrls()"
+        cssutils.ser.prefs.keepAllProperties = True
+
+        css='''
+        @import "im1";
+        @import url(im2);
+        @import url( im3 );
+        @import url( "im4" );
+        @import url( 'im5' );
+        a {
+            background-image: url(a) !important;
+            background-\image: url(b);
+            background: url(c) no-repeat !important;
+            /* issue #46 */
+            src: local("xx"),
+                 url("f.woff") format("woff"),
+                 url("f.otf") format("opentype"),
+                 url("f.svg#f") format("svg");
+            }'''
+        urls = set(cssutils.getUrls(cssutils.parseString(css)))
+        self.assertEqual(urls, set(["im1", "im2", "im3", "im4", "im5",
+                                    "a", "b", "c",
+                                    u'f.woff', u'f.svg#f', u'f.otf']))
+        cssutils.ser.prefs.keepAllProperties = False
+
+    def test_replaceUrls(self):
+        "cssutils.replaceUrls()"
+        cssutils.ser.prefs.keepAllProperties = True
+
+        css='''
+        @import "im1";
+        @import url(im2);
+        a {
+            background-image: url(c) !important;
+            background-\image: url(b);
+            background: url(a) no-repeat !important;
+            }'''
+        s = cssutils.parseString(css)
+        cssutils.replaceUrls(s, lambda old: "NEW" + old)
+        self.assertEqual(u'@import "NEWim1";', s.cssRules[0].cssText)
+        self.assertEqual(u'NEWim2', s.cssRules[1].href)
+        self.assertEqual(u'''background-image: url(NEWc) !important;
+background-\\image: url(NEWb);
+background: url(NEWa) no-repeat !important''', s.cssRules[2].style.cssText)
+
+        cssutils.ser.prefs.keepAllProperties = False
+
+        # CSSStyleDeclaration
+        style = cssutils.parseStyle(u'''color: red;
+                                        background-image:
+                                            url(1.png),
+                                            url('2.png')''')
+        cssutils.replaceUrls(style, lambda url: 'prefix/'+url)
+        self.assertEqual(style.cssText, u'''color: red;
+background-image: url(prefix/1.png), url(prefix/2.png)''')
+
+
+    def test_resolveImports(self):
+        "cssutils.resolveImports(sheet)"
+        if mock:
+            self._tempSer()
+            cssutils.ser.prefs.useMinified()
+
+            a = u'@charset "iso-8859-1";@import"b.css";\xe4{color:green}'.encode('iso-8859-1')
+            b = u'@charset "ascii";\\E4 {color:red}'.encode('ascii')
+
+            # normal
+            m = mock.Mock()
+            with mock.patch('cssutils.util._defaultFetcher', m):
+                m.return_value = (None, b)
+                s = cssutils.parseString(a)
+
+                # py3 TODO
+                self.assertEqual(a, s.cssText)
+                self.assertEqual(b, s.cssRules[1].styleSheet.cssText)
+
+                c = cssutils.resolveImports(s)
+
+                # py3 TODO
+                self.assertEqual(u'\xc3\xa4{color:red}\xc3\xa4{color:green}'.encode('iso-8859-1'),
+                                 c.cssText)
+
+                c.encoding = 'ascii'
+                self.assertEqual(ur'@charset "ascii";\E4 {color:red}\E4 {color:green}'.encode(),
+                                 c.cssText)
+
+            # b cannot be found
+            m = mock.Mock()
+            with mock.patch('cssutils.util._defaultFetcher', m):
+                m.return_value = (None, None)
+                s = cssutils.parseString(a)
+
+                # py3 TODO
+                self.assertEqual(a, s.cssText)
+                self.assertEqual(cssutils.css.CSSStyleSheet,
+                                 type(s.cssRules[1].styleSheet))
+                c = cssutils.resolveImports(s)
+                # py3 TODO
+                self.assertEqual(u'@import"b.css";\xc3\xa4{color:green}'.encode('iso-8859-1'),
+                                 c.cssText)
+
+            # @import with media
+            a = u'@import"b.css";@import"b.css" print, tv ;@import"b.css" all;'
+            b = u'a {color: red}'
+            m = mock.Mock()
+            with mock.patch('cssutils.util._defaultFetcher', m):
+                m.return_value = (None, b)
+                s = cssutils.parseString(a)
+
+                c = cssutils.resolveImports(s)
+
+                self.assertEqual('a{color:red}@media print,tv{a{color:red}}a{color:red}'.encode(),
+                                 c.cssText)
+
+            # cannot resolve with media => keep original
+            a = u'@import"b.css"print;'
+            b = u'@namespace "http://example.com";'
+            m = mock.Mock()
+            with mock.patch('cssutils.util._defaultFetcher', m):
+                m.return_value = (None, b)
+                s = cssutils.parseString(a)
+                c = cssutils.resolveImports(s)
+                self.assertEqual(a.encode(), c.cssText)
+
+            # urls are adjusted too, layout:
+            # a.css
+            # c.css
+            # img/img.gif
+            # b/
+            #     b.css
+            #     subimg/subimg.gif
+            a = u'''
+                 @import"b/b.css";
+                 a {
+                     x: url(/img/abs.gif);
+                     y: url(img/img.gif);
+                     z: url(b/subimg/subimg.gif);
+                     }'''
+            def fetcher(url):
+                c = {
+                     'b.css': u'''
+                         @import"../c.css";
+                         b {
+                             x: url(/img/abs.gif);
+                             y: url(../img/img.gif);
+                             z: url(subimg/subimg.gif);
+                             }''',
+                     'c.css': u'''
+                         c {
+                             x: url(/img/abs.gif);
+                             y: url(./img/img.gif);
+                             z: url(./b/subimg/subimg.gif);
+                             }'''
+                     }
+                return 'utf-8', c[os.path.split(url)[1]]
+
+            @mock.patch.object(cssutils.util, '_defaultFetcher',
+                               new=fetcher)
+            def do():
+                s = cssutils.parseString(a)
+                r = cssutils.resolveImports(s)
+                return s, r
+
+            s, r = do()
+
+            cssutils.ser.prefs.useDefaults()
+            cssutils.ser.prefs.keepComments = False
+            self.assertEqual(u'''c {
+    x: url(/img/abs.gif);
+    y: url(img/img.gif);
+    z: url(b/subimg/subimg.gif)
+    }
+b {
+    x: url(/img/abs.gif);
+    y: url(img/img.gif);
+    z: url(b/subimg/subimg.gif)
+    }
+a {
+    x: url(/img/abs.gif);
+    y: url(img/img.gif);
+    z: url(b/subimg/subimg.gif)
+    }'''.encode(), r.cssText)
+
+            cssutils.ser.prefs.useDefaults()
+        else:
+            self.assertEqual(False, u'Mock needed for this test')
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csscomment.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csscomment.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csscomment.py	(revision 1126)
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+"""Testcases for cssutils.css.CSSComment"""
+
+import xml
+import test_cssrule
+import cssutils.css
+
+class CSSCommentTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSCommentTestCase, self).setUp()
+        self.r = cssutils.css.CSSComment()
+        self.rRO = cssutils.css.CSSComment(readonly=True)
+        self.r_type = cssutils.css.CSSComment.COMMENT
+        self.r_typeString = 'COMMENT'
+
+    def test_init(self):
+        "CSSComment.type and init"
+        super(CSSCommentTestCase, self).test_init()
+
+    def test_csstext(self):
+        "CSSComment.cssText"
+        tests = {
+            u'/*öäüß€ÖÄÜ*/': u'/*\xf6\xe4\xfc\xdf\u20ac\xd6\xc4\xdc*/',
+            u'/*x*/': None,
+            u'/* x */': None,
+            u'/*\t12\n*/': None,
+            u'/* /* */': None,
+            u'/* \\*/': None,
+            u'/*"*/': None,
+            u'''/*"
+            */''': None,
+            u'/** / ** //*/': None
+            }
+        self.do_equal_r(tests) # set cssText
+        tests.update({
+            u'/*x': u'/*x*/',
+            u'\n /*': u'/**/',
+            })
+        self.do_equal_p(tests) # parse
+
+        tests = {
+            u'/* */ ': xml.dom.InvalidModificationErr,
+            u'/* *//**/': xml.dom.InvalidModificationErr,
+            u'/* */1': xml.dom.InvalidModificationErr,
+            u'/* */ */': xml.dom.InvalidModificationErr,
+            u'  */ /* ': xml.dom.InvalidModificationErr,
+            u'*/': xml.dom.InvalidModificationErr,
+            u'@x /* x */': xml.dom.InvalidModificationErr
+            }
+        self.do_raise_r(tests) # set cssText
+        # no raising of error possible?
+        # self.do_raise_p(tests) # parse
+
+    def test_InvalidModificationErr(self):
+        "CSSComment.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'/* comment */')
+
+    def test_reprANDstr(self):
+        "CSSComment.__repr__(), .__str__()"
+        text = '/* test */'
+
+        s = cssutils.css.CSSComment(cssText=text)
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(text == s2.cssText)
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_medialist.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_medialist.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_medialist.py	(revision 1126)
@@ -0,0 +1,198 @@
+# -*- coding: iso-8859-1 -*-
+"""Testcases for cssutils.stylesheets.MediaList"""
+
+import xml.dom
+import basetest
+import cssutils.stylesheets
+
+class MediaListTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        super(MediaListTestCase, self).setUp()
+        self.r = cssutils.stylesheets.MediaList()
+
+    def test_set(self):
+        "MediaList.mediaText 1"
+        ml = cssutils.stylesheets.MediaList()
+
+        self.assertEqual(0, ml.length)
+        self.assertEqual(u'all', ml.mediaText)
+
+        ml.mediaText = u' print   , screen '
+        self.assertEqual(2, ml.length)
+        self.assertEqual(u'print, screen', ml.mediaText)
+        
+        #self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+        #                     basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''), 
+        #                     ml._setMediaText, u' print , all  , tv ')
+        #
+        #self.assertEqual(u'all', ml.mediaText)
+        #self.assertEqual(1, ml.length)
+
+        self.assertRaises(xml.dom.SyntaxErr,
+                          ml.appendMedium, u'test')
+
+    def test_appendMedium(self):
+        "MediaList.appendMedium() 1"
+        ml = cssutils.stylesheets.MediaList()
+
+        ml.appendMedium(u'print')
+        self.assertEqual(1, ml.length)
+        self.assertEqual(u'print', ml.mediaText)
+
+        ml.appendMedium(u'screen')
+        self.assertEqual(2, ml.length)
+        self.assertEqual(u'print, screen', ml.mediaText)
+
+        # automatic del and append!
+        ml.appendMedium(u'print')
+        self.assertEqual(2, ml.length)
+        self.assertEqual(u'screen, print', ml.mediaText)
+
+        # automatic del and append!
+        ml.appendMedium(u'SCREEN')
+        self.assertEqual(2, ml.length)
+        self.assertEqual(u'print, SCREEN', ml.mediaText)
+
+        # append invalid MediaQuery
+        mq = cssutils.stylesheets.MediaQuery()
+        ml.appendMedium(mq)
+        self.assertEqual(2, ml.length)
+        self.assertEqual(u'print, SCREEN', ml.mediaText)
+        
+        # append()
+        mq = cssutils.stylesheets.MediaQuery('tv')
+        ml.append(mq)
+        self.assertEqual(3, ml.length)
+        self.assertEqual(u'print, SCREEN, tv', ml.mediaText)
+
+        # __setitem__
+        self.assertRaises(IndexError, ml.__setitem__, 10, 'all')
+        ml[0] = 'handheld'
+        self.assertEqual(3, ml.length)
+        self.assertEqual(u'handheld, SCREEN, tv', ml.mediaText)
+
+    def test_appendAll(self):
+        "MediaList.append() 2"
+        ml = cssutils.stylesheets.MediaList()
+        ml.appendMedium(u'print')
+        ml.appendMedium(u'tv')
+        self.assertEqual(2, ml.length)
+        self.assertEqual(u'print, tv', ml.mediaText)
+
+        ml.appendMedium(u'all')
+        self.assertEqual(1, ml.length)
+        self.assertEqual(u'all', ml.mediaText)
+
+        self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+                             basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''), 
+                             ml.appendMedium, 'tv')
+        self.assertEqual(1, ml.length)
+        self.assertEqual(u'all', ml.mediaText)
+
+        self.assertRaises(xml.dom.SyntaxErr, ml.appendMedium, u'test')
+
+    def test_append2All(self):
+        "MediaList all"
+        ml = cssutils.stylesheets.MediaList()
+        ml.appendMedium(u'all')
+        self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+                             basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'print') as already specified "all" (set ``mediaText`` instead).'''), 
+                             ml.appendMedium, 'print')
+        
+        sheet = cssutils.parseString('@media all, print { /**/ }')
+        self.assertEqual(u'@media all {\n    /**/\n    }'.encode(), sheet.cssText)
+
+    def test_delete(self):
+        "MediaList.deleteMedium()"
+        ml = cssutils.stylesheets.MediaList()
+
+        self.assertRaises(xml.dom.NotFoundErr, ml.deleteMedium, u'all')
+        self.assertRaises(xml.dom.NotFoundErr, ml.deleteMedium, u'test')
+
+        ml.appendMedium(u'print')
+        ml.deleteMedium(u'print')
+        ml.appendMedium(u'tV')
+        ml.deleteMedium(u'Tv')
+        self.assertEqual(0, ml.length)
+        self.assertEqual(u'all', ml.mediaText)
+
+    def test_item(self):
+        "MediaList.item()"
+        ml = cssutils.stylesheets.MediaList()
+        ml.appendMedium(u'print')
+        ml.appendMedium(u'screen')
+
+        self.assertEqual(u'print', ml.item(0))
+        self.assertEqual(u'screen', ml.item(1))
+        self.assertEqual(None, ml.item(2))
+
+    # REMOVED special case!
+    #def test_handheld(self):
+    #    "MediaList handheld"
+    #    ml = cssutils.stylesheets.MediaList()
+
+    #    ml.mediaText = u' handheld , all  '
+    #    self.assertEqual(2, ml.length)
+    #    self.assertEqual(u'handheld, all', ml.mediaText)
+        
+    #    self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+    #                         basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'handheld') as already specified "all" (set ``mediaText`` instead).'''), 
+    #                         ml._setMediaText, u' handheld , all  , tv ')
+        
+    def test_mediaText(self):
+        "MediaList.mediaText 2"
+        tests = {
+            u'ALL': u'ALL',
+            u'Tv': u'Tv',
+            u'all': None,
+            u'all, handheld': u'all',
+            u'tv': None,
+            u'tv, handheld, print': None,
+            u'tv and (color), handheld and (width: 1px) and (color)': None,
+            }
+        self.do_equal_r(tests, att='mediaText')
+
+        tests = {
+            u'': xml.dom.SyntaxErr,
+            u'UNKNOWN': xml.dom.SyntaxErr,
+            u'a,b': xml.dom.SyntaxErr,
+            u'a and (color)': xml.dom.SyntaxErr,
+            u'not': xml.dom.SyntaxErr, # known but need media
+            u'only': xml.dom.SyntaxErr, # known but need media
+            u'not tv,': xml.dom.SyntaxErr, # known but need media
+            u'all;': xml.dom.SyntaxErr,
+            u'all, and(color)': xml.dom.SyntaxErr,
+            u'all,': xml.dom.SyntaxErr,
+            u'all, ': xml.dom.SyntaxErr,
+            u'all ,': xml.dom.SyntaxErr,
+            u'all, /*1*/': xml.dom.SyntaxErr,
+            u'all and (color),': xml.dom.SyntaxErr,
+            u'all tv, print': xml.dom.SyntaxErr,
+            }
+        self.do_raise_r(tests, att='_setMediaText')
+
+    def test_comments(self):
+        "MediaList.mediaText comments"
+        tests = {
+            u'/*1*/ tv /*2*/, /*3*/ handheld /*4*/, print': 
+            u'/*1*/ tv /*2*/ /*3*/, handheld /*4*/, print',
+            }
+        self.do_equal_r(tests, att='mediaText')
+
+    def test_reprANDstr(self):
+        "MediaList.__repr__(), .__str__()"
+        mediaText='tv, print'
+
+        s = cssutils.stylesheets.MediaList(mediaText=mediaText)
+
+        self.assertTrue(mediaText in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(mediaText == s2.mediaText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssimportrule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssimportrule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssimportrule.py	(revision 1126)
@@ -0,0 +1,436 @@
+"""Testcases for cssutils.css.CSSImportRule"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+import basetest
+
+class CSSImportRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSImportRuleTestCase, self).setUp()
+        self.r = cssutils.css.CSSImportRule()
+        self.rRO = cssutils.css.CSSImportRule(readonly=True)
+        self.r_type = cssutils.css.CSSImportRule.IMPORT_RULE
+        self.r_typeString = 'IMPORT_RULE'
+
+    def test_init(self):
+        "CSSImportRule.__init__()"
+        super(CSSImportRuleTestCase, self).test_init()
+
+        # no init param
+        self.assertEqual(None, self.r.href)
+        self.assertEqual(None, self.r.hreftype)
+        self.assertEqual(False, self.r.hrefFound)
+        self.assertEqual(u'all', self.r.media.mediaText)
+        self.assertEqual(
+            cssutils.stylesheets.MediaList, type(self.r.media))
+        self.assertEqual(None, self.r.name)
+        self.assertEqual(cssutils.css.CSSStyleSheet, type(self.r.styleSheet))
+        self.assertEqual(0, self.r.styleSheet.cssRules.length)
+        self.assertEqual(u'', self.r.cssText)
+
+        # all
+        r = cssutils.css.CSSImportRule(href='href', mediaText='tv', name='name')
+        self.assertEqual(u'@import url(href) tv "name";', r.cssText)
+        self.assertEqual("href", r.href)
+        self.assertEqual(None, r.hreftype)
+        self.assertEqual(u'tv', r.media.mediaText)
+        self.assertEqual(
+            cssutils.stylesheets.MediaList, type(r.media))
+        self.assertEqual('name', r.name)
+        self.assertEqual(None, r.parentRule) # see CSSRule
+        self.assertEqual(None, r.parentStyleSheet) # see CSSRule
+        self.assertEqual(cssutils.css.CSSStyleSheet, type(self.r.styleSheet))
+        self.assertEqual(0, self.r.styleSheet.cssRules.length)
+        
+        # href
+        r = cssutils.css.CSSImportRule(u'x')
+        self.assertEqual(u'@import url(x);', r.cssText)
+        self.assertEqual('x', r.href)
+        self.assertEqual(None, r.hreftype)
+
+        # href + mediaText
+        r = cssutils.css.CSSImportRule(u'x', u'print')
+        self.assertEqual(u'@import url(x) print;', r.cssText)
+        self.assertEqual('x', r.href)
+        self.assertEqual('print', r.media.mediaText)
+
+        # href + name
+        r = cssutils.css.CSSImportRule(u'x', name=u'n')
+        self.assertEqual(u'@import url(x) "n";', r.cssText)
+        self.assertEqual('x', r.href)
+        self.assertEqual('n', r.name)
+
+        # href + mediaText + name
+        r = cssutils.css.CSSImportRule(u'x', u'print', 'n')
+        self.assertEqual(u'@import url(x) print "n";', r.cssText)
+        self.assertEqual('x', r.href)
+        self.assertEqual('print', r.media.mediaText)
+        self.assertEqual('n', r.name)
+
+        # media +name only
+        self.r = cssutils.css.CSSImportRule(mediaText=u'print', name="n")
+        self.assertEqual(cssutils.stylesheets.MediaList,
+                         type(self.r.media))
+        self.assertEqual(u'', self.r.cssText)
+        self.assertEqual(u'print', self.r.media.mediaText)
+        self.assertEqual(u'n', self.r.name)
+
+        # only possible to set @... similar name
+        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
+
+    def test_cssText(self):
+        "CSSImportRule.cssText"
+        tests = {
+            # href string
+            u'''@import "str";''': None,
+            u'''@import"str";''': u'''@import "str";''',
+            u'''@\\import "str";''': u'''@import "str";''',
+            u'''@IMPORT "str";''': u'''@import "str";''',
+            u'''@import 'str';''': u'''@import "str";''',
+            u'''@import 'str' ;''': u'''@import "str";''',
+            u'''@import "str";''': None,
+            u'''@import "str"  ;''': u'''@import "str";''',
+            ur'''@import "\""  ;''': ur'''@import "\"";''',
+            u'''@import '\\'';''': ur'''@import "'";''',
+            u'''@import '"';''': ur'''@import "\"";''',
+            # href url
+            u'''@import url(x.css);''': None,
+            # nospace
+            u'''@import url(")");''': u'''@import url(")");''',
+            u'''@import url("\\"");''': u'''@import url("\\"");''',
+            u'''@import url('\\'');''': u'''@import url("'");''',
+
+            # href + media
+            # all is removed
+            u'''@import "str" all;''': u'''@import "str";''',
+            u'''@import "str" tv, print;''': None,
+            u'''@import"str"tv,print;''': u'''@import "str" tv, print;''',
+            u'''@import "str" tv, print, all;''': u'''@import "str";''',
+            u'''@import "str" handheld, all;''': u'''@import "str";''',
+            u'''@import "str" all, handheld;''': u'''@import "str";''',
+            u'''@import "str" not tv;''': None,
+            u'''@import "str" only tv;''': None,
+            u'''@import "str" only tv and (color: 2);''': None,
+
+            # href + name
+            u'''@import "str" "name";''': None,
+            u'''@import "str" 'name';''': u'''@import "str" "name";''',
+            u'''@import url(x) "name";''': None,
+            u'''@import "str" "\\"";''': None,
+            u'''@import "str" '\\'';''': u'''@import "str" "'";''',
+
+            # href + media + name
+            u'''@import"str"tv"name";''': u'''@import "str" tv "name";''',
+            u'''@import\t\r\f\n"str"\t\t\r\f\ntv\t\t\r\f\n"name"\t;''': 
+                u'''@import "str" tv "name";''',
+
+            # comments
+            u'''@import /*1*/ "str" /*2*/;''': None,
+            u'@import/*1*//*2*/"str"/*3*//*4*/all/*5*//*6*/"name"/*7*//*8*/ ;': 
+                u'@import /*1*/ /*2*/ "str" /*3*/ /*4*/ all /*5*/ /*6*/ "name" /*7*/ /*8*/;',
+            u'@import/*1*//*2*/url(u)/*3*//*4*/all/*5*//*6*/"name"/*7*//*8*/ ;': 
+                u'@import /*1*/ /*2*/ url(u) /*3*/ /*4*/ all /*5*/ /*6*/ "name" /*7*/ /*8*/;',
+            u'@import/*1*//*2*/url("u")/*3*//*4*/all/*5*//*6*/"name"/*7*//*8*/ ;': 
+                u'@import /*1*/ /*2*/ url(u) /*3*/ /*4*/ all /*5*/ /*6*/ "name" /*7*/ /*8*/;',
+            # WS
+            u'@import\n\t\f "str"\n\t\f tv\n\t\f "name"\n\t\f ;': 
+                u'@import "str" tv "name";',
+            u'@import\n\t\f url(\n\t\f u\n\t\f )\n\t\f tv\n\t\f "name"\n\t\f ;': 
+                u'@import url(u) tv "name";',
+            u'@import\n\t\f url("u")\n\t\f tv\n\t\f "name"\n\t\f ;': 
+                u'@import url(u) tv "name";',
+            u'@import\n\t\f url(\n\t\f "u"\n\t\f )\n\t\f tv\n\t\f "name"\n\t\f ;': 
+                u'@import url(u) tv "name";',
+            }
+        self.do_equal_r(tests) # set cssText
+        tests.update({
+            u'@import "x.css" tv': '@import "x.css" tv;',
+            u'@import "x.css"': '@import "x.css";', # no ;
+            u"@import 'x.css'": '@import "x.css";', # no ;
+            u'@import url(x.css)': '@import url(x.css);', # no ;
+            u'@import "x;': '@import "x;";', # no "!
+            })
+        self.do_equal_p(tests) # parse
+
+        tests = {
+            u'''@import;''': xml.dom.SyntaxErr,
+            u'''@import all;''': xml.dom.SyntaxErr,
+            u'''@import all"name";''': xml.dom.SyntaxErr,
+            u'''@import;''': xml.dom.SyntaxErr,
+            u'''@import x";''': xml.dom.SyntaxErr,
+            u'''@import "str" ,all;''': xml.dom.SyntaxErr,
+            u'''@import "str" all,;''': xml.dom.SyntaxErr,
+            u'''@import "str" all tv;''': xml.dom.SyntaxErr,
+            u'''@import "str" "name" all;''': xml.dom.SyntaxErr,
+            }
+        self.do_raise_p(tests) # parse
+        tests.update({
+            u'@import "x.css"': xml.dom.SyntaxErr,
+            u"@import 'x.css'": xml.dom.SyntaxErr,
+            u'@import url(x.css)': xml.dom.SyntaxErr,
+            u'@import "x.css" tv': xml.dom.SyntaxErr,
+            u'@import "x;': xml.dom.SyntaxErr,
+            u'''@import url("x);''': xml.dom.SyntaxErr,
+            # trailing
+            u'''@import "x";"a"''': xml.dom.SyntaxErr,
+            # trailing S or COMMENT
+            u'''@import "x";/**/''': xml.dom.SyntaxErr,
+            u'''@import "x"; ''': xml.dom.SyntaxErr,
+            })
+        self.do_raise_r(tests) # set cssText
+
+    def test_href(self):
+        "CSSImportRule.href"
+        # set
+        self.r.href = 'x'
+        self.assertEqual('x', self.r.href)
+        self.assertEqual(u'@import url(x);', self.r.cssText)
+
+        # http
+        self.r.href = 'http://www.example.com/x?css=z&v=1'
+        self.assertEqual('http://www.example.com/x?css=z&v=1' , self.r.href)
+        self.assertEqual(u'@import url(http://www.example.com/x?css=z&v=1);',
+                         self.r.cssText)
+
+        # also if hreftype changed
+        self.r.hreftype='string'
+        self.assertEqual('http://www.example.com/x?css=z&v=1' , self.r.href)
+        self.assertEqual(u'@import "http://www.example.com/x?css=z&v=1";',
+                         self.r.cssText)
+        
+        # string escaping?
+        self.r.href = '"'
+        self.assertEqual(u'@import "\\"";', self.r.cssText)
+        self.r.hreftype='url'
+        self.assertEqual(u'@import url("\\"");', self.r.cssText)
+        
+        # url escaping?
+        self.r.href = ')'
+        self.assertEqual(u'@import url(")");', self.r.cssText)
+
+        self.r.hreftype = 'NOT VALID' # using default
+        self.assertEqual(u'@import url(")");', self.r.cssText)
+
+    def test_hrefFound(self):
+        "CSSImportRule.hrefFound"
+        def fetcher(url):
+            if url == u'http://example.com/yes': 
+                return None, u'/**/'
+            else:
+                return None, None
+            
+        parser = cssutils.CSSParser(fetcher=fetcher)
+        sheet = parser.parseString(u'@import "http://example.com/yes" "name"')
+        
+        r = sheet.cssRules[0]
+        self.assertEqual(u'/**/'.encode(), r.styleSheet.cssText)
+        self.assertEqual(True, r.hrefFound)
+        self.assertEqual(u'name', r.name)
+        
+        r.cssText = '@import url(http://example.com/none) "name2";'
+        self.assertEqual(u''.encode(), r.styleSheet.cssText)
+        self.assertEqual(False, r.hrefFound)
+        self.assertEqual(u'name2', r.name)
+
+        sheet.cssText = '@import url(http://example.com/none);'
+        self.assertNotEqual(r, sheet.cssRules[0])
+
+    def test_hreftype(self):
+        "CSSImportRule.hreftype"
+        self.r = cssutils.css.CSSImportRule()
+
+        self.r.cssText = '@import /*1*/url(org) /*2*/;'
+        self.assertEqual('uri', self.r.hreftype)
+        self.assertEqual(u'@import /*1*/ url(org) /*2*/;', self.r.cssText)
+
+        self.r.cssText = '@import /*1*/"org" /*2*/;'
+        self.assertEqual('string', self.r.hreftype)
+        self.assertEqual(u'@import /*1*/ "org" /*2*/;', self.r.cssText)
+
+        self.r.href = 'new'
+        self.assertEqual(u'@import /*1*/ "new" /*2*/;', self.r.cssText)
+
+        self.r.hreftype='uri'
+        self.assertEqual(u'@import /*1*/ url(new) /*2*/;', self.r.cssText)
+
+    def test_media(self):
+        "CSSImportRule.media"
+        self.r.href = 'x' # @import url(x)
+
+        # media is readonly
+        self.assertRaises(AttributeError, self.r.__setattr__, 'media', None)
+
+        # but not static
+        self.r.media.mediaText = 'print'
+        self.assertEqual(u'@import url(x) print;', self.r.cssText)
+        self.r.media.appendMedium('tv')
+        self.assertEqual(u'@import url(x) print, tv;', self.r.cssText)
+
+        # for generated rule
+        r = cssutils.css.CSSImportRule(href='x')
+        self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+                             basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''), 
+                             r.media.appendMedium, 'tv')
+        self.assertEqual(u'@import url(x);', r.cssText)
+        self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+                             basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''), 
+                             r.media.appendMedium, 'tv')
+        self.assertEqual(u'@import url(x);', r.cssText)
+        r.media.mediaText = 'tv' 
+        self.assertEqual(u'@import url(x) tv;', r.cssText)
+        r.media.appendMedium('print') # all + tv = all!
+        self.assertEqual(u'@import url(x) tv, print;', r.cssText)
+
+        # for parsed rule without initial media
+        s = cssutils.parseString('@import url(x);')
+        r = s.cssRules[0]
+        
+        self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+                             basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''), 
+                             r.media.appendMedium, 'tv')        
+        self.assertEqual(u'@import url(x);', r.cssText)
+        self.assertRaisesMsg(xml.dom.InvalidModificationErr, 
+                             basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''), 
+                             r.media.appendMedium, 'tv')
+        self.assertEqual(u'@import url(x);', r.cssText)
+        r.media.mediaText = 'tv' 
+        self.assertEqual(u'@import url(x) tv;', r.cssText)
+        r.media.appendMedium('print') # all + tv = all!
+        self.assertEqual(u'@import url(x) tv, print;', r.cssText)
+
+    def test_name(self):
+        "CSSImportRule.name"
+        r = cssutils.css.CSSImportRule('x', name='a000000')
+        self.assertEqual('a000000', r.name)
+        self.assertEqual(u'@import url(x) "a000000";', r.cssText)
+
+        r.name = "n"
+        self.assertEqual('n', r.name)
+        self.assertEqual(u'@import url(x) "n";', r.cssText)
+        r.name = '"'
+        self.assertEqual('"', r.name)
+        self.assertEqual(u'@import url(x) "\\"";', r.cssText)
+        
+        r.hreftype = 'string'
+        self.assertEqual(u'@import "x" "\\"";', r.cssText)
+        r.name = "123"
+        self.assertEqual(u'@import "x" "123";', r.cssText)
+
+        r.name = None
+        self.assertEqual(None, r.name)
+        self.assertEqual(u'@import "x";', r.cssText)
+
+        r.name = ""
+        self.assertEqual(None, r.name)
+        self.assertEqual(u'@import "x";', r.cssText)
+        
+        self.assertRaises(xml.dom.SyntaxErr, r._setName, 0)
+        self.assertRaises(xml.dom.SyntaxErr, r._setName, 123)
+
+    def test_styleSheet(self):
+        "CSSImportRule.styleSheet"
+        def fetcher(url):
+            if url == "/root/level1/anything.css": 
+                return None, '@import "level2/css.css" "title2";'
+            else:
+                return None, 'a { color: red }'
+            
+        parser = cssutils.CSSParser(fetcher=fetcher)
+        sheet = parser.parseString('''@charset "ascii";
+                                   @import "level1/anything.css" tv "title";''', 
+                                   href='/root/')
+        
+        self.assertEqual(sheet.href, '/root/')
+        
+        ir = sheet.cssRules[1]
+        self.assertEqual(ir.href, 'level1/anything.css')
+        self.assertEqual(ir.styleSheet.href, '/root/level1/anything.css')
+        # inherits ascii as no self charset is set 
+        self.assertEqual(ir.styleSheet.encoding, 'ascii')
+        self.assertEqual(ir.styleSheet.ownerRule, ir)
+        self.assertEqual(ir.styleSheet.media.mediaText, 'tv')
+        self.assertEqual(ir.styleSheet.parentStyleSheet, None) # sheet
+        self.assertEqual(ir.styleSheet.title, 'title')
+        self.assertEqual(ir.styleSheet.cssText, 
+                         '@charset "ascii";\n@import "level2/css.css" "title2";'.encode())
+
+        ir2 = ir.styleSheet.cssRules[1]
+        self.assertEqual(ir2.href, 'level2/css.css')
+        self.assertEqual(ir2.styleSheet.href, '/root/level1/level2/css.css')
+        # inherits ascii as no self charset is set 
+        self.assertEqual(ir2.styleSheet.encoding, 'ascii')
+        self.assertEqual(ir2.styleSheet.ownerRule, ir2)
+        self.assertEqual(ir2.styleSheet.media.mediaText, 'all')
+        self.assertEqual(ir2.styleSheet.parentStyleSheet, None) #ir.styleSheet
+        self.assertEqual(ir2.styleSheet.title, 'title2')
+        self.assertEqual(ir2.styleSheet.cssText, 
+                         '@charset "ascii";\na {\n    color: red\n    }'.encode())
+
+        sheet = cssutils.parseString('@import "CANNOT-FIND.css";')
+        ir = sheet.cssRules[0]
+        self.assertEqual(ir.href, "CANNOT-FIND.css")
+        self.assertEqual(type(ir.styleSheet), cssutils.css.CSSStyleSheet)
+
+        def fetcher(url):
+            if url.endswith('level1.css'): 
+                return None, u'@charset "ascii"; @import "level2.css";'.encode()
+            else:
+                return None, u'a { color: red }'.encode()
+            
+        parser = cssutils.CSSParser(fetcher=fetcher)
+        
+        sheet = parser.parseString('@charset "iso-8859-1";@import "level1.css";')
+        self.assertEqual(sheet.encoding, 'iso-8859-1')
+
+        sheet = sheet.cssRules[1].styleSheet
+        self.assertEqual(sheet.encoding, 'ascii')
+
+        sheet = sheet.cssRules[1].styleSheet
+        self.assertEqual(sheet.encoding, 'ascii')
+
+    def test_incomplete(self):
+        "CSSImportRule (incomplete)"
+        tests = {
+            u'@import "x.css': u'@import "x.css";',
+            u"@import 'x": u'@import "x";',
+            # TODO:
+            u"@import url(x": u'@import url(x);',
+            u"@import url('x": u'@import url(x);',
+            u'@import url("x;': u'@import url("x;");',
+            u'@import url( "x;': u'@import url("x;");',
+            u'@import url("x ': u'@import url("x ");',
+            u'@import url(x ': u'@import url(x);',
+            u'''@import "a
+                @import "b";
+                @import "c";''': u'@import "c";'
+        }
+        self.do_equal_p(tests, raising=False) # parse
+        
+    def test_InvalidModificationErr(self):
+        "CSSImportRule.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@import')
+
+    def test_reprANDstr(self):
+        "CSSImportRule.__repr__(), .__str__()"
+        href = 'x.css'
+        mediaText = 'tv, print'
+        name = 'name'
+        s = cssutils.css.CSSImportRule(href=href, mediaText=mediaText, name=name)
+
+        # str(): mediaText nor name are present here
+        self.assertTrue(href in str(s))
+        
+        # repr()
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(href == s2.href)
+        self.assertTrue(mediaText == s2.media.mediaText)
+        self.assertTrue(name == s2.name)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_selectorlist.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_selectorlist.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_selectorlist.py	(revision 1126)
@@ -0,0 +1,147 @@
+"""Testcases for cssutils.css.selectorlist.SelectorList."""
+
+import xml.dom
+import basetest
+import cssutils
+from cssutils.css.selectorlist import SelectorList
+
+class SelectorListTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        self.r = SelectorList()
+
+    def test_init(self):
+        "SelectorList.__init__() and .length"
+        s = SelectorList()
+        self.assertEqual(0, s.length)
+
+        s = SelectorList('a, b')
+        self.assertEqual(2, s.length)
+        self.assertEqual(u'a, b', s.selectorText)
+
+        s = SelectorList(selectorText='a')
+        self.assertEqual(1, s.length)
+        self.assertEqual(u'a', s.selectorText)
+
+        s = SelectorList(selectorText=('p|a', {'p': 'uri'})) # n-dict
+        self.assertEqual(1, s.length)
+        self.assertEqual(u'p|a', s.selectorText)
+
+        s = SelectorList(selectorText=('p|a', (('p', 'uri'),))) # n-tuples
+        self.assertEqual(1, s.length)
+        self.assertEqual(u'p|a', s.selectorText)
+
+    def test_parentRule(self):
+        "Selector.parentRule"
+        def check(style):
+            self.assertEqual(style, style.selectorList.parentRule)
+            for sel in style.selectorList:
+                self.assertEqual(style.selectorList, sel.parent)
+        
+        style = cssutils.css.CSSStyleRule('a, b')
+        check(style)
+
+        # add new selector
+        style.selectorList.append(cssutils.css.Selector('x'))
+        check(style)
+
+        # replace selectorList
+        style.selectorList = cssutils.css.SelectorList('x')
+        check(style)
+
+        # replace selectorText
+        style.selectorText = ('x, y')
+        check(style)
+            
+    def test_appendSelector(self):
+        "SelectorList.appendSelector() and .length"
+        s = SelectorList()
+        s.appendSelector('a')
+        self.assertEqual(1, s.length)
+
+        self.assertRaises(xml.dom.InvalidModificationErr,
+                          s.appendSelector, 'b,')
+        self.assertEqual(1, s.length)
+
+        self.assertEqual(u'a', s.selectorText)
+
+        s.append('b')
+        self.assertEqual(2, s.length)
+        self.assertEqual(u'a, b', s.selectorText)
+
+        s.append('a')
+        self.assertEqual(2, s.length)
+        self.assertEqual(u'b, a', s.selectorText)
+        
+        # __setitem__    
+        self.assertRaises(IndexError, s.__setitem__, 4, 'x')
+        s[1] = 'c'
+        self.assertEqual(2, s.length)
+        self.assertEqual(u'b, c', s.selectorText)
+        # TODO: remove duplicates?
+#        s[0] = 'c'
+#        self.assertEqual(1, s.length)
+#        self.assertEqual(u'c', s.selectorText)
+
+        s = SelectorList()
+        s.appendSelector(('p|a', {'p': 'uri', 'x': 'xxx'}))
+        self.assertEqual(u'p|a', s.selectorText)
+        # x gets lost as not used
+        self.assertRaises(xml.dom.NamespaceErr, s.append, 'x|a')
+        # not set at all
+        self.assertRaises(xml.dom.NamespaceErr, s.append, 'y|a')
+        # but p is retained
+        s.append('p|b')
+        self.assertEqual(u'p|a, p|b', s.selectorText)
+
+    def test_selectorText(self):
+        "SelectorList.selectorText"
+        s = SelectorList()
+        s.selectorText = u'a, b'
+        self.assertEqual(u'a, b', s.selectorText)
+        self.assertRaises(xml.dom.SyntaxErr, s._setSelectorText, u',')
+        # not changed as invalid!
+        self.assertEqual(u'a, b', s.selectorText)
+
+        tests = {
+            u'*': None,
+            u'/*1*/*': None,
+            u'/*1*/*, a': None,
+            u'a, b': None,
+            u'a ,b': u'a, b',
+            u'a , b': u'a, b',
+            u'a, b, c': u'a, b, c',
+            u'#a, x#a, .b, x.b': u'#a, x#a, .b, x.b',
+            (u'[p|a], p|*', (('p', 'uri'),)): u'[p|a], p|*',
+            }
+        # do not parse as not complete
+        self.do_equal_r(tests, att='selectorText')
+
+        tests = {
+            u'x|*': xml.dom.NamespaceErr,
+            u'': xml.dom.SyntaxErr,
+            u' ': xml.dom.SyntaxErr,
+            u',': xml.dom.SyntaxErr,
+            u'a,': xml.dom.SyntaxErr,
+            u',a': xml.dom.SyntaxErr,
+            u'/* 1 */,a': xml.dom.SyntaxErr,
+            }
+        # only set as not complete
+        self.do_raise_r(tests, att='_setSelectorText')
+
+    def test_reprANDstr(self):
+        "SelectorList.__repr__(), .__str__()"
+        sel=(u'a, p|b', { 'p': 'uri'})
+        
+        s = cssutils.css.SelectorList(selectorText=sel)
+
+        self.assertTrue(sel[0] in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertEqual(sel[0], s2.selectorText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssrulelist.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssrulelist.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_cssrulelist.py	(revision 1126)
@@ -0,0 +1,37 @@
+"""Testcases for cssutils.css.CSSRuleList"""
+
+import basetest
+import cssutils
+
+class CSSRuleListTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "CSSRuleList.__init__()"
+        r = cssutils.css.CSSRuleList()
+        self.assertEqual(0, r.length)
+        self.assertEqual(None, r.item(2))
+        
+        # subclasses list but all setting options like append, extend etc
+        # need to be added to an instance of this class by a using class!
+        self.assertRaises(NotImplementedError, r.append, 1)
+
+    def test_rulesOfType(self):
+        "CSSRuleList.rulesOfType()"
+        s = cssutils.parseString('''
+        /*c*/
+        @namespace "a";
+        a { color: red}
+        b { left: 0 }''')
+        
+        c = list(s.cssRules.rulesOfType(cssutils.css.CSSRule.COMMENT))
+        self.assertEqual(1, len(c))
+        self.assertEqual('/*c*/', c[0].cssText)
+
+        r = list(s.cssRules.rulesOfType(cssutils.css.CSSRule.STYLE_RULE))
+        self.assertEqual(2, len(r))
+        self.assertEqual('b {\n    left: 0\n    }', r[1].cssText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csspagerule.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csspagerule.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_csspagerule.py	(revision 1126)
@@ -0,0 +1,433 @@
+"""Testcases for cssutils.css.CSSPageRule"""
+
+import xml.dom
+import test_cssrule
+import cssutils
+
+class CSSPageRuleTestCase(test_cssrule.CSSRuleTestCase):
+
+    def setUp(self):
+        super(CSSPageRuleTestCase, self).setUp()
+        
+        cssutils.ser.prefs.useDefaults()
+        self.r = cssutils.css.CSSPageRule()
+        self.rRO = cssutils.css.CSSPageRule(readonly=True)
+        self.r_type = cssutils.css.CSSPageRule.PAGE_RULE#
+        self.r_typeString = 'PAGE_RULE'
+
+    def tearDown(self):
+        cssutils.ser.prefs.useDefaults()
+            
+    def test_init(self):
+        "CSSPageRule.__init__()"
+        super(CSSPageRuleTestCase, self).test_init()
+
+        r = cssutils.css.CSSPageRule()
+        self.assertEqual(u'', r.selectorText)
+        self.assertEqual(cssutils.css.CSSStyleDeclaration, type(r.style))
+        self.assertEqual(r, r.style.parentRule)
+
+        # until any properties
+        self.assertEqual(u'', r.cssText)
+
+        # only possible to set @... similar name
+        self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
+
+        def checkrefs(ff):
+            self.assertEqual(ff, ff.style.parentRule)
+            for p in ff.style:
+                self.assertEqual(ff.style, p.parent)
+                
+        checkrefs(cssutils.css.CSSPageRule(
+                    style=cssutils.css.CSSStyleDeclaration('font-family: x')))
+        
+        r = cssutils.css.CSSPageRule()
+        r.cssText = '@page { font-family: x }'
+        checkrefs(r)
+        
+        r = cssutils.css.CSSPageRule()
+        r.style.setProperty('font-family', 'y')
+        checkrefs(r)
+
+        r = cssutils.css.CSSPageRule()
+        r.style['font-family'] = 'z'
+        checkrefs(r)
+
+        r = cssutils.css.CSSPageRule()
+        r.style.fontFamily = 'a'
+        checkrefs(r)
+
+    def test_InvalidModificationErr(self):
+        "CSSPageRule.cssText InvalidModificationErr"
+        self._test_InvalidModificationErr(u'@page')
+        tests = {
+            u'@pag {}': xml.dom.InvalidModificationErr,
+            }
+        self.do_raise_r(tests)
+
+    def test_incomplete(self):
+        "CSSPageRule (incomplete)"
+        tests = {
+            u'@page :left { ':
+                u'', # no } and no content
+            u'@page :left { color: red':
+                u'@page :left {\n    color: red\n    }', # no }
+        }
+        self.do_equal_p(tests) # parse
+
+    def test_cssText(self):
+        "CSSPageRule.cssText"
+        EXP = u'@page %s {\n    margin: 0\n    }'
+        tests = {
+            u'@page {}': u'',
+            u'@page:left{}': u'',
+            u'@page :right {}': u'',
+            u'@page {margin:0;}': u'@page {\n    margin: 0\n    }',
+
+            u'@page name { margin: 0 }': EXP % u'name',
+            u'@page name:left { margin: 0 }': EXP % u'name:left',
+            u'@page name:right { margin: 0 }': EXP % u'name:right',
+            u'@page name:first { margin: 0 }': EXP % u'name:first',
+            u'@page :left { margin: 0 }': EXP % u':left',
+            u'@page:left { margin: 0 }': EXP % u':left',
+            u'@page :right { margin: 0 }': EXP % u':right',
+            u'@page :first { margin: 0 }': EXP % u':first',
+            u'@page :UNKNOWNIDENT { margin: 0 }': EXP % u':UNKNOWNIDENT',
+
+            u'@PAGE:left{margin:0;}': u'@page :left {\n    margin: 0\n    }',
+            u'@\\page:left{margin:0;}': u'@page :left {\n    margin: 0\n    }',
+
+            # comments
+            u'@page/*1*//*2*/:left/*3*//*4*/{margin:0;}':
+                u'@page /*1*/ /*2*/ :left /*3*/ /*4*/ {\n    margin: 0\n    }',
+            # WS
+            u'@page:left{margin:0;}':
+                u'@page :left {\n    margin: 0\n    }',
+            u'@page\n\r\f\t :left\n\r\f\t {margin:0;}':
+                u'@page :left {\n    margin: 0\n    }',
+                
+            # MarginRule
+            u'@page {    @top-right {        content: "2"        }    }':
+                u'@page {\n    @top-right {\n        content: "2"\n        }\n    }',
+            u'@page {padding: 1cm; margin: 1cm; @top-left {content: "1"}@top-right {content: "2";left: 1}}':
+                u'@page {\n    padding: 1cm;\n    margin: 1cm;\n    @top-left {\n        content: "1"\n        }\n    @top-right {\n        content: "2";\n        left: 1\n        }\n    }',
+            u'@page {@top-right { content: "1a"; content: "1b"; x: 1 }@top-right { content: "2"; y: 2 }}':
+                u'''@page {\n    @top-right {
+        content: "1a";
+        content: "1b";
+        x: 1;
+        content: "2";
+        y: 2
+        }\n    }''',
+        
+        }
+        self.do_equal_r(tests)
+        self.do_equal_p(tests)
+
+        tests = {
+            # auto is not allowed
+            u'@page AUto {}': xml.dom.SyntaxErr,
+            u'@page AUto:left {}': xml.dom.SyntaxErr,
+            
+            u'@page : {}': xml.dom.SyntaxErr,
+            u'@page :/*1*/left {}': xml.dom.SyntaxErr,
+            u'@page : left {}': xml.dom.SyntaxErr,
+            u'@page :left :right {}': xml.dom.SyntaxErr,
+            u'@page :left a {}': xml.dom.SyntaxErr,
+            # no S between IDENT and PSEUDO
+            u'@page a :left  {}': xml.dom.SyntaxErr,
+
+            u'@page :left;': xml.dom.SyntaxErr,
+            u'@page :left }': xml.dom.SyntaxErr,
+            }
+        self.do_raise_p(tests) # parse
+        tests.update({
+            # false selector
+            u'@page :right :left {}': xml.dom.SyntaxErr, # no }
+            u'@page :right X {}': xml.dom.SyntaxErr, # no }
+            u'@page X Y {}': xml.dom.SyntaxErr, # no }
+            
+            u'@page :left {': xml.dom.SyntaxErr, # no }
+            # trailing
+            u'@page :left {}1': xml.dom.SyntaxErr, # no }
+            u'@page :left {}/**/': xml.dom.SyntaxErr, # no }
+            u'@page :left {} ': xml.dom.SyntaxErr, # no }
+            })
+        self.do_raise_r(tests) # set cssText
+
+    def test_cssText2(self):
+        "CSSPageRule.cssText 2"
+        r = cssutils.css.CSSPageRule()
+        s = u'a:left'
+        r.selectorText = s 
+        self.assertEqual(r.selectorText, s)
+
+        st = 'size: a4'
+        r.style = st
+        self.assertEqual(r.style.cssText, st)
+
+        # invalid selector
+        self.assertRaises(xml.dom.SyntaxErr, r._setStyle, '$')
+        self.assertEqual(r.selectorText, s)
+        self.assertEqual(r.style.cssText, st)
+
+        self.assertRaises(xml.dom.SyntaxErr, r._setCssText, '@page $ { color: red }')
+        self.assertEqual(r.selectorText, s)
+        self.assertEqual(r.style.cssText, st)
+
+
+        # invalid style
+        self.assertRaises(xml.dom.SyntaxErr, r._setSelectorText, '$')
+        self.assertEqual(r.selectorText, s)
+        self.assertEqual(r.style.cssText, st)
+
+        self.assertRaises(xml.dom.SyntaxErr, r._setCssText, '@page b:right { x }')
+        self.assertEqual(r.selectorText, s)
+        self.assertEqual(r.style.cssText, st)
+
+    def test_selectorText(self):
+        "CSSPageRule.selectorText"
+        r = cssutils.css.CSSPageRule()
+        r.selectorText = u'a:left'
+        self.assertEqual(r.selectorText, u'a:left')
+        
+        tests = {
+            u'': u'',
+            u'name': None,
+            u':left': None,
+            u':right': None,
+            u':first': None,
+            u':UNKNOWNIDENT': None,
+            u'name:left': None,
+            u' :left': u':left',
+            u':left': u':left',
+            u'/*1*/:left/*a*/': u'/*1*/ :left /*a*/',
+            u'/*1*/ :left /*a*/ /*b*/': None,
+            u':left/*a*/': u':left /*a*/',
+            u'/*1*/:left': u'/*1*/ :left',
+            }
+        self.do_equal_r(tests, att='selectorText')
+
+        tests = {
+            u':': xml.dom.SyntaxErr,
+            u':/*1*/left': xml.dom.SyntaxErr,
+            u': left': xml.dom.SyntaxErr,
+            u':left :right': xml.dom.SyntaxErr,
+            u':left a': xml.dom.SyntaxErr,
+            u'name :left': xml.dom.SyntaxErr,
+            }
+        self.do_raise_r(tests, att='_setSelectorText')
+
+    def test_specificity(self):
+        "CSSPageRule.specificity"
+        r = cssutils.css.CSSPageRule()
+        tests = {
+            u'': (0, 0, 0),
+            u'name': (1, 0, 0),
+            u':first': (0, 1, 0),
+            u':left': (0, 0, 1),
+            u':right': (0, 0, 1),
+            u':UNKNOWNIDENT': (0, 0, 1),
+            u'name:first': (1, 1, 0),
+            u'name:left': (1, 0, 1),
+            u'name:right': (1, 0, 1),
+            u'name:X': (1, 0, 1)
+        }
+        for sel, exp in tests.items():
+            r.selectorText = sel
+            self.assertEqual(r.specificity, exp)
+            
+            r = cssutils.css.CSSPageRule()
+            r.cssText = u'@page %s {}' % sel
+            self.assertEqual(r.specificity, exp)
+
+    def test_cssRules(self):
+        "CSSPageRule.cssRules"
+        s = cssutils.parseString(u'@page {}')
+        p = s.cssRules[0]
+        
+        self.assertEqual(len(p.cssRules), 0)
+        
+        # add and insert
+        m1 = cssutils.css.MarginRule(u'@top-left', u'color: red')
+        i = p.add(m1)
+        self.assertEqual(i, 0)
+        self.assertEqual(len(p.cssRules), 1)
+
+        m3 = cssutils.css.MarginRule()
+        m3.cssText = u'@top-right { color: blue }'
+        i = p.insertRule(m3)
+        self.assertEqual(i, 1)
+        self.assertEqual(len(p.cssRules), 2)
+
+        m2 = cssutils.css.MarginRule()
+        m2.margin = u'@top-center'
+        m2.style = u'color: green'
+        i = p.insertRule(m2, 1)
+        self.assertEqual(i, 1)
+        self.assertEqual(len(p.cssRules), 3)
+
+        self.assertEqual(p.cssText, u'''@page {
+    @top-left {
+        color: red
+        }
+    @top-center {
+        color: green
+        }
+    @top-right {
+        color: blue
+        }
+    }''')
+        
+        # keys and dict index
+        self.assertEqual(u'@top-left' in p, True)
+        self.assertEqual(u'@bottom-left' in p, False)
+        
+        self.assertEqual(p.keys(), [u'@top-left', 
+                                    u'@top-center', 
+                                    u'@top-right'])
+        
+        self.assertEqual(p[u'@bottom-left'], None)
+        self.assertEqual(p[u'@top-left'].cssText, u'color: red')
+        p[u'@top-left'] = u'color: #f00'
+        self.assertEqual(p[u'@top-left'].cssText, u'color: #f00')
+        
+        # delete
+        p.deleteRule(m2)
+        self.assertEqual(len(p.cssRules), 2)
+        self.assertEqual(p.cssText, u'''@page {
+    @top-left {
+        color: #f00
+        }
+    @top-right {
+        color: blue
+        }
+    }''')
+
+        p.deleteRule(0)
+        self.assertEqual(len(p.cssRules), 1)        
+        self.assertEqual(m3, p.cssRules[0])
+        self.assertEqual(p.cssText, u'''@page {
+    @top-right {
+        color: blue
+        }
+    }''')
+
+        del p['@top-right']
+        self.assertEqual(len(p.cssRules), 0)
+                
+    
+    def test_style(self):
+        "CSSPageRule.style (and references)"
+        r = cssutils.css.CSSPageRule()
+        s1 = r.style
+        self.assertEqual(r, s1.parentRule)
+        self.assertEqual(u'', s1.cssText)
+        
+        # set rule.cssText
+        r.cssText = '@page { font-family: x1 }'
+        self.assertNotEqual(r.style, s1)
+        self.assertEqual(r, r.style.parentRule)
+        self.assertEqual(r.cssText, u'@page {\n    font-family: x1\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: x1')
+        self.assertEqual(s1.cssText, u'')
+        s2 = r.style
+        
+        # set invalid rule.cssText
+        try: 
+            r.cssText = '@page { $ }'
+        except xml.dom.SyntaxErr, e:
+            pass
+        self.assertEqual(r.style, s2)
+        self.assertEqual(r, r.style.parentRule)
+        self.assertEqual(r.cssText, u'@page {\n    font-family: x1\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: x1')
+        self.assertEqual(s2.cssText, u'font-family: x1')
+        s3 = r.style
+
+        # set rule.style.cssText
+        r.style.cssText = 'font-family: x2'
+        self.assertEqual(r.style, s3)
+        self.assertEqual(r, r.style.parentRule)
+        self.assertEqual(r.cssText, u'@page {\n    font-family: x2\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: x2')
+
+        # set new style object s2
+        s2 = cssutils.css.CSSStyleDeclaration('font-family: y1')
+        r.style = s2
+        self.assertEqual(r.style, s2)
+        self.assertEqual(r, s2.parentRule)
+        self.assertEqual(r.cssText, u'@page {\n    font-family: y1\n    }')
+        self.assertEqual(s2.cssText, u'font-family: y1')
+        self.assertEqual(r.style.cssText, u'font-family: y1')
+        self.assertEqual(s3.cssText, u'font-family: x2') # old
+
+        # set s2.cssText
+        s2.cssText = 'font-family: y2'
+        self.assertEqual(r.style, s2)
+        self.assertEqual(r.cssText, u'@page {\n    font-family: y2\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: y2')
+        self.assertEqual(s3.cssText, u'font-family: x2') # old
+        # set invalid s2.cssText
+        try: 
+            s2.cssText = '$'
+        except xml.dom.SyntaxErr, e:
+            pass
+        self.assertEqual(r.style, s2)
+        self.assertEqual(r.cssText, u'@page {\n    font-family: y2\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: y2')
+        self.assertEqual(s3.cssText, u'font-family: x2') # old
+
+        # set r.style with text
+        r.style = 'font-family: z'
+        self.assertNotEqual(r.style, s2)
+        self.assertEqual(r.cssText, u'@page {\n    font-family: z\n    }')
+        self.assertEqual(r.style.cssText, u'font-family: z')
+
+    def test_properties(self):
+        "CSSPageRule.style properties"
+        r = cssutils.css.CSSPageRule()
+        r.style.cssText = '''
+        margin-top: 0;
+        margin-right: 0;
+        margin-bottom: 0;
+        margin-left: 0;
+        margin: 0;
+
+        page-break-before: auto;
+        page-break-after: auto;
+        page-break-inside: auto;
+
+        orphans: 3;
+        widows: 3;
+        '''
+        exp = u'''@page {
+    margin-top: 0;
+    margin-right: 0;
+    margin-bottom: 0;
+    margin-left: 0;
+    margin: 0;
+    page-break-before: auto;
+    page-break-after: auto;
+    page-break-inside: auto;
+    orphans: 3;
+    widows: 3
+    }'''
+        self.assertEqual(exp, r.cssText)
+
+    def test_reprANDstr(self):
+        "CSSPageRule.__repr__(), .__str__()"
+        sel=u':left'
+        
+        s = cssutils.css.CSSPageRule(selectorText=sel)
+        
+        self.assertTrue(sel in str(s))
+
+        s2 = eval(repr(s))
+        self.assertTrue(isinstance(s2, s.__class__))
+        self.assertTrue(sel == s2.selectorText)
+
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_util.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_util.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_util.py	(revision 1126)
@@ -0,0 +1,422 @@
+﻿# -*- coding: utf-8 -*-
+"""Testcases for cssutils.util"""
+from __future__ import with_statement
+
+import cgi
+from email import message_from_string, message_from_file
+import StringIO
+import sys
+import urllib2
+import xml.dom
+
+try:
+    import mock
+except ImportError:
+    mock = None
+    print "install mock library to run all tests"
+
+import basetest
+import encutils
+
+from cssutils.util import Base, ListSeq, _readUrl, _defaultFetcher
+
+class ListSeqTestCase(basetest.BaseTestCase):
+
+    def test_all(self):
+        "util.ListSeq"
+        ls = ListSeq()
+        self.assertEqual(0, len(ls))
+        # append()
+        self.assertRaises(NotImplementedError, ls.append, 1)
+        # set
+        self.assertRaises(NotImplementedError, ls.__setitem__, 0, 1)
+
+        # hack:
+        ls.seq.append(1)
+        ls.seq.append(2)
+
+        # len
+        self.assertEqual(2, len(ls))
+        # __contains__
+        self.assertEqual(True, 1 in ls)
+        # get
+        self.assertEqual(1, ls[0])
+        self.assertEqual(2, ls[1])
+        # del
+        del ls[0]
+        self.assertEqual(1, len(ls))
+        self.assertEqual(False, 1 in ls)
+        # for in
+        for x in ls:
+            self.assertEqual(2, x)
+
+
+class BaseTestCase(basetest.BaseTestCase):
+
+    def test_normalize(self):
+        "Base._normalize()"
+        b = Base()
+        tests = {u'abcdefg ABCDEFG äöüß€ AÖÜ': u'abcdefg abcdefg äöüß€ aöü',
+                 ur'\ga\Ga\\\ ': ur'gaga\ ',
+                 ur'0123456789': u'0123456789',
+                 # unicode escape seqs should have been done by
+                 # the tokenizer...
+                 }
+        for test, exp in tests.items():
+            self.assertEqual(b._normalize(test), exp)
+            # static too
+            self.assertEqual(Base._normalize(test), exp)
+
+    def test_tokenupto(self):
+        "Base._tokensupto2()"
+
+        # tests nested blocks of {} [] or ()
+        b = Base()
+
+        tests = [
+            ('default', u'a[{1}]({2}) { } NOT', u'a[{1}]({2}) { }', False),
+            ('default', u'a[{1}]({2}) { } NOT', u'a[{1}]func({2}) { }', True),
+            ('blockstartonly', u'a[{1}]({2}) { NOT', u'a[{1}]({2}) {', False),
+            ('blockstartonly', u'a[{1}]({2}) { NOT', u'a[{1}]func({2}) {', True),
+            ('propertynameendonly', u'a[(2)1] { }2 : a;', u'a[(2)1] { }2 :', False),
+            ('propertynameendonly', u'a[(2)1] { }2 : a;', u'a[func(2)1] { }2 :', True),
+            ('propertyvalueendonly', u'a{;{;}[;](;)}[;{;}[;](;)](;{;}[;](;)) 1; NOT',
+                u'a{;{;}[;](;)}[;{;}[;](;)](;{;}[;](;)) 1;', False),
+            ('propertyvalueendonly', u'a{;{;}[;](;)}[;{;}[;](;)](;{;}[;](;)) 1; NOT',
+                u'a{;{;}[;]func(;)}[;{;}[;]func(;)]func(;{;}[;]func(;)) 1;', True),
+            ('funcendonly', u'a{[1]}([3])[{[1]}[2]([3])]) NOT',
+                u'a{[1]}([3])[{[1]}[2]([3])])', False),
+            ('funcendonly', u'a{[1]}([3])[{[1]}[2]([3])]) NOT',
+                u'a{[1]}func([3])[{[1]}[2]func([3])])', True),
+            ('selectorattendonly', u'[a[()]{()}([()]{()}())] NOT',
+                u'[a[()]{()}([()]{()}())]', False),
+            ('selectorattendonly', u'[a[()]{()}([()]{()}())] NOT',
+                u'[a[func()]{func()}func([func()]{func()}func())]', True),
+            # issue 50
+            ('withstarttoken [', u'a];x', u'[a];', False)
+            ]
+
+        for typ, values, exp, paransasfunc in tests:
+
+            def maketokens(valuelist):
+                # returns list of tuples
+                return [('TYPE', v, 0, 0) for v in valuelist]
+
+            tokens = maketokens(list(values))
+            if paransasfunc:
+                for i, t in enumerate(tokens):
+                    if u'(' == t[1]:
+                        tokens[i] = ('FUNCTION', u'func(', t[2], t[3])
+
+            if 'default' == typ:
+                restokens = b._tokensupto2(tokens)
+            elif 'blockstartonly' == typ:
+                restokens = b._tokensupto2(
+                    tokens, blockstartonly=True)
+            elif 'propertynameendonly' == typ:
+                restokens = b._tokensupto2(
+                    tokens, propertynameendonly=True)
+            elif 'propertyvalueendonly' == typ:
+                restokens = b._tokensupto2(
+                    tokens, propertyvalueendonly=True)
+            elif 'funcendonly' == typ:
+                restokens = b._tokensupto2(
+                    tokens, funcendonly=True)
+            elif 'selectorattendonly' == typ:
+                restokens = b._tokensupto2(
+                    tokens, selectorattendonly=True)
+            elif 'withstarttoken [' == typ:
+                restokens = b._tokensupto2(tokens, ('CHAR', '[', 0, 0))
+
+            res = u''.join([t[1] for t in restokens])
+            self.assertEqual(exp, res)
+
+
+class _readUrl_TestCase(basetest.BaseTestCase):
+    """needs mock"""
+
+    def test_readUrl(self):
+        """util._readUrl()"""
+        # for additional tests see test_parse.py
+        url = 'http://example.com/test.css'
+
+        def make_fetcher(r):
+            # normally r == encoding, content
+            def fetcher(url):
+                return r
+            return fetcher
+
+        tests = {
+            # defaultFetcher returns: readUrl returns
+            None: (None, None, None),
+            (None, ''): ('utf-8', 5, u''),
+            (None, u'€'.encode('utf-8')): ('utf-8', 5, u'€'),
+            ('utf-8', u'€'.encode('utf-8')): ('utf-8', 1, u'€'),
+            ('ISO-8859-1', u'ä'.encode('iso-8859-1')): ('ISO-8859-1', 1, u'ä'),
+            ('ASCII', u'a'.encode('ascii')): ('ASCII', 1, u'a')
+        }
+
+        for r, exp in tests.items():
+            self.assertEqual(_readUrl(url, fetcher=make_fetcher(r)), exp)
+
+        tests = {
+            # (overrideEncoding, parentEncoding, (httpencoding, content)):
+            #                        readUrl returns
+
+            # ===== 0. OVERRIDE WINS =====
+            # override + parent + http
+            ('latin1', 'ascii', ('utf-16', u''.encode())): ('latin1', 0, u''),
+            ('latin1', 'ascii', ('utf-16', u'123'.encode())): ('latin1', 0, u'123'),
+            ('latin1', 'ascii', ('utf-16', u'ä'.encode('iso-8859-1'))):
+                ('latin1', 0, u'ä'),
+            ('latin1', 'ascii', ('utf-16', u'a'.encode('ascii'))):
+                ('latin1',0,  u'a'),
+            # + @charset
+            ('latin1', 'ascii', ('utf-16', u'@charset "ascii";'.encode())):
+                ('latin1', 0, u'@charset "latin1";'),
+            ('latin1', 'ascii', ('utf-16', u'@charset "utf-8";ä'.encode('latin1'))):
+                ('latin1', 0, u'@charset "latin1";ä'),
+            ('latin1', 'ascii', ('utf-16', u'@charset "utf-8";ä'.encode('utf-8'))):
+                ('latin1', 0, u'@charset "latin1";\xc3\xa4'), # read as latin1!
+
+            # override only
+            ('latin1', None, None): (None, None, None),
+            ('latin1', None, (None, u''.encode())): ('latin1', 0, u''),
+            ('latin1', None, (None, u'123'.encode())): ('latin1', 0, u'123'),
+            ('latin1', None, (None, u'ä'.encode('iso-8859-1'))):
+                ('latin1', 0, u'ä'),
+            ('latin1', None, (None, u'a'.encode('ascii'))):
+                ('latin1', 0, u'a'),
+            # + @charset
+            ('latin1', None, (None, u'@charset "ascii";'.encode())):
+                ('latin1', 0, u'@charset "latin1";'),
+            ('latin1', None, (None, u'@charset "utf-8";ä'.encode('latin1'))):
+                ('latin1', 0, u'@charset "latin1";ä'),
+            ('latin1', None, (None, u'@charset "utf-8";ä'.encode('utf-8'))):
+                ('latin1', 0, u'@charset "latin1";\xc3\xa4'), # read as latin1!
+
+            # override + parent
+            ('latin1', 'ascii', None): (None, None, None),
+            ('latin1', 'ascii', (None, u''.encode())): ('latin1', 0, u''),
+            ('latin1', 'ascii', (None, u'123'.encode())): ('latin1', 0, u'123'),
+            ('latin1', 'ascii', (None, u'ä'.encode('iso-8859-1'))):
+                ('latin1', 0, u'ä'),
+            ('latin1', 'ascii', (None, u'a'.encode('ascii'))):
+                ('latin1', 0, u'a'),
+            # + @charset
+            ('latin1', 'ascii', (None, u'@charset "ascii";'.encode())):
+                ('latin1', 0, u'@charset "latin1";'),
+            ('latin1', 'ascii', (None, u'@charset "utf-8";ä'.encode('latin1'))):
+                ('latin1', 0, u'@charset "latin1";ä'),
+            ('latin1', 'ascii', (None, u'@charset "utf-8";ä'.encode('utf-8'))):
+                ('latin1', 0, u'@charset "latin1";\xc3\xa4'), # read as latin1!
+
+            # override + http
+            ('latin1', None, ('utf-16', u''.encode())): ('latin1', 0, u''),
+            ('latin1', None, ('utf-16', u'123'.encode())): ('latin1', 0, u'123'),
+            ('latin1', None, ('utf-16', u'ä'.encode('iso-8859-1'))):
+                ('latin1', 0, u'ä'),
+            ('latin1', None, ('utf-16', u'a'.encode('ascii'))):
+                ('latin1', 0, u'a'),
+            # + @charset
+            ('latin1', None, ('utf-16', u'@charset "ascii";'.encode())):
+                ('latin1', 0, u'@charset "latin1";'),
+            ('latin1', None, ('utf-16', u'@charset "utf-8";ä'.encode('latin1'))):
+                ('latin1', 0, u'@charset "latin1";ä'),
+            ('latin1', None, ('utf-16', u'@charset "utf-8";ä'.encode('utf-8'))):
+                ('latin1', 0, u'@charset "latin1";\xc3\xa4'), # read as latin1!
+
+            # override ü @charset
+            ('latin1', None, (None, u'@charset "ascii";'.encode())):
+                ('latin1', 0, u'@charset "latin1";'),
+            ('latin1', None, (None, u'@charset "utf-8";ä'.encode('latin1'))):
+                ('latin1', 0, u'@charset "latin1";ä'),
+            ('latin1', None, (None, u'@charset "utf-8";ä'.encode('utf-8'))):
+                ('latin1', 0, u'@charset "latin1";\xc3\xa4'), # read as latin1!
+
+
+            # ===== 1. HTTP WINS =====
+            (None, 'ascii', ('latin1', u''.encode())): ('latin1', 1, u''),
+            (None, 'ascii', ('latin1', u'123'.encode())): ('latin1', 1, u'123'),
+            (None, 'ascii', ('latin1', u'ä'.encode('iso-8859-1'))):
+                ('latin1', 1, u'ä'),
+            (None, 'ascii', ('latin1', u'a'.encode('ascii'))):
+                ('latin1', 1, u'a'),
+            # + @charset
+            (None, 'ascii', ('latin1', u'@charset "ascii";'.encode())):
+                ('latin1', 1, u'@charset "latin1";'),
+            (None, 'ascii', ('latin1', u'@charset "utf-8";ä'.encode('latin1'))):
+                ('latin1', 1, u'@charset "latin1";ä'),
+            (None, 'ascii', ('latin1', u'@charset "utf-8";ä'.encode('utf-8'))):
+                ('latin1', 1, u'@charset "latin1";\xc3\xa4'), # read as latin1!
+
+
+            # ===== 2. @charset WINS =====
+            (None, 'ascii', (None, u'@charset "latin1";'.encode())):
+                ('latin1', 2, u'@charset "latin1";'),
+            (None, 'ascii', (None, u'@charset "latin1";ä'.encode('latin1'))):
+                ('latin1', 2, u'@charset "latin1";ä'),
+            (None, 'ascii', (None, u'@charset "latin1";ä'.encode('utf-8'))):
+                ('latin1', 2, u'@charset "latin1";\xc3\xa4'), # read as latin1!
+
+            # ===== 2. BOM WINS =====
+            (None, 'ascii', (None, u'ä'.encode('utf-8-sig'))):
+                ('utf-8-sig', 2, u'\xe4'), # read as latin1!
+            (None, 'ascii', (None, u'@charset "utf-8";ä'.encode('utf-8-sig'))):
+                ('utf-8-sig', 2, u'@charset "utf-8";\xe4'), # read as latin1!
+            (None, 'ascii', (None, u'@charset "latin1";ä'.encode('utf-8-sig'))):
+                ('utf-8-sig', 2, u'@charset "utf-8";\xe4'), # read as latin1!
+
+
+            # ===== 4. parentEncoding WINS =====
+            (None, 'latin1', (None, u''.encode())): ('latin1', 4, u''),
+            (None, 'latin1', (None, u'123'.encode())): ('latin1', 4, u'123'),
+            (None, 'latin1', (None, u'ä'.encode('iso-8859-1'))):
+                ('latin1', 4, u'ä'),
+            (None, 'latin1', (None, u'a'.encode('ascii'))):
+                ('latin1', 4, u'a'),
+            (None, 'latin1', (None, u'ä'.encode('utf-8'))):
+                ('latin1', 4, u'\xc3\xa4'), # read as latin1!
+
+            # ===== 5. default WINS which in this case is None! =====
+            (None, None, (None, u''.encode())): ('utf-8', 5, u''),
+            (None, None, (None, u'123'.encode())): ('utf-8', 5, u'123'),
+            (None, None, (None, u'a'.encode('ascii'))):
+                ('utf-8', 5, u'a'),
+            (None, None, (None, u'ä'.encode('utf-8'))):
+                ('utf-8', 5, u'ä'), # read as utf-8
+            (None, None, (None, u'ä'.encode('iso-8859-1'))): # trigger UnicodeDecodeError!
+                ('utf-8', 5, None),
+
+
+        }
+        for (override, parent, r), exp in tests.items():
+            self.assertEqual(_readUrl(url,
+                                       overrideEncoding=override,
+                                       parentEncoding=parent,
+                                       fetcher=make_fetcher(r)),
+                              exp)
+
+    def test_defaultFetcher(self):
+        """util._defaultFetcher"""
+        if mock:
+
+            class Response(object):
+                """urllib2.Reponse mock"""
+                def __init__(self, url,
+                             contenttype, content,
+                             exception=None, args=None):
+                    self.url = url
+
+                    mt, params = cgi.parse_header(contenttype)
+                    self.mimetype = mt
+                    self.charset = params.get('charset', None)
+
+                    self.text = content
+
+                    self.exception = exception
+                    self.args = args
+
+                def geturl(self):
+                    return self.url
+
+                def info(self):
+                    mimetype, charset = self.mimetype, self.charset
+                    class Info(object):
+                        
+                        # py2x
+                        def gettype(self):
+                            return mimetype
+                        def getparam(self, name=None):
+                            return charset
+                        
+                        # py 3x
+                        get_content_type = gettype
+                        get_content_charset = getparam # here always charset!  
+                        
+                    return Info()
+
+                def read(self):
+                    # returns fake text or raises fake exception
+                    if not self.exception:
+                        return self.text
+                    else:
+                        raise self.exception(*self.args)
+
+            def urlopen(url,
+                        contenttype=None, content=None,
+                        exception=None, args=None):
+                # return an mock which returns parameterized Response
+                def x(*ignored):
+                    if exception:
+                        raise exception(*args)
+                    else:
+                        return Response(url,
+                                        contenttype, content,
+                                        exception=exception, args=args)
+                return x
+
+            urlopenpatch = 'urllib2.urlopen' if basetest.PY2x else 'urllib.request.urlopen' 
+
+            # positive tests
+            tests = {
+                # content-type, contentstr: encoding, contentstr
+                ('text/css', u'€'.encode('utf-8')):
+                        (None, u'€'.encode('utf-8')),
+                ('text/css;charset=utf-8', u'€'.encode('utf-8')):
+                        ('utf-8', u'€'.encode('utf-8')),
+                ('text/css;charset=ascii', 'a'):
+                        ('ascii', 'a')
+            }
+            url = 'http://example.com/test.css'
+            for (contenttype, content), exp in tests.items():
+                @mock.patch(urlopenpatch, new=urlopen(url, contenttype, content))
+                def do(url):
+                    return _defaultFetcher(url)
+                
+                self.assertEqual(exp, do(url))
+
+            # wrong mimetype
+            @mock.patch(urlopenpatch, new=urlopen(url, 'text/html', 'a'))
+            def do(url):
+                return _defaultFetcher(url)
+            
+            self.assertRaises(ValueError, do, url)
+            
+            # calling url results in fake exception
+                            
+            # py2 ~= py3 raises error earlier than urlopen!
+            tests = {
+                '1': (ValueError, ['invalid value for url']),
+                #_readUrl('mailto:a.css')
+                'mailto:e4': (urllib2.URLError, ['urlerror']),
+                # cannot resolve x, IOError
+                'http://x': (urllib2.URLError, ['ioerror']),
+            }
+            for url, (exception, args) in tests.items():
+                @mock.patch(urlopenpatch, new=urlopen(url, exception=exception, args=args))
+                def do(url):
+                    return _defaultFetcher(url)
+                
+                self.assertRaises(exception, do, url)
+
+            # py2 != py3 raises error earlier than urlopen!
+            urlrequestpatch = 'urllib2.urlopen' if basetest.PY2x else 'urllib.request.Request' 
+            tests = {
+                #_readUrl('http://cthedot.de/__UNKNOWN__.css')
+                'e2': (urllib2.HTTPError, ['u', 500, 'server error', {}, None]),
+                'e3': (urllib2.HTTPError, ['u', 404, 'not found', {}, None]),
+            }
+            for url, (exception, args) in tests.items():
+                @mock.patch(urlrequestpatch, new=urlopen(url, exception=exception, args=args))
+                def do(url):
+                    return _defaultFetcher(url)
+                
+                self.assertRaises(exception, do, url)
+
+        else:
+            self.assertEqual(False, u'Mock needed for this test')
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_prodparser.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_prodparser.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/tests/test_prodparser.py	(revision 1126)
@@ -0,0 +1,397 @@
+"""Testcases for cssutils.css.CSSCharsetRule"""
+__version__ = '$Id: test_csscharsetrule.py 1356 2008-07-13 17:29:09Z cthedot $'
+
+import sys
+import xml.dom
+import basetest
+from cssutils.prodparser import *
+from cssutils.prodparser import ParseError, Done, Exhausted, NoMatch # not in __all__
+
+class ProdTestCase(basetest.BaseTestCase):
+
+    def test_init(self):
+        "Prod.__init__(...)"
+        p = Prod('min', lambda t, v: t == 1 and v == 2)
+        
+        self.assertEqual(str(p), 'min')
+        self.assertEqual(p.toStore, None)
+        self.assertEqual(p.optional, False)
+        
+        p = Prod('optional', lambda t, v: True, 
+                  optional=True)
+        self.assertEqual(p.optional, True)
+
+    def test_initMatch(self):
+        "Prod.__init__(...match=...)"
+        p = Prod('min', lambda t, v: t == 1 and v == 2)
+        self.assertEqual(p.match(1, 2), True)
+        self.assertEqual(p.match(2, 2), False)
+        self.assertEqual(p.match(1, 1), False)
+
+    def test_initToSeq(self):
+        "Prod.__init__(...toSeq=...)"
+        # simply saves
+        p = Prod('all', lambda t, tokens: True,
+                 toSeq=None)
+        self.assertEqual(p.toSeq([1, 2], None), (1, 2)) # simply saves
+        self.assertEqual(p.toSeq(['s1', 's2'], None), ('s1', 's2')) # simply saves
+
+        # saves callback(val)
+        p = Prod('all', lambda t, v: True, 
+                  toSeq=lambda t, tokens: (1 == t[0], 3 == t[1]))        
+        self.assertEqual(p.toSeq([1, 3], None), (True, True))
+        self.assertEqual(p.toSeq([2, 4], None), (False, False))
+
+    def test_initToStore(self):
+        "Prod.__init__(...toStore=...)"
+        p = Prod('all', lambda t, v: True, 
+                  toStore='key')
+
+        # save as key
+        s = {}
+        p.toStore(s, 1)
+        self.assertEqual(s['key'], 1)
+
+        # append to key
+        s = {'key': []}
+        p.toStore(s, 1)
+        p.toStore(s, 2)
+        self.assertEqual(s['key'], [1, 2])
+
+        # callback
+        def doubleToStore(key):
+            def toStore(store, item):
+                    store[key] = item * 2
+            return toStore
+        
+        p = Prod('all', lambda t, v: True, 
+                  toStore=doubleToStore('key'))
+        s = {'key': []}
+        p.toStore(s, 1)
+        self.assertEqual(s['key'], 2)
+
+    def test_matches(self):
+        "Prod.matches(token)"
+        p1 = Prod('p1', lambda t, v: t == 1 and v == 2)
+        p2 = Prod('p2', lambda t, v: t == 1 and v == 2, optional=True)
+        self.assertEqual(p1.matches([1, 2, 0, 0]), True)
+        self.assertEqual(p2.matches([1, 2, 0, 0]), True)
+        self.assertEqual(p1.matches([0, 0, 0, 0]), False)
+        self.assertEqual(p2.matches([0, 0, 0, 0]), False)
+
+
+class SequenceTestCase(basetest.BaseTestCase):
+    
+    def test_init(self):
+        "Sequence.__init__()"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2)            
+        seq = Sequence(p1, p1)
+        
+        self.assertEqual(1, seq._min)
+        self.assertEqual(1, seq._max)
+
+    def test_initminmax(self):
+        "Sequence.__init__(...minmax=...)"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2)
+            
+        s = Sequence(p1, p2, minmax=lambda: (2, 3))
+        self.assertEqual(2, s._min)
+        self.assertEqual(3, s._max)
+
+        s = Sequence(p1, p2, minmax=lambda: (0, None))        
+        self.assertEqual(0, s._min)
+        
+        try:
+            # py2.6/3
+            m = sys.maxsize
+        except AttributeError:
+            # py<1.6
+            m = sys.maxint
+        self.assertEqual(m, s._max)
+
+    def test_optional(self):
+        "Sequence.optional"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+            
+        s = Sequence(p1, minmax=lambda: (1, 3))
+        self.assertEqual(False, s.optional)
+        s = Sequence(p1, minmax=lambda: (0, 3))
+        self.assertEqual(True, s.optional)
+        s = Sequence(p1, minmax=lambda: (0, None))
+        self.assertEqual(True, s.optional)
+
+    def test_reset(self):
+        "Sequence.reset()"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2)
+        seq = Sequence(p1, p2)
+        t1 = (1, 0, 0, 0)
+        t2 = (2, 0, 0, 0)
+        self.assertEqual(p1, seq.nextProd(t1))
+        self.assertEqual(p2, seq.nextProd(t2))
+        self.assertRaises(Exhausted, seq.nextProd, t1)
+        seq.reset()
+        self.assertEqual(p1, seq.nextProd(t1))        
+
+    def test_matches(self):
+        "Sequence.matches()"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2, optional=True)
+
+        t1 = (1, 0, 0, 0)
+        t2 = (2, 0, 0, 0)
+        t3 = (3, 0, 0, 0)
+            
+        s = Sequence(p1, p2)
+        self.assertEqual(True, s.matches(t1))
+        self.assertEqual(False, s.matches(t2))
+        
+        s = Sequence(p2, p1)
+        self.assertEqual(True, s.matches(t1))
+        self.assertEqual(True, s.matches(t2))
+
+        s = Sequence(Choice(p1, p2))
+        self.assertEqual(True, s.matches(t1))
+        self.assertEqual(True, s.matches(t2))
+        self.assertEqual(False, s.matches(t3))
+
+    def test_nextProd(self):
+        "Sequence.nextProd()"
+        p1 = Prod('p1', lambda t, v: t == 1, optional=True)      
+        p2 = Prod('p2', lambda t, v: t == 2)
+        t1 = (1, 0, 0, 0)
+        t2 = (2, 0, 0, 0)
+                  
+        tests = {
+            # seq: list of list of (token, prod or error msg)
+            (p1, ): ([(t1, p1)],
+                     [(t2, 'Extra token')], # as p1 optional
+                     [(t1, p1), (t1, u'Extra token')],
+                     [(t1, p1), (t2, u'Extra token')]
+                    ),
+            (p2, ): ([(t2, p2)],
+                     [(t2, p2), (t2, u'Extra token')],
+                     [(t2, p2), (t1, u'Extra token')],
+                     [(t1, 'Missing token for production p2')]
+                    ),
+            (p1, p2): ([(t1, p1), (t2, p2)],
+                       [(t1, p1), (t1, u'Missing token for production p2')]
+                       )
+            }
+        for seqitems, results in tests.items():
+            for result in results: 
+                seq = Sequence(*seqitems)
+                for t, p in result:
+                    if isinstance(p, basestring):
+                        self.assertRaisesMsg(ParseError, p, seq.nextProd, t)
+                    else:
+                        self.assertEqual(p, seq.nextProd(t))
+
+        tests = {
+            # seq: list of list of (token, prod or error msg)
+            # as p1 optional!
+            (p1, p1): ([(t1, p1)],
+                       [(t1, p1), (t1, p1)],
+                       [(t1, p1), (t1, p1)],
+                       [(t1, p1), (t1, p1), (t1, p1)],
+                       [(t1, p1), (t1, p1), (t1, p1), (t1, p1)],
+                       [(t1, p1), (t1, p1), (t1, p1), (t1, p1), (t1, u'Extra token')],
+                     ),
+            (p1, ): ([(t1, p1)],
+                     [(t2, 'Extra token')], 
+                     [(t1, p1), (t1, p1)],
+                     [(t1, p1), (t2, 'Extra token')],
+                     [(t1, p1), (t1, p1), (t1, u'Extra token')],
+                     [(t1, p1), (t1, p1), (t2, u'Extra token')]
+                    ),
+            # as p2 NOT optional
+            (p2, ): ([(t2, p2)],
+                     [(t1, 'Missing token for production p2')],
+                     [(t2, p2), (t2, p2)],
+                     [(t2, p2), (t1, u'No match for (1, 0, 0, 0) in Sequence(p2)')],
+                     [(t2, p2), (t2, p2), (t2, u'Extra token')],
+                     [(t2, p2), (t2, p2), (t1, u'Extra token')]
+                    ),
+            (p1, p2): ([(t1, p1), (t1, u'Missing token for production p2')],
+                       [(t2, p2), (t2, p2)],
+                       [(t2, p2), (t1, p1), (t2, p2)],
+                       [(t1, p1), (t2, p2), (t2, p2)],
+                       [(t1, p1), (t2, p2), (t1, p1), (t2, p2)],
+                       [(t2, p2), (t2, p2), (t2, u'Extra token')],
+                       [(t2, p2), (t1, p1), (t2, p2), (t1, 'Extra token')],
+                       [(t2, p2), (t1, p1), (t2, p2), (t2, 'Extra token')],
+                       [(t1, p1), (t2, p2), (t2, p2), (t1, 'Extra token')],
+                       [(t1, p1), (t2, p2), (t2, p2), (t2, 'Extra token')],
+                       [(t1, p1), (t2, p2), (t1, p1), (t2, p2), (t1, 'Extra token')],
+                       [(t1, p1), (t2, p2), (t1, p1), (t2, p2), (t2, 'Extra token')],
+                       )
+            }
+        for seqitems, results in tests.items():
+            for result in results: 
+                seq = Sequence(minmax=lambda: (1,2), *seqitems)
+                for t, p in result:
+                    if isinstance(p, basestring):
+                        self.assertRaisesMsg(ParseError, p, seq.nextProd, t)
+                    else:
+                        self.assertEqual(p, seq.nextProd(t))
+                                
+        
+class ChoiceTestCase(basetest.BaseTestCase):
+    
+    def test_init(self):
+        "Choice.__init__()"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2)
+        t0 = (0,0,0,0)
+        t1 = (1,0,0,0)
+        t2 = (2,0,0,0)
+            
+        ch = Choice(p1, p2)
+        self.assertRaisesMsg(ParseError, u'No match for (0, 0, 0, 0) in Choice(p1, p2)', ch.nextProd, t0)
+        self.assertEqual(p1, ch.nextProd(t1))
+        self.assertRaisesMsg(Exhausted, u'Extra token', ch.nextProd, t1)
+
+        ch = Choice(p1, p2)
+        self.assertEqual(p2, ch.nextProd(t2))
+        self.assertRaisesMsg(Exhausted, u'Extra token', ch.nextProd, t2)
+
+        ch = Choice(p2, p1)
+        self.assertRaisesMsg(ParseError, 'No match for (0, 0, 0, 0) in Choice(p2, p1)', ch.nextProd, t0)
+        self.assertEqual(p1, ch.nextProd(t1))
+        self.assertRaisesMsg(Exhausted, u'Extra token', ch.nextProd, t1)
+
+        ch = Choice(p2, p1)
+        self.assertEqual(p2, ch.nextProd(t2))
+        self.assertRaisesMsg(Exhausted, u'Extra token', ch.nextProd, t2)
+
+    def test_matches(self):
+        "Choice.matches()"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2, optional=True)
+
+        t1 = (1, 0, 0, 0)
+        t2 = (2, 0, 0, 0)
+        t3 = (3, 0, 0, 0)
+            
+        c = Choice(p1, p2)
+        self.assertEqual(True, c.matches(t1))
+        self.assertEqual(True, c.matches(t2))
+        self.assertEqual(False, c.matches(t3))
+
+        c = Choice(Sequence(p1), Sequence(p2))
+        self.assertEqual(True, c.matches(t1))
+        self.assertEqual(True, c.matches(t2))
+        self.assertEqual(False, c.matches(t3))
+
+    def test_nested(self):
+        "Choice with nested Sequence"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2)
+        s1 = Sequence(p1, p1)
+        s2 = Sequence(p2, p2)
+        t0 = (0,0,0,0)
+        t1 = (1,0,0,0)
+        t2 = (2,0,0,0)
+
+        ch = Choice(s1, s2)
+        self.assertRaisesMsg(ParseError, u'No match for (0, 0, 0, 0) in Choice(Sequence(p1, p1), Sequence(p2, p2))', ch.nextProd, t0)
+        self.assertEqual(s1, ch.nextProd(t1))
+        self.assertRaisesMsg(Exhausted, u'Extra token', ch.nextProd, t1)
+            
+        ch = Choice(s1, s2)
+        self.assertEqual(s2, ch.nextProd(t2))
+        self.assertRaisesMsg(Exhausted, u'Extra token', ch.nextProd, t1)
+
+    def test_reset(self):    
+        "Choice.reset()"
+        p1 = Prod('p1', lambda t, v: t == 1)      
+        p2 = Prod('p2', lambda t, v: t == 2)
+        t1 = (1,0,0,0)
+        t2 = (2,0,0,0)
+
+        ch = Choice(p1, p2)
+        self.assertEqual(p1, ch.nextProd(t1))
+        self.assertRaises(Exhausted, ch.nextProd, t1)
+        ch.reset()
+        self.assertEqual(p2, ch.nextProd(t2))
+
+class ProdParserTestCase(basetest.BaseTestCase):
+
+    def setUp(self):
+        pass
+
+    def test_parse_keepS(self):
+        "ProdParser.parse(keepS)"  
+        p = ProdParser()
+            
+        # text, name, productions, store=None
+        prods = lambda: Sequence(PreDef.char(';', u';'),
+                                 PreDef.char(':', u':')
+                                 )       
+        
+        w, seq, store, unused = p.parse('; :', 'test', prods(), 
+                                                   keepS=True)
+        self.assertTrue(w)
+        self.assertEqual(3, len(seq))
+
+        w, seq, store, unused = p.parse('; :', 'test', prods(), 
+                                                   keepS=False)
+        self.assertTrue(w)
+        self.assertEqual(2, len(seq))
+
+    def test_combi(self):
+        "ProdParser.parse() 2"
+        p1 = Prod('p1', lambda t, v: v == '1')      
+        p2 = Prod('p2', lambda t, v: v == '2')
+        p3 = Prod('p3', lambda t, v: v == '3')
+        
+        tests = {'1 2': True,
+                 '1 2 1 2': True,
+                 '3': True,
+                 #'': 'No match in Choice(Sequence(p1, p2), p3)',
+                 '1': 'Missing token for production p2',
+                 '1 2 1': 'Missing token for production p2',
+                 '1 2 1 2 x': "No match: ('IDENT', 'x', 1, 9)",
+                 '1 2 1 2 1': "No match: ('NUMBER', '1', 1, 9)",
+                 '3 x': "No match: ('IDENT', 'x', 1, 3)",
+                 '3 3': "No match: ('NUMBER', '3', 1, 3)",
+                 }
+        for text, exp in tests.items():
+            prods = Choice(Sequence(p1, p2, minmax=lambda: (1,2)),
+                           p3)
+            if exp is True:
+                wellformed, seq, store, unused = ProdParser().parse(text, 'T', prods)
+                self.assertEqual(wellformed, exp)
+            else:
+                self.assertRaisesMsg(xml.dom.SyntaxErr, u'T: %s' % exp,
+                                     ProdParser().parse, text, 'T', prods)
+        
+        tests = {'1 3': True,
+                 '1 1 3': True,
+                 '2 3': True,
+                 '1': 'Missing token for production p3',
+                 '1 1': 'Missing token for production p3',
+                 '1 3 3': "No match: ('NUMBER', '3', 1, 5)",
+                 '1 1 3 3': "No match: ('NUMBER', '3', 1, 7)",
+                 '2 3 3': "No match: ('NUMBER', '3', 1, 5)",
+                 '2': 'Missing token for production p3',
+                 '3': "Missing token for production Choice(Sequence(p1), p2): ('NUMBER', '3', 1, 1)",
+                 }
+        for text, exp in tests.items():
+            prods = Sequence(Choice(Sequence(p1, minmax=lambda: (1,2)),
+                                    p2),
+                             p3)
+            if exp is True:
+                wellformed, seq, store, unused = ProdParser().parse(text, 'T', prods)
+                self.assertEqual(wellformed, exp)
+            else:
+                self.assertRaisesMsg(xml.dom.SyntaxErr, u'T: %s' % exp,
+                                     ProdParser().parse, text, 'T', prods)
+                        
+        
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/codec.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/codec.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/codec.py	(revision 1126)
@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+"""Python codec for CSS."""
+__docformat__ = 'restructuredtext'
+__author__ = 'Walter Doerwald'
+__version__ = '$Id: util.py 1114 2008-03-05 13:22:59Z cthedot $'
+
+import sys
+
+if sys.version_info < (3,):
+    from _codec2 import *
+    # for tests
+    from _codec2 import _fixencoding
+else:
+    from _codec3 import *
+    # for tests
+    from _codec3 import _fixencoding
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/util.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/util.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/util.py	(revision 1126)
@@ -0,0 +1,941 @@
+"""base classes and helper functions for css and stylesheets packages
+"""
+__all__ = []
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from helper import normalize
+from itertools import ifilter, chain
+import cssutils
+import codec
+import codecs
+import errorhandler
+import tokenize2
+import types
+import xml.dom
+
+try:
+    from _fetchgae import _defaultFetcher
+except ImportError, e:
+    from _fetch import _defaultFetcher
+
+log = errorhandler.ErrorHandler()
+
+class _BaseClass(object):
+    """
+    Base class for Base, Base2 and _NewBase.
+
+    **Base and Base2 will be removed in the future!**
+    """
+    _log = errorhandler.ErrorHandler()
+    _prods = tokenize2.CSSProductions
+
+    def _checkReadonly(self):
+        "Raise xml.dom.NoModificationAllowedErr if rule/... is readonly"
+        if hasattr(self, '_readonly') and self._readonly:
+            raise xml.dom.NoModificationAllowedErr(
+                u'%s is readonly.' % self.__class__)
+            return True
+        return False
+
+    def _valuestr(self, t):
+        """
+        Return string value of t (t may be a string, a list of token tuples
+        or a single tuple in format (type, value, line, col).
+        Mainly used to get a string value of t for error messages.
+        """
+        if not t:
+            return u''
+        elif isinstance(t, basestring):
+            return t
+        else:
+            return u''.join([x[1] for x in t])
+
+
+class _NewBase(_BaseClass):
+    """
+    New base class for classes using ProdParser.
+
+    **Currently CSSValue and related ones only.**
+    """
+    def __init__(self):
+        self._seq = Seq()
+
+    def _setSeq(self, newseq):
+        """Set value of ``seq`` which is readonly."""
+        newseq._readonly = True
+        self._seq = newseq
+
+    def _clearSeq(self):
+        self._seq.clear()
+
+    def _tempSeq(self, readonly=False):
+        "Get a writeable Seq() which is used to set ``seq`` later"
+        return Seq(readonly=readonly)
+
+    seq = property(lambda self: self._seq,
+                   doc="Internal readonly attribute, **DO NOT USE**!")
+
+
+class _NewListBase(_NewBase):
+    """
+    (EXPERIMENTAL)
+    A base class used for list classes like stylesheets.MediaList
+
+    adds list like behaviour running on inhering class' property ``seq``
+
+    - item in x => bool
+    - len(x) => integer
+    - get, set and del x[i]
+    - for item in x
+    - append(item)
+
+    some methods must be overwritten in inheriting class
+    """
+    def __init__(self):
+        self._seq = Seq()
+
+    def __contains__(self, item):
+        for it in self._seq:
+            if item == it.value:
+                return True
+        return False
+
+    def __delitem__(self, index):
+        del self._seq[index]
+
+    def __getitem__(self, index):
+        return self._seq[index].value
+
+    def __iter__(self):
+        def gen():
+            for x in self._seq:
+                yield x.value
+        return gen()
+
+    def __len__(self):
+        return len(self._seq)
+
+    def __setitem__(self, index, item):
+        "must be overwritten"
+        raise NotImplementedError
+
+    def append(self, item):
+        "must be overwritten"
+        raise NotImplementedError
+
+
+class Base(_BaseClass):
+    """
+    **Superceded by _NewBase**
+
+    **Superceded by Base2 which is used for new seq handling class.**
+
+    Base class for most CSS and StyleSheets classes
+
+    Contains helper methods for inheriting classes helping parsing
+
+    ``_normalize`` is static as used by Preferences.
+    """
+    __tokenizer2 = tokenize2.Tokenizer()
+
+    # for more on shorthand properties see
+    # http://www.dustindiaz.com/css-shorthand/
+    # format: shorthand: [(propname, mandatorycheck?)*]
+    _SHORTHANDPROPERTIES = {
+            u'background': [],
+            #u'background-position': [], # list of 2 values!
+            u'border': [],
+            u'border-left': [],
+            u'border-right': [],
+            u'border-top': [],
+            u'border-bottom': [],
+            #u'border-color': [], # list or single but same values
+            #u'border-style': [], # list or single but same values
+            #u'border-width': [], # list or single but same values
+            u'cue': [],
+            u'font': [],
+            u'list-style': [],
+            #u'margin': [], # list or single but same values
+            u'outline': [],
+            #u'padding': [], # list or single but same values
+            u'pause': []
+            }
+
+    @staticmethod
+    def _normalize(x):
+        """
+        normalizes x, namely:
+
+        - remove any \ before non unicode sequences (0-9a-zA-Z) so for
+          x=="c\olor\" return "color" (unicode escape sequences should have
+          been resolved by the tokenizer already)
+        - lowercase
+        """
+        return normalize(x)
+
+    def _splitNamespacesOff(self, text_namespaces_tuple):
+        """
+        returns tuple (text, dict-of-namespaces) or if no namespaces are
+        in cssText returns (cssText, {})
+
+        used in Selector, SelectorList, CSSStyleRule, CSSMediaRule and
+        CSSStyleSheet
+        """
+        if isinstance(text_namespaces_tuple, tuple):
+            return text_namespaces_tuple[0], _SimpleNamespaces(self._log,
+                                                    text_namespaces_tuple[1])
+        else:
+            return text_namespaces_tuple, _SimpleNamespaces(log=self._log)
+
+    def _tokenize2(self, textortokens):
+        """
+        returns tokens of textortokens which may already be tokens in which
+        case simply returns input
+        """
+        if not textortokens:
+            return None
+        elif isinstance(textortokens, basestring):
+            # needs to be tokenized
+            return self.__tokenizer2.tokenize(
+                 textortokens)
+        elif isinstance(textortokens, tuple):
+            # a single token (like a comment)
+            return [textortokens]
+        else:
+            # already tokenized but return an iterator
+            return iter(textortokens)
+
+    def _nexttoken(self, tokenizer, default=None):
+        "returns next token in generator tokenizer or the default value"
+        try:
+            return tokenizer.next()
+        # TypeError for py3
+        except (StopIteration, AttributeError, TypeError):
+            return default
+
+    def _type(self, token):
+        "returns type of Tokenizer token"
+        if token:
+            return token[0]
+        else:
+            return None
+
+    def _tokenvalue(self, token, normalize=False):
+        "returns value of Tokenizer token"
+        if token and normalize:
+            return Base._normalize(token[1])
+        elif token:
+            return token[1]
+        else:
+            return None
+
+    def _stringtokenvalue(self, token):
+        """
+        for STRING returns the actual content without surrounding "" or ''
+        and without respective escapes, e.g.::
+
+             "with \" char" => with " char
+        """
+        if token:
+            value = token[1]
+            return value.replace('\\' + value[0], value[0])[1: - 1]
+        else:
+            return None
+
+    def _uritokenvalue(self, token):
+        """
+        for URI returns the actual content without surrounding url()
+        or url(""), url('') and without respective escapes, e.g.::
+
+             url("\"") => "
+        """
+        if token:
+            value = token[1][4: - 1].strip()
+            if value and (value[0] in '\'"') and (value[0] == value[ - 1]):
+                # a string "..." or '...'
+                value = value.replace('\\' + value[0], value[0])[1: - 1]
+            return value
+        else:
+            return None
+
+    def _tokensupto2(self,
+                     tokenizer,
+                     starttoken=None,
+                     blockstartonly=False, # {
+                     blockendonly=False, # }
+                     mediaendonly=False,
+                     importmediaqueryendonly=False, # ; or STRING
+                     mediaqueryendonly=False, # { or STRING
+                     semicolon=False, # ;
+                     propertynameendonly=False, # :
+                     propertyvalueendonly=False, # ! ; }
+                     propertypriorityendonly=False, # ; }
+                     selectorattendonly=False, # ]
+                     funcendonly=False, # )
+                     listseponly=False, # ,
+                     separateEnd=False # returns (resulttokens, endtoken)
+                     ):
+        """
+        returns tokens upto end of atrule and end index
+        end is defined by parameters, might be ; } ) or other
+
+        default looks for ending "}" and ";"
+        """
+        ends = u';}'
+        endtypes = ()
+        brace = bracket = parant = 0 # {}, [], ()
+
+        if blockstartonly: # {
+            ends = u'{'
+            brace = - 1 # set to 0 with first {
+        elif blockendonly: # }
+            ends = u'}'
+            brace = 1
+        elif mediaendonly: # }
+            ends = u'}'
+            brace = 1 # rules } and mediarules }
+        elif importmediaqueryendonly:
+            # end of mediaquery which may be ; or STRING
+            ends = u';'
+            endtypes = ('STRING',)
+        elif mediaqueryendonly:
+            # end of mediaquery which may be { or STRING
+            # special case, see below
+            ends = u'{'
+            brace = - 1 # set to 0 with first {
+            endtypes = ('STRING',)
+        elif semicolon:
+            ends = u';'
+        elif propertynameendonly: # : and ; in case of an error
+            ends = u':;'
+        elif propertyvalueendonly: # ; or !important
+            ends = u';!'
+        elif propertypriorityendonly: # ;
+            ends = u';'
+        elif selectorattendonly: # ]
+            ends = u']'
+            if starttoken and self._tokenvalue(starttoken) == u'[':
+                bracket = 1
+        elif funcendonly: # )
+            ends = u')'
+            parant = 1
+        elif listseponly: # ,
+            ends = u','
+
+        resulttokens = []
+        if starttoken:
+            resulttokens.append(starttoken)
+            val = starttoken[1]
+            if u'[' == val:
+                bracket += 1
+            elif u'{' == val:
+                brace += 1
+            elif u'(' == val:
+                parant += 1
+
+        if tokenizer:
+            for token in tokenizer:
+                typ, val, line, col = token
+                if 'EOF' == typ:
+                    resulttokens.append(token)
+                    break
+
+                if u'{' == val:
+                    brace += 1
+                elif u'}' == val:
+                    brace -= 1
+                elif u'[' == val:
+                    bracket += 1
+                elif u']' == val:
+                    bracket -= 1
+                # function( or single (
+                elif u'(' == val or \
+                     Base._prods.FUNCTION == typ:
+                    parant += 1
+                elif u')' == val:
+                    parant -= 1
+
+                resulttokens.append(token)
+
+                if (brace == bracket == parant == 0) and (
+                    val in ends or typ in endtypes):
+                    break
+                elif mediaqueryendonly and brace == - 1 and (
+                     bracket == parant == 0) and typ in endtypes:
+                     # mediaqueryendonly with STRING
+                    break
+        if separateEnd:
+            # TODO: use this method as generator, then this makes sense
+            if resulttokens:
+                return resulttokens[: - 1], resulttokens[ - 1]
+            else:
+                return resulttokens, None
+        else:
+            return resulttokens
+
+    def _adddefaultproductions(self, productions, new=None):
+        """
+        adds default productions if not already present, used by
+        _parse only
+
+        each production should return the next expected token
+        normaly a name like "uri" or "EOF"
+        some have no expectation like S or COMMENT, so simply return
+        the current value of self.__expected
+        """
+        def ATKEYWORD(expected, seq, token, tokenizer=None):
+            "default impl for unexpected @rule"
+            if expected != 'EOF':
+                # TODO: parentStyleSheet=self
+                rule = cssutils.css.CSSUnknownRule()
+                rule.cssText = self._tokensupto2(tokenizer, token)
+                if rule.wellformed:
+                    seq.append(rule)
+                return expected
+            else:
+                new['wellformed'] = False
+                self._log.error(u'Expected EOF.', token=token)
+                return expected
+
+        def COMMENT(expected, seq, token, tokenizer=None):
+            "default implementation for COMMENT token adds CSSCommentRule"
+            seq.append(cssutils.css.CSSComment([token]))
+            return expected
+
+        def S(expected, seq, token, tokenizer=None):
+            "default implementation for S token, does nothing"
+            return expected
+
+        def EOF(expected=None, seq=None, token=None, tokenizer=None):
+            "default implementation for EOF token"
+            return 'EOF'
+
+        p = {'ATKEYWORD': ATKEYWORD,
+             'COMMENT': COMMENT,
+             'S': S,
+             'EOF': EOF # only available if fullsheet
+             }
+        p.update(productions)
+        return p
+
+    def _parse(self, expected, seq, tokenizer, productions, default=None,
+               new=None, initialtoken=None):
+        """
+        puts parsed tokens in seq by calling a production with
+            (seq, tokenizer, token)
+
+        expected
+            a name what token or value is expected next, e.g. 'uri'
+        seq
+            to add rules etc to
+        tokenizer
+            call tokenizer.next() to get next token
+        productions
+            callbacks {tokentype: callback}
+        default
+            default callback if tokentype not in productions
+        new
+            used to init default productions
+        initialtoken
+            will be used together with tokenizer running 1st this token
+            and then all tokens in tokenizer
+
+        returns (wellformed, expected) which the last prod might have set
+        """
+        wellformed = True
+
+        if initialtoken:
+            # add initialtoken to tokenizer
+            def tokens():
+                "Build new tokenizer including initialtoken"
+                yield initialtoken
+                for item in tokenizer:
+                    yield item
+            fulltokenizer = chain([initialtoken], tokenizer)
+        else:
+            fulltokenizer = tokenizer
+
+        if fulltokenizer:
+            prods = self._adddefaultproductions(productions, new)
+            for token in fulltokenizer:
+                p = prods.get(token[0], default)
+                if p:
+                    expected = p(expected, seq, token, tokenizer)
+                else:
+                    wellformed = False
+                    self._log.error(u'Unexpected token (%s, %s, %s, %s)' % token)
+        return wellformed, expected
+
+
+class Base2(Base, _NewBase):
+    """
+    **Superceded by _NewBase.**
+
+    Base class for new seq handling.
+    """
+    def __init__(self):
+        self._seq = Seq()
+
+    def _adddefaultproductions(self, productions, new=None):
+        """
+        adds default productions if not already present, used by
+        _parse only
+
+        each production should return the next expected token
+        normaly a name like "uri" or "EOF"
+        some have no expectation like S or COMMENT, so simply return
+        the current value of self.__expected
+        """
+        def ATKEYWORD(expected, seq, token, tokenizer=None):
+            "default impl for unexpected @rule"
+            if expected != 'EOF':
+                # TODO: parentStyleSheet=self
+                rule = cssutils.css.CSSUnknownRule()
+                rule.cssText = self._tokensupto2(tokenizer, token)
+                if rule.wellformed:
+                    seq.append(rule, cssutils.css.CSSRule.UNKNOWN_RULE,
+                               line=token[2], col=token[3])
+                return expected
+            else:
+                new['wellformed'] = False
+                self._log.error(u'Expected EOF.', token=token)
+                return expected
+
+        def COMMENT(expected, seq, token, tokenizer=None):
+            "default impl, adds CSSCommentRule if not token == EOF"
+            if expected == 'EOF':
+                new['wellformed'] = False
+                self._log.error(u'Expected EOF but found comment.', token=token)
+            seq.append(cssutils.css.CSSComment([token]), 'COMMENT')
+            return expected
+
+        def S(expected, seq, token, tokenizer=None):
+            "default impl, does nothing if not token == EOF"
+            if expected == 'EOF':
+                new['wellformed'] = False
+                self._log.error(u'Expected EOF but found whitespace.', token=token)
+            return expected
+
+        def EOF(expected=None, seq=None, token=None, tokenizer=None):
+            "default implementation for EOF token"
+            return 'EOF'
+
+        defaultproductions = {'ATKEYWORD': ATKEYWORD,
+             'COMMENT': COMMENT,
+             'S': S,
+             'EOF': EOF # only available if fullsheet
+             }
+        defaultproductions.update(productions)
+        return defaultproductions
+
+
+class Seq(object):
+    """
+    property seq of Base2 inheriting classes, holds a list of Item objects.
+
+    used only by Selector for now
+
+    is normally readonly, only writable during parsing
+    """
+    def __init__(self, readonly=True):
+        """
+        only way to write to a Seq is to initialize it with new items
+        each itemtuple has (value, type, line) where line is optional
+        """
+        self._seq = []
+        self._readonly = readonly
+
+    def __repr__(self):
+        "returns a repr same as a list of tuples of (value, type)"
+        return u'cssutils.%s.%s([\n    %s], readonly=%r)' % (self.__module__,
+                                          self.__class__.__name__,
+            u',\n    '.join([u'%r' % item for item in self._seq]
+            ), self._readonly)
+
+    def __str__(self):
+        vals = []
+        for v in self:
+            if isinstance(v.value, basestring):
+                vals.append(v.value)
+            elif isinstance(v, tuple):
+                vals.append(v.value[1])
+            else:
+                vals.append(repr(v))
+
+        return "<cssutils.%s.%s object length=%r items=%r readonly=%r at 0x%x>" % (
+                self.__module__, self.__class__.__name__, len(self),
+                vals, self._readonly, id(self))
+
+    def __delitem__(self, i):
+        del self._seq[i]
+
+    def __getitem__(self, i):
+        return self._seq[i]
+
+    def __setitem__(self, i, (val, typ, line, col)):
+        self._seq[i] = Item(val, typ, line, col)
+
+    def __iter__(self):
+        return iter(self._seq)
+
+    def __len__(self):
+        return len(self._seq)
+
+    def append(self, val, typ=None, line=None, col=None):
+        "If not readonly add new Item()"
+        if self._readonly:
+            raise AttributeError('Seq is readonly.')
+        else:
+            if isinstance(val, Item):
+                self._seq.append(val)
+            else:
+                self._seq.append(Item(val, typ, line, col))
+
+    def appendItem(self, item):
+        "if not readonly add item which must be an Item"
+        if self._readonly:
+            raise AttributeError('Seq is readonly.')
+        else:
+            self._seq.append(item)
+
+    def clear(self):
+        del self._seq[:]
+
+    def insert(self, index, val, typ, line=None, col=None):
+        "Insert new Item() at index # even if readony!? TODO!"
+        self._seq.insert(index, Item(val, typ, line, col))
+    
+    def replace(self, index=-1, val=None, typ=None, line=None, col=None):
+        """
+        if not readonly replace Item at index with new Item or
+        simply replace value or type
+        """
+        if self._readonly:
+            raise AttributeError('Seq is readonly.')
+        else:
+            self._seq[index] = Item(val, typ, line, col)
+
+    def rstrip(self):
+        "trims S items from end of Seq"
+        while self._seq and self._seq[ - 1].type == tokenize2.CSSProductions.S:
+            # TODO: removed S before CSSComment /**/ /**/
+            del self._seq[ - 1]
+
+    def appendToVal(self, val=None, index= - 1):
+        """
+        if not readonly append to Item's value at index
+        """
+        if self._readonly:
+            raise AttributeError('Seq is readonly.')
+        else:
+            old = self._seq[index]
+            self._seq[index] = Item(old.value + val, old.type,
+                                    old.line, old.col)
+
+
+class Item(object):
+    """
+    an item in the seq list of classes (successor to tuple items in old seq)
+
+    each item has attributes:
+
+    type
+        a sematic type like "element", "attribute"
+    value
+        the actual value which may be a string, number etc or an instance
+        of e.g. a CSSComment
+    *line*
+        **NOT IMPLEMENTED YET, may contain the line in the source later**
+    """
+    def __init__(self, value, type, line=None, col=None):
+        self.__value = value
+        self.__type = type
+        self.__line = line
+        self.__col = col
+
+    type = property(lambda self: self.__type)
+    value = property(lambda self: self.__value)
+    line = property(lambda self: self.__line)
+    col = property(lambda self: self.__col)
+
+    def __repr__(self):
+        return "%s.%s(value=%r, type=%r, line=%r, col=%r)" % (
+                self.__module__, self.__class__.__name__,
+                self.__value, self.__type, self.__line, self.__col)
+
+
+class ListSeq(object):
+    """
+    (EXPERIMENTAL)
+    A base class used for list classes like cssutils.css.SelectorList or
+    stylesheets.MediaList
+
+    adds list like behaviour running on inhering class' property ``seq``
+
+    - item in x => bool
+    - len(x) => integer
+    - get, set and del x[i]
+    - for item in x
+    - append(item)
+
+    some methods must be overwritten in inheriting class
+    """
+    def __init__(self):
+        self.seq = [] # does not need to use ``Seq`` as simple list only
+
+    def __contains__(self, item):
+        return item in self.seq
+
+    def __delitem__(self, index):
+        del self.seq[index]
+
+    def __getitem__(self, index):
+        return self.seq[index]
+
+    def __iter__(self):
+        def gen():
+            for x in self.seq:
+                yield x
+        return gen()
+
+    def __len__(self):
+        return len(self.seq)
+
+    def __setitem__(self, index, item):
+        "must be overwritten"
+        raise NotImplementedError
+
+    def append(self, item):
+        "must be overwritten"
+        raise NotImplementedError
+
+
+class _Namespaces(object):
+    """
+    A dictionary like wrapper for @namespace rules used in a CSSStyleSheet.
+    Works on effective namespaces, so e.g. if::
+
+        @namespace p1 "uri";
+        @namespace p2 "uri";
+
+    only the second rule is effective and kept.
+
+    namespaces
+        a dictionary {prefix: namespaceURI} containing the effective namespaces
+        only. These are the latest set in the CSSStyleSheet.
+    parentStyleSheet
+        the parent CSSStyleSheet
+    """
+    def __init__(self, parentStyleSheet, log=None, *args):
+        "no initial values are set, only the relevant sheet is"
+        self.parentStyleSheet = parentStyleSheet
+        self._log = log
+
+    def __repr__(self):
+        return "%r" % self.namespaces
+
+    def __contains__(self, prefix):
+        return prefix in self.namespaces
+
+    def __delitem__(self, prefix):
+        """deletes CSSNamespaceRule(s) with rule.prefix == prefix
+
+        prefix '' and None are handled the same
+        """
+        if not prefix:
+            prefix = u''
+        delrule = self.__findrule(prefix)
+        for i, rule in enumerate(ifilter(lambda r: r.type == r.NAMESPACE_RULE,
+                            self.parentStyleSheet.cssRules)):
+            if rule == delrule:
+                self.parentStyleSheet.deleteRule(i)
+                return
+
+        self._log.error('Prefix %s not found.' % prefix,
+                        error=xml.dom.NamespaceErr)
+
+    def __getitem__(self, prefix):
+        try:
+            return self.namespaces[prefix]
+        except KeyError, e:
+            self._log.error('Prefix %s not found.' % prefix,
+                            error=xml.dom.NamespaceErr)
+
+    def __iter__(self):
+        return self.namespaces.__iter__()
+
+    def __len__(self):
+        return len(self.namespaces)
+
+    def __setitem__(self, prefix, namespaceURI):
+        "replaces prefix or sets new rule, may raise NoModificationAllowedErr"
+        if not prefix:
+            prefix = u'' # None or ''
+        rule = self.__findrule(prefix)
+        if not rule:
+            self.parentStyleSheet.insertRule(cssutils.css.CSSNamespaceRule(
+                                                    prefix=prefix,
+                                                    namespaceURI=namespaceURI),
+                                  inOrder=True)
+        else:
+            if prefix in self.namespaces:
+                rule.namespaceURI = namespaceURI # raises NoModificationAllowedErr
+            if namespaceURI in self.namespaces.values():
+                rule.prefix = prefix
+
+    def __findrule(self, prefix):
+        # returns namespace rule where prefix == key
+        for rule in ifilter(lambda r: r.type == r.NAMESPACE_RULE,
+                            reversed(self.parentStyleSheet.cssRules)):
+            if rule.prefix == prefix:
+                return rule
+
+    @property
+    def namespaces(self):
+        """
+        A property holding only effective @namespace rules in
+        self.parentStyleSheets.
+        """
+        namespaces = {}
+        for rule in ifilter(lambda r: r.type == r.NAMESPACE_RULE,
+                            reversed(self.parentStyleSheet.cssRules)):
+            if rule.namespaceURI not in namespaces.values():
+                namespaces[rule.prefix] = rule.namespaceURI
+        return namespaces
+
+    def get(self, prefix, default):
+        return self.namespaces.get(prefix, default)
+
+    def items(self):
+        return self.namespaces.items()
+
+    def keys(self):
+        return self.namespaces.keys()
+
+    def values(self):
+        return self.namespaces.values()
+
+    def prefixForNamespaceURI(self, namespaceURI):
+        """
+        returns effective prefix for given namespaceURI or raises IndexError
+        if this cannot be found"""
+        for prefix, uri in self.namespaces.items():
+            if uri == namespaceURI:
+                return prefix
+        raise IndexError(u'NamespaceURI %s not found.' % namespaceURI)
+
+    def __str__(self):
+        return u"<cssutils.util.%s object parentStyleSheet=%r at 0x%x>" % (
+                self.__class__.__name__, str(self.parentStyleSheet), id(self))
+
+
+class _SimpleNamespaces(_Namespaces):
+    """
+    namespaces used in objects like Selector as long as they are not connected
+    to a CSSStyleSheet
+    """
+    def __init__(self, log=None, *args):
+        """init"""
+        super(_SimpleNamespaces, self).__init__(parentStyleSheet=None, log=log)
+        self.__namespaces = dict(*args)
+
+    def __setitem__(self, prefix, namespaceURI):
+        self.__namespaces[prefix] = namespaceURI
+
+    namespaces = property(lambda self: self.__namespaces,
+                          doc=u'Dict Wrapper for self.sheets @namespace rules.')
+
+    def __str__(self):
+        return u"<cssutils.util.%s object namespaces=%r at 0x%x>" % (
+                self.__class__.__name__, self.namespaces, id(self))
+
+    def __repr__(self):
+        return u"cssutils.util.%s(%r)" % (self.__class__.__name__,
+            self.namespaces)
+
+
+def _readUrl(url, fetcher=None, overrideEncoding=None, parentEncoding=None):
+    """
+    Read cssText from url and decode it using all relevant methods (HTTP
+    header, BOM, @charset). Returns
+
+    - encoding used to decode text (which is needed to set encoding of
+      stylesheet properly)
+    - type of encoding (how it was retrieved, see list below)
+    - decodedCssText
+
+    ``fetcher``
+        see cssutils.CSSParser.setFetcher for details
+    ``overrideEncoding``
+        If given this encoding is used and all other encoding information is
+        ignored (HTTP, BOM etc)
+    ``parentEncoding``
+        Encoding of parent stylesheet (while e.g. reading @import references
+        sheets) or document if available.
+
+    Priority or encoding information
+    --------------------------------
+    **cssutils only**: 0. overrideEncoding
+
+    1. An HTTP "charset" parameter in a "Content-Type" field (or similar
+       parameters in other protocols)
+    2. BOM and/or @charset (see below)
+    3. <link charset=""> or other metadata from the linking mechanism (if any)
+    4. charset of referring style sheet or document (if any)
+    5. Assume UTF-8
+
+    """
+    enctype = None
+
+    if not fetcher:
+        fetcher = _defaultFetcher
+
+    r = fetcher(url)
+    if r and len(r) == 2 and r[1] is not None:
+        httpEncoding, content = r
+
+        if overrideEncoding:
+            enctype = 0 # 0. override encoding
+            encoding = overrideEncoding
+        elif httpEncoding:
+            enctype = 1 # 1. HTTP
+            encoding = httpEncoding
+        else:
+            # BOM or @charset
+            if isinstance(content, unicode):
+                contentEncoding, explicit = codec.detectencoding_unicode(content)
+            else:
+                contentEncoding, explicit = codec.detectencoding_str(content)
+            
+            if explicit:
+                enctype = 2 # 2. BOM/@charset: explicitly
+                encoding = contentEncoding
+                
+            elif parentEncoding:
+                enctype = 4 # 4. parent stylesheet or document
+                # may also be None in which case 5. is used in next step anyway
+                encoding = parentEncoding
+                
+            else:
+                enctype = 5 # 5. assume UTF-8
+                encoding = 'utf-8'
+
+        if isinstance(content, unicode):
+            decodedCssText = content
+        else:
+            try:
+                # encoding may still be wrong if encoding *is lying*!
+                try:
+                    decodedCssText = codecs.lookup("css")[1](content, encoding=encoding)[0]
+                except AttributeError, ae:
+                    # at least in GAE
+                    decodedCssText = content.decode(encoding if encoding else 'utf-8')
+                    
+            except UnicodeDecodeError, e:
+                log.warn(e, neverraise=True)
+                decodedCssText = None
+
+        return encoding, enctype, decodedCssText
+    else:
+        return None, None, None
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/helper.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/helper.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/helper.py	(revision 1126)
@@ -0,0 +1,137 @@
+"""cssutils helper TEST
+"""
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: errorhandler.py 1234 2008-05-22 20:26:12Z cthedot $'
+
+import os
+import re
+import sys
+import urllib
+
+class Deprecated(object):
+    """This is a decorator which can be used to mark functions
+    as deprecated. It will result in a warning being emitted
+    when the function is used.
+
+    It accepts a single paramter ``msg`` which is shown with the warning.
+    It should contain information which function or method to use instead.
+    """
+    def __init__(self, msg):
+        self.msg = msg
+
+    def __call__(self, func):
+        def newFunc(*args, **kwargs):
+            import warnings
+            warnings.warn("Call to deprecated method %r. %s" %
+                            (func.__name__, self.msg),
+                            category=DeprecationWarning,
+                            stacklevel=2)
+            return func(*args, **kwargs)
+        newFunc.__name__ = func.__name__
+        newFunc.__doc__ = func.__doc__
+        newFunc.__dict__.update(func.__dict__)
+        return newFunc
+
+# simple escapes, all non unicodes
+_simpleescapes = re.compile(ur'(\\[^0-9a-fA-F])').sub
+def normalize(x):
+    """
+    normalizes x, namely:
+
+    - remove any \ before non unicode sequences (0-9a-zA-Z) so for
+      x=="c\olor\" return "color" (unicode escape sequences should have
+      been resolved by the tokenizer already)
+    - lowercase
+    """
+    if x:
+        def removeescape(matchobj):
+            return matchobj.group(0)[1:]
+        x = _simpleescapes(removeescape, x)
+        return x.lower()
+    else:
+        return x
+
+def path2url(path):
+    """Return file URL of `path`"""
+    return u'file:' + urllib.pathname2url(os.path.abspath(path))
+
+def pushtoken(token, tokens):
+    """Return new generator starting with token followed by all tokens in
+    ``tokens``"""
+    # TODO: may use itertools.chain?
+    yield token
+    for t in tokens:
+        yield t
+
+def string(value):
+    """
+    Serialize value with quotes e.g.::
+
+        ``a \'string`` => ``'a \'string'``
+    """
+    # \n = 0xa, \r = 0xd, \f = 0xc
+    value = value.replace(u'\n', u'\\a ').replace(
+                          u'\r', u'\\d ').replace(
+                          u'\f', u'\\c ').replace(
+                          u'"', u'\\"')
+
+    if value.endswith(u'\\'):
+        value = value[:-1] + u'\\\\'
+
+    return u'"%s"' % value
+
+def stringvalue(string):
+    """
+    Retrieve actual value of string without quotes. Escaped
+    quotes inside the value are resolved, e.g.::
+
+        ``'a \'string'`` => ``a 'string``
+    """
+    return string.replace(u'\\'+string[0], string[0])[1:-1]
+
+_match_forbidden_in_uri = re.compile(ur'''.*?[\(\)\s\;,'"]''', re.U).match
+def uri(value):
+    """
+    Serialize value by adding ``url()`` and with quotes if needed e.g.::
+
+        ``"`` => ``url("\"")``
+    """
+    if _match_forbidden_in_uri(value):
+        value = string(value)
+    return u'url(%s)' % value
+
+def urivalue(uri):
+    """
+    Return actual content without surrounding "url(" and ")"
+    and removed surrounding quotes too including contained
+    escapes of quotes, e.g.::
+
+         ``url("\"")`` => ``"``
+    """
+    uri = uri[uri.find('(')+1:-1].strip()
+    if uri and (uri[0] in '\'"') and (uri[0] == uri[-1]):
+        return stringvalue(uri)
+    else:
+        return uri
+
+#def normalnumber(num):
+#    """
+#    Return normalized number as string.
+#    """
+#    sign = ''
+#    if num.startswith('-'):
+#        sign = '-'
+#        num = num[1:]
+#    elif num.startswith('+'):
+#        num = num[1:]
+#
+#    if float(num) == 0.0:
+#        return '0'
+#    else:
+#        if num.find('.') == -1:
+#            return sign + str(int(num))
+#        else:
+#            a, b = num.split('.')
+#            if not a:
+#                a = '0'
+#            return '%s%s.%s' % (sign, int(a), b)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/prodparser.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/prodparser.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/prodparser.py	(revision 1126)
@@ -0,0 +1,836 @@
+# -*- coding: utf-8 -*-
+"""Productions parser used by css and stylesheets classes to parse
+test into a cssutils.util.Seq and at the same time retrieving
+additional specific cssutils.util.Item objects for later use.
+
+TODO:
+    - ProdsParser
+        - handle EOF or STOP?
+        - handle unknown @rules
+        - handle S: maybe save to Seq? parameterized?
+        - store['_raw']: always?
+
+    - Sequence:
+        - opt first(), naive impl for now
+
+"""
+__all__ = ['ProdParser', 'Sequence', 'Choice', 'Prod', 'PreDef']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: parse.py 1418 2008-08-09 19:27:50Z cthedot $'
+
+from helper import pushtoken
+import cssutils
+import itertools
+import re
+import string
+import sys
+import types
+
+
+class ParseError(Exception):
+    """Base Exception class for ProdParser (used internally)."""
+    pass
+
+class Done(ParseError):
+    """Raised if Sequence or Choice is finished and no more Prods left."""
+    pass
+
+class Exhausted(ParseError):
+    """Raised if Sequence or Choice is finished but token is given."""
+    pass
+
+class Missing(ParseError):
+    """Raised if Sequence or Choice is not finished but no matching token given."""
+    pass
+
+class NoMatch(ParseError):
+    """Raised if nothing in Sequence or Choice does match."""
+    pass
+
+
+class Choice(object):
+    """A Choice of productions (Sequence or single Prod)."""
+
+    def __init__(self, *prods, **options):
+        """
+        *prods
+            Prod or Sequence objects
+        options:
+            optional=False
+        """
+        self._prods = prods
+
+        try:
+            self.optional = options['optional']
+        except KeyError, e:
+            for p in self._prods:
+                if p.optional:
+                    self.optional = True
+                    break
+            else:
+                self.optional = False
+
+        self.reset()
+
+    def reset(self):
+        """Start Choice from zero"""
+        self._exhausted = False
+
+    def matches(self, token):
+        """Check if token matches"""
+        for prod in self._prods:
+            if prod.matches(token):
+                return True
+        return False
+
+    def nextProd(self, token):
+        """
+        Return:
+
+        - next matching Prod or Sequence
+        - ``None`` if any Prod or Sequence is optional and no token matched
+        - raise ParseError if nothing matches and all are mandatory
+        - raise Exhausted if choice already done
+
+        ``token`` may be None but this occurs when no tokens left."""
+        #print u'TEST for %s in %s' % (token, self)
+        if not self._exhausted:
+            optional = False
+            for p in self._prods:
+                if p.matches(token):
+                    self._exhausted = True
+                    p.reset()
+                    #print u'FOUND for %s: %s' % (token, p);#print
+                    return p
+                elif p.optional:
+                    optional = True
+            else:
+                if not optional:
+                    # None matched but also None is optional
+                    raise NoMatch(u'No match for %s in %s' % (token, self))
+                    #raise ParseError(u'No match in %s for %s' % (self, token))
+        elif token:
+            raise Exhausted(u'Extra token')
+
+    def __repr__(self):
+        return "<cssutils.prodsparser.%s object sequence=%r optional=%r at 0x%x>" % (
+                self.__class__.__name__, self.__str__(), self.optional, id(self))
+
+    def __str__(self):
+        return u'Choice(%s)' % u', '.join([str(x) for x in self._prods])
+
+
+class Sequence(object):
+    """A Sequence of productions (Choice or single Prod)."""
+    def __init__(self, *prods, **options):
+        """
+        *prods
+            Prod or Choice or Sequence objects
+        **options:
+            minmax = lambda: (1, 1)
+                callback returning number of times this sequence may run
+        """
+        self._prods = prods
+        try:
+            minmax = options['minmax']
+        except KeyError:
+            minmax = lambda: (1, 1)
+
+        self._min, self._max = minmax()
+        if self._max is None:
+            # unlimited
+            try:
+                # py2.6/3
+                self._max = sys.maxsize
+            except AttributeError:
+                # py<2.6
+                self._max = sys.maxint
+
+        self._prodcount = len(self._prods)
+        self.reset()
+
+    def matches(self, token):
+        """Called by Choice to try to find if Sequence matches."""
+        for prod in self._prods:
+            if prod.matches(token):
+                return True
+            try:
+                if not prod.optional:
+                    break
+            except AttributeError:
+                pass
+        return False
+
+    def reset(self):
+        """Reset this Sequence if it is nested."""
+        self._roundstarted = False
+        self._i = 0
+        self._round = 0
+
+    def _currentName(self):
+        """Return current element of Sequence, used by name"""
+        # TODO: current impl first only if 1st if an prod!
+        for prod in self._prods[self._i:]:
+            if not prod.optional:
+                return str(prod)
+        else:
+            return 'Sequence'
+
+    optional = property(lambda self: self._min == 0)
+
+    def nextProd(self, token):
+        """Return
+
+        - next matching Prod or Choice
+        - raises ParseError if nothing matches
+        - raises Exhausted if sequence already done
+        """
+        #print u'TEST for %s in %s' % (token, self)
+        while self._round < self._max:
+
+            # for this round
+            i = self._i
+            round = self._round
+            p = self._prods[i]
+            if i == 0:
+                self._roundstarted = False
+
+            # for next round
+            self._i += 1
+            if self._i == self._prodcount:
+                self._round += 1
+                self._i = 0
+
+            if p.matches(token):
+                self._roundstarted = True
+                # reset nested Choice or Prod to use from start
+                p.reset()
+                #print u'FOUND for %s: %s' % (token, p);#print
+                return p
+
+            elif p.optional:
+                continue
+
+            elif round < self._min or self._roundstarted: #or (round == 0 and self._min == 0):
+                raise Missing(u'Missing token for production %s' % p)
+
+            elif not token:
+                if self._roundstarted:
+                    raise Missing(u'Missing token for production %s' % p)
+                else:
+                    raise Done()
+
+            else:
+                raise NoMatch(u'No match for %s in %s' % (token, self))
+
+        if token:
+            raise Exhausted(u'Extra token')
+
+    def __repr__(self):
+        return "<cssutils.prodsparser.%s object sequence=%r optional=%r at 0x%x>" % (
+                self.__class__.__name__, self.__str__(), self.optional, id(self))
+
+    def __str__(self):
+        return u'Sequence(%s)' % u', '.join([str(x) for x in self._prods])
+
+
+
+class Prod(object):
+    """Single Prod in Sequence or Choice."""
+    def __init__(self, name, match, optional=False,
+                 toSeq=None, toStore=None,
+                 stop=False, stopAndKeep=False,
+                 stopIfNoMoreMatch=False,
+                 nextSor=False, mayEnd=False,
+                 storeToken=None,
+                 exception=None):
+        """
+        name
+            name used for error reporting
+        match callback
+            function called with parameters tokentype and tokenvalue
+            returning True, False or raising ParseError
+        toSeq callback (optional) or False
+            calling toSeq(token, tokens) returns (type_, val) == (token[0], token[1])
+            to be appended to seq else simply unaltered (type_, val)
+
+            if False nothing is added
+
+        toStore (optional)
+            key to save util.Item to store or callback(store, util.Item)
+        optional = False
+            whether Prod is optional or not
+        stop = False
+            if True stop parsing of tokens here
+        stopAndKeep
+            if True stop parsing of tokens here but return stopping
+            token in unused tokens
+        stopIfNoMoreMatch = False
+            stop even if more tokens available, similar to stop and keep but with
+            condition no more matches
+        nextSor=False
+            next is S or other like , or / (CSSValue)
+        mayEnd = False
+            no token must follow even defined by Sequence.
+            Used for operator ',/ ' currently only
+
+        storeToken = None
+            if True toStore saves simple token tuple and not and Item object
+            to store. Old style processing, TODO: resolve
+
+        exception = None
+            exception to be raised in case of error, normaly SyntaxErr
+        """
+        self._name = name
+        self.match = match
+        self.optional = optional
+        self.stop = stop
+        self.stopAndKeep = stopAndKeep
+        self.stopIfNoMoreMatch = stopIfNoMoreMatch
+        self.nextSor = nextSor
+        self.mayEnd = mayEnd
+        self.storeToken = storeToken
+        self.exception = exception
+
+        def makeToStore(key):
+            "Return a function used by toStore."
+            def toStore(store, item):
+                "Set or append store item."
+                if key in store:
+                    _v = store[key]
+                    if not isinstance(_v, list):
+                        store[key] = [_v]
+                    store[key].append(item)
+                else:
+                    store[key] = item
+            return toStore
+
+        if toSeq or toSeq is False:
+            # called: seq.append(toSeq(value))
+            self.toSeq = toSeq
+        else:
+            self.toSeq = lambda t, tokens: (t[0], t[1])
+
+        if hasattr(toStore, '__call__'):
+            self.toStore = toStore
+        elif toStore:
+            self.toStore = makeToStore(toStore)
+        else:
+            # always set!
+            self.toStore = None
+
+    def matches(self, token):
+        """Return if token matches."""
+        if not token:
+            return False
+        type_, val, line, col = token
+        return self.match(type_, val)
+
+    def reset(self):
+        pass
+
+    def __str__(self):
+        return self._name
+
+    def __repr__(self):
+        return "<cssutils.prodsparser.%s object name=%r at 0x%x>" % (
+                self.__class__.__name__, self._name, id(self))
+
+
+# global tokenizer as there is only one!
+tokenizer = cssutils.tokenize2.Tokenizer()
+
+# global: saved from subProds
+savedTokens = []
+
+
+class ProdParser(object):
+    """Productions parser."""
+    def __init__(self, clear=True):
+        self.types = cssutils.cssproductions.CSSProductions
+        self._log = cssutils.log
+        if clear:
+            tokenizer.clear()
+   
+    def _texttotokens(self, text):
+        """Build a generator which is the only thing that is parsed!
+        old classes may use lists etc
+        """
+        if isinstance(text, basestring):
+            # DEFAULT, to tokenize strip space
+            return tokenizer.tokenize(text.strip())
+
+        elif type(text) == types.GeneratorType:
+            # DEFAULT, already tokenized, should be generator
+            return text
+
+        elif isinstance(text, tuple):
+            # OLD: (token, tokens) or a single token
+            if len(text) == 2:
+                # (token, tokens)
+                chain([token], tokens)
+            else:
+                # single token
+                return iter([text])
+
+        elif isinstance(text, list):
+            # OLD: generator from list
+            return iter(text)
+
+        else:
+            # ?
+            return text
+
+    def _SorTokens(self, tokens, until=',/'):
+        """New tokens generator which has S tokens removed,
+        if followed by anything in ``until``, normally a ``,``."""
+        for token in tokens:
+            if token[0] == self.types.S:
+                try:
+                    next_ = tokens.next()
+                except StopIteration:
+                    yield token
+                else:
+                    if next_[1] in until:
+                        # omit S as e.g. ``,`` has been found
+                        yield next_
+                    elif next_[0] == self.types.COMMENT:
+                        # pass COMMENT
+                        yield next_
+                    else:
+                        yield token
+                        yield next_
+
+            elif token[0] == self.types.COMMENT:
+                # pass COMMENT
+                yield token
+            else:
+                yield token
+                break
+        # normal mode again
+        for token in tokens:
+            yield token
+
+
+    def parse(self, text, name, productions, keepS=False, checkS=False, store=None,
+              emptyOk=False, debug=False):
+        """
+        text (or token generator)
+            to parse, will be tokenized if not a generator yet
+
+            may be:
+            - a string to be tokenized
+            - a single token, a tuple
+            - a tuple of (token, tokensGenerator)
+            - already tokenized so a tokens generator
+
+        name
+            used for logging
+        productions
+            used to parse tokens
+        keepS
+            if WS should be added to Seq or just be ignored
+        store  UPDATED
+            If a Prod defines ``toStore`` the key defined there
+            is a key in store to be set or if store[key] is a list
+            the next Item is appended here.
+
+            TODO: NEEDED? :
+            Key ``raw`` is always added and holds all unprocessed
+            values found
+        emptyOk
+            if True text may be empty, hard to test before as may be generator
+
+        returns
+            :wellformed: True or False
+            :seq: a filled cssutils.util.Seq object which is NOT readonly yet
+            :store: filled keys defined by Prod.toStore
+            :unusedtokens: token generator containing tokens not used yet
+        """
+        tokens = self._texttotokens(text)
+
+        if not tokens:
+            self._log.error(u'No content to parse.')
+            return False, [], None, None
+
+        seq = cssutils.util.Seq(readonly=False)
+        if not store: # store for specific values
+            store = {}
+        prods = [productions] # stack of productions
+        wellformed = True
+        # while no real token is found any S are ignored
+        started = False
+        stopall = False
+        prod = None
+        # flag if default S handling should be done
+        defaultS = True
+
+        stopIfNoMoreMatch = False
+        stopIfNoMoreMatchNow = False
+
+        while True:
+            # get from savedTokens or normal tokens
+            try:
+                #print debug, "SAVED", savedTokens
+                token = savedTokens.pop()
+            except IndexError, e:
+                try:
+                    token = tokens.next()
+                except StopIteration:
+                    break
+
+            #print debug, token, stopIfNoMoreMatch
+
+            type_, val, line, col = token
+
+            # default productions
+            if type_ == self.types.COMMENT:
+                # always append COMMENT
+                seq.append(cssutils.css.CSSComment(val),
+                           cssutils.css.CSSComment, line, col)
+
+            elif defaultS and type_ == self.types.S and not checkS:
+                # append S (but ignore starting ones)
+                if not keepS or not started:
+                    continue
+                else:
+                    seq.append(val, type_, line, col)
+
+#            elif type_ == self.types.ATKEYWORD:
+#                # @rule
+#                r = cssutils.css.CSSUnknownRule(cssText=val)
+#                seq.append(r, type(r), line, col)
+            elif type_ == self.types.INVALID:
+                # invalidate parse
+                wellformed = False
+                self._log.error(u'Invalid token: %r' % (token,))
+                break
+
+            elif type_ == 'EOF':
+                # do nothing? (self.types.EOF == True!)
+                stopall = True
+
+            else:
+                started = True # check S now
+                nextSor = False # reset
+
+                try:
+                    while True:
+                        # find next matching production
+                        try:
+                            prod = prods[-1].nextProd(token)
+                        except (Exhausted, NoMatch), e:
+                            # try next
+                            prod = None
+
+                        if isinstance(prod, Prod):
+                            # found actual Prod, not a Choice or Sequence
+                            break
+                        elif prod:
+                            # nested Sequence, Choice
+                            prods.append(prod)
+                        else:
+                            # nested exhausted, try in parent
+                            if len(prods) > 1:
+                                prods.pop()
+                            else:
+                                raise NoMatch('No match')
+
+                except NoMatch, e:
+                    if stopIfNoMoreMatch: # and token:
+                        #print "\t1stopIfNoMoreMatch", e, token, prod, 'PUSHING'
+                        #tokenizer.push(token)
+                        savedTokens.append(token)
+                        stopIfNoMoreMatchNow = True
+                        stopall = True
+
+                    else:
+                        wellformed = False
+                        self._log.error(u'%s: %s: %r' % (name, e, token))
+                    break
+
+                except ParseError, e:
+                    # needed???
+                    if stopIfNoMoreMatch: # and token:
+                        #print "\t2stopIfNoMoreMatch", e, token, prod
+                        tokenizer.push(token)
+                        stopIfNoMoreMatchNow = True
+                        stopall = True
+
+                    else:
+                        wellformed = False
+                        self._log.error(u'%s: %s: %r' % (name, e, token))
+                    break
+
+                else:
+                    #print '\t1', debug, 'PROD', prod
+
+                    # may stop next time, once set stays
+                    stopIfNoMoreMatch = prod.stopIfNoMoreMatch or stopIfNoMoreMatch 
+
+                    # process prod
+                    if prod.toSeq and not prod.stopAndKeep:
+                        type_, val = prod.toSeq(token, tokens)
+                        if val is not None:
+                            seq.append(val, type_, line, col)
+                            if prod.toStore:
+                                if not prod.storeToken:
+                                    prod.toStore(store, seq[-1])
+                                else:
+                                    # workaround for now for old style token
+                                    # parsing!
+                                    # TODO: remove when all new style
+                                    prod.toStore(store, token)
+
+                    if prod.stop: 
+                        # stop here and ignore following tokens
+                        # EOF? or end of e.g. func ")"
+                        break
+
+                    if prod.stopAndKeep: # e.g. ;
+                        # stop here and ignore following tokens
+                        # but keep this token for next run
+                        
+                        # TODO: CHECK!!!!
+                        tokenizer.push(token) 
+                        tokens = itertools.chain(token, tokens)
+                                               
+                        stopall = True
+                        break
+
+                    if prod.nextSor:
+                        # following is S or other token (e.g. ",")?
+                        # remove S if
+                        tokens = self._SorTokens(tokens, ',/')
+                        defaultS = False
+                    else:
+                        defaultS = True
+        
+        lastprod = prod
+        #print debug, 'parse done', token, stopall, '\n'
+        if not stopall:
+            # stop immediately
+
+            while True:
+                # all productions exhausted?
+                try:
+                    prod = prods[-1].nextProd(token=None)
+                except Done, e:
+                    # ok
+                    prod = None
+
+                except Missing, e:
+                    prod = None
+                    # last was a S operator which may End a Sequence, then ok
+                    if hasattr(lastprod, 'mayEnd') and not lastprod.mayEnd:
+                        wellformed = False
+                        self._log.error(u'%s: %s' % (name, e))
+
+                except ParseError, e:
+                    prod = None
+                    wellformed = False
+                    self._log.error(u'%s: %s' % (name, e))
+
+                else:
+                    if prods[-1].optional:
+                        prod = None
+                    elif prod and prod.optional:
+                        # ignore optional
+                        continue
+
+                if prod and not prod.optional:
+                    wellformed = False
+                    self._log.error(u'%s: Missing token for production %r'
+                                    % (name, str(prod)))
+                    break
+                elif len(prods) > 1:
+                    # nested exhausted, next in parent
+                    prods.pop()
+                else:
+                    break
+
+            if not emptyOk and not len(seq):
+                self._log.error(u'No content to parse.')
+                return False, [], None, None
+
+        # trim S from end
+        seq.rstrip()
+        return wellformed, seq, store, tokens
+
+
+class PreDef(object):
+    """Predefined Prod definition for use in productions definition
+    for ProdParser instances.
+    """
+    types = cssutils.cssproductions.CSSProductions
+    reHexcolor = re.compile(r'^\#(?:[0-9abcdefABCDEF]{3}|[0-9abcdefABCDEF]{6})$')
+
+    @staticmethod
+    def calc(toSeq=None, nextSor=False):
+        return Prod(name=u'calcfunction',
+                    match=lambda t, v: u'calc(' == cssutils.helper.normalize(v),
+                    toSeq=toSeq,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def char(name='char', char=u',', toSeq=None,
+             stop=False, stopAndKeep=False, mayEnd=False, 
+             stopIfNoMoreMatch=False,
+             optional=False, # WAS: optional=True, 
+             nextSor=False):
+        "any CHAR"
+        return Prod(name=name, match=lambda t, v: v == char, toSeq=toSeq,
+                    stop=stop, stopAndKeep=stopAndKeep, mayEnd=mayEnd,
+                    stopIfNoMoreMatch=stopIfNoMoreMatch,
+                    optional=optional,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def comma(optional=False, toSeq=None):
+        return PreDef.char(u'comma', u',', optional=optional, toSeq=toSeq)
+
+    @staticmethod
+    def comment(parent=None):
+        return Prod(name=u'comment',
+                    match=lambda t, v: t == 'COMMENT',
+                    toSeq=lambda t, tokens: (t[0], cssutils.css.CSSComment([1], 
+                                                                           parentRule=parent)),
+                    optional=True
+                    )
+
+
+    @staticmethod
+    def dimension(nextSor=False, stop=False):
+        return Prod(name=u'dimension',
+                    match=lambda t, v: t == PreDef.types.DIMENSION,
+                    toSeq=lambda t, tokens: (t[0], cssutils.helper.normalize(t[1])),
+                    stop=stop,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def function(toSeq=None, nextSor=False, toStore=None):
+        return Prod(name=u'function',
+                    match=lambda t, v: t == PreDef.types.FUNCTION,
+                    toStore=toStore,
+                    toSeq=toSeq,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def funcEnd(stop=False, mayEnd=False):
+        ")"
+        return PreDef.char(u'end FUNC ")"', u')', stop=stop, mayEnd=mayEnd)
+
+    @staticmethod
+    def hexcolor(stop=False, nextSor=False):
+        "#123 or #123456"
+        return Prod(name='HEX color',
+                    match=lambda t, v: (
+                        t == PreDef.types.HASH and
+                        PreDef.reHexcolor.match(v)
+                    ),
+                    stop=stop,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def ident(stop=False, toStore=None, nextSor=False):
+        return Prod(name=u'ident',
+                    match=lambda t, v: t == PreDef.types.IDENT,
+                    stop=stop,
+                    toStore=toStore,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def number(stop=False, toSeq=None, nextSor=False):
+        return Prod(name=u'number',
+                    match=lambda t, v: t == PreDef.types.NUMBER,
+                    stop=stop,
+                    toSeq=toSeq,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def percentage(stop=False, toSeq=None, nextSor=False):
+        return Prod(name=u'percentage',
+                    match=lambda t, v: t == PreDef.types.PERCENTAGE,
+                    stop=stop,
+                    toSeq=toSeq,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def string(stop=False, nextSor=False):
+        "string delimiters are removed by default"
+        return Prod(name=u'string',
+                    match=lambda t, v: t == PreDef.types.STRING,
+                    toSeq=lambda t, tokens: (t[0], cssutils.helper.stringvalue(t[1])),
+                    stop=stop,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def S(name=u'whitespace', toSeq=None, optional=False):
+        return Prod(name=name,
+                    match=lambda t, v: t == PreDef.types.S,
+                    toSeq=toSeq,
+                    optional=optional,
+                    mayEnd=True)
+
+    @staticmethod
+    def unary(stop=False, toSeq=None, nextSor=False):
+        "+ or -"
+        return Prod(name=u'unary +-', match=lambda t, v: v in (u'+', u'-'),
+                    optional=True,
+                    stop=stop,
+                    toSeq=toSeq,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def uri(stop=False, nextSor=False):
+        "'url(' and ')' are removed and URI is stripped"
+        return Prod(name=u'URI',
+                    match=lambda t, v: t == PreDef.types.URI,
+                    toSeq=lambda t, tokens: (t[0], cssutils.helper.urivalue(t[1])),
+                    stop=stop,
+                    nextSor=nextSor)
+
+    @staticmethod
+    def unicode_range(stop=False, nextSor=False):
+        "u+123456-abc normalized to lower `u`"
+        return Prod(name='unicode-range',
+                    match=lambda t, v: t == PreDef.types.UNICODE_RANGE,
+                    toSeq=lambda t, tokens: (t[0], t[1].lower()),
+                    stop=stop,
+                    nextSor=nextSor
+                    )
+
+    @staticmethod
+    def variable(toSeq=None, stop=False, nextSor=False, toStore=None):
+        return Prod(name=u'variable',
+                    match=lambda t, v: u'var(' == cssutils.helper.normalize(v),
+                    toSeq=toSeq,
+                    toStore=toStore,
+                    stop=stop,
+                    nextSor=nextSor)
+
+    # used for MarginRule for now:
+    @staticmethod
+    def unknownrule(name=u'@', toStore=None):
+        """@rule dummy (matches ATKEYWORD to remove unknown rule tokens from
+        stream::
+
+            @x;
+            @x {...}
+
+        no nested yet!
+        """
+        def rule(tokens):
+            saved = []
+            for t in tokens:
+                saved.append(t)
+                if (t[1] == u'}' or t[1] == u';'):
+                    return cssutils.css.CSSUnknownRule(saved)
+
+        return Prod(name=name,
+                    match=lambda t, v: t == u'ATKEYWORD',
+                    toSeq=lambda t, tokens: (u'CSSUnknownRule',
+                                             rule(pushtoken(t, tokens))
+                                             ),
+                    toStore=toStore
+                    )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/cssproductions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/cssproductions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/cssproductions.py	(revision 1126)
@@ -0,0 +1,126 @@
+"""productions for cssutils based on a mix of CSS 2.1 and CSS 3 Syntax
+productions
+
+- http://www.w3.org/TR/css3-syntax
+- http://www.w3.org/TR/css3-syntax/#grammar0
+
+open issues
+    - numbers contain "-" if present
+    - HASH: #aaa is, #000 is not anymore,
+            CSS2.1: 'nmchar': r'[_a-z0-9-]|{nonascii}|{escape}',
+            CSS3: 'nmchar': r'[_a-z-]|{nonascii}|{escape}',
+"""
+__all__ = ['CSSProductions', 'MACROS', 'PRODUCTIONS']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+# a complete list of css3 macros
+MACROS = {
+    'nonascii': r'[^\0-\177]',
+    'unicode': r'\\[0-9A-Fa-f]{1,6}(?:{nl}|{s})?',
+    #'escape': r'{unicode}|\\[ -~\200-\777]',
+    'escape': r'{unicode}|\\[^\n\r\f0-9a-f]',
+    'nmstart': r'[_a-zA-Z]|{nonascii}|{escape}',
+    'nmchar': r'[-_a-zA-Z0-9]|{nonascii}|{escape}',
+    'string1': r'"([^\n\r\f\\"]|\\{nl}|{escape})*"',
+    'string2': r"'([^\n\r\f\\']|\\{nl}|{escape})*'",
+    'invalid1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*',
+    'invalid2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*",
+
+    'comment': r'\/\*[^*]*\*+([^/][^*]*\*+)*\/',
+    'ident': r'[-]?{nmstart}{nmchar}*',
+    'name': r'{nmchar}+',
+    # TODO???
+    'num': r'[+-]?[0-9]*\.[0-9]+|[+-]?[0-9]+', #r'[-]?\d+|[-]?\d*\.\d+',
+    'string': r'{string1}|{string2}',
+    # from CSS2.1
+    'invalid': r'{invalid1}|{invalid2}',
+    'url':  r'[\x09\x21\x23-\x26\x28\x2a-\x7E]|{nonascii}|{escape}',
+
+    's': r'\t|\r|\n|\f|\x20',
+    'w': r'{s}*',
+    'nl': r'\n|\r\n|\r|\f',
+
+    'A': r'A|a|\\0{0,4}(?:41|61)(?:\r\n|[ \t\r\n\f])?',
+    'B': r'B|b|\\0{0,4}(?:42|62)(?:\r\n|[ \t\r\n\f])?',
+    'C': r'C|c|\\0{0,4}(?:43|63)(?:\r\n|[ \t\r\n\f])?',
+    'D': r'D|d|\\0{0,4}(?:44|64)(?:\r\n|[ \t\r\n\f])?',
+    'E': r'E|e|\\0{0,4}(?:45|65)(?:\r\n|[ \t\r\n\f])?',
+    'F': r'F|f|\\0{0,4}(?:46|66)(?:\r\n|[ \t\r\n\f])?',
+    'G': r'G|g|\\0{0,4}(?:47|67)(?:\r\n|[ \t\r\n\f])?|\\G|\\g',
+    'H': r'H|h|\\0{0,4}(?:48|68)(?:\r\n|[ \t\r\n\f])?|\\H|\\h',
+    'I': r'I|i|\\0{0,4}(?:49|69)(?:\r\n|[ \t\r\n\f])?|\\I|\\i',
+    'K': r'K|k|\\0{0,4}(?:4b|6b)(?:\r\n|[ \t\r\n\f])?|\\K|\\k',
+    'L': r'L|l|\\0{0,4}(?:4c|6c)(?:\r\n|[ \t\r\n\f])?|\\L|\\l',
+    'M': r'M|m|\\0{0,4}(?:4d|6d)(?:\r\n|[ \t\r\n\f])?|\\M|\\m',
+    'N': r'N|n|\\0{0,4}(?:4e|6e)(?:\r\n|[ \t\r\n\f])?|\\N|\\n',
+    'O': r'O|o|\\0{0,4}(?:4f|6f)(?:\r\n|[ \t\r\n\f])?|\\O|\\o',
+    'P': r'P|p|\\0{0,4}(?:50|70)(?:\r\n|[ \t\r\n\f])?|\\P|\\p',
+    'R': r'R|r|\\0{0,4}(?:52|72)(?:\r\n|[ \t\r\n\f])?|\\R|\\r',
+    'S': r'S|s|\\0{0,4}(?:53|73)(?:\r\n|[ \t\r\n\f])?|\\S|\\s',
+    'T': r'T|t|\\0{0,4}(?:54|74)(?:\r\n|[ \t\r\n\f])?|\\T|\\t',
+    'U': r'U|u|\\0{0,4}(?:55|75)(?:\r\n|[ \t\r\n\f])?|\\U|\\u',
+    'V': r'V|v|\\0{0,4}(?:56|76)(?:\r\n|[ \t\r\n\f])?|\\V|\\v',
+    'X': r'X|x|\\0{0,4}(?:58|78)(?:\r\n|[ \t\r\n\f])?|\\X|\\x',
+    'Z': r'Z|z|\\0{0,4}(?:5a|7a)(?:\r\n|[ \t\r\n\f])?|\\Z|\\z',
+    }
+
+# The following productions are the complete list of tokens
+# used by cssutils, a mix of CSS3 and some CSS2.1 productions.
+# The productions are **ordered**:
+PRODUCTIONS = [
+    # UTF8_BOM or UTF8_BOM_SIG will only be checked at beginning of CSS
+    ('BOM', '\xfe\xff|\xef\xbb\xbf'),
+
+    ('S', r'{s}+'), # 1st in list of general productions
+    ('URI', r'{U}{R}{L}\({w}({string}|{url}*){w}\)'),
+    ('IDENT', r'{A}{N}{D}'),
+    ('FUNCTION', r'{ident}\('),
+    ('UNICODE-RANGE', r'{U}\+[0-9A-Fa-f?]{1,6}(\-[0-9A-Fa-f]{1,6})?'),
+    ('IDENT', r'{ident}'),
+    ('DIMENSION', r'{num}{ident}'),
+    ('PERCENTAGE', r'{num}\%'),
+    ('NUMBER', r'{num}'),
+    ('HASH', r'\#{name}'),
+    ('COMMENT', r'{comment}'), #r'\/\*[^*]*\*+([^/][^*]*\*+)*\/'),
+    ('STRING', r'{string}'),
+    ('INVALID', r'{invalid}'), # from CSS2.1
+    ('ATKEYWORD', r'@{ident}'), # other keywords are done in the tokenizer
+    ('INCLUDES', '\~\='),
+    ('DASHMATCH', r'\|\='),
+    ('PREFIXMATCH', r'\^\='),
+    ('SUFFIXMATCH', r'\$\='),
+    ('SUBSTRINGMATCH', r'\*\='),
+    ('CDO', r'\<\!\-\-'),
+    ('CDC', r'\-\-\>'),
+    ('CHAR', r'[^"\']') # MUST always be last
+    # valid ony at start so not checked everytime
+    #('CHARSET_SYM', r'@charset '), # from Errata includes ending space!
+    # checked specially if fullsheet is parsed
+    ]
+
+
+
+class CSSProductions(object):
+    """
+    most attributes are set later
+    """
+    EOF = True
+    # removed from productions as they simply are ATKEYWORD until
+    # tokenizing
+    CHARSET_SYM = u'CHARSET_SYM'
+    FONT_FACE_SYM = u'FONT_FACE_SYM'
+    MEDIA_SYM = u'MEDIA_SYM'
+    IMPORT_SYM = u'IMPORT_SYM'
+    NAMESPACE_SYM = u'NAMESPACE_SYM'
+    PAGE_SYM = u'PAGE_SYM'
+    VARIABLES_SYM = u'VARIABLES_SYM'
+
+for i, t in enumerate(PRODUCTIONS):
+    setattr(CSSProductions, t[0].replace('-', '_'), t[0])
+
+
+# may be enabled by settings.set
+_DXImageTransform = (u'FUNCTION',
+                     ur'progid\:DXImageTransform\.Microsoft\..+\('
+                     )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/profiles.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/profiles.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/profiles.py	(revision 1126)
@@ -0,0 +1,791 @@
+"""CSS profiles.
+
+Profiles is based on code by Kevin D. Smith, orginally used as cssvalues,
+thanks!
+"""
+__all__ = ['Profiles']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: cssproperties.py 1116 2008-03-05 13:52:23Z cthedot $'
+
+import re
+import types
+
+class NoSuchProfileException(Exception):
+    """Raised if no profile with given name is found"""
+    pass
+
+
+# dummies, replaced in Profiles.addProfile
+_fontRegexReplacements = {
+    '__FONT_FAMILY_SINGLE': lambda f: False,
+    '__FONT_WITH_1_FAMILY': lambda f: False
+    }
+
+def _fontFamilyValidator(families):
+    """Check if ``font-family`` value is valid, regex is too slow.
+
+    Splits on ``,`` and checks each family separately.
+    Somehow naive as font-family name could contain a "," but this is unlikely.
+    Still should be a TODO.
+    """
+    match = _fontRegexReplacements['__FONT_FAMILY_SINGLE']
+
+    for f in families.split(u','):
+        if not match(f.strip()):
+            return False
+    return True
+
+def _fontValidator(font):
+    """Check if font value is valid, regex is too slow.
+
+    Checks everything before ``,`` on basic font value. Everything after should
+    be a valid font-family value.
+    """
+    if u',' in font:
+        # split off until 1st family
+        font1, families2 = font.split(u',', 1)
+    else:
+        font1, families2 = font, None
+
+    if not _fontRegexReplacements['__FONT_WITH_1_FAMILY'](font1.strip()):
+        return False
+
+    if families2 and not _fontFamilyValidator(families2):
+        return False
+
+    return True
+
+
+class Profiles(object):
+    """
+    All profiles used for validation. ``cssutils.profile`` is a
+    preset object of this class and used by all properties for validation.
+
+    Predefined profiles are (use
+    :meth:`~cssutils.profiles.Profiles.propertiesByProfile` to
+    get a list of defined properties):
+
+    :attr:`~cssutils.profiles.Profiles.CSS_LEVEL_2`
+        Properties defined by CSS2.1
+    :attr:`~cssutils.profiles.Profiles.CSS3_BASIC_USER_INTERFACE`
+        Currently resize and outline properties only
+    :attr:`~cssutils.profiles.Profiles.CSS3_BOX`
+        Currently overflow related properties only
+    :attr:`~cssutils.profiles.Profiles.CSS3_COLOR`
+        CSS 3 color properties
+    :attr:`~cssutils.profiles.Profiles.CSS3_PAGED_MEDIA`
+        As defined at http://www.w3.org/TR/css3-page/ (at 090307)
+
+    Predefined macros are:
+
+    :attr:`~cssutils.profiles.Profiles._TOKEN_MACROS`
+        Macros containing the token values as defined to CSS2
+    :attr:`~cssutils.profiles.Profiles._MACROS`
+        Additional general macros.
+
+    If you want to redefine any of these macros do this in your custom
+    macros.
+    """
+    CSS_LEVEL_2 = u'CSS Level 2.1'
+    CSS3_BACKGROUNDS_AND_BORDERS = u'CSS Backgrounds and Borders Module Level 3'
+    CSS3_BASIC_USER_INTERFACE = u'CSS3 Basic User Interface Module'
+    CSS3_BOX = CSS_BOX_LEVEL_3 = u'CSS Box Module Level 3'
+    CSS3_COLOR = CSS_COLOR_LEVEL_3 = u'CSS Color Module Level 3'
+    CSS3_FONTS = u'CSS Fonts Module Level 3'
+    CSS3_FONT_FACE = u'CSS Fonts Module Level 3 @font-face properties'
+    CSS3_PAGED_MEDIA = u'CSS3 Paged Media Module'
+    CSS3_TEXT = u'CSS Text Level 3'
+
+    _TOKEN_MACROS = {
+        'ident': r'[-]?{nmstart}{nmchar}*',
+        'name': r'{nmchar}+',
+        'nmstart': r'[_a-z]|{nonascii}|{escape}',
+        'nonascii': r'[^\0-\177]',
+        'unicode': r'\\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?',
+        'escape': r'{unicode}|\\[ -~\200-\777]',
+    #   'escape': r'{unicode}|\\[ -~\200-\4177777]',
+        'int': r'[-]?\d+',
+        'nmchar': r'[\w-]|{nonascii}|{escape}',
+        'num': r'[-]?\d+|[-]?\d*\.\d+',
+        'positivenum': r'\d+|\d*\.\d+',
+        'number': r'{num}',
+        'string': r'{string1}|{string2}',
+        'string1': r'"(\\\"|[^\"])*"',
+        'uri': r'url\({w}({string}|(\\\)|[^\)])+){w}\)',
+        'string2': r"'(\\\'|[^\'])*'",
+        'nl': r'\n|\r\n|\r|\f',
+        'w': r'\s*',
+        }
+    _MACROS = {
+        'hexcolor': r'#[0-9a-f]{3}|#[0-9a-f]{6}',
+        'rgbcolor': r'rgb\({w}{int}{w}\,{w}{int}{w}\,{w}{int}{w}\)|rgb\({w}{num}%{w}\,{w}{num}%{w}\,{w}{num}%{w}\)',
+        'namedcolor': r'(transparent|orange|maroon|red|orange|yellow|olive|purple|fuchsia|white|lime|green|navy|blue|aqua|teal|black|silver|gray)',
+        'uicolor': r'(ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText)',
+        'color': r'{namedcolor}|{hexcolor}|{rgbcolor}|{uicolor}',
+        #'color': r'(maroon|red|orange|yellow|olive|purple|fuchsia|white|lime|green|navy|blue|aqua|teal|black|silver|gray|ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText)|#[0-9a-f]{3}|#[0-9a-f]{6}|rgb\({w}{int}{w},{w}{int}{w},{w}{int}{w}\)|rgb\({w}{num}%{w},{w}{num}%{w},{w}{num}%{w}\)',
+        'integer': r'{int}',
+        'length': r'0|{num}(em|ex|px|in|cm|mm|pt|pc)',
+        'positivelength': r'0|{positivenum}(em|ex|px|in|cm|mm|pt|pc)',
+        'angle': r'0|{num}(deg|grad|rad)',
+        'time': r'0|{num}m?s',
+        'frequency': r'0|{num}k?Hz',
+        'percentage': r'{num}%',
+        'shadow': '(inset)?{w}{length}{w}{length}{w}{length}?{w}{length}?{w}{color}?'
+        }
+
+    def __init__(self, log=None):
+        """A few profiles are predefined."""
+        self._log = log
+
+        # macro cache
+        self._usedMacros = Profiles._TOKEN_MACROS.copy()
+        self._usedMacros.update(Profiles._MACROS.copy())
+
+        # to keep order, REFACTOR!
+        self._profileNames = []
+        # for reset if macro changes
+        self._rawProfiles = {}
+        # already compiled profiles: {profile: {property: checkfunc, ...}, ...}
+        self._profilesProperties = {}
+
+        self._defaultProfiles = None
+
+        self.addProfiles([(self.CSS_LEVEL_2,
+                           properties[self.CSS_LEVEL_2],
+                           macros[self.CSS_LEVEL_2]
+                           ),
+                          (self.CSS3_BACKGROUNDS_AND_BORDERS,
+                           properties[self.CSS3_BACKGROUNDS_AND_BORDERS],
+                           macros[self.CSS3_BACKGROUNDS_AND_BORDERS]
+                           ),
+                          (self.CSS3_BASIC_USER_INTERFACE,
+                           properties[self.CSS3_BASIC_USER_INTERFACE],
+                           macros[self.CSS3_BASIC_USER_INTERFACE]
+                           ),
+                          (self.CSS3_BOX,
+                           properties[self.CSS3_BOX],
+                           macros[self.CSS3_BOX]
+                           ),
+                          (self.CSS3_COLOR,
+                           properties[self.CSS3_COLOR],
+                           macros[self.CSS3_COLOR]
+                           ),
+                          (self.CSS3_FONTS,
+                           properties[self.CSS3_FONTS],
+                           macros[self.CSS3_FONTS]
+                           ),
+                          # new object for font-face only?
+                          (self.CSS3_FONT_FACE,
+                           properties[self.CSS3_FONT_FACE],
+                           macros[self.CSS3_FONTS]
+                           ),
+                          (self.CSS3_PAGED_MEDIA,
+                           properties[self.CSS3_PAGED_MEDIA],
+                           macros[self.CSS3_PAGED_MEDIA]
+                           ),
+                          (self.CSS3_TEXT,
+                           properties[self.CSS3_TEXT],
+                           macros[self.CSS3_TEXT]
+                           )
+                        ])
+
+        self.__update_knownNames()
+
+    def _expand_macros(self, dictionary, macros):
+        """Expand macros in token dictionary"""
+        def macro_value(m):
+            return '(?:%s)' % macros[m.groupdict()['macro']]
+
+        for key, value in dictionary.items():
+            if not hasattr(value, '__call__'):
+                while re.search(r'{[a-z][a-z0-9-]*}', value):
+                    value = re.sub(r'{(?P<macro>[a-z][a-z0-9-]*)}',
+                                   macro_value, value)
+            dictionary[key] = value
+
+        return dictionary
+
+    def _compile_regexes(self, dictionary):
+        """Compile all regular expressions into callable objects"""
+        for key, value in dictionary.items():
+            # might be a function (font-family) as regex is too slow
+            if not hasattr(value, '__call__') and not isinstance(value,
+                                                                 types.FunctionType):
+                value = re.compile('^(?:%s)$' % value, re.I).match
+            dictionary[key] = value
+
+        return dictionary
+
+    def __update_knownNames(self):
+        self._knownNames = []
+        for properties in self._profilesProperties.values():
+            self._knownNames.extend(properties.keys())
+
+    def _getDefaultProfiles(self):
+        "If not explicitly set same as Profiles.profiles but in reverse order."
+        if not self._defaultProfiles:
+            return self.profiles
+        else:
+            return self._defaultProfiles
+
+    def _setDefaultProfiles(self, profiles):
+        "profiles may be a single or a list of profile names"
+        if isinstance(profiles, basestring):
+            self._defaultProfiles = (profiles,)
+        else:
+            self._defaultProfiles = profiles
+
+    defaultProfiles = property(_getDefaultProfiles,
+                               _setDefaultProfiles,
+                               doc=u"Names of profiles to use for validation."
+                                   u"To use e.g. the CSS2 profile set "
+                                   u"``cssutils.profile.defaultProfiles = "
+                                   u"cssutils.profile.CSS_LEVEL_2``")
+
+    profiles = property(lambda self: self._profileNames,
+                        doc=u'Names of all profiles in order as defined.')
+
+    knownNames = property(lambda self: self._knownNames,
+                               doc="All known property names of all profiles.")
+
+    def _resetProperties(self, newMacros=None):
+        "reset all props from raw values as changes in macros happened"
+        # base
+        macros = Profiles._TOKEN_MACROS.copy()
+        macros.update(Profiles._MACROS.copy())
+
+        # former
+        for profile in self._profileNames:
+            macros.update(self._rawProfiles[profile]['macros'])
+
+        # new
+        if newMacros:
+            macros.update(newMacros)
+
+        # reset properties
+        self._profilesProperties.clear()
+        for profile in self._profileNames:
+            properties = self._expand_macros(
+                            # keep raw
+                            self._rawProfiles[profile]['properties'].copy(),
+                            macros)
+            self._profilesProperties[profile] = self._compile_regexes(properties)
+
+        # save
+        self._usedMacros = macros
+
+
+    def addProfiles(self, profiles):
+        """Add a list of profiles at once. Useful as if profiles define custom
+        macros these are used in one go. Using `addProfile` instead my be
+        **very** slow instead.
+        """
+        # add macros
+        for profile, properties, macros in profiles:
+            if macros:
+                self._usedMacros.update(macros)
+                self._rawProfiles[profile] = {'macros': macros.copy()}
+
+        # only add new properties
+        for profile, properties, macros in profiles:
+            self.addProfile(profile, properties.copy(), None)
+
+
+    def addProfile(self, profile, properties, macros=None):
+        """Add a new profile with name `profile` (e.g. 'CSS level 2')
+        and the given `properties`.
+
+        :param profile:
+            the new `profile`'s name
+        :param properties:
+            a dictionary of ``{ property-name: propery-value }`` items where
+            property-value is a regex which may use macros defined in given
+            ``macros`` or the standard macros Profiles.tokens and
+            Profiles.generalvalues.
+
+            ``propery-value`` may also be a function which takes a single
+            argument which is the value to validate and which should return
+            True or False.
+            Any exceptions which may be raised during this custom validation
+            are reported or raised as all other cssutils exceptions depending
+            on cssutils.log.raiseExceptions which e.g during parsing normally
+            is False so the exceptions would be logged only.
+        :param macros:
+            may be used in the given properties definitions. There are some
+            predefined basic macros which may always be used in
+            :attr:`Profiles._TOKEN_MACROS` and :attr:`Profiles._MACROS`.
+        """
+        if macros:
+            # check if known macros would change and if yes reset properties
+            if len(set(macros.keys()).intersection(self._usedMacros.keys())):
+                self._resetProperties(newMacros=macros)
+
+            else:
+                # no replacement, simply continue
+                self._usedMacros.update(macros)
+
+        else:
+            # might have been set by addProfiles before
+            try:
+                macros = self._rawProfiles[profile]['macros']
+            except KeyError, e:
+                macros = {}
+
+        # save name and raw props/macros if macros change to completely reset
+        self._profileNames.append(profile)
+        self._rawProfiles[profile] = {'properties': properties.copy(),
+                                      'macros': macros.copy()}
+        # prepare and save properties
+        properties = self._expand_macros(properties, self._usedMacros)
+        self._profilesProperties[profile] = self._compile_regexes(properties)
+
+        self.__update_knownNames()
+
+        # hack for font and font-family which are too slow with regexes
+        if '__FONT_WITH_1_FAMILY' in properties:
+            _fontRegexReplacements['__FONT_WITH_1_FAMILY'] = properties['__FONT_WITH_1_FAMILY']
+        if '__FONT_FAMILY_SINGLE' in properties:
+            _fontRegexReplacements['__FONT_FAMILY_SINGLE'] = properties['__FONT_FAMILY_SINGLE']
+
+
+    def removeProfile(self, profile=None, all=False):
+        """Remove `profile` or remove `all` profiles.
+
+        If the removed profile used custom macros all remaining profiles
+        are reset to reflect the macro changes. This may be quite an expensive
+        operation!
+
+        :param profile:
+            profile name to remove
+        :param all:
+            if ``True`` removes all profiles to start with a clean state
+        :exceptions:
+            - :exc:`cssutils.profiles.NoSuchProfileException`:
+              If given `profile` cannot be found.
+        """
+        if all:
+            self._profilesProperties.clear()
+            self._rawProfiles.clear()
+            del self._profileNames[:]
+        else:
+            reset = False
+
+            try:
+                if (self._rawProfiles[profile]['macros']):
+                    reset = True
+
+                del self._profilesProperties[profile]
+                del self._rawProfiles[profile]
+                del self._profileNames[self._profileNames.index(profile)]
+            except KeyError:
+                raise NoSuchProfileException(u'No profile %r.' % profile)
+
+            else:
+                if reset:
+                    # reset properties as macros were removed
+                    self._resetProperties()
+
+        self.__update_knownNames()
+
+    def propertiesByProfile(self, profiles=None):
+        """Generator: Yield property names, if no `profiles` is given all
+        profile's properties are used.
+
+        :param profiles:
+            a single profile name or a list of names.
+        """
+        if not profiles:
+            profiles = self.profiles
+        elif isinstance(profiles, basestring):
+            profiles = (profiles, )
+        try:
+            for profile in sorted(profiles):
+                for name in sorted(self._profilesProperties[profile].keys()):
+                    yield name
+        except KeyError, e:
+            raise NoSuchProfileException(e)
+
+    def validate(self, name, value):
+        """Check if `value` is valid for given property `name` using **any**
+        profile.
+
+        :param name:
+            a property name
+        :param value:
+            a CSS value (string)
+        :returns:
+            if the `value` is valid for the given property `name` in any
+            profile
+        """
+        for profile in self.profiles:
+            if name in self._profilesProperties[profile]:
+                try:
+                    # custom validation errors are caught
+                    r = bool(self._profilesProperties[profile][name](value))
+                except Exception, e:
+                    # TODO: more specific exception?
+                    # Validate should not be fatal though!
+                    self._log.error(e, error=Exception)
+                    r = False
+                if r:
+                    return r
+        return False
+
+    def validateWithProfile(self, name, value, profiles=None):
+        """Check if `value` is valid for given property `name` returning
+        ``(valid, profile)``.
+
+        :param name:
+            a property name
+        :param value:
+            a CSS value (string)
+        :param profiles:
+            internal parameter used by Property.validate only
+        :returns:
+            ``valid, matching, profiles`` where ``valid`` is if the `value`
+            is valid for the given property `name` in any profile,
+            ``matching==True`` if it is valid in the given `profiles`
+            and ``profiles`` the profile names for which the value is valid
+            (or ``[]`` if not valid at all)
+
+        Example::
+
+            >>> cssutils.profile.defaultProfiles = cssutils.profile.CSS_LEVEL_2
+            >>> print cssutils.profile.validateWithProfile('color', 'rgba(1,1,1,1)')
+            (True, False, Profiles.CSS3_COLOR)
+        """
+        if name not in self.knownNames:
+            return False, False, []
+        else:
+            if not profiles:
+                profiles = self.defaultProfiles
+            elif isinstance(profiles, basestring):
+                profiles = (profiles, )
+            for profilename in reversed(profiles):
+                # check given profiles
+                if name in self._profilesProperties[profilename]:
+                    validate = self._profilesProperties[profilename][name]
+                    try:
+                        if validate(value):
+                            return True, True, [profilename]
+                    except Exception, e:
+                        self._log.error(e, error=Exception)
+
+            for profilename in (p for p in self._profileNames
+                                if p not in profiles):
+                # check remaining profiles as well
+                if name in self._profilesProperties[profilename]:
+                    validate = self._profilesProperties[profilename][name]
+                    try:
+                        if validate(value):
+                            return True, False, [profilename]
+                    except Exception, e:
+                        self._log.error(e, error=Exception)
+
+            names = []
+            for profilename, properties in self._profilesProperties.items():
+                # return profile to which name belongs
+                if name in properties.keys():
+                    names.append(profilename)
+            names.sort()
+            return False, False, names
+
+
+properties = {}
+macros = {}
+
+
+"""
+Define some regular expression fragments that will be used as
+macros within the CSS property value regular expressions.
+"""
+macros[Profiles.CSS_LEVEL_2] = {
+    'background-color': r'{color}|transparent|inherit',
+    'background-image': r'{uri}|none|inherit',
+    #'background-position': r'({percentage}|{length})(\s*({percentage}|{length}))?|((top|center|bottom)\s*(left|center|right)?)|((left|center|right)\s*(top|center|bottom)?)|inherit',
+    'background-position': r'({percentage}|{length}|left|center|right)(\s*({percentage}|{length}|top|center|bottom))?|((top|center|bottom)\s*(left|center|right)?)|((left|center|right)\s*(top|center|bottom)?)|inherit',
+    'background-repeat': r'repeat|repeat-x|repeat-y|no-repeat|inherit',
+    'background-attachment': r'scroll|fixed|inherit',
+    'shape': r'rect\(({w}({length}|auto}){w},){3}{w}({length}|auto){w}\)',
+    'counter': r'counter\({w}{ident}{w}(?:,{w}{list-style-type}{w})?\)',
+    'identifier': r'{ident}',
+    'family-name': r'{string}|{ident}({w}{ident})*',
+    'generic-family': r'serif|sans-serif|cursive|fantasy|monospace',
+    'absolute-size': r'(x?x-)?(small|large)|medium',
+    'relative-size': r'smaller|larger',
+
+    #[[ <family-name> | <generic-family> ] [, <family-name>| <generic-family>]* ] | inherit
+    #'font-family': r'(({family-name}|{generic-family})({w},{w}({family-name}|{generic-family}))*)|inherit',
+    # EXTREMELY SLOW REGEX
+    #'font-family': r'({family-name}({w},{w}{family-name})*)|inherit',
+
+    'font-size': r'{absolute-size}|{relative-size}|{positivelength}|{percentage}|inherit',
+    'font-style': r'normal|italic|oblique|inherit',
+    'font-variant': r'normal|small-caps|inherit',
+    'font-weight': r'normal|bold|bolder|lighter|[1-9]00|inherit',
+    'line-height': r'normal|{number}|{length}|{percentage}|inherit',
+    'list-style-image': r'{uri}|none|inherit',
+    'list-style-position': r'inside|outside|inherit',
+    'list-style-type': r'disc|circle|square|decimal|decimal-leading-zero|lower-roman|upper-roman|lower-greek|lower-(latin|alpha)|upper-(latin|alpha)|armenian|georgian|none|inherit',
+    'margin-width': r'{length}|{percentage}|auto',
+    'padding-width': r'{length}|{percentage}',
+    'specific-voice': r'{ident}',
+    'generic-voice': r'male|female|child',
+    'content': r'{string}|{uri}|{counter}|attr\({w}{ident}{w}\)|open-quote|close-quote|no-open-quote|no-close-quote',
+    'background-attrs': r'{background-color}|{background-image}|{background-repeat}|{background-attachment}|{background-position}',
+    'list-attrs': r'{list-style-type}|{list-style-position}|{list-style-image}',
+    'font-attrs': r'{font-style}|{font-variant}|{font-weight}',
+    'text-attrs': r'underline|overline|line-through|blink',
+    'overflow': r'visible|hidden|scroll|auto|inherit',
+}
+
+"""
+Define the regular expressions for validation all CSS values
+"""
+properties[Profiles.CSS_LEVEL_2] = {
+    'azimuth': r'{angle}|(behind\s+)?(left-side|far-left|left|center-left|center|center-right|right|far-right|right-side)(\s+behind)?|behind|leftwards|rightwards|inherit',
+    'background-attachment': r'{background-attachment}',
+    'background-color': r'{background-color}',
+    'background-image': r'{background-image}',
+    'background-position': r'{background-position}',
+    'background-repeat': r'{background-repeat}',
+    # Each piece should only be allowed one time
+    'background': r'{background-attrs}(\s+{background-attrs})*|inherit',
+    'border-collapse': r'collapse|separate|inherit',
+    'border-spacing': r'{length}(\s+{length})?|inherit',
+    'bottom': r'{length}|{percentage}|auto|inherit',
+    'caption-side': r'top|bottom|inherit',
+    'clear': r'none|left|right|both|inherit',
+    'clip': r'{shape}|auto|inherit',
+    'color': r'{color}|inherit',
+    'content': r'none|normal|{content}(\s+{content})*|inherit',
+    'counter-increment': r'({ident}(\s+{integer})?)(\s+({ident}(\s+{integer})?))*|none|inherit',
+    'counter-reset': r'({ident}(\s+{integer})?)(\s+({ident}(\s+{integer})?))*|none|inherit',
+    'cue-after': r'{uri}|none|inherit',
+    'cue-before': r'{uri}|none|inherit',
+    'cue': r'({uri}|none|inherit){1,2}|inherit',
+    #'cursor': r'((({uri}{w},{w})*)?(auto|crosshair|default|pointer|move|(e|ne|nw|n|se|sw|s|w)-resize|text|wait|help|progress))|inherit',
+    'direction': r'ltr|rtl|inherit',
+    'display': r'inline|block|list-item|run-in|inline-block|table|inline-table|table-row-group|table-header-group|table-footer-group|table-row|table-column-group|table-column|table-cell|table-caption|none|inherit',
+    'elevation': r'{angle}|below|level|above|higher|lower|inherit',
+    'empty-cells': r'show|hide|inherit',
+    'float': r'left|right|none|inherit',
+
+    # regex too slow:
+    # 'font-family': r'{font-family}',
+    'font-family': _fontFamilyValidator,
+    '__FONT_FAMILY_SINGLE': r'{family-name}',
+
+    'font-size': r'{font-size}',
+    'font-style': r'{font-style}',
+    'font-variant': r'{font-variant}',
+    'font-weight': r'{font-weight}',
+
+    # regex too slow and wrong too:
+    # 'font': r'({font-attrs}\s+)*{font-size}({w}/{w}{line-height})?\s+{font-family}|caption|icon|menu|message-box|small-caption|status-bar|inherit',
+    'font': _fontValidator,
+    '__FONT_WITH_1_FAMILY': r'(({font-attrs}\s+)*{font-size}({w}/{w}{line-height})?\s+{family-name})|caption|icon|menu|message-box|small-caption|status-bar|inherit',
+
+    'height': r'{length}|{percentage}|auto|inherit',
+    'left': r'{length}|{percentage}|auto|inherit',
+    'letter-spacing': r'normal|{length}|inherit',
+    'line-height': r'{line-height}',
+    'list-style-image': r'{list-style-image}',
+    'list-style-position': r'{list-style-position}',
+    'list-style-type': r'{list-style-type}',
+    'list-style': r'{list-attrs}(\s+{list-attrs})*|inherit',
+    'margin-right': r'{margin-width}|inherit',
+    'margin-left': r'{margin-width}|inherit',
+    'margin-top': r'{margin-width}|inherit',
+    'margin-bottom': r'{margin-width}|inherit',
+    'margin': r'{margin-width}(\s+{margin-width}){0,3}|inherit',
+    'max-height': r'{length}|{percentage}|none|inherit',
+    'max-width': r'{length}|{percentage}|none|inherit',
+    'min-height': r'{length}|{percentage}|none|inherit',
+    'min-width': r'{length}|{percentage}|none|inherit',
+    'orphans': r'{integer}|inherit',
+    'overflow': r'{overflow}',
+    'padding-top': r'{padding-width}|inherit',
+    'padding-right': r'{padding-width}|inherit',
+    'padding-bottom': r'{padding-width}|inherit',
+    'padding-left': r'{padding-width}|inherit',
+    'padding': r'{padding-width}(\s+{padding-width}){0,3}|inherit',
+    'page-break-after': r'auto|always|avoid|left|right|inherit',
+    'page-break-before': r'auto|always|avoid|left|right|inherit',
+    'page-break-inside': r'avoid|auto|inherit',
+    'pause-after': r'{time}|{percentage}|inherit',
+    'pause-before': r'{time}|{percentage}|inherit',
+    'pause': r'({time}|{percentage}){1,2}|inherit',
+    'pitch-range': r'{number}|inherit',
+    'pitch': r'{frequency}|x-low|low|medium|high|x-high|inherit',
+    'play-during': r'{uri}(\s+(mix|repeat))*|auto|none|inherit',
+    'position': r'static|relative|absolute|fixed|inherit',
+    'quotes': r'({string}\s+{string})(\s+{string}\s+{string})*|none|inherit',
+    'richness': r'{number}|inherit',
+    'right': r'{length}|{percentage}|auto|inherit',
+    'speak-header': r'once|always|inherit',
+    'speak-numeral': r'digits|continuous|inherit',
+    'speak-punctuation': r'code|none|inherit',
+    'speak': r'normal|none|spell-out|inherit',
+    'speech-rate': r'{number}|x-slow|slow|medium|fast|x-fast|faster|slower|inherit',
+    'stress': r'{number}|inherit',
+    'table-layout': r'auto|fixed|inherit',
+    'text-align': r'left|right|center|justify|inherit',
+    'text-decoration': r'none|{text-attrs}(\s+{text-attrs})*|inherit',
+    'text-indent': r'{length}|{percentage}|inherit',
+    'text-transform': r'capitalize|uppercase|lowercase|none|inherit',
+    'top': r'{length}|{percentage}|auto|inherit',
+    'unicode-bidi': r'normal|embed|bidi-override|inherit',
+    'vertical-align': r'baseline|sub|super|top|text-top|middle|bottom|text-bottom|{percentage}|{length}|inherit',
+    'visibility': r'visible|hidden|collapse|inherit',
+    'voice-family': r'({specific-voice}|{generic-voice}{w},{w})*({specific-voice}|{generic-voice})|inherit',
+    'volume': r'{number}|{percentage}|silent|x-soft|soft|medium|loud|x-loud|inherit',
+    'white-space': r'normal|pre|nowrap|pre-wrap|pre-line|inherit',
+    'widows': r'{integer}|inherit',
+    'width': r'{length}|{percentage}|auto|inherit',
+    'word-spacing': r'normal|{length}|inherit',
+    'z-index': r'auto|{integer}|inherit',
+}
+
+
+macros[Profiles.CSS3_BACKGROUNDS_AND_BORDERS] = {
+    'border-style': 'none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset',
+    'border-width': '{length}|thin|medium|thick',
+    'b1': r'{border-width}?({w}{border-style})?({w}{color})?',
+    'b2': r'{border-width}?({w}{color})?({w}{border-style})?',
+    'b3': r'{border-style}?({w}{border-width})?({w}{color})?',
+    'b4': r'{border-style}?({w}{color})?({w}{border-width})?',
+    'b5': r'{color}?({w}{border-style})?({w}{border-width})?',
+    'b6': r'{color}?({w}{border-width})?({w}{border-style})?',
+    'border-attrs': r'{b1}|{b2}|{b3}|{b4}|{b5}|{b6}',
+    'border-radius-part': '({length}|{percentage})(\s+({length}|{percentage}))?'
+    }
+properties[Profiles.CSS3_BACKGROUNDS_AND_BORDERS] = {
+    'border-color': r'({color}|transparent)(\s+({color}|transparent)){0,3}|inherit',
+    'border-style': r'{border-style}(\s+{border-style}){0,3}|inherit',
+    'border-top': r'{border-attrs}|inherit',
+    'border-right': r'{border-attrs}|inherit',
+    'border-bottom': r'{border-attrs}|inherit',
+    'border-left': r'{border-attrs}|inherit',
+    'border-top-color': r'{color}|transparent|inherit',
+    'border-right-color': r'{color}|transparent|inherit',
+    'border-bottom-color': r'{color}|transparent|inherit',
+    'border-left-color': r'{color}|transparent|inherit',
+    'border-top-style': r'{border-style}|inherit',
+    'border-right-style': r'{border-style}|inherit',
+    'border-bottom-style': r'{border-style}|inherit',
+    'border-left-style': r'{border-style}|inherit',
+    'border-top-width': r'{border-width}|inherit',
+    'border-right-width': r'{border-width}|inherit',
+    'border-bottom-width': r'{border-width}|inherit',
+    'border-left-width': r'{border-width}|inherit',
+    'border-width': r'{border-width}(\s+{border-width}){0,3}|inherit',
+    'border': r'{border-attrs}|inherit',
+    'border-top-right-radius': '{border-radius-part}',
+    'border-bottom-right-radius': '{border-radius-part}',
+    'border-bottom-left-radius': '{border-radius-part}',
+    'border-top-left-radius': '{border-radius-part}',
+    'border-radius': '({length}{w}|{percentage}{w}){1,4}(/{w}({length}{w}|{percentage}{w}){1,4})?',
+    'box-shadow': 'none|{shadow}({w},{w}{shadow})*',
+    }
+
+# CSS3 Basic User Interface Module
+macros[Profiles.CSS3_BASIC_USER_INTERFACE] = {
+    'border-style': macros[Profiles.CSS3_BACKGROUNDS_AND_BORDERS]['border-style'],
+    'border-width': macros[Profiles.CSS3_BACKGROUNDS_AND_BORDERS]['border-width'],
+    'outline-1': r'{outline-color}(\s+{outline-style})?(\s+{outline-width})?',
+    'outline-2': r'{outline-color}(\s+{outline-width})?(\s+{outline-style})?',
+    'outline-3': r'{outline-style}(\s+{outline-color})?(\s+{outline-width})?',
+    'outline-4': r'{outline-style}(\s+{outline-width})?(\s+{outline-color})?',
+    'outline-5': r'{outline-width}(\s+{outline-color})?(\s+{outline-style})?',
+    'outline-6': r'{outline-width}(\s+{outline-style})?(\s+{outline-color})?',
+    'outline-color': r'{color}|invert|inherit',
+    'outline-style': r'auto|{border-style}|inherit',
+    'outline-width': r'{border-width}|inherit',
+    }
+properties[Profiles.CSS3_BASIC_USER_INTERFACE] = {
+    'box-sizing': r'content-box|border-box',
+    'cursor': r'((({uri}{w}({number}{w}{number}{w})?,{w})*)?(auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|(e|n|ne|nw|s|se|sw|w|ew|ns|nesw|nwse|col|row)-resize|all-scroll))|inherit',
+    'nav-index': r'auto|{number}|inherit',
+    'outline-color': r'{outline-color}',
+    'outline-style': r'{outline-style}',
+    'outline-width': r'{outline-width}',
+    'outline-offset': r'{length}|inherit',
+    #'outline': r'{outline-attrs}(\s+{outline-attrs})*|inherit',
+    'outline': r'{outline-1}|{outline-2}|{outline-3}|{outline-4}|{outline-5}|{outline-6}|inherit',
+    'resize': 'none|both|horizontal|vertical|inherit',
+    }
+
+# CSS Box Module Level 3
+macros[Profiles.CSS3_BOX] = {
+    'overflow': macros[Profiles.CSS_LEVEL_2]['overflow']
+    }
+properties[Profiles.CSS3_BOX] = {
+    'overflow': '{overflow}{w}{overflow}?|inherit',
+    'overflow-x': '{overflow}|inherit',
+    'overflow-y': '{overflow}|inherit'
+    }
+
+# CSS Color Module Level 3
+macros[Profiles.CSS3_COLOR] = {
+    # orange and transparent in CSS 2.1
+    'namedcolor': r'(currentcolor|transparent|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)',
+                    # orange?
+    'rgbacolor': r'rgba\({w}{int}{w}\,{w}{int}{w}\,{w}{int}{w}\,{w}{num}{w}\)|rgba\({w}{num}%{w}\,{w}{num}%{w}\,{w}{num}%{w}\,{w}{num}{w}\)',
+    'hslcolor': r'hsl\({w}{int}{w}\,{w}{num}%{w}\,{w}{num}%{w}\)|hsla\({w}{int}{w}\,{w}{num}%{w}\,{w}{num}%{w}\,{w}{num}{w}\)',
+    'x11color': r'aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen',
+    'uicolor': r'(ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText)',
+    'color': r'{namedcolor}|{hexcolor}|{rgbcolor}|{rgbacolor}|{hslcolor}|{x11color}|inherit',
+    }
+properties[Profiles.CSS3_COLOR] = {
+    'opacity': r'{num}|inherit',
+    }
+
+# CSS Fonts Module Level 3 http://www.w3.org/TR/css3-fonts/
+macros[Profiles.CSS3_FONTS] = {
+    #'family-name': r'{string}|{ident}',
+    'family-name': r'{string}|{ident}({w}{ident})*',
+    'font-face-name': 'local\({w}{family-name}{w}\)',
+    'font-stretch-names': r'(ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded)',
+    'unicode-range': r'[uU]\+[0-9A-Fa-f?]{1,6}(\-[0-9A-Fa-f]{1,6})?'
+    }
+properties[Profiles.CSS3_FONTS] = {
+    'font-size-adjust': r'{number}|none|inherit',
+    'font-stretch': r'normal|wider|narrower|{font-stretch-names}|inherit'
+    }
+properties[Profiles.CSS3_FONT_FACE] = {
+    'font-family': '{family-name}',
+    'font-stretch': r'{font-stretch-names}',
+    'font-style': r'normal|italic|oblique',
+    'font-weight': r'normal|bold|[1-9]00',
+    'src': r'({uri}{w}(format\({w}{string}{w}(\,{w}{string}{w})*\))?|{font-face-name})({w},{w}({uri}{w}(format\({w}{string}{w}(\,{w}{string}{w})*\))?|{font-face-name}))*',
+    'unicode-range': '{unicode-range}({w},{w}{unicode-range})*'
+    }
+
+# CSS3 Paged Media
+macros[Profiles.CSS3_PAGED_MEDIA] = {
+    'page-size': 'a5|a4|a3|b5|b4|letter|legal|ledger',
+    'page-orientation': 'portrait|landscape',
+    'page-1': '{page-size}(?:{w}{page-orientation})?',
+    'page-2': '{page-orientation}(?:{w}{page-size})?',
+    'page-size-orientation': '{page-1}|{page-2}',
+    'pagebreak': 'auto|always|avoid|left|right'
+    }
+properties[Profiles.CSS3_PAGED_MEDIA] = {
+    'fit': 'fill|hidden|meet|slice',
+    'fit-position': r'auto|(({percentage}|{length})(\s*({percentage}|{length}))?|((top|center|bottom)\s*(left|center|right)?)|((left|center|right)\s*(top|center|bottom)?))',
+    'image-orientation': 'auto|{angle}',
+    'orphans': r'{integer}|inherit',
+    'page': 'auto|{ident}',
+    'page-break-before': '{pagebreak}|inherit',
+    'page-break-after': '{pagebreak}|inherit',
+    'page-break-inside': 'auto|avoid|inherit',
+    'size': '({length}{w}){1,2}|auto|{page-size-orientation}',
+    'widows': r'{integer}|inherit'
+    }
+
+macros[Profiles.CSS3_TEXT] = {
+    }
+properties[Profiles.CSS3_TEXT] = {
+    'text-shadow': 'none|{shadow}({w},{w}{shadow})*',
+    }
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/stylesheet.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/stylesheet.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/stylesheet.py	(revision 1126)
@@ -0,0 +1,123 @@
+"""StyleSheet implements DOM Level 2 Style Sheets StyleSheet."""
+__all__ = ['StyleSheet']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import cssutils
+import urlparse
+
+class StyleSheet(cssutils.util.Base2):
+    """
+    The StyleSheet interface is the abstract base interface
+    for any type of style sheet. It represents a single style
+    sheet associated with a structured document.
+
+    In HTML, the StyleSheet interface represents either an
+    external style sheet, included via the HTML LINK element,
+    or an inline STYLE element (also an @import stylesheet?).
+
+    In XML, this interface represents
+    an external style sheet, included via a style sheet
+    processing instruction.
+    """
+    def __init__(self, type='text/css',
+                 href=None,
+                 media=None,
+                 title=u'',
+                 ownerNode=None,
+                 parentStyleSheet=None,
+                 alternate=False,
+                 disabled=None,
+                 validating=True):
+        """
+        type
+            readonly
+        href: readonly
+            If the style sheet is a linked style sheet, the value
+            of this attribute is its location. For inline style
+            sheets, the value of this attribute is None. See the
+            href attribute definition for the LINK element in HTML
+            4.0, and the href pseudo-attribute for the XML style
+            sheet processing instruction.
+        media: of type MediaList, readonly
+            The intended destination media for style information.
+            The media is often specified in the ownerNode. If no
+            media has been specified, the MediaList will be empty.
+            See the media attribute definition for the LINK element
+            in HTML 4.0, and the media pseudo-attribute for the XML
+            style sheet processing instruction. Modifying the media
+            list may cause a change to the attribute disabled.
+        title: readonly
+            The advisory title. The title is often specified in
+            the ownerNode. See the title attribute definition for
+            the LINK element in HTML 4.0, and the title
+            pseudo-attribute for the XML style sheet processing
+            instruction.
+        disabled: False if the style sheet is applied to the
+            document. True if it is not. Modifying this attribute
+            may cause a new resolution of style for the document.
+            A stylesheet only applies if both an appropriate medium
+            definition is present and the disabled attribute is False.
+            So, if the media doesn't apply to the current user agent,
+            the disabled attribute is ignored.
+        ownerNode: of type Node, readonly
+            The node that associates this style sheet with the
+            document. For HTML, this may be the corresponding LINK
+            or STYLE element. For XML, it may be the linking
+            processing instruction. For style sheets that are
+            included by other style sheets, the value of this
+            attribute is None.
+        parentStyleSheet: of type StyleSheet, readonly
+            a StyleSheet or None
+        alternate = False
+            a flag stating if a style sheet is an alternate one or not.
+            Currently not used in cssutils
+        validating = True
+            a flag defining if this sheet should be validate on change. 
+        
+        """
+        super(StyleSheet, self).__init__()
+        
+        self.validating = validating
+        
+        self._alternate = alternate
+        self._href = href
+        self._ownerNode = ownerNode
+        self._parentStyleSheet = parentStyleSheet 
+        self._type = type
+
+        self.disabled = bool(disabled)
+        self.media = media
+        self.title = title
+    
+    alternate = property(lambda self: self._alternate, 
+                         doc="Not used in cssutils yet.")
+
+    href = property(lambda self: self._href,
+        doc="If the style sheet is a linked style sheet, the value "
+            "of this attribute is its location. For inline style "
+            "sheets, the value of this attribute is None. See the "
+            "href attribute definition for the LINK element in HTML "
+            "4.0, and the href pseudo-attribute for the XML style "
+            "sheet processing instruction.")
+
+    ownerNode = property(lambda self: self._ownerNode, 
+                         doc="Not used in cssutils yet.")
+    
+    parentStyleSheet = property(lambda self: self._parentStyleSheet,
+        doc="For style sheet languages that support the concept "
+            "of style sheet inclusion, this attribute represents "
+            "the including style sheet, if one exists. If the style "
+            "sheet is a top-level style sheet, or the style sheet "
+            "language does not support inclusion, the value of this "
+            "attribute is None.")
+
+    type = property(lambda self: self._type, 
+        doc="This specifies the style sheet language for this "
+            "style sheet. The style sheet language is specified "
+            "as a content type (e.g. ``text/css``). The content "
+            "type is often specified in the ownerNode. Also see "
+            "the type attribute definition for the LINK element "
+            "in HTML 4.0, and the type pseudo-attribute for the "
+            "XML style sheet processing instruction. "
+            "For CSS this is always ``text/css``.")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/medialist.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/medialist.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/medialist.py	(revision 1126)
@@ -0,0 +1,267 @@
+"""MediaList implements DOM Level 2 Style Sheets MediaList.
+
+TODO:
+    - delete: maybe if deleting from all, replace *all* with all others?
+    - is unknown media an exception?
+"""
+__all__ = ['MediaList']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.prodparser import *
+from cssutils.helper import normalize, pushtoken
+from cssutils.css import csscomment
+from mediaquery import MediaQuery
+import cssutils
+import xml.dom
+
+#class MediaList(cssutils.util.Base, cssutils.util.ListSeq):
+class MediaList(cssutils.util._NewListBase): 
+    """Provides the abstraction of an ordered collection of media,
+    without defining or constraining how this collection is
+    implemented.
+
+    A single media in the list is an instance of :class:`MediaQuery`. 
+    An empty list is the same as a list that contains the medium "all".
+
+    New format with :class:`MediaQuery`::
+
+        : S* [media_query [ ',' S* media_query ]* ]?
+
+
+    """
+    def __init__(self, mediaText=None, parentRule=None, readonly=False):
+        """
+        :param mediaText:
+            Unicodestring of parsable comma separared media
+            or a (Python) list of media.
+        :param parentRule:
+            CSSRule this medialist is used in, e.g. an @import or @media.
+        :param readonly:
+            Not used yet.
+        """
+        super(MediaList, self).__init__()
+        self._wellformed = False
+
+        if isinstance(mediaText, list):
+            mediaText = u','.join(mediaText)
+
+        self._parentRule = parentRule
+        
+        if mediaText:
+            self.mediaText = mediaText
+            
+        self._readonly = readonly
+
+    def __repr__(self):
+        return "cssutils.stylesheets.%s(mediaText=%r)" % (self.__class__.__name__, self.mediaText)
+
+    def __str__(self):
+        return "<cssutils.stylesheets.%s object mediaText=%r at 0x%x>" % (self.__class__.__name__, self.mediaText, id(self))
+
+
+    def __iter__(self):
+        for item in self._seq:
+            if item.type == 'MediaQuery':
+                yield item
+
+    length = property(lambda self: len(list(self)),
+        doc="The number of media in the list (DOM readonly).")
+
+
+    def _getMediaText(self):
+        return cssutils.ser.do_stylesheets_medialist(self)
+
+    def _setMediaText(self, mediaText):
+        """
+        :param mediaText:
+            simple value or comma-separated list of media
+
+        :exceptions:
+            - - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified string value has a syntax error and is
+              unparsable.
+            - - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this media list is readonly.
+        """
+        self._checkReadonly()
+
+
+        mediaquery = lambda: Prod(name='MediaQueryStart',
+                                  match=lambda t, v: t == 'IDENT' or v == u'(',
+                                  toSeq=lambda t, tokens: ('MediaQuery', 
+                                                           MediaQuery(pushtoken(t, tokens),
+                                                                      _partof=True))
+                                  )
+        prods = Sequence(Sequence(PreDef.comment(parent=self),
+                                  minmax=lambda: (0, None)
+                                  ),
+                         mediaquery(),
+                         Sequence(PreDef.comma(toSeq=False),
+                                  mediaquery(),
+                                  minmax=lambda: (0, None))
+
+                         )
+        # parse
+        ok, seq, store, unused = ProdParser().parse(mediaText,
+                                                    u'MediaList',
+                                                    prods, debug="ml")
+
+        # each mq must be valid
+        atleastone = False
+
+        for item in seq:
+            v = item.value
+            if isinstance(v, MediaQuery):
+               if not v.wellformed:
+                   ok = False
+                   break
+               else:
+                   atleastone = True
+
+        # must be at least one value!
+        if not atleastone:
+            ok = False
+            self._wellformed = ok
+            self._log.error(u'MediaQuery: No content.',
+                            error=xml.dom.SyntaxErr)
+
+        self._wellformed = ok
+
+        if ok: 
+            mediaTypes = []
+            finalseq = cssutils.util.Seq(readonly=False)
+            commentseqonly = cssutils.util.Seq(readonly=False)
+            for item in seq:
+                # filter for doubles?
+                if item.type == 'MediaQuery':
+                    mediaType = item.value.mediaType
+                    if mediaType:
+                        if mediaType == u'all':
+                            # remove anthing else and keep all+comments(!) only
+                            finalseq = commentseqonly
+                            finalseq.append(item)
+                            break
+                        elif mediaType in mediaTypes:
+                            continue
+                        else:
+                            mediaTypes.append(mediaType)
+                elif isinstance(item.value, cssutils.css.csscomment.CSSComment):
+                    commentseqonly.append(item) 
+                
+                finalseq.append(item)
+
+            self._setSeq(finalseq)
+
+    mediaText = property(_getMediaText, _setMediaText,
+        doc="The parsable textual representation of the media list.")
+
+    def __prepareset(self, newMedium):
+        # used by appendSelector and __setitem__
+        self._checkReadonly()
+
+        if not isinstance(newMedium, MediaQuery):
+            newMedium = MediaQuery(newMedium)
+
+        if newMedium.wellformed:
+            return newMedium
+
+    def __setitem__(self, index, newMedium):
+        """Overwriting ListSeq.__setitem__
+
+        Any duplicate items are **not yet** removed.
+        """
+        # TODO: remove duplicates?
+        newMedium = self.__prepareset(newMedium)
+        if newMedium:
+            self._seq[index] = (newMedium, 'MediaQuery', None, None)
+
+    def appendMedium(self, newMedium):
+        """Add the `newMedium` to the end of the list. 
+        If the `newMedium` is already used, it is first removed.
+        
+        :param newMedium:
+            a string or a :class:`~cssutils.stylesheets.MediaQuery`
+        :returns: Wellformedness of `newMedium`.
+        :exceptions:
+            - :exc:`~xml.dom.InvalidCharacterErr`:
+              If the medium contains characters that are invalid in the
+              underlying style language.
+            - :exc:`~xml.dom.InvalidModificationErr`:
+              If mediaText is "all" and a new medium is tried to be added.
+              Exception is "handheld" which is set in any case (Opera does handle
+              "all, handheld" special, this special case might be removed in the
+              future).
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this list is readonly.
+        """
+        newMedium = self.__prepareset(newMedium)
+
+        if newMedium:
+            mts = [normalize(item.value.mediaType) for item in self]
+            newmt = normalize(newMedium.mediaType)
+
+            self._seq._readonly = False
+
+            if u'all' in mts:
+                self._log.info(u'MediaList: Ignoring new medium %r as already specified "all" (set ``mediaText`` instead).' % newMedium, error=xml.dom.InvalidModificationErr)
+            
+            elif newmt and newmt in mts:
+                # might be empty
+                self.deleteMedium(newmt)
+                self._seq.append(newMedium, 'MediaQuery')
+
+            else:
+                if u'all' == newmt:
+                    self._clearSeq()
+
+                self._seq.append(newMedium, 'MediaQuery')
+
+            self._seq._readonly = True
+
+            return True
+
+        else:
+            return False
+
+    def append(self, newMedium):
+        "Same as :meth:`appendMedium`."
+        self.appendMedium(newMedium)
+
+    def deleteMedium(self, oldMedium):
+        """Delete a medium from the list.
+
+        :param oldMedium:
+            delete this medium from the list.
+        :exceptions:
+            - :exc:`~xml.dom.NotFoundErr`:
+              Raised if `oldMedium` is not in the list.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this list is readonly.
+        """
+        self._checkReadonly()
+        oldMedium = normalize(oldMedium)
+
+        for i, mq in enumerate(self):
+            if normalize(mq.value.mediaType) == oldMedium:
+                del self[i]
+                break
+        else:
+            self._log.error(u'"%s" not in this MediaList' % oldMedium,
+                            error=xml.dom.NotFoundErr)
+
+    def item(self, index):
+        """Return the mediaType of the `index`'th element in the list.
+        If `index` is greater than or equal to the number of media in the
+        list, returns ``None``.
+        """
+        try:
+            return self[index].mediaType
+        except IndexError:
+            return None
+
+    parentRule = property(lambda self: self._parentRule,
+                          doc=u"The CSSRule (e.g. an @media or @import rule "
+                              u"this list is part of or None")
+    
+    wellformed = property(lambda self: self._wellformed)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/__init__.py	(revision 1126)
@@ -0,0 +1,11 @@
+"""Implements Document Object Model Level 2 Style Sheets
+http://www.w3.org/TR/2000/PR-DOM-Level-2-Style-20000927/stylesheets.html
+"""
+__all__ = ['MediaList', 'MediaQuery', 'StyleSheet', 'StyleSheetList']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from medialist import *
+from mediaquery import *
+from stylesheet import *
+from stylesheetlist import *
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/mediaquery.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/mediaquery.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/mediaquery.py	(revision 1126)
@@ -0,0 +1,208 @@
+"""Implements a DOM for MediaQuery, see 
+http://www.w3.org/TR/css3-mediaqueries/.
+
+A cssutils implementation, not defined in official DOM.
+"""
+__all__ = ['MediaQuery']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.prodparser import *
+from cssutils.helper import normalize, pushtoken
+import cssutils
+import re
+import xml.dom
+
+class MediaQuery(cssutils.util._NewBase):#cssutils.util.Base):
+    """
+    A Media Query consists of one of :const:`MediaQuery.MEDIA_TYPES`
+    and one or more expressions involving media features.
+
+    Format::
+  
+        media_query
+         : [ONLY | NOT]? S* media_type S* [ AND S* expression ]*
+         | expression [ AND S* expression ]*
+         ;
+        media_type
+         : IDENT
+         ;
+        expression
+         : '(' S* media_feature S* [ ':' S* expr ]? ')' S*
+         ;
+        media_feature
+         : IDENT
+         ;
+          
+    """
+    MEDIA_TYPES = ['all', 'braille', 'handheld', 'print', 'projection', 
+                'speech', 'screen', 'tty', 'tv', 'embossed']
+
+
+    def __init__(self, mediaText=None, readonly=False, _partof=False):
+        """
+        :param mediaText:
+            unicodestring of parsable media
+
+        # _standalone: True if new from ML parser
+        """
+        super(MediaQuery, self).__init__()
+
+        self._wellformed = False
+        self._mediaType = u''
+        self._partof = _partof
+        if mediaText:
+            self.mediaText = mediaText # sets self._mediaType too
+            self._partof = False
+
+        self._readonly = readonly
+
+    def __repr__(self):
+        return "cssutils.stylesheets.%s(mediaText=%r)" % (
+                self.__class__.__name__, self.mediaText)
+
+    def __str__(self):
+        return "<cssutils.stylesheets.%s object mediaText=%r at 0x%x>" % (
+                self.__class__.__name__, self.mediaText, id(self))
+
+    def _getMediaText(self):
+        return cssutils.ser.do_stylesheets_mediaquery(self)
+
+    def _setMediaText(self, mediaText):
+        """
+        :param mediaText:
+            a single media query string, e.g. ``print and (min-width: 25cm)``
+
+        :exceptions:    
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified string value has a syntax error and is
+              unparsable.
+            - :exc:`~xml.dom.InvalidCharacterErr`:
+              Raised if the given mediaType is unknown.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this media query is readonly.
+        
+        media_query
+         : [ONLY | NOT]? S* media_type S* [ AND S* expression ]*
+         | expression [ AND S* expression ]*
+         ;
+        media_type
+         : IDENT
+         ;
+        expression
+         : '(' S* media_feature S* [ ':' S* expr ]? ')' S*
+         ;
+        media_feature
+         : IDENT
+         ;
+
+        """
+        self._checkReadonly()
+
+        expression = lambda: Sequence(PreDef.char(name='expression', char=u'('),
+                                      Prod(name=u'media_feature',
+                                           match=lambda t, v: t == PreDef.types.IDENT
+                                      ),
+                                      Sequence(PreDef.char(name='colon', char=u':'),
+                                               cssutils.css.value.MediaQueryValueProd(self),
+                                               minmax=lambda: (0, 1) # optional
+                                               ),
+                                      PreDef.char(name='expression END', char=u')',
+                                                  stopIfNoMoreMatch=self._partof
+                                                  )
+                                      )
+
+        prods = Choice(Sequence(Prod(name=u'ONLY|NOT', # media_query
+                                     match=lambda t, v: t == PreDef.types.IDENT and 
+                                                        normalize(v) in (u'only', u'not'),
+                                     optional=True,
+                                     toStore='not simple'
+                                     ), 
+                                Prod(name=u'media_type',
+                                     match=lambda t, v: t == PreDef.types.IDENT and 
+                                                        normalize(v) in self.MEDIA_TYPES,
+                                     stopIfNoMoreMatch=True,
+                                     toStore='media_type'
+                                     ),                   
+                                Sequence(Prod(name=u'AND',
+                                              match=lambda t, v: t == PreDef.types.IDENT and 
+                                                                 normalize(v) == 'and',
+                                              toStore='not simple'
+                                         ),                   
+                                         expression(),
+                                         minmax=lambda: (0, None)
+                                         )
+                                ),
+                       Sequence(expression(),                   
+                                Sequence(Prod(name=u'AND',
+                                              match=lambda t, v: t == PreDef.types.IDENT and 
+                                                                 normalize(v) == 'and'
+                                         ),                   
+                                         expression(),
+                                         minmax=lambda: (0, None)
+                                         )
+                                )                        
+                       )
+        
+        # parse
+        ok, seq, store, unused = ProdParser().parse(mediaText, 
+                                                    u'MediaQuery',
+                                                    prods)
+        self._wellformed = ok
+        if ok:
+            try:
+                media_type = store['media_type']
+            except KeyError, e:
+                pass
+            else:
+                if 'not simple' not in store:
+                    self.mediaType = media_type.value
+
+            # TODO: filter doubles!
+            self._setSeq(seq)
+
+    mediaText = property(_getMediaText, _setMediaText,
+        doc="The parsable textual representation of the media list.")
+
+    def _setMediaType(self, mediaType):
+        """
+        :param mediaType:
+            one of :attr:`MEDIA_TYPES`
+
+        :exceptions:
+            - :exc:`~xml.dom.SyntaxErr`:
+              Raised if the specified string value has a syntax error and is
+              unparsable.
+            - :exc:`~xml.dom.InvalidCharacterErr`:
+              Raised if the given mediaType is unknown.
+            - :exc:`~xml.dom.NoModificationAllowedErr`:
+              Raised if this media query is readonly.
+        """
+        self._checkReadonly()
+        nmediaType = normalize(mediaType)
+
+        if nmediaType not in self.MEDIA_TYPES:
+            self._log.error(
+                u'MediaQuery: Syntax Error in media type "%s".' % mediaType,
+                error=xml.dom.SyntaxErr)
+        else:
+            # set
+            self._mediaType = mediaType
+
+            # update seq
+            for i, x in enumerate(self._seq):
+                if isinstance(x.value, basestring):
+                    if normalize(x.value) in (u'only', u'not'):
+                        continue
+                    else:
+                        # TODO: simplify!
+                        self._seq[i] = (mediaType, 'IDENT', None, None)
+                        break
+            else:
+                self._seq.insert(0, mediaType, 'IDENT')
+
+    mediaType = property(lambda self: self._mediaType, _setMediaType,
+        doc="The media type of this MediaQuery (one of "
+            ":attr:`MEDIA_TYPES`) but only if it is a simple MediaType!")
+    
+    wellformed = property(lambda self: self._wellformed)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/stylesheetlist.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/stylesheetlist.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/stylesheets/stylesheetlist.py	(revision 1126)
@@ -0,0 +1,32 @@
+"""StyleSheetList implements DOM Level 2 Style Sheets StyleSheetList."""
+__all__ = ['StyleSheetList']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+class StyleSheetList(list):
+    """Interface `StyleSheetList` (introduced in DOM Level 2)
+
+    The `StyleSheetList` interface provides the abstraction of an ordered
+    collection of :class:`~cssutils.stylesheets.StyleSheet` objects.
+
+    The items in the `StyleSheetList` are accessible via an integral index,
+    starting from 0.
+
+    This Python implementation is based on a standard Python list so e.g.
+    allows ``examplelist[index]`` usage.
+    """
+    def item(self, index):
+        """
+        Used to retrieve a style sheet by ordinal `index`. If `index` is
+        greater than or equal to the number of style sheets in the list,
+        this returns ``None``.
+        """
+        try:
+            return self[index]
+        except IndexError:
+            return None
+
+    length = property(lambda self: len(self),
+        doc="The number of :class:`StyleSheet` objects in the list. The range"
+        "  of valid child stylesheet indices is 0 to length-1 inclusive.")
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/serialize.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/serialize.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/serialize.py	(revision 1126)
@@ -0,0 +1,1203 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""cssutils serializer"""
+__all__ = ['CSSSerializer', 'Preferences']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+from cssutils.helper import normalize
+import codecs
+import cssutils
+import helper
+import re
+import xml.dom
+
+def _escapecss(e):
+    """
+    Escapes characters not allowed in the current encoding the CSS way
+    with a backslash followed by a uppercase hex code point
+
+    E.g. the german umlaut 'ä' is escaped as \E4
+    """
+    s = e.object[e.start:e.end]
+    return u''.join([ur'\%s ' % str(hex(ord(x)))[2:] # remove 0x from hex
+                     .upper() for x in s]), e.end
+
+codecs.register_error('escapecss', _escapecss)
+
+
+class Preferences(object):
+    """Control output of CSSSerializer.
+
+    defaultAtKeyword = True
+        Should the literal @keyword from src CSS be used or the default
+        form, e.g. if ``True``: ``@import`` else: ``@i\mport``
+    defaultPropertyName = True
+        Should the normalized propertyname be used or the one given in
+        the src file, e.g. if ``True``: ``color`` else: ``c\olor``
+
+        Only used if ``keepAllProperties==False``.
+
+    defaultPropertyPriority = True
+        Should the normalized or literal priority be used, e.g. ``!important``
+        or ``!Im\portant``
+
+    importHrefFormat = None
+        Uses hreftype if ``None`` or format ``"URI"`` if ``'string'`` or
+        format ``url(URI)`` if ``'uri'``
+    indent = 4 * ' '
+        Indentation of e.g Properties inside a CSSStyleDeclaration
+    indentClosingBrace = True
+        Defines if closing brace of block is indented to match indentation
+        of the block (default) oder match indentation of selector.
+    indentSpecificities = False (**EXPERIMENTAL**)
+        Indent rules with subset of Selectors and higher Specitivity
+
+    keepAllProperties = True
+        If ``True`` all properties set in the original CSSStylesheet
+        are kept meaning even properties set twice with the exact same
+        same name are kept!
+    keepComments = True
+        If ``False`` removes all CSSComments
+    keepEmptyRules = False
+        defines if empty rules like e.g. ``a {}`` are kept in the resulting
+        serialized sheet
+    keepUnknownAtRules = True
+        defines if unknown @rules like e.g. ``@three-dee {}`` are kept in the
+        serialized sheet
+    keepUsedNamespaceRulesOnly = False
+        if True only namespace rules which are actually used are kept
+
+    lineNumbers = False
+        Only used if a complete CSSStyleSheet is serialized.
+    lineSeparator = u'\\n'
+        How to end a line. This may be set to e.g. u'' for serializing of
+        CSSStyleDeclarations usable in HTML style attribute.
+    listItemSpacer = u' '
+        string which is used in ``css.SelectorList``, ``css.CSSValue`` and
+        ``stylesheets.MediaList`` after the comma
+    normalizedVarNames = True
+        defines if variable names should be serialized normalized (they are
+        used as being normalized anyway)
+    omitLastSemicolon = True
+        If ``True`` omits ; after last property of CSSStyleDeclaration
+    omitLeadingZero = False
+        defines if values between -1 and 1 should omit the 0, like ``.5px``
+    paranthesisSpacer = u' '
+        string which is used before an opening paranthesis like in a
+        ``css.CSSMediaRule`` or ``css.CSSStyleRule``
+    propertyNameSpacer = u' '
+        string which is used after a Property name colon
+    resolveVariables = True
+        if ``True`` all variable references are tried to resolved and
+        all CSSVariablesRules are removed from the output.
+        Any variable reference not resolvable is simply kept untouched.
+    selectorCombinatorSpacer = u' '
+        string which is used before and after a Selector combinator like +, > or ~.
+        CSSOM defines a single space for this which is also the default in cssutils.
+    spacer = u' '
+        general spacer, used e.g. by CSSUnknownRule
+
+    validOnly = False
+        if True only valid (Properties) are output
+
+        A Property is valid if it is a known Property with a valid value.
+    """
+    def __init__(self, **initials):
+        """Always use named instead of positional parameters."""
+        self.useDefaults()
+        for key, value in initials.items():
+            if value:
+                self.__setattr__(key, value)
+
+    def __repr__(self):
+        return u"cssutils.css.%s(%s)" % (self.__class__.__name__,
+            u', '.join(['\n    %s=%r' % (p, self.__getattribute__(p)) for p in self.__dict__]
+                ))
+
+    def __str__(self):
+        return u"<cssutils.css.%s object %s at 0x%x" % (self.__class__.__name__,
+            u' '.join(['%s=%r' % (p, self.__getattribute__(p)) for p in self.__dict__]
+                ),
+                id(self))
+
+    def useDefaults(self):
+        "Reset all preference options to their default value."
+        self.defaultAtKeyword = True
+        self.defaultPropertyName = True
+        self.defaultPropertyPriority = True
+        self.importHrefFormat = None
+        self.indent = 4 * u' '
+        self.indentClosingBrace = True
+        self.indentSpecificities = False
+        self.keepAllProperties = True
+        self.keepComments = True
+        self.keepEmptyRules = False
+        self.keepUnknownAtRules = True
+        self.keepUsedNamespaceRulesOnly = False
+        self.lineNumbers = False
+        self.lineSeparator = u'\n'
+        self.listItemSpacer = u' '
+        self.normalizedVarNames = True
+        self.omitLastSemicolon = True
+        self.omitLeadingZero = False
+        self.paranthesisSpacer = u' '
+        self.propertyNameSpacer = u' '
+        self.resolveVariables = True
+        self.selectorCombinatorSpacer = u' '
+        self.spacer = u' '
+        self.validOnly = False # should not be changed currently!!!
+
+    def useMinified(self):
+        """Set options resulting in a minified stylesheet.
+
+        You may want to set preferences with this convenience method
+        and override specific settings you want adjusted afterwards.
+        """
+        self.importHrefFormat = 'string'
+        self.indent = u''
+        self.keepComments = False
+        self.keepEmptyRules = False
+        self.keepUnknownAtRules = False
+        self.keepUsedNamespaceRulesOnly = True
+        self.lineNumbers = False
+        self.lineSeparator = u''
+        self.listItemSpacer = u''
+        self.omitLastSemicolon = True
+        self.omitLeadingZero = True
+        self.paranthesisSpacer = u''
+        self.propertyNameSpacer = u''
+        self.selectorCombinatorSpacer = u''
+        self.spacer = u''
+        self.validOnly = False
+
+
+class Out(object):
+    """A simple class which makes appended items available as a combined string"""
+    def __init__(self, ser):
+        self.ser = ser
+        self.out = []
+
+    def _remove_last_if_S(self):
+        if self.out and not self.out[-1].strip():
+            # remove trailing S
+            del self.out[-1]
+
+    def append(self, val, type_=None, space=True, keepS=False, indent=False, alwaysS=False):
+        """Appends val. Adds a single S after each token except as follows:
+
+        - typ COMMENT
+            uses cssText depending on self.ser.prefs.keepComments
+        - typ "Property", cssutils.css.CSSRule.UNKNOWN_RULE
+            uses cssText
+        - typ STRING
+            escapes helper.string
+        - typ S
+            ignored except ``keepS=True``
+        - typ URI
+            calls helper.uri
+        - val ``{``
+            adds LF after
+        - val ``;``, typ 'styletext'
+            removes S before and adds LF after
+        - val ``, :``
+            removes S before
+        - val ``+ > ~``
+            encloses in prefs.selectorCombinatorSpacer
+        - some other vals
+            add ``*spacer`` except ``space=False``
+        """
+        prefspace = self.ser.prefs.spacer
+        if val or type_ in ('STRING', 'URI'):
+            # PRE
+            if 'COMMENT' == type_:
+                if self.ser.prefs.keepComments:
+                    val = val.cssText
+                else:
+                    return
+            elif 'S' == type_ and not keepS:
+                return
+            elif 'S' == type_ and keepS:
+                val = u' '
+            elif 'STRING' == type_:
+                # may be empty but MUST not be None
+                if val is None:
+                    return
+                val = helper.string(val)
+                if not prefspace:
+                    self._remove_last_if_S()
+            elif 'URI' == type_:
+                val = helper.uri(val)
+            elif 'HASH' == type_:
+                val = self.ser._hash(val)
+            elif hasattr(val, 'cssText'):
+                val = val.cssText
+            elif hasattr(val, 'mediaText'):
+                val = val.mediaText
+            elif val in u'+>~,:{;)]/=}' and not alwaysS:
+                self._remove_last_if_S()
+#            elif type_ in ('Property', cssutils.css.CSSRule.UNKNOWN_RULE):
+#                val = val.cssText
+#            elif type_ in ('NUMBER', 'DIMENSION', 'PERCENTAGE') and val == u'0':
+#                # remove sign + or - if value is zero
+#                # TODO: only for lenghts!
+#                if self.out and self.out[-1] in u'+-':
+#                    del self.out[-1]
+
+            # APPEND
+
+            if indent or (val == u'}' and self.ser.prefs.indentClosingBrace):
+                self.out.append(self.ser._indentblock(val, self.ser._level+1))
+            else:
+                if val.endswith(u' '):
+                    self._remove_last_if_S()
+                self.out.append(val)
+
+            # POST
+            if alwaysS and val in u'-+*/': # calc, */ not really but do anyway
+                self.out.append(u' ')
+            elif val in u'+>~': # enclose selector combinator
+                self.out.insert(-1, self.ser.prefs.selectorCombinatorSpacer)
+                self.out.append(self.ser.prefs.selectorCombinatorSpacer)
+            elif u')' == val and not keepS: # CHAR funcend
+                # TODO: pref?
+                self.out.append(u' ')
+            elif u',' == val: # list
+                self.out.append(self.ser.prefs.listItemSpacer)
+            elif u':' == val: # prop
+                self.out.append(self.ser.prefs.propertyNameSpacer)
+            elif u'{' == val: # block start
+                self.out.insert(-1, self.ser.prefs.paranthesisSpacer)
+                self.out.append(self.ser.prefs.lineSeparator)
+            elif u';' == val or 'styletext' == type_: # end or prop or block
+                self.out.append(self.ser.prefs.lineSeparator)
+            elif val not in u'}[]()/=' and space and type_ != 'FUNCTION':
+                self.out.append(self.ser.prefs.spacer)
+                if type_ != 'STRING' and not self.ser.prefs.spacer and \
+                   self.out and not self.out[-1].endswith(u' '):
+                    self.out.append(u' ')
+
+    def value(self, delim=u'', end=None, keepS=False):
+        "returns all items joined by delim"
+        if not keepS:
+            self._remove_last_if_S()
+        if end:
+            self.out.append(end)
+        return delim.join(self.out)
+
+
+class CSSSerializer(object):
+    """Serialize a CSSStylesheet and its parts.
+
+    To use your own serializing method the easiest is to subclass CSS
+    Serializer and overwrite the methods you like to customize.
+    """
+    def __init__(self, prefs=None):
+        """
+        :param prefs:
+            instance of Preferences
+        """
+        if not prefs:
+            prefs = Preferences()
+        self.prefs = prefs
+        self._level = 0 # current nesting level
+
+        # TODO:
+        self._selectors = [] # holds SelectorList
+        self._selectorlevel = 0 # current specificity nesting level
+
+    def _atkeyword(self, rule):
+        "returns default or source atkeyword depending on prefs"
+        if self.prefs.defaultAtKeyword:
+            return rule.atkeyword # default
+        else:
+            return rule._keyword
+
+    def _indentblock(self, text, level):
+        """
+        indent a block like a CSSStyleDeclaration to the given level
+        which may be higher than self._level (e.g. for CSSStyleDeclaration)
+        """
+        if not self.prefs.lineSeparator:
+            return text
+        return self.prefs.lineSeparator.join(
+            [u'%s%s' % (level * self.prefs.indent, line)
+                for line in text.split(self.prefs.lineSeparator)]
+        )
+
+    def _propertyname(self, property, actual):
+        """
+        used by all styledeclarations to get the propertyname used
+        dependent on prefs setting defaultPropertyName and
+        keepAllProperties
+        """
+        if self.prefs.defaultPropertyName and not self.prefs.keepAllProperties:
+            return property.name
+        else:
+            return actual
+
+    def _linenumnbers(self, text):
+        if self.prefs.lineNumbers:
+            pad = len(str(text.count(self.prefs.lineSeparator)+1))
+            out = []
+            for i, line in enumerate(text.split(self.prefs.lineSeparator)):
+                out.append((u'%*i: %s') % (pad, i+1, line))
+            text = self.prefs.lineSeparator.join(out)
+        return text
+
+    def _hash(self, val, type_=None):
+        """
+        Short form of hash, e.g. #123 instead of #112233
+        """
+        # TODO: add pref for this!
+        if len(val) == 7 and val[1] == val[2] and\
+                             val[3] == val[4] and\
+                             val[5] == val[6]:
+            return u'#%s%s%s' % (val[1], val[3], val[5])
+        else:
+            return val
+
+    def _valid(self, x):
+        "checks items valid property and prefs.validOnly"
+        return not self.prefs.validOnly or (self.prefs.validOnly and
+                                            x.valid)
+
+    def do_CSSStyleSheet(self, stylesheet):
+        """serializes a complete CSSStyleSheet"""
+        useduris = stylesheet._getUsedURIs()
+        out = []
+        for rule in stylesheet.cssRules:
+            if self.prefs.keepUsedNamespaceRulesOnly and\
+               rule.NAMESPACE_RULE == rule.type and\
+               rule.namespaceURI not in useduris and (
+                    rule.prefix or None not in useduris):
+                continue
+
+            cssText = rule.cssText
+            if cssText:
+                out.append(cssText)
+        text = self._linenumnbers(self.prefs.lineSeparator.join(out))
+
+        # get encoding of sheet, defaults to UTF-8
+        try:
+            encoding = stylesheet.cssRules[0].encoding
+        except (IndexError, AttributeError):
+            encoding = u'UTF-8'
+
+        # TODO: py3 return b str but tests use unicode?
+        return text.encode(encoding, u'escapecss')
+
+    def do_CSSComment(self, rule):
+        """
+        serializes CSSComment which consists only of commentText
+        """
+        if rule._cssText and self.prefs.keepComments:
+            return rule._cssText
+        else:
+            return u''
+
+    def do_CSSCharsetRule(self, rule):
+        """
+        serializes CSSCharsetRule
+        encoding: string
+
+        always @charset "encoding";
+        no comments or other things allowed!
+        """
+        if rule.wellformed:
+            return u'@charset %s;' % helper.string(rule.encoding)
+        else:
+            return u''
+
+    def do_CSSVariablesRule(self, rule):
+        """
+        serializes CSSVariablesRule
+
+        media
+            TODO
+        variables
+            CSSStyleDeclaration
+
+        + CSSComments
+        """
+        variablesText = rule.variables.cssText
+
+        if variablesText and rule.wellformed and not self.prefs.resolveVariables:
+            out = Out(self)
+            out.append(self._atkeyword(rule))
+            for item in rule.seq:
+                # assume comments {
+                out.append(item.value, item.type)
+            out.append(u'{')
+            out.append(u'%s%s}' % (variablesText, self.prefs.lineSeparator),
+                       indent=1)
+            return out.value()
+        else:
+            return u''
+
+    def do_CSSFontFaceRule(self, rule):
+        """
+        serializes CSSFontFaceRule
+
+        style
+            CSSStyleDeclaration
+
+        + CSSComments
+        """
+        styleText = self.do_css_CSSStyleDeclaration(rule.style)
+
+        if styleText and rule.wellformed:
+            out = Out(self)
+            out.append(self._atkeyword(rule))
+            for item in rule.seq:
+                # assume comments {
+                out.append(item.value, item.type)
+            out.append(u'{')
+            out.append(u'%s%s}' % (styleText, self.prefs.lineSeparator),
+                       indent=1)
+            return out.value()
+        else:
+            return u''
+
+    def do_CSSImportRule(self, rule):
+        """
+        serializes CSSImportRule
+
+        href
+            string
+        media
+            optional cssutils.stylesheets.medialist.MediaList
+        name
+            optional string
+
+        + CSSComments
+        """
+        if rule.wellformed:
+            out = Out(self)
+            out.append(self._atkeyword(rule))
+
+            for item in rule.seq:
+                type_, val = item.type, item.value
+                if 'href' == type_:
+                    # "href" or url(href)
+                    if self.prefs.importHrefFormat == 'string' or (
+                             self.prefs.importHrefFormat != 'uri' and
+                             rule.hreftype == 'string'):
+                        out.append(val, 'STRING')
+                    else:
+                        out.append(val, 'URI')
+                elif 'media' == type_:
+                    # media
+                    mediaText = self.do_stylesheets_medialist(val)
+                    if mediaText and mediaText != u'all':
+                        out.append(mediaText)
+                elif 'name' == type_:
+                    out.append(val, 'STRING')
+                else:
+                    out.append(val, type_)
+
+            return out.value(end=u';')
+        else:
+            return u''
+
+    def do_CSSNamespaceRule(self, rule):
+        """
+        serializes CSSNamespaceRule
+
+        uri
+            string
+        prefix
+            string
+
+        + CSSComments
+        """
+        if rule.wellformed:
+            out = Out(self)
+            out.append(self._atkeyword(rule))
+            for item in rule.seq:
+                type_, val = item.type, item.value
+                if 'namespaceURI' == type_:
+                    out.append(val, 'STRING')
+                else:
+                    out.append(val, type_)
+
+            return out.value(end=u';')
+        else:
+            return u''
+
+    def do_CSSMediaRule(self, rule):
+        """
+        serializes CSSMediaRule
+
+        + CSSComments
+        """
+        # TODO: use Out()?
+
+        # mediaquery
+        if not rule.media.wellformed:
+            return u''
+
+        # @media
+        out = [self._atkeyword(rule)]
+        if not len(self.prefs.spacer):
+            # for now always with space as only webkit supports @mediaall?
+            out.append(u' ')
+        else:
+            out.append(self.prefs.spacer) # might be empty
+
+        out.append(self.do_stylesheets_medialist(rule.media))
+
+        # name, seq contains content after name only (Comments)
+        if rule.name:
+            out.append(self.prefs.spacer)
+            nameout = Out(self)
+            nameout.append(helper.string(rule.name))
+            for item in rule.seq:
+                nameout.append(item.value, item.type)
+            out.append(nameout.value())
+
+        #  {
+        out.append(self.prefs.paranthesisSpacer)
+        out.append(u'{')
+        out.append(self.prefs.lineSeparator)
+
+        # rules
+        rulesout = []
+        for r in rule.cssRules:
+            rtext = r.cssText
+            if rtext:
+                # indent each line of cssText
+                rulesout.append(self._indentblock(rtext, self._level + 1))
+                rulesout.append(self.prefs.lineSeparator)
+        if not self.prefs.keepEmptyRules and not u''.join(rulesout).strip():
+            return u''
+        out.extend(rulesout)
+
+        #     }
+        out.append(u'%s}' % ((self._level + int(self.prefs.indentClosingBrace))
+                             * self.prefs.indent))
+
+        return u''.join(out)
+
+    def do_CSSPageRule(self, rule):
+        """
+        serializes CSSPageRule
+
+        selectorText
+            string
+        style
+            CSSStyleDeclaration
+        cssRules
+            CSSRuleList of MarginRule objects
+
+        + CSSComments
+        """
+        # rules
+        rules = u''
+        rulesout = []
+        for r in rule.cssRules:
+            rtext = r.cssText
+            if rtext:
+                rulesout.append(rtext)
+                rulesout.append(self.prefs.lineSeparator)
+
+        rulesText = u''.join(rulesout)#.strip()
+
+        # omit semicolon only if no MarginRules
+        styleText = self.do_css_CSSStyleDeclaration(rule.style,
+                                                    omit=not rulesText)
+
+        if (styleText or rulesText) and rule.wellformed:
+            out = Out(self)
+            out.append(self._atkeyword(rule))
+            out.append(rule.selectorText)
+            out.append(u'{')
+
+            if styleText:
+                if not rulesText:
+                    out.append(u'%s%s' % (styleText,
+                                          self.prefs.lineSeparator
+                                          ), indent=1)
+                else:
+                    out.append(styleText, type_='styletext', indent=1, space=False)
+
+            if rulesText:
+                out.append(rulesText, indent=1)
+            #?
+            self._level -= 1
+            out.append(u'}')
+            self._level += 1
+
+            return out.value()
+        else:
+            return u''
+
+    def do_CSSPageRuleSelector(self, seq):
+        "Serialize selector of a CSSPageRule"
+        out = Out(self)
+        for item in seq:
+            if item.type == 'IDENT':
+                out.append(item.value, item.type, space=False)
+            else:
+                out.append(item.value, item.type)
+        return out.value()
+
+    def do_MarginRule(self, rule):
+        """
+        serializes MarginRule
+
+        atkeyword
+            string
+        style
+            CSSStyleDeclaration
+
+        + CSSComments
+        """
+        # might not be set at all?!
+        if rule.atkeyword:
+            styleText = self.do_css_CSSStyleDeclaration(rule.style)
+
+            if styleText and rule.wellformed:
+                out = Out(self)
+
+#                # use seq but styledecl missing
+#                for item in rule.seq:
+#                    if item.type == 'ATKEYWORD':
+#                        # move logic to Out
+#                        out.append(self._atkeyword(rule), type_=item.type)
+#                    else:
+#                        print type_, val
+#                        out.append(item.value, item.type)
+#                return out.value()
+
+                # ok for now:
+                out.append(self._atkeyword(rule), type_='ATKEYWORD')
+                out.append(u'{')
+                out.append(u'%s%s' % (self._indentblock(styleText, self._level+1),
+                                       self.prefs.lineSeparator))
+                out.append(u'}')
+                return out.value()
+
+        return u''
+
+    def do_CSSUnknownRule(self, rule):
+        """
+        serializes CSSUnknownRule
+        anything until ";" or "{...}"
+        + CSSComments
+        """
+        if rule.wellformed and self.prefs.keepUnknownAtRules:
+            out = Out(self)
+            out.append(rule.atkeyword)
+
+            stacks = []
+            for item in rule.seq:
+                type_, val = item.type, item.value
+                # PRE
+                if u'}' == val:
+                    # close last open item on stack
+                    stackblock = stacks.pop().value()
+                    if stackblock:
+                        val = self._indentblock(
+                               stackblock + self.prefs.lineSeparator + val,
+                               min(1, len(stacks)+1))
+                    else:
+                        val = self._indentblock(val, min(1, len(stacks)+1))
+                # APPEND
+                if stacks:
+                    stacks[-1].append(val, type_)
+                else:
+                    out.append(val, type_)
+
+                # POST
+                if u'{' == val:
+                    # new stack level
+                    stacks.append(Out(self))
+
+            return out.value()
+        else:
+            return u''
+
+    def do_CSSStyleRule(self, rule):
+        """
+        serializes CSSStyleRule
+
+        selectorList
+        style
+
+        + CSSComments
+        """
+        # TODO: use Out()
+
+        # prepare for element nested rules
+        # TODO: sort selectors!
+        if self.prefs.indentSpecificities:
+            # subselectorlist?
+            elements = set([s.element for s in rule.selectorList])
+            specitivities = [s.specificity for s in rule.selectorList]
+            for selector in self._selectors:
+                lastelements = set([s.element for s in selector])
+                if elements.issubset(lastelements):
+                    # higher specificity?
+                    lastspecitivities = [s.specificity for s in selector]
+                    if specitivities > lastspecitivities:
+                        self._selectorlevel += 1
+                        break
+                elif self._selectorlevel > 0:
+                    self._selectorlevel -= 1
+            else:
+                # save new reference
+                self._selectors.append(rule.selectorList)
+                self._selectorlevel = 0
+
+        # TODO ^ RESOLVE!!!!
+
+        selectorText = self.do_css_SelectorList(rule.selectorList)
+        if not selectorText or not rule.wellformed:
+            return u''
+        self._level += 1
+        styleText = u''
+        try:
+            styleText = self.do_css_CSSStyleDeclaration(rule.style)
+        finally:
+            self._level -= 1
+        if not styleText:
+                if self.prefs.keepEmptyRules:
+                    return u'%s%s{}' % (selectorText,
+                                        self.prefs.paranthesisSpacer)
+        else:
+            return self._indentblock(
+                u'%s%s{%s%s%s%s}' % (
+                    selectorText,
+                    self.prefs.paranthesisSpacer,
+                    self.prefs.lineSeparator,
+                    self._indentblock(styleText, self._level + 1),
+                    self.prefs.lineSeparator,
+                    (self._level + int(self.prefs.indentClosingBrace))
+                    * self.prefs.indent),
+                self._selectorlevel)
+
+    def do_css_SelectorList(self, selectorlist):
+        "comma-separated list of Selectors"
+        # does not need Out() as it is too simple
+        if selectorlist.wellformed:
+            out = []
+            for part in selectorlist.seq:
+                if isinstance(part, cssutils.css.Selector):
+                    out.append(part.selectorText)
+                else:
+                    out.append(part) # should not happen
+            sep = u',%s' % self.prefs.listItemSpacer
+            return sep.join(out)
+        else:
+            return u''
+
+    def do_css_Selector(self, selector):
+        """
+        a single Selector including comments
+
+        an element has syntax (namespaceURI, name) where namespaceURI may be:
+
+        - cssutils._ANYNS => ``*|name``
+        - None => ``name``
+        - u'' => ``|name``
+        - any other value: => ``prefix|name``
+        """
+        if selector.wellformed:
+            out = Out(self)
+
+            DEFAULTURI = selector._namespaces.get('', None)
+            for item in selector.seq:
+                type_, val = item.type, item.value
+                if isinstance(val, tuple):
+                    # namespaceURI|name (element or attribute)
+                    namespaceURI, name = val
+                    if DEFAULTURI == namespaceURI or (not DEFAULTURI and
+                                                      namespaceURI is None):
+                        out.append(name, type_, space=False)
+                    else:
+                        if namespaceURI == cssutils._ANYNS:
+                            prefix = u'*'
+                        else:
+                            try:
+                                prefix = selector._namespaces.prefixForNamespaceURI(
+                                                    namespaceURI)
+                            except IndexError:
+                                prefix = u''
+
+                        out.append(u'%s|%s' % (prefix, name), type_, space=False)
+                else:
+                    out.append(val, type_, space=False, keepS=True)
+
+            return out.value()
+        else:
+            return u''
+
+    def do_css_CSSVariablesDeclaration(self, variables):
+        """Variables of CSSVariableRule."""
+        if len(variables.seq) > 0:
+            out = Out(self)
+
+            lastitem = len(variables.seq) - 1
+            for i, item in enumerate(variables.seq):
+                type_, val = item.type, item.value
+                if u'var' == type_:
+                    name, cssvalue = val
+                    if self.prefs.normalizedVarNames:
+                        name = normalize(name)
+                    out.append(name)
+                    out.append(u':')
+                    out.append(cssvalue.cssText)
+                    if i < lastitem or not self.prefs.omitLastSemicolon:
+                        out.append(u';')
+
+                elif isinstance(val, cssutils.css.CSSComment):
+                    # CSSComment
+                    out.append(val, 'COMMENT')
+                    out.append(self.prefs.lineSeparator)
+                else:
+                    out.append(val.cssText, type_)
+                    out.append(self.prefs.lineSeparator)
+
+            return out.value().strip()
+
+        else:
+            return u''
+
+    def do_css_CSSStyleDeclaration(self, style, separator=None, omit=True):
+        """
+        Style declaration of CSSStyleRule
+        """
+        # TODO: use Out()
+
+        # may be comments only
+        if len(style.seq) > 0:
+            if separator is None:
+                separator = self.prefs.lineSeparator
+
+            if self.prefs.keepAllProperties:
+                # all
+                seq = style.seq
+            else:
+                # only effective ones
+                _effective = style.getProperties()
+                seq = [item for item in style.seq
+                         if (isinstance(item.value, cssutils.css.Property)
+                             and item.value in _effective)
+                         or not isinstance(item.value, cssutils.css.Property)]
+
+            out = []
+            omitLastSemicolon = omit and self.prefs.omitLastSemicolon
+
+            for i, item in enumerate(seq):
+                type_, val = item.type, item.value
+                if isinstance(val, cssutils.css.CSSComment):
+                    # CSSComment
+                    if self.prefs.keepComments:
+                        out.append(val.cssText)
+                        out.append(separator)
+                elif isinstance(val, cssutils.css.Property):
+                    # PropertySimilarNameList
+                    if val.cssText:
+                        out.append(val.cssText)
+                        if not (omitLastSemicolon and i==len(seq)-1):
+                            out.append(u';')
+                        out.append(separator)
+                elif isinstance(val, cssutils.css.CSSUnknownRule):
+                    # @rule
+                    out.append(val.cssText)
+                    out.append(separator)
+                else:
+                    # ?
+                    out.append(val)
+                    out.append(separator)
+
+            if out and out[-1] == separator:
+                del out[-1]
+
+            return u''.join(out)
+
+        else:
+            return u''
+
+    def do_Property(self, property):
+        """
+        Style declaration of CSSStyleRule
+
+        Property has a seqs attribute which contains seq lists for
+        name, a CSSvalue and a seq list for priority
+        """
+        # TODO: use Out()
+
+        out = []
+        if property.seqs[0] and property.wellformed and self._valid(property):
+            nameseq, value, priorityseq = property.seqs
+
+            #name
+            for part in nameseq:
+                if hasattr(part, 'cssText'):
+                    out.append(part.cssText)
+                elif property.literalname == part:
+                    out.append(self._propertyname(property, part))
+                else:
+                    out.append(part)
+
+            if out and (not property._mediaQuery or
+                        property._mediaQuery and value.cssText):
+                # MediaQuery may consist of name only
+                out.append(u':')
+                out.append(self.prefs.propertyNameSpacer)
+
+            # value
+            out.append(value.cssText)
+
+            # priority
+            if out and priorityseq:
+                out.append(u' ')
+                for part in priorityseq:
+                    if hasattr(part, 'cssText'): # comments
+                        out.append(part.cssText)
+                    else:
+                        if part == property.literalpriority and\
+                           self.prefs.defaultPropertyPriority:
+                            out.append(property.priority)
+                        else:
+                            out.append(part)
+
+        return u''.join(out)
+
+    def do_Property_priority(self, priorityseq):
+        """
+        a Properties priority "!" S* "important"
+        """
+        # TODO: use Out()
+        out = []
+        for part in priorityseq:
+            if hasattr(part, 'cssText'): # comments
+                out.append(u' ')
+                out.append(part.cssText)
+                out.append(u' ')
+            else:
+                out.append(part)
+        return u''.join(out).strip()
+
+    def do_css_PropertyValue(self, value, valuesOnly=False):
+        """Serializes a PropertyValue"""
+        if not value:
+            return u''
+        else:
+            out = Out(self)
+            for item in value.seq:
+                type_, val = item.type, item.value
+                if valuesOnly and type_ == cssutils.css.CSSComment:
+                    continue
+                elif hasattr(val, 'cssText'):
+                    # RGBColor or CSSValue if a CSSValueList
+                    out.append(val.cssText, type_)
+                else:
+                    if val and val[0] == val[-1] and val[0] in '\'"':
+                        val = helper.string(val[1:-1])
+                    # S must be kept! in between values but no extra space
+                    out.append(val, type_)
+
+            return out.value()
+
+    def _strip_zeros(self, s):
+        i = s.index(u'.') + 2
+        a, b = s[0:i], s[i:len(s)]
+        b = b.rstrip('0')
+        return a + b
+
+    def do_css_Value(self, value, valuesOnly=None):
+        """Serializes a Value, valuesOnly is ignored"""
+        if not value:
+            return u''
+        else:
+            out = Out(self)
+            if value.type in (u'DIMENSION', u'NUMBER', u'PERCENTAGE'):
+                dim = value.dimension or u''
+                if value.value == 0:
+                    val = u'0'
+                    if value.dimension in ('cm', 'mm', 'in', 'px', 'pc', 'pt',
+                                           'em', 'ex'):
+                        dim = u''
+                elif value.value == int(value.value):
+                    # cut off after . which is zero anyway
+                    val = unicode(int(value.value))
+                elif self.prefs.omitLeadingZero and -1 < value.value < 1:
+                    v = self._strip_zeros(u'%f' % value.value) # issue #27
+                    val = v
+                    if value._sign == u'-':
+                        val = v[0] + v[2:]
+                    else:
+                        val = v[1:]
+                else:
+
+                    val = self._strip_zeros(u'%f' % value.value) # issue #27
+
+                # keep '+' if given
+                if value.value != 0 and value._sign == u'+':
+                    sign = u'+'
+                else:
+                    sign = u''
+
+                out.append(sign + val + dim, value.type)
+
+            else:
+                # e.g. URI
+                out.append(value.value, value.type)
+
+        return out.value()
+
+    def do_css_ColorValue(self, value, valuesOnly=False):
+        """Serialize a ColorValue, a HASH simple value or FUNCTION"""
+        try:
+            return {'FUNCTION': self.do_css_CSSFunction,
+                    'HASH': self.do_css_Value,
+                    'IDENT': self.do_css_Value
+                    }[value.colorType](value,
+                                       valuesOnly=valuesOnly)
+        except KeyError, e:
+            return u''
+
+    def do_css_CSSFunction(self, cssvalue, valuesOnly=False):
+        """Serialize a CSS function value"""
+        if not cssvalue:
+            return u''
+        else:
+            out = Out(self)
+            for item in cssvalue.seq:
+                type_, val = item.type, item.value
+                if valuesOnly and type_ == cssutils.css.CSSComment:
+                    continue
+                out.append(val, type_)
+            return out.value()
+
+    def do_css_CSSCalc(self, cssvalue, valuesOnly=False):
+        """Serialize a CSS calc value"""
+        if not cssvalue:
+            return u''
+        else:
+            out = Out(self)
+            for item in cssvalue.seq:
+                type_, val = item.type, item.value
+
+                if valuesOnly and type_ == cssutils.css.CSSComment:
+                    continue
+                elif hasattr(val, 'cssText'):
+                    # RGBColor or CSSValue if a CSSValueList
+                    out.append(val.cssText, type_)
+                elif type_ == 'CHAR' and val in u'-+*/':
+                    out.append(val, type_, alwaysS=True)
+                else:
+                    out.append(val, type_)
+
+            return out.value()
+
+    def do_css_MSValue(self, cssvalue, valuesOnly=False):
+        """Serialize an ExpressionValue (IE only),
+        should at least keep the original syntax"""
+        if not cssvalue:
+            return u''
+        else:
+            out = Out(self)
+            for item in cssvalue.seq:
+                type_, val = item.type, item.value
+                #val = self._possiblezero(cssvalue, type_, val)
+                # do no send type_ so no special cases!
+                out.append(val, None, space=False)
+
+            return out.value()
+
+    def do_css_CSSVariable(self, variable, IGNORED=False):
+        """Serializes a CSSVariable"""
+        if not variable or not variable.name:
+            return u''
+        else:
+            out = Out(self)
+            v = variable.value
+            if self.prefs.resolveVariables and v:
+                # resolve variable
+                out.append(v)
+
+            else:
+                # keep var(NAME)
+                out.append(u'var(', 'FUNCTION')
+                out.append(variable.name, 'IDENT')
+                if variable.fallback:
+                    out.append(u',', 'COMMA')
+                    out.append(variable.fallback.cssText)
+                out.append(u')')
+
+            return out.value()
+
+
+    def do_stylesheets_medialist(self, medialist):
+        """
+        comma-separated list of media, default is 'all'
+
+        If "all" is in the list, every other media *except* "handheld" will
+        be stripped. This is because how Opera handles CSS for PDAs.
+        """
+        if len(medialist) == 0:
+            return u'all'
+        else:
+            seq = medialist.seq
+            out = Out(self)
+            firstdone = False
+
+            for item in seq:
+                type_, val = item.type, item.value
+
+                if type_ == 'MediaQuery':
+                    if firstdone:
+                        out.append(u',', 'CHAR')
+                    else:
+                        firstdone = True
+                
+                out.append(item.value, item.type)
+
+            return out.value()
+
+    def do_stylesheets_mediaquery(self, mediaquery):
+        """
+        a single media used in medialist
+        """
+        if not mediaquery.wellformed:
+            return u''
+        else:
+            withsemi = []
+            nextmq = False
+            for item in mediaquery.seq:
+                type_, val = item.type, item.value
+
+                if type_ == 'MediaQuery' and nextmq:
+                    withsemi.append(('CHAR', u','))
+                    nextmq = False
+                else:
+                    nextmq = True
+
+                withsemi.append((type_, val))
+
+            out = Out(self)
+            for t, v, in withsemi:
+                out.append(v, t)
+            #for item in mediaquery.seq:
+            #    type_, val = item.type, item.value
+            #    out.append(val, type_)#, space=False)
+
+            return out.value()
+
+        #if mediaquery.wellformed:
+        #    out = []
+        #    for part in mediaquery.seq:
+        #        if isinstance(part, cssutils.css.Property): # Property
+        #            out.append(u'(%s)' % part.cssText)
+        #        elif hasattr(part, 'cssText'): # comments
+        #            out.append(part.cssText)
+        #        else:
+        #            # TODO: media queries!
+        #            out.append(part)
+        #    return u' '.join(out)
+        #else:
+        #    return u''
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/errorhandler.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/errorhandler.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/errorhandler.py	(revision 1126)
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+"""cssutils ErrorHandler
+
+ErrorHandler
+    used as log with usual levels (debug, info, warn, error)
+
+    if instanciated with ``raiseExceptions=True`` raises exeptions instead
+    of logging
+
+log
+    defaults to instance of ErrorHandler for any kind of log message from
+    lexerm, parser etc.
+
+    - raiseExceptions = [False, True]
+    - setloglevel(loglevel)
+"""
+__all__ = ['ErrorHandler']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id$'
+
+import logging
+import urllib2
+import xml.dom
+
+class _ErrorHandler(object):
+    """
+    handles all errors and log messages
+    """
+    def __init__(self, log, defaultloglevel=logging.INFO, 
+                 raiseExceptions=True):
+        """
+        inits log if none given
+
+        log
+            for parse messages, default logs to sys.stderr
+        defaultloglevel
+            if none give this is logging.DEBUG
+        raiseExceptions
+            - True: Errors will be raised e.g. during building
+            - False: Errors will be written to the log, this is the
+              default behaviour when parsing
+        """
+        # may be disabled during setting of known valid items
+        self.enabled = True
+        
+        if log:
+            self._log = log
+        else:
+            import sys
+            self._log = logging.getLogger('CSSUTILS')
+            hdlr = logging.StreamHandler(sys.stderr)
+            formatter = logging.Formatter('%(levelname)s\t%(message)s')
+            hdlr.setFormatter(formatter)
+            self._log.addHandler(hdlr)
+            self._log.setLevel(defaultloglevel)
+            
+        self.raiseExceptions = raiseExceptions
+
+    def __getattr__(self, name):
+        "use self._log items"
+        calls = ('debug', 'info', 'warn', 'error', 'critical', 'fatal')
+        other = ('setLevel', 'getEffectiveLevel', 'addHandler', 'removeHandler')
+
+        if name in calls:
+            self._logcall = getattr(self._log, name)
+            return self.__handle
+        elif name in other:
+            return getattr(self._log, name)
+        else:
+            raise AttributeError(
+                '(errorhandler) No Attribute %r found' % name)
+
+    def __handle(self, msg=u'', token=None, error=xml.dom.SyntaxErr,
+                 neverraise=False, args=None):
+        """
+        handles all calls
+        logs or raises exception
+        """
+        if self.enabled:
+            if error is None:
+                error = xml.dom.SyntaxErr
+            
+            line, col = None, None
+            if token:
+                if isinstance(token, tuple):
+                    value, line, col = token[1], token[2], token[3]
+                else:
+                    value, line, col = token.value, token.line, token.col
+                msg = u'%s [%s:%s: %s]' % (
+                    msg, line, col, value)
+    
+            if error and self.raiseExceptions and not neverraise:
+                if isinstance(error, urllib2.HTTPError) or isinstance(error, urllib2.URLError):
+                    raise
+                elif issubclass(error, xml.dom.DOMException): 
+                    error.line = line
+                    error.col = col
+                raise error(msg)
+            else:
+                self._logcall(msg)
+
+    def setLog(self, log):
+        """set log of errorhandler's log"""
+        self._log = log
+
+
+class ErrorHandler(_ErrorHandler):
+    "Singleton, see _ErrorHandler"
+    instance = None
+
+    def __init__(self,
+            log=None, defaultloglevel=logging.INFO, raiseExceptions=True):
+
+        if ErrorHandler.instance is None:
+            ErrorHandler.instance = _ErrorHandler(log=log,
+                                        defaultloglevel=defaultloglevel,
+                                        raiseExceptions=raiseExceptions)
+        self.__dict__ = ErrorHandler.instance.__dict__
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_fetch.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_fetch.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/cssutils/_fetch.py	(revision 1126)
@@ -0,0 +1,47 @@
+"""Default URL reading functions"""
+__all__ = ['_defaultFetcher']
+__docformat__ = 'restructuredtext'
+__version__ = '$Id: tokenize2.py 1547 2008-12-10 20:42:26Z cthedot $'
+
+import cssutils
+from cssutils import VERSION
+import encutils
+import errorhandler
+import urllib2
+
+log = errorhandler.ErrorHandler()
+
+def _defaultFetcher(url):
+    """Retrieve data from ``url``. cssutils default implementation of fetch
+    URL function.
+
+    Returns ``(encoding, string)`` or ``None``
+    """
+    try:
+        request = urllib2.Request(url)
+        request.add_header('User-agent',
+                           'cssutils %s (http://www.cthedot.de/cssutils/)' % VERSION)
+        res = urllib2.urlopen(request)
+    except urllib2.HTTPError, e:
+        # http error, e.g. 404, e can be raised
+        log.warn(u'HTTPError opening url=%s: %s %s' %
+                          (url, e.code, e.msg), error=e)
+    except urllib2.URLError, e:
+        # URLError like mailto: or other IO errors, e can be raised
+        log.warn(u'URLError, %s' % e.reason, error=e)
+    except OSError, e:
+        # e.g if file URL and not found
+        log.warn(e, error=OSError)
+    except ValueError, e:
+        # invalid url, e.g. "1"
+        log.warn(u'ValueError, %s' % e.args[0], error=ValueError)
+    else:
+        if res:
+            mimeType, encoding = encutils.getHTTPInfo(res)
+            if mimeType != u'text/css':
+                log.error(u'Expected "text/css" mime type for url=%r but found: %r' %
+                                  (url, mimeType), error=ValueError)
+            content = res.read()
+            if hasattr(res, 'close'):
+                res.close()
+            return encoding, content
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/xmltodic.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/xmltodic.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/xmltodic.py	(revision 1126)
@@ -0,0 +1,437 @@
+
+"Makes working with XML feel like you are working with JSON"
+
+try:
+    import defusedexpat as expat
+except ImportError:
+    from xml.parsers import expat
+from xml.sax.saxutils import XMLGenerator
+from xml.sax.xmlreader import AttributesImpl
+try:  # pragma no cover
+    from cStringIO import StringIO
+except ImportError:  # pragma no cover
+    try:
+        from StringIO import StringIO
+    except ImportError:
+        from io import StringIO
+try:  # pragma no cover
+    from collections import OrderedDict
+except ImportError:  # pragma no cover
+    try:
+        from ordereddict import OrderedDict
+    except ImportError:
+        OrderedDict = dict
+
+try:  # pragma no cover
+    _basestring = basestring
+except NameError:  # pragma no cover
+    _basestring = str
+try:  # pragma no cover
+    _unicode = unicode
+except NameError:  # pragma no cover
+    _unicode = str
+
+__author__ = 'Martin Blech'
+__version__ = '0.10.1'
+__license__ = 'MIT'
+
+
+class ParsingInterrupted(Exception):
+    pass
+
+
+class _DictSAXHandler(object):
+    def __init__(self,
+                 item_depth=0,
+                 item_callback=lambda *args: True,
+                 xml_attribs=True,
+                 attr_prefix='@',
+                 cdata_key='#text',
+                 force_cdata=False,
+                 cdata_separator='',
+                 postprocessor=None,
+                 dict_constructor=OrderedDict,
+                 strip_whitespace=True,
+                 namespace_separator=':',
+                 namespaces=None,
+                 force_list=None):
+        self.path = []
+        self.stack = []
+        self.data = []
+        self.item = None
+        self.item_depth = item_depth
+        self.xml_attribs = xml_attribs
+        self.item_callback = item_callback
+        self.attr_prefix = attr_prefix
+        self.cdata_key = cdata_key
+        self.force_cdata = force_cdata
+        self.cdata_separator = cdata_separator
+        self.postprocessor = postprocessor
+        self.dict_constructor = dict_constructor
+        self.strip_whitespace = strip_whitespace
+        self.namespace_separator = namespace_separator
+        self.namespaces = namespaces
+        self.force_list = force_list
+
+    def _build_name(self, full_name):
+        if not self.namespaces:
+            return full_name
+        i = full_name.rfind(self.namespace_separator)
+        if i == -1:
+            return full_name
+        namespace, name = full_name[:i], full_name[i+1:]
+        short_namespace = self.namespaces.get(namespace, namespace)
+        if not short_namespace:
+            return name
+        else:
+            return self.namespace_separator.join((short_namespace, name))
+
+    def _attrs_to_dict(self, attrs):
+        if isinstance(attrs, dict):
+            return attrs
+        return self.dict_constructor(zip(attrs[0::2], attrs[1::2]))
+
+    def startElement(self, full_name, attrs):
+        name = self._build_name(full_name)
+        attrs = self._attrs_to_dict(attrs)
+        self.path.append((name, attrs or None))
+        if len(self.path) > self.item_depth:
+            self.stack.append((self.item, self.data))
+            if self.xml_attribs:
+                attr_entries = []
+                for key, value in attrs.items():
+                    key = self.attr_prefix+self._build_name(key)
+                    if self.postprocessor:
+                        entry = self.postprocessor(self.path, key, value)
+                    else:
+                        entry = (key, value)
+                    if entry:
+                        attr_entries.append(entry)
+                attrs = self.dict_constructor(attr_entries)
+            else:
+                attrs = None
+            self.item = attrs or None
+            self.data = []
+
+    def endElement(self, full_name):
+        name = self._build_name(full_name)
+        if len(self.path) == self.item_depth:
+            item = self.item
+            if item is None:
+                item = (None if not self.data
+                        else self.cdata_separator.join(self.data))
+
+            should_continue = self.item_callback(self.path, item)
+            if not should_continue:
+                raise ParsingInterrupted()
+        if len(self.stack):
+            data = (None if not self.data
+                    else self.cdata_separator.join(self.data))
+            item = self.item
+            self.item, self.data = self.stack.pop()
+            if self.strip_whitespace and data:
+                data = data.strip() or None
+            if data and self.force_cdata and item is None:
+                item = self.dict_constructor()
+            if item is not None:
+                if data:
+                    self.push_data(item, self.cdata_key, data)
+                self.item = self.push_data(self.item, name, item)
+            else:
+                self.item = self.push_data(self.item, name, data)
+        else:
+            self.item = None
+            self.data = []
+        self.path.pop()
+
+    def characters(self, data):
+        if not self.data:
+            self.data = [data]
+        else:
+            self.data.append(data)
+
+    def push_data(self, item, key, data):
+        if self.postprocessor is not None:
+            result = self.postprocessor(self.path, key, data)
+            if result is None:
+                return item
+            key, data = result
+        if item is None:
+            item = self.dict_constructor()
+        try:
+            value = item[key]
+            if isinstance(value, list):
+                value.append(data)
+            else:
+                item[key] = [value, data]
+        except KeyError:
+            if self._should_force_list(key, data):
+                item[key] = [data]
+            else:
+                item[key] = data
+        return item
+
+    def _should_force_list(self, key, value):
+        if not self.force_list:
+            return False
+        try:
+            return key in self.force_list
+        except TypeError:
+            return self.force_list(self.path[:-1], key, value)
+
+
+def parse(xml_input, encoding=None, expat=expat, process_namespaces=False,
+          namespace_separator=':', **kwargs):
+    """Parse the given XML input and convert it into a dictionary.
+
+    `xml_input` can either be a `string` or a file-like object.
+
+    If `xml_attribs` is `True`, element attributes are put in the dictionary
+    among regular child elements, using `@` as a prefix to avoid collisions. If
+    set to `False`, they are just ignored.
+
+    Simple example::
+
+        >>> import xmltodict
+        >>> doc = xmltodict.parse(\"\"\"
+        ... <a prop="x">
+        ...   <b>1</b>
+        ...   <b>2</b>
+        ... </a>
+        ... \"\"\")
+        >>> doc['a']['@prop']
+        u'x'
+        >>> doc['a']['b']
+        [u'1', u'2']
+
+    If `item_depth` is `0`, the function returns a dictionary for the root
+    element (default behavior). Otherwise, it calls `item_callback` every time
+    an item at the specified depth is found and returns `None` in the end
+    (streaming mode).
+
+    The callback function receives two parameters: the `path` from the document
+    root to the item (name-attribs pairs), and the `item` (dict). If the
+    callback's return value is false-ish, parsing will be stopped with the
+    :class:`ParsingInterrupted` exception.
+
+    Streaming example::
+
+        >>> def handle(path, item):
+        ...     print 'path:%s item:%s' % (path, item)
+        ...     return True
+        ...
+        >>> xmltodict.parse(\"\"\"
+        ... <a prop="x">
+        ...   <b>1</b>
+        ...   <b>2</b>
+        ... </a>\"\"\", item_depth=2, item_callback=handle)
+        path:[(u'a', {u'prop': u'x'}), (u'b', None)] item:1
+        path:[(u'a', {u'prop': u'x'}), (u'b', None)] item:2
+
+    The optional argument `postprocessor` is a function that takes `path`,
+    `key` and `value` as positional arguments and returns a new `(key, value)`
+    pair where both `key` and `value` may have changed. Usage example::
+
+        >>> def postprocessor(path, key, value):
+        ...     try:
+        ...         return key + ':int', int(value)
+        ...     except (ValueError, TypeError):
+        ...         return key, value
+        >>> xmltodict.parse('<a><b>1</b><b>2</b><b>x</b></a>',
+        ...                 postprocessor=postprocessor)
+        OrderedDict([(u'a', OrderedDict([(u'b:int', [1, 2]), (u'b', u'x')]))])
+
+    You can pass an alternate version of `expat` (such as `defusedexpat`) by
+    using the `expat` parameter. E.g:
+
+        >>> import defusedexpat
+        >>> xmltodict.parse('<a>hello</a>', expat=defusedexpat.pyexpat)
+        OrderedDict([(u'a', u'hello')])
+
+    You can use the force_list argument to force lists to be created even
+    when there is only a single child of a given level of hierarchy. The
+    force_list argument is a tuple of keys. If the key for a given level
+    of hierarchy is in the force_list argument, that level of hierarchy
+    will have a list as a child (even if there is only one sub-element).
+    The index_keys operation takes precendence over this. This is applied
+    after any user-supplied postprocessor has already run.
+
+        For example, given this input:
+        <servers>
+          <server>
+            <name>host1</name>
+            <os>Linux</os>
+            <interfaces>
+              <interface>
+                <name>em0</name>
+                <ip_address>10.0.0.1</ip_address>
+              </interface>
+            </interfaces>
+          </server>
+        </servers>
+
+        If called with force_list=('interface',), it will produce
+        this dictionary:
+        {'servers':
+          {'server':
+            {'name': 'host1',
+             'os': 'Linux'},
+             'interfaces':
+              {'interface':
+                [ {'name': 'em0', 'ip_address': '10.0.0.1' } ] } } }
+
+        `force_list` can also be a callable that receives `path`, `key` and
+        `value`. This is helpful in cases where the logic that decides whether
+        a list should be forced is more complex.
+    """
+    handler = _DictSAXHandler(namespace_separator=namespace_separator,
+                              **kwargs)
+    if isinstance(xml_input, _unicode):
+        if not encoding:
+            encoding = 'utf-8'
+        xml_input = xml_input.encode(encoding)
+    if not process_namespaces:
+        namespace_separator = None
+    parser = expat.ParserCreate(
+        encoding,
+        namespace_separator
+    )
+    try:
+        parser.ordered_attributes = True
+    except AttributeError:
+        # Jython's expat does not support ordered_attributes
+        pass
+    parser.StartElementHandler = handler.startElement
+    parser.EndElementHandler = handler.endElement
+    parser.CharacterDataHandler = handler.characters
+    parser.buffer_text = True
+    try:
+        parser.ParseFile(xml_input)
+    except (TypeError, AttributeError):
+        parser.Parse(xml_input, True)
+    return handler.item
+
+
+def _emit(key, value, content_handler,
+          attr_prefix='@',
+          cdata_key='#text',
+          depth=0,
+          preprocessor=None,
+          pretty=False,
+          newl='\n',
+          indent='\t',
+          full_document=True):
+    if preprocessor is not None:
+        result = preprocessor(key, value)
+        if result is None:
+            return
+        key, value = result
+    if (not hasattr(value, '__iter__')
+            or isinstance(value, _basestring)
+            or isinstance(value, dict)):
+        value = [value]
+    for index, v in enumerate(value):
+        if full_document and depth == 0 and index > 0:
+            raise ValueError('document with multiple roots')
+        if v is None:
+            v = OrderedDict()
+        elif not isinstance(v, dict):
+            v = _unicode(v)
+        if isinstance(v, _basestring):
+            v = OrderedDict(((cdata_key, v),))
+        cdata = None
+        attrs = OrderedDict()
+        children = []
+        for ik, iv in v.items():
+            if ik == cdata_key:
+                cdata = iv
+                continue
+            if ik.startswith(attr_prefix):
+                if not isinstance(iv, _unicode):
+                    iv = _unicode(iv)
+                attrs[ik[len(attr_prefix):]] = iv
+                continue
+            children.append((ik, iv))
+        if pretty:
+            content_handler.ignorableWhitespace(depth * indent)
+        content_handler.startElement(key, AttributesImpl(attrs))
+        if pretty and children:
+            content_handler.ignorableWhitespace(newl)
+        for child_key, child_value in children:
+            _emit(child_key, child_value, content_handler,
+                  attr_prefix, cdata_key, depth+1, preprocessor,
+                  pretty, newl, indent)
+        if cdata is not None:
+            content_handler.characters(cdata)
+        if pretty and children:
+            content_handler.ignorableWhitespace(depth * indent)
+        content_handler.endElement(key)
+        if pretty and depth:
+            content_handler.ignorableWhitespace(newl)
+
+
+def unparse(input_dict, output=None, encoding='utf-8', full_document=True,
+            **kwargs):
+    """Emit an XML document for the given `input_dict` (reverse of `parse`).
+
+    The resulting XML document is returned as a string, but if `output` (a
+    file-like object) is specified, it is written there instead.
+
+    Dictionary keys prefixed with `attr_prefix` (default=`'@'`) are interpreted
+    as XML node attributes, whereas keys equal to `cdata_key`
+    (default=`'#text'`) are treated as character data.
+
+    The `pretty` parameter (default=`False`) enables pretty-printing. In this
+    mode, lines are terminated with `'\n'` and indented with `'\t'`, but this
+    can be customized with the `newl` and `indent` parameters.
+
+    """
+    if full_document and len(input_dict) != 1:
+        raise ValueError('Document must have exactly one root.')
+    must_return = False
+    if output is None:
+        output = StringIO()
+        must_return = True
+    content_handler = XMLGenerator(output, encoding)
+    if full_document:
+        content_handler.startDocument()
+    for key, value in input_dict.items():
+        _emit(key, value, content_handler, full_document=full_document,
+              **kwargs)
+    if full_document:
+        content_handler.endDocument()
+    if must_return:
+        value = output.getvalue()
+        try:  # pragma no cover
+            value = value.decode(encoding)
+        except AttributeError:  # pragma no cover
+            pass
+        return value
+
+if __name__ == '__main__':  # pragma: no cover
+    import sys
+    import marshal
+    try:
+        stdin = sys.stdin.buffer
+        stdout = sys.stdout.buffer
+    except AttributeError:
+        stdin = sys.stdin
+        stdout = sys.stdout
+
+    (item_depth,) = sys.argv[1:]
+    item_depth = int(item_depth)
+
+
+    def handle_item(path, item):
+        marshal.dump((path, item), stdout)
+        return True
+
+    try:
+        root = parse(stdin,
+                     item_depth=item_depth,
+                     item_callback=handle_item,
+                     dict_constructor=dict)
+        if item_depth == 0:
+            handle_item([], root)
+    except KeyboardInterrupt:
+        pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/certs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/certs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/certs.py	(revision 1126)
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+certs.py
+~~~~~~~~
+
+This module returns the preferred default CA certificate bundle.
+
+If you are packaging Requests, e.g., for a Linux distribution or a managed
+environment, you can change the definition of where() to return a separately
+packaged CA bundle.
+"""
+import os.path
+
+try:
+    from certifi import where
+except ImportError:
+    def where():
+        """Return the preferred certificate bundle."""
+        # vendored bundle inside Requests
+        return os.path.join(os.path.dirname(__file__), 'cacert.pem')
+
+if __name__ == '__main__':
+    print(where())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/exceptions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/exceptions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/exceptions.py	(revision 1126)
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.exceptions
+~~~~~~~~~~~~~~~~~~~
+
+This module contains the set of Requests' exceptions.
+
+"""
+from .packages.urllib3.exceptions import HTTPError as BaseHTTPError
+
+
+class RequestException(IOError):
+    """There was an ambiguous exception that occurred while handling your
+    request."""
+
+    def __init__(self, *args, **kwargs):
+        """
+        Initialize RequestException with `request` and `response` objects.
+        """
+        response = kwargs.pop('response', None)
+        self.response = response
+        self.request = kwargs.pop('request', None)
+        if (response is not None and not self.request and
+                hasattr(response, 'request')):
+            self.request = self.response.request
+        super(RequestException, self).__init__(*args, **kwargs)
+
+
+class HTTPError(RequestException):
+    """An HTTP error occurred."""
+
+
+class ConnectionError(RequestException):
+    """A Connection error occurred."""
+
+
+class ProxyError(ConnectionError):
+    """A proxy error occurred."""
+
+
+class SSLError(ConnectionError):
+    """An SSL error occurred."""
+
+
+class Timeout(RequestException):
+    """The request timed out.
+
+    Catching this error will catch both
+    :exc:`~requests.exceptions.ConnectTimeout` and
+    :exc:`~requests.exceptions.ReadTimeout` errors.
+    """
+
+
+class ConnectTimeout(ConnectionError, Timeout):
+    """The request timed out while trying to connect to the remote server.
+
+    Requests that produced this error are safe to retry.
+    """
+
+
+class ReadTimeout(Timeout):
+    """The server did not send any data in the allotted amount of time."""
+
+
+class URLRequired(RequestException):
+    """A valid URL is required to make a request."""
+
+
+class TooManyRedirects(RequestException):
+    """Too many redirects."""
+
+
+class MissingSchema(RequestException, ValueError):
+    """The URL schema (e.g. http or https) is missing."""
+
+
+class InvalidSchema(RequestException, ValueError):
+    """See defaults.py for valid schemas."""
+
+
+class InvalidURL(RequestException, ValueError):
+    """ The URL provided was somehow invalid. """
+
+
+class ChunkedEncodingError(RequestException):
+    """The server declared chunked encoding but sent an invalid chunk."""
+
+
+class ContentDecodingError(RequestException, BaseHTTPError):
+    """Failed to decode response content"""
+
+
+class StreamConsumedError(RequestException, TypeError):
+    """The content for this response was already consumed"""
+
+
+class RetryError(RequestException):
+    """Custom retries logic failed"""
+
+
+# Warnings
+
+
+class RequestsWarning(Warning):
+    """Base warning for Requests."""
+    pass
+
+
+class FileModeWarning(RequestsWarning, DeprecationWarning):
+    """
+    A file was opened in text mode, but Requests determined its binary length.
+    """
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/compat.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/compat.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/compat.py	(revision 1126)
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+
+"""
+pythoncompat
+"""
+
+from .packages import chardet
+
+import sys
+
+# -------
+# Pythons
+# -------
+
+# Syntax sugar.
+_ver = sys.version_info
+
+#: Python 2.x?
+is_py2 = (_ver[0] == 2)
+
+#: Python 3.x?
+is_py3 = (_ver[0] == 3)
+
+try:
+    import simplejson as json
+except (ImportError, SyntaxError):
+    # simplejson does not support Python 3.2, it throws a SyntaxError
+    # because of u'...' Unicode literals.
+    import json
+
+# ---------
+# Specifics
+# ---------
+
+if is_py2:
+    from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass
+    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag
+    from urllib2 import parse_http_list
+    import cookielib
+    from Cookie import Morsel
+    from StringIO import StringIO
+    from .packages.urllib3.packages.ordered_dict import OrderedDict
+
+    builtin_str = str
+    bytes = str
+    str = unicode
+    basestring = basestring
+    numeric_types = (int, long, float)
+
+elif is_py3:
+    from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag
+    from urllib.request import parse_http_list, getproxies, proxy_bypass
+    from http import cookiejar as cookielib
+    from http.cookies import Morsel
+    from io import StringIO
+    from collections import OrderedDict
+
+    builtin_str = str
+    str = str
+    bytes = bytes
+    basestring = (str, bytes)
+    numeric_types = (int, float)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/hooks.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/hooks.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/hooks.py	(revision 1126)
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.hooks
+~~~~~~~~~~~~~~
+
+This module provides the capabilities for the Requests hooks system.
+
+Available hooks:
+
+``response``:
+    The response generated from a Request.
+
+"""
+HOOKS = ['response']
+
+def default_hooks():
+    return dict((event, []) for event in HOOKS)
+
+# TODO: response is the only one
+
+
+def dispatch_hook(key, hooks, hook_data, **kwargs):
+    """Dispatches a hook dictionary on a given piece of data."""
+    hooks = hooks or dict()
+    hooks = hooks.get(key)
+    if hooks:
+        if hasattr(hooks, '__call__'):
+            hooks = [hooks]
+        for hook in hooks:
+            _hook_data = hook(hook_data, **kwargs)
+            if _hook_data is not None:
+                hook_data = _hook_data
+    return hook_data
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/models.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/models.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/models.py	(revision 1126)
@@ -0,0 +1,851 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.models
+~~~~~~~~~~~~~~~
+
+This module contains the primary objects that power Requests.
+"""
+
+import collections
+import datetime
+
+from io import BytesIO, UnsupportedOperation
+from .hooks import default_hooks
+from .structures import CaseInsensitiveDict
+
+from .auth import HTTPBasicAuth
+from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar
+from .packages.urllib3.fields import RequestField
+from .packages.urllib3.filepost import encode_multipart_formdata
+from .packages.urllib3.util import parse_url
+from .packages.urllib3.exceptions import (
+    DecodeError, ReadTimeoutError, ProtocolError, LocationParseError)
+from .exceptions import (
+    HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError,
+    ContentDecodingError, ConnectionError, StreamConsumedError)
+from .utils import (
+    guess_filename, get_auth_from_url, requote_uri,
+    stream_decode_response_unicode, to_key_val_list, parse_header_links,
+    iter_slices, guess_json_utf, super_len, to_native_string)
+from .compat import (
+    cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO,
+    is_py2, chardet, builtin_str, basestring)
+from .compat import json as complexjson
+from .status_codes import codes
+
+#: The set of HTTP status codes that indicate an automatically
+#: processable redirect.
+REDIRECT_STATI = (
+    codes.moved,              # 301
+    codes.found,              # 302
+    codes.other,              # 303
+    codes.temporary_redirect, # 307
+    codes.permanent_redirect, # 308
+)
+
+DEFAULT_REDIRECT_LIMIT = 30
+CONTENT_CHUNK_SIZE = 10 * 1024
+ITER_CHUNK_SIZE = 512
+
+
+class RequestEncodingMixin(object):
+    @property
+    def path_url(self):
+        """Build the path URL to use."""
+
+        url = []
+
+        p = urlsplit(self.url)
+
+        path = p.path
+        if not path:
+            path = '/'
+
+        url.append(path)
+
+        query = p.query
+        if query:
+            url.append('?')
+            url.append(query)
+
+        return ''.join(url)
+
+    @staticmethod
+    def _encode_params(data):
+        """Encode parameters in a piece of data.
+
+        Will successfully encode parameters when passed as a dict or a list of
+        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
+        if parameters are supplied as a dict.
+        """
+
+        if isinstance(data, (str, bytes)):
+            return data
+        elif hasattr(data, 'read'):
+            return data
+        elif hasattr(data, '__iter__'):
+            result = []
+            for k, vs in to_key_val_list(data):
+                if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
+                    vs = [vs]
+                for v in vs:
+                    if v is not None:
+                        result.append(
+                            (k.encode('utf-8') if isinstance(k, str) else k,
+                             v.encode('utf-8') if isinstance(v, str) else v))
+            return urlencode(result, doseq=True)
+        else:
+            return data
+
+    @staticmethod
+    def _encode_files(files, data):
+        """Build the body for a multipart/form-data request.
+
+        Will successfully encode files when passed as a dict or a list of
+        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
+        if parameters are supplied as a dict.
+
+        """
+        if (not files):
+            raise ValueError("Files must be provided.")
+        elif isinstance(data, basestring):
+            raise ValueError("Data must not be a string.")
+
+        new_fields = []
+        fields = to_key_val_list(data or {})
+        files = to_key_val_list(files or {})
+
+        for field, val in fields:
+            if isinstance(val, basestring) or not hasattr(val, '__iter__'):
+                val = [val]
+            for v in val:
+                if v is not None:
+                    # Don't call str() on bytestrings: in Py3 it all goes wrong.
+                    if not isinstance(v, bytes):
+                        v = str(v)
+
+                    new_fields.append(
+                        (field.decode('utf-8') if isinstance(field, bytes) else field,
+                         v.encode('utf-8') if isinstance(v, str) else v))
+
+        for (k, v) in files:
+            # support for explicit filename
+            ft = None
+            fh = None
+            if isinstance(v, (tuple, list)):
+                if len(v) == 2:
+                    fn, fp = v
+                elif len(v) == 3:
+                    fn, fp, ft = v
+                else:
+                    fn, fp, ft, fh = v
+            else:
+                fn = guess_filename(v) or k
+                fp = v
+
+            if isinstance(fp, (str, bytes, bytearray)):
+                fdata = fp
+            else:
+                fdata = fp.read()
+
+            rf = RequestField(name=k, data=fdata, filename=fn, headers=fh)
+            rf.make_multipart(content_type=ft)
+            new_fields.append(rf)
+
+        body, content_type = encode_multipart_formdata(new_fields)
+
+        return body, content_type
+
+
+class RequestHooksMixin(object):
+    def register_hook(self, event, hook):
+        """Properly register a hook."""
+
+        if event not in self.hooks:
+            raise ValueError('Unsupported event specified, with event name "%s"' % (event))
+
+        if isinstance(hook, collections.Callable):
+            self.hooks[event].append(hook)
+        elif hasattr(hook, '__iter__'):
+            self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable))
+
+    def deregister_hook(self, event, hook):
+        """Deregister a previously registered hook.
+        Returns True if the hook existed, False if not.
+        """
+
+        try:
+            self.hooks[event].remove(hook)
+            return True
+        except ValueError:
+            return False
+
+
+class Request(RequestHooksMixin):
+    """A user-created :class:`Request <Request>` object.
+
+    Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server.
+
+    :param method: HTTP method to use.
+    :param url: URL to send.
+    :param headers: dictionary of headers to send.
+    :param files: dictionary of {filename: fileobject} files to multipart upload.
+    :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place.
+    :param json: json for the body to attach to the request (if files or data is not specified).
+    :param params: dictionary of URL parameters to append to the URL.
+    :param auth: Auth handler or (user, pass) tuple.
+    :param cookies: dictionary or CookieJar of cookies to attach to this request.
+    :param hooks: dictionary of callback hooks, for internal usage.
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.Request('GET', 'http://httpbin.org/get')
+      >>> req.prepare()
+      <PreparedRequest [GET]>
+
+    """
+    def __init__(self, method=None, url=None, headers=None, files=None,
+        data=None, params=None, auth=None, cookies=None, hooks=None, json=None):
+
+        # Default empty dicts for dict params.
+        data = [] if data is None else data
+        files = [] if files is None else files
+        headers = {} if headers is None else headers
+        params = {} if params is None else params
+        hooks = {} if hooks is None else hooks
+
+        self.hooks = default_hooks()
+        for (k, v) in list(hooks.items()):
+            self.register_hook(event=k, hook=v)
+
+        self.method = method
+        self.url = url
+        self.headers = headers
+        self.files = files
+        self.data = data
+        self.json = json
+        self.params = params
+        self.auth = auth
+        self.cookies = cookies
+
+    def __repr__(self):
+        return '<Request [%s]>' % (self.method)
+
+    def prepare(self):
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it."""
+        p = PreparedRequest()
+        p.prepare(
+            method=self.method,
+            url=self.url,
+            headers=self.headers,
+            files=self.files,
+            data=self.data,
+            json=self.json,
+            params=self.params,
+            auth=self.auth,
+            cookies=self.cookies,
+            hooks=self.hooks,
+        )
+        return p
+
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+    """The fully mutable :class:`PreparedRequest <PreparedRequest>` object,
+    containing the exact bytes that will be sent to the server.
+
+    Generated from either a :class:`Request <Request>` object or manually.
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.Request('GET', 'http://httpbin.org/get')
+      >>> r = req.prepare()
+      <PreparedRequest [GET]>
+
+      >>> s = requests.Session()
+      >>> s.send(r)
+      <Response [200]>
+
+    """
+
+    def __init__(self):
+        #: HTTP verb to send to the server.
+        self.method = None
+        #: HTTP URL to send the request to.
+        self.url = None
+        #: dictionary of HTTP headers.
+        self.headers = None
+        # The `CookieJar` used to create the Cookie header will be stored here
+        # after prepare_cookies is called
+        self._cookies = None
+        #: request body to send to the server.
+        self.body = None
+        #: dictionary of callback hooks, for internal usage.
+        self.hooks = default_hooks()
+
+    def prepare(self, method=None, url=None, headers=None, files=None,
+        data=None, params=None, auth=None, cookies=None, hooks=None, json=None):
+        """Prepares the entire request with the given parameters."""
+
+        self.prepare_method(method)
+        self.prepare_url(url, params)
+        self.prepare_headers(headers)
+        self.prepare_cookies(cookies)
+        self.prepare_body(data, files, json)
+        self.prepare_auth(auth, url)
+
+        # Note that prepare_auth must be last to enable authentication schemes
+        # such as OAuth to work on a fully prepared request.
+
+        # This MUST go after prepare_auth. Authenticators could add a hook
+        self.prepare_hooks(hooks)
+
+    def __repr__(self):
+        return '<PreparedRequest [%s]>' % (self.method)
+
+    def copy(self):
+        p = PreparedRequest()
+        p.method = self.method
+        p.url = self.url
+        p.headers = self.headers.copy() if self.headers is not None else None
+        p._cookies = _copy_cookie_jar(self._cookies)
+        p.body = self.body
+        p.hooks = self.hooks
+        return p
+
+    def prepare_method(self, method):
+        """Prepares the given HTTP method."""
+        self.method = method
+        if self.method is not None:
+            self.method = to_native_string(self.method.upper())
+
+    def prepare_url(self, url, params):
+        """Prepares the given HTTP URL."""
+        #: Accept objects that have string representations.
+        #: We're unable to blindly call unicode/str functions
+        #: as this will include the bytestring indicator (b'')
+        #: on python 3.x.
+        #: https://github.com/kennethreitz/requests/pull/2238
+        if isinstance(url, bytes):
+            url = url.decode('utf8')
+        else:
+            url = unicode(url) if is_py2 else str(url)
+
+        # Don't do any URL preparation for non-HTTP schemes like `mailto`,
+        # `data` etc to work around exceptions from `url_parse`, which
+        # handles RFC 3986 only.
+        if ':' in url and not url.lower().startswith('http'):
+            self.url = url
+            return
+
+        # Support for unicode domain names and paths.
+        try:
+            scheme, auth, host, port, path, query, fragment = parse_url(url)
+        except LocationParseError as e:
+            raise InvalidURL(*e.args)
+
+        if not scheme:
+            error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?")
+            error = error.format(to_native_string(url, 'utf8'))
+
+            raise MissingSchema(error)
+
+        if not host:
+            raise InvalidURL("Invalid URL %r: No host supplied" % url)
+
+        # Only want to apply IDNA to the hostname
+        try:
+            host = host.encode('idna').decode('utf-8')
+        except UnicodeError:
+            raise InvalidURL('URL has an invalid label.')
+
+        # Carefully reconstruct the network location
+        netloc = auth or ''
+        if netloc:
+            netloc += '@'
+        netloc += host
+        if port:
+            netloc += ':' + str(port)
+
+        # Bare domains aren't valid URLs.
+        if not path:
+            path = '/'
+
+        if is_py2:
+            if isinstance(scheme, str):
+                scheme = scheme.encode('utf-8')
+            if isinstance(netloc, str):
+                netloc = netloc.encode('utf-8')
+            if isinstance(path, str):
+                path = path.encode('utf-8')
+            if isinstance(query, str):
+                query = query.encode('utf-8')
+            if isinstance(fragment, str):
+                fragment = fragment.encode('utf-8')
+
+        if isinstance(params, (str, bytes)):
+            params = to_native_string(params)
+
+        enc_params = self._encode_params(params)
+        if enc_params:
+            if query:
+                query = '%s&%s' % (query, enc_params)
+            else:
+                query = enc_params
+
+        url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))
+        self.url = url
+
+    def prepare_headers(self, headers):
+        """Prepares the given HTTP headers."""
+
+        if headers:
+            self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items())
+        else:
+            self.headers = CaseInsensitiveDict()
+
+    def prepare_body(self, data, files, json=None):
+        """Prepares the given HTTP body data."""
+
+        # Check if file, fo, generator, iterator.
+        # If not, run through normal process.
+
+        # Nottin' on you.
+        body = None
+        content_type = None
+        length = None
+
+        if not data and json is not None:
+            content_type = 'application/json'
+            body = complexjson.dumps(json)
+
+        is_stream = all([
+            hasattr(data, '__iter__'),
+            not isinstance(data, (basestring, list, tuple, dict))
+        ])
+
+        try:
+            length = super_len(data)
+        except (TypeError, AttributeError, UnsupportedOperation):
+            length = None
+
+        if is_stream:
+            body = data
+
+            if files:
+                raise NotImplementedError('Streamed bodies and files are mutually exclusive.')
+
+            if length:
+                self.headers['Content-Length'] = builtin_str(length)
+            else:
+                self.headers['Transfer-Encoding'] = 'chunked'
+        else:
+            # Multi-part file uploads.
+            if files:
+                (body, content_type) = self._encode_files(files, data)
+            else:
+                if data:
+                    body = self._encode_params(data)
+                    if isinstance(data, basestring) or hasattr(data, 'read'):
+                        content_type = None
+                    else:
+                        content_type = 'application/x-www-form-urlencoded'
+
+            self.prepare_content_length(body)
+
+            # Add content-type if it wasn't explicitly provided.
+            if content_type and ('content-type' not in self.headers):
+                self.headers['Content-Type'] = content_type
+
+        self.body = body
+
+    def prepare_content_length(self, body):
+        if hasattr(body, 'seek') and hasattr(body, 'tell'):
+            body.seek(0, 2)
+            self.headers['Content-Length'] = builtin_str(body.tell())
+            body.seek(0, 0)
+        elif body is not None:
+            l = super_len(body)
+            if l:
+                self.headers['Content-Length'] = builtin_str(l)
+        elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None):
+            self.headers['Content-Length'] = '0'
+
+    def prepare_auth(self, auth, url=''):
+        """Prepares the given HTTP auth data."""
+
+        # If no Auth is explicitly provided, extract it from the URL first.
+        if auth is None:
+            url_auth = get_auth_from_url(self.url)
+            auth = url_auth if any(url_auth) else None
+
+        if auth:
+            if isinstance(auth, tuple) and len(auth) == 2:
+                # special-case basic HTTP auth
+                auth = HTTPBasicAuth(*auth)
+
+            # Allow auth to make its changes.
+            r = auth(self)
+
+            # Update self to reflect the auth changes.
+            self.__dict__.update(r.__dict__)
+
+            # Recompute Content-Length
+            self.prepare_content_length(self.body)
+
+    def prepare_cookies(self, cookies):
+        """Prepares the given HTTP cookie data.
+
+        This function eventually generates a ``Cookie`` header from the
+        given cookies using cookielib. Due to cookielib's design, the header
+        will not be regenerated if it already exists, meaning this function
+        can only be called once for the life of the
+        :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls
+        to ``prepare_cookies`` will have no actual effect, unless the "Cookie"
+        header is removed beforehand."""
+
+        if isinstance(cookies, cookielib.CookieJar):
+            self._cookies = cookies
+        else:
+            self._cookies = cookiejar_from_dict(cookies)
+
+        cookie_header = get_cookie_header(self._cookies, self)
+        if cookie_header is not None:
+            self.headers['Cookie'] = cookie_header
+
+    def prepare_hooks(self, hooks):
+        """Prepares the given hooks."""
+        # hooks can be passed as None to the prepare method and to this
+        # method. To prevent iterating over None, simply use an empty list
+        # if hooks is False-y
+        hooks = hooks or []
+        for event in hooks:
+            self.register_hook(event, hooks[event])
+
+
+class Response(object):
+    """The :class:`Response <Response>` object, which contains a
+    server's response to an HTTP request.
+    """
+
+    __attrs__ = [
+        '_content', 'status_code', 'headers', 'url', 'history',
+        'encoding', 'reason', 'cookies', 'elapsed', 'request'
+    ]
+
+    def __init__(self):
+        super(Response, self).__init__()
+
+        self._content = False
+        self._content_consumed = False
+
+        #: Integer Code of responded HTTP Status, e.g. 404 or 200.
+        self.status_code = None
+
+        #: Case-insensitive Dictionary of Response Headers.
+        #: For example, ``headers['content-encoding']`` will return the
+        #: value of a ``'Content-Encoding'`` response header.
+        self.headers = CaseInsensitiveDict()
+
+        #: File-like object representation of response (for advanced usage).
+        #: Use of ``raw`` requires that ``stream=True`` be set on the request.
+        # This requirement does not apply for use internally to Requests.
+        self.raw = None
+
+        #: Final URL location of Response.
+        self.url = None
+
+        #: Encoding to decode with when accessing r.text.
+        self.encoding = None
+
+        #: A list of :class:`Response <Response>` objects from
+        #: the history of the Request. Any redirect responses will end
+        #: up here. The list is sorted from the oldest to the most recent request.
+        self.history = []
+
+        #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK".
+        self.reason = None
+
+        #: A CookieJar of Cookies the server sent back.
+        self.cookies = cookiejar_from_dict({})
+
+        #: The amount of time elapsed between sending the request
+        #: and the arrival of the response (as a timedelta).
+        #: This property specifically measures the time taken between sending
+        #: the first byte of the request and finishing parsing the headers. It
+        #: is therefore unaffected by consuming the response content or the
+        #: value of the ``stream`` keyword argument.
+        self.elapsed = datetime.timedelta(0)
+
+        #: The :class:`PreparedRequest <PreparedRequest>` object to which this
+        #: is a response.
+        self.request = None
+
+    def __getstate__(self):
+        # Consume everything; accessing the content attribute makes
+        # sure the content has been fully read.
+        if not self._content_consumed:
+            self.content
+
+        return dict(
+            (attr, getattr(self, attr, None))
+            for attr in self.__attrs__
+        )
+
+    def __setstate__(self, state):
+        for name, value in state.items():
+            setattr(self, name, value)
+
+        # pickled objects do not have .raw
+        setattr(self, '_content_consumed', True)
+        setattr(self, 'raw', None)
+
+    def __repr__(self):
+        return '<Response [%s]>' % (self.status_code)
+
+    def __bool__(self):
+        """Returns true if :attr:`status_code` is 'OK'."""
+        return self.ok
+
+    def __nonzero__(self):
+        """Returns true if :attr:`status_code` is 'OK'."""
+        return self.ok
+
+    def __iter__(self):
+        """Allows you to use a response as an iterator."""
+        return self.iter_content(128)
+
+    @property
+    def ok(self):
+        try:
+            self.raise_for_status()
+        except HTTPError:
+            return False
+        return True
+
+    @property
+    def is_redirect(self):
+        """True if this Response is a well-formed HTTP redirect that could have
+        been processed automatically (by :meth:`Session.resolve_redirects`).
+        """
+        return ('location' in self.headers and self.status_code in REDIRECT_STATI)
+
+    @property
+    def is_permanent_redirect(self):
+        """True if this Response one of the permanent versions of redirect"""
+        return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect))
+
+    @property
+    def apparent_encoding(self):
+        """The apparent encoding, provided by the chardet library"""
+        return chardet.detect(self.content)['encoding']
+
+    def iter_content(self, chunk_size=1, decode_unicode=False):
+        """Iterates over the response data.  When stream=True is set on the
+        request, this avoids reading the content at once into memory for
+        large responses.  The chunk size is the number of bytes it should
+        read into memory.  This is not necessarily the length of each item
+        returned as decoding can take place.
+
+        If decode_unicode is True, content will be decoded using the best
+        available encoding based on the response.
+        """
+
+        def generate():
+            # Special case for urllib3.
+            if hasattr(self.raw, 'stream'):
+                try:
+                    for chunk in self.raw.stream(chunk_size, decode_content=True):
+                        yield chunk
+                except ProtocolError as e:
+                    raise ChunkedEncodingError(e)
+                except DecodeError as e:
+                    raise ContentDecodingError(e)
+                except ReadTimeoutError as e:
+                    raise ConnectionError(e)
+            else:
+                # Standard file-like object.
+                while True:
+                    chunk = self.raw.read(chunk_size)
+                    if not chunk:
+                        break
+                    yield chunk
+
+            self._content_consumed = True
+
+        if self._content_consumed and isinstance(self._content, bool):
+            raise StreamConsumedError()
+        # simulate reading small chunks of the content
+        reused_chunks = iter_slices(self._content, chunk_size)
+
+        stream_chunks = generate()
+
+        chunks = reused_chunks if self._content_consumed else stream_chunks
+
+        if decode_unicode:
+            chunks = stream_decode_response_unicode(chunks, self)
+
+        return chunks
+
+    def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None):
+        """Iterates over the response data, one line at a time.  When
+        stream=True is set on the request, this avoids reading the
+        content at once into memory for large responses.
+
+        .. note:: This method is not reentrant safe.
+        """
+
+        pending = None
+
+        for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
+
+            if pending is not None:
+                chunk = pending + chunk
+
+            if delimiter:
+                lines = chunk.split(delimiter)
+            else:
+                lines = chunk.splitlines()
+
+            if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]:
+                pending = lines.pop()
+            else:
+                pending = None
+
+            for line in lines:
+                yield line
+
+        if pending is not None:
+            yield pending
+
+    @property
+    def content(self):
+        """Content of the response, in bytes."""
+
+        if self._content is False:
+            # Read the contents.
+            try:
+                if self._content_consumed:
+                    raise RuntimeError(
+                        'The content for this response was already consumed')
+
+                if self.status_code == 0:
+                    self._content = None
+                else:
+                    self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()
+
+            except AttributeError:
+                self._content = None
+
+        self._content_consumed = True
+        # don't need to release the connection; that's been handled by urllib3
+        # since we exhausted the data.
+        return self._content
+
+    @property
+    def text(self):
+        """Content of the response, in unicode.
+
+        If Response.encoding is None, encoding will be guessed using
+        ``chardet``.
+
+        The encoding of the response content is determined based solely on HTTP
+        headers, following RFC 2616 to the letter. If you can take advantage of
+        non-HTTP knowledge to make a better guess at the encoding, you should
+        set ``r.encoding`` appropriately before accessing this property.
+        """
+
+        # Try charset from content-type
+        content = None
+        encoding = self.encoding
+
+        if not self.content:
+            return str('')
+
+        # Fallback to auto-detected encoding.
+        if self.encoding is None:
+            encoding = self.apparent_encoding
+
+        # Decode unicode from given encoding.
+        try:
+            content = str(self.content, encoding, errors='replace')
+        except (LookupError, TypeError):
+            # A LookupError is raised if the encoding was not found which could
+            # indicate a misspelling or similar mistake.
+            #
+            # A TypeError can be raised if encoding is None
+            #
+            # So we try blindly encoding.
+            content = str(self.content, errors='replace')
+
+        return content
+
+    def json(self, **kwargs):
+        """Returns the json-encoded content of a response, if any.
+
+        :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
+        """
+
+        if not self.encoding and len(self.content) > 3:
+            # No encoding set. JSON RFC 4627 section 3 states we should expect
+            # UTF-8, -16 or -32. Detect which one to use; If the detection or
+            # decoding fails, fall back to `self.text` (using chardet to make
+            # a best guess).
+            encoding = guess_json_utf(self.content)
+            if encoding is not None:
+                try:
+                    return complexjson.loads(
+                        self.content.decode(encoding), **kwargs
+                    )
+                except UnicodeDecodeError:
+                    # Wrong UTF codec detected; usually because it's not UTF-8
+                    # but some other 8-bit codec.  This is an RFC violation,
+                    # and the server didn't bother to tell us what codec *was*
+                    # used.
+                    pass
+        return complexjson.loads(self.text, **kwargs)
+
+    @property
+    def links(self):
+        """Returns the parsed header links of the response, if any."""
+
+        header = self.headers.get('link')
+
+        # l = MultiDict()
+        l = {}
+
+        if header:
+            links = parse_header_links(header)
+
+            for link in links:
+                key = link.get('rel') or link.get('url')
+                l[key] = link
+
+        return l
+
+    def raise_for_status(self):
+        """Raises stored :class:`HTTPError`, if one occurred."""
+
+        http_error_msg = ''
+
+        if 400 <= self.status_code < 500:
+            http_error_msg = '%s Client Error: %s for url: %s' % (self.status_code, self.reason, self.url)
+
+        elif 500 <= self.status_code < 600:
+            http_error_msg = '%s Server Error: %s for url: %s' % (self.status_code, self.reason, self.url)
+
+        if http_error_msg:
+            raise HTTPError(http_error_msg, response=self)
+
+    def close(self):
+        """Releases the connection back to the pool. Once this method has been
+        called the underlying ``raw`` object must not be accessed again.
+
+        *Note: Should not normally need to be called explicitly.*
+        """
+        if not self._content_consumed:
+            return self.raw.close()
+
+        return self.raw.release_conn()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/structures.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/structures.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/structures.py	(revision 1126)
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.structures
+~~~~~~~~~~~~~~~~~~~
+
+Data structures that power Requests.
+
+"""
+
+import collections
+
+
+class CaseInsensitiveDict(collections.MutableMapping):
+    """
+    A case-insensitive ``dict``-like object.
+
+    Implements all methods and operations of
+    ``collections.MutableMapping`` as well as dict's ``copy``. Also
+    provides ``lower_items``.
+
+    All keys are expected to be strings. The structure remembers the
+    case of the last key to be set, and ``iter(instance)``,
+    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``
+    will contain case-sensitive keys. However, querying and contains
+    testing is case insensitive::
+
+        cid = CaseInsensitiveDict()
+        cid['Accept'] = 'application/json'
+        cid['aCCEPT'] == 'application/json'  # True
+        list(cid) == ['Accept']  # True
+
+    For example, ``headers['content-encoding']`` will return the
+    value of a ``'Content-Encoding'`` response header, regardless
+    of how the header name was originally stored.
+
+    If the constructor, ``.update``, or equality comparison
+    operations are given keys that have equal ``.lower()``s, the
+    behavior is undefined.
+
+    """
+    def __init__(self, data=None, **kwargs):
+        self._store = dict()
+        if data is None:
+            data = {}
+        self.update(data, **kwargs)
+
+    def __setitem__(self, key, value):
+        # Use the lowercased key for lookups, but store the actual
+        # key alongside the value.
+        self._store[key.lower()] = (key, value)
+
+    def __getitem__(self, key):
+        return self._store[key.lower()][1]
+
+    def __delitem__(self, key):
+        del self._store[key.lower()]
+
+    def __iter__(self):
+        return (casedkey for casedkey, mappedvalue in self._store.values())
+
+    def __len__(self):
+        return len(self._store)
+
+    def lower_items(self):
+        """Like iteritems(), but with all lowercase keys."""
+        return (
+            (lowerkey, keyval[1])
+            for (lowerkey, keyval)
+            in self._store.items()
+        )
+
+    def __eq__(self, other):
+        if isinstance(other, collections.Mapping):
+            other = CaseInsensitiveDict(other)
+        else:
+            return NotImplemented
+        # Compare insensitively
+        return dict(self.lower_items()) == dict(other.lower_items())
+
+    # Copy is required
+    def copy(self):
+        return CaseInsensitiveDict(self._store.values())
+
+    def __repr__(self):
+        return str(dict(self.items()))
+
+class LookupDict(dict):
+    """Dictionary lookup object."""
+
+    def __init__(self, name=None):
+        self.name = name
+        super(LookupDict, self).__init__()
+
+    def __repr__(self):
+        return '<lookup \'%s\'>' % (self.name)
+
+    def __getitem__(self, key):
+        # We allow fall-through here, so values default to None
+
+        return self.__dict__.get(key, None)
+
+    def get(self, key, default=None):
+        return self.__dict__.get(key, default)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/__init__.py	(revision 1126)
@@ -0,0 +1,36 @@
+'''
+Debian and other distributions "unbundle" requests' vendored dependencies, and
+rewrite all imports to use the global versions of ``urllib3`` and ``chardet``.
+The problem with this is that not only requests itself imports those
+dependencies, but third-party code outside of the distros' control too.
+
+In reaction to these problems, the distro maintainers replaced
+``requests.packages`` with a magical "stub module" that imports the correct
+modules. The implementations were varying in quality and all had severe
+problems. For example, a symlink (or hardlink) that links the correct modules
+into place introduces problems regarding object identity, since you now have
+two modules in `sys.modules` with the same API, but different identities::
+
+    requests.packages.urllib3 is not urllib3
+
+With version ``2.5.2``, requests started to maintain its own stub, so that
+distro-specific breakage would be reduced to a minimum, even though the whole
+issue is not requests' fault in the first place. See
+https://github.com/kennethreitz/requests/pull/2375 for the corresponding pull
+request.
+'''
+
+from __future__ import absolute_import
+import sys
+
+try:
+    from . import urllib3
+except ImportError:
+    import urllib3
+    sys.modules['%s.urllib3' % __name__] = urllib3
+
+try:
+    from . import chardet
+except ImportError:
+    import chardet
+    sys.modules['%s.chardet' % __name__] = chardet
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euckrfreq.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euckrfreq.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euckrfreq.py	(revision 1126)
@@ -0,0 +1,596 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+
+# 128  --> 0.79
+# 256  --> 0.92
+# 512  --> 0.986
+# 1024 --> 0.99944
+# 2048 --> 0.99999
+#
+# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
+# Random Distribution Ration = 512 / (2350-512) = 0.279.
+# 
+# Typical Distribution Ratio  
+
+EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
+
+EUCKR_TABLE_SIZE = 2352
+
+# Char to FreqOrder table , 
+EUCKRCharToFreqOrder = ( \
+  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
+1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
+1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
+ 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
+ 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
+ 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
+1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
+ 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
+ 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
+1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
+1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
+1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
+1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
+1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
+ 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
+1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
+1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
+1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
+1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
+ 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
+1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
+ 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
+ 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
+1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
+ 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
+1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
+ 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
+   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
+1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
+1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
+1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
+1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
+ 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
+1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
+ 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
+ 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
+1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
+1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
+1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
+1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
+1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
+1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
+  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
+ 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
+ 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
+1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
+ 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
+1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
+ 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
+ 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
+2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
+ 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
+ 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
+2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
+2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
+2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
+ 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
+ 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
+2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
+ 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
+1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
+2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
+1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
+2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
+2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
+1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
+ 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
+2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
+2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
+  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
+ 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
+2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
+1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
+2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
+2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
+2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
+2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
+2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
+2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
+1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
+2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
+2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
+2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
+2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
+2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
+1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
+1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
+2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
+1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
+2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
+1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
+ 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
+2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
+ 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
+2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
+ 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
+2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
+2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
+ 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
+2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
+1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
+ 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
+1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
+2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
+1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
+2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
+ 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
+2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
+1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
+2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
+1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
+2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
+1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
+ 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
+2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
+2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
+ 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
+ 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
+1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
+1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
+ 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
+2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
+2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
+ 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
+ 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
+ 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
+2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
+  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
+ 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
+2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
+2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
+ 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
+2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
+1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
+ 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
+2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
+2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
+2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
+   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
+ 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
+ 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
+2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
+2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
+2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
+1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
+2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
+ 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
+#Everything below is of no interest for detection purpose
+2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,
+2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,
+2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,
+2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704,
+2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,
+2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734,
+2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,
+2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,
+2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,
+2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793,
+2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,
+2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,
+2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,
+2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,
+1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869,
+2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883,
+2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,
+2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,
+2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331,
+2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945,
+2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,
+2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,
+2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,
+2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,
+3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021,
+3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,
+3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052,
+3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,
+3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080,
+3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,
+3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110,
+3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124,
+3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,
+3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,
+3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,
+3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,
+3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,
+3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,
+3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,
+3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,
+3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,
+3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279,
+3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,
+3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,
+3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,
+3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,
+3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,
+3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,
+3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389,
+3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,
+3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338,
+3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432,
+3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446,
+3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191,
+3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471,
+3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,
+1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499,
+1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513,
+3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525,
+3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,
+3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,
+3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,
+3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587,
+3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,
+3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,
+3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632,
+3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,
+3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663,
+3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,
+3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,
+3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583,
+1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722,
+3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,
+3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753,
+3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767,
+3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782,
+3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796,
+3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810,
+3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591,
+1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836,
+3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851,
+3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866,
+3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880,
+3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895,
+1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905,
+3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,
+3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934,
+3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603,
+3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,
+3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978,
+3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993,
+3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,
+4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024,
+4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,
+1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,
+4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069,
+4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083,
+4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,
+4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113,
+4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610,
+4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142,
+4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,
+4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,
+4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,
+4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,
+4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220,
+4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234,
+4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249,
+4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,
+4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279,
+4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294,
+4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,
+4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,
+4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341,
+4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,
+4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371,
+4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,
+4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,
+4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418,
+4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432,
+4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446,
+4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461,
+4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,
+4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491,
+4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,
+4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623,
+4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536,
+4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551,
+4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,
+4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581,
+4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627,
+4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,
+4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,
+4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,
+4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657,
+4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,
+4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687,
+1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700,
+4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715,
+4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,
+4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633,
+4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758,
+4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773,
+4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,
+4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,
+4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817,
+4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,
+4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,
+4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,
+4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,
+4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893,
+4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,
+4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923,
+4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938,
+4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,
+4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,
+4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645,
+4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,
+5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078,
+5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,
+1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042,
+5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056,
+5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,
+5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,
+5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,
+5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118,
+1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132,
+5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,
+5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,
+5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,
+5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,
+5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206,
+1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218,
+5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,
+5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249,
+5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262,
+5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,
+5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,
+5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308,
+5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323,
+5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338,
+5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,
+5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,
+5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,
+5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400,
+5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415,
+5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,
+5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445,
+5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,
+5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,
+5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491,
+5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,
+5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,
+5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,
+5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554,
+5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,
+1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,
+5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600,
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615,
+5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,
+5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,
+5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,
+1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673,
+5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,
+5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703,
+5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716,
+5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729,
+5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744,
+1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758,
+5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773,
+1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786,
+5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801,
+5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,
+5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,
+5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,
+5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862,
+5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876,
+5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889,
+5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,
+5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687,
+5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,
+5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963,
+5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,
+5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,
+5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,
+6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,
+6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,
+6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,
+6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,
+6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086,
+6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,
+6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,
+6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133,
+6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147,
+6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,
+6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,
+6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194,
+6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,
+6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225,
+6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,
+6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256,
+6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271,  #1024
+6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,
+6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699,
+6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,
+6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,
+6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347,
+6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,
+6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,
+6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,
+6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,
+6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425,
+6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440,
+6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,
+6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,
+6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,
+6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266,
+6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,
+6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,
+6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,
+1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,
+6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,
+6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,
+6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,
+6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629,
+6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644,
+1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,
+6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,
+1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,
+6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,
+6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,
+6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,
+1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748,
+6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763,
+6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,
+6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,
+6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711,
+6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,
+6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840,
+6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,
+6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,
+6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888,
+6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903,
+6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918,
+6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,
+6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,
+6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,
+6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981,
+6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996,
+6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,
+7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,
+7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,
+7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,
+7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,
+7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,
+7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,
+7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,
+7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,
+7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,
+7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170,
+7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,
+7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,
+7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216,
+7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,
+7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,
+7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,
+7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,
+7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,
+7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,
+7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,
+7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,
+7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,
+7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,
+7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,
+7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,
+7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,
+7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,
+7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,
+7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,
+7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,
+7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,
+7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,
+7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,
+7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,
+7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,
+7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,
+7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,
+7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,
+7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,
+7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,
+7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,
+7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,
+7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,
+7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,
+7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,
+7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,
+7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,
+7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,
+7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,
+7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,
+7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,
+7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,
+7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,
+7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,
+7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,
+7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,
+7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031,
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,
+8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,
+8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,
+8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,
+8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,
+8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,
+8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,
+8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,
+8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,
+8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,
+8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,
+8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,
+8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,
+8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,
+8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,
+8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,
+8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,
+8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,
+8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,
+8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,
+8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,
+8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,
+8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,
+8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,
+8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,
+8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,
+8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,
+8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,
+8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,
+8736,8737,8738,8739,8740,8741)
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/codingstatemachine.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/codingstatemachine.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/codingstatemachine.py	(revision 1126)
@@ -0,0 +1,61 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .constants import eStart
+from .compat import wrap_ord
+
+
+class CodingStateMachine:
+    def __init__(self, sm):
+        self._mModel = sm
+        self._mCurrentBytePos = 0
+        self._mCurrentCharLen = 0
+        self.reset()
+
+    def reset(self):
+        self._mCurrentState = eStart
+
+    def next_state(self, c):
+        # for each byte we get its class
+        # if it is first byte, we also get byte length
+        # PY3K: aBuf is a byte stream, so c is an int, not a byte
+        byteCls = self._mModel['classTable'][wrap_ord(c)]
+        if self._mCurrentState == eStart:
+            self._mCurrentBytePos = 0
+            self._mCurrentCharLen = self._mModel['charLenTable'][byteCls]
+        # from byte's class and stateTable, we get its next state
+        curr_state = (self._mCurrentState * self._mModel['classFactor']
+                      + byteCls)
+        self._mCurrentState = self._mModel['stateTable'][curr_state]
+        self._mCurrentBytePos += 1
+        return self._mCurrentState
+
+    def get_current_charlen(self):
+        return self._mCurrentCharLen
+
+    def get_coding_state_machine(self):
+        return self._mModel['name']
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langcyrillicmodel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langcyrillicmodel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langcyrillicmodel.py	(revision 1126)
@@ -0,0 +1,329 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# KOI8-R language model
+# Character Mapping Table:
+KOI8R_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90
+223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0
+238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0
+ 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0
+ 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0
+ 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0
+ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0
+)
+
+win1251_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+)
+
+latin5_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+macCyrillic_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
+)
+
+IBM855_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
+206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
+  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,
+220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,
+230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
+  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,
+ 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
+250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
+)
+
+IBM866_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 97.6601%
+# first 1024 sequences: 2.3389%
+# rest  sequences:      0.1237%
+# negative sequences:   0.0009%
+RussianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,
+1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,
+1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,
+2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,
+1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,
+3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,
+1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,
+2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,
+1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,
+1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,
+1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,
+1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
+3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,
+1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,
+2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,
+1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,
+2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,
+1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,
+1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,
+1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,
+3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,
+3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,
+1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,
+1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,
+0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,
+1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,
+1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
+0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,
+1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,
+2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,
+1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,
+1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,
+2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,
+1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,
+1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,
+1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
+0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,
+0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
+0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
+0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+)
+
+Koi8rModel = {
+  'charToOrderMap': KOI8R_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "KOI8-R"
+}
+
+Win1251CyrillicModel = {
+  'charToOrderMap': win1251_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1251"
+}
+
+Latin5CyrillicModel = {
+  'charToOrderMap': latin5_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "ISO-8859-5"
+}
+
+MacCyrillicModel = {
+  'charToOrderMap': macCyrillic_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "MacCyrillic"
+};
+
+Ibm866Model = {
+  'charToOrderMap': IBM866_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "IBM866"
+}
+
+Ibm855Model = {
+  'charToOrderMap': IBM855_CharToOrderMap,
+  'precedenceMatrix': RussianLangModel,
+  'mTypicalPositiveRatio': 0.976601,
+  'keepEnglishLetter': False,
+  'charsetName': "IBM855"
+}
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langhebrewmodel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langhebrewmodel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langhebrewmodel.py	(revision 1126)
@@ -0,0 +1,201 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Simon Montagu
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Shoshannah Forbes - original C code (?)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Windows-1255 language model
+# Character Mapping Table:
+win1255_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40
+ 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50
+253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60
+ 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70
+124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
+215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
+ 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
+106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
+ 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
+238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
+  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,
+ 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 98.4004%
+# first 1024 sequences: 1.5981%
+# rest  sequences:      0.087%
+# negative sequences:   0.0015%
+HebrewLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,
+3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,
+1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,
+1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,
+1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,
+1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,
+0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,
+0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,
+0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,
+0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,
+0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,
+0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,
+0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,
+0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,
+0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
+1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,
+0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,
+0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,
+0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,
+0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,
+0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,
+1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,
+1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,
+2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
+0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,
+0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,
+)
+
+Win1255HebrewModel = {
+  'charToOrderMap': win1255_CharToOrderMap,
+  'precedenceMatrix': HebrewLangModel,
+  'mTypicalPositiveRatio': 0.984004,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1255"
+}
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/utf8prober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/utf8prober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/utf8prober.py	(revision 1126)
@@ -0,0 +1,76 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+from .charsetprober import CharSetProber
+from .codingstatemachine import CodingStateMachine
+from .mbcssm import UTF8SMModel
+
+ONE_CHAR_PROB = 0.5
+
+
+class UTF8Prober(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(UTF8SMModel)
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mCodingSM.reset()
+        self._mNumOfMBChar = 0
+
+    def get_charset_name(self):
+        return "utf-8"
+
+    def feed(self, aBuf):
+        for c in aBuf:
+            codingState = self._mCodingSM.next_state(c)
+            if codingState == constants.eError:
+                self._mState = constants.eNotMe
+                break
+            elif codingState == constants.eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == constants.eStart:
+                if self._mCodingSM.get_current_charlen() >= 2:
+                    self._mNumOfMBChar += 1
+
+        if self.get_state() == constants.eDetecting:
+            if self.get_confidence() > constants.SHORTCUT_THRESHOLD:
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        unlike = 0.99
+        if self._mNumOfMBChar < 6:
+            for i in range(0, self._mNumOfMBChar):
+                unlike = unlike * ONE_CHAR_PROB
+            return 1.0 - unlike
+        else:
+            return unlike
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/universaldetector.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/universaldetector.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/universaldetector.py	(revision 1126)
@@ -0,0 +1,170 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+import codecs
+from .latin1prober import Latin1Prober  # windows-1252
+from .mbcsgroupprober import MBCSGroupProber  # multi-byte character sets
+from .sbcsgroupprober import SBCSGroupProber  # single-byte character sets
+from .escprober import EscCharSetProber  # ISO-2122, etc.
+import re
+
+MINIMUM_THRESHOLD = 0.20
+ePureAscii = 0
+eEscAscii = 1
+eHighbyte = 2
+
+
+class UniversalDetector:
+    def __init__(self):
+        self._highBitDetector = re.compile(b'[\x80-\xFF]')
+        self._escDetector = re.compile(b'(\033|~{)')
+        self._mEscCharSetProber = None
+        self._mCharSetProbers = []
+        self.reset()
+
+    def reset(self):
+        self.result = {'encoding': None, 'confidence': 0.0}
+        self.done = False
+        self._mStart = True
+        self._mGotData = False
+        self._mInputState = ePureAscii
+        self._mLastChar = b''
+        if self._mEscCharSetProber:
+            self._mEscCharSetProber.reset()
+        for prober in self._mCharSetProbers:
+            prober.reset()
+
+    def feed(self, aBuf):
+        if self.done:
+            return
+
+        aLen = len(aBuf)
+        if not aLen:
+            return
+
+        if not self._mGotData:
+            # If the data starts with BOM, we know it is UTF
+            if aBuf[:3] == codecs.BOM_UTF8:
+                # EF BB BF  UTF-8 with BOM
+                self.result = {'encoding': "UTF-8-SIG", 'confidence': 1.0}
+            elif aBuf[:4] == codecs.BOM_UTF32_LE:
+                # FF FE 00 00  UTF-32, little-endian BOM
+                self.result = {'encoding': "UTF-32LE", 'confidence': 1.0}
+            elif aBuf[:4] == codecs.BOM_UTF32_BE:
+                # 00 00 FE FF  UTF-32, big-endian BOM
+                self.result = {'encoding': "UTF-32BE", 'confidence': 1.0}
+            elif aBuf[:4] == b'\xFE\xFF\x00\x00':
+                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
+                self.result = {
+                    'encoding': "X-ISO-10646-UCS-4-3412",
+                    'confidence': 1.0
+                }
+            elif aBuf[:4] == b'\x00\x00\xFF\xFE':
+                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
+                self.result = {
+                    'encoding': "X-ISO-10646-UCS-4-2143",
+                    'confidence': 1.0
+                }
+            elif aBuf[:2] == codecs.BOM_LE:
+                # FF FE  UTF-16, little endian BOM
+                self.result = {'encoding': "UTF-16LE", 'confidence': 1.0}
+            elif aBuf[:2] == codecs.BOM_BE:
+                # FE FF  UTF-16, big endian BOM
+                self.result = {'encoding': "UTF-16BE", 'confidence': 1.0}
+
+        self._mGotData = True
+        if self.result['encoding'] and (self.result['confidence'] > 0.0):
+            self.done = True
+            return
+
+        if self._mInputState == ePureAscii:
+            if self._highBitDetector.search(aBuf):
+                self._mInputState = eHighbyte
+            elif ((self._mInputState == ePureAscii) and
+                    self._escDetector.search(self._mLastChar + aBuf)):
+                self._mInputState = eEscAscii
+
+        self._mLastChar = aBuf[-1:]
+
+        if self._mInputState == eEscAscii:
+            if not self._mEscCharSetProber:
+                self._mEscCharSetProber = EscCharSetProber()
+            if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt:
+                self.result = {'encoding': self._mEscCharSetProber.get_charset_name(),
+                               'confidence': self._mEscCharSetProber.get_confidence()}
+                self.done = True
+        elif self._mInputState == eHighbyte:
+            if not self._mCharSetProbers:
+                self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(),
+                                         Latin1Prober()]
+            for prober in self._mCharSetProbers:
+                if prober.feed(aBuf) == constants.eFoundIt:
+                    self.result = {'encoding': prober.get_charset_name(),
+                                   'confidence': prober.get_confidence()}
+                    self.done = True
+                    break
+
+    def close(self):
+        if self.done:
+            return
+        if not self._mGotData:
+            if constants._debug:
+                sys.stderr.write('no data received!\n')
+            return
+        self.done = True
+
+        if self._mInputState == ePureAscii:
+            self.result = {'encoding': 'ascii', 'confidence': 1.0}
+            return self.result
+
+        if self._mInputState == eHighbyte:
+            proberConfidence = None
+            maxProberConfidence = 0.0
+            maxProber = None
+            for prober in self._mCharSetProbers:
+                if not prober:
+                    continue
+                proberConfidence = prober.get_confidence()
+                if proberConfidence > maxProberConfidence:
+                    maxProberConfidence = proberConfidence
+                    maxProber = prober
+            if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD):
+                self.result = {'encoding': maxProber.get_charset_name(),
+                               'confidence': maxProber.get_confidence()}
+                return self.result
+
+        if constants._debug:
+            sys.stderr.write('no probers hit minimum threshhold\n')
+            for prober in self._mCharSetProbers[0].mProbers:
+                if not prober:
+                    continue
+                sys.stderr.write('%s confidence = %s\n' %
+                                 (prober.get_charset_name(),
+                                  prober.get_confidence()))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/jisfreq.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/jisfreq.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/jisfreq.py	(revision 1126)
@@ -0,0 +1,569 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+#
+# Japanese frequency table, applied to both S-JIS and EUC-JP
+# They are sorted in order.
+
+# 128  --> 0.77094
+# 256  --> 0.85710
+# 512  --> 0.92635
+# 1024 --> 0.97130
+# 2048 --> 0.99431
+#
+# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
+# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
+#
+# Typical Distribution Ratio, 25% of IDR
+
+JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
+
+# Char to FreqOrder table ,
+JIS_TABLE_SIZE = 4368
+
+JISCharToFreqOrder = (
+  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
+3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
+1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
+2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
+2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
+5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
+1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
+5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
+5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
+5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
+5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
+5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
+5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
+1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
+1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
+1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
+2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
+3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
+3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
+   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
+  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
+1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
+ 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
+5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
+ 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
+  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
+  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
+ 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
+  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
+5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
+5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
+5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
+4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
+5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
+5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
+5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
+5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
+5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
+5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
+5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
+5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
+5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
+3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
+5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
+5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
+5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
+5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
+5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
+5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
+5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
+5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
+5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
+5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
+5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
+5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
+5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
+5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
+5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
+5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
+5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
+5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
+5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
+5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
+5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
+5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
+5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
+5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
+5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
+5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
+5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
+5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
+5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
+5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
+5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
+5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
+5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
+5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
+5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
+5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
+6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
+6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
+6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
+6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
+6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
+6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
+6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
+6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
+4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
+ 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
+ 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
+1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
+1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
+ 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
+3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
+3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
+ 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
+3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
+3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
+ 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
+2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
+ 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
+3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
+1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
+ 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
+1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
+ 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
+2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
+2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
+2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
+2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
+1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
+1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
+1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
+1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
+2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
+1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
+2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
+1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
+1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
+1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
+1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
+1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
+1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
+ 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
+ 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
+1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
+2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
+2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
+2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
+3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
+3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
+ 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
+3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
+1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
+ 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
+2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
+1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
+ 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
+3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
+4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
+2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
+1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
+2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
+1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
+ 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
+ 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
+1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
+2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
+2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
+2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
+3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
+1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
+2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
+ 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
+ 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
+ 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
+1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
+2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
+ 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
+1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
+1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
+ 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
+1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
+1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
+1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
+ 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
+2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
+ 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
+2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
+3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
+2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
+1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
+6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
+1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
+2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
+1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
+ 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
+  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
+3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
+3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
+1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
+1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
+1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
+1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
+ 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
+ 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
+2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
+ 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
+3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
+2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
+ 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
+1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
+2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
+ 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
+1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
+ 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
+4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
+2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
+1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
+ 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
+1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
+2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
+ 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
+6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
+1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
+1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
+2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
+3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
+ 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
+3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
+1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
+ 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
+1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
+ 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
+3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
+ 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
+2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
+ 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
+4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
+2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
+1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
+1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
+1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
+ 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
+1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
+3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
+1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
+3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
+ 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
+ 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
+ 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
+2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
+1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
+ 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
+1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
+ 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
+1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
+ 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
+ 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
+ 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
+1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
+1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
+2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
+4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
+ 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
+1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
+ 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
+1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
+3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
+1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
+2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
+2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
+1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
+1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
+2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
+ 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
+2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
+1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
+1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
+1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
+1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
+3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
+2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
+2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
+ 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
+3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
+3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
+1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
+2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
+1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
+2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
+#Everything below is of no interest for detection purpose
+2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384
+6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400
+6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416
+6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432
+6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448
+4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464
+4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480
+3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496
+3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512
+4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528
+3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544
+6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560
+4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576
+6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592
+6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608
+6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624
+6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640
+6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656
+6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672
+3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688
+3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704
+6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720
+2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736
+4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752
+4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768
+4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784
+6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800
+3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816
+4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832
+4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848
+6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864
+4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880
+6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896
+3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912
+2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928
+4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944
+2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960
+6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976
+4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992
+6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008
+6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024
+6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040
+4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056
+6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072
+2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088
+6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104
+4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120
+6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136
+4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152
+4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168
+6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184
+6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200
+6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216
+3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232
+1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248
+3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264
+3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280
+4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296
+6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312
+3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328
+6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344
+3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360
+3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376
+2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392
+6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408
+6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424
+3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440
+6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456
+3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472
+6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488
+6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504
+6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520
+4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536
+6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552
+4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568
+3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584
+3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600
+6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616
+6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632
+4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648
+6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664
+6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680
+6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696
+6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712
+6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728
+6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744
+4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760
+4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776
+3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792
+6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808
+4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824
+2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840
+6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856
+6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872
+4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888
+2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904
+4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920
+2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936
+4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952
+4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968
+4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984
+6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000
+3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016
+6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032
+3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048
+6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064
+2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080
+3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096
+7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112
+2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128
+3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144
+3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160
+3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176
+3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192
+7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208
+7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224
+7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240
+7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256
+7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272
+4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288
+3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304
+3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320
+4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336
+3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352
+3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368
+7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384
+4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400
+7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416
+7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432
+7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448
+7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464
+7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480
+4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496
+4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512
+7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528
+3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544
+4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560
+7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576
+7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592
+4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608
+3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624
+3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640
+7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656
+4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672
+4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688
+4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704
+4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720
+4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736
+4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752
+7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768
+7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784
+7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800
+7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816
+7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832
+2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848
+3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864
+7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880
+7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896
+3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912
+4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928
+3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944
+3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960
+2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976
+7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992
+7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008
+4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024
+3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040
+3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056
+7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072
+7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088
+7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104
+4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120
+7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136
+2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152
+3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168
+4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184
+7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200
+4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216
+4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232
+7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248
+7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264
+5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280
+7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296
+7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312
+7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328
+7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344
+7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360
+5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376
+5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392
+7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408
+3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424
+7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440
+7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456
+3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472
+7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488
+7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504
+1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520
+3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536
+4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552
+2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568
+3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584
+2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600
+5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616
+4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632
+4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648
+5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664
+7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680
+7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696
+7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712
+7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728
+3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744
+7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760
+3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776
+7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792
+4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808
+7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824
+7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840
+7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856
+7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872
+7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888
+7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904
+7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920
+7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/jpcntx.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/jpcntx.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/jpcntx.py	(revision 1126)
@@ -0,0 +1,227 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .compat import wrap_ord
+
+NUM_OF_CATEGORY = 6
+DONT_KNOW = -1
+ENOUGH_REL_THRESHOLD = 100
+MAX_REL_THRESHOLD = 1000
+MINIMUM_DATA_THRESHOLD = 4
+
+# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
+jp2CharContext = (
+(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
+(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
+(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
+(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
+(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
+(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
+(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
+(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
+(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
+(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
+(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
+(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
+(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
+(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
+(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
+(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
+(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
+(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
+(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
+(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
+(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
+(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
+(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
+(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
+(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
+(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
+(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
+(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
+(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
+(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
+(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
+(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
+(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
+(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
+(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
+(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
+(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
+(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
+(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
+(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
+(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
+(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),
+(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
+(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
+(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
+(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
+(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
+(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
+(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
+(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
+(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),
+(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
+(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
+(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),
+(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
+(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
+(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
+(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
+(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
+(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
+(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
+(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),
+(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
+(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
+(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
+(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
+(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
+(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
+(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
+(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
+(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
+(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
+(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
+)
+
+class JapaneseContextAnalysis:
+    def __init__(self):
+        self.reset()
+
+    def reset(self):
+        self._mTotalRel = 0  # total sequence received
+        # category counters, each interger counts sequence in its category
+        self._mRelSample = [0] * NUM_OF_CATEGORY
+        # if last byte in current buffer is not the last byte of a character,
+        # we need to know how many bytes to skip in next buffer
+        self._mNeedToSkipCharNum = 0
+        self._mLastCharOrder = -1  # The order of previous char
+        # If this flag is set to True, detection is done and conclusion has
+        # been made
+        self._mDone = False
+
+    def feed(self, aBuf, aLen):
+        if self._mDone:
+            return
+
+        # The buffer we got is byte oriented, and a character may span in more than one
+        # buffers. In case the last one or two byte in last buffer is not
+        # complete, we record how many byte needed to complete that character
+        # and skip these bytes here.  We can choose to record those bytes as
+        # well and analyse the character once it is complete, but since a
+        # character will not make much difference, by simply skipping
+        # this character will simply our logic and improve performance.
+        i = self._mNeedToSkipCharNum
+        while i < aLen:
+            order, charLen = self.get_order(aBuf[i:i + 2])
+            i += charLen
+            if i > aLen:
+                self._mNeedToSkipCharNum = i - aLen
+                self._mLastCharOrder = -1
+            else:
+                if (order != -1) and (self._mLastCharOrder != -1):
+                    self._mTotalRel += 1
+                    if self._mTotalRel > MAX_REL_THRESHOLD:
+                        self._mDone = True
+                        break
+                    self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1
+                self._mLastCharOrder = order
+
+    def got_enough_data(self):
+        return self._mTotalRel > ENOUGH_REL_THRESHOLD
+
+    def get_confidence(self):
+        # This is just one way to calculate confidence. It works well for me.
+        if self._mTotalRel > MINIMUM_DATA_THRESHOLD:
+            return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel
+        else:
+            return DONT_KNOW
+
+    def get_order(self, aBuf):
+        return -1, 1
+
+class SJISContextAnalysis(JapaneseContextAnalysis):
+    def __init__(self):
+        self.charset_name = "SHIFT_JIS"
+
+    def get_charset_name(self):
+        return self.charset_name
+
+    def get_order(self, aBuf):
+        if not aBuf:
+            return -1, 1
+        # find out current char's byte length
+        first_char = wrap_ord(aBuf[0])
+        if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)):
+            charLen = 2
+            if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
+                self.charset_name = "CP932"
+        else:
+            charLen = 1
+
+        # return its order if it is hiragana
+        if len(aBuf) > 1:
+            second_char = wrap_ord(aBuf[1])
+            if (first_char == 202) and (0x9F <= second_char <= 0xF1):
+                return second_char - 0x9F, charLen
+
+        return -1, charLen
+
+class EUCJPContextAnalysis(JapaneseContextAnalysis):
+    def get_order(self, aBuf):
+        if not aBuf:
+            return -1, 1
+        # find out current char's byte length
+        first_char = wrap_ord(aBuf[0])
+        if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
+            charLen = 2
+        elif first_char == 0x8F:
+            charLen = 3
+        else:
+            charLen = 1
+
+        # return its order if it is hiragana
+        if len(aBuf) > 1:
+            second_char = wrap_ord(aBuf[1])
+            if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
+                return second_char - 0xA1, charLen
+
+        return -1, charLen
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/chardetect.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/chardetect.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/chardetect.py	(revision 1126)
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+"""
+Script which takes one or more file paths and reports on their detected
+encodings
+
+Example::
+
+    % chardetect somefile someotherfile
+    somefile: windows-1252 with confidence 0.5
+    someotherfile: ascii with confidence 1.0
+
+If no paths are provided, it takes its input from stdin.
+
+"""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import argparse
+import sys
+from io import open
+
+from chardet import __version__
+from chardet.universaldetector import UniversalDetector
+
+
+def description_of(lines, name='stdin'):
+    """
+    Return a string describing the probable encoding of a file or
+    list of strings.
+
+    :param lines: The lines to get the encoding of.
+    :type lines: Iterable of bytes
+    :param name: Name of file or collection of lines
+    :type name: str
+    """
+    u = UniversalDetector()
+    for line in lines:
+        u.feed(line)
+    u.close()
+    result = u.result
+    if result['encoding']:
+        return '{0}: {1} with confidence {2}'.format(name, result['encoding'],
+                                                     result['confidence'])
+    else:
+        return '{0}: no result'.format(name)
+
+
+def main(argv=None):
+    '''
+    Handles command line arguments and gets things started.
+
+    :param argv: List of arguments, as if specified on the command-line.
+                 If None, ``sys.argv[1:]`` is used instead.
+    :type argv: list of str
+    '''
+    # Get command line arguments
+    parser = argparse.ArgumentParser(
+        description="Takes one or more file paths and reports their detected \
+                     encodings",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+        conflict_handler='resolve')
+    parser.add_argument('input',
+                        help='File whose encoding we would like to determine.',
+                        type=argparse.FileType('rb'), nargs='*',
+                        default=[sys.stdin])
+    parser.add_argument('--version', action='version',
+                        version='%(prog)s {0}'.format(__version__))
+    args = parser.parse_args(argv)
+
+    for f in args.input:
+        if f.isatty():
+            print("You are running chardetect interactively. Press " +
+                  "CTRL-D twice at the start of a blank line to signal the " +
+                  "end of your input. If you want help, run chardetect " +
+                  "--help\n", file=sys.stderr)
+        print(description_of(f, f.name))
+
+
+if __name__ == '__main__':
+    main()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/escsm.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/escsm.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/escsm.py	(revision 1126)
@@ -0,0 +1,242 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .constants import eStart, eError, eItsMe
+
+HZ_cls = (
+1,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,0,0,0,0,  # 20 - 27
+0,0,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,0,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,4,0,5,2,0,  # 78 - 7f
+1,1,1,1,1,1,1,1,  # 80 - 87
+1,1,1,1,1,1,1,1,  # 88 - 8f
+1,1,1,1,1,1,1,1,  # 90 - 97
+1,1,1,1,1,1,1,1,  # 98 - 9f
+1,1,1,1,1,1,1,1,  # a0 - a7
+1,1,1,1,1,1,1,1,  # a8 - af
+1,1,1,1,1,1,1,1,  # b0 - b7
+1,1,1,1,1,1,1,1,  # b8 - bf
+1,1,1,1,1,1,1,1,  # c0 - c7
+1,1,1,1,1,1,1,1,  # c8 - cf
+1,1,1,1,1,1,1,1,  # d0 - d7
+1,1,1,1,1,1,1,1,  # d8 - df
+1,1,1,1,1,1,1,1,  # e0 - e7
+1,1,1,1,1,1,1,1,  # e8 - ef
+1,1,1,1,1,1,1,1,  # f0 - f7
+1,1,1,1,1,1,1,1,  # f8 - ff
+)
+
+HZ_st = (
+eStart,eError,     3,eStart,eStart,eStart,eError,eError,# 00-07
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f
+eItsMe,eItsMe,eError,eError,eStart,eStart,     4,eError,# 10-17
+     5,eError,     6,eError,     5,     5,     4,eError,# 18-1f
+     4,eError,     4,     4,     4,eError,     4,eError,# 20-27
+     4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f
+)
+
+HZCharLenTable = (0, 0, 0, 0, 0, 0)
+
+HZSMModel = {'classTable': HZ_cls,
+             'classFactor': 6,
+             'stateTable': HZ_st,
+             'charLenTable': HZCharLenTable,
+             'name': "HZ-GB-2312"}
+
+ISO2022CN_cls = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,0,0,0,0,  # 20 - 27
+0,3,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,4,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022CN_st = (
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07
+eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f
+eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17
+eItsMe,eItsMe,eItsMe,eError,eError,eError,     4,eError,# 18-1f
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27
+     5,     6,eError,eError,eError,eError,eError,eError,# 28-2f
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37
+eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f
+)
+
+ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022CNSMModel = {'classTable': ISO2022CN_cls,
+                    'classFactor': 9,
+                    'stateTable': ISO2022CN_st,
+                    'charLenTable': ISO2022CNCharLenTable,
+                    'name': "ISO-2022-CN"}
+
+ISO2022JP_cls = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,2,2,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,7,0,0,0,  # 20 - 27
+3,0,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+6,0,4,0,8,0,0,0,  # 40 - 47
+0,9,5,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022JP_st = (
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07
+eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17
+eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f
+eError,     5,eError,eError,eError,     4,eError,eError,# 20-27
+eError,eError,eError,     6,eItsMe,eError,eItsMe,eError,# 28-2f
+eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f
+eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47
+)
+
+ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022JPSMModel = {'classTable': ISO2022JP_cls,
+                    'classFactor': 10,
+                    'stateTable': ISO2022JP_st,
+                    'charLenTable': ISO2022JPCharLenTable,
+                    'name': "ISO-2022-JP"}
+
+ISO2022KR_cls = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,3,0,0,0,  # 20 - 27
+0,4,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,5,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022KR_st = (
+eStart,     3,eError,eStart,eStart,eStart,eError,eError,# 00-07
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f
+eItsMe,eItsMe,eError,eError,eError,     4,eError,eError,# 10-17
+eError,eError,eError,eError,     5,eError,eError,eError,# 18-1f
+eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27
+)
+
+ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0)
+
+ISO2022KRSMModel = {'classTable': ISO2022KR_cls,
+                    'classFactor': 6,
+                    'stateTable': ISO2022KR_st,
+                    'charLenTable': ISO2022KRCharLenTable,
+                    'name': "ISO-2022-KR"}
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcharsetprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcharsetprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcharsetprober.py	(revision 1126)
@@ -0,0 +1,86 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import sys
+from . import constants
+from .charsetprober import CharSetProber
+
+
+class MultiByteCharSetProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mDistributionAnalyzer = None
+        self._mCodingSM = None
+        self._mLastChar = [0, 0]
+
+    def reset(self):
+        CharSetProber.reset(self)
+        if self._mCodingSM:
+            self._mCodingSM.reset()
+        if self._mDistributionAnalyzer:
+            self._mDistributionAnalyzer.reset()
+        self._mLastChar = [0, 0]
+
+    def get_charset_name(self):
+        pass
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == constants.eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name()
+                                     + ' prober hit error at byte ' + str(i)
+                                     + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == constants.eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == constants.eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
+                                                     charLen)
+
+        self._mLastChar[0] = aBuf[aLen - 1]
+
+        if self.get_state() == constants.eDetecting:
+            if (self._mDistributionAnalyzer.got_enough_data() and
+                    (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        return self._mDistributionAnalyzer.get_confidence()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sjisprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sjisprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sjisprober.py	(revision 1126)
@@ -0,0 +1,91 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import sys
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import SJISDistributionAnalysis
+from .jpcntx import SJISContextAnalysis
+from .mbcssm import SJISSMModel
+from . import constants
+
+
+class SJISProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(SJISSMModel)
+        self._mDistributionAnalyzer = SJISDistributionAnalysis()
+        self._mContextAnalyzer = SJISContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        MultiByteCharSetProber.reset(self)
+        self._mContextAnalyzer.reset()
+
+    def get_charset_name(self):
+        return self._mContextAnalyzer.get_charset_name()
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == constants.eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name()
+                                     + ' prober hit error at byte ' + str(i)
+                                     + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == constants.eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == constants.eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:],
+                                                charLen)
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3
+                                                     - charLen], charLen)
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
+                                                     charLen)
+
+        self._mLastChar[0] = aBuf[aLen - 1]
+
+        if self.get_state() == constants.eDetecting:
+            if (self._mContextAnalyzer.got_enough_data() and
+               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        contxtCf = self._mContextAnalyzer.get_confidence()
+        distribCf = self._mDistributionAnalyzer.get_confidence()
+        return max(contxtCf, distribCf)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/compat.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/compat.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/compat.py	(revision 1126)
@@ -0,0 +1,34 @@
+######################## BEGIN LICENSE BLOCK ########################
+# Contributor(s):
+#   Ian Cordasco - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import sys
+
+
+if sys.version_info < (3, 0):
+    base_str = (str, unicode)
+else:
+    base_str = (bytes, str)
+
+
+def wrap_ord(a):
+    if sys.version_info < (3, 0) and isinstance(a, base_str):
+        return ord(a)
+    else:
+        return a
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/escprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/escprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/escprober.py	(revision 1126)
@@ -0,0 +1,86 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel,
+                    ISO2022KRSMModel)
+from .charsetprober import CharSetProber
+from .codingstatemachine import CodingStateMachine
+from .compat import wrap_ord
+
+
+class EscCharSetProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mCodingSM = [
+            CodingStateMachine(HZSMModel),
+            CodingStateMachine(ISO2022CNSMModel),
+            CodingStateMachine(ISO2022JPSMModel),
+            CodingStateMachine(ISO2022KRSMModel)
+        ]
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        for codingSM in self._mCodingSM:
+            if not codingSM:
+                continue
+            codingSM.active = True
+            codingSM.reset()
+        self._mActiveSM = len(self._mCodingSM)
+        self._mDetectedCharset = None
+
+    def get_charset_name(self):
+        return self._mDetectedCharset
+
+    def get_confidence(self):
+        if self._mDetectedCharset:
+            return 0.99
+        else:
+            return 0.00
+
+    def feed(self, aBuf):
+        for c in aBuf:
+            # PY3K: aBuf is a byte array, so c is an int, not a byte
+            for codingSM in self._mCodingSM:
+                if not codingSM:
+                    continue
+                if not codingSM.active:
+                    continue
+                codingState = codingSM.next_state(wrap_ord(c))
+                if codingState == constants.eError:
+                    codingSM.active = False
+                    self._mActiveSM -= 1
+                    if self._mActiveSM <= 0:
+                        self._mState = constants.eNotMe
+                        return self.get_state()
+                elif codingState == constants.eItsMe:
+                    self._mState = constants.eFoundIt
+                    self._mDetectedCharset = codingSM.get_coding_state_machine()  # nopep8
+                    return self.get_state()
+
+        return self.get_state()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langbulgarianmodel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langbulgarianmodel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langbulgarianmodel.py	(revision 1126)
@@ -0,0 +1,229 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+# this table is modified base on win1251BulgarianCharToOrderMap, so
+# only number <64 is sure valid
+
+Latin5_BulgarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80
+210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90
+ 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0
+ 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0
+)
+
+win1251BulgarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80
+221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90
+ 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0
+ 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 96.9392%
+# first 1024 sequences:3.0618%
+# rest  sequences:     0.2992%
+# negative sequences:  0.0020%
+BulgarianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
+3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
+0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
+0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
+0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
+0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
+0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
+2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
+3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
+1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
+3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
+1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
+2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
+2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
+3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
+1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
+2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
+2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
+1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
+2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
+2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
+2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
+1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
+2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
+1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
+3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
+1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
+3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
+1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
+2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
+1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
+2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
+1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
+2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
+1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
+2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
+1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
+0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
+1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
+1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
+1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
+0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
+1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
+1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+)
+
+Latin5BulgarianModel = {
+  'charToOrderMap': Latin5_BulgarianCharToOrderMap,
+  'precedenceMatrix': BulgarianLangModel,
+  'mTypicalPositiveRatio': 0.969392,
+  'keepEnglishLetter': False,
+  'charsetName': "ISO-8859-5"
+}
+
+Win1251BulgarianModel = {
+  'charToOrderMap': win1251BulgarianCharToOrderMap,
+  'precedenceMatrix': BulgarianLangModel,
+  'mTypicalPositiveRatio': 0.969392,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1251"
+}
+
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sbcharsetprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sbcharsetprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sbcharsetprober.py	(revision 1126)
@@ -0,0 +1,120 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import sys
+from . import constants
+from .charsetprober import CharSetProber
+from .compat import wrap_ord
+
+SAMPLE_SIZE = 64
+SB_ENOUGH_REL_THRESHOLD = 1024
+POSITIVE_SHORTCUT_THRESHOLD = 0.95
+NEGATIVE_SHORTCUT_THRESHOLD = 0.05
+SYMBOL_CAT_ORDER = 250
+NUMBER_OF_SEQ_CAT = 4
+POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1
+#NEGATIVE_CAT = 0
+
+
+class SingleByteCharSetProber(CharSetProber):
+    def __init__(self, model, reversed=False, nameProber=None):
+        CharSetProber.__init__(self)
+        self._mModel = model
+        # TRUE if we need to reverse every pair in the model lookup
+        self._mReversed = reversed
+        # Optional auxiliary prober for name decision
+        self._mNameProber = nameProber
+        self.reset()
+
+    def reset(self):
+        CharSetProber.reset(self)
+        # char order of last character
+        self._mLastOrder = 255
+        self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT
+        self._mTotalSeqs = 0
+        self._mTotalChar = 0
+        # characters that fall in our sampling range
+        self._mFreqChar = 0
+
+    def get_charset_name(self):
+        if self._mNameProber:
+            return self._mNameProber.get_charset_name()
+        else:
+            return self._mModel['charsetName']
+
+    def feed(self, aBuf):
+        if not self._mModel['keepEnglishLetter']:
+            aBuf = self.filter_without_english_letters(aBuf)
+        aLen = len(aBuf)
+        if not aLen:
+            return self.get_state()
+        for c in aBuf:
+            order = self._mModel['charToOrderMap'][wrap_ord(c)]
+            if order < SYMBOL_CAT_ORDER:
+                self._mTotalChar += 1
+            if order < SAMPLE_SIZE:
+                self._mFreqChar += 1
+                if self._mLastOrder < SAMPLE_SIZE:
+                    self._mTotalSeqs += 1
+                    if not self._mReversed:
+                        i = (self._mLastOrder * SAMPLE_SIZE) + order
+                        model = self._mModel['precedenceMatrix'][i]
+                    else:  # reverse the order of the letters in the lookup
+                        i = (order * SAMPLE_SIZE) + self._mLastOrder
+                        model = self._mModel['precedenceMatrix'][i]
+                    self._mSeqCounters[model] += 1
+            self._mLastOrder = order
+
+        if self.get_state() == constants.eDetecting:
+            if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD:
+                cf = self.get_confidence()
+                if cf > POSITIVE_SHORTCUT_THRESHOLD:
+                    if constants._debug:
+                        sys.stderr.write('%s confidence = %s, we have a'
+                                         'winner\n' %
+                                         (self._mModel['charsetName'], cf))
+                    self._mState = constants.eFoundIt
+                elif cf < NEGATIVE_SHORTCUT_THRESHOLD:
+                    if constants._debug:
+                        sys.stderr.write('%s confidence = %s, below negative'
+                                         'shortcut threshhold %s\n' %
+                                         (self._mModel['charsetName'], cf,
+                                          NEGATIVE_SHORTCUT_THRESHOLD))
+                    self._mState = constants.eNotMe
+
+        return self.get_state()
+
+    def get_confidence(self):
+        r = 0.01
+        if self._mTotalSeqs > 0:
+            r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs
+                 / self._mModel['mTypicalPositiveRatio'])
+            r = r * self._mFreqChar / self._mTotalChar
+            if r >= 1.0:
+                r = 0.99
+        return r
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langhungarianmodel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langhungarianmodel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langhungarianmodel.py	(revision 1126)
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin2_HungarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
+175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,
+ 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
+ 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
+245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+win1250HungarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
+177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
+ 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
+ 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
+245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 94.7368%
+# first 1024 sequences:5.2623%
+# rest  sequences:     0.8894%
+# negative sequences:  0.0009%
+HungarianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,
+3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,
+0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,
+1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,
+1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,
+3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,
+2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,
+2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,
+2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,
+2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,
+1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,
+1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,
+3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,
+1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,
+1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,
+2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,
+2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,
+2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,
+3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,
+1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,
+1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,
+1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,
+2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,
+1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,
+2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,
+2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,
+1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,
+1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,
+0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,
+2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,
+2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,
+1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,
+1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,
+2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,
+2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,
+2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,
+1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,
+0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin2HungarianModel = {
+  'charToOrderMap': Latin2_HungarianCharToOrderMap,
+  'precedenceMatrix': HungarianLangModel,
+  'mTypicalPositiveRatio': 0.947368,
+  'keepEnglishLetter': True,
+  'charsetName': "ISO-8859-2"
+}
+
+Win1250HungarianModel = {
+  'charToOrderMap': win1250HungarianCharToOrderMap,
+  'precedenceMatrix': HungarianLangModel,
+  'mTypicalPositiveRatio': 0.947368,
+  'keepEnglishLetter': True,
+  'charsetName': "windows-1250"
+}
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/__init__.py	(revision 1126)
@@ -0,0 +1,32 @@
+######################## BEGIN LICENSE BLOCK ########################
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+__version__ = "2.3.0"
+from sys import version_info
+
+
+def detect(aBuf):
+    if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or
+            (version_info >= (3, 0) and not isinstance(aBuf, bytes))):
+        raise ValueError('Expected a bytes object, not a unicode object')
+
+    from . import universaldetector
+    u = universaldetector.UniversalDetector()
+    u.reset()
+    u.feed(aBuf)
+    u.close()
+    return u.result
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/big5prober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/big5prober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/big5prober.py	(revision 1126)
@@ -0,0 +1,42 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import Big5DistributionAnalysis
+from .mbcssm import Big5SMModel
+
+
+class Big5Prober(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(Big5SMModel)
+        self._mDistributionAnalyzer = Big5DistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "Big5"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euctwprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euctwprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euctwprober.py	(revision 1126)
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCTWDistributionAnalysis
+from .mbcssm import EUCTWSMModel
+
+class EUCTWProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCTWSMModel)
+        self._mDistributionAnalyzer = EUCTWDistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "EUC-TW"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/latin1prober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/latin1prober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/latin1prober.py	(revision 1126)
@@ -0,0 +1,139 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .constants import eNotMe
+from .compat import wrap_ord
+
+FREQ_CAT_NUM = 4
+
+UDF = 0  # undefined
+OTH = 1  # other
+ASC = 2  # ascii capital letter
+ASS = 3  # ascii small letter
+ACV = 4  # accent capital vowel
+ACO = 5  # accent capital other
+ASV = 6  # accent small vowel
+ASO = 7  # accent small other
+CLASS_NUM = 8  # total classes
+
+Latin1_CharToClass = (
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
+    OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
+    ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
+    OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
+    ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
+    OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
+    OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
+    UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
+    OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
+    ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
+    ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
+    ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
+    ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
+    ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
+    ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
+    ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
+    ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
+)
+
+# 0 : illegal
+# 1 : very unlikely
+# 2 : normal
+# 3 : very likely
+Latin1ClassModel = (
+    # UDF OTH ASC ASS ACV ACO ASV ASO
+    0,  0,  0,  0,  0,  0,  0,  0,  # UDF
+    0,  3,  3,  3,  3,  3,  3,  3,  # OTH
+    0,  3,  3,  3,  3,  3,  3,  3,  # ASC
+    0,  3,  3,  3,  1,  1,  3,  3,  # ASS
+    0,  3,  3,  3,  1,  2,  1,  2,  # ACV
+    0,  3,  3,  3,  3,  3,  3,  3,  # ACO
+    0,  3,  1,  3,  1,  1,  1,  3,  # ASV
+    0,  3,  1,  3,  1,  1,  3,  3,  # ASO
+)
+
+
+class Latin1Prober(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self.reset()
+
+    def reset(self):
+        self._mLastCharClass = OTH
+        self._mFreqCounter = [0] * FREQ_CAT_NUM
+        CharSetProber.reset(self)
+
+    def get_charset_name(self):
+        return "windows-1252"
+
+    def feed(self, aBuf):
+        aBuf = self.filter_with_english_letters(aBuf)
+        for c in aBuf:
+            charClass = Latin1_CharToClass[wrap_ord(c)]
+            freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM)
+                                    + charClass]
+            if freq == 0:
+                self._mState = eNotMe
+                break
+            self._mFreqCounter[freq] += 1
+            self._mLastCharClass = charClass
+
+        return self.get_state()
+
+    def get_confidence(self):
+        if self.get_state() == eNotMe:
+            return 0.01
+
+        total = sum(self._mFreqCounter)
+        if total < 0.01:
+            confidence = 0.0
+        else:
+            confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0)
+                          / total)
+        if confidence < 0.0:
+            confidence = 0.0
+        # lower the confidence of latin1 so that other more accurate
+        # detector can take priority.
+        confidence = confidence * 0.73
+        return confidence
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/charsetprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/charsetprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/charsetprober.py	(revision 1126)
@@ -0,0 +1,62 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import re
+
+
+class CharSetProber:
+    def __init__(self):
+        pass
+
+    def reset(self):
+        self._mState = constants.eDetecting
+
+    def get_charset_name(self):
+        return None
+
+    def feed(self, aBuf):
+        pass
+
+    def get_state(self):
+        return self._mState
+
+    def get_confidence(self):
+        return 0.0
+
+    def filter_high_bit_only(self, aBuf):
+        aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf)
+        return aBuf
+
+    def filter_without_english_letters(self, aBuf):
+        aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf)
+        return aBuf
+
+    def filter_with_english_letters(self, aBuf):
+        # TODO
+        return aBuf
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/big5freq.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/big5freq.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/big5freq.py	(revision 1126)
@@ -0,0 +1,925 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Big5 frequency table
+# by Taiwan's Mandarin Promotion Council
+# <http://www.edu.tw:81/mandr/>
+#
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+#Char to FreqOrder table
+BIG5_TABLE_SIZE = 5376
+
+Big5CharToFreqOrder = (
+   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
+3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
+1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
+  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
+3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
+4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
+5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
+ 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
+ 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
+ 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
+2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
+1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
+3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
+ 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
+3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
+2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
+ 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
+3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
+1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
+5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
+ 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
+5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
+1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
+  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
+ 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
+3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
+3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
+ 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
+2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
+2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
+ 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
+ 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
+3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
+1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
+1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
+1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
+2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
+ 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
+4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
+1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
+5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
+2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
+ 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
+  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
+ 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
+ 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
+5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
+ 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
+1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
+ 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
+ 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
+5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
+1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
+ 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
+3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
+4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
+3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
+ 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
+ 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
+1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
+4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
+3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
+3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
+2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
+5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
+3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
+5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
+1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
+2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
+1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
+  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
+1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
+4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
+3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
+ 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
+ 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
+ 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
+2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
+5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
+1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
+2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
+1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
+1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
+5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
+5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
+5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
+3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
+4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
+4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
+2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
+5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
+3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
+ 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
+5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
+5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
+1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
+2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
+3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
+4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
+5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
+3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
+4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
+1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
+1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
+4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
+1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
+ 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
+1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
+1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
+3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
+ 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
+5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
+2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
+1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
+1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
+5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
+ 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
+4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
+ 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
+2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
+ 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
+1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
+1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
+ 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
+4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
+4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
+1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
+3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
+5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
+5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
+1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
+2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
+1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
+3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
+2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
+3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
+2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
+4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
+4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
+3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
+  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
+3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
+ 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
+3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
+4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
+3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
+1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
+5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
+ 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
+5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
+1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
+ 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
+4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
+4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
+ 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
+2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
+2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
+3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
+1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
+4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
+2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
+1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
+1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
+2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
+3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
+1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
+5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
+1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
+4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
+1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
+ 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
+1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
+4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
+4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
+2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
+1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
+4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
+ 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
+5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
+2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
+3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
+4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
+ 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
+5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
+5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
+1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
+4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
+4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
+2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
+3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
+3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
+2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
+1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
+4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
+3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
+3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
+2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
+4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
+5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
+3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
+2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
+3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
+1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
+2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
+3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
+4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
+2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
+2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
+5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
+1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
+2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
+1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
+3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
+4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
+2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
+3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
+3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
+2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
+4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
+2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
+3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
+4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
+5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
+3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
+ 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
+1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
+4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
+1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
+4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
+5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
+ 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
+5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
+5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
+2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
+3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
+2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
+2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
+ 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
+1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
+4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
+3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
+3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
+ 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
+2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
+ 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
+2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
+4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
+1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
+4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
+1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
+3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
+ 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
+3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
+5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
+5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
+3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
+3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
+1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
+2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
+5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
+1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
+1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
+3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
+ 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
+1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
+4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
+5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
+2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
+3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
+ 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
+1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
+2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
+2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
+5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
+5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
+5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
+2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
+2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
+1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
+4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
+3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
+3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
+4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
+4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
+2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
+2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
+5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
+4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
+5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
+4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
+ 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
+ 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
+1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
+3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
+4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
+1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
+5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
+2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
+2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
+3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
+5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
+1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
+3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
+5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
+1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
+5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
+2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
+3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
+2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
+3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
+3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
+3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
+4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
+ 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
+2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
+4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
+3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
+5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
+1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
+5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
+ 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
+1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
+ 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
+4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
+1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
+4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
+1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
+ 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
+3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
+4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
+5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
+ 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
+3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
+ 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
+2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376  #last 512
+#Everything below is of no interest for detection purpose
+2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392
+2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408
+5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424
+5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440
+5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456
+5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472
+5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488
+5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504
+5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520
+5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536
+5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552
+5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568
+5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584
+5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600
+6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616
+6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632
+6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648
+6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664
+6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680
+6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696
+6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712
+6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728
+6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744
+6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760
+6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776
+6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792
+6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808
+6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824
+6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840
+6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856
+6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872
+6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888
+6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904
+6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920
+6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936
+6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952
+6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968
+6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984
+6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000
+6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016
+6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032
+6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048
+6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064
+6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080
+6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096
+6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112
+6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128
+6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144
+6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160
+6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176
+6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192
+6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208
+6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224
+6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240
+6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256
+3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272
+6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288
+6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304
+3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320
+6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336
+6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352
+6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368
+6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384
+6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400
+6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416
+6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432
+4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448
+6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464
+6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480
+3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496
+6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512
+6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528
+6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544
+6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560
+6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576
+6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592
+6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608
+6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624
+6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640
+6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656
+6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672
+7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688
+7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704
+7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720
+7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736
+7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752
+7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768
+7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784
+7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800
+7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816
+7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832
+7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848
+7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864
+7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880
+7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896
+7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912
+7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928
+7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944
+7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960
+7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976
+7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992
+7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008
+7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024
+7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040
+7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056
+7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072
+7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088
+7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104
+7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120
+7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136
+7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152
+7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168
+7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184
+7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200
+7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216
+7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248
+7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264
+7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280
+7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296
+7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312
+7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328
+7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344
+7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360
+7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376
+7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392
+7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408
+7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424
+7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440
+3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456
+7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472
+7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488
+7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504
+7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520
+4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536
+7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552
+7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568
+7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584
+7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600
+7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616
+7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632
+7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648
+7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664
+7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680
+7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696
+7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712
+8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728
+8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744
+8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760
+8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776
+8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792
+8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808
+8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824
+8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840
+8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856
+8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872
+8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888
+8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904
+8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920
+8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936
+8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952
+8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968
+8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984
+8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016
+8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032
+8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048
+8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064
+8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080
+8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096
+8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112
+8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128
+8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144
+8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160
+8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176
+8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192
+8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208
+8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224
+8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240
+8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256
+8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272
+8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288
+8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304
+8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320
+8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336
+8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352
+8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368
+8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384
+8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400
+8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416
+8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448
+8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464
+8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480
+8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496
+8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512
+8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528
+8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544
+8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560
+8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576
+8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592
+8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608
+8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624
+8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640
+8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656
+8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672
+8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688
+4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704
+8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720
+8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736
+8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752
+8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768
+9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784
+9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800
+9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816
+9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832
+9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848
+9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864
+9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880
+9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896
+9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912
+9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928
+9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944
+9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960
+9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976
+9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992
+9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008
+9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024
+9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040
+9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056
+9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072
+9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088
+9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104
+9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120
+9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136
+9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152
+9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168
+9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184
+9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200
+9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216
+9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232
+9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248
+9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264
+9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280
+9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296
+9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312
+9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328
+9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344
+9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360
+9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376
+3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392
+9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408
+9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424
+9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440
+4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456
+9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472
+9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488
+9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504
+9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520
+9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536
+9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552
+9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568
+9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584
+9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600
+9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616
+9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632
+9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648
+9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664
+9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680
+9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696
+9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712
+9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728
+9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744
+9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760
+9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776
+9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792
+9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808
+9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824
+10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840
+10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856
+10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872
+10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888
+10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904
+10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920
+10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936
+10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952
+10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968
+4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984
+10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000
+10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016
+10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032
+10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048
+10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064
+10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080
+10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096
+10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112
+4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128
+10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144
+10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160
+10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176
+10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192
+10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208
+10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224
+10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240
+10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256
+10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272
+10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288
+10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304
+10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320
+10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336
+10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352
+10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368
+10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384
+10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400
+4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416
+10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432
+10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448
+10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464
+10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480
+10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496
+10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512
+10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528
+10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544
+10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560
+10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576
+10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592
+10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608
+10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624
+10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640
+10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656
+10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672
+10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688
+10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704
+10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720
+10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736
+10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752
+10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768
+10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784
+10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800
+10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816
+10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832
+10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848
+10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864
+10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880
+10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896
+11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912
+11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928
+11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944
+4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960
+11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976
+11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992
+11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008
+11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024
+11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040
+11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056
+11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072
+11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088
+11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104
+11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120
+11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136
+11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152
+11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168
+11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184
+11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200
+11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216
+11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232
+11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248
+11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264
+11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280
+11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296
+11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312
+11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328
+11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344
+11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360
+11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376
+11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392
+11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408
+11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424
+11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440
+11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456
+11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472
+4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488
+11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504
+11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520
+11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536
+11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552
+11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568
+11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584
+11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600
+11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616
+11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632
+11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648
+11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664
+11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680
+11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696
+11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712
+11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728
+11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744
+11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760
+11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776
+11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792
+11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808
+11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824
+11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840
+11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856
+11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872
+11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888
+11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904
+11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920
+11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936
+12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952
+12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968
+12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984
+12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000
+12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016
+12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032
+12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048
+12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064
+12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080
+12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096
+12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112
+12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128
+12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144
+12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160
+12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176
+4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192
+4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208
+4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224
+12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240
+12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256
+12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272
+12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288
+12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304
+12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320
+12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336
+12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352
+12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368
+12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384
+12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400
+12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416
+12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432
+12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448
+12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464
+12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480
+12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496
+12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512
+12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528
+12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544
+12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560
+12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576
+12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592
+12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608
+12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624
+12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640
+12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656
+12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672
+12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688
+12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704
+12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720
+12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736
+12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752
+12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768
+12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784
+12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800
+12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816
+12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832
+12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848
+12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864
+12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880
+12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896
+12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912
+12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928
+12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944
+12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960
+12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976
+4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992
+13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008
+13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024
+13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040
+13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056
+13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072
+13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088
+13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104
+4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120
+13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136
+13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152
+13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168
+13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184
+13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200
+13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216
+13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232
+13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248
+13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264
+13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280
+13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296
+13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312
+13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328
+13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344
+13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360
+5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376
+13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392
+13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408
+13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424
+13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440
+13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456
+13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472
+13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488
+13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504
+13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520
+13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536
+13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552
+13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568
+13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584
+13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600
+13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616
+13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632
+13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648
+13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664
+13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680
+13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696
+13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712
+13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728
+13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744
+13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760
+13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776
+13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792
+13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808
+13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824
+13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840
+13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856
+13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872
+13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888
+13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904
+13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920
+13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936
+13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952
+13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968
+13968,13969,13970,13971,13972) #13973
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euctwfreq.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euctwfreq.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euctwfreq.py	(revision 1126)
@@ -0,0 +1,428 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# EUCTW frequency table
+# Converted from big5 work
+# by Taiwan's Mandarin Promotion Council
+# <http:#www.edu.tw:81/mandr/>
+
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+# Char to FreqOrder table ,
+EUCTW_TABLE_SIZE = 8102
+
+EUCTWCharToFreqOrder = (
+   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110, # 2742
+3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643, # 2758
+1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931, # 2774
+  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790
+3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806
+4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604, # 2822
+7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80, # 2838
+ 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591, # 2854
+ 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870
+ 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886
+2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732, # 2902
+1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918
+3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934
+ 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246, # 2950
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966
+3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897, # 2982
+2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300, # 2998
+ 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014
+3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030
+1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046
+7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212, # 3062
+ 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876, # 3078
+7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029, # 3094
+1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305, # 3110
+  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788, # 3126
+ 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142
+3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794, # 3158
+3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707, # 3174
+ 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190
+2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346, # 3206
+2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222
+ 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238
+ 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254
+3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270
+1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286
+1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302
+1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7, # 3318
+2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334
+ 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350
+4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366
+1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382
+7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398
+2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414
+ 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430
+  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446
+ 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592, # 3462
+ 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478
+7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258, # 3494
+ 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510
+1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372, # 3526
+ 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542
+ 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558
+7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574
+1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590
+ 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606
+3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622
+4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638
+3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654
+ 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670
+ 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686
+1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702
+4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680, # 3718
+3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734
+3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750
+2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766
+7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809, # 3782
+3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798
+7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814
+1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830
+2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846
+1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862
+  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878
+1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894
+4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910
+3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926
+ 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942
+ 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816, # 3958
+ 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974
+2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990
+7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006
+1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022
+2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038
+1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054
+1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070
+7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086
+7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102
+7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118
+3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134
+4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150
+1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166
+7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182
+2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198
+7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214
+3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230
+3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473, # 4246
+7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262
+2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278
+7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294
+ 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310
+4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326
+2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342
+7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358
+3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374
+2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390
+2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366, # 4406
+ 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422
+2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438
+1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454
+1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470
+2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486
+1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502
+7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518
+7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534
+2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550
+4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566
+1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122, # 4582
+7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598
+ 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614
+4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630
+ 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646
+2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662
+ 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678
+1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694
+1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710
+ 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726
+3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742
+3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758
+1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774
+3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790
+7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806
+7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545, # 4822
+1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838
+2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854
+1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870
+3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886
+2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902
+3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918
+2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934
+4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950
+4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966
+3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982
+  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998
+3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014
+ 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030
+3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046
+3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062
+3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078
+1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094
+7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110
+ 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126
+7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142
+1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158
+ 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174
+4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730, # 5190
+3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206
+ 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222
+2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238
+2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686, # 5254
+3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270
+1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286
+4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302
+2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318
+1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334
+1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350
+2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366
+3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382
+1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398
+7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141, # 5414
+1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430
+4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625, # 5446
+1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462
+ 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478
+1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494
+3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510
+3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526
+2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542
+1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558
+4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574
+ 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590
+7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606
+2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622
+3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638
+4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654
+ 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670
+7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686
+7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702
+1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718
+4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734
+3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750
+2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590, # 5766
+3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782
+3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798
+2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814
+1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830
+4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846
+3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862
+3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878
+2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894
+4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977, # 5910
+7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926
+3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942
+2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958
+3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974
+1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990
+2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006
+3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022
+4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090, # 6038
+2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054
+2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070
+7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086
+1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102
+2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118
+1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134
+3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150
+4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838, # 6166
+2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182
+3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198
+3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214
+2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230
+4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246
+2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262
+3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278
+4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294
+7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310
+3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326
+ 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342
+1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632, # 6358
+4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374
+1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390
+4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769, # 6406
+7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422
+ 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438
+7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454
+2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470
+1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486
+1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502
+3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518
+ 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534
+ 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550
+ 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566
+3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582
+2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598
+ 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614
+7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630
+1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646
+3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662
+7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678
+1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694
+7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710
+4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726
+1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742
+2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758
+2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774
+4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790
+ 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806
+ 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822
+3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838
+3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854
+1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870
+2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886
+7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902
+1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918
+1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934
+3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950
+ 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966
+1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982
+4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998
+7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014
+2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030
+3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046
+ 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062
+1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078
+2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094
+2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110
+7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126
+7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142
+7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158
+2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174
+2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190
+1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206
+4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222
+3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238
+3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254
+4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270
+4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286
+2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302
+2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318
+7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334
+4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350
+7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366
+2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382
+1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398
+3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414
+4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430
+2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446
+ 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462
+2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478
+1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494
+2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510
+2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526
+4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542
+7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558
+1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574
+3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590
+7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606
+1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622
+8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638
+2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654
+8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670
+2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686
+2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702
+8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718
+8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734
+8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750
+ 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766
+8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782
+4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798
+3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814
+8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830
+1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846
+8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862
+ 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878
+1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894
+ 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910
+4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926
+1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942
+4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958
+1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974
+ 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990
+3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006
+4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022
+8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038
+ 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054
+3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070
+ 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086
+2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102
+#Everything below is of no interest for detection purpose
+2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118
+2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134
+8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150
+8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166
+8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182
+8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198
+8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214
+8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230
+8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246
+8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262
+8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294
+8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310
+8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326
+8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342
+8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358
+8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374
+8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390
+8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406
+8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422
+8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438
+8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454
+8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470
+8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486
+8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502
+8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518
+8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534
+8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550
+8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566
+8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582
+8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598
+8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614
+8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630
+8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646
+8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662
+8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678
+8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694
+8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710
+8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726
+8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langthaimodel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langthaimodel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langthaimodel.py	(revision 1126)
@@ -0,0 +1,200 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# The following result for thai was collected from a limited sample (1M).
+
+# Character Mapping Table:
+TIS620CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40
+188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50
+253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60
+ 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70
+209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
+223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
+236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,
+ 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,
+ 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,
+ 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
+ 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,
+ 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 92.6386%
+# first 1024 sequences:7.3177%
+# rest  sequences:     1.0230%
+# negative sequences:  0.0436%
+ThaiLangModel = (
+0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,
+0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,
+3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,
+0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,
+3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,
+3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,
+3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,
+3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,
+2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,
+3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,
+1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,
+3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,
+1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,
+0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,
+0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,
+2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,
+0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,
+3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,
+2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,
+2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,
+3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,
+3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,
+3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,
+3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,
+1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,
+0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,
+0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
+3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,
+3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,
+1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,
+3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,
+3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,
+0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,
+0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,
+1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,
+1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,
+3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,
+0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,
+3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,
+0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,
+0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,
+0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,
+0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,
+0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,
+0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,
+0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,
+0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
+3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,
+2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
+0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,
+3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,
+1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
+1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+TIS620ThaiModel = {
+  'charToOrderMap': TIS620CharToOrderMap,
+  'precedenceMatrix': ThaiLangModel,
+  'mTypicalPositiveRatio': 0.926386,
+  'keepEnglishLetter': False,
+  'charsetName': "TIS-620"
+}
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/gb2312prober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/gb2312prober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/gb2312prober.py	(revision 1126)
@@ -0,0 +1,41 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import GB2312DistributionAnalysis
+from .mbcssm import GB2312SMModel
+
+class GB2312Prober(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(GB2312SMModel)
+        self._mDistributionAnalyzer = GB2312DistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "GB2312"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcsgroupprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcsgroupprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcsgroupprober.py	(revision 1126)
@@ -0,0 +1,54 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetgroupprober import CharSetGroupProber
+from .utf8prober import UTF8Prober
+from .sjisprober import SJISProber
+from .eucjpprober import EUCJPProber
+from .gb2312prober import GB2312Prober
+from .euckrprober import EUCKRProber
+from .cp949prober import CP949Prober
+from .big5prober import Big5Prober
+from .euctwprober import EUCTWProber
+
+
+class MBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        CharSetGroupProber.__init__(self)
+        self._mProbers = [
+            UTF8Prober(),
+            SJISProber(),
+            EUCJPProber(),
+            GB2312Prober(),
+            EUCKRProber(),
+            CP949Prober(),
+            Big5Prober(),
+            EUCTWProber()
+        ]
+        self.reset()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/constants.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/constants.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/constants.py	(revision 1126)
@@ -0,0 +1,39 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+_debug = 0
+
+eDetecting = 0
+eFoundIt = 1
+eNotMe = 2
+
+eStart = 0
+eError = 1
+eItsMe = 2
+
+SHORTCUT_THRESHOLD = 0.95
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/chardistribution.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/chardistribution.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/chardistribution.py	(revision 1126)
@@ -0,0 +1,231 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE,
+                        EUCTW_TYPICAL_DISTRIBUTION_RATIO)
+from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE,
+                        EUCKR_TYPICAL_DISTRIBUTION_RATIO)
+from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE,
+                         GB2312_TYPICAL_DISTRIBUTION_RATIO)
+from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE,
+                       BIG5_TYPICAL_DISTRIBUTION_RATIO)
+from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE,
+                      JIS_TYPICAL_DISTRIBUTION_RATIO)
+from .compat import wrap_ord
+
+ENOUGH_DATA_THRESHOLD = 1024
+SURE_YES = 0.99
+SURE_NO = 0.01
+MINIMUM_DATA_THRESHOLD = 3
+
+
+class CharDistributionAnalysis:
+    def __init__(self):
+        # Mapping table to get frequency order from char order (get from
+        # GetOrder())
+        self._mCharToFreqOrder = None
+        self._mTableSize = None  # Size of above table
+        # This is a constant value which varies from language to language,
+        # used in calculating confidence.  See
+        # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
+        # for further detail.
+        self._mTypicalDistributionRatio = None
+        self.reset()
+
+    def reset(self):
+        """reset analyser, clear any state"""
+        # If this flag is set to True, detection is done and conclusion has
+        # been made
+        self._mDone = False
+        self._mTotalChars = 0  # Total characters encountered
+        # The number of characters whose frequency order is less than 512
+        self._mFreqChars = 0
+
+    def feed(self, aBuf, aCharLen):
+        """feed a character with known length"""
+        if aCharLen == 2:
+            # we only care about 2-bytes character in our distribution analysis
+            order = self.get_order(aBuf)
+        else:
+            order = -1
+        if order >= 0:
+            self._mTotalChars += 1
+            # order is valid
+            if order < self._mTableSize:
+                if 512 > self._mCharToFreqOrder[order]:
+                    self._mFreqChars += 1
+
+    def get_confidence(self):
+        """return confidence based on existing data"""
+        # if we didn't receive any character in our consideration range,
+        # return negative answer
+        if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD:
+            return SURE_NO
+
+        if self._mTotalChars != self._mFreqChars:
+            r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars)
+                 * self._mTypicalDistributionRatio))
+            if r < SURE_YES:
+                return r
+
+        # normalize confidence (we don't want to be 100% sure)
+        return SURE_YES
+
+    def got_enough_data(self):
+        # It is not necessary to receive all data to draw conclusion.
+        # For charset detection, certain amount of data is enough
+        return self._mTotalChars > ENOUGH_DATA_THRESHOLD
+
+    def get_order(self, aBuf):
+        # We do not handle characters based on the original encoding string,
+        # but convert this encoding string to a number, here called order.
+        # This allows multiple encodings of a language to share one frequency
+        # table.
+        return -1
+
+
+class EUCTWDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = EUCTWCharToFreqOrder
+        self._mTableSize = EUCTW_TABLE_SIZE
+        self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for euc-TW encoding, we are interested
+        #   first  byte range: 0xc4 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char = wrap_ord(aBuf[0])
+        if first_char >= 0xC4:
+            return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1
+        else:
+            return -1
+
+
+class EUCKRDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = EUCKRCharToFreqOrder
+        self._mTableSize = EUCKR_TABLE_SIZE
+        self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for euc-KR encoding, we are interested
+        #   first  byte range: 0xb0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char = wrap_ord(aBuf[0])
+        if first_char >= 0xB0:
+            return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1
+        else:
+            return -1
+
+
+class GB2312DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = GB2312CharToFreqOrder
+        self._mTableSize = GB2312_TABLE_SIZE
+        self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for GB2312 encoding, we are interested
+        #  first  byte range: 0xb0 -- 0xfe
+        #  second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
+        if (first_char >= 0xB0) and (second_char >= 0xA1):
+            return 94 * (first_char - 0xB0) + second_char - 0xA1
+        else:
+            return -1
+
+
+class Big5DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = Big5CharToFreqOrder
+        self._mTableSize = BIG5_TABLE_SIZE
+        self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for big5 encoding, we are interested
+        #   first  byte range: 0xa4 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
+        if first_char >= 0xA4:
+            if second_char >= 0xA1:
+                return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
+            else:
+                return 157 * (first_char - 0xA4) + second_char - 0x40
+        else:
+            return -1
+
+
+class SJISDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = JISCharToFreqOrder
+        self._mTableSize = JIS_TABLE_SIZE
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for sjis encoding, we are interested
+        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
+        if (first_char >= 0x81) and (first_char <= 0x9F):
+            order = 188 * (first_char - 0x81)
+        elif (first_char >= 0xE0) and (first_char <= 0xEF):
+            order = 188 * (first_char - 0xE0 + 31)
+        else:
+            return -1
+        order = order + second_char - 0x40
+        if second_char > 0x7F:
+            order = -1
+        return order
+
+
+class EUCJPDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        CharDistributionAnalysis.__init__(self)
+        self._mCharToFreqOrder = JISCharToFreqOrder
+        self._mTableSize = JIS_TABLE_SIZE
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, aBuf):
+        # for euc-JP encoding, we are interested
+        #   first  byte range: 0xa0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        char = wrap_ord(aBuf[0])
+        if char >= 0xA0:
+            return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1
+        else:
+            return -1
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/gb2312freq.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/gb2312freq.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/gb2312freq.py	(revision 1126)
@@ -0,0 +1,472 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# GB2312 most frequently used character table
+#
+# Char to FreqOrder table , from hz6763
+
+# 512  --> 0.79  -- 0.79
+# 1024 --> 0.92  -- 0.13
+# 2048 --> 0.98  -- 0.06
+# 6768 --> 1.00  -- 0.02
+#
+# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
+# Random Distribution Ration = 512 / (3755 - 512) = 0.157
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
+
+GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
+
+GB2312_TABLE_SIZE = 3760
+
+GB2312CharToFreqOrder = (
+1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
+2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
+2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
+ 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
+1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
+1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
+ 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
+1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
+2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
+3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
+ 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
+1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
+ 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
+2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
+ 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
+2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
+1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
+3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
+ 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
+1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
+ 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
+2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
+1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
+3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
+1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
+2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
+1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
+ 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
+3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
+3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
+ 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
+3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
+ 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
+1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
+3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
+2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
+1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
+ 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
+1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
+4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
+ 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
+3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
+3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
+ 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
+1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
+2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
+1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
+1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
+ 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
+3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
+3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
+4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
+ 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
+3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
+1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
+1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
+4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
+ 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
+ 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
+3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
+1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
+ 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
+1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
+2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
+ 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
+ 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
+ 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
+3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
+4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
+3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
+ 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
+2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
+2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
+2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
+ 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
+2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
+ 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
+ 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
+ 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
+3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
+2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
+2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
+1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
+  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
+2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
+  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
+ 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
+1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
+1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
+ 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
+ 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
+1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
+2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
+3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
+2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
+2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
+2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
+3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
+1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
+1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
+2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
+1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
+3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
+1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
+1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
+3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
+ 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
+2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
+1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
+4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
+1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
+1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
+3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
+1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
+  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
+ 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
+1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
+ 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
+1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
+1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
+ 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
+3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
+4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
+3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
+2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
+2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
+1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
+3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
+2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
+1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
+1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
+ 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
+2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
+2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
+3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
+4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
+3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
+ 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
+3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
+2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
+1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
+ 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
+ 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
+3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
+4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
+2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
+1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
+1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
+ 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
+1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
+3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
+ 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
+ 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
+1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
+  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
+1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
+ 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
+2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
+ 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
+2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
+2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
+1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
+1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
+2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
+ 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
+1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
+1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
+2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
+2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
+3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
+1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
+4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
+ 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
+ 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
+3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
+1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
+ 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
+3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
+1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
+4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
+1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
+2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
+1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
+ 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
+1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
+3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
+ 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
+2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
+ 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
+1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
+1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
+1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
+3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
+2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
+3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
+3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
+3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
+ 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
+2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
+ 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
+2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
+  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
+1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
+ 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
+ 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
+1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
+3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
+3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
+1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
+1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
+3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
+2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
+2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
+1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
+3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
+ 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
+4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
+1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
+2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
+3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
+3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
+1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
+ 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
+ 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
+2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
+ 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
+1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
+ 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
+1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
+1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
+1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
+1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
+1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
+ 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
+ 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  # last 512
+#Everything below is of no interest for detection purpose
+5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636,
+5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874,
+5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278,
+3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806,
+4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827,
+5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512,
+5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578,
+4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828,
+4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105,
+4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189,
+4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561,
+3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226,
+6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778,
+4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039,
+6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404,
+4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213,
+4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739,
+4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328,
+5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592,
+3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424,
+4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270,
+3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232,
+4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456,
+4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121,
+6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971,
+6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409,
+5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519,
+4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367,
+6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834,
+4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460,
+5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464,
+5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709,
+5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906,
+6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530,
+3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262,
+6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920,
+4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190,
+5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318,
+6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538,
+6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697,
+4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544,
+5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016,
+4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638,
+5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006,
+5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071,
+4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552,
+4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556,
+5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432,
+4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632,
+4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885,
+5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336,
+4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729,
+4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854,
+4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332,
+5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004,
+5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419,
+4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293,
+3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580,
+4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339,
+6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341,
+5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493,
+5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046,
+4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904,
+6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728,
+5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350,
+6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233,
+4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944,
+5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413,
+5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700,
+3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999,
+5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694,
+6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571,
+4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359,
+6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178,
+4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421,
+4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330,
+6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855,
+3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587,
+6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803,
+4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791,
+3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304,
+3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445,
+3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506,
+4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856,
+2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057,
+5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777,
+4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369,
+5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028,
+5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914,
+5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175,
+4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681,
+5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534,
+4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912,
+5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054,
+1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336,
+3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666,
+4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375,
+4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113,
+6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614,
+4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173,
+5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197,
+3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271,
+5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423,
+5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529,
+5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921,
+3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837,
+5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922,
+5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187,
+3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382,
+5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628,
+5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683,
+5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053,
+6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928,
+4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662,
+6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663,
+4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554,
+3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191,
+4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013,
+5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932,
+5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055,
+5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829,
+3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096,
+3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660,
+6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199,
+6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748,
+5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402,
+6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957,
+6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668,
+6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763,
+6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407,
+6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051,
+5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429,
+6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791,
+6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028,
+3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305,
+3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159,
+4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683,
+4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372,
+3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514,
+5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544,
+5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472,
+5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716,
+5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905,
+5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327,
+4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030,
+5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281,
+6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224,
+5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327,
+4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062,
+4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354,
+6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065,
+3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953,
+4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681,
+4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708,
+5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442,
+6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387,
+6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237,
+4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713,
+6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547,
+5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957,
+5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337,
+5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074,
+5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685,
+5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455,
+4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722,
+5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615,
+5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093,
+5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989,
+5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094,
+6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212,
+4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967,
+5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733,
+4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260,
+4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864,
+6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353,
+4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095,
+6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287,
+3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504,
+5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539,
+6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750,
+6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864,
+6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213,
+5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573,
+6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252,
+6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970,
+3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703,
+5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978,
+4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767)
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/eucjpprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/eucjpprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/eucjpprober.py	(revision 1126)
@@ -0,0 +1,90 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import sys
+from . import constants
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCJPDistributionAnalysis
+from .jpcntx import EUCJPContextAnalysis
+from .mbcssm import EUCJPSMModel
+
+
+class EUCJPProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCJPSMModel)
+        self._mDistributionAnalyzer = EUCJPDistributionAnalysis()
+        self._mContextAnalyzer = EUCJPContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        MultiByteCharSetProber.reset(self)
+        self._mContextAnalyzer.reset()
+
+    def get_charset_name(self):
+        return "EUC-JP"
+
+    def feed(self, aBuf):
+        aLen = len(aBuf)
+        for i in range(0, aLen):
+            # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte
+            codingState = self._mCodingSM.next_state(aBuf[i])
+            if codingState == constants.eError:
+                if constants._debug:
+                    sys.stderr.write(self.get_charset_name()
+                                     + ' prober hit error at byte ' + str(i)
+                                     + '\n')
+                self._mState = constants.eNotMe
+                break
+            elif codingState == constants.eItsMe:
+                self._mState = constants.eFoundIt
+                break
+            elif codingState == constants.eStart:
+                charLen = self._mCodingSM.get_current_charlen()
+                if i == 0:
+                    self._mLastChar[1] = aBuf[0]
+                    self._mContextAnalyzer.feed(self._mLastChar, charLen)
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
+                else:
+                    self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen)
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
+                                                     charLen)
+
+        self._mLastChar[0] = aBuf[aLen - 1]
+
+        if self.get_state() == constants.eDetecting:
+            if (self._mContextAnalyzer.got_enough_data() and
+               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
+                self._mState = constants.eFoundIt
+
+        return self.get_state()
+
+    def get_confidence(self):
+        contxtCf = self._mContextAnalyzer.get_confidence()
+        distribCf = self._mDistributionAnalyzer.get_confidence()
+        return max(contxtCf, distribCf)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/charsetgroupprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/charsetgroupprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/charsetgroupprober.py	(revision 1126)
@@ -0,0 +1,106 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+# 
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+# 
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from . import constants
+import sys
+from .charsetprober import CharSetProber
+
+
+class CharSetGroupProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mActiveNum = 0
+        self._mProbers = []
+        self._mBestGuessProber = None
+
+    def reset(self):
+        CharSetProber.reset(self)
+        self._mActiveNum = 0
+        for prober in self._mProbers:
+            if prober:
+                prober.reset()
+                prober.active = True
+                self._mActiveNum += 1
+        self._mBestGuessProber = None
+
+    def get_charset_name(self):
+        if not self._mBestGuessProber:
+            self.get_confidence()
+            if not self._mBestGuessProber:
+                return None
+#                self._mBestGuessProber = self._mProbers[0]
+        return self._mBestGuessProber.get_charset_name()
+
+    def feed(self, aBuf):
+        for prober in self._mProbers:
+            if not prober:
+                continue
+            if not prober.active:
+                continue
+            st = prober.feed(aBuf)
+            if not st:
+                continue
+            if st == constants.eFoundIt:
+                self._mBestGuessProber = prober
+                return self.get_state()
+            elif st == constants.eNotMe:
+                prober.active = False
+                self._mActiveNum -= 1
+                if self._mActiveNum <= 0:
+                    self._mState = constants.eNotMe
+                    return self.get_state()
+        return self.get_state()
+
+    def get_confidence(self):
+        st = self.get_state()
+        if st == constants.eFoundIt:
+            return 0.99
+        elif st == constants.eNotMe:
+            return 0.01
+        bestConf = 0.0
+        self._mBestGuessProber = None
+        for prober in self._mProbers:
+            if not prober:
+                continue
+            if not prober.active:
+                if constants._debug:
+                    sys.stderr.write(prober.get_charset_name()
+                                     + ' not active\n')
+                continue
+            cf = prober.get_confidence()
+            if constants._debug:
+                sys.stderr.write('%s confidence = %s\n' %
+                                 (prober.get_charset_name(), cf))
+            if bestConf < cf:
+                bestConf = cf
+                self._mBestGuessProber = prober
+        if not self._mBestGuessProber:
+            return 0.0
+        return bestConf
+#        else:
+#            self._mBestGuessProber = self._mProbers[0]
+#            return self._mBestGuessProber.get_confidence()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langgreekmodel.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langgreekmodel.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/langgreekmodel.py	(revision 1126)
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin7_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+win1253_CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 98.2851%
+# first 1024 sequences:1.7001%
+# rest  sequences:     0.0359%
+# negative sequences:  0.0148%
+GreekLangModel = (
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,
+2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,
+2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,
+2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,
+0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,
+3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,
+2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,
+0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,
+0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,
+0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,
+0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,
+0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,
+0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,
+0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,
+0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,
+0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,
+0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,
+0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,
+0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,
+0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,
+0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,
+0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,
+0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,
+0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,
+0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin7GreekModel = {
+  'charToOrderMap': Latin7_CharToOrderMap,
+  'precedenceMatrix': GreekLangModel,
+  'mTypicalPositiveRatio': 0.982851,
+  'keepEnglishLetter': False,
+  'charsetName': "ISO-8859-7"
+}
+
+Win1253GreekModel = {
+  'charToOrderMap': win1253_CharToOrderMap,
+  'precedenceMatrix': GreekLangModel,
+  'mTypicalPositiveRatio': 0.982851,
+  'keepEnglishLetter': False,
+  'charsetName': "windows-1253"
+}
+
+# flake8: noqa
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sbcsgroupprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sbcsgroupprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/sbcsgroupprober.py	(revision 1126)
@@ -0,0 +1,69 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetgroupprober import CharSetGroupProber
+from .sbcharsetprober import SingleByteCharSetProber
+from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel,
+                                Latin5CyrillicModel, MacCyrillicModel,
+                                Ibm866Model, Ibm855Model)
+from .langgreekmodel import Latin7GreekModel, Win1253GreekModel
+from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel
+from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel
+from .langthaimodel import TIS620ThaiModel
+from .langhebrewmodel import Win1255HebrewModel
+from .hebrewprober import HebrewProber
+
+
+class SBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        CharSetGroupProber.__init__(self)
+        self._mProbers = [
+            SingleByteCharSetProber(Win1251CyrillicModel),
+            SingleByteCharSetProber(Koi8rModel),
+            SingleByteCharSetProber(Latin5CyrillicModel),
+            SingleByteCharSetProber(MacCyrillicModel),
+            SingleByteCharSetProber(Ibm866Model),
+            SingleByteCharSetProber(Ibm855Model),
+            SingleByteCharSetProber(Latin7GreekModel),
+            SingleByteCharSetProber(Win1253GreekModel),
+            SingleByteCharSetProber(Latin5BulgarianModel),
+            SingleByteCharSetProber(Win1251BulgarianModel),
+            SingleByteCharSetProber(Latin2HungarianModel),
+            SingleByteCharSetProber(Win1250HungarianModel),
+            SingleByteCharSetProber(TIS620ThaiModel),
+        ]
+        hebrewProber = HebrewProber()
+        logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel,
+                                                      False, hebrewProber)
+        visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True,
+                                                     hebrewProber)
+        hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber)
+        self._mProbers.extend([hebrewProber, logicalHebrewProber,
+                               visualHebrewProber])
+
+        self.reset()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/cp949prober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/cp949prober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/cp949prober.py	(revision 1126)
@@ -0,0 +1,44 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCKRDistributionAnalysis
+from .mbcssm import CP949SMModel
+
+
+class CP949Prober(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(CP949SMModel)
+        # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
+        #       not different.
+        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "CP949"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euckrprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euckrprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/euckrprober.py	(revision 1126)
@@ -0,0 +1,42 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCKRDistributionAnalysis
+from .mbcssm import EUCKRSMModel
+
+
+class EUCKRProber(MultiByteCharSetProber):
+    def __init__(self):
+        MultiByteCharSetProber.__init__(self)
+        self._mCodingSM = CodingStateMachine(EUCKRSMModel)
+        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    def get_charset_name(self):
+        return "EUC-KR"
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcssm.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcssm.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/mbcssm.py	(revision 1126)
@@ -0,0 +1,572 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .constants import eStart, eError, eItsMe
+
+# BIG5
+
+BIG5_cls = (
+    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,1,  # 78 - 7f
+    4,4,4,4,4,4,4,4,  # 80 - 87
+    4,4,4,4,4,4,4,4,  # 88 - 8f
+    4,4,4,4,4,4,4,4,  # 90 - 97
+    4,4,4,4,4,4,4,4,  # 98 - 9f
+    4,3,3,3,3,3,3,3,  # a0 - a7
+    3,3,3,3,3,3,3,3,  # a8 - af
+    3,3,3,3,3,3,3,3,  # b0 - b7
+    3,3,3,3,3,3,3,3,  # b8 - bf
+    3,3,3,3,3,3,3,3,  # c0 - c7
+    3,3,3,3,3,3,3,3,  # c8 - cf
+    3,3,3,3,3,3,3,3,  # d0 - d7
+    3,3,3,3,3,3,3,3,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,3,3,3,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,3,3,0  # f8 - ff
+)
+
+BIG5_st = (
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07
+    eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f
+    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17
+)
+
+Big5CharLenTable = (0, 1, 1, 2, 0)
+
+Big5SMModel = {'classTable': BIG5_cls,
+               'classFactor': 5,
+               'stateTable': BIG5_st,
+               'charLenTable': Big5CharLenTable,
+               'name': 'Big5'}
+
+# CP949
+
+CP949_cls  = (
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,  # 00 - 0f
+    1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,  # 10 - 1f
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 20 - 2f
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 30 - 3f
+    1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,  # 40 - 4f
+    4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 50 - 5f
+    1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,  # 60 - 6f
+    5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 70 - 7f
+    0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 80 - 8f
+    6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 90 - 9f
+    6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8,  # a0 - af
+    7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,  # b0 - bf
+    7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2,  # c0 - cf
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # d0 - df
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # e0 - ef
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0,  # f0 - ff
+)
+
+CP949_st = (
+#cls=    0      1      2      3      4      5      6      7      8      9  # previous state =
+    eError,eStart,     3,eError,eStart,eStart,     4,     5,eError,     6, # eStart
+    eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe
+    eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3
+    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4
+    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5
+    eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6
+)
+
+CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
+
+CP949SMModel = {'classTable': CP949_cls,
+                'classFactor': 10,
+                'stateTable': CP949_st,
+                'charLenTable': CP949CharLenTable,
+                'name': 'CP949'}
+
+# EUC-JP
+
+EUCJP_cls = (
+    4,4,4,4,4,4,4,4,  # 00 - 07
+    4,4,4,4,4,4,5,5,  # 08 - 0f
+    4,4,4,4,4,4,4,4,  # 10 - 17
+    4,4,4,5,4,4,4,4,  # 18 - 1f
+    4,4,4,4,4,4,4,4,  # 20 - 27
+    4,4,4,4,4,4,4,4,  # 28 - 2f
+    4,4,4,4,4,4,4,4,  # 30 - 37
+    4,4,4,4,4,4,4,4,  # 38 - 3f
+    4,4,4,4,4,4,4,4,  # 40 - 47
+    4,4,4,4,4,4,4,4,  # 48 - 4f
+    4,4,4,4,4,4,4,4,  # 50 - 57
+    4,4,4,4,4,4,4,4,  # 58 - 5f
+    4,4,4,4,4,4,4,4,  # 60 - 67
+    4,4,4,4,4,4,4,4,  # 68 - 6f
+    4,4,4,4,4,4,4,4,  # 70 - 77
+    4,4,4,4,4,4,4,4,  # 78 - 7f
+    5,5,5,5,5,5,5,5,  # 80 - 87
+    5,5,5,5,5,5,1,3,  # 88 - 8f
+    5,5,5,5,5,5,5,5,  # 90 - 97
+    5,5,5,5,5,5,5,5,  # 98 - 9f
+    5,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,2,2,2,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,2,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,0,5  # f8 - ff
+)
+
+EUCJP_st = (
+          3,     4,     3,     5,eStart,eError,eError,eError,#00-07
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
+     eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17
+     eError,eError,eStart,eError,eError,eError,     3,eError,#18-1f
+          3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27
+)
+
+EUCJPCharLenTable = (2, 2, 2, 3, 1, 0)
+
+EUCJPSMModel = {'classTable': EUCJP_cls,
+                'classFactor': 6,
+                'stateTable': EUCJP_st,
+                'charLenTable': EUCJPCharLenTable,
+                'name': 'EUC-JP'}
+
+# EUC-KR
+
+EUCKR_cls  = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    1,1,1,1,1,1,1,1,  # 40 - 47
+    1,1,1,1,1,1,1,1,  # 48 - 4f
+    1,1,1,1,1,1,1,1,  # 50 - 57
+    1,1,1,1,1,1,1,1,  # 58 - 5f
+    1,1,1,1,1,1,1,1,  # 60 - 67
+    1,1,1,1,1,1,1,1,  # 68 - 6f
+    1,1,1,1,1,1,1,1,  # 70 - 77
+    1,1,1,1,1,1,1,1,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,3,3,3,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,3,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    2,2,2,2,2,2,2,2,  # e0 - e7
+    2,2,2,2,2,2,2,2,  # e8 - ef
+    2,2,2,2,2,2,2,2,  # f0 - f7
+    2,2,2,2,2,2,2,0   # f8 - ff
+)
+
+EUCKR_st = (
+    eError,eStart,     3,eError,eError,eError,eError,eError,#00-07
+    eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f
+)
+
+EUCKRCharLenTable = (0, 1, 2, 0)
+
+EUCKRSMModel = {'classTable': EUCKR_cls,
+                'classFactor': 4,
+                'stateTable': EUCKR_st,
+                'charLenTable': EUCKRCharLenTable,
+                'name': 'EUC-KR'}
+
+# EUC-TW
+
+EUCTW_cls = (
+    2,2,2,2,2,2,2,2,  # 00 - 07
+    2,2,2,2,2,2,0,0,  # 08 - 0f
+    2,2,2,2,2,2,2,2,  # 10 - 17
+    2,2,2,0,2,2,2,2,  # 18 - 1f
+    2,2,2,2,2,2,2,2,  # 20 - 27
+    2,2,2,2,2,2,2,2,  # 28 - 2f
+    2,2,2,2,2,2,2,2,  # 30 - 37
+    2,2,2,2,2,2,2,2,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,2,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,6,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,3,4,4,4,4,4,4,  # a0 - a7
+    5,5,1,1,1,1,1,1,  # a8 - af
+    1,1,1,1,1,1,1,1,  # b0 - b7
+    1,1,1,1,1,1,1,1,  # b8 - bf
+    1,1,3,1,3,3,3,3,  # c0 - c7
+    3,3,3,3,3,3,3,3,  # c8 - cf
+    3,3,3,3,3,3,3,3,  # d0 - d7
+    3,3,3,3,3,3,3,3,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,3,3,3,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,3,3,0   # f8 - ff
+)
+
+EUCTW_st = (
+    eError,eError,eStart,     3,     3,     3,     4,eError,#00-07
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17
+    eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f
+         5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27
+    eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f
+)
+
+EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3)
+
+EUCTWSMModel = {'classTable': EUCTW_cls,
+                'classFactor': 7,
+                'stateTable': EUCTW_st,
+                'charLenTable': EUCTWCharLenTable,
+                'name': 'x-euc-tw'}
+
+# GB2312
+
+GB2312_cls = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    3,3,3,3,3,3,3,3,  # 30 - 37
+    3,3,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,4,  # 78 - 7f
+    5,6,6,6,6,6,6,6,  # 80 - 87
+    6,6,6,6,6,6,6,6,  # 88 - 8f
+    6,6,6,6,6,6,6,6,  # 90 - 97
+    6,6,6,6,6,6,6,6,  # 98 - 9f
+    6,6,6,6,6,6,6,6,  # a0 - a7
+    6,6,6,6,6,6,6,6,  # a8 - af
+    6,6,6,6,6,6,6,6,  # b0 - b7
+    6,6,6,6,6,6,6,6,  # b8 - bf
+    6,6,6,6,6,6,6,6,  # c0 - c7
+    6,6,6,6,6,6,6,6,  # c8 - cf
+    6,6,6,6,6,6,6,6,  # d0 - d7
+    6,6,6,6,6,6,6,6,  # d8 - df
+    6,6,6,6,6,6,6,6,  # e0 - e7
+    6,6,6,6,6,6,6,6,  # e8 - ef
+    6,6,6,6,6,6,6,6,  # f0 - f7
+    6,6,6,6,6,6,6,0   # f8 - ff
+)
+
+GB2312_st = (
+    eError,eStart,eStart,eStart,eStart,eStart,     3,eError,#00-07
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17
+         4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f
+    eError,eError,     5,eError,eError,eError,eItsMe,eError,#20-27
+    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f
+)
+
+# To be accurate, the length of class 6 can be either 2 or 4.
+# But it is not necessary to discriminate between the two since
+# it is used for frequency analysis only, and we are validing
+# each code range there as well. So it is safe to set it to be
+# 2 here.
+GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2)
+
+GB2312SMModel = {'classTable': GB2312_cls,
+                  'classFactor': 7,
+                  'stateTable': GB2312_st,
+                  'charLenTable': GB2312CharLenTable,
+                  'name': 'GB2312'}
+
+# Shift_JIS
+
+SJIS_cls = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,1,  # 78 - 7f
+    3,3,3,3,3,2,2,3,  # 80 - 87
+    3,3,3,3,3,3,3,3,  # 88 - 8f
+    3,3,3,3,3,3,3,3,  # 90 - 97
+    3,3,3,3,3,3,3,3,  # 98 - 9f
+    #0xa0 is illegal in sjis encoding, but some pages does
+    #contain such byte. We need to be more error forgiven.
+    2,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,2,2,2,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,2,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,4,4,4,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,0,0,0)  # f8 - ff
+
+
+SJIS_st = (
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07
+    eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
+    eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17
+)
+
+SJISCharLenTable = (0, 1, 1, 2, 0, 0)
+
+SJISSMModel = {'classTable': SJIS_cls,
+               'classFactor': 6,
+               'stateTable': SJIS_st,
+               'charLenTable': SJISCharLenTable,
+               'name': 'Shift_JIS'}
+
+# UCS2-BE
+
+UCS2BE_cls = (
+    0,0,0,0,0,0,0,0,  # 00 - 07
+    0,0,1,0,0,2,0,0,  # 08 - 0f
+    0,0,0,0,0,0,0,0,  # 10 - 17
+    0,0,0,3,0,0,0,0,  # 18 - 1f
+    0,0,0,0,0,0,0,0,  # 20 - 27
+    0,3,3,3,3,3,0,0,  # 28 - 2f
+    0,0,0,0,0,0,0,0,  # 30 - 37
+    0,0,0,0,0,0,0,0,  # 38 - 3f
+    0,0,0,0,0,0,0,0,  # 40 - 47
+    0,0,0,0,0,0,0,0,  # 48 - 4f
+    0,0,0,0,0,0,0,0,  # 50 - 57
+    0,0,0,0,0,0,0,0,  # 58 - 5f
+    0,0,0,0,0,0,0,0,  # 60 - 67
+    0,0,0,0,0,0,0,0,  # 68 - 6f
+    0,0,0,0,0,0,0,0,  # 70 - 77
+    0,0,0,0,0,0,0,0,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,0,0,0,0,0,0,0,  # a0 - a7
+    0,0,0,0,0,0,0,0,  # a8 - af
+    0,0,0,0,0,0,0,0,  # b0 - b7
+    0,0,0,0,0,0,0,0,  # b8 - bf
+    0,0,0,0,0,0,0,0,  # c0 - c7
+    0,0,0,0,0,0,0,0,  # c8 - cf
+    0,0,0,0,0,0,0,0,  # d0 - d7
+    0,0,0,0,0,0,0,0,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,4,5   # f8 - ff
+)
+
+UCS2BE_st  = (
+          5,     7,     7,eError,     4,     3,eError,eError,#00-07
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
+     eItsMe,eItsMe,     6,     6,     6,     6,eError,eError,#10-17
+          6,     6,     6,     6,     6,eItsMe,     6,     6,#18-1f
+          6,     6,     6,     6,     5,     7,     7,eError,#20-27
+          5,     8,     6,     6,eError,     6,     6,     6,#28-2f
+          6,     6,     6,     6,eError,eError,eStart,eStart #30-37
+)
+
+UCS2BECharLenTable = (2, 2, 2, 0, 2, 2)
+
+UCS2BESMModel = {'classTable': UCS2BE_cls,
+                 'classFactor': 6,
+                 'stateTable': UCS2BE_st,
+                 'charLenTable': UCS2BECharLenTable,
+                 'name': 'UTF-16BE'}
+
+# UCS2-LE
+
+UCS2LE_cls = (
+    0,0,0,0,0,0,0,0,  # 00 - 07
+    0,0,1,0,0,2,0,0,  # 08 - 0f
+    0,0,0,0,0,0,0,0,  # 10 - 17
+    0,0,0,3,0,0,0,0,  # 18 - 1f
+    0,0,0,0,0,0,0,0,  # 20 - 27
+    0,3,3,3,3,3,0,0,  # 28 - 2f
+    0,0,0,0,0,0,0,0,  # 30 - 37
+    0,0,0,0,0,0,0,0,  # 38 - 3f
+    0,0,0,0,0,0,0,0,  # 40 - 47
+    0,0,0,0,0,0,0,0,  # 48 - 4f
+    0,0,0,0,0,0,0,0,  # 50 - 57
+    0,0,0,0,0,0,0,0,  # 58 - 5f
+    0,0,0,0,0,0,0,0,  # 60 - 67
+    0,0,0,0,0,0,0,0,  # 68 - 6f
+    0,0,0,0,0,0,0,0,  # 70 - 77
+    0,0,0,0,0,0,0,0,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,0,0,0,0,0,0,0,  # a0 - a7
+    0,0,0,0,0,0,0,0,  # a8 - af
+    0,0,0,0,0,0,0,0,  # b0 - b7
+    0,0,0,0,0,0,0,0,  # b8 - bf
+    0,0,0,0,0,0,0,0,  # c0 - c7
+    0,0,0,0,0,0,0,0,  # c8 - cf
+    0,0,0,0,0,0,0,0,  # d0 - d7
+    0,0,0,0,0,0,0,0,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,4,5   # f8 - ff
+)
+
+UCS2LE_st = (
+          6,     6,     7,     6,     4,     3,eError,eError,#00-07
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
+     eItsMe,eItsMe,     5,     5,     5,eError,eItsMe,eError,#10-17
+          5,     5,     5,eError,     5,eError,     6,     6,#18-1f
+          7,     6,     8,     8,     5,     5,     5,eError,#20-27
+          5,     5,     5,eError,eError,eError,     5,     5,#28-2f
+          5,     5,     5,eError,     5,eError,eStart,eStart #30-37
+)
+
+UCS2LECharLenTable = (2, 2, 2, 2, 2, 2)
+
+UCS2LESMModel = {'classTable': UCS2LE_cls,
+                 'classFactor': 6,
+                 'stateTable': UCS2LE_st,
+                 'charLenTable': UCS2LECharLenTable,
+                 'name': 'UTF-16LE'}
+
+# UTF-8
+
+UTF8_cls = (
+    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    1,1,1,1,1,1,1,1,  # 40 - 47
+    1,1,1,1,1,1,1,1,  # 48 - 4f
+    1,1,1,1,1,1,1,1,  # 50 - 57
+    1,1,1,1,1,1,1,1,  # 58 - 5f
+    1,1,1,1,1,1,1,1,  # 60 - 67
+    1,1,1,1,1,1,1,1,  # 68 - 6f
+    1,1,1,1,1,1,1,1,  # 70 - 77
+    1,1,1,1,1,1,1,1,  # 78 - 7f
+    2,2,2,2,3,3,3,3,  # 80 - 87
+    4,4,4,4,4,4,4,4,  # 88 - 8f
+    4,4,4,4,4,4,4,4,  # 90 - 97
+    4,4,4,4,4,4,4,4,  # 98 - 9f
+    5,5,5,5,5,5,5,5,  # a0 - a7
+    5,5,5,5,5,5,5,5,  # a8 - af
+    5,5,5,5,5,5,5,5,  # b0 - b7
+    5,5,5,5,5,5,5,5,  # b8 - bf
+    0,0,6,6,6,6,6,6,  # c0 - c7
+    6,6,6,6,6,6,6,6,  # c8 - cf
+    6,6,6,6,6,6,6,6,  # d0 - d7
+    6,6,6,6,6,6,6,6,  # d8 - df
+    7,8,8,8,8,8,8,8,  # e0 - e7
+    8,8,8,8,8,9,8,8,  # e8 - ef
+    10,11,11,11,11,11,11,11,  # f0 - f7
+    12,13,13,13,14,15,0,0    # f8 - ff
+)
+
+UTF8_st = (
+    eError,eStart,eError,eError,eError,eError,     12,   10,#00-07
+         9,     11,     8,     7,     6,     5,     4,    3,#08-0f
+    eError,eError,eError,eError,eError,eError,eError,eError,#10-17
+    eError,eError,eError,eError,eError,eError,eError,eError,#18-1f
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f
+    eError,eError,     5,     5,     5,     5,eError,eError,#30-37
+    eError,eError,eError,eError,eError,eError,eError,eError,#38-3f
+    eError,eError,eError,     5,     5,     5,eError,eError,#40-47
+    eError,eError,eError,eError,eError,eError,eError,eError,#48-4f
+    eError,eError,     7,     7,     7,     7,eError,eError,#50-57
+    eError,eError,eError,eError,eError,eError,eError,eError,#58-5f
+    eError,eError,eError,eError,     7,     7,eError,eError,#60-67
+    eError,eError,eError,eError,eError,eError,eError,eError,#68-6f
+    eError,eError,     9,     9,     9,     9,eError,eError,#70-77
+    eError,eError,eError,eError,eError,eError,eError,eError,#78-7f
+    eError,eError,eError,eError,eError,     9,eError,eError,#80-87
+    eError,eError,eError,eError,eError,eError,eError,eError,#88-8f
+    eError,eError,    12,    12,    12,    12,eError,eError,#90-97
+    eError,eError,eError,eError,eError,eError,eError,eError,#98-9f
+    eError,eError,eError,eError,eError,    12,eError,eError,#a0-a7
+    eError,eError,eError,eError,eError,eError,eError,eError,#a8-af
+    eError,eError,    12,    12,    12,eError,eError,eError,#b0-b7
+    eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf
+    eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7
+    eError,eError,eError,eError,eError,eError,eError,eError #c8-cf
+)
+
+UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
+
+UTF8SMModel = {'classTable': UTF8_cls,
+               'classFactor': 16,
+               'stateTable': UTF8_st,
+               'charLenTable': UTF8CharLenTable,
+               'name': 'UTF-8'}
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/hebrewprober.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/hebrewprober.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/chardet/hebrewprober.py	(revision 1126)
@@ -0,0 +1,283 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Shy Shalom
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .constants import eNotMe, eDetecting
+from .compat import wrap_ord
+
+# This prober doesn't actually recognize a language or a charset.
+# It is a helper prober for the use of the Hebrew model probers
+
+### General ideas of the Hebrew charset recognition ###
+#
+# Four main charsets exist in Hebrew:
+# "ISO-8859-8" - Visual Hebrew
+# "windows-1255" - Logical Hebrew
+# "ISO-8859-8-I" - Logical Hebrew
+# "x-mac-hebrew" - ?? Logical Hebrew ??
+#
+# Both "ISO" charsets use a completely identical set of code points, whereas
+# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
+# these code points. windows-1255 defines additional characters in the range
+# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
+# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
+# x-mac-hebrew defines similar additional code points but with a different
+# mapping.
+#
+# As far as an average Hebrew text with no diacritics is concerned, all four
+# charsets are identical with respect to code points. Meaning that for the
+# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
+# (including final letters).
+#
+# The dominant difference between these charsets is their directionality.
+# "Visual" directionality means that the text is ordered as if the renderer is
+# not aware of a BIDI rendering algorithm. The renderer sees the text and
+# draws it from left to right. The text itself when ordered naturally is read
+# backwards. A buffer of Visual Hebrew generally looks like so:
+# "[last word of first line spelled backwards] [whole line ordered backwards
+# and spelled backwards] [first word of first line spelled backwards]
+# [end of line] [last word of second line] ... etc' "
+# adding punctuation marks, numbers and English text to visual text is
+# naturally also "visual" and from left to right.
+#
+# "Logical" directionality means the text is ordered "naturally" according to
+# the order it is read. It is the responsibility of the renderer to display
+# the text from right to left. A BIDI algorithm is used to place general
+# punctuation marks, numbers and English text in the text.
+#
+# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
+# what little evidence I could find, it seems that its general directionality
+# is Logical.
+#
+# To sum up all of the above, the Hebrew probing mechanism knows about two
+# charsets:
+# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
+#    backwards while line order is natural. For charset recognition purposes
+#    the line order is unimportant (In fact, for this implementation, even
+#    word order is unimportant).
+# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
+#
+# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
+#    specifically identified.
+# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
+#    that contain special punctuation marks or diacritics is displayed with
+#    some unconverted characters showing as question marks. This problem might
+#    be corrected using another model prober for x-mac-hebrew. Due to the fact
+#    that x-mac-hebrew texts are so rare, writing another model prober isn't
+#    worth the effort and performance hit.
+#
+#### The Prober ####
+#
+# The prober is divided between two SBCharSetProbers and a HebrewProber,
+# all of which are managed, created, fed data, inquired and deleted by the
+# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
+# fact some kind of Hebrew, Logical or Visual. The final decision about which
+# one is it is made by the HebrewProber by combining final-letter scores
+# with the scores of the two SBCharSetProbers to produce a final answer.
+#
+# The SBCSGroupProber is responsible for stripping the original text of HTML
+# tags, English characters, numbers, low-ASCII punctuation characters, spaces
+# and new lines. It reduces any sequence of such characters to a single space.
+# The buffer fed to each prober in the SBCS group prober is pure text in
+# high-ASCII.
+# The two SBCharSetProbers (model probers) share the same language model:
+# Win1255Model.
+# The first SBCharSetProber uses the model normally as any other
+# SBCharSetProber does, to recognize windows-1255, upon which this model was
+# built. The second SBCharSetProber is told to make the pair-of-letter
+# lookup in the language model backwards. This in practice exactly simulates
+# a visual Hebrew model using the windows-1255 logical Hebrew model.
+#
+# The HebrewProber is not using any language model. All it does is look for
+# final-letter evidence suggesting the text is either logical Hebrew or visual
+# Hebrew. Disjointed from the model probers, the results of the HebrewProber
+# alone are meaningless. HebrewProber always returns 0.00 as confidence
+# since it never identifies a charset by itself. Instead, the pointer to the
+# HebrewProber is passed to the model probers as a helper "Name Prober".
+# When the Group prober receives a positive identification from any prober,
+# it asks for the name of the charset identified. If the prober queried is a
+# Hebrew model prober, the model prober forwards the call to the
+# HebrewProber to make the final decision. In the HebrewProber, the
+# decision is made according to the final-letters scores maintained and Both
+# model probers scores. The answer is returned in the form of the name of the
+# charset identified, either "windows-1255" or "ISO-8859-8".
+
+# windows-1255 / ISO-8859-8 code points of interest
+FINAL_KAF = 0xea
+NORMAL_KAF = 0xeb
+FINAL_MEM = 0xed
+NORMAL_MEM = 0xee
+FINAL_NUN = 0xef
+NORMAL_NUN = 0xf0
+FINAL_PE = 0xf3
+NORMAL_PE = 0xf4
+FINAL_TSADI = 0xf5
+NORMAL_TSADI = 0xf6
+
+# Minimum Visual vs Logical final letter score difference.
+# If the difference is below this, don't rely solely on the final letter score
+# distance.
+MIN_FINAL_CHAR_DISTANCE = 5
+
+# Minimum Visual vs Logical model score difference.
+# If the difference is below this, don't rely at all on the model score
+# distance.
+MIN_MODEL_DISTANCE = 0.01
+
+VISUAL_HEBREW_NAME = "ISO-8859-8"
+LOGICAL_HEBREW_NAME = "windows-1255"
+
+
+class HebrewProber(CharSetProber):
+    def __init__(self):
+        CharSetProber.__init__(self)
+        self._mLogicalProber = None
+        self._mVisualProber = None
+        self.reset()
+
+    def reset(self):
+        self._mFinalCharLogicalScore = 0
+        self._mFinalCharVisualScore = 0
+        # The two last characters seen in the previous buffer,
+        # mPrev and mBeforePrev are initialized to space in order to simulate
+        # a word delimiter at the beginning of the data
+        self._mPrev = ' '
+        self._mBeforePrev = ' '
+        # These probers are owned by the group prober.
+
+    def set_model_probers(self, logicalProber, visualProber):
+        self._mLogicalProber = logicalProber
+        self._mVisualProber = visualProber
+
+    def is_final(self, c):
+        return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE,
+                               FINAL_TSADI]
+
+    def is_non_final(self, c):
+        # The normal Tsadi is not a good Non-Final letter due to words like
+        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
+        # apostrophe is converted to a space in FilterWithoutEnglishLetters
+        # causing the Non-Final tsadi to appear at an end of a word even
+        # though this is not the case in the original text.
+        # The letters Pe and Kaf rarely display a related behavior of not being
+        # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
+        # for example legally end with a Non-Final Pe or Kaf. However, the
+        # benefit of these letters as Non-Final letters outweighs the damage
+        # since these words are quite rare.
+        return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE]
+
+    def feed(self, aBuf):
+        # Final letter analysis for logical-visual decision.
+        # Look for evidence that the received buffer is either logical Hebrew
+        # or visual Hebrew.
+        # The following cases are checked:
+        # 1) A word longer than 1 letter, ending with a final letter. This is
+        #    an indication that the text is laid out "naturally" since the
+        #    final letter really appears at the end. +1 for logical score.
+        # 2) A word longer than 1 letter, ending with a Non-Final letter. In
+        #    normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
+        #    should not end with the Non-Final form of that letter. Exceptions
+        #    to this rule are mentioned above in isNonFinal(). This is an
+        #    indication that the text is laid out backwards. +1 for visual
+        #    score
+        # 3) A word longer than 1 letter, starting with a final letter. Final
+        #    letters should not appear at the beginning of a word. This is an
+        #    indication that the text is laid out backwards. +1 for visual
+        #    score.
+        #
+        # The visual score and logical score are accumulated throughout the
+        # text and are finally checked against each other in GetCharSetName().
+        # No checking for final letters in the middle of words is done since
+        # that case is not an indication for either Logical or Visual text.
+        #
+        # We automatically filter out all 7-bit characters (replace them with
+        # spaces) so the word boundary detection works properly. [MAP]
+
+        if self.get_state() == eNotMe:
+            # Both model probers say it's not them. No reason to continue.
+            return eNotMe
+
+        aBuf = self.filter_high_bit_only(aBuf)
+
+        for cur in aBuf:
+            if cur == ' ':
+                # We stand on a space - a word just ended
+                if self._mBeforePrev != ' ':
+                    # next-to-last char was not a space so self._mPrev is not a
+                    # 1 letter word
+                    if self.is_final(self._mPrev):
+                        # case (1) [-2:not space][-1:final letter][cur:space]
+                        self._mFinalCharLogicalScore += 1
+                    elif self.is_non_final(self._mPrev):
+                        # case (2) [-2:not space][-1:Non-Final letter][
+                        #  cur:space]
+                        self._mFinalCharVisualScore += 1
+            else:
+                # Not standing on a space
+                if ((self._mBeforePrev == ' ') and
+                        (self.is_final(self._mPrev)) and (cur != ' ')):
+                    # case (3) [-2:space][-1:final letter][cur:not space]
+                    self._mFinalCharVisualScore += 1
+            self._mBeforePrev = self._mPrev
+            self._mPrev = cur
+
+        # Forever detecting, till the end or until both model probers return
+        # eNotMe (handled above)
+        return eDetecting
+
+    def get_charset_name(self):
+        # Make the decision: is it Logical or Visual?
+        # If the final letter score distance is dominant enough, rely on it.
+        finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore
+        if finalsub >= MIN_FINAL_CHAR_DISTANCE:
+            return LOGICAL_HEBREW_NAME
+        if finalsub <= -MIN_FINAL_CHAR_DISTANCE:
+            return VISUAL_HEBREW_NAME
+
+        # It's not dominant enough, try to rely on the model scores instead.
+        modelsub = (self._mLogicalProber.get_confidence()
+                    - self._mVisualProber.get_confidence())
+        if modelsub > MIN_MODEL_DISTANCE:
+            return LOGICAL_HEBREW_NAME
+        if modelsub < -MIN_MODEL_DISTANCE:
+            return VISUAL_HEBREW_NAME
+
+        # Still no good, back to final letter distance, maybe it'll save the
+        # day.
+        if finalsub < 0.0:
+            return VISUAL_HEBREW_NAME
+
+        # (finalsub > 0 - Logical) or (don't know what to do) default to
+        # Logical.
+        return LOGICAL_HEBREW_NAME
+
+    def get_state(self):
+        # Remain active as long as any of the model probers are active.
+        if (self._mLogicalProber.get_state() == eNotMe) and \
+           (self._mVisualProber.get_state() == eNotMe):
+            return eNotMe
+        return eDetecting
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ordered_dict.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ordered_dict.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ordered_dict.py	(revision 1126)
@@ -0,0 +1,259 @@
+# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
+# Passes Python2.7's test suite and incorporates all the latest updates.
+# Copyright 2009 Raymond Hettinger, released under the MIT License.
+# http://code.activestate.com/recipes/576693/
+try:
+    from thread import get_ident as _get_ident
+except ImportError:
+    from dummy_thread import get_ident as _get_ident
+
+try:
+    from _abcoll import KeysView, ValuesView, ItemsView
+except ImportError:
+    pass
+
+
+class OrderedDict(dict):
+    'Dictionary that remembers insertion order'
+    # An inherited dict maps keys to values.
+    # The inherited dict provides __getitem__, __len__, __contains__, and get.
+    # The remaining methods are order-aware.
+    # Big-O running times for all methods are the same as for regular dictionaries.
+
+    # The internal self.__map dictionary maps keys to links in a doubly linked list.
+    # The circular doubly linked list starts and ends with a sentinel element.
+    # The sentinel element never gets deleted (this simplifies the algorithm).
+    # Each link is stored as a list of length three:  [PREV, NEXT, KEY].
+
+    def __init__(self, *args, **kwds):
+        '''Initialize an ordered dictionary.  Signature is the same as for
+        regular dictionaries, but keyword arguments are not recommended
+        because their insertion order is arbitrary.
+
+        '''
+        if len(args) > 1:
+            raise TypeError('expected at most 1 arguments, got %d' % len(args))
+        try:
+            self.__root
+        except AttributeError:
+            self.__root = root = []                     # sentinel node
+            root[:] = [root, root, None]
+            self.__map = {}
+        self.__update(*args, **kwds)
+
+    def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
+        'od.__setitem__(i, y) <==> od[i]=y'
+        # Setting a new item creates a new link which goes at the end of the linked
+        # list, and the inherited dictionary is updated with the new key/value pair.
+        if key not in self:
+            root = self.__root
+            last = root[0]
+            last[1] = root[0] = self.__map[key] = [last, root, key]
+        dict_setitem(self, key, value)
+
+    def __delitem__(self, key, dict_delitem=dict.__delitem__):
+        'od.__delitem__(y) <==> del od[y]'
+        # Deleting an existing item uses self.__map to find the link which is
+        # then removed by updating the links in the predecessor and successor nodes.
+        dict_delitem(self, key)
+        link_prev, link_next, key = self.__map.pop(key)
+        link_prev[1] = link_next
+        link_next[0] = link_prev
+
+    def __iter__(self):
+        'od.__iter__() <==> iter(od)'
+        root = self.__root
+        curr = root[1]
+        while curr is not root:
+            yield curr[2]
+            curr = curr[1]
+
+    def __reversed__(self):
+        'od.__reversed__() <==> reversed(od)'
+        root = self.__root
+        curr = root[0]
+        while curr is not root:
+            yield curr[2]
+            curr = curr[0]
+
+    def clear(self):
+        'od.clear() -> None.  Remove all items from od.'
+        try:
+            for node in self.__map.itervalues():
+                del node[:]
+            root = self.__root
+            root[:] = [root, root, None]
+            self.__map.clear()
+        except AttributeError:
+            pass
+        dict.clear(self)
+
+    def popitem(self, last=True):
+        '''od.popitem() -> (k, v), return and remove a (key, value) pair.
+        Pairs are returned in LIFO order if last is true or FIFO order if false.
+
+        '''
+        if not self:
+            raise KeyError('dictionary is empty')
+        root = self.__root
+        if last:
+            link = root[0]
+            link_prev = link[0]
+            link_prev[1] = root
+            root[0] = link_prev
+        else:
+            link = root[1]
+            link_next = link[1]
+            root[1] = link_next
+            link_next[0] = root
+        key = link[2]
+        del self.__map[key]
+        value = dict.pop(self, key)
+        return key, value
+
+    # -- the following methods do not depend on the internal structure --
+
+    def keys(self):
+        'od.keys() -> list of keys in od'
+        return list(self)
+
+    def values(self):
+        'od.values() -> list of values in od'
+        return [self[key] for key in self]
+
+    def items(self):
+        'od.items() -> list of (key, value) pairs in od'
+        return [(key, self[key]) for key in self]
+
+    def iterkeys(self):
+        'od.iterkeys() -> an iterator over the keys in od'
+        return iter(self)
+
+    def itervalues(self):
+        'od.itervalues -> an iterator over the values in od'
+        for k in self:
+            yield self[k]
+
+    def iteritems(self):
+        'od.iteritems -> an iterator over the (key, value) items in od'
+        for k in self:
+            yield (k, self[k])
+
+    def update(*args, **kwds):
+        '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.
+
+        If E is a dict instance, does:           for k in E: od[k] = E[k]
+        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
+        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
+        In either case, this is followed by:     for k, v in F.items(): od[k] = v
+
+        '''
+        if len(args) > 2:
+            raise TypeError('update() takes at most 2 positional '
+                            'arguments (%d given)' % (len(args),))
+        elif not args:
+            raise TypeError('update() takes at least 1 argument (0 given)')
+        self = args[0]
+        # Make progressively weaker assumptions about "other"
+        other = ()
+        if len(args) == 2:
+            other = args[1]
+        if isinstance(other, dict):
+            for key in other:
+                self[key] = other[key]
+        elif hasattr(other, 'keys'):
+            for key in other.keys():
+                self[key] = other[key]
+        else:
+            for key, value in other:
+                self[key] = value
+        for key, value in kwds.items():
+            self[key] = value
+
+    __update = update  # let subclasses override update without breaking __init__
+
+    __marker = object()
+
+    def pop(self, key, default=__marker):
+        '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+        If key is not found, d is returned if given, otherwise KeyError is raised.
+
+        '''
+        if key in self:
+            result = self[key]
+            del self[key]
+            return result
+        if default is self.__marker:
+            raise KeyError(key)
+        return default
+
+    def setdefault(self, key, default=None):
+        'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
+        if key in self:
+            return self[key]
+        self[key] = default
+        return default
+
+    def __repr__(self, _repr_running={}):
+        'od.__repr__() <==> repr(od)'
+        call_key = id(self), _get_ident()
+        if call_key in _repr_running:
+            return '...'
+        _repr_running[call_key] = 1
+        try:
+            if not self:
+                return '%s()' % (self.__class__.__name__,)
+            return '%s(%r)' % (self.__class__.__name__, self.items())
+        finally:
+            del _repr_running[call_key]
+
+    def __reduce__(self):
+        'Return state information for pickling'
+        items = [[k, self[k]] for k in self]
+        inst_dict = vars(self).copy()
+        for k in vars(OrderedDict()):
+            inst_dict.pop(k, None)
+        if inst_dict:
+            return (self.__class__, (items,), inst_dict)
+        return self.__class__, (items,)
+
+    def copy(self):
+        'od.copy() -> a shallow copy of od'
+        return self.__class__(self)
+
+    @classmethod
+    def fromkeys(cls, iterable, value=None):
+        '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
+        and values equal to v (which defaults to None).
+
+        '''
+        d = cls()
+        for key in iterable:
+            d[key] = value
+        return d
+
+    def __eq__(self, other):
+        '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
+        while comparison to a regular mapping is order-insensitive.
+
+        '''
+        if isinstance(other, OrderedDict):
+            return len(self)==len(other) and self.items() == other.items()
+        return dict.__eq__(self, other)
+
+    def __ne__(self, other):
+        return not self == other
+
+    # -- the following methods are only used in Python 2.7 --
+
+    def viewkeys(self):
+        "od.viewkeys() -> a set-like object providing a view on od's keys"
+        return KeysView(self)
+
+    def viewvalues(self):
+        "od.viewvalues() -> an object providing a view on od's values"
+        return ValuesView(self)
+
+    def viewitems(self):
+        "od.viewitems() -> a set-like object providing a view on od's items"
+        return ItemsView(self)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/__init__.py	(revision 1126)
@@ -0,0 +1,5 @@
+from __future__ import absolute_import
+
+from . import ssl_match_hostname
+
+__all__ = ('ssl_match_hostname', )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/six.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/six.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/six.py	(revision 1126)
@@ -0,0 +1,385 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+#Copyright (c) 2010-2011 Benjamin Peterson
+
+#Permission is hereby granted, free of charge, to any person obtaining a copy of
+#this software and associated documentation files (the "Software"), to deal in
+#the Software without restriction, including without limitation the rights to
+#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+#the Software, and to permit persons to whom the Software is furnished to do so,
+#subject to the following conditions:
+
+#The above copyright notice and this permission notice shall be included in all
+#copies or substantial portions of the Software.
+
+#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.2.0"  # Revision 41c74fef2ded
+
+
+# True if we are running on Python 3.
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+            del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)
+        # This is a bit ugly, but it avoids running this again.
+        delattr(tp, self.name)
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+
+class _MovedItems(types.ModuleType):
+    """Lazy loading of moved objects"""
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("winreg", "_winreg"),
+]
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+del attr
+
+moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+
+    _iterkeys = "keys"
+    _itervalues = "values"
+    _iteritems = "items"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+
+    _iterkeys = "iterkeys"
+    _itervalues = "itervalues"
+    _iteritems = "iteritems"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    Iterator = object
+
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+
+
+def iterkeys(d):
+    """Return an iterator over the keys of a dictionary."""
+    return iter(getattr(d, _iterkeys)())
+
+def itervalues(d):
+    """Return an iterator over the values of a dictionary."""
+    return iter(getattr(d, _itervalues)())
+
+def iteritems(d):
+    """Return an iterator over the (key, value) pairs of a dictionary."""
+    return iter(getattr(d, _iteritems)())
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+    def u(s):
+        return s
+    if sys.version_info[1] <= 1:
+        def int2byte(i):
+            return bytes((i,))
+    else:
+        # This is about 2x faster than the implementation above on 3.2+
+        int2byte = operator.methodcaller("to_bytes", 1, "big")
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+else:
+    def b(s):
+        return s
+    def u(s):
+        return unicode(s, "unicode_escape")
+    int2byte = chr
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+if PY3:
+    import builtins
+    exec_ = getattr(builtins, "exec")
+
+
+    def reraise(tp, value, tb=None):
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+
+    print_ = getattr(builtins, "print")
+    del builtins
+
+else:
+    def exec_(code, globs=None, locs=None):
+        """Execute code in a namespace."""
+        if globs is None:
+            frame = sys._getframe(1)
+            globs = frame.f_globals
+            if locs is None:
+                locs = frame.f_locals
+            del frame
+        elif locs is None:
+            locs = globs
+        exec("""exec code in globs, locs""")
+
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+    def print_(*args, **kwargs):
+        """The new-style print function."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+
+_add_doc(reraise, """Reraise an exception.""")
+
+
+def with_metaclass(meta, base=object):
+    """Create a base class with a metaclass."""
+    return meta("NewBase", (base,), {})
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py	(revision 1126)
@@ -0,0 +1,13 @@
+try:
+    # Python 3.2+
+    from ssl import CertificateError, match_hostname
+except ImportError:
+    try:
+        # Backport of the function from a pypi module
+        from backports.ssl_match_hostname import CertificateError, match_hostname
+    except ImportError:
+        # Our vendored copy
+        from ._implementation import CertificateError, match_hostname
+
+# Not needed, but documenting what we provide.
+__all__ = ('CertificateError', 'match_hostname')
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py	(revision 1126)
@@ -0,0 +1,105 @@
+"""The match_hostname() function from Python 3.3.3, essential when using SSL."""
+
+# Note: This file is under the PSF license as the code comes from the python
+# stdlib.   http://docs.python.org/3/license.html
+
+import re
+
+__version__ = '3.4.0.2'
+
+class CertificateError(ValueError):
+    pass
+
+
+def _dnsname_match(dn, hostname, max_wildcards=1):
+    """Matching according to RFC 6125, section 6.4.3
+
+    http://tools.ietf.org/html/rfc6125#section-6.4.3
+    """
+    pats = []
+    if not dn:
+        return False
+
+    # Ported from python3-syntax:
+    # leftmost, *remainder = dn.split(r'.')
+    parts = dn.split(r'.')
+    leftmost = parts[0]
+    remainder = parts[1:]
+
+    wildcards = leftmost.count('*')
+    if wildcards > max_wildcards:
+        # Issue #17980: avoid denials of service by refusing more
+        # than one wildcard per fragment.  A survey of established
+        # policy among SSL implementations showed it to be a
+        # reasonable choice.
+        raise CertificateError(
+            "too many wildcards in certificate DNS name: " + repr(dn))
+
+    # speed up common case w/o wildcards
+    if not wildcards:
+        return dn.lower() == hostname.lower()
+
+    # RFC 6125, section 6.4.3, subitem 1.
+    # The client SHOULD NOT attempt to match a presented identifier in which
+    # the wildcard character comprises a label other than the left-most label.
+    if leftmost == '*':
+        # When '*' is a fragment by itself, it matches a non-empty dotless
+        # fragment.
+        pats.append('[^.]+')
+    elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
+        # RFC 6125, section 6.4.3, subitem 3.
+        # The client SHOULD NOT attempt to match a presented identifier
+        # where the wildcard character is embedded within an A-label or
+        # U-label of an internationalized domain name.
+        pats.append(re.escape(leftmost))
+    else:
+        # Otherwise, '*' matches any dotless string, e.g. www*
+        pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
+
+    # add the remaining fragments, ignore any wildcards
+    for frag in remainder:
+        pats.append(re.escape(frag))
+
+    pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
+    return pat.match(hostname)
+
+
+def match_hostname(cert, hostname):
+    """Verify that *cert* (in decoded format as returned by
+    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
+    rules are followed, but IP addresses are not accepted for *hostname*.
+
+    CertificateError is raised on failure. On success, the function
+    returns nothing.
+    """
+    if not cert:
+        raise ValueError("empty or no certificate")
+    dnsnames = []
+    san = cert.get('subjectAltName', ())
+    for key, value in san:
+        if key == 'DNS':
+            if _dnsname_match(value, hostname):
+                return
+            dnsnames.append(value)
+    if not dnsnames:
+        # The subject is only checked when there is no dNSName entry
+        # in subjectAltName
+        for sub in cert.get('subject', ()):
+            for key, value in sub:
+                # XXX according to RFC 2818, the most specific Common Name
+                # must be used.
+                if key == 'commonName':
+                    if _dnsname_match(value, hostname):
+                        return
+                    dnsnames.append(value)
+    if len(dnsnames) > 1:
+        raise CertificateError("hostname %r "
+            "doesn't match either of %s"
+            % (hostname, ', '.join(map(repr, dnsnames))))
+    elif len(dnsnames) == 1:
+        raise CertificateError("hostname %r "
+            "doesn't match %r"
+            % (hostname, dnsnames[0]))
+    else:
+        raise CertificateError("no appropriate commonName or "
+            "subjectAltName fields were found")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/request.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/request.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/request.py	(revision 1126)
@@ -0,0 +1,151 @@
+from __future__ import absolute_import
+try:
+    from urllib.parse import urlencode
+except ImportError:
+    from urllib import urlencode
+
+from .filepost import encode_multipart_formdata
+
+
+__all__ = ['RequestMethods']
+
+
+class RequestMethods(object):
+    """
+    Convenience mixin for classes who implement a :meth:`urlopen` method, such
+    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and
+    :class:`~urllib3.poolmanager.PoolManager`.
+
+    Provides behavior for making common types of HTTP request methods and
+    decides which type of request field encoding to use.
+
+    Specifically,
+
+    :meth:`.request_encode_url` is for sending requests whose fields are
+    encoded in the URL (such as GET, HEAD, DELETE).
+
+    :meth:`.request_encode_body` is for sending requests whose fields are
+    encoded in the *body* of the request using multipart or www-form-urlencoded
+    (such as for POST, PUT, PATCH).
+
+    :meth:`.request` is for making any kind of request, it will look up the
+    appropriate encoding format and use one of the above two methods to make
+    the request.
+
+    Initializer parameters:
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+    """
+
+    _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])
+
+    def __init__(self, headers=None):
+        self.headers = headers or {}
+
+    def urlopen(self, method, url, body=None, headers=None,
+                encode_multipart=True, multipart_boundary=None,
+                **kw):  # Abstract
+        raise NotImplemented("Classes extending RequestMethods must implement "
+                             "their own ``urlopen`` method.")
+
+    def request(self, method, url, fields=None, headers=None, **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the appropriate encoding of
+        ``fields`` based on the ``method`` used.
+
+        This is a convenience method that requires the least amount of manual
+        effort. It can be used in most situations, while still having the
+        option to drop down to more specific methods when necessary, such as
+        :meth:`request_encode_url`, :meth:`request_encode_body`,
+        or even the lowest level :meth:`urlopen`.
+        """
+        method = method.upper()
+
+        if method in self._encode_url_methods:
+            return self.request_encode_url(method, url, fields=fields,
+                                           headers=headers,
+                                           **urlopen_kw)
+        else:
+            return self.request_encode_body(method, url, fields=fields,
+                                            headers=headers,
+                                            **urlopen_kw)
+
+    def request_encode_url(self, method, url, fields=None, headers=None,
+                           **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the url. This is useful for request methods like GET, HEAD, DELETE, etc.
+        """
+        if headers is None:
+            headers = self.headers
+
+        extra_kw = {'headers': headers}
+        extra_kw.update(urlopen_kw)
+
+        if fields:
+            url += '?' + urlencode(fields)
+
+        return self.urlopen(method, url, **extra_kw)
+
+    def request_encode_body(self, method, url, fields=None, headers=None,
+                            encode_multipart=True, multipart_boundary=None,
+                            **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the body. This is useful for request methods like POST, PUT, PATCH, etc.
+
+        When ``encode_multipart=True`` (default), then
+        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode
+        the payload with the appropriate content type. Otherwise
+        :meth:`urllib.urlencode` is used with the
+        'application/x-www-form-urlencoded' content type.
+
+        Multipart encoding must be used when posting files, and it's reasonably
+        safe to use it in other times too. However, it may break request
+        signing, such as with OAuth.
+
+        Supports an optional ``fields`` parameter of key/value strings AND
+        key/filetuple. A filetuple is a (filename, data, MIME type) tuple where
+        the MIME type is optional. For example::
+
+            fields = {
+                'foo': 'bar',
+                'fakefile': ('foofile.txt', 'contents of foofile'),
+                'realfile': ('barfile.txt', open('realfile').read()),
+                'typedfile': ('bazfile.bin', open('bazfile').read(),
+                              'image/jpeg'),
+                'nonamefile': 'contents of nonamefile field',
+            }
+
+        When uploading a file, providing a filename (the first parameter of the
+        tuple) is optional but recommended to best mimick behavior of browsers.
+
+        Note that if ``headers`` are supplied, the 'Content-Type' header will
+        be overwritten because it depends on the dynamic random boundary string
+        which is used to compose the body of the request. The random boundary
+        string can be explicitly set with the ``multipart_boundary`` parameter.
+        """
+        if headers is None:
+            headers = self.headers
+
+        extra_kw = {'headers': {}}
+
+        if fields:
+            if 'body' in urlopen_kw:
+                raise TypeError(
+                    "request got values for both 'fields' and 'body', can only specify one.")
+
+            if encode_multipart:
+                body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary)
+            else:
+                body, content_type = urlencode(fields), 'application/x-www-form-urlencoded'
+
+            extra_kw['body'] = body
+            extra_kw['headers'] = {'Content-Type': content_type}
+
+        extra_kw['headers'].update(headers)
+        extra_kw.update(urlopen_kw)
+
+        return self.urlopen(method, url, **extra_kw)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/connectionpool.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/connectionpool.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/connectionpool.py	(revision 1126)
@@ -0,0 +1,818 @@
+from __future__ import absolute_import
+import errno
+import logging
+import sys
+import warnings
+
+from socket import error as SocketError, timeout as SocketTimeout
+import socket
+
+try:  # Python 3
+    from queue import LifoQueue, Empty, Full
+except ImportError:
+    from Queue import LifoQueue, Empty, Full
+    # Queue is imported for side effects on MS Windows
+    import Queue as _unused_module_Queue  # noqa: unused
+
+
+from .exceptions import (
+    ClosedPoolError,
+    ProtocolError,
+    EmptyPoolError,
+    HeaderParsingError,
+    HostChangedError,
+    LocationValueError,
+    MaxRetryError,
+    ProxyError,
+    ReadTimeoutError,
+    SSLError,
+    TimeoutError,
+    InsecureRequestWarning,
+    NewConnectionError,
+)
+from .packages.ssl_match_hostname import CertificateError
+from .packages import six
+from .connection import (
+    port_by_scheme,
+    DummyConnection,
+    HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection,
+    HTTPException, BaseSSLError,
+)
+from .request import RequestMethods
+from .response import HTTPResponse
+
+from .util.connection import is_connection_dropped
+from .util.response import assert_header_parsing
+from .util.retry import Retry
+from .util.timeout import Timeout
+from .util.url import get_host, Url
+
+
+xrange = six.moves.xrange
+
+log = logging.getLogger(__name__)
+
+_Default = object()
+
+
+# Pool objects
+class ConnectionPool(object):
+    """
+    Base class for all connection pools, such as
+    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
+    """
+
+    scheme = None
+    QueueCls = LifoQueue
+
+    def __init__(self, host, port=None):
+        if not host:
+            raise LocationValueError("No host specified.")
+
+        self.host = host
+        self.port = port
+
+    def __str__(self):
+        return '%s(host=%r, port=%r)' % (type(self).__name__,
+                                         self.host, self.port)
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.close()
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def close():
+        """
+        Close all pooled connections and disable the pool.
+        """
+        pass
+
+
+# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252
+_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK])
+
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+    """
+    Thread-safe connection pool for one host.
+
+    :param host:
+        Host used for this HTTP Connection (e.g. "localhost"), passed into
+        :class:`httplib.HTTPConnection`.
+
+    :param port:
+        Port used for this HTTP Connection (None is equivalent to 80), passed
+        into :class:`httplib.HTTPConnection`.
+
+    :param strict:
+        Causes BadStatusLine to be raised if the status line can't be parsed
+        as a valid HTTP/1.0 or 1.1 status line, passed into
+        :class:`httplib.HTTPConnection`.
+
+        .. note::
+           Only works in Python 2. This parameter is ignored in Python 3.
+
+    :param timeout:
+        Socket timeout in seconds for each individual connection. This can
+        be a float or integer, which sets the timeout for the HTTP request,
+        or an instance of :class:`urllib3.util.Timeout` which gives you more
+        fine-grained control over request timeouts. After the constructor has
+        been parsed, this is always a `urllib3.util.Timeout` object.
+
+    :param maxsize:
+        Number of connections to save that can be reused. More than 1 is useful
+        in multithreaded situations. If ``block`` is set to False, more
+        connections will be created but they will not be saved once they've
+        been used.
+
+    :param block:
+        If set to True, no more than ``maxsize`` connections will be used at
+        a time. When no free connections are available, the call will block
+        until a connection has been released. This is a useful side effect for
+        particular multithreaded situations where one does not want to use more
+        than maxsize connections per host to prevent flooding.
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+
+    :param retries:
+        Retry configuration to use by default with requests in this pool.
+
+    :param _proxy:
+        Parsed proxy URL, should not be used directly, instead, see
+        :class:`urllib3.connectionpool.ProxyManager`"
+
+    :param _proxy_headers:
+        A dictionary with proxy headers, should not be used directly,
+        instead, see :class:`urllib3.connectionpool.ProxyManager`"
+
+    :param \**conn_kw:
+        Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`,
+        :class:`urllib3.connection.HTTPSConnection` instances.
+    """
+
+    scheme = 'http'
+    ConnectionCls = HTTPConnection
+
+    def __init__(self, host, port=None, strict=False,
+                 timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False,
+                 headers=None, retries=None,
+                 _proxy=None, _proxy_headers=None,
+                 **conn_kw):
+        ConnectionPool.__init__(self, host, port)
+        RequestMethods.__init__(self, headers)
+
+        self.strict = strict
+
+        if not isinstance(timeout, Timeout):
+            timeout = Timeout.from_float(timeout)
+
+        if retries is None:
+            retries = Retry.DEFAULT
+
+        self.timeout = timeout
+        self.retries = retries
+
+        self.pool = self.QueueCls(maxsize)
+        self.block = block
+
+        self.proxy = _proxy
+        self.proxy_headers = _proxy_headers or {}
+
+        # Fill the queue up so that doing get() on it will block properly
+        for _ in xrange(maxsize):
+            self.pool.put(None)
+
+        # These are mostly for testing and debugging purposes.
+        self.num_connections = 0
+        self.num_requests = 0
+        self.conn_kw = conn_kw
+
+        if self.proxy:
+            # Enable Nagle's algorithm for proxies, to avoid packet fragmentation.
+            # We cannot know if the user has added default socket options, so we cannot replace the
+            # list.
+            self.conn_kw.setdefault('socket_options', [])
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`HTTPConnection`.
+        """
+        self.num_connections += 1
+        log.info("Starting new HTTP connection (%d): %s" %
+                 (self.num_connections, self.host))
+
+        conn = self.ConnectionCls(host=self.host, port=self.port,
+                                  timeout=self.timeout.connect_timeout,
+                                  strict=self.strict, **self.conn_kw)
+        return conn
+
+    def _get_conn(self, timeout=None):
+        """
+        Get a connection. Will return a pooled connection if one is available.
+
+        If no connections are available and :prop:`.block` is ``False``, then a
+        fresh connection is returned.
+
+        :param timeout:
+            Seconds to wait before giving up and raising
+            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and
+            :prop:`.block` is ``True``.
+        """
+        conn = None
+        try:
+            conn = self.pool.get(block=self.block, timeout=timeout)
+
+        except AttributeError:  # self.pool is None
+            raise ClosedPoolError(self, "Pool is closed.")
+
+        except Empty:
+            if self.block:
+                raise EmptyPoolError(self,
+                                     "Pool reached maximum size and no more "
+                                     "connections are allowed.")
+            pass  # Oh well, we'll create a new connection then
+
+        # If this is a persistent connection, check if it got disconnected
+        if conn and is_connection_dropped(conn):
+            log.info("Resetting dropped connection: %s" % self.host)
+            conn.close()
+            if getattr(conn, 'auto_open', 1) == 0:
+                # This is a proxied connection that has been mutated by
+                # httplib._tunnel() and cannot be reused (since it would
+                # attempt to bypass the proxy)
+                conn = None
+
+        return conn or self._new_conn()
+
+    def _put_conn(self, conn):
+        """
+        Put a connection back into the pool.
+
+        :param conn:
+            Connection object for the current host and port as returned by
+            :meth:`._new_conn` or :meth:`._get_conn`.
+
+        If the pool is already full, the connection is closed and discarded
+        because we exceeded maxsize. If connections are discarded frequently,
+        then maxsize should be increased.
+
+        If the pool is closed, then the connection will be closed and discarded.
+        """
+        try:
+            self.pool.put(conn, block=False)
+            return  # Everything is dandy, done.
+        except AttributeError:
+            # self.pool is None.
+            pass
+        except Full:
+            # This should never happen if self.block == True
+            log.warning(
+                "Connection pool is full, discarding connection: %s" %
+                self.host)
+
+        # Connection never got put back into the pool, close it.
+        if conn:
+            conn.close()
+
+    def _validate_conn(self, conn):
+        """
+        Called right before a request is made, after the socket is created.
+        """
+        pass
+
+    def _prepare_proxy(self, conn):
+        # Nothing to do for HTTP connections.
+        pass
+
+    def _get_timeout(self, timeout):
+        """ Helper that always returns a :class:`urllib3.util.Timeout` """
+        if timeout is _Default:
+            return self.timeout.clone()
+
+        if isinstance(timeout, Timeout):
+            return timeout.clone()
+        else:
+            # User passed us an int/float. This is for backwards compatibility,
+            # can be removed later
+            return Timeout.from_float(timeout)
+
+    def _raise_timeout(self, err, url, timeout_value):
+        """Is the error actually a timeout? Will raise a ReadTimeout or pass"""
+
+        if isinstance(err, SocketTimeout):
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+        # See the above comment about EAGAIN in Python 3. In Python 2 we have
+        # to specifically catch it and throw the timeout error
+        if hasattr(err, 'errno') and err.errno in _blocking_errnos:
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+        # Catch possible read timeouts thrown as SSL errors. If not the
+        # case, rethrow the original. We need to do this because of:
+        # http://bugs.python.org/issue10272
+        if 'timed out' in str(err) or 'did not complete (read)' in str(err):  # Python 2.6
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+    def _make_request(self, conn, method, url, timeout=_Default,
+                      **httplib_request_kw):
+        """
+        Perform a request on a given urllib connection object taken from our
+        pool.
+
+        :param conn:
+            a connection from one of our connection pools
+
+        :param timeout:
+            Socket timeout in seconds for the request. This can be a
+            float or integer, which will set the same timeout value for
+            the socket connect and the socket read, or an instance of
+            :class:`urllib3.util.Timeout`, which gives you more fine-grained
+            control over your timeouts.
+        """
+        self.num_requests += 1
+
+        timeout_obj = self._get_timeout(timeout)
+        timeout_obj.start_connect()
+        conn.timeout = timeout_obj.connect_timeout
+
+        # Trigger any extra validation we need to do.
+        try:
+            self._validate_conn(conn)
+        except (SocketTimeout, BaseSSLError) as e:
+            # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.
+            self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
+            raise
+
+        # conn.request() calls httplib.*.request, not the method in
+        # urllib3.request. It also calls makefile (recv) on the socket.
+        conn.request(method, url, **httplib_request_kw)
+
+        # Reset the timeout for the recv() on the socket
+        read_timeout = timeout_obj.read_timeout
+
+        # App Engine doesn't have a sock attr
+        if getattr(conn, 'sock', None):
+            # In Python 3 socket.py will catch EAGAIN and return None when you
+            # try and read into the file pointer created by http.client, which
+            # instead raises a BadStatusLine exception. Instead of catching
+            # the exception and assuming all BadStatusLine exceptions are read
+            # timeouts, check for a zero timeout before making the request.
+            if read_timeout == 0:
+                raise ReadTimeoutError(
+                    self, url, "Read timed out. (read timeout=%s)" % read_timeout)
+            if read_timeout is Timeout.DEFAULT_TIMEOUT:
+                conn.sock.settimeout(socket.getdefaulttimeout())
+            else:  # None or a value
+                conn.sock.settimeout(read_timeout)
+
+        # Receive the response from the server
+        try:
+            try:  # Python 2.7, use buffering of HTTP responses
+                httplib_response = conn.getresponse(buffering=True)
+            except TypeError:  # Python 2.6 and older
+                httplib_response = conn.getresponse()
+        except (SocketTimeout, BaseSSLError, SocketError) as e:
+            self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
+            raise
+
+        # AppEngine doesn't have a version attr.
+        http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
+        log.debug("\"%s %s %s\" %s %s" % (method, url, http_version,
+                                          httplib_response.status,
+                                          httplib_response.length))
+
+        try:
+            assert_header_parsing(httplib_response.msg)
+        except HeaderParsingError as hpe:  # Platform-specific: Python 3
+            log.warning(
+                'Failed to parse headers (url=%s): %s',
+                self._absolute_url(url), hpe, exc_info=True)
+
+        return httplib_response
+
+    def _absolute_url(self, path):
+        return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url
+
+    def close(self):
+        """
+        Close all pooled connections and disable the pool.
+        """
+        # Disable access to the pool
+        old_pool, self.pool = self.pool, None
+
+        try:
+            while True:
+                conn = old_pool.get(block=False)
+                if conn:
+                    conn.close()
+
+        except Empty:
+            pass  # Done.
+
+    def is_same_host(self, url):
+        """
+        Check if the given ``url`` is a member of the same host as this
+        connection pool.
+        """
+        if url.startswith('/'):
+            return True
+
+        # TODO: Add optional support for socket.gethostbyname checking.
+        scheme, host, port = get_host(url)
+
+        # Use explicit default port for comparison when none is given
+        if self.port and not port:
+            port = port_by_scheme.get(scheme)
+        elif not self.port and port == port_by_scheme.get(scheme):
+            port = None
+
+        return (scheme, host, port) == (self.scheme, self.host, self.port)
+
+    def urlopen(self, method, url, body=None, headers=None, retries=None,
+                redirect=True, assert_same_host=True, timeout=_Default,
+                pool_timeout=None, release_conn=None, **response_kw):
+        """
+        Get a connection from the pool and perform an HTTP request. This is the
+        lowest level call for making a request, so you'll need to specify all
+        the raw details.
+
+        .. note::
+
+           More commonly, it's appropriate to use a convenience method provided
+           by :class:`.RequestMethods`, such as :meth:`request`.
+
+        .. note::
+
+           `release_conn` will only behave as expected if
+           `preload_content=False` because we want to make
+           `preload_content=False` the default behaviour someday soon without
+           breaking backwards compatibility.
+
+        :param method:
+            HTTP request method (such as GET, POST, PUT, etc.)
+
+        :param body:
+            Data to send in the request body (useful for creating
+            POST requests, see HTTPConnectionPool.post_url for
+            more convenience).
+
+        :param headers:
+            Dictionary of custom headers to send, such as User-Agent,
+            If-None-Match, etc. If None, pool headers are used. If provided,
+            these headers completely replace any pool-specific headers.
+
+        :param retries:
+            Configure the number of retries to allow before raising a
+            :class:`~urllib3.exceptions.MaxRetryError` exception.
+
+            Pass ``None`` to retry until you receive a response. Pass a
+            :class:`~urllib3.util.retry.Retry` object for fine-grained control
+            over different types of retries.
+            Pass an integer number to retry connection errors that many times,
+            but no other types of errors. Pass zero to never retry.
+
+            If ``False``, then retries are disabled and any exception is raised
+            immediately. Also, instead of raising a MaxRetryError on redirects,
+            the redirect response will be returned.
+
+        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
+
+        :param redirect:
+            If True, automatically handle redirects (status codes 301, 302,
+            303, 307, 308). Each redirect counts as a retry. Disabling retries
+            will disable redirect, too.
+
+        :param assert_same_host:
+            If ``True``, will make sure that the host of the pool requests is
+            consistent else will raise HostChangedError. When False, you can
+            use the pool on an HTTP proxy and request foreign hosts.
+
+        :param timeout:
+            If specified, overrides the default timeout for this one
+            request. It may be a float (in seconds) or an instance of
+            :class:`urllib3.util.Timeout`.
+
+        :param pool_timeout:
+            If set and the pool is set to block=True, then this method will
+            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
+            connection is available within the time period.
+
+        :param release_conn:
+            If False, then the urlopen call will not release the connection
+            back into the pool once a response is received (but will release if
+            you read the entire contents of the response such as when
+            `preload_content=True`). This is useful if you're not preloading
+            the response's content immediately. You will need to call
+            ``r.release_conn()`` on the response ``r`` to return the connection
+            back into the pool. If None, it takes the value of
+            ``response_kw.get('preload_content', True)``.
+
+        :param \**response_kw:
+            Additional parameters are passed to
+            :meth:`urllib3.response.HTTPResponse.from_httplib`
+        """
+        if headers is None:
+            headers = self.headers
+
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
+
+        if release_conn is None:
+            release_conn = response_kw.get('preload_content', True)
+
+        # Check host
+        if assert_same_host and not self.is_same_host(url):
+            raise HostChangedError(self, url, retries)
+
+        conn = None
+
+        # Merge the proxy headers. Only do this in HTTP. We have to copy the
+        # headers dict so we can safely change it without those changes being
+        # reflected in anyone else's copy.
+        if self.scheme == 'http':
+            headers = headers.copy()
+            headers.update(self.proxy_headers)
+
+        # Must keep the exception bound to a separate variable or else Python 3
+        # complains about UnboundLocalError.
+        err = None
+
+        try:
+            # Request a connection from the queue.
+            timeout_obj = self._get_timeout(timeout)
+            conn = self._get_conn(timeout=pool_timeout)
+
+            conn.timeout = timeout_obj.connect_timeout
+
+            is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)
+            if is_new_proxy_conn:
+                self._prepare_proxy(conn)
+
+            # Make the request on the httplib connection object.
+            httplib_response = self._make_request(conn, method, url,
+                                                  timeout=timeout_obj,
+                                                  body=body, headers=headers)
+
+            # If we're going to release the connection in ``finally:``, then
+            # the request doesn't need to know about the connection. Otherwise
+            # it will also try to release it and we'll have a double-release
+            # mess.
+            response_conn = not release_conn and conn
+
+            # Import httplib's response into our own wrapper object
+            response = HTTPResponse.from_httplib(httplib_response,
+                                                 pool=self,
+                                                 connection=response_conn,
+                                                 **response_kw)
+
+            # else:
+            #     The connection will be put back into the pool when
+            #     ``response.release_conn()`` is called (implicitly by
+            #     ``response.read()``)
+
+        except Empty:
+            # Timed out by queue.
+            raise EmptyPoolError(self, "No pool connections are available.")
+
+        except (BaseSSLError, CertificateError) as e:
+            # Close the connection. If a connection is reused on which there
+            # was a Certificate error, the next request will certainly raise
+            # another Certificate error.
+            conn = conn and conn.close()
+            release_conn = True
+            raise SSLError(e)
+
+        except SSLError:
+            # Treat SSLError separately from BaseSSLError to preserve
+            # traceback.
+            conn = conn and conn.close()
+            release_conn = True
+            raise
+
+        except (TimeoutError, HTTPException, SocketError, ProtocolError) as e:
+            # Discard the connection for these exceptions. It will be
+            # be replaced during the next _get_conn() call.
+            conn = conn and conn.close()
+            release_conn = True
+
+            if isinstance(e, (SocketError, NewConnectionError)) and self.proxy:
+                e = ProxyError('Cannot connect to proxy.', e)
+            elif isinstance(e, (SocketError, HTTPException)):
+                e = ProtocolError('Connection aborted.', e)
+
+            retries = retries.increment(method, url, error=e, _pool=self,
+                                        _stacktrace=sys.exc_info()[2])
+            retries.sleep()
+
+            # Keep track of the error for the retry warning.
+            err = e
+
+        finally:
+            if release_conn:
+                # Put the connection back to be reused. If the connection is
+                # expired then it will be None, which will get replaced with a
+                # fresh connection during _get_conn.
+                self._put_conn(conn)
+
+        if not conn:
+            # Try again
+            log.warning("Retrying (%r) after connection "
+                        "broken by '%r': %s" % (retries, err, url))
+            return self.urlopen(method, url, body, headers, retries,
+                                redirect, assert_same_host,
+                                timeout=timeout, pool_timeout=pool_timeout,
+                                release_conn=release_conn, **response_kw)
+
+        # Handle redirect?
+        redirect_location = redirect and response.get_redirect_location()
+        if redirect_location:
+            if response.status == 303:
+                method = 'GET'
+
+            try:
+                retries = retries.increment(method, url, response=response, _pool=self)
+            except MaxRetryError:
+                if retries.raise_on_redirect:
+                    # Release the connection for this response, since we're not
+                    # returning it to be released manually.
+                    response.release_conn()
+                    raise
+                return response
+
+            log.info("Redirecting %s -> %s" % (url, redirect_location))
+            return self.urlopen(
+                method, redirect_location, body, headers,
+                retries=retries, redirect=redirect,
+                assert_same_host=assert_same_host,
+                timeout=timeout, pool_timeout=pool_timeout,
+                release_conn=release_conn, **response_kw)
+
+        # Check if we should retry the HTTP response.
+        if retries.is_forced_retry(method, status_code=response.status):
+            retries = retries.increment(method, url, response=response, _pool=self)
+            retries.sleep()
+            log.info("Forced retry: %s" % url)
+            return self.urlopen(
+                method, url, body, headers,
+                retries=retries, redirect=redirect,
+                assert_same_host=assert_same_host,
+                timeout=timeout, pool_timeout=pool_timeout,
+                release_conn=release_conn, **response_kw)
+
+        return response
+
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+    """
+    Same as :class:`.HTTPConnectionPool`, but HTTPS.
+
+    When Python is compiled with the :mod:`ssl` module, then
+    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
+    instead of :class:`.HTTPSConnection`.
+
+    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,
+    ``assert_hostname`` and ``host`` in this order to verify connections.
+    If ``assert_hostname`` is False, no verification is done.
+
+    The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``,
+    ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is
+    available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade
+    the connection socket into an SSL socket.
+    """
+
+    scheme = 'https'
+    ConnectionCls = HTTPSConnection
+
+    def __init__(self, host, port=None,
+                 strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1,
+                 block=False, headers=None, retries=None,
+                 _proxy=None, _proxy_headers=None,
+                 key_file=None, cert_file=None, cert_reqs=None,
+                 ca_certs=None, ssl_version=None,
+                 assert_hostname=None, assert_fingerprint=None,
+                 ca_cert_dir=None, **conn_kw):
+
+        HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize,
+                                    block, headers, retries, _proxy, _proxy_headers,
+                                    **conn_kw)
+
+        if ca_certs and cert_reqs is None:
+            cert_reqs = 'CERT_REQUIRED'
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = cert_reqs
+        self.ca_certs = ca_certs
+        self.ca_cert_dir = ca_cert_dir
+        self.ssl_version = ssl_version
+        self.assert_hostname = assert_hostname
+        self.assert_fingerprint = assert_fingerprint
+
+    def _prepare_conn(self, conn):
+        """
+        Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket`
+        and establish the tunnel if proxy is used.
+        """
+
+        if isinstance(conn, VerifiedHTTPSConnection):
+            conn.set_cert(key_file=self.key_file,
+                          cert_file=self.cert_file,
+                          cert_reqs=self.cert_reqs,
+                          ca_certs=self.ca_certs,
+                          ca_cert_dir=self.ca_cert_dir,
+                          assert_hostname=self.assert_hostname,
+                          assert_fingerprint=self.assert_fingerprint)
+            conn.ssl_version = self.ssl_version
+
+        return conn
+
+    def _prepare_proxy(self, conn):
+        """
+        Establish tunnel connection early, because otherwise httplib
+        would improperly set Host: header to proxy's IP:port.
+        """
+        # Python 2.7+
+        try:
+            set_tunnel = conn.set_tunnel
+        except AttributeError:  # Platform-specific: Python 2.6
+            set_tunnel = conn._set_tunnel
+
+        if sys.version_info <= (2, 6, 4) and not self.proxy_headers:   # Python 2.6.4 and older
+            set_tunnel(self.host, self.port)
+        else:
+            set_tunnel(self.host, self.port, self.proxy_headers)
+
+        conn.connect()
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`httplib.HTTPSConnection`.
+        """
+        self.num_connections += 1
+        log.info("Starting new HTTPS connection (%d): %s"
+                 % (self.num_connections, self.host))
+
+        if not self.ConnectionCls or self.ConnectionCls is DummyConnection:
+            raise SSLError("Can't connect to HTTPS URL because the SSL "
+                           "module is not available.")
+
+        actual_host = self.host
+        actual_port = self.port
+        if self.proxy is not None:
+            actual_host = self.proxy.host
+            actual_port = self.proxy.port
+
+        conn = self.ConnectionCls(host=actual_host, port=actual_port,
+                                  timeout=self.timeout.connect_timeout,
+                                  strict=self.strict, **self.conn_kw)
+
+        return self._prepare_conn(conn)
+
+    def _validate_conn(self, conn):
+        """
+        Called right before a request is made, after the socket is created.
+        """
+        super(HTTPSConnectionPool, self)._validate_conn(conn)
+
+        # Force connect early to allow us to validate the connection.
+        if not getattr(conn, 'sock', None):  # AppEngine might not have  `.sock`
+            conn.connect()
+
+        if not conn.is_verified:
+            warnings.warn((
+                'Unverified HTTPS request is being made. '
+                'Adding certificate verification is strongly advised. See: '
+                'https://urllib3.readthedocs.org/en/latest/security.html'),
+                InsecureRequestWarning)
+
+
+def connection_from_url(url, **kw):
+    """
+    Given a url, return an :class:`.ConnectionPool` instance of its host.
+
+    This is a shortcut for not having to parse out the scheme, host, and port
+    of the url before creating an :class:`.ConnectionPool` instance.
+
+    :param url:
+        Absolute URL string that must include the scheme. Port is optional.
+
+    :param \**kw:
+        Passes additional parameters to the constructor of the appropriate
+        :class:`.ConnectionPool`. Useful for specifying things like
+        timeout, maxsize, headers, etc.
+
+    Example::
+
+        >>> conn = connection_from_url('http://google.com/')
+        >>> r = conn.request('GET', '/')
+    """
+    scheme, host, port = get_host(url)
+    if scheme == 'https':
+        return HTTPSConnectionPool(host, port=port, **kw)
+    else:
+        return HTTPConnectionPool(host, port=port, **kw)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/ntlmpool.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/ntlmpool.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/ntlmpool.py	(revision 1126)
@@ -0,0 +1,115 @@
+"""
+NTLM authenticating pool, contributed by erikcederstran
+
+Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
+"""
+from __future__ import absolute_import
+
+try:
+    from http.client import HTTPSConnection
+except ImportError:
+    from httplib import HTTPSConnection
+from logging import getLogger
+from ntlm import ntlm
+
+from urllib3 import HTTPSConnectionPool
+
+
+log = getLogger(__name__)
+
+
+class NTLMConnectionPool(HTTPSConnectionPool):
+    """
+    Implements an NTLM authentication version of an urllib3 connection pool
+    """
+
+    scheme = 'https'
+
+    def __init__(self, user, pw, authurl, *args, **kwargs):
+        """
+        authurl is a random URL on the server that is protected by NTLM.
+        user is the Windows user, probably in the DOMAIN\\username format.
+        pw is the password for the user.
+        """
+        super(NTLMConnectionPool, self).__init__(*args, **kwargs)
+        self.authurl = authurl
+        self.rawuser = user
+        user_parts = user.split('\\', 1)
+        self.domain = user_parts[0].upper()
+        self.user = user_parts[1]
+        self.pw = pw
+
+    def _new_conn(self):
+        # Performs the NTLM handshake that secures the connection. The socket
+        # must be kept open while requests are performed.
+        self.num_connections += 1
+        log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' %
+                  (self.num_connections, self.host, self.authurl))
+
+        headers = {}
+        headers['Connection'] = 'Keep-Alive'
+        req_header = 'Authorization'
+        resp_header = 'www-authenticate'
+
+        conn = HTTPSConnection(host=self.host, port=self.port)
+
+        # Send negotiation message
+        headers[req_header] = (
+            'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser))
+        log.debug('Request headers: %s' % headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        reshdr = dict(res.getheaders())
+        log.debug('Response status: %s %s' % (res.status, res.reason))
+        log.debug('Response headers: %s' % reshdr)
+        log.debug('Response data: %s [...]' % res.read(100))
+
+        # Remove the reference to the socket, so that it can not be closed by
+        # the response object (we want to keep the socket open)
+        res.fp = None
+
+        # Server should respond with a challenge message
+        auth_header_values = reshdr[resp_header].split(', ')
+        auth_header_value = None
+        for s in auth_header_values:
+            if s[:5] == 'NTLM ':
+                auth_header_value = s[5:]
+        if auth_header_value is None:
+            raise Exception('Unexpected %s response header: %s' %
+                            (resp_header, reshdr[resp_header]))
+
+        # Send authentication message
+        ServerChallenge, NegotiateFlags = \
+            ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value)
+        auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge,
+                                                         self.user,
+                                                         self.domain,
+                                                         self.pw,
+                                                         NegotiateFlags)
+        headers[req_header] = 'NTLM %s' % auth_msg
+        log.debug('Request headers: %s' % headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        log.debug('Response status: %s %s' % (res.status, res.reason))
+        log.debug('Response headers: %s' % dict(res.getheaders()))
+        log.debug('Response data: %s [...]' % res.read()[:100])
+        if res.status != 200:
+            if res.status == 401:
+                raise Exception('Server rejected request: wrong '
+                                'username or password')
+            raise Exception('Wrong server response: %s %s' %
+                            (res.status, res.reason))
+
+        res.fp = None
+        log.debug('Connection established')
+        return conn
+
+    def urlopen(self, method, url, body=None, headers=None, retries=3,
+                redirect=True, assert_same_host=True):
+        if headers is None:
+            headers = {}
+        headers['Connection'] = 'Keep-Alive'
+        return super(NTLMConnectionPool, self).urlopen(method, url, body,
+                                                       headers, retries,
+                                                       redirect,
+                                                       assert_same_host)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/appengine.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/appengine.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/appengine.py	(revision 1126)
@@ -0,0 +1,223 @@
+from __future__ import absolute_import
+import logging
+import os
+import warnings
+
+from ..exceptions import (
+    HTTPError,
+    HTTPWarning,
+    MaxRetryError,
+    ProtocolError,
+    TimeoutError,
+    SSLError
+)
+
+from ..packages.six import BytesIO
+from ..request import RequestMethods
+from ..response import HTTPResponse
+from ..util.timeout import Timeout
+from ..util.retry import Retry
+
+try:
+    from google.appengine.api import urlfetch
+except ImportError:
+    urlfetch = None
+
+
+log = logging.getLogger(__name__)
+
+
+class AppEnginePlatformWarning(HTTPWarning):
+    pass
+
+
+class AppEnginePlatformError(HTTPError):
+    pass
+
+
+class AppEngineManager(RequestMethods):
+    """
+    Connection manager for Google App Engine sandbox applications.
+
+    This manager uses the URLFetch service directly instead of using the
+    emulated httplib, and is subject to URLFetch limitations as described in
+    the App Engine documentation here:
+
+        https://cloud.google.com/appengine/docs/python/urlfetch
+
+    Notably it will raise an AppEnginePlatformError if:
+        * URLFetch is not available.
+        * If you attempt to use this on GAEv2 (Managed VMs), as full socket
+          support is available.
+        * If a request size is more than 10 megabytes.
+        * If a response size is more than 32 megabtyes.
+        * If you use an unsupported request method such as OPTIONS.
+
+    Beyond those cases, it will raise normal urllib3 errors.
+    """
+
+    def __init__(self, headers=None, retries=None, validate_certificate=True):
+        if not urlfetch:
+            raise AppEnginePlatformError(
+                "URLFetch is not available in this environment.")
+
+        if is_prod_appengine_mvms():
+            raise AppEnginePlatformError(
+                "Use normal urllib3.PoolManager instead of AppEngineManager"
+                "on Managed VMs, as using URLFetch is not necessary in "
+                "this environment.")
+
+        warnings.warn(
+            "urllib3 is using URLFetch on Google App Engine sandbox instead "
+            "of sockets. To use sockets directly instead of URLFetch see "
+            "https://urllib3.readthedocs.org/en/latest/contrib.html.",
+            AppEnginePlatformWarning)
+
+        RequestMethods.__init__(self, headers)
+        self.validate_certificate = validate_certificate
+
+        self.retries = retries or Retry.DEFAULT
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def urlopen(self, method, url, body=None, headers=None,
+                retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT,
+                **response_kw):
+
+        retries = self._get_retries(retries, redirect)
+
+        try:
+            response = urlfetch.fetch(
+                url,
+                payload=body,
+                method=method,
+                headers=headers or {},
+                allow_truncated=False,
+                follow_redirects=(
+                    redirect and
+                    retries.redirect != 0 and
+                    retries.total),
+                deadline=self._get_absolute_timeout(timeout),
+                validate_certificate=self.validate_certificate,
+            )
+        except urlfetch.DeadlineExceededError as e:
+            raise TimeoutError(self, e)
+
+        except urlfetch.InvalidURLError as e:
+            if 'too large' in str(e):
+                raise AppEnginePlatformError(
+                    "URLFetch request too large, URLFetch only "
+                    "supports requests up to 10mb in size.", e)
+            raise ProtocolError(e)
+
+        except urlfetch.DownloadError as e:
+            if 'Too many redirects' in str(e):
+                raise MaxRetryError(self, url, reason=e)
+            raise ProtocolError(e)
+
+        except urlfetch.ResponseTooLargeError as e:
+            raise AppEnginePlatformError(
+                "URLFetch response too large, URLFetch only supports"
+                "responses up to 32mb in size.", e)
+
+        except urlfetch.SSLCertificateError as e:
+            raise SSLError(e)
+
+        except urlfetch.InvalidMethodError as e:
+            raise AppEnginePlatformError(
+                "URLFetch does not support method: %s" % method, e)
+
+        http_response = self._urlfetch_response_to_http_response(
+            response, **response_kw)
+
+        # Check for redirect response
+        if (http_response.get_redirect_location() and
+                retries.raise_on_redirect and redirect):
+            raise MaxRetryError(self, url, "too many redirects")
+
+        # Check if we should retry the HTTP response.
+        if retries.is_forced_retry(method, status_code=http_response.status):
+            retries = retries.increment(
+                method, url, response=http_response, _pool=self)
+            log.info("Forced retry: %s" % url)
+            retries.sleep()
+            return self.urlopen(
+                method, url,
+                body=body, headers=headers,
+                retries=retries, redirect=redirect,
+                timeout=timeout, **response_kw)
+
+        return http_response
+
+    def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw):
+
+        if is_prod_appengine():
+            # Production GAE handles deflate encoding automatically, but does
+            # not remove the encoding header.
+            content_encoding = urlfetch_resp.headers.get('content-encoding')
+
+            if content_encoding == 'deflate':
+                del urlfetch_resp.headers['content-encoding']
+
+        return HTTPResponse(
+            # In order for decoding to work, we must present the content as
+            # a file-like object.
+            body=BytesIO(urlfetch_resp.content),
+            headers=urlfetch_resp.headers,
+            status=urlfetch_resp.status_code,
+            **response_kw
+        )
+
+    def _get_absolute_timeout(self, timeout):
+        if timeout is Timeout.DEFAULT_TIMEOUT:
+            return 5  # 5s is the default timeout for URLFetch.
+        if isinstance(timeout, Timeout):
+            if timeout.read is not timeout.connect:
+                warnings.warn(
+                    "URLFetch does not support granular timeout settings, "
+                    "reverting to total timeout.", AppEnginePlatformWarning)
+            return timeout.total
+        return timeout
+
+    def _get_retries(self, retries, redirect):
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(
+                retries, redirect=redirect, default=self.retries)
+
+        if retries.connect or retries.read or retries.redirect:
+            warnings.warn(
+                "URLFetch only supports total retries and does not "
+                "recognize connect, read, or redirect retry parameters.",
+                AppEnginePlatformWarning)
+
+        return retries
+
+
+def is_appengine():
+    return (is_local_appengine() or
+            is_prod_appengine() or
+            is_prod_appengine_mvms())
+
+
+def is_appengine_sandbox():
+    return is_appengine() and not is_prod_appengine_mvms()
+
+
+def is_local_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Development/' in os.environ['SERVER_SOFTWARE'])
+
+
+def is_prod_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
+            not is_prod_appengine_mvms())
+
+
+def is_prod_appengine_mvms():
+    return os.environ.get('GAE_VM', False) == 'true'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/pyopenssl.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/pyopenssl.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/pyopenssl.py	(revision 1126)
@@ -0,0 +1,310 @@
+'''SSL with SNI_-support for Python 2. Follow these instructions if you would
+like to verify SSL certificates in Python 2. Note, the default libraries do
+*not* do certificate checking; you need to do additional work to validate
+certificates yourself.
+
+This needs the following packages installed:
+
+* pyOpenSSL (tested with 0.13)
+* ndg-httpsclient (tested with 0.3.2)
+* pyasn1 (tested with 0.1.6)
+
+You can install them with the following command:
+
+    pip install pyopenssl ndg-httpsclient pyasn1
+
+To activate certificate checking, call
+:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
+before you begin making HTTP requests. This can be done in a ``sitecustomize``
+module, or at any other time before your application begins using ``urllib3``,
+like this::
+
+    try:
+        import urllib3.contrib.pyopenssl
+        urllib3.contrib.pyopenssl.inject_into_urllib3()
+    except ImportError:
+        pass
+
+Now you can use :mod:`urllib3` as you normally would, and it will support SNI
+when the required modules are installed.
+
+Activating this module also has the positive side effect of disabling SSL/TLS
+compression in Python 2 (see `CRIME attack`_).
+
+If you want to configure the default list of supported cipher suites, you can
+set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable.
+
+Module Variables
+----------------
+
+:var DEFAULT_SSL_CIPHER_LIST: The list of supported SSL/TLS cipher suites.
+
+.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication
+.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)
+
+'''
+from __future__ import absolute_import
+
+try:
+    from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT
+    from ndg.httpsclient.subj_alt_name import SubjectAltName as BaseSubjectAltName
+except SyntaxError as e:
+    raise ImportError(e)
+
+import OpenSSL.SSL
+from pyasn1.codec.der import decoder as der_decoder
+from pyasn1.type import univ, constraint
+from socket import _fileobject, timeout, error as SocketError
+import ssl
+import select
+
+from .. import connection
+from .. import util
+
+__all__ = ['inject_into_urllib3', 'extract_from_urllib3']
+
+# SNI only *really* works if we can read the subjectAltName of certificates.
+HAS_SNI = SUBJ_ALT_NAME_SUPPORT
+
+# Map from urllib3 to PyOpenSSL compatible parameter-values.
+_openssl_versions = {
+    ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD,
+    ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
+}
+
+if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'):
+    _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD
+
+if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'):
+    _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD
+
+try:
+    _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD})
+except AttributeError:
+    pass
+
+_openssl_verify = {
+    ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
+    ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
+    ssl.CERT_REQUIRED:
+        OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
+}
+
+DEFAULT_SSL_CIPHER_LIST = util.ssl_.DEFAULT_CIPHERS
+
+# OpenSSL will only write 16K at a time
+SSL_WRITE_BLOCKSIZE = 16384
+
+orig_util_HAS_SNI = util.HAS_SNI
+orig_connection_ssl_wrap_socket = connection.ssl_wrap_socket
+
+
+def inject_into_urllib3():
+    'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.'
+
+    connection.ssl_wrap_socket = ssl_wrap_socket
+    util.HAS_SNI = HAS_SNI
+
+
+def extract_from_urllib3():
+    'Undo monkey-patching by :func:`inject_into_urllib3`.'
+
+    connection.ssl_wrap_socket = orig_connection_ssl_wrap_socket
+    util.HAS_SNI = orig_util_HAS_SNI
+
+
+# Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
+class SubjectAltName(BaseSubjectAltName):
+    '''ASN.1 implementation for subjectAltNames support'''
+
+    # There is no limit to how many SAN certificates a certificate may have,
+    #   however this needs to have some limit so we'll set an arbitrarily high
+    #   limit.
+    sizeSpec = univ.SequenceOf.sizeSpec + \
+        constraint.ValueSizeConstraint(1, 1024)
+
+
+# Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
+def get_subj_alt_name(peer_cert):
+    # Search through extensions
+    dns_name = []
+    if not SUBJ_ALT_NAME_SUPPORT:
+        return dns_name
+
+    general_names = SubjectAltName()
+    for i in range(peer_cert.get_extension_count()):
+        ext = peer_cert.get_extension(i)
+        ext_name = ext.get_short_name()
+        if ext_name != 'subjectAltName':
+            continue
+
+        # PyOpenSSL returns extension data in ASN.1 encoded form
+        ext_dat = ext.get_data()
+        decoded_dat = der_decoder.decode(ext_dat,
+                                         asn1Spec=general_names)
+
+        for name in decoded_dat:
+            if not isinstance(name, SubjectAltName):
+                continue
+            for entry in range(len(name)):
+                component = name.getComponentByPosition(entry)
+                if component.getName() != 'dNSName':
+                    continue
+                dns_name.append(str(component.getComponent()))
+
+    return dns_name
+
+
+class WrappedSocket(object):
+    '''API-compatibility wrapper for Python OpenSSL's Connection-class.
+
+    Note: _makefile_refs, _drop() and _reuse() are needed for the garbage
+    collector of pypy.
+    '''
+
+    def __init__(self, connection, socket, suppress_ragged_eofs=True):
+        self.connection = connection
+        self.socket = socket
+        self.suppress_ragged_eofs = suppress_ragged_eofs
+        self._makefile_refs = 0
+
+    def fileno(self):
+        return self.socket.fileno()
+
+    def makefile(self, mode, bufsize=-1):
+        self._makefile_refs += 1
+        return _fileobject(self, mode, bufsize, close=True)
+
+    def recv(self, *args, **kwargs):
+        try:
+            data = self.connection.recv(*args, **kwargs)
+        except OpenSSL.SSL.SysCallError as e:
+            if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
+                return b''
+            else:
+                raise SocketError(e)
+        except OpenSSL.SSL.ZeroReturnError as e:
+            if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
+                return b''
+            else:
+                raise
+        except OpenSSL.SSL.WantReadError:
+            rd, wd, ed = select.select(
+                [self.socket], [], [], self.socket.gettimeout())
+            if not rd:
+                raise timeout('The read operation timed out')
+            else:
+                return self.recv(*args, **kwargs)
+        else:
+            return data
+
+    def settimeout(self, timeout):
+        return self.socket.settimeout(timeout)
+
+    def _send_until_done(self, data):
+        while True:
+            try:
+                return self.connection.send(data)
+            except OpenSSL.SSL.WantWriteError:
+                _, wlist, _ = select.select([], [self.socket], [],
+                                            self.socket.gettimeout())
+                if not wlist:
+                    raise timeout()
+                continue
+
+    def sendall(self, data):
+        total_sent = 0
+        while total_sent < len(data):
+            sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
+            total_sent += sent
+
+    def shutdown(self):
+        # FIXME rethrow compatible exceptions should we ever use this
+        self.connection.shutdown()
+
+    def close(self):
+        if self._makefile_refs < 1:
+            try:
+                return self.connection.close()
+            except OpenSSL.SSL.Error:
+                return
+        else:
+            self._makefile_refs -= 1
+
+    def getpeercert(self, binary_form=False):
+        x509 = self.connection.get_peer_certificate()
+
+        if not x509:
+            return x509
+
+        if binary_form:
+            return OpenSSL.crypto.dump_certificate(
+                OpenSSL.crypto.FILETYPE_ASN1,
+                x509)
+
+        return {
+            'subject': (
+                (('commonName', x509.get_subject().CN),),
+            ),
+            'subjectAltName': [
+                ('DNS', value)
+                for value in get_subj_alt_name(x509)
+            ]
+        }
+
+    def _reuse(self):
+        self._makefile_refs += 1
+
+    def _drop(self):
+        if self._makefile_refs < 1:
+            self.close()
+        else:
+            self._makefile_refs -= 1
+
+
+def _verify_callback(cnx, x509, err_no, err_depth, return_code):
+    return err_no == 0
+
+
+def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
+                    ca_certs=None, server_hostname=None,
+                    ssl_version=None, ca_cert_dir=None):
+    ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version])
+    if certfile:
+        keyfile = keyfile or certfile  # Match behaviour of the normal python ssl library
+        ctx.use_certificate_file(certfile)
+    if keyfile:
+        ctx.use_privatekey_file(keyfile)
+    if cert_reqs != ssl.CERT_NONE:
+        ctx.set_verify(_openssl_verify[cert_reqs], _verify_callback)
+    if ca_certs or ca_cert_dir:
+        try:
+            ctx.load_verify_locations(ca_certs, ca_cert_dir)
+        except OpenSSL.SSL.Error as e:
+            raise ssl.SSLError('bad ca_certs: %r' % ca_certs, e)
+    else:
+        ctx.set_default_verify_paths()
+
+    # Disable TLS compression to migitate CRIME attack (issue #309)
+    OP_NO_COMPRESSION = 0x20000
+    ctx.set_options(OP_NO_COMPRESSION)
+
+    # Set list of supported ciphersuites.
+    ctx.set_cipher_list(DEFAULT_SSL_CIPHER_LIST)
+
+    cnx = OpenSSL.SSL.Connection(ctx, sock)
+    cnx.set_tlsext_host_name(server_hostname)
+    cnx.set_connect_state()
+    while True:
+        try:
+            cnx.do_handshake()
+        except OpenSSL.SSL.WantReadError:
+            rd, _, _ = select.select([sock], [], [], sock.gettimeout())
+            if not rd:
+                raise timeout('select timed out')
+            continue
+        except OpenSSL.SSL.Error as e:
+            raise ssl.SSLError('bad handshake: %r' % e)
+        break
+
+    return WrappedSocket(cnx, sock)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/contrib/__init__.py
===================================================================
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/_collections.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/_collections.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/_collections.py	(revision 1126)
@@ -0,0 +1,324 @@
+from __future__ import absolute_import
+from collections import Mapping, MutableMapping
+try:
+    from threading import RLock
+except ImportError:  # Platform-specific: No threads available
+    class RLock:
+        def __enter__(self):
+            pass
+
+        def __exit__(self, exc_type, exc_value, traceback):
+            pass
+
+
+try:  # Python 2.7+
+    from collections import OrderedDict
+except ImportError:
+    from .packages.ordered_dict import OrderedDict
+from .packages.six import iterkeys, itervalues, PY3
+
+
+__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict']
+
+
+_Null = object()
+
+
+class RecentlyUsedContainer(MutableMapping):
+    """
+    Provides a thread-safe dict-like container which maintains up to
+    ``maxsize`` keys while throwing away the least-recently-used keys beyond
+    ``maxsize``.
+
+    :param maxsize:
+        Maximum number of recent elements to retain.
+
+    :param dispose_func:
+        Every time an item is evicted from the container,
+        ``dispose_func(value)`` is called.  Callback which will get called
+    """
+
+    ContainerCls = OrderedDict
+
+    def __init__(self, maxsize=10, dispose_func=None):
+        self._maxsize = maxsize
+        self.dispose_func = dispose_func
+
+        self._container = self.ContainerCls()
+        self.lock = RLock()
+
+    def __getitem__(self, key):
+        # Re-insert the item, moving it to the end of the eviction line.
+        with self.lock:
+            item = self._container.pop(key)
+            self._container[key] = item
+            return item
+
+    def __setitem__(self, key, value):
+        evicted_value = _Null
+        with self.lock:
+            # Possibly evict the existing value of 'key'
+            evicted_value = self._container.get(key, _Null)
+            self._container[key] = value
+
+            # If we didn't evict an existing value, we might have to evict the
+            # least recently used item from the beginning of the container.
+            if len(self._container) > self._maxsize:
+                _key, evicted_value = self._container.popitem(last=False)
+
+        if self.dispose_func and evicted_value is not _Null:
+            self.dispose_func(evicted_value)
+
+    def __delitem__(self, key):
+        with self.lock:
+            value = self._container.pop(key)
+
+        if self.dispose_func:
+            self.dispose_func(value)
+
+    def __len__(self):
+        with self.lock:
+            return len(self._container)
+
+    def __iter__(self):
+        raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')
+
+    def clear(self):
+        with self.lock:
+            # Copy pointers to all values, then wipe the mapping
+            values = list(itervalues(self._container))
+            self._container.clear()
+
+        if self.dispose_func:
+            for value in values:
+                self.dispose_func(value)
+
+    def keys(self):
+        with self.lock:
+            return list(iterkeys(self._container))
+
+
+class HTTPHeaderDict(MutableMapping):
+    """
+    :param headers:
+        An iterable of field-value pairs. Must not contain multiple field names
+        when compared case-insensitively.
+
+    :param kwargs:
+        Additional field-value pairs to pass in to ``dict.update``.
+
+    A ``dict`` like container for storing HTTP Headers.
+
+    Field names are stored and compared case-insensitively in compliance with
+    RFC 7230. Iteration provides the first case-sensitive key seen for each
+    case-insensitive pair.
+
+    Using ``__setitem__`` syntax overwrites fields that compare equal
+    case-insensitively in order to maintain ``dict``'s api. For fields that
+    compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
+    in a loop.
+
+    If multiple fields that are equal case-insensitively are passed to the
+    constructor or ``.update``, the behavior is undefined and some will be
+    lost.
+
+    >>> headers = HTTPHeaderDict()
+    >>> headers.add('Set-Cookie', 'foo=bar')
+    >>> headers.add('set-cookie', 'baz=quxx')
+    >>> headers['content-length'] = '7'
+    >>> headers['SET-cookie']
+    'foo=bar, baz=quxx'
+    >>> headers['Content-Length']
+    '7'
+    """
+
+    def __init__(self, headers=None, **kwargs):
+        super(HTTPHeaderDict, self).__init__()
+        self._container = {}
+        if headers is not None:
+            if isinstance(headers, HTTPHeaderDict):
+                self._copy_from(headers)
+            else:
+                self.extend(headers)
+        if kwargs:
+            self.extend(kwargs)
+
+    def __setitem__(self, key, val):
+        self._container[key.lower()] = (key, val)
+        return self._container[key.lower()]
+
+    def __getitem__(self, key):
+        val = self._container[key.lower()]
+        return ', '.join(val[1:])
+
+    def __delitem__(self, key):
+        del self._container[key.lower()]
+
+    def __contains__(self, key):
+        return key.lower() in self._container
+
+    def __eq__(self, other):
+        if not isinstance(other, Mapping) and not hasattr(other, 'keys'):
+            return False
+        if not isinstance(other, type(self)):
+            other = type(self)(other)
+        return (dict((k.lower(), v) for k, v in self.itermerged()) ==
+                dict((k.lower(), v) for k, v in other.itermerged()))
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    if not PY3:  # Python 2
+        iterkeys = MutableMapping.iterkeys
+        itervalues = MutableMapping.itervalues
+
+    __marker = object()
+
+    def __len__(self):
+        return len(self._container)
+
+    def __iter__(self):
+        # Only provide the originally cased names
+        for vals in self._container.values():
+            yield vals[0]
+
+    def pop(self, key, default=__marker):
+        '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+          If key is not found, d is returned if given, otherwise KeyError is raised.
+        '''
+        # Using the MutableMapping function directly fails due to the private marker.
+        # Using ordinary dict.pop would expose the internal structures.
+        # So let's reinvent the wheel.
+        try:
+            value = self[key]
+        except KeyError:
+            if default is self.__marker:
+                raise
+            return default
+        else:
+            del self[key]
+            return value
+
+    def discard(self, key):
+        try:
+            del self[key]
+        except KeyError:
+            pass
+
+    def add(self, key, val):
+        """Adds a (name, value) pair, doesn't overwrite the value if it already
+        exists.
+
+        >>> headers = HTTPHeaderDict(foo='bar')
+        >>> headers.add('Foo', 'baz')
+        >>> headers['foo']
+        'bar, baz'
+        """
+        key_lower = key.lower()
+        new_vals = key, val
+        # Keep the common case aka no item present as fast as possible
+        vals = self._container.setdefault(key_lower, new_vals)
+        if new_vals is not vals:
+            # new_vals was not inserted, as there was a previous one
+            if isinstance(vals, list):
+                # If already several items got inserted, we have a list
+                vals.append(val)
+            else:
+                # vals should be a tuple then, i.e. only one item so far
+                # Need to convert the tuple to list for further extension
+                self._container[key_lower] = [vals[0], vals[1], val]
+
+    def extend(self, *args, **kwargs):
+        """Generic import function for any type of header-like object.
+        Adapted version of MutableMapping.update in order to insert items
+        with self.add instead of self.__setitem__
+        """
+        if len(args) > 1:
+            raise TypeError("extend() takes at most 1 positional "
+                            "arguments ({0} given)".format(len(args)))
+        other = args[0] if len(args) >= 1 else ()
+
+        if isinstance(other, HTTPHeaderDict):
+            for key, val in other.iteritems():
+                self.add(key, val)
+        elif isinstance(other, Mapping):
+            for key in other:
+                self.add(key, other[key])
+        elif hasattr(other, "keys"):
+            for key in other.keys():
+                self.add(key, other[key])
+        else:
+            for key, value in other:
+                self.add(key, value)
+
+        for key, value in kwargs.items():
+            self.add(key, value)
+
+    def getlist(self, key):
+        """Returns a list of all the values for the named field. Returns an
+        empty list if the key doesn't exist."""
+        try:
+            vals = self._container[key.lower()]
+        except KeyError:
+            return []
+        else:
+            if isinstance(vals, tuple):
+                return [vals[1]]
+            else:
+                return vals[1:]
+
+    # Backwards compatibility for httplib
+    getheaders = getlist
+    getallmatchingheaders = getlist
+    iget = getlist
+
+    def __repr__(self):
+        return "%s(%s)" % (type(self).__name__, dict(self.itermerged()))
+
+    def _copy_from(self, other):
+        for key in other:
+            val = other.getlist(key)
+            if isinstance(val, list):
+                # Don't need to convert tuples
+                val = list(val)
+            self._container[key.lower()] = [key] + val
+
+    def copy(self):
+        clone = type(self)()
+        clone._copy_from(self)
+        return clone
+
+    def iteritems(self):
+        """Iterate over all header lines, including duplicate ones."""
+        for key in self:
+            vals = self._container[key.lower()]
+            for val in vals[1:]:
+                yield vals[0], val
+
+    def itermerged(self):
+        """Iterate over all headers, merging duplicate ones together."""
+        for key in self:
+            val = self._container[key.lower()]
+            yield val[0], ', '.join(val[1:])
+
+    def items(self):
+        return list(self.iteritems())
+
+    @classmethod
+    def from_httplib(cls, message):  # Python 2
+        """Read headers from a Python 2 httplib message object."""
+        # python2.7 does not expose a proper API for exporting multiheaders
+        # efficiently. This function re-reads raw lines from the message
+        # object and extracts the multiheaders properly.
+        headers = []
+
+        for line in message.headers:
+            if line.startswith((' ', '\t')):
+                key, value = headers[-1]
+                headers[-1] = (key, value + '\r\n' + line.rstrip())
+                continue
+
+            key, value = line.split(':', 1)
+            headers.append((key, value.strip()))
+
+        return cls(headers)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/response.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/response.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/response.py	(revision 1126)
@@ -0,0 +1,514 @@
+from __future__ import absolute_import
+from contextlib import contextmanager
+import zlib
+import io
+from socket import timeout as SocketTimeout
+from socket import error as SocketError
+
+from ._collections import HTTPHeaderDict
+from .exceptions import (
+    ProtocolError, DecodeError, ReadTimeoutError, ResponseNotChunked
+)
+from .packages.six import string_types as basestring, binary_type, PY3
+from .packages.six.moves import http_client as httplib
+from .connection import HTTPException, BaseSSLError
+from .util.response import is_fp_closed, is_response_to_head
+
+
+class DeflateDecoder(object):
+
+    def __init__(self):
+        self._first_try = True
+        self._data = binary_type()
+        self._obj = zlib.decompressobj()
+
+    def __getattr__(self, name):
+        return getattr(self._obj, name)
+
+    def decompress(self, data):
+        if not data:
+            return data
+
+        if not self._first_try:
+            return self._obj.decompress(data)
+
+        self._data += data
+        try:
+            return self._obj.decompress(data)
+        except zlib.error:
+            self._first_try = False
+            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
+            try:
+                return self.decompress(self._data)
+            finally:
+                self._data = None
+
+
+class GzipDecoder(object):
+
+    def __init__(self):
+        self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
+
+    def __getattr__(self, name):
+        return getattr(self._obj, name)
+
+    def decompress(self, data):
+        if not data:
+            return data
+        return self._obj.decompress(data)
+
+
+def _get_decoder(mode):
+    if mode == 'gzip':
+        return GzipDecoder()
+
+    return DeflateDecoder()
+
+
+class HTTPResponse(io.IOBase):
+    """
+    HTTP Response container.
+
+    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is
+    loaded and decoded on-demand when the ``data`` property is accessed.  This
+    class is also compatible with the Python standard library's :mod:`io`
+    module, and can hence be treated as a readable object in the context of that
+    framework.
+
+    Extra parameters for behaviour not present in httplib.HTTPResponse:
+
+    :param preload_content:
+        If True, the response's body will be preloaded during construction.
+
+    :param decode_content:
+        If True, attempts to decode specific content-encoding's based on headers
+        (like 'gzip' and 'deflate') will be skipped and raw data will be used
+        instead.
+
+    :param original_response:
+        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse
+        object, it's convenient to include the original for debug purposes. It's
+        otherwise unused.
+    """
+
+    CONTENT_DECODERS = ['gzip', 'deflate']
+    REDIRECT_STATUSES = [301, 302, 303, 307, 308]
+
+    def __init__(self, body='', headers=None, status=0, version=0, reason=None,
+                 strict=0, preload_content=True, decode_content=True,
+                 original_response=None, pool=None, connection=None):
+
+        if isinstance(headers, HTTPHeaderDict):
+            self.headers = headers
+        else:
+            self.headers = HTTPHeaderDict(headers)
+        self.status = status
+        self.version = version
+        self.reason = reason
+        self.strict = strict
+        self.decode_content = decode_content
+
+        self._decoder = None
+        self._body = None
+        self._fp = None
+        self._original_response = original_response
+        self._fp_bytes_read = 0
+
+        if body and isinstance(body, (basestring, binary_type)):
+            self._body = body
+
+        self._pool = pool
+        self._connection = connection
+
+        if hasattr(body, 'read'):
+            self._fp = body
+
+        # Are we using the chunked-style of transfer encoding?
+        self.chunked = False
+        self.chunk_left = None
+        tr_enc = self.headers.get('transfer-encoding', '').lower()
+        # Don't incur the penalty of creating a list and then discarding it
+        encodings = (enc.strip() for enc in tr_enc.split(","))
+        if "chunked" in encodings:
+            self.chunked = True
+
+        # If requested, preload the body.
+        if preload_content and not self._body:
+            self._body = self.read(decode_content=decode_content)
+
+    def get_redirect_location(self):
+        """
+        Should we redirect and where to?
+
+        :returns: Truthy redirect location string if we got a redirect status
+            code and valid location. ``None`` if redirect status and no
+            location. ``False`` if not a redirect status code.
+        """
+        if self.status in self.REDIRECT_STATUSES:
+            return self.headers.get('location')
+
+        return False
+
+    def release_conn(self):
+        if not self._pool or not self._connection:
+            return
+
+        self._pool._put_conn(self._connection)
+        self._connection = None
+
+    @property
+    def data(self):
+        # For backwords-compat with earlier urllib3 0.4 and earlier.
+        if self._body:
+            return self._body
+
+        if self._fp:
+            return self.read(cache_content=True)
+
+    def tell(self):
+        """
+        Obtain the number of bytes pulled over the wire so far. May differ from
+        the amount of content returned by :meth:``HTTPResponse.read`` if bytes
+        are encoded on the wire (e.g, compressed).
+        """
+        return self._fp_bytes_read
+
+    def _init_decoder(self):
+        """
+        Set-up the _decoder attribute if necessar.
+        """
+        # Note: content-encoding value should be case-insensitive, per RFC 7230
+        # Section 3.2
+        content_encoding = self.headers.get('content-encoding', '').lower()
+        if self._decoder is None and content_encoding in self.CONTENT_DECODERS:
+            self._decoder = _get_decoder(content_encoding)
+
+    def _decode(self, data, decode_content, flush_decoder):
+        """
+        Decode the data passed in and potentially flush the decoder.
+        """
+        try:
+            if decode_content and self._decoder:
+                data = self._decoder.decompress(data)
+        except (IOError, zlib.error) as e:
+            content_encoding = self.headers.get('content-encoding', '').lower()
+            raise DecodeError(
+                "Received response with content-encoding: %s, but "
+                "failed to decode it." % content_encoding, e)
+
+        if flush_decoder and decode_content:
+            data += self._flush_decoder()
+
+        return data
+
+    def _flush_decoder(self):
+        """
+        Flushes the decoder. Should only be called if the decoder is actually
+        being used.
+        """
+        if self._decoder:
+            buf = self._decoder.decompress(b'')
+            return buf + self._decoder.flush()
+
+        return b''
+
+    @contextmanager
+    def _error_catcher(self):
+        """
+        Catch low-level python exceptions, instead re-raising urllib3
+        variants, so that low-level exceptions are not leaked in the
+        high-level api.
+
+        On exit, release the connection back to the pool.
+        """
+        try:
+            try:
+                yield
+
+            except SocketTimeout:
+                # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but
+                # there is yet no clean way to get at it from this context.
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
+
+            except BaseSSLError as e:
+                # FIXME: Is there a better way to differentiate between SSLErrors?
+                if 'read operation timed out' not in str(e):  # Defensive:
+                    # This shouldn't happen but just in case we're missing an edge
+                    # case, let's avoid swallowing SSL errors.
+                    raise
+
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
+
+            except (HTTPException, SocketError) as e:
+                # This includes IncompleteRead.
+                raise ProtocolError('Connection broken: %r' % e, e)
+
+        except Exception:
+            # The response may not be closed but we're not going to use it anymore
+            # so close it now to ensure that the connection is released back to the pool.
+            if self._original_response and not self._original_response.isclosed():
+                self._original_response.close()
+
+            # Closing the response may not actually be sufficient to close
+            # everything, so if we have a hold of the connection close that
+            # too.
+            if self._connection is not None:
+                self._connection.close()
+
+            raise
+        finally:
+            if self._original_response and self._original_response.isclosed():
+                self.release_conn()
+
+    def read(self, amt=None, decode_content=None, cache_content=False):
+        """
+        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional
+        parameters: ``decode_content`` and ``cache_content``.
+
+        :param amt:
+            How much of the content to read. If specified, caching is skipped
+            because it doesn't make sense to cache partial content as the full
+            response.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+
+        :param cache_content:
+            If True, will save the returned data such that the same result is
+            returned despite of the state of the underlying file object. This
+            is useful if you want the ``.data`` property to continue working
+            after having ``.read()`` the file object. (Overridden if ``amt`` is
+            set.)
+        """
+        self._init_decoder()
+        if decode_content is None:
+            decode_content = self.decode_content
+
+        if self._fp is None:
+            return
+
+        flush_decoder = False
+        data = None
+
+        with self._error_catcher():
+            if amt is None:
+                # cStringIO doesn't like amt=None
+                data = self._fp.read()
+                flush_decoder = True
+            else:
+                cache_content = False
+                data = self._fp.read(amt)
+                if amt != 0 and not data:  # Platform-specific: Buggy versions of Python.
+                    # Close the connection when no data is returned
+                    #
+                    # This is redundant to what httplib/http.client _should_
+                    # already do.  However, versions of python released before
+                    # December 15, 2012 (http://bugs.python.org/issue16298) do
+                    # not properly close the connection in all cases. There is
+                    # no harm in redundantly calling close.
+                    self._fp.close()
+                    flush_decoder = True
+
+        if data:
+            self._fp_bytes_read += len(data)
+
+            data = self._decode(data, decode_content, flush_decoder)
+
+            if cache_content:
+                self._body = data
+
+        return data
+
+    def stream(self, amt=2**16, decode_content=None):
+        """
+        A generator wrapper for the read() method. A call will block until
+        ``amt`` bytes have been read from the connection or until the
+        connection is closed.
+
+        :param amt:
+            How much of the content to read. The generator will return up to
+            much data per iteration, but may return less. This is particularly
+            likely when using compressed data. However, the empty string will
+            never be returned.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+        """
+        if self.chunked:
+            for line in self.read_chunked(amt, decode_content=decode_content):
+                yield line
+        else:
+            while not is_fp_closed(self._fp):
+                data = self.read(amt=amt, decode_content=decode_content)
+
+                if data:
+                    yield data
+
+    @classmethod
+    def from_httplib(ResponseCls, r, **response_kw):
+        """
+        Given an :class:`httplib.HTTPResponse` instance ``r``, return a
+        corresponding :class:`urllib3.response.HTTPResponse` object.
+
+        Remaining parameters are passed to the HTTPResponse constructor, along
+        with ``original_response=r``.
+        """
+        headers = r.msg
+
+        if not isinstance(headers, HTTPHeaderDict):
+            if PY3:  # Python 3
+                headers = HTTPHeaderDict(headers.items())
+            else:  # Python 2
+                headers = HTTPHeaderDict.from_httplib(headers)
+
+        # HTTPResponse objects in Python 3 don't have a .strict attribute
+        strict = getattr(r, 'strict', 0)
+        resp = ResponseCls(body=r,
+                           headers=headers,
+                           status=r.status,
+                           version=r.version,
+                           reason=r.reason,
+                           strict=strict,
+                           original_response=r,
+                           **response_kw)
+        return resp
+
+    # Backwards-compatibility methods for httplib.HTTPResponse
+    def getheaders(self):
+        return self.headers
+
+    def getheader(self, name, default=None):
+        return self.headers.get(name, default)
+
+    # Overrides from io.IOBase
+    def close(self):
+        if not self.closed:
+            self._fp.close()
+
+    @property
+    def closed(self):
+        if self._fp is None:
+            return True
+        elif hasattr(self._fp, 'closed'):
+            return self._fp.closed
+        elif hasattr(self._fp, 'isclosed'):  # Python 2
+            return self._fp.isclosed()
+        else:
+            return True
+
+    def fileno(self):
+        if self._fp is None:
+            raise IOError("HTTPResponse has no file to get a fileno from")
+        elif hasattr(self._fp, "fileno"):
+            return self._fp.fileno()
+        else:
+            raise IOError("The file-like object this HTTPResponse is wrapped "
+                          "around has no file descriptor")
+
+    def flush(self):
+        if self._fp is not None and hasattr(self._fp, 'flush'):
+            return self._fp.flush()
+
+    def readable(self):
+        # This method is required for `io` module compatibility.
+        return True
+
+    def readinto(self, b):
+        # This method is required for `io` module compatibility.
+        temp = self.read(len(b))
+        if len(temp) == 0:
+            return 0
+        else:
+            b[:len(temp)] = temp
+            return len(temp)
+
+    def _update_chunk_length(self):
+        # First, we'll figure out length of a chunk and then
+        # we'll try to read it from socket.
+        if self.chunk_left is not None:
+            return
+        line = self._fp.fp.readline()
+        line = line.split(b';', 1)[0]
+        try:
+            self.chunk_left = int(line, 16)
+        except ValueError:
+            # Invalid chunked protocol response, abort.
+            self.close()
+            raise httplib.IncompleteRead(line)
+
+    def _handle_chunk(self, amt):
+        returned_chunk = None
+        if amt is None:
+            chunk = self._fp._safe_read(self.chunk_left)
+            returned_chunk = chunk
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+        elif amt < self.chunk_left:
+            value = self._fp._safe_read(amt)
+            self.chunk_left = self.chunk_left - amt
+            returned_chunk = value
+        elif amt == self.chunk_left:
+            value = self._fp._safe_read(amt)
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+            returned_chunk = value
+        else:  # amt > self.chunk_left
+            returned_chunk = self._fp._safe_read(self.chunk_left)
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+        return returned_chunk
+
+    def read_chunked(self, amt=None, decode_content=None):
+        """
+        Similar to :meth:`HTTPResponse.read`, but with an additional
+        parameter: ``decode_content``.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+        """
+        self._init_decoder()
+        # FIXME: Rewrite this method and make it a class with a better structured logic.
+        if not self.chunked:
+            raise ResponseNotChunked(
+                "Response is not chunked. "
+                "Header 'transfer-encoding: chunked' is missing.")
+
+        # Don't bother reading the body of a HEAD request.
+        if self._original_response and is_response_to_head(self._original_response):
+            self._original_response.close()
+            return
+
+        with self._error_catcher():
+            while True:
+                self._update_chunk_length()
+                if self.chunk_left == 0:
+                    break
+                chunk = self._handle_chunk(amt)
+                decoded = self._decode(chunk, decode_content=decode_content,
+                                       flush_decoder=False)
+                if decoded:
+                    yield decoded
+
+            if decode_content:
+                # On CPython and PyPy, we should never need to flush the
+                # decoder. However, on Jython we *might* need to, so
+                # lets defensively do it anyway.
+                decoded = self._flush_decoder()
+                if decoded:  # Platform-specific: Jython.
+                    yield decoded
+
+            # Chunk content ends with \r\n: discard it.
+            while True:
+                line = self._fp.fp.readline()
+                if not line:
+                    # Some sites may not end with '\r\n'.
+                    break
+                if line == b'\r\n':
+                    break
+
+            # We read everything; close the "file".
+            if self._original_response:
+                self._original_response.close()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/__init__.py	(revision 1126)
@@ -0,0 +1,93 @@
+"""
+urllib3 - Thread-safe connection pooling and re-using.
+"""
+
+from __future__ import absolute_import
+import warnings
+
+from .connectionpool import (
+    HTTPConnectionPool,
+    HTTPSConnectionPool,
+    connection_from_url
+)
+
+from . import exceptions
+from .filepost import encode_multipart_formdata
+from .poolmanager import PoolManager, ProxyManager, proxy_from_url
+from .response import HTTPResponse
+from .util.request import make_headers
+from .util.url import get_host
+from .util.timeout import Timeout
+from .util.retry import Retry
+
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+try:  # Python 2.7+
+    from logging import NullHandler
+except ImportError:
+    class NullHandler(logging.Handler):
+        def emit(self, record):
+            pass
+
+__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
+__license__ = 'MIT'
+__version__ = '1.13.1'
+
+__all__ = (
+    'HTTPConnectionPool',
+    'HTTPSConnectionPool',
+    'PoolManager',
+    'ProxyManager',
+    'HTTPResponse',
+    'Retry',
+    'Timeout',
+    'add_stderr_logger',
+    'connection_from_url',
+    'disable_warnings',
+    'encode_multipart_formdata',
+    'get_host',
+    'make_headers',
+    'proxy_from_url',
+)
+
+logging.getLogger(__name__).addHandler(NullHandler())
+
+
+def add_stderr_logger(level=logging.DEBUG):
+    """
+    Helper for quickly adding a StreamHandler to the logger. Useful for
+    debugging.
+
+    Returns the handler after adding it.
+    """
+    # This method needs to be in this __init__.py to get the __name__ correct
+    # even if urllib3 is vendored within another package.
+    logger = logging.getLogger(__name__)
+    handler = logging.StreamHandler()
+    handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
+    logger.addHandler(handler)
+    logger.setLevel(level)
+    logger.debug('Added a stderr logging handler to logger: %s' % __name__)
+    return handler
+
+# ... Clean up.
+del NullHandler
+
+
+# SecurityWarning's always go off by default.
+warnings.simplefilter('always', exceptions.SecurityWarning, append=True)
+# SubjectAltNameWarning's should go off once per host
+warnings.simplefilter('default', exceptions.SubjectAltNameWarning)
+# InsecurePlatformWarning's don't vary between requests, so we keep it default.
+warnings.simplefilter('default', exceptions.InsecurePlatformWarning,
+                      append=True)
+# SNIMissingWarnings should go off only once.
+warnings.simplefilter('default', exceptions.SNIMissingWarning)
+
+
+def disable_warnings(category=exceptions.HTTPWarning):
+    """
+    Helper for quickly disabling all urllib3 warnings.
+    """
+    warnings.simplefilter('ignore', category)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/connection.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/connection.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/connection.py	(revision 1126)
@@ -0,0 +1,288 @@
+from __future__ import absolute_import
+import datetime
+import os
+import sys
+import socket
+from socket import error as SocketError, timeout as SocketTimeout
+import warnings
+from .packages import six
+
+try:  # Python 3
+    from http.client import HTTPConnection as _HTTPConnection
+    from http.client import HTTPException  # noqa: unused in this module
+except ImportError:
+    from httplib import HTTPConnection as _HTTPConnection
+    from httplib import HTTPException  # noqa: unused in this module
+
+try:  # Compiled with SSL?
+    import ssl
+    BaseSSLError = ssl.SSLError
+except (ImportError, AttributeError):  # Platform-specific: No SSL.
+    ssl = None
+
+    class BaseSSLError(BaseException):
+        pass
+
+
+try:  # Python 3:
+    # Not a no-op, we're adding this to the namespace so it can be imported.
+    ConnectionError = ConnectionError
+except NameError:  # Python 2:
+    class ConnectionError(Exception):
+        pass
+
+
+from .exceptions import (
+    NewConnectionError,
+    ConnectTimeoutError,
+    SubjectAltNameWarning,
+    SystemTimeWarning,
+)
+from .packages.ssl_match_hostname import match_hostname
+
+from .util.ssl_ import (
+    resolve_cert_reqs,
+    resolve_ssl_version,
+    ssl_wrap_socket,
+    assert_fingerprint,
+)
+
+
+from .util import connection
+
+port_by_scheme = {
+    'http': 80,
+    'https': 443,
+}
+
+RECENT_DATE = datetime.date(2014, 1, 1)
+
+
+class DummyConnection(object):
+    """Used to detect a failed ConnectionCls import."""
+    pass
+
+
+class HTTPConnection(_HTTPConnection, object):
+    """
+    Based on httplib.HTTPConnection but provides an extra constructor
+    backwards-compatibility layer between older and newer Pythons.
+
+    Additional keyword parameters are used to configure attributes of the connection.
+    Accepted parameters include:
+
+      - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
+      - ``source_address``: Set the source address for the current connection.
+
+        .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x
+
+      - ``socket_options``: Set specific options on the underlying socket. If not specified, then
+        defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
+        Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
+
+        For example, if you wish to enable TCP Keep Alive in addition to the defaults,
+        you might pass::
+
+            HTTPConnection.default_socket_options + [
+                (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
+            ]
+
+        Or you may want to disable the defaults by passing an empty list (e.g., ``[]``).
+    """
+
+    default_port = port_by_scheme['http']
+
+    #: Disable Nagle's algorithm by default.
+    #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]``
+    default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]
+
+    #: Whether this connection verifies the host's certificate.
+    is_verified = False
+
+    def __init__(self, *args, **kw):
+        if six.PY3:  # Python 3
+            kw.pop('strict', None)
+
+        # Pre-set source_address in case we have an older Python like 2.6.
+        self.source_address = kw.get('source_address')
+
+        if sys.version_info < (2, 7):  # Python 2.6
+            # _HTTPConnection on Python 2.6 will balk at this keyword arg, but
+            # not newer versions. We can still use it when creating a
+            # connection though, so we pop it *after* we have saved it as
+            # self.source_address.
+            kw.pop('source_address', None)
+
+        #: The socket options provided by the user. If no options are
+        #: provided, we use the default options.
+        self.socket_options = kw.pop('socket_options', self.default_socket_options)
+
+        # Superclass also sets self.source_address in Python 2.7+.
+        _HTTPConnection.__init__(self, *args, **kw)
+
+    def _new_conn(self):
+        """ Establish a socket connection and set nodelay settings on it.
+
+        :return: New socket connection.
+        """
+        extra_kw = {}
+        if self.source_address:
+            extra_kw['source_address'] = self.source_address
+
+        if self.socket_options:
+            extra_kw['socket_options'] = self.socket_options
+
+        try:
+            conn = connection.create_connection(
+                (self.host, self.port), self.timeout, **extra_kw)
+
+        except SocketTimeout as e:
+            raise ConnectTimeoutError(
+                self, "Connection to %s timed out. (connect timeout=%s)" %
+                (self.host, self.timeout))
+
+        except SocketError as e:
+            raise NewConnectionError(
+                self, "Failed to establish a new connection: %s" % e)
+
+        return conn
+
+    def _prepare_conn(self, conn):
+        self.sock = conn
+        # the _tunnel_host attribute was added in python 2.6.3 (via
+        # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do
+        # not have them.
+        if getattr(self, '_tunnel_host', None):
+            # TODO: Fix tunnel so it doesn't depend on self.sock state.
+            self._tunnel()
+            # Mark this connection as not reusable
+            self.auto_open = 0
+
+    def connect(self):
+        conn = self._new_conn()
+        self._prepare_conn(conn)
+
+
+class HTTPSConnection(HTTPConnection):
+    default_port = port_by_scheme['https']
+
+    def __init__(self, host, port=None, key_file=None, cert_file=None,
+                 strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **kw):
+
+        HTTPConnection.__init__(self, host, port, strict=strict,
+                                timeout=timeout, **kw)
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+
+        # Required property for Google AppEngine 1.9.0 which otherwise causes
+        # HTTPS requests to go out as HTTP. (See Issue #356)
+        self._protocol = 'https'
+
+    def connect(self):
+        conn = self._new_conn()
+        self._prepare_conn(conn)
+        self.sock = ssl.wrap_socket(conn, self.key_file, self.cert_file)
+
+
+class VerifiedHTTPSConnection(HTTPSConnection):
+    """
+    Based on httplib.HTTPSConnection but wraps the socket with
+    SSL certification.
+    """
+    cert_reqs = None
+    ca_certs = None
+    ca_cert_dir = None
+    ssl_version = None
+    assert_fingerprint = None
+
+    def set_cert(self, key_file=None, cert_file=None,
+                 cert_reqs=None, ca_certs=None,
+                 assert_hostname=None, assert_fingerprint=None,
+                 ca_cert_dir=None):
+
+        if (ca_certs or ca_cert_dir) and cert_reqs is None:
+            cert_reqs = 'CERT_REQUIRED'
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = cert_reqs
+        self.assert_hostname = assert_hostname
+        self.assert_fingerprint = assert_fingerprint
+        self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
+        self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
+
+    def connect(self):
+        # Add certificate verification
+        conn = self._new_conn()
+
+        resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs)
+        resolved_ssl_version = resolve_ssl_version(self.ssl_version)
+
+        hostname = self.host
+        if getattr(self, '_tunnel_host', None):
+            # _tunnel_host was added in Python 2.6.3
+            # (See: http://hg.python.org/cpython/rev/0f57b30a152f)
+
+            self.sock = conn
+            # Calls self._set_hostport(), so self.host is
+            # self._tunnel_host below.
+            self._tunnel()
+            # Mark this connection as not reusable
+            self.auto_open = 0
+
+            # Override the host with the one we're requesting data from.
+            hostname = self._tunnel_host
+
+        is_time_off = datetime.date.today() < RECENT_DATE
+        if is_time_off:
+            warnings.warn((
+                'System time is way off (before {0}). This will probably '
+                'lead to SSL verification errors').format(RECENT_DATE),
+                SystemTimeWarning
+            )
+
+        # Wrap socket using verification with the root certs in
+        # trusted_root_certs
+        self.sock = ssl_wrap_socket(conn, self.key_file, self.cert_file,
+                                    cert_reqs=resolved_cert_reqs,
+                                    ca_certs=self.ca_certs,
+                                    ca_cert_dir=self.ca_cert_dir,
+                                    server_hostname=hostname,
+                                    ssl_version=resolved_ssl_version)
+
+        if self.assert_fingerprint:
+            assert_fingerprint(self.sock.getpeercert(binary_form=True),
+                               self.assert_fingerprint)
+        elif resolved_cert_reqs != ssl.CERT_NONE \
+                and self.assert_hostname is not False:
+            cert = self.sock.getpeercert()
+            if not cert.get('subjectAltName', ()):
+                warnings.warn((
+                    'Certificate for {0} has no `subjectAltName`, falling back to check for a '
+                    '`commonName` for now. This feature is being removed by major browsers and '
+                    'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 '
+                    'for details.)'.format(hostname)),
+                    SubjectAltNameWarning
+                )
+
+            # In case the hostname is an IPv6 address, strip the square
+            # brackets from it before using it to validate. This is because
+            # a certificate with an IPv6 address in it won't have square
+            # brackets around that address. Sadly, match_hostname won't do this
+            # for us: it expects the plain host part without any extra work
+            # that might have been done to make it palatable to httplib.
+            asserted_hostname = self.assert_hostname or hostname
+            asserted_hostname = asserted_hostname.strip('[]')
+            match_hostname(cert, asserted_hostname)
+
+        self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED or
+                            self.assert_fingerprint is not None)
+
+
+if ssl:
+    # Make a copy for testing.
+    UnverifiedHTTPSConnection = HTTPSConnection
+    HTTPSConnection = VerifiedHTTPSConnection
+else:
+    HTTPSConnection = DummyConnection
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/exceptions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/exceptions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/exceptions.py	(revision 1126)
@@ -0,0 +1,201 @@
+from __future__ import absolute_import
+# Base Exceptions
+
+
+class HTTPError(Exception):
+    "Base exception used by this module."
+    pass
+
+
+class HTTPWarning(Warning):
+    "Base warning used by this module."
+    pass
+
+
+class PoolError(HTTPError):
+    "Base exception for errors caused within a pool."
+    def __init__(self, pool, message):
+        self.pool = pool
+        HTTPError.__init__(self, "%s: %s" % (pool, message))
+
+    def __reduce__(self):
+        # For pickling purposes.
+        return self.__class__, (None, None)
+
+
+class RequestError(PoolError):
+    "Base exception for PoolErrors that have associated URLs."
+    def __init__(self, pool, url, message):
+        self.url = url
+        PoolError.__init__(self, pool, message)
+
+    def __reduce__(self):
+        # For pickling purposes.
+        return self.__class__, (None, self.url, None)
+
+
+class SSLError(HTTPError):
+    "Raised when SSL certificate fails in an HTTPS connection."
+    pass
+
+
+class ProxyError(HTTPError):
+    "Raised when the connection to a proxy fails."
+    pass
+
+
+class DecodeError(HTTPError):
+    "Raised when automatic decoding based on Content-Type fails."
+    pass
+
+
+class ProtocolError(HTTPError):
+    "Raised when something unexpected happens mid-request/response."
+    pass
+
+
+#: Renamed to ProtocolError but aliased for backwards compatibility.
+ConnectionError = ProtocolError
+
+
+# Leaf Exceptions
+
+class MaxRetryError(RequestError):
+    """Raised when the maximum number of retries is exceeded.
+
+    :param pool: The connection pool
+    :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool`
+    :param string url: The requested Url
+    :param exceptions.Exception reason: The underlying error
+
+    """
+
+    def __init__(self, pool, url, reason=None):
+        self.reason = reason
+
+        message = "Max retries exceeded with url: %s (Caused by %r)" % (
+            url, reason)
+
+        RequestError.__init__(self, pool, url, message)
+
+
+class HostChangedError(RequestError):
+    "Raised when an existing pool gets a request for a foreign host."
+
+    def __init__(self, pool, url, retries=3):
+        message = "Tried to open a foreign host with url: %s" % url
+        RequestError.__init__(self, pool, url, message)
+        self.retries = retries
+
+
+class TimeoutStateError(HTTPError):
+    """ Raised when passing an invalid state to a timeout """
+    pass
+
+
+class TimeoutError(HTTPError):
+    """ Raised when a socket timeout error occurs.
+
+    Catching this error will catch both :exc:`ReadTimeoutErrors
+    <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
+    """
+    pass
+
+
+class ReadTimeoutError(TimeoutError, RequestError):
+    "Raised when a socket timeout occurs while receiving data from a server"
+    pass
+
+
+# This timeout error does not have a URL attached and needs to inherit from the
+# base HTTPError
+class ConnectTimeoutError(TimeoutError):
+    "Raised when a socket timeout occurs while connecting to a server"
+    pass
+
+
+class NewConnectionError(ConnectTimeoutError, PoolError):
+    "Raised when we fail to establish a new connection. Usually ECONNREFUSED."
+    pass
+
+
+class EmptyPoolError(PoolError):
+    "Raised when a pool runs out of connections and no more are allowed."
+    pass
+
+
+class ClosedPoolError(PoolError):
+    "Raised when a request enters a pool after the pool has been closed."
+    pass
+
+
+class LocationValueError(ValueError, HTTPError):
+    "Raised when there is something wrong with a given URL input."
+    pass
+
+
+class LocationParseError(LocationValueError):
+    "Raised when get_host or similar fails to parse the URL input."
+
+    def __init__(self, location):
+        message = "Failed to parse: %s" % location
+        HTTPError.__init__(self, message)
+
+        self.location = location
+
+
+class ResponseError(HTTPError):
+    "Used as a container for an error reason supplied in a MaxRetryError."
+    GENERIC_ERROR = 'too many error responses'
+    SPECIFIC_ERROR = 'too many {status_code} error responses'
+
+
+class SecurityWarning(HTTPWarning):
+    "Warned when perfoming security reducing actions"
+    pass
+
+
+class SubjectAltNameWarning(SecurityWarning):
+    "Warned when connecting to a host with a certificate missing a SAN."
+    pass
+
+
+class InsecureRequestWarning(SecurityWarning):
+    "Warned when making an unverified HTTPS request."
+    pass
+
+
+class SystemTimeWarning(SecurityWarning):
+    "Warned when system time is suspected to be wrong"
+    pass
+
+
+class InsecurePlatformWarning(SecurityWarning):
+    "Warned when certain SSL configuration is not available on a platform."
+    pass
+
+
+class SNIMissingWarning(HTTPWarning):
+    "Warned when making a HTTPS request without SNI available."
+    pass
+
+
+class ResponseNotChunked(ProtocolError, ValueError):
+    "Response needs to be chunked in order to read it as chunks."
+    pass
+
+
+class ProxySchemeUnknown(AssertionError, ValueError):
+    "ProxyManager does not support the supplied scheme"
+    # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
+
+    def __init__(self, scheme):
+        message = "Not supported proxy scheme %s" % scheme
+        super(ProxySchemeUnknown, self).__init__(message)
+
+
+class HeaderParsingError(HTTPError):
+    "Raised by assert_header_parsing, but we convert it to a log.warning statement."
+    def __init__(self, defects, unparsed_data):
+        message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data)
+        super(HeaderParsingError, self).__init__(message)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/poolmanager.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/poolmanager.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/poolmanager.py	(revision 1126)
@@ -0,0 +1,281 @@
+from __future__ import absolute_import
+import logging
+
+try:  # Python 3
+    from urllib.parse import urljoin
+except ImportError:
+    from urlparse import urljoin
+
+from ._collections import RecentlyUsedContainer
+from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
+from .connectionpool import port_by_scheme
+from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown
+from .request import RequestMethods
+from .util.url import parse_url
+from .util.retry import Retry
+
+
+__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url']
+
+
+pool_classes_by_scheme = {
+    'http': HTTPConnectionPool,
+    'https': HTTPSConnectionPool,
+}
+
+log = logging.getLogger(__name__)
+
+SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs',
+                'ssl_version', 'ca_cert_dir')
+
+
+class PoolManager(RequestMethods):
+    """
+    Allows for arbitrary requests while transparently keeping track of
+    necessary connection pools for you.
+
+    :param num_pools:
+        Number of connection pools to cache before discarding the least
+        recently used pool.
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+
+    :param \**connection_pool_kw:
+        Additional parameters are used to create fresh
+        :class:`urllib3.connectionpool.ConnectionPool` instances.
+
+    Example::
+
+        >>> manager = PoolManager(num_pools=2)
+        >>> r = manager.request('GET', 'http://google.com/')
+        >>> r = manager.request('GET', 'http://google.com/mail')
+        >>> r = manager.request('GET', 'http://yahoo.com/')
+        >>> len(manager.pools)
+        2
+
+    """
+
+    proxy = None
+
+    def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
+        RequestMethods.__init__(self, headers)
+        self.connection_pool_kw = connection_pool_kw
+        self.pools = RecentlyUsedContainer(num_pools,
+                                           dispose_func=lambda p: p.close())
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.clear()
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def _new_pool(self, scheme, host, port):
+        """
+        Create a new :class:`ConnectionPool` based on host, port and scheme.
+
+        This method is used to actually create the connection pools handed out
+        by :meth:`connection_from_url` and companion methods. It is intended
+        to be overridden for customization.
+        """
+        pool_cls = pool_classes_by_scheme[scheme]
+        kwargs = self.connection_pool_kw
+        if scheme == 'http':
+            kwargs = self.connection_pool_kw.copy()
+            for kw in SSL_KEYWORDS:
+                kwargs.pop(kw, None)
+
+        return pool_cls(host, port, **kwargs)
+
+    def clear(self):
+        """
+        Empty our store of pools and direct them all to close.
+
+        This will not affect in-flight connections, but they will not be
+        re-used after completion.
+        """
+        self.pools.clear()
+
+    def connection_from_host(self, host, port=None, scheme='http'):
+        """
+        Get a :class:`ConnectionPool` based on the host, port, and scheme.
+
+        If ``port`` isn't given, it will be derived from the ``scheme`` using
+        ``urllib3.connectionpool.port_by_scheme``.
+        """
+
+        if not host:
+            raise LocationValueError("No host specified.")
+
+        scheme = scheme or 'http'
+        port = port or port_by_scheme.get(scheme, 80)
+        pool_key = (scheme, host, port)
+
+        with self.pools.lock:
+            # If the scheme, host, or port doesn't match existing open
+            # connections, open a new ConnectionPool.
+            pool = self.pools.get(pool_key)
+            if pool:
+                return pool
+
+            # Make a fresh ConnectionPool of the desired type
+            pool = self._new_pool(scheme, host, port)
+            self.pools[pool_key] = pool
+
+        return pool
+
+    def connection_from_url(self, url):
+        """
+        Similar to :func:`urllib3.connectionpool.connection_from_url` but
+        doesn't pass any additional parameters to the
+        :class:`urllib3.connectionpool.ConnectionPool` constructor.
+
+        Additional parameters are taken from the :class:`.PoolManager`
+        constructor.
+        """
+        u = parse_url(url)
+        return self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
+
+    def urlopen(self, method, url, redirect=True, **kw):
+        """
+        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`
+        with custom cross-host redirect logic and only sends the request-uri
+        portion of the ``url``.
+
+        The given ``url`` parameter must be absolute, such that an appropriate
+        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.
+        """
+        u = parse_url(url)
+        conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
+
+        kw['assert_same_host'] = False
+        kw['redirect'] = False
+        if 'headers' not in kw:
+            kw['headers'] = self.headers
+
+        if self.proxy is not None and u.scheme == "http":
+            response = conn.urlopen(method, url, **kw)
+        else:
+            response = conn.urlopen(method, u.request_uri, **kw)
+
+        redirect_location = redirect and response.get_redirect_location()
+        if not redirect_location:
+            return response
+
+        # Support relative URLs for redirecting.
+        redirect_location = urljoin(url, redirect_location)
+
+        # RFC 7231, Section 6.4.4
+        if response.status == 303:
+            method = 'GET'
+
+        retries = kw.get('retries')
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(retries, redirect=redirect)
+
+        try:
+            retries = retries.increment(method, url, response=response, _pool=conn)
+        except MaxRetryError:
+            if retries.raise_on_redirect:
+                raise
+            return response
+
+        kw['retries'] = retries
+        kw['redirect'] = redirect
+
+        log.info("Redirecting %s -> %s" % (url, redirect_location))
+        return self.urlopen(method, redirect_location, **kw)
+
+
+class ProxyManager(PoolManager):
+    """
+    Behaves just like :class:`PoolManager`, but sends all requests through
+    the defined proxy, using the CONNECT method for HTTPS URLs.
+
+    :param proxy_url:
+        The URL of the proxy to be used.
+
+    :param proxy_headers:
+        A dictionary contaning headers that will be sent to the proxy. In case
+        of HTTP they are being sent with each request, while in the
+        HTTPS/CONNECT case they are sent only once. Could be used for proxy
+        authentication.
+
+    Example:
+        >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
+        >>> r1 = proxy.request('GET', 'http://google.com/')
+        >>> r2 = proxy.request('GET', 'http://httpbin.org/')
+        >>> len(proxy.pools)
+        1
+        >>> r3 = proxy.request('GET', 'https://httpbin.org/')
+        >>> r4 = proxy.request('GET', 'https://twitter.com/')
+        >>> len(proxy.pools)
+        3
+
+    """
+
+    def __init__(self, proxy_url, num_pools=10, headers=None,
+                 proxy_headers=None, **connection_pool_kw):
+
+        if isinstance(proxy_url, HTTPConnectionPool):
+            proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host,
+                                        proxy_url.port)
+        proxy = parse_url(proxy_url)
+        if not proxy.port:
+            port = port_by_scheme.get(proxy.scheme, 80)
+            proxy = proxy._replace(port=port)
+
+        if proxy.scheme not in ("http", "https"):
+            raise ProxySchemeUnknown(proxy.scheme)
+
+        self.proxy = proxy
+        self.proxy_headers = proxy_headers or {}
+
+        connection_pool_kw['_proxy'] = self.proxy
+        connection_pool_kw['_proxy_headers'] = self.proxy_headers
+
+        super(ProxyManager, self).__init__(
+            num_pools, headers, **connection_pool_kw)
+
+    def connection_from_host(self, host, port=None, scheme='http'):
+        if scheme == "https":
+            return super(ProxyManager, self).connection_from_host(
+                host, port, scheme)
+
+        return super(ProxyManager, self).connection_from_host(
+            self.proxy.host, self.proxy.port, self.proxy.scheme)
+
+    def _set_proxy_headers(self, url, headers=None):
+        """
+        Sets headers needed by proxies: specifically, the Accept and Host
+        headers. Only sets headers not provided by the user.
+        """
+        headers_ = {'Accept': '*/*'}
+
+        netloc = parse_url(url).netloc
+        if netloc:
+            headers_['Host'] = netloc
+
+        if headers:
+            headers_.update(headers)
+        return headers_
+
+    def urlopen(self, method, url, redirect=True, **kw):
+        "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute."
+        u = parse_url(url)
+
+        if u.scheme == "http":
+            # For proxied HTTPS requests, httplib sets the necessary headers
+            # on the CONNECT to the proxy. For HTTP, we'll definitely
+            # need to set 'Host' at the very least.
+            headers = kw.get('headers', self.headers)
+            kw['headers'] = self._set_proxy_headers(url, headers)
+
+        return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw)
+
+
+def proxy_from_url(url, **kw):
+    return ProxyManager(proxy_url=url, **kw)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/filepost.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/filepost.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/filepost.py	(revision 1126)
@@ -0,0 +1,94 @@
+from __future__ import absolute_import
+import codecs
+
+from uuid import uuid4
+from io import BytesIO
+
+from .packages import six
+from .packages.six import b
+from .fields import RequestField
+
+writer = codecs.lookup('utf-8')[3]
+
+
+def choose_boundary():
+    """
+    Our embarassingly-simple replacement for mimetools.choose_boundary.
+    """
+    return uuid4().hex
+
+
+def iter_field_objects(fields):
+    """
+    Iterate over fields.
+
+    Supports list of (k, v) tuples and dicts, and lists of
+    :class:`~urllib3.fields.RequestField`.
+
+    """
+    if isinstance(fields, dict):
+        i = six.iteritems(fields)
+    else:
+        i = iter(fields)
+
+    for field in i:
+        if isinstance(field, RequestField):
+            yield field
+        else:
+            yield RequestField.from_tuples(*field)
+
+
+def iter_fields(fields):
+    """
+    .. deprecated:: 1.6
+
+    Iterate over fields.
+
+    The addition of :class:`~urllib3.fields.RequestField` makes this function
+    obsolete. Instead, use :func:`iter_field_objects`, which returns
+    :class:`~urllib3.fields.RequestField` objects.
+
+    Supports list of (k, v) tuples and dicts.
+    """
+    if isinstance(fields, dict):
+        return ((k, v) for k, v in six.iteritems(fields))
+
+    return ((k, v) for k, v in fields)
+
+
+def encode_multipart_formdata(fields, boundary=None):
+    """
+    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.
+
+    :param fields:
+        Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).
+
+    :param boundary:
+        If not specified, then a random boundary will be generated using
+        :func:`mimetools.choose_boundary`.
+    """
+    body = BytesIO()
+    if boundary is None:
+        boundary = choose_boundary()
+
+    for field in iter_field_objects(fields):
+        body.write(b('--%s\r\n' % (boundary)))
+
+        writer(body).write(field.render_headers())
+        data = field.data
+
+        if isinstance(data, int):
+            data = str(data)  # Backwards compatibility
+
+        if isinstance(data, six.text_type):
+            writer(body).write(data)
+        else:
+            body.write(data)
+
+        body.write(b'\r\n')
+
+    body.write(b('--%s--\r\n' % (boundary)))
+
+    content_type = str('multipart/form-data; boundary=%s' % boundary)
+
+    return body.getvalue(), content_type
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/fields.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/fields.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/fields.py	(revision 1126)
@@ -0,0 +1,178 @@
+from __future__ import absolute_import
+import email.utils
+import mimetypes
+
+from .packages import six
+
+
+def guess_content_type(filename, default='application/octet-stream'):
+    """
+    Guess the "Content-Type" of a file.
+
+    :param filename:
+        The filename to guess the "Content-Type" of using :mod:`mimetypes`.
+    :param default:
+        If no "Content-Type" can be guessed, default to `default`.
+    """
+    if filename:
+        return mimetypes.guess_type(filename)[0] or default
+    return default
+
+
+def format_header_param(name, value):
+    """
+    Helper function to format and quote a single header parameter.
+
+    Particularly useful for header parameters which might contain
+    non-ASCII values, like file names. This follows RFC 2231, as
+    suggested by RFC 2388 Section 4.4.
+
+    :param name:
+        The name of the parameter, a string expected to be ASCII only.
+    :param value:
+        The value of the parameter, provided as a unicode string.
+    """
+    if not any(ch in value for ch in '"\\\r\n'):
+        result = '%s="%s"' % (name, value)
+        try:
+            result.encode('ascii')
+        except UnicodeEncodeError:
+            pass
+        else:
+            return result
+    if not six.PY3:  # Python 2:
+        value = value.encode('utf-8')
+    value = email.utils.encode_rfc2231(value, 'utf-8')
+    value = '%s*=%s' % (name, value)
+    return value
+
+
+class RequestField(object):
+    """
+    A data container for request body parameters.
+
+    :param name:
+        The name of this request field.
+    :param data:
+        The data/value body.
+    :param filename:
+        An optional filename of the request field.
+    :param headers:
+        An optional dict-like object of headers to initially use for the field.
+    """
+    def __init__(self, name, data, filename=None, headers=None):
+        self._name = name
+        self._filename = filename
+        self.data = data
+        self.headers = {}
+        if headers:
+            self.headers = dict(headers)
+
+    @classmethod
+    def from_tuples(cls, fieldname, value):
+        """
+        A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters.
+
+        Supports constructing :class:`~urllib3.fields.RequestField` from
+        parameter of key/value strings AND key/filetuple. A filetuple is a
+        (filename, data, MIME type) tuple where the MIME type is optional.
+        For example::
+
+            'foo': 'bar',
+            'fakefile': ('foofile.txt', 'contents of foofile'),
+            'realfile': ('barfile.txt', open('realfile').read()),
+            'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'),
+            'nonamefile': 'contents of nonamefile field',
+
+        Field names and filenames must be unicode.
+        """
+        if isinstance(value, tuple):
+            if len(value) == 3:
+                filename, data, content_type = value
+            else:
+                filename, data = value
+                content_type = guess_content_type(filename)
+        else:
+            filename = None
+            content_type = None
+            data = value
+
+        request_param = cls(fieldname, data, filename=filename)
+        request_param.make_multipart(content_type=content_type)
+
+        return request_param
+
+    def _render_part(self, name, value):
+        """
+        Overridable helper function to format a single header parameter.
+
+        :param name:
+            The name of the parameter, a string expected to be ASCII only.
+        :param value:
+            The value of the parameter, provided as a unicode string.
+        """
+        return format_header_param(name, value)
+
+    def _render_parts(self, header_parts):
+        """
+        Helper function to format and quote a single header.
+
+        Useful for single headers that are composed of multiple items. E.g.,
+        'Content-Disposition' fields.
+
+        :param header_parts:
+            A sequence of (k, v) typles or a :class:`dict` of (k, v) to format
+            as `k1="v1"; k2="v2"; ...`.
+        """
+        parts = []
+        iterable = header_parts
+        if isinstance(header_parts, dict):
+            iterable = header_parts.items()
+
+        for name, value in iterable:
+            if value:
+                parts.append(self._render_part(name, value))
+
+        return '; '.join(parts)
+
+    def render_headers(self):
+        """
+        Renders the headers for this request field.
+        """
+        lines = []
+
+        sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location']
+        for sort_key in sort_keys:
+            if self.headers.get(sort_key, False):
+                lines.append('%s: %s' % (sort_key, self.headers[sort_key]))
+
+        for header_name, header_value in self.headers.items():
+            if header_name not in sort_keys:
+                if header_value:
+                    lines.append('%s: %s' % (header_name, header_value))
+
+        lines.append('\r\n')
+        return '\r\n'.join(lines)
+
+    def make_multipart(self, content_disposition=None, content_type=None,
+                       content_location=None):
+        """
+        Makes this request field into a multipart request field.
+
+        This method overrides "Content-Disposition", "Content-Type" and
+        "Content-Location" headers to the request parameter.
+
+        :param content_type:
+            The 'Content-Type' of the request body.
+        :param content_location:
+            The 'Content-Location' of the request body.
+
+        """
+        self.headers['Content-Disposition'] = content_disposition or 'form-data'
+        self.headers['Content-Disposition'] += '; '.join([
+            '', self._render_parts(
+                (('name', self._name), ('filename', self._filename))
+            )
+        ])
+        self.headers['Content-Type'] = content_type
+        self.headers['Content-Location'] = content_location
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/retry.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/retry.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/retry.py	(revision 1126)
@@ -0,0 +1,286 @@
+from __future__ import absolute_import
+import time
+import logging
+
+from ..exceptions import (
+    ConnectTimeoutError,
+    MaxRetryError,
+    ProtocolError,
+    ReadTimeoutError,
+    ResponseError,
+)
+from ..packages import six
+
+
+log = logging.getLogger(__name__)
+
+
+class Retry(object):
+    """ Retry configuration.
+
+    Each retry attempt will create a new Retry object with updated values, so
+    they can be safely reused.
+
+    Retries can be defined as a default for a pool::
+
+        retries = Retry(connect=5, read=2, redirect=5)
+        http = PoolManager(retries=retries)
+        response = http.request('GET', 'http://example.com/')
+
+    Or per-request (which overrides the default for the pool)::
+
+        response = http.request('GET', 'http://example.com/', retries=Retry(10))
+
+    Retries can be disabled by passing ``False``::
+
+        response = http.request('GET', 'http://example.com/', retries=False)
+
+    Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless
+    retries are disabled, in which case the causing exception will be raised.
+
+    :param int total:
+        Total number of retries to allow. Takes precedence over other counts.
+
+        Set to ``None`` to remove this constraint and fall back on other
+        counts. It's a good idea to set this to some sensibly-high value to
+        account for unexpected edge cases and avoid infinite retry loops.
+
+        Set to ``0`` to fail on the first retry.
+
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
+
+    :param int connect:
+        How many connection-related errors to retry on.
+
+        These are errors raised before the request is sent to the remote server,
+        which we assume has not triggered the server to process the request.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param int read:
+        How many times to retry on read errors.
+
+        These errors are raised after the request was sent to the server, so the
+        request may have side-effects.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param int redirect:
+        How many redirects to perform. Limit this to avoid infinite redirect
+        loops.
+
+        A redirect is a HTTP response with a status code 301, 302, 303, 307 or
+        308.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
+
+    :param iterable method_whitelist:
+        Set of uppercased HTTP method verbs that we should retry on.
+
+        By default, we only retry on methods which are considered to be
+        indempotent (multiple requests with the same parameters end with the
+        same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`.
+
+    :param iterable status_forcelist:
+        A set of HTTP status codes that we should force a retry on.
+
+        By default, this is disabled with ``None``.
+
+    :param float backoff_factor:
+        A backoff factor to apply between attempts. urllib3 will sleep for::
+
+            {backoff factor} * (2 ^ ({number of total retries} - 1))
+
+        seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep
+        for [0.1s, 0.2s, 0.4s, ...] between retries. It will never be longer
+        than :attr:`Retry.BACKOFF_MAX`.
+
+        By default, backoff is disabled (set to 0).
+
+    :param bool raise_on_redirect: Whether, if the number of redirects is
+        exhausted, to raise a MaxRetryError, or to return a response with a
+        response code in the 3xx range.
+    """
+
+    DEFAULT_METHOD_WHITELIST = frozenset([
+        'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE'])
+
+    #: Maximum backoff time.
+    BACKOFF_MAX = 120
+
+    def __init__(self, total=10, connect=None, read=None, redirect=None,
+                 method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None,
+                 backoff_factor=0, raise_on_redirect=True, _observed_errors=0):
+
+        self.total = total
+        self.connect = connect
+        self.read = read
+
+        if redirect is False or total is False:
+            redirect = 0
+            raise_on_redirect = False
+
+        self.redirect = redirect
+        self.status_forcelist = status_forcelist or set()
+        self.method_whitelist = method_whitelist
+        self.backoff_factor = backoff_factor
+        self.raise_on_redirect = raise_on_redirect
+        self._observed_errors = _observed_errors  # TODO: use .history instead?
+
+    def new(self, **kw):
+        params = dict(
+            total=self.total,
+            connect=self.connect, read=self.read, redirect=self.redirect,
+            method_whitelist=self.method_whitelist,
+            status_forcelist=self.status_forcelist,
+            backoff_factor=self.backoff_factor,
+            raise_on_redirect=self.raise_on_redirect,
+            _observed_errors=self._observed_errors,
+        )
+        params.update(kw)
+        return type(self)(**params)
+
+    @classmethod
+    def from_int(cls, retries, redirect=True, default=None):
+        """ Backwards-compatibility for the old retries format."""
+        if retries is None:
+            retries = default if default is not None else cls.DEFAULT
+
+        if isinstance(retries, Retry):
+            return retries
+
+        redirect = bool(redirect) and None
+        new_retries = cls(retries, redirect=redirect)
+        log.debug("Converted retries value: %r -> %r" % (retries, new_retries))
+        return new_retries
+
+    def get_backoff_time(self):
+        """ Formula for computing the current backoff
+
+        :rtype: float
+        """
+        if self._observed_errors <= 1:
+            return 0
+
+        backoff_value = self.backoff_factor * (2 ** (self._observed_errors - 1))
+        return min(self.BACKOFF_MAX, backoff_value)
+
+    def sleep(self):
+        """ Sleep between retry attempts using an exponential backoff.
+
+        By default, the backoff factor is 0 and this method will return
+        immediately.
+        """
+        backoff = self.get_backoff_time()
+        if backoff <= 0:
+            return
+        time.sleep(backoff)
+
+    def _is_connection_error(self, err):
+        """ Errors when we're fairly sure that the server did not receive the
+        request, so it should be safe to retry.
+        """
+        return isinstance(err, ConnectTimeoutError)
+
+    def _is_read_error(self, err):
+        """ Errors that occur after the request has been started, so we should
+        assume that the server began processing it.
+        """
+        return isinstance(err, (ReadTimeoutError, ProtocolError))
+
+    def is_forced_retry(self, method, status_code):
+        """ Is this method/status code retryable? (Based on method/codes whitelists)
+        """
+        if self.method_whitelist and method.upper() not in self.method_whitelist:
+            return False
+
+        return self.status_forcelist and status_code in self.status_forcelist
+
+    def is_exhausted(self):
+        """ Are we out of retries? """
+        retry_counts = (self.total, self.connect, self.read, self.redirect)
+        retry_counts = list(filter(None, retry_counts))
+        if not retry_counts:
+            return False
+
+        return min(retry_counts) < 0
+
+    def increment(self, method=None, url=None, response=None, error=None,
+                  _pool=None, _stacktrace=None):
+        """ Return a new Retry object with incremented retry counters.
+
+        :param response: A response object, or None, if the server did not
+            return a response.
+        :type response: :class:`~urllib3.response.HTTPResponse`
+        :param Exception error: An error encountered during the request, or
+            None if the response was received successfully.
+
+        :return: A new ``Retry`` object.
+        """
+        if self.total is False and error:
+            # Disabled, indicate to re-raise the error.
+            raise six.reraise(type(error), error, _stacktrace)
+
+        total = self.total
+        if total is not None:
+            total -= 1
+
+        _observed_errors = self._observed_errors
+        connect = self.connect
+        read = self.read
+        redirect = self.redirect
+        cause = 'unknown'
+
+        if error and self._is_connection_error(error):
+            # Connect retry?
+            if connect is False:
+                raise six.reraise(type(error), error, _stacktrace)
+            elif connect is not None:
+                connect -= 1
+            _observed_errors += 1
+
+        elif error and self._is_read_error(error):
+            # Read retry?
+            if read is False:
+                raise six.reraise(type(error), error, _stacktrace)
+            elif read is not None:
+                read -= 1
+            _observed_errors += 1
+
+        elif response and response.get_redirect_location():
+            # Redirect retry?
+            if redirect is not None:
+                redirect -= 1
+            cause = 'too many redirects'
+
+        else:
+            # Incrementing because of a server error like a 500 in
+            # status_forcelist and a the given method is in the whitelist
+            _observed_errors += 1
+            cause = ResponseError.GENERIC_ERROR
+            if response and response.status:
+                cause = ResponseError.SPECIFIC_ERROR.format(
+                    status_code=response.status)
+
+        new_retry = self.new(
+            total=total,
+            connect=connect, read=read, redirect=redirect,
+            _observed_errors=_observed_errors)
+
+        if new_retry.is_exhausted():
+            raise MaxRetryError(_pool, url, error or ResponseError(cause))
+
+        log.debug("Incremented Retry for (url='%s'): %r" % (url, new_retry))
+
+        return new_retry
+
+    def __repr__(self):
+        return ('{cls.__name__}(total={self.total}, connect={self.connect}, '
+                'read={self.read}, redirect={self.redirect})').format(
+                    cls=type(self), self=self)
+
+
+# For backwards compatibility (equivalent to pre-v1.9):
+Retry.DEFAULT = Retry(3)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/timeout.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/timeout.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/timeout.py	(revision 1126)
@@ -0,0 +1,242 @@
+from __future__ import absolute_import
+# The default socket timeout, used by httplib to indicate that no timeout was
+# specified by the user
+from socket import _GLOBAL_DEFAULT_TIMEOUT
+import time
+
+from ..exceptions import TimeoutStateError
+
+# A sentinel value to indicate that no timeout was specified by the user in
+# urllib3
+_Default = object()
+
+
+def current_time():
+    """
+    Retrieve the current time. This function is mocked out in unit testing.
+    """
+    return time.time()
+
+
+class Timeout(object):
+    """ Timeout configuration.
+
+    Timeouts can be defined as a default for a pool::
+
+        timeout = Timeout(connect=2.0, read=7.0)
+        http = PoolManager(timeout=timeout)
+        response = http.request('GET', 'http://example.com/')
+
+    Or per-request (which overrides the default for the pool)::
+
+        response = http.request('GET', 'http://example.com/', timeout=Timeout(10))
+
+    Timeouts can be disabled by setting all the parameters to ``None``::
+
+        no_timeout = Timeout(connect=None, read=None)
+        response = http.request('GET', 'http://example.com/, timeout=no_timeout)
+
+
+    :param total:
+        This combines the connect and read timeouts into one; the read timeout
+        will be set to the time leftover from the connect attempt. In the
+        event that both a connect timeout and a total are specified, or a read
+        timeout and a total are specified, the shorter timeout will be applied.
+
+        Defaults to None.
+
+    :type total: integer, float, or None
+
+    :param connect:
+        The maximum amount of time to wait for a connection attempt to a server
+        to succeed. Omitting the parameter will default the connect timeout to
+        the system default, probably `the global default timeout in socket.py
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
+        None will set an infinite timeout for connection attempts.
+
+    :type connect: integer, float, or None
+
+    :param read:
+        The maximum amount of time to wait between consecutive
+        read operations for a response from the server. Omitting
+        the parameter will default the read timeout to the system
+        default, probably `the global default timeout in socket.py
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
+        None will set an infinite timeout.
+
+    :type read: integer, float, or None
+
+    .. note::
+
+        Many factors can affect the total amount of time for urllib3 to return
+        an HTTP response.
+
+        For example, Python's DNS resolver does not obey the timeout specified
+        on the socket. Other factors that can affect total request time include
+        high CPU load, high swap, the program running at a low priority level,
+        or other behaviors.
+
+        In addition, the read and total timeouts only measure the time between
+        read operations on the socket connecting the client and the server,
+        not the total amount of time for the request to return a complete
+        response. For most requests, the timeout is raised because the server
+        has not sent the first byte in the specified time. This is not always
+        the case; if a server streams one byte every fifteen seconds, a timeout
+        of 20 seconds will not trigger, even though the request will take
+        several minutes to complete.
+
+        If your goal is to cut off any request after a set amount of wall clock
+        time, consider having a second "watcher" thread to cut off a slow
+        request.
+    """
+
+    #: A sentinel object representing the default timeout value
+    DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT
+
+    def __init__(self, total=None, connect=_Default, read=_Default):
+        self._connect = self._validate_timeout(connect, 'connect')
+        self._read = self._validate_timeout(read, 'read')
+        self.total = self._validate_timeout(total, 'total')
+        self._start_connect = None
+
+    def __str__(self):
+        return '%s(connect=%r, read=%r, total=%r)' % (
+            type(self).__name__, self._connect, self._read, self.total)
+
+    @classmethod
+    def _validate_timeout(cls, value, name):
+        """ Check that a timeout attribute is valid.
+
+        :param value: The timeout value to validate
+        :param name: The name of the timeout attribute to validate. This is
+            used to specify in error messages.
+        :return: The validated and casted version of the given value.
+        :raises ValueError: If the type is not an integer or a float, or if it
+            is a numeric value less than zero.
+        """
+        if value is _Default:
+            return cls.DEFAULT_TIMEOUT
+
+        if value is None or value is cls.DEFAULT_TIMEOUT:
+            return value
+
+        try:
+            float(value)
+        except (TypeError, ValueError):
+            raise ValueError("Timeout value %s was %s, but it must be an "
+                             "int or float." % (name, value))
+
+        try:
+            if value < 0:
+                raise ValueError("Attempted to set %s timeout to %s, but the "
+                                 "timeout cannot be set to a value less "
+                                 "than 0." % (name, value))
+        except TypeError:  # Python 3
+            raise ValueError("Timeout value %s was %s, but it must be an "
+                             "int or float." % (name, value))
+
+        return value
+
+    @classmethod
+    def from_float(cls, timeout):
+        """ Create a new Timeout from a legacy timeout value.
+
+        The timeout value used by httplib.py sets the same timeout on the
+        connect(), and recv() socket requests. This creates a :class:`Timeout`
+        object that sets the individual timeouts to the ``timeout`` value
+        passed to this function.
+
+        :param timeout: The legacy timeout value.
+        :type timeout: integer, float, sentinel default object, or None
+        :return: Timeout object
+        :rtype: :class:`Timeout`
+        """
+        return Timeout(read=timeout, connect=timeout)
+
+    def clone(self):
+        """ Create a copy of the timeout object
+
+        Timeout properties are stored per-pool but each request needs a fresh
+        Timeout object to ensure each one has its own start/stop configured.
+
+        :return: a copy of the timeout object
+        :rtype: :class:`Timeout`
+        """
+        # We can't use copy.deepcopy because that will also create a new object
+        # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to
+        # detect the user default.
+        return Timeout(connect=self._connect, read=self._read,
+                       total=self.total)
+
+    def start_connect(self):
+        """ Start the timeout clock, used during a connect() attempt
+
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
+            to start a timer that has been started already.
+        """
+        if self._start_connect is not None:
+            raise TimeoutStateError("Timeout timer has already been started.")
+        self._start_connect = current_time()
+        return self._start_connect
+
+    def get_connect_duration(self):
+        """ Gets the time elapsed since the call to :meth:`start_connect`.
+
+        :return: Elapsed time.
+        :rtype: float
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
+            to get duration for a timer that hasn't been started.
+        """
+        if self._start_connect is None:
+            raise TimeoutStateError("Can't get connect duration for timer "
+                                    "that has not started.")
+        return current_time() - self._start_connect
+
+    @property
+    def connect_timeout(self):
+        """ Get the value to use when setting a connection timeout.
+
+        This will be a positive float or integer, the value None
+        (never timeout), or the default system timeout.
+
+        :return: Connect timeout.
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
+        """
+        if self.total is None:
+            return self._connect
+
+        if self._connect is None or self._connect is self.DEFAULT_TIMEOUT:
+            return self.total
+
+        return min(self._connect, self.total)
+
+    @property
+    def read_timeout(self):
+        """ Get the value for the read timeout.
+
+        This assumes some time has elapsed in the connection timeout and
+        computes the read timeout appropriately.
+
+        If self.total is set, the read timeout is dependent on the amount of
+        time taken by the connect timeout. If the connection time has not been
+        established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
+        raised.
+
+        :return: Value to use for the read timeout.
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
+        :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
+            has not yet been called on this object.
+        """
+        if (self.total is not None and
+                self.total is not self.DEFAULT_TIMEOUT and
+                self._read is not None and
+                self._read is not self.DEFAULT_TIMEOUT):
+            # In case the connect timeout has not yet been established.
+            if self._start_connect is None:
+                return self._read
+            return max(0, min(self.total - self.get_connect_duration(),
+                              self._read))
+        elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT:
+            return max(0, self.total - self.get_connect_duration())
+        else:
+            return self._read
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/request.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/request.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/request.py	(revision 1126)
@@ -0,0 +1,72 @@
+from __future__ import absolute_import
+from base64 import b64encode
+
+from ..packages.six import b
+
+ACCEPT_ENCODING = 'gzip,deflate'
+
+
+def make_headers(keep_alive=None, accept_encoding=None, user_agent=None,
+                 basic_auth=None, proxy_basic_auth=None, disable_cache=None):
+    """
+    Shortcuts for generating request headers.
+
+    :param keep_alive:
+        If ``True``, adds 'connection: keep-alive' header.
+
+    :param accept_encoding:
+        Can be a boolean, list, or string.
+        ``True`` translates to 'gzip,deflate'.
+        List will get joined by comma.
+        String will be used as provided.
+
+    :param user_agent:
+        String representing the user-agent you want, such as
+        "python-urllib3/0.6"
+
+    :param basic_auth:
+        Colon-separated username:password string for 'authorization: basic ...'
+        auth header.
+
+    :param proxy_basic_auth:
+        Colon-separated username:password string for 'proxy-authorization: basic ...'
+        auth header.
+
+    :param disable_cache:
+        If ``True``, adds 'cache-control: no-cache' header.
+
+    Example::
+
+        >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
+        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
+        >>> make_headers(accept_encoding=True)
+        {'accept-encoding': 'gzip,deflate'}
+    """
+    headers = {}
+    if accept_encoding:
+        if isinstance(accept_encoding, str):
+            pass
+        elif isinstance(accept_encoding, list):
+            accept_encoding = ','.join(accept_encoding)
+        else:
+            accept_encoding = ACCEPT_ENCODING
+        headers['accept-encoding'] = accept_encoding
+
+    if user_agent:
+        headers['user-agent'] = user_agent
+
+    if keep_alive:
+        headers['connection'] = 'keep-alive'
+
+    if basic_auth:
+        headers['authorization'] = 'Basic ' + \
+            b64encode(b(basic_auth)).decode('utf-8')
+
+    if proxy_basic_auth:
+        headers['proxy-authorization'] = 'Basic ' + \
+            b64encode(b(proxy_basic_auth)).decode('utf-8')
+
+    if disable_cache:
+        headers['cache-control'] = 'no-cache'
+
+    return headers
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/response.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/response.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/response.py	(revision 1126)
@@ -0,0 +1,74 @@
+from __future__ import absolute_import
+from ..packages.six.moves import http_client as httplib
+
+from ..exceptions import HeaderParsingError
+
+
+def is_fp_closed(obj):
+    """
+    Checks whether a given file-like object is closed.
+
+    :param obj:
+        The file-like object to check.
+    """
+
+    try:
+        # Check via the official file-like-object way.
+        return obj.closed
+    except AttributeError:
+        pass
+
+    try:
+        # Check if the object is a container for another file-like object that
+        # gets released on exhaustion (e.g. HTTPResponse).
+        return obj.fp is None
+    except AttributeError:
+        pass
+
+    raise ValueError("Unable to determine whether fp is closed.")
+
+
+def assert_header_parsing(headers):
+    """
+    Asserts whether all headers have been successfully parsed.
+    Extracts encountered errors from the result of parsing headers.
+
+    Only works on Python 3.
+
+    :param headers: Headers to verify.
+    :type headers: `httplib.HTTPMessage`.
+
+    :raises urllib3.exceptions.HeaderParsingError:
+        If parsing errors are found.
+    """
+
+    # This will fail silently if we pass in the wrong kind of parameter.
+    # To make debugging easier add an explicit check.
+    if not isinstance(headers, httplib.HTTPMessage):
+        raise TypeError('expected httplib.Message, got {0}.'.format(
+            type(headers)))
+
+    defects = getattr(headers, 'defects', None)
+    get_payload = getattr(headers, 'get_payload', None)
+
+    unparsed_data = None
+    if get_payload:  # Platform-specific: Python 3.
+        unparsed_data = get_payload()
+
+    if defects or unparsed_data:
+        raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
+
+
+def is_response_to_head(response):
+    """
+    Checks, wether a the request of a response has been a HEAD-request.
+    Handles the quirks of AppEngine.
+
+    :param conn:
+    :type conn: :class:`httplib.HTTPResponse`
+    """
+    # FIXME: Can we do this somehow without accessing private httplib _method?
+    method = response._method
+    if isinstance(method, int):  # Platform-specific: Appengine
+        return method == 3
+    return method.upper() == 'HEAD'
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/__init__.py	(revision 1126)
@@ -0,0 +1,44 @@
+from __future__ import absolute_import
+# For backwards compatibility, provide imports that used to be here.
+from .connection import is_connection_dropped
+from .request import make_headers
+from .response import is_fp_closed
+from .ssl_ import (
+    SSLContext,
+    HAS_SNI,
+    assert_fingerprint,
+    resolve_cert_reqs,
+    resolve_ssl_version,
+    ssl_wrap_socket,
+)
+from .timeout import (
+    current_time,
+    Timeout,
+)
+
+from .retry import Retry
+from .url import (
+    get_host,
+    parse_url,
+    split_first,
+    Url,
+)
+
+__all__ = (
+    'HAS_SNI',
+    'SSLContext',
+    'Retry',
+    'Timeout',
+    'Url',
+    'assert_fingerprint',
+    'current_time',
+    'is_connection_dropped',
+    'is_fp_closed',
+    'get_host',
+    'parse_url',
+    'make_headers',
+    'resolve_cert_reqs',
+    'resolve_ssl_version',
+    'split_first',
+    'ssl_wrap_socket',
+)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/connection.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/connection.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/connection.py	(revision 1126)
@@ -0,0 +1,101 @@
+from __future__ import absolute_import
+import socket
+try:
+    from select import poll, POLLIN
+except ImportError:  # `poll` doesn't exist on OSX and other platforms
+    poll = False
+    try:
+        from select import select
+    except ImportError:  # `select` doesn't exist on AppEngine.
+        select = False
+
+
+def is_connection_dropped(conn):  # Platform-specific
+    """
+    Returns True if the connection is dropped and should be closed.
+
+    :param conn:
+        :class:`httplib.HTTPConnection` object.
+
+    Note: For platforms like AppEngine, this will always return ``False`` to
+    let the platform handle connection recycling transparently for us.
+    """
+    sock = getattr(conn, 'sock', False)
+    if sock is False:  # Platform-specific: AppEngine
+        return False
+    if sock is None:  # Connection already closed (such as by httplib).
+        return True
+
+    if not poll:
+        if not select:  # Platform-specific: AppEngine
+            return False
+
+        try:
+            return select([sock], [], [], 0.0)[0]
+        except socket.error:
+            return True
+
+    # This version is better on platforms that support it.
+    p = poll()
+    p.register(sock, POLLIN)
+    for (fno, ev) in p.poll(0.0):
+        if fno == sock.fileno():
+            # Either data is buffered (bad), or the connection is dropped.
+            return True
+
+
+# This function is copied from socket.py in the Python 2.7 standard
+# library test suite. Added to its signature is only `socket_options`.
+def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+                      source_address=None, socket_options=None):
+    """Connect to *address* and return the socket object.
+
+    Convenience function.  Connect to *address* (a 2-tuple ``(host,
+    port)``) and return the socket object.  Passing the optional
+    *timeout* parameter will set the timeout on the socket instance
+    before attempting to connect.  If no *timeout* is supplied, the
+    global default timeout setting returned by :func:`getdefaulttimeout`
+    is used.  If *source_address* is set it must be a tuple of (host, port)
+    for the socket to bind as a source address before making the connection.
+    An host of '' or port 0 tells the OS to use the default.
+    """
+
+    host, port = address
+    if host.startswith('['):
+        host = host.strip('[]')
+    err = None
+    for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
+        af, socktype, proto, canonname, sa = res
+        sock = None
+        try:
+            sock = socket.socket(af, socktype, proto)
+
+            # If provided, set socket level options before connecting.
+            # This is the only addition urllib3 makes to this function.
+            _set_socket_options(sock, socket_options)
+
+            if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
+                sock.settimeout(timeout)
+            if source_address:
+                sock.bind(source_address)
+            sock.connect(sa)
+            return sock
+
+        except socket.error as e:
+            err = e
+            if sock is not None:
+                sock.close()
+                sock = None
+
+    if err is not None:
+        raise err
+
+    raise socket.error("getaddrinfo returns an empty list")
+
+
+def _set_socket_options(sock, options):
+    if options is None:
+        return
+
+    for opt in options:
+        sock.setsockopt(*opt)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/ssl_.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/ssl_.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/ssl_.py	(revision 1126)
@@ -0,0 +1,317 @@
+from __future__ import absolute_import
+import errno
+import warnings
+import hmac
+
+from binascii import hexlify, unhexlify
+from hashlib import md5, sha1, sha256
+
+from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning
+
+
+SSLContext = None
+HAS_SNI = False
+create_default_context = None
+
+# Maps the length of a digest to a possible hash function producing this digest
+HASHFUNC_MAP = {
+    32: md5,
+    40: sha1,
+    64: sha256,
+}
+
+
+def _const_compare_digest_backport(a, b):
+    """
+    Compare two digests of equal length in constant time.
+
+    The digests must be of type str/bytes.
+    Returns True if the digests match, and False otherwise.
+    """
+    result = abs(len(a) - len(b))
+    for l, r in zip(bytearray(a), bytearray(b)):
+        result |= l ^ r
+    return result == 0
+
+
+_const_compare_digest = getattr(hmac, 'compare_digest',
+                                _const_compare_digest_backport)
+
+
+try:  # Test for SSL features
+    import ssl
+    from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23
+    from ssl import HAS_SNI  # Has SNI?
+except ImportError:
+    pass
+
+
+try:
+    from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION
+except ImportError:
+    OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000
+    OP_NO_COMPRESSION = 0x20000
+
+# A secure default.
+# Sources for more information on TLS ciphers:
+#
+# - https://wiki.mozilla.org/Security/Server_Side_TLS
+# - https://www.ssllabs.com/projects/best-practices/index.html
+# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
+#
+# The general intent is:
+# - Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE),
+# - prefer ECDHE over DHE for better performance,
+# - prefer any AES-GCM over any AES-CBC for better performance and security,
+# - use 3DES as fallback which is secure but slow,
+# - disable NULL authentication, MD5 MACs and DSS for security reasons.
+DEFAULT_CIPHERS = (
+    'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
+    'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
+    '!eNULL:!MD5'
+)
+
+try:
+    from ssl import SSLContext  # Modern SSL?
+except ImportError:
+    import sys
+
+    class SSLContext(object):  # Platform-specific: Python 2 & 3.1
+        supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or
+                                (3, 2) <= sys.version_info)
+
+        def __init__(self, protocol_version):
+            self.protocol = protocol_version
+            # Use default values from a real SSLContext
+            self.check_hostname = False
+            self.verify_mode = ssl.CERT_NONE
+            self.ca_certs = None
+            self.options = 0
+            self.certfile = None
+            self.keyfile = None
+            self.ciphers = None
+
+        def load_cert_chain(self, certfile, keyfile):
+            self.certfile = certfile
+            self.keyfile = keyfile
+
+        def load_verify_locations(self, cafile=None, capath=None):
+            self.ca_certs = cafile
+
+            if capath is not None:
+                raise SSLError("CA directories not supported in older Pythons")
+
+        def set_ciphers(self, cipher_suite):
+            if not self.supports_set_ciphers:
+                raise TypeError(
+                    'Your version of Python does not support setting '
+                    'a custom cipher suite. Please upgrade to Python '
+                    '2.7, 3.2, or later if you need this functionality.'
+                )
+            self.ciphers = cipher_suite
+
+        def wrap_socket(self, socket, server_hostname=None):
+            warnings.warn(
+                'A true SSLContext object is not available. This prevents '
+                'urllib3 from configuring SSL appropriately and may cause '
+                'certain SSL connections to fail. For more information, see '
+                'https://urllib3.readthedocs.org/en/latest/security.html'
+                '#insecureplatformwarning.',
+                InsecurePlatformWarning
+            )
+            kwargs = {
+                'keyfile': self.keyfile,
+                'certfile': self.certfile,
+                'ca_certs': self.ca_certs,
+                'cert_reqs': self.verify_mode,
+                'ssl_version': self.protocol,
+            }
+            if self.supports_set_ciphers:  # Platform-specific: Python 2.7+
+                return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
+            else:  # Platform-specific: Python 2.6
+                return wrap_socket(socket, **kwargs)
+
+
+def assert_fingerprint(cert, fingerprint):
+    """
+    Checks if given fingerprint matches the supplied certificate.
+
+    :param cert:
+        Certificate as bytes object.
+    :param fingerprint:
+        Fingerprint as string of hexdigits, can be interspersed by colons.
+    """
+
+    fingerprint = fingerprint.replace(':', '').lower()
+    digest_length = len(fingerprint)
+    hashfunc = HASHFUNC_MAP.get(digest_length)
+    if not hashfunc:
+        raise SSLError(
+            'Fingerprint of invalid length: {0}'.format(fingerprint))
+
+    # We need encode() here for py32; works on py2 and p33.
+    fingerprint_bytes = unhexlify(fingerprint.encode())
+
+    cert_digest = hashfunc(cert).digest()
+
+    if not _const_compare_digest(cert_digest, fingerprint_bytes):
+        raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".'
+                       .format(fingerprint, hexlify(cert_digest)))
+
+
+def resolve_cert_reqs(candidate):
+    """
+    Resolves the argument to a numeric constant, which can be passed to
+    the wrap_socket function/method from the ssl module.
+    Defaults to :data:`ssl.CERT_NONE`.
+    If given a string it is assumed to be the name of the constant in the
+    :mod:`ssl` module or its abbrevation.
+    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
+    If it's neither `None` nor a string we assume it is already the numeric
+    constant which can directly be passed to wrap_socket.
+    """
+    if candidate is None:
+        return CERT_NONE
+
+    if isinstance(candidate, str):
+        res = getattr(ssl, candidate, None)
+        if res is None:
+            res = getattr(ssl, 'CERT_' + candidate)
+        return res
+
+    return candidate
+
+
+def resolve_ssl_version(candidate):
+    """
+    like resolve_cert_reqs
+    """
+    if candidate is None:
+        return PROTOCOL_SSLv23
+
+    if isinstance(candidate, str):
+        res = getattr(ssl, candidate, None)
+        if res is None:
+            res = getattr(ssl, 'PROTOCOL_' + candidate)
+        return res
+
+    return candidate
+
+
+def create_urllib3_context(ssl_version=None, cert_reqs=None,
+                           options=None, ciphers=None):
+    """All arguments have the same meaning as ``ssl_wrap_socket``.
+
+    By default, this function does a lot of the same work that
+    ``ssl.create_default_context`` does on Python 3.4+. It:
+
+    - Disables SSLv2, SSLv3, and compression
+    - Sets a restricted set of server ciphers
+
+    If you wish to enable SSLv3, you can do::
+
+        from urllib3.util import ssl_
+        context = ssl_.create_urllib3_context()
+        context.options &= ~ssl_.OP_NO_SSLv3
+
+    You can do the same to enable compression (substituting ``COMPRESSION``
+    for ``SSLv3`` in the last line above).
+
+    :param ssl_version:
+        The desired protocol version to use. This will default to
+        PROTOCOL_SSLv23 which will negotiate the highest protocol that both
+        the server and your installation of OpenSSL support.
+    :param cert_reqs:
+        Whether to require the certificate verification. This defaults to
+        ``ssl.CERT_REQUIRED``.
+    :param options:
+        Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``,
+        ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``.
+    :param ciphers:
+        Which cipher suites to allow the server to select.
+    :returns:
+        Constructed SSLContext object with specified options
+    :rtype: SSLContext
+    """
+    context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23)
+
+    # Setting the default here, as we may have no ssl module on import
+    cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs
+
+    if options is None:
+        options = 0
+        # SSLv2 is easily broken and is considered harmful and dangerous
+        options |= OP_NO_SSLv2
+        # SSLv3 has several problems and is now dangerous
+        options |= OP_NO_SSLv3
+        # Disable compression to prevent CRIME attacks for OpenSSL 1.0+
+        # (issue #309)
+        options |= OP_NO_COMPRESSION
+
+    context.options |= options
+
+    if getattr(context, 'supports_set_ciphers', True):  # Platform-specific: Python 2.6
+        context.set_ciphers(ciphers or DEFAULT_CIPHERS)
+
+    context.verify_mode = cert_reqs
+    if getattr(context, 'check_hostname', None) is not None:  # Platform-specific: Python 3.2
+        # We do our own verification, including fingerprints and alternative
+        # hostnames. So disable it here
+        context.check_hostname = False
+    return context
+
+
+def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
+                    ca_certs=None, server_hostname=None,
+                    ssl_version=None, ciphers=None, ssl_context=None,
+                    ca_cert_dir=None):
+    """
+    All arguments except for server_hostname, ssl_context, and ca_cert_dir have
+    the same meaning as they do when using :func:`ssl.wrap_socket`.
+
+    :param server_hostname:
+        When SNI is supported, the expected hostname of the certificate
+    :param ssl_context:
+        A pre-made :class:`SSLContext` object. If none is provided, one will
+        be created using :func:`create_urllib3_context`.
+    :param ciphers:
+        A string of ciphers we wish the client to support. This is not
+        supported on Python 2.6 as the ssl module does not support it.
+    :param ca_cert_dir:
+        A directory containing CA certificates in multiple separate files, as
+        supported by OpenSSL's -CApath flag or the capath argument to
+        SSLContext.load_verify_locations().
+    """
+    context = ssl_context
+    if context is None:
+        context = create_urllib3_context(ssl_version, cert_reqs,
+                                         ciphers=ciphers)
+
+    if ca_certs or ca_cert_dir:
+        try:
+            context.load_verify_locations(ca_certs, ca_cert_dir)
+        except IOError as e:  # Platform-specific: Python 2.6, 2.7, 3.2
+            raise SSLError(e)
+        # Py33 raises FileNotFoundError which subclasses OSError
+        # These are not equivalent unless we check the errno attribute
+        except OSError as e:  # Platform-specific: Python 3.3 and beyond
+            if e.errno == errno.ENOENT:
+                raise SSLError(e)
+            raise
+
+    if certfile:
+        context.load_cert_chain(certfile, keyfile)
+    if HAS_SNI:  # Platform-specific: OpenSSL with enabled SNI
+        return context.wrap_socket(sock, server_hostname=server_hostname)
+
+    warnings.warn(
+        'An HTTPS request has been made, but the SNI (Subject Name '
+        'Indication) extension to TLS is not available on this platform. '
+        'This may cause the server to present an incorrect TLS '
+        'certificate, which can cause validation failures. For more '
+        'information, see '
+        'https://urllib3.readthedocs.org/en/latest/security.html'
+        '#snimissingwarning.',
+        SNIMissingWarning
+    )
+    return context.wrap_socket(sock)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/url.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/url.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/packages/urllib3/util/url.py	(revision 1126)
@@ -0,0 +1,217 @@
+from __future__ import absolute_import
+from collections import namedtuple
+
+from ..exceptions import LocationParseError
+
+
+url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment']
+
+
+class Url(namedtuple('Url', url_attrs)):
+    """
+    Datastructure for representing an HTTP URL. Used as a return value for
+    :func:`parse_url`.
+    """
+    slots = ()
+
+    def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None,
+                query=None, fragment=None):
+        if path and not path.startswith('/'):
+            path = '/' + path
+        return super(Url, cls).__new__(cls, scheme, auth, host, port, path,
+                                       query, fragment)
+
+    @property
+    def hostname(self):
+        """For backwards-compatibility with urlparse. We're nice like that."""
+        return self.host
+
+    @property
+    def request_uri(self):
+        """Absolute path including the query string."""
+        uri = self.path or '/'
+
+        if self.query is not None:
+            uri += '?' + self.query
+
+        return uri
+
+    @property
+    def netloc(self):
+        """Network location including host and port"""
+        if self.port:
+            return '%s:%d' % (self.host, self.port)
+        return self.host
+
+    @property
+    def url(self):
+        """
+        Convert self into a url
+
+        This function should more or less round-trip with :func:`.parse_url`. The
+        returned url may not be exactly the same as the url inputted to
+        :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls
+        with a blank port will have : removed).
+
+        Example: ::
+
+            >>> U = parse_url('http://google.com/mail/')
+            >>> U.url
+            'http://google.com/mail/'
+            >>> Url('http', 'username:password', 'host.com', 80,
+            ... '/path', 'query', 'fragment').url
+            'http://username:password@host.com:80/path?query#fragment'
+        """
+        scheme, auth, host, port, path, query, fragment = self
+        url = ''
+
+        # We use "is not None" we want things to happen with empty strings (or 0 port)
+        if scheme is not None:
+            url += scheme + '://'
+        if auth is not None:
+            url += auth + '@'
+        if host is not None:
+            url += host
+        if port is not None:
+            url += ':' + str(port)
+        if path is not None:
+            url += path
+        if query is not None:
+            url += '?' + query
+        if fragment is not None:
+            url += '#' + fragment
+
+        return url
+
+    def __str__(self):
+        return self.url
+
+
+def split_first(s, delims):
+    """
+    Given a string and an iterable of delimiters, split on the first found
+    delimiter. Return two split parts and the matched delimiter.
+
+    If not found, then the first part is the full input string.
+
+    Example::
+
+        >>> split_first('foo/bar?baz', '?/=')
+        ('foo', 'bar?baz', '/')
+        >>> split_first('foo/bar?baz', '123')
+        ('foo/bar?baz', '', None)
+
+    Scales linearly with number of delims. Not ideal for large number of delims.
+    """
+    min_idx = None
+    min_delim = None
+    for d in delims:
+        idx = s.find(d)
+        if idx < 0:
+            continue
+
+        if min_idx is None or idx < min_idx:
+            min_idx = idx
+            min_delim = d
+
+    if min_idx is None or min_idx < 0:
+        return s, '', None
+
+    return s[:min_idx], s[min_idx + 1:], min_delim
+
+
+def parse_url(url):
+    """
+    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
+    performed to parse incomplete urls. Fields not provided will be None.
+
+    Partly backwards-compatible with :mod:`urlparse`.
+
+    Example::
+
+        >>> parse_url('http://google.com/mail/')
+        Url(scheme='http', host='google.com', port=None, path='/mail/', ...)
+        >>> parse_url('google.com:80')
+        Url(scheme=None, host='google.com', port=80, path=None, ...)
+        >>> parse_url('/foo?bar')
+        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
+    """
+
+    # While this code has overlap with stdlib's urlparse, it is much
+    # simplified for our needs and less annoying.
+    # Additionally, this implementations does silly things to be optimal
+    # on CPython.
+
+    if not url:
+        # Empty
+        return Url()
+
+    scheme = None
+    auth = None
+    host = None
+    port = None
+    path = None
+    fragment = None
+    query = None
+
+    # Scheme
+    if '://' in url:
+        scheme, url = url.split('://', 1)
+
+    # Find the earliest Authority Terminator
+    # (http://tools.ietf.org/html/rfc3986#section-3.2)
+    url, path_, delim = split_first(url, ['/', '?', '#'])
+
+    if delim:
+        # Reassemble the path
+        path = delim + path_
+
+    # Auth
+    if '@' in url:
+        # Last '@' denotes end of auth part
+        auth, url = url.rsplit('@', 1)
+
+    # IPv6
+    if url and url[0] == '[':
+        host, url = url.split(']', 1)
+        host += ']'
+
+    # Port
+    if ':' in url:
+        _host, port = url.split(':', 1)
+
+        if not host:
+            host = _host
+
+        if port:
+            # If given, ports must be integers.
+            if not port.isdigit():
+                raise LocationParseError(url)
+            port = int(port)
+        else:
+            # Blank ports are cool, too. (rfc3986#section-3.2.3)
+            port = None
+
+    elif not host and url:
+        host = url
+
+    if not path:
+        return Url(scheme, auth, host, port, path, query, fragment)
+
+    # Fragment
+    if '#' in path:
+        path, fragment = path.split('#', 1)
+
+    # Query
+    if '?' in path:
+        path, query = path.split('?', 1)
+
+    return Url(scheme, auth, host, port, path, query, fragment)
+
+
+def get_host(url):
+    """
+    Deprecated. Use :func:`.parse_url` instead.
+    """
+    p = parse_url(url)
+    return p.scheme or 'http', p.hostname, p.port
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/cacert.pem
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/cacert.pem	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/cacert.pem	(revision 1126)
@@ -0,0 +1,5616 @@
+
+# Issuer: O=Equifax OU=Equifax Secure Certificate Authority
+# Subject: O=Equifax OU=Equifax Secure Certificate Authority
+# Label: "Equifax Secure CA"
+# Serial: 903804111
+# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4
+# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a
+# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
+dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
+MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
+dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
+BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
+cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
+MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
+aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
+ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
+IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
+7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
+1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Label: "GlobalSign Root CA"
+# Serial: 4835703278459707669005204
+# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
+# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
+# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Label: "GlobalSign Root CA - R2"
+# Serial: 4835703278459682885658125
+# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
+# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
+# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
+# Serial: 206684696279472310254277870180966723415
+# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
+# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
+# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 4 Public Primary Certification Authority - G3"
+# Serial: 314531972711909413743075096039378935511
+# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df
+# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d
+# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
+GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
+U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
+NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
+ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
+ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
+CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
+g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
+2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
+bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Premium 2048 Secure Server CA"
+# Serial: 946069240
+# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
+# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
+# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Label: "Baltimore CyberTrust Root"
+# Serial: 33554617
+# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
+# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
+# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Low-Value Services Root"
+# Serial: 1
+# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc
+# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d
+# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
+MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
+VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
+CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
+tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
+dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
+PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
+BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
+ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
+7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
+43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
+pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
+WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Label: "AddTrust External Root"
+# Serial: 1
+# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
+# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
+# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Public Services Root"
+# Serial: 1
+# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f
+# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5
+# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
+MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
+ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
+BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
+6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
+GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
+dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
+1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
+62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
+BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
+MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
+cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
+b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
+IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
+iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
+4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
+XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Qualified Certificates Root"
+# Serial: 1
+# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb
+# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf
+# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
+MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
+EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
+BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
+xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
+87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
+2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
+WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
+0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
+A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
+pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
+ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
+aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
+hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
+hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
+P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
+iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
+xqE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Label: "Entrust Root Certification Authority"
+# Serial: 1164660820
+# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
+# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
+# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3
+# Subject: O=RSA Security Inc OU=RSA Security 2048 V3
+# Label: "RSA Security 2048 v3"
+# Serial: 13297492616345471454730593562152402946
+# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e
+# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42
+# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
+MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
+dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
+BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
+MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
+eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
+/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
+wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
+AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
+PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
+AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
+MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
+HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
+Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
+f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
+rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
+6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
+7CAFYd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Label: "GeoTrust Global CA"
+# Serial: 144470
+# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
+# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
+# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Global CA 2"
+# Serial: 1
+# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9
+# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d
+# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
+IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
+R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
+PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
+Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
+TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
+5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
+S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
+2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
+EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
+EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
+/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
+A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
+abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
+I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
+4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA"
+# Serial: 1
+# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
+# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
+# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA 2"
+# Serial: 1
+# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
+# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
+# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Label: "Visa eCommerce Root"
+# Serial: 25952180776285836048024890241505565794
+# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02
+# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62
+# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum CA O=Unizeto Sp. z o.o.
+# Subject: CN=Certum CA O=Unizeto Sp. z o.o.
+# Label: "Certum Root CA"
+# Serial: 65568
+# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9
+# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18
+# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
+jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
+ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
+ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
+Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
+AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
+HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
+uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
+TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
+xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
+CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
+O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
+6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
+# Subject: CN=AAA Certificate Services O=Comodo CA Limited
+# Label: "Comodo AAA Services root"
+# Serial: 1
+# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
+# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
+# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Certificate Services O=Comodo CA Limited
+# Subject: CN=Secure Certificate Services O=Comodo CA Limited
+# Label: "Comodo Secure Services root"
+# Serial: 1
+# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd
+# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1
+# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
+ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
+fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
+BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
+cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
+HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
+CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
+3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
+6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
+HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
+Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
+Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
+DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
+5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
+gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
+aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
+izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited
+# Subject: CN=Trusted Certificate Services O=Comodo CA Limited
+# Label: "Comodo Trusted Services root"
+# Serial: 1
+# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27
+# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd
+# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
+aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
+MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
+VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
+fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
+TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
+fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
+1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
+kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
+A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
+ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
+dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
+Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
+HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
+jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
+dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Label: "QuoVadis Root CA"
+# Serial: 985026699
+# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
+# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
+# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2"
+# Serial: 1289
+# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
+# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
+# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3"
+# Serial: 1478
+# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
+# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
+# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
+# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
+# Label: "Security Communication Root CA"
+# Serial: 0
+# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
+# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
+# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Sonera Class2 CA O=Sonera
+# Subject: CN=Sonera Class2 CA O=Sonera
+# Label: "Sonera Class 2 Root CA"
+# Serial: 29
+# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
+# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
+# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA"
+# Serial: 10000010
+# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0
+# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04
+# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO
+TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy
+MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk
+ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn
+ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71
+9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO
+hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U
+tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o
+BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh
+SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww
+OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv
+cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA
+7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k
+/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm
+eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6
+u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy
+7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
+# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
+# Label: "UTN DATACorp SGC Root CA"
+# Serial: 91374294542884689855167577680241077609
+# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06
+# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4
+# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
+kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
+IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
+EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
+VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
+dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
+E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
+D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
+4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
+lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
+bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
+o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
+MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
+LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
+BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
+AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
+j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
+KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
+2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
+mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
+# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
+# Label: "UTN USERFirst Hardware Root CA"
+# Serial: 91374294542884704022267039221184531197
+# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39
+# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7
+# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
+lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
+SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
+MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
+d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
+cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
+0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
+M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
+MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
+oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
+DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
+oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
+dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
+bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
+BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
+CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
+CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
+3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
+KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Label: "Camerfirma Chambers of Commerce Root"
+# Serial: 0
+# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84
+# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1
+# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
+b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa
+MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB
+ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw
+IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B
+AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb
+unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d
+BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq
+7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3
+0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX
+roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG
+A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j
+aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
+26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA
+BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud
+EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN
+BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB
+AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd
+p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi
+1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc
+XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0
+eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu
+tGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Label: "Camerfirma Global Chambersign Root"
+# Serial: 0
+# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19
+# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9
+# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo
+YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9
+MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy
+NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G
+A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA
+A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0
+Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s
+QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV
+eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795
+B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh
+z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T
+AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i
+ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
+TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH
+MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD
+VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE
+VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B
+AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM
+bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi
+ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG
+VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c
+ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/
+AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Label: "NetLock Notary (Class A) Root"
+# Serial: 259
+# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7
+# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6
+# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV
+MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe
+TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0
+dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0
+N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC
+dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu
+MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL
+b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD
+zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi
+3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8
+WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY
+Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi
+NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC
+ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4
+QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0
+YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz
+aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm
+ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg
+ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs
+amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv
+IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3
+Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6
+ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1
+YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg
+dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs
+b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G
+CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO
+xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP
+0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ
+QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk
+f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK
+8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+
+# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Label: "XRamp Global CA Root"
+# Serial: 107108908803651509692980124233745014957
+# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
+# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
+# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Label: "Go Daddy Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
+# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
+# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+
+# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Label: "Starfield Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
+# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
+# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Label: "StartCom Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16
+# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f
+# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
+LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
+BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
+dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
+cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
+YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
+dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
+bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
+YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
+TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
+9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
+jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
+FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
+ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
+ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
+EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
+L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
+O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
+um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
+NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
+-----END CERTIFICATE-----
+
+# Issuer: O=Government Root Certification Authority
+# Subject: O=Government Root Certification Authority
+# Label: "Taiwan GRCA"
+# Serial: 42023070807708724159991140556527066870
+# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
+# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
+# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+
+# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services
+# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services
+# Label: "Swisscom Root CA 1"
+# Serial: 122348795730808398873664200247279986742
+# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9
+# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51
+# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk
+MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
+YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
+Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT
+AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
+Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9
+m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih
+FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/
+TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F
+EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco
+kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu
+HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF
+vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo
+19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
+L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW
+bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX
+JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
+FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc
+K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf
+ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik
+Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB
+sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e
+3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR
+ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip
+mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH
+b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf
+rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms
+hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
+zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6
+MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root CA"
+# Serial: 17154717934120587862167794914071425081
+# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
+# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
+# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root CA"
+# Serial: 10944719598952040374951832963794454346
+# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
+# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
+# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert High Assurance EV Root CA"
+# Serial: 3553400076410547919724730734378100087
+# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
+# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
+# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+
+# Issuer: CN=Class 2 Primary CA O=Certplus
+# Subject: CN=Class 2 Primary CA O=Certplus
+# Label: "Certplus Class 2 Primary CA"
+# Serial: 177770208045934040241468760488327595043
+# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
+# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
+# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Label: "DST Root CA X3"
+# Serial: 91299735575339953335919266965803778155
+# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
+# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
+# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES
+# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES
+# Label: "DST ACES CA X6"
+# Serial: 17771143917277623872238992636097467865
+# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8
+# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d
+# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx
+ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w
+MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD
+VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx
+FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu
+ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7
+gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH
+fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a
+ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT
+ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk
+c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto
+dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
+aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI
+hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk
+QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/
+h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR
+rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2
+9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005
+# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005
+# Label: "TURKTRUST Certificate Services Provider Root 2"
+# Serial: 1
+# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00
+# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7
+# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6
+-----BEGIN CERTIFICATE-----
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS
+S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
+SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3
+WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv
+bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU
+UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw
+bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe
+LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef
+J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh
+R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ
+Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX
+JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p
+zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S
+Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
+KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq
+ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz
+gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH
+uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS
+y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Label: "SwissSign Gold CA - G2"
+# Serial: 13492815561806991280
+# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
+# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
+# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
+biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
+MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
+d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
+76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
+6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
+emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
+MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
+MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
+MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
+FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
+aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
+gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
+qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
+lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
+8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
+45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
+UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
+O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
+bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
+GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
+77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
+hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
+92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
+Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
+ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
+Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Label: "SwissSign Silver CA - G2"
+# Serial: 5700383053117599563
+# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
+# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
+# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
+IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
+RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
+U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
+Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
+YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
+nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
+6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
+eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
+c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
+MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
+HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
+jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
+5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
+rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
+wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
+AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
+WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
+xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
+2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
+IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
+aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
+em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
+dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
+OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
+tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Label: "GeoTrust Primary Certification Authority"
+# Serial: 32798226551256963324313806436981982369
+# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
+# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
+# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA"
+# Serial: 69529181992039203566298953787712940909
+# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
+# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
+# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
+# Serial: 33037644167568058970164719475676101450
+# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
+# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
+# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
+# Subject: CN=SecureTrust CA O=SecureTrust Corporation
+# Label: "SecureTrust CA"
+# Serial: 17199774589125277788362757014266862032
+# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
+# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
+# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Global CA O=SecureTrust Corporation
+# Subject: CN=Secure Global CA O=SecureTrust Corporation
+# Label: "Secure Global CA"
+# Serial: 9751836167731051554232119481456978597
+# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
+# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
+# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
+# Label: "COMODO Certification Authority"
+# Serial: 104350513648249232941998508985834464573
+# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
+# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
+# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Label: "Network Solutions Certificate Authority"
+# Serial: 116697915152937497490437556386812487904
+# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
+# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
+# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA
+# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA
+# Label: "WellsSecure Public Root Certificate Authority"
+# Serial: 1
+# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36
+# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee
+# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx
+IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs
+cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v
+dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0
+MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl
+bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD
+DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r
+WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU
+Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs
+HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj
+z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf
+SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl
+AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG
+KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P
+AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j
+BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC
+VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX
+ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB
+ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd
+/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB
+A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn
+k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9
+iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv
+2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Label: "COMODO ECC Certification Authority"
+# Serial: 41578283867086692638256921589707938090
+# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
+# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
+# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI
+# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI
+# Label: "IGC/A"
+# Serial: 245102874772
+# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37
+# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c
+# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT
+AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ
+TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG
+9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw
+MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM
+BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO
+MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2
+LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI
+s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2
+xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4
+u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b
+F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx
+Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd
+PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV
+HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx
+NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF
+AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ
+L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY
+YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a
+NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R
+0982gaEbeC9xs/FZTEYYKKuF0mBWWg==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1
+# Label: "Security Communication EV RootCA1"
+# Serial: 0
+# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3
+# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d
+# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz
+MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N
+IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11
+bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE
+RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO
+zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5
+bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF
+MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1
+VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC
+OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW
+tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ
+q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb
+EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+
+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O
+VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GA CA"
+# Serial: 86718877871133159090080555911823548314
+# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
+# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
+# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA
+# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA
+# Label: "Microsec e-Szigno Root CA"
+# Serial: 272122594155480254301341951808045322001
+# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5
+# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d
+# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw
+cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy
+b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z
+ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4
+NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN
+TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p
+Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u
+uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+
+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA
+vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770
+Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx
+62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB
+AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw
+LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP
+BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB
+AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov
+MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5
+ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT
+AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh
+ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo
+AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa
+AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln
+bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p
+Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP
+PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv
+Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB
+EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu
+w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj
+cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV
+HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI
+VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS
+BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS
+b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS
+8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds
+ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl
+7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR
+hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/
+MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certigna O=Dhimyotis
+# Subject: CN=Certigna O=Dhimyotis
+# Label: "Certigna"
+# Serial: 18364802974209362175
+# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
+# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
+# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Label: "Deutsche Telekom Root CA 2"
+# Serial: 38
+# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
+# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
+# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Label: "Cybertrust Global Root"
+# Serial: 4835703278459682877484360
+# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
+# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
+# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Label: "ePKI Root Certification Authority"
+# Serial: 28956088682735189655030529057352760477
+# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
+# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
+# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi
+# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi
+# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3"
+# Serial: 17
+# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26
+# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96
+# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS
+MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp
+bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw
+VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy
+YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy
+dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe
+Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx
+GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls
+aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU
+QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh
+xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0
+aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr
+IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h
+gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK
+O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO
+fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw
+lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID
+AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP
+NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t
+wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM
+7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh
+gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n
+oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs
+yZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327
+# Label: "Buypass Class 2 CA 1"
+# Serial: 1
+# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23
+# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc
+# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
+Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL
+MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
+VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0
+ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX
+l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB
+HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B
+5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3
+WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD
+AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP
+gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+
+DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu
+BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs
+h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk
+LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.
+# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.
+# Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1"
+# Serial: 5525761995591021570
+# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37
+# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58
+# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV
+BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt
+ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4
+MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl
+a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h
+4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk
+tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s
+tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL
+dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4
+c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um
+TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z
++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O
+Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW
+OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW
+fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2
+l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw
+FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+
+8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI
+6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO
+TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME
+wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY
+Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn
+xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q
+DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q
+Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t
+hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4
+7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7
+QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+
+# Issuer: O=certSIGN OU=certSIGN ROOT CA
+# Subject: O=certSIGN OU=certSIGN ROOT CA
+# Label: "certSIGN ROOT CA"
+# Serial: 35210227249154
+# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
+# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
+# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
+AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
+QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
+MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
+0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
+UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
+RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
+OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
+JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
+AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
+BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
+LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
+MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
+44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
+Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
+i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
+9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+# Issuer: CN=CNNIC ROOT O=CNNIC
+# Subject: CN=CNNIC ROOT O=CNNIC
+# Label: "CNNIC ROOT"
+# Serial: 1228079105
+# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19
+# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f
+# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD
+TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2
+MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF
+Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh
+IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6
+dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO
+V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC
+GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN
+v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB
+AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB
+Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO
+76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK
+OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH
+ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi
+yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL
+buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj
+2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE=
+-----END CERTIFICATE-----
+
+# Issuer: O=Japanese Government OU=ApplicationCA
+# Subject: O=Japanese Government OU=ApplicationCA
+# Label: "ApplicationCA - Japanese Government"
+# Serial: 49
+# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6
+# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74
+# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc
+MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp
+b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT
+AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs
+aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H
+j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K
+f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55
+IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw
+FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht
+QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm
+/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ
+k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ
+MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC
+seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ
+hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+
+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U
+DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj
+B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G3"
+# Serial: 28809105769928564313984085209975885599
+# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
+# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
+# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G2"
+# Serial: 71758320672825410020661621085256472406
+# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
+# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
+# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G3"
+# Serial: 127614157056681299805556476275995414779
+# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
+# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
+# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G2"
+# Serial: 80682863203381065782177908751794619243
+# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
+# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
+# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Universal Root Certification Authority"
+# Serial: 85209574734084581917763752644031726877
+# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
+# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
+# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
+# Serial: 63143484348153506665311985501458640051
+# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
+# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
+# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
+# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
+# Label: "NetLock Arany (Class Gold) Főtanúsítvány"
+# Serial: 80544274841616
+# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
+# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
+# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G2"
+# Serial: 10000012
+# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
+# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
+# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig O=Disig a.s.
+# Subject: CN=CA Disig O=Disig a.s.
+# Label: "CA Disig"
+# Serial: 1
+# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6
+# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41
+# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET
+MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE
+AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw
+CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg
+YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE
+Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX
+mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD
+XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW
+S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp
+FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD
+AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu
+ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z
+ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv
+Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw
+DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6
+yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq
+EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB
+EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN
+PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus
+# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus
+# Label: "Juur-SK"
+# Serial: 999181308
+# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55
+# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89
+# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN
+AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp
+dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw
+MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw
+CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ
+MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB
+SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz
+ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH
+LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP
+PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL
+2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w
+ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC
+MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk
+AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0
+AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz
+AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz
+AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f
+BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY
+P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi
+CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g
+kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95
+HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS
+na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q
+qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z
+TbvGRNs2yyqcjg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Label: "Hongkong Post Root CA 1"
+# Serial: 1000
+# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
+# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
+# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
+FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
+Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
+A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
+b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
+jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
+PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
+ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
+nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
+q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
+MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
+mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
+7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
+oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
+EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
+fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
+AmvZWg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Label: "SecureSign RootCA11"
+# Serial: 1
+# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
+# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
+# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
+MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
+A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
+MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
+Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
+QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
+i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
+h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
+MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
+UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
+8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
+h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
+VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
+KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
+X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
+QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
+pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
+QSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI
+# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI
+# Label: "ACEDICOM Root"
+# Serial: 7029493972724711941
+# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6
+# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84
+# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE
+AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x
+CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW
+MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF
+RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
+AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7
+09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7
+XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P
+Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK
+t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb
+X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28
+MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU
+fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI
+2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH
+K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae
+ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP
+BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ
+MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw
+RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm
+fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3
+gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe
+I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i
+5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi
+ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn
+MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ
+o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6
+zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN
+GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt
+r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK
+Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Label: "Microsec e-Szigno Root CA 2009"
+# Serial: 14014712776195784473
+# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
+# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
+# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
+ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
+CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
+OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
+FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
+Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
+kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
+cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
+fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
+N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
+xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
+Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
+SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
+mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
+ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
+2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
+HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Label: "GlobalSign Root CA - R3"
+# Serial: 4835703278459759426209954
+# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
+# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
+# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Serial: 6047274297262753887
+# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
+# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
+# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
+BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
+cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
+MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
+Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
+thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
+cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
+L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
+NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
+X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
+m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
+Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
+EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
+KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
+6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
+OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
+VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
+ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
+AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
+661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
+am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
+ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
+PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
+3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
+SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
+3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
+ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
+StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
+Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
+jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+# Issuer: CN=Izenpe.com O=IZENPE S.A.
+# Subject: CN=Izenpe.com O=IZENPE S.A.
+# Label: "Izenpe.com"
+# Serial: 917563065490389241595536686991402621
+# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
+# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
+# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
+MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
+ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
+VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
+b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
+scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
+xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
+LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
+uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
+yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
+rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
+BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
+hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
+QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
+HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
+Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
+QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
+BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
+A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
+laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
+awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
+JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
+LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
+VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
+LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
+UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
+QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
+QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Label: "Chambers of Commerce Root - 2008"
+# Serial: 11806822484801597146
+# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
+# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
+# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
+IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
+MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
+dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
+EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
+MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
+28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
+VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
+DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
+5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
+ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
+Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
+UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
+Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
+hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
+HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
+YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
+L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
+ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
+IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
+HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
+DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
+PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
+5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
+glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
+FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
+pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
+xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
+tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
+jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
+fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
+d0jQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Label: "Global Chambersign Root - 2008"
+# Serial: 14541511773111788494
+# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
+# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
+# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
+MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
+cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
+A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
+BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
+KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
+G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
+zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
+ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
+HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
+Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
+yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
+beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
+6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
+zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
+BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
+ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
+ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
+cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
+YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
+CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
+KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
+hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
+UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
+X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
+fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
+a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
+Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
+SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
+AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
+M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
+v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Label: "Go Daddy Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
+# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
+# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
+# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
+# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Services Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
+# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
+# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
+# Subject: CN=AffirmTrust Commercial O=AffirmTrust
+# Label: "AffirmTrust Commercial"
+# Serial: 8608355977964138876
+# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
+# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
+# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Networking O=AffirmTrust
+# Subject: CN=AffirmTrust Networking O=AffirmTrust
+# Label: "AffirmTrust Networking"
+# Serial: 8957382827206547757
+# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
+# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
+# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium O=AffirmTrust
+# Subject: CN=AffirmTrust Premium O=AffirmTrust
+# Label: "AffirmTrust Premium"
+# Serial: 7893706540734352110
+# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
+# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
+# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Label: "AffirmTrust Premium ECC"
+# Serial: 8401224907861490260
+# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
+# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
+# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA"
+# Serial: 279744
+# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
+# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
+# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903
+# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903
+# Label: "Certinomis - Autorité Racine"
+# Serial: 1
+# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a
+# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3
+# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk
+BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4
+Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl
+cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0
+aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY
+F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N
+8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe
+rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K
+/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu
+7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC
+28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6
+lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E
+nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB
+0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09
+5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj
+WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN
+jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s
+ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM
+OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q
+619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn
+2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj
+o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v
+nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG
+5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq
+pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb
+dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0
+BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA
+# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA
+# Label: "Root CA Generalitat Valenciana"
+# Serial: 994436456
+# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2
+# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46
+# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF
+UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ
+R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN
+MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw
+JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+
+WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj
+SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl
+u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy
+A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk
+Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7
+MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr
+aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC
+IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A
+cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA
+YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA
+bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA
+bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA
+aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA
+ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA
+YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA
+ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA
+LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6
+Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y
+eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw
+CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G
+A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu
+Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn
+lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt
+b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg
+9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF
+ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC
+IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03
+# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03
+# Label: "A-Trust-nQual-03"
+# Serial: 93214
+# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53
+# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2
+# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb
+-----BEGIN CERTIFICATE-----
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
+VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
+bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
+dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw
+MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
+dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
+ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM
+EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj
+lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ
+znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH
+2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1
+k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs
+2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD
+VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG
+KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+
+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R
+FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE
+DNuxUCAKGkq6ahq97BvIxYSazQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Root Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
+# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
+# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Label: "Security Communication RootCA2"
+# Serial: 0
+# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
+# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
+# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2011"
+# Serial: 0
+# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
+# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
+# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
+RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
+YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
+NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
+EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
+cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
+dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
+fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
+bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
+75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
+FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
+HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
+5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
+b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
+A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
+6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
+dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
+Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
+l7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Label: "Actalis Authentication Root CA"
+# Serial: 6271844772424770508
+# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
+# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
+# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
+BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
+MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
+SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
+ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
+UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
+4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
+KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
+gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
+rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
+51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
+be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
+KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
+v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
+fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
+jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
+ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
+e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
+jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
+WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
+SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
+pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
+X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
+fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
+K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
+ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
+LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
+LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
+# Subject: O=Trustis Limited OU=Trustis FPS Root CA
+# Label: "Trustis FPS Root CA"
+# Serial: 36053640375399034304724988975563710553
+# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
+# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
+# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Label: "StartCom Certification Authority"
+# Serial: 45
+# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16
+# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0
+# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
+F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
+ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
+ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
+aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
+YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
+c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
+d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
+CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
+wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
+Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
+0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
+pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
+CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
+P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
+1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
+KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
+8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
+fyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.
+# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.
+# Label: "StartCom Certification Authority G2"
+# Serial: 59
+# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64
+# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17
+# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
+OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
+A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
+JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
+vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
+D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
+Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
+RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
+HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
+nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
+0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
+UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
+Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
+TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
+BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
+UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
+6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
+9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
+HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
+wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
+XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
+IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
+hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
+so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 2 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
+# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
+# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
+6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
+L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
+1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
+MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
+QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
+arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
+Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
+FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
+P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
+9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
+uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
+9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
+OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
+KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
+DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
+H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
+I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
+5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
+3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
+Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 3 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
+# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
+# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
+ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
+N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
+tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
+0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
+/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
+KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
+zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
+O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
+34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
+K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
+Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
+QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
+IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
+HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
+O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
+033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
+dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
+kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
+3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
+u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
+4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 3"
+# Serial: 1
+# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
+# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
+# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
+8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
+RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
+hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
+ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
+EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
+A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
+WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
+1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
+6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
+91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
+TpPDpFQUWw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Label: "EE Certification Centre Root CA"
+# Serial: 112324828676200291871926431888494945866
+# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
+# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
+# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
+CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
+MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
+ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
+b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
+euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
+bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
+WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
+MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
+1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
+zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
+BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
+v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
+E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
+iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
+GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007
+# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007
+# Label: "TURKTRUST Certificate Services Provider Root 2007"
+# Serial: 1
+# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72
+# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33
+# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS
+S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
+SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx
+OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry
+b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC
+VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE
+sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F
+ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY
+KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG
++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG
+HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P
+IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M
+733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk
+Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW
+AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5
+mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa
+XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ
+qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 2009"
+# Serial: 623603
+# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
+# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
+# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
+ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
+HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
+UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
+tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
+ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
+lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
+/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
+A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
+MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
+cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
+L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
+acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
+zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
+PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
+Johw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
+# Serial: 623604
+# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
+# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
+# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
+NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
+BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
+ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
+3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
+qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
+p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
+HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
+ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
+HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
+Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
+c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
+RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
+dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
+Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
+3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
+CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
+xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
+KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica
+# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT
+# Label: "PSCProcert"
+# Serial: 11
+# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec
+# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74
+# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1
+dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s
+YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz
+dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0
+aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh
+IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ
+KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw
+MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy
+b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx
+KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG
+A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u
+aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9
+7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74
+BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G
+ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9
+JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0
+PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2
+0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/
+6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m
+v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7
+K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev
+bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw
+MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w
+MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD
+gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0
+b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh
+bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0
+cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp
+ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg
+ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq
+hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD
+AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w
+MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag
+RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t
+UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl
+cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG
+AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN
+AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS
+1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB
+3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv
+Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh
+HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm
+pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz
+sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE
+qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb
+mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9
+opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H
+YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center
+# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center
+# Label: "China Internet Network Information Center EV Certificates Root"
+# Serial: 1218379777
+# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15
+# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e
+# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
+Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g
+Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0
+aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa
+Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg
+SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo
+aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp
+ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z
+7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//
+DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx
+zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8
+hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs
+4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u
+gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY
+NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
+FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3
+j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG
+52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB
+echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI
+zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy
+wy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services
+# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services
+# Label: "Swisscom Root CA 2"
+# Serial: 40698052477090394928831521023204026294
+# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19
+# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec
+# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk
+MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
+YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
+Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT
+AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
+Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr
+jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r
+0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f
+2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP
+ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF
+y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA
+tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL
+6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0
+uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL
+acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh
+k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q
+VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
+FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh
+b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R
+fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv
+/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI
+REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx
+srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv
+aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT
+woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n
+Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W
+t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N
+8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2
+9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5
+wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services
+# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services
+# Label: "Swisscom Root EV CA 2"
+# Serial: 322973295377129385374608406479535262296
+# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec
+# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b
+# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw
+ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp
+dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290
+IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD
+VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy
+dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg
+MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx
+UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD
+1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH
+oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR
+HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/
+5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv
+idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL
+OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC
+NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f
+46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB
+UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth
+7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G
+A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB
+bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x
+XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T
+PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0
+Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70
+WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL
+Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm
+7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S
+nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN
+vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB
+WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI
+fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb
+I+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R1 O=Disig a.s.
+# Subject: CN=CA Disig Root R1 O=Disig a.s.
+# Label: "CA Disig Root R1"
+# Serial: 14052245610670616104
+# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a
+# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6
+# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy
+MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk
+D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o
+OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A
+fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe
+IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n
+oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK
+/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj
+rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD
+3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE
+7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC
+yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd
+qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI
+hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA
+SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo
+HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB
+emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC
+AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb
+7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x
+DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk
+F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF
+a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT
+Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R2 O=Disig a.s.
+# Subject: CN=CA Disig Root R2 O=Disig a.s.
+# Label: "CA Disig Root R2"
+# Serial: 10572350602393338211
+# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
+# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
+# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
+MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
+NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
+PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
+x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
+QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
+yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
+QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
+H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
+QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
+i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
+nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
+rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
+hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
+GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
+lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
+TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
+nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
+gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
+G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
+zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
+L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Label: "ACCVRAIZ1"
+# Serial: 6828503384748696800
+# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
+# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
+# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
+AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
+CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
+BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
+VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
+qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
+HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
+G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
+lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
+IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
+0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
+k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
+4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
+m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
+cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
+uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
+KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
+ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
+AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
+VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
+CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
+cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
+QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
+7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
+cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
+QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
+czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
+aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
+aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
+DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
+BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
+D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
+JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
+AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
+vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
+tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
+7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
+h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
+d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
+pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Global Root CA"
+# Serial: 3262
+# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
+# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
+# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
+EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
+VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
+NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
+B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
+10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
+0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
+MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
+zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
+46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
+yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
+laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
+oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
+BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
+qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
+4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
+1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
+H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
+RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
+15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
+6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
+nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
+wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
+aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
+KwbQBM0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Label: "TeliaSonera Root CA v1"
+# Serial: 199041966741090107964904287217786801558
+# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
+# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
+# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
+NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
+b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
+VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
+VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
+7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
+Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
+/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
+81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
+dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
+Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
+sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
+pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
+slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
+arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
+VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
+9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
+dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
+TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
+Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
+Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
+OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
+vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
+t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
+HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
+SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi
+# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi
+# Label: "E-Tugra Certification Authority"
+# Serial: 7667447206703254355
+# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49
+# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39
+# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
+BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
+aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
+BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
+Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
+MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
+em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
+B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
+D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
+Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
+q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
+k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
+fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
+dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
+ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
+zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
+U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
+Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
+XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
+Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
+HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
+GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
+77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
+vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
+FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
+yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
+AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
+y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
+NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 2"
+# Serial: 1
+# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
+# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
+# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
+AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
+FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
+1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
+jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
+wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
+WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
+NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
+uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
+IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
+g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
+BSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Atos TrustedRoot 2011 O=Atos
+# Subject: CN=Atos TrustedRoot 2011 O=Atos
+# Label: "Atos TrustedRoot 2011"
+# Serial: 6643877497813316402
+# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
+# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
+# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
+AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
+EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
+FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
+REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
+Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
+VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
+4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
+cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
+eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
+A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
+DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
+vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
+DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
+maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
+lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
+KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 1 G3"
+# Serial: 687049649626669250736271037606554624078720034195
+# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
+# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
+# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
+MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
+wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
+rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
+68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
+4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
+UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
+abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
+3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
+KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
+hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
+Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
+zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
+ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
+cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
+qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
+YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
+b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
+8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
+NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
+ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
+q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
+nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2 G3"
+# Serial: 390156079458959257446133169266079962026824725800
+# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
+# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
+# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
+MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
+qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
+n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
+c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
+o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
+IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
+IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
+8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
+vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
+7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
+cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
+ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
+roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
+W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
+lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
+csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
+dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
+KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
+HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
+WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3 G3"
+# Serial: 268090761170461462463995952157327242137089239581
+# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
+# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
+# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
+MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
+/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
+FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
+U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
+ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
+FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
+A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
+eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
+sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
+VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
+A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
+ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
+FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
+oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
+u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
+0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
+3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
+8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
+DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
+PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
+ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G2"
+# Serial: 15385348160840213938643033620894905419
+# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
+# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
+# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
+n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
+biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
+EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
+bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
+YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
+BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
+QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
+0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
+lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
+B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
+ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G3"
+# Serial: 15459312981008553731928384953135426796
+# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
+# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
+# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
+RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
+Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
+RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
+AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
+JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
+6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G2"
+# Serial: 4293743540046975378534879503202253541
+# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
+# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
+# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G3"
+# Serial: 7089244469030293291760083333884364146
+# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
+# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
+# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
+Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
+EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
+IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
+K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
+fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
+Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
+BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
+AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
+oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
+sycX
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Trusted Root G4"
+# Serial: 7451500558977370777930084869016614236
+# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
+# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
+# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
+RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
+ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
+xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
+ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
+DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
+jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
+CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
+EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
+fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
+uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
+chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
+9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
+SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
+fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
+sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
+cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
+0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
+4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
+r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
+/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
+gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited
+# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited
+# Label: "WoSign"
+# Serial: 125491772294754854453622855443212256657
+# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d
+# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb
+# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08
+-----BEGIN CERTIFICATE-----
+MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV
+BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw
+MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX
+b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN
+rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U
+fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc
+f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2
+ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M
+x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR
+aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch
+zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar
+uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K
+mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA
+Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv
+HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H
+EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
+LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ
+MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e
+JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN
+g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp
+dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab
+R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ
+PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce
+xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+
+J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl
+OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT
+ee5Ehr7XHuQe+w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA 沃通根证书 O=WoSign CA Limited
+# Subject: CN=CA 沃通根证书 O=WoSign CA Limited
+# Label: "WoSign China"
+# Serial: 106921963437422998931660691310149453965
+# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93
+# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6
+# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54
+-----BEGIN CERTIFICATE-----
+MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV
+BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw
+MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl
+ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r
+D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1
+9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf
+v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk
+UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L
+NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb
++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V
+qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K
+yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G
+AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK
+J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC
+AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4
+WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
+yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj
+/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6
+jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2
+ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX
+X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n
+FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D
+u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l
+O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le
+ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1
+2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Label: "COMODO RSA Certification Authority"
+# Serial: 101909084537582093308941363524873193117
+# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
+# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
+# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
+6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
+pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
+9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
+/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
+Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
+qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
+SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
+u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
+Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
+crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
+/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
+wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
+4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
+2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
+FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
+CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
+boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
+jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
+S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
+QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
+0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
+NVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Label: "USERTrust RSA Certification Authority"
+# Serial: 2645093764781058787591871645665788717
+# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
+# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
+# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Label: "USERTrust ECC Certification Authority"
+# Serial: 123013823720199481456569720443997572134
+# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
+# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
+# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
+eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
+JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
+Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
+VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
+I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
+o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
+A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
+zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
+RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Label: "GlobalSign ECC Root CA - R4"
+# Serial: 14367148294922964480859022125800977897474
+# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
+# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
+# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
+FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
+uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
+kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
+ewv4n4Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Label: "GlobalSign ECC Root CA - R5"
+# Serial: 32785792099990507226680698011560947931244
+# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
+# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
+# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
+8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
+hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
+KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
+515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
+xwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G3"
+# Serial: 10003001
+# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37
+# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc
+# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
+DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
+cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
+IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
+xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
+KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
+9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
+5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
+6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
+Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
+bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
+BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
+XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
+INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
+LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
+Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
+gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
+/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
+0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
+fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
+4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
+1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
+QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
+94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Label: "Staat der Nederlanden EV Root CA"
+# Serial: 10000013
+# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
+# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
+# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
+MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
+TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
+b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
+M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
+UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
+Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
+rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
+pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
+j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
+KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
+/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
+cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
+1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
+px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
+MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
+2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
+v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
+wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
+CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
+vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
+Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
+Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
+eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
+FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
+7uzXLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Label: "IdenTrust Commercial Root CA 1"
+# Serial: 13298821034946342390520003877796839426
+# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
+# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
+# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
+VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
+MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
+JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
+3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
+S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
+bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
+T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
+vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
+Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
+dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
+c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
+l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
+iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
+ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
+LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
+nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
+W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
+AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
+l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
+4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
+mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
+7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Label: "IdenTrust Public Sector Root CA 1"
+# Serial: 13298821034946342390521976156843933698
+# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
+# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
+# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
+VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
+MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
+MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
+ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
+RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
+bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
+/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
+3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
+EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
+9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
+GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
+2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
+WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
+W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
+AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
+DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
+TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
+lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
+mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
+WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
+tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
+GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
+8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - G2"
+# Serial: 1246989352
+# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
+# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
+# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
+cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
+IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
+dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
+NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
+dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
+dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
+aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
+RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
+cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
+wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
+U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
+jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
+BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
+jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
+1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
+nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
+VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - EC1"
+# Serial: 51543124481930649114116133369
+# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
+# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
+# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
+d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
+dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
+RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
+MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
+VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
+L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
+Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
+A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
+ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
+Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
+R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
+hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Label: "CFCA EV ROOT"
+# Serial: 407555286
+# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
+# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
+# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
+TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
+MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
+T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
+sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
+TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
+/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
+7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
+EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
+hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
+a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
+aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
+TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
+PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
+cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
+tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
+ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
+jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
+ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
+P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
+xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
+Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
+5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
+/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
+AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
+5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
+# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
+# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5"
+# Serial: 156233699172481
+# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e
+# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb
+# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE
+BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn
+aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg
+QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0
+MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD
+VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
+dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom
+/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR
+Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3
+4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z
+5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0
+hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID
+AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX
+SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l
+VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf
+peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF
+Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW
++qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
+# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
+# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6"
+# Serial: 138134509972618
+# MD5 Fingerprint: f8:c5:ee:2a:6b:be:95:8d:08:f7:25:4a:ea:71:3e:46
+# SHA1 Fingerprint: 8a:5c:8c:ee:a5:03:e6:05:56:ba:d8:1b:d4:f6:c9:b0:ed:e5:2f:e0
+# SHA256 Fingerprint: 8d:e7:86:55:e1:be:7f:78:47:80:0b:93:f6:94:d2:1d:36:8c:c0:6e:03:3e:7f:ab:04:bb:5e:b9:9d:a6:b7:00
+-----BEGIN CERTIFICATE-----
+MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQG
+EwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdp
+IMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBB
+LsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBI
+aXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5MDQxMFoXDTIzMTIx
+NjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBLBgNV
+BAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2
+ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVs
+ZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdsGjW6L0UlqMACprx9MfMkU1x
+eHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a2uqsxgbPJQ1BgfbBOCK9
++bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EEDwnS3/faA
+z1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0p
+u5FbHH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6p
+lVxiSvgNZ1GpryHV+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMB
+AAGjQjBAMB0GA1UdDgQWBBTdVRcT9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAb1gNl0Oq
+FlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3RfdCaqaXKGDsC
+QC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
+o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKID
+gI6tflEATseWhvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm
+9ocJV612ph1jmv3XZch4gyt1O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsG
+tAuYSyher4hYyw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Label: "Certinomis - Root CA"
+# Serial: 1
+# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f
+# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8
+# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb
+BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz
+MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx
+FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g
+Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2
+fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl
+LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV
+WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF
+TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb
+5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc
+CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri
+wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ
+wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG
+m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4
+F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng
+WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0
+2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/
+0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw
+F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS
+g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj
+qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN
+h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/
+ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V
+btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj
+Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ
+8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW
+gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE=
+-----END CERTIFICATE-----
+# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Secure Server CA"
+# Serial: 927650371
+# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee
+# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39
+# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
+# Label: "ValiCert Class 2 VA"
+# Serial: 1
+# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87
+# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6
+# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
+NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
+dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
+WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
+v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
+UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
+IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
+W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Label: "NetLock Express (Class C) Root"
+# Serial: 104
+# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4
+# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b
+# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD
+EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X
+DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw
+DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u
+c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr
+TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA
+OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC
+2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW
+RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P
+AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW
+ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0
+YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
+b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO
+ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB
+IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs
+b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s
+YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg
+a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g
+SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0
+aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg
+YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg
+Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY
+ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g
+pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4
+Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Label: "NetLock Business (Class B) Root"
+# Serial: 105
+# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6
+# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af
+# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD
+EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05
+OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G
+A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
+Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l
+dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG
+SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK
+gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX
+iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc
+Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E
+BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G
+SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu
+b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
+bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
+Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln
+aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0
+IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph
+biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo
+ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP
+UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj
+YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA
+bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06
+sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa
+n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS
+NitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
+# Label: "RSA Root Certificate 1"
+# Serial: 1
+# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72
+# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb
+# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
+NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
+cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
+2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
+JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
+Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
+n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
+PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
+# Label: "ValiCert Class 1 VA"
+# Serial: 1
+# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb
+# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e
+# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
+NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
+LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
+TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
+LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
+I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
+nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
+-----END CERTIFICATE-----
+
+# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
+# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
+# Label: "Equifax Secure eBusiness CA 1"
+# Serial: 4
+# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d
+# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41
+# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
+ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
+MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
+LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
+KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
+RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
+WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
+Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
+AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
+eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
+zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
+/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
+# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
+# Label: "Equifax Secure Global eBusiness CA"
+# Serial: 1
+# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc
+# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45
+# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
+ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
+MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
+dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
+c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
+UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
+58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
+o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
+aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
+A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
+Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
+8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Label: "Thawte Premium Server CA"
+# Serial: 1
+# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a
+# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a
+# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
+dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
+MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
+MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
+A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
+b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
+cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
+bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
+VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
+ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
+uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
+hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
+pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Label: "Thawte Server CA"
+# Serial: 1
+# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d
+# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c
+# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
+MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
+MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
+dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
+cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
+DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
+yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
+L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
+EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
+7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
+QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
+qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Label: "Verisign Class 3 Public Primary Certification Authority"
+# Serial: 149843929435818692848040365716851702463
+# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67
+# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2
+# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
+lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
+AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Label: "Verisign Class 3 Public Primary Certification Authority"
+# Serial: 80507572722862485515306429940691309246
+# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4
+# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b
+# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
+2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
+2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
+# Label: "Verisign Class 3 Public Primary Certification Authority - G2"
+# Serial: 167285380242319648451154478808036881606
+# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9
+# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f
+# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
+pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
+13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
+U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
+F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
+oJ2daZH9
+-----END CERTIFICATE-----
+
+# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
+# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
+# Label: "GTE CyberTrust Global Root"
+# Serial: 421
+# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db
+# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74
+# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
+VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
+bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
+b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
+iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
+r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
+04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
+GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
+3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
+lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/cookies.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/cookies.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/cookies.py	(revision 1126)
@@ -0,0 +1,487 @@
+# -*- coding: utf-8 -*-
+
+"""
+Compatibility code to be able to use `cookielib.CookieJar` with requests.
+
+requests.utils imports from here, so be careful with imports.
+"""
+
+import copy
+import time
+import calendar
+import collections
+from .compat import cookielib, urlparse, urlunparse, Morsel
+
+try:
+    import threading
+    # grr, pyflakes: this fixes "redefinition of unused 'threading'"
+    threading
+except ImportError:
+    import dummy_threading as threading
+
+
+class MockRequest(object):
+    """Wraps a `requests.Request` to mimic a `urllib2.Request`.
+
+    The code in `cookielib.CookieJar` expects this interface in order to correctly
+    manage cookie policies, i.e., determine whether a cookie can be set, given the
+    domains of the request and the cookie.
+
+    The original request object is read-only. The client is responsible for collecting
+    the new headers via `get_new_headers()` and interpreting them appropriately. You
+    probably want `get_cookie_header`, defined below.
+    """
+
+    def __init__(self, request):
+        self._r = request
+        self._new_headers = {}
+        self.type = urlparse(self._r.url).scheme
+
+    def get_type(self):
+        return self.type
+
+    def get_host(self):
+        return urlparse(self._r.url).netloc
+
+    def get_origin_req_host(self):
+        return self.get_host()
+
+    def get_full_url(self):
+        # Only return the response's URL if the user hadn't set the Host
+        # header
+        if not self._r.headers.get('Host'):
+            return self._r.url
+        # If they did set it, retrieve it and reconstruct the expected domain
+        host = self._r.headers['Host']
+        parsed = urlparse(self._r.url)
+        # Reconstruct the URL as we expect it
+        return urlunparse([
+            parsed.scheme, host, parsed.path, parsed.params, parsed.query,
+            parsed.fragment
+        ])
+
+    def is_unverifiable(self):
+        return True
+
+    def has_header(self, name):
+        return name in self._r.headers or name in self._new_headers
+
+    def get_header(self, name, default=None):
+        return self._r.headers.get(name, self._new_headers.get(name, default))
+
+    def add_header(self, key, val):
+        """cookielib has no legitimate use for this method; add it back if you find one."""
+        raise NotImplementedError("Cookie headers should be added with add_unredirected_header()")
+
+    def add_unredirected_header(self, name, value):
+        self._new_headers[name] = value
+
+    def get_new_headers(self):
+        return self._new_headers
+
+    @property
+    def unverifiable(self):
+        return self.is_unverifiable()
+
+    @property
+    def origin_req_host(self):
+        return self.get_origin_req_host()
+
+    @property
+    def host(self):
+        return self.get_host()
+
+
+class MockResponse(object):
+    """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.
+
+    ...what? Basically, expose the parsed HTTP headers from the server response
+    the way `cookielib` expects to see them.
+    """
+
+    def __init__(self, headers):
+        """Make a MockResponse for `cookielib` to read.
+
+        :param headers: a httplib.HTTPMessage or analogous carrying the headers
+        """
+        self._headers = headers
+
+    def info(self):
+        return self._headers
+
+    def getheaders(self, name):
+        self._headers.getheaders(name)
+
+
+def extract_cookies_to_jar(jar, request, response):
+    """Extract the cookies from the response into a CookieJar.
+
+    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
+    :param request: our own requests.Request object
+    :param response: urllib3.HTTPResponse object
+    """
+    if not (hasattr(response, '_original_response') and
+            response._original_response):
+        return
+    # the _original_response field is the wrapped httplib.HTTPResponse object,
+    req = MockRequest(request)
+    # pull out the HTTPMessage with the headers and put it in the mock:
+    res = MockResponse(response._original_response.msg)
+    jar.extract_cookies(res, req)
+
+
+def get_cookie_header(jar, request):
+    """Produce an appropriate Cookie header string to be sent with `request`, or None."""
+    r = MockRequest(request)
+    jar.add_cookie_header(r)
+    return r.get_new_headers().get('Cookie')
+
+
+def remove_cookie_by_name(cookiejar, name, domain=None, path=None):
+    """Unsets a cookie by name, by default over all domains and paths.
+
+    Wraps CookieJar.clear(), is O(n).
+    """
+    clearables = []
+    for cookie in cookiejar:
+        if cookie.name != name:
+            continue
+        if domain is not None and domain != cookie.domain:
+            continue
+        if path is not None and path != cookie.path:
+            continue
+        clearables.append((cookie.domain, cookie.path, cookie.name))
+
+    for domain, path, name in clearables:
+        cookiejar.clear(domain, path, name)
+
+
+class CookieConflictError(RuntimeError):
+    """There are two cookies that meet the criteria specified in the cookie jar.
+    Use .get and .set and include domain and path args in order to be more specific."""
+
+
+class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):
+    """Compatibility class; is a cookielib.CookieJar, but exposes a dict
+    interface.
+
+    This is the CookieJar we create by default for requests and sessions that
+    don't specify one, since some clients may expect response.cookies and
+    session.cookies to support dict operations.
+
+    Requests does not use the dict interface internally; it's just for
+    compatibility with external client code. All requests code should work
+    out of the box with externally provided instances of ``CookieJar``, e.g.
+    ``LWPCookieJar`` and ``FileCookieJar``.
+
+    Unlike a regular CookieJar, this class is pickleable.
+
+    .. warning:: dictionary operations that are normally O(1) may be O(n).
+    """
+    def get(self, name, default=None, domain=None, path=None):
+        """Dict-like get() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains.
+
+        .. warning:: operation is O(n), not O(1)."""
+        try:
+            return self._find_no_duplicates(name, domain, path)
+        except KeyError:
+            return default
+
+    def set(self, name, value, **kwargs):
+        """Dict-like set() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains."""
+        # support client code that unsets cookies by assignment of a None value:
+        if value is None:
+            remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path'))
+            return
+
+        if isinstance(value, Morsel):
+            c = morsel_to_cookie(value)
+        else:
+            c = create_cookie(name, value, **kwargs)
+        self.set_cookie(c)
+        return c
+
+    def iterkeys(self):
+        """Dict-like iterkeys() that returns an iterator of names of cookies
+        from the jar. See itervalues() and iteritems()."""
+        for cookie in iter(self):
+            yield cookie.name
+
+    def keys(self):
+        """Dict-like keys() that returns a list of names of cookies from the
+        jar. See values() and items()."""
+        return list(self.iterkeys())
+
+    def itervalues(self):
+        """Dict-like itervalues() that returns an iterator of values of cookies
+        from the jar. See iterkeys() and iteritems()."""
+        for cookie in iter(self):
+            yield cookie.value
+
+    def values(self):
+        """Dict-like values() that returns a list of values of cookies from the
+        jar. See keys() and items()."""
+        return list(self.itervalues())
+
+    def iteritems(self):
+        """Dict-like iteritems() that returns an iterator of name-value tuples
+        from the jar. See iterkeys() and itervalues()."""
+        for cookie in iter(self):
+            yield cookie.name, cookie.value
+
+    def items(self):
+        """Dict-like items() that returns a list of name-value tuples from the
+        jar. See keys() and values(). Allows client-code to call
+        ``dict(RequestsCookieJar)`` and get a vanilla python dict of key value
+        pairs."""
+        return list(self.iteritems())
+
+    def list_domains(self):
+        """Utility method to list all the domains in the jar."""
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain not in domains:
+                domains.append(cookie.domain)
+        return domains
+
+    def list_paths(self):
+        """Utility method to list all the paths in the jar."""
+        paths = []
+        for cookie in iter(self):
+            if cookie.path not in paths:
+                paths.append(cookie.path)
+        return paths
+
+    def multiple_domains(self):
+        """Returns True if there are multiple domains in the jar.
+        Returns False otherwise."""
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain is not None and cookie.domain in domains:
+                return True
+            domains.append(cookie.domain)
+        return False  # there is only one domain in jar
+
+    def get_dict(self, domain=None, path=None):
+        """Takes as an argument an optional domain and path and returns a plain
+        old Python dict of name-value pairs of cookies that meet the
+        requirements."""
+        dictionary = {}
+        for cookie in iter(self):
+            if (domain is None or cookie.domain == domain) and (path is None
+                                                or cookie.path == path):
+                dictionary[cookie.name] = cookie.value
+        return dictionary
+
+    def __getitem__(self, name):
+        """Dict-like __getitem__() for compatibility with client code. Throws
+        exception if there are more than one cookie with name. In that case,
+        use the more explicit get() method instead.
+
+        .. warning:: operation is O(n), not O(1)."""
+
+        return self._find_no_duplicates(name)
+
+    def __setitem__(self, name, value):
+        """Dict-like __setitem__ for compatibility with client code. Throws
+        exception if there is already a cookie of that name in the jar. In that
+        case, use the more explicit set() method instead."""
+
+        self.set(name, value)
+
+    def __delitem__(self, name):
+        """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s
+        ``remove_cookie_by_name()``."""
+        remove_cookie_by_name(self, name)
+
+    def set_cookie(self, cookie, *args, **kwargs):
+        if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'):
+            cookie.value = cookie.value.replace('\\"', '')
+        return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs)
+
+    def update(self, other):
+        """Updates this jar with cookies from another CookieJar or dict-like"""
+        if isinstance(other, cookielib.CookieJar):
+            for cookie in other:
+                self.set_cookie(copy.copy(cookie))
+        else:
+            super(RequestsCookieJar, self).update(other)
+
+    def _find(self, name, domain=None, path=None):
+        """Requests uses this method internally to get cookie values. Takes as
+        args name and optional domain and path. Returns a cookie.value. If
+        there are conflicting cookies, _find arbitrarily chooses one. See
+        _find_no_duplicates if you want an exception thrown if there are
+        conflicting cookies."""
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        return cookie.value
+
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def _find_no_duplicates(self, name, domain=None, path=None):
+        """Both ``__get_item__`` and ``get`` call this function: it's never
+        used elsewhere in Requests. Takes as args name and optional domain and
+        path. Returns a cookie.value. Throws KeyError if cookie is not found
+        and CookieConflictError if there are multiple cookies that match name
+        and optionally domain and path."""
+        toReturn = None
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        if toReturn is not None:  # if there are multiple cookies that meet passed in criteria
+                            raise CookieConflictError('There are multiple cookies with name, %r' % (name))
+                        toReturn = cookie.value  # we will eventually return this as long as no cookie conflict
+
+        if toReturn:
+            return toReturn
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def __getstate__(self):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        state = self.__dict__.copy()
+        # remove the unpickleable RLock object
+        state.pop('_cookies_lock')
+        return state
+
+    def __setstate__(self, state):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        self.__dict__.update(state)
+        if '_cookies_lock' not in self.__dict__:
+            self._cookies_lock = threading.RLock()
+
+    def copy(self):
+        """Return a copy of this RequestsCookieJar."""
+        new_cj = RequestsCookieJar()
+        new_cj.update(self)
+        return new_cj
+
+
+def _copy_cookie_jar(jar):
+    if jar is None:
+        return None
+
+    if hasattr(jar, 'copy'):
+        # We're dealing with an instance of RequestsCookieJar
+        return jar.copy()
+    # We're dealing with a generic CookieJar instance
+    new_jar = copy.copy(jar)
+    new_jar.clear()
+    for cookie in jar:
+        new_jar.set_cookie(copy.copy(cookie))
+    return new_jar
+
+
+def create_cookie(name, value, **kwargs):
+    """Make a cookie from underspecified parameters.
+
+    By default, the pair of `name` and `value` will be set for the domain ''
+    and sent on every request (this is sometimes called a "supercookie").
+    """
+    result = dict(
+        version=0,
+        name=name,
+        value=value,
+        port=None,
+        domain='',
+        path='/',
+        secure=False,
+        expires=None,
+        discard=True,
+        comment=None,
+        comment_url=None,
+        rest={'HttpOnly': None},
+        rfc2109=False,)
+
+    badargs = set(kwargs) - set(result)
+    if badargs:
+        err = 'create_cookie() got unexpected keyword arguments: %s'
+        raise TypeError(err % list(badargs))
+
+    result.update(kwargs)
+    result['port_specified'] = bool(result['port'])
+    result['domain_specified'] = bool(result['domain'])
+    result['domain_initial_dot'] = result['domain'].startswith('.')
+    result['path_specified'] = bool(result['path'])
+
+    return cookielib.Cookie(**result)
+
+
+def morsel_to_cookie(morsel):
+    """Convert a Morsel object into a Cookie containing the one k/v pair."""
+
+    expires = None
+    if morsel['max-age']:
+        try:
+            expires = int(time.time() + int(morsel['max-age']))
+        except ValueError:
+            raise TypeError('max-age: %s must be integer' % morsel['max-age'])
+    elif morsel['expires']:
+        time_template = '%a, %d-%b-%Y %H:%M:%S GMT'
+        expires = calendar.timegm(
+            time.strptime(morsel['expires'], time_template)
+        )
+    return create_cookie(
+        comment=morsel['comment'],
+        comment_url=bool(morsel['comment']),
+        discard=False,
+        domain=morsel['domain'],
+        expires=expires,
+        name=morsel.key,
+        path=morsel['path'],
+        port=None,
+        rest={'HttpOnly': morsel['httponly']},
+        rfc2109=False,
+        secure=bool(morsel['secure']),
+        value=morsel.value,
+        version=morsel['version'] or 0,
+    )
+
+
+def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    :param cookiejar: (optional) A cookiejar to add the cookies to.
+    :param overwrite: (optional) If False, will not replace cookies
+        already in the jar with new ones.
+    """
+    if cookiejar is None:
+        cookiejar = RequestsCookieJar()
+
+    if cookie_dict is not None:
+        names_from_jar = [cookie.name for cookie in cookiejar]
+        for name in cookie_dict:
+            if overwrite or (name not in names_from_jar):
+                cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))
+
+    return cookiejar
+
+
+def merge_cookies(cookiejar, cookies):
+    """Add cookies to cookiejar and returns a merged CookieJar.
+
+    :param cookiejar: CookieJar object to add the cookies to.
+    :param cookies: Dictionary or CookieJar object to be added.
+    """
+    if not isinstance(cookiejar, cookielib.CookieJar):
+        raise ValueError('You can only merge into CookieJar')
+
+    if isinstance(cookies, dict):
+        cookiejar = cookiejar_from_dict(
+            cookies, cookiejar=cookiejar, overwrite=False)
+    elif isinstance(cookies, cookielib.CookieJar):
+        try:
+            cookiejar.update(cookies)
+        except AttributeError:
+            for cookie_in_jar in cookies:
+                cookiejar.set_cookie(cookie_in_jar)
+
+    return cookiejar
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/__init__.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/__init__.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/__init__.py	(revision 1126)
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+
+#   __
+#  /__)  _  _     _   _ _/   _
+# / (   (- (/ (/ (- _)  /  _)
+#          /
+
+"""
+Requests HTTP library
+~~~~~~~~~~~~~~~~~~~~~
+
+Requests is an HTTP library, written in Python, for human beings. Basic GET
+usage:
+
+   >>> import requests
+   >>> r = requests.get('https://www.python.org')
+   >>> r.status_code
+   200
+   >>> 'Python is a programming language' in r.content
+   True
+
+... or POST:
+
+   >>> payload = dict(key1='value1', key2='value2')
+   >>> r = requests.post('http://httpbin.org/post', data=payload)
+   >>> print(r.text)
+   {
+     ...
+     "form": {
+       "key2": "value2",
+       "key1": "value1"
+     },
+     ...
+   }
+
+The other HTTP methods are supported - see `requests.api`. Full documentation
+is at <http://python-requests.org>.
+
+:copyright: (c) 2015 by Kenneth Reitz.
+:license: Apache 2.0, see LICENSE for more details.
+
+"""
+
+__title__ = 'requests'
+__version__ = '2.9.1'
+__build__ = 0x020901
+__author__ = 'Kenneth Reitz'
+__license__ = 'Apache 2.0'
+__copyright__ = 'Copyright 2015 Kenneth Reitz'
+
+# Attempt to enable urllib3's SNI support, if possible
+try:
+    from .packages.urllib3.contrib import pyopenssl
+    pyopenssl.inject_into_urllib3()
+except ImportError:
+    pass
+
+from . import utils
+from .models import Request, Response, PreparedRequest
+from .api import request, get, head, post, patch, put, delete, options
+from .sessions import session, Session
+from .status_codes import codes
+from .exceptions import (
+    RequestException, Timeout, URLRequired,
+    TooManyRedirects, HTTPError, ConnectionError,
+    FileModeWarning,
+)
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+try:  # Python 2.7+
+    from logging import NullHandler
+except ImportError:
+    class NullHandler(logging.Handler):
+        def emit(self, record):
+            pass
+
+logging.getLogger(__name__).addHandler(NullHandler())
+
+import warnings
+
+# FileModeWarnings go off per the default.
+warnings.simplefilter('default', FileModeWarning, append=True)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/status_codes.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/status_codes.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/status_codes.py	(revision 1126)
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+
+from .structures import LookupDict
+
+_codes = {
+
+    # Informational.
+    100: ('continue',),
+    101: ('switching_protocols',),
+    102: ('processing',),
+    103: ('checkpoint',),
+    122: ('uri_too_long', 'request_uri_too_long'),
+    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
+    201: ('created',),
+    202: ('accepted',),
+    203: ('non_authoritative_info', 'non_authoritative_information'),
+    204: ('no_content',),
+    205: ('reset_content', 'reset'),
+    206: ('partial_content', 'partial'),
+    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
+    208: ('already_reported',),
+    226: ('im_used',),
+
+    # Redirection.
+    300: ('multiple_choices',),
+    301: ('moved_permanently', 'moved', '\\o-'),
+    302: ('found',),
+    303: ('see_other', 'other'),
+    304: ('not_modified',),
+    305: ('use_proxy',),
+    306: ('switch_proxy',),
+    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
+    308: ('permanent_redirect',
+          'resume_incomplete', 'resume',), # These 2 to be removed in 3.0
+
+    # Client Error.
+    400: ('bad_request', 'bad'),
+    401: ('unauthorized',),
+    402: ('payment_required', 'payment'),
+    403: ('forbidden',),
+    404: ('not_found', '-o-'),
+    405: ('method_not_allowed', 'not_allowed'),
+    406: ('not_acceptable',),
+    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
+    408: ('request_timeout', 'timeout'),
+    409: ('conflict',),
+    410: ('gone',),
+    411: ('length_required',),
+    412: ('precondition_failed', 'precondition'),
+    413: ('request_entity_too_large',),
+    414: ('request_uri_too_large',),
+    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
+    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
+    417: ('expectation_failed',),
+    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
+    422: ('unprocessable_entity', 'unprocessable'),
+    423: ('locked',),
+    424: ('failed_dependency', 'dependency'),
+    425: ('unordered_collection', 'unordered'),
+    426: ('upgrade_required', 'upgrade'),
+    428: ('precondition_required', 'precondition'),
+    429: ('too_many_requests', 'too_many'),
+    431: ('header_fields_too_large', 'fields_too_large'),
+    444: ('no_response', 'none'),
+    449: ('retry_with', 'retry'),
+    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
+    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
+    499: ('client_closed_request',),
+
+    # Server Error.
+    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
+    501: ('not_implemented',),
+    502: ('bad_gateway',),
+    503: ('service_unavailable', 'unavailable'),
+    504: ('gateway_timeout',),
+    505: ('http_version_not_supported', 'http_version'),
+    506: ('variant_also_negotiates',),
+    507: ('insufficient_storage',),
+    509: ('bandwidth_limit_exceeded', 'bandwidth'),
+    510: ('not_extended',),
+    511: ('network_authentication_required', 'network_auth', 'network_authentication'),
+}
+
+codes = LookupDict(name='status_codes')
+
+for code, titles in _codes.items():
+    for title in titles:
+        setattr(codes, title, code)
+        if not title.startswith('\\'):
+            setattr(codes, title.upper(), code)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/utils.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/utils.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/utils.py	(revision 1126)
@@ -0,0 +1,721 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.utils
+~~~~~~~~~~~~~~
+
+This module provides utility functions that are used within Requests
+that are also useful for external consumption.
+
+"""
+
+import cgi
+import codecs
+import collections
+import io
+import os
+import platform
+import re
+import sys
+import socket
+import struct
+import warnings
+
+from . import __version__
+from . import certs
+from .compat import parse_http_list as _parse_list_header
+from .compat import (quote, urlparse, bytes, str, OrderedDict, unquote, is_py2,
+                     builtin_str, getproxies, proxy_bypass, urlunparse,
+                     basestring)
+from .cookies import RequestsCookieJar, cookiejar_from_dict
+from .structures import CaseInsensitiveDict
+from .exceptions import InvalidURL, FileModeWarning
+
+_hush_pyflakes = (RequestsCookieJar,)
+
+NETRC_FILES = ('.netrc', '_netrc')
+
+DEFAULT_CA_BUNDLE_PATH = certs.where()
+
+
+def dict_to_sequence(d):
+    """Returns an internal sequence dictionary update."""
+
+    if hasattr(d, 'items'):
+        d = d.items()
+
+    return d
+
+
+def super_len(o):
+    total_length = 0
+    current_position = 0
+
+    if hasattr(o, '__len__'):
+        total_length = len(o)
+
+    elif hasattr(o, 'len'):
+        total_length = o.len
+
+    elif hasattr(o, 'getvalue'):
+        # e.g. BytesIO, cStringIO.StringIO
+        total_length = len(o.getvalue())
+
+    elif hasattr(o, 'fileno'):
+        try:
+            fileno = o.fileno()
+        except io.UnsupportedOperation:
+            pass
+        else:
+            total_length = os.fstat(fileno).st_size
+
+            # Having used fstat to determine the file length, we need to
+            # confirm that this file was opened up in binary mode.
+            if 'b' not in o.mode:
+                warnings.warn((
+                    "Requests has determined the content-length for this "
+                    "request using the binary size of the file: however, the "
+                    "file has been opened in text mode (i.e. without the 'b' "
+                    "flag in the mode). This may lead to an incorrect "
+                    "content-length. In Requests 3.0, support will be removed "
+                    "for files in text mode."),
+                    FileModeWarning
+                )
+
+    if hasattr(o, 'tell'):
+        current_position = o.tell()
+
+    return max(0, total_length - current_position)
+
+
+def get_netrc_auth(url, raise_errors=False):
+    """Returns the Requests tuple auth for a given url from netrc."""
+
+    try:
+        from netrc import netrc, NetrcParseError
+
+        netrc_path = None
+
+        for f in NETRC_FILES:
+            try:
+                loc = os.path.expanduser('~/{0}'.format(f))
+            except KeyError:
+                # os.path.expanduser can fail when $HOME is undefined and
+                # getpwuid fails. See http://bugs.python.org/issue20164 &
+                # https://github.com/kennethreitz/requests/issues/1846
+                return
+
+            if os.path.exists(loc):
+                netrc_path = loc
+                break
+
+        # Abort early if there isn't one.
+        if netrc_path is None:
+            return
+
+        ri = urlparse(url)
+
+        # Strip port numbers from netloc. This weird `if...encode`` dance is
+        # used for Python 3.2, which doesn't support unicode literals.
+        splitstr = b':'
+        if isinstance(url, str):
+            splitstr = splitstr.decode('ascii')
+        host = ri.netloc.split(splitstr)[0]
+
+        try:
+            _netrc = netrc(netrc_path).authenticators(host)
+            if _netrc:
+                # Return with login / password
+                login_i = (0 if _netrc[0] else 1)
+                return (_netrc[login_i], _netrc[2])
+        except (NetrcParseError, IOError):
+            # If there was a parsing error or a permissions issue reading the file,
+            # we'll just skip netrc auth unless explicitly asked to raise errors.
+            if raise_errors:
+                raise
+
+    # AppEngine hackiness.
+    except (ImportError, AttributeError):
+        pass
+
+
+def guess_filename(obj):
+    """Tries to guess the filename of the given object."""
+    name = getattr(obj, 'name', None)
+    if (name and isinstance(name, basestring) and name[0] != '<' and
+            name[-1] != '>'):
+        return os.path.basename(name)
+
+
+def from_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. Unless it can not be represented as such, return an
+    OrderedDict, e.g.,
+
+    ::
+
+        >>> from_key_val_list([('key', 'val')])
+        OrderedDict([('key', 'val')])
+        >>> from_key_val_list('string')
+        ValueError: need more than 1 value to unpack
+        >>> from_key_val_list({'key': 'val'})
+        OrderedDict([('key', 'val')])
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    return OrderedDict(value)
+
+
+def to_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. If it can be, return a list of tuples, e.g.,
+
+    ::
+
+        >>> to_key_val_list([('key', 'val')])
+        [('key', 'val')]
+        >>> to_key_val_list({'key': 'val'})
+        [('key', 'val')]
+        >>> to_key_val_list('string')
+        ValueError: cannot encode objects that are not 2-tuples.
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    if isinstance(value, collections.Mapping):
+        value = value.items()
+
+    return list(value)
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_list_header(value):
+    """Parse lists as described by RFC 2068 Section 2.
+
+    In particular, parse comma-separated lists where the elements of
+    the list may include quoted-strings.  A quoted-string could
+    contain a comma.  A non-quoted string could have quotes in the
+    middle.  Quotes are removed automatically after parsing.
+
+    It basically works like :func:`parse_set_header` just that items
+    may appear multiple times and case sensitivity is preserved.
+
+    The return value is a standard :class:`list`:
+
+    >>> parse_list_header('token, "quoted value"')
+    ['token', 'quoted value']
+
+    To create a header from the :class:`list` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a list header.
+    :return: :class:`list`
+    """
+    result = []
+    for item in _parse_list_header(value):
+        if item[:1] == item[-1:] == '"':
+            item = unquote_header_value(item[1:-1])
+        result.append(item)
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_dict_header(value):
+    """Parse lists of key, value pairs as described by RFC 2068 Section 2 and
+    convert them into a python dict:
+
+    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
+    >>> type(d) is dict
+    True
+    >>> sorted(d.items())
+    [('bar', 'as well'), ('foo', 'is a fish')]
+
+    If there is no value for a key it will be `None`:
+
+    >>> parse_dict_header('key_without_value')
+    {'key_without_value': None}
+
+    To create a header from the :class:`dict` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a dict header.
+    :return: :class:`dict`
+    """
+    result = {}
+    for item in _parse_list_header(value):
+        if '=' not in item:
+            result[item] = None
+            continue
+        name, value = item.split('=', 1)
+        if value[:1] == value[-1:] == '"':
+            value = unquote_header_value(value[1:-1])
+        result[name] = value
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def unquote_header_value(value, is_filename=False):
+    r"""Unquotes a header value.  (Reversal of :func:`quote_header_value`).
+    This does not use the real unquoting but what browsers are actually
+    using for quoting.
+
+    :param value: the header value to unquote.
+    """
+    if value and value[0] == value[-1] == '"':
+        # this is not the real unquoting, but fixing this so that the
+        # RFC is met will result in bugs with internet explorer and
+        # probably some other browsers as well.  IE for example is
+        # uploading files with "C:\foo\bar.txt" as filename
+        value = value[1:-1]
+
+        # if this is a filename and the starting characters look like
+        # a UNC path, then just return the value without quotes.  Using the
+        # replace sequence below on a UNC path has the effect of turning
+        # the leading double slash into a single slash and then
+        # _fix_ie_filename() doesn't work correctly.  See #458.
+        if not is_filename or value[:2] != '\\\\':
+            return value.replace('\\\\', '\\').replace('\\"', '"')
+    return value
+
+
+def dict_from_cookiejar(cj):
+    """Returns a key/value dictionary from a CookieJar.
+
+    :param cj: CookieJar object to extract cookies from.
+    """
+
+    cookie_dict = {}
+
+    for cookie in cj:
+        cookie_dict[cookie.name] = cookie.value
+
+    return cookie_dict
+
+
+def add_dict_to_cookiejar(cj, cookie_dict):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cj: CookieJar to insert cookies into.
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    """
+
+    cj2 = cookiejar_from_dict(cookie_dict)
+    cj.update(cj2)
+    return cj
+
+
+def get_encodings_from_content(content):
+    """Returns encodings from given content string.
+
+    :param content: bytestring to extract encodings from.
+    """
+    warnings.warn((
+        'In requests 3.0, get_encodings_from_content will be removed. For '
+        'more information, please see the discussion on issue #2266. (This'
+        ' warning should only appear once.)'),
+        DeprecationWarning)
+
+    charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I)
+    pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I)
+    xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]')
+
+    return (charset_re.findall(content) +
+            pragma_re.findall(content) +
+            xml_re.findall(content))
+
+
+def get_encoding_from_headers(headers):
+    """Returns encodings from given HTTP Header Dict.
+
+    :param headers: dictionary to extract encoding from.
+    """
+
+    content_type = headers.get('content-type')
+
+    if not content_type:
+        return None
+
+    content_type, params = cgi.parse_header(content_type)
+
+    if 'charset' in params:
+        return params['charset'].strip("'\"")
+
+    if 'text' in content_type:
+        return 'ISO-8859-1'
+
+
+def stream_decode_response_unicode(iterator, r):
+    """Stream decodes a iterator."""
+
+    if r.encoding is None:
+        for item in iterator:
+            yield item
+        return
+
+    decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')
+    for chunk in iterator:
+        rv = decoder.decode(chunk)
+        if rv:
+            yield rv
+    rv = decoder.decode(b'', final=True)
+    if rv:
+        yield rv
+
+
+def iter_slices(string, slice_length):
+    """Iterate over slices of a string."""
+    pos = 0
+    while pos < len(string):
+        yield string[pos:pos + slice_length]
+        pos += slice_length
+
+
+def get_unicode_from_response(r):
+    """Returns the requested content back in unicode.
+
+    :param r: Response object to get unicode content from.
+
+    Tried:
+
+    1. charset from content-type
+    2. fall back and replace all unicode characters
+
+    """
+    warnings.warn((
+        'In requests 3.0, get_unicode_from_response will be removed. For '
+        'more information, please see the discussion on issue #2266. (This'
+        ' warning should only appear once.)'),
+        DeprecationWarning)
+
+    tried_encodings = []
+
+    # Try charset from content-type
+    encoding = get_encoding_from_headers(r.headers)
+
+    if encoding:
+        try:
+            return str(r.content, encoding)
+        except UnicodeError:
+            tried_encodings.append(encoding)
+
+    # Fall back:
+    try:
+        return str(r.content, encoding, errors='replace')
+    except TypeError:
+        return r.content
+
+
+# The unreserved URI characters (RFC 3986)
+UNRESERVED_SET = frozenset(
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+    + "0123456789-._~")
+
+
+def unquote_unreserved(uri):
+    """Un-escape any percent-escape sequences in a URI that are unreserved
+    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
+    """
+    parts = uri.split('%')
+    for i in range(1, len(parts)):
+        h = parts[i][0:2]
+        if len(h) == 2 and h.isalnum():
+            try:
+                c = chr(int(h, 16))
+            except ValueError:
+                raise InvalidURL("Invalid percent-escape sequence: '%s'" % h)
+
+            if c in UNRESERVED_SET:
+                parts[i] = c + parts[i][2:]
+            else:
+                parts[i] = '%' + parts[i]
+        else:
+            parts[i] = '%' + parts[i]
+    return ''.join(parts)
+
+
+def requote_uri(uri):
+    """Re-quote the given URI.
+
+    This function passes the given URI through an unquote/quote cycle to
+    ensure that it is fully and consistently quoted.
+    """
+    safe_with_percent = "!#$%&'()*+,/:;=?@[]~"
+    safe_without_percent = "!#$&'()*+,/:;=?@[]~"
+    try:
+        # Unquote only the unreserved characters
+        # Then quote only illegal characters (do not quote reserved,
+        # unreserved, or '%')
+        return quote(unquote_unreserved(uri), safe=safe_with_percent)
+    except InvalidURL:
+        # We couldn't unquote the given URI, so let's try quoting it, but
+        # there may be unquoted '%'s in the URI. We need to make sure they're
+        # properly quoted so they do not cause issues elsewhere.
+        return quote(uri, safe=safe_without_percent)
+
+
+def address_in_network(ip, net):
+    """
+    This function allows you to check if on IP belongs to a network subnet
+    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
+             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24
+    """
+    ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0]
+    netaddr, bits = net.split('/')
+    netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0]
+    network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask
+    return (ipaddr & netmask) == (network & netmask)
+
+
+def dotted_netmask(mask):
+    """
+    Converts mask from /xx format to xxx.xxx.xxx.xxx
+    Example: if mask is 24 function returns 255.255.255.0
+    """
+    bits = 0xffffffff ^ (1 << 32 - mask) - 1
+    return socket.inet_ntoa(struct.pack('>I', bits))
+
+
+def is_ipv4_address(string_ip):
+    try:
+        socket.inet_aton(string_ip)
+    except socket.error:
+        return False
+    return True
+
+
+def is_valid_cidr(string_network):
+    """Very simple check of the cidr format in no_proxy variable"""
+    if string_network.count('/') == 1:
+        try:
+            mask = int(string_network.split('/')[1])
+        except ValueError:
+            return False
+
+        if mask < 1 or mask > 32:
+            return False
+
+        try:
+            socket.inet_aton(string_network.split('/')[0])
+        except socket.error:
+            return False
+    else:
+        return False
+    return True
+
+
+def should_bypass_proxies(url):
+    """
+    Returns whether we should bypass proxies or not.
+    """
+    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())
+
+    # First check whether no_proxy is defined. If it is, check that the URL
+    # we're getting isn't in the no_proxy list.
+    no_proxy = get_proxy('no_proxy')
+    netloc = urlparse(url).netloc
+
+    if no_proxy:
+        # We need to check whether we match here. We need to see if we match
+        # the end of the netloc, both with and without the port.
+        no_proxy = (
+            host for host in no_proxy.replace(' ', '').split(',') if host
+        )
+
+        ip = netloc.split(':')[0]
+        if is_ipv4_address(ip):
+            for proxy_ip in no_proxy:
+                if is_valid_cidr(proxy_ip):
+                    if address_in_network(ip, proxy_ip):
+                        return True
+        else:
+            for host in no_proxy:
+                if netloc.endswith(host) or netloc.split(':')[0].endswith(host):
+                    # The URL does match something in no_proxy, so we don't want
+                    # to apply the proxies on this URL.
+                    return True
+
+    # If the system proxy settings indicate that this URL should be bypassed,
+    # don't proxy.
+    # The proxy_bypass function is incredibly buggy on OS X in early versions
+    # of Python 2.6, so allow this call to fail. Only catch the specific
+    # exceptions we've seen, though: this call failing in other ways can reveal
+    # legitimate problems.
+    try:
+        bypass = proxy_bypass(netloc)
+    except (TypeError, socket.gaierror):
+        bypass = False
+
+    if bypass:
+        return True
+
+    return False
+
+def get_environ_proxies(url):
+    """Return a dict of environment proxies."""
+    if should_bypass_proxies(url):
+        return {}
+    else:
+        return getproxies()
+
+def select_proxy(url, proxies):
+    """Select a proxy for the url, if applicable.
+
+    :param url: The url being for the request
+    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
+    """
+    proxies = proxies or {}
+    urlparts = urlparse(url)
+    proxy = proxies.get(urlparts.scheme+'://'+urlparts.hostname)
+    if proxy is None:
+        proxy = proxies.get(urlparts.scheme)
+    return proxy
+
+def default_user_agent(name="python-requests"):
+    """Return a string representing the default user agent."""
+    return '%s/%s' % (name, __version__)
+
+
+def default_headers():
+    return CaseInsensitiveDict({
+        'User-Agent': default_user_agent(),
+        'Accept-Encoding': ', '.join(('gzip', 'deflate')),
+        'Accept': '*/*',
+        'Connection': 'keep-alive',
+    })
+
+
+def parse_header_links(value):
+    """Return a dict of parsed link headers proxies.
+
+    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"
+
+    """
+
+    links = []
+
+    replace_chars = " '\""
+
+    for val in re.split(", *<", value):
+        try:
+            url, params = val.split(";", 1)
+        except ValueError:
+            url, params = val, ''
+
+        link = {}
+
+        link["url"] = url.strip("<> '\"")
+
+        for param in params.split(";"):
+            try:
+                key, value = param.split("=")
+            except ValueError:
+                break
+
+            link[key.strip(replace_chars)] = value.strip(replace_chars)
+
+        links.append(link)
+
+    return links
+
+
+# Null bytes; no need to recreate these on each call to guess_json_utf
+_null = '\x00'.encode('ascii')  # encoding to ASCII for Python 3
+_null2 = _null * 2
+_null3 = _null * 3
+
+
+def guess_json_utf(data):
+    # JSON always starts with two ASCII characters, so detection is as
+    # easy as counting the nulls and from their location and count
+    # determine the encoding. Also detect a BOM, if present.
+    sample = data[:4]
+    if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE):
+        return 'utf-32'     # BOM included
+    if sample[:3] == codecs.BOM_UTF8:
+        return 'utf-8-sig'  # BOM included, MS style (discouraged)
+    if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):
+        return 'utf-16'     # BOM included
+    nullcount = sample.count(_null)
+    if nullcount == 0:
+        return 'utf-8'
+    if nullcount == 2:
+        if sample[::2] == _null2:   # 1st and 3rd are null
+            return 'utf-16-be'
+        if sample[1::2] == _null2:  # 2nd and 4th are null
+            return 'utf-16-le'
+        # Did not detect 2 valid UTF-16 ascii-range characters
+    if nullcount == 3:
+        if sample[:3] == _null3:
+            return 'utf-32-be'
+        if sample[1:] == _null3:
+            return 'utf-32-le'
+        # Did not detect a valid UTF-32 ascii-range character
+    return None
+
+
+def prepend_scheme_if_needed(url, new_scheme):
+    '''Given a URL that may or may not have a scheme, prepend the given scheme.
+    Does not replace a present scheme with the one provided as an argument.'''
+    scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme)
+
+    # urlparse is a finicky beast, and sometimes decides that there isn't a
+    # netloc present. Assume that it's being over-cautious, and switch netloc
+    # and path if urlparse decided there was no netloc.
+    if not netloc:
+        netloc, path = path, netloc
+
+    return urlunparse((scheme, netloc, path, params, query, fragment))
+
+
+def get_auth_from_url(url):
+    """Given a url with authentication components, extract them into a tuple of
+    username,password."""
+    parsed = urlparse(url)
+
+    try:
+        auth = (unquote(parsed.username), unquote(parsed.password))
+    except (AttributeError, TypeError):
+        auth = ('', '')
+
+    return auth
+
+
+def to_native_string(string, encoding='ascii'):
+    """
+    Given a string object, regardless of type, returns a representation of that
+    string in the native string type, encoding and decoding where necessary.
+    This assumes ASCII unless told otherwise.
+    """
+    out = None
+
+    if isinstance(string, builtin_str):
+        out = string
+    else:
+        if is_py2:
+            out = string.encode(encoding)
+        else:
+            out = string.decode(encoding)
+
+    return out
+
+
+def urldefragauth(url):
+    """
+    Given a url remove the fragment and the authentication part
+    """
+    scheme, netloc, path, params, query, fragment = urlparse(url)
+
+    # see func:`prepend_scheme_if_needed`
+    if not netloc:
+        netloc, path = path, netloc
+
+    netloc = netloc.rsplit('@', 1)[-1]
+
+    return urlunparse((scheme, netloc, path, params, query, ''))
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/auth.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/auth.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/auth.py	(revision 1126)
@@ -0,0 +1,223 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.auth
+~~~~~~~~~~~~~
+
+This module contains the authentication handlers for Requests.
+"""
+
+import os
+import re
+import time
+import hashlib
+import threading
+
+from base64 import b64encode
+
+from .compat import urlparse, str
+from .cookies import extract_cookies_to_jar
+from .utils import parse_dict_header, to_native_string
+from .status_codes import codes
+
+CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
+CONTENT_TYPE_MULTI_PART = 'multipart/form-data'
+
+
+def _basic_auth_str(username, password):
+    """Returns a Basic Auth string."""
+
+    authstr = 'Basic ' + to_native_string(
+        b64encode(('%s:%s' % (username, password)).encode('latin1')).strip()
+    )
+
+    return authstr
+
+
+class AuthBase(object):
+    """Base class that all auth implementations derive from"""
+
+    def __call__(self, r):
+        raise NotImplementedError('Auth hooks must be callable.')
+
+
+class HTTPBasicAuth(AuthBase):
+    """Attaches HTTP Basic Authentication to the given Request object."""
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+
+    def __call__(self, r):
+        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPProxyAuth(HTTPBasicAuth):
+    """Attaches HTTP Proxy Authentication to a given Request object."""
+    def __call__(self, r):
+        r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPDigestAuth(AuthBase):
+    """Attaches HTTP Digest Authentication to the given Request object."""
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+        # Keep state in per-thread local storage
+        self._thread_local = threading.local()
+
+    def init_per_thread_state(self):
+        # Ensure state is initialized just once per-thread
+        if not hasattr(self._thread_local, 'init'):
+            self._thread_local.init = True
+            self._thread_local.last_nonce = ''
+            self._thread_local.nonce_count = 0
+            self._thread_local.chal = {}
+            self._thread_local.pos = None
+            self._thread_local.num_401_calls = None
+
+    def build_digest_header(self, method, url):
+
+        realm = self._thread_local.chal['realm']
+        nonce = self._thread_local.chal['nonce']
+        qop = self._thread_local.chal.get('qop')
+        algorithm = self._thread_local.chal.get('algorithm')
+        opaque = self._thread_local.chal.get('opaque')
+
+        if algorithm is None:
+            _algorithm = 'MD5'
+        else:
+            _algorithm = algorithm.upper()
+        # lambdas assume digest modules are imported at the top level
+        if _algorithm == 'MD5' or _algorithm == 'MD5-SESS':
+            def md5_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.md5(x).hexdigest()
+            hash_utf8 = md5_utf8
+        elif _algorithm == 'SHA':
+            def sha_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.sha1(x).hexdigest()
+            hash_utf8 = sha_utf8
+
+        KD = lambda s, d: hash_utf8("%s:%s" % (s, d))
+
+        if hash_utf8 is None:
+            return None
+
+        # XXX not implemented yet
+        entdig = None
+        p_parsed = urlparse(url)
+        #: path is request-uri defined in RFC 2616 which should not be empty
+        path = p_parsed.path or "/"
+        if p_parsed.query:
+            path += '?' + p_parsed.query
+
+        A1 = '%s:%s:%s' % (self.username, realm, self.password)
+        A2 = '%s:%s' % (method, path)
+
+        HA1 = hash_utf8(A1)
+        HA2 = hash_utf8(A2)
+
+        if nonce == self._thread_local.last_nonce:
+            self._thread_local.nonce_count += 1
+        else:
+            self._thread_local.nonce_count = 1
+        ncvalue = '%08x' % self._thread_local.nonce_count
+        s = str(self._thread_local.nonce_count).encode('utf-8')
+        s += nonce.encode('utf-8')
+        s += time.ctime().encode('utf-8')
+        s += os.urandom(8)
+
+        cnonce = (hashlib.sha1(s).hexdigest()[:16])
+        if _algorithm == 'MD5-SESS':
+            HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce))
+
+        if not qop:
+            respdig = KD(HA1, "%s:%s" % (nonce, HA2))
+        elif qop == 'auth' or 'auth' in qop.split(','):
+            noncebit = "%s:%s:%s:%s:%s" % (
+                nonce, ncvalue, cnonce, 'auth', HA2
+                )
+            respdig = KD(HA1, noncebit)
+        else:
+            # XXX handle auth-int.
+            return None
+
+        self._thread_local.last_nonce = nonce
+
+        # XXX should the partial digests be encoded too?
+        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
+               'response="%s"' % (self.username, realm, nonce, path, respdig)
+        if opaque:
+            base += ', opaque="%s"' % opaque
+        if algorithm:
+            base += ', algorithm="%s"' % algorithm
+        if entdig:
+            base += ', digest="%s"' % entdig
+        if qop:
+            base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce)
+
+        return 'Digest %s' % (base)
+
+    def handle_redirect(self, r, **kwargs):
+        """Reset num_401_calls counter on redirects."""
+        if r.is_redirect:
+            self._thread_local.num_401_calls = 1
+
+    def handle_401(self, r, **kwargs):
+        """Takes the given response and tries digest-auth, if needed."""
+
+        if self._thread_local.pos is not None:
+            # Rewind the file position indicator of the body to where
+            # it was to resend the request.
+            r.request.body.seek(self._thread_local.pos)
+        s_auth = r.headers.get('www-authenticate', '')
+
+        if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2:
+
+            self._thread_local.num_401_calls += 1
+            pat = re.compile(r'digest ', flags=re.IGNORECASE)
+            self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1))
+
+            # Consume content and release the original connection
+            # to allow our new request to reuse the same one.
+            r.content
+            r.close()
+            prep = r.request.copy()
+            extract_cookies_to_jar(prep._cookies, r.request, r.raw)
+            prep.prepare_cookies(prep._cookies)
+
+            prep.headers['Authorization'] = self.build_digest_header(
+                prep.method, prep.url)
+            _r = r.connection.send(prep, **kwargs)
+            _r.history.append(r)
+            _r.request = prep
+
+            return _r
+
+        self._thread_local.num_401_calls = 1
+        return r
+
+    def __call__(self, r):
+        # Initialize per-thread state, if needed
+        self.init_per_thread_state()
+        # If we have a saved nonce, skip the 401
+        if self._thread_local.last_nonce:
+            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)
+        try:
+            self._thread_local.pos = r.body.tell()
+        except AttributeError:
+            # In the case of HTTPDigestAuth being reused and the body of
+            # the previous request was a file-like object, pos has the
+            # file position of the previous body. Ensure it's set to
+            # None.
+            self._thread_local.pos = None
+        r.register_hook('response', self.handle_401)
+        r.register_hook('response', self.handle_redirect)
+        self._thread_local.num_401_calls = 1
+
+        return r
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/adapters.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/adapters.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/adapters.py	(revision 1126)
@@ -0,0 +1,453 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.adapters
+~~~~~~~~~~~~~~~~~
+
+This module contains the transport adapters that Requests uses to define
+and maintain connections.
+"""
+
+import os.path
+import socket
+
+from .models import Response
+from .packages.urllib3.poolmanager import PoolManager, proxy_from_url
+from .packages.urllib3.response import HTTPResponse
+from .packages.urllib3.util import Timeout as TimeoutSauce
+from .packages.urllib3.util.retry import Retry
+from .compat import urlparse, basestring
+from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers,
+                    prepend_scheme_if_needed, get_auth_from_url, urldefragauth,
+                    select_proxy)
+from .structures import CaseInsensitiveDict
+from .packages.urllib3.exceptions import ClosedPoolError
+from .packages.urllib3.exceptions import ConnectTimeoutError
+from .packages.urllib3.exceptions import HTTPError as _HTTPError
+from .packages.urllib3.exceptions import MaxRetryError
+from .packages.urllib3.exceptions import NewConnectionError
+from .packages.urllib3.exceptions import ProxyError as _ProxyError
+from .packages.urllib3.exceptions import ProtocolError
+from .packages.urllib3.exceptions import ReadTimeoutError
+from .packages.urllib3.exceptions import SSLError as _SSLError
+from .packages.urllib3.exceptions import ResponseError
+from .cookies import extract_cookies_to_jar
+from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError,
+                         ProxyError, RetryError)
+from .auth import _basic_auth_str
+
+DEFAULT_POOLBLOCK = False
+DEFAULT_POOLSIZE = 10
+DEFAULT_RETRIES = 0
+DEFAULT_POOL_TIMEOUT = None
+
+
+class BaseAdapter(object):
+    """The Base Transport Adapter"""
+
+    def __init__(self):
+        super(BaseAdapter, self).__init__()
+
+    def send(self):
+        raise NotImplementedError
+
+    def close(self):
+        raise NotImplementedError
+
+
+class HTTPAdapter(BaseAdapter):
+    """The built-in HTTP Adapter for urllib3.
+
+    Provides a general-case interface for Requests sessions to contact HTTP and
+    HTTPS urls by implementing the Transport Adapter interface. This class will
+    usually be created by the :class:`Session <Session>` class under the
+    covers.
+
+    :param pool_connections: The number of urllib3 connection pools to cache.
+    :param pool_maxsize: The maximum number of connections to save in the pool.
+    :param int max_retries: The maximum number of retries each connection
+        should attempt. Note, this applies only to failed DNS lookups, socket
+        connections and connection timeouts, never to requests where data has
+        made it to the server. By default, Requests does not retry failed
+        connections. If you need granular control over the conditions under
+        which we retry a request, import urllib3's ``Retry`` class and pass
+        that instead.
+    :param pool_block: Whether the connection pool should block for connections.
+
+    Usage::
+
+      >>> import requests
+      >>> s = requests.Session()
+      >>> a = requests.adapters.HTTPAdapter(max_retries=3)
+      >>> s.mount('http://', a)
+    """
+    __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize',
+                 '_pool_block']
+
+    def __init__(self, pool_connections=DEFAULT_POOLSIZE,
+                 pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES,
+                 pool_block=DEFAULT_POOLBLOCK):
+        if max_retries == DEFAULT_RETRIES:
+            self.max_retries = Retry(0, read=False)
+        else:
+            self.max_retries = Retry.from_int(max_retries)
+        self.config = {}
+        self.proxy_manager = {}
+
+        super(HTTPAdapter, self).__init__()
+
+        self._pool_connections = pool_connections
+        self._pool_maxsize = pool_maxsize
+        self._pool_block = pool_block
+
+        self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block)
+
+    def __getstate__(self):
+        return dict((attr, getattr(self, attr, None)) for attr in
+                    self.__attrs__)
+
+    def __setstate__(self, state):
+        # Can't handle by adding 'proxy_manager' to self.__attrs__ because
+        # self.poolmanager uses a lambda function, which isn't pickleable.
+        self.proxy_manager = {}
+        self.config = {}
+
+        for attr, value in state.items():
+            setattr(self, attr, value)
+
+        self.init_poolmanager(self._pool_connections, self._pool_maxsize,
+                              block=self._pool_block)
+
+    def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs):
+        """Initializes a urllib3 PoolManager.
+
+        This method should not be called from user code, and is only
+        exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param connections: The number of urllib3 connection pools to cache.
+        :param maxsize: The maximum number of connections to save in the pool.
+        :param block: Block when no free connections are available.
+        :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager.
+        """
+        # save these values for pickling
+        self._pool_connections = connections
+        self._pool_maxsize = maxsize
+        self._pool_block = block
+
+        self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize,
+                                       block=block, strict=True, **pool_kwargs)
+
+    def proxy_manager_for(self, proxy, **proxy_kwargs):
+        """Return urllib3 ProxyManager for the given proxy.
+
+        This method should not be called from user code, and is only
+        exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param proxy: The proxy to return a urllib3 ProxyManager for.
+        :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager.
+        :returns: ProxyManager
+        """
+        if not proxy in self.proxy_manager:
+            proxy_headers = self.proxy_headers(proxy)
+            self.proxy_manager[proxy] = proxy_from_url(
+                proxy,
+                proxy_headers=proxy_headers,
+                num_pools=self._pool_connections,
+                maxsize=self._pool_maxsize,
+                block=self._pool_block,
+                **proxy_kwargs)
+
+        return self.proxy_manager[proxy]
+
+    def cert_verify(self, conn, url, verify, cert):
+        """Verify a SSL certificate. This method should not be called from user
+        code, and is only exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param conn: The urllib3 connection object associated with the cert.
+        :param url: The requested URL.
+        :param verify: Whether we should actually verify the certificate.
+        :param cert: The SSL certificate to verify.
+        """
+        if url.lower().startswith('https') and verify:
+
+            cert_loc = None
+
+            # Allow self-specified cert location.
+            if verify is not True:
+                cert_loc = verify
+
+            if not cert_loc:
+                cert_loc = DEFAULT_CA_BUNDLE_PATH
+
+            if not cert_loc:
+                raise Exception("Could not find a suitable SSL CA certificate bundle.")
+
+            conn.cert_reqs = 'CERT_REQUIRED'
+
+            if not os.path.isdir(cert_loc):
+                conn.ca_certs = cert_loc
+            else:
+                conn.ca_cert_dir = cert_loc
+        else:
+            conn.cert_reqs = 'CERT_NONE'
+            conn.ca_certs = None
+            conn.ca_cert_dir = None
+
+        if cert:
+            if not isinstance(cert, basestring):
+                conn.cert_file = cert[0]
+                conn.key_file = cert[1]
+            else:
+                conn.cert_file = cert
+
+    def build_response(self, req, resp):
+        """Builds a :class:`Response <requests.Response>` object from a urllib3
+        response. This should not be called from user code, and is only exposed
+        for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`
+
+        :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response.
+        :param resp: The urllib3 response object.
+        """
+        response = Response()
+
+        # Fallback to None if there's no status_code, for whatever reason.
+        response.status_code = getattr(resp, 'status', None)
+
+        # Make headers case-insensitive.
+        response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {}))
+
+        # Set encoding.
+        response.encoding = get_encoding_from_headers(response.headers)
+        response.raw = resp
+        response.reason = response.raw.reason
+
+        if isinstance(req.url, bytes):
+            response.url = req.url.decode('utf-8')
+        else:
+            response.url = req.url
+
+        # Add new cookies from the server.
+        extract_cookies_to_jar(response.cookies, req, resp)
+
+        # Give the Response some context.
+        response.request = req
+        response.connection = self
+
+        return response
+
+    def get_connection(self, url, proxies=None):
+        """Returns a urllib3 connection for the given URL. This should not be
+        called from user code, and is only exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param url: The URL to connect to.
+        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.
+        """
+        proxy = select_proxy(url, proxies)
+
+        if proxy:
+            proxy = prepend_scheme_if_needed(proxy, 'http')
+            proxy_manager = self.proxy_manager_for(proxy)
+            conn = proxy_manager.connection_from_url(url)
+        else:
+            # Only scheme should be lower case
+            parsed = urlparse(url)
+            url = parsed.geturl()
+            conn = self.poolmanager.connection_from_url(url)
+
+        return conn
+
+    def close(self):
+        """Disposes of any internal state.
+
+        Currently, this just closes the PoolManager, which closes pooled
+        connections.
+        """
+        self.poolmanager.clear()
+
+    def request_url(self, request, proxies):
+        """Obtain the url to use when making the final request.
+
+        If the message is being sent through a HTTP proxy, the full URL has to
+        be used. Otherwise, we should only use the path portion of the URL.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs.
+        """
+        proxy = select_proxy(request.url, proxies)
+        scheme = urlparse(request.url).scheme
+        if proxy and scheme != 'https':
+            url = urldefragauth(request.url)
+        else:
+            url = request.path_url
+
+        return url
+
+    def add_headers(self, request, **kwargs):
+        """Add any headers needed by the connection. As of v2.0 this does
+        nothing by default, but is left for overriding by users that subclass
+        the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to.
+        :param kwargs: The keyword arguments from the call to send().
+        """
+        pass
+
+    def proxy_headers(self, proxy):
+        """Returns a dictionary of the headers to add to any request sent
+        through a proxy. This works with urllib3 magic to ensure that they are
+        correctly sent to the proxy, rather than in a tunnelled request if
+        CONNECT is being used.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param proxies: The url of the proxy being used for this request.
+        """
+        headers = {}
+        username, password = get_auth_from_url(proxy)
+
+        if username and password:
+            headers['Proxy-Authorization'] = _basic_auth_str(username,
+                                                             password)
+
+        return headers
+
+    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
+        """Sends PreparedRequest object. Returns Response object.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param stream: (optional) Whether to stream the request content.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple
+        :param verify: (optional) Whether to verify SSL certificates.
+        :param cert: (optional) Any user-provided SSL certificate to be trusted.
+        :param proxies: (optional) The proxies dictionary to apply to the request.
+        """
+
+        conn = self.get_connection(request.url, proxies)
+
+        self.cert_verify(conn, request.url, verify, cert)
+        url = self.request_url(request, proxies)
+        self.add_headers(request)
+
+        chunked = not (request.body is None or 'Content-Length' in request.headers)
+
+        if isinstance(timeout, tuple):
+            try:
+                connect, read = timeout
+                timeout = TimeoutSauce(connect=connect, read=read)
+            except ValueError as e:
+                # this may raise a string formatting error.
+                err = ("Invalid timeout {0}. Pass a (connect, read) "
+                       "timeout tuple, or a single float to set "
+                       "both timeouts to the same value".format(timeout))
+                raise ValueError(err)
+        else:
+            timeout = TimeoutSauce(connect=timeout, read=timeout)
+
+        try:
+            if not chunked:
+                resp = conn.urlopen(
+                    method=request.method,
+                    url=url,
+                    body=request.body,
+                    headers=request.headers,
+                    redirect=False,
+                    assert_same_host=False,
+                    preload_content=False,
+                    decode_content=False,
+                    retries=self.max_retries,
+                    timeout=timeout
+                )
+
+            # Send the request.
+            else:
+                if hasattr(conn, 'proxy_pool'):
+                    conn = conn.proxy_pool
+
+                low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)
+
+                try:
+                    low_conn.putrequest(request.method,
+                                        url,
+                                        skip_accept_encoding=True)
+
+                    for header, value in request.headers.items():
+                        low_conn.putheader(header, value)
+
+                    low_conn.endheaders()
+
+                    for i in request.body:
+                        low_conn.send(hex(len(i))[2:].encode('utf-8'))
+                        low_conn.send(b'\r\n')
+                        low_conn.send(i)
+                        low_conn.send(b'\r\n')
+                    low_conn.send(b'0\r\n\r\n')
+
+                    # Receive the response from the server
+                    try:
+                        # For Python 2.7+ versions, use buffering of HTTP
+                        # responses
+                        r = low_conn.getresponse(buffering=True)
+                    except TypeError:
+                        # For compatibility with Python 2.6 versions and back
+                        r = low_conn.getresponse()
+
+                    resp = HTTPResponse.from_httplib(
+                        r,
+                        pool=conn,
+                        connection=low_conn,
+                        preload_content=False,
+                        decode_content=False
+                    )
+                except:
+                    # If we hit any problems here, clean up the connection.
+                    # Then, reraise so that we can handle the actual exception.
+                    low_conn.close()
+                    raise
+
+        except (ProtocolError, socket.error) as err:
+            raise ConnectionError(err, request=request)
+
+        except MaxRetryError as e:
+            if isinstance(e.reason, ConnectTimeoutError):
+                # TODO: Remove this in 3.0.0: see #2811
+                if not isinstance(e.reason, NewConnectionError):
+                    raise ConnectTimeout(e, request=request)
+
+            if isinstance(e.reason, ResponseError):
+                raise RetryError(e, request=request)
+
+            raise ConnectionError(e, request=request)
+
+        except ClosedPoolError as e:
+            raise ConnectionError(e, request=request)
+
+        except _ProxyError as e:
+            raise ProxyError(e)
+
+        except (_SSLError, _HTTPError) as e:
+            if isinstance(e, _SSLError):
+                raise SSLError(e, request=request)
+            elif isinstance(e, ReadTimeoutError):
+                raise ReadTimeout(e, request=request)
+            else:
+                raise
+
+        return self.build_response(request, resp)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/sessions.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/sessions.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/sessions.py	(revision 1126)
@@ -0,0 +1,680 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.session
+~~~~~~~~~~~~~~~~
+
+This module provides a Session object to manage and persist settings across
+requests (cookies, auth, proxies).
+
+"""
+import os
+from collections import Mapping
+from datetime import datetime
+
+from .auth import _basic_auth_str
+from .compat import cookielib, OrderedDict, urljoin, urlparse
+from .cookies import (
+    cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies)
+from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT
+from .hooks import default_hooks, dispatch_hook
+from .utils import to_key_val_list, default_headers, to_native_string
+from .exceptions import (
+    TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError)
+from .packages.urllib3._collections import RecentlyUsedContainer
+from .structures import CaseInsensitiveDict
+
+from .adapters import HTTPAdapter
+
+from .utils import (
+    requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies,
+    get_auth_from_url
+)
+
+from .status_codes import codes
+
+# formerly defined here, reexposed here for backward compatibility
+from .models import REDIRECT_STATI
+
+REDIRECT_CACHE_SIZE = 1000
+
+
+def merge_setting(request_setting, session_setting, dict_class=OrderedDict):
+    """
+    Determines appropriate setting for a given request, taking into account the
+    explicit setting on that request, and the setting in the session. If a
+    setting is a dictionary, they will be merged together using `dict_class`
+    """
+
+    if session_setting is None:
+        return request_setting
+
+    if request_setting is None:
+        return session_setting
+
+    # Bypass if not a dictionary (e.g. verify)
+    if not (
+            isinstance(session_setting, Mapping) and
+            isinstance(request_setting, Mapping)
+    ):
+        return request_setting
+
+    merged_setting = dict_class(to_key_val_list(session_setting))
+    merged_setting.update(to_key_val_list(request_setting))
+
+    # Remove keys that are set to None. Extract keys first to avoid altering
+    # the dictionary during iteration.
+    none_keys = [k for (k, v) in merged_setting.items() if v is None]
+    for key in none_keys:
+        del merged_setting[key]
+
+    return merged_setting
+
+
+def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict):
+    """
+    Properly merges both requests and session hooks.
+
+    This is necessary because when request_hooks == {'response': []}, the
+    merge breaks Session hooks entirely.
+    """
+    if session_hooks is None or session_hooks.get('response') == []:
+        return request_hooks
+
+    if request_hooks is None or request_hooks.get('response') == []:
+        return session_hooks
+
+    return merge_setting(request_hooks, session_hooks, dict_class)
+
+
+class SessionRedirectMixin(object):
+    def resolve_redirects(self, resp, req, stream=False, timeout=None,
+                          verify=True, cert=None, proxies=None, **adapter_kwargs):
+        """Receives a Response. Returns a generator of Responses."""
+
+        i = 0
+        hist = [] # keep track of history
+
+        while resp.is_redirect:
+            prepared_request = req.copy()
+
+            if i > 0:
+                # Update history and keep track of redirects.
+                hist.append(resp)
+                new_hist = list(hist)
+                resp.history = new_hist
+
+            try:
+                resp.content  # Consume socket so it can be released
+            except (ChunkedEncodingError, ContentDecodingError, RuntimeError):
+                resp.raw.read(decode_content=False)
+
+            if i >= self.max_redirects:
+                raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects)
+
+            # Release the connection back into the pool.
+            resp.close()
+
+            url = resp.headers['location']
+            method = req.method
+
+            # Handle redirection without scheme (see: RFC 1808 Section 4)
+            if url.startswith('//'):
+                parsed_rurl = urlparse(resp.url)
+                url = '%s:%s' % (parsed_rurl.scheme, url)
+
+            # The scheme should be lower case...
+            parsed = urlparse(url)
+            url = parsed.geturl()
+
+            # Facilitate relative 'location' headers, as allowed by RFC 7231.
+            # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')
+            # Compliant with RFC3986, we percent encode the url.
+            if not parsed.netloc:
+                url = urljoin(resp.url, requote_uri(url))
+            else:
+                url = requote_uri(url)
+
+            prepared_request.url = to_native_string(url)
+            # Cache the url, unless it redirects to itself.
+            if resp.is_permanent_redirect and req.url != prepared_request.url:
+                self.redirect_cache[req.url] = prepared_request.url
+
+            # http://tools.ietf.org/html/rfc7231#section-6.4.4
+            if (resp.status_code == codes.see_other and
+                    method != 'HEAD'):
+                method = 'GET'
+
+            # Do what the browsers do, despite standards...
+            # First, turn 302s into GETs.
+            if resp.status_code == codes.found and method != 'HEAD':
+                method = 'GET'
+
+            # Second, if a POST is responded to with a 301, turn it into a GET.
+            # This bizarre behaviour is explained in Issue 1704.
+            if resp.status_code == codes.moved and method == 'POST':
+                method = 'GET'
+
+            prepared_request.method = method
+
+            # https://github.com/kennethreitz/requests/issues/1084
+            if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect):
+                if 'Content-Length' in prepared_request.headers:
+                    del prepared_request.headers['Content-Length']
+
+                prepared_request.body = None
+
+            headers = prepared_request.headers
+            try:
+                del headers['Cookie']
+            except KeyError:
+                pass
+
+            # Extract any cookies sent on the response to the cookiejar
+            # in the new request. Because we've mutated our copied prepared
+            # request, use the old one that we haven't yet touched.
+            extract_cookies_to_jar(prepared_request._cookies, req, resp.raw)
+            prepared_request._cookies.update(self.cookies)
+            prepared_request.prepare_cookies(prepared_request._cookies)
+
+            # Rebuild auth and proxy information.
+            proxies = self.rebuild_proxies(prepared_request, proxies)
+            self.rebuild_auth(prepared_request, resp)
+
+            # Override the original request.
+            req = prepared_request
+
+            resp = self.send(
+                req,
+                stream=stream,
+                timeout=timeout,
+                verify=verify,
+                cert=cert,
+                proxies=proxies,
+                allow_redirects=False,
+                **adapter_kwargs
+            )
+
+            extract_cookies_to_jar(self.cookies, prepared_request, resp.raw)
+
+            i += 1
+            yield resp
+
+    def rebuild_auth(self, prepared_request, response):
+        """
+        When being redirected we may want to strip authentication from the
+        request to avoid leaking credentials. This method intelligently removes
+        and reapplies authentication where possible to avoid credential loss.
+        """
+        headers = prepared_request.headers
+        url = prepared_request.url
+
+        if 'Authorization' in headers:
+            # If we get redirected to a new host, we should strip out any
+            # authentication headers.
+            original_parsed = urlparse(response.request.url)
+            redirect_parsed = urlparse(url)
+
+            if (original_parsed.hostname != redirect_parsed.hostname):
+                del headers['Authorization']
+
+        # .netrc might have more auth for us on our new host.
+        new_auth = get_netrc_auth(url) if self.trust_env else None
+        if new_auth is not None:
+            prepared_request.prepare_auth(new_auth)
+
+        return
+
+    def rebuild_proxies(self, prepared_request, proxies):
+        """
+        This method re-evaluates the proxy configuration by considering the
+        environment variables. If we are redirected to a URL covered by
+        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
+        proxy keys for this URL (in case they were stripped by a previous
+        redirect).
+
+        This method also replaces the Proxy-Authorization header where
+        necessary.
+        """
+        headers = prepared_request.headers
+        url = prepared_request.url
+        scheme = urlparse(url).scheme
+        new_proxies = proxies.copy() if proxies is not None else {}
+
+        if self.trust_env and not should_bypass_proxies(url):
+            environ_proxies = get_environ_proxies(url)
+
+            proxy = environ_proxies.get(scheme)
+
+            if proxy:
+                new_proxies.setdefault(scheme, environ_proxies[scheme])
+
+        if 'Proxy-Authorization' in headers:
+            del headers['Proxy-Authorization']
+
+        try:
+            username, password = get_auth_from_url(new_proxies[scheme])
+        except KeyError:
+            username, password = None, None
+
+        if username and password:
+            headers['Proxy-Authorization'] = _basic_auth_str(username, password)
+
+        return new_proxies
+
+
+class Session(SessionRedirectMixin):
+    """A Requests session.
+
+    Provides cookie persistence, connection-pooling, and configuration.
+
+    Basic Usage::
+
+      >>> import requests
+      >>> s = requests.Session()
+      >>> s.get('http://httpbin.org/get')
+      <Response [200]>
+
+    Or as a context manager::
+
+      >>> with requests.Session() as s:
+      >>>     s.get('http://httpbin.org/get')
+      <Response [200]>
+    """
+
+    __attrs__ = [
+        'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify',
+        'cert', 'prefetch', 'adapters', 'stream', 'trust_env',
+        'max_redirects',
+    ]
+
+    def __init__(self):
+
+        #: A case-insensitive dictionary of headers to be sent on each
+        #: :class:`Request <Request>` sent from this
+        #: :class:`Session <Session>`.
+        self.headers = default_headers()
+
+        #: Default Authentication tuple or object to attach to
+        #: :class:`Request <Request>`.
+        self.auth = None
+
+        #: Dictionary mapping protocol or protocol and host to the URL of the proxy
+        #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to
+        #: be used on each :class:`Request <Request>`.
+        self.proxies = {}
+
+        #: Event-handling hooks.
+        self.hooks = default_hooks()
+
+        #: Dictionary of querystring data to attach to each
+        #: :class:`Request <Request>`. The dictionary values may be lists for
+        #: representing multivalued query parameters.
+        self.params = {}
+
+        #: Stream response content default.
+        self.stream = False
+
+        #: SSL Verification default.
+        self.verify = True
+
+        #: SSL certificate default.
+        self.cert = None
+
+        #: Maximum number of redirects allowed. If the request exceeds this
+        #: limit, a :class:`TooManyRedirects` exception is raised.
+        self.max_redirects = DEFAULT_REDIRECT_LIMIT
+
+        #: Trust environment settings for proxy configuration, default
+        #: authentication and similar.
+        self.trust_env = True
+
+        #: A CookieJar containing all currently outstanding cookies set on this
+        #: session. By default it is a
+        #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but
+        #: may be any other ``cookielib.CookieJar`` compatible object.
+        self.cookies = cookiejar_from_dict({})
+
+        # Default connection adapters.
+        self.adapters = OrderedDict()
+        self.mount('https://', HTTPAdapter())
+        self.mount('http://', HTTPAdapter())
+
+        # Only store 1000 redirects to prevent using infinite memory
+        self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE)
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
+    def prepare_request(self, request):
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for
+        transmission and returns it. The :class:`PreparedRequest` has settings
+        merged from the :class:`Request <Request>` instance and those of the
+        :class:`Session`.
+
+        :param request: :class:`Request` instance to prepare with this
+            session's settings.
+        """
+        cookies = request.cookies or {}
+
+        # Bootstrap CookieJar.
+        if not isinstance(cookies, cookielib.CookieJar):
+            cookies = cookiejar_from_dict(cookies)
+
+        # Merge with session cookies
+        merged_cookies = merge_cookies(
+            merge_cookies(RequestsCookieJar(), self.cookies), cookies)
+
+
+        # Set environment's basic authentication if not explicitly set.
+        auth = request.auth
+        if self.trust_env and not auth and not self.auth:
+            auth = get_netrc_auth(request.url)
+
+        p = PreparedRequest()
+        p.prepare(
+            method=request.method.upper(),
+            url=request.url,
+            files=request.files,
+            data=request.data,
+            json=request.json,
+            headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict),
+            params=merge_setting(request.params, self.params),
+            auth=merge_setting(auth, self.auth),
+            cookies=merged_cookies,
+            hooks=merge_hooks(request.hooks, self.hooks),
+        )
+        return p
+
+    def request(self, method, url,
+        params=None,
+        data=None,
+        headers=None,
+        cookies=None,
+        files=None,
+        auth=None,
+        timeout=None,
+        allow_redirects=True,
+        proxies=None,
+        hooks=None,
+        stream=None,
+        verify=None,
+        cert=None,
+        json=None):
+        """Constructs a :class:`Request <Request>`, prepares it and sends it.
+        Returns :class:`Response <Response>` object.
+
+        :param method: method for the new :class:`Request` object.
+        :param url: URL for the new :class:`Request` object.
+        :param params: (optional) Dictionary or bytes to be sent in the query
+            string for the :class:`Request`.
+        :param data: (optional) Dictionary, bytes, or file-like object to send
+            in the body of the :class:`Request`.
+        :param json: (optional) json to send in the body of the
+            :class:`Request`.
+        :param headers: (optional) Dictionary of HTTP Headers to send with the
+            :class:`Request`.
+        :param cookies: (optional) Dict or CookieJar object to send with the
+            :class:`Request`.
+        :param files: (optional) Dictionary of ``'filename': file-like-objects``
+            for multipart encoding upload.
+        :param auth: (optional) Auth tuple or callable to enable
+            Basic/Digest/Custom HTTP Auth.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple
+        :param allow_redirects: (optional) Set to True by default.
+        :type allow_redirects: bool
+        :param proxies: (optional) Dictionary mapping protocol or protocol and
+            hostname to the URL of the proxy.
+        :param stream: (optional) whether to immediately download the response
+            content. Defaults to ``False``.
+        :param verify: (optional) whether the SSL cert will be verified.
+            A CA_BUNDLE path can also be provided. Defaults to ``True``.
+        :param cert: (optional) if String, path to ssl client cert file (.pem).
+            If Tuple, ('cert', 'key') pair.
+        """
+        # Create the Request.
+        req = Request(
+            method = method.upper(),
+            url = url,
+            headers = headers,
+            files = files,
+            data = data or {},
+            json = json,
+            params = params or {},
+            auth = auth,
+            cookies = cookies,
+            hooks = hooks,
+        )
+        prep = self.prepare_request(req)
+
+        proxies = proxies or {}
+
+        settings = self.merge_environment_settings(
+            prep.url, proxies, stream, verify, cert
+        )
+
+        # Send the request.
+        send_kwargs = {
+            'timeout': timeout,
+            'allow_redirects': allow_redirects,
+        }
+        send_kwargs.update(settings)
+        resp = self.send(prep, **send_kwargs)
+
+        return resp
+
+    def get(self, url, **kwargs):
+        """Sends a GET request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('GET', url, **kwargs)
+
+    def options(self, url, **kwargs):
+        """Sends a OPTIONS request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('OPTIONS', url, **kwargs)
+
+    def head(self, url, **kwargs):
+        """Sends a HEAD request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        kwargs.setdefault('allow_redirects', False)
+        return self.request('HEAD', url, **kwargs)
+
+    def post(self, url, data=None, json=None, **kwargs):
+        """Sends a POST request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param json: (optional) json to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('POST', url, data=data, json=json, **kwargs)
+
+    def put(self, url, data=None, **kwargs):
+        """Sends a PUT request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('PUT', url, data=data, **kwargs)
+
+    def patch(self, url, data=None, **kwargs):
+        """Sends a PATCH request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('PATCH', url,  data=data, **kwargs)
+
+    def delete(self, url, **kwargs):
+        """Sends a DELETE request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        """
+
+        return self.request('DELETE', url, **kwargs)
+
+    def send(self, request, **kwargs):
+        """Send a given PreparedRequest."""
+        # Set defaults that the hooks can utilize to ensure they always have
+        # the correct parameters to reproduce the previous request.
+        kwargs.setdefault('stream', self.stream)
+        kwargs.setdefault('verify', self.verify)
+        kwargs.setdefault('cert', self.cert)
+        kwargs.setdefault('proxies', self.proxies)
+
+        # It's possible that users might accidentally send a Request object.
+        # Guard against that specific failure case.
+        if not isinstance(request, PreparedRequest):
+            raise ValueError('You can only send PreparedRequests.')
+
+        checked_urls = set()
+        while request.url in self.redirect_cache:
+            checked_urls.add(request.url)
+            new_url = self.redirect_cache.get(request.url)
+            if new_url in checked_urls:
+                break
+            request.url = new_url
+
+        # Set up variables needed for resolve_redirects and dispatching of hooks
+        allow_redirects = kwargs.pop('allow_redirects', True)
+        stream = kwargs.get('stream')
+        hooks = request.hooks
+
+        # Get the appropriate adapter to use
+        adapter = self.get_adapter(url=request.url)
+
+        # Start time (approximately) of the request
+        start = datetime.utcnow()
+
+        # Send the request
+        r = adapter.send(request, **kwargs)
+
+        # Total elapsed time of the request (approximately)
+        r.elapsed = datetime.utcnow() - start
+
+        # Response manipulation hooks
+        r = dispatch_hook('response', hooks, r, **kwargs)
+
+        # Persist cookies
+        if r.history:
+
+            # If the hooks create history then we want those cookies too
+            for resp in r.history:
+                extract_cookies_to_jar(self.cookies, resp.request, resp.raw)
+
+        extract_cookies_to_jar(self.cookies, request, r.raw)
+
+        # Redirect resolving generator.
+        gen = self.resolve_redirects(r, request, **kwargs)
+
+        # Resolve redirects if allowed.
+        history = [resp for resp in gen] if allow_redirects else []
+
+        # Shuffle things around if there's history.
+        if history:
+            # Insert the first (original) request at the start
+            history.insert(0, r)
+            # Get the last request made
+            r = history.pop()
+            r.history = history
+
+        if not stream:
+            r.content
+
+        return r
+
+    def merge_environment_settings(self, url, proxies, stream, verify, cert):
+        """Check the environment and merge it with some settings."""
+        # Gather clues from the surrounding environment.
+        if self.trust_env:
+            # Set environment's proxies.
+            env_proxies = get_environ_proxies(url) or {}
+            for (k, v) in env_proxies.items():
+                proxies.setdefault(k, v)
+
+            # Look for requests environment configuration and be compatible
+            # with cURL.
+            if verify is True or verify is None:
+                verify = (os.environ.get('REQUESTS_CA_BUNDLE') or
+                          os.environ.get('CURL_CA_BUNDLE'))
+
+        # Merge all the kwargs.
+        proxies = merge_setting(proxies, self.proxies)
+        stream = merge_setting(stream, self.stream)
+        verify = merge_setting(verify, self.verify)
+        cert = merge_setting(cert, self.cert)
+
+        return {'verify': verify, 'proxies': proxies, 'stream': stream,
+                'cert': cert}
+
+    def get_adapter(self, url):
+        """Returns the appropriate connection adapter for the given URL."""
+        for (prefix, adapter) in self.adapters.items():
+
+            if url.lower().startswith(prefix):
+                return adapter
+
+        # Nothing matches :-/
+        raise InvalidSchema("No connection adapters were found for '%s'" % url)
+
+    def close(self):
+        """Closes all adapters and as such the session"""
+        for v in self.adapters.values():
+            v.close()
+
+    def mount(self, prefix, adapter):
+        """Registers a connection adapter to a prefix.
+
+        Adapters are sorted in descending order by key length."""
+
+        self.adapters[prefix] = adapter
+        keys_to_move = [k for k in self.adapters if len(k) < len(prefix)]
+
+        for key in keys_to_move:
+            self.adapters[key] = self.adapters.pop(key)
+
+    def __getstate__(self):
+        state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__)
+        state['redirect_cache'] = dict(self.redirect_cache)
+        return state
+
+    def __setstate__(self, state):
+        redirect_cache = state.pop('redirect_cache', {})
+        for attr, value in state.items():
+            setattr(self, attr, value)
+
+        self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE)
+        for redirect, to in redirect_cache.items():
+            self.redirect_cache[redirect] = to
+
+
+def session():
+    """Returns a :class:`Session` for context-management."""
+
+    return Session()
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/api.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/api.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib/requests/api.py	(revision 1126)
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.api
+~~~~~~~~~~~~
+
+This module implements the Requests API.
+
+:copyright: (c) 2012 by Kenneth Reitz.
+:license: Apache2, see LICENSE for more details.
+
+"""
+
+from . import sessions
+
+
+def request(method, url, **kwargs):
+    """Constructs and sends a :class:`Request <Request>`.
+
+    :param method: method for the new :class:`Request` object.
+    :param url: URL for the new :class:`Request` object.
+    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
+    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
+    :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': ('filename', fileobj)}``) for multipart encoding upload.
+    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
+    :param timeout: (optional) How long to wait for the server to send data
+        before giving up, as a float, or a :ref:`(connect timeout, read
+        timeout) <timeouts>` tuple.
+    :type timeout: float or tuple
+    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+    :type allow_redirects: bool
+    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
+    :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``.
+    :param stream: (optional) if ``False``, the response content will be immediately downloaded.
+    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.request('GET', 'http://httpbin.org/get')
+      <Response [200]>
+    """
+
+    # By using the 'with' statement we are sure the session is closed, thus we
+    # avoid leaving sockets open which can trigger a ResourceWarning in some
+    # cases, and look like a memory leak in others.
+    with sessions.Session() as session:
+        return session.request(method=method, url=url, **kwargs)
+
+
+def get(url, params=None, **kwargs):
+    """Sends a GET request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('get', url, params=params, **kwargs)
+
+
+def options(url, **kwargs):
+    """Sends a OPTIONS request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('options', url, **kwargs)
+
+
+def head(url, **kwargs):
+    """Sends a HEAD request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', False)
+    return request('head', url, **kwargs)
+
+
+def post(url, data=None, json=None, **kwargs):
+    """Sends a POST request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('post', url, data=data, json=json, **kwargs)
+
+
+def put(url, data=None, **kwargs):
+    """Sends a PUT request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('put', url, data=data, **kwargs)
+
+
+def patch(url, data=None, **kwargs):
+    """Sends a PATCH request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('patch', url,  data=data, **kwargs)
+
+
+def delete(url, **kwargs):
+    """Sends a DELETE request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('delete', url, **kwargs)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/libs.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/libs.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/libs.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Folder
+name = libs
+description =
+createdBy =
+version =
+
+[Folder]
+path = ../lib
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools-scripting-console-jython.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools-scripting-console-jython.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools-scripting-console-jython.inf	(revision 1126)
@@ -0,0 +1,10 @@
+[Unit]
+name = tools-scripting-console-jython
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_provincias.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_provincias.dbf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.shx
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.shx
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_provincias.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_provincias.shx
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/01.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/01.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/10.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/10.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/02.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/02.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/11.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/11.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/03.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/03.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/12.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/12.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/04.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/04.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/13.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/13.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/05.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/05.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/14.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/14.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/06.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/06.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/15.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/15.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/16.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/16.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/07.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/07.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/08.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/08.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/17.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/17.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/18.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/18.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/09.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/09.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/19.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos/19.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream


Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/Espana_comunidades_logos
___________________________________________________________________
Added: svn:ignore
   + .directory


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream
Added: svn:executable
   + *

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.dbf
___________________________________________________________________
Added: svn:executable
   + *
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.txt	(revision 1126)
@@ -0,0 +1,8 @@
+Esta informacion ha sido extraida del Instituto Cartográfico Valenciano
+y posteriormente se han simplificado los poligonos para reducir su "peso".
+Tras esto, el fichero es solo valido a efectos didacticos para los ejemplos
+del plugin de scripting.
+Fichero original: cv05_3d_polygons
+Sistema de referencia: EPSG 23030
+Enlace: http://www.icv.gva.es/
+ 
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/country_simpl.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/country_simpl.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.shx
___________________________________________________________________
Added: svn:executable
   + *
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/country_simpl.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/country_simpl.dbf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.prj
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.prj	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.prj	(revision 1126)
@@ -0,0 +1 @@
+PROJCS["ED50 / UTM zone 30N",GEOGCS["ED50",DATUM["European_Datum_1950",SPHEROID["International 1924",6378388,297,AUTHORITY["EPSG","7022"]],TOWGS84[-87,-98,-121,0,0,0,0],AUTHORITY["EPSG","6230"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4230"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","23030"]]
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.dbf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.dbf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/country_simpl.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/country_simpl.shx
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_pob.shx
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.prj
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.prj	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.prj	(revision 1126)
@@ -0,0 +1 @@
+PROJCS["ED50 / UTM zone 30N",GEOGCS["ED50",DATUM["European_Datum_1950",SPHEROID["International 1924",6378388,297,AUTHORITY["EPSG","7022"]],TOWGS84[-87,-98,-121,0,0,0,0],AUTHORITY["EPSG","6230"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4230"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","23030"]]
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_puntos.dbf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.dbf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.prj
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.prj	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/manzanas_parcelas.prj	(revision 1126)
@@ -0,0 +1 @@
+PROJCS["ED50 / UTM zone 30N",GEOGCS["ED50",DATUM["European_Datum_1950",SPHEROID["International 1924",6378388,297,AUTHORITY["EPSG","7022"]],TOWGS84[-87,-98,-121,0,0,0,0],AUTHORITY["EPSG","6230"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4230"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","23030"]]
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/polygons_with_elevation.shx
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_provincias.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_provincias.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.txt
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.txt	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.txt	(revision 1126)
@@ -0,0 +1,6 @@
+Capa shp de las comunidades auutonomas de España.
+Nombre: esp_comaut
+Tipo: Polígono
+EPSG: 23030
+Nº archivos de la capa: 5
+Formatos de los archivos: .dbf, .sbn, .sbx, .shp, .shx.
\ No newline at end of file

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data/esp_comaut.txt
___________________________________________________________________
Added: svn:executable
   + *


Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/data
___________________________________________________________________
Added: svn:ignore
   + .directory


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/TOC/addTOCEntry.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/TOC/addTOCEntry.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/TOC/addTOCEntry.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = addTOCEntry
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/TOC/addTOCEntry.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/TOC/addTOCEntry.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/TOC/addTOCEntry.py	(revision 1126)
@@ -0,0 +1,24 @@
+# encoding: utf-8
+
+from gvsig.commonsdialog import msgbox
+
+from org.gvsig.app import ApplicationLocator
+from org.gvsig.andami import PluginsLocator
+from org.gvsig.app.project.documents.view import ViewManager
+from org.gvsig.scripting.app.extension import ScriptingExtension
+
+def main():
+  application = ApplicationLocator.getManager()
+
+  # Creamos la accion si no existe ya
+  actionManager = PluginsLocator.getActionInfoManager()
+  action = actionManager.createAction(ScriptingExtension, "tools-hello", "Hello", "hello", "tools-scripting-launcher", None, 1009000000, "Hello world")
+  action = actionManager.registerAction(action)  
+
+  # Y con ella damos de alta una accion en el TOC
+  projectManager = ApplicationLocator.getProjectManager()  
+  viewManager = projectManager.getDocumentManager(ViewManager.TYPENAME)
+  viewManager.addTOCContextAction("tools-hello")
+
+  msgbox("Insertada la entrada 'Hello' al TOC de la vista.")
+    
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = monitor_suma3
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.xml	(revision 1126)
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/gvSIG/plugins/org.gvsig.scripting.app.extension/scripts/monitor/monitor.xml</at>
+   <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Habitantes:</at>
+            <at name="height">14</at>
+            <at name="width">65</at>
+            <at name="name">lblEtiqueta</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">2</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="width">832</at>
+            <at name="name">txtSuma</at>
+            <at name="background" object="color">236,233,216</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="editable">false</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Cerrar</at>
+            <at name="height">22</at>
+            <at name="width">69</at>
+            <at name="name">btnCerrar</at>
+            <at name="actionCommand">Cerrar</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="4">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma1.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma1.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma1.py	(revision 1126)
@@ -0,0 +1,41 @@
+# encoding: utf-8
+
+from gvsig import currentLayer, currentView
+from gvsig.commonsdialog import msgbox, inputbox, QUESTION
+
+"""
+Para probar este ejemplo cargue la capa MANZANAS_POB de la carpeta
+data y seleccionela en el TOC
+"""
+
+def calcular_sumatorio(mapContext, layer, fieldname):
+  encuadre = mapContext.getViewPort().getEnvelope().getGeometry()
+  lineas = layer.getFeatureStore().getFeatureSet().iterator()
+  suma = 0
+  for linea in lineas:
+    g = linea.getDefaultGeometry()
+    if encuadre.intersects(g) :
+      suma += int(linea.get(fieldname))
+  print "Sumatorio de %s: %s" % (fieldname, suma)
+
+def main(*args):
+  if currentView() == None:
+    msgbox("Debera tener una vista abierta y activa")
+    return
+  mapContext = currentView().getMapContext()
+ 
+  layer = currentLayer()
+  if layer == None:
+    msgbox("Debera tener seleccionada la capa sobre la que desea trabajar")
+    return
+  fieldname = inputbox(
+    "Introduzca el nombre del campo para calcular el sumatorio",
+    "Nombre de campo",
+    QUESTION,
+    "pob_total"
+  )
+  if fieldname in ("",None):
+    msgbox("Operacion cancelada")
+    return
+  calcular_sumatorio(mapContext, layer, fieldname)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma2.py	(revision 1126)
@@ -0,0 +1,66 @@
+# encoding: utf-8
+
+from gvsig import currentView, currentLayer
+from gvsig.commonsdialog import msgbox, inputbox, QUESTION
+
+from org.gvsig.fmap.mapcontext.events.listeners import ViewPortListener
+
+"""
+Para probar este ejemplo cargue la capa MANZANAS_POB de la carpeta
+data y seleccionela en el TOC
+
+Ojo!!!!, que este script añade un listener que no elimina nunca,
+con lo que para abortarlo tendremos que cerrar la vista y eliminarla
+del proyecto.
+Usar este script solo con fines didacticos.
+
+"""
+
+class MonitorSuma(ViewPortListener):
+
+  def __init__(self, mapContext, layer, fieldname):
+    self.mapContext = mapContext
+    self.layer = layer
+    self.fieldname = fieldname
+    self.calcular_sumatorio()
+    mapContext.getViewPort().addViewPortListener(self)
+
+  def backColorChanged(self,*args):
+    pass
+
+  def extentChanged(self,*args):
+    self.calcular_sumatorio()
+
+  def projectionChanged(self,*args):
+    pass
+
+  def calcular_sumatorio(self):
+    encuadre = self.mapContext.getViewPort().getEnvelope().getGeometry()
+    lineas = self.layer.getFeatureStore().getFeatureSet().iterator()
+    suma = 0
+    for linea in lineas:
+      g = linea.getDefaultGeometry()
+      if encuadre.intersects(g) :
+        suma += int(linea.get(self.fieldname))
+    print "Sumatorio de %s: %s" % (self.fieldname, suma)
+
+def main(*args):
+  if currentView() == None:
+    msgbox("Debera tener una vista abierta y activa")
+    return
+  mapContext = currentView().getMapContext()
+ 
+  layer = currentLayer()
+  if layer == None:
+    msgbox("Debera tener seleccionada la capa sobre la que desea trabajar")
+    return
+  fieldname = inputbox(
+    "Introduzca el nombre del campo para calcular el sumatorio",
+    "Nombre de campo",
+    QUESTION,
+    "pob_total"
+  )
+  if fieldname in ("",None):
+    msgbox("Operacion cancelada")
+    return
+  monitor = MonitorSuma(mapContext, layer, fieldname)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma3.py	(revision 1126)
@@ -0,0 +1,77 @@
+# encoding: utf-8
+
+from gvsig import currentView, currentLayer, getResource
+from gvsig.commonsdialog import msgbox, inputbox, QUESTION
+import os
+
+"""
+Para probar este ejemplo cargue la capa MANZANAS_POB de la carpeta
+data y seleccionela en el TOC
+"""
+
+from org.gvsig.fmap.mapcontext.events.listeners import ViewPortListener
+
+
+from gvsig.libs.formpanel import ProgressBarWithTaskStatus, FormPanel 
+
+class MonitorSuma(ViewPortListener,FormPanel):
+
+  def __init__(self, mapContext, layer, label, fieldname):
+    FormPanel.__init__(self, os.path.join(os.path.dirname(__file__), "monitor_suma3.xml"))
+    
+    self.mapContext = mapContext
+    self.layer = layer
+    self.fieldname = fieldname
+    self.lblEtiqueta.setText(label)
+    self.calcular_sumatorio()
+    mapContext.getViewPort().addViewPortListener(self)
+
+  def btnCerrar_click(self,*args):
+    self.mapContext.getViewPort().removeViewPortListener(self)
+    self.hide()
+    
+  def backColorChanged(self,*args):
+    pass
+
+  def extentChanged(self,*args):
+    self.calcular_sumatorio()
+
+  def projectionChanged(self,*args):
+    pass
+
+  def calcular_sumatorio(self):
+    encuadre = self.mapContext.getViewPort().getEnvelope().getGeometry()
+    lineas = self.layer.getFeatureStore().getFeatureSet().iterator()
+    suma = 0
+    for linea in lineas:
+      g = linea.getDefaultGeometry()
+      if encuadre.intersects(g) :
+        suma += int(linea.get(self.fieldname))
+    self.txtSuma.setText(str(suma))
+
+def main(*args):
+  if currentView() == None:
+    msgbox("Debera tener una vista abierta y activa")
+    return
+  mapContext = currentView().getMapContext()
+ 
+  layer = currentLayer()
+  if layer == None:
+    msgbox("Debera tener seleccionada la capa sobre la que desea trabajar")
+    return
+  fieldname = inputbox(
+    "Introduzca el nombre del campo para calcular el sumatorio",
+    "Nombre de campo",
+    QUESTION,
+    "pob_total"
+  )
+  if fieldname in ("",None):
+    msgbox("Operacion cancelada")
+    return
+  label = inputbox("Introduzca una etiqueta para el sumatorio de '%s':" % fieldname,
+    "Etiqueta",
+    QUESTION,
+    fieldname
+  )
+  monitor = MonitorSuma(mapContext, layer, label, fieldname)
+  monitor.showTool("monitor")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma1.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma1.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma1.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = monitor_suma1
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma2.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma2.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/monitor/monitor_suma2.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = monitor_suma2
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/proceso_desplazamientoxy.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/proceso_desplazamientoxy.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/proceso_desplazamientoxy.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = proceso_desplazamientoxy
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/data/puntos.shx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/data/puntos.shx
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/data/puntos.shp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/data/puntos.shp
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/data/puntos.dbf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/data/puntos.dbf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/proceso_desplazamientoxy.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/proceso_desplazamientoxy.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geoprocess/proceso_desplazamientoxy.py	(revision 1126)
@@ -0,0 +1,105 @@
+
+
+from gvsig import *
+from gvsig.commonsdialog import *
+
+from gvsig.libs.toolbox import *
+
+   
+class XYShift(ToolboxProcess):
+  
+  def defineCharacteristics(self):
+    """
+En esta operacion debemos definir los parametros de netrada y salida que va a precisar nuetro proceso.
+    """
+    # Fijamos el nombre con el que se va a mostrar nuestro proceso
+    self.setName("Prueba desplazamiento en X e Y")
+    
+    # Indicamos el grupo en el que aparecera
+    self.setGroup("Vectorial")
+        
+    params = self.getParameters()
+    # Indicamos que precisamos un parametro LAYER, del tipo punto y que es obligatorio
+    params.addInputVectorLayer("LAYER","Caoa de entrada", SHAPE_TYPE_POINT,True)
+    # Indicamos que precisamos un par de valores numericos, X e Y 
+    params.addNumericalValue("X", "X_traslation",0, NUMERICAL_VALUE_DOUBLE)
+    params.addNumericalValue("Y", "Y_traslation", 0, NUMERICAL_VALUE_DOUBLE)
+    
+    # Y por ultimo indicamos que precisaremos una capa de salida de puntos.
+    self.addOutputVectorLayer("RESULT_POINT", "XYShift_point", SHAPE_TYPE_POINT)
+
+  def processAlgorithm(self):
+    """
+Esta operacion es la encargada de realizar nuetro proceso.
+    """
+    features=None
+    try:
+      """
+      Recogemos los parametros y creamos el conjunto de entidades asociadas a la capa
+      de entrada.
+      """
+      params = self.getParameters()
+      layer = params.getParameterValueAsVectorLayer("LAYER")
+      x = params.getParameterValueAsDouble("X")
+      y = params.getParameterValueAsDouble("Y")
+
+      input_store = layer.getFeatureStore()
+
+      features = input_store.getFeatureSet()
+      
+      """
+      Generamos la capa de salida con la misma estructura que la capa de entrada
+      """
+      output_store = self.buildOutPutStore(
+        features.getDefaultFeatureType(), 
+        SHAPE_TYPE_POINT,
+        "XYShift_points",
+        "RESULT_POINT"
+      )
+
+      """
+      Nos recorremos todas las entidades de entrada, y creamos las de salida desplazando la geometria
+      en los valores indicados por la X e Y de los parametros.
+      """
+      self.setRangeOfValues(0,features.getSize())
+      for feature in features.iterator():
+        if self.isCanceled():
+          # Si el usuario indico que quiere cancelar el proceso abortamos.
+          print "Proceso cancelado"
+          break
+        
+        # Incrementamos el progreso de nuestro proceso.
+        self.next()
+
+        # Creamos una nueva entidad para nuestro almacen de salida.
+        newfeature = self.createNewFeature(output_store,feature)
+
+        # Desplazamos la geometria de la nueva entidad
+        geom = newfeature.getDefaultGeometry()
+        geom.move(x,y)
+        
+        # Guardamos la nueva entidad
+        output_store.insert(newfeature)
+
+      # Cuando hemos terminado de recorrernos las entidades terminamos la edicion.
+      output_store.finishEditing()   
+      
+    finally:
+      DisposeUtils.disposeQuietly(features)
+      print "Proceso terminado %s" % self.getCommandLineName() 
+      return True
+    
+
+def main(*args):
+    # Creamos nuesto geoproceso
+    process = XYShift()
+    # Lo registramos entre los procesos disponibles en el grupo de "Scripting"
+    process.selfregister("Scripting")
+    # Actualizamos el interface de usuario de la Toolbox
+    process.updateToolbox()
+    msgbox("Incorporado el script '%s/%s/%s' a la paleta de geoprocesos." % (
+        "Scripting",
+        process.getGroup(),
+        process.getName()
+      )
+    )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/addMenuAndButton.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/addMenuAndButton.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/addMenuAndButton.py	(revision 1126)
@@ -0,0 +1,23 @@
+
+from gvsig import *
+
+from gvsig.commonsdialog import msgbox
+
+from org.gvsig.andami import PluginsLocator
+from org.gvsig.scripting.app.extension import ScriptingExtension
+
+def main():
+  application = ApplicationLocator.getManager()
+
+  # Creamos la accion si no existe ya  
+  actionManager = PluginsLocator.getActionInfoManager()
+  action = actionManager.createAction(ScriptingExtension, "tools-hello", "Hello", "hello", "tools-scripting-launcher", None, 1009000000, "Hello world")
+  action = actionManager.registerAction(action)
+
+  # Y damos de alta una entra de menu y un boton en la barra de herramientas
+  application.addMenu(action, "tools/Hello")
+  application.addTool(action, "hello")
+
+  msgbox("Insertada la entrada 'Hello' en el menu 'Herramientas' y un boton en la barra de botones.")
+    
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/addMenuAndButton.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/addMenuAndButton.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/addMenuAndButton.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = addMenuAndButton
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/hello.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/hello.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/hello.py	(revision 1126)
@@ -0,0 +1,9 @@
+
+from gvsig import *
+from gvsig.commonsdialog import msgbox
+
+def main(*args):
+    msgbox("Hello world!")
+    
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/hello.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/hello.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/menusAndButtons/hello.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = hello
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/data/proyecto_1.gvsproj
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/data/proyecto_1.gvsproj
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.xml	(revision 1126)
@@ -0,0 +1,995 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/gvSIG/plugins/org.gvsig.scripting.app.extension/scripts/layout/personalizar_mapa3.jfrm</at>
+   <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">3</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JComboBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JComboBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="width">901</at>
+            <at name="name">cboMapas</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">5</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Tag para identificar a la vista</at>
+            <at name="height">14</at>
+            <at name="width">901</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JComboBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JComboBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="width">901</at>
+            <at name="name">cboTagVista</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Tag para identificar al titulo</at>
+            <at name="height">14</at>
+            <at name="width">901</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">3</at>
+           <at name="row">20</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Actualizar mapa</at>
+            <at name="height">22</at>
+            <at name="width">122</at>
+            <at name="name">btnActualizarMapa</at>
+            <at name="actionCommand">Crear PDF</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">20</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Cerrar</at>
+            <at name="height">22</at>
+            <at name="width">69</at>
+            <at name="name">btnCerrar</at>
+            <at name="actionCommand">Cerrar</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Seleccione el mapa a usar como plantilla</at>
+            <at name="height">14</at>
+            <at name="width">901</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">9</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JComboBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JComboBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="width">901</at>
+            <at name="name">cboTagTitulo</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">11</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Tag para identificar al logotipo</at>
+            <at name="height">14</at>
+            <at name="width">901</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">12</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JComboBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JComboBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="items">
+             <object classname="com.jeta.forms.store.properties.ItemsProperty">
+              <at name="name">items</at>
+             </object>
+            </at>
+            <at name="width">901</at>
+            <at name="name">cboTagLogotipo</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">14</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Expresion para componer el titulo</at>
+            <at name="height">14</at>
+            <at name="width">901</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">15</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="selectionEnd">31</at>
+            <at name="text">&quot;Provincias de....&quot; +  NAMEUNIT</at>
+            <at name="height">20</at>
+            <at name="width">901</at>
+            <at name="name">txtTitulo</at>
+            <at name="selectionStart">31</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">17</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Expresion para componer la rurta al logotipo</at>
+            <at name="height">14</at>
+            <at name="width">901</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">18</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="selectionEnd">37</at>
+            <at name="text">&quot;datos/logos/&quot;+ NATCODE[2:4] + &quot;.png&quot;</at>
+            <at name="height">20</at>
+            <at name="width">901</at>
+            <at name="name">txtLogotipo</at>
+            <at name="selectionStart">37</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="21">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="9">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="10">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="11">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="12">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="13">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="14">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="15">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="16">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="17">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="18">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="19">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+       <at name="item" index="20">
+        <object classname="[Ljava.lang.Object;" size="7"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/cargar_proyecto.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/cargar_proyecto.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/cargar_proyecto.py	(revision 1126)
@@ -0,0 +1,8 @@
+
+from gvsig.libs.load_project import  load_project
+
+def main(*args):
+  load_project(
+    script.getResource("datos/proyecto_1.gvsproj")
+  )
+  
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/cargar_proyecto.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/cargar_proyecto.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/cargar_proyecto.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = cargar_proyecto
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa1.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa1.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa1.py	(revision 1126)
@@ -0,0 +1,52 @@
+
+from gvsig.uselib import use_plugin
+
+use_plugin("org.gvsig.app.document.layout2.app.mainplugin")
+
+from gvsig import *
+from org.gvsig.app.project.documents.layout import DefaultLayoutManager
+from javax.imageio import ImageIO
+
+def main(*args):
+
+  # Obtenemos la capa activa de la vista activa
+  capa = currentLayer()
+
+  # Obtenemos el primer elemento seleccionado de la capa
+  seleccion = list()
+  seleccion.extend(capa.getSelection())
+  entidad = seleccion[0]
+
+  # Obtenemos el encuadre del elemento seleccionado,
+  # el rotulo y el logo a mostrar en el mapa.
+  encuadre = entidad.geometry().getEnvelope()
+  titulo = "Provincias de %s %s" % (entidad.NAMEUNIT, entidad.NATCODE[2:4])
+  logo = ImageIO.read(script.getResource("datos/logos/"+ entidad.NATCODE[2:4]+".png"))
+  
+  # Obtenemos el objeto que se corresponde con el proyecto.
+  proyecto = currentProject()() # Ojo con los dobles perentesis
+
+  # Localizamos el mapa de nombre "Plantilla" de entre los documentos del proyecto
+  plantilla = proyecto.getDocument("Plantilla",DefaultLayoutManager.TYPENAME )
+
+  context = plantilla.getLayoutContext()
+
+  # Nos recorremos todos los elementos del mapa buscando los que hemos etiquetado
+  for elemento in  context.getAllFFrames():
+    if elemento.getTag() == "Vista":
+      # Ajustamos el encuadre de la vista al del elemento seleccionado
+      mapContext = elemento.getMapContext()
+      mapContext.getViewPort().setEnvelope(encuadre)
+      mapContext.invalidate()
+      
+    elif elemento.getTag() == "Titulo":
+      # Cambiamos el rotulo del texto que habiamos etiquetado en el mapa  
+      elemento.clearText() 
+      elemento.addText(titulo)
+
+    elif elemento.getTag() == "Logotipo":
+      # Cambiamos la imagen del logotipo
+      elemento.setImage(logo)
+
+  context.fullRefresh() 
+  
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa2.py	(revision 1126)
@@ -0,0 +1,58 @@
+
+from gvsig.uselib import use_plugin
+
+use_plugin("org.gvsig.app.document.layout2.app.mainplugin")
+
+from gvsig import *
+from org.gvsig.app.project.documents.layout import DefaultLayoutManager
+from javax.imageio import ImageIO
+
+
+def actualizar_mapa(mapa, tagVista, tagTitulo, tagLogo, encuadre, titulo, logo):
+  context = mapa.getLayoutContext()
+
+  # Nos recorremos todos los elementos del mapa buscando los que hemos etiquetado
+  for elemento in  context.getAllFFrames():
+    if elemento.getTag() == tagVista:
+      # Ajustamos el encuadre de la vista al del elemento seleccionado
+      mapContext = elemento.getMapContext()
+      mapContext.getViewPort().setEnvelope(encuadre)
+      mapContext.invalidate()
+      
+    elif elemento.getTag() == tagTitulo:
+      # Cambiamos el rotulo del texto que habiamos etiquetado en el mapa  
+      elemento.clearText() 
+      elemento.addText(titulo)
+
+    elif elemento.getTag() == tagLogo:
+      # Cambiamos la imagen del logotipo
+      elemento.setImage(logo)
+
+  context.fullRefresh() 
+  
+
+
+def main(*args):
+
+  # Obtenemos la capa activa de la vista activa
+  capa = currentLayer()
+
+  # Obtenemos el primer elemento seleccionado de la capa
+  seleccion = list()
+  seleccion.extend(capa.getSelection())
+  entidad = seleccion[0]
+
+  # Obtenemos el encuadre del elemento seleccionado,
+  # el rotulo y el logo a mostrar en el mapa.
+  encuadre = entidad.geometry().getEnvelope()
+  titulo = "Provincias de %s %s" % (entidad.NAMEUNIT, entidad.NATCODE[2:4])
+  logo = ImageIO.read(script.getResource("datos/logos/"+ entidad.NATCODE[2:4]+".png"))
+  
+  # Obtenemos el objeto que se corresponde con el proyecto.
+  proyecto = currentProject()() # Ojo con los dobles perentesis
+
+  # Localizamos el mapa de nombre "Plantilla" de entre los documentos del proyecto
+  plantilla = proyecto.getDocument("Plantilla",DefaultLayoutManager.TYPENAME )
+
+  actualizar_mapa(plantilla, "Vista", "Titulo", "Logotipo", encuadre, titulo, logo)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.py	(revision 1126)
@@ -0,0 +1,111 @@
+
+from gvsig.uselib import use_plugin
+
+use_plugin("org.gvsig.app.document.layout2.app.mainplugin")
+
+from gvsig import *
+from org.gvsig.app.project.documents.layout import DefaultLayoutManager
+from gvsig.commonsdialog import *
+
+from gvsig.libs.formpanel import FormPanel 
+
+class CustomizeLayout(FormPanel):
+  def __init__(self):
+    FormPanel.__init__(self,script.getResource("personalizar_mapa3.xml"))
+    # Llenamos el desplegable de mapas con los mapas que hay en el proyecto.
+    proyecto = currentProject()()
+    docs = proyecto.getDocuments()
+    for doc in docs :
+      if doc.__class__.__name__ == "DefaultLayoutDocument":
+        cboMapas.addItem(doc)
+    pass
+    
+  def actualizar_mapa(self, mapa, tagVista, tagTitulo, tagLogo, encuadre, titulo, logo):
+    context = mapa.getLayoutContext()
+  
+    # Nos recorremos todos los elementos del mapa buscando los que hemos etiquetado
+    for elemento in  context.getAllFFrames():
+      if elemento.getTag() == tagVista:
+        # Ajustamos el encuadre de la vista al del elemento seleccionado
+        mapContext = elemento.getMapContext()
+        mapContext.getViewPort().setEnvelope(encuadre)
+        mapContext.invalidate()
+  
+      elif elemento.getTag() == tagTitulo:
+        # Cambiamos el rotulo del texto que habiamos etiquetado en el mapa
+        elemento.clearText()
+        elemento.addText(titulo)
+  
+      elif elemento.getTag() == tagLogo:
+        # Cambiamos la imagen del logotipo
+        elemento.setImage(logo)
+  
+    context.fullRefresh()
+
+  def btnCerrar_click(*args):
+    self.hide()
+  
+  def cboMapas_click(*args):
+    mapa = self.cboMapas.getSelectedItem()
+  
+    cboTagVista = self.cboTagVista
+    cboTagTitulo = self.cboTagTitulo
+    cboTagLogotipo= self.cboTagLogotipo
+  
+    for elemento in  mapa.getLayoutContext().getAllFFrames():
+      #print elemento.__class__.__name__
+      if not elemento.getTag() in (None, ""):
+        if elemento.__class__.__name__ == "FFrameText":
+          self.cboTagTitulo.addItem(elemento.getTag())
+  
+        elif elemento.__class__.__name__ == "FFrameView":
+          self.cboTagVista.addItem(elemento.getTag())
+  
+        elif elemento.__class__.__name__ == "FFramePicture":
+          self.cboTagLogotipo.addItem(elemento.getTag())
+  
+  
+  def btnActualizarMapa_click(*args):
+    # Obtenemos la capa activa de la vista activa
+    capa = currentLayer()
+    if capa == None:
+      msgbox("Debera tener seleccionada una capa.")
+      return
+  
+    # Obtenemos el primer elemento seleccionado de la capa
+    seleccion = list()
+    seleccion.extend(capa.getSelection())
+    if len(seleccion) < 1:
+      msgbox("Debera tener seleccionados elementos en la capa activa.")
+      return
+    entidad = seleccion[0]
+  
+    mapa = self.cboMapas.getSelectedItem()
+    tagVista = self.cboTagVista.getSelectedItem()
+    tagTitulo = self.cboTagTitulo.getSelectedItem()
+    tagLogotipo = self.cboTagLogotipo.getSelectedItem()
+    if tagVista in ("",None) or tagTitulo in ("",None) :
+      msgbox("Debera seleccionar el tag de la vista, titulo y logotipo")
+      return
+  
+    encuadre = entidad.geometry().getEnvelope()
+    try:
+      titulo = eval(self.txtTitulo.getText(), entidad)
+    except:
+      titulo = self.txtTitulo.getText()
+  
+    try:
+      logotipo_nombre = eval(self.txtLogotipo.getText(), entidad)
+      logotipo = load_image(script.getResource(logotipo_nombre))
+    except:
+      logotipo = None
+  
+    self.actualizar_mapa(mapa, tagVista, tagTitulo, tagLogotipo, encuadre, titulo, logotipo)
+
+
+
+def main(*args):
+  customizeLayout = CustomizeLayout()
+  customizeLayout.showTool("Customize layout")
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa1.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa1.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa1.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = personalizar_mapa1
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa2.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa2.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa2.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = personalizar_mapa2
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/layout/personalizar_mapa3.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = personalizar_mapa3
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/01_maximun_and_minimun_elevation.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/01_maximun_and_minimun_elevation.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/01_maximun_and_minimun_elevation.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+name = 01_maximun_and_minimun_elevation
+description = This script runs all the features of the active layer, and calculates the \nmaximum and minimum elevation these, and with this:\n    - Submit a message informing the user which are\n  \nIf no ELEVATION field shows a message and finish script execution.\n  \nIn the data folder can be found cv05_3d_polygons layer used\nfor testing with this script
+createdBy = vacavedo
+version = 
+type = Script
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/03_maximun_and_minimun_elevation_geometries.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/03_maximun_and_minimun_elevation_geometries.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/03_maximun_and_minimun_elevation_geometries.py	(revision 1126)
@@ -0,0 +1,108 @@
+# encoding: utf-8
+
+import gvsig
+from gvsig import commonsdialog
+
+from java.awt import Color
+
+"""
+Este script se recorre todas la features de la capa activa, y asumiendo
+que tiene un campo ELEVATION, calcula la elevacion maxima y minima de 
+estas, y con esto:
+- Presentar un mensaje al usuario informando de cuales son
+- Seleccionar las geometrias asociadas a la elevacion maxima y minima vista.
+- Pone un punto en el centro de las geometrias de elevacion maxima y minima.
+
+En la carpeta data puede encontrar la capa polygons_with_elevation usada
+para realizar las pruebas con este scripts.
+"""
+
+def main(): 
+  """
+  This script runs all the features of the active layer, and calculates the 
+  maximum and minimum elevation these, and with this:
+    - Shows a message informing the user which are
+    - Select the geometries associated with maximum and minimum elevation. 
+    - Shows maximum and minimum elevation geometries centroid in the view 
+      graphicsLayer
+  
+  If no ELEVATION field shows a message and finish script execution.
+  
+  In the data folder can be found cv05_3d_polygons layer used
+  for testing with this script.
+  """
+  #
+  #Invoke gvsig.currentLayer function to get active layer
+  #If not view or active layer in view raise RuntimeException
+  layer = gvsig.currentLayer()
+  
+  #
+  #Invoke layer.getSchema method to get layer definition data 
+  schema = layer.getSchema()
+  
+  #
+  #Invoke schema.get method to get ELEVATION field or None
+  field = schema.get('ELEVATION', None)
+  
+  #
+  #Check if field exist
+  if not field:
+      #If not shows message and finish
+      text = '"ELEVATION" field must exist in the active layer.\nFinish script'
+      title = "ERROR"
+      message_type = commonsdialog.WARNING
+      commonsdialog.msgbox(text, title, message_type)
+      return
+      
+  acetato = gvsig.currentView().getGraphicsLayer()
+  acetato.removeGraphics("example")
+  smax = acetato.addSymbol(gvsig.utils.simplePointSymbol(Color.RED))
+  smin = acetato.addSymbol(gvsig.utils.simplePointSymbol(Color.BLUE))
+  
+  emax = 0.0
+  emin = 0.0
+  fmax = None
+  fmin = None
+
+  #
+  # Gets features using layer.features method
+  features = layer.features()
+  
+  #
+  #Runs layer features
+  for feature in features:
+    # 
+    # Cheacks if current feature ELEVATION is higher than calculated. 
+    # If so, stored current ELEVATION value and the feature instance
+    if feature.ELEVATION > emax :
+        emax = feature.ELEVATION
+        fmax = feature.getCopy()
+      
+    # Same but with minimum ELEVATION
+    if feature.ELEVATION < emin or emin ==0.0:
+        emin = feature.ELEVATION
+        fmin = feature.getCopy()
+  #
+  # Selects features in the layer.
+  if fmax!=None:
+    layer.select(fmax)
+    #
+    # gets geometry centroid to put our point with a label
+    point = fmax.geometry().centroid()
+    #
+    # Adds to graphicsLayer the point and symbol with label
+    acetato.addGraphic("example", point, smax, "Maximun Elevation")
+
+  if fmin!=None:
+    layer.getSelection().select(fmin)
+    punto = fmax.geometry().centroid()
+    acetato.addGraphic("example", punto, smin,"Minimun Elevation")
+
+  #
+  # Finally show results in a msgbox message.
+  text = "Maximum Elevation=%s, Minumun Elevation=%s" % (emax, emin)
+  title = "Maximun and minumum values"
+  message_type = commonsdialog.IDEA
+  
+  commonsdialog.msgbox(text, title, message_type)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/03_maximun_and_minimun_elevation_geometries.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/03_maximun_and_minimun_elevation_geometries.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/03_maximun_and_minimun_elevation_geometries.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+name = 03_maximun_and_minimun_elevation_geometries
+description = 
+createdBy = 
+version = 
+type = Script
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/05_crearPuntosAleatorios.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/05_crearPuntosAleatorios.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/05_crearPuntosAleatorios.py	(revision 1126)
@@ -0,0 +1,79 @@
+# encoding: utf-8
+
+import gvsig
+from gvsig import currentView
+from gvsig import createFeatureType
+from gvsig.geom import POINT, D2, createPoint
+from gvsig import createShape
+
+import random
+
+def createPointLayer():
+  #
+  # Vamos a crear los puntos sobre el area representada en la vista.
+  # usaremos la funcion random.randint de python, que solo usa enteros
+  # y devuelbe enteros, asi que usaremos valores decimales con tres
+  # decimanes representandolos como de coma fija en un entero.
+  # 
+  # 1.123 ===> 1123 
+  #
+  # Y cuando vayamos a crear los puntos con esos valores los volveremos
+  # a transformar en decimales dividienlos por 1000.0
+  #
+  
+  #
+  # Para eso, lo primero obtendremos el Envelope de la vista
+  envelope = currentView().getMapContext().getViewPort().getEnvelope()
+
+  #
+  # Calculamos los valores maximos y minimos de las coordenadas de
+  # ese envelope como valores con tres decimales en coma fija representados
+  # en un entero.
+  #  
+  minx = int(envelope.getMinimum(0) * 1000)
+  maxx = int(envelope.getMaximum(0) * 1000)
+  miny = int(envelope.getMinimum(1) * 1000)
+  maxy = int(envelope.getMaximum(1) * 1000)
+  
+  print minx, maxx
+  print miny, maxy
+
+  #
+  # Creamos un shape con solo un campo geometria de tipo
+  # punto 2D
+  schema = createFeatureType() # DefaultFeatureType
+  schema.append("GEOMETRY", "GEOMETRY")
+  schema.get("GEOMETRY").setGeometryType(POINT, D2)
+  puntos = createShape(schema, prefixname="puntos")
+
+  # 
+  # Ponemos en edicion el nuevo shape vacio
+  puntos.edit()
+  
+  # Vamos a crear 20 puntos
+  for x in range(20):
+    #
+    # Calculamos la x e y y la dividimos por 1000.0
+    # para pasarla a double.
+    x = random.randint(minx, maxx)/1000.0
+    y = random.randint(miny, maxy)/1000.0
+    # Creamos el punto
+    point = createPoint(D2,x,y)
+    # Lo añadimos a la capa de puntos
+    puntos.append( { "GEOMETRY": point } )
+  
+  #
+  # Cuando hemos añadido todos los puntos terminamos la edicion
+  puntos.finishEditing()
+  
+  # Por ultimo añadiremos la capa a la vista
+  currentView().addLayer(puntos)
+  
+  # Y mostraremos por consola la ruta en la que se ha creado la capa
+  print puntos.getDataStore().getFullName()
+  
+  return puntos
+  
+def main(*args):
+  createPointLayer()
+  
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/02_maximun_and_minimun_elevation_select_features.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/02_maximun_and_minimun_elevation_select_features.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/02_maximun_and_minimun_elevation_select_features.py	(revision 1126)
@@ -0,0 +1,77 @@
+# encoding: utf-8
+
+import gvsig
+from gvsig import commonsdialog
+
+def main(): 
+  """
+  This script runs all the features of the active layer, and calculates the 
+  maximum and minimum elevation these, and with this:
+    - Shows a message informing the user which are
+    - Select the geometries associated with maximum and minimum elevation. 
+  
+  If no ELEVATION field shows a message and finish script execution.
+  
+  In the data folder can be found polygons_with_elevation layer used
+  for testing with this script.
+  """
+  
+  #
+  #Invoke gvsig.currentLayer function to get active layer
+  #If not view or active layer in view raise RuntimeException
+  layer = gvsig.currentLayer()
+  
+  #
+  #Invoke layer.getSchema method to get layer definition data 
+  schema = layer.getSchema()
+  
+  #
+  #Invoke schema.get method to get ELEVATION field or None
+  field = schema.get('ELEVATION', None)
+  
+  #
+  #Check if field exist
+  if not field:
+      #If not shows message and finish
+      text = '"ELEVATION" field must exist in the active layer.\nFinish script'
+      title = "ERROR"
+      message_type = commonsdialog.WARNING
+      commonsdialog.msgbox(text, title, message_type)
+      return
+
+  emax = 0.0
+  emin = 0.0
+  fmax = None
+  fmin = None
+  #
+  # Gets features using layer.features method
+  features = layer.features()
+  
+  #
+  #Runs layer features
+  for feature in features:
+    # 
+    # Cheacks if current feature ELEVATION is higher than calculated. 
+    # If so, stored current ELEVATION value and the feature instance
+    if feature.ELEVATION > emax :
+        emax = feature.ELEVATION
+        fmax = feature.getCopy()
+      
+    # Same but with minimum ELEVATION
+    if feature.ELEVATION < emin or emin ==0.0:
+        emin = feature.ELEVATION
+        fmin = feature.getCopy()
+  #
+  # Selects features in the layer.
+  if fmax!=None:
+    layer.select(fmax)
+  if fmin!=None:
+    layer.select(fmin)
+  #
+  # Finally show results in a msgbox message.
+  text = "Maximum Elevation=%s, Minumun Elevation=%s" % (emax, emin)
+  title = "Maximun and minumum values"
+  message_type = commonsdialog.IDEA
+  
+  commonsdialog.msgbox(text, title, message_type)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/05_crearPuntosAleatorios.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/05_crearPuntosAleatorios.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/05_crearPuntosAleatorios.inf	(revision 1126)
@@ -0,0 +1,15 @@
+[script]
+enable = true
+isolation = 0
+
+[Unit]
+type = Script
+name = 05_crearPuntosAleatorios
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/04_add_geometry_info.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/04_add_geometry_info.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/04_add_geometry_info.py	(revision 1126)
@@ -0,0 +1,106 @@
+# encoding: utf-8
+
+from gvsig import currentLayer
+from gvsig.geom import POINT, LINE, POLYGON
+from gvsig import commonsdialog
+
+def main():
+  """
+  Modify layer data definition and adds new fields to store features geometry 
+  information.
+  If is points layer type adds 'X' 'Y' and 'Z' coordinates
+  If is lines layer type adds perimeter value
+  IF is polygons layer adds Area and perimeter values
+  """
+  #
+  #Invoke gvsig.currentLayer function to get active layer
+  #If not view or active layer in view raise RuntimeException
+  layer = currentLayer()
+  
+  # Gets layer type. If layer type is not supported shows a message, else 
+  # adds geometry information to features
+  layertype = layer.getTypeVectorLayer()
+  if layertype.isSubTypeOf(POINT):
+      addInfoToPoint(layer)
+  elif layertype.isSubTypeOf(LINE):
+      addInfoToLine(layer)
+  elif layertype.isSubTypeOf(POLYGON):
+      addInfoToPolygon(layer)
+  else:
+      text = """This layer is not supported. 
+      Layer type must be:
+        - Points
+        - Line
+        - Polygon
+      Finish script."""
+      title = "Warning"
+      messageType = commonsdialog.FORBIDEN
+      commonsdialog.msgbox(text, title, messageType)
+      
+def addInfoToPoint(layer):
+  layer.edit()
+  schema = layer.getSchema()
+  xName=generateUniqColumnName(schema,"X")
+  schema.append(xName, "Double", size=15, precision = 3)
+  yName=generateUniqColumnName(schema,"Y")
+  schema.append(yName, "Double", size=15, precision = 3)
+  zName=generateUniqColumnName(schema,"Z")
+  schema.append(zName, "Double", size=15, precision = 3)
+  layer.updateSchema(schema)
+
+  for feature in layer.features():
+    feature.edit()
+    point = feature.geometry()
+    feature.set(xName,point.getX())
+    feature.set(yName,point.getY())
+    if point.getDimension()>2:
+      feature.set(zName,point.getCoordinateAt(2))
+    layer.update(feature)
+    
+  layer.commit() 
+
+
+def addInfoToPolygon(layer):
+  layer.edit()
+  schema = layer.getSchema()
+  areaName=generateUniqColumnName(schema,"Area")
+  schema.append(areaName, "Double", size=15, precision = 3)
+  perimeterName=generateUniqColumnName(schema,"Perimeter")
+  schema.append(perimeterName, "Double", size=15, precision = 3)
+
+  layer.updateSchema(schema)
+
+  for feature in layer.features():
+    feature.edit()
+    polygon = feature.geometry()
+    feature.set(areaName,polygon.area())
+    feature.set(perimeterName,polygon.perimeter())
+
+    layer.update(feature)
+
+def addInfoToLine(layer):
+  layer.edit()
+  schema = layer.getSchema()
+  perimeterName=generateUniqColumnName(schema,"Perimeter")
+  schema.append(perimeterName, "Double", size=15, precision = 3)
+
+  layer.updateSchema(schema)
+
+  for feature in layer.features():
+    feature.edit()
+    line = feature.geometry()
+    feature.set(perimeterName,line.perimeter())
+
+    layer.update(feature)
+    
+  layer.commit() 
+
+def generateUniqColumnName(schema, name):
+   cont = 1
+   name2 = name
+   while True:
+     attr = schema.get(name2)
+     if attr == None:
+       return name2
+     cont += 1
+     name2 = "%s%s" % (name , cont)
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/01_maximun_and_minimun_elevation.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/01_maximun_and_minimun_elevation.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/01_maximun_and_minimun_elevation.py	(revision 1126)
@@ -0,0 +1,73 @@
+
+__author__ = """Victor Acevedo Royer <vacevedor@gvsig.com>, 
+<vacevedor@gmail.com>"""
+
+__docformat__ = 'plaintext'
+
+import gvsig 
+from gvsig import commonsdialog 
+
+
+
+def main(): 
+  """
+  This script runs all the features of the active layer, and calculates the 
+  maximum and minimum elevation these, and with this:
+    - Shows a message informing the user which are
+  
+  If no ELEVATION field shows a message and finish script execution.
+  
+  In the data folder can be found polygons_with_elevation layer used
+  for testing with this script.
+  """
+  
+  #
+  #Invoke gvsig.currentLayer function to get active layer
+  #If not view or active layer in view raise RuntimeException
+  layer = gvsig.currentLayer()
+  
+  #
+  #Invoke layer.getSchema method to get layer definition data 
+  schema = layer.getSchema()
+  
+  #
+  #Invoke schema.get method to get ELEVATION field or None
+  field = schema.get('ELEVATION', None)
+  
+  #
+  #Check if field exist
+  if not field:
+      #If not shows message and finish
+      text = '"ELEVATION" field must exist in the active layer.\nFinish script'
+      title = "ERROR"
+      message_type = commonsdialog.WARNING
+      commonsdialog.msgbox(text, title, message_type)
+      return
+  
+  emax = 0.0
+  emin = 0.0
+
+  #
+  # Gets features using layer.features method
+  features = layer.features()
+  
+  #
+  #Runs layer features
+  for feature in features:
+    # 
+    # Cheacks if current feature ELEVATION is higher than calculated. 
+    # If so stored current ELEVATION value
+    if feature.ELEVATION > emax :
+      emax = feature.ELEVATION
+    #
+    # Same but with minimum ELEVATION
+    if feature.ELEVATION < emin or emin ==0.0:
+      emin = feature.ELEVATION
+  #
+  # Finally show results in a msgbox message.
+  text = "Maximum Elevation=%s, Minumun Elevation=%s" % (emax, emin)
+  title = "Maximun and minumum values"
+  message_type = commonsdialog.IDEA
+  
+  commonsdialog.msgbox(text, title, message_type)
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/02_maximun_and_minimun_elevation_select_features.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/02_maximun_and_minimun_elevation_select_features.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/02_maximun_and_minimun_elevation_select_features.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+name = 02_maximun_and_minimun_elevation_select_features
+description = 
+createdBy = 
+version = 
+type = Script
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/04_add_geometry_info.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/04_add_geometry_info.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/vectorial_data/04_add_geometry_info.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+name = 04_add_geometry_info
+description = 
+createdBy = 
+version = 
+type = Script
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.xml	(revision 1126)
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/gvSIG/plugins/org.gvsig.scripting.app.mainplugin/scripts/coordenadas/coordenadas.xml</at>
+   <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:200PX:NONE,FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">X</at>
+            <at name="height">14</at>
+            <at name="width">12</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Y</at>
+            <at name="height">14</at>
+            <at name="width">12</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="width">196</at>
+            <at name="name">txtX</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="width">196</at>
+            <at name="name">txtY</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">right</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Cerrar</at>
+            <at name="height">22</at>
+            <at name="width">69</at>
+            <at name="name">btnCerrar</at>
+            <at name="actionCommand">Cerrar</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="7">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="5"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.py	(revision 1126)
@@ -0,0 +1,51 @@
+# encoding: utf-8
+
+from gvsig import *
+
+from org.gvsig.fmap import IconThemeHelper
+from org.gvsig.fmap.mapcontrol.tools.Listeners import PointListener
+from org.gvsig.fmap.mapcontrol.tools.Behavior import PointBehavior
+from org.gvsig.app.project.documents.view import ViewManager
+
+from gvsig.libs.formpanel import FormPanel
+
+class Coordenadas(FormPanel, PointListener):
+  def __init__(self, viewdoc):
+    FormPanel.__init__(self, script.getResource("coordenadas.xml"))
+    self.viewdoc = viewdoc
+    self.mapControl = self.viewdoc.getWindowOfView().getMapControl()
+    self.mapControl.addBehavior("TestGetXYPointTool", PointBehavior(self))
+    self.mapControl.setTool("TestGetXYPointTool")
+
+  def getWindowOfView(self, viewdoc):
+    application = ApplicationLocator.getManager()
+    projectManager = application.getProjectManager()
+    viewManager = projectManager.getDocumentManager(ViewManager.TYPENAME)
+    return viewManager.getMainWindow(self.viewdoc,None)
+  
+  def btnCerrar_click(self,*args):
+    self.hide()
+    
+  def point(self, event):
+    """Evento de PointListener"""
+    p = event.getMapPoint()
+    self.txtX.setText(str(p.getX()))
+    self.txtY.setText(str(p.getY()))
+
+  def pointDoubleClick(self, event):
+    """Evento de PointListener"""
+    p = event.getMapPoint()
+    self.txtX.setText(str(p.getX()))
+    self.txtY.setText(str(p.getY()))
+
+  def getImageCursor(self):
+    """Evento de PointListener"""
+    return IconThemeHelper.getImage("cursor-select-by-point")
+
+  def cancelDrawing(self):
+    """Evento de PointListener"""
+    return False
+
+def main(*args):
+  coordenadas = Coordenadas(currentView())
+  coordenadas.showTool("Coordenda")
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/coordenadas/coordenadas.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = coordenadas
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/01_msgbox.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/01_msgbox.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/01_msgbox.py	(revision 1126)
@@ -0,0 +1,13 @@
+from gvsig import commonsdialog
+
+def main():
+    '''Shows a message using commonsdialog function msgbox'''
+    
+    message = 'Hello Word!'
+    title = 'msgbox'
+    messageType = commonsdialog.IDEA
+    
+    commonsdialog.msgbox(message,
+        title,
+        messageType
+    )
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Dialog
+name = 04_simple
+description = Simple dialog with two text boes and a close button.
+createdBy = 
+version = 
+
+[Script]
+main = onload
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/01_msgbox.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/01_msgbox.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/01_msgbox.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+name = 01_msgbox
+description = 
+createdBy = 
+version = 
+type = Script
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/03_optionbox.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/03_optionbox.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/03_optionbox.py	(revision 1126)
@@ -0,0 +1,33 @@
+from gvsig import commonsdialog
+
+def main():
+    '''Asks if you want to see a message and shows a message with selected 
+    option using commonsdialog functions
+        - msgbox
+        - confirmDialog
+    '''
+    message = 'Do you want see a message?'
+    title = 'Select Option'
+    optionType = commonsdialog.YES_NO
+    messageType = commonsdialog.IDEA
+    
+    option = commonsdialog.confirmDialog(
+        message, 
+        title, 
+        optionType, 
+        messageType
+    )
+    
+    if option == 0:
+        message = 'You have chosen "Yes" Option (%s)'%option           
+    elif option == 1:
+        message = 'No matter. You have chosen "No" Option (%s)'%option   
+        messageType = commonsdialog.WARNING
+    else:
+        message = 'You just closed the window. Option (%s)'%option   
+        messageType = commonsdialog.FORBIDEN
+    
+    commonsdialog.msgbox(message,
+        'YOUR OPTION',
+        messageType
+    )
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/03_optionbox.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/03_optionbox.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/03_optionbox.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+name = 03_optionbox
+description = 
+createdBy = 
+version = 
+type = Script
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/02_inputbox.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/02_inputbox.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/02_inputbox.py	(revision 1126)
@@ -0,0 +1,24 @@
+from gvsig import commonsdialog
+
+def main():
+    '''
+    Asks to display a text using the commonsdialog functions
+        - msgbox
+        - inputbox
+    If not text show Warning message
+    '''
+    messageType = commonsdialog.QUESTION
+    title = 'Inputbox'
+    text = commonsdialog.inputbox('Write text to show',
+        title,
+        messageType
+    )
+    if not text:
+        text = 'You must write text to  show'
+        title = 'Warning'
+        messageType = commonsdialog.WARNING    
+        
+    commonsdialog.msgbox(text,
+        title,
+        messageType
+    )
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.dlg
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.dlg	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.dlg	(revision 1126)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- generated by ThinG, the Thinlet GUI editor -->
+<panel columns="2" gap="4">
+    <label text="Nombre" valign="top"/>
+    <textfield weightx="1"/>
+    <label text="Descripcion" valign="top"/>
+    <textfield weighty="1"/>
+    <button action="cerrarForm" colspan="2" halign="right" name="cerrar" text="Cerar"/>
+</panel>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/04_simple.py	(revision 1126)
@@ -0,0 +1,9 @@
+
+from gvsig import *
+
+def cerrarForm():
+  print "cerrarForm"
+  dialog.setVisible(False)
+
+def onload():
+  print "onload"
\ No newline at end of file
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/02_inputbox.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/02_inputbox.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/dialogs/02_inputbox.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+name = 02_inputbox
+description = 
+createdBy = 
+version = 
+type = Script
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geopy/geopy_01.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geopy/geopy_01.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geopy/geopy_01.py	(revision 1126)
@@ -0,0 +1,37 @@
+
+from gvsig import *
+import geopy
+
+def main(*args):
+    #Info
+    #http://geopy.readthedocs.org/en/latest/#module-geopy.geocoders
+
+    print "\n\n Test 01: Geocode"
+    from geopy.geocoders import GoogleV3
+    geolocator = GoogleV3()
+    location = geolocator.geocode("175 5th Avenue NYC")
+    print(location.address)
+    print((location.latitude, location.longitude))
+    print(location.raw)
+
+    print "\n\n Test 02: Reverse geocode"
+    from geopy.geocoders import GoogleV3
+    geolocator = GoogleV3()
+    location = geolocator.reverse("52.509669, 13.376294")
+    print location
+    print(location[0].address)
+    print((location[0].latitude, location[0].longitude))
+    print(location[0].raw)
+
+    print "\n\n Test 03: Mesouring distance"
+    from geopy.distance import vincenty
+    newport_ri = (41.49008, -71.312796)
+    cleveland_oh = (41.499498, -81.695391)
+    print(vincenty(newport_ri, cleveland_oh).miles)
+
+    from geopy.distance import great_circle
+    newport_ri = (41.49008, -71.312796)
+    cleveland_oh = (41.499498, -81.695391)
+    print(great_circle(newport_ri, cleveland_oh).miles)
+ 
+    pass
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geopy/geopy_01.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geopy/geopy_01.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/examples/geopy/geopy_01.inf	(revision 1126)
@@ -0,0 +1,14 @@
+[Unit]
+type = Script
+name = geopy_01
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = makedocs
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.xml	(revision 1126)
@@ -0,0 +1,1112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/datos/devel/org.gvsig.desktop/target/product/gvSIG/extensiones/org.gvsig.scripting.app.mainplugin/scripting/scripts/tools/makedocs/makedocs.xml</at>
+   <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">102</at>
+            <at name="name"/>
+            <at name="text">Workspace</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">102</at>
+            <at name="name"/>
+            <at name="text">Output folder</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtWorkspace</at>
+            <at name="width">344</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">txtOutputFolder</at>
+            <at name="width">344</at>
+            <at name="height">20</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="actionCommand">...</at>
+            <at name="name">btnSelectWorkspace</at>
+            <at name="width">44</at>
+            <at name="text">...</at>
+            <at name="height">22</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="actionCommand">...</at>
+            <at name="name">btnSelectOutputFolder</at>
+            <at name="width">44</at>
+            <at name="text">...</at>
+            <at name="height">22</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.FormMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">14</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">right</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+        </super>
+        <at name="id">embedded.925364982</at>
+        <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+        <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+        <at name="components">
+         <object classname="java.util.LinkedList">
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">3</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="actionCommand">Cerrar</at>
+                 <at name="name">btnCerrar</at>
+                 <at name="width">69</at>
+                 <at name="text">Cerrar</at>
+                 <at name="height">22</at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="actionCommand">Procesar</at>
+                 <at name="name">btnProcesar</at>
+                 <at name="width">83</at>
+                 <at name="text">Procesar</at>
+                 <at name="height">22</at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+         </object>
+        </at>
+        <at name="properties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.gui.form.GridView</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList"/>
+              </at>
+             </object>
+            </at>
+            <at name="name"/>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">21</at>
+              <at name="horizontalpolicy">31</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="cellpainters">
+         <object classname="com.jeta.forms.store.support.Matrix">
+          <at name="rows">
+           <object classname="[Ljava.lang.Object;" size="1">
+            <at name="item" index="0">
+             <object classname="[Ljava.lang.Object;" size="3"/>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="rowgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+        <at name="colgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JCheckBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JCheckBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">chkGenerarJavadocs</at>
+            <at name="width">344</at>
+            <at name="selected">true</at>
+            <at name="height">15</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">102</at>
+            <at name="name"/>
+            <at name="text">Generar javadocs</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JCheckBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JCheckBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">chkCheckoutSources</at>
+            <at name="width">344</at>
+            <at name="height">15</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="width">102</at>
+            <at name="name"/>
+            <at name="text">Checkout sources</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">10</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JProgressBar</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JProgressBar</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">pgbProgreso</at>
+            <at name="width">514</at>
+            <at name="height">14</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">11</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblStatus</at>
+            <at name="width">514</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">12</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">12</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="name">lblStatus2</at>
+            <at name="width">514</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="height">12</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+       <at name="name"/>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="15">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="9">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="10">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="11">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="12">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="13">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="14">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/makedocs/makedocs.py	(revision 1126)
@@ -0,0 +1,307 @@
+
+from gvsig import *
+from gvsig.commonsdialog import *
+from gvsig.libs.formpanel import FormPanel, getResource
+
+import os
+import os.path
+import shutil
+import sys
+import subprocess
+import threading
+import logging
+
+
+from java.awt import Dimension
+
+from org.gvsig.scripting.swing.api import ScriptingSwingLocator
+
+class MakeDocs(FormPanel, threading.Thread):
+  def __init__(self,workspace,projects,outputfolder):
+    threading.Thread.__init__(self)
+    FormPanel.__init__(self, getResource(__file__,"makedocs.xml"))
+    self.setName("Javadoc creator")
+    self.setPreferredSize(700,230)
+    self.canceled = False
+
+    self.workspace = workspace
+    self.projects = projects
+    self.outputfolder = outputfolder
+    self.txtWorkspace.setText(workspace)
+    self.txtOutputFolder.setText(outputfolder)
+
+  def findJavaSources(self,workspace,project):
+    projectFolder = os.path.join(workspace,project)
+    sources = list()
+    for root, dirs, files in os.walk(projectFolder):
+        for file in files:
+            if file == "pom.xml":
+              if root[-5:] != ".main":
+                javaSources = os.path.join(root,"src","main","java")
+                if os.path.isdir(javaSources):
+                  sources.append(javaSources)
+                  self.message2(root)
+    return sources
+
+  def findJavadocSources(self,workspace,projects):
+    sources = list()
+    for project, url in projects:
+      sources.extend(self.findJavaSources(workspace,project))
+      if project == "org.gvsig.scripting":
+        sources.append(os.path.join(
+          workspace,project,"org.gvsig.scripting.app","org.gvsig.scripting.app.mainplugin",
+          "src","main","resources-plugin","scripting","lib","gvsig","javadocs"
+        ))
+    return sources
+
+  def calculateCountFromSources(self,sources):
+    countfiles = 0
+    folders = set()
+    for sourceFolder in sources:
+      for root, dirs, files in os.walk(sourceFolder):
+        for f in files:
+            if f.endswith(".java"):
+              countfiles+=1
+              self.message2("[%05d] %s" %  (countfiles, os.path.join(root,f)))
+        if len(files)>0:
+          package = root[len(sourceFolder)+1:]
+          folders.add(package)
+
+    return countfiles, len(folders)
+
+  def calculateHTMLFileList(self,htmlroot, listfname):
+    listfile= open(listfname,"w")
+    countfiles = 0
+    for root, dirs, files in os.walk(htmlroot):
+      for f in files:
+        if f.startswith("package-"):
+          continue
+        if f.endswith(".html"):
+          countfiles+=1
+          listfile.write(os.path.join(root,f))
+          listfile.write("\n")
+          self.message2("[%05d] %s" %  (countfiles, os.path.join(root,f)))
+    listfile.close()
+    return countfiles
+
+  def message(self,msg):
+    self.lblStatus.setText(msg)
+
+  def message2(self,msg):
+    self.lblStatus2.setText(msg)
+
+  def checkoutSources(self,workspace,projects, outputpath):
+    if not os.path.exists(workspace):
+      os.makedirs(workspace)
+    self.message("Descargando proyectos...")
+    count = 0
+    self.pgbProgreso.setMaximum(len(projects))
+    self.pgbProgreso.setValue(count)
+    self.pgbProgreso.setIndeterminate(False)
+    for project, url in projects:
+      if self.canceled:
+        break
+      self.message2("Descargando %s..." % project)
+      count += 1
+      self.pgbProgreso.setValue(count)
+      cmd = 'cd "%s" ; svn checkout "%s"' % (workspace,url)
+      os.system(cmd)
+
+  def mkjavadoc(self,workspace,projects, outputpath):
+    try:
+      self.pgbProgreso.setIndeterminate(True)
+      self.message("Creando carpeta de salida...")
+      if not os.path.exists(outputpath):
+        os.makedirs(outputpath)
+
+      os.chdir(outputpath)
+      if not os.path.exists("html"):
+        os.makedirs("html")
+      os.chdir("html")
+
+      if not self.canceled  and self.chkCheckoutSources.isSelected():
+        self.checkoutSources(workspace,projects, outputpath)
+
+      if not self.canceled  and self.chkGenerarJavadocs.isSelected():
+        self.message("Eliminando javadoc existentes...")
+        self.pgbProgreso.setIndeterminate(True)
+        os.chdir("..")
+        shutil.rmtree("html",True)
+        os.makedirs("html")
+        os.chdir("html")
+
+        self.message("Localizando fuentes...")
+        sources = self.findJavadocSources(workspace,projects)
+
+        self.message("Preparando procesado...")
+        maxfiles, maxpackages = self.calculateCountFromSources(sources)
+
+        argsfile = file("javadoc_args","w")
+        #argsfile.write("-nonavbar\n")
+        argsfile.write("-link http://docs.oracle.com/javase/8/docs/api/\n")
+        argsfile.write("-encoding ISO-8859-1\n")
+        argsfile.write("-subpackages org:scripting\n")
+        argsfile.write("-sourcepath ")
+        for source in sources:
+          argsfile.write(":%s" % source)
+        argsfile.write("\n")
+        argsfile.close()
+
+        proc = subprocess.Popen(["javadoc", "@javadoc_args"], stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
+        stdoutprocess = proc.stdout
+        generatingcount = 0
+        loadingcount=0
+
+        self.pgbProgreso.setMaximum(maxpackages)
+        self.pgbProgreso.setValue(0)
+        self.pgbProgreso.setIndeterminate(False)
+
+        for line in stdoutprocess:
+          if self.canceled:
+            break
+          #print line[:-1]
+          if ": error:" in line :
+            self.message("Procesando fuentes...")
+            self.message2(line)
+
+          elif line.startswith("Generating "):
+            self.message("Generando javadocs...")
+            if generatingcount == 0:
+              self.pgbProgreso.setMaximum(maxfiles + maxpackages*3 + 9)
+            self.message2(line[11:-9])
+            if "/package-" in line:
+              generatingcount+=1
+            else:
+              if os.path.basename(line[:-4]).count(".")==1:
+                generatingcount +=1
+            self.pgbProgreso.setValue(generatingcount)
+
+          elif line.startswith("Loading source files for package "):
+            self.message("Cargando fuentes...")
+            loadingcount+=1
+            self.pgbProgreso.setValue(loadingcount)
+            self.message2(line[33:])
+
+      self.message("Proceso terminado")
+      self.message2("")
+      self.pgbProgreso.setValue(self.pgbProgreso.getMaximum())
+      if self.canceled:
+        print "Proceso cancelado"
+
+    except Exception, ex:
+      self.message("Proceso abortado")
+      self.message2(str(ex))
+      print str(ex)
+      logging.exception("Proceso abortado")
+
+  def btnSelectWorkspace_click(self, *args):
+    f = openFolderDialog("Selecciona la carpeta del workspace")
+    if f == None or len(f)<1:
+      return
+    self.txtWorkspace.setText(f[0].getAbsolutePath())
+
+  def btnSelectOutputFolder_click(self, *args):
+    f = openFolderDialog("Selecciona la carpeta de salida")
+    if f == None or len(f)<1:
+      return
+    self.txtOutputFolder.setText(f[0].getAbsolutePath())
+
+  def btnCerrar_click(self,*args):
+    self.canceled = True
+    self.hide()
+
+  def btnProcesar_click(self,*args):
+    self.btnProcesar.setEnabled(False)
+    self.btnCerrar.setText("Cancelar")
+    self.start()
+
+  def showWindow(self,title="Crear javadocs"):
+    windowManager = ScriptingSwingLocator.getUIManager()
+    windowManager.showWindow(self.asJComponent(),title)
+
+  def run(self):
+    self.mkjavadoc(
+      self.workspace,
+      self.projects,
+      self.outputfolder
+    )
+    # Falla al volverse a lanzar el proceso por que no se
+    # a rearmado correctamente el thread. Asi que dejo
+    # desactivado el boton.
+    #self.btnProcesar.setEnabled(True)
+
+
+def main(*args):
+  workspace = "/tmp/makedocs"
+  outputfolder = workspace + "/javadocs"
+  projects = (
+    ("org.gvsig.scripting","http://devel.gvsig.org/svn/gvsig-scripting/org.gvsig.scripting/trunk/org.gvsig.scripting"),
+    ("org.gvsig.tools","http://devel.gvsig.org/svn/gvsig-tools/org.gvsig.tools/library/trunk/org.gvsig.tools"),
+    ("org.gvsig.desktop","http://devel.gvsig.org/svn/gvsig-desktop/trunk/org.gvsig.desktop"),
+    ("org.gvsig.gdal","http://devel.gvsig.org/svn/gvsig-gdal/trunk/org.gvsig.gdal"),
+    ("org.gvsig.raster","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster/trunk/org.gvsig.raster"),
+    ("org.gvsig.raster.gdal","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.gdal/trunk/org.gvsig.raster.gdal"),
+    ("org.gvsig.geoprocess","http://devel.gvsig.org/svn/gvsig-geoprocess/org.gvsig.geoprocess/trunk/org.gvsig.geoprocess"),
+    ("org.gvsig.3d","http://devel.gvsig.org/svn/gvsig-3d/2.1/trunk/org.gvsig.view3d/"),
+    ("org.gvsig.app.document.layout2.app","https://devel.gvsig.org/svn/gvsig-app-document-layout/trunk/org.gvsig.app.document.layout2.app"),
+    ("org.gvsig.attributeeditor","http://devel.gvsig.org/svn/gvsig-attributeeditor/org.gvsig.attributeeditor/trunk/org.gvsig.attributeeditor"),
+    ("org.gvsig.chart","http://devel.gvsig.org/svn/gvsig-basic-chart/org.gvsig.chart/trunk/org.gvsig.chart"),
+    ("org.gvsig.complexlegend","http://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.complexlegend/trunk/org.gvsig.complexlegend"),
+    ("org.gvsig.derivedgeometries","http://devel.gvsig.org/svn/gvsig-derived-geometries/org.gvsig.derivedgeometries/trunk/org.gvsig.derivedgeometries/"),
+    ("org.gvsig.dgn","http://devel.gvsig.org/svn/gvsig-dgn/org.gvsig.dgn/trunk/org.gvsig.dgn"),
+    ("org.gvsig.downloader","http://devel.gvsig.org/svn/gvsig-downloader/org.gvsig.downloader/trunk/org.gvsig.downloader/"),
+    ("org.gvsig.dwg","http://devel.gvsig.org/svn/gvsig-dwg/trunk/org.gvsig.dwg/"),
+    ("org.gvsig.dxf","http://devel.gvsig.org/svn/gvsig-dxf/org.gvsig.dxf/trunk/org.gvsig.dxf/"),
+    ("org.gvsig.dyschromatopsia","http://devel.gvsig.org/svn/gvsig-dyschromatopsia/trunk/org.gvsig.dyschromatopsia/"),
+    ("org.gvsig.educa.portableview","http://devel.gvsig.org/svn/gvsig-educa/org.gvsig.educa.portableview/trunk/org.gvsig.educa.portableview/"),
+    ("org.gvsig.expressionfield","http://devel.gvsig.org/svn/gvsig-expression-field/org.gvsig.expressionfield/trunk/org.gvsig.expressionfield/"),
+    ("org.gvsig.gpe","http://devel.gvsig.org/svn/gvsig-gpe/org.gvsig.gpe/library/trunk/org.gvsig.gpe/"),
+    ("org.gvsig.hyperlink.app","http://devel.gvsig.org/svn/gvsig-hyperlink/org.gvsig.hyperlink.app/trunk/org.gvsig.hyperlink.app"),
+    ("org.gvsig.jexcel","http://devel.gvsig.org/svn/gvsig-jexcel/org.gvsig.jexcel/trunk/org.gvsig.jexcel"),
+    ("org.gvsig.jvmpreferences","http://devel.gvsig.org/svn/gvsig-projects-pool/org.gvsig.jvmpreferences/trunk/org.gvsig.jvmpreferences.native/"),
+    ("org.gvsig.legend.dotdensity.app","http://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.dotdensity.app.mainplugin/trunk/org.gvsig.legend.dotdensity.app.mainplugin/"),
+    ("org.gvsig.legend.graduatedsymbols.app","http://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.graduatedsymbols.app.mainplugin/trunk/org.gvsig.legend.graduatedsymbols.app.mainplugin/"),
+    ("org.gvsig.legend.proportionalsymbols.app","http://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.proportionalsymbols.app.mainplugin/trunk/org.gvsig.legend.proportionalsymbols.app.mainplugin/"),
+    ("org.gvsig.legend.quantitybycategory.app","http://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.quantitybycategory.app.mainplugin/trunk/org.gvsig.legend.quantitybycategory.app.mainplugin/"),
+    ("org.gvsig.legend.vectorfilterexpression.app","http://devel.gvsig.org/svn/gvsig-base-legends/org.gvsig.legend.vectorfilterexpression.app.mainplugin/trunk/org.gvsig.legend.vectorfilterexpression.app.mainplugin/"),
+    ("org.gvsig.mapsheets.app","http://devel.gvsig.org/svn/mapsheets/trunk/org.gvsig.mapsheets.app"),
+    ("org.gvsig.postgresql","http://devel.gvsig.org/svn/gvsig-postgresql/trunk/org.gvsig.postgresql"),
+    ("org.gvsig.projection.jcrs","http://devel.gvsig.org/svn/gvsig-jcrs/org.gvsig.projection.jcrs/trunk/org.gvsig.projection.jcrs"),
+    ("org.gvsig.raster.ermapper","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.ermapper/trunk/org.gvsig.raster.ermapper/"),
+    ("org.gvsig.raster.georeferencing","http://devel.gvsig.org/svn/gvsig-georeferencing/org.gvsig.raster.georeferencing/trunk/org.gvsig.raster.georeferencing/"),
+    ("org.gvsig.raster.lizardtech","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.lizardtech/trunk/org.gvsig.raster.lizardtech/"),
+    ("org.gvsig.raster.multifile","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.multifile/trunk/org.gvsig.raster.multifile/"),
+    ("org.gvsig.raster.netcdf","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.netcdf/trunk/org.gvsig.raster.netcdf/"),
+    ("org.gvsig.raster.osm","http://devel.gvsig.org/svn/gvsig-osm/org.gvsig.raster.osm/trunk/org.gvsig.raster.osm"),
+    ("org.gvsig.raster.postgis","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.postgis/trunk/org.gvsig.raster.postgis/"),
+    ("org.gvsig.raster.principalcomponents","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.principalcomponents/trunk/org.gvsig.raster.principalcomponents/"),
+    ("org.gvsig.raster.reproject","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.reproject/trunk/org.gvsig.raster.reproject/"),
+    ("org.gvsig.raster.roimask","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.roimask/trunk/org.gvsig.raster.roimask/"),
+    ("org.gvsig.raster.tasseledcap","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.tasseledcap/trunk/org.gvsig.raster.tasseledcap/"),
+    ("org.gvsig.raster.tilecache","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.tilecache/trunk/org.gvsig.raster.tilecache/"),
+    ("org.gvsig.raster.tools","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.tools/trunk/org.gvsig.raster.tools/"),
+    ("org.gvsig.raster.wms","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wms/trunk/org.gvsig.raster.wms/"),
+    ("org.gvsig.raster.wcs","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wcs/trunk/org.gvsig.raster.wcs/"),
+    ("org.gvsig.raster.wmts","http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wmts/trunk/org.gvsig.raster.wmts"),
+    ("org.gvsig.seismic","http://devel.gvsig.org/svn/gvsig-seismic/org.gvsig.seismic/trunk/org.gvsig.seismic"),
+    ("org.gvsig.sld","http://devel.gvsig.org/svn/gvsig-sldtools/org.gvsig.sld/trunk/org.gvsig.sld"),
+    ("org.gvsig.vectorediting","http://devel.gvsig.org/svn/gvsig-vectorediting/org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/"),
+    ("org.gvsig.vectorediting.symmetry","http://devel.gvsig.org/svn/gvsig-vectorediting/org.gvsig.vectorediting.symmetry/trunk/org.gvsig.vectorediting.symmetry/"),
+    ("org.gvsig.vectorediting.offset","http://devel.gvsig.org/svn/gvsig-vectorediting/org.gvsig.vectorediting.offset/trunk/org.gvsig.vectorediting.offset/"),
+    ("org.gvsig.wfs.app","http://devel.gvsig.org/svn/gvsig-wfs/org.gvsig.wfs.app/trunk/org.gvsig.wfs.app/"),
+    ("org.gvsig.customize.app","http://devel.gvsig.org/svn/gvsig-desktop-customize/trunk/org.gvsig.customize.app/"),
+    ("org.gvsig.catalog","http://devel.gvsig.org/svn/gvsig-catalog/org.gvsig.catalog/trunk/org.gvsig.catalog/"),
+    ("org.gvsig.gazetteer","http://devel.gvsig.org/svn/gvsig-gazetteer/org.gvsig.gazetteer/trunk/org.gvsig.gazetteer/"),
+    ("org.gvsig.publish","http://devel.gvsig.org/svn/gvsig-publish/org.gvsig.publish/trunk/org.gvsig.publish"),
+    ("org.gvsig.webmap","http://devel.gvsig.org/svn/gvsig-webmap/org.gvsig.webmap/trunk/org.gvsig.webmap"),
+    ("org.gvsig.googlemaps","http://devel.gvsig.org/svn/gvsig-webmap/org.gvsig.googlemaps/trunk/org.gvsig.googlemaps"),
+    ("org.gvsig.bingmaps","http://devel.gvsig.org/svn/gvsig-webmap/org.gvsig.bingmaps/trunk/org.gvsig.bingmaps"),
+    ("org.gvsig.toolbox", "http://devel.gvsig.org/svn/gvsig-toolbox/org.gvsig.toolbox/trunk/org.gvsig.toolbox/"),
+    ("org.gvsig.projection.api", "https://devel.gvsig.org/svn/gvsig-jcrs/org.gvsig.projection/trunk/org.gvsig.projection.api/"),
+    ("org.gvsig.raster.cache", "http://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.cache/trunk/org.gvsig.raster.cache/"),
+  )
+  
+  makedocs = MakeDocs(workspace,projects,outputfolder)
+  makedocs.showWindow("Crear javadocs")
+  #makedocs.run()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.inf	(revision 1126)
@@ -0,0 +1,15 @@
+[Unit]
+type = Script
+name = photo2shape
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+isolation = 0
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/imagegpsmetadata.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/imagegpsmetadata.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/imagegpsmetadata.inf	(revision 1126)
@@ -0,0 +1,15 @@
+[Unit]
+type = Script
+name = imagegpsmetadata
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+isolation = 0
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/NikonE990.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/NikonE990.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/AppleiPhone4.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/AppleiPhone4.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/HTCDesire.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/HTCDesire.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/PanasonicDMC-TZ10.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/PanasonicDMC-TZ10.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/FujiFilmFinePixS1Pro.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/data/test-images/FujiFilmFinePixS1Pro.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/libs/metadata-extractor-2.8.1.jar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/libs/metadata-extractor-2.8.1.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/libs/xmpcore-5.1.2.jar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/libs/xmpcore-5.1.2.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.xml	(revision 1126)
@@ -0,0 +1,932 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/gvSIG/plugins/org.gvsig.scripting.app.extension/scripts/photo2shape/photo2shape3.xml</at>
+   <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Directory with images</at>
+            <at name="height">14</at>
+            <at name="name"/>
+            <at name="width">124</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Output shapefile </at>
+            <at name="height">14</at>
+            <at name="name"/>
+            <at name="width">124</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Insert as a layer</at>
+            <at name="height">14</at>
+            <at name="name"/>
+            <at name="width">124</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="width">682</at>
+            <at name="name">txtInputFolder</at>
+            <at name="background" object="color">236,233,216</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="editable">false</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="width">682</at>
+            <at name="name">txtOutputFile</at>
+            <at name="background" object="color">236,233,216</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="editable">false</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JCheckBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JCheckBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="selected">true</at>
+            <at name="height">15</at>
+            <at name="width">682</at>
+            <at name="name">chkInsertLayer</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Browse...</at>
+            <at name="height">22</at>
+            <at name="width">87</at>
+            <at name="name">btnInputFolder</at>
+            <at name="actionCommand">Browse...</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Browse...</at>
+            <at name="height">22</at>
+            <at name="width">87</at>
+            <at name="name">btnOutputFile</at>
+            <at name="actionCommand">Browse...</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.FormMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">10</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">right</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+        </super>
+        <at name="id">embedded.387159005</at>
+        <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+        <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+        <at name="components">
+         <object classname="java.util.LinkedList">
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">3</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Process images</at>
+                 <at name="height">22</at>
+                 <at name="width">124</at>
+                 <at name="name">btnMakeShape</at>
+                 <at name="actionCommand">Ok</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Close</at>
+                 <at name="height">22</at>
+                 <at name="width">64</at>
+                 <at name="name">btnClose</at>
+                 <at name="actionCommand">Cerrar</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+         </object>
+        </at>
+        <at name="properties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.gui.form.GridView</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">21</at>
+              <at name="horizontalpolicy">31</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList"/>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="cellpainters">
+         <object classname="com.jeta.forms.store.support.Matrix">
+          <at name="rows">
+           <object classname="[Ljava.lang.Object;" size="1">
+            <at name="item" index="0">
+             <object classname="[Ljava.lang.Object;" size="3"/>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="rowgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+        <at name="colgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Remove shape</at>
+            <at name="height">14</at>
+            <at name="width">124</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JCheckBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JCheckBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">15</at>
+            <at name="width">682</at>
+            <at name="name">chkRemoveShape</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="11">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="9">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="10">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape1.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape1.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape1.py	(revision 1126)
@@ -0,0 +1,15 @@
+
+
+execfile( script.getResource("../libs/import_utils.py").getAbsolutePath() )
+
+import os
+from java.io import File
+
+import_from_module("imagegpsmetadata","ImageGPSMetadata")
+
+def main(*args):
+  folder = script.getResource("data/test-images").getAbsolutePath()
+  metadata_reader = ImageGPSMetadata()
+  for image in os.listdir(folder):
+    metadata_reader.load(File(os.path.join(folder,image)))
+    print "Image %s, %s %s %s" % (image, metadata_reader.getDate(), metadata_reader.getTime(), metadata_reader.getPoint())
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape2.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape2.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape2.py	(revision 1126)
@@ -0,0 +1,144 @@
+
+
+execfile( script.getResource("../libs/import_utils.py").getAbsolutePath() )
+
+import os
+
+from gvsig import *
+from commonsdialog import *
+
+from java.io import File
+from java.lang import Thread
+
+from org.gvsig.tools import ToolsLocator
+
+from org.gvsig.fmap.geom import GeometryLocator
+from org.gvsig.fmap.geom import Geometry
+
+from org.gvsig.fmap.dal import DALLocator
+from org.gvsig.fmap.dal import DataTypes
+
+
+import_from_module("imagegpsmetadata","ImageGPSMetadata")
+import_from_module("..libs.relpath","relpath")
+
+
+class ProcessFolder(Thread):
+  def __init__(self):
+    self.__inputFolder = None
+    self.__outputFile = None
+    self.__recurseInSubfolders = False
+    self.__addLayerToView = False
+    self.__projection = "EPSG:4326"
+    
+  def setInputFoldername(self, inputFoldername):
+    self.__inputFolder = File(inputFoldername)
+    
+  def setOutputFilename(self, outputFilename):
+    self.__outputFile = File(outputFilename)
+    
+  def setRecurseInSubfolders(self, recurse):
+    self.__recurseInSubfolders = recurse
+    
+  def setAddLayerToView(self, add):
+    self.__addLayerToView = add
+
+  def createFeatureType(self):
+    ft = DALLocator.getDataManager().createFeatureType()
+    ft.add("id",DataTypes.INT)
+    ft.add("text",DataTypes.STRING,100).setAllowNull(True)
+    ft.add("fname",DataTypes.STRING,100).setAllowNull(True)
+    ft.add("relpath",DataTypes.STRING,200).setAllowNull(True)
+    ft.add("abspath",DataTypes.STRING,200).setAllowNull(True)
+    ft.add("altitude",DataTypes.STRING,50).setAllowNull(True)
+    ft.add("altitudere",DataTypes.STRING,50).setAllowNull(True)
+    ft.add("datum",DataTypes.STRING,30).setAllowNull(True)
+    ft.add("datestam",DataTypes.STRING,30).setAllowNull(True)
+    ft.add("timestam",DataTypes.STRING,30).setAllowNull(True)
+    
+    attrg = ft.add("geometry",DataTypes.GEOMETRY)
+    attrg.setGeometryType( 
+      GeometryLocator.getGeometryManager().getGeometryType(
+        Geometry.TYPES.POINT,
+        Geometry.SUBTYPES.GEOM2D
+      )
+    )
+    return ft
+
+  def openShape(self): 
+    dataManager = DALLocator.getDataManager()   
+    openparams = dataManager.createStoreParameters("Shape")
+    openparams.setDynValue("shpFile",self.__outputFile)
+    openparams.setDynValue("crs",self.__projection)
+    featurestore = dataManager.openStore("Shape",openparams)
+    return featurestore
+  
+  def createShape(self):
+    dataManager = DALLocator.getDataManager()
+    
+    serverparams = dataManager.createServerExplorerParameters("FilesystemExplorer")
+    serverparams.setDynValue("root", self.__outputFile.getParent())
+    server = dataManager.openServerExplorer("FilesystemExplorer", serverparams)
+    addparams = server.getAddParameters("Shape")
+    addparams.setDefaultFeatureType(self.createFeatureType())
+    addparams.setDynValue("shpFile",self.__outputFile)
+    addparams.setDynValue("crs",self.__projection)
+    addparams.setDynValue("geometryType",Geometry.TYPES.POINT)
+    server.add("Shape",addparams, False)
+
+  def run(self):
+    root = self.__outputFile.getParentFile()
+    metadata_reader = ImageGPSMetadata()
+    files = self.__inputFolder.list()
+    if self.__outputFile.exists():
+        msgbox("output shapefile already exist")
+        return
+        
+    self.createShape()
+      
+    store = self.openShape()
+    store.edit()
+    n = 0
+    for fname  in files:
+      n += 1
+      base, ext = os.path.splitext(fname)
+      if not ext.lower() in (".jpg",".png",".jpeg"):
+        continue
+      f  = File(self.__inputFolder,fname)
+          
+      metadata_reader.load(f)
+      feature = store.createNewFeature()
+      feature.setDefaultGeometry(metadata_reader.getPoint())
+      feature.set("id", n)
+      feature.set("text", fname)
+      feature.set("fname", fname)
+      feature.set("relpath", relpath(f.getAbsolutePath(),root.getAbsolutePath()))
+      feature.set("abspath", f.getAbsolutePath())
+      feature.set("altitude", metadata_reader.getAltitude(""))
+      feature.set("altitudere", metadata_reader.getAltitudeRef(""))
+      feature.set("datum", metadata_reader.getDatum(""))
+      feature.set("datestam", metadata_reader.getDate(""))
+      feature.set("timestam", metadata_reader.getTime(""))
+      store.insert(feature)
+
+    store.finishEditing()
+    if self.__addLayerToView:
+      layer = MapContextLocator.getMapContextManager().createLayer(
+        self.__outputFile.getName(),
+        store
+      )
+      currentView().getMapContext().getLayers().addLayer(layer)
+
+
+def main(*args):
+    inputFolder = script.getResource("data/test-images").getAbsolutePath()
+    outputFilename = script.getResource("data/photos.shp").getAbsolutePath()
+
+    process = ProcessFolder()
+    process.setInputFoldername(inputFolder)
+    process.setOutputFilename(outputFilename)
+    process.setRecurseInSubfolders(False)
+    process.setAddLayerToView(True)
+    process.run()
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.py	(revision 1126)
@@ -0,0 +1,198 @@
+
+
+execfile( script.getResource("../libs/import_utils.py").getAbsolutePath() )
+
+import os
+import os.path
+
+from gvsig import *
+from commonsdialog import *
+from geom import *
+
+from java.io import File
+from java.lang import Thread
+from java.awt import Dimension
+
+from org.gvsig.tools import ToolsLocator
+
+from org.gvsig.fmap.geom import GeometryLocator
+from org.gvsig.fmap.geom import Geometry
+
+from org.gvsig.fmap.dal import DALLocator
+from org.gvsig.fmap.dal import DataTypes
+
+
+import_from_module("imagegpsmetadata","ImageGPSMetadata")
+import_from_module("..libs.relpath","relpath")
+import_from_module("..libs.formpanel","ProgressBarWithTaskStatus,FormPanel")
+
+
+class ProcessFolder(Thread):
+  def __init__(self):
+    self.__inputFolder = None
+    self.__outputFile = None
+    self.__addLayerToView = False
+    self.__projection = "EPSG:4326"
+    self.__onFinish = None
+    
+    
+  def setOnFinish(self,onFinish):
+    self.__onFinish = onFinish
+
+  def setInputFoldername(self, inputFoldername):
+    self.__inputFolder = File(inputFoldername)
+    
+  def setOutputFilename(self, outputFilename):
+    self.__outputFile = File(outputFilename)
+    
+  def setAddLayerToView(self, add):
+    self.__addLayerToView = add
+
+  def createFeatureType(self):
+    ft = DALLocator.getDataManager().createFeatureType()
+    ft.add("id",DataTypes.INT)
+    ft.add("text",DataTypes.STRING,100).setAllowNull(True)
+    ft.add("fname",DataTypes.STRING,100).setAllowNull(True)
+    ft.add("relpath",DataTypes.STRING,200).setAllowNull(True)
+    ft.add("abspath",DataTypes.STRING,200).setAllowNull(True)
+    ft.add("altitude",DataTypes.STRING,50).setAllowNull(True)
+    ft.add("altitudere",DataTypes.STRING,50).setAllowNull(True)
+    ft.add("datum",DataTypes.STRING,30).setAllowNull(True)
+    ft.add("datestam",DataTypes.STRING,30).setAllowNull(True)
+    ft.add("timestam",DataTypes.STRING,30).setAllowNull(True)
+    
+    attrg = ft.add("geometry",DataTypes.GEOMETRY)
+    attrg.setGeometryType( 
+      GeometryLocator.getGeometryManager().getGeometryType(
+        Geometry.TYPES.POINT,
+        Geometry.SUBTYPES.GEOM2D
+      )
+    )
+    return ft
+
+  def openShape(self): 
+    dataManager = DALLocator.getDataManager()   
+    openparams = dataManager.createStoreParameters("Shape")
+    openparams.setDynValue("shpFile",self.__outputFile)
+    openparams.setDynValue("crs",self.__projection)
+    featurestore = dataManager.openStore("Shape",openparams)
+    return featurestore
+  
+  def createShape(self):
+    dataManager = DALLocator.getDataManager()
+    
+    serverparams = dataManager.createServerExplorerParameters("FilesystemExplorer")
+    serverparams.setDynValue("root", self.__outputFile.getParent())
+    server = dataManager.openServerExplorer("FilesystemExplorer", serverparams)
+    addparams = server.getAddParameters("Shape")
+    addparams.setDefaultFeatureType(self.createFeatureType())
+    addparams.setDynValue("shpFile",self.__outputFile)
+    addparams.setDynValue("crs",self.__projection)
+    addparams.setDynValue("geometryType",Geometry.TYPES.POINT)
+    server.add("Shape",addparams, False)
+
+  def run(self):
+    root = self.__outputFile.getParentFile()
+    metadata_reader = ImageGPSMetadata()
+    files = self.__inputFolder.list()
+    if self.__outputFile.exists():
+        self.__onFinish()
+        return
+        
+    self.createShape()
+      
+    store = self.openShape()
+    store.edit()
+    n = 0
+    for fname  in files:
+      n += 1
+      base, ext = os.path.splitext(fname)
+      if not ext.lower() in (".jpg",".png",".jpeg"):
+        continue
+      f  = File(self.__inputFolder,fname)
+          
+      metadata_reader.load(f)
+      feature = store.createNewFeature()
+      feature.setDefaultGeometry(metadata_reader.getPoint())
+      feature.set("id", n)
+      feature.set("text", fname)
+      feature.set("fname", fname)
+      feature.set("relpath", relpath(f.getAbsolutePath(),root.getAbsolutePath()))
+      feature.set("abspath", f.getAbsolutePath())
+      feature.set("altitude", metadata_reader.getAltitude(""))
+      feature.set("altitudere", metadata_reader.getAltitudeRef(""))
+      feature.set("datum", metadata_reader.getDatum(""))
+      feature.set("datestam", metadata_reader.getDate(""))
+      feature.set("timestam", metadata_reader.getTime(""))
+      store.insert(feature)
+
+    store.finishEditing()
+    if self.__addLayerToView:
+      layer = MapContextLocator.getMapContextManager().createLayer(
+        self.__outputFile.getName(),
+        store
+      )
+      currentView().getMapContext().getLayers().addLayer(layer)
+    self.__onFinish()
+
+
+
+class Photo2shapePanel(FormPanel):
+  def __init__(self):
+    FormPanel.__init__(self,script.getResource("photo2shape3.xml"))
+    self.getPanel().setPreferredSize(Dimension(500,140))
+    self.txtInputFolder.setText(script.getResource("data/test-images").getAbsolutePath())
+    self.txtOutputFile.setText(script.getResource("data/photos.shp").getAbsolutePath())
+
+  def showWindow(self):
+    FormPanel.showWindow(self, "Photo2shape")
+
+  def btnInputFolder_click(self, *args):
+    f = openFolderDialog("Select input folder")
+    if f == None or len(f)<1:
+      return
+    self.txtInputFolder.setText(f[0].getAbsolutePath())
+    
+  def btnOutputFile_click(self, *args):
+    f = saveFileDialog("Select output shape")
+    if f == None or len(f)<1:
+      return
+    self.txtOutputFile.setText(f[0].getAbsolutePath())
+    
+  def btnClose_click(self, *args):
+    self.hide()
+    
+  def btnMakeShape_click(self, *args):
+    if self.chkRemoveShape.isSelected():
+      try:
+        f = os.path.splitext(self.txtOutputFile.getText())[0]
+        os.remove(f+".shp")
+        os.remove(f+".shx")
+        os.remove(f+".dbf")
+      except:
+        pass
+    if os.path.exists(self.txtOutputFile.getText()) :
+      msgbox("output shapefile already exist")
+      return
+      
+    self.btnMakeShape.setEnabled(False)
+    self.btnClose.setEnabled(False)
+    
+    process = ProcessFolder()
+    process.setInputFoldername(self.txtInputFolder.getText())
+    process.setOutputFilename(self.txtOutputFile.getText())
+    process.setAddLayerToView(self.chkInsertLayer.isSelected())
+    process.setOnFinish(self.processFinished)
+    process.start()
+
+  def processFinished(self):
+    self.btnMakeShape.setEnabled(True)
+    self.btnClose.setEnabled(True)
+
+
+
+def main(*args):
+    win = Photo2shapePanel()
+    win.showWindow()
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape1.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape1.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape1.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = photo2shape1
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape2.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape2.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape2.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = photo2shape2
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.inf	(revision 1126)
@@ -0,0 +1,11 @@
+[Unit]
+type = Script
+name = photo2shape3
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/examples/photo2shape3.xml	(revision 1126)
@@ -0,0 +1,932 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/gvSIG/plugins/org.gvsig.scripting.app.extension/scripts/photo2shape/photo2shape3.xml</at>
+   <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Directory with images</at>
+            <at name="height">14</at>
+            <at name="name"/>
+            <at name="width">124</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Output shapefile </at>
+            <at name="height">14</at>
+            <at name="name"/>
+            <at name="width">124</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Insert as a layer</at>
+            <at name="height">14</at>
+            <at name="name"/>
+            <at name="width">124</at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="width">682</at>
+            <at name="name">txtInputFolder</at>
+            <at name="background" object="color">236,233,216</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="editable">false</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTextField</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTextField</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">20</at>
+            <at name="width">682</at>
+            <at name="name">txtOutputFile</at>
+            <at name="background" object="color">236,233,216</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="editable">false</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JCheckBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JCheckBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="selected">true</at>
+            <at name="height">15</at>
+            <at name="width">682</at>
+            <at name="name">chkInsertLayer</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Browse...</at>
+            <at name="height">22</at>
+            <at name="width">87</at>
+            <at name="name">btnInputFolder</at>
+            <at name="actionCommand">Browse...</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">5</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JButton</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JButton</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Browse...</at>
+            <at name="height">22</at>
+            <at name="width">87</at>
+            <at name="name">btnOutputFile</at>
+            <at name="actionCommand">Browse...</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.FormMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">10</at>
+           <at name="colspan">4</at>
+           <at name="rowspan">1</at>
+           <at name="halign">right</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+        </super>
+        <at name="id">embedded.387159005</at>
+        <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+        <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+        <at name="components">
+         <object classname="java.util.LinkedList">
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">3</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Process images</at>
+                 <at name="height">22</at>
+                 <at name="width">124</at>
+                 <at name="name">btnMakeShape</at>
+                 <at name="actionCommand">Ok</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Close</at>
+                 <at name="height">22</at>
+                 <at name="width">64</at>
+                 <at name="name">btnClose</at>
+                 <at name="actionCommand">Cerrar</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+         </object>
+        </at>
+        <at name="properties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.gui.form.GridView</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">21</at>
+              <at name="horizontalpolicy">31</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList"/>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="cellpainters">
+         <object classname="com.jeta.forms.store.support.Matrix">
+          <at name="rows">
+           <object classname="[Ljava.lang.Object;" size="1">
+            <at name="item" index="0">
+             <object classname="[Ljava.lang.Object;" size="3"/>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="rowgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+        <at name="colgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="text">Remove shape</at>
+            <at name="height">14</at>
+            <at name="width">124</at>
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">4</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JCheckBox</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JCheckBox</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">15</at>
+            <at name="width">682</at>
+            <at name="name">chkRemoveShape</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="11">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="9">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+       <at name="item" index="10">
+        <object classname="[Ljava.lang.Object;" size="6"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/photo2shape.py	(revision 1126)
@@ -0,0 +1,201 @@
+
+
+import os
+import os.path
+
+from gvsig import *
+from gvsig.commonsdialog import *
+from gvsig.geom import *
+
+from java.io import File
+from java.lang import Thread
+from java.awt import Dimension
+
+from org.gvsig.tools import ToolsLocator
+
+from org.gvsig.fmap.geom import GeometryLocator
+from org.gvsig.fmap.geom import Geometry
+
+from org.gvsig.fmap.dal import DALLocator
+from org.gvsig.fmap.dal import DataTypes
+
+from org.gvsig.fmap.mapcontext import MapContextLocator
+
+from imagegpsmetadata import ImageGPSMetadata
+from gvsig.libs.relpath import relpath
+from gvsig.libs.formpanel import ProgressBarWithTaskStatus,FormPanel
+
+
+class ProcessFolder(Thread):
+  def __init__(self):
+    self.__inputFolder = None
+    self.__outputFile = None
+    self.__addLayerToView = False
+    self.__projection = "EPSG:4326"
+    self.__onFinish = None
+
+
+  def setOnFinish(self,onFinish):
+    self.__onFinish = onFinish
+
+  def setInputFoldername(self, inputFoldername):
+    self.__inputFolder = File(inputFoldername)
+
+  def setOutputFilename(self, outputFilename):
+    self.__outputFile = File(outputFilename)
+
+  def setAddLayerToView(self, add):
+    self.__addLayerToView = add
+
+  def createFeatureType(self):
+    ft = DALLocator.getDataManager().createFeatureType()
+    ft.add("id",DataTypes.INT)
+    ft.add("text",DataTypes.STRING,100).setAllowNull(True)
+    ft.add("fname",DataTypes.STRING,100).setAllowNull(True)
+    ft.add("relpath",DataTypes.STRING,200).setAllowNull(True)
+    ft.add("abspath",DataTypes.STRING,200).setAllowNull(True)
+    ft.add("altitude",DataTypes.STRING,50).setAllowNull(True)
+    ft.add("altitudere",DataTypes.STRING,50).setAllowNull(True)
+    ft.add("datum",DataTypes.STRING,30).setAllowNull(True)
+    ft.add("datestam",DataTypes.STRING,30).setAllowNull(True)
+    ft.add("timestam",DataTypes.STRING,30).setAllowNull(True)
+
+    attrg = ft.add("geometry",DataTypes.GEOMETRY)
+    attrg.setGeometryType(
+      GeometryLocator.getGeometryManager().getGeometryType(
+        Geometry.TYPES.POINT,
+        Geometry.SUBTYPES.GEOM2D
+      )
+    )
+    return ft
+
+  def openShape(self):
+    dataManager = DALLocator.getDataManager()
+    openparams = dataManager.createStoreParameters("Shape")
+    openparams.setDynValue("shpFile",self.__outputFile)
+    openparams.setDynValue("crs",self.__projection)
+    featurestore = dataManager.openStore("Shape",openparams)
+    return featurestore
+
+  def createShape(self):
+    dataManager = DALLocator.getDataManager()
+
+    serverparams = dataManager.createServerExplorerParameters("FilesystemExplorer")
+    serverparams.setDynValue("root", self.__outputFile.getParent())
+    server = dataManager.openServerExplorer("FilesystemExplorer", serverparams)
+    addparams = server.getAddParameters("Shape")
+    addparams.setDefaultFeatureType(self.createFeatureType())
+    addparams.setDynValue("shpFile",self.__outputFile)
+    addparams.setDynValue("crs",self.__projection)
+    addparams.setDynValue("geometryType",Geometry.TYPES.POINT)
+    server.add("Shape",addparams, False)
+
+  def run(self):
+    root = self.__outputFile.getParentFile()
+    metadata_reader = ImageGPSMetadata()
+    files = self.__inputFolder.list()
+    if self.__outputFile.exists():
+        self.__onFinish()
+        return
+
+    self.createShape()
+
+    store = self.openShape()
+    store.edit()
+    n = 0
+    for fname  in files:
+      n += 1
+      base, ext = os.path.splitext(fname)
+      if not ext.lower() in (".jpg",".png",".jpeg"):
+        continue
+      f  = File(self.__inputFolder,fname)
+
+      metadata_reader.load(f)
+      feature = store.createNewFeature()
+      feature.setDefaultGeometry(metadata_reader.getPoint())
+      feature.set("id", n)
+      feature.set("text", fname)
+      feature.set("fname", fname)
+      feature.set("relpath", relpath(f.getAbsolutePath(),root.getAbsolutePath()))
+      feature.set("abspath", f.getAbsolutePath())
+      feature.set("altitude", metadata_reader.getAltitude(""))
+      feature.set("altitudere", metadata_reader.getAltitudeRef(""))
+      feature.set("datum", metadata_reader.getDatum(""))
+      feature.set("datestam", metadata_reader.getDate(""))
+      feature.set("timestam", metadata_reader.getTime(""))
+      store.insert(feature)
+
+    store.finishEditing()
+    if self.__addLayerToView and currentView()!=None:
+      layer = MapContextLocator.getMapContextManager().createLayer(
+        self.__outputFile.getName(),
+        store
+      )
+      currentView().getMapContext().getLayers().addLayer(layer)
+    self.__onFinish()
+
+
+
+class Photo2shapePanel(FormPanel):
+  def __init__(self):
+    FormPanel.__init__(self,getResource(__file__,"photo2shape.xml"))
+    self.getPanel().setPreferredSize(Dimension(500,140))
+    self.txtInputFolder.setText(getResource(__file__,"data/test-images")) #.getAbsolutePath())
+    self.txtOutputFile.setText(getTempFile("phots",".shp")) #getResource(__file__,"data/photos.shp")) #.getAbsolutePath())
+
+  def showWindow(self):
+    FormPanel.showWindow(self, "Photo2shape")
+
+  def btnInputFolder_click(self, *args):
+    f = openFolderDialog("Select input folder")
+    if f == None or len(f)<1:
+      return
+    self.txtInputFolder.setText(f[0]) #.getAbsolutePath())
+
+  def btnOutputFile_click(self, *args):
+    f = saveFileDialog("Select output shape")
+    if f == None or len(f)<1:
+      return
+    self.txtOutputFile.setText(f[0]) #.getAbsolutePath())
+
+  def btnClose_click(self, *args):
+    self.hide()
+
+  def btnMakeShape_click(self, *args):
+    if currentView() == None and self.chkInsertLayer.isSelected() :
+      msgbox("Need a view to add layer to it.")
+      return
+
+    if self.chkRemoveShape.isSelected():
+      try:
+        f = os.path.splitext(self.txtOutputFile.getText())[0]
+        os.remove(f+".shp")
+        os.remove(f+".shx")
+        os.remove(f+".dbf")
+      except:
+        pass
+    if os.path.exists(self.txtOutputFile.getText()) :
+      msgbox("output shapefile already exist")
+      return
+
+    self.btnMakeShape.setEnabled(False)
+    self.btnClose.setEnabled(False)
+
+    process = ProcessFolder()
+    process.setInputFoldername(self.txtInputFolder.getText())
+    process.setOutputFilename(self.txtOutputFile.getText())
+    process.setAddLayerToView(self.chkInsertLayer.isSelected())
+    process.setOnFinish(self.processFinished)
+    process.start()
+
+  def processFinished(self):
+    self.btnMakeShape.setEnabled(True)
+    self.btnClose.setEnabled(True)
+
+
+
+def main(*args):
+    win = Photo2shapePanel()
+    win.showWindow()
+
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/imagegpsmetadata.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/imagegpsmetadata.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/photo2shape/imagegpsmetadata.py	(revision 1126)
@@ -0,0 +1,91 @@
+
+
+#
+# ============================================
+#
+#  Lector de los metadatos de GPS de las imagenes
+#
+import os
+
+from gvsig.uselib import use_jar
+
+use_jar(os.path.join(os.path.dirname(__file__),"libs","metadata-extractor-2.8.1.jar"))
+use_jar(os.path.join(os.path.dirname(__file__),"libs","xmpcore-5.1.2.jar"))
+
+from com.drew.imaging import ImageMetadataReader
+
+
+class ImageGPSMetadata:
+  def __init__(self,pathname=None):
+    self.load(pathname)
+
+  def load(self, pathname):
+    self.__pathname = pathname
+    self.__values = dict()
+    if pathname != None:
+      metadata = ImageMetadataReader.readMetadata(pathname)
+      for directory in metadata.getDirectories():
+        if directory.getName() == "GPS":
+          for tag in directory.getTags():
+            self.__values[tag.getTagName().strip()] = tag.getDescription().strip()
+
+  def getLatitude(self, defaultValue=None):
+    return self.__values.get("GPS Latitude",defaultValue)
+
+  def getLatitudeRef(self, defaultValue=None):
+    return self.__values.get("GPS Latitude Ref",defaultValue)
+
+  def getLongitude(self, defaultValue=None):
+    return self.__values.get("GPS Longitude",defaultValue)
+
+  def getLongitudeRef(self, defaultValue=None):
+    return self.__values.get("GPS Longitude Ref",defaultValue)
+
+  def getAltitude(self, defaultValue=None):
+    return self.__values.get("GPS Altitude",defaultValue)
+
+  def getAltitudeRef(self, defaultValue=None):
+    return self.__values.get("GPS Altitude Ref",defaultValue)
+
+  def getDatum(self, defaultValue=None):
+    return self.__values.get("GPS Map Datum",defaultValue)
+
+  def getDate(self, defaultValue=None):
+    return self.__values.get("GPS Date Stamp",defaultValue)
+
+  def getTime(self, defaultValue=None):
+    return self.__values.get("GPS Time-Stam",defaultValue)
+
+  def hasPosition(self):
+    if self.getLatitude() == None or self.getLatitudeRef() == None or self.getLongitude() == None or self.getLongitudeRef() == None:
+      return False
+    return True
+
+  def getPoint(self):
+    import re
+
+    def getFloat(s):
+      return float(s.replace(",","."))
+
+    if not self.hasPosition():
+      return None
+
+    latitud_ref = self.getLatitudeRef().strip().lower()
+    longitud_ref = self.getLongitudeRef().strip().lower()
+
+    m = re.search("[ ]*([0-9,]+).* ([0-9,]+).* ([0-9,]+)", self.getLatitude())
+    la = getFloat(m.group(1)) + getFloat(m.group(2))/60 + getFloat(m.group(3))/3600
+    if latitud_ref == "S":
+      la = -la
+
+    m = re.search("[ ]*([0-9,]+).* ([0-9,]+).* ([0-9,]+)", self.getLongitude())
+    lo = getFloat(m.group(1)) + getFloat(m.group(2))/60 + getFloat(m.group(3))/3600
+    if longitud_ref in ("O", "W"):
+      lo = -lo
+
+    from org.gvsig.fmap.geom import GeometryLocator
+    from org.gvsig.fmap.geom import Geometry
+
+    geomManager = GeometryLocator.getGeometryManager()
+    point = geomManager.createPoint(lo,la, Geometry.SUBTYPES.GEOM2D)
+    return point
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.py	(revision 1126)
@@ -0,0 +1,254 @@
+
+from gvsig import *
+from gvsig.uselib import use_plugin
+
+# Habilitamos el acceso a los plugins de geodb y del documento tabla
+use_plugin("org.gvsig.app.document.table.app.mainplugin")
+use_plugin("org.gvsig.geodb.app.mainplugin")
+
+from gvsig.commonsdialog import *
+
+from gvsig.libs.formpanel import FormPanel
+
+from java.awt import BorderLayout
+from org.gvsig.fmap.dal import DALLocator
+from org.gvsig.fmap.dal.store.jdbc import JDBCServerExplorerParameters
+from org.gvsig.fmap.mapcontrol.dal.feature.swing.table import FeatureTableModel
+from org.gvsig.fmap.mapcontrol.dal.feature.swing.table import ConfigurableFeatureTableModel
+from org.gvsig.fmap.mapcontrol.dal.feature.swing import FeatureTablePanel
+from org.gvsig.fmap.mapcontrol.dal.feature.swing import FeatureTable
+from org.gvsig.app.project.documents.table import TableManager
+from org.gvsig.fmap.mapcontext import MapContextLocator
+from org.gvsig.geodb.vectorialdb.wizard import VectorialDBConnectionParamsDialog
+from org.gvsig.fmap.geom import GeometryLocator
+from org.gvsig.fmap.geom import Geometry
+
+from org.fife.ui.rsyntaxtextarea import RSyntaxTextArea
+from org.fife.ui.rsyntaxtextarea import SyntaxConstants
+from org.fife.ui.rtextarea import RTextScrollPane
+
+
+geom_types = (
+  ( "GEOMETRY", Geometry.TYPES.GEOMETRY ),
+  ( "POINT", Geometry.TYPES.POINT ),
+  ( "LINE", Geometry.TYPES.LINE ),
+  ( "POLYGON", Geometry.TYPES.POLYGON ),
+  ( "MULTIPOINT", Geometry.TYPES.MULTIPOINT ),
+  ( "MULTILINE", Geometry.TYPES.MULTICURVE ),
+  ( "MULTIPOLYGON", Geometry.TYPES.MULTISURFACE )
+)
+
+geom_subtypes = (
+  ( "2D", Geometry.SUBTYPES.GEOM2D ),
+  ( "2DM", Geometry.SUBTYPES.GEOM2DM ),
+  ( "3D", Geometry.SUBTYPES.GEOM3D ),
+  ( "3DM", Geometry.SUBTYPES.GEOM3DM )
+)
+
+
+class SQLConsole(FormPanel):
+
+  def __init__(self):
+    FormPanel.__init__(self, getResource(__file__,"sqlconsole.xml"))
+    self.featureTable = None
+    self.currentStore = None
+
+    dataManager = DALLocator.getDataManager()
+    pool = dataManager.getDataServerExplorerPool()
+    for entry in pool.iterator():
+      if isinstance(entry.getExplorerParameters(), JDBCServerExplorerParameters ) :
+        self.cboBaseDeDatos.addItem(entry.getName())
+    self.sqlContainer.setLayout(BorderLayout())
+    self.sqlContainer.add(self.getSQLTextarea(), BorderLayout.CENTER)
+    self.sqlContainer.updateUI()
+
+    self.cboGeomType.addItem("")
+    for geom_type in geom_types:
+      self.cboGeomType.addItem(geom_type[0])
+
+    self.cboGeomSubtype.addItem("")
+    for geom_subtype in geom_subtypes:
+      self.cboGeomSubtype.addItem(geom_subtype[0])
+
+
+  def show(self):
+    self.showWindow("SQL Console")
+
+  def getExplorer(self):
+    dataManager = DALLocator.getDataManager()
+    pool = dataManager.getDataServerExplorerPool()
+    name = self.cboBaseDeDatos.getSelectedItem()
+    params = pool.get(name).getExplorerParameters()
+    explorer = dataManager.openServerExplorer(params.getExplorerName(),params)
+    return explorer
+
+  def getMessageStack(self,ex):
+    msgs = ""
+    lastmsg = None
+    while ex != None:
+      msg = ex.getMessage()
+      if msg!=None and lastmsg != msg:
+        lastmsg = msg
+        msgs += "\n - " + msg
+      ex = ex.getCause()
+    return msgs
+
+  def getSQLTextarea(self):
+    self.txtSQL = RSyntaxTextArea(6,30)
+    self.txtSQL.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_SQL)
+    self.txtSQL.setCodeFoldingEnabled(True)
+    self.txtSQL.setClearWhitespaceLinesEnabled(True)
+    self.txtSQL.setAutoIndentEnabled(True)
+    self.txtSQL.setCloseCurlyBraces(True)
+    self.txtSQL.setWhitespaceVisible(True)
+    self.txtSQL.setAnimateBracketMatching(True)
+    self.txtSQL.setBracketMatchingEnabled(True)
+    self.txtSQL.setAutoIndentEnabled(True)
+    self.txtSQL.setTabsEmulated(True)
+    self.txtSQL.setTabSize(2)
+    self.txtSQL.setAntiAliasingEnabled(True)
+    self.txtSQL.setText("select * from municipios_navarra")
+    return  RTextScrollPane(self.txtSQL)
+
+
+  def btnEjecutar_click(self, *args):
+    explorer = self.getExplorer()
+    openParams = explorer.getOpenParameters()
+    openParams.setTable("--")
+    openParams.setSQL(self.txtSQL.getText())
+    try:
+      self.currentStore = explorer.open(openParams)
+    except Throwable, ex:
+      self.txtMensajes.setText(self.getMessageStack(ex))
+      if self.featureTable!=None:
+        self.featureTable.setVisible(False)
+      self.tabSalida.setSelectedIndex(1)
+      self.currentStore = None
+      return
+    if self.featureTable == None:
+      tablePanel = FeatureTablePanel(self.currentStore)
+      self.tableContainer.setLayout(BorderLayout())
+      self.tableContainer.add(tablePanel, BorderLayout.CENTER)
+      self.featureTable = tablePanel.getTable()
+      self.tableContainer.updateUI()
+    else:
+      tableModel = ConfigurableFeatureTableModel(self.currentStore, None)
+      self.featureTable.setModel(tableModel)
+
+    self.cboCampoGeometria.removeAllItems()
+    self.cboClavePrimaria.removeAllItems()
+    self.cboClavePrimaria.addItem("")
+
+    columNames = list()
+    ft = self.currentStore.getDefaultFeatureType()
+    for at in ft.getAttributeDescriptors():
+      name = at.getName()
+      columNames.append(name)
+      self.cboCampoGeometria.addItem(name)
+      self.cboClavePrimaria.addItem(name)
+
+
+    self.featureTable.getModel().setVisibleColumns(columNames)
+    self.cboCampoGeometria.setSelectedItem(ft.getDefaultGeometryAttributeName())
+    if not ft.getDefaultGeometryAttribute() in ("",None):
+      gt = ft.getDefaultGeometryAttribute().getGeomType()
+      n = 0
+      for v in geom_types:
+        if v[1] == gt.getType():
+          self.cboGeomType.setSelectedIndex(n)
+          break
+        n+=1
+      n = 0
+      for v in geom_subtypes:
+        if v[1] == gt.getSubType():
+          self.cboGeomSubtype.setSelectedIndex(n+1)
+          break
+        n+=1
+
+    self.txtMensajes.setText("")
+    self.featureTable.setVisible(True)
+    self.tabSalida.setSelectedIndex(0)
+
+
+  def btnAdministrar_click(self, *args):
+    dialog = VectorialDBConnectionParamsDialog()
+    dialog.showDialog()
+
+  def btnCargar_click(self, *args):
+    cargarComo = str(self.cboCargarComo.getSelectedItem())
+    if "tabla" in cargarComo.lower():
+      application = ApplicationLocator.getManager()
+      projectManager = application.getProjectManager()
+      tableDoc = projectManager.createDocument(TableManager.TYPENAME)
+      tableDoc.setStore(self.featureTable.getModel().getFeatureStore())
+      name = inputbox("Nombre del documento tabla", "Nombre", QUESTION, "Sql")
+      tableDoc.setName(name)
+      project = application.getCurrentProject()
+      project.addDocument(tableDoc)
+    else:
+      view = currentView()
+      if view == None:
+        msgbox("Debera haber una vista activa para realizar esta accion")
+        return
+      name = inputbox("Nombre de la capa", "Nombre", QUESTION, "Sql")
+      layer = MapContextLocator.getMapContextManager().createLayer(
+        name,
+        self.featureTable.getModel().getFeatureStore()
+      )
+      layers = view.getMapContext().getLayers().addLayer(layer)
+
+
+  def cboClavePrimaria_click(self, *args):
+    name = self.cboClavePrimaria.getSelectedItem()
+    if name in ("",None):
+      return
+    if self.currentStore == None:
+      return
+    ft = self.currentStore.getDefaultFeatureType().getEditable()
+    attr = ft.get(name)
+    if attr == None:
+      print "???? no encuentro la descripcion del atributo '%s'." % name
+      return
+    attr.setIsPrimaryKey(True)
+    self.currentStore.edit()
+    self.currentStore.update(ft)
+    self.currentStore.finishEditing()
+
+  def getGeomTypeByName(self,name):
+    for v in geom_types:
+      if v[0].lower() == name.lower():
+        return v[1]
+    return Geometry.TYPES.GEOMETRY
+
+  def getGeomSubtypeByName(self,name):
+    for v in geom_subtypes:
+      if v[0].lower() == name.lower():
+        return v[1]
+    return Geometry.SUBTYPES.GEOM2D
+
+  def cboGeomType_click(self,*args):
+    geom_type_name = self.cboGeomType.getSelectedItem()
+    geom_subtype_name = self.cboGeomSubtype.getSelectedItem()
+    if geom_type_name in ("",None):
+      return
+    geom_type = GeometryLocator.getGeometryManager().getGeometryType(
+      self.getGeomTypeByName(geom_type_name),
+      self.getGeomSubtypeByName(geom_subtype_name)
+    )
+    ft = self.currentStore.getDefaultFeatureType().getEditable()
+    attr = ft.getDefaultGeometryAttribute()
+    if attr == None:
+      return
+    attr.setGeometryType(geom_type)
+    self.currentStore.edit()
+    self.currentStore.update(ft)
+    self.currentStore.finishEditing()
+
+  def cboGeomSubtype_click(self,*args):
+    self.cboGeomType_click(*args)
+
+
+def main(*args):
+  sqlconsole = SQLConsole()
+  sqlconsole.show()
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.inf
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.inf	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.inf	(revision 1126)
@@ -0,0 +1,15 @@
+[Unit]
+type = Script
+name = sqlconsole
+description = 
+createdBy = 
+version = 
+
+[Script]
+main = main
+Lang = python
+
+[script]
+enable = true
+isolation = 0
+
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools/sqlconsole/sqlconsole.xml	(revision 1126)
@@ -0,0 +1,1836 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<object classname="com.jeta.forms.store.memento.FormPackage">
+ <at name="fileversion">
+  <object classname="com.jeta.forms.store.memento.FormsVersion2">
+   <at name="major">2</at>
+   <at name="minor">0</at>
+   <at name="sub">0</at>
+  </object>
+ </at>
+ <at name="form">
+  <object classname="com.jeta.forms.store.memento.FormMemento">
+   <super classname="com.jeta.forms.store.memento.ComponentMemento">
+    <at name="cellconstraints">
+     <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+      <at name="column">1</at>
+      <at name="row">1</at>
+      <at name="colspan">1</at>
+      <at name="rowspan">1</at>
+      <at name="halign">default</at>
+      <at name="valign">default</at>
+      <at name="insets" object="insets">0,0,0,0</at>
+     </object>
+    </at>
+    <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+   </super>
+   <at name="id">/home/jjdelcerro/gvSIG/plugins/org.gvsig.scripting.app.extension/scripts/pgconsole/resources/pgconsole.xml</at>
+   <at name="path">gvSIG/plugins/org.gvsig.scripting.app.extension/scripts/pgconsole/resources/pgconsole.xml</at>
+   <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+   <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE</at>
+   <at name="components">
+    <object classname="java.util.LinkedList">
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.FormMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">5</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">right</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+        </super>
+        <at name="id">embedded.784121326</at>
+        <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+        <at name="colspecs">RIGHT:DEFAULT:NONE</at>
+        <at name="components">
+         <object classname="java.util.LinkedList">
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Ejecutar</at>
+                 <at name="height">22</at>
+                 <at name="width">78</at>
+                 <at name="name">btnEjecutar</at>
+                 <at name="actionCommand">Ejecutar</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+         </object>
+        </at>
+        <at name="properties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.gui.form.GridView</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">21</at>
+              <at name="horizontalpolicy">31</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList"/>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="cellpainters">
+         <object classname="com.jeta.forms.store.support.Matrix">
+          <at name="rows">
+           <object classname="[Ljava.lang.Object;" size="1">
+            <at name="item" index="0">
+             <object classname="[Ljava.lang.Object;" size="1"/>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="rowgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+        <at name="colgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.FormMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">2</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+        </super>
+        <at name="id">embedded.1850559620</at>
+        <at name="rowspecs">CENTER:DEFAULT:NONE</at>
+        <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+        <at name="components">
+         <object classname="java.util.LinkedList">
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Conexion</at>
+                 <at name="height">14</at>
+                 <at name="width">52</at>
+                 <at name="name">lblBaseDeDatos</at>
+                 <at name="fill">
+                  <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                   <at name="name">fill</at>
+                  </object>
+                 </at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">3</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JComboBox</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JComboBox</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="height">20</at>
+                 <at name="items">
+                  <object classname="com.jeta.forms.store.properties.ItemsProperty">
+                   <at name="name">items</at>
+                  </object>
+                 </at>
+                 <at name="width">728</at>
+                 <at name="name">cboBaseDeDatos</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">5</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Conexiones</at>
+                 <at name="height">22</at>
+                 <at name="width">98</at>
+                 <at name="name">btnAdministrar</at>
+                 <at name="actionCommand">Administrar</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+         </object>
+        </at>
+        <at name="properties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.gui.form.GridView</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="name"/>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">21</at>
+              <at name="horizontalpolicy">31</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList"/>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="cellpainters">
+         <object classname="com.jeta.forms.store.support.Matrix">
+          <at name="rows">
+           <object classname="[Ljava.lang.Object;" size="1">
+            <at name="item" index="0">
+             <object classname="[Ljava.lang.Object;" size="5"/>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="rowgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+        <at name="colgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">6</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormContainerComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JTabbedPane</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JTabbedPane</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">260</at>
+            <at name="componentCount">2</at>
+            <at name="width">923</at>
+            <at name="name">tabSalida</at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="tabs">
+             <object classname="com.jeta.forms.store.properties.TabbedPaneProperties">
+              <at name="name">tabs</at>
+              <at name="items">
+               <object classname="java.util.LinkedList">
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.TabProperty">
+                   <at name="name">tab</at>
+                   <at name="title">Tabla</at>
+                   <at name="icon">
+                    <object classname="com.jeta.forms.store.properties.IconProperty">
+                     <at name="embedded">false</at>
+                     <at name="width">0</at>
+                     <at name="height">0</at>
+                    </object>
+                   </at>
+                   <at name="form">
+                    <object classname="com.jeta.forms.store.memento.FormMemento">
+                     <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                      <at name="cellconstraints">
+                       <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                        <at name="column">1</at>
+                        <at name="row">1</at>
+                        <at name="colspan">1</at>
+                        <at name="rowspan">1</at>
+                        <at name="halign">default</at>
+                        <at name="valign">default</at>
+                        <at name="insets" object="insets">0,0,0,0</at>
+                       </object>
+                      </at>
+                      <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+                     </super>
+                     <at name="id">embedded.804397586</at>
+                     <at name="rowspecs">FILL:DEFAULT:GROW(1.0)</at>
+                     <at name="colspecs">FILL:DEFAULT:GROW(1.0)</at>
+                     <at name="components">
+                      <object classname="java.util.LinkedList">
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">1</at>
+                             <at name="row">1</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">default</at>
+                             <at name="valign">default</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JPanel</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JPanel</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="height">184</at>
+                              <at name="width">892</at>
+                              <at name="name">tableContainer</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                      </object>
+                     </at>
+                     <at name="properties">
+                      <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                       <at name="classname">com.jeta.forms.gui.form.GridView</at>
+                       <at name="properties">
+                        <object classname="com.jeta.forms.store.support.PropertyMap">
+                         <at name="name"/>
+                         <at name="fill">
+                          <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                           <at name="name">fill</at>
+                          </object>
+                         </at>
+                         <at name="scollBars">
+                          <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                           <at name="name">scollBars</at>
+                           <at name="verticalpolicy">21</at>
+                           <at name="horizontalpolicy">31</at>
+                           <at name="border">
+                            <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                             <super classname="com.jeta.forms.store.properties.BorderProperty">
+                              <at name="name">border</at>
+                             </super>
+                             <at name="borders">
+                              <object classname="java.util.LinkedList">
+                               <item >
+                                <at name="value">
+                                 <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                 </object>
+                                </at>
+                               </item>
+                              </object>
+                             </at>
+                            </object>
+                           </at>
+                          </object>
+                         </at>
+                         <at name="border">
+                          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                           <super classname="com.jeta.forms.store.properties.BorderProperty">
+                            <at name="name">border</at>
+                           </super>
+                           <at name="borders">
+                            <object classname="java.util.LinkedList"/>
+                           </at>
+                          </object>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="cellpainters">
+                      <object classname="com.jeta.forms.store.support.Matrix">
+                       <at name="rows">
+                        <object classname="[Ljava.lang.Object;" size="1">
+                         <at name="item" index="0">
+                          <object classname="[Ljava.lang.Object;" size="1"/>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="rowgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="colgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </item>
+                <item >
+                 <at name="value">
+                  <object classname="com.jeta.forms.store.properties.TabProperty">
+                   <at name="name">tab</at>
+                   <at name="title">Mensajes</at>
+                   <at name="icon">
+                    <object classname="com.jeta.forms.store.properties.IconProperty">
+                     <at name="embedded">false</at>
+                     <at name="width">0</at>
+                     <at name="height">0</at>
+                    </object>
+                   </at>
+                   <at name="form">
+                    <object classname="com.jeta.forms.store.memento.FormMemento">
+                     <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                      <at name="cellconstraints">
+                       <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                        <at name="column">1</at>
+                        <at name="row">1</at>
+                        <at name="colspan">1</at>
+                        <at name="rowspan">1</at>
+                        <at name="halign">default</at>
+                        <at name="valign">default</at>
+                        <at name="insets" object="insets">0,0,0,0</at>
+                       </object>
+                      </at>
+                      <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+                     </super>
+                     <at name="id">embedded.1003318076</at>
+                     <at name="rowspecs">CENTER:DEFAULT:GROW(1.0)</at>
+                     <at name="colspecs">FILL:DEFAULT:GROW(1.0)</at>
+                     <at name="components">
+                      <object classname="java.util.LinkedList">
+                       <item >
+                        <at name="value">
+                         <object classname="com.jeta.forms.store.memento.BeanMemento">
+                          <super classname="com.jeta.forms.store.memento.ComponentMemento">
+                           <at name="cellconstraints">
+                            <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                             <at name="column">1</at>
+                             <at name="row">1</at>
+                             <at name="colspan">1</at>
+                             <at name="rowspan">1</at>
+                             <at name="halign">fill</at>
+                             <at name="valign">fill</at>
+                             <at name="insets" object="insets">0,0,0,0</at>
+                            </object>
+                           </at>
+                           <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+                          </super>
+                          <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+                          <at name="beanclass">javax.swing.JTextArea</at>
+                          <at name="beanproperties">
+                           <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                            <at name="classname">javax.swing.JTextArea</at>
+                            <at name="properties">
+                             <object classname="com.jeta.forms.store.support.PropertyMap">
+                              <at name="scrollableTracksViewportWidth">true</at>
+                              <at name="height">182</at>
+                              <at name="width">890</at>
+                              <at name="name">txtMensajes</at>
+                              <at name="scollBars">
+                               <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                                <at name="name">scollBars</at>
+                                <at name="verticalpolicy">20</at>
+                                <at name="horizontalpolicy">30</at>
+                                <at name="border">
+                                 <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                  <at name="borders">
+                                   <object classname="java.util.LinkedList">
+                                    <item >
+                                     <at name="value">
+                                      <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                       <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                        <at name="name">border</at>
+                                       </super>
+                                      </object>
+                                     </at>
+                                    </item>
+                                   </object>
+                                  </at>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="border">
+                               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                 <at name="name">border</at>
+                                </super>
+                                <at name="borders">
+                                 <object classname="java.util.LinkedList">
+                                  <item >
+                                   <at name="value">
+                                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                      <at name="name">border</at>
+                                     </super>
+                                    </object>
+                                   </at>
+                                  </item>
+                                 </object>
+                                </at>
+                               </object>
+                              </at>
+                              <at name="scrollableTracksViewportHeight">true</at>
+                             </object>
+                            </at>
+                           </object>
+                          </at>
+                         </object>
+                        </at>
+                       </item>
+                      </object>
+                     </at>
+                     <at name="properties">
+                      <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+                       <at name="classname">com.jeta.forms.gui.form.GridView</at>
+                       <at name="properties">
+                        <object classname="com.jeta.forms.store.support.PropertyMap">
+                         <at name="name"/>
+                         <at name="fill">
+                          <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                           <at name="name">fill</at>
+                          </object>
+                         </at>
+                         <at name="scollBars">
+                          <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+                           <at name="name">scollBars</at>
+                           <at name="verticalpolicy">21</at>
+                           <at name="horizontalpolicy">31</at>
+                           <at name="border">
+                            <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                             <super classname="com.jeta.forms.store.properties.BorderProperty">
+                              <at name="name">border</at>
+                             </super>
+                             <at name="borders">
+                              <object classname="java.util.LinkedList">
+                               <item >
+                                <at name="value">
+                                 <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                                  <super classname="com.jeta.forms.store.properties.BorderProperty">
+                                   <at name="name">border</at>
+                                  </super>
+                                 </object>
+                                </at>
+                               </item>
+                              </object>
+                             </at>
+                            </object>
+                           </at>
+                          </object>
+                         </at>
+                         <at name="border">
+                          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                           <super classname="com.jeta.forms.store.properties.BorderProperty">
+                            <at name="name">border</at>
+                           </super>
+                           <at name="borders">
+                            <object classname="java.util.LinkedList"/>
+                           </at>
+                          </object>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="cellpainters">
+                      <object classname="com.jeta.forms.store.support.Matrix">
+                       <at name="rows">
+                        <object classname="[Ljava.lang.Object;" size="1">
+                         <at name="item" index="0">
+                          <object classname="[Ljava.lang.Object;" size="1"/>
+                         </at>
+                        </object>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="rowgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                     <at name="colgroups">
+                      <object classname="com.jeta.forms.store.memento.FormGroupSet">
+                       <at name="groups">
+                        <object classname="java.util.HashMap"/>
+                       </at>
+                      </object>
+                     </at>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </item>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="tabCount">2</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.FormMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">8</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">fill</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at>
+        </super>
+        <at name="id">embedded.1568742741</at>
+        <at name="rowspecs">CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE</at>
+        <at name="colspecs">FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:200PX:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:200PX:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE</at>
+        <at name="components">
+         <object classname="java.util.LinkedList">
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Clave primaria</at>
+                 <at name="height">14</at>
+                 <at name="width">104</at>
+                 <at name="name"></at>
+                 <at name="fill">
+                  <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                   <at name="name">fill</at>
+                  </object>
+                 </at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">3</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JComboBox</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JComboBox</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="height">20</at>
+                 <at name="items">
+                  <object classname="com.jeta.forms.store.properties.ItemsProperty">
+                   <at name="name">items</at>
+                  </object>
+                 </at>
+                 <at name="width">196</at>
+                 <at name="name">cboClavePrimaria</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">5</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Campo geometria</at>
+                 <at name="height">14</at>
+                 <at name="width">102</at>
+                 <at name="name">lblCampoGeometria</at>
+                 <at name="fill">
+                  <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                   <at name="name">fill</at>
+                  </object>
+                 </at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">7</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JComboBox</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JComboBox</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="height">20</at>
+                 <at name="items">
+                  <object classname="com.jeta.forms.store.properties.ItemsProperty">
+                   <at name="name">items</at>
+                  </object>
+                 </at>
+                 <at name="width">196</at>
+                 <at name="name">cboCampoGeometria</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">11</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JComboBox</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JComboBox</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="height">18</at>
+                 <at name="selectedItem">
+                  <object classname="com.jeta.forms.store.properties.ListItemProperty">
+                   <at name="name">listitem</at>
+                   <at name="label">Tabla</at>
+                   <at name="icon">
+                    <object classname="com.jeta.forms.store.properties.IconProperty">
+                     <at name="embedded">false</at>
+                     <at name="width">0</at>
+                     <at name="height">0</at>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="items">
+                  <object classname="com.jeta.forms.store.properties.ItemsProperty">
+                   <at name="name">items</at>
+                   <at name="items">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.ListItemProperty">
+                        <at name="name">listitem</at>
+                        <at name="label">Tabla</at>
+                        <at name="icon">
+                         <object classname="com.jeta.forms.store.properties.IconProperty">
+                          <at name="embedded">false</at>
+                          <at name="width">0</at>
+                          <at name="height">0</at>
+                         </object>
+                        </at>
+                       </object>
+                      </at>
+                     </item>
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.ListItemProperty">
+                        <at name="name">listitem</at>
+                        <at name="label">Capa</at>
+                        <at name="icon">
+                         <object classname="com.jeta.forms.store.properties.IconProperty">
+                          <at name="embedded">false</at>
+                          <at name="width">0</at>
+                          <at name="height">0</at>
+                         </object>
+                        </at>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                 <at name="width">55</at>
+                 <at name="name">cboCargarComo</at>
+                 <at name="itemCount">2</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">13</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JButton</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JButton</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Cargar</at>
+                 <at name="height">22</at>
+                 <at name="width">71</at>
+                 <at name="name">btnCargar</at>
+                 <at name="actionCommand">Cargar</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">3</at>
+                <at name="row">3</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JComboBox</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JComboBox</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="height">20</at>
+                 <at name="items">
+                  <object classname="com.jeta.forms.store.properties.ItemsProperty">
+                   <at name="name">items</at>
+                  </object>
+                 </at>
+                 <at name="width">196</at>
+                 <at name="name">cboGeomType</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">1</at>
+                <at name="row">3</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Tipo de geometria</at>
+                 <at name="height">14</at>
+                 <at name="width">104</at>
+                 <at name="name"></at>
+                 <at name="fill">
+                  <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                   <at name="name">fill</at>
+                  </object>
+                 </at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">7</at>
+                <at name="row">3</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">javax.swing.JComboBox</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">javax.swing.JComboBox</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="height">20</at>
+                 <at name="items">
+                  <object classname="com.jeta.forms.store.properties.ItemsProperty">
+                   <at name="name">items</at>
+                  </object>
+                 </at>
+                 <at name="width">196</at>
+                 <at name="name">cboGeomSubtype</at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">5</at>
+                <at name="row">3</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Subtipo</at>
+                 <at name="height">14</at>
+                 <at name="width">102</at>
+                 <at name="name"></at>
+                 <at name="fill">
+                  <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                   <at name="name">fill</at>
+                  </object>
+                 </at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+          <item >
+           <at name="value">
+            <object classname="com.jeta.forms.store.memento.BeanMemento">
+             <super classname="com.jeta.forms.store.memento.ComponentMemento">
+              <at name="cellconstraints">
+               <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+                <at name="column">9</at>
+                <at name="row">1</at>
+                <at name="colspan">1</at>
+                <at name="rowspan">1</at>
+                <at name="halign">default</at>
+                <at name="valign">default</at>
+                <at name="insets" object="insets">0,0,0,0</at>
+               </object>
+              </at>
+              <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+             </super>
+             <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+             <at name="beanclass">com.jeta.forms.components.label.JETALabel</at>
+             <at name="beanproperties">
+              <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+               <at name="classname">com.jeta.forms.components.label.JETALabel</at>
+               <at name="properties">
+                <object classname="com.jeta.forms.store.support.PropertyMap">
+                 <at name="text">Cargar como</at>
+                 <at name="height">14</at>
+                 <at name="width">74</at>
+                 <at name="name"></at>
+                 <at name="fill">
+                  <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+                   <at name="name">fill</at>
+                  </object>
+                 </at>
+                 <at name="border">
+                  <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                   <super classname="com.jeta.forms.store.properties.BorderProperty">
+                    <at name="name">border</at>
+                   </super>
+                   <at name="borders">
+                    <object classname="java.util.LinkedList">
+                     <item >
+                      <at name="value">
+                       <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                        <super classname="com.jeta.forms.store.properties.BorderProperty">
+                         <at name="name">border</at>
+                        </super>
+                       </object>
+                      </at>
+                     </item>
+                    </object>
+                   </at>
+                  </object>
+                 </at>
+                </object>
+               </at>
+              </object>
+             </at>
+            </object>
+           </at>
+          </item>
+         </object>
+        </at>
+        <at name="properties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">com.jeta.forms.gui.form.GridView</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="name"></at>
+            <at name="fill">
+             <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+              <at name="name">fill</at>
+             </object>
+            </at>
+            <at name="scollBars">
+             <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+              <at name="name">scollBars</at>
+              <at name="verticalpolicy">21</at>
+              <at name="horizontalpolicy">31</at>
+              <at name="border">
+               <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+                <at name="borders">
+                 <object classname="java.util.LinkedList">
+                  <item >
+                   <at name="value">
+                    <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                     <super classname="com.jeta.forms.store.properties.BorderProperty">
+                      <at name="name">border</at>
+                     </super>
+                    </object>
+                   </at>
+                  </item>
+                 </object>
+                </at>
+               </object>
+              </at>
+             </object>
+            </at>
+            <at name="border">
+             <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+              <super classname="com.jeta.forms.store.properties.BorderProperty">
+               <at name="name">border</at>
+              </super>
+              <at name="borders">
+               <object classname="java.util.LinkedList"/>
+              </at>
+             </object>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="cellpainters">
+         <object classname="com.jeta.forms.store.support.Matrix">
+          <at name="rows">
+           <object classname="[Ljava.lang.Object;" size="3">
+            <at name="item" index="0">
+             <object classname="[Ljava.lang.Object;" size="13"/>
+            </at>
+            <at name="item" index="1">
+             <object classname="[Ljava.lang.Object;" size="13"/>
+            </at>
+            <at name="item" index="2">
+             <object classname="[Ljava.lang.Object;" size="13"/>
+            </at>
+           </object>
+          </at>
+         </object>
+        </at>
+        <at name="rowgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+        <at name="colgroups">
+         <object classname="com.jeta.forms.store.memento.FormGroupSet">
+          <at name="groups">
+           <object classname="java.util.HashMap"/>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+     <item >
+      <at name="value">
+       <object classname="com.jeta.forms.store.memento.BeanMemento">
+        <super classname="com.jeta.forms.store.memento.ComponentMemento">
+         <at name="cellconstraints">
+          <object classname="com.jeta.forms.store.memento.CellConstraintsMemento">
+           <at name="column">2</at>
+           <at name="row">4</at>
+           <at name="colspan">1</at>
+           <at name="rowspan">1</at>
+           <at name="halign">default</at>
+           <at name="valign">default</at>
+           <at name="insets" object="insets">0,0,0,0</at>
+          </object>
+         </at>
+         <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at>
+        </super>
+        <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at>
+        <at name="beanclass">javax.swing.JPanel</at>
+        <at name="beanproperties">
+         <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+          <at name="classname">javax.swing.JPanel</at>
+          <at name="properties">
+           <object classname="com.jeta.forms.store.support.PropertyMap">
+            <at name="height">12</at>
+            <at name="width">923</at>
+            <at name="name">sqlContainer</at>
+           </object>
+          </at>
+         </object>
+        </at>
+       </object>
+      </at>
+     </item>
+    </object>
+   </at>
+   <at name="properties">
+    <object classname="com.jeta.forms.store.memento.PropertiesMemento">
+     <at name="classname">com.jeta.forms.gui.form.GridView</at>
+     <at name="properties">
+      <object classname="com.jeta.forms.store.support.PropertyMap">
+       <at name="name"></at>
+       <at name="fill">
+        <object classname="com.jeta.forms.store.properties.effects.PaintProperty">
+         <at name="name">fill</at>
+        </object>
+       </at>
+       <at name="scollBars">
+        <object classname="com.jeta.forms.store.properties.ScrollBarsProperty">
+         <at name="name">scollBars</at>
+         <at name="verticalpolicy">21</at>
+         <at name="horizontalpolicy">31</at>
+         <at name="border">
+          <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+           <super classname="com.jeta.forms.store.properties.BorderProperty">
+            <at name="name">border</at>
+           </super>
+           <at name="borders">
+            <object classname="java.util.LinkedList">
+             <item >
+              <at name="value">
+               <object classname="com.jeta.forms.store.properties.DefaultBorderProperty">
+                <super classname="com.jeta.forms.store.properties.BorderProperty">
+                 <at name="name">border</at>
+                </super>
+               </object>
+              </at>
+             </item>
+            </object>
+           </at>
+          </object>
+         </at>
+        </object>
+       </at>
+       <at name="border">
+        <object classname="com.jeta.forms.store.properties.CompoundBorderProperty">
+         <super classname="com.jeta.forms.store.properties.BorderProperty">
+          <at name="name">border</at>
+         </super>
+         <at name="borders">
+          <object classname="java.util.LinkedList"/>
+         </at>
+        </object>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="cellpainters">
+    <object classname="com.jeta.forms.store.support.Matrix">
+     <at name="rows">
+      <object classname="[Ljava.lang.Object;" size="9">
+       <at name="item" index="0">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="1">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="2">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="3">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="4">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="5">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="6">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="7">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+       <at name="item" index="8">
+        <object classname="[Ljava.lang.Object;" size="3"/>
+       </at>
+      </object>
+     </at>
+    </object>
+   </at>
+   <at name="rowgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+   <at name="colgroups">
+    <object classname="com.jeta.forms.store.memento.FormGroupSet">
+     <at name="groups">
+      <object classname="java.util.HashMap"/>
+     </at>
+    </object>
+   </at>
+  </object>
+ </at>
+</object>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools-scripting-console-jython.py
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools-scripting-console-jython.py	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts/tools-scripting-console-jython.py	(revision 1126)
@@ -0,0 +1,5 @@
+from console import console
+
+def main():
+  console.main() 
+  

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/scripts
___________________________________________________________________
Added: svn:ignore
   + .directory


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib.versions
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib.versions	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/scripting/lib.versions	(revision 1126)
@@ -0,0 +1 @@
+-2_0_0=gvSIG desktop 2.2.0
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/config.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/config.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/config.xml	(revision 1126)
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<plugin-config>
+    <depends plugin-name="org.gvsig.app.mainplugin" />
+    <depends plugin-name="org.gvsig.app.document.table.app.mainplugin" />
+    <depends plugin-name="org.gvsig.raster.mainplugin" optional="true" />
+    <resourceBundle name="text"/>
+    <libraries library-dir="lib"/>
+    <extensions>
+        <extension class-name="org.gvsig.scripting.app.extension.ScriptingExtension"
+                           description="Extensi�n para el manejo de scripts en gvSIG."
+                           active="true"
+                           priority="1">
+
+            <action 
+                name="tools-scripting-launcher"
+                label="_Show_scripting_launcher" 
+                position="908300100"  
+                tooltip="_Show_scripting_launcher" 
+                action-command="tools-scripting-launcher"
+                icon="tools-scripting-launcher"
+                accelerator=""
+            />
+
+            <action 
+                name="tools-scripting-composer"
+                label="_Show_scripting_composer" 
+                position="908300200"  
+                tooltip="_Show_scripting_composer" 
+                action-command="tools-scripting-composer"
+                icon="tools-scripting-composer"
+                accelerator=""
+            />
+
+            <action 
+                name="tools-scripting-console-jython"
+                label="_Show_scripting_jython_console" 
+                position="908300300"  
+                tooltip="_Show_scripting_console-jython" 
+                action-command="tools-scripting-console-jython"
+                icon="tools-scripting-console-jython"
+                accelerator=""
+            />
+
+
+            <menu text="tools/_Scripting"
+                              position="908300000" 
+                              is_separator="true"/>
+            <menu text="tools/_Scripting/Scripting_Launcher" 
+                              name="tools-scripting-launcher"/>
+            <menu text="tools/_Scripting/Scripting_Composer" 
+                              name="tools-scripting-composer"/>
+            <menu text="tools/_Scripting/Jython_Console" 
+                          name="tools-scripting-console-jython"/>
+				
+            <tool-bar name="scripting" position="2000">
+                <action-tool name="tools-scripting-launcher"/>				
+            </tool-bar>
+        </extension>	
+        <extension class-name="org.gvsig.scripting.app.extension.ScriptLaunchExtension"
+                           description="Extensi�n para la ejecucion de scripts en gvSIG."
+                           active="true"
+                           priority="1">                
+        </extension>	
+    </extensions>
+</plugin-config>
Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/action/tools-scripting-composer.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/action/tools-scripting-composer.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/action/tools-scripting-console-jython.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/action/tools-scripting-console-jython.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/action/tools-scripting-launcher.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/action/tools-scripting-launcher.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/spinner.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/images/spinner.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/autorun.sh
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/autorun.sh	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin/autorun.sh	(revision 1126)
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# gvSIG. Desktop Geographic Information System.
+#
+# Copyright (C) 2007-2013 gvSIG Association.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+#
+# For any additional information, do not hesitate to contact us
+# at info AT gvsig.com, or visit our website www.gvsig.com.
+#
+
+
+#
+# Plugin autorun
+#
+
+PLUGIN_NAME=$(basename "$PLUGIN_FOLDER")
+
+# https://redmine.gvsig.net/redmine/issues/3975
+jythonjar=$(echo "$PLUGIN_FOLDER/lib/"*jython*.jar)
+add_property python.home "$jythonjar"
+
+add_property python.cachedir "$GVSIG_HOME_FOLDER/plugins/$PLUGIN_NAME/python.cachedir"
+
+xmkdir -p "$GVSIG_HOME_FOLDER/plugins/$PLUGIN_NAME/scripts"
+cd "$GVSIG_HOME_FOLDER/plugins/$PLUGIN_NAME/scripts"
+
+#
+# El find casca en win10 64 bits. Parece que hay algun problema con los
+# pipes y el find y el ls.
+if [ "${OS}" != "win" ] ; then
+  sc_autoruns=$(find . -name autorun.sh)
+  cd "$GVSIG_INSTALL_FOLDER"
+  for sc_autorun in $sc_autoruns
+  do
+    sc_autorun="$GVSIG_HOME_FOLDER/plugins/$PLUGIN_NAME/scripts/$sc_autorun"
+    if [ -r "$sc_autorun" ] ; then
+      logger_info "Running scripting autorun from $sc_autorun"
+      . "$sc_autorun"
+      cd "$GVSIG_INSTALL_FOLDER"
+    fi
+  done
+fi
\ No newline at end of file

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources-plugin
___________________________________________________________________
Added: svn:ignore
   + .directory


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources/images/spinner.gif
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/src/main/resources/images/spinner.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin/pom.xml	(revision 1126)
@@ -0,0 +1,331 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.gvsig.scripting.app.mainplugin</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <description><![CDATA[
+This plugin provides support for scripting to gvSIG.
+Among other things it contains:
+
+- The gvSIG scripting engine
+- The gvSIG script editor
+- Script engines for:
+   - Jython
+   - Groovy
+   - javascript
+   - Renjin
+
+- The script install module for the add-on manager.
+- Utilities to generate packages of complements with our scripts.
+- Python libraries as:
+   - Six - Utilities for writing code that runs on Python 2 and 3
+   - PyLint - Python source code analyzer
+   - Pygments - syntax highlighting package
+   - CSSUtils - CSS Cascading Style Sheets library
+   - Docutils - Python Documentation Utilities
+   - geopy - client for several popular geocoding web services
+   - PyInliner - CSS-to-inline-styles conversion tool for HTML
+   - Statistics - functions for calculating statistics of data
+   - Cartodb - simple CartoDB client to perform requests against the CartoDB API
+
+- Java libraries to use from scripting like:
+   - Abeille forms deseigner
+   - jOpenDocument
+   - JNumeric
+   - CSSBox
+
+
+This plugin can be configured to be preinstalled automatically, allowing 
+"Script" type plugins to be installed during the application installation process. 
+To do this, the following entries must be added to the "packages.properties" 
+of gvspks::
+
+    installers=scripts
+    installer.scripts.initializer=org.gvsig.scripting.app.extension.ScriptsInstallerInitializer
+    installer.scripts.package.code=org.gvsig.scripting.app.mainplugin
+    installer.scripts.factory.name=Script
+    installer.scripts.libs=lib
+
+If the "installers" entry already exists, add "scripts" to the end separating 
+it with a space.    
+                            
+]]></description>
+    <parent>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.scripting.app</artifactId>
+        <version>2.3.75</version>
+    </parent>
+    <dependencies>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.tools.lib</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.tools.lib</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.i18n</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.andami</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.app.document.table.app.mainplugin</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.app.mainplugin</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.tools.swing.impl</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.about.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.lib.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.swing.api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.lib.impl</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.swing.impl</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- force adding -->
+        <dependency>
+            <groupId>org.ini4j</groupId>
+            <artifactId>ini4j</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.sourceforge.thinlet</groupId>
+            <artifactId>thinlet</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gvsig</groupId>
+            <artifactId>org.gvsig.scripting.thing</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.jeta</groupId>
+            <artifactId>abeille</artifactId>
+            <type>tar.gz</type>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jopendocument</groupId>
+            <artifactId>jOpenDocument</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.github.tbekolay.jnumeric</groupId>
+            <artifactId>jnumeric</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+ 
+        <dependency>
+            <groupId>org.apache.tika</groupId>
+            <artifactId>tika-core</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.python</groupId>
+            <artifactId>${jython.artifactId}</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-all</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.renjin</groupId>
+            <artifactId>renjin-script-engine</artifactId>
+            <classifier>jar-with-dependencies</classifier>
+            <scope>runtime</scope>
+        </dependency>      
+        
+        <!--
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-dist</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-compiler</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-reflect</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scalap</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>jline</groupId>
+            <artifactId>jline</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        -->
+        <dependency>
+            <groupId>net.sf.cssbox</groupId>
+            <artifactId>swingbox</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.cssbox</groupId>
+            <artifactId>cssbox</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>net.sourceforge.nekohtml</groupId>
+            <artifactId>nekohtml</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.cssbox</groupId>
+            <artifactId>jstyleparser</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.antlr</groupId>
+            <artifactId>antlr-runtime</artifactId>
+            <!-- Ojo que forzamos una version en concreto -->
+            <version>3.5.2</version>
+        </dependency>     
+        
+        <!-- JGit runtime dependencies -->   
+        <dependency>
+            <groupId>org.eclipse.jgit</groupId>
+            <artifactId>org.eclipse.jgit</artifactId>
+            <scope>runtime</scope>
+        </dependency>                    
+        
+        <dependency>
+            <groupId>org.icepdf.os</groupId>
+            <artifactId>icepdf-viewer</artifactId>
+            <version>6.2.2</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>batik</groupId>
+                    <artifactId>batik-awt-util</artifactId>
+                </exclusion>        
+                <exclusion>
+                    <groupId>batik</groupId>
+                    <artifactId>batik-dom</artifactId>
+                </exclusion>        
+                <exclusion>
+                    <groupId>batik</groupId>
+                    <artifactId>batik-svg-dom</artifactId>
+                </exclusion>        
+                <exclusion>
+                    <groupId>batik</groupId>
+                    <artifactId>batik-svggen</artifactId>
+                </exclusion>        
+                <exclusion>
+                    <groupId>batik</groupId>
+                    <artifactId>batik-util</artifactId>
+                </exclusion>        
+                <exclusion>
+                    <groupId>batik</groupId>
+                    <artifactId>batik-xml</artifactId>
+                </exclusion>        
+            </exclusions>
+                
+        </dependency>
+                
+        <dependency>
+            <groupId>com.vladsch.flexmark</groupId>
+            <artifactId>flexmark-all</artifactId>
+            <version>0.27.0</version>
+        </dependency>
+
+    </dependencies>
+
+
+    <properties>
+        <gvsig.package.info.name>Scripting framework</gvsig.package.info.name>
+        <gvsig.package.info.dependencies>required: org.gvsig.app.document.table.app.mainplugin -ge 2</gvsig.package.info.dependencies>
+        <gvsig.package.info.poolURL>https://devel.gvsig.org/download/projects/gvsig-scripting/pool</gvsig.package.info.poolURL>
+        <gvsig.package.info.sourcesURL>https://devel.gvsig.org/svn/gvsig-scripting</gvsig.package.info.sourcesURL>
+        <gvsig.package.info.state>testing</gvsig.package.info.state>
+        <gvsig.package.info.categories>Development</gvsig.package.info.categories>
+        <gvsig.package.info.official>true</gvsig.package.info.official>
+
+    </properties>
+
+    <build>
+        <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>unpack</id>
+                        <phase>process-sources</phase>
+                        <goals>
+                            <goal>unpack</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>com.jeta</groupId>
+                                    <artifactId>abeille</artifactId>
+                                    <version>2.1.0.M3</version>
+                                    <type>tar.gz</type>
+                                    <overWrite>true</overWrite>
+                                    <outputDirectory>target/abeille</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+
+</project>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/org.gvsig.scripting.app.mainplugin
___________________________________________________________________
Added: svn:ignore
   + .pom.xml.kate-swp
nbactions.xml
target


Index: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/pom.xml
===================================================================
--- org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/pom.xml	(revision 0)
+++ org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app/pom.xml	(revision 1126)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.gvsig.scripting.app</artifactId>
+	<packaging>pom</packaging>
+	<name>${project.artifactId}</name>
+	<parent>
+	  <groupId>org.gvsig</groupId>
+	  <artifactId>org.gvsig.scripting</artifactId>
+	  <version>2.3.75</version>
+  	</parent>
+
+	<modules>
+		<module>org.gvsig.scripting.app.mainplugin</module>
+	</modules>
+</project>

Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75/org.gvsig.scripting.app
___________________________________________________________________
Added: svn:ignore
   + .directory



Property changes on: org.gvsig.scripting/tags/org.gvsig.scripting-2.3.75
___________________________________________________________________
Added: svn:ignore
   + .settings
target
.project
.directory


